From 0ac2d4a5274812a41475d2caba692bcacaf1c8a7 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 21 Sep 2021 09:53:48 -0300 Subject: [PATCH 0001/1302] Initial commit --- .gitignore | 1 + config/eslint/eslintrc.js | 203 + package.json | 14 + packages/core/.eslintrc.js | 7 + packages/core/.gitignore | 1 + packages/core/.prettierignore | 2 + packages/core/package.json | 26 + packages/core/src/index.ts | 1 + packages/core/test/test.ts | 1 + packages/core/tsconfig.json | 16 + packages/hardhat-plugin/.eslintrc.js | 7 + packages/hardhat-plugin/.gitignore | 1 + packages/hardhat-plugin/.prettierignore | 2 + packages/hardhat-plugin/package.json | 32 + .../hardhat-plugin/src/ignition-wrapper.ts | 13 + packages/hardhat-plugin/src/index.ts | 36 + .../hardhat-plugin/src/type-extensions.ts | 20 + packages/hardhat-plugin/test/test.ts | 1 + packages/hardhat-plugin/tsconfig.json | 16 + yarn.lock | 3862 +++++++++++++++++ 20 files changed, 4262 insertions(+) create mode 100644 .gitignore create mode 100644 config/eslint/eslintrc.js create mode 100644 package.json create mode 100644 packages/core/.eslintrc.js create mode 100644 packages/core/.gitignore create mode 100644 packages/core/.prettierignore create mode 100644 packages/core/package.json create mode 100644 packages/core/src/index.ts create mode 100644 packages/core/test/test.ts create mode 100644 packages/core/tsconfig.json create mode 100644 packages/hardhat-plugin/.eslintrc.js create mode 100644 packages/hardhat-plugin/.gitignore create mode 100644 packages/hardhat-plugin/.prettierignore create mode 100644 packages/hardhat-plugin/package.json create mode 100644 packages/hardhat-plugin/src/ignition-wrapper.ts create mode 100644 packages/hardhat-plugin/src/index.ts create mode 100644 packages/hardhat-plugin/src/type-extensions.ts create mode 100644 packages/hardhat-plugin/test/test.ts create mode 100644 packages/hardhat-plugin/tsconfig.json create mode 100644 yarn.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..c2658d7d1b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js new file mode 100644 index 0000000000..e0dfe0aa28 --- /dev/null +++ b/config/eslint/eslintrc.js @@ -0,0 +1,203 @@ +module.exports = { + env: { + browser: false, + es6: true, + node: true, + }, + extends: ["plugin:prettier/recommended"], + parser: "@typescript-eslint/parser", + plugins: [ + "eslint-plugin-import", + "@typescript-eslint", + ], + rules: { + "@typescript-eslint/adjacent-overload-signatures": "error", + "@typescript-eslint/array-type": [ + "error", + { + default: "array-simple", + }, + ], + "@typescript-eslint/await-thenable": "error", + "@typescript-eslint/ban-types": [ + "error", + { + types: { + Object: { + message: "Avoid using the `Object` type. Did you mean `object`?", + }, + Boolean: { + message: "Avoid using the `Boolean` type. Did you mean `boolean`?", + }, + Function: { + message: + "Avoid using the `Function` type. Prefer a specific function type, like `() => void`.", + }, + Number: { + message: "Avoid using the `Number` type. Did you mean `number`?", + }, + String: { + message: "Avoid using the `String` type. Did you mean `string`?", + }, + Symbol: { + message: "Avoid using the `Symbol` type. Did you mean `symbol`?", + }, + }, + extendDefaults: false, + }, + ], + "@typescript-eslint/consistent-type-assertions": "error", + "@typescript-eslint/consistent-type-definitions": "error", + "@typescript-eslint/dot-notation": "error", + "@typescript-eslint/explicit-member-accessibility": [ + "error", + { + accessibility: "explicit", + overrides: { + constructors: "no-public", + }, + }, + ], + "@typescript-eslint/naming-convention": [ + "error", + { + selector: "default", + format: ["camelCase"], + leadingUnderscore: "allow", + trailingUnderscore: "allow", + }, + { + selector: ["variable", "parameter"], + format: ["camelCase", "UPPER_CASE", "PascalCase"], + leadingUnderscore: "allow", + trailingUnderscore: "allow", + }, + { + selector: "classProperty", + format: ["camelCase", "UPPER_CASE"], + leadingUnderscore: "allow", + }, + { + selector: "enumMember", + format: ["UPPER_CASE"], + }, + { + selector: "memberLike", + modifiers: ["private"], + format: ["camelCase"], + leadingUnderscore: "require", + }, + { + selector: ["objectLiteralProperty", "objectLiteralMethod"], + format: ["camelCase", "PascalCase", "snake_case", "UPPER_CASE"], + leadingUnderscore: "allow", + }, + { + selector: "typeProperty", + format: ["camelCase", "PascalCase"], + leadingUnderscore: "allow", + }, + { + selector: "typeLike", + format: ["PascalCase"], + }, + ], + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-floating-promises": "error", + "@typescript-eslint/no-misused-new": "error", + "@typescript-eslint/no-namespace": "error", + "@typescript-eslint/no-redeclare": "error", + "@typescript-eslint/no-shadow": [ + "error", + { + hoist: "all", + }, + ], + "@typescript-eslint/no-this-alias": "error", + "@typescript-eslint/no-unused-expressions": "error", + "@typescript-eslint/no-unused-vars": [ + "error", + { + argsIgnorePattern: "^_", + varsIgnorePattern: "^_", + }, + ], + "@typescript-eslint/prefer-for-of": "error", + "@typescript-eslint/prefer-function-type": "error", + "@typescript-eslint/prefer-namespace-keyword": "error", + "@typescript-eslint/restrict-plus-operands": "error", + "@typescript-eslint/strict-boolean-expressions": [ + "error", + { + allowAny: true, + }, + ], + "@typescript-eslint/triple-slash-reference": [ + "error", + { + path: "always", + types: "prefer-import", + lib: "always", + }, + ], + "@typescript-eslint/unified-signatures": "error", + "constructor-super": "error", + eqeqeq: ["error", "always"], + "guard-for-in": "error", + "id-blacklist": "error", + "id-match": "error", + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: false, + }, + ], + "import/order": [ + "error", + { + groups: [ + "object", + ["builtin", "external"], + "parent", + "sibling", + "index", + ], + }, + ], + "no-bitwise": "error", + "no-caller": "error", + "no-cond-assign": "error", + "no-debugger": "error", + "no-duplicate-case": "error", + "no-duplicate-imports": "error", + "no-eval": "error", + "no-extra-bind": "error", + "no-new-func": "error", + "no-new-wrappers": "error", + "no-return-await": "off", + "@typescript-eslint/return-await": "error", + "no-sequences": "error", + "no-sparse-arrays": "error", + "no-template-curly-in-string": "error", + "no-throw-literal": "error", + "no-undef-init": "error", + "no-unsafe-finally": "error", + "no-unused-labels": "error", + "no-unused-vars": "off", + "no-var": "error", + "object-shorthand": "error", + "one-var": ["error", "never"], + "prefer-const": "error", + "prefer-object-spread": "error", + "prefer-template": "error", + radix: "error", + "spaced-comment": [ + "error", + "always", + { + markers: ["/"], + }, + ], + "use-isnan": "error", + }, +}; diff --git a/package.json b/package.json new file mode 100644 index 0000000000..7d2e91a737 --- /dev/null +++ b/package.json @@ -0,0 +1,14 @@ +{ + "name": "root", + "version": "0.0.0", + "author": "Nomic Labs LLC", + "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", + "private": true, + "workspaces": ["packages/*"], + "scripts": { + "build": "wsrun --exclude-missing --serial build" + }, + "devDependencies": { + "wsrun": "^5.2.4" + } +} diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js new file mode 100644 index 0000000000..889740f226 --- /dev/null +++ b/packages/core/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/tsconfig.json`, + sourceType: "module", + }, +}; diff --git a/packages/core/.gitignore b/packages/core/.gitignore new file mode 100644 index 0000000000..849ddff3b7 --- /dev/null +++ b/packages/core/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/core/.prettierignore b/packages/core/.prettierignore new file mode 100644 index 0000000000..8225baa4a7 --- /dev/null +++ b/packages/core/.prettierignore @@ -0,0 +1,2 @@ +/node_modules +/dist diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 0000000000..0cb96b67eb --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,26 @@ +{ + "name": "ignition", + "version": "0.0.2", + "license": "MIT", + "main": "dist/src/index.js", + "scripts": { + "build": "tsc", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"" + }, + "devDependencies": { + "@types/mocha": "^9.0.0", + "@types/node": "12.20.25", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-prettier": "4.0.0", + "mocha": "^9.1.1", + "prettier": "2.4.1", + "typescript": "^4.4.3" + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 0000000000..08f9177b58 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1 @@ +export class Ignition {} diff --git a/packages/core/test/test.ts b/packages/core/test/test.ts new file mode 100644 index 0000000000..09d4352e8b --- /dev/null +++ b/packages/core/test/test.ts @@ -0,0 +1 @@ +// test diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 0000000000..b594e9bef3 --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2017", + "module": "commonjs", + "incremental": true, + "rootDirs": ["./src", "./test"], + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true + }, + "exclude": ["dist", "node_modules"], + "include": ["./test", "./src"] +} diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-plugin/.eslintrc.js new file mode 100644 index 0000000000..889740f226 --- /dev/null +++ b/packages/hardhat-plugin/.eslintrc.js @@ -0,0 +1,7 @@ +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/tsconfig.json`, + sourceType: "module", + }, +}; diff --git a/packages/hardhat-plugin/.gitignore b/packages/hardhat-plugin/.gitignore new file mode 100644 index 0000000000..849ddff3b7 --- /dev/null +++ b/packages/hardhat-plugin/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/hardhat-plugin/.prettierignore b/packages/hardhat-plugin/.prettierignore new file mode 100644 index 0000000000..8225baa4a7 --- /dev/null +++ b/packages/hardhat-plugin/.prettierignore @@ -0,0 +1,2 @@ +/node_modules +/dist diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json new file mode 100644 index 0000000000..59682a9155 --- /dev/null +++ b/packages/hardhat-plugin/package.json @@ -0,0 +1,32 @@ +{ + "name": "@nomiclabs/hardhat-ignition", + "version": "0.0.1", + "license": "MIT", + "main": "dist/src/index.js", + "scripts": { + "build": "tsc", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "prettier": "prettier \"**/*.{js,md,json}\"" + }, + "devDependencies": { + "@types/mocha": "^9.0.0", + "@types/node": "12.20.25", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "^2.0.0", + "ignition": "^0.0.2", + "mocha": "^9.1.1", + "prettier": "2.4.1", + "typescript": "^4.4.3" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "ignition": "^0.0.2" + } +} diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts new file mode 100644 index 0000000000..b4d81dd7a4 --- /dev/null +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -0,0 +1,13 @@ +import { Ignition } from "ignition"; + +export class IgnitionWrapper { + private _ignition: Ignition; + + constructor() { + this._ignition = new Ignition(); + } + + public deploy() { + console.log("deploy"); + } +} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts new file mode 100644 index 0000000000..d1f1c8f5eb --- /dev/null +++ b/packages/hardhat-plugin/src/index.ts @@ -0,0 +1,36 @@ +import { extendConfig, extendEnvironment, task } from "hardhat/config"; +import { lazyObject } from "hardhat/plugins"; +import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; +import path from "path"; + +import { IgnitionWrapper } from "./ignition-wrapper"; +import "./type-extensions"; + +extendConfig( + (config: HardhatConfig, userConfig: Readonly) => { + const userIgnitionPath = userConfig.paths?.ignition; + + let ignitionPath: string; + if (userIgnitionPath === undefined) { + ignitionPath = path.join(config.paths.root, "ignition"); + } else { + if (path.isAbsolute(userIgnitionPath)) { + ignitionPath = userIgnitionPath; + } else { + ignitionPath = path.normalize( + path.join(config.paths.root, userIgnitionPath) + ); + } + } + + config.paths.ignition = ignitionPath; + } +); + +extendEnvironment((hre) => { + hre.ignition = lazyObject(() => new IgnitionWrapper()); +}); + +task("deploy", async (_, hre) => { + console.log(hre.config.paths.ignition); +}); diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts new file mode 100644 index 0000000000..1c85abc117 --- /dev/null +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -0,0 +1,20 @@ +import "hardhat/types/config"; +import "hardhat/types/runtime"; + +import type { IgnitionWrapper } from "./ignition-wrapper"; + +declare module "hardhat/types/config" { + export interface ProjectPathsUserConfig { + ignition?: string; + } + + export interface ProjectPathsConfig { + ignition: string; + } +} + +declare module "hardhat/types/runtime" { + export interface HardhatRuntimeEnvironment { + ignition: IgnitionWrapper; + } +} diff --git a/packages/hardhat-plugin/test/test.ts b/packages/hardhat-plugin/test/test.ts new file mode 100644 index 0000000000..09d4352e8b --- /dev/null +++ b/packages/hardhat-plugin/test/test.ts @@ -0,0 +1 @@ +// test diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json new file mode 100644 index 0000000000..b594e9bef3 --- /dev/null +++ b/packages/hardhat-plugin/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ES2017", + "module": "commonjs", + "incremental": true, + "rootDirs": ["./src", "./test"], + "outDir": "./dist", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true + }, + "exclude": ["dist", "node_modules"], + "include": ["./test", "./src"] +} diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..8216814313 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,3862 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@babel/code-frame@7.12.11": + version "7.12.11" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" + integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== + dependencies: + "@babel/highlight" "^7.10.4" + +"@babel/helper-validator-identifier@^7.14.5": + version "7.15.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" + integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== + +"@babel/highlight@^7.10.4": + version "7.14.5" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" + integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@eslint/eslintrc@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" + integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== + dependencies: + ajv "^6.12.4" + debug "^4.1.1" + espree "^7.3.0" + globals "^13.9.0" + ignore "^4.0.6" + import-fresh "^3.2.1" + js-yaml "^3.13.1" + minimatch "^3.0.4" + strip-json-comments "^3.1.1" + +"@ethereumjs/block@^3.4.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.4.0.tgz#4747b0c06220ee10cbdfe1cbde8cbb0677b1b074" + integrity sha512-umKAoTX32yXzErpIksPHodFc/5y8bmZMnOl6hWy5Vd8xId4+HKFUOyEiN16Y97zMwFRysRpcrR6wBejfqc6Bmg== + dependencies: + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + ethereumjs-util "^7.1.0" + merkle-patricia-tree "^4.2.0" + +"@ethereumjs/blockchain@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.0.tgz#28d712627d3442b2bb1f50dd5acba7cde1021993" + integrity sha512-wAuKLaew6PL52kH8YPXO7PbjjKV12jivRSyHQehkESw4slSLLfYA6Jv7n5YxyT2ajD7KNMPVh7oyF/MU6HcOvg== + dependencies: + "@ethereumjs/block" "^3.4.0" + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/ethash" "^1.0.0" + debug "^2.2.0" + ethereumjs-util "^7.1.0" + level-mem "^5.0.1" + lru-cache "^5.1.1" + rlp "^2.2.4" + semaphore-async-await "^1.5.1" + +"@ethereumjs/common@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766" + integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.0" + +"@ethereumjs/ethash@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" + integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw== + dependencies: + "@types/levelup" "^4.3.0" + buffer-xor "^2.0.1" + ethereumjs-util "^7.0.7" + miller-rabin "^4.0.0" + +"@ethereumjs/tx@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378" + integrity sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA== + dependencies: + "@ethereumjs/common" "^2.4.0" + ethereumjs-util "^7.1.0" + +"@ethereumjs/vm@^5.5.2": + version "5.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.2.tgz#918a2c1000aaa9fdbe6007a4fdc2c62833122adf" + integrity sha512-AydZ4wfvZAsBuFzs3xVSA2iU0hxhL8anXco3UW3oh9maVC34kTEytOfjHf06LTEfN0MF9LDQ4ciLa7If6ZN/sg== + dependencies: + "@ethereumjs/block" "^3.4.0" + "@ethereumjs/blockchain" "^5.4.0" + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + async-eventemitter "^0.2.4" + core-js-pure "^3.0.1" + debug "^2.2.0" + ethereumjs-util "^7.1.0" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + merkle-patricia-tree "^4.2.0" + rustbn.js "~0.2.0" + util.promisify "^1.0.1" + +"@ethersproject/abi@^5.1.2": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" + integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/abstract-provider@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" + integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" + +"@ethersproject/abstract-signer@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" + integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + +"@ethersproject/address@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" + integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + +"@ethersproject/base64@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" + integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== + dependencies: + "@ethersproject/bytes" "^5.4.0" + +"@ethersproject/bignumber@^5.4.0": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" + integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + bn.js "^4.11.9" + +"@ethersproject/bytes@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" + integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/constants@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" + integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + +"@ethersproject/hash@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" + integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/keccak256@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" + integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + js-sha3 "0.5.7" + +"@ethersproject/logger@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" + integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== + +"@ethersproject/networks@^5.4.0": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" + integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/properties@^5.4.0": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" + integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== + dependencies: + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/rlp@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" + integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/signing-key@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" + integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.7" + +"@ethersproject/strings@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" + integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/transactions@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" + integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== + dependencies: + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + +"@ethersproject/web@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" + integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== + dependencies: + "@ethersproject/base64" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@humanwhocodes/config-array@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" + integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== + dependencies: + "@humanwhocodes/object-schema" "^1.2.0" + debug "^4.1.1" + minimatch "^3.0.4" + +"@humanwhocodes/object-schema@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" + integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + +"@jest/types@^24.9.0": + version "24.9.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" + integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^1.1.1" + "@types/yargs" "^13.0.0" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@sentry/core@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" + integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/hub@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" + integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== + dependencies: + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/minimal@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" + integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@sentry/node@^5.18.1": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" + integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== + dependencies: + "@sentry/core" "5.30.0" + "@sentry/hub" "5.30.0" + "@sentry/tracing" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + cookie "^0.4.1" + https-proxy-agent "^5.0.0" + lru_map "^0.3.3" + tslib "^1.9.3" + +"@sentry/tracing@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" + integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== + dependencies: + "@sentry/hub" "5.30.0" + "@sentry/minimal" "5.30.0" + "@sentry/types" "5.30.0" + "@sentry/utils" "5.30.0" + tslib "^1.9.3" + +"@sentry/types@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" + integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== + +"@sentry/utils@5.30.0": + version "5.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" + integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== + dependencies: + "@sentry/types" "5.30.0" + tslib "^1.9.3" + +"@solidity-parser/parser@^0.11.0": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" + integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== + +"@types/abstract-leveldown@*": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" + integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ== + +"@types/bn.js@^4.11.3": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" + integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== + dependencies: + "@types/istanbul-lib-coverage" "*" + "@types/istanbul-lib-report" "*" + +"@types/json-schema@^7.0.7": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" + integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + +"@types/level-errors@*": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" + integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== + +"@types/levelup@^4.3.0": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" + integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== + dependencies: + "@types/abstract-leveldown" "*" + "@types/level-errors" "*" + "@types/node" "*" + +"@types/lru-cache@^5.1.0": + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" + integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== + +"@types/mocha@^9.0.0": + version "9.0.0" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" + integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== + +"@types/node@*": + version "16.9.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.4.tgz#a12f0ee7847cf17a97f6fdf1093cb7a9af23cca4" + integrity sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA== + +"@types/node@12.20.25": + version "12.20.25" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" + integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== + +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + +"@types/secp256k1@^4.0.1": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" + integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "20.2.1" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" + integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + +"@types/yargs@^13.0.0": + version "13.0.12" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" + integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" + integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== + dependencies: + "@typescript-eslint/experimental-utils" "4.31.2" + "@typescript-eslint/scope-manager" "4.31.2" + debug "^4.3.1" + functional-red-black-tree "^1.0.1" + regexpp "^3.1.0" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" + integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== + dependencies: + "@types/json-schema" "^7.0.7" + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + eslint-scope "^5.1.1" + eslint-utils "^3.0.0" + +"@typescript-eslint/parser@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" + integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== + dependencies: + "@typescript-eslint/scope-manager" "4.31.2" + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/typescript-estree" "4.31.2" + debug "^4.3.1" + +"@typescript-eslint/scope-manager@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" + integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + +"@typescript-eslint/types@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" + integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== + +"@typescript-eslint/typescript-estree@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" + integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== + dependencies: + "@typescript-eslint/types" "4.31.2" + "@typescript-eslint/visitor-keys" "4.31.2" + debug "^4.3.1" + globby "^11.0.3" + is-glob "^4.0.1" + semver "^7.3.5" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@4.31.2": + version "4.31.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" + integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== + dependencies: + "@typescript-eslint/types" "4.31.2" + eslint-visitor-keys "^2.0.0" + +"@ungap/promise-all-settled@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" + integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + +abstract-leveldown@^6.2.1: + version "6.3.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" + integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +abstract-leveldown@~6.2.1: + version "6.2.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" + integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== + dependencies: + buffer "^5.5.0" + immediate "^3.2.3" + level-concat-iterator "~2.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +acorn-jsx@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn@^7.4.0: + version "7.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +adm-zip@^0.4.16: + version "0.4.16" + resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" + integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== + +agent-base@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv@^6.10.0, ajv@^6.12.4: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.1: + version "8.6.3" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" + integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + +ansi-colors@4.1.1, ansi-colors@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" + integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== + +ansi-escapes@^4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-regex@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.1, anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-includes@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" + integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + get-intrinsic "^1.1.1" + is-string "^1.0.5" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" + integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.1" + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +async-eventemitter@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + +async@^2.4.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + dependencies: + lodash "^4.17.14" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base-x@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +blakejs@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" + integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== + +bluebird@^3.5.1: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +bn.js@^5.1.2: + version "5.2.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" + integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.1, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.0.1, brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + +browser-stdout@1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserify-aes@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" + integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== + dependencies: + buffer-xor "^1.0.3" + cipher-base "^1.0.0" + create-hash "^1.1.0" + evp_bytestokey "^1.0.3" + inherits "^2.0.1" + safe-buffer "^5.0.1" + +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer-xor@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" + integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + +buffer-xor@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" + integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== + dependencies: + safe-buffer "^5.1.1" + +buffer@^5.5.0, buffer@^5.6.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +bytes@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" + integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0, chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + +chokidar@3.5.2, chokidar@^3.4.0: + version "3.5.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" + integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + +cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" + integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +command-exists@^1.2.8: + version "1.2.9" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" + integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== + +commander@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" + integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cookie@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" + integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + +core-js-pure@^3.0.1: + version "3.18.0" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.0.tgz#e5187347bae66448c9e2d67c01c34c4df3261dc5" + integrity sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w== + +crc-32@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" + integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== + dependencies: + exit-on-epipe "~1.0.1" + printj "~1.1.0" + +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" + integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== + dependencies: + cipher-base "^1.0.1" + inherits "^2.0.1" + md5.js "^1.3.4" + ripemd160 "^2.0.1" + sha.js "^2.4.0" + +create-hmac@^1.1.4, create-hmac@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" + integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== + dependencies: + cipher-base "^1.0.3" + create-hash "^1.1.0" + inherits "^2.0.1" + ripemd160 "^2.0.0" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + +debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: + version "4.3.2" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" + integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== + dependencies: + ms "2.1.2" + +debug@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== + dependencies: + ms "2.1.2" + +debug@^2.2.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deferred-leveldown@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" + integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== + dependencies: + abstract-leveldown "~6.2.1" + inherits "^2.0.3" + +define-properties@^1.1.2, define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== + dependencies: + object-keys "^1.0.12" + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + +diff@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" + integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +elliptic@6.5.4, elliptic@^6.5.2: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + hash.js "^1.0.0" + hmac-drbg "^1.0.1" + inherits "^2.0.4" + minimalistic-assert "^1.0.1" + minimalistic-crypto-utils "^1.0.1" + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +encoding-down@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" + integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== + dependencies: + abstract-leveldown "^6.2.1" + inherits "^2.0.3" + level-codec "^9.0.0" + level-errors "^2.0.0" + +end-of-stream@^1.1.0: + version "1.4.4" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +enquirer@^2.3.0, enquirer@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" + integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== + dependencies: + ansi-colors "^4.1.1" + +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +errno@~0.1.1: + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== + dependencies: + prr "~1.0.1" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: + version "1.18.6" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" + integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" + has "^1.0.3" + has-symbols "^1.0.2" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.1" + is-regex "^1.1.4" + is-string "^1.0.7" + object-inspect "^1.11.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" + integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== + +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== + dependencies: + debug "^3.2.7" + resolve "^1.20.0" + +eslint-module-utils@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" + integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== + dependencies: + debug "^3.2.7" + pkg-dir "^2.0.0" + +eslint-plugin-import@2.24.2: + version "2.24.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" + integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== + dependencies: + array-includes "^3.1.3" + array.prototype.flat "^1.2.4" + debug "^2.6.9" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.6.2" + find-up "^2.0.0" + has "^1.0.3" + is-core-module "^2.6.0" + minimatch "^3.0.4" + object.values "^1.1.4" + pkg-up "^2.0.0" + read-pkg-up "^3.0.0" + resolve "^1.20.0" + tsconfig-paths "^3.11.0" + +eslint-plugin-prettier@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" + integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" + integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== + dependencies: + eslint-visitor-keys "^1.1.0" + +eslint-utils@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" + integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== + dependencies: + eslint-visitor-keys "^2.0.0" + +eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" + integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== + +eslint-visitor-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint@^7.32.0: + version "7.32.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" + integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== + dependencies: + "@babel/code-frame" "7.12.11" + "@eslint/eslintrc" "^0.4.3" + "@humanwhocodes/config-array" "^0.5.0" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.0.1" + doctrine "^3.0.0" + enquirer "^2.3.5" + escape-string-regexp "^4.0.0" + eslint-scope "^5.1.1" + eslint-utils "^2.1.0" + eslint-visitor-keys "^2.0.0" + espree "^7.3.1" + esquery "^1.4.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + functional-red-black-tree "^1.0.1" + glob-parent "^5.1.2" + globals "^13.6.0" + ignore "^4.0.6" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + js-yaml "^3.13.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.0.4" + natural-compare "^1.4.0" + optionator "^0.9.1" + progress "^2.0.0" + regexpp "^3.1.0" + semver "^7.2.1" + strip-ansi "^6.0.0" + strip-json-comments "^3.1.0" + table "^6.0.9" + text-table "^0.2.0" + v8-compile-cache "^2.0.3" + +espree@^7.3.0, espree@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" + integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== + dependencies: + acorn "^7.4.0" + acorn-jsx "^5.3.1" + eslint-visitor-keys "^1.3.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +eth-sig-util@^2.5.2: + version "2.5.4" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" + integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== + dependencies: + ethereumjs-abi "0.6.8" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.0" + +ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: + version "0.6.8" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" + integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-util@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-util@^7.0.7, ethereumjs-util@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5" + integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.4" + +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + +evp_bytestokey@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" + integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== + dependencies: + md5.js "^1.3.4" + safe-buffer "^5.1.1" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit-on-epipe@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" + integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" + integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + +fast-glob@^3.1.1: + version "3.2.7" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" + integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + +fastq@^1.6.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" + integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== + dependencies: + reusify "^1.0.4" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== + dependencies: + is-buffer "~2.0.3" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.1.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" + integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + +follow-redirects@^1.12.1: + version "1.14.4" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" + integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fp-ts@1.19.3: + version "1.19.3" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" + integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== + +fp-ts@^1.0.0: + version "1.19.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" + integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.7, glob@^7.1.2, glob@^7.1.3: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^13.6.0, globals@^13.9.0: + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + dependencies: + type-fest "^0.20.2" + +globby@^11.0.3: + version "11.0.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" + integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.2.8" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" + integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== + +growl@1.10.5: + version "1.10.5" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" + integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== + +hardhat@^2.0.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.6.4.tgz#9ff3f139f697bfc4e14836a3fef3ca4c62357d65" + integrity sha512-6QNfu1FptjtyGJ+jBR7LMX7AMY9gWWw9kAUD7v0YZNZH1ZBgsZdMHqXKiSzO5pLQXo+fy9zZovKAUNYbjQ/1fw== + dependencies: + "@ethereumjs/block" "^3.4.0" + "@ethereumjs/blockchain" "^5.4.0" + "@ethereumjs/common" "^2.4.0" + "@ethereumjs/tx" "^3.3.0" + "@ethereumjs/vm" "^5.5.2" + "@ethersproject/abi" "^5.1.2" + "@sentry/node" "^5.18.1" + "@solidity-parser/parser" "^0.11.0" + "@types/bn.js" "^5.1.0" + "@types/lru-cache" "^5.1.0" + abort-controller "^3.0.0" + adm-zip "^0.4.16" + ansi-escapes "^4.3.0" + chalk "^2.4.2" + chokidar "^3.4.0" + ci-info "^2.0.0" + debug "^4.1.1" + enquirer "^2.3.0" + env-paths "^2.2.0" + eth-sig-util "^2.5.2" + ethereum-cryptography "^0.1.2" + ethereumjs-abi "^0.6.8" + ethereumjs-util "^7.1.0" + find-up "^2.1.0" + fp-ts "1.19.3" + fs-extra "^7.0.1" + glob "^7.1.3" + https-proxy-agent "^5.0.0" + immutable "^4.0.0-rc.12" + io-ts "1.10.4" + lodash "^4.17.11" + merkle-patricia-tree "^4.2.0" + mnemonist "^0.38.0" + mocha "^7.1.2" + node-fetch "^2.6.0" + qs "^6.7.0" + raw-body "^2.4.1" + resolve "1.17.0" + semver "^6.3.0" + slash "^3.0.0" + solc "0.7.3" + source-map-support "^0.5.13" + stacktrace-parser "^0.1.10" + "true-case-path" "^2.2.1" + tsort "0.0.1" + uuid "^3.3.2" + ws "^7.4.6" + +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash-base@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== + dependencies: + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +he@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +http-errors@1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@^1.1.13: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" + integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== + +ignore@^5.1.4: + version "5.1.8" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" + integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== + +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + +immediate@~3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" + integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + +immutable@^4.0.0-rc.12: + version "4.0.0-rc.15" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.15.tgz#c30056f05eaaf5650fd15230586688fdd15c54bc" + integrity sha512-v8+A3sNyaieoP9dHegl3tEYnIZa7vqNiSv0U6D7YddiZi34VjKy4GsIxrRHj2d8+CS3MeiVja5QyNe4JO/aEXA== + +import-fresh@^3.0.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +internal-slot@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + +io-ts@1.10.4: + version "1.10.4" + resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" + integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== + dependencies: + fp-ts "^1.0.0" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@~2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== + +is-core-module@^2.2.0, is-core-module@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" + integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" + integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +jest-changed-files@^24.9.0: + version "24.9.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" + integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== + dependencies: + "@jest/types" "^24.9.0" + execa "^1.0.0" + throat "^4.0.0" + +js-sha3@0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= + +js-sha3@0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-parse-better-errors@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" + integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + +json5@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" + integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + dependencies: + minimist "^1.2.0" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + optionalDependencies: + graceful-fs "^4.1.6" + +keccak@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" + integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + readable-stream "^3.6.0" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + optionalDependencies: + graceful-fs "^4.1.9" + +level-codec@^9.0.0: + version "9.0.2" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" + integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== + dependencies: + buffer "^5.6.0" + +level-concat-iterator@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" + integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== + +level-errors@^2.0.0, level-errors@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" + integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" + integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== + dependencies: + inherits "^2.0.4" + readable-stream "^3.4.0" + xtend "^4.0.2" + +level-mem@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" + integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== + dependencies: + level-packager "^5.0.3" + memdown "^5.0.0" + +level-packager@^5.0.3: + version "5.1.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" + integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== + dependencies: + encoding-down "^6.3.0" + levelup "^4.3.2" + +level-supports@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" + integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== + dependencies: + xtend "^4.0.2" + +level-ws@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" + integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + dependencies: + inherits "^2.0.3" + readable-stream "^3.1.0" + xtend "^4.0.1" + +levelup@^4.3.2: + version "4.4.0" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" + integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== + dependencies: + deferred-leveldown "~5.3.0" + level-errors "~2.0.0" + level-iterator-stream "~4.0.0" + level-supports "~1.0.0" + xtend "~4.0.0" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-symbols@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lru_map@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" + integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + +mcl-wasm@^0.7.1: + version "0.7.9" + resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" + integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== + +md5.js@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" + integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +memdown@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" + integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== + dependencies: + abstract-leveldown "~6.2.1" + functional-red-black-tree "~1.0.1" + immediate "~3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.2.0" + +memorystream@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" + integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merkle-patricia-tree@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.1.tgz#fc43e7b162e597a0720ccdd702bf1d49765691d2" + integrity sha512-25reMgrT8PhJy0Ba0U7fMZD2oobS1FPWB9vQa0uBpJYIQYYuFXEHoqEkTqA/UzX+s9br3pmUVVY/TOsFt/x0oQ== + dependencies: + "@types/levelup" "^4.3.0" + ethereumjs-util "^7.1.0" + level-mem "^5.0.1" + level-ws "^2.0.0" + readable-stream "^3.6.0" + rlp "^2.2.4" + semaphore-async-await "^1.5.1" + +micromatch@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" + integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + dependencies: + braces "^3.0.1" + picomatch "^2.2.3" + +miller-rabin@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" + integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== + dependencies: + bn.js "^4.0.0" + brorand "^1.0.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + +minimatch@3.0.4, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mnemonist@^0.38.0: + version "0.38.3" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" + integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== + dependencies: + obliterator "^1.6.1" + +mocha@^7.1.2: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + +mocha@^9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.1.tgz#33df2eb9c6262434630510c5f4283b36efda9b61" + integrity sha512-0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.2" + debug "4.3.1" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.1.7" + growl "1.10.5" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "3.0.4" + ms "2.1.3" + nanoid "3.1.23" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + which "2.0.2" + wide-align "1.1.3" + workerpool "6.1.5" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@3.1.23: + version "3.1.23" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" + integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + +node-fetch@^2.6.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.4.tgz#7f1d13b8f9ff0c1a994dc6f73c69f7d652c7ace2" + integrity sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" + integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== + +normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +object-inspect@^1.11.0, object-inspect@^1.9.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" + integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== + +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + +object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.0-next.2" + +object.values@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" + integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.18.2" + +obliterator@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" + integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +optionator@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" + integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + dependencies: + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.3" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== + dependencies: + p-try "^1.0.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pbkdf2@^3.0.17: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== + dependencies: + create-hash "^1.1.2" + create-hmac "^1.1.4" + ripemd160 "^2.0.1" + safe-buffer "^5.0.1" + sha.js "^2.4.8" + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" + integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= + dependencies: + find-up "^2.1.0" + +pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" + integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + dependencies: + find-up "^2.1.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" + integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== + +printj@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" + integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== + +progress@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + +qs@^6.7.0: + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +raw-body@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" + integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + dependencies: + bytes "3.1.0" + http-errors "1.7.3" + iconv-lite "0.4.24" + unpipe "1.0.0" + +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regexpp@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" + integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-from-string@^2.0.0, require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve@1.17.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== + dependencies: + path-parse "^1.0.6" + +resolve@^1.10.0, resolve@^1.20.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^2.2.8: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +ripemd160@^2.0.0, ripemd160@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" + integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== + dependencies: + hash-base "^3.0.0" + inherits "^2.0.1" + +rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +scrypt-js@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" + integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== + +secp256k1@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + +semaphore-async-await@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" + integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + +"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.7.0: + version "5.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.2.1, semver@^7.3.5: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + dependencies: + lru-cache "^6.0.0" + +serialize-javascript@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" + integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== + dependencies: + randombytes "^2.1.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +setimmediate@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" + integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + +setprototypeof@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== + +sha.js@^2.4.0, sha.js@^2.4.8: + version "2.4.11" + resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" + integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== + dependencies: + inherits "^2.0.1" + safe-buffer "^5.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" + integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +solc@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" + integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== + dependencies: + command-exists "^1.2.8" + commander "3.0.2" + follow-redirects "^1.12.1" + fs-extra "^0.30.0" + js-sha3 "0.8.0" + memorystream "^0.3.1" + require-from-string "^2.0.0" + semver "^5.5.0" + tmp "0.0.33" + +source-map-support@^0.5.13: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.10" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" + integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + +split@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" + integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + +stacktrace-parser@^0.1.10: + version "0.1.10" + resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" + integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== + dependencies: + type-fest "^0.7.1" + +"statuses@>= 1.5.0 < 2": + version "1.5.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + +"string-width@^1.0.2 || 2": + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" + integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.0" + +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" + integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== + dependencies: + ansi-regex "^5.0.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + +supports-color@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +table@^6.0.9: + version "6.7.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" + integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + dependencies: + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.0" + strip-ansi "^6.0.0" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + +throat@^4.0.0, throat@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" + integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + +through@2: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + +tmp@0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= + +"true-case-path@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" + integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== + +tsconfig-paths@^3.11.0: + version "3.11.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" + integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.1" + minimist "^1.2.0" + strip-bom "^3.0.0" + +tslib@^1.8.1, tslib@^1.9.3: + version "1.14.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tsort@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" + integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + +tweetnacl@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" + integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== + +typescript@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" + integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + +universalify@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" + integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== + +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + +util.promisify@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + for-each "^0.3.3" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.1" + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + +v8-compile-cache@^2.0.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" + integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + +validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@1.3.1, which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@2.0.2, which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== + dependencies: + string-width "^1.0.2 || 2" + +word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== + +workerpool@6.1.5: + version "6.1.5" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" + integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +ws@^7.4.6: + version "7.5.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" + integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + +wsrun@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/wsrun/-/wsrun-5.2.4.tgz#6eb6c3ccd3327721a8df073a5e3578fb0dea494e" + integrity sha512-akv3WtKBohdHsD/5uqhYRHw6GXeCXe87FsSg28Szq+2cpoqRW2SY4yPfm1D0za1cS6MgNy5hPgzS5SqYJaGUxg== + dependencies: + bluebird "^3.5.1" + chalk "^2.3.0" + glob "^7.1.2" + jest-changed-files "^24.9.0" + lodash "^4.17.4" + minimatch "^3.0.4" + split "^1.0.1" + throat "^4.1.0" + yargs "^13.0.0" + +xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yargs-parser@13.1.2, yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + +yargs-unparser@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.2" + +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From 2d7beaedf48c32d911251fcbd823ccf2d856af39 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 20 Oct 2021 13:53:09 -0300 Subject: [PATCH 0002/1302] Basic implementation --- .editorconfig | 10 + .prettierrc | 1 + examples/simple-ts/.gitignore | 3 + examples/simple-ts/contracts/Multisig.sol | 318 ++++++++ examples/simple-ts/contracts/Owned.sol | 16 + examples/simple-ts/contracts/Timelock.sol | 1 + examples/simple-ts/hardhat.config.ts | 13 + examples/simple-ts/ignition/Multisig.ts | 163 ++++ .../simple-ts/ignition/MultisigAndTimelock.ts | 249 ++++++ examples/simple-ts/ignition/Timelock.ts | 132 +++ examples/simple-ts/package.json | 22 + .../scripts/multisig-and-timelock.ts | 16 + examples/simple-ts/scripts/multisig.ts | 16 + examples/simple-ts/scripts/timelock.ts | 16 + examples/simple-ts/tsconfig.json | 11 + examples/simple/.gitignore | 3 + examples/simple/contracts/Foo.sol | 18 + examples/simple/deploy.js | 13 + examples/simple/hardhat.config.js | 13 + examples/simple/ignition/MyModule.js | 14 + examples/simple/package.json | 13 + examples/simple/script.js | 22 + package.json | 6 +- packages/core/.eslintrc.js | 3 + packages/core/.mocharc.json | 3 + packages/core/.prettierrc | 1 + packages/core/package.json | 14 +- packages/core/src/bindings.ts | 116 +++ packages/core/src/execution-engine.ts | 450 +++++++++++ packages/core/src/executors.ts | 188 +++++ packages/core/src/index.ts | 121 ++- packages/core/src/journal.ts | 215 +++++ packages/core/src/modules.ts | 227 ++++++ packages/core/src/providers.ts | 42 + packages/core/src/services.ts | 247 ++++++ packages/core/src/tx-sender.ts | 84 ++ packages/core/src/types.ts | 10 + packages/core/src/utils.ts | 2 + packages/core/test/.eslintrc.js | 15 + packages/core/test/dag.ts | 90 +++ packages/core/test/execution-engine.ts | 139 ++++ packages/core/test/helpers.ts | 123 +++ packages/core/test/test.ts | 1 - packages/hardhat-plugin/package.json | 9 + .../hardhat-plugin/src/ignition-wrapper.ts | 233 +++++- packages/hardhat-plugin/src/index.ts | 169 +++- .../hardhat-plugin/src/type-extensions.ts | 2 + yarn.lock | 763 ++++++++++++++---- 48 files changed, 4169 insertions(+), 187 deletions(-) create mode 100644 .editorconfig create mode 100644 .prettierrc create mode 100644 examples/simple-ts/.gitignore create mode 100644 examples/simple-ts/contracts/Multisig.sol create mode 100644 examples/simple-ts/contracts/Owned.sol create mode 100644 examples/simple-ts/contracts/Timelock.sol create mode 100644 examples/simple-ts/hardhat.config.ts create mode 100644 examples/simple-ts/ignition/Multisig.ts create mode 100644 examples/simple-ts/ignition/MultisigAndTimelock.ts create mode 100644 examples/simple-ts/ignition/Timelock.ts create mode 100644 examples/simple-ts/package.json create mode 100644 examples/simple-ts/scripts/multisig-and-timelock.ts create mode 100644 examples/simple-ts/scripts/multisig.ts create mode 100644 examples/simple-ts/scripts/timelock.ts create mode 100644 examples/simple-ts/tsconfig.json create mode 100644 examples/simple/.gitignore create mode 100644 examples/simple/contracts/Foo.sol create mode 100644 examples/simple/deploy.js create mode 100644 examples/simple/hardhat.config.js create mode 100644 examples/simple/ignition/MyModule.js create mode 100644 examples/simple/package.json create mode 100644 examples/simple/script.js create mode 100644 packages/core/.mocharc.json create mode 100644 packages/core/.prettierrc create mode 100644 packages/core/src/bindings.ts create mode 100644 packages/core/src/execution-engine.ts create mode 100644 packages/core/src/executors.ts create mode 100644 packages/core/src/journal.ts create mode 100644 packages/core/src/modules.ts create mode 100644 packages/core/src/providers.ts create mode 100644 packages/core/src/services.ts create mode 100644 packages/core/src/tx-sender.ts create mode 100644 packages/core/src/types.ts create mode 100644 packages/core/src/utils.ts create mode 100644 packages/core/test/.eslintrc.js create mode 100644 packages/core/test/dag.ts create mode 100644 packages/core/test/execution-engine.ts create mode 100644 packages/core/test/helpers.ts delete mode 100644 packages/core/test/test.ts diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..9e3c877c76 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +# EditorConfig is awesome: https://EditorConfig.org +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/examples/simple-ts/.gitignore b/examples/simple-ts/.gitignore new file mode 100644 index 0000000000..f1462f7a56 --- /dev/null +++ b/examples/simple-ts/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/examples/simple-ts/contracts/Multisig.sol b/examples/simple-ts/contracts/Multisig.sol new file mode 100644 index 0000000000..37af3588c8 --- /dev/null +++ b/examples/simple-ts/contracts/Multisig.sol @@ -0,0 +1,318 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract MultiSigWallet { + + event Confirmation(address indexed sender, uint indexed transactionId); + event Revocation(address indexed sender, uint indexed transactionId); + event Submission(uint indexed transactionId); + event Execution(uint indexed transactionId); + event ExecutionFailure(uint indexed transactionId); + event Deposit(address indexed sender, uint value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint required); + + uint constant public MAX_OWNER_COUNT = 50; + + mapping (uint => Transaction) public transactions; + mapping (uint => mapping (address => bool)) public confirmations; + mapping (address => bool) public isOwner; + address[] public owners; + uint public required; + uint public transactionCount; + + struct Transaction { + address destination; + uint value; + bytes data; + bool executed; + } + + modifier onlyWallet() { + require(msg.sender == address(this)); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner]); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner]); + _; + } + + modifier transactionExists(uint transactionId) { + require(transactions[transactionId].destination != address(0)); + _; + } + + modifier confirmed(uint transactionId, address owner) { + require(confirmations[transactionId][owner]); + _; + } + + modifier notConfirmed(uint transactionId, address owner) { + require(!confirmations[transactionId][owner]); + _; + } + + modifier notExecuted(uint transactionId) { + require(!transactions[transactionId].executed); + _; + } + + modifier notNull(address _address) { + require(_address != address(0)); + _; + } + + modifier validRequirement(uint ownerCount, uint _required) { + require(ownerCount <= MAX_OWNER_COUNT + && _required <= ownerCount + && _required != 0 + && ownerCount != 0); + _; + } + + receive() + external payable + { + if (msg.value > 0) + emit Deposit(msg.sender, msg.value); + } + + constructor(address[] memory _owners, uint _required) + validRequirement(_owners.length, _required) + { + for (uint i=0; i<_owners.length; i++) { + require(!isOwner[_owners[i]] && _owners[i] != address(0)); + isOwner[_owners[i]] = true; + } + owners = _owners; + required = _required; + } + + function addOwner(address owner) + public + onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + function removeOwner(address owner) + public + onlyWallet + ownerExists(owner) + { + isOwner[owner] = false; + for (uint i=0; i owners.length) + changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + function replaceOwner(address owner, address newOwner) + public + onlyWallet + ownerExists(owner) + ownerDoesNotExist(newOwner) + { + for (uint i=0; i { + public async execute( + input: { + multiSigWalletAddress: string | { address: string }; + contractName: string; + destination: string | { address: string }; + method: string; + args: unknown[]; + }, + services: Services + ): Promise { + const multiSigWalletArtifact = await services.artifacts.getArtifact( + "MultiSigWallet" + ); + const multiSigWalletAddress = + typeof input.multiSigWalletAddress === "string" + ? input.multiSigWalletAddress + : input.multiSigWalletAddress.address; + const destinationAddress = + typeof input.destination === "string" + ? input.destination + : input.destination.address; + + const contractArtifact = await services.artifacts.getArtifact( + input.contractName + ); + const Factory = new ethers.Contract( + destinationAddress, + contractArtifact.abi + ); + + const txData = Factory.interface.encodeFunctionData( + input.method, + input.args + ); + + const multisigTx = await services.contracts.call( + multiSigWalletAddress, + multiSigWalletArtifact.abi, + "submitTransaction", + [destinationAddress, 0, txData] + ); + + const submissionLog = await services.contracts.getLog( + multisigTx, + "Submission", + multiSigWalletAddress, + multiSigWalletArtifact.abi + ); + + const { transactionId } = submissionLog.args; + + const isConfirmed = await services.contracts.staticCall( + multiSigWalletAddress, + multiSigWalletArtifact.abi, + "isConfirmed", + [transactionId] + ); + + if (!isConfirmed) { + throw new Hold(`Waiting for multisig to confirm ${transactionId}`); + } + + return multisigTx; + } + + public async validate(input: {}, services: Services): Promise { + return []; + } +} + +class MultisigContractBinding extends InternalBinding< + MultiSigContractOptions, + string +> { + public getDependencies(): InternalBinding[] { + return [ + this.input.multiSigWalletAddress, + this.input.destination, + ...this.input.args + ].filter((x): x is InternalBinding => { + return InternalBinding.isBinding(x); + }); + } +} + +function callFromMultisig( + m: ModuleBuilder, + multisig: AddressLike, + contractName: string, + destination: AddressLike, + method: string, + options: CallFromMultisigOptions +): Binding { + const id = options.id; + const args = options?.args ?? []; + const b = new MultisigContractBinding(m.getModuleId(), id, { + multiSigWalletAddress: multisig, + contractName, + destination, + method, + args + }); + + m.addExecutor(new MultisigContractExecutor(b)); + + return b; +} + +export default buildModule("Multisig", m => { + const multisig = m.contract("MultiSigWallet", { + args: [ + [ + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + ], + 2 + ] + }); + + const owned = m.contract("Owned", { + args: [multisig] + }); + + const tx = callFromMultisig(m, multisig, "Owned", owned, "inc", { + id: "Owned.inc" + }); + + return { multisig, tx, owned }; +}); diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts new file mode 100644 index 0000000000..32508e83d8 --- /dev/null +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -0,0 +1,249 @@ +import { ethers } from "ethers"; +import { + AddressLike, + ContractBinding, + ContractOptions, + buildModule, + ModuleBuilder, + InternalBinding, + InternalContractBinding, + Executor, + Contract, + Services, + Binding, + Hold +} from "ignition"; + +interface CallFromMultisigAndTimelockOptions { + id: string; + args?: any[]; +} + +interface MultiSigContractOptions { + multisig: ContractBinding; + timelock: ContractBinding; + destination: ContractBinding; + method: string; + args: unknown[]; +} + +class MultisigAndTimelockExecutor extends Executor< + MultiSigContractOptions, + string +> { + public async execute( + input: { + multisig: { abi: any[]; address: string }; + timelock: { abi: any[]; address: string }; + destination: { abi: any[]; address: string }; + method: string; + args: unknown[]; + }, + services: Services + ): Promise { + const zeroBytes32 = ethers.utils.formatBytes32String(""); + + // contracts instances + const contractToCall = new ethers.Contract( + input.destination.address, + input.destination.abi + ); + const timelock = new ethers.Contract( + input.timelock.address, + input.timelock.abi + ); + + // function to call to timelocked contract + const txData = contractToCall.interface.encodeFunctionData( + input.method, + input.args + ); + + const timelockParameters = [ + input.destination.address, + 0, + txData, + zeroBytes32, + zeroBytes32 + ]; + + // send timelocked tx to multisig + const scheduleTxData = timelock.interface.encodeFunctionData("schedule", [ + ...timelockParameters, + 15 + ]); + + console.log("[MultisigAndTimelockExecutor] submit schedule tx"); + const multisigScheduleTx = await services.contracts.call( + input.multisig.address, + input.multisig.abi, + "submitTransaction", + [input.timelock.address, 0, scheduleTxData], + { gasLimit: 5000000 } + ); + + const multisigScheduleSubmissionLog = await services.contracts.getLog( + multisigScheduleTx, + "Submission", + input.multisig.address, + input.multisig.abi + ); + + const { + transactionId: multisigScheduleTxId + } = multisigScheduleSubmissionLog.args; + + // wait until the multisig schedule is confirmed + const isScheduleConfirmed = await services.contracts.staticCall( + input.multisig.address, + input.multisig.abi, + "isConfirmed", + [multisigScheduleTxId] + ); + + if (!isScheduleConfirmed) { + throw new Hold( + `Waiting for multisig to confirm the schedule, tx id is '${multisigScheduleTxId}'` + ); + } + + // wait until the wait time passes + const timelockCallId = await services.contracts.staticCall( + input.timelock.address, + input.timelock.abi, + "hashOperation", + timelockParameters + ); + + const isReady = await services.contracts.staticCall( + input.timelock.address, + input.timelock.abi, + "isOperationReady", + [timelockCallId] + ); + const isDone = await services.contracts.staticCall( + input.timelock.address, + input.timelock.abi, + "isOperationDone", + [timelockCallId] + ); + + if (!isReady && !isDone) { + throw new Hold( + `Waiting for timelock's tx '${timelockCallId} to be ready'` + ); + } + + // execute the timelocked tx through the multisig + const executeTxData = timelock.interface.encodeFunctionData( + "execute", + timelockParameters + ); + + console.log("[MultisigAndTimelockExecutor] submit execute tx"); + const multisigExecuteTx = await services.contracts.call( + input.multisig.address, + input.multisig.abi, + "submitTransaction", + [input.timelock.address, 0, executeTxData], + { gasLimit: 5000000 } + ); + + const multisigExecuteSubmissionLog = await services.contracts.getLog( + multisigExecuteTx, + "Submission", + input.multisig.address, + input.multisig.abi + ); + + const { + transactionId: multisigExecuteTxId + } = multisigExecuteSubmissionLog.args; + + // wait until the multisig execute is confirmed + const isConfirmed = await services.contracts.staticCall( + input.multisig.address, + input.multisig.abi, + "isConfirmed", + [multisigExecuteTxId] + ); + + if (!isConfirmed) { + throw new Hold( + `Waiting for multisig to confirm the execution of ${multisigExecuteTxId}` + ); + } + + return "done"; + } + + public async validate(input: {}, services: Services): Promise { + return []; + } +} + +class MultisigAndTimelockBinding extends InternalBinding< + MultiSigContractOptions, + string +> { + public getDependencies(): InternalBinding[] { + return [ + this.input.multisig, + this.input.timelock, + this.input.destination, + ...this.input.args + ].filter((x): x is InternalBinding => { + return InternalBinding.isBinding(x); + }); + } +} + +function callFromMultisigAndTimelock( + m: ModuleBuilder, + multisig: ContractBinding, + timelock: ContractBinding, + destination: ContractBinding, + method: string, + options: CallFromMultisigAndTimelockOptions +): Binding { + const id = options.id; + const args = options?.args ?? []; + const b = new MultisigAndTimelockBinding(m.getModuleId(), id, { + multisig, + timelock, + destination, + method, + args + }); + + m.addExecutor(new MultisigAndTimelockExecutor(b)); + + return b; +} + +export default buildModule("MultisigAndTimelock", m => { + const multisig = m.contract("MultiSigWallet", { + args: [ + [ + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + ], + 2 + ] + }); + + const timelock = m.contract("TimelockController", { + args: [15, [multisig], [multisig]] + }); + + const owned = m.contract("Owned", { + args: [timelock] + }); + + callFromMultisigAndTimelock(m, multisig, timelock, owned, "inc", { + id: "Owned.inc" + }); + + return { owned }; +}); diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts new file mode 100644 index 0000000000..c258930c68 --- /dev/null +++ b/examples/simple-ts/ignition/Timelock.ts @@ -0,0 +1,132 @@ +import {ethers} from "ethers"; +import { + AddressLike, + ContractBinding, + ContractOptions, + buildModule, + ModuleBuilder, + InternalBinding, + InternalContractBinding, + Executor, + Contract, + Services, + Binding, + Hold +} from "ignition"; + +class TimelockCallExecutor extends Executor { + public async execute( + input: { timelock: Contract; contract: Contract; method: string; args: any[] }, + services: Services + ): Promise { + const Factory = new ethers.Contract( + input.contract.address, + input.contract.abi + ); + + const txData = Factory.interface.encodeFunctionData( + input.method, + input.args + ); + + const zeroBytes32 = ethers.utils.formatBytes32String(""); + + const timelockTxHash = await services.contracts.call( + input.timelock.address, + input.timelock.abi, + "schedule", + [input.contract.address, 0, txData, zeroBytes32, zeroBytes32, 15] + ); + + const scheduleLog = await services.contracts.getLog( + timelockTxHash, + "CallScheduled", + input.timelock.address, + input.timelock.abi + ); + + const { id } = scheduleLog.args; + + const isReady = await services.contracts.staticCall( + input.timelock.address, + input.timelock.abi, + "isOperationReady", + [id] + ) + + if (!isReady) { + throw new Hold(`Waiting for timelock's tx '${id} to be ready'`); + } + + const executeTx = await services.contracts.call( + input.timelock.address, + input.timelock.abi, + "execute", + [input.contract.address, 0, txData, zeroBytes32, zeroBytes32] + ); + + return executeTx + } + + public async validate( + input: TimelockCallOptions, + services: Services + ): Promise { + return []; + } +} + +interface TimelockCallOptions { + timelock: ContractBinding; + contract: ContractBinding; + method: string; +} + +class TimelockCallBinding extends InternalBinding { + public getDependencies(): InternalBinding[] { + return [this.input.timelock, this.input.contract].filter( + (x): x is InternalBinding => { + return InternalBinding.isBinding(x); + } + ); + } +} + +function callFromTimelock( + m: ModuleBuilder, + timelock: ContractBinding, + contract: ContractBinding, + method: string, + options: { id: string } +): TimelockCallBinding { + const id = options.id; + const b = new TimelockCallBinding(m.getModuleId(), id, { + timelock, + contract, + method + }); + + m.addExecutor(new TimelockCallExecutor(b)); + + return b; +} + +export default buildModule("Timelock", m => { + const timelock = m.contract("TimelockController", { + args: [ + 15, + ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], + ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"] + ] + }); + + const owned = m.contract("Owned", { + args: [timelock] + }); + + callFromTimelock(m, timelock, owned, "inc", { + id: "Owned.inc" + }); + + return { owned }; +}); diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json new file mode 100644 index 0000000000..91d926be47 --- /dev/null +++ b/examples/simple-ts/package.json @@ -0,0 +1,22 @@ +{ + "name": "hardhat-ignition-example-simple", + "version": "0.0.1", + "private": true, + "dependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/hardhat-ignition": "^0.0.1", + "@openzeppelin/contracts": "^4.3.2", + "@types/chai": "^4.2.22", + "@types/mocha": "^9.0.0", + "@types/node": "^16.11.1", + "chai": "^4.3.4", + "ethers": "^5.4.7", + "hardhat": "^2.6.4", + "ignition": "^0.0.2", + "ts-node": "^10.3.0", + "typescript": "^4.4.4" + }, + "devDependencies": { + "ts-node": "^10.3.0" + } +} diff --git a/examples/simple-ts/scripts/multisig-and-timelock.ts b/examples/simple-ts/scripts/multisig-and-timelock.ts new file mode 100644 index 0000000000..fc4daf808d --- /dev/null +++ b/examples/simple-ts/scripts/multisig-and-timelock.ts @@ -0,0 +1,16 @@ +import hre from "hardhat"; + +import MultisigAndTimelock from "../ignition/MultisigAndTimelock" + +async function main() { + const { owned } = await hre.ignition.deploy(MultisigAndTimelock) + + console.log((await owned.count()).toString()); +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/examples/simple-ts/scripts/multisig.ts b/examples/simple-ts/scripts/multisig.ts new file mode 100644 index 0000000000..d317b1baa6 --- /dev/null +++ b/examples/simple-ts/scripts/multisig.ts @@ -0,0 +1,16 @@ +import hre from "hardhat"; + +import Multisig from "../ignition/Multisig" + +async function main() { + const { owned } = await hre.ignition.deploy(Multisig) + + console.log((await owned.count()).toString()); +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/examples/simple-ts/scripts/timelock.ts b/examples/simple-ts/scripts/timelock.ts new file mode 100644 index 0000000000..7c108fa4ae --- /dev/null +++ b/examples/simple-ts/scripts/timelock.ts @@ -0,0 +1,16 @@ +import hre from "hardhat"; + +import Timelock from "../ignition/Timelock" + +async function main() { + const { owned } = await hre.ignition.deploy(Timelock) + + console.log((await owned.count()).toString()); +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/examples/simple-ts/tsconfig.json b/examples/simple-ts/tsconfig.json new file mode 100644 index 0000000000..ade635cb80 --- /dev/null +++ b/examples/simple-ts/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "es2018", + "module": "commonjs", + "strict": true, + "esModuleInterop": true, + "outDir": "dist" + }, + "include": ["./scripts", "./test"], + "files": ["./hardhat.config.ts"] +} diff --git a/examples/simple/.gitignore b/examples/simple/.gitignore new file mode 100644 index 0000000000..f1462f7a56 --- /dev/null +++ b/examples/simple/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol new file mode 100644 index 0000000000..9881a49ce4 --- /dev/null +++ b/examples/simple/contracts/Foo.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract Foo { + uint public x = 10; +} + +contract Bar { + address public a; + + constructor (address _a) {a=_a;} +} + +contract Qux { + address public a; + + constructor (address _a) {a=_a;} +} diff --git a/examples/simple/deploy.js b/examples/simple/deploy.js new file mode 100644 index 0000000000..f311066cbd --- /dev/null +++ b/examples/simple/deploy.js @@ -0,0 +1,13 @@ +async function main() { + const { foo, bar } = await ignition.deploy(require("./ignition/MyModule")); + + console.log('Foo:', foo.address) + console.log('Bar:', bar.address) +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/examples/simple/hardhat.config.js b/examples/simple/hardhat.config.js new file mode 100644 index 0000000000..770b94f887 --- /dev/null +++ b/examples/simple/hardhat.config.js @@ -0,0 +1,13 @@ +require("@nomiclabs/hardhat-ignition") + +module.exports = { + solidity: "0.8.5", + networks: { + hardhat: { + // mining: { + // auto: false + // }, + initialBaseFeePerGas: 1_000_000_000 + }, + }, +}; diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js new file mode 100644 index 0000000000..bf14f57ae4 --- /dev/null +++ b/examples/simple/ignition/MyModule.js @@ -0,0 +1,14 @@ +const { buildModule } = require("ignition") + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo") + const bar = m.contract("Bar", { + args: [foo] + }) + const bar2 = m.contract("Bar", { + id: "Bar2", + args: [foo] + }) + + return { foo, bar } +}); diff --git a/examples/simple/package.json b/examples/simple/package.json new file mode 100644 index 0000000000..f36a1e84f9 --- /dev/null +++ b/examples/simple/package.json @@ -0,0 +1,13 @@ +{ + "name": "hardhat-ignition-example-simple-ts", + "version": "0.0.1", + "private": true, + "dependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/hardhat-ignition": "^0.0.1", + "ignition": "^0.0.2" + }, + "devDependencies": { + "hardhat": "^2.6.4" + } +} diff --git a/examples/simple/script.js b/examples/simple/script.js new file mode 100644 index 0000000000..a5a0e07966 --- /dev/null +++ b/examples/simple/script.js @@ -0,0 +1,22 @@ +const hre = require("hardhat"); + +const MyModule = require("./ignition/MyModule") +const MyOtherModule = require("./ignition/MyOtherModule") + +async function main() { + const [{ foo: foo1, bar }, { foo: foo2, qux }] = await ignition.deployMany([MyModule, MyOtherModule]); + + console.log('foo1', foo1.address); + console.log('foo2', foo2.address); + console.log('bar', bar.address); + console.log('qux', qux.address); + console.log('bar.foo', await bar.a()); + console.log('qux.foo', await qux.a()); +} + +main() + .then(() => process.exit(0)) + .catch(error => { + console.error(error); + process.exit(1); + }); diff --git a/package.json b/package.json index 7d2e91a737..fb92634dc9 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,11 @@ "author": "Nomic Labs LLC", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, - "workspaces": ["packages/*"], + "workspaces": ["packages/*", "examples/*"], "scripts": { - "build": "wsrun --exclude-missing --serial build" + "build": "wsrun --exclude-missing --serial build", + "lint": "wsrun --exclude-missing --serial lint", + "watch": "tsc --build --watch packages/core packages/hardhat-plugin" }, "devDependencies": { "wsrun": "^5.2.4" diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 889740f226..95944742b2 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -4,4 +4,7 @@ module.exports = { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, + rules: { + "no-console": "error", + }, }; diff --git a/packages/core/.mocharc.json b/packages/core/.mocharc.json new file mode 100644 index 0000000000..5ec3aeaca2 --- /dev/null +++ b/packages/core/.mocharc.json @@ -0,0 +1,3 @@ +{ + "require": "ts-node/register/transpile-only" +} diff --git a/packages/core/.prettierrc b/packages/core/.prettierrc new file mode 100644 index 0000000000..0967ef424b --- /dev/null +++ b/packages/core/.prettierrc @@ -0,0 +1 @@ +{} diff --git a/packages/core/package.json b/packages/core/package.json index 0cb96b67eb..c9477c0626 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -8,19 +8,29 @@ "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", - "prettier": "prettier \"**/*.{js,md,json}\"" + "prettier": "prettier \"**/*.{js,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"" }, "devDependencies": { + "@types/chai": "^4.2.22", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", "eslint-plugin-prettier": "4.0.0", - "mocha": "^9.1.1", + "mocha": "^9.1.3", "prettier": "2.4.1", "typescript": "^4.4.3" + }, + "dependencies": { + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0" } } diff --git a/packages/core/src/bindings.ts b/packages/core/src/bindings.ts new file mode 100644 index 0000000000..79515ea066 --- /dev/null +++ b/packages/core/src/bindings.ts @@ -0,0 +1,116 @@ +import { Contract } from "./types"; + +export type BindingOutput = string | number | Contract; + +export function serializeBindingOutput(x: BindingOutput) { + if (typeof x === "string") { + return { _type: "string", value: x }; + } else if (typeof x === "number") { + return { _type: "number", value: x }; + } else if ("address" in x) { + return { _type: "contract", value: x }; + } + + const exhaustiveCheck: never = x; + return exhaustiveCheck; +} + +export function deserializeBindingOutput(x: any) { + if (x === null || x === undefined) { + throw new Error("[deserializeBindingOutput] value is null or undefined"); + } + + if (!("_type" in x)) { + throw new Error( + "[deserializeBindingOutput] value was not serialized by Ignition" + ); + } + + return x.value; +} + +export abstract class Binding { + // dummy variables needed by the type-checker to work correctly when opaque + // types are used in a module definition + protected _dummyInput!: I; + protected _dummyOutput!: O; +} + +export abstract class InternalBinding< + I = unknown, + O extends BindingOutput = any +> extends Binding { + constructor( + public readonly moduleId: string, + public readonly id: string, + public readonly input: I + ) { + super(); + } + + abstract getDependencies(): InternalBinding[]; + + public static isBinding(x: unknown): x is InternalBinding { + return x instanceof InternalBinding; + } +} + +export interface ContractOptions { + contractName: string; + args: Array>; +} + +export type Bindable = T | Binding; + +export type AddressLike = Bindable | Binding; + +export class ContractBinding extends Binding {} + +type Unflattened = T[] | Array>; + +function deepFlatten(array: Unflattened): T[] { + let result: T[] = []; + + array.forEach((elem) => { + if (Array.isArray(elem)) { + result = result.concat(deepFlatten(elem)); + } else { + result.push(elem); + } + }); + + return result; +} + +export class InternalContractBinding extends InternalBinding< + ContractOptions, + Contract +> { + public getDependencies(): InternalBinding[] { + const mapToBindings = (x: unknown): Unflattened => { + if (Array.isArray(x)) { + return x.map(mapToBindings); + } + + if (InternalBinding.isBinding(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToBindings); + } + + return []; + }; + + const dependencies = deepFlatten(mapToBindings(this.input.args)); + + return dependencies; + } +} + +export type Resolved = T extends Binding + ? O + : { + [K in keyof T]: T[K] extends Binding ? O : Resolved; + }; diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts new file mode 100644 index 0000000000..9ff96213b5 --- /dev/null +++ b/packages/core/src/execution-engine.ts @@ -0,0 +1,450 @@ +import { InternalBinding } from "./bindings"; +import { TxSender } from "./tx-sender"; +import { Journal } from "./journal"; +import { DAG, IgnitionModule } from "./modules"; +import { Providers } from "./providers"; +import { + ArtifactsService, + ContractsService, + LoggingService, + Services, + TransactionsService, +} from "./services"; + +interface ExecutionEngineOptions { + parallelizationLevel: number; + loggingEnabled: boolean; +} + +interface ExecutorPlan { + id: string; + description: string; +} +type ModulePlan = "already-deployed" | ExecutorPlan[]; +export type DeploymentPlan = Record; + +export class ExecutionEngine { + public static buildPlan(dag: DAG, currentDeploymentResult: DeploymentResult) { + const plan: DeploymentPlan = {}; + + const ignitionModules = dag.getSortedModules(); + + for (const ignitionModule of ignitionModules) { + if (currentDeploymentResult.hasModule(ignitionModule.id)) { + plan[ignitionModule.id] = "already-deployed"; + continue; + } + + const modulePlan: ExecutorPlan[] = []; + const executors = ignitionModule.getSortedExecutors(); + for (const executor of executors) { + modulePlan.push({ + id: executor.binding.id, + description: executor.getDescription(), + }); + } + plan[ignitionModule.id] = modulePlan; + } + + return plan; + } + + constructor( + private _providers: Providers, + private _journal: Journal, + private _currentDeploymentResult: DeploymentResult, + private _options: ExecutionEngineOptions + ) {} + + public async execute(dag: DAG): Promise { + const deploymentResult = this._currentDeploymentResult; + + // validate all modules + const errorsPerModule: Map = new Map(); + let hasErrors = false; + for (const ignitionModule of dag.getModules()) { + const errors = await this._validateModule(ignitionModule); + if (errors.length > 0) { + hasErrors = true; + } + errorsPerModule.set(ignitionModule.id, errors); + } + + if (hasErrors) { + let errorMessage = `The following validation errors were found:\n`; + let isFirst = true; + for (const [moduleId, errors] of errorsPerModule.entries()) { + if (errors.length === 0) { + continue; + } + if (!isFirst) { + errorMessage += "\n"; + } + isFirst = false; + + errorMessage += ` In module ${moduleId}:\n`; + for (const error of errors) { + errorMessage += ` - ${error}\n`; + } + } + + throw new Error(errorMessage); + } + + // execute each module sequentially + for (const ignitionModule of dag.getModules()) { + if (deploymentResult.hasModule(ignitionModule.id)) { + const previousModuleResult = deploymentResult.getModule( + ignitionModule.id + ); + if (previousModuleResult.isSuccess()) { + continue; + } + } + const moduleResult = await this._executeModule( + ignitionModule, + deploymentResult + ); + + deploymentResult.addResult(ignitionModule.id, moduleResult); + } + + return deploymentResult; + } + + private async _validateModule( + ignitionModule: IgnitionModule + ): Promise { + const executors = ignitionModule.getExecutors(); + const allErrors: string[] = []; + + for (const executor of executors) { + const txSender = new TxSender( + ignitionModule.id, + executor.binding.id, + this._journal + ); + const services = createServices( + this._providers, + txSender, + this._options.loggingEnabled + ); + + const errors = await executor.validate(executor.binding.input, services); + if (errors.length > 0) { + allErrors.push(...errors); + } + } + + return allErrors; + } + + private async _executeModule( + ignitionModule: IgnitionModule, + deploymentResult: DeploymentResult + ): Promise { + const { parallelizationLevel } = this._options; + const executors = ignitionModule.getExecutors(); + const moduleResult = new ModuleResult(ignitionModule.id); + + let it = 0; + while (true) { + it++; + if (it >= 1800) { + moduleResult.addGeneralFailure(new Error("Max iterations reached")); + return moduleResult; + } + + const someFailure = executors.some((e) => e.isFailure()); + const someHold = executors.some((e) => e.isHold()); + let runningCount = executors.filter((e) => e.isRunning()).length; + const allSuccess = executors.every((e) => e.isSuccess()); + + if ( + allSuccess || + (someFailure && runningCount === 0) || + (someHold && runningCount === 0) + ) { + for (const executor of executors) { + if (!moduleResult.hasResult(executor.binding.id)) { + if (executor.isSuccess()) { + moduleResult.addResult(executor.binding.id, executor.getResult()); + } + if (executor.isHold()) { + moduleResult.addHold( + executor.binding.id, + executor.getHoldReason() + ); + } + } + } + + const failures = executors + .filter((e) => e.isFailure()) + .map((e) => [e.binding.id, e.getError()]); + + const holds = executors + .filter((e) => e.isHold()) + .map((e) => [e.binding.id, e.getHoldReason()]); + + if (failures.length === 0 && holds.length === 0) { + await this._journal.delete(ignitionModule.id); + } + + failures.forEach(([bindingId, failure]) => + moduleResult.addFailure(bindingId, failure) + ); + holds.forEach(([bindingId, holdReason]) => + moduleResult.addHold(bindingId, holdReason) + ); + + return moduleResult; + } + + for (const executor of ignitionModule.getExecutors()) { + if (executor.isReady() && runningCount < parallelizationLevel) { + const dependencies = executor.binding.getDependencies(); + const allDependenciesReady = dependencies.every((d) => + d.moduleId !== ignitionModule.id + ? deploymentResult.hasBindingResult(d.moduleId, d.id) + : moduleResult.hasResult(d.id) + ); + + if (allDependenciesReady) { + const resolvedInput = this._resolve( + executor.binding.input, + deploymentResult, + moduleResult + ); + const txSender = new TxSender( + ignitionModule.id, + executor.binding.id, + this._journal + ); + const services = createServices( + this._providers, + txSender, + this._options.loggingEnabled + ); + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + executor.run(resolvedInput, services); + runningCount++; + } + } + + if (!moduleResult.hasResult(executor.binding.id)) { + if (executor.isSuccess()) { + moduleResult.addResult(executor.binding.id, executor.getResult()); + } + if (executor.isHold()) { + moduleResult.addHold(executor.binding.id, executor.getHoldReason()); + } + } + } + + await new Promise((res) => setTimeout(res, 100)); + } + } + + private _resolve( + input: any, + deploymentResult: DeploymentResult, + currentModuleResult: ModuleResult + ): any { + if (InternalBinding.isBinding(input)) { + if (input.moduleId === currentModuleResult.moduleId) { + return currentModuleResult.getResult(input.id); + } else { + return deploymentResult.getBindingResult(input.moduleId, input.id); + } + } + + if (Array.isArray(input)) { + return input.map((x) => + this._resolve(x, deploymentResult, currentModuleResult) + ); + } + + if (typeof input === "object" && input !== null) { + const resolvedInput: any = {}; + + for (const [key, value] of Object.entries(input)) { + resolvedInput[key] = this._resolve( + value, + deploymentResult, + currentModuleResult + ); + } + + return resolvedInput; + } + + return input; + } +} + +export class DeploymentResult { + private _results: Map = new Map(); + + public getModule(moduleId: string): ModuleResult { + const moduleResult = this._results.get(moduleId); + if (moduleResult === undefined) { + throw new Error( + `DeploymentResult doesn't have module with id '${moduleId}'` + ); + } + + return moduleResult; + } + + public getModules(): ModuleResult[] { + return [...this._results.values()]; + } + + public addResult(moduleId: string, moduleResult: ModuleResult) { + if (this._results.has(moduleId)) { + throw new Error(`A result for '${moduleId}' already exists`); + } + this._results.set(moduleId, moduleResult); + } + + public hasModule(moduleId: string) { + return this._results.has(moduleId); + } + + public hasBindingResult(moduleId: string, bindingId: string) { + const moduleResult = this._results.get(moduleId); + if (moduleResult === undefined) { + return false; + } + + return moduleResult.hasResult(bindingId); + } + + public getBindingResult(moduleId: string, bindingId: string) { + const moduleResult = this._results.get(moduleId); + if (moduleResult === undefined) { + throw new Error(`No result for module '${moduleId}'`); + } + + return moduleResult.getResult(bindingId); + } + + public isHold(): [string, string[]] | undefined { + for (const [moduleId, moduleResult] of this._results.entries()) { + const holds = moduleResult.getHolds(); + if (holds.length > 0) { + return [moduleId, holds]; + } + } + + return; + } +} + +export class ModuleResult { + // TODO merge these three into a single map + private _results = new Map(); + private _failures = new Map(); + private _holds = new Map(); + + private _generalFailures: Error[] = []; + + constructor(public readonly moduleId: string) {} + + public isSuccess(): boolean { + const failuresCount = [ + ...this._failures.values(), + ...this._generalFailures.values(), + ].length; + const holdsCount = [...this._holds.values()].length; + + return failuresCount + holdsCount === 0; + } + + public isFailure(): boolean { + const failuresCount = [ + ...this._failures.values(), + ...this._generalFailures.values(), + ].length; + return failuresCount > 0; + } + + public isHold(): boolean { + const failuresCount = [ + ...this._failures.values(), + ...this._generalFailures.values(), + ].length; + const holdsCount = [...this._holds.values()].length; + + return failuresCount === 0 && holdsCount > 0; + } + + public hasResult(bindingId: string): boolean { + return this._results.has(bindingId); + } + + public addResult(bindingId: string, result: any) { + const bindingResult = this._results.get(bindingId); + if (bindingResult !== undefined) { + throw new Error( + `[ModuleResult] Module '${this.moduleId}' already has a result for binding '${bindingId}'` + ); + } + + this._results.set(bindingId, result); + } + + public addFailure(bindingId: string, error: Error) { + this._failures.set(bindingId, error); + } + + public addHold(bindingId: string, holdReason: string) { + this._holds.set(bindingId, holdReason); + } + + public addGeneralFailure(error: Error) { + this._generalFailures.push(error); + } + + public getResult(bindingId: string) { + const bindingResult = this._results.get(bindingId); + if (bindingResult === undefined) { + throw new Error( + `[ModuleResult] Module '${this.moduleId}' has no result for binding '${bindingId}'` + ); + } + + return bindingResult; + } + + public getResults(): Array<[string, any]> { + return [...this._results.entries()]; + } + + public getHolds() { + return [...this._holds.values()]; + } + + public count() { + return [...this._results.values()].length; + } +} + +function createServices( + providers: Providers, + txSender: TxSender, + loggingEnabled: boolean +): Services { + const services: Services = { + artifacts: new ArtifactsService(providers), + contracts: new ContractsService(providers, txSender), + transactions: new TransactionsService(providers), + logging: new LoggingService({ + enabled: loggingEnabled, + }), + }; + + return services; +} diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts new file mode 100644 index 0000000000..b9baaf0db2 --- /dev/null +++ b/packages/core/src/executors.ts @@ -0,0 +1,188 @@ +import { ethers } from "ethers"; + +import { + BindingOutput, + ContractOptions, + InternalBinding, + Resolved, +} from "./bindings"; +import { Services } from "./services"; +import { Contract } from "./types"; + +/** + * An instance of this class is thrown to indicate that the executor is waiting + * for some external event to happen, like a multisig that needs extra + * confirmations or a timelocked contract. + */ +export class Hold { + constructor(public readonly reason: string) {} +} + +export abstract class Executor { + private _dummyInput!: I; + private _dummyOutput!: O; + private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; + private result?: any; + private error?: any; + private holdReason?: string; + + constructor(public readonly binding: InternalBinding) {} + + abstract execute(input: Resolved, services: Services): Promise; + abstract validate(input: I, services: Services): Promise; + abstract getDescription(): string; + + public async run(input: Resolved, services: Services) { + try { + services.logging.log(`[${this.binding.id}] Starting`); + this._setRunning(); + const result = await this.execute(input, services); + services.logging.log(`[${this.binding.id}] Successful`); + this._setSuccess(result); + } catch (e: any) { + if (e instanceof Hold) { + services.logging.log(`[${this.binding.id}] Hold: ${e.reason}`); + this._setHold(e.reason); + } else { + services.logging.log(`[${this.binding.id}] Error: ${e.message}`); + this._setFailure(e); + } + } + } + + public isReady() { + return this.state === "ready"; + } + + public isRunning() { + return this.state === "running"; + } + + public isHold() { + return this.state === "hold"; + } + + public getHoldReason(): string { + if (this.holdReason === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no hold reason` + ); + } + + return this.holdReason; + } + + public isSuccess() { + return this.state === "success"; + } + + public getResult() { + if (this.result === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no result` + ); + } + + return this.result; + } + + public isFailure() { + return this.state === "failure"; + } + + public getError() { + if (this.error === undefined) { + throw new Error("assertion error"); + } + + return this.error; + } + + private _setRunning() { + this.state = "running"; + } + private _setHold(reason: string) { + this.state = "hold"; + this.holdReason = reason; + } + private _setSuccess(result: any) { + this.state = "success"; + this.result = result; + } + private _setFailure(err: Error) { + this.state = "failure"; + this.error = err; + } +} + +export class ContractExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contractName } = input; + const artifact = await services.artifacts.getArtifact(contractName); + + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.deploy(artifact, args); + + const receipt = await services.transactions.wait(txHash); + + return { + name: contractName, + abi: artifact.abi, + address: receipt.contractAddress, + }; + } + + public async validate( + input: ContractOptions, + services: Services + ): Promise { + const artifactExists = await services.artifacts.hasArtifact( + input.contractName + ); + + if (!artifactExists) { + return [`Artifact with name '${input.contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(input.contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return [ + `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + ]; + } + + return []; + } + + public getDescription() { + return `Deploy contract ${this.binding.input.contractName}`; + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 08f9177b58..40c9c6fd43 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1 +1,120 @@ -export class Ignition {} +import debug from "debug"; + +import { + AddressLike, + BindingOutput, + ContractBinding, + ContractOptions, + deserializeBindingOutput, + InternalBinding, + InternalContractBinding, + serializeBindingOutput, +} from "./bindings"; +import { + DeploymentResult, + ExecutionEngine, + ModuleResult, +} from "./execution-engine"; +import { Executor, Hold } from "./executors"; +import { FileJournal, NullJournal } from "./journal"; +import { ModuleBuilder, ModuleBuilderImpl, UserModule } from "./modules"; +import { Providers } from "./providers"; +import { Services } from "./services"; +import { Contract } from "./types"; + +export { Binding } from "./bindings"; +export { DeploymentPlan } from "./execution-engine"; +export { buildModule } from "./modules"; +export { ContractsService as IgnitionDeployer } from "./services"; +export { + AddressLike, + BindingOutput, + Contract, + ContractBinding, + ContractOptions, + DeploymentResult, + Executor, + Hold, + InternalBinding, + InternalContractBinding, + ModuleBuilder, + ModuleResult, + Providers, + Services, + UserModule, + serializeBindingOutput, + deserializeBindingOutput, +}; + +const log = debug("ignition:main"); + +export class Ignition { + constructor( + private _providers: Providers, + private _saveDeployment: boolean + ) {} + + public async deploy( + userModules: Array>, + pathToJournal: string | undefined, + currentDeploymentResult: DeploymentResult + ) { + log(`Start deploy, '${userModules.length}' modules`); + + const m = new ModuleBuilderImpl(); + + const moduleOutputs: any[] = []; + + for (const userModule of userModules) { + log("Load module '%s'", userModule.id); + const moduleOutput = m.useModule(userModule); + moduleOutputs.push(moduleOutput); + } + + log("Build DAG"); + const dag = m.buildDAG(); + + log("Create journal with path '%s'", pathToJournal); + const journal = + pathToJournal !== undefined + ? new FileJournal(pathToJournal) + : new NullJournal(); + + const engine = new ExecutionEngine( + this._providers, + journal, + currentDeploymentResult, + { + parallelizationLevel: 2, + loggingEnabled: pathToJournal !== undefined, + } + ); + + log("Execute deployment"); + const deploymentResult = await engine.execute(dag); + + return [deploymentResult, moduleOutputs] as const; + } + + public async buildPlan( + userModules: Array>, + currentDeploymentResult: DeploymentResult + ) { + log(`Start building plan, '${userModules.length}' modules`); + + const m = new ModuleBuilderImpl(); + + const moduleOutputs: any[] = []; + + for (const userModule of userModules) { + log("Load module '%s'", userModule.id); + const moduleOutput = m.useModule(userModule); + moduleOutputs.push(moduleOutput); + } + + log("Build DAG"); + const dag = m.buildDAG(); + + return ExecutionEngine.buildPlan(dag, currentDeploymentResult); + } +} diff --git a/packages/core/src/journal.ts b/packages/core/src/journal.ts new file mode 100644 index 0000000000..7faefdfd79 --- /dev/null +++ b/packages/core/src/journal.ts @@ -0,0 +1,215 @@ +import debug from "debug"; +import fsExtra from "fs-extra"; + +export interface JournalEntry { + txHash: string; + blockNumberWhenSent: number; +} + +/** + * A journal keeps track of all the transactions sent during a deployment. If a + * deployment is interrupted and resumed later for any reason, the journal can + * then be used to avoid re-sending transactions if possible. + */ +export interface Journal { + addEntry( + moduleId: string, + executorId: string, + entry: JournalEntry + ): Promise; + getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise; + replaceEntry( + moduleId: string, + executorId: string, + entryIndex: number, + entry: JournalEntry + ): Promise; + delete(moduleId: string): Promise; +} + +export class FileJournal implements Journal { + private _log: debug.IDebugger = debug("ignition:journal:file-journal"); + + constructor(private _path: string) {} + + public async addEntry( + moduleId: string, + executorId: string, + journalEntry: JournalEntry + ): Promise { + this._log(`Adding entry to ${moduleId}/${executorId}`); + + let content; + if (await fsExtra.pathExists(this._path)) { + content = await fsExtra.readJson(this._path); + } else { + content = {}; + } + + content[moduleId] = content[moduleId] ?? {}; + content[moduleId][executorId] = content[moduleId][executorId] ?? []; + content[moduleId][executorId].push(journalEntry); + + await fsExtra.writeJson(this._path, content, { + spaces: 2, + }); + + return content[moduleId][executorId].length - 1; + } + + public async getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise { + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + + if (!(await fsExtra.pathExists(this._path))) { + return; + } + const content = await fsExtra.readJson(this._path); + + return content?.[moduleId]?.[executorId]?.[entryIndex]; + } + + public async replaceEntry( + moduleId: string, + executorId: string, + txIndex: number, + journalEntry: JournalEntry + ): Promise { + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + + let content; + if (await fsExtra.pathExists(this._path)) { + content = await fsExtra.readJson(this._path); + } else { + content = {}; + } + + if (content[moduleId]?.[executorId]?.[txIndex] === undefined) { + throw new Error(`Assertion error: replacing non-existent transaction`); + } + + content[moduleId][executorId][txIndex] = journalEntry; + + await fsExtra.writeJson(this._path, content, { + spaces: 2, + }); + } + + public async delete(moduleId: string) { + this._log(`Deleting module ${moduleId}`); + + if (!(await fsExtra.pathExists(this._path))) { + return; + } + + const content = await fsExtra.readJson(this._path); + delete content?.[moduleId]; + + if (Object.entries(content).length === 0) { + await fsExtra.remove(this._path); + } else { + await fsExtra.writeJson(this._path, content, { + spaces: 2, + }); + } + } +} + +/** + * Journal implementation that just no-ops for every method. + * Used when journaling is disabled. + */ +export class NullJournal implements Journal { + private _log: debug.IDebugger = debug("ignition:journal:null-journal"); + + public async addEntry( + moduleId: string, + executorId: string, + _journalEntry: JournalEntry + ): Promise { + this._log(`Adding entry to ${moduleId}/${executorId}`); + return -1; + } + + public async getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise { + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + return undefined; + } + + public async replaceEntry( + moduleId: string, + executorId: string, + txIndex: number, + _entryIndex: JournalEntry + ): Promise { + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + } + + public async delete(moduleId: string): Promise { + this._log(`Deleting module ${moduleId}`); + } +} + +export class InMemoryJournal implements Journal { + private _log: debug.IDebugger = debug("ignition:journal:in-memory-journal"); + private _journal: Map> = new Map(); + + public async addEntry( + moduleId: string, + executorId: string, + journalEntry: JournalEntry + ): Promise { + this._log(`Adding entry to ${moduleId}/${executorId}`); + + const moduleEntry: Map = + this._journal.get(moduleId) ?? new Map(); + const executorEntries = moduleEntry.get(executorId) ?? []; + + executorEntries.push(journalEntry); + + return executorEntries.length - 1; + } + + public async getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise { + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + + return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; + } + + public async replaceEntry( + moduleId: string, + executorId: string, + txIndex: number, + entryIndex: JournalEntry + ): Promise { + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + + const transactions = this._journal.get(moduleId)?.get(executorId); + if (transactions === undefined || transactions[txIndex] === undefined) { + throw new Error(`Assertion error: replacing non-existent transaction`); + } + + transactions[txIndex] = entryIndex; + } + + public async delete(moduleId: string) { + this._log(`Deleting module ${moduleId}`); + + this._journal.delete(moduleId); + } +} diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts new file mode 100644 index 0000000000..b618a69cb4 --- /dev/null +++ b/packages/core/src/modules.ts @@ -0,0 +1,227 @@ +import { + Bindable, + ContractBinding, + ContractOptions, + InternalBinding, + InternalContractBinding, +} from "./bindings"; +import { ContractExecutor, Executor } from "./executors"; +import { Contract } from "./types"; + +export class IgnitionModule { + constructor(public readonly id: string, private _executors: Executor[]) {} + + public getExecutors(): Executor[] { + return this._executors; + } + + public getSortedExecutors(): Executor[] { + // TODO awful algorithm, can be optimized + const dependencies = new Map>(); + + for (const executor of this._executors) { + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + + for (const executorDependency of executor.binding.getDependencies()) { + executorDependencies.add(executorDependency.id); + } + + dependencies.set(executor.binding.id, executorDependencies); + } + + const added = new Set(); + const sortedExecutors: Executor[] = []; + + while (added.size < this._executors.length) { + for (const executor of this._executors) { + if (added.has(executor.binding.id)) { + continue; + } + + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + if ([...executorDependencies].every((d) => added.has(d))) { + sortedExecutors.push(executor); + added.add(executor.binding.id); + } + } + } + + return sortedExecutors; + } +} + +export class DAG { + private _modules: Map> = new Map(); + private _dependencies: Map> = new Map(); + + public addExecutor(executor: Executor) { + const moduleId = executor.binding.moduleId; + let executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + executorsMap = new Map(); + this._modules.set(moduleId, executorsMap); + } + + if (executorsMap.has(executor.binding.id)) { + throw new Error(`Executor with id ${executor.binding.id} already exists`); + } + + const dependencies = executor.binding.getDependencies(); + for (const dependency of dependencies) { + this._addDependency(moduleId, dependency.moduleId); + } + + executorsMap.set(executor.binding.id, executor); + } + + public getModule(moduleId: string): IgnitionModule | undefined { + const executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + return undefined; + } + + return new IgnitionModule(moduleId, [...executorsMap.values()]); + } + + public getModules(): IgnitionModule[] { + return [...this._modules.entries()].map( + ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) + ); + } + + public getSortedModules(): IgnitionModule[] { + // TODO awful algorithm, can be optimized + const added = new Set(); + const ignitionModules = this.getModules(); + const sortedModules: IgnitionModule[] = []; + + while (added.size < ignitionModules.length) { + for (const ignitionModule of ignitionModules) { + if (added.has(ignitionModule.id)) { + continue; + } + + const dependencies = + this._dependencies.get(ignitionModule.id) ?? new Set(); + if ([...dependencies].every((d) => added.has(d))) { + sortedModules.push(ignitionModule); + added.add(ignitionModule.id); + } + } + } + + return sortedModules; + } + + private _addDependency(moduleId: string, dependencyId: string) { + if (moduleId !== dependencyId) { + const dependencies = + this._dependencies.get(moduleId) ?? new Set(); + dependencies.add(dependencyId); + this._dependencies.set(moduleId, dependencies); + } + } +} + +interface UserContractOptions { + id?: string; + args?: Array>; +} + +export interface ModuleBuilder { + getModuleId: () => string; + addExecutor: (executor: Executor) => void; + + contract: ( + contractName: string, + options?: UserContractOptions + ) => ContractBinding; + + useModule: (userModule: UserModule) => T; +} + +export class ModuleBuilderImpl implements ModuleBuilder { + private _currentModuleId: string | undefined; + private _dag = new DAG(); + private _executors: Executor[] = []; + private _knownModules: Map, any]> = new Map(); + + constructor() {} + + public getModuleId(): string { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + return this._currentModuleId; + } + + public buildDAG(): DAG { + return this._dag; + } + + public addExecutor(executor: Executor) { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + this._dag.addExecutor(executor); + } + + public contract( + contractName: string, + options?: UserContractOptions + ): InternalBinding { + const id = options?.id ?? contractName; + const args = options?.args ?? []; + const b = new InternalContractBinding(this.getModuleId(), id, { + contractName, + args, + }); + + this.addExecutor(new ContractExecutor(b)); + + return b; + } + + public useModule(userModule: UserModule): T { + const knownModuleAndOutput = this._knownModules.get(userModule.id); + if (knownModuleAndOutput !== undefined) { + const [knownModule, knownOutput] = knownModuleAndOutput; + if (userModule === knownModule) { + return knownOutput; + } else { + throw new Error(`Module with id ${userModule.id} already exists`); + } + } + + const previousModuleId = this._currentModuleId; + this._currentModuleId = userModule.id; + const output = userModule.definition(this); + this._currentModuleId = previousModuleId; + + this._knownModules.set(userModule.id, [userModule, output]); + + return output; + } +} + +type ModuleDefinition = (m: ModuleBuilder) => T; + +export class UserModule { + public readonly version = 1; + + constructor( + public readonly id: string, + public readonly definition: ModuleDefinition + ) {} +} + +export function buildModule( + moduleId: string, + moduleDefinition: ModuleDefinition +): UserModule { + return new UserModule(moduleId, moduleDefinition); +} diff --git a/packages/core/src/providers.ts b/packages/core/src/providers.ts new file mode 100644 index 0000000000..e90f630509 --- /dev/null +++ b/packages/core/src/providers.ts @@ -0,0 +1,42 @@ +import type { ethers } from "ethers"; + +import { Artifact } from "./types"; + +export interface Providers { + artifacts: ArtifactsProvider; + ethereumProvider: EIP1193Provider; + gasProvider: GasProvider; + signers: SignersProvider; + transactions: TransactionsProvider; +} + +export interface ArtifactsProvider { + getArtifact: (name: string) => Promise; + hasArtifact: (name: string) => Promise; +} + +export interface EIP1193Provider { + request: (args: { method: string; params?: unknown[] }) => Promise; +} + +export interface GasProvider { + estimateGasLimit: ( + tx: ethers.providers.TransactionRequest + ) => Promise; + estimateGasPrice: () => Promise; +} + +export interface SignersProvider { + getDefaultSigner(): Promise; +} + +export interface TransactionsProvider { + isConfirmed(txHash: string): Promise; + isMined(txHash: string): Promise; +} + +export interface IgnitionSigner { + sendTransaction: ( + tx: ethers.providers.TransactionRequest + ) => Promise; +} diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts new file mode 100644 index 0000000000..e6bd7700fd --- /dev/null +++ b/packages/core/src/services.ts @@ -0,0 +1,247 @@ +import { ethers, Contract, ContractFactory } from "ethers"; + +import { TxSender } from "./tx-sender"; +import { IgnitionSigner, Providers } from "./providers"; +import { Artifact } from "./types"; +import { sleep } from "./utils"; + +interface TransactionOptions { + gasLimit?: ethers.BigNumberish; + gasPrice?: ethers.BigNumberish; +} + +export class ContractsService { + private _ethersProvider: ethers.providers.Web3Provider; + + constructor(private _providers: Providers, private _txSender: TxSender) { + this._ethersProvider = new ethers.providers.Web3Provider( + _providers.ethereumProvider + ); + } + + public async deploy( + artifact: Artifact, + args: any[], + txOptions?: TransactionOptions + ): Promise { + // TODO this assumes the signer is connected + const signer = await this._providers.signers.getDefaultSigner(); + const Factory = new ContractFactory(artifact.abi, artifact.bytecode); + + const deployTransaction = Factory.getDeployTransaction(...args); + + return this._sendTx(signer, deployTransaction, txOptions); + } + + public async call( + address: string, + abi: any[], + method: string, + args: any[], + txOptions?: TransactionOptions + ): Promise { + const signer = await this._providers.signers.getDefaultSigner(); + const contract = new Contract(address, abi); + + const unsignedTx = await contract.populateTransaction[method](...args); + + return this._sendTx(signer, unsignedTx, txOptions); + } + + public async staticCall( + address: string, + abi: any[], + method: string, + args: any[] + ): Promise { + const provider = new ethers.providers.Web3Provider( + this._providers.ethereumProvider + ); + const contract = new Contract(address, abi, provider); + + return contract.callStatic[method](...args); + } + + public async getLog( + txHash: string, + eventName: string, + address: string, + abi: any[] + ): Promise { + const provider = new ethers.providers.Web3Provider( + this._providers.ethereumProvider + ); + const contract = new ethers.Contract(address, abi, provider); + + const receipt = await provider.waitForTransaction(txHash); + + for (const log of receipt.logs) { + const parsedLog = contract.interface.parseLog(log); + if (parsedLog.name === eventName) { + return parsedLog; + } + } + + return undefined; + } + + private async _sendTx( + signer: IgnitionSigner, + tx: ethers.providers.TransactionRequest, + txOptions?: TransactionOptions + ): Promise { + if (txOptions?.gasLimit !== undefined) { + tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); + } else { + const gasLimit = await this._providers.gasProvider.estimateGasLimit(tx); + + tx.gasLimit = gasLimit; + } + + if (txOptions?.gasPrice !== undefined) { + tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); + } else { + const gasPrice = await this._providers.gasProvider.estimateGasPrice(); + + tx.gasPrice = gasPrice; + } + + let blockNumberWhenSent = await this._ethersProvider.getBlockNumber(); + const txIndexAndHash = await this._txSender.send( + signer, + tx, + blockNumberWhenSent + ); + + const txIndex = txIndexAndHash[0]; + let txHash = txIndexAndHash[1]; + + let txSent = tx; + while (true) { + const currentBlockNumber = await this._ethersProvider.getBlockNumber(); + + if (await this._providers.transactions.isConfirmed(txHash)) { + break; + } + + if (blockNumberWhenSent + 5 <= currentBlockNumber) { + const txToSend = await this._bump(txHash, signer, txSent, txHash); + + blockNumberWhenSent = await this._ethersProvider.getBlockNumber(); + txHash = await this._txSender.sendAndReplace( + signer, + txToSend, + blockNumberWhenSent, + txIndex + ); + + txSent = txToSend; + } + + await sleep(5000); + } + + return txHash; + } + + private async _bump( + txHash: string, + signer: IgnitionSigner, + previousTxRequest: ethers.providers.TransactionRequest, + previousTxHash: string + ): Promise { + const previousTx = await this._ethersProvider.getTransaction( + previousTxHash + ); + const newEstimatedGasPrice = + await this._providers.gasProvider.estimateGasPrice(); + + if (previousTx.gasPrice !== undefined) { + // Increase 10%, and add 1 to be sure it's at least rounded up + const newGasPrice = ethers.BigNumber.from(previousTx.gasPrice) + .mul(110_000) + .div(100_000) + .add(1); + + return { + ...previousTxRequest, + nonce: previousTx.nonce, + gasPrice: newEstimatedGasPrice.gt(newGasPrice) + ? newEstimatedGasPrice + : newGasPrice, + }; + } else if ( + previousTx.maxFeePerGas !== undefined && + previousTx.maxPriorityFeePerGas !== undefined + ) { + const newMaxFeePerGas = ethers.BigNumber.from(previousTx.maxFeePerGas) + .mul(110_000) + .div(100_000) + .add(1); + + const newMaxPriorityFeePerGas = ethers.BigNumber.from( + previousTx.maxPriorityFeePerGas + ) + .mul(110_000) + .div(100_000) + .add(1); + + return { + ...previousTxRequest, + nonce: previousTx.nonce, + maxFeePerGas: newMaxFeePerGas, + maxPriorityFeePerGas: newMaxPriorityFeePerGas, + }; + } + + throw new Error( + `Transaction doesn't have gasPrice or maxFeePerGas/maxPriorityFeePerGas` + ); + } +} + +export class ArtifactsService { + constructor(private readonly _providers: Providers) {} + + public getArtifact(name: string): Promise { + return this._providers.artifacts.getArtifact(name); + } + public hasArtifact(name: string): Promise { + return this._providers.artifacts.hasArtifact(name); + } +} + +export class TransactionsService { + constructor(private readonly _providers: Providers) {} + + public async wait( + txHash: string + ): Promise { + const provider = new ethers.providers.Web3Provider( + this._providers.ethereumProvider + ); + + return provider.waitForTransaction(txHash); + } +} + +export class LoggingService { + private _enabled: boolean; + constructor({ enabled }: { enabled: boolean }) { + this._enabled = enabled; + } + + public log(...args: string[]) { + if (this._enabled) { + // eslint-disable-next-line no-console + console.log(...args); + } + } +} + +export interface Services { + contracts: ContractsService; + artifacts: ArtifactsService; + transactions: TransactionsService; + logging: LoggingService; +} diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts new file mode 100644 index 0000000000..0cadbd4972 --- /dev/null +++ b/packages/core/src/tx-sender.ts @@ -0,0 +1,84 @@ +import { ethers } from "ethers"; +import { Journal } from "./journal"; +import { IgnitionSigner } from "./providers"; + +/** + * Sends, replaces and keeps track of transactions. + * + * An instance of this class is created for every executor. + * Each transaction sent from that executor should go through this class. + */ +export class TxSender { + // Index of the last sent tx, or -1 if none was sent yet or + // no journal is available + private _txIndex = -1; + + constructor( + private _moduleId: string, + private _executorId: string, + private _journal: Journal | undefined + ) {} + + /** + * Sends `tx` using `signer`. + * + * Returns the index of the transaction in the journal and its hash. + */ + public async send( + signer: IgnitionSigner, + tx: ethers.providers.TransactionRequest, + blockNumberWhenSent: number + ): Promise<[number, string]> { + if (this._journal === undefined) { + const { hash } = await signer.sendTransaction(tx); + return [-1, hash]; + } + + const journaledTx = await this._journal.getEntry( + this._moduleId, + this._executorId, + this._txIndex + ); + + if (journaledTx !== undefined) { + this._txIndex += 1; + return [this._txIndex, journaledTx.txHash]; + } + + const sentTx = await signer.sendTransaction(tx); + this._txIndex = await this._journal.addEntry( + this._moduleId, + this._executorId, + { txHash: sentTx.hash, blockNumberWhenSent } + ); + + return [this._txIndex, sentTx.hash]; + } + + /** + * Sends `tx` to replace the transaction with index `txIndex`. + * + * Returns the hash of the new transaction. + */ + public async sendAndReplace( + signer: IgnitionSigner, + tx: ethers.providers.TransactionRequest, + blockNumberWhenSent: number, + txIndex: number + ): Promise { + if (this._journal === undefined) { + const { hash } = await signer.sendTransaction(tx); + return hash; + } + + const sentTx = await signer.sendTransaction(tx); + await this._journal.replaceEntry( + this._moduleId, + this._executorId, + txIndex, + { txHash: sentTx.hash, blockNumberWhenSent } + ); + + return sentTx.hash; + } +} diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts new file mode 100644 index 0000000000..7702d997a8 --- /dev/null +++ b/packages/core/src/types.ts @@ -0,0 +1,10 @@ +export interface Artifact { + bytecode: string; + abi: any[]; +} + +export interface Contract { + name: string; + address: string; + abi: any[]; +} diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts new file mode 100644 index 0000000000..f1b30f959d --- /dev/null +++ b/packages/core/src/utils.ts @@ -0,0 +1,2 @@ +export const sleep = (timeout: number) => + new Promise((resolve) => setTimeout(resolve, timeout)); diff --git a/packages/core/test/.eslintrc.js b/packages/core/test/.eslintrc.js new file mode 100644 index 0000000000..757fe8a3ca --- /dev/null +++ b/packages/core/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts new file mode 100644 index 0000000000..4693146b55 --- /dev/null +++ b/packages/core/test/dag.ts @@ -0,0 +1,90 @@ +import { expect } from "chai"; + +import { DAG } from "../src/modules"; +import { inc } from "./helpers"; + +describe("DAG", function () { + describe("sort modules", function () { + it("should work for a single module", function () { + // given + const dag = new DAG(); + dag.addExecutor(inc("MyModule", "inc1", 1)); + + // when + const ignitionModules = dag.getSortedModules().map((m) => m.id); + + // then + expect(ignitionModules).to.deep.equal(["MyModule"]); + }); + + it("should work for two modules", function () { + // given + const dag = new DAG(); + const module1Inc = inc("Module1", "inc1", 1); + const module2Inc = inc("Module2", "inc1", module1Inc.binding); + + dag.addExecutor(module2Inc); + dag.addExecutor(module1Inc); + + // when + const ignitionModules = dag.getSortedModules().map((m) => m.id); + + // then + expect(ignitionModules).to.deep.equal(["Module1", "Module2"]); + }); + }); + + describe("sort executors", function () { + it("should work for a single executor", function () { + // given + const dag = new DAG(); + dag.addExecutor(inc("MyModule", "inc1", 1)); + + // when + const [ignitionModule] = dag.getModules(); + const executors = ignitionModule + .getSortedExecutors() + .map((e) => e.binding.id); + + // then + expect(executors).to.deep.equal(["inc1"]); + }); + + it("should work for two executors", function () { + // given + const dag = new DAG(); + const inc1 = inc("MyModule", "inc1", 1); + dag.addExecutor(inc("MyModule", "incInc1", inc1.binding)); + dag.addExecutor(inc1); + + // when + const [ignitionModule] = dag.getModules(); + const executors = ignitionModule + .getSortedExecutors() + .map((e) => e.binding.id); + + // then + expect(executors).to.deep.equal(["inc1", "incInc1"]); + }); + + it("should work for three sequential executors", function () { + // given + const dag = new DAG(); + const inc1 = inc("MyModule", "inc1", 1); + const incInc1 = inc("MyModule", "incInc1", inc1.binding); + const incIncInc1 = inc("MyModule", "incIncInc1", incInc1.binding); + dag.addExecutor(incIncInc1); + dag.addExecutor(inc1); + dag.addExecutor(incInc1); + + // when + const [ignitionModule] = dag.getModules(); + const executors = ignitionModule + .getSortedExecutors() + .map((e) => e.binding.id); + + // then + expect(executors).to.deep.equal(["inc1", "incInc1", "incIncInc1"]); + }); + }); +}); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts new file mode 100644 index 0000000000..f50c2bc061 --- /dev/null +++ b/packages/core/test/execution-engine.ts @@ -0,0 +1,139 @@ +import { expect } from "chai"; + +import { ExecutionEngine } from "../src/execution-engine"; +import { NullJournal } from "../src/journal"; +import { DAG } from "../src/modules"; +import { emptyDeploymentResult, getMockedProviders, inc } from "./helpers"; + +const executionEngineOptions = { + parallelizationLevel: 1, + loggingEnabled: false, +}; + +describe("ExecutionEngine", function () { + it("should run a single module with a single executor", async function () { + // given + const executionEngine = new ExecutionEngine( + getMockedProviders(), + new NullJournal(), + emptyDeploymentResult(), + executionEngineOptions + ); + + const inc1 = inc("MyModule", "inc1", 1); + + const dag = new DAG(); + dag.addExecutor(inc1); + + // when + const deploymentResult = await executionEngine.execute(dag); + + // then + const resultModules = deploymentResult.getModules(); + + expect(resultModules).to.have.length(1); + const [resultModule] = resultModules; + expect(resultModule.isSuccess()).to.equal(true); + expect(resultModule.count()).to.equal(1); + + const bindingResult = resultModule.getResult("inc1"); + + expect(bindingResult).to.equal(2); + + expect(inc1.isSuccess()).to.equal(true); + }); + + it("should wait for a dependency", async function () { + // given + const executionEngine = new ExecutionEngine( + getMockedProviders(), + new NullJournal(), + emptyDeploymentResult(), + executionEngineOptions + ); + + const dag = new DAG(); + const inc1 = inc("MyModule", "inc1", 1); + const incInc1 = inc("MyModule", "incInc1", inc1.binding); + dag.addExecutor(inc1); + dag.addExecutor(incInc1); + + // when + const deploymentResult = await executionEngine.execute(dag); + + // then + const resultModules = deploymentResult.getModules(); + + expect(resultModules).to.have.length(1); + expect(resultModules[0].isSuccess()).to.equal(true); + expect(resultModules[0].count()).to.equal(2); + + const inc1Result = resultModules[0].getResult("inc1"); + const incInc1Result = resultModules[0].getResult("incInc1"); + + expect(inc1Result).to.equal(2); + expect(incInc1Result).to.equal(3); + + expect(inc1.isSuccess()).to.equal(true); + expect(incInc1.isSuccess()).to.equal(true); + }); + + it("should not run an executor if a dependency fails", async function () { + // given + const executionEngine = new ExecutionEngine( + getMockedProviders(), + new NullJournal(), + emptyDeploymentResult(), + executionEngineOptions + ); + + const dag = new DAG(); + const inc1 = inc("MyModule", "inc1", 1); + inc1.behavior = "fail"; + const incInc1 = inc("MyModule", "incInc1", inc1.binding); + dag.addExecutor(inc1); + dag.addExecutor(incInc1); + + // when + const deploymentResult = await executionEngine.execute(dag); + + // then + const resultModules = deploymentResult.getModules(); + + expect(resultModules).to.have.length(1); + expect(resultModules[0].isSuccess()).to.equal(false); + expect(resultModules[0].isFailure()).to.equal(true); + + expect(inc1.isFailure()).to.equal(true); + expect(incInc1.isReady()).to.equal(true); + }); + + it("should not run an executor if a dependency holds", async function () { + // given + const executionEngine = new ExecutionEngine( + getMockedProviders(), + new NullJournal(), + emptyDeploymentResult(), + executionEngineOptions + ); + + const dag = new DAG(); + const inc1 = inc("MyModule", "inc1", 1); + inc1.behavior = "hold"; + const incInc1 = inc("MyModule", "incInc1", inc1.binding); + dag.addExecutor(inc1); + dag.addExecutor(incInc1); + + // when + const deploymentResult = await executionEngine.execute(dag); + + // then + const resultModules = deploymentResult.getModules(); + + expect(resultModules).to.have.length(1); + expect(resultModules[0].isHold()).to.equal(true); + + expect(inc1.isHold()).to.equal(true); + expect(incInc1.isReady()).to.equal(true); + }); +}); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts new file mode 100644 index 0000000000..d7aca0a7be --- /dev/null +++ b/packages/core/test/helpers.ts @@ -0,0 +1,123 @@ +import { Bindable, InternalBinding } from "../src/bindings"; +import { DeploymentResult } from "../src/execution-engine"; +import { Executor, Hold } from "../src/executors"; +import { + ArtifactsProvider, + EIP1193Provider, + GasProvider, + IgnitionSigner, + Providers, + SignersProvider, + TransactionsProvider, +} from "../src/providers"; + +export function getMockedProviders(): Providers { + return { + artifacts: new MockArtifactsProvider(), + ethereumProvider: new MockEthereumProvider(), + gasProvider: new MockGasProvider(), + signers: new MockSignersProvider(), + transactions: new TransactionsMockProvider(), + }; +} + +export function emptyDeploymentResult() { + return new DeploymentResult(); +} + +/** + * Test executor that receives a number (or a binding that produces a number) + * and increments it. + */ +export function inc( + moduleId: string, + bindingId: string, + x: Bindable +): IncreaseNumberExecutor { + return new IncreaseNumberExecutor( + new IncreaseNumberBinding(moduleId, bindingId, x) + ); +} + +class MockEthereumProvider implements EIP1193Provider { + public async request(): Promise { + throw new Error("not implemented"); + } +} + +class MockGasProvider implements GasProvider { + public async estimateGasLimit(): Promise { + throw new Error("not implemented"); + } + + public async estimateGasPrice(): Promise { + throw new Error("not implemented"); + } +} + +class MockSigner implements IgnitionSigner { + public async sendTransaction(): Promise { + throw new Error("not implemented"); + } +} + +class MockSignersProvider implements SignersProvider { + public async getDefaultSigner(): Promise { + return new MockSigner(); + } +} + +class TransactionsMockProvider implements TransactionsProvider { + public async isConfirmed(): Promise { + throw new Error("not implemented"); + } + public async isMined(): Promise { + throw new Error("not implemented"); + } +} + +class MockArtifactsProvider implements ArtifactsProvider { + public async getArtifact(_name: string): Promise { + throw new Error("not implemented"); + } + public async hasArtifact(_name: string): Promise { + throw new Error("not implemented"); + } +} + +class IncreaseNumberBinding extends InternalBinding, number> { + public getDependencies(): InternalBinding[] { + return InternalBinding.isBinding(this.input) ? [this.input] : []; + } +} + +class IncreaseNumberExecutor extends Executor, number> { + public behavior: "default" | "fail" | "hold" = "default"; + + public async execute(input: number): Promise { + if (this.behavior === "default") { + return input + 1; + } else if (this.behavior === "fail") { + throw new Error("Fail"); + } else if (this.behavior === "hold") { + throw new Hold("Hold"); + } + + const exhaustiveCheck: never = this.behavior; + return exhaustiveCheck; + } + + public async validate(): Promise { + return []; + } + + public getDescription() { + const input = this.binding.input; + + if (typeof input === "number") { + return `Increase ${input}`; + } else { + return `Increase result of ${(input as any).id}`; + } + } +} diff --git a/packages/core/test/test.ts b/packages/core/test/test.ts deleted file mode 100644 index 09d4352e8b..0000000000 --- a/packages/core/test/test.ts +++ /dev/null @@ -1 +0,0 @@ -// test diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 59682a9155..32746e37d0 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -11,6 +11,9 @@ "prettier": "prettier \"**/*.{js,md,json}\"" }, "devDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", "@typescript-eslint/eslint-plugin": "4.31.2", @@ -26,7 +29,13 @@ "typescript": "^4.4.3" }, "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.0.0", "ignition": "^0.0.2" + }, + "dependencies": { + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0" } } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index b4d81dd7a4..31d2bb75ad 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,13 +1,236 @@ -import { Ignition } from "ignition"; +import { ethers } from "ethers"; +import fs from "fs"; +import fsExtra from "fs-extra"; +import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; +import { + Binding, + BindingOutput, + DeploymentPlan, + DeploymentResult, + deserializeBindingOutput, + Ignition, + ModuleResult, + serializeBindingOutput, + UserModule, +} from "ignition"; +import path from "path"; + +type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; +type HardhatPaths = HardhatConfig["paths"]; export class IgnitionWrapper { private _ignition: Ignition; - constructor() { - this._ignition = new Ignition(); + constructor( + services: any, + private _ethers: HardhatEthers, + private _isHardhatNetwork: boolean, + private _paths: HardhatPaths + ) { + this._ignition = new Ignition(services, !this._isHardhatNetwork); + } + + public async deploy( + userModuleOrName: UserModule | string + ): Promise> { + const [resolvedOutput] = await this.deployMany([userModuleOrName]); + return resolvedOutput; + } + + public async deployMany( + userModulesOrNames: Array | string> + ): Promise>> { + const pathToJournal = path.resolve( + this._paths.root, + "ignition-journal.json" + ); + + const { chainId } = await this._ethers.provider.getNetwork(); + + const currentDeploymentResult = await this._getDeploymentResult(chainId); + + const userModules: Array> = []; + for (const userModuleOrName of userModulesOrNames) { + const userModule: UserModule = + typeof userModuleOrName === "string" + ? await this._getModule(userModuleOrName) + : userModuleOrName; + + userModules.push(userModule); + } + + const [deploymentResult, moduleOutputs] = await this._ignition.deploy( + userModules, + this._isHardhatNetwork ? undefined : pathToJournal, + currentDeploymentResult ?? new DeploymentResult() + ); + + const moduleHold = deploymentResult.isHold(); + if (moduleHold !== undefined) { + const [moduleId, holdReason] = moduleHold; + throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); + } + + await this._saveDeploymentResult(chainId, deploymentResult); + + const resolvedOutputs: any = []; + for (const moduleOutput of moduleOutputs) { + const resolvedOutput: any = {}; + for (const [key, value] of Object.entries(moduleOutput as any)) { + const bindingResult = deploymentResult.getBindingResult( + value.moduleId, + value.id + )!; + + if (typeof bindingResult === "string") { + resolvedOutput[key] = bindingResult; + } else { + const { abi, address } = bindingResult; + resolvedOutput[key] = await this._ethers.getContractAt(abi, address); + } + } + resolvedOutputs.push(resolvedOutput); + } + + return resolvedOutputs; } - public deploy() { - console.log("deploy"); + public async buildPlan( + userModulesOrNames: Array | string> + ): Promise { + const { chainId } = await this._ethers.provider.getNetwork(); + + const currentDeploymentResult = await this._getDeploymentResult(chainId); + + const userModules: Array> = []; + for (const userModuleOrName of userModulesOrNames) { + const userModule: UserModule = + typeof userModuleOrName === "string" + ? await this._getModule(userModuleOrName) + : userModuleOrName; + + userModules.push(userModule); + } + + const plan = await this._ignition.buildPlan( + userModules, + currentDeploymentResult ?? new DeploymentResult() + ); + + return plan; + } + + private async _getModule(moduleId: string): Promise> { + const ignitionFiles = fsExtra + .readdirSync(this._paths.ignition) + .filter((x) => !x.startsWith(".")); + + for (const ignitionFile of ignitionFiles) { + const pathToFile = path.resolve(this._paths.ignition, ignitionFile); + + const fileExists = await fsExtra.pathExists(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + const userModule = require(pathToFile); + const userModuleContent = userModule.default ?? userModule; + + if (userModuleContent.id === moduleId) { + return userModuleContent; + } + } + + throw new Error(`No module with id ${moduleId}`); + } + + private async _saveDeploymentResult( + chainId: number, + deploymentResult: DeploymentResult + ) { + if (this._isHardhatNetwork) { + return; + } + + const deploymentsDirectory = path.join( + this._paths.deployments, + String(chainId) + ); + fsExtra.ensureDirSync(deploymentsDirectory); + + const modulesResults = deploymentResult.getModules(); + + for (const moduleResult of modulesResults) { + const ignitionModulePath = path.join( + deploymentsDirectory, + `${moduleResult.moduleId}.json` + ); + + const serializedModule = JSON.stringify( + moduleResult + .getResults() + .reduce((acc: any, [key, value]: [string, BindingOutput]) => { + acc[key] = serializeBindingOutput(value); + return acc; + }, {}), + undefined, + 2 + ); + fs.writeFileSync(ignitionModulePath, serializedModule); + } + } + + private async _getDeploymentResult( + chainId: number + ): Promise { + if (this._isHardhatNetwork) { + return; + } + + const deploymentsDirectory = path.join( + this._paths.deployments, + String(chainId) + ); + + if (!fsExtra.existsSync(deploymentsDirectory)) { + return; + } + + const moduleResultFiles = fs.readdirSync(deploymentsDirectory); + + const deploymentResult = new DeploymentResult(); + for (const moduleResultFile of moduleResultFiles) { + const moduleId = path.parse(moduleResultFile).name; + const serializedModuleResult = JSON.parse( + fs + .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) + .toString() + ); + const moduleResult = new ModuleResult(moduleId); + + for (const [bindingId, result] of Object.entries( + serializedModuleResult + )) { + moduleResult.addResult(bindingId, deserializeBindingOutput(result)); + } + + deploymentResult.addResult(moduleId, moduleResult); + } + + return deploymentResult; } } + +type Resolved = T extends string + ? T + : T extends Binding + ? O extends string + ? string + : ethers.Contract + : { + [K in keyof T]: T[K] extends Binding + ? O extends string + ? string + : ethers.Contract + : T[K]; + }; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d1f1c8f5eb..a59bba179d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,14 +1,21 @@ +import "@nomiclabs/hardhat-ethers"; +import debug from "debug"; +import fsExtra from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; +import { Providers, UserModule } from "ignition"; import path from "path"; import { IgnitionWrapper } from "./ignition-wrapper"; import "./type-extensions"; +const log = debug("hardhat-ignition:main"); + extendConfig( (config: HardhatConfig, userConfig: Readonly) => { const userIgnitionPath = userConfig.paths?.ignition; + const userDeploymentsPath = userConfig.paths?.deployments; let ignitionPath: string; if (userIgnitionPath === undefined) { @@ -23,14 +30,168 @@ extendConfig( } } + let deploymentsPath: string; + if (userDeploymentsPath === undefined) { + deploymentsPath = path.join(config.paths.root, "deployments"); + } else { + if (path.isAbsolute(userDeploymentsPath)) { + deploymentsPath = userDeploymentsPath; + } else { + deploymentsPath = path.normalize( + path.join(config.paths.root, userDeploymentsPath) + ); + } + } + config.paths.ignition = ignitionPath; + config.paths.deployments = deploymentsPath; } ); extendEnvironment((hre) => { - hre.ignition = lazyObject(() => new IgnitionWrapper()); -}); + const services: Providers = { + artifacts: { + getArtifact: (name: string) => hre.artifacts.readArtifact(name), + hasArtifact: (name: string) => hre.artifacts.artifactExists(name), + }, + gasProvider: { + estimateGasLimit: async (tx) => { + const gasLimit = await hre.ethers.provider.estimateGas(tx); + + // return 1.5x estimated gas + return gasLimit.mul(15).div(10); + }, + estimateGasPrice: async () => { + return hre.ethers.provider.getGasPrice(); + }, + }, + ethereumProvider: hre.network.provider, + signers: { + getDefaultSigner: async () => { + const [signer] = await hre.ethers.getSigners(); + return signer; + }, + }, + transactions: { + isConfirmed: async (txHash) => { + const blockNumber = await hre.ethers.provider.getBlockNumber(); + const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); + if (receipt === null) { + return false; + } + + return receipt.blockNumber <= blockNumber; + }, + isMined: async (txHash) => { + const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); + return receipt !== null; + }, + }, + }; -task("deploy", async (_, hre) => { - console.log(hre.config.paths.ignition); + hre.ignition = lazyObject(() => { + return new IgnitionWrapper( + services, + hre.ethers, + hre.network.name === "hardhat", + hre.config.paths + ); + }); }); + +task("deploy") + .addOptionalVariadicPositionalParam("modulesFiles") + .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { + await hre.run("compile", { quiet: true }); + + let ignitionFiles: string[]; + if (modulesFiles !== undefined) { + ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); + } else { + ignitionFiles = fsExtra + .readdirSync(hre.config.paths.ignition) + .filter((x) => !x.startsWith(".")); + } + + const userModules: any[] = []; + for (const ignitionFile of ignitionFiles) { + const pathToFile = path.resolve(hre.config.paths.ignition, ignitionFile); + + const fileExists = await fsExtra.pathExists(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + const userModule = require(pathToFile); + userModules.push(userModule.default ?? userModule); + } + + await hre.ignition.deployMany(userModules); + }); + +task("plan") + .addOptionalVariadicPositionalParam("modulesFiles") + .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { + await hre.run("compile", { quiet: true }); + + const userModules = await loadUserModules( + hre.config.paths.ignition, + modulesFiles ?? [] + ); + + const plan = await hre.ignition.buildPlan(userModules); + + let first = true; + for (const [moduleId, modulePlan] of Object.entries(plan)) { + if (first) { + first = false; + } else { + console.log(); + } + console.log(`- Module ${moduleId}`); + if (modulePlan === "already-deployed") { + console.log(" Already deployed"); + } else { + for (const step of modulePlan) { + console.log(` ${step.id}: ${step.description}`); + } + } + } + }); + +async function loadUserModules( + ignitionDirectory: string, + modulesFiles: string[] +): Promise>> { + log(`Loading user modules from '${ignitionDirectory}'`); + + let ignitionFiles: string[]; + if (modulesFiles.length === 0) { + log("No files passed, reading all module files"); + + // load all modules in ignition's directory + ignitionFiles = fsExtra + .readdirSync(ignitionDirectory) + .filter((x) => !x.startsWith(".")); + } else { + log(`Reading '${modulesFiles.length}' selected module files`); + ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); + } + + log(`Loading '${ignitionFiles.length}' module files`); + const userModules: any[] = []; + for (const ignitionFile of ignitionFiles) { + const pathToFile = path.resolve(ignitionDirectory, ignitionFile); + + const fileExists = await fsExtra.pathExists(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + log(`Loading module file '${pathToFile}'`); + const userModule = require(pathToFile); + userModules.push(userModule.default ?? userModule); + } + + return userModules; +} diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 1c85abc117..403c7dc9e3 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -6,10 +6,12 @@ import type { IgnitionWrapper } from "./ignition-wrapper"; declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { ignition?: string; + deployments?: string; } export interface ProjectPathsConfig { ignition: string; + deployments: string; } } diff --git a/yarn.lock b/yarn.lock index 8216814313..aedcc0bbc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23,6 +23,18 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@cspotcode/source-map-consumer@0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" + integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== + +"@cspotcode/source-map-support@0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" + integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== + dependencies: + "@cspotcode/source-map-consumer" "0.8.0" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -38,77 +50,78 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/block@^3.4.0": - version "3.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.4.0.tgz#4747b0c06220ee10cbdfe1cbde8cbb0677b1b074" - integrity sha512-umKAoTX32yXzErpIksPHodFc/5y8bmZMnOl6hWy5Vd8xId4+HKFUOyEiN16Y97zMwFRysRpcrR6wBejfqc6Bmg== +"@ethereumjs/block@^3.4.0", "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.5.1": + version "3.5.1" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.5.1.tgz#59737d393503249aa750c37dfc83896234f4e175" + integrity sha512-MoY9bHKABOBK6BW0v1N1Oc0Cve4x/giX67M3TtrVBUsKQTj2eznLGKpydoitxWSZ+WgKKSVhfRMzbCGRwk7T5w== dependencies: - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - ethereumjs-util "^7.1.0" - merkle-patricia-tree "^4.2.0" + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.1" + ethereumjs-util "^7.1.1" + merkle-patricia-tree "^4.2.1" -"@ethereumjs/blockchain@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.0.tgz#28d712627d3442b2bb1f50dd5acba7cde1021993" - integrity sha512-wAuKLaew6PL52kH8YPXO7PbjjKV12jivRSyHQehkESw4slSLLfYA6Jv7n5YxyT2ajD7KNMPVh7oyF/MU6HcOvg== +"@ethereumjs/blockchain@^5.4.0", "@ethereumjs/blockchain@^5.4.1": + version "5.4.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.2.tgz#5074e0a0157818762a5f5175ea0bd93c5455fe32" + integrity sha512-AOAAwz/lw2lciG9gf5wHi7M/qknraXXnLR66lYgbQ04qfyFC3ZE5x/5rLVm1Vu+kfJLlKrYZTmA0IbOkc7kvgw== dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/ethash" "^1.0.0" + "@ethereumjs/block" "^3.5.1" + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/ethash" "^1.1.0" debug "^2.2.0" - ethereumjs-util "^7.1.0" + ethereumjs-util "^7.1.1" level-mem "^5.0.1" lru-cache "^5.1.1" rlp "^2.2.4" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.4.0.tgz#2d67f6e6ba22246c5c89104e6b9a119fb3039766" - integrity sha512-UdkhFWzWcJCZVsj1O/H8/oqj/0RVYjLc1OhPjBrQdALAkQHpCp8xXI4WLnuGTADqTdJZww0NtgwG+TRPkXt27w== +"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.0" + ethereumjs-util "^7.1.1" -"@ethereumjs/ethash@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.0.0.tgz#4e77f85b37be1ade5393e8719bdabac3e796ddaa" - integrity sha512-iIqnGG6NMKesyOxv2YctB2guOVX18qMAWlj3QlZyrc+GqfzLqoihti+cVNQnyNxr7eYuPdqwLQOFuPe6g/uKjw== +"@ethereumjs/ethash@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" + integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== dependencies: + "@ethereumjs/block" "^3.5.0" "@types/levelup" "^4.3.0" buffer-xor "^2.0.1" - ethereumjs-util "^7.0.7" + ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@^3.3.0": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.0.tgz#14ed1b7fa0f28e1cd61e3ecbdab824205f6a4378" - integrity sha512-yTwEj2lVzSMgE6Hjw9Oa1DZks/nKTWM8Wn4ykDNapBPua2f4nXO3qKnni86O6lgDj5fVNRqbDsD0yy7/XNGDEA== +"@ethereumjs/tx@^3.3.0", "@ethereumjs/tx@^3.3.1": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== dependencies: - "@ethereumjs/common" "^2.4.0" - ethereumjs-util "^7.1.0" + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" "@ethereumjs/vm@^5.5.2": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.2.tgz#918a2c1000aaa9fdbe6007a4fdc2c62833122adf" - integrity sha512-AydZ4wfvZAsBuFzs3xVSA2iU0hxhL8anXco3UW3oh9maVC34kTEytOfjHf06LTEfN0MF9LDQ4ciLa7If6ZN/sg== - dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/blockchain" "^5.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.3.tgz#dc8b30dd35efb589db093592600207660fa8dada" + integrity sha512-0k5OreWnlgXYs54wohgO11jtGI05GDasj2EYxzuaStxTi15CS3vow5wGYELC1pG9xngE1F/mFmKi/f14XRuDow== + dependencies: + "@ethereumjs/block" "^3.5.0" + "@ethereumjs/blockchain" "^5.4.1" + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.1" async-eventemitter "^0.2.4" core-js-pure "^3.0.1" debug "^2.2.0" - ethereumjs-util "^7.1.0" + ethereumjs-util "^7.1.1" functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.0" + merkle-patricia-tree "^4.2.1" rustbn.js "~0.2.0" util.promisify "^1.0.1" -"@ethersproject/abi@^5.1.2": +"@ethersproject/abi@5.4.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== @@ -123,7 +136,7 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" -"@ethersproject/abstract-provider@^5.4.0": +"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== @@ -136,7 +149,7 @@ "@ethersproject/transactions" "^5.4.0" "@ethersproject/web" "^5.4.0" -"@ethersproject/abstract-signer@^5.4.0": +"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== @@ -147,7 +160,7 @@ "@ethersproject/logger" "^5.4.0" "@ethersproject/properties" "^5.4.0" -"@ethersproject/address@^5.4.0": +"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== @@ -158,14 +171,22 @@ "@ethersproject/logger" "^5.4.0" "@ethersproject/rlp" "^5.4.0" -"@ethersproject/base64@^5.4.0": +"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== dependencies: "@ethersproject/bytes" "^5.4.0" -"@ethersproject/bignumber@^5.4.0": +"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" + integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + +"@ethersproject/bignumber@5.4.2", "@ethersproject/bignumber@^5.4.0": version "5.4.2" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== @@ -174,21 +195,37 @@ "@ethersproject/logger" "^5.4.0" bn.js "^4.11.9" -"@ethersproject/bytes@^5.4.0": +"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== dependencies: "@ethersproject/logger" "^5.4.0" -"@ethersproject/constants@^5.4.0": +"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== dependencies: "@ethersproject/bignumber" "^5.4.0" -"@ethersproject/hash@^5.4.0": +"@ethersproject/contracts@5.4.1": + version "5.4.1" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" + integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== + dependencies: + "@ethersproject/abi" "^5.4.0" + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + +"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== @@ -202,7 +239,44 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" -"@ethersproject/keccak256@^5.4.0": +"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" + integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" + integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== + dependencies: + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/pbkdf2" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== @@ -210,26 +284,67 @@ "@ethersproject/bytes" "^5.4.0" js-sha3 "0.5.7" -"@ethersproject/logger@^5.4.0": +"@ethersproject/logger@5.4.1", "@ethersproject/logger@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== -"@ethersproject/networks@^5.4.0": +"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": version "5.4.2" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== dependencies: "@ethersproject/logger" "^5.4.0" -"@ethersproject/properties@^5.4.0": +"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" + integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + +"@ethersproject/properties@5.4.1", "@ethersproject/properties@^5.4.0": version "5.4.1" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== dependencies: "@ethersproject/logger" "^5.4.0" -"@ethersproject/rlp@^5.4.0": +"@ethersproject/providers@5.4.5": + version "5.4.5" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.5.tgz#eb2ea2a743a8115f79604a8157233a3a2c832928" + integrity sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/basex" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/networks" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/rlp" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/web" "^5.4.0" + bech32 "1.1.4" + ws "7.4.6" + +"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" + integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== @@ -237,7 +352,16 @@ "@ethersproject/bytes" "^5.4.0" "@ethersproject/logger" "^5.4.0" -"@ethersproject/signing-key@^5.4.0": +"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" + integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + hash.js "1.1.7" + +"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== @@ -249,7 +373,18 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/strings@^5.4.0": +"@ethersproject/solidity@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" + integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/sha2" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + +"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== @@ -258,7 +393,7 @@ "@ethersproject/constants" "^5.4.0" "@ethersproject/logger" "^5.4.0" -"@ethersproject/transactions@^5.4.0": +"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== @@ -273,7 +408,37 @@ "@ethersproject/rlp" "^5.4.0" "@ethersproject/signing-key" "^5.4.0" -"@ethersproject/web@^5.4.0": +"@ethersproject/units@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" + integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== + dependencies: + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/constants" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + +"@ethersproject/wallet@5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" + integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== + dependencies: + "@ethersproject/abstract-provider" "^5.4.0" + "@ethersproject/abstract-signer" "^5.4.0" + "@ethersproject/address" "^5.4.0" + "@ethersproject/bignumber" "^5.4.0" + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/hdnode" "^5.4.0" + "@ethersproject/json-wallets" "^5.4.0" + "@ethersproject/keccak256" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/random" "^5.4.0" + "@ethersproject/signing-key" "^5.4.0" + "@ethersproject/transactions" "^5.4.0" + "@ethersproject/wordlists" "^5.4.0" + +"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": version "5.4.0" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== @@ -284,6 +449,17 @@ "@ethersproject/properties" "^5.4.0" "@ethersproject/strings" "^5.4.0" +"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": + version "5.4.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" + integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== + dependencies: + "@ethersproject/bytes" "^5.4.0" + "@ethersproject/hash" "^5.4.0" + "@ethersproject/logger" "^5.4.0" + "@ethersproject/properties" "^5.4.0" + "@ethersproject/strings" "^5.4.0" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -328,6 +504,16 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomiclabs/hardhat-ethers@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" + integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== + +"@openzeppelin/contracts@^4.3.2": + version "4.3.2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.2.tgz#ff80affd6d352dbe1bbc5b4e1833c41afd6283b6" + integrity sha512-AybF1cesONZStg5kWf6ao9OlqTZuPqddvprc0ky7lrUVOjXeKpmQ2Y9FK+6ygxasb+4aic4O5pneFBfwVsRRRg== + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -401,6 +587,26 @@ resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== +"@tsconfig/node10@^1.0.7": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" + integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + +"@tsconfig/node12@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" + integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + +"@tsconfig/node14@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" + integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + +"@tsconfig/node16@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" + integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + "@types/abstract-leveldown@*": version "5.0.2" resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" @@ -420,6 +626,25 @@ dependencies: "@types/node" "*" +"@types/chai@^4.2.22": + version "4.2.22" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" + integrity sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ== + +"@types/debug@^4.1.7": + version "4.1.7" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" + integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + dependencies: + "@types/ms" "*" + +"@types/fs-extra@^9.0.13": + version "9.0.13" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" + integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" @@ -474,10 +699,15 @@ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== -"@types/node@*": - version "16.9.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.9.4.tgz#a12f0ee7847cf17a97f6fdf1093cb7a9af23cca4" - integrity sha512-KDazLNYAGIuJugdbULwFZULF9qQ13yNWEBFnfVpqlpgAAo6H/qnM9RjBgh0A0kmHf3XxAKLdN5mTIng9iUvVLA== +"@types/ms@*": + version "0.7.31" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" + integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + +"@types/node@*", "@types/node@^16.11.1": + version "16.11.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.1.tgz#2e50a649a50fc403433a14f829eface1a3443e97" + integrity sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA== "@types/node@12.20.25": version "12.20.25" @@ -618,16 +848,31 @@ acorn-jsx@^5.3.1: resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== +acorn@^8.4.1: + version "8.5.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" + integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== +aes-js@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" + integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" @@ -682,7 +927,7 @@ ansi-regex@^4.1.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== -ansi-regex@^5.0.0: +ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== @@ -709,6 +954,11 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -722,15 +972,15 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-includes@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.3.tgz#c7f619b382ad2afaf5326cddfdc0afc61af7690a" - integrity sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A== + version "3.1.4" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" + integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" get-intrinsic "^1.1.1" - is-string "^1.0.5" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" @@ -738,13 +988,18 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" + integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.19.0" + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== astral-regex@^2.0.0: version "2.0.0" @@ -782,6 +1037,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +bech32@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" + integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -797,12 +1057,12 @@ bluebird@^3.5.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2: +bn.js@^5.1.2, bn.js@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== @@ -913,6 +1173,18 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +chai@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" + integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^3.0.1" + get-func-name "^2.0.0" + pathval "^1.1.1" + type-detect "^4.0.5" + chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -930,6 +1202,11 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= + chokidar@3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -1036,9 +1313,9 @@ cookie@^0.4.1: integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== core-js-pure@^3.0.1: - version "3.18.0" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.0.tgz#e5187347bae66448c9e2d67c01c34c4df3261dc5" - integrity sha512-ZnK+9vyuMhKulIGqT/7RHGRok8RtkHMEX/BGPHkHx+ouDkq+MUvf9mfIgdqhpmPDu8+V5UtRn/CbCRc9I4lX4w== + version "3.18.3" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.3.tgz#7eed77dcce1445ab68fd68715856633e2fb3b90c" + integrity sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw== crc-32@^1.2.0: version "1.2.0" @@ -1071,6 +1348,11 @@ create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1098,20 +1380,13 @@ debug@3.2.6: dependencies: ms "^2.1.1" -debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1: +debug@4, debug@4.3.2, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== dependencies: ms "2.1.2" -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1136,6 +1411,13 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +deep-eql@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== + dependencies: + type-detect "^4.0.0" + deep-is@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" @@ -1171,6 +1453,11 @@ diff@5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1258,10 +1545,10 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: - version "1.18.6" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.6.tgz#2c44e3ea7a6255039164d26559777a6d978cb456" - integrity sha512-kAeIT4cku5eNLNuUKhlmtuk1/TRZvQoYccn6TO0cSVdf1kzB0T7+dYuVK9MWM7l+/53W2Q8M7N2c6MQvhXFcUQ== +es-abstract@^1.19.0, es-abstract@^1.19.1: + version "1.19.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" + integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -1274,7 +1561,9 @@ es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2: is-callable "^1.2.4" is-negative-zero "^2.0.1" is-regex "^1.1.4" + is-shared-array-buffer "^1.0.1" is-string "^1.0.7" + is-weakref "^1.0.1" object-inspect "^1.11.0" object-keys "^1.1.1" object.assign "^4.1.2" @@ -1320,11 +1609,12 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-module-utils@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz#94e5540dd15fe1522e8ffa3ec8db3b7fa7e7a534" - integrity sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q== + version "2.7.1" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" + integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== dependencies: debug "^3.2.7" + find-up "^2.1.0" pkg-dir "^2.0.0" eslint-plugin-import@2.24.2: @@ -1541,18 +1831,53 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.7, ethereumjs-util@^7.1.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.0.tgz#e2b43a30bfcdbcb432a4eb42bd5f2393209b3fd5" - integrity sha512-kR+vhu++mUDARrsMMhsjjzPduRVAeundLGXucGRHF3B4oEltOUspfgCVco4kckucj3FMlLaZHUl9n7/kdmr6Tw== +ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" + integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" create-hash "^1.1.2" ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" rlp "^2.2.4" +ethers@^5.4.7: + version "5.4.7" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.7.tgz#0fd491a5da7c9793de2d6058d76b41b1e7efba8f" + integrity sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew== + dependencies: + "@ethersproject/abi" "5.4.1" + "@ethersproject/abstract-provider" "5.4.1" + "@ethersproject/abstract-signer" "5.4.1" + "@ethersproject/address" "5.4.0" + "@ethersproject/base64" "5.4.0" + "@ethersproject/basex" "5.4.0" + "@ethersproject/bignumber" "5.4.2" + "@ethersproject/bytes" "5.4.0" + "@ethersproject/constants" "5.4.0" + "@ethersproject/contracts" "5.4.1" + "@ethersproject/hash" "5.4.0" + "@ethersproject/hdnode" "5.4.0" + "@ethersproject/json-wallets" "5.4.0" + "@ethersproject/keccak256" "5.4.0" + "@ethersproject/logger" "5.4.1" + "@ethersproject/networks" "5.4.2" + "@ethersproject/pbkdf2" "5.4.0" + "@ethersproject/properties" "5.4.1" + "@ethersproject/providers" "5.4.5" + "@ethersproject/random" "5.4.0" + "@ethersproject/rlp" "5.4.0" + "@ethersproject/sha2" "5.4.0" + "@ethersproject/signing-key" "5.4.0" + "@ethersproject/solidity" "5.4.0" + "@ethersproject/strings" "5.4.0" + "@ethersproject/transactions" "5.4.0" + "@ethersproject/units" "5.4.0" + "@ethersproject/wallet" "5.4.0" + "@ethersproject/web" "5.4.0" + "@ethersproject/wordlists" "5.4.0" + ethjs-util@0.1.6, ethjs-util@^0.1.3: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" @@ -1724,6 +2049,15 @@ fs-extra@^0.30.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" +fs-extra@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" + integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -1763,6 +2097,11 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" @@ -1806,7 +2145,7 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.7, glob@^7.1.2, glob@^7.1.3: +glob@7.1.7: version "7.1.7" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== @@ -1818,6 +2157,18 @@ glob@7.1.7, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.2, glob@^7.1.3: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^13.6.0, globals@^13.9.0: version "13.11.0" resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" @@ -1837,7 +2188,7 @@ globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: version "4.2.8" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== @@ -1847,10 +2198,10 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -hardhat@^2.0.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.6.4.tgz#9ff3f139f697bfc4e14836a3fef3ca4c62357d65" - integrity sha512-6QNfu1FptjtyGJ+jBR7LMX7AMY9gWWw9kAUD7v0YZNZH1ZBgsZdMHqXKiSzO5pLQXo+fy9zZovKAUNYbjQ/1fw== +hardhat@^2.0.0, hardhat@^2.6.4: + version "2.6.6" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.6.6.tgz#11d2dc4c1659fcbb8632de9399b1b4999f8b3628" + integrity sha512-GneZAwvNxf3cNobYTmMSp2qGX/yJyUmHD/xjW+8zF2AgWkLS33CHmGn4aRFKqfjsk7BS7FU6jqMmmZhHHO3gUw== dependencies: "@ethereumjs/block" "^3.4.0" "@ethereumjs/blockchain" "^5.4.0" @@ -2022,9 +2373,9 @@ immediate@~3.2.3: integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= immutable@^4.0.0-rc.12: - version "4.0.0-rc.15" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.15.tgz#c30056f05eaaf5650fd15230586688fdd15c54bc" - integrity sha512-v8+A3sNyaieoP9dHegl3tEYnIZa7vqNiSv0U6D7YddiZi34VjKy4GsIxrRHj2d8+CS3MeiVja5QyNe4JO/aEXA== + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -2106,9 +2457,9 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-core-module@^2.2.0, is-core-module@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== + version "2.8.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" + integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== dependencies: has "^1.0.3" @@ -2135,9 +2486,9 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" @@ -2176,6 +2527,11 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-shared-array-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" + integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -2200,6 +2556,13 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-weakref@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" + integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== + dependencies: + call-bind "^1.0.0" + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2293,6 +2656,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -2480,6 +2852,11 @@ ltgt@~2.2.0: resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + mcl-wasm@^0.7.1: version "0.7.9" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" @@ -2516,13 +2893,13 @@ merge2@^1.3.0: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.1.tgz#fc43e7b162e597a0720ccdd702bf1d49765691d2" - integrity sha512-25reMgrT8PhJy0Ba0U7fMZD2oobS1FPWB9vQa0uBpJYIQYYuFXEHoqEkTqA/UzX+s9br3pmUVVY/TOsFt/x0oQ== +merkle-patricia-tree@^4.2.0, merkle-patricia-tree@^4.2.1: + version "4.2.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.2.tgz#6dec17855370172458244c2f42c989dd60b773a3" + integrity sha512-eqZYNTshcYx9aESkSPr71EqwsR/QmpnObDEV4iLxkt/x/IoLYZYjJvKY72voP/27Vy61iMOrfOG6jrn7ttXD+Q== dependencies: "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.0" + ethereumjs-util "^7.1.2" level-mem "^5.0.1" level-ws "^2.0.0" readable-stream "^3.6.0" @@ -2575,9 +2952,9 @@ mkdirp@0.5.5: minimist "^1.2.5" mnemonist@^0.38.0: - version "0.38.3" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" - integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== + version "0.38.4" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.4.tgz#5d2f2dc4386aef78bfadeea60ce704dcf0ef8f3d" + integrity sha512-mflgW0gEWmVLbDDE2gJbOh3+RltTN7CgV9jV25qyCnyLN9FtoltWr7ZtAEDeD9u8W4oFAoolR6fBWieXdn3u8Q== dependencies: obliterator "^1.6.1" @@ -2611,16 +2988,16 @@ mocha@^7.1.2: yargs-parser "13.1.2" yargs-unparser "1.6.0" -mocha@^9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.1.tgz#33df2eb9c6262434630510c5f4283b36efda9b61" - integrity sha512-0wE74YMgOkCgBUj8VyIDwmLUjTsS13WV1Pg7l0SHea2qzZzlq7MDnfbPsHKcELBRk3+izEVkRofjmClpycudCA== +mocha@^9.1.1, mocha@^9.1.3: + version "9.1.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" + integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== dependencies: "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.2" - debug "4.3.1" + debug "4.3.2" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" @@ -2631,12 +3008,11 @@ mocha@^9.1.1: log-symbols "4.1.0" minimatch "3.0.4" ms "2.1.3" - nanoid "3.1.23" + nanoid "3.1.25" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" which "2.0.2" - wide-align "1.1.3" workerpool "6.1.5" yargs "16.2.0" yargs-parser "20.2.4" @@ -2662,10 +3038,10 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.1.23: - version "3.1.23" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" - integrity sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw== +nanoid@3.1.25: + version "3.1.25" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" + integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== natural-compare@^1.4.0: version "1.4.0" @@ -2691,9 +3067,9 @@ node-environment-flags@1.0.6: semver "^5.7.0" node-fetch@^2.6.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.4.tgz#7f1d13b8f9ff0c1a994dc6f73c69f7d652c7ace2" - integrity sha512-aD1fO+xtLiSCc9vuD+sYMxpIuQyhHscGSkBEo2o5LTV/3bTEAYvdUii29n8LlO5uLCmWdGP7uVUVXFo5SRdkLA== + version "2.6.5" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" + integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== dependencies: whatwg-url "^5.0.0" @@ -2755,22 +3131,22 @@ object.assign@^4.1.2: object-keys "^1.1.1" object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" - integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== + version "2.1.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" + integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.2" + es-abstract "^1.19.1" object.values@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.4.tgz#0d273762833e816b693a637d30073e7051535b30" - integrity sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg== + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.2" + es-abstract "^1.19.1" obliterator@^1.6.1: version "1.6.1" @@ -2915,6 +3291,11 @@ path-type@^4.0.0: resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + pbkdf2@^3.0.17: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" @@ -3132,11 +3513,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: - version "2.2.6" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" - integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + version "2.2.7" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" + integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== dependencies: - bn.js "^4.11.1" + bn.js "^5.2.0" run-parallel@^1.1.9: version "1.2.0" @@ -3160,7 +3541,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -scrypt-js@^3.0.0: +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -3260,9 +3641,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" - integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== + version "3.0.5" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" + integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== slash@^3.0.0: version "3.0.0" @@ -3373,14 +3754,14 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" + strip-ansi "^6.0.1" string.prototype.trimend@^1.0.4: version "1.0.4" @@ -3419,12 +3800,12 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: - ansi-regex "^5.0.0" + ansi-regex "^5.0.1" strip-bom@^3.0.0: version "3.0.0" @@ -3482,16 +3863,16 @@ supports-color@^7.1.0: has-flag "^4.0.0" table@^6.0.9: - version "6.7.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== + version "6.7.2" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" + integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== dependencies: ajv "^8.0.1" lodash.clonedeep "^4.5.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" text-table@^0.2.0: version "0.2.0" @@ -3537,6 +3918,24 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== +ts-node@^10.3.0: + version "10.3.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.3.0.tgz#a797f2ed3ff50c9a5d814ce400437cb0c1c048b4" + integrity sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + tsconfig-paths@^3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" @@ -3581,6 +3980,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -3596,10 +4000,10 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typescript@^4.4.3: - version "4.4.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" - integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== +typescript@^4.4.3, typescript@^4.4.4: + version "4.4.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" + integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== unbox-primitive@^1.0.1: version "1.0.1" @@ -3616,6 +4020,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -3745,6 +4154,11 @@ wrappy@1: resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= +ws@7.4.6: + version "7.4.6" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" + integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== + ws@^7.4.6: version "7.5.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" @@ -3856,6 +4270,11 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" From 747c790fb8391701b8edc5abcbe7dd4965417949 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Mon, 8 Nov 2021 09:26:24 -0300 Subject: [PATCH 0003/1302] Show message when there are no modules --- packages/hardhat-plugin/src/index.ts | 31 +++++++++++----------------- 1 file changed, 12 insertions(+), 19 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index a59bba179d..606854cad7 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -104,26 +104,14 @@ task("deploy") .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { await hre.run("compile", { quiet: true }); - let ignitionFiles: string[]; - if (modulesFiles !== undefined) { - ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); - } else { - ignitionFiles = fsExtra - .readdirSync(hre.config.paths.ignition) - .filter((x) => !x.startsWith(".")); - } - - const userModules: any[] = []; - for (const ignitionFile of ignitionFiles) { - const pathToFile = path.resolve(hre.config.paths.ignition, ignitionFile); - - const fileExists = await fsExtra.pathExists(pathToFile); - if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); - } + const userModules = await loadUserModules( + hre.config.paths.ignition, + modulesFiles ?? [] + ); - const userModule = require(pathToFile); - userModules.push(userModule.default ?? userModule); + if (userModules.length === 0) { + console.warn("No Ignition modules found"); + process.exit(0); } await hre.ignition.deployMany(userModules); @@ -139,6 +127,11 @@ task("plan") modulesFiles ?? [] ); + if (userModules.length === 0) { + console.warn("No Ignition modules found"); + process.exit(0); + } + const plan = await hre.ignition.buildPlan(userModules); let first = true; From 66568bc093a63e40b50e505cd80e12abf6152a01 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 10 Nov 2021 08:46:00 -0300 Subject: [PATCH 0004/1302] Add integration tests for hardhat plugin --- examples/simple/ignition/MyModule.js | 4 - packages/core/src/execution-engine.ts | 33 ++++++- packages/core/src/index.ts | 9 +- packages/core/src/services.ts | 8 +- packages/core/test/execution-engine.ts | 1 + packages/hardhat-plugin/.mocharc.json | 3 + packages/hardhat-plugin/package.json | 5 +- .../hardhat-plugin/src/ignition-wrapper.ts | 21 ++--- packages/hardhat-plugin/src/index.ts | 88 ++++++++---------- packages/hardhat-plugin/src/modules.ts | 43 +++++++++ packages/hardhat-plugin/test/.eslintrc.js | 15 +++ .../test/fixture-projects/.gitignore | 2 + .../minimal/contracts/Contracts.sol | 11 +++ .../minimal/hardhat.config.js | 11 +++ packages/hardhat-plugin/test/helpers.ts | 91 +++++++++++++++++++ packages/hardhat-plugin/test/integration.ts | 76 ++++++++++++++++ packages/hardhat-plugin/test/test.ts | 1 - .../hardhat-plugin/test/useEnvironment.ts | 13 +++ 18 files changed, 360 insertions(+), 75 deletions(-) create mode 100644 packages/hardhat-plugin/.mocharc.json create mode 100644 packages/hardhat-plugin/src/modules.ts create mode 100644 packages/hardhat-plugin/test/.eslintrc.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/.gitignore create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/helpers.ts create mode 100644 packages/hardhat-plugin/test/integration.ts delete mode 100644 packages/hardhat-plugin/test/test.ts create mode 100644 packages/hardhat-plugin/test/useEnvironment.ts diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index bf14f57ae4..0b9c7db906 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -5,10 +5,6 @@ module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar", { args: [foo] }) - const bar2 = m.contract("Bar", { - id: "Bar2", - args: [foo] - }) return { foo, bar } }); diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 9ff96213b5..a145ac2fa7 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,3 +1,5 @@ +import debug from "debug"; + import { InternalBinding } from "./bindings"; import { TxSender } from "./tx-sender"; import { Journal } from "./journal"; @@ -14,6 +16,7 @@ import { interface ExecutionEngineOptions { parallelizationLevel: number; loggingEnabled: boolean; + txPollingInterval: number; } interface ExecutorPlan { @@ -24,6 +27,8 @@ type ModulePlan = "already-deployed" | ExecutorPlan[]; export type DeploymentPlan = Record; export class ExecutionEngine { + private _log = debug("ignition:execution-engine"); + public static buildPlan(dag: DAG, currentDeploymentResult: DeploymentResult) { const plan: DeploymentPlan = {}; @@ -63,6 +68,7 @@ export class ExecutionEngine { const errorsPerModule: Map = new Map(); let hasErrors = false; for (const ignitionModule of dag.getModules()) { + this._log(`Validating module ${ignitionModule.id}`); const errors = await this._validateModule(ignitionModule); if (errors.length > 0) { hasErrors = true; @@ -93,7 +99,12 @@ export class ExecutionEngine { // execute each module sequentially for (const ignitionModule of dag.getModules()) { + this._log(`Begin execution of module ${ignitionModule.id}`); + if (deploymentResult.hasModule(ignitionModule.id)) { + this._log( + `A previous result for module ${ignitionModule.id} already exists` + ); const previousModuleResult = deploymentResult.getModule( ignitionModule.id ); @@ -101,6 +112,8 @@ export class ExecutionEngine { continue; } } + + this._log(`Executing module ${ignitionModule.id}`); const moduleResult = await this._executeModule( ignitionModule, deploymentResult @@ -119,6 +132,9 @@ export class ExecutionEngine { const allErrors: string[] = []; for (const executor of executors) { + this._log( + `Validating binding ${executor.binding.id} of module ${ignitionModule.id}` + ); const txSender = new TxSender( ignitionModule.id, executor.binding.id, @@ -127,7 +143,8 @@ export class ExecutionEngine { const services = createServices( this._providers, txSender, - this._options.loggingEnabled + this._options.loggingEnabled, + this._options.txPollingInterval ); const errors = await executor.validate(executor.binding.input, services); @@ -202,6 +219,10 @@ export class ExecutionEngine { } for (const executor of ignitionModule.getExecutors()) { + this._log( + `Begin execution of executor ${executor.binding.id} of module ${ignitionModule.id}` + ); + if (executor.isReady() && runningCount < parallelizationLevel) { const dependencies = executor.binding.getDependencies(); const allDependenciesReady = dependencies.every((d) => @@ -224,7 +245,8 @@ export class ExecutionEngine { const services = createServices( this._providers, txSender, - this._options.loggingEnabled + this._options.loggingEnabled, + this._options.txPollingInterval ); // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -435,11 +457,14 @@ export class ModuleResult { function createServices( providers: Providers, txSender: TxSender, - loggingEnabled: boolean + loggingEnabled: boolean, + txPollingInterval: number ): Services { const services: Services = { artifacts: new ArtifactsService(providers), - contracts: new ContractsService(providers, txSender), + contracts: new ContractsService(providers, txSender, { + pollingInterval: txPollingInterval, + }), transactions: new TransactionsService(providers), logging: new LoggingService({ enabled: loggingEnabled, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 40c9c6fd43..43a2281f96 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -25,7 +25,6 @@ import { Contract } from "./types"; export { Binding } from "./bindings"; export { DeploymentPlan } from "./execution-engine"; export { buildModule } from "./modules"; -export { ContractsService as IgnitionDeployer } from "./services"; export { AddressLike, BindingOutput, @@ -56,8 +55,11 @@ export class Ignition { public async deploy( userModules: Array>, - pathToJournal: string | undefined, - currentDeploymentResult: DeploymentResult + currentDeploymentResult: DeploymentResult, + { + pathToJournal, + txPollingInterval, + }: { pathToJournal: string | undefined; txPollingInterval: number } ) { log(`Start deploy, '${userModules.length}' modules`); @@ -87,6 +89,7 @@ export class Ignition { { parallelizationLevel: 2, loggingEnabled: pathToJournal !== undefined, + txPollingInterval, } ); diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index e6bd7700fd..23e2106eb5 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -13,7 +13,11 @@ interface TransactionOptions { export class ContractsService { private _ethersProvider: ethers.providers.Web3Provider; - constructor(private _providers: Providers, private _txSender: TxSender) { + constructor( + private _providers: Providers, + private _txSender: TxSender, + private _options: { pollingInterval: number } + ) { this._ethersProvider = new ethers.providers.Web3Provider( _providers.ethereumProvider ); @@ -138,7 +142,7 @@ export class ContractsService { txSent = txToSend; } - await sleep(5000); + await sleep(this._options.pollingInterval); } return txHash; diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index f50c2bc061..8c123e03db 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -8,6 +8,7 @@ import { emptyDeploymentResult, getMockedProviders, inc } from "./helpers"; const executionEngineOptions = { parallelizationLevel: 1, loggingEnabled: false, + txPollingInterval: 100, }; describe("ExecutionEngine", function () { diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json new file mode 100644 index 0000000000..5ec3aeaca2 --- /dev/null +++ b/packages/hardhat-plugin/.mocharc.json @@ -0,0 +1,3 @@ +{ + "require": "ts-node/register/transpile-only" +} diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 32746e37d0..43292dfe62 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -8,16 +8,19 @@ "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", - "prettier": "prettier \"**/*.{js,md,json}\"" + "prettier": "prettier \"**/*.{js,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", + "@types/chai": "^4.2.22", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 31d2bb75ad..5588df4418 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -25,7 +25,11 @@ export class IgnitionWrapper { services: any, private _ethers: HardhatEthers, private _isHardhatNetwork: boolean, - private _paths: HardhatPaths + private _paths: HardhatPaths, + private _deployOptions: { + pathToJournal: string | undefined; + txPollingInterval: number; + } ) { this._ignition = new Ignition(services, !this._isHardhatNetwork); } @@ -33,18 +37,13 @@ export class IgnitionWrapper { public async deploy( userModuleOrName: UserModule | string ): Promise> { - const [resolvedOutput] = await this.deployMany([userModuleOrName]); - return resolvedOutput; + const [, resolvedOutputs] = await this.deployMany([userModuleOrName]); + return resolvedOutputs[0]; } public async deployMany( userModulesOrNames: Array | string> ): Promise>> { - const pathToJournal = path.resolve( - this._paths.root, - "ignition-journal.json" - ); - const { chainId } = await this._ethers.provider.getNetwork(); const currentDeploymentResult = await this._getDeploymentResult(chainId); @@ -61,8 +60,8 @@ export class IgnitionWrapper { const [deploymentResult, moduleOutputs] = await this._ignition.deploy( userModules, - this._isHardhatNetwork ? undefined : pathToJournal, - currentDeploymentResult ?? new DeploymentResult() + currentDeploymentResult ?? new DeploymentResult(), + this._deployOptions ); const moduleHold = deploymentResult.isHold(); @@ -92,7 +91,7 @@ export class IgnitionWrapper { resolvedOutputs.push(resolvedOutput); } - return resolvedOutputs; + return [deploymentResult, resolvedOutputs]; } public async buildPlan( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 606854cad7..d00d0a37c1 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,17 +1,20 @@ import "@nomiclabs/hardhat-ethers"; -import debug from "debug"; -import fsExtra from "fs-extra"; -import { extendConfig, extendEnvironment, task } from "hardhat/config"; +import { + extendConfig, + extendEnvironment, + subtask, + task, + types, +} from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; import { Providers, UserModule } from "ignition"; import path from "path"; import { IgnitionWrapper } from "./ignition-wrapper"; +import { loadUserModules } from "./modules"; import "./type-extensions"; -const log = debug("hardhat-ignition:main"); - extendConfig( (config: HardhatConfig, userConfig: Readonly) => { const userIgnitionPath = userConfig.paths?.ignition; @@ -90,11 +93,18 @@ extendEnvironment((hre) => { }; hre.ignition = lazyObject(() => { + const pathToJournal = + hre.network.name !== "hardhat" + ? path.resolve(hre.config.paths.root, "ignition-journal.json") + : undefined; + const txPollingInterval = hre.network.name !== "hardhat" ? 5000 : 100; + return new IgnitionWrapper( services, hre.ethers, hre.network.name === "hardhat", - hre.config.paths + hre.config.paths, + { pathToJournal, txPollingInterval } ); }); }); @@ -109,14 +119,31 @@ task("deploy") modulesFiles ?? [] ); - if (userModules.length === 0) { - console.warn("No Ignition modules found"); - process.exit(0); - } - - await hre.ignition.deployMany(userModules); + await hre.run("deploy:deploy-modules", { + userModules, + }); }); +subtask("deploy:deploy-modules") + .addParam("userModules", undefined, undefined, types.any) + .setAction( + async ( + { + userModules, + }: { userModules: Array>; pathToJournal?: string }, + hre + ) => { + if (userModules.length === 0) { + console.warn("No Ignition modules found"); + process.exit(0); + } + + const [deploymentResult] = await hre.ignition.deployMany(userModules); + + return deploymentResult; + } + ); + task("plan") .addOptionalVariadicPositionalParam("modulesFiles") .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { @@ -151,40 +178,3 @@ task("plan") } } }); - -async function loadUserModules( - ignitionDirectory: string, - modulesFiles: string[] -): Promise>> { - log(`Loading user modules from '${ignitionDirectory}'`); - - let ignitionFiles: string[]; - if (modulesFiles.length === 0) { - log("No files passed, reading all module files"); - - // load all modules in ignition's directory - ignitionFiles = fsExtra - .readdirSync(ignitionDirectory) - .filter((x) => !x.startsWith(".")); - } else { - log(`Reading '${modulesFiles.length}' selected module files`); - ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); - } - - log(`Loading '${ignitionFiles.length}' module files`); - const userModules: any[] = []; - for (const ignitionFile of ignitionFiles) { - const pathToFile = path.resolve(ignitionDirectory, ignitionFile); - - const fileExists = await fsExtra.pathExists(pathToFile); - if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); - } - - log(`Loading module file '${pathToFile}'`); - const userModule = require(pathToFile); - userModules.push(userModule.default ?? userModule); - } - - return userModules; -} diff --git a/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-plugin/src/modules.ts new file mode 100644 index 0000000000..6fb63a8cad --- /dev/null +++ b/packages/hardhat-plugin/src/modules.ts @@ -0,0 +1,43 @@ +import debug from "debug"; +import fsExtra from "fs-extra"; +import { UserModule } from "ignition"; +import path from "path"; + +const log = debug("hardhat-ignition:modules"); + +export async function loadUserModules( + ignitionDirectory: string, + modulesFiles: string[] +): Promise>> { + log(`Loading user modules from '${ignitionDirectory}'`); + + let ignitionFiles: string[]; + if (modulesFiles.length === 0) { + log("No files passed, reading all module files"); + + // load all modules in ignition's directory + ignitionFiles = fsExtra + .readdirSync(ignitionDirectory) + .filter((x) => !x.startsWith(".")); + } else { + log(`Reading '${modulesFiles.length}' selected module files`); + ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); + } + + log(`Loading '${ignitionFiles.length}' module files`); + const userModules: any[] = []; + for (const ignitionFile of ignitionFiles) { + const pathToFile = path.resolve(ignitionDirectory, ignitionFile); + + const fileExists = await fsExtra.pathExists(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + log(`Loading module file '${pathToFile}'`); + const userModule = require(pathToFile); + userModules.push(userModule.default ?? userModule); + } + + return userModules; +} diff --git a/packages/hardhat-plugin/test/.eslintrc.js b/packages/hardhat-plugin/test/.eslintrc.js new file mode 100644 index 0000000000..757fe8a3ca --- /dev/null +++ b/packages/hardhat-plugin/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/.gitignore b/packages/hardhat-plugin/test/fixture-projects/.gitignore new file mode 100644 index 0000000000..e7f801166c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/.gitignore @@ -0,0 +1,2 @@ +artifacts/ +cache/ diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol new file mode 100644 index 0000000000..06acc7108e --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -0,0 +1,11 @@ +contract Foo {} + +contract Bar {} + +contract UsesContract { + address public contractAddress; + + constructor (address _contract) { + contractAddress = _contract; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js new file mode 100644 index 0000000000..39a079daef --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js @@ -0,0 +1,11 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts new file mode 100644 index 0000000000..d95893af9f --- /dev/null +++ b/packages/hardhat-plugin/test/helpers.ts @@ -0,0 +1,91 @@ +import { assert } from "chai"; +import { DeploymentResult, UserModule } from "ignition"; + +/** + * Wait until there are at least `expectedCount` transactions in the mempool + */ +export async function waitForPendingTxs(hre: any, expectedCount: number) { + while (true) { + const pendingBlock = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + if (pendingBlock.transactions.length >= expectedCount) { + return; + } + + await sleep(100); + } +} + +const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); + +type ExpectedBindingResult = "contract"; +type ExpectedModuleResult = Record; +type ExpectedDeploymentResult = Record; + +export async function assertDeploymentResult( + hre: any, + result: DeploymentResult, + expectedResult: ExpectedDeploymentResult +) { + const resultModules = result.getModules(); + const expectedModules = Object.entries(expectedResult); + + assert.equal(resultModules.length, expectedModules.length); + + for (const resultModule of resultModules) { + const expectedModule = expectedResult[resultModule.moduleId]; + + assert.isDefined(expectedModule); + + assert.equal(resultModule.count(), Object.entries(expectedModule).length); + + for (const [bindingId, expectedBindingResult] of Object.entries( + expectedModule + )) { + const bindingResult = resultModule.getResult(bindingId); + + if (expectedBindingResult === "contract") { + assert.isDefined(bindingResult.address); + await assertHasCode(hre, bindingResult.address); + } else { + const _exhaustiveCheck: never = expectedBindingResult; + } + } + } +} + +async function assertHasCode(hre: any, address: string) { + const code = await hre.network.provider.send("eth_getCode", [address]); + assert.notEqual(code, "0x"); +} + +export async function deployModules( + hre: any, + userModules: Array>, + expectedBlocks: number[] +): Promise { + await hre.run("compile", { quiet: true }); + + const deploymentResultPromise: Promise = hre.run( + "deploy:deploy-modules", + { + userModules, + } + ); + + // eslint-disable-next-line @typescript-eslint/no-floating-promises + mineBlocks(hre, expectedBlocks); + + return deploymentResultPromise; +} + +async function mineBlocks(hre: any, expectedBlocks: number[]) { + for (const expectedPendingTxs of expectedBlocks) { + await waitForPendingTxs(hre, expectedPendingTxs); + await hre.network.provider.send("evm_mine"); + } +} diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts new file mode 100644 index 0000000000..cf5a4e298a --- /dev/null +++ b/packages/hardhat-plugin/test/integration.ts @@ -0,0 +1,76 @@ +import { buildModule } from "ignition"; +import { assertDeploymentResult, deployModules } from "./helpers"; + +import { useEnvironment } from "./useEnvironment"; + +describe("integration tests", function () { + this.timeout(20000); + useEnvironment("minimal"); + + it("should deploy a contract", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + // when + const deploymentResult = await deployModules(this.hre, [userModule], [1]); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule: { + Foo: "contract", + }, + }); + }); + + it("should deploy two contracts in parallel", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + // when + const deploymentResult = await deployModules(this.hre, [userModule], [2]); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule: { + Foo: "contract", + Bar: "contract", + }, + }); + }); + + it("should deploy two contracts sequentially", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + const usesContract = m.contract("UsesContract", { + args: [foo], + }); + + return { foo, usesFoo: usesContract }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [1, 1] + ); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule: { + Foo: "contract", + UsesContract: "contract", + }, + }); + }); +}); diff --git a/packages/hardhat-plugin/test/test.ts b/packages/hardhat-plugin/test/test.ts deleted file mode 100644 index 09d4352e8b..0000000000 --- a/packages/hardhat-plugin/test/test.ts +++ /dev/null @@ -1 +0,0 @@ -// test diff --git a/packages/hardhat-plugin/test/useEnvironment.ts b/packages/hardhat-plugin/test/useEnvironment.ts new file mode 100644 index 0000000000..79faa41712 --- /dev/null +++ b/packages/hardhat-plugin/test/useEnvironment.ts @@ -0,0 +1,13 @@ +import { resetHardhatContext } from "hardhat/plugins-testing"; +import path from "path"; + +export function useEnvironment(fixtureProjectName: string) { + beforeEach("Load environment", function () { + process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); + this.hre = require("hardhat"); + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} From 425b52fc7505c0adbbdb2ff891c5f4de4f182886 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 10 Nov 2021 10:08:55 -0300 Subject: [PATCH 0005/1302] Add m.call --- examples/simple/contracts/Foo.sol | 4 + examples/simple/ignition/MyModule.js | 7 +- examples/simple/script.js | 14 +- package.json | 1 + packages/core/src/bindings.ts | 39 +++++- packages/core/src/executors.ts | 99 ++++++++++++- packages/core/src/index.ts | 2 +- packages/core/src/modules.ts | 37 ++++- packages/core/src/types.ts | 5 + packages/hardhat-plugin/.prettierignore | 2 + .../minimal/contracts/Contracts.sol | 13 +- packages/hardhat-plugin/test/helpers.ts | 43 +++++- packages/hardhat-plugin/test/integration.ts | 131 ++++++++++++++++-- 13 files changed, 363 insertions(+), 34 deletions(-) diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol index 9881a49ce4..e593c5f62f 100644 --- a/examples/simple/contracts/Foo.sol +++ b/examples/simple/contracts/Foo.sol @@ -3,6 +3,10 @@ pragma solidity ^0.8.0; contract Foo { uint public x = 10; + + function inc() public { + x++; + } } contract Bar { diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index 0b9c7db906..d5e86e8e52 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -2,9 +2,8 @@ const { buildModule } = require("ignition") module.exports = buildModule("MyModule", (m) => { const foo = m.contract("Foo") - const bar = m.contract("Bar", { - args: [foo] - }) - return { foo, bar } + m.call(foo, "inc") + + return { foo } }); diff --git a/examples/simple/script.js b/examples/simple/script.js index a5a0e07966..953d13fa22 100644 --- a/examples/simple/script.js +++ b/examples/simple/script.js @@ -1,17 +1,13 @@ const hre = require("hardhat"); -const MyModule = require("./ignition/MyModule") -const MyOtherModule = require("./ignition/MyOtherModule") +// const MyModule = require("./ignition/MyModule") +// const MyOtherModule = require("./ignition/MyOtherModule") async function main() { - const [{ foo: foo1, bar }, { foo: foo2, qux }] = await ignition.deployMany([MyModule, MyOtherModule]); + const { foo } = await ignition.deploy("MyModule") - console.log('foo1', foo1.address); - console.log('foo2', foo2.address); - console.log('bar', bar.address); - console.log('qux', qux.address); - console.log('bar.foo', await bar.a()); - console.log('qux.foo', await qux.a()); + console.log(foo.address); + console.log((await foo.x()).toString()); } main() diff --git a/package.json b/package.json index fb92634dc9..9461b6d8a1 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "scripts": { "build": "wsrun --exclude-missing --serial build", "lint": "wsrun --exclude-missing --serial lint", + "test": "wsrun --exclude-missing --serial test", "watch": "tsc --build --watch packages/core packages/hardhat-plugin" }, "devDependencies": { diff --git a/packages/core/src/bindings.ts b/packages/core/src/bindings.ts index 79515ea066..50bf11a0a2 100644 --- a/packages/core/src/bindings.ts +++ b/packages/core/src/bindings.ts @@ -1,6 +1,6 @@ -import { Contract } from "./types"; +import { Contract, Tx } from "./types"; -export type BindingOutput = string | number | Contract; +export type BindingOutput = string | number | Contract | Tx; export function serializeBindingOutput(x: BindingOutput) { if (typeof x === "string") { @@ -9,6 +9,8 @@ export function serializeBindingOutput(x: BindingOutput) { return { _type: "number", value: x }; } else if ("address" in x) { return { _type: "contract", value: x }; + } else if ("hash" in x) { + return { _type: "tx", value: x }; } const exhaustiveCheck: never = x; @@ -60,11 +62,18 @@ export interface ContractOptions { args: Array>; } +export interface CallOptions { + contract: ContractBinding; + method: string; + args: Array>; +} + export type Bindable = T | Binding; export type AddressLike = Bindable | Binding; export class ContractBinding extends Binding {} +export class CallBinding extends Binding {} type Unflattened = T[] | Array>; @@ -109,6 +118,32 @@ export class InternalContractBinding extends InternalBinding< } } +export class InternalCallBinding extends InternalBinding { + public getDependencies(): InternalBinding[] { + const mapToBindings = (x: unknown): Unflattened => { + if (Array.isArray(x)) { + return x.map(mapToBindings); + } + + if (InternalBinding.isBinding(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToBindings); + } + + return []; + }; + + const dependencies = deepFlatten( + mapToBindings([this.input.contract, ...this.input.args]) + ); + + return dependencies; + } +} + export type Resolved = T extends Binding ? O : { diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index b9baaf0db2..be7a7cd877 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -2,12 +2,14 @@ import { ethers } from "ethers"; import { BindingOutput, + CallOptions, ContractOptions, InternalBinding, + InternalContractBinding, Resolved, } from "./bindings"; import { Services } from "./services"; -import { Contract } from "./types"; +import { Contract, Tx } from "./types"; /** * An instance of this class is thrown to indicate that the executor is waiting @@ -152,6 +154,7 @@ export class ContractExecutor extends Executor { name: contractName, abi: artifact.abi, address: receipt.contractAddress, + bytecode: artifact.bytecode, }; } @@ -186,3 +189,97 @@ export class ContractExecutor extends Executor { return `Deploy contract ${this.binding.input.contractName}`; } } + +export class CallExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contract, method } = input; + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.call( + contract.address, + contract.abi, + method, + args + ); + + await services.transactions.wait(txHash); + + return { + hash: txHash, + }; + } + + public async validate( + input: CallOptions, + services: Services + ): Promise { + const contractName = (input.contract as InternalContractBinding).input + .contractName; + const artifactExists = await services.artifacts.hasArtifact(contractName); + + if (!artifactExists) { + return [`Artifact with name '${contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const functionFragments = iface.fragments.filter( + (f) => f.name === input.method + ); + + if (functionFragments.length === 0) { + return [ + `Contract '${contractName}' doesn't have a function ${input.method}`, + ]; + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + return [ + `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, + ]; + } else { + return [ + `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, + ]; + } + } + + return []; + } + + public getDescription() { + const contractName = ( + this.binding.input.contract as InternalContractBinding + ).input.contractName; + return `Call method ${this.binding.input.method} in contract ${contractName}`; + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 43a2281f96..cc986fad57 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -69,7 +69,7 @@ export class Ignition { for (const userModule of userModules) { log("Load module '%s'", userModule.id); - const moduleOutput = m.useModule(userModule); + const moduleOutput = m.useModule(userModule) ?? {}; moduleOutputs.push(moduleOutput); } diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts index b618a69cb4..8670afd49b 100644 --- a/packages/core/src/modules.ts +++ b/packages/core/src/modules.ts @@ -1,12 +1,15 @@ import { Bindable, + CallBinding, + CallOptions, ContractBinding, ContractOptions, InternalBinding, + InternalCallBinding, InternalContractBinding, } from "./bindings"; -import { ContractExecutor, Executor } from "./executors"; -import { Contract } from "./types"; +import { CallExecutor, ContractExecutor, Executor } from "./executors"; +import { Contract, Tx } from "./types"; export class IgnitionModule { constructor(public readonly id: string, private _executors: Executor[]) {} @@ -130,6 +133,11 @@ interface UserContractOptions { args?: Array>; } +interface UserCallOptions { + id?: string; + args?: Array>; +} + export interface ModuleBuilder { getModuleId: () => string; addExecutor: (executor: Executor) => void; @@ -139,6 +147,12 @@ export interface ModuleBuilder { options?: UserContractOptions ) => ContractBinding; + call: ( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ) => CallBinding; + useModule: (userModule: UserModule) => T; } @@ -186,6 +200,25 @@ export class ModuleBuilderImpl implements ModuleBuilder { return b; } + public call( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ): InternalBinding { + const id = + options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; + const args = options?.args ?? []; + const b = new InternalCallBinding(this.getModuleId(), id, { + contract, + method, + args, + }); + + this.addExecutor(new CallExecutor(b)); + + return b; + } + public useModule(userModule: UserModule): T { const knownModuleAndOutput = this._knownModules.get(userModule.id); if (knownModuleAndOutput !== undefined) { diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 7702d997a8..0bdc204676 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -7,4 +7,9 @@ export interface Contract { name: string; address: string; abi: any[]; + bytecode: string; +} + +export interface Tx { + hash: string; } diff --git a/packages/hardhat-plugin/.prettierignore b/packages/hardhat-plugin/.prettierignore index 8225baa4a7..74183e372f 100644 --- a/packages/hardhat-plugin/.prettierignore +++ b/packages/hardhat-plugin/.prettierignore @@ -1,2 +1,4 @@ /node_modules /dist +/test/fixture-projects/*/artifacts +/test/fixture-projects/*/cache diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 06acc7108e..157f665aef 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -1,6 +1,15 @@ -contract Foo {} +contract Foo { + bool public isFoo = true; + uint public x = 1; -contract Bar {} + function inc() public { + x++; + } +} + +contract Bar { + bool public isBar = true; +} contract UsesContract { address public contractAddress; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index d95893af9f..7a9c6a9644 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -22,7 +22,29 @@ export async function waitForPendingTxs(hre: any, expectedCount: number) { const sleep = (timeout: number) => new Promise((res) => setTimeout(res, timeout)); -type ExpectedBindingResult = "contract"; +export const resultAssertions = { + contract: (predicate?: ContractResultPredicate): ExpectedBindingResult => { + return { + kind: "contract", + predicate: predicate ?? (async () => {}), + }; + }, + transaction: (): ExpectedBindingResult => { + return { + kind: "transaction", + }; + }, +}; + +type ContractResultPredicate = (contract: any) => Promise; +type ExpectedBindingResult = + | { + kind: "contract"; + predicate: ContractResultPredicate; + } + | { + kind: "transaction"; + }; type ExpectedModuleResult = Record; type ExpectedDeploymentResult = Record; @@ -48,9 +70,19 @@ export async function assertDeploymentResult( )) { const bindingResult = resultModule.getResult(bindingId); - if (expectedBindingResult === "contract") { + if (expectedBindingResult.kind === "contract") { assert.isDefined(bindingResult.address); await assertHasCode(hre, bindingResult.address); + + const contract = await hre.ethers.getContractAt( + bindingResult.abi, + bindingResult.address + ); + + await expectedBindingResult.predicate(contract); + } else if (expectedBindingResult.kind === "transaction") { + assert.isDefined(bindingResult.hash); + await assertTxMined(hre, bindingResult.hash); } else { const _exhaustiveCheck: never = expectedBindingResult; } @@ -63,6 +95,13 @@ async function assertHasCode(hre: any, address: string) { assert.notEqual(code, "0x"); } +async function assertTxMined(hre: any, hash: string) { + const receipt = await hre.network.provider.send("eth_getTransactionReceipt", [ + hash, + ]); + assert.isNotNull(receipt); +} + export async function deployModules( hre: any, userModules: Array>, diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index cf5a4e298a..3baf32007c 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,5 +1,10 @@ +import { assert } from "chai"; import { buildModule } from "ignition"; -import { assertDeploymentResult, deployModules } from "./helpers"; +import { + assertDeploymentResult, + deployModules, + resultAssertions, +} from "./helpers"; import { useEnvironment } from "./useEnvironment"; @@ -11,8 +16,6 @@ describe("integration tests", function () { // given const userModule = buildModule("MyModule", (m) => { const foo = m.contract("Foo"); - - return { foo }; }); // when @@ -21,7 +24,9 @@ describe("integration tests", function () { // then await assertDeploymentResult(this.hre, deploymentResult, { MyModule: { - Foo: "contract", + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), }, }); }); @@ -31,8 +36,6 @@ describe("integration tests", function () { const userModule = buildModule("MyModule", (m) => { const foo = m.contract("Foo"); const bar = m.contract("Bar"); - - return { foo, bar }; }); // when @@ -41,8 +44,12 @@ describe("integration tests", function () { // then await assertDeploymentResult(this.hre, deploymentResult, { MyModule: { - Foo: "contract", - Bar: "contract", + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + Bar: resultAssertions.contract(async (bar) => { + assert.isTrue(await bar.isBar()); + }), }, }); }); @@ -54,8 +61,38 @@ describe("integration tests", function () { const usesContract = m.contract("UsesContract", { args: [foo], }); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [1, 1] + ); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + UsesContract: resultAssertions.contract(async (usesContract) => { + const contractAddress = await usesContract.contractAddress(); + const fooAddress = deploymentResult + .getModule("MyModule") + .getResult("Foo").address; - return { foo, usesFoo: usesContract }; + assert.equal(contractAddress, fooAddress); + }), + }, + }); + }); + + it("should call a function in a contract", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + m.call(foo, "inc"); }); // when @@ -68,8 +105,80 @@ describe("integration tests", function () { // then await assertDeploymentResult(this.hre, deploymentResult, { MyModule: { - Foo: "contract", - UsesContract: "contract", + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + "Foo.inc": resultAssertions.transaction(), + }, + }); + }); + + it("should deploy two independent contracts and call a function in each one", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo1 = m.contract("Foo", { id: "Foo1" }); + const foo2 = m.contract("Foo", { id: "Foo2" }); + m.call(foo1, "inc"); + m.call(foo2, "inc"); + m.call(foo2, "inc", { id: "Foo2.inc2" }); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [2, 2, 1] + ); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule: { + Foo1: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + Foo2: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 3); + }), + "Foo1.inc": resultAssertions.transaction(), + "Foo2.inc": resultAssertions.transaction(), + "Foo2.inc2": resultAssertions.transaction(), + }, + }); + }); + + it("should deploy two modules", async function () { + // given + const userModule1 = buildModule("MyModule1", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + const userModule2 = buildModule("MyModule2", (m) => { + const { foo } = m.useModule(userModule1); + + m.call(foo, "inc"); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule2, userModule1], + [1, 1] + ); + + // then + await assertDeploymentResult(this.hre, deploymentResult, { + MyModule1: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + }, + MyModule2: { + "Foo.inc": resultAssertions.transaction(), }, }); }); From 0838e0e69c99fbc3da267575aea6ff768f4f3c9f Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 10 Nov 2021 10:10:38 -0300 Subject: [PATCH 0006/1302] Fix linter --- packages/hardhat-plugin/test/integration.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 3baf32007c..c90d6844a9 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -15,7 +15,7 @@ describe("integration tests", function () { it("should deploy a contract", async function () { // given const userModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); + m.contract("Foo"); }); // when @@ -34,8 +34,8 @@ describe("integration tests", function () { it("should deploy two contracts in parallel", async function () { // given const userModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); - const bar = m.contract("Bar"); + m.contract("Foo"); + m.contract("Bar"); }); // when @@ -58,7 +58,7 @@ describe("integration tests", function () { // given const userModule = buildModule("MyModule", (m) => { const foo = m.contract("Foo"); - const usesContract = m.contract("UsesContract", { + m.contract("UsesContract", { args: [foo], }); }); From cdec335d5d8eb05e3954aa2f397fe0d017e0e997 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Thu, 11 Nov 2021 14:54:27 -0300 Subject: [PATCH 0007/1302] Add class to manage the engine's execution --- config/eslint/eslintrc.js | 3 + examples/.gitignore | 1 + examples/simple-ts/ignition/Multisig.ts | 4 + .../simple-ts/ignition/MultisigAndTimelock.ts | 4 + examples/simple-ts/ignition/Timelock.ts | 4 + packages/core/package.json | 1 + packages/core/src/execution-engine.ts | 99 ++++++++++++++----- packages/core/src/executors.ts | 12 ++- packages/core/src/index.ts | 8 +- packages/core/test/execution-engine.ts | 79 ++++++++++----- packages/core/test/helpers.ts | 31 +++++- packages/hardhat-plugin/package.json | 1 + .../hardhat-plugin/src/ignition-wrapper.ts | 2 +- yarn.lock | 13 +++ 14 files changed, 204 insertions(+), 58 deletions(-) create mode 100644 examples/.gitignore diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index e0dfe0aa28..febaad417c 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -9,6 +9,7 @@ module.exports = { plugins: [ "eslint-plugin-import", "@typescript-eslint", + "mocha" ], rules: { "@typescript-eslint/adjacent-overload-signatures": "error", @@ -199,5 +200,7 @@ module.exports = { }, ], "use-isnan": "error", + "mocha/no-skipped-tests": "error", + "mocha/no-exclusive-tests": "error" }, }; diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000000..b2d4a3fccc --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1 @@ +ignition-journal.json diff --git a/examples/simple-ts/ignition/Multisig.ts b/examples/simple-ts/ignition/Multisig.ts index 6856557175..ec8ef9d4d1 100644 --- a/examples/simple-ts/ignition/Multisig.ts +++ b/examples/simple-ts/ignition/Multisig.ts @@ -99,6 +99,10 @@ class MultisigContractExecutor extends Executor< public async validate(input: {}, services: Services): Promise { return []; } + + public getDescription() { + return "Deploy contract with multisig and timelock"; + } } class MultisigContractBinding extends InternalBinding< diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts index 32508e83d8..11dfb4881e 100644 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -180,6 +180,10 @@ class MultisigAndTimelockExecutor extends Executor< public async validate(input: {}, services: Services): Promise { return []; } + + public getDescription() { + return "Deploy contract with multisig and timelock"; + } } class MultisigAndTimelockBinding extends InternalBinding< diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index c258930c68..ffcf234b0d 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -74,6 +74,10 @@ class TimelockCallExecutor extends Executor { ): Promise { return []; } + + public getDescription() { + return "Deploy contract with multisig and timelock"; + } } interface TimelockCallOptions { diff --git a/packages/core/package.json b/packages/core/package.json index c9477c0626..5dc5f6ecc8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,6 +23,7 @@ "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "mocha": "^9.1.3", "prettier": "2.4.1", diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index a145ac2fa7..7870aed7c8 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -12,6 +12,7 @@ import { Services, TransactionsService, } from "./services"; +import { sleep } from "./utils"; interface ExecutionEngineOptions { parallelizationLevel: number; @@ -27,7 +28,7 @@ type ModulePlan = "already-deployed" | ExecutorPlan[]; export type DeploymentPlan = Record; export class ExecutionEngine { - private _log = debug("ignition:execution-engine"); + private _debug = debug("ignition:execution-engine"); public static buildPlan(dag: DAG, currentDeploymentResult: DeploymentResult) { const plan: DeploymentPlan = {}; @@ -61,14 +62,14 @@ export class ExecutionEngine { private _options: ExecutionEngineOptions ) {} - public async execute(dag: DAG): Promise { - const deploymentResult = this._currentDeploymentResult; + public async *execute(dag: DAG) { + const deploymentResult = this._currentDeploymentResult.clone(); // validate all modules const errorsPerModule: Map = new Map(); let hasErrors = false; for (const ignitionModule of dag.getModules()) { - this._log(`Validating module ${ignitionModule.id}`); + this._debug(`Validating module ${ignitionModule.id}`); const errors = await this._validateModule(ignitionModule); if (errors.length > 0) { hasErrors = true; @@ -99,10 +100,10 @@ export class ExecutionEngine { // execute each module sequentially for (const ignitionModule of dag.getModules()) { - this._log(`Begin execution of module ${ignitionModule.id}`); + this._debug(`Begin execution of module ${ignitionModule.id}`); if (deploymentResult.hasModule(ignitionModule.id)) { - this._log( + this._debug( `A previous result for module ${ignitionModule.id} already exists` ); const previousModuleResult = deploymentResult.getModule( @@ -113,16 +114,21 @@ export class ExecutionEngine { } } - this._log(`Executing module ${ignitionModule.id}`); - const moduleResult = await this._executeModule( + this._debug(`Executing module ${ignitionModule.id}`); + const moduleExecutionGenerator = this._executeModule( ignitionModule, deploymentResult ); - - deploymentResult.addResult(ignitionModule.id, moduleResult); + for await (const moduleResult of moduleExecutionGenerator) { + if (moduleResult !== undefined) { + deploymentResult.addResult(moduleResult); + break; + } + yield; + } } - return deploymentResult; + yield deploymentResult; } private async _validateModule( @@ -132,7 +138,7 @@ export class ExecutionEngine { const allErrors: string[] = []; for (const executor of executors) { - this._log( + this._debug( `Validating binding ${executor.binding.id} of module ${ignitionModule.id}` ); const txSender = new TxSender( @@ -156,22 +162,15 @@ export class ExecutionEngine { return allErrors; } - private async _executeModule( + private async *_executeModule( ignitionModule: IgnitionModule, deploymentResult: DeploymentResult - ): Promise { + ) { const { parallelizationLevel } = this._options; const executors = ignitionModule.getExecutors(); const moduleResult = new ModuleResult(ignitionModule.id); - let it = 0; while (true) { - it++; - if (it >= 1800) { - moduleResult.addGeneralFailure(new Error("Max iterations reached")); - return moduleResult; - } - const someFailure = executors.some((e) => e.isFailure()); const someHold = executors.some((e) => e.isHold()); let runningCount = executors.filter((e) => e.isRunning()).length; @@ -215,15 +214,16 @@ export class ExecutionEngine { moduleResult.addHold(bindingId, holdReason) ); - return moduleResult; + yield moduleResult; } for (const executor of ignitionModule.getExecutors()) { - this._log( - `Begin execution of executor ${executor.binding.id} of module ${ignitionModule.id}` - ); + this._debug(`Check ${ignitionModule.id}/${executor.binding.id}`); if (executor.isReady() && runningCount < parallelizationLevel) { + this._debug( + `Check dependencies of ${ignitionModule.id}/${executor.binding.id}` + ); const dependencies = executor.binding.getDependencies(); const allDependenciesReady = dependencies.every((d) => d.moduleId !== ignitionModule.id @@ -249,6 +249,7 @@ export class ExecutionEngine { this._options.txPollingInterval ); + this._debug(`Start ${ignitionModule.id}/${executor.binding.id}`); // eslint-disable-next-line @typescript-eslint/no-floating-promises executor.run(resolvedInput, services); runningCount++; @@ -256,16 +257,25 @@ export class ExecutionEngine { } if (!moduleResult.hasResult(executor.binding.id)) { + this._debug( + `Check result of ${ignitionModule.id}/${executor.binding.id}` + ); if (executor.isSuccess()) { + this._debug( + `${ignitionModule.id}/${executor.binding.id} finished successfully` + ); moduleResult.addResult(executor.binding.id, executor.getResult()); } if (executor.isHold()) { + this._debug( + `${ignitionModule.id}/${executor.binding.id} is on hold` + ); moduleResult.addHold(executor.binding.id, executor.getHoldReason()); } } } - await new Promise((res) => setTimeout(res, 100)); + yield; } } @@ -324,7 +334,8 @@ export class DeploymentResult { return [...this._results.values()]; } - public addResult(moduleId: string, moduleResult: ModuleResult) { + public addResult(moduleResult: ModuleResult) { + const moduleId = moduleResult.moduleId; if (this._results.has(moduleId)) { throw new Error(`A result for '${moduleId}' already exists`); } @@ -363,6 +374,19 @@ export class DeploymentResult { return; } + + public clone(): DeploymentResult { + const deploymentResult = new DeploymentResult(); + + for (const ignitionModule of this.getModules()) { + const moduleResult = new ModuleResult(ignitionModule.moduleId); + for (const [resultId, result] of ignitionModule.getResults()) { + moduleResult.addResult(resultId, result); + } + deploymentResult.addResult(moduleResult); + } + return deploymentResult; + } } export class ModuleResult { @@ -473,3 +497,24 @@ function createServices( return services; } + +export class ExecutionManager { + constructor( + private _engine: ExecutionEngine, + private _tickInterval: number + ) {} + + public async execute(dag: DAG): Promise { + const executionGenerator = this._engine.execute(dag); + + while (true) { + const deploymentResultIteration = await executionGenerator.next(); + + if (deploymentResultIteration.value !== undefined) { + return deploymentResultIteration.value; + } + + await sleep(this._tickInterval); + } + } +} diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index be7a7cd877..eb598372e3 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -1,3 +1,4 @@ +import debug, { IDebugger } from "debug"; import { ethers } from "ethers"; import { @@ -27,8 +28,13 @@ export abstract class Executor { private result?: any; private error?: any; private holdReason?: string; + private _debug: IDebugger; - constructor(public readonly binding: InternalBinding) {} + constructor(public readonly binding: InternalBinding) { + const moduleId = binding.moduleId; + const bindingId = binding.id; + this._debug = debug(`ignition:executor:${moduleId}:${bindingId}`); + } abstract execute(input: Resolved, services: Services): Promise; abstract validate(input: I, services: Services): Promise; @@ -37,16 +43,20 @@ export abstract class Executor { public async run(input: Resolved, services: Services) { try { services.logging.log(`[${this.binding.id}] Starting`); + this._debug("Start running"); this._setRunning(); const result = await this.execute(input, services); + this._debug("Ended successfully"); services.logging.log(`[${this.binding.id}] Successful`); this._setSuccess(result); } catch (e: any) { if (e instanceof Hold) { services.logging.log(`[${this.binding.id}] Hold: ${e.reason}`); + this._debug("Ended with hold"); this._setHold(e.reason); } else { services.logging.log(`[${this.binding.id}] Error: ${e.message}`); + this._debug("Ended with error"); this._setFailure(e); } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index cc986fad57..56f61b724c 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -13,6 +13,7 @@ import { import { DeploymentResult, ExecutionEngine, + ExecutionManager, ModuleResult, } from "./execution-engine"; import { Executor, Hold } from "./executors"; @@ -93,8 +94,13 @@ export class Ignition { } ); + const executionManager = new ExecutionManager( + engine, + txPollingInterval / 5 + ); + log("Execute deployment"); - const deploymentResult = await engine.execute(dag); + const deploymentResult = await executionManager.execute(dag); return [deploymentResult, moduleOutputs] as const; } diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 8c123e03db..1c321534a3 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -1,9 +1,15 @@ -import { expect } from "chai"; +import { assert } from "chai"; import { ExecutionEngine } from "../src/execution-engine"; import { NullJournal } from "../src/journal"; import { DAG } from "../src/modules"; -import { emptyDeploymentResult, getMockedProviders, inc } from "./helpers"; +import { + emptyDeploymentResult, + getMockedProviders, + inc, + runUntil, + runUntilReady, +} from "./helpers"; const executionEngineOptions = { parallelizationLevel: 1, @@ -27,21 +33,22 @@ describe("ExecutionEngine", function () { dag.addExecutor(inc1); // when - const deploymentResult = await executionEngine.execute(dag); + const executionGenerator = executionEngine.execute(dag); + const deploymentResult = await runUntilReady(executionGenerator); // then const resultModules = deploymentResult.getModules(); - expect(resultModules).to.have.length(1); + assert.lengthOf(resultModules, 1); const [resultModule] = resultModules; - expect(resultModule.isSuccess()).to.equal(true); - expect(resultModule.count()).to.equal(1); + assert.isTrue(resultModule.isSuccess()); + assert.equal(resultModule.count(), 1); const bindingResult = resultModule.getResult("inc1"); - expect(bindingResult).to.equal(2); + assert.equal(bindingResult, 2); - expect(inc1.isSuccess()).to.equal(true); + assert.isTrue(inc1.isSuccess()); }); it("should wait for a dependency", async function () { @@ -55,28 +62,41 @@ describe("ExecutionEngine", function () { const dag = new DAG(); const inc1 = inc("MyModule", "inc1", 1); + inc1.behavior = "on-demand"; const incInc1 = inc("MyModule", "incInc1", inc1.binding); dag.addExecutor(inc1); dag.addExecutor(incInc1); // when - const deploymentResult = await executionEngine.execute(dag); + const executionGenerator = executionEngine.execute(dag); + await runUntil(executionGenerator, () => { + return inc1.isRunning(); + }); + + // then + assert.isTrue(incInc1.isReady()); + + // when + inc1.finish(); + const deploymentResult = await runUntil(executionGenerator, (result) => { + return result !== undefined; + }); // then const resultModules = deploymentResult.getModules(); - expect(resultModules).to.have.length(1); - expect(resultModules[0].isSuccess()).to.equal(true); - expect(resultModules[0].count()).to.equal(2); + assert.lengthOf(resultModules, 1); + assert.isTrue(resultModules[0].isSuccess()); + assert.equal(resultModules[0].count(), 2); const inc1Result = resultModules[0].getResult("inc1"); const incInc1Result = resultModules[0].getResult("incInc1"); - expect(inc1Result).to.equal(2); - expect(incInc1Result).to.equal(3); + assert.equal(inc1Result, 2); + assert.equal(incInc1Result, 3); - expect(inc1.isSuccess()).to.equal(true); - expect(incInc1.isSuccess()).to.equal(true); + assert.isTrue(inc1.isSuccess()); + assert.isTrue(incInc1.isSuccess()); }); it("should not run an executor if a dependency fails", async function () { @@ -96,17 +116,18 @@ describe("ExecutionEngine", function () { dag.addExecutor(incInc1); // when - const deploymentResult = await executionEngine.execute(dag); + const executionGenerator = executionEngine.execute(dag); + const deploymentResult = await runUntilReady(executionGenerator); // then const resultModules = deploymentResult.getModules(); - expect(resultModules).to.have.length(1); - expect(resultModules[0].isSuccess()).to.equal(false); - expect(resultModules[0].isFailure()).to.equal(true); + assert.lengthOf(resultModules, 1); + assert.isFalse(resultModules[0].isSuccess()); + assert.isTrue(resultModules[0].isFailure()); - expect(inc1.isFailure()).to.equal(true); - expect(incInc1.isReady()).to.equal(true); + assert.isTrue(inc1.isFailure()); + assert.isTrue(incInc1.isReady()); }); it("should not run an executor if a dependency holds", async function () { @@ -126,15 +147,19 @@ describe("ExecutionEngine", function () { dag.addExecutor(incInc1); // when - const deploymentResult = await executionEngine.execute(dag); + const executionGenerator = executionEngine.execute(dag); + const deploymentResult = await runUntilReady(executionGenerator); // then + if (deploymentResult === undefined) { + assert.fail("Deployment result should be ready"); + } const resultModules = deploymentResult.getModules(); - expect(resultModules).to.have.length(1); - expect(resultModules[0].isHold()).to.equal(true); + assert.lengthOf(resultModules, 1); + assert.isTrue(resultModules[0].isHold()); - expect(inc1.isHold()).to.equal(true); - expect(incInc1.isReady()).to.equal(true); + assert.isTrue(inc1.isHold()); + assert.isTrue(incInc1.isReady()); }); }); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index d7aca0a7be..ca64a0a5c4 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -92,11 +92,16 @@ class IncreaseNumberBinding extends InternalBinding, number> { } class IncreaseNumberExecutor extends Executor, number> { - public behavior: "default" | "fail" | "hold" = "default"; + public behavior: "default" | "on-demand" | "fail" | "hold" = "default"; + public finish: any; public async execute(input: number): Promise { if (this.behavior === "default") { return input + 1; + } else if (this.behavior === "on-demand") { + return new Promise((resolve) => { + this.finish = () => resolve(input + 1); + }); } else if (this.behavior === "fail") { throw new Error("Fail"); } else if (this.behavior === "hold") { @@ -121,3 +126,27 @@ class IncreaseNumberExecutor extends Executor, number> { } } } + +export async function runUntil( + generator: AsyncGenerator, + condition: (result: DeploymentResult | undefined | void) => boolean, + extraTicks = 5 +) { + let result: any; + while (true) { + result = (await generator.next()).value; + if (condition(result)) { + break; + } + } + + for (let i = 0; i < extraTicks; i++) { + await generator.next(); + } + + return result; +} + +export async function runUntilReady(generator: AsyncGenerator) { + return runUntil(generator, (result) => result !== undefined); +} diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 43292dfe62..3f07944b84 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -24,6 +24,7 @@ "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "hardhat": "^2.0.0", "ignition": "^0.0.2", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 5588df4418..7e4dce8c0b 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -213,7 +213,7 @@ export class IgnitionWrapper { moduleResult.addResult(bindingId, deserializeBindingOutput(result)); } - deploymentResult.addResult(moduleId, moduleResult); + deploymentResult.addResult(moduleResult); } return deploymentResult; diff --git a/yarn.lock b/yarn.lock index aedcc0bbc7..a51a32ab01 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1638,6 +1638,14 @@ eslint-plugin-import@2.24.2: resolve "^1.20.0" tsconfig-paths "^3.11.0" +eslint-plugin-mocha@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz#b4457d066941eecb070dc06ed301c527d9c61b60" + integrity sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg== + dependencies: + eslint-utils "^3.0.0" + ramda "^0.27.1" + eslint-plugin-prettier@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" @@ -3388,6 +3396,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +ramda@^0.27.1: + version "0.27.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" + integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" From 1cb3bb71821c746736eaf8bb9d8c9c6045bb98a0 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 12 Nov 2021 11:12:35 -0300 Subject: [PATCH 0008/1302] Fix some issues --- examples/simple/contracts/Foo.sol | 8 +- examples/simple/ignition/MyModule.js | 4 +- packages/core/package.json | 7 +- packages/core/src/execution-engine.ts | 19 +++ packages/core/src/journal.ts | 3 + packages/core/src/services.ts | 12 +- packages/core/src/tx-sender.ts | 48 +++++++- packages/core/test/tx-sender.ts | 108 ++++++++++++++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 20 +++- .../minimal/contracts/Contracts.sol | 5 + packages/hardhat-plugin/test/helpers.ts | 36 +++++- packages/hardhat-plugin/test/integration.ts | 15 +++ yarn.lock | 107 ++++++++++++++++- 13 files changed, 363 insertions(+), 29 deletions(-) create mode 100644 packages/core/test/tx-sender.ts diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol index e593c5f62f..d9639d4a5e 100644 --- a/examples/simple/contracts/Foo.sol +++ b/examples/simple/contracts/Foo.sol @@ -1,11 +1,15 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; +import "hardhat/console.sol"; + contract Foo { uint public x = 10; - function inc() public { - x++; + function inc(uint n) public { + require(n > 0, "n must be positive"); + console.log("<<>>"); + x+=n; } } diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index d5e86e8e52..5c2d7121bd 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -3,7 +3,9 @@ const { buildModule } = require("ignition") module.exports = buildModule("MyModule", (m) => { const foo = m.contract("Foo") - m.call(foo, "inc") + m.call(foo, "inc", { + args: [1] + }) return { foo } }); diff --git a/packages/core/package.json b/packages/core/package.json index 5dc5f6ecc8..347ca8c2fb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -9,7 +9,8 @@ "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", "prettier": "prettier \"**/*.{js,md,json}\"", - "test": "mocha --recursive \"test/**/*.ts\"" + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='ignition:*' mocha --recursive \"test/**/*.ts\"" }, "devDependencies": { "@types/chai": "^4.2.22", @@ -17,6 +18,8 @@ "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", + "@types/sinon": "^10.0.6", + "@types/tmp": "^0.2.2", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", @@ -27,6 +30,8 @@ "eslint-plugin-prettier": "4.0.0", "mocha": "^9.1.3", "prettier": "2.4.1", + "sinon": "^12.0.1", + "tmp": "^0.2.1", "typescript": "^4.4.3" }, "dependencies": { diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 7870aed7c8..de0d081d11 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -144,6 +144,7 @@ export class ExecutionEngine { const txSender = new TxSender( ignitionModule.id, executor.binding.id, + this._providers.gasProvider, this._journal ); const services = createServices( @@ -240,6 +241,7 @@ export class ExecutionEngine { const txSender = new TxSender( ignitionModule.id, executor.binding.id, + this._providers.gasProvider, this._journal ); const services = createServices( @@ -375,6 +377,19 @@ export class DeploymentResult { return; } + public getFailures(): [string, Error[]] | undefined { + for (const [moduleId, moduleResult] of this._results.entries()) { + const failures = moduleResult.getFailures(); + if (failures.length > 0) { + return [moduleId, failures]; + } + + // TODO assert that only one module has failures + } + + return; + } + public clone(): DeploymentResult { const deploymentResult = new DeploymentResult(); @@ -473,6 +488,10 @@ export class ModuleResult { return [...this._holds.values()]; } + public getFailures(): Error[] { + return [...this._failures.values(), ...this._generalFailures]; + } + public count() { return [...this._results.values()].length; } diff --git a/packages/core/src/journal.ts b/packages/core/src/journal.ts index 7faefdfd79..3023657ebd 100644 --- a/packages/core/src/journal.ts +++ b/packages/core/src/journal.ts @@ -178,6 +178,9 @@ export class InMemoryJournal implements Journal { executorEntries.push(journalEntry); + moduleEntry.set(executorId, executorEntries); + this._journal.set(moduleId, moduleEntry); + return executorEntries.length - 1; } diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index 23e2106eb5..63032aa557 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -1,3 +1,4 @@ +import debug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; import { TxSender } from "./tx-sender"; @@ -11,6 +12,7 @@ interface TransactionOptions { } export class ContractsService { + private _debug = debug("ignition:services:contracts-service"); private _ethersProvider: ethers.providers.Web3Provider; constructor( @@ -28,6 +30,7 @@ export class ContractsService { args: any[], txOptions?: TransactionOptions ): Promise { + this._debug("Deploying contract"); // TODO this assumes the signer is connected const signer = await this._providers.signers.getDefaultSigner(); const Factory = new ContractFactory(artifact.abi, artifact.bytecode); @@ -44,6 +47,7 @@ export class ContractsService { args: any[], txOptions?: TransactionOptions ): Promise { + this._debug("Calling method of contract"); const signer = await this._providers.signers.getDefaultSigner(); const contract = new Contract(address, abi); @@ -96,18 +100,10 @@ export class ContractsService { ): Promise { if (txOptions?.gasLimit !== undefined) { tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); - } else { - const gasLimit = await this._providers.gasProvider.estimateGasLimit(tx); - - tx.gasLimit = gasLimit; } if (txOptions?.gasPrice !== undefined) { tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); - } else { - const gasPrice = await this._providers.gasProvider.estimateGasPrice(); - - tx.gasPrice = gasPrice; } let blockNumberWhenSent = await this._ethersProvider.getBlockNumber(); diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 0cadbd4972..17e3936d26 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -1,6 +1,7 @@ +import debug, { IDebugger } from "debug"; import { ethers } from "ethers"; import { Journal } from "./journal"; -import { IgnitionSigner } from "./providers"; +import { GasProvider, IgnitionSigner } from "./providers"; /** * Sends, replaces and keeps track of transactions. @@ -9,6 +10,8 @@ import { IgnitionSigner } from "./providers"; * Each transaction sent from that executor should go through this class. */ export class TxSender { + private _debug: IDebugger; + // Index of the last sent tx, or -1 if none was sent yet or // no journal is available private _txIndex = -1; @@ -16,8 +19,11 @@ export class TxSender { constructor( private _moduleId: string, private _executorId: string, + private _gasProvider: GasProvider, private _journal: Journal | undefined - ) {} + ) { + this._debug = debug(`ignition:tx-sender:${_moduleId}:${_executorId}`); + } /** * Sends `tx` using `signer`. @@ -34,18 +40,26 @@ export class TxSender { return [-1, hash]; } + const nextTxIndex = this._txIndex + 1; + this._debug(`Getting transaction ${nextTxIndex} from journal`); const journaledTx = await this._journal.getEntry( this._moduleId, this._executorId, - this._txIndex + nextTxIndex ); if (journaledTx !== undefined) { - this._txIndex += 1; + this._debug(`Transaction with index ${nextTxIndex} found in journal`); + this._txIndex = nextTxIndex; return [this._txIndex, journaledTx.txHash]; } - const sentTx = await signer.sendTransaction(tx); + this._debug( + `Transaction with index ${nextTxIndex} not found in journal, sending` + ); + + const sentTx = await this._send(signer, tx); + this._txIndex = await this._journal.addEntry( this._moduleId, this._executorId, @@ -71,7 +85,7 @@ export class TxSender { return hash; } - const sentTx = await signer.sendTransaction(tx); + const sentTx = await this._send(signer, tx); await this._journal.replaceEntry( this._moduleId, this._executorId, @@ -81,4 +95,26 @@ export class TxSender { return sentTx.hash; } + + private async _send( + signer: IgnitionSigner, + tx: ethers.providers.TransactionRequest + ): Promise { + if (tx.gasLimit === undefined) { + // TODO if this is implemented with ethers, the execution fails + // we should either handle it here, or make it part of the provider's + // contract that it shouldn't throw + const gasLimit = await this._gasProvider.estimateGasLimit(tx); + + tx.gasLimit = gasLimit; + } + + if (tx.gasPrice === undefined) { + const gasPrice = await this._gasProvider.estimateGasPrice(); + + tx.gasPrice = gasPrice; + } + + return signer.sendTransaction(tx); + } } diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts new file mode 100644 index 0000000000..13bd63deec --- /dev/null +++ b/packages/core/test/tx-sender.ts @@ -0,0 +1,108 @@ +import { assert } from "chai"; +import { ethers } from "ethers"; +import sinon from "sinon"; +import tmp from "tmp"; + +import { FileJournal, InMemoryJournal, Journal } from "../src/journal"; +import { GasProvider, IgnitionSigner } from "../src/providers"; +import { TxSender } from "../src/tx-sender"; + +class SignerSpy implements IgnitionSigner { + private _index = -1; + + public async sendTransaction(_tx: ethers.providers.TransactionRequest) { + this._index++; + return { + hash: `hash-${this._index}`, + } as ethers.providers.TransactionResponse; + } +} + +class MockGasProvider implements GasProvider { + public async estimateGasLimit( + _tx: ethers.providers.TransactionRequest + ): Promise { + return ethers.BigNumber.from(21000); + } + public async estimateGasPrice(): Promise { + return ethers.utils.parseUnits("1", "gwei"); + } +} + +function createSignerSpy() { + const signerSpy = new SignerSpy(); + + return sinon.spy(signerSpy); +} + +function createMockTx() { + return {} as ethers.providers.TransactionRequest; +} + +function runTests(createJournal: () => Journal) { + const mockGasProvider = new MockGasProvider(); + + it("should add two transactions to journal", async function () { + const txSender = new TxSender( + "MyModule", + "MyExecutor", + mockGasProvider, + createJournal() + ); + + const signerStub = createSignerSpy(); + const mockTx1 = createMockTx(); + const [txIndex1, hash1] = await txSender.send(signerStub, mockTx1, 0); + assert.equal(txIndex1, 0); + assert.equal(hash1, "hash-0"); + assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); + + const mockTx2 = createMockTx(); + const [txIndex2, hash2] = await txSender.send(signerStub, mockTx2, 0); + assert.equal(txIndex2, 1); + assert.equal(hash2, "hash-1"); + assert.isTrue(signerStub.sendTransaction.calledWith(mockTx2)); + }); + + it("should not re-send an already sent transaction", async function () { + const journal = createJournal(); + const txSender = new TxSender( + "MyModule", + "MyExecutor", + mockGasProvider, + journal + ); + + const signerStub = createSignerSpy(); + const mockTx1 = createMockTx(); + const [txIndex1, hash1] = await txSender.send(signerStub, mockTx1, 0); + assert.equal(txIndex1, 0); + assert.equal(hash1, "hash-0"); + assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); + signerStub.sendTransaction.resetHistory(); + + const txSender2 = new TxSender( + "MyModule", + "MyExecutor", + mockGasProvider, + journal + ); + const [txIndex2, hash2] = await txSender2.send(signerStub, mockTx1, 0); + assert.equal(txIndex2, 0); + assert.equal(hash2, "hash-0"); + assert.isFalse(signerStub.sendTransaction.called); + }); +} + +describe("TxSender", function () { + describe("in-memory journal", function () { + runTests(() => new InMemoryJournal()); + }); + + describe("file journal", function () { + runTests(() => { + const pathToJournal = tmp.tmpNameSync(); + return new FileJournal(pathToJournal); + }); + }); +}); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 7e4dce8c0b..8295b48700 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -64,12 +64,26 @@ export class IgnitionWrapper { this._deployOptions ); - const moduleHold = deploymentResult.isHold(); - if (moduleHold !== undefined) { - const [moduleId, holdReason] = moduleHold; + const moduleIdAndHoldReason = deploymentResult.isHold(); + if (moduleIdAndHoldReason !== undefined) { + const [moduleId, holdReason] = moduleIdAndHoldReason; throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); } + const moduleIdAndFailures = deploymentResult.getFailures(); + if (moduleIdAndFailures !== undefined) { + const [moduleId, failures] = moduleIdAndFailures; + + let failuresMessage = ""; + for (const failure of failures) { + failuresMessage += ` - ${failure.message}\n`; + } + + throw new Error( + `Execution failed for module '${moduleId}':\n\n${failuresMessage}` + ); + } + await this._saveDeploymentResult(chainId, deploymentResult); const resolvedOutputs: any = []; diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 157f665aef..174ff94005 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -5,6 +5,11 @@ contract Foo { function inc() public { x++; } + + function incByPositiveNumber(uint n) public { + require(n > 0, "n must be positive"); + x += n; + } } contract Bar { diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 7a9c6a9644..c7bcfde6d5 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -4,8 +4,20 @@ import { DeploymentResult, UserModule } from "ignition"; /** * Wait until there are at least `expectedCount` transactions in the mempool */ -export async function waitForPendingTxs(hre: any, expectedCount: number) { +export async function waitForPendingTxs( + hre: any, + expectedCount: number, + finished: Promise +) { + let stopWaiting = false; + finished.finally(() => { + stopWaiting = true; + }); + while (true) { + if (stopWaiting) { + return; + } const pendingBlock = await hre.network.provider.send( "eth_getBlockByNumber", ["pending", false] @@ -117,14 +129,30 @@ export async function deployModules( ); // eslint-disable-next-line @typescript-eslint/no-floating-promises - mineBlocks(hre, expectedBlocks); + mineBlocks(hre, expectedBlocks, deploymentResultPromise); return deploymentResultPromise; } -async function mineBlocks(hre: any, expectedBlocks: number[]) { +async function mineBlocks( + hre: any, + expectedBlocks: number[], + finished: Promise +) { for (const expectedPendingTxs of expectedBlocks) { - await waitForPendingTxs(hre, expectedPendingTxs); + await waitForPendingTxs(hre, expectedPendingTxs, finished); await hre.network.provider.send("evm_mine"); } } + +export async function assertRejects(fn: () => Promise) { + let rejected: boolean; + try { + await fn(); + rejected = false; + } catch (e) { + rejected = true; + } + + assert.isTrue(rejected, "Expected function to reject"); +} diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index c90d6844a9..70ba590bef 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -2,6 +2,7 @@ import { assert } from "chai"; import { buildModule } from "ignition"; import { assertDeploymentResult, + assertRejects, deployModules, resultAssertions, } from "./helpers"; @@ -182,4 +183,18 @@ describe("integration tests", function () { }, }); }); + + it("should fail if a call fails", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [0], + }); + }); + + // then + await assertRejects(() => deployModules(this.hre, [userModule], [1, 1])); + }); }); diff --git a/yarn.lock b/yarn.lock index a51a32ab01..d85e158549 100644 --- a/yarn.lock +++ b/yarn.lock @@ -582,6 +582,41 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/fake-timers@^8.1.0": + version "8.1.0" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" + integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== + dependencies: + "@sinonjs/commons" "^1.6.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + +"@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + "@solidity-parser/parser@^0.11.0": version "0.11.1" resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" @@ -728,6 +763,18 @@ dependencies: "@types/node" "*" +"@types/sinon@^10.0.6": + version "10.0.6" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.6.tgz#bc3faff5154e6ecb69b797d311b7cf0c1b523a1d" + integrity sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg== + dependencies: + "@sinonjs/fake-timers" "^7.1.0" + +"@types/tmp@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.2.tgz#424537a3b91828cb26aaf697f21ae3cd1b69f7e7" + integrity sha512-MhSa0yylXtVMsyT8qFpHA1DLHj4DvQGH5ntxrhHSh8PxUVNi35Wk+P5hVgqbO2qZqOotqr9jaoPRL+iRjWYm/A== + "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" @@ -1448,7 +1495,7 @@ diff@3.5.0: resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== -diff@5.0.0: +diff@5.0.0, diff@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== @@ -2571,6 +2618,11 @@ is-weakref@^1.0.1: dependencies: call-bind "^1.0.0" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -2673,6 +2725,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +just-extend@^4.0.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== + keccak@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" @@ -2806,6 +2863,11 @@ lodash.clonedeep@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -3061,6 +3123,17 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nise@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" + integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== + dependencies: + "@sinonjs/commons" "^1.7.0" + "@sinonjs/fake-timers" "^7.0.4" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + path-to-regexp "^1.7.0" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" @@ -3287,6 +3360,13 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== + dependencies: + isarray "0.0.1" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -3510,7 +3590,7 @@ rimraf@^2.2.8: dependencies: glob "^7.1.3" -rimraf@^3.0.2: +rimraf@^3.0.0, rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== @@ -3658,6 +3738,18 @@ signal-exit@^3.0.0: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== +sinon@^12.0.1: + version "12.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-12.0.1.tgz#331eef87298752e1b88a662b699f98e403c859e9" + integrity sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg== + dependencies: + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" "^8.1.0" + "@sinonjs/samsam" "^6.0.2" + diff "^5.0.0" + nise "^5.1.0" + supports-color "^7.2.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -3868,7 +3960,7 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.1.0: +supports-color@^7.1.0, supports-color@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== @@ -3909,6 +4001,13 @@ tmp@0.0.33: dependencies: os-tmpdir "~1.0.2" +tmp@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -3993,7 +4092,7 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== From 46a4b08659ed574fe1937cb9eebb7b2e52c21e3f Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 16 Nov 2021 07:10:27 -0300 Subject: [PATCH 0009/1302] Make journal mandatory in TxSender --- packages/core/src/tx-sender.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 17e3936d26..39fd0985c9 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -12,15 +12,14 @@ import { GasProvider, IgnitionSigner } from "./providers"; export class TxSender { private _debug: IDebugger; - // Index of the last sent tx, or -1 if none was sent yet or - // no journal is available + // Index of the last sent tx, or -1 if none was sent yet private _txIndex = -1; constructor( private _moduleId: string, private _executorId: string, private _gasProvider: GasProvider, - private _journal: Journal | undefined + private _journal: Journal ) { this._debug = debug(`ignition:tx-sender:${_moduleId}:${_executorId}`); } @@ -35,11 +34,6 @@ export class TxSender { tx: ethers.providers.TransactionRequest, blockNumberWhenSent: number ): Promise<[number, string]> { - if (this._journal === undefined) { - const { hash } = await signer.sendTransaction(tx); - return [-1, hash]; - } - const nextTxIndex = this._txIndex + 1; this._debug(`Getting transaction ${nextTxIndex} from journal`); const journaledTx = await this._journal.getEntry( @@ -80,11 +74,6 @@ export class TxSender { blockNumberWhenSent: number, txIndex: number ): Promise { - if (this._journal === undefined) { - const { hash } = await signer.sendTransaction(tx); - return hash; - } - const sentTx = await this._send(signer, tx); await this._journal.replaceEntry( this._moduleId, From f48f60f7a65dfce350d7cb8cbed5be5456f466e2 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 16 Nov 2021 07:15:43 -0300 Subject: [PATCH 0010/1302] Add CI --- .github/workflows/ci.yml | 66 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000000..1bc22aaba1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,66 @@ +name: CI + +on: + push: + branches: [$default-branch] + pull_request: + branches: + - "*" + +jobs: + test_on_windows: + name: Test Ignition on Windows with Node 12 + runs-on: windows-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 12 + cache: yarn + - name: Install + run: yarn --frozen-lockfile + - name: Build + run: yarn build + - name: Lint + run: yarn lint + - name: Run tests + run: yarn test + + test_on_macos: + name: Test Ignition on MacOS with Node 12 + runs-on: macos-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: 12 + cache: yarn + - name: Install + run: yarn --frozen-lockfile + - name: Build + run: yarn build + - name: Lint + run: yarn lint + - name: Run tests + run: yarn test + + test_on_linux: + name: Test Ignition on Ubuntu with Node ${{ matrix.node }} + runs-on: ubuntu-latest + strategy: + matrix: + node: [12, 14, 16] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node }} + cache: yarn + - name: Install + run: yarn --frozen-lockfile + - name: Build + run: yarn build + - name: Lint + run: yarn lint + - name: Run tests + run: yarn test From 2100eb9defb8604499207a7a0c0bbcd8fef6a4d6 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 16 Nov 2021 07:21:43 -0300 Subject: [PATCH 0011/1302] Add .gitattributes --- .gitattributes | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..ce44bbb079 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# prevent github actions to checkout files with crlf line endings +* text=auto eol=lf From d7e7bd9db8bb8c352b33dee140e1231753e46bc7 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Tue, 16 Nov 2021 07:24:53 -0300 Subject: [PATCH 0012/1302] Use double quotes in eslint npm scripts --- packages/core/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 347ca8c2fb..8bbc057504 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,7 +7,7 @@ "build": "tsc", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' mocha --recursive \"test/**/*.ts\"" diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3f07944b84..87f095a258 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -7,7 +7,7 @@ "build": "tsc", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint 'src/**/*.ts' 'test/**/*.ts'", + "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"" }, From 53113a0d32bfbf6410649e839849052b3480aad3 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 19 Nov 2021 07:37:11 -0300 Subject: [PATCH 0013/1302] Handle all pending TODOs --- config/eslint/eslintrc.js | 1 + examples/simple/contracts/Foo.sol | 1 - examples/simple/hardhat.config.js | 6 +- examples/simple/ignition/MyOtherModule.js | 15 ++ packages/core/package.json | 10 +- packages/core/src/execution-engine.ts | 99 ++++---- packages/core/src/executors.ts | 8 +- packages/core/src/modules.ts | 2 - packages/core/src/services.ts | 20 +- packages/core/src/tx-sender.ts | 3 - packages/core/src/ui/components/index.tsx | 107 +++++++++ packages/core/src/ui/ui-data.ts | 192 +++++++++++++++ packages/core/src/ui/ui-service.tsx | 65 ++++++ packages/core/test/execution-engine.ts | 2 +- packages/core/tsconfig.json | 3 +- packages/core/ui-samples/index.tsx | 111 +++++++++ packages/core/ui-samples/types.ts | 10 + yarn.lock | 273 +++++++++++++++++++++- 18 files changed, 841 insertions(+), 87 deletions(-) create mode 100644 examples/simple/ignition/MyOtherModule.js create mode 100644 packages/core/src/ui/components/index.tsx create mode 100644 packages/core/src/ui/ui-data.ts create mode 100644 packages/core/src/ui/ui-service.tsx create mode 100644 packages/core/ui-samples/index.tsx create mode 100644 packages/core/ui-samples/types.ts diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index febaad417c..f569962dfc 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -168,6 +168,7 @@ module.exports = { "no-bitwise": "error", "no-caller": "error", "no-cond-assign": "error", + "no-return-assign": ["error", "always"], "no-debugger": "error", "no-duplicate-case": "error", "no-duplicate-imports": "error", diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol index d9639d4a5e..76cc9196b8 100644 --- a/examples/simple/contracts/Foo.sol +++ b/examples/simple/contracts/Foo.sol @@ -8,7 +8,6 @@ contract Foo { function inc(uint n) public { require(n > 0, "n must be positive"); - console.log("<<>>"); x+=n; } } diff --git a/examples/simple/hardhat.config.js b/examples/simple/hardhat.config.js index 770b94f887..ec33e0a82a 100644 --- a/examples/simple/hardhat.config.js +++ b/examples/simple/hardhat.config.js @@ -4,9 +4,9 @@ module.exports = { solidity: "0.8.5", networks: { hardhat: { - // mining: { - // auto: false - // }, + mining: { + // auto: false + }, initialBaseFeePerGas: 1_000_000_000 }, }, diff --git a/examples/simple/ignition/MyOtherModule.js b/examples/simple/ignition/MyOtherModule.js new file mode 100644 index 0000000000..8c47dae414 --- /dev/null +++ b/examples/simple/ignition/MyOtherModule.js @@ -0,0 +1,15 @@ +const { buildModule } = require("ignition") + +module.exports = buildModule("MyOtherModule", (m) => { + const foo = m.contract("Foo") + const foo2 = m.contract("Foo", { id: "Foo2" }) + + m.call(foo, "inc", { + args: [1] + }) + m.call(foo2, "inc", { + args: [1] + }) + + return { foo } +}); diff --git a/packages/core/package.json b/packages/core/package.json index 8bbc057504..329e6ce7de 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -10,7 +10,8 @@ "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='ignition:*' mocha --recursive \"test/**/*.ts\"" + "test:debug": "DEBUG='ignition:*' mocha --recursive \"test/**/*.ts\"", + "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx" }, "devDependencies": { "@types/chai": "^4.2.22", @@ -32,11 +33,16 @@ "prettier": "2.4.1", "sinon": "^12.0.1", "tmp": "^0.2.1", + "ts-node": "^10.4.0", "typescript": "^4.4.3" }, "dependencies": { + "@types/react": "^17.0.35", "debug": "^4.3.2", "ethers": "^5.4.7", - "fs-extra": "^10.0.0" + "fs-extra": "^10.0.0", + "ink": "^3.2.0", + "ink-spinner": "^4.0.3", + "react": "^17.0.2" } } diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index de0d081d11..cd12297c80 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -8,11 +8,13 @@ import { Providers } from "./providers"; import { ArtifactsService, ContractsService, - LoggingService, + UiService, Services, TransactionsService, + ExecutorUiService, } from "./services"; import { sleep } from "./utils"; +import { UiData } from "./ui/ui-data"; interface ExecutionEngineOptions { parallelizationLevel: number; @@ -58,19 +60,30 @@ export class ExecutionEngine { constructor( private _providers: Providers, private _journal: Journal, - private _currentDeploymentResult: DeploymentResult, + private _previousDeploymentResult: DeploymentResult, private _options: ExecutionEngineOptions ) {} public async *execute(dag: DAG) { - const deploymentResult = this._currentDeploymentResult.clone(); + const deploymentResult = this._previousDeploymentResult.clone(); + + const ids: Record = {}; + const modules = dag.getSortedModules(); + modules.forEach((module) => { + ids[module.id] = module.getSortedExecutors().map((e) => e.binding.id); + }); + + const uiService = new UiService({ + enabled: this._options.loggingEnabled, + uiData: new UiData(ids), + }); // validate all modules const errorsPerModule: Map = new Map(); let hasErrors = false; for (const ignitionModule of dag.getModules()) { this._debug(`Validating module ${ignitionModule.id}`); - const errors = await this._validateModule(ignitionModule); + const errors = await this._validateModule(ignitionModule, uiService); if (errors.length > 0) { hasErrors = true; } @@ -117,7 +130,8 @@ export class ExecutionEngine { this._debug(`Executing module ${ignitionModule.id}`); const moduleExecutionGenerator = this._executeModule( ignitionModule, - deploymentResult + deploymentResult, + uiService ); for await (const moduleResult of moduleExecutionGenerator) { if (moduleResult !== undefined) { @@ -132,7 +146,8 @@ export class ExecutionEngine { } private async _validateModule( - ignitionModule: IgnitionModule + ignitionModule: IgnitionModule, + uiService: UiService ): Promise { const executors = ignitionModule.getExecutors(); const allErrors: string[] = []; @@ -141,17 +156,10 @@ export class ExecutionEngine { this._debug( `Validating binding ${executor.binding.id} of module ${ignitionModule.id}` ); - const txSender = new TxSender( + const services = this._createServices( ignitionModule.id, executor.binding.id, - this._providers.gasProvider, - this._journal - ); - const services = createServices( - this._providers, - txSender, - this._options.loggingEnabled, - this._options.txPollingInterval + uiService ); const errors = await executor.validate(executor.binding.input, services); @@ -165,7 +173,8 @@ export class ExecutionEngine { private async *_executeModule( ignitionModule: IgnitionModule, - deploymentResult: DeploymentResult + deploymentResult: DeploymentResult, + uiService: UiService ) { const { parallelizationLevel } = this._options; const executors = ignitionModule.getExecutors(); @@ -238,17 +247,10 @@ export class ExecutionEngine { deploymentResult, moduleResult ); - const txSender = new TxSender( + const services = this._createServices( ignitionModule.id, executor.binding.id, - this._providers.gasProvider, - this._journal - ); - const services = createServices( - this._providers, - txSender, - this._options.loggingEnabled, - this._options.txPollingInterval + uiService ); this._debug(`Start ${ignitionModule.id}/${executor.binding.id}`); @@ -316,6 +318,30 @@ export class ExecutionEngine { return input; } + + private _createServices( + moduleId: string, + executorId: string, + uiService: UiService + ): Services { + const txSender = new TxSender( + moduleId, + executorId, + this._providers.gasProvider, + this._journal + ); + + const services: Services = { + artifacts: new ArtifactsService(this._providers), + contracts: new ContractsService(this._providers, txSender, { + pollingInterval: this._options.txPollingInterval, + }), + transactions: new TransactionsService(this._providers), + ui: new ExecutorUiService(moduleId, executorId, uiService), + }; + + return services; + } } export class DeploymentResult { @@ -383,8 +409,6 @@ export class DeploymentResult { if (failures.length > 0) { return [moduleId, failures]; } - - // TODO assert that only one module has failures } return; @@ -405,7 +429,6 @@ export class DeploymentResult { } export class ModuleResult { - // TODO merge these three into a single map private _results = new Map(); private _failures = new Map(); private _holds = new Map(); @@ -497,26 +520,6 @@ export class ModuleResult { } } -function createServices( - providers: Providers, - txSender: TxSender, - loggingEnabled: boolean, - txPollingInterval: number -): Services { - const services: Services = { - artifacts: new ArtifactsService(providers), - contracts: new ContractsService(providers, txSender, { - pollingInterval: txPollingInterval, - }), - transactions: new TransactionsService(providers), - logging: new LoggingService({ - enabled: loggingEnabled, - }), - }; - - return services; -} - export class ExecutionManager { constructor( private _engine: ExecutionEngine, diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index eb598372e3..76d1298826 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -42,20 +42,20 @@ export abstract class Executor { public async run(input: Resolved, services: Services) { try { - services.logging.log(`[${this.binding.id}] Starting`); + services.ui.executorStart(); this._debug("Start running"); this._setRunning(); const result = await this.execute(input, services); this._debug("Ended successfully"); - services.logging.log(`[${this.binding.id}] Successful`); + services.ui.executorSuccessful(); this._setSuccess(result); } catch (e: any) { if (e instanceof Hold) { - services.logging.log(`[${this.binding.id}] Hold: ${e.reason}`); + services.ui.executorHold(e.reason); this._debug("Ended with hold"); this._setHold(e.reason); } else { - services.logging.log(`[${this.binding.id}] Error: ${e.message}`); + services.ui.executorFailure(e.message); this._debug("Ended with error"); this._setFailure(e); } diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts index 8670afd49b..1da9171af6 100644 --- a/packages/core/src/modules.ts +++ b/packages/core/src/modules.ts @@ -19,7 +19,6 @@ export class IgnitionModule { } public getSortedExecutors(): Executor[] { - // TODO awful algorithm, can be optimized const dependencies = new Map>(); for (const executor of this._executors) { @@ -95,7 +94,6 @@ export class DAG { } public getSortedModules(): IgnitionModule[] { - // TODO awful algorithm, can be optimized const added = new Set(); const ignitionModules = this.getModules(); const sortedModules: IgnitionModule[] = []; diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index 63032aa557..c568e8bd0c 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -5,6 +5,9 @@ import { TxSender } from "./tx-sender"; import { IgnitionSigner, Providers } from "./providers"; import { Artifact } from "./types"; import { sleep } from "./utils"; +import { ExecutorUiService, UiService } from "./ui/ui-service"; + +export { ExecutorUiService, UiService }; interface TransactionOptions { gasLimit?: ethers.BigNumberish; @@ -31,7 +34,6 @@ export class ContractsService { txOptions?: TransactionOptions ): Promise { this._debug("Deploying contract"); - // TODO this assumes the signer is connected const signer = await this._providers.signers.getDefaultSigner(); const Factory = new ContractFactory(artifact.abi, artifact.bytecode); @@ -225,23 +227,9 @@ export class TransactionsService { } } -export class LoggingService { - private _enabled: boolean; - constructor({ enabled }: { enabled: boolean }) { - this._enabled = enabled; - } - - public log(...args: string[]) { - if (this._enabled) { - // eslint-disable-next-line no-console - console.log(...args); - } - } -} - export interface Services { contracts: ContractsService; artifacts: ArtifactsService; transactions: TransactionsService; - logging: LoggingService; + ui: ExecutorUiService; } diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 39fd0985c9..411024e25a 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -90,9 +90,6 @@ export class TxSender { tx: ethers.providers.TransactionRequest ): Promise { if (tx.gasLimit === undefined) { - // TODO if this is implemented with ethers, the execution fails - // we should either handle it here, or make it part of the provider's - // contract that it shouldn't throw const gasLimit = await this._gasProvider.estimateGasLimit(tx); tx.gasLimit = gasLimit; diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx new file mode 100644 index 0000000000..cbfd28c8a6 --- /dev/null +++ b/packages/core/src/ui/components/index.tsx @@ -0,0 +1,107 @@ +import React from "react"; +import { Box, Text } from "ink"; +import Spinner from "ink-spinner"; + +import { UiData, UiExecutor, UiModule } from "../ui-data"; + +export const IgnitionUi = ({ uiData }: { uiData: UiData }) => { + const currentModule = uiData.getCurrentModule(); + + const successfulModules = uiData.getSuccessfulModules(); + + return ( + +
+ + + + + + + + ); +}; + +const Header = ({ uiData }: { uiData: UiData }) => { + return ( + + + {uiData.getDeployedModulesCount()} of {uiData.getModulesCount()} modules + deployed + + + ); +}; + +const CurrentModule = ({ module }: { module?: UiModule }) => { + if (module === undefined) { + return null; + } + + const executors = [...module.executors.values()]; + + return ( + + + + Deploying {module.id} + + + + {executors.sort(compareExecutors).map((e) => ( + + ))} + + + ); +}; + +function compareExecutors(a: UiExecutor, b: UiExecutor): number { + const value = (s: UiExecutor["status"]) => { + if (s === "success" || s === "failure" || s === "hold") { + return 0; + } + if (s === "executing") { + return 1; + } + if (s === "ready") { + return 2; + } + const _exhaustiveCheck: never = s; + return s; + }; + + const aValue = value(a.status); + const bValue = value(b.status); + return aValue - bValue; +} + +const Executor = ({ executor }: { executor: UiExecutor }) => { + return ( + + {executor.status === "executing" ? ( + {executor.id}: Executing + ) : executor.status === "success" ? ( + {executor.id}: Executed + ) : executor.status === "ready" ? ( + {executor.id}: Waiting + ) : null} + + ); +}; + +const SuccessfulModules = ({ modules }: { modules: UiModule[] }) => { + if (modules.length === 0) { + return null; + } + + return ( + + {modules.map((m) => ( + + Deployed {m.id} + + ))} + + ); +}; diff --git a/packages/core/src/ui/ui-data.ts b/packages/core/src/ui/ui-data.ts new file mode 100644 index 0000000000..7dc8684e86 --- /dev/null +++ b/packages/core/src/ui/ui-data.ts @@ -0,0 +1,192 @@ +export interface UiExecutor { + id: string; + status: "ready" | "executing" | "success" | "failure" | "hold"; + message?: string; +} + +export interface UiModule { + id: string; + status: "ready" | "deploying" | "deployed"; + executors: Map; +} + +export class UiData { + private _modules: Map; + + constructor(ids: Record) { + this._modules = new Map(); + + for (const [moduleId, executorIds] of Object.entries(ids)) { + const executors: Map = new Map(); + for (const executorId of executorIds) { + executors.set(executorId, { + id: executorId, + status: "ready", + }); + } + this._modules.set(moduleId, { + id: moduleId, + status: "ready", + executors, + }); + } + } + + public executorStart(moduleId: string, executorId: string) { + const module = this._getModule(moduleId); + + if (module.status === "ready") { + module.status = "deploying"; + } else if (module.status !== "deploying") { + throw new Error( + `[Assertion error] Module ${moduleId} should be ready or deploying` + ); + } + + const executor = this._getExecutor(moduleId, executorId); + + if (executor.status !== "ready") { + throw new Error( + `[Assertion error] Executor ${executorId} should be ready` + ); + } + + executor.status = "executing"; + } + + public executorSuccessful(moduleId: string, executorId: string) { + const module = this._getModule(moduleId); + + if (module.status !== "deploying") { + throw new Error( + `[Assertion error] Module ${moduleId} should be deploying` + ); + } + + const executor = this._getExecutor(moduleId, executorId); + + if (executor.status !== "executing") { + throw new Error( + `[Assertion error] Executor ${executorId} should be executing` + ); + } + + executor.status = "success"; + + if (this._isModuleFinished(module)) { + module.status = "deployed"; + } + } + + public executorHold(moduleId: string, executorId: string, _reason: string) { + const module = this._getModule(moduleId); + + if (module.status !== "deploying") { + throw new Error( + `[Assertion error] Module ${moduleId} should be deploying` + ); + } + + const executor = this._getExecutor(moduleId, executorId); + + if (executor.status !== "executing") { + throw new Error( + `[Assertion error] Executor ${executorId} should be executing` + ); + } + + executor.status = "hold"; + + if (this._isModuleFinished(module)) { + module.status = "deployed"; + } + } + + public executorFailure( + moduleId: string, + executorId: string, + _reason: string + ) { + const module = this._getModule(moduleId); + + if (module.status !== "deploying") { + throw new Error( + `[Assertion error] Module ${moduleId} should be deploying` + ); + } + + const executor = this._getExecutor(moduleId, executorId); + + if (executor.status !== "executing") { + throw new Error( + `[Assertion error] Executor ${executorId} should be executing` + ); + } + + executor.status = "failure"; + + if (this._isModuleFinished(module)) { + module.status = "deployed"; + } + } + + public getSuccessfulModules() { + return [...this._modules.values()].filter((m) => m.status === "deployed"); + } + + public getModulesCount(): number { + return this._modules.size; + } + + public getDeployedModulesCount(): number { + const modules = [...this._modules.values()]; + return modules.filter((m) => m.status === "deployed").length; + } + + public getCurrentModule(): UiModule | undefined { + const modulesBeingDeployed = [...this._modules.values()].filter( + (m) => m.status === "deploying" + ); + + if (modulesBeingDeployed.length === 0) { + return; + } + + if (modulesBeingDeployed.length > 1) { + throw new Error( + `[Assertion error] Only one module should be deployed at the same time` + ); + } + + return modulesBeingDeployed[0]; + } + + private _getModule(moduleId: string): UiModule { + const module = this._modules.get(moduleId); + + if (module === undefined) { + throw new Error(`[Assertion error] Expected module ${moduleId} to exist`); + } + + return module; + } + + private _getExecutor(moduleId: string, executorId: string): UiExecutor { + const executor = this._modules.get(moduleId)?.executors.get(executorId); + + if (executor === undefined) { + throw new Error( + `[Assertion error] Expected executor ${moduleId}/${executorId} to exist` + ); + } + + return executor; + } + + private _isModuleFinished(module: UiModule) { + return [...module.executors.values()].every( + (e) => + e.status === "success" || e.status === "hold" || e.status === "failure" + ); + } +} diff --git a/packages/core/src/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx new file mode 100644 index 0000000000..ff7e22f87e --- /dev/null +++ b/packages/core/src/ui/ui-service.tsx @@ -0,0 +1,65 @@ +import React from "react"; +import { render } from "ink"; + +import { IgnitionUi } from "./components"; +import { UiData } from "./ui-data"; + +export class ExecutorUiService { + constructor( + private _moduleId: string, + private _executorId: string, + private _uiService: UiService + ) {} + + public executorStart() { + this._uiService.executorStart(this._moduleId, this._executorId); + } + + public executorSuccessful() { + this._uiService.executorSuccessful(this._moduleId, this._executorId); + } + + public executorHold(reason: string) { + this._uiService.executorHold(this._moduleId, this._executorId, reason); + } + + public executorFailure(reason: string) { + this._uiService.executorFailure(this._moduleId, this._executorId, reason); + } +} + +export class UiService { + private _enabled: boolean; + private _uiData: UiData; + + constructor({ enabled, uiData }: { enabled: boolean; uiData: UiData }) { + this._enabled = enabled; + this._uiData = uiData; + } + + public executorStart(moduleId: string, executorId: string) { + this._uiData.executorStart(moduleId, executorId); + this._render(); + } + + public executorSuccessful(moduleId: string, executorId: string) { + this._uiData.executorSuccessful(moduleId, executorId); + this._render(); + } + + public executorHold(moduleId: string, executorId: string, reason: string) { + this._uiData.executorHold(moduleId, executorId, reason); + this._render(); + } + + public executorFailure(moduleId: string, executorId: string, reason: string) { + this._uiData.executorFailure(moduleId, executorId, reason); + this._render(); + } + + private _render() { + if (this._enabled) { + render(); + } + } +} diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 1c321534a3..53bc8d2d9b 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -17,7 +17,7 @@ const executionEngineOptions = { txPollingInterval: 100, }; -describe("ExecutionEngine", function () { +describe.only("ExecutionEngine", function () { it("should run a single module with a single executor", async function () { // given const executionEngine = new ExecutionEngine( diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index b594e9bef3..337a9caae0 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -9,7 +9,8 @@ "declarationMap": true, "sourceMap": true, "strict": true, - "esModuleInterop": true + "esModuleInterop": true, + "jsx": "react-jsx" }, "exclude": ["dist", "node_modules"], "include": ["./test", "./src"] diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx new file mode 100644 index 0000000000..bb2462d969 --- /dev/null +++ b/packages/core/ui-samples/index.tsx @@ -0,0 +1,111 @@ +import { render, useInput } from "ink"; +import { useRef, useState } from "react"; + +import { IgnitionUi } from "../src/ui/components"; +import { UiData } from "../src/ui/ui-data"; + +import { Example } from "./types"; + +async function main() { + const examples = getExamples(); + + for (const example of examples) { + console.log(example.description); + console.log(example.description.replace(/./g, "=")); + console.log(); + + await renderExample(example); + + console.log(); + } +} + +function getExamples(): Example[] { + const examples: Example[] = []; + + examples.push({ + description: "Single module with single contract", + initialData: { + MyModule: ["Foo"], + }, + transitions: [ + (d) => d.startExecutor("MyModule", "Foo"), + (d) => d.finishExecutor("MyModule", "Foo"), + ], + }); + + examples.push({ + description: "Single module with two contracts deployed in parallel", + initialData: { + MyModule: ["Foo", "Bar"], + }, + transitions: [ + (d) => { + d.startExecutor("MyModule", "Foo"); + d.startExecutor("MyModule", "Bar"); + }, + (d) => d.finishExecutor("MyModule", "Bar"), + (d) => d.finishExecutor("MyModule", "Foo"), + ], + }); + + examples.push({ + description: "Two modules", + initialData: { + MyModule: ["Foo"], + MyOtherModule: ["Bar"], + }, + transitions: [ + (d) => d.startExecutor("MyModule", "Foo"), + (d) => d.finishExecutor("MyModule", "Foo"), + (d) => d.startExecutor("MyOtherModule", "Bar"), + (d) => d.finishExecutor("MyOtherModule", "Bar"), + ], + }); + + if (examples.some((x) => x.only)) { + return examples.filter((x) => x.only); + } + + return examples; +} + +function renderExample(example: Example) { + return new Promise((resolve) => { + const { unmount } = render( + { + unmount(); + resolve(); + }} + /> + ); + }); +} + +const ExampleRenderer = ({ + example: { initialData, transitions }, + onFinish, +}: { + example: Example; + onFinish: () => void; +}) => { + const uiData = useRef(new UiData(initialData)); + const [transitionIndex, setTransitionIndex] = useState(0); + + useInput((input, key) => { + if (input === "n") { + if (transitionIndex < transitions.length) { + transitions[transitionIndex](uiData.current); + setTransitionIndex(transitionIndex + 1); + } else { + onFinish(); + } + } + }); + + return ; +}; + +main(); diff --git a/packages/core/ui-samples/types.ts b/packages/core/ui-samples/types.ts new file mode 100644 index 0000000000..d46a123647 --- /dev/null +++ b/packages/core/ui-samples/types.ts @@ -0,0 +1,10 @@ +import { UiData } from "../src/ui/ui-data"; + +type ExampleTransition = (d: UiData) => void; + +export interface Example { + only?: boolean; + description: string; + initialData: Record; + transitions: ExampleTransition[]; +} diff --git a/yarn.lock b/yarn.lock index d85e158549..2a83d5919f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -756,6 +756,25 @@ dependencies: "@types/node" "*" +"@types/prop-types@*": + version "15.7.4" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" + integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + +"@types/react@^17.0.35": + version "17.0.35" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.35.tgz#217164cf830267d56cd1aec09dcf25a541eedd4c" + integrity sha512-r3C8/TJuri/SLZiiwwxQoLAoavaczARfT9up9b4Jr65+ErAUX3MIkU0oMOQnrpfgHme8zIqZLX7O5nnjm5Wayw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/scheduler@*": + version "0.16.2" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" + integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + "@types/secp256k1@^4.0.1": version "4.0.3" resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" @@ -787,6 +806,11 @@ dependencies: "@types/yargs-parser" "*" +"@types/yoga-layout@1.9.2": + version "1.9.2" + resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" + integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== + "@typescript-eslint/eslint-plugin@4.31.2": version "4.31.2" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" @@ -957,7 +981,7 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.3.0: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== @@ -1067,6 +1091,11 @@ async@^2.4.0: dependencies: lodash "^4.17.14" +auto-bind@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" @@ -1297,6 +1326,31 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +cli-boxes@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-spinners@^2.3.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" + integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + +cli-truncate@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" + integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== + dependencies: + slice-ansi "^3.0.0" + string-width "^4.2.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1315,6 +1369,13 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +code-excerpt@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" + integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== + dependencies: + convert-to-spaces "^1.0.1" + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1354,6 +1415,11 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= +convert-to-spaces@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" + integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= + cookie@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" @@ -1420,6 +1486,11 @@ cross-spawn@^7.0.2: shebang-command "^2.0.0" which "^2.0.1" +csstype@^3.0.2: + version "3.0.10" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" + integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + debug@3.2.6: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -1642,6 +1713,11 @@ escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + eslint-config-prettier@8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" @@ -2445,6 +2521,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -2458,6 +2539,42 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ink-spinner@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-4.0.3.tgz#0d0f4a787ae1a4270928e063d9c52527cb264feb" + integrity sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ== + dependencies: + cli-spinners "^2.3.0" + +ink@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" + integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== + dependencies: + ansi-escapes "^4.2.1" + auto-bind "4.0.0" + chalk "^4.1.0" + cli-boxes "^2.2.0" + cli-cursor "^3.1.0" + cli-truncate "^2.1.0" + code-excerpt "^3.0.0" + indent-string "^4.0.0" + is-ci "^2.0.0" + lodash "^4.17.20" + patch-console "^1.0.0" + react-devtools-core "^4.19.1" + react-reconciler "^0.26.2" + scheduler "^0.20.2" + signal-exit "^3.0.2" + slice-ansi "^3.0.0" + stack-utils "^2.0.2" + string-width "^4.2.2" + type-fest "^0.12.0" + widest-line "^3.1.0" + wrap-ansi "^6.2.0" + ws "^7.5.5" + yoga-layout-prebuilt "^1.9.6" + internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -2511,6 +2628,13 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-ci@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" + integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== + dependencies: + ci-info "^2.0.0" + is-core-module@^2.2.0, is-core-module@^2.6.0: version "2.8.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" @@ -2647,7 +2771,7 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -2878,7 +3002,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2898,6 +3022,13 @@ log-symbols@4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -2992,6 +3123,11 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -3181,6 +3317,11 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" @@ -3241,6 +3382,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -3330,6 +3478,11 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +patch-console@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" + integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3498,6 +3651,31 @@ raw-body@^2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" +react-devtools-core@^4.19.1: + version "4.21.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.21.0.tgz#a54c9a0fd7261491e616d6c87d1869e011d8521d" + integrity sha512-clGWwJHV5MHwTwYyKc+7FZHwzdbzrD2/AoZSkicUcr6YLc3Za9a9FaLhccWDHfjQ+ron9yzNhDT6Tv+FiPkD3g== + dependencies: + shell-quote "^1.6.1" + ws "^7" + +react-reconciler@^0.26.2: + version "0.26.2" + resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" + integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scheduler "^0.20.2" + +react@^17.0.2: + version "17.0.2" + resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" + integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -3578,6 +3756,14 @@ resolve@^1.10.0, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -3634,6 +3820,14 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +scheduler@^0.20.2: + version "0.20.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" + integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== + dependencies: + loose-envify "^1.1.0" + object-assign "^4.1.1" + scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" @@ -3724,6 +3918,11 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== +shell-quote@^1.6.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -3733,7 +3932,7 @@ side-channel@^1.0.4: get-intrinsic "^1.0.2" object-inspect "^1.9.0" -signal-exit@^3.0.0: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.5" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== @@ -3755,6 +3954,15 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slice-ansi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" + integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -3830,6 +4038,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +stack-utils@^2.0.2: + version "2.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" + integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + dependencies: + escape-string-regexp "^2.0.0" + stacktrace-parser@^0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -3859,7 +4074,7 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4048,6 +4263,24 @@ ts-node@^10.3.0: make-error "^1.1.1" yn "3.1.1" +ts-node@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" + integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== + dependencies: + "@cspotcode/source-map-support" "0.7.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + yn "3.1.1" + tsconfig-paths@^3.11.0: version "3.11.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" @@ -4097,6 +4330,11 @@ type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-fest@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" + integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== + type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -4233,6 +4471,13 @@ wide-align@1.1.3: dependencies: string-width "^1.0.2 || 2" +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -4252,6 +4497,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.0.0" +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -4271,7 +4525,7 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== -ws@^7.4.6: +ws@^7, ws@^7.4.6, ws@^7.5.5: version "7.5.5" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== @@ -4391,3 +4645,10 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yoga-layout-prebuilt@^1.9.6: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6" + integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g== + dependencies: + "@types/yoga-layout" "1.9.2" From 8aba491934855b6fa711fb55eaa4f3b701479792 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 26 Nov 2021 09:32:59 -0300 Subject: [PATCH 0014/1302] Centralize deployment state in a single module --- packages/core/package.json | 2 +- packages/core/src/deployment-state.ts | 301 ++++++++++++++++++ packages/core/src/execution-engine.ts | 279 +++------------- packages/core/src/executors.ts | 8 +- packages/core/src/index.ts | 42 ++- packages/core/src/modules.ts | 28 +- packages/core/src/ui/components/index.tsx | 77 +++-- packages/core/src/ui/ui-data.ts | 192 ----------- packages/core/src/ui/ui-service.tsx | 56 +--- packages/core/test/dag.ts | 6 +- packages/core/test/execution-engine.ts | 47 ++- packages/core/test/helpers.ts | 9 +- packages/hardhat-plugin/package.json | 3 +- .../hardhat-plugin/src/ignition-wrapper.ts | 108 ++++--- packages/hardhat-plugin/test/helpers.ts | 30 +- packages/hardhat-plugin/test/integration.ts | 20 +- 16 files changed, 574 insertions(+), 634 deletions(-) create mode 100644 packages/core/src/deployment-state.ts delete mode 100644 packages/core/src/ui/ui-data.ts diff --git a/packages/core/package.json b/packages/core/package.json index 329e6ce7de..c93eb14a9c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -10,7 +10,7 @@ "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='ignition:*' mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='ignition:*' yarn test", "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx" }, "devDependencies": { diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts new file mode 100644 index 0000000000..95fb4a345a --- /dev/null +++ b/packages/core/src/deployment-state.ts @@ -0,0 +1,301 @@ +import { BindingOutput } from "./bindings"; +import { DAG, IgnitionModule } from "./modules"; + +export class DeploymentState { + private _modules: Map = new Map(); + + constructor(private _dag: DAG) { + for (const module of _dag.getSortedModules()) { + const moduleState = new ModuleState(module.id, module); + this._modules.set(module.id, moduleState); + } + } + + public getModule(moduleId: string): ModuleState { + const moduleState = this._modules.get(moduleId); + if (moduleState === undefined) { + throw new Error( + `DeploymentState doesn't have module with id '${moduleId}'` + ); + } + + return moduleState; + } + + public getCurrentModule(): ModuleState | undefined { + const runningModules = [...this._modules.values()].filter((m) => + m.isRunning() + ); + + if (runningModules.length === 0) { + return; + } + + if (runningModules.length > 1) { + throw new Error( + "assertion error: only one module should be running at the same time" + ); + } + + return runningModules[0]; + } + + public getModules(): ModuleState[] { + return [...this._modules.values()]; + } + + public getSuccessfulModules(): ModuleState[] { + return [...this._modules.values()].filter((m) => m.isSuccess()); + } + + public hasModule(moduleId: string) { + return this._modules.has(moduleId); + } + + public isBindingSuccess(moduleId: string, bindingId: string): boolean { + const bindingState = this._getBindingState(moduleId, bindingId); + + return bindingState._kind === "success"; + } + + public getBindingResult(moduleId: string, bindingId: string) { + const bindingState = this._getBindingState(moduleId, bindingId); + + if (bindingState._kind !== "success") { + throw new Error("assertion error"); + } + + return bindingState.result; + } + + public isModuleSuccess(moduleId: string): boolean { + const moduleState = this._getModuleState(moduleId); + + return moduleState.isSuccess(); + } + + public isHold(): [string, string[]] | undefined { + for (const [moduleId, moduleState] of this._modules.entries()) { + const holds = moduleState.getHolds(); + if (holds.length > 0) { + return [moduleId, holds]; + } + } + + return; + } + + public getFailures(): [string, Error[]] | undefined { + for (const [moduleId, moduleState] of this._modules.entries()) { + const failures = moduleState.getFailures(); + if (failures.length > 0) { + return [moduleId, failures]; + } + } + + return; + } + + public clone(): DeploymentState { + return new DeploymentState(this._dag); + } + + private _getBindingState(moduleId: string, bindingId: string) { + const moduleState = this._getModuleState(moduleId); + + return moduleState.getBindingState(bindingId); + } + + private _getModuleState(moduleId: string) { + const moduleState = this._modules.get(moduleId); + + if (moduleState === undefined) { + throw new Error(`No state for module '${moduleId}'`); + } + + return moduleState; + } +} + +interface BindingStateWaiting { + _kind: "waiting"; +} +interface BindingStateReady { + _kind: "ready"; +} +interface BindingStateRunning { + _kind: "running"; +} +interface BindingStateSuccess { + _kind: "success"; + result: BindingOutput; +} +interface BindingStateFailure { + _kind: "failure"; + error: Error; +} +interface BindingStateHold { + _kind: "hold"; + reason: string; +} +export type BindingState = + | BindingStateWaiting + | BindingStateReady + | BindingStateRunning + | BindingStateSuccess + | BindingStateFailure + | BindingStateHold; + +// eslint-disable-next-line @typescript-eslint/no-redeclare -- intentionally naming the variable the same as the type +const BindingState = { + waiting(): BindingState { + return { _kind: "waiting" }; + }, + running(): BindingState { + return { _kind: "running" }; + }, + success(result: any): BindingState { + return { _kind: "success", result }; + }, + failure(error: Error): BindingState { + return { _kind: "failure", error }; + }, + hold(reason: string): BindingState { + return { _kind: "hold", reason }; + }, +}; + +export class ModuleState { + private _bindings = new Map(); + + constructor( + public readonly id: string, + private _ignitionModule: IgnitionModule + ) { + for (const executor of _ignitionModule.getSortedExecutors()) { + this._bindings.set(executor.binding.id, BindingState.waiting()); + } + } + + public getBindingsStates(): Array<[string, BindingState]> { + return [...this._bindings.entries()]; + } + + public isSuccess(): boolean { + const successCount = [...this._bindings.values()].filter( + (b) => b._kind === "success" + ).length; + + return successCount === this._bindings.size; + } + + public isRunning(): boolean { + return [...this._bindings.values()].some((b) => b._kind === "running"); + } + + public isFailure(): boolean { + return [...this._bindings.values()].some((b) => b._kind === "failure"); + } + + public isHold(): boolean { + return ( + !this.isFailure() && + [...this._bindings.values()].some((b) => b._kind === "hold") + ); + } + + public isBindingDone(bindingId: string): boolean { + return ( + this.isBindingSuccess(bindingId) || + this.isBindingFailure(bindingId) || + this.isBindingHold(bindingId) + ); + } + + public isBindingSuccess(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "success"; + } + + public isBindingFailure(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "failure"; + } + + public isBindingHold(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "hold"; + } + + public setSuccess(bindingId: string, result: any) { + const bindingState = this._getBinding(bindingId); + + if (bindingState._kind !== "running") { + throw new Error("assertion error"); + } + + this._bindings.set(bindingId, BindingState.success(result)); + } + + public setRunning(bindingId: string) { + this._bindings.set(bindingId, BindingState.running()); + } + + public addFailure(bindingId: string, error: Error) { + this._bindings.set(bindingId, BindingState.failure(error)); + } + + public setHold(bindingId: string, holdReason: string) { + this._bindings.set(bindingId, BindingState.hold(holdReason)); + } + + public getBindingResult(bindingId: string): BindingOutput { + const bindingState = this.getBindingState(bindingId); + + if (bindingState._kind !== "success") { + throw new Error(`assertion error: ${bindingId} should be successful`); + } + + return bindingState.result; + } + + public getBindingState(bindingId: string): BindingState { + const bindingState = this._bindings.get(bindingId); + if (bindingState === undefined) { + throw new Error( + `[ModuleResult] Module '${this.id}' has no result for binding '${bindingId}'` + ); + } + + return bindingState; + } + + public getFailures(): Error[] { + return [...this._bindings.values()] + .filter((x): x is BindingStateFailure => x._kind === "failure") + .map((x) => x.error); + } + + public getHolds(): string[] { + return [...this._bindings.values()] + .filter((x): x is BindingStateHold => x._kind === "hold") + .map((x) => x.reason); + } + + public count(): number { + return this._bindings.size; + } + + private _getBinding(bindingId: string) { + const bindingState = this._bindings.get(bindingId); + + if (bindingState === undefined) { + throw new Error("assertion error"); + } + + return bindingState; + } +} diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index cd12297c80..7eae14fc8d 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,7 +1,7 @@ import debug from "debug"; import { InternalBinding } from "./bindings"; -import { TxSender } from "./tx-sender"; +import { DeploymentState } from "./deployment-state"; import { Journal } from "./journal"; import { DAG, IgnitionModule } from "./modules"; import { Providers } from "./providers"; @@ -13,8 +13,8 @@ import { TransactionsService, ExecutorUiService, } from "./services"; +import { TxSender } from "./tx-sender"; import { sleep } from "./utils"; -import { UiData } from "./ui/ui-data"; interface ExecutionEngineOptions { parallelizationLevel: number; @@ -32,7 +32,10 @@ export type DeploymentPlan = Record; export class ExecutionEngine { private _debug = debug("ignition:execution-engine"); - public static buildPlan(dag: DAG, currentDeploymentResult: DeploymentResult) { + public static buildPlan( + dag: DAG, + currentDeploymentResult: DeploymentState + ): DeploymentPlan { const plan: DeploymentPlan = {}; const ignitionModules = dag.getSortedModules(); @@ -60,12 +63,11 @@ export class ExecutionEngine { constructor( private _providers: Providers, private _journal: Journal, - private _previousDeploymentResult: DeploymentResult, private _options: ExecutionEngineOptions ) {} - public async *execute(dag: DAG) { - const deploymentResult = this._previousDeploymentResult.clone(); + public async *execute(dag: DAG, previousDeploymentState: DeploymentState) { + const deploymentState = previousDeploymentState.clone(); const ids: Record = {}; const modules = dag.getSortedModules(); @@ -75,13 +77,13 @@ export class ExecutionEngine { const uiService = new UiService({ enabled: this._options.loggingEnabled, - uiData: new UiData(ids), + deploymentState, }); // validate all modules const errorsPerModule: Map = new Map(); let hasErrors = false; - for (const ignitionModule of dag.getModules()) { + for (const ignitionModule of dag.getSortedModules()) { this._debug(`Validating module ${ignitionModule.id}`); const errors = await this._validateModule(ignitionModule, uiService); if (errors.length > 0) { @@ -112,44 +114,38 @@ export class ExecutionEngine { } // execute each module sequentially - for (const ignitionModule of dag.getModules()) { + for (const ignitionModule of dag.getSortedModules()) { this._debug(`Begin execution of module ${ignitionModule.id}`); - if (deploymentResult.hasModule(ignitionModule.id)) { + if (deploymentState.isModuleSuccess(ignitionModule.id)) { this._debug( - `A previous result for module ${ignitionModule.id} already exists` - ); - const previousModuleResult = deploymentResult.getModule( - ignitionModule.id + `The module ${ignitionModule.id} was already successfully deployed` ); - if (previousModuleResult.isSuccess()) { - continue; - } + continue; } this._debug(`Executing module ${ignitionModule.id}`); const moduleExecutionGenerator = this._executeModule( ignitionModule, - deploymentResult, + deploymentState, uiService ); for await (const moduleResult of moduleExecutionGenerator) { if (moduleResult !== undefined) { - deploymentResult.addResult(moduleResult); break; } yield; } } - yield deploymentResult; + yield deploymentState; } private async _validateModule( ignitionModule: IgnitionModule, uiService: UiService ): Promise { - const executors = ignitionModule.getExecutors(); + const executors = ignitionModule.getSortedExecutors(); const allErrors: string[] = []; for (const executor of executors) { @@ -173,12 +169,12 @@ export class ExecutionEngine { private async *_executeModule( ignitionModule: IgnitionModule, - deploymentResult: DeploymentResult, + deploymentState: DeploymentState, uiService: UiService ) { const { parallelizationLevel } = this._options; - const executors = ignitionModule.getExecutors(); - const moduleResult = new ModuleResult(ignitionModule.id); + const executors = ignitionModule.getSortedExecutors(); + const moduleState = deploymentState.getModule(ignitionModule.id); while (true) { const someFailure = executors.some((e) => e.isFailure()); @@ -192,12 +188,12 @@ export class ExecutionEngine { (someHold && runningCount === 0) ) { for (const executor of executors) { - if (!moduleResult.hasResult(executor.binding.id)) { + if (!moduleState.isBindingDone(executor.binding.id)) { if (executor.isSuccess()) { - moduleResult.addResult(executor.binding.id, executor.getResult()); + moduleState.setSuccess(executor.binding.id, executor.getResult()); } if (executor.isHold()) { - moduleResult.addHold( + moduleState.setHold( executor.binding.id, executor.getHoldReason() ); @@ -218,16 +214,16 @@ export class ExecutionEngine { } failures.forEach(([bindingId, failure]) => - moduleResult.addFailure(bindingId, failure) + moduleState.addFailure(bindingId, failure) ); holds.forEach(([bindingId, holdReason]) => - moduleResult.addHold(bindingId, holdReason) + moduleState.setHold(bindingId, holdReason) ); - yield moduleResult; + yield moduleState; } - for (const executor of ignitionModule.getExecutors()) { + for (const executor of ignitionModule.getSortedExecutors()) { this._debug(`Check ${ignitionModule.id}/${executor.binding.id}`); if (executor.isReady() && runningCount < parallelizationLevel) { @@ -236,16 +232,13 @@ export class ExecutionEngine { ); const dependencies = executor.binding.getDependencies(); const allDependenciesReady = dependencies.every((d) => - d.moduleId !== ignitionModule.id - ? deploymentResult.hasBindingResult(d.moduleId, d.id) - : moduleResult.hasResult(d.id) + deploymentState.isBindingSuccess(d.moduleId, d.id) ); if (allDependenciesReady) { const resolvedInput = this._resolve( executor.binding.input, - deploymentResult, - moduleResult + deploymentState ); const services = this._createServices( ignitionModule.id, @@ -254,13 +247,14 @@ export class ExecutionEngine { ); this._debug(`Start ${ignitionModule.id}/${executor.binding.id}`); + moduleState.setRunning(executor.binding.id); // eslint-disable-next-line @typescript-eslint/no-floating-promises executor.run(resolvedInput, services); runningCount++; } } - if (!moduleResult.hasResult(executor.binding.id)) { + if (!moduleState.isBindingDone(executor.binding.id)) { this._debug( `Check result of ${ignitionModule.id}/${executor.binding.id}` ); @@ -268,13 +262,13 @@ export class ExecutionEngine { this._debug( `${ignitionModule.id}/${executor.binding.id} finished successfully` ); - moduleResult.addResult(executor.binding.id, executor.getResult()); + moduleState.setSuccess(executor.binding.id, executor.getResult()); } if (executor.isHold()) { this._debug( `${ignitionModule.id}/${executor.binding.id} is on hold` ); - moduleResult.addHold(executor.binding.id, executor.getHoldReason()); + moduleState.setHold(executor.binding.id, executor.getHoldReason()); } } } @@ -283,34 +277,20 @@ export class ExecutionEngine { } } - private _resolve( - input: any, - deploymentResult: DeploymentResult, - currentModuleResult: ModuleResult - ): any { + private _resolve(input: any, deploymentResult: DeploymentState): any { if (InternalBinding.isBinding(input)) { - if (input.moduleId === currentModuleResult.moduleId) { - return currentModuleResult.getResult(input.id); - } else { - return deploymentResult.getBindingResult(input.moduleId, input.id); - } + return deploymentResult.getBindingResult(input.moduleId, input.id); } if (Array.isArray(input)) { - return input.map((x) => - this._resolve(x, deploymentResult, currentModuleResult) - ); + return input.map((x) => this._resolve(x, deploymentResult)); } if (typeof input === "object" && input !== null) { const resolvedInput: any = {}; for (const [key, value] of Object.entries(input)) { - resolvedInput[key] = this._resolve( - value, - deploymentResult, - currentModuleResult - ); + resolvedInput[key] = this._resolve(value, deploymentResult); } return resolvedInput; @@ -344,192 +324,21 @@ export class ExecutionEngine { } } -export class DeploymentResult { - private _results: Map = new Map(); - - public getModule(moduleId: string): ModuleResult { - const moduleResult = this._results.get(moduleId); - if (moduleResult === undefined) { - throw new Error( - `DeploymentResult doesn't have module with id '${moduleId}'` - ); - } - - return moduleResult; - } - - public getModules(): ModuleResult[] { - return [...this._results.values()]; - } - - public addResult(moduleResult: ModuleResult) { - const moduleId = moduleResult.moduleId; - if (this._results.has(moduleId)) { - throw new Error(`A result for '${moduleId}' already exists`); - } - this._results.set(moduleId, moduleResult); - } - - public hasModule(moduleId: string) { - return this._results.has(moduleId); - } - - public hasBindingResult(moduleId: string, bindingId: string) { - const moduleResult = this._results.get(moduleId); - if (moduleResult === undefined) { - return false; - } - - return moduleResult.hasResult(bindingId); - } - - public getBindingResult(moduleId: string, bindingId: string) { - const moduleResult = this._results.get(moduleId); - if (moduleResult === undefined) { - throw new Error(`No result for module '${moduleId}'`); - } - - return moduleResult.getResult(bindingId); - } - - public isHold(): [string, string[]] | undefined { - for (const [moduleId, moduleResult] of this._results.entries()) { - const holds = moduleResult.getHolds(); - if (holds.length > 0) { - return [moduleId, holds]; - } - } - - return; - } - - public getFailures(): [string, Error[]] | undefined { - for (const [moduleId, moduleResult] of this._results.entries()) { - const failures = moduleResult.getFailures(); - if (failures.length > 0) { - return [moduleId, failures]; - } - } - - return; - } - - public clone(): DeploymentResult { - const deploymentResult = new DeploymentResult(); - - for (const ignitionModule of this.getModules()) { - const moduleResult = new ModuleResult(ignitionModule.moduleId); - for (const [resultId, result] of ignitionModule.getResults()) { - moduleResult.addResult(resultId, result); - } - deploymentResult.addResult(moduleResult); - } - return deploymentResult; - } -} - -export class ModuleResult { - private _results = new Map(); - private _failures = new Map(); - private _holds = new Map(); - - private _generalFailures: Error[] = []; - - constructor(public readonly moduleId: string) {} - - public isSuccess(): boolean { - const failuresCount = [ - ...this._failures.values(), - ...this._generalFailures.values(), - ].length; - const holdsCount = [...this._holds.values()].length; - - return failuresCount + holdsCount === 0; - } - - public isFailure(): boolean { - const failuresCount = [ - ...this._failures.values(), - ...this._generalFailures.values(), - ].length; - return failuresCount > 0; - } - - public isHold(): boolean { - const failuresCount = [ - ...this._failures.values(), - ...this._generalFailures.values(), - ].length; - const holdsCount = [...this._holds.values()].length; - - return failuresCount === 0 && holdsCount > 0; - } - - public hasResult(bindingId: string): boolean { - return this._results.has(bindingId); - } - - public addResult(bindingId: string, result: any) { - const bindingResult = this._results.get(bindingId); - if (bindingResult !== undefined) { - throw new Error( - `[ModuleResult] Module '${this.moduleId}' already has a result for binding '${bindingId}'` - ); - } - - this._results.set(bindingId, result); - } - - public addFailure(bindingId: string, error: Error) { - this._failures.set(bindingId, error); - } - - public addHold(bindingId: string, holdReason: string) { - this._holds.set(bindingId, holdReason); - } - - public addGeneralFailure(error: Error) { - this._generalFailures.push(error); - } - - public getResult(bindingId: string) { - const bindingResult = this._results.get(bindingId); - if (bindingResult === undefined) { - throw new Error( - `[ModuleResult] Module '${this.moduleId}' has no result for binding '${bindingId}'` - ); - } - - return bindingResult; - } - - public getResults(): Array<[string, any]> { - return [...this._results.entries()]; - } - - public getHolds() { - return [...this._holds.values()]; - } - - public getFailures(): Error[] { - return [...this._failures.values(), ...this._generalFailures]; - } - - public count() { - return [...this._results.values()].length; - } -} - export class ExecutionManager { + private _debug = debug("ignition:execution-manager"); constructor( private _engine: ExecutionEngine, private _tickInterval: number ) {} - public async execute(dag: DAG): Promise { - const executionGenerator = this._engine.execute(dag); + public async execute( + dag: DAG, + deploymentState: DeploymentState + ): Promise { + const executionGenerator = this._engine.execute(dag, deploymentState); while (true) { + this._debug("Run next execution iteration"); const deploymentResultIteration = await executionGenerator.next(); if (deploymentResultIteration.value !== undefined) { diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index 76d1298826..08e06b8052 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -42,20 +42,20 @@ export abstract class Executor { public async run(input: Resolved, services: Services) { try { - services.ui.executorStart(); + services.ui.render(); this._debug("Start running"); this._setRunning(); const result = await this.execute(input, services); this._debug("Ended successfully"); - services.ui.executorSuccessful(); + services.ui.render(); this._setSuccess(result); } catch (e: any) { if (e instanceof Hold) { - services.ui.executorHold(e.reason); + services.ui.render(); this._debug("Ended with hold"); this._setHold(e.reason); } else { - services.ui.executorFailure(e.message); + services.ui.render(); this._debug("Ended with error"); this._setFailure(e); } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 56f61b724c..d3deda9a8c 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -10,12 +10,8 @@ import { InternalContractBinding, serializeBindingOutput, } from "./bindings"; -import { - DeploymentResult, - ExecutionEngine, - ExecutionManager, - ModuleResult, -} from "./execution-engine"; +import { DeploymentState } from "./deployment-state"; +import { ExecutionEngine, ExecutionManager } from "./execution-engine"; import { Executor, Hold } from "./executors"; import { FileJournal, NullJournal } from "./journal"; import { ModuleBuilder, ModuleBuilderImpl, UserModule } from "./modules"; @@ -32,13 +28,12 @@ export { Contract, ContractBinding, ContractOptions, - DeploymentResult, + DeploymentState, Executor, Hold, InternalBinding, InternalContractBinding, ModuleBuilder, - ModuleResult, Providers, Services, UserModule, @@ -56,7 +51,7 @@ export class Ignition { public async deploy( userModules: Array>, - currentDeploymentResult: DeploymentResult, + currentDeploymentState: DeploymentState | undefined, { pathToJournal, txPollingInterval, @@ -83,16 +78,11 @@ export class Ignition { ? new FileJournal(pathToJournal) : new NullJournal(); - const engine = new ExecutionEngine( - this._providers, - journal, - currentDeploymentResult, - { - parallelizationLevel: 2, - loggingEnabled: pathToJournal !== undefined, - txPollingInterval, - } - ); + const engine = new ExecutionEngine(this._providers, journal, { + parallelizationLevel: 2, + loggingEnabled: pathToJournal !== undefined, + txPollingInterval, + }); const executionManager = new ExecutionManager( engine, @@ -100,14 +90,17 @@ export class Ignition { ); log("Execute deployment"); - const deploymentResult = await executionManager.execute(dag); + const newDeploymentState = await executionManager.execute( + dag, + currentDeploymentState ?? new DeploymentState(dag) + ); - return [deploymentResult, moduleOutputs] as const; + return [newDeploymentState, moduleOutputs] as const; } public async buildPlan( userModules: Array>, - currentDeploymentResult: DeploymentResult + currentDeploymentState: DeploymentState | undefined ) { log(`Start building plan, '${userModules.length}' modules`); @@ -124,6 +117,9 @@ export class Ignition { log("Build DAG"); const dag = m.buildDAG(); - return ExecutionEngine.buildPlan(dag, currentDeploymentResult); + return ExecutionEngine.buildPlan( + dag, + currentDeploymentState ?? new DeploymentState(dag) + ); } } diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts index 1da9171af6..fbc0d5bc4d 100644 --- a/packages/core/src/modules.ts +++ b/packages/core/src/modules.ts @@ -14,10 +14,6 @@ import { Contract, Tx } from "./types"; export class IgnitionModule { constructor(public readonly id: string, private _executors: Executor[]) {} - public getExecutors(): Executor[] { - return this._executors; - } - public getSortedExecutors(): Executor[] { const dependencies = new Map>(); @@ -26,7 +22,9 @@ export class IgnitionModule { dependencies.get(executor.binding.id) ?? new Set(); for (const executorDependency of executor.binding.getDependencies()) { - executorDependencies.add(executorDependency.id); + if (executorDependency.moduleId === executor.binding.moduleId) { + executorDependencies.add(executorDependency.id); + } } dependencies.set(executor.binding.id, executorDependencies); @@ -87,15 +85,9 @@ export class DAG { return new IgnitionModule(moduleId, [...executorsMap.values()]); } - public getModules(): IgnitionModule[] { - return [...this._modules.entries()].map( - ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) - ); - } - public getSortedModules(): IgnitionModule[] { const added = new Set(); - const ignitionModules = this.getModules(); + const ignitionModules = this._getModules(); const sortedModules: IgnitionModule[] = []; while (added.size < ignitionModules.length) { @@ -116,14 +108,20 @@ export class DAG { return sortedModules; } - private _addDependency(moduleId: string, dependencyId: string) { - if (moduleId !== dependencyId) { + private _addDependency(moduleId: string, dependencyModuleId: string) { + if (moduleId !== dependencyModuleId) { const dependencies = this._dependencies.get(moduleId) ?? new Set(); - dependencies.add(dependencyId); + dependencies.add(dependencyModuleId); this._dependencies.set(moduleId, dependencies); } } + + private _getModules(): IgnitionModule[] { + return [...this._modules.entries()].map( + ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) + ); + } } interface UserContractOptions { diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx index cbfd28c8a6..39bd7f49f8 100644 --- a/packages/core/src/ui/components/index.tsx +++ b/packages/core/src/ui/components/index.tsx @@ -2,16 +2,24 @@ import React from "react"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; -import { UiData, UiExecutor, UiModule } from "../ui-data"; +import { + BindingState, + DeploymentState, + ModuleState, +} from "../../deployment-state"; -export const IgnitionUi = ({ uiData }: { uiData: UiData }) => { - const currentModule = uiData.getCurrentModule(); +export const IgnitionUi = ({ + deploymentState, +}: { + deploymentState: DeploymentState; +}) => { + const currentModule = deploymentState.getCurrentModule(); - const successfulModules = uiData.getSuccessfulModules(); + const successfulModules = deploymentState.getSuccessfulModules(); return ( -
+
@@ -22,23 +30,25 @@ export const IgnitionUi = ({ uiData }: { uiData: UiData }) => { ); }; -const Header = ({ uiData }: { uiData: UiData }) => { +const Header = ({ deploymentState }: { deploymentState: DeploymentState }) => { + const successfulModulesCount = deploymentState.getSuccessfulModules().length; + const modulesCount = deploymentState.getModules().length; + return ( - {uiData.getDeployedModulesCount()} of {uiData.getModulesCount()} modules - deployed + {successfulModulesCount} of {modulesCount} modules deployed ); }; -const CurrentModule = ({ module }: { module?: UiModule }) => { +const CurrentModule = ({ module }: { module?: ModuleState }) => { if (module === undefined) { return null; } - const executors = [...module.executors.values()]; + const bindingsStates = module.getBindingsStates(); return ( @@ -48,49 +58,64 @@ const CurrentModule = ({ module }: { module?: UiModule }) => { - {executors.sort(compareExecutors).map((e) => ( - - ))} + {bindingsStates + .sort((a, b) => compareBindingsStates(a[1], b[1])) + .map(([bindingId, bindingState]) => ( + + ))} ); }; -function compareExecutors(a: UiExecutor, b: UiExecutor): number { - const value = (s: UiExecutor["status"]) => { +function compareBindingsStates(a: BindingState, b: BindingState): number { + const value = (s: BindingState["_kind"]) => { if (s === "success" || s === "failure" || s === "hold") { return 0; } - if (s === "executing") { + if (s === "running") { return 1; } if (s === "ready") { return 2; } + if (s === "waiting") { + return 3; + } const _exhaustiveCheck: never = s; return s; }; - const aValue = value(a.status); - const bValue = value(b.status); + const aValue = value(a._kind); + const bValue = value(b._kind); return aValue - bValue; } -const Executor = ({ executor }: { executor: UiExecutor }) => { +const Binding = ({ + bindingId, + bindingState, +}: { + bindingId: string; + bindingState: BindingState; +}) => { return ( - {executor.status === "executing" ? ( - {executor.id}: Executing - ) : executor.status === "success" ? ( - {executor.id}: Executed - ) : executor.status === "ready" ? ( - {executor.id}: Waiting + {bindingState._kind === "running" ? ( + {bindingId}: Executing + ) : bindingState._kind === "success" ? ( + {bindingId}: Executed + ) : bindingState._kind === "ready" ? ( + {bindingId}: Waiting ) : null} ); }; -const SuccessfulModules = ({ modules }: { modules: UiModule[] }) => { +const SuccessfulModules = ({ modules }: { modules: ModuleState[] }) => { if (modules.length === 0) { return null; } diff --git a/packages/core/src/ui/ui-data.ts b/packages/core/src/ui/ui-data.ts deleted file mode 100644 index 7dc8684e86..0000000000 --- a/packages/core/src/ui/ui-data.ts +++ /dev/null @@ -1,192 +0,0 @@ -export interface UiExecutor { - id: string; - status: "ready" | "executing" | "success" | "failure" | "hold"; - message?: string; -} - -export interface UiModule { - id: string; - status: "ready" | "deploying" | "deployed"; - executors: Map; -} - -export class UiData { - private _modules: Map; - - constructor(ids: Record) { - this._modules = new Map(); - - for (const [moduleId, executorIds] of Object.entries(ids)) { - const executors: Map = new Map(); - for (const executorId of executorIds) { - executors.set(executorId, { - id: executorId, - status: "ready", - }); - } - this._modules.set(moduleId, { - id: moduleId, - status: "ready", - executors, - }); - } - } - - public executorStart(moduleId: string, executorId: string) { - const module = this._getModule(moduleId); - - if (module.status === "ready") { - module.status = "deploying"; - } else if (module.status !== "deploying") { - throw new Error( - `[Assertion error] Module ${moduleId} should be ready or deploying` - ); - } - - const executor = this._getExecutor(moduleId, executorId); - - if (executor.status !== "ready") { - throw new Error( - `[Assertion error] Executor ${executorId} should be ready` - ); - } - - executor.status = "executing"; - } - - public executorSuccessful(moduleId: string, executorId: string) { - const module = this._getModule(moduleId); - - if (module.status !== "deploying") { - throw new Error( - `[Assertion error] Module ${moduleId} should be deploying` - ); - } - - const executor = this._getExecutor(moduleId, executorId); - - if (executor.status !== "executing") { - throw new Error( - `[Assertion error] Executor ${executorId} should be executing` - ); - } - - executor.status = "success"; - - if (this._isModuleFinished(module)) { - module.status = "deployed"; - } - } - - public executorHold(moduleId: string, executorId: string, _reason: string) { - const module = this._getModule(moduleId); - - if (module.status !== "deploying") { - throw new Error( - `[Assertion error] Module ${moduleId} should be deploying` - ); - } - - const executor = this._getExecutor(moduleId, executorId); - - if (executor.status !== "executing") { - throw new Error( - `[Assertion error] Executor ${executorId} should be executing` - ); - } - - executor.status = "hold"; - - if (this._isModuleFinished(module)) { - module.status = "deployed"; - } - } - - public executorFailure( - moduleId: string, - executorId: string, - _reason: string - ) { - const module = this._getModule(moduleId); - - if (module.status !== "deploying") { - throw new Error( - `[Assertion error] Module ${moduleId} should be deploying` - ); - } - - const executor = this._getExecutor(moduleId, executorId); - - if (executor.status !== "executing") { - throw new Error( - `[Assertion error] Executor ${executorId} should be executing` - ); - } - - executor.status = "failure"; - - if (this._isModuleFinished(module)) { - module.status = "deployed"; - } - } - - public getSuccessfulModules() { - return [...this._modules.values()].filter((m) => m.status === "deployed"); - } - - public getModulesCount(): number { - return this._modules.size; - } - - public getDeployedModulesCount(): number { - const modules = [...this._modules.values()]; - return modules.filter((m) => m.status === "deployed").length; - } - - public getCurrentModule(): UiModule | undefined { - const modulesBeingDeployed = [...this._modules.values()].filter( - (m) => m.status === "deploying" - ); - - if (modulesBeingDeployed.length === 0) { - return; - } - - if (modulesBeingDeployed.length > 1) { - throw new Error( - `[Assertion error] Only one module should be deployed at the same time` - ); - } - - return modulesBeingDeployed[0]; - } - - private _getModule(moduleId: string): UiModule { - const module = this._modules.get(moduleId); - - if (module === undefined) { - throw new Error(`[Assertion error] Expected module ${moduleId} to exist`); - } - - return module; - } - - private _getExecutor(moduleId: string, executorId: string): UiExecutor { - const executor = this._modules.get(moduleId)?.executors.get(executorId); - - if (executor === undefined) { - throw new Error( - `[Assertion error] Expected executor ${moduleId}/${executorId} to exist` - ); - } - - return executor; - } - - private _isModuleFinished(module: UiModule) { - return [...module.executors.values()].every( - (e) => - e.status === "success" || e.status === "hold" || e.status === "failure" - ); - } -} diff --git a/packages/core/src/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx index ff7e22f87e..56f65ed107 100644 --- a/packages/core/src/ui/ui-service.tsx +++ b/packages/core/src/ui/ui-service.tsx @@ -1,8 +1,8 @@ import React from "react"; import { render } from "ink"; +import { DeploymentState } from "../deployment-state"; import { IgnitionUi } from "./components"; -import { UiData } from "./ui-data"; export class ExecutorUiService { constructor( @@ -11,55 +11,29 @@ export class ExecutorUiService { private _uiService: UiService ) {} - public executorStart() { - this._uiService.executorStart(this._moduleId, this._executorId); - } - - public executorSuccessful() { - this._uiService.executorSuccessful(this._moduleId, this._executorId); - } - - public executorHold(reason: string) { - this._uiService.executorHold(this._moduleId, this._executorId, reason); - } - - public executorFailure(reason: string) { - this._uiService.executorFailure(this._moduleId, this._executorId, reason); + public render() { + this._uiService.render(); } } export class UiService { private _enabled: boolean; - private _uiData: UiData; - - constructor({ enabled, uiData }: { enabled: boolean; uiData: UiData }) { + private _deploymentState: DeploymentState; + + constructor({ + enabled, + deploymentState, + }: { + enabled: boolean; + deploymentState: DeploymentState; + }) { this._enabled = enabled; - this._uiData = uiData; - } - - public executorStart(moduleId: string, executorId: string) { - this._uiData.executorStart(moduleId, executorId); - this._render(); - } - - public executorSuccessful(moduleId: string, executorId: string) { - this._uiData.executorSuccessful(moduleId, executorId); - this._render(); - } - - public executorHold(moduleId: string, executorId: string, reason: string) { - this._uiData.executorHold(moduleId, executorId, reason); - this._render(); - } - - public executorFailure(moduleId: string, executorId: string, reason: string) { - this._uiData.executorFailure(moduleId, executorId, reason); - this._render(); + this._deploymentState = deploymentState; } - private _render() { + public render() { if (this._enabled) { - render(); + render(); } } } diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 4693146b55..1f5dea9627 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -41,7 +41,7 @@ describe("DAG", function () { dag.addExecutor(inc("MyModule", "inc1", 1)); // when - const [ignitionModule] = dag.getModules(); + const [ignitionModule] = dag.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); @@ -58,7 +58,7 @@ describe("DAG", function () { dag.addExecutor(inc1); // when - const [ignitionModule] = dag.getModules(); + const [ignitionModule] = dag.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); @@ -78,7 +78,7 @@ describe("DAG", function () { dag.addExecutor(incInc1); // when - const [ignitionModule] = dag.getModules(); + const [ignitionModule] = dag.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 53bc8d2d9b..be2a00778d 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { DeploymentState } from "../src/deployment-state"; import { ExecutionEngine } from "../src/execution-engine"; import { NullJournal } from "../src/journal"; import { DAG } from "../src/modules"; @@ -17,13 +18,12 @@ const executionEngineOptions = { txPollingInterval: 100, }; -describe.only("ExecutionEngine", function () { +describe("ExecutionEngine", function () { it("should run a single module with a single executor", async function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), new NullJournal(), - emptyDeploymentResult(), executionEngineOptions ); @@ -33,7 +33,10 @@ describe.only("ExecutionEngine", function () { dag.addExecutor(inc1); // when - const executionGenerator = executionEngine.execute(dag); + const executionGenerator = executionEngine.execute( + dag, + emptyDeploymentResult(dag) + ); const deploymentResult = await runUntilReady(executionGenerator); // then @@ -44,7 +47,7 @@ describe.only("ExecutionEngine", function () { assert.isTrue(resultModule.isSuccess()); assert.equal(resultModule.count(), 1); - const bindingResult = resultModule.getResult("inc1"); + const bindingResult = deploymentResult.getBindingResult("MyModule", "inc1"); assert.equal(bindingResult, 2); @@ -56,7 +59,6 @@ describe.only("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new NullJournal(), - emptyDeploymentResult(), executionEngineOptions ); @@ -68,7 +70,10 @@ describe.only("ExecutionEngine", function () { dag.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute(dag); + const executionGenerator = executionEngine.execute( + dag, + emptyDeploymentResult(dag) + ); await runUntil(executionGenerator, () => { return inc1.isRunning(); }); @@ -78,19 +83,25 @@ describe.only("ExecutionEngine", function () { // when inc1.finish(); - const deploymentResult = await runUntil(executionGenerator, (result) => { - return result !== undefined; - }); + const deploymentState: DeploymentState = await runUntil( + executionGenerator, + (result) => { + return result !== undefined; + } + ); // then - const resultModules = deploymentResult.getModules(); + const resultModules = deploymentState.getModules(); assert.lengthOf(resultModules, 1); assert.isTrue(resultModules[0].isSuccess()); assert.equal(resultModules[0].count(), 2); - const inc1Result = resultModules[0].getResult("inc1"); - const incInc1Result = resultModules[0].getResult("incInc1"); + const inc1Result = deploymentState.getBindingResult("MyModule", "inc1"); + const incInc1Result = deploymentState.getBindingResult( + "MyModule", + "incInc1" + ); assert.equal(inc1Result, 2); assert.equal(incInc1Result, 3); @@ -104,7 +115,6 @@ describe.only("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new NullJournal(), - emptyDeploymentResult(), executionEngineOptions ); @@ -116,7 +126,10 @@ describe.only("ExecutionEngine", function () { dag.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute(dag); + const executionGenerator = executionEngine.execute( + dag, + emptyDeploymentResult(dag) + ); const deploymentResult = await runUntilReady(executionGenerator); // then @@ -135,7 +148,6 @@ describe.only("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new NullJournal(), - emptyDeploymentResult(), executionEngineOptions ); @@ -147,7 +159,10 @@ describe.only("ExecutionEngine", function () { dag.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute(dag); + const executionGenerator = executionEngine.execute( + dag, + emptyDeploymentResult(dag) + ); const deploymentResult = await runUntilReady(executionGenerator); // then diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index ca64a0a5c4..f10f668921 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,5 +1,5 @@ import { Bindable, InternalBinding } from "../src/bindings"; -import { DeploymentResult } from "../src/execution-engine"; +import { DeploymentState } from "../src/deployment-state"; import { Executor, Hold } from "../src/executors"; import { ArtifactsProvider, @@ -10,6 +10,7 @@ import { SignersProvider, TransactionsProvider, } from "../src/providers"; +import { DAG } from "./modules"; export function getMockedProviders(): Providers { return { @@ -21,8 +22,8 @@ export function getMockedProviders(): Providers { }; } -export function emptyDeploymentResult() { - return new DeploymentResult(); +export function emptyDeploymentResult(dag: DAG) { + return new DeploymentState(dag); } /** @@ -129,7 +130,7 @@ class IncreaseNumberExecutor extends Executor, number> { export async function runUntil( generator: AsyncGenerator, - condition: (result: DeploymentResult | undefined | void) => boolean, + condition: (result: DeploymentState | undefined | void) => boolean, extraTicks = 5 ) { let result: any; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 87f095a258..5edaaac016 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -9,7 +9,8 @@ "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", "prettier": "prettier \"**/*.{js,md,json}\"", - "test": "mocha --recursive \"test/**/*.ts\"" + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test" }, "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 8295b48700..65ae047067 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -4,12 +4,9 @@ import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import { Binding, - BindingOutput, DeploymentPlan, - DeploymentResult, - deserializeBindingOutput, + DeploymentState, Ignition, - ModuleResult, serializeBindingOutput, UserModule, } from "ignition"; @@ -46,7 +43,7 @@ export class IgnitionWrapper { ): Promise>> { const { chainId } = await this._ethers.provider.getNetwork(); - const currentDeploymentResult = await this._getDeploymentResult(chainId); + const currentDeploymentState = await this._getDeploymentState(chainId); const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { @@ -58,19 +55,19 @@ export class IgnitionWrapper { userModules.push(userModule); } - const [deploymentResult, moduleOutputs] = await this._ignition.deploy( + const [deploymentState, moduleOutputs] = await this._ignition.deploy( userModules, - currentDeploymentResult ?? new DeploymentResult(), + currentDeploymentState, this._deployOptions ); - const moduleIdAndHoldReason = deploymentResult.isHold(); + const moduleIdAndHoldReason = deploymentState.isHold(); if (moduleIdAndHoldReason !== undefined) { const [moduleId, holdReason] = moduleIdAndHoldReason; throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); } - const moduleIdAndFailures = deploymentResult.getFailures(); + const moduleIdAndFailures = deploymentState.getFailures(); if (moduleIdAndFailures !== undefined) { const [moduleId, failures] = moduleIdAndFailures; @@ -84,19 +81,24 @@ export class IgnitionWrapper { ); } - await this._saveDeploymentResult(chainId, deploymentResult); + await this._saveDeploymentState(chainId, deploymentState); const resolvedOutputs: any = []; for (const moduleOutput of moduleOutputs) { const resolvedOutput: any = {}; for (const [key, value] of Object.entries(moduleOutput as any)) { - const bindingResult = deploymentResult.getBindingResult( + const bindingResult = deploymentState.getBindingResult( value.moduleId, value.id )!; - if (typeof bindingResult === "string") { + if ( + typeof bindingResult === "string" || + typeof bindingResult === "number" + ) { resolvedOutput[key] = bindingResult; + } else if ("hash" in bindingResult) { + resolvedOutput[key] = bindingResult.hash; } else { const { abi, address } = bindingResult; resolvedOutput[key] = await this._ethers.getContractAt(abi, address); @@ -105,7 +107,7 @@ export class IgnitionWrapper { resolvedOutputs.push(resolvedOutput); } - return [deploymentResult, resolvedOutputs]; + return [deploymentState, resolvedOutputs]; } public async buildPlan( @@ -113,7 +115,7 @@ export class IgnitionWrapper { ): Promise { const { chainId } = await this._ethers.provider.getNetwork(); - const currentDeploymentResult = await this._getDeploymentResult(chainId); + const currentDeploymentState = await this._getDeploymentState(chainId); const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { @@ -127,7 +129,7 @@ export class IgnitionWrapper { const plan = await this._ignition.buildPlan( userModules, - currentDeploymentResult ?? new DeploymentResult() + currentDeploymentState ); return plan; @@ -157,9 +159,9 @@ export class IgnitionWrapper { throw new Error(`No module with id ${moduleId}`); } - private async _saveDeploymentResult( + private async _saveDeploymentState( chainId: number, - deploymentResult: DeploymentResult + deploymentState: DeploymentState ) { if (this._isHardhatNetwork) { return; @@ -171,19 +173,24 @@ export class IgnitionWrapper { ); fsExtra.ensureDirSync(deploymentsDirectory); - const modulesResults = deploymentResult.getModules(); + const modulesStates = deploymentState.getModules(); - for (const moduleResult of modulesResults) { + for (const moduleState of modulesStates) { const ignitionModulePath = path.join( deploymentsDirectory, - `${moduleResult.moduleId}.json` + `${moduleState.id}.json` ); const serializedModule = JSON.stringify( - moduleResult - .getResults() - .reduce((acc: any, [key, value]: [string, BindingOutput]) => { - acc[key] = serializeBindingOutput(value); + moduleState + .getBindingsStates() + .reduce((acc: any, [bindingId, bindingState]) => { + if (bindingState._kind !== "success") { + throw new Error( + "assertion error: only successful modules should be saved" + ); + } + acc[bindingId] = serializeBindingOutput(bindingState.result); return acc; }, {}), undefined, @@ -193,9 +200,9 @@ export class IgnitionWrapper { } } - private async _getDeploymentResult( + private async _getDeploymentState( chainId: number - ): Promise { + ): Promise { if (this._isHardhatNetwork) { return; } @@ -209,28 +216,33 @@ export class IgnitionWrapper { return; } - const moduleResultFiles = fs.readdirSync(deploymentsDirectory); - - const deploymentResult = new DeploymentResult(); - for (const moduleResultFile of moduleResultFiles) { - const moduleId = path.parse(moduleResultFile).name; - const serializedModuleResult = JSON.parse( - fs - .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) - .toString() - ); - const moduleResult = new ModuleResult(moduleId); - - for (const [bindingId, result] of Object.entries( - serializedModuleResult - )) { - moduleResult.addResult(bindingId, deserializeBindingOutput(result)); - } - - deploymentResult.addResult(moduleResult); - } - - return deploymentResult; + return undefined; + + // TODO implement something like ModuleState.fromJSON() and + // use it to build the deployment state here + + // const moduleResultFiles = fs.readdirSync(deploymentsDirectory); + + // const deploymentState = new DeploymentState(); + // for (const moduleResultFile of moduleResultFiles) { + // const moduleId = path.parse(moduleResultFile).name; + // const serializedModuleResult = JSON.parse( + // fs + // .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) + // .toString() + // ); + // const moduleResult = new ModuleResult(moduleId); + // + // for (const [bindingId, result] of Object.entries( + // serializedModuleResult + // )) { + // moduleResult.addResult(bindingId, deserializeBindingOutput(result)); + // } + // + // deploymentState.addResult(moduleResult); + // } + + // return deploymentState; } } diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index c7bcfde6d5..bd7e144fe4 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,5 +1,5 @@ import { assert } from "chai"; -import { DeploymentResult, UserModule } from "ignition"; +import { DeploymentState, UserModule } from "ignition"; /** * Wait until there are at least `expectedCount` transactions in the mempool @@ -58,29 +58,29 @@ type ExpectedBindingResult = kind: "transaction"; }; type ExpectedModuleResult = Record; -type ExpectedDeploymentResult = Record; +type ExpectedDeploymentState = Record; -export async function assertDeploymentResult( +export async function assertDeploymentState( hre: any, - result: DeploymentResult, - expectedResult: ExpectedDeploymentResult + result: DeploymentState, + expectedResult: ExpectedDeploymentState ) { - const resultModules = result.getModules(); + const modulesStates = result.getModules(); const expectedModules = Object.entries(expectedResult); - assert.equal(resultModules.length, expectedModules.length); + assert.equal(modulesStates.length, expectedModules.length); - for (const resultModule of resultModules) { - const expectedModule = expectedResult[resultModule.moduleId]; + for (const moduleState of modulesStates) { + const expectedModule = expectedResult[moduleState.id]; assert.isDefined(expectedModule); - assert.equal(resultModule.count(), Object.entries(expectedModule).length); + assert.equal(moduleState.count(), Object.entries(expectedModule).length); for (const [bindingId, expectedBindingResult] of Object.entries( expectedModule )) { - const bindingResult = resultModule.getResult(bindingId); + const bindingResult: any = moduleState.getBindingResult(bindingId); if (expectedBindingResult.kind === "contract") { assert.isDefined(bindingResult.address); @@ -118,10 +118,10 @@ export async function deployModules( hre: any, userModules: Array>, expectedBlocks: number[] -): Promise { +): Promise { await hre.run("compile", { quiet: true }); - const deploymentResultPromise: Promise = hre.run( + const deploymentStatePromise: Promise = hre.run( "deploy:deploy-modules", { userModules, @@ -129,9 +129,9 @@ export async function deployModules( ); // eslint-disable-next-line @typescript-eslint/no-floating-promises - mineBlocks(hre, expectedBlocks, deploymentResultPromise); + mineBlocks(hre, expectedBlocks, deploymentStatePromise); - return deploymentResultPromise; + return deploymentStatePromise; } async function mineBlocks( diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 70ba590bef..aa2ad941a7 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,7 +1,7 @@ import { assert } from "chai"; import { buildModule } from "ignition"; import { - assertDeploymentResult, + assertDeploymentState, assertRejects, deployModules, resultAssertions, @@ -23,7 +23,7 @@ describe("integration tests", function () { const deploymentResult = await deployModules(this.hre, [userModule], [1]); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); @@ -43,7 +43,7 @@ describe("integration tests", function () { const deploymentResult = await deployModules(this.hre, [userModule], [2]); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); @@ -72,18 +72,18 @@ describe("integration tests", function () { ); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); }), UsesContract: resultAssertions.contract(async (usesContract) => { const contractAddress = await usesContract.contractAddress(); - const fooAddress = deploymentResult + const fooResult: any = deploymentResult .getModule("MyModule") - .getResult("Foo").address; + .getBindingResult("Foo"); - assert.equal(contractAddress, fooAddress); + assert.equal(contractAddress, fooResult.address); }), }, }); @@ -104,7 +104,7 @@ describe("integration tests", function () { ); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); @@ -133,7 +133,7 @@ describe("integration tests", function () { ); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule: { Foo1: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); @@ -171,7 +171,7 @@ describe("integration tests", function () { ); // then - await assertDeploymentResult(this.hre, deploymentResult, { + await assertDeploymentState(this.hre, deploymentResult, { MyModule1: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); From f11562e7a224f2596ca318478ed0889ab0bfb4d7 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 26 Nov 2021 09:42:19 -0300 Subject: [PATCH 0015/1302] Improve eslint imports order rule --- config/eslint/eslintrc.js | 12 ++++++------ packages/core/src/services.ts | 4 ++-- packages/core/src/tx-sender.ts | 1 + packages/core/test/dag.ts | 1 + packages/core/test/execution-engine.ts | 1 + packages/core/test/helpers.ts | 1 + packages/hardhat-plugin/test/integration.ts | 2 +- 7 files changed, 13 insertions(+), 9 deletions(-) diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index f569962dfc..5d7ef56dc9 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -6,11 +6,7 @@ module.exports = { }, extends: ["plugin:prettier/recommended"], parser: "@typescript-eslint/parser", - plugins: [ - "eslint-plugin-import", - "@typescript-eslint", - "mocha" - ], + plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], rules: { "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": [ @@ -156,6 +152,9 @@ module.exports = { "import/order": [ "error", { + alphabetize: { + order: "asc", + }, groups: [ "object", ["builtin", "external"], @@ -163,6 +162,7 @@ module.exports = { "sibling", "index", ], + "newlines-between": "always" }, ], "no-bitwise": "error", @@ -202,6 +202,6 @@ module.exports = { ], "use-isnan": "error", "mocha/no-skipped-tests": "error", - "mocha/no-exclusive-tests": "error" + "mocha/no-exclusive-tests": "error", }, }; diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index c568e8bd0c..bd75bb2994 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -1,11 +1,11 @@ import debug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; -import { TxSender } from "./tx-sender"; import { IgnitionSigner, Providers } from "./providers"; +import { TxSender } from "./tx-sender"; import { Artifact } from "./types"; -import { sleep } from "./utils"; import { ExecutorUiService, UiService } from "./ui/ui-service"; +import { sleep } from "./utils"; export { ExecutorUiService, UiService }; diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 411024e25a..0a7b4dcd61 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -1,5 +1,6 @@ import debug, { IDebugger } from "debug"; import { ethers } from "ethers"; + import { Journal } from "./journal"; import { GasProvider, IgnitionSigner } from "./providers"; diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 1f5dea9627..32e89d0691 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -1,6 +1,7 @@ import { expect } from "chai"; import { DAG } from "../src/modules"; + import { inc } from "./helpers"; describe("DAG", function () { diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index be2a00778d..eb9979a9e3 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -4,6 +4,7 @@ import { DeploymentState } from "../src/deployment-state"; import { ExecutionEngine } from "../src/execution-engine"; import { NullJournal } from "../src/journal"; import { DAG } from "../src/modules"; + import { emptyDeploymentResult, getMockedProviders, diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index f10f668921..5add645c03 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -10,6 +10,7 @@ import { SignersProvider, TransactionsProvider, } from "../src/providers"; + import { DAG } from "./modules"; export function getMockedProviders(): Providers { diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index aa2ad941a7..93bb7b9137 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,12 +1,12 @@ import { assert } from "chai"; import { buildModule } from "ignition"; + import { assertDeploymentState, assertRejects, deployModules, resultAssertions, } from "./helpers"; - import { useEnvironment } from "./useEnvironment"; describe("integration tests", function () { From 74fbaba2ed015f6cb28ef57eba39d15e9aa31760 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Fri, 26 Nov 2021 15:49:41 -0300 Subject: [PATCH 0016/1302] Read DeploymentState from disk --- packages/core/src/deployment-state.ts | 57 ++++++++++++++----- packages/core/src/execution-engine.ts | 2 +- packages/core/src/index.ts | 8 ++- packages/core/test/execution-engine.ts | 16 ++---- packages/core/test/helpers.ts | 6 +- .../hardhat-plugin/src/ignition-wrapper.ts | 55 +++++++++--------- 6 files changed, 83 insertions(+), 61 deletions(-) diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index 95fb4a345a..f4d7e77333 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -4,11 +4,33 @@ import { DAG, IgnitionModule } from "./modules"; export class DeploymentState { private _modules: Map = new Map(); - constructor(private _dag: DAG) { - for (const module of _dag.getSortedModules()) { - const moduleState = new ModuleState(module.id, module); - this._modules.set(module.id, moduleState); + public static clone(deploymentState: DeploymentState): DeploymentState { + const clonedDeploymentState = new DeploymentState(); + for (const moduleState of deploymentState.getModules()) { + const clonedModuleState = new ModuleState(moduleState.id); + + for (const [bindingId, bindingState] of moduleState.getBindingsStates()) { + clonedModuleState.addBinding(bindingId, bindingState); + } + + clonedDeploymentState.addModule(clonedModuleState); } + + return clonedDeploymentState; + } + + public static fromDAG(dag: DAG): DeploymentState { + const deploymentState = new DeploymentState(); + for (const ignitionModule of dag.getSortedModules()) { + const moduleState = ModuleState.fromIgnitionModule(ignitionModule); + deploymentState.addModule(moduleState); + } + + return deploymentState; + } + + public addModule(moduleState: ModuleState) { + this._modules.set(moduleState.id, moduleState); } public getModule(moduleId: string): ModuleState { @@ -96,10 +118,6 @@ export class DeploymentState { return; } - public clone(): DeploymentState { - return new DeploymentState(this._dag); - } - private _getBindingState(moduleId: string, bindingId: string) { const moduleState = this._getModuleState(moduleId); @@ -147,7 +165,7 @@ export type BindingState = | BindingStateHold; // eslint-disable-next-line @typescript-eslint/no-redeclare -- intentionally naming the variable the same as the type -const BindingState = { +export const BindingState = { waiting(): BindingState { return { _kind: "waiting" }; }, @@ -168,13 +186,22 @@ const BindingState = { export class ModuleState { private _bindings = new Map(); - constructor( - public readonly id: string, - private _ignitionModule: IgnitionModule - ) { - for (const executor of _ignitionModule.getSortedExecutors()) { - this._bindings.set(executor.binding.id, BindingState.waiting()); + public static fromIgnitionModule( + ignitionModule: IgnitionModule + ): ModuleState { + const moduleState = new ModuleState(ignitionModule.id); + + for (const executor of ignitionModule.getSortedExecutors()) { + moduleState.addBinding(executor.binding.id, BindingState.waiting()); } + + return moduleState; + } + + constructor(public readonly id: string) {} + + public addBinding(bindingId: string, bindingState: BindingState) { + this._bindings.set(bindingId, bindingState); } public getBindingsStates(): Array<[string, BindingState]> { diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 7eae14fc8d..26fc03fba5 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -67,7 +67,7 @@ export class ExecutionEngine { ) {} public async *execute(dag: DAG, previousDeploymentState: DeploymentState) { - const deploymentState = previousDeploymentState.clone(); + const deploymentState = DeploymentState.clone(previousDeploymentState); const ids: Record = {}; const modules = dag.getSortedModules(); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d3deda9a8c..7b86cd1b59 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -10,7 +10,7 @@ import { InternalContractBinding, serializeBindingOutput, } from "./bindings"; -import { DeploymentState } from "./deployment-state"; +import { BindingState, DeploymentState, ModuleState } from "./deployment-state"; import { ExecutionEngine, ExecutionManager } from "./execution-engine"; import { Executor, Hold } from "./executors"; import { FileJournal, NullJournal } from "./journal"; @@ -25,6 +25,7 @@ export { buildModule } from "./modules"; export { AddressLike, BindingOutput, + BindingState, Contract, ContractBinding, ContractOptions, @@ -34,6 +35,7 @@ export { InternalBinding, InternalContractBinding, ModuleBuilder, + ModuleState, Providers, Services, UserModule, @@ -92,7 +94,7 @@ export class Ignition { log("Execute deployment"); const newDeploymentState = await executionManager.execute( dag, - currentDeploymentState ?? new DeploymentState(dag) + currentDeploymentState ?? DeploymentState.fromDAG(dag) ); return [newDeploymentState, moduleOutputs] as const; @@ -119,7 +121,7 @@ export class Ignition { return ExecutionEngine.buildPlan( dag, - currentDeploymentState ?? new DeploymentState(dag) + currentDeploymentState ?? DeploymentState.fromDAG(dag) ); } } diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index eb9979a9e3..553fb7b8fc 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -5,13 +5,7 @@ import { ExecutionEngine } from "../src/execution-engine"; import { NullJournal } from "../src/journal"; import { DAG } from "../src/modules"; -import { - emptyDeploymentResult, - getMockedProviders, - inc, - runUntil, - runUntilReady, -} from "./helpers"; +import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; const executionEngineOptions = { parallelizationLevel: 1, @@ -36,7 +30,7 @@ describe("ExecutionEngine", function () { // when const executionGenerator = executionEngine.execute( dag, - emptyDeploymentResult(dag) + DeploymentState.fromDAG(dag) ); const deploymentResult = await runUntilReady(executionGenerator); @@ -73,7 +67,7 @@ describe("ExecutionEngine", function () { // when const executionGenerator = executionEngine.execute( dag, - emptyDeploymentResult(dag) + DeploymentState.fromDAG(dag) ); await runUntil(executionGenerator, () => { return inc1.isRunning(); @@ -129,7 +123,7 @@ describe("ExecutionEngine", function () { // when const executionGenerator = executionEngine.execute( dag, - emptyDeploymentResult(dag) + DeploymentState.fromDAG(dag) ); const deploymentResult = await runUntilReady(executionGenerator); @@ -162,7 +156,7 @@ describe("ExecutionEngine", function () { // when const executionGenerator = executionEngine.execute( dag, - emptyDeploymentResult(dag) + DeploymentState.fromDAG(dag) ); const deploymentResult = await runUntilReady(executionGenerator); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 5add645c03..fdfcf28530 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -11,8 +11,6 @@ import { TransactionsProvider, } from "../src/providers"; -import { DAG } from "./modules"; - export function getMockedProviders(): Providers { return { artifacts: new MockArtifactsProvider(), @@ -23,8 +21,8 @@ export function getMockedProviders(): Providers { }; } -export function emptyDeploymentResult(dag: DAG) { - return new DeploymentState(dag); +export function emptyDeploymentResult() { + return new DeploymentState(); } /** diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 65ae047067..088f972fac 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -6,9 +6,12 @@ import { Binding, DeploymentPlan, DeploymentState, + ModuleState, Ignition, serializeBindingOutput, UserModule, + deserializeBindingOutput, + BindingState, } from "ignition"; import path from "path"; @@ -216,33 +219,31 @@ export class IgnitionWrapper { return; } - return undefined; - - // TODO implement something like ModuleState.fromJSON() and - // use it to build the deployment state here - - // const moduleResultFiles = fs.readdirSync(deploymentsDirectory); - - // const deploymentState = new DeploymentState(); - // for (const moduleResultFile of moduleResultFiles) { - // const moduleId = path.parse(moduleResultFile).name; - // const serializedModuleResult = JSON.parse( - // fs - // .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) - // .toString() - // ); - // const moduleResult = new ModuleResult(moduleId); - // - // for (const [bindingId, result] of Object.entries( - // serializedModuleResult - // )) { - // moduleResult.addResult(bindingId, deserializeBindingOutput(result)); - // } - // - // deploymentState.addResult(moduleResult); - // } - - // return deploymentState; + const deploymentState = new DeploymentState(); + const moduleResultFiles = fs.readdirSync(deploymentsDirectory); + + for (const moduleResultFile of moduleResultFiles) { + const moduleId = path.parse(moduleResultFile).name; + const serializedModuleResult = JSON.parse( + fs + .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) + .toString() + ); + const moduleState = new ModuleState(moduleId); + + for (const [bindingId, result] of Object.entries( + serializedModuleResult + )) { + const bindingState = BindingState.success( + deserializeBindingOutput(result) + ); + moduleState.addBinding(bindingId, bindingState); + } + + deploymentState.addModule(moduleState); + } + + return deploymentState; } } From 155f395dfed7598879bb03e499c5a8bac367b421 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Wed, 8 Dec 2021 09:45:17 -0300 Subject: [PATCH 0017/1302] Refactor execution and DeploymentState --- examples/simple/ignition/MyModule.js | 8 +- packages/core/package.json | 2 +- packages/core/src/bindings.ts | 18 +- packages/core/src/deployment-state.ts | 155 +++++++------ packages/core/src/execution-engine.ts | 205 ++++++++++-------- packages/core/src/executors.ts | 15 +- packages/core/src/index.ts | 72 +++--- packages/core/src/journal.ts | 39 ---- packages/core/src/modules.ts | 10 +- packages/core/src/services.ts | 5 +- packages/core/src/ui/components/index.tsx | 4 +- packages/core/src/ui/ui-service.tsx | 15 +- packages/core/test/dag.ts | 46 ++-- packages/core/test/execution-engine.ts | 65 +++--- packages/core/ui-samples/index.tsx | 60 +++-- packages/core/ui-samples/types.ts | 4 +- packages/hardhat-plugin/package.json | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 168 ++++++-------- packages/hardhat-plugin/src/index.ts | 6 +- packages/hardhat-plugin/test/helpers.ts | 58 +++-- packages/hardhat-plugin/test/integration.ts | 6 +- 21 files changed, 482 insertions(+), 481 deletions(-) diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index 5c2d7121bd..ac49207aaf 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -3,9 +3,9 @@ const { buildModule } = require("ignition") module.exports = buildModule("MyModule", (m) => { const foo = m.contract("Foo") - m.call(foo, "inc", { - args: [1] - }) - + // m.call(foo, "inc", { + // args: [1] + // }) + // return { foo } }); diff --git a/packages/core/package.json b/packages/core/package.json index c93eb14a9c..a4863876dc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -7,7 +7,7 @@ "build": "tsc", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' yarn test", diff --git a/packages/core/src/bindings.ts b/packages/core/src/bindings.ts index 50bf11a0a2..0eafeb371b 100644 --- a/packages/core/src/bindings.ts +++ b/packages/core/src/bindings.ts @@ -4,13 +4,13 @@ export type BindingOutput = string | number | Contract | Tx; export function serializeBindingOutput(x: BindingOutput) { if (typeof x === "string") { - return { _type: "string", value: x }; + return { _kind: "string" as const, value: x }; } else if (typeof x === "number") { - return { _type: "number", value: x }; + return { _kind: "number" as const, value: x }; } else if ("address" in x) { - return { _type: "contract", value: x }; + return { _kind: "contract" as const, value: x }; } else if ("hash" in x) { - return { _type: "tx", value: x }; + return { _kind: "tx" as const, value: x }; } const exhaustiveCheck: never = x; @@ -22,7 +22,7 @@ export function deserializeBindingOutput(x: any) { throw new Error("[deserializeBindingOutput] value is null or undefined"); } - if (!("_type" in x)) { + if (!("_kind" in x)) { throw new Error( "[deserializeBindingOutput] value was not serialized by Ignition" ); @@ -31,6 +31,14 @@ export function deserializeBindingOutput(x: any) { return x.value; } +export type ModuleResult = Record; +export type SerializedModuleResult = Record< + string, + ReturnType +>; + +export type SerializedDeploymentResult = Record; + export abstract class Binding { // dummy variables needed by the type-checker to work correctly when opaque // types are used in a module definition diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index f4d7e77333..702ecd4745 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -1,27 +1,19 @@ -import { BindingOutput } from "./bindings"; -import { DAG, IgnitionModule } from "./modules"; +import { + BindingOutput, + ModuleResult, + serializeBindingOutput, + SerializedModuleResult, +} from "./bindings"; +import { ExecutionGraph, IgnitionModule } from "./modules"; export class DeploymentState { private _modules: Map = new Map(); - public static clone(deploymentState: DeploymentState): DeploymentState { - const clonedDeploymentState = new DeploymentState(); - for (const moduleState of deploymentState.getModules()) { - const clonedModuleState = new ModuleState(moduleState.id); - - for (const [bindingId, bindingState] of moduleState.getBindingsStates()) { - clonedModuleState.addBinding(bindingId, bindingState); - } - - clonedDeploymentState.addModule(clonedModuleState); - } - - return clonedDeploymentState; - } - - public static fromDAG(dag: DAG): DeploymentState { + public static fromExecutionGraph( + executionGraph: ExecutionGraph + ): DeploymentState { const deploymentState = new DeploymentState(); - for (const ignitionModule of dag.getSortedModules()) { + for (const ignitionModule of executionGraph.getSortedModules()) { const moduleState = ModuleState.fromIgnitionModule(ignitionModule); deploymentState.addModule(moduleState); } @@ -33,6 +25,20 @@ export class DeploymentState { this._modules.set(moduleState.id, moduleState); } + public addModuleResult(moduleId: string, moduleResult: ModuleResult) { + const moduleState = this._modules.get(moduleId); + + if (moduleState === undefined) { + throw new Error( + `DeploymentState doesn't have module with id '${moduleId}'` + ); + } + + for (const [bindingId, bindingOutput] of Object.entries(moduleResult)) { + moduleState.setSuccess(bindingId, bindingOutput); + } + } + public getModule(moduleId: string): ModuleState { const moduleState = this._modules.get(moduleId); if (moduleState === undefined) { @@ -70,10 +76,6 @@ export class DeploymentState { return [...this._modules.values()].filter((m) => m.isSuccess()); } - public hasModule(moduleId: string) { - return this._modules.has(moduleId); - } - public isBindingSuccess(moduleId: string, bindingId: string): boolean { const bindingState = this._getBindingState(moduleId, bindingId); @@ -96,7 +98,7 @@ export class DeploymentState { return moduleState.isSuccess(); } - public isHold(): [string, string[]] | undefined { + public getHolds(): [string, string[]] | undefined { for (const [moduleId, moduleState] of this._modules.entries()) { const holds = moduleState.getHolds(); if (holds.length > 0) { @@ -118,6 +120,16 @@ export class DeploymentState { return; } + public setBindingState( + moduleId: string, + bindingId: string, + bindingState: BindingState + ) { + const moduleState = this._getModuleState(moduleId); + + moduleState.setBindingState(bindingId, bindingState); + } + private _getBindingState(moduleId: string, bindingId: string) { const moduleState = this._getModuleState(moduleId); @@ -172,7 +184,7 @@ export const BindingState = { running(): BindingState { return { _kind: "running" }; }, - success(result: any): BindingState { + success(result: BindingOutput): BindingState { return { _kind: "success", result }; }, failure(error: Error): BindingState { @@ -184,6 +196,7 @@ export const BindingState = { }; export class ModuleState { + private _started = false; private _bindings = new Map(); public static fromIgnitionModule( @@ -217,7 +230,9 @@ export class ModuleState { } public isRunning(): boolean { - return [...this._bindings.values()].some((b) => b._kind === "running"); + return ( + !this.isFailure() && !this.isHold() && !this.isSuccess() && this._started + ); } public isFailure(): boolean { @@ -231,64 +246,15 @@ export class ModuleState { ); } - public isBindingDone(bindingId: string): boolean { - return ( - this.isBindingSuccess(bindingId) || - this.isBindingFailure(bindingId) || - this.isBindingHold(bindingId) - ); - } - - public isBindingSuccess(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); - - return bindingState._kind === "success"; - } - - public isBindingFailure(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); - - return bindingState._kind === "failure"; - } - - public isBindingHold(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); - - return bindingState._kind === "hold"; + public setBindingState(bindingId: string, bindingState: BindingState) { + this._started = true; + this._bindings.set(bindingId, bindingState); } public setSuccess(bindingId: string, result: any) { - const bindingState = this._getBinding(bindingId); - - if (bindingState._kind !== "running") { - throw new Error("assertion error"); - } - this._bindings.set(bindingId, BindingState.success(result)); } - public setRunning(bindingId: string) { - this._bindings.set(bindingId, BindingState.running()); - } - - public addFailure(bindingId: string, error: Error) { - this._bindings.set(bindingId, BindingState.failure(error)); - } - - public setHold(bindingId: string, holdReason: string) { - this._bindings.set(bindingId, BindingState.hold(holdReason)); - } - - public getBindingResult(bindingId: string): BindingOutput { - const bindingState = this.getBindingState(bindingId); - - if (bindingState._kind !== "success") { - throw new Error(`assertion error: ${bindingId} should be successful`); - } - - return bindingState.result; - } - public getBindingState(bindingId: string): BindingState { const bindingState = this._bindings.get(bindingId); if (bindingState === undefined) { @@ -316,6 +282,21 @@ export class ModuleState { return this._bindings.size; } + public toModuleResult(): SerializedModuleResult { + const moduleResult: SerializedModuleResult = {}; + + for (const [bindingId, bindingState] of this._bindings.entries()) { + if (bindingState._kind !== "success") { + throw new Error( + "toModuleResult can only be called in successful modules" + ); + } + moduleResult[bindingId] = serializeBindingOutput(bindingState.result); + } + + return moduleResult; + } + private _getBinding(bindingId: string) { const bindingState = this._bindings.get(bindingId); @@ -325,4 +306,22 @@ export class ModuleState { return bindingState; } + + private _isBindingSuccess(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "success"; + } + + private _isBindingFailure(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "failure"; + } + + private _isBindingHold(bindingId: string): boolean { + const bindingState = this._getBinding(bindingId); + + return bindingState._kind === "hold"; + } } diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 26fc03fba5..34d40e4a63 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,9 +1,15 @@ import debug from "debug"; -import { InternalBinding } from "./bindings"; +import { + deserializeBindingOutput, + InternalBinding, + ModuleResult, + SerializedDeploymentResult, + SerializedModuleResult, +} from "./bindings"; import { DeploymentState } from "./deployment-state"; import { Journal } from "./journal"; -import { DAG, IgnitionModule } from "./modules"; +import { ExecutionGraph, IgnitionModule } from "./modules"; import { Providers } from "./providers"; import { ArtifactsService, @@ -11,12 +17,22 @@ import { UiService, Services, TransactionsService, - ExecutorUiService, } from "./services"; import { TxSender } from "./tx-sender"; import { sleep } from "./utils"; -interface ExecutionEngineOptions { +export type GetModuleResult = ( + moduleId: string +) => Promise; + +export type SaveModuleResult = ( + moduleId: string, + moduleResult: SerializedModuleResult +) => Promise; + +export interface ExecutionEngineOptions { + saveModuleResult: SaveModuleResult; + getModuleResult: GetModuleResult; parallelizationLevel: number; loggingEnabled: boolean; txPollingInterval: number; @@ -32,16 +48,17 @@ export type DeploymentPlan = Record; export class ExecutionEngine { private _debug = debug("ignition:execution-engine"); - public static buildPlan( - dag: DAG, - currentDeploymentResult: DeploymentState - ): DeploymentPlan { + public static async buildPlan( + executionGraph: ExecutionGraph, + { getModuleResult }: { getModuleResult: GetModuleResult } + ): Promise { const plan: DeploymentPlan = {}; - const ignitionModules = dag.getSortedModules(); + const ignitionModules = executionGraph.getSortedModules(); for (const ignitionModule of ignitionModules) { - if (currentDeploymentResult.hasModule(ignitionModule.id)) { + const moduleResult = await getModuleResult(ignitionModule.id); + if (moduleResult !== undefined) { plan[ignitionModule.id] = "already-deployed"; continue; } @@ -66,14 +83,10 @@ export class ExecutionEngine { private _options: ExecutionEngineOptions ) {} - public async *execute(dag: DAG, previousDeploymentState: DeploymentState) { - const deploymentState = DeploymentState.clone(previousDeploymentState); + public async *execute(executionGraph: ExecutionGraph) { + const deploymentState = DeploymentState.fromExecutionGraph(executionGraph); - const ids: Record = {}; - const modules = dag.getSortedModules(); - modules.forEach((module) => { - ids[module.id] = module.getSortedExecutors().map((e) => e.binding.id); - }); + const executionModules = executionGraph.getSortedModules(); const uiService = new UiService({ enabled: this._options.loggingEnabled, @@ -83,13 +96,13 @@ export class ExecutionEngine { // validate all modules const errorsPerModule: Map = new Map(); let hasErrors = false; - for (const ignitionModule of dag.getSortedModules()) { - this._debug(`Validating module ${ignitionModule.id}`); - const errors = await this._validateModule(ignitionModule, uiService); + for (const executionModule of executionModules) { + this._debug(`Validating module ${executionModule.id}`); + const errors = await this._validateModule(executionModule); if (errors.length > 0) { hasErrors = true; } - errorsPerModule.set(ignitionModule.id, errors); + errorsPerModule.set(executionModule.id, errors); } if (hasErrors) { @@ -114,19 +127,36 @@ export class ExecutionEngine { } // execute each module sequentially - for (const ignitionModule of dag.getSortedModules()) { - this._debug(`Begin execution of module ${ignitionModule.id}`); + for (const executionModule of executionModules) { + const serializedModuleResult = await this._options.getModuleResult( + executionModule.id + ); + + if (serializedModuleResult !== undefined) { + const moduleResult: ModuleResult = Object.fromEntries( + Object.entries(serializedModuleResult).map(([key, value]) => [ + key, + deserializeBindingOutput(value), + ]) + ); + + deploymentState.addModuleResult(executionModule.id, moduleResult); + + continue; + } + + this._debug(`Begin execution of module ${executionModule.id}`); - if (deploymentState.isModuleSuccess(ignitionModule.id)) { + if (deploymentState.isModuleSuccess(executionModule.id)) { this._debug( - `The module ${ignitionModule.id} was already successfully deployed` + `The module ${executionModule.id} was already successfully deployed` ); continue; } - this._debug(`Executing module ${ignitionModule.id}`); + this._debug(`Executing module ${executionModule.id}`); const moduleExecutionGenerator = this._executeModule( - ignitionModule, + executionModule, deploymentState, uiService ); @@ -142,8 +172,7 @@ export class ExecutionEngine { } private async _validateModule( - ignitionModule: IgnitionModule, - uiService: UiService + ignitionModule: IgnitionModule ): Promise { const executors = ignitionModule.getSortedExecutors(); const allErrors: string[] = []; @@ -154,8 +183,7 @@ export class ExecutionEngine { ); const services = this._createServices( ignitionModule.id, - executor.binding.id, - uiService + executor.binding.id ); const errors = await executor.validate(executor.binding.input, services); @@ -187,39 +215,12 @@ export class ExecutionEngine { (someFailure && runningCount === 0) || (someHold && runningCount === 0) ) { - for (const executor of executors) { - if (!moduleState.isBindingDone(executor.binding.id)) { - if (executor.isSuccess()) { - moduleState.setSuccess(executor.binding.id, executor.getResult()); - } - if (executor.isHold()) { - moduleState.setHold( - executor.binding.id, - executor.getHoldReason() - ); - } - } - } - - const failures = executors - .filter((e) => e.isFailure()) - .map((e) => [e.binding.id, e.getError()]); - - const holds = executors - .filter((e) => e.isHold()) - .map((e) => [e.binding.id, e.getHoldReason()]); - - if (failures.length === 0 && holds.length === 0) { + if (moduleState.isSuccess()) { + const moduleResult = moduleState.toModuleResult(); + await this._options.saveModuleResult(ignitionModule.id, moduleResult); await this._journal.delete(ignitionModule.id); } - failures.forEach(([bindingId, failure]) => - moduleState.addFailure(bindingId, failure) - ); - holds.forEach(([bindingId, holdReason]) => - moduleState.setHold(bindingId, holdReason) - ); - yield moduleState; } @@ -242,33 +243,22 @@ export class ExecutionEngine { ); const services = this._createServices( ignitionModule.id, - executor.binding.id, - uiService + executor.binding.id ); this._debug(`Start ${ignitionModule.id}/${executor.binding.id}`); - moduleState.setRunning(executor.binding.id); + // eslint-disable-next-line @typescript-eslint/no-floating-promises - executor.run(resolvedInput, services); - runningCount++; - } - } + executor.run(resolvedInput, services, (newState) => { + deploymentState.setBindingState( + ignitionModule.id, + executor.binding.id, + newState + ); - if (!moduleState.isBindingDone(executor.binding.id)) { - this._debug( - `Check result of ${ignitionModule.id}/${executor.binding.id}` - ); - if (executor.isSuccess()) { - this._debug( - `${ignitionModule.id}/${executor.binding.id} finished successfully` - ); - moduleState.setSuccess(executor.binding.id, executor.getResult()); - } - if (executor.isHold()) { - this._debug( - `${ignitionModule.id}/${executor.binding.id} is on hold` - ); - moduleState.setHold(executor.binding.id, executor.getHoldReason()); + uiService.render(); + }); + runningCount++; } } } @@ -299,11 +289,7 @@ export class ExecutionEngine { return input; } - private _createServices( - moduleId: string, - executorId: string, - uiService: UiService - ): Services { + private _createServices(moduleId: string, executorId: string): Services { const txSender = new TxSender( moduleId, executorId, @@ -317,13 +303,17 @@ export class ExecutionEngine { pollingInterval: this._options.txPollingInterval, }), transactions: new TransactionsService(this._providers), - ui: new ExecutorUiService(moduleId, executorId, uiService), }; return services; } } +export type DeploymentResult = + | { _kind: "failure"; failures: [string, Error[]] } + | { _kind: "hold"; holds: [string, string[]] } + | { _kind: "success"; result: SerializedDeploymentResult }; + export class ExecutionManager { private _debug = debug("ignition:execution-manager"); constructor( @@ -332,17 +322,44 @@ export class ExecutionManager { ) {} public async execute( - dag: DAG, - deploymentState: DeploymentState - ): Promise { - const executionGenerator = this._engine.execute(dag, deploymentState); + executionGraph: ExecutionGraph + ): Promise { + const executionGenerator = this._engine.execute(executionGraph); while (true) { this._debug("Run next execution iteration"); const deploymentResultIteration = await executionGenerator.next(); if (deploymentResultIteration.value !== undefined) { - return deploymentResultIteration.value; + const deploymentState = deploymentResultIteration.value; + + const failures = deploymentState.getFailures(); + if (failures !== undefined && failures.length > 0) { + return { + _kind: "failure", + failures, + }; + } + + const holds = deploymentState.getHolds(); + if (holds !== undefined && holds.length > 0) { + return { + _kind: "hold", + holds, + }; + } + + const serializedDeploymentResult: SerializedDeploymentResult = {}; + + for (const moduleState of deploymentState.getModules()) { + serializedDeploymentResult[moduleState.id] = + moduleState.toModuleResult(); + } + + return { + _kind: "success", + result: serializedDeploymentResult, + }; } await sleep(this._tickInterval); diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index 08e06b8052..06e28c1231 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -9,6 +9,7 @@ import { InternalContractBinding, Resolved, } from "./bindings"; +import { BindingState } from "./deployment-state"; import { Services } from "./services"; import { Contract, Tx } from "./types"; @@ -40,24 +41,28 @@ export abstract class Executor { abstract validate(input: I, services: Services): Promise; abstract getDescription(): string; - public async run(input: Resolved, services: Services) { + public async run( + input: Resolved, + services: Services, + onStateChange: (newState: BindingState) => void + ) { try { - services.ui.render(); this._debug("Start running"); this._setRunning(); + onStateChange(BindingState.running()); const result = await this.execute(input, services); this._debug("Ended successfully"); - services.ui.render(); this._setSuccess(result); + onStateChange(BindingState.success(result)); } catch (e: any) { if (e instanceof Hold) { - services.ui.render(); this._debug("Ended with hold"); this._setHold(e.reason); + onStateChange(BindingState.hold(e.reason)); } else { - services.ui.render(); this._debug("Ended with error"); this._setFailure(e); + onStateChange(BindingState.failure(e)); } } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 7b86cd1b59..25e2586f33 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,15 +5,22 @@ import { BindingOutput, ContractBinding, ContractOptions, - deserializeBindingOutput, InternalBinding, InternalContractBinding, - serializeBindingOutput, + SerializedDeploymentResult, + SerializedModuleResult, } from "./bindings"; -import { BindingState, DeploymentState, ModuleState } from "./deployment-state"; -import { ExecutionEngine, ExecutionManager } from "./execution-engine"; +import { BindingState, ModuleState } from "./deployment-state"; +import { + DeploymentPlan, + DeploymentResult, + ExecutionEngine, + ExecutionManager, + GetModuleResult, + SaveModuleResult, +} from "./execution-engine"; import { Executor, Hold } from "./executors"; -import { FileJournal, NullJournal } from "./journal"; +import { FileJournal, InMemoryJournal } from "./journal"; import { ModuleBuilder, ModuleBuilderImpl, UserModule } from "./modules"; import { Providers } from "./providers"; import { Services } from "./services"; @@ -29,7 +36,7 @@ export { Contract, ContractBinding, ContractOptions, - DeploymentState, + DeploymentResult, Executor, Hold, InternalBinding, @@ -39,51 +46,58 @@ export { Providers, Services, UserModule, - serializeBindingOutput, - deserializeBindingOutput, + SerializedModuleResult, + SerializedDeploymentResult, }; const log = debug("ignition:main"); +export interface IgnitionDeployOptions { + getModuleResult: GetModuleResult; + saveModuleResult: SaveModuleResult; + pathToJournal: string | undefined; + txPollingInterval: number; +} + export class Ignition { - constructor( - private _providers: Providers, - private _saveDeployment: boolean - ) {} + constructor(private _providers: Providers) {} public async deploy( userModules: Array>, - currentDeploymentState: DeploymentState | undefined, { + getModuleResult, + saveModuleResult, pathToJournal, txPollingInterval, - }: { pathToJournal: string | undefined; txPollingInterval: number } + }: IgnitionDeployOptions ) { log(`Start deploy, '${userModules.length}' modules`); const m = new ModuleBuilderImpl(); - const moduleOutputs: any[] = []; + const moduleOutputs: Record = {}; for (const userModule of userModules) { log("Load module '%s'", userModule.id); const moduleOutput = m.useModule(userModule) ?? {}; - moduleOutputs.push(moduleOutput); + moduleOutputs[userModule.id] = moduleOutput; } - log("Build DAG"); - const dag = m.buildDAG(); + log("Build execution graph"); + const executionGraph = m.buildExecutionGraph(); log("Create journal with path '%s'", pathToJournal); const journal = pathToJournal !== undefined ? new FileJournal(pathToJournal) - : new NullJournal(); + : new InMemoryJournal(); const engine = new ExecutionEngine(this._providers, journal, { parallelizationLevel: 2, loggingEnabled: pathToJournal !== undefined, txPollingInterval, + getModuleResult, + saveModuleResult, }); const executionManager = new ExecutionManager( @@ -92,18 +106,15 @@ export class Ignition { ); log("Execute deployment"); - const newDeploymentState = await executionManager.execute( - dag, - currentDeploymentState ?? DeploymentState.fromDAG(dag) - ); + const deploymentResult = await executionManager.execute(executionGraph); - return [newDeploymentState, moduleOutputs] as const; + return [deploymentResult, moduleOutputs] as const; } public async buildPlan( userModules: Array>, - currentDeploymentState: DeploymentState | undefined - ) { + { getModuleResult }: { getModuleResult: GetModuleResult } + ): Promise { log(`Start building plan, '${userModules.length}' modules`); const m = new ModuleBuilderImpl(); @@ -116,12 +127,9 @@ export class Ignition { moduleOutputs.push(moduleOutput); } - log("Build DAG"); - const dag = m.buildDAG(); + log("Build ExecutionGraph"); + const executionGraph = m.buildExecutionGraph(); - return ExecutionEngine.buildPlan( - dag, - currentDeploymentState ?? DeploymentState.fromDAG(dag) - ); + return ExecutionEngine.buildPlan(executionGraph, { getModuleResult }); } } diff --git a/packages/core/src/journal.ts b/packages/core/src/journal.ts index 3023657ebd..01fbcec8f3 100644 --- a/packages/core/src/journal.ts +++ b/packages/core/src/journal.ts @@ -122,45 +122,6 @@ export class FileJournal implements Journal { } } -/** - * Journal implementation that just no-ops for every method. - * Used when journaling is disabled. - */ -export class NullJournal implements Journal { - private _log: debug.IDebugger = debug("ignition:journal:null-journal"); - - public async addEntry( - moduleId: string, - executorId: string, - _journalEntry: JournalEntry - ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); - return -1; - } - - public async getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); - return undefined; - } - - public async replaceEntry( - moduleId: string, - executorId: string, - txIndex: number, - _entryIndex: JournalEntry - ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); - } - - public async delete(moduleId: string): Promise { - this._log(`Deleting module ${moduleId}`); - } -} - export class InMemoryJournal implements Journal { private _log: debug.IDebugger = debug("ignition:journal:in-memory-journal"); private _journal: Map> = new Map(); diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts index fbc0d5bc4d..3e0257fccd 100644 --- a/packages/core/src/modules.ts +++ b/packages/core/src/modules.ts @@ -52,7 +52,7 @@ export class IgnitionModule { } } -export class DAG { +export class ExecutionGraph { private _modules: Map> = new Map(); private _dependencies: Map> = new Map(); @@ -154,7 +154,7 @@ export interface ModuleBuilder { export class ModuleBuilderImpl implements ModuleBuilder { private _currentModuleId: string | undefined; - private _dag = new DAG(); + private _executionGraph = new ExecutionGraph(); private _executors: Executor[] = []; private _knownModules: Map, any]> = new Map(); @@ -168,8 +168,8 @@ export class ModuleBuilderImpl implements ModuleBuilder { return this._currentModuleId; } - public buildDAG(): DAG { - return this._dag; + public buildExecutionGraph(): ExecutionGraph { + return this._executionGraph; } public addExecutor(executor: Executor) { @@ -177,7 +177,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); } - this._dag.addExecutor(executor); + this._executionGraph.addExecutor(executor); } public contract( diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index bd75bb2994..9a2f73b186 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -4,10 +4,10 @@ import { ethers, Contract, ContractFactory } from "ethers"; import { IgnitionSigner, Providers } from "./providers"; import { TxSender } from "./tx-sender"; import { Artifact } from "./types"; -import { ExecutorUiService, UiService } from "./ui/ui-service"; +import { UiService } from "./ui/ui-service"; import { sleep } from "./utils"; -export { ExecutorUiService, UiService }; +export { UiService }; interface TransactionOptions { gasLimit?: ethers.BigNumberish; @@ -231,5 +231,4 @@ export interface Services { contracts: ContractsService; artifacts: ArtifactsService; transactions: TransactionsService; - ui: ExecutorUiService; } diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx index 39bd7f49f8..ca5297533b 100644 --- a/packages/core/src/ui/components/index.tsx +++ b/packages/core/src/ui/components/index.tsx @@ -1,6 +1,6 @@ -import React from "react"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; +import React from "react"; import { BindingState, @@ -109,6 +109,8 @@ const Binding = ({ ) : bindingState._kind === "success" ? ( {bindingId}: Executed ) : bindingState._kind === "ready" ? ( + {bindingId}: Ready + ) : bindingState._kind === "waiting" ? ( {bindingId}: Waiting ) : null} diff --git a/packages/core/src/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx index 56f65ed107..98db3bd4cb 100644 --- a/packages/core/src/ui/ui-service.tsx +++ b/packages/core/src/ui/ui-service.tsx @@ -1,20 +1,9 @@ -import React from "react"; import { render } from "ink"; +import React from "react"; import { DeploymentState } from "../deployment-state"; -import { IgnitionUi } from "./components"; - -export class ExecutorUiService { - constructor( - private _moduleId: string, - private _executorId: string, - private _uiService: UiService - ) {} - public render() { - this._uiService.render(); - } -} +import { IgnitionUi } from "./components"; export class UiService { private _enabled: boolean; diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 32e89d0691..260fc350d5 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -1,18 +1,20 @@ import { expect } from "chai"; -import { DAG } from "../src/modules"; +import { ExecutionGraph } from "../src/modules"; import { inc } from "./helpers"; -describe("DAG", function () { +describe("ExecutionGraph", function () { describe("sort modules", function () { it("should work for a single module", function () { // given - const dag = new DAG(); - dag.addExecutor(inc("MyModule", "inc1", 1)); + const executionGraph = new ExecutionGraph(); + executionGraph.addExecutor(inc("MyModule", "inc1", 1)); // when - const ignitionModules = dag.getSortedModules().map((m) => m.id); + const ignitionModules = executionGraph + .getSortedModules() + .map((m) => m.id); // then expect(ignitionModules).to.deep.equal(["MyModule"]); @@ -20,15 +22,17 @@ describe("DAG", function () { it("should work for two modules", function () { // given - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const module1Inc = inc("Module1", "inc1", 1); const module2Inc = inc("Module2", "inc1", module1Inc.binding); - dag.addExecutor(module2Inc); - dag.addExecutor(module1Inc); + executionGraph.addExecutor(module2Inc); + executionGraph.addExecutor(module1Inc); // when - const ignitionModules = dag.getSortedModules().map((m) => m.id); + const ignitionModules = executionGraph + .getSortedModules() + .map((m) => m.id); // then expect(ignitionModules).to.deep.equal(["Module1", "Module2"]); @@ -38,11 +42,11 @@ describe("DAG", function () { describe("sort executors", function () { it("should work for a single executor", function () { // given - const dag = new DAG(); - dag.addExecutor(inc("MyModule", "inc1", 1)); + const executionGraph = new ExecutionGraph(); + executionGraph.addExecutor(inc("MyModule", "inc1", 1)); // when - const [ignitionModule] = dag.getSortedModules(); + const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); @@ -53,13 +57,13 @@ describe("DAG", function () { it("should work for two executors", function () { // given - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); - dag.addExecutor(inc("MyModule", "incInc1", inc1.binding)); - dag.addExecutor(inc1); + executionGraph.addExecutor(inc("MyModule", "incInc1", inc1.binding)); + executionGraph.addExecutor(inc1); // when - const [ignitionModule] = dag.getSortedModules(); + const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); @@ -70,16 +74,16 @@ describe("DAG", function () { it("should work for three sequential executors", function () { // given - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); const incInc1 = inc("MyModule", "incInc1", inc1.binding); const incIncInc1 = inc("MyModule", "incIncInc1", incInc1.binding); - dag.addExecutor(incIncInc1); - dag.addExecutor(inc1); - dag.addExecutor(incInc1); + executionGraph.addExecutor(incIncInc1); + executionGraph.addExecutor(inc1); + executionGraph.addExecutor(incInc1); // when - const [ignitionModule] = dag.getSortedModules(); + const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() .map((e) => e.binding.id); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 553fb7b8fc..27ffdbb50d 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -1,16 +1,23 @@ import { assert } from "chai"; import { DeploymentState } from "../src/deployment-state"; -import { ExecutionEngine } from "../src/execution-engine"; -import { NullJournal } from "../src/journal"; -import { DAG } from "../src/modules"; +import { + ExecutionEngine, + ExecutionEngineOptions, +} from "../src/execution-engine"; +import { InMemoryJournal } from "../src/journal"; +import { ExecutionGraph } from "../src/modules"; import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; -const executionEngineOptions = { +const executionEngineOptions: ExecutionEngineOptions = { parallelizationLevel: 1, loggingEnabled: false, txPollingInterval: 100, + getModuleResult: async () => { + return undefined; + }, + saveModuleResult: async () => {}, }; describe("ExecutionEngine", function () { @@ -18,20 +25,17 @@ describe("ExecutionEngine", function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), - new NullJournal(), + new InMemoryJournal(), executionEngineOptions ); const inc1 = inc("MyModule", "inc1", 1); - const dag = new DAG(); - dag.addExecutor(inc1); + const executionGraph = new ExecutionGraph(); + executionGraph.addExecutor(inc1); // when - const executionGenerator = executionEngine.execute( - dag, - DeploymentState.fromDAG(dag) - ); + const executionGenerator = executionEngine.execute(executionGraph); const deploymentResult = await runUntilReady(executionGenerator); // then @@ -53,22 +57,19 @@ describe("ExecutionEngine", function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), - new NullJournal(), + new InMemoryJournal(), executionEngineOptions ); - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "on-demand"; const incInc1 = inc("MyModule", "incInc1", inc1.binding); - dag.addExecutor(inc1); - dag.addExecutor(incInc1); + executionGraph.addExecutor(inc1); + executionGraph.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute( - dag, - DeploymentState.fromDAG(dag) - ); + const executionGenerator = executionEngine.execute(executionGraph); await runUntil(executionGenerator, () => { return inc1.isRunning(); }); @@ -109,22 +110,19 @@ describe("ExecutionEngine", function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), - new NullJournal(), + new InMemoryJournal(), executionEngineOptions ); - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "fail"; const incInc1 = inc("MyModule", "incInc1", inc1.binding); - dag.addExecutor(inc1); - dag.addExecutor(incInc1); + executionGraph.addExecutor(inc1); + executionGraph.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute( - dag, - DeploymentState.fromDAG(dag) - ); + const executionGenerator = executionEngine.execute(executionGraph); const deploymentResult = await runUntilReady(executionGenerator); // then @@ -142,22 +140,19 @@ describe("ExecutionEngine", function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), - new NullJournal(), + new InMemoryJournal(), executionEngineOptions ); - const dag = new DAG(); + const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "hold"; const incInc1 = inc("MyModule", "incInc1", inc1.binding); - dag.addExecutor(inc1); - dag.addExecutor(incInc1); + executionGraph.addExecutor(inc1); + executionGraph.addExecutor(incInc1); // when - const executionGenerator = executionEngine.execute( - dag, - DeploymentState.fromDAG(dag) - ); + const executionGenerator = executionEngine.execute(executionGraph); const deploymentResult = await runUntilReady(executionGenerator); // then diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index bb2462d969..5bdda479ca 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -1,8 +1,12 @@ import { render, useInput } from "ink"; import { useRef, useState } from "react"; +import { + BindingState, + DeploymentState, + ModuleState, +} from "../src/deployment-state"; import { IgnitionUi } from "../src/ui/components"; -import { UiData } from "../src/ui/ui-data"; import { Example } from "./types"; @@ -29,8 +33,8 @@ function getExamples(): Example[] { MyModule: ["Foo"], }, transitions: [ - (d) => d.startExecutor("MyModule", "Foo"), - (d) => d.finishExecutor("MyModule", "Foo"), + (d) => d.setBindingState("MyModule", "Foo", BindingState.running()), + (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), ], }); @@ -41,11 +45,11 @@ function getExamples(): Example[] { }, transitions: [ (d) => { - d.startExecutor("MyModule", "Foo"); - d.startExecutor("MyModule", "Bar"); + d.setBindingState("MyModule", "Foo", BindingState.running()); + d.setBindingState("MyModule", "Bar", BindingState.running()); }, - (d) => d.finishExecutor("MyModule", "Bar"), - (d) => d.finishExecutor("MyModule", "Foo"), + (d) => d.setBindingState("MyModule", "Bar", BindingState.success(2)), + (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), ], }); @@ -56,10 +60,30 @@ function getExamples(): Example[] { MyOtherModule: ["Bar"], }, transitions: [ - (d) => d.startExecutor("MyModule", "Foo"), - (d) => d.finishExecutor("MyModule", "Foo"), - (d) => d.startExecutor("MyOtherModule", "Bar"), - (d) => d.finishExecutor("MyOtherModule", "Bar"), + (d) => d.setBindingState("MyModule", "Foo", BindingState.running()), + (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), + (d) => d.setBindingState("MyOtherModule", "Bar", BindingState.running()), + (d) => d.setBindingState("MyOtherModule", "Bar", BindingState.success(1)), + ], + }); + + examples.push({ + only: true, + description: "Two parallel deploys followed by two parallel calls", + initialData: { + MyModule: ["Foo", "Bar", "Foo.f", "Bar.b"], + }, + transitions: [ + (d) => { + d.setBindingState("MyModule", "Foo", BindingState.running()); + d.setBindingState("MyModule", "Bar", BindingState.running()); + }, + (d) => d.setBindingState("MyModule", "Bar", BindingState.success(1)), + (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), + (d) => d.setBindingState("MyModule", "Foo.f", BindingState.running()), + (d) => d.setBindingState("MyModule", "Bar.b", BindingState.running()), + (d) => d.setBindingState("MyModule", "Foo.f", BindingState.success(1)), + (d) => d.setBindingState("MyModule", "Bar.b", BindingState.success(1)), ], }); @@ -91,13 +115,21 @@ const ExampleRenderer = ({ example: Example; onFinish: () => void; }) => { - const uiData = useRef(new UiData(initialData)); + const deploymentState = new DeploymentState(); + for (const [moduleId, bindingsIds] of Object.entries(initialData)) { + const moduleState = new ModuleState(moduleId); + for (const bindingId of bindingsIds) { + moduleState.addBinding(bindingId, BindingState.waiting()); + } + deploymentState.addModule(moduleState); + } + const deploymentStateRef = useRef(deploymentState); const [transitionIndex, setTransitionIndex] = useState(0); useInput((input, key) => { if (input === "n") { if (transitionIndex < transitions.length) { - transitions[transitionIndex](uiData.current); + transitions[transitionIndex](deploymentStateRef.current); setTransitionIndex(transitionIndex + 1); } else { onFinish(); @@ -105,7 +137,7 @@ const ExampleRenderer = ({ } }); - return ; + return ; }; main(); diff --git a/packages/core/ui-samples/types.ts b/packages/core/ui-samples/types.ts index d46a123647..83a2af2dd5 100644 --- a/packages/core/ui-samples/types.ts +++ b/packages/core/ui-samples/types.ts @@ -1,6 +1,6 @@ -import { UiData } from "../src/ui/ui-data"; +import { DeploymentState } from "../src/deployment-state"; -type ExampleTransition = (d: UiData) => void; +type ExampleTransition = (d: DeploymentState) => void; export interface Example { only?: boolean; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 5edaaac016..d33ba36dbb 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -7,7 +7,7 @@ "build": "tsc", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint \"src/**/*.ts\" \"test/**/*.ts\"", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test" diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 088f972fac..9a5454b0f7 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,17 +1,13 @@ import { ethers } from "ethers"; -import fs from "fs"; import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import { Binding, DeploymentPlan, - DeploymentState, - ModuleState, Ignition, - serializeBindingOutput, UserModule, - deserializeBindingOutput, - BindingState, + IgnitionDeployOptions, + SerializedModuleResult, } from "ignition"; import path from "path"; @@ -20,6 +16,7 @@ type HardhatPaths = HardhatConfig["paths"]; export class IgnitionWrapper { private _ignition: Ignition; + private _chainId: number | undefined; constructor( services: any, @@ -31,7 +28,7 @@ export class IgnitionWrapper { txPollingInterval: number; } ) { - this._ignition = new Ignition(services, !this._isHardhatNetwork); + this._ignition = new Ignition(services); } public async deploy( @@ -44,10 +41,6 @@ export class IgnitionWrapper { public async deployMany( userModulesOrNames: Array | string> ): Promise>> { - const { chainId } = await this._ethers.provider.getNetwork(); - - const currentDeploymentState = await this._getDeploymentState(chainId); - const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { const userModule: UserModule = @@ -58,21 +51,25 @@ export class IgnitionWrapper { userModules.push(userModule); } - const [deploymentState, moduleOutputs] = await this._ignition.deploy( + const deployOptions: IgnitionDeployOptions = { + ...this._deployOptions, + getModuleResult: (moduleId) => this._getModuleResult(moduleId), + saveModuleResult: (moduleId, moduleResult) => + this._saveModuleResult(moduleId, moduleResult), + }; + + const [deploymentResult, moduleOutputs] = await this._ignition.deploy( userModules, - currentDeploymentState, - this._deployOptions + deployOptions ); - const moduleIdAndHoldReason = deploymentState.isHold(); - if (moduleIdAndHoldReason !== undefined) { - const [moduleId, holdReason] = moduleIdAndHoldReason; + if (deploymentResult._kind === "hold") { + const [moduleId, holdReason] = deploymentResult.holds; throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); } - const moduleIdAndFailures = deploymentState.getFailures(); - if (moduleIdAndFailures !== undefined) { - const [moduleId, failures] = moduleIdAndFailures; + if (deploymentResult._kind === "failure") { + const [moduleId, failures] = deploymentResult.failures; let failuresMessage = ""; for (const failure of failures) { @@ -84,42 +81,34 @@ export class IgnitionWrapper { ); } - await this._saveDeploymentState(chainId, deploymentState); - const resolvedOutputs: any = []; - for (const moduleOutput of moduleOutputs) { + for (const moduleOutput of Object.values(moduleOutputs)) { const resolvedOutput: any = {}; for (const [key, value] of Object.entries(moduleOutput as any)) { - const bindingResult = deploymentState.getBindingResult( - value.moduleId, - value.id - )!; + const serializedBindingResult = + deploymentResult.result[value.moduleId][value.id]; if ( - typeof bindingResult === "string" || - typeof bindingResult === "number" + serializedBindingResult._kind === "string" || + serializedBindingResult._kind === "number" ) { - resolvedOutput[key] = bindingResult; - } else if ("hash" in bindingResult) { - resolvedOutput[key] = bindingResult.hash; + resolvedOutput[key] = serializedBindingResult; + } else if (serializedBindingResult._kind === "tx") { + resolvedOutput[key] = serializedBindingResult.value.hash; } else { - const { abi, address } = bindingResult; + const { abi, address } = serializedBindingResult.value; resolvedOutput[key] = await this._ethers.getContractAt(abi, address); } } resolvedOutputs.push(resolvedOutput); } - return [deploymentState, resolvedOutputs]; + return [deploymentResult, resolvedOutputs]; } public async buildPlan( userModulesOrNames: Array | string> ): Promise { - const { chainId } = await this._ethers.provider.getNetwork(); - - const currentDeploymentState = await this._getDeploymentState(chainId); - const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { const userModule: UserModule = @@ -130,10 +119,9 @@ export class IgnitionWrapper { userModules.push(userModule); } - const plan = await this._ignition.buildPlan( - userModules, - currentDeploymentState - ); + const plan = await this._ignition.buildPlan(userModules, { + getModuleResult: (moduleId) => this._getModuleResult(moduleId), + }); return plan; } @@ -162,88 +150,60 @@ export class IgnitionWrapper { throw new Error(`No module with id ${moduleId}`); } - private async _saveDeploymentState( - chainId: number, - deploymentState: DeploymentState - ) { + private async _getModuleResult( + moduleId: string + ): Promise { if (this._isHardhatNetwork) { return; } - const deploymentsDirectory = path.join( + if (this._chainId === undefined) { + const { chainId } = await this._ethers.provider.getNetwork(); + this._chainId = chainId; + } + + const moduleResultPath = path.join( this._paths.deployments, - String(chainId) + String(this._chainId), + `${moduleId}.json` ); - fsExtra.ensureDirSync(deploymentsDirectory); - const modulesStates = deploymentState.getModules(); + if (!(await fsExtra.pathExists(moduleResultPath))) { + return; + } - for (const moduleState of modulesStates) { - const ignitionModulePath = path.join( - deploymentsDirectory, - `${moduleState.id}.json` - ); + const serializedModuleResult = await fsExtra.readJson(moduleResultPath); - const serializedModule = JSON.stringify( - moduleState - .getBindingsStates() - .reduce((acc: any, [bindingId, bindingState]) => { - if (bindingState._kind !== "success") { - throw new Error( - "assertion error: only successful modules should be saved" - ); - } - acc[bindingId] = serializeBindingOutput(bindingState.result); - return acc; - }, {}), - undefined, - 2 - ); - fs.writeFileSync(ignitionModulePath, serializedModule); - } + return serializedModuleResult; } - private async _getDeploymentState( - chainId: number - ): Promise { + private async _saveModuleResult( + moduleId: string, + serializedModuleResult: SerializedModuleResult + ): Promise { if (this._isHardhatNetwork) { return; } + if (this._chainId === undefined) { + const { chainId } = await this._ethers.provider.getNetwork(); + this._chainId = chainId; + } + const deploymentsDirectory = path.join( this._paths.deployments, - String(chainId) + String(this._chainId) ); + fsExtra.ensureDirSync(deploymentsDirectory); - if (!fsExtra.existsSync(deploymentsDirectory)) { - return; - } - - const deploymentState = new DeploymentState(); - const moduleResultFiles = fs.readdirSync(deploymentsDirectory); - - for (const moduleResultFile of moduleResultFiles) { - const moduleId = path.parse(moduleResultFile).name; - const serializedModuleResult = JSON.parse( - fs - .readFileSync(path.join(deploymentsDirectory, moduleResultFile)) - .toString() - ); - const moduleState = new ModuleState(moduleId); - - for (const [bindingId, result] of Object.entries( - serializedModuleResult - )) { - const bindingState = BindingState.success( - deserializeBindingOutput(result) - ); - moduleState.addBinding(bindingId, bindingState); - } - - deploymentState.addModule(moduleState); - } + const moduleResultPath = path.join( + deploymentsDirectory, + `${moduleId}.json` + ); - return deploymentState; + await fsExtra.writeJson(moduleResultPath, serializedModuleResult, { + spaces: 2, + }); } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d00d0a37c1..be569857a8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -138,9 +138,11 @@ subtask("deploy:deploy-modules") process.exit(0); } - const [deploymentResult] = await hre.ignition.deployMany(userModules); + const [serializedDeploymentResult] = await hre.ignition.deployMany( + userModules + ); - return deploymentResult; + return serializedDeploymentResult; } ); diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index bd7e144fe4..e2aaa9f345 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,5 +1,9 @@ import { assert } from "chai"; -import { DeploymentState, UserModule } from "ignition"; +import { + UserModule, + SerializedDeploymentResult, + DeploymentResult, +} from "ignition"; /** * Wait until there are at least `expectedCount` transactions in the mempool @@ -62,39 +66,51 @@ type ExpectedDeploymentState = Record; export async function assertDeploymentState( hre: any, - result: DeploymentState, + result: SerializedDeploymentResult, expectedResult: ExpectedDeploymentState ) { - const modulesStates = result.getModules(); + const modulesResults = Object.entries(result); const expectedModules = Object.entries(expectedResult); - assert.equal(modulesStates.length, expectedModules.length); + assert.equal(modulesResults.length, expectedModules.length); - for (const moduleState of modulesStates) { - const expectedModule = expectedResult[moduleState.id]; + for (const [moduleId, moduleResult] of modulesResults) { + const expectedModule = expectedResult[moduleId]; assert.isDefined(expectedModule); - assert.equal(moduleState.count(), Object.entries(expectedModule).length); + assert.equal( + Object.entries(moduleResult).length, + Object.entries(expectedModule).length + ); for (const [bindingId, expectedBindingResult] of Object.entries( expectedModule )) { - const bindingResult: any = moduleState.getBindingResult(bindingId); + const bindingResult = moduleResult[bindingId]; if (expectedBindingResult.kind === "contract") { - assert.isDefined(bindingResult.address); - await assertHasCode(hre, bindingResult.address); + if (bindingResult._kind !== "contract") { + assert.fail( + `Expected binding result to be a contract, but got ${bindingResult._kind}` + ); + } + await assertHasCode(hre, bindingResult.value.address); const contract = await hre.ethers.getContractAt( - bindingResult.abi, - bindingResult.address + bindingResult.value.abi, + bindingResult.value.address ); await expectedBindingResult.predicate(contract); } else if (expectedBindingResult.kind === "transaction") { - assert.isDefined(bindingResult.hash); - await assertTxMined(hre, bindingResult.hash); + if (bindingResult._kind !== "tx") { + assert.fail( + `Expected binding result to be a transaction, but got ${bindingResult._kind}` + ); + } + assert.isDefined(bindingResult.value.hash); + await assertTxMined(hre, bindingResult.value.hash); } else { const _exhaustiveCheck: never = expectedBindingResult; } @@ -118,10 +134,10 @@ export async function deployModules( hre: any, userModules: Array>, expectedBlocks: number[] -): Promise { +): Promise { await hre.run("compile", { quiet: true }); - const deploymentStatePromise: Promise = hre.run( + const deploymentResultPromise: Promise = hre.run( "deploy:deploy-modules", { userModules, @@ -129,9 +145,15 @@ export async function deployModules( ); // eslint-disable-next-line @typescript-eslint/no-floating-promises - mineBlocks(hre, expectedBlocks, deploymentStatePromise); + mineBlocks(hre, expectedBlocks, deploymentResultPromise); + + const deploymentResult = await deploymentResultPromise; + + if (deploymentResult._kind !== "success") { + assert.fail("Expected deployment result to be successful"); + } - return deploymentStatePromise; + return deploymentResult.result; } async function mineBlocks( diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 93bb7b9137..c3d79c41ad 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -79,11 +79,9 @@ describe("integration tests", function () { }), UsesContract: resultAssertions.contract(async (usesContract) => { const contractAddress = await usesContract.contractAddress(); - const fooResult: any = deploymentResult - .getModule("MyModule") - .getBindingResult("Foo"); + const fooResult: any = deploymentResult.MyModule.Foo; - assert.equal(contractAddress, fooResult.address); + assert.equal(contractAddress, fooResult.value.address); }), }, }); From 1ddf0a8a55c28d9f7672fee5d9b7410c19a752f0 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Sat, 8 Jan 2022 11:31:32 -0300 Subject: [PATCH 0018/1302] Code review and cleanup --- config/eslint/eslintrc.js | 4 +- examples/simple-ts/hardhat.config.ts | 6 +- examples/simple-ts/ignition/Timelock.ts | 2 +- packages/core/package.json | 2 +- packages/core/src/bindings.ts | 6 +- packages/core/src/execution-engine.ts | 32 ++-- packages/core/src/executors.ts | 4 +- packages/core/src/index.ts | 65 +++---- packages/core/src/journal.ts | 8 +- packages/core/src/services.ts | 4 +- packages/core/src/tx-sender.ts | 4 +- packages/core/test/execution-engine.ts | 16 +- packages/core/ui-samples/index.tsx | 1 - packages/hardhat-plugin/.mocharc.json | 3 +- packages/hardhat-plugin/package.json | 2 + .../hardhat-plugin/src/ignition-wrapper.ts | 96 +++++----- packages/hardhat-plugin/src/index.ts | 171 +++++++++--------- packages/hardhat-plugin/src/modules.ts | 43 ----- packages/hardhat-plugin/src/user-modules.ts | 49 +++++ packages/hardhat-plugin/test/helpers.ts | 134 ++++++++------ packages/hardhat-plugin/test/integration.ts | 4 +- packages/hardhat-plugin/test/setup.ts | 4 + yarn.lock | 19 ++ 23 files changed, 365 insertions(+), 314 deletions(-) delete mode 100644 packages/hardhat-plugin/src/modules.ts create mode 100644 packages/hardhat-plugin/src/user-modules.ts create mode 100644 packages/hardhat-plugin/test/setup.ts diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index 5d7ef56dc9..f91d985814 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -138,6 +138,7 @@ module.exports = { }, ], "@typescript-eslint/unified-signatures": "error", + "@typescript-eslint/return-await": "error", "constructor-super": "error", eqeqeq: ["error", "always"], "guard-for-in": "error", @@ -162,7 +163,7 @@ module.exports = { "sibling", "index", ], - "newlines-between": "always" + "newlines-between": "always", }, ], "no-bitwise": "error", @@ -177,7 +178,6 @@ module.exports = { "no-new-func": "error", "no-new-wrappers": "error", "no-return-await": "off", - "@typescript-eslint/return-await": "error", "no-sequences": "error", "no-sparse-arrays": "error", "no-template-curly-in-string": "error", diff --git a/examples/simple-ts/hardhat.config.ts b/examples/simple-ts/hardhat.config.ts index 60a81a8d0a..d8bfb8e441 100644 --- a/examples/simple-ts/hardhat.config.ts +++ b/examples/simple-ts/hardhat.config.ts @@ -4,10 +4,6 @@ import "@nomiclabs/hardhat-ignition" export default { solidity: "0.8.4", networks: { - hardhat: { - // mining: { - // auto: false - // } - }, + hardhat: {}, }, }; diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index ffcf234b0d..168dc0000f 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -76,7 +76,7 @@ class TimelockCallExecutor extends Executor { } public getDescription() { - return "Deploy contract with multisig and timelock"; + return "Deploy contract with timelock"; } } diff --git a/packages/core/package.json b/packages/core/package.json index a4863876dc..2451b8b409 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -19,6 +19,7 @@ "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", + "@types/react": "^17.0.35", "@types/sinon": "^10.0.6", "@types/tmp": "^0.2.2", "@typescript-eslint/eslint-plugin": "4.31.2", @@ -37,7 +38,6 @@ "typescript": "^4.4.3" }, "dependencies": { - "@types/react": "^17.0.35", "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", diff --git a/packages/core/src/bindings.ts b/packages/core/src/bindings.ts index 0eafeb371b..09c383a460 100644 --- a/packages/core/src/bindings.ts +++ b/packages/core/src/bindings.ts @@ -32,10 +32,8 @@ export function deserializeBindingOutput(x: any) { } export type ModuleResult = Record; -export type SerializedModuleResult = Record< - string, - ReturnType ->; +export type SerializedModuleResult = Record; +export type SerializedBindingResult = ReturnType; export type SerializedDeploymentResult = Record; diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 34d40e4a63..29e2a86f2d 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,4 +1,4 @@ -import debug from "debug"; +import setupDebug from "debug"; import { deserializeBindingOutput, @@ -21,18 +21,15 @@ import { import { TxSender } from "./tx-sender"; import { sleep } from "./utils"; -export type GetModuleResult = ( - moduleId: string -) => Promise; - -export type SaveModuleResult = ( - moduleId: string, - moduleResult: SerializedModuleResult -) => Promise; +export interface IgnitionModulesResults { + load: (moduleId: string) => Promise; + save: ( + moduleId: string, + moduleResult: SerializedModuleResult + ) => Promise; +} export interface ExecutionEngineOptions { - saveModuleResult: SaveModuleResult; - getModuleResult: GetModuleResult; parallelizationLevel: number; loggingEnabled: boolean; txPollingInterval: number; @@ -46,18 +43,18 @@ type ModulePlan = "already-deployed" | ExecutorPlan[]; export type DeploymentPlan = Record; export class ExecutionEngine { - private _debug = debug("ignition:execution-engine"); + private _debug = setupDebug("ignition:execution-engine"); public static async buildPlan( executionGraph: ExecutionGraph, - { getModuleResult }: { getModuleResult: GetModuleResult } + modulesResults: IgnitionModulesResults ): Promise { const plan: DeploymentPlan = {}; const ignitionModules = executionGraph.getSortedModules(); for (const ignitionModule of ignitionModules) { - const moduleResult = await getModuleResult(ignitionModule.id); + const moduleResult = await modulesResults.load(ignitionModule.id); if (moduleResult !== undefined) { plan[ignitionModule.id] = "already-deployed"; continue; @@ -80,6 +77,7 @@ export class ExecutionEngine { constructor( private _providers: Providers, private _journal: Journal, + private _modulesResults: IgnitionModulesResults, private _options: ExecutionEngineOptions ) {} @@ -128,7 +126,7 @@ export class ExecutionEngine { // execute each module sequentially for (const executionModule of executionModules) { - const serializedModuleResult = await this._options.getModuleResult( + const serializedModuleResult = await this._modulesResults.load( executionModule.id ); @@ -217,7 +215,7 @@ export class ExecutionEngine { ) { if (moduleState.isSuccess()) { const moduleResult = moduleState.toModuleResult(); - await this._options.saveModuleResult(ignitionModule.id, moduleResult); + await this._modulesResults.save(ignitionModule.id, moduleResult); await this._journal.delete(ignitionModule.id); } @@ -315,7 +313,7 @@ export type DeploymentResult = | { _kind: "success"; result: SerializedDeploymentResult }; export class ExecutionManager { - private _debug = debug("ignition:execution-manager"); + private _debug = setupDebug("ignition:execution-manager"); constructor( private _engine: ExecutionEngine, private _tickInterval: number diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts index 06e28c1231..2b461f5459 100644 --- a/packages/core/src/executors.ts +++ b/packages/core/src/executors.ts @@ -1,4 +1,4 @@ -import debug, { IDebugger } from "debug"; +import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; import { @@ -34,7 +34,7 @@ export abstract class Executor { constructor(public readonly binding: InternalBinding) { const moduleId = binding.moduleId; const bindingId = binding.id; - this._debug = debug(`ignition:executor:${moduleId}:${bindingId}`); + this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); } abstract execute(input: Resolved, services: Services): Promise; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 25e2586f33..dce27b976d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,23 +1,21 @@ -import debug from "debug"; +import setupDebug from "debug"; import { AddressLike, - BindingOutput, ContractBinding, ContractOptions, InternalBinding, InternalContractBinding, SerializedDeploymentResult, SerializedModuleResult, + SerializedBindingResult, } from "./bindings"; -import { BindingState, ModuleState } from "./deployment-state"; import { DeploymentPlan, DeploymentResult, ExecutionEngine, ExecutionManager, - GetModuleResult, - SaveModuleResult, + IgnitionModulesResults, } from "./execution-engine"; import { Executor, Hold } from "./executors"; import { FileJournal, InMemoryJournal } from "./journal"; @@ -31,8 +29,6 @@ export { DeploymentPlan } from "./execution-engine"; export { buildModule } from "./modules"; export { AddressLike, - BindingOutput, - BindingState, Contract, ContractBinding, ContractOptions, @@ -42,45 +38,43 @@ export { InternalBinding, InternalContractBinding, ModuleBuilder, - ModuleState, Providers, Services, UserModule, + SerializedBindingResult, SerializedModuleResult, SerializedDeploymentResult, }; -const log = debug("ignition:main"); +const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { - getModuleResult: GetModuleResult; - saveModuleResult: SaveModuleResult; pathToJournal: string | undefined; txPollingInterval: number; } +type ModulesOutputs = Record; + export class Ignition { - constructor(private _providers: Providers) {} + constructor( + private _providers: Providers, + private _modulesResults: IgnitionModulesResults + ) {} public async deploy( userModules: Array>, - { - getModuleResult, - saveModuleResult, - pathToJournal, - txPollingInterval, - }: IgnitionDeployOptions - ) { + { pathToJournal, txPollingInterval }: IgnitionDeployOptions + ): Promise<[DeploymentResult, ModulesOutputs]> { log(`Start deploy, '${userModules.length}' modules`); const m = new ModuleBuilderImpl(); - const moduleOutputs: Record = {}; + const modulesOutputs: ModulesOutputs = {}; for (const userModule of userModules) { log("Load module '%s'", userModule.id); const moduleOutput = m.useModule(userModule) ?? {}; - moduleOutputs[userModule.id] = moduleOutput; + modulesOutputs[userModule.id] = moduleOutput; } log("Build execution graph"); @@ -92,13 +86,16 @@ export class Ignition { ? new FileJournal(pathToJournal) : new InMemoryJournal(); - const engine = new ExecutionEngine(this._providers, journal, { - parallelizationLevel: 2, - loggingEnabled: pathToJournal !== undefined, - txPollingInterval, - getModuleResult, - saveModuleResult, - }); + const engine = new ExecutionEngine( + this._providers, + journal, + this._modulesResults, + { + parallelizationLevel: 2, + loggingEnabled: pathToJournal !== undefined, + txPollingInterval, + } + ); const executionManager = new ExecutionManager( engine, @@ -108,28 +105,24 @@ export class Ignition { log("Execute deployment"); const deploymentResult = await executionManager.execute(executionGraph); - return [deploymentResult, moduleOutputs] as const; + return [deploymentResult, modulesOutputs]; } public async buildPlan( - userModules: Array>, - { getModuleResult }: { getModuleResult: GetModuleResult } + userModules: Array> ): Promise { log(`Start building plan, '${userModules.length}' modules`); const m = new ModuleBuilderImpl(); - const moduleOutputs: any[] = []; - for (const userModule of userModules) { log("Load module '%s'", userModule.id); - const moduleOutput = m.useModule(userModule); - moduleOutputs.push(moduleOutput); + m.useModule(userModule); } log("Build ExecutionGraph"); const executionGraph = m.buildExecutionGraph(); - return ExecutionEngine.buildPlan(executionGraph, { getModuleResult }); + return ExecutionEngine.buildPlan(executionGraph, this._modulesResults); } } diff --git a/packages/core/src/journal.ts b/packages/core/src/journal.ts index 01fbcec8f3..eafcd3c416 100644 --- a/packages/core/src/journal.ts +++ b/packages/core/src/journal.ts @@ -1,4 +1,4 @@ -import debug from "debug"; +import setupDebug, { IDebugger } from "debug"; import fsExtra from "fs-extra"; export interface JournalEntry { @@ -32,7 +32,7 @@ export interface Journal { } export class FileJournal implements Journal { - private _log: debug.IDebugger = debug("ignition:journal:file-journal"); + private _log: IDebugger = setupDebug("ignition:journal:file-journal"); constructor(private _path: string) {} @@ -123,7 +123,9 @@ export class FileJournal implements Journal { } export class InMemoryJournal implements Journal { - private _log: debug.IDebugger = debug("ignition:journal:in-memory-journal"); + private _log: debug.IDebugger = setupDebug( + "ignition:journal:in-memory-journal" + ); private _journal: Map> = new Map(); public async addEntry( diff --git a/packages/core/src/services.ts b/packages/core/src/services.ts index 9a2f73b186..3d9ded1a39 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services.ts @@ -1,4 +1,4 @@ -import debug from "debug"; +import setupDebug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; import { IgnitionSigner, Providers } from "./providers"; @@ -15,7 +15,7 @@ interface TransactionOptions { } export class ContractsService { - private _debug = debug("ignition:services:contracts-service"); + private _debug = setupDebug("ignition:services:contracts-service"); private _ethersProvider: ethers.providers.Web3Provider; constructor( diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 0a7b4dcd61..05e5230079 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -1,4 +1,4 @@ -import debug, { IDebugger } from "debug"; +import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; import { Journal } from "./journal"; @@ -22,7 +22,7 @@ export class TxSender { private _gasProvider: GasProvider, private _journal: Journal ) { - this._debug = debug(`ignition:tx-sender:${_moduleId}:${_executorId}`); + this._debug = setupDebug(`ignition:tx-sender:${_moduleId}:${_executorId}`); } /** diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 27ffdbb50d..83b786963f 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -4,20 +4,24 @@ import { DeploymentState } from "../src/deployment-state"; import { ExecutionEngine, ExecutionEngineOptions, + IgnitionModulesResults, } from "../src/execution-engine"; import { InMemoryJournal } from "../src/journal"; import { ExecutionGraph } from "../src/modules"; import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; +const mockModulesResults: IgnitionModulesResults = { + load: async () => { + return undefined; + }, + save: async () => {}, +}; + const executionEngineOptions: ExecutionEngineOptions = { parallelizationLevel: 1, loggingEnabled: false, txPollingInterval: 100, - getModuleResult: async () => { - return undefined; - }, - saveModuleResult: async () => {}, }; describe("ExecutionEngine", function () { @@ -26,6 +30,7 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), + mockModulesResults, executionEngineOptions ); @@ -58,6 +63,7 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), + mockModulesResults, executionEngineOptions ); @@ -111,6 +117,7 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), + mockModulesResults, executionEngineOptions ); @@ -141,6 +148,7 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), + mockModulesResults, executionEngineOptions ); diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index 5bdda479ca..18a99e8c67 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -68,7 +68,6 @@ function getExamples(): Example[] { }); examples.push({ - only: true, description: "Two parallel deploys followed by two parallel calls", initialData: { MyModule: ["Foo", "Bar", "Foo.f", "Bar.b"], diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json index 5ec3aeaca2..5a0ec255ae 100644 --- a/packages/hardhat-plugin/.mocharc.json +++ b/packages/hardhat-plugin/.mocharc.json @@ -1,3 +1,4 @@ { - "require": "ts-node/register/transpile-only" + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts" } diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index d33ba36dbb..cc351c036f 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", @@ -22,6 +23,7 @@ "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", + "chai-as-promised": "^7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 9a5454b0f7..5bddd75970 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -8,27 +8,31 @@ import { UserModule, IgnitionDeployOptions, SerializedModuleResult, + Providers, } from "ignition"; import path from "path"; +import { getAllUserModules } from "./user-modules"; + type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; export class IgnitionWrapper { private _ignition: Ignition; - private _chainId: number | undefined; + private _cachedChainId: number | undefined; constructor( - services: any, + providers: Providers, private _ethers: HardhatEthers, private _isHardhatNetwork: boolean, private _paths: HardhatPaths, - private _deployOptions: { - pathToJournal: string | undefined; - txPollingInterval: number; - } + private _deployOptions: IgnitionDeployOptions ) { - this._ignition = new Ignition(services); + this._ignition = new Ignition(providers, { + load: (moduleId) => this._getModuleResult(moduleId), + save: (moduleId, moduleResult) => + this._saveModuleResult(moduleId, moduleResult), + }); } public async deploy( @@ -38,9 +42,12 @@ export class IgnitionWrapper { return resolvedOutputs[0]; } - public async deployMany( - userModulesOrNames: Array | string> - ): Promise>> { + /** + * Deploys all the given modules. Returns the deployment result, and an + * array with the resolved outputs that corresponds to each module in + * the input. + */ + public async deployMany(userModulesOrNames: Array | string>) { const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { const userModule: UserModule = @@ -51,16 +58,9 @@ export class IgnitionWrapper { userModules.push(userModule); } - const deployOptions: IgnitionDeployOptions = { - ...this._deployOptions, - getModuleResult: (moduleId) => this._getModuleResult(moduleId), - saveModuleResult: (moduleId, moduleResult) => - this._saveModuleResult(moduleId, moduleResult), - }; - const [deploymentResult, moduleOutputs] = await this._ignition.deploy( userModules, - deployOptions + this._deployOptions ); if (deploymentResult._kind === "hold") { @@ -81,10 +81,10 @@ export class IgnitionWrapper { ); } - const resolvedOutputs: any = []; - for (const moduleOutput of Object.values(moduleOutputs)) { + const resolvedOutputPerModule: Record = {}; + for (const [moduleId, moduleOutput] of Object.entries(moduleOutputs)) { const resolvedOutput: any = {}; - for (const [key, value] of Object.entries(moduleOutput as any)) { + for (const [key, value] of Object.entries(moduleOutput)) { const serializedBindingResult = deploymentResult.result[value.moduleId][value.id]; @@ -100,10 +100,14 @@ export class IgnitionWrapper { resolvedOutput[key] = await this._ethers.getContractAt(abi, address); } } - resolvedOutputs.push(resolvedOutput); + resolvedOutputPerModule[moduleId] = resolvedOutput; } - return [deploymentResult, resolvedOutputs]; + const resolvedOutputs = userModules.map( + (x) => resolvedOutputPerModule[x.id] + ); + + return [deploymentResult, resolvedOutputs] as const; } public async buildPlan( @@ -119,27 +123,26 @@ export class IgnitionWrapper { userModules.push(userModule); } - const plan = await this._ignition.buildPlan(userModules, { - getModuleResult: (moduleId) => this._getModuleResult(moduleId), - }); + const plan = await this._ignition.buildPlan(userModules); return plan; } private async _getModule(moduleId: string): Promise> { - const ignitionFiles = fsExtra - .readdirSync(this._paths.ignition) - .filter((x) => !x.startsWith(".")); + const userModulesPaths = getAllUserModules(this._paths.ignition); - for (const ignitionFile of ignitionFiles) { - const pathToFile = path.resolve(this._paths.ignition, ignitionFile); + for (const userModulePath of userModulesPaths) { + const resolveUserModulePath = path.resolve( + this._paths.ignition, + userModulePath + ); - const fileExists = await fsExtra.pathExists(pathToFile); + const fileExists = await fsExtra.pathExists(resolveUserModulePath); if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); + throw new Error(`Module ${resolveUserModulePath} doesn't exist`); } - const userModule = require(pathToFile); + const userModule = require(resolveUserModulePath); const userModuleContent = userModule.default ?? userModule; if (userModuleContent.id === moduleId) { @@ -147,7 +150,7 @@ export class IgnitionWrapper { } } - throw new Error(`No module with id ${moduleId}`); + throw new Error(`No module found with id ${moduleId}`); } private async _getModuleResult( @@ -157,14 +160,11 @@ export class IgnitionWrapper { return; } - if (this._chainId === undefined) { - const { chainId } = await this._ethers.provider.getNetwork(); - this._chainId = chainId; - } + const chainId = await this._getChainId(); const moduleResultPath = path.join( this._paths.deployments, - String(this._chainId), + String(chainId), `${moduleId}.json` ); @@ -185,14 +185,11 @@ export class IgnitionWrapper { return; } - if (this._chainId === undefined) { - const { chainId } = await this._ethers.provider.getNetwork(); - this._chainId = chainId; - } + const chainId = await this._getChainId(); const deploymentsDirectory = path.join( this._paths.deployments, - String(this._chainId) + String(chainId) ); fsExtra.ensureDirSync(deploymentsDirectory); @@ -205,6 +202,15 @@ export class IgnitionWrapper { spaces: 2, }); } + + private async _getChainId(): Promise { + if (this._cachedChainId === undefined) { + const { chainId } = await this._ethers.provider.getNetwork(); + this._cachedChainId = chainId; + } + + return this._cachedChainId; + } } type Resolved = T extends string diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index be569857a8..027a2daa53 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -7,52 +7,40 @@ import { types, } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; -import { HardhatConfig, HardhatUserConfig } from "hardhat/types"; import { Providers, UserModule } from "ignition"; import path from "path"; import { IgnitionWrapper } from "./ignition-wrapper"; -import { loadUserModules } from "./modules"; +import { loadUserModules } from "./user-modules"; import "./type-extensions"; -extendConfig( - (config: HardhatConfig, userConfig: Readonly) => { - const userIgnitionPath = userConfig.paths?.ignition; - const userDeploymentsPath = userConfig.paths?.deployments; - - let ignitionPath: string; - if (userIgnitionPath === undefined) { - ignitionPath = path.join(config.paths.root, "ignition"); - } else { - if (path.isAbsolute(userIgnitionPath)) { - ignitionPath = userIgnitionPath; - } else { - ignitionPath = path.normalize( - path.join(config.paths.root, userIgnitionPath) - ); - } - } +extendConfig((config, userConfig) => { + const userIgnitionPath = userConfig.paths?.ignition; + const userDeploymentsPath = userConfig.paths?.deployments; - let deploymentsPath: string; - if (userDeploymentsPath === undefined) { - deploymentsPath = path.join(config.paths.root, "deployments"); - } else { - if (path.isAbsolute(userDeploymentsPath)) { - deploymentsPath = userDeploymentsPath; - } else { - deploymentsPath = path.normalize( - path.join(config.paths.root, userDeploymentsPath) - ); - } - } + let ignitionPath: string; + if (userIgnitionPath === undefined) { + ignitionPath = path.join(config.paths.root, "ignition"); + } else { + ignitionPath = path.resolve(config.paths.root, userIgnitionPath); + } - config.paths.ignition = ignitionPath; - config.paths.deployments = deploymentsPath; + let deploymentsPath: string; + if (userDeploymentsPath === undefined) { + deploymentsPath = path.join(config.paths.root, "deployments"); + } else { + deploymentsPath = path.resolve(config.paths.root, userDeploymentsPath); } -); + config.paths.ignition = ignitionPath; + config.paths.deployments = deploymentsPath; +}); + +/** + * Add an `ignition` object to the HRE. + */ extendEnvironment((hre) => { - const services: Providers = { + const providers: Providers = { artifacts: { getArtifact: (name: string) => hre.artifacts.readArtifact(name), hasArtifact: (name: string) => hre.artifacts.artifactExists(name), @@ -93,36 +81,48 @@ extendEnvironment((hre) => { }; hre.ignition = lazyObject(() => { - const pathToJournal = - hre.network.name !== "hardhat" - ? path.resolve(hre.config.paths.root, "ignition-journal.json") - : undefined; - const txPollingInterval = hre.network.name !== "hardhat" ? 5000 : 100; + const isHardhatNetwork = hre.network.name === "hardhat"; + + const pathToJournal = isHardhatNetwork + ? undefined + : path.resolve(hre.config.paths.root, "ignition-journal.json"); + const txPollingInterval = isHardhatNetwork ? 100 : 5000; return new IgnitionWrapper( - services, + providers, hre.ethers, - hre.network.name === "hardhat", + isHardhatNetwork, hre.config.paths, { pathToJournal, txPollingInterval } ); }); }); +/** + * Deploy the given user modules. If none is passed, all modules under + * the `paths.ignition` directory are deployed. + */ task("deploy") - .addOptionalVariadicPositionalParam("modulesFiles") - .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { - await hre.run("compile", { quiet: true }); + .addOptionalVariadicPositionalParam("userModulesPaths") + .setAction( + async ({ userModulesPaths }: { userModulesPaths: string[] }, hre) => { + await hre.run("compile", { quiet: true }); - const userModules = await loadUserModules( - hre.config.paths.ignition, - modulesFiles ?? [] - ); + const userModules = await loadUserModules( + hre.config.paths.ignition, + userModulesPaths + ); - await hre.run("deploy:deploy-modules", { - userModules, - }); - }); + if (userModules.length === 0) { + console.warn("No Ignition modules found"); + process.exit(0); + } + + await hre.run("deploy:deploy-modules", { + userModules, + }); + } + ); subtask("deploy:deploy-modules") .addParam("userModules", undefined, undefined, types.any) @@ -133,11 +133,9 @@ subtask("deploy:deploy-modules") }: { userModules: Array>; pathToJournal?: string }, hre ) => { - if (userModules.length === 0) { - console.warn("No Ignition modules found"); - process.exit(0); - } - + // we ignore the module outputs because they are not relevant when + // the deployment is done via a task (as opposed to a deployment + // done with `hre.ignition.deploy`) const [serializedDeploymentResult] = await hre.ignition.deployMany( userModules ); @@ -146,37 +144,42 @@ subtask("deploy:deploy-modules") } ); +/** + * Build and show the deployment plan for the given user modules. + */ task("plan") - .addOptionalVariadicPositionalParam("modulesFiles") - .setAction(async ({ modulesFiles }: { modulesFiles?: string[] }, hre) => { - await hre.run("compile", { quiet: true }); + .addOptionalVariadicPositionalParam("userModulesPaths") + .setAction( + async ({ userModulesPaths }: { userModulesPaths: string[] }, hre) => { + await hre.run("compile", { quiet: true }); - const userModules = await loadUserModules( - hre.config.paths.ignition, - modulesFiles ?? [] - ); + const userModules = await loadUserModules( + hre.config.paths.ignition, + userModulesPaths + ); - if (userModules.length === 0) { - console.warn("No Ignition modules found"); - process.exit(0); - } + if (userModules.length === 0) { + console.warn("No Ignition modules found"); + process.exit(0); + } - const plan = await hre.ignition.buildPlan(userModules); + const plan = await hre.ignition.buildPlan(userModules); - let first = true; - for (const [moduleId, modulePlan] of Object.entries(plan)) { - if (first) { - first = false; - } else { - console.log(); - } - console.log(`- Module ${moduleId}`); - if (modulePlan === "already-deployed") { - console.log(" Already deployed"); - } else { - for (const step of modulePlan) { - console.log(` ${step.id}: ${step.description}`); + let first = true; + for (const [moduleId, modulePlan] of Object.entries(plan)) { + if (first) { + first = false; + } else { + console.log(); + } + console.log(`- Module ${moduleId}`); + if (modulePlan === "already-deployed") { + console.log(" Already deployed"); + } else { + for (const step of modulePlan) { + console.log(` ${step.id}: ${step.description}`); + } } } } - }); + ); diff --git a/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-plugin/src/modules.ts deleted file mode 100644 index 6fb63a8cad..0000000000 --- a/packages/hardhat-plugin/src/modules.ts +++ /dev/null @@ -1,43 +0,0 @@ -import debug from "debug"; -import fsExtra from "fs-extra"; -import { UserModule } from "ignition"; -import path from "path"; - -const log = debug("hardhat-ignition:modules"); - -export async function loadUserModules( - ignitionDirectory: string, - modulesFiles: string[] -): Promise>> { - log(`Loading user modules from '${ignitionDirectory}'`); - - let ignitionFiles: string[]; - if (modulesFiles.length === 0) { - log("No files passed, reading all module files"); - - // load all modules in ignition's directory - ignitionFiles = fsExtra - .readdirSync(ignitionDirectory) - .filter((x) => !x.startsWith(".")); - } else { - log(`Reading '${modulesFiles.length}' selected module files`); - ignitionFiles = modulesFiles.map((x) => path.resolve(process.cwd(), x)); - } - - log(`Loading '${ignitionFiles.length}' module files`); - const userModules: any[] = []; - for (const ignitionFile of ignitionFiles) { - const pathToFile = path.resolve(ignitionDirectory, ignitionFile); - - const fileExists = await fsExtra.pathExists(pathToFile); - if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); - } - - log(`Loading module file '${pathToFile}'`); - const userModule = require(pathToFile); - userModules.push(userModule.default ?? userModule); - } - - return userModules; -} diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts new file mode 100644 index 0000000000..4e39b471ef --- /dev/null +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -0,0 +1,49 @@ +import setupDebug from "debug"; +import fsExtra from "fs-extra"; +import { UserModule } from "ignition"; +import path from "path"; + +const debug = setupDebug("hardhat-ignition:modules"); + +export async function loadUserModules( + userModulesDirectory: string, + userModulesFiles: string[] +): Promise>> { + debug(`Loading user modules from '${userModulesDirectory}'`); + + let resolvedUserModulesPaths: string[]; + if (userModulesFiles.length === 0) { + debug("No files passed, reading all module files"); + + resolvedUserModulesPaths = getAllUserModules(userModulesDirectory); + } else { + debug(`Reading '${userModulesFiles.length}' selected module files`); + resolvedUserModulesPaths = userModulesFiles.map((x) => + path.resolve(process.cwd(), x) + ); + } + + debug(`Loading '${resolvedUserModulesPaths.length}' module files`); + const userModules: any[] = []; + for (const ignitionFile of resolvedUserModulesPaths) { + const pathToFile = path.resolve(userModulesDirectory, ignitionFile); + + const fileExists = await fsExtra.pathExists(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + debug(`Loading module file '${pathToFile}'`); + + const userModule = require(pathToFile); + userModules.push(userModule.default ?? userModule); + } + + return userModules; +} + +export function getAllUserModules(userModulesDirectory: string) { + return fsExtra + .readdirSync(userModulesDirectory) + .filter((x) => !x.startsWith(".")); +} diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index e2aaa9f345..8c118bbf84 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,43 +1,11 @@ import { assert } from "chai"; import { UserModule, + SerializedBindingResult, SerializedDeploymentResult, DeploymentResult, } from "ignition"; -/** - * Wait until there are at least `expectedCount` transactions in the mempool - */ -export async function waitForPendingTxs( - hre: any, - expectedCount: number, - finished: Promise -) { - let stopWaiting = false; - finished.finally(() => { - stopWaiting = true; - }); - - while (true) { - if (stopWaiting) { - return; - } - const pendingBlock = await hre.network.provider.send( - "eth_getBlockByNumber", - ["pending", false] - ); - - if (pendingBlock.transactions.length >= expectedCount) { - return; - } - - await sleep(100); - } -} - -const sleep = (timeout: number) => - new Promise((res) => setTimeout(res, timeout)); - export const resultAssertions = { contract: (predicate?: ContractResultPredicate): ExpectedBindingResult => { return { @@ -64,6 +32,14 @@ type ExpectedBindingResult = type ExpectedModuleResult = Record; type ExpectedDeploymentState = Record; +/** + * Check that the given deployment result matches some conditions. + * + * `expectedResult` is an object with expected modules results, which have + * expected bindings results. These bindings results assert that that the + * result of each binding is of the correct type, and it can also run + * some custom predicate logic on the result to further verify it. + */ export async function assertDeploymentState( hre: any, result: SerializedDeploymentResult, @@ -72,35 +48,30 @@ export async function assertDeploymentState( const modulesResults = Object.entries(result); const expectedModules = Object.entries(expectedResult); - assert.equal(modulesResults.length, expectedModules.length); + assert.equal( + modulesResults.length, + expectedModules.length, + "Expected result and actual result have a different number of modules" + ); for (const [moduleId, moduleResult] of modulesResults) { const expectedModule = expectedResult[moduleId]; - assert.isDefined(expectedModule); + assert.isDefined( + expectedModule, + `Module ${moduleId} is not part of the expected result` + ); assert.equal( Object.entries(moduleResult).length, Object.entries(expectedModule).length ); - for (const [bindingId, expectedBindingResult] of Object.entries( - expectedModule - )) { - const bindingResult = moduleResult[bindingId]; + for (const [bindingId, bindingResult] of Object.entries(moduleResult)) { + const expectedBindingResult = expectedModule[bindingId]; if (expectedBindingResult.kind === "contract") { - if (bindingResult._kind !== "contract") { - assert.fail( - `Expected binding result to be a contract, but got ${bindingResult._kind}` - ); - } - await assertHasCode(hre, bindingResult.value.address); - - const contract = await hre.ethers.getContractAt( - bindingResult.value.abi, - bindingResult.value.address - ); + const contract = await assertContract(hre, bindingResult); await expectedBindingResult.predicate(contract); } else if (expectedBindingResult.kind === "transaction") { @@ -130,6 +101,12 @@ async function assertTxMined(hre: any, hash: string) { assert.isNotNull(receipt); } +/** + * Deploy all the modules in `userModules`. + * + * Assert that `expectedBlocks.length` blocks are mined, and that + * each mined block has `expectedBlocks[i]` transactions. + */ export async function deployModules( hre: any, userModules: Array>, @@ -167,14 +144,55 @@ async function mineBlocks( } } -export async function assertRejects(fn: () => Promise) { - let rejected: boolean; - try { - await fn(); - rejected = false; - } catch (e) { - rejected = true; +const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); + +/** + * Wait until there are at least `expectedCount` transactions in the mempool + */ +async function waitForPendingTxs( + hre: any, + expectedCount: number, + finished: Promise +) { + let stopWaiting = false; + finished.finally(() => { + stopWaiting = true; + }); + + while (true) { + if (stopWaiting) { + return; + } + const pendingBlock = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + if (pendingBlock.transactions.length >= expectedCount) { + return; + } + + await sleep(50); } +} + +async function assertContract( + hre: any, + bindingResult: SerializedBindingResult +) { + if (bindingResult._kind !== "contract") { + assert.fail( + `Expected binding result to be a contract, but got ${bindingResult._kind}` + ); + } + + await assertHasCode(hre, bindingResult.value.address); + + const contract = await hre.ethers.getContractAt( + bindingResult.value.abi, + bindingResult.value.address + ); - assert.isTrue(rejected, "Expected function to reject"); + return contract; } diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index c3d79c41ad..cb6cfc9eb2 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -3,14 +3,12 @@ import { buildModule } from "ignition"; import { assertDeploymentState, - assertRejects, deployModules, resultAssertions, } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("integration tests", function () { - this.timeout(20000); useEnvironment("minimal"); it("should deploy a contract", async function () { @@ -193,6 +191,6 @@ describe("integration tests", function () { }); // then - await assertRejects(() => deployModules(this.hre, [userModule], [1, 1])); + await assert.isRejected(deployModules(this.hre, [userModule], [1, 1])); }); }); diff --git a/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-plugin/test/setup.ts new file mode 100644 index 0000000000..c0c8e71856 --- /dev/null +++ b/packages/hardhat-plugin/test/setup.ts @@ -0,0 +1,4 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +chai.use(chaiAsPromised); diff --git a/yarn.lock b/yarn.lock index 2a83d5919f..fd18c8a1b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -661,6 +661,18 @@ dependencies: "@types/node" "*" +"@types/chai-as-promised@^7.1.4": + version "7.1.4" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" + integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== + dependencies: + "@types/chai" "*" + +"@types/chai@*": + version "4.3.0" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" + integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== + "@types/chai@^4.2.22": version "4.2.22" resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" @@ -1249,6 +1261,13 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== +chai-as-promised@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== + dependencies: + check-error "^1.0.2" + chai@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" From 091ce9dce90c0c1d413c322d3951e9a621bd1589 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Mon, 17 Jan 2022 17:45:59 +0100 Subject: [PATCH 0019/1302] Add default value for `userModulesPaths` --- packages/hardhat-plugin/src/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 027a2daa53..2936da2680 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -105,7 +105,7 @@ extendEnvironment((hre) => { task("deploy") .addOptionalVariadicPositionalParam("userModulesPaths") .setAction( - async ({ userModulesPaths }: { userModulesPaths: string[] }, hre) => { + async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { await hre.run("compile", { quiet: true }); const userModules = await loadUserModules( @@ -150,7 +150,7 @@ subtask("deploy:deploy-modules") task("plan") .addOptionalVariadicPositionalParam("userModulesPaths") .setAction( - async ({ userModulesPaths }: { userModulesPaths: string[] }, hre) => { + async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { await hre.run("compile", { quiet: true }); const userModules = await loadUserModules( From 6b6c263526896c66526b00394dc857620b3c4f41 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 16 Jun 2022 15:44:27 +0100 Subject: [PATCH 0020/1302] docs: add basic readme Adds a placeholder `README.md` at project root and in each of the packages. A `CONTRIBUTING.md` doc has been added as well detailing the basic development setup. There is a first pass at a `getting-started` guide, more to begin defining the requirements rather than useful documentation. --- .gitignore | 130 ++++++++++++++++++++ CONTRIBUTING.md | 56 +++++++++ README.md | 29 +++++ docs/getting-started-guide.md | 66 ++++++++++ packages/core/README.md | 3 + packages/hardhat-plugin/README.md | 33 +++++ packages/hardhat-plugin/test/integration.ts | 1 + 7 files changed, 318 insertions(+) create mode 100644 CONTRIBUTING.md create mode 100644 README.md create mode 100644 docs/getting-started-guide.md create mode 100644 packages/core/README.md create mode 100644 packages/hardhat-plugin/README.md diff --git a/.gitignore b/.gitignore index c2658d7d1b..7354122b1a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,131 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..4e6cf8b158 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,56 @@ +# How to contribute to Ignition + +This document contains some tips on how to collaborate in this project. + +## Filing an issue + +If you find a bug or want to propose a new feature, please open an issue. Pull requests are welcome, but we recommend you discuss it in an issue first, especially for big changes. This will increase the odds that we can accept your PR. + +## Project Structure + +This repository is a monorepo handled with `Yarn` workspaces. + +There are two packages: + +* [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments +* [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library + +## Setup + +Ignition is a `typescript` project managed by `yarn`. + +The install the dependencies, run `yarn` in the project root: + +```shell +yarn +``` + +## Building + +The packages are written in `typescript` and so require a build step, to build: + +```shell +yarn build +``` + +The **Hardhat** plugin depends on **core**, while developing you may want to run a continuous build with `watch`: + +```shell +yarn watch +``` + +## Testing + +The test suite is written in `mocha`, to run: + +```shell +yarn test +``` + +## Linting + +Formatting is enforced with `prettier` and code rules with `eslint`, to run both: + +```shell +yarn lint +``` diff --git a/README.md b/README.md new file mode 100644 index 0000000000..3a683c37da --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Ignition + +Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay up to date on new releases, plugins and tutorials. + +## Installation + +```shell +npm install @nomiclabs/hardhat-ignition +``` + +## Documentation + +See our [Getting started guide](./docs/getting-started-guide.md) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](./CONTRIBUTING.md) to learn about how to set up Ignition's development environment. + +## Feedback, help and news + +[Hardhat Support Discord server](https://hardhat.org/discord): for questions and feedback. + +[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md new file mode 100644 index 0000000000..440d84290f --- /dev/null +++ b/docs/getting-started-guide.md @@ -0,0 +1,66 @@ +# Getting Started + +## Setup + +Add **Ignition** to your **Hardhat** project by installing the plugin: + +```shell +npm install @nomiclabs/hardhat-ignition +``` + +Modify your `Hardhat.config.{ts,js}` file, to include **Ignition**: + +```javascript +import { HardhatUserConfig, task } from "hardhat/config"; +// ... +import "@nomiclabs/hardhat-ignition"; +``` + +Create an `./ignition` folder in your project root to contain your deployment modules. + +```shell +mkdir ./ignition +``` + +## Write a deployment Module + +Add a deployment module under the `./ignition` folder: + +```typescript +// ./ignition/mymodule.ts + +import { buildModule, ModuleBuilder } from "ignition" + +export default buildModule("MyModule", (m: ModuleBuilder) => { + const token = m.contract("Token") + + return { token } +}) +``` + +Use the deployment module from a **Hardhat** script: + +```typescript +// ./scripts/deploy.ts +import hre from "hardhat"; +import TokenModule from "../ignition/mymodule"; + +async function main() { + const { token } = await (hre as any).ignition.deploy(TokenModule); + + console.log("Token contract address", token.address); +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); +``` + +Run the deployment script to test against a local ephemeral **Hardhat** node: + +```shell +npx hardhat run ./scripts/deploy.ts +# No need to generate any newer typings. +# Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 +``` diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 0000000000..513c7d8b69 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,3 @@ +# Ignition-core + +The core logic of **Ignition** including the execution engine and user facing api. diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md new file mode 100644 index 0000000000..fcc47d50f6 --- /dev/null +++ b/packages/hardhat-plugin/README.md @@ -0,0 +1,33 @@ +# hardhat-ignition + +Hardhat plugin for orchestrating deployments. + +## What + +This plugin brings **Ignition** to your **Hardhat** project, allowing you to orchestrate complex deployments to **mainnet**, to a local **Hardhat node** or within tests. + +## Installation + +```bash +npm install --save-dev @nomiclabs/hardhat-ignition +``` + +And add the following statement to your `hardhat.config.js`: + +```js +require("@nomiclabs/hardhat-ignition"); +``` + +Or, if you are using TypeScript, add this to your `hardhat.config.ts`: + +```js +import "@nomiclabs/hardhat-ignition"; +``` + +## Tasks + +This plugin provides the `deploy` task. + +## Usage + +Please see the [getting started guide](../../docs/getting-started-guide.md) diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index cb6cfc9eb2..93d6caa798 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -9,6 +9,7 @@ import { import { useEnvironment } from "./useEnvironment"; describe("integration tests", function () { + this.timeout(5000); useEnvironment("minimal"); it("should deploy a contract", async function () { From 341285c664f8701d7d38cd9638bd3a31a784300e Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 21 Jun 2022 12:24:20 +0100 Subject: [PATCH 0021/1302] chore: add coverage reports Add a `test:coverage` npm script to the root and each package that runs mocha using istanbul to generate coverage reports. --- examples/simple-ts/package.json | 2 +- package.json | 9 +- packages/core/.nycrc | 19 + packages/core/.prettierignore | 2 + packages/core/package.json | 9 +- packages/hardhat-plugin/.nycrc | 19 + packages/hardhat-plugin/.prettierignore | 2 + packages/hardhat-plugin/package.json | 8 +- yarn.lock | 3013 +++++++++++++---------- 9 files changed, 1807 insertions(+), 1276 deletions(-) create mode 100644 packages/core/.nycrc create mode 100644 packages/hardhat-plugin/.nycrc diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json index 91d926be47..edebb2893c 100644 --- a/examples/simple-ts/package.json +++ b/examples/simple-ts/package.json @@ -14,7 +14,7 @@ "hardhat": "^2.6.4", "ignition": "^0.0.2", "ts-node": "^10.3.0", - "typescript": "^4.4.4" + "typescript": "^4.7.4" }, "devDependencies": { "ts-node": "^10.3.0" diff --git a/package.json b/package.json index 9461b6d8a1..378b06bd32 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,17 @@ "author": "Nomic Labs LLC", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, - "workspaces": ["packages/*", "examples/*"], + "workspaces": [ + "packages/*", + "examples/*" + ], "scripts": { "build": "wsrun --exclude-missing --serial build", "lint": "wsrun --exclude-missing --serial lint", "test": "wsrun --exclude-missing --serial test", - "watch": "tsc --build --watch packages/core packages/hardhat-plugin" + "test:coverage": "wsrun --exclude-missing --serial test:coverage", + "watch": "tsc --build --watch packages/core packages/hardhat-plugin", + "fullcheck": "yarn build && yarn lint && yarn test:coverage" }, "devDependencies": { "wsrun": "^5.2.4" diff --git a/packages/core/.nycrc b/packages/core/.nycrc new file mode 100644 index 0000000000..d815dfe758 --- /dev/null +++ b/packages/core/.nycrc @@ -0,0 +1,19 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": true, + "statements": 45, + "branches": 30, + "functions": 50, + "lines": 45, + "all": true, + "include": [ + "src/**/*.ts" + ], + "reporter": [ + "html", + "lcov", + "text", + "text-summary" + ], + "report-dir": "coverage" +} diff --git a/packages/core/.prettierignore b/packages/core/.prettierignore index 8225baa4a7..2f72331452 100644 --- a/packages/core/.prettierignore +++ b/packages/core/.prettierignore @@ -1,2 +1,4 @@ /node_modules /dist +/coverage +/.nyc_output diff --git a/packages/core/package.json b/packages/core/package.json index 2451b8b409..cba8915ec0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -11,9 +11,11 @@ "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' yarn test", - "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx" + "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", + "test:coverage": "nyc mocha \"test/**/*.ts\"" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", "@types/chai": "^4.2.22", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", @@ -31,11 +33,12 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "mocha": "^9.1.3", + "nyc": "15.1.0", "prettier": "2.4.1", "sinon": "^12.0.1", "tmp": "^0.2.1", - "ts-node": "^10.4.0", - "typescript": "^4.4.3" + "ts-node": "10.8.1", + "typescript": "^4.7.4" }, "dependencies": { "debug": "^4.3.2", diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-plugin/.nycrc new file mode 100644 index 0000000000..7dd48f559f --- /dev/null +++ b/packages/hardhat-plugin/.nycrc @@ -0,0 +1,19 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": true, + "statements": 50, + "branches": 30, + "functions": 60, + "lines": 50, + "all": true, + "include": [ + "src/**/*.ts" + ], + "reporter": [ + "html", + "lcov", + "text", + "text-summary" + ], + "report-dir": "coverage" +} diff --git a/packages/hardhat-plugin/.prettierignore b/packages/hardhat-plugin/.prettierignore index 74183e372f..329c3be7f8 100644 --- a/packages/hardhat-plugin/.prettierignore +++ b/packages/hardhat-plugin/.prettierignore @@ -2,3 +2,5 @@ /dist /test/fixture-projects/*/artifacts /test/fixture-projects/*/cache +/coverage +/.nyc_output diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index cc351c036f..f49f9beee7 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -10,9 +10,11 @@ "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test" + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test", + "test:coverage": "nyc mocha \"test/**/*.ts\"" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", @@ -32,8 +34,10 @@ "hardhat": "^2.0.0", "ignition": "^0.0.2", "mocha": "^9.1.1", + "nyc": "15.1.0", "prettier": "2.4.1", - "typescript": "^4.4.3" + "ts-node": "10.8.1", + "typescript": "^4.7.4" }, "peerDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", diff --git a/yarn.lock b/yarn.lock index fd18c8a1b7..a4f535efd5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,14 @@ # yarn lockfile v1 +"@ampproject/remapping@^2.1.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" + integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== + dependencies: + "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/trace-mapping" "^0.3.9" + "@babel/code-frame@7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" @@ -9,31 +17,185 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/helper-validator-identifier@^7.14.5": - version "7.15.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" - integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== +"@babel/code-frame@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" + integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== + dependencies: + "@babel/highlight" "^7.16.7" + +"@babel/compat-data@^7.17.10": + version "7.18.5" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" + integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== + +"@babel/core@^7.7.5": + version "7.18.5" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" + integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-compilation-targets" "^7.18.2" + "@babel/helper-module-transforms" "^7.18.0" + "@babel/helpers" "^7.18.2" + "@babel/parser" "^7.18.5" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.5" + "@babel/types" "^7.18.4" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + +"@babel/generator@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" + integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== + dependencies: + "@babel/types" "^7.18.2" + "@jridgewell/gen-mapping" "^0.3.0" + jsesc "^2.5.1" -"@babel/highlight@^7.10.4": - version "7.14.5" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== +"@babel/helper-compilation-targets@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" + integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== dependencies: - "@babel/helper-validator-identifier" "^7.14.5" + "@babel/compat-data" "^7.17.10" + "@babel/helper-validator-option" "^7.16.7" + browserslist "^4.20.2" + semver "^6.3.0" + +"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" + integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== + +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + +"@babel/helper-hoist-variables@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" + integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-imports@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" + integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-module-transforms@^7.18.0": + version "7.18.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" + integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== + dependencies: + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-module-imports" "^7.16.7" + "@babel/helper-simple-access" "^7.17.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/helper-validator-identifier" "^7.16.7" + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.0" + "@babel/types" "^7.18.0" + +"@babel/helper-simple-access@^7.17.7": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" + integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== + dependencies: + "@babel/types" "^7.18.2" + +"@babel/helper-split-export-declaration@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" + integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== + dependencies: + "@babel/types" "^7.16.7" + +"@babel/helper-validator-identifier@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" + integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== + +"@babel/helper-validator-option@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" + integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== + +"@babel/helpers@^7.18.2": + version "7.18.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" + integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/traverse" "^7.18.2" + "@babel/types" "^7.18.2" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": + version "7.17.12" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" + integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" chalk "^2.0.0" js-tokens "^4.0.0" -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" +"@babel/parser@^7.16.7", "@babel/parser@^7.18.5": + version "7.18.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" + integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== + +"@babel/template@^7.16.7": + version "7.16.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" + integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/parser" "^7.16.7" + "@babel/types" "^7.16.7" + +"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": + version "7.18.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" + integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.18.2" + "@babel/helper-environment-visitor" "^7.18.2" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.18.5" + "@babel/types" "^7.18.4" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4": + version "7.18.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" + integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== + dependencies: + "@babel/helper-validator-identifier" "^7.16.7" + to-fast-properties "^2.0.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -50,38 +212,37 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/block@^3.4.0", "@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.5.1": - version "3.5.1" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.5.1.tgz#59737d393503249aa750c37dfc83896234f4e175" - integrity sha512-MoY9bHKABOBK6BW0v1N1Oc0Cve4x/giX67M3TtrVBUsKQTj2eznLGKpydoitxWSZ+WgKKSVhfRMzbCGRwk7T5w== +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2": + version "3.6.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" + integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.1" - ethereumjs-util "^7.1.1" - merkle-patricia-tree "^4.2.1" + "@ethereumjs/common" "^2.6.3" + "@ethereumjs/tx" "^3.5.1" + ethereumjs-util "^7.1.4" + merkle-patricia-tree "^4.2.4" -"@ethereumjs/blockchain@^5.4.0", "@ethereumjs/blockchain@^5.4.1": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.4.2.tgz#5074e0a0157818762a5f5175ea0bd93c5455fe32" - integrity sha512-AOAAwz/lw2lciG9gf5wHi7M/qknraXXnLR66lYgbQ04qfyFC3ZE5x/5rLVm1Vu+kfJLlKrYZTmA0IbOkc7kvgw== +"@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": + version "5.5.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" + integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== dependencies: - "@ethereumjs/block" "^3.5.1" - "@ethereumjs/common" "^2.5.0" + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/common" "^2.6.4" "@ethereumjs/ethash" "^1.1.0" - debug "^2.2.0" - ethereumjs-util "^7.1.1" + debug "^4.3.3" + ethereumjs-util "^7.1.5" level-mem "^5.0.1" lru-cache "^5.1.1" - rlp "^2.2.4" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.4.0", "@ethereumjs/common@^2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" - integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== +"@ethereumjs/common@^2.6.3", "@ethereumjs/common@^2.6.4": + version "2.6.4" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" + integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.1" + ethereumjs-util "^7.1.4" "@ethereumjs/ethash@^1.1.0": version "1.1.0" @@ -94,371 +255,372 @@ ethereumjs-util "^7.1.1" miller-rabin "^4.0.0" -"@ethereumjs/tx@^3.3.0", "@ethereumjs/tx@^3.3.1": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" - integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== +"@ethereumjs/tx@^3.5.1", "@ethereumjs/tx@^3.5.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" + integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== dependencies: - "@ethereumjs/common" "^2.5.0" - ethereumjs-util "^7.1.2" + "@ethereumjs/common" "^2.6.4" + ethereumjs-util "^7.1.5" -"@ethereumjs/vm@^5.5.2": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.5.3.tgz#dc8b30dd35efb589db093592600207660fa8dada" - integrity sha512-0k5OreWnlgXYs54wohgO11jtGI05GDasj2EYxzuaStxTi15CS3vow5wGYELC1pG9xngE1F/mFmKi/f14XRuDow== +"@ethereumjs/vm@^5.9.0": + version "5.9.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.2.tgz#e707976d507793096e449a87f0b204f614421cee" + integrity sha512-6zvH7iuMI7+74aGak6j9+GDYpV2T08vy2FL4iSK1PId7lNyjFELCAzDCSTQcVoyPoRMkZvRHy79W+djwvguMCA== dependencies: - "@ethereumjs/block" "^3.5.0" - "@ethereumjs/blockchain" "^5.4.1" - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.1" + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/blockchain" "^5.5.3" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/tx" "^3.5.2" async-eventemitter "^0.2.4" core-js-pure "^3.0.1" - debug "^2.2.0" - ethereumjs-util "^7.1.1" + debug "^4.3.3" + ethereumjs-util "^7.1.5" functional-red-black-tree "^1.0.1" mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.1" + merkle-patricia-tree "^4.2.4" rustbn.js "~0.2.0" - util.promisify "^1.0.1" - -"@ethersproject/abi@5.4.1", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" - integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" - integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" - -"@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" - integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" - integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - -"@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" - integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== - dependencies: - "@ethersproject/bytes" "^5.4.0" - -"@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" - integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - -"@ethersproject/bignumber@5.4.2", "@ethersproject/bignumber@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" - integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - bn.js "^4.11.9" -"@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" - integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" - integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - -"@ethersproject/contracts@5.4.1": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" - integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== - dependencies: - "@ethersproject/abi" "^5.4.0" - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - -"@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" - integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" - integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" - integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== - dependencies: - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/pbkdf2" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" +"@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" + integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" + integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" + +"@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" + integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" + integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + +"@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" + integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + +"@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" + integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + +"@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" + integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + bn.js "^5.2.1" + +"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" + integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" + integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + +"@ethersproject/contracts@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" + integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== + dependencies: + "@ethersproject/abi" "^5.6.3" + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/transactions" "^5.6.2" + +"@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" + integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" + integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" + integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== + dependencies: + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/pbkdf2" "^5.6.1" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" - integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== - dependencies: - "@ethersproject/bytes" "^5.4.0" - js-sha3 "0.5.7" - -"@ethersproject/logger@5.4.1", "@ethersproject/logger@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" - integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== - -"@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": - version "5.4.2" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" - integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" - integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - -"@ethersproject/properties@5.4.1", "@ethersproject/properties@^5.4.0": - version "5.4.1" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" - integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== - dependencies: - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/providers@5.4.5": - version "5.4.5" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.5.tgz#eb2ea2a743a8115f79604a8157233a3a2c832928" - integrity sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/basex" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/networks" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/web" "^5.4.0" +"@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" + integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== + dependencies: + "@ethersproject/bytes" "^5.6.1" + js-sha3 "0.8.0" + +"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" + integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== + +"@ethersproject/networks@5.6.4", "@ethersproject/networks@^5.6.3": + version "5.6.4" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" + integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" + integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + +"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" + integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== + dependencies: + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/providers@5.6.8": + version "5.6.8" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" + integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/base64" "^5.6.1" + "@ethersproject/basex" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/networks" "^5.6.3" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/web" "^5.6.1" bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" - integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== +"@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" + integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" - integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== +"@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" + integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" -"@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" - integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== +"@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" + integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" - integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== +"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" + integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - bn.js "^4.11.9" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + bn.js "^5.2.1" elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" - integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/sha2" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" - integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" - integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== - dependencies: - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/rlp" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - -"@ethersproject/units@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" - integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== - dependencies: - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/constants" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - -"@ethersproject/wallet@5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" - integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== - dependencies: - "@ethersproject/abstract-provider" "^5.4.0" - "@ethersproject/abstract-signer" "^5.4.0" - "@ethersproject/address" "^5.4.0" - "@ethersproject/bignumber" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/hdnode" "^5.4.0" - "@ethersproject/json-wallets" "^5.4.0" - "@ethersproject/keccak256" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/random" "^5.4.0" - "@ethersproject/signing-key" "^5.4.0" - "@ethersproject/transactions" "^5.4.0" - "@ethersproject/wordlists" "^5.4.0" - -"@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" - integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== - dependencies: - "@ethersproject/base64" "^5.4.0" - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" - -"@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": - version "5.4.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" - integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== - dependencies: - "@ethersproject/bytes" "^5.4.0" - "@ethersproject/hash" "^5.4.0" - "@ethersproject/logger" "^5.4.0" - "@ethersproject/properties" "^5.4.0" - "@ethersproject/strings" "^5.4.0" +"@ethersproject/solidity@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" + integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/sha2" "^5.6.1" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" + integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" + integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== + dependencies: + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/rlp" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + +"@ethersproject/units@5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" + integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== + dependencies: + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/constants" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + +"@ethersproject/wallet@5.6.2": + version "5.6.2" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" + integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== + dependencies: + "@ethersproject/abstract-provider" "^5.6.1" + "@ethersproject/abstract-signer" "^5.6.2" + "@ethersproject/address" "^5.6.1" + "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/hdnode" "^5.6.2" + "@ethersproject/json-wallets" "^5.6.1" + "@ethersproject/keccak256" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/random" "^5.6.1" + "@ethersproject/signing-key" "^5.6.2" + "@ethersproject/transactions" "^5.6.2" + "@ethersproject/wordlists" "^5.6.1" + +"@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" + integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== + dependencies: + "@ethersproject/base64" "^5.6.1" + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" + +"@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1": + version "5.6.1" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" + integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== + dependencies: + "@ethersproject/bytes" "^5.6.1" + "@ethersproject/hash" "^5.6.1" + "@ethersproject/logger" "^5.6.0" + "@ethersproject/properties" "^5.6.0" + "@ethersproject/strings" "^5.6.1" "@humanwhocodes/config-array@^0.5.0": version "0.5.0" @@ -470,9 +632,32 @@ minimatch "^3.0.4" "@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== + version "1.2.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/nyc-config-typescript@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89" + integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== "@jest/types@^24.9.0": version "24.9.0" @@ -483,6 +668,65 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" +"@jridgewell/gen-mapping@^0.1.0": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" + integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" + integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== + dependencies: + "@jridgewell/set-array" "^1.0.0" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.0.3": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" + integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + +"@jridgewell/set-array@^1.0.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" + integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.13" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" + integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" + integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@metamask/eth-sig-util@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" + integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== + dependencies: + ethereumjs-abi "^0.6.8" + ethereumjs-util "^6.2.1" + ethjs-util "^0.1.6" + tweetnacl "^1.0.3" + tweetnacl-util "^0.15.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -505,14 +749,14 @@ fastq "^1.6.0" "@nomiclabs/hardhat-ethers@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" - integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz#1c695263d5b46a375dcda48c248c4fba9dfe2fc2" + integrity sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng== "@openzeppelin/contracts@^4.3.2": - version "4.3.2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.3.2.tgz#ff80affd6d352dbe1bbc5b4e1833c41afd6283b6" - integrity sha512-AybF1cesONZStg5kWf6ao9OlqTZuPqddvprc0ky7lrUVOjXeKpmQ2Y9FK+6ygxasb+4aic4O5pneFBfwVsRRRg== + version "4.6.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" + integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== "@sentry/core@5.30.0": version "5.30.0" @@ -589,10 +833,10 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^7.0.4", "@sinonjs/fake-timers@^7.1.0": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== +"@sinonjs/fake-timers@>=5": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== dependencies: "@sinonjs/commons" "^1.7.0" @@ -604,9 +848,9 @@ "@sinonjs/commons" "^1.7.0" "@sinonjs/samsam@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.0.2.tgz#a0117d823260f282c04bff5f8704bdc2ac6910bb" - integrity sha512-jxPRPp9n93ci7b8hMfJOFDPRLFYadN6FSpeROFTR4UNF4i5b+EK6m4QXPO46BDhFgRy1JuS87zAnFOzCUwMJcQ== + version "6.1.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" + integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" @@ -617,35 +861,37 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@solidity-parser/parser@^0.11.0": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.11.1.tgz#fa840af64840c930f24a9c82c08d4a092a068add" - integrity sha512-H8BSBoKE8EubJa0ONqecA2TviT3TnHeC4NpgnAHSUiuhZoQBfPB4L2P9bs8R6AoTW10Endvh3vc+fomVMIDIYQ== +"@solidity-parser/parser@^0.14.1": + version "0.14.2" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.2.tgz#2d8f2bddb217621df882ceeae7d7b42ae8664db3" + integrity sha512-10cr0s+MtRtqjEw0WFJrm2rwULN30xx7btd/v9cmqME2617/2M5MbHDkFIGIGTa7lwNw4bN9mVGfhlLzrYw8pA== + dependencies: + antlr4ts "^0.5.0-alpha.4" "@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== "@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== "@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" + integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== "@types/abstract-leveldown@*": - version "5.0.2" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-5.0.2.tgz#ee81917fe38f770e29eec8139b6f16ee4a8b0a5f" - integrity sha512-+jA1XXF3jsz+Z7FcuiNqgK53hTa/luglT2TyTpKPqoYbxVY+mCPF22Rm+q3KPBrMHJwNXFrTViHszBOfU4vftQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" + integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== "@types/bn.js@^4.11.3": version "4.11.6" @@ -662,21 +908,16 @@ "@types/node" "*" "@types/chai-as-promised@^7.1.4": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.4.tgz#caf64e76fb056b8c8ced4b761ed499272b737601" - integrity sha512-1y3L1cHePcIm5vXkh1DSGf/zQq5n5xDKG1fpCvf18+uOkpce0Z1ozNFPkyWsVswK7ntN1sZBw3oU6gmN+pDUcA== + version "7.1.5" + resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" + integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== dependencies: "@types/chai" "*" -"@types/chai@*": - version "4.3.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.0.tgz#23509ebc1fa32f1b4d50d6a66c4032d5b8eaabdc" - integrity sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw== - -"@types/chai@^4.2.22": - version "4.2.22" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.2.22.tgz#47020d7e4cf19194d43b5202f35f75bd2ad35ce7" - integrity sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ== +"@types/chai@*", "@types/chai@^4.2.22": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" + integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== "@types/debug@^4.1.7": version "4.1.7" @@ -693,9 +934,9 @@ "@types/node" "*" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== + version "2.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== "@types/istanbul-lib-report@*": version "3.0.0" @@ -713,14 +954,14 @@ "@types/istanbul-lib-report" "*" "@types/json-schema@^7.0.7": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" - integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" + integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== "@types/json5@^0.0.29": version "0.0.29" resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== "@types/level-errors@*": version "3.0.0" @@ -742,25 +983,30 @@ integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== "@types/mocha@^9.0.0": - version "9.0.0" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" - integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== + version "9.1.1" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" + integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== "@types/ms@*": version "0.7.31" resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== -"@types/node@*", "@types/node@^16.11.1": - version "16.11.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.1.tgz#2e50a649a50fc403433a14f829eface1a3443e97" - integrity sha512-PYGcJHL9mwl1Ek3PLiYgyEKtwTMmkMw4vbiyz/ps3pfdRYLVv+SN7qHVAImrjdAXxgluDEw6Ph4lyv+m9UpRmA== +"@types/node@*": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" + integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== "@types/node@12.20.25": version "12.20.25" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== +"@types/node@^16.11.1": + version "16.11.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" + integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== + "@types/pbkdf2@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" @@ -769,14 +1015,14 @@ "@types/node" "*" "@types/prop-types@*": - version "15.7.4" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" - integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== + version "15.7.5" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react@^17.0.35": - version "17.0.35" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.35.tgz#217164cf830267d56cd1aec09dcf25a541eedd4c" - integrity sha512-r3C8/TJuri/SLZiiwwxQoLAoavaczARfT9up9b4Jr65+ErAUX3MIkU0oMOQnrpfgHme8zIqZLX7O5nnjm5Wayw== + version "17.0.47" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.47.tgz#4ee71aaf4c5a9e290e03aa4d0d313c5d666b3b78" + integrity sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -795,21 +1041,26 @@ "@types/node" "*" "@types/sinon@^10.0.6": - version "10.0.6" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.6.tgz#bc3faff5154e6ecb69b797d311b7cf0c1b523a1d" - integrity sha512-6EF+wzMWvBNeGrfP3Nx60hhx+FfwSg1JJBLAAP/IdIUq0EYkqCYf70VT3PhuhPX9eLD+Dp+lNdpb/ZeHG8Yezg== + version "10.0.11" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" + integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== dependencies: - "@sinonjs/fake-timers" "^7.1.0" + "@types/sinonjs__fake-timers" "*" + +"@types/sinonjs__fake-timers@*": + version "8.1.2" + resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" + integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== "@types/tmp@^0.2.2": - version "0.2.2" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.2.tgz#424537a3b91828cb26aaf697f21ae3cd1b69f7e7" - integrity sha512-MhSa0yylXtVMsyT8qFpHA1DLHj4DvQGH5ntxrhHSh8PxUVNi35Wk+P5hVgqbO2qZqOotqr9jaoPRL+iRjWYm/A== + version "0.2.3" + resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" + integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== "@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== + version "21.0.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== "@types/yargs@^13.0.0": version "13.0.12" @@ -942,9 +1193,9 @@ acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1: - version "8.5.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.5.0.tgz#4512ccb99b3698c752591e9bb4472e38ad43cee2" - integrity sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q== + version "8.7.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" + integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== adm-zip@^0.4.16: version "0.4.16" @@ -954,7 +1205,7 @@ adm-zip@^0.4.16: aes-js@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= + integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== agent-base@6: version "6.0.2" @@ -963,6 +1214,14 @@ agent-base@6: dependencies: debug "4" +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv@^6.10.0, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -974,25 +1233,25 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.6.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.3.tgz#11a66527761dc3e9a3845ea775d2d3c0414e8764" - integrity sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw== + version "8.11.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" + integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@4.1.1, ansi-colors@^4.1.1: +ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== +ansi-colors@^4.1.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" + integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== + ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" @@ -1000,15 +1259,10 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== ansi-regex@^5.0.1: version "5.0.1" @@ -1029,7 +1283,12 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.1, anymatch@~3.1.2: +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1037,6 +1296,18 @@ anymatch@~3.1.1, anymatch@~3.1.2: normalize-path "^3.0.0" picomatch "^2.0.4" +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -1055,13 +1326,13 @@ argparse@^2.0.1: integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== array-includes@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.4.tgz#f5b493162c760f3539631f005ba2bb46acb45ba9" - integrity sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.19.5" get-intrinsic "^1.1.1" is-string "^1.0.7" @@ -1071,13 +1342,14 @@ array-union@^2.1.0: integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== array.prototype.flat@^1.2.4: - version "1.2.5" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz#07e0975d84bbc7c48cd1879d609e682598d33e13" - integrity sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.19.0" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" assertion-error@^1.1.0: version "1.1.0" @@ -1097,9 +1369,9 @@ async-eventemitter@^0.2.4: async "^2.4.0" async@^2.4.0: - version "2.6.3" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== dependencies: lodash "^4.17.14" @@ -1114,9 +1386,9 @@ balanced-match@^1.0.0: integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base-x@^3.0.2: - version "3.0.8" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" - integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + version "3.0.9" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" + integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== dependencies: safe-buffer "^5.0.1" @@ -1136,9 +1408,9 @@ binary-extensions@^2.0.0: integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== blakejs@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.1.tgz#bf313053978b2cd4c444a48795710be05c785702" - integrity sha512-bLG6PHOCZJKNshTjGRBvET0vTciwQE6zFKOKKXPDJfwFBd4Ac0yBfPZqcGvGJap50l7ktvlpFqc2jGVaUgbJgg== + version "1.2.1" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" + integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== bluebird@^3.5.1: version "3.7.2" @@ -1150,10 +1422,10 @@ bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2, bn.js@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" - integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== +bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" + integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== brace-expansion@^1.1.7: version "1.1.11" @@ -1163,7 +1435,7 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -1173,7 +1445,7 @@ braces@^3.0.1, braces@~3.0.2: brorand@^1.0.1, brorand@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== browser-stdout@1.3.1: version "1.3.1" @@ -1192,10 +1464,21 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" +browserslist@^4.20.2: + version "4.20.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" + integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + dependencies: + caniuse-lite "^1.0.30001349" + electron-to-chromium "^1.4.147" + escalade "^3.1.1" + node-releases "^2.0.5" + picocolors "^1.0.0" + bs58@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== dependencies: base-x "^3.0.2" @@ -1216,7 +1499,7 @@ buffer-from@^1.0.0: buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= + integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== buffer-xor@^2.0.1: version "2.0.2" @@ -1233,10 +1516,20 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" -bytes@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" call-bind@^1.0.0, call-bind@^1.0.2: version "1.0.2" @@ -1251,15 +1544,20 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -camelcase@^5.0.0: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== camelcase@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001349: + version "1.0.30001358" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz#473d35dabf5e448b463095cab7924e96ccfb8c00" + integrity sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw== chai-as-promised@^7.1.1: version "7.1.1" @@ -1269,14 +1567,15 @@ chai-as-promised@^7.1.1: check-error "^1.0.2" chai@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" - integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== + version "4.3.6" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" + integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== dependencies: assertion-error "^1.1.0" check-error "^1.0.2" deep-eql "^3.0.1" get-func-name "^2.0.0" + loupe "^2.3.1" pathval "^1.1.1" type-detect "^4.0.5" @@ -1300,27 +1599,12 @@ chalk@^4.0.0, chalk@^4.1.0: check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" + integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -chokidar@3.5.2, chokidar@^3.4.0: - version "3.5.2" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== +chokidar@3.5.3, chokidar@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" @@ -1345,6 +1629,11 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-boxes@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" @@ -1379,6 +1668,15 @@ cliui@^5.0.0: strip-ansi "^5.2.0" wrap-ansi "^5.1.0" +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -1412,7 +1710,7 @@ color-convert@^2.0.1: color-name@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== color-name@~1.1.4: version "1.1.4" @@ -1429,33 +1727,42 @@ commander@3.0.2: resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +convert-source-map@^1.7.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" + integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== + dependencies: + safe-buffer "~5.1.1" convert-to-spaces@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= + integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== cookie@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" - integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== core-js-pure@^3.0.1: - version "3.18.3" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.18.3.tgz#7eed77dcce1445ab68fd68715856633e2fb3b90c" - integrity sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw== + version "3.23.2" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.2.tgz#efe5e486469c5ed2d088d76e973eb12e74a930e7" + integrity sha512-t6u7H4Ff/yZNk+zqTr74UjCcZ3k8ApBryeLLV4rYQd9aF3gqmjjGjjR44ENfeBMH8VVvSynIjAJ0mUuFhzQtrA== crc-32@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.0.tgz#cb2db6e29b88508e32d9dd0ec1693e7b41a18208" - integrity sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA== - dependencies: - exit-on-epipe "~1.0.1" - printj "~1.1.0" + version "1.2.2" + resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" @@ -1496,7 +1803,7 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1506,25 +1813,25 @@ cross-spawn@^7.0.2: which "^2.0.1" csstype@^3.0.2: - version "3.0.10" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" - integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: - ms "^2.1.1" + ms "2.1.2" -debug@4, debug@4.3.2, debug@^4.0.1, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== +debug@4.3.3: + version "4.3.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" + integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== dependencies: ms "2.1.2" -debug@^2.2.0, debug@^2.6.9: +debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -1541,7 +1848,7 @@ debug@^3.2.7: decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== decamelize@^4.0.0: version "4.0.0" @@ -1560,6 +1867,13 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +default-require-extensions@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" + integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + dependencies: + strip-bom "^4.0.0" + deferred-leveldown@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" @@ -1568,24 +1882,20 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" -define-properties@^1.1.2, define-properties@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== -diff@5.0.0, diff@^5.0.0: +diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== @@ -1595,6 +1905,11 @@ diff@^4.0.1: resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== +diff@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" + integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -1616,7 +1931,12 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -elliptic@6.5.4, elliptic@^6.5.2: +electron-to-chromium@^1.4.147: + version "1.4.164" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.164.tgz#3d0f5c83557d8ec8a7faa531e498f198c3bd974a" + integrity sha512-K7iy5y6XyP9Pzh3uaDti0KC4JUNT6T1tLG5RTOmesqq2YgAJpYYYJ32m+anvZYjCV35llPTEh87kvEV/uSsiyQ== + +elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -1682,31 +2002,41 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3" - integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w== +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + function.prototype.name "^1.1.5" get-intrinsic "^1.1.1" get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.2" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" internal-slot "^1.0.3" is-callable "^1.2.4" - is-negative-zero "^2.0.1" + is-negative-zero "^2.0.2" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.1" + is-shared-array-buffer "^1.0.2" is-string "^1.0.7" - is-weakref "^1.0.1" - object-inspect "^1.11.0" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.1" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -1717,21 +2047,26 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" @@ -1751,13 +2086,12 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-module-utils@^2.6.2: - version "2.7.1" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz#b435001c9f8dd4ab7f6d0efcae4b9696d4c24b7c" - integrity sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ== + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== dependencies: debug "^3.2.7" find-up "^2.1.0" - pkg-dir "^2.0.0" eslint-plugin-import@2.24.2: version "2.24.2" @@ -1907,25 +2241,15 @@ estraverse@^4.1.1: integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -eth-sig-util@^2.5.2: - version "2.5.4" - resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.4.tgz#577b01fe491b6bf59b0464be09633e20c1677bc5" - integrity sha512-aCMBwp8q/4wrW4QLsF/HYBOSA7TpLKmkVwP3pYQNkEEseW2Rr8Z5Uxc9/h6HX+OG3tuHo+2bINVSihIeBfym6A== - dependencies: - ethereumjs-abi "0.6.8" - ethereumjs-util "^5.1.1" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.0" - ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" @@ -1947,7 +2271,7 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" -ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: +ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== @@ -1955,20 +2279,7 @@ ethereumjs-abi@0.6.8, ethereumjs-abi@^0.6.8: bn.js "^4.11.8" ethereumjs-util "^6.0.0" -ethereumjs-util@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" - integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== - dependencies: - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "^0.1.3" - rlp "^2.0.0" - safe-buffer "^5.1.1" - -ethereumjs-util@^6.0.0: +ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== @@ -1981,10 +2292,10 @@ ethereumjs-util@^6.0.0: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.3.tgz#b55d7b64dde3e3e45749e4c41288238edec32d23" - integrity sha512-y+82tEbyASO0K0X1/SRhbJJoAlfcvq8JbrG4a5cjrOks7HS/36efU/0j2flxCPOUM++HFahk33kr/ZxyC4vNuw== +ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== dependencies: "@types/bn.js" "^5.1.0" bn.js "^5.1.2" @@ -1993,42 +2304,42 @@ ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2: rlp "^2.2.4" ethers@^5.4.7: - version "5.4.7" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.7.tgz#0fd491a5da7c9793de2d6058d76b41b1e7efba8f" - integrity sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew== - dependencies: - "@ethersproject/abi" "5.4.1" - "@ethersproject/abstract-provider" "5.4.1" - "@ethersproject/abstract-signer" "5.4.1" - "@ethersproject/address" "5.4.0" - "@ethersproject/base64" "5.4.0" - "@ethersproject/basex" "5.4.0" - "@ethersproject/bignumber" "5.4.2" - "@ethersproject/bytes" "5.4.0" - "@ethersproject/constants" "5.4.0" - "@ethersproject/contracts" "5.4.1" - "@ethersproject/hash" "5.4.0" - "@ethersproject/hdnode" "5.4.0" - "@ethersproject/json-wallets" "5.4.0" - "@ethersproject/keccak256" "5.4.0" - "@ethersproject/logger" "5.4.1" - "@ethersproject/networks" "5.4.2" - "@ethersproject/pbkdf2" "5.4.0" - "@ethersproject/properties" "5.4.1" - "@ethersproject/providers" "5.4.5" - "@ethersproject/random" "5.4.0" - "@ethersproject/rlp" "5.4.0" - "@ethersproject/sha2" "5.4.0" - "@ethersproject/signing-key" "5.4.0" - "@ethersproject/solidity" "5.4.0" - "@ethersproject/strings" "5.4.0" - "@ethersproject/transactions" "5.4.0" - "@ethersproject/units" "5.4.0" - "@ethersproject/wallet" "5.4.0" - "@ethersproject/web" "5.4.0" - "@ethersproject/wordlists" "5.4.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "5.6.9" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.9.tgz#4e12f8dfcb67b88ae7a78a9519b384c23c576a4d" + integrity sha512-lMGC2zv9HC5EC+8r429WaWu3uWJUCgUCt8xxKCFqkrFuBDZXDYIdzDUECxzjf2BMF8IVBByY1EBoGSL3RTm8RA== + dependencies: + "@ethersproject/abi" "5.6.4" + "@ethersproject/abstract-provider" "5.6.1" + "@ethersproject/abstract-signer" "5.6.2" + "@ethersproject/address" "5.6.1" + "@ethersproject/base64" "5.6.1" + "@ethersproject/basex" "5.6.1" + "@ethersproject/bignumber" "5.6.2" + "@ethersproject/bytes" "5.6.1" + "@ethersproject/constants" "5.6.1" + "@ethersproject/contracts" "5.6.2" + "@ethersproject/hash" "5.6.1" + "@ethersproject/hdnode" "5.6.2" + "@ethersproject/json-wallets" "5.6.1" + "@ethersproject/keccak256" "5.6.1" + "@ethersproject/logger" "5.6.0" + "@ethersproject/networks" "5.6.4" + "@ethersproject/pbkdf2" "5.6.1" + "@ethersproject/properties" "5.6.0" + "@ethersproject/providers" "5.6.8" + "@ethersproject/random" "5.6.1" + "@ethersproject/rlp" "5.6.1" + "@ethersproject/sha2" "5.6.1" + "@ethersproject/signing-key" "5.6.2" + "@ethersproject/solidity" "5.6.1" + "@ethersproject/strings" "5.6.1" + "@ethersproject/transactions" "5.6.2" + "@ethersproject/units" "5.6.1" + "@ethersproject/wallet" "5.6.2" + "@ethersproject/web" "5.6.1" + "@ethersproject/wordlists" "5.6.1" + +ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== @@ -2062,11 +2373,6 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit-on-epipe@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz#0bdd92e87d5285d267daa8171d0eb06159689692" - integrity sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw== - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -2077,10 +2383,10 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.1.1: - version "3.2.7" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== +fast-glob@^3.2.9: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2096,7 +2402,7 @@ fast-json-stable-stringify@^2.0.0: fast-levenshtein@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: version "1.13.0" @@ -2119,12 +2425,14 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== +find-cache-dir@^3.2.0: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== dependencies: - locate-path "^3.0.0" + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" find-up@5.0.0: version "5.0.0" @@ -2137,10 +2445,25 @@ find-up@5.0.0: find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== dependencies: locate-path "^2.0.0" +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -2149,34 +2472,28 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.2.tgz#64bfed5cb68fe3ca78b3eb214ad97b63bedce561" - integrity sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA== + version "3.2.5" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" + integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== follow-redirects@^1.12.1: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== dependencies: - is-callable "^1.1.3" + cross-spawn "^7.0.0" + signal-exit "^3.0.2" fp-ts@1.19.3: version "1.19.3" @@ -2188,10 +2505,15 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A= + integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -2200,9 +2522,9 @@ fs-extra@^0.30.0: rimraf "^2.2.8" fs-extra@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1" - integrity sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ== + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== dependencies: graceful-fs "^4.2.0" jsonfile "^6.0.1" @@ -2220,12 +2542,7 @@ fs-extra@^7.0.1: fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.2" @@ -2237,10 +2554,30 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= + integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== + +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" @@ -2250,16 +2587,21 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: get-func-name@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= + integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== get-stream@^4.0.0: version "4.1.0" @@ -2276,17 +2618,17 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== +glob@7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" + integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -2295,53 +2637,46 @@ glob@7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== +glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" - minimatch "^3.0.4" + minimatch "^3.1.1" once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.11.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== + version "13.15.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" + integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== dependencies: type-fest "^0.20.2" globby@^11.0.3: - version "11.0.4" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" - integrity sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg== + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== dependencies: array-union "^2.1.0" dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: + version "4.2.10" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" + integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== growl@1.10.5: version "1.10.5" @@ -2349,22 +2684,24 @@ growl@1.10.5: integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== hardhat@^2.0.0, hardhat@^2.6.4: - version "2.6.6" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.6.6.tgz#11d2dc4c1659fcbb8632de9399b1b4999f8b3628" - integrity sha512-GneZAwvNxf3cNobYTmMSp2qGX/yJyUmHD/xjW+8zF2AgWkLS33CHmGn4aRFKqfjsk7BS7FU6jqMmmZhHHO3gUw== - dependencies: - "@ethereumjs/block" "^3.4.0" - "@ethereumjs/blockchain" "^5.4.0" - "@ethereumjs/common" "^2.4.0" - "@ethereumjs/tx" "^3.3.0" - "@ethereumjs/vm" "^5.5.2" + version "2.9.9" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.9.tgz#05c1015eb73e0230309534b00deeb080724aace0" + integrity sha512-Qv7SXnRc0zq1kGXruNnSKpP3eFccXMR5Qv6GVX9hBIJ5efN0PflKPq92aQ5Cv3jrjJeRevLznWZVz7bttXhVfw== + dependencies: + "@ethereumjs/block" "^3.6.2" + "@ethereumjs/blockchain" "^5.5.2" + "@ethereumjs/common" "^2.6.4" + "@ethereumjs/tx" "^3.5.1" + "@ethereumjs/vm" "^5.9.0" "@ethersproject/abi" "^5.1.2" + "@metamask/eth-sig-util" "^4.0.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.11.0" + "@solidity-parser/parser" "^0.14.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" adm-zip "^0.4.16" + aggregate-error "^3.0.0" ansi-escapes "^4.3.0" chalk "^2.4.2" chokidar "^3.4.0" @@ -2372,22 +2709,20 @@ hardhat@^2.0.0, hardhat@^2.6.4: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - eth-sig-util "^2.5.2" ethereum-cryptography "^0.1.2" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.0" + ethereumjs-util "^7.1.4" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" - glob "^7.1.3" - https-proxy-agent "^5.0.0" + glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" lodash "^4.17.11" - merkle-patricia-tree "^4.2.0" + merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" - mocha "^7.1.2" - node-fetch "^2.6.0" + mocha "^9.2.0" + p-map "^4.0.0" qs "^6.7.0" raw-body "^2.4.1" resolve "1.17.0" @@ -2398,28 +2733,36 @@ hardhat@^2.0.0, hardhat@^2.6.4: stacktrace-parser "^0.1.10" "true-case-path" "^2.2.1" tsort "0.0.1" - uuid "^3.3.2" + undici "^5.4.0" + uuid "^8.3.2" ws "^7.4.6" -has-bigints@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== has-tostringtag@^1.0.0: version "1.0.0" @@ -2452,6 +2795,14 @@ hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -2460,7 +2811,7 @@ he@1.2.0: hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== dependencies: hash.js "^1.0.3" minimalistic-assert "^1.0.0" @@ -2471,21 +2822,26 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== -http-errors@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw== - dependencies: - depd "~1.1.2" +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== dependencies: agent-base "6" debug "4" @@ -2507,10 +2863,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.1.4: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== +ignore@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" + integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== immediate@^3.2.3: version "3.3.0" @@ -2520,12 +2876,12 @@ immediate@^3.2.3: immediate@~3.2.3: version "3.2.3" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw= + integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== immutable@^4.0.0-rc.12: - version "4.0.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" - integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" + integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.3.0" @@ -2538,7 +2894,7 @@ import-fresh@^3.0.0, import-fresh@^3.2.1: imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== indent-string@^4.0.0: version "4.0.0" @@ -2548,7 +2904,7 @@ indent-string@^4.0.0: inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" @@ -2613,7 +2969,7 @@ io-ts@1.10.4: is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== is-bigint@^1.0.1: version "1.0.4" @@ -2637,12 +2993,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.4: +is-callable@^1.1.4, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== @@ -2654,10 +3005,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.6.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548" - integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw== +is-core-module@^2.6.0, is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" @@ -2671,12 +3022,12 @@ is-date-object@^1.0.1: is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== is-fullwidth-code-point@^3.0.0: version "3.0.0" @@ -2693,17 +3044,17 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: is-hex-prefixed@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== is-number-object@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0" - integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g== + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== dependencies: has-tostringtag "^1.0.0" @@ -2725,15 +3076,22 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" - integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA== +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== is-string@^1.0.5, is-string@^1.0.7: version "1.0.7" @@ -2749,27 +3107,97 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== -is-weakref@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2" - integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ== +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" + integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== + dependencies: + "@babel/core" "^7.7.5" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.0.0" + semver "^6.3.0" + +istanbul-lib-processinfo@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" + integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^3.0.0" + uuid "^8.3.2" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" + integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" jest-changed-files@^24.9.0: version "24.9.0" @@ -2780,11 +3208,6 @@ jest-changed-files@^24.9.0: execa "^1.0.0" throat "^4.0.0" -js-sha3@0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= - js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" @@ -2795,14 +3218,6 @@ js-sha3@0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - js-yaml@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -2818,6 +3233,11 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -2836,7 +3256,7 @@ json-schema-traverse@^1.0.0: json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== json5@^1.0.1: version "1.0.1" @@ -2845,17 +3265,22 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha1-NzaitCi4e72gzIO1P6PWM6NcKug= + integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== optionalDependencies: graceful-fs "^4.1.6" jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= + integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== optionalDependencies: graceful-fs "^4.1.6" @@ -2885,7 +3310,7 @@ keccak@^3.0.0: klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha1-QIhDO0azsbolnXh4XY6W9zugJDk= + integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== optionalDependencies: graceful-fs "^4.1.9" @@ -2971,7 +3396,7 @@ levn@^0.4.1: load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== dependencies: graceful-fs "^4.1.2" parse-json "^4.0.0" @@ -2981,7 +3406,7 @@ load-json-file@^4.0.0: locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== dependencies: p-locate "^2.0.0" path-exists "^3.0.0" @@ -2994,6 +3419,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -3001,15 +3433,15 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== lodash.merge@^4.6.2: version "4.6.2" @@ -3019,20 +3451,13 @@ lodash.merge@^4.6.2: lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -3048,6 +3473,13 @@ loose-envify@^1.1.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loupe@^2.3.1: + version "2.3.4" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" + integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + dependencies: + get-func-name "^2.0.0" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -3065,12 +3497,19 @@ lru-cache@^6.0.0: lru_map@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0= + integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== ltgt@~2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" make-error@^1.1.1: version "1.3.6" @@ -3106,33 +3545,32 @@ memdown@^5.0.0: memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha1-htcJCzDORV1j+64S3aUaR93K+bI= + integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== -merge2@^1.3.0: +merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^4.2.0, merkle-patricia-tree@^4.2.1: - version "4.2.2" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.2.tgz#6dec17855370172458244c2f42c989dd60b773a3" - integrity sha512-eqZYNTshcYx9aESkSPr71EqwsR/QmpnObDEV4iLxkt/x/IoLYZYjJvKY72voP/27Vy61iMOrfOG6jrn7ttXD+Q== +merkle-patricia-tree@^4.2.4: + version "4.2.4" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" + integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== dependencies: "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.2" + ethereumjs-util "^7.1.4" level-mem "^5.0.1" level-ws "^2.0.0" readable-stream "^3.6.0" - rlp "^2.2.4" semaphore-async-await "^1.5.1" micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: - braces "^3.0.1" - picomatch "^2.2.3" + braces "^3.0.2" + picomatch "^2.3.1" miller-rabin@^4.0.0: version "4.0.1" @@ -3155,90 +3593,60 @@ minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: minimalistic-crypto-utils@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== -minimatch@3.0.4, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== +minimatch@4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" + integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== dependencies: brace-expansion "^1.1.7" -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== +minimatch@^3.0.4, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: - minimist "^1.2.5" + brace-expansion "^1.1.7" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== mnemonist@^0.38.0: - version "0.38.4" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.4.tgz#5d2f2dc4386aef78bfadeea60ce704dcf0ef8f3d" - integrity sha512-mflgW0gEWmVLbDDE2gJbOh3+RltTN7CgV9jV25qyCnyLN9FtoltWr7ZtAEDeD9u8W4oFAoolR6fBWieXdn3u8Q== + version "0.38.5" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" + integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== dependencies: - obliterator "^1.6.1" + obliterator "^2.0.0" -mocha@^7.1.2: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mocha@^9.1.1, mocha@^9.1.3: - version "9.1.3" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" - integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== +mocha@^9.1.1, mocha@^9.1.3, mocha@^9.2.0: + version "9.2.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" + integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== dependencies: "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" - chokidar "3.5.2" - debug "4.3.2" + chokidar "3.5.3" + debug "4.3.3" diff "5.0.0" escape-string-regexp "4.0.0" find-up "5.0.0" - glob "7.1.7" + glob "7.2.0" growl "1.10.5" he "1.2.0" js-yaml "4.1.0" log-symbols "4.1.0" - minimatch "3.0.4" + minimatch "4.2.1" ms "2.1.3" - nanoid "3.1.25" + nanoid "3.3.1" serialize-javascript "6.0.0" strip-json-comments "3.1.1" supports-color "8.1.1" which "2.0.2" - workerpool "6.1.5" + workerpool "6.2.0" yargs "16.2.0" yargs-parser "20.2.4" yargs-unparser "2.0.0" @@ -3246,12 +3654,7 @@ mocha@^9.1.1, mocha@^9.1.3: ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== ms@2.1.2: version "2.1.2" @@ -3263,15 +3666,15 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -nanoid@3.1.25: - version "3.1.25" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" - integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== +nanoid@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" + integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== nice-try@^1.0.4: version "1.0.5" @@ -3279,12 +3682,12 @@ nice-try@^1.0.4: integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== nise@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.0.tgz#713ef3ed138252daef20ec035ab62b7a28be645c" - integrity sha512-W5WlHu+wvo3PaKLsJJkgPup2LrsXCcm7AWwyNZkUnn5rwPkuPBi3Iwk5SQtN0mv+K65k7nKKjwNQ30wg3wLAQQ== + version "5.1.1" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" + integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== dependencies: - "@sinonjs/commons" "^1.7.0" - "@sinonjs/fake-timers" "^7.0.4" + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" ">=5" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" path-to-regexp "^1.7.0" @@ -3294,25 +3697,22 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" +node-gyp-build@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" + integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== -node-fetch@^2.6.0: - version "2.6.5" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== dependencies: - whatwg-url "^5.0.0" + process-on-spawn "^1.0.0" -node-gyp-build@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" - integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== +node-releases@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" + integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== normalize-package-data@^2.3.2: version "2.5.0" @@ -3332,35 +3732,58 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== dependencies: path-key "^2.0.0" +nyc@15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" + integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^2.0.0" + get-package-type "^0.1.0" + glob "^7.1.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^4.0.0" + istanbul-lib-processinfo "^2.0.2" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + spawn-wrap "^2.0.0" + test-exclude "^6.0.0" + yargs "^15.0.2" + object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.11.0, object-inspect@^1.9.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" - integrity sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" @@ -3371,15 +3794,6 @@ object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3, object.getownpropertydescriptors@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz#b223cf38e17fefb97a63c10c91df72ccb386df9e" - integrity sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - object.values@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -3389,15 +3803,15 @@ object.values@^1.1.4: define-properties "^1.1.3" es-abstract "^1.19.1" -obliterator@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" - integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== +obliterator@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" + integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" @@ -3423,12 +3837,12 @@ optionator@^0.9.1: os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== p-limit@^1.1.0: version "1.3.0" @@ -3437,7 +3851,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -3454,7 +3868,7 @@ p-limit@^3.0.2: p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== dependencies: p-limit "^1.1.0" @@ -3465,6 +3879,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-locate@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" @@ -3472,16 +3893,40 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -3492,7 +3937,7 @@ parent-module@^1.0.0: parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" @@ -3505,7 +3950,7 @@ patch-console@^1.0.0: path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== path-exists@^4.0.0: version "4.0.0" @@ -3515,19 +3960,19 @@ path-exists@^4.0.0: path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -3567,27 +4012,32 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" - integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== dependencies: - find-up "^2.1.0" + find-up "^4.0.0" pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha1-yBmscoBZpGHKscOImivjxJoATX8= + integrity sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg== dependencies: find-up "^2.1.0" @@ -3608,10 +4058,12 @@ prettier@2.4.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== -printj@~1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/printj/-/printj-1.1.2.tgz#d90deb2975a8b9f600fb3a1c94e3f4c53c78a222" - integrity sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ== +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" progress@^2.0.0: version "2.0.3" @@ -3621,7 +4073,7 @@ progress@^2.0.0: prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= + integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== pump@^3.0.0: version "3.0.0" @@ -3637,9 +4089,9 @@ punycode@^2.1.0: integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== qs@^6.7.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + version "6.10.5" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" + integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== dependencies: side-channel "^1.0.4" @@ -3649,9 +4101,9 @@ queue-microtask@^1.2.2: integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== ramda@^0.27.1: - version "0.27.1" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.1.tgz#66fc2df3ef873874ffc2da6aa8984658abacf5c9" - integrity sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw== + version "0.27.2" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" + integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== randombytes@^2.1.0: version "2.1.0" @@ -3661,19 +4113,19 @@ randombytes@^2.1.0: safe-buffer "^5.1.0" raw-body@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c" - integrity sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA== + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.0" - http-errors "1.7.3" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" react-devtools-core@^4.19.1: - version "4.21.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.21.0.tgz#a54c9a0fd7261491e616d6c87d1869e011d8521d" - integrity sha512-clGWwJHV5MHwTwYyKc+7FZHwzdbzrD2/AoZSkicUcr6YLc3Za9a9FaLhccWDHfjQ+ron9yzNhDT6Tv+FiPkD3g== + version "4.24.7" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.7.tgz#43df22e6d244ed8286fd3ff16a80813998fe82a0" + integrity sha512-OFB1cp8bsh5Kc6oOJ3ZzH++zMBtydwD53yBYa50FKEGyOOdgdbJ4VsCsZhN/6F5T4gJfrZraU6EKda8P+tMLtg== dependencies: shell-quote "^1.6.1" ws "^7" @@ -3698,7 +4150,7 @@ react@^17.0.2: read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== dependencies: find-up "^2.0.0" read-pkg "^3.0.0" @@ -3706,7 +4158,7 @@ read-pkg-up@^3.0.0: read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== dependencies: load-json-file "^4.0.0" normalize-package-data "^2.3.2" @@ -3721,13 +4173,6 @@ readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -3735,15 +4180,31 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== + dependencies: + es6-error "^4.0.1" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" @@ -3760,6 +4221,11 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve@1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -3768,12 +4234,13 @@ resolve@1.17.0: path-parse "^1.0.6" resolve@^1.10.0, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" restore-cursor@^3.1.0: version "3.1.0" @@ -3810,7 +4277,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rlp@^2.0.0, rlp@^2.2.3, rlp@^2.2.4: +rlp@^2.2.3, rlp@^2.2.4: version "2.2.7" resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== @@ -3834,6 +4301,11 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + "safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" @@ -3853,33 +4325,33 @@ scrypt-js@3.0.1, scrypt-js@^3.0.0: integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== secp256k1@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" - integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + version "4.0.3" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" + integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== dependencies: - elliptic "^6.5.2" + elliptic "^6.5.4" node-addon-api "^2.0.0" node-gyp-build "^4.2.0" semaphore-async-await@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha1-hXvvXjZEYBykuVcLh+nfXKEpdPo= + integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== -"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.7.0: +"semver@2 || 3 || 4 || 5", semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.3.0: +semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== semver@^7.2.1, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== dependencies: lru-cache "^6.0.0" @@ -3893,17 +4365,17 @@ serialize-javascript@6.0.0: set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= + integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== -setprototypeof@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw== +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.11" @@ -3916,7 +4388,7 @@ sha.js@^2.4.0, sha.js@^2.4.8: shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== dependencies: shebang-regex "^1.0.0" @@ -3930,7 +4402,7 @@ shebang-command@^2.0.0: shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== shebang-regex@^3.0.0: version "3.0.0" @@ -3952,9 +4424,9 @@ side-channel@^1.0.4: object-inspect "^1.9.0" signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.5" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.5.tgz#9e3e8cc0c75a99472b44321033a7702e7738252f" - integrity sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ== + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== sinon@^12.0.1: version "12.0.1" @@ -4007,18 +4479,30 @@ solc@0.7.3: tmp "0.0.33" source-map-support@^0.5.13: - version "0.5.20" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" - integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" -source-map@^0.6.0: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +spawn-wrap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" + integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== + dependencies: + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^3.0.0" + signal-exit "^3.0.2" + which "^2.0.1" + spdx-correct@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" @@ -4041,9 +4525,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.10" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz#0d9becccde7003d6c658d487dd48a32f0bf3014b" - integrity sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA== + version "3.0.11" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" + integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== split@^1.0.1: version "1.0.1" @@ -4055,7 +4539,7 @@ split@^1.0.1: sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== stack-utils@^2.0.2: version "2.0.5" @@ -4071,18 +4555,10 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -"statuses@>= 1.5.0 < 2": - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" @@ -4102,21 +4578,23 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" + define-properties "^1.1.4" + es-abstract "^1.19.5" string_decoder@^1.1.1: version "1.3.0" @@ -4125,13 +4603,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -4149,37 +4620,30 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== strip-hex-prefix@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== dependencies: is-hex-prefixed "1.0.0" -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -4201,32 +4665,45 @@ supports-color@^7.1.0, supports-color@^7.2.0: dependencies: has-flag "^4.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + table@^6.0.9: - version "6.7.2" - resolved "https://registry.yarnpkg.com/table/-/table-6.7.2.tgz#a8d39b9f5966693ca8b0feba270a78722cbaf3b0" - integrity sha512-UFZK67uvyNivLeQbVtkiUs8Uuuxv24aSL4/Vil2PJVtMgU8Lx0CYkP12uCGa3kjyQzOSgV1+z9Wkb82fCGsO0g== + version "6.8.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" + integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== dependencies: ajv "^8.0.1" - lodash.clonedeep "^4.5.0" lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.3" strip-ansi "^6.0.1" +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== throat@^4.0.0, throat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo= + integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== tmp@0.0.33: version "0.0.33" @@ -4242,6 +4719,11 @@ tmp@^0.2.1: dependencies: rimraf "^3.0.0" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4249,45 +4731,22 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -toidentifier@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== "true-case-path@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== -ts-node@^10.3.0: - version "10.3.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.3.0.tgz#a797f2ed3ff50c9a5d814ce400437cb0c1c048b4" - integrity sha512-RYIy3i8IgpFH45AX4fQHExrT8BxDeKTdC83QFJkNzkvt8uFB6QJ8XMyhynYiKMLxt9a7yuXaDBZNOYS3XjDcYw== - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - yn "3.1.1" - -ts-node@^10.4.0: - version "10.4.0" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" - integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== +ts-node@10.8.1, ts-node@^10.3.0: + version "10.8.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" + integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== dependencies: - "@cspotcode/source-map-support" "0.7.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" @@ -4298,16 +4757,17 @@ ts-node@^10.4.0: create-require "^1.1.0" diff "^4.0.1" make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" yn "3.1.1" tsconfig-paths@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" - integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@^1.8.1, tslib@^1.9.3: @@ -4318,7 +4778,7 @@ tslib@^1.8.1, tslib@^1.9.3: tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha1-4igPXoF/i/QnVlf9D5rr1E9aJ4Y= + integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== tsutils@^3.21.0: version "3.21.0" @@ -4327,7 +4787,7 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" -tweetnacl-util@^0.15.0: +tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== @@ -4369,21 +4829,38 @@ type-fest@^0.7.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typescript@^4.4.3, typescript@^4.4.4: - version "4.4.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.4.4.tgz#2cd01a1a1f160704d3101fd5a58ff0f9fcb8030c" - integrity sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA== +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== -unbox-primitive@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" + is-typedarray "^1.0.0" + +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici@^5.4.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.5.1.tgz#baaf25844a99eaa0b22e1ef8d205bffe587c8f43" + integrity sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -4397,7 +4874,7 @@ universalify@^2.0.0: unpipe@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== uri-js@^4.2.2: version "4.4.1" @@ -4409,23 +4886,17 @@ uri-js@^4.2.2: util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== -util.promisify@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" - integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - for-each "^0.3.3" - has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.1" +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== v8-compile-cache@^2.0.3: version "2.3.0" @@ -4440,19 +4911,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -4467,14 +4925,7 @@ which-boxed-primitive@^1.0.2: which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@1.3.1, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" + integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which@2.0.2, which@^2.0.1: version "2.0.2" @@ -4483,12 +4934,12 @@ which@2.0.2, which@^2.0.1: dependencies: isexe "^2.0.0" -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== dependencies: - string-width "^1.0.2 || 2" + isexe "^2.0.0" widest-line@^3.1.0: version "3.1.0" @@ -4502,10 +4953,10 @@ word-wrap@^1.2.3: resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== -workerpool@6.1.5: - version "6.1.5" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" - integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== +workerpool@6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" + integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== wrap-ansi@^5.1.0: version "5.1.0" @@ -4537,7 +4988,17 @@ wrap-ansi@^7.0.0: wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" ws@7.4.6: version "7.4.6" @@ -4545,9 +5006,9 @@ ws@7.4.6: integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== ws@^7, ws@^7.4.6, ws@^7.5.5: - version "7.5.5" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" - integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== + version "7.5.8" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" + integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== wsrun@^5.2.4: version "5.2.4" @@ -4589,7 +5050,12 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@13.1.2, yargs-parser@^13.1.2: +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + +yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -4597,25 +5063,19 @@ yargs-parser@13.1.2, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -4626,7 +5086,20 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yargs@^13.0.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -4642,18 +5115,22 @@ yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: y18n "^4.0.0" yargs-parser "^13.1.2" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" yn@3.1.1: version "3.1.1" From 16213415a6664372f477319fa66d34fd11aa2be5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 23 Jun 2022 15:58:22 +0100 Subject: [PATCH 0022/1302] refactor(core): separate out into subfolders Move classes out into separate files under subfolders, including: * bindings * executors * journal * modules * services --- packages/core/.nycrc | 8 +- .../core/src/bindings/InternalCallBinding.ts | 30 ++ .../src/bindings/InternalContractBinding.ts | 31 ++ .../src/{bindings.ts => bindings/types.ts} | 71 +---- packages/core/src/bindings/utils.ts | 15 + packages/core/src/deployment-state.ts | 5 +- packages/core/src/execution-engine.ts | 19 +- packages/core/src/executors.ts | 300 ------------------ packages/core/src/executors/CallExecutor.ts | 102 ++++++ .../core/src/executors/ContractExecutor.ts | 80 +++++ packages/core/src/executors/executors.ts | 124 ++++++++ packages/core/src/index.ts | 18 +- .../{journal.ts => journal/FileJournal.ts} | 88 +---- packages/core/src/journal/InMemoryJournal.ts | 61 ++++ packages/core/src/journal/types.ts | 29 ++ packages/core/src/modules.ts | 256 --------------- packages/core/src/modules/ExecutionGraph.ts | 75 +++++ packages/core/src/modules/IgnitionModule.ts | 42 +++ .../core/src/modules/ModuleBuilderImpl.ts | 105 ++++++ packages/core/src/modules/buildModule.ts | 8 + packages/core/src/modules/types.ts | 41 +++ .../core/src/services/ArtifactsService.ts | 13 + .../ContractsService.ts} | 59 +--- .../core/src/services/TransactionsService.ts | 17 + packages/core/src/services/types.ts | 16 + packages/core/src/tx-sender.ts | 2 +- packages/core/test/dag.ts | 2 +- packages/core/test/execution-engine.ts | 4 +- packages/core/test/helpers.ts | 4 +- packages/core/test/tx-sender.ts | 4 +- 30 files changed, 838 insertions(+), 791 deletions(-) create mode 100644 packages/core/src/bindings/InternalCallBinding.ts create mode 100644 packages/core/src/bindings/InternalContractBinding.ts rename packages/core/src/{bindings.ts => bindings/types.ts} (60%) create mode 100644 packages/core/src/bindings/utils.ts delete mode 100644 packages/core/src/executors.ts create mode 100644 packages/core/src/executors/CallExecutor.ts create mode 100644 packages/core/src/executors/ContractExecutor.ts create mode 100644 packages/core/src/executors/executors.ts rename packages/core/src/{journal.ts => journal/FileJournal.ts} (50%) create mode 100644 packages/core/src/journal/InMemoryJournal.ts create mode 100644 packages/core/src/journal/types.ts delete mode 100644 packages/core/src/modules.ts create mode 100644 packages/core/src/modules/ExecutionGraph.ts create mode 100644 packages/core/src/modules/IgnitionModule.ts create mode 100644 packages/core/src/modules/ModuleBuilderImpl.ts create mode 100644 packages/core/src/modules/buildModule.ts create mode 100644 packages/core/src/modules/types.ts create mode 100644 packages/core/src/services/ArtifactsService.ts rename packages/core/src/{services.ts => services/ContractsService.ts} (80%) create mode 100644 packages/core/src/services/TransactionsService.ts create mode 100644 packages/core/src/services/types.ts diff --git a/packages/core/.nycrc b/packages/core/.nycrc index d815dfe758..125d1c9dec 100644 --- a/packages/core/.nycrc +++ b/packages/core/.nycrc @@ -1,10 +1,10 @@ { "extends": "@istanbuljs/nyc-config-typescript", "check-coverage": true, - "statements": 45, - "branches": 30, - "functions": 50, - "lines": 45, + "statements": 35, + "branches": 25, + "functions": 38, + "lines": 35, "all": true, "include": [ "src/**/*.ts" diff --git a/packages/core/src/bindings/InternalCallBinding.ts b/packages/core/src/bindings/InternalCallBinding.ts new file mode 100644 index 0000000000..b2fd993082 --- /dev/null +++ b/packages/core/src/bindings/InternalCallBinding.ts @@ -0,0 +1,30 @@ +import { Tx } from "../types"; + +import { InternalBinding, CallOptions, Unflattened } from "./types"; +import { deepFlatten } from "./utils"; + +export class InternalCallBinding extends InternalBinding { + public getDependencies(): InternalBinding[] { + const mapToBindings = (x: unknown): Unflattened => { + if (Array.isArray(x)) { + return x.map(mapToBindings); + } + + if (InternalBinding.isBinding(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToBindings); + } + + return []; + }; + + const dependencies = deepFlatten( + mapToBindings([this.input.contract, ...this.input.args]) + ); + + return dependencies; + } +} diff --git a/packages/core/src/bindings/InternalContractBinding.ts b/packages/core/src/bindings/InternalContractBinding.ts new file mode 100644 index 0000000000..77ce7010ab --- /dev/null +++ b/packages/core/src/bindings/InternalContractBinding.ts @@ -0,0 +1,31 @@ +import { Contract } from "../types"; + +import { InternalBinding, ContractOptions, Unflattened } from "./types"; +import { deepFlatten } from "./utils"; + +export class InternalContractBinding extends InternalBinding< + ContractOptions, + Contract +> { + public getDependencies(): InternalBinding[] { + const mapToBindings = (x: unknown): Unflattened => { + if (Array.isArray(x)) { + return x.map(mapToBindings); + } + + if (InternalBinding.isBinding(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToBindings); + } + + return []; + }; + + const dependencies = deepFlatten(mapToBindings(this.input.args)); + + return dependencies; + } +} diff --git a/packages/core/src/bindings.ts b/packages/core/src/bindings/types.ts similarity index 60% rename from packages/core/src/bindings.ts rename to packages/core/src/bindings/types.ts index 09c383a460..7b9facfbc1 100644 --- a/packages/core/src/bindings.ts +++ b/packages/core/src/bindings/types.ts @@ -1,4 +1,4 @@ -import { Contract, Tx } from "./types"; +import { Contract, Tx } from "../types"; export type BindingOutput = string | number | Contract | Tx; @@ -81,74 +81,7 @@ export type AddressLike = Bindable | Binding; export class ContractBinding extends Binding {} export class CallBinding extends Binding {} -type Unflattened = T[] | Array>; - -function deepFlatten(array: Unflattened): T[] { - let result: T[] = []; - - array.forEach((elem) => { - if (Array.isArray(elem)) { - result = result.concat(deepFlatten(elem)); - } else { - result.push(elem); - } - }); - - return result; -} - -export class InternalContractBinding extends InternalBinding< - ContractOptions, - Contract -> { - public getDependencies(): InternalBinding[] { - const mapToBindings = (x: unknown): Unflattened => { - if (Array.isArray(x)) { - return x.map(mapToBindings); - } - - if (InternalBinding.isBinding(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToBindings); - } - - return []; - }; - - const dependencies = deepFlatten(mapToBindings(this.input.args)); - - return dependencies; - } -} - -export class InternalCallBinding extends InternalBinding { - public getDependencies(): InternalBinding[] { - const mapToBindings = (x: unknown): Unflattened => { - if (Array.isArray(x)) { - return x.map(mapToBindings); - } - - if (InternalBinding.isBinding(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToBindings); - } - - return []; - }; - - const dependencies = deepFlatten( - mapToBindings([this.input.contract, ...this.input.args]) - ); - - return dependencies; - } -} +export type Unflattened = T[] | Array>; export type Resolved = T extends Binding ? O diff --git a/packages/core/src/bindings/utils.ts b/packages/core/src/bindings/utils.ts new file mode 100644 index 0000000000..5a33ec1f41 --- /dev/null +++ b/packages/core/src/bindings/utils.ts @@ -0,0 +1,15 @@ +import { Unflattened } from "./types"; + +export function deepFlatten(array: Unflattened): T[] { + let result: T[] = []; + + array.forEach((elem) => { + if (Array.isArray(elem)) { + result = result.concat(deepFlatten(elem)); + } else { + result.push(elem); + } + }); + + return result; +} diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index 702ecd4745..f3b6c3620f 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -3,8 +3,9 @@ import { ModuleResult, serializeBindingOutput, SerializedModuleResult, -} from "./bindings"; -import { ExecutionGraph, IgnitionModule } from "./modules"; +} from "./bindings/types"; +import { ExecutionGraph } from "./modules/ExecutionGraph"; +import { IgnitionModule } from "./modules/IgnitionModule"; export class DeploymentState { private _modules: Map = new Map(); diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 29e2a86f2d..606f1a7c6b 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -6,19 +6,18 @@ import { ModuleResult, SerializedDeploymentResult, SerializedModuleResult, -} from "./bindings"; +} from "./bindings/types"; import { DeploymentState } from "./deployment-state"; -import { Journal } from "./journal"; -import { ExecutionGraph, IgnitionModule } from "./modules"; +import { Journal } from "./journal/types"; +import { ExecutionGraph } from "./modules/ExecutionGraph"; +import { IgnitionModule } from "./modules/IgnitionModule"; import { Providers } from "./providers"; -import { - ArtifactsService, - ContractsService, - UiService, - Services, - TransactionsService, -} from "./services"; +import { ArtifactsService } from "./services/ArtifactsService"; +import { ContractsService } from "./services/ContractsService"; +import { TransactionsService } from "./services/TransactionsService"; +import type { Services } from "./services/types"; import { TxSender } from "./tx-sender"; +import { UiService } from "./ui/ui-service"; import { sleep } from "./utils"; export interface IgnitionModulesResults { diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts deleted file mode 100644 index 2b461f5459..0000000000 --- a/packages/core/src/executors.ts +++ /dev/null @@ -1,300 +0,0 @@ -import setupDebug, { IDebugger } from "debug"; -import { ethers } from "ethers"; - -import { - BindingOutput, - CallOptions, - ContractOptions, - InternalBinding, - InternalContractBinding, - Resolved, -} from "./bindings"; -import { BindingState } from "./deployment-state"; -import { Services } from "./services"; -import { Contract, Tx } from "./types"; - -/** - * An instance of this class is thrown to indicate that the executor is waiting - * for some external event to happen, like a multisig that needs extra - * confirmations or a timelocked contract. - */ -export class Hold { - constructor(public readonly reason: string) {} -} - -export abstract class Executor { - private _dummyInput!: I; - private _dummyOutput!: O; - private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; - private result?: any; - private error?: any; - private holdReason?: string; - private _debug: IDebugger; - - constructor(public readonly binding: InternalBinding) { - const moduleId = binding.moduleId; - const bindingId = binding.id; - this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); - } - - abstract execute(input: Resolved, services: Services): Promise; - abstract validate(input: I, services: Services): Promise; - abstract getDescription(): string; - - public async run( - input: Resolved, - services: Services, - onStateChange: (newState: BindingState) => void - ) { - try { - this._debug("Start running"); - this._setRunning(); - onStateChange(BindingState.running()); - const result = await this.execute(input, services); - this._debug("Ended successfully"); - this._setSuccess(result); - onStateChange(BindingState.success(result)); - } catch (e: any) { - if (e instanceof Hold) { - this._debug("Ended with hold"); - this._setHold(e.reason); - onStateChange(BindingState.hold(e.reason)); - } else { - this._debug("Ended with error"); - this._setFailure(e); - onStateChange(BindingState.failure(e)); - } - } - } - - public isReady() { - return this.state === "ready"; - } - - public isRunning() { - return this.state === "running"; - } - - public isHold() { - return this.state === "hold"; - } - - public getHoldReason(): string { - if (this.holdReason === undefined) { - throw new Error( - `[executor ${this.binding.id}] assertion error: no hold reason` - ); - } - - return this.holdReason; - } - - public isSuccess() { - return this.state === "success"; - } - - public getResult() { - if (this.result === undefined) { - throw new Error( - `[executor ${this.binding.id}] assertion error: no result` - ); - } - - return this.result; - } - - public isFailure() { - return this.state === "failure"; - } - - public getError() { - if (this.error === undefined) { - throw new Error("assertion error"); - } - - return this.error; - } - - private _setRunning() { - this.state = "running"; - } - private _setHold(reason: string) { - this.state = "hold"; - this.holdReason = reason; - } - private _setSuccess(result: any) { - this.state = "success"; - this.result = result; - } - private _setFailure(err: Error) { - this.state = "failure"; - this.error = err; - } -} - -export class ContractExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const { contractName } = input; - const artifact = await services.artifacts.getArtifact(contractName); - - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; - - const args = input.args.map(mapToAddress); - const txHash = await services.contracts.deploy(artifact, args); - - const receipt = await services.transactions.wait(txHash); - - return { - name: contractName, - abi: artifact.abi, - address: receipt.contractAddress, - bytecode: artifact.bytecode, - }; - } - - public async validate( - input: ContractOptions, - services: Services - ): Promise { - const artifactExists = await services.artifacts.hasArtifact( - input.contractName - ); - - if (!artifactExists) { - return [`Artifact with name '${input.contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(input.contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return [ - `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - ]; - } - - return []; - } - - public getDescription() { - return `Deploy contract ${this.binding.input.contractName}`; - } -} - -export class CallExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const { contract, method } = input; - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; - - const args = input.args.map(mapToAddress); - const txHash = await services.contracts.call( - contract.address, - contract.abi, - method, - args - ); - - await services.transactions.wait(txHash); - - return { - hash: txHash, - }; - } - - public async validate( - input: CallOptions, - services: Services - ): Promise { - const contractName = (input.contract as InternalContractBinding).input - .contractName; - const artifactExists = await services.artifacts.hasArtifact(contractName); - - if (!artifactExists) { - return [`Artifact with name '${contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const functionFragments = iface.fragments.filter( - (f) => f.name === input.method - ); - - if (functionFragments.length === 0) { - return [ - `Contract '${contractName}' doesn't have a function ${input.method}`, - ]; - } - - const matchingFunctionFragments = functionFragments.filter( - (f) => f.inputs.length === argsLength - ); - - if (matchingFunctionFragments.length === 0) { - if (functionFragments.length === 1) { - return [ - `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, - ]; - } else { - return [ - `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, - ]; - } - } - - return []; - } - - public getDescription() { - const contractName = ( - this.binding.input.contract as InternalContractBinding - ).input.contractName; - return `Call method ${this.binding.input.method} in contract ${contractName}`; - } -} diff --git a/packages/core/src/executors/CallExecutor.ts b/packages/core/src/executors/CallExecutor.ts new file mode 100644 index 0000000000..c921f04cad --- /dev/null +++ b/packages/core/src/executors/CallExecutor.ts @@ -0,0 +1,102 @@ +import { ethers } from "ethers"; + +import { InternalContractBinding } from "../bindings/InternalContractBinding"; +import { CallOptions, Resolved } from "../bindings/types"; +import { Services } from "../services/types"; +import { Tx } from "../types"; + +import { Executor } from "./executors"; + +export class CallExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contract, method } = input; + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.call( + contract.address, + contract.abi, + method, + args + ); + + await services.transactions.wait(txHash); + + return { + hash: txHash, + }; + } + + public async validate( + input: CallOptions, + services: Services + ): Promise { + const contractName = (input.contract as InternalContractBinding).input + .contractName; + const artifactExists = await services.artifacts.hasArtifact(contractName); + + if (!artifactExists) { + return [`Artifact with name '${contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const functionFragments = iface.fragments.filter( + (f) => f.name === input.method + ); + + if (functionFragments.length === 0) { + return [ + `Contract '${contractName}' doesn't have a function ${input.method}`, + ]; + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + return [ + `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, + ]; + } else { + return [ + `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, + ]; + } + } + + return []; + } + + public getDescription() { + const contractName = ( + this.binding.input.contract as InternalContractBinding + ).input.contractName; + return `Call method ${this.binding.input.method} in contract ${contractName}`; + } +} diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts new file mode 100644 index 0000000000..8ea5cc3547 --- /dev/null +++ b/packages/core/src/executors/ContractExecutor.ts @@ -0,0 +1,80 @@ +import { ethers } from "ethers"; + +import { ContractOptions, Resolved } from "../bindings/types"; +import { Services } from "../services/types"; +import { Contract } from "../types"; + +import { Executor } from "./executors"; + +export class ContractExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contractName } = input; + const artifact = await services.artifacts.getArtifact(contractName); + + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.deploy(artifact, args); + + const receipt = await services.transactions.wait(txHash); + + return { + name: contractName, + abi: artifact.abi, + address: receipt.contractAddress, + bytecode: artifact.bytecode, + }; + } + + public async validate( + input: ContractOptions, + services: Services + ): Promise { + const artifactExists = await services.artifacts.hasArtifact( + input.contractName + ); + + if (!artifactExists) { + return [`Artifact with name '${input.contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(input.contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return [ + `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + ]; + } + + return []; + } + + public getDescription() { + return `Deploy contract ${this.binding.input.contractName}`; + } +} diff --git a/packages/core/src/executors/executors.ts b/packages/core/src/executors/executors.ts new file mode 100644 index 0000000000..87fbc15e93 --- /dev/null +++ b/packages/core/src/executors/executors.ts @@ -0,0 +1,124 @@ +import setupDebug, { IDebugger } from "debug"; + +import { BindingOutput, InternalBinding, Resolved } from "../bindings/types"; +import { BindingState } from "../deployment-state"; +import { Services } from "../services/types"; + +/** + * An instance of this class is thrown to indicate that the executor is waiting + * for some external event to happen, like a multisig that needs extra + * confirmations or a timelocked contract. + */ +export class Hold { + constructor(public readonly reason: string) {} +} + +export abstract class Executor { + private _dummyInput!: I; + private _dummyOutput!: O; + private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; + private result?: any; + private error?: any; + private holdReason?: string; + private _debug: IDebugger; + + constructor(public readonly binding: InternalBinding) { + const moduleId = binding.moduleId; + const bindingId = binding.id; + this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); + } + + abstract execute(input: Resolved, services: Services): Promise; + abstract validate(input: I, services: Services): Promise; + abstract getDescription(): string; + + public async run( + input: Resolved, + services: Services, + onStateChange: (newState: BindingState) => void + ) { + try { + this._debug("Start running"); + this._setRunning(); + onStateChange(BindingState.running()); + const result = await this.execute(input, services); + this._debug("Ended successfully"); + this._setSuccess(result); + onStateChange(BindingState.success(result)); + } catch (e: any) { + if (e instanceof Hold) { + this._debug("Ended with hold"); + this._setHold(e.reason); + onStateChange(BindingState.hold(e.reason)); + } else { + this._debug("Ended with error"); + this._setFailure(e); + onStateChange(BindingState.failure(e)); + } + } + } + + public isReady() { + return this.state === "ready"; + } + + public isRunning() { + return this.state === "running"; + } + + public isHold() { + return this.state === "hold"; + } + + public getHoldReason(): string { + if (this.holdReason === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no hold reason` + ); + } + + return this.holdReason; + } + + public isSuccess() { + return this.state === "success"; + } + + public getResult() { + if (this.result === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no result` + ); + } + + return this.result; + } + + public isFailure() { + return this.state === "failure"; + } + + public getError() { + if (this.error === undefined) { + throw new Error("assertion error"); + } + + return this.error; + } + + private _setRunning() { + this.state = "running"; + } + private _setHold(reason: string) { + this.state = "hold"; + this.holdReason = reason; + } + private _setSuccess(result: any) { + this.state = "success"; + this.result = result; + } + private _setFailure(err: Error) { + this.state = "failure"; + this.error = err; + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index dce27b976d..8c2b99cef4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,15 +1,15 @@ import setupDebug from "debug"; +import { InternalContractBinding } from "./bindings/InternalContractBinding"; import { AddressLike, ContractBinding, ContractOptions, InternalBinding, - InternalContractBinding, SerializedDeploymentResult, SerializedModuleResult, SerializedBindingResult, -} from "./bindings"; +} from "./bindings/types"; import { DeploymentPlan, DeploymentResult, @@ -17,16 +17,18 @@ import { ExecutionManager, IgnitionModulesResults, } from "./execution-engine"; -import { Executor, Hold } from "./executors"; -import { FileJournal, InMemoryJournal } from "./journal"; -import { ModuleBuilder, ModuleBuilderImpl, UserModule } from "./modules"; +import { Executor, Hold } from "./executors/executors"; +import { FileJournal } from "./journal/FileJournal"; +import { InMemoryJournal } from "./journal/InMemoryJournal"; +import { ModuleBuilderImpl } from "./modules/ModuleBuilderImpl"; +import { ModuleBuilder, UserModule } from "./modules/types"; import { Providers } from "./providers"; -import { Services } from "./services"; +import { Services } from "./services/types"; import { Contract } from "./types"; -export { Binding } from "./bindings"; +export { Binding } from "./bindings/types"; export { DeploymentPlan } from "./execution-engine"; -export { buildModule } from "./modules"; +export { buildModule } from "./modules/buildModule"; export { AddressLike, Contract, diff --git a/packages/core/src/journal.ts b/packages/core/src/journal/FileJournal.ts similarity index 50% rename from packages/core/src/journal.ts rename to packages/core/src/journal/FileJournal.ts index eafcd3c416..1bb10bcaf2 100644 --- a/packages/core/src/journal.ts +++ b/packages/core/src/journal/FileJournal.ts @@ -1,35 +1,7 @@ import setupDebug, { IDebugger } from "debug"; import fsExtra from "fs-extra"; -export interface JournalEntry { - txHash: string; - blockNumberWhenSent: number; -} - -/** - * A journal keeps track of all the transactions sent during a deployment. If a - * deployment is interrupted and resumed later for any reason, the journal can - * then be used to avoid re-sending transactions if possible. - */ -export interface Journal { - addEntry( - moduleId: string, - executorId: string, - entry: JournalEntry - ): Promise; - getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise; - replaceEntry( - moduleId: string, - executorId: string, - entryIndex: number, - entry: JournalEntry - ): Promise; - delete(moduleId: string): Promise; -} +import { Journal, JournalEntry } from "./types"; export class FileJournal implements Journal { private _log: IDebugger = setupDebug("ignition:journal:file-journal"); @@ -121,61 +93,3 @@ export class FileJournal implements Journal { } } } - -export class InMemoryJournal implements Journal { - private _log: debug.IDebugger = setupDebug( - "ignition:journal:in-memory-journal" - ); - private _journal: Map> = new Map(); - - public async addEntry( - moduleId: string, - executorId: string, - journalEntry: JournalEntry - ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); - - const moduleEntry: Map = - this._journal.get(moduleId) ?? new Map(); - const executorEntries = moduleEntry.get(executorId) ?? []; - - executorEntries.push(journalEntry); - - moduleEntry.set(executorId, executorEntries); - this._journal.set(moduleId, moduleEntry); - - return executorEntries.length - 1; - } - - public async getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); - - return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; - } - - public async replaceEntry( - moduleId: string, - executorId: string, - txIndex: number, - entryIndex: JournalEntry - ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); - - const transactions = this._journal.get(moduleId)?.get(executorId); - if (transactions === undefined || transactions[txIndex] === undefined) { - throw new Error(`Assertion error: replacing non-existent transaction`); - } - - transactions[txIndex] = entryIndex; - } - - public async delete(moduleId: string) { - this._log(`Deleting module ${moduleId}`); - - this._journal.delete(moduleId); - } -} diff --git a/packages/core/src/journal/InMemoryJournal.ts b/packages/core/src/journal/InMemoryJournal.ts new file mode 100644 index 0000000000..7940340373 --- /dev/null +++ b/packages/core/src/journal/InMemoryJournal.ts @@ -0,0 +1,61 @@ +import setupDebug from "debug"; + +import { Journal, JournalEntry } from "./types"; + +export class InMemoryJournal implements Journal { + private _log: debug.IDebugger = setupDebug( + "ignition:journal:in-memory-journal" + ); + private _journal: Map> = new Map(); + + public async addEntry( + moduleId: string, + executorId: string, + journalEntry: JournalEntry + ): Promise { + this._log(`Adding entry to ${moduleId}/${executorId}`); + + const moduleEntry: Map = + this._journal.get(moduleId) ?? new Map(); + const executorEntries = moduleEntry.get(executorId) ?? []; + + executorEntries.push(journalEntry); + + moduleEntry.set(executorId, executorEntries); + this._journal.set(moduleId, moduleEntry); + + return executorEntries.length - 1; + } + + public async getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise { + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + + return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; + } + + public async replaceEntry( + moduleId: string, + executorId: string, + txIndex: number, + entryIndex: JournalEntry + ): Promise { + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + + const transactions = this._journal.get(moduleId)?.get(executorId); + if (transactions === undefined || transactions[txIndex] === undefined) { + throw new Error(`Assertion error: replacing non-existent transaction`); + } + + transactions[txIndex] = entryIndex; + } + + public async delete(moduleId: string) { + this._log(`Deleting module ${moduleId}`); + + this._journal.delete(moduleId); + } +} diff --git a/packages/core/src/journal/types.ts b/packages/core/src/journal/types.ts new file mode 100644 index 0000000000..f990b339a1 --- /dev/null +++ b/packages/core/src/journal/types.ts @@ -0,0 +1,29 @@ +export interface JournalEntry { + txHash: string; + blockNumberWhenSent: number; +} + +/** + * A journal keeps track of all the transactions sent during a deployment. If a + * deployment is interrupted and resumed later for any reason, the journal can + * then be used to avoid re-sending transactions if possible. + */ +export interface Journal { + addEntry( + moduleId: string, + executorId: string, + entry: JournalEntry + ): Promise; + getEntry( + moduleId: string, + executorId: string, + entryIndex: number + ): Promise; + replaceEntry( + moduleId: string, + executorId: string, + entryIndex: number, + entry: JournalEntry + ): Promise; + delete(moduleId: string): Promise; +} diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts deleted file mode 100644 index 3e0257fccd..0000000000 --- a/packages/core/src/modules.ts +++ /dev/null @@ -1,256 +0,0 @@ -import { - Bindable, - CallBinding, - CallOptions, - ContractBinding, - ContractOptions, - InternalBinding, - InternalCallBinding, - InternalContractBinding, -} from "./bindings"; -import { CallExecutor, ContractExecutor, Executor } from "./executors"; -import { Contract, Tx } from "./types"; - -export class IgnitionModule { - constructor(public readonly id: string, private _executors: Executor[]) {} - - public getSortedExecutors(): Executor[] { - const dependencies = new Map>(); - - for (const executor of this._executors) { - const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); - - for (const executorDependency of executor.binding.getDependencies()) { - if (executorDependency.moduleId === executor.binding.moduleId) { - executorDependencies.add(executorDependency.id); - } - } - - dependencies.set(executor.binding.id, executorDependencies); - } - - const added = new Set(); - const sortedExecutors: Executor[] = []; - - while (added.size < this._executors.length) { - for (const executor of this._executors) { - if (added.has(executor.binding.id)) { - continue; - } - - const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); - if ([...executorDependencies].every((d) => added.has(d))) { - sortedExecutors.push(executor); - added.add(executor.binding.id); - } - } - } - - return sortedExecutors; - } -} - -export class ExecutionGraph { - private _modules: Map> = new Map(); - private _dependencies: Map> = new Map(); - - public addExecutor(executor: Executor) { - const moduleId = executor.binding.moduleId; - let executorsMap = this._modules.get(moduleId); - if (executorsMap === undefined) { - executorsMap = new Map(); - this._modules.set(moduleId, executorsMap); - } - - if (executorsMap.has(executor.binding.id)) { - throw new Error(`Executor with id ${executor.binding.id} already exists`); - } - - const dependencies = executor.binding.getDependencies(); - for (const dependency of dependencies) { - this._addDependency(moduleId, dependency.moduleId); - } - - executorsMap.set(executor.binding.id, executor); - } - - public getModule(moduleId: string): IgnitionModule | undefined { - const executorsMap = this._modules.get(moduleId); - if (executorsMap === undefined) { - return undefined; - } - - return new IgnitionModule(moduleId, [...executorsMap.values()]); - } - - public getSortedModules(): IgnitionModule[] { - const added = new Set(); - const ignitionModules = this._getModules(); - const sortedModules: IgnitionModule[] = []; - - while (added.size < ignitionModules.length) { - for (const ignitionModule of ignitionModules) { - if (added.has(ignitionModule.id)) { - continue; - } - - const dependencies = - this._dependencies.get(ignitionModule.id) ?? new Set(); - if ([...dependencies].every((d) => added.has(d))) { - sortedModules.push(ignitionModule); - added.add(ignitionModule.id); - } - } - } - - return sortedModules; - } - - private _addDependency(moduleId: string, dependencyModuleId: string) { - if (moduleId !== dependencyModuleId) { - const dependencies = - this._dependencies.get(moduleId) ?? new Set(); - dependencies.add(dependencyModuleId); - this._dependencies.set(moduleId, dependencies); - } - } - - private _getModules(): IgnitionModule[] { - return [...this._modules.entries()].map( - ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) - ); - } -} - -interface UserContractOptions { - id?: string; - args?: Array>; -} - -interface UserCallOptions { - id?: string; - args?: Array>; -} - -export interface ModuleBuilder { - getModuleId: () => string; - addExecutor: (executor: Executor) => void; - - contract: ( - contractName: string, - options?: UserContractOptions - ) => ContractBinding; - - call: ( - contract: ContractBinding, - method: string, - options?: UserCallOptions - ) => CallBinding; - - useModule: (userModule: UserModule) => T; -} - -export class ModuleBuilderImpl implements ModuleBuilder { - private _currentModuleId: string | undefined; - private _executionGraph = new ExecutionGraph(); - private _executors: Executor[] = []; - private _knownModules: Map, any]> = new Map(); - - constructor() {} - - public getModuleId(): string { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); - } - - return this._currentModuleId; - } - - public buildExecutionGraph(): ExecutionGraph { - return this._executionGraph; - } - - public addExecutor(executor: Executor) { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); - } - - this._executionGraph.addExecutor(executor); - } - - public contract( - contractName: string, - options?: UserContractOptions - ): InternalBinding { - const id = options?.id ?? contractName; - const args = options?.args ?? []; - const b = new InternalContractBinding(this.getModuleId(), id, { - contractName, - args, - }); - - this.addExecutor(new ContractExecutor(b)); - - return b; - } - - public call( - contract: ContractBinding, - method: string, - options?: UserCallOptions - ): InternalBinding { - const id = - options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; - const args = options?.args ?? []; - const b = new InternalCallBinding(this.getModuleId(), id, { - contract, - method, - args, - }); - - this.addExecutor(new CallExecutor(b)); - - return b; - } - - public useModule(userModule: UserModule): T { - const knownModuleAndOutput = this._knownModules.get(userModule.id); - if (knownModuleAndOutput !== undefined) { - const [knownModule, knownOutput] = knownModuleAndOutput; - if (userModule === knownModule) { - return knownOutput; - } else { - throw new Error(`Module with id ${userModule.id} already exists`); - } - } - - const previousModuleId = this._currentModuleId; - this._currentModuleId = userModule.id; - const output = userModule.definition(this); - this._currentModuleId = previousModuleId; - - this._knownModules.set(userModule.id, [userModule, output]); - - return output; - } -} - -type ModuleDefinition = (m: ModuleBuilder) => T; - -export class UserModule { - public readonly version = 1; - - constructor( - public readonly id: string, - public readonly definition: ModuleDefinition - ) {} -} - -export function buildModule( - moduleId: string, - moduleDefinition: ModuleDefinition -): UserModule { - return new UserModule(moduleId, moduleDefinition); -} diff --git a/packages/core/src/modules/ExecutionGraph.ts b/packages/core/src/modules/ExecutionGraph.ts new file mode 100644 index 0000000000..eb53c87b1f --- /dev/null +++ b/packages/core/src/modules/ExecutionGraph.ts @@ -0,0 +1,75 @@ +import { Executor } from "../executors/executors"; + +import { IgnitionModule } from "./IgnitionModule"; + +export class ExecutionGraph { + private _modules: Map> = new Map(); + private _dependencies: Map> = new Map(); + + public addExecutor(executor: Executor) { + const moduleId = executor.binding.moduleId; + let executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + executorsMap = new Map(); + this._modules.set(moduleId, executorsMap); + } + + if (executorsMap.has(executor.binding.id)) { + throw new Error(`Executor with id ${executor.binding.id} already exists`); + } + + const dependencies = executor.binding.getDependencies(); + for (const dependency of dependencies) { + this._addDependency(moduleId, dependency.moduleId); + } + + executorsMap.set(executor.binding.id, executor); + } + + public getModule(moduleId: string): IgnitionModule | undefined { + const executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + return undefined; + } + + return new IgnitionModule(moduleId, [...executorsMap.values()]); + } + + public getSortedModules(): IgnitionModule[] { + const added = new Set(); + const ignitionModules = this._getModules(); + const sortedModules: IgnitionModule[] = []; + + while (added.size < ignitionModules.length) { + for (const ignitionModule of ignitionModules) { + if (added.has(ignitionModule.id)) { + continue; + } + + const dependencies = + this._dependencies.get(ignitionModule.id) ?? new Set(); + if ([...dependencies].every((d) => added.has(d))) { + sortedModules.push(ignitionModule); + added.add(ignitionModule.id); + } + } + } + + return sortedModules; + } + + private _addDependency(moduleId: string, dependencyModuleId: string) { + if (moduleId !== dependencyModuleId) { + const dependencies = + this._dependencies.get(moduleId) ?? new Set(); + dependencies.add(dependencyModuleId); + this._dependencies.set(moduleId, dependencies); + } + } + + private _getModules(): IgnitionModule[] { + return [...this._modules.entries()].map( + ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) + ); + } +} diff --git a/packages/core/src/modules/IgnitionModule.ts b/packages/core/src/modules/IgnitionModule.ts new file mode 100644 index 0000000000..e9c7efaf2d --- /dev/null +++ b/packages/core/src/modules/IgnitionModule.ts @@ -0,0 +1,42 @@ +import { Executor } from "../executors/executors"; + +export class IgnitionModule { + constructor(public readonly id: string, private _executors: Executor[]) {} + + public getSortedExecutors(): Executor[] { + const dependencies = new Map>(); + + for (const executor of this._executors) { + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + + for (const executorDependency of executor.binding.getDependencies()) { + if (executorDependency.moduleId === executor.binding.moduleId) { + executorDependencies.add(executorDependency.id); + } + } + + dependencies.set(executor.binding.id, executorDependencies); + } + + const added = new Set(); + const sortedExecutors: Executor[] = []; + + while (added.size < this._executors.length) { + for (const executor of this._executors) { + if (added.has(executor.binding.id)) { + continue; + } + + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + if ([...executorDependencies].every((d) => added.has(d))) { + sortedExecutors.push(executor); + added.add(executor.binding.id); + } + } + } + + return sortedExecutors; + } +} diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts new file mode 100644 index 0000000000..21edba80e5 --- /dev/null +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -0,0 +1,105 @@ +import { InternalCallBinding } from "../bindings/InternalCallBinding"; +import { InternalContractBinding } from "../bindings/InternalContractBinding"; +import { + CallOptions, + ContractBinding, + ContractOptions, + InternalBinding, +} from "../bindings/types"; +import { CallExecutor } from "../executors/CallExecutor"; +import { ContractExecutor } from "../executors/ContractExecutor"; +import { Executor } from "../executors/executors"; +import { Contract, Tx } from "../types"; + +import { ExecutionGraph } from "./ExecutionGraph"; +import { + ModuleBuilder, + UserModule, + UserContractOptions, + UserCallOptions, +} from "./types"; + +export class ModuleBuilderImpl implements ModuleBuilder { + private _currentModuleId: string | undefined; + private _executionGraph = new ExecutionGraph(); + private _executors: Executor[] = []; + private _knownModules: Map, any]> = new Map(); + + constructor() {} + + public getModuleId(): string { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + return this._currentModuleId; + } + + public buildExecutionGraph(): ExecutionGraph { + return this._executionGraph; + } + + public addExecutor(executor: Executor) { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + this._executionGraph.addExecutor(executor); + } + + public contract( + contractName: string, + options?: UserContractOptions + ): InternalBinding { + const id = options?.id ?? contractName; + const args = options?.args ?? []; + const b = new InternalContractBinding(this.getModuleId(), id, { + contractName, + args, + }); + + this.addExecutor(new ContractExecutor(b)); + + return b; + } + + public call( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ): InternalBinding { + const id = + options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; + const args = options?.args ?? []; + const b = new InternalCallBinding(this.getModuleId(), id, { + contract, + method, + args, + }); + + this.addExecutor(new CallExecutor(b)); + + return b; + } + + public useModule(userModule: UserModule): T { + const knownModuleAndOutput = this._knownModules.get(userModule.id); + if (knownModuleAndOutput !== undefined) { + const [knownModule, knownOutput] = knownModuleAndOutput; + if (userModule === knownModule) { + return knownOutput; + } else { + throw new Error(`Module with id ${userModule.id} already exists`); + } + } + + const previousModuleId = this._currentModuleId; + this._currentModuleId = userModule.id; + const output = userModule.definition(this); + this._currentModuleId = previousModuleId; + + this._knownModules.set(userModule.id, [userModule, output]); + + return output; + } +} diff --git a/packages/core/src/modules/buildModule.ts b/packages/core/src/modules/buildModule.ts new file mode 100644 index 0000000000..9c53516bfe --- /dev/null +++ b/packages/core/src/modules/buildModule.ts @@ -0,0 +1,8 @@ +import { ModuleDefinition, UserModule } from "./types"; + +export function buildModule( + moduleId: string, + moduleDefinition: ModuleDefinition +): UserModule { + return new UserModule(moduleId, moduleDefinition); +} diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts new file mode 100644 index 0000000000..07fde9ded9 --- /dev/null +++ b/packages/core/src/modules/types.ts @@ -0,0 +1,41 @@ +import { Bindable, CallBinding, ContractBinding } from "../bindings/types"; +import { Executor } from "../executors/executors"; + +export interface UserContractOptions { + id?: string; + args?: Array>; +} + +export interface UserCallOptions { + id?: string; + args?: Array>; +} + +export interface ModuleBuilder { + getModuleId: () => string; + addExecutor: (executor: Executor) => void; + + contract: ( + contractName: string, + options?: UserContractOptions + ) => ContractBinding; + + call: ( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ) => CallBinding; + + useModule: (userModule: UserModule) => T; +} + +export type ModuleDefinition = (m: ModuleBuilder) => T; + +export class UserModule { + public readonly version = 1; + + constructor( + public readonly id: string, + public readonly definition: ModuleDefinition + ) {} +} diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts new file mode 100644 index 0000000000..e542db88aa --- /dev/null +++ b/packages/core/src/services/ArtifactsService.ts @@ -0,0 +1,13 @@ +import { Providers } from "../providers"; +import { Artifact } from "../types"; + +export class ArtifactsService { + constructor(private readonly _providers: Providers) {} + + public getArtifact(name: string): Promise { + return this._providers.artifacts.getArtifact(name); + } + public hasArtifact(name: string): Promise { + return this._providers.artifacts.hasArtifact(name); + } +} diff --git a/packages/core/src/services.ts b/packages/core/src/services/ContractsService.ts similarity index 80% rename from packages/core/src/services.ts rename to packages/core/src/services/ContractsService.ts index 3d9ded1a39..875e0c8af8 100644 --- a/packages/core/src/services.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,18 +1,12 @@ import setupDebug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; -import { IgnitionSigner, Providers } from "./providers"; -import { TxSender } from "./tx-sender"; -import { Artifact } from "./types"; -import { UiService } from "./ui/ui-service"; -import { sleep } from "./utils"; +import { IgnitionSigner, Providers } from "../providers"; +import { TxSender } from "../tx-sender"; +import { Artifact } from "../types"; +import { sleep } from "../utils"; -export { UiService }; - -interface TransactionOptions { - gasLimit?: ethers.BigNumberish; - gasPrice?: ethers.BigNumberish; -} +import type { TransactionOptions } from "./types"; export class ContractsService { private _debug = setupDebug("ignition:services:contracts-service"); @@ -161,8 +155,8 @@ export class ContractsService { if (previousTx.gasPrice !== undefined) { // Increase 10%, and add 1 to be sure it's at least rounded up const newGasPrice = ethers.BigNumber.from(previousTx.gasPrice) - .mul(110_000) - .div(100_000) + .mul(110000) + .div(100000) .add(1); return { @@ -177,15 +171,15 @@ export class ContractsService { previousTx.maxPriorityFeePerGas !== undefined ) { const newMaxFeePerGas = ethers.BigNumber.from(previousTx.maxFeePerGas) - .mul(110_000) - .div(100_000) + .mul(110000) + .div(100000) .add(1); const newMaxPriorityFeePerGas = ethers.BigNumber.from( previousTx.maxPriorityFeePerGas ) - .mul(110_000) - .div(100_000) + .mul(110000) + .div(100000) .add(1); return { @@ -201,34 +195,3 @@ export class ContractsService { ); } } - -export class ArtifactsService { - constructor(private readonly _providers: Providers) {} - - public getArtifact(name: string): Promise { - return this._providers.artifacts.getArtifact(name); - } - public hasArtifact(name: string): Promise { - return this._providers.artifacts.hasArtifact(name); - } -} - -export class TransactionsService { - constructor(private readonly _providers: Providers) {} - - public async wait( - txHash: string - ): Promise { - const provider = new ethers.providers.Web3Provider( - this._providers.ethereumProvider - ); - - return provider.waitForTransaction(txHash); - } -} - -export interface Services { - contracts: ContractsService; - artifacts: ArtifactsService; - transactions: TransactionsService; -} diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts new file mode 100644 index 0000000000..6c78cee1e4 --- /dev/null +++ b/packages/core/src/services/TransactionsService.ts @@ -0,0 +1,17 @@ +import { ethers } from "ethers"; + +import { Providers } from "../providers"; + +export class TransactionsService { + constructor(private readonly _providers: Providers) {} + + public async wait( + txHash: string + ): Promise { + const provider = new ethers.providers.Web3Provider( + this._providers.ethereumProvider + ); + + return provider.waitForTransaction(txHash); + } +} diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts new file mode 100644 index 0000000000..5606ea0b43 --- /dev/null +++ b/packages/core/src/services/types.ts @@ -0,0 +1,16 @@ +import { ethers } from "ethers"; + +import { ArtifactsService } from "./ArtifactsService"; +import { ContractsService } from "./ContractsService"; +import { TransactionsService } from "./TransactionsService"; + +export interface TransactionOptions { + gasLimit?: ethers.BigNumberish; + gasPrice?: ethers.BigNumberish; +} + +export interface Services { + contracts: ContractsService; + artifacts: ArtifactsService; + transactions: TransactionsService; +} diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index 05e5230079..ecb52af6ec 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -1,7 +1,7 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { Journal } from "./journal"; +import { Journal } from "./journal/types"; import { GasProvider, IgnitionSigner } from "./providers"; /** diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 260fc350d5..e4ed93d332 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; -import { ExecutionGraph } from "../src/modules"; +import { ExecutionGraph } from "../src/modules/ExecutionGraph"; import { inc } from "./helpers"; diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 83b786963f..663ea42f9c 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -6,8 +6,8 @@ import { ExecutionEngineOptions, IgnitionModulesResults, } from "../src/execution-engine"; -import { InMemoryJournal } from "../src/journal"; -import { ExecutionGraph } from "../src/modules"; +import { InMemoryJournal } from "../src/journal/InMemoryJournal"; +import { ExecutionGraph } from "../src/modules/ExecutionGraph"; import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index fdfcf28530..9fcc403927 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,6 +1,6 @@ -import { Bindable, InternalBinding } from "../src/bindings"; +import { Bindable, InternalBinding } from "../src/bindings/types"; import { DeploymentState } from "../src/deployment-state"; -import { Executor, Hold } from "../src/executors"; +import { Executor, Hold } from "../src/executors/executors"; import { ArtifactsProvider, EIP1193Provider, diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index 13bd63deec..23c9ca0aea 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -3,7 +3,9 @@ import { ethers } from "ethers"; import sinon from "sinon"; import tmp from "tmp"; -import { FileJournal, InMemoryJournal, Journal } from "../src/journal"; +import { FileJournal } from "../src/journal/FileJournal"; +import { InMemoryJournal } from "../src/journal/InMemoryJournal"; +import { Journal } from "../src/journal/types"; import { GasProvider, IgnitionSigner } from "../src/providers"; import { TxSender } from "../src/tx-sender"; From dbe5c1649250b5c9ffe7200bd6381b50f52bc729 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Jun 2022 12:18:54 +0100 Subject: [PATCH 0023/1302] chore: add clean command `clean` is now a top level npm script along with equivalents in each package. The clean removes all ephemeral directories (i.e. `./dist`, `./coverage`) in packages, excluding `node_modules`. If you hit a problem with the build, stopping everything and cleaning is the way to go. --- CONTRIBUTING.md | 8 +++ package.json | 3 +- packages/core/package.json | 4 +- packages/hardhat-plugin/package.json | 4 +- yarn.lock | 85 +++++++++++++++------------- 5 files changed, 62 insertions(+), 42 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4e6cf8b158..d1f3a93999 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,3 +54,11 @@ Formatting is enforced with `prettier` and code rules with `eslint`, to run both ```shell yarn lint ``` + +## Clean + +If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from clean: + +```shell +yarn clean +``` diff --git a/package.json b/package.json index 378b06bd32..2c76954405 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "test": "wsrun --exclude-missing --serial test", "test:coverage": "wsrun --exclude-missing --serial test:coverage", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "yarn build && yarn lint && yarn test:coverage" + "fullcheck": "yarn build && yarn lint && yarn test:coverage", + "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { "wsrun": "^5.2.4" diff --git a/packages/core/package.json b/packages/core/package.json index cba8915ec0..946bb2cf32 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -12,7 +12,8 @@ "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' yarn test", "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", - "test:coverage": "nyc mocha \"test/**/*.ts\"" + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", @@ -35,6 +36,7 @@ "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", + "rimraf": "3.0.2", "sinon": "^12.0.1", "tmp": "^0.2.1", "ts-node": "10.8.1", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f49f9beee7..1d549f8827 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -11,7 +11,8 @@ "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test", - "test:coverage": "nyc mocha \"test/**/*.ts\"" + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", @@ -36,6 +37,7 @@ "mocha": "^9.1.1", "nyc": "15.1.0", "prettier": "2.4.1", + "rimraf": "3.0.2", "ts-node": "10.8.1", "typescript": "^4.7.4" }, diff --git a/yarn.lock b/yarn.lock index a4f535efd5..6012de1c06 100644 --- a/yarn.lock +++ b/yarn.lock @@ -212,14 +212,14 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2": - version "3.6.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.2.tgz#63d1e26d0b7a7a3684fce920de6ebabec1e5b674" - integrity sha512-mOqYWwMlAZpYUEOEqt7EfMFuVL2eyLqWWIzcf4odn6QgXY8jBI2NhVuJncrMCKeMZrsJAe7/auaRRB6YcdH+Qw== +"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2", "@ethereumjs/block@^3.6.3": + version "3.6.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" + integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== dependencies: - "@ethereumjs/common" "^2.6.3" - "@ethereumjs/tx" "^3.5.1" - ethereumjs-util "^7.1.4" + "@ethereumjs/common" "^2.6.5" + "@ethereumjs/tx" "^3.5.2" + ethereumjs-util "^7.1.5" merkle-patricia-tree "^4.2.4" "@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": @@ -236,13 +236,13 @@ lru-cache "^5.1.1" semaphore-async-await "^1.5.1" -"@ethereumjs/common@^2.6.3", "@ethereumjs/common@^2.6.4": - version "2.6.4" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.4.tgz#1b3cdd3aa4ee3b0ca366756fc35e4a03022a01cc" - integrity sha512-RDJh/R/EAr+B7ZRg5LfJ0BIpf/1LydFgYdvZEuTraojCbVypO2sQ+QnpP5u2wJf9DASyooKqu8O4FJEWUV6NXw== +"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": + version "2.6.5" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" + integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== dependencies: crc-32 "^1.2.0" - ethereumjs-util "^7.1.4" + ethereumjs-util "^7.1.5" "@ethereumjs/ethash@^1.1.0": version "1.1.0" @@ -264,13 +264,13 @@ ethereumjs-util "^7.1.5" "@ethereumjs/vm@^5.9.0": - version "5.9.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.2.tgz#e707976d507793096e449a87f0b204f614421cee" - integrity sha512-6zvH7iuMI7+74aGak6j9+GDYpV2T08vy2FL4iSK1PId7lNyjFELCAzDCSTQcVoyPoRMkZvRHy79W+djwvguMCA== + version "5.9.3" + resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.3.tgz#6d69202e4c132a4a1e1628ac246e92062e230823" + integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== dependencies: - "@ethereumjs/block" "^3.6.2" + "@ethereumjs/block" "^3.6.3" "@ethereumjs/blockchain" "^5.5.3" - "@ethereumjs/common" "^2.6.4" + "@ethereumjs/common" "^2.6.5" "@ethereumjs/tx" "^3.5.2" async-eventemitter "^0.2.4" core-js-pure "^3.0.1" @@ -1465,15 +1465,14 @@ browserify-aes@^1.2.0: safe-buffer "^5.0.1" browserslist@^4.20.2: - version "4.20.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.4.tgz#98096c9042af689ee1e0271333dbc564b8ce4477" - integrity sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw== + version "4.21.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" + integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== dependencies: - caniuse-lite "^1.0.30001349" - electron-to-chromium "^1.4.147" - escalade "^3.1.1" + caniuse-lite "^1.0.30001358" + electron-to-chromium "^1.4.164" node-releases "^2.0.5" - picocolors "^1.0.0" + update-browserslist-db "^1.0.0" bs58@^4.0.0: version "4.0.1" @@ -1554,10 +1553,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001349: - version "1.0.30001358" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001358.tgz#473d35dabf5e448b463095cab7924e96ccfb8c00" - integrity sha512-hvp8PSRymk85R20bsDra7ZTCpSVGN/PAz9pSAjPSjKC+rNmnUk5vCRgJwiTT/O4feQ/yu/drvZYpKxxhbFuChw== +caniuse-lite@^1.0.30001358: + version "1.0.30001359" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" + integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== chai-as-promised@^7.1.1: version "7.1.1" @@ -1931,10 +1930,10 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -electron-to-chromium@^1.4.147: - version "1.4.164" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.164.tgz#3d0f5c83557d8ec8a7faa531e498f198c3bd974a" - integrity sha512-K7iy5y6XyP9Pzh3uaDti0KC4JUNT6T1tLG5RTOmesqq2YgAJpYYYJ32m+anvZYjCV35llPTEh87kvEV/uSsiyQ== +electron-to-chromium@^1.4.164: + version "1.4.169" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz#d4b8cf9816566c7e9518128f1a97f39de9c7af9d" + integrity sha512-Yb7UFva1sLlAaRyCkgoFF3qWvwZacFDtsGKi44rZsk8vnhL0DMhsUdhI4Dz9CCJQfftncDMGSI3AYiDtg8mD/w== elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: version "6.5.4" @@ -4255,6 +4254,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + rimraf@^2.2.8: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" @@ -4262,13 +4268,6 @@ rimraf@^2.2.8: dependencies: glob "^7.1.3" -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -4876,6 +4875,14 @@ unpipe@1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== +update-browserslist-db@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" + integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" From 2b64eb8f1dc10481a6298bde1775575836004c22 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Jun 2022 12:40:46 +0100 Subject: [PATCH 0024/1302] refactor(core): move ignition out of index Keep index as a way of showing what is exported from the package. Ignition has been moved to the `Ignition.ts` file. --- packages/core/src/Ignition.ts | 95 ++++++++++++++++++++++++++++++ packages/core/src/index.ts | 106 +++------------------------------- 2 files changed, 103 insertions(+), 98 deletions(-) create mode 100644 packages/core/src/Ignition.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts new file mode 100644 index 0000000000..44f4cb138a --- /dev/null +++ b/packages/core/src/Ignition.ts @@ -0,0 +1,95 @@ +import setupDebug from "debug"; + +import { + DeploymentPlan, + DeploymentResult, + ExecutionEngine, + ExecutionManager, + IgnitionModulesResults, +} from "./execution-engine"; +import { FileJournal } from "./journal/FileJournal"; +import { InMemoryJournal } from "./journal/InMemoryJournal"; +import { ModuleBuilderImpl } from "./modules/ModuleBuilderImpl"; +import { UserModule } from "./modules/types"; +import { Providers } from "./providers"; + +const log = setupDebug("ignition:main"); + +export interface IgnitionDeployOptions { + pathToJournal: string | undefined; + txPollingInterval: number; +} + +type ModulesOutputs = Record; + +export class Ignition { + constructor( + private _providers: Providers, + private _modulesResults: IgnitionModulesResults + ) {} + + public async deploy( + userModules: Array>, + { pathToJournal, txPollingInterval }: IgnitionDeployOptions + ): Promise<[DeploymentResult, ModulesOutputs]> { + log(`Start deploy, '${userModules.length}' modules`); + + const m = new ModuleBuilderImpl(); + + const modulesOutputs: ModulesOutputs = {}; + + for (const userModule of userModules) { + log("Load module '%s'", userModule.id); + const moduleOutput = m.useModule(userModule) ?? {}; + modulesOutputs[userModule.id] = moduleOutput; + } + + log("Build execution graph"); + const executionGraph = m.buildExecutionGraph(); + + log("Create journal with path '%s'", pathToJournal); + const journal = + pathToJournal !== undefined + ? new FileJournal(pathToJournal) + : new InMemoryJournal(); + + const engine = new ExecutionEngine( + this._providers, + journal, + this._modulesResults, + { + parallelizationLevel: 2, + loggingEnabled: pathToJournal !== undefined, + txPollingInterval, + } + ); + + const executionManager = new ExecutionManager( + engine, + txPollingInterval / 5 + ); + + log("Execute deployment"); + const deploymentResult = await executionManager.execute(executionGraph); + + return [deploymentResult, modulesOutputs]; + } + + public async buildPlan( + userModules: Array> + ): Promise { + log(`Start building plan, '${userModules.length}' modules`); + + const m = new ModuleBuilderImpl(); + + for (const userModule of userModules) { + log("Load module '%s'", userModule.id); + m.useModule(userModule); + } + + log("Build ExecutionGraph"); + const executionGraph = m.buildExecutionGraph(); + + return ExecutionEngine.buildPlan(executionGraph, this._modulesResults); + } +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 8c2b99cef4..a98404fb52 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,7 +1,5 @@ -import setupDebug from "debug"; - -import { InternalContractBinding } from "./bindings/InternalContractBinding"; -import { +import type { InternalContractBinding } from "./bindings/InternalContractBinding"; +import type { AddressLike, ContractBinding, ContractOptions, @@ -10,21 +8,12 @@ import { SerializedModuleResult, SerializedBindingResult, } from "./bindings/types"; -import { - DeploymentPlan, - DeploymentResult, - ExecutionEngine, - ExecutionManager, - IgnitionModulesResults, -} from "./execution-engine"; +import type { DeploymentResult } from "./execution-engine"; import { Executor, Hold } from "./executors/executors"; -import { FileJournal } from "./journal/FileJournal"; -import { InMemoryJournal } from "./journal/InMemoryJournal"; -import { ModuleBuilderImpl } from "./modules/ModuleBuilderImpl"; -import { ModuleBuilder, UserModule } from "./modules/types"; -import { Providers } from "./providers"; -import { Services } from "./services/types"; -import { Contract } from "./types"; +import type { ModuleBuilder, UserModule } from "./modules/types"; +import type { Providers } from "./providers"; +import type { Services } from "./services/types"; +import type { Contract } from "./types"; export { Binding } from "./bindings/types"; export { DeploymentPlan } from "./execution-engine"; @@ -48,83 +37,4 @@ export { SerializedDeploymentResult, }; -const log = setupDebug("ignition:main"); - -export interface IgnitionDeployOptions { - pathToJournal: string | undefined; - txPollingInterval: number; -} - -type ModulesOutputs = Record; - -export class Ignition { - constructor( - private _providers: Providers, - private _modulesResults: IgnitionModulesResults - ) {} - - public async deploy( - userModules: Array>, - { pathToJournal, txPollingInterval }: IgnitionDeployOptions - ): Promise<[DeploymentResult, ModulesOutputs]> { - log(`Start deploy, '${userModules.length}' modules`); - - const m = new ModuleBuilderImpl(); - - const modulesOutputs: ModulesOutputs = {}; - - for (const userModule of userModules) { - log("Load module '%s'", userModule.id); - const moduleOutput = m.useModule(userModule) ?? {}; - modulesOutputs[userModule.id] = moduleOutput; - } - - log("Build execution graph"); - const executionGraph = m.buildExecutionGraph(); - - log("Create journal with path '%s'", pathToJournal); - const journal = - pathToJournal !== undefined - ? new FileJournal(pathToJournal) - : new InMemoryJournal(); - - const engine = new ExecutionEngine( - this._providers, - journal, - this._modulesResults, - { - parallelizationLevel: 2, - loggingEnabled: pathToJournal !== undefined, - txPollingInterval, - } - ); - - const executionManager = new ExecutionManager( - engine, - txPollingInterval / 5 - ); - - log("Execute deployment"); - const deploymentResult = await executionManager.execute(executionGraph); - - return [deploymentResult, modulesOutputs]; - } - - public async buildPlan( - userModules: Array> - ): Promise { - log(`Start building plan, '${userModules.length}' modules`); - - const m = new ModuleBuilderImpl(); - - for (const userModule of userModules) { - log("Load module '%s'", userModule.id); - m.useModule(userModule); - } - - log("Build ExecutionGraph"); - const executionGraph = m.buildExecutionGraph(); - - return ExecutionEngine.buildPlan(executionGraph, this._modulesResults); - } -} +export { Ignition, IgnitionDeployOptions } from "./Ignition"; From 3834d48bbe60737f15d46ae3b50d4b8c19f461b4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Jun 2022 15:00:11 +0100 Subject: [PATCH 0025/1302] feat: expose igntion types via plugin To allow a standard user to rely on only the `@nomiclabs/hardhat-ignition` plugin rather than having to import the core library as well, we reexport the key types from core in the plugin. --- examples/simple-ts/ignition/Multisig.ts | 22 +- .../simple-ts/ignition/MultisigAndTimelock.ts | 40 +-- examples/simple-ts/ignition/Timelock.ts | 33 +- examples/simple-ts/package.json | 3 +- examples/simple/ignition/MyModule.js | 6 +- examples/simple/ignition/MyOtherModule.js | 16 +- examples/simple/package.json | 3 +- packages/core/package.json | 2 +- packages/core/src/Ignition.ts | 2 +- packages/core/src/bindings/Binding.ts | 8 + packages/core/src/bindings/CallBinding.ts | 6 + packages/core/src/bindings/ContractBinding.ts | 6 + packages/core/src/bindings/InternalBinding.ts | 21 ++ .../core/src/bindings/InternalCallBinding.ts | 3 +- .../src/bindings/InternalContractBinding.ts | 3 +- packages/core/src/bindings/types.ts | 62 +--- packages/core/src/bindings/utils.ts | 31 +- packages/core/src/deployment-state.ts | 4 +- packages/core/src/execution-engine.ts | 4 +- packages/core/src/executors.ts | 300 ++++++++++++++++++ packages/core/src/executors/executors.ts | 3 +- packages/core/src/index.ts | 46 +-- packages/core/src/modules.ts | 254 +++++++++++++++ .../core/src/modules/ModuleBuilderImpl.ts | 17 +- packages/core/src/modules/UserModule.ts | 10 + packages/core/src/modules/buildModule.ts | 3 +- packages/core/src/modules/types.ts | 15 +- packages/core/test/helpers.ts | 3 +- packages/hardhat-plugin/.nycrc | 2 +- packages/hardhat-plugin/package.json | 8 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +- packages/hardhat-plugin/src/index.ts | 17 +- packages/hardhat-plugin/src/user-modules.ts | 2 +- packages/hardhat-plugin/test/helpers.ts | 4 +- packages/hardhat-plugin/test/integration.ts | 2 +- 35 files changed, 767 insertions(+), 202 deletions(-) create mode 100644 packages/core/src/bindings/Binding.ts create mode 100644 packages/core/src/bindings/CallBinding.ts create mode 100644 packages/core/src/bindings/ContractBinding.ts create mode 100644 packages/core/src/bindings/InternalBinding.ts create mode 100644 packages/core/src/executors.ts create mode 100644 packages/core/src/modules.ts create mode 100644 packages/core/src/modules/UserModule.ts diff --git a/examples/simple-ts/ignition/Multisig.ts b/examples/simple-ts/ignition/Multisig.ts index ec8ef9d4d1..25069867b2 100644 --- a/examples/simple-ts/ignition/Multisig.ts +++ b/examples/simple-ts/ignition/Multisig.ts @@ -6,13 +6,11 @@ import { buildModule, ModuleBuilder, InternalBinding, - InternalContractBinding, Executor, - Contract, Services, Binding, - Hold -} from "ignition"; + Hold, +} from "@nomiclabs/hardhat-ignition"; interface CallFromMultisigOptions { id: string; @@ -113,7 +111,7 @@ class MultisigContractBinding extends InternalBinding< return [ this.input.multiSigWalletAddress, this.input.destination, - ...this.input.args + ...this.input.args, ].filter((x): x is InternalBinding => { return InternalBinding.isBinding(x); }); @@ -135,7 +133,7 @@ function callFromMultisig( contractName, destination, method, - args + args, }); m.addExecutor(new MultisigContractExecutor(b)); @@ -143,24 +141,24 @@ function callFromMultisig( return b; } -export default buildModule("Multisig", m => { +export default buildModule("Multisig", (m) => { const multisig = m.contract("MultiSigWallet", { args: [ [ "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", ], - 2 - ] + 2, + ], }); const owned = m.contract("Owned", { - args: [multisig] + args: [multisig], }); const tx = callFromMultisig(m, multisig, "Owned", owned, "inc", { - id: "Owned.inc" + id: "Owned.inc", }); return { multisig, tx, owned }; diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts index 11dfb4881e..e821f6ea5c 100644 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -1,18 +1,14 @@ import { ethers } from "ethers"; import { - AddressLike, ContractBinding, - ContractOptions, buildModule, ModuleBuilder, InternalBinding, - InternalContractBinding, Executor, - Contract, Services, Binding, - Hold -} from "ignition"; + Hold, +} from "@nomiclabs/hardhat-ignition"; interface CallFromMultisigAndTimelockOptions { id: string; @@ -64,13 +60,13 @@ class MultisigAndTimelockExecutor extends Executor< 0, txData, zeroBytes32, - zeroBytes32 + zeroBytes32, ]; // send timelocked tx to multisig const scheduleTxData = timelock.interface.encodeFunctionData("schedule", [ ...timelockParameters, - 15 + 15, ]); console.log("[MultisigAndTimelockExecutor] submit schedule tx"); @@ -89,9 +85,8 @@ class MultisigAndTimelockExecutor extends Executor< input.multisig.abi ); - const { - transactionId: multisigScheduleTxId - } = multisigScheduleSubmissionLog.args; + const { transactionId: multisigScheduleTxId } = + multisigScheduleSubmissionLog.args; // wait until the multisig schedule is confirmed const isScheduleConfirmed = await services.contracts.staticCall( @@ -156,9 +151,8 @@ class MultisigAndTimelockExecutor extends Executor< input.multisig.abi ); - const { - transactionId: multisigExecuteTxId - } = multisigExecuteSubmissionLog.args; + const { transactionId: multisigExecuteTxId } = + multisigExecuteSubmissionLog.args; // wait until the multisig execute is confirmed const isConfirmed = await services.contracts.staticCall( @@ -195,7 +189,7 @@ class MultisigAndTimelockBinding extends InternalBinding< this.input.multisig, this.input.timelock, this.input.destination, - ...this.input.args + ...this.input.args, ].filter((x): x is InternalBinding => { return InternalBinding.isBinding(x); }); @@ -217,7 +211,7 @@ function callFromMultisigAndTimelock( timelock, destination, method, - args + args, }); m.addExecutor(new MultisigAndTimelockExecutor(b)); @@ -225,28 +219,28 @@ function callFromMultisigAndTimelock( return b; } -export default buildModule("MultisigAndTimelock", m => { +export default buildModule("MultisigAndTimelock", (m) => { const multisig = m.contract("MultiSigWallet", { args: [ [ "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc" + "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", ], - 2 - ] + 2, + ], }); const timelock = m.contract("TimelockController", { - args: [15, [multisig], [multisig]] + args: [15, [multisig], [multisig]], }); const owned = m.contract("Owned", { - args: [timelock] + args: [timelock], }); callFromMultisigAndTimelock(m, multisig, timelock, owned, "inc", { - id: "Owned.inc" + id: "Owned.inc", }); return { owned }; diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index 168dc0000f..7cb7c4c1f4 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -1,22 +1,23 @@ -import {ethers} from "ethers"; +import { ethers } from "ethers"; import { - AddressLike, ContractBinding, - ContractOptions, buildModule, ModuleBuilder, InternalBinding, - InternalContractBinding, Executor, Contract, Services, - Binding, - Hold -} from "ignition"; + Hold, +} from "@nomiclabs/hardhat-ignition"; class TimelockCallExecutor extends Executor { public async execute( - input: { timelock: Contract; contract: Contract; method: string; args: any[] }, + input: { + timelock: Contract; + contract: Contract; + method: string; + args: any[]; + }, services: Services ): Promise { const Factory = new ethers.Contract( @@ -52,7 +53,7 @@ class TimelockCallExecutor extends Executor { input.timelock.abi, "isOperationReady", [id] - ) + ); if (!isReady) { throw new Hold(`Waiting for timelock's tx '${id} to be ready'`); @@ -65,7 +66,7 @@ class TimelockCallExecutor extends Executor { [input.contract.address, 0, txData, zeroBytes32, zeroBytes32] ); - return executeTx + return executeTx; } public async validate( @@ -107,7 +108,7 @@ function callFromTimelock( const b = new TimelockCallBinding(m.getModuleId(), id, { timelock, contract, - method + method, }); m.addExecutor(new TimelockCallExecutor(b)); @@ -115,21 +116,21 @@ function callFromTimelock( return b; } -export default buildModule("Timelock", m => { +export default buildModule("Timelock", (m) => { const timelock = m.contract("TimelockController", { args: [ 15, ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], - ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"] - ] + ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], + ], }); const owned = m.contract("Owned", { - args: [timelock] + args: [timelock], }); callFromTimelock(m, timelock, owned, "inc", { - id: "Owned.inc" + id: "Owned.inc", }); return { owned }; diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json index edebb2893c..0d4c39b4c8 100644 --- a/examples/simple-ts/package.json +++ b/examples/simple-ts/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-ignition": "^0.0.1", + "@nomiclabs/hardhat-ignition": "^0.0.2", "@openzeppelin/contracts": "^4.3.2", "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", @@ -12,7 +12,6 @@ "chai": "^4.3.4", "ethers": "^5.4.7", "hardhat": "^2.6.4", - "ignition": "^0.0.2", "ts-node": "^10.3.0", "typescript": "^4.7.4" }, diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index ac49207aaf..ffb4fb9669 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -1,11 +1,11 @@ -const { buildModule } = require("ignition") +const { buildModule } = require("@nomiclabs/hardhat-ignition"); module.exports = buildModule("MyModule", (m) => { - const foo = m.contract("Foo") + const foo = m.contract("Foo"); // m.call(foo, "inc", { // args: [1] // }) // - return { foo } + return { foo }; }); diff --git a/examples/simple/ignition/MyOtherModule.js b/examples/simple/ignition/MyOtherModule.js index 8c47dae414..463fc53520 100644 --- a/examples/simple/ignition/MyOtherModule.js +++ b/examples/simple/ignition/MyOtherModule.js @@ -1,15 +1,15 @@ -const { buildModule } = require("ignition") +const { buildModule } = require("@nomiclabs/hardhat-ignition"); module.exports = buildModule("MyOtherModule", (m) => { - const foo = m.contract("Foo") - const foo2 = m.contract("Foo", { id: "Foo2" }) + const foo = m.contract("Foo"); + const foo2 = m.contract("Foo", { id: "Foo2" }); m.call(foo, "inc", { - args: [1] - }) + args: [1], + }); m.call(foo2, "inc", { - args: [1] - }) + args: [1], + }); - return { foo } + return { foo }; }); diff --git a/examples/simple/package.json b/examples/simple/package.json index f36a1e84f9..2dca71d5b5 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -4,8 +4,7 @@ "private": true, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-ignition": "^0.0.1", - "ignition": "^0.0.2" + "@nomiclabs/hardhat-ignition": "^0.0.2" }, "devDependencies": { "hardhat": "^2.6.4" diff --git a/packages/core/package.json b/packages/core/package.json index 946bb2cf32..5dd1675a92 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,5 +1,5 @@ { - "name": "ignition", + "name": "@nomiclabs/ignition-core", "version": "0.0.2", "license": "MIT", "main": "dist/src/index.js", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 44f4cb138a..690111057f 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -10,7 +10,7 @@ import { import { FileJournal } from "./journal/FileJournal"; import { InMemoryJournal } from "./journal/InMemoryJournal"; import { ModuleBuilderImpl } from "./modules/ModuleBuilderImpl"; -import { UserModule } from "./modules/types"; +import { UserModule } from "./modules/UserModule"; import { Providers } from "./providers"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/bindings/Binding.ts b/packages/core/src/bindings/Binding.ts new file mode 100644 index 0000000000..5785bfeb28 --- /dev/null +++ b/packages/core/src/bindings/Binding.ts @@ -0,0 +1,8 @@ +import { BindingOutput } from "./types"; + +export abstract class Binding { + // dummy variables needed by the type-checker to work correctly when opaque + // types are used in a module definition + protected _dummyInput!: I; + protected _dummyOutput!: O; +} diff --git a/packages/core/src/bindings/CallBinding.ts b/packages/core/src/bindings/CallBinding.ts new file mode 100644 index 0000000000..e725ad53e2 --- /dev/null +++ b/packages/core/src/bindings/CallBinding.ts @@ -0,0 +1,6 @@ +import { Tx } from "../types"; + +import { Binding } from "./Binding"; +import { CallOptions } from "./types"; + +export class CallBinding extends Binding {} diff --git a/packages/core/src/bindings/ContractBinding.ts b/packages/core/src/bindings/ContractBinding.ts new file mode 100644 index 0000000000..4a63e74e46 --- /dev/null +++ b/packages/core/src/bindings/ContractBinding.ts @@ -0,0 +1,6 @@ +import { Contract } from "../types"; + +import { Binding } from "./Binding"; +import { ContractOptions } from "./types"; + +export class ContractBinding extends Binding {} diff --git a/packages/core/src/bindings/InternalBinding.ts b/packages/core/src/bindings/InternalBinding.ts new file mode 100644 index 0000000000..61fb693ef2 --- /dev/null +++ b/packages/core/src/bindings/InternalBinding.ts @@ -0,0 +1,21 @@ +import { Binding } from "./Binding"; +import { BindingOutput } from "./types"; + +export abstract class InternalBinding< + I = unknown, + O extends BindingOutput = any +> extends Binding { + constructor( + public readonly moduleId: string, + public readonly id: string, + public readonly input: I + ) { + super(); + } + + abstract getDependencies(): InternalBinding[]; + + public static isBinding(x: unknown): x is InternalBinding { + return x instanceof InternalBinding; + } +} diff --git a/packages/core/src/bindings/InternalCallBinding.ts b/packages/core/src/bindings/InternalCallBinding.ts index b2fd993082..34444825a4 100644 --- a/packages/core/src/bindings/InternalCallBinding.ts +++ b/packages/core/src/bindings/InternalCallBinding.ts @@ -1,6 +1,7 @@ import { Tx } from "../types"; -import { InternalBinding, CallOptions, Unflattened } from "./types"; +import { InternalBinding } from "./InternalBinding"; +import { CallOptions, Unflattened } from "./types"; import { deepFlatten } from "./utils"; export class InternalCallBinding extends InternalBinding { diff --git a/packages/core/src/bindings/InternalContractBinding.ts b/packages/core/src/bindings/InternalContractBinding.ts index 77ce7010ab..28c291a9fd 100644 --- a/packages/core/src/bindings/InternalContractBinding.ts +++ b/packages/core/src/bindings/InternalContractBinding.ts @@ -1,6 +1,7 @@ import { Contract } from "../types"; -import { InternalBinding, ContractOptions, Unflattened } from "./types"; +import { InternalBinding } from "./InternalBinding"; +import { ContractOptions, Unflattened } from "./types"; import { deepFlatten } from "./utils"; export class InternalContractBinding extends InternalBinding< diff --git a/packages/core/src/bindings/types.ts b/packages/core/src/bindings/types.ts index 7b9facfbc1..bcf44f6b33 100644 --- a/packages/core/src/bindings/types.ts +++ b/packages/core/src/bindings/types.ts @@ -1,35 +1,10 @@ import { Contract, Tx } from "../types"; -export type BindingOutput = string | number | Contract | Tx; - -export function serializeBindingOutput(x: BindingOutput) { - if (typeof x === "string") { - return { _kind: "string" as const, value: x }; - } else if (typeof x === "number") { - return { _kind: "number" as const, value: x }; - } else if ("address" in x) { - return { _kind: "contract" as const, value: x }; - } else if ("hash" in x) { - return { _kind: "tx" as const, value: x }; - } - - const exhaustiveCheck: never = x; - return exhaustiveCheck; -} +import { Binding } from "./Binding"; +import { ContractBinding } from "./ContractBinding"; +import { serializeBindingOutput } from "./utils"; -export function deserializeBindingOutput(x: any) { - if (x === null || x === undefined) { - throw new Error("[deserializeBindingOutput] value is null or undefined"); - } - - if (!("_kind" in x)) { - throw new Error( - "[deserializeBindingOutput] value was not serialized by Ignition" - ); - } - - return x.value; -} +export type BindingOutput = string | number | Contract | Tx; export type ModuleResult = Record; export type SerializedModuleResult = Record; @@ -37,32 +12,6 @@ export type SerializedBindingResult = ReturnType; export type SerializedDeploymentResult = Record; -export abstract class Binding { - // dummy variables needed by the type-checker to work correctly when opaque - // types are used in a module definition - protected _dummyInput!: I; - protected _dummyOutput!: O; -} - -export abstract class InternalBinding< - I = unknown, - O extends BindingOutput = any -> extends Binding { - constructor( - public readonly moduleId: string, - public readonly id: string, - public readonly input: I - ) { - super(); - } - - abstract getDependencies(): InternalBinding[]; - - public static isBinding(x: unknown): x is InternalBinding { - return x instanceof InternalBinding; - } -} - export interface ContractOptions { contractName: string; args: Array>; @@ -78,9 +27,6 @@ export type Bindable = T | Binding; export type AddressLike = Bindable | Binding; -export class ContractBinding extends Binding {} -export class CallBinding extends Binding {} - export type Unflattened = T[] | Array>; export type Resolved = T extends Binding diff --git a/packages/core/src/bindings/utils.ts b/packages/core/src/bindings/utils.ts index 5a33ec1f41..13594a3382 100644 --- a/packages/core/src/bindings/utils.ts +++ b/packages/core/src/bindings/utils.ts @@ -1,4 +1,4 @@ -import { Unflattened } from "./types"; +import type { BindingOutput, Unflattened } from "./types"; export function deepFlatten(array: Unflattened): T[] { let result: T[] = []; @@ -13,3 +13,32 @@ export function deepFlatten(array: Unflattened): T[] { return result; } + +export function serializeBindingOutput(x: BindingOutput) { + if (typeof x === "string") { + return { _kind: "string" as const, value: x }; + } else if (typeof x === "number") { + return { _kind: "number" as const, value: x }; + } else if ("address" in x) { + return { _kind: "contract" as const, value: x }; + } else if ("hash" in x) { + return { _kind: "tx" as const, value: x }; + } + + const exhaustiveCheck: never = x; + return exhaustiveCheck; +} + +export function deserializeBindingOutput(x: any) { + if (x === null || x === undefined) { + throw new Error("[deserializeBindingOutput] value is null or undefined"); + } + + if (!("_kind" in x)) { + throw new Error( + "[deserializeBindingOutput] value was not serialized by Ignition" + ); + } + + return x.value; +} diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index f3b6c3620f..40f7efad05 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -1,9 +1,9 @@ -import { +import type { BindingOutput, ModuleResult, - serializeBindingOutput, SerializedModuleResult, } from "./bindings/types"; +import { serializeBindingOutput } from "./bindings/utils"; import { ExecutionGraph } from "./modules/ExecutionGraph"; import { IgnitionModule } from "./modules/IgnitionModule"; diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 606f1a7c6b..c27058cb1f 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,12 +1,12 @@ import setupDebug from "debug"; +import { InternalBinding } from "./bindings/InternalBinding"; import { - deserializeBindingOutput, - InternalBinding, ModuleResult, SerializedDeploymentResult, SerializedModuleResult, } from "./bindings/types"; +import { deserializeBindingOutput } from "./bindings/utils"; import { DeploymentState } from "./deployment-state"; import { Journal } from "./journal/types"; import { ExecutionGraph } from "./modules/ExecutionGraph"; diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts new file mode 100644 index 0000000000..92cab91a82 --- /dev/null +++ b/packages/core/src/executors.ts @@ -0,0 +1,300 @@ +import setupDebug, { IDebugger } from "debug"; +import { ethers } from "ethers"; + +import { InternalBinding } from "./bindings/InternalBinding"; +import { InternalContractBinding } from "./bindings/InternalContractBinding"; +import { + BindingOutput, + CallOptions, + ContractOptions, + Resolved, +} from "./bindings/types"; +import { BindingState } from "./deployment-state"; +import { Services } from "./services/types"; +import { Contract, Tx } from "./types"; + +/** + * An instance of this class is thrown to indicate that the executor is waiting + * for some external event to happen, like a multisig that needs extra + * confirmations or a timelocked contract. + */ +export class Hold { + constructor(public readonly reason: string) {} +} + +export abstract class Executor { + private _dummyInput!: I; + private _dummyOutput!: O; + private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; + private result?: any; + private error?: any; + private holdReason?: string; + private _debug: IDebugger; + + constructor(public readonly binding: InternalBinding) { + const moduleId = binding.moduleId; + const bindingId = binding.id; + this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); + } + + abstract execute(input: Resolved, services: Services): Promise; + abstract validate(input: I, services: Services): Promise; + abstract getDescription(): string; + + public async run( + input: Resolved, + services: Services, + onStateChange: (newState: BindingState) => void + ) { + try { + this._debug("Start running"); + this._setRunning(); + onStateChange(BindingState.running()); + const result = await this.execute(input, services); + this._debug("Ended successfully"); + this._setSuccess(result); + onStateChange(BindingState.success(result)); + } catch (e: any) { + if (e instanceof Hold) { + this._debug("Ended with hold"); + this._setHold(e.reason); + onStateChange(BindingState.hold(e.reason)); + } else { + this._debug("Ended with error"); + this._setFailure(e); + onStateChange(BindingState.failure(e)); + } + } + } + + public isReady() { + return this.state === "ready"; + } + + public isRunning() { + return this.state === "running"; + } + + public isHold() { + return this.state === "hold"; + } + + public getHoldReason(): string { + if (this.holdReason === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no hold reason` + ); + } + + return this.holdReason; + } + + public isSuccess() { + return this.state === "success"; + } + + public getResult() { + if (this.result === undefined) { + throw new Error( + `[executor ${this.binding.id}] assertion error: no result` + ); + } + + return this.result; + } + + public isFailure() { + return this.state === "failure"; + } + + public getError() { + if (this.error === undefined) { + throw new Error("assertion error"); + } + + return this.error; + } + + private _setRunning() { + this.state = "running"; + } + private _setHold(reason: string) { + this.state = "hold"; + this.holdReason = reason; + } + private _setSuccess(result: any) { + this.state = "success"; + this.result = result; + } + private _setFailure(err: Error) { + this.state = "failure"; + this.error = err; + } +} + +export class ContractExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contractName } = input; + const artifact = await services.artifacts.getArtifact(contractName); + + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.deploy(artifact, args); + + const receipt = await services.transactions.wait(txHash); + + return { + name: contractName, + abi: artifact.abi, + address: receipt.contractAddress, + bytecode: artifact.bytecode, + }; + } + + public async validate( + input: ContractOptions, + services: Services + ): Promise { + const artifactExists = await services.artifacts.hasArtifact( + input.contractName + ); + + if (!artifactExists) { + return [`Artifact with name '${input.contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(input.contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return [ + `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + ]; + } + + return []; + } + + public getDescription() { + return `Deploy contract ${this.binding.input.contractName}`; + } +} + +export class CallExecutor extends Executor { + public async execute( + input: Resolved, + services: Services + ): Promise { + const { contract, method } = input; + const mapToAddress = (x: any): any => { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; + }; + + const args = input.args.map(mapToAddress); + const txHash = await services.contracts.call( + contract.address, + contract.abi, + method, + args + ); + + await services.transactions.wait(txHash); + + return { + hash: txHash, + }; + } + + public async validate( + input: CallOptions, + services: Services + ): Promise { + const contractName = (input.contract as InternalContractBinding).input + .contractName; + const artifactExists = await services.artifacts.hasArtifact(contractName); + + if (!artifactExists) { + return [`Artifact with name '${contractName}' doesn't exist`]; + } + + const artifact = await services.artifacts.getArtifact(contractName); + const argsLength = input.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const functionFragments = iface.fragments.filter( + (f) => f.name === input.method + ); + + if (functionFragments.length === 0) { + return [ + `Contract '${contractName}' doesn't have a function ${input.method}`, + ]; + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + return [ + `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, + ]; + } else { + return [ + `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, + ]; + } + } + + return []; + } + + public getDescription() { + const contractName = ( + this.binding.input.contract as InternalContractBinding + ).input.contractName; + return `Call method ${this.binding.input.method} in contract ${contractName}`; + } +} diff --git a/packages/core/src/executors/executors.ts b/packages/core/src/executors/executors.ts index 87fbc15e93..83c56f141b 100644 --- a/packages/core/src/executors/executors.ts +++ b/packages/core/src/executors/executors.ts @@ -1,6 +1,7 @@ import setupDebug, { IDebugger } from "debug"; -import { BindingOutput, InternalBinding, Resolved } from "../bindings/types"; +import { InternalBinding } from "../bindings/InternalBinding"; +import { BindingOutput, Resolved } from "../bindings/types"; import { BindingState } from "../deployment-state"; import { Services } from "../services/types"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index a98404fb52..b956c01f7d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,40 +1,26 @@ -import type { InternalContractBinding } from "./bindings/InternalContractBinding"; -import type { +export { Binding } from "./bindings/Binding"; +export { ContractBinding } from "./bindings/ContractBinding"; +export { InternalBinding } from "./bindings/InternalBinding"; +export { InternalContractBinding } from "./bindings/InternalContractBinding"; +export type { AddressLike, - ContractBinding, ContractOptions, - InternalBinding, SerializedDeploymentResult, SerializedModuleResult, SerializedBindingResult, } from "./bindings/types"; -import type { DeploymentResult } from "./execution-engine"; -import { Executor, Hold } from "./executors/executors"; -import type { ModuleBuilder, UserModule } from "./modules/types"; -import type { Providers } from "./providers"; -import type { Services } from "./services/types"; -import type { Contract } from "./types"; -export { Binding } from "./bindings/types"; -export { DeploymentPlan } from "./execution-engine"; +export { Executor, Hold } from "./executors/executors"; + export { buildModule } from "./modules/buildModule"; -export { - AddressLike, - Contract, - ContractBinding, - ContractOptions, - DeploymentResult, - Executor, - Hold, - InternalBinding, - InternalContractBinding, - ModuleBuilder, - Providers, - Services, - UserModule, - SerializedBindingResult, - SerializedModuleResult, - SerializedDeploymentResult, -}; +export type { ModuleBuilder } from "./modules/types"; +export { UserModule } from "./modules/UserModule"; + +export type { Services } from "./services/types"; +export type { Providers } from "./providers"; + +export type { DeploymentResult } from "./execution-engine"; +export { DeploymentPlan } from "./execution-engine"; export { Ignition, IgnitionDeployOptions } from "./Ignition"; +export type { Contract } from "./types"; diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts new file mode 100644 index 0000000000..240db2990c --- /dev/null +++ b/packages/core/src/modules.ts @@ -0,0 +1,254 @@ +import { CallBinding } from "./bindings/CallBinding"; +import { ContractBinding } from "./bindings/ContractBinding"; +import { InternalBinding } from "./bindings/InternalBinding"; +import { InternalCallBinding } from "./bindings/InternalCallBinding"; +import { InternalContractBinding } from "./bindings/InternalContractBinding"; +import { Bindable, CallOptions, ContractOptions } from "./bindings/types"; +import { CallExecutor } from "./executors/CallExecutor"; +import { ContractExecutor } from "./executors/ContractExecutor"; +import { Executor } from "./executors/executors"; +import { Contract, Tx } from "./types"; + +export class IgnitionModule { + constructor(public readonly id: string, private _executors: Executor[]) {} + + public getSortedExecutors(): Executor[] { + const dependencies = new Map>(); + + for (const executor of this._executors) { + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + + for (const executorDependency of executor.binding.getDependencies()) { + if (executorDependency.moduleId === executor.binding.moduleId) { + executorDependencies.add(executorDependency.id); + } + } + + dependencies.set(executor.binding.id, executorDependencies); + } + + const added = new Set(); + const sortedExecutors: Executor[] = []; + + while (added.size < this._executors.length) { + for (const executor of this._executors) { + if (added.has(executor.binding.id)) { + continue; + } + + const executorDependencies = + dependencies.get(executor.binding.id) ?? new Set(); + if ([...executorDependencies].every((d) => added.has(d))) { + sortedExecutors.push(executor); + added.add(executor.binding.id); + } + } + } + + return sortedExecutors; + } +} + +export class ExecutionGraph { + private _modules: Map> = new Map(); + private _dependencies: Map> = new Map(); + + public addExecutor(executor: Executor) { + const moduleId = executor.binding.moduleId; + let executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + executorsMap = new Map(); + this._modules.set(moduleId, executorsMap); + } + + if (executorsMap.has(executor.binding.id)) { + throw new Error(`Executor with id ${executor.binding.id} already exists`); + } + + const dependencies = executor.binding.getDependencies(); + for (const dependency of dependencies) { + this._addDependency(moduleId, dependency.moduleId); + } + + executorsMap.set(executor.binding.id, executor); + } + + public getModule(moduleId: string): IgnitionModule | undefined { + const executorsMap = this._modules.get(moduleId); + if (executorsMap === undefined) { + return undefined; + } + + return new IgnitionModule(moduleId, [...executorsMap.values()]); + } + + public getSortedModules(): IgnitionModule[] { + const added = new Set(); + const ignitionModules = this._getModules(); + const sortedModules: IgnitionModule[] = []; + + while (added.size < ignitionModules.length) { + for (const ignitionModule of ignitionModules) { + if (added.has(ignitionModule.id)) { + continue; + } + + const dependencies = + this._dependencies.get(ignitionModule.id) ?? new Set(); + if ([...dependencies].every((d) => added.has(d))) { + sortedModules.push(ignitionModule); + added.add(ignitionModule.id); + } + } + } + + return sortedModules; + } + + private _addDependency(moduleId: string, dependencyModuleId: string) { + if (moduleId !== dependencyModuleId) { + const dependencies = + this._dependencies.get(moduleId) ?? new Set(); + dependencies.add(dependencyModuleId); + this._dependencies.set(moduleId, dependencies); + } + } + + private _getModules(): IgnitionModule[] { + return [...this._modules.entries()].map( + ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) + ); + } +} + +interface UserContractOptions { + id?: string; + args?: Array>; +} + +interface UserCallOptions { + id?: string; + args?: Array>; +} + +export interface ModuleBuilder { + getModuleId: () => string; + addExecutor: (executor: Executor) => void; + + contract: ( + contractName: string, + options?: UserContractOptions + ) => ContractBinding; + + call: ( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ) => CallBinding; + + useModule: (userModule: UserModule) => T; +} + +export class ModuleBuilderImpl implements ModuleBuilder { + private _currentModuleId: string | undefined; + private _executionGraph = new ExecutionGraph(); + private _executors: Executor[] = []; + private _knownModules: Map, any]> = new Map(); + + constructor() {} + + public getModuleId(): string { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + return this._currentModuleId; + } + + public buildExecutionGraph(): ExecutionGraph { + return this._executionGraph; + } + + public addExecutor(executor: Executor) { + if (this._currentModuleId === undefined) { + throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + } + + this._executionGraph.addExecutor(executor); + } + + public contract( + contractName: string, + options?: UserContractOptions + ): InternalBinding { + const id = options?.id ?? contractName; + const args = options?.args ?? []; + const b = new InternalContractBinding(this.getModuleId(), id, { + contractName, + args, + }); + + this.addExecutor(new ContractExecutor(b)); + + return b; + } + + public call( + contract: ContractBinding, + method: string, + options?: UserCallOptions + ): InternalBinding { + const id = + options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; + const args = options?.args ?? []; + const b = new InternalCallBinding(this.getModuleId(), id, { + contract, + method, + args, + }); + + this.addExecutor(new CallExecutor(b)); + + return b; + } + + public useModule(userModule: UserModule): T { + const knownModuleAndOutput = this._knownModules.get(userModule.id); + if (knownModuleAndOutput !== undefined) { + const [knownModule, knownOutput] = knownModuleAndOutput; + if (userModule === knownModule) { + return knownOutput; + } else { + throw new Error(`Module with id ${userModule.id} already exists`); + } + } + + const previousModuleId = this._currentModuleId; + this._currentModuleId = userModule.id; + const output = userModule.definition(this); + this._currentModuleId = previousModuleId; + + this._knownModules.set(userModule.id, [userModule, output]); + + return output; + } +} + +type ModuleDefinition = (m: ModuleBuilder) => T; + +export class UserModule { + public readonly version = 1; + + constructor( + public readonly id: string, + public readonly definition: ModuleDefinition + ) {} +} + +export function buildModule( + moduleId: string, + moduleDefinition: ModuleDefinition +): UserModule { + return new UserModule(moduleId, moduleDefinition); +} diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 21edba80e5..4b34be87a1 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -1,23 +1,16 @@ +import { ContractBinding } from "../bindings/ContractBinding"; +import { InternalBinding } from "../bindings/InternalBinding"; import { InternalCallBinding } from "../bindings/InternalCallBinding"; import { InternalContractBinding } from "../bindings/InternalContractBinding"; -import { - CallOptions, - ContractBinding, - ContractOptions, - InternalBinding, -} from "../bindings/types"; +import { CallOptions, ContractOptions } from "../bindings/types"; import { CallExecutor } from "../executors/CallExecutor"; import { ContractExecutor } from "../executors/ContractExecutor"; import { Executor } from "../executors/executors"; import { Contract, Tx } from "../types"; import { ExecutionGraph } from "./ExecutionGraph"; -import { - ModuleBuilder, - UserModule, - UserContractOptions, - UserCallOptions, -} from "./types"; +import { UserModule } from "./UserModule"; +import { ModuleBuilder, UserContractOptions, UserCallOptions } from "./types"; export class ModuleBuilderImpl implements ModuleBuilder { private _currentModuleId: string | undefined; diff --git a/packages/core/src/modules/UserModule.ts b/packages/core/src/modules/UserModule.ts new file mode 100644 index 0000000000..547d7a8706 --- /dev/null +++ b/packages/core/src/modules/UserModule.ts @@ -0,0 +1,10 @@ +import { ModuleDefinition } from "./types"; + +export class UserModule { + public readonly version = 1; + + constructor( + public readonly id: string, + public readonly definition: ModuleDefinition + ) {} +} diff --git a/packages/core/src/modules/buildModule.ts b/packages/core/src/modules/buildModule.ts index 9c53516bfe..9ce05215c6 100644 --- a/packages/core/src/modules/buildModule.ts +++ b/packages/core/src/modules/buildModule.ts @@ -1,4 +1,5 @@ -import { ModuleDefinition, UserModule } from "./types"; +import { UserModule } from "./UserModule"; +import { ModuleDefinition } from "./types"; export function buildModule( moduleId: string, diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 07fde9ded9..854a6505a7 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -1,6 +1,10 @@ -import { Bindable, CallBinding, ContractBinding } from "../bindings/types"; +import { CallBinding } from "../bindings/CallBinding"; +import { ContractBinding } from "../bindings/ContractBinding"; +import { Bindable } from "../bindings/types"; import { Executor } from "../executors/executors"; +import { UserModule } from "./UserModule"; + export interface UserContractOptions { id?: string; args?: Array>; @@ -30,12 +34,3 @@ export interface ModuleBuilder { } export type ModuleDefinition = (m: ModuleBuilder) => T; - -export class UserModule { - public readonly version = 1; - - constructor( - public readonly id: string, - public readonly definition: ModuleDefinition - ) {} -} diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 9fcc403927..369f527f9e 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,4 +1,5 @@ -import { Bindable, InternalBinding } from "../src/bindings/types"; +import { InternalBinding } from "../src/bindings/InternalBinding"; +import { Bindable } from "../src/bindings/types"; import { DeploymentState } from "../src/deployment-state"; import { Executor, Hold } from "../src/executors/executors"; import { diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-plugin/.nycrc index 7dd48f559f..15ad54e236 100644 --- a/packages/hardhat-plugin/.nycrc +++ b/packages/hardhat-plugin/.nycrc @@ -3,7 +3,7 @@ "check-coverage": true, "statements": 50, "branches": 30, - "functions": 60, + "functions": 42, "lines": 50, "all": true, "include": [ diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 1d549f8827..3f5e45b940 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomiclabs/hardhat-ignition", - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", "main": "dist/src/index.js", "scripts": { @@ -17,6 +17,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", + "@nomiclabs/ignition-core": "^0.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", @@ -33,7 +34,6 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "hardhat": "^2.0.0", - "ignition": "^0.0.2", "mocha": "^9.1.1", "nyc": "15.1.0", "prettier": "2.4.1", @@ -43,8 +43,8 @@ }, "peerDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "hardhat": "^2.0.0", - "ignition": "^0.0.2" + "@nomiclabs/ignition-core": "^0.0.2", + "hardhat": "^2.0.0" }, "dependencies": { "debug": "^4.3.2", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 5bddd75970..68858bfd73 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,6 +1,3 @@ -import { ethers } from "ethers"; -import fsExtra from "fs-extra"; -import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import { Binding, DeploymentPlan, @@ -9,7 +6,10 @@ import { IgnitionDeployOptions, SerializedModuleResult, Providers, -} from "ignition"; +} from "@nomiclabs/ignition-core"; +import { ethers } from "ethers"; +import fsExtra from "fs-extra"; +import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; import { getAllUserModules } from "./user-modules"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 2936da2680..23f184c0a0 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,4 +1,5 @@ import "@nomiclabs/hardhat-ethers"; +import { Providers, UserModule } from "@nomiclabs/ignition-core"; import { extendConfig, extendEnvironment, @@ -7,13 +8,27 @@ import { types, } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; -import { Providers, UserModule } from "ignition"; import path from "path"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadUserModules } from "./user-modules"; import "./type-extensions"; +export { + buildModule, + ModuleBuilder, + AddressLike, + ContractBinding, + ContractOptions, + InternalBinding, + InternalContractBinding, + Executor, + Contract, + Services, + Binding, + Hold, +} from "@nomiclabs/ignition-core"; + extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; const userDeploymentsPath = userConfig.paths?.deployments; diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 4e39b471ef..8f68767902 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -1,6 +1,6 @@ +import { UserModule } from "@nomiclabs/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; -import { UserModule } from "ignition"; import path from "path"; const debug = setupDebug("hardhat-ignition:modules"); diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 8c118bbf84..fb3da66078 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,10 +1,10 @@ -import { assert } from "chai"; import { UserModule, SerializedBindingResult, SerializedDeploymentResult, DeploymentResult, -} from "ignition"; +} from "@nomiclabs/ignition-core"; +import { assert } from "chai"; export const resultAssertions = { contract: (predicate?: ContractResultPredicate): ExpectedBindingResult => { diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 93d6caa798..2e5d1e8a93 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,5 +1,5 @@ +import { buildModule } from "@nomiclabs/ignition-core"; import { assert } from "chai"; -import { buildModule } from "ignition"; import { assertDeploymentState, From 5b8bb0cbcbb35e512f7c2c7db2304620bffd399f Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 27 Jun 2022 15:25:47 +0100 Subject: [PATCH 0026/1302] chore: update the package names and authors Update the author to `Nomic Founcation` and the packages to come under the `@nomicfoundation` organisation. --- README.md | 2 +- docs/getting-started-guide.md | 4 ++-- examples/simple-ts/hardhat.config.ts | 4 ++-- examples/simple-ts/ignition/Multisig.ts | 2 +- examples/simple-ts/ignition/MultisigAndTimelock.ts | 2 +- examples/simple-ts/ignition/Timelock.ts | 2 +- examples/simple-ts/package.json | 2 +- examples/simple/hardhat.config.js | 4 ++-- examples/simple/ignition/MyModule.js | 2 +- examples/simple/ignition/MyOtherModule.js | 2 +- examples/simple/package.json | 2 +- package.json | 2 +- packages/core/package.json | 3 ++- packages/hardhat-plugin/README.md | 6 +++--- packages/hardhat-plugin/package.json | 7 ++++--- packages/hardhat-plugin/src/ignition-wrapper.ts | 2 +- packages/hardhat-plugin/src/index.ts | 4 ++-- packages/hardhat-plugin/src/user-modules.ts | 2 +- packages/hardhat-plugin/test/helpers.ts | 2 +- packages/hardhat-plugin/test/integration.ts | 2 +- 20 files changed, 30 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 3a683c37da..e38781a787 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay u ## Installation ```shell -npm install @nomiclabs/hardhat-ignition +npm install @nomicfoundation/hardhat-ignition ``` ## Documentation diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 440d84290f..cfd5e79084 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -5,7 +5,7 @@ Add **Ignition** to your **Hardhat** project by installing the plugin: ```shell -npm install @nomiclabs/hardhat-ignition +npm install @nomicfoundation/hardhat-ignition ``` Modify your `Hardhat.config.{ts,js}` file, to include **Ignition**: @@ -13,7 +13,7 @@ Modify your `Hardhat.config.{ts,js}` file, to include **Ignition**: ```javascript import { HardhatUserConfig, task } from "hardhat/config"; // ... -import "@nomiclabs/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition"; ``` Create an `./ignition` folder in your project root to contain your deployment modules. diff --git a/examples/simple-ts/hardhat.config.ts b/examples/simple-ts/hardhat.config.ts index d8bfb8e441..9e23a9fc49 100644 --- a/examples/simple-ts/hardhat.config.ts +++ b/examples/simple-ts/hardhat.config.ts @@ -1,5 +1,5 @@ -import { extendEnvironment } from "hardhat/config" -import "@nomiclabs/hardhat-ignition" +import { extendEnvironment } from "hardhat/config"; +import "@nomicfoundation/hardhat-ignition"; export default { solidity: "0.8.4", diff --git a/examples/simple-ts/ignition/Multisig.ts b/examples/simple-ts/ignition/Multisig.ts index 25069867b2..dce3c886d4 100644 --- a/examples/simple-ts/ignition/Multisig.ts +++ b/examples/simple-ts/ignition/Multisig.ts @@ -10,7 +10,7 @@ import { Services, Binding, Hold, -} from "@nomiclabs/hardhat-ignition"; +} from "@nomicfoundation/hardhat-ignition"; interface CallFromMultisigOptions { id: string; diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts index e821f6ea5c..6b76383433 100644 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -8,7 +8,7 @@ import { Services, Binding, Hold, -} from "@nomiclabs/hardhat-ignition"; +} from "@nomicfoundation/hardhat-ignition"; interface CallFromMultisigAndTimelockOptions { id: string; diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index 7cb7c4c1f4..22438e4beb 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -8,7 +8,7 @@ import { Contract, Services, Hold, -} from "@nomiclabs/hardhat-ignition"; +} from "@nomicfoundation/hardhat-ignition"; class TimelockCallExecutor extends Executor { public async execute( diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json index 0d4c39b4c8..5931fc5f02 100644 --- a/examples/simple-ts/package.json +++ b/examples/simple-ts/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-ignition": "^0.0.2", + "@nomicfoundation/hardhat-ignition": "^0.0.2", "@openzeppelin/contracts": "^4.3.2", "@types/chai": "^4.2.22", "@types/mocha": "^9.0.0", diff --git a/examples/simple/hardhat.config.js b/examples/simple/hardhat.config.js index ec33e0a82a..fddc711f27 100644 --- a/examples/simple/hardhat.config.js +++ b/examples/simple/hardhat.config.js @@ -1,4 +1,4 @@ -require("@nomiclabs/hardhat-ignition") +require("@nomicfoundation/hardhat-ignition"); module.exports = { solidity: "0.8.5", @@ -7,7 +7,7 @@ module.exports = { mining: { // auto: false }, - initialBaseFeePerGas: 1_000_000_000 + initialBaseFeePerGas: 1_000_000_000, }, }, }; diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index ffb4fb9669..efb8c0cc3b 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@nomiclabs/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); module.exports = buildModule("MyModule", (m) => { const foo = m.contract("Foo"); diff --git a/examples/simple/ignition/MyOtherModule.js b/examples/simple/ignition/MyOtherModule.js index 463fc53520..de811a6c46 100644 --- a/examples/simple/ignition/MyOtherModule.js +++ b/examples/simple/ignition/MyOtherModule.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@nomiclabs/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); module.exports = buildModule("MyOtherModule", (m) => { const foo = m.contract("Foo"); diff --git a/examples/simple/package.json b/examples/simple/package.json index 2dca71d5b5..b53166e528 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -4,7 +4,7 @@ "private": true, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/hardhat-ignition": "^0.0.2" + "@nomicfoundation/hardhat-ignition": "^0.0.2" }, "devDependencies": { "hardhat": "^2.6.4" diff --git a/package.json b/package.json index 2c76954405..88d656e3e0 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "root", "version": "0.0.0", - "author": "Nomic Labs LLC", + "author": "Nomic Foundation", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, "workspaces": [ diff --git a/packages/core/package.json b/packages/core/package.json index 5dd1675a92..0bdc2b8880 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,7 +1,8 @@ { - "name": "@nomiclabs/ignition-core", + "name": "@nomicfoundation/ignition-core", "version": "0.0.2", "license": "MIT", + "author": "Nomic Foundation", "main": "dist/src/index.js", "scripts": { "build": "tsc", diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index fcc47d50f6..6d4ca99b9e 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -9,19 +9,19 @@ This plugin brings **Ignition** to your **Hardhat** project, allowing you to orc ## Installation ```bash -npm install --save-dev @nomiclabs/hardhat-ignition +npm install --save-dev @nomicfoundation/hardhat-ignition ``` And add the following statement to your `hardhat.config.js`: ```js -require("@nomiclabs/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); ``` Or, if you are using TypeScript, add this to your `hardhat.config.ts`: ```js -import "@nomiclabs/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition"; ``` ## Tasks diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3f5e45b940..5f0fb9d65d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,7 +1,8 @@ { - "name": "@nomiclabs/hardhat-ignition", + "name": "@nomicfoundation/hardhat-ignition", "version": "0.0.2", "license": "MIT", + "author": "Nomic Foundation", "main": "dist/src/index.js", "scripts": { "build": "tsc", @@ -17,7 +18,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/ignition-core": "^0.0.2", + "@nomicfoundation/ignition-core": "^0.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", @@ -43,7 +44,7 @@ }, "peerDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomiclabs/ignition-core": "^0.0.2", + "@nomicfoundation/ignition-core": "^0.0.2", "hardhat": "^2.0.0" }, "dependencies": { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 68858bfd73..ff2c3f5bea 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -6,7 +6,7 @@ import { IgnitionDeployOptions, SerializedModuleResult, Providers, -} from "@nomiclabs/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { ethers } from "ethers"; import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 23f184c0a0..6bf9e0dd1b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import "@nomiclabs/hardhat-ethers"; -import { Providers, UserModule } from "@nomiclabs/ignition-core"; +import { Providers, UserModule } from "@nomicfoundation/ignition-core"; import { extendConfig, extendEnvironment, @@ -27,7 +27,7 @@ export { Services, Binding, Hold, -} from "@nomiclabs/ignition-core"; +} from "@nomicfoundation/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 8f68767902..2e1506ca3e 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -1,4 +1,4 @@ -import { UserModule } from "@nomiclabs/ignition-core"; +import { UserModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index fb3da66078..e5261177c4 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -3,7 +3,7 @@ import { SerializedBindingResult, SerializedDeploymentResult, DeploymentResult, -} from "@nomiclabs/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { assert } from "chai"; export const resultAssertions = { diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 2e5d1e8a93..67f3a09cec 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,4 +1,4 @@ -import { buildModule } from "@nomiclabs/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { From 2158d0014facbaa9e965ccaf6b3ebb0ec1544a88 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 22 Jun 2022 11:37:31 +0100 Subject: [PATCH 0027/1302] docs: add creating modules section Pull in our existing docs for creating deployment modules. --- README.md | 15 ++++++- docs/creating-modules-for-deployment.md | 53 +++++++++++++++++++++++++ docs/getting-started-guide.md | 35 ++++++---------- 3 files changed, 80 insertions(+), 23 deletions(-) create mode 100644 docs/creating-modules-for-deployment.md diff --git a/README.md b/README.md index e38781a787..337d618725 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,26 @@ Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay u ## Installation +Add **Ignition** as a plugin to an existing [Hardhat](https://hardhat.org/) project: + ```shell npm install @nomicfoundation/hardhat-ignition ``` +Modify your Hardhat.config.{ts,js} file, to include Ignition: + +```javascript +// ... +import "@nomiclabs/hardhat-ignition"; +``` + +## Getting Started + +See our [Getting started guide](./docs/getting-started-guide.md) for a worked example of **Ignition usage**. + ## Documentation -See our [Getting started guide](./docs/getting-started-guide.md) +* [Creating modules for deployment](./docs/creating-modules-for-deployment.md) ## Contributing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md new file mode 100644 index 0000000000..9ea86e23df --- /dev/null +++ b/docs/creating-modules-for-deployment.md @@ -0,0 +1,53 @@ +# Creating Modules for Deployments + +An **Ingition** deployment is composed of modules. A module is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). + +For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: + +```javascript +// ./ignition/MyModule.ts +import { buildModule, ModuleBuilder } from "@nomicfoundation/hardhat-ignition" + +export default buildModule("MyModule", (m: ModuleBuilder) => { + const token = m.contract("Token") + + return { token } +}) +``` + +Modules can be deployed directly at the cli (with `npx hardhat deploy ./ignition/MyModule.ts`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. + +During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `ModuleBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. + +## Deploying a contract + +Ignition is aware of the contracts within the `./contracts` **Hardhat** folder. Ignition can deploy any compilable local contract by name: + +```tsx +const token = m.contract("Token") +``` + +`token` here is called a **contract binding**. It represents the contract that will *eventually* be deployed. + +### Constructor arguments + +In **Solidity** contracts may have constructor arguments that need satisfied on deployment. This can be done by passing an `args` array as part of the options: + +```tsx +const token = m.contract("Token", { + args: ["My Token", "TKN", 18] +}) +``` + +### Dependencies between contracts + +If a contract needs the address of another contract as a constructor argument, the contract binding can be used: + +```tsx +const a = m.contract("A") +const b = m.contract("B", { + args: [a] +}) +``` + +You can think of this as `b` being analogue to a promise of an address, although bindings are not promises. diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index cfd5e79084..0b7dd15b4d 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -27,9 +27,9 @@ mkdir ./ignition Add a deployment module under the `./ignition` folder: ```typescript -// ./ignition/mymodule.ts +// ./ignition/MyModule.ts -import { buildModule, ModuleBuilder } from "ignition" +import { buildModule, ModuleBuilder } from "@nomiclabs/hardhat-ignition" export default buildModule("MyModule", (m: ModuleBuilder) => { const token = m.contract("Token") @@ -38,29 +38,20 @@ export default buildModule("MyModule", (m: ModuleBuilder) => { }) ``` -Use the deployment module from a **Hardhat** script: +Run the `deploy` task to test the module against a local ephemeral **Hardhat** node: -```typescript -// ./scripts/deploy.ts -import hre from "hardhat"; -import TokenModule from "../ignition/mymodule"; - -async function main() { - const { token } = await (hre as any).ignition.deploy(TokenModule); - - console.log("Token contract address", token.address); -} - -main().catch((error) => { - console.error(error); - process.exitCode = 1; -}); +```shell +npx hardhat deploy ./ignition/MyModule.ts +# No need to generate any newer typings. +# Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 ``` -Run the deployment script to test against a local ephemeral **Hardhat** node: +To deploy against a network configured in `hardhat.config.{ts,js}` pass the network name: ```shell -npx hardhat run ./scripts/deploy.ts -# No need to generate any newer typings. -# Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 +npx hardhat deploy --network mainnet ./ignition/MyModule.ts ``` + +Next, dig deeper into defining modules: + +[Creating modules for deployment](./creating-modules-for-deployment.md) From e35e0306eb3618cf77f031ab2a945b402d4025f4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Jan 2022 16:42:55 -0500 Subject: [PATCH 0028/1302] gracefully exit if user module dir not found --- packages/hardhat-plugin/src/user-modules.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 2e1506ca3e..6b2dde290d 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -11,6 +11,11 @@ export async function loadUserModules( ): Promise>> { debug(`Loading user modules from '${userModulesDirectory}'`); + if (!fsExtra.existsSync(userModulesDirectory)) { + console.warn(`Directory ${userModulesDirectory} not found.`); + process.exit(0); + } + let resolvedUserModulesPaths: string[]; if (userModulesFiles.length === 0) { debug("No files passed, reading all module files"); From 864fe5a54a52997d9b9cb220eb79655c47a5b034 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 29 Jun 2022 16:13:26 -0400 Subject: [PATCH 0029/1302] add test for nonexistent user module --- packages/hardhat-plugin/src/user-modules.ts | 3 +-- packages/hardhat-plugin/test/user-modules.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 packages/hardhat-plugin/test/user-modules.ts diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 6b2dde290d..29dd450e72 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -12,8 +12,7 @@ export async function loadUserModules( debug(`Loading user modules from '${userModulesDirectory}'`); if (!fsExtra.existsSync(userModulesDirectory)) { - console.warn(`Directory ${userModulesDirectory} not found.`); - process.exit(0); + throw new Error(`Directory ${userModulesDirectory} not found.`); } let resolvedUserModulesPaths: string[]; diff --git a/packages/hardhat-plugin/test/user-modules.ts b/packages/hardhat-plugin/test/user-modules.ts new file mode 100644 index 0000000000..7f28452862 --- /dev/null +++ b/packages/hardhat-plugin/test/user-modules.ts @@ -0,0 +1,16 @@ +import { assert } from "chai"; + +import { loadUserModules } from "../src/user-modules"; + +import { useEnvironment } from "./useEnvironment"; + +describe("User modules", function () { + useEnvironment("minimal"); + + it("should exit with a warning if given a user module directory that does not exist", async () => { + await assert.isRejected( + loadUserModules("/fake", []), + `Directory /fake not found.` + ); + }); +}); From 42bac3f1a07b6400601443357fffb30d7e1bc2ed Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 29 Jun 2022 16:21:28 -0400 Subject: [PATCH 0030/1302] update workflows --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1bc22aaba1..797a75fb0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,13 +9,13 @@ on: jobs: test_on_windows: - name: Test Ignition on Windows with Node 12 + name: Test Ignition on Windows with Node 14 runs-on: windows-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 cache: yarn - name: Install run: yarn --frozen-lockfile @@ -27,13 +27,13 @@ jobs: run: yarn test test_on_macos: - name: Test Ignition on MacOS with Node 12 + name: Test Ignition on MacOS with Node 14 runs-on: macos-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: 12 + node-version: 14 cache: yarn - name: Install run: yarn --frozen-lockfile @@ -49,7 +49,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [12, 14, 16] + node: [14, 16, 18] steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 From 723b421d001674e27961144d023c87b1d1424410 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 23 Jun 2022 15:05:55 +0100 Subject: [PATCH 0031/1302] feat: support existing contracts To support dependencies on contract that are already deployed we now allow: ```javascript const abi = [{...}]; const uniswap = m.contractAt("UniswapRouter", '0x1234...', abi); ``` --- docs/creating-modules-for-deployment.md | 11 + packages/core/package.json | 1 + packages/core/src/bindings/ContractBinding.ts | 7 +- .../src/bindings/ExistingContractBinding.ts | 13 + packages/core/src/bindings/types.ts | 6 + packages/core/src/execution-engine.ts | 2 +- packages/core/src/executors.ts | 300 ------------------ packages/core/src/executors/CallExecutor.ts | 2 +- .../core/src/executors/ContractExecutor.ts | 6 +- .../executors/{executors.ts => Executor.ts} | 13 +- .../src/executors/ExistingContractExecutor.ts | 48 +++ packages/core/src/executors/Hold.ts | 9 + packages/core/src/index.ts | 3 +- packages/core/src/modules.ts | 254 --------------- packages/core/src/modules/ExecutionGraph.ts | 2 +- packages/core/src/modules/IgnitionModule.ts | 2 +- .../core/src/modules/ModuleBuilderImpl.ts | 36 ++- packages/core/src/modules/types.ts | 10 +- packages/core/src/types.ts | 3 + .../test/bindings/existingContractBinding.ts | 18 ++ .../executors/ExistingContractExecutor.ts | 44 +++ packages/core/test/helpers.ts | 3 +- packages/hardhat-plugin/test/integration.ts | 49 ++- 23 files changed, 260 insertions(+), 582 deletions(-) create mode 100644 packages/core/src/bindings/ExistingContractBinding.ts delete mode 100644 packages/core/src/executors.ts rename packages/core/src/executors/{executors.ts => Executor.ts} (90%) create mode 100644 packages/core/src/executors/ExistingContractExecutor.ts create mode 100644 packages/core/src/executors/Hold.ts delete mode 100644 packages/core/src/modules.ts create mode 100644 packages/core/test/bindings/existingContractBinding.ts create mode 100644 packages/core/test/executors/ExistingContractExecutor.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 9ea86e23df..7c82d2f6f7 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -51,3 +51,14 @@ const b = m.contract("B", { ``` You can think of this as `b` being analogue to a promise of an address, although bindings are not promises. + +### Using an existing contract + +A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and abi: + +```tsx +const abi = [{...}] +const uniswap = m.contractAt("UniswapRouter", "0x123...", abi) + +m.call(uniswap, "swap", { ... }) +``` diff --git a/packages/core/package.json b/packages/core/package.json index 0bdc2b8880..4589b6a6e2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -44,6 +44,7 @@ "typescript": "^4.7.4" }, "dependencies": { + "@ethersproject/address": "5.6.1", "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", diff --git a/packages/core/src/bindings/ContractBinding.ts b/packages/core/src/bindings/ContractBinding.ts index 4a63e74e46..43d60e3cdd 100644 --- a/packages/core/src/bindings/ContractBinding.ts +++ b/packages/core/src/bindings/ContractBinding.ts @@ -1,6 +1,9 @@ import { Contract } from "../types"; import { Binding } from "./Binding"; -import { ContractOptions } from "./types"; +import { ContractOptions, ExistingContractOptions } from "./types"; -export class ContractBinding extends Binding {} +export class ContractBinding extends Binding< + ContractOptions | ExistingContractOptions, + Contract +> {} diff --git a/packages/core/src/bindings/ExistingContractBinding.ts b/packages/core/src/bindings/ExistingContractBinding.ts new file mode 100644 index 0000000000..9a7bd291e3 --- /dev/null +++ b/packages/core/src/bindings/ExistingContractBinding.ts @@ -0,0 +1,13 @@ +import { Contract } from "../types"; + +import { InternalBinding } from "./InternalBinding"; +import type { ExistingContractOptions } from "./types"; + +export class ExistingContractBinding extends InternalBinding< + ExistingContractOptions, + Contract +> { + public getDependencies(): InternalBinding[] { + return []; + } +} diff --git a/packages/core/src/bindings/types.ts b/packages/core/src/bindings/types.ts index bcf44f6b33..6b4ab2cb68 100644 --- a/packages/core/src/bindings/types.ts +++ b/packages/core/src/bindings/types.ts @@ -17,6 +17,12 @@ export interface ContractOptions { args: Array>; } +export interface ExistingContractOptions { + contractName: string; + address: string; + abi: any[]; +} + export interface CallOptions { contract: ContractBinding; method: string; diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index c27058cb1f..f098bfe315 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,7 +1,7 @@ import setupDebug from "debug"; import { InternalBinding } from "./bindings/InternalBinding"; -import { +import type { ModuleResult, SerializedDeploymentResult, SerializedModuleResult, diff --git a/packages/core/src/executors.ts b/packages/core/src/executors.ts deleted file mode 100644 index 92cab91a82..0000000000 --- a/packages/core/src/executors.ts +++ /dev/null @@ -1,300 +0,0 @@ -import setupDebug, { IDebugger } from "debug"; -import { ethers } from "ethers"; - -import { InternalBinding } from "./bindings/InternalBinding"; -import { InternalContractBinding } from "./bindings/InternalContractBinding"; -import { - BindingOutput, - CallOptions, - ContractOptions, - Resolved, -} from "./bindings/types"; -import { BindingState } from "./deployment-state"; -import { Services } from "./services/types"; -import { Contract, Tx } from "./types"; - -/** - * An instance of this class is thrown to indicate that the executor is waiting - * for some external event to happen, like a multisig that needs extra - * confirmations or a timelocked contract. - */ -export class Hold { - constructor(public readonly reason: string) {} -} - -export abstract class Executor { - private _dummyInput!: I; - private _dummyOutput!: O; - private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; - private result?: any; - private error?: any; - private holdReason?: string; - private _debug: IDebugger; - - constructor(public readonly binding: InternalBinding) { - const moduleId = binding.moduleId; - const bindingId = binding.id; - this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); - } - - abstract execute(input: Resolved, services: Services): Promise; - abstract validate(input: I, services: Services): Promise; - abstract getDescription(): string; - - public async run( - input: Resolved, - services: Services, - onStateChange: (newState: BindingState) => void - ) { - try { - this._debug("Start running"); - this._setRunning(); - onStateChange(BindingState.running()); - const result = await this.execute(input, services); - this._debug("Ended successfully"); - this._setSuccess(result); - onStateChange(BindingState.success(result)); - } catch (e: any) { - if (e instanceof Hold) { - this._debug("Ended with hold"); - this._setHold(e.reason); - onStateChange(BindingState.hold(e.reason)); - } else { - this._debug("Ended with error"); - this._setFailure(e); - onStateChange(BindingState.failure(e)); - } - } - } - - public isReady() { - return this.state === "ready"; - } - - public isRunning() { - return this.state === "running"; - } - - public isHold() { - return this.state === "hold"; - } - - public getHoldReason(): string { - if (this.holdReason === undefined) { - throw new Error( - `[executor ${this.binding.id}] assertion error: no hold reason` - ); - } - - return this.holdReason; - } - - public isSuccess() { - return this.state === "success"; - } - - public getResult() { - if (this.result === undefined) { - throw new Error( - `[executor ${this.binding.id}] assertion error: no result` - ); - } - - return this.result; - } - - public isFailure() { - return this.state === "failure"; - } - - public getError() { - if (this.error === undefined) { - throw new Error("assertion error"); - } - - return this.error; - } - - private _setRunning() { - this.state = "running"; - } - private _setHold(reason: string) { - this.state = "hold"; - this.holdReason = reason; - } - private _setSuccess(result: any) { - this.state = "success"; - this.result = result; - } - private _setFailure(err: Error) { - this.state = "failure"; - this.error = err; - } -} - -export class ContractExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const { contractName } = input; - const artifact = await services.artifacts.getArtifact(contractName); - - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; - - const args = input.args.map(mapToAddress); - const txHash = await services.contracts.deploy(artifact, args); - - const receipt = await services.transactions.wait(txHash); - - return { - name: contractName, - abi: artifact.abi, - address: receipt.contractAddress, - bytecode: artifact.bytecode, - }; - } - - public async validate( - input: ContractOptions, - services: Services - ): Promise { - const artifactExists = await services.artifacts.hasArtifact( - input.contractName - ); - - if (!artifactExists) { - return [`Artifact with name '${input.contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(input.contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return [ - `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - ]; - } - - return []; - } - - public getDescription() { - return `Deploy contract ${this.binding.input.contractName}`; - } -} - -export class CallExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const { contract, method } = input; - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; - - const args = input.args.map(mapToAddress); - const txHash = await services.contracts.call( - contract.address, - contract.abi, - method, - args - ); - - await services.transactions.wait(txHash); - - return { - hash: txHash, - }; - } - - public async validate( - input: CallOptions, - services: Services - ): Promise { - const contractName = (input.contract as InternalContractBinding).input - .contractName; - const artifactExists = await services.artifacts.hasArtifact(contractName); - - if (!artifactExists) { - return [`Artifact with name '${contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const functionFragments = iface.fragments.filter( - (f) => f.name === input.method - ); - - if (functionFragments.length === 0) { - return [ - `Contract '${contractName}' doesn't have a function ${input.method}`, - ]; - } - - const matchingFunctionFragments = functionFragments.filter( - (f) => f.inputs.length === argsLength - ); - - if (matchingFunctionFragments.length === 0) { - if (functionFragments.length === 1) { - return [ - `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, - ]; - } else { - return [ - `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, - ]; - } - } - - return []; - } - - public getDescription() { - const contractName = ( - this.binding.input.contract as InternalContractBinding - ).input.contractName; - return `Call method ${this.binding.input.method} in contract ${contractName}`; - } -} diff --git a/packages/core/src/executors/CallExecutor.ts b/packages/core/src/executors/CallExecutor.ts index c921f04cad..11840f5cf2 100644 --- a/packages/core/src/executors/CallExecutor.ts +++ b/packages/core/src/executors/CallExecutor.ts @@ -5,7 +5,7 @@ import { CallOptions, Resolved } from "../bindings/types"; import { Services } from "../services/types"; import { Tx } from "../types"; -import { Executor } from "./executors"; +import { Executor } from "./Executor"; export class CallExecutor extends Executor { public async execute( diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts index 8ea5cc3547..25b41e7e7f 100644 --- a/packages/core/src/executors/ContractExecutor.ts +++ b/packages/core/src/executors/ContractExecutor.ts @@ -2,15 +2,15 @@ import { ethers } from "ethers"; import { ContractOptions, Resolved } from "../bindings/types"; import { Services } from "../services/types"; -import { Contract } from "../types"; +import type { Contract, DeployedContract } from "../types"; -import { Executor } from "./executors"; +import { Executor } from "./Executor"; export class ContractExecutor extends Executor { public async execute( input: Resolved, services: Services - ): Promise { + ): Promise { const { contractName } = input; const artifact = await services.artifacts.getArtifact(contractName); diff --git a/packages/core/src/executors/executors.ts b/packages/core/src/executors/Executor.ts similarity index 90% rename from packages/core/src/executors/executors.ts rename to packages/core/src/executors/Executor.ts index 83c56f141b..3ade567f03 100644 --- a/packages/core/src/executors/executors.ts +++ b/packages/core/src/executors/Executor.ts @@ -3,16 +3,9 @@ import setupDebug, { IDebugger } from "debug"; import { InternalBinding } from "../bindings/InternalBinding"; import { BindingOutput, Resolved } from "../bindings/types"; import { BindingState } from "../deployment-state"; -import { Services } from "../services/types"; - -/** - * An instance of this class is thrown to indicate that the executor is waiting - * for some external event to happen, like a multisig that needs extra - * confirmations or a timelocked contract. - */ -export class Hold { - constructor(public readonly reason: string) {} -} +import type { Services } from "../services/types"; + +import { Hold } from "./Hold"; export abstract class Executor { private _dummyInput!: I; diff --git a/packages/core/src/executors/ExistingContractExecutor.ts b/packages/core/src/executors/ExistingContractExecutor.ts new file mode 100644 index 0000000000..72313989cd --- /dev/null +++ b/packages/core/src/executors/ExistingContractExecutor.ts @@ -0,0 +1,48 @@ +import { isAddress } from "@ethersproject/address"; + +import { ExistingContractOptions } from "../bindings/types"; +import { Services } from "../services/types"; +import { Contract } from "../types"; + +import { Executor } from "./Executor"; + +export class ExistingContractExecutor extends Executor< + ExistingContractOptions, + Contract +> { + public async execute( + { + contractName: name, + address, + abi, + }: { + contractName: string; + address: string; + abi: any[]; + }, + _services: Services + ): Promise { + return { + name, + abi, + address, + }; + } + + public async validate( + input: ExistingContractOptions, + _services: Services + ): Promise { + if (!isAddress(input.address)) { + return [ + `The existing contract ${this.binding.input.contractName} is an invalid address ${input.address}`, + ]; + } + + return []; + } + + public getDescription() { + return `Using existing contract ${this.binding.input.contractName} (${this.binding.input.address})`; + } +} diff --git a/packages/core/src/executors/Hold.ts b/packages/core/src/executors/Hold.ts new file mode 100644 index 0000000000..beefa11265 --- /dev/null +++ b/packages/core/src/executors/Hold.ts @@ -0,0 +1,9 @@ +/** + * An instance of this class is thrown to indicate that the executor is waiting + * for some external event to happen, like a multisig that needs extra + * confirmations or a timelocked contract. + */ + +export class Hold { + constructor(public readonly reason: string) {} +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b956c01f7d..d713c1368a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -10,7 +10,8 @@ export type { SerializedBindingResult, } from "./bindings/types"; -export { Executor, Hold } from "./executors/executors"; +export { Executor } from "./executors/Executor"; +export { Hold } from "./executors/Hold"; export { buildModule } from "./modules/buildModule"; export type { ModuleBuilder } from "./modules/types"; diff --git a/packages/core/src/modules.ts b/packages/core/src/modules.ts deleted file mode 100644 index 240db2990c..0000000000 --- a/packages/core/src/modules.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { CallBinding } from "./bindings/CallBinding"; -import { ContractBinding } from "./bindings/ContractBinding"; -import { InternalBinding } from "./bindings/InternalBinding"; -import { InternalCallBinding } from "./bindings/InternalCallBinding"; -import { InternalContractBinding } from "./bindings/InternalContractBinding"; -import { Bindable, CallOptions, ContractOptions } from "./bindings/types"; -import { CallExecutor } from "./executors/CallExecutor"; -import { ContractExecutor } from "./executors/ContractExecutor"; -import { Executor } from "./executors/executors"; -import { Contract, Tx } from "./types"; - -export class IgnitionModule { - constructor(public readonly id: string, private _executors: Executor[]) {} - - public getSortedExecutors(): Executor[] { - const dependencies = new Map>(); - - for (const executor of this._executors) { - const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); - - for (const executorDependency of executor.binding.getDependencies()) { - if (executorDependency.moduleId === executor.binding.moduleId) { - executorDependencies.add(executorDependency.id); - } - } - - dependencies.set(executor.binding.id, executorDependencies); - } - - const added = new Set(); - const sortedExecutors: Executor[] = []; - - while (added.size < this._executors.length) { - for (const executor of this._executors) { - if (added.has(executor.binding.id)) { - continue; - } - - const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); - if ([...executorDependencies].every((d) => added.has(d))) { - sortedExecutors.push(executor); - added.add(executor.binding.id); - } - } - } - - return sortedExecutors; - } -} - -export class ExecutionGraph { - private _modules: Map> = new Map(); - private _dependencies: Map> = new Map(); - - public addExecutor(executor: Executor) { - const moduleId = executor.binding.moduleId; - let executorsMap = this._modules.get(moduleId); - if (executorsMap === undefined) { - executorsMap = new Map(); - this._modules.set(moduleId, executorsMap); - } - - if (executorsMap.has(executor.binding.id)) { - throw new Error(`Executor with id ${executor.binding.id} already exists`); - } - - const dependencies = executor.binding.getDependencies(); - for (const dependency of dependencies) { - this._addDependency(moduleId, dependency.moduleId); - } - - executorsMap.set(executor.binding.id, executor); - } - - public getModule(moduleId: string): IgnitionModule | undefined { - const executorsMap = this._modules.get(moduleId); - if (executorsMap === undefined) { - return undefined; - } - - return new IgnitionModule(moduleId, [...executorsMap.values()]); - } - - public getSortedModules(): IgnitionModule[] { - const added = new Set(); - const ignitionModules = this._getModules(); - const sortedModules: IgnitionModule[] = []; - - while (added.size < ignitionModules.length) { - for (const ignitionModule of ignitionModules) { - if (added.has(ignitionModule.id)) { - continue; - } - - const dependencies = - this._dependencies.get(ignitionModule.id) ?? new Set(); - if ([...dependencies].every((d) => added.has(d))) { - sortedModules.push(ignitionModule); - added.add(ignitionModule.id); - } - } - } - - return sortedModules; - } - - private _addDependency(moduleId: string, dependencyModuleId: string) { - if (moduleId !== dependencyModuleId) { - const dependencies = - this._dependencies.get(moduleId) ?? new Set(); - dependencies.add(dependencyModuleId); - this._dependencies.set(moduleId, dependencies); - } - } - - private _getModules(): IgnitionModule[] { - return [...this._modules.entries()].map( - ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) - ); - } -} - -interface UserContractOptions { - id?: string; - args?: Array>; -} - -interface UserCallOptions { - id?: string; - args?: Array>; -} - -export interface ModuleBuilder { - getModuleId: () => string; - addExecutor: (executor: Executor) => void; - - contract: ( - contractName: string, - options?: UserContractOptions - ) => ContractBinding; - - call: ( - contract: ContractBinding, - method: string, - options?: UserCallOptions - ) => CallBinding; - - useModule: (userModule: UserModule) => T; -} - -export class ModuleBuilderImpl implements ModuleBuilder { - private _currentModuleId: string | undefined; - private _executionGraph = new ExecutionGraph(); - private _executors: Executor[] = []; - private _knownModules: Map, any]> = new Map(); - - constructor() {} - - public getModuleId(): string { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); - } - - return this._currentModuleId; - } - - public buildExecutionGraph(): ExecutionGraph { - return this._executionGraph; - } - - public addExecutor(executor: Executor) { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); - } - - this._executionGraph.addExecutor(executor); - } - - public contract( - contractName: string, - options?: UserContractOptions - ): InternalBinding { - const id = options?.id ?? contractName; - const args = options?.args ?? []; - const b = new InternalContractBinding(this.getModuleId(), id, { - contractName, - args, - }); - - this.addExecutor(new ContractExecutor(b)); - - return b; - } - - public call( - contract: ContractBinding, - method: string, - options?: UserCallOptions - ): InternalBinding { - const id = - options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; - const args = options?.args ?? []; - const b = new InternalCallBinding(this.getModuleId(), id, { - contract, - method, - args, - }); - - this.addExecutor(new CallExecutor(b)); - - return b; - } - - public useModule(userModule: UserModule): T { - const knownModuleAndOutput = this._knownModules.get(userModule.id); - if (knownModuleAndOutput !== undefined) { - const [knownModule, knownOutput] = knownModuleAndOutput; - if (userModule === knownModule) { - return knownOutput; - } else { - throw new Error(`Module with id ${userModule.id} already exists`); - } - } - - const previousModuleId = this._currentModuleId; - this._currentModuleId = userModule.id; - const output = userModule.definition(this); - this._currentModuleId = previousModuleId; - - this._knownModules.set(userModule.id, [userModule, output]); - - return output; - } -} - -type ModuleDefinition = (m: ModuleBuilder) => T; - -export class UserModule { - public readonly version = 1; - - constructor( - public readonly id: string, - public readonly definition: ModuleDefinition - ) {} -} - -export function buildModule( - moduleId: string, - moduleDefinition: ModuleDefinition -): UserModule { - return new UserModule(moduleId, moduleDefinition); -} diff --git a/packages/core/src/modules/ExecutionGraph.ts b/packages/core/src/modules/ExecutionGraph.ts index eb53c87b1f..1e09abdae8 100644 --- a/packages/core/src/modules/ExecutionGraph.ts +++ b/packages/core/src/modules/ExecutionGraph.ts @@ -1,4 +1,4 @@ -import { Executor } from "../executors/executors"; +import { Executor } from "../executors/Executor"; import { IgnitionModule } from "./IgnitionModule"; diff --git a/packages/core/src/modules/IgnitionModule.ts b/packages/core/src/modules/IgnitionModule.ts index e9c7efaf2d..70cc919cc1 100644 --- a/packages/core/src/modules/IgnitionModule.ts +++ b/packages/core/src/modules/IgnitionModule.ts @@ -1,4 +1,4 @@ -import { Executor } from "../executors/executors"; +import { Executor } from "../executors/Executor"; export class IgnitionModule { constructor(public readonly id: string, private _executors: Executor[]) {} diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 4b34be87a1..761da24514 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -1,16 +1,26 @@ import { ContractBinding } from "../bindings/ContractBinding"; +import { ExistingContractBinding } from "../bindings/ExistingContractBinding"; import { InternalBinding } from "../bindings/InternalBinding"; import { InternalCallBinding } from "../bindings/InternalCallBinding"; import { InternalContractBinding } from "../bindings/InternalContractBinding"; -import { CallOptions, ContractOptions } from "../bindings/types"; +import type { + CallOptions, + ContractOptions, + ExistingContractOptions, +} from "../bindings/types"; import { CallExecutor } from "../executors/CallExecutor"; import { ContractExecutor } from "../executors/ContractExecutor"; -import { Executor } from "../executors/executors"; -import { Contract, Tx } from "../types"; +import { Executor } from "../executors/Executor"; +import { ExistingContractExecutor } from "../executors/ExistingContractExecutor"; +import type { Contract, Tx } from "../types"; import { ExecutionGraph } from "./ExecutionGraph"; import { UserModule } from "./UserModule"; -import { ModuleBuilder, UserContractOptions, UserCallOptions } from "./types"; +import type { + ModuleBuilder, + UserContractOptions, + UserCallOptions, +} from "./types"; export class ModuleBuilderImpl implements ModuleBuilder { private _currentModuleId: string | undefined; @@ -56,6 +66,24 @@ export class ModuleBuilderImpl implements ModuleBuilder { return b; } + public contractAt( + contractName: string, + address: string, + abi: any[] + ): InternalBinding { + const id = contractName; + + const binding = new ExistingContractBinding(this.getModuleId(), id, { + contractName, + address, + abi, + }); + + this.addExecutor(new ExistingContractExecutor(binding)); + + return binding; + } + public call( contract: ContractBinding, method: string, diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 854a6505a7..71938b39aa 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -1,7 +1,7 @@ import { CallBinding } from "../bindings/CallBinding"; import { ContractBinding } from "../bindings/ContractBinding"; -import { Bindable } from "../bindings/types"; -import { Executor } from "../executors/executors"; +import type { Bindable } from "../bindings/types"; +import { Executor } from "../executors/Executor"; import { UserModule } from "./UserModule"; @@ -24,6 +24,12 @@ export interface ModuleBuilder { options?: UserContractOptions ) => ContractBinding; + contractAt: ( + contractName: string, + address: string, + abi: any[] + ) => ContractBinding; + call: ( contract: ContractBinding, method: string, diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 0bdc204676..c4920950c2 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -7,6 +7,9 @@ export interface Contract { name: string; address: string; abi: any[]; +} + +export interface DeployedContract extends Contract { bytecode: string; } diff --git a/packages/core/test/bindings/existingContractBinding.ts b/packages/core/test/bindings/existingContractBinding.ts new file mode 100644 index 0000000000..9832cbf833 --- /dev/null +++ b/packages/core/test/bindings/existingContractBinding.ts @@ -0,0 +1,18 @@ +import { assert } from "chai"; + +import { ExistingContractBinding } from "../../src/bindings/ExistingContractBinding"; +import { ExistingContractOptions } from "../../src/bindings/types"; + +describe("Existing Contract - binding", () => { + it("has no dependencies", () => { + const input: ExistingContractOptions = { + contractName: "MyContract", + address: "0x0000000000000000000000000000000000000000", + abi: [], + }; + + const binding = new ExistingContractBinding("MyModule", "binding-1", input); + + assert.deepStrictEqual(binding.getDependencies(), []); + }); +}); diff --git a/packages/core/test/executors/ExistingContractExecutor.ts b/packages/core/test/executors/ExistingContractExecutor.ts new file mode 100644 index 0000000000..cdc9429da6 --- /dev/null +++ b/packages/core/test/executors/ExistingContractExecutor.ts @@ -0,0 +1,44 @@ +import { assert } from "chai"; + +import { ExistingContractBinding } from "../../src/bindings/ExistingContractBinding"; +import { ExistingContractExecutor } from "../../src/executors/ExistingContractExecutor"; +import { ExistingContractOptions } from "../bindings/types"; + +describe("Existing Contract - Executor", () => { + describe("validate", () => { + it("should pass on a valid address", async () => { + const input: ExistingContractOptions = { + contractName: "MyContract", + address: "0x0000000000000000000000000000000000000000", + abi: [], + }; + + await assertExistingContractValidation(input, []); + }); + + it("should fail on a bad address", async () => { + const input: ExistingContractOptions = { + contractName: "MyContract", + address: "0x123", + abi: [], + }; + + await assertExistingContractValidation(input, [ + "The existing contract MyContract is an invalid address 0x123", + ]); + }); + }); +}); + +async function assertExistingContractValidation( + input: ExistingContractOptions, + expected: string[] +) { + const binding = new ExistingContractBinding("MyModule", "binding-1", input); + + const ex = new ExistingContractExecutor(binding); + + const validationResult = await ex.validate(input, {} as any); + + assert.deepStrictEqual(validationResult, expected); +} diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 369f527f9e..03bb5053c2 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,7 +1,8 @@ import { InternalBinding } from "../src/bindings/InternalBinding"; import { Bindable } from "../src/bindings/types"; import { DeploymentState } from "../src/deployment-state"; -import { Executor, Hold } from "../src/executors/executors"; +import { Executor } from "../src/executors/Executor"; +import { Hold } from "../src/executors/Hold"; import { ArtifactsProvider, EIP1193Provider, diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 67f3a09cec..9255161d39 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -1,4 +1,4 @@ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { buildModule, Contract } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { @@ -181,6 +181,49 @@ describe("integration tests", function () { }); }); + it("should deploy using existing contract", async function () { + // given + const originalModule = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const originalDeploymentResult = await deployModules( + this.hre, + [originalModule], + [1] + ); + + if (!isContract(originalDeploymentResult.FooModule.Foo.value)) { + assert.fail("Expected contract deployed"); + } + + const { address, abi } = originalDeploymentResult.FooModule.Foo.value; + + const leveragingExistingModule = buildModule("ExistingFooModule", (m) => { + const existingFoo = m.contractAt("ExistingFoo", address, abi); + + return { existingFoo }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [leveragingExistingModule], + [1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + ExistingFooModule: { + ExistingFoo: resultAssertions.contract(async (existingFoo) => { + assert.isTrue(await existingFoo.isFoo()); + }), + }, + }); + }); + it("should fail if a call fails", async function () { // given const userModule = buildModule("MyModule", (m) => { @@ -195,3 +238,7 @@ describe("integration tests", function () { await assert.isRejected(deployModules(this.hre, [userModule], [1, 1])); }); }); + +function isContract(contract: any): contract is Contract { + return contract.address !== undefined; +} From bec65c96d388ff3b0c27dba2c0cd24dcda0acac5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 30 Jun 2022 11:39:49 +0100 Subject: [PATCH 0032/1302] feat: support library linking (#21) Contracts that require linking to libraries can be deployed by including a `libraries` option: ```javascript const exampleLib = m.contract("ExampleLib"); const token = m.contract("Token", { libraries: { ExampleLib: exampleLib } }); ``` The linking has been taken from core hardhat and replicated here. Co-authored-by: Morgan --- .vscode/launch.json | 41 ++++ docs/creating-modules-for-deployment.md | 15 ++ packages/core/.mocharc.json | 3 +- packages/core/package.json | 1 + .../src/bindings/InternalContractBinding.ts | 7 +- packages/core/src/bindings/types.ts | 1 + packages/core/src/collectLibrariesAndLink.ts | 143 +++++++++++ packages/core/src/deployment-state.ts | 4 +- packages/core/src/execution-engine.ts | 1 + .../core/src/executors/ContractExecutor.ts | 9 +- packages/core/src/link | 0 .../core/src/modules/ModuleBuilderImpl.ts | 2 + packages/core/src/modules/types.ts | 1 + .../core/src/services/ContractsService.ts | 7 +- packages/core/src/types.ts | 5 + packages/core/test/collectLibrariesAndLink.ts | 231 ++++++++++++++++++ packages/core/test/setup.ts | 4 + packages/hardhat-plugin/package.json | 2 +- .../minimal/contracts/WithLibrary.sol | 18 ++ packages/hardhat-plugin/test/integration.ts | 93 +++++++ yarn.lock | 2 +- 21 files changed, 582 insertions(+), 8 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 packages/core/src/collectLibrariesAndLink.ts create mode 100644 packages/core/src/link create mode 100644 packages/core/test/collectLibrariesAndLink.ts create mode 100644 packages/core/test/setup.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000000..2a5958bcdb --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,41 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Debug core tests", + "internalConsoleOptions": "openOnSessionStart", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "request": "launch", + "skipFiles": ["/**"], + "type": "pwa-node", + "cwd": "${workspaceFolder}/packages/core", + "args": [ + "--no-timeouts", + "--colors", + "${workspaceFolder}/packages/core/test/**/*.ts" + ], + "env": { + "TS_NODE_FILES": "true", + "DEBUG": "hardhat-ignition:*,ignition:*" + } + }, + { + "name": "Debug integration tests", + "internalConsoleOptions": "openOnSessionStart", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "request": "launch", + "skipFiles": ["/**"], + "type": "pwa-node", + "cwd": "${workspaceFolder}/packages/hardhat-plugin", + "args": [ + "--no-timeouts", + "--colors", + "${workspaceFolder}/packages/hardhat-plugin/test/**/*.ts" + ], + "env": { + "TS_NODE_FILES": "true", + "DEBUG": "hardhat-ignition:*,ignition:*" + } + } + ] +} diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 7c82d2f6f7..3beb3947fa 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -62,3 +62,18 @@ const uniswap = m.contractAt("UniswapRouter", "0x123...", abi) m.call(uniswap, "swap", { ... }) ``` + +### Linking libraries + +A library can be deployed and linked to a contract by passing the libraries contract binding as a named entry under the libraries option: + +```tsx +const safeMath = m.contract("SafeMath") +const contract = m.contract("Contract", { + libraries: { + SafeMath: safeMath + } +}) +``` + +A library is deployed in the same way as a contract. diff --git a/packages/core/.mocharc.json b/packages/core/.mocharc.json index 5ec3aeaca2..5a0ec255ae 100644 --- a/packages/core/.mocharc.json +++ b/packages/core/.mocharc.json @@ -1,3 +1,4 @@ { - "require": "ts-node/register/transpile-only" + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts" } diff --git a/packages/core/package.json b/packages/core/package.json index 4589b6a6e2..1f71577a7e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -29,6 +29,7 @@ "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", + "chai-as-promised": "7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", diff --git a/packages/core/src/bindings/InternalContractBinding.ts b/packages/core/src/bindings/InternalContractBinding.ts index 28c291a9fd..2e8daf3b22 100644 --- a/packages/core/src/bindings/InternalContractBinding.ts +++ b/packages/core/src/bindings/InternalContractBinding.ts @@ -25,7 +25,12 @@ export class InternalContractBinding extends InternalBinding< return []; }; - const dependencies = deepFlatten(mapToBindings(this.input.args)); + const argBindings = deepFlatten(mapToBindings(this.input.args)); + const libraryBindings = deepFlatten( + mapToBindings(Object.values(this.input.libraries ?? {})) + ); + + const dependencies = argBindings.concat(libraryBindings); return dependencies; } diff --git a/packages/core/src/bindings/types.ts b/packages/core/src/bindings/types.ts index 6b4ab2cb68..231cef29a3 100644 --- a/packages/core/src/bindings/types.ts +++ b/packages/core/src/bindings/types.ts @@ -15,6 +15,7 @@ export type SerializedDeploymentResult = Record; export interface ContractOptions { contractName: string; args: Array>; + libraries?: Record>; } export interface ExistingContractOptions { diff --git a/packages/core/src/collectLibrariesAndLink.ts b/packages/core/src/collectLibrariesAndLink.ts new file mode 100644 index 0000000000..7b67f65948 --- /dev/null +++ b/packages/core/src/collectLibrariesAndLink.ts @@ -0,0 +1,143 @@ +// eslint-disable-next-line import/no-extraneous-dependencies +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +import { Artifact } from "./types"; + +interface Link { + sourceName: string; + libraryName: string; + address: string; +} + +export interface Libraries { + [libraryName: string]: string; +} + +const pluginName = "ignition"; + +export async function collectLibrariesAndLink( + artifact: Artifact, + libraries: Libraries +) { + const { utils } = await import("ethers"); + + const neededLibraries: Array<{ + sourceName: string; + libName: string; + }> = []; + for (const [sourceName, sourceLibraries] of Object.entries( + artifact.linkReferences + )) { + for (const libName of Object.keys(sourceLibraries)) { + neededLibraries.push({ sourceName, libName }); + } + } + + const linksToApply: Map = new Map(); + for (const [linkedLibraryName, linkedLibraryAddress] of Object.entries( + libraries + )) { + if (!utils.isAddress(linkedLibraryAddress)) { + throw new NomicLabsHardhatPluginError( + pluginName, + `You tried to link the contract ${artifact.contractName} with the library ${linkedLibraryName}, but provided this invalid address: ${linkedLibraryAddress}` + ); + } + + const matchingNeededLibraries = neededLibraries.filter((lib) => { + return ( + lib.libName === linkedLibraryName || + `${lib.sourceName}:${lib.libName}` === linkedLibraryName + ); + }); + + if (matchingNeededLibraries.length === 0) { + let detailedMessage: string; + if (neededLibraries.length > 0) { + const libraryFQNames = neededLibraries + .map((lib) => `${lib.sourceName}:${lib.libName}`) + .map((x) => `* ${x}`) + .join("\n"); + detailedMessage = `The libraries needed are: +${libraryFQNames}`; + } else { + detailedMessage = "This contract doesn't need linking any libraries."; + } + throw new NomicLabsHardhatPluginError( + pluginName, + `You tried to link the contract ${artifact.contractName} with ${linkedLibraryName}, which is not one of its libraries. +${detailedMessage}` + ); + } + + if (matchingNeededLibraries.length > 1) { + const matchingNeededLibrariesFQNs = matchingNeededLibraries + .map(({ sourceName, libName }) => `${sourceName}:${libName}`) + .map((x) => `* ${x}`) + .join("\n"); + throw new NomicLabsHardhatPluginError( + pluginName, + `The library name ${linkedLibraryName} is ambiguous for the contract ${artifact.contractName}. +It may resolve to one of the following libraries: +${matchingNeededLibrariesFQNs} +To fix this, choose one of these fully qualified library names and replace where appropriate.` + ); + } + + const [neededLibrary] = matchingNeededLibraries; + + const neededLibraryFQN = `${neededLibrary.sourceName}:${neededLibrary.libName}`; + + // The only way for this library to be already mapped is + // for it to be given twice in the libraries user input: + // once as a library name and another as a fully qualified library name. + if (linksToApply.has(neededLibraryFQN)) { + throw new NomicLabsHardhatPluginError( + pluginName, + `The library names ${neededLibrary.libName} and ${neededLibraryFQN} refer to the same library and were given as two separate library links. +Remove one of them and review your library links before proceeding.` + ); + } + + linksToApply.set(neededLibraryFQN, { + sourceName: neededLibrary.sourceName, + libraryName: neededLibrary.libName, + address: linkedLibraryAddress, + }); + } + + if (linksToApply.size < neededLibraries.length) { + const missingLibraries = neededLibraries + .map((lib) => `${lib.sourceName}:${lib.libName}`) + .filter((libFQName) => !linksToApply.has(libFQName)) + .map((x) => `* ${x}`) + .join("\n"); + + throw new NomicLabsHardhatPluginError( + pluginName, + `The contract ${artifact.contractName} is missing links for the following libraries: +${missingLibraries} +Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html#library-linking +` + ); + } + + return linkBytecode(artifact, [...linksToApply.values()]); +} + +function linkBytecode(artifact: Artifact, libraries: Link[]): string { + let bytecode = artifact.bytecode; + + // TODO: measure performance impact + for (const { sourceName, libraryName, address } of libraries) { + const linkReferences = artifact.linkReferences[sourceName][libraryName]; + for (const { start, length } of linkReferences) { + bytecode = + bytecode.substr(0, 2 + start * 2) + + address.substr(2) + + bytecode.substr(2 + (start + length) * 2); + } + } + + return bytecode; +} diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index 40f7efad05..968c2326a6 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -87,7 +87,9 @@ export class DeploymentState { const bindingState = this._getBindingState(moduleId, bindingId); if (bindingState._kind !== "success") { - throw new Error("assertion error"); + throw new Error( + `assertion error, unsuccessful binding state: ${bindingState._kind}` + ); } return bindingState.result; diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index f098bfe315..961ea66c6f 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -238,6 +238,7 @@ export class ExecutionEngine { executor.binding.input, deploymentState ); + const services = this._createServices( ignitionModule.id, executor.binding.id diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts index 25b41e7e7f..ccd76c4aa3 100644 --- a/packages/core/src/executors/ContractExecutor.ts +++ b/packages/core/src/executors/ContractExecutor.ts @@ -35,8 +35,13 @@ export class ContractExecutor extends Executor { }; const args = input.args.map(mapToAddress); - const txHash = await services.contracts.deploy(artifact, args); - + const libraries = Object.fromEntries( + Object.entries(input.libraries ?? {}).map(([k, v]) => [ + k, + mapToAddress(v), + ]) + ); + const txHash = await services.contracts.deploy(artifact, args, libraries); const receipt = await services.transactions.wait(txHash); return { diff --git a/packages/core/src/link b/packages/core/src/link new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 761da24514..3a44e2f0f5 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -56,9 +56,11 @@ export class ModuleBuilderImpl implements ModuleBuilder { ): InternalBinding { const id = options?.id ?? contractName; const args = options?.args ?? []; + const libraries = options?.libraries ?? {}; const b = new InternalContractBinding(this.getModuleId(), id, { contractName, args, + libraries, }); this.addExecutor(new ContractExecutor(b)); diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 71938b39aa..2745703ffc 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -8,6 +8,7 @@ import { UserModule } from "./UserModule"; export interface UserContractOptions { id?: string; args?: Array>; + libraries?: Record; } export interface UserCallOptions { diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 875e0c8af8..315d98a082 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,6 +1,7 @@ import setupDebug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; +import { collectLibrariesAndLink } from "../collectLibrariesAndLink"; import { IgnitionSigner, Providers } from "../providers"; import { TxSender } from "../tx-sender"; import { Artifact } from "../types"; @@ -25,11 +26,15 @@ export class ContractsService { public async deploy( artifact: Artifact, args: any[], + libraries: { [k: string]: any }, txOptions?: TransactionOptions ): Promise { this._debug("Deploying contract"); const signer = await this._providers.signers.getDefaultSigner(); - const Factory = new ContractFactory(artifact.abi, artifact.bytecode); + + const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); + + const Factory = new ContractFactory(artifact.abi, linkedByteCode); const deployTransaction = Factory.getDeployTransaction(...args); diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index c4920950c2..6af22e2c5e 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,6 +1,11 @@ export interface Artifact { + contractName: string; bytecode: string; abi: any[]; + linkReferences: Record< + string, + Record> + >; } export interface Contract { diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts new file mode 100644 index 0000000000..b523106f56 --- /dev/null +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -0,0 +1,231 @@ +import { expect } from "chai"; + +import { collectLibrariesAndLink } from "../src/collectLibrariesAndLink"; + +describe("collectLibrariesAndLink", function () { + describe("library linking needed", () => { + it("should substitute in the bytecode via fully qualified name", async () => { + const artifact = { + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const result = await collectLibrariesAndLink(artifact, libraries); + + expect(result).to.equal( + "0x11115FbDB2315678afecb367f032d93F642f64180aa31111" + ); + }); + + it("should substitute in the bytecode via a library name", async () => { + const artifact = { + linkReferences: { + WithLibrary: { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const result = await collectLibrariesAndLink(artifact, libraries); + + expect(result).to.equal( + "0x11115FbDB2315678afecb367f032d93F642f64180aa31111" + ); + }); + + it("should throw if the given library address is invalid", async () => { + const artifact = { + contractName: "DependsOnLib", + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x1234", + }; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /You tried to link the contract DependsOnLib with the library RubbishMath, but provided this invalid address: 0x1234/ + ); + }); + + it("should throw if the given library name is wrong", async () => { + const artifact = { + contractName: "DependsOnLib", + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + NotRubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /You tried to link the contract DependsOnLib with NotRubbishMath, which is not one of its libraries./ + ); + }); + + it("should throw if libraries included that aren't needed", async () => { + const artifact = { + contractName: "DependsOnLib", + linkReferences: {}, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /This contract doesn't need linking any libraries./ + ); + }); + + it("should throw if there is a missing linked library", async () => { + const artifact = { + contractName: "DependsOnLib", + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = {}; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /The contract DependsOnLib is missing links for the following libraries:/ + ); + }); + + it("should throw if ambiguity in link references", async () => { + const artifact = { + contractName: "WithLibrary", + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + WithLibrary: { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /The library name RubbishMath is ambiguous for the contract WithLibrary/ + ); + }); + + it("should throw if ambiguity in libraries", async () => { + const artifact = { + contractName: "WithLibrary", + linkReferences: { + "contracts/WithLibrary.sol": { + RubbishMath: [ + { + start: 2, + length: 10, + }, + ], + }, + }, + bytecode: "0x1111$__634881ae738573__$1111", + } as any; + + const libraries = { + RubbishMath: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "contracts/WithLibrary.sol:RubbishMath": + "0x5FbDB2315678afecb367f032d93F642f64180aa3", + }; + + const promise = collectLibrariesAndLink(artifact, libraries); + + await expect(promise).to.eventually.be.rejectedWith( + /The library names RubbishMath and contracts\/WithLibrary.sol:RubbishMath refer to the same library and were given as two separate library links./ + ); + }); + }); + + describe("no libary linking needed", () => { + it("should return the bytecode unchanged", async () => { + const artifact = { linkReferences: {}, bytecode: "0x12345" } as any; + const libraries = {}; + + const result = await collectLibrariesAndLink(artifact, libraries); + + expect(result).to.equal("0x12345"); + }); + }); +}); diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts new file mode 100644 index 0000000000..c0c8e71856 --- /dev/null +++ b/packages/core/test/setup.ts @@ -0,0 +1,4 @@ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; + +chai.use(chaiAsPromised); diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 5f0fb9d65d..d0129bc77c 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -28,7 +28,7 @@ "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", - "chai-as-promised": "^7.1.1", + "chai-as-promised": "7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol new file mode 100644 index 0000000000..903f589c6c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts index 9255161d39..e28bed148c 100644 --- a/packages/hardhat-plugin/test/integration.ts +++ b/packages/hardhat-plugin/test/integration.ts @@ -224,6 +224,99 @@ describe("integration tests", function () { }); }); + describe("libraries", () => { + it("should deploy a contract with a library", async function () { + // given + const withLibModule = buildModule("LibModule", (m) => { + const rubbishMath = m.contract("RubbishMath"); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [withLibModule], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + LibModule: { + RubbishMath: resultAssertions.contract(async (rubbishMath) => { + assert.equal(await rubbishMath.add(1, 2), 3); + }), + DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { + assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }), + }, + }); + }); + + it("should deploy a contract with an existing library", async function () { + // given + const rubbishMathLibModule = buildModule("RubbishMathLibModule", (m) => { + const rubbishMath = m.contract("RubbishMath"); + + return { rubbishMath }; + }); + + const rubbishMathDeploymentResult = await deployModules( + this.hre, + [rubbishMathLibModule], + [1] + ); + + if ( + !isContract( + rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value + ) + ) { + assert.fail("Expected library deployed"); + } + + const { address, abi } = + rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value; + + const withLibModule = buildModule("LibModule", (m) => { + const rubbishMath = m.contractAt("RubbishMath", address, abi); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [withLibModule], + [1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + LibModule: { + RubbishMath: resultAssertions.contract(async (rubbishMath) => { + assert.equal(await rubbishMath.add(1, 2), 3); + }), + DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { + assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }), + }, + }); + }); + }); + it("should fail if a call fails", async function () { // given const userModule = buildModule("MyModule", (m) => { diff --git a/yarn.lock b/yarn.lock index 6012de1c06..a9df560ae0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1558,7 +1558,7 @@ caniuse-lite@^1.0.30001358: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== -chai-as-promised@^7.1.1: +chai-as-promised@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== From 9ba8bc8f1fdb2ab1fedb8fa7d186ec7a37004b21 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 1 Jul 2022 09:22:36 +0100 Subject: [PATCH 0033/1302] feat: deploy from abi bytecode (#27) To allow users to determine their own mechanism for loading artifacts, ignition supports passing an artifact for deployment. ```javascript const artifact = await this.hre.artifacts.readArtifact("Foo"); const userModule = buildModule("MyModule", (m) => { m.contract("Foo", artifact); }); ``` --- docs/creating-modules-for-deployment.md | 14 + .../src/bindings/ArtifactContractBinding.ts | 17 + .../src/bindings/InternalContractBinding.ts | 30 +- packages/core/src/bindings/types.ts | 9 +- packages/core/src/bindings/utils.ts | 29 ++ .../core/src/executors/ContractExecutor.ts | 51 ++- packages/core/src/executors/utils.ts | 19 + .../core/src/modules/ModuleBuilderImpl.ts | 47 ++- packages/core/src/modules/types.ts | 2 + packages/core/src/modules/utils.ts | 10 + packages/hardhat-plugin/.mocharc.json | 3 +- packages/hardhat-plugin/test/contractCalls.ts | 53 +++ .../hardhat-plugin/test/contractDeploys.ts | 329 +++++++++++++++++ packages/hardhat-plugin/test/helpers.ts | 5 + packages/hardhat-plugin/test/integration.ts | 337 ------------------ packages/hardhat-plugin/test/modules.ts | 47 +++ 16 files changed, 600 insertions(+), 402 deletions(-) create mode 100644 packages/core/src/bindings/ArtifactContractBinding.ts create mode 100644 packages/core/src/executors/utils.ts create mode 100644 packages/core/src/modules/utils.ts create mode 100644 packages/hardhat-plugin/test/contractCalls.ts create mode 100644 packages/hardhat-plugin/test/contractDeploys.ts delete mode 100644 packages/hardhat-plugin/test/integration.ts create mode 100644 packages/hardhat-plugin/test/modules.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 3beb3947fa..deada3655a 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -63,6 +63,20 @@ const uniswap = m.contractAt("UniswapRouter", "0x123...", abi) m.call(uniswap, "swap", { ... }) ``` +### Deploying from an artifact + +To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as an optional second parameter: + +```javascript +const artifact = await this.hre.artifacts.readArtifact("Foo"); + +const userModule = buildModule("MyModule", (m) => { + m.contract("Foo", artifact, { + args: [0] + }); +}); +``` + ### Linking libraries A library can be deployed and linked to a contract by passing the libraries contract binding as a named entry under the libraries option: diff --git a/packages/core/src/bindings/ArtifactContractBinding.ts b/packages/core/src/bindings/ArtifactContractBinding.ts new file mode 100644 index 0000000000..a1e7368077 --- /dev/null +++ b/packages/core/src/bindings/ArtifactContractBinding.ts @@ -0,0 +1,17 @@ +import { Contract } from "../types"; + +import { InternalBinding } from "./InternalBinding"; +import { ArtifactContractOptions } from "./types"; +import { combineArgsAndLibrariesAsDeps } from "./utils"; + +export class ArtifactContractBinding extends InternalBinding< + ArtifactContractOptions, + Contract +> { + public getDependencies(): InternalBinding[] { + return combineArgsAndLibrariesAsDeps( + this.input.args, + this.input.libraries ?? {} + ); + } +} diff --git a/packages/core/src/bindings/InternalContractBinding.ts b/packages/core/src/bindings/InternalContractBinding.ts index 2e8daf3b22..d43ae65cd8 100644 --- a/packages/core/src/bindings/InternalContractBinding.ts +++ b/packages/core/src/bindings/InternalContractBinding.ts @@ -1,37 +1,17 @@ import { Contract } from "../types"; import { InternalBinding } from "./InternalBinding"; -import { ContractOptions, Unflattened } from "./types"; -import { deepFlatten } from "./utils"; +import { ContractOptions } from "./types"; +import { combineArgsAndLibrariesAsDeps } from "./utils"; export class InternalContractBinding extends InternalBinding< ContractOptions, Contract > { public getDependencies(): InternalBinding[] { - const mapToBindings = (x: unknown): Unflattened => { - if (Array.isArray(x)) { - return x.map(mapToBindings); - } - - if (InternalBinding.isBinding(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToBindings); - } - - return []; - }; - - const argBindings = deepFlatten(mapToBindings(this.input.args)); - const libraryBindings = deepFlatten( - mapToBindings(Object.values(this.input.libraries ?? {})) + return combineArgsAndLibrariesAsDeps( + this.input.args, + this.input.libraries ?? {} ); - - const dependencies = argBindings.concat(libraryBindings); - - return dependencies; } } diff --git a/packages/core/src/bindings/types.ts b/packages/core/src/bindings/types.ts index 231cef29a3..885560260c 100644 --- a/packages/core/src/bindings/types.ts +++ b/packages/core/src/bindings/types.ts @@ -1,4 +1,4 @@ -import { Contract, Tx } from "../types"; +import { Artifact, Contract, Tx } from "../types"; import { Binding } from "./Binding"; import { ContractBinding } from "./ContractBinding"; @@ -18,6 +18,13 @@ export interface ContractOptions { libraries?: Record>; } +export interface ArtifactContractOptions { + contractName: string; + artifact: Artifact; + args: Array>; + libraries?: Record>; +} + export interface ExistingContractOptions { contractName: string; address: string; diff --git a/packages/core/src/bindings/utils.ts b/packages/core/src/bindings/utils.ts index 13594a3382..c8d3d5dc13 100644 --- a/packages/core/src/bindings/utils.ts +++ b/packages/core/src/bindings/utils.ts @@ -1,3 +1,4 @@ +import { InternalBinding } from "./InternalBinding"; import type { BindingOutput, Unflattened } from "./types"; export function deepFlatten(array: Unflattened): T[] { @@ -42,3 +43,31 @@ export function deserializeBindingOutput(x: any) { return x.value; } + +export function mapToBindings(x: unknown): Unflattened { + if (Array.isArray(x)) { + return x.map(mapToBindings); + } + + if (InternalBinding.isBinding(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToBindings); + } + + return []; +} + +export function combineArgsAndLibrariesAsDeps( + args: any[], + libraries: Record +) { + const argBindings = deepFlatten(mapToBindings(args)); + const libraryBindings = deepFlatten(mapToBindings(Object.values(libraries))); + + const dependencies = argBindings.concat(libraryBindings); + + return dependencies; +} diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts index ccd76c4aa3..7b3d20056b 100644 --- a/packages/core/src/executors/ContractExecutor.ts +++ b/packages/core/src/executors/ContractExecutor.ts @@ -1,38 +1,22 @@ import { ethers } from "ethers"; -import { ContractOptions, Resolved } from "../bindings/types"; +import { + ArtifactContractOptions, + ContractOptions, + Resolved, +} from "../bindings/types"; import { Services } from "../services/types"; -import type { Contract, DeployedContract } from "../types"; +import type { Artifact, Contract, DeployedContract } from "../types"; import { Executor } from "./Executor"; +import { mapToAddress } from "./utils"; export class ContractExecutor extends Executor { public async execute( input: Resolved, services: Services ): Promise { - const { contractName } = input; - const artifact = await services.artifacts.getArtifact(contractName); - - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; + const artifact = await this._resolveArtifactFromInput(input, services); const args = input.args.map(mapToAddress); const libraries = Object.fromEntries( @@ -45,10 +29,10 @@ export class ContractExecutor extends Executor { const receipt = await services.transactions.wait(txHash); return { - name: contractName, + name: artifact.contractName, abi: artifact.abi, - address: receipt.contractAddress, bytecode: artifact.bytecode, + address: receipt.contractAddress, }; } @@ -82,4 +66,19 @@ export class ContractExecutor extends Executor { public getDescription() { return `Deploy contract ${this.binding.input.contractName}`; } + + private async _resolveArtifactFromInput( + input: Resolved, + services: Services + ): Promise { + if ("artifact" in input) { + return input.artifact; + } + + const { contractName } = input; + + const artifact = await services.artifacts.getArtifact(contractName); + + return artifact; + } } diff --git a/packages/core/src/executors/utils.ts b/packages/core/src/executors/utils.ts new file mode 100644 index 0000000000..ea56e2dac5 --- /dev/null +++ b/packages/core/src/executors/utils.ts @@ -0,0 +1,19 @@ +export function mapToAddress(x: any): any { + if (typeof x === "string") { + return x; + } + + if (x === undefined || x === null) { + return x; + } + + if ((x as any).address) { + return (x as any).address; + } + + if (Array.isArray(x)) { + return x.map(mapToAddress); + } + + return x; +} diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 3a44e2f0f5..38eb3af330 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -1,3 +1,4 @@ +import { ArtifactContractBinding } from "../bindings/ArtifactContractBinding"; import { ContractBinding } from "../bindings/ContractBinding"; import { ExistingContractBinding } from "../bindings/ExistingContractBinding"; import { InternalBinding } from "../bindings/InternalBinding"; @@ -12,7 +13,7 @@ import { CallExecutor } from "../executors/CallExecutor"; import { ContractExecutor } from "../executors/ContractExecutor"; import { Executor } from "../executors/Executor"; import { ExistingContractExecutor } from "../executors/ExistingContractExecutor"; -import type { Contract, Tx } from "../types"; +import type { Artifact, Contract, Tx } from "../types"; import { ExecutionGraph } from "./ExecutionGraph"; import { UserModule } from "./UserModule"; @@ -21,6 +22,7 @@ import type { UserContractOptions, UserCallOptions, } from "./types"; +import { isArtifact } from "./utils"; export class ModuleBuilderImpl implements ModuleBuilder { private _currentModuleId: string | undefined; @@ -52,20 +54,41 @@ export class ModuleBuilderImpl implements ModuleBuilder { public contract( contractName: string, - options?: UserContractOptions + artifactOrOptions?: Artifact | UserContractOptions, + givenOptions?: UserContractOptions ): InternalBinding { - const id = options?.id ?? contractName; - const args = options?.args ?? []; - const libraries = options?.libraries ?? {}; - const b = new InternalContractBinding(this.getModuleId(), id, { - contractName, - args, - libraries, - }); + let binding; + if (isArtifact(artifactOrOptions)) { + const artifact = artifactOrOptions; + const options = givenOptions; + + const id = options?.id ?? contractName; + const args = options?.args ?? []; + const libraries = options?.libraries ?? {}; + + binding = new ArtifactContractBinding(this.getModuleId(), id, { + contractName, + args, + libraries, + artifact, + }); + } else { + const options = artifactOrOptions; + + const id = options?.id ?? contractName; + const args = options?.args ?? []; + const libraries = options?.libraries ?? {}; + + binding = new InternalContractBinding(this.getModuleId(), id, { + contractName, + args, + libraries, + }); + } - this.addExecutor(new ContractExecutor(b)); + this.addExecutor(new ContractExecutor(binding)); - return b; + return binding; } public contractAt( diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 2745703ffc..2a357681a1 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -2,6 +2,7 @@ import { CallBinding } from "../bindings/CallBinding"; import { ContractBinding } from "../bindings/ContractBinding"; import type { Bindable } from "../bindings/types"; import { Executor } from "../executors/Executor"; +import { Artifact } from "../types"; import { UserModule } from "./UserModule"; @@ -22,6 +23,7 @@ export interface ModuleBuilder { contract: ( contractName: string, + artifactOrOptions?: Artifact | UserContractOptions, options?: UserContractOptions ) => ContractBinding; diff --git a/packages/core/src/modules/utils.ts b/packages/core/src/modules/utils.ts new file mode 100644 index 0000000000..6ae38bcad9 --- /dev/null +++ b/packages/core/src/modules/utils.ts @@ -0,0 +1,10 @@ +import { Artifact } from "../types"; + +export function isArtifact(artifact: any): artifact is Artifact { + return ( + artifact !== null && + artifact !== undefined && + artifact.bytecode && + artifact.abi + ); +} diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json index 5a0ec255ae..ba6d32adfe 100644 --- a/packages/hardhat-plugin/.mocharc.json +++ b/packages/hardhat-plugin/.mocharc.json @@ -1,4 +1,5 @@ { "require": "ts-node/register/transpile-only", - "file": "./test/setup.ts" + "file": "./test/setup.ts", + "timeout": 5000 } diff --git a/packages/hardhat-plugin/test/contractCalls.ts b/packages/hardhat-plugin/test/contractCalls.ts new file mode 100644 index 0000000000..81f0abe729 --- /dev/null +++ b/packages/hardhat-plugin/test/contractCalls.ts @@ -0,0 +1,53 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + assertDeploymentState, + deployModules, + resultAssertions, +} from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("contract calls", () => { + useEnvironment("minimal"); + + it("should call a function in a contract", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + m.call(foo, "inc"); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + "Foo.inc": resultAssertions.transaction(), + }, + }); + }); + + it("should fail if a call fails", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [0], + }); + }); + + // then + await assert.isRejected(deployModules(this.hre, [userModule], [1, 1])); + }); +}); diff --git a/packages/hardhat-plugin/test/contractDeploys.ts b/packages/hardhat-plugin/test/contractDeploys.ts new file mode 100644 index 0000000000..945f69e146 --- /dev/null +++ b/packages/hardhat-plugin/test/contractDeploys.ts @@ -0,0 +1,329 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + assertDeploymentState, + deployModules, + isContract, + resultAssertions, +} from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("contract deploys", () => { + useEnvironment("minimal"); + + describe("local", () => { + it("should deploy a contract", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + m.contract("Foo"); + }); + + // when + const deploymentResult = await deployModules(this.hre, [userModule], [1]); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + }, + }); + }); + + it("should deploy two contracts in parallel", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + m.contract("Foo"); + m.contract("Bar"); + }); + + // when + const deploymentResult = await deployModules(this.hre, [userModule], [2]); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + Bar: resultAssertions.contract(async (bar) => { + assert.isTrue(await bar.isBar()); + }), + }, + }); + }); + + it("should deploy two contracts sequentially", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + m.contract("UsesContract", { + args: [foo], + }); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + UsesContract: resultAssertions.contract(async (usesContract) => { + const contractAddress = await usesContract.contractAddress(); + const fooResult: any = deploymentResult.MyModule.Foo; + + assert.equal(contractAddress, fooResult.value.address); + }), + }, + }); + }); + + it("should deploy two independent contracts and call a function in each one", async function () { + // given + const userModule = buildModule("MyModule", (m) => { + const foo1 = m.contract("Foo", { id: "Foo1" }); + const foo2 = m.contract("Foo", { id: "Foo2" }); + m.call(foo1, "inc"); + m.call(foo2, "inc"); + m.call(foo2, "inc", { id: "Foo2.inc2" }); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule], + [2, 2, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo1: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + Foo2: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 3); + }), + "Foo1.inc": resultAssertions.transaction(), + "Foo2.inc": resultAssertions.transaction(), + "Foo2.inc2": resultAssertions.transaction(), + }, + }); + }); + + describe("libraries", () => { + it("should deploy a contract with a library", async function () { + // given + const withLibModule = buildModule("LibModule", (m) => { + const rubbishMath = m.contract("RubbishMath"); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [withLibModule], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + LibModule: { + RubbishMath: resultAssertions.contract(async (rubbishMath) => { + assert.equal(await rubbishMath.add(1, 2), 3); + }), + DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { + assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }), + }, + }); + }); + + it("should deploy a contract with an existing library", async function () { + // given + const rubbishMathLibModule = buildModule( + "RubbishMathLibModule", + (m) => { + const rubbishMath = m.contract("RubbishMath"); + + return { rubbishMath }; + } + ); + + const rubbishMathDeploymentResult = await deployModules( + this.hre, + [rubbishMathLibModule], + [1] + ); + + if ( + !isContract( + rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value + ) + ) { + assert.fail("Expected library deployed"); + } + + const { address, abi } = + rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value; + + const withLibModule = buildModule("LibModule", (m) => { + const rubbishMath = m.contractAt("RubbishMath", address, abi); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [withLibModule], + [1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + LibModule: { + RubbishMath: resultAssertions.contract(async (rubbishMath) => { + assert.equal(await rubbishMath.add(1, 2), 3); + }), + DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { + assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }), + }, + }); + }); + }); + }); + + describe("abi/bytecodes", () => { + it("should deploy a contract", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + // given + const userModule = buildModule("MyModule", (m) => { + m.contract("Foo", artifact); + }); + + // when + const deploymentResult = await deployModules(this.hre, [userModule], [1]); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + }), + }, + }); + }); + + describe("libraries", () => { + it("should deploy a contract with a library", async function () { + const rubbishMathArtifact = await this.hre.artifacts.readArtifact( + "RubbishMath" + ); + + // given + const withLibModule = buildModule("LibModule", (m) => { + const rubbishMath = m.contract("RubbishMath", rubbishMathArtifact); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [withLibModule], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + LibModule: { + RubbishMath: resultAssertions.contract(async (rubbishMath) => { + assert.equal(await rubbishMath.add(1, 2), 3); + }), + DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { + assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }), + }, + }); + }); + }); + }); + + describe("existing", () => { + it("should deploy using existing contract", async function () { + // given + const originalModule = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const originalDeploymentResult = await deployModules( + this.hre, + [originalModule], + [1] + ); + + if (!isContract(originalDeploymentResult.FooModule.Foo.value)) { + assert.fail("Expected contract deployed"); + } + + const { address, abi } = originalDeploymentResult.FooModule.Foo.value; + + const leveragingExistingModule = buildModule("ExistingFooModule", (m) => { + const existingFoo = m.contractAt("ExistingFoo", address, abi); + + return { existingFoo }; + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [leveragingExistingModule], + [1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + ExistingFooModule: { + ExistingFoo: resultAssertions.contract(async (existingFoo) => { + assert.isTrue(await existingFoo.isFoo()); + }), + }, + }); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index e5261177c4..f3bc45d17a 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -3,6 +3,7 @@ import { SerializedBindingResult, SerializedDeploymentResult, DeploymentResult, + Contract, } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; @@ -196,3 +197,7 @@ async function assertContract( return contract; } + +export function isContract(contract: any): contract is Contract { + return contract.address !== undefined; +} diff --git a/packages/hardhat-plugin/test/integration.ts b/packages/hardhat-plugin/test/integration.ts deleted file mode 100644 index e28bed148c..0000000000 --- a/packages/hardhat-plugin/test/integration.ts +++ /dev/null @@ -1,337 +0,0 @@ -import { buildModule, Contract } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - assertDeploymentState, - deployModules, - resultAssertions, -} from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe("integration tests", function () { - this.timeout(5000); - useEnvironment("minimal"); - - it("should deploy a contract", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - m.contract("Foo"); - }); - - // when - const deploymentResult = await deployModules(this.hre, [userModule], [1]); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - }, - }); - }); - - it("should deploy two contracts in parallel", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - m.contract("Foo"); - m.contract("Bar"); - }); - - // when - const deploymentResult = await deployModules(this.hre, [userModule], [2]); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - Bar: resultAssertions.contract(async (bar) => { - assert.isTrue(await bar.isBar()); - }), - }, - }); - }); - - it("should deploy two contracts sequentially", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); - m.contract("UsesContract", { - args: [foo], - }); - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [userModule], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - UsesContract: resultAssertions.contract(async (usesContract) => { - const contractAddress = await usesContract.contractAddress(); - const fooResult: any = deploymentResult.MyModule.Foo; - - assert.equal(contractAddress, fooResult.value.address); - }), - }, - }); - }); - - it("should call a function in a contract", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); - m.call(foo, "inc"); - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [userModule], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - "Foo.inc": resultAssertions.transaction(), - }, - }); - }); - - it("should deploy two independent contracts and call a function in each one", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - const foo1 = m.contract("Foo", { id: "Foo1" }); - const foo2 = m.contract("Foo", { id: "Foo2" }); - m.call(foo1, "inc"); - m.call(foo2, "inc"); - m.call(foo2, "inc", { id: "Foo2.inc2" }); - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [userModule], - [2, 2, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { - Foo1: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - Foo2: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 3); - }), - "Foo1.inc": resultAssertions.transaction(), - "Foo2.inc": resultAssertions.transaction(), - "Foo2.inc2": resultAssertions.transaction(), - }, - }); - }); - - it("should deploy two modules", async function () { - // given - const userModule1 = buildModule("MyModule1", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - const userModule2 = buildModule("MyModule2", (m) => { - const { foo } = m.useModule(userModule1); - - m.call(foo, "inc"); - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [userModule2, userModule1], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyModule1: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - }, - MyModule2: { - "Foo.inc": resultAssertions.transaction(), - }, - }); - }); - - it("should deploy using existing contract", async function () { - // given - const originalModule = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const originalDeploymentResult = await deployModules( - this.hre, - [originalModule], - [1] - ); - - if (!isContract(originalDeploymentResult.FooModule.Foo.value)) { - assert.fail("Expected contract deployed"); - } - - const { address, abi } = originalDeploymentResult.FooModule.Foo.value; - - const leveragingExistingModule = buildModule("ExistingFooModule", (m) => { - const existingFoo = m.contractAt("ExistingFoo", address, abi); - - return { existingFoo }; - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [leveragingExistingModule], - [1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - ExistingFooModule: { - ExistingFoo: resultAssertions.contract(async (existingFoo) => { - assert.isTrue(await existingFoo.isFoo()); - }), - }, - }); - }); - - describe("libraries", () => { - it("should deploy a contract with a library", async function () { - // given - const withLibModule = buildModule("LibModule", (m) => { - const rubbishMath = m.contract("RubbishMath"); - - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { dependsOnLib }; - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [withLibModule], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - LibModule: { - RubbishMath: resultAssertions.contract(async (rubbishMath) => { - assert.equal(await rubbishMath.add(1, 2), 3); - }), - DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { - assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); - }), - }, - }); - }); - - it("should deploy a contract with an existing library", async function () { - // given - const rubbishMathLibModule = buildModule("RubbishMathLibModule", (m) => { - const rubbishMath = m.contract("RubbishMath"); - - return { rubbishMath }; - }); - - const rubbishMathDeploymentResult = await deployModules( - this.hre, - [rubbishMathLibModule], - [1] - ); - - if ( - !isContract( - rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value - ) - ) { - assert.fail("Expected library deployed"); - } - - const { address, abi } = - rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value; - - const withLibModule = buildModule("LibModule", (m) => { - const rubbishMath = m.contractAt("RubbishMath", address, abi); - - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { dependsOnLib }; - }); - - // when - const deploymentResult = await deployModules( - this.hre, - [withLibModule], - [1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - LibModule: { - RubbishMath: resultAssertions.contract(async (rubbishMath) => { - assert.equal(await rubbishMath.add(1, 2), 3); - }), - DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { - assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); - }), - }, - }); - }); - }); - - it("should fail if a call fails", async function () { - // given - const userModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [0], - }); - }); - - // then - await assert.isRejected(deployModules(this.hre, [userModule], [1, 1])); - }); -}); - -function isContract(contract: any): contract is Contract { - return contract.address !== undefined; -} diff --git a/packages/hardhat-plugin/test/modules.ts b/packages/hardhat-plugin/test/modules.ts new file mode 100644 index 0000000000..7234f1589a --- /dev/null +++ b/packages/hardhat-plugin/test/modules.ts @@ -0,0 +1,47 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + assertDeploymentState, + deployModules, + resultAssertions, +} from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("modules", () => { + useEnvironment("minimal"); + + it("should deploy two modules", async function () { + // given + const userModule1 = buildModule("MyModule1", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + const userModule2 = buildModule("MyModule2", (m) => { + const { foo } = m.useModule(userModule1); + + m.call(foo, "inc"); + }); + + // when + const deploymentResult = await deployModules( + this.hre, + [userModule2, userModule1], + [1, 1] + ); + + // then + await assertDeploymentState(this.hre, deploymentResult, { + MyModule1: { + Foo: resultAssertions.contract(async (foo) => { + assert.isTrue(await foo.isFoo()); + assert.equal(await foo.x(), 2); + }), + }, + MyModule2: { + "Foo.inc": resultAssertions.transaction(), + }, + }); + }); +}); From 0cc1745b10450adf2c7627d58e7e4394450b56a4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 12 Jul 2022 01:42:18 -0400 Subject: [PATCH 0034/1302] update hardhat version --- examples/simple-ts/package.json | 2 +- examples/simple/package.json | 2 +- packages/hardhat-plugin/package.json | 4 +- yarn.lock | 127 ++++++++++++++++++++++++--- 4 files changed, 117 insertions(+), 18 deletions(-) diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json index 5931fc5f02..4606ccb505 100644 --- a/examples/simple-ts/package.json +++ b/examples/simple-ts/package.json @@ -11,7 +11,7 @@ "@types/node": "^16.11.1", "chai": "^4.3.4", "ethers": "^5.4.7", - "hardhat": "^2.6.4", + "hardhat": "^2.10.0", "ts-node": "^10.3.0", "typescript": "^4.7.4" }, diff --git a/examples/simple/package.json b/examples/simple/package.json index b53166e528..569e1d8a23 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -7,6 +7,6 @@ "@nomicfoundation/hardhat-ignition": "^0.0.2" }, "devDependencies": { - "hardhat": "^2.6.4" + "hardhat": "^2.10.0" } } diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 5f0fb9d65d..7b946a40cb 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -34,7 +34,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.0.0", + "hardhat": "^2.10.0", "mocha": "^9.1.1", "nyc": "15.1.0", "prettier": "2.4.1", @@ -45,7 +45,7 @@ "peerDependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/ignition-core": "^0.0.2", - "hardhat": "^2.0.0" + "hardhat": "^2.10.0" }, "dependencies": { "debug": "^4.3.2", diff --git a/yarn.lock b/yarn.lock index 6012de1c06..be54c53f19 100644 --- a/yarn.lock +++ b/yarn.lock @@ -727,6 +727,21 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" +"@noble/hashes@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.1.tgz#c056d9b7166c1e7387a7453c2aff199bf7d88e5f" + integrity sha512-Lkp9+NijmV7eSVZqiUvt3UCuuHeJpUVmRrvh430gyJjJiuJMqkeHf6/A9lQ/smmbWV/0spDeJscscPzyB4waZg== + +"@noble/hashes@~1.1.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" + integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== + +"@noble/secp256k1@1.6.0", "@noble/secp256k1@~1.6.0": + version "1.6.0" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" + integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -758,6 +773,28 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== +"@scure/base@~1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" + integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== + +"@scure/bip32@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" + integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== + dependencies: + "@noble/hashes" "~1.1.1" + "@noble/secp256k1" "~1.6.0" + "@scure/base" "~1.1.0" + +"@scure/bip39@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" + integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== + dependencies: + "@noble/hashes" "~1.1.1" + "@scure/base" "~1.1.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -861,10 +898,10 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== -"@solidity-parser/parser@^0.14.1": - version "0.14.2" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.2.tgz#2d8f2bddb217621df882ceeae7d7b42ae8664db3" - integrity sha512-10cr0s+MtRtqjEw0WFJrm2rwULN30xx7btd/v9cmqME2617/2M5MbHDkFIGIGTa7lwNw4bN9mVGfhlLzrYw8pA== +"@solidity-parser/parser@^0.14.2": + version "0.14.3" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" + integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== dependencies: antlr4ts "^0.5.0-alpha.4" @@ -1435,6 +1472,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1816,7 +1860,7 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2249,7 +2293,7 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: +ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -2270,6 +2314,16 @@ ethereum-cryptography@^0.1.2, ethereum-cryptography@^0.1.3: secp256k1 "^4.0.1" setimmediate "^1.0.5" +ethereum-cryptography@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.0.tgz#7048d184ff365a5255ced5cc9eb7682a273c4db7" + integrity sha512-wyNVTBR4wIR2yoXdMv4Qt44mTVBpPgSW/DQCTmNO6nQluwpyrAIvmL4mxPbziFuc6VWJQa3rwUxn0nUFU03nyQ== + dependencies: + "@noble/hashes" "1.1.1" + "@noble/secp256k1" "1.6.0" + "@scure/bip32" "1.1.0" + "@scure/bip39" "1.1.0" + ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" @@ -2682,10 +2736,10 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -hardhat@^2.0.0, hardhat@^2.6.4: - version "2.9.9" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.9.9.tgz#05c1015eb73e0230309534b00deeb080724aace0" - integrity sha512-Qv7SXnRc0zq1kGXruNnSKpP3eFccXMR5Qv6GVX9hBIJ5efN0PflKPq92aQ5Cv3jrjJeRevLznWZVz7bttXhVfw== +hardhat@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.10.0.tgz#23a640293d52ce79388660b2872624b2c6f94e5d" + integrity sha512-9VUorKvWNyW96qFXkwkpDUSeWND3gOZpm0oJ8l63JQJvWhxyxTJ92BcOrNylOKy9hzNNGdMfM2QWNP80fGOjpA== dependencies: "@ethereumjs/block" "^3.6.2" "@ethereumjs/blockchain" "^5.5.2" @@ -2695,7 +2749,7 @@ hardhat@^2.0.0, hardhat@^2.6.4: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.1" + "@solidity-parser/parser" "^0.14.2" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -2708,7 +2762,7 @@ hardhat@^2.0.0, hardhat@^2.6.4: debug "^4.1.1" enquirer "^2.3.0" env-paths "^2.2.0" - ethereum-cryptography "^0.1.2" + ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" ethereumjs-util "^7.1.4" find-up "^2.1.0" @@ -2720,7 +2774,7 @@ hardhat@^2.0.0, hardhat@^2.6.4: lodash "^4.17.11" merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" - mocha "^9.2.0" + mocha "^10.0.0" p-map "^4.0.0" qs "^6.7.0" raw-body "^2.4.1" @@ -3601,6 +3655,13 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" +minimatch@5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" + integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.1.1: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -3620,7 +3681,35 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" -mocha@^9.1.1, mocha@^9.1.3, mocha@^9.2.0: +mocha@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" + integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + dependencies: + "@ungap/promise-all-settled" "1.1.2" + ansi-colors "4.1.1" + browser-stdout "1.3.1" + chokidar "3.5.3" + debug "4.3.4" + diff "5.0.0" + escape-string-regexp "4.0.0" + find-up "5.0.0" + glob "7.2.0" + he "1.2.0" + js-yaml "4.1.0" + log-symbols "4.1.0" + minimatch "5.0.1" + ms "2.1.3" + nanoid "3.3.3" + serialize-javascript "6.0.0" + strip-json-comments "3.1.1" + supports-color "8.1.1" + workerpool "6.2.1" + yargs "16.2.0" + yargs-parser "20.2.4" + yargs-unparser "2.0.0" + +mocha@^9.1.1, mocha@^9.1.3: version "9.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== @@ -3670,6 +3759,11 @@ nanoid@3.3.1: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== +nanoid@3.3.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" + integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -4965,6 +5059,11 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== +workerpool@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" + integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" From 11c687ef3364b6a21284d0391cb2fe6834a205e1 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 13 Jul 2022 03:37:18 -0400 Subject: [PATCH 0035/1302] refactored user module loading and added tests --- packages/hardhat-plugin/src/index.ts | 28 ++++++--- packages/hardhat-plugin/src/user-modules.ts | 58 +++++++++++------ .../user-modules/contracts/Contracts.sol | 25 ++++++++ .../user-modules/contracts/WithLibrary.sol | 18 ++++++ .../user-modules/hardhat.config.js | 11 ++++ .../user-modules/ignition/.testignore | 0 .../user-modules/ignition/TestModule.js | 3 + packages/hardhat-plugin/test/user-modules.ts | 63 ++++++++++++++++--- 8 files changed, 171 insertions(+), 35 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore create mode 100644 packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 6bf9e0dd1b..8eefb242e2 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -11,7 +11,7 @@ import { lazyObject } from "hardhat/plugins"; import path from "path"; import { IgnitionWrapper } from "./ignition-wrapper"; -import { loadUserModules } from "./user-modules"; +import { loadUserModules, loadAllUserModules } from "./user-modules"; import "./type-extensions"; export { @@ -123,10 +123,15 @@ task("deploy") async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { await hre.run("compile", { quiet: true }); - const userModules = await loadUserModules( - hre.config.paths.ignition, - userModulesPaths - ); + let userModules: Array>; + if (userModulesPaths.length === 0) { + userModules = loadAllUserModules(hre.config.paths.ignition); + } else { + userModules = loadUserModules( + hre.config.paths.ignition, + userModulesPaths + ); + } if (userModules.length === 0) { console.warn("No Ignition modules found"); @@ -168,10 +173,15 @@ task("plan") async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { await hre.run("compile", { quiet: true }); - const userModules = await loadUserModules( - hre.config.paths.ignition, - userModulesPaths - ); + let userModules: Array>; + if (userModulesPaths.length === 0) { + userModules = loadAllUserModules(hre.config.paths.ignition); + } else { + userModules = loadUserModules( + hre.config.paths.ignition, + userModulesPaths + ); + } if (userModules.length === 0) { console.warn("No Ignition modules found"); diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 29dd450e72..b9fc685260 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -5,34 +5,46 @@ import path from "path"; const debug = setupDebug("hardhat-ignition:modules"); -export async function loadUserModules( +export function loadAllUserModules( + userModulesDirectory: string +): Array> { + debug(`Loading all user modules from '${userModulesDirectory}'`); + + if (!fsExtra.existsSync(userModulesDirectory)) { + throw new Error(`Directory ${userModulesDirectory} not found.`); + } + + const resolvedUserModulesPaths = getAllUserModulesPaths(userModulesDirectory); + + return getUserModulesFromPaths(resolvedUserModulesPaths); +} + +export function loadUserModules( userModulesDirectory: string, - userModulesFiles: string[] -): Promise>> { + userModulesFiles: string[] = [] +): Array> { debug(`Loading user modules from '${userModulesDirectory}'`); if (!fsExtra.existsSync(userModulesDirectory)) { throw new Error(`Directory ${userModulesDirectory} not found.`); } - let resolvedUserModulesPaths: string[]; - if (userModulesFiles.length === 0) { - debug("No files passed, reading all module files"); + const resolvedUserModulesPaths = getUserModulesPaths( + userModulesDirectory, + userModulesFiles + ); - resolvedUserModulesPaths = getAllUserModules(userModulesDirectory); - } else { - debug(`Reading '${userModulesFiles.length}' selected module files`); - resolvedUserModulesPaths = userModulesFiles.map((x) => - path.resolve(process.cwd(), x) - ); - } + return getUserModulesFromPaths(resolvedUserModulesPaths); +} +export function getUserModulesFromPaths( + resolvedUserModulesPaths: string[] +): Array> { debug(`Loading '${resolvedUserModulesPaths.length}' module files`); - const userModules: any[] = []; - for (const ignitionFile of resolvedUserModulesPaths) { - const pathToFile = path.resolve(userModulesDirectory, ignitionFile); - const fileExists = await fsExtra.pathExists(pathToFile); + const userModules: any[] = []; + for (const pathToFile of resolvedUserModulesPaths) { + const fileExists = fsExtra.pathExistsSync(pathToFile); if (!fileExists) { throw new Error(`Module ${pathToFile} doesn't exist`); } @@ -46,8 +58,16 @@ export async function loadUserModules( return userModules; } -export function getAllUserModules(userModulesDirectory: string) { +export function getUserModulesPaths( + userModulesDirectory: string, + userModulesFiles: string[] +): string[] { + return userModulesFiles.map((x) => path.resolve(userModulesDirectory, x)); +} + +export function getAllUserModulesPaths(userModulesDirectory: string) { return fsExtra .readdirSync(userModulesDirectory) - .filter((x) => !x.startsWith(".")); + .filter((x) => !x.startsWith(".")) + .map((x) => path.resolve(userModulesDirectory, x)); } diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol new file mode 100644 index 0000000000..174ff94005 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol @@ -0,0 +1,25 @@ +contract Foo { + bool public isFoo = true; + uint public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint n) public { + require(n > 0, "n must be positive"); + x += n; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor (address _contract) { + contractAddress = _contract; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol new file mode 100644 index 0000000000..903f589c6c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js new file mode 100644 index 0000000000..39a079daef --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js @@ -0,0 +1,11 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js new file mode 100644 index 0000000000..dff6bc6679 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js @@ -0,0 +1,3 @@ +module.exports = { + id: "testing123", +}; diff --git a/packages/hardhat-plugin/test/user-modules.ts b/packages/hardhat-plugin/test/user-modules.ts index 7f28452862..d522fa3dd3 100644 --- a/packages/hardhat-plugin/test/user-modules.ts +++ b/packages/hardhat-plugin/test/user-modules.ts @@ -1,16 +1,65 @@ import { assert } from "chai"; -import { loadUserModules } from "../src/user-modules"; +import { + loadUserModules, + loadAllUserModules, + getUserModulesFromPaths, + getUserModulesPaths, + getAllUserModulesPaths, +} from "../src/user-modules"; import { useEnvironment } from "./useEnvironment"; describe("User modules", function () { - useEnvironment("minimal"); + useEnvironment("user-modules"); - it("should exit with a warning if given a user module directory that does not exist", async () => { - await assert.isRejected( - loadUserModules("/fake", []), - `Directory /fake not found.` - ); + describe("loadUserModules", function () { + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadUserModules("/fake", []), + `Directory /fake not found.` + ); + }); + }); + + describe("loadAllUserModules", function () { + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadAllUserModules("/fake"), + `Directory /fake not found.` + ); + }); + }); + + describe("getAllUserModulesPaths", function () { + it("should return file paths for all user modules in a given directory", () => { + const paths = getAllUserModulesPaths("ignition"); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestModule.js")); + }); + }); + + describe("getUserModulesPaths", function () { + it("should return file paths for the given user module files", () => { + const paths = getUserModulesPaths("ignition", ["TestModule.js"]); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestModule.js")); + }); + }); + + describe("getUserModulesFromPaths", function () { + it("should return a user module from a given path", () => { + const paths = getUserModulesPaths("ignition", ["TestModule.js"]); + const modules = getUserModulesFromPaths(paths); + + assert.equal(modules.length, 1); + assert.equal(modules[0].id, "testing123"); + }); + + it("should throw if given a file that does not exist", () => { + assert.throws(() => getUserModulesFromPaths(["/fake"])); + }); }); }); From fa956d50a6a31a9935c0b0b4ffda6abd60cefeec Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 13 Jul 2022 03:42:05 -0400 Subject: [PATCH 0036/1302] fix missed reference --- packages/hardhat-plugin/src/ignition-wrapper.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index ff2c3f5bea..adafe0e759 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -12,7 +12,7 @@ import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { getAllUserModules } from "./user-modules"; +import { getAllUserModulesPaths } from "./user-modules"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; @@ -129,7 +129,7 @@ export class IgnitionWrapper { } private async _getModule(moduleId: string): Promise> { - const userModulesPaths = getAllUserModules(this._paths.ignition); + const userModulesPaths = getAllUserModulesPaths(this._paths.ignition); for (const userModulePath of userModulesPaths) { const resolveUserModulePath = path.resolve( From cf3f5228496b282764885eac64c5e1c5b5e5fb9b Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Jul 2022 11:10:12 +0100 Subject: [PATCH 0037/1302] fix:complex calls (#31) Don't block validation on overloaded functions invoked with args i.e. `example(uint256,bool)`. Add tests for the `m.call(...)` function in core. --- packages/core/src/executors/CallExecutor.ts | 31 +--- packages/core/test/executors/CallExecutor.ts | 184 +++++++++++++++++++ 2 files changed, 193 insertions(+), 22 deletions(-) create mode 100644 packages/core/test/executors/CallExecutor.ts diff --git a/packages/core/src/executors/CallExecutor.ts b/packages/core/src/executors/CallExecutor.ts index 11840f5cf2..d6be773742 100644 --- a/packages/core/src/executors/CallExecutor.ts +++ b/packages/core/src/executors/CallExecutor.ts @@ -6,6 +6,7 @@ import { Services } from "../services/types"; import { Tx } from "../types"; import { Executor } from "./Executor"; +import { mapToAddress } from "./utils"; export class CallExecutor extends Executor { public async execute( @@ -13,25 +14,6 @@ export class CallExecutor extends Executor { services: Services ): Promise { const { contract, method } = input; - const mapToAddress = (x: any): any => { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; - }; const args = input.args.map(mapToAddress); const txHash = await services.contracts.call( @@ -64,9 +46,14 @@ export class CallExecutor extends Executor { const argsLength = input.args.length; const iface = new ethers.utils.Interface(artifact.abi); - const functionFragments = iface.fragments.filter( - (f) => f.name === input.method - ); + + const funcs = Object.entries(iface.functions) + .filter(([fname]) => fname === input.method) + .map(([, fragment]) => fragment); + + const functionFragments = iface.fragments + .filter((frag) => frag.name === input.method) + .concat(funcs); if (functionFragments.length === 0) { return [ diff --git a/packages/core/test/executors/CallExecutor.ts b/packages/core/test/executors/CallExecutor.ts new file mode 100644 index 0000000000..016b5f3cfc --- /dev/null +++ b/packages/core/test/executors/CallExecutor.ts @@ -0,0 +1,184 @@ +import { assert } from "chai"; + +import { InternalCallBinding } from "../../src/bindings/InternalCallBinding"; +import { InternalContractBinding } from "../../src/bindings/InternalContractBinding"; +import { CallOptions } from "../../src/bindings/types"; +import { CallExecutor } from "../../src/executors/CallExecutor"; +import { Artifact } from "../../src/types"; + +describe("Call Executor", () => { + describe("validate", () => { + const exampleArtifact = { + _format: "hh-sol-artifact-1", + contractName: "Foo", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "sub", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: "0x0", + deployedBytecode: "0x0", + linkReferences: {}, + deployedLinkReferences: {}, + }; + + const exampleContractBinding = new InternalContractBinding( + "MyModule", + "MyContract", + { + contractName: "MyContract", + args: [], + libraries: [], + } + ); + + it("should call existing function", async () => { + const input: CallOptions = { + contract: exampleContractBinding, + method: "sub", + args: [2], + }; + + await assertCallValidation(input, exampleArtifact, []); + }); + + it("should call overloaded function", async () => { + const input: CallOptions = { + contract: exampleContractBinding, + method: "inc(bool,uint256)", + args: [true, 2], + }; + + await assertCallValidation(input, exampleArtifact, []); + }); + + it("should fail on call to non-existing function", async () => { + const input: CallOptions = { + contract: exampleContractBinding, + method: "nonexistant", + args: [], + }; + + await assertCallValidation(input, exampleArtifact, [ + "Contract 'MyContract' doesn't have a function nonexistant", + ]); + }); + + it("should fail on call to existing function with wrong number of args", async () => { + const input: CallOptions = { + contract: exampleContractBinding, + method: "sub", + args: [], + }; + + await assertCallValidation(input, exampleArtifact, [ + "Function sub in contract MyContract expects 1 arguments but 0 were given", + ]); + }); + + it("should fail on overloaded call to existing function with wrong number of args", async () => { + const input: CallOptions = { + contract: exampleContractBinding, + method: "inc", + args: [], + }; + + await assertCallValidation(input, exampleArtifact, [ + "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments", + ]); + }); + }); +}); + +async function assertCallValidation( + input: CallOptions, + artifact: Artifact, + expected: string[] +) { + const mockArtifactsService = { + hasArtifact: (_contractName: string): boolean => { + return true; + }, + getArtifact: (_contractName: string) => { + return artifact; + }, + }; + + const binding = new InternalCallBinding("MyModule", "binding-1", input); + + const ex = new CallExecutor(binding); + + const validationResult = await ex.validate(input, { + artifacts: mockArtifactsService, + } as any); + + assert.deepStrictEqual(validationResult, expected); +} From 7d0ef3f4fc4cfcd3d5c9dfda06ed9ae9be8fb69d Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 21 Jul 2022 15:17:25 +0100 Subject: [PATCH 0038/1302] feat:network config (#29) The module builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. ```tsx const userModule = buildModule("MyModule", (m) => { const daiAddresses = { 1: "0x123...", // mainnet DAI 4: "0x234...", // rinkeby DAI } const daiAddress = daiAddresses[m.chainId]; const myContract = m.contract("MyContract", { args: [daiAddress] }); }); ``` The chain id is determined by a lookup on the network. --- docs/creating-modules-for-deployment.md | 18 ++++++++++++++++++ packages/core/src/Ignition.ts | 16 ++++++++++++++-- packages/core/src/modules/ModuleBuilderImpl.ts | 2 +- packages/core/src/modules/types.ts | 2 ++ .../hardhat-plugin/src/ignition-wrapper.ts | 2 ++ packages/hardhat-plugin/src/index.ts | 1 + packages/hardhat-plugin/test/chainId.ts | 18 ++++++++++++++++++ 7 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 packages/hardhat-plugin/test/chainId.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index deada3655a..a64b85614c 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -91,3 +91,21 @@ const contract = m.contract("Contract", { ``` A library is deployed in the same way as a contract. + +### Using the network chain id + +The module builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. + +```tsx +const userModule = buildModule("MyModule", (m) => { + const daiAddresses = { + 1: "0x123...", // mainnet DAI + 4: "0x234...", // rinkeby DAI + } + + const daiAddress = daiAddresses[m.chainId]; + const myContract = m.contract("MyContract", { + args: [daiAddress] + }); +}); +``` \ No newline at end of file diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 690111057f..bbe967716d 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -34,7 +34,9 @@ export class Ignition { ): Promise<[DeploymentResult, ModulesOutputs]> { log(`Start deploy, '${userModules.length}' modules`); - const m = new ModuleBuilderImpl(); + const chainId = await this._getChainId(); + + const m = new ModuleBuilderImpl(chainId); const modulesOutputs: ModulesOutputs = {}; @@ -80,7 +82,9 @@ export class Ignition { ): Promise { log(`Start building plan, '${userModules.length}' modules`); - const m = new ModuleBuilderImpl(); + const chainId = await this._getChainId(); + + const m = new ModuleBuilderImpl(chainId); for (const userModule of userModules) { log("Load module '%s'", userModule.id); @@ -92,4 +96,12 @@ export class Ignition { return ExecutionEngine.buildPlan(executionGraph, this._modulesResults); } + + private async _getChainId(): Promise { + const result = await this._providers.ethereumProvider.request({ + method: "eth_chainId", + }); + + return Number(result); + } } diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 38eb3af330..1ef7a57f18 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -30,7 +30,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { private _executors: Executor[] = []; private _knownModules: Map, any]> = new Map(); - constructor() {} + constructor(public chainId: number) {} public getModuleId(): string { if (this._currentModuleId === undefined) { diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 2a357681a1..655e4db629 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -18,6 +18,8 @@ export interface UserCallOptions { } export interface ModuleBuilder { + chainId: number; + getModuleId: () => string; addExecutor: (executor: Executor) => void; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index adafe0e759..f87d46d8ec 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -49,6 +49,7 @@ export class IgnitionWrapper { */ public async deployMany(userModulesOrNames: Array | string>) { const userModules: Array> = []; + for (const userModuleOrName of userModulesOrNames) { const userModule: UserModule = typeof userModuleOrName === "string" @@ -191,6 +192,7 @@ export class IgnitionWrapper { this._paths.deployments, String(chainId) ); + fsExtra.ensureDirSync(deploymentsDirectory); const moduleResultPath = path.join( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 8eefb242e2..696a407568 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -101,6 +101,7 @@ extendEnvironment((hre) => { const pathToJournal = isHardhatNetwork ? undefined : path.resolve(hre.config.paths.root, "ignition-journal.json"); + const txPollingInterval = isHardhatNetwork ? 100 : 5000; return new IgnitionWrapper( diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts new file mode 100644 index 0000000000..c8872e8ee3 --- /dev/null +++ b/packages/hardhat-plugin/test/chainId.ts @@ -0,0 +1,18 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { deployModules } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("chain id", () => { + useEnvironment("minimal"); + + it("should be available on the module builder", async function () { + // given + const chainIdModule = buildModule("MyModule", (m) => { + assert.equal(m.chainId, 31337); + }); + + await deployModules(this.hre, [chainIdModule], [1, 1]); + }); +}); From 68380c16142404325fa319ea4afb998b4e8395fc Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 9 Aug 2022 22:21:53 -0400 Subject: [PATCH 0039/1302] refactored bindings -> futures in code and tests --- packages/core/src/bindings/CallBinding.ts | 6 - .../src/bindings/ExistingContractBinding.ts | 13 -- packages/core/src/bindings/InternalBinding.ts | 21 --- .../core/src/bindings/InternalCallBinding.ts | 31 ---- packages/core/src/bindings/types.ts | 50 ------ packages/core/src/deployment-state.ts | 158 +++++++++--------- packages/core/src/execution-engine.ts | 40 ++--- packages/core/src/executors/CallExecutor.ts | 13 +- .../core/src/executors/ContractExecutor.ts | 4 +- packages/core/src/executors/Executor.ts | 30 ++-- .../src/executors/ExistingContractExecutor.ts | 6 +- .../ArtifactContractFuture.ts} | 6 +- packages/core/src/futures/CallFuture.ts | 6 + .../ContractFuture.ts} | 4 +- .../src/futures/ExistingContractFuture.ts | 13 ++ .../Binding.ts => futures/Future.ts} | 4 +- .../core/src/futures/InternalCallFuture.ts | 31 ++++ .../InternalContractFuture.ts} | 6 +- packages/core/src/futures/InternalFuture.ts | 21 +++ packages/core/src/futures/types.ts | 50 ++++++ .../core/src/{bindings => futures}/utils.ts | 26 +-- packages/core/src/index.ts | 12 +- packages/core/src/modules/ExecutionGraph.ts | 10 +- packages/core/src/modules/IgnitionModule.ts | 14 +- .../core/src/modules/ModuleBuilderImpl.ts | 50 +++--- packages/core/src/modules/types.ts | 20 +-- packages/core/src/ui/components/index.tsx | 48 +++--- .../test/bindings/existingContractBinding.ts | 18 -- packages/core/test/dag.ts | 14 +- packages/core/test/execution-engine.ts | 14 +- packages/core/test/executors/CallExecutor.ts | 22 +-- .../executors/ExistingContractExecutor.ts | 8 +- .../test/futures/ExistingContractFuture.ts | 18 ++ packages/core/test/helpers.ts | 22 +-- packages/core/ui-samples/index.tsx | 44 ++--- .../hardhat-plugin/src/ignition-wrapper.ts | 20 +-- packages/hardhat-plugin/src/index.ts | 8 +- packages/hardhat-plugin/test/helpers.ts | 51 +++--- 38 files changed, 464 insertions(+), 468 deletions(-) delete mode 100644 packages/core/src/bindings/CallBinding.ts delete mode 100644 packages/core/src/bindings/ExistingContractBinding.ts delete mode 100644 packages/core/src/bindings/InternalBinding.ts delete mode 100644 packages/core/src/bindings/InternalCallBinding.ts delete mode 100644 packages/core/src/bindings/types.ts rename packages/core/src/{bindings/ArtifactContractBinding.ts => futures/ArtifactContractFuture.ts} (64%) create mode 100644 packages/core/src/futures/CallFuture.ts rename packages/core/src/{bindings/ContractBinding.ts => futures/ContractFuture.ts} (66%) create mode 100644 packages/core/src/futures/ExistingContractFuture.ts rename packages/core/src/{bindings/Binding.ts => futures/Future.ts} (61%) create mode 100644 packages/core/src/futures/InternalCallFuture.ts rename packages/core/src/{bindings/InternalContractBinding.ts => futures/InternalContractFuture.ts} (63%) create mode 100644 packages/core/src/futures/InternalFuture.ts create mode 100644 packages/core/src/futures/types.ts rename packages/core/src/{bindings => futures}/utils.ts (57%) delete mode 100644 packages/core/test/bindings/existingContractBinding.ts create mode 100644 packages/core/test/futures/ExistingContractFuture.ts diff --git a/packages/core/src/bindings/CallBinding.ts b/packages/core/src/bindings/CallBinding.ts deleted file mode 100644 index e725ad53e2..0000000000 --- a/packages/core/src/bindings/CallBinding.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Tx } from "../types"; - -import { Binding } from "./Binding"; -import { CallOptions } from "./types"; - -export class CallBinding extends Binding {} diff --git a/packages/core/src/bindings/ExistingContractBinding.ts b/packages/core/src/bindings/ExistingContractBinding.ts deleted file mode 100644 index 9a7bd291e3..0000000000 --- a/packages/core/src/bindings/ExistingContractBinding.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Contract } from "../types"; - -import { InternalBinding } from "./InternalBinding"; -import type { ExistingContractOptions } from "./types"; - -export class ExistingContractBinding extends InternalBinding< - ExistingContractOptions, - Contract -> { - public getDependencies(): InternalBinding[] { - return []; - } -} diff --git a/packages/core/src/bindings/InternalBinding.ts b/packages/core/src/bindings/InternalBinding.ts deleted file mode 100644 index 61fb693ef2..0000000000 --- a/packages/core/src/bindings/InternalBinding.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Binding } from "./Binding"; -import { BindingOutput } from "./types"; - -export abstract class InternalBinding< - I = unknown, - O extends BindingOutput = any -> extends Binding { - constructor( - public readonly moduleId: string, - public readonly id: string, - public readonly input: I - ) { - super(); - } - - abstract getDependencies(): InternalBinding[]; - - public static isBinding(x: unknown): x is InternalBinding { - return x instanceof InternalBinding; - } -} diff --git a/packages/core/src/bindings/InternalCallBinding.ts b/packages/core/src/bindings/InternalCallBinding.ts deleted file mode 100644 index 34444825a4..0000000000 --- a/packages/core/src/bindings/InternalCallBinding.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Tx } from "../types"; - -import { InternalBinding } from "./InternalBinding"; -import { CallOptions, Unflattened } from "./types"; -import { deepFlatten } from "./utils"; - -export class InternalCallBinding extends InternalBinding { - public getDependencies(): InternalBinding[] { - const mapToBindings = (x: unknown): Unflattened => { - if (Array.isArray(x)) { - return x.map(mapToBindings); - } - - if (InternalBinding.isBinding(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToBindings); - } - - return []; - }; - - const dependencies = deepFlatten( - mapToBindings([this.input.contract, ...this.input.args]) - ); - - return dependencies; - } -} diff --git a/packages/core/src/bindings/types.ts b/packages/core/src/bindings/types.ts deleted file mode 100644 index 885560260c..0000000000 --- a/packages/core/src/bindings/types.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Artifact, Contract, Tx } from "../types"; - -import { Binding } from "./Binding"; -import { ContractBinding } from "./ContractBinding"; -import { serializeBindingOutput } from "./utils"; - -export type BindingOutput = string | number | Contract | Tx; - -export type ModuleResult = Record; -export type SerializedModuleResult = Record; -export type SerializedBindingResult = ReturnType; - -export type SerializedDeploymentResult = Record; - -export interface ContractOptions { - contractName: string; - args: Array>; - libraries?: Record>; -} - -export interface ArtifactContractOptions { - contractName: string; - artifact: Artifact; - args: Array>; - libraries?: Record>; -} - -export interface ExistingContractOptions { - contractName: string; - address: string; - abi: any[]; -} - -export interface CallOptions { - contract: ContractBinding; - method: string; - args: Array>; -} - -export type Bindable = T | Binding; - -export type AddressLike = Bindable | Binding; - -export type Unflattened = T[] | Array>; - -export type Resolved = T extends Binding - ? O - : { - [K in keyof T]: T[K] extends Binding ? O : Resolved; - }; diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index 968c2326a6..ee8494813b 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -1,9 +1,9 @@ import type { - BindingOutput, + FutureOutput, ModuleResult, SerializedModuleResult, -} from "./bindings/types"; -import { serializeBindingOutput } from "./bindings/utils"; +} from "./futures/types"; +import { serializeFutureOutput } from "./futures/utils"; import { ExecutionGraph } from "./modules/ExecutionGraph"; import { IgnitionModule } from "./modules/IgnitionModule"; @@ -35,8 +35,8 @@ export class DeploymentState { ); } - for (const [bindingId, bindingOutput] of Object.entries(moduleResult)) { - moduleState.setSuccess(bindingId, bindingOutput); + for (const [futureId, futureOutput] of Object.entries(moduleResult)) { + moduleState.setSuccess(futureId, futureOutput); } } @@ -77,22 +77,22 @@ export class DeploymentState { return [...this._modules.values()].filter((m) => m.isSuccess()); } - public isBindingSuccess(moduleId: string, bindingId: string): boolean { - const bindingState = this._getBindingState(moduleId, bindingId); + public isFutureSuccess(moduleId: string, futureId: string): boolean { + const futureState = this._getFutureState(moduleId, futureId); - return bindingState._kind === "success"; + return futureState._kind === "success"; } - public getBindingResult(moduleId: string, bindingId: string) { - const bindingState = this._getBindingState(moduleId, bindingId); + public getFutureResult(moduleId: string, futureId: string) { + const futureState = this._getFutureState(moduleId, futureId); - if (bindingState._kind !== "success") { + if (futureState._kind !== "success") { throw new Error( - `assertion error, unsuccessful binding state: ${bindingState._kind}` + `assertion error, unsuccessful binding state: ${futureState._kind}` ); } - return bindingState.result; + return futureState.result; } public isModuleSuccess(moduleId: string): boolean { @@ -123,20 +123,20 @@ export class DeploymentState { return; } - public setBindingState( + public setFutureState( moduleId: string, - bindingId: string, - bindingState: BindingState + futureId: string, + futureState: FutureState ) { const moduleState = this._getModuleState(moduleId); - moduleState.setBindingState(bindingId, bindingState); + moduleState.setFutureState(futureId, futureState); } - private _getBindingState(moduleId: string, bindingId: string) { + private _getFutureState(moduleId: string, futureId: string) { const moduleState = this._getModuleState(moduleId); - return moduleState.getBindingState(bindingId); + return moduleState.getFutureState(futureId); } private _getModuleState(moduleId: string) { @@ -150,57 +150,57 @@ export class DeploymentState { } } -interface BindingStateWaiting { +interface FutureStateWaiting { _kind: "waiting"; } -interface BindingStateReady { +interface FutureStateReady { _kind: "ready"; } -interface BindingStateRunning { +interface FutureStateRunning { _kind: "running"; } -interface BindingStateSuccess { +interface FutureStateSuccess { _kind: "success"; - result: BindingOutput; + result: FutureOutput; } -interface BindingStateFailure { +interface FutureStateFailure { _kind: "failure"; error: Error; } -interface BindingStateHold { +interface FutureStateHold { _kind: "hold"; reason: string; } -export type BindingState = - | BindingStateWaiting - | BindingStateReady - | BindingStateRunning - | BindingStateSuccess - | BindingStateFailure - | BindingStateHold; +export type FutureState = + | FutureStateWaiting + | FutureStateReady + | FutureStateRunning + | FutureStateSuccess + | FutureStateFailure + | FutureStateHold; // eslint-disable-next-line @typescript-eslint/no-redeclare -- intentionally naming the variable the same as the type -export const BindingState = { - waiting(): BindingState { +export const FutureState = { + waiting(): FutureState { return { _kind: "waiting" }; }, - running(): BindingState { + running(): FutureState { return { _kind: "running" }; }, - success(result: BindingOutput): BindingState { + success(result: FutureOutput): FutureState { return { _kind: "success", result }; }, - failure(error: Error): BindingState { + failure(error: Error): FutureState { return { _kind: "failure", error }; }, - hold(reason: string): BindingState { + hold(reason: string): FutureState { return { _kind: "hold", reason }; }, }; export class ModuleState { private _started = false; - private _bindings = new Map(); + private _futures = new Map(); public static fromIgnitionModule( ignitionModule: IgnitionModule @@ -208,7 +208,7 @@ export class ModuleState { const moduleState = new ModuleState(ignitionModule.id); for (const executor of ignitionModule.getSortedExecutors()) { - moduleState.addBinding(executor.binding.id, BindingState.waiting()); + moduleState.addFuture(executor.future.id, FutureState.waiting()); } return moduleState; @@ -216,20 +216,20 @@ export class ModuleState { constructor(public readonly id: string) {} - public addBinding(bindingId: string, bindingState: BindingState) { - this._bindings.set(bindingId, bindingState); + public addFuture(futureId: string, futureState: FutureState) { + this._futures.set(futureId, futureState); } - public getBindingsStates(): Array<[string, BindingState]> { - return [...this._bindings.entries()]; + public getFuturesStates(): Array<[string, FutureState]> { + return [...this._futures.entries()]; } public isSuccess(): boolean { - const successCount = [...this._bindings.values()].filter( + const successCount = [...this._futures.values()].filter( (b) => b._kind === "success" ).length; - return successCount === this._bindings.size; + return successCount === this._futures.size; } public isRunning(): boolean { @@ -239,92 +239,92 @@ export class ModuleState { } public isFailure(): boolean { - return [...this._bindings.values()].some((b) => b._kind === "failure"); + return [...this._futures.values()].some((b) => b._kind === "failure"); } public isHold(): boolean { return ( !this.isFailure() && - [...this._bindings.values()].some((b) => b._kind === "hold") + [...this._futures.values()].some((b) => b._kind === "hold") ); } - public setBindingState(bindingId: string, bindingState: BindingState) { + public setFutureState(futureId: string, futureState: FutureState) { this._started = true; - this._bindings.set(bindingId, bindingState); + this._futures.set(futureId, futureState); } - public setSuccess(bindingId: string, result: any) { - this._bindings.set(bindingId, BindingState.success(result)); + public setSuccess(futureId: string, result: any) { + this._futures.set(futureId, FutureState.success(result)); } - public getBindingState(bindingId: string): BindingState { - const bindingState = this._bindings.get(bindingId); - if (bindingState === undefined) { + public getFutureState(futureId: string): FutureState { + const futureState = this._futures.get(futureId); + if (futureState === undefined) { throw new Error( - `[ModuleResult] Module '${this.id}' has no result for binding '${bindingId}'` + `[ModuleResult] Module '${this.id}' has no result for future '${futureId}'` ); } - return bindingState; + return futureState; } public getFailures(): Error[] { - return [...this._bindings.values()] - .filter((x): x is BindingStateFailure => x._kind === "failure") + return [...this._futures.values()] + .filter((x): x is FutureStateFailure => x._kind === "failure") .map((x) => x.error); } public getHolds(): string[] { - return [...this._bindings.values()] - .filter((x): x is BindingStateHold => x._kind === "hold") + return [...this._futures.values()] + .filter((x): x is FutureStateHold => x._kind === "hold") .map((x) => x.reason); } public count(): number { - return this._bindings.size; + return this._futures.size; } public toModuleResult(): SerializedModuleResult { const moduleResult: SerializedModuleResult = {}; - for (const [bindingId, bindingState] of this._bindings.entries()) { - if (bindingState._kind !== "success") { + for (const [futureId, futureState] of this._futures.entries()) { + if (futureState._kind !== "success") { throw new Error( "toModuleResult can only be called in successful modules" ); } - moduleResult[bindingId] = serializeBindingOutput(bindingState.result); + moduleResult[futureId] = serializeFutureOutput(futureState.result); } return moduleResult; } - private _getBinding(bindingId: string) { - const bindingState = this._bindings.get(bindingId); + private _getFuture(futureId: string) { + const futureState = this._futures.get(futureId); - if (bindingState === undefined) { + if (futureState === undefined) { throw new Error("assertion error"); } - return bindingState; + return futureState; } - private _isBindingSuccess(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); + private _isFutureSuccess(futureId: string): boolean { + const futureState = this._getFuture(futureId); - return bindingState._kind === "success"; + return futureState._kind === "success"; } - private _isBindingFailure(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); + private _isFutureFailure(futureId: string): boolean { + const futureState = this._getFuture(futureId); - return bindingState._kind === "failure"; + return futureState._kind === "failure"; } - private _isBindingHold(bindingId: string): boolean { - const bindingState = this._getBinding(bindingId); + private _isFutureHold(futureId: string): boolean { + const futureState = this._getFuture(futureId); - return bindingState._kind === "hold"; + return futureState._kind === "hold"; } } diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 961ea66c6f..7e4eed7ebc 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -1,13 +1,13 @@ import setupDebug from "debug"; -import { InternalBinding } from "./bindings/InternalBinding"; +import { DeploymentState } from "./deployment-state"; +import { InternalFuture } from "./futures/InternalFuture"; import type { ModuleResult, SerializedDeploymentResult, SerializedModuleResult, -} from "./bindings/types"; -import { deserializeBindingOutput } from "./bindings/utils"; -import { DeploymentState } from "./deployment-state"; +} from "./futures/types"; +import { deserializeFutureOutput } from "./futures/utils"; import { Journal } from "./journal/types"; import { ExecutionGraph } from "./modules/ExecutionGraph"; import { IgnitionModule } from "./modules/IgnitionModule"; @@ -63,7 +63,7 @@ export class ExecutionEngine { const executors = ignitionModule.getSortedExecutors(); for (const executor of executors) { modulePlan.push({ - id: executor.binding.id, + id: executor.future.id, description: executor.getDescription(), }); } @@ -133,7 +133,7 @@ export class ExecutionEngine { const moduleResult: ModuleResult = Object.fromEntries( Object.entries(serializedModuleResult).map(([key, value]) => [ key, - deserializeBindingOutput(value), + deserializeFutureOutput(value), ]) ); @@ -176,14 +176,14 @@ export class ExecutionEngine { for (const executor of executors) { this._debug( - `Validating binding ${executor.binding.id} of module ${ignitionModule.id}` + `Validating future ${executor.future.id} of module ${ignitionModule.id}` ); const services = this._createServices( ignitionModule.id, - executor.binding.id + executor.future.id ); - const errors = await executor.validate(executor.binding.input, services); + const errors = await executor.validate(executor.future.input, services); if (errors.length > 0) { allErrors.push(...errors); } @@ -222,35 +222,35 @@ export class ExecutionEngine { } for (const executor of ignitionModule.getSortedExecutors()) { - this._debug(`Check ${ignitionModule.id}/${executor.binding.id}`); + this._debug(`Check ${ignitionModule.id}/${executor.future.id}`); if (executor.isReady() && runningCount < parallelizationLevel) { this._debug( - `Check dependencies of ${ignitionModule.id}/${executor.binding.id}` + `Check dependencies of ${ignitionModule.id}/${executor.future.id}` ); - const dependencies = executor.binding.getDependencies(); + const dependencies = executor.future.getDependencies(); const allDependenciesReady = dependencies.every((d) => - deploymentState.isBindingSuccess(d.moduleId, d.id) + deploymentState.isFutureSuccess(d.moduleId, d.id) ); if (allDependenciesReady) { const resolvedInput = this._resolve( - executor.binding.input, + executor.future.input, deploymentState ); const services = this._createServices( ignitionModule.id, - executor.binding.id + executor.future.id ); - this._debug(`Start ${ignitionModule.id}/${executor.binding.id}`); + this._debug(`Start ${ignitionModule.id}/${executor.future.id}`); // eslint-disable-next-line @typescript-eslint/no-floating-promises executor.run(resolvedInput, services, (newState) => { - deploymentState.setBindingState( + deploymentState.setFutureState( ignitionModule.id, - executor.binding.id, + executor.future.id, newState ); @@ -266,8 +266,8 @@ export class ExecutionEngine { } private _resolve(input: any, deploymentResult: DeploymentState): any { - if (InternalBinding.isBinding(input)) { - return deploymentResult.getBindingResult(input.moduleId, input.id); + if (InternalFuture.isFuture(input)) { + return deploymentResult.getFutureResult(input.moduleId, input.id); } if (Array.isArray(input)) { diff --git a/packages/core/src/executors/CallExecutor.ts b/packages/core/src/executors/CallExecutor.ts index d6be773742..ae30f041d0 100644 --- a/packages/core/src/executors/CallExecutor.ts +++ b/packages/core/src/executors/CallExecutor.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; -import { InternalContractBinding } from "../bindings/InternalContractBinding"; -import { CallOptions, Resolved } from "../bindings/types"; +import { InternalContractFuture } from "../futures/InternalContractFuture"; +import { CallOptions, Resolved } from "../futures/types"; import { Services } from "../services/types"; import { Tx } from "../types"; @@ -34,7 +34,7 @@ export class CallExecutor extends Executor { input: CallOptions, services: Services ): Promise { - const contractName = (input.contract as InternalContractBinding).input + const contractName = (input.contract as InternalContractFuture).input .contractName; const artifactExists = await services.artifacts.hasArtifact(contractName); @@ -81,9 +81,8 @@ export class CallExecutor extends Executor { } public getDescription() { - const contractName = ( - this.binding.input.contract as InternalContractBinding - ).input.contractName; - return `Call method ${this.binding.input.method} in contract ${contractName}`; + const contractName = (this.future.input.contract as InternalContractFuture) + .input.contractName; + return `Call method ${this.future.input.method} in contract ${contractName}`; } } diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts index 7b3d20056b..4f04f812ad 100644 --- a/packages/core/src/executors/ContractExecutor.ts +++ b/packages/core/src/executors/ContractExecutor.ts @@ -4,7 +4,7 @@ import { ArtifactContractOptions, ContractOptions, Resolved, -} from "../bindings/types"; +} from "../futures/types"; import { Services } from "../services/types"; import type { Artifact, Contract, DeployedContract } from "../types"; @@ -64,7 +64,7 @@ export class ContractExecutor extends Executor { } public getDescription() { - return `Deploy contract ${this.binding.input.contractName}`; + return `Deploy contract ${this.future.input.contractName}`; } private async _resolveArtifactFromInput( diff --git a/packages/core/src/executors/Executor.ts b/packages/core/src/executors/Executor.ts index 3ade567f03..a6a21838f4 100644 --- a/packages/core/src/executors/Executor.ts +++ b/packages/core/src/executors/Executor.ts @@ -1,13 +1,13 @@ import setupDebug, { IDebugger } from "debug"; -import { InternalBinding } from "../bindings/InternalBinding"; -import { BindingOutput, Resolved } from "../bindings/types"; -import { BindingState } from "../deployment-state"; +import { FutureState } from "../deployment-state"; +import { InternalFuture } from "../futures/InternalFuture"; +import { FutureOutput, Resolved } from "../futures/types"; import type { Services } from "../services/types"; import { Hold } from "./Hold"; -export abstract class Executor { +export abstract class Executor { private _dummyInput!: I; private _dummyOutput!: O; private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; @@ -16,10 +16,10 @@ export abstract class Executor { private holdReason?: string; private _debug: IDebugger; - constructor(public readonly binding: InternalBinding) { - const moduleId = binding.moduleId; - const bindingId = binding.id; - this._debug = setupDebug(`ignition:executor:${moduleId}:${bindingId}`); + constructor(public readonly future: InternalFuture) { + const moduleId = future.moduleId; + const futureId = future.id; + this._debug = setupDebug(`ignition:executor:${moduleId}:${futureId}`); } abstract execute(input: Resolved, services: Services): Promise; @@ -29,25 +29,25 @@ export abstract class Executor { public async run( input: Resolved, services: Services, - onStateChange: (newState: BindingState) => void + onStateChange: (newState: FutureState) => void ) { try { this._debug("Start running"); this._setRunning(); - onStateChange(BindingState.running()); + onStateChange(FutureState.running()); const result = await this.execute(input, services); this._debug("Ended successfully"); this._setSuccess(result); - onStateChange(BindingState.success(result)); + onStateChange(FutureState.success(result)); } catch (e: any) { if (e instanceof Hold) { this._debug("Ended with hold"); this._setHold(e.reason); - onStateChange(BindingState.hold(e.reason)); + onStateChange(FutureState.hold(e.reason)); } else { this._debug("Ended with error"); this._setFailure(e); - onStateChange(BindingState.failure(e)); + onStateChange(FutureState.failure(e)); } } } @@ -67,7 +67,7 @@ export abstract class Executor { public getHoldReason(): string { if (this.holdReason === undefined) { throw new Error( - `[executor ${this.binding.id}] assertion error: no hold reason` + `[executor ${this.future.id}] assertion error: no hold reason` ); } @@ -81,7 +81,7 @@ export abstract class Executor { public getResult() { if (this.result === undefined) { throw new Error( - `[executor ${this.binding.id}] assertion error: no result` + `[executor ${this.future.id}] assertion error: no result` ); } diff --git a/packages/core/src/executors/ExistingContractExecutor.ts b/packages/core/src/executors/ExistingContractExecutor.ts index 72313989cd..67d2fe8115 100644 --- a/packages/core/src/executors/ExistingContractExecutor.ts +++ b/packages/core/src/executors/ExistingContractExecutor.ts @@ -1,6 +1,6 @@ import { isAddress } from "@ethersproject/address"; -import { ExistingContractOptions } from "../bindings/types"; +import { ExistingContractOptions } from "../futures/types"; import { Services } from "../services/types"; import { Contract } from "../types"; @@ -35,7 +35,7 @@ export class ExistingContractExecutor extends Executor< ): Promise { if (!isAddress(input.address)) { return [ - `The existing contract ${this.binding.input.contractName} is an invalid address ${input.address}`, + `The existing contract ${this.future.input.contractName} is an invalid address ${input.address}`, ]; } @@ -43,6 +43,6 @@ export class ExistingContractExecutor extends Executor< } public getDescription() { - return `Using existing contract ${this.binding.input.contractName} (${this.binding.input.address})`; + return `Using existing contract ${this.future.input.contractName} (${this.future.input.address})`; } } diff --git a/packages/core/src/bindings/ArtifactContractBinding.ts b/packages/core/src/futures/ArtifactContractFuture.ts similarity index 64% rename from packages/core/src/bindings/ArtifactContractBinding.ts rename to packages/core/src/futures/ArtifactContractFuture.ts index a1e7368077..f8f5478b36 100644 --- a/packages/core/src/bindings/ArtifactContractBinding.ts +++ b/packages/core/src/futures/ArtifactContractFuture.ts @@ -1,14 +1,14 @@ import { Contract } from "../types"; -import { InternalBinding } from "./InternalBinding"; +import { InternalFuture } from "./InternalFuture"; import { ArtifactContractOptions } from "./types"; import { combineArgsAndLibrariesAsDeps } from "./utils"; -export class ArtifactContractBinding extends InternalBinding< +export class ArtifactContractFuture extends InternalFuture< ArtifactContractOptions, Contract > { - public getDependencies(): InternalBinding[] { + public getDependencies(): InternalFuture[] { return combineArgsAndLibrariesAsDeps( this.input.args, this.input.libraries ?? {} diff --git a/packages/core/src/futures/CallFuture.ts b/packages/core/src/futures/CallFuture.ts new file mode 100644 index 0000000000..a3112f19d4 --- /dev/null +++ b/packages/core/src/futures/CallFuture.ts @@ -0,0 +1,6 @@ +import { Tx } from "../types"; + +import { Future } from "./Future"; +import { CallOptions } from "./types"; + +export class CallFuture extends Future {} diff --git a/packages/core/src/bindings/ContractBinding.ts b/packages/core/src/futures/ContractFuture.ts similarity index 66% rename from packages/core/src/bindings/ContractBinding.ts rename to packages/core/src/futures/ContractFuture.ts index 43d60e3cdd..a29d6f5c93 100644 --- a/packages/core/src/bindings/ContractBinding.ts +++ b/packages/core/src/futures/ContractFuture.ts @@ -1,9 +1,9 @@ import { Contract } from "../types"; -import { Binding } from "./Binding"; +import { Future } from "./Future"; import { ContractOptions, ExistingContractOptions } from "./types"; -export class ContractBinding extends Binding< +export class ContractFuture extends Future< ContractOptions | ExistingContractOptions, Contract > {} diff --git a/packages/core/src/futures/ExistingContractFuture.ts b/packages/core/src/futures/ExistingContractFuture.ts new file mode 100644 index 0000000000..5cb15d5a45 --- /dev/null +++ b/packages/core/src/futures/ExistingContractFuture.ts @@ -0,0 +1,13 @@ +import { Contract } from "../types"; + +import { InternalFuture } from "./InternalFuture"; +import type { ExistingContractOptions } from "./types"; + +export class ExistingContractFuture extends InternalFuture< + ExistingContractOptions, + Contract +> { + public getDependencies(): InternalFuture[] { + return []; + } +} diff --git a/packages/core/src/bindings/Binding.ts b/packages/core/src/futures/Future.ts similarity index 61% rename from packages/core/src/bindings/Binding.ts rename to packages/core/src/futures/Future.ts index 5785bfeb28..99eae7792f 100644 --- a/packages/core/src/bindings/Binding.ts +++ b/packages/core/src/futures/Future.ts @@ -1,6 +1,6 @@ -import { BindingOutput } from "./types"; +import { FutureOutput } from "./types"; -export abstract class Binding { +export abstract class Future { // dummy variables needed by the type-checker to work correctly when opaque // types are used in a module definition protected _dummyInput!: I; diff --git a/packages/core/src/futures/InternalCallFuture.ts b/packages/core/src/futures/InternalCallFuture.ts new file mode 100644 index 0000000000..ba9960c536 --- /dev/null +++ b/packages/core/src/futures/InternalCallFuture.ts @@ -0,0 +1,31 @@ +import { Tx } from "../types"; + +import { InternalFuture } from "./InternalFuture"; +import { CallOptions, Unflattened } from "./types"; +import { deepFlatten } from "./utils"; + +export class InternalCallFuture extends InternalFuture { + public getDependencies(): InternalFuture[] { + const mapToFutures = (x: unknown): Unflattened => { + if (Array.isArray(x)) { + return x.map(mapToFutures); + } + + if (InternalFuture.isFuture(x)) { + return [x]; + } + + if (typeof x === "object" && x !== null) { + return Object.values(x).map(mapToFutures); + } + + return []; + }; + + const dependencies = deepFlatten( + mapToFutures([this.input.contract, ...this.input.args]) + ); + + return dependencies; + } +} diff --git a/packages/core/src/bindings/InternalContractBinding.ts b/packages/core/src/futures/InternalContractFuture.ts similarity index 63% rename from packages/core/src/bindings/InternalContractBinding.ts rename to packages/core/src/futures/InternalContractFuture.ts index d43ae65cd8..60120d285f 100644 --- a/packages/core/src/bindings/InternalContractBinding.ts +++ b/packages/core/src/futures/InternalContractFuture.ts @@ -1,14 +1,14 @@ import { Contract } from "../types"; -import { InternalBinding } from "./InternalBinding"; +import { InternalFuture } from "./InternalFuture"; import { ContractOptions } from "./types"; import { combineArgsAndLibrariesAsDeps } from "./utils"; -export class InternalContractBinding extends InternalBinding< +export class InternalContractFuture extends InternalFuture< ContractOptions, Contract > { - public getDependencies(): InternalBinding[] { + public getDependencies(): InternalFuture[] { return combineArgsAndLibrariesAsDeps( this.input.args, this.input.libraries ?? {} diff --git a/packages/core/src/futures/InternalFuture.ts b/packages/core/src/futures/InternalFuture.ts new file mode 100644 index 0000000000..b1285c8706 --- /dev/null +++ b/packages/core/src/futures/InternalFuture.ts @@ -0,0 +1,21 @@ +import { Future } from "./Future"; +import { FutureOutput } from "./types"; + +export abstract class InternalFuture< + I = unknown, + O extends FutureOutput = any +> extends Future { + constructor( + public readonly moduleId: string, + public readonly id: string, + public readonly input: I + ) { + super(); + } + + abstract getDependencies(): InternalFuture[]; + + public static isFuture(x: unknown): x is InternalFuture { + return x instanceof InternalFuture; + } +} diff --git a/packages/core/src/futures/types.ts b/packages/core/src/futures/types.ts new file mode 100644 index 0000000000..13e2b1b0d2 --- /dev/null +++ b/packages/core/src/futures/types.ts @@ -0,0 +1,50 @@ +import { Artifact, Contract, Tx } from "../types"; + +import { ContractFuture } from "./ContractFuture"; +import { Future } from "./Future"; +import { serializeFutureOutput } from "./utils"; + +export type FutureOutput = string | number | Contract | Tx; + +export type ModuleResult = Record; +export type SerializedModuleResult = Record; +export type SerializedFutureResult = ReturnType; + +export type SerializedDeploymentResult = Record; + +export interface ContractOptions { + contractName: string; + args: Array>; + libraries?: Record>; +} + +export interface ArtifactContractOptions { + contractName: string; + artifact: Artifact; + args: Array>; + libraries?: Record>; +} + +export interface ExistingContractOptions { + contractName: string; + address: string; + abi: any[]; +} + +export interface CallOptions { + contract: ContractFuture; + method: string; + args: Array>; +} + +export type IFuture = T | Future; + +export type AddressLike = IFuture | Future; + +export type Unflattened = T[] | Array>; + +export type Resolved = T extends Future + ? O + : { + [K in keyof T]: T[K] extends Future ? O : Resolved; + }; diff --git a/packages/core/src/bindings/utils.ts b/packages/core/src/futures/utils.ts similarity index 57% rename from packages/core/src/bindings/utils.ts rename to packages/core/src/futures/utils.ts index c8d3d5dc13..d01988f2fd 100644 --- a/packages/core/src/bindings/utils.ts +++ b/packages/core/src/futures/utils.ts @@ -1,5 +1,5 @@ -import { InternalBinding } from "./InternalBinding"; -import type { BindingOutput, Unflattened } from "./types"; +import { InternalFuture } from "./InternalFuture"; +import type { FutureOutput, Unflattened } from "./types"; export function deepFlatten(array: Unflattened): T[] { let result: T[] = []; @@ -15,7 +15,7 @@ export function deepFlatten(array: Unflattened): T[] { return result; } -export function serializeBindingOutput(x: BindingOutput) { +export function serializeFutureOutput(x: FutureOutput) { if (typeof x === "string") { return { _kind: "string" as const, value: x }; } else if (typeof x === "number") { @@ -30,31 +30,31 @@ export function serializeBindingOutput(x: BindingOutput) { return exhaustiveCheck; } -export function deserializeBindingOutput(x: any) { +export function deserializeFutureOutput(x: any) { if (x === null || x === undefined) { - throw new Error("[deserializeBindingOutput] value is null or undefined"); + throw new Error("[deserializeFutureOutput] value is null or undefined"); } if (!("_kind" in x)) { throw new Error( - "[deserializeBindingOutput] value was not serialized by Ignition" + "[deserializeFutureOutput] value was not serialized by Ignition" ); } return x.value; } -export function mapToBindings(x: unknown): Unflattened { +export function mapToFutures(x: unknown): Unflattened { if (Array.isArray(x)) { - return x.map(mapToBindings); + return x.map(mapToFutures); } - if (InternalBinding.isBinding(x)) { + if (InternalFuture.isFuture(x)) { return [x]; } if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToBindings); + return Object.values(x).map(mapToFutures); } return []; @@ -64,10 +64,10 @@ export function combineArgsAndLibrariesAsDeps( args: any[], libraries: Record ) { - const argBindings = deepFlatten(mapToBindings(args)); - const libraryBindings = deepFlatten(mapToBindings(Object.values(libraries))); + const argFutures = deepFlatten(mapToFutures(args)); + const libraryFutures = deepFlatten(mapToFutures(Object.values(libraries))); - const dependencies = argBindings.concat(libraryBindings); + const dependencies = argFutures.concat(libraryFutures); return dependencies; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d713c1368a..4d4b582b67 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,14 +1,14 @@ -export { Binding } from "./bindings/Binding"; -export { ContractBinding } from "./bindings/ContractBinding"; -export { InternalBinding } from "./bindings/InternalBinding"; -export { InternalContractBinding } from "./bindings/InternalContractBinding"; +export { Future } from "./futures/Future"; +export { ContractFuture } from "./futures/ContractFuture"; +export { InternalFuture } from "./futures/InternalFuture"; +export { InternalContractFuture } from "./futures/InternalContractFuture"; export type { AddressLike, ContractOptions, SerializedDeploymentResult, SerializedModuleResult, - SerializedBindingResult, -} from "./bindings/types"; + SerializedFutureResult, +} from "./futures/types"; export { Executor } from "./executors/Executor"; export { Hold } from "./executors/Hold"; diff --git a/packages/core/src/modules/ExecutionGraph.ts b/packages/core/src/modules/ExecutionGraph.ts index 1e09abdae8..733abaec21 100644 --- a/packages/core/src/modules/ExecutionGraph.ts +++ b/packages/core/src/modules/ExecutionGraph.ts @@ -7,23 +7,23 @@ export class ExecutionGraph { private _dependencies: Map> = new Map(); public addExecutor(executor: Executor) { - const moduleId = executor.binding.moduleId; + const moduleId = executor.future.moduleId; let executorsMap = this._modules.get(moduleId); if (executorsMap === undefined) { executorsMap = new Map(); this._modules.set(moduleId, executorsMap); } - if (executorsMap.has(executor.binding.id)) { - throw new Error(`Executor with id ${executor.binding.id} already exists`); + if (executorsMap.has(executor.future.id)) { + throw new Error(`Executor with id ${executor.future.id} already exists`); } - const dependencies = executor.binding.getDependencies(); + const dependencies = executor.future.getDependencies(); for (const dependency of dependencies) { this._addDependency(moduleId, dependency.moduleId); } - executorsMap.set(executor.binding.id, executor); + executorsMap.set(executor.future.id, executor); } public getModule(moduleId: string): IgnitionModule | undefined { diff --git a/packages/core/src/modules/IgnitionModule.ts b/packages/core/src/modules/IgnitionModule.ts index 70cc919cc1..92ede4babe 100644 --- a/packages/core/src/modules/IgnitionModule.ts +++ b/packages/core/src/modules/IgnitionModule.ts @@ -8,15 +8,15 @@ export class IgnitionModule { for (const executor of this._executors) { const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); + dependencies.get(executor.future.id) ?? new Set(); - for (const executorDependency of executor.binding.getDependencies()) { - if (executorDependency.moduleId === executor.binding.moduleId) { + for (const executorDependency of executor.future.getDependencies()) { + if (executorDependency.moduleId === executor.future.moduleId) { executorDependencies.add(executorDependency.id); } } - dependencies.set(executor.binding.id, executorDependencies); + dependencies.set(executor.future.id, executorDependencies); } const added = new Set(); @@ -24,15 +24,15 @@ export class IgnitionModule { while (added.size < this._executors.length) { for (const executor of this._executors) { - if (added.has(executor.binding.id)) { + if (added.has(executor.future.id)) { continue; } const executorDependencies = - dependencies.get(executor.binding.id) ?? new Set(); + dependencies.get(executor.future.id) ?? new Set(); if ([...executorDependencies].every((d) => added.has(d))) { sortedExecutors.push(executor); - added.add(executor.binding.id); + added.add(executor.future.id); } } } diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index 1ef7a57f18..c2623a87a2 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -1,18 +1,18 @@ -import { ArtifactContractBinding } from "../bindings/ArtifactContractBinding"; -import { ContractBinding } from "../bindings/ContractBinding"; -import { ExistingContractBinding } from "../bindings/ExistingContractBinding"; -import { InternalBinding } from "../bindings/InternalBinding"; -import { InternalCallBinding } from "../bindings/InternalCallBinding"; -import { InternalContractBinding } from "../bindings/InternalContractBinding"; -import type { - CallOptions, - ContractOptions, - ExistingContractOptions, -} from "../bindings/types"; import { CallExecutor } from "../executors/CallExecutor"; import { ContractExecutor } from "../executors/ContractExecutor"; import { Executor } from "../executors/Executor"; import { ExistingContractExecutor } from "../executors/ExistingContractExecutor"; +import { ArtifactContractFuture } from "../futures/ArtifactContractFuture"; +import { ContractFuture } from "../futures/ContractFuture"; +import { ExistingContractFuture } from "../futures/ExistingContractFuture"; +import { InternalCallFuture } from "../futures/InternalCallFuture"; +import { InternalContractFuture } from "../futures/InternalContractFuture"; +import { InternalFuture } from "../futures/InternalFuture"; +import type { + CallOptions, + ContractOptions, + ExistingContractOptions, +} from "../futures/types"; import type { Artifact, Contract, Tx } from "../types"; import { ExecutionGraph } from "./ExecutionGraph"; @@ -56,8 +56,8 @@ export class ModuleBuilderImpl implements ModuleBuilder { contractName: string, artifactOrOptions?: Artifact | UserContractOptions, givenOptions?: UserContractOptions - ): InternalBinding { - let binding; + ): InternalFuture { + let future; if (isArtifact(artifactOrOptions)) { const artifact = artifactOrOptions; const options = givenOptions; @@ -66,7 +66,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { const args = options?.args ?? []; const libraries = options?.libraries ?? {}; - binding = new ArtifactContractBinding(this.getModuleId(), id, { + future = new ArtifactContractFuture(this.getModuleId(), id, { contractName, args, libraries, @@ -79,45 +79,45 @@ export class ModuleBuilderImpl implements ModuleBuilder { const args = options?.args ?? []; const libraries = options?.libraries ?? {}; - binding = new InternalContractBinding(this.getModuleId(), id, { + future = new InternalContractFuture(this.getModuleId(), id, { contractName, args, libraries, }); } - this.addExecutor(new ContractExecutor(binding)); + this.addExecutor(new ContractExecutor(future)); - return binding; + return future; } public contractAt( contractName: string, address: string, abi: any[] - ): InternalBinding { + ): InternalFuture { const id = contractName; - const binding = new ExistingContractBinding(this.getModuleId(), id, { + const future = new ExistingContractFuture(this.getModuleId(), id, { contractName, address, abi, }); - this.addExecutor(new ExistingContractExecutor(binding)); + this.addExecutor(new ExistingContractExecutor(future)); - return binding; + return future; } public call( - contract: ContractBinding, + contract: ContractFuture, method: string, options?: UserCallOptions - ): InternalBinding { + ): InternalFuture { const id = - options?.id ?? `${(contract as InternalContractBinding).id}.${method}`; + options?.id ?? `${(contract as InternalContractFuture).id}.${method}`; const args = options?.args ?? []; - const b = new InternalCallBinding(this.getModuleId(), id, { + const b = new InternalCallFuture(this.getModuleId(), id, { contract, method, args, diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 655e4db629..96afebc88d 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -1,20 +1,20 @@ -import { CallBinding } from "../bindings/CallBinding"; -import { ContractBinding } from "../bindings/ContractBinding"; -import type { Bindable } from "../bindings/types"; import { Executor } from "../executors/Executor"; +import { CallFuture } from "../futures/CallFuture"; +import { ContractFuture } from "../futures/ContractFuture"; +import type { IFuture } from "../futures/types"; import { Artifact } from "../types"; import { UserModule } from "./UserModule"; export interface UserContractOptions { id?: string; - args?: Array>; - libraries?: Record; + args?: Array>; + libraries?: Record; } export interface UserCallOptions { id?: string; - args?: Array>; + args?: Array>; } export interface ModuleBuilder { @@ -27,19 +27,19 @@ export interface ModuleBuilder { contractName: string, artifactOrOptions?: Artifact | UserContractOptions, options?: UserContractOptions - ) => ContractBinding; + ) => ContractFuture; contractAt: ( contractName: string, address: string, abi: any[] - ) => ContractBinding; + ) => ContractFuture; call: ( - contract: ContractBinding, + contract: ContractFuture, method: string, options?: UserCallOptions - ) => CallBinding; + ) => CallFuture; useModule: (userModule: UserModule) => T; } diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx index ca5297533b..98530edd45 100644 --- a/packages/core/src/ui/components/index.tsx +++ b/packages/core/src/ui/components/index.tsx @@ -3,7 +3,7 @@ import Spinner from "ink-spinner"; import React from "react"; import { - BindingState, + FutureState, DeploymentState, ModuleState, } from "../../deployment-state"; @@ -48,7 +48,7 @@ const CurrentModule = ({ module }: { module?: ModuleState }) => { return null; } - const bindingsStates = module.getBindingsStates(); + const futuresStates = module.getFuturesStates(); return ( @@ -58,13 +58,13 @@ const CurrentModule = ({ module }: { module?: ModuleState }) => { - {bindingsStates - .sort((a, b) => compareBindingsStates(a[1], b[1])) - .map(([bindingId, bindingState]) => ( - compareFuturesStates(a[1], b[1])) + .map(([futureId, futureState]) => ( + ))} @@ -72,8 +72,8 @@ const CurrentModule = ({ module }: { module?: ModuleState }) => { ); }; -function compareBindingsStates(a: BindingState, b: BindingState): number { - const value = (s: BindingState["_kind"]) => { +function compareFuturesStates(a: FutureState, b: FutureState): number { + const value = (s: FutureState["_kind"]) => { if (s === "success" || s === "failure" || s === "hold") { return 0; } @@ -95,23 +95,23 @@ function compareBindingsStates(a: BindingState, b: BindingState): number { return aValue - bValue; } -const Binding = ({ - bindingId, - bindingState, +const Future = ({ + futureId, + futureState, }: { - bindingId: string; - bindingState: BindingState; + futureId: string; + futureState: FutureState; }) => { return ( - {bindingState._kind === "running" ? ( - {bindingId}: Executing - ) : bindingState._kind === "success" ? ( - {bindingId}: Executed - ) : bindingState._kind === "ready" ? ( - {bindingId}: Ready - ) : bindingState._kind === "waiting" ? ( - {bindingId}: Waiting + {futureState._kind === "running" ? ( + {futureId}: Executing + ) : futureState._kind === "success" ? ( + {futureId}: Executed + ) : futureState._kind === "ready" ? ( + {futureId}: Ready + ) : futureState._kind === "waiting" ? ( + {futureId}: Waiting ) : null} ); diff --git a/packages/core/test/bindings/existingContractBinding.ts b/packages/core/test/bindings/existingContractBinding.ts deleted file mode 100644 index 9832cbf833..0000000000 --- a/packages/core/test/bindings/existingContractBinding.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { assert } from "chai"; - -import { ExistingContractBinding } from "../../src/bindings/ExistingContractBinding"; -import { ExistingContractOptions } from "../../src/bindings/types"; - -describe("Existing Contract - binding", () => { - it("has no dependencies", () => { - const input: ExistingContractOptions = { - contractName: "MyContract", - address: "0x0000000000000000000000000000000000000000", - abi: [], - }; - - const binding = new ExistingContractBinding("MyModule", "binding-1", input); - - assert.deepStrictEqual(binding.getDependencies(), []); - }); -}); diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index e4ed93d332..837b69e547 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -24,7 +24,7 @@ describe("ExecutionGraph", function () { // given const executionGraph = new ExecutionGraph(); const module1Inc = inc("Module1", "inc1", 1); - const module2Inc = inc("Module2", "inc1", module1Inc.binding); + const module2Inc = inc("Module2", "inc1", module1Inc.future); executionGraph.addExecutor(module2Inc); executionGraph.addExecutor(module1Inc); @@ -49,7 +49,7 @@ describe("ExecutionGraph", function () { const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() - .map((e) => e.binding.id); + .map((e) => e.future.id); // then expect(executors).to.deep.equal(["inc1"]); @@ -59,14 +59,14 @@ describe("ExecutionGraph", function () { // given const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); - executionGraph.addExecutor(inc("MyModule", "incInc1", inc1.binding)); + executionGraph.addExecutor(inc("MyModule", "incInc1", inc1.future)); executionGraph.addExecutor(inc1); // when const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() - .map((e) => e.binding.id); + .map((e) => e.future.id); // then expect(executors).to.deep.equal(["inc1", "incInc1"]); @@ -76,8 +76,8 @@ describe("ExecutionGraph", function () { // given const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); - const incInc1 = inc("MyModule", "incInc1", inc1.binding); - const incIncInc1 = inc("MyModule", "incIncInc1", incInc1.binding); + const incInc1 = inc("MyModule", "incInc1", inc1.future); + const incIncInc1 = inc("MyModule", "incIncInc1", incInc1.future); executionGraph.addExecutor(incIncInc1); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -86,7 +86,7 @@ describe("ExecutionGraph", function () { const [ignitionModule] = executionGraph.getSortedModules(); const executors = ignitionModule .getSortedExecutors() - .map((e) => e.binding.id); + .map((e) => e.future.id); // then expect(executors).to.deep.equal(["inc1", "incInc1", "incIncInc1"]); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 663ea42f9c..5cd7e13c5c 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -51,9 +51,9 @@ describe("ExecutionEngine", function () { assert.isTrue(resultModule.isSuccess()); assert.equal(resultModule.count(), 1); - const bindingResult = deploymentResult.getBindingResult("MyModule", "inc1"); + const futureResult = deploymentResult.getFutureResult("MyModule", "inc1"); - assert.equal(bindingResult, 2); + assert.equal(futureResult, 2); assert.isTrue(inc1.isSuccess()); }); @@ -70,7 +70,7 @@ describe("ExecutionEngine", function () { const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "on-demand"; - const incInc1 = inc("MyModule", "incInc1", inc1.binding); + const incInc1 = inc("MyModule", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -99,8 +99,8 @@ describe("ExecutionEngine", function () { assert.isTrue(resultModules[0].isSuccess()); assert.equal(resultModules[0].count(), 2); - const inc1Result = deploymentState.getBindingResult("MyModule", "inc1"); - const incInc1Result = deploymentState.getBindingResult( + const inc1Result = deploymentState.getFutureResult("MyModule", "inc1"); + const incInc1Result = deploymentState.getFutureResult( "MyModule", "incInc1" ); @@ -124,7 +124,7 @@ describe("ExecutionEngine", function () { const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "fail"; - const incInc1 = inc("MyModule", "incInc1", inc1.binding); + const incInc1 = inc("MyModule", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -155,7 +155,7 @@ describe("ExecutionEngine", function () { const executionGraph = new ExecutionGraph(); const inc1 = inc("MyModule", "inc1", 1); inc1.behavior = "hold"; - const incInc1 = inc("MyModule", "incInc1", inc1.binding); + const incInc1 = inc("MyModule", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); diff --git a/packages/core/test/executors/CallExecutor.ts b/packages/core/test/executors/CallExecutor.ts index 016b5f3cfc..413237e562 100644 --- a/packages/core/test/executors/CallExecutor.ts +++ b/packages/core/test/executors/CallExecutor.ts @@ -1,9 +1,9 @@ import { assert } from "chai"; -import { InternalCallBinding } from "../../src/bindings/InternalCallBinding"; -import { InternalContractBinding } from "../../src/bindings/InternalContractBinding"; -import { CallOptions } from "../../src/bindings/types"; import { CallExecutor } from "../../src/executors/CallExecutor"; +import { InternalCallFuture } from "../../src/futures/InternalCallFuture"; +import { InternalContractFuture } from "../../src/futures/InternalContractFuture"; +import { CallOptions } from "../../src/futures/types"; import { Artifact } from "../../src/types"; describe("Call Executor", () => { @@ -90,7 +90,7 @@ describe("Call Executor", () => { deployedLinkReferences: {}, }; - const exampleContractBinding = new InternalContractBinding( + const exampleContractFuture = new InternalContractFuture( "MyModule", "MyContract", { @@ -102,7 +102,7 @@ describe("Call Executor", () => { it("should call existing function", async () => { const input: CallOptions = { - contract: exampleContractBinding, + contract: exampleContractFuture, method: "sub", args: [2], }; @@ -112,7 +112,7 @@ describe("Call Executor", () => { it("should call overloaded function", async () => { const input: CallOptions = { - contract: exampleContractBinding, + contract: exampleContractFuture, method: "inc(bool,uint256)", args: [true, 2], }; @@ -122,7 +122,7 @@ describe("Call Executor", () => { it("should fail on call to non-existing function", async () => { const input: CallOptions = { - contract: exampleContractBinding, + contract: exampleContractFuture, method: "nonexistant", args: [], }; @@ -134,7 +134,7 @@ describe("Call Executor", () => { it("should fail on call to existing function with wrong number of args", async () => { const input: CallOptions = { - contract: exampleContractBinding, + contract: exampleContractFuture, method: "sub", args: [], }; @@ -146,7 +146,7 @@ describe("Call Executor", () => { it("should fail on overloaded call to existing function with wrong number of args", async () => { const input: CallOptions = { - contract: exampleContractBinding, + contract: exampleContractFuture, method: "inc", args: [], }; @@ -172,9 +172,9 @@ async function assertCallValidation( }, }; - const binding = new InternalCallBinding("MyModule", "binding-1", input); + const future = new InternalCallFuture("MyModule", "future-1", input); - const ex = new CallExecutor(binding); + const ex = new CallExecutor(future); const validationResult = await ex.validate(input, { artifacts: mockArtifactsService, diff --git a/packages/core/test/executors/ExistingContractExecutor.ts b/packages/core/test/executors/ExistingContractExecutor.ts index cdc9429da6..2b3b881e57 100644 --- a/packages/core/test/executors/ExistingContractExecutor.ts +++ b/packages/core/test/executors/ExistingContractExecutor.ts @@ -1,8 +1,8 @@ import { assert } from "chai"; -import { ExistingContractBinding } from "../../src/bindings/ExistingContractBinding"; import { ExistingContractExecutor } from "../../src/executors/ExistingContractExecutor"; -import { ExistingContractOptions } from "../bindings/types"; +import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; +import { ExistingContractOptions } from "../../src/futures/types"; describe("Existing Contract - Executor", () => { describe("validate", () => { @@ -34,9 +34,9 @@ async function assertExistingContractValidation( input: ExistingContractOptions, expected: string[] ) { - const binding = new ExistingContractBinding("MyModule", "binding-1", input); + const future = new ExistingContractFuture("MyModule", "future-1", input); - const ex = new ExistingContractExecutor(binding); + const ex = new ExistingContractExecutor(future); const validationResult = await ex.validate(input, {} as any); diff --git a/packages/core/test/futures/ExistingContractFuture.ts b/packages/core/test/futures/ExistingContractFuture.ts new file mode 100644 index 0000000000..f5f24c63e4 --- /dev/null +++ b/packages/core/test/futures/ExistingContractFuture.ts @@ -0,0 +1,18 @@ +import { assert } from "chai"; + +import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; +import { ExistingContractOptions } from "../../src/futures/types"; + +describe("Existing Contract - future", () => { + it("has no dependencies", () => { + const input: ExistingContractOptions = { + contractName: "MyContract", + address: "0x0000000000000000000000000000000000000000", + abi: [], + }; + + const future = new ExistingContractFuture("MyModule", "future-1", input); + + assert.deepStrictEqual(future.getDependencies(), []); + }); +}); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 03bb5053c2..da3f2723eb 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,8 +1,8 @@ -import { InternalBinding } from "../src/bindings/InternalBinding"; -import { Bindable } from "../src/bindings/types"; import { DeploymentState } from "../src/deployment-state"; import { Executor } from "../src/executors/Executor"; import { Hold } from "../src/executors/Hold"; +import { InternalFuture } from "../src/futures/InternalFuture"; +import { IFuture } from "../src/futures/types"; import { ArtifactsProvider, EIP1193Provider, @@ -28,16 +28,16 @@ export function emptyDeploymentResult() { } /** - * Test executor that receives a number (or a binding that produces a number) + * Test executor that receives a number (or a future that produces a number) * and increments it. */ export function inc( moduleId: string, - bindingId: string, - x: Bindable + futureId: string, + x: IFuture ): IncreaseNumberExecutor { return new IncreaseNumberExecutor( - new IncreaseNumberBinding(moduleId, bindingId, x) + new IncreaseNumberFuture(moduleId, futureId, x) ); } @@ -87,13 +87,13 @@ class MockArtifactsProvider implements ArtifactsProvider { } } -class IncreaseNumberBinding extends InternalBinding, number> { - public getDependencies(): InternalBinding[] { - return InternalBinding.isBinding(this.input) ? [this.input] : []; +class IncreaseNumberFuture extends InternalFuture, number> { + public getDependencies(): InternalFuture[] { + return InternalFuture.isFuture(this.input) ? [this.input] : []; } } -class IncreaseNumberExecutor extends Executor, number> { +class IncreaseNumberExecutor extends Executor, number> { public behavior: "default" | "on-demand" | "fail" | "hold" = "default"; public finish: any; @@ -119,7 +119,7 @@ class IncreaseNumberExecutor extends Executor, number> { } public getDescription() { - const input = this.binding.input; + const input = this.future.input; if (typeof input === "number") { return `Increase ${input}`; diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index 18a99e8c67..25777e5a07 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -1,7 +1,7 @@ import { render, useInput } from "ink"; import { useRef, useState } from "react"; import { - BindingState, + FutureState, DeploymentState, ModuleState, } from "../src/deployment-state"; @@ -33,8 +33,8 @@ function getExamples(): Example[] { MyModule: ["Foo"], }, transitions: [ - (d) => d.setBindingState("MyModule", "Foo", BindingState.running()), - (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), + (d) => d.setFutureState("MyModule", "Foo", FutureState.running()), + (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), ], }); @@ -45,11 +45,11 @@ function getExamples(): Example[] { }, transitions: [ (d) => { - d.setBindingState("MyModule", "Foo", BindingState.running()); - d.setBindingState("MyModule", "Bar", BindingState.running()); + d.setFutureState("MyModule", "Foo", FutureState.running()); + d.setFutureState("MyModule", "Bar", FutureState.running()); }, - (d) => d.setBindingState("MyModule", "Bar", BindingState.success(2)), - (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), + (d) => d.setFutureState("MyModule", "Bar", FutureState.success(2)), + (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), ], }); @@ -60,10 +60,10 @@ function getExamples(): Example[] { MyOtherModule: ["Bar"], }, transitions: [ - (d) => d.setBindingState("MyModule", "Foo", BindingState.running()), - (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), - (d) => d.setBindingState("MyOtherModule", "Bar", BindingState.running()), - (d) => d.setBindingState("MyOtherModule", "Bar", BindingState.success(1)), + (d) => d.setFutureState("MyModule", "Foo", FutureState.running()), + (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyOtherModule", "Bar", FutureState.running()), + (d) => d.setFutureState("MyOtherModule", "Bar", FutureState.success(1)), ], }); @@ -74,15 +74,15 @@ function getExamples(): Example[] { }, transitions: [ (d) => { - d.setBindingState("MyModule", "Foo", BindingState.running()); - d.setBindingState("MyModule", "Bar", BindingState.running()); + d.setFutureState("MyModule", "Foo", FutureState.running()); + d.setFutureState("MyModule", "Bar", FutureState.running()); }, - (d) => d.setBindingState("MyModule", "Bar", BindingState.success(1)), - (d) => d.setBindingState("MyModule", "Foo", BindingState.success(1)), - (d) => d.setBindingState("MyModule", "Foo.f", BindingState.running()), - (d) => d.setBindingState("MyModule", "Bar.b", BindingState.running()), - (d) => d.setBindingState("MyModule", "Foo.f", BindingState.success(1)), - (d) => d.setBindingState("MyModule", "Bar.b", BindingState.success(1)), + (d) => d.setFutureState("MyModule", "Bar", FutureState.success(1)), + (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyModule", "Foo.f", FutureState.running()), + (d) => d.setFutureState("MyModule", "Bar.b", FutureState.running()), + (d) => d.setFutureState("MyModule", "Foo.f", FutureState.success(1)), + (d) => d.setFutureState("MyModule", "Bar.b", FutureState.success(1)), ], }); @@ -115,10 +115,10 @@ const ExampleRenderer = ({ onFinish: () => void; }) => { const deploymentState = new DeploymentState(); - for (const [moduleId, bindingsIds] of Object.entries(initialData)) { + for (const [moduleId, futuresIds] of Object.entries(initialData)) { const moduleState = new ModuleState(moduleId); - for (const bindingId of bindingsIds) { - moduleState.addBinding(bindingId, BindingState.waiting()); + for (const futureId of futuresIds) { + moduleState.addFuture(futureId, FutureState.waiting()); } deploymentState.addModule(moduleState); } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index f87d46d8ec..39d8c8db73 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,5 +1,5 @@ import { - Binding, + Future, DeploymentPlan, Ignition, UserModule, @@ -86,18 +86,18 @@ export class IgnitionWrapper { for (const [moduleId, moduleOutput] of Object.entries(moduleOutputs)) { const resolvedOutput: any = {}; for (const [key, value] of Object.entries(moduleOutput)) { - const serializedBindingResult = + const serializedFutureResult = deploymentResult.result[value.moduleId][value.id]; if ( - serializedBindingResult._kind === "string" || - serializedBindingResult._kind === "number" + serializedFutureResult._kind === "string" || + serializedFutureResult._kind === "number" ) { - resolvedOutput[key] = serializedBindingResult; - } else if (serializedBindingResult._kind === "tx") { - resolvedOutput[key] = serializedBindingResult.value.hash; + resolvedOutput[key] = serializedFutureResult; + } else if (serializedFutureResult._kind === "tx") { + resolvedOutput[key] = serializedFutureResult.value.hash; } else { - const { abi, address } = serializedBindingResult.value; + const { abi, address } = serializedFutureResult.value; resolvedOutput[key] = await this._ethers.getContractAt(abi, address); } } @@ -217,12 +217,12 @@ export class IgnitionWrapper { type Resolved = T extends string ? T - : T extends Binding + : T extends Future ? O extends string ? string : ethers.Contract : { - [K in keyof T]: T[K] extends Binding + [K in keyof T]: T[K] extends Future ? O extends string ? string : ethers.Contract diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 696a407568..3372656b81 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -18,14 +18,14 @@ export { buildModule, ModuleBuilder, AddressLike, - ContractBinding, + ContractFuture, ContractOptions, - InternalBinding, - InternalContractBinding, + InternalFuture, + InternalContractFuture, Executor, Contract, Services, - Binding, + Future, Hold, } from "@nomicfoundation/ignition-core"; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index f3bc45d17a..283e7c01c8 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,6 +1,6 @@ import { UserModule, - SerializedBindingResult, + SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, Contract, @@ -8,13 +8,13 @@ import { import { assert } from "chai"; export const resultAssertions = { - contract: (predicate?: ContractResultPredicate): ExpectedBindingResult => { + contract: (predicate?: ContractResultPredicate): ExpectedFutureResult => { return { kind: "contract", predicate: predicate ?? (async () => {}), }; }, - transaction: (): ExpectedBindingResult => { + transaction: (): ExpectedFutureResult => { return { kind: "transaction", }; @@ -22,7 +22,7 @@ export const resultAssertions = { }; type ContractResultPredicate = (contract: any) => Promise; -type ExpectedBindingResult = +type ExpectedFutureResult = | { kind: "contract"; predicate: ContractResultPredicate; @@ -30,15 +30,15 @@ type ExpectedBindingResult = | { kind: "transaction"; }; -type ExpectedModuleResult = Record; +type ExpectedModuleResult = Record; type ExpectedDeploymentState = Record; /** * Check that the given deployment result matches some conditions. * * `expectedResult` is an object with expected modules results, which have - * expected bindings results. These bindings results assert that that the - * result of each binding is of the correct type, and it can also run + * expected futures results. These futures results assert that that the + * result of each future is of the correct type, and it can also run * some custom predicate logic on the result to further verify it. */ export async function assertDeploymentState( @@ -68,23 +68,23 @@ export async function assertDeploymentState( Object.entries(expectedModule).length ); - for (const [bindingId, bindingResult] of Object.entries(moduleResult)) { - const expectedBindingResult = expectedModule[bindingId]; + for (const [futureId, futureResult] of Object.entries(moduleResult)) { + const expectedFutureResult = expectedModule[futureId]; - if (expectedBindingResult.kind === "contract") { - const contract = await assertContract(hre, bindingResult); + if (expectedFutureResult.kind === "contract") { + const contract = await assertContract(hre, futureResult); - await expectedBindingResult.predicate(contract); - } else if (expectedBindingResult.kind === "transaction") { - if (bindingResult._kind !== "tx") { + await expectedFutureResult.predicate(contract); + } else if (expectedFutureResult.kind === "transaction") { + if (futureResult._kind !== "tx") { assert.fail( - `Expected binding result to be a transaction, but got ${bindingResult._kind}` + `Expected future result to be a transaction, but got ${futureResult._kind}` ); } - assert.isDefined(bindingResult.value.hash); - await assertTxMined(hre, bindingResult.value.hash); + assert.isDefined(futureResult.value.hash); + await assertTxMined(hre, futureResult.value.hash); } else { - const _exhaustiveCheck: never = expectedBindingResult; + const _exhaustiveCheck: never = expectedFutureResult; } } } @@ -178,21 +178,18 @@ async function waitForPendingTxs( } } -async function assertContract( - hre: any, - bindingResult: SerializedBindingResult -) { - if (bindingResult._kind !== "contract") { +async function assertContract(hre: any, futureResult: SerializedFutureResult) { + if (futureResult._kind !== "contract") { assert.fail( - `Expected binding result to be a contract, but got ${bindingResult._kind}` + `Expected future result to be a contract, but got ${futureResult._kind}` ); } - await assertHasCode(hre, bindingResult.value.address); + await assertHasCode(hre, futureResult.value.address); const contract = await hre.ethers.getContractAt( - bindingResult.value.abi, - bindingResult.value.address + futureResult.value.abi, + futureResult.value.address ); return contract; From e876e2865be38eed77564ed64cee102094e44692 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 9 Aug 2022 22:31:08 -0400 Subject: [PATCH 0040/1302] refactored bindings -> futures in examples --- examples/simple-ts/ignition/Multisig.ts | 18 +++++------ .../simple-ts/ignition/MultisigAndTimelock.ts | 30 +++++++++---------- examples/simple-ts/ignition/Timelock.ts | 24 +++++++-------- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/examples/simple-ts/ignition/Multisig.ts b/examples/simple-ts/ignition/Multisig.ts index dce3c886d4..9dfb78a054 100644 --- a/examples/simple-ts/ignition/Multisig.ts +++ b/examples/simple-ts/ignition/Multisig.ts @@ -1,14 +1,14 @@ import { ethers } from "ethers"; import { AddressLike, - ContractBinding, + ContractFuture, ContractOptions, buildModule, ModuleBuilder, - InternalBinding, + InternalFuture, Executor, Services, - Binding, + Future, Hold, } from "@nomicfoundation/hardhat-ignition"; @@ -103,17 +103,17 @@ class MultisigContractExecutor extends Executor< } } -class MultisigContractBinding extends InternalBinding< +class MultisigContractFuture extends InternalFuture< MultiSigContractOptions, string > { - public getDependencies(): InternalBinding[] { + public getDependencies(): InternalFuture[] { return [ this.input.multiSigWalletAddress, this.input.destination, ...this.input.args, - ].filter((x): x is InternalBinding => { - return InternalBinding.isBinding(x); + ].filter((x): x is InternalFuture => { + return InternalFuture.isFuture(x); }); } } @@ -125,10 +125,10 @@ function callFromMultisig( destination: AddressLike, method: string, options: CallFromMultisigOptions -): Binding { +): Future { const id = options.id; const args = options?.args ?? []; - const b = new MultisigContractBinding(m.getModuleId(), id, { + const b = new MultisigContractFuture(m.getModuleId(), id, { multiSigWalletAddress: multisig, contractName, destination, diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts index 6b76383433..3009014e27 100644 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { - ContractBinding, + ContractFuture, buildModule, ModuleBuilder, - InternalBinding, + InternalFuture, Executor, Services, - Binding, + Future, Hold, } from "@nomicfoundation/hardhat-ignition"; @@ -16,9 +16,9 @@ interface CallFromMultisigAndTimelockOptions { } interface MultiSigContractOptions { - multisig: ContractBinding; - timelock: ContractBinding; - destination: ContractBinding; + multisig: ContractFuture; + timelock: ContractFuture; + destination: ContractFuture; method: string; args: unknown[]; } @@ -180,33 +180,33 @@ class MultisigAndTimelockExecutor extends Executor< } } -class MultisigAndTimelockBinding extends InternalBinding< +class MultisigAndTimelockFuture extends InternalFuture< MultiSigContractOptions, string > { - public getDependencies(): InternalBinding[] { + public getDependencies(): InternalFuture[] { return [ this.input.multisig, this.input.timelock, this.input.destination, ...this.input.args, - ].filter((x): x is InternalBinding => { - return InternalBinding.isBinding(x); + ].filter((x): x is InternalFuture => { + return InternalFuture.isFuture(x); }); } } function callFromMultisigAndTimelock( m: ModuleBuilder, - multisig: ContractBinding, - timelock: ContractBinding, - destination: ContractBinding, + multisig: ContractFuture, + timelock: ContractFuture, + destination: ContractFuture, method: string, options: CallFromMultisigAndTimelockOptions -): Binding { +): Future { const id = options.id; const args = options?.args ?? []; - const b = new MultisigAndTimelockBinding(m.getModuleId(), id, { + const b = new MultisigAndTimelockFuture(m.getModuleId(), id, { multisig, timelock, destination, diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index 22438e4beb..3533200218 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -1,9 +1,9 @@ import { ethers } from "ethers"; import { - ContractBinding, + ContractFuture, buildModule, ModuleBuilder, - InternalBinding, + InternalFuture, Executor, Contract, Services, @@ -82,16 +82,16 @@ class TimelockCallExecutor extends Executor { } interface TimelockCallOptions { - timelock: ContractBinding; - contract: ContractBinding; + timelock: ContractFuture; + contract: ContractFuture; method: string; } -class TimelockCallBinding extends InternalBinding { - public getDependencies(): InternalBinding[] { +class TimelockCallFuture extends InternalFuture { + public getDependencies(): InternalFuture[] { return [this.input.timelock, this.input.contract].filter( - (x): x is InternalBinding => { - return InternalBinding.isBinding(x); + (x): x is InternalFuture => { + return InternalFuture.isFuture(x); } ); } @@ -99,13 +99,13 @@ class TimelockCallBinding extends InternalBinding { function callFromTimelock( m: ModuleBuilder, - timelock: ContractBinding, - contract: ContractBinding, + timelock: ContractFuture, + contract: ContractFuture, method: string, options: { id: string } -): TimelockCallBinding { +): TimelockCallFuture { const id = options.id; - const b = new TimelockCallBinding(m.getModuleId(), id, { + const b = new TimelockCallFuture(m.getModuleId(), id, { timelock, contract, method, From 27a3c4a575f395b84f0436cc22dd77dfbab3e1ed Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 9 Aug 2022 22:34:34 -0400 Subject: [PATCH 0041/1302] refactored bindings -> futures in docs --- docs/creating-modules-for-deployment.md | 44 ++++++++++++------------- packages/core/src/deployment-state.ts | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index a64b85614c..33edbe5c10 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -6,13 +6,13 @@ For example, this is a minimal module `MyModule` that deploys an instance of a ` ```javascript // ./ignition/MyModule.ts -import { buildModule, ModuleBuilder } from "@nomicfoundation/hardhat-ignition" +import { buildModule, ModuleBuilder } from "@nomicfoundation/hardhat-ignition"; export default buildModule("MyModule", (m: ModuleBuilder) => { - const token = m.contract("Token") + const token = m.contract("Token"); - return { token } -}) + return { token }; +}); ``` Modules can be deployed directly at the cli (with `npx hardhat deploy ./ignition/MyModule.ts`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. @@ -24,10 +24,10 @@ During a deployment **Ignition** uses the module to generate an execution plan o Ignition is aware of the contracts within the `./contracts` **Hardhat** folder. Ignition can deploy any compilable local contract by name: ```tsx -const token = m.contract("Token") +const token = m.contract("Token"); ``` -`token` here is called a **contract binding**. It represents the contract that will *eventually* be deployed. +`token` here is called a **contract future**. It represents the contract that will _eventually_ be deployed. ### Constructor arguments @@ -35,22 +35,22 @@ In **Solidity** contracts may have constructor arguments that need satisfied on ```tsx const token = m.contract("Token", { - args: ["My Token", "TKN", 18] -}) + args: ["My Token", "TKN", 18], +}); ``` ### Dependencies between contracts -If a contract needs the address of another contract as a constructor argument, the contract binding can be used: +If a contract needs the address of another contract as a constructor argument, the contract future can be used: ```tsx -const a = m.contract("A") +const a = m.contract("A"); const b = m.contract("B", { - args: [a] -}) + args: [a], +}); ``` -You can think of this as `b` being analogue to a promise of an address, although bindings are not promises. +You can think of this as `b` being analogue to a promise of an address, although futures are not promises. ### Using an existing contract @@ -72,22 +72,22 @@ const artifact = await this.hre.artifacts.readArtifact("Foo"); const userModule = buildModule("MyModule", (m) => { m.contract("Foo", artifact, { - args: [0] + args: [0], }); }); ``` ### Linking libraries -A library can be deployed and linked to a contract by passing the libraries contract binding as a named entry under the libraries option: +A library can be deployed and linked to a contract by passing the libraries contract future as a named entry under the libraries option: ```tsx -const safeMath = m.contract("SafeMath") +const safeMath = m.contract("SafeMath"); const contract = m.contract("Contract", { libraries: { - SafeMath: safeMath - } -}) + SafeMath: safeMath, + }, +}); ``` A library is deployed in the same way as a contract. @@ -101,11 +101,11 @@ const userModule = buildModule("MyModule", (m) => { const daiAddresses = { 1: "0x123...", // mainnet DAI 4: "0x234...", // rinkeby DAI - } + }; const daiAddress = daiAddresses[m.chainId]; const myContract = m.contract("MyContract", { - args: [daiAddress] + args: [daiAddress], }); }); -``` \ No newline at end of file +``` diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index ee8494813b..408044f028 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -88,7 +88,7 @@ export class DeploymentState { if (futureState._kind !== "success") { throw new Error( - `assertion error, unsuccessful binding state: ${futureState._kind}` + `assertion error, unsuccessful future state: ${futureState._kind}` ); } From b288af1b38e27a87ddecbe9e1071827dfd093af1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 15 Aug 2022 17:36:27 +0100 Subject: [PATCH 0042/1302] feat: support getParam (#33) Support module level parameters and optional parameters: ```javascript const userModule = buildModule("MyModule", (m: any) => { const myNumber = m.getParam("MyNumber"); const symbol = m.getOptionalParam("tokenSymbol", "TKN") const foo = m.contract("Foo"); m.call(foo, "incByPositiveNumber", { args: [myNumber, symbol], }); return { foo }; }); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: { MyNumber: 123, }, }); ``` The same binding and executor as a standard parameter are used with optional parameters, with an additional default value (undefined when no default value is given). As we limit the types of param to `string | number` we can use `undefined` to mean **no default value** within the param binding. Minimal validation on the presences of required params and against duplicate params is included. Params can be passed at the cli with the `--parameters` flag that accepts a string that will be parsed to a json object. More details are included in the `README.md` and module guide. --- docs/creating-modules-for-deployment.md | 19 ++ docs/getting-started-guide.md | 7 + examples/simple/ignition/MyOtherModule.js | 1 + examples/simple/ignition/ParamModule.js | 13 + packages/core/src/execution-engine.ts | 7 + packages/core/src/executors/ParamExecutor.ts | 54 ++++ packages/core/src/futures/ParamFuture.ts | 8 + packages/core/src/futures/types.ts | 6 + packages/core/src/index.ts | 3 +- packages/core/src/modules/ExecutionGraph.ts | 17 +- packages/core/src/modules/IgnitionModule.ts | 1 + .../core/src/modules/ModuleBuilderImpl.ts | 29 ++ packages/core/src/modules/types.ts | 10 + packages/core/src/providers.ts | 19 ++ packages/core/src/services/ConfigService.ts | 14 + packages/core/src/services/types.ts | 2 + packages/core/test/helpers.ts | 19 ++ packages/hardhat-plugin/.nycrc | 2 +- packages/hardhat-plugin/src/ConfigWrapper.ts | 51 ++++ .../hardhat-plugin/src/ignition-wrapper.ts | 23 +- packages/hardhat-plugin/src/index.ts | 37 ++- .../minimal/contracts/Contracts.sol | 43 ++- .../user-modules/contracts/Contracts.sol | 6 + packages/hardhat-plugin/test/helpers.ts | 2 +- packages/hardhat-plugin/test/param.ts | 284 ++++++++++++++++++ 25 files changed, 651 insertions(+), 26 deletions(-) create mode 100644 examples/simple/ignition/ParamModule.js create mode 100644 packages/core/src/executors/ParamExecutor.ts create mode 100644 packages/core/src/futures/ParamFuture.ts create mode 100644 packages/core/src/services/ConfigService.ts create mode 100644 packages/hardhat-plugin/src/ConfigWrapper.ts create mode 100644 packages/hardhat-plugin/test/param.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 33edbe5c10..6b28fcf4a3 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -109,3 +109,22 @@ const userModule = buildModule("MyModule", (m) => { }); }); ``` + +### Module Parameters + + +Modules can have parameters that are accessed using the ModuleBuilder object: + +```tsx +const symbol = m.getParam("tokenSymbol") +const name = m.getParam("tokenName") +const token = m.contract("Token", { + args: [symbol, name, 1_000_000] +}) +``` + +When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: + +```tsx +const symbol = m.getOptionalParam("tokenSymbol", "TKN") +``` diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 0b7dd15b4d..bad0a8e47b 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -52,6 +52,13 @@ To deploy against a network configured in `hardhat.config.{ts,js}` pass the netw npx hardhat deploy --network mainnet ./ignition/MyModule.ts ``` +Modules that accept parameters can be passed those parameters at the command line via a json string: + +```shell +npx hardhat deploy --parameters "{\"IncAmount\": 5}" ParamModule.js +# Ensure you have properly escaped the json string +``` + Next, dig deeper into defining modules: [Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/examples/simple/ignition/MyOtherModule.js b/examples/simple/ignition/MyOtherModule.js index de811a6c46..07375a5905 100644 --- a/examples/simple/ignition/MyOtherModule.js +++ b/examples/simple/ignition/MyOtherModule.js @@ -7,6 +7,7 @@ module.exports = buildModule("MyOtherModule", (m) => { m.call(foo, "inc", { args: [1], }); + m.call(foo2, "inc", { args: [1], }); diff --git a/examples/simple/ignition/ParamModule.js b/examples/simple/ignition/ParamModule.js new file mode 100644 index 0000000000..c0c96cb9c1 --- /dev/null +++ b/examples/simple/ignition/ParamModule.js @@ -0,0 +1,13 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); + +module.exports = buildModule("ParamModule", (m) => { + const incAmount = m.getParam("IncAmount"); + + const foo = m.contract("Foo"); + + m.call(foo, "inc", { + args: [incAmount], + }); + + return { foo }; +}); diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 7e4eed7ebc..3d3475ac3c 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -13,6 +13,7 @@ import { ExecutionGraph } from "./modules/ExecutionGraph"; import { IgnitionModule } from "./modules/IgnitionModule"; import { Providers } from "./providers"; import { ArtifactsService } from "./services/ArtifactsService"; +import { ConfigService } from "./services/ConfigService"; import { ContractsService } from "./services/ContractsService"; import { TransactionsService } from "./services/TransactionsService"; import type { Services } from "./services/types"; @@ -95,10 +96,13 @@ export class ExecutionEngine { let hasErrors = false; for (const executionModule of executionModules) { this._debug(`Validating module ${executionModule.id}`); + const errors = await this._validateModule(executionModule); + if (errors.length > 0) { hasErrors = true; } + errorsPerModule.set(executionModule.id, errors); } @@ -228,7 +232,9 @@ export class ExecutionEngine { this._debug( `Check dependencies of ${ignitionModule.id}/${executor.future.id}` ); + const dependencies = executor.future.getDependencies(); + const allDependenciesReady = dependencies.every((d) => deploymentState.isFutureSuccess(d.moduleId, d.id) ); @@ -301,6 +307,7 @@ export class ExecutionEngine { pollingInterval: this._options.txPollingInterval, }), transactions: new TransactionsService(this._providers), + config: new ConfigService(this._providers), }; return services; diff --git a/packages/core/src/executors/ParamExecutor.ts b/packages/core/src/executors/ParamExecutor.ts new file mode 100644 index 0000000000..143c9f11df --- /dev/null +++ b/packages/core/src/executors/ParamExecutor.ts @@ -0,0 +1,54 @@ +import { ParamOptions } from "../futures/types"; +import { Services } from "../services/types"; + +import { Executor } from "./Executor"; + +export class ParamExecutor extends Executor { + public async execute( + { paramName, defaultValue }: ParamOptions, + services: Services + ): Promise { + const hasParamResult = await services.config.hasParam(paramName); + + if (defaultValue !== undefined) { + if (hasParamResult.found) { + return services.config.getParam(paramName); + } else { + return defaultValue; + } + } + + return services.config.getParam(paramName); + } + + public async validate( + { paramName, defaultValue }: ParamOptions, + services: Services + ): Promise { + const hasParamResult = await services.config.hasParam(paramName); + + if (defaultValue !== undefined) { + return []; + } + + if (!hasParamResult.found && hasParamResult.errorCode === "no-params") { + return [ + `No parameters object provided to deploy options, but module requires parameter "${paramName}"`, + ]; + } + + if (!hasParamResult.found && hasParamResult.errorCode === "param-missing") { + return [`No parameter provided for "${paramName}"`]; + } + + if (!hasParamResult.found) { + return ["Unexpected state during lookup"]; + } + + return []; + } + + public getDescription(): string { + return `Read param ${this.future.input.paramName}`; + } +} diff --git a/packages/core/src/futures/ParamFuture.ts b/packages/core/src/futures/ParamFuture.ts new file mode 100644 index 0000000000..e2d71eba47 --- /dev/null +++ b/packages/core/src/futures/ParamFuture.ts @@ -0,0 +1,8 @@ +import { InternalFuture } from "./InternalFuture"; +import { ParamOptions } from "./types"; + +export class ParamFuture extends InternalFuture { + public getDependencies(): Array> { + return []; + } +} diff --git a/packages/core/src/futures/types.ts b/packages/core/src/futures/types.ts index 13e2b1b0d2..2631b8ce7f 100644 --- a/packages/core/src/futures/types.ts +++ b/packages/core/src/futures/types.ts @@ -1,3 +1,4 @@ +import { ParamValue } from "../modules/types"; import { Artifact, Contract, Tx } from "../types"; import { ContractFuture } from "./ContractFuture"; @@ -37,6 +38,11 @@ export interface CallOptions { args: Array>; } +export interface ParamOptions { + paramName: string; + defaultValue?: ParamValue; +} + export type IFuture = T | Future; export type AddressLike = IFuture | Future; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 4d4b582b67..429d248909 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -16,10 +16,11 @@ export { Hold } from "./executors/Hold"; export { buildModule } from "./modules/buildModule"; export type { ModuleBuilder } from "./modules/types"; export { UserModule } from "./modules/UserModule"; +export type { ParamValue, ModuleDefinition } from "./modules/types"; export type { Services } from "./services/types"; -export type { Providers } from "./providers"; +export type { Providers, ConfigProvider, HasParamResult } from "./providers"; export type { DeploymentResult } from "./execution-engine"; export { DeploymentPlan } from "./execution-engine"; diff --git a/packages/core/src/modules/ExecutionGraph.ts b/packages/core/src/modules/ExecutionGraph.ts index 733abaec21..581516d7bb 100644 --- a/packages/core/src/modules/ExecutionGraph.ts +++ b/packages/core/src/modules/ExecutionGraph.ts @@ -1,4 +1,5 @@ import { Executor } from "../executors/Executor"; +import { ParamFuture } from "../futures/ParamFuture"; import { IgnitionModule } from "./IgnitionModule"; @@ -15,7 +16,21 @@ export class ExecutionGraph { } if (executorsMap.has(executor.future.id)) { - throw new Error(`Executor with id ${executor.future.id} already exists`); + if (executor.future instanceof ParamFuture) { + if (executor.future.input.defaultValue === undefined) { + throw new Error( + `A parameter should only be retrieved once, but found more than one call to getParam for "${executor.future.id}"` + ); + } else { + throw new Error( + `An optional parameter should only be retrieved once, but found more than one call to getParam for "${executor.future.id}"` + ); + } + } else { + throw new Error( + `Executor with id ${executor.future.id} already exists` + ); + } } const dependencies = executor.future.getDependencies(); diff --git a/packages/core/src/modules/IgnitionModule.ts b/packages/core/src/modules/IgnitionModule.ts index 92ede4babe..974d287dd7 100644 --- a/packages/core/src/modules/IgnitionModule.ts +++ b/packages/core/src/modules/IgnitionModule.ts @@ -30,6 +30,7 @@ export class IgnitionModule { const executorDependencies = dependencies.get(executor.future.id) ?? new Set(); + if ([...executorDependencies].every((d) => added.has(d))) { sortedExecutors.push(executor); added.add(executor.future.id); diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/modules/ModuleBuilderImpl.ts index c2623a87a2..7b55e4f4f3 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/modules/ModuleBuilderImpl.ts @@ -2,12 +2,14 @@ import { CallExecutor } from "../executors/CallExecutor"; import { ContractExecutor } from "../executors/ContractExecutor"; import { Executor } from "../executors/Executor"; import { ExistingContractExecutor } from "../executors/ExistingContractExecutor"; +import { ParamExecutor } from "../executors/ParamExecutor"; import { ArtifactContractFuture } from "../futures/ArtifactContractFuture"; import { ContractFuture } from "../futures/ContractFuture"; import { ExistingContractFuture } from "../futures/ExistingContractFuture"; import { InternalCallFuture } from "../futures/InternalCallFuture"; import { InternalContractFuture } from "../futures/InternalContractFuture"; import { InternalFuture } from "../futures/InternalFuture"; +import { ParamFuture } from "../futures/ParamFuture"; import type { CallOptions, ContractOptions, @@ -21,6 +23,7 @@ import type { ModuleBuilder, UserContractOptions, UserCallOptions, + ParamValue, } from "./types"; import { isArtifact } from "./utils"; @@ -148,4 +151,30 @@ export class ModuleBuilderImpl implements ModuleBuilder { return output; } + + public getParam(paramName: string): ParamFuture { + const id = paramName; + + const future = new ParamFuture(this.getModuleId(), id, { paramName }); + + this.addExecutor(new ParamExecutor(future)); + + return future; + } + + public getOptionalParam( + paramName: string, + defaultValue: ParamValue + ): ParamFuture { + const id = paramName; + + const future = new ParamFuture(this.getModuleId(), id, { + paramName, + defaultValue, + }); + + this.addExecutor(new ParamExecutor(future)); + + return future; + } } diff --git a/packages/core/src/modules/types.ts b/packages/core/src/modules/types.ts index 96afebc88d..3a968a94c2 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/modules/types.ts @@ -1,6 +1,7 @@ import { Executor } from "../executors/Executor"; import { CallFuture } from "../futures/CallFuture"; import { ContractFuture } from "../futures/ContractFuture"; +import { ParamFuture } from "../futures/ParamFuture"; import type { IFuture } from "../futures/types"; import { Artifact } from "../types"; @@ -17,6 +18,8 @@ export interface UserCallOptions { args?: Array>; } +export type ParamValue = string | number; + export interface ModuleBuilder { chainId: number; @@ -42,6 +45,13 @@ export interface ModuleBuilder { ) => CallFuture; useModule: (userModule: UserModule) => T; + + getParam: (paramName: string) => ParamFuture; + + getOptionalParam: ( + paramName: string, + defaultValue: ParamValue + ) => ParamFuture; } export type ModuleDefinition = (m: ModuleBuilder) => T; diff --git a/packages/core/src/providers.ts b/packages/core/src/providers.ts index e90f630509..446d23e6e6 100644 --- a/packages/core/src/providers.ts +++ b/packages/core/src/providers.ts @@ -1,5 +1,6 @@ import type { ethers } from "ethers"; +import { ParamValue } from "./modules/types"; import { Artifact } from "./types"; export interface Providers { @@ -8,6 +9,7 @@ export interface Providers { gasProvider: GasProvider; signers: SignersProvider; transactions: TransactionsProvider; + config: ConfigProvider; } export interface ArtifactsProvider { @@ -35,6 +37,23 @@ export interface TransactionsProvider { isMined(txHash: string): Promise; } +export type HasParamErrorCode = "no-params" | "param-missing"; + +export type HasParamResult = + | { + found: false; + errorCode: HasParamErrorCode; + } + | { found: true }; + +export interface ConfigProvider { + setParams(parameters: { [key: string]: ParamValue }): Promise; + + getParam(paramName: string): Promise; + + hasParam(paramName: string): Promise; +} + export interface IgnitionSigner { sendTransaction: ( tx: ethers.providers.TransactionRequest diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts new file mode 100644 index 0000000000..08e6ade574 --- /dev/null +++ b/packages/core/src/services/ConfigService.ts @@ -0,0 +1,14 @@ +import { ParamValue } from "../modules/types"; +import { HasParamResult, Providers } from "../providers"; + +export class ConfigService { + constructor(private readonly _providers: Providers) {} + + public getParam(paramName: string): Promise { + return this._providers.config.getParam(paramName); + } + + public hasParam(paramName: string): Promise { + return this._providers.config.hasParam(paramName); + } +} diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 5606ea0b43..91aeeb8a5a 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import { ArtifactsService } from "./ArtifactsService"; +import { ConfigService } from "./ConfigService"; import { ContractsService } from "./ContractsService"; import { TransactionsService } from "./TransactionsService"; @@ -13,4 +14,5 @@ export interface Services { contracts: ContractsService; artifacts: ArtifactsService; transactions: TransactionsService; + config: ConfigService; } diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index da3f2723eb..9d144b13ab 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -5,14 +5,18 @@ import { InternalFuture } from "../src/futures/InternalFuture"; import { IFuture } from "../src/futures/types"; import { ArtifactsProvider, + ConfigProvider, EIP1193Provider, GasProvider, + HasParamResult, IgnitionSigner, Providers, SignersProvider, TransactionsProvider, } from "../src/providers"; +import { ParamValue } from "./modules/types"; + export function getMockedProviders(): Providers { return { artifacts: new MockArtifactsProvider(), @@ -20,6 +24,7 @@ export function getMockedProviders(): Providers { gasProvider: new MockGasProvider(), signers: new MockSignersProvider(), transactions: new TransactionsMockProvider(), + config: new ConfigMockProvider(), }; } @@ -78,6 +83,20 @@ class TransactionsMockProvider implements TransactionsProvider { } } +class ConfigMockProvider implements ConfigProvider { + public setParams(_parameters: { [key: string]: ParamValue }): Promise { + throw new Error("Method not implemented."); + } + + public hasParam(_paramName: string): Promise { + throw new Error("Method not implemented."); + } + + public getParam(_paramName: string): Promise { + throw new Error("not implemented"); + } +} + class MockArtifactsProvider implements ArtifactsProvider { public async getArtifact(_name: string): Promise { throw new Error("not implemented"); diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-plugin/.nycrc index 15ad54e236..c573ff2ac1 100644 --- a/packages/hardhat-plugin/.nycrc +++ b/packages/hardhat-plugin/.nycrc @@ -1,6 +1,6 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "check-coverage": true, + "check-coverage": false, "statements": 50, "branches": 30, "functions": 42, diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts new file mode 100644 index 0000000000..7ca013dea8 --- /dev/null +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -0,0 +1,51 @@ +import type { + ConfigProvider, + ParamValue, + HasParamResult, +} from "@nomicfoundation/ignition-core"; + +export class ConfigWrapper implements ConfigProvider { + private parameters: { [key: string]: ParamValue } | undefined; + + constructor() { + this.parameters = undefined; + } + + public async setParams( + parameters: + | { + [key: string]: ParamValue; + } + | undefined + ): Promise { + this.parameters = parameters; + } + + public async getParam(paramName: string): Promise { + if (this.parameters === undefined) { + throw new Error( + `No parameters object provided to deploy options, but module requires parameter "${paramName}"` + ); + } + + return this.parameters[paramName]; + } + + public async hasParam(paramName: string): Promise { + if (this.parameters === undefined) { + return { + found: false, + errorCode: "no-params", + }; + } + + const paramFound = paramName in this.parameters; + + return paramFound + ? { found: true } + : { + found: false, + errorCode: "param-missing", + }; + } +} diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 39d8c8db73..49f023b402 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -6,6 +6,7 @@ import { IgnitionDeployOptions, SerializedModuleResult, Providers, + ParamValue, } from "@nomicfoundation/ignition-core"; import { ethers } from "ethers"; import fsExtra from "fs-extra"; @@ -22,13 +23,13 @@ export class IgnitionWrapper { private _cachedChainId: number | undefined; constructor( - providers: Providers, + private _providers: Providers, private _ethers: HardhatEthers, private _isHardhatNetwork: boolean, private _paths: HardhatPaths, private _deployOptions: IgnitionDeployOptions ) { - this._ignition = new Ignition(providers, { + this._ignition = new Ignition(_providers, { load: (moduleId) => this._getModuleResult(moduleId), save: (moduleId, moduleResult) => this._saveModuleResult(moduleId, moduleResult), @@ -36,9 +37,14 @@ export class IgnitionWrapper { } public async deploy( - userModuleOrName: UserModule | string + userModuleOrName: UserModule | string, + deployParams: { parameters: { [key: string]: ParamValue } } | undefined ): Promise> { - const [, resolvedOutputs] = await this.deployMany([userModuleOrName]); + const [, resolvedOutputs] = await this.deployMany( + [userModuleOrName], + deployParams + ); + return resolvedOutputs[0]; } @@ -47,7 +53,14 @@ export class IgnitionWrapper { * array with the resolved outputs that corresponds to each module in * the input. */ - public async deployMany(userModulesOrNames: Array | string>) { + public async deployMany( + userModulesOrNames: Array | string>, + deployParams: { parameters: { [key: string]: ParamValue } } | undefined + ) { + if (deployParams !== undefined) { + await this._providers.config.setParams(deployParams.parameters); + } + const userModules: Array> = []; for (const userModuleOrName of userModulesOrNames) { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3372656b81..3f30ac0ba8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -10,6 +10,7 @@ import { import { lazyObject } from "hardhat/plugins"; import path from "path"; +import { ConfigWrapper } from "./ConfigWrapper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadUserModules, loadAllUserModules } from "./user-modules"; import "./type-extensions"; @@ -93,6 +94,7 @@ extendEnvironment((hre) => { return receipt !== null; }, }, + config: new ConfigWrapper(), }; hre.ignition = lazyObject(() => { @@ -120,10 +122,31 @@ extendEnvironment((hre) => { */ task("deploy") .addOptionalVariadicPositionalParam("userModulesPaths") + .addOptionalParam( + "parameters", + "A json object as a string, of the module paramters" + ) .setAction( - async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { + async ( + { + userModulesPaths = [], + parameters: parametersAsJson, + }: { userModulesPaths: string[]; parameters?: string }, + hre + ) => { await hre.run("compile", { quiet: true }); + let parameters: { [key: string]: number | string }; + try { + parameters = + parametersAsJson !== undefined + ? JSON.parse(parametersAsJson) + : undefined; + } catch { + console.warn("Could not parse parameters json"); + process.exit(0); + } + let userModules: Array>; if (userModulesPaths.length === 0) { userModules = loadAllUserModules(hre.config.paths.ignition); @@ -141,24 +164,32 @@ task("deploy") await hre.run("deploy:deploy-modules", { userModules, + parameters, }); } ); subtask("deploy:deploy-modules") .addParam("userModules", undefined, undefined, types.any) + .addOptionalParam("parameters", undefined, undefined, types.any) .setAction( async ( { userModules, - }: { userModules: Array>; pathToJournal?: string }, + parameters, + }: { + userModules: Array>; + pathToJournal?: string; + parameters: { [key: string]: string | number }; + }, hre ) => { // we ignore the module outputs because they are not relevant when // the deployment is done via a task (as opposed to a deployment // done with `hre.ignition.deploy`) const [serializedDeploymentResult] = await hre.ignition.deployMany( - userModules + userModules, + { parameters } ); return serializedDeploymentResult; diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 174ff94005..3a8836c7dd 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -1,25 +1,40 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + contract Foo { - bool public isFoo = true; - uint public x = 1; + bool public isFoo = true; + uint256 public x = 1; - function inc() public { - x++; - } + function inc() public { + x++; + } - function incByPositiveNumber(uint n) public { - require(n > 0, "n must be positive"); - x += n; - } + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } } contract Bar { - bool public isBar = true; + bool public isBar = true; } contract UsesContract { - address public contractAddress; + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } - constructor (address _contract) { - contractAddress = _contract; - } + function getGreeting() public view returns (string memory) { + return _greeting; + } } diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol index 174ff94005..f975a1abdc 100644 --- a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol @@ -10,6 +10,12 @@ contract Foo { require(n > 0, "n must be positive"); x += n; } + + function incTwoNumbers(uint n, uint y) public { + require(n > 0, "n must be positive"); + x += n; + x += y; + } } contract Bar { diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 283e7c01c8..bbd29a2c90 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -134,7 +134,7 @@ export async function deployModules( return deploymentResult.result; } -async function mineBlocks( +export async function mineBlocks( hre: any, expectedBlocks: number[], finished: Promise diff --git a/packages/hardhat-plugin/test/param.ts b/packages/hardhat-plugin/test/param.ts new file mode 100644 index 0000000000..7ca652ff85 --- /dev/null +++ b/packages/hardhat-plugin/test/param.ts @@ -0,0 +1,284 @@ +import { buildModule, ModuleDefinition } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlocks } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("params", () => { + useEnvironment("minimal"); + + describe("required", () => { + it("should be able to retrieve a number", async function () { + const result = await deployModule( + this.hre, + (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }, + { + parameters: { + MyNumber: 123, + }, + } + ); + + const v = await result.foo.x(); + + assert.equal(v, Number(124)); + }); + + it("should be able to retrieve a string", async function () { + const result = await deployModule( + this.hre, + (m) => { + const myString = m.getParam("MyString"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }, + { + parameters: { + MyString: "Example", + }, + } + ); + + const v = await result.greeter.getGreeting(); + + assert.equal(v, "Example"); + }); + }); + + describe("optional", () => { + it("should be able to retrieve a default number", async function () { + const result = await deployModule(this.hre, (m) => { + const myNumber = m.getOptionalParam("MyNumber", 42); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + // then + const v = await result.foo.x(); + + assert.equal(v, Number(43)); + }); + + it("should be able to override a default number", async function () { + const result = await deployModule( + this.hre, + (m) => { + const myNumber = m.getOptionalParam("MyNumber", 10); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }, + { + parameters: { + MyNumber: 20, + }, + } + ); + + // then + const v = await result.foo.x(); + + assert.equal(v, Number(21)); + }); + + it("should be able to retrieve a default string", async function () { + const result = await deployModule(this.hre, (m) => { + const myString = m.getOptionalParam("MyString", "Example"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }); + + const v = await result.greeter.getGreeting(); + + assert.equal(v, "Example"); + }); + + it("should be able to override a default string", async function () { + const result = await deployModule( + this.hre, + (m) => { + const myString = m.getOptionalParam("MyString", "Example"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }, + { + parameters: { + MyString: "NotExample", + }, + } + ); + + // then + const v = await result.greeter.getGreeting(); + + assert.equal(v, "NotExample"); + }); + }); + + describe("validation", () => { + it("should throw if no parameters object provided", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("MyModule", (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, {}); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'No parameters object provided to deploy options, but module requires parameter "MyNumber"' + ); + }); + + it("should throw if parameter missing from parameters", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("MyModule", (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: { + NotMyNumber: 11, + }, + }); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'No parameter provided for "MyNumber"' + ); + }); + + it("should ban multiple params with the same name", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("MyModule", (m) => { + const myNumber = m.getParam("MyNumber"); + const myNumber2 = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incTwoNumbers", { + args: [myNumber, myNumber2], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: { + NotMyNumber: 11, + }, + }); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'A parameter should only be retrieved once, but found more than one call to getParam for "MyNumber"' + ); + }); + + it("should ban multiple optional params with the same name", async function () { + await this.hre.run("compile", { quiet: true }); + + const userModule = buildModule("MyModule", (m) => { + const myNumber = m.getOptionalParam("MyNumber", 11); + const myNumber2 = m.getOptionalParam("MyNumber", 12); + + const foo = m.contract("Foo"); + + m.call(foo, "incTwoNumbers", { + args: [myNumber, myNumber2], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: { + NotMyNumber: 11, + }, + }); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'An optional parameter should only be retrieved once, but found more than one call to getParam for "MyNumber"' + ); + }); + }); +}); + +async function deployModule( + hre: any, + moduleDefinition: ModuleDefinition, + options?: { parameters: {} } +): Promise { + await hre.run("compile", { quiet: true }); + + const userModule = buildModule("MyModule", moduleDefinition); + + const deployPromise = hre.ignition.deploy(userModule, options); + + await mineBlocks(hre, [1, 1], deployPromise); + + const result = await deployPromise; + + return result; +} From d6d1c90e8d69932382044d5e4a385d171624d815 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 16 Aug 2022 00:14:08 -0400 Subject: [PATCH 0043/1302] refactored `module` to `recipe` everywhere --- README.md | 2 +- ....md => creating-recipes-for-deployment.md} | 39 +++-- docs/getting-started-guide.md | 32 ++-- examples/simple-ts/ignition/Multisig.ts | 10 +- .../simple-ts/ignition/MultisigAndTimelock.ts | 10 +- examples/simple-ts/ignition/Timelock.ts | 10 +- examples/simple/deploy.js | 8 +- .../{MyOtherModule.js => MyOtherRecipe.js} | 4 +- .../ignition/{MyModule.js => MyRecipe.js} | 4 +- .../{ParamModule.js => ParamRecipe.js} | 4 +- examples/simple/script.js | 8 +- packages/core/src/Ignition.ts | 46 +++--- packages/core/src/deployment-state.ts | 138 ++++++++--------- packages/core/src/execution-engine.ts | 146 +++++++++--------- packages/core/src/executors/Executor.ts | 4 +- packages/core/src/executors/ParamExecutor.ts | 2 +- packages/core/src/futures/Future.ts | 2 +- packages/core/src/futures/InternalFuture.ts | 2 +- packages/core/src/futures/types.ts | 8 +- packages/core/src/index.ts | 10 +- packages/core/src/journal/FileJournal.ts | 32 ++-- packages/core/src/journal/InMemoryJournal.ts | 32 ++-- packages/core/src/journal/types.ts | 8 +- packages/core/src/modules/UserModule.ts | 10 -- packages/core/src/modules/buildModule.ts | 9 -- packages/core/src/providers.ts | 2 +- .../{modules => recipes}/ExecutionGraph.ts | 54 +++---- .../IgnitionRecipe.ts} | 4 +- .../RecipeBuilderImpl.ts} | 56 +++---- packages/core/src/recipes/UserRecipe.ts | 10 ++ packages/core/src/recipes/buildRecipe.ts | 9 ++ .../core/src/{modules => recipes}/types.ts | 10 +- .../core/src/{modules => recipes}/utils.ts | 0 packages/core/src/services/ConfigService.ts | 2 +- packages/core/src/tx-sender.ts | 10 +- packages/core/src/ui/components/index.tsx | 30 ++-- packages/core/test/dag.ts | 54 +++---- packages/core/test/execution-engine.ts | 68 ++++---- packages/core/test/executors/CallExecutor.ts | 4 +- .../executors/ExistingContractExecutor.ts | 2 +- .../test/futures/ExistingContractFuture.ts | 2 +- packages/core/test/helpers.ts | 6 +- packages/core/test/tx-sender.ts | 6 +- packages/core/ui-samples/index.tsx | 62 ++++---- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 136 ++++++++-------- packages/hardhat-plugin/src/index.ts | 78 +++++----- packages/hardhat-plugin/src/user-modules.ts | 73 --------- packages/hardhat-plugin/src/user-recipes.ts | 73 +++++++++ packages/hardhat-plugin/test/chainId.ts | 10 +- packages/hardhat-plugin/test/contractCalls.ts | 16 +- .../hardhat-plugin/test/contractDeploys.ts | 94 +++++------ .../contracts/Contracts.sol | 0 .../contracts/WithLibrary.sol | 0 .../hardhat.config.js | 0 .../ignition/.testignore | 0 .../ignition/TestRecipe.js} | 0 packages/hardhat-plugin/test/helpers.ts | 44 +++--- packages/hardhat-plugin/test/param.ts | 40 ++--- .../test/{modules.ts => recipes.ts} | 22 +-- packages/hardhat-plugin/test/user-modules.ts | 65 -------- packages/hardhat-plugin/test/user-recipes.ts | 65 ++++++++ 62 files changed, 844 insertions(+), 845 deletions(-) rename docs/{creating-modules-for-deployment.md => creating-recipes-for-deployment.md} (72%) rename examples/simple/ignition/{MyOtherModule.js => MyOtherRecipe.js} (63%) rename examples/simple/ignition/{MyModule.js => MyRecipe.js} (51%) rename examples/simple/ignition/{ParamModule.js => ParamRecipe.js} (58%) delete mode 100644 packages/core/src/modules/UserModule.ts delete mode 100644 packages/core/src/modules/buildModule.ts rename packages/core/src/{modules => recipes}/ExecutionGraph.ts (51%) rename packages/core/src/{modules/IgnitionModule.ts => recipes/IgnitionRecipe.ts} (91%) rename packages/core/src/{modules/ModuleBuilderImpl.ts => recipes/RecipeBuilderImpl.ts} (70%) create mode 100644 packages/core/src/recipes/UserRecipe.ts create mode 100644 packages/core/src/recipes/buildRecipe.ts rename packages/core/src/{modules => recipes}/types.ts (84%) rename packages/core/src/{modules => recipes}/utils.ts (100%) delete mode 100644 packages/hardhat-plugin/src/user-modules.ts create mode 100644 packages/hardhat-plugin/src/user-recipes.ts rename packages/hardhat-plugin/test/fixture-projects/{user-modules => user-recipes}/contracts/Contracts.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-modules => user-recipes}/contracts/WithLibrary.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-modules => user-recipes}/hardhat.config.js (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-modules => user-recipes}/ignition/.testignore (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-modules/ignition/TestModule.js => user-recipes/ignition/TestRecipe.js} (100%) rename packages/hardhat-plugin/test/{modules.ts => recipes.ts} (59%) delete mode 100644 packages/hardhat-plugin/test/user-modules.ts create mode 100644 packages/hardhat-plugin/test/user-recipes.ts diff --git a/README.md b/README.md index 337d618725..a9ea9cef22 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex ## Documentation -* [Creating modules for deployment](./docs/creating-modules-for-deployment.md) +- [Creating recipes for deployment](./docs/creating-recipes-for-deployment.md) ## Contributing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-recipes-for-deployment.md similarity index 72% rename from docs/creating-modules-for-deployment.md rename to docs/creating-recipes-for-deployment.md index 6b28fcf4a3..efef5307c1 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-recipes-for-deployment.md @@ -1,23 +1,23 @@ -# Creating Modules for Deployments +# Creating Recipes for Deployments -An **Ingition** deployment is composed of modules. A module is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). +An **Ingition** deployment is composed of recipes. A recipe is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). -For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: +For example, this is a minimal recipe `MyRecipe` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyRecipe`: ```javascript -// ./ignition/MyModule.ts -import { buildModule, ModuleBuilder } from "@nomicfoundation/hardhat-ignition"; +// ./ignition/MyRecipe.ts +import { buildRecipe, RecipeBuilder } from "@nomicfoundation/hardhat-ignition"; -export default buildModule("MyModule", (m: ModuleBuilder) => { +export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { const token = m.contract("Token"); return { token }; }); ``` -Modules can be deployed directly at the cli (with `npx hardhat deploy ./ignition/MyModule.ts`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. +Recipes can be deployed directly at the cli (with `npx hardhat deploy ./ignition/MyRecipe.ts`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Recipes to allow for complex deployments. -During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `ModuleBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. +During a deployment **Ignition** uses the recipe to generate an execution plan of the transactions to run and the order and dependency in which to run them. A recipe uses the passed `RecipeBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. ## Deploying a contract @@ -70,7 +70,7 @@ To allow you to use your own mechanism for getting the contract artifact, `contr ```javascript const artifact = await this.hre.artifacts.readArtifact("Foo"); -const userModule = buildModule("MyModule", (m) => { +const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo", artifact, { args: [0], }); @@ -94,10 +94,10 @@ A library is deployed in the same way as a contract. ### Using the network chain id -The module builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. +The recipe builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. ```tsx -const userModule = buildModule("MyModule", (m) => { +const userRecipe = buildRecipe("MyRecipe", (m) => { const daiAddresses = { 1: "0x123...", // mainnet DAI 4: "0x234...", // rinkeby DAI @@ -110,21 +110,20 @@ const userModule = buildModule("MyModule", (m) => { }); ``` -### Module Parameters +### Recipe Parameters - -Modules can have parameters that are accessed using the ModuleBuilder object: +Recipes can have parameters that are accessed using the RecipeBuilder object: ```tsx -const symbol = m.getParam("tokenSymbol") -const name = m.getParam("tokenName") +const symbol = m.getParam("tokenSymbol"); +const name = m.getParam("tokenName"); const token = m.contract("Token", { - args: [symbol, name, 1_000_000] -}) + args: [symbol, name, 1_000_000], +}); ``` -When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: +When a recipe is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: ```tsx -const symbol = m.getOptionalParam("tokenSymbol", "TKN") +const symbol = m.getOptionalParam("tokenSymbol", "TKN"); ``` diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index bad0a8e47b..b877aa5478 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -16,32 +16,32 @@ import { HardhatUserConfig, task } from "hardhat/config"; import "@nomicfoundation/hardhat-ignition"; ``` -Create an `./ignition` folder in your project root to contain your deployment modules. +Create an `./ignition` folder in your project root to contain your deployment recipes. ```shell mkdir ./ignition ``` -## Write a deployment Module +## Write a deployment Recipe -Add a deployment module under the `./ignition` folder: +Add a deployment recipe under the `./ignition` folder: ```typescript -// ./ignition/MyModule.ts +// ./ignition/MyRecipe.ts -import { buildModule, ModuleBuilder } from "@nomiclabs/hardhat-ignition" +import { buildRecipe, RecipeBuilder } from "@nomiclabs/hardhat-ignition"; -export default buildModule("MyModule", (m: ModuleBuilder) => { - const token = m.contract("Token") +export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { + const token = m.contract("Token"); - return { token } -}) + return { token }; +}); ``` -Run the `deploy` task to test the module against a local ephemeral **Hardhat** node: +Run the `deploy` task to test the recipe against a local ephemeral **Hardhat** node: ```shell -npx hardhat deploy ./ignition/MyModule.ts +npx hardhat deploy ./ignition/MyRecipe.ts # No need to generate any newer typings. # Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 ``` @@ -49,16 +49,16 @@ npx hardhat deploy ./ignition/MyModule.ts To deploy against a network configured in `hardhat.config.{ts,js}` pass the network name: ```shell -npx hardhat deploy --network mainnet ./ignition/MyModule.ts +npx hardhat deploy --network mainnet ./ignition/MyRecipe.ts ``` -Modules that accept parameters can be passed those parameters at the command line via a json string: +Recipes that accept parameters can be passed those parameters at the command line via a json string: ```shell -npx hardhat deploy --parameters "{\"IncAmount\": 5}" ParamModule.js +npx hardhat deploy --parameters "{\"IncAmount\": 5}" ParamRecipe.js # Ensure you have properly escaped the json string ``` -Next, dig deeper into defining modules: +Next, dig deeper into defining recipes: -[Creating modules for deployment](./creating-modules-for-deployment.md) +[Creating recipes for deployment](./creating-recipes-for-deployment.md) diff --git a/examples/simple-ts/ignition/Multisig.ts b/examples/simple-ts/ignition/Multisig.ts index 9dfb78a054..b17f1da2dd 100644 --- a/examples/simple-ts/ignition/Multisig.ts +++ b/examples/simple-ts/ignition/Multisig.ts @@ -3,8 +3,8 @@ import { AddressLike, ContractFuture, ContractOptions, - buildModule, - ModuleBuilder, + buildRecipe, + RecipeBuilder, InternalFuture, Executor, Services, @@ -119,7 +119,7 @@ class MultisigContractFuture extends InternalFuture< } function callFromMultisig( - m: ModuleBuilder, + m: RecipeBuilder, multisig: AddressLike, contractName: string, destination: AddressLike, @@ -128,7 +128,7 @@ function callFromMultisig( ): Future { const id = options.id; const args = options?.args ?? []; - const b = new MultisigContractFuture(m.getModuleId(), id, { + const b = new MultisigContractFuture(m.getRecipeId(), id, { multiSigWalletAddress: multisig, contractName, destination, @@ -141,7 +141,7 @@ function callFromMultisig( return b; } -export default buildModule("Multisig", (m) => { +export default buildRecipe("Multisig", (m) => { const multisig = m.contract("MultiSigWallet", { args: [ [ diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts index 3009014e27..80ad6bd044 100644 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ b/examples/simple-ts/ignition/MultisigAndTimelock.ts @@ -1,8 +1,8 @@ import { ethers } from "ethers"; import { ContractFuture, - buildModule, - ModuleBuilder, + buildRecipe, + RecipeBuilder, InternalFuture, Executor, Services, @@ -197,7 +197,7 @@ class MultisigAndTimelockFuture extends InternalFuture< } function callFromMultisigAndTimelock( - m: ModuleBuilder, + m: RecipeBuilder, multisig: ContractFuture, timelock: ContractFuture, destination: ContractFuture, @@ -206,7 +206,7 @@ function callFromMultisigAndTimelock( ): Future { const id = options.id; const args = options?.args ?? []; - const b = new MultisigAndTimelockFuture(m.getModuleId(), id, { + const b = new MultisigAndTimelockFuture(m.getRecipeId(), id, { multisig, timelock, destination, @@ -219,7 +219,7 @@ function callFromMultisigAndTimelock( return b; } -export default buildModule("MultisigAndTimelock", (m) => { +export default buildRecipe("MultisigAndTimelock", (m) => { const multisig = m.contract("MultiSigWallet", { args: [ [ diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts index 3533200218..76c1609d08 100644 --- a/examples/simple-ts/ignition/Timelock.ts +++ b/examples/simple-ts/ignition/Timelock.ts @@ -1,8 +1,8 @@ import { ethers } from "ethers"; import { ContractFuture, - buildModule, - ModuleBuilder, + buildRecipe, + RecipeBuilder, InternalFuture, Executor, Contract, @@ -98,14 +98,14 @@ class TimelockCallFuture extends InternalFuture { } function callFromTimelock( - m: ModuleBuilder, + m: RecipeBuilder, timelock: ContractFuture, contract: ContractFuture, method: string, options: { id: string } ): TimelockCallFuture { const id = options.id; - const b = new TimelockCallFuture(m.getModuleId(), id, { + const b = new TimelockCallFuture(m.getRecipeId(), id, { timelock, contract, method, @@ -116,7 +116,7 @@ function callFromTimelock( return b; } -export default buildModule("Timelock", (m) => { +export default buildRecipe("Timelock", (m) => { const timelock = m.contract("TimelockController", { args: [ 15, diff --git a/examples/simple/deploy.js b/examples/simple/deploy.js index f311066cbd..ef7a05c848 100644 --- a/examples/simple/deploy.js +++ b/examples/simple/deploy.js @@ -1,13 +1,13 @@ async function main() { - const { foo, bar } = await ignition.deploy(require("./ignition/MyModule")); + const { foo, bar } = await ignition.deploy(require("./ignition/MyRecipe")); - console.log('Foo:', foo.address) - console.log('Bar:', bar.address) + console.log("Foo:", foo.address); + console.log("Bar:", bar.address); } main() .then(() => process.exit(0)) - .catch(error => { + .catch((error) => { console.error(error); process.exit(1); }); diff --git a/examples/simple/ignition/MyOtherModule.js b/examples/simple/ignition/MyOtherRecipe.js similarity index 63% rename from examples/simple/ignition/MyOtherModule.js rename to examples/simple/ignition/MyOtherRecipe.js index 07375a5905..7430fd7f07 100644 --- a/examples/simple/ignition/MyOtherModule.js +++ b/examples/simple/ignition/MyOtherRecipe.js @@ -1,6 +1,6 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildModule("MyOtherModule", (m) => { +module.exports = buildRecipe("MyOtherRecipe", (m) => { const foo = m.contract("Foo"); const foo2 = m.contract("Foo", { id: "Foo2" }); diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyRecipe.js similarity index 51% rename from examples/simple/ignition/MyModule.js rename to examples/simple/ignition/MyRecipe.js index efb8c0cc3b..3ea4146320 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyRecipe.js @@ -1,6 +1,6 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildModule("MyModule", (m) => { +module.exports = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); // m.call(foo, "inc", { diff --git a/examples/simple/ignition/ParamModule.js b/examples/simple/ignition/ParamRecipe.js similarity index 58% rename from examples/simple/ignition/ParamModule.js rename to examples/simple/ignition/ParamRecipe.js index c0c96cb9c1..629c915695 100644 --- a/examples/simple/ignition/ParamModule.js +++ b/examples/simple/ignition/ParamRecipe.js @@ -1,6 +1,6 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildModule("ParamModule", (m) => { +module.exports = buildRecipe("ParamRecipe", (m) => { const incAmount = m.getParam("IncAmount"); const foo = m.contract("Foo"); diff --git a/examples/simple/script.js b/examples/simple/script.js index 953d13fa22..11164beabc 100644 --- a/examples/simple/script.js +++ b/examples/simple/script.js @@ -1,10 +1,10 @@ const hre = require("hardhat"); -// const MyModule = require("./ignition/MyModule") -// const MyOtherModule = require("./ignition/MyOtherModule") +// const MyRecipe = require("./ignition/MyRecipe") +// const MyOtherRecipe = require("./ignition/MyOtherRecipe") async function main() { - const { foo } = await ignition.deploy("MyModule") + const { foo } = await ignition.deploy("MyRecipe"); console.log(foo.address); console.log((await foo.x()).toString()); @@ -12,7 +12,7 @@ async function main() { main() .then(() => process.exit(0)) - .catch(error => { + .catch((error) => { console.error(error); process.exit(1); }); diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index bbe967716d..02d1bd3a26 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -5,13 +5,13 @@ import { DeploymentResult, ExecutionEngine, ExecutionManager, - IgnitionModulesResults, + IgnitionRecipesResults, } from "./execution-engine"; import { FileJournal } from "./journal/FileJournal"; import { InMemoryJournal } from "./journal/InMemoryJournal"; -import { ModuleBuilderImpl } from "./modules/ModuleBuilderImpl"; -import { UserModule } from "./modules/UserModule"; import { Providers } from "./providers"; +import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; +import { UserRecipe } from "./recipes/UserRecipe"; const log = setupDebug("ignition:main"); @@ -20,30 +20,30 @@ export interface IgnitionDeployOptions { txPollingInterval: number; } -type ModulesOutputs = Record; +type RecipesOutputs = Record; export class Ignition { constructor( private _providers: Providers, - private _modulesResults: IgnitionModulesResults + private _recipesResults: IgnitionRecipesResults ) {} public async deploy( - userModules: Array>, + userRecipes: Array>, { pathToJournal, txPollingInterval }: IgnitionDeployOptions - ): Promise<[DeploymentResult, ModulesOutputs]> { - log(`Start deploy, '${userModules.length}' modules`); + ): Promise<[DeploymentResult, RecipesOutputs]> { + log(`Start deploy, '${userRecipes.length}' recipes`); const chainId = await this._getChainId(); - const m = new ModuleBuilderImpl(chainId); + const m = new RecipeBuilderImpl(chainId); - const modulesOutputs: ModulesOutputs = {}; + const recipesOutputs: RecipesOutputs = {}; - for (const userModule of userModules) { - log("Load module '%s'", userModule.id); - const moduleOutput = m.useModule(userModule) ?? {}; - modulesOutputs[userModule.id] = moduleOutput; + for (const userRecipe of userRecipes) { + log("Load recipe '%s'", userRecipe.id); + const recipeOutput = m.useRecipe(userRecipe) ?? {}; + recipesOutputs[userRecipe.id] = recipeOutput; } log("Build execution graph"); @@ -58,7 +58,7 @@ export class Ignition { const engine = new ExecutionEngine( this._providers, journal, - this._modulesResults, + this._recipesResults, { parallelizationLevel: 2, loggingEnabled: pathToJournal !== undefined, @@ -74,27 +74,27 @@ export class Ignition { log("Execute deployment"); const deploymentResult = await executionManager.execute(executionGraph); - return [deploymentResult, modulesOutputs]; + return [deploymentResult, recipesOutputs]; } public async buildPlan( - userModules: Array> + userRecipes: Array> ): Promise { - log(`Start building plan, '${userModules.length}' modules`); + log(`Start building plan, '${userRecipes.length}' recipes`); const chainId = await this._getChainId(); - const m = new ModuleBuilderImpl(chainId); + const m = new RecipeBuilderImpl(chainId); - for (const userModule of userModules) { - log("Load module '%s'", userModule.id); - m.useModule(userModule); + for (const userRecipe of userRecipes) { + log("Load recipe '%s'", userRecipe.id); + m.useRecipe(userRecipe); } log("Build ExecutionGraph"); const executionGraph = m.buildExecutionGraph(); - return ExecutionEngine.buildPlan(executionGraph, this._modulesResults); + return ExecutionEngine.buildPlan(executionGraph, this._recipesResults); } private async _getChainId(): Promise { diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state.ts index 408044f028..2499dcb244 100644 --- a/packages/core/src/deployment-state.ts +++ b/packages/core/src/deployment-state.ts @@ -1,90 +1,90 @@ import type { FutureOutput, - ModuleResult, - SerializedModuleResult, + RecipeResult, + SerializedRecipeResult, } from "./futures/types"; import { serializeFutureOutput } from "./futures/utils"; -import { ExecutionGraph } from "./modules/ExecutionGraph"; -import { IgnitionModule } from "./modules/IgnitionModule"; +import { ExecutionGraph } from "./recipes/ExecutionGraph"; +import { IgnitionRecipe } from "./recipes/IgnitionRecipe"; export class DeploymentState { - private _modules: Map = new Map(); + private _recipes: Map = new Map(); public static fromExecutionGraph( executionGraph: ExecutionGraph ): DeploymentState { const deploymentState = new DeploymentState(); - for (const ignitionModule of executionGraph.getSortedModules()) { - const moduleState = ModuleState.fromIgnitionModule(ignitionModule); - deploymentState.addModule(moduleState); + for (const ignitionRecipe of executionGraph.getSortedRecipes()) { + const recipeState = RecipeState.fromIgnitionRecipe(ignitionRecipe); + deploymentState.addRecipe(recipeState); } return deploymentState; } - public addModule(moduleState: ModuleState) { - this._modules.set(moduleState.id, moduleState); + public addRecipe(recipeState: RecipeState) { + this._recipes.set(recipeState.id, recipeState); } - public addModuleResult(moduleId: string, moduleResult: ModuleResult) { - const moduleState = this._modules.get(moduleId); + public addRecipeResult(recipeId: string, recipeResult: RecipeResult) { + const recipeState = this._recipes.get(recipeId); - if (moduleState === undefined) { + if (recipeState === undefined) { throw new Error( - `DeploymentState doesn't have module with id '${moduleId}'` + `DeploymentState doesn't have recipe with id '${recipeId}'` ); } - for (const [futureId, futureOutput] of Object.entries(moduleResult)) { - moduleState.setSuccess(futureId, futureOutput); + for (const [futureId, futureOutput] of Object.entries(recipeResult)) { + recipeState.setSuccess(futureId, futureOutput); } } - public getModule(moduleId: string): ModuleState { - const moduleState = this._modules.get(moduleId); - if (moduleState === undefined) { + public getRecipe(recipeId: string): RecipeState { + const recipeState = this._recipes.get(recipeId); + if (recipeState === undefined) { throw new Error( - `DeploymentState doesn't have module with id '${moduleId}'` + `DeploymentState doesn't have recipe with id '${recipeId}'` ); } - return moduleState; + return recipeState; } - public getCurrentModule(): ModuleState | undefined { - const runningModules = [...this._modules.values()].filter((m) => + public getCurrentRecipe(): RecipeState | undefined { + const runningRecipes = [...this._recipes.values()].filter((m) => m.isRunning() ); - if (runningModules.length === 0) { + if (runningRecipes.length === 0) { return; } - if (runningModules.length > 1) { + if (runningRecipes.length > 1) { throw new Error( - "assertion error: only one module should be running at the same time" + "assertion error: only one recipe should be running at the same time" ); } - return runningModules[0]; + return runningRecipes[0]; } - public getModules(): ModuleState[] { - return [...this._modules.values()]; + public getRecipes(): RecipeState[] { + return [...this._recipes.values()]; } - public getSuccessfulModules(): ModuleState[] { - return [...this._modules.values()].filter((m) => m.isSuccess()); + public getSuccessfulRecipes(): RecipeState[] { + return [...this._recipes.values()].filter((m) => m.isSuccess()); } - public isFutureSuccess(moduleId: string, futureId: string): boolean { - const futureState = this._getFutureState(moduleId, futureId); + public isFutureSuccess(recipeId: string, futureId: string): boolean { + const futureState = this._getFutureState(recipeId, futureId); return futureState._kind === "success"; } - public getFutureResult(moduleId: string, futureId: string) { - const futureState = this._getFutureState(moduleId, futureId); + public getFutureResult(recipeId: string, futureId: string) { + const futureState = this._getFutureState(recipeId, futureId); if (futureState._kind !== "success") { throw new Error( @@ -95,17 +95,17 @@ export class DeploymentState { return futureState.result; } - public isModuleSuccess(moduleId: string): boolean { - const moduleState = this._getModuleState(moduleId); + public isRecipeSuccess(recipeId: string): boolean { + const recipeState = this._getRecipeState(recipeId); - return moduleState.isSuccess(); + return recipeState.isSuccess(); } public getHolds(): [string, string[]] | undefined { - for (const [moduleId, moduleState] of this._modules.entries()) { - const holds = moduleState.getHolds(); + for (const [recipeId, recipeState] of this._recipes.entries()) { + const holds = recipeState.getHolds(); if (holds.length > 0) { - return [moduleId, holds]; + return [recipeId, holds]; } } @@ -113,10 +113,10 @@ export class DeploymentState { } public getFailures(): [string, Error[]] | undefined { - for (const [moduleId, moduleState] of this._modules.entries()) { - const failures = moduleState.getFailures(); + for (const [recipeId, recipeState] of this._recipes.entries()) { + const failures = recipeState.getFailures(); if (failures.length > 0) { - return [moduleId, failures]; + return [recipeId, failures]; } } @@ -124,29 +124,29 @@ export class DeploymentState { } public setFutureState( - moduleId: string, + recipeId: string, futureId: string, futureState: FutureState ) { - const moduleState = this._getModuleState(moduleId); + const recipeState = this._getRecipeState(recipeId); - moduleState.setFutureState(futureId, futureState); + recipeState.setFutureState(futureId, futureState); } - private _getFutureState(moduleId: string, futureId: string) { - const moduleState = this._getModuleState(moduleId); + private _getFutureState(recipeId: string, futureId: string) { + const recipeState = this._getRecipeState(recipeId); - return moduleState.getFutureState(futureId); + return recipeState.getFutureState(futureId); } - private _getModuleState(moduleId: string) { - const moduleState = this._modules.get(moduleId); + private _getRecipeState(recipeId: string) { + const recipeState = this._recipes.get(recipeId); - if (moduleState === undefined) { - throw new Error(`No state for module '${moduleId}'`); + if (recipeState === undefined) { + throw new Error(`No state for recipe '${recipeId}'`); } - return moduleState; + return recipeState; } } @@ -198,20 +198,20 @@ export const FutureState = { }, }; -export class ModuleState { +export class RecipeState { private _started = false; private _futures = new Map(); - public static fromIgnitionModule( - ignitionModule: IgnitionModule - ): ModuleState { - const moduleState = new ModuleState(ignitionModule.id); + public static fromIgnitionRecipe( + ignitionRecipe: IgnitionRecipe + ): RecipeState { + const recipeState = new RecipeState(ignitionRecipe.id); - for (const executor of ignitionModule.getSortedExecutors()) { - moduleState.addFuture(executor.future.id, FutureState.waiting()); + for (const executor of ignitionRecipe.getSortedExecutors()) { + recipeState.addFuture(executor.future.id, FutureState.waiting()); } - return moduleState; + return recipeState; } constructor(public readonly id: string) {} @@ -262,7 +262,7 @@ export class ModuleState { const futureState = this._futures.get(futureId); if (futureState === undefined) { throw new Error( - `[ModuleResult] Module '${this.id}' has no result for future '${futureId}'` + `[RecipeResult] Recipe '${this.id}' has no result for future '${futureId}'` ); } @@ -285,19 +285,19 @@ export class ModuleState { return this._futures.size; } - public toModuleResult(): SerializedModuleResult { - const moduleResult: SerializedModuleResult = {}; + public toRecipeResult(): SerializedRecipeResult { + const recipeResult: SerializedRecipeResult = {}; for (const [futureId, futureState] of this._futures.entries()) { if (futureState._kind !== "success") { throw new Error( - "toModuleResult can only be called in successful modules" + "toRecipeResult can only be called in successful recipes" ); } - moduleResult[futureId] = serializeFutureOutput(futureState.result); + recipeResult[futureId] = serializeFutureOutput(futureState.result); } - return moduleResult; + return recipeResult; } private _getFuture(futureId: string) { diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts index 3d3475ac3c..f4a7396ff8 100644 --- a/packages/core/src/execution-engine.ts +++ b/packages/core/src/execution-engine.ts @@ -3,15 +3,15 @@ import setupDebug from "debug"; import { DeploymentState } from "./deployment-state"; import { InternalFuture } from "./futures/InternalFuture"; import type { - ModuleResult, + RecipeResult, SerializedDeploymentResult, - SerializedModuleResult, + SerializedRecipeResult, } from "./futures/types"; import { deserializeFutureOutput } from "./futures/utils"; import { Journal } from "./journal/types"; -import { ExecutionGraph } from "./modules/ExecutionGraph"; -import { IgnitionModule } from "./modules/IgnitionModule"; import { Providers } from "./providers"; +import { ExecutionGraph } from "./recipes/ExecutionGraph"; +import { IgnitionRecipe } from "./recipes/IgnitionRecipe"; import { ArtifactsService } from "./services/ArtifactsService"; import { ConfigService } from "./services/ConfigService"; import { ContractsService } from "./services/ContractsService"; @@ -21,11 +21,11 @@ import { TxSender } from "./tx-sender"; import { UiService } from "./ui/ui-service"; import { sleep } from "./utils"; -export interface IgnitionModulesResults { - load: (moduleId: string) => Promise; +export interface IgnitionRecipesResults { + load: (recipeId: string) => Promise; save: ( - moduleId: string, - moduleResult: SerializedModuleResult + recipeId: string, + recipeResult: SerializedRecipeResult ) => Promise; } @@ -39,36 +39,36 @@ interface ExecutorPlan { id: string; description: string; } -type ModulePlan = "already-deployed" | ExecutorPlan[]; -export type DeploymentPlan = Record; +type RecipePlan = "already-deployed" | ExecutorPlan[]; +export type DeploymentPlan = Record; export class ExecutionEngine { private _debug = setupDebug("ignition:execution-engine"); public static async buildPlan( executionGraph: ExecutionGraph, - modulesResults: IgnitionModulesResults + recipesResults: IgnitionRecipesResults ): Promise { const plan: DeploymentPlan = {}; - const ignitionModules = executionGraph.getSortedModules(); + const ignitionRecipes = executionGraph.getSortedRecipes(); - for (const ignitionModule of ignitionModules) { - const moduleResult = await modulesResults.load(ignitionModule.id); - if (moduleResult !== undefined) { - plan[ignitionModule.id] = "already-deployed"; + for (const ignitionRecipe of ignitionRecipes) { + const recipeResult = await recipesResults.load(ignitionRecipe.id); + if (recipeResult !== undefined) { + plan[ignitionRecipe.id] = "already-deployed"; continue; } - const modulePlan: ExecutorPlan[] = []; - const executors = ignitionModule.getSortedExecutors(); + const recipePlan: ExecutorPlan[] = []; + const executors = ignitionRecipe.getSortedExecutors(); for (const executor of executors) { - modulePlan.push({ + recipePlan.push({ id: executor.future.id, description: executor.getDescription(), }); } - plan[ignitionModule.id] = modulePlan; + plan[ignitionRecipe.id] = recipePlan; } return plan; @@ -77,39 +77,39 @@ export class ExecutionEngine { constructor( private _providers: Providers, private _journal: Journal, - private _modulesResults: IgnitionModulesResults, + private _recipesResults: IgnitionRecipesResults, private _options: ExecutionEngineOptions ) {} public async *execute(executionGraph: ExecutionGraph) { const deploymentState = DeploymentState.fromExecutionGraph(executionGraph); - const executionModules = executionGraph.getSortedModules(); + const executionRecipes = executionGraph.getSortedRecipes(); const uiService = new UiService({ enabled: this._options.loggingEnabled, deploymentState, }); - // validate all modules - const errorsPerModule: Map = new Map(); + // validate all recipes + const errorsPerRecipe: Map = new Map(); let hasErrors = false; - for (const executionModule of executionModules) { - this._debug(`Validating module ${executionModule.id}`); + for (const executionRecipe of executionRecipes) { + this._debug(`Validating recipe ${executionRecipe.id}`); - const errors = await this._validateModule(executionModule); + const errors = await this._validateRecipe(executionRecipe); if (errors.length > 0) { hasErrors = true; } - errorsPerModule.set(executionModule.id, errors); + errorsPerRecipe.set(executionRecipe.id, errors); } if (hasErrors) { let errorMessage = `The following validation errors were found:\n`; let isFirst = true; - for (const [moduleId, errors] of errorsPerModule.entries()) { + for (const [recipeId, errors] of errorsPerRecipe.entries()) { if (errors.length === 0) { continue; } @@ -118,7 +118,7 @@ export class ExecutionEngine { } isFirst = false; - errorMessage += ` In module ${moduleId}:\n`; + errorMessage += ` In recipe ${recipeId}:\n`; for (const error of errors) { errorMessage += ` - ${error}\n`; } @@ -127,42 +127,42 @@ export class ExecutionEngine { throw new Error(errorMessage); } - // execute each module sequentially - for (const executionModule of executionModules) { - const serializedModuleResult = await this._modulesResults.load( - executionModule.id + // execute each recipe sequentially + for (const executionRecipe of executionRecipes) { + const serializedRecipeResult = await this._recipesResults.load( + executionRecipe.id ); - if (serializedModuleResult !== undefined) { - const moduleResult: ModuleResult = Object.fromEntries( - Object.entries(serializedModuleResult).map(([key, value]) => [ + if (serializedRecipeResult !== undefined) { + const recipeResult: RecipeResult = Object.fromEntries( + Object.entries(serializedRecipeResult).map(([key, value]) => [ key, deserializeFutureOutput(value), ]) ); - deploymentState.addModuleResult(executionModule.id, moduleResult); + deploymentState.addRecipeResult(executionRecipe.id, recipeResult); continue; } - this._debug(`Begin execution of module ${executionModule.id}`); + this._debug(`Begin execution of recipe ${executionRecipe.id}`); - if (deploymentState.isModuleSuccess(executionModule.id)) { + if (deploymentState.isRecipeSuccess(executionRecipe.id)) { this._debug( - `The module ${executionModule.id} was already successfully deployed` + `The recipe ${executionRecipe.id} was already successfully deployed` ); continue; } - this._debug(`Executing module ${executionModule.id}`); - const moduleExecutionGenerator = this._executeModule( - executionModule, + this._debug(`Executing recipe ${executionRecipe.id}`); + const recipeExecutionGenerator = this._executeRecipe( + executionRecipe, deploymentState, uiService ); - for await (const moduleResult of moduleExecutionGenerator) { - if (moduleResult !== undefined) { + for await (const recipeResult of recipeExecutionGenerator) { + if (recipeResult !== undefined) { break; } yield; @@ -172,18 +172,18 @@ export class ExecutionEngine { yield deploymentState; } - private async _validateModule( - ignitionModule: IgnitionModule + private async _validateRecipe( + ignitionRecipe: IgnitionRecipe ): Promise { - const executors = ignitionModule.getSortedExecutors(); + const executors = ignitionRecipe.getSortedExecutors(); const allErrors: string[] = []; for (const executor of executors) { this._debug( - `Validating future ${executor.future.id} of module ${ignitionModule.id}` + `Validating future ${executor.future.id} of recipe ${ignitionRecipe.id}` ); const services = this._createServices( - ignitionModule.id, + ignitionRecipe.id, executor.future.id ); @@ -196,14 +196,14 @@ export class ExecutionEngine { return allErrors; } - private async *_executeModule( - ignitionModule: IgnitionModule, + private async *_executeRecipe( + ignitionRecipe: IgnitionRecipe, deploymentState: DeploymentState, uiService: UiService ) { const { parallelizationLevel } = this._options; - const executors = ignitionModule.getSortedExecutors(); - const moduleState = deploymentState.getModule(ignitionModule.id); + const executors = ignitionRecipe.getSortedExecutors(); + const recipeState = deploymentState.getRecipe(ignitionRecipe.id); while (true) { const someFailure = executors.some((e) => e.isFailure()); @@ -216,27 +216,27 @@ export class ExecutionEngine { (someFailure && runningCount === 0) || (someHold && runningCount === 0) ) { - if (moduleState.isSuccess()) { - const moduleResult = moduleState.toModuleResult(); - await this._modulesResults.save(ignitionModule.id, moduleResult); - await this._journal.delete(ignitionModule.id); + if (recipeState.isSuccess()) { + const recipeResult = recipeState.toRecipeResult(); + await this._recipesResults.save(ignitionRecipe.id, recipeResult); + await this._journal.delete(ignitionRecipe.id); } - yield moduleState; + yield recipeState; } - for (const executor of ignitionModule.getSortedExecutors()) { - this._debug(`Check ${ignitionModule.id}/${executor.future.id}`); + for (const executor of ignitionRecipe.getSortedExecutors()) { + this._debug(`Check ${ignitionRecipe.id}/${executor.future.id}`); if (executor.isReady() && runningCount < parallelizationLevel) { this._debug( - `Check dependencies of ${ignitionModule.id}/${executor.future.id}` + `Check dependencies of ${ignitionRecipe.id}/${executor.future.id}` ); const dependencies = executor.future.getDependencies(); const allDependenciesReady = dependencies.every((d) => - deploymentState.isFutureSuccess(d.moduleId, d.id) + deploymentState.isFutureSuccess(d.recipeId, d.id) ); if (allDependenciesReady) { @@ -246,16 +246,16 @@ export class ExecutionEngine { ); const services = this._createServices( - ignitionModule.id, + ignitionRecipe.id, executor.future.id ); - this._debug(`Start ${ignitionModule.id}/${executor.future.id}`); + this._debug(`Start ${ignitionRecipe.id}/${executor.future.id}`); // eslint-disable-next-line @typescript-eslint/no-floating-promises executor.run(resolvedInput, services, (newState) => { deploymentState.setFutureState( - ignitionModule.id, + ignitionRecipe.id, executor.future.id, newState ); @@ -273,7 +273,7 @@ export class ExecutionEngine { private _resolve(input: any, deploymentResult: DeploymentState): any { if (InternalFuture.isFuture(input)) { - return deploymentResult.getFutureResult(input.moduleId, input.id); + return deploymentResult.getFutureResult(input.recipeId, input.id); } if (Array.isArray(input)) { @@ -293,9 +293,9 @@ export class ExecutionEngine { return input; } - private _createServices(moduleId: string, executorId: string): Services { + private _createServices(recipeId: string, executorId: string): Services { const txSender = new TxSender( - moduleId, + recipeId, executorId, this._providers.gasProvider, this._journal @@ -356,9 +356,9 @@ export class ExecutionManager { const serializedDeploymentResult: SerializedDeploymentResult = {}; - for (const moduleState of deploymentState.getModules()) { - serializedDeploymentResult[moduleState.id] = - moduleState.toModuleResult(); + for (const recipeState of deploymentState.getRecipes()) { + serializedDeploymentResult[recipeState.id] = + recipeState.toRecipeResult(); } return { diff --git a/packages/core/src/executors/Executor.ts b/packages/core/src/executors/Executor.ts index a6a21838f4..fbdcd4b277 100644 --- a/packages/core/src/executors/Executor.ts +++ b/packages/core/src/executors/Executor.ts @@ -17,9 +17,9 @@ export abstract class Executor { private _debug: IDebugger; constructor(public readonly future: InternalFuture) { - const moduleId = future.moduleId; + const recipeId = future.recipeId; const futureId = future.id; - this._debug = setupDebug(`ignition:executor:${moduleId}:${futureId}`); + this._debug = setupDebug(`ignition:executor:${recipeId}:${futureId}`); } abstract execute(input: Resolved, services: Services): Promise; diff --git a/packages/core/src/executors/ParamExecutor.ts b/packages/core/src/executors/ParamExecutor.ts index 143c9f11df..b904c92025 100644 --- a/packages/core/src/executors/ParamExecutor.ts +++ b/packages/core/src/executors/ParamExecutor.ts @@ -33,7 +33,7 @@ export class ParamExecutor extends Executor { if (!hasParamResult.found && hasParamResult.errorCode === "no-params") { return [ - `No parameters object provided to deploy options, but module requires parameter "${paramName}"`, + `No parameters object provided to deploy options, but recipe requires parameter "${paramName}"`, ]; } diff --git a/packages/core/src/futures/Future.ts b/packages/core/src/futures/Future.ts index 99eae7792f..a5259374ca 100644 --- a/packages/core/src/futures/Future.ts +++ b/packages/core/src/futures/Future.ts @@ -2,7 +2,7 @@ import { FutureOutput } from "./types"; export abstract class Future { // dummy variables needed by the type-checker to work correctly when opaque - // types are used in a module definition + // types are used in a recipe definition protected _dummyInput!: I; protected _dummyOutput!: O; } diff --git a/packages/core/src/futures/InternalFuture.ts b/packages/core/src/futures/InternalFuture.ts index b1285c8706..758b2929cf 100644 --- a/packages/core/src/futures/InternalFuture.ts +++ b/packages/core/src/futures/InternalFuture.ts @@ -6,7 +6,7 @@ export abstract class InternalFuture< O extends FutureOutput = any > extends Future { constructor( - public readonly moduleId: string, + public readonly recipeId: string, public readonly id: string, public readonly input: I ) { diff --git a/packages/core/src/futures/types.ts b/packages/core/src/futures/types.ts index 2631b8ce7f..bf5a980b45 100644 --- a/packages/core/src/futures/types.ts +++ b/packages/core/src/futures/types.ts @@ -1,4 +1,4 @@ -import { ParamValue } from "../modules/types"; +import { ParamValue } from "../recipes/types"; import { Artifact, Contract, Tx } from "../types"; import { ContractFuture } from "./ContractFuture"; @@ -7,11 +7,11 @@ import { serializeFutureOutput } from "./utils"; export type FutureOutput = string | number | Contract | Tx; -export type ModuleResult = Record; -export type SerializedModuleResult = Record; +export type RecipeResult = Record; +export type SerializedRecipeResult = Record; export type SerializedFutureResult = ReturnType; -export type SerializedDeploymentResult = Record; +export type SerializedDeploymentResult = Record; export interface ContractOptions { contractName: string; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 429d248909..93fa9c5d4d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -6,17 +6,17 @@ export type { AddressLike, ContractOptions, SerializedDeploymentResult, - SerializedModuleResult, + SerializedRecipeResult, SerializedFutureResult, } from "./futures/types"; export { Executor } from "./executors/Executor"; export { Hold } from "./executors/Hold"; -export { buildModule } from "./modules/buildModule"; -export type { ModuleBuilder } from "./modules/types"; -export { UserModule } from "./modules/UserModule"; -export type { ParamValue, ModuleDefinition } from "./modules/types"; +export { buildRecipe } from "./recipes/buildRecipe"; +export type { RecipeBuilder } from "./recipes/types"; +export { UserRecipe } from "./recipes/UserRecipe"; +export type { ParamValue, RecipeDefinition } from "./recipes/types"; export type { Services } from "./services/types"; diff --git a/packages/core/src/journal/FileJournal.ts b/packages/core/src/journal/FileJournal.ts index 1bb10bcaf2..19864c70e2 100644 --- a/packages/core/src/journal/FileJournal.ts +++ b/packages/core/src/journal/FileJournal.ts @@ -9,11 +9,11 @@ export class FileJournal implements Journal { constructor(private _path: string) {} public async addEntry( - moduleId: string, + recipeId: string, executorId: string, journalEntry: JournalEntry ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); + this._log(`Adding entry to ${recipeId}/${executorId}`); let content; if (await fsExtra.pathExists(this._path)) { @@ -22,39 +22,39 @@ export class FileJournal implements Journal { content = {}; } - content[moduleId] = content[moduleId] ?? {}; - content[moduleId][executorId] = content[moduleId][executorId] ?? []; - content[moduleId][executorId].push(journalEntry); + content[recipeId] = content[recipeId] ?? {}; + content[recipeId][executorId] = content[recipeId][executorId] ?? []; + content[recipeId][executorId].push(journalEntry); await fsExtra.writeJson(this._path, content, { spaces: 2, }); - return content[moduleId][executorId].length - 1; + return content[recipeId][executorId].length - 1; } public async getEntry( - moduleId: string, + recipeId: string, executorId: string, entryIndex: number ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + this._log(`Getting entry ${entryIndex} from ${recipeId}/${executorId}`); if (!(await fsExtra.pathExists(this._path))) { return; } const content = await fsExtra.readJson(this._path); - return content?.[moduleId]?.[executorId]?.[entryIndex]; + return content?.[recipeId]?.[executorId]?.[entryIndex]; } public async replaceEntry( - moduleId: string, + recipeId: string, executorId: string, txIndex: number, journalEntry: JournalEntry ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + this._log(`Replacing entry ${txIndex} from ${recipeId}/${executorId}`); let content; if (await fsExtra.pathExists(this._path)) { @@ -63,26 +63,26 @@ export class FileJournal implements Journal { content = {}; } - if (content[moduleId]?.[executorId]?.[txIndex] === undefined) { + if (content[recipeId]?.[executorId]?.[txIndex] === undefined) { throw new Error(`Assertion error: replacing non-existent transaction`); } - content[moduleId][executorId][txIndex] = journalEntry; + content[recipeId][executorId][txIndex] = journalEntry; await fsExtra.writeJson(this._path, content, { spaces: 2, }); } - public async delete(moduleId: string) { - this._log(`Deleting module ${moduleId}`); + public async delete(recipeId: string) { + this._log(`Deleting recipe ${recipeId}`); if (!(await fsExtra.pathExists(this._path))) { return; } const content = await fsExtra.readJson(this._path); - delete content?.[moduleId]; + delete content?.[recipeId]; if (Object.entries(content).length === 0) { await fsExtra.remove(this._path); diff --git a/packages/core/src/journal/InMemoryJournal.ts b/packages/core/src/journal/InMemoryJournal.ts index 7940340373..a5046f11e9 100644 --- a/packages/core/src/journal/InMemoryJournal.ts +++ b/packages/core/src/journal/InMemoryJournal.ts @@ -9,43 +9,43 @@ export class InMemoryJournal implements Journal { private _journal: Map> = new Map(); public async addEntry( - moduleId: string, + recipeId: string, executorId: string, journalEntry: JournalEntry ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); + this._log(`Adding entry to ${recipeId}/${executorId}`); - const moduleEntry: Map = - this._journal.get(moduleId) ?? new Map(); - const executorEntries = moduleEntry.get(executorId) ?? []; + const recipeEntry: Map = + this._journal.get(recipeId) ?? new Map(); + const executorEntries = recipeEntry.get(executorId) ?? []; executorEntries.push(journalEntry); - moduleEntry.set(executorId, executorEntries); - this._journal.set(moduleId, moduleEntry); + recipeEntry.set(executorId, executorEntries); + this._journal.set(recipeId, recipeEntry); return executorEntries.length - 1; } public async getEntry( - moduleId: string, + recipeId: string, executorId: string, entryIndex: number ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); + this._log(`Getting entry ${entryIndex} from ${recipeId}/${executorId}`); - return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; + return this._journal.get(recipeId)?.get(executorId)?.[entryIndex]; } public async replaceEntry( - moduleId: string, + recipeId: string, executorId: string, txIndex: number, entryIndex: JournalEntry ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); + this._log(`Replacing entry ${txIndex} from ${recipeId}/${executorId}`); - const transactions = this._journal.get(moduleId)?.get(executorId); + const transactions = this._journal.get(recipeId)?.get(executorId); if (transactions === undefined || transactions[txIndex] === undefined) { throw new Error(`Assertion error: replacing non-existent transaction`); } @@ -53,9 +53,9 @@ export class InMemoryJournal implements Journal { transactions[txIndex] = entryIndex; } - public async delete(moduleId: string) { - this._log(`Deleting module ${moduleId}`); + public async delete(recipeId: string) { + this._log(`Deleting recipe ${recipeId}`); - this._journal.delete(moduleId); + this._journal.delete(recipeId); } } diff --git a/packages/core/src/journal/types.ts b/packages/core/src/journal/types.ts index f990b339a1..f85bb3e4de 100644 --- a/packages/core/src/journal/types.ts +++ b/packages/core/src/journal/types.ts @@ -10,20 +10,20 @@ export interface JournalEntry { */ export interface Journal { addEntry( - moduleId: string, + recipeId: string, executorId: string, entry: JournalEntry ): Promise; getEntry( - moduleId: string, + recipeId: string, executorId: string, entryIndex: number ): Promise; replaceEntry( - moduleId: string, + recipeId: string, executorId: string, entryIndex: number, entry: JournalEntry ): Promise; - delete(moduleId: string): Promise; + delete(recipeId: string): Promise; } diff --git a/packages/core/src/modules/UserModule.ts b/packages/core/src/modules/UserModule.ts deleted file mode 100644 index 547d7a8706..0000000000 --- a/packages/core/src/modules/UserModule.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ModuleDefinition } from "./types"; - -export class UserModule { - public readonly version = 1; - - constructor( - public readonly id: string, - public readonly definition: ModuleDefinition - ) {} -} diff --git a/packages/core/src/modules/buildModule.ts b/packages/core/src/modules/buildModule.ts deleted file mode 100644 index 9ce05215c6..0000000000 --- a/packages/core/src/modules/buildModule.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { UserModule } from "./UserModule"; -import { ModuleDefinition } from "./types"; - -export function buildModule( - moduleId: string, - moduleDefinition: ModuleDefinition -): UserModule { - return new UserModule(moduleId, moduleDefinition); -} diff --git a/packages/core/src/providers.ts b/packages/core/src/providers.ts index 446d23e6e6..9c4af42c0b 100644 --- a/packages/core/src/providers.ts +++ b/packages/core/src/providers.ts @@ -1,6 +1,6 @@ import type { ethers } from "ethers"; -import { ParamValue } from "./modules/types"; +import { ParamValue } from "./recipes/types"; import { Artifact } from "./types"; export interface Providers { diff --git a/packages/core/src/modules/ExecutionGraph.ts b/packages/core/src/recipes/ExecutionGraph.ts similarity index 51% rename from packages/core/src/modules/ExecutionGraph.ts rename to packages/core/src/recipes/ExecutionGraph.ts index 581516d7bb..b5855f451f 100644 --- a/packages/core/src/modules/ExecutionGraph.ts +++ b/packages/core/src/recipes/ExecutionGraph.ts @@ -1,18 +1,18 @@ import { Executor } from "../executors/Executor"; import { ParamFuture } from "../futures/ParamFuture"; -import { IgnitionModule } from "./IgnitionModule"; +import { IgnitionRecipe } from "./IgnitionRecipe"; export class ExecutionGraph { - private _modules: Map> = new Map(); + private _recipes: Map> = new Map(); private _dependencies: Map> = new Map(); public addExecutor(executor: Executor) { - const moduleId = executor.future.moduleId; - let executorsMap = this._modules.get(moduleId); + const recipeId = executor.future.recipeId; + let executorsMap = this._recipes.get(recipeId); if (executorsMap === undefined) { executorsMap = new Map(); - this._modules.set(moduleId, executorsMap); + this._recipes.set(recipeId, executorsMap); } if (executorsMap.has(executor.future.id)) { @@ -35,56 +35,56 @@ export class ExecutionGraph { const dependencies = executor.future.getDependencies(); for (const dependency of dependencies) { - this._addDependency(moduleId, dependency.moduleId); + this._addDependency(recipeId, dependency.recipeId); } executorsMap.set(executor.future.id, executor); } - public getModule(moduleId: string): IgnitionModule | undefined { - const executorsMap = this._modules.get(moduleId); + public getRecipe(recipeId: string): IgnitionRecipe | undefined { + const executorsMap = this._recipes.get(recipeId); if (executorsMap === undefined) { return undefined; } - return new IgnitionModule(moduleId, [...executorsMap.values()]); + return new IgnitionRecipe(recipeId, [...executorsMap.values()]); } - public getSortedModules(): IgnitionModule[] { + public getSortedRecipes(): IgnitionRecipe[] { const added = new Set(); - const ignitionModules = this._getModules(); - const sortedModules: IgnitionModule[] = []; + const ignitionRecipes = this._getRecipes(); + const sortedRecipes: IgnitionRecipe[] = []; - while (added.size < ignitionModules.length) { - for (const ignitionModule of ignitionModules) { - if (added.has(ignitionModule.id)) { + while (added.size < ignitionRecipes.length) { + for (const ignitionRecipe of ignitionRecipes) { + if (added.has(ignitionRecipe.id)) { continue; } const dependencies = - this._dependencies.get(ignitionModule.id) ?? new Set(); + this._dependencies.get(ignitionRecipe.id) ?? new Set(); if ([...dependencies].every((d) => added.has(d))) { - sortedModules.push(ignitionModule); - added.add(ignitionModule.id); + sortedRecipes.push(ignitionRecipe); + added.add(ignitionRecipe.id); } } } - return sortedModules; + return sortedRecipes; } - private _addDependency(moduleId: string, dependencyModuleId: string) { - if (moduleId !== dependencyModuleId) { + private _addDependency(recipeId: string, dependencyRecipeId: string) { + if (recipeId !== dependencyRecipeId) { const dependencies = - this._dependencies.get(moduleId) ?? new Set(); - dependencies.add(dependencyModuleId); - this._dependencies.set(moduleId, dependencies); + this._dependencies.get(recipeId) ?? new Set(); + dependencies.add(dependencyRecipeId); + this._dependencies.set(recipeId, dependencies); } } - private _getModules(): IgnitionModule[] { - return [...this._modules.entries()].map( - ([id, executorsMap]) => new IgnitionModule(id, [...executorsMap.values()]) + private _getRecipes(): IgnitionRecipe[] { + return [...this._recipes.entries()].map( + ([id, executorsMap]) => new IgnitionRecipe(id, [...executorsMap.values()]) ); } } diff --git a/packages/core/src/modules/IgnitionModule.ts b/packages/core/src/recipes/IgnitionRecipe.ts similarity index 91% rename from packages/core/src/modules/IgnitionModule.ts rename to packages/core/src/recipes/IgnitionRecipe.ts index 974d287dd7..8884354376 100644 --- a/packages/core/src/modules/IgnitionModule.ts +++ b/packages/core/src/recipes/IgnitionRecipe.ts @@ -1,6 +1,6 @@ import { Executor } from "../executors/Executor"; -export class IgnitionModule { +export class IgnitionRecipe { constructor(public readonly id: string, private _executors: Executor[]) {} public getSortedExecutors(): Executor[] { @@ -11,7 +11,7 @@ export class IgnitionModule { dependencies.get(executor.future.id) ?? new Set(); for (const executorDependency of executor.future.getDependencies()) { - if (executorDependency.moduleId === executor.future.moduleId) { + if (executorDependency.recipeId === executor.future.recipeId) { executorDependencies.add(executorDependency.id); } } diff --git a/packages/core/src/modules/ModuleBuilderImpl.ts b/packages/core/src/recipes/RecipeBuilderImpl.ts similarity index 70% rename from packages/core/src/modules/ModuleBuilderImpl.ts rename to packages/core/src/recipes/RecipeBuilderImpl.ts index 7b55e4f4f3..563b5239d0 100644 --- a/packages/core/src/modules/ModuleBuilderImpl.ts +++ b/packages/core/src/recipes/RecipeBuilderImpl.ts @@ -18,29 +18,29 @@ import type { import type { Artifact, Contract, Tx } from "../types"; import { ExecutionGraph } from "./ExecutionGraph"; -import { UserModule } from "./UserModule"; +import { UserRecipe } from "./UserRecipe"; import type { - ModuleBuilder, + RecipeBuilder, UserContractOptions, UserCallOptions, ParamValue, } from "./types"; import { isArtifact } from "./utils"; -export class ModuleBuilderImpl implements ModuleBuilder { - private _currentModuleId: string | undefined; +export class RecipeBuilderImpl implements RecipeBuilder { + private _currentRecipeId: string | undefined; private _executionGraph = new ExecutionGraph(); private _executors: Executor[] = []; - private _knownModules: Map, any]> = new Map(); + private _knownRecipes: Map, any]> = new Map(); constructor(public chainId: number) {} - public getModuleId(): string { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + public getRecipeId(): string { + if (this._currentRecipeId === undefined) { + throw new Error("[RecipeBuilderImpl] Assertion error: no recipe is set"); } - return this._currentModuleId; + return this._currentRecipeId; } public buildExecutionGraph(): ExecutionGraph { @@ -48,8 +48,8 @@ export class ModuleBuilderImpl implements ModuleBuilder { } public addExecutor(executor: Executor) { - if (this._currentModuleId === undefined) { - throw new Error("[ModuleBuilderImpl] Assertion error: no module is set"); + if (this._currentRecipeId === undefined) { + throw new Error("[RecipeBuilderImpl] Assertion error: no recipe is set"); } this._executionGraph.addExecutor(executor); @@ -69,7 +69,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { const args = options?.args ?? []; const libraries = options?.libraries ?? {}; - future = new ArtifactContractFuture(this.getModuleId(), id, { + future = new ArtifactContractFuture(this.getRecipeId(), id, { contractName, args, libraries, @@ -82,7 +82,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { const args = options?.args ?? []; const libraries = options?.libraries ?? {}; - future = new InternalContractFuture(this.getModuleId(), id, { + future = new InternalContractFuture(this.getRecipeId(), id, { contractName, args, libraries, @@ -101,7 +101,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { ): InternalFuture { const id = contractName; - const future = new ExistingContractFuture(this.getModuleId(), id, { + const future = new ExistingContractFuture(this.getRecipeId(), id, { contractName, address, abi, @@ -120,7 +120,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { const id = options?.id ?? `${(contract as InternalContractFuture).id}.${method}`; const args = options?.args ?? []; - const b = new InternalCallFuture(this.getModuleId(), id, { + const b = new InternalCallFuture(this.getRecipeId(), id, { contract, method, args, @@ -131,23 +131,23 @@ export class ModuleBuilderImpl implements ModuleBuilder { return b; } - public useModule(userModule: UserModule): T { - const knownModuleAndOutput = this._knownModules.get(userModule.id); - if (knownModuleAndOutput !== undefined) { - const [knownModule, knownOutput] = knownModuleAndOutput; - if (userModule === knownModule) { + public useRecipe(userRecipe: UserRecipe): T { + const knownRecipeAndOutput = this._knownRecipes.get(userRecipe.id); + if (knownRecipeAndOutput !== undefined) { + const [knownRecipe, knownOutput] = knownRecipeAndOutput; + if (userRecipe === knownRecipe) { return knownOutput; } else { - throw new Error(`Module with id ${userModule.id} already exists`); + throw new Error(`Recipe with id ${userRecipe.id} already exists`); } } - const previousModuleId = this._currentModuleId; - this._currentModuleId = userModule.id; - const output = userModule.definition(this); - this._currentModuleId = previousModuleId; + const previousRecipeId = this._currentRecipeId; + this._currentRecipeId = userRecipe.id; + const output = userRecipe.definition(this); + this._currentRecipeId = previousRecipeId; - this._knownModules.set(userModule.id, [userModule, output]); + this._knownRecipes.set(userRecipe.id, [userRecipe, output]); return output; } @@ -155,7 +155,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { public getParam(paramName: string): ParamFuture { const id = paramName; - const future = new ParamFuture(this.getModuleId(), id, { paramName }); + const future = new ParamFuture(this.getRecipeId(), id, { paramName }); this.addExecutor(new ParamExecutor(future)); @@ -168,7 +168,7 @@ export class ModuleBuilderImpl implements ModuleBuilder { ): ParamFuture { const id = paramName; - const future = new ParamFuture(this.getModuleId(), id, { + const future = new ParamFuture(this.getRecipeId(), id, { paramName, defaultValue, }); diff --git a/packages/core/src/recipes/UserRecipe.ts b/packages/core/src/recipes/UserRecipe.ts new file mode 100644 index 0000000000..326e4f59f6 --- /dev/null +++ b/packages/core/src/recipes/UserRecipe.ts @@ -0,0 +1,10 @@ +import { RecipeDefinition } from "./types"; + +export class UserRecipe { + public readonly version = 1; + + constructor( + public readonly id: string, + public readonly definition: RecipeDefinition + ) {} +} diff --git a/packages/core/src/recipes/buildRecipe.ts b/packages/core/src/recipes/buildRecipe.ts new file mode 100644 index 0000000000..9494c07515 --- /dev/null +++ b/packages/core/src/recipes/buildRecipe.ts @@ -0,0 +1,9 @@ +import { UserRecipe } from "./UserRecipe"; +import { RecipeDefinition } from "./types"; + +export function buildRecipe( + recipeId: string, + recipeDefinition: RecipeDefinition +): UserRecipe { + return new UserRecipe(recipeId, recipeDefinition); +} diff --git a/packages/core/src/modules/types.ts b/packages/core/src/recipes/types.ts similarity index 84% rename from packages/core/src/modules/types.ts rename to packages/core/src/recipes/types.ts index 3a968a94c2..31a3c0822d 100644 --- a/packages/core/src/modules/types.ts +++ b/packages/core/src/recipes/types.ts @@ -5,7 +5,7 @@ import { ParamFuture } from "../futures/ParamFuture"; import type { IFuture } from "../futures/types"; import { Artifact } from "../types"; -import { UserModule } from "./UserModule"; +import { UserRecipe } from "./UserRecipe"; export interface UserContractOptions { id?: string; @@ -20,10 +20,10 @@ export interface UserCallOptions { export type ParamValue = string | number; -export interface ModuleBuilder { +export interface RecipeBuilder { chainId: number; - getModuleId: () => string; + getRecipeId: () => string; addExecutor: (executor: Executor) => void; contract: ( @@ -44,7 +44,7 @@ export interface ModuleBuilder { options?: UserCallOptions ) => CallFuture; - useModule: (userModule: UserModule) => T; + useRecipe: (userRecipe: UserRecipe) => T; getParam: (paramName: string) => ParamFuture; @@ -54,4 +54,4 @@ export interface ModuleBuilder { ) => ParamFuture; } -export type ModuleDefinition = (m: ModuleBuilder) => T; +export type RecipeDefinition = (m: RecipeBuilder) => T; diff --git a/packages/core/src/modules/utils.ts b/packages/core/src/recipes/utils.ts similarity index 100% rename from packages/core/src/modules/utils.ts rename to packages/core/src/recipes/utils.ts diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 08e6ade574..3e2f7b7302 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,5 +1,5 @@ -import { ParamValue } from "../modules/types"; import { HasParamResult, Providers } from "../providers"; +import { ParamValue } from "../recipes/types"; export class ConfigService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/tx-sender.ts index ecb52af6ec..d27f0a0ee1 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/tx-sender.ts @@ -17,12 +17,12 @@ export class TxSender { private _txIndex = -1; constructor( - private _moduleId: string, + private _recipeId: string, private _executorId: string, private _gasProvider: GasProvider, private _journal: Journal ) { - this._debug = setupDebug(`ignition:tx-sender:${_moduleId}:${_executorId}`); + this._debug = setupDebug(`ignition:tx-sender:${_recipeId}:${_executorId}`); } /** @@ -38,7 +38,7 @@ export class TxSender { const nextTxIndex = this._txIndex + 1; this._debug(`Getting transaction ${nextTxIndex} from journal`); const journaledTx = await this._journal.getEntry( - this._moduleId, + this._recipeId, this._executorId, nextTxIndex ); @@ -56,7 +56,7 @@ export class TxSender { const sentTx = await this._send(signer, tx); this._txIndex = await this._journal.addEntry( - this._moduleId, + this._recipeId, this._executorId, { txHash: sentTx.hash, blockNumberWhenSent } ); @@ -77,7 +77,7 @@ export class TxSender { ): Promise { const sentTx = await this._send(signer, tx); await this._journal.replaceEntry( - this._moduleId, + this._recipeId, this._executorId, txIndex, { txHash: sentTx.hash, blockNumberWhenSent } diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx index 98530edd45..e96d79ad6f 100644 --- a/packages/core/src/ui/components/index.tsx +++ b/packages/core/src/ui/components/index.tsx @@ -5,7 +5,7 @@ import React from "react"; import { FutureState, DeploymentState, - ModuleState, + RecipeState, } from "../../deployment-state"; export const IgnitionUi = ({ @@ -13,48 +13,48 @@ export const IgnitionUi = ({ }: { deploymentState: DeploymentState; }) => { - const currentModule = deploymentState.getCurrentModule(); + const currentRecipe = deploymentState.getCurrentRecipe(); - const successfulModules = deploymentState.getSuccessfulModules(); + const successfulRecipes = deploymentState.getSuccessfulRecipes(); return (
- + - + ); }; const Header = ({ deploymentState }: { deploymentState: DeploymentState }) => { - const successfulModulesCount = deploymentState.getSuccessfulModules().length; - const modulesCount = deploymentState.getModules().length; + const successfulRecipesCount = deploymentState.getSuccessfulRecipes().length; + const recipesCount = deploymentState.getRecipes().length; return ( - {successfulModulesCount} of {modulesCount} modules deployed + {successfulRecipesCount} of {recipesCount} recipes deployed ); }; -const CurrentModule = ({ module }: { module?: ModuleState }) => { - if (module === undefined) { +const CurrentRecipe = ({ recipe }: { recipe?: RecipeState }) => { + if (recipe === undefined) { return null; } - const futuresStates = module.getFuturesStates(); + const futuresStates = recipe.getFuturesStates(); return ( - Deploying {module.id} + Deploying {recipe.id} @@ -117,14 +117,14 @@ const Future = ({ ); }; -const SuccessfulModules = ({ modules }: { modules: ModuleState[] }) => { - if (modules.length === 0) { +const SuccessfulRecipes = ({ recipes }: { recipes: RecipeState[] }) => { + if (recipes.length === 0) { return null; } return ( - {modules.map((m) => ( + {recipes.map((m) => ( Deployed {m.id} diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 837b69e547..2de97830ce 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -1,41 +1,41 @@ import { expect } from "chai"; -import { ExecutionGraph } from "../src/modules/ExecutionGraph"; +import { ExecutionGraph } from "../src/recipes/ExecutionGraph"; import { inc } from "./helpers"; describe("ExecutionGraph", function () { - describe("sort modules", function () { - it("should work for a single module", function () { + describe("sort recipes", function () { + it("should work for a single recipe", function () { // given const executionGraph = new ExecutionGraph(); - executionGraph.addExecutor(inc("MyModule", "inc1", 1)); + executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); // when - const ignitionModules = executionGraph - .getSortedModules() + const ignitionRecipes = executionGraph + .getSortedRecipes() .map((m) => m.id); // then - expect(ignitionModules).to.deep.equal(["MyModule"]); + expect(ignitionRecipes).to.deep.equal(["MyRecipe"]); }); - it("should work for two modules", function () { + it("should work for two recipes", function () { // given const executionGraph = new ExecutionGraph(); - const module1Inc = inc("Module1", "inc1", 1); - const module2Inc = inc("Module2", "inc1", module1Inc.future); + const recipe1Inc = inc("Recipe1", "inc1", 1); + const recipe2Inc = inc("Recipe2", "inc1", recipe1Inc.future); - executionGraph.addExecutor(module2Inc); - executionGraph.addExecutor(module1Inc); + executionGraph.addExecutor(recipe2Inc); + executionGraph.addExecutor(recipe1Inc); // when - const ignitionModules = executionGraph - .getSortedModules() + const ignitionRecipes = executionGraph + .getSortedRecipes() .map((m) => m.id); // then - expect(ignitionModules).to.deep.equal(["Module1", "Module2"]); + expect(ignitionRecipes).to.deep.equal(["Recipe1", "Recipe2"]); }); }); @@ -43,11 +43,11 @@ describe("ExecutionGraph", function () { it("should work for a single executor", function () { // given const executionGraph = new ExecutionGraph(); - executionGraph.addExecutor(inc("MyModule", "inc1", 1)); + executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); // when - const [ignitionModule] = executionGraph.getSortedModules(); - const executors = ignitionModule + const [ignitionRecipe] = executionGraph.getSortedRecipes(); + const executors = ignitionRecipe .getSortedExecutors() .map((e) => e.future.id); @@ -58,13 +58,13 @@ describe("ExecutionGraph", function () { it("should work for two executors", function () { // given const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyModule", "inc1", 1); - executionGraph.addExecutor(inc("MyModule", "incInc1", inc1.future)); + const inc1 = inc("MyRecipe", "inc1", 1); + executionGraph.addExecutor(inc("MyRecipe", "incInc1", inc1.future)); executionGraph.addExecutor(inc1); // when - const [ignitionModule] = executionGraph.getSortedModules(); - const executors = ignitionModule + const [ignitionRecipe] = executionGraph.getSortedRecipes(); + const executors = ignitionRecipe .getSortedExecutors() .map((e) => e.future.id); @@ -75,16 +75,16 @@ describe("ExecutionGraph", function () { it("should work for three sequential executors", function () { // given const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyModule", "inc1", 1); - const incInc1 = inc("MyModule", "incInc1", inc1.future); - const incIncInc1 = inc("MyModule", "incIncInc1", incInc1.future); + const inc1 = inc("MyRecipe", "inc1", 1); + const incInc1 = inc("MyRecipe", "incInc1", inc1.future); + const incIncInc1 = inc("MyRecipe", "incIncInc1", incInc1.future); executionGraph.addExecutor(incIncInc1); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); // when - const [ignitionModule] = executionGraph.getSortedModules(); - const executors = ignitionModule + const [ignitionRecipe] = executionGraph.getSortedRecipes(); + const executors = ignitionRecipe .getSortedExecutors() .map((e) => e.future.id); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 5cd7e13c5c..6990e4a558 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -4,14 +4,14 @@ import { DeploymentState } from "../src/deployment-state"; import { ExecutionEngine, ExecutionEngineOptions, - IgnitionModulesResults, + IgnitionRecipesResults, } from "../src/execution-engine"; import { InMemoryJournal } from "../src/journal/InMemoryJournal"; -import { ExecutionGraph } from "../src/modules/ExecutionGraph"; +import { ExecutionGraph } from "../src/recipes/ExecutionGraph"; import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; -const mockModulesResults: IgnitionModulesResults = { +const mockRecipesResults: IgnitionRecipesResults = { load: async () => { return undefined; }, @@ -25,16 +25,16 @@ const executionEngineOptions: ExecutionEngineOptions = { }; describe("ExecutionEngine", function () { - it("should run a single module with a single executor", async function () { + it("should run a single recipe with a single executor", async function () { // given const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), - mockModulesResults, + mockRecipesResults, executionEngineOptions ); - const inc1 = inc("MyModule", "inc1", 1); + const inc1 = inc("MyRecipe", "inc1", 1); const executionGraph = new ExecutionGraph(); executionGraph.addExecutor(inc1); @@ -44,14 +44,14 @@ describe("ExecutionEngine", function () { const deploymentResult = await runUntilReady(executionGenerator); // then - const resultModules = deploymentResult.getModules(); + const resultRecipes = deploymentResult.getRecipes(); - assert.lengthOf(resultModules, 1); - const [resultModule] = resultModules; - assert.isTrue(resultModule.isSuccess()); - assert.equal(resultModule.count(), 1); + assert.lengthOf(resultRecipes, 1); + const [resultRecipe] = resultRecipes; + assert.isTrue(resultRecipe.isSuccess()); + assert.equal(resultRecipe.count(), 1); - const futureResult = deploymentResult.getFutureResult("MyModule", "inc1"); + const futureResult = deploymentResult.getFutureResult("MyRecipe", "inc1"); assert.equal(futureResult, 2); @@ -63,14 +63,14 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), - mockModulesResults, + mockRecipesResults, executionEngineOptions ); const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyModule", "inc1", 1); + const inc1 = inc("MyRecipe", "inc1", 1); inc1.behavior = "on-demand"; - const incInc1 = inc("MyModule", "incInc1", inc1.future); + const incInc1 = inc("MyRecipe", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -93,15 +93,15 @@ describe("ExecutionEngine", function () { ); // then - const resultModules = deploymentState.getModules(); + const resultRecipes = deploymentState.getRecipes(); - assert.lengthOf(resultModules, 1); - assert.isTrue(resultModules[0].isSuccess()); - assert.equal(resultModules[0].count(), 2); + assert.lengthOf(resultRecipes, 1); + assert.isTrue(resultRecipes[0].isSuccess()); + assert.equal(resultRecipes[0].count(), 2); - const inc1Result = deploymentState.getFutureResult("MyModule", "inc1"); + const inc1Result = deploymentState.getFutureResult("MyRecipe", "inc1"); const incInc1Result = deploymentState.getFutureResult( - "MyModule", + "MyRecipe", "incInc1" ); @@ -117,14 +117,14 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), - mockModulesResults, + mockRecipesResults, executionEngineOptions ); const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyModule", "inc1", 1); + const inc1 = inc("MyRecipe", "inc1", 1); inc1.behavior = "fail"; - const incInc1 = inc("MyModule", "incInc1", inc1.future); + const incInc1 = inc("MyRecipe", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -133,11 +133,11 @@ describe("ExecutionEngine", function () { const deploymentResult = await runUntilReady(executionGenerator); // then - const resultModules = deploymentResult.getModules(); + const resultRecipes = deploymentResult.getRecipes(); - assert.lengthOf(resultModules, 1); - assert.isFalse(resultModules[0].isSuccess()); - assert.isTrue(resultModules[0].isFailure()); + assert.lengthOf(resultRecipes, 1); + assert.isFalse(resultRecipes[0].isSuccess()); + assert.isTrue(resultRecipes[0].isFailure()); assert.isTrue(inc1.isFailure()); assert.isTrue(incInc1.isReady()); @@ -148,14 +148,14 @@ describe("ExecutionEngine", function () { const executionEngine = new ExecutionEngine( getMockedProviders(), new InMemoryJournal(), - mockModulesResults, + mockRecipesResults, executionEngineOptions ); const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyModule", "inc1", 1); + const inc1 = inc("MyRecipe", "inc1", 1); inc1.behavior = "hold"; - const incInc1 = inc("MyModule", "incInc1", inc1.future); + const incInc1 = inc("MyRecipe", "incInc1", inc1.future); executionGraph.addExecutor(inc1); executionGraph.addExecutor(incInc1); @@ -167,10 +167,10 @@ describe("ExecutionEngine", function () { if (deploymentResult === undefined) { assert.fail("Deployment result should be ready"); } - const resultModules = deploymentResult.getModules(); + const resultRecipes = deploymentResult.getRecipes(); - assert.lengthOf(resultModules, 1); - assert.isTrue(resultModules[0].isHold()); + assert.lengthOf(resultRecipes, 1); + assert.isTrue(resultRecipes[0].isHold()); assert.isTrue(inc1.isHold()); assert.isTrue(incInc1.isReady()); diff --git a/packages/core/test/executors/CallExecutor.ts b/packages/core/test/executors/CallExecutor.ts index 413237e562..c9cc38388e 100644 --- a/packages/core/test/executors/CallExecutor.ts +++ b/packages/core/test/executors/CallExecutor.ts @@ -91,7 +91,7 @@ describe("Call Executor", () => { }; const exampleContractFuture = new InternalContractFuture( - "MyModule", + "MyRecipe", "MyContract", { contractName: "MyContract", @@ -172,7 +172,7 @@ async function assertCallValidation( }, }; - const future = new InternalCallFuture("MyModule", "future-1", input); + const future = new InternalCallFuture("MyRecipe", "future-1", input); const ex = new CallExecutor(future); diff --git a/packages/core/test/executors/ExistingContractExecutor.ts b/packages/core/test/executors/ExistingContractExecutor.ts index 2b3b881e57..d4198744f4 100644 --- a/packages/core/test/executors/ExistingContractExecutor.ts +++ b/packages/core/test/executors/ExistingContractExecutor.ts @@ -34,7 +34,7 @@ async function assertExistingContractValidation( input: ExistingContractOptions, expected: string[] ) { - const future = new ExistingContractFuture("MyModule", "future-1", input); + const future = new ExistingContractFuture("MyRecipe", "future-1", input); const ex = new ExistingContractExecutor(future); diff --git a/packages/core/test/futures/ExistingContractFuture.ts b/packages/core/test/futures/ExistingContractFuture.ts index f5f24c63e4..75be19a63a 100644 --- a/packages/core/test/futures/ExistingContractFuture.ts +++ b/packages/core/test/futures/ExistingContractFuture.ts @@ -11,7 +11,7 @@ describe("Existing Contract - future", () => { abi: [], }; - const future = new ExistingContractFuture("MyModule", "future-1", input); + const future = new ExistingContractFuture("MyRecipe", "future-1", input); assert.deepStrictEqual(future.getDependencies(), []); }); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 9d144b13ab..b95ec71ad0 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -15,7 +15,7 @@ import { TransactionsProvider, } from "../src/providers"; -import { ParamValue } from "./modules/types"; +import { ParamValue } from "./recipes/types"; export function getMockedProviders(): Providers { return { @@ -37,12 +37,12 @@ export function emptyDeploymentResult() { * and increments it. */ export function inc( - moduleId: string, + recipeId: string, futureId: string, x: IFuture ): IncreaseNumberExecutor { return new IncreaseNumberExecutor( - new IncreaseNumberFuture(moduleId, futureId, x) + new IncreaseNumberFuture(recipeId, futureId, x) ); } diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index 23c9ca0aea..dbe0b11f9d 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -46,7 +46,7 @@ function runTests(createJournal: () => Journal) { it("should add two transactions to journal", async function () { const txSender = new TxSender( - "MyModule", + "MyRecipe", "MyExecutor", mockGasProvider, createJournal() @@ -69,7 +69,7 @@ function runTests(createJournal: () => Journal) { it("should not re-send an already sent transaction", async function () { const journal = createJournal(); const txSender = new TxSender( - "MyModule", + "MyRecipe", "MyExecutor", mockGasProvider, journal @@ -84,7 +84,7 @@ function runTests(createJournal: () => Journal) { signerStub.sendTransaction.resetHistory(); const txSender2 = new TxSender( - "MyModule", + "MyRecipe", "MyExecutor", mockGasProvider, journal diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index 25777e5a07..951399bef5 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -3,7 +3,7 @@ import { useRef, useState } from "react"; import { FutureState, DeploymentState, - ModuleState, + RecipeState, } from "../src/deployment-state"; import { IgnitionUi } from "../src/ui/components"; @@ -28,61 +28,61 @@ function getExamples(): Example[] { const examples: Example[] = []; examples.push({ - description: "Single module with single contract", + description: "Single recipe with single contract", initialData: { - MyModule: ["Foo"], + MyRecipe: ["Foo"], }, transitions: [ - (d) => d.setFutureState("MyModule", "Foo", FutureState.running()), - (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.running()), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), ], }); examples.push({ - description: "Single module with two contracts deployed in parallel", + description: "Single recipe with two contracts deployed in parallel", initialData: { - MyModule: ["Foo", "Bar"], + MyRecipe: ["Foo", "Bar"], }, transitions: [ (d) => { - d.setFutureState("MyModule", "Foo", FutureState.running()); - d.setFutureState("MyModule", "Bar", FutureState.running()); + d.setFutureState("MyRecipe", "Foo", FutureState.running()); + d.setFutureState("MyRecipe", "Bar", FutureState.running()); }, - (d) => d.setFutureState("MyModule", "Bar", FutureState.success(2)), - (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Bar", FutureState.success(2)), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), ], }); examples.push({ - description: "Two modules", + description: "Two recipes", initialData: { - MyModule: ["Foo"], - MyOtherModule: ["Bar"], + MyRecipe: ["Foo"], + MyOtherRecipe: ["Bar"], }, transitions: [ - (d) => d.setFutureState("MyModule", "Foo", FutureState.running()), - (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), - (d) => d.setFutureState("MyOtherModule", "Bar", FutureState.running()), - (d) => d.setFutureState("MyOtherModule", "Bar", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.running()), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyOtherRecipe", "Bar", FutureState.running()), + (d) => d.setFutureState("MyOtherRecipe", "Bar", FutureState.success(1)), ], }); examples.push({ description: "Two parallel deploys followed by two parallel calls", initialData: { - MyModule: ["Foo", "Bar", "Foo.f", "Bar.b"], + MyRecipe: ["Foo", "Bar", "Foo.f", "Bar.b"], }, transitions: [ (d) => { - d.setFutureState("MyModule", "Foo", FutureState.running()); - d.setFutureState("MyModule", "Bar", FutureState.running()); + d.setFutureState("MyRecipe", "Foo", FutureState.running()); + d.setFutureState("MyRecipe", "Bar", FutureState.running()); }, - (d) => d.setFutureState("MyModule", "Bar", FutureState.success(1)), - (d) => d.setFutureState("MyModule", "Foo", FutureState.success(1)), - (d) => d.setFutureState("MyModule", "Foo.f", FutureState.running()), - (d) => d.setFutureState("MyModule", "Bar.b", FutureState.running()), - (d) => d.setFutureState("MyModule", "Foo.f", FutureState.success(1)), - (d) => d.setFutureState("MyModule", "Bar.b", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Bar", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Foo.f", FutureState.running()), + (d) => d.setFutureState("MyRecipe", "Bar.b", FutureState.running()), + (d) => d.setFutureState("MyRecipe", "Foo.f", FutureState.success(1)), + (d) => d.setFutureState("MyRecipe", "Bar.b", FutureState.success(1)), ], }); @@ -115,12 +115,12 @@ const ExampleRenderer = ({ onFinish: () => void; }) => { const deploymentState = new DeploymentState(); - for (const [moduleId, futuresIds] of Object.entries(initialData)) { - const moduleState = new ModuleState(moduleId); + for (const [recipeId, futuresIds] of Object.entries(initialData)) { + const recipeState = new RecipeState(recipeId); for (const futureId of futuresIds) { - moduleState.addFuture(futureId, FutureState.waiting()); + recipeState.addFuture(futureId, FutureState.waiting()); } - deploymentState.addModule(moduleState); + deploymentState.addRecipe(recipeState); } const deploymentStateRef = useRef(deploymentState); const [transitionIndex, setTransitionIndex] = useState(0); diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 7ca013dea8..ed88a32082 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -24,7 +24,7 @@ export class ConfigWrapper implements ConfigProvider { public async getParam(paramName: string): Promise { if (this.parameters === undefined) { throw new Error( - `No parameters object provided to deploy options, but module requires parameter "${paramName}"` + `No parameters object provided to deploy options, but recipe requires parameter "${paramName}"` ); } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 49f023b402..ab19ed125f 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -2,9 +2,9 @@ import { Future, DeploymentPlan, Ignition, - UserModule, + UserRecipe, IgnitionDeployOptions, - SerializedModuleResult, + SerializedRecipeResult, Providers, ParamValue, } from "@nomicfoundation/ignition-core"; @@ -13,7 +13,7 @@ import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { getAllUserModulesPaths } from "./user-modules"; +import { getAllUserRecipesPaths } from "./user-recipes"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; @@ -30,18 +30,18 @@ export class IgnitionWrapper { private _deployOptions: IgnitionDeployOptions ) { this._ignition = new Ignition(_providers, { - load: (moduleId) => this._getModuleResult(moduleId), - save: (moduleId, moduleResult) => - this._saveModuleResult(moduleId, moduleResult), + load: (recipeId) => this._getRecipeResult(recipeId), + save: (recipeId, recipeResult) => + this._saveRecipeResult(recipeId, recipeResult), }); } public async deploy( - userModuleOrName: UserModule | string, - deployParams: { parameters: { [key: string]: ParamValue } } | undefined + userRecipeOrName: UserRecipe | string, + deployParams?: { parameters: { [key: string]: ParamValue } } ): Promise> { const [, resolvedOutputs] = await this.deployMany( - [userModuleOrName], + [userRecipeOrName], deployParams ); @@ -49,41 +49,41 @@ export class IgnitionWrapper { } /** - * Deploys all the given modules. Returns the deployment result, and an - * array with the resolved outputs that corresponds to each module in + * Deploys all the given recipes. Returns the deployment result, and an + * array with the resolved outputs that corresponds to each recipe in * the input. */ public async deployMany( - userModulesOrNames: Array | string>, + userRecipesOrNames: Array | string>, deployParams: { parameters: { [key: string]: ParamValue } } | undefined ) { if (deployParams !== undefined) { await this._providers.config.setParams(deployParams.parameters); } - const userModules: Array> = []; + const userRecipes: Array> = []; - for (const userModuleOrName of userModulesOrNames) { - const userModule: UserModule = - typeof userModuleOrName === "string" - ? await this._getModule(userModuleOrName) - : userModuleOrName; + for (const userRecipeOrName of userRecipesOrNames) { + const userRecipe: UserRecipe = + typeof userRecipeOrName === "string" + ? await this._getRecipe(userRecipeOrName) + : userRecipeOrName; - userModules.push(userModule); + userRecipes.push(userRecipe); } - const [deploymentResult, moduleOutputs] = await this._ignition.deploy( - userModules, + const [deploymentResult, recipeOutputs] = await this._ignition.deploy( + userRecipes, this._deployOptions ); if (deploymentResult._kind === "hold") { - const [moduleId, holdReason] = deploymentResult.holds; - throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); + const [recipeId, holdReason] = deploymentResult.holds; + throw new Error(`Execution held for recipe '${recipeId}': ${holdReason}`); } if (deploymentResult._kind === "failure") { - const [moduleId, failures] = deploymentResult.failures; + const [recipeId, failures] = deploymentResult.failures; let failuresMessage = ""; for (const failure of failures) { @@ -91,16 +91,16 @@ export class IgnitionWrapper { } throw new Error( - `Execution failed for module '${moduleId}':\n\n${failuresMessage}` + `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` ); } - const resolvedOutputPerModule: Record = {}; - for (const [moduleId, moduleOutput] of Object.entries(moduleOutputs)) { + const resolvedOutputPerRecipe: Record = {}; + for (const [recipeId, recipeOutput] of Object.entries(recipeOutputs)) { const resolvedOutput: any = {}; - for (const [key, value] of Object.entries(moduleOutput)) { + for (const [key, value] of Object.entries(recipeOutput)) { const serializedFutureResult = - deploymentResult.result[value.moduleId][value.id]; + deploymentResult.result[value.recipeId][value.id]; if ( serializedFutureResult._kind === "string" || @@ -114,86 +114,86 @@ export class IgnitionWrapper { resolvedOutput[key] = await this._ethers.getContractAt(abi, address); } } - resolvedOutputPerModule[moduleId] = resolvedOutput; + resolvedOutputPerRecipe[recipeId] = resolvedOutput; } - const resolvedOutputs = userModules.map( - (x) => resolvedOutputPerModule[x.id] + const resolvedOutputs = userRecipes.map( + (x) => resolvedOutputPerRecipe[x.id] ); return [deploymentResult, resolvedOutputs] as const; } public async buildPlan( - userModulesOrNames: Array | string> + userRecipesOrNames: Array | string> ): Promise { - const userModules: Array> = []; - for (const userModuleOrName of userModulesOrNames) { - const userModule: UserModule = - typeof userModuleOrName === "string" - ? await this._getModule(userModuleOrName) - : userModuleOrName; - - userModules.push(userModule); + const userRecipes: Array> = []; + for (const userRecipeOrName of userRecipesOrNames) { + const userRecipe: UserRecipe = + typeof userRecipeOrName === "string" + ? await this._getRecipe(userRecipeOrName) + : userRecipeOrName; + + userRecipes.push(userRecipe); } - const plan = await this._ignition.buildPlan(userModules); + const plan = await this._ignition.buildPlan(userRecipes); return plan; } - private async _getModule(moduleId: string): Promise> { - const userModulesPaths = getAllUserModulesPaths(this._paths.ignition); + private async _getRecipe(recipeId: string): Promise> { + const userRecipesPaths = getAllUserRecipesPaths(this._paths.ignition); - for (const userModulePath of userModulesPaths) { - const resolveUserModulePath = path.resolve( + for (const userRecipePath of userRecipesPaths) { + const resolveUserRecipePath = path.resolve( this._paths.ignition, - userModulePath + userRecipePath ); - const fileExists = await fsExtra.pathExists(resolveUserModulePath); + const fileExists = await fsExtra.pathExists(resolveUserRecipePath); if (!fileExists) { - throw new Error(`Module ${resolveUserModulePath} doesn't exist`); + throw new Error(`Recipe ${resolveUserRecipePath} doesn't exist`); } - const userModule = require(resolveUserModulePath); - const userModuleContent = userModule.default ?? userModule; + const userRecipe = require(resolveUserRecipePath); + const userRecipeContent = userRecipe.default ?? userRecipe; - if (userModuleContent.id === moduleId) { - return userModuleContent; + if (userRecipeContent.id === recipeId) { + return userRecipeContent; } } - throw new Error(`No module found with id ${moduleId}`); + throw new Error(`No recipe found with id ${recipeId}`); } - private async _getModuleResult( - moduleId: string - ): Promise { + private async _getRecipeResult( + recipeId: string + ): Promise { if (this._isHardhatNetwork) { return; } const chainId = await this._getChainId(); - const moduleResultPath = path.join( + const recipeResultPath = path.join( this._paths.deployments, String(chainId), - `${moduleId}.json` + `${recipeId}.json` ); - if (!(await fsExtra.pathExists(moduleResultPath))) { + if (!(await fsExtra.pathExists(recipeResultPath))) { return; } - const serializedModuleResult = await fsExtra.readJson(moduleResultPath); + const serializedRecipeResult = await fsExtra.readJson(recipeResultPath); - return serializedModuleResult; + return serializedRecipeResult; } - private async _saveModuleResult( - moduleId: string, - serializedModuleResult: SerializedModuleResult + private async _saveRecipeResult( + recipeId: string, + serializedRecipeResult: SerializedRecipeResult ): Promise { if (this._isHardhatNetwork) { return; @@ -208,12 +208,12 @@ export class IgnitionWrapper { fsExtra.ensureDirSync(deploymentsDirectory); - const moduleResultPath = path.join( + const recipeResultPath = path.join( deploymentsDirectory, - `${moduleId}.json` + `${recipeId}.json` ); - await fsExtra.writeJson(moduleResultPath, serializedModuleResult, { + await fsExtra.writeJson(recipeResultPath, serializedRecipeResult, { spaces: 2, }); } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3f30ac0ba8..986a5d7d01 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import "@nomiclabs/hardhat-ethers"; -import { Providers, UserModule } from "@nomicfoundation/ignition-core"; +import { Providers, UserRecipe } from "@nomicfoundation/ignition-core"; import { extendConfig, extendEnvironment, @@ -12,12 +12,12 @@ import path from "path"; import { ConfigWrapper } from "./ConfigWrapper"; import { IgnitionWrapper } from "./ignition-wrapper"; -import { loadUserModules, loadAllUserModules } from "./user-modules"; +import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; import "./type-extensions"; export { - buildModule, - ModuleBuilder, + buildRecipe, + RecipeBuilder, AddressLike, ContractFuture, ContractOptions, @@ -117,21 +117,21 @@ extendEnvironment((hre) => { }); /** - * Deploy the given user modules. If none is passed, all modules under + * Deploy the given user recipes. If none is passed, all recipes under * the `paths.ignition` directory are deployed. */ task("deploy") - .addOptionalVariadicPositionalParam("userModulesPaths") + .addOptionalVariadicPositionalParam("userRecipesPaths") .addOptionalParam( "parameters", - "A json object as a string, of the module paramters" + "A json object as a string, of the recipe paramters" ) .setAction( async ( { - userModulesPaths = [], + userRecipesPaths = [], parameters: parametersAsJson, - }: { userModulesPaths: string[]; parameters?: string }, + }: { userRecipesPaths: string[]; parameters?: string }, hre ) => { await hre.run("compile", { quiet: true }); @@ -147,48 +147,48 @@ task("deploy") process.exit(0); } - let userModules: Array>; - if (userModulesPaths.length === 0) { - userModules = loadAllUserModules(hre.config.paths.ignition); + let userRecipes: Array>; + if (userRecipesPaths.length === 0) { + userRecipes = loadAllUserRecipes(hre.config.paths.ignition); } else { - userModules = loadUserModules( + userRecipes = loadUserRecipes( hre.config.paths.ignition, - userModulesPaths + userRecipesPaths ); } - if (userModules.length === 0) { - console.warn("No Ignition modules found"); + if (userRecipes.length === 0) { + console.warn("No Ignition recipes found"); process.exit(0); } - await hre.run("deploy:deploy-modules", { - userModules, + await hre.run("deploy:deploy-recipes", { + userRecipes, parameters, }); } ); -subtask("deploy:deploy-modules") - .addParam("userModules", undefined, undefined, types.any) +subtask("deploy:deploy-recipes") + .addParam("userRecipes", undefined, undefined, types.any) .addOptionalParam("parameters", undefined, undefined, types.any) .setAction( async ( { - userModules, + userRecipes, parameters, }: { - userModules: Array>; + userRecipes: Array>; pathToJournal?: string; parameters: { [key: string]: string | number }; }, hre ) => { - // we ignore the module outputs because they are not relevant when + // we ignore the recipe outputs because they are not relevant when // the deployment is done via a task (as opposed to a deployment // done with `hre.ignition.deploy`) const [serializedDeploymentResult] = await hre.ignition.deployMany( - userModules, + userRecipes, { parameters } ); @@ -197,43 +197,43 @@ subtask("deploy:deploy-modules") ); /** - * Build and show the deployment plan for the given user modules. + * Build and show the deployment plan for the given user recipes. */ task("plan") - .addOptionalVariadicPositionalParam("userModulesPaths") + .addOptionalVariadicPositionalParam("userRecipesPaths") .setAction( - async ({ userModulesPaths = [] }: { userModulesPaths: string[] }, hre) => { + async ({ userRecipesPaths = [] }: { userRecipesPaths: string[] }, hre) => { await hre.run("compile", { quiet: true }); - let userModules: Array>; - if (userModulesPaths.length === 0) { - userModules = loadAllUserModules(hre.config.paths.ignition); + let userRecipes: Array>; + if (userRecipesPaths.length === 0) { + userRecipes = loadAllUserRecipes(hre.config.paths.ignition); } else { - userModules = loadUserModules( + userRecipes = loadUserRecipes( hre.config.paths.ignition, - userModulesPaths + userRecipesPaths ); } - if (userModules.length === 0) { - console.warn("No Ignition modules found"); + if (userRecipes.length === 0) { + console.warn("No Ignition recipes found"); process.exit(0); } - const plan = await hre.ignition.buildPlan(userModules); + const plan = await hre.ignition.buildPlan(userRecipes); let first = true; - for (const [moduleId, modulePlan] of Object.entries(plan)) { + for (const [recipeId, recipePlan] of Object.entries(plan)) { if (first) { first = false; } else { console.log(); } - console.log(`- Module ${moduleId}`); - if (modulePlan === "already-deployed") { + console.log(`- Recipe ${recipeId}`); + if (recipePlan === "already-deployed") { console.log(" Already deployed"); } else { - for (const step of modulePlan) { + for (const step of recipePlan) { console.log(` ${step.id}: ${step.description}`); } } diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts deleted file mode 100644 index b9fc685260..0000000000 --- a/packages/hardhat-plugin/src/user-modules.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { UserModule } from "@nomicfoundation/ignition-core"; -import setupDebug from "debug"; -import fsExtra from "fs-extra"; -import path from "path"; - -const debug = setupDebug("hardhat-ignition:modules"); - -export function loadAllUserModules( - userModulesDirectory: string -): Array> { - debug(`Loading all user modules from '${userModulesDirectory}'`); - - if (!fsExtra.existsSync(userModulesDirectory)) { - throw new Error(`Directory ${userModulesDirectory} not found.`); - } - - const resolvedUserModulesPaths = getAllUserModulesPaths(userModulesDirectory); - - return getUserModulesFromPaths(resolvedUserModulesPaths); -} - -export function loadUserModules( - userModulesDirectory: string, - userModulesFiles: string[] = [] -): Array> { - debug(`Loading user modules from '${userModulesDirectory}'`); - - if (!fsExtra.existsSync(userModulesDirectory)) { - throw new Error(`Directory ${userModulesDirectory} not found.`); - } - - const resolvedUserModulesPaths = getUserModulesPaths( - userModulesDirectory, - userModulesFiles - ); - - return getUserModulesFromPaths(resolvedUserModulesPaths); -} - -export function getUserModulesFromPaths( - resolvedUserModulesPaths: string[] -): Array> { - debug(`Loading '${resolvedUserModulesPaths.length}' module files`); - - const userModules: any[] = []; - for (const pathToFile of resolvedUserModulesPaths) { - const fileExists = fsExtra.pathExistsSync(pathToFile); - if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); - } - - debug(`Loading module file '${pathToFile}'`); - - const userModule = require(pathToFile); - userModules.push(userModule.default ?? userModule); - } - - return userModules; -} - -export function getUserModulesPaths( - userModulesDirectory: string, - userModulesFiles: string[] -): string[] { - return userModulesFiles.map((x) => path.resolve(userModulesDirectory, x)); -} - -export function getAllUserModulesPaths(userModulesDirectory: string) { - return fsExtra - .readdirSync(userModulesDirectory) - .filter((x) => !x.startsWith(".")) - .map((x) => path.resolve(userModulesDirectory, x)); -} diff --git a/packages/hardhat-plugin/src/user-recipes.ts b/packages/hardhat-plugin/src/user-recipes.ts new file mode 100644 index 0000000000..40e16c60cb --- /dev/null +++ b/packages/hardhat-plugin/src/user-recipes.ts @@ -0,0 +1,73 @@ +import { UserRecipe } from "@nomicfoundation/ignition-core"; +import setupDebug from "debug"; +import fsExtra from "fs-extra"; +import path from "path"; + +const debug = setupDebug("hardhat-ignition:recipes"); + +export function loadAllUserRecipes( + userRecipesDirectory: string +): Array> { + debug(`Loading all user recipes from '${userRecipesDirectory}'`); + + if (!fsExtra.existsSync(userRecipesDirectory)) { + throw new Error(`Directory ${userRecipesDirectory} not found.`); + } + + const resolvedUserRecipesPaths = getAllUserRecipesPaths(userRecipesDirectory); + + return getUserRecipesFromPaths(resolvedUserRecipesPaths); +} + +export function loadUserRecipes( + userRecipesDirectory: string, + userRecipesFiles: string[] = [] +): Array> { + debug(`Loading user recipes from '${userRecipesDirectory}'`); + + if (!fsExtra.existsSync(userRecipesDirectory)) { + throw new Error(`Directory ${userRecipesDirectory} not found.`); + } + + const resolvedUserRecipesPaths = getUserRecipesPaths( + userRecipesDirectory, + userRecipesFiles + ); + + return getUserRecipesFromPaths(resolvedUserRecipesPaths); +} + +export function getUserRecipesFromPaths( + resolvedUserRecipesPaths: string[] +): Array> { + debug(`Loading '${resolvedUserRecipesPaths.length}' recipe files`); + + const userRecipes: any[] = []; + for (const pathToFile of resolvedUserRecipesPaths) { + const fileExists = fsExtra.pathExistsSync(pathToFile); + if (!fileExists) { + throw new Error(`Recipe ${pathToFile} doesn't exist`); + } + + debug(`Loading recipe file '${pathToFile}'`); + + const userRecipe = require(pathToFile); + userRecipes.push(userRecipe.default ?? userRecipe); + } + + return userRecipes; +} + +export function getUserRecipesPaths( + userRecipesDirectory: string, + userRecipesFiles: string[] +): string[] { + return userRecipesFiles.map((x) => path.resolve(userRecipesDirectory, x)); +} + +export function getAllUserRecipesPaths(userRecipesDirectory: string) { + return fsExtra + .readdirSync(userRecipesDirectory) + .filter((x) => !x.startsWith(".")) + .map((x) => path.resolve(userRecipesDirectory, x)); +} diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts index c8872e8ee3..2e9eb2fb57 100644 --- a/packages/hardhat-plugin/test/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -1,18 +1,18 @@ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { deployModules } from "./helpers"; +import { deployRecipes } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("chain id", () => { useEnvironment("minimal"); - it("should be available on the module builder", async function () { + it("should be available on the recipe builder", async function () { // given - const chainIdModule = buildModule("MyModule", (m) => { + const chainIdRecipe = buildRecipe("MyRecipe", (m) => { assert.equal(m.chainId, 31337); }); - await deployModules(this.hre, [chainIdModule], [1, 1]); + await deployRecipes(this.hre, [chainIdRecipe], [1, 1]); }); }); diff --git a/packages/hardhat-plugin/test/contractCalls.ts b/packages/hardhat-plugin/test/contractCalls.ts index 81f0abe729..e09b2cfc12 100644 --- a/packages/hardhat-plugin/test/contractCalls.ts +++ b/packages/hardhat-plugin/test/contractCalls.ts @@ -1,9 +1,9 @@ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { assertDeploymentState, - deployModules, + deployRecipes, resultAssertions, } from "./helpers"; import { useEnvironment } from "./useEnvironment"; @@ -13,21 +13,21 @@ describe("contract calls", () => { it("should call a function in a contract", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); m.call(foo, "inc"); }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [userModule], + [userRecipe], [1, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); assert.equal(await foo.x(), 2); @@ -39,7 +39,7 @@ describe("contract calls", () => { it("should fail if a call fails", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); m.call(foo, "incByPositiveNumber", { @@ -48,6 +48,6 @@ describe("contract calls", () => { }); // then - await assert.isRejected(deployModules(this.hre, [userModule], [1, 1])); + await assert.isRejected(deployRecipes(this.hre, [userRecipe], [1, 1])); }); }); diff --git a/packages/hardhat-plugin/test/contractDeploys.ts b/packages/hardhat-plugin/test/contractDeploys.ts index 945f69e146..4ae43663ca 100644 --- a/packages/hardhat-plugin/test/contractDeploys.ts +++ b/packages/hardhat-plugin/test/contractDeploys.ts @@ -1,9 +1,9 @@ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { assertDeploymentState, - deployModules, + deployRecipes, isContract, resultAssertions, } from "./helpers"; @@ -15,16 +15,16 @@ describe("contract deploys", () => { describe("local", () => { it("should deploy a contract", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo"); }); // when - const deploymentResult = await deployModules(this.hre, [userModule], [1]); + const deploymentResult = await deployRecipes(this.hre, [userRecipe], [1]); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); }), @@ -34,17 +34,17 @@ describe("contract deploys", () => { it("should deploy two contracts in parallel", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo"); m.contract("Bar"); }); // when - const deploymentResult = await deployModules(this.hre, [userModule], [2]); + const deploymentResult = await deployRecipes(this.hre, [userRecipe], [2]); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); }), @@ -57,7 +57,7 @@ describe("contract deploys", () => { it("should deploy two contracts sequentially", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); m.contract("UsesContract", { args: [foo], @@ -65,21 +65,21 @@ describe("contract deploys", () => { }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [userModule], + [userRecipe], [1, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); }), UsesContract: resultAssertions.contract(async (usesContract) => { const contractAddress = await usesContract.contractAddress(); - const fooResult: any = deploymentResult.MyModule.Foo; + const fooResult: any = deploymentResult.MyRecipe.Foo; assert.equal(contractAddress, fooResult.value.address); }), @@ -89,7 +89,7 @@ describe("contract deploys", () => { it("should deploy two independent contracts and call a function in each one", async function () { // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const foo1 = m.contract("Foo", { id: "Foo1" }); const foo2 = m.contract("Foo", { id: "Foo2" }); m.call(foo1, "inc"); @@ -98,15 +98,15 @@ describe("contract deploys", () => { }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [userModule], + [userRecipe], [2, 2, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo1: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); assert.equal(await foo.x(), 2); @@ -125,7 +125,7 @@ describe("contract deploys", () => { describe("libraries", () => { it("should deploy a contract with a library", async function () { // given - const withLibModule = buildModule("LibModule", (m) => { + const withLibRecipe = buildRecipe("LibRecipe", (m) => { const rubbishMath = m.contract("RubbishMath"); const dependsOnLib = m.contract("DependsOnLib", { @@ -138,15 +138,15 @@ describe("contract deploys", () => { }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [withLibModule], + [withLibRecipe], [1, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - LibModule: { + LibRecipe: { RubbishMath: resultAssertions.contract(async (rubbishMath) => { assert.equal(await rubbishMath.add(1, 2), 3); }), @@ -159,8 +159,8 @@ describe("contract deploys", () => { it("should deploy a contract with an existing library", async function () { // given - const rubbishMathLibModule = buildModule( - "RubbishMathLibModule", + const rubbishMathLibRecipe = buildRecipe( + "RubbishMathLibRecipe", (m) => { const rubbishMath = m.contract("RubbishMath"); @@ -168,24 +168,24 @@ describe("contract deploys", () => { } ); - const rubbishMathDeploymentResult = await deployModules( + const rubbishMathDeploymentResult = await deployRecipes( this.hre, - [rubbishMathLibModule], + [rubbishMathLibRecipe], [1] ); if ( !isContract( - rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value + rubbishMathDeploymentResult.RubbishMathLibRecipe.RubbishMath.value ) ) { assert.fail("Expected library deployed"); } const { address, abi } = - rubbishMathDeploymentResult.RubbishMathLibModule.RubbishMath.value; + rubbishMathDeploymentResult.RubbishMathLibRecipe.RubbishMath.value; - const withLibModule = buildModule("LibModule", (m) => { + const withLibRecipe = buildRecipe("LibRecipe", (m) => { const rubbishMath = m.contractAt("RubbishMath", address, abi); const dependsOnLib = m.contract("DependsOnLib", { @@ -198,15 +198,15 @@ describe("contract deploys", () => { }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [withLibModule], + [withLibRecipe], [1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - LibModule: { + LibRecipe: { RubbishMath: resultAssertions.contract(async (rubbishMath) => { assert.equal(await rubbishMath.add(1, 2), 3); }), @@ -224,16 +224,16 @@ describe("contract deploys", () => { const artifact = await this.hre.artifacts.readArtifact("Foo"); // given - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo", artifact); }); // when - const deploymentResult = await deployModules(this.hre, [userModule], [1]); + const deploymentResult = await deployRecipes(this.hre, [userRecipe], [1]); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule: { + MyRecipe: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); }), @@ -248,7 +248,7 @@ describe("contract deploys", () => { ); // given - const withLibModule = buildModule("LibModule", (m) => { + const withLibRecipe = buildRecipe("LibRecipe", (m) => { const rubbishMath = m.contract("RubbishMath", rubbishMathArtifact); const dependsOnLib = m.contract("DependsOnLib", { @@ -261,15 +261,15 @@ describe("contract deploys", () => { }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [withLibModule], + [withLibRecipe], [1, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - LibModule: { + LibRecipe: { RubbishMath: resultAssertions.contract(async (rubbishMath) => { assert.equal(await rubbishMath.add(1, 2), 3); }), @@ -285,40 +285,40 @@ describe("contract deploys", () => { describe("existing", () => { it("should deploy using existing contract", async function () { // given - const originalModule = buildModule("FooModule", (m) => { + const originalRecipe = buildRecipe("FooRecipe", (m) => { const foo = m.contract("Foo"); return { foo }; }); - const originalDeploymentResult = await deployModules( + const originalDeploymentResult = await deployRecipes( this.hre, - [originalModule], + [originalRecipe], [1] ); - if (!isContract(originalDeploymentResult.FooModule.Foo.value)) { + if (!isContract(originalDeploymentResult.FooRecipe.Foo.value)) { assert.fail("Expected contract deployed"); } - const { address, abi } = originalDeploymentResult.FooModule.Foo.value; + const { address, abi } = originalDeploymentResult.FooRecipe.Foo.value; - const leveragingExistingModule = buildModule("ExistingFooModule", (m) => { + const leveragingExistingRecipe = buildRecipe("ExistingFooRecipe", (m) => { const existingFoo = m.contractAt("ExistingFoo", address, abi); return { existingFoo }; }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [leveragingExistingModule], + [leveragingExistingRecipe], [1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - ExistingFooModule: { + ExistingFooRecipe: { ExistingFoo: resultAssertions.contract(async (existingFoo) => { assert.isTrue(await existingFoo.isFoo()); }), diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol rename to packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol rename to packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/user-recipes/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js rename to packages/hardhat-plugin/test/fixture-projects/user-recipes/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/.testignore similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore rename to packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/.testignore diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/TestRecipe.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js rename to packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/TestRecipe.js diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index bbd29a2c90..c6e36e1f74 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,5 +1,5 @@ import { - UserModule, + UserRecipe, SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, @@ -30,13 +30,13 @@ type ExpectedFutureResult = | { kind: "transaction"; }; -type ExpectedModuleResult = Record; -type ExpectedDeploymentState = Record; +type ExpectedRecipeResult = Record; +type ExpectedDeploymentState = Record; /** * Check that the given deployment result matches some conditions. * - * `expectedResult` is an object with expected modules results, which have + * `expectedResult` is an object with expected recipes results, which have * expected futures results. These futures results assert that that the * result of each future is of the correct type, and it can also run * some custom predicate logic on the result to further verify it. @@ -46,30 +46,30 @@ export async function assertDeploymentState( result: SerializedDeploymentResult, expectedResult: ExpectedDeploymentState ) { - const modulesResults = Object.entries(result); - const expectedModules = Object.entries(expectedResult); + const recipesResults = Object.entries(result); + const expectedRecipes = Object.entries(expectedResult); assert.equal( - modulesResults.length, - expectedModules.length, - "Expected result and actual result have a different number of modules" + recipesResults.length, + expectedRecipes.length, + "Expected result and actual result have a different number of recipes" ); - for (const [moduleId, moduleResult] of modulesResults) { - const expectedModule = expectedResult[moduleId]; + for (const [recipeId, recipeResult] of recipesResults) { + const expectedRecipe = expectedResult[recipeId]; assert.isDefined( - expectedModule, - `Module ${moduleId} is not part of the expected result` + expectedRecipe, + `Recipe ${recipeId} is not part of the expected result` ); assert.equal( - Object.entries(moduleResult).length, - Object.entries(expectedModule).length + Object.entries(recipeResult).length, + Object.entries(expectedRecipe).length ); - for (const [futureId, futureResult] of Object.entries(moduleResult)) { - const expectedFutureResult = expectedModule[futureId]; + for (const [futureId, futureResult] of Object.entries(recipeResult)) { + const expectedFutureResult = expectedRecipe[futureId]; if (expectedFutureResult.kind === "contract") { const contract = await assertContract(hre, futureResult); @@ -103,22 +103,22 @@ async function assertTxMined(hre: any, hash: string) { } /** - * Deploy all the modules in `userModules`. + * Deploy all the recipes in `userRecipes`. * * Assert that `expectedBlocks.length` blocks are mined, and that * each mined block has `expectedBlocks[i]` transactions. */ -export async function deployModules( +export async function deployRecipes( hre: any, - userModules: Array>, + userRecipes: Array>, expectedBlocks: number[] ): Promise { await hre.run("compile", { quiet: true }); const deploymentResultPromise: Promise = hre.run( - "deploy:deploy-modules", + "deploy:deploy-recipes", { - userModules, + userRecipes, } ); diff --git a/packages/hardhat-plugin/test/param.ts b/packages/hardhat-plugin/test/param.ts index 7ca652ff85..9ab009b0b8 100644 --- a/packages/hardhat-plugin/test/param.ts +++ b/packages/hardhat-plugin/test/param.ts @@ -1,4 +1,4 @@ -import { buildModule, ModuleDefinition } from "@nomicfoundation/ignition-core"; +import { buildRecipe, RecipeDefinition } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { mineBlocks } from "./helpers"; @@ -9,7 +9,7 @@ describe("params", () => { describe("required", () => { it("should be able to retrieve a number", async function () { - const result = await deployModule( + const result = await deployRecipe( this.hre, (m) => { const myNumber = m.getParam("MyNumber"); @@ -35,7 +35,7 @@ describe("params", () => { }); it("should be able to retrieve a string", async function () { - const result = await deployModule( + const result = await deployRecipe( this.hre, (m) => { const myString = m.getParam("MyString"); @@ -61,7 +61,7 @@ describe("params", () => { describe("optional", () => { it("should be able to retrieve a default number", async function () { - const result = await deployModule(this.hre, (m) => { + const result = await deployRecipe(this.hre, (m) => { const myNumber = m.getOptionalParam("MyNumber", 42); const foo = m.contract("Foo"); @@ -80,7 +80,7 @@ describe("params", () => { }); it("should be able to override a default number", async function () { - const result = await deployModule( + const result = await deployRecipe( this.hre, (m) => { const myNumber = m.getOptionalParam("MyNumber", 10); @@ -107,7 +107,7 @@ describe("params", () => { }); it("should be able to retrieve a default string", async function () { - const result = await deployModule(this.hre, (m) => { + const result = await deployRecipe(this.hre, (m) => { const myString = m.getOptionalParam("MyString", "Example"); const greeter = m.contract("Greeter", { @@ -123,7 +123,7 @@ describe("params", () => { }); it("should be able to override a default string", async function () { - const result = await deployModule( + const result = await deployRecipe( this.hre, (m) => { const myString = m.getOptionalParam("MyString", "Example"); @@ -152,7 +152,7 @@ describe("params", () => { it("should throw if no parameters object provided", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -164,20 +164,20 @@ describe("params", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userModule, {}); + const deployPromise = this.hre.ignition.deploy(userRecipe, {}); await mineBlocks(this.hre, [1, 1], deployPromise); await assert.isRejected( deployPromise, - 'No parameters object provided to deploy options, but module requires parameter "MyNumber"' + 'No parameters object provided to deploy options, but recipe requires parameter "MyNumber"' ); }); it("should throw if parameter missing from parameters", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -189,7 +189,7 @@ describe("params", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userModule, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: { NotMyNumber: 11, }, @@ -206,7 +206,7 @@ describe("params", () => { it("should ban multiple params with the same name", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getParam("MyNumber"); const myNumber2 = m.getParam("MyNumber"); @@ -219,7 +219,7 @@ describe("params", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userModule, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: { NotMyNumber: 11, }, @@ -236,7 +236,7 @@ describe("params", () => { it("should ban multiple optional params with the same name", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getOptionalParam("MyNumber", 11); const myNumber2 = m.getOptionalParam("MyNumber", 12); @@ -249,7 +249,7 @@ describe("params", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userModule, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: { NotMyNumber: 11, }, @@ -265,16 +265,16 @@ describe("params", () => { }); }); -async function deployModule( +async function deployRecipe( hre: any, - moduleDefinition: ModuleDefinition, + recipeDefinition: RecipeDefinition, options?: { parameters: {} } ): Promise { await hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", moduleDefinition); + const userRecipe = buildRecipe("MyRecipe", recipeDefinition); - const deployPromise = hre.ignition.deploy(userModule, options); + const deployPromise = hre.ignition.deploy(userRecipe, options); await mineBlocks(hre, [1, 1], deployPromise); diff --git a/packages/hardhat-plugin/test/modules.ts b/packages/hardhat-plugin/test/recipes.ts similarity index 59% rename from packages/hardhat-plugin/test/modules.ts rename to packages/hardhat-plugin/test/recipes.ts index 7234f1589a..24c83a921a 100644 --- a/packages/hardhat-plugin/test/modules.ts +++ b/packages/hardhat-plugin/test/recipes.ts @@ -1,45 +1,45 @@ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { assertDeploymentState, - deployModules, + deployRecipes, resultAssertions, } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("modules", () => { +describe("recipes", () => { useEnvironment("minimal"); - it("should deploy two modules", async function () { + it("should deploy two recipes", async function () { // given - const userModule1 = buildModule("MyModule1", (m) => { + const userRecipe1 = buildRecipe("MyRecipe1", (m) => { const foo = m.contract("Foo"); return { foo }; }); - const userModule2 = buildModule("MyModule2", (m) => { - const { foo } = m.useModule(userModule1); + const userRecipe2 = buildRecipe("MyRecipe2", (m) => { + const { foo } = m.useRecipe(userRecipe1); m.call(foo, "inc"); }); // when - const deploymentResult = await deployModules( + const deploymentResult = await deployRecipes( this.hre, - [userModule2, userModule1], + [userRecipe2, userRecipe1], [1, 1] ); // then await assertDeploymentState(this.hre, deploymentResult, { - MyModule1: { + MyRecipe1: { Foo: resultAssertions.contract(async (foo) => { assert.isTrue(await foo.isFoo()); assert.equal(await foo.x(), 2); }), }, - MyModule2: { + MyRecipe2: { "Foo.inc": resultAssertions.transaction(), }, }); diff --git a/packages/hardhat-plugin/test/user-modules.ts b/packages/hardhat-plugin/test/user-modules.ts deleted file mode 100644 index d522fa3dd3..0000000000 --- a/packages/hardhat-plugin/test/user-modules.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { assert } from "chai"; - -import { - loadUserModules, - loadAllUserModules, - getUserModulesFromPaths, - getUserModulesPaths, - getAllUserModulesPaths, -} from "../src/user-modules"; - -import { useEnvironment } from "./useEnvironment"; - -describe("User modules", function () { - useEnvironment("user-modules"); - - describe("loadUserModules", function () { - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadUserModules("/fake", []), - `Directory /fake not found.` - ); - }); - }); - - describe("loadAllUserModules", function () { - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadAllUserModules("/fake"), - `Directory /fake not found.` - ); - }); - }); - - describe("getAllUserModulesPaths", function () { - it("should return file paths for all user modules in a given directory", () => { - const paths = getAllUserModulesPaths("ignition"); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestModule.js")); - }); - }); - - describe("getUserModulesPaths", function () { - it("should return file paths for the given user module files", () => { - const paths = getUserModulesPaths("ignition", ["TestModule.js"]); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestModule.js")); - }); - }); - - describe("getUserModulesFromPaths", function () { - it("should return a user module from a given path", () => { - const paths = getUserModulesPaths("ignition", ["TestModule.js"]); - const modules = getUserModulesFromPaths(paths); - - assert.equal(modules.length, 1); - assert.equal(modules[0].id, "testing123"); - }); - - it("should throw if given a file that does not exist", () => { - assert.throws(() => getUserModulesFromPaths(["/fake"])); - }); - }); -}); diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts new file mode 100644 index 0000000000..53bf0682d3 --- /dev/null +++ b/packages/hardhat-plugin/test/user-recipes.ts @@ -0,0 +1,65 @@ +import { assert } from "chai"; + +import { + loadUserRecipes, + loadAllUserRecipes, + getUserRecipesFromPaths, + getUserRecipesPaths, + getAllUserRecipesPaths, +} from "../src/user-recipes"; + +import { useEnvironment } from "./useEnvironment"; + +describe("User recipes", function () { + useEnvironment("user-recipes"); + + describe("loadUserRecipes", function () { + it("should throw if given a user recipe directory that does not exist", async () => { + assert.throws( + () => loadUserRecipes("/fake", []), + `Directory /fake not found.` + ); + }); + }); + + describe("loadAllUserRecipes", function () { + it("should throw if given a user recipe directory that does not exist", async () => { + assert.throws( + () => loadAllUserRecipes("/fake"), + `Directory /fake not found.` + ); + }); + }); + + describe("getAllUserRecipesPaths", function () { + it("should return file paths for all user recipes in a given directory", () => { + const paths = getAllUserRecipesPaths("ignition"); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestRecipe.js")); + }); + }); + + describe("getUserRecipesPaths", function () { + it("should return file paths for the given user recipe files", () => { + const paths = getUserRecipesPaths("ignition", ["TestRecipe.js"]); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestRecipe.js")); + }); + }); + + describe("getUserRecipesFromPaths", function () { + it("should return a user recipe from a given path", () => { + const paths = getUserRecipesPaths("ignition", ["TestRecipe.js"]); + const recipes = getUserRecipesFromPaths(paths); + + assert.equal(recipes.length, 1); + assert.equal(recipes[0].id, "testing123"); + }); + + it("should throw if given a file that does not exist", () => { + assert.throws(() => getUserRecipesFromPaths(["/fake"])); + }); + }); +}); From b18e6b969521af05e71b07cd20e97e54b7e5c41e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 12 Aug 2022 12:17:29 +0100 Subject: [PATCH 0044/1302] refactor: spike of new recipes To start the refactor of removing `recipe` as an execution boundary, we cut in a new recipe api that generates a recipe graph. For the moment this is under `./packages/core/src/single-graph`. --- .vscode/launch.json | 22 +- docs/creating-recipes-for-deployment.md | 2 +- packages/core/package.json | 1 + .../src/single-graph/recipe/RecipeGraph.ts | 69 ++ .../single-graph/recipe/RecipeGraphBuilder.ts | 211 ++++++ .../src/single-graph/recipe/buildRecipe.ts | 12 + .../recipe/generateRecipeGraphFrom.ts | 20 + .../core/src/single-graph/types/future.ts | 79 ++ packages/core/src/single-graph/types/graph.ts | 4 + .../core/src/single-graph/types/guards.ts | 63 ++ .../core/src/single-graph/types/hardhat.ts | 9 + .../src/single-graph/types/recipeGraph.ts | 143 ++++ packages/core/test/single-graph/recipes.ts | 694 ++++++++++++++++++ yarn.lock | 5 + 14 files changed, 1331 insertions(+), 3 deletions(-) create mode 100644 packages/core/src/single-graph/recipe/RecipeGraph.ts create mode 100644 packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts create mode 100644 packages/core/src/single-graph/recipe/buildRecipe.ts create mode 100644 packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts create mode 100644 packages/core/src/single-graph/types/future.ts create mode 100644 packages/core/src/single-graph/types/graph.ts create mode 100644 packages/core/src/single-graph/types/guards.ts create mode 100644 packages/core/src/single-graph/types/hardhat.ts create mode 100644 packages/core/src/single-graph/types/recipeGraph.ts create mode 100644 packages/core/test/single-graph/recipes.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 2a5958bcdb..699209ed53 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,13 +1,31 @@ { "version": "0.2.0", "configurations": [ + { + "name": "New Modules", + "internalConsoleOptions": "openOnSessionStart", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "request": "launch", + "skipFiles": ["/**"], + "type": "node", + "cwd": "${workspaceFolder}/packages/core", + "args": [ + "--no-timeouts", + "--colors", + "${workspaceFolder}/packages/core/test/newModules/*.ts" + ], + "env": { + "TS_NODE_FILES": "true", + "DEBUG": "hardhat-ignition:*,ignition:*" + } + }, { "name": "Debug core tests", "internalConsoleOptions": "openOnSessionStart", "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], - "type": "pwa-node", + "type": "node", "cwd": "${workspaceFolder}/packages/core", "args": [ "--no-timeouts", @@ -25,7 +43,7 @@ "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], - "type": "pwa-node", + "type": "node", "cwd": "${workspaceFolder}/packages/hardhat-plugin", "args": [ "--no-timeouts", diff --git a/docs/creating-recipes-for-deployment.md b/docs/creating-recipes-for-deployment.md index efef5307c1..4feea72244 100644 --- a/docs/creating-recipes-for-deployment.md +++ b/docs/creating-recipes-for-deployment.md @@ -82,7 +82,7 @@ const userRecipe = buildRecipe("MyRecipe", (m) => { A library can be deployed and linked to a contract by passing the libraries contract future as a named entry under the libraries option: ```tsx -const safeMath = m.contract("SafeMath"); +const safeMath = m.library("SafeMath"); const contract = m.contract("Contract", { libraries: { SafeMath: safeMath, diff --git a/packages/core/package.json b/packages/core/package.json index 1f71577a7e..cfd3029e89 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -51,6 +51,7 @@ "fs-extra": "^10.0.0", "ink": "^3.2.0", "ink-spinner": "^4.0.3", + "js-graph-algorithms": "1.0.18", "react": "^17.0.2" } } diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts new file mode 100644 index 0000000000..b560f18ed6 --- /dev/null +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -0,0 +1,69 @@ +import { VertexDescriptor } from "../types/graph"; +import { isFuture } from "../types/guards"; +import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; + +export class RecipeGraph implements IRecipeGraph { + public nodes: Map; + public edges: Array<{ from: number; to: number }>; + private deps: Map; + + constructor() { + this.nodes = new Map(); + this.edges = []; + this.deps = new Map(); + } + + public size(): number { + return this.nodes.size; + } + + public getDepNodeByLabel(label: string): RecipeVertex | undefined { + const node = Array.from(this.nodes.values()).find((n) => n.label === label); + + return node !== undefined ? this.deps.get(node.id) : undefined; + } + + public getDepNodeById(id: number): RecipeVertex | undefined { + return this.deps.get(id); + } + + public addDepNode(depNode: RecipeVertex) { + this.nodes.set(depNode.id, { id: depNode.id, label: depNode.label }); + this.deps.set(depNode.id, depNode); + + if (depNode.type !== "DeployedContract") { + const futureArgs = depNode.args.filter(isFuture); + + for (const arg of futureArgs) { + this.edges.push({ from: arg.id, to: depNode.id }); + } + } + + if ( + depNode.type === "HardhatContract" || + depNode.type === "ArtifactContract" + ) { + const futureLibraries = Object.values(depNode.libraries); + + for (const lib of futureLibraries) { + this.edges.push({ from: lib.id, to: depNode.id }); + } + } + + if (depNode.type === "Call") { + this.edges.push({ from: depNode.contract, to: depNode.id }); + } + } + + public getDependenciesFor({ id }: { id: number }): VertexDescriptor[] { + const depIds = this.edges + .filter((edge) => edge.to === id) + .map((edge) => edge.from); + + return depIds + .map((depId) => this.nodes.get(depId)) + .filter( + (nodeDesc): nodeDesc is VertexDescriptor => nodeDesc !== undefined + ); + } +} diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts new file mode 100644 index 0000000000..126d65bddc --- /dev/null +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -0,0 +1,211 @@ +import type { + Future, + HardhatContract, + ArtifactLibrary, + HardhatLibrary, + ArtifactContract, + DeployedContract, + ContractCall, + RequiredParameter, + OptionalParameter, + ParameterValue, +} from "../types/future"; +import { isArtifact } from "../types/guards"; +import type { Artifact } from "../types/hardhat"; +import { + ContractOptions, + IRecipeGraph, + IRecipeGraphBuilder, + RecipeGraphBuilderOptions, +} from "../types/recipeGraph"; + +import { RecipeGraph } from "./RecipeGraph"; + +export class RecipeGraphBuilder implements IRecipeGraphBuilder { + public chainId: number; + public graph: IRecipeGraph; + private idCounter: number; + + constructor(options: RecipeGraphBuilderOptions) { + this.chainId = options.chainId; + this.idCounter = 0; + this.graph = new RecipeGraph(); + } + + public library( + libraryName: string, + artifactOrOptions?: ContractOptions | Artifact | undefined, + givenOptions?: ContractOptions | undefined + ): HardhatLibrary | ArtifactLibrary { + if (isArtifact(artifactOrOptions)) { + const options: ContractOptions | undefined = givenOptions; + + const artifactContractFuture: ArtifactLibrary = { + id: this._resolveNextId(), + label: libraryName, + type: "library", + subtype: "artifact", + _future: true, + }; + + this.graph.addDepNode({ + id: artifactContractFuture.id, + label: libraryName, + type: "ArtifactLibrary", + args: options?.args ?? [], + }); + + return artifactContractFuture; + } else { + const options: ContractOptions | undefined = artifactOrOptions; + + const libraryFuture: HardhatLibrary = { + id: this._resolveNextId(), + label: libraryName, + type: "library", + subtype: "hardhat", + _future: true, + }; + + this.graph.addDepNode({ + id: libraryFuture.id, + label: libraryName, + type: "HardhatLibrary", + args: options?.args ?? [], + }); + + return libraryFuture; + } + } + + public contract( + contractName: string, + artifactOrOptions?: Artifact | ContractOptions, + givenOptions?: ContractOptions + ): HardhatContract | ArtifactContract { + if (isArtifact(artifactOrOptions)) { + const options: ContractOptions | undefined = givenOptions; + + const artifactContractFuture: ArtifactContract = { + id: this._resolveNextId(), + label: contractName, + type: "contract", + subtype: "artifact", + _future: true, + }; + + this.graph.addDepNode({ + id: artifactContractFuture.id, + label: contractName, + type: "ArtifactContract", + args: options?.args ?? [], + libraries: options?.libraries ?? {}, + }); + + return artifactContractFuture; + } else { + const options: ContractOptions | undefined = artifactOrOptions; + + const contractFuture: HardhatContract = { + id: this._resolveNextId(), + label: contractName, + type: "contract", + subtype: "hardhat", + _future: true, + }; + + this.graph.addDepNode({ + id: contractFuture.id, + label: contractName, + type: "HardhatContract", + args: options?.args ?? [], + libraries: options?.libraries ?? {}, + }); + + return contractFuture; + } + } + + public contractAt( + contractName: string, + bytecode: string, + abi: any[] + ): DeployedContract { + const deployedFuture: DeployedContract = { + id: this._resolveNextId(), + label: contractName, + type: "contract", + subtype: "deployed", + _future: true, + }; + + this.graph.addDepNode({ + id: deployedFuture.id, + label: contractName, + type: "DeployedContract", + bytecode, + abi, + }); + + return deployedFuture; + } + + public call( + contractFuture: HardhatContract | ArtifactContract | DeployedContract, + functionName: string, + { + args, + }: { + args: Array; + } + ): ContractCall { + const callFuture: ContractCall = { + id: this._resolveNextId(), + label: `${contractFuture.label}/${functionName}`, + type: "call", + _future: true, + }; + + this.graph.addDepNode({ + id: callFuture.id, + label: callFuture.label, + type: "Call", + contract: contractFuture.id, + args: args ?? [], + }); + + return callFuture; + } + + public getParam(paramName: string): RequiredParameter { + const paramFuture: RequiredParameter = { + id: this._resolveNextId(), + label: paramName, + type: "parameter", + subtype: "required", + _future: true, + }; + + return paramFuture; + } + + public getOptionalParam( + paramName: string, + defaultValue: ParameterValue + ): OptionalParameter { + const paramFuture: OptionalParameter = { + id: this._resolveNextId(), + label: paramName, + type: "parameter", + subtype: "optional", + defaultValue, + _future: true, + }; + + return paramFuture; + } + + private _resolveNextId(): number { + return ++this.idCounter; + } +} diff --git a/packages/core/src/single-graph/recipe/buildRecipe.ts b/packages/core/src/single-graph/recipe/buildRecipe.ts new file mode 100644 index 0000000000..a75330d08c --- /dev/null +++ b/packages/core/src/single-graph/recipe/buildRecipe.ts @@ -0,0 +1,12 @@ +import type { FutureDict } from "../types/future"; +import type { IRecipeGraphBuilder, Recipe } from "../types/recipeGraph"; + +export function buildRecipe( + recipeName: string, + recipeFunc: (m: IRecipeGraphBuilder) => FutureDict +): Recipe { + return { + name: recipeName, + steps: recipeFunc, + }; +} diff --git a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts new file mode 100644 index 0000000000..c3681e478f --- /dev/null +++ b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts @@ -0,0 +1,20 @@ +import type { + RecipeGraphBuilderOptions, + Recipe, + IRecipeGraph, +} from "../types/recipeGraph"; + +import { RecipeGraphBuilder } from "./RecipeGraphBuilder"; + +export function generateRecipeGraphFrom( + recipe: Recipe, + builderOptions: RecipeGraphBuilderOptions +): IRecipeGraph { + const graphBuilder = new RecipeGraphBuilder(builderOptions); + + recipe.steps(graphBuilder); + + const graph = graphBuilder.graph; + + return graph; +} diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts new file mode 100644 index 0000000000..b7476b00bb --- /dev/null +++ b/packages/core/src/single-graph/types/future.ts @@ -0,0 +1,79 @@ +export interface HardhatContract { + id: number; + label: string; + type: "contract"; + subtype: "hardhat"; + _future: true; +} + +export interface ArtifactContract { + id: number; + label: string; + type: "contract"; + subtype: "artifact"; + _future: true; +} + +export interface DeployedContract { + id: number; + label: string; + type: "contract"; + subtype: "deployed"; + _future: true; +} + +export interface HardhatLibrary { + id: number; + label: string; + type: "library"; + subtype: "hardhat"; + _future: true; +} + +export interface ArtifactLibrary { + id: number; + label: string; + type: "library"; + subtype: "artifact"; + _future: true; +} + +export interface ContractCall { + id: number; + label: string; + type: "call"; + _future: true; +} + +export type ParameterValue = string | number | Future; + +export interface RequiredParameter { + id: number; + label: string; + type: "parameter"; + subtype: "required"; + _future: true; +} + +export interface OptionalParameter { + id: number; + label: string; + type: "parameter"; + subtype: "optional"; + defaultValue: ParameterValue; + _future: true; +} + +export type Future = + | HardhatContract + | ArtifactContract + | DeployedContract + | HardhatLibrary + | ArtifactLibrary + | ContractCall + | RequiredParameter + | OptionalParameter; + +export interface FutureDict { + [key: string]: Future; +} diff --git a/packages/core/src/single-graph/types/graph.ts b/packages/core/src/single-graph/types/graph.ts new file mode 100644 index 0000000000..a5dea8d6cb --- /dev/null +++ b/packages/core/src/single-graph/types/graph.ts @@ -0,0 +1,4 @@ +export interface VertexDescriptor { + id: number; + label: string; +} diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts new file mode 100644 index 0000000000..ef428f8274 --- /dev/null +++ b/packages/core/src/single-graph/types/guards.ts @@ -0,0 +1,63 @@ +import type { Future } from "./future"; +import { Artifact } from "./hardhat"; +import type { + RecipeVertex, + HardhatContractRecipeVertex, + ArtifactContractRecipeVertex, + DeployedContractRecipeVertex, + CallRecipeVertex, + HardhatLibraryRecipeVertex, + ArtifactLibraryRecipeVertex, +} from "./recipeGraph"; + +export function isArtifact(artifact: any): artifact is Artifact { + return ( + artifact !== null && + artifact !== undefined && + artifact.bytecode && + artifact.abi + ); +} + +export function isHardhatContract( + node: RecipeVertex +): node is HardhatContractRecipeVertex { + return node.type === "HardhatContract"; +} + +export function isArtifactContract( + node: RecipeVertex +): node is ArtifactContractRecipeVertex { + return node.type === "ArtifactContract"; +} + +export function isDeployedContract( + node: RecipeVertex +): node is DeployedContractRecipeVertex { + return node.type === "DeployedContract"; +} + +export function isCall(node: RecipeVertex): node is CallRecipeVertex { + return node.type === "Call"; +} + +export function isHardhatLibrary( + node: RecipeVertex +): node is HardhatLibraryRecipeVertex { + return node.type === "HardhatLibrary"; +} + +export function isArtifactLibrary( + node: RecipeVertex +): node is ArtifactLibraryRecipeVertex { + return node.type === "ArtifactLibrary"; +} + +export function isFuture(possible: {}): possible is Future { + return ( + possible !== undefined && + possible !== null && + typeof possible === "object" && + "_future" in possible + ); +} diff --git a/packages/core/src/single-graph/types/hardhat.ts b/packages/core/src/single-graph/types/hardhat.ts new file mode 100644 index 0000000000..403f55260b --- /dev/null +++ b/packages/core/src/single-graph/types/hardhat.ts @@ -0,0 +1,9 @@ +export interface Artifact { + contractName: string; + bytecode: string; + abi: any[]; + linkReferences: Record< + string, + Record> + >; +} diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts new file mode 100644 index 0000000000..66c42d67b4 --- /dev/null +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -0,0 +1,143 @@ +import { + ArtifactContract, + ArtifactLibrary, + ContractCall, + DeployedContract, + Future, + FutureDict, + HardhatContract, + HardhatLibrary, + OptionalParameter, + ParameterValue, + RequiredParameter, +} from "./future"; +import { VertexDescriptor } from "./graph"; +import { Artifact } from "./hardhat"; + +interface LibraryMap { + [key: string]: Future; +} + +export interface HardhatContractRecipeVertex { + id: number; + type: "HardhatContract"; + label: string; + args: Array; + libraries: LibraryMap; +} + +export interface ArtifactContractRecipeVertex { + id: number; + type: "ArtifactContract"; + label: string; + args: Array; + libraries: LibraryMap; +} + +export interface DeployedContractRecipeVertex { + id: number; + type: "DeployedContract"; + label: string; + bytecode: string; + abi: any[]; +} + +export interface HardhatLibraryRecipeVertex { + id: number; + type: "HardhatLibrary"; + label: string; + args: Array; +} + +export interface ArtifactLibraryRecipeVertex { + id: number; + type: "ArtifactLibrary"; + label: string; + args: Array; +} + +export interface CallRecipeVertex { + id: number; + type: "Call"; + label: string; + contract: number; + args: Array; +} + +export type RecipeVertex = + | HardhatContractRecipeVertex + | ArtifactContractRecipeVertex + | DeployedContractRecipeVertex + | HardhatLibraryRecipeVertex + | ArtifactLibraryRecipeVertex + | CallRecipeVertex; + +export interface ContractOptions { + args?: Array; + libraries?: { + [key: string]: Future; + }; +} + +export interface IRecipeGraph { + nodes: Map; + edges: Array<{ from: number; to: number }>; + + size: () => number; + addDepNode: (node: RecipeVertex) => void; + getDepNodeByLabel: (label: string) => RecipeVertex | undefined; + getDepNodeById: (id: number) => RecipeVertex | undefined; + getDependenciesFor: ({ + id, + }: { + id: number; + }) => Array<{ id: number; label: string }>; +} + +export interface IRecipeGraphBuilder { + chainId: number; + graph: IRecipeGraph; + + contract: ( + contractName: string, + artifactOrOptions?: Artifact | ContractOptions, + options?: ContractOptions + ) => HardhatContract | ArtifactContract; + + contractAt: ( + contractName: string, + bytecode: string, + abi: any[] + ) => DeployedContract; + + library: ( + contractName: string, + artifactOrOptions?: Artifact | ContractOptions, + options?: ContractOptions + ) => HardhatLibrary | ArtifactLibrary; + + call: ( + contractFuture: HardhatContract | ArtifactContract | DeployedContract, + functionName: string, + { + args, + }: { + args: Array; + } + ) => ContractCall; + + getParam: (paramName: string) => RequiredParameter; + getOptionalParam: ( + paramName: string, + defaultValue: ParameterValue + ) => OptionalParameter; +} + +export interface Recipe { + name: string; + steps: (builder: IRecipeGraphBuilder) => FutureDict; +} + +export interface RecipeGraphBuilderOptions { + chainId: number; +} diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts new file mode 100644 index 0000000000..bb4864cdc7 --- /dev/null +++ b/packages/core/test/single-graph/recipes.ts @@ -0,0 +1,694 @@ +import { assert } from "chai"; + +import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; +import { generateRecipeGraphFrom } from "../../src/single-graph/recipe/generateRecipeGraphFrom"; +import { + isArtifactContract, + isCall, + isDeployedContract, + isHardhatContract, + isHardhatLibrary, +} from "../../src/single-graph/types/guards"; +import { Artifact } from "../../src/single-graph/types/hardhat"; +import type { + IRecipeGraph, + IRecipeGraphBuilder, +} from "../../src/single-graph/types/recipeGraph"; + +describe("Recipes", function () { + describe("single contract", () => { + let depGraph: IRecipeGraph; + + before(() => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Example"); + + return { example }; + }); + + depGraph = generateRecipeGraphFrom(singleRecipe, { chainId: 31337 }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have one node", () => { + assert.equal(depGraph.size(), 1); + }); + + it("should have the contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Example"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Example"); + }); + + it("should show no dependencies for the contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Example"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should record the argument list for the contract node as empty", () => { + const depNode = depGraph.getDepNodeByLabel("Example"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + }); + + describe("two unrelated contracts", () => { + let depGraph: IRecipeGraph; + + before(() => { + const twoContractsRecipe = buildRecipe( + "two contracts", + (m: IRecipeGraphBuilder) => { + const example1 = m.contract("Example1"); + const example2 = m.contract("Example2"); + + return { example1, example2 }; + } + ); + + depGraph = generateRecipeGraphFrom(twoContractsRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have two nodes", () => { + assert.equal(depGraph.size(), 2); + }); + + it("should have both contract nodes", () => { + const depNode1 = depGraph.getDepNodeByLabel("Example1"); + + assert.isDefined(depNode1); + assert.equal(depNode1?.label, "Example1"); + + const depNode2 = depGraph.getDepNodeByLabel("Example2"); + + assert.isDefined(depNode2); + assert.equal(depNode2?.label, "Example2"); + }); + + it("should show no dependencies either contract node", () => { + const depNode1 = depGraph.getDepNodeByLabel("Example1"); + + if (depNode1 === undefined) { + return assert.isDefined(depNode1); + } + + const deps1 = depGraph.getDependenciesFor(depNode1); + + assert.deepStrictEqual(deps1, []); + + const depNode2 = depGraph.getDepNodeByLabel("Example2"); + + if (depNode2 === undefined) { + return assert.isDefined(depNode1); + } + + const deps2 = depGraph.getDependenciesFor(depNode2); + + assert.deepStrictEqual(deps2, []); + }); + }); + + describe("contract with constructor args", () => { + let depGraph: IRecipeGraph; + + before(() => { + const withConstructorArgsRecipe = buildRecipe( + "withConstructorArgs", + (m: IRecipeGraphBuilder) => { + const token = m.contract("Token", { + args: ["My Token", "TKN", 18], + }); + + return { token }; + } + ); + + depGraph = generateRecipeGraphFrom(withConstructorArgsRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have one node", () => { + assert.equal(depGraph.size(), 1); + }); + + it("should have the contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Token"); + }); + + it("should show no dependencies for the contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should record the argument list for the contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, ["My Token", "TKN", 18]); + }); + }); + + describe("dependencies between contracts", () => { + let depGraph: IRecipeGraph; + + before(() => { + const depsBetweenContractsRecipe = buildRecipe( + "dependenciesBetweenContracts", + (m: IRecipeGraphBuilder) => { + const a = m.contract("A"); + + const b = m.contract("B", { + args: [a], + }); + + return { a, b }; + } + ); + + depGraph = generateRecipeGraphFrom(depsBetweenContractsRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have two nodes", () => { + assert.equal(depGraph.size(), 2); + }); + + it("should have the contract node A", () => { + const depNode = depGraph.getDepNodeByLabel("A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "A"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node B", () => { + const depNode = depGraph.getDepNodeByLabel("B"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "B"); + assert(isHardhatContract(depNode)); + }); + + it("should show no dependencies for the contract node A", () => { + const depNode = depGraph.getDepNodeByLabel("A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show one dependency on A for the contract node B", () => { + const depNode = depGraph.getDepNodeByLabel("B"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, [{ id: 1, label: "A" }]); + }); + + it("should record the argument list for the contract node A as empty", () => { + const depNode = depGraph.getDepNodeByLabel("A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + }); + + describe("make a call on a contract", () => { + let depGraph: IRecipeGraph; + + before(() => { + const callRecipe = buildRecipe("call", (m: IRecipeGraphBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); + + m.call(exchange, "addToken", { + args: [token], + }); + + return {}; + }); + + depGraph = generateRecipeGraphFrom(callRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have three nodes", () => { + assert.equal(depGraph.size(), 3); + }); + + it("should have the contract node Token", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node Exchange", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); + + it("should have the call node Exchange/addToken", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange/addToken"); + assert(isCall(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show no dependencies for the contract node Exchange", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show two dependencies for the call node Exchange/addToken", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, [ + { + id: 1, + label: "Token", + }, + { id: 2, label: "Exchange" }, + ]); + }); + + it("should record the argument list for the contract node Token as empty", () => { + const depNode = depGraph.getDepNodeByLabel("Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the contract node Exchange as empty", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + id: 1, + label: "Token", + type: "contract", + subtype: "hardhat", + _future: true, + }, + ]); + }); + }); + + describe("existing contract", () => { + let depGraph: IRecipeGraph; + + before(() => { + const uniswapRecipe = buildRecipe("Uniswap", (m: IRecipeGraphBuilder) => { + const abi = [{}]; + const uniswap = m.contractAt("UniswapRouter", "0x123...", abi); + + return { uniswap }; + }); + + depGraph = generateRecipeGraphFrom(uniswapRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have one node", () => { + assert.equal(depGraph.size(), 1); + }); + + it("should have the deployed contract node", () => { + const depNode = depGraph.getDepNodeByLabel("UniswapRouter"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "UniswapRouter"); + assert(isDeployedContract(depNode)); + }); + + it("should show no dependencies for the deployed contract node", () => { + const depNode = depGraph.getDepNodeByLabel("UniswapRouter"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + }); + + describe("deploying a contract from an artifact", () => { + let depGraph: IRecipeGraph; + + before(() => { + const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + + const fromArtifactRecipe = buildRecipe( + "FromArtifact", + (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo", artifact, { + args: [0], + }); + + return { foo }; + } + ); + + depGraph = generateRecipeGraphFrom(fromArtifactRecipe, { + chainId: 31337, + }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have one node", () => { + assert.equal(depGraph.size(), 1); + }); + + it("should have the artifact contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Foo"); + assert(isArtifactContract(depNode)); + }); + + it("should show no dependencies for the artifact contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should record the argument list for the artifact contract node", () => { + const depNode = depGraph.getDepNodeByLabel("Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isArtifactContract(depNode)) { + return assert.fail("Not an artifact contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, [0]); + }); + }); + + describe("libraries", () => { + let depGraph: IRecipeGraph; + + before(() => { + const librariesRecipe = buildRecipe( + "libraries", + (m: IRecipeGraphBuilder) => { + const safeMath = m.library("SafeMath", { + args: [42], + }); + + const contract = m.contract("Contract", { + libraries: { + SafeMath: safeMath, + }, + }); + + return { safeMath, contract }; + } + ); + + depGraph = generateRecipeGraphFrom(librariesRecipe, { chainId: 31 }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have two nodes", () => { + assert.equal(depGraph.size(), 2); + }); + + it("should have the library node SafeMath", () => { + const depNode = depGraph.getDepNodeByLabel("SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "SafeMath"); + assert(isHardhatLibrary(depNode)); + }); + + it("should have the contract node Contract", () => { + const depNode = depGraph.getDepNodeByLabel("Contract"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Contract"); + assert(isHardhatContract(depNode)); + }); + + it("should show no dependencies for the library node SafeMath", () => { + const depNode = depGraph.getDepNodeByLabel("SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show one dependency on library node SafeMath for Contract", () => { + const depNode = depGraph.getDepNodeByLabel("Contract"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = depGraph.getDependenciesFor(depNode); + + assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath" }]); + }); + + it("should record the argument list for the library node SafeMath as [42]", () => { + const depNode = depGraph.getDepNodeByLabel("SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatLibrary(depNode)) { + return assert.fail("Not a hardhat library dependency node"); + } + + assert.deepStrictEqual(depNode.args, [42]); + }); + }); + + describe("network chain id", () => { + it("should inject the chainId via the builder", () => { + const chainIdRecipe = buildRecipe("chainId", (m: IRecipeGraphBuilder) => { + if (m.chainId === 42) { + return {}; + } + + assert.fail("Chain id was not injected"); + + return {}; + }); + + generateRecipeGraphFrom(chainIdRecipe, { chainId: 42 }); + }); + }); + + describe("recipe parameters", () => { + let depGraph: IRecipeGraph; + + before(() => { + const librariesRecipe = buildRecipe( + "libraries", + (m: IRecipeGraphBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + depGraph = generateRecipeGraphFrom(librariesRecipe, { chainId: 31 }); + }); + + it("should create a graph", () => { + assert.isDefined(depGraph); + }); + + it("should have one node", () => { + assert.equal(depGraph.size(), 1); + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index 00d98a1e05..4f1f2e24ea 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3261,6 +3261,11 @@ jest-changed-files@^24.9.0: execa "^1.0.0" throat "^4.0.0" +js-graph-algorithms@1.0.18: + version "1.0.18" + resolved "https://registry.yarnpkg.com/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz#f96ec87bf194f5c0a31365fa0e1d07b7b962d891" + integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== + js-sha3@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" From d3f5aa0389ebd65b395695e479ce8192fa86730d Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Aug 2022 11:27:05 +0100 Subject: [PATCH 0045/1302] refactor: add execute based on single-graph The next step of the refactor is to sketch out: recipes -> recipeGraph -> validation -> transform -> execution graph -> execute A skeleton of each of these steps has been put in place, and execution filled out for basic contract deploys and calls (libs etc still to do.) To support integration tests a `deploySingleGraph` call has been added to ignition to mirror the existing `deploy`. The intention is to fill out functionality and then finally swap `deploySingleGraph` for `deploy`. --- docs/creating-recipes-for-deployment.md | 11 + packages/core/src/Ignition.ts | 71 +++++++ packages/core/src/index.ts | 7 + .../single-graph/execution/ExecutionGraph.ts | 33 +++ .../single-graph/execution/createServices.ts | 36 ++++ .../src/single-graph/execution/execute.ts | 175 +++++++++++++++ .../transformRecipeGraphToExecutionGraph.ts | 98 +++++++++ packages/core/src/single-graph/index.ts | 6 + .../src/single-graph/recipe/RecipeGraph.ts | 57 ++--- .../single-graph/recipe/RecipeGraphBuilder.ts | 22 +- .../recipe/generateRecipeGraphFrom.ts | 7 +- .../src/single-graph/types/executionGraph.ts | 30 +++ .../core/src/single-graph/types/future.ts | 6 +- .../core/src/single-graph/types/guards.ts | 4 +- .../src/single-graph/types/recipeGraph.ts | 42 ++-- .../src/single-graph/utils/adjacencyList.ts | 65 ++++++ .../validation/validateRecipeGraph.ts | 16 ++ packages/core/test/single-graph/recipes.ts | 200 ++++++++++-------- .../test/single-graph/utils/adjacencyList.ts | 59 ++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 41 ++++ .../minimal/contracts/Contracts.sol | 4 + packages/hardhat-plugin/test/single-graph.ts | 101 +++++++++ 22 files changed, 937 insertions(+), 154 deletions(-) create mode 100644 packages/core/src/single-graph/execution/ExecutionGraph.ts create mode 100644 packages/core/src/single-graph/execution/createServices.ts create mode 100644 packages/core/src/single-graph/execution/execute.ts create mode 100644 packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts create mode 100644 packages/core/src/single-graph/index.ts create mode 100644 packages/core/src/single-graph/types/executionGraph.ts create mode 100644 packages/core/src/single-graph/utils/adjacencyList.ts create mode 100644 packages/core/src/single-graph/validation/validateRecipeGraph.ts create mode 100644 packages/core/test/single-graph/utils/adjacencyList.ts create mode 100644 packages/hardhat-plugin/test/single-graph.ts diff --git a/docs/creating-recipes-for-deployment.md b/docs/creating-recipes-for-deployment.md index 4feea72244..ebc4820f92 100644 --- a/docs/creating-recipes-for-deployment.md +++ b/docs/creating-recipes-for-deployment.md @@ -52,6 +52,17 @@ const b = m.contract("B", { You can think of this as `b` being analogue to a promise of an address, although futures are not promises. +### Executing a method in a contract + +```tsx +const token = m.contract("Token") +const exchange = m.contract("Exchange") + +m.call(exchange, "addToken", { + args: [token] +}) +``` + ### Using an existing contract A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and abi: diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 02d1bd3a26..708f0fb544 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -7,11 +7,18 @@ import { ExecutionManager, IgnitionRecipesResults, } from "./execution-engine"; +import { SerializedDeploymentResult } from "./futures/types"; +import { serializeFutureOutput } from "./futures/utils"; import { FileJournal } from "./journal/FileJournal"; import { InMemoryJournal } from "./journal/InMemoryJournal"; import { Providers } from "./providers"; import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; import { UserRecipe } from "./recipes/UserRecipe"; +import { execute } from "./single-graph/execution/execute"; +import { transformRecipeGraphToExecutionGraph } from "./single-graph/execution/transformRecipeGraphToExecutionGraph"; +import { generateRecipeGraphFrom } from "./single-graph/recipe/generateRecipeGraphFrom"; +import { FutureDict } from "./single-graph/types/future"; +import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; const log = setupDebug("ignition:main"); @@ -97,6 +104,55 @@ export class Ignition { return ExecutionEngine.buildPlan(executionGraph, this._recipesResults); } + public async deploySingleGraph( + recipe: any + ): Promise<[DeploymentResult, any]> { + log(`Start deploy`); + + const chainId = await this._getChainId(); + + const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( + recipe, + { chainId } + ); + + const validationResult = validateRecipeGraph(recipeGraph); + + if (validationResult._kind === "failure") { + return [validationResult, {}]; + } + + const serviceOptions = { + providers: this._providers, + journal: new InMemoryJournal(), + txPollingInterval: 300, + }; + + const transformResult = await transformRecipeGraphToExecutionGraph( + recipeGraph, + serviceOptions + ); + + if (transformResult._kind === "failure") { + return [transformResult, {}]; + } + + const { executionGraph } = transformResult; + + const executionResult = await execute(executionGraph, serviceOptions); + + if (executionResult._kind === "failure") { + return [executionResult, {}]; + } + + const serializedDeploymentResult = this._serialize( + recipeOutputs, + executionResult.result + ); + + return [{ _kind: "success", result: serializedDeploymentResult }, {}]; + } + private async _getChainId(): Promise { const result = await this._providers.ethereumProvider.request({ method: "eth_chainId", @@ -104,4 +160,19 @@ export class Ignition { return Number(result); } + + private _serialize( + recipeOutputs: FutureDict, + result: Map + ): SerializedDeploymentResult { + const convertedEntries = Object.entries(recipeOutputs).map( + ([name, future]) => { + const executionResultValue = result.get(future.id); + + return [name, serializeFutureOutput(executionResultValue)]; + } + ); + + return Object.fromEntries(convertedEntries); + } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 93fa9c5d4d..df85de3839 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -26,3 +26,10 @@ export type { DeploymentResult } from "./execution-engine"; export { DeploymentPlan } from "./execution-engine"; export { Ignition, IgnitionDeployOptions } from "./Ignition"; export type { Contract } from "./types"; + +export { buildRecipeSingleGraph } from "./single-graph/index"; +export type { + RecipeSingleGraph, + IRecipeGraphBuilder, + FutureDict, +} from "./single-graph/index"; diff --git a/packages/core/src/single-graph/execution/ExecutionGraph.ts b/packages/core/src/single-graph/execution/ExecutionGraph.ts new file mode 100644 index 0000000000..d6a408dd0a --- /dev/null +++ b/packages/core/src/single-graph/execution/ExecutionGraph.ts @@ -0,0 +1,33 @@ +import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; +import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; +import { + AdjacencyList, + clone, + constructEmptyAdjacencyList, +} from "../utils/adjacencyList"; + +export class ExecutionGraph implements IExecutionGraph { + public adjacencyList: AdjacencyList; + public vertexes: Map; + + private constructor() { + this.adjacencyList = constructEmptyAdjacencyList(); + this.vertexes = new Map(); + } + + public static async from( + recipeGraph: IRecipeGraph, + convert: (vertex: RecipeVertex) => Promise + ) { + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = clone(recipeGraph.adjacencyList); + + for (const [id, recipeVertex] of recipeGraph.vertexes.entries()) { + const executionVertex = await convert(recipeVertex); + + executionGraph.vertexes.set(id, executionVertex); + } + + return executionGraph; + } +} diff --git a/packages/core/src/single-graph/execution/createServices.ts b/packages/core/src/single-graph/execution/createServices.ts new file mode 100644 index 0000000000..28092dfba2 --- /dev/null +++ b/packages/core/src/single-graph/execution/createServices.ts @@ -0,0 +1,36 @@ +import { Journal } from "../../journal/types"; +import { Providers } from "../../providers"; +import { ArtifactsService } from "../../services/ArtifactsService"; +import { ConfigService } from "../../services/ConfigService"; +import { ContractsService } from "../../services/ContractsService"; +import { TransactionsService } from "../../services/TransactionsService"; +import { Services } from "../../services/types"; +import { TxSender } from "../../tx-sender"; + +export function createServices( + recipeId: string, + executorId: string, + { + providers, + journal, + txPollingInterval, + }: { providers: Providers; journal: Journal; txPollingInterval: number } +): Services { + const txSender = new TxSender( + recipeId, + executorId, + providers.gasProvider, + journal + ); + + const services: Services = { + artifacts: new ArtifactsService(providers), + contracts: new ContractsService(providers, txSender, { + pollingInterval: txPollingInterval, + }), + transactions: new TransactionsService(providers), + config: new ConfigService(providers), + }; + + return services; +} diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts new file mode 100644 index 0000000000..af188e862e --- /dev/null +++ b/packages/core/src/single-graph/execution/execute.ts @@ -0,0 +1,175 @@ +import { Journal } from "../../journal/types"; +import { Providers } from "../../providers"; +import { Services } from "../../services/types"; +import { + ArgValue, + ContractCall, + ContractDeploy, + ExecutionVertex, + IExecutionGraph, +} from "../types/executionGraph"; +import { isFuture } from "../types/guards"; +import { topologicalSort } from "../utils/adjacencyList"; + +import { createServices } from "./createServices"; + +export type ExecuteResult = + | { + _kind: "success"; + result: Map; + } + | { + _kind: "failure"; + failures: [string, Error[]]; + }; + +export async function execute( + executionGraph: IExecutionGraph, + servicesOptions: { + providers: Providers; + journal: Journal; + txPollingInterval: number; + } +): Promise { + const services: Services = createServices( + "recipeIdEXECUTE", + "executorIdEXECUTE", + servicesOptions + ); + + const resultContext: Map = new Map(); + + const executionResults = await visit( + executionGraph, + resultContext, + (executionVertex: ExecutionVertex, context: Map) => { + switch (executionVertex.type) { + case "ContractDeploy": + return executeContractDeploy(executionVertex, { + ...services, + context, + }); + case "ContractCall": + return executeContractCall(executionVertex, { + ...services, + context, + }); + default: + return assertUnknownExecutionVertexType(executionVertex); + } + } + ); + + return { _kind: "success", result: executionResults }; +} + +async function visit( + executionGraph: IExecutionGraph, + resultContext: Map, + vistitorAction: ( + executionVertex: ExecutionVertex, + context: Map + ) => Promise> +) { + for (const vertexId of topological(executionGraph)) { + const vertex = executionGraph.vertexes.get(vertexId); + + if (vertex === undefined) { + // this shouldn't happen + continue; + } + + const result = await vistitorAction(vertex, resultContext); + + resultContext.set(vertexId, result); + } + + return resultContext; +} + +function topological(executionGraph: IExecutionGraph): number[] { + const orderedIds = topologicalSort(executionGraph.adjacencyList); + + const totalOrderedIds = Array.from(executionGraph.vertexes.keys()) + .filter((k) => !orderedIds.includes(k)) + .concat(orderedIds); + + return totalOrderedIds; +} + +async function executeContractDeploy( + { artifact, args }: ContractDeploy, + services: Services & { context: Map } +): Promise { + const resolvedArgs = args + .map(resolveFromContext(services.context)) + .map(toAddress); + + const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + + const receipt = await services.transactions.wait(txHash); + + return { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }; +} + +async function executeContractCall( + { method, contract, args }: ContractCall, + services: Services & { context: Map } +): Promise { + const resolve = resolveFromContext(services.context); + + const resolvedArgs = args.map(resolve).map(toAddress); + const { address, abi } = resolve(contract); + + const txHash = await services.contracts.call( + address, + abi, + method, + resolvedArgs + ); + + await services.transactions.wait(txHash); + + return { + hash: txHash, + }; +} + +function toAddress(v: any) { + if (typeof v === "object" && "address" in v) { + return v.address; + } + + return v; +} + +function resolveFromContext(context: Map) { + return (arg: ArgValue) => { + if (!isFuture(arg)) { + return arg; + } + + const entry = context.get(arg.id); + + if (!entry) { + throw new Error(`No context entry for ${arg.id}`); + } + + return entry; + }; +} + +function assertUnknownExecutionVertexType( + executionVertex: never +): Promise> { + const vertex = executionVertex as any; + + const forReport = "type" in vertex ? vertex.type : vertex; + + throw new Error(`Unknown execution vertex type: ${forReport}`); +} diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts new file mode 100644 index 0000000000..f9503f2486 --- /dev/null +++ b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts @@ -0,0 +1,98 @@ +import { Journal } from "../../journal/types"; +import { Providers } from "../../providers"; +import { Services } from "../../services/types"; +import { Artifact } from "../../types"; +import { + ContractCall, + ContractDeploy, + ExecutionVertex, + IExecutionGraph, +} from "../types/executionGraph"; +import { + CallRecipeVertex, + HardhatContractRecipeVertex, + IRecipeGraph, + RecipeVertex, +} from "../types/recipeGraph"; + +import { ExecutionGraph } from "./ExecutionGraph"; +import { createServices } from "./createServices"; + +export type TransformResult = + | { + _kind: "success"; + executionGraph: IExecutionGraph; + } + | { + _kind: "failure"; + failures: [string, Error[]]; + }; + +export async function transformRecipeGraphToExecutionGraph( + recipeGraph: IRecipeGraph, + servicesOptions: { + providers: Providers; + journal: Journal; + txPollingInterval: number; + } +): Promise { + const services = createServices( + "recipeIdTRANSFORM", + "recipeIdTRANSFORM", + servicesOptions + ); + + const executionGraph: IExecutionGraph = await ExecutionGraph.from( + recipeGraph, + convertRecipeVertexToExecutionVertex(services) + ); + + return { _kind: "success", executionGraph }; +} + +function convertRecipeVertexToExecutionVertex( + services: Services +): (recipeVertex: RecipeVertex) => Promise { + return (recipeVertex: RecipeVertex) => { + switch (recipeVertex.type) { + case "HardhatContract": + return convertHardhatContractToContractDeploy(recipeVertex, services); + case "Call": + return convertCallToContractCall(recipeVertex, services); + default: + throw new Error(`Type note expected: ${recipeVertex.type}`); + } + }; +} + +async function convertHardhatContractToContractDeploy( + hardhatContractRecipeVertex: HardhatContractRecipeVertex, + services: Services +): Promise { + const artifact: Artifact = await services.artifacts.getArtifact( + hardhatContractRecipeVertex.contractName + ); + + return { + type: "ContractDeploy", + id: hardhatContractRecipeVertex.id, + label: hardhatContractRecipeVertex.label, + artifact, + args: hardhatContractRecipeVertex.args, + }; +} + +async function convertCallToContractCall( + callRecipeVertex: CallRecipeVertex, + _services: Services +): Promise { + return { + type: "ContractCall", + id: callRecipeVertex.id, + label: callRecipeVertex.label, + + contract: callRecipeVertex.contract, + method: callRecipeVertex.method, + args: callRecipeVertex.args, + }; +} diff --git a/packages/core/src/single-graph/index.ts b/packages/core/src/single-graph/index.ts new file mode 100644 index 0000000000..be4b581bb1 --- /dev/null +++ b/packages/core/src/single-graph/index.ts @@ -0,0 +1,6 @@ +export { buildRecipe as buildRecipeSingleGraph } from "./recipe/buildRecipe"; +export type { + Recipe as RecipeSingleGraph, + IRecipeGraphBuilder, +} from "./types/recipeGraph"; +export type { FutureDict } from "./types/future"; diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index b560f18ed6..1daf3c4340 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,41 +1,42 @@ import { VertexDescriptor } from "../types/graph"; import { isFuture } from "../types/guards"; import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; +import { + addEdge, + AdjacencyList, + constructEmptyAdjacencyList, + getDependenciesFor, +} from "../utils/adjacencyList"; export class RecipeGraph implements IRecipeGraph { - public nodes: Map; - public edges: Array<{ from: number; to: number }>; - private deps: Map; + public adjacencyList: AdjacencyList; + public vertexes: Map; constructor() { - this.nodes = new Map(); - this.edges = []; - this.deps = new Map(); + this.adjacencyList = constructEmptyAdjacencyList(); + this.vertexes = new Map(); } - public size(): number { - return this.nodes.size; + public vertexSize(): number { + return this.vertexes.size; } - public getDepNodeByLabel(label: string): RecipeVertex | undefined { - const node = Array.from(this.nodes.values()).find((n) => n.label === label); - - return node !== undefined ? this.deps.get(node.id) : undefined; + public getRecipeVertexByLabel(label: string): RecipeVertex | undefined { + return Array.from(this.vertexes.values()).find((n) => n.label === label); } - public getDepNodeById(id: number): RecipeVertex | undefined { - return this.deps.get(id); + public getRecipeVertexById(id: number): RecipeVertex | undefined { + return this.vertexes.get(id); } - public addDepNode(depNode: RecipeVertex) { - this.nodes.set(depNode.id, { id: depNode.id, label: depNode.label }); - this.deps.set(depNode.id, depNode); + public addRecipeVertex(depNode: RecipeVertex) { + this.vertexes.set(depNode.id, depNode); if (depNode.type !== "DeployedContract") { const futureArgs = depNode.args.filter(isFuture); for (const arg of futureArgs) { - this.edges.push({ from: arg.id, to: depNode.id }); + addEdge(this.adjacencyList, { from: arg.id, to: depNode.id }); } } @@ -46,24 +47,24 @@ export class RecipeGraph implements IRecipeGraph { const futureLibraries = Object.values(depNode.libraries); for (const lib of futureLibraries) { - this.edges.push({ from: lib.id, to: depNode.id }); + addEdge(this.adjacencyList, { from: lib.id, to: depNode.id }); } } if (depNode.type === "Call") { - this.edges.push({ from: depNode.contract, to: depNode.id }); + addEdge(this.adjacencyList, { + from: depNode.contract.id, + to: depNode.id, + }); } } - public getDependenciesFor({ id }: { id: number }): VertexDescriptor[] { - const depIds = this.edges - .filter((edge) => edge.to === id) - .map((edge) => edge.from); + public getDependenciesForVertex({ id }: { id: number }): VertexDescriptor[] { + const depIds = getDependenciesFor(this.adjacencyList, id); return depIds - .map((depId) => this.nodes.get(depId)) - .filter( - (nodeDesc): nodeDesc is VertexDescriptor => nodeDesc !== undefined - ); + .map((depId) => this.vertexes.get(depId)) + .filter((nodeDesc): nodeDesc is RecipeVertex => nodeDesc !== undefined) + .map((vertex) => ({ id: vertex.id, label: vertex.label })); } } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 126d65bddc..4c344e6ee0 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -1,5 +1,5 @@ import type { - Future, + RecipeFuture, HardhatContract, ArtifactLibrary, HardhatLibrary, @@ -48,7 +48,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: artifactContractFuture.id, label: libraryName, type: "ArtifactLibrary", @@ -67,7 +67,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: libraryFuture.id, label: libraryName, type: "HardhatLibrary", @@ -94,7 +94,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: artifactContractFuture.id, label: contractName, type: "ArtifactContract", @@ -114,10 +114,11 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: contractFuture.id, label: contractName, type: "HardhatContract", + contractName, args: options?.args ?? [], libraries: options?.libraries ?? {}, }); @@ -139,7 +140,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: deployedFuture.id, label: contractName, type: "DeployedContract", @@ -156,7 +157,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { { args, }: { - args: Array; + args: Array; } ): ContractCall { const callFuture: ContractCall = { @@ -166,11 +167,12 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addDepNode({ + this.graph.addRecipeVertex({ id: callFuture.id, label: callFuture.label, type: "Call", - contract: contractFuture.id, + contract: contractFuture, + method: functionName, args: args ?? [], }); @@ -206,6 +208,6 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } private _resolveNextId(): number { - return ++this.idCounter; + return this.idCounter++; } } diff --git a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts index c3681e478f..c2143363e1 100644 --- a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts +++ b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts @@ -1,3 +1,4 @@ +import { FutureDict } from "../types/future"; import type { RecipeGraphBuilderOptions, Recipe, @@ -9,12 +10,12 @@ import { RecipeGraphBuilder } from "./RecipeGraphBuilder"; export function generateRecipeGraphFrom( recipe: Recipe, builderOptions: RecipeGraphBuilderOptions -): IRecipeGraph { +): { graph: IRecipeGraph; recipeOutputs: FutureDict } { const graphBuilder = new RecipeGraphBuilder(builderOptions); - recipe.steps(graphBuilder); + const recipeOutputs = recipe.steps(graphBuilder); const graph = graphBuilder.graph; - return graph; + return { graph, recipeOutputs }; } diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts new file mode 100644 index 0000000000..1c03a3114c --- /dev/null +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -0,0 +1,30 @@ +import { AdjacencyList } from "../utils/adjacencyList"; + +import { RecipeFuture } from "./future"; +import { Artifact } from "./hardhat"; + +export type ArgValue = string | number | RecipeFuture; + +export interface ContractDeploy { + type: "ContractDeploy"; + id: number; + label: string; + artifact: Artifact; + args: ArgValue[]; +} + +export interface ContractCall { + type: "ContractCall"; + id: number; + label: string; + contract: any; + method: string; + args: ArgValue[]; +} + +export type ExecutionVertex = ContractDeploy | ContractCall; + +export interface IExecutionGraph { + adjacencyList: AdjacencyList; + vertexes: Map; +} diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index b7476b00bb..0c90cac867 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -45,7 +45,7 @@ export interface ContractCall { _future: true; } -export type ParameterValue = string | number | Future; +export type ParameterValue = string | number | RecipeFuture; export interface RequiredParameter { id: number; @@ -64,7 +64,7 @@ export interface OptionalParameter { _future: true; } -export type Future = +export type RecipeFuture = | HardhatContract | ArtifactContract | DeployedContract @@ -75,5 +75,5 @@ export type Future = | OptionalParameter; export interface FutureDict { - [key: string]: Future; + [key: string]: RecipeFuture; } diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts index ef428f8274..4f547370bc 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/types/guards.ts @@ -1,4 +1,4 @@ -import type { Future } from "./future"; +import type { RecipeFuture } from "./future"; import { Artifact } from "./hardhat"; import type { RecipeVertex, @@ -53,7 +53,7 @@ export function isArtifactLibrary( return node.type === "ArtifactLibrary"; } -export function isFuture(possible: {}): possible is Future { +export function isFuture(possible: {}): possible is RecipeFuture { return ( possible !== undefined && possible !== null && diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 66c42d67b4..55e0f2b5ee 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -3,7 +3,7 @@ import { ArtifactLibrary, ContractCall, DeployedContract, - Future, + RecipeFuture, FutureDict, HardhatContract, HardhatLibrary, @@ -11,18 +11,18 @@ import { ParameterValue, RequiredParameter, } from "./future"; -import { VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; interface LibraryMap { - [key: string]: Future; + [key: string]: RecipeFuture; } export interface HardhatContractRecipeVertex { id: number; type: "HardhatContract"; label: string; - args: Array; + contractName: string; + args: Array; libraries: LibraryMap; } @@ -30,7 +30,7 @@ export interface ArtifactContractRecipeVertex { id: number; type: "ArtifactContract"; label: string; - args: Array; + args: Array; libraries: LibraryMap; } @@ -46,22 +46,23 @@ export interface HardhatLibraryRecipeVertex { id: number; type: "HardhatLibrary"; label: string; - args: Array; + args: Array; } export interface ArtifactLibraryRecipeVertex { id: number; type: "ArtifactLibrary"; label: string; - args: Array; + args: Array; } export interface CallRecipeVertex { id: number; type: "Call"; label: string; - contract: number; - args: Array; + contract: HardhatContract | ArtifactContract | DeployedContract; + method: string; + args: Array; } export type RecipeVertex = @@ -73,21 +74,21 @@ export type RecipeVertex = | CallRecipeVertex; export interface ContractOptions { - args?: Array; + args?: Array; libraries?: { - [key: string]: Future; + [key: string]: RecipeFuture; }; } export interface IRecipeGraph { - nodes: Map; - edges: Array<{ from: number; to: number }>; - - size: () => number; - addDepNode: (node: RecipeVertex) => void; - getDepNodeByLabel: (label: string) => RecipeVertex | undefined; - getDepNodeById: (id: number) => RecipeVertex | undefined; - getDependenciesFor: ({ + vertexes: Map; + adjacencyList: Array>; + + vertexSize: () => number; + addRecipeVertex: (node: RecipeVertex) => void; + getRecipeVertexByLabel: (label: string) => RecipeVertex | undefined; + getRecipeVertexById: (id: number) => RecipeVertex | undefined; + getDependenciesForVertex: ({ id, }: { id: number; @@ -122,11 +123,12 @@ export interface IRecipeGraphBuilder { { args, }: { - args: Array; + args: Array; } ) => ContractCall; getParam: (paramName: string) => RequiredParameter; + getOptionalParam: ( paramName: string, defaultValue: ParameterValue diff --git a/packages/core/src/single-graph/utils/adjacencyList.ts b/packages/core/src/single-graph/utils/adjacencyList.ts new file mode 100644 index 0000000000..1582da05d3 --- /dev/null +++ b/packages/core/src/single-graph/utils/adjacencyList.ts @@ -0,0 +1,65 @@ +import { DiGraph, TopologicalSort } from "js-graph-algorithms"; + +export type AdjacencyList = Array>; + +export function constructEmptyAdjacencyList(): Array> { + return []; +} + +export function addEdge( + adjacencyList: AdjacencyList, + { from, to }: { from: number; to: number } +) { + const toSet = adjacencyList[from] ?? new Set(); + + toSet.add(to); + + adjacencyList[from] = toSet; +} + +export function getDependenciesFor(adjacencyList: AdjacencyList, to: number) { + const depIds = []; + + for (let from = 0; from < adjacencyList.length; from++) { + if (adjacencyList[from].has(to)) { + depIds.push(from); + } + } + + return depIds; +} + +export function clone(adjacencyList: AdjacencyList): AdjacencyList { + const newList: AdjacencyList = []; + + for (let i = 0; i < adjacencyList.length; i++) { + newList[i] = new Set(adjacencyList[i]); + } + + return newList; +} + +export function topologicalSort(adjacencyList: AdjacencyList): number[] { + if (adjacencyList.length === 0) { + return []; + } + + const vertexes = adjacencyList.reduce((acc: Set, v: Set) => { + return new Set([...acc].concat([...v])); + }, new Set(adjacencyList.keys())); + + const dag = new DiGraph(vertexes.size); + + for (let from = 0; from < adjacencyList.length; from++) { + const toSet = adjacencyList[from]; + + for (const to of toSet) { + dag.addEdge(from, to); + } + } + + const ts = new TopologicalSort(dag); + const order = ts.order(); + + return order; +} diff --git a/packages/core/src/single-graph/validation/validateRecipeGraph.ts b/packages/core/src/single-graph/validation/validateRecipeGraph.ts new file mode 100644 index 0000000000..990d6f6e56 --- /dev/null +++ b/packages/core/src/single-graph/validation/validateRecipeGraph.ts @@ -0,0 +1,16 @@ +import { IRecipeGraph } from "../types/recipeGraph"; + +export type ValidateRecipeGraphResult = + | { + _kind: "success"; + } + | { + _kind: "failure"; + failures: [string, Error[]]; + }; + +export function validateRecipeGraph( + _recipeGraph: IRecipeGraph +): ValidateRecipeGraphResult { + return { _kind: "success" }; +} diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index bb4864cdc7..b68f6f0c44 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -17,7 +17,7 @@ import type { describe("Recipes", function () { describe("single contract", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { @@ -26,38 +26,42 @@ describe("Recipes", function () { return { example }; }); - depGraph = generateRecipeGraphFrom(singleRecipe, { chainId: 31337 }); + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have one node", () => { - assert.equal(depGraph.size(), 1); + assert.equal(recipeGraph.vertexSize(), 1); }); it("should have the contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Example"); + const depNode = recipeGraph.getRecipeVertexByLabel("Example"); assert.isDefined(depNode); assert.equal(depNode?.label, "Example"); }); it("should show no dependencies for the contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Example"); + const depNode = recipeGraph.getRecipeVertexByLabel("Example"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node as empty", () => { - const depNode = depGraph.getDepNodeByLabel("Example"); + const depNode = recipeGraph.getRecipeVertexByLabel("Example"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -72,7 +76,7 @@ describe("Recipes", function () { }); describe("two unrelated contracts", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const twoContractsRecipe = buildRecipe( @@ -85,56 +89,58 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(twoContractsRecipe, { + const { graph } = generateRecipeGraphFrom(twoContractsRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have two nodes", () => { - assert.equal(depGraph.size(), 2); + assert.equal(recipeGraph.vertexSize(), 2); }); it("should have both contract nodes", () => { - const depNode1 = depGraph.getDepNodeByLabel("Example1"); + const depNode1 = recipeGraph.getRecipeVertexByLabel("Example1"); assert.isDefined(depNode1); assert.equal(depNode1?.label, "Example1"); - const depNode2 = depGraph.getDepNodeByLabel("Example2"); + const depNode2 = recipeGraph.getRecipeVertexByLabel("Example2"); assert.isDefined(depNode2); assert.equal(depNode2?.label, "Example2"); }); it("should show no dependencies either contract node", () => { - const depNode1 = depGraph.getDepNodeByLabel("Example1"); + const depNode1 = recipeGraph.getRecipeVertexByLabel("Example1"); if (depNode1 === undefined) { return assert.isDefined(depNode1); } - const deps1 = depGraph.getDependenciesFor(depNode1); + const deps1 = recipeGraph.getDependenciesForVertex(depNode1); assert.deepStrictEqual(deps1, []); - const depNode2 = depGraph.getDepNodeByLabel("Example2"); + const depNode2 = recipeGraph.getRecipeVertexByLabel("Example2"); if (depNode2 === undefined) { return assert.isDefined(depNode1); } - const deps2 = depGraph.getDependenciesFor(depNode2); + const deps2 = recipeGraph.getDependenciesForVertex(depNode2); assert.deepStrictEqual(deps2, []); }); }); describe("contract with constructor args", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const withConstructorArgsRecipe = buildRecipe( @@ -148,40 +154,42 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(withConstructorArgsRecipe, { + const { graph } = generateRecipeGraphFrom(withConstructorArgsRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have one node", () => { - assert.equal(depGraph.size(), 1); + assert.equal(recipeGraph.vertexSize(), 1); }); it("should have the contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); assert.isDefined(depNode); assert.equal(depNode?.label, "Token"); }); it("should show no dependencies for the contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -196,7 +204,7 @@ describe("Recipes", function () { }); describe("dependencies between contracts", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const depsBetweenContractsRecipe = buildRecipe( @@ -212,21 +220,23 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(depsBetweenContractsRecipe, { + const { graph } = generateRecipeGraphFrom(depsBetweenContractsRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have two nodes", () => { - assert.equal(depGraph.size(), 2); + assert.equal(recipeGraph.vertexSize(), 2); }); it("should have the contract node A", () => { - const depNode = depGraph.getDepNodeByLabel("A"); + const depNode = recipeGraph.getRecipeVertexByLabel("A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -236,7 +246,7 @@ describe("Recipes", function () { }); it("should have the contract node B", () => { - const depNode = depGraph.getDepNodeByLabel("B"); + const depNode = recipeGraph.getRecipeVertexByLabel("B"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -247,31 +257,31 @@ describe("Recipes", function () { }); it("should show no dependencies for the contract node A", () => { - const depNode = depGraph.getDepNodeByLabel("A"); + const depNode = recipeGraph.getRecipeVertexByLabel("A"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should show one dependency on A for the contract node B", () => { - const depNode = depGraph.getDepNodeByLabel("B"); + const depNode = recipeGraph.getRecipeVertexByLabel("B"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); - assert.deepStrictEqual(deps, [{ id: 1, label: "A" }]); + assert.deepStrictEqual(deps, [{ id: 0, label: "A" }]); }); it("should record the argument list for the contract node A as empty", () => { - const depNode = depGraph.getDepNodeByLabel("A"); + const depNode = recipeGraph.getRecipeVertexByLabel("A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -286,7 +296,7 @@ describe("Recipes", function () { }); describe("make a call on a contract", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const callRecipe = buildRecipe("call", (m: IRecipeGraphBuilder) => { @@ -300,21 +310,23 @@ describe("Recipes", function () { return {}; }); - depGraph = generateRecipeGraphFrom(callRecipe, { + const { graph } = generateRecipeGraphFrom(callRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have three nodes", () => { - assert.equal(depGraph.size(), 3); + assert.equal(recipeGraph.vertexSize(), 3); }); it("should have the contract node Token", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -324,7 +336,7 @@ describe("Recipes", function () { }); it("should have the contract node Exchange", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -335,7 +347,7 @@ describe("Recipes", function () { }); it("should have the call node Exchange/addToken", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -346,49 +358,49 @@ describe("Recipes", function () { }); it("should show no dependencies for the contract node Token", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should show no dependencies for the contract node Exchange", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should show two dependencies for the call node Exchange/addToken", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, [ { - id: 1, + id: 0, label: "Token", }, - { id: 2, label: "Exchange" }, + { id: 1, label: "Exchange" }, ]); }); it("should record the argument list for the contract node Token as empty", () => { - const depNode = depGraph.getDepNodeByLabel("Token"); + const depNode = recipeGraph.getRecipeVertexByLabel("Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -402,7 +414,7 @@ describe("Recipes", function () { }); it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -416,7 +428,7 @@ describe("Recipes", function () { }); it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = depGraph.getDepNodeByLabel("Exchange/addToken"); + const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -428,7 +440,7 @@ describe("Recipes", function () { assert.deepStrictEqual(depNode.args, [ { - id: 1, + id: 0, label: "Token", type: "contract", subtype: "hardhat", @@ -439,7 +451,7 @@ describe("Recipes", function () { }); describe("existing contract", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const uniswapRecipe = buildRecipe("Uniswap", (m: IRecipeGraphBuilder) => { @@ -449,21 +461,23 @@ describe("Recipes", function () { return { uniswap }; }); - depGraph = generateRecipeGraphFrom(uniswapRecipe, { + const { graph } = generateRecipeGraphFrom(uniswapRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have one node", () => { - assert.equal(depGraph.size(), 1); + assert.equal(recipeGraph.vertexSize(), 1); }); it("should have the deployed contract node", () => { - const depNode = depGraph.getDepNodeByLabel("UniswapRouter"); + const depNode = recipeGraph.getRecipeVertexByLabel("UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -474,20 +488,20 @@ describe("Recipes", function () { }); it("should show no dependencies for the deployed contract node", () => { - const depNode = depGraph.getDepNodeByLabel("UniswapRouter"); + const depNode = recipeGraph.getRecipeVertexByLabel("UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); }); describe("deploying a contract from an artifact", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; @@ -503,21 +517,23 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(fromArtifactRecipe, { + const { graph } = generateRecipeGraphFrom(fromArtifactRecipe, { chainId: 31337, }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have one node", () => { - assert.equal(depGraph.size(), 1); + assert.equal(recipeGraph.vertexSize(), 1); }); it("should have the artifact contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Foo"); + const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -528,19 +544,19 @@ describe("Recipes", function () { }); it("should show no dependencies for the artifact contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Foo"); + const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the artifact contract node", () => { - const depNode = depGraph.getDepNodeByLabel("Foo"); + const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -555,7 +571,7 @@ describe("Recipes", function () { }); describe("libraries", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const librariesRecipe = buildRecipe( @@ -575,19 +591,23 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(librariesRecipe, { chainId: 31 }); + const { graph } = generateRecipeGraphFrom(librariesRecipe, { + chainId: 31, + }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have two nodes", () => { - assert.equal(depGraph.size(), 2); + assert.equal(recipeGraph.vertexSize(), 2); }); it("should have the library node SafeMath", () => { - const depNode = depGraph.getDepNodeByLabel("SafeMath"); + const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -598,7 +618,7 @@ describe("Recipes", function () { }); it("should have the contract node Contract", () => { - const depNode = depGraph.getDepNodeByLabel("Contract"); + const depNode = recipeGraph.getRecipeVertexByLabel("Contract"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -609,31 +629,31 @@ describe("Recipes", function () { }); it("should show no dependencies for the library node SafeMath", () => { - const depNode = depGraph.getDepNodeByLabel("SafeMath"); + const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); assert.deepStrictEqual(deps, []); }); it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = depGraph.getDepNodeByLabel("Contract"); + const depNode = recipeGraph.getRecipeVertexByLabel("Contract"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = depGraph.getDependenciesFor(depNode); + const deps = recipeGraph.getDependenciesForVertex(depNode); - assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath" }]); + assert.deepStrictEqual(deps, [{ id: 0, label: "SafeMath" }]); }); it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = depGraph.getDepNodeByLabel("SafeMath"); + const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -664,7 +684,7 @@ describe("Recipes", function () { }); describe("recipe parameters", () => { - let depGraph: IRecipeGraph; + let recipeGraph: IRecipeGraph; before(() => { const librariesRecipe = buildRecipe( @@ -680,15 +700,19 @@ describe("Recipes", function () { } ); - depGraph = generateRecipeGraphFrom(librariesRecipe, { chainId: 31 }); + const { graph } = generateRecipeGraphFrom(librariesRecipe, { + chainId: 31, + }); + + recipeGraph = graph; }); it("should create a graph", () => { - assert.isDefined(depGraph); + assert.isDefined(recipeGraph); }); it("should have one node", () => { - assert.equal(depGraph.size(), 1); + assert.equal(recipeGraph.vertexSize(), 1); }); }); }); diff --git a/packages/core/test/single-graph/utils/adjacencyList.ts b/packages/core/test/single-graph/utils/adjacencyList.ts new file mode 100644 index 0000000000..fc9c32f651 --- /dev/null +++ b/packages/core/test/single-graph/utils/adjacencyList.ts @@ -0,0 +1,59 @@ +import { assert } from "chai"; + +import { + constructEmptyAdjacencyList, + addEdge, + getDependenciesFor, + clone, + topologicalSort, +} from "../../../src/single-graph/utils/adjacencyList"; + +describe("Adjacency list", () => { + it("should allow looking up deps for a two node graph", () => { + const adjacencyList = constructEmptyAdjacencyList(); + + addEdge(adjacencyList, { from: 0, to: 1 }); + + assert.deepStrictEqual(getDependenciesFor(adjacencyList, 1), [0]); + }); + + it("should allow looking up single deps for a three node graph", () => { + const adjacencyList = constructEmptyAdjacencyList(); + + addEdge(adjacencyList, { from: 0, to: 1 }); + addEdge(adjacencyList, { from: 1, to: 2 }); + + assert.deepStrictEqual(getDependenciesFor(adjacencyList, 2), [1]); + }); + + it("should allow looking up multiple deps for a three node graph", () => { + const adjacencyList = constructEmptyAdjacencyList(); + + addEdge(adjacencyList, { from: 0, to: 2 }); + addEdge(adjacencyList, { from: 1, to: 2 }); + + assert.deepStrictEqual(getDependenciesFor(adjacencyList, 2), [0, 1]); + }); + + it("should be clonable", () => { + const adjacencyList = constructEmptyAdjacencyList(); + + addEdge(adjacencyList, { from: 0, to: 2 }); + addEdge(adjacencyList, { from: 1, to: 2 }); + + const clonedList = clone(adjacencyList); + + assert.deepStrictEqual(clonedList, adjacencyList); + }); + + it("should do a topological sort", () => { + const adjacencyList = constructEmptyAdjacencyList(); + + addEdge(adjacencyList, { from: 0, to: 2 }); + addEdge(adjacencyList, { from: 1, to: 2 }); + + const order = topologicalSort(adjacencyList); + + assert.deepStrictEqual(order, [1, 0, 2]); + }); +}); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index ab19ed125f..9922227437 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -36,6 +36,47 @@ export class IgnitionWrapper { }); } + public async deploySingleGraph(recipe: any, _options: any) { + const [deploymentResult] = await this._ignition.deploySingleGraph(recipe); + + if (deploymentResult._kind === "hold") { + const [recipeId, holdReason] = deploymentResult.holds; + throw new Error(`Execution held for recipe '${recipeId}': ${holdReason}`); + } + + if (deploymentResult._kind === "failure") { + const [recipeId, failures] = deploymentResult.failures; + + let failuresMessage = ""; + for (const failure of failures) { + failuresMessage += ` - ${failure.message}\n`; + } + + throw new Error( + `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` + ); + } + + const resolvedOutput: any = {}; + for (const [key, serializedFutureResult] of Object.entries( + deploymentResult.result + )) { + if ( + serializedFutureResult._kind === "string" || + serializedFutureResult._kind === "number" + ) { + resolvedOutput[key] = serializedFutureResult; + } else if (serializedFutureResult._kind === "tx") { + resolvedOutput[key] = serializedFutureResult.value.hash; + } else { + const { abi, address } = serializedFutureResult.value; + resolvedOutput[key] = await this._ethers.getContractAt(abi, address); + } + } + + return resolvedOutput; + } + public async deploy( userRecipeOrName: UserRecipe | string, deployParams?: { parameters: { [key: string]: ParamValue } } diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 3a8836c7dd..f13237348a 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -25,6 +25,10 @@ contract UsesContract { constructor(address _contract) { contractAddress = _contract; } + + function setAddress(address _contract) public { + contractAddress = _contract; + } } contract Greeter { diff --git a/packages/hardhat-plugin/test/single-graph.ts b/packages/hardhat-plugin/test/single-graph.ts new file mode 100644 index 0000000000..c26f490a18 --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph.ts @@ -0,0 +1,101 @@ +import { + buildRecipeSingleGraph, + IRecipeGraphBuilder, + FutureDict, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlocks } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("single graph version", () => { + useEnvironment("minimal"); + + it("should be able to deploy a contract", async function () { + const result = await deployRecipe(this.hre, (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + assert.isDefined(result); + + const x = await result.foo.x(); + + assert.equal(x, Number(1)); + }); + + it("should be able to deploy a contract with arguments", async function () { + const result = await deployRecipe(this.hre, (m) => { + const greeter = m.contract("Greeter", { + args: ["Hello World"], + }); + + return { greeter }; + }); + + assert.isDefined(result); + + const greeting = await result.greeter.getGreeting(); + + assert.equal(greeting, "Hello World"); + }); + + it("should be able to deploy contracts with dependencies", async function () { + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); + + it("should be able to call contracts", async function () { + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); +}); + +async function deployRecipe( + hre: any, + recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict, + options?: { parameters: {} } +): Promise { + await hre.run("compile", { quiet: true }); + + const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); + + const deployPromise = hre.ignition.deploySingleGraph(userRecipe, options); + + await mineBlocks(hre, [1, 1, 1], deployPromise); + + const result = await deployPromise; + + return result; +} From 09ba268b53aa244c6e521380225f95adf5ecfa2e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 18 Aug 2022 17:31:27 +0100 Subject: [PATCH 0046/1302] refactor: add example plan command --- packages/core/src/Ignition.ts | 33 +++++++++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 9 ++++ .../execute.ts} | 4 +- .../hardhat-plugin/test/single-graph/plan.ts | 46 +++++++++++++++++++ 4 files changed, 90 insertions(+), 2 deletions(-) rename packages/hardhat-plugin/test/{single-graph.ts => single-graph/execute.ts} (96%) create mode 100644 packages/hardhat-plugin/test/single-graph/plan.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 708f0fb544..2d1b5df4fb 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -153,6 +153,39 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } + public async planSingleGraph(recipe: any) { + log(`Start deploy`); + + const chainId = await this._getChainId(); + + const { graph: recipeGraph } = generateRecipeGraphFrom(recipe, { chainId }); + + const validationResult = validateRecipeGraph(recipeGraph); + + if (validationResult._kind === "failure") { + return [validationResult, {}]; + } + + const serviceOptions = { + providers: this._providers, + journal: new InMemoryJournal(), + txPollingInterval: 300, + }; + + const transformResult = await transformRecipeGraphToExecutionGraph( + recipeGraph, + serviceOptions + ); + + if (transformResult._kind === "failure") { + return [transformResult, {}]; + } + + const { executionGraph } = transformResult; + + return executionGraph; + } + private async _getChainId(): Promise { const result = await this._providers.ethereumProvider.request({ method: "eth_chainId", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 9922227437..98a20af16c 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -77,6 +77,15 @@ export class IgnitionWrapper { return resolvedOutput; } + public async planSingleGraph(recipe: any) { + const plan = await this._ignition.planSingleGraph(recipe); + + console.log(plan); + + // better display needed ... + return JSON.stringify(plan); + } + public async deploy( userRecipeOrName: UserRecipe | string, deployParams?: { parameters: { [key: string]: ParamValue } } diff --git a/packages/hardhat-plugin/test/single-graph.ts b/packages/hardhat-plugin/test/single-graph/execute.ts similarity index 96% rename from packages/hardhat-plugin/test/single-graph.ts rename to packages/hardhat-plugin/test/single-graph/execute.ts index c26f490a18..66b37cd053 100644 --- a/packages/hardhat-plugin/test/single-graph.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -5,8 +5,8 @@ import { } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { mineBlocks } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { mineBlocks } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; describe("single graph version", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/plan.ts b/packages/hardhat-plugin/test/single-graph/plan.ts new file mode 100644 index 0000000000..fea186cce6 --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/plan.ts @@ -0,0 +1,46 @@ +import { + buildRecipeSingleGraph, + IRecipeGraphBuilder, + FutureDict, +} from "@nomicfoundation/ignition-core"; + +import { mineBlocks } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("single graph version", () => { + useEnvironment("minimal"); + + it("should be able to deploy a contract", async function () { + const result = await plan(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + console.log(result); + }); +}); + +async function plan( + hre: any, + recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict +): Promise { + await hre.run("compile", { quiet: true }); + + const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); + + const planPromise = hre.ignition.planSingleGraph(userRecipe); + + await mineBlocks(hre, [1, 1, 1], planPromise); + + const result = await planPromise; + + return result; +} From 83c3e06d9683a5203ad18d66ec44605cea57601d Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 Aug 2022 10:39:42 +0100 Subject: [PATCH 0047/1302] refactor: add support for deployed contract --- .../src/single-graph/execution/execute.ts | 17 ++++++++ .../transformRecipeGraphToExecutionGraph.ts | 17 ++++++++ .../single-graph/recipe/RecipeGraphBuilder.ts | 4 +- .../src/single-graph/types/executionGraph.ts | 10 ++++- .../src/single-graph/types/recipeGraph.ts | 4 +- .../hardhat-plugin/src/ignition-wrapper.ts | 7 ++-- .../test/single-graph/execute.ts | 42 +++++++++++++++++++ 7 files changed, 93 insertions(+), 8 deletions(-) diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index af188e862e..1b77026f9d 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -5,6 +5,7 @@ import { ArgValue, ContractCall, ContractDeploy, + DeployedContract, ExecutionVertex, IExecutionGraph, } from "../types/executionGraph"; @@ -49,6 +50,11 @@ export async function execute( ...services, context, }); + case "DeployedContract": + return executeDeployedContract(executionVertex, { + ...services, + context, + }); case "ContractCall": return executeContractCall(executionVertex, { ...services, @@ -117,6 +123,17 @@ async function executeContractDeploy( }; } +async function executeDeployedContract( + { label, address, abi }: DeployedContract, + _services: Services & { context: Map } +): Promise { + return { + name: label, + abi, + address, + }; +} + async function executeContractCall( { method, contract, args }: ContractCall, services: Services & { context: Map } diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts index f9503f2486..48b0b707df 100644 --- a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts @@ -5,11 +5,13 @@ import { Artifact } from "../../types"; import { ContractCall, ContractDeploy, + DeployedContract, ExecutionVertex, IExecutionGraph, } from "../types/executionGraph"; import { CallRecipeVertex, + DeployedContractRecipeVertex, HardhatContractRecipeVertex, IRecipeGraph, RecipeVertex, @@ -57,6 +59,8 @@ function convertRecipeVertexToExecutionVertex( switch (recipeVertex.type) { case "HardhatContract": return convertHardhatContractToContractDeploy(recipeVertex, services); + case "DeployedContract": + return convertDeployedContractToDeployedDeploy(recipeVertex, services); case "Call": return convertCallToContractCall(recipeVertex, services); default: @@ -82,6 +86,19 @@ async function convertHardhatContractToContractDeploy( }; } +async function convertDeployedContractToDeployedDeploy( + deployedContractRecipeVertex: DeployedContractRecipeVertex, + _services: Services +): Promise { + return { + type: "DeployedContract", + id: deployedContractRecipeVertex.id, + label: deployedContractRecipeVertex.label, + address: deployedContractRecipeVertex.address, + abi: deployedContractRecipeVertex.abi, + }; +} + async function convertCallToContractCall( callRecipeVertex: CallRecipeVertex, _services: Services diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 4c344e6ee0..53a150fbbb 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -129,7 +129,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { public contractAt( contractName: string, - bytecode: string, + address: string, abi: any[] ): DeployedContract { const deployedFuture: DeployedContract = { @@ -144,7 +144,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { id: deployedFuture.id, label: contractName, type: "DeployedContract", - bytecode, + address, abi, }); diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts index 1c03a3114c..8288e9d0b6 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -13,6 +13,14 @@ export interface ContractDeploy { args: ArgValue[]; } +export interface DeployedContract { + type: "DeployedContract"; + id: number; + label: string; + address: string; + abi: any[]; +} + export interface ContractCall { type: "ContractCall"; id: number; @@ -22,7 +30,7 @@ export interface ContractCall { args: ArgValue[]; } -export type ExecutionVertex = ContractDeploy | ContractCall; +export type ExecutionVertex = ContractDeploy | DeployedContract | ContractCall; export interface IExecutionGraph { adjacencyList: AdjacencyList; diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 55e0f2b5ee..b887bbe432 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -38,7 +38,7 @@ export interface DeployedContractRecipeVertex { id: number; type: "DeployedContract"; label: string; - bytecode: string; + address: string; abi: any[]; } @@ -107,7 +107,7 @@ export interface IRecipeGraphBuilder { contractAt: ( contractName: string, - bytecode: string, + address: string, abi: any[] ) => DeployedContract; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 98a20af16c..b54e9e0886 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -70,7 +70,10 @@ export class IgnitionWrapper { resolvedOutput[key] = serializedFutureResult.value.hash; } else { const { abi, address } = serializedFutureResult.value; - resolvedOutput[key] = await this._ethers.getContractAt(abi, address); + + const contract: any = await this._ethers.getContractAt(abi, address); + contract.abi = abi; + resolvedOutput[key] = contract; } } @@ -80,8 +83,6 @@ export class IgnitionWrapper { public async planSingleGraph(recipe: any) { const plan = await this._ignition.planSingleGraph(recipe); - console.log(plan); - // better display needed ... return JSON.stringify(plan); } diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index 66b37cd053..af3f07863c 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -80,6 +80,48 @@ describe("single graph version", () => { assert.equal(usedAddress, result.bar.address); }); + + it("should be able to use an existing contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const firstResult = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(firstResult.bar.address); + assert.isDefined(firstResult.usesContract.address); + const barAddress: string = firstResult.bar.address; + const barAbi: any[] = firstResult.bar.abi; + const usesContractAddress: string = firstResult.usesContract.address; + const usesContractAbi: any[] = firstResult.usesContract.abi; + + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contractAt("Bar", barAddress, barAbi); + const usesContract = m.contractAt( + "UsesContract", + usesContractAddress, + usesContractAbi + ); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); }); async function deployRecipe( From bf1756ca703fdcd10c4dd63df5598d822f6a0b4b Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 Aug 2022 11:12:43 +0100 Subject: [PATCH 0048/1302] refactor: add support for deploy from artifact --- .../transformRecipeGraphToExecutionGraph.ts | 16 +++++++++++++++ .../single-graph/recipe/RecipeGraphBuilder.ts | 2 ++ .../src/single-graph/types/recipeGraph.ts | 1 + .../test/single-graph/execute.ts | 20 +++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts index 48b0b707df..9ccee2a433 100644 --- a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts @@ -10,6 +10,7 @@ import { IExecutionGraph, } from "../types/executionGraph"; import { + ArtifactContractRecipeVertex, CallRecipeVertex, DeployedContractRecipeVertex, HardhatContractRecipeVertex, @@ -59,6 +60,8 @@ function convertRecipeVertexToExecutionVertex( switch (recipeVertex.type) { case "HardhatContract": return convertHardhatContractToContractDeploy(recipeVertex, services); + case "ArtifactContract": + return convertArtifactContractToContractDeploy(recipeVertex, services); case "DeployedContract": return convertDeployedContractToDeployedDeploy(recipeVertex, services); case "Call": @@ -86,6 +89,19 @@ async function convertHardhatContractToContractDeploy( }; } +async function convertArtifactContractToContractDeploy( + vertex: ArtifactContractRecipeVertex, + _services: Services +): Promise { + return { + type: "ContractDeploy", + id: vertex.id, + label: vertex.label, + artifact: vertex.artifact, + args: vertex.args, + }; +} + async function convertDeployedContractToDeployedDeploy( deployedContractRecipeVertex: DeployedContractRecipeVertex, _services: Services diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 53a150fbbb..937f55c794 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -84,6 +84,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { givenOptions?: ContractOptions ): HardhatContract | ArtifactContract { if (isArtifact(artifactOrOptions)) { + const artifact = artifactOrOptions; const options: ContractOptions | undefined = givenOptions; const artifactContractFuture: ArtifactContract = { @@ -98,6 +99,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { id: artifactContractFuture.id, label: contractName, type: "ArtifactContract", + artifact, args: options?.args ?? [], libraries: options?.libraries ?? {}, }); diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index b887bbe432..faa9f38a12 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -30,6 +30,7 @@ export interface ArtifactContractRecipeVertex { id: number; type: "ArtifactContract"; label: string; + artifact: Artifact; args: Array; libraries: LibraryMap; } diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index af3f07863c..e142838f42 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -122,6 +122,26 @@ describe("single graph version", () => { assert.equal(usedAddress, result.bar.address); }); + + it("should be able to use an artifact to deploy a contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const artifact = await this.hre.artifacts.readArtifact("Greeter"); + + const result = await deployRecipe(this.hre, (m) => { + const greeter = m.contract("Greeter", artifact, { + args: ["Hello World"], + }); + + return { greeter }; + }); + + assert.isDefined(result); + + const greeting = await result.greeter.getGreeting(); + + assert.equal(greeting, "Hello World"); + }); }); async function deployRecipe( From 5139c72fe5b08c832c97cd24bedc875077c887a9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 Aug 2022 12:08:52 +0100 Subject: [PATCH 0049/1302] refactor: add support for hardhat based libraries --- .../src/single-graph/execution/execute.ts | 44 ++++++++++++-- .../transformRecipeGraphToExecutionGraph.ts | 57 +++++++++++++------ .../single-graph/recipe/RecipeGraphBuilder.ts | 1 + .../src/single-graph/types/executionGraph.ts | 16 +++++- .../src/single-graph/types/recipeGraph.ts | 3 +- .../test/single-graph/execute.ts | 30 ++++++++++ 6 files changed, 127 insertions(+), 24 deletions(-) diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index 1b77026f9d..66064a6264 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -8,6 +8,7 @@ import { DeployedContract, ExecutionVertex, IExecutionGraph, + LibraryDeploy, } from "../types/executionGraph"; import { isFuture } from "../types/guards"; import { topologicalSort } from "../utils/adjacencyList"; @@ -60,6 +61,11 @@ export async function execute( ...services, context, }); + case "LibraryDeploy": + return executeLibraryDeploy(executionVertex, { + ...services, + context, + }); default: return assertUnknownExecutionVertexType(executionVertex); } @@ -104,14 +110,22 @@ function topological(executionGraph: IExecutionGraph): number[] { } async function executeContractDeploy( - { artifact, args }: ContractDeploy, + { artifact, args, libraries }: ContractDeploy, services: Services & { context: Map } ): Promise { - const resolvedArgs = args - .map(resolveFromContext(services.context)) - .map(toAddress); + const resolve = resolveFromContext(services.context); - const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + const resolvedArgs = args.map(resolve).map(toAddress); + + const resolvedLibraries = Object.fromEntries( + Object.entries(libraries ?? {}).map(([k, v]) => [k, toAddress(resolve(v))]) + ); + + const txHash = await services.contracts.deploy( + artifact, + resolvedArgs, + resolvedLibraries + ); const receipt = await services.transactions.wait(txHash); @@ -134,6 +148,26 @@ async function executeDeployedContract( }; } +async function executeLibraryDeploy( + { artifact, args }: LibraryDeploy, + services: Services & { context: Map } +): Promise { + const resolvedArgs = args + .map(resolveFromContext(services.context)) + .map(toAddress); + + const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + + const receipt = await services.transactions.wait(txHash); + + return { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }; +} + async function executeContractCall( { method, contract, args }: ContractCall, services: Services & { context: Map } diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts index 9ccee2a433..314fddca52 100644 --- a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts @@ -8,12 +8,14 @@ import { DeployedContract, ExecutionVertex, IExecutionGraph, + LibraryDeploy, } from "../types/executionGraph"; import { ArtifactContractRecipeVertex, CallRecipeVertex, DeployedContractRecipeVertex, HardhatContractRecipeVertex, + HardhatLibraryRecipeVertex, IRecipeGraph, RecipeVertex, } from "../types/recipeGraph"; @@ -66,26 +68,29 @@ function convertRecipeVertexToExecutionVertex( return convertDeployedContractToDeployedDeploy(recipeVertex, services); case "Call": return convertCallToContractCall(recipeVertex, services); + case "HardhatLibrary": + return convertHardhatLibraryToLibraryDeploy(recipeVertex, services); default: - throw new Error(`Type note expected: ${recipeVertex.type}`); + throw new Error(`Type not expected: ${recipeVertex.type}`); } }; } async function convertHardhatContractToContractDeploy( - hardhatContractRecipeVertex: HardhatContractRecipeVertex, + vertex: HardhatContractRecipeVertex, services: Services ): Promise { const artifact: Artifact = await services.artifacts.getArtifact( - hardhatContractRecipeVertex.contractName + vertex.contractName ); return { type: "ContractDeploy", - id: hardhatContractRecipeVertex.id, - label: hardhatContractRecipeVertex.label, + id: vertex.id, + label: vertex.label, artifact, - args: hardhatContractRecipeVertex.args, + args: vertex.args, + libraries: vertex.libraries, }; } @@ -99,33 +104,51 @@ async function convertArtifactContractToContractDeploy( label: vertex.label, artifact: vertex.artifact, args: vertex.args, + libraries: vertex.libraries, }; } async function convertDeployedContractToDeployedDeploy( - deployedContractRecipeVertex: DeployedContractRecipeVertex, + vertex: DeployedContractRecipeVertex, _services: Services ): Promise { return { type: "DeployedContract", - id: deployedContractRecipeVertex.id, - label: deployedContractRecipeVertex.label, - address: deployedContractRecipeVertex.address, - abi: deployedContractRecipeVertex.abi, + id: vertex.id, + label: vertex.label, + address: vertex.address, + abi: vertex.abi, }; } async function convertCallToContractCall( - callRecipeVertex: CallRecipeVertex, + vertex: CallRecipeVertex, _services: Services ): Promise { return { type: "ContractCall", - id: callRecipeVertex.id, - label: callRecipeVertex.label, + id: vertex.id, + label: vertex.label, - contract: callRecipeVertex.contract, - method: callRecipeVertex.method, - args: callRecipeVertex.args, + contract: vertex.contract, + method: vertex.method, + args: vertex.args, + }; +} + +async function convertHardhatLibraryToLibraryDeploy( + hardhatLibraryRecipeVertex: HardhatLibraryRecipeVertex, + services: Services +): Promise { + const artifact: Artifact = await services.artifacts.getArtifact( + hardhatLibraryRecipeVertex.libraryName + ); + + return { + type: "LibraryDeploy", + id: hardhatLibraryRecipeVertex.id, + label: hardhatLibraryRecipeVertex.label, + artifact, + args: hardhatLibraryRecipeVertex.args, }; } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 937f55c794..8b2de01f9e 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -71,6 +71,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { id: libraryFuture.id, label: libraryName, type: "HardhatLibrary", + libraryName, args: options?.args ?? [], }); diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts index 8288e9d0b6..4d230a6fbd 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -2,6 +2,7 @@ import { AdjacencyList } from "../utils/adjacencyList"; import { RecipeFuture } from "./future"; import { Artifact } from "./hardhat"; +import { LibraryMap } from "./recipeGraph"; export type ArgValue = string | number | RecipeFuture; @@ -11,6 +12,7 @@ export interface ContractDeploy { label: string; artifact: Artifact; args: ArgValue[]; + libraries: LibraryMap; } export interface DeployedContract { @@ -21,6 +23,14 @@ export interface DeployedContract { abi: any[]; } +export interface LibraryDeploy { + type: "LibraryDeploy"; + id: number; + label: string; + artifact: Artifact; + args: ArgValue[]; +} + export interface ContractCall { type: "ContractCall"; id: number; @@ -30,7 +40,11 @@ export interface ContractCall { args: ArgValue[]; } -export type ExecutionVertex = ContractDeploy | DeployedContract | ContractCall; +export type ExecutionVertex = + | ContractDeploy + | DeployedContract + | LibraryDeploy + | ContractCall; export interface IExecutionGraph { adjacencyList: AdjacencyList; diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index faa9f38a12..303ea2fd0d 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -13,7 +13,7 @@ import { } from "./future"; import { Artifact } from "./hardhat"; -interface LibraryMap { +export interface LibraryMap { [key: string]: RecipeFuture; } @@ -46,6 +46,7 @@ export interface DeployedContractRecipeVertex { export interface HardhatLibraryRecipeVertex { id: number; type: "HardhatLibrary"; + libraryName: string; label: string; args: Array; } diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index e142838f42..614bdd6aba 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -142,6 +142,36 @@ describe("single graph version", () => { assert.equal(greeting, "Hello World"); }); + + it("should be able to deploy a contract that depends on a library", async function () { + await this.hre.run("compile", { quiet: true }); + + const result = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.library("RubbishMath"); + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + assert.isDefined(result); + const math = result.rubbishMath; + const contractThatDependsOnLib = result.dependsOnLib; + + const addition = await math.add(1, 2); + assert.equal(addition, 3); + + const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( + 1, + 2, + 3 + ); + + assert.equal(libBasedAddtion, 6); + }); }); async function deployRecipe( From 0d7328432eed59acb3111c691e5c48d184b1f5d5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 Aug 2022 12:34:36 +0100 Subject: [PATCH 0050/1302] refactor: add library support from artifacts --- .../transformRecipeGraphToExecutionGraph.ts | 30 ++++++++++++++-- .../single-graph/recipe/RecipeGraphBuilder.ts | 2 ++ .../src/single-graph/types/recipeGraph.ts | 1 + .../test/single-graph/execute.ts | 36 ++++++++++++++++++- 4 files changed, 66 insertions(+), 3 deletions(-) diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts index 314fddca52..ad15a883e8 100644 --- a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts @@ -12,6 +12,7 @@ import { } from "../types/executionGraph"; import { ArtifactContractRecipeVertex, + ArtifactLibraryRecipeVertex, CallRecipeVertex, DeployedContractRecipeVertex, HardhatContractRecipeVertex, @@ -58,7 +59,7 @@ export async function transformRecipeGraphToExecutionGraph( function convertRecipeVertexToExecutionVertex( services: Services ): (recipeVertex: RecipeVertex) => Promise { - return (recipeVertex: RecipeVertex) => { + return (recipeVertex: RecipeVertex): Promise => { switch (recipeVertex.type) { case "HardhatContract": return convertHardhatContractToContractDeploy(recipeVertex, services); @@ -70,8 +71,10 @@ function convertRecipeVertexToExecutionVertex( return convertCallToContractCall(recipeVertex, services); case "HardhatLibrary": return convertHardhatLibraryToLibraryDeploy(recipeVertex, services); + case "ArtifactLibrary": + return convertArtifactLibraryToLibraryDeploy(recipeVertex, services); default: - throw new Error(`Type not expected: ${recipeVertex.type}`); + return assertRecipeVertexNotExpected(recipeVertex); } }; } @@ -152,3 +155,26 @@ async function convertHardhatLibraryToLibraryDeploy( args: hardhatLibraryRecipeVertex.args, }; } + +async function convertArtifactLibraryToLibraryDeploy( + vertex: ArtifactLibraryRecipeVertex, + _services: Services +): Promise { + return { + type: "LibraryDeploy", + id: vertex.id, + label: vertex.label, + artifact: vertex.artifact, + args: vertex.args, + }; +} + +function assertRecipeVertexNotExpected( + vertex: never +): Promise { + const v: any = vertex; + + const obj = typeof v === "object" && "type" in v ? v.type : v; + + throw new Error(`Type not expected: ${obj}`); +} diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 8b2de01f9e..950a870841 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -38,6 +38,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { givenOptions?: ContractOptions | undefined ): HardhatLibrary | ArtifactLibrary { if (isArtifact(artifactOrOptions)) { + const artifact = artifactOrOptions; const options: ContractOptions | undefined = givenOptions; const artifactContractFuture: ArtifactLibrary = { @@ -52,6 +53,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { id: artifactContractFuture.id, label: libraryName, type: "ArtifactLibrary", + artifact, args: options?.args ?? [], }); diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 303ea2fd0d..a947f7408c 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -55,6 +55,7 @@ export interface ArtifactLibraryRecipeVertex { id: number; type: "ArtifactLibrary"; label: string; + artifact: Artifact; args: Array; } diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index 614bdd6aba..fc0752ed4c 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -143,7 +143,7 @@ describe("single graph version", () => { assert.equal(greeting, "Hello World"); }); - it("should be able to deploy a contract that depends on a library", async function () { + it("should be able to deploy a contract that depends on a hardhat library", async function () { await this.hre.run("compile", { quiet: true }); const result = await deployRecipe(this.hre, (m) => { @@ -172,6 +172,40 @@ describe("single graph version", () => { assert.equal(libBasedAddtion, 6); }); + + it("should be able to deploy a contract that depends on an artifact library", async function () { + await this.hre.run("compile", { quiet: true }); + + const libraryArtifact = await this.hre.artifacts.readArtifact( + "RubbishMath" + ); + + const result = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.library("RubbishMath", libraryArtifact); + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + assert.isDefined(result); + const math = result.rubbishMath; + const contractThatDependsOnLib = result.dependsOnLib; + + const addition = await math.add(1, 2); + assert.equal(addition, 3); + + const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( + 1, + 2, + 3 + ); + + assert.equal(libBasedAddtion, 6); + }); }); async function deployRecipe( From a5ae66bbbde0b085d7762db2ace86c9da1a85cdf Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 Aug 2022 15:34:49 +0100 Subject: [PATCH 0051/1302] refactor: move code into subfolders --- packages/core/src/Ignition.ts | 2 +- packages/core/src/link | 0 .../single-graph/execution/ExecutionGraph.ts | 20 +--------------- .../src/single-graph/execution/execute.ts | 3 +-- .../{execution => services}/createServices.ts | 0 .../transformRecipeGraphToExecutionGraph.ts | 24 +++++++++++++++---- 6 files changed, 23 insertions(+), 26 deletions(-) delete mode 100644 packages/core/src/link rename packages/core/src/single-graph/{execution => services}/createServices.ts (100%) rename packages/core/src/single-graph/{execution => transform}/transformRecipeGraphToExecutionGraph.ts (86%) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 2d1b5df4fb..df940a95de 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -15,8 +15,8 @@ import { Providers } from "./providers"; import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; import { UserRecipe } from "./recipes/UserRecipe"; import { execute } from "./single-graph/execution/execute"; -import { transformRecipeGraphToExecutionGraph } from "./single-graph/execution/transformRecipeGraphToExecutionGraph"; import { generateRecipeGraphFrom } from "./single-graph/recipe/generateRecipeGraphFrom"; +import { transformRecipeGraphToExecutionGraph } from "./single-graph/transform/transformRecipeGraphToExecutionGraph"; import { FutureDict } from "./single-graph/types/future"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; diff --git a/packages/core/src/link b/packages/core/src/link deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/core/src/single-graph/execution/ExecutionGraph.ts b/packages/core/src/single-graph/execution/ExecutionGraph.ts index d6a408dd0a..8689b1bde7 100644 --- a/packages/core/src/single-graph/execution/ExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/ExecutionGraph.ts @@ -1,8 +1,6 @@ import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; -import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; import { AdjacencyList, - clone, constructEmptyAdjacencyList, } from "../utils/adjacencyList"; @@ -10,24 +8,8 @@ export class ExecutionGraph implements IExecutionGraph { public adjacencyList: AdjacencyList; public vertexes: Map; - private constructor() { + constructor() { this.adjacencyList = constructEmptyAdjacencyList(); this.vertexes = new Map(); } - - public static async from( - recipeGraph: IRecipeGraph, - convert: (vertex: RecipeVertex) => Promise - ) { - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = clone(recipeGraph.adjacencyList); - - for (const [id, recipeVertex] of recipeGraph.vertexes.entries()) { - const executionVertex = await convert(recipeVertex); - - executionGraph.vertexes.set(id, executionVertex); - } - - return executionGraph; - } } diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index 66064a6264..00f3b9263b 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -1,6 +1,7 @@ import { Journal } from "../../journal/types"; import { Providers } from "../../providers"; import { Services } from "../../services/types"; +import { createServices } from "../services/createServices"; import { ArgValue, ContractCall, @@ -13,8 +14,6 @@ import { import { isFuture } from "../types/guards"; import { topologicalSort } from "../utils/adjacencyList"; -import { createServices } from "./createServices"; - export type ExecuteResult = | { _kind: "success"; diff --git a/packages/core/src/single-graph/execution/createServices.ts b/packages/core/src/single-graph/services/createServices.ts similarity index 100% rename from packages/core/src/single-graph/execution/createServices.ts rename to packages/core/src/single-graph/services/createServices.ts diff --git a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts similarity index 86% rename from packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts rename to packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts index ad15a883e8..665d230d57 100644 --- a/packages/core/src/single-graph/execution/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts @@ -2,6 +2,8 @@ import { Journal } from "../../journal/types"; import { Providers } from "../../providers"; import { Services } from "../../services/types"; import { Artifact } from "../../types"; +import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { createServices } from "../services/createServices"; import { ContractCall, ContractDeploy, @@ -20,9 +22,7 @@ import { IRecipeGraph, RecipeVertex, } from "../types/recipeGraph"; - -import { ExecutionGraph } from "./ExecutionGraph"; -import { createServices } from "./createServices"; +import { clone } from "../utils/adjacencyList"; export type TransformResult = | { @@ -48,7 +48,7 @@ export async function transformRecipeGraphToExecutionGraph( servicesOptions ); - const executionGraph: IExecutionGraph = await ExecutionGraph.from( + const executionGraph: IExecutionGraph = await convertRecipeToExecution( recipeGraph, convertRecipeVertexToExecutionVertex(services) ); @@ -56,6 +56,22 @@ export async function transformRecipeGraphToExecutionGraph( return { _kind: "success", executionGraph }; } +async function convertRecipeToExecution( + recipeGraph: IRecipeGraph, + convert: (vertex: RecipeVertex) => Promise +) { + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = clone(recipeGraph.adjacencyList); + + for (const [id, recipeVertex] of recipeGraph.vertexes.entries()) { + const executionVertex = await convert(recipeVertex); + + executionGraph.vertexes.set(id, executionVertex); + } + + return executionGraph; +} + function convertRecipeVertexToExecutionVertex( services: Services ): (recipeVertex: RecipeVertex) => Promise { From 305dc272823ae48150339f4b7c4891a517246f46 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 22 Aug 2022 09:42:41 +0100 Subject: [PATCH 0052/1302] refactor: add parameter support Parameters are encoded as futures in the recipe graph, but usages of recipe parameters are replaced with the actual value on transformation to the execution graph. --- .../src/single-graph/execution/execute.ts | 2 +- .../transformRecipeGraphToExecutionGraph.ts | 62 +++++++++++++++---- .../hardhat-plugin/src/ignition-wrapper.ts | 9 ++- .../test/single-graph/execute.ts | 28 +++++++++ 4 files changed, 87 insertions(+), 14 deletions(-) diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index 00f3b9263b..9b047af711 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -207,7 +207,7 @@ function resolveFromContext(context: Map) { const entry = context.get(arg.id); if (!entry) { - throw new Error(`No context entry for ${arg.id}`); + throw new Error(`No context entry for ${arg.id} (${arg.label})`); } return entry; diff --git a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts index 665d230d57..049080b4a8 100644 --- a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts @@ -12,6 +12,8 @@ import { IExecutionGraph, LibraryDeploy, } from "../types/executionGraph"; +import { RecipeFuture } from "../types/future"; +import { isFuture } from "../types/guards"; import { ArtifactContractRecipeVertex, ArtifactLibraryRecipeVertex, @@ -108,21 +110,21 @@ async function convertHardhatContractToContractDeploy( id: vertex.id, label: vertex.label, artifact, - args: vertex.args, + args: await convertArgs(vertex.args, services), libraries: vertex.libraries, }; } async function convertArtifactContractToContractDeploy( vertex: ArtifactContractRecipeVertex, - _services: Services + services: Services ): Promise { return { type: "ContractDeploy", id: vertex.id, label: vertex.label, artifact: vertex.artifact, - args: vertex.args, + args: await convertArgs(vertex.args, services), libraries: vertex.libraries, }; } @@ -142,7 +144,7 @@ async function convertDeployedContractToDeployedDeploy( async function convertCallToContractCall( vertex: CallRecipeVertex, - _services: Services + services: Services ): Promise { return { type: "ContractCall", @@ -151,37 +153,37 @@ async function convertCallToContractCall( contract: vertex.contract, method: vertex.method, - args: vertex.args, + args: await convertArgs(vertex.args, services), }; } async function convertHardhatLibraryToLibraryDeploy( - hardhatLibraryRecipeVertex: HardhatLibraryRecipeVertex, + vertex: HardhatLibraryRecipeVertex, services: Services ): Promise { const artifact: Artifact = await services.artifacts.getArtifact( - hardhatLibraryRecipeVertex.libraryName + vertex.libraryName ); return { type: "LibraryDeploy", - id: hardhatLibraryRecipeVertex.id, - label: hardhatLibraryRecipeVertex.label, + id: vertex.id, + label: vertex.label, artifact, - args: hardhatLibraryRecipeVertex.args, + args: await convertArgs(vertex.args, services), }; } async function convertArtifactLibraryToLibraryDeploy( vertex: ArtifactLibraryRecipeVertex, - _services: Services + services: Services ): Promise { return { type: "LibraryDeploy", id: vertex.id, label: vertex.label, artifact: vertex.artifact, - args: vertex.args, + args: await convertArgs(vertex.args, services), }; } @@ -194,3 +196,39 @@ function assertRecipeVertexNotExpected( throw new Error(`Type not expected: ${obj}`); } + +async function convertArgs( + args: Array, + services: Services +): Promise> { + const resolvedArgs = []; + + for (const arg of args) { + const resolvedArg = await convertArg(arg, services); + + resolvedArgs.push(resolvedArg); + } + + return resolvedArgs; +} + +async function convertArg( + arg: string | number | RecipeFuture, + services: Services +) { + if (!isFuture(arg)) { + return arg; + } + + if (arg.type !== "parameter") { + return arg; + } + + const param = await services.config.getParam(arg.label); + + if (param === undefined) { + throw new Error(`No param for ${arg.label}`); + } + + return param; +} diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index b54e9e0886..f3d25ef2de 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -36,7 +36,14 @@ export class IgnitionWrapper { }); } - public async deploySingleGraph(recipe: any, _options: any) { + public async deploySingleGraph( + recipe: any, + deployParams: { parameters: { [key: string]: ParamValue } } | undefined + ) { + if (deployParams !== undefined) { + await this._providers.config.setParams(deployParams.parameters); + } + const [deploymentResult] = await this._ignition.deploySingleGraph(recipe); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index fc0752ed4c..181992de11 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -206,6 +206,34 @@ describe("single graph version", () => { assert.equal(libBasedAddtion, 6); }); + + describe("recipe parameters", () => { + it("should allow parameters", async function () { + const result = await deployRecipe( + this.hre, + (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }, + { + parameters: { + MyNumber: 123, + }, + } + ); + + const v = await result.foo.x(); + + assert.equal(v, Number(124)); + }); + }); }); async function deployRecipe( From 745bb1e382f4a54d79f9ddbe5d236697e6b41d0d Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 23 Aug 2022 13:51:36 +0100 Subject: [PATCH 0053/1302] refactor: add initial `useRecipe` sketch --- .../single-graph/recipe/RecipeGraphBuilder.ts | 8 +++ .../src/single-graph/types/recipeGraph.ts | 2 + .../test/single-graph/execute-useRecipe.ts | 52 +++++++++++++++++++ 3 files changed, 62 insertions(+) create mode 100644 packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 950a870841..0cece36999 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -9,6 +9,7 @@ import type { RequiredParameter, OptionalParameter, ParameterValue, + FutureDict, } from "../types/future"; import { isArtifact } from "../types/guards"; import type { Artifact } from "../types/hardhat"; @@ -16,6 +17,7 @@ import { ContractOptions, IRecipeGraph, IRecipeGraphBuilder, + Recipe, RecipeGraphBuilderOptions, } from "../types/recipeGraph"; @@ -212,6 +214,12 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return paramFuture; } + public useRecipe(recipe: Recipe): FutureDict { + const result = recipe.steps(this); + + return result; + } + private _resolveNextId(): number { return this.idCounter++; } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index a947f7408c..449aad4e1f 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -136,6 +136,8 @@ export interface IRecipeGraphBuilder { paramName: string, defaultValue: ParameterValue ) => OptionalParameter; + + useRecipe: (recipe: Recipe) => FutureDict; } export interface Recipe { diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts new file mode 100644 index 0000000000..ef1fb4ccfa --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -0,0 +1,52 @@ +import { + buildRecipeSingleGraph, + IRecipeGraphBuilder, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlocks } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("useRecipe", () => { + useEnvironment("minimal"); + + it("should be able to use contracts created in other recipes", async function () { + await this.hre.run("compile", { quiet: true }); + + const thirdPartyRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo"); + + return { foo }; + } + ); + + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const { foo } = m.useRecipe(thirdPartyRecipe); + + m.call(foo as any, "inc", { + args: [], + }); + + return { foo }; + } + ); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); + + await mineBlocks(this.hre, [1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const x = await result.foo.x(); + + assert.equal(x, Number(2)); + }); +}); From 6f7a5765fb71cec31a2ba88932f6419e2180dc5b Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Aug 2022 10:17:58 +0100 Subject: [PATCH 0054/1302] refactor: support passing futures into `useRecipe` --- .../src/single-graph/execution/execute.ts | 1 + .../src/single-graph/recipe/RecipeGraph.ts | 5 ++ .../single-graph/recipe/RecipeGraphBuilder.ts | 77 ++++++++++++++++++- .../recipe/generateRecipeGraphFrom.ts | 4 +- .../transformRecipeGraphToExecutionGraph.ts | 70 +++++++++-------- .../core/src/single-graph/types/future.ts | 2 + .../core/src/single-graph/types/guards.ts | 12 ++- .../src/single-graph/types/recipeGraph.ts | 9 ++- .../src/single-graph/utils/adjacencyList.ts | 2 +- .../test/single-graph/execute-useRecipe.ts | 46 +++++++++++ 10 files changed, 188 insertions(+), 40 deletions(-) diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index 9b047af711..b5f96537eb 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -174,6 +174,7 @@ async function executeContractCall( const resolve = resolveFromContext(services.context); const resolvedArgs = args.map(resolve).map(toAddress); + const { address, abi } = resolve(contract); const txHash = await services.contracts.call( diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index 1daf3c4340..10b51a6eae 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,3 +1,4 @@ +import { RecipeFuture } from "../types/future"; import { VertexDescriptor } from "../types/graph"; import { isFuture } from "../types/guards"; import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; @@ -11,10 +12,14 @@ import { export class RecipeGraph implements IRecipeGraph { public adjacencyList: AdjacencyList; public vertexes: Map; + public registeredParameters: { + [key: string]: { [key: string]: string | number | RecipeFuture }; + }; constructor() { this.adjacencyList = constructEmptyAdjacencyList(); this.vertexes = new Map(); + this.registeredParameters = {}; } public vertexSize(): number { diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 0cece36999..b6745afdf3 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -11,7 +11,7 @@ import type { ParameterValue, FutureDict, } from "../types/future"; -import { isArtifact } from "../types/guards"; +import { isArtifact, isParameter } from "../types/guards"; import type { Artifact } from "../types/hardhat"; import { ContractOptions, @@ -19,19 +19,47 @@ import { IRecipeGraphBuilder, Recipe, RecipeGraphBuilderOptions, + UseRecipeOptions, } from "../types/recipeGraph"; import { RecipeGraph } from "./RecipeGraph"; +class ScopeStack { + private scopes: string[]; + + constructor() { + this.scopes = []; + } + + public push(scopeName: string): void { + this.scopes.push(scopeName); + } + + public pop(): string | undefined { + return this.scopes.pop(); + } + + public getScopedLabel(label: string | undefined) { + const joinedScopes = this.scopes.join("/"); + + return label === undefined ? joinedScopes : `${joinedScopes}/${label}`; + } +} + export class RecipeGraphBuilder implements IRecipeGraphBuilder { public chainId: number; public graph: IRecipeGraph; private idCounter: number; + private useRecipeInvocationCounter: number; + private scopes: ScopeStack; constructor(options: RecipeGraphBuilderOptions) { this.chainId = options.chainId; this.idCounter = 0; + this.useRecipeInvocationCounter = 0; this.graph = new RecipeGraph(); + + this.scopes = new ScopeStack(); } public library( @@ -159,7 +187,12 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } public call( - contractFuture: HardhatContract | ArtifactContract | DeployedContract, + contractFuture: + | HardhatContract + | ArtifactContract + | DeployedContract + | RequiredParameter + | OptionalParameter, functionName: string, { args, @@ -174,11 +207,33 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; + let contract: RecipeFuture; + if (isParameter(contractFuture)) { + const parameter = contractFuture; + const scope = parameter.scope; + + const registeredScope = this.graph.registeredParameters[scope]; + + if ( + registeredScope === undefined || + !(parameter.label in registeredScope) + ) { + throw new Error("Could not resolve contract from parameter"); + } + + contract = registeredScope[parameter.label] as + | HardhatContract + | ArtifactContract + | DeployedContract; + } else { + contract = contractFuture; + } + this.graph.addRecipeVertex({ id: callFuture.id, label: callFuture.label, type: "Call", - contract: contractFuture, + contract, method: functionName, args: args ?? [], }); @@ -192,6 +247,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: paramName, type: "parameter", subtype: "required", + scope: this.scopes.getScopedLabel(undefined), _future: true, }; @@ -208,15 +264,28 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { type: "parameter", subtype: "optional", defaultValue, + scope: this.scopes.getScopedLabel(undefined), _future: true, }; return paramFuture; } - public useRecipe(recipe: Recipe): FutureDict { + public useRecipe(recipe: Recipe, options?: UseRecipeOptions): FutureDict { + const useRecipeInvocationId = this.useRecipeInvocationCounter++; + + this.scopes.push(`${recipe.name}:${useRecipeInvocationId}`); + + if (options !== undefined && options.parameters !== undefined) { + const parametersLabel = this.scopes.getScopedLabel(undefined); + + this.graph.registeredParameters[parametersLabel] = options.parameters; + } + const result = recipe.steps(this); + this.scopes.pop(); + return result; } diff --git a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts index c2143363e1..982d7069c0 100644 --- a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts +++ b/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts @@ -15,7 +15,5 @@ export function generateRecipeGraphFrom( const recipeOutputs = recipe.steps(graphBuilder); - const graph = graphBuilder.graph; - - return { graph, recipeOutputs }; + return { graph: graphBuilder.graph, recipeOutputs }; } diff --git a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts index 049080b4a8..b74879fe92 100644 --- a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts @@ -36,6 +36,11 @@ export type TransformResult = failures: [string, Error[]]; }; +interface TransformContext { + services: Services; + graph: IRecipeGraph; +} + export async function transformRecipeGraphToExecutionGraph( recipeGraph: IRecipeGraph, servicesOptions: { @@ -52,7 +57,7 @@ export async function transformRecipeGraphToExecutionGraph( const executionGraph: IExecutionGraph = await convertRecipeToExecution( recipeGraph, - convertRecipeVertexToExecutionVertex(services) + convertRecipeVertexToExecutionVertex({ services, graph: recipeGraph }) ); return { _kind: "success", executionGraph }; @@ -75,22 +80,22 @@ async function convertRecipeToExecution( } function convertRecipeVertexToExecutionVertex( - services: Services + context: TransformContext ): (recipeVertex: RecipeVertex) => Promise { return (recipeVertex: RecipeVertex): Promise => { switch (recipeVertex.type) { case "HardhatContract": - return convertHardhatContractToContractDeploy(recipeVertex, services); + return convertHardhatContractToContractDeploy(recipeVertex, context); case "ArtifactContract": - return convertArtifactContractToContractDeploy(recipeVertex, services); + return convertArtifactContractToContractDeploy(recipeVertex, context); case "DeployedContract": - return convertDeployedContractToDeployedDeploy(recipeVertex, services); + return convertDeployedContractToDeployedDeploy(recipeVertex, context); case "Call": - return convertCallToContractCall(recipeVertex, services); + return convertCallToContractCall(recipeVertex, context); case "HardhatLibrary": - return convertHardhatLibraryToLibraryDeploy(recipeVertex, services); + return convertHardhatLibraryToLibraryDeploy(recipeVertex, context); case "ArtifactLibrary": - return convertArtifactLibraryToLibraryDeploy(recipeVertex, services); + return convertArtifactLibraryToLibraryDeploy(recipeVertex, context); default: return assertRecipeVertexNotExpected(recipeVertex); } @@ -99,39 +104,38 @@ function convertRecipeVertexToExecutionVertex( async function convertHardhatContractToContractDeploy( vertex: HardhatContractRecipeVertex, - services: Services + transformContext: TransformContext ): Promise { - const artifact: Artifact = await services.artifacts.getArtifact( - vertex.contractName - ); + const artifact: Artifact = + await transformContext.services.artifacts.getArtifact(vertex.contractName); return { type: "ContractDeploy", id: vertex.id, label: vertex.label, artifact, - args: await convertArgs(vertex.args, services), + args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, }; } async function convertArtifactContractToContractDeploy( vertex: ArtifactContractRecipeVertex, - services: Services + transformContext: TransformContext ): Promise { return { type: "ContractDeploy", id: vertex.id, label: vertex.label, artifact: vertex.artifact, - args: await convertArgs(vertex.args, services), + args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, }; } async function convertDeployedContractToDeployedDeploy( vertex: DeployedContractRecipeVertex, - _services: Services + _transformContext: TransformContext ): Promise { return { type: "DeployedContract", @@ -144,46 +148,45 @@ async function convertDeployedContractToDeployedDeploy( async function convertCallToContractCall( vertex: CallRecipeVertex, - services: Services + transformContext: TransformContext ): Promise { return { type: "ContractCall", id: vertex.id, label: vertex.label, - contract: vertex.contract, + contract: await resolveParameter(vertex.contract, transformContext), method: vertex.method, - args: await convertArgs(vertex.args, services), + args: await convertArgs(vertex.args, transformContext), }; } async function convertHardhatLibraryToLibraryDeploy( vertex: HardhatLibraryRecipeVertex, - services: Services + transformContext: TransformContext ): Promise { - const artifact: Artifact = await services.artifacts.getArtifact( - vertex.libraryName - ); + const artifact: Artifact = + await transformContext.services.artifacts.getArtifact(vertex.libraryName); return { type: "LibraryDeploy", id: vertex.id, label: vertex.label, artifact, - args: await convertArgs(vertex.args, services), + args: await convertArgs(vertex.args, transformContext), }; } async function convertArtifactLibraryToLibraryDeploy( vertex: ArtifactLibraryRecipeVertex, - services: Services + transformContext: TransformContext ): Promise { return { type: "LibraryDeploy", id: vertex.id, label: vertex.label, artifact: vertex.artifact, - args: await convertArgs(vertex.args, services), + args: await convertArgs(vertex.args, transformContext), }; } @@ -199,12 +202,12 @@ function assertRecipeVertexNotExpected( async function convertArgs( args: Array, - services: Services + transformContext: TransformContext ): Promise> { const resolvedArgs = []; for (const arg of args) { - const resolvedArg = await convertArg(arg, services); + const resolvedArg = await resolveParameter(arg, transformContext); resolvedArgs.push(resolvedArg); } @@ -212,9 +215,9 @@ async function convertArgs( return resolvedArgs; } -async function convertArg( +async function resolveParameter( arg: string | number | RecipeFuture, - services: Services + { services, graph }: TransformContext ) { if (!isFuture(arg)) { return arg; @@ -224,6 +227,13 @@ async function convertArg( return arg; } + const scope = arg.scope; + const scopeParameters = graph.registeredParameters[scope]; + + if (scopeParameters !== undefined && arg.label in scopeParameters) { + return scopeParameters[arg.label]; + } + const param = await services.config.getParam(arg.label); if (param === undefined) { diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index 0c90cac867..7382cd5b70 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -52,6 +52,7 @@ export interface RequiredParameter { label: string; type: "parameter"; subtype: "required"; + scope: string; _future: true; } @@ -61,6 +62,7 @@ export interface OptionalParameter { type: "parameter"; subtype: "optional"; defaultValue: ParameterValue; + scope: string; _future: true; } diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts index 4f547370bc..0b4ccd1b02 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/types/guards.ts @@ -1,4 +1,8 @@ -import type { RecipeFuture } from "./future"; +import type { + OptionalParameter, + RecipeFuture, + RequiredParameter, +} from "./future"; import { Artifact } from "./hardhat"; import type { RecipeVertex, @@ -61,3 +65,9 @@ export function isFuture(possible: {}): possible is RecipeFuture { "_future" in possible ); } + +export function isParameter( + recipe: RecipeFuture +): recipe is RequiredParameter | OptionalParameter { + return recipe.type === "parameter"; +} diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 449aad4e1f..29cbf76f87 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -83,9 +83,16 @@ export interface ContractOptions { }; } +export interface UseRecipeOptions { + parameters?: { [key: string]: number | string | RecipeFuture }; +} + export interface IRecipeGraph { vertexes: Map; adjacencyList: Array>; + registeredParameters: { + [key: string]: { [key: string]: string | number | RecipeFuture }; + }; vertexSize: () => number; addRecipeVertex: (node: RecipeVertex) => void; @@ -137,7 +144,7 @@ export interface IRecipeGraphBuilder { defaultValue: ParameterValue ) => OptionalParameter; - useRecipe: (recipe: Recipe) => FutureDict; + useRecipe: (recipe: Recipe, options?: UseRecipeOptions) => FutureDict; } export interface Recipe { diff --git a/packages/core/src/single-graph/utils/adjacencyList.ts b/packages/core/src/single-graph/utils/adjacencyList.ts index 1582da05d3..003a7526c6 100644 --- a/packages/core/src/single-graph/utils/adjacencyList.ts +++ b/packages/core/src/single-graph/utils/adjacencyList.ts @@ -48,7 +48,7 @@ export function topologicalSort(adjacencyList: AdjacencyList): number[] { return new Set([...acc].concat([...v])); }, new Set(adjacencyList.keys())); - const dag = new DiGraph(vertexes.size); + const dag = new DiGraph(Math.max(...vertexes) + 1); for (let from = 0; from < adjacencyList.length; from++) { const toSet = adjacencyList[from]; diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts index ef1fb4ccfa..f4049aaf8f 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -49,4 +49,50 @@ describe("useRecipe", () => { assert.equal(x, Number(2)); }); + + it("should be able to pass contract futures into another recipe", async function () { + await this.hre.run("compile", { quiet: true }); + + const thirdPartyRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.getParam("Foo"); + + m.call(foo as any, "inc", { + args: [], + }); + + return { foo }; + } + ); + + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo"); + + m.useRecipe(thirdPartyRecipe, { + parameters: { + Foo: foo as any, + }, + }); + + return { foo }; + } + ); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); + + await mineBlocks(this.hre, [1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const x = await result.foo.x(); + + assert.equal(x, Number(2)); + }); }); From e3f39b2ecec0ee49ec9548af99f98dde81339bc5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Aug 2022 11:23:40 +0100 Subject: [PATCH 0055/1302] refactor: change adj list from array to map This is to help when console.log the display. --- .../src/single-graph/types/recipeGraph.ts | 4 +- .../src/single-graph/utils/adjacencyList.ts | 41 ++++++++----------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 29cbf76f87..9796764fb3 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -1,3 +1,5 @@ +import { AdjacencyList } from "../utils/adjacencyList"; + import { ArtifactContract, ArtifactLibrary, @@ -89,7 +91,7 @@ export interface UseRecipeOptions { export interface IRecipeGraph { vertexes: Map; - adjacencyList: Array>; + adjacencyList: AdjacencyList; registeredParameters: { [key: string]: { [key: string]: string | number | RecipeFuture }; }; diff --git a/packages/core/src/single-graph/utils/adjacencyList.ts b/packages/core/src/single-graph/utils/adjacencyList.ts index 003a7526c6..663fc71468 100644 --- a/packages/core/src/single-graph/utils/adjacencyList.ts +++ b/packages/core/src/single-graph/utils/adjacencyList.ts @@ -1,58 +1,51 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; -export type AdjacencyList = Array>; +export type AdjacencyList = Map>; -export function constructEmptyAdjacencyList(): Array> { - return []; +export function constructEmptyAdjacencyList(): AdjacencyList { + return new Map>(); } export function addEdge( adjacencyList: AdjacencyList, { from, to }: { from: number; to: number } ) { - const toSet = adjacencyList[from] ?? new Set(); + const toSet = adjacencyList.get(from) ?? new Set(); toSet.add(to); - adjacencyList[from] = toSet; + adjacencyList.set(from, toSet); } export function getDependenciesFor(adjacencyList: AdjacencyList, to: number) { - const depIds = []; - - for (let from = 0; from < adjacencyList.length; from++) { - if (adjacencyList[from].has(to)) { - depIds.push(from); - } - } - - return depIds; + return [...adjacencyList.entries()] + .filter(([_from, toSet]) => toSet.has(to)) + .map(([from]) => from); } export function clone(adjacencyList: AdjacencyList): AdjacencyList { - const newList: AdjacencyList = []; + const newList: AdjacencyList = new Map(); - for (let i = 0; i < adjacencyList.length; i++) { - newList[i] = new Set(adjacencyList[i]); + for (const [from, toSet] of adjacencyList.entries()) { + newList.set(from, new Set(toSet)); } return newList; } export function topologicalSort(adjacencyList: AdjacencyList): number[] { - if (adjacencyList.length === 0) { + if (adjacencyList.size === 0) { return []; } - const vertexes = adjacencyList.reduce((acc: Set, v: Set) => { - return new Set([...acc].concat([...v])); - }, new Set(adjacencyList.keys())); + const vertexes = [...adjacencyList.values()].reduce( + (acc, v) => new Set([...acc].concat([...v])), + new Set(adjacencyList.keys()) + ); const dag = new DiGraph(Math.max(...vertexes) + 1); - for (let from = 0; from < adjacencyList.length; from++) { - const toSet = adjacencyList[from]; - + for (const [from, toSet] of adjacencyList.entries()) { for (const to of toSet) { dag.addEdge(from, to); } From ca19636dba3637e31d7dfda017faa86c950575ef Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Aug 2022 12:01:16 +0100 Subject: [PATCH 0056/1302] refactor: move to vertexId on futures Remove vertexId on parameter futures. --- packages/core/src/Ignition.ts | 17 +++++++----- .../src/single-graph/execution/execute.ts | 8 +++--- .../src/single-graph/recipe/RecipeGraph.ts | 14 +++++----- .../single-graph/recipe/RecipeGraphBuilder.ts | 26 +++++++++---------- .../core/src/single-graph/types/future.ts | 24 ++++++++--------- .../core/src/single-graph/types/guards.ts | 10 +++++++ packages/core/test/single-graph/recipes.ts | 2 +- 7 files changed, 57 insertions(+), 44 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index df940a95de..15bbbee2ee 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -17,7 +17,8 @@ import { UserRecipe } from "./recipes/UserRecipe"; import { execute } from "./single-graph/execution/execute"; import { generateRecipeGraphFrom } from "./single-graph/recipe/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "./single-graph/transform/transformRecipeGraphToExecutionGraph"; -import { FutureDict } from "./single-graph/types/future"; +import { DependableFuture, FutureDict } from "./single-graph/types/future"; +import { isDependable } from "./single-graph/types/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; const log = setupDebug("ignition:main"); @@ -198,14 +199,16 @@ export class Ignition { recipeOutputs: FutureDict, result: Map ): SerializedDeploymentResult { - const convertedEntries = Object.entries(recipeOutputs).map( - ([name, future]) => { - const executionResultValue = result.get(future.id); - - return [name, serializeFutureOutput(executionResultValue)]; - } + const entries = Object.entries(recipeOutputs).filter( + (entry): entry is [string, DependableFuture] => isDependable(entry[1]) ); + const convertedEntries = entries.map(([name, future]) => { + const executionResultValue = result.get(future.vertexId); + + return [name, serializeFutureOutput(executionResultValue)]; + }); + return Object.fromEntries(convertedEntries); } } diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index b5f96537eb..298031a52a 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -11,7 +11,7 @@ import { IExecutionGraph, LibraryDeploy, } from "../types/executionGraph"; -import { isFuture } from "../types/guards"; +import { isDependable } from "../types/guards"; import { topologicalSort } from "../utils/adjacencyList"; export type ExecuteResult = @@ -201,14 +201,14 @@ function toAddress(v: any) { function resolveFromContext(context: Map) { return (arg: ArgValue) => { - if (!isFuture(arg)) { + if (!isDependable(arg)) { return arg; } - const entry = context.get(arg.id); + const entry = context.get(arg.vertexId); if (!entry) { - throw new Error(`No context entry for ${arg.id} (${arg.label})`); + throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); } return entry; diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index 10b51a6eae..e77fb7df6e 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,6 +1,6 @@ import { RecipeFuture } from "../types/future"; import { VertexDescriptor } from "../types/graph"; -import { isFuture } from "../types/guards"; +import { isDependable } from "../types/guards"; import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; import { addEdge, @@ -38,10 +38,10 @@ export class RecipeGraph implements IRecipeGraph { this.vertexes.set(depNode.id, depNode); if (depNode.type !== "DeployedContract") { - const futureArgs = depNode.args.filter(isFuture); + const futureArgs = depNode.args.filter(isDependable); for (const arg of futureArgs) { - addEdge(this.adjacencyList, { from: arg.id, to: depNode.id }); + addEdge(this.adjacencyList, { from: arg.vertexId, to: depNode.id }); } } @@ -49,16 +49,18 @@ export class RecipeGraph implements IRecipeGraph { depNode.type === "HardhatContract" || depNode.type === "ArtifactContract" ) { - const futureLibraries = Object.values(depNode.libraries); + const futureLibraries = Object.values(depNode.libraries).filter( + isDependable + ); for (const lib of futureLibraries) { - addEdge(this.adjacencyList, { from: lib.id, to: depNode.id }); + addEdge(this.adjacencyList, { from: lib.vertexId, to: depNode.id }); } } if (depNode.type === "Call") { addEdge(this.adjacencyList, { - from: depNode.contract.id, + from: depNode.contract.vertexId, to: depNode.id, }); } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index b6745afdf3..fc50886ea2 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -72,7 +72,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const options: ContractOptions | undefined = givenOptions; const artifactContractFuture: ArtifactLibrary = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: libraryName, type: "library", subtype: "artifact", @@ -80,7 +80,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }; this.graph.addRecipeVertex({ - id: artifactContractFuture.id, + id: artifactContractFuture.vertexId, label: libraryName, type: "ArtifactLibrary", artifact, @@ -92,7 +92,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const options: ContractOptions | undefined = artifactOrOptions; const libraryFuture: HardhatLibrary = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: libraryName, type: "library", subtype: "hardhat", @@ -100,7 +100,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }; this.graph.addRecipeVertex({ - id: libraryFuture.id, + id: libraryFuture.vertexId, label: libraryName, type: "HardhatLibrary", libraryName, @@ -121,7 +121,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const options: ContractOptions | undefined = givenOptions; const artifactContractFuture: ArtifactContract = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: contractName, type: "contract", subtype: "artifact", @@ -129,7 +129,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }; this.graph.addRecipeVertex({ - id: artifactContractFuture.id, + id: artifactContractFuture.vertexId, label: contractName, type: "ArtifactContract", artifact, @@ -142,7 +142,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const options: ContractOptions | undefined = artifactOrOptions; const contractFuture: HardhatContract = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: contractName, type: "contract", subtype: "hardhat", @@ -150,7 +150,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }; this.graph.addRecipeVertex({ - id: contractFuture.id, + id: contractFuture.vertexId, label: contractName, type: "HardhatContract", contractName, @@ -168,7 +168,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { abi: any[] ): DeployedContract { const deployedFuture: DeployedContract = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: contractName, type: "contract", subtype: "deployed", @@ -176,7 +176,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }; this.graph.addRecipeVertex({ - id: deployedFuture.id, + id: deployedFuture.vertexId, label: contractName, type: "DeployedContract", address, @@ -201,7 +201,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } ): ContractCall { const callFuture: ContractCall = { - id: this._resolveNextId(), + vertexId: this._resolveNextId(), label: `${contractFuture.label}/${functionName}`, type: "call", _future: true, @@ -230,7 +230,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } this.graph.addRecipeVertex({ - id: callFuture.id, + id: callFuture.vertexId, label: callFuture.label, type: "Call", contract, @@ -243,7 +243,6 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { public getParam(paramName: string): RequiredParameter { const paramFuture: RequiredParameter = { - id: this._resolveNextId(), label: paramName, type: "parameter", subtype: "required", @@ -259,7 +258,6 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { defaultValue: ParameterValue ): OptionalParameter { const paramFuture: OptionalParameter = { - id: this._resolveNextId(), label: paramName, type: "parameter", subtype: "optional", diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index 7382cd5b70..87335c9f84 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -1,5 +1,5 @@ export interface HardhatContract { - id: number; + vertexId: number; label: string; type: "contract"; subtype: "hardhat"; @@ -7,7 +7,7 @@ export interface HardhatContract { } export interface ArtifactContract { - id: number; + vertexId: number; label: string; type: "contract"; subtype: "artifact"; @@ -15,7 +15,7 @@ export interface ArtifactContract { } export interface DeployedContract { - id: number; + vertexId: number; label: string; type: "contract"; subtype: "deployed"; @@ -23,7 +23,7 @@ export interface DeployedContract { } export interface HardhatLibrary { - id: number; + vertexId: number; label: string; type: "library"; subtype: "hardhat"; @@ -31,7 +31,7 @@ export interface HardhatLibrary { } export interface ArtifactLibrary { - id: number; + vertexId: number; label: string; type: "library"; subtype: "artifact"; @@ -39,7 +39,7 @@ export interface ArtifactLibrary { } export interface ContractCall { - id: number; + vertexId: number; label: string; type: "call"; _future: true; @@ -48,7 +48,6 @@ export interface ContractCall { export type ParameterValue = string | number | RecipeFuture; export interface RequiredParameter { - id: number; label: string; type: "parameter"; subtype: "required"; @@ -57,7 +56,6 @@ export interface RequiredParameter { } export interface OptionalParameter { - id: number; label: string; type: "parameter"; subtype: "optional"; @@ -66,15 +64,17 @@ export interface OptionalParameter { _future: true; } -export type RecipeFuture = +export type DependableFuture = | HardhatContract | ArtifactContract | DeployedContract | HardhatLibrary | ArtifactLibrary - | ContractCall - | RequiredParameter - | OptionalParameter; + | ContractCall; + +export type ParameterFuture = RequiredParameter | OptionalParameter; + +export type RecipeFuture = DependableFuture | ParameterFuture; export interface FutureDict { [key: string]: RecipeFuture; diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts index 0b4ccd1b02..b289284da5 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/types/guards.ts @@ -1,4 +1,5 @@ import type { + DependableFuture, OptionalParameter, RecipeFuture, RequiredParameter, @@ -66,6 +67,15 @@ export function isFuture(possible: {}): possible is RecipeFuture { ); } +export function isDependable(possible: any): possible is DependableFuture { + return ( + isFuture(possible) && + (possible.type === "call" || + possible.type === "contract" || + possible.type === "library") + ); +} + export function isParameter( recipe: RecipeFuture ): recipe is RequiredParameter | OptionalParameter { diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index b68f6f0c44..f1faaa341c 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -440,7 +440,7 @@ describe("Recipes", function () { assert.deepStrictEqual(depNode.args, [ { - id: 0, + vertexId: 0, label: "Token", type: "contract", subtype: "hardhat", From 96152e48d7ad92ac7191712afcf53f2ffc2207fc Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Aug 2022 14:42:23 +0100 Subject: [PATCH 0057/1302] refactor: allow `after` to be specified on calls --- .../src/single-graph/recipe/RecipeGraph.ts | 7 +++ .../single-graph/recipe/RecipeGraphBuilder.ts | 3 + .../src/single-graph/types/recipeGraph.ts | 2 + .../test/single-graph/execute.ts | 58 ++++++++++++++----- 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index e77fb7df6e..b3d73def7b 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -63,6 +63,13 @@ export class RecipeGraph implements IRecipeGraph { from: depNode.contract.vertexId, to: depNode.id, }); + + for (const afterVertex of depNode.after.filter(isDependable)) { + addEdge(this.adjacencyList, { + from: afterVertex.vertexId, + to: depNode.id, + }); + } } } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index fc50886ea2..30431dbc88 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -196,8 +196,10 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { functionName: string, { args, + after, }: { args: Array; + after?: RecipeFuture[]; } ): ContractCall { const callFuture: ContractCall = { @@ -236,6 +238,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { contract, method: functionName, args: args ?? [], + after: after ?? [], }); return callFuture; diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 9796764fb3..91cc3b59cc 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -68,6 +68,7 @@ export interface CallRecipeVertex { contract: HardhatContract | ArtifactContract | DeployedContract; method: string; args: Array; + after: RecipeFuture[]; } export type RecipeVertex = @@ -136,6 +137,7 @@ export interface IRecipeGraphBuilder { args, }: { args: Array; + after?: RecipeFuture[]; } ) => ContractCall; diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index 181992de11..7ba0ca85fa 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -59,26 +59,58 @@ describe("single graph version", () => { assert.equal(usedAddress, result.bar.address); }); - it("should be able to call contracts", async function () { - const result = await deployRecipe(this.hre, (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], + describe("calls", () => { + it("should be able to call contracts", async function () { + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; }); - m.call(usesContract, "setAddress", { - args: [bar], - }); + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); - return { bar, usesContract }; + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); }); - assert.isDefined(result.bar); - assert.isDefined(result.usesContract); + it("should be able to make calls in order", async function () { + const result = await deployRecipe(this.hre, (m) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const usedAddress = await result.usesContract.contractAddress(); + const second = m.call(trace, "addEntry", { + args: ["second"], + }); - assert.equal(usedAddress, result.bar.address); + m.call(trace, "addEntry", { + args: ["third"], + after: [second], + }); + + return { trace }; + }); + + assert.isDefined(result.trace); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + + assert.deepStrictEqual( + [entry1, entry2, entry3], + ["first", "second", "third"] + ); + }); }); it("should be able to use an existing contract", async function () { From 6977f0a62b16ac919a439dd32751a34027f487d4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Aug 2022 14:26:22 +0100 Subject: [PATCH 0058/1302] refactor: add test for execution order in useRecipe --- .../single-graph/recipe/RecipeGraphBuilder.ts | 18 +- .../core/src/single-graph/types/future.ts | 13 +- .../core/src/single-graph/types/guards.ts | 11 +- .../src/single-graph/types/recipeGraph.ts | 5 +- .../minimal/contracts/Trace.sol | 14 ++ .../test/single-graph/execute-useRecipe.ts | 190 ++++++++++++------ 6 files changed, 172 insertions(+), 79 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 30431dbc88..e0a6e0d40d 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -10,8 +10,9 @@ import type { OptionalParameter, ParameterValue, FutureDict, + CallableFuture, } from "../types/future"; -import { isArtifact, isParameter } from "../types/guards"; +import { isArtifact, isCallable, isParameter } from "../types/guards"; import type { Artifact } from "../types/hardhat"; import { ContractOptions, @@ -187,12 +188,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } public call( - contractFuture: - | HardhatContract - | ArtifactContract - | DeployedContract - | RequiredParameter - | OptionalParameter, + contractFuture: RecipeFuture, functionName: string, { args, @@ -209,7 +205,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - let contract: RecipeFuture; + let contract: CallableFuture; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -227,8 +223,12 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { | HardhatContract | ArtifactContract | DeployedContract; - } else { + } else if (isCallable(contractFuture)) { contract = contractFuture; + } else { + throw new Error( + `Not a callable future ${contractFuture.label} (${contractFuture.type})` + ); } this.graph.addRecipeVertex({ diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index 87335c9f84..50ba4625e1 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -64,13 +64,16 @@ export interface OptionalParameter { _future: true; } -export type DependableFuture = +export type ContractFuture = | HardhatContract | ArtifactContract - | DeployedContract - | HardhatLibrary - | ArtifactLibrary - | ContractCall; + | DeployedContract; + +export type LibraryFuture = HardhatLibrary | ArtifactLibrary; + +export type CallableFuture = ContractFuture | LibraryFuture; + +export type DependableFuture = CallableFuture | ContractCall; export type ParameterFuture = RequiredParameter | OptionalParameter; diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts index b289284da5..c4ddadf8c8 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/types/guards.ts @@ -1,4 +1,5 @@ import type { + CallableFuture, DependableFuture, OptionalParameter, RecipeFuture, @@ -77,7 +78,11 @@ export function isDependable(possible: any): possible is DependableFuture { } export function isParameter( - recipe: RecipeFuture -): recipe is RequiredParameter | OptionalParameter { - return recipe.type === "parameter"; + future: RecipeFuture +): future is RequiredParameter | OptionalParameter { + return future.type === "parameter"; +} + +export function isCallable(future: RecipeFuture): future is CallableFuture { + return future.type === "contract" || future.type === "library"; } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 91cc3b59cc..5e9ba89385 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -12,6 +12,7 @@ import { OptionalParameter, ParameterValue, RequiredParameter, + CallableFuture, } from "./future"; import { Artifact } from "./hardhat"; @@ -65,7 +66,7 @@ export interface CallRecipeVertex { id: number; type: "Call"; label: string; - contract: HardhatContract | ArtifactContract | DeployedContract; + contract: CallableFuture; method: string; args: Array; after: RecipeFuture[]; @@ -131,7 +132,7 @@ export interface IRecipeGraphBuilder { ) => HardhatLibrary | ArtifactLibrary; call: ( - contractFuture: HardhatContract | ArtifactContract | DeployedContract, + contractFuture: RecipeFuture, functionName: string, { args, diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol new file mode 100644 index 0000000000..1687a1d485 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts index f4049aaf8f..becfecccc4 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -7,92 +7,162 @@ import { assert } from "chai"; import { mineBlocks } from "../helpers"; import { useEnvironment } from "../useEnvironment"; -describe("useRecipe", () => { +describe("useRecipe", function () { useEnvironment("minimal"); - it("should be able to use contracts created in other recipes", async function () { - await this.hre.run("compile", { quiet: true }); + describe("returning futures from recipe usage", () => { + it("using useRecipe", async function () { + await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipeSingleGraph( - "ThirdPartyRecipe", - (m: IRecipeGraphBuilder) => { - const foo = m.contract("Foo"); + const thirdPartyRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo"); - return { foo }; - } - ); + return { foo }; + } + ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const { foo } = m.useRecipe(thirdPartyRecipe); + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const { foo } = m.useRecipe(thirdPartyRecipe); - m.call(foo as any, "inc", { - args: [], - }); + m.call(foo, "inc", { + args: [], + }); - return { foo }; - } - ); + return { foo }; + } + ); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { - parameters: {}, - }); + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); - await mineBlocks(this.hre, [1, 1, 1], deployPromise); + await mineBlocks(this.hre, [1, 1, 1], deployPromise); - const result = await deployPromise; + const result = await deployPromise; - assert.isDefined(result); + assert.isDefined(result); - const x = await result.foo.x(); + const x = await result.foo.x(); - assert.equal(x, Number(2)); + assert.equal(x, Number(2)); + }); }); - it("should be able to pass contract futures into another recipe", async function () { - await this.hre.run("compile", { quiet: true }); + describe("passing futures into recipes", () => { + it("using useRecipe", async function () { + await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipeSingleGraph( - "ThirdPartyRecipe", - (m: IRecipeGraphBuilder) => { - const foo = m.getParam("Foo"); + const thirdPartyRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.getParam("Foo"); - m.call(foo as any, "inc", { - args: [], - }); + m.call(foo, "inc", { + args: [], + }); - return { foo }; - } - ); + return { foo }; + } + ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const foo = m.contract("Foo"); + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo"); - m.useRecipe(thirdPartyRecipe, { - parameters: { - Foo: foo as any, - }, - }); + m.useRecipe(thirdPartyRecipe, { + parameters: { + Foo: foo, + }, + }); - return { foo }; - } - ); + return { foo }; + } + ); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { - parameters: {}, - }); + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); - await mineBlocks(this.hre, [1, 1, 1], deployPromise); + await mineBlocks(this.hre, [1, 1, 1], deployPromise); - const result = await deployPromise; + const result = await deployPromise; - assert.isDefined(result); + assert.isDefined(result); - const x = await result.foo.x(); + const x = await result.foo.x(); - assert.equal(x, Number(2)); + assert.equal(x, Number(2)); + }); + }); + + describe("passing futures into and out of recipes", () => { + it("using useRecipe", async function () { + await this.hre.run("compile", { quiet: true }); + + const addSecondAndThirdEntryRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const trace = m.getParam("Trace"); + + const secondCall = m.call(trace, "addEntry", { + args: ["second"], + }); + + const thirdCall = m.call(trace, "addEntry", { + args: ["third"], + after: [secondCall], + }); + + return { thirdCall }; + } + ); + + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); + + const { thirdCall } = m.useRecipe(addSecondAndThirdEntryRecipe, { + parameters: { + Trace: trace, + }, + }); + + m.call(trace, "addEntry", { + args: ["fourth"], + after: [thirdCall], + }); + + return { trace }; + } + ); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); + + await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + const entry4 = await result.trace.entries(3); + + assert.deepStrictEqual( + [entry1, entry2, entry3, entry4], + ["first", "second", "third", "fourth"] + ); + }); }); }); From 117c5877eb47891a0de0fdc0af939cf49aec66b7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 Aug 2022 14:04:49 +0100 Subject: [PATCH 0059/1302] refactor: enforce recipe ordering through virtual node --- .../src/single-graph/recipe/RecipeGraph.ts | 13 +- .../single-graph/recipe/RecipeGraphBuilder.ts | 62 +++++++-- ...RecipeGraphByEliminatingVirtualVertexes.ts | 46 +++++++ .../transformRecipeGraphToExecutionGraph.ts | 16 ++- .../core/src/single-graph/types/future.ts | 9 +- .../core/src/single-graph/types/guards.ts | 3 +- .../src/single-graph/types/recipeGraph.ts | 17 ++- .../src/single-graph/utils/adjacencyList.ts | 40 ++++++ .../test/single-graph/utils/adjacencyList.ts | 126 ++++++++++++++++++ .../test/single-graph/execute-useRecipe.ts | 66 ++++++++- 10 files changed, 380 insertions(+), 18 deletions(-) create mode 100644 packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index b3d73def7b..c6f49864b5 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -6,6 +6,7 @@ import { addEdge, AdjacencyList, constructEmptyAdjacencyList, + ensureVertex, getDependenciesFor, } from "../utils/adjacencyList"; @@ -36,8 +37,9 @@ export class RecipeGraph implements IRecipeGraph { public addRecipeVertex(depNode: RecipeVertex) { this.vertexes.set(depNode.id, depNode); + ensureVertex(this.adjacencyList, depNode.id); - if (depNode.type !== "DeployedContract") { + if (depNode.type !== "DeployedContract" && depNode.type !== "Virtual") { const futureArgs = depNode.args.filter(isDependable); for (const arg of futureArgs) { @@ -71,6 +73,15 @@ export class RecipeGraph implements IRecipeGraph { }); } } + + if (depNode.type === "Virtual") { + for (const afterVertex of depNode.after.filter(isDependable)) { + addEdge(this.adjacencyList, { + from: afterVertex.vertexId, + to: depNode.id, + }); + } + } } public getDependenciesForVertex({ id }: { id: number }): VertexDescriptor[] { diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index e0a6e0d40d..74f14c1c87 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -11,6 +11,7 @@ import type { ParameterValue, FutureDict, CallableFuture, + Virtual, } from "../types/future"; import { isArtifact, isCallable, isParameter } from "../types/guards"; import type { Artifact } from "../types/hardhat"; @@ -40,10 +41,8 @@ class ScopeStack { return this.scopes.pop(); } - public getScopedLabel(label: string | undefined) { - const joinedScopes = this.scopes.join("/"); - - return label === undefined ? joinedScopes : `${joinedScopes}/${label}`; + public getScopedLabel() { + return this.scopes.join("/"); } } @@ -86,6 +85,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { type: "ArtifactLibrary", artifact, args: options?.args ?? [], + scopeAdded: this.scopes.getScopedLabel(), }); return artifactContractFuture; @@ -106,6 +106,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { type: "HardhatLibrary", libraryName, args: options?.args ?? [], + scopeAdded: this.scopes.getScopedLabel(), }); return libraryFuture; @@ -136,6 +137,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { artifact, args: options?.args ?? [], libraries: options?.libraries ?? {}, + scopeAdded: this.scopes.getScopedLabel(), }); return artifactContractFuture; @@ -157,6 +159,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { contractName, args: options?.args ?? [], libraries: options?.libraries ?? {}, + scopeAdded: this.scopes.getScopedLabel(), }); return contractFuture; @@ -182,6 +185,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { type: "DeployedContract", address, abi, + scopeAdded: this.scopes.getScopedLabel(), }); return deployedFuture; @@ -239,6 +243,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { method: functionName, args: args ?? [], after: after ?? [], + scopeAdded: this.scopes.getScopedLabel(), }); return callFuture; @@ -249,7 +254,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: paramName, type: "parameter", subtype: "required", - scope: this.scopes.getScopedLabel(undefined), + scope: this.scopes.getScopedLabel(), _future: true, }; @@ -265,7 +270,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { type: "parameter", subtype: "optional", defaultValue, - scope: this.scopes.getScopedLabel(undefined), + scope: this.scopes.getScopedLabel(), _future: true, }; @@ -274,20 +279,55 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { public useRecipe(recipe: Recipe, options?: UseRecipeOptions): FutureDict { const useRecipeInvocationId = this.useRecipeInvocationCounter++; + const label = `${recipe.name}:${useRecipeInvocationId}`; - this.scopes.push(`${recipe.name}:${useRecipeInvocationId}`); + this.scopes.push(label); + const scopeLabel = this.scopes.getScopedLabel(); if (options !== undefined && options.parameters !== undefined) { - const parametersLabel = this.scopes.getScopedLabel(undefined); - - this.graph.registeredParameters[parametersLabel] = options.parameters; + this.graph.registeredParameters[scopeLabel] = options.parameters; } const result = recipe.steps(this); + const virtualVertex = this._createRecipeVirtualVertex(label); + this.scopes.pop(); - return result; + return { ...result, recipe: virtualVertex }; + } + + private _createRecipeVirtualVertex(label: string): Virtual { + const virtualFuture: Virtual = { + vertexId: this._resolveNextId(), + label, + type: "virtual", + _future: true, + }; + + const scopeLabel = this.scopes.getScopedLabel(); + + const afterVertexFutures = [...this.graph.vertexes.values()] + .filter((v) => v.scopeAdded === scopeLabel) + .map( + (v): RecipeFuture => ({ + vertexId: v.id, + label: v.label, + type: "contract", // TODO: this is a hack, lets add a future type for this sort of ellision + subtype: "artifact", + _future: true, + }) + ); + + this.graph.addRecipeVertex({ + id: virtualFuture.vertexId, + label, + type: "Virtual", + after: afterVertexFutures, + scopeAdded: scopeLabel, + }); + + return virtualFuture; } private _resolveNextId(): number { diff --git a/packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts new file mode 100644 index 0000000000..7a5a754193 --- /dev/null +++ b/packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts @@ -0,0 +1,46 @@ +import { RecipeGraph } from "../recipe/RecipeGraph"; +import { RecipeVertex } from "../types/recipeGraph"; +import { eliminate } from "../utils/adjacencyList"; + +/** + * Recipe graphs can have virtual vertex that represent the + * execution of all vertex in a recipe. + * + * We reduce the graph to remove the virtual nodes, by adding + * edges from any dependents to the virtual nodes dependents: + * + * A B A B + * │ │ │ │ + * └──►V◄──┘ ~ └─►C◄─┘ + * │ ~ + * ▼ + * C + * + * @param recipeGraph the recipe graph with recipe virtual vertexes + * @returns a reduced recipe graph + */ +export function reduceRecipeGraphByEliminatingVirtualVertexes( + recipeGraph: RecipeGraph +): RecipeGraph { + const virtualVertexes = [...recipeGraph.vertexes.values()].filter( + (v) => v.type === "Virtual" + ); + + for (const virtualVertex of virtualVertexes) { + eliminateVirtualVertexFrom(recipeGraph, virtualVertex); + } + + return recipeGraph; +} + +function eliminateVirtualVertexFrom( + recipeGraph: RecipeGraph, + virtualVertex: RecipeVertex +): void { + recipeGraph.adjacencyList = eliminate( + recipeGraph.adjacencyList, + virtualVertex.id + ); + + recipeGraph.vertexes.delete(virtualVertex.id); +} diff --git a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts index b74879fe92..a30a513772 100644 --- a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts @@ -26,6 +26,8 @@ import { } from "../types/recipeGraph"; import { clone } from "../utils/adjacencyList"; +import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./reduceRecipeGraphByEliminatingVirtualVertexes"; + export type TransformResult = | { _kind: "success"; @@ -55,9 +57,15 @@ export async function transformRecipeGraphToExecutionGraph( servicesOptions ); + const reducedRecipeGraph = + reduceRecipeGraphByEliminatingVirtualVertexes(recipeGraph); + const executionGraph: IExecutionGraph = await convertRecipeToExecution( - recipeGraph, - convertRecipeVertexToExecutionVertex({ services, graph: recipeGraph }) + reducedRecipeGraph, + convertRecipeVertexToExecutionVertex({ + services, + graph: reducedRecipeGraph, + }) ); return { _kind: "success", executionGraph }; @@ -96,6 +104,10 @@ function convertRecipeVertexToExecutionVertex( return convertHardhatLibraryToLibraryDeploy(recipeVertex, context); case "ArtifactLibrary": return convertArtifactLibraryToLibraryDeploy(recipeVertex, context); + case "Virtual": + throw new Error( + `Virtual vertex should be removed ${recipeVertex.id} (${recipeVertex.label})` + ); default: return assertRecipeVertexNotExpected(recipeVertex); } diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index 50ba4625e1..02bf2d036d 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -64,6 +64,13 @@ export interface OptionalParameter { _future: true; } +export interface Virtual { + vertexId: number; + label: string; + type: "virtual"; + _future: true; +} + export type ContractFuture = | HardhatContract | ArtifactContract @@ -73,7 +80,7 @@ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; export type CallableFuture = ContractFuture | LibraryFuture; -export type DependableFuture = CallableFuture | ContractCall; +export type DependableFuture = CallableFuture | ContractCall | Virtual; export type ParameterFuture = RequiredParameter | OptionalParameter; diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/types/guards.ts index c4ddadf8c8..b578e03ecb 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/types/guards.ts @@ -73,7 +73,8 @@ export function isDependable(possible: any): possible is DependableFuture { isFuture(possible) && (possible.type === "call" || possible.type === "contract" || - possible.type === "library") + possible.type === "library" || + possible.type === "virtual") ); } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 5e9ba89385..d23f04399a 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -24,6 +24,7 @@ export interface HardhatContractRecipeVertex { id: number; type: "HardhatContract"; label: string; + scopeAdded: string; contractName: string; args: Array; libraries: LibraryMap; @@ -33,6 +34,7 @@ export interface ArtifactContractRecipeVertex { id: number; type: "ArtifactContract"; label: string; + scopeAdded: string; artifact: Artifact; args: Array; libraries: LibraryMap; @@ -42,6 +44,7 @@ export interface DeployedContractRecipeVertex { id: number; type: "DeployedContract"; label: string; + scopeAdded: string; address: string; abi: any[]; } @@ -51,6 +54,7 @@ export interface HardhatLibraryRecipeVertex { type: "HardhatLibrary"; libraryName: string; label: string; + scopeAdded: string; args: Array; } @@ -58,6 +62,7 @@ export interface ArtifactLibraryRecipeVertex { id: number; type: "ArtifactLibrary"; label: string; + scopeAdded: string; artifact: Artifact; args: Array; } @@ -66,19 +71,29 @@ export interface CallRecipeVertex { id: number; type: "Call"; label: string; + scopeAdded: string; contract: CallableFuture; method: string; args: Array; after: RecipeFuture[]; } +export interface VirtualVertex { + id: number; + type: "Virtual"; + label: string; + scopeAdded: string; + after: RecipeFuture[]; +} + export type RecipeVertex = | HardhatContractRecipeVertex | ArtifactContractRecipeVertex | DeployedContractRecipeVertex | HardhatLibraryRecipeVertex | ArtifactLibraryRecipeVertex - | CallRecipeVertex; + | CallRecipeVertex + | VirtualVertex; export interface ContractOptions { args?: Array; diff --git a/packages/core/src/single-graph/utils/adjacencyList.ts b/packages/core/src/single-graph/utils/adjacencyList.ts index 663fc71468..c7b707d1a2 100644 --- a/packages/core/src/single-graph/utils/adjacencyList.ts +++ b/packages/core/src/single-graph/utils/adjacencyList.ts @@ -17,6 +17,12 @@ export function addEdge( adjacencyList.set(from, toSet); } +export function ensureVertex(adjacencyList: AdjacencyList, v: number) { + const toSet = adjacencyList.get(v) ?? new Set(); + + adjacencyList.set(v, toSet); +} + export function getDependenciesFor(adjacencyList: AdjacencyList, to: number) { return [...adjacencyList.entries()] .filter(([_from, toSet]) => toSet.has(to)) @@ -56,3 +62,37 @@ export function topologicalSort(adjacencyList: AdjacencyList): number[] { return order; } + +/** + * Remove a vertex, transfering its dependencies to its dependents. + * @param adjacencyList the adjacency list + * @param v the vertex to eliminate + * @returns an adjacency list without the vertex + */ +export function eliminate( + adjacencyList: AdjacencyList, + v: number +): AdjacencyList { + const updatedList = clone(adjacencyList); + + const dependencies = getDependenciesFor(updatedList, v); + const dependents = updatedList.get(v) ?? new Set(); + + updatedList.delete(v); + + for (const dependency of dependencies) { + const toSet = updatedList.get(dependency); + + if (toSet === undefined) { + throw new Error("Dependency sets should be defined"); + } + + const setWithoutV = new Set([...toSet].filter((n) => n !== v)); + + const updatedSet = new Set([...setWithoutV, ...dependents]); + + updatedList.set(dependency, updatedSet); + } + + return updatedList; +} diff --git a/packages/core/test/single-graph/utils/adjacencyList.ts b/packages/core/test/single-graph/utils/adjacencyList.ts index fc9c32f651..2e02717c7d 100644 --- a/packages/core/test/single-graph/utils/adjacencyList.ts +++ b/packages/core/test/single-graph/utils/adjacencyList.ts @@ -6,11 +6,15 @@ import { getDependenciesFor, clone, topologicalSort, + eliminate, + ensureVertex, } from "../../../src/single-graph/utils/adjacencyList"; describe("Adjacency list", () => { it("should allow looking up deps for a two node graph", () => { const adjacencyList = constructEmptyAdjacencyList(); + ensureVertex(adjacencyList, 0); + ensureVertex(adjacencyList, 1); addEdge(adjacencyList, { from: 0, to: 1 }); @@ -19,6 +23,9 @@ describe("Adjacency list", () => { it("should allow looking up single deps for a three node graph", () => { const adjacencyList = constructEmptyAdjacencyList(); + ensureVertex(adjacencyList, 0); + ensureVertex(adjacencyList, 1); + ensureVertex(adjacencyList, 2); addEdge(adjacencyList, { from: 0, to: 1 }); addEdge(adjacencyList, { from: 1, to: 2 }); @@ -28,6 +35,9 @@ describe("Adjacency list", () => { it("should allow looking up multiple deps for a three node graph", () => { const adjacencyList = constructEmptyAdjacencyList(); + ensureVertex(adjacencyList, 0); + ensureVertex(adjacencyList, 1); + ensureVertex(adjacencyList, 2); addEdge(adjacencyList, { from: 0, to: 2 }); addEdge(adjacencyList, { from: 1, to: 2 }); @@ -37,6 +47,9 @@ describe("Adjacency list", () => { it("should be clonable", () => { const adjacencyList = constructEmptyAdjacencyList(); + ensureVertex(adjacencyList, 0); + ensureVertex(adjacencyList, 1); + ensureVertex(adjacencyList, 2); addEdge(adjacencyList, { from: 0, to: 2 }); addEdge(adjacencyList, { from: 1, to: 2 }); @@ -48,6 +61,9 @@ describe("Adjacency list", () => { it("should do a topological sort", () => { const adjacencyList = constructEmptyAdjacencyList(); + ensureVertex(adjacencyList, 0); + ensureVertex(adjacencyList, 1); + ensureVertex(adjacencyList, 2); addEdge(adjacencyList, { from: 0, to: 2 }); addEdge(adjacencyList, { from: 1, to: 2 }); @@ -56,4 +72,114 @@ describe("Adjacency list", () => { assert.deepStrictEqual(order, [1, 0, 2]); }); + + describe("eliminate", () => { + it("should operate on a vertex with one out bound", () => { + const adjacencyList = constructAdjacencyList([ + { from: 0, to: 1 }, + { from: 1, to: 2 }, + ]); + + const updated = eliminate(adjacencyList, 1); + + assert.deepStrictEqual( + updated, + buildAdjacencyListFrom({ + 0: [2], + 2: [], + }) + ); + }); + + it("should operate on vertex with one dependent", () => { + const adjacencyList = constructAdjacencyList([ + { from: 0, to: 1 }, + { from: 2, to: 3 }, + ]); + + const updated = eliminate(adjacencyList, 2); + + assert.deepStrictEqual( + updated, + buildAdjacencyListFrom({ + 0: [1], + 1: [], + 3: [], + }) + ); + }); + + it("should operate on vertex with one dependency", () => { + const adjacencyList = constructAdjacencyList([ + { from: 0, to: 1 }, + { from: 2, to: 3 }, + ]); + + const updated = eliminate(adjacencyList, 3); + + assert.deepStrictEqual( + updated, + buildAdjacencyListFrom({ + 0: [1], + 1: [], + 2: [], + }) + ); + }); + + it("should operate on vertexes with many dependency", () => { + const adjacencyList = constructAdjacencyList([ + { from: 0, to: 3 }, + { from: 1, to: 3 }, + { from: 2, to: 3 }, + { from: 3, to: 4 }, + { from: 3, to: 5 }, + { from: 3, to: 6 }, + ]); + + const updated = eliminate(adjacencyList, 3); + + assert.deepStrictEqual( + updated, + buildAdjacencyListFrom({ + 0: [4, 5, 6], + 1: [4, 5, 6], + 2: [4, 5, 6], + 4: [], + 5: [], + 6: [], + }) + ); + }); + }); }); + +function constructAdjacencyList(edges: Array<{ from: number; to: number }>) { + const adjacencyList = constructEmptyAdjacencyList(); + + const vertexes = edges.reduce((acc, { from, to }) => { + acc.add(from); + acc.add(to); + return acc; + }, new Set()); + + for (const vertex of vertexes) { + ensureVertex(adjacencyList, vertex); + } + + for (const { from, to } of edges) { + addEdge(adjacencyList, { from, to }); + } + + return adjacencyList; +} + +function buildAdjacencyListFrom(literal: { [key: number]: number[] }) { + const expectedMap = new Map>(); + + for (const [key, list] of Object.entries(literal)) { + expectedMap.set(parseInt(key, 10), new Set(list)); + } + + return expectedMap; +} diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts index becfecccc4..c13619fc96 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -101,7 +101,7 @@ describe("useRecipe", function () { }); describe("passing futures into and out of recipes", () => { - it("using useRecipe", async function () { + it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); const addSecondAndThirdEntryRecipe = buildRecipeSingleGraph( @@ -164,5 +164,69 @@ describe("useRecipe", function () { ["first", "second", "third", "fourth"] ); }); + + it("should allow ordering based on the recipe overall", async function () { + await this.hre.run("compile", { quiet: true }); + + const addSecondAndThirdEntryRecipe = buildRecipeSingleGraph( + "ThirdPartyRecipe", + (m: IRecipeGraphBuilder) => { + const trace = m.getParam("Trace"); + + const secondCall = m.call(trace, "addEntry", { + args: ["second"], + }); + + m.call(trace, "addEntry", { + args: ["third"], + after: [secondCall], + }); + + return { secondCall }; + } + ); + + const userRecipe = buildRecipeSingleGraph( + "UserRecipe", + (m: IRecipeGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); + + const { recipe } = m.useRecipe(addSecondAndThirdEntryRecipe, { + parameters: { + Trace: trace, + }, + }); + + m.call(trace, "addEntry", { + args: ["fourth"], + after: [recipe], + }); + + return { trace }; + } + ); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: {}, + }); + + await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + const entry4 = await result.trace.entries(3); + + assert.deepStrictEqual( + [entry1, entry2, entry3, entry4], + ["first", "second", "third", "fourth"] + ); + }); }); }); From b11e792f8b5d46fa2a767f13ee8a2dba4bb2f51b Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 Aug 2022 14:19:25 +0100 Subject: [PATCH 0060/1302] refactor: simplify recipe graph api --- .../src/single-graph/recipe/RecipeGraph.ts | 75 ---------- .../single-graph/recipe/RecipeGraphBuilder.ts | 72 ++++++++- .../src/single-graph/types/recipeGraph.ts | 10 -- packages/core/test/single-graph/recipes.ts | 137 +++++++++++------- 4 files changed, 145 insertions(+), 149 deletions(-) diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index c6f49864b5..3d5d237c0a 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,13 +1,8 @@ import { RecipeFuture } from "../types/future"; -import { VertexDescriptor } from "../types/graph"; -import { isDependable } from "../types/guards"; import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; import { - addEdge, AdjacencyList, constructEmptyAdjacencyList, - ensureVertex, - getDependenciesFor, } from "../utils/adjacencyList"; export class RecipeGraph implements IRecipeGraph { @@ -22,74 +17,4 @@ export class RecipeGraph implements IRecipeGraph { this.vertexes = new Map(); this.registeredParameters = {}; } - - public vertexSize(): number { - return this.vertexes.size; - } - - public getRecipeVertexByLabel(label: string): RecipeVertex | undefined { - return Array.from(this.vertexes.values()).find((n) => n.label === label); - } - - public getRecipeVertexById(id: number): RecipeVertex | undefined { - return this.vertexes.get(id); - } - - public addRecipeVertex(depNode: RecipeVertex) { - this.vertexes.set(depNode.id, depNode); - ensureVertex(this.adjacencyList, depNode.id); - - if (depNode.type !== "DeployedContract" && depNode.type !== "Virtual") { - const futureArgs = depNode.args.filter(isDependable); - - for (const arg of futureArgs) { - addEdge(this.adjacencyList, { from: arg.vertexId, to: depNode.id }); - } - } - - if ( - depNode.type === "HardhatContract" || - depNode.type === "ArtifactContract" - ) { - const futureLibraries = Object.values(depNode.libraries).filter( - isDependable - ); - - for (const lib of futureLibraries) { - addEdge(this.adjacencyList, { from: lib.vertexId, to: depNode.id }); - } - } - - if (depNode.type === "Call") { - addEdge(this.adjacencyList, { - from: depNode.contract.vertexId, - to: depNode.id, - }); - - for (const afterVertex of depNode.after.filter(isDependable)) { - addEdge(this.adjacencyList, { - from: afterVertex.vertexId, - to: depNode.id, - }); - } - } - - if (depNode.type === "Virtual") { - for (const afterVertex of depNode.after.filter(isDependable)) { - addEdge(this.adjacencyList, { - from: afterVertex.vertexId, - to: depNode.id, - }); - } - } - } - - public getDependenciesForVertex({ id }: { id: number }): VertexDescriptor[] { - const depIds = getDependenciesFor(this.adjacencyList, id); - - return depIds - .map((depId) => this.vertexes.get(depId)) - .filter((nodeDesc): nodeDesc is RecipeVertex => nodeDesc !== undefined) - .map((vertex) => ({ id: vertex.id, label: vertex.label })); - } } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 74f14c1c87..bf1b5a0db5 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -13,7 +13,12 @@ import type { CallableFuture, Virtual, } from "../types/future"; -import { isArtifact, isCallable, isParameter } from "../types/guards"; +import { + isArtifact, + isCallable, + isDependable, + isParameter, +} from "../types/guards"; import type { Artifact } from "../types/hardhat"; import { ContractOptions, @@ -21,8 +26,10 @@ import { IRecipeGraphBuilder, Recipe, RecipeGraphBuilderOptions, + RecipeVertex, UseRecipeOptions, } from "../types/recipeGraph"; +import { addEdge, ensureVertex } from "../utils/adjacencyList"; import { RecipeGraph } from "./RecipeGraph"; @@ -79,7 +86,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: artifactContractFuture.vertexId, label: libraryName, type: "ArtifactLibrary", @@ -100,7 +107,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: libraryFuture.vertexId, label: libraryName, type: "HardhatLibrary", @@ -130,7 +137,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: artifactContractFuture.vertexId, label: contractName, type: "ArtifactContract", @@ -152,7 +159,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: contractFuture.vertexId, label: contractName, type: "HardhatContract", @@ -179,7 +186,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: deployedFuture.vertexId, label: contractName, type: "DeployedContract", @@ -235,7 +242,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { ); } - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: callFuture.vertexId, label: callFuture.label, type: "Call", @@ -319,7 +326,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }) ); - this.graph.addRecipeVertex({ + RecipeGraphBuilder._addRecipeVertex(this.graph, { id: virtualFuture.vertexId, label, type: "Virtual", @@ -333,4 +340,53 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { private _resolveNextId(): number { return this.idCounter++; } + + private static _addRecipeVertex(graph: RecipeGraph, depNode: RecipeVertex) { + graph.vertexes.set(depNode.id, depNode); + ensureVertex(graph.adjacencyList, depNode.id); + + if (depNode.type !== "DeployedContract" && depNode.type !== "Virtual") { + const futureArgs = depNode.args.filter(isDependable); + + for (const arg of futureArgs) { + addEdge(graph.adjacencyList, { from: arg.vertexId, to: depNode.id }); + } + } + + if ( + depNode.type === "HardhatContract" || + depNode.type === "ArtifactContract" + ) { + const futureLibraries = Object.values(depNode.libraries).filter( + isDependable + ); + + for (const lib of futureLibraries) { + addEdge(graph.adjacencyList, { from: lib.vertexId, to: depNode.id }); + } + } + + if (depNode.type === "Call") { + addEdge(graph.adjacencyList, { + from: depNode.contract.vertexId, + to: depNode.id, + }); + + for (const afterVertex of depNode.after.filter(isDependable)) { + addEdge(graph.adjacencyList, { + from: afterVertex.vertexId, + to: depNode.id, + }); + } + } + + if (depNode.type === "Virtual") { + for (const afterVertex of depNode.after.filter(isDependable)) { + addEdge(graph.adjacencyList, { + from: afterVertex.vertexId, + to: depNode.id, + }); + } + } + } } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index d23f04399a..ffa7b65cb3 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -112,16 +112,6 @@ export interface IRecipeGraph { registeredParameters: { [key: string]: { [key: string]: string | number | RecipeFuture }; }; - - vertexSize: () => number; - addRecipeVertex: (node: RecipeVertex) => void; - getRecipeVertexByLabel: (label: string) => RecipeVertex | undefined; - getRecipeVertexById: (id: number) => RecipeVertex | undefined; - getDependenciesForVertex: ({ - id, - }: { - id: number; - }) => Array<{ id: number; label: string }>; } export interface IRecipeGraphBuilder { diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index f1faaa341c..9fb22b1a00 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -1,5 +1,7 @@ import { assert } from "chai"; +import { RecipeGraph } from "../../src/single-graph//recipe/RecipeGraph"; +import { VertexDescriptor } from "../../src/single-graph//types/graph"; import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; import { generateRecipeGraphFrom } from "../../src/single-graph/recipe/generateRecipeGraphFrom"; import { @@ -13,7 +15,9 @@ import { Artifact } from "../../src/single-graph/types/hardhat"; import type { IRecipeGraph, IRecipeGraphBuilder, + RecipeVertex, } from "../../src/single-graph/types/recipeGraph"; +import { getDependenciesFor } from "../../src/single-graph/utils/adjacencyList"; describe("Recipes", function () { describe("single contract", () => { @@ -38,30 +42,30 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexSize(), 1); + assert.equal(recipeGraph.vertexes.size, 1); }); it("should have the contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Example"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); assert.isDefined(depNode); assert.equal(depNode?.label, "Example"); }); it("should show no dependencies for the contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Example"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node as empty", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Example"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -101,39 +105,39 @@ describe("Recipes", function () { }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexSize(), 2); + assert.equal(recipeGraph.vertexes.size, 2); }); it("should have both contract nodes", () => { - const depNode1 = recipeGraph.getRecipeVertexByLabel("Example1"); + const depNode1 = getRecipeVertexByLabel(recipeGraph, "Example1"); assert.isDefined(depNode1); assert.equal(depNode1?.label, "Example1"); - const depNode2 = recipeGraph.getRecipeVertexByLabel("Example2"); + const depNode2 = getRecipeVertexByLabel(recipeGraph, "Example2"); assert.isDefined(depNode2); assert.equal(depNode2?.label, "Example2"); }); it("should show no dependencies either contract node", () => { - const depNode1 = recipeGraph.getRecipeVertexByLabel("Example1"); + const depNode1 = getRecipeVertexByLabel(recipeGraph, "Example1"); if (depNode1 === undefined) { return assert.isDefined(depNode1); } - const deps1 = recipeGraph.getDependenciesForVertex(depNode1); + const deps1 = getDependenciesForVertex(recipeGraph, depNode1); assert.deepStrictEqual(deps1, []); - const depNode2 = recipeGraph.getRecipeVertexByLabel("Example2"); + const depNode2 = getRecipeVertexByLabel(recipeGraph, "Example2"); if (depNode2 === undefined) { return assert.isDefined(depNode1); } - const deps2 = recipeGraph.getDependenciesForVertex(depNode2); + const deps2 = getDependenciesForVertex(recipeGraph, depNode2); assert.deepStrictEqual(deps2, []); }); @@ -166,30 +170,30 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexSize(), 1); + assert.equal(recipeGraph.vertexes.size, 1); }); it("should have the contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); assert.isDefined(depNode); assert.equal(depNode?.label, "Token"); }); it("should show no dependencies for the contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -232,11 +236,11 @@ describe("Recipes", function () { }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexSize(), 2); + assert.equal(recipeGraph.vertexes.size, 2); }); it("should have the contract node A", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("A"); + const depNode = getRecipeVertexByLabel(recipeGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -246,7 +250,7 @@ describe("Recipes", function () { }); it("should have the contract node B", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("B"); + const depNode = getRecipeVertexByLabel(recipeGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -257,31 +261,31 @@ describe("Recipes", function () { }); it("should show no dependencies for the contract node A", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("A"); + const depNode = getRecipeVertexByLabel(recipeGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show one dependency on A for the contract node B", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("B"); + const depNode = getRecipeVertexByLabel(recipeGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, [{ id: 0, label: "A" }]); }); it("should record the argument list for the contract node A as empty", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("A"); + const depNode = getRecipeVertexByLabel(recipeGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -322,11 +326,11 @@ describe("Recipes", function () { }); it("should have three nodes", () => { - assert.equal(recipeGraph.vertexSize(), 3); + assert.equal(recipeGraph.vertexes.size, 3); }); it("should have the contract node Token", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -336,7 +340,7 @@ describe("Recipes", function () { }); it("should have the contract node Exchange", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -347,7 +351,7 @@ describe("Recipes", function () { }); it("should have the call node Exchange/addToken", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -358,37 +362,37 @@ describe("Recipes", function () { }); it("should show no dependencies for the contract node Token", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show no dependencies for the contract node Exchange", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show two dependencies for the call node Exchange/addToken", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, [ { @@ -400,7 +404,7 @@ describe("Recipes", function () { }); it("should record the argument list for the contract node Token as empty", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Token"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -414,7 +418,7 @@ describe("Recipes", function () { }); it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -428,7 +432,7 @@ describe("Recipes", function () { }); it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Exchange/addToken"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -473,11 +477,11 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexSize(), 1); + assert.equal(recipeGraph.vertexes.size, 1); }); it("should have the deployed contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("UniswapRouter"); + const depNode = getRecipeVertexByLabel(recipeGraph, "UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -488,13 +492,13 @@ describe("Recipes", function () { }); it("should show no dependencies for the deployed contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("UniswapRouter"); + const depNode = getRecipeVertexByLabel(recipeGraph, "UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); @@ -529,11 +533,11 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexSize(), 1); + assert.equal(recipeGraph.vertexes.size, 1); }); it("should have the artifact contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -544,19 +548,19 @@ describe("Recipes", function () { }); it("should show no dependencies for the artifact contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the artifact contract node", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Foo"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -603,11 +607,11 @@ describe("Recipes", function () { }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexSize(), 2); + assert.equal(recipeGraph.vertexes.size, 2); }); it("should have the library node SafeMath", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); + const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -618,7 +622,7 @@ describe("Recipes", function () { }); it("should have the contract node Contract", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Contract"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -629,31 +633,31 @@ describe("Recipes", function () { }); it("should show no dependencies for the library node SafeMath", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); + const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("Contract"); + const depNode = getRecipeVertexByLabel(recipeGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = recipeGraph.getDependenciesForVertex(depNode); + const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, [{ id: 0, label: "SafeMath" }]); }); it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = recipeGraph.getRecipeVertexByLabel("SafeMath"); + const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -712,7 +716,28 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexSize(), 1); + assert.equal(recipeGraph.vertexes.size, 1); }); }); }); + +function getRecipeVertexByLabel( + recipeGraph: RecipeGraph, + label: string +): RecipeVertex | undefined { + return Array.from(recipeGraph.vertexes.values()).find( + (n) => n.label === label + ); +} + +function getDependenciesForVertex( + recipeGraph: RecipeGraph, + { id }: { id: number } +): VertexDescriptor[] { + const depIds = getDependenciesFor(recipeGraph.adjacencyList, id); + + return depIds + .map((depId) => recipeGraph.vertexes.get(depId)) + .filter((nodeDesc): nodeDesc is RecipeVertex => nodeDesc !== undefined) + .map((vertex) => ({ id: vertex.id, label: vertex.label })); +} From 4b494e870de2013cf8f8c4a2a95b1d71d8a403dc Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 Aug 2022 15:16:01 +0100 Subject: [PATCH 0061/1302] refactor: restructure files --- packages/core/src/Ignition.ts | 6 ++-- .../single-graph/execution/ExecutionGraph.ts | 17 ++------- .../src/single-graph/execution/execute.ts | 4 +-- packages/core/src/single-graph/graph/Graph.ts | 13 +++++++ .../{utils => graph}/adjacencyList.ts | 2 +- .../generateRecipeGraphFrom.ts | 3 +- ...RecipeGraphByEliminatingVirtualVertexes.ts | 2 +- .../transformRecipeGraphToExecutionGraph.ts | 4 +-- .../src/single-graph/recipe/RecipeGraph.ts | 15 +++----- .../single-graph/recipe/RecipeGraphBuilder.ts | 35 +++++-------------- .../src/single-graph/recipe/ScopeStack.ts | 19 ++++++++++ .../src/single-graph/types/executionGraph.ts | 3 +- packages/core/src/single-graph/types/graph.ts | 7 ++++ .../src/single-graph/types/recipeGraph.ts | 3 +- .../single-graph/{types => utils}/guards.ts | 6 ++-- .../{utils => graph}/adjacencyList.ts | 2 +- packages/core/test/single-graph/recipes.ts | 18 +++++----- 17 files changed, 80 insertions(+), 79 deletions(-) create mode 100644 packages/core/src/single-graph/graph/Graph.ts rename packages/core/src/single-graph/{utils => graph}/adjacencyList.ts (97%) rename packages/core/src/single-graph/{recipe => process}/generateRecipeGraphFrom.ts (87%) rename packages/core/src/single-graph/{transform => process}/reduceRecipeGraphByEliminatingVirtualVertexes.ts (95%) rename packages/core/src/single-graph/{transform => process}/transformRecipeGraphToExecutionGraph.ts (98%) create mode 100644 packages/core/src/single-graph/recipe/ScopeStack.ts rename packages/core/src/single-graph/{types => utils}/guards.ts (95%) rename packages/core/test/single-graph/{utils => graph}/adjacencyList.ts (98%) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 15bbbee2ee..eb0a4fdafd 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -15,10 +15,10 @@ import { Providers } from "./providers"; import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; import { UserRecipe } from "./recipes/UserRecipe"; import { execute } from "./single-graph/execution/execute"; -import { generateRecipeGraphFrom } from "./single-graph/recipe/generateRecipeGraphFrom"; -import { transformRecipeGraphToExecutionGraph } from "./single-graph/transform/transformRecipeGraphToExecutionGraph"; +import { generateRecipeGraphFrom } from "./single-graph/process/generateRecipeGraphFrom"; +import { transformRecipeGraphToExecutionGraph } from "./single-graph/process/transformRecipeGraphToExecutionGraph"; import { DependableFuture, FutureDict } from "./single-graph/types/future"; -import { isDependable } from "./single-graph/types/guards"; +import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/single-graph/execution/ExecutionGraph.ts b/packages/core/src/single-graph/execution/ExecutionGraph.ts index 8689b1bde7..1b24910c7d 100644 --- a/packages/core/src/single-graph/execution/ExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/ExecutionGraph.ts @@ -1,15 +1,4 @@ -import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; -import { - AdjacencyList, - constructEmptyAdjacencyList, -} from "../utils/adjacencyList"; +import { Graph } from "../graph/Graph"; +import { ExecutionVertex } from "../types/executionGraph"; -export class ExecutionGraph implements IExecutionGraph { - public adjacencyList: AdjacencyList; - public vertexes: Map; - - constructor() { - this.adjacencyList = constructEmptyAdjacencyList(); - this.vertexes = new Map(); - } -} +export class ExecutionGraph extends Graph {} diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index 298031a52a..faee257d42 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -1,6 +1,7 @@ import { Journal } from "../../journal/types"; import { Providers } from "../../providers"; import { Services } from "../../services/types"; +import { topologicalSort } from "../graph/adjacencyList"; import { createServices } from "../services/createServices"; import { ArgValue, @@ -11,8 +12,7 @@ import { IExecutionGraph, LibraryDeploy, } from "../types/executionGraph"; -import { isDependable } from "../types/guards"; -import { topologicalSort } from "../utils/adjacencyList"; +import { isDependable } from "../utils/guards"; export type ExecuteResult = | { diff --git a/packages/core/src/single-graph/graph/Graph.ts b/packages/core/src/single-graph/graph/Graph.ts new file mode 100644 index 0000000000..2f3fc3b6c8 --- /dev/null +++ b/packages/core/src/single-graph/graph/Graph.ts @@ -0,0 +1,13 @@ +import { AdjacencyList, IGraph } from "../types/graph"; + +import { constructEmptyAdjacencyList } from "./adjacencyList"; + +export class Graph implements IGraph { + public adjacencyList: AdjacencyList; + public vertexes: Map; + + constructor() { + this.adjacencyList = constructEmptyAdjacencyList(); + this.vertexes = new Map(); + } +} diff --git a/packages/core/src/single-graph/utils/adjacencyList.ts b/packages/core/src/single-graph/graph/adjacencyList.ts similarity index 97% rename from packages/core/src/single-graph/utils/adjacencyList.ts rename to packages/core/src/single-graph/graph/adjacencyList.ts index c7b707d1a2..4c5f5cec47 100644 --- a/packages/core/src/single-graph/utils/adjacencyList.ts +++ b/packages/core/src/single-graph/graph/adjacencyList.ts @@ -1,6 +1,6 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; -export type AdjacencyList = Map>; +import { AdjacencyList } from "../types/graph"; export function constructEmptyAdjacencyList(): AdjacencyList { return new Map>(); diff --git a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts b/packages/core/src/single-graph/process/generateRecipeGraphFrom.ts similarity index 87% rename from packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts rename to packages/core/src/single-graph/process/generateRecipeGraphFrom.ts index 982d7069c0..afd680b3a7 100644 --- a/packages/core/src/single-graph/recipe/generateRecipeGraphFrom.ts +++ b/packages/core/src/single-graph/process/generateRecipeGraphFrom.ts @@ -1,3 +1,4 @@ +import { RecipeGraphBuilder } from "../recipe/RecipeGraphBuilder"; import { FutureDict } from "../types/future"; import type { RecipeGraphBuilderOptions, @@ -5,8 +6,6 @@ import type { IRecipeGraph, } from "../types/recipeGraph"; -import { RecipeGraphBuilder } from "./RecipeGraphBuilder"; - export function generateRecipeGraphFrom( recipe: Recipe, builderOptions: RecipeGraphBuilderOptions diff --git a/packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/single-graph/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts similarity index 95% rename from packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts rename to packages/core/src/single-graph/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts index 7a5a754193..5d0e8981c6 100644 --- a/packages/core/src/single-graph/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/single-graph/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts @@ -1,6 +1,6 @@ +import { eliminate } from "../graph/adjacencyList"; import { RecipeGraph } from "../recipe/RecipeGraph"; import { RecipeVertex } from "../types/recipeGraph"; -import { eliminate } from "../utils/adjacencyList"; /** * Recipe graphs can have virtual vertex that represent the diff --git a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts similarity index 98% rename from packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts rename to packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts index a30a513772..bc31a1a5e9 100644 --- a/packages/core/src/single-graph/transform/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts @@ -3,6 +3,7 @@ import { Providers } from "../../providers"; import { Services } from "../../services/types"; import { Artifact } from "../../types"; import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { clone } from "../graph/adjacencyList"; import { createServices } from "../services/createServices"; import { ContractCall, @@ -13,7 +14,6 @@ import { LibraryDeploy, } from "../types/executionGraph"; import { RecipeFuture } from "../types/future"; -import { isFuture } from "../types/guards"; import { ArtifactContractRecipeVertex, ArtifactLibraryRecipeVertex, @@ -24,7 +24,7 @@ import { IRecipeGraph, RecipeVertex, } from "../types/recipeGraph"; -import { clone } from "../utils/adjacencyList"; +import { isFuture } from "../utils/guards"; import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./reduceRecipeGraphByEliminatingVirtualVertexes"; diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index 3d5d237c0a..a3e7a3b837 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,20 +1,15 @@ +import { Graph } from "../graph/Graph"; import { RecipeFuture } from "../types/future"; -import { IRecipeGraph, RecipeVertex } from "../types/recipeGraph"; -import { - AdjacencyList, - constructEmptyAdjacencyList, -} from "../utils/adjacencyList"; +import { RecipeVertex } from "../types/recipeGraph"; -export class RecipeGraph implements IRecipeGraph { - public adjacencyList: AdjacencyList; - public vertexes: Map; +export class RecipeGraph extends Graph { public registeredParameters: { [key: string]: { [key: string]: string | number | RecipeFuture }; }; constructor() { - this.adjacencyList = constructEmptyAdjacencyList(); - this.vertexes = new Map(); + super(); + this.registeredParameters = {}; } } diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index bf1b5a0db5..45e543b5e7 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -1,3 +1,4 @@ +import { addEdge, ensureVertex } from "../graph/adjacencyList"; import type { RecipeFuture, HardhatContract, @@ -13,12 +14,6 @@ import type { CallableFuture, Virtual, } from "../types/future"; -import { - isArtifact, - isCallable, - isDependable, - isParameter, -} from "../types/guards"; import type { Artifact } from "../types/hardhat"; import { ContractOptions, @@ -29,29 +24,15 @@ import { RecipeVertex, UseRecipeOptions, } from "../types/recipeGraph"; -import { addEdge, ensureVertex } from "../utils/adjacencyList"; +import { + isArtifact, + isCallable, + isDependable, + isParameter, +} from "../utils/guards"; import { RecipeGraph } from "./RecipeGraph"; - -class ScopeStack { - private scopes: string[]; - - constructor() { - this.scopes = []; - } - - public push(scopeName: string): void { - this.scopes.push(scopeName); - } - - public pop(): string | undefined { - return this.scopes.pop(); - } - - public getScopedLabel() { - return this.scopes.join("/"); - } -} +import { ScopeStack } from "./ScopeStack"; export class RecipeGraphBuilder implements IRecipeGraphBuilder { public chainId: number; diff --git a/packages/core/src/single-graph/recipe/ScopeStack.ts b/packages/core/src/single-graph/recipe/ScopeStack.ts new file mode 100644 index 0000000000..491b6b633e --- /dev/null +++ b/packages/core/src/single-graph/recipe/ScopeStack.ts @@ -0,0 +1,19 @@ +export class ScopeStack { + private scopes: string[]; + + constructor() { + this.scopes = []; + } + + public push(scopeName: string): void { + this.scopes.push(scopeName); + } + + public pop(): string | undefined { + return this.scopes.pop(); + } + + public getScopedLabel() { + return this.scopes.join("/"); + } +} diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts index 4d230a6fbd..d6edf6883e 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -1,6 +1,5 @@ -import { AdjacencyList } from "../utils/adjacencyList"; - import { RecipeFuture } from "./future"; +import { AdjacencyList } from "./graph"; import { Artifact } from "./hardhat"; import { LibraryMap } from "./recipeGraph"; diff --git a/packages/core/src/single-graph/types/graph.ts b/packages/core/src/single-graph/types/graph.ts index a5dea8d6cb..e06e1dfdbe 100644 --- a/packages/core/src/single-graph/types/graph.ts +++ b/packages/core/src/single-graph/types/graph.ts @@ -2,3 +2,10 @@ export interface VertexDescriptor { id: number; label: string; } + +export type AdjacencyList = Map>; + +export interface IGraph { + adjacencyList: AdjacencyList; + vertexes: Map; +} diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index ffa7b65cb3..0711b46b92 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -1,5 +1,3 @@ -import { AdjacencyList } from "../utils/adjacencyList"; - import { ArtifactContract, ArtifactLibrary, @@ -14,6 +12,7 @@ import { RequiredParameter, CallableFuture, } from "./future"; +import { AdjacencyList } from "./graph"; import { Artifact } from "./hardhat"; export interface LibraryMap { diff --git a/packages/core/src/single-graph/types/guards.ts b/packages/core/src/single-graph/utils/guards.ts similarity index 95% rename from packages/core/src/single-graph/types/guards.ts rename to packages/core/src/single-graph/utils/guards.ts index b578e03ecb..0d39a8f202 100644 --- a/packages/core/src/single-graph/types/guards.ts +++ b/packages/core/src/single-graph/utils/guards.ts @@ -4,8 +4,8 @@ import type { OptionalParameter, RecipeFuture, RequiredParameter, -} from "./future"; -import { Artifact } from "./hardhat"; +} from "../types/future"; +import { Artifact } from "../types/hardhat"; import type { RecipeVertex, HardhatContractRecipeVertex, @@ -14,7 +14,7 @@ import type { CallRecipeVertex, HardhatLibraryRecipeVertex, ArtifactLibraryRecipeVertex, -} from "./recipeGraph"; +} from "../types/recipeGraph"; export function isArtifact(artifact: any): artifact is Artifact { return ( diff --git a/packages/core/test/single-graph/utils/adjacencyList.ts b/packages/core/test/single-graph/graph/adjacencyList.ts similarity index 98% rename from packages/core/test/single-graph/utils/adjacencyList.ts rename to packages/core/test/single-graph/graph/adjacencyList.ts index 2e02717c7d..7b75f410b6 100644 --- a/packages/core/test/single-graph/utils/adjacencyList.ts +++ b/packages/core/test/single-graph/graph/adjacencyList.ts @@ -8,7 +8,7 @@ import { topologicalSort, eliminate, ensureVertex, -} from "../../../src/single-graph/utils/adjacencyList"; +} from "../../../src/single-graph/graph/adjacencyList"; describe("Adjacency list", () => { it("should allow looking up deps for a two node graph", () => { diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index 9fb22b1a00..7b92cf0094 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -2,22 +2,22 @@ import { assert } from "chai"; import { RecipeGraph } from "../../src/single-graph//recipe/RecipeGraph"; import { VertexDescriptor } from "../../src/single-graph//types/graph"; +import { getDependenciesFor } from "../../src/single-graph/graph/adjacencyList"; +import { generateRecipeGraphFrom } from "../../src/single-graph/process/generateRecipeGraphFrom"; import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; -import { generateRecipeGraphFrom } from "../../src/single-graph/recipe/generateRecipeGraphFrom"; -import { - isArtifactContract, - isCall, - isDeployedContract, - isHardhatContract, - isHardhatLibrary, -} from "../../src/single-graph/types/guards"; import { Artifact } from "../../src/single-graph/types/hardhat"; import type { IRecipeGraph, IRecipeGraphBuilder, RecipeVertex, } from "../../src/single-graph/types/recipeGraph"; -import { getDependenciesFor } from "../../src/single-graph/utils/adjacencyList"; +import { + isArtifactContract, + isCall, + isDeployedContract, + isHardhatContract, + isHardhatLibrary, +} from "../../src/single-graph/utils/guards"; describe("Recipes", function () { describe("single contract", () => { From 9468300164e0c783b19c92803fe89e8bcd35b52f Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 Aug 2022 15:37:53 +0100 Subject: [PATCH 0062/1302] refactor: wire in simple example --- examples/simple/ignition/MyOtherRecipe.js | 16 ---------------- examples/simple/ignition/MyRecipe.js | 8 ++------ examples/simple/ignition/ParamRecipe.js | 4 ++-- examples/simple/package.json | 3 +++ examples/simple/test/myrecipe.test.js | 12 ++++++++++++ examples/simple/test/paramrecipe.test.js | 16 ++++++++++++++++ package.json | 3 ++- packages/hardhat-plugin/src/index.ts | 1 + 8 files changed, 38 insertions(+), 25 deletions(-) delete mode 100644 examples/simple/ignition/MyOtherRecipe.js create mode 100644 examples/simple/test/myrecipe.test.js create mode 100644 examples/simple/test/paramrecipe.test.js diff --git a/examples/simple/ignition/MyOtherRecipe.js b/examples/simple/ignition/MyOtherRecipe.js deleted file mode 100644 index 7430fd7f07..0000000000 --- a/examples/simple/ignition/MyOtherRecipe.js +++ /dev/null @@ -1,16 +0,0 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); - -module.exports = buildRecipe("MyOtherRecipe", (m) => { - const foo = m.contract("Foo"); - const foo2 = m.contract("Foo", { id: "Foo2" }); - - m.call(foo, "inc", { - args: [1], - }); - - m.call(foo2, "inc", { - args: [1], - }); - - return { foo }; -}); diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index 3ea4146320..fc0586a953 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -1,11 +1,7 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipeSingleGraph } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildRecipe("MyRecipe", (m) => { +module.exports = buildRecipeSingleGraph("MyRecipe", (m) => { const foo = m.contract("Foo"); - // m.call(foo, "inc", { - // args: [1] - // }) - // return { foo }; }); diff --git a/examples/simple/ignition/ParamRecipe.js b/examples/simple/ignition/ParamRecipe.js index 629c915695..6c29f39076 100644 --- a/examples/simple/ignition/ParamRecipe.js +++ b/examples/simple/ignition/ParamRecipe.js @@ -1,6 +1,6 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipeSingleGraph } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildRecipe("ParamRecipe", (m) => { +module.exports = buildRecipeSingleGraph("ParamRecipe", (m) => { const incAmount = m.getParam("IncAmount"); const foo = m.contract("Foo"); diff --git a/examples/simple/package.json b/examples/simple/package.json index 569e1d8a23..70a008c791 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -2,6 +2,9 @@ "name": "hardhat-ignition-example-simple-ts", "version": "0.0.1", "private": true, + "scripts": { + "test:examples": "hardhat test" + }, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/hardhat-ignition": "^0.0.2" diff --git a/examples/simple/test/myrecipe.test.js b/examples/simple/test/myrecipe.test.js new file mode 100644 index 0000000000..36b6d7306f --- /dev/null +++ b/examples/simple/test/myrecipe.test.js @@ -0,0 +1,12 @@ +const { assert } = require("chai"); +const MyRecipe = require("../ignition/MyRecipe"); + +describe("My Recipe", function () { + it("should be able to deploy and read contracts", async function () { + const { foo } = await ignition.deploySingleGraph(MyRecipe); + + assert.isDefined(foo); + + assert.equal(await foo.x(), 10); + }); +}); diff --git a/examples/simple/test/paramrecipe.test.js b/examples/simple/test/paramrecipe.test.js new file mode 100644 index 0000000000..2ac4bd1e03 --- /dev/null +++ b/examples/simple/test/paramrecipe.test.js @@ -0,0 +1,16 @@ +const { assert } = require("chai"); +const ParamRecipe = require("../ignition/ParamRecipe"); + +describe("Param Recipe", function () { + it("should be able to pass parameters", async function () { + const { foo } = await ignition.deploySingleGraph(ParamRecipe, { + parameters: { + IncAmount: 42, + }, + }); + + assert.isDefined(foo); + + assert.equal(await foo.x(), 52); + }); +}); diff --git a/package.json b/package.json index 88d656e3e0..32ce86112b 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,9 @@ "lint": "wsrun --exclude-missing --serial lint", "test": "wsrun --exclude-missing --serial test", "test:coverage": "wsrun --exclude-missing --serial test:coverage", + "test:examples": "wsrun --exclude-missing --serial test:examples", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "yarn build && yarn lint && yarn test:coverage", + "fullcheck": "yarn build && yarn lint && yarn test:coverage && yarn test:examples", "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 986a5d7d01..4acf15a9aa 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -28,6 +28,7 @@ export { Services, Future, Hold, + buildRecipeSingleGraph, } from "@nomicfoundation/ignition-core"; extendConfig((config, userConfig) => { From dedee6b5737ad554671f980a26b27115c8c38f98 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 31 Aug 2022 18:09:10 +0100 Subject: [PATCH 0063/1302] refactor: wire through ui service --- examples/simple/ignition/MyRecipe.js | 6 +- packages/core/src/Ignition.ts | 6 ++ .../src/single-graph/execution/execute.ts | 26 ++++- .../single-graph/services/createServices.ts | 6 +- .../src/single-graph/ui/components/index.tsx | 102 ++++++++++++++++++ packages/core/src/single-graph/ui/types.ts | 54 ++++++++++ .../core/src/single-graph/ui/ui-service.tsx | 31 ++++++ packages/hardhat-plugin/src/index.ts | 46 ++++++++ 8 files changed, 274 insertions(+), 3 deletions(-) create mode 100644 packages/core/src/single-graph/ui/components/index.tsx create mode 100644 packages/core/src/single-graph/ui/types.ts create mode 100644 packages/core/src/single-graph/ui/ui-service.tsx diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index fc0586a953..1893cf3e95 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -3,5 +3,9 @@ const { buildRecipeSingleGraph } = require("@nomicfoundation/hardhat-ignition"); module.exports = buildRecipeSingleGraph("MyRecipe", (m) => { const foo = m.contract("Foo"); - return { foo }; + const bar = m.contract("Bar", { args: [foo] }); + + const qux = m.contract("Qux", { args: [foo] }); + + return { foo, bar, qux }; }); diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index eb0a4fdafd..881682fc36 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -18,6 +18,8 @@ import { execute } from "./single-graph/execution/execute"; import { generateRecipeGraphFrom } from "./single-graph/process/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "./single-graph/process/transformRecipeGraphToExecutionGraph"; import { DependableFuture, FutureDict } from "./single-graph/types/future"; +import { DeploymentState } from "./single-graph/ui/types"; +import { UiService } from "./single-graph/ui/ui-service"; import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; @@ -127,6 +129,10 @@ export class Ignition { providers: this._providers, journal: new InMemoryJournal(), txPollingInterval: 300, + ui: new UiService({ + enabled: true, + deploymentState: new DeploymentState(), + }), }; const transformResult = await transformRecipeGraphToExecutionGraph( diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index faee257d42..bff23ad45a 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -12,6 +12,8 @@ import { IExecutionGraph, LibraryDeploy, } from "../types/executionGraph"; +import { DeploymentState } from "../ui/types"; +import { UiService } from "../ui/ui-service"; import { isDependable } from "../utils/guards"; export type ExecuteResult = @@ -30,6 +32,7 @@ export async function execute( providers: Providers; journal: Journal; txPollingInterval: number; + ui: UiService; } ): Promise { const services: Services = createServices( @@ -38,11 +41,17 @@ export async function execute( servicesOptions ); + const uiDeploymentState: DeploymentState = new DeploymentState(); + + servicesOptions.ui.setDeploymentState(uiDeploymentState); + const resultContext: Map = new Map(); const executionResults = await visit( executionGraph, resultContext, + servicesOptions.ui, + uiDeploymentState, (executionVertex: ExecutionVertex, context: Map) => { switch (executionVertex.type) { case "ContractDeploy": @@ -71,18 +80,30 @@ export async function execute( } ); + servicesOptions.ui.render(); + return { _kind: "success", result: executionResults }; } async function visit( executionGraph: IExecutionGraph, resultContext: Map, + ui: UiService, + uiDeploymentState: DeploymentState, vistitorAction: ( executionVertex: ExecutionVertex, context: Map ) => Promise> ) { - for (const vertexId of topological(executionGraph)) { + const orderedVertexIds = topological(executionGraph); + + uiDeploymentState.setVertexes( + orderedVertexIds + .map((vid) => executionGraph.vertexes.get(vid)) + .filter((vertex): vertex is ExecutionVertex => vertex !== undefined) + ); + + for (const vertexId of orderedVertexIds) { const vertex = executionGraph.vertexes.get(vertexId); if (vertex === undefined) { @@ -93,6 +114,9 @@ async function visit( const result = await vistitorAction(vertex, resultContext); resultContext.set(vertexId, result); + uiDeploymentState.setSuccess(vertex); + + ui.render(); } return resultContext; diff --git a/packages/core/src/single-graph/services/createServices.ts b/packages/core/src/single-graph/services/createServices.ts index 28092dfba2..b1e0a52226 100644 --- a/packages/core/src/single-graph/services/createServices.ts +++ b/packages/core/src/single-graph/services/createServices.ts @@ -14,7 +14,11 @@ export function createServices( providers, journal, txPollingInterval, - }: { providers: Providers; journal: Journal; txPollingInterval: number } + }: { + providers: Providers; + journal: Journal; + txPollingInterval: number; + } ): Services { const txSender = new TxSender( recipeId, diff --git a/packages/core/src/single-graph/ui/components/index.tsx b/packages/core/src/single-graph/ui/components/index.tsx new file mode 100644 index 0000000000..99cd4d1bee --- /dev/null +++ b/packages/core/src/single-graph/ui/components/index.tsx @@ -0,0 +1,102 @@ +import { Box, Text } from "ink"; +import React from "react"; + +import { DeploymentState, VertexStatus } from "../types"; + +export const IgnitionUi = ({ + deploymentState, +}: { + deploymentState: DeploymentState; +}) => { + const vertexEntries = deploymentState.toStatus(); + const { executed, total } = deploymentState.executedCount(); + + return ( + + + + Deploying ({executed} of {total} transactions executed){" "} + + + + {vertexEntries.map((entry) => ( + + ))} + + {executed === total ? ( + <> + + + Deployment complete + + + + ) : null} + + ); +}; + +const VertexStatusRow = ({ vertexEntry }: { vertexEntry: VertexStatus }) => { + const { color, message } = toDisplayMessage(vertexEntry); + + return ( + + {message} + + ); +}; + +function toDisplayMessage(vertexEntry: VertexStatus): { + color: "green" | "gray"; + message: string; +} { + if (vertexEntry.status === "unstarted") { + return { + color: "gray", + message: resolveUnstartedMessage(vertexEntry), + }; + } + + if (vertexEntry.status === "success") { + return { color: "green", message: resolveCompletedMessage(vertexEntry) }; + } + + throw new Error(`Unexpected vertex status: ${vertexEntry}`); +} + +function resolveUnstartedMessage(vertexEntry: VertexStatus) { + switch (vertexEntry.vertex.type) { + case "ContractCall": + return `Waiting to call contract ${vertexEntry.vertex.label}`; + case "ContractDeploy": + return `Waiting to deploy contract ${vertexEntry.vertex.label}`; + case "DeployedContract": + return `Waiting to resolve contract ${vertexEntry.vertex.label}`; + case "LibraryDeploy": + return `Waiting to deploy library ${vertexEntry.vertex.label}`; + default: + return assertNeverMessage(vertexEntry.vertex); + } +} + +function resolveCompletedMessage(vertexEntry: VertexStatus) { + switch (vertexEntry.vertex.type) { + case "ContractCall": + return `Executed call to contract ${vertexEntry.vertex.label}`; + case "ContractDeploy": + return `Deployed contract ${vertexEntry.vertex.label}`; + case "DeployedContract": + return `Contract resolved ${vertexEntry.vertex.label}`; + case "LibraryDeploy": + return `Deployed contract ${vertexEntry.vertex.label}`; + default: + return assertNeverMessage(vertexEntry.vertex); + } +} + +function assertNeverMessage(vertexEntry: never): string { + const entry: any = vertexEntry; + const text = "type" in entry ? entry.type : entry; + + throw new Error(`Unexpected vertex type: ${text}`); +} diff --git a/packages/core/src/single-graph/ui/types.ts b/packages/core/src/single-graph/ui/types.ts new file mode 100644 index 0000000000..52609b45de --- /dev/null +++ b/packages/core/src/single-graph/ui/types.ts @@ -0,0 +1,54 @@ +import { ExecutionVertex } from "../types/executionGraph"; + +interface VertexSuccess { + status: "success"; + vertex: ExecutionVertex; +} + +interface Unstarted { + status: "unstarted"; + vertex: ExecutionVertex; +} + +export type VertexStatus = VertexSuccess | Unstarted; + +export class DeploymentState { + private vertexes: { [key: string]: VertexStatus }; + private order: number[]; + + constructor() { + this.vertexes = {}; + this.order = []; + } + + public setVertexes(vertexes: ExecutionVertex[]) { + this.order = vertexes.map((v) => v.id); + + this.vertexes = Object.fromEntries( + vertexes.map((v): [number, Unstarted] => [ + v.id, + { status: "unstarted", vertex: v }, + ]) + ); + } + + public setSuccess(vertex: ExecutionVertex) { + this.vertexes[vertex.id] = { + vertex, + status: "success", + }; + } + + public toStatus(): VertexStatus[] { + return this.order.map((id) => this.vertexes[id]); + } + + public executedCount(): { executed: number; total: number } { + const total = this.order.length; + const executed = Object.values(this.vertexes).filter( + (v) => v.status !== "unstarted" + ).length; + + return { executed, total }; + } +} diff --git a/packages/core/src/single-graph/ui/ui-service.tsx b/packages/core/src/single-graph/ui/ui-service.tsx new file mode 100644 index 0000000000..87ae213e71 --- /dev/null +++ b/packages/core/src/single-graph/ui/ui-service.tsx @@ -0,0 +1,31 @@ +import { render } from "ink"; +import React from "react"; + +import { IgnitionUi } from "./components"; +import { DeploymentState } from "./types"; + +export class UiService { + private _enabled: boolean; + private _deploymentState: DeploymentState; + + constructor({ + enabled, + deploymentState, + }: { + enabled: boolean; + deploymentState: DeploymentState; + }) { + this._enabled = enabled; + this._deploymentState = deploymentState; + } + + public setDeploymentState(deploymentState: DeploymentState) { + this._deploymentState = deploymentState; + } + + public render() { + if (this._enabled) { + render(); + } + } +} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 4acf15a9aa..33c65b1993 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -241,3 +241,49 @@ task("plan") } } ); + +task("deploySingleGraph") + .addOptionalVariadicPositionalParam("userRecipesPaths") + .addOptionalParam( + "parameters", + "A json object as a string, of the recipe paramters" + ) + .setAction( + async ( + { + userRecipesPaths = [], + parameters: parametersAsJson, + }: { userRecipesPaths: string[]; parameters?: string }, + hre + ) => { + await hre.run("compile", { quiet: true }); + + let parameters: { [key: string]: number | string }; + try { + parameters = + parametersAsJson !== undefined + ? JSON.parse(parametersAsJson) + : undefined; + } catch { + console.warn("Could not parse parameters json"); + process.exit(0); + } + + let userRecipes: Array>; + if (userRecipesPaths.length === 0) { + userRecipes = loadAllUserRecipes(hre.config.paths.ignition); + } else { + userRecipes = loadUserRecipes( + hre.config.paths.ignition, + userRecipesPaths + ); + } + + if (userRecipes.length === 0) { + console.warn("No Ignition recipes found"); + process.exit(0); + } + + await hre.ignition.deploySingleGraph(userRecipes[0], { parameters }); + } + ); From 6aa735b79d550c2a50c2fb35cf6f38456b2ff63f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 1 Sep 2022 11:16:40 +0100 Subject: [PATCH 0064/1302] refactor: turn off ui in tests --- packages/core/src/Ignition.ts | 5 +++-- packages/hardhat-plugin/src/ignition-wrapper.ts | 8 ++++++-- .../hardhat-plugin/test/single-graph/execute-useRecipe.ts | 4 ++++ packages/hardhat-plugin/test/single-graph/execute.ts | 5 ++++- 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 881682fc36..c34461b958 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -108,7 +108,8 @@ export class Ignition { } public async deploySingleGraph( - recipe: any + recipe: any, + options = { ui: true } ): Promise<[DeploymentResult, any]> { log(`Start deploy`); @@ -130,7 +131,7 @@ export class Ignition { journal: new InMemoryJournal(), txPollingInterval: 300, ui: new UiService({ - enabled: true, + enabled: options.ui, deploymentState: new DeploymentState(), }), }; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index f3d25ef2de..0da4b74a73 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -38,13 +38,17 @@ export class IgnitionWrapper { public async deploySingleGraph( recipe: any, - deployParams: { parameters: { [key: string]: ParamValue } } | undefined + deployParams: + | { parameters: { [key: string]: ParamValue }; ui?: boolean } + | undefined ) { if (deployParams !== undefined) { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await this._ignition.deploySingleGraph(recipe); + const [deploymentResult] = await this._ignition.deploySingleGraph(recipe, { + ui: deployParams?.ui ?? true, + }); if (deploymentResult._kind === "hold") { const [recipeId, holdReason] = deploymentResult.holds; diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts index c13619fc96..0aba8741f3 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -38,6 +38,7 @@ describe("useRecipe", function () { const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { parameters: {}, + ui: false, }); await mineBlocks(this.hre, [1, 1, 1], deployPromise); @@ -86,6 +87,7 @@ describe("useRecipe", function () { const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { parameters: {}, + ui: false, }); await mineBlocks(this.hre, [1, 1, 1], deployPromise); @@ -146,6 +148,7 @@ describe("useRecipe", function () { const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { parameters: {}, + ui: false, }); await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); @@ -210,6 +213,7 @@ describe("useRecipe", function () { const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { parameters: {}, + ui: false, }); await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts index 7ba0ca85fa..cb9d71375c 100644 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ b/packages/hardhat-plugin/test/single-graph/execute.ts @@ -277,7 +277,10 @@ async function deployRecipe( const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); - const deployPromise = hre.ignition.deploySingleGraph(userRecipe, options); + const deployPromise = hre.ignition.deploySingleGraph(userRecipe, { + ...options, + ui: false, + }); await mineBlocks(hre, [1, 1, 1], deployPromise); From 45c4851a50e0cc16eefbab2511e7efcd46b9b5d1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 1 Sep 2022 15:42:37 +0100 Subject: [PATCH 0065/1302] refactor: add validation and tests --- .vscode/settings.json | 3 + .vscode/tasks.json | 18 + packages/core/.nycrc | 2 +- packages/core/NOTES.md | 9 + packages/core/src/Ignition.ts | 51 +- .../core/src/services/ArtifactsService.ts | 8 +- packages/core/src/services/ConfigService.ts | 8 +- .../core/src/services/ContractsService.ts | 19 +- .../core/src/services/TransactionsService.ts | 6 +- packages/core/src/services/types.ts | 16 +- .../execution/dispatch/executeContractCall.ts | 33 + .../dispatch/executeContractDeploy.ts | 37 ++ .../dispatch/executeDeployedContract.ts | 18 + .../dispatch/executeLibraryDeploy.ts | 27 + .../execution/dispatch/executionDispatch.ts | 41 ++ .../single-graph/execution/dispatch/utils.ts | 26 + .../src/single-graph/execution/execute.ts | 261 ++------ packages/core/src/single-graph/graph/utils.ts | 13 + packages/core/src/single-graph/graph/visit.ts | 53 ++ .../transformRecipeGraphToExecutionGraph.ts | 6 +- .../single-graph/recipe/RecipeGraphBuilder.ts | 8 +- .../src/single-graph/types/executionGraph.ts | 2 +- .../core/src/single-graph/types/future.ts | 7 + packages/core/src/single-graph/types/graph.ts | 20 + .../src/single-graph/types/recipeGraph.ts | 14 +- packages/core/src/single-graph/ui/types.ts | 38 +- .../core/src/single-graph/ui/ui-service.tsx | 15 +- .../dispatch/validateArtifactContract.ts | 42 ++ .../dispatch/validateArtifactLibrary.ts | 40 ++ .../validation/dispatch/validateCall.ts | 114 ++++ .../dispatch/validateDeployedContract.ts | 25 + .../dispatch/validateHardhatContract.ts | 44 ++ .../dispatch/validateHardhatLibrary.ts | 44 ++ .../validation/dispatch/validateVirtual.ts | 14 + .../validation/dispatch/validationDispatch.ts | 46 ++ .../validation/validateRecipeGraph.ts | 29 +- packages/core/test/dag.ts | 11 +- packages/core/test/execution-engine.ts | 3 +- packages/core/test/executors/CallExecutor.ts | 3 +- .../executors/ExistingContractExecutor.ts | 3 +- .../test/futures/ExistingContractFuture.ts | 3 +- .../collectLibrariesAndLink.ts | 2 +- packages/core/test/single-graph/execution.ts | 309 +++++++++ .../test/single-graph/graph/adjacencyList.ts | 32 +- .../core/test/single-graph/graph/helpers.ts | 37 ++ packages/core/test/single-graph/helpers.ts | 67 ++ packages/core/test/single-graph/recipes.ts | 1 + .../core/test/{ => single-graph}/tx-sender.ts | 10 +- packages/core/test/single-graph/validation.ts | 590 ++++++++++++++++++ 49 files changed, 1884 insertions(+), 344 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 .vscode/tasks.json create mode 100644 packages/core/NOTES.md create mode 100644 packages/core/src/single-graph/execution/dispatch/executeContractCall.ts create mode 100644 packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts create mode 100644 packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts create mode 100644 packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts create mode 100644 packages/core/src/single-graph/execution/dispatch/executionDispatch.ts create mode 100644 packages/core/src/single-graph/execution/dispatch/utils.ts create mode 100644 packages/core/src/single-graph/graph/utils.ts create mode 100644 packages/core/src/single-graph/graph/visit.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateCall.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validateVirtual.ts create mode 100644 packages/core/src/single-graph/validation/dispatch/validationDispatch.ts rename packages/core/test/{ => single-graph}/collectLibrariesAndLink.ts (98%) create mode 100644 packages/core/test/single-graph/execution.ts create mode 100644 packages/core/test/single-graph/graph/helpers.ts create mode 100644 packages/core/test/single-graph/helpers.ts rename packages/core/test/{ => single-graph}/tx-sender.ts (90%) create mode 100644 packages/core/test/single-graph/validation.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000..1dcba7667b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "task.allowAutomaticTasks": "on" +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000000..adbe0647ec --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,18 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Run watch", + "type": "shell", + "command": "yarn watch", + "group": "none", + "presentation": { + "reveal": "never", + "panel": "new" + }, + "runOptions": { + "runOn": "folderOpen" + } + } + ] +} diff --git a/packages/core/.nycrc b/packages/core/.nycrc index 125d1c9dec..a511180e39 100644 --- a/packages/core/.nycrc +++ b/packages/core/.nycrc @@ -3,7 +3,7 @@ "check-coverage": true, "statements": 35, "branches": 25, - "functions": 38, + "functions": 30, "lines": 35, "all": true, "include": [ diff --git a/packages/core/NOTES.md b/packages/core/NOTES.md new file mode 100644 index 0000000000..8c0099997d --- /dev/null +++ b/packages/core/NOTES.md @@ -0,0 +1,9 @@ +# TODO + +1. Deal with services setup? How is this affecting the journaling folder +2. Validation tests +3. Execution tests +4. Remove old files +5. Check code level todos +6. Change steps as a function name +7. add docs and images diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index c34461b958..7f07dd6f9d 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -14,11 +14,12 @@ import { InMemoryJournal } from "./journal/InMemoryJournal"; import { Providers } from "./providers"; import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; import { UserRecipe } from "./recipes/UserRecipe"; +import { Services } from "./services/types"; import { execute } from "./single-graph/execution/execute"; import { generateRecipeGraphFrom } from "./single-graph/process/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "./single-graph/process/transformRecipeGraphToExecutionGraph"; +import { createServices } from "./single-graph/services/createServices"; import { DependableFuture, FutureDict } from "./single-graph/types/future"; -import { DeploymentState } from "./single-graph/ui/types"; import { UiService } from "./single-graph/ui/ui-service"; import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; @@ -113,6 +114,20 @@ export class Ignition { ): Promise<[DeploymentResult, any]> { log(`Start deploy`); + const ui = new UiService({ enabled: options.ui }); + + const serviceOptions = { + providers: this._providers, + journal: new InMemoryJournal(), + txPollingInterval: 300, + }; + + const services: Services = createServices( + "recipeIdEXECUTE", + "executorIdEXECUTE", + serviceOptions + ); + const chainId = await this._getChainId(); const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( @@ -120,22 +135,12 @@ export class Ignition { { chainId } ); - const validationResult = validateRecipeGraph(recipeGraph); + const validationResult = await validateRecipeGraph(recipeGraph, services); if (validationResult._kind === "failure") { return [validationResult, {}]; } - const serviceOptions = { - providers: this._providers, - journal: new InMemoryJournal(), - txPollingInterval: 300, - ui: new UiService({ - enabled: options.ui, - deploymentState: new DeploymentState(), - }), - }; - const transformResult = await transformRecipeGraphToExecutionGraph( recipeGraph, serviceOptions @@ -147,7 +152,7 @@ export class Ignition { const { executionGraph } = transformResult; - const executionResult = await execute(executionGraph, serviceOptions); + const executionResult = await execute(executionGraph, services, ui); if (executionResult._kind === "failure") { return [executionResult, {}]; @@ -164,22 +169,28 @@ export class Ignition { public async planSingleGraph(recipe: any) { log(`Start deploy`); + const serviceOptions = { + providers: this._providers, + journal: new InMemoryJournal(), + txPollingInterval: 300, + }; + + const services: Services = createServices( + "recipeIdEXECUTE", + "executorIdEXECUTE", + serviceOptions + ); + const chainId = await this._getChainId(); const { graph: recipeGraph } = generateRecipeGraphFrom(recipe, { chainId }); - const validationResult = validateRecipeGraph(recipeGraph); + const validationResult = await validateRecipeGraph(recipeGraph, services); if (validationResult._kind === "failure") { return [validationResult, {}]; } - const serviceOptions = { - providers: this._providers, - journal: new InMemoryJournal(), - txPollingInterval: 300, - }; - const transformResult = await transformRecipeGraphToExecutionGraph( recipeGraph, serviceOptions diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts index e542db88aa..3152ea6e8d 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/services/ArtifactsService.ts @@ -1,12 +1,18 @@ import { Providers } from "../providers"; import { Artifact } from "../types"; -export class ArtifactsService { +export interface IArtifactsService { + getArtifact(name: string): Promise; + hasArtifact(name: string): Promise; +} + +export class ArtifactsService implements IArtifactsService { constructor(private readonly _providers: Providers) {} public getArtifact(name: string): Promise { return this._providers.artifacts.getArtifact(name); } + public hasArtifact(name: string): Promise { return this._providers.artifacts.hasArtifact(name); } diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 3e2f7b7302..4bd9885b1a 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,7 +1,13 @@ import { HasParamResult, Providers } from "../providers"; import { ParamValue } from "../recipes/types"; -export class ConfigService { +export interface IConfigService { + getParam(paramName: string): Promise; + + hasParam(paramName: string): Promise; +} + +export class ConfigService implements IConfigService { constructor(private readonly _providers: Providers) {} public getParam(paramName: string): Promise { diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 315d98a082..9c5f38e3c5 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -9,7 +9,24 @@ import { sleep } from "../utils"; import type { TransactionOptions } from "./types"; -export class ContractsService { +export interface IContractsService { + deploy( + artifact: Artifact, + args: any[], + libraries: { [k: string]: any }, + txOptions?: TransactionOptions + ): Promise; + + call( + address: string, + abi: any[], + method: string, + args: any[], + txOptions?: TransactionOptions + ): Promise; +} + +export class ContractsService implements IContractsService { private _debug = setupDebug("ignition:services:contracts-service"); private _ethersProvider: ethers.providers.Web3Provider; diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index 6c78cee1e4..d8a0bafa92 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -2,7 +2,11 @@ import { ethers } from "ethers"; import { Providers } from "../providers"; -export class TransactionsService { +export interface ITransactionsService { + wait(txHash: string): Promise; +} + +export class TransactionsService implements ITransactionsService { constructor(private readonly _providers: Providers) {} public async wait( diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 91aeeb8a5a..97e75e4f6f 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -1,9 +1,9 @@ import { ethers } from "ethers"; -import { ArtifactsService } from "./ArtifactsService"; -import { ConfigService } from "./ConfigService"; -import { ContractsService } from "./ContractsService"; -import { TransactionsService } from "./TransactionsService"; +import { IArtifactsService } from "./ArtifactsService"; +import { IConfigService } from "./ConfigService"; +import { IContractsService } from "./ContractsService"; +import { ITransactionsService } from "./TransactionsService"; export interface TransactionOptions { gasLimit?: ethers.BigNumberish; @@ -11,8 +11,8 @@ export interface TransactionOptions { } export interface Services { - contracts: ContractsService; - artifacts: ArtifactsService; - transactions: TransactionsService; - config: ConfigService; + contracts: IContractsService; + artifacts: IArtifactsService; + transactions: ITransactionsService; + config: IConfigService; } diff --git a/packages/core/src/single-graph/execution/dispatch/executeContractCall.ts b/packages/core/src/single-graph/execution/dispatch/executeContractCall.ts new file mode 100644 index 0000000000..7a5a976b96 --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/executeContractCall.ts @@ -0,0 +1,33 @@ +import { Services } from "../../../services/types"; +import { ContractCall } from "../../types/executionGraph"; +import { VertexVisitResult } from "../../types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeContractCall( + { method, contract, args }: ContractCall, + resultAccumulator: Map, + { services }: { services: Services } +): Promise { + const resolve = resolveFrom(resultAccumulator); + + const resolvedArgs = args.map(resolve).map(toAddress); + + const { address, abi } = resolve(contract); + + const txHash = await services.contracts.call( + address, + abi, + method, + resolvedArgs + ); + + await services.transactions.wait(txHash); + + return { + _kind: "success", + result: { + hash: txHash, + }, + }; +} diff --git a/packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts b/packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts new file mode 100644 index 0000000000..4402bf52eb --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts @@ -0,0 +1,37 @@ +import { Services } from "../../../services/types"; +import { ContractDeploy } from "../../types/executionGraph"; +import { VertexVisitResult } from "../../types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeContractDeploy( + { artifact, args, libraries }: ContractDeploy, + resultAccumulator: Map, + { services }: { services: Services } +): Promise { + const resolve = resolveFrom(resultAccumulator); + + const resolvedArgs = args.map(resolve).map(toAddress); + + const resolvedLibraries = Object.fromEntries( + Object.entries(libraries ?? {}).map(([k, v]) => [k, toAddress(resolve(v))]) + ); + + const txHash = await services.contracts.deploy( + artifact, + resolvedArgs, + resolvedLibraries + ); + + const receipt = await services.transactions.wait(txHash); + + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }, + }; +} diff --git a/packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts b/packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts new file mode 100644 index 0000000000..fa9aba5ef8 --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts @@ -0,0 +1,18 @@ +import { Services } from "../../../services/types"; +import { DeployedContract } from "../../types/executionGraph"; +import { VertexVisitResult } from "../../types/graph"; + +export async function executeDeployedContract( + { label, address, abi }: DeployedContract, + _resultAccumulator: Map, + _: { services: Services } +): Promise { + return { + _kind: "success", + result: { + name: label, + abi, + address, + }, + }; +} diff --git a/packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts new file mode 100644 index 0000000000..32bd061df2 --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts @@ -0,0 +1,27 @@ +import { Services } from "../../../services/types"; +import { LibraryDeploy } from "../../types/executionGraph"; +import { VertexVisitResult } from "../../types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeLibraryDeploy( + { artifact, args }: LibraryDeploy, + resultAccumulator: Map, + { services }: { services: Services } +): Promise { + const resolvedArgs = args.map(resolveFrom(resultAccumulator)).map(toAddress); + + const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + + const receipt = await services.transactions.wait(txHash); + + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }, + }; +} diff --git a/packages/core/src/single-graph/execution/dispatch/executionDispatch.ts b/packages/core/src/single-graph/execution/dispatch/executionDispatch.ts new file mode 100644 index 0000000000..2c1613a2e8 --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/executionDispatch.ts @@ -0,0 +1,41 @@ +import { Services } from "../../../services/types"; +import { ExecutionVertex } from "../../types/executionGraph"; +import { VertexVisitResult } from "../../types/graph"; + +import { executeContractCall } from "./executeContractCall"; +import { executeContractDeploy } from "./executeContractDeploy"; +import { executeDeployedContract } from "./executeDeployedContract"; +import { executeLibraryDeploy } from "./executeLibraryDeploy"; + +export function executionDispatch( + executionVertex: ExecutionVertex, + resultAccumulator: Map, + context: { services: Services } +): Promise { + switch (executionVertex.type) { + case "ContractDeploy": + return executeContractDeploy(executionVertex, resultAccumulator, context); + case "DeployedContract": + return executeDeployedContract( + executionVertex, + resultAccumulator, + context + ); + case "ContractCall": + return executeContractCall(executionVertex, resultAccumulator, context); + case "LibraryDeploy": + return executeLibraryDeploy(executionVertex, resultAccumulator, context); + default: + return assertUnknownExecutionVertexType(executionVertex); + } +} + +function assertUnknownExecutionVertexType( + executionVertex: never +): Promise { + const vertex = executionVertex as any; + + const forReport = "type" in vertex ? vertex.type : vertex; + + throw new Error(`Unknown execution vertex type: ${forReport}`); +} diff --git a/packages/core/src/single-graph/execution/dispatch/utils.ts b/packages/core/src/single-graph/execution/dispatch/utils.ts new file mode 100644 index 0000000000..4e3a5f4d2f --- /dev/null +++ b/packages/core/src/single-graph/execution/dispatch/utils.ts @@ -0,0 +1,26 @@ +import { ArgValue } from "../../types/executionGraph"; +import { isDependable } from "../../utils/guards"; + +export function toAddress(v: any) { + if (typeof v === "object" && "address" in v) { + return v.address; + } + + return v; +} + +export function resolveFrom(context: Map) { + return (arg: ArgValue) => { + if (!isDependable(arg)) { + return arg; + } + + const entry = context.get(arg.vertexId); + + if (!entry) { + throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); + } + + return entry; + }; +} diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/single-graph/execution/execute.ts index bff23ad45a..fbfbad75cd 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/single-graph/execution/execute.ts @@ -1,250 +1,61 @@ -import { Journal } from "../../journal/types"; -import { Providers } from "../../providers"; import { Services } from "../../services/types"; -import { topologicalSort } from "../graph/adjacencyList"; -import { createServices } from "../services/createServices"; -import { - ArgValue, - ContractCall, - ContractDeploy, - DeployedContract, - ExecutionVertex, - IExecutionGraph, - LibraryDeploy, -} from "../types/executionGraph"; +import { getSortedVertexIdsFrom } from "../graph/utils"; +import { visit } from "../graph/visit"; +import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; +import { VisitResult } from "../types/graph"; import { DeploymentState } from "../ui/types"; import { UiService } from "../ui/ui-service"; -import { isDependable } from "../utils/guards"; -export type ExecuteResult = - | { - _kind: "success"; - result: Map; - } - | { - _kind: "failure"; - failures: [string, Error[]]; - }; +import { executionDispatch } from "./dispatch/executionDispatch"; export async function execute( executionGraph: IExecutionGraph, - servicesOptions: { - providers: Providers; - journal: Journal; - txPollingInterval: number; - ui: UiService; - } -): Promise { - const services: Services = createServices( - "recipeIdEXECUTE", - "executorIdEXECUTE", - servicesOptions - ); - - const uiDeploymentState: DeploymentState = new DeploymentState(); + services: Services, + ui: UiService +): Promise { + const orderedVertexIds = getSortedVertexIdsFrom(executionGraph); - servicesOptions.ui.setDeploymentState(uiDeploymentState); - - const resultContext: Map = new Map(); + const uiDeploymentState = setupUiDeploymentState( + executionGraph, + ui, + orderedVertexIds + ); - const executionResults = await visit( + return visit( + "Execution", + orderedVertexIds, executionGraph, - resultContext, - servicesOptions.ui, - uiDeploymentState, - (executionVertex: ExecutionVertex, context: Map) => { - switch (executionVertex.type) { - case "ContractDeploy": - return executeContractDeploy(executionVertex, { - ...services, - context, - }); - case "DeployedContract": - return executeDeployedContract(executionVertex, { - ...services, - context, - }); - case "ContractCall": - return executeContractCall(executionVertex, { - ...services, - context, - }); - case "LibraryDeploy": - return executeLibraryDeploy(executionVertex, { - ...services, - context, - }); - default: - return assertUnknownExecutionVertexType(executionVertex); + { services }, + new Map(), + executionDispatch, + (vertex, kind, error) => { + if (kind === "success") { + uiDeploymentState.setExeuctionVertexAsSuccess(vertex); + } else if (kind === "failure") { + uiDeploymentState.setExecutionVertexAsFailure(vertex, error); + } else { + throw new Error(`Unknown kind ${kind}`); } + + ui.render(); } ); - - servicesOptions.ui.render(); - - return { _kind: "success", result: executionResults }; } -async function visit( +function setupUiDeploymentState( executionGraph: IExecutionGraph, - resultContext: Map, ui: UiService, - uiDeploymentState: DeploymentState, - vistitorAction: ( - executionVertex: ExecutionVertex, - context: Map - ) => Promise> -) { - const orderedVertexIds = topological(executionGraph); + orderedVertexIds: number[] +): DeploymentState { + const uiDeploymentState: DeploymentState = new DeploymentState(); - uiDeploymentState.setVertexes( + uiDeploymentState.setExecutionVertexes( orderedVertexIds .map((vid) => executionGraph.vertexes.get(vid)) .filter((vertex): vertex is ExecutionVertex => vertex !== undefined) ); - for (const vertexId of orderedVertexIds) { - const vertex = executionGraph.vertexes.get(vertexId); - - if (vertex === undefined) { - // this shouldn't happen - continue; - } - - const result = await vistitorAction(vertex, resultContext); - - resultContext.set(vertexId, result); - uiDeploymentState.setSuccess(vertex); - - ui.render(); - } - - return resultContext; -} - -function topological(executionGraph: IExecutionGraph): number[] { - const orderedIds = topologicalSort(executionGraph.adjacencyList); - - const totalOrderedIds = Array.from(executionGraph.vertexes.keys()) - .filter((k) => !orderedIds.includes(k)) - .concat(orderedIds); - - return totalOrderedIds; -} - -async function executeContractDeploy( - { artifact, args, libraries }: ContractDeploy, - services: Services & { context: Map } -): Promise { - const resolve = resolveFromContext(services.context); - - const resolvedArgs = args.map(resolve).map(toAddress); - - const resolvedLibraries = Object.fromEntries( - Object.entries(libraries ?? {}).map(([k, v]) => [k, toAddress(resolve(v))]) - ); - - const txHash = await services.contracts.deploy( - artifact, - resolvedArgs, - resolvedLibraries - ); - - const receipt = await services.transactions.wait(txHash); - - return { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }; -} - -async function executeDeployedContract( - { label, address, abi }: DeployedContract, - _services: Services & { context: Map } -): Promise { - return { - name: label, - abi, - address, - }; -} - -async function executeLibraryDeploy( - { artifact, args }: LibraryDeploy, - services: Services & { context: Map } -): Promise { - const resolvedArgs = args - .map(resolveFromContext(services.context)) - .map(toAddress); - - const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); - - const receipt = await services.transactions.wait(txHash); - - return { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }; -} - -async function executeContractCall( - { method, contract, args }: ContractCall, - services: Services & { context: Map } -): Promise { - const resolve = resolveFromContext(services.context); - - const resolvedArgs = args.map(resolve).map(toAddress); - - const { address, abi } = resolve(contract); - - const txHash = await services.contracts.call( - address, - abi, - method, - resolvedArgs - ); - - await services.transactions.wait(txHash); - - return { - hash: txHash, - }; -} - -function toAddress(v: any) { - if (typeof v === "object" && "address" in v) { - return v.address; - } - - return v; -} - -function resolveFromContext(context: Map) { - return (arg: ArgValue) => { - if (!isDependable(arg)) { - return arg; - } - - const entry = context.get(arg.vertexId); - - if (!entry) { - throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); - } - - return entry; - }; -} - -function assertUnknownExecutionVertexType( - executionVertex: never -): Promise> { - const vertex = executionVertex as any; - - const forReport = "type" in vertex ? vertex.type : vertex; + ui.setDeploymentState(uiDeploymentState); - throw new Error(`Unknown execution vertex type: ${forReport}`); + return uiDeploymentState; } diff --git a/packages/core/src/single-graph/graph/utils.ts b/packages/core/src/single-graph/graph/utils.ts new file mode 100644 index 0000000000..9bef2aa9dc --- /dev/null +++ b/packages/core/src/single-graph/graph/utils.ts @@ -0,0 +1,13 @@ +import { IGraph } from "../types/graph"; + +import { topologicalSort } from "./adjacencyList"; + +export function getSortedVertexIdsFrom(executionGraph: IGraph): number[] { + const orderedIds = topologicalSort(executionGraph.adjacencyList); + + const totalOrderedIds = Array.from(executionGraph.vertexes.keys()) + .filter((k) => !orderedIds.includes(k)) + .concat(orderedIds); + + return totalOrderedIds; +} diff --git a/packages/core/src/single-graph/graph/visit.ts b/packages/core/src/single-graph/graph/visit.ts new file mode 100644 index 0000000000..36ae24c79e --- /dev/null +++ b/packages/core/src/single-graph/graph/visit.ts @@ -0,0 +1,53 @@ +import { IGraph, VertexVisitResult, VisitResult } from "../types/graph"; + +export async function visit( + phase: "Execution" | "Validation", + orderedVertexIds: number[], + executionGraph: IGraph, + context: C, + resultAccumulator: Map, + vistitorAction: ( + executionVertex: T, + resultAccumulator: Map, + context: C + ) => Promise, + afterAction?: ( + executionVertex: T, + kind: "success" | "failure", + err?: unknown + ) => void +): Promise { + for (const vertexId of orderedVertexIds) { + const vertex = executionGraph.vertexes.get(vertexId); + + if (vertex === undefined) { + // TODO: this shouldn't happen, so lets figure that out + continue; + } + + const vertexVisitResult = await vistitorAction( + vertex, + resultAccumulator, + context + ); + + if (vertexVisitResult._kind === "failure") { + if (afterAction !== undefined) { + afterAction(vertex, "failure", vertexVisitResult.failure); + } + + return { + _kind: "failure", + failures: [`${phase} failed`, [vertexVisitResult.failure]], + }; + } + + resultAccumulator.set(vertexId, vertexVisitResult.result); + + if (afterAction !== undefined) { + afterAction(vertex, "success"); + } + } + + return { _kind: "success", result: resultAccumulator }; +} diff --git a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts index bc31a1a5e9..fa0b043c8f 100644 --- a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts @@ -213,9 +213,9 @@ function assertRecipeVertexNotExpected( } async function convertArgs( - args: Array, + args: Array, transformContext: TransformContext -): Promise> { +): Promise> { const resolvedArgs = []; for (const arg of args) { @@ -228,7 +228,7 @@ async function convertArgs( } async function resolveParameter( - arg: string | number | RecipeFuture, + arg: boolean | string | number | RecipeFuture, { services, graph }: TransformContext ) { if (!isFuture(arg)) { diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts index 45e543b5e7..1da770ec44 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts @@ -64,6 +64,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: libraryName, type: "library", subtype: "artifact", + artifact, _future: true, }; @@ -85,6 +86,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: libraryName, type: "library", subtype: "hardhat", + libraryName, _future: true, }; @@ -115,6 +117,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: contractName, type: "contract", subtype: "artifact", + artifact, _future: true, }; @@ -137,6 +140,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: contractName, type: "contract", subtype: "hardhat", + contractName, _future: true, }; @@ -164,6 +168,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: contractName, type: "contract", subtype: "deployed", + abi, _future: true, }; @@ -186,7 +191,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { args, after, }: { - args: Array; + args: Array; after?: RecipeFuture[]; } ): ContractCall { @@ -303,6 +308,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { label: v.label, type: "contract", // TODO: this is a hack, lets add a future type for this sort of ellision subtype: "artifact", + artifact: {} as any, _future: true, }) ); diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts index d6edf6883e..557517f13c 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -3,7 +3,7 @@ import { AdjacencyList } from "./graph"; import { Artifact } from "./hardhat"; import { LibraryMap } from "./recipeGraph"; -export type ArgValue = string | number | RecipeFuture; +export type ArgValue = boolean | string | number | RecipeFuture; export interface ContractDeploy { type: "ContractDeploy"; diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/single-graph/types/future.ts index 02bf2d036d..ba46ee606d 100644 --- a/packages/core/src/single-graph/types/future.ts +++ b/packages/core/src/single-graph/types/future.ts @@ -1,8 +1,11 @@ +import { Artifact } from "./hardhat"; + export interface HardhatContract { vertexId: number; label: string; type: "contract"; subtype: "hardhat"; + contractName: string; _future: true; } @@ -11,6 +14,7 @@ export interface ArtifactContract { label: string; type: "contract"; subtype: "artifact"; + artifact: Artifact; _future: true; } @@ -19,6 +23,7 @@ export interface DeployedContract { label: string; type: "contract"; subtype: "deployed"; + abi: any[]; _future: true; } @@ -27,6 +32,7 @@ export interface HardhatLibrary { label: string; type: "library"; subtype: "hardhat"; + libraryName: string; _future: true; } @@ -35,6 +41,7 @@ export interface ArtifactLibrary { label: string; type: "library"; subtype: "artifact"; + artifact: Artifact; _future: true; } diff --git a/packages/core/src/single-graph/types/graph.ts b/packages/core/src/single-graph/types/graph.ts index e06e1dfdbe..eaf8aa9fd0 100644 --- a/packages/core/src/single-graph/types/graph.ts +++ b/packages/core/src/single-graph/types/graph.ts @@ -9,3 +9,23 @@ export interface IGraph { adjacencyList: AdjacencyList; vertexes: Map; } + +export type VertexVisitResult = + | { + _kind: "success"; + result: any; + } + | { + _kind: "failure"; + failure: Error; + }; + +export type VisitResult = + | { + _kind: "success"; + result: Map; + } + | { + _kind: "failure"; + failures: [string, Error[]]; + }; diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index 0711b46b92..cf569145e9 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -25,7 +25,7 @@ export interface HardhatContractRecipeVertex { label: string; scopeAdded: string; contractName: string; - args: Array; + args: Array; libraries: LibraryMap; } @@ -35,7 +35,7 @@ export interface ArtifactContractRecipeVertex { label: string; scopeAdded: string; artifact: Artifact; - args: Array; + args: Array; libraries: LibraryMap; } @@ -54,7 +54,7 @@ export interface HardhatLibraryRecipeVertex { libraryName: string; label: string; scopeAdded: string; - args: Array; + args: Array; } export interface ArtifactLibraryRecipeVertex { @@ -63,7 +63,7 @@ export interface ArtifactLibraryRecipeVertex { label: string; scopeAdded: string; artifact: Artifact; - args: Array; + args: Array; } export interface CallRecipeVertex { @@ -73,7 +73,7 @@ export interface CallRecipeVertex { scopeAdded: string; contract: CallableFuture; method: string; - args: Array; + args: Array; after: RecipeFuture[]; } @@ -95,7 +95,7 @@ export type RecipeVertex = | VirtualVertex; export interface ContractOptions { - args?: Array; + args?: Array; libraries?: { [key: string]: RecipeFuture; }; @@ -141,7 +141,7 @@ export interface IRecipeGraphBuilder { { args, }: { - args: Array; + args: Array; after?: RecipeFuture[]; } ) => ContractCall; diff --git a/packages/core/src/single-graph/ui/types.ts b/packages/core/src/single-graph/ui/types.ts index 52609b45de..25f589b07b 100644 --- a/packages/core/src/single-graph/ui/types.ts +++ b/packages/core/src/single-graph/ui/types.ts @@ -5,26 +5,38 @@ interface VertexSuccess { vertex: ExecutionVertex; } +interface VertexFailure { + status: "failure"; + vertex: ExecutionVertex; + error: unknown; +} + interface Unstarted { status: "unstarted"; vertex: ExecutionVertex; } -export type VertexStatus = VertexSuccess | Unstarted; +export type VertexStatus = Unstarted | VertexSuccess | VertexFailure; export class DeploymentState { - private vertexes: { [key: string]: VertexStatus }; + private phase: "validation" | "execution" | "uninitialized"; + private validationErrors: string[]; + private executionVertexes: { [key: string]: VertexStatus }; private order: number[]; constructor() { - this.vertexes = {}; + this.phase = "uninitialized"; + this.order = []; + + this.validationErrors = []; + this.executionVertexes = {}; } - public setVertexes(vertexes: ExecutionVertex[]) { + public setExecutionVertexes(vertexes: ExecutionVertex[]) { this.order = vertexes.map((v) => v.id); - this.vertexes = Object.fromEntries( + this.executionVertexes = Object.fromEntries( vertexes.map((v): [number, Unstarted] => [ v.id, { status: "unstarted", vertex: v }, @@ -32,20 +44,28 @@ export class DeploymentState { ); } - public setSuccess(vertex: ExecutionVertex) { - this.vertexes[vertex.id] = { + public setExeuctionVertexAsSuccess(vertex: ExecutionVertex) { + this.executionVertexes[vertex.id] = { vertex, status: "success", }; } + public setExecutionVertexAsFailure(vertex: ExecutionVertex, err: unknown) { + this.executionVertexes[vertex.id] = { + vertex, + status: "failure", + error: err, + }; + } + public toStatus(): VertexStatus[] { - return this.order.map((id) => this.vertexes[id]); + return this.order.map((id) => this.executionVertexes[id]); } public executedCount(): { executed: number; total: number } { const total = this.order.length; - const executed = Object.values(this.vertexes).filter( + const executed = Object.values(this.executionVertexes).filter( (v) => v.status !== "unstarted" ).length; diff --git a/packages/core/src/single-graph/ui/ui-service.tsx b/packages/core/src/single-graph/ui/ui-service.tsx index 87ae213e71..40d4b3de8d 100644 --- a/packages/core/src/single-graph/ui/ui-service.tsx +++ b/packages/core/src/single-graph/ui/ui-service.tsx @@ -6,17 +6,10 @@ import { DeploymentState } from "./types"; export class UiService { private _enabled: boolean; - private _deploymentState: DeploymentState; + private _deploymentState: DeploymentState | undefined; - constructor({ - enabled, - deploymentState, - }: { - enabled: boolean; - deploymentState: DeploymentState; - }) { + constructor({ enabled }: { enabled: boolean }) { this._enabled = enabled; - this._deploymentState = deploymentState; } public setDeploymentState(deploymentState: DeploymentState) { @@ -24,6 +17,10 @@ export class UiService { } public render() { + if (this._deploymentState === undefined) { + throw new Error("Cannot render before deployment state set"); + } + if (this._enabled) { render(); } diff --git a/packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts b/packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts new file mode 100644 index 0000000000..d40ca56a10 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts @@ -0,0 +1,42 @@ +import { ethers } from "ethers"; + +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { ArtifactContractRecipeVertex } from "../../types/recipeGraph"; +import { isArtifact } from "../../utils/guards"; + +export async function validateArtifactContract( + vertex: ArtifactContractRecipeVertex, + _resultAccumulator: Map, + _context: { services: Services } +): Promise { + const artifactExists = isArtifact(vertex.artifact); + + if (!artifactExists) { + return { + _kind: "failure", + failure: new Error( + `Artifact not provided for contract '${vertex.label}'` + ), + }; + } + + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(vertex.artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return { + _kind: "failure", + failure: new Error( + `The constructor of the contract '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts new file mode 100644 index 0000000000..c6777c7ac0 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts @@ -0,0 +1,40 @@ +import { ethers } from "ethers"; + +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { ArtifactLibraryRecipeVertex } from "../../types/recipeGraph"; +import { isArtifact } from "../../utils/guards"; + +export async function validateArtifactLibrary( + vertex: ArtifactLibraryRecipeVertex, + _resultAccumulator: Map, + _context: { services: Services } +): Promise { + const artifactExists = isArtifact(vertex.artifact); + + if (!artifactExists) { + return { + _kind: "failure", + failure: new Error(`Artifact not provided for library '${vertex.label}'`), + }; + } + + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(vertex.artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return { + _kind: "failure", + failure: new Error( + `The constructor of the library '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateCall.ts b/packages/core/src/single-graph/validation/dispatch/validateCall.ts new file mode 100644 index 0000000000..c899811046 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateCall.ts @@ -0,0 +1,114 @@ +import { ethers } from "ethers"; + +import { Services } from "../../../services/types"; +import { CallableFuture } from "../../types/future"; +import { VertexVisitResult } from "../../types/graph"; +import { CallRecipeVertex } from "../../types/recipeGraph"; + +export async function validateCall( + vertex: CallRecipeVertex, + resultAccumulator: Map, + context: { services: Services } +): Promise { + const contractName = vertex.contract.label; + + const artifactAbi = await resolveArtifactForCallableFuture( + vertex.contract, + context + ); + + if (artifactAbi === undefined) { + return { + _kind: "failure", + failure: new Error(`Artifact with name '${contractName}' doesn't exist`), + }; + } + + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(artifactAbi); + + const funcs = Object.entries(iface.functions) + .filter(([fname]) => fname === vertex.method) + .map(([, fragment]) => fragment); + + const functionFragments = iface.fragments + .filter((frag) => frag.name === vertex.method) + .concat(funcs); + + if (functionFragments.length === 0) { + return { + _kind: "failure", + failure: new Error( + `Contract '${contractName}' doesn't have a function ${vertex.method}` + ), + }; + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + return { + _kind: "failure", + failure: new Error( + `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given` + ), + }; + } else { + return { + _kind: "failure", + failure: new Error( + `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments` + ), + }; + } + } + + return { + _kind: "success", + result: undefined, + }; +} + +async function resolveArtifactForCallableFuture( + future: CallableFuture, + { services }: { services: Services } +): Promise { + switch (future.type) { + case "contract": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "deployed": + return future.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.contractName + ); + return artifact.abi; + default: + assertNeverRecipeFuture(future); + } + case "library": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.libraryName + ); + return artifact.abi; + default: + assertNeverRecipeFuture(future); + } + default: + assertNeverRecipeFuture(future); + } +} + +function assertNeverRecipeFuture(f: never) { + throw new Error(`Unexpected recipe future type/subtype ${f}`); +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts b/packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts new file mode 100644 index 0000000000..e1c2f9b645 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts @@ -0,0 +1,25 @@ +import { isAddress } from "@ethersproject/address"; + +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { DeployedContractRecipeVertex } from "../../types/recipeGraph"; + +export async function validateDeployedContract( + vertex: DeployedContractRecipeVertex, + _resultAccumulator: Map, + _context: { services: Services } +): Promise { + if (!isAddress(vertex.address)) { + return { + _kind: "failure", + failure: new Error( + `The existing contract ${vertex.label} has an invalid address ${vertex.address}` + ), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts b/packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts new file mode 100644 index 0000000000..58ee3d47c9 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts @@ -0,0 +1,44 @@ +import { ethers } from "ethers"; + +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { HardhatContractRecipeVertex } from "../../types/recipeGraph"; + +export async function validateHardhatContract( + vertex: HardhatContractRecipeVertex, + _resultAccumulator: Map, + { services }: { services: Services } +): Promise { + const artifactExists = await services.artifacts.hasArtifact( + vertex.contractName + ); + + if (!artifactExists) { + return { + _kind: "failure", + failure: new Error( + `Artifact with name '${vertex.contractName}' doesn't exist` + ), + }; + } + + const artifact = await services.artifacts.getArtifact(vertex.contractName); + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return { + _kind: "failure", + failure: new Error( + `The constructor of the contract '${vertex.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts new file mode 100644 index 0000000000..1b24d5736d --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts @@ -0,0 +1,44 @@ +import { ethers } from "ethers"; + +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { HardhatLibraryRecipeVertex } from "../../types/recipeGraph"; + +export async function validateHardhatLibrary( + vertex: HardhatLibraryRecipeVertex, + _resultAccumulator: Map, + { services }: { services: Services } +): Promise { + const artifactExists = await services.artifacts.hasArtifact( + vertex.libraryName + ); + + if (!artifactExists) { + return { + _kind: "failure", + failure: new Error( + `Library with name '${vertex.libraryName}' doesn't exist` + ), + }; + } + + const artifact = await services.artifacts.getArtifact(vertex.libraryName); + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + return { + _kind: "failure", + failure: new Error( + `The constructor of the library '${vertex.libraryName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validateVirtual.ts b/packages/core/src/single-graph/validation/dispatch/validateVirtual.ts new file mode 100644 index 0000000000..2a7c2d87b9 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validateVirtual.ts @@ -0,0 +1,14 @@ +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { RecipeVertex } from "../../types/recipeGraph"; + +export async function validateVirtual( + _recipeVertex: RecipeVertex, + _resultAccumulator: Map, + _context: { services: Services } +): Promise { + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/single-graph/validation/dispatch/validationDispatch.ts b/packages/core/src/single-graph/validation/dispatch/validationDispatch.ts new file mode 100644 index 0000000000..c2bde591b3 --- /dev/null +++ b/packages/core/src/single-graph/validation/dispatch/validationDispatch.ts @@ -0,0 +1,46 @@ +import { Services } from "../../../services/types"; +import { VertexVisitResult } from "../../types/graph"; +import { RecipeVertex } from "../../types/recipeGraph"; + +import { validateArtifactContract } from "./validateArtifactContract"; +import { validateArtifactLibrary } from "./validateArtifactLibrary"; +import { validateCall } from "./validateCall"; +import { validateDeployedContract } from "./validateDeployedContract"; +import { validateHardhatContract } from "./validateHardhatContract"; +import { validateHardhatLibrary } from "./validateHardhatLibrary"; +import { validateVirtual } from "./validateVirtual"; + +export function validationDispatch( + recipeVertex: RecipeVertex, + resultAccumulator: Map, + context: { services: Services } +): Promise { + switch (recipeVertex.type) { + case "ArtifactContract": + return validateArtifactContract(recipeVertex, resultAccumulator, context); + case "ArtifactLibrary": + return validateArtifactLibrary(recipeVertex, resultAccumulator, context); + case "DeployedContract": + return validateDeployedContract(recipeVertex, resultAccumulator, context); + case "Call": + return validateCall(recipeVertex, resultAccumulator, context); + case "HardhatLibrary": + return validateHardhatLibrary(recipeVertex, resultAccumulator, context); + case "HardhatContract": + return validateHardhatContract(recipeVertex, resultAccumulator, context); + case "Virtual": + return validateVirtual(recipeVertex, resultAccumulator, context); + default: + return assertUnknownRecipeVertexType(recipeVertex); + } +} + +function assertUnknownRecipeVertexType( + recipeVertex: never +): Promise { + const vertex = recipeVertex as any; + + const forReport = "type" in vertex ? vertex.type : vertex; + + throw new Error(`Unknown recipe vertex type: ${forReport}`); +} diff --git a/packages/core/src/single-graph/validation/validateRecipeGraph.ts b/packages/core/src/single-graph/validation/validateRecipeGraph.ts index 990d6f6e56..b05c2ba4b3 100644 --- a/packages/core/src/single-graph/validation/validateRecipeGraph.ts +++ b/packages/core/src/single-graph/validation/validateRecipeGraph.ts @@ -1,16 +1,23 @@ +import { Services } from "../../services/types"; +import { getSortedVertexIdsFrom } from "../graph/utils"; +import { visit } from "../graph/visit"; +import { VisitResult } from "../types/graph"; import { IRecipeGraph } from "../types/recipeGraph"; -export type ValidateRecipeGraphResult = - | { - _kind: "success"; - } - | { - _kind: "failure"; - failures: [string, Error[]]; - }; +import { validationDispatch } from "./dispatch/validationDispatch"; export function validateRecipeGraph( - _recipeGraph: IRecipeGraph -): ValidateRecipeGraphResult { - return { _kind: "success" }; + recipeGraph: IRecipeGraph, + services: Services +): Promise { + const orderedVertexIds = getSortedVertexIdsFrom(recipeGraph); + + return visit( + "Validation", + orderedVertexIds, + recipeGraph, + { services }, + new Map(), + validationDispatch + ); } diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts index 2de97830ce..11e4fa033d 100644 --- a/packages/core/test/dag.ts +++ b/packages/core/test/dag.ts @@ -1,3 +1,4 @@ +/* eslint-disable mocha/no-skipped-tests */ import { expect } from "chai"; import { ExecutionGraph } from "../src/recipes/ExecutionGraph"; @@ -6,7 +7,7 @@ import { inc } from "./helpers"; describe("ExecutionGraph", function () { describe("sort recipes", function () { - it("should work for a single recipe", function () { + it.skip("should work for a single recipe", function () { // given const executionGraph = new ExecutionGraph(); executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); @@ -20,7 +21,7 @@ describe("ExecutionGraph", function () { expect(ignitionRecipes).to.deep.equal(["MyRecipe"]); }); - it("should work for two recipes", function () { + it.skip("should work for two recipes", function () { // given const executionGraph = new ExecutionGraph(); const recipe1Inc = inc("Recipe1", "inc1", 1); @@ -40,7 +41,7 @@ describe("ExecutionGraph", function () { }); describe("sort executors", function () { - it("should work for a single executor", function () { + it.skip("should work for a single executor", function () { // given const executionGraph = new ExecutionGraph(); executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); @@ -55,7 +56,7 @@ describe("ExecutionGraph", function () { expect(executors).to.deep.equal(["inc1"]); }); - it("should work for two executors", function () { + it.skip("should work for two executors", function () { // given const executionGraph = new ExecutionGraph(); const inc1 = inc("MyRecipe", "inc1", 1); @@ -72,7 +73,7 @@ describe("ExecutionGraph", function () { expect(executors).to.deep.equal(["inc1", "incInc1"]); }); - it("should work for three sequential executors", function () { + it.skip("should work for three sequential executors", function () { // given const executionGraph = new ExecutionGraph(); const inc1 = inc("MyRecipe", "inc1", 1); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts index 6990e4a558..332ba66ef4 100644 --- a/packages/core/test/execution-engine.ts +++ b/packages/core/test/execution-engine.ts @@ -24,7 +24,8 @@ const executionEngineOptions: ExecutionEngineOptions = { txPollingInterval: 100, }; -describe("ExecutionEngine", function () { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("ExecutionEngine", function () { it("should run a single recipe with a single executor", async function () { // given const executionEngine = new ExecutionEngine( diff --git a/packages/core/test/executors/CallExecutor.ts b/packages/core/test/executors/CallExecutor.ts index c9cc38388e..c21f759f06 100644 --- a/packages/core/test/executors/CallExecutor.ts +++ b/packages/core/test/executors/CallExecutor.ts @@ -6,7 +6,8 @@ import { InternalContractFuture } from "../../src/futures/InternalContractFuture import { CallOptions } from "../../src/futures/types"; import { Artifact } from "../../src/types"; -describe("Call Executor", () => { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("Call Executor", () => { describe("validate", () => { const exampleArtifact = { _format: "hh-sol-artifact-1", diff --git a/packages/core/test/executors/ExistingContractExecutor.ts b/packages/core/test/executors/ExistingContractExecutor.ts index d4198744f4..b8727ecf4e 100644 --- a/packages/core/test/executors/ExistingContractExecutor.ts +++ b/packages/core/test/executors/ExistingContractExecutor.ts @@ -4,7 +4,8 @@ import { ExistingContractExecutor } from "../../src/executors/ExistingContractEx import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; import { ExistingContractOptions } from "../../src/futures/types"; -describe("Existing Contract - Executor", () => { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("Existing Contract - Executor", () => { describe("validate", () => { it("should pass on a valid address", async () => { const input: ExistingContractOptions = { diff --git a/packages/core/test/futures/ExistingContractFuture.ts b/packages/core/test/futures/ExistingContractFuture.ts index 75be19a63a..c1909f3607 100644 --- a/packages/core/test/futures/ExistingContractFuture.ts +++ b/packages/core/test/futures/ExistingContractFuture.ts @@ -3,7 +3,8 @@ import { assert } from "chai"; import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; import { ExistingContractOptions } from "../../src/futures/types"; -describe("Existing Contract - future", () => { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("Existing Contract - future", () => { it("has no dependencies", () => { const input: ExistingContractOptions = { contractName: "MyContract", diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/single-graph/collectLibrariesAndLink.ts similarity index 98% rename from packages/core/test/collectLibrariesAndLink.ts rename to packages/core/test/single-graph/collectLibrariesAndLink.ts index b523106f56..51a1f2b055 100644 --- a/packages/core/test/collectLibrariesAndLink.ts +++ b/packages/core/test/single-graph/collectLibrariesAndLink.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; -import { collectLibrariesAndLink } from "../src/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "../../src/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/single-graph/execution.ts b/packages/core/test/single-graph/execution.ts new file mode 100644 index 0000000000..badd84e97d --- /dev/null +++ b/packages/core/test/single-graph/execution.ts @@ -0,0 +1,309 @@ +import { assert } from "chai"; + +import { Services, TransactionOptions } from "../../src/services/types"; +import { ExecutionGraph } from "../../src/single-graph/execution/ExecutionGraph"; +import { execute } from "../../src/single-graph/execution/execute"; +import { Artifact } from "../types"; + +import { buildAdjacencyListFrom } from "./graph/helpers"; +import { getMockServices } from "./helpers"; +import { ExecutionVertex } from "./types/executionGraph"; + +describe("Execution", () => { + it("should execute a contract deploy", async () => { + const fakeArtifact: Artifact = { + contractName: "Foo", + abi: [], + bytecode: "0x0", + linkReferences: {}, + }; + + const contractDeploy: ExecutionVertex = { + type: "ContractDeploy", + id: 0, + label: "Foo", + artifact: fakeArtifact, + args: [1, "example"], + libraries: { + Math: {} as any, + }, + }; + + let actualArtifact: Artifact | undefined; + let actualArgs: any[] | undefined; + let actualLibraries: { [k: string]: any } | undefined; + + const mockServices = { + ...getMockServices(), + contracts: { + deploy: async ( + artifact: Artifact, + args: any[], + libraries: { [k: string]: any }, + _txOptions?: TransactionOptions + ): Promise => { + actualArtifact = artifact; + actualArgs = args; + actualLibraries = libraries; + + return "0x0"; + }, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash !== "0x0") { + assert.fail("Wrong transaction address"); + } + + return { contractAddress: "0xAddr" }; + }, + } as any, + }; + + const response = await assertExecuteSingleVertex( + contractDeploy, + mockServices + ); + + assert.deepStrictEqual(actualArtifact, fakeArtifact); + assert.deepStrictEqual(actualArgs, contractDeploy.args); + assert.deepStrictEqual(actualLibraries, contractDeploy.libraries); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(0), { + abi: [], + address: "0xAddr", + bytecode: "0x0", + name: "Foo", + }); + }); + + it("should execute a library deploy", async () => { + const fakeArtifact: Artifact = { + contractName: "Foo", + abi: [], + bytecode: "0x0", + linkReferences: {}, + }; + + const contractDeploy: ExecutionVertex = { + type: "LibraryDeploy", + id: 0, + label: "Foo", + artifact: fakeArtifact, + args: [1, "example"], + }; + + let actualArtifact: Artifact | undefined; + let actualArgs: any[] | undefined; + let actualLibraries: { [k: string]: any } | undefined; + + const mockServices = { + ...getMockServices(), + contracts: { + deploy: async ( + artifact: Artifact, + args: any[], + libraries: { [k: string]: any }, + _txOptions?: TransactionOptions + ): Promise => { + actualArtifact = artifact; + actualArgs = args; + actualLibraries = libraries; + + return "0x0"; + }, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash !== "0x0") { + assert.fail("Wrong transaction address"); + } + + return { contractAddress: "0xAddr" }; + }, + } as any, + }; + + const response = await assertExecuteSingleVertex( + contractDeploy, + mockServices + ); + + assert.deepStrictEqual(actualArtifact, fakeArtifact); + assert.deepStrictEqual(actualArgs, contractDeploy.args); + assert.deepStrictEqual(actualLibraries, {}); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(0), { + abi: [], + address: "0xAddr", + bytecode: "0x0", + name: "Foo", + }); + }); + + it("should execute a contract call", async () => { + const fakeArtifact: Artifact = { + contractName: "Foo", + abi: [], + bytecode: "0x0", + linkReferences: {}, + }; + + const contractDeploy: ExecutionVertex = { + type: "ContractDeploy", + id: 0, + label: "Foo", + artifact: fakeArtifact, + args: [1, "example"], + libraries: { + Math: {} as any, + }, + }; + + const contractCall: ExecutionVertex = { + type: "ContractCall", + id: 0, + label: "Foo", + contract: { vertexId: 0, type: "contract", label: "Foo", _future: true }, + method: "inc", + args: [1], + }; + + let calledAddress: string | undefined; + let calledMethod: string | undefined; + let calledArgs: any[] | undefined; + + const mockServices: Services = { + ...getMockServices(), + contracts: { + deploy: async (): Promise => { + return "0x1"; + }, + call: async ( + address: string, + _abi: any[], + method: string, + args: any[], + _txOptions?: TransactionOptions + ): Promise => { + calledAddress = address; + calledMethod = method; + calledArgs = args; + return "0x2"; + }, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash === "0x1") { + return { contractAddress: "0xAddr1" }; + } + + return { contractAddress: "0xAddr2" }; + }, + } as any, + }; + + const response = await assertDependentVertex( + contractDeploy, + contractCall, + mockServices + ); + + assert.deepStrictEqual(calledAddress, "0xAddr1"); + assert.deepStrictEqual(calledMethod, "inc"); + assert.deepStrictEqual(calledArgs, [1]); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(1), { + hash: "0x2", + }); + }); + + it("should ignore an already deployed contract", async () => { + const contractDeploy: ExecutionVertex = { + type: "DeployedContract", + id: 0, + label: "Foo", + address: "0xAddr", + abi: [], + }; + + const mockServices: Services = { + ...getMockServices(), + contracts: { + deploy: async (): Promise => { + assert.fail("deploy should not be called"); + }, + } as any, + }; + + const response = await assertExecuteSingleVertex( + contractDeploy, + mockServices + ); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(0), { + name: "Foo", + abi: [], + address: "0xAddr", + }); + }); +}); + +async function assertExecuteSingleVertex( + executionVertex: ExecutionVertex, + mockServices: Services +) { + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = buildAdjacencyListFrom({ + 0: [], + }); + executionGraph.vertexes.set(0, executionVertex); + + const mockUiService = { + setDeploymentState: () => {}, + render: () => {}, + } as any; + + return execute(executionGraph, mockServices, mockUiService); +} + +async function assertDependentVertex( + parent: ExecutionVertex, + child: ExecutionVertex, + mockServices: Services +) { + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = buildAdjacencyListFrom({ + 0: [1], + 1: [0], + }); + executionGraph.vertexes.set(0, parent); + executionGraph.vertexes.set(1, child); + + const mockUiService = { + setDeploymentState: () => {}, + render: () => {}, + } as any; + + return execute(executionGraph, mockServices, mockUiService); +} diff --git a/packages/core/test/single-graph/graph/adjacencyList.ts b/packages/core/test/single-graph/graph/adjacencyList.ts index 7b75f410b6..f292699b63 100644 --- a/packages/core/test/single-graph/graph/adjacencyList.ts +++ b/packages/core/test/single-graph/graph/adjacencyList.ts @@ -10,6 +10,8 @@ import { ensureVertex, } from "../../../src/single-graph/graph/adjacencyList"; +import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; + describe("Adjacency list", () => { it("should allow looking up deps for a two node graph", () => { const adjacencyList = constructEmptyAdjacencyList(); @@ -153,33 +155,3 @@ describe("Adjacency list", () => { }); }); }); - -function constructAdjacencyList(edges: Array<{ from: number; to: number }>) { - const adjacencyList = constructEmptyAdjacencyList(); - - const vertexes = edges.reduce((acc, { from, to }) => { - acc.add(from); - acc.add(to); - return acc; - }, new Set()); - - for (const vertex of vertexes) { - ensureVertex(adjacencyList, vertex); - } - - for (const { from, to } of edges) { - addEdge(adjacencyList, { from, to }); - } - - return adjacencyList; -} - -function buildAdjacencyListFrom(literal: { [key: number]: number[] }) { - const expectedMap = new Map>(); - - for (const [key, list] of Object.entries(literal)) { - expectedMap.set(parseInt(key, 10), new Set(list)); - } - - return expectedMap; -} diff --git a/packages/core/test/single-graph/graph/helpers.ts b/packages/core/test/single-graph/graph/helpers.ts new file mode 100644 index 0000000000..5c935ff83e --- /dev/null +++ b/packages/core/test/single-graph/graph/helpers.ts @@ -0,0 +1,37 @@ +import { + addEdge, + ensureVertex, + constructEmptyAdjacencyList, +} from "../../../src/single-graph/graph/adjacencyList"; + +export function constructAdjacencyList( + edges: Array<{ from: number; to: number }> +) { + const adjacencyList = constructEmptyAdjacencyList(); + + const vertexes = edges.reduce((acc, { from, to }) => { + acc.add(from); + acc.add(to); + return acc; + }, new Set()); + + for (const vertex of vertexes) { + ensureVertex(adjacencyList, vertex); + } + + for (const { from, to } of edges) { + addEdge(adjacencyList, { from, to }); + } + + return adjacencyList; +} + +export function buildAdjacencyListFrom(literal: { [key: number]: number[] }) { + const expectedMap = new Map>(); + + for (const [key, list] of Object.entries(literal)) { + expectedMap.set(parseInt(key, 10), new Set(list)); + } + + return expectedMap; +} diff --git a/packages/core/test/single-graph/helpers.ts b/packages/core/test/single-graph/helpers.ts new file mode 100644 index 0000000000..e79c43e76f --- /dev/null +++ b/packages/core/test/single-graph/helpers.ts @@ -0,0 +1,67 @@ +import { ethers } from "ethers"; + +import { HasParamResult } from "../../src/providers"; +import { IContractsService } from "../../src/services/ContractsService"; +import { Services, TransactionOptions } from "../../src/services/types"; +import { IArtifactsService } from "../services/ArtifactsService"; +import { IConfigService } from "../services/ConfigService"; +import { ITransactionsService } from "../services/TransactionsService"; +import { Artifact } from "../types"; + +export function getMockServices() { + const mockServices: Services = { + contracts: new MockContractsService(), + artifacts: new MockArtifactsService(), + transactions: new MockTransactionService(), + config: new MockConfigService(), + }; + + return mockServices; +} + +class MockContractsService implements IContractsService { + public deploy( + _artifact: Artifact, + _args: any[], + _libraries: { [k: string]: any }, + _txOptions?: TransactionOptions | undefined + ): Promise { + throw new Error("Method not implemented."); + } + + public call( + _address: string, + _abi: any[], + _method: string, + _args: any[], + _txOptions?: TransactionOptions | undefined + ): Promise { + throw new Error("Method not implemented."); + } +} + +class MockArtifactsService implements IArtifactsService { + public getArtifact(_name: string): Promise { + throw new Error("Method not implemented."); + } + + public hasArtifact(_name: string): Promise { + throw new Error("Method not implemented."); + } +} + +class MockTransactionService implements ITransactionsService { + public wait(_txHash: string): Promise { + return {} as any; + } +} + +class MockConfigService implements IConfigService { + public getParam(_paramName: string): Promise { + throw new Error("Method not implemented."); + } + + public hasParam(_paramName: string): Promise { + throw new Error("Method not implemented."); + } +} diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index 7b92cf0094..46cfad5d6c 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -448,6 +448,7 @@ describe("Recipes", function () { label: "Token", type: "contract", subtype: "hardhat", + contractName: "Token", _future: true, }, ]); diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/single-graph/tx-sender.ts similarity index 90% rename from packages/core/test/tx-sender.ts rename to packages/core/test/single-graph/tx-sender.ts index dbe0b11f9d..85f6fa29da 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/single-graph/tx-sender.ts @@ -3,11 +3,11 @@ import { ethers } from "ethers"; import sinon from "sinon"; import tmp from "tmp"; -import { FileJournal } from "../src/journal/FileJournal"; -import { InMemoryJournal } from "../src/journal/InMemoryJournal"; -import { Journal } from "../src/journal/types"; -import { GasProvider, IgnitionSigner } from "../src/providers"; -import { TxSender } from "../src/tx-sender"; +import { FileJournal } from "../../src/journal/FileJournal"; +import { InMemoryJournal } from "../../src/journal/InMemoryJournal"; +import { Journal } from "../../src/journal/types"; +import { GasProvider, IgnitionSigner } from "../../src/providers"; +import { TxSender } from "../../src/tx-sender"; class SignerSpy implements IgnitionSigner { private _index = -1; diff --git a/packages/core/test/single-graph/validation.ts b/packages/core/test/single-graph/validation.ts new file mode 100644 index 0000000000..8c53ffbd0e --- /dev/null +++ b/packages/core/test/single-graph/validation.ts @@ -0,0 +1,590 @@ +import { assert } from "chai"; + +import { generateRecipeGraphFrom } from "../../src/single-graph/process/generateRecipeGraphFrom"; +import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; +import type { IRecipeGraphBuilder } from "../../src/single-graph/types/recipeGraph"; +import { validateRecipeGraph } from "../../src/single-graph/validation/validateRecipeGraph"; +import { Artifact } from "../types"; + +import { getMockServices } from "./helpers"; + +describe("Validation", () => { + const exampleArtifact: Artifact = { + contractName: "Example", + abi: [], + bytecode: "0x0", + linkReferences: {}, + }; + + describe("artifact contract deploy", () => { + it("should validate a correct artifact contract deploy", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Example", exampleArtifact); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + + it("should not validate a artifact contract deploy with the wrong number of args", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Example", exampleArtifact, { + args: [1, 2, 3], + }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "The constructor of the contract 'Example' expects 0 arguments but 3 were given" + ); + }); + }); + + describe("artifact library deploy", () => { + it("should validate a correct artifact library deploy", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.library("Example", exampleArtifact); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + + it("should not validate a artifact library deploy with the wrong number of args", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.library("Example", exampleArtifact, { + args: [1, 2, 3], + }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "The constructor of the library 'Example' expects 0 arguments but 3 were given" + ); + }); + }); + + describe("call", () => { + const exampleCallArtifact = { + _format: "hh-sol-artifact-1", + contractName: "Foo", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "sub", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: "0x0", + deployedBytecode: "0x0", + linkReferences: {}, + deployedLinkReferences: {}, + }; + + it("should validate a correct call", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "sub", { args: [2] }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + assert.equal(validationResult._kind, "success"); + }); + + it("should validate an overriden call", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "inc(bool,uint256)", { args: [true, 2] }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + assert.equal(validationResult._kind, "success"); + }); + + it("should fail a call on a nonexistant function", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "nonexistant", { args: [] }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Contract 'Foo' doesn't have a function nonexistant" + ); + }); + + it("should fail a call with wrong number of arguments", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "sub", { args: [] }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Function sub in contract Foo expects 1 arguments but 0 were given" + ); + }); + + it("should fail an overloaded call with wrong number of arguments", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("MyContract"); + + m.call(example, "inc", { args: [] }); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments" + ); + }); + }); + + describe("deployed contract", () => { + it("should validate a correct artifact library deploy", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const existing = m.contractAt( + "Example", + "0x0000000000000000000000000000000000000000", + [] + ); + + return { existing }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + + it("should not validate a deployed contract with an invalid address", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const existing = m.contractAt("Example", "0xBAD", []); + + return { existing }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "The existing contract Example has an invalid address 0xBAD" + ); + }); + }); + + describe("hardhat contract deploy", () => { + it("should validate a correct contract deploy", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.contract("Example"); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + + it("should not validate a contract deploy on a non-existant hardhat contract", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const nonexistant = m.contract("Nonexistant"); + + return { nonexistant }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => false, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Artifact with name 'Nonexistant' doesn't exist" + ); + }); + }); + + describe("hardhat library deploy", () => { + it("should validate a correct deploy", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const example = m.library("Example"); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + + it("should not validate a library deploy on a non-existant hardhat library", async () => { + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const nonexistant = m.library("Nonexistant"); + + return { nonexistant }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => false, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Library with name 'Nonexistant' doesn't exist" + ); + }); + }); + + describe("virtual", () => { + it("should validate", async () => { + const subrecipe = buildRecipe("sub", (m) => { + const example = m.contract("Example"); + + return { example }; + }); + + const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const { example } = m.useRecipe(subrecipe); + + return { example }; + }); + + const { graph } = generateRecipeGraphFrom(singleRecipe, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleArtifact, + }, + } as any; + + const validationResult = await validateRecipeGraph(graph, mockServices); + + assert.equal(validationResult._kind, "success"); + }); + }); +}); From 841bc409ce6acc028b3e4ffceb2c840db6597b3d Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 5 Sep 2022 14:30:06 +0100 Subject: [PATCH 0066/1302] refactor: ensure integration tests match --- .../transformRecipeGraphToExecutionGraph.ts | 27 +- packages/hardhat-plugin/test/chainId.ts | 3 +- packages/hardhat-plugin/test/contractCalls.ts | 3 +- .../hardhat-plugin/test/contractDeploys.ts | 19 +- .../minimal/contracts/Contracts.sol | 5 + packages/hardhat-plugin/test/helpers.ts | 24 ++ packages/hardhat-plugin/test/param.ts | 3 +- packages/hardhat-plugin/test/recipes.ts | 3 +- .../hardhat-plugin/test/single-graph/calls.ts | 62 ++++ .../test/single-graph/chainId.ts | 18 ++ .../test/single-graph/contracts.ts | 93 ++++++ .../test/single-graph/execute.ts | 290 ------------------ .../test/single-graph/exiting-contract.ts | 50 +++ .../test/single-graph/libraries.ts | 99 ++++++ .../test/single-graph/params.ts | 206 +++++++++++++ packages/hardhat-plugin/test/user-recipes.ts | 3 +- 16 files changed, 600 insertions(+), 308 deletions(-) create mode 100644 packages/hardhat-plugin/test/single-graph/calls.ts create mode 100644 packages/hardhat-plugin/test/single-graph/chainId.ts create mode 100644 packages/hardhat-plugin/test/single-graph/contracts.ts delete mode 100644 packages/hardhat-plugin/test/single-graph/execute.ts create mode 100644 packages/hardhat-plugin/test/single-graph/exiting-contract.ts create mode 100644 packages/hardhat-plugin/test/single-graph/libraries.ts create mode 100644 packages/hardhat-plugin/test/single-graph/params.ts diff --git a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts index fa0b043c8f..8f4511d73d 100644 --- a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts @@ -246,11 +246,30 @@ async function resolveParameter( return scopeParameters[arg.label]; } - const param = await services.config.getParam(arg.label); + const hasParamResult = await services.config.hasParam(arg.label); - if (param === undefined) { - throw new Error(`No param for ${arg.label}`); + if (arg.subtype === "optional") { + return hasParamResult.found + ? services.config.getParam(arg.label) + : arg.defaultValue; } - return param; + if (hasParamResult.found === false) { + switch (hasParamResult.errorCode) { + case "no-params": + throw new Error( + `No parameters object provided to deploy options, but recipe requires parameter "${arg.label}"` + ); + case "param-missing": + throw new Error(`No parameter provided for "${arg.label}"`); + default: + assertNeverParamResult(hasParamResult.errorCode); + } + } + + return services.config.getParam(arg.label); +} + +function assertNeverParamResult(hasParamResult: never) { + throw new Error(`Unexpected error code ${hasParamResult}`); } diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts index 2e9eb2fb57..f5499ec907 100644 --- a/packages/hardhat-plugin/test/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -7,7 +7,8 @@ import { useEnvironment } from "./useEnvironment"; describe("chain id", () => { useEnvironment("minimal"); - it("should be available on the recipe builder", async function () { + // eslint-disable-next-line mocha/no-skipped-tests + it.skip("should be available on the recipe builder", async function () { // given const chainIdRecipe = buildRecipe("MyRecipe", (m) => { assert.equal(m.chainId, 31337); diff --git a/packages/hardhat-plugin/test/contractCalls.ts b/packages/hardhat-plugin/test/contractCalls.ts index e09b2cfc12..d038d67c2d 100644 --- a/packages/hardhat-plugin/test/contractCalls.ts +++ b/packages/hardhat-plugin/test/contractCalls.ts @@ -8,7 +8,8 @@ import { } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("contract calls", () => { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("contract calls", () => { useEnvironment("minimal"); it("should call a function in a contract", async function () { diff --git a/packages/hardhat-plugin/test/contractDeploys.ts b/packages/hardhat-plugin/test/contractDeploys.ts index 4ae43663ca..76955bcb50 100644 --- a/packages/hardhat-plugin/test/contractDeploys.ts +++ b/packages/hardhat-plugin/test/contractDeploys.ts @@ -1,3 +1,4 @@ +/* eslint-disable mocha/no-skipped-tests */ import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; @@ -13,7 +14,7 @@ describe("contract deploys", () => { useEnvironment("minimal"); describe("local", () => { - it("should deploy a contract", async function () { + it.skip("should deploy a contract", async function () { // given const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo"); @@ -32,7 +33,7 @@ describe("contract deploys", () => { }); }); - it("should deploy two contracts in parallel", async function () { + it.skip("should deploy two contracts in parallel", async function () { // given const userRecipe = buildRecipe("MyRecipe", (m) => { m.contract("Foo"); @@ -55,7 +56,7 @@ describe("contract deploys", () => { }); }); - it("should deploy two contracts sequentially", async function () { + it.skip("should deploy two contracts sequentially", async function () { // given const userRecipe = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); @@ -87,7 +88,7 @@ describe("contract deploys", () => { }); }); - it("should deploy two independent contracts and call a function in each one", async function () { + it.skip("should deploy two independent contracts and call a function in each one", async function () { // given const userRecipe = buildRecipe("MyRecipe", (m) => { const foo1 = m.contract("Foo", { id: "Foo1" }); @@ -123,7 +124,7 @@ describe("contract deploys", () => { }); describe("libraries", () => { - it("should deploy a contract with a library", async function () { + it.skip("should deploy a contract with a library", async function () { // given const withLibRecipe = buildRecipe("LibRecipe", (m) => { const rubbishMath = m.contract("RubbishMath"); @@ -157,7 +158,7 @@ describe("contract deploys", () => { }); }); - it("should deploy a contract with an existing library", async function () { + it.skip("should deploy a contract with an existing library", async function () { // given const rubbishMathLibRecipe = buildRecipe( "RubbishMathLibRecipe", @@ -220,7 +221,7 @@ describe("contract deploys", () => { }); describe("abi/bytecodes", () => { - it("should deploy a contract", async function () { + it.skip("should deploy a contract", async function () { const artifact = await this.hre.artifacts.readArtifact("Foo"); // given @@ -241,7 +242,7 @@ describe("contract deploys", () => { }); }); - describe("libraries", () => { + describe.skip("libraries", () => { it("should deploy a contract with a library", async function () { const rubbishMathArtifact = await this.hre.artifacts.readArtifact( "RubbishMath" @@ -282,7 +283,7 @@ describe("contract deploys", () => { }); }); - describe("existing", () => { + describe.skip("existing", () => { it("should deploy using existing contract", async function () { // given const originalRecipe = buildRecipe("FooRecipe", (m) => { diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index f13237348a..7b168b2d7d 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -13,6 +13,11 @@ contract Foo { require(n > 0, "n must be positive"); x += n; } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } } contract Bar { diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index c6e36e1f74..f3442f0c20 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -4,6 +4,9 @@ import { SerializedDeploymentResult, DeploymentResult, Contract, + buildRecipeSingleGraph, + IRecipeGraphBuilder, + FutureDict, } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; @@ -198,3 +201,24 @@ async function assertContract(hre: any, futureResult: SerializedFutureResult) { export function isContract(contract: any): contract is Contract { return contract.address !== undefined; } + +export async function deployRecipe( + hre: any, + recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict, + options?: { parameters: {} } +): Promise { + await hre.run("compile", { quiet: true }); + + const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); + + const deployPromise = hre.ignition.deploySingleGraph(userRecipe, { + ...options, + ui: false, + }); + + await mineBlocks(hre, [1, 1, 1], deployPromise); + + const result = await deployPromise; + + return result; +} diff --git a/packages/hardhat-plugin/test/param.ts b/packages/hardhat-plugin/test/param.ts index 9ab009b0b8..455b29d6b9 100644 --- a/packages/hardhat-plugin/test/param.ts +++ b/packages/hardhat-plugin/test/param.ts @@ -4,7 +4,8 @@ import { assert } from "chai"; import { mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("params", () => { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("params", () => { useEnvironment("minimal"); describe("required", () => { diff --git a/packages/hardhat-plugin/test/recipes.ts b/packages/hardhat-plugin/test/recipes.ts index 24c83a921a..3b9101517f 100644 --- a/packages/hardhat-plugin/test/recipes.ts +++ b/packages/hardhat-plugin/test/recipes.ts @@ -11,7 +11,8 @@ import { useEnvironment } from "./useEnvironment"; describe("recipes", () => { useEnvironment("minimal"); - it("should deploy two recipes", async function () { + // eslint-disable-next-line mocha/no-skipped-tests + it.skip("should deploy two recipes", async function () { // given const userRecipe1 = buildRecipe("MyRecipe1", (m) => { const foo = m.contract("Foo"); diff --git a/packages/hardhat-plugin/test/single-graph/calls.ts b/packages/hardhat-plugin/test/single-graph/calls.ts new file mode 100644 index 0000000000..37c0a5880d --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/calls.ts @@ -0,0 +1,62 @@ +import { assert } from "chai"; + +import { deployRecipe } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("calls", () => { + useEnvironment("minimal"); + + it("should be able to call contracts", async function () { + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); + + it("should be able to make calls in order", async function () { + const result = await deployRecipe(this.hre, (m) => { + const trace = m.contract("Trace", { + args: ["first"], + }); + + const second = m.call(trace, "addEntry", { + args: ["second"], + }); + + m.call(trace, "addEntry", { + args: ["third"], + after: [second], + }); + + return { trace }; + }); + + assert.isDefined(result.trace); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + + assert.deepStrictEqual( + [entry1, entry2, entry3], + ["first", "second", "third"] + ); + }); + + it("should note fail if call fails"); +}); diff --git a/packages/hardhat-plugin/test/single-graph/chainId.ts b/packages/hardhat-plugin/test/single-graph/chainId.ts new file mode 100644 index 0000000000..4062642e5c --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/chainId.ts @@ -0,0 +1,18 @@ +import { assert } from "chai"; + +import { deployRecipe } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("single graph version", () => { + useEnvironment("minimal"); + + it("should have a chain id", async function () { + await deployRecipe(this.hre, (m) => { + const chainId = m.chainId; + + assert.equal(chainId, 31337); + + return {}; + }); + }); +}); diff --git a/packages/hardhat-plugin/test/single-graph/contracts.ts b/packages/hardhat-plugin/test/single-graph/contracts.ts new file mode 100644 index 0000000000..83ecebf174 --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/contracts.ts @@ -0,0 +1,93 @@ +import { assert } from "chai"; + +import { deployRecipe } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("contract deploys", () => { + useEnvironment("minimal"); + + it("should be able to deploy a contract", async function () { + const result = await deployRecipe(this.hre, (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + assert.isDefined(result); + + const x = await result.foo.x(); + + assert.equal(x, Number(1)); + }); + + it("should be able to deploy a contract with arguments", async function () { + const result = await deployRecipe(this.hre, (m) => { + const greeter = m.contract("Greeter", { + args: ["Hello World"], + }); + + return { greeter }; + }); + + assert.isDefined(result); + + const greeting = await result.greeter.getGreeting(); + + assert.equal(greeting, "Hello World"); + }); + + it("should be able to deploy contracts with dependencies", async function () { + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); + + it("should be able to deploy contracts without dependencies", async function () { + const result = await deployRecipe(this.hre, (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + assert.isDefined(result); + + const x = await result.foo.x(); + const isBar = await result.bar.isBar(); + + assert.equal(x, Number(1)); + assert.equal(isBar, true); + }); + + it("should be able to use an artifact to deploy a contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const artifact = await this.hre.artifacts.readArtifact("Greeter"); + + const result = await deployRecipe(this.hre, (m) => { + const greeter = m.contract("Greeter", artifact, { + args: ["Hello World"], + }); + + return { greeter }; + }); + + assert.isDefined(result); + + const greeting = await result.greeter.getGreeting(); + + assert.equal(greeting, "Hello World"); + }); +}); diff --git a/packages/hardhat-plugin/test/single-graph/execute.ts b/packages/hardhat-plugin/test/single-graph/execute.ts deleted file mode 100644 index cb9d71375c..0000000000 --- a/packages/hardhat-plugin/test/single-graph/execute.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { - buildRecipeSingleGraph, - IRecipeGraphBuilder, - FutureDict, -} from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { mineBlocks } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; - -describe("single graph version", () => { - useEnvironment("minimal"); - - it("should be able to deploy a contract", async function () { - const result = await deployRecipe(this.hre, (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - assert.isDefined(result); - - const x = await result.foo.x(); - - assert.equal(x, Number(1)); - }); - - it("should be able to deploy a contract with arguments", async function () { - const result = await deployRecipe(this.hre, (m) => { - const greeter = m.contract("Greeter", { - args: ["Hello World"], - }); - - return { greeter }; - }); - - assert.isDefined(result); - - const greeting = await result.greeter.getGreeting(); - - assert.equal(greeting, "Hello World"); - }); - - it("should be able to deploy contracts with dependencies", async function () { - const result = await deployRecipe(this.hre, (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: [bar], - }); - - return { bar, usesContract }; - }); - - assert.isDefined(result.bar); - assert.isDefined(result.usesContract); - - const usedAddress = await result.usesContract.contractAddress(); - - assert.equal(usedAddress, result.bar.address); - }); - - describe("calls", () => { - it("should be able to call contracts", async function () { - const result = await deployRecipe(this.hre, (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); - - m.call(usesContract, "setAddress", { - args: [bar], - }); - - return { bar, usesContract }; - }); - - assert.isDefined(result.bar); - assert.isDefined(result.usesContract); - - const usedAddress = await result.usesContract.contractAddress(); - - assert.equal(usedAddress, result.bar.address); - }); - - it("should be able to make calls in order", async function () { - const result = await deployRecipe(this.hre, (m) => { - const trace = m.contract("Trace", { - args: ["first"], - }); - - const second = m.call(trace, "addEntry", { - args: ["second"], - }); - - m.call(trace, "addEntry", { - args: ["third"], - after: [second], - }); - - return { trace }; - }); - - assert.isDefined(result.trace); - - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); - - assert.deepStrictEqual( - [entry1, entry2, entry3], - ["first", "second", "third"] - ); - }); - }); - - it("should be able to use an existing contract", async function () { - await this.hre.run("compile", { quiet: true }); - - const firstResult = await deployRecipe(this.hre, (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); - - return { bar, usesContract }; - }); - - assert.isDefined(firstResult.bar.address); - assert.isDefined(firstResult.usesContract.address); - const barAddress: string = firstResult.bar.address; - const barAbi: any[] = firstResult.bar.abi; - const usesContractAddress: string = firstResult.usesContract.address; - const usesContractAbi: any[] = firstResult.usesContract.abi; - - const result = await deployRecipe(this.hre, (m) => { - const bar = m.contractAt("Bar", barAddress, barAbi); - const usesContract = m.contractAt( - "UsesContract", - usesContractAddress, - usesContractAbi - ); - - m.call(usesContract, "setAddress", { - args: [bar], - }); - - return { bar, usesContract }; - }); - - assert.isDefined(result.bar); - assert.isDefined(result.usesContract); - - const usedAddress = await result.usesContract.contractAddress(); - - assert.equal(usedAddress, result.bar.address); - }); - - it("should be able to use an artifact to deploy a contract", async function () { - await this.hre.run("compile", { quiet: true }); - - const artifact = await this.hre.artifacts.readArtifact("Greeter"); - - const result = await deployRecipe(this.hre, (m) => { - const greeter = m.contract("Greeter", artifact, { - args: ["Hello World"], - }); - - return { greeter }; - }); - - assert.isDefined(result); - - const greeting = await result.greeter.getGreeting(); - - assert.equal(greeting, "Hello World"); - }); - - it("should be able to deploy a contract that depends on a hardhat library", async function () { - await this.hre.run("compile", { quiet: true }); - - const result = await deployRecipe(this.hre, (m) => { - const rubbishMath = m.library("RubbishMath"); - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { rubbishMath, dependsOnLib }; - }); - - assert.isDefined(result); - const math = result.rubbishMath; - const contractThatDependsOnLib = result.dependsOnLib; - - const addition = await math.add(1, 2); - assert.equal(addition, 3); - - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( - 1, - 2, - 3 - ); - - assert.equal(libBasedAddtion, 6); - }); - - it("should be able to deploy a contract that depends on an artifact library", async function () { - await this.hre.run("compile", { quiet: true }); - - const libraryArtifact = await this.hre.artifacts.readArtifact( - "RubbishMath" - ); - - const result = await deployRecipe(this.hre, (m) => { - const rubbishMath = m.library("RubbishMath", libraryArtifact); - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { rubbishMath, dependsOnLib }; - }); - - assert.isDefined(result); - const math = result.rubbishMath; - const contractThatDependsOnLib = result.dependsOnLib; - - const addition = await math.add(1, 2); - assert.equal(addition, 3); - - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( - 1, - 2, - 3 - ); - - assert.equal(libBasedAddtion, 6); - }); - - describe("recipe parameters", () => { - it("should allow parameters", async function () { - const result = await deployRecipe( - this.hre, - (m) => { - const myNumber = m.getParam("MyNumber"); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }, - { - parameters: { - MyNumber: 123, - }, - } - ); - - const v = await result.foo.x(); - - assert.equal(v, Number(124)); - }); - }); -}); - -async function deployRecipe( - hre: any, - recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict, - options?: { parameters: {} } -): Promise { - await hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); - - const deployPromise = hre.ignition.deploySingleGraph(userRecipe, { - ...options, - ui: false, - }); - - await mineBlocks(hre, [1, 1, 1], deployPromise); - - const result = await deployPromise; - - return result; -} diff --git a/packages/hardhat-plugin/test/single-graph/exiting-contract.ts b/packages/hardhat-plugin/test/single-graph/exiting-contract.ts new file mode 100644 index 0000000000..2ee93c082f --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/exiting-contract.ts @@ -0,0 +1,50 @@ +import { assert } from "chai"; + +import { deployRecipe } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("existing contract", () => { + useEnvironment("minimal"); + + it("should be able to use an existing contract", async function () { + await this.hre.run("compile", { quiet: true }); + + const firstResult = await deployRecipe(this.hre, (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(firstResult.bar.address); + assert.isDefined(firstResult.usesContract.address); + const barAddress: string = firstResult.bar.address; + const barAbi: any[] = firstResult.bar.abi; + const usesContractAddress: string = firstResult.usesContract.address; + const usesContractAbi: any[] = firstResult.usesContract.abi; + + const result = await deployRecipe(this.hre, (m) => { + const bar = m.contractAt("Bar", barAddress, barAbi); + const usesContract = m.contractAt( + "UsesContract", + usesContractAddress, + usesContractAbi + ); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + assert.isDefined(result.bar); + assert.isDefined(result.usesContract); + + const usedAddress = await result.usesContract.contractAddress(); + + assert.equal(usedAddress, result.bar.address); + }); +}); diff --git a/packages/hardhat-plugin/test/single-graph/libraries.ts b/packages/hardhat-plugin/test/single-graph/libraries.ts new file mode 100644 index 0000000000..5c813a9cfa --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/libraries.ts @@ -0,0 +1,99 @@ +import { assert } from "chai"; + +import { deployRecipe } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("libraries", () => { + useEnvironment("minimal"); + + it("should be able to deploy a contract that depends on a hardhat library", async function () { + await this.hre.run("compile", { quiet: true }); + + const result = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.library("RubbishMath"); + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + assert.isDefined(result); + const math = result.rubbishMath; + const contractThatDependsOnLib = result.dependsOnLib; + + const addition = await math.add(1, 2); + assert.equal(addition, 3); + + const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( + 1, + 2, + 3 + ); + + assert.equal(libBasedAddtion, 6); + }); + + it("should be able to deploy a contract that depends on an artifact library", async function () { + await this.hre.run("compile", { quiet: true }); + + const libraryArtifact = await this.hre.artifacts.readArtifact( + "RubbishMath" + ); + + const result = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.library("RubbishMath", libraryArtifact); + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { rubbishMath, dependsOnLib }; + }); + + assert.isDefined(result); + const math = result.rubbishMath; + const contractThatDependsOnLib = result.dependsOnLib; + + const addition = await math.add(1, 2); + assert.equal(addition, 3); + + const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( + 1, + 2, + 3 + ); + + assert.equal(libBasedAddtion, 6); + }); + + it("should deploy a contract with an existing library", async function () { + // given + const libDeployResult = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.contract("RubbishMath"); + + return { rubbishMath }; + }); + + const libAddress = libDeployResult.rubbishMath.address; + const libAbi = libDeployResult.rubbishMath.abi; + + const result = await deployRecipe(this.hre, (m) => { + const rubbishMath = m.contractAt("RubbishMath", libAddress, libAbi); + + const dependsOnLib = m.contract("DependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + return { dependsOnLib }; + }); + + assert.equal(await libDeployResult.rubbishMath.add(1, 2), 3); + assert.equal(await result.dependsOnLib.addThreeNumbers(1, 2, 3), 6); + }); +}); diff --git a/packages/hardhat-plugin/test/single-graph/params.ts b/packages/hardhat-plugin/test/single-graph/params.ts new file mode 100644 index 0000000000..0befcbda1b --- /dev/null +++ b/packages/hardhat-plugin/test/single-graph/params.ts @@ -0,0 +1,206 @@ +import { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { deployRecipe, mineBlocks } from "../helpers"; +import { useEnvironment } from "../useEnvironment"; + +describe("recipe parameters", () => { + useEnvironment("minimal"); + + describe("required", () => { + it("should be able to retrieve a number", async function () { + const result = await deployRecipe( + this.hre, + (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }, + { + parameters: { + MyNumber: 123, + }, + } + ); + + const v = await result.foo.x(); + + assert.equal(v, Number(124)); + }); + + it("should be able to retrieve a string", async function () { + const result = await deployRecipe( + this.hre, + (m) => { + const myString = m.getParam("MyString"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }, + { + parameters: { + MyString: "Example", + }, + } + ); + + const v = await result.greeter.getGreeting(); + + assert.equal(v, "Example"); + }); + }); + + describe("optional", () => { + it("should be able to retrieve a default number", async function () { + const result = await deployRecipe(this.hre, (m) => { + const myNumber = m.getOptionalParam("MyNumber", 42); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + // then + const v = await result.foo.x(); + + assert.equal(v, Number(43)); + }); + + it("should be able to override a default number", async function () { + const result = await deployRecipe( + this.hre, + (m) => { + const myNumber = m.getOptionalParam("MyNumber", 10); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }, + { + parameters: { + MyNumber: 20, + }, + } + ); + + // then + const v = await result.foo.x(); + + assert.equal(v, Number(21)); + }); + + it("should be able to retrieve a default string", async function () { + const result = await deployRecipe(this.hre, (m) => { + const myString = m.getOptionalParam("MyString", "Example"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }); + + const v = await result.greeter.getGreeting(); + + assert.equal(v, "Example"); + }); + + it("should be able to override a default string", async function () { + const result = await deployRecipe( + this.hre, + (m) => { + const myString = m.getOptionalParam("MyString", "Example"); + + const greeter = m.contract("Greeter", { + args: [myString], + }); + + return { greeter }; + }, + { + parameters: { + MyString: "NotExample", + }, + } + ); + + // then + const v = await result.greeter.getGreeting(); + + assert.equal(v, "NotExample"); + }); + }); + + describe("validation", () => { + it("should throw if no parameters object provided", async function () { + await this.hre.run("compile", { quiet: true }); + + const userRecipe = buildRecipeSingleGraph("MyRecipe", (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, {}); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'No parameters object provided to deploy options, but recipe requires parameter "MyNumber"' + ); + }); + + it("should throw if parameter missing from parameters", async function () { + await this.hre.run("compile", { quiet: true }); + + const userRecipe = buildRecipeSingleGraph("MyRecipe", (m) => { + const myNumber = m.getParam("MyNumber"); + + const foo = m.contract("Foo"); + + m.call(foo, "incByPositiveNumber", { + args: [myNumber], + }); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + parameters: { + NotMyNumber: 11, + }, + }); + + await mineBlocks(this.hre, [1, 1], deployPromise); + + await assert.isRejected( + deployPromise, + 'No parameter provided for "MyNumber"' + ); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts index 53bf0682d3..0c981e8cee 100644 --- a/packages/hardhat-plugin/test/user-recipes.ts +++ b/packages/hardhat-plugin/test/user-recipes.ts @@ -10,7 +10,8 @@ import { import { useEnvironment } from "./useEnvironment"; -describe("User recipes", function () { +// eslint-disable-next-line mocha/no-skipped-tests +describe.skip("User recipes", function () { useEnvironment("user-recipes"); describe("loadUserRecipes", function () { From 50c7062f11b44d94d08ee7ca87e820073505f548 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 5 Sep 2022 14:34:21 +0100 Subject: [PATCH 0067/1302] refactor: remove old tests --- packages/core/test/dag.ts | 96 ----- packages/core/test/execution-engine.ts | 179 ---------- packages/core/test/executors/CallExecutor.ts | 185 ---------- .../executors/ExistingContractExecutor.ts | 45 --- .../test/futures/ExistingContractFuture.ts | 19 - packages/core/test/helpers.ts | 173 --------- packages/hardhat-plugin/test/chainId.ts | 19 - packages/hardhat-plugin/test/contractCalls.ts | 54 --- .../hardhat-plugin/test/contractDeploys.ts | 330 ------------------ packages/hardhat-plugin/test/param.ts | 285 --------------- packages/hardhat-plugin/test/recipes.ts | 48 --- packages/hardhat-plugin/test/user-recipes.ts | 3 +- 12 files changed, 1 insertion(+), 1435 deletions(-) delete mode 100644 packages/core/test/dag.ts delete mode 100644 packages/core/test/execution-engine.ts delete mode 100644 packages/core/test/executors/CallExecutor.ts delete mode 100644 packages/core/test/executors/ExistingContractExecutor.ts delete mode 100644 packages/core/test/futures/ExistingContractFuture.ts delete mode 100644 packages/core/test/helpers.ts delete mode 100644 packages/hardhat-plugin/test/chainId.ts delete mode 100644 packages/hardhat-plugin/test/contractCalls.ts delete mode 100644 packages/hardhat-plugin/test/contractDeploys.ts delete mode 100644 packages/hardhat-plugin/test/param.ts delete mode 100644 packages/hardhat-plugin/test/recipes.ts diff --git a/packages/core/test/dag.ts b/packages/core/test/dag.ts deleted file mode 100644 index 11e4fa033d..0000000000 --- a/packages/core/test/dag.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* eslint-disable mocha/no-skipped-tests */ -import { expect } from "chai"; - -import { ExecutionGraph } from "../src/recipes/ExecutionGraph"; - -import { inc } from "./helpers"; - -describe("ExecutionGraph", function () { - describe("sort recipes", function () { - it.skip("should work for a single recipe", function () { - // given - const executionGraph = new ExecutionGraph(); - executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); - - // when - const ignitionRecipes = executionGraph - .getSortedRecipes() - .map((m) => m.id); - - // then - expect(ignitionRecipes).to.deep.equal(["MyRecipe"]); - }); - - it.skip("should work for two recipes", function () { - // given - const executionGraph = new ExecutionGraph(); - const recipe1Inc = inc("Recipe1", "inc1", 1); - const recipe2Inc = inc("Recipe2", "inc1", recipe1Inc.future); - - executionGraph.addExecutor(recipe2Inc); - executionGraph.addExecutor(recipe1Inc); - - // when - const ignitionRecipes = executionGraph - .getSortedRecipes() - .map((m) => m.id); - - // then - expect(ignitionRecipes).to.deep.equal(["Recipe1", "Recipe2"]); - }); - }); - - describe("sort executors", function () { - it.skip("should work for a single executor", function () { - // given - const executionGraph = new ExecutionGraph(); - executionGraph.addExecutor(inc("MyRecipe", "inc1", 1)); - - // when - const [ignitionRecipe] = executionGraph.getSortedRecipes(); - const executors = ignitionRecipe - .getSortedExecutors() - .map((e) => e.future.id); - - // then - expect(executors).to.deep.equal(["inc1"]); - }); - - it.skip("should work for two executors", function () { - // given - const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyRecipe", "inc1", 1); - executionGraph.addExecutor(inc("MyRecipe", "incInc1", inc1.future)); - executionGraph.addExecutor(inc1); - - // when - const [ignitionRecipe] = executionGraph.getSortedRecipes(); - const executors = ignitionRecipe - .getSortedExecutors() - .map((e) => e.future.id); - - // then - expect(executors).to.deep.equal(["inc1", "incInc1"]); - }); - - it.skip("should work for three sequential executors", function () { - // given - const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyRecipe", "inc1", 1); - const incInc1 = inc("MyRecipe", "incInc1", inc1.future); - const incIncInc1 = inc("MyRecipe", "incIncInc1", incInc1.future); - executionGraph.addExecutor(incIncInc1); - executionGraph.addExecutor(inc1); - executionGraph.addExecutor(incInc1); - - // when - const [ignitionRecipe] = executionGraph.getSortedRecipes(); - const executors = ignitionRecipe - .getSortedExecutors() - .map((e) => e.future.id); - - // then - expect(executors).to.deep.equal(["inc1", "incInc1", "incIncInc1"]); - }); - }); -}); diff --git a/packages/core/test/execution-engine.ts b/packages/core/test/execution-engine.ts deleted file mode 100644 index 332ba66ef4..0000000000 --- a/packages/core/test/execution-engine.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { assert } from "chai"; - -import { DeploymentState } from "../src/deployment-state"; -import { - ExecutionEngine, - ExecutionEngineOptions, - IgnitionRecipesResults, -} from "../src/execution-engine"; -import { InMemoryJournal } from "../src/journal/InMemoryJournal"; -import { ExecutionGraph } from "../src/recipes/ExecutionGraph"; - -import { getMockedProviders, inc, runUntil, runUntilReady } from "./helpers"; - -const mockRecipesResults: IgnitionRecipesResults = { - load: async () => { - return undefined; - }, - save: async () => {}, -}; - -const executionEngineOptions: ExecutionEngineOptions = { - parallelizationLevel: 1, - loggingEnabled: false, - txPollingInterval: 100, -}; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("ExecutionEngine", function () { - it("should run a single recipe with a single executor", async function () { - // given - const executionEngine = new ExecutionEngine( - getMockedProviders(), - new InMemoryJournal(), - mockRecipesResults, - executionEngineOptions - ); - - const inc1 = inc("MyRecipe", "inc1", 1); - - const executionGraph = new ExecutionGraph(); - executionGraph.addExecutor(inc1); - - // when - const executionGenerator = executionEngine.execute(executionGraph); - const deploymentResult = await runUntilReady(executionGenerator); - - // then - const resultRecipes = deploymentResult.getRecipes(); - - assert.lengthOf(resultRecipes, 1); - const [resultRecipe] = resultRecipes; - assert.isTrue(resultRecipe.isSuccess()); - assert.equal(resultRecipe.count(), 1); - - const futureResult = deploymentResult.getFutureResult("MyRecipe", "inc1"); - - assert.equal(futureResult, 2); - - assert.isTrue(inc1.isSuccess()); - }); - - it("should wait for a dependency", async function () { - // given - const executionEngine = new ExecutionEngine( - getMockedProviders(), - new InMemoryJournal(), - mockRecipesResults, - executionEngineOptions - ); - - const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyRecipe", "inc1", 1); - inc1.behavior = "on-demand"; - const incInc1 = inc("MyRecipe", "incInc1", inc1.future); - executionGraph.addExecutor(inc1); - executionGraph.addExecutor(incInc1); - - // when - const executionGenerator = executionEngine.execute(executionGraph); - await runUntil(executionGenerator, () => { - return inc1.isRunning(); - }); - - // then - assert.isTrue(incInc1.isReady()); - - // when - inc1.finish(); - const deploymentState: DeploymentState = await runUntil( - executionGenerator, - (result) => { - return result !== undefined; - } - ); - - // then - const resultRecipes = deploymentState.getRecipes(); - - assert.lengthOf(resultRecipes, 1); - assert.isTrue(resultRecipes[0].isSuccess()); - assert.equal(resultRecipes[0].count(), 2); - - const inc1Result = deploymentState.getFutureResult("MyRecipe", "inc1"); - const incInc1Result = deploymentState.getFutureResult( - "MyRecipe", - "incInc1" - ); - - assert.equal(inc1Result, 2); - assert.equal(incInc1Result, 3); - - assert.isTrue(inc1.isSuccess()); - assert.isTrue(incInc1.isSuccess()); - }); - - it("should not run an executor if a dependency fails", async function () { - // given - const executionEngine = new ExecutionEngine( - getMockedProviders(), - new InMemoryJournal(), - mockRecipesResults, - executionEngineOptions - ); - - const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyRecipe", "inc1", 1); - inc1.behavior = "fail"; - const incInc1 = inc("MyRecipe", "incInc1", inc1.future); - executionGraph.addExecutor(inc1); - executionGraph.addExecutor(incInc1); - - // when - const executionGenerator = executionEngine.execute(executionGraph); - const deploymentResult = await runUntilReady(executionGenerator); - - // then - const resultRecipes = deploymentResult.getRecipes(); - - assert.lengthOf(resultRecipes, 1); - assert.isFalse(resultRecipes[0].isSuccess()); - assert.isTrue(resultRecipes[0].isFailure()); - - assert.isTrue(inc1.isFailure()); - assert.isTrue(incInc1.isReady()); - }); - - it("should not run an executor if a dependency holds", async function () { - // given - const executionEngine = new ExecutionEngine( - getMockedProviders(), - new InMemoryJournal(), - mockRecipesResults, - executionEngineOptions - ); - - const executionGraph = new ExecutionGraph(); - const inc1 = inc("MyRecipe", "inc1", 1); - inc1.behavior = "hold"; - const incInc1 = inc("MyRecipe", "incInc1", inc1.future); - executionGraph.addExecutor(inc1); - executionGraph.addExecutor(incInc1); - - // when - const executionGenerator = executionEngine.execute(executionGraph); - const deploymentResult = await runUntilReady(executionGenerator); - - // then - if (deploymentResult === undefined) { - assert.fail("Deployment result should be ready"); - } - const resultRecipes = deploymentResult.getRecipes(); - - assert.lengthOf(resultRecipes, 1); - assert.isTrue(resultRecipes[0].isHold()); - - assert.isTrue(inc1.isHold()); - assert.isTrue(incInc1.isReady()); - }); -}); diff --git a/packages/core/test/executors/CallExecutor.ts b/packages/core/test/executors/CallExecutor.ts deleted file mode 100644 index c21f759f06..0000000000 --- a/packages/core/test/executors/CallExecutor.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { assert } from "chai"; - -import { CallExecutor } from "../../src/executors/CallExecutor"; -import { InternalCallFuture } from "../../src/futures/InternalCallFuture"; -import { InternalContractFuture } from "../../src/futures/InternalContractFuture"; -import { CallOptions } from "../../src/futures/types"; -import { Artifact } from "../../src/types"; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("Call Executor", () => { - describe("validate", () => { - const exampleArtifact = { - _format: "hh-sol-artifact-1", - contractName: "Foo", - sourceName: "contracts/Foo.sol", - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "sub", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "x", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - ], - bytecode: "0x0", - deployedBytecode: "0x0", - linkReferences: {}, - deployedLinkReferences: {}, - }; - - const exampleContractFuture = new InternalContractFuture( - "MyRecipe", - "MyContract", - { - contractName: "MyContract", - args: [], - libraries: [], - } - ); - - it("should call existing function", async () => { - const input: CallOptions = { - contract: exampleContractFuture, - method: "sub", - args: [2], - }; - - await assertCallValidation(input, exampleArtifact, []); - }); - - it("should call overloaded function", async () => { - const input: CallOptions = { - contract: exampleContractFuture, - method: "inc(bool,uint256)", - args: [true, 2], - }; - - await assertCallValidation(input, exampleArtifact, []); - }); - - it("should fail on call to non-existing function", async () => { - const input: CallOptions = { - contract: exampleContractFuture, - method: "nonexistant", - args: [], - }; - - await assertCallValidation(input, exampleArtifact, [ - "Contract 'MyContract' doesn't have a function nonexistant", - ]); - }); - - it("should fail on call to existing function with wrong number of args", async () => { - const input: CallOptions = { - contract: exampleContractFuture, - method: "sub", - args: [], - }; - - await assertCallValidation(input, exampleArtifact, [ - "Function sub in contract MyContract expects 1 arguments but 0 were given", - ]); - }); - - it("should fail on overloaded call to existing function with wrong number of args", async () => { - const input: CallOptions = { - contract: exampleContractFuture, - method: "inc", - args: [], - }; - - await assertCallValidation(input, exampleArtifact, [ - "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments", - ]); - }); - }); -}); - -async function assertCallValidation( - input: CallOptions, - artifact: Artifact, - expected: string[] -) { - const mockArtifactsService = { - hasArtifact: (_contractName: string): boolean => { - return true; - }, - getArtifact: (_contractName: string) => { - return artifact; - }, - }; - - const future = new InternalCallFuture("MyRecipe", "future-1", input); - - const ex = new CallExecutor(future); - - const validationResult = await ex.validate(input, { - artifacts: mockArtifactsService, - } as any); - - assert.deepStrictEqual(validationResult, expected); -} diff --git a/packages/core/test/executors/ExistingContractExecutor.ts b/packages/core/test/executors/ExistingContractExecutor.ts deleted file mode 100644 index b8727ecf4e..0000000000 --- a/packages/core/test/executors/ExistingContractExecutor.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { assert } from "chai"; - -import { ExistingContractExecutor } from "../../src/executors/ExistingContractExecutor"; -import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; -import { ExistingContractOptions } from "../../src/futures/types"; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("Existing Contract - Executor", () => { - describe("validate", () => { - it("should pass on a valid address", async () => { - const input: ExistingContractOptions = { - contractName: "MyContract", - address: "0x0000000000000000000000000000000000000000", - abi: [], - }; - - await assertExistingContractValidation(input, []); - }); - - it("should fail on a bad address", async () => { - const input: ExistingContractOptions = { - contractName: "MyContract", - address: "0x123", - abi: [], - }; - - await assertExistingContractValidation(input, [ - "The existing contract MyContract is an invalid address 0x123", - ]); - }); - }); -}); - -async function assertExistingContractValidation( - input: ExistingContractOptions, - expected: string[] -) { - const future = new ExistingContractFuture("MyRecipe", "future-1", input); - - const ex = new ExistingContractExecutor(future); - - const validationResult = await ex.validate(input, {} as any); - - assert.deepStrictEqual(validationResult, expected); -} diff --git a/packages/core/test/futures/ExistingContractFuture.ts b/packages/core/test/futures/ExistingContractFuture.ts deleted file mode 100644 index c1909f3607..0000000000 --- a/packages/core/test/futures/ExistingContractFuture.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { assert } from "chai"; - -import { ExistingContractFuture } from "../../src/futures/ExistingContractFuture"; -import { ExistingContractOptions } from "../../src/futures/types"; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("Existing Contract - future", () => { - it("has no dependencies", () => { - const input: ExistingContractOptions = { - contractName: "MyContract", - address: "0x0000000000000000000000000000000000000000", - abi: [], - }; - - const future = new ExistingContractFuture("MyRecipe", "future-1", input); - - assert.deepStrictEqual(future.getDependencies(), []); - }); -}); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts deleted file mode 100644 index b95ec71ad0..0000000000 --- a/packages/core/test/helpers.ts +++ /dev/null @@ -1,173 +0,0 @@ -import { DeploymentState } from "../src/deployment-state"; -import { Executor } from "../src/executors/Executor"; -import { Hold } from "../src/executors/Hold"; -import { InternalFuture } from "../src/futures/InternalFuture"; -import { IFuture } from "../src/futures/types"; -import { - ArtifactsProvider, - ConfigProvider, - EIP1193Provider, - GasProvider, - HasParamResult, - IgnitionSigner, - Providers, - SignersProvider, - TransactionsProvider, -} from "../src/providers"; - -import { ParamValue } from "./recipes/types"; - -export function getMockedProviders(): Providers { - return { - artifacts: new MockArtifactsProvider(), - ethereumProvider: new MockEthereumProvider(), - gasProvider: new MockGasProvider(), - signers: new MockSignersProvider(), - transactions: new TransactionsMockProvider(), - config: new ConfigMockProvider(), - }; -} - -export function emptyDeploymentResult() { - return new DeploymentState(); -} - -/** - * Test executor that receives a number (or a future that produces a number) - * and increments it. - */ -export function inc( - recipeId: string, - futureId: string, - x: IFuture -): IncreaseNumberExecutor { - return new IncreaseNumberExecutor( - new IncreaseNumberFuture(recipeId, futureId, x) - ); -} - -class MockEthereumProvider implements EIP1193Provider { - public async request(): Promise { - throw new Error("not implemented"); - } -} - -class MockGasProvider implements GasProvider { - public async estimateGasLimit(): Promise { - throw new Error("not implemented"); - } - - public async estimateGasPrice(): Promise { - throw new Error("not implemented"); - } -} - -class MockSigner implements IgnitionSigner { - public async sendTransaction(): Promise { - throw new Error("not implemented"); - } -} - -class MockSignersProvider implements SignersProvider { - public async getDefaultSigner(): Promise { - return new MockSigner(); - } -} - -class TransactionsMockProvider implements TransactionsProvider { - public async isConfirmed(): Promise { - throw new Error("not implemented"); - } - public async isMined(): Promise { - throw new Error("not implemented"); - } -} - -class ConfigMockProvider implements ConfigProvider { - public setParams(_parameters: { [key: string]: ParamValue }): Promise { - throw new Error("Method not implemented."); - } - - public hasParam(_paramName: string): Promise { - throw new Error("Method not implemented."); - } - - public getParam(_paramName: string): Promise { - throw new Error("not implemented"); - } -} - -class MockArtifactsProvider implements ArtifactsProvider { - public async getArtifact(_name: string): Promise { - throw new Error("not implemented"); - } - public async hasArtifact(_name: string): Promise { - throw new Error("not implemented"); - } -} - -class IncreaseNumberFuture extends InternalFuture, number> { - public getDependencies(): InternalFuture[] { - return InternalFuture.isFuture(this.input) ? [this.input] : []; - } -} - -class IncreaseNumberExecutor extends Executor, number> { - public behavior: "default" | "on-demand" | "fail" | "hold" = "default"; - public finish: any; - - public async execute(input: number): Promise { - if (this.behavior === "default") { - return input + 1; - } else if (this.behavior === "on-demand") { - return new Promise((resolve) => { - this.finish = () => resolve(input + 1); - }); - } else if (this.behavior === "fail") { - throw new Error("Fail"); - } else if (this.behavior === "hold") { - throw new Hold("Hold"); - } - - const exhaustiveCheck: never = this.behavior; - return exhaustiveCheck; - } - - public async validate(): Promise { - return []; - } - - public getDescription() { - const input = this.future.input; - - if (typeof input === "number") { - return `Increase ${input}`; - } else { - return `Increase result of ${(input as any).id}`; - } - } -} - -export async function runUntil( - generator: AsyncGenerator, - condition: (result: DeploymentState | undefined | void) => boolean, - extraTicks = 5 -) { - let result: any; - while (true) { - result = (await generator.next()).value; - if (condition(result)) { - break; - } - } - - for (let i = 0; i < extraTicks; i++) { - await generator.next(); - } - - return result; -} - -export async function runUntilReady(generator: AsyncGenerator) { - return runUntil(generator, (result) => result !== undefined); -} diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts deleted file mode 100644 index f5499ec907..0000000000 --- a/packages/hardhat-plugin/test/chainId.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { buildRecipe } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { deployRecipes } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe("chain id", () => { - useEnvironment("minimal"); - - // eslint-disable-next-line mocha/no-skipped-tests - it.skip("should be available on the recipe builder", async function () { - // given - const chainIdRecipe = buildRecipe("MyRecipe", (m) => { - assert.equal(m.chainId, 31337); - }); - - await deployRecipes(this.hre, [chainIdRecipe], [1, 1]); - }); -}); diff --git a/packages/hardhat-plugin/test/contractCalls.ts b/packages/hardhat-plugin/test/contractCalls.ts deleted file mode 100644 index d038d67c2d..0000000000 --- a/packages/hardhat-plugin/test/contractCalls.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { buildRecipe } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - assertDeploymentState, - deployRecipes, - resultAssertions, -} from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("contract calls", () => { - useEnvironment("minimal"); - - it("should call a function in a contract", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - const foo = m.contract("Foo"); - m.call(foo, "inc"); - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [userRecipe], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - "Foo.inc": resultAssertions.transaction(), - }, - }); - }); - - it("should fail if a call fails", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [0], - }); - }); - - // then - await assert.isRejected(deployRecipes(this.hre, [userRecipe], [1, 1])); - }); -}); diff --git a/packages/hardhat-plugin/test/contractDeploys.ts b/packages/hardhat-plugin/test/contractDeploys.ts deleted file mode 100644 index 76955bcb50..0000000000 --- a/packages/hardhat-plugin/test/contractDeploys.ts +++ /dev/null @@ -1,330 +0,0 @@ -/* eslint-disable mocha/no-skipped-tests */ -import { buildRecipe } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - assertDeploymentState, - deployRecipes, - isContract, - resultAssertions, -} from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe("contract deploys", () => { - useEnvironment("minimal"); - - describe("local", () => { - it.skip("should deploy a contract", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - m.contract("Foo"); - }); - - // when - const deploymentResult = await deployRecipes(this.hre, [userRecipe], [1]); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - }, - }); - }); - - it.skip("should deploy two contracts in parallel", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - m.contract("Foo"); - m.contract("Bar"); - }); - - // when - const deploymentResult = await deployRecipes(this.hre, [userRecipe], [2]); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - Bar: resultAssertions.contract(async (bar) => { - assert.isTrue(await bar.isBar()); - }), - }, - }); - }); - - it.skip("should deploy two contracts sequentially", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - const foo = m.contract("Foo"); - m.contract("UsesContract", { - args: [foo], - }); - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [userRecipe], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - UsesContract: resultAssertions.contract(async (usesContract) => { - const contractAddress = await usesContract.contractAddress(); - const fooResult: any = deploymentResult.MyRecipe.Foo; - - assert.equal(contractAddress, fooResult.value.address); - }), - }, - }); - }); - - it.skip("should deploy two independent contracts and call a function in each one", async function () { - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - const foo1 = m.contract("Foo", { id: "Foo1" }); - const foo2 = m.contract("Foo", { id: "Foo2" }); - m.call(foo1, "inc"); - m.call(foo2, "inc"); - m.call(foo2, "inc", { id: "Foo2.inc2" }); - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [userRecipe], - [2, 2, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo1: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - Foo2: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 3); - }), - "Foo1.inc": resultAssertions.transaction(), - "Foo2.inc": resultAssertions.transaction(), - "Foo2.inc2": resultAssertions.transaction(), - }, - }); - }); - - describe("libraries", () => { - it.skip("should deploy a contract with a library", async function () { - // given - const withLibRecipe = buildRecipe("LibRecipe", (m) => { - const rubbishMath = m.contract("RubbishMath"); - - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { dependsOnLib }; - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [withLibRecipe], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - LibRecipe: { - RubbishMath: resultAssertions.contract(async (rubbishMath) => { - assert.equal(await rubbishMath.add(1, 2), 3); - }), - DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { - assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); - }), - }, - }); - }); - - it.skip("should deploy a contract with an existing library", async function () { - // given - const rubbishMathLibRecipe = buildRecipe( - "RubbishMathLibRecipe", - (m) => { - const rubbishMath = m.contract("RubbishMath"); - - return { rubbishMath }; - } - ); - - const rubbishMathDeploymentResult = await deployRecipes( - this.hre, - [rubbishMathLibRecipe], - [1] - ); - - if ( - !isContract( - rubbishMathDeploymentResult.RubbishMathLibRecipe.RubbishMath.value - ) - ) { - assert.fail("Expected library deployed"); - } - - const { address, abi } = - rubbishMathDeploymentResult.RubbishMathLibRecipe.RubbishMath.value; - - const withLibRecipe = buildRecipe("LibRecipe", (m) => { - const rubbishMath = m.contractAt("RubbishMath", address, abi); - - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { dependsOnLib }; - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [withLibRecipe], - [1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - LibRecipe: { - RubbishMath: resultAssertions.contract(async (rubbishMath) => { - assert.equal(await rubbishMath.add(1, 2), 3); - }), - DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { - assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); - }), - }, - }); - }); - }); - }); - - describe("abi/bytecodes", () => { - it.skip("should deploy a contract", async function () { - const artifact = await this.hre.artifacts.readArtifact("Foo"); - - // given - const userRecipe = buildRecipe("MyRecipe", (m) => { - m.contract("Foo", artifact); - }); - - // when - const deploymentResult = await deployRecipes(this.hre, [userRecipe], [1]); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - }), - }, - }); - }); - - describe.skip("libraries", () => { - it("should deploy a contract with a library", async function () { - const rubbishMathArtifact = await this.hre.artifacts.readArtifact( - "RubbishMath" - ); - - // given - const withLibRecipe = buildRecipe("LibRecipe", (m) => { - const rubbishMath = m.contract("RubbishMath", rubbishMathArtifact); - - const dependsOnLib = m.contract("DependsOnLib", { - libraries: { - RubbishMath: rubbishMath, - }, - }); - - return { dependsOnLib }; - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [withLibRecipe], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - LibRecipe: { - RubbishMath: resultAssertions.contract(async (rubbishMath) => { - assert.equal(await rubbishMath.add(1, 2), 3); - }), - DependsOnLib: resultAssertions.contract(async (dependsOnLib) => { - assert.equal(await dependsOnLib.addThreeNumbers(1, 2, 3), 6); - }), - }, - }); - }); - }); - }); - - describe.skip("existing", () => { - it("should deploy using existing contract", async function () { - // given - const originalRecipe = buildRecipe("FooRecipe", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const originalDeploymentResult = await deployRecipes( - this.hre, - [originalRecipe], - [1] - ); - - if (!isContract(originalDeploymentResult.FooRecipe.Foo.value)) { - assert.fail("Expected contract deployed"); - } - - const { address, abi } = originalDeploymentResult.FooRecipe.Foo.value; - - const leveragingExistingRecipe = buildRecipe("ExistingFooRecipe", (m) => { - const existingFoo = m.contractAt("ExistingFoo", address, abi); - - return { existingFoo }; - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [leveragingExistingRecipe], - [1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - ExistingFooRecipe: { - ExistingFoo: resultAssertions.contract(async (existingFoo) => { - assert.isTrue(await existingFoo.isFoo()); - }), - }, - }); - }); - }); -}); diff --git a/packages/hardhat-plugin/test/param.ts b/packages/hardhat-plugin/test/param.ts deleted file mode 100644 index 455b29d6b9..0000000000 --- a/packages/hardhat-plugin/test/param.ts +++ /dev/null @@ -1,285 +0,0 @@ -import { buildRecipe, RecipeDefinition } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { mineBlocks } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("params", () => { - useEnvironment("minimal"); - - describe("required", () => { - it("should be able to retrieve a number", async function () { - const result = await deployRecipe( - this.hre, - (m) => { - const myNumber = m.getParam("MyNumber"); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }, - { - parameters: { - MyNumber: 123, - }, - } - ); - - const v = await result.foo.x(); - - assert.equal(v, Number(124)); - }); - - it("should be able to retrieve a string", async function () { - const result = await deployRecipe( - this.hre, - (m) => { - const myString = m.getParam("MyString"); - - const greeter = m.contract("Greeter", { - args: [myString], - }); - - return { greeter }; - }, - { - parameters: { - MyString: "Example", - }, - } - ); - - const v = await result.greeter.getGreeting(); - - assert.equal(v, "Example"); - }); - }); - - describe("optional", () => { - it("should be able to retrieve a default number", async function () { - const result = await deployRecipe(this.hre, (m) => { - const myNumber = m.getOptionalParam("MyNumber", 42); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }); - - // then - const v = await result.foo.x(); - - assert.equal(v, Number(43)); - }); - - it("should be able to override a default number", async function () { - const result = await deployRecipe( - this.hre, - (m) => { - const myNumber = m.getOptionalParam("MyNumber", 10); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }, - { - parameters: { - MyNumber: 20, - }, - } - ); - - // then - const v = await result.foo.x(); - - assert.equal(v, Number(21)); - }); - - it("should be able to retrieve a default string", async function () { - const result = await deployRecipe(this.hre, (m) => { - const myString = m.getOptionalParam("MyString", "Example"); - - const greeter = m.contract("Greeter", { - args: [myString], - }); - - return { greeter }; - }); - - const v = await result.greeter.getGreeting(); - - assert.equal(v, "Example"); - }); - - it("should be able to override a default string", async function () { - const result = await deployRecipe( - this.hre, - (m) => { - const myString = m.getOptionalParam("MyString", "Example"); - - const greeter = m.contract("Greeter", { - args: [myString], - }); - - return { greeter }; - }, - { - parameters: { - MyString: "NotExample", - }, - } - ); - - // then - const v = await result.greeter.getGreeting(); - - assert.equal(v, "NotExample"); - }); - }); - - describe("validation", () => { - it("should throw if no parameters object provided", async function () { - await this.hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", (m) => { - const myNumber = m.getParam("MyNumber"); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(userRecipe, {}); - - await mineBlocks(this.hre, [1, 1], deployPromise); - - await assert.isRejected( - deployPromise, - 'No parameters object provided to deploy options, but recipe requires parameter "MyNumber"' - ); - }); - - it("should throw if parameter missing from parameters", async function () { - await this.hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", (m) => { - const myNumber = m.getParam("MyNumber"); - - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(userRecipe, { - parameters: { - NotMyNumber: 11, - }, - }); - - await mineBlocks(this.hre, [1, 1], deployPromise); - - await assert.isRejected( - deployPromise, - 'No parameter provided for "MyNumber"' - ); - }); - - it("should ban multiple params with the same name", async function () { - await this.hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", (m) => { - const myNumber = m.getParam("MyNumber"); - const myNumber2 = m.getParam("MyNumber"); - - const foo = m.contract("Foo"); - - m.call(foo, "incTwoNumbers", { - args: [myNumber, myNumber2], - }); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(userRecipe, { - parameters: { - NotMyNumber: 11, - }, - }); - - await mineBlocks(this.hre, [1, 1], deployPromise); - - await assert.isRejected( - deployPromise, - 'A parameter should only be retrieved once, but found more than one call to getParam for "MyNumber"' - ); - }); - - it("should ban multiple optional params with the same name", async function () { - await this.hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", (m) => { - const myNumber = m.getOptionalParam("MyNumber", 11); - const myNumber2 = m.getOptionalParam("MyNumber", 12); - - const foo = m.contract("Foo"); - - m.call(foo, "incTwoNumbers", { - args: [myNumber, myNumber2], - }); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(userRecipe, { - parameters: { - NotMyNumber: 11, - }, - }); - - await mineBlocks(this.hre, [1, 1], deployPromise); - - await assert.isRejected( - deployPromise, - 'An optional parameter should only be retrieved once, but found more than one call to getParam for "MyNumber"' - ); - }); - }); -}); - -async function deployRecipe( - hre: any, - recipeDefinition: RecipeDefinition, - options?: { parameters: {} } -): Promise { - await hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", recipeDefinition); - - const deployPromise = hre.ignition.deploy(userRecipe, options); - - await mineBlocks(hre, [1, 1], deployPromise); - - const result = await deployPromise; - - return result; -} diff --git a/packages/hardhat-plugin/test/recipes.ts b/packages/hardhat-plugin/test/recipes.ts deleted file mode 100644 index 3b9101517f..0000000000 --- a/packages/hardhat-plugin/test/recipes.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { buildRecipe } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - assertDeploymentState, - deployRecipes, - resultAssertions, -} from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe("recipes", () => { - useEnvironment("minimal"); - - // eslint-disable-next-line mocha/no-skipped-tests - it.skip("should deploy two recipes", async function () { - // given - const userRecipe1 = buildRecipe("MyRecipe1", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - const userRecipe2 = buildRecipe("MyRecipe2", (m) => { - const { foo } = m.useRecipe(userRecipe1); - - m.call(foo, "inc"); - }); - - // when - const deploymentResult = await deployRecipes( - this.hre, - [userRecipe2, userRecipe1], - [1, 1] - ); - - // then - await assertDeploymentState(this.hre, deploymentResult, { - MyRecipe1: { - Foo: resultAssertions.contract(async (foo) => { - assert.isTrue(await foo.isFoo()); - assert.equal(await foo.x(), 2); - }), - }, - MyRecipe2: { - "Foo.inc": resultAssertions.transaction(), - }, - }); - }); -}); diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts index 0c981e8cee..53bf0682d3 100644 --- a/packages/hardhat-plugin/test/user-recipes.ts +++ b/packages/hardhat-plugin/test/user-recipes.ts @@ -10,8 +10,7 @@ import { import { useEnvironment } from "./useEnvironment"; -// eslint-disable-next-line mocha/no-skipped-tests -describe.skip("User recipes", function () { +describe("User recipes", function () { useEnvironment("user-recipes"); describe("loadUserRecipes", function () { From 90b0dc55459e1dcbb67f849937a78977482da5b3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 5 Sep 2022 14:41:37 +0100 Subject: [PATCH 0068/1302] refactor: remove original top level deploy --- .../hardhat-plugin/src/ignition-wrapper.ts | 151 ------------------ packages/hardhat-plugin/src/index.ts | 133 +-------------- 2 files changed, 1 insertion(+), 283 deletions(-) diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 0da4b74a73..f6f95a24d2 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,20 +1,14 @@ import { - Future, - DeploymentPlan, Ignition, - UserRecipe, IgnitionDeployOptions, SerializedRecipeResult, Providers, ParamValue, } from "@nomicfoundation/ignition-core"; -import { ethers } from "ethers"; import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { getAllUserRecipesPaths } from "./user-recipes"; - type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; @@ -98,137 +92,6 @@ export class IgnitionWrapper { return JSON.stringify(plan); } - public async deploy( - userRecipeOrName: UserRecipe | string, - deployParams?: { parameters: { [key: string]: ParamValue } } - ): Promise> { - const [, resolvedOutputs] = await this.deployMany( - [userRecipeOrName], - deployParams - ); - - return resolvedOutputs[0]; - } - - /** - * Deploys all the given recipes. Returns the deployment result, and an - * array with the resolved outputs that corresponds to each recipe in - * the input. - */ - public async deployMany( - userRecipesOrNames: Array | string>, - deployParams: { parameters: { [key: string]: ParamValue } } | undefined - ) { - if (deployParams !== undefined) { - await this._providers.config.setParams(deployParams.parameters); - } - - const userRecipes: Array> = []; - - for (const userRecipeOrName of userRecipesOrNames) { - const userRecipe: UserRecipe = - typeof userRecipeOrName === "string" - ? await this._getRecipe(userRecipeOrName) - : userRecipeOrName; - - userRecipes.push(userRecipe); - } - - const [deploymentResult, recipeOutputs] = await this._ignition.deploy( - userRecipes, - this._deployOptions - ); - - if (deploymentResult._kind === "hold") { - const [recipeId, holdReason] = deploymentResult.holds; - throw new Error(`Execution held for recipe '${recipeId}': ${holdReason}`); - } - - if (deploymentResult._kind === "failure") { - const [recipeId, failures] = deploymentResult.failures; - - let failuresMessage = ""; - for (const failure of failures) { - failuresMessage += ` - ${failure.message}\n`; - } - - throw new Error( - `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` - ); - } - - const resolvedOutputPerRecipe: Record = {}; - for (const [recipeId, recipeOutput] of Object.entries(recipeOutputs)) { - const resolvedOutput: any = {}; - for (const [key, value] of Object.entries(recipeOutput)) { - const serializedFutureResult = - deploymentResult.result[value.recipeId][value.id]; - - if ( - serializedFutureResult._kind === "string" || - serializedFutureResult._kind === "number" - ) { - resolvedOutput[key] = serializedFutureResult; - } else if (serializedFutureResult._kind === "tx") { - resolvedOutput[key] = serializedFutureResult.value.hash; - } else { - const { abi, address } = serializedFutureResult.value; - resolvedOutput[key] = await this._ethers.getContractAt(abi, address); - } - } - resolvedOutputPerRecipe[recipeId] = resolvedOutput; - } - - const resolvedOutputs = userRecipes.map( - (x) => resolvedOutputPerRecipe[x.id] - ); - - return [deploymentResult, resolvedOutputs] as const; - } - - public async buildPlan( - userRecipesOrNames: Array | string> - ): Promise { - const userRecipes: Array> = []; - for (const userRecipeOrName of userRecipesOrNames) { - const userRecipe: UserRecipe = - typeof userRecipeOrName === "string" - ? await this._getRecipe(userRecipeOrName) - : userRecipeOrName; - - userRecipes.push(userRecipe); - } - - const plan = await this._ignition.buildPlan(userRecipes); - - return plan; - } - - private async _getRecipe(recipeId: string): Promise> { - const userRecipesPaths = getAllUserRecipesPaths(this._paths.ignition); - - for (const userRecipePath of userRecipesPaths) { - const resolveUserRecipePath = path.resolve( - this._paths.ignition, - userRecipePath - ); - - const fileExists = await fsExtra.pathExists(resolveUserRecipePath); - if (!fileExists) { - throw new Error(`Recipe ${resolveUserRecipePath} doesn't exist`); - } - - const userRecipe = require(resolveUserRecipePath); - const userRecipeContent = userRecipe.default ?? userRecipe; - - if (userRecipeContent.id === recipeId) { - return userRecipeContent; - } - } - - throw new Error(`No recipe found with id ${recipeId}`); - } - private async _getRecipeResult( recipeId: string ): Promise { @@ -289,17 +152,3 @@ export class IgnitionWrapper { return this._cachedChainId; } } - -type Resolved = T extends string - ? T - : T extends Future - ? O extends string - ? string - : ethers.Contract - : { - [K in keyof T]: T[K] extends Future - ? O extends string - ? string - : ethers.Contract - : T[K]; - }; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 33c65b1993..ba8287245e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,12 +1,6 @@ import "@nomiclabs/hardhat-ethers"; import { Providers, UserRecipe } from "@nomicfoundation/ignition-core"; -import { - extendConfig, - extendEnvironment, - subtask, - task, - types, -} from "hardhat/config"; +import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -117,131 +111,6 @@ extendEnvironment((hre) => { }); }); -/** - * Deploy the given user recipes. If none is passed, all recipes under - * the `paths.ignition` directory are deployed. - */ -task("deploy") - .addOptionalVariadicPositionalParam("userRecipesPaths") - .addOptionalParam( - "parameters", - "A json object as a string, of the recipe paramters" - ) - .setAction( - async ( - { - userRecipesPaths = [], - parameters: parametersAsJson, - }: { userRecipesPaths: string[]; parameters?: string }, - hre - ) => { - await hre.run("compile", { quiet: true }); - - let parameters: { [key: string]: number | string }; - try { - parameters = - parametersAsJson !== undefined - ? JSON.parse(parametersAsJson) - : undefined; - } catch { - console.warn("Could not parse parameters json"); - process.exit(0); - } - - let userRecipes: Array>; - if (userRecipesPaths.length === 0) { - userRecipes = loadAllUserRecipes(hre.config.paths.ignition); - } else { - userRecipes = loadUserRecipes( - hre.config.paths.ignition, - userRecipesPaths - ); - } - - if (userRecipes.length === 0) { - console.warn("No Ignition recipes found"); - process.exit(0); - } - - await hre.run("deploy:deploy-recipes", { - userRecipes, - parameters, - }); - } - ); - -subtask("deploy:deploy-recipes") - .addParam("userRecipes", undefined, undefined, types.any) - .addOptionalParam("parameters", undefined, undefined, types.any) - .setAction( - async ( - { - userRecipes, - parameters, - }: { - userRecipes: Array>; - pathToJournal?: string; - parameters: { [key: string]: string | number }; - }, - hre - ) => { - // we ignore the recipe outputs because they are not relevant when - // the deployment is done via a task (as opposed to a deployment - // done with `hre.ignition.deploy`) - const [serializedDeploymentResult] = await hre.ignition.deployMany( - userRecipes, - { parameters } - ); - - return serializedDeploymentResult; - } - ); - -/** - * Build and show the deployment plan for the given user recipes. - */ -task("plan") - .addOptionalVariadicPositionalParam("userRecipesPaths") - .setAction( - async ({ userRecipesPaths = [] }: { userRecipesPaths: string[] }, hre) => { - await hre.run("compile", { quiet: true }); - - let userRecipes: Array>; - if (userRecipesPaths.length === 0) { - userRecipes = loadAllUserRecipes(hre.config.paths.ignition); - } else { - userRecipes = loadUserRecipes( - hre.config.paths.ignition, - userRecipesPaths - ); - } - - if (userRecipes.length === 0) { - console.warn("No Ignition recipes found"); - process.exit(0); - } - - const plan = await hre.ignition.buildPlan(userRecipes); - - let first = true; - for (const [recipeId, recipePlan] of Object.entries(plan)) { - if (first) { - first = false; - } else { - console.log(); - } - console.log(`- Recipe ${recipeId}`); - if (recipePlan === "already-deployed") { - console.log(" Already deployed"); - } else { - for (const step of recipePlan) { - console.log(` ${step.id}: ${step.description}`); - } - } - } - } - ); - task("deploySingleGraph") .addOptionalVariadicPositionalParam("userRecipesPaths") .addOptionalParam( From 4765655dc8df8a02d082b2844bce7a386ec93cb2 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 6 Sep 2022 01:49:39 -0400 Subject: [PATCH 0069/1302] adding very basic html output to help with debugging --- .gitignore | 3 + packages/core/package.json | 1 + packages/core/src/Ignition.ts | 4 +- .../single-graph/execution/ExecutionGraph.ts | 15 +- .../src/single-graph/graph/adjacencyList.ts | 14 + .../src/single-graph/recipe/RecipeGraph.ts | 13 + .../src/single-graph/types/executionGraph.ts | 1 + .../src/single-graph/types/recipeGraph.ts | 1 + .../hardhat-plugin/src/ignition-wrapper.ts | 36 +- packages/hardhat-plugin/src/index.ts | 60 +- yarn.lock | 602 +++++++++++++++++- 11 files changed, 741 insertions(+), 9 deletions(-) diff --git a/.gitignore b/.gitignore index 7354122b1a..ad61817753 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,6 @@ dist .yarn/install-state.gz .pnp.* .npmrc + +# Mac OSX garbage +.DS_Store diff --git a/packages/core/package.json b/packages/core/package.json index cfd3029e89..f763c20e7d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,6 +52,7 @@ "ink": "^3.2.0", "ink-spinner": "^4.0.3", "js-graph-algorithms": "1.0.18", + "mermaid": "^9.1.6", "react": "^17.0.2" } } diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 7f07dd6f9d..eb09b9305b 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -167,7 +167,7 @@ export class Ignition { } public async planSingleGraph(recipe: any) { - log(`Start deploy`); + log(`Start plan`); const serviceOptions = { providers: this._providers, @@ -202,7 +202,7 @@ export class Ignition { const { executionGraph } = transformResult; - return executionGraph; + return { recipeGraph, executionGraph }; } private async _getChainId(): Promise { diff --git a/packages/core/src/single-graph/execution/ExecutionGraph.ts b/packages/core/src/single-graph/execution/ExecutionGraph.ts index 1b24910c7d..6868e3fc2a 100644 --- a/packages/core/src/single-graph/execution/ExecutionGraph.ts +++ b/packages/core/src/single-graph/execution/ExecutionGraph.ts @@ -1,4 +1,17 @@ import { Graph } from "../graph/Graph"; +import { getEdges } from "../graph/adjacencyList"; import { ExecutionVertex } from "../types/executionGraph"; -export class ExecutionGraph extends Graph {} +export class ExecutionGraph extends Graph { + public toMermaid(): string { + const vertexes = [...this.vertexes.values()] + .map((v) => `e${v.id}[${v.label}]`) + .join("\n"); + + const edges = getEdges(this.adjacencyList) + .map(({ from, to }) => `e${from} --> e${to}`) + .join("\n"); + + return `flowchart TD\n${vertexes}\n${edges}`; + } +} diff --git a/packages/core/src/single-graph/graph/adjacencyList.ts b/packages/core/src/single-graph/graph/adjacencyList.ts index 4c5f5cec47..f6f1aee9f4 100644 --- a/packages/core/src/single-graph/graph/adjacencyList.ts +++ b/packages/core/src/single-graph/graph/adjacencyList.ts @@ -96,3 +96,17 @@ export function eliminate( return updatedList; } + +export function getEdges( + adjacencyList: AdjacencyList +): Array<{ from: number; to: number }> { + const edges: Array<{ from: number; to: number }> = []; + + for (const [from, edgeList] of adjacencyList.entries()) { + for (const to of edgeList.values()) { + edges.push({ from, to }); + } + } + + return edges; +} diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/single-graph/recipe/RecipeGraph.ts index a3e7a3b837..38f448175d 100644 --- a/packages/core/src/single-graph/recipe/RecipeGraph.ts +++ b/packages/core/src/single-graph/recipe/RecipeGraph.ts @@ -1,4 +1,5 @@ import { Graph } from "../graph/Graph"; +import { getEdges } from "../graph/adjacencyList"; import { RecipeFuture } from "../types/future"; import { RecipeVertex } from "../types/recipeGraph"; @@ -12,4 +13,16 @@ export class RecipeGraph extends Graph { this.registeredParameters = {}; } + + public toMermaid(): string { + const vertexes = [...this.vertexes.values()] + .map((v) => `r${v.id}[${v.label}]`) + .join("\n"); + + const edges = getEdges(this.adjacencyList) + .map(({ from, to }) => `r${from} --> r${to}`) + .join("\n"); + + return `flowchart TD\n${vertexes}\n${edges}`; + } } diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/single-graph/types/executionGraph.ts index 557517f13c..296de9ea5c 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/single-graph/types/executionGraph.ts @@ -48,4 +48,5 @@ export type ExecutionVertex = export interface IExecutionGraph { adjacencyList: AdjacencyList; vertexes: Map; + toMermaid(): string; } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index cf569145e9..e892d12da5 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -111,6 +111,7 @@ export interface IRecipeGraph { registeredParameters: { [key: string]: { [key: string]: string | number | RecipeFuture }; }; + toMermaid(): string; } export interface IRecipeGraphBuilder { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index f6f95a24d2..5d21af0f61 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -12,6 +12,21 @@ import path from "path"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; +const htmlTemplate = ` + + + + + +
+ $ +
+ + +`; + export class IgnitionWrapper { private _ignition: Ignition; private _cachedChainId: number | undefined; @@ -88,8 +103,25 @@ export class IgnitionWrapper { public async planSingleGraph(recipe: any) { const plan = await this._ignition.planSingleGraph(recipe); - // better display needed ... - return JSON.stringify(plan); + if (!Array.isArray(plan)) { + const recipeGraph = plan.recipeGraph.toMermaid(); + const executionGraph = plan.executionGraph.toMermaid(); + + const output = ` +flowchart +subgraph ExecutionGraph +direction TB +${executionGraph.substring(executionGraph.indexOf("\n"))} +end +subgraph RecipeGraph +direction TB +${recipeGraph.substring(recipeGraph.indexOf("\n"))} +end +`; + return htmlTemplate.replace("$", output); + } + + return htmlTemplate.replace("$", ""); } private async _getRecipeResult( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ba8287245e..ffdc3c7876 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,7 +1,10 @@ import "@nomiclabs/hardhat-ethers"; import { Providers, UserRecipe } from "@nomicfoundation/ignition-core"; +import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; +import { exec } from "child_process"; +import os from "os"; import path from "path"; import { ConfigWrapper } from "./ConfigWrapper"; @@ -115,7 +118,7 @@ task("deploySingleGraph") .addOptionalVariadicPositionalParam("userRecipesPaths") .addOptionalParam( "parameters", - "A json object as a string, of the recipe paramters" + "A json object as a string, of the recipe parameters" ) .setAction( async ( @@ -156,3 +159,58 @@ task("deploySingleGraph") await hre.ignition.deploySingleGraph(userRecipes[0], { parameters }); } ); + +task("plan") + .addFlag("quiet", "Disables logging output path to terminal") + .addOptionalVariadicPositionalParam("userRecipesPaths") + .setAction( + async ( + { + quiet = false, + userRecipesPaths = [], + }: { quiet: boolean; userRecipesPaths: string[] }, + hre + ) => { + await hre.run("compile", { quiet: true }); + + let userRecipes: Array>; + if (userRecipesPaths.length === 0) { + userRecipes = loadAllUserRecipes(hre.config.paths.ignition); + } else { + userRecipes = loadUserRecipes( + hre.config.paths.ignition, + userRecipesPaths + ); + } + + if (userRecipes.length === 0) { + console.warn("No Ignition recipes found"); + process.exit(0); + } + + const html = await hre.ignition.planSingleGraph(userRecipes[0]); + + const filePath = `${hre.config.paths.cache}/plan.html`; + + let command: string; + switch (os.platform()) { + case "win32": + command = "start"; + break; + case "darwin": + command = "open"; + break; + default: + command = "xdg-open"; + } + + await fs.ensureDir(hre.config.paths.cache); + await fs.writeFile(filePath, html); + + if (!quiet) { + console.log(`Plan written to ${filePath}`); + } + + exec(`${command} ${filePath}`); + } + ); diff --git a/yarn.lock b/yarn.lock index 4f1f2e24ea..2f94ea6978 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,6 +190,11 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@braintree/sanitize-url@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" + integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -1765,11 +1770,21 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +commander@2: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1860,6 +1875,516 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== +d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14" + integrity sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g== + dependencies: + internmap "1 - 2" + +d3-axis@1: + version "1.0.12" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" + integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" + integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" + integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== + dependencies: + d3-array "1" + d3-path "1" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" + integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== + dependencies: + d3-array "^1.1.1" + +d3-contour@4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.0.tgz#5a1337c6da0d528479acdb5db54bc81a0ff2ec6b" + integrity sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" + integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + dependencies: + delaunator "5" + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +d3-drag@1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" + integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== + dependencies: + d3-dispatch "1" + d3-selection "1" + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +d3-dsv@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" + integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +d3-ease@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" + integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" + integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== + dependencies: + d3-dsv "1" + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +d3-format@1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-geo@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" + integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@1: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +d3-interpolate@1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" + integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== + +d3-polygon@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" + integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" + integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" + integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== + dependencies: + d3-color "1" + d3-interpolate "1" + +d3-scale-chromatic@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-selection@1, d3-selection@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" + integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" + integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== + dependencies: + d3-path "1 - 3" + +d3-time-format@2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" + integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + dependencies: + d3-time "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +d3-time@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" + integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== + dependencies: + d3-array "2 - 3" + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +d3-transition@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" + integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-voronoi@1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +d3-zoom@1: + version "1.8.3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" + integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^5.14: + version "5.16.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" + integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== + dependencies: + d3-array "1" + d3-axis "1" + d3-brush "1" + d3-chord "1" + d3-collection "1" + d3-color "1" + d3-contour "1" + d3-dispatch "1" + d3-drag "1" + d3-dsv "1" + d3-ease "1" + d3-fetch "1" + d3-force "1" + d3-format "1" + d3-geo "1" + d3-hierarchy "1" + d3-interpolate "1" + d3-path "1" + d3-polygon "1" + d3-quadtree "1" + d3-random "1" + d3-scale "2" + d3-scale-chromatic "1" + d3-selection "1" + d3-shape "1" + d3-time "1" + d3-time-format "2" + d3-timer "1" + d3-transition "1" + d3-voronoi "1" + d3-zoom "1" + +d3@^7.0.0: + version "7.6.1" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.6.1.tgz#b21af9563485ed472802f8c611cc43be6c37c40c" + integrity sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" + integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ== + dependencies: + d3 "^5.14" + dagre "^0.8.5" + graphlib "^2.1.8" + lodash "^4.17.15" + +dagre@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" + integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== + dependencies: + graphlib "^2.1.8" + lodash "^4.17.15" + debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1933,6 +2458,13 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delaunator@5: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + dependencies: + robust-predicates "^3.0.0" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -1974,6 +2506,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dompurify@2.3.10: + version "2.3.10" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385" + integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g== + electron-to-chromium@^1.4.164: version "1.4.169" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz#d4b8cf9816566c7e9518128f1a97f39de9c7af9d" @@ -2731,6 +3268,13 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphlib@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== + dependencies: + lodash "^4.17.15" + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -2899,13 +3443,20 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4.24: +iconv-lite@0.4, iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -3012,6 +3563,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -3365,6 +3921,11 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +khroma@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" + integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -3511,7 +4072,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3622,6 +4183,21 @@ merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" +mermaid@^9.1.6: + version "9.1.6" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.6.tgz#e34d5ad632455df014784d7c77af21fd51388341" + integrity sha512-oBuQk7s55wQgEgH/AK0GYY8U0kBqOIGK9QlJL+VYxh+1kZQtU9tNwoy0gWCfBJDaFIRdfpc/fm9PagaIXg6XFQ== + dependencies: + "@braintree/sanitize-url" "^6.0.0" + d3 "^7.0.0" + dagre "^0.8.5" + dagre-d3 "^0.6.4" + dompurify "2.3.10" + graphlib "^2.1.8" + khroma "^2.0.0" + moment-mini "2.24.0" + stylis "^4.0.10" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3744,6 +4320,11 @@ mocha@^9.1.1, mocha@^9.1.3: yargs-parser "20.2.4" yargs-unparser "2.0.0" +moment-mini@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" + integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4382,6 +4963,11 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" +robust-predicates@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" + integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4394,6 +4980,11 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -4404,7 +4995,7 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4742,6 +5333,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +stylis@^4.0.10: + version "4.1.1" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.1.tgz#e46c6a9bbf7c58db1e65bb730be157311ae1fe12" + integrity sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ== + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" From f6aef8db555f5662a54e181980033c1628dd7513 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 6 Sep 2022 02:01:31 -0400 Subject: [PATCH 0070/1302] fix broken lint --- packages/hardhat-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ffdc3c7876..e6d1a22cc8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,9 +1,9 @@ import "@nomiclabs/hardhat-ethers"; import { Providers, UserRecipe } from "@nomicfoundation/ignition-core"; +import { exec } from "child_process"; import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; -import { exec } from "child_process"; import os from "os"; import path from "path"; From b0521a005832f0d7e27b117a36270710ec3c6ab0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 10:15:53 +0100 Subject: [PATCH 0071/1302] refactor: remove ignition deploy/plan --- packages/core/src/Ignition.ts | 94 +++---------------- .../hardhat-plugin/src/ignition-wrapper.ts | 2 + packages/hardhat-plugin/src/index.ts | 2 +- 3 files changed, 14 insertions(+), 84 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index eb09b9305b..f31e1d9a3e 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,25 +1,17 @@ import setupDebug from "debug"; -import { - DeploymentPlan, - DeploymentResult, - ExecutionEngine, - ExecutionManager, - IgnitionRecipesResults, -} from "./execution-engine"; +import { DeploymentResult, IgnitionRecipesResults } from "./execution-engine"; import { SerializedDeploymentResult } from "./futures/types"; import { serializeFutureOutput } from "./futures/utils"; -import { FileJournal } from "./journal/FileJournal"; import { InMemoryJournal } from "./journal/InMemoryJournal"; import { Providers } from "./providers"; -import { RecipeBuilderImpl } from "./recipes/RecipeBuilderImpl"; -import { UserRecipe } from "./recipes/UserRecipe"; import { Services } from "./services/types"; import { execute } from "./single-graph/execution/execute"; import { generateRecipeGraphFrom } from "./single-graph/process/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "./single-graph/process/transformRecipeGraphToExecutionGraph"; import { createServices } from "./single-graph/services/createServices"; import { DependableFuture, FutureDict } from "./single-graph/types/future"; +import { Recipe } from "./single-graph/types/recipeGraph"; import { UiService } from "./single-graph/ui/ui-service"; import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; @@ -29,6 +21,7 @@ const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { pathToJournal: string | undefined; txPollingInterval: number; + ui: boolean; } type RecipesOutputs = Record; @@ -39,79 +32,14 @@ export class Ignition { private _recipesResults: IgnitionRecipesResults ) {} - public async deploy( - userRecipes: Array>, - { pathToJournal, txPollingInterval }: IgnitionDeployOptions - ): Promise<[DeploymentResult, RecipesOutputs]> { - log(`Start deploy, '${userRecipes.length}' recipes`); - - const chainId = await this._getChainId(); - - const m = new RecipeBuilderImpl(chainId); - - const recipesOutputs: RecipesOutputs = {}; - - for (const userRecipe of userRecipes) { - log("Load recipe '%s'", userRecipe.id); - const recipeOutput = m.useRecipe(userRecipe) ?? {}; - recipesOutputs[userRecipe.id] = recipeOutput; - } - - log("Build execution graph"); - const executionGraph = m.buildExecutionGraph(); - - log("Create journal with path '%s'", pathToJournal); - const journal = - pathToJournal !== undefined - ? new FileJournal(pathToJournal) - : new InMemoryJournal(); - - const engine = new ExecutionEngine( - this._providers, - journal, - this._recipesResults, - { - parallelizationLevel: 2, - loggingEnabled: pathToJournal !== undefined, - txPollingInterval, - } - ); - - const executionManager = new ExecutionManager( - engine, - txPollingInterval / 5 - ); - - log("Execute deployment"); - const deploymentResult = await executionManager.execute(executionGraph); - - return [deploymentResult, recipesOutputs]; - } - - public async buildPlan( - userRecipes: Array> - ): Promise { - log(`Start building plan, '${userRecipes.length}' recipes`); - - const chainId = await this._getChainId(); - - const m = new RecipeBuilderImpl(chainId); - - for (const userRecipe of userRecipes) { - log("Load recipe '%s'", userRecipe.id); - m.useRecipe(userRecipe); - } - - log("Build ExecutionGraph"); - const executionGraph = m.buildExecutionGraph(); - - return ExecutionEngine.buildPlan(executionGraph, this._recipesResults); - } - public async deploySingleGraph( - recipe: any, - options = { ui: true } - ): Promise<[DeploymentResult, any]> { + recipe: Recipe, + options: IgnitionDeployOptions = { + ui: true, + pathToJournal: undefined, + txPollingInterval: 300, + } + ): Promise<[DeploymentResult, RecipesOutputs]> { log(`Start deploy`); const ui = new UiService({ enabled: options.ui }); @@ -166,7 +94,7 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } - public async planSingleGraph(recipe: any) { + public async planSingleGraph(recipe: Recipe) { log(`Start plan`); const serviceOptions = { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 5d21af0f61..798716dc0d 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -57,6 +57,8 @@ export class IgnitionWrapper { const [deploymentResult] = await this._ignition.deploySingleGraph(recipe, { ui: deployParams?.ui ?? true, + pathToJournal: undefined, + txPollingInterval: 300, }); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index e6d1a22cc8..05300a70f2 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -109,7 +109,7 @@ extendEnvironment((hre) => { hre.ethers, isHardhatNetwork, hre.config.paths, - { pathToJournal, txPollingInterval } + { pathToJournal, txPollingInterval, ui: true } ); }); }); From 77f00134869e75518d9df3897071012ec6fb98af Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 10:29:35 +0100 Subject: [PATCH 0072/1302] refactor: delete execution engine --- config/eslint/eslintrc.js | 1 + packages/core/src/Ignition.ts | 3 +- packages/core/src/execution-engine.ts | 373 -------------------------- packages/core/src/index.ts | 4 +- packages/core/src/types.ts | 18 ++ 5 files changed, 23 insertions(+), 376 deletions(-) delete mode 100644 packages/core/src/execution-engine.ts diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index f91d985814..f2501e8540 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -8,6 +8,7 @@ module.exports = { parser: "@typescript-eslint/parser", plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], rules: { + "import/no-unused-modules": [1, { unusedExports: true }], "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": [ "error", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index f31e1d9a3e..67ac2cfb92 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,6 +1,6 @@ import setupDebug from "debug"; -import { DeploymentResult, IgnitionRecipesResults } from "./execution-engine"; +// import { DeploymentResult, IgnitionRecipesResults } from "./execution-engine"; import { SerializedDeploymentResult } from "./futures/types"; import { serializeFutureOutput } from "./futures/utils"; import { InMemoryJournal } from "./journal/InMemoryJournal"; @@ -15,6 +15,7 @@ import { Recipe } from "./single-graph/types/recipeGraph"; import { UiService } from "./single-graph/ui/ui-service"; import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; +import { DeploymentResult, IgnitionRecipesResults } from "./types"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/execution-engine.ts b/packages/core/src/execution-engine.ts deleted file mode 100644 index f4a7396ff8..0000000000 --- a/packages/core/src/execution-engine.ts +++ /dev/null @@ -1,373 +0,0 @@ -import setupDebug from "debug"; - -import { DeploymentState } from "./deployment-state"; -import { InternalFuture } from "./futures/InternalFuture"; -import type { - RecipeResult, - SerializedDeploymentResult, - SerializedRecipeResult, -} from "./futures/types"; -import { deserializeFutureOutput } from "./futures/utils"; -import { Journal } from "./journal/types"; -import { Providers } from "./providers"; -import { ExecutionGraph } from "./recipes/ExecutionGraph"; -import { IgnitionRecipe } from "./recipes/IgnitionRecipe"; -import { ArtifactsService } from "./services/ArtifactsService"; -import { ConfigService } from "./services/ConfigService"; -import { ContractsService } from "./services/ContractsService"; -import { TransactionsService } from "./services/TransactionsService"; -import type { Services } from "./services/types"; -import { TxSender } from "./tx-sender"; -import { UiService } from "./ui/ui-service"; -import { sleep } from "./utils"; - -export interface IgnitionRecipesResults { - load: (recipeId: string) => Promise; - save: ( - recipeId: string, - recipeResult: SerializedRecipeResult - ) => Promise; -} - -export interface ExecutionEngineOptions { - parallelizationLevel: number; - loggingEnabled: boolean; - txPollingInterval: number; -} - -interface ExecutorPlan { - id: string; - description: string; -} -type RecipePlan = "already-deployed" | ExecutorPlan[]; -export type DeploymentPlan = Record; - -export class ExecutionEngine { - private _debug = setupDebug("ignition:execution-engine"); - - public static async buildPlan( - executionGraph: ExecutionGraph, - recipesResults: IgnitionRecipesResults - ): Promise { - const plan: DeploymentPlan = {}; - - const ignitionRecipes = executionGraph.getSortedRecipes(); - - for (const ignitionRecipe of ignitionRecipes) { - const recipeResult = await recipesResults.load(ignitionRecipe.id); - if (recipeResult !== undefined) { - plan[ignitionRecipe.id] = "already-deployed"; - continue; - } - - const recipePlan: ExecutorPlan[] = []; - const executors = ignitionRecipe.getSortedExecutors(); - for (const executor of executors) { - recipePlan.push({ - id: executor.future.id, - description: executor.getDescription(), - }); - } - plan[ignitionRecipe.id] = recipePlan; - } - - return plan; - } - - constructor( - private _providers: Providers, - private _journal: Journal, - private _recipesResults: IgnitionRecipesResults, - private _options: ExecutionEngineOptions - ) {} - - public async *execute(executionGraph: ExecutionGraph) { - const deploymentState = DeploymentState.fromExecutionGraph(executionGraph); - - const executionRecipes = executionGraph.getSortedRecipes(); - - const uiService = new UiService({ - enabled: this._options.loggingEnabled, - deploymentState, - }); - - // validate all recipes - const errorsPerRecipe: Map = new Map(); - let hasErrors = false; - for (const executionRecipe of executionRecipes) { - this._debug(`Validating recipe ${executionRecipe.id}`); - - const errors = await this._validateRecipe(executionRecipe); - - if (errors.length > 0) { - hasErrors = true; - } - - errorsPerRecipe.set(executionRecipe.id, errors); - } - - if (hasErrors) { - let errorMessage = `The following validation errors were found:\n`; - let isFirst = true; - for (const [recipeId, errors] of errorsPerRecipe.entries()) { - if (errors.length === 0) { - continue; - } - if (!isFirst) { - errorMessage += "\n"; - } - isFirst = false; - - errorMessage += ` In recipe ${recipeId}:\n`; - for (const error of errors) { - errorMessage += ` - ${error}\n`; - } - } - - throw new Error(errorMessage); - } - - // execute each recipe sequentially - for (const executionRecipe of executionRecipes) { - const serializedRecipeResult = await this._recipesResults.load( - executionRecipe.id - ); - - if (serializedRecipeResult !== undefined) { - const recipeResult: RecipeResult = Object.fromEntries( - Object.entries(serializedRecipeResult).map(([key, value]) => [ - key, - deserializeFutureOutput(value), - ]) - ); - - deploymentState.addRecipeResult(executionRecipe.id, recipeResult); - - continue; - } - - this._debug(`Begin execution of recipe ${executionRecipe.id}`); - - if (deploymentState.isRecipeSuccess(executionRecipe.id)) { - this._debug( - `The recipe ${executionRecipe.id} was already successfully deployed` - ); - continue; - } - - this._debug(`Executing recipe ${executionRecipe.id}`); - const recipeExecutionGenerator = this._executeRecipe( - executionRecipe, - deploymentState, - uiService - ); - for await (const recipeResult of recipeExecutionGenerator) { - if (recipeResult !== undefined) { - break; - } - yield; - } - } - - yield deploymentState; - } - - private async _validateRecipe( - ignitionRecipe: IgnitionRecipe - ): Promise { - const executors = ignitionRecipe.getSortedExecutors(); - const allErrors: string[] = []; - - for (const executor of executors) { - this._debug( - `Validating future ${executor.future.id} of recipe ${ignitionRecipe.id}` - ); - const services = this._createServices( - ignitionRecipe.id, - executor.future.id - ); - - const errors = await executor.validate(executor.future.input, services); - if (errors.length > 0) { - allErrors.push(...errors); - } - } - - return allErrors; - } - - private async *_executeRecipe( - ignitionRecipe: IgnitionRecipe, - deploymentState: DeploymentState, - uiService: UiService - ) { - const { parallelizationLevel } = this._options; - const executors = ignitionRecipe.getSortedExecutors(); - const recipeState = deploymentState.getRecipe(ignitionRecipe.id); - - while (true) { - const someFailure = executors.some((e) => e.isFailure()); - const someHold = executors.some((e) => e.isHold()); - let runningCount = executors.filter((e) => e.isRunning()).length; - const allSuccess = executors.every((e) => e.isSuccess()); - - if ( - allSuccess || - (someFailure && runningCount === 0) || - (someHold && runningCount === 0) - ) { - if (recipeState.isSuccess()) { - const recipeResult = recipeState.toRecipeResult(); - await this._recipesResults.save(ignitionRecipe.id, recipeResult); - await this._journal.delete(ignitionRecipe.id); - } - - yield recipeState; - } - - for (const executor of ignitionRecipe.getSortedExecutors()) { - this._debug(`Check ${ignitionRecipe.id}/${executor.future.id}`); - - if (executor.isReady() && runningCount < parallelizationLevel) { - this._debug( - `Check dependencies of ${ignitionRecipe.id}/${executor.future.id}` - ); - - const dependencies = executor.future.getDependencies(); - - const allDependenciesReady = dependencies.every((d) => - deploymentState.isFutureSuccess(d.recipeId, d.id) - ); - - if (allDependenciesReady) { - const resolvedInput = this._resolve( - executor.future.input, - deploymentState - ); - - const services = this._createServices( - ignitionRecipe.id, - executor.future.id - ); - - this._debug(`Start ${ignitionRecipe.id}/${executor.future.id}`); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - executor.run(resolvedInput, services, (newState) => { - deploymentState.setFutureState( - ignitionRecipe.id, - executor.future.id, - newState - ); - - uiService.render(); - }); - runningCount++; - } - } - } - - yield; - } - } - - private _resolve(input: any, deploymentResult: DeploymentState): any { - if (InternalFuture.isFuture(input)) { - return deploymentResult.getFutureResult(input.recipeId, input.id); - } - - if (Array.isArray(input)) { - return input.map((x) => this._resolve(x, deploymentResult)); - } - - if (typeof input === "object" && input !== null) { - const resolvedInput: any = {}; - - for (const [key, value] of Object.entries(input)) { - resolvedInput[key] = this._resolve(value, deploymentResult); - } - - return resolvedInput; - } - - return input; - } - - private _createServices(recipeId: string, executorId: string): Services { - const txSender = new TxSender( - recipeId, - executorId, - this._providers.gasProvider, - this._journal - ); - - const services: Services = { - artifacts: new ArtifactsService(this._providers), - contracts: new ContractsService(this._providers, txSender, { - pollingInterval: this._options.txPollingInterval, - }), - transactions: new TransactionsService(this._providers), - config: new ConfigService(this._providers), - }; - - return services; - } -} - -export type DeploymentResult = - | { _kind: "failure"; failures: [string, Error[]] } - | { _kind: "hold"; holds: [string, string[]] } - | { _kind: "success"; result: SerializedDeploymentResult }; - -export class ExecutionManager { - private _debug = setupDebug("ignition:execution-manager"); - constructor( - private _engine: ExecutionEngine, - private _tickInterval: number - ) {} - - public async execute( - executionGraph: ExecutionGraph - ): Promise { - const executionGenerator = this._engine.execute(executionGraph); - - while (true) { - this._debug("Run next execution iteration"); - const deploymentResultIteration = await executionGenerator.next(); - - if (deploymentResultIteration.value !== undefined) { - const deploymentState = deploymentResultIteration.value; - - const failures = deploymentState.getFailures(); - if (failures !== undefined && failures.length > 0) { - return { - _kind: "failure", - failures, - }; - } - - const holds = deploymentState.getHolds(); - if (holds !== undefined && holds.length > 0) { - return { - _kind: "hold", - holds, - }; - } - - const serializedDeploymentResult: SerializedDeploymentResult = {}; - - for (const recipeState of deploymentState.getRecipes()) { - serializedDeploymentResult[recipeState.id] = - recipeState.toRecipeResult(); - } - - return { - _kind: "success", - result: serializedDeploymentResult, - }; - } - - await sleep(this._tickInterval); - } - } -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index df85de3839..602e988317 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -22,8 +22,8 @@ export type { Services } from "./services/types"; export type { Providers, ConfigProvider, HasParamResult } from "./providers"; -export type { DeploymentResult } from "./execution-engine"; -export { DeploymentPlan } from "./execution-engine"; +export type { DeploymentResult } from "./types"; + export { Ignition, IgnitionDeployOptions } from "./Ignition"; export type { Contract } from "./types"; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 6af22e2c5e..7f07b2ec53 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,3 +1,8 @@ +import { + SerializedDeploymentResult, + SerializedRecipeResult, +} from "./futures/types"; + export interface Artifact { contractName: string; bytecode: string; @@ -21,3 +26,16 @@ export interface DeployedContract extends Contract { export interface Tx { hash: string; } + +export interface IgnitionRecipesResults { + load: (recipeId: string) => Promise; + save: ( + recipeId: string, + recipeResult: SerializedRecipeResult + ) => Promise; +} + +export type DeploymentResult = + | { _kind: "failure"; failures: [string, Error[]] } + | { _kind: "hold"; holds: [string, string[]] } + | { _kind: "success"; result: SerializedDeploymentResult }; From cd12fd9f594d2c1adfe7a58b2203c690eb01ffb8 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 10:34:27 +0100 Subject: [PATCH 0073/1302] refactor: start removing deployment state --- ...ment-state.ts => deployment-state-old2.ts} | 0 packages/core/src/executors/Executor.ts | 2 +- packages/core/src/ui/components/index.tsx | 134 ------------------ packages/core/src/ui/ui-service.tsx | 28 ---- 4 files changed, 1 insertion(+), 163 deletions(-) rename packages/core/src/{deployment-state.ts => deployment-state-old2.ts} (100%) delete mode 100644 packages/core/src/ui/components/index.tsx delete mode 100644 packages/core/src/ui/ui-service.tsx diff --git a/packages/core/src/deployment-state.ts b/packages/core/src/deployment-state-old2.ts similarity index 100% rename from packages/core/src/deployment-state.ts rename to packages/core/src/deployment-state-old2.ts diff --git a/packages/core/src/executors/Executor.ts b/packages/core/src/executors/Executor.ts index fbdcd4b277..de72b91ebc 100644 --- a/packages/core/src/executors/Executor.ts +++ b/packages/core/src/executors/Executor.ts @@ -1,6 +1,6 @@ import setupDebug, { IDebugger } from "debug"; -import { FutureState } from "../deployment-state"; +import { FutureState } from "../deployment-state-old2"; import { InternalFuture } from "../futures/InternalFuture"; import { FutureOutput, Resolved } from "../futures/types"; import type { Services } from "../services/types"; diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx deleted file mode 100644 index e96d79ad6f..0000000000 --- a/packages/core/src/ui/components/index.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { Box, Text } from "ink"; -import Spinner from "ink-spinner"; -import React from "react"; - -import { - FutureState, - DeploymentState, - RecipeState, -} from "../../deployment-state"; - -export const IgnitionUi = ({ - deploymentState, -}: { - deploymentState: DeploymentState; -}) => { - const currentRecipe = deploymentState.getCurrentRecipe(); - - const successfulRecipes = deploymentState.getSuccessfulRecipes(); - - return ( - -
- - - - - - - - ); -}; - -const Header = ({ deploymentState }: { deploymentState: DeploymentState }) => { - const successfulRecipesCount = deploymentState.getSuccessfulRecipes().length; - const recipesCount = deploymentState.getRecipes().length; - - return ( - - - {successfulRecipesCount} of {recipesCount} recipes deployed - - - ); -}; - -const CurrentRecipe = ({ recipe }: { recipe?: RecipeState }) => { - if (recipe === undefined) { - return null; - } - - const futuresStates = recipe.getFuturesStates(); - - return ( - - - - Deploying {recipe.id} - - - - {futuresStates - .sort((a, b) => compareFuturesStates(a[1], b[1])) - .map(([futureId, futureState]) => ( - - ))} - - - ); -}; - -function compareFuturesStates(a: FutureState, b: FutureState): number { - const value = (s: FutureState["_kind"]) => { - if (s === "success" || s === "failure" || s === "hold") { - return 0; - } - if (s === "running") { - return 1; - } - if (s === "ready") { - return 2; - } - if (s === "waiting") { - return 3; - } - const _exhaustiveCheck: never = s; - return s; - }; - - const aValue = value(a._kind); - const bValue = value(b._kind); - return aValue - bValue; -} - -const Future = ({ - futureId, - futureState, -}: { - futureId: string; - futureState: FutureState; -}) => { - return ( - - {futureState._kind === "running" ? ( - {futureId}: Executing - ) : futureState._kind === "success" ? ( - {futureId}: Executed - ) : futureState._kind === "ready" ? ( - {futureId}: Ready - ) : futureState._kind === "waiting" ? ( - {futureId}: Waiting - ) : null} - - ); -}; - -const SuccessfulRecipes = ({ recipes }: { recipes: RecipeState[] }) => { - if (recipes.length === 0) { - return null; - } - - return ( - - {recipes.map((m) => ( - - Deployed {m.id} - - ))} - - ); -}; diff --git a/packages/core/src/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx deleted file mode 100644 index 98db3bd4cb..0000000000 --- a/packages/core/src/ui/ui-service.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { render } from "ink"; -import React from "react"; - -import { DeploymentState } from "../deployment-state"; - -import { IgnitionUi } from "./components"; - -export class UiService { - private _enabled: boolean; - private _deploymentState: DeploymentState; - - constructor({ - enabled, - deploymentState, - }: { - enabled: boolean; - deploymentState: DeploymentState; - }) { - this._enabled = enabled; - this._deploymentState = deploymentState; - } - - public render() { - if (this._enabled) { - render(); - } - } -} From bdfb5deaccefd9199d0b649ff27ec4cfe3aed5b6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 11:01:07 +0100 Subject: [PATCH 0074/1302] refactor: remove futures folder --- config/eslint/eslintrc.js | 5 +- packages/core/src/Ignition.ts | 10 +- packages/core/src/deployment-state-old2.ts | 330 ------------------ packages/core/src/executors/CallExecutor.ts | 88 ----- .../core/src/executors/ContractExecutor.ts | 84 ----- packages/core/src/executors/Executor.ts | 118 ------- .../src/executors/ExistingContractExecutor.ts | 48 --- packages/core/src/executors/Hold.ts | 9 - packages/core/src/executors/ParamExecutor.ts | 54 --- packages/core/src/executors/utils.ts | 19 - .../src/futures/ArtifactContractFuture.ts | 17 - packages/core/src/futures/CallFuture.ts | 6 - packages/core/src/futures/ContractFuture.ts | 9 - .../src/futures/ExistingContractFuture.ts | 13 - packages/core/src/futures/Future.ts | 8 - .../core/src/futures/InternalCallFuture.ts | 31 -- .../src/futures/InternalContractFuture.ts | 17 - packages/core/src/futures/InternalFuture.ts | 21 -- packages/core/src/futures/ParamFuture.ts | 8 - packages/core/src/futures/types.ts | 56 --- packages/core/src/futures/utils.ts | 73 ---- packages/core/src/index.ts | 20 +- packages/core/src/providers.ts | 6 +- packages/core/src/recipes/ExecutionGraph.ts | 90 ----- packages/core/src/recipes/IgnitionRecipe.ts | 43 --- .../core/src/recipes/RecipeBuilderImpl.ts | 180 ---------- packages/core/src/recipes/UserRecipe.ts | 10 - packages/core/src/recipes/buildRecipe.ts | 9 - packages/core/src/recipes/types.ts | 57 --- packages/core/src/recipes/utils.ts | 10 - packages/core/src/services/ConfigService.ts | 6 +- .../src/single-graph/types/recipeGraph.ts | 18 +- packages/core/src/types.ts | 11 +- packages/core/src/utils.ts | 31 ++ packages/core/test/setup.ts | 1 + .../single-graph/collectLibrariesAndLink.ts | 1 + packages/core/test/single-graph/execution.ts | 1 + .../test/single-graph/graph/adjacencyList.ts | 1 + packages/core/test/single-graph/recipes.ts | 1 + packages/core/test/single-graph/tx-sender.ts | 1 + packages/core/test/single-graph/validation.ts | 1 + packages/hardhat-plugin/src/ConfigWrapper.ts | 8 +- .../hardhat-plugin/src/ignition-wrapper.ts | 7 +- packages/hardhat-plugin/src/index.ts | 22 +- .../hardhat-plugin/src/type-extensions.ts | 1 + packages/hardhat-plugin/src/user-recipes.ts | 10 +- packages/hardhat-plugin/test/helpers.ts | 4 +- packages/hardhat-plugin/test/setup.ts | 1 + .../hardhat-plugin/test/single-graph/calls.ts | 1 + .../test/single-graph/chainId.ts | 1 + .../test/single-graph/contracts.ts | 1 + .../test/single-graph/execute-useRecipe.ts | 1 + .../test/single-graph/exiting-contract.ts | 1 + .../test/single-graph/libraries.ts | 1 + .../test/single-graph/params.ts | 1 + .../hardhat-plugin/test/single-graph/plan.ts | 1 + packages/hardhat-plugin/test/user-recipes.ts | 3 +- 57 files changed, 107 insertions(+), 1479 deletions(-) delete mode 100644 packages/core/src/deployment-state-old2.ts delete mode 100644 packages/core/src/executors/CallExecutor.ts delete mode 100644 packages/core/src/executors/ContractExecutor.ts delete mode 100644 packages/core/src/executors/Executor.ts delete mode 100644 packages/core/src/executors/ExistingContractExecutor.ts delete mode 100644 packages/core/src/executors/Hold.ts delete mode 100644 packages/core/src/executors/ParamExecutor.ts delete mode 100644 packages/core/src/executors/utils.ts delete mode 100644 packages/core/src/futures/ArtifactContractFuture.ts delete mode 100644 packages/core/src/futures/CallFuture.ts delete mode 100644 packages/core/src/futures/ContractFuture.ts delete mode 100644 packages/core/src/futures/ExistingContractFuture.ts delete mode 100644 packages/core/src/futures/Future.ts delete mode 100644 packages/core/src/futures/InternalCallFuture.ts delete mode 100644 packages/core/src/futures/InternalContractFuture.ts delete mode 100644 packages/core/src/futures/InternalFuture.ts delete mode 100644 packages/core/src/futures/ParamFuture.ts delete mode 100644 packages/core/src/futures/types.ts delete mode 100644 packages/core/src/futures/utils.ts delete mode 100644 packages/core/src/recipes/ExecutionGraph.ts delete mode 100644 packages/core/src/recipes/IgnitionRecipe.ts delete mode 100644 packages/core/src/recipes/RecipeBuilderImpl.ts delete mode 100644 packages/core/src/recipes/UserRecipe.ts delete mode 100644 packages/core/src/recipes/buildRecipe.ts delete mode 100644 packages/core/src/recipes/types.ts delete mode 100644 packages/core/src/recipes/utils.ts diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index f2501e8540..e113bb5a20 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -8,7 +8,10 @@ module.exports = { parser: "@typescript-eslint/parser", plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], rules: { - "import/no-unused-modules": [1, { unusedExports: true }], + "import/no-unused-modules": [ + 1, + { unusedExports: true, missingExports: true }, + ], "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": [ "error", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 67ac2cfb92..42476ac5b3 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,8 +1,5 @@ import setupDebug from "debug"; -// import { DeploymentResult, IgnitionRecipesResults } from "./execution-engine"; -import { SerializedDeploymentResult } from "./futures/types"; -import { serializeFutureOutput } from "./futures/utils"; import { InMemoryJournal } from "./journal/InMemoryJournal"; import { Providers } from "./providers"; import { Services } from "./services/types"; @@ -15,7 +12,12 @@ import { Recipe } from "./single-graph/types/recipeGraph"; import { UiService } from "./single-graph/ui/ui-service"; import { isDependable } from "./single-graph/utils/guards"; import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; -import { DeploymentResult, IgnitionRecipesResults } from "./types"; +import { + DeploymentResult, + IgnitionRecipesResults, + SerializedDeploymentResult, +} from "./types"; +import { serializeFutureOutput } from "./utils"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/deployment-state-old2.ts b/packages/core/src/deployment-state-old2.ts deleted file mode 100644 index 2499dcb244..0000000000 --- a/packages/core/src/deployment-state-old2.ts +++ /dev/null @@ -1,330 +0,0 @@ -import type { - FutureOutput, - RecipeResult, - SerializedRecipeResult, -} from "./futures/types"; -import { serializeFutureOutput } from "./futures/utils"; -import { ExecutionGraph } from "./recipes/ExecutionGraph"; -import { IgnitionRecipe } from "./recipes/IgnitionRecipe"; - -export class DeploymentState { - private _recipes: Map = new Map(); - - public static fromExecutionGraph( - executionGraph: ExecutionGraph - ): DeploymentState { - const deploymentState = new DeploymentState(); - for (const ignitionRecipe of executionGraph.getSortedRecipes()) { - const recipeState = RecipeState.fromIgnitionRecipe(ignitionRecipe); - deploymentState.addRecipe(recipeState); - } - - return deploymentState; - } - - public addRecipe(recipeState: RecipeState) { - this._recipes.set(recipeState.id, recipeState); - } - - public addRecipeResult(recipeId: string, recipeResult: RecipeResult) { - const recipeState = this._recipes.get(recipeId); - - if (recipeState === undefined) { - throw new Error( - `DeploymentState doesn't have recipe with id '${recipeId}'` - ); - } - - for (const [futureId, futureOutput] of Object.entries(recipeResult)) { - recipeState.setSuccess(futureId, futureOutput); - } - } - - public getRecipe(recipeId: string): RecipeState { - const recipeState = this._recipes.get(recipeId); - if (recipeState === undefined) { - throw new Error( - `DeploymentState doesn't have recipe with id '${recipeId}'` - ); - } - - return recipeState; - } - - public getCurrentRecipe(): RecipeState | undefined { - const runningRecipes = [...this._recipes.values()].filter((m) => - m.isRunning() - ); - - if (runningRecipes.length === 0) { - return; - } - - if (runningRecipes.length > 1) { - throw new Error( - "assertion error: only one recipe should be running at the same time" - ); - } - - return runningRecipes[0]; - } - - public getRecipes(): RecipeState[] { - return [...this._recipes.values()]; - } - - public getSuccessfulRecipes(): RecipeState[] { - return [...this._recipes.values()].filter((m) => m.isSuccess()); - } - - public isFutureSuccess(recipeId: string, futureId: string): boolean { - const futureState = this._getFutureState(recipeId, futureId); - - return futureState._kind === "success"; - } - - public getFutureResult(recipeId: string, futureId: string) { - const futureState = this._getFutureState(recipeId, futureId); - - if (futureState._kind !== "success") { - throw new Error( - `assertion error, unsuccessful future state: ${futureState._kind}` - ); - } - - return futureState.result; - } - - public isRecipeSuccess(recipeId: string): boolean { - const recipeState = this._getRecipeState(recipeId); - - return recipeState.isSuccess(); - } - - public getHolds(): [string, string[]] | undefined { - for (const [recipeId, recipeState] of this._recipes.entries()) { - const holds = recipeState.getHolds(); - if (holds.length > 0) { - return [recipeId, holds]; - } - } - - return; - } - - public getFailures(): [string, Error[]] | undefined { - for (const [recipeId, recipeState] of this._recipes.entries()) { - const failures = recipeState.getFailures(); - if (failures.length > 0) { - return [recipeId, failures]; - } - } - - return; - } - - public setFutureState( - recipeId: string, - futureId: string, - futureState: FutureState - ) { - const recipeState = this._getRecipeState(recipeId); - - recipeState.setFutureState(futureId, futureState); - } - - private _getFutureState(recipeId: string, futureId: string) { - const recipeState = this._getRecipeState(recipeId); - - return recipeState.getFutureState(futureId); - } - - private _getRecipeState(recipeId: string) { - const recipeState = this._recipes.get(recipeId); - - if (recipeState === undefined) { - throw new Error(`No state for recipe '${recipeId}'`); - } - - return recipeState; - } -} - -interface FutureStateWaiting { - _kind: "waiting"; -} -interface FutureStateReady { - _kind: "ready"; -} -interface FutureStateRunning { - _kind: "running"; -} -interface FutureStateSuccess { - _kind: "success"; - result: FutureOutput; -} -interface FutureStateFailure { - _kind: "failure"; - error: Error; -} -interface FutureStateHold { - _kind: "hold"; - reason: string; -} -export type FutureState = - | FutureStateWaiting - | FutureStateReady - | FutureStateRunning - | FutureStateSuccess - | FutureStateFailure - | FutureStateHold; - -// eslint-disable-next-line @typescript-eslint/no-redeclare -- intentionally naming the variable the same as the type -export const FutureState = { - waiting(): FutureState { - return { _kind: "waiting" }; - }, - running(): FutureState { - return { _kind: "running" }; - }, - success(result: FutureOutput): FutureState { - return { _kind: "success", result }; - }, - failure(error: Error): FutureState { - return { _kind: "failure", error }; - }, - hold(reason: string): FutureState { - return { _kind: "hold", reason }; - }, -}; - -export class RecipeState { - private _started = false; - private _futures = new Map(); - - public static fromIgnitionRecipe( - ignitionRecipe: IgnitionRecipe - ): RecipeState { - const recipeState = new RecipeState(ignitionRecipe.id); - - for (const executor of ignitionRecipe.getSortedExecutors()) { - recipeState.addFuture(executor.future.id, FutureState.waiting()); - } - - return recipeState; - } - - constructor(public readonly id: string) {} - - public addFuture(futureId: string, futureState: FutureState) { - this._futures.set(futureId, futureState); - } - - public getFuturesStates(): Array<[string, FutureState]> { - return [...this._futures.entries()]; - } - - public isSuccess(): boolean { - const successCount = [...this._futures.values()].filter( - (b) => b._kind === "success" - ).length; - - return successCount === this._futures.size; - } - - public isRunning(): boolean { - return ( - !this.isFailure() && !this.isHold() && !this.isSuccess() && this._started - ); - } - - public isFailure(): boolean { - return [...this._futures.values()].some((b) => b._kind === "failure"); - } - - public isHold(): boolean { - return ( - !this.isFailure() && - [...this._futures.values()].some((b) => b._kind === "hold") - ); - } - - public setFutureState(futureId: string, futureState: FutureState) { - this._started = true; - this._futures.set(futureId, futureState); - } - - public setSuccess(futureId: string, result: any) { - this._futures.set(futureId, FutureState.success(result)); - } - - public getFutureState(futureId: string): FutureState { - const futureState = this._futures.get(futureId); - if (futureState === undefined) { - throw new Error( - `[RecipeResult] Recipe '${this.id}' has no result for future '${futureId}'` - ); - } - - return futureState; - } - - public getFailures(): Error[] { - return [...this._futures.values()] - .filter((x): x is FutureStateFailure => x._kind === "failure") - .map((x) => x.error); - } - - public getHolds(): string[] { - return [...this._futures.values()] - .filter((x): x is FutureStateHold => x._kind === "hold") - .map((x) => x.reason); - } - - public count(): number { - return this._futures.size; - } - - public toRecipeResult(): SerializedRecipeResult { - const recipeResult: SerializedRecipeResult = {}; - - for (const [futureId, futureState] of this._futures.entries()) { - if (futureState._kind !== "success") { - throw new Error( - "toRecipeResult can only be called in successful recipes" - ); - } - recipeResult[futureId] = serializeFutureOutput(futureState.result); - } - - return recipeResult; - } - - private _getFuture(futureId: string) { - const futureState = this._futures.get(futureId); - - if (futureState === undefined) { - throw new Error("assertion error"); - } - - return futureState; - } - - private _isFutureSuccess(futureId: string): boolean { - const futureState = this._getFuture(futureId); - - return futureState._kind === "success"; - } - - private _isFutureFailure(futureId: string): boolean { - const futureState = this._getFuture(futureId); - - return futureState._kind === "failure"; - } - - private _isFutureHold(futureId: string): boolean { - const futureState = this._getFuture(futureId); - - return futureState._kind === "hold"; - } -} diff --git a/packages/core/src/executors/CallExecutor.ts b/packages/core/src/executors/CallExecutor.ts deleted file mode 100644 index ae30f041d0..0000000000 --- a/packages/core/src/executors/CallExecutor.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ethers } from "ethers"; - -import { InternalContractFuture } from "../futures/InternalContractFuture"; -import { CallOptions, Resolved } from "../futures/types"; -import { Services } from "../services/types"; -import { Tx } from "../types"; - -import { Executor } from "./Executor"; -import { mapToAddress } from "./utils"; - -export class CallExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const { contract, method } = input; - - const args = input.args.map(mapToAddress); - const txHash = await services.contracts.call( - contract.address, - contract.abi, - method, - args - ); - - await services.transactions.wait(txHash); - - return { - hash: txHash, - }; - } - - public async validate( - input: CallOptions, - services: Services - ): Promise { - const contractName = (input.contract as InternalContractFuture).input - .contractName; - const artifactExists = await services.artifacts.hasArtifact(contractName); - - if (!artifactExists) { - return [`Artifact with name '${contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - - const funcs = Object.entries(iface.functions) - .filter(([fname]) => fname === input.method) - .map(([, fragment]) => fragment); - - const functionFragments = iface.fragments - .filter((frag) => frag.name === input.method) - .concat(funcs); - - if (functionFragments.length === 0) { - return [ - `Contract '${contractName}' doesn't have a function ${input.method}`, - ]; - } - - const matchingFunctionFragments = functionFragments.filter( - (f) => f.inputs.length === argsLength - ); - - if (matchingFunctionFragments.length === 0) { - if (functionFragments.length === 1) { - return [ - `Function ${input.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, - ]; - } else { - return [ - `Function ${input.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, - ]; - } - } - - return []; - } - - public getDescription() { - const contractName = (this.future.input.contract as InternalContractFuture) - .input.contractName; - return `Call method ${this.future.input.method} in contract ${contractName}`; - } -} diff --git a/packages/core/src/executors/ContractExecutor.ts b/packages/core/src/executors/ContractExecutor.ts deleted file mode 100644 index 4f04f812ad..0000000000 --- a/packages/core/src/executors/ContractExecutor.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { ethers } from "ethers"; - -import { - ArtifactContractOptions, - ContractOptions, - Resolved, -} from "../futures/types"; -import { Services } from "../services/types"; -import type { Artifact, Contract, DeployedContract } from "../types"; - -import { Executor } from "./Executor"; -import { mapToAddress } from "./utils"; - -export class ContractExecutor extends Executor { - public async execute( - input: Resolved, - services: Services - ): Promise { - const artifact = await this._resolveArtifactFromInput(input, services); - - const args = input.args.map(mapToAddress); - const libraries = Object.fromEntries( - Object.entries(input.libraries ?? {}).map(([k, v]) => [ - k, - mapToAddress(v), - ]) - ); - const txHash = await services.contracts.deploy(artifact, args, libraries); - const receipt = await services.transactions.wait(txHash); - - return { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }; - } - - public async validate( - input: ContractOptions, - services: Services - ): Promise { - const artifactExists = await services.artifacts.hasArtifact( - input.contractName - ); - - if (!artifactExists) { - return [`Artifact with name '${input.contractName}' doesn't exist`]; - } - - const artifact = await services.artifacts.getArtifact(input.contractName); - const argsLength = input.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return [ - `The constructor of the contract '${input.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - ]; - } - - return []; - } - - public getDescription() { - return `Deploy contract ${this.future.input.contractName}`; - } - - private async _resolveArtifactFromInput( - input: Resolved, - services: Services - ): Promise { - if ("artifact" in input) { - return input.artifact; - } - - const { contractName } = input; - - const artifact = await services.artifacts.getArtifact(contractName); - - return artifact; - } -} diff --git a/packages/core/src/executors/Executor.ts b/packages/core/src/executors/Executor.ts deleted file mode 100644 index de72b91ebc..0000000000 --- a/packages/core/src/executors/Executor.ts +++ /dev/null @@ -1,118 +0,0 @@ -import setupDebug, { IDebugger } from "debug"; - -import { FutureState } from "../deployment-state-old2"; -import { InternalFuture } from "../futures/InternalFuture"; -import { FutureOutput, Resolved } from "../futures/types"; -import type { Services } from "../services/types"; - -import { Hold } from "./Hold"; - -export abstract class Executor { - private _dummyInput!: I; - private _dummyOutput!: O; - private state: "ready" | "running" | "hold" | "success" | "failure" = "ready"; - private result?: any; - private error?: any; - private holdReason?: string; - private _debug: IDebugger; - - constructor(public readonly future: InternalFuture) { - const recipeId = future.recipeId; - const futureId = future.id; - this._debug = setupDebug(`ignition:executor:${recipeId}:${futureId}`); - } - - abstract execute(input: Resolved, services: Services): Promise; - abstract validate(input: I, services: Services): Promise; - abstract getDescription(): string; - - public async run( - input: Resolved, - services: Services, - onStateChange: (newState: FutureState) => void - ) { - try { - this._debug("Start running"); - this._setRunning(); - onStateChange(FutureState.running()); - const result = await this.execute(input, services); - this._debug("Ended successfully"); - this._setSuccess(result); - onStateChange(FutureState.success(result)); - } catch (e: any) { - if (e instanceof Hold) { - this._debug("Ended with hold"); - this._setHold(e.reason); - onStateChange(FutureState.hold(e.reason)); - } else { - this._debug("Ended with error"); - this._setFailure(e); - onStateChange(FutureState.failure(e)); - } - } - } - - public isReady() { - return this.state === "ready"; - } - - public isRunning() { - return this.state === "running"; - } - - public isHold() { - return this.state === "hold"; - } - - public getHoldReason(): string { - if (this.holdReason === undefined) { - throw new Error( - `[executor ${this.future.id}] assertion error: no hold reason` - ); - } - - return this.holdReason; - } - - public isSuccess() { - return this.state === "success"; - } - - public getResult() { - if (this.result === undefined) { - throw new Error( - `[executor ${this.future.id}] assertion error: no result` - ); - } - - return this.result; - } - - public isFailure() { - return this.state === "failure"; - } - - public getError() { - if (this.error === undefined) { - throw new Error("assertion error"); - } - - return this.error; - } - - private _setRunning() { - this.state = "running"; - } - private _setHold(reason: string) { - this.state = "hold"; - this.holdReason = reason; - } - private _setSuccess(result: any) { - this.state = "success"; - this.result = result; - } - private _setFailure(err: Error) { - this.state = "failure"; - this.error = err; - } -} diff --git a/packages/core/src/executors/ExistingContractExecutor.ts b/packages/core/src/executors/ExistingContractExecutor.ts deleted file mode 100644 index 67d2fe8115..0000000000 --- a/packages/core/src/executors/ExistingContractExecutor.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { isAddress } from "@ethersproject/address"; - -import { ExistingContractOptions } from "../futures/types"; -import { Services } from "../services/types"; -import { Contract } from "../types"; - -import { Executor } from "./Executor"; - -export class ExistingContractExecutor extends Executor< - ExistingContractOptions, - Contract -> { - public async execute( - { - contractName: name, - address, - abi, - }: { - contractName: string; - address: string; - abi: any[]; - }, - _services: Services - ): Promise { - return { - name, - abi, - address, - }; - } - - public async validate( - input: ExistingContractOptions, - _services: Services - ): Promise { - if (!isAddress(input.address)) { - return [ - `The existing contract ${this.future.input.contractName} is an invalid address ${input.address}`, - ]; - } - - return []; - } - - public getDescription() { - return `Using existing contract ${this.future.input.contractName} (${this.future.input.address})`; - } -} diff --git a/packages/core/src/executors/Hold.ts b/packages/core/src/executors/Hold.ts deleted file mode 100644 index beefa11265..0000000000 --- a/packages/core/src/executors/Hold.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * An instance of this class is thrown to indicate that the executor is waiting - * for some external event to happen, like a multisig that needs extra - * confirmations or a timelocked contract. - */ - -export class Hold { - constructor(public readonly reason: string) {} -} diff --git a/packages/core/src/executors/ParamExecutor.ts b/packages/core/src/executors/ParamExecutor.ts deleted file mode 100644 index b904c92025..0000000000 --- a/packages/core/src/executors/ParamExecutor.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { ParamOptions } from "../futures/types"; -import { Services } from "../services/types"; - -import { Executor } from "./Executor"; - -export class ParamExecutor extends Executor { - public async execute( - { paramName, defaultValue }: ParamOptions, - services: Services - ): Promise { - const hasParamResult = await services.config.hasParam(paramName); - - if (defaultValue !== undefined) { - if (hasParamResult.found) { - return services.config.getParam(paramName); - } else { - return defaultValue; - } - } - - return services.config.getParam(paramName); - } - - public async validate( - { paramName, defaultValue }: ParamOptions, - services: Services - ): Promise { - const hasParamResult = await services.config.hasParam(paramName); - - if (defaultValue !== undefined) { - return []; - } - - if (!hasParamResult.found && hasParamResult.errorCode === "no-params") { - return [ - `No parameters object provided to deploy options, but recipe requires parameter "${paramName}"`, - ]; - } - - if (!hasParamResult.found && hasParamResult.errorCode === "param-missing") { - return [`No parameter provided for "${paramName}"`]; - } - - if (!hasParamResult.found) { - return ["Unexpected state during lookup"]; - } - - return []; - } - - public getDescription(): string { - return `Read param ${this.future.input.paramName}`; - } -} diff --git a/packages/core/src/executors/utils.ts b/packages/core/src/executors/utils.ts deleted file mode 100644 index ea56e2dac5..0000000000 --- a/packages/core/src/executors/utils.ts +++ /dev/null @@ -1,19 +0,0 @@ -export function mapToAddress(x: any): any { - if (typeof x === "string") { - return x; - } - - if (x === undefined || x === null) { - return x; - } - - if ((x as any).address) { - return (x as any).address; - } - - if (Array.isArray(x)) { - return x.map(mapToAddress); - } - - return x; -} diff --git a/packages/core/src/futures/ArtifactContractFuture.ts b/packages/core/src/futures/ArtifactContractFuture.ts deleted file mode 100644 index f8f5478b36..0000000000 --- a/packages/core/src/futures/ArtifactContractFuture.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Contract } from "../types"; - -import { InternalFuture } from "./InternalFuture"; -import { ArtifactContractOptions } from "./types"; -import { combineArgsAndLibrariesAsDeps } from "./utils"; - -export class ArtifactContractFuture extends InternalFuture< - ArtifactContractOptions, - Contract -> { - public getDependencies(): InternalFuture[] { - return combineArgsAndLibrariesAsDeps( - this.input.args, - this.input.libraries ?? {} - ); - } -} diff --git a/packages/core/src/futures/CallFuture.ts b/packages/core/src/futures/CallFuture.ts deleted file mode 100644 index a3112f19d4..0000000000 --- a/packages/core/src/futures/CallFuture.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { Tx } from "../types"; - -import { Future } from "./Future"; -import { CallOptions } from "./types"; - -export class CallFuture extends Future {} diff --git a/packages/core/src/futures/ContractFuture.ts b/packages/core/src/futures/ContractFuture.ts deleted file mode 100644 index a29d6f5c93..0000000000 --- a/packages/core/src/futures/ContractFuture.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Contract } from "../types"; - -import { Future } from "./Future"; -import { ContractOptions, ExistingContractOptions } from "./types"; - -export class ContractFuture extends Future< - ContractOptions | ExistingContractOptions, - Contract -> {} diff --git a/packages/core/src/futures/ExistingContractFuture.ts b/packages/core/src/futures/ExistingContractFuture.ts deleted file mode 100644 index 5cb15d5a45..0000000000 --- a/packages/core/src/futures/ExistingContractFuture.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Contract } from "../types"; - -import { InternalFuture } from "./InternalFuture"; -import type { ExistingContractOptions } from "./types"; - -export class ExistingContractFuture extends InternalFuture< - ExistingContractOptions, - Contract -> { - public getDependencies(): InternalFuture[] { - return []; - } -} diff --git a/packages/core/src/futures/Future.ts b/packages/core/src/futures/Future.ts deleted file mode 100644 index a5259374ca..0000000000 --- a/packages/core/src/futures/Future.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FutureOutput } from "./types"; - -export abstract class Future { - // dummy variables needed by the type-checker to work correctly when opaque - // types are used in a recipe definition - protected _dummyInput!: I; - protected _dummyOutput!: O; -} diff --git a/packages/core/src/futures/InternalCallFuture.ts b/packages/core/src/futures/InternalCallFuture.ts deleted file mode 100644 index ba9960c536..0000000000 --- a/packages/core/src/futures/InternalCallFuture.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Tx } from "../types"; - -import { InternalFuture } from "./InternalFuture"; -import { CallOptions, Unflattened } from "./types"; -import { deepFlatten } from "./utils"; - -export class InternalCallFuture extends InternalFuture { - public getDependencies(): InternalFuture[] { - const mapToFutures = (x: unknown): Unflattened => { - if (Array.isArray(x)) { - return x.map(mapToFutures); - } - - if (InternalFuture.isFuture(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToFutures); - } - - return []; - }; - - const dependencies = deepFlatten( - mapToFutures([this.input.contract, ...this.input.args]) - ); - - return dependencies; - } -} diff --git a/packages/core/src/futures/InternalContractFuture.ts b/packages/core/src/futures/InternalContractFuture.ts deleted file mode 100644 index 60120d285f..0000000000 --- a/packages/core/src/futures/InternalContractFuture.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Contract } from "../types"; - -import { InternalFuture } from "./InternalFuture"; -import { ContractOptions } from "./types"; -import { combineArgsAndLibrariesAsDeps } from "./utils"; - -export class InternalContractFuture extends InternalFuture< - ContractOptions, - Contract -> { - public getDependencies(): InternalFuture[] { - return combineArgsAndLibrariesAsDeps( - this.input.args, - this.input.libraries ?? {} - ); - } -} diff --git a/packages/core/src/futures/InternalFuture.ts b/packages/core/src/futures/InternalFuture.ts deleted file mode 100644 index 758b2929cf..0000000000 --- a/packages/core/src/futures/InternalFuture.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Future } from "./Future"; -import { FutureOutput } from "./types"; - -export abstract class InternalFuture< - I = unknown, - O extends FutureOutput = any -> extends Future { - constructor( - public readonly recipeId: string, - public readonly id: string, - public readonly input: I - ) { - super(); - } - - abstract getDependencies(): InternalFuture[]; - - public static isFuture(x: unknown): x is InternalFuture { - return x instanceof InternalFuture; - } -} diff --git a/packages/core/src/futures/ParamFuture.ts b/packages/core/src/futures/ParamFuture.ts deleted file mode 100644 index e2d71eba47..0000000000 --- a/packages/core/src/futures/ParamFuture.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { InternalFuture } from "./InternalFuture"; -import { ParamOptions } from "./types"; - -export class ParamFuture extends InternalFuture { - public getDependencies(): Array> { - return []; - } -} diff --git a/packages/core/src/futures/types.ts b/packages/core/src/futures/types.ts deleted file mode 100644 index bf5a980b45..0000000000 --- a/packages/core/src/futures/types.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { ParamValue } from "../recipes/types"; -import { Artifact, Contract, Tx } from "../types"; - -import { ContractFuture } from "./ContractFuture"; -import { Future } from "./Future"; -import { serializeFutureOutput } from "./utils"; - -export type FutureOutput = string | number | Contract | Tx; - -export type RecipeResult = Record; -export type SerializedRecipeResult = Record; -export type SerializedFutureResult = ReturnType; - -export type SerializedDeploymentResult = Record; - -export interface ContractOptions { - contractName: string; - args: Array>; - libraries?: Record>; -} - -export interface ArtifactContractOptions { - contractName: string; - artifact: Artifact; - args: Array>; - libraries?: Record>; -} - -export interface ExistingContractOptions { - contractName: string; - address: string; - abi: any[]; -} - -export interface CallOptions { - contract: ContractFuture; - method: string; - args: Array>; -} - -export interface ParamOptions { - paramName: string; - defaultValue?: ParamValue; -} - -export type IFuture = T | Future; - -export type AddressLike = IFuture | Future; - -export type Unflattened = T[] | Array>; - -export type Resolved = T extends Future - ? O - : { - [K in keyof T]: T[K] extends Future ? O : Resolved; - }; diff --git a/packages/core/src/futures/utils.ts b/packages/core/src/futures/utils.ts deleted file mode 100644 index d01988f2fd..0000000000 --- a/packages/core/src/futures/utils.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { InternalFuture } from "./InternalFuture"; -import type { FutureOutput, Unflattened } from "./types"; - -export function deepFlatten(array: Unflattened): T[] { - let result: T[] = []; - - array.forEach((elem) => { - if (Array.isArray(elem)) { - result = result.concat(deepFlatten(elem)); - } else { - result.push(elem); - } - }); - - return result; -} - -export function serializeFutureOutput(x: FutureOutput) { - if (typeof x === "string") { - return { _kind: "string" as const, value: x }; - } else if (typeof x === "number") { - return { _kind: "number" as const, value: x }; - } else if ("address" in x) { - return { _kind: "contract" as const, value: x }; - } else if ("hash" in x) { - return { _kind: "tx" as const, value: x }; - } - - const exhaustiveCheck: never = x; - return exhaustiveCheck; -} - -export function deserializeFutureOutput(x: any) { - if (x === null || x === undefined) { - throw new Error("[deserializeFutureOutput] value is null or undefined"); - } - - if (!("_kind" in x)) { - throw new Error( - "[deserializeFutureOutput] value was not serialized by Ignition" - ); - } - - return x.value; -} - -export function mapToFutures(x: unknown): Unflattened { - if (Array.isArray(x)) { - return x.map(mapToFutures); - } - - if (InternalFuture.isFuture(x)) { - return [x]; - } - - if (typeof x === "object" && x !== null) { - return Object.values(x).map(mapToFutures); - } - - return []; -} - -export function combineArgsAndLibrariesAsDeps( - args: any[], - libraries: Record -) { - const argFutures = deepFlatten(mapToFutures(args)); - const libraryFutures = deepFlatten(mapToFutures(Object.values(libraries))); - - const dependencies = argFutures.concat(libraryFutures); - - return dependencies; -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 602e988317..edc92c816d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,22 +1,8 @@ -export { Future } from "./futures/Future"; -export { ContractFuture } from "./futures/ContractFuture"; -export { InternalFuture } from "./futures/InternalFuture"; -export { InternalContractFuture } from "./futures/InternalContractFuture"; export type { - AddressLike, - ContractOptions, SerializedDeploymentResult, SerializedRecipeResult, SerializedFutureResult, -} from "./futures/types"; - -export { Executor } from "./executors/Executor"; -export { Hold } from "./executors/Hold"; - -export { buildRecipe } from "./recipes/buildRecipe"; -export type { RecipeBuilder } from "./recipes/types"; -export { UserRecipe } from "./recipes/UserRecipe"; -export type { ParamValue, RecipeDefinition } from "./recipes/types"; +} from "./types"; export type { Services } from "./services/types"; @@ -33,3 +19,7 @@ export type { IRecipeGraphBuilder, FutureDict, } from "./single-graph/index"; +export type { + Recipe, + ExternalParamValue, +} from "./single-graph/types/recipeGraph"; diff --git a/packages/core/src/providers.ts b/packages/core/src/providers.ts index 9c4af42c0b..a9437cc23e 100644 --- a/packages/core/src/providers.ts +++ b/packages/core/src/providers.ts @@ -1,6 +1,6 @@ import type { ethers } from "ethers"; -import { ParamValue } from "./recipes/types"; +import { ExternalParamValue } from "./single-graph/types/recipeGraph"; import { Artifact } from "./types"; export interface Providers { @@ -47,9 +47,9 @@ export type HasParamResult = | { found: true }; export interface ConfigProvider { - setParams(parameters: { [key: string]: ParamValue }): Promise; + setParams(parameters: { [key: string]: ExternalParamValue }): Promise; - getParam(paramName: string): Promise; + getParam(paramName: string): Promise; hasParam(paramName: string): Promise; } diff --git a/packages/core/src/recipes/ExecutionGraph.ts b/packages/core/src/recipes/ExecutionGraph.ts deleted file mode 100644 index b5855f451f..0000000000 --- a/packages/core/src/recipes/ExecutionGraph.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Executor } from "../executors/Executor"; -import { ParamFuture } from "../futures/ParamFuture"; - -import { IgnitionRecipe } from "./IgnitionRecipe"; - -export class ExecutionGraph { - private _recipes: Map> = new Map(); - private _dependencies: Map> = new Map(); - - public addExecutor(executor: Executor) { - const recipeId = executor.future.recipeId; - let executorsMap = this._recipes.get(recipeId); - if (executorsMap === undefined) { - executorsMap = new Map(); - this._recipes.set(recipeId, executorsMap); - } - - if (executorsMap.has(executor.future.id)) { - if (executor.future instanceof ParamFuture) { - if (executor.future.input.defaultValue === undefined) { - throw new Error( - `A parameter should only be retrieved once, but found more than one call to getParam for "${executor.future.id}"` - ); - } else { - throw new Error( - `An optional parameter should only be retrieved once, but found more than one call to getParam for "${executor.future.id}"` - ); - } - } else { - throw new Error( - `Executor with id ${executor.future.id} already exists` - ); - } - } - - const dependencies = executor.future.getDependencies(); - for (const dependency of dependencies) { - this._addDependency(recipeId, dependency.recipeId); - } - - executorsMap.set(executor.future.id, executor); - } - - public getRecipe(recipeId: string): IgnitionRecipe | undefined { - const executorsMap = this._recipes.get(recipeId); - if (executorsMap === undefined) { - return undefined; - } - - return new IgnitionRecipe(recipeId, [...executorsMap.values()]); - } - - public getSortedRecipes(): IgnitionRecipe[] { - const added = new Set(); - const ignitionRecipes = this._getRecipes(); - const sortedRecipes: IgnitionRecipe[] = []; - - while (added.size < ignitionRecipes.length) { - for (const ignitionRecipe of ignitionRecipes) { - if (added.has(ignitionRecipe.id)) { - continue; - } - - const dependencies = - this._dependencies.get(ignitionRecipe.id) ?? new Set(); - if ([...dependencies].every((d) => added.has(d))) { - sortedRecipes.push(ignitionRecipe); - added.add(ignitionRecipe.id); - } - } - } - - return sortedRecipes; - } - - private _addDependency(recipeId: string, dependencyRecipeId: string) { - if (recipeId !== dependencyRecipeId) { - const dependencies = - this._dependencies.get(recipeId) ?? new Set(); - dependencies.add(dependencyRecipeId); - this._dependencies.set(recipeId, dependencies); - } - } - - private _getRecipes(): IgnitionRecipe[] { - return [...this._recipes.entries()].map( - ([id, executorsMap]) => new IgnitionRecipe(id, [...executorsMap.values()]) - ); - } -} diff --git a/packages/core/src/recipes/IgnitionRecipe.ts b/packages/core/src/recipes/IgnitionRecipe.ts deleted file mode 100644 index 8884354376..0000000000 --- a/packages/core/src/recipes/IgnitionRecipe.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { Executor } from "../executors/Executor"; - -export class IgnitionRecipe { - constructor(public readonly id: string, private _executors: Executor[]) {} - - public getSortedExecutors(): Executor[] { - const dependencies = new Map>(); - - for (const executor of this._executors) { - const executorDependencies = - dependencies.get(executor.future.id) ?? new Set(); - - for (const executorDependency of executor.future.getDependencies()) { - if (executorDependency.recipeId === executor.future.recipeId) { - executorDependencies.add(executorDependency.id); - } - } - - dependencies.set(executor.future.id, executorDependencies); - } - - const added = new Set(); - const sortedExecutors: Executor[] = []; - - while (added.size < this._executors.length) { - for (const executor of this._executors) { - if (added.has(executor.future.id)) { - continue; - } - - const executorDependencies = - dependencies.get(executor.future.id) ?? new Set(); - - if ([...executorDependencies].every((d) => added.has(d))) { - sortedExecutors.push(executor); - added.add(executor.future.id); - } - } - } - - return sortedExecutors; - } -} diff --git a/packages/core/src/recipes/RecipeBuilderImpl.ts b/packages/core/src/recipes/RecipeBuilderImpl.ts deleted file mode 100644 index 563b5239d0..0000000000 --- a/packages/core/src/recipes/RecipeBuilderImpl.ts +++ /dev/null @@ -1,180 +0,0 @@ -import { CallExecutor } from "../executors/CallExecutor"; -import { ContractExecutor } from "../executors/ContractExecutor"; -import { Executor } from "../executors/Executor"; -import { ExistingContractExecutor } from "../executors/ExistingContractExecutor"; -import { ParamExecutor } from "../executors/ParamExecutor"; -import { ArtifactContractFuture } from "../futures/ArtifactContractFuture"; -import { ContractFuture } from "../futures/ContractFuture"; -import { ExistingContractFuture } from "../futures/ExistingContractFuture"; -import { InternalCallFuture } from "../futures/InternalCallFuture"; -import { InternalContractFuture } from "../futures/InternalContractFuture"; -import { InternalFuture } from "../futures/InternalFuture"; -import { ParamFuture } from "../futures/ParamFuture"; -import type { - CallOptions, - ContractOptions, - ExistingContractOptions, -} from "../futures/types"; -import type { Artifact, Contract, Tx } from "../types"; - -import { ExecutionGraph } from "./ExecutionGraph"; -import { UserRecipe } from "./UserRecipe"; -import type { - RecipeBuilder, - UserContractOptions, - UserCallOptions, - ParamValue, -} from "./types"; -import { isArtifact } from "./utils"; - -export class RecipeBuilderImpl implements RecipeBuilder { - private _currentRecipeId: string | undefined; - private _executionGraph = new ExecutionGraph(); - private _executors: Executor[] = []; - private _knownRecipes: Map, any]> = new Map(); - - constructor(public chainId: number) {} - - public getRecipeId(): string { - if (this._currentRecipeId === undefined) { - throw new Error("[RecipeBuilderImpl] Assertion error: no recipe is set"); - } - - return this._currentRecipeId; - } - - public buildExecutionGraph(): ExecutionGraph { - return this._executionGraph; - } - - public addExecutor(executor: Executor) { - if (this._currentRecipeId === undefined) { - throw new Error("[RecipeBuilderImpl] Assertion error: no recipe is set"); - } - - this._executionGraph.addExecutor(executor); - } - - public contract( - contractName: string, - artifactOrOptions?: Artifact | UserContractOptions, - givenOptions?: UserContractOptions - ): InternalFuture { - let future; - if (isArtifact(artifactOrOptions)) { - const artifact = artifactOrOptions; - const options = givenOptions; - - const id = options?.id ?? contractName; - const args = options?.args ?? []; - const libraries = options?.libraries ?? {}; - - future = new ArtifactContractFuture(this.getRecipeId(), id, { - contractName, - args, - libraries, - artifact, - }); - } else { - const options = artifactOrOptions; - - const id = options?.id ?? contractName; - const args = options?.args ?? []; - const libraries = options?.libraries ?? {}; - - future = new InternalContractFuture(this.getRecipeId(), id, { - contractName, - args, - libraries, - }); - } - - this.addExecutor(new ContractExecutor(future)); - - return future; - } - - public contractAt( - contractName: string, - address: string, - abi: any[] - ): InternalFuture { - const id = contractName; - - const future = new ExistingContractFuture(this.getRecipeId(), id, { - contractName, - address, - abi, - }); - - this.addExecutor(new ExistingContractExecutor(future)); - - return future; - } - - public call( - contract: ContractFuture, - method: string, - options?: UserCallOptions - ): InternalFuture { - const id = - options?.id ?? `${(contract as InternalContractFuture).id}.${method}`; - const args = options?.args ?? []; - const b = new InternalCallFuture(this.getRecipeId(), id, { - contract, - method, - args, - }); - - this.addExecutor(new CallExecutor(b)); - - return b; - } - - public useRecipe(userRecipe: UserRecipe): T { - const knownRecipeAndOutput = this._knownRecipes.get(userRecipe.id); - if (knownRecipeAndOutput !== undefined) { - const [knownRecipe, knownOutput] = knownRecipeAndOutput; - if (userRecipe === knownRecipe) { - return knownOutput; - } else { - throw new Error(`Recipe with id ${userRecipe.id} already exists`); - } - } - - const previousRecipeId = this._currentRecipeId; - this._currentRecipeId = userRecipe.id; - const output = userRecipe.definition(this); - this._currentRecipeId = previousRecipeId; - - this._knownRecipes.set(userRecipe.id, [userRecipe, output]); - - return output; - } - - public getParam(paramName: string): ParamFuture { - const id = paramName; - - const future = new ParamFuture(this.getRecipeId(), id, { paramName }); - - this.addExecutor(new ParamExecutor(future)); - - return future; - } - - public getOptionalParam( - paramName: string, - defaultValue: ParamValue - ): ParamFuture { - const id = paramName; - - const future = new ParamFuture(this.getRecipeId(), id, { - paramName, - defaultValue, - }); - - this.addExecutor(new ParamExecutor(future)); - - return future; - } -} diff --git a/packages/core/src/recipes/UserRecipe.ts b/packages/core/src/recipes/UserRecipe.ts deleted file mode 100644 index 326e4f59f6..0000000000 --- a/packages/core/src/recipes/UserRecipe.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { RecipeDefinition } from "./types"; - -export class UserRecipe { - public readonly version = 1; - - constructor( - public readonly id: string, - public readonly definition: RecipeDefinition - ) {} -} diff --git a/packages/core/src/recipes/buildRecipe.ts b/packages/core/src/recipes/buildRecipe.ts deleted file mode 100644 index 9494c07515..0000000000 --- a/packages/core/src/recipes/buildRecipe.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { UserRecipe } from "./UserRecipe"; -import { RecipeDefinition } from "./types"; - -export function buildRecipe( - recipeId: string, - recipeDefinition: RecipeDefinition -): UserRecipe { - return new UserRecipe(recipeId, recipeDefinition); -} diff --git a/packages/core/src/recipes/types.ts b/packages/core/src/recipes/types.ts deleted file mode 100644 index 31a3c0822d..0000000000 --- a/packages/core/src/recipes/types.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Executor } from "../executors/Executor"; -import { CallFuture } from "../futures/CallFuture"; -import { ContractFuture } from "../futures/ContractFuture"; -import { ParamFuture } from "../futures/ParamFuture"; -import type { IFuture } from "../futures/types"; -import { Artifact } from "../types"; - -import { UserRecipe } from "./UserRecipe"; - -export interface UserContractOptions { - id?: string; - args?: Array>; - libraries?: Record; -} - -export interface UserCallOptions { - id?: string; - args?: Array>; -} - -export type ParamValue = string | number; - -export interface RecipeBuilder { - chainId: number; - - getRecipeId: () => string; - addExecutor: (executor: Executor) => void; - - contract: ( - contractName: string, - artifactOrOptions?: Artifact | UserContractOptions, - options?: UserContractOptions - ) => ContractFuture; - - contractAt: ( - contractName: string, - address: string, - abi: any[] - ) => ContractFuture; - - call: ( - contract: ContractFuture, - method: string, - options?: UserCallOptions - ) => CallFuture; - - useRecipe: (userRecipe: UserRecipe) => T; - - getParam: (paramName: string) => ParamFuture; - - getOptionalParam: ( - paramName: string, - defaultValue: ParamValue - ) => ParamFuture; -} - -export type RecipeDefinition = (m: RecipeBuilder) => T; diff --git a/packages/core/src/recipes/utils.ts b/packages/core/src/recipes/utils.ts deleted file mode 100644 index 6ae38bcad9..0000000000 --- a/packages/core/src/recipes/utils.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Artifact } from "../types"; - -export function isArtifact(artifact: any): artifact is Artifact { - return ( - artifact !== null && - artifact !== undefined && - artifact.bytecode && - artifact.abi - ); -} diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 4bd9885b1a..65f6d480f1 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,8 +1,8 @@ import { HasParamResult, Providers } from "../providers"; -import { ParamValue } from "../recipes/types"; +import { ExternalParamValue } from "../single-graph/types/recipeGraph"; export interface IConfigService { - getParam(paramName: string): Promise; + getParam(paramName: string): Promise; hasParam(paramName: string): Promise; } @@ -10,7 +10,7 @@ export interface IConfigService { export class ConfigService implements IConfigService { constructor(private readonly _providers: Providers) {} - public getParam(paramName: string): Promise { + public getParam(paramName: string): Promise { return this._providers.config.getParam(paramName); } diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/single-graph/types/recipeGraph.ts index e892d12da5..b0e05b9a6c 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/single-graph/types/recipeGraph.ts @@ -19,13 +19,17 @@ export interface LibraryMap { [key: string]: RecipeFuture; } +export type ExternalParamValue = boolean | string | number; + +export type InternalParamValue = ExternalParamValue | RecipeFuture; + export interface HardhatContractRecipeVertex { id: number; type: "HardhatContract"; label: string; scopeAdded: string; contractName: string; - args: Array; + args: InternalParamValue[]; libraries: LibraryMap; } @@ -35,7 +39,7 @@ export interface ArtifactContractRecipeVertex { label: string; scopeAdded: string; artifact: Artifact; - args: Array; + args: InternalParamValue[]; libraries: LibraryMap; } @@ -54,7 +58,7 @@ export interface HardhatLibraryRecipeVertex { libraryName: string; label: string; scopeAdded: string; - args: Array; + args: InternalParamValue[]; } export interface ArtifactLibraryRecipeVertex { @@ -63,7 +67,7 @@ export interface ArtifactLibraryRecipeVertex { label: string; scopeAdded: string; artifact: Artifact; - args: Array; + args: InternalParamValue[]; } export interface CallRecipeVertex { @@ -73,7 +77,7 @@ export interface CallRecipeVertex { scopeAdded: string; contract: CallableFuture; method: string; - args: Array; + args: InternalParamValue[]; after: RecipeFuture[]; } @@ -95,7 +99,7 @@ export type RecipeVertex = | VirtualVertex; export interface ContractOptions { - args?: Array; + args?: InternalParamValue[]; libraries?: { [key: string]: RecipeFuture; }; @@ -142,7 +146,7 @@ export interface IRecipeGraphBuilder { { args, }: { - args: Array; + args: InternalParamValue[]; after?: RecipeFuture[]; } ) => ContractCall; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 7f07b2ec53..1b15e7cc38 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1,7 +1,4 @@ -import { - SerializedDeploymentResult, - SerializedRecipeResult, -} from "./futures/types"; +import { serializeFutureOutput } from "./utils"; export interface Artifact { contractName: string; @@ -39,3 +36,9 @@ export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } | { _kind: "hold"; holds: [string, string[]] } | { _kind: "success"; result: SerializedDeploymentResult }; + +export type SerializedRecipeResult = Record; +export type SerializedDeploymentResult = Record; +export type SerializedFutureResult = ReturnType; + +export type FutureOutput = string | number | Contract | Tx; diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts index f1b30f959d..ee80ff651f 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils.ts @@ -1,2 +1,33 @@ +import { FutureOutput } from "./types"; + export const sleep = (timeout: number) => new Promise((resolve) => setTimeout(resolve, timeout)); + +export function serializeFutureOutput(x: FutureOutput) { + if (typeof x === "string") { + return { _kind: "string" as const, value: x }; + } else if (typeof x === "number") { + return { _kind: "number" as const, value: x }; + } else if ("address" in x) { + return { _kind: "contract" as const, value: x }; + } else if ("hash" in x) { + return { _kind: "tx" as const, value: x }; + } + + const exhaustiveCheck: never = x; + return exhaustiveCheck; +} + +export function deserializeFutureOutput(x: any) { + if (x === null || x === undefined) { + throw new Error("[deserializeFutureOutput] value is null or undefined"); + } + + if (!("_kind" in x)) { + throw new Error( + "[deserializeFutureOutput] value was not serialized by Ignition" + ); + } + + return x.value; +} diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts index c0c8e71856..293d0d9c78 100644 --- a/packages/core/test/setup.ts +++ b/packages/core/test/setup.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; diff --git a/packages/core/test/single-graph/collectLibrariesAndLink.ts b/packages/core/test/single-graph/collectLibrariesAndLink.ts index 51a1f2b055..c2b1162dbe 100644 --- a/packages/core/test/single-graph/collectLibrariesAndLink.ts +++ b/packages/core/test/single-graph/collectLibrariesAndLink.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { expect } from "chai"; import { collectLibrariesAndLink } from "../../src/collectLibrariesAndLink"; diff --git a/packages/core/test/single-graph/execution.ts b/packages/core/test/single-graph/execution.ts index badd84e97d..00d5044231 100644 --- a/packages/core/test/single-graph/execution.ts +++ b/packages/core/test/single-graph/execution.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Services, TransactionOptions } from "../../src/services/types"; diff --git a/packages/core/test/single-graph/graph/adjacencyList.ts b/packages/core/test/single-graph/graph/adjacencyList.ts index f292699b63..cc9fd05521 100644 --- a/packages/core/test/single-graph/graph/adjacencyList.ts +++ b/packages/core/test/single-graph/graph/adjacencyList.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/single-graph/recipes.ts index 46cfad5d6c..f62622d8c5 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/single-graph/recipes.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { RecipeGraph } from "../../src/single-graph//recipe/RecipeGraph"; diff --git a/packages/core/test/single-graph/tx-sender.ts b/packages/core/test/single-graph/tx-sender.ts index 85f6fa29da..cec99d03fc 100644 --- a/packages/core/test/single-graph/tx-sender.ts +++ b/packages/core/test/single-graph/tx-sender.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; diff --git a/packages/core/test/single-graph/validation.ts b/packages/core/test/single-graph/validation.ts index 8c53ffbd0e..c2fdab561c 100644 --- a/packages/core/test/single-graph/validation.ts +++ b/packages/core/test/single-graph/validation.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { generateRecipeGraphFrom } from "../../src/single-graph/process/generateRecipeGraphFrom"; diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index ed88a32082..edb4a4e232 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -1,11 +1,11 @@ import type { ConfigProvider, - ParamValue, + ExternalParamValue, HasParamResult, } from "@nomicfoundation/ignition-core"; export class ConfigWrapper implements ConfigProvider { - private parameters: { [key: string]: ParamValue } | undefined; + private parameters: { [key: string]: ExternalParamValue } | undefined; constructor() { this.parameters = undefined; @@ -14,14 +14,14 @@ export class ConfigWrapper implements ConfigProvider { public async setParams( parameters: | { - [key: string]: ParamValue; + [key: string]: ExternalParamValue; } | undefined ): Promise { this.parameters = parameters; } - public async getParam(paramName: string): Promise { + public async getParam(paramName: string): Promise { if (this.parameters === undefined) { throw new Error( `No parameters object provided to deploy options, but recipe requires parameter "${paramName}"` diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 798716dc0d..695379c5ea 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -3,7 +3,8 @@ import { IgnitionDeployOptions, SerializedRecipeResult, Providers, - ParamValue, + ExternalParamValue, + Recipe, } from "@nomicfoundation/ignition-core"; import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; @@ -46,9 +47,9 @@ export class IgnitionWrapper { } public async deploySingleGraph( - recipe: any, + recipe: Recipe, deployParams: - | { parameters: { [key: string]: ParamValue }; ui?: boolean } + | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } | undefined ) { if (deployParams !== undefined) { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 05300a70f2..d1f9480d95 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import "@nomiclabs/hardhat-ethers"; -import { Providers, UserRecipe } from "@nomicfoundation/ignition-core"; +import { Providers, Recipe } from "@nomicfoundation/ignition-core"; import { exec } from "child_process"; import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; @@ -12,21 +12,7 @@ import { IgnitionWrapper } from "./ignition-wrapper"; import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; import "./type-extensions"; -export { - buildRecipe, - RecipeBuilder, - AddressLike, - ContractFuture, - ContractOptions, - InternalFuture, - InternalContractFuture, - Executor, - Contract, - Services, - Future, - Hold, - buildRecipeSingleGraph, -} from "@nomicfoundation/ignition-core"; +export { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; @@ -141,7 +127,7 @@ task("deploySingleGraph") process.exit(0); } - let userRecipes: Array>; + let userRecipes: Recipe[]; if (userRecipesPaths.length === 0) { userRecipes = loadAllUserRecipes(hre.config.paths.ignition); } else { @@ -173,7 +159,7 @@ task("plan") ) => { await hre.run("compile", { quiet: true }); - let userRecipes: Array>; + let userRecipes: Recipe[]; if (userRecipesPaths.length === 0) { userRecipes = loadAllUserRecipes(hre.config.paths.ignition); } else { diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 403c7dc9e3..888dfd8bf1 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import "hardhat/types/config"; import "hardhat/types/runtime"; diff --git a/packages/hardhat-plugin/src/user-recipes.ts b/packages/hardhat-plugin/src/user-recipes.ts index 40e16c60cb..4f7c8c6419 100644 --- a/packages/hardhat-plugin/src/user-recipes.ts +++ b/packages/hardhat-plugin/src/user-recipes.ts @@ -1,13 +1,11 @@ -import { UserRecipe } from "@nomicfoundation/ignition-core"; +import { Recipe } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; const debug = setupDebug("hardhat-ignition:recipes"); -export function loadAllUserRecipes( - userRecipesDirectory: string -): Array> { +export function loadAllUserRecipes(userRecipesDirectory: string): Recipe[] { debug(`Loading all user recipes from '${userRecipesDirectory}'`); if (!fsExtra.existsSync(userRecipesDirectory)) { @@ -22,7 +20,7 @@ export function loadAllUserRecipes( export function loadUserRecipes( userRecipesDirectory: string, userRecipesFiles: string[] = [] -): Array> { +): Recipe[] { debug(`Loading user recipes from '${userRecipesDirectory}'`); if (!fsExtra.existsSync(userRecipesDirectory)) { @@ -39,7 +37,7 @@ export function loadUserRecipes( export function getUserRecipesFromPaths( resolvedUserRecipesPaths: string[] -): Array> { +): Recipe[] { debug(`Loading '${resolvedUserRecipesPaths.length}' recipe files`); const userRecipes: any[] = []; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index f3442f0c20..b80af7132a 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,5 +1,5 @@ import { - UserRecipe, + Recipe, SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, @@ -113,7 +113,7 @@ async function assertTxMined(hre: any, hash: string) { */ export async function deployRecipes( hre: any, - userRecipes: Array>, + userRecipes: Recipe[], expectedBlocks: number[] ): Promise { await hre.run("compile", { quiet: true }); diff --git a/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-plugin/test/setup.ts index c0c8e71856..293d0d9c78 100644 --- a/packages/hardhat-plugin/test/setup.ts +++ b/packages/hardhat-plugin/test/setup.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; diff --git a/packages/hardhat-plugin/test/single-graph/calls.ts b/packages/hardhat-plugin/test/single-graph/calls.ts index 37c0a5880d..008c5c8bd5 100644 --- a/packages/hardhat-plugin/test/single-graph/calls.ts +++ b/packages/hardhat-plugin/test/single-graph/calls.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { deployRecipe } from "../helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/chainId.ts b/packages/hardhat-plugin/test/single-graph/chainId.ts index 4062642e5c..27d52be8fb 100644 --- a/packages/hardhat-plugin/test/single-graph/chainId.ts +++ b/packages/hardhat-plugin/test/single-graph/chainId.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { deployRecipe } from "../helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/contracts.ts b/packages/hardhat-plugin/test/single-graph/contracts.ts index 83ecebf174..0e403d2cd9 100644 --- a/packages/hardhat-plugin/test/single-graph/contracts.ts +++ b/packages/hardhat-plugin/test/single-graph/contracts.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { deployRecipe } from "../helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts index 0aba8741f3..a50b89ddb6 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { buildRecipeSingleGraph, IRecipeGraphBuilder, diff --git a/packages/hardhat-plugin/test/single-graph/exiting-contract.ts b/packages/hardhat-plugin/test/single-graph/exiting-contract.ts index 2ee93c082f..846df3420a 100644 --- a/packages/hardhat-plugin/test/single-graph/exiting-contract.ts +++ b/packages/hardhat-plugin/test/single-graph/exiting-contract.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { deployRecipe } from "../helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/libraries.ts b/packages/hardhat-plugin/test/single-graph/libraries.ts index 5c813a9cfa..318c22d397 100644 --- a/packages/hardhat-plugin/test/single-graph/libraries.ts +++ b/packages/hardhat-plugin/test/single-graph/libraries.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { deployRecipe } from "../helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/params.ts b/packages/hardhat-plugin/test/single-graph/params.ts index 0befcbda1b..4d12510320 100644 --- a/packages/hardhat-plugin/test/single-graph/params.ts +++ b/packages/hardhat-plugin/test/single-graph/params.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; diff --git a/packages/hardhat-plugin/test/single-graph/plan.ts b/packages/hardhat-plugin/test/single-graph/plan.ts index fea186cce6..fa9d2a5d8a 100644 --- a/packages/hardhat-plugin/test/single-graph/plan.ts +++ b/packages/hardhat-plugin/test/single-graph/plan.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { buildRecipeSingleGraph, IRecipeGraphBuilder, diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts index 53bf0682d3..6b128ee7ed 100644 --- a/packages/hardhat-plugin/test/user-recipes.ts +++ b/packages/hardhat-plugin/test/user-recipes.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { @@ -55,7 +56,7 @@ describe("User recipes", function () { const recipes = getUserRecipesFromPaths(paths); assert.equal(recipes.length, 1); - assert.equal(recipes[0].id, "testing123"); + // assert.equal(recipes[0].id, "testing123"); }); it("should throw if given a file that does not exist", () => { From 8f25436587037705e6730f0510f2cab63bb94012 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 12:02:44 +0100 Subject: [PATCH 0075/1302] refactor: collapse single-graph folder down --- packages/core/src/Ignition.ts | 29 ++++++------ .../execution/ExecutionGraph.ts | 0 .../execution/dispatch/executeContractCall.ts | 2 +- .../dispatch/executeContractDeploy.ts | 2 +- .../dispatch/executeDeployedContract.ts | 2 +- .../dispatch/executeLibraryDeploy.ts | 2 +- .../execution/dispatch/executionDispatch.ts | 2 +- .../execution/dispatch/utils.ts | 0 .../{single-graph => }/execution/execute.ts | 2 +- .../src/{single-graph => }/graph/Graph.ts | 0 .../{single-graph => }/graph/adjacencyList.ts | 0 .../src/{single-graph => }/graph/utils.ts | 0 .../src/{single-graph => }/graph/visit.ts | 0 packages/core/src/index.ts | 24 +++++----- .../process/generateRecipeGraphFrom.ts | 0 ...RecipeGraphByEliminatingVirtualVertexes.ts | 0 .../transformRecipeGraphToExecutionGraph.ts | 8 ++-- .../{single-graph => }/recipe/RecipeGraph.ts | 0 .../recipe/RecipeGraphBuilder.ts | 0 .../{single-graph => }/recipe/ScopeStack.ts | 0 .../{single-graph => }/recipe/buildRecipe.ts | 0 .../core/src/services/ArtifactsService.ts | 4 +- packages/core/src/services/ConfigService.ts | 4 +- .../core/src/services/ContractsService.ts | 10 ++--- .../core/src/services/TransactionsService.ts | 2 +- .../services/createServices.ts | 17 +++---- packages/core/src/single-graph/index.ts | 6 --- packages/core/src/types.ts | 44 ------------------- packages/core/src/types/deployment.ts | 17 +++++++ .../types/executionGraph.ts | 24 +++++----- .../src/{single-graph => }/types/future.ts | 0 .../src/{single-graph => }/types/graph.ts | 0 .../src/{single-graph => }/types/hardhat.ts | 0 packages/core/src/{ => types}/providers.ts | 4 +- .../{single-graph => }/types/recipeGraph.ts | 36 +++++++-------- packages/core/src/types/serialization.ts | 17 +++++++ .../ui/components/index.tsx | 0 .../core/src/{single-graph => }/ui/types.ts | 0 .../src/{single-graph => }/ui/ui-service.tsx | 0 .../{ => utils}/collectLibrariesAndLink.ts | 2 +- .../src/{single-graph => }/utils/guards.ts | 0 .../core/src/{utils.ts => utils/serialize.ts} | 5 +-- packages/core/src/utils/sleep.ts | 3 ++ packages/core/src/{ => utils}/tx-sender.ts | 4 +- .../dispatch/validateArtifactContract.ts | 2 +- .../dispatch/validateArtifactLibrary.ts | 2 +- .../validation/dispatch/validateCall.ts | 2 +- .../dispatch/validateDeployedContract.ts | 2 +- .../dispatch/validateHardhatContract.ts | 2 +- .../dispatch/validateHardhatLibrary.ts | 2 +- .../validation/dispatch/validateVirtual.ts | 2 +- .../validation/dispatch/validationDispatch.ts | 2 +- .../validation/validateRecipeGraph.ts | 2 +- .../collectLibrariesAndLink.ts | 2 +- .../core/test/{single-graph => }/execution.ts | 10 ++--- .../{single-graph => }/graph/adjacencyList.ts | 2 +- .../test/{single-graph => }/graph/helpers.ts | 2 +- .../core/test/{single-graph => }/helpers.ts | 14 +++--- .../core/test/{single-graph => }/recipes.ts | 16 +++---- .../core/test/{single-graph => }/tx-sender.ts | 10 ++--- .../test/{single-graph => }/validation.ts | 10 ++--- .../test/{single-graph => }/calls.ts | 4 +- .../test/{single-graph => }/chainId.ts | 4 +- .../test/{single-graph => }/contracts.ts | 4 +- ...iting-contract.ts => existing-contract.ts} | 4 +- packages/hardhat-plugin/test/helpers.ts | 5 --- .../test/{single-graph => }/libraries.ts | 4 +- .../test/{single-graph => }/params.ts | 4 +- .../test/{single-graph => }/plan.ts | 4 +- .../execute-useRecipe.ts => use-recipe.ts} | 4 +- 70 files changed, 185 insertions(+), 208 deletions(-) rename packages/core/src/{single-graph => }/execution/ExecutionGraph.ts (100%) rename packages/core/src/{single-graph => }/execution/dispatch/executeContractCall.ts (93%) rename packages/core/src/{single-graph => }/execution/dispatch/executeContractDeploy.ts (94%) rename packages/core/src/{single-graph => }/execution/dispatch/executeDeployedContract.ts (88%) rename packages/core/src/{single-graph => }/execution/dispatch/executeLibraryDeploy.ts (93%) rename packages/core/src/{single-graph => }/execution/dispatch/executionDispatch.ts (96%) rename packages/core/src/{single-graph => }/execution/dispatch/utils.ts (100%) rename packages/core/src/{single-graph => }/execution/execute.ts (97%) rename packages/core/src/{single-graph => }/graph/Graph.ts (100%) rename packages/core/src/{single-graph => }/graph/adjacencyList.ts (100%) rename packages/core/src/{single-graph => }/graph/utils.ts (100%) rename packages/core/src/{single-graph => }/graph/visit.ts (100%) rename packages/core/src/{single-graph => }/process/generateRecipeGraphFrom.ts (100%) rename packages/core/src/{single-graph => }/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts (100%) rename packages/core/src/{single-graph => }/process/transformRecipeGraphToExecutionGraph.ts (97%) rename packages/core/src/{single-graph => }/recipe/RecipeGraph.ts (100%) rename packages/core/src/{single-graph => }/recipe/RecipeGraphBuilder.ts (100%) rename packages/core/src/{single-graph => }/recipe/ScopeStack.ts (100%) rename packages/core/src/{single-graph => }/recipe/buildRecipe.ts (100%) rename packages/core/src/{single-graph => }/services/createServices.ts (58%) delete mode 100644 packages/core/src/single-graph/index.ts delete mode 100644 packages/core/src/types.ts create mode 100644 packages/core/src/types/deployment.ts rename packages/core/src/{single-graph => }/types/executionGraph.ts (100%) rename packages/core/src/{single-graph => }/types/future.ts (100%) rename packages/core/src/{single-graph => }/types/graph.ts (100%) rename packages/core/src/{single-graph => }/types/hardhat.ts (100%) rename packages/core/src/{ => types}/providers.ts (93%) rename packages/core/src/{single-graph => }/types/recipeGraph.ts (100%) create mode 100644 packages/core/src/types/serialization.ts rename packages/core/src/{single-graph => }/ui/components/index.tsx (100%) rename packages/core/src/{single-graph => }/ui/types.ts (100%) rename packages/core/src/{single-graph => }/ui/ui-service.tsx (100%) rename packages/core/src/{ => utils}/collectLibrariesAndLink.ts (99%) rename packages/core/src/{single-graph => }/utils/guards.ts (100%) rename packages/core/src/{utils.ts => utils/serialize.ts} (84%) create mode 100644 packages/core/src/utils/sleep.ts rename packages/core/src/{ => utils}/tx-sender.ts (96%) rename packages/core/src/{single-graph => }/validation/dispatch/validateArtifactContract.ts (95%) rename packages/core/src/{single-graph => }/validation/dispatch/validateArtifactLibrary.ts (95%) rename packages/core/src/{single-graph => }/validation/dispatch/validateCall.ts (98%) rename packages/core/src/{single-graph => }/validation/dispatch/validateDeployedContract.ts (92%) rename packages/core/src/{single-graph => }/validation/dispatch/validateHardhatContract.ts (95%) rename packages/core/src/{single-graph => }/validation/dispatch/validateHardhatLibrary.ts (95%) rename packages/core/src/{single-graph => }/validation/dispatch/validateVirtual.ts (87%) rename packages/core/src/{single-graph => }/validation/dispatch/validationDispatch.ts (97%) rename packages/core/src/{single-graph => }/validation/validateRecipeGraph.ts (92%) rename packages/core/test/{single-graph => }/collectLibrariesAndLink.ts (98%) rename packages/core/test/{single-graph => }/execution.ts (95%) rename packages/core/test/{single-graph => }/graph/adjacencyList.ts (98%) rename packages/core/test/{single-graph => }/graph/helpers.ts (93%) rename packages/core/test/{single-graph => }/helpers.ts (77%) rename packages/core/test/{single-graph => }/recipes.ts (97%) rename packages/core/test/{single-graph => }/tx-sender.ts (90%) rename packages/core/test/{single-graph => }/validation.ts (97%) rename packages/hardhat-plugin/test/{single-graph => }/calls.ts (94%) rename packages/hardhat-plugin/test/{single-graph => }/chainId.ts (78%) rename packages/hardhat-plugin/test/{single-graph => }/contracts.ts (96%) rename packages/hardhat-plugin/test/{single-graph/exiting-contract.ts => existing-contract.ts} (93%) rename packages/hardhat-plugin/test/{single-graph => }/libraries.ts (96%) rename packages/hardhat-plugin/test/{single-graph => }/params.ts (97%) rename packages/hardhat-plugin/test/{single-graph => }/plan.ts (92%) rename packages/hardhat-plugin/test/{single-graph/execute-useRecipe.ts => use-recipe.ts} (98%) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 42476ac5b3..d5411be957 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,23 +1,20 @@ import setupDebug from "debug"; +import { execute } from "./execution/execute"; import { InMemoryJournal } from "./journal/InMemoryJournal"; -import { Providers } from "./providers"; +import { generateRecipeGraphFrom } from "./process/generateRecipeGraphFrom"; +import { transformRecipeGraphToExecutionGraph } from "./process/transformRecipeGraphToExecutionGraph"; +import { createServices } from "./services/createServices"; import { Services } from "./services/types"; -import { execute } from "./single-graph/execution/execute"; -import { generateRecipeGraphFrom } from "./single-graph/process/generateRecipeGraphFrom"; -import { transformRecipeGraphToExecutionGraph } from "./single-graph/process/transformRecipeGraphToExecutionGraph"; -import { createServices } from "./single-graph/services/createServices"; -import { DependableFuture, FutureDict } from "./single-graph/types/future"; -import { Recipe } from "./single-graph/types/recipeGraph"; -import { UiService } from "./single-graph/ui/ui-service"; -import { isDependable } from "./single-graph/utils/guards"; -import { validateRecipeGraph } from "./single-graph/validation/validateRecipeGraph"; -import { - DeploymentResult, - IgnitionRecipesResults, - SerializedDeploymentResult, -} from "./types"; -import { serializeFutureOutput } from "./utils"; +import { DeploymentResult, IgnitionRecipesResults } from "./types/deployment"; +import { DependableFuture, FutureDict } from "./types/future"; +import { Providers } from "./types/providers"; +import { Recipe } from "./types/recipeGraph"; +import { SerializedDeploymentResult } from "./types/serialization"; +import { UiService } from "./ui/ui-service"; +import { isDependable } from "./utils/guards"; +import { serializeFutureOutput } from "./utils/serialize"; +import { validateRecipeGraph } from "./validation/validateRecipeGraph"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/single-graph/execution/ExecutionGraph.ts b/packages/core/src/execution/ExecutionGraph.ts similarity index 100% rename from packages/core/src/single-graph/execution/ExecutionGraph.ts rename to packages/core/src/execution/ExecutionGraph.ts diff --git a/packages/core/src/single-graph/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts similarity index 93% rename from packages/core/src/single-graph/execution/dispatch/executeContractCall.ts rename to packages/core/src/execution/dispatch/executeContractCall.ts index 7a5a976b96..d2db6228f5 100644 --- a/packages/core/src/single-graph/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { ContractCall } from "../../types/executionGraph"; import { VertexVisitResult } from "../../types/graph"; diff --git a/packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts similarity index 94% rename from packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts rename to packages/core/src/execution/dispatch/executeContractDeploy.ts index 4402bf52eb..5bfb449d53 100644 --- a/packages/core/src/single-graph/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { ContractDeploy } from "../../types/executionGraph"; import { VertexVisitResult } from "../../types/graph"; diff --git a/packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts similarity index 88% rename from packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts rename to packages/core/src/execution/dispatch/executeDeployedContract.ts index fa9aba5ef8..0bbf8d18a5 100644 --- a/packages/core/src/single-graph/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { DeployedContract } from "../../types/executionGraph"; import { VertexVisitResult } from "../../types/graph"; diff --git a/packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts similarity index 93% rename from packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts rename to packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 32bd061df2..e45389c8a8 100644 --- a/packages/core/src/single-graph/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { LibraryDeploy } from "../../types/executionGraph"; import { VertexVisitResult } from "../../types/graph"; diff --git a/packages/core/src/single-graph/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts similarity index 96% rename from packages/core/src/single-graph/execution/dispatch/executionDispatch.ts rename to packages/core/src/execution/dispatch/executionDispatch.ts index 2c1613a2e8..2e0668215d 100644 --- a/packages/core/src/single-graph/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { ExecutionVertex } from "../../types/executionGraph"; import { VertexVisitResult } from "../../types/graph"; diff --git a/packages/core/src/single-graph/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts similarity index 100% rename from packages/core/src/single-graph/execution/dispatch/utils.ts rename to packages/core/src/execution/dispatch/utils.ts diff --git a/packages/core/src/single-graph/execution/execute.ts b/packages/core/src/execution/execute.ts similarity index 97% rename from packages/core/src/single-graph/execution/execute.ts rename to packages/core/src/execution/execute.ts index fbfbad75cd..14cdf2e2e8 100644 --- a/packages/core/src/single-graph/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; +import { Services } from "../services/types"; import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; import { VisitResult } from "../types/graph"; import { DeploymentState } from "../ui/types"; diff --git a/packages/core/src/single-graph/graph/Graph.ts b/packages/core/src/graph/Graph.ts similarity index 100% rename from packages/core/src/single-graph/graph/Graph.ts rename to packages/core/src/graph/Graph.ts diff --git a/packages/core/src/single-graph/graph/adjacencyList.ts b/packages/core/src/graph/adjacencyList.ts similarity index 100% rename from packages/core/src/single-graph/graph/adjacencyList.ts rename to packages/core/src/graph/adjacencyList.ts diff --git a/packages/core/src/single-graph/graph/utils.ts b/packages/core/src/graph/utils.ts similarity index 100% rename from packages/core/src/single-graph/graph/utils.ts rename to packages/core/src/graph/utils.ts diff --git a/packages/core/src/single-graph/graph/visit.ts b/packages/core/src/graph/visit.ts similarity index 100% rename from packages/core/src/single-graph/graph/visit.ts rename to packages/core/src/graph/visit.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index edc92c816d..dc7dd63abe 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,24 +2,24 @@ export type { SerializedDeploymentResult, SerializedRecipeResult, SerializedFutureResult, -} from "./types"; +} from "./types/serialization"; export type { Services } from "./services/types"; -export type { Providers, ConfigProvider, HasParamResult } from "./providers"; +export type { + Providers, + ConfigProvider, + HasParamResult, +} from "./types/providers"; -export type { DeploymentResult } from "./types"; +export type { DeploymentResult } from "./types/deployment"; export { Ignition, IgnitionDeployOptions } from "./Ignition"; -export type { Contract } from "./types"; -export { buildRecipeSingleGraph } from "./single-graph/index"; +export { buildRecipe as buildRecipeSingleGraph } from "./recipe/buildRecipe"; +export type { Recipe, ExternalParamValue } from "./types/recipeGraph"; export type { - RecipeSingleGraph, + Recipe as RecipeSingleGraph, IRecipeGraphBuilder, - FutureDict, -} from "./single-graph/index"; -export type { - Recipe, - ExternalParamValue, -} from "./single-graph/types/recipeGraph"; +} from "./types/recipeGraph"; +export type { FutureDict } from "./types/future"; diff --git a/packages/core/src/single-graph/process/generateRecipeGraphFrom.ts b/packages/core/src/process/generateRecipeGraphFrom.ts similarity index 100% rename from packages/core/src/single-graph/process/generateRecipeGraphFrom.ts rename to packages/core/src/process/generateRecipeGraphFrom.ts diff --git a/packages/core/src/single-graph/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts similarity index 100% rename from packages/core/src/single-graph/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts rename to packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts diff --git a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts similarity index 97% rename from packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts rename to packages/core/src/process/transformRecipeGraphToExecutionGraph.ts index 8f4511d73d..8d20984531 100644 --- a/packages/core/src/single-graph/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts @@ -1,10 +1,8 @@ -import { Journal } from "../../journal/types"; -import { Providers } from "../../providers"; -import { Services } from "../../services/types"; -import { Artifact } from "../../types"; import { ExecutionGraph } from "../execution/ExecutionGraph"; import { clone } from "../graph/adjacencyList"; +import { Journal } from "../journal/types"; import { createServices } from "../services/createServices"; +import { Services } from "../services/types"; import { ContractCall, ContractDeploy, @@ -14,6 +12,8 @@ import { LibraryDeploy, } from "../types/executionGraph"; import { RecipeFuture } from "../types/future"; +import { Artifact } from "../types/hardhat"; +import { Providers } from "../types/providers"; import { ArtifactContractRecipeVertex, ArtifactLibraryRecipeVertex, diff --git a/packages/core/src/single-graph/recipe/RecipeGraph.ts b/packages/core/src/recipe/RecipeGraph.ts similarity index 100% rename from packages/core/src/single-graph/recipe/RecipeGraph.ts rename to packages/core/src/recipe/RecipeGraph.ts diff --git a/packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts similarity index 100% rename from packages/core/src/single-graph/recipe/RecipeGraphBuilder.ts rename to packages/core/src/recipe/RecipeGraphBuilder.ts diff --git a/packages/core/src/single-graph/recipe/ScopeStack.ts b/packages/core/src/recipe/ScopeStack.ts similarity index 100% rename from packages/core/src/single-graph/recipe/ScopeStack.ts rename to packages/core/src/recipe/ScopeStack.ts diff --git a/packages/core/src/single-graph/recipe/buildRecipe.ts b/packages/core/src/recipe/buildRecipe.ts similarity index 100% rename from packages/core/src/single-graph/recipe/buildRecipe.ts rename to packages/core/src/recipe/buildRecipe.ts diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts index 3152ea6e8d..b11b47f48f 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/services/ArtifactsService.ts @@ -1,5 +1,5 @@ -import { Providers } from "../providers"; -import { Artifact } from "../types"; +import { Artifact } from "../types/hardhat"; +import { Providers } from "../types/providers"; export interface IArtifactsService { getArtifact(name: string): Promise; diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 65f6d480f1..f03be81b74 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,5 +1,5 @@ -import { HasParamResult, Providers } from "../providers"; -import { ExternalParamValue } from "../single-graph/types/recipeGraph"; +import { HasParamResult, Providers } from "../types/providers"; +import { ExternalParamValue } from "../types/recipeGraph"; export interface IConfigService { getParam(paramName: string): Promise; diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 9c5f38e3c5..cc4a269ca9 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,11 +1,11 @@ import setupDebug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; -import { collectLibrariesAndLink } from "../collectLibrariesAndLink"; -import { IgnitionSigner, Providers } from "../providers"; -import { TxSender } from "../tx-sender"; -import { Artifact } from "../types"; -import { sleep } from "../utils"; +import { Artifact } from "../types/hardhat"; +import { IgnitionSigner, Providers } from "../types/providers"; +import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; +import { sleep } from "../utils/sleep"; +import { TxSender } from "../utils/tx-sender"; import type { TransactionOptions } from "./types"; diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index d8a0bafa92..f180409321 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Providers } from "../providers"; +import { Providers } from "../types/providers"; export interface ITransactionsService { wait(txHash: string): Promise; diff --git a/packages/core/src/single-graph/services/createServices.ts b/packages/core/src/services/createServices.ts similarity index 58% rename from packages/core/src/single-graph/services/createServices.ts rename to packages/core/src/services/createServices.ts index b1e0a52226..f1e7588710 100644 --- a/packages/core/src/single-graph/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,11 +1,12 @@ -import { Journal } from "../../journal/types"; -import { Providers } from "../../providers"; -import { ArtifactsService } from "../../services/ArtifactsService"; -import { ConfigService } from "../../services/ConfigService"; -import { ContractsService } from "../../services/ContractsService"; -import { TransactionsService } from "../../services/TransactionsService"; -import { Services } from "../../services/types"; -import { TxSender } from "../../tx-sender"; +import { Journal } from "../journal/types"; +import { Providers } from "../types/providers"; +import { TxSender } from "../utils/tx-sender"; + +import { ArtifactsService } from "./ArtifactsService"; +import { ConfigService } from "./ConfigService"; +import { ContractsService } from "./ContractsService"; +import { TransactionsService } from "./TransactionsService"; +import { Services } from "./types"; export function createServices( recipeId: string, diff --git a/packages/core/src/single-graph/index.ts b/packages/core/src/single-graph/index.ts deleted file mode 100644 index be4b581bb1..0000000000 --- a/packages/core/src/single-graph/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { buildRecipe as buildRecipeSingleGraph } from "./recipe/buildRecipe"; -export type { - Recipe as RecipeSingleGraph, - IRecipeGraphBuilder, -} from "./types/recipeGraph"; -export type { FutureDict } from "./types/future"; diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts deleted file mode 100644 index 1b15e7cc38..0000000000 --- a/packages/core/src/types.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { serializeFutureOutput } from "./utils"; - -export interface Artifact { - contractName: string; - bytecode: string; - abi: any[]; - linkReferences: Record< - string, - Record> - >; -} - -export interface Contract { - name: string; - address: string; - abi: any[]; -} - -export interface DeployedContract extends Contract { - bytecode: string; -} - -export interface Tx { - hash: string; -} - -export interface IgnitionRecipesResults { - load: (recipeId: string) => Promise; - save: ( - recipeId: string, - recipeResult: SerializedRecipeResult - ) => Promise; -} - -export type DeploymentResult = - | { _kind: "failure"; failures: [string, Error[]] } - | { _kind: "hold"; holds: [string, string[]] } - | { _kind: "success"; result: SerializedDeploymentResult }; - -export type SerializedRecipeResult = Record; -export type SerializedDeploymentResult = Record; -export type SerializedFutureResult = ReturnType; - -export type FutureOutput = string | number | Contract | Tx; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts new file mode 100644 index 0000000000..9b7da2f5e2 --- /dev/null +++ b/packages/core/src/types/deployment.ts @@ -0,0 +1,17 @@ +import { + SerializedDeploymentResult, + SerializedRecipeResult, +} from "./serialization"; + +export interface IgnitionRecipesResults { + load: (recipeId: string) => Promise; + save: ( + recipeId: string, + recipeResult: SerializedRecipeResult + ) => Promise; +} + +export type DeploymentResult = + | { _kind: "failure"; failures: [string, Error[]] } + | { _kind: "hold"; holds: [string, string[]] } + | { _kind: "success"; result: SerializedDeploymentResult }; diff --git a/packages/core/src/single-graph/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts similarity index 100% rename from packages/core/src/single-graph/types/executionGraph.ts rename to packages/core/src/types/executionGraph.ts index 296de9ea5c..b1374b0950 100644 --- a/packages/core/src/single-graph/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -3,8 +3,20 @@ import { AdjacencyList } from "./graph"; import { Artifact } from "./hardhat"; import { LibraryMap } from "./recipeGraph"; +export interface IExecutionGraph { + adjacencyList: AdjacencyList; + vertexes: Map; + toMermaid(): string; +} + export type ArgValue = boolean | string | number | RecipeFuture; +export type ExecutionVertex = + | ContractDeploy + | DeployedContract + | LibraryDeploy + | ContractCall; + export interface ContractDeploy { type: "ContractDeploy"; id: number; @@ -38,15 +50,3 @@ export interface ContractCall { method: string; args: ArgValue[]; } - -export type ExecutionVertex = - | ContractDeploy - | DeployedContract - | LibraryDeploy - | ContractCall; - -export interface IExecutionGraph { - adjacencyList: AdjacencyList; - vertexes: Map; - toMermaid(): string; -} diff --git a/packages/core/src/single-graph/types/future.ts b/packages/core/src/types/future.ts similarity index 100% rename from packages/core/src/single-graph/types/future.ts rename to packages/core/src/types/future.ts diff --git a/packages/core/src/single-graph/types/graph.ts b/packages/core/src/types/graph.ts similarity index 100% rename from packages/core/src/single-graph/types/graph.ts rename to packages/core/src/types/graph.ts diff --git a/packages/core/src/single-graph/types/hardhat.ts b/packages/core/src/types/hardhat.ts similarity index 100% rename from packages/core/src/single-graph/types/hardhat.ts rename to packages/core/src/types/hardhat.ts diff --git a/packages/core/src/providers.ts b/packages/core/src/types/providers.ts similarity index 93% rename from packages/core/src/providers.ts rename to packages/core/src/types/providers.ts index a9437cc23e..9948ef0401 100644 --- a/packages/core/src/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,7 +1,7 @@ import type { ethers } from "ethers"; -import { ExternalParamValue } from "./single-graph/types/recipeGraph"; -import { Artifact } from "./types"; +import type { Artifact } from "./hardhat"; +import type { ExternalParamValue } from "./recipeGraph"; export interface Providers { artifacts: ArtifactsProvider; diff --git a/packages/core/src/single-graph/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts similarity index 100% rename from packages/core/src/single-graph/types/recipeGraph.ts rename to packages/core/src/types/recipeGraph.ts index b0e05b9a6c..8a292c25b6 100644 --- a/packages/core/src/single-graph/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -15,6 +15,15 @@ import { import { AdjacencyList } from "./graph"; import { Artifact } from "./hardhat"; +export interface IRecipeGraph { + vertexes: Map; + adjacencyList: AdjacencyList; + registeredParameters: { + [key: string]: { [key: string]: string | number | RecipeFuture }; + }; + toMermaid(): string; +} + export interface LibraryMap { [key: string]: RecipeFuture; } @@ -23,6 +32,15 @@ export type ExternalParamValue = boolean | string | number; export type InternalParamValue = ExternalParamValue | RecipeFuture; +export type RecipeVertex = + | HardhatContractRecipeVertex + | ArtifactContractRecipeVertex + | DeployedContractRecipeVertex + | HardhatLibraryRecipeVertex + | ArtifactLibraryRecipeVertex + | CallRecipeVertex + | VirtualVertex; + export interface HardhatContractRecipeVertex { id: number; type: "HardhatContract"; @@ -89,15 +107,6 @@ export interface VirtualVertex { after: RecipeFuture[]; } -export type RecipeVertex = - | HardhatContractRecipeVertex - | ArtifactContractRecipeVertex - | DeployedContractRecipeVertex - | HardhatLibraryRecipeVertex - | ArtifactLibraryRecipeVertex - | CallRecipeVertex - | VirtualVertex; - export interface ContractOptions { args?: InternalParamValue[]; libraries?: { @@ -109,15 +118,6 @@ export interface UseRecipeOptions { parameters?: { [key: string]: number | string | RecipeFuture }; } -export interface IRecipeGraph { - vertexes: Map; - adjacencyList: AdjacencyList; - registeredParameters: { - [key: string]: { [key: string]: string | number | RecipeFuture }; - }; - toMermaid(): string; -} - export interface IRecipeGraphBuilder { chainId: number; graph: IRecipeGraph; diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts new file mode 100644 index 0000000000..ec35853e31 --- /dev/null +++ b/packages/core/src/types/serialization.ts @@ -0,0 +1,17 @@ +import { serializeFutureOutput } from "../utils/serialize"; + +export type SerializedRecipeResult = Record; +export type SerializedDeploymentResult = Record; +export type SerializedFutureResult = ReturnType; + +export type FutureOutput = string | number | Contract | Tx; + +export interface Contract { + name: string; + address: string; + abi: any[]; +} + +export interface Tx { + hash: string; +} diff --git a/packages/core/src/single-graph/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx similarity index 100% rename from packages/core/src/single-graph/ui/components/index.tsx rename to packages/core/src/ui/components/index.tsx diff --git a/packages/core/src/single-graph/ui/types.ts b/packages/core/src/ui/types.ts similarity index 100% rename from packages/core/src/single-graph/ui/types.ts rename to packages/core/src/ui/types.ts diff --git a/packages/core/src/single-graph/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx similarity index 100% rename from packages/core/src/single-graph/ui/ui-service.tsx rename to packages/core/src/ui/ui-service.tsx diff --git a/packages/core/src/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts similarity index 99% rename from packages/core/src/collectLibrariesAndLink.ts rename to packages/core/src/utils/collectLibrariesAndLink.ts index 7b67f65948..6c7f225a3b 100644 --- a/packages/core/src/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -import { Artifact } from "./types"; +import { Artifact } from "../types/hardhat"; interface Link { sourceName: string; diff --git a/packages/core/src/single-graph/utils/guards.ts b/packages/core/src/utils/guards.ts similarity index 100% rename from packages/core/src/single-graph/utils/guards.ts rename to packages/core/src/utils/guards.ts diff --git a/packages/core/src/utils.ts b/packages/core/src/utils/serialize.ts similarity index 84% rename from packages/core/src/utils.ts rename to packages/core/src/utils/serialize.ts index ee80ff651f..8a9288c8fb 100644 --- a/packages/core/src/utils.ts +++ b/packages/core/src/utils/serialize.ts @@ -1,7 +1,4 @@ -import { FutureOutput } from "./types"; - -export const sleep = (timeout: number) => - new Promise((resolve) => setTimeout(resolve, timeout)); +import { FutureOutput } from "../types/serialization"; export function serializeFutureOutput(x: FutureOutput) { if (typeof x === "string") { diff --git a/packages/core/src/utils/sleep.ts b/packages/core/src/utils/sleep.ts new file mode 100644 index 0000000000..f4a2067c38 --- /dev/null +++ b/packages/core/src/utils/sleep.ts @@ -0,0 +1,3 @@ +export function sleep(timeout: number) { + return new Promise((resolve) => setTimeout(resolve, timeout)); +} diff --git a/packages/core/src/tx-sender.ts b/packages/core/src/utils/tx-sender.ts similarity index 96% rename from packages/core/src/tx-sender.ts rename to packages/core/src/utils/tx-sender.ts index d27f0a0ee1..f74d69256f 100644 --- a/packages/core/src/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -1,8 +1,8 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { Journal } from "./journal/types"; -import { GasProvider, IgnitionSigner } from "./providers"; +import { Journal } from "../journal/types"; +import { GasProvider, IgnitionSigner } from "../types/providers"; /** * Sends, replaces and keeps track of transactions. diff --git a/packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts similarity index 95% rename from packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts rename to packages/core/src/validation/dispatch/validateArtifactContract.ts index d40ca56a10..f1e92f9d71 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { ArtifactContractRecipeVertex } from "../../types/recipeGraph"; import { isArtifact } from "../../utils/guards"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts similarity index 95% rename from packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts rename to packages/core/src/validation/dispatch/validateArtifactLibrary.ts index c6777c7ac0..e650fb7706 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { ArtifactLibraryRecipeVertex } from "../../types/recipeGraph"; import { isArtifact } from "../../utils/guards"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts similarity index 98% rename from packages/core/src/single-graph/validation/dispatch/validateCall.ts rename to packages/core/src/validation/dispatch/validateCall.ts index c899811046..18632becf5 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { CallableFuture } from "../../types/future"; import { VertexVisitResult } from "../../types/graph"; import { CallRecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts similarity index 92% rename from packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts rename to packages/core/src/validation/dispatch/validateDeployedContract.ts index e1c2f9b645..c95a72f6de 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,6 +1,6 @@ import { isAddress } from "@ethersproject/address"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { DeployedContractRecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts similarity index 95% rename from packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts rename to packages/core/src/validation/dispatch/validateHardhatContract.ts index 58ee3d47c9..40a7fd7916 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { HardhatContractRecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts similarity index 95% rename from packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts rename to packages/core/src/validation/dispatch/validateHardhatLibrary.ts index 1b24d5736d..5853fce84e 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { HardhatLibraryRecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts similarity index 87% rename from packages/core/src/single-graph/validation/dispatch/validateVirtual.ts rename to packages/core/src/validation/dispatch/validateVirtual.ts index 2a7c2d87b9..ec11626ef5 100644 --- a/packages/core/src/single-graph/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { RecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts similarity index 97% rename from packages/core/src/single-graph/validation/dispatch/validationDispatch.ts rename to packages/core/src/validation/dispatch/validationDispatch.ts index c2bde591b3..cf8ce1f79f 100644 --- a/packages/core/src/single-graph/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,4 +1,4 @@ -import { Services } from "../../../services/types"; +import { Services } from "../../services/types"; import { VertexVisitResult } from "../../types/graph"; import { RecipeVertex } from "../../types/recipeGraph"; diff --git a/packages/core/src/single-graph/validation/validateRecipeGraph.ts b/packages/core/src/validation/validateRecipeGraph.ts similarity index 92% rename from packages/core/src/single-graph/validation/validateRecipeGraph.ts rename to packages/core/src/validation/validateRecipeGraph.ts index b05c2ba4b3..94a9b19ad3 100644 --- a/packages/core/src/single-graph/validation/validateRecipeGraph.ts +++ b/packages/core/src/validation/validateRecipeGraph.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; +import { Services } from "../services/types"; import { VisitResult } from "../types/graph"; import { IRecipeGraph } from "../types/recipeGraph"; diff --git a/packages/core/test/single-graph/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts similarity index 98% rename from packages/core/test/single-graph/collectLibrariesAndLink.ts rename to packages/core/test/collectLibrariesAndLink.ts index c2b1162dbe..973c0dfc04 100644 --- a/packages/core/test/single-graph/collectLibrariesAndLink.ts +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { expect } from "chai"; -import { collectLibrariesAndLink } from "../../src/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "../src/utils/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/single-graph/execution.ts b/packages/core/test/execution.ts similarity index 95% rename from packages/core/test/single-graph/execution.ts rename to packages/core/test/execution.ts index 00d5044231..0a023118d4 100644 --- a/packages/core/test/single-graph/execution.ts +++ b/packages/core/test/execution.ts @@ -1,14 +1,14 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { Services, TransactionOptions } from "../../src/services/types"; -import { ExecutionGraph } from "../../src/single-graph/execution/ExecutionGraph"; -import { execute } from "../../src/single-graph/execution/execute"; -import { Artifact } from "../types"; +import { ExecutionGraph } from "../src/execution/ExecutionGraph"; +import { execute } from "../src/execution/execute"; +import { Services, TransactionOptions } from "../src/services/types"; +import { ExecutionVertex } from "../src/types/executionGraph"; +import { Artifact } from "../src/types/hardhat"; import { buildAdjacencyListFrom } from "./graph/helpers"; import { getMockServices } from "./helpers"; -import { ExecutionVertex } from "./types/executionGraph"; describe("Execution", () => { it("should execute a contract deploy", async () => { diff --git a/packages/core/test/single-graph/graph/adjacencyList.ts b/packages/core/test/graph/adjacencyList.ts similarity index 98% rename from packages/core/test/single-graph/graph/adjacencyList.ts rename to packages/core/test/graph/adjacencyList.ts index cc9fd05521..bc6a2ce847 100644 --- a/packages/core/test/single-graph/graph/adjacencyList.ts +++ b/packages/core/test/graph/adjacencyList.ts @@ -9,7 +9,7 @@ import { topologicalSort, eliminate, ensureVertex, -} from "../../../src/single-graph/graph/adjacencyList"; +} from "../../src/graph/adjacencyList"; import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; diff --git a/packages/core/test/single-graph/graph/helpers.ts b/packages/core/test/graph/helpers.ts similarity index 93% rename from packages/core/test/single-graph/graph/helpers.ts rename to packages/core/test/graph/helpers.ts index 5c935ff83e..31abfbd2bc 100644 --- a/packages/core/test/single-graph/graph/helpers.ts +++ b/packages/core/test/graph/helpers.ts @@ -2,7 +2,7 @@ import { addEdge, ensureVertex, constructEmptyAdjacencyList, -} from "../../../src/single-graph/graph/adjacencyList"; +} from "../../src/graph/adjacencyList"; export function constructAdjacencyList( edges: Array<{ from: number; to: number }> diff --git a/packages/core/test/single-graph/helpers.ts b/packages/core/test/helpers.ts similarity index 77% rename from packages/core/test/single-graph/helpers.ts rename to packages/core/test/helpers.ts index e79c43e76f..b26d876fdd 100644 --- a/packages/core/test/single-graph/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; -import { HasParamResult } from "../../src/providers"; -import { IContractsService } from "../../src/services/ContractsService"; -import { Services, TransactionOptions } from "../../src/services/types"; -import { IArtifactsService } from "../services/ArtifactsService"; -import { IConfigService } from "../services/ConfigService"; -import { ITransactionsService } from "../services/TransactionsService"; -import { Artifact } from "../types"; +import { IArtifactsService } from "../src/services/ArtifactsService"; +import { IConfigService } from "../src/services/ConfigService"; +import { IContractsService } from "../src/services/ContractsService"; +import { ITransactionsService } from "../src/services/TransactionsService"; +import { Services, TransactionOptions } from "../src/services/types"; +import { Artifact } from "../src/types/hardhat"; +import { HasParamResult } from "../src/types/providers"; export function getMockServices() { const mockServices: Services = { diff --git a/packages/core/test/single-graph/recipes.ts b/packages/core/test/recipes.ts similarity index 97% rename from packages/core/test/single-graph/recipes.ts rename to packages/core/test/recipes.ts index f62622d8c5..1e8dc3b1ea 100644 --- a/packages/core/test/single-graph/recipes.ts +++ b/packages/core/test/recipes.ts @@ -1,24 +1,24 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { RecipeGraph } from "../../src/single-graph//recipe/RecipeGraph"; -import { VertexDescriptor } from "../../src/single-graph//types/graph"; -import { getDependenciesFor } from "../../src/single-graph/graph/adjacencyList"; -import { generateRecipeGraphFrom } from "../../src/single-graph/process/generateRecipeGraphFrom"; -import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; -import { Artifact } from "../../src/single-graph/types/hardhat"; +import { getDependenciesFor } from "../src/graph/adjacencyList"; +import { generateRecipeGraphFrom } from "../src/process/generateRecipeGraphFrom"; +import { RecipeGraph } from "../src/recipe/RecipeGraph"; +import { buildRecipe } from "../src/recipe/buildRecipe"; +import { VertexDescriptor } from "../src/types/graph"; +import { Artifact } from "../src/types/hardhat"; import type { IRecipeGraph, IRecipeGraphBuilder, RecipeVertex, -} from "../../src/single-graph/types/recipeGraph"; +} from "../src/types/recipeGraph"; import { isArtifactContract, isCall, isDeployedContract, isHardhatContract, isHardhatLibrary, -} from "../../src/single-graph/utils/guards"; +} from "../src/utils/guards"; describe("Recipes", function () { describe("single contract", () => { diff --git a/packages/core/test/single-graph/tx-sender.ts b/packages/core/test/tx-sender.ts similarity index 90% rename from packages/core/test/single-graph/tx-sender.ts rename to packages/core/test/tx-sender.ts index cec99d03fc..db41c523b7 100644 --- a/packages/core/test/single-graph/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -4,11 +4,11 @@ import { ethers } from "ethers"; import sinon from "sinon"; import tmp from "tmp"; -import { FileJournal } from "../../src/journal/FileJournal"; -import { InMemoryJournal } from "../../src/journal/InMemoryJournal"; -import { Journal } from "../../src/journal/types"; -import { GasProvider, IgnitionSigner } from "../../src/providers"; -import { TxSender } from "../../src/tx-sender"; +import { FileJournal } from "../src/journal/FileJournal"; +import { InMemoryJournal } from "../src/journal/InMemoryJournal"; +import { Journal } from "../src/journal/types"; +import { GasProvider, IgnitionSigner } from "../src/types/providers"; +import { TxSender } from "../src/utils/tx-sender"; class SignerSpy implements IgnitionSigner { private _index = -1; diff --git a/packages/core/test/single-graph/validation.ts b/packages/core/test/validation.ts similarity index 97% rename from packages/core/test/single-graph/validation.ts rename to packages/core/test/validation.ts index c2fdab561c..18b29e34db 100644 --- a/packages/core/test/single-graph/validation.ts +++ b/packages/core/test/validation.ts @@ -1,11 +1,11 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { generateRecipeGraphFrom } from "../../src/single-graph/process/generateRecipeGraphFrom"; -import { buildRecipe } from "../../src/single-graph/recipe/buildRecipe"; -import type { IRecipeGraphBuilder } from "../../src/single-graph/types/recipeGraph"; -import { validateRecipeGraph } from "../../src/single-graph/validation/validateRecipeGraph"; -import { Artifact } from "../types"; +import { generateRecipeGraphFrom } from "../src/process/generateRecipeGraphFrom"; +import { buildRecipe } from "../src/recipe/buildRecipe"; +import { Artifact } from "../src/types/hardhat"; +import type { IRecipeGraphBuilder } from "../src/types/recipeGraph"; +import { validateRecipeGraph } from "../src/validation/validateRecipeGraph"; import { getMockServices } from "./helpers"; diff --git a/packages/hardhat-plugin/test/single-graph/calls.ts b/packages/hardhat-plugin/test/calls.ts similarity index 94% rename from packages/hardhat-plugin/test/single-graph/calls.ts rename to packages/hardhat-plugin/test/calls.ts index 008c5c8bd5..7534907e34 100644 --- a/packages/hardhat-plugin/test/single-graph/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("calls", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/chainId.ts b/packages/hardhat-plugin/test/chainId.ts similarity index 78% rename from packages/hardhat-plugin/test/single-graph/chainId.ts rename to packages/hardhat-plugin/test/chainId.ts index 27d52be8fb..fe5376445e 100644 --- a/packages/hardhat-plugin/test/single-graph/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("single graph version", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/contracts.ts b/packages/hardhat-plugin/test/contracts.ts similarity index 96% rename from packages/hardhat-plugin/test/single-graph/contracts.ts rename to packages/hardhat-plugin/test/contracts.ts index 0e403d2cd9..0943657d29 100644 --- a/packages/hardhat-plugin/test/single-graph/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("contract deploys", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/exiting-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts similarity index 93% rename from packages/hardhat-plugin/test/single-graph/exiting-contract.ts rename to packages/hardhat-plugin/test/existing-contract.ts index 846df3420a..e2feae3007 100644 --- a/packages/hardhat-plugin/test/single-graph/exiting-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("existing contract", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index b80af7132a..726108d6e1 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -3,7 +3,6 @@ import { SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, - Contract, buildRecipeSingleGraph, IRecipeGraphBuilder, FutureDict, @@ -198,10 +197,6 @@ async function assertContract(hre: any, futureResult: SerializedFutureResult) { return contract; } -export function isContract(contract: any): contract is Contract { - return contract.address !== undefined; -} - export async function deployRecipe( hre: any, recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict, diff --git a/packages/hardhat-plugin/test/single-graph/libraries.ts b/packages/hardhat-plugin/test/libraries.ts similarity index 96% rename from packages/hardhat-plugin/test/single-graph/libraries.ts rename to packages/hardhat-plugin/test/libraries.ts index 318c22d397..4ebfefa6b5 100644 --- a/packages/hardhat-plugin/test/single-graph/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("libraries", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/params.ts b/packages/hardhat-plugin/test/params.ts similarity index 97% rename from packages/hardhat-plugin/test/single-graph/params.ts rename to packages/hardhat-plugin/test/params.ts index 4d12510320..909463dee5 100644 --- a/packages/hardhat-plugin/test/single-graph/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -2,8 +2,8 @@ import { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { deployRecipe, mineBlocks } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { deployRecipe, mineBlocks } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("recipe parameters", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/plan.ts b/packages/hardhat-plugin/test/plan.ts similarity index 92% rename from packages/hardhat-plugin/test/single-graph/plan.ts rename to packages/hardhat-plugin/test/plan.ts index fa9d2a5d8a..ca469b5b9d 100644 --- a/packages/hardhat-plugin/test/single-graph/plan.ts +++ b/packages/hardhat-plugin/test/plan.ts @@ -5,8 +5,8 @@ import { FutureDict, } from "@nomicfoundation/ignition-core"; -import { mineBlocks } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { mineBlocks } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("single graph version", () => { useEnvironment("minimal"); diff --git a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts b/packages/hardhat-plugin/test/use-recipe.ts similarity index 98% rename from packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts rename to packages/hardhat-plugin/test/use-recipe.ts index a50b89ddb6..7b36e13fb3 100644 --- a/packages/hardhat-plugin/test/single-graph/execute-useRecipe.ts +++ b/packages/hardhat-plugin/test/use-recipe.ts @@ -5,8 +5,8 @@ import { } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { mineBlocks } from "../helpers"; -import { useEnvironment } from "../useEnvironment"; +import { mineBlocks } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; describe("useRecipe", function () { useEnvironment("minimal"); From 24484907fb14cd9d08724c3c7b2a9babb4f08772 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 13:57:09 +0100 Subject: [PATCH 0076/1302] refactor: rename to deploy --- examples/simple/ignition/MyRecipe.js | 4 +- examples/simple/ignition/ParamRecipe.js | 4 +- examples/simple/test/myrecipe.test.js | 2 +- examples/simple/test/paramrecipe.test.js | 2 +- packages/core/src/Ignition.ts | 4 +- packages/core/src/index.ts | 6 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +- packages/hardhat-plugin/src/index.ts | 8 +- packages/hardhat-plugin/test/chainId.ts | 2 +- packages/hardhat-plugin/test/helpers.ts | 6 +- packages/hardhat-plugin/test/params.ts | 10 +- packages/hardhat-plugin/test/plan.ts | 8 +- packages/hardhat-plugin/test/use-recipe.ts | 122 ++++++++---------- 13 files changed, 87 insertions(+), 99 deletions(-) diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index 1893cf3e95..459c0f1d7e 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -1,6 +1,6 @@ -const { buildRecipeSingleGraph } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildRecipeSingleGraph("MyRecipe", (m) => { +module.exports = buildRecipe("MyRecipe", (m) => { const foo = m.contract("Foo"); const bar = m.contract("Bar", { args: [foo] }); diff --git a/examples/simple/ignition/ParamRecipe.js b/examples/simple/ignition/ParamRecipe.js index 6c29f39076..629c915695 100644 --- a/examples/simple/ignition/ParamRecipe.js +++ b/examples/simple/ignition/ParamRecipe.js @@ -1,6 +1,6 @@ -const { buildRecipeSingleGraph } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); -module.exports = buildRecipeSingleGraph("ParamRecipe", (m) => { +module.exports = buildRecipe("ParamRecipe", (m) => { const incAmount = m.getParam("IncAmount"); const foo = m.contract("Foo"); diff --git a/examples/simple/test/myrecipe.test.js b/examples/simple/test/myrecipe.test.js index 36b6d7306f..b499aace19 100644 --- a/examples/simple/test/myrecipe.test.js +++ b/examples/simple/test/myrecipe.test.js @@ -3,7 +3,7 @@ const MyRecipe = require("../ignition/MyRecipe"); describe("My Recipe", function () { it("should be able to deploy and read contracts", async function () { - const { foo } = await ignition.deploySingleGraph(MyRecipe); + const { foo } = await ignition.deploy(MyRecipe); assert.isDefined(foo); diff --git a/examples/simple/test/paramrecipe.test.js b/examples/simple/test/paramrecipe.test.js index 2ac4bd1e03..36d156c86f 100644 --- a/examples/simple/test/paramrecipe.test.js +++ b/examples/simple/test/paramrecipe.test.js @@ -3,7 +3,7 @@ const ParamRecipe = require("../ignition/ParamRecipe"); describe("Param Recipe", function () { it("should be able to pass parameters", async function () { - const { foo } = await ignition.deploySingleGraph(ParamRecipe, { + const { foo } = await ignition.deploy(ParamRecipe, { parameters: { IncAmount: 42, }, diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index d5411be957..1f7fbb37d4 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -32,7 +32,7 @@ export class Ignition { private _recipesResults: IgnitionRecipesResults ) {} - public async deploySingleGraph( + public async deploy( recipe: Recipe, options: IgnitionDeployOptions = { ui: true, @@ -94,7 +94,7 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } - public async planSingleGraph(recipe: Recipe) { + public async plan(recipe: Recipe) { log(`Start plan`); const serviceOptions = { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index dc7dd63abe..0b9a7014d9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -16,10 +16,10 @@ export type { DeploymentResult } from "./types/deployment"; export { Ignition, IgnitionDeployOptions } from "./Ignition"; -export { buildRecipe as buildRecipeSingleGraph } from "./recipe/buildRecipe"; -export type { Recipe, ExternalParamValue } from "./types/recipeGraph"; +export { buildRecipe } from "./recipe/buildRecipe"; export type { - Recipe as RecipeSingleGraph, + Recipe, + ExternalParamValue, IRecipeGraphBuilder, } from "./types/recipeGraph"; export type { FutureDict } from "./types/future"; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 695379c5ea..b2c4d91e9a 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -46,7 +46,7 @@ export class IgnitionWrapper { }); } - public async deploySingleGraph( + public async deploy( recipe: Recipe, deployParams: | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } @@ -56,7 +56,7 @@ export class IgnitionWrapper { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await this._ignition.deploySingleGraph(recipe, { + const [deploymentResult] = await this._ignition.deploy(recipe, { ui: deployParams?.ui ?? true, pathToJournal: undefined, txPollingInterval: 300, @@ -103,8 +103,8 @@ export class IgnitionWrapper { return resolvedOutput; } - public async planSingleGraph(recipe: any) { - const plan = await this._ignition.planSingleGraph(recipe); + public async plan(recipe: any) { + const plan = await this._ignition.plan(recipe); if (!Array.isArray(plan)) { const recipeGraph = plan.recipeGraph.toMermaid(); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d1f9480d95..b3c417d851 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -12,7 +12,7 @@ import { IgnitionWrapper } from "./ignition-wrapper"; import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; import "./type-extensions"; -export { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; +export { buildRecipe } from "@nomicfoundation/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; @@ -100,7 +100,7 @@ extendEnvironment((hre) => { }); }); -task("deploySingleGraph") +task("deploy") .addOptionalVariadicPositionalParam("userRecipesPaths") .addOptionalParam( "parameters", @@ -142,7 +142,7 @@ task("deploySingleGraph") process.exit(0); } - await hre.ignition.deploySingleGraph(userRecipes[0], { parameters }); + await hre.ignition.deploy(userRecipes[0], { parameters }); } ); @@ -174,7 +174,7 @@ task("plan") process.exit(0); } - const html = await hre.ignition.planSingleGraph(userRecipes[0]); + const html = await hre.ignition.plan(userRecipes[0]); const filePath = `${hre.config.paths.cache}/plan.html`; diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts index fe5376445e..8cc7ee4343 100644 --- a/packages/hardhat-plugin/test/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { deployRecipe } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("single graph version", () => { +describe("chain id", () => { useEnvironment("minimal"); it("should have a chain id", async function () { diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 726108d6e1..f178f77211 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -3,7 +3,7 @@ import { SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, - buildRecipeSingleGraph, + buildRecipe, IRecipeGraphBuilder, FutureDict, } from "@nomicfoundation/ignition-core"; @@ -204,9 +204,9 @@ export async function deployRecipe( ): Promise { await hre.run("compile", { quiet: true }); - const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); + const userRecipe = buildRecipe("MyRecipe", recipeDefinition); - const deployPromise = hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = hre.ignition.deploy(userRecipe, { ...options, ui: false, }); diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index 909463dee5..c488e512e1 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildRecipeSingleGraph } from "@nomicfoundation/ignition-core"; +import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { deployRecipe, mineBlocks } from "./helpers"; @@ -153,7 +153,7 @@ describe("recipe parameters", () => { it("should throw if no parameters object provided", async function () { await this.hre.run("compile", { quiet: true }); - const userRecipe = buildRecipeSingleGraph("MyRecipe", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -165,7 +165,7 @@ describe("recipe parameters", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, {}); + const deployPromise = this.hre.ignition.deploy(userRecipe, {}); await mineBlocks(this.hre, [1, 1], deployPromise); @@ -178,7 +178,7 @@ describe("recipe parameters", () => { it("should throw if parameter missing from parameters", async function () { await this.hre.run("compile", { quiet: true }); - const userRecipe = buildRecipeSingleGraph("MyRecipe", (m) => { + const userRecipe = buildRecipe("MyRecipe", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -190,7 +190,7 @@ describe("recipe parameters", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: { NotMyNumber: 11, }, diff --git a/packages/hardhat-plugin/test/plan.ts b/packages/hardhat-plugin/test/plan.ts index ca469b5b9d..bb9af52397 100644 --- a/packages/hardhat-plugin/test/plan.ts +++ b/packages/hardhat-plugin/test/plan.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { - buildRecipeSingleGraph, + buildRecipe, IRecipeGraphBuilder, FutureDict, } from "@nomicfoundation/ignition-core"; @@ -8,7 +8,7 @@ import { import { mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("single graph version", () => { +describe("plan", () => { useEnvironment("minimal"); it("should be able to deploy a contract", async function () { @@ -35,9 +35,9 @@ async function plan( ): Promise { await hre.run("compile", { quiet: true }); - const userRecipe = buildRecipeSingleGraph("MyRecipe", recipeDefinition); + const userRecipe = buildRecipe("MyRecipe", recipeDefinition); - const planPromise = hre.ignition.planSingleGraph(userRecipe); + const planPromise = hre.ignition.plan(userRecipe); await mineBlocks(hre, [1, 1, 1], planPromise); diff --git a/packages/hardhat-plugin/test/use-recipe.ts b/packages/hardhat-plugin/test/use-recipe.ts index 7b36e13fb3..47b9a1fa17 100644 --- a/packages/hardhat-plugin/test/use-recipe.ts +++ b/packages/hardhat-plugin/test/use-recipe.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { - buildRecipeSingleGraph, + buildRecipe, IRecipeGraphBuilder, } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; @@ -15,7 +15,7 @@ describe("useRecipe", function () { it("using useRecipe", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipeSingleGraph( + const thirdPartyRecipe = buildRecipe( "ThirdPartyRecipe", (m: IRecipeGraphBuilder) => { const foo = m.contract("Foo"); @@ -24,20 +24,17 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const { foo } = m.useRecipe(thirdPartyRecipe); + const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const { foo } = m.useRecipe(thirdPartyRecipe); - m.call(foo, "inc", { - args: [], - }); + m.call(foo, "inc", { + args: [], + }); - return { foo }; - } - ); + return { foo }; + }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: {}, ui: false, }); @@ -58,7 +55,7 @@ describe("useRecipe", function () { it("using useRecipe", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipeSingleGraph( + const thirdPartyRecipe = buildRecipe( "ThirdPartyRecipe", (m: IRecipeGraphBuilder) => { const foo = m.getParam("Foo"); @@ -71,22 +68,19 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const foo = m.contract("Foo"); + const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const foo = m.contract("Foo"); - m.useRecipe(thirdPartyRecipe, { - parameters: { - Foo: foo, - }, - }); + m.useRecipe(thirdPartyRecipe, { + parameters: { + Foo: foo, + }, + }); - return { foo }; - } - ); + return { foo }; + }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: {}, ui: false, }); @@ -107,7 +101,7 @@ describe("useRecipe", function () { it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); - const addSecondAndThirdEntryRecipe = buildRecipeSingleGraph( + const addSecondAndThirdEntryRecipe = buildRecipe( "ThirdPartyRecipe", (m: IRecipeGraphBuilder) => { const trace = m.getParam("Trace"); @@ -125,29 +119,26 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { thirdCall } = m.useRecipe(addSecondAndThirdEntryRecipe, { - parameters: { - Trace: trace, - }, - }); + const { thirdCall } = m.useRecipe(addSecondAndThirdEntryRecipe, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [thirdCall], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [thirdCall], + }); - return { trace }; - } - ); + return { trace }; + }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: {}, ui: false, }); @@ -172,7 +163,7 @@ describe("useRecipe", function () { it("should allow ordering based on the recipe overall", async function () { await this.hre.run("compile", { quiet: true }); - const addSecondAndThirdEntryRecipe = buildRecipeSingleGraph( + const addSecondAndThirdEntryRecipe = buildRecipe( "ThirdPartyRecipe", (m: IRecipeGraphBuilder) => { const trace = m.getParam("Trace"); @@ -190,29 +181,26 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipeSingleGraph( - "UserRecipe", - (m: IRecipeGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { recipe } = m.useRecipe(addSecondAndThirdEntryRecipe, { - parameters: { - Trace: trace, - }, - }); + const { recipe } = m.useRecipe(addSecondAndThirdEntryRecipe, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [recipe], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [recipe], + }); - return { trace }; - } - ); + return { trace }; + }); - const deployPromise = this.hre.ignition.deploySingleGraph(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userRecipe, { parameters: {}, ui: false, }); From 4c6dfeb38c5a4b070c3e56052ff78262357b2f9e Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 6 Sep 2022 17:25:24 +0100 Subject: [PATCH 0077/1302] refactor: fix todo --- packages/core/src/graph/adjacencyList.ts | 2 +- packages/core/src/graph/visit.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/core/src/graph/adjacencyList.ts b/packages/core/src/graph/adjacencyList.ts index f6f1aee9f4..880082791b 100644 --- a/packages/core/src/graph/adjacencyList.ts +++ b/packages/core/src/graph/adjacencyList.ts @@ -58,7 +58,7 @@ export function topologicalSort(adjacencyList: AdjacencyList): number[] { } const ts = new TopologicalSort(dag); - const order = ts.order(); + const order = ts.order().filter((elem) => vertexes.has(elem)); return order; } diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 36ae24c79e..6246ac9b9d 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -21,8 +21,7 @@ export async function visit( const vertex = executionGraph.vertexes.get(vertexId); if (vertex === undefined) { - // TODO: this shouldn't happen, so lets figure that out - continue; + throw new Error(`Could not get vertex ${vertexId}`); } const vertexVisitResult = await vistitorAction( From eab9321c1adecaa913c0440cac188ccf512f9653 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 8 Sep 2022 12:37:22 +0100 Subject: [PATCH 0078/1302] refactor: fix up todos --- packages/core/NOTES.md | 14 +++++++------- packages/core/src/recipe/RecipeGraphBuilder.ts | 4 +--- packages/core/src/utils/collectLibrariesAndLink.ts | 1 - 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/core/NOTES.md b/packages/core/NOTES.md index 8c0099997d..01e099db50 100644 --- a/packages/core/NOTES.md +++ b/packages/core/NOTES.md @@ -1,9 +1,9 @@ # TODO -1. Deal with services setup? How is this affecting the journaling folder -2. Validation tests -3. Execution tests -4. Remove old files -5. Check code level todos -6. Change steps as a function name -7. add docs and images +1. [ ] Deal with services setup? How is this affecting the journaling folder +2. [x] Validation tests +3. [x] Execution tests +4. [x] Remove old files +5. [x] Check code level todos +6. [ ] Change steps as a function name +7. [ ] add docs and images diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 1da770ec44..a2855bdd42 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -306,9 +306,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { (v): RecipeFuture => ({ vertexId: v.id, label: v.label, - type: "contract", // TODO: this is a hack, lets add a future type for this sort of ellision - subtype: "artifact", - artifact: {} as any, + type: "virtual", _future: true, }) ); diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts index 6c7f225a3b..fde69ceb6d 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -128,7 +128,6 @@ Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hard function linkBytecode(artifact: Artifact, libraries: Link[]): string { let bytecode = artifact.bytecode; - // TODO: measure performance impact for (const { sourceName, libraryName, address } of libraries) { const linkReferences = artifact.linkReferences[sourceName][libraryName]; for (const { start, length } of linkReferences) { From 8b6d74990f4150daf6c5f51d32ba20bc7aafe347 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 8 Sep 2022 12:45:51 +0100 Subject: [PATCH 0079/1302] refactor: change steps name to recipeAction --- packages/core/NOTES.md | 2 +- packages/core/src/process/generateRecipeGraphFrom.ts | 2 +- packages/core/src/recipe/RecipeGraphBuilder.ts | 2 +- packages/core/src/recipe/buildRecipe.ts | 2 +- packages/core/src/types/recipeGraph.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/core/NOTES.md b/packages/core/NOTES.md index 01e099db50..460e657e09 100644 --- a/packages/core/NOTES.md +++ b/packages/core/NOTES.md @@ -5,5 +5,5 @@ 3. [x] Execution tests 4. [x] Remove old files 5. [x] Check code level todos -6. [ ] Change steps as a function name +6. [x] Change steps as a function name 7. [ ] add docs and images diff --git a/packages/core/src/process/generateRecipeGraphFrom.ts b/packages/core/src/process/generateRecipeGraphFrom.ts index afd680b3a7..aed3db6587 100644 --- a/packages/core/src/process/generateRecipeGraphFrom.ts +++ b/packages/core/src/process/generateRecipeGraphFrom.ts @@ -12,7 +12,7 @@ export function generateRecipeGraphFrom( ): { graph: IRecipeGraph; recipeOutputs: FutureDict } { const graphBuilder = new RecipeGraphBuilder(builderOptions); - const recipeOutputs = recipe.steps(graphBuilder); + const recipeOutputs = recipe.recipeAction(graphBuilder); return { graph: graphBuilder.graph, recipeOutputs }; } diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index a2855bdd42..4ec5d22832 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -281,7 +281,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { this.graph.registeredParameters[scopeLabel] = options.parameters; } - const result = recipe.steps(this); + const result = recipe.recipeAction(this); const virtualVertex = this._createRecipeVirtualVertex(label); diff --git a/packages/core/src/recipe/buildRecipe.ts b/packages/core/src/recipe/buildRecipe.ts index a75330d08c..8a642ca618 100644 --- a/packages/core/src/recipe/buildRecipe.ts +++ b/packages/core/src/recipe/buildRecipe.ts @@ -7,6 +7,6 @@ export function buildRecipe( ): Recipe { return { name: recipeName, - steps: recipeFunc, + recipeAction: recipeFunc, }; } diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index 8a292c25b6..bd8d23d8c6 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -163,7 +163,7 @@ export interface IRecipeGraphBuilder { export interface Recipe { name: string; - steps: (builder: IRecipeGraphBuilder) => FutureDict; + recipeAction: (builder: IRecipeGraphBuilder) => FutureDict; } export interface RecipeGraphBuilderOptions { From 66dcb3481f1647518311a1f19d5f2f71648af5f4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 9 Sep 2022 16:54:59 +0100 Subject: [PATCH 0080/1302] refactor: wire file journal through --- NOTES.md | 14 ++++++++++ packages/core/NOTES.md | 9 ------- packages/core/src/Ignition.ts | 27 ++++++++++++++++--- packages/core/src/execution/execute.ts | 4 ++- .../transformRecipeGraphToExecutionGraph.ts | 15 +---------- packages/core/test/execution.ts | 18 +++++++++++-- .../hardhat-plugin/src/ignition-wrapper.ts | 5 ++-- packages/hardhat-plugin/src/index.ts | 2 +- 8 files changed, 60 insertions(+), 34 deletions(-) create mode 100644 NOTES.md delete mode 100644 packages/core/NOTES.md diff --git a/NOTES.md b/NOTES.md new file mode 100644 index 0000000000..d4f587752b --- /dev/null +++ b/NOTES.md @@ -0,0 +1,14 @@ +# TODO + +1. [x] Deal with services setup? How is this affecting the journaling folder +2. [x] Validation tests +3. [x] Execution tests +4. [x] Remove old files +5. [x] Check code level todos +6. [x] Change steps as a function name +7. [ ] add docs and images + +## Questions + +* We execute a deployed contract vertex, but it immediately returns. Should it be in the graph? Do we want to do something here? +* Should we have a separate pass to check what in the execution graph has already been deployed? diff --git a/packages/core/NOTES.md b/packages/core/NOTES.md deleted file mode 100644 index 460e657e09..0000000000 --- a/packages/core/NOTES.md +++ /dev/null @@ -1,9 +0,0 @@ -# TODO - -1. [ ] Deal with services setup? How is this affecting the journaling folder -2. [x] Validation tests -3. [x] Execution tests -4. [x] Remove old files -5. [x] Check code level todos -6. [x] Change steps as a function name -7. [ ] add docs and images diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 1f7fbb37d4..bc1862591b 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,6 +1,7 @@ import setupDebug from "debug"; import { execute } from "./execution/execute"; +import { FileJournal } from "./journal/FileJournal"; import { InMemoryJournal } from "./journal/InMemoryJournal"; import { generateRecipeGraphFrom } from "./process/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "./process/transformRecipeGraphToExecutionGraph"; @@ -44,9 +45,16 @@ export class Ignition { const ui = new UiService({ enabled: options.ui }); + log("Create journal with path '%s'", options.pathToJournal); + + const journal = + options.pathToJournal !== undefined + ? new FileJournal(options.pathToJournal) + : new InMemoryJournal(); + const serviceOptions = { providers: this._providers, - journal: new InMemoryJournal(), + journal, txPollingInterval: 300, }; @@ -57,21 +65,26 @@ export class Ignition { ); const chainId = await this._getChainId(); + log("ChainId resolved as '%s'", chainId); + + log("Generate recipe graph from recipe"); const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( recipe, { chainId } ); + log("Validate recipe graph"); const validationResult = await validateRecipeGraph(recipeGraph, services); if (validationResult._kind === "failure") { return [validationResult, {}]; } + log("Transform recipe graph to execution graph"); const transformResult = await transformRecipeGraphToExecutionGraph( recipeGraph, - serviceOptions + services ); if (transformResult._kind === "failure") { @@ -80,7 +93,13 @@ export class Ignition { const { executionGraph } = transformResult; - const executionResult = await execute(executionGraph, services, ui); + log("Execute based on execution graph"); + const executionResult = await execute( + executionGraph, + services, + ui, + this._recipesResults + ); if (executionResult._kind === "failure") { return [executionResult, {}]; @@ -121,7 +140,7 @@ export class Ignition { const transformResult = await transformRecipeGraphToExecutionGraph( recipeGraph, - serviceOptions + services ); if (transformResult._kind === "failure") { diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 14cdf2e2e8..f3d388cd37 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,6 +1,7 @@ import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; import { Services } from "../services/types"; +import { IgnitionRecipesResults } from "../types/deployment"; import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; import { VisitResult } from "../types/graph"; import { DeploymentState } from "../ui/types"; @@ -11,7 +12,8 @@ import { executionDispatch } from "./dispatch/executionDispatch"; export async function execute( executionGraph: IExecutionGraph, services: Services, - ui: UiService + ui: UiService, + _recipeResults: IgnitionRecipesResults ): Promise { const orderedVertexIds = getSortedVertexIdsFrom(executionGraph); diff --git a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts index 8d20984531..79a0da6c6f 100644 --- a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts @@ -1,7 +1,5 @@ import { ExecutionGraph } from "../execution/ExecutionGraph"; import { clone } from "../graph/adjacencyList"; -import { Journal } from "../journal/types"; -import { createServices } from "../services/createServices"; import { Services } from "../services/types"; import { ContractCall, @@ -13,7 +11,6 @@ import { } from "../types/executionGraph"; import { RecipeFuture } from "../types/future"; import { Artifact } from "../types/hardhat"; -import { Providers } from "../types/providers"; import { ArtifactContractRecipeVertex, ArtifactLibraryRecipeVertex, @@ -45,18 +42,8 @@ interface TransformContext { export async function transformRecipeGraphToExecutionGraph( recipeGraph: IRecipeGraph, - servicesOptions: { - providers: Providers; - journal: Journal; - txPollingInterval: number; - } + services: Services ): Promise { - const services = createServices( - "recipeIdTRANSFORM", - "recipeIdTRANSFORM", - servicesOptions - ); - const reducedRecipeGraph = reduceRecipeGraphByEliminatingVirtualVertexes(recipeGraph); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 0a023118d4..1b5bbb9578 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -285,7 +285,14 @@ async function assertExecuteSingleVertex( render: () => {}, } as any; - return execute(executionGraph, mockServices, mockUiService); + const mockRecipeResults = {} as any; + + return execute( + executionGraph, + mockServices, + mockUiService, + mockRecipeResults + ); } async function assertDependentVertex( @@ -306,5 +313,12 @@ async function assertDependentVertex( render: () => {}, } as any; - return execute(executionGraph, mockServices, mockUiService); + const mockRecipeResults = {} as any; + + return execute( + executionGraph, + mockServices, + mockUiService, + mockRecipeResults + ); } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index b2c4d91e9a..779be16a46 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -57,9 +57,8 @@ export class IgnitionWrapper { } const [deploymentResult] = await this._ignition.deploy(recipe, { - ui: deployParams?.ui ?? true, - pathToJournal: undefined, - txPollingInterval: 300, + ...this._deployOptions, + ui: true, }); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index b3c417d851..daf1175bac 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -95,7 +95,7 @@ extendEnvironment((hre) => { hre.ethers, isHardhatNetwork, hre.config.paths, - { pathToJournal, txPollingInterval, ui: true } + { pathToJournal, txPollingInterval, ui: false } ); }); }); From dab0099c01f57bac169424bcd4b8505bd84018b8 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Sep 2022 00:49:26 -0400 Subject: [PATCH 0081/1302] enabled import path aliases in core --- config/eslint/{eslintrc.js => .eslintrc.js} | 15 + packages/core/.eslintrc.js | 5 +- packages/core/.mocharc.json | 2 +- packages/core/package.json | 6 +- packages/core/post-build.js | 104 +++ packages/core/src/Ignition.ts | 32 +- packages/core/src/execution/ExecutionGraph.ts | 19 +- .../execution/dispatch/executeContractCall.ts | 6 +- .../dispatch/executeContractDeploy.ts | 6 +- .../dispatch/executeDeployedContract.ts | 6 +- .../dispatch/executeLibraryDeploy.ts | 6 +- .../execution/dispatch/executionDispatch.ts | 6 +- packages/core/src/execution/dispatch/utils.ts | 4 +- packages/core/src/execution/execute.ts | 16 +- packages/core/src/graph/Graph.ts | 14 +- packages/core/src/graph/adjacencyList.ts | 16 +- packages/core/src/graph/utils.ts | 2 +- packages/core/src/graph/visit.ts | 2 +- packages/core/src/index.ts | 14 +- .../src/process/generateRecipeGraphFrom.ts | 6 +- ...RecipeGraphByEliminatingVirtualVertexes.ts | 6 +- .../transformRecipeGraphToExecutionGraph.ts | 16 +- packages/core/src/recipe/RecipeGraph.ts | 19 +- .../core/src/recipe/RecipeGraphBuilder.ts | 10 +- packages/core/src/recipe/buildRecipe.ts | 4 +- .../core/src/services/ArtifactsService.ts | 4 +- packages/core/src/services/ConfigService.ts | 4 +- .../core/src/services/ContractsService.ts | 10 +- .../core/src/services/TransactionsService.ts | 2 +- packages/core/src/services/createServices.ts | 6 +- packages/core/src/types/executionGraph.ts | 2 +- packages/core/src/types/graph.ts | 1 + packages/core/src/types/recipeGraph.ts | 2 +- packages/core/src/types/serialization.ts | 2 +- packages/core/src/ui/types.ts | 2 +- .../core/src/utils/collectLibrariesAndLink.ts | 2 +- packages/core/src/utils/guards.ts | 6 +- packages/core/src/utils/serialize.ts | 2 +- packages/core/src/utils/tx-sender.ts | 4 +- .../dispatch/validateArtifactContract.ts | 8 +- .../dispatch/validateArtifactLibrary.ts | 8 +- .../src/validation/dispatch/validateCall.ts | 8 +- .../dispatch/validateDeployedContract.ts | 6 +- .../dispatch/validateHardhatContract.ts | 6 +- .../dispatch/validateHardhatLibrary.ts | 6 +- .../validation/dispatch/validateVirtual.ts | 6 +- .../validation/dispatch/validationDispatch.ts | 6 +- .../src/validation/validateRecipeGraph.ts | 10 +- packages/core/test/collectLibrariesAndLink.ts | 2 +- packages/core/test/execution.ts | 10 +- packages/core/test/graph/adjacencyList.ts | 2 +- packages/core/test/graph/helpers.ts | 2 +- packages/core/test/helpers.ts | 14 +- packages/core/test/recipes.ts | 16 +- packages/core/test/tx-sender.ts | 10 +- packages/core/test/validation.ts | 10 +- packages/core/tsconfig.json | 6 +- packages/hardhat-plugin/.eslintrc.js | 4 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +- yarn.lock | 751 ++++-------------- 60 files changed, 472 insertions(+), 818 deletions(-) rename config/eslint/{eslintrc.js => .eslintrc.js} (94%) create mode 100644 packages/core/post-build.js diff --git a/config/eslint/eslintrc.js b/config/eslint/.eslintrc.js similarity index 94% rename from config/eslint/eslintrc.js rename to config/eslint/.eslintrc.js index e113bb5a20..1e49c764cb 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/.eslintrc.js @@ -1,4 +1,14 @@ module.exports = { + settings: { + "import/resolver": { + typescript: { + project: [ + "packages/core/tsconfig.json", + "packages/hardhat-plugin/tsconfig.json", + ], + }, + }, + }, env: { browser: false, es6: true, @@ -6,6 +16,10 @@ module.exports = { }, extends: ["plugin:prettier/recommended"], parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + tsConfigRootDir: "./", + }, plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], rules: { "import/no-unused-modules": [ @@ -163,6 +177,7 @@ module.exports = { groups: [ "object", ["builtin", "external"], + "internal", "parent", "sibling", "index", diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 95944742b2..ac5d46159f 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -1,5 +1,7 @@ +const { resolve } = require("path"); + module.exports = { - extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + extends: [resolve(__dirname, "../../config/eslint/.eslintrc.js")], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", @@ -7,4 +9,5 @@ module.exports = { rules: { "no-console": "error", }, + ignorePatterns: ["post-build.js"], }; diff --git a/packages/core/.mocharc.json b/packages/core/.mocharc.json index 5a0ec255ae..814a4a9f69 100644 --- a/packages/core/.mocharc.json +++ b/packages/core/.mocharc.json @@ -1,4 +1,4 @@ { - "require": "ts-node/register/transpile-only", + "require": ["ts-node/register/transpile-only", "tsconfig-paths/register"], "file": "./test/setup.ts" } diff --git a/packages/core/package.json b/packages/core/package.json index f763c20e7d..f4a494f6c8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -5,7 +5,7 @@ "author": "Nomic Foundation", "main": "dist/src/index.js", "scripts": { - "build": "tsc", + "build": "tsc && node ./post-build.js", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", @@ -32,9 +32,11 @@ "chai-as-promised": "7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.1", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", + "fast-glob": "^3.2.12", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", @@ -42,6 +44,7 @@ "sinon": "^12.0.1", "tmp": "^0.2.1", "ts-node": "10.8.1", + "tsconfig-paths": "^4.1.0", "typescript": "^4.7.4" }, "dependencies": { @@ -52,7 +55,6 @@ "ink": "^3.2.0", "ink-spinner": "^4.0.3", "js-graph-algorithms": "1.0.18", - "mermaid": "^9.1.6", "react": "^17.0.2" } } diff --git a/packages/core/post-build.js b/packages/core/post-build.js new file mode 100644 index 0000000000..b76b149022 --- /dev/null +++ b/packages/core/post-build.js @@ -0,0 +1,104 @@ +const fs = require("fs-extra"); +const glob = require("fast-glob"); +const { resolve, dirname, relative } = require("path"); + +const dir = fs.readdirSync("./src"); + +const pwd = process.cwd(); +const configFile = resolve(pwd, "tsconfig.json"); +const { + compilerOptions: { baseUrl }, +} = require(configFile); +const srcRoot = resolve("./src"); + +const configDir = dirname(configFile); + +const basePath = resolve(configDir, baseUrl); +const outPath = resolve("./dist/src"); + +const outFileToSrcFile = (x) => resolve(srcRoot, relative(outPath, x)); + +const toRelative = (from, to) => { + const rel = relative(from, to); + return (rel.startsWith(".") ? rel : `./${rel}`).replace(/\\/g, "/"); +}; + +const exts = [".js", ".jsx", ".ts", ".tsx", ".d.ts", ".json"]; + +const aliases = []; + +for (let i = 0; i < dir.length; i++) { + const item = dir[i]; + if (/\.ts|\.js/.test(item)) continue; + aliases.push({ + prefix: `${item}/`, + path: resolve(basePath, item), + name: item, + }); +} + +const absToRel = (modulePath, outFile) => { + const len = aliases.length; + for (let i = 0; i < len; i++) { + const { prefix, path } = aliases[i]; + + if (modulePath.startsWith(prefix)) { + const modulePathRel = modulePath.substring(prefix.length); + const srcFile = outFileToSrcFile(outFile); + const moduleSrc = resolve(path, modulePathRel); + if ( + fs.existsSync(moduleSrc) || + exts.some((ext) => fs.existsSync(moduleSrc + ext)) + ) { + const rel = toRelative(dirname(srcFile), moduleSrc); + return rel; + } + } + } +}; + +const replaceImportStatement = (orig, matched, outFile) => { + const index = orig.indexOf(matched); + + return ( + orig.substring(0, index) + + absToRel(matched, outFile) + + orig.substring(index + matched.length) + ); +}; + +const aliasNames = aliases.map(({ name }) => name).join("|"); +const requireRegex = new RegExp( + `(?:import|require)\\(['"]((${aliasNames})[^'"]*)['"]\\).*`, + "g" +); +const importRegex = new RegExp( + `(?:import|from) ['"]((${aliasNames})[^'"]*)['"].*`, + "g" +); + +const replaceAlias = (text, outFile) => + text + .replace(requireRegex, (orig, matched) => + replaceImportStatement(orig, matched, outFile) + ) + .replace(importRegex, (orig, matched) => + replaceImportStatement(orig, matched, outFile) + ); + +const files = glob + .sync(`${outPath}/**/*.{js,jsx,ts,tsx}`, { + dot: true, + onlyFiles: true, + }) + .map((x) => resolve(x)); + +const len = files.length; +for (let i = 0; i < len; i++) { + const file = files[i]; + const text = fs.readFileSync(file, "utf8"); + const newText = replaceAlias(text, file); + if (text !== newText) { + fs.writeFileSync(file, newText, "utf8"); + } +} diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index bc1862591b..49c545d3d1 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,21 +1,21 @@ import setupDebug from "debug"; -import { execute } from "./execution/execute"; -import { FileJournal } from "./journal/FileJournal"; -import { InMemoryJournal } from "./journal/InMemoryJournal"; -import { generateRecipeGraphFrom } from "./process/generateRecipeGraphFrom"; -import { transformRecipeGraphToExecutionGraph } from "./process/transformRecipeGraphToExecutionGraph"; -import { createServices } from "./services/createServices"; -import { Services } from "./services/types"; -import { DeploymentResult, IgnitionRecipesResults } from "./types/deployment"; -import { DependableFuture, FutureDict } from "./types/future"; -import { Providers } from "./types/providers"; -import { Recipe } from "./types/recipeGraph"; -import { SerializedDeploymentResult } from "./types/serialization"; -import { UiService } from "./ui/ui-service"; -import { isDependable } from "./utils/guards"; -import { serializeFutureOutput } from "./utils/serialize"; -import { validateRecipeGraph } from "./validation/validateRecipeGraph"; +import { execute } from "execution/execute"; +import { FileJournal } from "journal/FileJournal"; +import { InMemoryJournal } from "journal/InMemoryJournal"; +import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; +import { transformRecipeGraphToExecutionGraph } from "process/transformRecipeGraphToExecutionGraph"; +import { createServices } from "services/createServices"; +import { Services } from "services/types"; +import { DeploymentResult, IgnitionRecipesResults } from "types/deployment"; +import { DependableFuture, FutureDict } from "types/future"; +import { Providers } from "types/providers"; +import { Recipe } from "types/recipeGraph"; +import { SerializedDeploymentResult } from "types/serialization"; +import { UiService } from "ui/ui-service"; +import { isDependable } from "utils/guards"; +import { serializeFutureOutput } from "utils/serialize"; +import { validateRecipeGraph } from "validation/validateRecipeGraph"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/execution/ExecutionGraph.ts b/packages/core/src/execution/ExecutionGraph.ts index 6868e3fc2a..ab6719bba3 100644 --- a/packages/core/src/execution/ExecutionGraph.ts +++ b/packages/core/src/execution/ExecutionGraph.ts @@ -1,17 +1,4 @@ -import { Graph } from "../graph/Graph"; -import { getEdges } from "../graph/adjacencyList"; -import { ExecutionVertex } from "../types/executionGraph"; +import { Graph } from "graph/Graph"; +import { ExecutionVertex } from "types/executionGraph"; -export class ExecutionGraph extends Graph { - public toMermaid(): string { - const vertexes = [...this.vertexes.values()] - .map((v) => `e${v.id}[${v.label}]`) - .join("\n"); - - const edges = getEdges(this.adjacencyList) - .map(({ from, to }) => `e${from} --> e${to}`) - .join("\n"); - - return `flowchart TD\n${vertexes}\n${edges}`; - } -} +export class ExecutionGraph extends Graph {} diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index d2db6228f5..e12917bf47 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { ContractCall } from "../../types/executionGraph"; -import { VertexVisitResult } from "../../types/graph"; +import { Services } from "services/types"; +import { ContractCall } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 5bfb449d53..45e5489631 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { ContractDeploy } from "../../types/executionGraph"; -import { VertexVisitResult } from "../../types/graph"; +import { Services } from "services/types"; +import { ContractDeploy } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index 0bbf8d18a5..337ea337d1 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { DeployedContract } from "../../types/executionGraph"; -import { VertexVisitResult } from "../../types/graph"; +import { Services } from "services/types"; +import { DeployedContract } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; export async function executeDeployedContract( { label, address, abi }: DeployedContract, diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index e45389c8a8..810f1f114e 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { LibraryDeploy } from "../../types/executionGraph"; -import { VertexVisitResult } from "../../types/graph"; +import { Services } from "services/types"; +import { LibraryDeploy } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 2e0668215d..1f8775f5d5 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { ExecutionVertex } from "../../types/executionGraph"; -import { VertexVisitResult } from "../../types/graph"; +import { Services } from "services/types"; +import { ExecutionVertex } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; import { executeContractCall } from "./executeContractCall"; import { executeContractDeploy } from "./executeContractDeploy"; diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index 4e3a5f4d2f..ce0c112733 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,5 +1,5 @@ -import { ArgValue } from "../../types/executionGraph"; -import { isDependable } from "../../utils/guards"; +import { ArgValue } from "types/executionGraph"; +import { isDependable } from "utils/guards"; export function toAddress(v: any) { if (typeof v === "object" && "address" in v) { diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index f3d388cd37..2248f63a5b 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,11 +1,11 @@ -import { getSortedVertexIdsFrom } from "../graph/utils"; -import { visit } from "../graph/visit"; -import { Services } from "../services/types"; -import { IgnitionRecipesResults } from "../types/deployment"; -import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; -import { VisitResult } from "../types/graph"; -import { DeploymentState } from "../ui/types"; -import { UiService } from "../ui/ui-service"; +import { getSortedVertexIdsFrom } from "graph/utils"; +import { visit } from "graph/visit"; +import { Services } from "services/types"; +import { IgnitionRecipesResults } from "types/deployment"; +import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; +import { VisitResult } from "types/graph"; +import { DeploymentState } from "ui/types"; +import { UiService } from "ui/ui-service"; import { executionDispatch } from "./dispatch/executionDispatch"; diff --git a/packages/core/src/graph/Graph.ts b/packages/core/src/graph/Graph.ts index 2f3fc3b6c8..8fdd81679a 100644 --- a/packages/core/src/graph/Graph.ts +++ b/packages/core/src/graph/Graph.ts @@ -1,4 +1,4 @@ -import { AdjacencyList, IGraph } from "../types/graph"; +import { AdjacencyList, IGraph } from "types/graph"; import { constructEmptyAdjacencyList } from "./adjacencyList"; @@ -10,4 +10,16 @@ export class Graph implements IGraph { this.adjacencyList = constructEmptyAdjacencyList(); this.vertexes = new Map(); } + + public getEdges() { + const edges: Array<{ from: number; to: number }> = []; + + for (const [from, edgeList] of this.adjacencyList.entries()) { + for (const to of edgeList.values()) { + edges.push({ from, to }); + } + } + + return edges; + } } diff --git a/packages/core/src/graph/adjacencyList.ts b/packages/core/src/graph/adjacencyList.ts index 880082791b..72c18b4430 100644 --- a/packages/core/src/graph/adjacencyList.ts +++ b/packages/core/src/graph/adjacencyList.ts @@ -1,6 +1,6 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; -import { AdjacencyList } from "../types/graph"; +import { AdjacencyList } from "types/graph"; export function constructEmptyAdjacencyList(): AdjacencyList { return new Map>(); @@ -96,17 +96,3 @@ export function eliminate( return updatedList; } - -export function getEdges( - adjacencyList: AdjacencyList -): Array<{ from: number; to: number }> { - const edges: Array<{ from: number; to: number }> = []; - - for (const [from, edgeList] of adjacencyList.entries()) { - for (const to of edgeList.values()) { - edges.push({ from, to }); - } - } - - return edges; -} diff --git a/packages/core/src/graph/utils.ts b/packages/core/src/graph/utils.ts index 9bef2aa9dc..ef381d1017 100644 --- a/packages/core/src/graph/utils.ts +++ b/packages/core/src/graph/utils.ts @@ -1,4 +1,4 @@ -import { IGraph } from "../types/graph"; +import { IGraph } from "types/graph"; import { topologicalSort } from "./adjacencyList"; diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 6246ac9b9d..0760987aa3 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -1,4 +1,4 @@ -import { IGraph, VertexVisitResult, VisitResult } from "../types/graph"; +import { IGraph, VertexVisitResult, VisitResult } from "types/graph"; export async function visit( phase: "Execution" | "Validation", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 0b9a7014d9..22965da882 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,24 +2,24 @@ export type { SerializedDeploymentResult, SerializedRecipeResult, SerializedFutureResult, -} from "./types/serialization"; +} from "types/serialization"; -export type { Services } from "./services/types"; +export type { Services } from "services/types"; export type { Providers, ConfigProvider, HasParamResult, -} from "./types/providers"; +} from "types/providers"; -export type { DeploymentResult } from "./types/deployment"; +export type { DeploymentResult } from "types/deployment"; export { Ignition, IgnitionDeployOptions } from "./Ignition"; -export { buildRecipe } from "./recipe/buildRecipe"; +export { buildRecipe } from "recipe/buildRecipe"; export type { Recipe, ExternalParamValue, IRecipeGraphBuilder, -} from "./types/recipeGraph"; -export type { FutureDict } from "./types/future"; +} from "types/recipeGraph"; +export type { FutureDict } from "types/future"; diff --git a/packages/core/src/process/generateRecipeGraphFrom.ts b/packages/core/src/process/generateRecipeGraphFrom.ts index aed3db6587..1e33c22984 100644 --- a/packages/core/src/process/generateRecipeGraphFrom.ts +++ b/packages/core/src/process/generateRecipeGraphFrom.ts @@ -1,10 +1,10 @@ -import { RecipeGraphBuilder } from "../recipe/RecipeGraphBuilder"; -import { FutureDict } from "../types/future"; +import { RecipeGraphBuilder } from "recipe/RecipeGraphBuilder"; +import { FutureDict } from "types/future"; import type { RecipeGraphBuilderOptions, Recipe, IRecipeGraph, -} from "../types/recipeGraph"; +} from "types/recipeGraph"; export function generateRecipeGraphFrom( recipe: Recipe, diff --git a/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts index 5d0e8981c6..f9dd506a83 100644 --- a/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts @@ -1,6 +1,6 @@ -import { eliminate } from "../graph/adjacencyList"; -import { RecipeGraph } from "../recipe/RecipeGraph"; -import { RecipeVertex } from "../types/recipeGraph"; +import { eliminate } from "graph/adjacencyList"; +import { RecipeGraph } from "recipe/RecipeGraph"; +import { RecipeVertex } from "types/recipeGraph"; /** * Recipe graphs can have virtual vertex that represent the diff --git a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts index 79a0da6c6f..084be9bf8d 100644 --- a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts @@ -1,6 +1,6 @@ -import { ExecutionGraph } from "../execution/ExecutionGraph"; -import { clone } from "../graph/adjacencyList"; -import { Services } from "../services/types"; +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { clone } from "graph/adjacencyList"; +import { Services } from "services/types"; import { ContractCall, ContractDeploy, @@ -8,9 +8,9 @@ import { ExecutionVertex, IExecutionGraph, LibraryDeploy, -} from "../types/executionGraph"; -import { RecipeFuture } from "../types/future"; -import { Artifact } from "../types/hardhat"; +} from "types/executionGraph"; +import { RecipeFuture } from "types/future"; +import { Artifact } from "types/hardhat"; import { ArtifactContractRecipeVertex, ArtifactLibraryRecipeVertex, @@ -20,8 +20,8 @@ import { HardhatLibraryRecipeVertex, IRecipeGraph, RecipeVertex, -} from "../types/recipeGraph"; -import { isFuture } from "../utils/guards"; +} from "types/recipeGraph"; +import { isFuture } from "utils/guards"; import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./reduceRecipeGraphByEliminatingVirtualVertexes"; diff --git a/packages/core/src/recipe/RecipeGraph.ts b/packages/core/src/recipe/RecipeGraph.ts index 38f448175d..6ca67e5565 100644 --- a/packages/core/src/recipe/RecipeGraph.ts +++ b/packages/core/src/recipe/RecipeGraph.ts @@ -1,7 +1,6 @@ -import { Graph } from "../graph/Graph"; -import { getEdges } from "../graph/adjacencyList"; -import { RecipeFuture } from "../types/future"; -import { RecipeVertex } from "../types/recipeGraph"; +import { Graph } from "graph/Graph"; +import { RecipeFuture } from "types/future"; +import { RecipeVertex } from "types/recipeGraph"; export class RecipeGraph extends Graph { public registeredParameters: { @@ -13,16 +12,4 @@ export class RecipeGraph extends Graph { this.registeredParameters = {}; } - - public toMermaid(): string { - const vertexes = [...this.vertexes.values()] - .map((v) => `r${v.id}[${v.label}]`) - .join("\n"); - - const edges = getEdges(this.adjacencyList) - .map(({ from, to }) => `r${from} --> r${to}`) - .join("\n"); - - return `flowchart TD\n${vertexes}\n${edges}`; - } } diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 4ec5d22832..a693b56cd5 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -1,4 +1,4 @@ -import { addEdge, ensureVertex } from "../graph/adjacencyList"; +import { addEdge, ensureVertex } from "graph/adjacencyList"; import type { RecipeFuture, HardhatContract, @@ -13,8 +13,8 @@ import type { FutureDict, CallableFuture, Virtual, -} from "../types/future"; -import type { Artifact } from "../types/hardhat"; +} from "types/future"; +import type { Artifact } from "types/hardhat"; import { ContractOptions, IRecipeGraph, @@ -23,13 +23,13 @@ import { RecipeGraphBuilderOptions, RecipeVertex, UseRecipeOptions, -} from "../types/recipeGraph"; +} from "types/recipeGraph"; import { isArtifact, isCallable, isDependable, isParameter, -} from "../utils/guards"; +} from "utils/guards"; import { RecipeGraph } from "./RecipeGraph"; import { ScopeStack } from "./ScopeStack"; diff --git a/packages/core/src/recipe/buildRecipe.ts b/packages/core/src/recipe/buildRecipe.ts index 8a642ca618..d57986b044 100644 --- a/packages/core/src/recipe/buildRecipe.ts +++ b/packages/core/src/recipe/buildRecipe.ts @@ -1,5 +1,5 @@ -import type { FutureDict } from "../types/future"; -import type { IRecipeGraphBuilder, Recipe } from "../types/recipeGraph"; +import type { FutureDict } from "types/future"; +import type { IRecipeGraphBuilder, Recipe } from "types/recipeGraph"; export function buildRecipe( recipeName: string, diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts index b11b47f48f..f41bd5bf09 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/services/ArtifactsService.ts @@ -1,5 +1,5 @@ -import { Artifact } from "../types/hardhat"; -import { Providers } from "../types/providers"; +import { Artifact } from "types/hardhat"; +import { Providers } from "types/providers"; export interface IArtifactsService { getArtifact(name: string): Promise; diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index f03be81b74..175a9194b1 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,5 +1,5 @@ -import { HasParamResult, Providers } from "../types/providers"; -import { ExternalParamValue } from "../types/recipeGraph"; +import { HasParamResult, Providers } from "types/providers"; +import { ExternalParamValue } from "types/recipeGraph"; export interface IConfigService { getParam(paramName: string): Promise; diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index cc4a269ca9..bf8a72ce77 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,11 +1,11 @@ import setupDebug from "debug"; import { ethers, Contract, ContractFactory } from "ethers"; -import { Artifact } from "../types/hardhat"; -import { IgnitionSigner, Providers } from "../types/providers"; -import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; -import { sleep } from "../utils/sleep"; -import { TxSender } from "../utils/tx-sender"; +import { Artifact } from "types/hardhat"; +import { IgnitionSigner, Providers } from "types/providers"; +import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; +import { sleep } from "utils/sleep"; +import { TxSender } from "utils/tx-sender"; import type { TransactionOptions } from "./types"; diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index f180409321..74f19f4907 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Providers } from "../types/providers"; +import { Providers } from "types/providers"; export interface ITransactionsService { wait(txHash: string): Promise; diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index f1e7588710..0ef51389d3 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,6 +1,6 @@ -import { Journal } from "../journal/types"; -import { Providers } from "../types/providers"; -import { TxSender } from "../utils/tx-sender"; +import { Journal } from "journal/types"; +import { Providers } from "types/providers"; +import { TxSender } from "utils/tx-sender"; import { ArtifactsService } from "./ArtifactsService"; import { ConfigService } from "./ConfigService"; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index b1374b0950..b4baf7dfdf 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -6,7 +6,7 @@ import { LibraryMap } from "./recipeGraph"; export interface IExecutionGraph { adjacencyList: AdjacencyList; vertexes: Map; - toMermaid(): string; + getEdges(): Array<{ from: number; to: number }>; } export type ArgValue = boolean | string | number | RecipeFuture; diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index eaf8aa9fd0..e178709505 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -8,6 +8,7 @@ export type AdjacencyList = Map>; export interface IGraph { adjacencyList: AdjacencyList; vertexes: Map; + getEdges(): Array<{ from: number; to: number }>; } export type VertexVisitResult = diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index bd8d23d8c6..3b072008b3 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -21,7 +21,7 @@ export interface IRecipeGraph { registeredParameters: { [key: string]: { [key: string]: string | number | RecipeFuture }; }; - toMermaid(): string; + getEdges(): Array<{ from: number; to: number }>; } export interface LibraryMap { diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index ec35853e31..be2844b8fb 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -1,4 +1,4 @@ -import { serializeFutureOutput } from "../utils/serialize"; +import { serializeFutureOutput } from "utils/serialize"; export type SerializedRecipeResult = Record; export type SerializedDeploymentResult = Record; diff --git a/packages/core/src/ui/types.ts b/packages/core/src/ui/types.ts index 25f589b07b..f3b29b4c5b 100644 --- a/packages/core/src/ui/types.ts +++ b/packages/core/src/ui/types.ts @@ -1,4 +1,4 @@ -import { ExecutionVertex } from "../types/executionGraph"; +import { ExecutionVertex } from "types/executionGraph"; interface VertexSuccess { status: "success"; diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts index fde69ceb6d..694a0059e2 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { NomicLabsHardhatPluginError } from "hardhat/plugins"; -import { Artifact } from "../types/hardhat"; +import { Artifact } from "types/hardhat"; interface Link { sourceName: string; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 0d39a8f202..b11f39bca6 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -4,8 +4,8 @@ import type { OptionalParameter, RecipeFuture, RequiredParameter, -} from "../types/future"; -import { Artifact } from "../types/hardhat"; +} from "types/future"; +import { Artifact } from "types/hardhat"; import type { RecipeVertex, HardhatContractRecipeVertex, @@ -14,7 +14,7 @@ import type { CallRecipeVertex, HardhatLibraryRecipeVertex, ArtifactLibraryRecipeVertex, -} from "../types/recipeGraph"; +} from "types/recipeGraph"; export function isArtifact(artifact: any): artifact is Artifact { return ( diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index 8a9288c8fb..0ed19b442b 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -1,4 +1,4 @@ -import { FutureOutput } from "../types/serialization"; +import { FutureOutput } from "types/serialization"; export function serializeFutureOutput(x: FutureOutput) { if (typeof x === "string") { diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/utils/tx-sender.ts index f74d69256f..e21547fe53 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -1,8 +1,8 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { Journal } from "../journal/types"; -import { GasProvider, IgnitionSigner } from "../types/providers"; +import { Journal } from "journal/types"; +import { GasProvider, IgnitionSigner } from "types/providers"; /** * Sends, replaces and keeps track of transactions. diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index f1e92f9d71..217948b0f2 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,9 +1,9 @@ import { ethers } from "ethers"; -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { ArtifactContractRecipeVertex } from "../../types/recipeGraph"; -import { isArtifact } from "../../utils/guards"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { ArtifactContractRecipeVertex } from "types/recipeGraph"; +import { isArtifact } from "utils/guards"; export async function validateArtifactContract( vertex: ArtifactContractRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index e650fb7706..c2268c9d08 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,9 +1,9 @@ import { ethers } from "ethers"; -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { ArtifactLibraryRecipeVertex } from "../../types/recipeGraph"; -import { isArtifact } from "../../utils/guards"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { ArtifactLibraryRecipeVertex } from "types/recipeGraph"; +import { isArtifact } from "utils/guards"; export async function validateArtifactLibrary( vertex: ArtifactLibraryRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 18632becf5..31a2f15b53 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,9 +1,9 @@ import { ethers } from "ethers"; -import { Services } from "../../services/types"; -import { CallableFuture } from "../../types/future"; -import { VertexVisitResult } from "../../types/graph"; -import { CallRecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { CallableFuture } from "types/future"; +import { VertexVisitResult } from "types/graph"; +import { CallRecipeVertex } from "types/recipeGraph"; export async function validateCall( vertex: CallRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index c95a72f6de..1fe943e487 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,8 +1,8 @@ import { isAddress } from "@ethersproject/address"; -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { DeployedContractRecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { DeployedContractRecipeVertex } from "types/recipeGraph"; export async function validateDeployedContract( vertex: DeployedContractRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 40a7fd7916..1568958991 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,8 +1,8 @@ import { ethers } from "ethers"; -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { HardhatContractRecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { HardhatContractRecipeVertex } from "types/recipeGraph"; export async function validateHardhatContract( vertex: HardhatContractRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index 5853fce84e..f4f26f015d 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,8 +1,8 @@ import { ethers } from "ethers"; -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { HardhatLibraryRecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { HardhatLibraryRecipeVertex } from "types/recipeGraph"; export async function validateHardhatLibrary( vertex: HardhatLibraryRecipeVertex, diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index ec11626ef5..be0bc0d976 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { RecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { RecipeVertex } from "types/recipeGraph"; export async function validateVirtual( _recipeVertex: RecipeVertex, diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index cf8ce1f79f..8d27dcd81d 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,6 +1,6 @@ -import { Services } from "../../services/types"; -import { VertexVisitResult } from "../../types/graph"; -import { RecipeVertex } from "../../types/recipeGraph"; +import { Services } from "services/types"; +import { VertexVisitResult } from "types/graph"; +import { RecipeVertex } from "types/recipeGraph"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; diff --git a/packages/core/src/validation/validateRecipeGraph.ts b/packages/core/src/validation/validateRecipeGraph.ts index 94a9b19ad3..eb52ae1def 100644 --- a/packages/core/src/validation/validateRecipeGraph.ts +++ b/packages/core/src/validation/validateRecipeGraph.ts @@ -1,8 +1,8 @@ -import { getSortedVertexIdsFrom } from "../graph/utils"; -import { visit } from "../graph/visit"; -import { Services } from "../services/types"; -import { VisitResult } from "../types/graph"; -import { IRecipeGraph } from "../types/recipeGraph"; +import { getSortedVertexIdsFrom } from "graph/utils"; +import { visit } from "graph/visit"; +import { Services } from "services/types"; +import { VisitResult } from "types/graph"; +import { IRecipeGraph } from "types/recipeGraph"; import { validationDispatch } from "./dispatch/validationDispatch"; diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts index 973c0dfc04..d56d7510b7 100644 --- a/packages/core/test/collectLibrariesAndLink.ts +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { expect } from "chai"; -import { collectLibrariesAndLink } from "../src/utils/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 1b5bbb9578..984735b7fc 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -1,11 +1,11 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { ExecutionGraph } from "../src/execution/ExecutionGraph"; -import { execute } from "../src/execution/execute"; -import { Services, TransactionOptions } from "../src/services/types"; -import { ExecutionVertex } from "../src/types/executionGraph"; -import { Artifact } from "../src/types/hardhat"; +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { execute } from "execution/execute"; +import { Services, TransactionOptions } from "services/types"; +import { ExecutionVertex } from "types/executionGraph"; +import { Artifact } from "types/hardhat"; import { buildAdjacencyListFrom } from "./graph/helpers"; import { getMockServices } from "./helpers"; diff --git a/packages/core/test/graph/adjacencyList.ts b/packages/core/test/graph/adjacencyList.ts index bc6a2ce847..e74d68a581 100644 --- a/packages/core/test/graph/adjacencyList.ts +++ b/packages/core/test/graph/adjacencyList.ts @@ -9,7 +9,7 @@ import { topologicalSort, eliminate, ensureVertex, -} from "../../src/graph/adjacencyList"; +} from "graph/adjacencyList"; import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; diff --git a/packages/core/test/graph/helpers.ts b/packages/core/test/graph/helpers.ts index 31abfbd2bc..db723cd4e1 100644 --- a/packages/core/test/graph/helpers.ts +++ b/packages/core/test/graph/helpers.ts @@ -2,7 +2,7 @@ import { addEdge, ensureVertex, constructEmptyAdjacencyList, -} from "../../src/graph/adjacencyList"; +} from "graph/adjacencyList"; export function constructAdjacencyList( edges: Array<{ from: number; to: number }> diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index b26d876fdd..3b3bdc53ca 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; -import { IArtifactsService } from "../src/services/ArtifactsService"; -import { IConfigService } from "../src/services/ConfigService"; -import { IContractsService } from "../src/services/ContractsService"; -import { ITransactionsService } from "../src/services/TransactionsService"; -import { Services, TransactionOptions } from "../src/services/types"; -import { Artifact } from "../src/types/hardhat"; -import { HasParamResult } from "../src/types/providers"; +import { IArtifactsService } from "services/ArtifactsService"; +import { IConfigService } from "services/ConfigService"; +import { IContractsService } from "services/ContractsService"; +import { ITransactionsService } from "services/TransactionsService"; +import { Services, TransactionOptions } from "services/types"; +import { Artifact } from "types/hardhat"; +import { HasParamResult } from "types/providers"; export function getMockServices() { const mockServices: Services = { diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index 1e8dc3b1ea..dd0faae6ee 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -1,24 +1,24 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { getDependenciesFor } from "../src/graph/adjacencyList"; -import { generateRecipeGraphFrom } from "../src/process/generateRecipeGraphFrom"; -import { RecipeGraph } from "../src/recipe/RecipeGraph"; -import { buildRecipe } from "../src/recipe/buildRecipe"; -import { VertexDescriptor } from "../src/types/graph"; -import { Artifact } from "../src/types/hardhat"; +import { getDependenciesFor } from "graph/adjacencyList"; +import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; +import { RecipeGraph } from "recipe/RecipeGraph"; +import { buildRecipe } from "recipe/buildRecipe"; +import { VertexDescriptor } from "types/graph"; +import { Artifact } from "types/hardhat"; import type { IRecipeGraph, IRecipeGraphBuilder, RecipeVertex, -} from "../src/types/recipeGraph"; +} from "types/recipeGraph"; import { isArtifactContract, isCall, isDeployedContract, isHardhatContract, isHardhatLibrary, -} from "../src/utils/guards"; +} from "utils/guards"; describe("Recipes", function () { describe("single contract", () => { diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index db41c523b7..d41d12cacd 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -4,11 +4,11 @@ import { ethers } from "ethers"; import sinon from "sinon"; import tmp from "tmp"; -import { FileJournal } from "../src/journal/FileJournal"; -import { InMemoryJournal } from "../src/journal/InMemoryJournal"; -import { Journal } from "../src/journal/types"; -import { GasProvider, IgnitionSigner } from "../src/types/providers"; -import { TxSender } from "../src/utils/tx-sender"; +import { FileJournal } from "journal/FileJournal"; +import { InMemoryJournal } from "journal/InMemoryJournal"; +import { Journal } from "journal/types"; +import { GasProvider, IgnitionSigner } from "types/providers"; +import { TxSender } from "utils/tx-sender"; class SignerSpy implements IgnitionSigner { private _index = -1; diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 18b29e34db..6feb8a75a2 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,11 +1,11 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { generateRecipeGraphFrom } from "../src/process/generateRecipeGraphFrom"; -import { buildRecipe } from "../src/recipe/buildRecipe"; -import { Artifact } from "../src/types/hardhat"; -import type { IRecipeGraphBuilder } from "../src/types/recipeGraph"; -import { validateRecipeGraph } from "../src/validation/validateRecipeGraph"; +import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; +import { buildRecipe } from "recipe/buildRecipe"; +import { Artifact } from "types/hardhat"; +import type { IRecipeGraphBuilder } from "types/recipeGraph"; +import { validateRecipeGraph } from "validation/validateRecipeGraph"; import { getMockServices } from "./helpers"; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 337a9caae0..2ea9c1b990 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -10,7 +10,11 @@ "sourceMap": true, "strict": true, "esModuleInterop": true, - "jsx": "react-jsx" + "jsx": "react-jsx", + "baseUrl": "src", + "paths": { + "*": ["*"] + } }, "exclude": ["dist", "node_modules"], "include": ["./test", "./src"] diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-plugin/.eslintrc.js index 889740f226..1cd896e0af 100644 --- a/packages/hardhat-plugin/.eslintrc.js +++ b/packages/hardhat-plugin/.eslintrc.js @@ -1,5 +1,7 @@ +const { resolve } = require("path"); + module.exports = { - extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + extends: [resolve(__dirname, "../../config/eslint/.eslintrc.js")], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 779be16a46..e5175a4848 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -106,8 +106,12 @@ export class IgnitionWrapper { const plan = await this._ignition.plan(recipe); if (!Array.isArray(plan)) { - const recipeGraph = plan.recipeGraph.toMermaid(); - const executionGraph = plan.executionGraph.toMermaid(); + // const recipeGraph = plan.recipeGraph.toMermaid(); + // const executionGraph = plan.executionGraph.toMermaid(); + + // placeholder + const recipeGraph = ""; + const executionGraph = ""; const output = ` flowchart diff --git a/yarn.lock b/yarn.lock index 2f94ea6978..ed65e0238e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,11 +190,6 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" -"@braintree/sanitize-url@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -778,6 +773,18 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== +"@pkgr/utils@^2.3.1": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" + integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== + dependencies: + cross-spawn "^7.0.3" + is-glob "^4.0.3" + open "^8.4.0" + picocolors "^1.0.0" + tiny-glob "^0.2.9" + tslib "^2.4.0" + "@scure/base@~1.1.0": version "1.1.1" resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" @@ -1770,21 +1777,11 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== -commander@2: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== -commander@7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1875,517 +1872,7 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== -d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14" - integrity sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g== - dependencies: - internmap "1 - 2" - -d3-axis@1: - version "1.0.12" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" - integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== - -d3-axis@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" - integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-brush@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" - integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== - dependencies: - d3-array "1" - d3-path "1" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -d3-collection@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-contour@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" - integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== - dependencies: - d3-array "^1.1.1" - -d3-contour@4: - version "4.0.0" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.0.tgz#5a1337c6da0d528479acdb5db54bc81a0ff2ec6b" - integrity sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== - dependencies: - delaunator "5" - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-drag@1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== - dependencies: - d3-dispatch "1" - d3-selection "1" - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -d3-dsv@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" - integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== - -"d3-ease@1 - 3", d3-ease@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -d3-fetch@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" - integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== - dependencies: - d3-dsv "1" - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-force@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -d3-format@1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo@1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== - dependencies: - d3-array "1" - -d3-geo@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" - integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -"d3-path@1 - 3", d3-path@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== - -d3-polygon@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== - -d3-random@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-scale-chromatic@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== - dependencies: - d3-color "1" - d3-interpolate "1" - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" - integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-selection@1, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-shape@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== - dependencies: - d3-path "1 - 3" - -d3-time-format@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" - integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== - dependencies: - d3-time "1" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -d3-time@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" - integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== - dependencies: - d3-array "2 - 3" - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-voronoi@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - -d3-zoom@1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^5.14: - version "5.16.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" - integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== - dependencies: - d3-array "1" - d3-axis "1" - d3-brush "1" - d3-chord "1" - d3-collection "1" - d3-color "1" - d3-contour "1" - d3-dispatch "1" - d3-drag "1" - d3-dsv "1" - d3-ease "1" - d3-fetch "1" - d3-force "1" - d3-format "1" - d3-geo "1" - d3-hierarchy "1" - d3-interpolate "1" - d3-path "1" - d3-polygon "1" - d3-quadtree "1" - d3-random "1" - d3-scale "2" - d3-scale-chromatic "1" - d3-selection "1" - d3-shape "1" - d3-time "1" - d3-time-format "2" - d3-timer "1" - d3-transition "1" - d3-voronoi "1" - d3-zoom "1" - -d3@^7.0.0: - version "7.6.1" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.6.1.tgz#b21af9563485ed472802f8c611cc43be6c37c40c" - integrity sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -dagre-d3@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" - integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ== - dependencies: - d3 "^5.14" - dagre "^0.8.5" - graphlib "^2.1.8" - lodash "^4.17.15" - -dagre@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" - integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== - dependencies: - graphlib "^2.1.8" - lodash "^4.17.15" - -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -2450,6 +1937,11 @@ deferred-leveldown@~5.3.0: abstract-leveldown "~6.2.1" inherits "^2.0.3" +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" @@ -2458,13 +1950,6 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -2506,11 +1991,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dompurify@2.3.10: - version "2.3.10" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.3.10.tgz#901f7390ffe16a91a5a556b94043314cd4850385" - integrity sha512-o7Fg/AgC7p/XpKjf/+RC3Ok6k4St5F7Q6q6+Nnm3p2zGWioAY6dh0CbbuwOhH2UcSzKsdniE/YnE2/92JcsA+g== - electron-to-chromium@^1.4.164: version "1.4.169" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz#d4b8cf9816566c7e9518128f1a97f39de9c7af9d" @@ -2556,6 +2036,14 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" +enhanced-resolve@^5.10.0: + version "5.10.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" + integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + enquirer@^2.3.0, enquirer@^2.3.5: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" @@ -2665,6 +2153,19 @@ eslint-import-resolver-node@^0.3.6: debug "^3.2.7" resolve "^1.20.0" +eslint-import-resolver-typescript@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.1.tgz#c72634da072eebd04fe73007fa58a62c333c8147" + integrity sha512-U7LUjNJPYjNsHvAUAkt/RU3fcTSpbllA0//35B4eLYTX74frmOepbt7F7J3D1IGtj9k21buOpaqtDd4ZlS/BYQ== + dependencies: + debug "^4.3.4" + enhanced-resolve "^5.10.0" + get-tsconfig "^4.2.0" + globby "^13.1.2" + is-core-module "^2.10.0" + is-glob "^4.0.3" + synckit "^0.8.3" + eslint-module-utils@^2.6.2: version "2.7.3" resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" @@ -2973,6 +2474,17 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@^3.2.11, fast-glob@^3.2.12: + version "3.2.12" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" + integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9: version "3.2.11" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" @@ -3208,6 +2720,11 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" +get-tsconfig@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" + integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3251,6 +2768,11 @@ globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globalyzer@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" + integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== + globby@^11.0.3: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -3263,18 +2785,27 @@ globby@^11.0.3: merge2 "^1.4.1" slash "^3.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0: +globby@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + +globrex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" + integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" - growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -3443,20 +2974,13 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4, iconv-lite@0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -3563,11 +3087,6 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -3614,6 +3133,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + dependencies: + has "^1.0.3" + is-core-module@^2.6.0, is-core-module@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" @@ -3628,6 +3154,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -3643,7 +3174,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -3738,6 +3269,13 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -3921,11 +3459,6 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" -khroma@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" - integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== - klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -4072,7 +3605,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4183,21 +3716,6 @@ merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" -mermaid@^9.1.6: - version "9.1.6" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.6.tgz#e34d5ad632455df014784d7c77af21fd51388341" - integrity sha512-oBuQk7s55wQgEgH/AK0GYY8U0kBqOIGK9QlJL+VYxh+1kZQtU9tNwoy0gWCfBJDaFIRdfpc/fm9PagaIXg6XFQ== - dependencies: - "@braintree/sanitize-url" "^6.0.0" - d3 "^7.0.0" - dagre "^0.8.5" - dagre-d3 "^0.6.4" - dompurify "2.3.10" - graphlib "^2.1.8" - khroma "^2.0.0" - moment-mini "2.24.0" - stylis "^4.0.10" - micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -4320,11 +3838,6 @@ mocha@^9.1.1, mocha@^9.1.3: yargs-parser "20.2.4" yargs-unparser "2.0.0" -moment-mini@2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" - integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ== - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4501,6 +4014,15 @@ onetime@^5.1.0: dependencies: mimic-fn "^2.1.0" +open@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -4963,11 +4485,6 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4980,11 +4497,6 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -4995,7 +4507,7 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5134,6 +4646,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" @@ -5333,11 +4850,6 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stylis@^4.0.10: - version "4.1.1" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.1.tgz#e46c6a9bbf7c58db1e65bb730be157311ae1fe12" - integrity sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ== - supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -5364,6 +4876,14 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +synckit@^0.8.3: + version "0.8.4" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" + integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== + dependencies: + "@pkgr/utils" "^2.3.1" + tslib "^2.4.0" + table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" @@ -5375,6 +4895,11 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -5399,6 +4924,14 @@ through@2: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +tiny-glob@^0.2.9: + version "0.2.9" + resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" + integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== + dependencies: + globalyzer "0.1.0" + globrex "^0.1.2" + tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5464,11 +4997,25 @@ tsconfig-paths@^3.11.0: minimist "^1.2.6" strip-bom "^3.0.0" +tsconfig-paths@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" + integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== + dependencies: + json5 "^2.2.1" + minimist "^1.2.6" + strip-bom "^3.0.0" + tslib@^1.8.1, tslib@^1.9.3: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" From 3d34e49e286d4cd0f449521fec9ae70fccaf0a1e Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 12 Sep 2022 10:44:13 +0100 Subject: [PATCH 0082/1302] refactor: fix ui display in tests --- NOTES.md | 14 -------------- packages/core/src/index.ts | 10 +++------- packages/hardhat-plugin/src/ignition-wrapper.ts | 2 +- 3 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 NOTES.md diff --git a/NOTES.md b/NOTES.md deleted file mode 100644 index d4f587752b..0000000000 --- a/NOTES.md +++ /dev/null @@ -1,14 +0,0 @@ -# TODO - -1. [x] Deal with services setup? How is this affecting the journaling folder -2. [x] Validation tests -3. [x] Execution tests -4. [x] Remove old files -5. [x] Check code level todos -6. [x] Change steps as a function name -7. [ ] add docs and images - -## Questions - -* We execute a deployed contract vertex, but it immediately returns. Should it be in the graph? Do we want to do something here? -* Should we have a separate pass to check what in the execution graph has already been deployed? diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 22965da882..9a375e6347 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,22 +1,18 @@ +export { Ignition, IgnitionDeployOptions } from "./Ignition"; +export { buildRecipe } from "recipe/buildRecipe"; + export type { SerializedDeploymentResult, SerializedRecipeResult, SerializedFutureResult, } from "types/serialization"; - export type { Services } from "services/types"; - export type { Providers, ConfigProvider, HasParamResult, } from "types/providers"; - export type { DeploymentResult } from "types/deployment"; - -export { Ignition, IgnitionDeployOptions } from "./Ignition"; - -export { buildRecipe } from "recipe/buildRecipe"; export type { Recipe, ExternalParamValue, diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index e5175a4848..044046133c 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -58,7 +58,7 @@ export class IgnitionWrapper { const [deploymentResult] = await this._ignition.deploy(recipe, { ...this._deployOptions, - ui: true, + ui: deployParams?.ui ?? true, }); if (deploymentResult._kind === "hold") { From a7140085a13e1de0fe105c8b1ddf7704ee6f5408 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 12 Sep 2022 11:17:50 +0100 Subject: [PATCH 0083/1302] refactor: cleanup process folder --- packages/core/src/graph/visit.ts | 12 +- .../convertRecipeVertexToExecutionVertex.ts | 213 ++++++++++++++++ ...RecipeGraphByEliminatingVirtualVertexes.ts | 0 .../transformRecipeGraphToExecutionGraph.ts | 229 +----------------- packages/core/src/types/process.ts | 11 + 5 files changed, 233 insertions(+), 232 deletions(-) create mode 100644 packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts rename packages/core/src/process/{ => transform}/reduceRecipeGraphByEliminatingVirtualVertexes.ts (100%) create mode 100644 packages/core/src/types/process.ts diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 0760987aa3..140745a931 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -3,22 +3,18 @@ import { IGraph, VertexVisitResult, VisitResult } from "types/graph"; export async function visit( phase: "Execution" | "Validation", orderedVertexIds: number[], - executionGraph: IGraph, + graph: IGraph, context: C, resultAccumulator: Map, vistitorAction: ( - executionVertex: T, + vertex: T, resultAccumulator: Map, context: C ) => Promise, - afterAction?: ( - executionVertex: T, - kind: "success" | "failure", - err?: unknown - ) => void + afterAction?: (vertex: T, kind: "success" | "failure", err?: unknown) => void ): Promise { for (const vertexId of orderedVertexIds) { - const vertex = executionGraph.vertexes.get(vertexId); + const vertex = graph.vertexes.get(vertexId); if (vertex === undefined) { throw new Error(`Could not get vertex ${vertexId}`); diff --git a/packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts new file mode 100644 index 0000000000..834eafe41d --- /dev/null +++ b/packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts @@ -0,0 +1,213 @@ +import { Services } from "services/types"; +import { + ContractCall, + ContractDeploy, + DeployedContract, + ExecutionVertex, + LibraryDeploy, +} from "types/executionGraph"; +import { RecipeFuture } from "types/future"; +import { Artifact } from "types/hardhat"; +import { + ArtifactContractRecipeVertex, + ArtifactLibraryRecipeVertex, + CallRecipeVertex, + DeployedContractRecipeVertex, + HardhatContractRecipeVertex, + HardhatLibraryRecipeVertex, + IRecipeGraph, + RecipeVertex, +} from "types/recipeGraph"; +import { isFuture } from "utils/guards"; + +interface TransformContext { + services: Services; + graph: IRecipeGraph; +} + +export function convertRecipeVertexToExecutionVertex( + context: TransformContext +): (recipeVertex: RecipeVertex) => Promise { + return (recipeVertex: RecipeVertex): Promise => { + switch (recipeVertex.type) { + case "HardhatContract": + return convertHardhatContractToContractDeploy(recipeVertex, context); + case "ArtifactContract": + return convertArtifactContractToContractDeploy(recipeVertex, context); + case "DeployedContract": + return convertDeployedContractToDeployedDeploy(recipeVertex, context); + case "Call": + return convertCallToContractCall(recipeVertex, context); + case "HardhatLibrary": + return convertHardhatLibraryToLibraryDeploy(recipeVertex, context); + case "ArtifactLibrary": + return convertArtifactLibraryToLibraryDeploy(recipeVertex, context); + case "Virtual": + throw new Error( + `Virtual vertex should be removed ${recipeVertex.id} (${recipeVertex.label})` + ); + default: + return assertRecipeVertexNotExpected(recipeVertex); + } + }; +} + +async function convertHardhatContractToContractDeploy( + vertex: HardhatContractRecipeVertex, + transformContext: TransformContext +): Promise { + const artifact: Artifact = + await transformContext.services.artifacts.getArtifact(vertex.contractName); + + return { + type: "ContractDeploy", + id: vertex.id, + label: vertex.label, + artifact, + args: await convertArgs(vertex.args, transformContext), + libraries: vertex.libraries, + }; +} + +async function convertArtifactContractToContractDeploy( + vertex: ArtifactContractRecipeVertex, + transformContext: TransformContext +): Promise { + return { + type: "ContractDeploy", + id: vertex.id, + label: vertex.label, + artifact: vertex.artifact, + args: await convertArgs(vertex.args, transformContext), + libraries: vertex.libraries, + }; +} + +async function convertDeployedContractToDeployedDeploy( + vertex: DeployedContractRecipeVertex, + _transformContext: TransformContext +): Promise { + return { + type: "DeployedContract", + id: vertex.id, + label: vertex.label, + address: vertex.address, + abi: vertex.abi, + }; +} + +async function convertCallToContractCall( + vertex: CallRecipeVertex, + transformContext: TransformContext +): Promise { + return { + type: "ContractCall", + id: vertex.id, + label: vertex.label, + + contract: await resolveParameter(vertex.contract, transformContext), + method: vertex.method, + args: await convertArgs(vertex.args, transformContext), + }; +} + +async function convertHardhatLibraryToLibraryDeploy( + vertex: HardhatLibraryRecipeVertex, + transformContext: TransformContext +): Promise { + const artifact: Artifact = + await transformContext.services.artifacts.getArtifact(vertex.libraryName); + + return { + type: "LibraryDeploy", + id: vertex.id, + label: vertex.label, + artifact, + args: await convertArgs(vertex.args, transformContext), + }; +} + +async function convertArtifactLibraryToLibraryDeploy( + vertex: ArtifactLibraryRecipeVertex, + transformContext: TransformContext +): Promise { + return { + type: "LibraryDeploy", + id: vertex.id, + label: vertex.label, + artifact: vertex.artifact, + args: await convertArgs(vertex.args, transformContext), + }; +} + +function assertRecipeVertexNotExpected( + vertex: never +): Promise { + const v: any = vertex; + + const obj = typeof v === "object" && "type" in v ? v.type : v; + + throw new Error(`Type not expected: ${obj}`); +} + +async function convertArgs( + args: Array, + transformContext: TransformContext +): Promise> { + const resolvedArgs = []; + + for (const arg of args) { + const resolvedArg = await resolveParameter(arg, transformContext); + + resolvedArgs.push(resolvedArg); + } + + return resolvedArgs; +} + +async function resolveParameter( + arg: boolean | string | number | RecipeFuture, + { services, graph }: TransformContext +) { + if (!isFuture(arg)) { + return arg; + } + + if (arg.type !== "parameter") { + return arg; + } + + const scope = arg.scope; + const scopeParameters = graph.registeredParameters[scope]; + + if (scopeParameters !== undefined && arg.label in scopeParameters) { + return scopeParameters[arg.label]; + } + + const hasParamResult = await services.config.hasParam(arg.label); + + if (arg.subtype === "optional") { + return hasParamResult.found + ? services.config.getParam(arg.label) + : arg.defaultValue; + } + + if (hasParamResult.found === false) { + switch (hasParamResult.errorCode) { + case "no-params": + throw new Error( + `No parameters object provided to deploy options, but recipe requires parameter "${arg.label}"` + ); + case "param-missing": + throw new Error(`No parameter provided for "${arg.label}"`); + default: + assertNeverParamResult(hasParamResult.errorCode); + } + } + + return services.config.getParam(arg.label); +} + +function assertNeverParamResult(hasParamResult: never) { + throw new Error(`Unexpected error code ${hasParamResult}`); +} diff --git a/packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts similarity index 100% rename from packages/core/src/process/reduceRecipeGraphByEliminatingVirtualVertexes.ts rename to packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts diff --git a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts index 084be9bf8d..8c2e1281f9 100644 --- a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts @@ -1,44 +1,12 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; import { clone } from "graph/adjacencyList"; import { Services } from "services/types"; -import { - ContractCall, - ContractDeploy, - DeployedContract, - ExecutionVertex, - IExecutionGraph, - LibraryDeploy, -} from "types/executionGraph"; -import { RecipeFuture } from "types/future"; -import { Artifact } from "types/hardhat"; -import { - ArtifactContractRecipeVertex, - ArtifactLibraryRecipeVertex, - CallRecipeVertex, - DeployedContractRecipeVertex, - HardhatContractRecipeVertex, - HardhatLibraryRecipeVertex, - IRecipeGraph, - RecipeVertex, -} from "types/recipeGraph"; -import { isFuture } from "utils/guards"; +import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; +import { TransformResult } from "types/process"; +import { IRecipeGraph, RecipeVertex } from "types/recipeGraph"; -import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./reduceRecipeGraphByEliminatingVirtualVertexes"; - -export type TransformResult = - | { - _kind: "success"; - executionGraph: IExecutionGraph; - } - | { - _kind: "failure"; - failures: [string, Error[]]; - }; - -interface TransformContext { - services: Services; - graph: IRecipeGraph; -} +import { convertRecipeVertexToExecutionVertex } from "./transform/convertRecipeVertexToExecutionVertex"; +import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./transform/reduceRecipeGraphByEliminatingVirtualVertexes"; export async function transformRecipeGraphToExecutionGraph( recipeGraph: IRecipeGraph, @@ -73,190 +41,3 @@ async function convertRecipeToExecution( return executionGraph; } - -function convertRecipeVertexToExecutionVertex( - context: TransformContext -): (recipeVertex: RecipeVertex) => Promise { - return (recipeVertex: RecipeVertex): Promise => { - switch (recipeVertex.type) { - case "HardhatContract": - return convertHardhatContractToContractDeploy(recipeVertex, context); - case "ArtifactContract": - return convertArtifactContractToContractDeploy(recipeVertex, context); - case "DeployedContract": - return convertDeployedContractToDeployedDeploy(recipeVertex, context); - case "Call": - return convertCallToContractCall(recipeVertex, context); - case "HardhatLibrary": - return convertHardhatLibraryToLibraryDeploy(recipeVertex, context); - case "ArtifactLibrary": - return convertArtifactLibraryToLibraryDeploy(recipeVertex, context); - case "Virtual": - throw new Error( - `Virtual vertex should be removed ${recipeVertex.id} (${recipeVertex.label})` - ); - default: - return assertRecipeVertexNotExpected(recipeVertex); - } - }; -} - -async function convertHardhatContractToContractDeploy( - vertex: HardhatContractRecipeVertex, - transformContext: TransformContext -): Promise { - const artifact: Artifact = - await transformContext.services.artifacts.getArtifact(vertex.contractName); - - return { - type: "ContractDeploy", - id: vertex.id, - label: vertex.label, - artifact, - args: await convertArgs(vertex.args, transformContext), - libraries: vertex.libraries, - }; -} - -async function convertArtifactContractToContractDeploy( - vertex: ArtifactContractRecipeVertex, - transformContext: TransformContext -): Promise { - return { - type: "ContractDeploy", - id: vertex.id, - label: vertex.label, - artifact: vertex.artifact, - args: await convertArgs(vertex.args, transformContext), - libraries: vertex.libraries, - }; -} - -async function convertDeployedContractToDeployedDeploy( - vertex: DeployedContractRecipeVertex, - _transformContext: TransformContext -): Promise { - return { - type: "DeployedContract", - id: vertex.id, - label: vertex.label, - address: vertex.address, - abi: vertex.abi, - }; -} - -async function convertCallToContractCall( - vertex: CallRecipeVertex, - transformContext: TransformContext -): Promise { - return { - type: "ContractCall", - id: vertex.id, - label: vertex.label, - - contract: await resolveParameter(vertex.contract, transformContext), - method: vertex.method, - args: await convertArgs(vertex.args, transformContext), - }; -} - -async function convertHardhatLibraryToLibraryDeploy( - vertex: HardhatLibraryRecipeVertex, - transformContext: TransformContext -): Promise { - const artifact: Artifact = - await transformContext.services.artifacts.getArtifact(vertex.libraryName); - - return { - type: "LibraryDeploy", - id: vertex.id, - label: vertex.label, - artifact, - args: await convertArgs(vertex.args, transformContext), - }; -} - -async function convertArtifactLibraryToLibraryDeploy( - vertex: ArtifactLibraryRecipeVertex, - transformContext: TransformContext -): Promise { - return { - type: "LibraryDeploy", - id: vertex.id, - label: vertex.label, - artifact: vertex.artifact, - args: await convertArgs(vertex.args, transformContext), - }; -} - -function assertRecipeVertexNotExpected( - vertex: never -): Promise { - const v: any = vertex; - - const obj = typeof v === "object" && "type" in v ? v.type : v; - - throw new Error(`Type not expected: ${obj}`); -} - -async function convertArgs( - args: Array, - transformContext: TransformContext -): Promise> { - const resolvedArgs = []; - - for (const arg of args) { - const resolvedArg = await resolveParameter(arg, transformContext); - - resolvedArgs.push(resolvedArg); - } - - return resolvedArgs; -} - -async function resolveParameter( - arg: boolean | string | number | RecipeFuture, - { services, graph }: TransformContext -) { - if (!isFuture(arg)) { - return arg; - } - - if (arg.type !== "parameter") { - return arg; - } - - const scope = arg.scope; - const scopeParameters = graph.registeredParameters[scope]; - - if (scopeParameters !== undefined && arg.label in scopeParameters) { - return scopeParameters[arg.label]; - } - - const hasParamResult = await services.config.hasParam(arg.label); - - if (arg.subtype === "optional") { - return hasParamResult.found - ? services.config.getParam(arg.label) - : arg.defaultValue; - } - - if (hasParamResult.found === false) { - switch (hasParamResult.errorCode) { - case "no-params": - throw new Error( - `No parameters object provided to deploy options, but recipe requires parameter "${arg.label}"` - ); - case "param-missing": - throw new Error(`No parameter provided for "${arg.label}"`); - default: - assertNeverParamResult(hasParamResult.errorCode); - } - } - - return services.config.getParam(arg.label); -} - -function assertNeverParamResult(hasParamResult: never) { - throw new Error(`Unexpected error code ${hasParamResult}`); -} diff --git a/packages/core/src/types/process.ts b/packages/core/src/types/process.ts new file mode 100644 index 0000000000..ae192e045f --- /dev/null +++ b/packages/core/src/types/process.ts @@ -0,0 +1,11 @@ +import { IExecutionGraph } from "./executionGraph"; + +export type TransformResult = + | { + _kind: "success"; + executionGraph: IExecutionGraph; + } + | { + _kind: "failure"; + failures: [string, Error[]]; + }; From c979e371abafe5f5eeb629f6389cec2dc78ab397 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 12 Sep 2022 11:42:53 +0100 Subject: [PATCH 0084/1302] refactor: update docs --- README.md | 2 +- docs/getting-started-guide.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a9ea9cef22..456af3da5b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Modify your Hardhat.config.{ts,js} file, to include Ignition: ```javascript // ... -import "@nomiclabs/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition"; ``` ## Getting Started diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index b877aa5478..437cb15901 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -29,9 +29,9 @@ Add a deployment recipe under the `./ignition` folder: ```typescript // ./ignition/MyRecipe.ts -import { buildRecipe, RecipeBuilder } from "@nomiclabs/hardhat-ignition"; +import { buildRecipe } from "@nomicfoundation/hardhat-ignition"; -export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { +export default buildRecipe("MyRecipe", (m) => { const token = m.contract("Token"); return { token }; @@ -41,7 +41,7 @@ export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { Run the `deploy` task to test the recipe against a local ephemeral **Hardhat** node: ```shell -npx hardhat deploy ./ignition/MyRecipe.ts +npx hardhat deploy MyRecipe.ts # No need to generate any newer typings. # Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 ``` From e4ab7fc81adc2bcdc88cc14ac92f9c44cfe0d8f1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 12 Sep 2022 12:29:43 +0100 Subject: [PATCH 0085/1302] refactor: add architecture doc --- CONTRIBUTING.md | 4 ++++ docs/architecture.md | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 docs/architecture.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d1f3a93999..5d8cb89f92 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,10 @@ There are two packages: * [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments * [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library +## Architecture + +An overview of the [architecture of the deploy process is explained here](./docs/architecture.md). + ## Setup Ignition is a `typescript` project managed by `yarn`. diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000000..eeec26ed24 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,33 @@ +# Deploy Architecture + +Ignition expresses a deployment as a dependency graph of on-chain transactions, that is contract deployments and calls. Deployments and calls can be dependent on each other, for instance, a call to a contract requires the contract first being deployed; the call should not be invoked until the contract deploy has completed successfully. + +Ignition provides the **recipe api** (a js based dsl) so users can succintly describe of a dependency graph of contract deploys and calls. The user describes the dependency graph as a `Recipe`, a utility function that takes a graph builder as its first argument. + +## Deploying a Recipe + +```mermaid +flowchart LR + 0[User Recipe] + subgraph Ignition + 1[Build Recipe Graph] + 2[Validate Recipe Graph] + 3[Transform to Execution Graph] + 4[Execute] + end + 0 --> 1 + 1 --> 2 + 2 --> 3 + 3 --> 4 + ``` + +To deploy Ignition is invoked with a `Recipe`. Ignition uses the `Recipe` to build a `RecipeGraph`. This graph is then validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). A valid `RecipeGraph` will contain lots of **Hardhat** specific references. Ignition transforms and simplifies the `RecipeGraph` to an `ExecutionGraph`, turning **Hardhat** references into neutral ones e.g. a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. + +The `ExecutionGraph` determines what is executed on-chain. Ignition's execution engine uses the vertexes of the `ExecutionGraph` to determine what transactions should be sent, and uses the edges of the `ExecutionGraph` to determine how the transactions are ordered and batched. A transaction will not be included in the next batch until all it's dependencies have successfully completed. + +Either the entire graph of transactions will eventually succeed, in which case the deployment was a success. Or a transaction will fail or be stopped from completing, leading to a failed deployment. + + + + + From b4d4493afbcec217f23d386b4084174d97fad4cb Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Sep 2022 10:57:03 -0400 Subject: [PATCH 0086/1302] windows debug testing with logs --- packages/core/post-build.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/core/post-build.js b/packages/core/post-build.js index b76b149022..2c5073cbb8 100644 --- a/packages/core/post-build.js +++ b/packages/core/post-build.js @@ -2,19 +2,22 @@ const fs = require("fs-extra"); const glob = require("fast-glob"); const { resolve, dirname, relative } = require("path"); -const dir = fs.readdirSync("./src"); +const srcRoot = resolve(__dirname, "src"); +const dir = fs.readdirSync(srcRoot); +console.log("dir"); +console.log(dir); const pwd = process.cwd(); const configFile = resolve(pwd, "tsconfig.json"); const { compilerOptions: { baseUrl }, } = require(configFile); -const srcRoot = resolve("./src"); +// const srcRoot = resolve("./src"); const configDir = dirname(configFile); const basePath = resolve(configDir, baseUrl); -const outPath = resolve("./dist/src"); +const outPath = resolve(__dirname, "dist", "src"); const outFileToSrcFile = (x) => resolve(srcRoot, relative(outPath, x)); @@ -37,6 +40,9 @@ for (let i = 0; i < dir.length; i++) { }); } +console.log("aliases"); +console.log(aliases); + const absToRel = (modulePath, outFile) => { const len = aliases.length; for (let i = 0; i < len; i++) { @@ -93,6 +99,9 @@ const files = glob }) .map((x) => resolve(x)); +console.log("files"); +console.log(files); + const len = files.length; for (let i = 0; i < len; i++) { const file = files[i]; From eae2ac8ecc5e6e35f152154ddf1e74f586dd3c84 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Sep 2022 11:22:03 -0400 Subject: [PATCH 0087/1302] who doesn't love a good backslash --- packages/core/post-build.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/post-build.js b/packages/core/post-build.js index 2c5073cbb8..bce7580ffc 100644 --- a/packages/core/post-build.js +++ b/packages/core/post-build.js @@ -1,6 +1,6 @@ const fs = require("fs-extra"); const glob = require("fast-glob"); -const { resolve, dirname, relative } = require("path"); +const { resolve, dirname, relative, join } = require("path"); const srcRoot = resolve(__dirname, "src"); const dir = fs.readdirSync(srcRoot); @@ -93,7 +93,7 @@ const replaceAlias = (text, outFile) => ); const files = glob - .sync(`${outPath}/**/*.{js,jsx,ts,tsx}`, { + .sync(join(outPath, "**", "*.{js,jsx,ts,tsx}").replace(/\\/g, "/"), { dot: true, onlyFiles: true, }) From b3441faf42451c3b0c2b729252e6f9b09bb81035 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Sep 2022 11:27:32 -0400 Subject: [PATCH 0088/1302] removing debug logs --- packages/core/post-build.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/core/post-build.js b/packages/core/post-build.js index bce7580ffc..03eabba990 100644 --- a/packages/core/post-build.js +++ b/packages/core/post-build.js @@ -4,8 +4,6 @@ const { resolve, dirname, relative, join } = require("path"); const srcRoot = resolve(__dirname, "src"); const dir = fs.readdirSync(srcRoot); -console.log("dir"); -console.log(dir); const pwd = process.cwd(); const configFile = resolve(pwd, "tsconfig.json"); @@ -40,9 +38,6 @@ for (let i = 0; i < dir.length; i++) { }); } -console.log("aliases"); -console.log(aliases); - const absToRel = (modulePath, outFile) => { const len = aliases.length; for (let i = 0; i < len; i++) { @@ -99,9 +94,6 @@ const files = glob }) .map((x) => resolve(x)); -console.log("files"); -console.log(files); - const len = files.length; for (let i = 0; i < len; i++) { const file = files[i]; From f840522549c0c9391af821ac541016d180c1f2cc Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 14 Sep 2022 02:00:01 -0400 Subject: [PATCH 0089/1302] removed lingering comment from build script --- packages/core/post-build.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/post-build.js b/packages/core/post-build.js index 03eabba990..b60fb2ad5a 100644 --- a/packages/core/post-build.js +++ b/packages/core/post-build.js @@ -10,7 +10,6 @@ const configFile = resolve(pwd, "tsconfig.json"); const { compilerOptions: { baseUrl }, } = require(configFile); -// const srcRoot = resolve("./src"); const configDir = dirname(configFile); From 15f7f6a584c254f92a1ae10d79347adbe84ea230 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 14 Sep 2022 02:00:21 -0400 Subject: [PATCH 0090/1302] adding first pass for html --- packages/core/src/Ignition.ts | 7 +- packages/core/src/index.ts | 2 + packages/core/src/types/executionGraph.ts | 18 +- packages/core/src/types/graph.ts | 2 + packages/core/src/types/plan.ts | 7 + packages/core/src/types/recipeGraph.ts | 30 +--- .../hardhat-plugin/src/ignition-wrapper.ts | 43 +---- packages/hardhat-plugin/src/index.ts | 29 +--- packages/hardhat-plugin/src/plan/index.ts | 162 ++++++++++++++++++ .../src/plan/templates/index.html | 10 ++ .../src/plan/templates/vertex.html | 5 + packages/hardhat-plugin/src/plan/utils.ts | 40 +++++ 12 files changed, 255 insertions(+), 100 deletions(-) create mode 100644 packages/core/src/types/plan.ts create mode 100644 packages/hardhat-plugin/src/plan/index.ts create mode 100644 packages/hardhat-plugin/src/plan/templates/index.html create mode 100644 packages/hardhat-plugin/src/plan/templates/vertex.html create mode 100644 packages/hardhat-plugin/src/plan/utils.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 49c545d3d1..4734ff09e1 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -9,6 +9,7 @@ import { createServices } from "services/createServices"; import { Services } from "services/types"; import { DeploymentResult, IgnitionRecipesResults } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; +import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; import { Recipe } from "types/recipeGraph"; import { SerializedDeploymentResult } from "types/serialization"; @@ -113,7 +114,7 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } - public async plan(recipe: Recipe) { + public async plan(recipe: Recipe): Promise { log(`Start plan`); const serviceOptions = { @@ -135,7 +136,7 @@ export class Ignition { const validationResult = await validateRecipeGraph(recipeGraph, services); if (validationResult._kind === "failure") { - return [validationResult, {}]; + throw new Error(validationResult.failures[0]); } const transformResult = await transformRecipeGraphToExecutionGraph( @@ -144,7 +145,7 @@ export class Ignition { ); if (transformResult._kind === "failure") { - return [transformResult, {}]; + throw new Error(transformResult.failures[0]); } const { executionGraph } = transformResult; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9a375e6347..b8232ce84a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -19,3 +19,5 @@ export type { IRecipeGraphBuilder, } from "types/recipeGraph"; export type { FutureDict } from "types/future"; +export type { IgnitionPlan } from "types/plan"; +export type { VertexGraph, VertexDescriptor } from "types/graph"; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index b4baf7dfdf..bbccc99367 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,5 +1,5 @@ import { RecipeFuture } from "./future"; -import { AdjacencyList } from "./graph"; +import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; import { LibraryMap } from "./recipeGraph"; @@ -17,35 +17,27 @@ export type ExecutionVertex = | LibraryDeploy | ContractCall; -export interface ContractDeploy { +export interface ContractDeploy extends VertexDescriptor { type: "ContractDeploy"; - id: number; - label: string; artifact: Artifact; args: ArgValue[]; libraries: LibraryMap; } -export interface DeployedContract { +export interface DeployedContract extends VertexDescriptor { type: "DeployedContract"; - id: number; - label: string; address: string; abi: any[]; } -export interface LibraryDeploy { +export interface LibraryDeploy extends VertexDescriptor { type: "LibraryDeploy"; - id: number; - label: string; artifact: Artifact; args: ArgValue[]; } -export interface ContractCall { +export interface ContractCall extends VertexDescriptor { type: "ContractCall"; - id: number; - label: string; contract: any; method: string; args: ArgValue[]; diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index e178709505..e61d410130 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -11,6 +11,8 @@ export interface IGraph { getEdges(): Array<{ from: number; to: number }>; } +export type VertexGraph = IGraph; + export type VertexVisitResult = | { _kind: "success"; diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts new file mode 100644 index 0000000000..b769695051 --- /dev/null +++ b/packages/core/src/types/plan.ts @@ -0,0 +1,7 @@ +import { IExecutionGraph } from "./executionGraph"; +import { IRecipeGraph } from "./recipeGraph"; + +export interface IgnitionPlan { + recipeGraph: IRecipeGraph; + executionGraph: IExecutionGraph; +} diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index 3b072008b3..3a7f935029 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -12,7 +12,7 @@ import { RequiredParameter, CallableFuture, } from "./future"; -import { AdjacencyList } from "./graph"; +import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; export interface IRecipeGraph { @@ -41,57 +41,45 @@ export type RecipeVertex = | CallRecipeVertex | VirtualVertex; -export interface HardhatContractRecipeVertex { - id: number; +export interface HardhatContractRecipeVertex extends VertexDescriptor { type: "HardhatContract"; - label: string; scopeAdded: string; contractName: string; args: InternalParamValue[]; libraries: LibraryMap; } -export interface ArtifactContractRecipeVertex { - id: number; +export interface ArtifactContractRecipeVertex extends VertexDescriptor { type: "ArtifactContract"; - label: string; scopeAdded: string; artifact: Artifact; args: InternalParamValue[]; libraries: LibraryMap; } -export interface DeployedContractRecipeVertex { - id: number; +export interface DeployedContractRecipeVertex extends VertexDescriptor { type: "DeployedContract"; - label: string; scopeAdded: string; address: string; abi: any[]; } -export interface HardhatLibraryRecipeVertex { - id: number; +export interface HardhatLibraryRecipeVertex extends VertexDescriptor { type: "HardhatLibrary"; libraryName: string; - label: string; scopeAdded: string; args: InternalParamValue[]; } -export interface ArtifactLibraryRecipeVertex { - id: number; +export interface ArtifactLibraryRecipeVertex extends VertexDescriptor { type: "ArtifactLibrary"; - label: string; scopeAdded: string; artifact: Artifact; args: InternalParamValue[]; } -export interface CallRecipeVertex { - id: number; +export interface CallRecipeVertex extends VertexDescriptor { type: "Call"; - label: string; scopeAdded: string; contract: CallableFuture; method: string; @@ -99,10 +87,8 @@ export interface CallRecipeVertex { after: RecipeFuture[]; } -export interface VirtualVertex { - id: number; +export interface VirtualVertex extends VertexDescriptor { type: "Virtual"; - label: string; scopeAdded: string; after: RecipeFuture[]; } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 044046133c..9cb33315c2 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -13,21 +13,6 @@ import path from "path"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; -const htmlTemplate = ` - - - - - -
- $ -
- - -`; - export class IgnitionWrapper { private _ignition: Ignition; private _cachedChainId: number | undefined; @@ -102,32 +87,8 @@ export class IgnitionWrapper { return resolvedOutput; } - public async plan(recipe: any) { - const plan = await this._ignition.plan(recipe); - - if (!Array.isArray(plan)) { - // const recipeGraph = plan.recipeGraph.toMermaid(); - // const executionGraph = plan.executionGraph.toMermaid(); - - // placeholder - const recipeGraph = ""; - const executionGraph = ""; - - const output = ` -flowchart -subgraph ExecutionGraph -direction TB -${executionGraph.substring(executionGraph.indexOf("\n"))} -end -subgraph RecipeGraph -direction TB -${recipeGraph.substring(recipeGraph.indexOf("\n"))} -end -`; - return htmlTemplate.replace("$", output); - } - - return htmlTemplate.replace("$", ""); + public async plan(recipe: Recipe) { + return this._ignition.plan(recipe); } private async _getRecipeResult( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index daf1175bac..9a86e0305e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,14 +1,12 @@ import "@nomiclabs/hardhat-ethers"; import { Providers, Recipe } from "@nomicfoundation/ignition-core"; -import { exec } from "child_process"; -import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; -import os from "os"; import path from "path"; import { ConfigWrapper } from "./ConfigWrapper"; import { IgnitionWrapper } from "./ignition-wrapper"; +import { Renderer } from "./plan"; import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; import "./type-extensions"; @@ -174,29 +172,18 @@ task("plan") process.exit(0); } - const html = await hre.ignition.plan(userRecipes[0]); + const plan = await hre.ignition.plan(userRecipes[0]); - const filePath = `${hre.config.paths.cache}/plan.html`; + const renderer = new Renderer(plan, { + cachePath: hre.config.paths.cache, + }); - let command: string; - switch (os.platform()) { - case "win32": - command = "start"; - break; - case "darwin": - command = "open"; - break; - default: - command = "xdg-open"; - } - - await fs.ensureDir(hre.config.paths.cache); - await fs.writeFile(filePath, html); + renderer.write(); if (!quiet) { - console.log(`Plan written to ${filePath}`); + console.log(`Plan written to ${renderer.planPath}/index.html`); } - exec(`${command} ${filePath}`); + renderer.open(); } ); diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts new file mode 100644 index 0000000000..13b9ef2854 --- /dev/null +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -0,0 +1,162 @@ +import { IgnitionPlan } from "@nomicfoundation/ignition-core"; +import { exec } from "child_process"; +import fs from "fs-extra"; +import os from "os"; +import path from "path"; + +import { graphToMermaid, wrapInFlowchart, wrapInMermaidDiv } from "./utils"; + +/** + * file structure output: + * + * cache/ + * plan/ + * execution/ + * .html + * recipe/ + * .html + * index.html + */ + +interface RendererConfig { + cachePath: string; +} +/** + * this is only temporary, until we get a proper build tool that will + * include the html template files in the build output dir + */ +const htmlTemplate = ` + + + + + + $ + + +`; + +export class Renderer { + private _htmlTemplate: string = ""; + private _vertexTemplate: string = ""; + + constructor(public plan: IgnitionPlan, public config: RendererConfig) { + // ensure `plan` file structure once on construction + // so we don't have to before every write function later + this._ensureDirectoryStructure(); + } + + public write(): void { + const mainOutput = this.getIndexOutput(); + this._writeMainHTML(this.htmlTemplate.replace("$", mainOutput)); + + // the stringify in these loops is just a first draft version + // they'll be full html pages with styles at some point + for (const vertex of this.plan.recipeGraph.vertexes.values()) { + this._writeRecipeHTML(vertex.id, JSON.stringify(vertex, null, 2)); + } + + for (const vertex of this.plan.executionGraph.vertexes.values()) { + this._writeExecutionHTML(vertex.id, JSON.stringify(vertex, null, 2)); + } + } + + /** + * opens the main `plan` file in the user's default browser + * + * assumes Renderer.write() was called before this + */ + public open(): void { + let command: string; + switch (os.platform()) { + case "win32": + command = "start"; + break; + case "darwin": + command = "open"; + break; + default: + command = "xdg-open"; + } + + exec(`${command} ${path.resolve(this.planPath, "index.html")}`); + } + + public getIndexOutput(): string { + const recipeBody = graphToMermaid(this.plan.recipeGraph, this.recipePath); + const executionBody = graphToMermaid( + this.plan.executionGraph, + this.executionPath + ); + + const recipeFlowchart = wrapInMermaidDiv( + wrapInFlowchart("RecipeGraph", recipeBody) + ); + const executionFlowchart = wrapInMermaidDiv( + wrapInFlowchart("ExecutionGraph", executionBody) + ); + + return this.htmlTemplate.replace( + "$", + `${recipeFlowchart}\n${executionFlowchart}` + ); + } + + public get htmlTemplate(): string { + // simple cache to avoid redundant fs reads + // if (this._htmlTemplate === "") { + // this._htmlTemplate = fs.readFileSync( + // path.resolve(this._templatesPath, "index.html"), + // "utf8" + // ); + // } + this._htmlTemplate = htmlTemplate; // temp hack - see comment at top of file + return this._htmlTemplate; + } + + public get vertexTemplate(): string { + // simple cache to avoid redundant fs reads + // if (this._vertexTemplate === "") { + // this._vertexTemplate = fs.readFileSync( + // path.resolve(this._templatesPath, "vertex.html"), + // "utf8" + // ); + // } + return this._vertexTemplate; + } + + public get planPath(): string { + return path.resolve(this.config.cachePath, "plan"); + } + + public get recipePath(): string { + return path.resolve(this.planPath, "recipe"); + } + + public get executionPath(): string { + return path.resolve(this.planPath, "execution"); + } + + private get _templatesPath(): string { + return path.resolve(__dirname, "templates"); + } + + private _writeExecutionHTML(id: number, text: string): void { + fs.writeFileSync(`${this.executionPath}/${id}.json`, text, "utf8"); + } + + private _writeRecipeHTML(id: number, text: string): void { + fs.writeFileSync(`${this.recipePath}/${id}.json`, text, "utf8"); + } + + private _writeMainHTML(text: string): void { + fs.writeFileSync(`${this.planPath}/index.html`, text, "utf8"); + } + + private _ensureDirectoryStructure(): void { + fs.ensureDirSync(this.recipePath); + fs.ensureDirSync(this.executionPath); + } +} diff --git a/packages/hardhat-plugin/src/plan/templates/index.html b/packages/hardhat-plugin/src/plan/templates/index.html new file mode 100644 index 0000000000..14e2c26727 --- /dev/null +++ b/packages/hardhat-plugin/src/plan/templates/index.html @@ -0,0 +1,10 @@ + + + + + + $ + + \ No newline at end of file diff --git a/packages/hardhat-plugin/src/plan/templates/vertex.html b/packages/hardhat-plugin/src/plan/templates/vertex.html new file mode 100644 index 0000000000..0fc12c275c --- /dev/null +++ b/packages/hardhat-plugin/src/plan/templates/vertex.html @@ -0,0 +1,5 @@ + + + $ + + \ No newline at end of file diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts new file mode 100644 index 0000000000..a71a4b5d2c --- /dev/null +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -0,0 +1,40 @@ +import type { VertexGraph } from "@nomicfoundation/ignition-core"; + +export function graphToMermaid(graph: VertexGraph, path: string): string { + const vertexes = [...graph.vertexes.values()]; + + const nodeDefinitions = vertexes.map((v) => `${v.id}[${v.label}]`).join("\n"); + + const connectionDefinitions = graph + .getEdges() + .map(({ from, to }) => `${from} --> ${to}`) + .join("\n"); + + const linkDefinitions = vertexes + .map((v) => `click ${v.id} "${path}/${v.id}.json" _self`) + .join("\n"); + + return `${nodeDefinitions}\n${connectionDefinitions}\n${linkDefinitions}`; +} + +const div = ` +
+ $ +
+`; + +export function wrapInMermaidDiv(text: string): string { + return div.replace("$", text); +} + +const flowchart = ` +flowchart +subgraph $1 +direction TB +$2 +end +`; + +export function wrapInFlowchart(name: string, text: string): string { + return flowchart.replace("$1", name).replace("$2", text); +} From 6c4e57f4fd9727841230b72d98a429d480576cf5 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 14 Sep 2022 02:27:36 -0400 Subject: [PATCH 0091/1302] remove duplicated replace --- packages/hardhat-plugin/src/plan/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 13b9ef2854..0a5f81a3ff 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -50,7 +50,7 @@ export class Renderer { public write(): void { const mainOutput = this.getIndexOutput(); - this._writeMainHTML(this.htmlTemplate.replace("$", mainOutput)); + this._writeMainHTML(mainOutput); // the stringify in these loops is just a first draft version // they'll be full html pages with styles at some point From 4cdc99fae2b55a16ee385c3858a2f516285e1690 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 21 Sep 2022 03:37:55 -0400 Subject: [PATCH 0092/1302] base plan tests --- packages/hardhat-plugin/package.json | 6 +- packages/hardhat-plugin/test/plan.ts | 47 ---------- packages/hardhat-plugin/test/plan/index.ts | 85 +++++++++++++++++++ .../hardhat-plugin/test/plan/plan-utils.ts | 66 ++++++++++++++ packages/hardhat-plugin/test/plan/renderer.ts | 37 ++++++++ packages/hardhat-plugin/test/setup.ts | 5 ++ yarn.lock | 25 +++++- 7 files changed, 219 insertions(+), 52 deletions(-) delete mode 100644 packages/hardhat-plugin/test/plan.ts create mode 100644 packages/hardhat-plugin/test/plan/index.ts create mode 100644 packages/hardhat-plugin/test/plan/plan-utils.ts create mode 100644 packages/hardhat-plugin/test/plan/renderer.ts diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 134f29616b..3a5fb2803d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -17,14 +17,15 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/ignition-core": "^0.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", + "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", @@ -39,12 +40,13 @@ "nyc": "15.1.0", "prettier": "2.4.1", "rimraf": "3.0.2", + "sinon": "^14.0.0", "ts-node": "10.8.1", "typescript": "^4.7.4" }, "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/ignition-core": "^0.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.10.0" }, "dependencies": { diff --git a/packages/hardhat-plugin/test/plan.ts b/packages/hardhat-plugin/test/plan.ts deleted file mode 100644 index bb9af52397..0000000000 --- a/packages/hardhat-plugin/test/plan.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { - buildRecipe, - IRecipeGraphBuilder, - FutureDict, -} from "@nomicfoundation/ignition-core"; - -import { mineBlocks } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe("plan", () => { - useEnvironment("minimal"); - - it("should be able to deploy a contract", async function () { - const result = await plan(this.hre, (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); - - m.call(usesContract, "setAddress", { - args: [bar], - }); - - return { bar, usesContract }; - }); - - console.log(result); - }); -}); - -async function plan( - hre: any, - recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict -): Promise { - await hre.run("compile", { quiet: true }); - - const userRecipe = buildRecipe("MyRecipe", recipeDefinition); - - const planPromise = hre.ignition.plan(userRecipe); - - await mineBlocks(hre, [1, 1, 1], planPromise); - - const result = await planPromise; - - return result; -} diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts new file mode 100644 index 0000000000..3442c5bab7 --- /dev/null +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -0,0 +1,85 @@ +/* eslint-disable import/no-unused-modules */ +import { buildRecipe } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { Renderer } from "../../src/plan"; +import { useEnvironment } from "../useEnvironment"; + +describe("plan", () => { + useEnvironment("minimal"); + + it("should create a plan", async function () { + await this.hre.run("compile", { quiet: true }); + + const recipe = buildRecipe("MyRecipe", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; + }); + + const plan = await this.hre.ignition.plan(recipe); + + const renderer = new Renderer(plan, { + cachePath: this.hre.config.paths.cache, + }); + + // a little hacky, but it works *shrug* + assert.equal( + renderer.getIndexOutput().replace(/\s/g, ""), + planOutput.replace(/\s/g, "") + ); + }); +}); + +const planOutput = ` + + + + + +
+ +flowchart +subgraph RecipeGraph +direction TB +0[Bar] +1[UsesContract] +2[UsesContract/setAddress] +0 --> 2 +1 --> 2 +click 0 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/0.json" _self +click 1 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/1.json" _self +click 2 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/2.json" _self +end + +
+ + +
+ +flowchart +subgraph ExecutionGraph +direction TB +0[Bar] +1[UsesContract] +2[UsesContract/setAddress] +0 --> 2 +1 --> 2 +click 0 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/0.json" _self +click 1 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/1.json" _self +click 2 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/2.json" _self +end + +
+ + +`; diff --git a/packages/hardhat-plugin/test/plan/plan-utils.ts b/packages/hardhat-plugin/test/plan/plan-utils.ts new file mode 100644 index 0000000000..f2e02680ef --- /dev/null +++ b/packages/hardhat-plugin/test/plan/plan-utils.ts @@ -0,0 +1,66 @@ +/* eslint-disable import/no-unused-modules */ +import type { VertexGraph } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + graphToMermaid, + wrapInFlowchart, + wrapInMermaidDiv, +} from "../../src/plan/utils"; + +describe("plan utils", () => { + describe("graphToMermaid", () => { + it("should convert a given graph to mermaid definitions", () => { + const graph: VertexGraph = { + vertexes: new Map([ + [0, { id: 0, label: "Foo" }], + [1, { id: 1, label: "Bar" }], + ]), + adjacencyList: new Map([ + [0, new Set([1])], + [1, new Set()], + ]), + getEdges() { + return [{ from: 0, to: 1 }]; + }, + }; + + assert.equal( + graphToMermaid(graph, "test/path"), + `0[Foo] +1[Bar] +0 --> 1 +click 0 "test/path/0.json" _self +click 1 "test/path/1.json" _self` + ); + }); + }); + + describe("wrapInFlowchart", () => { + it("should wrap given text in mermaid flowchart markup", () => { + assert.equal( + wrapInFlowchart("name", "text"), + ` +flowchart +subgraph name +direction TB +text +end +` + ); + }); + }); + + describe("wrapInMermaidDiv", () => { + it("should wrap given text in mermaid html markup", () => { + assert.equal( + wrapInMermaidDiv("text"), + ` +
+ text +
+` + ); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts new file mode 100644 index 0000000000..41dae0f0b0 --- /dev/null +++ b/packages/hardhat-plugin/test/plan/renderer.ts @@ -0,0 +1,37 @@ +/* eslint-disable import/no-unused-modules */ +import type { IgnitionPlan } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import fs from "fs-extra"; +import sinon from "sinon"; + +import { Renderer } from "../../src/plan"; +import { useEnvironment } from "../useEnvironment"; + +describe("Renderer", () => { + useEnvironment("minimal"); + + it("should ensure the directory structure exists", () => { + const fake = sinon.fake(); + + sinon.replace(fs, "ensureDirSync", fake); + + new Renderer({} as IgnitionPlan, { cachePath: "test/path" }); + + assert(fake.callCount === 2); + sinon.assert.calledWithMatch(fake.getCalls()[0], "/test/path/plan/recipe"); + sinon.assert.calledWithMatch( + fake.getCalls()[1], + "/test/path/plan/execution" + ); + }); + + it("should return the proper paths", () => { + const renderer = new Renderer({} as IgnitionPlan, { + cachePath: "test/path", + }); + + assert(renderer.planPath.endsWith("/test/path/plan")); + assert(renderer.recipePath.endsWith("/test/path/plan/recipe")); + assert(renderer.executionPath.endsWith("/test/path/plan/execution")); + }); +}); diff --git a/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-plugin/test/setup.ts index 293d0d9c78..69cdaf24d5 100644 --- a/packages/hardhat-plugin/test/setup.ts +++ b/packages/hardhat-plugin/test/setup.ts @@ -1,5 +1,10 @@ /* eslint-disable import/no-unused-modules */ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; chai.use(chaiAsPromised); + +afterEach(() => { + sinon.restore(); +}); diff --git a/yarn.lock b/yarn.lock index ed65e0238e..5c837079e4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -882,7 +882,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@>=5": +"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== @@ -896,7 +896,7 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^6.0.2": +"@sinonjs/samsam@^6.0.2", "@sinonjs/samsam@^6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== @@ -1089,6 +1089,13 @@ dependencies: "@types/node" "*" +"@types/sinon@^10.0.13": + version "10.0.13" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" + integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== + dependencies: + "@types/sinonjs__fake-timers" "*" + "@types/sinon@^10.0.6": version "10.0.11" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" @@ -3873,7 +3880,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.0: +nise@^5.1.0, nise@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== @@ -4641,6 +4648,18 @@ sinon@^12.0.1: nise "^5.1.0" supports-color "^7.2.0" +sinon@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.0.tgz#203731c116d3a2d58dc4e3cbe1f443ba9382a031" + integrity sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw== + dependencies: + "@sinonjs/commons" "^1.8.3" + "@sinonjs/fake-timers" "^9.1.2" + "@sinonjs/samsam" "^6.1.1" + diff "^5.0.0" + nise "^5.1.1" + supports-color "^7.2.0" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" From 50050fe0ae413006b97a9e856ef0aba4e382695d Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 21 Sep 2022 03:49:42 -0400 Subject: [PATCH 0093/1302] fix broken test --- packages/hardhat-plugin/test/plan/index.ts | 57 ++-------------------- 1 file changed, 5 insertions(+), 52 deletions(-) diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 3442c5bab7..c2df8314e8 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { Renderer } from "../../src/plan"; import { useEnvironment } from "../useEnvironment"; -describe("plan", () => { +describe.only("plan", () => { useEnvironment("minimal"); it("should create a plan", async function () { @@ -30,56 +30,9 @@ describe("plan", () => { cachePath: this.hre.config.paths.cache, }); - // a little hacky, but it works *shrug* - assert.equal( - renderer.getIndexOutput().replace(/\s/g, ""), - planOutput.replace(/\s/g, "") - ); + const output = renderer.getIndexOutput(); + + // not sure this is the best way to test this, but it works for now + assert(output.trim().startsWith("")); }); }); - -const planOutput = ` - - - - - -
- -flowchart -subgraph RecipeGraph -direction TB -0[Bar] -1[UsesContract] -2[UsesContract/setAddress] -0 --> 2 -1 --> 2 -click 0 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/0.json" _self -click 1 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/1.json" _self -click 2 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/recipe/2.json" _self -end - -
- - -
- -flowchart -subgraph ExecutionGraph -direction TB -0[Bar] -1[UsesContract] -2[UsesContract/setAddress] -0 --> 2 -1 --> 2 -click 0 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/0.json" _self -click 1 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/1.json" _self -click 2 "/Users/morgan/ignition/packages/hardhat-plugin/test/fixture-projects/minimal/cache/plan/execution/2.json" _self -end - -
- - -`; From 8246d8aae3712f69af5149ecd1291613103b3475 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 21 Sep 2022 03:51:44 -0400 Subject: [PATCH 0094/1302] remove missed .only --- packages/hardhat-plugin/test/plan/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index c2df8314e8..ed5bc2b75d 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { Renderer } from "../../src/plan"; import { useEnvironment } from "../useEnvironment"; -describe.only("plan", () => { +describe("plan", () => { useEnvironment("minimal"); it("should create a plan", async function () { From 358feff646ae63438785df8b3a26646ef177732f Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 21 Sep 2022 11:59:41 -0400 Subject: [PATCH 0095/1302] fix path test on windows --- packages/hardhat-plugin/test/plan/renderer.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts index 41dae0f0b0..e392ea9a9d 100644 --- a/packages/hardhat-plugin/test/plan/renderer.ts +++ b/packages/hardhat-plugin/test/plan/renderer.ts @@ -2,6 +2,7 @@ import type { IgnitionPlan } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import fs from "fs-extra"; +import path from "path"; import sinon from "sinon"; import { Renderer } from "../../src/plan"; @@ -18,10 +19,13 @@ describe("Renderer", () => { new Renderer({} as IgnitionPlan, { cachePath: "test/path" }); assert(fake.callCount === 2); - sinon.assert.calledWithMatch(fake.getCalls()[0], "/test/path/plan/recipe"); + sinon.assert.calledWithMatch( + fake.getCalls()[0], + path.resolve("/test/path/plan/recipe") + ); sinon.assert.calledWithMatch( fake.getCalls()[1], - "/test/path/plan/execution" + path.resolve("/test/path/plan/execution") ); }); @@ -30,8 +34,12 @@ describe("Renderer", () => { cachePath: "test/path", }); - assert(renderer.planPath.endsWith("/test/path/plan")); - assert(renderer.recipePath.endsWith("/test/path/plan/recipe")); - assert(renderer.executionPath.endsWith("/test/path/plan/execution")); + assert(renderer.planPath.endsWith(path.resolve("/test/path/plan"))); + assert( + renderer.recipePath.endsWith(path.resolve("/test/path/plan/recipe")) + ); + assert( + renderer.executionPath.endsWith(path.resolve("/test/path/plan/execution")) + ); }); }); From e2f4ed5db452205bde491e0ade2328e893639706 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 18:21:51 -0400 Subject: [PATCH 0096/1302] add testing for mermaid substitution --- packages/hardhat-plugin/test/plan/index.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index ed5bc2b75d..8531ac36ea 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -34,5 +34,7 @@ describe("plan", () => { // not sure this is the best way to test this, but it works for now assert(output.trim().startsWith("")); + assert(/subgraph RecipeGraph/g.test(output)); + assert(/subgraph ExecutionGraph/g.test(output)); }); }); From 5d8a94a94bc4a5e7f1b54c394a4aaabb3ec7f3b9 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 18:27:13 -0400 Subject: [PATCH 0097/1302] increase timeout --- packages/hardhat-plugin/.mocharc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json index ba6d32adfe..6928268738 100644 --- a/packages/hardhat-plugin/.mocharc.json +++ b/packages/hardhat-plugin/.mocharc.json @@ -1,5 +1,5 @@ { "require": "ts-node/register/transpile-only", "file": "./test/setup.ts", - "timeout": 5000 + "timeout": 10000 } From c192057e59c87ef5786a036543b63dd2973e0684 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 18:37:27 -0400 Subject: [PATCH 0098/1302] adding logs for windows debugging --- packages/hardhat-plugin/test/plan/renderer.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts index e392ea9a9d..3880f39472 100644 --- a/packages/hardhat-plugin/test/plan/renderer.ts +++ b/packages/hardhat-plugin/test/plan/renderer.ts @@ -18,6 +18,8 @@ describe("Renderer", () => { new Renderer({} as IgnitionPlan, { cachePath: "test/path" }); + console.log("fake.getCalls()[0].args[0]"); + console.log(fake.getCalls()[0].args[0]); assert(fake.callCount === 2); sinon.assert.calledWithMatch( fake.getCalls()[0], @@ -34,6 +36,10 @@ describe("Renderer", () => { cachePath: "test/path", }); + console.log("renderer.planPath"); + console.log(renderer.planPath); + console.log("renderer.recipePath"); + console.log(renderer.recipePath); assert(renderer.planPath.endsWith(path.resolve("/test/path/plan"))); assert( renderer.recipePath.endsWith(path.resolve("/test/path/plan/recipe")) From 6f61493fde6edfc01a223217753581aa28b991e6 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 18:44:58 -0400 Subject: [PATCH 0099/1302] more logs --- packages/hardhat-plugin/test/plan/renderer.ts | 23 +++++++++++-------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts index 3880f39472..09a9d400e6 100644 --- a/packages/hardhat-plugin/test/plan/renderer.ts +++ b/packages/hardhat-plugin/test/plan/renderer.ts @@ -21,13 +21,15 @@ describe("Renderer", () => { console.log("fake.getCalls()[0].args[0]"); console.log(fake.getCalls()[0].args[0]); assert(fake.callCount === 2); - sinon.assert.calledWithMatch( - fake.getCalls()[0], - path.resolve("/test/path/plan/recipe") + assert( + fake + .getCalls()[0] + .args[0].endsWith(path.normalize("/test/path/plan/recipe")) ); - sinon.assert.calledWithMatch( - fake.getCalls()[1], - path.resolve("/test/path/plan/execution") + assert( + fake + .getCalls()[1] + .args[0].endsWith(path.normalize("/test/path/plan/execution")) ); }); @@ -40,12 +42,15 @@ describe("Renderer", () => { console.log(renderer.planPath); console.log("renderer.recipePath"); console.log(renderer.recipePath); - assert(renderer.planPath.endsWith(path.resolve("/test/path/plan"))); + console.log(path.normalize("/test/path/plan/recipe")); + assert(renderer.planPath.endsWith(path.normalize("/test/path/plan"))); assert( - renderer.recipePath.endsWith(path.resolve("/test/path/plan/recipe")) + renderer.recipePath.endsWith(path.normalize("/test/path/plan/recipe")) ); assert( - renderer.executionPath.endsWith(path.resolve("/test/path/plan/execution")) + renderer.executionPath.endsWith( + path.normalize("/test/path/plan/execution") + ) ); }); }); From c7c717b38ea95114ddbfa89b4c1e74775b3e4018 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 18:49:54 -0400 Subject: [PATCH 0100/1302] removing debug logs --- packages/hardhat-plugin/test/plan/renderer.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts index 09a9d400e6..bd808c8716 100644 --- a/packages/hardhat-plugin/test/plan/renderer.ts +++ b/packages/hardhat-plugin/test/plan/renderer.ts @@ -18,8 +18,6 @@ describe("Renderer", () => { new Renderer({} as IgnitionPlan, { cachePath: "test/path" }); - console.log("fake.getCalls()[0].args[0]"); - console.log(fake.getCalls()[0].args[0]); assert(fake.callCount === 2); assert( fake @@ -38,11 +36,6 @@ describe("Renderer", () => { cachePath: "test/path", }); - console.log("renderer.planPath"); - console.log(renderer.planPath); - console.log("renderer.recipePath"); - console.log(renderer.recipePath); - console.log(path.normalize("/test/path/plan/recipe")); assert(renderer.planPath.endsWith(path.normalize("/test/path/plan"))); assert( renderer.recipePath.endsWith(path.normalize("/test/path/plan/recipe")) From 03d0094bfa921bdef5165e36a6c94baede255788 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 19:38:42 -0400 Subject: [PATCH 0101/1302] fix build output pathing --- packages/core/package.json | 2 +- packages/core/post-build.js | 2 +- packages/core/tsconfig.json | 4 +--- packages/hardhat-plugin/package.json | 7 ++++--- packages/hardhat-plugin/tsconfig.json | 4 +--- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index f4a494f6c8..ea19218f58 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,7 @@ "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", - "main": "dist/src/index.js", + "main": "dist/index.js", "scripts": { "build": "tsc && node ./post-build.js", "lint": "yarn prettier --check && yarn eslint", diff --git a/packages/core/post-build.js b/packages/core/post-build.js index b60fb2ad5a..86449c38fc 100644 --- a/packages/core/post-build.js +++ b/packages/core/post-build.js @@ -14,7 +14,7 @@ const { const configDir = dirname(configFile); const basePath = resolve(configDir, baseUrl); -const outPath = resolve(__dirname, "dist", "src"); +const outPath = resolve(__dirname, "dist"); const outFileToSrcFile = (x) => resolve(srcRoot, relative(outPath, x)); diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 2ea9c1b990..60beab510c 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -3,7 +3,6 @@ "target": "ES2017", "module": "commonjs", "incremental": true, - "rootDirs": ["./src", "./test"], "outDir": "./dist", "declaration": true, "declarationMap": true, @@ -16,6 +15,5 @@ "*": ["*"] } }, - "exclude": ["dist", "node_modules"], - "include": ["./test", "./src"] + "exclude": ["dist", "node_modules", "ui-samples", "test"] } diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 134f29616b..7df49a5dfd 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -3,7 +3,7 @@ "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", - "main": "dist/src/index.js", + "main": "dist/index.js", "scripts": { "build": "tsc", "lint": "yarn prettier --check && yarn eslint", @@ -17,8 +17,8 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/ignition-core": "^0.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", @@ -29,6 +29,7 @@ "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", "chai-as-promised": "7.1.1", + "esbuild": "^0.15.9", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", "eslint-plugin-import": "2.24.2", @@ -43,8 +44,8 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.2", "@nomicfoundation/ignition-core": "^0.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.10.0" }, "dependencies": { diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index b594e9bef3..f38e317758 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -3,7 +3,6 @@ "target": "ES2017", "module": "commonjs", "incremental": true, - "rootDirs": ["./src", "./test"], "outDir": "./dist", "declaration": true, "declarationMap": true, @@ -11,6 +10,5 @@ "strict": true, "esModuleInterop": true }, - "exclude": ["dist", "node_modules"], - "include": ["./test", "./src"] + "exclude": ["dist", "node_modules", "test"] } From c1cc5dddc248f44b09b1469f8248d8fba8271b9a Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 20:37:57 -0400 Subject: [PATCH 0102/1302] added esbuild script for plan task --- packages/hardhat-plugin/esbuild.js | 19 + packages/hardhat-plugin/package.json | 4 +- .../hardhat-plugin/src/plan/assets/bundle.ts | 3 + .../hardhat-plugin/src/plan/assets/index.html | 9 + .../hardhat-plugin/src/plan/assets/main.css | 5 + .../plan/{templates => assets}/vertex.html | 0 .../src/plan/templates/index.html | 10 - packages/hardhat-plugin/tsconfig.json | 2 +- yarn.lock | 745 +++++++++++++++++- 9 files changed, 782 insertions(+), 15 deletions(-) create mode 100644 packages/hardhat-plugin/esbuild.js create mode 100644 packages/hardhat-plugin/src/plan/assets/bundle.ts create mode 100644 packages/hardhat-plugin/src/plan/assets/index.html create mode 100644 packages/hardhat-plugin/src/plan/assets/main.css rename packages/hardhat-plugin/src/plan/{templates => assets}/vertex.html (100%) delete mode 100644 packages/hardhat-plugin/src/plan/templates/index.html diff --git a/packages/hardhat-plugin/esbuild.js b/packages/hardhat-plugin/esbuild.js new file mode 100644 index 0000000000..05b0498e81 --- /dev/null +++ b/packages/hardhat-plugin/esbuild.js @@ -0,0 +1,19 @@ +const esbuild = require("esbuild"); +const path = require("path"); + +const outdir = path.resolve(__dirname, "dist/plan/assets"); +const srcdir = path.resolve(__dirname, "src/plan/assets"); + +esbuild.build({ + outdir, + entryPoints: [ + path.resolve(srcdir, "bundle.ts"), + path.resolve(srcdir, "main.css"), + path.resolve(srcdir, "index.html"), + path.resolve(srcdir, "vertex.html"), + ], + bundle: true, + loader: { + ".html": "copy", + }, +}); diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 7df49a5dfd..199cfadba0 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -5,7 +5,7 @@ "author": "Nomic Foundation", "main": "dist/index.js", "scripts": { - "build": "tsc", + "build": "tsc && node ./esbuild.js", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", @@ -23,6 +23,7 @@ "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", + "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", "@typescript-eslint/eslint-plugin": "4.31.2", @@ -36,6 +37,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "hardhat": "^2.10.0", + "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", "prettier": "2.4.1", diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts new file mode 100644 index 0000000000..725c7197ee --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -0,0 +1,3 @@ +import mermaid from "mermaid"; + +mermaid.initialize({ startOnLoad: true, securityLevel: "loose" }); diff --git a/packages/hardhat-plugin/src/plan/assets/index.html b/packages/hardhat-plugin/src/plan/assets/index.html new file mode 100644 index 0000000000..287c04450f --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/index.html @@ -0,0 +1,9 @@ + + + + + + $ + + + \ No newline at end of file diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css new file mode 100644 index 0000000000..b492f9db12 --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -0,0 +1,5 @@ +.test { + width: 100px; + height: 100px; + border: 1px solid red; +} diff --git a/packages/hardhat-plugin/src/plan/templates/vertex.html b/packages/hardhat-plugin/src/plan/assets/vertex.html similarity index 100% rename from packages/hardhat-plugin/src/plan/templates/vertex.html rename to packages/hardhat-plugin/src/plan/assets/vertex.html diff --git a/packages/hardhat-plugin/src/plan/templates/index.html b/packages/hardhat-plugin/src/plan/templates/index.html deleted file mode 100644 index 14e2c26727..0000000000 --- a/packages/hardhat-plugin/src/plan/templates/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - $ - - \ No newline at end of file diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index f38e317758..5195bbf618 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -10,5 +10,5 @@ "strict": true, "esModuleInterop": true }, - "exclude": ["dist", "node_modules", "test"] + "exclude": ["dist", "node_modules", "test", "src/plan/assets"] } diff --git a/yarn.lock b/yarn.lock index ed65e0238e..bb49362191 100644 --- a/yarn.lock +++ b/yarn.lock @@ -190,6 +190,11 @@ "@babel/helper-validator-identifier" "^7.16.7" to-fast-properties "^2.0.0" +"@braintree/sanitize-url@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" + integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== + "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" @@ -197,6 +202,16 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@esbuild/android-arm@0.15.9": + version "0.15.9" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.9.tgz#7e1221604ab88ed5021ead74fa8cca4405e1e431" + integrity sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ== + +"@esbuild/linux-loong64@0.15.9": + version "0.15.9" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz#b658a97babf1f40783354af7039b84c3fdfc3fc3" + integrity sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -1031,6 +1046,11 @@ resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== +"@types/mermaid@^9.1.0": + version "9.1.0" + resolved "https://registry.yarnpkg.com/@types/mermaid/-/mermaid-9.1.0.tgz#e9ba511d8a6793749d6be84f86325f0f58553154" + integrity sha512-rc8QqhveKAY7PouzY/p8ljS+eBSNCv7o79L97RSub/Ic2SQ34ph1Ng3s8wFLWVjvaEt6RLOWtSCsgYWd95NY8A== + "@types/mocha@^9.0.0": version "9.1.1" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" @@ -1777,11 +1797,21 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +commander@2: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + commander@3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== +commander@7: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -1872,6 +1902,516 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== +d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: + version "1.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" + integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== + +"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14" + integrity sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g== + dependencies: + internmap "1 - 2" + +d3-axis@1: + version "1.0.12" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" + integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== + +d3-axis@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" + integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== + +d3-brush@1: + version "1.1.6" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" + integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-brush@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" + integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "3" + d3-transition "3" + +d3-chord@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" + integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== + dependencies: + d3-array "1" + d3-path "1" + +d3-chord@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" + integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== + dependencies: + d3-path "1 - 3" + +d3-collection@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" + integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== + +d3-color@1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" + integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== + +"d3-color@1 - 3", d3-color@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" + integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== + +d3-contour@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" + integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== + dependencies: + d3-array "^1.1.1" + +d3-contour@4: + version "4.0.0" + resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.0.tgz#5a1337c6da0d528479acdb5db54bc81a0ff2ec6b" + integrity sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw== + dependencies: + d3-array "^3.2.0" + +d3-delaunay@6: + version "6.0.2" + resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" + integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== + dependencies: + delaunator "5" + +d3-dispatch@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" + integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== + +"d3-dispatch@1 - 3", d3-dispatch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== + +d3-drag@1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" + integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== + dependencies: + d3-dispatch "1" + d3-selection "1" + +"d3-drag@2 - 3", d3-drag@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" + integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== + dependencies: + d3-dispatch "1 - 3" + d3-selection "3" + +d3-dsv@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" + integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== + dependencies: + commander "2" + iconv-lite "0.4" + rw "1" + +"d3-dsv@1 - 3", d3-dsv@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" + +d3-ease@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" + integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== + +"d3-ease@1 - 3", d3-ease@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" + integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== + +d3-fetch@1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" + integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== + dependencies: + d3-dsv "1" + +d3-fetch@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force@1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" + integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== + dependencies: + d3-collection "1" + d3-dispatch "1" + d3-quadtree "1" + d3-timer "1" + +d3-force@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +d3-format@1: + version "1.4.5" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" + integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== + +"d3-format@1 - 3", d3-format@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" + integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== + +d3-geo@1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" + integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== + dependencies: + d3-array "1" + +d3-geo@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" + integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@1: + version "1.1.9" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" + integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== + +d3-hierarchy@3: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +d3-interpolate@1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" + integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== + dependencies: + d3-color "1" + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" + integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== + dependencies: + d3-color "1 - 3" + +d3-path@1: + version "1.0.9" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" + integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== + +"d3-path@1 - 3", d3-path@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" + integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== + +d3-polygon@1: + version "1.0.6" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" + integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== + +d3-polygon@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" + integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== + +d3-quadtree@1: + version "1.0.7" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" + integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== + +"d3-quadtree@1 - 3", d3-quadtree@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" + integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== + +d3-random@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-scale-chromatic@1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" + integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== + dependencies: + d3-color "1" + d3-interpolate "1" + +d3-scale-chromatic@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" + integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" + +d3-scale@2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" + integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== + dependencies: + d3-array "^1.2.0" + d3-collection "1" + d3-format "1" + d3-interpolate "1" + d3-time "1" + d3-time-format "2" + +d3-scale@4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" + integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== + dependencies: + d3-array "2.10.0 - 3" + d3-format "1 - 3" + d3-interpolate "1.2.0 - 3" + d3-time "2.1.1 - 3" + d3-time-format "2 - 4" + +d3-selection@1, d3-selection@^1.1.0: + version "1.4.2" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" + integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== + +"d3-selection@2 - 3", d3-selection@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" + integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== + +d3-shape@1: + version "1.3.7" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" + integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== + dependencies: + d3-path "1" + +d3-shape@3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" + integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== + dependencies: + d3-path "1 - 3" + +d3-time-format@2: + version "2.3.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" + integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== + dependencies: + d3-time "1" + +"d3-time-format@2 - 4", d3-time-format@4: + version "4.1.0" + resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" + integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== + dependencies: + d3-time "1 - 3" + +d3-time@1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" + integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== + +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" + integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== + dependencies: + d3-array "2 - 3" + +d3-timer@1: + version "1.0.10" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" + integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== + +"d3-timer@1 - 3", d3-timer@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" + integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== + +d3-transition@1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" + integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== + dependencies: + d3-color "1" + d3-dispatch "1" + d3-ease "1" + d3-interpolate "1" + d3-selection "^1.1.0" + d3-timer "1" + +"d3-transition@2 - 3", d3-transition@3: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" + integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== + dependencies: + d3-color "1 - 3" + d3-dispatch "1 - 3" + d3-ease "1 - 3" + d3-interpolate "1 - 3" + d3-timer "1 - 3" + +d3-voronoi@1: + version "1.1.4" + resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" + integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== + +d3-zoom@1: + version "1.8.3" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" + integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== + dependencies: + d3-dispatch "1" + d3-drag "1" + d3-interpolate "1" + d3-selection "1" + d3-transition "1" + +d3-zoom@3: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" + integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== + dependencies: + d3-dispatch "1 - 3" + d3-drag "2 - 3" + d3-interpolate "1 - 3" + d3-selection "2 - 3" + d3-transition "2 - 3" + +d3@^5.14: + version "5.16.0" + resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" + integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== + dependencies: + d3-array "1" + d3-axis "1" + d3-brush "1" + d3-chord "1" + d3-collection "1" + d3-color "1" + d3-contour "1" + d3-dispatch "1" + d3-drag "1" + d3-dsv "1" + d3-ease "1" + d3-fetch "1" + d3-force "1" + d3-format "1" + d3-geo "1" + d3-hierarchy "1" + d3-interpolate "1" + d3-path "1" + d3-polygon "1" + d3-quadtree "1" + d3-random "1" + d3-scale "2" + d3-scale-chromatic "1" + d3-selection "1" + d3-shape "1" + d3-time "1" + d3-time-format "2" + d3-timer "1" + d3-transition "1" + d3-voronoi "1" + d3-zoom "1" + +d3@^7.0.0: + version "7.6.1" + resolved "https://registry.yarnpkg.com/d3/-/d3-7.6.1.tgz#b21af9563485ed472802f8c611cc43be6c37c40c" + integrity sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw== + dependencies: + d3-array "3" + d3-axis "3" + d3-brush "3" + d3-chord "3" + d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" + d3-fetch "3" + d3-force "3" + d3-format "3" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" + d3-polygon "3" + d3-quadtree "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" + d3-selection "3" + d3-shape "3" + d3-time "3" + d3-time-format "4" + d3-timer "3" + d3-transition "3" + d3-zoom "3" + +dagre-d3@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" + integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ== + dependencies: + d3 "^5.14" + dagre "^0.8.5" + graphlib "^2.1.8" + lodash "^4.17.15" + +dagre@^0.8.5: + version "0.8.5" + resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" + integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== + dependencies: + graphlib "^2.1.8" + lodash "^4.17.15" + debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -1950,6 +2490,13 @@ define-properties@^1.1.3, define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" +delaunator@5: + version "5.0.0" + resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" + integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== + dependencies: + robust-predicates "^3.0.0" + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -1991,6 +2538,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dompurify@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.0.tgz#c9c88390f024c2823332615c9e20a453cf3825dd" + integrity sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA== + electron-to-chromium@^1.4.164: version "1.4.169" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz#d4b8cf9816566c7e9518128f1a97f39de9c7af9d" @@ -2120,6 +2672,134 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== +esbuild-android-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz#4a7eb320ca8d3a305f14792061fd9614ccebb7c0" + integrity sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw== + +esbuild-android-arm64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz#c948e5686df20857ad361ec67e070d40d7cab985" + integrity sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg== + +esbuild-darwin-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz#25f564fa4b39c1cec84dc46bce5634fdbce1d5e4" + integrity sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ== + +esbuild-darwin-arm64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz#60faea3ed95d15239536aa88d06bb82b29278a86" + integrity sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw== + +esbuild-freebsd-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz#0339ef1c90a919175e7816788224517896657a0e" + integrity sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A== + +esbuild-freebsd-arm64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz#32abfc0be3ae3dd38e5a86a9beadbbcf592f1b57" + integrity sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA== + +esbuild-linux-32@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz#93581348a4da7ed2b29bc5539f2605ad7fcee77b" + integrity sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg== + +esbuild-linux-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz#0d171e7946c95d0d3ed4826026af2c5632d7dcc4" + integrity sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ== + +esbuild-linux-arm64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz#9838795a3720cbe736d3bc20621bd366eac22f24" + integrity sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ== + +esbuild-linux-arm@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz#dce96cd817bc7376f6af3967649c4ab1f2f79506" + integrity sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ== + +esbuild-linux-mips64le@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz#0335a0739e61aa97cb9b4a018e3facfcca9cdcfd" + integrity sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw== + +esbuild-linux-ppc64le@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz#18482afb95b8a705e2da0a59d7131bff221281f9" + integrity sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw== + +esbuild-linux-riscv64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz#03b6f9708272c117006b9ce1c9ae8aab91b5a5b6" + integrity sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA== + +esbuild-linux-s390x@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz#65fb645623d575780f155f0ee52935e62f9cca4f" + integrity sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw== + +esbuild-netbsd-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz#7894297bb9e11f3d2f6f31efecd1be4e181f0d54" + integrity sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw== + +esbuild-openbsd-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz#0f9d4c6b6772ae50d491d68ad4cc028300dda7c0" + integrity sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A== + +esbuild-sunos-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz#c32b7ce574b08f814de810ce7c1e34b843768126" + integrity sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ== + +esbuild-windows-32@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz#37a8f7cfccdb2177cd46613a1a1e1fcb419d36df" + integrity sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA== + +esbuild-windows-64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz#5fe1e76fc13dd7f520febecaea110b6f1649c7b2" + integrity sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg== + +esbuild-windows-arm64@0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz#98504428f7ba7d2cfc11940be68ee1139173fdce" + integrity sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA== + +esbuild@^0.15.9: + version "0.15.9" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.9.tgz#33fb18b67b85004b6f7616bec955ca4b3e58935d" + integrity sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg== + optionalDependencies: + "@esbuild/android-arm" "0.15.9" + "@esbuild/linux-loong64" "0.15.9" + esbuild-android-64 "0.15.9" + esbuild-android-arm64 "0.15.9" + esbuild-darwin-64 "0.15.9" + esbuild-darwin-arm64 "0.15.9" + esbuild-freebsd-64 "0.15.9" + esbuild-freebsd-arm64 "0.15.9" + esbuild-linux-32 "0.15.9" + esbuild-linux-64 "0.15.9" + esbuild-linux-arm "0.15.9" + esbuild-linux-arm64 "0.15.9" + esbuild-linux-mips64le "0.15.9" + esbuild-linux-ppc64le "0.15.9" + esbuild-linux-riscv64 "0.15.9" + esbuild-linux-s390x "0.15.9" + esbuild-netbsd-64 "0.15.9" + esbuild-openbsd-64 "0.15.9" + esbuild-sunos-64 "0.15.9" + esbuild-windows-32 "0.15.9" + esbuild-windows-64 "0.15.9" + esbuild-windows-arm64 "0.15.9" + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2806,6 +3486,13 @@ graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +graphlib@^2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" + integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== + dependencies: + lodash "^4.17.15" + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -2974,13 +3661,20 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" -iconv-lite@0.4.24: +iconv-lite@0.4, iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@0.6: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" @@ -3087,6 +3781,11 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +"internmap@1 - 2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" + integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== + io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -3459,6 +4158,11 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +khroma@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" + integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -3605,7 +4309,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3716,6 +4420,21 @@ merkle-patricia-tree@^4.2.4: readable-stream "^3.6.0" semaphore-async-await "^1.5.1" +mermaid@^9.1.7: + version "9.1.7" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.7.tgz#e24de9b2d36c8cb25a09d72ffce966941b24bd6e" + integrity sha512-MRVHXy5FLjnUQUG7YS3UN9jEN6FXCJbFCXVGJQjVIbiR6Vhw0j/6pLIjqsiah9xoHmQU6DEaKOvB3S1g/1nBPA== + dependencies: + "@braintree/sanitize-url" "^6.0.0" + d3 "^7.0.0" + dagre "^0.8.5" + dagre-d3 "^0.6.4" + dompurify "2.4.0" + graphlib "^2.1.8" + khroma "^2.0.0" + moment-mini "2.24.0" + stylis "^4.0.10" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -3838,6 +4557,11 @@ mocha@^9.1.1, mocha@^9.1.3: yargs-parser "20.2.4" yargs-unparser "2.0.0" +moment-mini@2.24.0: + version "2.24.0" + resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" + integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ== + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -4485,6 +5209,11 @@ rlp@^2.2.3, rlp@^2.2.4: dependencies: bn.js "^5.2.0" +robust-predicates@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" + integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -4497,6 +5226,11 @@ rustbn.js@~0.2.0: resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -4507,7 +5241,7 @@ safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3": +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -4850,6 +5584,11 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +stylis@^4.0.10: + version "4.1.2" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.2.tgz#870b3c1c2275f51b702bb3da9e94eedad87bba41" + integrity sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA== + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" From 2faeada98cda393be3334d00012c0d8596b8565f Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 23 Sep 2022 21:25:53 -0400 Subject: [PATCH 0103/1302] fix lint --- packages/core/.eslintrc.js | 1 + packages/hardhat-plugin/.eslintrc.js | 2 ++ 2 files changed, 3 insertions(+) diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index ac5d46159f..3367c1761f 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -5,6 +5,7 @@ module.exports = { parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", + createDefaultProgram: true, }, rules: { "no-console": "error", diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-plugin/.eslintrc.js index 1cd896e0af..18c757ea9d 100644 --- a/packages/hardhat-plugin/.eslintrc.js +++ b/packages/hardhat-plugin/.eslintrc.js @@ -5,5 +5,7 @@ module.exports = { parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", + createDefaultProgram: true, }, + ignorePatterns: ["**/assets/bundle.ts"], }; From c1d5d85cdaa3264c03f203dd5019d86d6f726b34 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Oct 2022 09:36:15 +0100 Subject: [PATCH 0104/1302] batching execution ign 33 (#37) The batching algo and its design is covered in more detail under: `./docs/design.md` Execution is now batched based on the dependencies of the execution graph. Each batch is formed by asking if there are unstarted nodes that have all there dependencies completed. A batch is then executed in parallel and run to completion. The results of the batch execution are then merged into the execution state and the deployment completed or a new batch formed. An error stops the execution after all other vertexes in the batch have completed/errored. The state management was updated across the app to better support the UI while execution. Now a Deployment class is used to capture the state associated with the deployment process. This is now threaded through execution graph creation and execution. As each step in the process completes, the result is merged with the Deployment state, and the ui is updated. The batcher similarly manipulates the Deployment state to determine the next batch, then executes it. Each vertex of the batch is triggered at the same time. The UI is updated on each vertex completing, but the batch is only complete when all vertexes in the batch are complete. The ink.js based UI has been moved from core to hardhat-plugin, with ignition now accepting a render func that takes the Deployment state as an arg and is triggered when the Deployment state is updated. --- .vscode/tasks.json | 19 ++ CONTRIBUTING.md | 4 +- docs/architecture.md | 33 -- docs/design.md | 237 +++++++++++++++ examples/simple/contracts/Foo.sol | 5 +- examples/simple/ignition/MyRecipe.js | 4 +- packages/core/package.json | 5 +- packages/core/src/Ignition.ts | 137 +++++---- packages/core/src/deployment/Deployment.ts | 174 +++++++++++ .../core/src/deployment/deployStateReducer.ts | 287 ++++++++++++++++++ packages/core/src/execution/batch/types.ts | 26 ++ packages/core/src/execution/batch/utils.ts | 15 + .../src/execution/batch/visitInBatches.ts | 136 +++++++++ .../execution/dispatch/executeContractCall.ts | 15 +- .../dispatch/executeContractDeploy.ts | 52 ++-- .../dispatch/executeLibraryDeploy.ts | 33 +- packages/core/src/execution/dispatch/utils.ts | 11 +- packages/core/src/execution/execute.ts | 66 +--- packages/core/src/index.ts | 17 +- packages/core/src/types/deployment.ts | 48 ++- packages/core/src/types/executionGraph.ts | 6 + packages/core/src/types/graph.ts | 22 +- packages/core/src/types/serialization.ts | 12 +- packages/core/src/ui/components/index.tsx | 102 ------- packages/core/src/ui/types.ts | 74 ----- packages/core/src/ui/ui-service.tsx | 28 -- packages/core/src/utils/serialize.ts | 6 +- packages/core/src/utils/sets.ts | 19 ++ packages/core/test/batch/visitInBatches.ts | 66 ++++ packages/core/test/execution.ts | 77 ++--- packages/core/tsconfig.json | 9 +- packages/core/ui-samples/index.tsx | 2 +- packages/hardhat-plugin/package.json | 5 +- .../hardhat-plugin/src/ignition-wrapper.ts | 90 ++---- packages/hardhat-plugin/src/index.ts | 10 +- .../src/ui/components/StartingPanel.tsx | 12 + .../ui/components/ValidationFailedPanel.tsx | 27 ++ .../components/execution/BatchExecution.tsx | 221 ++++++++++++++ .../src/ui/components/execution/Divider.tsx | 15 + .../components/execution/ExecutionPanel.tsx | 20 ++ .../ui/components/execution/FinalStatus.tsx | 121 ++++++++ .../components/execution/SummarySection.tsx | 18 ++ .../src/ui/components/index.tsx | 21 ++ .../hardhat-plugin/src/ui/renderToCli.tsx | 8 + packages/hardhat-plugin/src/ui/types.ts | 185 +++++++++++ packages/hardhat-plugin/test/params.ts | 3 +- packages/hardhat-plugin/tsconfig.json | 10 +- yarn.lock | 13 +- 48 files changed, 1969 insertions(+), 557 deletions(-) delete mode 100644 docs/architecture.md create mode 100644 docs/design.md create mode 100644 packages/core/src/deployment/Deployment.ts create mode 100644 packages/core/src/deployment/deployStateReducer.ts create mode 100644 packages/core/src/execution/batch/types.ts create mode 100644 packages/core/src/execution/batch/utils.ts create mode 100644 packages/core/src/execution/batch/visitInBatches.ts delete mode 100644 packages/core/src/ui/components/index.tsx delete mode 100644 packages/core/src/ui/types.ts delete mode 100644 packages/core/src/ui/ui-service.tsx create mode 100644 packages/core/src/utils/sets.ts create mode 100644 packages/core/test/batch/visitInBatches.ts create mode 100644 packages/hardhat-plugin/src/ui/components/StartingPanel.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/execution/Divider.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/index.tsx create mode 100644 packages/hardhat-plugin/src/ui/renderToCli.tsx create mode 100644 packages/hardhat-plugin/src/ui/types.ts diff --git a/.vscode/tasks.json b/.vscode/tasks.json index adbe0647ec..b08d826c16 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -13,6 +13,25 @@ "runOptions": { "runOn": "folderOpen" } + }, + { + "type": "npm", + "script": "build", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [], + "label": "npm: build", + "detail": "wsrun --exclude-missing --serial build", + "presentation": { + "echo": true, + "reveal": "silent", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + } } ] } diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5d8cb89f92..bd68f7f853 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,9 +15,9 @@ There are two packages: * [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments * [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library -## Architecture +## Design -An overview of the [architecture of the deploy process is explained here](./docs/architecture.md). +An overview of the [design of the deploy process is explained here](./docs/design.md). ## Setup diff --git a/docs/architecture.md b/docs/architecture.md deleted file mode 100644 index eeec26ed24..0000000000 --- a/docs/architecture.md +++ /dev/null @@ -1,33 +0,0 @@ -# Deploy Architecture - -Ignition expresses a deployment as a dependency graph of on-chain transactions, that is contract deployments and calls. Deployments and calls can be dependent on each other, for instance, a call to a contract requires the contract first being deployed; the call should not be invoked until the contract deploy has completed successfully. - -Ignition provides the **recipe api** (a js based dsl) so users can succintly describe of a dependency graph of contract deploys and calls. The user describes the dependency graph as a `Recipe`, a utility function that takes a graph builder as its first argument. - -## Deploying a Recipe - -```mermaid -flowchart LR - 0[User Recipe] - subgraph Ignition - 1[Build Recipe Graph] - 2[Validate Recipe Graph] - 3[Transform to Execution Graph] - 4[Execute] - end - 0 --> 1 - 1 --> 2 - 2 --> 3 - 3 --> 4 - ``` - -To deploy Ignition is invoked with a `Recipe`. Ignition uses the `Recipe` to build a `RecipeGraph`. This graph is then validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). A valid `RecipeGraph` will contain lots of **Hardhat** specific references. Ignition transforms and simplifies the `RecipeGraph` to an `ExecutionGraph`, turning **Hardhat** references into neutral ones e.g. a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. - -The `ExecutionGraph` determines what is executed on-chain. Ignition's execution engine uses the vertexes of the `ExecutionGraph` to determine what transactions should be sent, and uses the edges of the `ExecutionGraph` to determine how the transactions are ordered and batched. A transaction will not be included in the next batch until all it's dependencies have successfully completed. - -Either the entire graph of transactions will eventually succeed, in which case the deployment was a success. Or a transaction will fail or be stopped from completing, leading to a failed deployment. - - - - - diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 0000000000..9d295d1e11 --- /dev/null +++ b/docs/design.md @@ -0,0 +1,237 @@ +# Design + +## Overview + +Ignition allows users to describe complex deployments and execute them on-chain. + +```mermaid +flowchart LR + 0[User Recipe] + subgraph Ignition + 1[Build Recipe Graph] + 2[Validate Recipe Graph] + 3[Transform to Execution Graph] + 4[Execute] + end + 0 --> 1 + 1 --> 2 + 2 --> 3 + 3 --> 4 + ``` + +Ignition expresses a deployment as a dependency graph of on-chain transactions, that is, contract deployments and contract calls. Deployments and calls can be dependent on each other. A call to a contract requires that that contract first be deployed; the call should not be invoked until the contract deploy has completed entirely and successfully. + +Ignition provides the **recipe api** (a js based dsl) so users can succintly describe a dependency graph of contract deploys and calls. + +To deploy on-chain Ignition takes a `Recipe` specified via the **recipe api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `RecipeGraph`). + +The `ExecutionGraph` is passed to the execution engine which submits the transactions on-chain, ordering them and batching them based on the dependency constraints of the `ExecutionGraph`. + +## Building an `ExecutionGraph` from a Recipe + +The user describes the dependency graph as a `Recipe`, a utility function that takes a graph builder as its first argument. The user can express the on-chain transactions and their dependencies by calls on the graph builder. + +```javascript +const subrecipe = buildRecipe("Subrecipe", (m) => { + const f = m.contract("F"); + + m.call(f, "G"); + + return { f }; +}); + +module.exports = buildRecipe("Example", (m) => { + const a = m.contract("A"); + + const bCall = m.call(a, "B"); + + m.call(a, "E", { + after: [bCall], + }); + + const { recipe: sub } = m.subrecipe(subrecipe, { + after: [a], + }); + + m.call(a, "D", { + after: [sub], + }); + + m.contract("C", { + after: [sub], + }); + + return { a }; +}); +``` + +Ignition uses the `Recipe` to construct a `RecipeGraph`. The `RecipeGraph` matches closely with the high level **recipe api** and contains constructs that are **Hardhat** specific (i.e. "Deploy the 'A' Hardhat contract"). + +```mermaid +flowchart BT + A:::contract + B(B):::ccall + C:::contract + D(D):::ccall + E(E):::ccall + + subgraph subrecipe + direction RL + F:::contract + G(G):::ccall + G -->|calls| F + end + + B -- calls --> A + subrecipe -.->|after| A + D -.->|after| subrecipe + C -.->|after| subrecipe + E -->|after| B + D -->|calls| A + E -->|calls| A + + classDef contract fill:#7eb0d5,stroke:darkgray; + classDef ccall fill:#b2e061,stroke:darkgray; +``` + +During construction of the `RecipeGraph`, subrecipes are collapsed down to a single level. A vertex that depends on subrecipe, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. + +```mermaid +flowchart BT + A:::contract + B(B):::ccall + C:::contract + D(D):::ccall + E(E):::ccall + F:::contract + G(G):::ccall + + B -- calls --> A + F -->|after| A + G -->|after| A + G -->|calls| F + D -->|after| F + D -->|after| G + C -->|after| F + C -->|after| G + + E -->|after| B + D -->|calls| A + E -->|calls| A + + classDef contract fill:#7eb0d5,stroke:darkgray; + classDef ccall fill:#b2e061,stroke:darkgray; +``` + +This `RecipeGraph` is validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). The validation attempts to ensure the `RecipeGraph` can be transformed into an `ExecutionGraph` without error and to reduce the chance of an on-chain errors during execution. Validation checks do not take into account on-chain state, only enforcing that the deployment makes sense internally. + +A valid `RecipeGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subrecipe virtual nodes**). + +```mermaid +flowchart BT + A:::contract + B(B):::ccall + C:::contract + D(D):::ccall + E(E):::ccall + F:::contract + G(G):::ccall + + B -- calls --> A + F -->|after| A + G -->|calls| F + D -->|after| G + C -->|after| G + E -->|after| B + + + classDef contract fill:#7eb0d5,stroke:darkgray; + classDef ccall fill:#b2e061,stroke:darkgray; +``` + +The reduced `RecipeGraph` will contain lots of **Hardhat** specific references. Ignition transforms the `RecipeGraph` into an `ExecutionGraph` that is designed for use by the execution engine without any reference to **Hardhat**. The edge structure is copied across but each **Hardhat** specific vertex (an on-chain transaction) is translated into an agnostic equivalent. For instance, a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. + +Validated, simplified and converted to the agnostic `ExecutionGraph` representation, the execution engine can now run the deployment. + +## Execution + +The execution engine is responsible for submitting transactions to the blockchain. It takes the `ExecutionGraph` as input and uses the vertexes to determine which transactions should be sent, and uses the edges to determine how the transactions are ordered and batched. + +More than one transaction can be submitted to the Ethereum chain at once. A **depenency** in this context means that the previous transaction must have completed successfully on chain before the dependent transaction can be submitted. + +To simplify user reasoning about the order of execution, the execution engine groups into batches. A batch is the next set of transactions to submit. Batches are submitted until there is an error or all transactions are complete. + +```javascript + let unstarted = getVertexesFrom(executionGraph) + let onHold = [] + let errors = [] + let completed = [] + + let buildBatch = (unstarted, completed) => unstarted.filter(v => allDependenciesCompleted(v, executionGraph, completed)) + + while (unstarted.length > 0) { + const batch = buildBatch(unstarted.concat(onHold), completed) + + const { errors: batchErrors, completed: batchCompleted, onhold: batchOnhold } = await executeBatch(batch) + + onHold = batchOnHold; + removeFrom(unstarted, batchCompleted) + addTo(completed, batchCompleted) + + addTo(errors, batchErrors) + if (errors.length > 0) { + break; + } + } +``` + +A batch is constructed by looking at all unstarted or on-hold vertexes and using the `ExecutionGraph` to determine if all there dependencies have been met (executed successfully). + +The execution engine will wait until all the transactions in a batch have completed or failed or been designated on-hold or timed out. Once the batch is complete, either the deployment finishes as complete because because all transactions are complete, as error because there was an error, as on-hold because there was an on-hold result but no errors or timeouts. + +A policy governs how to deal with timed-out transactions. By default if an timed-out transaction fails to complete `x` times (once per batch) it becomes a failure. + +Either the entire graph of transactions will eventually succeed, in which case the deployment was a success. Or a transaction will fail or be stopped from completing, leading to a failed deployment. + +It follows from this that different runs of the same deployment (`ExecutionGraph`) may lead to different batchings. But assuming each transaction completes on the first attempt, the example above would give a batching like the following: + +```mermaid +flowchart BT + A:::contract + B(B):::ccall + C:::contract + D(D):::ccall + E(E):::ccall + F:::contract + G(G):::ccall + + B -- calls --> A + F -->|after| A + G -->|calls| F + D -->|after| G + C -->|after| G + E -->|after| B + + subgraph batch1 + A + end + + subgraph batch2 + B + F + end + + subgraph batch3 + E + G + end + + subgraph batch4 + D + C + end + + + classDef contract fill:#7eb0d5,stroke:darkgray; + classDef ccall fill:#b2e061,stroke:darkgray; +``` diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol index 76cc9196b8..11879a721d 100644 --- a/examples/simple/contracts/Foo.sol +++ b/examples/simple/contracts/Foo.sol @@ -21,5 +21,8 @@ contract Bar { contract Qux { address public a; - constructor (address _a) {a=_a;} + constructor (address _a, uint n) { + require(n > 0, "n must be positive"); + a=_a; + } } diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index 459c0f1d7e..20f99da082 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -5,7 +5,9 @@ module.exports = buildRecipe("MyRecipe", (m) => { const bar = m.contract("Bar", { args: [foo] }); - const qux = m.contract("Qux", { args: [foo] }); + const qux = m.contract("Qux", { args: [foo, 1] }); + + // m.call(foo, "inc", { args: [0], after: [bar] }); return { foo, bar, qux }; }); diff --git a/packages/core/package.json b/packages/core/package.json index ea19218f58..e2c1a6fcc5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,9 +52,6 @@ "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", - "ink": "^3.2.0", - "ink-spinner": "^4.0.3", - "js-graph-algorithms": "1.0.18", - "react": "^17.0.2" + "js-graph-algorithms": "1.0.18" } } diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 4734ff09e1..610f6c34e9 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,19 +1,19 @@ import setupDebug from "debug"; +import { Deployment } from "deployment/Deployment"; import { execute } from "execution/execute"; -import { FileJournal } from "journal/FileJournal"; import { InMemoryJournal } from "journal/InMemoryJournal"; import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; import { transformRecipeGraphToExecutionGraph } from "process/transformRecipeGraphToExecutionGraph"; import { createServices } from "services/createServices"; import { Services } from "services/types"; -import { DeploymentResult, IgnitionRecipesResults } from "types/deployment"; +import { DeploymentResult, UpdateUiAction } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; +import { VertexVisitResult } from "types/graph"; import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; import { Recipe } from "types/recipeGraph"; -import { SerializedDeploymentResult } from "types/serialization"; -import { UiService } from "ui/ui-service"; +import { SerializedFutureResult } from "types/serialization"; import { isDependable } from "utils/guards"; import { serializeFutureOutput } from "utils/serialize"; import { validateRecipeGraph } from "validation/validateRecipeGraph"; @@ -23,84 +23,47 @@ const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { pathToJournal: string | undefined; txPollingInterval: number; - ui: boolean; + ui?: UpdateUiAction; } type RecipesOutputs = Record; export class Ignition { - constructor( - private _providers: Providers, - private _recipesResults: IgnitionRecipesResults - ) {} + constructor(private _providers: Providers) {} public async deploy( recipe: Recipe, - options: IgnitionDeployOptions = { - ui: true, - pathToJournal: undefined, - txPollingInterval: 300, - } + givenOptions?: IgnitionDeployOptions ): Promise<[DeploymentResult, RecipesOutputs]> { log(`Start deploy`); - const ui = new UiService({ enabled: options.ui }); - - log("Create journal with path '%s'", options.pathToJournal); - - const journal = - options.pathToJournal !== undefined - ? new FileJournal(options.pathToJournal) - : new InMemoryJournal(); - - const serviceOptions = { - providers: this._providers, - journal, + const options = { + pathToJournal: undefined, txPollingInterval: 300, + ui: undefined, + ...givenOptions, }; - const services: Services = createServices( - "recipeIdEXECUTE", - "executorIdEXECUTE", - serviceOptions + const deployment = new Deployment( + recipe, + Deployment.setupServices(options, this._providers), + options.ui ); const chainId = await this._getChainId(); - log("ChainId resolved as '%s'", chainId); + deployment.setChainId(chainId); - log("Generate recipe graph from recipe"); - - const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( - recipe, - { chainId } - ); - - log("Validate recipe graph"); - const validationResult = await validateRecipeGraph(recipeGraph, services); + const { result: constructResult, recipeOutputs } = + await this._constructExecutionGraphFrom(deployment, recipe); - if (validationResult._kind === "failure") { - return [validationResult, {}]; + if (constructResult._kind === "failure") { + return [constructResult, {}]; } - log("Transform recipe graph to execution graph"); - const transformResult = await transformRecipeGraphToExecutionGraph( - recipeGraph, - services - ); - - if (transformResult._kind === "failure") { - return [transformResult, {}]; - } - - const { executionGraph } = transformResult; + deployment.transformComplete(constructResult.executionGraph); log("Execute based on execution graph"); - const executionResult = await execute( - executionGraph, - services, - ui, - this._recipesResults - ); + const executionResult = await execute(deployment); if (executionResult._kind === "failure") { return [executionResult, {}]; @@ -153,6 +116,37 @@ export class Ignition { return { recipeGraph, executionGraph }; } + private async _constructExecutionGraphFrom( + deployment: Deployment, + recipe: Recipe + ): Promise<{ result: any; recipeOutputs: FutureDict }> { + log("Generate recipe graph from recipe"); + const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( + recipe, + { chainId: deployment.state.details.chainId } + ); + + deployment.startValidation(); + const validationResult = await validateRecipeGraph( + recipeGraph, + deployment.services + ); + + if (validationResult._kind === "failure") { + deployment.failValidation(validationResult.failures[1]); + + return { result: validationResult, recipeOutputs }; + } + + log("Transform recipe graph to execution graph"); + const transformResult = await transformRecipeGraphToExecutionGraph( + recipeGraph, + deployment.services + ); + + return { result: transformResult, recipeOutputs }; + } + private async _getChainId(): Promise { const result = await this._providers.ethereumProvider.request({ method: "eth_chainId", @@ -163,17 +157,30 @@ export class Ignition { private _serialize( recipeOutputs: FutureDict, - result: Map - ): SerializedDeploymentResult { + result: Map + ) { const entries = Object.entries(recipeOutputs).filter( (entry): entry is [string, DependableFuture] => isDependable(entry[1]) ); - const convertedEntries = entries.map(([name, future]) => { - const executionResultValue = result.get(future.vertexId); + const convertedEntries: Array<[string, SerializedFutureResult]> = entries + .map(([name, future]): [string, SerializedFutureResult] | null => { + const executionResultValue = result.get(future.vertexId); - return [name, serializeFutureOutput(executionResultValue)]; - }); + if ( + executionResultValue === undefined || + executionResultValue._kind === "failure" + ) { + return null; + } + + const serializedOutput: SerializedFutureResult = serializeFutureOutput( + executionResultValue.result + ); + + return [name, serializedOutput]; + }) + .filter((x): x is [string, SerializedFutureResult] => x !== null); return Object.fromEntries(convertedEntries); } diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts new file mode 100644 index 0000000000..146f2bcb47 --- /dev/null +++ b/packages/core/src/deployment/Deployment.ts @@ -0,0 +1,174 @@ +import setupDebug from "debug"; + +import { IgnitionDeployOptions } from "Ignition"; +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { ExecuteBatchResult } from "execution/batch/types"; +import { FileJournal } from "journal/FileJournal"; +import { InMemoryJournal } from "journal/InMemoryJournal"; +import { createServices } from "services/createServices"; +import { Services } from "services/types"; +import { DeployState, UpdateUiAction } from "types/deployment"; +import { VertexVisitResult, VertexVisitResultFailure } from "types/graph"; +import { Providers } from "types/providers"; +import { Recipe } from "types/recipeGraph"; + +import { + deployStateReducer, + initializeDeployState, +} from "./deployStateReducer"; + +const log = setupDebug("ignition:deployment"); + +export class Deployment { + public state: DeployState; + public services: Services; + public ui?: UpdateUiAction; + + constructor(recipe: Recipe, services: Services, ui?: UpdateUiAction) { + this.state = initializeDeployState(recipe); + this.services = services; + this.ui = ui; + } + + public static setupServices( + options: IgnitionDeployOptions, + providers: Providers + ): Services { + log("Create journal with path '%s'", options.pathToJournal); + + const journal = + options.pathToJournal !== undefined + ? new FileJournal(options.pathToJournal) + : new InMemoryJournal(); + + const serviceOptions = { + providers, + journal, + txPollingInterval: 300, + }; + + const services: Services = createServices( + "recipeIdEXECUTE", + "executorIdEXECUTE", + serviceOptions + ); + + return services; + } + + public setChainId(chainId: number) { + log("ChainId resolved as '%s'", chainId); + this.state = deployStateReducer(this.state, { + type: "SET_CHAIN_ID", + chainId, + }); + } + + public startValidation() { + log("Validate recipe graph"); + this.state = deployStateReducer(this.state, { + type: "START_VALIDATION", + }); + + this._renderToUi(this.state); + } + + public failValidation(errors: Error[]) { + log(`Validation failed with errors`, errors); + this.state = deployStateReducer(this.state, { + type: "VALIDATION_FAIL", + errors, + }); + + this._renderToUi(this.state); + } + + public transformComplete(executionGraph: ExecutionGraph) { + log(`Transform complete`, executionGraph); + this.state = deployStateReducer(this.state, { + type: "TRANSFORM_COMPLETE", + executionGraph, + }); + + this._renderToUi(this.state); + } + + public startExecutionPhase(executionGraph: ExecutionGraph) { + log(`Starting Execution`); + this.state = deployStateReducer(this.state, { + type: "START_EXECUTION_PHASE", + executionGraph, + }); + + this._renderToUi(this.state); + } + + public updateExecutionWithNewBatch(batch: Set) { + log(`Update execution with new batch`, batch); + this.state = deployStateReducer(this.state, { + type: "UPDATE_EXECUTION_WITH_NEW_BATCH", + batch, + }); + + this._renderToUi(this.state); + } + + public updateExecutionWithBatchResults(batchResult: ExecuteBatchResult) { + log(`Update execution with batch results`, batchResult); + this.state = deployStateReducer(this.state, { + type: "UPDATE_EXECUTION_WITH_BATCH_RESULTS", + batchResult, + }); + + this._renderToUi(this.state); + } + + public updateCurrentBatchWithResult( + vertexId: number, + result: VertexVisitResult + ) { + log(`Update current with batch result for ${vertexId}`, result); + this.state = deployStateReducer(this.state, { + type: "UPDATE_CURRENT_BATCH_WITH_RESULT", + vertexId, + result, + }); + + this._renderToUi(this.state); + } + + public readExecutionErrors() { + const errors = [...this.state.execution.errored].reduce( + (acc: { [key: number]: VertexVisitResultFailure }, id) => { + const result = this.state.execution.resultsAccumulator.get(id); + + if (result === undefined || result._kind === "success") { + return acc; + } + + acc[id] = result; + + return acc; + }, + {} + ); + + return errors; + } + + public hasUnstarted(): boolean { + return this.state.execution.unstarted.size > 0; + } + + public hasErrors(): boolean { + return this.state.execution.errored.size > 0; + } + + private _renderToUi(state: DeployState) { + if (this.ui === undefined) { + return; + } + + this.ui(state); + } +} diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts new file mode 100644 index 0000000000..2c3c70a9ec --- /dev/null +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -0,0 +1,287 @@ +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { ExecuteBatchResult } from "execution/batch/types"; +import { DeployPhase, DeployState, ExecutionState } from "types/deployment"; +import { VertexVisitResult } from "types/graph"; +import { Recipe } from "types/recipeGraph"; +import { difference, union } from "utils/sets"; + +export function initializeDeployState(recipe: Recipe): DeployState { + return { + phase: "uninitialized", + details: { + recipeName: recipe.name, + chainId: 0, + }, + validation: { + errors: [], + }, + transform: { + executionGraph: null, + }, + execution: { + unstarted: new Set(), + onHold: new Set(), + completed: new Set(), + errored: new Set(), + batch: new Map(), + previousBatches: [], + resultsAccumulator: new Map(), + }, + }; +} + +export function initialiseExecutionStateFrom( + executionGraph: ExecutionGraph +): ExecutionState { + const unstarted = new Set(executionGraph.vertexes.keys()); + + const executionState: ExecutionState = { + unstarted, + onHold: new Set(), + completed: new Set(), + errored: new Set(), + batch: new Map(), + previousBatches: [], + resultsAccumulator: [...unstarted].reduce>((acc, id) => { + acc.set(id, null); + + return acc; + }, new Map()), + }; + + return executionState; +} + +export function deployStateReducer( + state: DeployState, + action: + | { type: "SET_CHAIN_ID"; chainId: number } + | { + type: "START_VALIDATION"; + } + | { + type: "VALIDATION_FAIL"; + errors: Error[]; + } + | { + type: "TRANSFORM_COMPLETE"; + executionGraph: ExecutionGraph; + } + | { + type: "START_EXECUTION_PHASE"; + executionGraph: ExecutionGraph; + } + | { + type: "UPDATE_EXECUTION_WITH_NEW_BATCH"; + batch: Set; + } + | { + type: "UPDATE_EXECUTION_WITH_BATCH_RESULTS"; + batchResult: ExecuteBatchResult; + } + | { + type: "UPDATE_CURRENT_BATCH_WITH_RESULT"; + vertexId: number; + result: VertexVisitResult; + } +): DeployState { + switch (action.type) { + case "SET_CHAIN_ID": + return { + ...state, + details: { + ...state.details, + chainId: action.chainId, + }, + }; + case "START_VALIDATION": + return { + ...state, + phase: "validating", + }; + case "VALIDATION_FAIL": + return { + ...state, + phase: "validation-failed", + validation: { + ...state.validation, + errors: action.errors, + }, + }; + case "TRANSFORM_COMPLETE": + return { + ...state, + transform: { executionGraph: action.executionGraph }, + }; + case "START_EXECUTION_PHASE": + return { + ...state, + phase: "execution", + execution: initialiseExecutionStateFrom(action.executionGraph), + }; + case "UPDATE_EXECUTION_WITH_NEW_BATCH": + return { + ...state, + execution: updateExecutionStateWithNewBatch( + state.execution, + action.batch + ), + }; + case "UPDATE_EXECUTION_WITH_BATCH_RESULTS": + const updatedExecution = updateExecutionStateWithBatchResults( + state.execution, + action.batchResult + ); + + return { + ...state, + phase: resolvePhaseFrom(updatedExecution), + execution: updatedExecution, + }; + case "UPDATE_CURRENT_BATCH_WITH_RESULT": + const updatedBatch = new Map(state.execution.batch); + updatedBatch.set(action.vertexId, action.result); + + return { + ...state, + execution: { + ...state.execution, + batch: updatedBatch, + }, + }; + default: + assertNeverMessageType(action); + return state; + } +} + +function resolvePhaseFrom(updatedState: ExecutionState): DeployPhase { + if (updatedState.errored.size > 0) { + return "failed"; + } + + if (updatedState.unstarted.size === 0) { + return "complete"; + } + + return "execution"; +} + +export function updateExecutionStateWithNewBatch( + executionState: ExecutionState, + batch: Set +): ExecutionState { + const batchEntries = new Map(); + + for (const vertexId of batch) { + batchEntries.set(vertexId, null); + } + + return { + ...executionState, + unstarted: difference(executionState.unstarted, batch), + onHold: difference(executionState.onHold, batch), + batch: batchEntries, + }; +} + +export function updateExecutionStateWithBatchResults( + executionState: ExecutionState, + { + errored, + completed, + onhold, + resultsAccumulator: batchResultsAcc, + }: ExecuteBatchResult +): ExecutionState { + const batch = new Set([...errored, ...completed, ...onhold]); + + const exState1 = transferFromBatchToCompleted(executionState, completed); + const exState2 = transferFromBatchToOnHold(exState1, onhold); + const exState3 = transferFromBatchToErrored(exState2, errored); + + const exState4 = mergeBatchResultsInResultsAccumulator( + exState3, + batchResultsAcc + ); + + const exState5: ExecutionState = appendBatchToArchive(exState4, batch); + + return exState5; +} + +export function mergeBatchResultsInResultsAccumulator( + executionState: ExecutionState, + batchResultsAcc: Map +): ExecutionState { + const updatedResultsAccumulator = new Map(executionState.resultsAccumulator); + + batchResultsAcc.forEach((result, vertexId) => { + updatedResultsAccumulator.set(vertexId, result); + }); + + return { + ...executionState, + resultsAccumulator: updatedResultsAccumulator, + }; +} + +export function transferFromBatchToCompleted( + executionState: ExecutionState, + completed: Set +): ExecutionState { + return { + ...executionState, + batch: removeFromBatch(executionState.batch, completed), + completed: union(executionState.completed, completed), + }; +} + +export function transferFromBatchToOnHold( + executionState: ExecutionState, + onHold: Set +): ExecutionState { + return { + ...executionState, + batch: removeFromBatch(executionState.batch, onHold), + onHold: union(executionState.onHold, onHold), + }; +} + +export function transferFromBatchToErrored( + executionState: ExecutionState, + errored: Set +): ExecutionState { + return { + ...executionState, + batch: removeFromBatch(executionState.batch, errored), + errored: union(executionState.errored, errored), + }; +} + +function appendBatchToArchive( + extensionState: ExecutionState, + previousBatch: Set +): ExecutionState { + return { + ...extensionState, + previousBatches: [...extensionState.previousBatches, previousBatch], + }; +} + +function removeFromBatch( + batch: Map, + toRemove: Set +): Map { + const updated = new Map(batch); + + for (const vertexId of toRemove) { + updated.delete(vertexId); + } + + return updated; +} + +function assertNeverMessageType(action: never) { + throw new Error(`Unexpected message type ${action}`); +} diff --git a/packages/core/src/execution/batch/types.ts b/packages/core/src/execution/batch/types.ts new file mode 100644 index 0000000000..c48b0d247b --- /dev/null +++ b/packages/core/src/execution/batch/types.ts @@ -0,0 +1,26 @@ +import { Services } from "services/types"; +import { ExecutionVertex } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; + +export type BatcherResult = + | { + _kind: "success"; + context: Map; + } + | { + _kind: "failure"; + errors: any[]; + }; + +export type ExecutionVertexDispatcher = ( + vertex: ExecutionVertex, + resultAccumulator: Map, + context: { services: Services } +) => Promise; + +export interface ExecuteBatchResult { + completed: Set; + onhold: Set; + errored: Set; + resultsAccumulator: Map; +} diff --git a/packages/core/src/execution/batch/utils.ts b/packages/core/src/execution/batch/utils.ts new file mode 100644 index 0000000000..19be6d55f2 --- /dev/null +++ b/packages/core/src/execution/batch/utils.ts @@ -0,0 +1,15 @@ +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { getDependenciesFor } from "graph/adjacencyList"; + +export function allDependenciesCompleted( + vertexId: number, + executionGraph: ExecutionGraph, + completed: Set +) { + const depenencies = getDependenciesFor( + executionGraph.adjacencyList, + vertexId + ); + + return depenencies.every((vid) => completed.has(vid)); +} diff --git a/packages/core/src/execution/batch/visitInBatches.ts b/packages/core/src/execution/batch/visitInBatches.ts new file mode 100644 index 0000000000..f73dbdec8a --- /dev/null +++ b/packages/core/src/execution/batch/visitInBatches.ts @@ -0,0 +1,136 @@ +import { Deployment } from "deployment/Deployment"; +import { Services } from "services/types"; +import { ExecutionState } from "types/deployment"; +import { ExecutionVertex } from "types/executionGraph"; +import { + VertexVisitResult, + VertexVisitResultFailure, + VertexVisitResultSuccess, + VisitResult, +} from "types/graph"; +import { union } from "utils/sets"; + +import { ExecutionGraph } from "../ExecutionGraph"; + +import { ExecutionVertexDispatcher, ExecuteBatchResult } from "./types"; +import { allDependenciesCompleted } from "./utils"; + +export async function visitInBatches( + deployment: Deployment, + executionGraph: ExecutionGraph, + executionVertexDispatcher: ExecutionVertexDispatcher +): Promise { + deployment.startExecutionPhase(executionGraph); + + while (deployment.hasUnstarted()) { + const batch = calculateNextBatch( + deployment.state.execution, + executionGraph + ); + + deployment.updateExecutionWithNewBatch(batch); + + const executeBatchResult = await executeBatch( + batch, + executionGraph, + deployment.state.execution.resultsAccumulator, + deployment.updateCurrentBatchWithResult.bind(deployment), + { services: deployment.services }, + executionVertexDispatcher + ); + + deployment.updateExecutionWithBatchResults(executeBatchResult); + + if (deployment.hasErrors()) { + const errors = deployment.readExecutionErrors(); + + return { + _kind: "failure", + failures: [ + "execution failed", + Object.values(errors).map((err) => err.failure), + ], + }; + } + } + + return { + _kind: "success", + result: deployment.state.execution.resultsAccumulator, + }; +} + +function calculateNextBatch( + executionState: ExecutionState, + executionGraph: ExecutionGraph +): Set { + const potentials = union(executionState.unstarted, executionState.onHold); + + const batch = [...potentials].filter((vertexId) => + allDependenciesCompleted(vertexId, executionGraph, executionState.completed) + ); + + return new Set(batch); +} + +async function executeBatch( + batch: Set, + executionGraph: ExecutionGraph, + resultsAccumulator: Map, + uiUpdate: (vertexId: number, result: VertexVisitResult) => void, + { services }: { services: Services }, + executionVertexDispatcher: ExecutionVertexDispatcher +): Promise { + const batchVertexes = [...batch] + .map((vertexId) => executionGraph.vertexes.get(vertexId)) + .filter((v): v is ExecutionVertex => v !== undefined); + + if (batchVertexes.length !== batch.size) { + throw new Error("Unable to retrieve all vertexes while executing batch"); + } + + const promises = batchVertexes.map(async (vertex) => { + const result = await executionVertexDispatcher(vertex, resultsAccumulator, { + services, + }); + + uiUpdate(vertex.id, result); + + return { vertexId: vertex.id, result }; + }); + + const results = await Promise.all(promises); + + const successes = results.filter( + ( + executionResult + ): executionResult is { + vertexId: number; + result: VertexVisitResultSuccess; + } => executionResult.result._kind === "success" + ); + + const errored = results.filter( + ( + executionResult + ): executionResult is { + vertexId: number; + result: VertexVisitResultFailure; + } => executionResult.result._kind === "failure" + ); + + const updatedResultsAccumulator = [...successes, ...errored].reduce( + (acc, success) => { + acc.set(success.vertexId, success.result); + return acc; + }, + new Map() + ); + + return { + completed: new Set(successes.map(({ vertexId }) => vertexId)), + onhold: new Set(), + errored: new Set(errored.map(({ vertexId }) => vertexId)), + resultsAccumulator: updatedResultsAccumulator, + }; +} diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index e12917bf47..d0a17f97ff 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -15,12 +15,15 @@ export async function executeContractCall( const { address, abi } = resolve(contract); - const txHash = await services.contracts.call( - address, - abi, - method, - resolvedArgs - ); + let txHash: string; + try { + txHash = await services.contracts.call(address, abi, method, resolvedArgs); + } catch (err) { + return { + _kind: "failure", + failure: err as any, + }; + } await services.transactions.wait(txHash); diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 45e5489631..cc7ee26d30 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -6,32 +6,42 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( { artifact, args, libraries }: ContractDeploy, - resultAccumulator: Map, + resultAccumulator: Map, { services }: { services: Services } ): Promise { - const resolve = resolveFrom(resultAccumulator); + try { + const resolve = resolveFrom(resultAccumulator); - const resolvedArgs = args.map(resolve).map(toAddress); + const resolvedArgs = args.map(resolve).map(toAddress); - const resolvedLibraries = Object.fromEntries( - Object.entries(libraries ?? {}).map(([k, v]) => [k, toAddress(resolve(v))]) - ); + const resolvedLibraries = Object.fromEntries( + Object.entries(libraries ?? {}).map(([k, v]) => [ + k, + toAddress(resolve(v)), + ]) + ); - const txHash = await services.contracts.deploy( - artifact, - resolvedArgs, - resolvedLibraries - ); + const txHash = await services.contracts.deploy( + artifact, + resolvedArgs, + resolvedLibraries + ); - const receipt = await services.transactions.wait(txHash); + const receipt = await services.transactions.wait(txHash); - return { - _kind: "success", - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }, - }; + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }, + }; + } catch (err) { + return { + _kind: "failure", + failure: err as any, + }; + } } diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 810f1f114e..8b3ad5366d 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -9,19 +9,28 @@ export async function executeLibraryDeploy( resultAccumulator: Map, { services }: { services: Services } ): Promise { - const resolvedArgs = args.map(resolveFrom(resultAccumulator)).map(toAddress); + try { + const resolvedArgs = args + .map(resolveFrom(resultAccumulator)) + .map(toAddress); - const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); - const receipt = await services.transactions.wait(txHash); + const receipt = await services.transactions.wait(txHash); - return { - _kind: "success", - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }, - }; + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }, + }; + } catch (err) { + return { + _kind: "failure", + failure: err as any, + }; + } } diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index ce0c112733..9d46be7a2e 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,4 +1,5 @@ import { ArgValue } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; import { isDependable } from "utils/guards"; export function toAddress(v: any) { @@ -9,7 +10,7 @@ export function toAddress(v: any) { return v; } -export function resolveFrom(context: Map) { +export function resolveFrom(context: Map) { return (arg: ArgValue) => { if (!isDependable(arg)) { return arg; @@ -21,6 +22,12 @@ export function resolveFrom(context: Map) { throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); } - return entry; + if (entry._kind === "failure") { + throw new Error( + `Looking up context on a failed vertex - violation of constraint` + ); + } + + return entry.result; }; } diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 2248f63a5b..fb4bd1cbd2 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,63 +1,17 @@ -import { getSortedVertexIdsFrom } from "graph/utils"; -import { visit } from "graph/visit"; -import { Services } from "services/types"; -import { IgnitionRecipesResults } from "types/deployment"; -import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; +import { Deployment } from "deployment/Deployment"; import { VisitResult } from "types/graph"; -import { DeploymentState } from "ui/types"; -import { UiService } from "ui/ui-service"; +import { visitInBatches } from "./batch/visitInBatches"; import { executionDispatch } from "./dispatch/executionDispatch"; -export async function execute( - executionGraph: IExecutionGraph, - services: Services, - ui: UiService, - _recipeResults: IgnitionRecipesResults -): Promise { - const orderedVertexIds = getSortedVertexIdsFrom(executionGraph); +export async function execute(deployment: Deployment): Promise { + if (deployment.state.transform.executionGraph === null) { + throw new Error("Cannot execute without an execution graph"); + } - const uiDeploymentState = setupUiDeploymentState( - executionGraph, - ui, - orderedVertexIds + return visitInBatches( + deployment, + deployment.state.transform.executionGraph, + executionDispatch ); - - return visit( - "Execution", - orderedVertexIds, - executionGraph, - { services }, - new Map(), - executionDispatch, - (vertex, kind, error) => { - if (kind === "success") { - uiDeploymentState.setExeuctionVertexAsSuccess(vertex); - } else if (kind === "failure") { - uiDeploymentState.setExecutionVertexAsFailure(vertex, error); - } else { - throw new Error(`Unknown kind ${kind}`); - } - - ui.render(); - } - ); -} - -function setupUiDeploymentState( - executionGraph: IExecutionGraph, - ui: UiService, - orderedVertexIds: number[] -): DeploymentState { - const uiDeploymentState: DeploymentState = new DeploymentState(); - - uiDeploymentState.setExecutionVertexes( - orderedVertexIds - .map((vid) => executionGraph.vertexes.get(vid)) - .filter((vertex): vertex is ExecutionVertex => vertex !== undefined) - ); - - ui.setDeploymentState(uiDeploymentState); - - return uiDeploymentState; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b8232ce84a..5ff769a881 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,7 +3,6 @@ export { buildRecipe } from "recipe/buildRecipe"; export type { SerializedDeploymentResult, - SerializedRecipeResult, SerializedFutureResult, } from "types/serialization"; export type { Services } from "services/types"; @@ -12,7 +11,11 @@ export type { ConfigProvider, HasParamResult, } from "types/providers"; -export type { DeploymentResult } from "types/deployment"; +export type { + DeployState, + DeployPhase, + DeploymentResult, +} from "types/deployment"; export type { Recipe, ExternalParamValue, @@ -20,4 +23,12 @@ export type { } from "types/recipeGraph"; export type { FutureDict } from "types/future"; export type { IgnitionPlan } from "types/plan"; -export type { VertexGraph, VertexDescriptor } from "types/graph"; +export type { + VertexGraph, + VertexDescriptor, + VertexVisitResultFailure, +} from "types/graph"; +export type { + ExecutionVertex, + ExecutionVertexType, +} from "types/executionGraph"; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 9b7da2f5e2..de5e802900 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,13 +1,18 @@ +import { ExecutionGraph } from "execution/ExecutionGraph"; + +import { VertexVisitResult } from "./graph"; import { SerializedDeploymentResult, - SerializedRecipeResult, + SerializedFutureResult, } from "./serialization"; +export type UpdateUiAction = (deployState: DeployState) => void; + export interface IgnitionRecipesResults { - load: (recipeId: string) => Promise; + load: (recipeId: string) => Promise; save: ( recipeId: string, - recipeResult: SerializedRecipeResult + recipeResult: SerializedFutureResult ) => Promise; } @@ -15,3 +20,40 @@ export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } | { _kind: "hold"; holds: [string, string[]] } | { _kind: "success"; result: SerializedDeploymentResult }; + +export type DeployPhase = + | "uninitialized" + | "validating" + | "execution" + | "complete" + | "failed" + | "validation-failed"; + +export interface ValidationState { + errors: Error[]; +} + +export interface ExecutionState { + unstarted: Set; + onHold: Set; + completed: Set; + errored: Set; + + batch: Map; + previousBatches: Array>; + + resultsAccumulator: Map; +} + +export interface DeployState { + phase: DeployPhase; + details: { + recipeName: string; + chainId: number; + }; + validation: ValidationState; + transform: { + executionGraph: ExecutionGraph | null; + }; + execution: ExecutionState; +} diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index bbccc99367..9ec2d52f61 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -11,6 +11,12 @@ export interface IExecutionGraph { export type ArgValue = boolean | string | number | RecipeFuture; +export type ExecutionVertexType = + | "ContractDeploy" + | "DeployedContract" + | "LibraryDeploy" + | "ContractCall"; + export type ExecutionVertex = | ContractDeploy | DeployedContract diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index e61d410130..19053e532b 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -13,20 +13,24 @@ export interface IGraph { export type VertexGraph = IGraph; +export interface VertexVisitResultSuccess { + _kind: "success"; + result: any; +} + +export interface VertexVisitResultFailure { + _kind: "failure"; + failure: Error; +} + export type VertexVisitResult = - | { - _kind: "success"; - result: any; - } - | { - _kind: "failure"; - failure: Error; - }; + | VertexVisitResultSuccess + | VertexVisitResultFailure; export type VisitResult = | { _kind: "success"; - result: Map; + result: Map; } | { _kind: "failure"; diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index be2844b8fb..6fe61d76a5 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -1,8 +1,12 @@ -import { serializeFutureOutput } from "utils/serialize"; +export type SerializedFutureResult = + | { _kind: "string"; value: string } + | { _kind: "number"; value: number } + | { _kind: "contract"; value: Contract } + | { _kind: "tx"; value: Tx }; -export type SerializedRecipeResult = Record; -export type SerializedDeploymentResult = Record; -export type SerializedFutureResult = ReturnType; +export interface SerializedDeploymentResult { + [key: string]: SerializedFutureResult; +} export type FutureOutput = string | number | Contract | Tx; diff --git a/packages/core/src/ui/components/index.tsx b/packages/core/src/ui/components/index.tsx deleted file mode 100644 index 99cd4d1bee..0000000000 --- a/packages/core/src/ui/components/index.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { Box, Text } from "ink"; -import React from "react"; - -import { DeploymentState, VertexStatus } from "../types"; - -export const IgnitionUi = ({ - deploymentState, -}: { - deploymentState: DeploymentState; -}) => { - const vertexEntries = deploymentState.toStatus(); - const { executed, total } = deploymentState.executedCount(); - - return ( - - - - Deploying ({executed} of {total} transactions executed){" "} - - - - {vertexEntries.map((entry) => ( - - ))} - - {executed === total ? ( - <> - - - Deployment complete - - - - ) : null} - - ); -}; - -const VertexStatusRow = ({ vertexEntry }: { vertexEntry: VertexStatus }) => { - const { color, message } = toDisplayMessage(vertexEntry); - - return ( - - {message} - - ); -}; - -function toDisplayMessage(vertexEntry: VertexStatus): { - color: "green" | "gray"; - message: string; -} { - if (vertexEntry.status === "unstarted") { - return { - color: "gray", - message: resolveUnstartedMessage(vertexEntry), - }; - } - - if (vertexEntry.status === "success") { - return { color: "green", message: resolveCompletedMessage(vertexEntry) }; - } - - throw new Error(`Unexpected vertex status: ${vertexEntry}`); -} - -function resolveUnstartedMessage(vertexEntry: VertexStatus) { - switch (vertexEntry.vertex.type) { - case "ContractCall": - return `Waiting to call contract ${vertexEntry.vertex.label}`; - case "ContractDeploy": - return `Waiting to deploy contract ${vertexEntry.vertex.label}`; - case "DeployedContract": - return `Waiting to resolve contract ${vertexEntry.vertex.label}`; - case "LibraryDeploy": - return `Waiting to deploy library ${vertexEntry.vertex.label}`; - default: - return assertNeverMessage(vertexEntry.vertex); - } -} - -function resolveCompletedMessage(vertexEntry: VertexStatus) { - switch (vertexEntry.vertex.type) { - case "ContractCall": - return `Executed call to contract ${vertexEntry.vertex.label}`; - case "ContractDeploy": - return `Deployed contract ${vertexEntry.vertex.label}`; - case "DeployedContract": - return `Contract resolved ${vertexEntry.vertex.label}`; - case "LibraryDeploy": - return `Deployed contract ${vertexEntry.vertex.label}`; - default: - return assertNeverMessage(vertexEntry.vertex); - } -} - -function assertNeverMessage(vertexEntry: never): string { - const entry: any = vertexEntry; - const text = "type" in entry ? entry.type : entry; - - throw new Error(`Unexpected vertex type: ${text}`); -} diff --git a/packages/core/src/ui/types.ts b/packages/core/src/ui/types.ts deleted file mode 100644 index f3b29b4c5b..0000000000 --- a/packages/core/src/ui/types.ts +++ /dev/null @@ -1,74 +0,0 @@ -import { ExecutionVertex } from "types/executionGraph"; - -interface VertexSuccess { - status: "success"; - vertex: ExecutionVertex; -} - -interface VertexFailure { - status: "failure"; - vertex: ExecutionVertex; - error: unknown; -} - -interface Unstarted { - status: "unstarted"; - vertex: ExecutionVertex; -} - -export type VertexStatus = Unstarted | VertexSuccess | VertexFailure; - -export class DeploymentState { - private phase: "validation" | "execution" | "uninitialized"; - private validationErrors: string[]; - private executionVertexes: { [key: string]: VertexStatus }; - private order: number[]; - - constructor() { - this.phase = "uninitialized"; - - this.order = []; - - this.validationErrors = []; - this.executionVertexes = {}; - } - - public setExecutionVertexes(vertexes: ExecutionVertex[]) { - this.order = vertexes.map((v) => v.id); - - this.executionVertexes = Object.fromEntries( - vertexes.map((v): [number, Unstarted] => [ - v.id, - { status: "unstarted", vertex: v }, - ]) - ); - } - - public setExeuctionVertexAsSuccess(vertex: ExecutionVertex) { - this.executionVertexes[vertex.id] = { - vertex, - status: "success", - }; - } - - public setExecutionVertexAsFailure(vertex: ExecutionVertex, err: unknown) { - this.executionVertexes[vertex.id] = { - vertex, - status: "failure", - error: err, - }; - } - - public toStatus(): VertexStatus[] { - return this.order.map((id) => this.executionVertexes[id]); - } - - public executedCount(): { executed: number; total: number } { - const total = this.order.length; - const executed = Object.values(this.executionVertexes).filter( - (v) => v.status !== "unstarted" - ).length; - - return { executed, total }; - } -} diff --git a/packages/core/src/ui/ui-service.tsx b/packages/core/src/ui/ui-service.tsx deleted file mode 100644 index 40d4b3de8d..0000000000 --- a/packages/core/src/ui/ui-service.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { render } from "ink"; -import React from "react"; - -import { IgnitionUi } from "./components"; -import { DeploymentState } from "./types"; - -export class UiService { - private _enabled: boolean; - private _deploymentState: DeploymentState | undefined; - - constructor({ enabled }: { enabled: boolean }) { - this._enabled = enabled; - } - - public setDeploymentState(deploymentState: DeploymentState) { - this._deploymentState = deploymentState; - } - - public render() { - if (this._deploymentState === undefined) { - throw new Error("Cannot render before deployment state set"); - } - - if (this._enabled) { - render(); - } - } -} diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index 0ed19b442b..b9bb7e0635 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -1,6 +1,6 @@ -import { FutureOutput } from "types/serialization"; +import { FutureOutput, SerializedFutureResult } from "types/serialization"; -export function serializeFutureOutput(x: FutureOutput) { +export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { if (typeof x === "string") { return { _kind: "string" as const, value: x }; } else if (typeof x === "number") { @@ -12,7 +12,7 @@ export function serializeFutureOutput(x: FutureOutput) { } const exhaustiveCheck: never = x; - return exhaustiveCheck; + throw new Error(`Unexpected serialization type ${exhaustiveCheck}`); } export function deserializeFutureOutput(x: any) { diff --git a/packages/core/src/utils/sets.ts b/packages/core/src/utils/sets.ts new file mode 100644 index 0000000000..1afb0bfbd7 --- /dev/null +++ b/packages/core/src/utils/sets.ts @@ -0,0 +1,19 @@ +export function union(setA: Set, setB: Set) { + const _union = new Set(setA); + + for (const elem of setB) { + _union.add(elem); + } + + return _union; +} + +export function difference(setA: Set, setB: Set) { + const _difference = new Set(setA); + + for (const elem of setB) { + _difference.delete(elem); + } + + return _difference; +} diff --git a/packages/core/test/batch/visitInBatches.ts b/packages/core/test/batch/visitInBatches.ts new file mode 100644 index 0000000000..cd8ebcb8d2 --- /dev/null +++ b/packages/core/test/batch/visitInBatches.ts @@ -0,0 +1,66 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { Deployment } from "deployment/Deployment"; +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { visitInBatches } from "execution/batch/visitInBatches"; +import { ContractDeploy, ExecutionVertex } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; + +import { buildAdjacencyListFrom } from "../graph/helpers"; + +describe("Execution - visitInBatches", () => { + it("should run", async () => { + const vertex0: ExecutionVertex = createFakeContractDeployVertex(0, "first"); + const vertex1: ExecutionVertex = createFakeContractDeployVertex( + 1, + "second" + ); + const vertex2: ExecutionVertex = createFakeContractDeployVertex(2, "third"); + + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = buildAdjacencyListFrom({ + 0: [1], + 1: [2], + 2: [], + }); + + executionGraph.vertexes.set(0, vertex0); + executionGraph.vertexes.set(1, vertex1); + executionGraph.vertexes.set(2, vertex2); + + const mockServices = {} as any; + const mockUpdateUiAction = () => {}; + + const deployment = new Deployment( + { name: "MyRecipe" }, + mockServices, + mockUpdateUiAction + ); + + const result = await visitInBatches( + deployment, + executionGraph, + async (): Promise => { + return { _kind: "success", result: true }; + } + ); + + assert.isDefined(result); + assert.equal(result._kind, "success"); + }); +}); + +function createFakeContractDeployVertex( + vertexId: number, + label: string +): ContractDeploy { + return { + type: "ContractDeploy", + id: vertexId, + label, + artifact: {} as any, + args: [], + libraries: {}, + }; +} diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 984735b7fc..6b031e722a 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -1,6 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { Deployment } from "deployment/Deployment"; import { ExecutionGraph } from "execution/ExecutionGraph"; import { execute } from "execution/execute"; import { Services, TransactionOptions } from "services/types"; @@ -76,10 +77,13 @@ describe("Execution", () => { } assert.deepStrictEqual(response.result.get(0), { - abi: [], - address: "0xAddr", - bytecode: "0x0", - name: "Foo", + _kind: "success", + result: { + abi: [], + address: "0xAddr", + bytecode: "0x0", + name: "Foo", + }, }); }); @@ -145,10 +149,13 @@ describe("Execution", () => { } assert.deepStrictEqual(response.result.get(0), { - abi: [], - address: "0xAddr", - bytecode: "0x0", - name: "Foo", + _kind: "success", + result: { + abi: [], + address: "0xAddr", + bytecode: "0x0", + name: "Foo", + }, }); }); @@ -173,7 +180,7 @@ describe("Execution", () => { const contractCall: ExecutionVertex = { type: "ContractCall", - id: 0, + id: 1, label: "Foo", contract: { vertexId: 0, type: "contract", label: "Foo", _future: true }, method: "inc", @@ -230,7 +237,10 @@ describe("Execution", () => { } assert.deepStrictEqual(response.result.get(1), { - hash: "0x2", + _kind: "success", + result: { + hash: "0x2", + }, }); }); @@ -263,9 +273,12 @@ describe("Execution", () => { } assert.deepStrictEqual(response.result.get(0), { - name: "Foo", - abi: [], - address: "0xAddr", + _kind: "success", + result: { + name: "Foo", + abi: [], + address: "0xAddr", + }, }); }); }); @@ -280,19 +293,17 @@ async function assertExecuteSingleVertex( }); executionGraph.vertexes.set(0, executionVertex); - const mockUiService = { - setDeploymentState: () => {}, - render: () => {}, - } as any; + const mockUpdateUiAction = () => {}; - const mockRecipeResults = {} as any; - - return execute( - executionGraph, + const deployment = new Deployment( + { name: "MyRecipe" }, mockServices, - mockUiService, - mockRecipeResults + mockUpdateUiAction ); + + deployment.state.transform.executionGraph = executionGraph; + + return execute(deployment); } async function assertDependentVertex( @@ -303,22 +314,20 @@ async function assertDependentVertex( const executionGraph = new ExecutionGraph(); executionGraph.adjacencyList = buildAdjacencyListFrom({ 0: [1], - 1: [0], + 1: [], }); executionGraph.vertexes.set(0, parent); executionGraph.vertexes.set(1, child); - const mockUiService = { - setDeploymentState: () => {}, - render: () => {}, - } as any; - - const mockRecipeResults = {} as any; + const mockUpdateUiAction = () => {}; - return execute( - executionGraph, + const deployment = new Deployment( + { name: "MyRecipe" }, mockServices, - mockUiService, - mockRecipeResults + mockUpdateUiAction ); + + deployment.state.transform.executionGraph = executionGraph; + + return execute(deployment); } diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 60beab510c..463741a224 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,14 +1,17 @@ { "compilerOptions": { - "target": "ES2017", + "lib": ["es2021"], "module": "commonjs", + "target": "es2021", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "incremental": true, "outDir": "./dist", "declaration": true, "declarationMap": true, "sourceMap": true, - "strict": true, - "esModuleInterop": true, "jsx": "react-jsx", "baseUrl": "src", "paths": { diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index 951399bef5..7ef8e9e904 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -6,7 +6,7 @@ import { RecipeState, } from "../src/deployment-state"; -import { IgnitionUi } from "../src/ui/components"; +import { IgnitionUi } from "@nomicfoundation/hardhat-ignition/src/ui/components"; import { Example } from "./types"; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 77db8192c9..f35f04a86b 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -55,6 +55,9 @@ "dependencies": { "debug": "^4.3.2", "ethers": "^5.4.7", - "fs-extra": "^10.0.0" + "fs-extra": "^10.0.0", + "ink": "3.2.0", + "ink-spinner": "4.0.3", + "react": "18.2.0" } } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 9cb33315c2..13e054d085 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,14 +1,13 @@ import { Ignition, IgnitionDeployOptions, - SerializedRecipeResult, Providers, ExternalParamValue, Recipe, } from "@nomicfoundation/ignition-core"; -import fsExtra from "fs-extra"; import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; + +import { renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; type HardhatPaths = HardhatConfig["paths"]; @@ -22,13 +21,12 @@ export class IgnitionWrapper { private _ethers: HardhatEthers, private _isHardhatNetwork: boolean, private _paths: HardhatPaths, - private _deployOptions: IgnitionDeployOptions + private _deployOptions: Omit< + IgnitionDeployOptions, + keyof { ui?: boolean } + > & { ui?: boolean } ) { - this._ignition = new Ignition(_providers, { - load: (recipeId) => this._getRecipeResult(recipeId), - save: (recipeId, recipeResult) => - this._saveRecipeResult(recipeId, recipeResult), - }); + this._ignition = new Ignition(_providers); } public async deploy( @@ -37,13 +35,15 @@ export class IgnitionWrapper { | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } | undefined ) { + const showUi = deployParams?.ui ?? true; + if (deployParams !== undefined) { await this._providers.config.setParams(deployParams.parameters); } const [deploymentResult] = await this._ignition.deploy(recipe, { ...this._deployOptions, - ui: deployParams?.ui ?? true, + ui: Boolean(deployParams?.ui) ? renderToCli : undefined, }); if (deploymentResult._kind === "hold") { @@ -59,9 +59,13 @@ export class IgnitionWrapper { failuresMessage += ` - ${failure.message}\n`; } - throw new Error( - `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` - ); + if (showUi) { + return process.exit(1); + } else { + throw new Error( + `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` + ); + } } const resolvedOutput: any = {}; @@ -90,64 +94,4 @@ export class IgnitionWrapper { public async plan(recipe: Recipe) { return this._ignition.plan(recipe); } - - private async _getRecipeResult( - recipeId: string - ): Promise { - if (this._isHardhatNetwork) { - return; - } - - const chainId = await this._getChainId(); - - const recipeResultPath = path.join( - this._paths.deployments, - String(chainId), - `${recipeId}.json` - ); - - if (!(await fsExtra.pathExists(recipeResultPath))) { - return; - } - - const serializedRecipeResult = await fsExtra.readJson(recipeResultPath); - - return serializedRecipeResult; - } - - private async _saveRecipeResult( - recipeId: string, - serializedRecipeResult: SerializedRecipeResult - ): Promise { - if (this._isHardhatNetwork) { - return; - } - - const chainId = await this._getChainId(); - - const deploymentsDirectory = path.join( - this._paths.deployments, - String(chainId) - ); - - fsExtra.ensureDirSync(deploymentsDirectory); - - const recipeResultPath = path.join( - deploymentsDirectory, - `${recipeId}.json` - ); - - await fsExtra.writeJson(recipeResultPath, serializedRecipeResult, { - spaces: 2, - }); - } - - private async _getChainId(): Promise { - if (this._cachedChainId === undefined) { - const { chainId } = await this._ethers.provider.getNetwork(); - this._cachedChainId = chainId; - } - - return this._cachedChainId; - } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 9a86e0305e..7d4aa2f16c 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -44,7 +44,7 @@ extendEnvironment((hre) => { hasArtifact: (name: string) => hre.artifacts.artifactExists(name), }, gasProvider: { - estimateGasLimit: async (tx) => { + estimateGasLimit: async (tx: any) => { const gasLimit = await hre.ethers.provider.estimateGas(tx); // return 1.5x estimated gas @@ -62,7 +62,7 @@ extendEnvironment((hre) => { }, }, transactions: { - isConfirmed: async (txHash) => { + isConfirmed: async (txHash: any) => { const blockNumber = await hre.ethers.provider.getBlockNumber(); const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); if (receipt === null) { @@ -71,7 +71,7 @@ extendEnvironment((hre) => { return receipt.blockNumber <= blockNumber; }, - isMined: async (txHash) => { + isMined: async (txHash: any) => { const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); return receipt !== null; }, @@ -93,7 +93,7 @@ extendEnvironment((hre) => { hre.ethers, isHardhatNetwork, hre.config.paths, - { pathToJournal, txPollingInterval, ui: false } + { pathToJournal, txPollingInterval, ui: true } ); }); }); @@ -140,7 +140,7 @@ task("deploy") process.exit(0); } - await hre.ignition.deploy(userRecipes[0], { parameters }); + await hre.ignition.deploy(userRecipes[0], { parameters, ui: true }); } ); diff --git a/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx b/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx new file mode 100644 index 0000000000..0a1b247973 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx @@ -0,0 +1,12 @@ +import { Box, Text } from "ink"; +import Spinner from "ink-spinner"; + +export const StartingPanel = () => { + return ( + + + Ignition starting + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx new file mode 100644 index 0000000000..75f9cbf3b3 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -0,0 +1,27 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import { Box, Text } from "ink"; + +export const ValidationFailedPanel = ({ + deployState, +}: { + deployState: DeployState; +}) => { + return ( + + + Ignition validation failed for recipe{" "} + {deployState.details.recipeName} + + + + {deployState.validation.errors.map((err, i) => ( + + ))} + + + ); +}; + +export const ErrorBox = ({ error }: { error: Error }) => { + return {error.message}; +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx new file mode 100644 index 0000000000..23cde06a80 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -0,0 +1,221 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import { Box, Text } from "ink"; +import Spinner from "ink-spinner"; + +import { UiBatch, UiVertex, UiVertexStatus } from "../../types"; + +import { Divider } from "./Divider"; + +export const BatchExecution = ({ + deployState, +}: { + deployState: DeployState; +}) => { + const batches = resolveBatchesFrom(deployState); + + return ( + <> + + + + {deployState.phase === "execution" ? ( + <> + + Executing + + + ) : ( + <> + Executed + + )} + + + {batches.map((batch, i) => ( + + ))} + + ); +}; + +const Batch = ({ batch }: { batch: UiBatch }) => { + const borderColor = resolveBatchBorderColor(batch.vertexes); + + return ( + + + #{batch.batchCount} + + + {batch.vertexes.map((vertex, i) => ( + + ))} + + ); +}; + +const Vertex = ({ vertex }: { vertex: UiVertex }) => { + const { borderColor, borderStyle, textColor } = resolveVertexColors(vertex); + + return ( + + + {vertex.label} + + ); +}; + +const StatusBadge = ({ vertex }: { vertex: UiVertex }) => { + let badge: any = " "; + switch (vertex.status) { + case "COMPELETED": + badge = ; + break; + case "ERRORED": + badge = ; + break; + case "HELD": + badge = ; + break; + case "RUNNING": + badge = ; + break; + default: + return assertNeverVertexStatus(vertex.status); + } + + return ( + <> + + {badge} + + + ); +}; + +function resolveBatchBorderColor(vertexes: UiVertex[]) { + if (vertexes.some((v) => v.status === "RUNNING")) { + return "lightgray"; + } + + if (vertexes.some((v) => v.status === "ERRORED")) { + return "red"; + } + + if (vertexes.every((v) => v.status === "COMPELETED")) { + return "green"; + } + + return "lightgray"; +} + +function resolveVertexColors(vertex: UiVertex): { + borderColor: string; + borderStyle: "single" | "classic" | "bold" | "singleDouble"; + textColor: string; +} { + switch (vertex.status) { + case "COMPELETED": + return { + borderColor: "greenBright", + borderStyle: "single", + textColor: "white", + }; + case "RUNNING": + return { + borderColor: "lightgray", + borderStyle: "singleDouble", + textColor: "white", + }; + case "HELD": + return { + borderColor: "darkgray", + borderStyle: "bold", + textColor: "white", + }; + case "ERRORED": + return { + borderColor: "redBright", + borderStyle: "bold", + textColor: "white", + }; + default: + return assertNeverVertexStatus(vertex.status); + } +} + +const resolveBatchesFrom = (deployState: DeployState): UiBatch[] => { + const stateBatches = + deployState.execution.batch.size > 0 + ? [ + ...deployState.execution.previousBatches, + deployState.execution.batch.keys(), + ] + : deployState.execution.previousBatches; + + return stateBatches.map((sb, i) => ({ + batchCount: i, + vertexes: [...sb] + .sort() + .map((vertexId): UiVertex | null => { + const vertex = + deployState.transform.executionGraph?.vertexes.get(vertexId); + + if (vertex === undefined) { + return null; + } + + const uiVertex: UiVertex = { + id: vertex.id, + label: vertex.label, + type: vertex.type, + status: determineStatusOf(deployState, vertex.id), + }; + + return uiVertex; + }) + .filter((v): v is UiVertex => v !== null), + })); +}; + +const determineStatusOf = ( + deployState: DeployState, + vertexId: number +): UiVertexStatus => { + const execution = deployState.execution; + + if (execution.batch.has(vertexId)) { + const entry = execution.batch.get(vertexId); + + if (entry === null) { + return "RUNNING"; + } + + if (entry?._kind === "success") { + return "COMPELETED"; + } + + if (entry?._kind === "failure") { + return "ERRORED"; + } + + throw new Error(`Unable to determine current batch status ${entry}`); + } + + if (execution.errored.has(vertexId)) { + return "ERRORED"; + } + + if (execution.completed.has(vertexId)) { + return "COMPELETED"; + } + + throw new Error(`Unable to determine vertex status for ${vertexId}`); +}; + +function assertNeverVertexStatus(status: never): any { + throw new Error(`Unexpected vertex status ${status}`); +} diff --git a/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx b/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx new file mode 100644 index 0000000000..b4a26f474c --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx @@ -0,0 +1,15 @@ +import { Box, Text } from "ink"; + +export const Divider = () => { + return ( + + + + {Array.from({ length: 400 }) + .map((_i) => "─") + .join("")} + + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx new file mode 100644 index 0000000000..15089c7725 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -0,0 +1,20 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import { Box } from "ink"; + +import { BatchExecution } from "./BatchExecution"; +import { FinalStatus } from "./FinalStatus"; +import { SummarySection } from "./SummarySection"; + +export const ExecutionPanel = ({ + deployState, +}: { + deployState: DeployState; +}) => { + return ( + + + + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx new file mode 100644 index 0000000000..3bb67ba634 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -0,0 +1,121 @@ +import { DeployState, ExecutionVertex } from "@nomicfoundation/ignition-core"; +import { Box, Text } from "ink"; + +import { DeploymentError } from "../../types"; + +import { Divider } from "./Divider"; + +export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { + if (deployState.phase === "complete") { + return ( + + + + 🚀 Deployment Complete for recipe{" "} + {deployState.details.recipeName} + + + ); + } + + if (deployState.phase === "failed") { + const deploymentErrors: DeploymentError[] = + getDeploymentErrors(deployState); + + return ( + + + + + + ⛔ {deployState.details.recipeName}{" "} + deployment{" "} + + failed + + + + + + {deploymentErrors.map((de) => ( + + ))} + + + ); + } + + return null; +}; + +const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { + return [...deployState.execution.errored] + .map((id) => { + const vertexResult = deployState.execution.resultsAccumulator.get(id); + + if (vertexResult === undefined || vertexResult._kind === "success") { + return null; + } + + const failure = vertexResult.failure; + + const vertex = deployState.transform.executionGraph?.vertexes.get(id); + + if (vertex === undefined) { + return null; + } + + const errorDescription = buildErrorDescriptionFrom(failure, vertex); + + return errorDescription; + }) + .filter((x): x is DeploymentError => x !== null); +}; + +const buildErrorDescriptionFrom = ( + error: Error, + vertex: ExecutionVertex +): DeploymentError => { + const message = "reason" in error ? (error as any).reason : error.message; + + return { + id: vertex.id, + vertex: vertex.label, + message, + failureType: resolveFailureTypeFrom(vertex), + }; +}; + +const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { + switch (vertex.type) { + case "ContractCall": + return "Failed contract call"; + case "ContractDeploy": + return "Failed contract deploy"; + case "DeployedContract": + return "-"; + case "LibraryDeploy": + return "Failed library deploy"; + default: + return assertNeverUiVertexType(vertex); + } +}; + +function assertNeverUiVertexType(vertex: never): string { + throw new Error(`Unexpected ui vertex type ${vertex}`); +} + +const DepError = ({ + deploymentError, +}: { + deploymentError: DeploymentError; +}) => { + return ( + + + {deploymentError.failureType} - {deploymentError.vertex} + + {deploymentError.message} + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx new file mode 100644 index 0000000000..1cdfe5373e --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -0,0 +1,18 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import { Box, Text } from "ink"; + +export const SummarySection = ({ + deployState: { + details: { recipeName }, + }, +}: { + deployState: DeployState; +}) => { + return ( + + + Deploying recipe {recipeName} + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx new file mode 100644 index 0000000000..d38f7d1117 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -0,0 +1,21 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import React from "react"; + +import { StartingPanel } from "./StartingPanel"; +import { ValidationFailedPanel } from "./ValidationFailedPanel"; +import { ExecutionPanel } from "./execution/ExecutionPanel"; + +export const IgnitionUi = ({ deployState }: { deployState: DeployState }) => { + if ( + deployState.phase === "uninitialized" || + deployState.phase === "validating" + ) { + return ; + } + + if (deployState.phase === "validation-failed") { + return ; + } + + return ; +}; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx new file mode 100644 index 0000000000..c9c38f90ce --- /dev/null +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -0,0 +1,8 @@ +import { DeployState } from "@nomicfoundation/ignition-core"; +import { render } from "ink"; + +import { IgnitionUi } from "./components"; + +export function renderToCli(state: DeployState) { + render(); +} diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts new file mode 100644 index 0000000000..8409f60873 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -0,0 +1,185 @@ +import { + DeployPhase, + ExecutionVertex, + ExecutionVertexType, + VertexVisitResultFailure, +} from "@nomicfoundation/ignition-core"; + +interface VertexSuccess { + status: "success"; + vertex: ExecutionVertex; +} + +interface VertexFailure { + status: "failure"; + vertex: ExecutionVertex; + error: unknown; +} + +interface Unstarted { + status: "unstarted"; + vertex: ExecutionVertex; +} + +export type VertexStatus = Unstarted | VertexSuccess | VertexFailure; + +export type UiVertexStatus = "RUNNING" | "COMPELETED" | "ERRORED" | "HELD"; +export interface UiVertex { + id: number; + label: string; + type: ExecutionVertexType; + status: UiVertexStatus; +} + +export interface UiBatch { + batchCount: number; + vertexes: UiVertex[]; +} + +export interface DeploymentError { + id: number; + vertex: string; + message: string; + failureType: string; +} + +export class DeploymentState { + public phase: DeployPhase; + public recipeName: string; + + private validationErrors: string[]; + private executionVertexes: { [key: string]: VertexStatus }; + private order: number[]; + public batches: UiBatch[]; + private errors: { [key: number]: VertexVisitResultFailure } | undefined; + + constructor({ recipeName }: { recipeName: string }) { + this.recipeName = recipeName; + this.phase = "uninitialized"; + + this.order = []; + + this.validationErrors = []; + this.executionVertexes = {}; + this.batches = []; + } + + public startExecutionPhase() { + this.phase = "execution"; + } + + public endExecutionPhase( + endPhase: "complete" | "failed", + errors?: { + [key: number]: VertexVisitResultFailure; + } + ) { + this.phase = endPhase; + this.errors = errors; + } + + public setBatch(batchCount: number, batch: UiBatch) { + this.batches[batchCount] = batch; + } + + public setExecutionVertexes(vertexes: ExecutionVertex[]) { + this.order = vertexes.map((v) => v.id); + + this.executionVertexes = Object.fromEntries( + vertexes.map((v): [number, Unstarted] => [ + v.id, + { status: "unstarted", vertex: v }, + ]) + ); + } + + public setExeuctionVertexAsSuccess(vertex: ExecutionVertex) { + this.executionVertexes[vertex.id] = { + vertex, + status: "success", + }; + } + + public setExecutionVertexAsFailure(vertex: ExecutionVertex, err: unknown) { + this.executionVertexes[vertex.id] = { + vertex, + status: "failure", + error: err, + }; + } + + public toStatus(): VertexStatus[] { + return this.order.map((id) => this.executionVertexes[id]); + } + + public executedCount(): { executed: number; total: number } { + const total = this.order.length; + const executed = Object.values(this.executionVertexes).filter( + (v) => v.status !== "unstarted" + ).length; + + return { executed, total }; + } + + public getDeploymentErrors(): DeploymentError[] { + if (this.batches.length === 0) { + return []; + } + + const lastBatch = this.batches[this.batches.length - 1]; + const errors = this.errors ?? {}; + + return Object.keys(errors) + .map((ids: string) => { + const id = parseInt(ids, 10); + + const error = errors[id]; + const vertex = lastBatch.vertexes.find((v) => v.id === id); + + if (vertex === undefined) { + return undefined; + } + + const errorDescription = this._buildErrorDescriptionFrom( + error.failure, + vertex + ); + + return errorDescription; + }) + .filter((x): x is DeploymentError => x !== undefined); + } + + private _buildErrorDescriptionFrom( + error: Error, + vertex: UiVertex + ): DeploymentError { + const message = "reason" in error ? (error as any).reason : error.message; + + return { + id: vertex.id, + vertex: vertex.label, + message, + failureType: this._resolveFailureTypeFrom(vertex), + }; + } + + private _resolveFailureTypeFrom(vertex: UiVertex): string { + switch (vertex.type) { + case "ContractCall": + return "Failed contract call"; + case "ContractDeploy": + return "Failed contract deploy"; + case "DeployedContract": + return "-"; + case "LibraryDeploy": + return "Failed library deploy"; + default: + return assertNeverUiVertexType(vertex.type); + } + } +} + +function assertNeverUiVertexType(type: never): string { + throw new Error(`Unexpected ui vertex type ${type}`); +} diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index c488e512e1..d9b7fb40a9 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -165,7 +165,7 @@ describe("recipe parameters", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, {}); + const deployPromise = this.hre.ignition.deploy(userRecipe, { ui: false }); await mineBlocks(this.hre, [1, 1], deployPromise); @@ -194,6 +194,7 @@ describe("recipe parameters", () => { parameters: { NotMyNumber: 11, }, + ui: false, }); await mineBlocks(this.hre, [1, 1], deployPromise); diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index 5195bbf618..63a92198ad 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -1,14 +1,18 @@ { "compilerOptions": { - "target": "ES2017", + "lib": ["es2021"], "module": "commonjs", + "target": "es2021", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "incremental": true, "outDir": "./dist", "declaration": true, "declarationMap": true, "sourceMap": true, - "strict": true, - "esModuleInterop": true + "jsx": "react-jsx" }, "exclude": ["dist", "node_modules", "test", "src/plan/assets"] } diff --git a/yarn.lock b/yarn.lock index 0ffdcd8068..00a439b93e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3743,14 +3743,14 @@ inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, i resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -ink-spinner@^4.0.3: +ink-spinner@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-4.0.3.tgz#0d0f4a787ae1a4270928e063d9c52527cb264feb" integrity sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ== dependencies: cli-spinners "^2.3.0" -ink@^3.2.0: +ink@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== @@ -5071,13 +5071,12 @@ react-reconciler@^0.26.2: object-assign "^4.1.1" scheduler "^0.20.2" -react@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== +react@18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" - object-assign "^4.1.1" read-pkg-up@^3.0.0: version "3.0.0" From bc53dcf077c8dfb9981103a8b27427d4f5b03ebb Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 13 Jul 2022 15:08:34 +0100 Subject: [PATCH 0105/1302] chore: add `test:examples` to ci Run tests against the `./examples` folders from the github action. --- .github/workflows/ci.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 797a75fb0e..636a120531 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,6 +25,8 @@ jobs: run: yarn lint - name: Run tests run: yarn test + - name: Run tests in examples + run: yarn test:examples test_on_macos: name: Test Ignition on MacOS with Node 14 @@ -43,6 +45,8 @@ jobs: run: yarn lint - name: Run tests run: yarn test + - name: Run tests in examples + run: yarn test:examples test_on_linux: name: Test Ignition on Ubuntu with Node ${{ matrix.node }} @@ -64,3 +68,5 @@ jobs: run: yarn lint - name: Run tests run: yarn test + - name: Run tests in examples + run: yarn test:examples From 013d595ab5a50bbdb36059a1b441927fdb34095c Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Oct 2022 14:44:06 +0100 Subject: [PATCH 0106/1302] fix(deploy): turn off file journaling This subsystem needs reworked. Turn it off for the moment. --- packages/core/src/deployment/Deployment.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 146f2bcb47..5d824dcff0 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -3,7 +3,6 @@ import setupDebug from "debug"; import { IgnitionDeployOptions } from "Ignition"; import { ExecutionGraph } from "execution/ExecutionGraph"; import { ExecuteBatchResult } from "execution/batch/types"; -import { FileJournal } from "journal/FileJournal"; import { InMemoryJournal } from "journal/InMemoryJournal"; import { createServices } from "services/createServices"; import { Services } from "services/types"; @@ -38,7 +37,8 @@ export class Deployment { const journal = options.pathToJournal !== undefined - ? new FileJournal(options.pathToJournal) + ? // TODO: bring back FileJournal + new InMemoryJournal() // ? new FileJournal(options.pathToJournal) : new InMemoryJournal(); const serviceOptions = { From 48c81ecb6720323bf48987161c8c112f3eaf7b4c Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Oct 2022 14:19:32 +0100 Subject: [PATCH 0107/1302] refactor: force everything to accumulator type --- packages/core/src/Ignition.ts | 8 +++----- packages/core/src/deployment/Deployment.ts | 6 +++++- packages/core/src/deployment/deployStateReducer.ts | 14 +++++++++----- packages/core/src/execution/batch/types.ts | 6 +++--- .../core/src/execution/batch/visitInBatches.ts | 3 ++- .../src/execution/dispatch/executeContractCall.ts | 2 +- .../execution/dispatch/executeContractDeploy.ts | 4 ++-- .../execution/dispatch/executeDeployedContract.ts | 4 ++-- .../src/execution/dispatch/executeLibraryDeploy.ts | 4 ++-- .../src/execution/dispatch/executionDispatch.ts | 4 ++-- packages/core/src/execution/dispatch/utils.ts | 4 ++-- packages/core/src/graph/visit.ts | 11 ++++++++--- packages/core/src/types/deployment.ts | 4 ++-- packages/core/src/types/graph.ts | 4 +++- .../dispatch/validateArtifactContract.ts | 4 ++-- .../validation/dispatch/validateArtifactLibrary.ts | 4 ++-- .../core/src/validation/dispatch/validateCall.ts | 4 ++-- .../dispatch/validateDeployedContract.ts | 4 ++-- .../validation/dispatch/validateHardhatContract.ts | 4 ++-- .../validation/dispatch/validateHardhatLibrary.ts | 4 ++-- .../src/validation/dispatch/validateVirtual.ts | 4 ++-- .../src/validation/dispatch/validationDispatch.ts | 4 ++-- .../core/src/validation/validateRecipeGraph.ts | 4 ++-- .../src/ui/components/execution/FinalStatus.tsx | 6 +++++- 24 files changed, 69 insertions(+), 51 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 610f6c34e9..e1d3a74eec 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -9,7 +9,7 @@ import { createServices } from "services/createServices"; import { Services } from "services/types"; import { DeploymentResult, UpdateUiAction } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator } from "types/graph"; import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; import { Recipe } from "types/recipeGraph"; @@ -155,10 +155,7 @@ export class Ignition { return Number(result); } - private _serialize( - recipeOutputs: FutureDict, - result: Map - ) { + private _serialize(recipeOutputs: FutureDict, result: ResultsAccumulator) { const entries = Object.entries(recipeOutputs).filter( (entry): entry is [string, DependableFuture] => isDependable(entry[1]) ); @@ -169,6 +166,7 @@ export class Ignition { if ( executionResultValue === undefined || + executionResultValue === null || executionResultValue._kind === "failure" ) { return null; diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 5d824dcff0..3dade495b1 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -142,7 +142,11 @@ export class Deployment { (acc: { [key: number]: VertexVisitResultFailure }, id) => { const result = this.state.execution.resultsAccumulator.get(id); - if (result === undefined || result._kind === "success") { + if ( + result === undefined || + result === null || + result._kind === "success" + ) { return acc; } diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 2c3c70a9ec..da9f839912 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -1,7 +1,7 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; import { ExecuteBatchResult } from "execution/batch/types"; import { DeployPhase, DeployState, ExecutionState } from "types/deployment"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { Recipe } from "types/recipeGraph"; import { difference, union } from "utils/sets"; @@ -42,11 +42,13 @@ export function initialiseExecutionStateFrom( errored: new Set(), batch: new Map(), previousBatches: [], - resultsAccumulator: [...unstarted].reduce>((acc, id) => { + resultsAccumulator: [...unstarted].reduce< + Map + >((acc, id) => { acc.set(id, null); return acc; - }, new Map()), + }, new Map()), }; return executionState; @@ -212,9 +214,11 @@ export function updateExecutionStateWithBatchResults( export function mergeBatchResultsInResultsAccumulator( executionState: ExecutionState, - batchResultsAcc: Map + batchResultsAcc: ResultsAccumulator ): ExecutionState { - const updatedResultsAccumulator = new Map(executionState.resultsAccumulator); + const updatedResultsAccumulator: ResultsAccumulator = new Map( + executionState.resultsAccumulator + ); batchResultsAcc.forEach((result, vertexId) => { updatedResultsAccumulator.set(vertexId, result); diff --git a/packages/core/src/execution/batch/types.ts b/packages/core/src/execution/batch/types.ts index c48b0d247b..a8911d0b63 100644 --- a/packages/core/src/execution/batch/types.ts +++ b/packages/core/src/execution/batch/types.ts @@ -1,11 +1,11 @@ import { Services } from "services/types"; import { ExecutionVertex } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; export type BatcherResult = | { _kind: "success"; - context: Map; + context: Map; } | { _kind: "failure"; @@ -14,7 +14,7 @@ export type BatcherResult = export type ExecutionVertexDispatcher = ( vertex: ExecutionVertex, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, context: { services: Services } ) => Promise; diff --git a/packages/core/src/execution/batch/visitInBatches.ts b/packages/core/src/execution/batch/visitInBatches.ts index f73dbdec8a..ac463b44cd 100644 --- a/packages/core/src/execution/batch/visitInBatches.ts +++ b/packages/core/src/execution/batch/visitInBatches.ts @@ -3,6 +3,7 @@ import { Services } from "services/types"; import { ExecutionState } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { + ResultsAccumulator, VertexVisitResult, VertexVisitResultFailure, VertexVisitResultSuccess, @@ -76,7 +77,7 @@ function calculateNextBatch( async function executeBatch( batch: Set, executionGraph: ExecutionGraph, - resultsAccumulator: Map, + resultsAccumulator: ResultsAccumulator, uiUpdate: (vertexId: number, result: VertexVisitResult) => void, { services }: { services: Services }, executionVertexDispatcher: ExecutionVertexDispatcher diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index d0a17f97ff..48dc18e937 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -6,7 +6,7 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( { method, contract, args }: ContractCall, - resultAccumulator: Map, + resultAccumulator: Map, { services }: { services: Services } ): Promise { const resolve = resolveFrom(resultAccumulator); diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index cc7ee26d30..f6efa24d68 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,12 +1,12 @@ import { Services } from "services/types"; import { ContractDeploy } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( { artifact, args, libraries }: ContractDeploy, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { try { diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index 337ea337d1..36f42e2dc5 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,10 +1,10 @@ import { Services } from "services/types"; import { DeployedContract } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; export async function executeDeployedContract( { label, address, abi }: DeployedContract, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, _: { services: Services } ): Promise { return { diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 8b3ad5366d..4816a67636 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,12 +1,12 @@ import { Services } from "services/types"; import { LibraryDeploy } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeLibraryDeploy( { artifact, args }: LibraryDeploy, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { try { diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 1f8775f5d5..7c98e5eabd 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,6 +1,6 @@ import { Services } from "services/types"; import { ExecutionVertex } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { executeContractCall } from "./executeContractCall"; import { executeContractDeploy } from "./executeContractDeploy"; @@ -9,7 +9,7 @@ import { executeLibraryDeploy } from "./executeLibraryDeploy"; export function executionDispatch( executionVertex: ExecutionVertex, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { switch (executionVertex.type) { diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index 9d46be7a2e..231e042c10 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,5 +1,5 @@ import { ArgValue } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator } from "types/graph"; import { isDependable } from "utils/guards"; export function toAddress(v: any) { @@ -10,7 +10,7 @@ export function toAddress(v: any) { return v; } -export function resolveFrom(context: Map) { +export function resolveFrom(context: ResultsAccumulator) { return (arg: ArgValue) => { if (!isDependable(arg)) { return arg; diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 140745a931..8c85f0c0c7 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -1,14 +1,19 @@ -import { IGraph, VertexVisitResult, VisitResult } from "types/graph"; +import { + IGraph, + ResultsAccumulator, + VertexVisitResult, + VisitResult, +} from "types/graph"; export async function visit( phase: "Execution" | "Validation", orderedVertexIds: number[], graph: IGraph, context: C, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, vistitorAction: ( vertex: T, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, context: C ) => Promise, afterAction?: (vertex: T, kind: "success" | "failure", err?: unknown) => void diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index de5e802900..157c710977 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,6 +1,6 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; -import { VertexVisitResult } from "./graph"; +import { ResultsAccumulator, VertexVisitResult } from "./graph"; import { SerializedDeploymentResult, SerializedFutureResult, @@ -42,7 +42,7 @@ export interface ExecutionState { batch: Map; previousBatches: Array>; - resultsAccumulator: Map; + resultsAccumulator: ResultsAccumulator; } export interface DeployState { diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index 19053e532b..4516d93543 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -30,9 +30,11 @@ export type VertexVisitResult = export type VisitResult = | { _kind: "success"; - result: Map; + result: ResultsAccumulator; } | { _kind: "failure"; failures: [string, Error[]]; }; + +export type ResultsAccumulator = Map; diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index 217948b0f2..793fb787df 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,13 +1,13 @@ import { ethers } from "ethers"; import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { ArtifactContractRecipeVertex } from "types/recipeGraph"; import { isArtifact } from "utils/guards"; export async function validateArtifactContract( vertex: ArtifactContractRecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { const artifactExists = isArtifact(vertex.artifact); diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index c2268c9d08..042cb57326 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,13 +1,13 @@ import { ethers } from "ethers"; import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { ArtifactLibraryRecipeVertex } from "types/recipeGraph"; import { isArtifact } from "utils/guards"; export async function validateArtifactLibrary( vertex: ArtifactLibraryRecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { const artifactExists = isArtifact(vertex.artifact); diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 31a2f15b53..fa0c77ad8a 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -2,12 +2,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { CallableFuture } from "types/future"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { CallRecipeVertex } from "types/recipeGraph"; export async function validateCall( vertex: CallRecipeVertex, - resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { const contractName = vertex.contract.label; diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 1fe943e487..323bc3757b 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,12 +1,12 @@ import { isAddress } from "@ethersproject/address"; import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { DeployedContractRecipeVertex } from "types/recipeGraph"; export async function validateDeployedContract( vertex: DeployedContractRecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { if (!isAddress(vertex.address)) { diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 1568958991..f6559b34b5 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { HardhatContractRecipeVertex } from "types/recipeGraph"; export async function validateHardhatContract( vertex: HardhatContractRecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { const artifactExists = await services.artifacts.hasArtifact( diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index f4f26f015d..d8eb3af618 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { HardhatLibraryRecipeVertex } from "types/recipeGraph"; export async function validateHardhatLibrary( vertex: HardhatLibraryRecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { const artifactExists = await services.artifacts.hasArtifact( diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index be0bc0d976..483bb1f0fa 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,10 +1,10 @@ import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { RecipeVertex } from "types/recipeGraph"; export async function validateVirtual( _recipeVertex: RecipeVertex, - _resultAccumulator: Map, + _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { return { diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 8d27dcd81d..e340e7f8c6 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,5 +1,5 @@ import { Services } from "services/types"; -import { VertexVisitResult } from "types/graph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { RecipeVertex } from "types/recipeGraph"; import { validateArtifactContract } from "./validateArtifactContract"; @@ -12,7 +12,7 @@ import { validateVirtual } from "./validateVirtual"; export function validationDispatch( recipeVertex: RecipeVertex, - resultAccumulator: Map, + resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { switch (recipeVertex.type) { diff --git a/packages/core/src/validation/validateRecipeGraph.ts b/packages/core/src/validation/validateRecipeGraph.ts index eb52ae1def..94effc52a2 100644 --- a/packages/core/src/validation/validateRecipeGraph.ts +++ b/packages/core/src/validation/validateRecipeGraph.ts @@ -1,7 +1,7 @@ import { getSortedVertexIdsFrom } from "graph/utils"; import { visit } from "graph/visit"; import { Services } from "services/types"; -import { VisitResult } from "types/graph"; +import { VertexVisitResult, VisitResult } from "types/graph"; import { IRecipeGraph } from "types/recipeGraph"; import { validationDispatch } from "./dispatch/validationDispatch"; @@ -17,7 +17,7 @@ export function validateRecipeGraph( orderedVertexIds, recipeGraph, { services }, - new Map(), + new Map(), validationDispatch ); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 3bb67ba634..5a47a94e38 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -53,7 +53,11 @@ const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { .map((id) => { const vertexResult = deployState.execution.resultsAccumulator.get(id); - if (vertexResult === undefined || vertexResult._kind === "success") { + if ( + vertexResult === undefined || + vertexResult === null || + vertexResult._kind === "success" + ) { return null; } From bdecfd5ae42b491277afb1be7731ef6385f6571d Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Oct 2022 17:18:17 +0100 Subject: [PATCH 0108/1302] feat: support more afters Also resolve parameter deps through `useRecipe`. --- .../core/src/recipe/RecipeGraphBuilder.ts | 145 ++++++++++++++---- packages/core/src/types/recipeGraph.ts | 9 +- packages/core/test/recipes.ts | 77 +++++++--- 3 files changed, 180 insertions(+), 51 deletions(-) diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index a693b56cd5..ad99093746 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -17,6 +17,7 @@ import type { import type { Artifact } from "types/hardhat"; import { ContractOptions, + InternalParamValue, IRecipeGraph, IRecipeGraphBuilder, Recipe, @@ -75,6 +76,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { artifact, args: options?.args ?? [], scopeAdded: this.scopes.getScopedLabel(), + after: options?.after ?? [], }); return artifactContractFuture; @@ -97,6 +99,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { libraryName, args: options?.args ?? [], scopeAdded: this.scopes.getScopedLabel(), + after: options?.after ?? [], }); return libraryFuture; @@ -129,6 +132,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { args: options?.args ?? [], libraries: options?.libraries ?? {}, scopeAdded: this.scopes.getScopedLabel(), + after: options?.after ?? [], }); return artifactContractFuture; @@ -152,6 +156,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { args: options?.args ?? [], libraries: options?.libraries ?? {}, scopeAdded: this.scopes.getScopedLabel(), + after: options?.after ?? [], }); return contractFuture; @@ -161,7 +166,8 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { public contractAt( contractName: string, address: string, - abi: any[] + abi: any[], + options?: { after?: RecipeFuture[] } ): DeployedContract { const deployedFuture: DeployedContract = { vertexId: this._resolveNextId(), @@ -179,6 +185,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { address, abi, scopeAdded: this.scopes.getScopedLabel(), + after: options?.after ?? [], }); return deployedFuture; @@ -330,25 +337,43 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { graph.vertexes.set(depNode.id, depNode); ensureVertex(graph.adjacencyList, depNode.id); - if (depNode.type !== "DeployedContract" && depNode.type !== "Virtual") { - const futureArgs = depNode.args.filter(isDependable); - - for (const arg of futureArgs) { - addEdge(graph.adjacencyList, { from: arg.vertexId, to: depNode.id }); - } + if (depNode.type === "HardhatContract") { + RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + RecipeGraphBuilder._addEdgesBasedOn( + Object.values(depNode.libraries), + graph, + depNode + ); + RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + return; } - if ( - depNode.type === "HardhatContract" || - depNode.type === "ArtifactContract" - ) { - const futureLibraries = Object.values(depNode.libraries).filter( - isDependable + if (depNode.type === "ArtifactContract") { + RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + RecipeGraphBuilder._addEdgesBasedOn( + Object.values(depNode.libraries), + graph, + depNode ); + RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + return; + } - for (const lib of futureLibraries) { - addEdge(graph.adjacencyList, { from: lib.vertexId, to: depNode.id }); - } + if (depNode.type === "DeployedContract") { + RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + return; + } + + if (depNode.type === "HardhatLibrary") { + RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + return; + } + + if (depNode.type === "ArtifactLibrary") { + RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + return; } if (depNode.type === "Call") { @@ -357,21 +382,87 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { to: depNode.id, }); - for (const afterVertex of depNode.after.filter(isDependable)) { - addEdge(graph.adjacencyList, { - from: afterVertex.vertexId, - to: depNode.id, - }); - } + RecipeGraphBuilder._addEdgesBasedOn( + Object.values(depNode.args), + graph, + depNode + ); + RecipeGraphBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + return; } if (depNode.type === "Virtual") { - for (const afterVertex of depNode.after.filter(isDependable)) { - addEdge(graph.adjacencyList, { - from: afterVertex.vertexId, - to: depNode.id, - }); + RecipeGraphBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + return; + } + } + + private static _addEdgesBasedOn( + args: InternalParamValue[], + graph: RecipeGraph, + depNode: RecipeVertex + ) { + for (const arg of args) { + if ( + typeof arg === "string" || + typeof arg === "number" || + typeof arg === "boolean" + ) { + continue; + } + + if (isDependable(arg)) { + addEdge(graph.adjacencyList, { from: arg.vertexId, to: depNode.id }); + continue; + } + + if (isParameter(arg)) { + const resolvedArg = RecipeGraphBuilder._resolveParameterFromScope( + graph, + arg + ); + + if (isDependable(resolvedArg)) { + addEdge(graph.adjacencyList, { + from: resolvedArg.vertexId, + to: depNode.id, + }); + continue; + } + + continue; } } } + + private static _resolveParameterFromScope( + graph: RecipeGraph, + param: RequiredParameter | OptionalParameter + ) { + const parametersFromScope = graph.registeredParameters[param.scope]; + + if (parametersFromScope === undefined) { + return param; + } + + const scopeValue = parametersFromScope[param.label]; + + if (param.subtype === "optional") { + return scopeValue ?? param.defaultValue; + } + + if (scopeValue === undefined) { + return param; + } + + return scopeValue; + } } diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index 3a7f935029..8278090c47 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -47,6 +47,7 @@ export interface HardhatContractRecipeVertex extends VertexDescriptor { contractName: string; args: InternalParamValue[]; libraries: LibraryMap; + after: RecipeFuture[]; } export interface ArtifactContractRecipeVertex extends VertexDescriptor { @@ -55,6 +56,7 @@ export interface ArtifactContractRecipeVertex extends VertexDescriptor { artifact: Artifact; args: InternalParamValue[]; libraries: LibraryMap; + after: RecipeFuture[]; } export interface DeployedContractRecipeVertex extends VertexDescriptor { @@ -62,6 +64,7 @@ export interface DeployedContractRecipeVertex extends VertexDescriptor { scopeAdded: string; address: string; abi: any[]; + after: RecipeFuture[]; } export interface HardhatLibraryRecipeVertex extends VertexDescriptor { @@ -69,6 +72,7 @@ export interface HardhatLibraryRecipeVertex extends VertexDescriptor { libraryName: string; scopeAdded: string; args: InternalParamValue[]; + after: RecipeFuture[]; } export interface ArtifactLibraryRecipeVertex extends VertexDescriptor { @@ -76,6 +80,7 @@ export interface ArtifactLibraryRecipeVertex extends VertexDescriptor { scopeAdded: string; artifact: Artifact; args: InternalParamValue[]; + after: RecipeFuture[]; } export interface CallRecipeVertex extends VertexDescriptor { @@ -98,6 +103,7 @@ export interface ContractOptions { libraries?: { [key: string]: RecipeFuture; }; + after?: RecipeFuture[]; } export interface UseRecipeOptions { @@ -117,7 +123,8 @@ export interface IRecipeGraphBuilder { contractAt: ( contractName: string, address: string, - abi: any[] + abi: any[], + options?: { after?: RecipeFuture[] } ) => DeployedContract; library: ( diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index dd0faae6ee..5f66838301 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -216,9 +216,11 @@ describe("Recipes", function () { "dependenciesBetweenContracts", (m: IRecipeGraphBuilder) => { const a = m.contract("A"); + const someother = m.contract("Someother"); const b = m.contract("B", { args: [a], + after: [someother], }); return { a, b }; @@ -236,8 +238,8 @@ describe("Recipes", function () { assert.isDefined(recipeGraph); }); - it("should have two nodes", () => { - assert.equal(recipeGraph.vertexes.size, 2); + it("should have three nodes", () => { + assert.equal(recipeGraph.vertexes.size, 3); }); it("should have the contract node A", () => { @@ -273,7 +275,7 @@ describe("Recipes", function () { assert.deepStrictEqual(deps, []); }); - it("should show one dependency on A for the contract node B", () => { + it("should show two dependencies, on A for the contract node B, on A for Someother", () => { const depNode = getRecipeVertexByLabel(recipeGraph, "B"); if (depNode === undefined) { @@ -282,7 +284,10 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 0, label: "A" }]); + assert.deepStrictEqual(deps, [ + { id: 0, label: "A" }, + { id: 1, label: "Someother" }, + ]); }); it("should record the argument list for the contract node A as empty", () => { @@ -307,9 +312,11 @@ describe("Recipes", function () { const callRecipe = buildRecipe("call", (m: IRecipeGraphBuilder) => { const token = m.contract("Token"); const exchange = m.contract("Exchange"); + const another = m.contract("Another"); m.call(exchange, "addToken", { args: [token], + after: [another], }); return {}; @@ -326,8 +333,8 @@ describe("Recipes", function () { assert.isDefined(recipeGraph); }); - it("should have three nodes", () => { - assert.equal(recipeGraph.vertexes.size, 3); + it("should have four nodes", () => { + assert.equal(recipeGraph.vertexes.size, 4); }); it("should have the contract node Token", () => { @@ -386,7 +393,7 @@ describe("Recipes", function () { assert.deepStrictEqual(deps, []); }); - it("should show two dependencies for the call node Exchange/addToken", () => { + it("should show three dependencies for the call node Exchange/addToken", () => { const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); if (depNode === undefined) { @@ -401,6 +408,7 @@ describe("Recipes", function () { label: "Token", }, { id: 1, label: "Exchange" }, + { id: 2, label: "Another" }, ]); }); @@ -462,7 +470,11 @@ describe("Recipes", function () { before(() => { const uniswapRecipe = buildRecipe("Uniswap", (m: IRecipeGraphBuilder) => { const abi = [{}]; - const uniswap = m.contractAt("UniswapRouter", "0x123...", abi); + const someother = m.contract("Someother"); + + const uniswap = m.contractAt("UniswapRouter", "0x123...", abi, { + after: [someother], + }); return { uniswap }; }); @@ -478,8 +490,8 @@ describe("Recipes", function () { assert.isDefined(recipeGraph); }); - it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 1); + it("should have two nodes", () => { + assert.equal(recipeGraph.vertexes.size, 2); }); it("should have the deployed contract node", () => { @@ -493,7 +505,7 @@ describe("Recipes", function () { assert(isDeployedContract(depNode)); }); - it("should show no dependencies for the deployed contract node", () => { + it("should show one dependencies for the deployed contract node on someother", () => { const depNode = getRecipeVertexByLabel(recipeGraph, "UniswapRouter"); if (depNode === undefined) { @@ -502,7 +514,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, []); + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother" }]); }); }); @@ -515,8 +527,11 @@ describe("Recipes", function () { const fromArtifactRecipe = buildRecipe( "FromArtifact", (m: IRecipeGraphBuilder) => { + const someother = m.contract("Someother"); + const foo = m.contract("Foo", artifact, { args: [0], + after: [someother], }); return { foo }; @@ -534,8 +549,8 @@ describe("Recipes", function () { assert.isDefined(recipeGraph); }); - it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 1); + it("should have two nodes", () => { + assert.equal(recipeGraph.vertexes.size, 2); }); it("should have the artifact contract node", () => { @@ -549,7 +564,7 @@ describe("Recipes", function () { assert(isArtifactContract(depNode)); }); - it("should show no dependencies for the artifact contract node", () => { + it("should show one dependency for the artifact contract node on Someother", () => { const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); if (depNode === undefined) { @@ -558,7 +573,12 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, []); + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Someother", + }, + ]); }); it("should record the argument list for the artifact contract node", () => { @@ -583,8 +603,11 @@ describe("Recipes", function () { const librariesRecipe = buildRecipe( "libraries", (m: IRecipeGraphBuilder) => { + const someother = m.contract("Someother"); + const safeMath = m.library("SafeMath", { args: [42], + after: [someother], }); const contract = m.contract("Contract", { @@ -608,8 +631,8 @@ describe("Recipes", function () { assert.isDefined(recipeGraph); }); - it("should have two nodes", () => { - assert.equal(recipeGraph.vertexes.size, 2); + it("should have three nodes", () => { + assert.equal(recipeGraph.vertexes.size, 3); }); it("should have the library node SafeMath", () => { @@ -634,7 +657,7 @@ describe("Recipes", function () { assert(isHardhatContract(depNode)); }); - it("should show no dependencies for the library node SafeMath", () => { + it("should show one dependencies for the library node SafeMath to Someother", () => { const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); if (depNode === undefined) { @@ -643,7 +666,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, []); + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother" }]); }); it("should show one dependency on library node SafeMath for Contract", () => { @@ -655,7 +678,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 0, label: "SafeMath" }]); + assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath" }]); }); it("should record the argument list for the library node SafeMath as [42]", () => { @@ -706,7 +729,15 @@ describe("Recipes", function () { } ); - const { graph } = generateRecipeGraphFrom(librariesRecipe, { + const WrapRecipe = buildRecipe("Wrap", (m: IRecipeGraphBuilder) => { + const token = m.useRecipe(librariesRecipe, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token }; + }); + + const { graph } = generateRecipeGraphFrom(WrapRecipe, { chainId: 31, }); @@ -718,7 +749,7 @@ describe("Recipes", function () { }); it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 1); + assert.equal(recipeGraph.vertexes.size, 2); }); }); }); From 25a38bff6fabbfa877cb19210b7e101e826ff962 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 1 Jul 2022 09:59:00 +0100 Subject: [PATCH 0109/1302] docs: ens example Add an example project that attempts to deploy ENS. --- examples/ens/.gitignore | 9 + examples/ens/README.md | 27 + examples/ens/contracts/ENS.sol | 7 + examples/ens/contracts/ReverseRegistrar.sol | 4 + examples/ens/hardhat.config.js | 17 + examples/ens/ignition/ENS.js | 90 + examples/ens/ignition/test-registrar.js | 32 + examples/ens/package.json | 15 + examples/ens/scripts/deploy-ens.js | 67 + examples/ens/test/sample-test.js | 32 + yarn.lock | 5250 +++++++++++++++---- 11 files changed, 4443 insertions(+), 1107 deletions(-) create mode 100644 examples/ens/.gitignore create mode 100644 examples/ens/README.md create mode 100644 examples/ens/contracts/ENS.sol create mode 100644 examples/ens/contracts/ReverseRegistrar.sol create mode 100644 examples/ens/hardhat.config.js create mode 100644 examples/ens/ignition/ENS.js create mode 100644 examples/ens/ignition/test-registrar.js create mode 100644 examples/ens/package.json create mode 100644 examples/ens/scripts/deploy-ens.js create mode 100644 examples/ens/test/sample-test.js diff --git a/examples/ens/.gitignore b/examples/ens/.gitignore new file mode 100644 index 0000000000..36077f2884 --- /dev/null +++ b/examples/ens/.gitignore @@ -0,0 +1,9 @@ +node_modules +.env +coverage +coverage.json +typechain + +#Hardhat files +cache +artifacts diff --git a/examples/ens/README.md b/examples/ens/README.md new file mode 100644 index 0000000000..047b319e93 --- /dev/null +++ b/examples/ens/README.md @@ -0,0 +1,27 @@ +# ENS Example for Ignition + +This hardhat project is an example of using ignition to deploy the ENS system of contracts, based on the [Deploying ens on a private chain](https://docs.ens.domains/deploying-ens-on-a-private-chain#migration-file-example) from the ens docs. + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy ENS.js +``` + +To run a deploy of ENS with a test registrar against the local node: + +```shell +npx hardhat node +# In another terminal +npx hardhat deploy test-registrar.js --network localhost +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` diff --git a/examples/ens/contracts/ENS.sol b/examples/ens/contracts/ENS.sol new file mode 100644 index 0000000000..9fb103bed1 --- /dev/null +++ b/examples/ens/contracts/ENS.sol @@ -0,0 +1,7 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +// These imports are here to force Hardhat to compile contracts we depend on in our tests but don't need anywhere else. +import "@ensdomains/ens-contracts/contracts/registry/ENSRegistry.sol"; +import "@ensdomains/ens-contracts/contracts/registry/FIFSRegistrar.sol"; +import "@ensdomains/ens-contracts/contracts/resolvers/PublicResolver.sol"; diff --git a/examples/ens/contracts/ReverseRegistrar.sol b/examples/ens/contracts/ReverseRegistrar.sol new file mode 100644 index 0000000000..d4ddfdfec0 --- /dev/null +++ b/examples/ens/contracts/ReverseRegistrar.sol @@ -0,0 +1,4 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +import "@ensdomains/ens-contracts/contracts/registry/ReverseRegistrar.sol"; diff --git a/examples/ens/hardhat.config.js b/examples/ens/hardhat.config.js new file mode 100644 index 0000000000..6afaf1c444 --- /dev/null +++ b/examples/ens/hardhat.config.js @@ -0,0 +1,17 @@ +require("@nomicfoundation/hardhat-ignition"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.5", + networks: { + hardhat: { + mining: { + // auto: false + }, + blockGasLimit: 5_000_000_000, + initialBaseFeePerGas: 1_000_000_000, + }, + }, +}; diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js new file mode 100644 index 0000000000..568cc14214 --- /dev/null +++ b/examples/ens/ignition/ENS.js @@ -0,0 +1,90 @@ +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); + +const namehash = require("eth-ens-namehash"); +const ethers = hre.ethers; +const utils = ethers.utils; +const labelhash = (label) => utils.keccak256(utils.toUtf8Bytes(label)); + +const reverseTld = "reverse"; +const reverseTldHash = namehash.hash(reverseTld); +const resolverNode = namehash.hash("resolver"); +const resolverLabel = labelhash("resolver"); +const reverseLabel = labelhash("reverse"); +const addrLabel = labelhash("addr"); + +const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; +const ZERO_HASH = + "0x0000000000000000000000000000000000000000000000000000000000000000"; + +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + +const setupResolver = buildRecipe("RESOLVER", (m) => { + const ens = m.getParam("ENS"); + const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); + + // Setup resolver + const resolver = m.contract("PublicResolver", { + args: [ens, ZERO_ADDRESS], + }); + + m.call(ens, "setSubnodeOwner", { + id: "set sub-node owner for resolver", + args: [ZERO_HASH, resolverLabel, account], + }); + + m.call(ens, "setResolver", { + args: [resolverNode, resolver], + }); + + m.call(resolver, "setAddr(bytes32,address)", { + args: [resolverNode, resolver], + }); + + return { resolver }; +}); + +const setupReverseRegistrar = buildRecipe("REVERSEREGISTRAR", (m) => { + const ens = m.getParam("ENS"); + const resolver = m.getParam("RESOLVER"); + const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); + + // Setup Reverse Registrar + const reverseRegistrar = m.contract("ReverseRegistrar", { + args: [ens, resolver], + }); + + m.call(ens, "setSubnodeOwner", { + id: "set sub-node owner reverse", + args: [ZERO_HASH, reverseLabel, account], + }); + + m.call(ens, "setSubnodeOwner", { + id: "set sub-node addr label", + args: [reverseTldHash, addrLabel, reverseRegistrar], + }); + + return { reverseRegistrar }; +}); + +module.exports = buildRecipe("ENS", (m) => { + const owner = ACCOUNT_0; + + const ens = m.contract("ENSRegistry"); + + const { resolver } = m.useRecipe(setupResolver, { + parameters: { + ENS: ens, + ACCOUNT: owner, + }, + }); + + const { reverseRegistrar } = m.useRecipe(setupReverseRegistrar, { + parameters: { + ENS: ens, + RESOLVER: resolver, + ACCOUNT: owner, + }, + }); + + return { ens, resolver, reverseRegistrar }; +}); diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js new file mode 100644 index 0000000000..bde2388286 --- /dev/null +++ b/examples/ens/ignition/test-registrar.js @@ -0,0 +1,32 @@ +const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); +const namehash = require("eth-ens-namehash"); + +const setupENSRegistry = require("./ENS"); + +const labelhash = (label) => + hre.ethers.utils.keccak256(hre.ethers.utils.toUtf8Bytes(label)); + +const ZERO_HASH = + "0x0000000000000000000000000000000000000000000000000000000000000000"; + +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + +module.exports = buildRecipe("`TEST` registrar", (m) => { + const tld = "test"; + const tldHash = namehash.hash(tld); + const tldLabel = labelhash(tld); + + const { ens, resolver, reverseRegistrar } = m.useRecipe(setupENSRegistry); + + // Setup registrar + const registrar = m.contract("FIFSRegistrar", { + args: [ens, tldHash], + }); + + m.call(ens, "setSubnodeOwner", { + id: "set sub-node owner for registrar", + args: [ZERO_HASH, tldLabel, ACCOUNT_0], + }); + + return { ens, resolver, registrar, reverseRegistrar }; +}); diff --git a/examples/ens/package.json b/examples/ens/package.json new file mode 100644 index 0000000000..332b6058fd --- /dev/null +++ b/examples/ens/package.json @@ -0,0 +1,15 @@ +{ + "name": "@nomicfoundation/ignition-ens-example", + "private": "true", + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test" + }, + "devDependencies": { + "hardhat": "^2.10.0", + "@nomicfoundation/hardhat-ignition": "^0.0.2" + }, + "dependencies": { + "@ensdomains/ens-contracts": "0.0.11" + } +} diff --git a/examples/ens/scripts/deploy-ens.js b/examples/ens/scripts/deploy-ens.js new file mode 100644 index 0000000000..a6af911a45 --- /dev/null +++ b/examples/ens/scripts/deploy-ens.js @@ -0,0 +1,67 @@ +const hre = require("hardhat"); +const namehash = require("eth-ens-namehash"); +const tld = "test"; +const ethers = hre.ethers; +const utils = ethers.utils; +const labelhash = (label) => utils.keccak256(utils.toUtf8Bytes(label)); +const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; +const ZERO_HASH = + "0x0000000000000000000000000000000000000000000000000000000000000000"; +async function main() { + const ENSRegistry = await ethers.getContractFactory("ENSRegistry"); + const FIFSRegistrar = await ethers.getContractFactory("FIFSRegistrar"); + const ReverseRegistrar = await ethers.getContractFactory("ReverseRegistrar"); + const PublicResolver = await ethers.getContractFactory("PublicResolver"); + const signers = await ethers.getSigners(); + const accounts = signers.map((s) => s.address); + + const ens = await ENSRegistry.deploy(); + await ens.deployed(); + const resolver = await PublicResolver.deploy(ens.address, ZERO_ADDRESS); + await resolver.deployed(); + await setupResolver(ens, resolver, accounts); + const registrar = await FIFSRegistrar.deploy(ens.address, namehash.hash(tld)); + await registrar.deployed(); + await setupRegistrar(ens, registrar); + const reverseRegistrar = await ReverseRegistrar.deploy( + ens.address, + resolver.address + ); + await reverseRegistrar.deployed(); + await setupReverseRegistrar(ens, registrar, reverseRegistrar, accounts); +} + +async function setupResolver(ens, resolver, accounts) { + const resolverNode = namehash.hash("resolver"); + const resolverLabel = labelhash("resolver"); + await ens.setSubnodeOwner(ZERO_HASH, resolverLabel, accounts[0]); + await ens.setResolver(resolverNode, resolver.address); + await resolver["setAddr(bytes32,address)"](resolverNode, resolver.address); +} + +async function setupRegistrar(ens, registrar) { + await ens.setSubnodeOwner(ZERO_HASH, labelhash(tld), registrar.address); +} + +async function setupReverseRegistrar( + ens, + registrar, + reverseRegistrar, + accounts +) { + await ens.setSubnodeOwner(ZERO_HASH, labelhash("reverse"), accounts[0]); + await ens.setSubnodeOwner( + namehash.hash("reverse"), + labelhash("addr"), + reverseRegistrar.address + ); +} + +// We recommend this pattern to be able to use async/await everywhere +// and properly handle errors. +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/examples/ens/test/sample-test.js b/examples/ens/test/sample-test.js new file mode 100644 index 0000000000..251fc318b6 --- /dev/null +++ b/examples/ens/test/sample-test.js @@ -0,0 +1,32 @@ +const { expect } = require("chai"); +const ENSModule = require("../ignition/test-registrar"); +const namehash = require("eth-ens-namehash"); +const labelhash = (label) => + hre.ethers.utils.keccak256(hre.ethers.utils.toUtf8Bytes(label)); + +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; +const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; + +describe("ENS", function () { + it("should be able to create new subrecords", async function () { + // Arrange + const { ens, resolver } = await ignition.deploy(ENSModule); + + await ens.setSubnodeOwner( + namehash.hash("test"), + labelhash("alice"), + ACCOUNT_0 + ); + + // Act + await resolver["setAddr(bytes32,address)"]( + namehash.hash("alice.test"), + ACCOUNT_1 + ); + + // Assert + const after = await resolver["addr(bytes32)"](namehash.hash("alice.test")); + + expect(after).to.equal(ACCOUNT_1); + }); +}); diff --git a/yarn.lock b/yarn.lock index 00a439b93e..2e6c2a1284 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,177 +17,190 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== +"@babel/code-frame@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" + integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: - "@babel/highlight" "^7.16.7" + "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.17.10": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.5.tgz#acac0c839e317038c73137fbb6ef71a1d6238471" - integrity sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg== +"@babel/compat-data@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" + integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== "@babel/core@^7.7.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.5.tgz#c597fa680e58d571c28dda9827669c78cdd7f000" - integrity sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ== + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" + integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== dependencies: "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-compilation-targets" "^7.18.2" - "@babel/helper-module-transforms" "^7.18.0" - "@babel/helpers" "^7.18.2" - "@babel/parser" "^7.18.5" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.5" - "@babel/types" "^7.18.4" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-compilation-targets" "^7.19.3" + "@babel/helper-module-transforms" "^7.19.0" + "@babel/helpers" "^7.19.0" + "@babel/parser" "^7.19.3" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.3" + "@babel/types" "^7.19.3" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.2.tgz#33873d6f89b21efe2da63fe554460f3df1c5880d" - integrity sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw== +"@babel/generator@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" + integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== dependencies: - "@babel/types" "^7.18.2" - "@jridgewell/gen-mapping" "^0.3.0" + "@babel/types" "^7.19.3" + "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz#67a85a10cbd5fc7f1457fec2e7f45441dc6c754b" - integrity sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ== +"@babel/helper-compilation-targets@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" + integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== dependencies: - "@babel/compat-data" "^7.17.10" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.20.2" + "@babel/compat-data" "^7.19.3" + "@babel/helper-validator-option" "^7.18.6" + browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-environment-visitor@^7.16.7", "@babel/helper-environment-visitor@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz#8a6d2dedb53f6bf248e31b4baf38739ee4a637bd" - integrity sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ== - -"@babel/helper-function-name@^7.17.9": - version "7.17.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" - integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/types" "^7.17.0" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.18.0": - version "7.18.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz#baf05dec7a5875fb9235bd34ca18bad4e21221cd" - integrity sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.17.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.0" - "@babel/types" "^7.18.0" - -"@babel/helper-simple-access@^7.17.7": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz#4dc473c2169ac3a1c9f4a51cfcd091d1c36fcff9" - integrity sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ== - dependencies: - "@babel/types" "^7.18.2" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.18.2": - version "7.18.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.2.tgz#970d74f0deadc3f5a938bfa250738eb4ac889384" - integrity sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.18.2" - "@babel/types" "^7.18.2" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7": - version "7.17.12" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.17.12.tgz#257de56ee5afbd20451ac0a75686b6b404257351" - integrity sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" +"@babel/helper-environment-visitor@^7.18.9": + version "7.18.9" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" + integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== + dependencies: + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" + +"@babel/helper-hoist-variables@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" + integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-imports@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" + integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-module-transforms@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" + integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== + dependencies: + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-validator-identifier" "^7.18.6" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/helper-simple-access@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" + integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-split-export-declaration@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" + integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== + dependencies: + "@babel/types" "^7.18.6" + +"@babel/helper-string-parser@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" + integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== + +"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== + +"@babel/helper-validator-option@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" + integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== + +"@babel/helpers@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" + integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== + dependencies: + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.19.0" + "@babel/types" "^7.19.0" + +"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" + integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== + dependencies: + "@babel/helper-validator-identifier" "^7.18.6" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.16.7", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== - -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/traverse@^7.18.0", "@babel/traverse@^7.18.2", "@babel/traverse@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.5.tgz#94a8195ad9642801837988ab77f36e992d9a20cd" - integrity sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.18.2" - "@babel/helper-environment-visitor" "^7.18.2" - "@babel/helper-function-name" "^7.17.9" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.18.5" - "@babel/types" "^7.18.4" +"@babel/parser@^7.18.10", "@babel/parser@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" + integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== + +"@babel/runtime@^7.4.4": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" + integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + dependencies: + regenerator-runtime "^0.13.4" + +"@babel/template@^7.18.10": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" + integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/parser" "^7.18.10" + "@babel/types" "^7.18.10" + +"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" + integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.19.3" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.19.3" + "@babel/types" "^7.19.3" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.16.7", "@babel/types@^7.17.0", "@babel/types@^7.18.0", "@babel/types@^7.18.2", "@babel/types@^7.18.4": - version "7.18.4" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.4.tgz#27eae9b9fd18e9dccc3f9d6ad051336f307be354" - integrity sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw== +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3": + version "7.19.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" + integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" + "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@braintree/sanitize-url@^6.0.0": @@ -202,15 +215,82 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@esbuild/android-arm@0.15.9": - version "0.15.9" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.9.tgz#7e1221604ab88ed5021ead74fa8cca4405e1e431" - integrity sha512-VZPy/ETF3fBG5PiinIkA0W/tlsvlEgJccyN2DzWZEl0DlVKRbu91PvY2D6Lxgluj4w9QtYHjOWjAT44C+oQ+EQ== +"@ensdomains/address-encoder@^0.1.7": + version "0.1.9" + resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" + integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== + dependencies: + bech32 "^1.1.3" + blakejs "^1.1.0" + bn.js "^4.11.8" + bs58 "^4.0.1" + crypto-addr-codec "^0.1.7" + nano-base32 "^1.0.1" + ripemd160 "^2.0.2" + +"@ensdomains/buffer@^0.0.13": + version "0.0.13" + resolved "https://registry.yarnpkg.com/@ensdomains/buffer/-/buffer-0.0.13.tgz#b9f60defb78fc5f2bee30faca17e63dfbef19253" + integrity sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ== + dependencies: + "@nomiclabs/hardhat-truffle5" "^2.0.0" + +"@ensdomains/ens-contracts@0.0.11": + version "0.0.11" + resolved "https://registry.yarnpkg.com/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz#a1cd87af8c454b694acba5be1a44c1b20656a9be" + integrity sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg== + dependencies: + "@ensdomains/buffer" "^0.0.13" + "@ensdomains/solsha1" "0.0.3" + "@openzeppelin/contracts" "^4.1.0" + dns-packet "^5.3.0" + +"@ensdomains/ens@0.4.5": + version "0.4.5" + resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" + integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== + dependencies: + bluebird "^3.5.2" + eth-ens-namehash "^2.0.8" + solc "^0.4.20" + testrpc "0.0.1" + web3-utils "^1.0.0-beta.31" + +"@ensdomains/ensjs@^2.0.1": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" + integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== + dependencies: + "@babel/runtime" "^7.4.4" + "@ensdomains/address-encoder" "^0.1.7" + "@ensdomains/ens" "0.4.5" + "@ensdomains/resolver" "0.2.4" + content-hash "^2.5.2" + eth-ens-namehash "^2.0.8" + ethers "^5.0.13" + js-sha3 "^0.8.0" + +"@ensdomains/resolver@0.2.4": + version "0.2.4" + resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" + integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== + +"@ensdomains/solsha1@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@ensdomains/solsha1/-/solsha1-0.0.3.tgz#fd479da9d40aadb59ff4fb4ec50632e7d2275a83" + integrity sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q== + dependencies: + hash-test-vectors "^1.3.2" + +"@esbuild/android-arm@0.15.10": + version "0.15.10" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.10.tgz#a5f9432eb221afc243c321058ef25fe899886892" + integrity sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg== -"@esbuild/linux-loong64@0.15.9": - version "0.15.9" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.9.tgz#b658a97babf1f40783354af7039b84c3fdfc3fc3" - integrity sha512-O+NfmkfRrb3uSsTa4jE3WApidSe3N5++fyOVGP1SmMZi4A3BZELkhUUvj5hwmMuNdlpzAZ8iAPz2vmcR7DCFQA== +"@esbuild/linux-loong64@0.15.10": + version "0.15.10" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz#78a42897c2cf8db9fd5f1811f7590393b77774c7" + integrity sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -227,31 +307,7 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@ethereumjs/block@^3.5.0", "@ethereumjs/block@^3.6.2", "@ethereumjs/block@^3.6.3": - version "3.6.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/block/-/block-3.6.3.tgz#d96cbd7af38b92ebb3424223dbf773f5ccd27f84" - integrity sha512-CegDeryc2DVKnDkg5COQrE0bJfw/p0v3GBk2W5/Dj5dOVfEmb50Ux0GLnSPypooLnfqjwFaorGuT9FokWB3GRg== - dependencies: - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - ethereumjs-util "^7.1.5" - merkle-patricia-tree "^4.2.4" - -"@ethereumjs/blockchain@^5.5.2", "@ethereumjs/blockchain@^5.5.3": - version "5.5.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/blockchain/-/blockchain-5.5.3.tgz#aa49a6a04789da6b66b5bcbb0d0b98efc369f640" - integrity sha512-bi0wuNJ1gw4ByNCV56H0Z4Q7D+SxUbwyG12Wxzbvqc89PXLRNR20LBcSUZRKpN0+YCPo6m0XZL/JLio3B52LTw== - dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/ethash" "^1.1.0" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - level-mem "^5.0.1" - lru-cache "^5.1.1" - semaphore-async-await "^1.5.1" - -"@ethereumjs/common@^2.6.4", "@ethereumjs/common@^2.6.5": +"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== @@ -259,18 +315,7 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.5" -"@ethereumjs/ethash@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/ethash/-/ethash-1.1.0.tgz#7c5918ffcaa9cb9c1dc7d12f77ef038c11fb83fb" - integrity sha512-/U7UOKW6BzpA+Vt+kISAoeDie1vAvY4Zy2KF5JJb+So7+1yKmJeJEHOGSnQIj330e9Zyl3L5Nae6VZyh2TJnAA== - dependencies: - "@ethereumjs/block" "^3.5.0" - "@types/levelup" "^4.3.0" - buffer-xor "^2.0.1" - ethereumjs-util "^7.1.1" - miller-rabin "^4.0.0" - -"@ethereumjs/tx@^3.5.1", "@ethereumjs/tx@^3.5.2": +"@ethereumjs/tx@^3.3.2": version "3.5.2" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== @@ -278,64 +323,46 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" -"@ethereumjs/vm@^5.9.0": - version "5.9.3" - resolved "https://registry.yarnpkg.com/@ethereumjs/vm/-/vm-5.9.3.tgz#6d69202e4c132a4a1e1628ac246e92062e230823" - integrity sha512-Ha04TeF8goEglr8eL7hkkYyjhzdZS0PsoRURzYlTF6I0VVId5KjKb0N7MrA8GMgheN+UeTncfTgYx52D/WhEmg== - dependencies: - "@ethereumjs/block" "^3.6.3" - "@ethereumjs/blockchain" "^5.5.3" - "@ethereumjs/common" "^2.6.5" - "@ethereumjs/tx" "^3.5.2" - async-eventemitter "^0.2.4" - core-js-pure "^3.0.1" - debug "^4.3.3" - ethereumjs-util "^7.1.5" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - merkle-patricia-tree "^4.2.4" - rustbn.js "~0.2.0" - -"@ethersproject/abi@5.6.4", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.6.4.tgz#f6e01b6ed391a505932698ecc0d9e7a99ee60362" - integrity sha512-TTeZUlCeIHG6527/2goZA6gW5F8Emoc7MrZDC7hhP84aRGvW3TEdTnZR08Ls88YXM1m2SuK42Osw/jSi3uO8gg== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/abstract-provider@5.6.1", "@ethersproject/abstract-provider@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.6.1.tgz#02ddce150785caf0c77fe036a0ebfcee61878c59" - integrity sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" - -"@ethersproject/abstract-signer@5.6.2", "@ethersproject/abstract-signer@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.6.2.tgz#491f07fc2cbd5da258f46ec539664713950b0b33" - integrity sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - -"@ethersproject/address@5.6.1", "@ethersproject/address@^5.6.1": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" + integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" + integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" + integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + +"@ethersproject/address@5.6.1": version "5.6.1" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== @@ -346,296 +373,308 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" -"@ethersproject/base64@5.6.1", "@ethersproject/base64@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.6.1.tgz#2c40d8a0310c9d1606c2c37ae3092634b41d87cb" - integrity sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw== +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" + integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== dependencies: - "@ethersproject/bytes" "^5.6.1" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" -"@ethersproject/basex@5.6.1", "@ethersproject/basex@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.6.1.tgz#badbb2f1d4a6f52ce41c9064f01eab19cc4c5305" - integrity sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA== +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" + integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/properties" "^5.6.0" + "@ethersproject/bytes" "^5.7.0" -"@ethersproject/bignumber@5.6.2", "@ethersproject/bignumber@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.6.2.tgz#72a0717d6163fab44c47bcc82e0c550ac0315d66" - integrity sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw== +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" + integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.6.1", "@ethersproject/bytes@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.6.1.tgz#24f916e411f82a8a60412344bf4a813b917eefe7" - integrity sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g== - dependencies: - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/constants@5.6.1", "@ethersproject/constants@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.6.1.tgz#e2e974cac160dd101cf79fdf879d7d18e8cb1370" - integrity sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg== - dependencies: - "@ethersproject/bignumber" "^5.6.2" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/properties" "^5.7.0" -"@ethersproject/contracts@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.6.2.tgz#20b52e69ebc1b74274ff8e3d4e508de971c287bc" - integrity sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g== +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" + integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== dependencies: - "@ethersproject/abi" "^5.6.3" - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/transactions" "^5.6.2" - -"@ethersproject/hash@5.6.1", "@ethersproject/hash@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.6.1.tgz#224572ea4de257f05b4abf8ae58b03a67e99b0f4" - integrity sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/hdnode@5.6.2", "@ethersproject/hdnode@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.6.2.tgz#26f3c83a3e8f1b7985c15d1db50dc2903418b2d2" - integrity sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + bn.js "^5.2.1" -"@ethersproject/json-wallets@5.6.1", "@ethersproject/json-wallets@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.6.1.tgz#3f06ba555c9c0d7da46756a12ac53483fe18dd91" - integrity sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ== - dependencies: - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/pbkdf2" "^5.6.1" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" + integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== + dependencies: + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" + integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + dependencies: + "@ethersproject/abi" "^5.7.0" + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" + integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" + integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" + integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== + dependencies: + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/pbkdf2" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.6.1", "@ethersproject/keccak256@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.6.1.tgz#b867167c9b50ba1b1a92bccdd4f2d6bd168a91cc" - integrity sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA== +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" + integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== dependencies: - "@ethersproject/bytes" "^5.6.1" + "@ethersproject/bytes" "^5.7.0" js-sha3 "0.8.0" -"@ethersproject/logger@5.6.0", "@ethersproject/logger@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.6.0.tgz#d7db1bfcc22fd2e4ab574cba0bb6ad779a9a3e7a" - integrity sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg== +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" + integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== -"@ethersproject/networks@5.6.4", "@ethersproject/networks@^5.6.3": - version "5.6.4" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.6.4.tgz#51296d8fec59e9627554f5a8a9c7791248c8dc07" - integrity sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ== +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" + integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== dependencies: - "@ethersproject/logger" "^5.6.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/pbkdf2@5.6.1", "@ethersproject/pbkdf2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.6.1.tgz#f462fe320b22c0d6b1d72a9920a3963b09eb82d1" - integrity sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ== +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" + integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" -"@ethersproject/properties@5.6.0", "@ethersproject/properties@^5.6.0": - version "5.6.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.6.0.tgz#38904651713bc6bdd5bdd1b0a4287ecda920fa04" - integrity sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg== +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" + integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== dependencies: - "@ethersproject/logger" "^5.6.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.6.8": - version "5.6.8" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.6.8.tgz#22e6c57be215ba5545d3a46cf759d265bb4e879d" - integrity sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/base64" "^5.6.1" - "@ethersproject/basex" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/networks" "^5.6.3" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/web" "^5.6.1" +"@ethersproject/providers@5.7.1": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" + integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" bech32 "1.1.4" ws "7.4.6" -"@ethersproject/random@5.6.1", "@ethersproject/random@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.6.1.tgz#66915943981bcd3e11bbd43733f5c3ba5a790255" - integrity sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA== +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" + integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/rlp@5.6.1", "@ethersproject/rlp@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.6.1.tgz#df8311e6f9f24dcb03d59a2bac457a28a4fe2bd8" - integrity sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ== +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" + integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" -"@ethersproject/sha2@5.6.1", "@ethersproject/sha2@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.6.1.tgz#211f14d3f5da5301c8972a8827770b6fd3e51656" - integrity sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g== +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" + integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" hash.js "1.1.7" -"@ethersproject/signing-key@5.6.2", "@ethersproject/signing-key@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.6.2.tgz#8a51b111e4d62e5a62aee1da1e088d12de0614a3" - integrity sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ== +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" + integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" bn.js "^5.2.1" elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.6.1.tgz#5845e71182c66d32e6ec5eefd041fca091a473e2" - integrity sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/sha2" "^5.6.1" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/strings@5.6.1", "@ethersproject/strings@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.6.1.tgz#dbc1b7f901db822b5cafd4ebf01ca93c373f8952" - integrity sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/transactions@5.6.2", "@ethersproject/transactions@^5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.6.2.tgz#793a774c01ced9fe7073985bb95a4b4e57a6370b" - integrity sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q== - dependencies: - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - -"@ethersproject/units@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.6.1.tgz#ecc590d16d37c8f9ef4e89e2005bda7ddc6a4e6f" - integrity sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/constants" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - -"@ethersproject/wallet@5.6.2": - version "5.6.2" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.6.2.tgz#cd61429d1e934681e413f4bc847a5f2f87e3a03c" - integrity sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg== - dependencies: - "@ethersproject/abstract-provider" "^5.6.1" - "@ethersproject/abstract-signer" "^5.6.2" - "@ethersproject/address" "^5.6.1" - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/hdnode" "^5.6.2" - "@ethersproject/json-wallets" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/random" "^5.6.1" - "@ethersproject/signing-key" "^5.6.2" - "@ethersproject/transactions" "^5.6.2" - "@ethersproject/wordlists" "^5.6.1" - -"@ethersproject/web@5.6.1", "@ethersproject/web@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.6.1.tgz#6e2bd3ebadd033e6fe57d072db2b69ad2c9bdf5d" - integrity sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA== - dependencies: - "@ethersproject/base64" "^5.6.1" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" - -"@ethersproject/wordlists@5.6.1", "@ethersproject/wordlists@^5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.6.1.tgz#1e78e2740a8a21e9e99947e47979d72e130aeda1" - integrity sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw== - dependencies: - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/hash" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/properties" "^5.6.0" - "@ethersproject/strings" "^5.6.1" +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" + integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" + integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== + dependencies: + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/hdnode" "^5.7.0" + "@ethersproject/json-wallets" "^5.7.0" + "@ethersproject/keccak256" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/signing-key" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/wordlists" "^5.7.0" + +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": + version "5.7.1" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" + integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== + dependencies: + "@ethersproject/base64" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" + integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== + dependencies: + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/strings" "^5.7.0" "@humanwhocodes/config-array@^0.5.0": version "0.5.0" @@ -691,29 +730,29 @@ "@jridgewell/set-array" "^1.0.0" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" - integrity sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg== +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" + integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== dependencies: - "@jridgewell/set-array" "^1.0.0" + "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" "@jridgewell/resolve-uri@^3.0.3": - version "3.0.7" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz#30cd49820a962aff48c8fffc5cd760151fca61fe" - integrity sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== -"@jridgewell/set-array@^1.0.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.1.tgz#36a6acc93987adcf0ba50c66908bd0b70de8afea" - integrity sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ== +"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.13" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz#b6461fb0c2964356c469e115f504c95ad97ab88c" - integrity sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w== + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -724,13 +763,18 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.13" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" - integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== + version "0.3.15" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" + integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== dependencies: "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@metamask/eth-sig-util@^4.0.0": version "4.0.1" resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" @@ -742,20 +786,20 @@ tweetnacl "^1.0.3" tweetnacl-util "^0.15.1" -"@noble/hashes@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.1.tgz#c056d9b7166c1e7387a7453c2aff199bf7d88e5f" - integrity sha512-Lkp9+NijmV7eSVZqiUvt3UCuuHeJpUVmRrvh430gyJjJiuJMqkeHf6/A9lQ/smmbWV/0spDeJscscPzyB4waZg== - -"@noble/hashes@~1.1.1": +"@noble/hashes@1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== -"@noble/secp256k1@1.6.0", "@noble/secp256k1@~1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.0.tgz#602afbbfcfb7e169210469b697365ef740d7e930" - integrity sha512-DWSsg8zMHOYMYBqIQi96BQuthZrp98LCeMNcUOaffCIVYQ5yxDbNikLF+H7jEnmNNmXbtVic46iCuVWzar+MgA== +"@noble/hashes@~1.1.1": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" + integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== + +"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": + version "1.6.3" + resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" + integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" @@ -778,15 +822,240 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@nomicfoundation/ethereumjs-block@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" + integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-blockchain@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" + integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-ethash" "^2.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + level "^8.0.0" + lru-cache "^5.1.1" + memory-level "^1.0.0" + +"@nomicfoundation/ethereumjs-common@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" + integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== + dependencies: + "@nomicfoundation/ethereumjs-util" "^8.0.0" + crc-32 "^1.2.0" + +"@nomicfoundation/ethereumjs-ethash@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" + integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + abstract-level "^1.0.3" + bigint-crypto-utils "^3.0.23" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-evm@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" + integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" + integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== + +"@nomicfoundation/ethereumjs-statemanager@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" + integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + +"@nomicfoundation/ethereumjs-trie@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" + integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + readable-stream "^3.6.0" + +"@nomicfoundation/ethereumjs-tx@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" + integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== + dependencies: + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-util@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" + integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== + dependencies: + "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" + ethereum-cryptography "0.1.3" + +"@nomicfoundation/ethereumjs-vm@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" + integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== + dependencies: + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@types/async-eventemitter" "^0.2.1" + async-eventemitter "^0.2.4" + debug "^4.3.3" + ethereum-cryptography "0.1.3" + functional-red-black-tree "^1.0.1" + mcl-wasm "^0.7.1" + rustbn.js "~0.2.0" + +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz#1d49e4ac028831a3011a9f3dca60bd1963185342" + integrity sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw== + +"@nomicfoundation/solidity-analyzer-darwin-x64@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz#c0fccecc5506ff5466225e41e65691abafef3dbe" + integrity sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw== + +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz#8261d033f7172b347490cd005931ef8168ab4d73" + integrity sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw== + +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz#1ba64b1d76425f8953dedc6367bd7dd46f31dfc5" + integrity sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA== + +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz#8d864c49b55e683f7e3b5cce9d10b628797280ac" + integrity sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ== + +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz#16e769500cf1a8bb42ab9498cee3b93c30f78295" + integrity sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg== + +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz#75f4e1a25526d54c506e4eba63b3d698b6255b8f" + integrity sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA== + +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz#ef6e20cfad5eedfdb145cc34a44501644cd7d015" + integrity sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz#98c4e3af9cee68896220fa7e270aefdf7fc89c7b" + integrity sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz#12da288e7ef17ec14848f19c1e8561fed20d231d" + integrity sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ== + +"@nomicfoundation/solidity-analyzer@^0.0.3": + version "0.0.3" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz#d1029f872e66cb1082503b02cc8b0be12f8dd95e" + integrity sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg== + optionalDependencies: + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.0.3" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.0.3" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.0.3" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.0.3" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.0.3" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.0.3" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.0.3" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.0.3" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.0.3" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.0.3" + "@nomiclabs/hardhat-ethers@^2.0.2": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.6.tgz#1c695263d5b46a375dcda48c248c4fba9dfe2fc2" - integrity sha512-q2Cjp20IB48rEn2NPjR1qxsIQBvFVYW9rFRCFq+bC4RUrn1Ljz3g4wM8uSlgIBZYBi2JMXxmOzFqHraczxq4Ng== + version "2.1.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" + integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== -"@openzeppelin/contracts@^4.3.2": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.6.0.tgz#c91cf64bc27f573836dba4122758b4743418c1b3" - integrity sha512-8vi4d50NNya/bQqCmaVzvHNmwHvS0OBKb7HNtuNwEE3scXWrP31fKQoGxNMT+KbzmrNZzatE3QK5p2gFONI/hg== +"@nomiclabs/hardhat-truffle5@^2.0.0": + version "2.0.7" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz#7519eadd2c6c460c2addc3d4d6efda7a8883361e" + integrity sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig== + dependencies: + "@nomiclabs/truffle-contract" "^4.2.23" + "@types/chai" "^4.2.0" + chai "^4.2.0" + ethereumjs-util "^7.1.4" + fs-extra "^7.0.1" + +"@nomiclabs/truffle-contract@^4.2.23": + version "4.5.10" + resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz#52adcca1068647e1c2b44bf0e6a89fc4ad7f9213" + integrity sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ== + dependencies: + "@ensdomains/ensjs" "^2.0.1" + "@truffle/blockchain-utils" "^0.1.3" + "@truffle/contract-schema" "^3.4.7" + "@truffle/debug-utils" "^6.0.22" + "@truffle/error" "^0.1.0" + "@truffle/interface-adapter" "^0.5.16" + bignumber.js "^7.2.1" + ethereum-ens "^0.8.0" + ethers "^4.0.0-beta.1" + source-map-support "^0.5.19" + +"@openzeppelin/contracts@^4.1.0", "@openzeppelin/contracts@^4.3.2": + version "4.7.3" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" + integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== "@pkgr/utils@^2.3.1": version "2.3.1" @@ -890,6 +1159,16 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": version "1.8.3" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" @@ -921,16 +1200,116 @@ type-detect "^4.0.8" "@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ== + version "0.7.2" + resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" + integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== + +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@szmarczak/http-timer@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" + integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== + dependencies: + defer-to-connect "^2.0.1" + +"@truffle/abi-utils@^0.3.2": + version "0.3.2" + resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.2.tgz#71184255cfa05a5ded3c7b7fb50a3de813446224" + integrity sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA== + dependencies: + change-case "3.0.2" + fast-check "3.1.1" + web3-utils "1.7.4" + +"@truffle/blockchain-utils@^0.1.3": + version "0.1.4" + resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz#1365b88c3d2922a066d947e93748f09b0fac2e93" + integrity sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A== + +"@truffle/codec@^0.14.5": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.5.tgz#5b1574fb55d20a56af3039adaac7cd9dd421b1fe" + integrity sha512-3FCpTJe6o7LGWUfrSdguMpdpH1PTn3u7bIfbj6Cfdzym2OAVSgxTgdlqC1poepbk0xcOVcUW+EsqNwLMqmBiPA== + dependencies: + "@truffle/abi-utils" "^0.3.2" + "@truffle/compile-common" "^0.8.1" + big.js "^6.0.3" + bn.js "^5.1.3" + cbor "^5.2.0" + debug "^4.3.1" + lodash "^4.17.21" + semver "7.3.7" + utf8 "^3.0.0" + web3-utils "1.7.4" + +"@truffle/compile-common@^0.8.1": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.8.1.tgz#a3fe500edb880a3104324c9885bbd27b6ce05c54" + integrity sha512-7mzzG9Cfrn+fDT5Sqi7B6pccvIIV5w/GM8/56YgnjysbDzy5aZ6mv0fe37ZbcznEVQ35NJjBy+lEr/ozOGXwQA== + dependencies: + "@truffle/error" "^0.1.1" + colors "1.4.0" + +"@truffle/contract-schema@^3.4.7": + version "3.4.10" + resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.10.tgz#c11a814c13ad55a5e454fb35ddfa291ae0d24ace" + integrity sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ== + dependencies: + ajv "^6.10.0" + debug "^4.3.1" + +"@truffle/debug-utils@^6.0.22": + version "6.0.35" + resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.35.tgz#c9e93d9968857bae14789737f986b8d601a03eb2" + integrity sha512-GuLsc+GFEYiUM683GWh4/ol3jkBts5a601detVWu1Xo5/bSL5gxooOjgOTovjA8dimCjkyi/DnK2yHHC+q+g0g== + dependencies: + "@truffle/codec" "^0.14.5" + "@trufflesuite/chromafi" "^3.0.0" + bn.js "^5.1.3" + chalk "^2.4.2" + debug "^4.3.1" + highlightjs-solidity "^2.0.5" + +"@truffle/error@^0.1.0", "@truffle/error@^0.1.1": + version "0.1.1" + resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" + integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== -"@solidity-parser/parser@^0.14.2": - version "0.14.3" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.3.tgz#0d627427b35a40d8521aaa933cc3df7d07bfa36f" - integrity sha512-29g2SZ29HtsqA58pLCtopI1P/cPy5/UAzlcAXO6T/CNJimG6yA8kx4NaseMyJULiC+TEs02Y9/yeHzClqoA0hw== +"@truffle/interface-adapter@^0.5.16": + version "0.5.22" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.22.tgz#a25677cce02e3ce192d8d88fbbb11c116cc05334" + integrity sha512-Bgl5Afb1mPVNedI8CJzZQzVIdrZWSXISTBrXPZmppD4Q+6V1RUzlLxiaGGB4gYHOA+U0pBzD8MCcSycPAD9RsA== dependencies: - antlr4ts "^0.5.0-alpha.4" + bn.js "^5.1.3" + ethers "^4.0.32" + web3 "1.7.4" + +"@trufflesuite/chromafi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" + integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== + dependencies: + camelcase "^4.1.0" + chalk "^2.3.2" + cheerio "^1.0.0-rc.2" + detect-indent "^5.0.0" + highlight.js "^10.4.1" + lodash.merge "^4.6.2" + strip-ansi "^4.0.0" + strip-indent "^2.0.0" "@tsconfig/node10@^1.0.7": version "1.0.9" @@ -952,10 +1331,10 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== -"@types/abstract-leveldown@*": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/abstract-leveldown/-/abstract-leveldown-7.2.0.tgz#f055979a99f7654e84d6b8e6267419e9c4cfff87" - integrity sha512-q5veSX6zjUy/DlDhR4Y4cU0k2Ar+DT2LUraP00T19WLmTO6Se1djepCCaqU6nQrwcJ5Hyo/CWqxTzrrFg8eqbQ== +"@types/async-eventemitter@^0.2.1": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" + integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== "@types/bn.js@^4.11.3": version "4.11.6" @@ -965,12 +1344,22 @@ "@types/node" "*" "@types/bn.js@^5.1.0": - version "5.1.0" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.0.tgz#32c5d271503a12653c62cf4d2b45e6eab8cebc68" - integrity sha512-QSSVYj7pYFN49kW77o2s9xTCwZ8F2xLbjLLSEVh8D2F4JUhZtPAGOFLTD+ffqksBx/u4cE/KImFjyhqCjn/LIA== + version "5.1.1" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" + integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== dependencies: "@types/node" "*" +"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" + integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "*" + "@types/node" "*" + "@types/responselike" "*" + "@types/chai-as-promised@^7.1.4": version "7.1.5" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" @@ -978,10 +1367,10 @@ dependencies: "@types/chai" "*" -"@types/chai@*", "@types/chai@^4.2.22": - version "4.3.1" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.1.tgz#e2c6e73e0bdeb2521d00756d099218e9f5d90a04" - integrity sha512-/zPMqDkzSZ8t3VtxOa4KPq7uzzW978M9Tvh+j7GHKuo6k6GTLxPJ4J5gE5cjfJ26pnXst0N5Hax8Sr0T2Mi9zQ== +"@types/chai@*", "@types/chai@^4.2.0", "@types/chai@^4.2.22": + version "4.3.3" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" + integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== "@types/debug@^4.1.7": version "4.1.7" @@ -997,6 +1386,11 @@ dependencies: "@types/node" "*" +"@types/http-cache-semantics@*": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" + integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" @@ -1027,18 +1421,11 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/level-errors@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/level-errors/-/level-errors-3.0.0.tgz#15c1f4915a5ef763b51651b15e90f6dc081b96a8" - integrity sha512-/lMtoq/Cf/2DVOm6zE6ORyOM+3ZVm/BvzEZVxUhf6bgh8ZHglXlBqxbxSlJeVp8FCbD3IVvk/VbsaNmDjrQvqQ== - -"@types/levelup@^4.3.0": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/levelup/-/levelup-4.3.3.tgz#4dc2b77db079b1cf855562ad52321aa4241b8ef4" - integrity sha512-K+OTIjJcZHVlZQN1HmU64VtrC0jC3dXWQozuEIR9zVvltIk90zaGPM2AgT+fIkChpzHhFE3YnvFLCbLtzAmexA== +"@types/keyv@*": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: - "@types/abstract-leveldown" "*" - "@types/level-errors" "*" "@types/node" "*" "@types/lru-cache@^5.1.0": @@ -1062,19 +1449,24 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "18.0.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.0.tgz#67c7b724e1bcdd7a8821ce0d5ee184d3b4dd525a" - integrity sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA== + version "18.8.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.0.tgz#b8ee8d83a99470c0661bd899417fcd77060682fe" + integrity sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA== "@types/node@12.20.25": version "12.20.25" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== +"@types/node@^12.12.6": + version "12.20.55" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" + integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== + "@types/node@^16.11.1": - version "16.11.41" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.41.tgz#88eb485b1bfdb4c224d878b7832239536aa2f813" - integrity sha512-mqoYK2TnVjdkGk8qXAVGc/x9nSaTpSrFaGFm43BUH3IdoBV0nta6hYaGmdOvIMlbHJbUEVen3gvwpwovAZKNdQ== + version "16.11.63" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.63.tgz#af57f6d2c3fb17a571230d527003dd734a9109b2" + integrity sha512-3OxnrEQLBz8EIIaHpg3CibmTAEGkDBcHY4fL5cnBwg2vd2yvHrUDGWxK+MlYPeXWWIoJJW79dGtU+oeBr6166Q== "@types/pbkdf2@^3.0.0": version "3.1.0" @@ -1089,14 +1481,21 @@ integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== "@types/react@^17.0.35": - version "17.0.47" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.47.tgz#4ee71aaf4c5a9e290e03aa4d0d313c5d666b3b78" - integrity sha512-mk0BL8zBinf2ozNr3qPnlu1oyVTYq+4V7WA76RgxUAtf0Em/Wbid38KN6n4abEkvO4xMTBWmnP1FtQzgkEiJoA== + version "17.0.50" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.50.tgz#39abb4f7098f546cfcd6b51207c90c4295ee81fc" + integrity sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" +"@types/responselike@*", "@types/responselike@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" + integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== + dependencies: + "@types/node" "*" + "@types/scheduler@*": version "0.16.2" resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" @@ -1109,20 +1508,13 @@ dependencies: "@types/node" "*" -"@types/sinon@^10.0.13": +"@types/sinon@^10.0.13", "@types/sinon@^10.0.6": version "10.0.13" resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== dependencies: "@types/sinonjs__fake-timers" "*" -"@types/sinon@^10.0.6": - version "10.0.11" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.11.tgz#8245827b05d3fc57a6601bd35aee1f7ad330fc42" - integrity sha512-dmZsHlBsKUtBpHriNjlK0ndlvEh8dcb9uV9Afsbt89QIyydpC7NcR+nWlAhASfy3GHnxTl4FX/aKE7XZUt/B4g== - dependencies: - "@types/sinonjs__fake-timers" "*" - "@types/sinonjs__fake-timers@*": version "8.1.2" resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" @@ -1231,27 +1623,31 @@ abort-controller@^3.0.0: dependencies: event-target-shim "^5.0.0" -abstract-leveldown@^6.2.1: - version "6.3.0" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a" - integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ== +abortcontroller-polyfill@^1.7.3: + version "1.7.3" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" + integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + +abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" + integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + buffer "^6.0.3" + catering "^2.1.0" + is-buffer "^2.0.5" + level-supports "^4.0.0" + level-transcoder "^1.0.1" + module-error "^1.0.1" + queue-microtask "^1.2.3" -abstract-leveldown@~6.2.1: - version "6.2.3" - resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb" - integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ== +accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - buffer "^5.5.0" - immediate "^3.2.3" - level-concat-iterator "~2.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + mime-types "~2.1.34" + negotiator "0.6.3" acorn-jsx@^5.3.1: version "5.3.2" @@ -1269,9 +1665,9 @@ acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1: - version "8.7.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" - integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== + version "8.8.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" + integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== adm-zip@^0.4.16: version "0.4.16" @@ -1298,7 +1694,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -1335,6 +1731,16 @@ ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: dependencies: type-fest "^0.21.3" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + ansi-regex@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" @@ -1359,11 +1765,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" @@ -1401,6 +1802,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + array-includes@^3.1.3: version "3.1.5" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" @@ -1427,6 +1833,28 @@ array.prototype.flat@^1.2.4: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +asn1.js@^5.2.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" + integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== + dependencies: + bn.js "^4.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + safer-buffer "^2.1.0" + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + assertion-error@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" @@ -1444,6 +1872,11 @@ async-eventemitter@^0.2.4: dependencies: async "^2.4.0" +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + async@^2.4.0: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -1451,17 +1884,37 @@ async@^2.4.0: dependencies: lodash "^4.17.14" +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + auto-bind@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4@^1.8.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== + balanced-match@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -base-x@^3.0.2: +base-x@^3.0.2, base-x@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== @@ -1473,11 +1926,50 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== -bech32@1.1.4: +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bech32@1.1.4, bech32@^1.1.3: version "1.1.4" resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== +big-integer@1.6.36: + version "1.6.36" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" + integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== + +big.js@^6.0.3: + version "6.2.1" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" + integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== + +bigint-crypto-utils@^3.0.23: + version "3.1.6" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz#3a52a660423416856342d0d9981935fa9856f177" + integrity sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg== + dependencies: + bigint-mod-arith "^3.1.0" + +bigint-mod-arith@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz#127c504faf30d27ba010ac7b7d58708a68e3c20b" + integrity sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ== + +bignumber.js@^7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" + integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== + +bignumber.js@^9.0.0, bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1488,21 +1980,49 @@ blakejs@^1.1.0: resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== -bluebird@^3.5.1: +bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.11.0, bn.js@^4.11.8, bn.js@^4.11.9: +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: version "4.12.0" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== -bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: +bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== +body-parser@1.20.0, body-parser@^1.16.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" + integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.10.3" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -1530,12 +2050,22 @@ brorand@^1.0.1, brorand@^1.1.0: resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== +browser-level@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" + integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.1" + module-error "^1.0.2" + run-parallel-limit "^1.1.0" + browser-stdout@1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserify-aes@^1.2.0: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -1547,17 +2077,59 @@ browserify-aes@^1.2.0: inherits "^2.0.1" safe-buffer "^5.0.1" -browserslist@^4.20.2: - version "4.21.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.0.tgz#7ab19572361a140ecd1e023e2c1ed95edda0cefe" - integrity sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA== +browserify-cipher@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" + integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== dependencies: - caniuse-lite "^1.0.30001358" - electron-to-chromium "^1.4.164" - node-releases "^2.0.5" - update-browserslist-db "^1.0.0" + browserify-aes "^1.0.4" + browserify-des "^1.0.0" + evp_bytestokey "^1.0.0" -bs58@^4.0.0: +browserify-des@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" + integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== + dependencies: + cipher-base "^1.0.1" + des.js "^1.0.0" + inherits "^2.0.1" + safe-buffer "^5.1.2" + +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" + integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== + dependencies: + bn.js "^5.0.0" + randombytes "^2.0.1" + +browserify-sign@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" + integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== + dependencies: + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.3" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" + +browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== + dependencies: + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" + node-releases "^2.0.6" + update-browserslist-db "^1.0.9" + +bs58@^4.0.0, bs58@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== @@ -1578,19 +2150,25 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== -buffer-xor@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-2.0.2.tgz#34f7c64f04c777a1f8aac5e661273bb9dd320289" - integrity sha512-eHslX0bin3GB+Lx2p7lEYRShRewuNZL3fUl4qlVJGGiwoPGftmt8JQgk2Y9Ji5/01TnVDo33E5b5O3vUB1HdqQ== +buffer@6.0.3, buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: - safe-buffer "^5.1.1" + base64-js "^1.3.1" + ieee754 "^1.2.1" -buffer@^5.5.0, buffer@^5.6.0: +buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -1598,11 +2176,54 @@ buffer@^5.5.0, buffer@^5.6.0: base64-js "^1.3.1" ieee754 "^1.1.13" +bufferutil@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" + integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + dependencies: + node-gyp-build "^4.3.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-lookup@^6.0.4: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" + integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" + integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + caching-transform@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" @@ -1626,6 +2247,24 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" + integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.1" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -1636,10 +2275,28 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001358: - version "1.0.30001359" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz#a1c1cbe1c2da9e689638813618b4219acbd4925e" - integrity sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw== +caniuse-lite@^1.0.30001400: + version "1.0.30001414" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz#5f1715e506e71860b4b07c50060ea6462217611e" + integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +catering@^2.1.0, catering@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" + integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== + +cbor@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" + integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== + dependencies: + bignumber.js "^9.0.1" + nofilter "^1.0.4" chai-as-promised@7.1.1: version "7.1.1" @@ -1648,7 +2305,7 @@ chai-as-promised@7.1.1: dependencies: check-error "^1.0.2" -chai@^4.3.4: +chai@^4.2.0, chai@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== @@ -1661,7 +2318,7 @@ chai@^4.3.4: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.2: +chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1678,11 +2335,60 @@ chalk@^4.0.0, chalk@^4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" + integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== + dependencies: + camel-case "^3.0.0" + constant-case "^2.0.0" + dot-case "^2.1.0" + header-case "^1.0.0" + is-lower-case "^1.1.0" + is-upper-case "^1.1.0" + lower-case "^1.1.1" + lower-case-first "^1.0.0" + no-case "^2.3.2" + param-case "^2.1.0" + pascal-case "^2.0.0" + path-case "^2.1.0" + sentence-case "^2.1.0" + snake-case "^2.1.0" + swap-case "^1.1.0" + title-case "^2.1.0" + upper-case "^1.1.1" + upper-case-first "^1.1.0" + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.2: + version "1.0.0-rc.12" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" + integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.0.1" + htmlparser2 "^8.0.1" + parse5 "^7.0.0" + parse5-htmlparser2-tree-adapter "^7.0.0" + chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -1698,11 +2404,27 @@ chokidar@3.5.3, chokidar@^3.4.0: optionalDependencies: fsevents "~2.3.2" +chownr@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== +cids@^0.7.1: + version "0.7.5" + resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" + integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== + dependencies: + buffer "^5.5.0" + class-is "^1.1.0" + multibase "~0.6.0" + multicodec "^1.0.0" + multihashes "~0.4.15" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1711,6 +2433,22 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-is@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" + integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== + +classic-level@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" + integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== + dependencies: + abstract-level "^1.0.2" + catering "^2.1.0" + module-error "^1.0.1" + napi-macros "~2.0.0" + node-gyp-build "^4.3.0" + clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" @@ -1729,9 +2467,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.3.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== + version "2.7.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" + integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== cli-truncate@^2.1.0: version "2.1.0" @@ -1741,6 +2479,15 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -1768,6 +2515,13 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + code-excerpt@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" @@ -1775,6 +2529,11 @@ code-excerpt@^3.0.0: dependencies: convert-to-spaces "^1.0.1" +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -1799,6 +2558,18 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + +combined-stream@^1.0.6, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + command-exists@^1.2.8: version "1.2.9" resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" @@ -1829,6 +2600,35 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +constant-case@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" + integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== + dependencies: + snake-case "^2.1.0" + upper-case "^1.1.1" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-hash@^2.5.2: + version "2.5.2" + resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" + integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== + dependencies: + cids "^0.7.1" + multicodec "^0.5.5" + multihashes "^0.4.15" + +content-type@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + convert-source-map@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" @@ -1841,21 +2641,52 @@ convert-to-spaces@^1.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookie@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== -core-js-pure@^3.0.1: - version "3.23.2" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.23.2.tgz#efe5e486469c5ed2d088d76e973eb12e74a930e7" - integrity sha512-t6u7H4Ff/yZNk+zqTr74UjCcZ3k8ApBryeLLV4rYQd9aF3gqmjjGjjR44ENfeBMH8VVvSynIjAJ0mUuFhzQtrA== +cookiejar@^2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" + integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +cors@^2.8.1: + version "2.8.5" + resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" crc-32@^1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== +create-ecdh@^4.0.0: + version "4.0.4" + resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" + integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== + dependencies: + bn.js "^4.1.0" + elliptic "^6.5.3" + create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -1867,7 +2698,7 @@ create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.4, create-hmac@^1.1.7: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -1884,6 +2715,13 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +cross-fetch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -1904,10 +2742,56 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypto-addr-codec@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" + integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== + dependencies: + base-x "^3.0.8" + big-integer "1.6.36" + blakejs "^1.1.0" + bs58 "^4.0.1" + ripemd160-min "0.0.6" + safe-buffer "^5.2.0" + sha3 "^2.1.1" + +crypto-browserify@3.12.0: + version "3.12.0" + resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" + integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== + dependencies: + browserify-cipher "^1.0.0" + browserify-sign "^4.0.0" + create-ecdh "^4.0.0" + create-hash "^1.1.0" + create-hmac "^1.1.0" + diffie-hellman "^5.0.0" + inherits "^2.0.1" + pbkdf2 "^3.0.3" + public-encrypt "^4.0.0" + randombytes "^2.0.0" + randomfill "^1.0.3" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + csstype@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" - integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" + integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: version "1.2.4" @@ -2401,6 +3285,14 @@ d3@^7.0.0: d3-transition "3" d3-zoom "3" +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dagre-d3@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" @@ -2419,6 +3311,20 @@ dagre@^0.8.5: graphlib "^2.1.8" lodash "^4.17.15" +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +debug@2.6.9, debug@^2.2.0, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -2433,13 +3339,6 @@ debug@4.3.3: dependencies: ms "2.1.2" -debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" @@ -2447,7 +3346,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize@^1.2.0: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -2457,6 +3356,25 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== + +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" @@ -2476,13 +3394,15 @@ default-require-extensions@^3.0.0: dependencies: strip-bom "^4.0.0" -deferred-leveldown@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058" - integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw== - dependencies: - abstract-leveldown "~6.2.1" - inherits "^2.0.3" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== define-lazy-prop@^2.0.0: version "2.0.0" @@ -2504,10 +3424,33 @@ delaunator@5: dependencies: robust-predicates "^3.0.0" -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +des.js@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" + integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== + dependencies: + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-indent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== diff@5.0.0: version "5.0.0" @@ -2524,6 +3467,15 @@ diff@^5.0.0: resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== +diffie-hellman@^5.0.0: + version "5.0.3" + resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" + integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== + dependencies: + bn.js "^4.1.0" + miller-rabin "^4.0.0" + randombytes "^2.0.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -2531,6 +3483,13 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dns-packet@^5.3.0: + version "5.4.0" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" + integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" @@ -2545,17 +3504,77 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + dompurify@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.0.tgz#c9c88390f024c2823332615c9e20a453cf3825dd" integrity sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA== -electron-to-chromium@^1.4.164: - version "1.4.169" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.169.tgz#d4b8cf9816566c7e9518128f1a97f39de9c7af9d" - integrity sha512-Yb7UFva1sLlAaRyCkgoFF3qWvwZacFDtsGKi44rZsk8vnhL0DMhsUdhI4Dz9CCJQfftncDMGSI3AYiDtg8mD/w== +domutils@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" + integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.1" + +dot-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" + integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== + dependencies: + no-case "^2.2.0" + +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.251: + version "1.4.270" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz#2c6ea409b45cdb5c3e0cb2c08cf6c0ba7e0f2c26" + integrity sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg== -elliptic@6.5.4, elliptic@^6.5.2, elliptic@^6.5.4: +elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== @@ -2578,15 +3597,10 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -encoding-down@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b" - integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw== - dependencies: - abstract-leveldown "^6.2.1" - inherits "^2.0.3" - level-codec "^9.0.0" - level-errors "^2.0.0" +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== end-of-stream@^1.1.0: version "1.4.4" @@ -2610,50 +3624,49 @@ enquirer@^2.3.0, enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" +entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" + integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== + env-paths@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== -errno@~0.1.1: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - -error-ex@^1.3.1: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: - version "1.20.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" - integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: + version "1.20.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" + integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" function.prototype.name "^1.1.5" - get-intrinsic "^1.1.1" + get-intrinsic "^1.1.3" get-symbol-description "^1.0.0" has "^1.0.3" has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.4" + is-callable "^1.2.6" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" is-weakref "^1.0.2" - object-inspect "^1.12.0" + object-inspect "^1.12.2" object-keys "^1.1.1" - object.assign "^4.1.2" + object.assign "^4.1.4" regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" string.prototype.trimend "^1.0.5" string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" @@ -2674,144 +3687,180 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.62" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" + integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== + dependencies: + es6-iterator "^2.0.3" + es6-symbol "^3.1.3" + next-tick "^1.1.0" + es6-error@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -esbuild-android-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.9.tgz#4a7eb320ca8d3a305f14792061fd9614ccebb7c0" - integrity sha512-HQCX7FJn9T4kxZQkhPjNZC7tBWZqJvhlLHPU2SFzrQB/7nDXjmTIFpFTjt7Bd1uFpeXmuwf5h5fZm+x/hLnhbw== - -esbuild-android-arm64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.9.tgz#c948e5686df20857ad361ec67e070d40d7cab985" - integrity sha512-E6zbLfqbFVCNEKircSHnPiSTsm3fCRxeIMPfrkS33tFjIAoXtwegQfVZqMGR0FlsvVxp2NEDOUz+WW48COCjSg== - -esbuild-darwin-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.9.tgz#25f564fa4b39c1cec84dc46bce5634fdbce1d5e4" - integrity sha512-gI7dClcDN/HHVacZhTmGjl0/TWZcGuKJ0I7/xDGJwRQQn7aafZGtvagOFNmuOq+OBFPhlPv1T6JElOXb0unkSQ== - -esbuild-darwin-arm64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.9.tgz#60faea3ed95d15239536aa88d06bb82b29278a86" - integrity sha512-VZIMlcRN29yg/sv7DsDwN+OeufCcoTNaTl3Vnav7dL/nvsApD7uvhVRbgyMzv0zU/PP0xRhhIpTyc7lxEzHGSw== - -esbuild-freebsd-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.9.tgz#0339ef1c90a919175e7816788224517896657a0e" - integrity sha512-uM4z5bTvuAXqPxrI204txhlsPIolQPWRMLenvGuCPZTnnGlCMF2QLs0Plcm26gcskhxewYo9LkkmYSS5Czrb5A== - -esbuild-freebsd-arm64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.9.tgz#32abfc0be3ae3dd38e5a86a9beadbbcf592f1b57" - integrity sha512-HHDjT3O5gWzicGdgJ5yokZVN9K9KG05SnERwl9nBYZaCjcCgj/sX8Ps1jvoFSfNCO04JSsHSOWo4qvxFuj8FoA== - -esbuild-linux-32@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.9.tgz#93581348a4da7ed2b29bc5539f2605ad7fcee77b" - integrity sha512-AQIdE8FugGt1DkcekKi5ycI46QZpGJ/wqcMr7w6YUmOmp2ohQ8eO4sKUsOxNOvYL7hGEVwkndSyszR6HpVHLFg== - -esbuild-linux-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.9.tgz#0d171e7946c95d0d3ed4826026af2c5632d7dcc4" - integrity sha512-4RXjae7g6Qs7StZyiYyXTZXBlfODhb1aBVAjd+ANuPmMhWthQilWo7rFHwJwL7DQu1Fjej2sODAVwLbcIVsAYQ== - -esbuild-linux-arm64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.9.tgz#9838795a3720cbe736d3bc20621bd366eac22f24" - integrity sha512-a+bTtxJmYmk9d+s2W4/R1SYKDDAldOKmWjWP0BnrWtDbvUBNOm++du0ysPju4mZVoEFgS1yLNW+VXnG/4FNwdQ== - -esbuild-linux-arm@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.9.tgz#dce96cd817bc7376f6af3967649c4ab1f2f79506" - integrity sha512-3Zf2GVGUOI7XwChH3qrnTOSqfV1V4CAc/7zLVm4lO6JT6wbJrTgEYCCiNSzziSju+J9Jhf9YGWk/26quWPC6yQ== - -esbuild-linux-mips64le@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.9.tgz#0335a0739e61aa97cb9b4a018e3facfcca9cdcfd" - integrity sha512-Zn9HSylDp89y+TRREMDoGrc3Z4Hs5u56ozZLQCiZAUx2+HdbbXbWdjmw3FdTJ/i7t5Cew6/Q+6kfO3KCcFGlyw== - -esbuild-linux-ppc64le@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.9.tgz#18482afb95b8a705e2da0a59d7131bff221281f9" - integrity sha512-OEiOxNAMH9ENFYqRsWUj3CWyN3V8P3ZXyfNAtX5rlCEC/ERXrCEFCJji/1F6POzsXAzxvUJrTSTCy7G6BhA6Fw== - -esbuild-linux-riscv64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.9.tgz#03b6f9708272c117006b9ce1c9ae8aab91b5a5b6" - integrity sha512-ukm4KsC3QRausEFjzTsOZ/qqazw0YvJsKmfoZZm9QW27OHjk2XKSQGGvx8gIEswft/Sadp03/VZvAaqv5AIwNA== - -esbuild-linux-s390x@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.9.tgz#65fb645623d575780f155f0ee52935e62f9cca4f" - integrity sha512-uDOQEH55wQ6ahcIKzQr3VyjGc6Po/xblLGLoUk3fVL1qjlZAibtQr6XRfy5wPJLu/M2o0vQKLq4lyJ2r1tWKcw== - -esbuild-netbsd-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.9.tgz#7894297bb9e11f3d2f6f31efecd1be4e181f0d54" - integrity sha512-yWgxaYTQz+TqX80wXRq6xAtb7GSBAp6gqLKfOdANg9qEmAI1Bxn04IrQr0Mzm4AhxvGKoHzjHjMgXbCCSSDxcw== - -esbuild-openbsd-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.9.tgz#0f9d4c6b6772ae50d491d68ad4cc028300dda7c0" - integrity sha512-JmS18acQl4iSAjrEha1MfEmUMN4FcnnrtTaJ7Qg0tDCOcgpPPQRLGsZqhes0vmx8VA6IqRyScqXvaL7+Q0Uf3A== - -esbuild-sunos-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.9.tgz#c32b7ce574b08f814de810ce7c1e34b843768126" - integrity sha512-UKynGSWpzkPmXW3D2UMOD9BZPIuRaSqphxSCwScfEE05Be3KAmvjsBhht1fLzKpiFVJb0BYMd4jEbWMyJ/z1hQ== - -esbuild-windows-32@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.9.tgz#37a8f7cfccdb2177cd46613a1a1e1fcb419d36df" - integrity sha512-aqXvu4/W9XyTVqO/hw3rNxKE1TcZiEYHPsXM9LwYmKSX9/hjvfIJzXwQBlPcJ/QOxedfoMVH0YnhhQ9Ffb0RGA== - -esbuild-windows-64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.9.tgz#5fe1e76fc13dd7f520febecaea110b6f1649c7b2" - integrity sha512-zm7h91WUmlS4idMtjvCrEeNhlH7+TNOmqw5dJPJZrgFaxoFyqYG6CKDpdFCQXdyKpD5yvzaQBOMVTCBVKGZDEg== - -esbuild-windows-arm64@0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.9.tgz#98504428f7ba7d2cfc11940be68ee1139173fdce" - integrity sha512-yQEVIv27oauAtvtuhJVfSNMztJJX47ismRS6Sv2QMVV9RM+6xjbMWuuwM2nxr5A2/gj/mu2z9YlQxiwoFRCfZA== +es6-iterator@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + +esbuild-android-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz#8a59a84acbf2eca96996cadc35642cf055c494f0" + integrity sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA== + +esbuild-android-arm64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz#f453851dc1d8c5409a38cf7613a33852faf4915d" + integrity sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg== + +esbuild-darwin-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz#778bd29c8186ff47b176c8af58c08cf0fb8e6b86" + integrity sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA== + +esbuild-darwin-arm64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz#b30bbefb46dc3c5d4708b0435e52f6456578d6df" + integrity sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ== + +esbuild-freebsd-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz#ab301c5f6ded5110dbdd611140bef1a7c2e99236" + integrity sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w== + +esbuild-freebsd-arm64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz#a5b09b867a6ff49110f52343b6f12265db63d43f" + integrity sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg== + +esbuild-linux-32@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz#5282fe9915641caf9c8070e4ba2c3e16d358f837" + integrity sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w== + +esbuild-linux-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz#f3726e85a00149580cb19f8abfabcbb96f5d52bb" + integrity sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA== + +esbuild-linux-arm64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz#2f0056e9d5286edb0185b56655caa8c574d8dbe7" + integrity sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A== + +esbuild-linux-arm@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz#40a9270da3c8ffa32cf72e24a79883e323dff08d" + integrity sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A== + +esbuild-linux-mips64le@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz#90ce1c4ee0202edb4ac69807dea77f7e5804abc4" + integrity sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q== + +esbuild-linux-ppc64le@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz#782837ae7bd5b279178106c9dd801755a21fabdf" + integrity sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ== + +esbuild-linux-riscv64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz#d7420d806ece5174f24f4634303146f915ab4207" + integrity sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q== + +esbuild-linux-s390x@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz#21fdf0cb3494a7fb520a71934e4dffce67fe47be" + integrity sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA== + +esbuild-netbsd-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz#6c06b3107e3df53de381e6299184d4597db0440f" + integrity sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw== + +esbuild-openbsd-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz#4daef5f5d8e74bbda53b65160029445d582570cf" + integrity sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ== + +esbuild-sunos-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz#5fe7bef267a02f322fd249a8214d0274937388a7" + integrity sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg== + +esbuild-windows-32@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz#48e3dde25ab0135579a288b30ab6ddef6d1f0b28" + integrity sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg== + +esbuild-windows-64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz#387a9515bef3fee502d277a5d0a2db49a4ecda05" + integrity sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA== + +esbuild-windows-arm64@0.15.10: + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz#5a6fcf2fa49e895949bf5495cf088ab1b43ae879" + integrity sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw== esbuild@^0.15.9: - version "0.15.9" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.9.tgz#33fb18b67b85004b6f7616bec955ca4b3e58935d" - integrity sha512-OnYr1rkMVxtmMHIAKZLMcEUlJmqcbxBz9QoBU8G9v455na0fuzlT/GLu6l+SRghrk0Mm2fSSciMmzV43Q8e0Gg== + version "0.15.10" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.10.tgz#85c2f8446e9b1fe04fae68daceacba033eedbd42" + integrity sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng== optionalDependencies: - "@esbuild/android-arm" "0.15.9" - "@esbuild/linux-loong64" "0.15.9" - esbuild-android-64 "0.15.9" - esbuild-android-arm64 "0.15.9" - esbuild-darwin-64 "0.15.9" - esbuild-darwin-arm64 "0.15.9" - esbuild-freebsd-64 "0.15.9" - esbuild-freebsd-arm64 "0.15.9" - esbuild-linux-32 "0.15.9" - esbuild-linux-64 "0.15.9" - esbuild-linux-arm "0.15.9" - esbuild-linux-arm64 "0.15.9" - esbuild-linux-mips64le "0.15.9" - esbuild-linux-ppc64le "0.15.9" - esbuild-linux-riscv64 "0.15.9" - esbuild-linux-s390x "0.15.9" - esbuild-netbsd-64 "0.15.9" - esbuild-openbsd-64 "0.15.9" - esbuild-sunos-64 "0.15.9" - esbuild-windows-32 "0.15.9" - esbuild-windows-64 "0.15.9" - esbuild-windows-arm64 "0.15.9" + "@esbuild/android-arm" "0.15.10" + "@esbuild/linux-loong64" "0.15.10" + esbuild-android-64 "0.15.10" + esbuild-android-arm64 "0.15.10" + esbuild-darwin-64 "0.15.10" + esbuild-darwin-arm64 "0.15.10" + esbuild-freebsd-64 "0.15.10" + esbuild-freebsd-arm64 "0.15.10" + esbuild-linux-32 "0.15.10" + esbuild-linux-64 "0.15.10" + esbuild-linux-arm "0.15.10" + esbuild-linux-arm64 "0.15.10" + esbuild-linux-mips64le "0.15.10" + esbuild-linux-ppc64le "0.15.10" + esbuild-linux-riscv64 "0.15.10" + esbuild-linux-s390x "0.15.10" + esbuild-netbsd-64 "0.15.10" + esbuild-openbsd-64 "0.15.10" + esbuild-sunos-64 "0.15.10" + esbuild-windows-32 "0.15.10" + esbuild-windows-64 "0.15.10" + esbuild-windows-arm64 "0.15.10" escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -2854,12 +3903,11 @@ eslint-import-resolver-typescript@^3.5.1: synckit "^0.8.3" eslint-module-utils@^2.6.2: - version "2.7.3" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" - integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== + version "2.7.4" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" + integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== dependencies: debug "^3.2.7" - find-up "^2.1.0" eslint-plugin-import@2.24.2: version "2.24.2" @@ -3018,7 +4066,48 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -ethereum-cryptography@^0.1.3: +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" + integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== + dependencies: + idna-uts46-hx "^2.3.1" + js-sha3 "^0.5.7" + +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@^0.1.26: + version "0.1.29" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" + integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + nano-json-stream-parser "^0.1.2" + servify "^0.1.12" + ws "^3.0.0" + xhr-request-promise "^0.1.2" + +ethereum-bloom-filters@^1.0.6: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" + integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== + dependencies: + js-sha3 "^0.8.0" + +ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== @@ -3040,15 +4129,27 @@ ethereum-cryptography@^0.1.3: setimmediate "^1.0.5" ethereum-cryptography@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.0.tgz#7048d184ff365a5255ced5cc9eb7682a273c4db7" - integrity sha512-wyNVTBR4wIR2yoXdMv4Qt44mTVBpPgSW/DQCTmNO6nQluwpyrAIvmL4mxPbziFuc6VWJQa3rwUxn0nUFU03nyQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" + integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== dependencies: - "@noble/hashes" "1.1.1" - "@noble/secp256k1" "1.6.0" + "@noble/hashes" "1.1.2" + "@noble/secp256k1" "1.6.3" "@scure/bip32" "1.1.0" "@scure/bip39" "1.1.0" +ethereum-ens@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57" + integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg== + dependencies: + bluebird "^3.4.7" + eth-ens-namehash "^2.0.0" + js-sha3 "^0.5.7" + pako "^1.0.4" + underscore "^1.8.3" + web3 "^1.0.0-beta.34" + ethereumjs-abi@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" @@ -3070,7 +4171,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== @@ -3081,41 +4182,64 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^5.4.7: - version "5.6.9" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.6.9.tgz#4e12f8dfcb67b88ae7a78a9519b384c23c576a4d" - integrity sha512-lMGC2zv9HC5EC+8r429WaWu3uWJUCgUCt8xxKCFqkrFuBDZXDYIdzDUECxzjf2BMF8IVBByY1EBoGSL3RTm8RA== - dependencies: - "@ethersproject/abi" "5.6.4" - "@ethersproject/abstract-provider" "5.6.1" - "@ethersproject/abstract-signer" "5.6.2" - "@ethersproject/address" "5.6.1" - "@ethersproject/base64" "5.6.1" - "@ethersproject/basex" "5.6.1" - "@ethersproject/bignumber" "5.6.2" - "@ethersproject/bytes" "5.6.1" - "@ethersproject/constants" "5.6.1" - "@ethersproject/contracts" "5.6.2" - "@ethersproject/hash" "5.6.1" - "@ethersproject/hdnode" "5.6.2" - "@ethersproject/json-wallets" "5.6.1" - "@ethersproject/keccak256" "5.6.1" - "@ethersproject/logger" "5.6.0" - "@ethersproject/networks" "5.6.4" - "@ethersproject/pbkdf2" "5.6.1" - "@ethersproject/properties" "5.6.0" - "@ethersproject/providers" "5.6.8" - "@ethersproject/random" "5.6.1" - "@ethersproject/rlp" "5.6.1" - "@ethersproject/sha2" "5.6.1" - "@ethersproject/signing-key" "5.6.2" - "@ethersproject/solidity" "5.6.1" - "@ethersproject/strings" "5.6.1" - "@ethersproject/transactions" "5.6.2" - "@ethersproject/units" "5.6.1" - "@ethersproject/wallet" "5.6.2" - "@ethersproject/web" "5.6.1" - "@ethersproject/wordlists" "5.6.1" +ethers@^4.0.0-beta.1, ethers@^4.0.32: + version "4.0.49" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" + integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== + dependencies: + aes-js "3.0.0" + bn.js "^4.11.9" + elliptic "6.5.4" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" + +ethers@^5.0.13, ethers@^5.4.7: + version "5.7.1" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" + integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.1" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" ethjs-util@0.1.6, ethjs-util@^0.1.6: version "0.1.6" @@ -3130,7 +4254,12 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -evp_bytestokey@^1.0.3: +eventemitter3@4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== + +evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== @@ -3151,6 +4280,72 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +express@^4.14.0: + version "4.18.1" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" + integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.0" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.10.3" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +ext@^1.1.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" + integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== + dependencies: + type "^2.7.2" + +extend@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-check@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" + integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== + dependencies: + pure-rand "^5.0.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -3161,7 +4356,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.11, fast-glob@^3.2.12: +fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -3172,17 +4367,6 @@ fast-glob@^3.2.11, fast-glob@^3.2.12: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -3214,6 +4398,19 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + find-cache-dir@^3.2.0: version "3.3.2" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" @@ -3231,6 +4428,14 @@ find-up@5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -3267,14 +4472,21 @@ flat@^5.0.2: integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== flatted@^3.1.0: - version "3.2.5" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3" - integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg== + version "3.2.7" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== follow-redirects@^1.12.1: - version "1.15.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" - integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" foreground-child@^2.0.0: version "2.0.0" @@ -3284,6 +4496,30 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data-encoder@1.7.1: + version "1.7.1" + resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" + integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== + +form-data@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + fp-ts@1.19.3: version "1.19.3" resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" @@ -3294,6 +4530,11 @@ fp-ts@^1.0.0: resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + fromentries@^1.2.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" @@ -3319,6 +4560,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -3328,6 +4578,13 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -3353,7 +4610,7 @@ function.prototype.name@^1.1.5: es-abstract "^1.19.0" functions-have-names "^1.2.2" -functional-red-black-tree@^1.0.1, functional-red-black-tree@~1.0.1: +functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== @@ -3368,6 +4625,11 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== +get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== + get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -3378,10 +4640,10 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" - integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" + integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== dependencies: function-bind "^1.1.1" has "^1.0.3" @@ -3392,13 +4654,25 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-symbol-description@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" @@ -3412,6 +4686,13 @@ get-tsconfig@^4.2.0: resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3443,15 +4724,23 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +global@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" + integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== + dependencies: + min-document "^2.19.0" + process "^0.11.10" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.15.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.15.0.tgz#38113218c907d2f7e98658af246cef8b77e90bac" - integrity sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog== + version "13.17.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" + integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== dependencies: type-fest "^0.20.2" @@ -3488,6 +4777,59 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +got@12.1.0: + version "12.1.0" + resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" + integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== + dependencies: + "@sindresorhus/is" "^4.6.0" + "@szmarczak/http-timer" "^5.0.1" + "@types/cacheable-request" "^6.0.2" + "@types/responselike" "^1.0.0" + cacheable-lookup "^6.0.4" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + form-data-encoder "1.7.1" + get-stream "^6.0.1" + http2-wrapper "^2.1.10" + lowercase-keys "^3.0.0" + p-cancelable "^3.0.0" + responselike "^2.0.0" + +got@9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +got@^11.8.5: + version "11.8.5" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" + integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -3505,20 +4847,38 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + hardhat@^2.10.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.10.0.tgz#23a640293d52ce79388660b2872624b2c6f94e5d" - integrity sha512-9VUorKvWNyW96qFXkwkpDUSeWND3gOZpm0oJ8l63JQJvWhxyxTJ92BcOrNylOKy9hzNNGdMfM2QWNP80fGOjpA== + version "2.11.2" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.11.2.tgz#c81388630255823bb1717ec07c4ee651b1fbe97f" + integrity sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q== dependencies: - "@ethereumjs/block" "^3.6.2" - "@ethereumjs/blockchain" "^5.5.2" - "@ethereumjs/common" "^2.6.4" - "@ethereumjs/tx" "^3.5.1" - "@ethereumjs/vm" "^5.9.0" "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" + "@nomicfoundation/ethereumjs-block" "^4.0.0" + "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" + "@nomicfoundation/ethereumjs-common" "^3.0.0" + "@nomicfoundation/ethereumjs-evm" "^1.0.0" + "@nomicfoundation/ethereumjs-rlp" "^4.0.0" + "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" + "@nomicfoundation/ethereumjs-trie" "^5.0.0" + "@nomicfoundation/ethereumjs-tx" "^4.0.0" + "@nomicfoundation/ethereumjs-util" "^8.0.0" + "@nomicfoundation/ethereumjs-vm" "^6.0.0" + "@nomicfoundation/solidity-analyzer" "^0.0.3" "@sentry/node" "^5.18.1" - "@solidity-parser/parser" "^0.14.2" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" abort-controller "^3.0.0" @@ -3533,15 +4893,14 @@ hardhat@^2.10.0: env-paths "^2.2.0" ethereum-cryptography "^1.0.3" ethereumjs-abi "^0.6.8" - ethereumjs-util "^7.1.4" find-up "^2.1.0" fp-ts "1.19.3" fs-extra "^7.0.1" glob "7.2.0" immutable "^4.0.0-rc.12" io-ts "1.10.4" + keccak "^3.0.2" lodash "^4.17.11" - merkle-patricia-tree "^4.2.4" mnemonist "^0.38.0" mocha "^10.0.0" p-map "^4.0.0" @@ -3549,11 +4908,9 @@ hardhat@^2.10.0: raw-body "^2.4.1" resolve "1.17.0" semver "^6.3.0" - slash "^3.0.0" solc "0.7.3" source-map-support "^0.5.13" stacktrace-parser "^0.1.10" - "true-case-path" "^2.2.1" tsort "0.0.1" undici "^5.4.0" uuid "^8.3.2" @@ -3581,7 +4938,7 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -3609,6 +4966,19 @@ hash-base@^3.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" +hash-test-vectors@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz#f050fde1aff46ec28dcf4f70e4e3238cd5000f4c" + integrity sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ== + +hash.js@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" + integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.0" + hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" @@ -3630,6 +5000,24 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" + integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== + dependencies: + no-case "^2.2.0" + upper-case "^1.1.3" + +highlight.js@^10.4.1: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +highlightjs-solidity@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz#48b945f41886fa49af9f06023e6e87fffc243745" + integrity sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" @@ -3649,6 +5037,21 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +htmlparser2@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" + integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + domutils "^3.0.1" + entities "^4.3.0" + +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -3660,6 +5063,36 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +http2-wrapper@^2.1.10: + version "2.1.11" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.1.11.tgz#d7c980c7ffb85be3859b6a96c800b2951ae257ef" + integrity sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.2.0" + https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3682,7 +5115,14 @@ iconv-lite@0.6: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13: +idna-uts46-hx@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" + integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== + dependencies: + punycode "2.1.0" + +ieee754@^1.1.13, ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -3697,16 +5137,6 @@ ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== -immediate@^3.2.3: - version "3.3.0" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" - integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== - -immediate@~3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c" - integrity sha512-RrGCXRm/fRVqMIhqXrGEX9rRADavPiDFSoMb/k64i9XMk8uH4r/Omi5Ctierj6XzNecwDbO4WuFbDD1zmpl3Tg== - immutable@^4.0.0-rc.12: version "4.1.0" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" @@ -3738,7 +5168,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -3793,6 +5223,11 @@ internal-slot@^1.0.3: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== + io-ts@1.10.4: version "1.10.4" resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" @@ -3800,6 +5235,19 @@ io-ts@1.10.4: dependencies: fp-ts "^1.0.0" +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-arguments@^1.0.4: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -3827,10 +5275,15 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-callable@^1.1.4, is-callable@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" - integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== +is-buffer@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" + integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.6: + version "1.2.7" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== is-ci@^2.0.0: version "2.0.0" @@ -3839,20 +5292,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.10.0: +is-core-module@^2.10.0, is-core-module@^2.6.0, is-core-module@^2.9.0: version "2.10.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" -is-core-module@^2.6.0, is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -3870,6 +5316,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== + dependencies: + number-is-nan "^1.0.0" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -3880,6 +5333,18 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" @@ -3892,6 +5357,13 @@ is-hex-prefixed@1.0.0: resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== +is-lower-case@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" + integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== + dependencies: + lower-case "^1.1.0" + is-negative-zero@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" @@ -3953,7 +5425,18 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typedarray@^1.0.0: +is-typed-array@^1.1.3, is-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" + integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== @@ -3963,6 +5446,18 @@ is-unicode-supported@^0.1.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== +is-upper-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" + integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== + dependencies: + upper-case "^1.1.0" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -3992,6 +5487,11 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" @@ -4045,9 +5545,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.4" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== + version "3.1.5" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -4066,7 +5566,12 @@ js-graph-algorithms@1.0.18: resolved "https://registry.yarnpkg.com/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz#f96ec87bf194f5c0a31365fa0e1d07b7b962d891" integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== -js-sha3@0.8.0: +js-sha3@0.5.7, js-sha3@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" + integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== + +js-sha3@0.8.0, js-sha3@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== @@ -4091,11 +5596,26 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -4111,11 +5631,21 @@ json-schema-traverse@^1.0.0: resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -4151,12 +5681,22 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsprim@^1.2.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" + integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + just-extend@^4.0.2: version "4.2.1" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== -keccak@^3.0.0: +keccak@^3.0.0, keccak@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== @@ -4165,6 +5705,20 @@ keccak@^3.0.0: node-gyp-build "^4.2.0" readable-stream "^3.6.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.0.tgz#dbce9ade79610b6e641a9a65f2f6499ba06b9bc6" + integrity sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA== + dependencies: + json-buffer "3.0.1" + khroma@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" @@ -4177,76 +5731,33 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" -level-codec@^9.0.0: - version "9.0.2" - resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc" - integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ== - dependencies: - buffer "^5.6.0" - -level-concat-iterator@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263" - integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw== - -level-errors@^2.0.0, level-errors@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8" - integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw== - dependencies: - errno "~0.1.1" - -level-iterator-stream@~4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c" - integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q== - dependencies: - inherits "^2.0.4" - readable-stream "^3.4.0" - xtend "^4.0.2" - -level-mem@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/level-mem/-/level-mem-5.0.1.tgz#c345126b74f5b8aa376dc77d36813a177ef8251d" - integrity sha512-qd+qUJHXsGSFoHTziptAKXoLX87QjR7v2KMbqncDXPxQuCdsQlzmyX+gwrEHhlzn08vkf8TyipYyMmiC6Gobzg== +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== dependencies: - level-packager "^5.0.3" - memdown "^5.0.0" + invert-kv "^1.0.0" -level-packager@^5.0.3: - version "5.1.1" - resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939" - integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ== - dependencies: - encoding-down "^6.3.0" - levelup "^4.3.2" +level-supports@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" + integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== -level-supports@~1.0.0: +level-transcoder@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d" - integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg== - dependencies: - xtend "^4.0.2" - -level-ws@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-2.0.0.tgz#207a07bcd0164a0ec5d62c304b4615c54436d339" - integrity sha512-1iv7VXx0G9ec1isqQZ7y5LmoZo/ewAsyDHNA8EFDW5hqH2Kqovm33nSFkSdnLLAK+I5FlT+lo5Cw9itGe+CpQA== + resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" + integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== dependencies: - inherits "^2.0.3" - readable-stream "^3.1.0" - xtend "^4.0.1" + buffer "^6.0.3" + module-error "^1.0.1" -levelup@^4.3.2: - version "4.4.0" - resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6" - integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ== +level@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" + integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== dependencies: - deferred-leveldown "~5.3.0" - level-errors "~2.0.0" - level-iterator-stream "~4.0.0" - level-supports "~1.0.0" - xtend "~4.0.0" + browser-level "^1.0.1" + classic-level "^1.2.0" levn@^0.4.1: version "0.4.1" @@ -4256,6 +5767,17 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4296,6 +5818,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.assign@^4.0.3, lodash.assign@^4.0.6: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -4316,7 +5843,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -4343,6 +5870,33 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lower-case-first@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" + integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== + dependencies: + lower-case "^1.1.2" + +lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" + integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lowercase-keys@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" + integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -4362,11 +5916,6 @@ lru_map@^0.3.3: resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== -ltgt@~2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" - integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA== - make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -4393,40 +5942,35 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" -memdown@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/memdown/-/memdown-5.1.0.tgz#608e91a9f10f37f5b5fe767667a8674129a833cb" - integrity sha512-B3J+UizMRAlEArDjWHTMmadet+UKwHd3UjMgGBkZcKAxAYVPS9o0Yeiha4qvz7iGiL2Sb3igUft6p7nbFWctpw== - dependencies: - abstract-leveldown "~6.2.1" - functional-red-black-tree "~1.0.1" - immediate "~3.2.3" - inherits "~2.0.1" - ltgt "~2.2.0" - safe-buffer "~5.2.0" +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memory-level@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" + integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== + dependencies: + abstract-level "^1.0.0" + functional-red-black-tree "^1.0.1" + module-error "^1.0.1" memorystream@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== -merkle-patricia-tree@^4.2.4: - version "4.2.4" - resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-4.2.4.tgz#ff988d045e2bf3dfa2239f7fabe2d59618d57413" - integrity sha512-eHbf/BG6eGNsqqfbLED9rIqbsF4+sykEaBn6OLNs71tjclbMcMOk1tEPmJKcNcNCLkvbpY/lwyOlizWsqPNo8w== - dependencies: - "@types/levelup" "^4.3.0" - ethereumjs-util "^7.1.4" - level-mem "^5.0.1" - level-ws "^2.0.0" - readable-stream "^3.6.0" - semaphore-async-await "^1.5.1" - mermaid@^9.1.7: version "9.1.7" resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.7.tgz#e24de9b2d36c8cb25a09d72ffce966941b24bd6e" @@ -4442,6 +5986,11 @@ mermaid@^9.1.7: moment-mini "2.24.0" stylis "^4.0.10" +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -4458,11 +6007,45 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -4499,6 +6082,40 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minipass@^2.6.0, minipass@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" + integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== + dependencies: + safe-buffer "^5.1.2" + yallist "^3.0.0" + +minizlib@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" + integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== + dependencies: + minipass "^2.9.0" + +mkdirp-promise@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" + integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== + dependencies: + mkdirp "*" + +mkdirp@*: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^0.5.5: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + mnemonist@^0.38.0: version "0.38.5" resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" @@ -4564,6 +6181,16 @@ mocha@^9.1.1, mocha@^9.1.3: yargs-parser "20.2.4" yargs-unparser "2.0.0" +mock-fs@^4.1.0: + version "4.14.0" + resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" + integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== + +module-error@^1.0.1, module-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" + integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== + moment-mini@2.24.0: version "2.24.0" resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" @@ -4584,6 +6211,56 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multibase@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" + integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multibase@~0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" + integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== + dependencies: + base-x "^3.0.8" + buffer "^5.5.0" + +multicodec@^0.5.5: + version "0.5.7" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" + integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== + dependencies: + varint "^5.0.0" + +multicodec@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" + integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== + dependencies: + buffer "^5.6.0" + varint "^5.0.0" + +multihashes@^0.4.15, multihashes@~0.4.15: + version "0.4.21" + resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" + integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== + dependencies: + buffer "^5.5.0" + multibase "^0.7.0" + varint "^5.0.0" + +nano-base32@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" + integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== + +nano-json-stream-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" + integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== + nanoid@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -4594,11 +6271,26 @@ nanoid@3.3.3: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== +napi-macros@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" + integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +next-tick@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" + integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== + nice-try@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" @@ -4615,15 +6307,29 @@ nise@^5.1.0, nise@^5.1.1: just-extend "^4.0.2" path-to-regexp "^1.7.0" +no-case@^2.2.0, no-case@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" + integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== + dependencies: + lower-case "^1.1.1" + node-addon-api@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== -node-gyp-build@^4.2.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.4.0.tgz#42e99687ce87ddeaf3a10b99dc06abc11021f3f4" - integrity sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ== +node-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" + integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== node-preload@^0.2.1: version "0.2.1" @@ -4632,10 +6338,15 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.5.tgz#280ed5bc3eba0d96ce44897d8aee478bfb3d9666" - integrity sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q== +node-releases@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" + integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== + +nofilter@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" + integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== normalize-package-data@^2.3.2: version "2.5.0" @@ -4652,6 +6363,16 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" @@ -4659,6 +6380,26 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== + +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + nyc@15.1.0: version "15.1.0" resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" @@ -4692,12 +6433,17 @@ nyc@15.1.0: test-exclude "^6.0.0" yargs "^15.0.2" -object-assign@^4.1.1: +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== -object-inspect@^1.12.0, object-inspect@^1.9.0: +object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== @@ -4707,14 +6453,14 @@ object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object.assign@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" object-keys "^1.1.1" object.values@^1.1.4: @@ -4731,6 +6477,20 @@ obliterator@^2.0.0: resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== + dependencies: + http-https "^1.0.0" + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -4766,11 +6526,33 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== + dependencies: + lcid "^1.0.0" + os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-cancelable@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" + integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -4859,6 +6641,18 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" +pako@^1.0.4: + version "1.0.11" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" + integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== + +param-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" + integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== + dependencies: + no-case "^2.2.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4866,6 +6660,29 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-asn1@^5.0.0, parse-asn1@^5.1.5: + version "5.1.6" + resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" + integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== + dependencies: + asn1.js "^5.2.0" + browserify-aes "^1.0.0" + evp_bytestokey "^1.0.0" + pbkdf2 "^3.0.3" + safe-buffer "^5.1.1" + +parse-headers@^2.0.0: + version "2.0.5" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" + integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== + dependencies: + error-ex "^1.2.0" + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -4874,11 +6691,53 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" + integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== + dependencies: + domhandler "^5.0.2" + parse5 "^7.0.0" + +parse5@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" + integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" + integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== + dependencies: + camel-case "^3.0.0" + upper-case-first "^1.1.0" + patch-console@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== +path-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" + integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== + dependencies: + no-case "^2.2.0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -4909,6 +6768,11 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -4916,6 +6780,15 @@ path-to-regexp@^1.7.0: dependencies: isarray "0.0.1" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -4933,7 +6806,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -pbkdf2@^3.0.17: +pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.2" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== @@ -4944,6 +6817,11 @@ pbkdf2@^3.0.17: safe-buffer "^5.0.1" sha.js "^2.4.8" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + picocolors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" @@ -4954,11 +6832,28 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -4978,6 +6873,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + prettier-linter-helpers@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" @@ -4997,15 +6897,40 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw== +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +psl@^1.1.28: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +public-encrypt@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" + integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== + dependencies: + bn.js "^4.1.0" + browserify-rsa "^4.0.0" + create-hash "^1.1.0" + parse-asn1 "^5.0.0" + randombytes "^2.0.1" + safe-buffer "^5.1.2" pump@^3.0.0: version "3.0.0" @@ -5015,36 +6940,85 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -punycode@^2.1.0: +punycode@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" + integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== + +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +pure-rand@^5.0.1: + version "5.0.3" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.3.tgz#a2f15dfbc3be8433d1d8ed67ee411aa83fb90406" + integrity sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw== + +qs@6.10.3: + version "6.10.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" + integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + dependencies: + side-channel "^1.0.4" + qs@^6.7.0: - version "6.10.5" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.5.tgz#974715920a80ff6a262264acd2c7e6c2a53282b4" - integrity sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ== + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" -queue-microtask@^1.2.2: +qs@~6.5.2: + version "6.5.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + ramda@^0.27.1: version "0.27.2" resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== -randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" -raw-body@^2.4.1: +randomfill@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" + integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== + dependencies: + randombytes "^2.0.5" + safe-buffer "^5.1.0" + +range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1, raw-body@^2.4.1: version "2.5.1" resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== @@ -5055,9 +7029,9 @@ raw-body@^2.4.1: unpipe "1.0.0" react-devtools-core@^4.19.1: - version "4.24.7" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.24.7.tgz#43df22e6d244ed8286fd3ff16a80813998fe82a0" - integrity sha512-OFB1cp8bsh5Kc6oOJ3ZzH++zMBtydwD53yBYa50FKEGyOOdgdbJ4VsCsZhN/6F5T4gJfrZraU6EKda8P+tMLtg== + version "4.26.0" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.26.0.tgz#d3d0f59d62ccf1ac03017a7e92f0fe71455019cc" + integrity sha512-OO0Q+vXtHYCXvRQ6elLiOUph3MjsCpuYktGTLnBpizYm46f8tAPuJKihGkwsceitHSJNpzNIjJaYHgX96CyTUQ== dependencies: shell-quote "^1.6.1" ws "^7" @@ -5078,6 +7052,14 @@ react@18.2.0: dependencies: loose-envify "^1.1.0" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -5086,6 +7068,15 @@ read-pkg-up@^3.0.0: find-up "^2.0.0" read-pkg "^3.0.0" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -5095,7 +7086,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -readable-stream@^3.1.0, readable-stream@^3.4.0, readable-stream@^3.6.0: +readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -5111,6 +7102,11 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +regenerator-runtime@^0.13.4: + version "0.13.9" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" + integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== + regexp.prototype.flags@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" @@ -5132,21 +7128,62 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" +request@^2.79.0: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== +require-from-string@^1.1.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" + integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== + require-from-string@^2.0.0, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== + require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -5173,6 +7210,20 @@ resolve@^1.10.0, resolve@^1.20.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -5200,7 +7251,12 @@ rimraf@^2.2.8: dependencies: glob "^7.1.3" -ripemd160@^2.0.0, ripemd160@^2.0.1: +ripemd160-min@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" + integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== + +ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== @@ -5220,6 +7276,13 @@ robust-predicates@^3.0.0: resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== +run-parallel-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" + integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== + dependencies: + queue-microtask "^1.2.2" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -5237,17 +7300,26 @@ rw@1: resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-buffer@~5.1.1: +safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -5260,7 +7332,12 @@ scheduler@^0.20.2: loose-envify "^1.1.0" object-assign "^4.1.1" -scrypt-js@3.0.1, scrypt-js@^3.0.0: +scrypt-js@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== + +scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== @@ -5274,27 +7351,49 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -semaphore-async-await@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/semaphore-async-await/-/semaphore-async-await-1.5.1.tgz#857bef5e3644601ca4b9570b87e9df5ca12974fa" - integrity sha512-b/ptP11hETwYWpeilHXXQiV5UJNJl7ZWWooKRE5eBIYWoom6dZ0SluCIdCtKycsMtZgKWE01/qAw6jblw1YVhg== - -"semver@2 || 3 || 4 || 5", semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== +semver@7.3.7, semver@^7.2.1, semver@^7.3.5: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.5: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +sentence-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" + integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== dependencies: - lru-cache "^6.0.0" + no-case "^2.2.0" + upper-case-first "^1.1.2" serialize-javascript@6.0.0: version "6.0.0" @@ -5303,11 +7402,37 @@ serialize-javascript@6.0.0: dependencies: randombytes "^2.1.0" +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +servify@^0.1.12: + version "0.1.12" + resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" + integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== + dependencies: + body-parser "^1.16.0" + cors "^2.8.1" + express "^4.14.0" + request "^2.79.0" + xhr "^2.3.3" + set-blocking@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== + setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -5326,6 +7451,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +sha3@^2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" + integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== + dependencies: + buffer "6.0.3" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -5369,6 +7501,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.7.0: + version "2.8.2" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" + integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + sinon@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/sinon/-/sinon-12.0.1.tgz#331eef87298752e1b88a662b699f98e403c859e9" @@ -5421,6 +7567,13 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +snake-case@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" + integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== + dependencies: + no-case "^2.2.0" + solc@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" @@ -5436,7 +7589,18 @@ solc@0.7.3: semver "^5.5.0" tmp "0.0.33" -source-map-support@^0.5.13: +solc@^0.4.20: + version "0.4.26" + resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" + integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== + dependencies: + fs-extra "^0.30.0" + memorystream "^0.3.1" + require-from-string "^1.1.0" + semver "^5.3.0" + yargs "^4.7.1" + +source-map-support@^0.5.13, source-map-support@^0.5.19: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== @@ -5483,9 +7647,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.11" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95" - integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g== + version "3.0.12" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" + integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== split@^1.0.1: version "1.0.1" @@ -5499,6 +7663,21 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +sshpk@^1.7.0: + version "1.17.0" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" + integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + stack-utils@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" @@ -5518,6 +7697,20 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== + +string-width@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -5561,6 +7754,20 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" @@ -5575,6 +7782,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -5597,6 +7811,11 @@ strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed "1.0.0" +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== + strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -5633,6 +7852,31 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +swap-case@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" + integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== + dependencies: + lower-case "^1.1.1" + upper-case "^1.1.1" + +swarm-js@^0.1.40: + version "0.1.42" + resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" + integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== + dependencies: + bluebird "^3.5.0" + buffer "^5.0.5" + eth-lib "^0.1.26" + fs-extra "^4.0.2" + got "^11.8.5" + mime-types "^2.1.16" + mkdirp-promise "^5.0.1" + mock-fs "^4.1.0" + setimmediate "^1.0.5" + tar "^4.0.2" + xhr-request "^1.0.1" + synckit@^0.8.3: version "0.8.4" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" @@ -5657,6 +7901,19 @@ tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== +tar@^4.0.2: + version "4.4.19" + resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" + integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== + dependencies: + chownr "^1.1.4" + fs-minipass "^1.2.7" + minipass "^2.9.0" + minizlib "^1.3.3" + mkdirp "^0.5.5" + safe-buffer "^5.2.1" + yallist "^3.1.1" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -5666,6 +7923,11 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +testrpc@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" + integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -5681,6 +7943,11 @@ through@2: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== + tiny-glob@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" @@ -5689,6 +7956,14 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +title-case@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" + integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== + dependencies: + no-case "^2.2.0" + upper-case "^1.0.3" + tmp@0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -5708,6 +7983,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -5720,12 +8000,20 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -"true-case-path@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/true-case-path/-/true-case-path-2.2.1.tgz#c5bf04a5bbec3fd118be4084461b3a27c4d796bf" - integrity sha512-0z3j8R7MCjy10kc/g+qg7Ln3alJTodw9aDuVWZa3uiWqfuBMKeAeP2ocWcxoyM3D73yz3Jt/Pu4qPr4wHSdB/Q== +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" -ts-node@10.8.1, ts-node@^10.3.0: +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +ts-node@10.8.1: version "10.8.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== @@ -5744,6 +8032,25 @@ ts-node@10.8.1, ts-node@^10.3.0: v8-compile-cache-lib "^3.0.1" yn "3.1.1" +ts-node@^10.3.0: + version "10.9.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" + integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + tsconfig-paths@^3.11.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -5785,11 +8092,23 @@ tsutils@^3.21.0: dependencies: tslib "^1.8.1" +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== + dependencies: + safe-buffer "^5.0.1" + tweetnacl-util@^0.15.1: version "0.15.1" resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + tweetnacl@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" @@ -5832,6 +8151,24 @@ type-fest@^0.8.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" + integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -5840,9 +8177,14 @@ typedarray-to-buffer@^3.1.5: is-typedarray "^1.0.0" typescript@^4.7.4: - version "4.7.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" - integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== unbox-primitive@^1.0.2: version "1.0.2" @@ -5854,10 +8196,15 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +underscore@^1.8.3: + version "1.13.6" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" + integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== + undici@^5.4.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.5.1.tgz#baaf25844a99eaa0b22e1ef8d205bffe587c8f43" - integrity sha512-MEvryPLf18HvlCbLSzCW0U00IMftKGI5udnjrQbC5D4P0Hodwffhv+iGfWuJwg16Y/TK11ZFK8i+BPVW2z/eAw== + version "5.10.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" + integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== universalify@^0.1.0: version "0.1.2" @@ -5869,19 +8216,31 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== -unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== -update-browserslist-db@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz#dbfc5a789caa26b1db8990796c2c8ebbce304824" - integrity sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA== +update-browserslist-db@^1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" + integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^1.1.0, upper-case-first@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" + integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== + dependencies: + upper-case "^1.1.1" + +upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" + integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -5889,11 +8248,67 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== + +utf-8-validate@^5.0.2: + version "5.0.9" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" + integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== + dependencies: + node-gyp-build "^4.3.0" + +utf8@3.0.0, utf8@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" + integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@^3.3.2: + version "3.4.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== + uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" @@ -5917,6 +8332,508 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +varint@^5.0.0: + version "5.0.2" + resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" + integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +web3-bzz@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" + integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== + dependencies: + "@types/node" "^12.12.6" + got "9.6.0" + swarm-js "^0.1.40" + +web3-bzz@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.0.tgz#2023676d7c17ea36512bf76eb310755a02a3d464" + integrity sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ== + dependencies: + "@types/node" "^12.12.6" + got "12.1.0" + swarm-js "^0.1.40" + +web3-core-helpers@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" + integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== + dependencies: + web3-eth-iban "1.7.4" + web3-utils "1.7.4" + +web3-core-helpers@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz#5dcfdda1a4ea277041d912003198f1334ca29d7c" + integrity sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw== + dependencies: + web3-eth-iban "1.8.0" + web3-utils "1.8.0" + +web3-core-method@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" + integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-utils "1.7.4" + +web3-core-method@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.0.tgz#9c2da8896808917d1679c319f19e2174ba17086c" + integrity sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA== + dependencies: + "@ethersproject/transactions" "^5.6.2" + web3-core-helpers "1.8.0" + web3-core-promievent "1.8.0" + web3-core-subscriptions "1.8.0" + web3-utils "1.8.0" + +web3-core-promievent@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" + integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== + dependencies: + eventemitter3 "4.0.4" + +web3-core-promievent@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz#979765fd4d37ab0f158f0ee54037b279b737bd53" + integrity sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" + integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== + dependencies: + util "^0.12.0" + web3-core-helpers "1.7.4" + web3-providers-http "1.7.4" + web3-providers-ipc "1.7.4" + web3-providers-ws "1.7.4" + +web3-core-requestmanager@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz#06189df80cf52d24a195a7ef655031afe8192df3" + integrity sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg== + dependencies: + util "^0.12.0" + web3-core-helpers "1.8.0" + web3-providers-http "1.8.0" + web3-providers-ipc "1.8.0" + web3-providers-ws "1.8.0" + +web3-core-subscriptions@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" + integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" + +web3-core-subscriptions@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz#ff66ae4467c8cb4716367248bcefb1845c0f8b83" + integrity sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.0" + +web3-core@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" + integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-requestmanager "1.7.4" + web3-utils "1.7.4" + +web3-core@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.0.tgz#90afce527ac1b1dff8cbed2acbc0336530b8aacf" + integrity sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA== + dependencies: + "@types/bn.js" "^5.1.0" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-requestmanager "1.8.0" + web3-utils "1.8.0" + +web3-eth-abi@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" + integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.7.4" + +web3-eth-abi@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz#47fdff00bfdfa72064c9c612ff6369986598196d" + integrity sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg== + dependencies: + "@ethersproject/abi" "^5.6.3" + web3-utils "1.8.0" + +web3-eth-accounts@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" + integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== + dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" + uuid "3.3.2" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" + +web3-eth-accounts@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz#960d947ee87a49d6c706dc6312334fbfbd6ff812" + integrity sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw== + dependencies: + "@ethereumjs/common" "^2.5.0" + "@ethereumjs/tx" "^3.3.2" + crypto-browserify "3.12.0" + eth-lib "0.2.8" + ethereumjs-util "^7.0.10" + scrypt-js "^3.0.1" + uuid "3.3.2" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-utils "1.8.0" + +web3-eth-contract@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" + integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== + dependencies: + "@types/bn.js" "^5.1.0" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-promievent "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-utils "1.7.4" + +web3-eth-contract@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz#58f4ce0bde74e5ce87663502e409a92abad7b2c5" + integrity sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q== + dependencies: + "@types/bn.js" "^5.1.0" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-promievent "1.8.0" + web3-core-subscriptions "1.8.0" + web3-eth-abi "1.8.0" + web3-utils "1.8.0" + +web3-eth-ens@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" + integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-promievent "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-contract "1.7.4" + web3-utils "1.7.4" + +web3-eth-ens@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz#f1937371eac54b087ebe2e871780c2710d39998d" + integrity sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA== + dependencies: + content-hash "^2.5.2" + eth-ens-namehash "2.0.8" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-promievent "1.8.0" + web3-eth-abi "1.8.0" + web3-eth-contract "1.8.0" + web3-utils "1.8.0" + +web3-eth-iban@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" + integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== + dependencies: + bn.js "^5.2.1" + web3-utils "1.7.4" + +web3-eth-iban@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz#3af8a0c95b5f7b0b81ab0bcd2075c1e5dda31520" + integrity sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg== + dependencies: + bn.js "^5.2.1" + web3-utils "1.8.0" + +web3-eth-personal@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" + integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + +web3-eth-personal@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz#433c35e2e042844402a12d543c4126ea1494b478" + integrity sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A== + dependencies: + "@types/node" "^12.12.6" + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-net "1.8.0" + web3-utils "1.8.0" + +web3-eth@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" + integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== + dependencies: + web3-core "1.7.4" + web3-core-helpers "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-eth-abi "1.7.4" + web3-eth-accounts "1.7.4" + web3-eth-contract "1.7.4" + web3-eth-ens "1.7.4" + web3-eth-iban "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-utils "1.7.4" + +web3-eth@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.0.tgz#006974a5d5e30644d05814111f9e162a72e4a09c" + integrity sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw== + dependencies: + web3-core "1.8.0" + web3-core-helpers "1.8.0" + web3-core-method "1.8.0" + web3-core-subscriptions "1.8.0" + web3-eth-abi "1.8.0" + web3-eth-accounts "1.8.0" + web3-eth-contract "1.8.0" + web3-eth-ens "1.8.0" + web3-eth-iban "1.8.0" + web3-eth-personal "1.8.0" + web3-net "1.8.0" + web3-utils "1.8.0" + +web3-net@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" + integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== + dependencies: + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-utils "1.7.4" + +web3-net@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.0.tgz#9acff92d7c647d801bc68df0ff4416f104dbe789" + integrity sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw== + dependencies: + web3-core "1.8.0" + web3-core-method "1.8.0" + web3-utils "1.8.0" + +web3-providers-http@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" + integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== + dependencies: + web3-core-helpers "1.7.4" + xhr2-cookies "1.1.0" + +web3-providers-http@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.0.tgz#3fd1e569ead2095343fac17d53160a3bae674c23" + integrity sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw== + dependencies: + abortcontroller-polyfill "^1.7.3" + cross-fetch "^3.1.4" + es6-promise "^4.2.8" + web3-core-helpers "1.8.0" + +web3-providers-ipc@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" + integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.7.4" + +web3-providers-ipc@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz#d339a24c4d764e459e425d3ac868a551ac33e3ea" + integrity sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg== + dependencies: + oboe "2.1.5" + web3-core-helpers "1.8.0" + +web3-providers-ws@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" + integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.7.4" + websocket "^1.0.32" + +web3-providers-ws@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz#a0a73e0606981ea32bed40d215000a64753899de" + integrity sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg== + dependencies: + eventemitter3 "4.0.4" + web3-core-helpers "1.8.0" + websocket "^1.0.32" + +web3-shh@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" + integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== + dependencies: + web3-core "1.7.4" + web3-core-method "1.7.4" + web3-core-subscriptions "1.7.4" + web3-net "1.7.4" + +web3-shh@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.0.tgz#b4abbf4f59d097ce2f74360e61e2e5c0bd6507c7" + integrity sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg== + dependencies: + web3-core "1.8.0" + web3-core-method "1.8.0" + web3-core-subscriptions "1.8.0" + web3-net "1.8.0" + +web3-utils@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" + integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3-utils@1.8.0, web3-utils@^1.0.0-beta.31: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" + integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== + dependencies: + bn.js "^5.2.1" + ethereum-bloom-filters "^1.0.6" + ethereumjs-util "^7.1.0" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + utf8 "3.0.0" + +web3@1.7.4: + version "1.7.4" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" + integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== + dependencies: + web3-bzz "1.7.4" + web3-core "1.7.4" + web3-eth "1.7.4" + web3-eth-personal "1.7.4" + web3-net "1.7.4" + web3-shh "1.7.4" + web3-utils "1.7.4" + +web3@^1.0.0-beta.34: + version "1.8.0" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.0.tgz#3ca5f0b32de6a1f626407740411219035b5fde64" + integrity sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA== + dependencies: + web3-bzz "1.8.0" + web3-core "1.8.0" + web3-eth "1.8.0" + web3-eth-personal "1.8.0" + web3-net "1.8.0" + web3-shh "1.8.0" + web3-utils "1.8.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +websocket@^1.0.32: + version "1.0.34" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" + integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" @@ -5928,11 +8845,28 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== +which-typed-array@^1.1.2: + version "1.1.8" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" + integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-abstract "^1.20.0" + for-each "^0.3.3" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.9" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -5954,6 +8888,11 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +window-size@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" + integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== + word-wrap@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -5969,6 +8908,14 @@ workerpool@6.2.1: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -6016,10 +8963,19 @@ ws@7.4.6: resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + ws@^7, ws@^7.4.6, ws@^7.5.5: - version "7.5.8" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.8.tgz#ac2729881ab9e7cbaf8787fe3469a48c5c7f636a" - integrity sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw== + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== wsrun@^5.2.4: version "5.2.4" @@ -6036,11 +8992,58 @@ wsrun@^5.2.4: throat "^4.1.0" yargs "^13.0.0" -xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0: +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.0.1, xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr2-cookies@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== + dependencies: + cookiejar "^2.1.1" + +xhr@^2.0.4, xhr@^2.3.3: + version "2.6.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" + integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== + dependencies: + global "~4.4.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + +xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== + +xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^3.2.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== + y18n@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" @@ -6051,7 +9054,12 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^3.0.2: +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== + +yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== @@ -6082,6 +9090,14 @@ yargs-parser@^18.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" + integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== + dependencies: + camelcase "^3.0.0" + lodash.assign "^4.0.6" + yargs-parser@^20.2.2: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -6143,6 +9159,26 @@ yargs@^15.0.2: y18n "^4.0.0" yargs-parser "^18.1.2" +yargs@^4.7.1: + version "4.8.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" + integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== + dependencies: + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + lodash.assign "^4.0.3" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.1" + which-module "^1.0.0" + window-size "^0.2.0" + y18n "^3.2.1" + yargs-parser "^2.4.1" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" From 1713143f8489fa242fecf070b3c9c4e425963ce8 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 3 Oct 2022 03:44:13 -0400 Subject: [PATCH 0110/1302] they say true beauty comes from within... --- packages/core/src/types/graph.ts | 1 + packages/hardhat-plugin/esbuild.js | 11 +- packages/hardhat-plugin/src/index.ts | 10 +- .../src/plan/assets/logo-dark.png | Bin 0 -> 22448 bytes .../src/plan/assets/logo-light.png | Bin 0 -> 22282 bytes .../plan/assets/{ => templates}/index.html | 4 +- .../src/plan/assets/templates/plan.html | 9 + .../src/plan/assets/templates/summary.html | 8 + .../src/plan/assets/templates/title.html | 5 + packages/hardhat-plugin/src/plan/index.ts | 155 ++++++++++-------- packages/hardhat-plugin/src/plan/utils.ts | 98 +++++++++-- 11 files changed, 210 insertions(+), 91 deletions(-) create mode 100644 packages/hardhat-plugin/src/plan/assets/logo-dark.png create mode 100644 packages/hardhat-plugin/src/plan/assets/logo-light.png rename packages/hardhat-plugin/src/plan/assets/{ => templates}/index.html (79%) create mode 100644 packages/hardhat-plugin/src/plan/assets/templates/plan.html create mode 100644 packages/hardhat-plugin/src/plan/assets/templates/summary.html create mode 100644 packages/hardhat-plugin/src/plan/assets/templates/title.html diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index 4516d93543..a2376000a2 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -1,6 +1,7 @@ export interface VertexDescriptor { id: number; label: string; + type: string; } export type AdjacencyList = Map>; diff --git a/packages/hardhat-plugin/esbuild.js b/packages/hardhat-plugin/esbuild.js index 05b0498e81..f71bdbf9da 100644 --- a/packages/hardhat-plugin/esbuild.js +++ b/packages/hardhat-plugin/esbuild.js @@ -1,19 +1,26 @@ const esbuild = require("esbuild"); +const fs = require("fs-extra"); const path = require("path"); const outdir = path.resolve(__dirname, "dist/plan/assets"); const srcdir = path.resolve(__dirname, "src/plan/assets"); +const templates = fs + .readdirSync(`${srcdir}/templates`) + .map((f) => `${srcdir}/templates/${f}`); + esbuild.build({ outdir, entryPoints: [ path.resolve(srcdir, "bundle.ts"), path.resolve(srcdir, "main.css"), - path.resolve(srcdir, "index.html"), - path.resolve(srcdir, "vertex.html"), + path.resolve(srcdir, "logo-light.png"), + path.resolve(srcdir, "logo-dark.png"), + ...templates, ], bundle: true, loader: { ".html": "copy", + ".png": "copy", }, }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 7d4aa2f16c..f694bf3951 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -172,10 +172,16 @@ task("plan") process.exit(0); } - const plan = await hre.ignition.plan(userRecipes[0]); + const [recipe] = userRecipes; - const renderer = new Renderer(plan, { + const plan = await hre.ignition.plan(recipe); + + const renderer = new Renderer(recipe.name, plan, { cachePath: hre.config.paths.cache, + network: { + name: hre.network.name, + id: hre.network.config.chainId ?? "unknown", + }, }); renderer.write(); diff --git a/packages/hardhat-plugin/src/plan/assets/logo-dark.png b/packages/hardhat-plugin/src/plan/assets/logo-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..7341be50316eb98117e471a1f2265b44423f9b1f GIT binary patch literal 22448 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 literal 0 HcmV?d00001 diff --git a/packages/hardhat-plugin/src/plan/assets/logo-light.png b/packages/hardhat-plugin/src/plan/assets/logo-light.png new file mode 100644 index 0000000000000000000000000000000000000000..5075115b12ea3d9f52bad603f2afd201f67c85bd GIT binary patch literal 22282 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 literal 0 HcmV?d00001 diff --git a/packages/hardhat-plugin/src/plan/assets/index.html b/packages/hardhat-plugin/src/plan/assets/templates/index.html similarity index 79% rename from packages/hardhat-plugin/src/plan/assets/index.html rename to packages/hardhat-plugin/src/plan/assets/templates/index.html index 287c04450f..d526d2bd5a 100644 --- a/packages/hardhat-plugin/src/plan/assets/index.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/index.html @@ -3,7 +3,7 @@ - $ + %title% %summary% %plan% - \ No newline at end of file + diff --git a/packages/hardhat-plugin/src/plan/assets/templates/plan.html b/packages/hardhat-plugin/src/plan/assets/templates/plan.html new file mode 100644 index 0000000000..fb4ebe46f3 --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/templates/plan.html @@ -0,0 +1,9 @@ +

+

Plan

+ + %mermaid% + +

Legend

+ + %legend% +
diff --git a/packages/hardhat-plugin/src/plan/assets/templates/summary.html b/packages/hardhat-plugin/src/plan/assets/templates/summary.html new file mode 100644 index 0000000000..4ff9d81d12 --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/templates/summary.html @@ -0,0 +1,8 @@ +
+

Summary

+

Deploying to %networkName% (%networkId%)

+ +

The successful completion of the plan will send %txTotal%:

+ + %summaryLists% +
diff --git a/packages/hardhat-plugin/src/plan/assets/templates/title.html b/packages/hardhat-plugin/src/plan/assets/templates/title.html new file mode 100644 index 0000000000..aa5ee4878a --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/templates/title.html @@ -0,0 +1,5 @@ +
+ +

Ignition

+

%recipeName%

+
diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 0a5f81a3ff..bf399e4e02 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -1,10 +1,10 @@ -import { IgnitionPlan } from "@nomicfoundation/ignition-core"; +import type { IgnitionPlan } from "@nomicfoundation/ignition-core"; import { exec } from "child_process"; import fs from "fs-extra"; import os from "os"; import path from "path"; -import { graphToMermaid, wrapInFlowchart, wrapInMermaidDiv } from "./utils"; +import * as utils from "./utils"; /** * file structure output: @@ -20,36 +20,68 @@ import { graphToMermaid, wrapInFlowchart, wrapInMermaidDiv } from "./utils"; interface RendererConfig { cachePath: string; + network: NetworkSettings; +} + +interface NetworkSettings { + name: string; + id: number | string; +} + +interface LoadedTemplates { + [name: string]: string; } -/** - * this is only temporary, until we get a proper build tool that will - * include the html template files in the build output dir - */ -const htmlTemplate = ` - - - - - - $ - - -`; + +const regex = /%(\w+)%/g; export class Renderer { - private _htmlTemplate: string = ""; - private _vertexTemplate: string = ""; + private _templates: LoadedTemplates = {}; - constructor(public plan: IgnitionPlan, public config: RendererConfig) { + constructor( + public recipeName: string, + public plan: IgnitionPlan, + public config: RendererConfig + ) { // ensure `plan` file structure once on construction // so we don't have to before every write function later this._ensureDirectoryStructure(); } public write(): void { - const mainOutput = this.getIndexOutput(); + this._loadHTMLAssets(); + + // title bar + const title = this._templates.title.replace( + regex, + utils.replacer({ recipeName: this.recipeName }) + ); + + // summary + const networkName = this.config.network.name; + const networkId = this.config.network.id as string; + const txTotal = utils.getTxTotal(this.plan.recipeGraph); + const summaryLists = utils.getSummaryLists(this.plan.recipeGraph); + const summary = this._templates.summary.replace( + regex, + utils.replacer({ networkName, networkId, txTotal, summaryLists }) + ); + + // plan + const mermaid = utils.wrapInMermaidDiv( + utils.graphToMermaid(this.plan.recipeGraph, this.recipePath) + ); + const legend = utils.getLegend(this.plan.recipeGraph); + const plan = this._templates.plan.replace( + regex, + utils.replacer({ mermaid, legend }) + ); + + // index.html + const mainOutput = this._templates.index.replace( + regex, + utils.replacer({ title, summary, plan }) + ); + this._writeMainHTML(mainOutput); // the stringify in these loops is just a first draft version @@ -58,9 +90,9 @@ export class Renderer { this._writeRecipeHTML(vertex.id, JSON.stringify(vertex, null, 2)); } - for (const vertex of this.plan.executionGraph.vertexes.values()) { - this._writeExecutionHTML(vertex.id, JSON.stringify(vertex, null, 2)); - } + // for (const vertex of this.plan.executionGraph.vertexes.values()) { + // this._writeExecutionHTML(vertex.id, JSON.stringify(vertex, null, 2)); + // } } /** @@ -84,49 +116,6 @@ export class Renderer { exec(`${command} ${path.resolve(this.planPath, "index.html")}`); } - public getIndexOutput(): string { - const recipeBody = graphToMermaid(this.plan.recipeGraph, this.recipePath); - const executionBody = graphToMermaid( - this.plan.executionGraph, - this.executionPath - ); - - const recipeFlowchart = wrapInMermaidDiv( - wrapInFlowchart("RecipeGraph", recipeBody) - ); - const executionFlowchart = wrapInMermaidDiv( - wrapInFlowchart("ExecutionGraph", executionBody) - ); - - return this.htmlTemplate.replace( - "$", - `${recipeFlowchart}\n${executionFlowchart}` - ); - } - - public get htmlTemplate(): string { - // simple cache to avoid redundant fs reads - // if (this._htmlTemplate === "") { - // this._htmlTemplate = fs.readFileSync( - // path.resolve(this._templatesPath, "index.html"), - // "utf8" - // ); - // } - this._htmlTemplate = htmlTemplate; // temp hack - see comment at top of file - return this._htmlTemplate; - } - - public get vertexTemplate(): string { - // simple cache to avoid redundant fs reads - // if (this._vertexTemplate === "") { - // this._vertexTemplate = fs.readFileSync( - // path.resolve(this._templatesPath, "vertex.html"), - // "utf8" - // ); - // } - return this._vertexTemplate; - } - public get planPath(): string { return path.resolve(this.config.cachePath, "plan"); } @@ -139,8 +128,12 @@ export class Renderer { return path.resolve(this.planPath, "execution"); } + private get _assetsPath(): string { + return path.resolve(__dirname, "assets"); + } + private get _templatesPath(): string { - return path.resolve(__dirname, "templates"); + return path.resolve(this._assetsPath, "templates"); } private _writeExecutionHTML(id: number, text: string): void { @@ -155,8 +148,32 @@ export class Renderer { fs.writeFileSync(`${this.planPath}/index.html`, text, "utf8"); } + private _loadHTMLAssets(): void { + const templateFiles = fs.readdirSync(this._templatesPath); + + for (const file of templateFiles) { + this._templates[file.split(".")[0]] = fs.readFileSync( + `${this._templatesPath}/${file}`, + "utf8" + ); + } + } + + private _copyUserAssets(): void { + const filenames = fs.readdirSync(this._assetsPath); + for (const file of filenames) { + if (file !== "templates") { + fs.copyFileSync( + `${this._assetsPath}/${file}`, + `${this.planPath}/${file}` + ); + } + } + } + private _ensureDirectoryStructure(): void { fs.ensureDirSync(this.recipePath); fs.ensureDirSync(this.executionPath); + this._copyUserAssets(); } } diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index a71a4b5d2c..78b87ee96c 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,7 +1,60 @@ -import type { VertexGraph } from "@nomicfoundation/ignition-core"; +import type { + VertexGraph, + VertexDescriptor, +} from "@nomicfoundation/ignition-core"; + +function getVertexes(graph: VertexGraph): Array { + return [...graph.vertexes.values()]; +} + +function plural(s: string, n: number): string { + return `${s}${n === 1 ? "" : "s"}`; +} + +function li(s: string): string { + return `
  • ${s}
  • `; +} + +export function getTxTotal(graph: VertexGraph): string { + const vertexes = getVertexes(graph); + + const length = vertexes.length; + + return `${length} ${plural("transaction", length)}`; +} + +export function getSummaryLists(graph: VertexGraph): string { + const vertexes = getVertexes(graph); + + const deploys = []; + const calls = []; + for (const vertex of vertexes) { + if (vertex.type === "HardhatContract") { + deploys.push(li(vertex.label)); + } else if (vertex.type === "Call") { + calls.push(li(vertex.label)); + } + } + + return ` +
    + ${deploys.length} contract ${plural("deploy", deploys.length)} +
      + ${deploys.join("\n")} +
    +
    + +
    + ${calls.length} contract ${plural("call", calls.length)} +
      + ${calls.join("\n")} +
    +
    +`; +} export function graphToMermaid(graph: VertexGraph, path: string): string { - const vertexes = [...graph.vertexes.values()]; + const vertexes = getVertexes(graph); const nodeDefinitions = vertexes.map((v) => `${v.id}[${v.label}]`).join("\n"); @@ -14,27 +67,40 @@ export function graphToMermaid(graph: VertexGraph, path: string): string { .map((v) => `click ${v.id} "${path}/${v.id}.json" _self`) .join("\n"); - return `${nodeDefinitions}\n${connectionDefinitions}\n${linkDefinitions}`; + return ` +flowchart +${nodeDefinitions} +${connectionDefinitions} +${linkDefinitions} +`; } -const div = ` +export function wrapInMermaidDiv(text: string): string { + return `
    - $ + ${text}
    `; - -export function wrapInMermaidDiv(text: string): string { - return div.replace("$", text); } -const flowchart = ` -flowchart -subgraph $1 -direction TB -$2 -end +export function getLegend(graph: VertexGraph): string { + const vertexes = getVertexes(graph); + + const items = vertexes.map( + (v) => ` +
  • + Contract ${v.type === "HardhatContract" ? "Deploy" : v.type} ${v.label} +
  • +` + ); + + return ` +
      + ${items.join("\n")} +
    `; +} -export function wrapInFlowchart(name: string, text: string): string { - return flowchart.replace("$1", name).replace("$2", text); +export function replacer(obj: { [k: string]: string }) { + return (_: string, key: string) => obj[key]; } From 0500ad7c759db0c33fba26e436e3f2bddda5b81c Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 3 Oct 2022 03:52:52 -0400 Subject: [PATCH 0111/1302] ...but ESLint said that was ugly too --- packages/hardhat-plugin/src/plan/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 78b87ee96c..12a13e726f 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -3,7 +3,7 @@ import type { VertexDescriptor, } from "@nomicfoundation/ignition-core"; -function getVertexes(graph: VertexGraph): Array { +function getVertexes(graph: VertexGraph): VertexDescriptor[] { return [...graph.vertexes.values()]; } From fe4f8f64a59a755f518d5b061d0de52d8b151018 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 4 Oct 2022 01:44:09 -0400 Subject: [PATCH 0112/1302] added purecss for minimal styling and set up a basic scaffold matching the mockup --- examples/simple/ignition/MyRecipe.js | 2 +- packages/hardhat-plugin/esbuild.js | 20 +-- packages/hardhat-plugin/package.json | 1 + .../hardhat-plugin/src/plan/assets/main.css | 36 ++++- .../src/plan/assets/templates/index.html | 7 +- .../src/plan/assets/templates/plan.html | 17 +- .../src/plan/assets/templates/summary.html | 20 ++- .../src/plan/assets/templates/title.html | 14 +- .../src/plan/assets/vertex.html | 5 - packages/hardhat-plugin/src/plan/utils.ts | 7 +- yarn.lock | 145 ++++++++++-------- 11 files changed, 173 insertions(+), 101 deletions(-) delete mode 100644 packages/hardhat-plugin/src/plan/assets/vertex.html diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index 20f99da082..58b70ec258 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -7,7 +7,7 @@ module.exports = buildRecipe("MyRecipe", (m) => { const qux = m.contract("Qux", { args: [foo, 1] }); - // m.call(foo, "inc", { args: [0], after: [bar] }); + m.call(foo, "inc", { args: [0], after: [bar] }); return { foo, bar, qux }; }); diff --git a/packages/hardhat-plugin/esbuild.js b/packages/hardhat-plugin/esbuild.js index f71bdbf9da..233c8a66e3 100644 --- a/packages/hardhat-plugin/esbuild.js +++ b/packages/hardhat-plugin/esbuild.js @@ -5,19 +5,19 @@ const path = require("path"); const outdir = path.resolve(__dirname, "dist/plan/assets"); const srcdir = path.resolve(__dirname, "src/plan/assets"); -const templates = fs - .readdirSync(`${srcdir}/templates`) - .map((f) => `${srcdir}/templates/${f}`); +const entryPoints = fs.readdirSync(srcdir).flatMap((f) => { + const p = `${srcdir}/${f}`; + + if (/\./.test(f)) { + return p; + } + + return fs.readdirSync(p).map((v) => `${p}/${v}`); +}); esbuild.build({ outdir, - entryPoints: [ - path.resolve(srcdir, "bundle.ts"), - path.resolve(srcdir, "main.css"), - path.resolve(srcdir, "logo-light.png"), - path.resolve(srcdir, "logo-dark.png"), - ...templates, - ], + entryPoints, bundle: true, loader: { ".html": "copy", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f35f04a86b..4c514fb619 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -42,6 +42,7 @@ "mocha": "^9.1.1", "nyc": "15.1.0", "prettier": "2.4.1", + "purecss": "^2.1.0", "rimraf": "3.0.2", "sinon": "^14.0.0", "ts-node": "10.8.1", diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index b492f9db12..fbc92653ec 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -1,5 +1,33 @@ -.test { - width: 100px; - height: 100px; - border: 1px solid red; +@import url("../../../../../node_modules/purecss/build/pure-min.css"); + +.title-bar, +.summary, +.plan { + margin: 1rem; +} + +.summary, +.plan { + border: 1px solid black; + padding: 1rem; +} + +.mermaid { + text-align: center; +} + +.network-info { + text-align: right; +} + +ul.legend { + list-style-type: none; + margin: 0; + padding: 0; +} + +ul.legend > li { + padding: 1rem 0.5rem; + margin: 0.5rem auto; + border: 1px solid black; } diff --git a/packages/hardhat-plugin/src/plan/assets/templates/index.html b/packages/hardhat-plugin/src/plan/assets/templates/index.html index d526d2bd5a..afc8dfae03 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/index.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/index.html @@ -1,9 +1,12 @@ + - - %title% %summary% %plan% + +
    %title%
    +
    %summary%
    +
    %plan%
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/plan.html b/packages/hardhat-plugin/src/plan/assets/templates/plan.html index fb4ebe46f3..77993dea69 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/plan.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/plan.html @@ -1,9 +1,16 @@ -
    -

    Plan

    +
    +
    +

    Plan

    +
    - %mermaid% +
    +
    %mermaid%
    +
    -

    Legend

    +
    +

    Legend

    - %legend% + %legend% +
    +
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/summary.html b/packages/hardhat-plugin/src/plan/assets/templates/summary.html index 4ff9d81d12..80c2628456 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/summary.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/summary.html @@ -1,8 +1,18 @@ -
    -

    Summary

    -

    Deploying to %networkName% (%networkId%)

    +
    +
    +

    Summary

    +
    +
    +

    Deploying to %networkName% (%networkId%)

    +
    -

    The successful completion of the plan will send %txTotal%:

    +
    +

    The successful completion of the plan will send %txTotal%:

    +
    - %summaryLists% +
    +
    %summaryLists%
    +
    + +
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/title.html b/packages/hardhat-plugin/src/plan/assets/templates/title.html index aa5ee4878a..a26df8ca00 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/title.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/title.html @@ -1,5 +1,11 @@ -
    - -

    Ignition

    -

    %recipeName%

    +
    +
    + +
    +
    +

    Ignition

    +
    +
    +

    %recipeName%

    +
    diff --git a/packages/hardhat-plugin/src/plan/assets/vertex.html b/packages/hardhat-plugin/src/plan/assets/vertex.html deleted file mode 100644 index 0fc12c275c..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/vertex.html +++ /dev/null @@ -1,5 +0,0 @@ - - - $ - - \ No newline at end of file diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 12a13e726f..09c5ec9b15 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -37,14 +37,14 @@ export function getSummaryLists(graph: VertexGraph): string { } return ` -
    +
    ${deploys.length} contract ${plural("deploy", deploys.length)}
      ${deploys.join("\n")}
    -
    +
    ${calls.length} contract ${plural("call", calls.length)}
      ${calls.join("\n")} @@ -69,9 +69,12 @@ export function graphToMermaid(graph: VertexGraph, path: string): string { return ` flowchart +subgraph Graph +direction TB ${nodeDefinitions} ${connectionDefinitions} ${linkDefinitions} +end `; } diff --git a/yarn.lock b/yarn.lock index 2e6c2a1284..887e213e26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -739,7 +739,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -749,7 +749,7 @@ resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -763,12 +763,12 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz#aba35c48a38d3fd84b37e66c9c0423f9744f9774" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== + version "0.3.16" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz#a7982f16c18cae02be36274365433e5b49d7b23f" + integrity sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA== dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" "@leichtgewicht/ip-codec@^2.0.1": version "2.0.4" @@ -1449,9 +1449,9 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "18.8.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.0.tgz#b8ee8d83a99470c0661bd899417fcd77060682fe" - integrity sha512-u+h43R6U8xXDt2vzUaVP3VwjjLyOJk6uEciZS8OSyziUQGOwmk+l+4drxcsDboHXwyTaqS1INebghmWMRxq3LA== + version "18.8.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c" + integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w== "@types/node@12.20.25": version "12.20.25" @@ -1464,9 +1464,9 @@ integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== "@types/node@^16.11.1": - version "16.11.63" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.63.tgz#af57f6d2c3fb17a571230d527003dd734a9109b2" - integrity sha512-3OxnrEQLBz8EIIaHpg3CibmTAEGkDBcHY4fL5cnBwg2vd2yvHrUDGWxK+MlYPeXWWIoJJW79dGtU+oeBr6166Q== + version "16.11.64" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.64.tgz#9171f327298b619e2c52238b120c19056415d820" + integrity sha512-z5hPTlVFzNwtJ2LNozTpJcD1Cu44c4LNuzaq1mwxmiHWQh2ULdR6Vjwo1UGldzRpzL0yUEdZddnfqGW2G70z6Q== "@types/pbkdf2@^3.0.0": version "3.1.0" @@ -1624,9 +1624,9 @@ abort-controller@^3.0.0: event-target-shim "^5.0.0" abortcontroller-polyfill@^1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" - integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== + version "1.7.5" + resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" + integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: version "1.0.3" @@ -1949,16 +1949,16 @@ big.js@^6.0.3: integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== bigint-crypto-utils@^3.0.23: - version "3.1.6" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.6.tgz#3a52a660423416856342d0d9981935fa9856f177" - integrity sha512-k5ljSLHx94jQTW3+18KEfxLJR8/XFBHqhfhEGF48qT8p/jL6EdiG7oNOiiIRGMFh2wEP8kaCXZbVd+5dYkngUg== + version "3.1.7" + resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" + integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== dependencies: bigint-mod-arith "^3.1.0" bigint-mod-arith@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.1.tgz#127c504faf30d27ba010ac7b7d58708a68e3c20b" - integrity sha512-SzFqdncZKXq5uh3oLFZXmzaZEMDsA7ml9l53xKaVGO6/+y26xNwAaTQEg2R+D+d07YduLbKi0dni3YPsR51UDQ== + version "3.1.2" + resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" + integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== bignumber.js@^7.2.1: version "7.2.1" @@ -2000,10 +2000,10 @@ bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2 resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== -body-parser@1.20.0, body-parser@^1.16.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.0.tgz#3de69bd89011c11573d7bfee6a64f11b6bd27cc5" - integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== +body-parser@1.20.1, body-parser@^1.16.0: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: bytes "3.1.2" content-type "~1.0.4" @@ -2013,7 +2013,7 @@ body-parser@1.20.0, body-parser@^1.16.0: http-errors "2.0.0" iconv-lite "0.4.24" on-finished "2.4.1" - qs "6.10.3" + qs "6.11.0" raw-body "2.5.1" type-is "~1.6.18" unpipe "1.0.0" @@ -2183,6 +2183,13 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" +busboy@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + bytes@3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2276,9 +2283,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001400: - version "1.0.30001414" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz#5f1715e506e71860b4b07c50060ea6462217611e" - integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg== + version "1.0.30001418" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" + integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg== caseless@~0.12.0: version "0.12.0" @@ -3388,9 +3395,9 @@ deep-is@^0.1.3: integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== default-require-extensions@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.0.tgz#e03f93aac9b2b6443fc52e5e4a37b3ad9ad8df96" - integrity sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== dependencies: strip-bom "^4.0.0" @@ -3570,9 +3577,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.251: - version "1.4.270" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.270.tgz#2c6ea409b45cdb5c3e0cb2c08cf6c0ba7e0f2c26" - integrity sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg== + version "1.4.276" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz#17837b19dafcc43aba885c4689358b298c19b520" + integrity sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -3642,9 +3649,9 @@ error-ex@^1.2.0, error-ex@^1.3.1: is-arrayish "^0.2.1" es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: - version "1.20.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.3.tgz#90b143ff7aedc8b3d189bcfac7f1e3e3f81e9da1" - integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw== + version "1.20.4" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" + integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" @@ -3656,7 +3663,7 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 has-property-descriptors "^1.0.0" has-symbols "^1.0.3" internal-slot "^1.0.3" - is-callable "^1.2.6" + is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" @@ -4281,13 +4288,13 @@ execa@^1.0.0: strip-eof "^1.0.0" express@^4.14.0: - version "4.18.1" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" - integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.20.0" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" cookie "0.5.0" @@ -4306,7 +4313,7 @@ express@^4.14.0: parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.10.3" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" send "0.18.0" @@ -5280,7 +5287,7 @@ is-buffer@^2.0.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.6: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -6955,14 +6962,12 @@ pure-rand@^5.0.1: resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.3.tgz#a2f15dfbc3be8433d1d8ed67ee411aa83fb90406" integrity sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw== -qs@6.10.3: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== - dependencies: - side-channel "^1.0.4" +purecss@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/purecss/-/purecss-2.1.0.tgz#7d7eca2896e57a75cf7620ccf73aa42ded4ddc97" + integrity sha512-QIgWhat8QkHTXdejFJNwZuw0pZ7Mj0MHILHNz8sV6HZBfbWtHpW3b1+Q1D6W/9x4chFhaq9u4+Uk8YbwELzsXg== -qs@^6.7.0: +qs@6.11.0, qs@^6.7.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -7356,7 +7361,7 @@ secp256k1@^4.0.1: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.3.7, semver@^7.2.1, semver@^7.3.5: +semver@7.3.7: version "7.3.7" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== @@ -7368,6 +7373,13 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.2.1, semver@^7.3.5: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== + dependencies: + lru-cache "^6.0.0" + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -7528,9 +7540,9 @@ sinon@^12.0.1: supports-color "^7.2.0" sinon@^14.0.0: - version "14.0.0" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.0.tgz#203731c116d3a2d58dc4e3cbe1f443ba9382a031" - integrity sha512-ugA6BFmE+WrJdh0owRZHToLd32Uw3Lxq6E6LtNRU+xTVBefx632h03Q7apXWRsRdZAJ41LB8aUfn2+O4jsDNMw== + version "14.0.1" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.1.tgz#9f02e13ad86b695c0c554525e3bf7f8245b31a9c" + integrity sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ== dependencies: "@sinonjs/commons" "^1.8.3" "@sinonjs/fake-timers" "^9.1.2" @@ -7697,6 +7709,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -8202,9 +8219,11 @@ underscore@^1.8.3: integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== undici@^5.4.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.10.0.tgz#dd9391087a90ccfbd007568db458674232ebf014" - integrity sha512-c8HsD3IbwmjjbLvoZuRI26TZic+TSEe8FPMLLOkN1AfYRhdjnKBU6yL+IwcSCbdZiX4e5t0lfMDLDCqj4Sq70g== + version "5.11.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.11.0.tgz#1db25f285821828fc09d3804b9e2e934ae86fc13" + integrity sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw== + dependencies: + busboy "^1.6.0" universalify@^0.1.0: version "0.1.2" @@ -8222,9 +8241,9 @@ unpipe@1.0.0, unpipe@~1.0.0: integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== update-browserslist-db@^1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz#2924d3927367a38d5c555413a7ce138fc95fcb18" - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" From 87a193e7a19bf4877a5726d341e97a0356936255 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 7 Oct 2022 00:34:25 -0400 Subject: [PATCH 0113/1302] minor ui tweaks --- .../src/plan/assets/logo-dark.png | Bin 22448 -> 0 bytes .../src/plan/assets/logo-light.png | Bin 22282 -> 0 bytes .../hardhat-plugin/src/plan/assets/main.css | 4 ++-- .../src/plan/assets/templates/plan.html | 7 +++---- .../src/plan/assets/templates/summary.html | 2 +- .../src/plan/assets/templates/title.html | 10 ++-------- packages/hardhat-plugin/src/plan/index.ts | 10 +++++++--- packages/hardhat-plugin/src/plan/utils.ts | 12 ++++++++---- 8 files changed, 23 insertions(+), 22 deletions(-) delete mode 100644 packages/hardhat-plugin/src/plan/assets/logo-dark.png delete mode 100644 packages/hardhat-plugin/src/plan/assets/logo-light.png diff --git a/packages/hardhat-plugin/src/plan/assets/logo-dark.png b/packages/hardhat-plugin/src/plan/assets/logo-dark.png deleted file mode 100644 index 7341be50316eb98117e471a1f2265b44423f9b1f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22448 zcmeFZXH-<%wk}#A86-*0Sx|B;5RjZfKtLo(DsraCL2}L+iIRhegpw>dgJh5-AR;1J zvZOayYwvybdH1~b+PUrCe`h(xqUM}qj?qW&U;p~oXIqi#YV!B7D6k+9$bCfx8BOqS z?%iJuH1M-Kw9W?tAshGB(uHf9c+feyI9gcS!RX*#PB1!{r?mwH;<>Q==4BGq6L_w{zaG;iPX^wRn4D7fS8fX|gby>C2iTzDSo$+gdeOXr(- z?CbMhwDyg5ak4ER-y3INzx~CV)^QJ%iBBG1S6=#Y5p{1i`rR6>B&L1+<@kJY!)NnI zZ2IO;x>=+^%E)?+D+ACuS`BLj93MucP*DLtkvX`f>KhDCfmdHy4&m za_^w+%La+B)y#{6I}0_t=P>dO3QZ_~4IceF{FNFxC2w7gnWW=d%0~kAW`$9+l{G}& zmaLp?3D<42E&A)97oh@Vq;)SsZo7uBD<9qz&b9qA=3{Z(qh#+R)*8c+&YZfr6j|sgGiqGfD=(4bSLex|inq1&6nY4D|!Y&spDM5ueR4D)Ih6J>J7N5liD6Opl9I zuBWHV-X@x<2~QabG%Ovl)-ZWjHEKq4`%LRTA4N>->F>JLf6*MSs$bCCwm%+cOvv@w zLNt86BwKQI+UQJ|cMWFb8-Y%Z)QyNN?zplKSr(_hc0yp=j7s1}*O>xwvw!TZhI+Rc zhRDgW2M0WvQRO7jH%5e%*;rkN$f;yseD9#EbE#7$XAIuTz`meZx%$3WJ#xL<+N617 z{k3alF#Gwho7j=-k*p^tSq-lf5MngRJ?ZprZ@tImo8!lxQNF#evFGFQ)c?X`<+j?$ z>idt+;!H<-t&>e5huITm$fqu%^t+V4pS(u&1rb7~vRoJBPuRYAjCQ@~%jDtkpgg%Z zlziK$huKUA@@cN7e9HH#z zt2_&3L3TzP+&X(grPN~-;o|dU)o#k61$Ophx(jXs8opY4SvpI;g_8%5HLniCQeJG> zdW1Ily;nIs)+>4XSfG;rvrgFgRMd78dDYJg*WB{q*wNTHy)EzSoJAG;QN>ukPtUZ5 zgiXSEm7if7goPO9G<`N~+SFTAvTnfdmfY0XZSs`kjv;XMvfxRYkGbhcS*7?r?vRbz zI`$s-lVB#!veBcX%_0d8*;T8)));o0tfL($oe{&-rP@gl_jW>(Rk8Ejn(3p*n>lg~ z%L~Zj>bUE~gDc)1Pw^zC)rE7~O;VQB271+l0!9=Sq|3W$vNm3#L+`OVdsu`f2-_ld z1u@?)yHbCu_q)pd*sc3`8R@6iH-#wduJ5Ngk>?xH`7hPnf0xugh%kSwbM~8;e@>aY zfw#)tTpm|98q>H%@=kgIRQyNGyQQxQMkq|!~ zAgS2QeWcJjn<>m>X3i3-bW}3A94SNkQ9M!QaZE)e-;)^Jr>2oZEB1+lc1rDBULhzS zBq+EfU*!Dy>||_Ee@x9+&4Rm9N10qq^-RbTbH-`pnR;g#33u%RgXTRgRTRs;x3f~V z$FnXhPGv|P@qgHpk%y8iI2MbY#Rr!Xcu`eF=p6JalFqOTGy-jpLy@gp7-Wqx`6cpE z7B&(r3iPAvA9PtPPVrS$t!tavZwb{R$PV7*mh!KE{QB z88rLkGvs?Oh}3ATJy~n~Z6D`ALh1L1q{OMY+sR|Skw`8C_}d)I-j5=EwukXJAJ5xZ zN@>GA!kGO1XmP?60=%br?1bFyzm5{=sgi!ll9~*=3{JrNk_^!`ev_M-l1j@>JcE_N zajz1I1YgWGxOTLukA|` z1%Ha(CvR29W@Vxa8DEydAlOMJd!r?Zq)@hNfTo9}DmkCjC|cvaZ5WrY#K2vf8qO4Q zjOWQXLG*E*J!(cyem4Dsa@r%s3Ka66X#q|+c;<=YT2_uxSdZ9z42KwDJrpD#C$2vX z#gUHQwvm4kt66lj&BWYWKFR0Ng8w`$R!Uds3B#JGdvUDJ5lsg3rm#d_dYFp+KrcCR z6npErk5?E{6e+~UcF@`x7skI8KN_kLmVpFMdCpo+|4o@#QdEVCVZK_qnA*6m_3>d| zkD21IY~zayq&b3Dr+r_m@1YtE2C^lok~>44gcECUxS4sD#Cdy$B$222vXKebVLj5s z0~lOAxXcx(f@C=1K{#1aFpdaC6rS>W0pp?m*>ETP*GvXMdjsgy!MfXTPpPO57MUpg z;fH}2j?!YryXx}>LFR3(V-V{6!3mo~{ z(9d>K*ap8=KSe!|rYVIMTABVdDkXUM&AY3DiAS*`7>a2d$o`N;2`62apE^M>{Sg!m z-QZOM{Rb&l(T^VpkDoBOMZYvkH}`pjIml%q9m&%f_b2?Cjc^GI8C6UE3~GgEn&O=o zL^Y6-pKmTvKH&R6Gblhc##xbers#&;XQ-!$zYvShFvER@M?B`K1SCMEV&Ng3{p{ze z!Qof_5a;1GTr@h*dX_K}0i>KS-OvK_^8=tH*e492`ccStFNiVTzLS zh9ue|Dd>KnL|#hi|CGjH+=--9 zzPTupHK>u35D1l#v4&3P&0=7v<`8T(HowP2Zd8+o=l{mKx=(!1KNxGH&<@chYnvrP zkQ@I-1IqSWnPCF z!emo&!lyOKy2|l&)KfxaV$w0?&_9KezBzM0KF`x3d-8%**G!lEibmo$fsm7a( zcn9O5=k_EWBZI)z(*%VG=$nu^CgT_PVVDxxnoDVB)T7ExsvLI zD%B*0-(3v<$lml}1v=OXNWU_ZE59*yxwRT^9mjCerx*B%Ri93P?U39A|A||Zx;eFW zQiCp$g*)rmp*Nk56{%~|RO7c)*X#d%r3}Ss@M$)+(8hLtuf^mae$>4RKZ=s*Uxz3i zP(fL>@Db9NeDw<5^L}jIL=xTfM*WDx>{$&P=*NNrX{PZe{$;5v!n!f!E}Ld(8I)Od zQ@1B^<&u6DL#;vN+k9@A@Y?vubjT^}Q*GD)^D#0$d9VQ)KNSkUam5mMwzo?Jl06%jHC#S_+p6brNbzi)=7-KR27|H9xf8~3hL%;V-#G8Z2`(+9 zAv3ppf2ohf`r@JSPhW8hIpJlsn-BJr2{SXyX;wZAN~GmWrCM}E1*xlFHL>L%bah$5iV<50`h*Fw<>Bv^S1Q{e zDk~jiJYiub8KKKek0KwrakkoF()j1!^jb2QVdQj4>L*qvY#^qOb{lqI4zeC)U+>2Sj?`Cf`%rhgmAAZkZXEjTVJLkMyiE_|KUtAf%5uu zPFDIMls9SfL56q=&xD=YN)&p-$d+p}<=;{BeTbu{!^GT(DCwsDcI@&8A);zX_xgUW zF?|h{_QIl{H_^`2Z_d(sr6aQ}^#Gk`g&k#Q?@%3dsfV)yuj4phCOt*p#whB#?I%`2 z{uzP1-aL@ge}5q*+YN_re2N}k_*;
      Db0eL3^J`3v(k_>~UrHT^@^&TV2ZgOsN@%}-zguc*8l`$1p zdWrzsRo|andykbRQcZb|(AJW5+E#l@)mh+N+}7`{W~!gr+USWA7E!b1`D|z*>itQ> zP}t0hN)7UD{L^Mt7apJr>FHI{)88MV4C*vd#zgxUd#x>}`4z-No8CpIkc{o|QP&E; zO(7^S*OI||j62Vug5NbnSo_d}BUyg!TK`eX7@CXIimQUX>aWg0!V^KAkO>8EQw&J( z)7coZd)8mxAa5rpuSq6VR8cPB<#^#YP{YEr<9j)vt&hp9eJ>@HZRzDQ%5h}aGzm`T zVHJs@J!n6r^<15yH#9B^bDX*%i7*Ljm05;?4Fo|cbt))S)}P64LVil^4@e^4FslpFTd5v=Q8qFYoiHSR6Ha=dBthO4 znP^;8yu%raOm8tpd_MiT-#?NPHTfs>k;?lVad-l;oHqv*qr=wVhys+y*NKAulyX)& z7CG8+eU-!4y7L7CoU@Afv$&P{jIi>X~F?v~uwQu6- z-T=?4OwfSI2yT{F|0N0^Qg*sleZ?3K3-XRSDh+HojAYmOX^73G+{y|L$_l$$7LwSv z1lJ@2Qq$Nmm;6(W2Q=Pxgs#ejF(G(%n&!0uYG`B%g669$FPJvd^c4~{{*)Rtlc{5O zi=gDoPAL8U;(yEtC+Zl?(O2A*t!qcM(@oK6X<}G_H$ZGYo;B+4gjD!u=(hBKk!($P zds(L%iF9dIf`g5l>25zQm+pi?-6?pSjgN9)Ty1wEr_+g3t)-K<5ihB_F(2szqvQIT z2d?{Ts(@J+2Mg0aq)+-Y-hRBqV#F%6N-uWCSb|o`^#*=(M6Gba|3@Y?kd8C*QhyfBbdf)y*7UA?{ z{^Gd5Hx_1pK2B4v=u_{P38* z&V%8NRjJ*ge7|L>$*aZD;|rT8V`A-SO?hkH8mVWWA)@2g%ujH-H(At&VQM&}k7%9h zKK9c_z2T;5#K($Au;MBj&oEs4$zT=%Igl^Wafm)$BQd&^K2Lq!%n|+wsrfK2%V=@H zs$)&8>IXhW`Iay;m5ohCW^-Lyh_ny#{e4A`b$rxMt1NAjQ#6fmUKEa_$=@B*PNb@B zVOpazvyzxi&xDtP4AEL55B;CGMC>tP&sGa=*Y^-2Uc|oSXIG5Ti}=kDz}S{SAPS`4 znaFD~oWp8|Pfc8^q$>?1u1B+i@7!OFKOt2)De@cZg3J_n%VCs0z!in*F^7wo%A>xq z)!;pyqOp?J5ILn%682sq9Kyk5DAyyTb&L#)bkjyVwYEup5Z3J^H-}gkmq50Wj=m|h zj>JF{I3`mMrW=oP!G8ziU`oSuIn%Uy7->{xbYeFzNlGNNEKn|;^kg6ug{E}@y2;6) zb}qz9NU~69U07hs7OZ!l#>^&ozG(<^Lb)aVsaufX-s$50g`EVs_hZCo3H9G2g{{kP z3TN{CK`9&w2lSKjb_mohjRz8evdc+OhC< zm(}k(W229Qcf6#8!$NJj^!DfVm;igplgAH@v!U~4>gVIziI33nOv_dEFr-PkCmsYL zKaAmihmm59Cy&jEVeLyh9ikN8%{_8V-_-4kkL)3VQ!vfQ6Fc^WIR$D&6CP*K!Q7$T znXekxVRM$3Qg%s6*{45Nragtm<>ei}uP)=VJ`HiF=Iu1I-MU{D9he$SU+);2m+_9i zs;%wgyCNKnce&>Q&X4K6l$rc5_Kc13ksgO$O2|XLp9BYCi?0(At7m<|uWE9M8-oZ* zWbjqcmko?fSiC=4c>QI@F)7juc^Uhvmrk*iMkFw_QdzRF`GQ%w#bF)E=2L7%cJu+dbKsGdlh&1?Z20^l09SQ z*=?Z;|L{rg)$qM1)$+8zEG4sj%sDa%y(wJVOD(9vj8s(#RK%FkDEYp|@60|@ojO9t zz^sjDMpB_Ul3-1+II-H~bIHR+3sh8kOoHSZ{T#W;(x5a#>9#6g5Jz-lL*FC8@;a{M;-rfMXo)szZkh{KVE^$(*V;5qNZ=dWw+|ItDO^ROI>L_5vr#ae_J^-c z=nAXZU2}fWnd%moFKVL*iIiPPN;;)#i6F;OS)gLzCLKt zfBZyvjTyB-;xc;O7v~;zi$v8o=t_Uw^Cw7GV;!kq57H|-MjmdZhLMOP|M?ggy&YDv zgOvWHqa&F7QHP$@)fxp~J3fdpXz&(NLhCkwJv;jR#5ixVL=QJ^QG=*_`+B<<}6a*sr)YHkt%oYZx zGlf}NJBTstx3n|RS(}S7ybw_3R&|nwSy?N1yTG1%t7(~e+nNcRGdvZ?67>`T1K7jh zCUl}|yu2LX3JzB<2e^qR zhl4BQ-4K6|Ap>(YbFp@UTRS??-HmBt>gWa+V_*R1>HaxCdnZ-Ze+}>8`VT7rdvJN0 zIC1fCa&y_+bN%}ru5ej*Fvve9^k3fLss(y>T$(UfM>iKUn5;X@0nYgELztWW>wYIU z7rVcfV{XO;vxC`#OI^WJdH&NQ@4A2gy5m1R@$SrDll=GL^mRskx~ThlQz-5C^}7DIbS0x2XvSuYiCF%uI;KgvSK-Z$l|MxWY{w%wTsz zfx$Vg!8p7^X58FR3qB60fEkQ~Ux;6b!$g>uheJ@1N03iIz=97Z!2NGSJae%IPHbZL z@3Xoa${Y*@;}#TxLWRvac%b~e9Q-C0Fb*iMsVRqmi6E~jKQEM*TY&ekq0G%h zO~CG3+nZRzxSSj;|2lEE3nJ>)o-jLI8Edd;SKx4B3_JqR|JT`<|Haw6%@UDRR}^F5 z<@|fbe|@8FX9BkX4-;chH8G=m_WZAr{yL)tp70!Qa<>&cf`a_K+YAn#2D_LLw9%Q zzfP-y&^0%Ko5+~JVPK}*yu2dZ!XmtaT0Gn${7?}d0S<0{5$=Dx-qGCJ!t4L<>bpRt z6aCv?6s%pr^S%E1>hI`%4s-tdx4(b2v;He=>FE9nKoJwOzn9=@;tn(aYo1`NzfYN2 znK)R&08;(K*Z=vw^?%_<76AQ)O?db?_)G+VADQtBaG01009SKYshCsqWBC#15DNL=1;H%)-RY4$dI{ z+{^_Aywl1NF8bHw?5zL&;r|>&lSAGeoD$z`p=DWX0ikeIZ;7fG4qN*(V4@?SN zZh}DK)=%IoLb$9h{2$B*@*hOzlAsd2PDuw*l#$f(T-fzf^q|^u-W{!Y=QZ+X6B7j^ z$lMjKpH^(>vuS_%P+_>ij^o;W@>xQ|zSY$AgQC=Un7*KXX)ldLkOWfbo6U-mH>JMV z3F7FWIC(S)Jh5_j5L$K!Vz+SG;ft;IsEVb$Ptiyjk4lsR4w!nLuzklPFs8Q z%)71iCIr4(HG1WL>&Tcm@Q@}Ry@0jLieE}wyQ~5$xDx`=ydVP=+O%s_+%eZ}ADJQmksLo?t^$Co8wNsa`sui}jFpJ`OjX_RY? zJ2XsepN!iHYE;gQZ^3W2{Gd^8@n;nAr4^6*tp&60tCc<|oWQ840Q(RmS}?X5yto@S zYSC@Q-{mP<5<^;1VT#Z@B(ST|H5SZTJMkunl}l7Beaniquq$YTpa3iX(9nQhH-9A$ z%U zsd!$uIjN-$F;n^-w1#0iR{LBx|aN;k|49@)IiY5r2K zVNteaS*~zG0-<-^I&UXFEB5t?ai{TtA~%^YQG9=*0#kwt3jqeos(Z_tOVcV`1Q?$? zZwy%OZeMcLfJMM?ed|16-%F<0f}O?l@{p+^r=D7AZ*6^iC~5uA>49VTiqirQNw)+S z>Q#~4Ew#Npe#YjcY~Jpd{H|NAE_;bm5{hCHc))z+yqzGF3is~FQEOawAj3fej#R&B z51dDZz2dICWMO zZS4t%h8hFTHTM?aIs~}kYj6=@dFTDFVu+Rf!exg-tw(Ql*|9_p-k0^RI|~p-(&eZz zCJ)kq4@6jPM>?GLi>B?mlQU2}mYNf%NO~4A}sp!VG~PB^z}osR3+5#@Nh_gX-!$b zXS#h7li&A4&zqk|7j%k*RJiCMTIzE@uQ_#qkj6(D*>qJYeID~ni7NU5~N`nX@Q8*DWyb;vB z7SO*g$x0-}kl3-i*Z_PzQK=Y&vNIeW(%mf$Tvw}7dwD&lVZ%jOfDES#n0ou9YxBt2 zx_iULxmA{f1KFs3MZS7Yx^z*tbooaYH?cQ@8vU0@_G0kU$jh?N4SH2%KS`oPhq(l^ zVz)yxRnTg5WBAN}73}Qqudl8`iZwA``JJTZ-`l5RC&F^uTWRN7{^UnFXihj`MFip% z1h`Kz*oY06OfjlnOAx!@=mtO65;}`VWyWs2_h~&w>?Uf}6##a|(Cwf!}N=ix_I{a0krR=zVzb^RWA<`rRcS@9Hu3;ufCkG_8}OEeonQp1qW~of(!UOxP>

      G;4mo+7HY3aZS%(H;ImV8}(w03rt_Z-W%l={B&Zf!WlS_ZKr?#ZWdf$Cf-*fzVI}(tgfSaJBqqCAk|AdSDbZ_xZ z!9}~bSF9O-EaFw4hb4t<45HeYJAi$-Y{te)FpD*PxY2bJcW z{0^ed=70PsX+|JI?F5JGnUsirUx+Fd6PmvaD_~vvSdg*n$Fqwq=lqCSDXPG!&$ezp zVbB~n9{q5w-lNp_DsB5pNL(b*2X= zY2M5pxQJ}&)P*jQEJCN!Flw`fKYsJ*!ar51ICp1fXLbK(Z{N6KQR7kS!OlG2&hGA8 z&2ot}m`drCtG!{{wmdiUtEhqw(;9$nodBvp?$Op}jWVT-?hrmKbq zay2{@6iuSoQ^?dzG1BeFjo#4x}eUO3+=C&oZXM&BY&kExVs^_vmuAn8y35%D}xXKu) z?^$5EF|C~W^L3xiD5&(gSq<6b7C%EG#-mg$tkABSOR?Gv#38}ac`l<4G$(4Sau)< z2cTwv$(eN&5T0(<}2n+RU z|MrFp5SN;!CQM*0y{fQzyOP}c`3x21cEAM>JVl+F48VaSTHrx&1ejC)j19ozZ$ngw zyHw7Z-hGEw0J%Zh@)eJFX^K%R?Y@>@_NU7C|M>!d9-s?XV!x~)674Jf06f@9f&p?D zYa&_q0$)PQnXwV;{lT)DxLN2AB@iTuMg<%(-rGpzKu}O{dURAZfn{)Sk26=?FN&1Q z2uyi->KbLdO+>;RdU3t=mI1K6y7`fNs&EZFA(H4$i@MIuqqV%-i#)(0Uh+sjQ8wi! zJI`RQ-g1I^#u$s|6;5sCgEVEp`F!~#?>))^2pSqO?+`2gq0HH6QZ9AQ^ot0;6|paP zUOdRey@v2e2Cuqw8r929i@MCx?TELkkpX~wf#rgP2yzct5TH1vQvFhA=OP?Tm1{ zA~fiGAxcJ_3CCI3bw4%c3j7{4yz%|z{qSxi$UA?Dx;CP8%%Bd}?x`)1U}Cp!!FJEs zqz-daU<%UgPglS=NU)E+#XwZDM*ZG?tkHjTdEI_;d7Z~Zh*_k`mNE>xI;no$+u4cK z(E0U*Y{#vA4mmcgZSZ;KXo^@A4oUK0PbMSM@cNt>Aq%xgKD&L`6UyeB4s?tB=Tzz<2>u>7?xc;2%)W{D#hbt!aU})iCH`sGNl*$p9Lo<;5@xQez4GpdP1t_uqE*UK-aXi_&E42xuO~Y za3zfIuK{U-tNn`bS*~a&K!uX2EyRHFtIej*-WuLbPZ)Ns3${ z0pMn(YeAiK@l4Ij4r%;#^LA9;;=iWRA>_$eechz4q}Tu9E%Yh#*`yVnkgpPiPt zP{=UE$}p%Cp#rW3vRIB9Iyhs168!nTXQs-J3E;qMM;D%~;XO{AzanPPE~=|v=ivTE z813!wD3CM3Qi#&6#Zo@%D%X%ArRa8kx3^LV|HfI7XFW{Hgd>9_?j>B+FY=_~f<;cN z!l*htIQSkYs=#`e0DB6RLISy|UA#lNSo3^-%pVN^l2UPyTw$O?L-d3de9vg7B~Gcz z;ERVBha^5-6a!$+2Ap$j)v|gl@DQ*>agi-cjUNiD`H)u{L?oyMNIMpFgSD35+rZ9H zZr8MyPn<)Lo+UAX3e*(4GofR+V4J0$Vqs2IuCX572 z?J`aZxE>`A8bICf;SDKKns6q?h+b3AgVjJl6J{y4bFdHW1Q(Hz_P3@=&jAEG5@Cf3 zJ<7}Gd`Dq)Xp9z2AXm7CfZ-sMQm2dO?Wdgm22kwXR;ok-IO#o~s3uSnSq6X40p&2L zwcd=fl)D$`R03lA+<0yNId}p0MZ8P1Hj>d z52Y%FJ|RMBbrhR!a88?b)wq(ay>V~JS%36M8{aGl>%CT7{(8zMQl!8*ar-6N4qJrY zJEc3eWP_j^{{1+xg+#qNxx4YR4EncSjqo5-x4QY(Q(ecZjysT3E!J!VBnKqLp$*>n zd4jP#QM|w&8-z=wq|cH@l`^)L{cuEU?x|Igjc=2|k6IKjmN#N_W3r2$1Kn-!MJ3r| z&#KZz^Tu96vdc7+nCK~DE4C>xUOhgb!tH;!1*h=X|0-KIFH^47WzHKowe`I)QRxBE zm*lg_Q;I>eiLRtW&k=bt=KBS#E;w?ItTQdFdj)-NptPu-GwZNU6&*7=c0*pgRG86Y zC&3XN`tmFwe8#5uy%}-P`E#*1^L95f%1!j~u!coY3Vi*eXAB z^y+zTn+a+*K-Ezs>E=Xo?oB zM~h~BOq2Wl?znG4)~Ir2UpfsYj#a*QVo2&$eKsH5#&$pvi?-w-^a4q|pqQtLHxs4FQ*x=N zq~od$l}m+4;y21Exl-Ap(hO23kb=ksiDqY`{%Zsi0jrq-JINJ(mCj?pbZ&m9x3A*8 zKEFq5JoqH%#QghmJ>I1sH%P?GDaPCbL!}Epp0*XGM80A=7|_6<$<2;pjlu};cFdXQ zJ?L9MtoCX9x)12#|57ZRwe^dgmB4v;)6AD-v5*0vspSv)u$4d0R$GHraXGOaQ zW1>u1p4y87iPD@GQ!xqZuU4$NbW0uIFB;{kai)YDG@A>2bZ=-Jn=flr+&k-}1gBN4 z^vJPt=GU{Stz*Ex__I_a3I=M(VTpRoL&Lz)^$2`yh12HxCeN z^-uaa|J(qG1|9<{%)RB7a2W<9#ia9Y0g6}vhWN6HLc*Gw?ivq+PR$GU2sBE8`~u`Y zwBSzKLy~X1rL_x2)#>{u-XQF}7>0i{YHI_T?zNLg1&EmtQ>2P^L)0{$-go>9^7H4O zqM$y@)_B#!BZqnn&>S!YKpAw|(SUzx+I6qt>r|!&0&NkLYMEscs0YzVUxyo$^xnXa z0ZQ*lRkg*PJ>TNe`^LzY_zG3*34_I?0}jv-lLtd|DnkLOHLCV7;oxaljMZfi%Mx-l zwX_Uxko~B~0g^Sa32PK``fw;AgRBC%k6p5(6K{1vE%Qs~sz6&1X}f4W3S zSJn@W2I19RDC9F_pb`MQyUFcExfXQRhM%HzRw+lmsb|fJE_u)x$R&|7$PNvZps)qh zzSorC!j~pi?jBePVEneZLXKa}^(H}C^i~~;5cn-B2A%|J^KbJ;dQ4W_WEpv$TOEa( zSc5mOh*yQFaDk#%G-Yk)=-9n}*x}I7y?MmbX^hZ&>sLFsBO0)Ic9}T5@u8_HvZ{&$ zY(k0>^YpeGP*A|qfC9lu_S_Z^0yH)tP<;IOvC&aA^u&#?>DB9L&R1LP8Y3QpFI${e zQIP|m0SXHFAa@8$mo1~E!a++MGzYT<>X_u2HGsEBnMQX7X(1x5>h-UP+_+;?px%P) zg^Py=%0SPN=iAQZF>6jx0Q*3E1&ScRF;9!)dAovT2iN%x(Ih5q!#1fm`J~CFo64xU ztWmU6l=(R?JoR5(2^K$CK+PI7cLGH!5Hbg9V{8yZE$s@_$xJk5VzRq!4G7>9paul% zTWa-s5LI9d>R@?!c_I7!z@u&B^Q7$f6LT>ZGrp?5>c|KpE&IUDgd=0 z)Q7EGN5fe$kdq&}G*JPuC|-gNk~JCz91B!6tLNt#p;2nzZ(j-jP)OWr)D7vi2|bd@ zta~x+(PFjgB}xNi+oeY5dq5Wg z5(!zXTx(JBj13Uty7$ijHZhV!A2y#Gwa0HM#(?_q>p2aWYVABbV739Ef(2#gx87*d zFN=%aYisliyQlF{fzO6?KfJ6`U`__=J>Y=_te}kIw$*#0^x?Bjz(*y?9JcW8K%GiN z8sW75y=RM9g(}+&Vl-YNl`~Q5tRaA@oAXA3;Cq=i0VHj9lA8ARG1Qk>tEwyyy4JWs zj2BG&9OmrAG&xqKec!z%0i}}TCX=DVH!i^(b+Vf0U)d}N6?StDZZ^nYQ)@vrsygXaOI2tla0;vRT($R9wr4M@ zbiAr}Z4g~fQ1kaMxykNiOej&8O;gX$qV?Y;d>w5@ct9$B=fM!g;IQ&(^xhg#o`&z4 z;p(hA9_!0rC*Gj10TmVP0cr`bOVc~E{IR48;^QTS2xn^TXgA2d$I->rgCUm4UMceL zUS80ubG}_$<}h?>X;AlUj1$SO;a!+_Vt}j(s(p~Sf!!ez8Y$1OI`RlrD(?i}F=m$4 zVk-@i965%>)!Ahm#5a?@ebet&O>uzey(kf+xNpP)1bXO=-kF9nA2*7qBz^{$=VZh6 zj%MJTL&NI_IA~8NKDvHp+#7dSjL1;vf5}8BNrxZMX$gs}J7y?19wX?TZFky9& zFgdT*KbrNIP!Qc41bF%Sx*32!Dr)Mti@U$aMB)q60_1l^^2YiD`$}-p(6WF&ib1&)lr#X}B$Akb0I&6k7?h=->8#KHxMea{ePK^k0gOcnb_ zQT-9;f6Vj)j*-<$p92hTB3ej(H=-fVG0P;CdNVed-E2CEYF3-}8-UH5&lS2(y zE~m)T*Ee@kAiIyV5fl2ZhH?j^cS=P?nbsrHCp$-ef!x%Aa4Nkj9hzT8mZ>>$ARi@w zKE$X+rWhbE>g8IV=nHt%(kYR1+iphUN#NyvCn$cb+)Ij`QdXXcu_+b;P<{i60^o4D z78W=_V|S=d-2l=3i?r?g#g+KO`LN2m638Xh|+!K7|=~=XD=cr#6W>c zzAZc}HUG0fPH5u{#Pc6qEXj&@Xa>aT6K`s;=B2bdu@CGl*k9VY3*X#VWk)5h)|MG; zzGS%JBRfsJ9r~QD*9Z{*r3X4WI%jj0YF{9k?CM;jyXZ`Ty{9~Y5SbzIR~mi z)0zR98IZRDPiSAktDYM!8Y?U;eEv(-az8NQEx*t&(8BSt2|N=__5PDN{lbu)1c+Ne zwhbHG>^?meyi;Xm7z+-wX^7QgGe>P_4gLFCJ#MDOR<)!ZA+dfC5>8ud zfLmA0Jc^5t2d%qI?&iP9@rPID8t`(hW^PlCP#&OypY5;6i{yyU zJSk~&9kn>RHNuQX4`@NDsHk;P17g_lhMui8458<&Z_7>QMEMSAfIdE1X6@e#Y=d3{@{}T0H`^QZRMKE5!II#R!1ttm zKesLk+I4mF-#?i#Bua?VSV~z{&Pdhh%2dvL)6Ux5g0Vhu6wCrSA$br*PD5rpq;PKk z>{TR}b&vYvxe{$!zbvdEV0&QEwO!E38H-ALj}zYg>J{6nTZymWZO)EZOMAfNPy>MN3{T~I%Guqqf^L#e)99BtZO(#?5K z6UJtHdxOq1Xl3u8No%Aa(zHMO2OQ^@h49kEKdaX<*OAVLtJL@HG%%}h70+%|83Pi=qJ|MR1BJbBMlgWZr3A_s*S3# z3s@_F@EJtM-Q8`~Q18D6UTPP(dl!Hogh;l{!<=wyv-UxA7pbJ3f~hS))#);QnZ2#JR@P`hkAuJBcSC!ERr1Y0xv{Cj0*7 z1L)7`vcIn~IxE>_(-dRgm%}nBn%FtlCuS=$|ZeQ69+-_(>2ecPtbt`@> zAf#`>qkv{}mlLM83=CHhi@Phwm)FlgiaY8ngDz~JfbQ#SdTEKCN13A*KjF<8Dt)DC zX8^?EErx(s-gT50ca0Qy4;S!OLrm5I=0*2{HgF~kWHQh`&Ae8gGAx{kxI`fIVy%xI z|4iaP2!k5{nHE$LpuG#)_@6F*P=dU(HiV1^0m=vH&lF6sf&-L!fV+y);5ov@_X|}j z_t-G7#aZh4+Cih{$GIWu54U?NM6yOliZrpNLZ(ZAGoew92I0>K%E>EUA0Hgx_nIbd z2Cp37?7BZm8e{@68vo+-(hqQ8{;W|%@SZ_{{C$sKK0vbs3=6PK!1CWK8W!PVoH+Nd z^MIL<+9N_Yk3P{-a7W1%DimuDY`A>+@&%Bau>N%uZBB|LiunE=XRB1CRNt~>iQc1z zjql(E0U+_+WiyL9=QLl?y##$E|eX|G6)vU37L}@_m?4df=!u z@qAnSd1LFK0|-iP()Xwb7`|0H${eXm20jd-MWCz-4i3hCl~<3OKwzC5r`odoIe3vj zRd$);ky>&;zKQ(HTnBnwr)80Hn|JA6bs-l{24(vYu8uE^Wc@I_$vpWf(fUmi^mlff!m~CDmrs z!hKRmi_IR~iIJ=*T70c?gpTqE1lzT-jXr@{y89@hYi8WIQgPQVw1V8Gn4Z(60quGb z&|YO<(B=P+P8A>+)yxNvQlkLnnKtJg?B)fqBA$nbM3v1`?fIgs5ItAPgv?=a@ z^YD-dXn{_kuL}glmb8v1!VaO{ZSP506bDQLdU~0YCvaWjz z-UX_}O`mx-j8LhA%j@j7lPJ^^oz^L}>a3tvAp?+o;(a}xSbk!aUY?|s)Cy*;udk0I z^6QL-iYi~T+}O~zkn_GL#4}*yYnzYCu8wx9Vusdb;SB1gHUG67&%<6=eV-Vh3;I!~ zYU3Tz?89JZaKQh>B_c`&6tfPN@t-R{n8$}a0>u-}Q-4s*;{sT=K}3Nr@?EQNYU}C` z!`{YHpogz7J9vRXfC$SuFsTnyNKjDi@M11?V{$xZwh-XY&AgUb;TsCW?=yhuG8_S` z0aA?6gC$ut8Gx>hFk)GwC4RkvMTIjRJ5VAZdJdFop;Cd0rQr3EysvWVmr6+BO`n+x z(7K%l&juj~Iw?ARfb_)51@pDK)lVr1C@lsRFiveA9R`W--tYtH+JX-;hE&ZCe*;?E z8ZplI8LKGO#n2|)VIu%i;#UXKOHHomM%ARijNlal;!ih!YyrD9Ao|IP;|b5!OjBS8 z#SOm)DihG%f&9_wX3~l*6=zjUosgAhqdxmy9ufA{p+Tcc=h=ITH=}5vE@68az1^rC zVN?r*oy7)6Mk1`X6v-#zETf;szUq*#4k1^AcTmuRC7BoSc2%%LrOtb~{E-?KuXUcQ z@N@jQdn<-;6{Jk%KR^mGio2?%o-rAl-9AxM)gox$e|Nm#rVk^=3jKgU^kU;)UW*&G zdUkfpklt?wG!_DY7`(?)34)Eh0jz1wi41h)E_`od1yT?;MGI9)dYF3O-hpoM&{s84 z{Rg}5+tc5gx8WiF=@U`GDlEZx;^&Y=g%G|kT%XR7fyA-l^0G0;=Kyqur>4><4AVp@qEe)X=n|dTbpc`;SsL|(*%aXVuet@k#ZY3u``2{IL8UPU2&GP2@F)ym^RQmx?szY>=wH|~M zFt1F|2o0lEvr`RZ-91qbhVOaQl58fV72# zbl}dWA%#!*@@gxVpX%Wz@&@5lS)i1a6w0I+4mn)N=cD*l%r0c8n&8E2X{7lt8@d}96 zG3aef{65x`-Is?R()xhS0sREd+Z2Df*+=N82)Y6U0r){6M2g*#&$InYklTfx0qgpa zmb^JGfgy}0V)6r>+`&wAGy*TE|4WBQn|^o-U)D|GgFuX5%cIKOA3S_`TBgUbhk>BA zE~*3a?;7Hrfe?&-Z`9jZ67uz5*#nt|XDb)ITn6l*?*?Vq>wa?}7q{Qn3@)Swq%1lx zRJ4OwIRmzqH`%9xA$0^c3gq#4qA~cDP$Y0zPQX1nW+&!0^dUTpv&oWkfe$iKv>&O1 z4Qpy4CB+1h?a9f>#5==6e&rQKos}g){1!bHX-XJpaw(97j~%)-z29mn4N*)hA4JX&Yps(Y&y0?L`)c4zKp>8K&!duG_v|mpqD?E@16W zckx>k-I#|u2@#l|^zrVAjM80vWw z<*5i_iBW(svt7|@W`s~MKb+gyR|#Nwk;VkOuKR9KMFny}PBZ-UJP(m9InAa5S`6bH z1Z|FX+S^&6lp946$?<0?VhzFzT$R3(21da#eot}UOux_0{Up+CQU?0ov!@Z8B6fHY z(n@`AC{$RgM+P6sUn5J~arY&+Y6|<0?reUt=<`t@h^d+;bs5; diff --git a/packages/hardhat-plugin/src/plan/assets/logo-light.png b/packages/hardhat-plugin/src/plan/assets/logo-light.png deleted file mode 100644 index 5075115b12ea3d9f52bad603f2afd201f67c85bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22282 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 diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index fbc92653ec..08e9d0c409 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -20,13 +20,13 @@ text-align: right; } -ul.legend { +ul.actions { list-style-type: none; margin: 0; padding: 0; } -ul.legend > li { +ul.actions > li { padding: 1rem 0.5rem; margin: 0.5rem auto; border: 1px solid black; diff --git a/packages/hardhat-plugin/src/plan/assets/templates/plan.html b/packages/hardhat-plugin/src/plan/assets/templates/plan.html index 77993dea69..4d66a2c22d 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/plan.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/plan.html @@ -7,10 +7,9 @@

      Plan

      %mermaid%
      -
      -

      Legend

      +
      +

      Actions

      - %legend% + %actions%
      -
      diff --git a/packages/hardhat-plugin/src/plan/assets/templates/summary.html b/packages/hardhat-plugin/src/plan/assets/templates/summary.html index 80c2628456..45261feef2 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/summary.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/summary.html @@ -3,7 +3,7 @@

      Summary

    -

    Deploying to %networkName% (%networkId%)

    +

    Network: %networkName% (%networkId%)

    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/title.html b/packages/hardhat-plugin/src/plan/assets/templates/title.html index a26df8ca00..0338fb3137 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/title.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/title.html @@ -1,11 +1,5 @@
    -
    - -
    -
    -

    Ignition

    -
    -
    -

    %recipeName%

    +
    +

    Ignition - %recipeName%

    diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index bf399e4e02..14708a577c 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -68,12 +68,16 @@ export class Renderer { // plan const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid(this.plan.recipeGraph, this.recipePath) + utils.graphToMermaid( + this.plan.recipeGraph, + this.recipePath, + this.recipeName + ) ); - const legend = utils.getLegend(this.plan.recipeGraph); + const actions = utils.getActions(this.plan.recipeGraph); const plan = this._templates.plan.replace( regex, - utils.replacer({ mermaid, legend }) + utils.replacer({ mermaid, actions }) ); // index.html diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 09c5ec9b15..87ae5bbca9 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -53,7 +53,11 @@ export function getSummaryLists(graph: VertexGraph): string { `; } -export function graphToMermaid(graph: VertexGraph, path: string): string { +export function graphToMermaid( + graph: VertexGraph, + path: string, + name: string +): string { const vertexes = getVertexes(graph); const nodeDefinitions = vertexes.map((v) => `${v.id}[${v.label}]`).join("\n"); @@ -69,7 +73,7 @@ export function graphToMermaid(graph: VertexGraph, path: string): string { return ` flowchart -subgraph Graph +subgraph ${name} direction TB ${nodeDefinitions} ${connectionDefinitions} @@ -86,7 +90,7 @@ export function wrapInMermaidDiv(text: string): string { `; } -export function getLegend(graph: VertexGraph): string { +export function getActions(graph: VertexGraph): string { const vertexes = getVertexes(graph); const items = vertexes.map( @@ -98,7 +102,7 @@ export function getLegend(graph: VertexGraph): string { ); return ` -
      +
        ${items.join("\n")}
      `; From e143021870d81fbe65815c6623c16b129ba8da65 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Sun, 9 Oct 2022 19:06:10 -0400 Subject: [PATCH 0114/1302] some mermaid and actions changes --- .../hardhat-plugin/src/plan/assets/main.css | 1 + .../src/plan/assets/templates/plan.html | 4 +-- packages/hardhat-plugin/src/plan/index.ts | 6 +---- packages/hardhat-plugin/src/plan/utils.ts | 26 +++++++++---------- 4 files changed, 16 insertions(+), 21 deletions(-) diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index 08e9d0c409..1d77bf3eee 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -30,4 +30,5 @@ ul.actions > li { padding: 1rem 0.5rem; margin: 0.5rem auto; border: 1px solid black; + cursor: pointer; } diff --git a/packages/hardhat-plugin/src/plan/assets/templates/plan.html b/packages/hardhat-plugin/src/plan/assets/templates/plan.html index 4d66a2c22d..59d02950d4 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/plan.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/plan.html @@ -3,9 +3,7 @@

      Plan

    -
    -
    %mermaid%
    -
    +
    %mermaid%

    Actions

    diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 14708a577c..4951059c5d 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -68,11 +68,7 @@ export class Renderer { // plan const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid( - this.plan.recipeGraph, - this.recipePath, - this.recipeName - ) + utils.graphToMermaid(this.plan.recipeGraph, this.recipeName) ); const actions = utils.getActions(this.plan.recipeGraph); const plan = this._templates.plan.replace( diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 87ae5bbca9..16d3dc694c 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -53,14 +53,12 @@ export function getSummaryLists(graph: VertexGraph): string { `; } -export function graphToMermaid( - graph: VertexGraph, - path: string, - name: string -): string { +export function graphToMermaid(graph: VertexGraph, name: string): string { const vertexes = getVertexes(graph); - const nodeDefinitions = vertexes.map((v) => `${v.id}[${v.label}]`).join("\n"); + const nodeDefinitions = vertexes + .map((v) => `${v.id}["${v.label}"]`) + .join("\n"); const connectionDefinitions = graph .getEdges() @@ -68,7 +66,7 @@ export function graphToMermaid( .join("\n"); const linkDefinitions = vertexes - .map((v) => `click ${v.id} "${path}/${v.id}.json" _self`) + .map((v) => `click ${v.id} "recipe/${v.id}.json" _self`) .join("\n"); return ` @@ -93,13 +91,15 @@ export function wrapInMermaidDiv(text: string): string { export function getActions(graph: VertexGraph): string { const vertexes = getVertexes(graph); - const items = vertexes.map( - (v) => ` -
  • - Contract ${v.type === "HardhatContract" ? "Deploy" : v.type} ${v.label} + const items = vertexes.map((v) => { + const type = v.type === "HardhatContract" ? "Deploy" : v.type; + + return ` +
  • + Contract ${type} ${v.label}
  • -` - ); +`; + }); return `
      From 5f956767fc7c8745c358692974948e9cfd5a1972 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Sun, 9 Oct 2022 23:51:18 -0400 Subject: [PATCH 0115/1302] vertex page and hover highlighting --- packages/core/src/types/graph.ts | 1 + .../hardhat-plugin/src/plan/assets/bundle.ts | 33 ++++++++++++++ .../hardhat-plugin/src/plan/assets/main.css | 27 ++++++++++++ .../src/plan/assets/templates/vertex.html | 29 +++++++++++++ packages/hardhat-plugin/src/plan/index.ts | 29 ++++++++----- packages/hardhat-plugin/src/plan/utils.ts | 43 +++++++++++++++---- 6 files changed, 143 insertions(+), 19 deletions(-) create mode 100644 packages/hardhat-plugin/src/plan/assets/templates/vertex.html diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index a2376000a2..d7f2d78d01 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -2,6 +2,7 @@ export interface VertexDescriptor { id: number; label: string; type: string; + args?: Array; } export type AdjacencyList = Map>; diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts index 725c7197ee..bb8252bda4 100644 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -1,3 +1,36 @@ import mermaid from "mermaid"; +/* setup mermaid */ mermaid.initialize({ startOnLoad: true, securityLevel: "loose" }); + +/* setup event listeners */ +const nodes = document.getElementsByClassName("node"); + +window.onload = () => { + for (const vertexElement of nodes) { + const classList = [...vertexElement.classList.values()]; + + for (const className of classList) { + if (/^(deploy|call)/.test(className)) { + const actionElement = document.getElementById(`action-${className}`); + const vertexClassString = [...classList, "hovering"].join(" "); + + function addHover() { + vertexElement.setAttribute("class", vertexClassString); + actionElement!.setAttribute("class", "hovering"); + } + + function removeHover() { + vertexElement.setAttribute("class", classList.join(" ")); + actionElement!.removeAttribute("class"); + } + + vertexElement.addEventListener("mouseover", addHover); + actionElement!.addEventListener("mouseover", addHover); + + vertexElement.addEventListener("mouseleave", removeHover); + actionElement!.addEventListener("mouseleave", removeHover); + } + } + } +}; diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index 1d77bf3eee..122d905416 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -32,3 +32,30 @@ ul.actions > li { border: 1px solid black; cursor: pointer; } + +/* default deploy & call styles for nodes and actions */ +[id^="action-deploy"] { + background-color: green; +} + +[id^="action-call"] { + background-color: yellow; +} + +[class*="deploy-"] > rect { + fill: green !important; +} + +[class*="call-"] > polygon { + fill: yellow !important; +} + +/* style for nodes & actions when hovered */ +.hovering > rect, +.hovering > polygon { + fill: blue !important; +} + +li.hovering { + background-color: blue; +} diff --git a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html new file mode 100644 index 0000000000..91eb83c0af --- /dev/null +++ b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html @@ -0,0 +1,29 @@ + + + + + + +
      +
      +

      Contract %type% - %label%

      +
      +
      +
      +
      +
      +

      Summary

      +
      +
      +

      Network: %networkName% (%networkId%)

      +
      + +
      +

      Transaction data:

      +
      + +
      Params: %params%
      +
      +
      + + diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 4951059c5d..345af5e8e7 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -68,7 +68,7 @@ export class Renderer { // plan const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid(this.plan.recipeGraph, this.recipeName) + utils.graphToMermaid(this.plan.recipeGraph) ); const actions = utils.getActions(this.plan.recipeGraph); const plan = this._templates.plan.replace( @@ -84,15 +84,20 @@ export class Renderer { this._writeMainHTML(mainOutput); - // the stringify in these loops is just a first draft version - // they'll be full html pages with styles at some point for (const vertex of this.plan.recipeGraph.vertexes.values()) { - this._writeRecipeHTML(vertex.id, JSON.stringify(vertex, null, 2)); - } + const type = vertex.type === "HardhatContract" ? "Deploy" : "Call"; + const label = vertex.label; + + const params = utils.getParams(vertex); - // for (const vertex of this.plan.executionGraph.vertexes.values()) { - // this._writeExecutionHTML(vertex.id, JSON.stringify(vertex, null, 2)); - // } + const vertexOutput = this._templates.vertex.replace( + regex, + utils.replacer({ type, label, networkName, networkId, params }) + ); + + this._writeRecipeHTML(vertex.id, vertexOutput); + this._writeDebugJSON(vertex.id, JSON.stringify(vertex, null, 2)); + } } /** @@ -137,17 +142,21 @@ export class Renderer { } private _writeExecutionHTML(id: number, text: string): void { - fs.writeFileSync(`${this.executionPath}/${id}.json`, text, "utf8"); + fs.writeFileSync(`${this.executionPath}/${id}.html`, text, "utf8"); } private _writeRecipeHTML(id: number, text: string): void { - fs.writeFileSync(`${this.recipePath}/${id}.json`, text, "utf8"); + fs.writeFileSync(`${this.recipePath}/${id}.html`, text, "utf8"); } private _writeMainHTML(text: string): void { fs.writeFileSync(`${this.planPath}/index.html`, text, "utf8"); } + private _writeDebugJSON(id: number, text: string): void { + fs.writeFileSync(`${this.recipePath}/${id}.json`, text, "utf8"); + } + private _loadHTMLAssets(): void { const templateFiles = fs.readdirSync(this._templatesPath); diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 16d3dc694c..06d6da1d07 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -53,12 +53,17 @@ export function getSummaryLists(graph: VertexGraph): string { `; } -export function graphToMermaid(graph: VertexGraph, name: string): string { +function wrapNode(v: VertexDescriptor): string { + const text = `"${v.label}"`; + return v.type === "HardhatContract" + ? `${v.id}[${text}]:::deploy-${v.id}` + : `${v.id}{{${text}}}:::call-${v.id}`; +} + +export function graphToMermaid(graph: VertexGraph): string { const vertexes = getVertexes(graph); - const nodeDefinitions = vertexes - .map((v) => `${v.id}["${v.label}"]`) - .join("\n"); + const nodeDefinitions = vertexes.map(wrapNode).join("\n"); const connectionDefinitions = graph .getEdges() @@ -66,17 +71,14 @@ export function graphToMermaid(graph: VertexGraph, name: string): string { .join("\n"); const linkDefinitions = vertexes - .map((v) => `click ${v.id} "recipe/${v.id}.json" _self`) + .map((v) => `click ${v.id} "recipe/${v.id}.html" _self`) .join("\n"); return ` flowchart -subgraph ${name} -direction TB ${nodeDefinitions} ${connectionDefinitions} ${linkDefinitions} -end `; } @@ -95,7 +97,10 @@ export function getActions(graph: VertexGraph): string { const type = v.type === "HardhatContract" ? "Deploy" : v.type; return ` -
    • +
    • Contract ${type} ${v.label}
    • `; @@ -108,6 +113,26 @@ export function getActions(graph: VertexGraph): string { `; } +export function getParams(vertex: VertexDescriptor): string { + if (!vertex?.args || vertex.args.length === 0) { + return "None"; + } + + const items = vertex.args + .map((a: any) => { + return `
    • ${ + a.defaultValue ?? a._future ? `Future < ${a.label} > address` : a + }
    • `; + }) + .join("\n"); + + return ` +
        + ${items} +
      +`; +} + export function replacer(obj: { [k: string]: string }) { return (_: string, key: string) => obj[key]; } From ab5ae180bb492410b6bb7d76950d477ad62c2e43 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 13 Oct 2022 19:26:49 +0100 Subject: [PATCH 0116/1302] fix lint error --- packages/core/src/types/graph.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index d7f2d78d01..fcffc34a29 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -2,7 +2,7 @@ export interface VertexDescriptor { id: number; label: string; type: string; - args?: Array; + args?: any[]; } export type AdjacencyList = Map>; From d632a7390b926b24f6f60adc3f31daf4ea051f20 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 18 Oct 2022 01:54:43 -0400 Subject: [PATCH 0117/1302] fix plan tests --- packages/hardhat-plugin/src/index.ts | 3 +- .../hardhat-plugin/src/plan/assets/bundle.ts | 6 +- packages/hardhat-plugin/src/plan/index.ts | 3 +- .../minimal/ignition/MyRecipe.js | 14 ++++ packages/hardhat-plugin/test/plan/index.ts | 35 +++------- .../hardhat-plugin/test/plan/plan-utils.ts | 66 ------------------- packages/hardhat-plugin/test/plan/renderer.ts | 49 -------------- 7 files changed, 30 insertions(+), 146 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js delete mode 100644 packages/hardhat-plugin/test/plan/plan-utils.ts delete mode 100644 packages/hardhat-plugin/test/plan/renderer.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index f694bf3951..17e1f3876e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -188,8 +188,7 @@ task("plan") if (!quiet) { console.log(`Plan written to ${renderer.planPath}/index.html`); + renderer.open(); } - - renderer.open(); } ); diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts index bb8252bda4..e691b7ff77 100644 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -3,10 +3,10 @@ import mermaid from "mermaid"; /* setup mermaid */ mermaid.initialize({ startOnLoad: true, securityLevel: "loose" }); -/* setup event listeners */ -const nodes = document.getElementsByClassName("node"); - window.onload = () => { + /* setup event listeners */ + const nodes = document.getElementsByClassName("node"); + for (const vertexElement of nodes) { const classList = [...vertexElement.classList.values()]; diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 345af5e8e7..beb013ba8f 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -171,7 +171,8 @@ export class Renderer { private _copyUserAssets(): void { const filenames = fs.readdirSync(this._assetsPath); for (const file of filenames) { - if (file !== "templates") { + // the .ts logic is only so that `bundle.ts` isn't copied during end-to-end tests + if (file !== "templates" && !file.endsWith(".ts")) { fs.copyFileSync( `${this._assetsPath}/${file}`, `${this.planPath}/${file}` diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js new file mode 100644 index 0000000000..a607d6c0ad --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js @@ -0,0 +1,14 @@ +const { buildRecipe } = require("@nomicfoundation/ignition-core"); + +module.exports = buildRecipe("MyRecipe", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 8531ac36ea..d972ef6f77 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -1,40 +1,25 @@ /* eslint-disable import/no-unused-modules */ -import { buildRecipe } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import fs from "fs-extra"; +import path from "path"; -import { Renderer } from "../../src/plan"; import { useEnvironment } from "../useEnvironment"; describe("plan", () => { useEnvironment("minimal"); it("should create a plan", async function () { - await this.hre.run("compile", { quiet: true }); - - const recipe = buildRecipe("MyRecipe", (m) => { - const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); + const planPath = path.resolve("../minimal/cache/plan"); + fs.emptyDirSync(planPath); - m.call(usesContract, "setAddress", { - args: [bar], - }); - - return { bar, usesContract }; - }); - - const plan = await this.hre.ignition.plan(recipe); - - const renderer = new Renderer(plan, { - cachePath: this.hre.config.paths.cache, + await this.hre.run("compile", { quiet: true }); + await this.hre.run("plan", { + quiet: true, + userRecipesPaths: ["MyRecipe.js"], }); - const output = renderer.getIndexOutput(); + const files = await fs.readdir(planPath); - // not sure this is the best way to test this, but it works for now - assert(output.trim().startsWith("")); - assert(/subgraph RecipeGraph/g.test(output)); - assert(/subgraph ExecutionGraph/g.test(output)); + assert(files.includes("index.html")); }); }); diff --git a/packages/hardhat-plugin/test/plan/plan-utils.ts b/packages/hardhat-plugin/test/plan/plan-utils.ts deleted file mode 100644 index f2e02680ef..0000000000 --- a/packages/hardhat-plugin/test/plan/plan-utils.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { VertexGraph } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - graphToMermaid, - wrapInFlowchart, - wrapInMermaidDiv, -} from "../../src/plan/utils"; - -describe("plan utils", () => { - describe("graphToMermaid", () => { - it("should convert a given graph to mermaid definitions", () => { - const graph: VertexGraph = { - vertexes: new Map([ - [0, { id: 0, label: "Foo" }], - [1, { id: 1, label: "Bar" }], - ]), - adjacencyList: new Map([ - [0, new Set([1])], - [1, new Set()], - ]), - getEdges() { - return [{ from: 0, to: 1 }]; - }, - }; - - assert.equal( - graphToMermaid(graph, "test/path"), - `0[Foo] -1[Bar] -0 --> 1 -click 0 "test/path/0.json" _self -click 1 "test/path/1.json" _self` - ); - }); - }); - - describe("wrapInFlowchart", () => { - it("should wrap given text in mermaid flowchart markup", () => { - assert.equal( - wrapInFlowchart("name", "text"), - ` -flowchart -subgraph name -direction TB -text -end -` - ); - }); - }); - - describe("wrapInMermaidDiv", () => { - it("should wrap given text in mermaid html markup", () => { - assert.equal( - wrapInMermaidDiv("text"), - ` -
      - text -
      -` - ); - }); - }); -}); diff --git a/packages/hardhat-plugin/test/plan/renderer.ts b/packages/hardhat-plugin/test/plan/renderer.ts deleted file mode 100644 index bd808c8716..0000000000 --- a/packages/hardhat-plugin/test/plan/renderer.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IgnitionPlan } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; -import fs from "fs-extra"; -import path from "path"; -import sinon from "sinon"; - -import { Renderer } from "../../src/plan"; -import { useEnvironment } from "../useEnvironment"; - -describe("Renderer", () => { - useEnvironment("minimal"); - - it("should ensure the directory structure exists", () => { - const fake = sinon.fake(); - - sinon.replace(fs, "ensureDirSync", fake); - - new Renderer({} as IgnitionPlan, { cachePath: "test/path" }); - - assert(fake.callCount === 2); - assert( - fake - .getCalls()[0] - .args[0].endsWith(path.normalize("/test/path/plan/recipe")) - ); - assert( - fake - .getCalls()[1] - .args[0].endsWith(path.normalize("/test/path/plan/execution")) - ); - }); - - it("should return the proper paths", () => { - const renderer = new Renderer({} as IgnitionPlan, { - cachePath: "test/path", - }); - - assert(renderer.planPath.endsWith(path.normalize("/test/path/plan"))); - assert( - renderer.recipePath.endsWith(path.normalize("/test/path/plan/recipe")) - ); - assert( - renderer.executionPath.endsWith( - path.normalize("/test/path/plan/execution") - ) - ); - }); -}); From 05b29fca25517c238613d8f61df9d1b9ee1c4624 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 18 Oct 2022 02:13:16 -0400 Subject: [PATCH 0118/1302] fix examples test --- examples/simple-ts/package.json | 2 +- examples/simple/ignition/MyRecipe.js | 2 +- examples/simple/package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json index 4606ccb505..a96c48bfac 100644 --- a/examples/simple-ts/package.json +++ b/examples/simple-ts/package.json @@ -1,5 +1,5 @@ { - "name": "hardhat-ignition-example-simple", + "name": "hardhat-ignition-example-simple-ts", "version": "0.0.1", "private": true, "dependencies": { diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js index 58b70ec258..20f99da082 100644 --- a/examples/simple/ignition/MyRecipe.js +++ b/examples/simple/ignition/MyRecipe.js @@ -7,7 +7,7 @@ module.exports = buildRecipe("MyRecipe", (m) => { const qux = m.contract("Qux", { args: [foo, 1] }); - m.call(foo, "inc", { args: [0], after: [bar] }); + // m.call(foo, "inc", { args: [0], after: [bar] }); return { foo, bar, qux }; }); diff --git a/examples/simple/package.json b/examples/simple/package.json index 70a008c791..ed6b32d10c 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -1,5 +1,5 @@ { - "name": "hardhat-ignition-example-simple-ts", + "name": "hardhat-ignition-example-simple", "version": "0.0.1", "private": true, "scripts": { From 0f8e6b7654b63749abddaa9ce55ed16574539209 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Oct 2022 11:42:43 +0100 Subject: [PATCH 0119/1302] chore: update tsconfig Use tsconfigs in test directories to support tooling (vscode). Fix up eslint issues in examples dir at the same time. --- examples/ens/.eslintrc.js | 14 +++++++++++ examples/ens/.prettierignore | 5 ++++ examples/ens/package.json | 6 ++++- examples/simple/.eslintrc.js | 14 +++++++++++ examples/simple/.prettierignore | 5 ++++ packages/core/package.json | 2 +- packages/core/src/Ignition.ts | 2 +- packages/core/src/deployment/Deployment.ts | 5 ++-- .../core/src/deployment/deployStateReducer.ts | 5 ++-- .../core/src/services/ContractsService.ts | 4 +-- .../src/validation/dispatch/validateCall.ts | 8 +++--- packages/core/test/batch/visitInBatches.ts | 2 +- packages/core/test/execution.ts | 4 +-- packages/core/test/graph/helpers.ts | 2 +- packages/core/test/recipes.ts | 4 +-- packages/core/test/tsconfig.json | 14 +++++++++++ packages/core/tsconfig.json | 25 ++++++------------- packages/hardhat-plugin/.eslintrc.js | 2 +- packages/hardhat-plugin/package.json | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 6 +---- packages/hardhat-plugin/src/index.ts | 12 ++++----- packages/hardhat-plugin/src/plan/index.ts | 4 --- .../src/ui/components/index.tsx | 1 - packages/hardhat-plugin/src/ui/types.ts | 2 -- packages/hardhat-plugin/test/helpers.ts | 6 ++++- packages/hardhat-plugin/test/tsconfig.json | 14 +++++++++++ packages/hardhat-plugin/tsconfig.json | 23 +++++++---------- packages/tsconfig.json | 4 +++ packages/tsconfig.settings.json | 17 +++++++++++++ tsconfig.json | 16 ++++++++++++ 30 files changed, 155 insertions(+), 75 deletions(-) create mode 100644 examples/ens/.eslintrc.js create mode 100644 examples/ens/.prettierignore create mode 100644 examples/simple/.eslintrc.js create mode 100644 examples/simple/.prettierignore create mode 100644 packages/core/test/tsconfig.json create mode 100644 packages/hardhat-plugin/test/tsconfig.json create mode 100644 packages/tsconfig.json create mode 100644 packages/tsconfig.settings.json create mode 100644 tsconfig.json diff --git a/examples/ens/.eslintrc.js b/examples/ens/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/ens/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/ens/.prettierignore b/examples/ens/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/ens/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/ens/package.json b/examples/ens/package.json index 332b6058fd..76188b098e 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -3,7 +3,11 @@ "private": "true", "version": "0.0.1", "scripts": { - "test:examples": "hardhat test" + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { "hardhat": "^2.10.0", diff --git a/examples/simple/.eslintrc.js b/examples/simple/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/simple/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/simple/.prettierignore b/examples/simple/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/simple/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/packages/core/package.json b/packages/core/package.json index e2c1a6fcc5..9c91a35653 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -5,7 +5,7 @@ "author": "Nomic Foundation", "main": "dist/index.js", "scripts": { - "build": "tsc && node ./post-build.js", + "build": "tsc --build && node post-build.js", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index e1d3a74eec..5bcacb8594 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -45,7 +45,7 @@ export class Ignition { }; const deployment = new Deployment( - recipe, + recipe.name, Deployment.setupServices(options, this._providers), options.ui ); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 3dade495b1..ac23022b04 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -9,7 +9,6 @@ import { Services } from "services/types"; import { DeployState, UpdateUiAction } from "types/deployment"; import { VertexVisitResult, VertexVisitResultFailure } from "types/graph"; import { Providers } from "types/providers"; -import { Recipe } from "types/recipeGraph"; import { deployStateReducer, @@ -23,8 +22,8 @@ export class Deployment { public services: Services; public ui?: UpdateUiAction; - constructor(recipe: Recipe, services: Services, ui?: UpdateUiAction) { - this.state = initializeDeployState(recipe); + constructor(recipeName: string, services: Services, ui?: UpdateUiAction) { + this.state = initializeDeployState(recipeName); this.services = services; this.ui = ui; } diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index da9f839912..cce3f29600 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -2,14 +2,13 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; import { ExecuteBatchResult } from "execution/batch/types"; import { DeployPhase, DeployState, ExecutionState } from "types/deployment"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { Recipe } from "types/recipeGraph"; import { difference, union } from "utils/sets"; -export function initializeDeployState(recipe: Recipe): DeployState { +export function initializeDeployState(recipeName: string): DeployState { return { phase: "uninitialized", details: { - recipeName: recipe.name, + recipeName, chainId: 0, }, validation: { diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index bf8a72ce77..87dd022345 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -163,8 +163,8 @@ export class ContractsService implements IContractsService { } private async _bump( - txHash: string, - signer: IgnitionSigner, + _txHash: string, + _signer: IgnitionSigner, previousTxRequest: ethers.providers.TransactionRequest, previousTxHash: string ): Promise { diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index fa0c77ad8a..efee51fddb 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -90,7 +90,7 @@ async function resolveArtifactForCallableFuture( ); return artifact.abi; default: - assertNeverRecipeFuture(future); + return assertNeverRecipeFuture(future); } case "library": switch (future.subtype) { @@ -102,13 +102,13 @@ async function resolveArtifactForCallableFuture( ); return artifact.abi; default: - assertNeverRecipeFuture(future); + return assertNeverRecipeFuture(future); } default: - assertNeverRecipeFuture(future); + return assertNeverRecipeFuture(future); } } -function assertNeverRecipeFuture(f: never) { +function assertNeverRecipeFuture(f: never): undefined { throw new Error(`Unexpected recipe future type/subtype ${f}`); } diff --git a/packages/core/test/batch/visitInBatches.ts b/packages/core/test/batch/visitInBatches.ts index cd8ebcb8d2..1001dc8a91 100644 --- a/packages/core/test/batch/visitInBatches.ts +++ b/packages/core/test/batch/visitInBatches.ts @@ -33,7 +33,7 @@ describe("Execution - visitInBatches", () => { const mockUpdateUiAction = () => {}; const deployment = new Deployment( - { name: "MyRecipe" }, + "MyRecipe", mockServices, mockUpdateUiAction ); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 6b031e722a..d383f4e5d3 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -296,7 +296,7 @@ async function assertExecuteSingleVertex( const mockUpdateUiAction = () => {}; const deployment = new Deployment( - { name: "MyRecipe" }, + "MyRecipe", mockServices, mockUpdateUiAction ); @@ -322,7 +322,7 @@ async function assertDependentVertex( const mockUpdateUiAction = () => {}; const deployment = new Deployment( - { name: "MyRecipe" }, + "MyRecipe", mockServices, mockUpdateUiAction ); diff --git a/packages/core/test/graph/helpers.ts b/packages/core/test/graph/helpers.ts index db723cd4e1..2530816de6 100644 --- a/packages/core/test/graph/helpers.ts +++ b/packages/core/test/graph/helpers.ts @@ -15,7 +15,7 @@ export function constructAdjacencyList( return acc; }, new Set()); - for (const vertex of vertexes) { + for (const vertex of vertexes.values()) { ensureVertex(adjacencyList, vertex); } diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index 5f66838301..d323fd323f 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -729,8 +729,8 @@ describe("Recipes", function () { } ); - const WrapRecipe = buildRecipe("Wrap", (m: IRecipeGraphBuilder) => { - const token = m.useRecipe(librariesRecipe, { + const WrapRecipe = buildRecipe("Wrap", (m) => { + const { token } = m.useRecipe(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); diff --git a/packages/core/test/tsconfig.json b/packages/core/test/tsconfig.json new file mode 100644 index 0000000000..310f30464f --- /dev/null +++ b/packages/core/test/tsconfig.json @@ -0,0 +1,14 @@ +{ + "references": [{ "path": ".." }], + "compilerOptions": { + "target": "es2021", + "lib": ["es2021"], + "types": ["mocha"], + "baseUrl": "../src", + "noEmit": true, + "paths": {}, + "esModuleInterop": true, + "moduleResolution": "node" + }, + "include": ["."] +} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 463741a224..a83723e6f0 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,22 +1,11 @@ { + "extends": "../tsconfig.settings.json", + "references": [], "compilerOptions": { - "lib": ["es2021"], - "module": "commonjs", - "target": "es2021", - "strict": true, - "esModuleInterop": true, - "moduleResolution": "node", - - "incremental": true, - "outDir": "./dist", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "jsx": "react-jsx", - "baseUrl": "src", - "paths": { - "*": ["*"] - } + "composite": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src" }, - "exclude": ["dist", "node_modules", "ui-samples", "test"] + "include": ["src"] } diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-plugin/.eslintrc.js index 18c757ea9d..b0c279f1a3 100644 --- a/packages/hardhat-plugin/.eslintrc.js +++ b/packages/hardhat-plugin/.eslintrc.js @@ -7,5 +7,5 @@ module.exports = { sourceType: "module", createDefaultProgram: true, }, - ignorePatterns: ["**/assets/bundle.ts"], + ignorePatterns: ["**/assets/bundle.ts", "**/.eslintrc.js", "esbuild.js"], }; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 4c514fb619..3000cedf01 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -5,7 +5,7 @@ "author": "Nomic Foundation", "main": "dist/index.js", "scripts": { - "build": "tsc && node ./esbuild.js", + "build": "tsc --build && node ./esbuild.js", "lint": "yarn prettier --check && yarn eslint", "lint:fix": "yarn prettier --write && yarn eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 13e054d085..5c6a8cbf4d 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -5,22 +5,18 @@ import { ExternalParamValue, Recipe, } from "@nomicfoundation/ignition-core"; -import { HardhatConfig, HardhatRuntimeEnvironment } from "hardhat/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; import { renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; -type HardhatPaths = HardhatConfig["paths"]; export class IgnitionWrapper { private _ignition: Ignition; - private _cachedChainId: number | undefined; constructor( private _providers: Providers, private _ethers: HardhatEthers, - private _isHardhatNetwork: boolean, - private _paths: HardhatPaths, private _deployOptions: Omit< IgnitionDeployOptions, keyof { ui?: boolean } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 17e1f3876e..7ebcbd0113 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -88,13 +88,11 @@ extendEnvironment((hre) => { const txPollingInterval = isHardhatNetwork ? 100 : 5000; - return new IgnitionWrapper( - providers, - hre.ethers, - isHardhatNetwork, - hre.config.paths, - { pathToJournal, txPollingInterval, ui: true } - ); + return new IgnitionWrapper(providers, hre.ethers, { + pathToJournal, + txPollingInterval, + ui: true, + }); }); }); diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index beb013ba8f..ffc21f6cca 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -141,10 +141,6 @@ export class Renderer { return path.resolve(this._assetsPath, "templates"); } - private _writeExecutionHTML(id: number, text: string): void { - fs.writeFileSync(`${this.executionPath}/${id}.html`, text, "utf8"); - } - private _writeRecipeHTML(id: number, text: string): void { fs.writeFileSync(`${this.recipePath}/${id}.html`, text, "utf8"); } diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index d38f7d1117..2b389191a4 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,5 +1,4 @@ import { DeployState } from "@nomicfoundation/ignition-core"; -import React from "react"; import { StartingPanel } from "./StartingPanel"; import { ValidationFailedPanel } from "./ValidationFailedPanel"; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 8409f60873..d111226acd 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -47,7 +47,6 @@ export class DeploymentState { public phase: DeployPhase; public recipeName: string; - private validationErrors: string[]; private executionVertexes: { [key: string]: VertexStatus }; private order: number[]; public batches: UiBatch[]; @@ -59,7 +58,6 @@ export class DeploymentState { this.order = []; - this.validationErrors = []; this.executionVertexes = {}; this.batches = []; } diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index f178f77211..0999bd2686 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -86,7 +86,7 @@ export async function assertDeploymentState( assert.isDefined(futureResult.value.hash); await assertTxMined(hre, futureResult.value.hash); } else { - const _exhaustiveCheck: never = expectedFutureResult; + assertNeverFutureResult(expectedFutureResult); } } } @@ -217,3 +217,7 @@ export async function deployRecipe( return result; } + +function assertNeverFutureResult(expectedFutureResult: never) { + throw new Error(`Unextectped future result ${expectedFutureResult}`); +} diff --git a/packages/hardhat-plugin/test/tsconfig.json b/packages/hardhat-plugin/test/tsconfig.json new file mode 100644 index 0000000000..310f30464f --- /dev/null +++ b/packages/hardhat-plugin/test/tsconfig.json @@ -0,0 +1,14 @@ +{ + "references": [{ "path": ".." }], + "compilerOptions": { + "target": "es2021", + "lib": ["es2021"], + "types": ["mocha"], + "baseUrl": "../src", + "noEmit": true, + "paths": {}, + "esModuleInterop": true, + "moduleResolution": "node" + }, + "include": ["."] +} diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index 63a92198ad..bb9d637b2b 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -1,18 +1,13 @@ { + "extends": "../tsconfig.settings.json", + "references": [{ "path": "../core" }], "compilerOptions": { - "lib": ["es2021"], - "module": "commonjs", - "target": "es2021", - "strict": true, - "esModuleInterop": true, - "moduleResolution": "node", - - "incremental": true, - "outDir": "./dist", - "declaration": true, - "declarationMap": true, - "sourceMap": true, - "jsx": "react-jsx" + "composite": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src", + "jsx": "react-jsx", + "lib": ["es2021", "DOM", "DOM.Iterable"] }, - "exclude": ["dist", "node_modules", "test", "src/plan/assets"] + "include": ["src"] } diff --git a/packages/tsconfig.json b/packages/tsconfig.json new file mode 100644 index 0000000000..06ba4a32fc --- /dev/null +++ b/packages/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "core" }, { "path": "hardhat-plugin" }] +} diff --git a/packages/tsconfig.settings.json b/packages/tsconfig.settings.json new file mode 100644 index 0000000000..e2cebcc167 --- /dev/null +++ b/packages/tsconfig.settings.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "commonjs", + "composite": true, + "lib": ["es2021"], + "target": "es2021", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "esModuleInterop": true, + "moduleResolution": "node", + "declaration": true, + "types": [], + "sourceMap": true + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000000..eeadf526de --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "module": "commonjs", + "composite": true, + "lib": ["es2021"], + "target": "es2021", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "esModuleInterop": true, + "moduleResolution": "node", + "declaration": true + }, + "exclude": ["**/node_modules/**"] +} From eff96ba3feef36d520a51a9af51bef2a54741b7f Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Oct 2022 14:45:16 +0100 Subject: [PATCH 0120/1302] chore: nohoist in workspaces --- package.json | 24 +++++++++++++++---- packages/core/package.json | 4 ++++ .../hardhat-plugin/src/plan/assets/main.css | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 32ce86112b..fdba16a8d4 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,15 @@ "author": "Nomic Foundation", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, - "workspaces": [ - "packages/*", - "examples/*" - ], + "workspaces": { + "packages": [ + "packages/*", + "examples/*" + ], + "nohoist": [ + "**" + ] + }, "scripts": { "build": "wsrun --exclude-missing --serial build", "lint": "wsrun --exclude-missing --serial lint", @@ -19,6 +24,15 @@ "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { - "wsrun": "^5.2.4" + "wsrun": "^5.2.4", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-prettier": "4.0.0", + "typescript": "^4.7.4" } } diff --git a/packages/core/package.json b/packages/core/package.json index 9c91a35653..6de5eb96c0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,6 +37,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", + "hardhat": "^2.10.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", @@ -47,6 +48,9 @@ "tsconfig-paths": "^4.1.0", "typescript": "^4.7.4" }, + "peerDependencies": { + "hardhat": "^2.10.0" + }, "dependencies": { "@ethersproject/address": "5.6.1", "debug": "^4.3.2", diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index 122d905416..1a0abbdca8 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -1,4 +1,4 @@ -@import url("../../../../../node_modules/purecss/build/pure-min.css"); +@import url("../../../node_modules/purecss/build/pure-min.css"); .title-bar, .summary, From ad6a45e4f31507cc1b3387952efdef9f8d3382d5 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 17 Oct 2022 11:17:12 -0400 Subject: [PATCH 0121/1302] useModule and some basic tests --- .../core/src/recipe/RecipeGraphBuilder.ts | 41 +++++++++++++---- packages/core/test/recipes.ts | 45 +++++++++++++++++++ 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index ad99093746..1b01dfc44d 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -35,20 +35,20 @@ import { import { RecipeGraph } from "./RecipeGraph"; import { ScopeStack } from "./ScopeStack"; +interface ModuleCache { + [label: string]: FutureDict; +} + export class RecipeGraphBuilder implements IRecipeGraphBuilder { public chainId: number; - public graph: IRecipeGraph; - private idCounter: number; - private useRecipeInvocationCounter: number; - private scopes: ScopeStack; + public graph: IRecipeGraph = new RecipeGraph(); + private idCounter: number = 0; + private moduleCache: ModuleCache = {}; + private useRecipeInvocationCounter: number = 0; + private scopes: ScopeStack = new ScopeStack(); constructor(options: RecipeGraphBuilderOptions) { this.chainId = options.chainId; - this.idCounter = 0; - this.useRecipeInvocationCounter = 0; - this.graph = new RecipeGraph(); - - this.scopes = new ScopeStack(); } public library( @@ -297,6 +297,29 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return { ...result, recipe: virtualVertex }; } + public useModule(recipe: Recipe, options?: UseRecipeOptions): FutureDict { + const label = `module:${recipe.name}`; + + if (this.moduleCache[label] === undefined) { + this.scopes.push(label); + const scopeLabel = this.scopes.getScopedLabel(); + + if (options?.parameters !== undefined) { + this.graph.registeredParameters[scopeLabel] = options.parameters; + } + + const result = recipe.recipeAction(this); + + this._createRecipeVirtualVertex(label); + + this.scopes.pop(); + + this.moduleCache[label] = { ...result }; + } + + return this.moduleCache[label]; + } + private _createRecipeVirtualVertex(label: string): Virtual { const virtualFuture: Virtual = { vertexId: this._resolveNextId(), diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index d323fd323f..7926486263 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -752,6 +752,51 @@ describe("Recipes", function () { assert.equal(recipeGraph.vertexes.size, 2); }); }); + + describe("useModule", () => { + let recipeGraph: IRecipeGraph; + + before(() => { + const librariesRecipe = buildRecipe( + "libraries", + (m: IRecipeGraphBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + const WrapRecipe = buildRecipe("Wrap", (m: IRecipeGraphBuilder) => { + const token = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + const token2 = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token, token2 }; + }); + + const { graph } = generateRecipeGraphFrom(WrapRecipe, { + chainId: 31, + }); + + recipeGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(recipeGraph); + }); + + it("should have one node", () => { + assert.equal(recipeGraph.vertexes.size, 2); + }); + }); }); function getRecipeVertexByLabel( From ea08c028268f28364550eed44d6396ec1fce3976 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 19 Oct 2022 02:10:37 -0400 Subject: [PATCH 0122/1302] add `buildModule` and error checking --- .vscode/settings.json | 3 -- packages/core/package.json | 4 +- .../core/src/recipe/RecipeGraphBuilder.ts | 38 ++++++++++++++----- packages/core/src/recipe/buildModule.ts | 12 ++++++ packages/core/src/types/module.ts | 20 ++++++++++ packages/core/test/recipes.ts | 3 +- yarn.lock | 10 +++++ 7 files changed, 76 insertions(+), 14 deletions(-) delete mode 100644 .vscode/settings.json create mode 100644 packages/core/src/recipe/buildModule.ts create mode 100644 packages/core/src/types/module.ts diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 1dcba7667b..0000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "task.allowAutomaticTasks": "on" -} diff --git a/packages/core/package.json b/packages/core/package.json index 6de5eb96c0..c6d2792b17 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,6 +23,7 @@ "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", + "@types/object-hash": "^2.2.1", "@types/react": "^17.0.35", "@types/sinon": "^10.0.6", "@types/tmp": "^0.2.2", @@ -56,6 +57,7 @@ "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", - "js-graph-algorithms": "1.0.18" + "js-graph-algorithms": "1.0.18", + "object-hash": "^3.0.0" } } diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 1b01dfc44d..144d72a629 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -1,3 +1,5 @@ +import hash from "object-hash"; + import { addEdge, ensureVertex } from "graph/adjacencyList"; import type { RecipeFuture, @@ -15,6 +17,7 @@ import type { Virtual, } from "types/future"; import type { Artifact } from "types/hardhat"; +import type { Module, ModuleCache, ModuleDict } from "types/module"; import { ContractOptions, InternalParamValue, @@ -35,10 +38,6 @@ import { import { RecipeGraph } from "./RecipeGraph"; import { ScopeStack } from "./ScopeStack"; -interface ModuleCache { - [label: string]: FutureDict; -} - export class RecipeGraphBuilder implements IRecipeGraphBuilder { public chainId: number; public graph: IRecipeGraph = new RecipeGraph(); @@ -297,8 +296,8 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return { ...result, recipe: virtualVertex }; } - public useModule(recipe: Recipe, options?: UseRecipeOptions): FutureDict { - const label = `module:${recipe.name}`; + public useModule(module: Module, options?: UseRecipeOptions): ModuleDict { + const label = `module:${module.name}`; if (this.moduleCache[label] === undefined) { this.scopes.push(label); @@ -308,16 +307,37 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { this.graph.registeredParameters[scopeLabel] = options.parameters; } - const result = recipe.recipeAction(this); + const result = module.moduleAction(this); + + // type casting here so that typescript lets us validate against js users bypassing typeguards + for (const future of Object.values(result as FutureDict)) { + if (!isCallable(future)) { + throw new Error( + `Cannot return Future of type "${future.type} from a module` + ); + } + } this._createRecipeVirtualVertex(label); this.scopes.pop(); - this.moduleCache[label] = { ...result }; + const optionsHash = hash(options ?? null, { unorderedArrays: true }); + + this.moduleCache[label] = { result, optionsHash }; + } else { + const moduleData = this.moduleCache[label]; + + const newHash = hash(options ?? null, { unorderedArrays: true }); + + if (moduleData.optionsHash !== newHash) { + throw new Error( + "`useModule` cannot be invoked on the same module using different parameters" + ); + } } - return this.moduleCache[label]; + return this.moduleCache[label].result; } private _createRecipeVirtualVertex(label: string): Virtual { diff --git a/packages/core/src/recipe/buildModule.ts b/packages/core/src/recipe/buildModule.ts new file mode 100644 index 0000000000..a9ce6ed396 --- /dev/null +++ b/packages/core/src/recipe/buildModule.ts @@ -0,0 +1,12 @@ +import type { Module, ModuleDict } from "types/module"; +import type { IRecipeGraphBuilder } from "types/recipeGraph"; + +export function buildModule( + moduleName: string, + moduleFunc: (m: IRecipeGraphBuilder) => ModuleDict +): Module { + return { + name: moduleName, + moduleAction: moduleFunc, + }; +} diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts new file mode 100644 index 0000000000..7d52f7485c --- /dev/null +++ b/packages/core/src/types/module.ts @@ -0,0 +1,20 @@ +import type { CallableFuture } from "./future"; +import type { IRecipeGraphBuilder } from "./recipeGraph"; + +export interface ModuleDict { + [key: string]: CallableFuture; +} + +export interface Module { + name: string; + moduleAction: (builder: IRecipeGraphBuilder) => ModuleDict; +} + +export interface ModuleData { + result: ModuleDict; + optionsHash: string; +} + +export interface ModuleCache { + [label: string]: ModuleData; +} diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index 7926486263..2ef6dfc640 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -4,6 +4,7 @@ import { assert } from "chai"; import { getDependenciesFor } from "graph/adjacencyList"; import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; import { RecipeGraph } from "recipe/RecipeGraph"; +import { buildModule } from "recipe/buildModule"; import { buildRecipe } from "recipe/buildRecipe"; import { VertexDescriptor } from "types/graph"; import { Artifact } from "types/hardhat"; @@ -757,7 +758,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const librariesRecipe = buildRecipe( + const librariesRecipe = buildModule( "libraries", (m: IRecipeGraphBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); diff --git a/yarn.lock b/yarn.lock index 887e213e26..5369f1df1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1468,6 +1468,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.64.tgz#9171f327298b619e2c52238b120c19056415d820" integrity sha512-z5hPTlVFzNwtJ2LNozTpJcD1Cu44c4LNuzaq1mwxmiHWQh2ULdR6Vjwo1UGldzRpzL0yUEdZddnfqGW2G70z6Q== +"@types/object-hash@^2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-2.2.1.tgz#67c169f8f033e0b62abbf81df2d00f4598d540b9" + integrity sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ== + "@types/pbkdf2@^3.0.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" @@ -6450,6 +6455,11 @@ object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + object-inspect@^1.12.2, object-inspect@^1.9.0: version "1.12.2" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" From 815a9144ad6aa2cdf9492beb76b20bc4c12f7068 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Oct 2022 18:49:09 -0400 Subject: [PATCH 0123/1302] add tests for new errors --- .../core/src/recipe/RecipeGraphBuilder.ts | 6 +- packages/core/test/recipes.ts | 63 +++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 144d72a629..500af448e6 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -313,7 +313,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { for (const future of Object.values(result as FutureDict)) { if (!isCallable(future)) { throw new Error( - `Cannot return Future of type "${future.type} from a module` + `Cannot return Future of type "${future.type}" from a module` ); } } @@ -322,13 +322,13 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { this.scopes.pop(); - const optionsHash = hash(options ?? null, { unorderedArrays: true }); + const optionsHash = hash(options ?? null); this.moduleCache[label] = { result, optionsHash }; } else { const moduleData = this.moduleCache[label]; - const newHash = hash(options ?? null, { unorderedArrays: true }); + const newHash = hash(options ?? null); if (moduleData.optionsHash !== newHash) { throw new Error( diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index 2ef6dfc640..dba52b66f4 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -756,6 +756,8 @@ describe("Recipes", function () { describe("useModule", () => { let recipeGraph: IRecipeGraph; + let returnsWrongFutureType: () => void; + let differentParams: () => void; before(() => { const librariesRecipe = buildModule( @@ -788,6 +790,53 @@ describe("Recipes", function () { }); recipeGraph = graph; + + const DiffParamsRecipe = buildRecipe( + "Error", + (m: IRecipeGraphBuilder) => { + const token = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + const token2 = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, + }); + + return { token, token2 }; + } + ); + + const returnTypeModule = buildModule( + "returnsParam", + (m: IRecipeGraphBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token, name }; + } + ); + + const ReturnTypeRecipe = buildRecipe( + "ReturnsParamRecipe", + (m: IRecipeGraphBuilder) => { + const token = m.useModule(returnTypeModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token }; + } + ); + + returnsWrongFutureType = () => { + generateRecipeGraphFrom(ReturnTypeRecipe, { chainId: 31 }); + }; + + differentParams = () => { + generateRecipeGraphFrom(DiffParamsRecipe, { chainId: 31 }); + }; }); it("should create a graph", () => { @@ -797,6 +846,20 @@ describe("Recipes", function () { it("should have one node", () => { assert.equal(recipeGraph.vertexes.size, 2); }); + + it("should not allow using the same module with different parameters", () => { + assert.throws( + differentParams, + "`useModule` cannot be invoked on the same module using different parameters" + ); + }); + + it("should not allow an uncallable future to be returned from a module", () => { + assert.throws( + returnsWrongFutureType, + `Cannot return Future of type "parameter" from a module` + ); + }); }); }); From 6b1e4c795844f265e33df077f4abd2201a6b7f34 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Oct 2022 19:16:21 -0400 Subject: [PATCH 0124/1302] added simple useModule example --- examples/simple/ignition/MyModule.js | 20 ++++++++++++++++++++ packages/core/src/index.ts | 2 ++ 2 files changed, 22 insertions(+) create mode 100644 examples/simple/ignition/MyModule.js diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js new file mode 100644 index 0000000000..c7a739a9bc --- /dev/null +++ b/examples/simple/ignition/MyModule.js @@ -0,0 +1,20 @@ +const { + buildRecipe, + buildModule, +} = require("@nomicfoundation/hardhat-ignition"); + +const myModule = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + const bar = m.contract("bar", { args: [foo] }); + + return { foo, bar }; +}); + +module.exports = buildRecipe("MyRecipe", (m) => { + const { foo, bar } = m.useModule(myModule); + + const qux = m.contract("Qux", { args: [foo, 1] }); + + return { foo, bar, qux }; +}); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 5ff769a881..4576a2a1a3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,5 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; +export { buildModule } from "recipe/buildModule"; export { buildRecipe } from "recipe/buildRecipe"; export type { @@ -16,6 +17,7 @@ export type { DeployPhase, DeploymentResult, } from "types/deployment"; +export type { Module } from "types/module"; export type { Recipe, ExternalParamValue, From 9f9ec9c9c7f76dbb22dabffcfdf2aafbaad18077 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Oct 2022 20:49:23 -0400 Subject: [PATCH 0125/1302] cleaning up loose ends --- examples/simple/ignition/MyModule.js | 2 +- .../core/src/recipe/RecipeGraphBuilder.ts | 5 +-- packages/core/src/types/recipeGraph.ts | 2 ++ .../core/src/utils/collectLibrariesAndLink.ts | 20 ++++------- packages/core/src/utils/errors.ts | 7 ++++ packages/core/test/recipes.ts | 34 +++++++++++-------- packages/hardhat-plugin/src/index.ts | 2 +- 7 files changed, 39 insertions(+), 33 deletions(-) create mode 100644 packages/core/src/utils/errors.ts diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js index c7a739a9bc..feafbd5b2a 100644 --- a/examples/simple/ignition/MyModule.js +++ b/examples/simple/ignition/MyModule.js @@ -6,7 +6,7 @@ const { const myModule = buildModule("MyModule", (m) => { const foo = m.contract("Foo"); - const bar = m.contract("bar", { args: [foo] }); + const bar = m.contract("Bar", { args: [foo] }); return { foo, bar }; }); diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 500af448e6..973b960b6d 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -28,6 +28,7 @@ import { RecipeVertex, UseRecipeOptions, } from "types/recipeGraph"; +import { IgnitionError } from "utils/errors"; import { isArtifact, isCallable, @@ -312,7 +313,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { // type casting here so that typescript lets us validate against js users bypassing typeguards for (const future of Object.values(result as FutureDict)) { if (!isCallable(future)) { - throw new Error( + throw new IgnitionError( `Cannot return Future of type "${future.type}" from a module` ); } @@ -331,7 +332,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const newHash = hash(options ?? null); if (moduleData.optionsHash !== newHash) { - throw new Error( + throw new IgnitionError( "`useModule` cannot be invoked on the same module using different parameters" ); } diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index 8278090c47..69619846b0 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -14,6 +14,7 @@ import { } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; +import { Module, ModuleDict } from "./module"; export interface IRecipeGraph { vertexes: Map; @@ -152,6 +153,7 @@ export interface IRecipeGraphBuilder { ) => OptionalParameter; useRecipe: (recipe: Recipe, options?: UseRecipeOptions) => FutureDict; + useModule: (module: Module, options?: UseRecipeOptions) => ModuleDict; } export interface Recipe { diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts index 694a0059e2..94746e8298 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -1,7 +1,6 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { NomicLabsHardhatPluginError } from "hardhat/plugins"; - import { Artifact } from "types/hardhat"; +import { IgnitionError } from "utils/errors"; interface Link { sourceName: string; @@ -13,8 +12,6 @@ export interface Libraries { [libraryName: string]: string; } -const pluginName = "ignition"; - export async function collectLibrariesAndLink( artifact: Artifact, libraries: Libraries @@ -38,8 +35,7 @@ export async function collectLibrariesAndLink( libraries )) { if (!utils.isAddress(linkedLibraryAddress)) { - throw new NomicLabsHardhatPluginError( - pluginName, + throw new IgnitionError( `You tried to link the contract ${artifact.contractName} with the library ${linkedLibraryName}, but provided this invalid address: ${linkedLibraryAddress}` ); } @@ -63,8 +59,7 @@ ${libraryFQNames}`; } else { detailedMessage = "This contract doesn't need linking any libraries."; } - throw new NomicLabsHardhatPluginError( - pluginName, + throw new IgnitionError( `You tried to link the contract ${artifact.contractName} with ${linkedLibraryName}, which is not one of its libraries. ${detailedMessage}` ); @@ -75,8 +70,7 @@ ${detailedMessage}` .map(({ sourceName, libName }) => `${sourceName}:${libName}`) .map((x) => `* ${x}`) .join("\n"); - throw new NomicLabsHardhatPluginError( - pluginName, + throw new IgnitionError( `The library name ${linkedLibraryName} is ambiguous for the contract ${artifact.contractName}. It may resolve to one of the following libraries: ${matchingNeededLibrariesFQNs} @@ -92,8 +86,7 @@ To fix this, choose one of these fully qualified library names and replace where // for it to be given twice in the libraries user input: // once as a library name and another as a fully qualified library name. if (linksToApply.has(neededLibraryFQN)) { - throw new NomicLabsHardhatPluginError( - pluginName, + throw new IgnitionError( `The library names ${neededLibrary.libName} and ${neededLibraryFQN} refer to the same library and were given as two separate library links. Remove one of them and review your library links before proceeding.` ); @@ -113,8 +106,7 @@ Remove one of them and review your library links before proceeding.` .map((x) => `* ${x}`) .join("\n"); - throw new NomicLabsHardhatPluginError( - pluginName, + throw new IgnitionError( `The contract ${artifact.contractName} is missing links for the following libraries: ${missingLibraries} Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html#library-linking diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts new file mode 100644 index 0000000000..c3a74207d6 --- /dev/null +++ b/packages/core/src/utils/errors.ts @@ -0,0 +1,7 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export class IgnitionError extends NomicLabsHardhatPluginError { + constructor(message: string) { + super("ignition", message); + } +} diff --git a/packages/core/test/recipes.ts b/packages/core/test/recipes.ts index dba52b66f4..e20755f115 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/recipes.ts @@ -286,8 +286,8 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); assert.deepStrictEqual(deps, [ - { id: 0, label: "A" }, - { id: 1, label: "Someother" }, + { id: 0, label: "A", type: "" }, + { id: 1, label: "Someother", type: "" }, ]); }); @@ -407,9 +407,10 @@ describe("Recipes", function () { { id: 0, label: "Token", + type: "", }, - { id: 1, label: "Exchange" }, - { id: 2, label: "Another" }, + { id: 1, label: "Exchange", type: "" }, + { id: 2, label: "Another", type: "" }, ]); }); @@ -515,7 +516,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother" }]); + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); }); }); @@ -578,6 +579,7 @@ describe("Recipes", function () { { id: 0, label: "Someother", + type: "", }, ]); }); @@ -667,7 +669,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother" }]); + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); }); it("should show one dependency on library node SafeMath for Contract", () => { @@ -679,7 +681,7 @@ describe("Recipes", function () { const deps = getDependenciesForVertex(recipeGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath" }]); + assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath", type: "" }]); }); it("should record the argument list for the library node SafeMath as [42]", () => { @@ -774,11 +776,11 @@ describe("Recipes", function () { ); const WrapRecipe = buildRecipe("Wrap", (m: IRecipeGraphBuilder) => { - const token = m.useModule(librariesRecipe, { + const { token } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - const token2 = m.useModule(librariesRecipe, { + const { token: token2 } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -794,11 +796,11 @@ describe("Recipes", function () { const DiffParamsRecipe = buildRecipe( "Error", (m: IRecipeGraphBuilder) => { - const token = m.useModule(librariesRecipe, { + const { token } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - const token2 = m.useModule(librariesRecipe, { + const { token: token2 } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, }); @@ -808,6 +810,8 @@ describe("Recipes", function () { const returnTypeModule = buildModule( "returnsParam", + // @ts-ignore + // ignoring here to specifically test for js ability to bypass type guards (m: IRecipeGraphBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); const name = m.getParam("tokenName"); @@ -822,7 +826,7 @@ describe("Recipes", function () { const ReturnTypeRecipe = buildRecipe( "ReturnsParamRecipe", (m: IRecipeGraphBuilder) => { - const token = m.useModule(returnTypeModule, { + const { token } = m.useModule(returnTypeModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -850,14 +854,14 @@ describe("Recipes", function () { it("should not allow using the same module with different parameters", () => { assert.throws( differentParams, - "`useModule` cannot be invoked on the same module using different parameters" + /`useModule` cannot be invoked on the same module using different parameters/ ); }); it("should not allow an uncallable future to be returned from a module", () => { assert.throws( returnsWrongFutureType, - `Cannot return Future of type "parameter" from a module` + /Cannot return Future of type "parameter" from a module/ ); }); }); @@ -881,5 +885,5 @@ function getDependenciesForVertex( return depIds .map((depId) => recipeGraph.vertexes.get(depId)) .filter((nodeDesc): nodeDesc is RecipeVertex => nodeDesc !== undefined) - .map((vertex) => ({ id: vertex.id, label: vertex.label })); + .map((vertex) => ({ id: vertex.id, label: vertex.label, type: "" })); } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 7ebcbd0113..2174d378b0 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -10,7 +10,7 @@ import { Renderer } from "./plan"; import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; import "./type-extensions"; -export { buildRecipe } from "@nomicfoundation/ignition-core"; +export { buildRecipe, buildModule } from "@nomicfoundation/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; From c419b067dac090afff9f1d545fadea487932fa49 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Oct 2022 21:16:36 -0400 Subject: [PATCH 0126/1302] basic example added to docs for modules --- docs/creating-recipes-for-deployment.md | 49 +++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 4 deletions(-) diff --git a/docs/creating-recipes-for-deployment.md b/docs/creating-recipes-for-deployment.md index ebc4820f92..b5b664000c 100644 --- a/docs/creating-recipes-for-deployment.md +++ b/docs/creating-recipes-for-deployment.md @@ -55,12 +55,12 @@ You can think of this as `b` being analogue to a promise of an address, although ### Executing a method in a contract ```tsx -const token = m.contract("Token") -const exchange = m.contract("Exchange") +const token = m.contract("Token"); +const exchange = m.contract("Exchange"); m.call(exchange, "addToken", { - args: [token] -}) + args: [token], +}); ``` ### Using an existing contract @@ -138,3 +138,44 @@ When a recipe is deployed, the proper parameters must be provided. If they are n ```tsx const symbol = m.getOptionalParam("tokenSymbol", "TKN"); ``` + +## Modules + +Similarly to creating and using Recipes with `buildRecipe(...)` and `m.useRecipe(...)`, you may also choose to create and use Modules using `buildModule(...)` and `m.useModule(...)`: + +```tsx +// ./ignition/MyRecipe.ts +import { + buildRecipe, + buildModule, + RecipeBuilder, +} from "@nomicfoundation/hardhat-ignition"; + +const myModule = buildModule("MyModule", (m: RecipeBuilder) => { + const symbol = m.getParam("tokenSymbol"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; +}); + +export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { + const { token } = m.useModule(myModule, { + parameters: { + tokenName: "EXAMPLE", + tokenSymbol: "XMPL", + }, + }); + + return { token }; +}); +``` + +The difference in using a Module instead of a Recipe is that, no matter how many times you invoke a given module via `m.useModule(...)`, that module will only be executed one time, with the results cached internally and returned for subsequent invocations. + +To enforce this, there are two rules that must be followed when creating modules: + +- Parameters passed into subsequent calls of `m.useModule(...)` must match the parameters used for the first invocation of a given module +- Only `CallableFuture` types can be returned when building a module (i.e. contracts or libraries) From 4c633c8d11f6db127d6df3104e624c82eb3f4180 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 20 Oct 2022 21:20:38 -0400 Subject: [PATCH 0127/1302] add settings.json to gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index ad61817753..8edc81843d 100644 --- a/.gitignore +++ b/.gitignore @@ -132,3 +132,6 @@ dist # Mac OSX garbage .DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json From 93160501e32e1f29ef81e4015ddb6983d19a2aa0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 10:52:54 +0100 Subject: [PATCH 0128/1302] docs: better quick start (#45) To improve the quick start guide several changes where put in: 1. renamed the packages to fall under @ignored 2. removed the out of date ts example (we need to bring this back later) 3. make usage of useModule the default (rather than useRecipe)to help in the quickstart and examples 4. change the getting started guide to be based off of the Lock.sol example from the HH quickstart guide ## Details * chore: add top level prettier linting * chore: rename to @ignored package This is in prep for releasing an alpha to npm (ignored is our traditional hidden namespace). * chore: remove ts example This will come back as a multsig example and a timelock example, but is wildly out of date relative to the codebase. * refactor: use `useModule` in deploy This means swapping over all the tests. * docs: update simple example readme * docs(getting-started-guide): base on hh sample Use `Lock.sol` from the hh sample project and quick start as the basis for the ignition quickstart. * docs: update the module docs Rename from recipes to modules and clean up the content. * Fix typo Co-authored-by: Morgan --- README.md | 11 +- ....md => creating-modules-for-deployment.md} | 101 +++--- docs/design.md | 49 +-- docs/getting-started-guide.md | 73 ++-- examples/ens/hardhat.config.js | 2 +- examples/ens/ignition/ENS.js | 4 +- examples/ens/ignition/test-registrar.js | 6 +- examples/ens/package.json | 4 +- examples/simple-ts/.gitignore | 3 - examples/simple-ts/contracts/Multisig.sol | 318 ------------------ examples/simple-ts/contracts/Owned.sol | 16 - examples/simple-ts/contracts/Timelock.sol | 1 - examples/simple-ts/hardhat.config.ts | 9 - examples/simple-ts/ignition/Multisig.ts | 165 --------- .../simple-ts/ignition/MultisigAndTimelock.ts | 247 -------------- examples/simple-ts/ignition/Timelock.ts | 137 -------- examples/simple-ts/package.json | 21 -- .../scripts/multisig-and-timelock.ts | 16 - examples/simple-ts/scripts/multisig.ts | 16 - examples/simple-ts/scripts/timelock.ts | 16 - examples/simple-ts/tsconfig.json | 11 - examples/simple/README.md | 21 ++ examples/simple/contracts/Foo.sol | 28 -- examples/simple/contracts/Simple.sol | 13 + examples/simple/deploy.js | 13 - examples/simple/hardhat.config.js | 2 +- examples/simple/ignition/MyModule.js | 20 -- examples/simple/ignition/MyRecipe.js | 13 - examples/simple/ignition/ParamRecipe.js | 13 - examples/simple/ignition/Simple.js | 13 + examples/simple/package.json | 12 +- examples/simple/script.js | 18 - examples/simple/test/myrecipe.test.js | 12 - examples/simple/test/paramrecipe.test.js | 16 - examples/simple/test/simple.test.js | 24 ++ package.json | 4 + packages/core/package.json | 2 +- packages/core/src/Ignition.ts | 18 +- .../src/process/generateRecipeGraphFrom.ts | 6 +- packages/core/test/{recipes.ts => modules.ts} | 41 ++- packages/core/test/validation.ts | 37 +- packages/core/ui-samples/index.tsx | 2 +- packages/hardhat-plugin/README.md | 6 +- packages/hardhat-plugin/package.json | 6 +- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 12 +- packages/hardhat-plugin/src/index.ts | 22 +- packages/hardhat-plugin/src/plan/index.ts | 2 +- packages/hardhat-plugin/src/plan/utils.ts | 5 +- .../ui/components/ValidationFailedPanel.tsx | 2 +- .../components/execution/BatchExecution.tsx | 2 +- .../components/execution/ExecutionPanel.tsx | 2 +- .../ui/components/execution/FinalStatus.tsx | 2 +- .../components/execution/SummarySection.tsx | 2 +- .../src/ui/components/index.tsx | 2 +- .../hardhat-plugin/src/ui/renderToCli.tsx | 2 +- packages/hardhat-plugin/src/ui/types.ts | 2 +- packages/hardhat-plugin/src/user-recipes.ts | 28 +- packages/hardhat-plugin/test/calls.ts | 6 +- packages/hardhat-plugin/test/chainId.ts | 4 +- packages/hardhat-plugin/test/contracts.ts | 12 +- .../hardhat-plugin/test/existing-contract.ts | 6 +- .../ignition/{MyRecipe.js => MyModule.js} | 5 +- packages/hardhat-plugin/test/helpers.ts | 18 +- packages/hardhat-plugin/test/libraries.ts | 10 +- packages/hardhat-plugin/test/params.ts | 22 +- packages/hardhat-plugin/test/plan/index.ts | 2 +- .../test/{use-recipe.ts => use-module.ts} | 32 +- packages/hardhat-plugin/test/user-recipes.ts | 24 +- 69 files changed, 407 insertions(+), 1387 deletions(-) rename docs/{creating-recipes-for-deployment.md => creating-modules-for-deployment.md} (57%) delete mode 100644 examples/simple-ts/.gitignore delete mode 100644 examples/simple-ts/contracts/Multisig.sol delete mode 100644 examples/simple-ts/contracts/Owned.sol delete mode 100644 examples/simple-ts/contracts/Timelock.sol delete mode 100644 examples/simple-ts/hardhat.config.ts delete mode 100644 examples/simple-ts/ignition/Multisig.ts delete mode 100644 examples/simple-ts/ignition/MultisigAndTimelock.ts delete mode 100644 examples/simple-ts/ignition/Timelock.ts delete mode 100644 examples/simple-ts/package.json delete mode 100644 examples/simple-ts/scripts/multisig-and-timelock.ts delete mode 100644 examples/simple-ts/scripts/multisig.ts delete mode 100644 examples/simple-ts/scripts/timelock.ts delete mode 100644 examples/simple-ts/tsconfig.json create mode 100644 examples/simple/README.md delete mode 100644 examples/simple/contracts/Foo.sol create mode 100644 examples/simple/contracts/Simple.sol delete mode 100644 examples/simple/deploy.js delete mode 100644 examples/simple/ignition/MyModule.js delete mode 100644 examples/simple/ignition/MyRecipe.js delete mode 100644 examples/simple/ignition/ParamRecipe.js create mode 100644 examples/simple/ignition/Simple.js delete mode 100644 examples/simple/script.js delete mode 100644 examples/simple/test/myrecipe.test.js delete mode 100644 examples/simple/test/paramrecipe.test.js create mode 100644 examples/simple/test/simple.test.js rename packages/core/test/{recipes.ts => modules.ts} (95%) rename packages/hardhat-plugin/test/fixture-projects/minimal/ignition/{MyRecipe.js => MyModule.js} (60%) rename packages/hardhat-plugin/test/{use-recipe.ts => use-module.ts} (84%) diff --git a/README.md b/README.md index 456af3da5b..6c174ca05b 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,14 @@ Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay u Add **Ignition** as a plugin to an existing [Hardhat](https://hardhat.org/) project: ```shell -npm install @nomicfoundation/hardhat-ignition +npm install @ignored/hardhat-ignition ``` -Modify your Hardhat.config.{ts,js} file, to include Ignition: +Modify your `hardhat.config.{ts,js}` file, to include Ignition: ```javascript // ... -import "@nomicfoundation/hardhat-ignition"; +import "@ignored/hardhat-ignition"; ``` ## Getting Started @@ -29,6 +29,11 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Creating recipes for deployment](./docs/creating-recipes-for-deployment.md) +### Examples + +- [Simple](./examples/simple/README.md) +- [ENS](./examples/ens/README.md) + ## Contributing Contributions are always welcome! Feel free to open any issue or send a pull request. diff --git a/docs/creating-recipes-for-deployment.md b/docs/creating-modules-for-deployment.md similarity index 57% rename from docs/creating-recipes-for-deployment.md rename to docs/creating-modules-for-deployment.md index b5b664000c..10c1ab63d0 100644 --- a/docs/creating-recipes-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -1,23 +1,23 @@ -# Creating Recipes for Deployments +# Creating Modules for Deployments -An **Ingition** deployment is composed of recipes. A recipe is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). +An **Ignition** deployment is composed of modules. A module is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). -For example, this is a minimal recipe `MyRecipe` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyRecipe`: +For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: ```javascript -// ./ignition/MyRecipe.ts -import { buildRecipe, RecipeBuilder } from "@nomicfoundation/hardhat-ignition"; +// ./ignition/MyModule.js +const { buildModule } = require("@ignored/hardhat-ignition"); -export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { +module.exports = buildModule("MyModule", (m) => { const token = m.contract("Token"); return { token }; }); ``` -Recipes can be deployed directly at the cli (with `npx hardhat deploy ./ignition/MyRecipe.ts`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Recipes to allow for complex deployments. +Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. -During a deployment **Ignition** uses the recipe to generate an execution plan of the transactions to run and the order and dependency in which to run them. A recipe uses the passed `RecipeBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. +During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `RecipeBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. ## Deploying a contract @@ -50,16 +50,14 @@ const b = m.contract("B", { }); ``` -You can think of this as `b` being analogue to a promise of an address, although futures are not promises. +You can think of this as `b` being the equivalent of a promise of an address, although futures are not promises. -### Executing a method in a contract +If a contract does not directly depend through arguments on another contract, a dependency (don't deploy `b` until `a` is successfully deployed) can still be created using the `after` array of options: ```tsx -const token = m.contract("Token"); -const exchange = m.contract("Exchange"); - -m.call(exchange, "addToken", { - args: [token], +const a = m.contract("A"); +const b = m.contract("B", { + after: [a], }); ``` @@ -81,7 +79,7 @@ To allow you to use your own mechanism for getting the contract artifact, `contr ```javascript const artifact = await this.hre.artifacts.readArtifact("Foo"); -const userRecipe = buildRecipe("MyRecipe", (m) => { +const userModule = buildModule("MyModule", (m) => { m.contract("Foo", artifact, { args: [0], }); @@ -103,12 +101,25 @@ const contract = m.contract("Contract", { A library is deployed in the same way as a contract. -### Using the network chain id +## Executing a method on a contract + +Not all contract configuration happens via the constructor. To configure a contract calls can be made: + +```tsx +const token = m.contract("Token"); +const exchange = m.contract("Exchange"); + +m.call(exchange, "addToken", { + args: [token], +}); +``` + +## Using the network chain id The recipe builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. ```tsx -const userRecipe = buildRecipe("MyRecipe", (m) => { +const userModule = buildModule("MyModule", (m) => { const daiAddresses = { 1: "0x123...", // mainnet DAI 4: "0x234...", // rinkeby DAI @@ -121,61 +132,51 @@ const userRecipe = buildRecipe("MyRecipe", (m) => { }); ``` -### Recipe Parameters +## Module Parameters -Recipes can have parameters that are accessed using the RecipeBuilder object: +Modules can have parameters that are accessed using the RecipeBuilder object: ```tsx const symbol = m.getParam("tokenSymbol"); const name = m.getParam("tokenName"); + const token = m.contract("Token", { args: [symbol, name, 1_000_000], }); ``` -When a recipe is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: +When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: ```tsx const symbol = m.getOptionalParam("tokenSymbol", "TKN"); ``` -## Modules +## Modules within modules -Similarly to creating and using Recipes with `buildRecipe(...)` and `m.useRecipe(...)`, you may also choose to create and use Modules using `buildModule(...)` and `m.useModule(...)`: +Modules can be deployed and consumed within other modules via `m.useModule(...)`: ```tsx -// ./ignition/MyRecipe.ts -import { - buildRecipe, - buildModule, - RecipeBuilder, -} from "@nomicfoundation/hardhat-ignition"; - -const myModule = buildModule("MyModule", (m: RecipeBuilder) => { - const symbol = m.getParam("tokenSymbol"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); +module.exports = buildModule("`TEST` registrar", (m) => { + const tld = "test"; + const tldHash = namehash.hash(tld); + const tldLabel = labelhash(tld); - return { token }; -}); + const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); -export default buildRecipe("MyRecipe", (m: RecipeBuilder) => { - const { token } = m.useModule(myModule, { - parameters: { - tokenName: "EXAMPLE", - tokenSymbol: "XMPL", - }, + // Setup registrar + const registrar = m.contract("FIFSRegistrar", { + args: [ens, tldHash], }); - return { token }; + m.call(ens, "setSubnodeOwner", { + id: "set sub-node owner for registrar", + args: [ZERO_HASH, tldLabel, ACCOUNT_0], + }); + + return { ens, resolver, registrar, reverseRegistrar }; }); ``` -The difference in using a Module instead of a Recipe is that, no matter how many times you invoke a given module via `m.useModule(...)`, that module will only be executed one time, with the results cached internally and returned for subsequent invocations. - -To enforce this, there are two rules that must be followed when creating modules: +Calls to `useModule` memoize the results object, assuming the same parameters are passed. Multiple calls to the same module with different parameters are banned. -- Parameters passed into subsequent calls of `m.useModule(...)` must match the parameters used for the first invocation of a given module -- Only `CallableFuture` types can be returned when building a module (i.e. contracts or libraries) +Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). diff --git a/docs/design.md b/docs/design.md index 9d295d1e11..0631caf50f 100644 --- a/docs/design.md +++ b/docs/design.md @@ -17,7 +17,7 @@ flowchart LR 1 --> 2 2 --> 3 3 --> 4 - ``` +``` Ignition expresses a deployment as a dependency graph of on-chain transactions, that is, contract deployments and contract calls. Deployments and calls can be dependent on each other. A call to a contract requires that that contract first be deployed; the call should not be invoked until the contract deploy has completed entirely and successfully. @@ -162,27 +162,34 @@ More than one transaction can be submitted to the Ethereum chain at once. A **de To simplify user reasoning about the order of execution, the execution engine groups into batches. A batch is the next set of transactions to submit. Batches are submitted until there is an error or all transactions are complete. ```javascript - let unstarted = getVertexesFrom(executionGraph) - let onHold = [] - let errors = [] - let completed = [] - - let buildBatch = (unstarted, completed) => unstarted.filter(v => allDependenciesCompleted(v, executionGraph, completed)) - - while (unstarted.length > 0) { - const batch = buildBatch(unstarted.concat(onHold), completed) - - const { errors: batchErrors, completed: batchCompleted, onhold: batchOnhold } = await executeBatch(batch) - - onHold = batchOnHold; - removeFrom(unstarted, batchCompleted) - addTo(completed, batchCompleted) - - addTo(errors, batchErrors) - if (errors.length > 0) { - break; - } +let unstarted = getVertexesFrom(executionGraph); +let onHold = []; +let errors = []; +let completed = []; + +let buildBatch = (unstarted, completed) => + unstarted.filter((v) => + allDependenciesCompleted(v, executionGraph, completed) + ); + +while (unstarted.length > 0) { + const batch = buildBatch(unstarted.concat(onHold), completed); + + const { + errors: batchErrors, + completed: batchCompleted, + onhold: batchOnhold, + } = await executeBatch(batch); + + onHold = batchOnHold; + removeFrom(unstarted, batchCompleted); + addTo(completed, batchCompleted); + + addTo(errors, batchErrors); + if (errors.length > 0) { + break; } +} ``` A batch is constructed by looking at all unstarted or on-hold vertexes and using the `ExecutionGraph` to determine if all there dependencies have been met (executed successfully). diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 437cb15901..0d89d0d7c8 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -2,63 +2,88 @@ ## Setup +This guide assumes you are starting with the Hardhat Javascript project as covered in the [Hardhat quick start](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start). + +```shell +$ npx hardhat +888 888 888 888 888 +888 888 888 888 888 +888 888 888 888 888 +8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 +888 888 "88b 888P" d88" 888 888 "88b "88b 888 +888 888 .d888888 888 888 888 888 888 .d888888 888 +888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. +888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 + +👷 Welcome to Hardhat v2.9.9 👷‍ + +? What do you want to do? … +❯ Create a JavaScript project + Create a TypeScript project + Create an empty hardhat.config.js + Quit +``` + Add **Ignition** to your **Hardhat** project by installing the plugin: ```shell -npm install @nomicfoundation/hardhat-ignition +npm install @ignored/hardhat-ignition ``` -Modify your `Hardhat.config.{ts,js}` file, to include **Ignition**: +Modify your `hardhat.config.js` file, to include **Ignition**: ```javascript -import { HardhatUserConfig, task } from "hardhat/config"; +require("@nomicfoundation/hardhat-toolbox"); // ... -import "@nomicfoundation/hardhat-ignition"; +require("@ignored/hardhat-ignition"); ``` -Create an `./ignition` folder in your project root to contain your deployment recipes. +Create an `./ignition` folder in your project root to contain your deployment modules. ```shell mkdir ./ignition ``` -## Write a deployment Recipe +## Write a deployment module -Add a deployment recipe under the `./ignition` folder: +Add a deployment module under the `./ignition` folder for the example `Lock.sol` contract: -```typescript -// ./ignition/MyRecipe.ts +```js +// ./ignition/LockModule.js +const { buildModule } = require("@ignored/hardhat-ignition"); -import { buildRecipe } from "@nomicfoundation/hardhat-ignition"; +const JAN_01_2100 = 4102491600; -export default buildRecipe("MyRecipe", (m) => { - const token = m.contract("Token"); +module.exports = buildModule("LockModule", (m) => { + const unlockTime = m.getOptionalParam("unlockTime", JAN_01_2100); - return { token }; + const lock = m.contract("Lock", { args: [unlockTime] }); + + return { lock }; }); ``` -Run the `deploy` task to test the recipe against a local ephemeral **Hardhat** node: +Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): ```shell -npx hardhat deploy MyRecipe.ts -# No need to generate any newer typings. -# Token contract address 0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 +npx hardhat deploy LockModule.js ``` -To deploy against a network configured in `hardhat.config.{ts,js}` pass the network name: +Parameters can be passed as a flag at the command line via a json string: ```shell -npx hardhat deploy --network mainnet ./ignition/MyRecipe.ts +npx hardhat deploy --parameters "{\"unlockTime\":4102491600}" LockModule.js +# Ensure you have properly escaped the json string ``` -Recipes that accept parameters can be passed those parameters at the command line via a json string: +To deploy against a local hardhat node: ```shell -npx hardhat deploy --parameters "{\"IncAmount\": 5}" ParamRecipe.js -# Ensure you have properly escaped the json string +npx hardhat node +// in another terminal +npx hardhat deploy --network localhost LockModule.js ``` -Next, dig deeper into defining recipes: +Next, dig deeper into defining modules: -[Creating recipes for deployment](./creating-recipes-for-deployment.md) +[Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/examples/ens/hardhat.config.js b/examples/ens/hardhat.config.js index 6afaf1c444..1c2232b7f9 100644 --- a/examples/ens/hardhat.config.js +++ b/examples/ens/hardhat.config.js @@ -1,4 +1,4 @@ -require("@nomicfoundation/hardhat-ignition"); +require("@ignored/hardhat-ignition"); /** * @type import('hardhat/config').HardhatUserConfig diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 568cc14214..8ed101291d 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); +const { buildRecipe, buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; @@ -66,7 +66,7 @@ const setupReverseRegistrar = buildRecipe("REVERSEREGISTRAR", (m) => { return { reverseRegistrar }; }); -module.exports = buildRecipe("ENS", (m) => { +module.exports = buildModule("ENS", (m) => { const owner = ACCOUNT_0; const ens = m.contract("ENSRegistry"); diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js index bde2388286..835e260738 100644 --- a/examples/ens/ignition/test-registrar.js +++ b/examples/ens/ignition/test-registrar.js @@ -1,4 +1,4 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const setupENSRegistry = require("./ENS"); @@ -11,12 +11,12 @@ const ZERO_HASH = const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -module.exports = buildRecipe("`TEST` registrar", (m) => { +module.exports = buildModule("`TEST` registrar", (m) => { const tld = "test"; const tldHash = namehash.hash(tld); const tldLabel = labelhash(tld); - const { ens, resolver, reverseRegistrar } = m.useRecipe(setupENSRegistry); + const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); // Setup registrar const registrar = m.contract("FIFSRegistrar", { diff --git a/examples/ens/package.json b/examples/ens/package.json index 76188b098e..7273db9731 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ens-example", - "private": "true", + "private": true, "version": "0.0.1", "scripts": { "test:examples": "hardhat test", @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@nomicfoundation/hardhat-ignition": "^0.0.2" + "@ignored/hardhat-ignition": "^0.0.2" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/simple-ts/.gitignore b/examples/simple-ts/.gitignore deleted file mode 100644 index f1462f7a56..0000000000 --- a/examples/simple-ts/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -artifacts/ -cache/ -deployments/ diff --git a/examples/simple-ts/contracts/Multisig.sol b/examples/simple-ts/contracts/Multisig.sol deleted file mode 100644 index 37af3588c8..0000000000 --- a/examples/simple-ts/contracts/Multisig.sol +++ /dev/null @@ -1,318 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract MultiSigWallet { - - event Confirmation(address indexed sender, uint indexed transactionId); - event Revocation(address indexed sender, uint indexed transactionId); - event Submission(uint indexed transactionId); - event Execution(uint indexed transactionId); - event ExecutionFailure(uint indexed transactionId); - event Deposit(address indexed sender, uint value); - event OwnerAddition(address indexed owner); - event OwnerRemoval(address indexed owner); - event RequirementChange(uint required); - - uint constant public MAX_OWNER_COUNT = 50; - - mapping (uint => Transaction) public transactions; - mapping (uint => mapping (address => bool)) public confirmations; - mapping (address => bool) public isOwner; - address[] public owners; - uint public required; - uint public transactionCount; - - struct Transaction { - address destination; - uint value; - bytes data; - bool executed; - } - - modifier onlyWallet() { - require(msg.sender == address(this)); - _; - } - - modifier ownerDoesNotExist(address owner) { - require(!isOwner[owner]); - _; - } - - modifier ownerExists(address owner) { - require(isOwner[owner]); - _; - } - - modifier transactionExists(uint transactionId) { - require(transactions[transactionId].destination != address(0)); - _; - } - - modifier confirmed(uint transactionId, address owner) { - require(confirmations[transactionId][owner]); - _; - } - - modifier notConfirmed(uint transactionId, address owner) { - require(!confirmations[transactionId][owner]); - _; - } - - modifier notExecuted(uint transactionId) { - require(!transactions[transactionId].executed); - _; - } - - modifier notNull(address _address) { - require(_address != address(0)); - _; - } - - modifier validRequirement(uint ownerCount, uint _required) { - require(ownerCount <= MAX_OWNER_COUNT - && _required <= ownerCount - && _required != 0 - && ownerCount != 0); - _; - } - - receive() - external payable - { - if (msg.value > 0) - emit Deposit(msg.sender, msg.value); - } - - constructor(address[] memory _owners, uint _required) - validRequirement(_owners.length, _required) - { - for (uint i=0; i<_owners.length; i++) { - require(!isOwner[_owners[i]] && _owners[i] != address(0)); - isOwner[_owners[i]] = true; - } - owners = _owners; - required = _required; - } - - function addOwner(address owner) - public - onlyWallet - ownerDoesNotExist(owner) - notNull(owner) - validRequirement(owners.length + 1, required) - { - isOwner[owner] = true; - owners.push(owner); - emit OwnerAddition(owner); - } - - function removeOwner(address owner) - public - onlyWallet - ownerExists(owner) - { - isOwner[owner] = false; - for (uint i=0; i owners.length) - changeRequirement(owners.length); - emit OwnerRemoval(owner); - } - - function replaceOwner(address owner, address newOwner) - public - onlyWallet - ownerExists(owner) - ownerDoesNotExist(newOwner) - { - for (uint i=0; i { - public async execute( - input: { - multiSigWalletAddress: string | { address: string }; - contractName: string; - destination: string | { address: string }; - method: string; - args: unknown[]; - }, - services: Services - ): Promise { - const multiSigWalletArtifact = await services.artifacts.getArtifact( - "MultiSigWallet" - ); - const multiSigWalletAddress = - typeof input.multiSigWalletAddress === "string" - ? input.multiSigWalletAddress - : input.multiSigWalletAddress.address; - const destinationAddress = - typeof input.destination === "string" - ? input.destination - : input.destination.address; - - const contractArtifact = await services.artifacts.getArtifact( - input.contractName - ); - const Factory = new ethers.Contract( - destinationAddress, - contractArtifact.abi - ); - - const txData = Factory.interface.encodeFunctionData( - input.method, - input.args - ); - - const multisigTx = await services.contracts.call( - multiSigWalletAddress, - multiSigWalletArtifact.abi, - "submitTransaction", - [destinationAddress, 0, txData] - ); - - const submissionLog = await services.contracts.getLog( - multisigTx, - "Submission", - multiSigWalletAddress, - multiSigWalletArtifact.abi - ); - - const { transactionId } = submissionLog.args; - - const isConfirmed = await services.contracts.staticCall( - multiSigWalletAddress, - multiSigWalletArtifact.abi, - "isConfirmed", - [transactionId] - ); - - if (!isConfirmed) { - throw new Hold(`Waiting for multisig to confirm ${transactionId}`); - } - - return multisigTx; - } - - public async validate(input: {}, services: Services): Promise { - return []; - } - - public getDescription() { - return "Deploy contract with multisig and timelock"; - } -} - -class MultisigContractFuture extends InternalFuture< - MultiSigContractOptions, - string -> { - public getDependencies(): InternalFuture[] { - return [ - this.input.multiSigWalletAddress, - this.input.destination, - ...this.input.args, - ].filter((x): x is InternalFuture => { - return InternalFuture.isFuture(x); - }); - } -} - -function callFromMultisig( - m: RecipeBuilder, - multisig: AddressLike, - contractName: string, - destination: AddressLike, - method: string, - options: CallFromMultisigOptions -): Future { - const id = options.id; - const args = options?.args ?? []; - const b = new MultisigContractFuture(m.getRecipeId(), id, { - multiSigWalletAddress: multisig, - contractName, - destination, - method, - args, - }); - - m.addExecutor(new MultisigContractExecutor(b)); - - return b; -} - -export default buildRecipe("Multisig", (m) => { - const multisig = m.contract("MultiSigWallet", { - args: [ - [ - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", - ], - 2, - ], - }); - - const owned = m.contract("Owned", { - args: [multisig], - }); - - const tx = callFromMultisig(m, multisig, "Owned", owned, "inc", { - id: "Owned.inc", - }); - - return { multisig, tx, owned }; -}); diff --git a/examples/simple-ts/ignition/MultisigAndTimelock.ts b/examples/simple-ts/ignition/MultisigAndTimelock.ts deleted file mode 100644 index 80ad6bd044..0000000000 --- a/examples/simple-ts/ignition/MultisigAndTimelock.ts +++ /dev/null @@ -1,247 +0,0 @@ -import { ethers } from "ethers"; -import { - ContractFuture, - buildRecipe, - RecipeBuilder, - InternalFuture, - Executor, - Services, - Future, - Hold, -} from "@nomicfoundation/hardhat-ignition"; - -interface CallFromMultisigAndTimelockOptions { - id: string; - args?: any[]; -} - -interface MultiSigContractOptions { - multisig: ContractFuture; - timelock: ContractFuture; - destination: ContractFuture; - method: string; - args: unknown[]; -} - -class MultisigAndTimelockExecutor extends Executor< - MultiSigContractOptions, - string -> { - public async execute( - input: { - multisig: { abi: any[]; address: string }; - timelock: { abi: any[]; address: string }; - destination: { abi: any[]; address: string }; - method: string; - args: unknown[]; - }, - services: Services - ): Promise { - const zeroBytes32 = ethers.utils.formatBytes32String(""); - - // contracts instances - const contractToCall = new ethers.Contract( - input.destination.address, - input.destination.abi - ); - const timelock = new ethers.Contract( - input.timelock.address, - input.timelock.abi - ); - - // function to call to timelocked contract - const txData = contractToCall.interface.encodeFunctionData( - input.method, - input.args - ); - - const timelockParameters = [ - input.destination.address, - 0, - txData, - zeroBytes32, - zeroBytes32, - ]; - - // send timelocked tx to multisig - const scheduleTxData = timelock.interface.encodeFunctionData("schedule", [ - ...timelockParameters, - 15, - ]); - - console.log("[MultisigAndTimelockExecutor] submit schedule tx"); - const multisigScheduleTx = await services.contracts.call( - input.multisig.address, - input.multisig.abi, - "submitTransaction", - [input.timelock.address, 0, scheduleTxData], - { gasLimit: 5000000 } - ); - - const multisigScheduleSubmissionLog = await services.contracts.getLog( - multisigScheduleTx, - "Submission", - input.multisig.address, - input.multisig.abi - ); - - const { transactionId: multisigScheduleTxId } = - multisigScheduleSubmissionLog.args; - - // wait until the multisig schedule is confirmed - const isScheduleConfirmed = await services.contracts.staticCall( - input.multisig.address, - input.multisig.abi, - "isConfirmed", - [multisigScheduleTxId] - ); - - if (!isScheduleConfirmed) { - throw new Hold( - `Waiting for multisig to confirm the schedule, tx id is '${multisigScheduleTxId}'` - ); - } - - // wait until the wait time passes - const timelockCallId = await services.contracts.staticCall( - input.timelock.address, - input.timelock.abi, - "hashOperation", - timelockParameters - ); - - const isReady = await services.contracts.staticCall( - input.timelock.address, - input.timelock.abi, - "isOperationReady", - [timelockCallId] - ); - const isDone = await services.contracts.staticCall( - input.timelock.address, - input.timelock.abi, - "isOperationDone", - [timelockCallId] - ); - - if (!isReady && !isDone) { - throw new Hold( - `Waiting for timelock's tx '${timelockCallId} to be ready'` - ); - } - - // execute the timelocked tx through the multisig - const executeTxData = timelock.interface.encodeFunctionData( - "execute", - timelockParameters - ); - - console.log("[MultisigAndTimelockExecutor] submit execute tx"); - const multisigExecuteTx = await services.contracts.call( - input.multisig.address, - input.multisig.abi, - "submitTransaction", - [input.timelock.address, 0, executeTxData], - { gasLimit: 5000000 } - ); - - const multisigExecuteSubmissionLog = await services.contracts.getLog( - multisigExecuteTx, - "Submission", - input.multisig.address, - input.multisig.abi - ); - - const { transactionId: multisigExecuteTxId } = - multisigExecuteSubmissionLog.args; - - // wait until the multisig execute is confirmed - const isConfirmed = await services.contracts.staticCall( - input.multisig.address, - input.multisig.abi, - "isConfirmed", - [multisigExecuteTxId] - ); - - if (!isConfirmed) { - throw new Hold( - `Waiting for multisig to confirm the execution of ${multisigExecuteTxId}` - ); - } - - return "done"; - } - - public async validate(input: {}, services: Services): Promise { - return []; - } - - public getDescription() { - return "Deploy contract with multisig and timelock"; - } -} - -class MultisigAndTimelockFuture extends InternalFuture< - MultiSigContractOptions, - string -> { - public getDependencies(): InternalFuture[] { - return [ - this.input.multisig, - this.input.timelock, - this.input.destination, - ...this.input.args, - ].filter((x): x is InternalFuture => { - return InternalFuture.isFuture(x); - }); - } -} - -function callFromMultisigAndTimelock( - m: RecipeBuilder, - multisig: ContractFuture, - timelock: ContractFuture, - destination: ContractFuture, - method: string, - options: CallFromMultisigAndTimelockOptions -): Future { - const id = options.id; - const args = options?.args ?? []; - const b = new MultisigAndTimelockFuture(m.getRecipeId(), id, { - multisig, - timelock, - destination, - method, - args, - }); - - m.addExecutor(new MultisigAndTimelockExecutor(b)); - - return b; -} - -export default buildRecipe("MultisigAndTimelock", (m) => { - const multisig = m.contract("MultiSigWallet", { - args: [ - [ - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", - "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", - "0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc", - ], - 2, - ], - }); - - const timelock = m.contract("TimelockController", { - args: [15, [multisig], [multisig]], - }); - - const owned = m.contract("Owned", { - args: [timelock], - }); - - callFromMultisigAndTimelock(m, multisig, timelock, owned, "inc", { - id: "Owned.inc", - }); - - return { owned }; -}); diff --git a/examples/simple-ts/ignition/Timelock.ts b/examples/simple-ts/ignition/Timelock.ts deleted file mode 100644 index 76c1609d08..0000000000 --- a/examples/simple-ts/ignition/Timelock.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ethers } from "ethers"; -import { - ContractFuture, - buildRecipe, - RecipeBuilder, - InternalFuture, - Executor, - Contract, - Services, - Hold, -} from "@nomicfoundation/hardhat-ignition"; - -class TimelockCallExecutor extends Executor { - public async execute( - input: { - timelock: Contract; - contract: Contract; - method: string; - args: any[]; - }, - services: Services - ): Promise { - const Factory = new ethers.Contract( - input.contract.address, - input.contract.abi - ); - - const txData = Factory.interface.encodeFunctionData( - input.method, - input.args - ); - - const zeroBytes32 = ethers.utils.formatBytes32String(""); - - const timelockTxHash = await services.contracts.call( - input.timelock.address, - input.timelock.abi, - "schedule", - [input.contract.address, 0, txData, zeroBytes32, zeroBytes32, 15] - ); - - const scheduleLog = await services.contracts.getLog( - timelockTxHash, - "CallScheduled", - input.timelock.address, - input.timelock.abi - ); - - const { id } = scheduleLog.args; - - const isReady = await services.contracts.staticCall( - input.timelock.address, - input.timelock.abi, - "isOperationReady", - [id] - ); - - if (!isReady) { - throw new Hold(`Waiting for timelock's tx '${id} to be ready'`); - } - - const executeTx = await services.contracts.call( - input.timelock.address, - input.timelock.abi, - "execute", - [input.contract.address, 0, txData, zeroBytes32, zeroBytes32] - ); - - return executeTx; - } - - public async validate( - input: TimelockCallOptions, - services: Services - ): Promise { - return []; - } - - public getDescription() { - return "Deploy contract with timelock"; - } -} - -interface TimelockCallOptions { - timelock: ContractFuture; - contract: ContractFuture; - method: string; -} - -class TimelockCallFuture extends InternalFuture { - public getDependencies(): InternalFuture[] { - return [this.input.timelock, this.input.contract].filter( - (x): x is InternalFuture => { - return InternalFuture.isFuture(x); - } - ); - } -} - -function callFromTimelock( - m: RecipeBuilder, - timelock: ContractFuture, - contract: ContractFuture, - method: string, - options: { id: string } -): TimelockCallFuture { - const id = options.id; - const b = new TimelockCallFuture(m.getRecipeId(), id, { - timelock, - contract, - method, - }); - - m.addExecutor(new TimelockCallExecutor(b)); - - return b; -} - -export default buildRecipe("Timelock", (m) => { - const timelock = m.contract("TimelockController", { - args: [ - 15, - ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], - ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], - ], - }); - - const owned = m.contract("Owned", { - args: [timelock], - }); - - callFromTimelock(m, timelock, owned, "inc", { - id: "Owned.inc", - }); - - return { owned }; -}); diff --git a/examples/simple-ts/package.json b/examples/simple-ts/package.json deleted file mode 100644 index a96c48bfac..0000000000 --- a/examples/simple-ts/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "hardhat-ignition-example-simple-ts", - "version": "0.0.1", - "private": true, - "dependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomicfoundation/hardhat-ignition": "^0.0.2", - "@openzeppelin/contracts": "^4.3.2", - "@types/chai": "^4.2.22", - "@types/mocha": "^9.0.0", - "@types/node": "^16.11.1", - "chai": "^4.3.4", - "ethers": "^5.4.7", - "hardhat": "^2.10.0", - "ts-node": "^10.3.0", - "typescript": "^4.7.4" - }, - "devDependencies": { - "ts-node": "^10.3.0" - } -} diff --git a/examples/simple-ts/scripts/multisig-and-timelock.ts b/examples/simple-ts/scripts/multisig-and-timelock.ts deleted file mode 100644 index fc4daf808d..0000000000 --- a/examples/simple-ts/scripts/multisig-and-timelock.ts +++ /dev/null @@ -1,16 +0,0 @@ -import hre from "hardhat"; - -import MultisigAndTimelock from "../ignition/MultisigAndTimelock" - -async function main() { - const { owned } = await hre.ignition.deploy(MultisigAndTimelock) - - console.log((await owned.count()).toString()); -} - -main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); diff --git a/examples/simple-ts/scripts/multisig.ts b/examples/simple-ts/scripts/multisig.ts deleted file mode 100644 index d317b1baa6..0000000000 --- a/examples/simple-ts/scripts/multisig.ts +++ /dev/null @@ -1,16 +0,0 @@ -import hre from "hardhat"; - -import Multisig from "../ignition/Multisig" - -async function main() { - const { owned } = await hre.ignition.deploy(Multisig) - - console.log((await owned.count()).toString()); -} - -main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); diff --git a/examples/simple-ts/scripts/timelock.ts b/examples/simple-ts/scripts/timelock.ts deleted file mode 100644 index 7c108fa4ae..0000000000 --- a/examples/simple-ts/scripts/timelock.ts +++ /dev/null @@ -1,16 +0,0 @@ -import hre from "hardhat"; - -import Timelock from "../ignition/Timelock" - -async function main() { - const { owned } = await hre.ignition.deploy(Timelock) - - console.log((await owned.count()).toString()); -} - -main() - .then(() => process.exit(0)) - .catch(error => { - console.error(error); - process.exit(1); - }); diff --git a/examples/simple-ts/tsconfig.json b/examples/simple-ts/tsconfig.json deleted file mode 100644 index ade635cb80..0000000000 --- a/examples/simple-ts/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es2018", - "module": "commonjs", - "strict": true, - "esModuleInterop": true, - "outDir": "dist" - }, - "include": ["./scripts", "./test"], - "files": ["./hardhat.config.ts"] -} diff --git a/examples/simple/README.md b/examples/simple/README.md new file mode 100644 index 0000000000..b9959d7d94 --- /dev/null +++ b/examples/simple/README.md @@ -0,0 +1,21 @@ +# Simple Example for Ignition + +This hardhat project is an example of using ignition to deploy a simple set of contracts. + +See the + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy Simple.js --parameters "{\"IncAmount\": 42}" +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` diff --git a/examples/simple/contracts/Foo.sol b/examples/simple/contracts/Foo.sol deleted file mode 100644 index 11879a721d..0000000000 --- a/examples/simple/contracts/Foo.sol +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "hardhat/console.sol"; - -contract Foo { - uint public x = 10; - - function inc(uint n) public { - require(n > 0, "n must be positive"); - x+=n; - } -} - -contract Bar { - address public a; - - constructor (address _a) {a=_a;} -} - -contract Qux { - address public a; - - constructor (address _a, uint n) { - require(n > 0, "n must be positive"); - a=_a; - } -} diff --git a/examples/simple/contracts/Simple.sol b/examples/simple/contracts/Simple.sol new file mode 100644 index 0000000000..ab1c9e455e --- /dev/null +++ b/examples/simple/contracts/Simple.sol @@ -0,0 +1,13 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +import "hardhat/console.sol"; + +contract Simple { + uint256 public count = 10; + + function inc(uint256 n) public { + require(n > 0, "n must be positive"); + count += n; + } +} diff --git a/examples/simple/deploy.js b/examples/simple/deploy.js deleted file mode 100644 index ef7a05c848..0000000000 --- a/examples/simple/deploy.js +++ /dev/null @@ -1,13 +0,0 @@ -async function main() { - const { foo, bar } = await ignition.deploy(require("./ignition/MyRecipe")); - - console.log("Foo:", foo.address); - console.log("Bar:", bar.address); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/examples/simple/hardhat.config.js b/examples/simple/hardhat.config.js index fddc711f27..feb9f3fc4f 100644 --- a/examples/simple/hardhat.config.js +++ b/examples/simple/hardhat.config.js @@ -1,4 +1,4 @@ -require("@nomicfoundation/hardhat-ignition"); +require("@ignored/hardhat-ignition"); module.exports = { solidity: "0.8.5", diff --git a/examples/simple/ignition/MyModule.js b/examples/simple/ignition/MyModule.js deleted file mode 100644 index feafbd5b2a..0000000000 --- a/examples/simple/ignition/MyModule.js +++ /dev/null @@ -1,20 +0,0 @@ -const { - buildRecipe, - buildModule, -} = require("@nomicfoundation/hardhat-ignition"); - -const myModule = buildModule("MyModule", (m) => { - const foo = m.contract("Foo"); - - const bar = m.contract("Bar", { args: [foo] }); - - return { foo, bar }; -}); - -module.exports = buildRecipe("MyRecipe", (m) => { - const { foo, bar } = m.useModule(myModule); - - const qux = m.contract("Qux", { args: [foo, 1] }); - - return { foo, bar, qux }; -}); diff --git a/examples/simple/ignition/MyRecipe.js b/examples/simple/ignition/MyRecipe.js deleted file mode 100644 index 20f99da082..0000000000 --- a/examples/simple/ignition/MyRecipe.js +++ /dev/null @@ -1,13 +0,0 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); - -module.exports = buildRecipe("MyRecipe", (m) => { - const foo = m.contract("Foo"); - - const bar = m.contract("Bar", { args: [foo] }); - - const qux = m.contract("Qux", { args: [foo, 1] }); - - // m.call(foo, "inc", { args: [0], after: [bar] }); - - return { foo, bar, qux }; -}); diff --git a/examples/simple/ignition/ParamRecipe.js b/examples/simple/ignition/ParamRecipe.js deleted file mode 100644 index 629c915695..0000000000 --- a/examples/simple/ignition/ParamRecipe.js +++ /dev/null @@ -1,13 +0,0 @@ -const { buildRecipe } = require("@nomicfoundation/hardhat-ignition"); - -module.exports = buildRecipe("ParamRecipe", (m) => { - const incAmount = m.getParam("IncAmount"); - - const foo = m.contract("Foo"); - - m.call(foo, "inc", { - args: [incAmount], - }); - - return { foo }; -}); diff --git a/examples/simple/ignition/Simple.js b/examples/simple/ignition/Simple.js new file mode 100644 index 0000000000..9c059568cd --- /dev/null +++ b/examples/simple/ignition/Simple.js @@ -0,0 +1,13 @@ +const { buildModule } = require("@ignored/hardhat-ignition"); + +module.exports = buildModule("Simple", (m) => { + const incAmount = m.getParam("IncAmount"); + + const simple = m.contract("Simple"); + + m.call(simple, "inc", { + args: [incAmount], + }); + + return { simple }; +}); diff --git a/examples/simple/package.json b/examples/simple/package.json index ed6b32d10c..ad9b08c75b 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -1,13 +1,17 @@ { - "name": "hardhat-ignition-example-simple", - "version": "0.0.1", + "name": "@nomicfoundation/ignition-multisig-example", "private": true, + "version": "0.0.1", "scripts": { - "test:examples": "hardhat test" + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@nomicfoundation/hardhat-ignition": "^0.0.2" + "@ignored/hardhat-ignition": "^0.0.2" }, "devDependencies": { "hardhat": "^2.10.0" diff --git a/examples/simple/script.js b/examples/simple/script.js deleted file mode 100644 index 11164beabc..0000000000 --- a/examples/simple/script.js +++ /dev/null @@ -1,18 +0,0 @@ -const hre = require("hardhat"); - -// const MyRecipe = require("./ignition/MyRecipe") -// const MyOtherRecipe = require("./ignition/MyOtherRecipe") - -async function main() { - const { foo } = await ignition.deploy("MyRecipe"); - - console.log(foo.address); - console.log((await foo.x()).toString()); -} - -main() - .then(() => process.exit(0)) - .catch((error) => { - console.error(error); - process.exit(1); - }); diff --git a/examples/simple/test/myrecipe.test.js b/examples/simple/test/myrecipe.test.js deleted file mode 100644 index b499aace19..0000000000 --- a/examples/simple/test/myrecipe.test.js +++ /dev/null @@ -1,12 +0,0 @@ -const { assert } = require("chai"); -const MyRecipe = require("../ignition/MyRecipe"); - -describe("My Recipe", function () { - it("should be able to deploy and read contracts", async function () { - const { foo } = await ignition.deploy(MyRecipe); - - assert.isDefined(foo); - - assert.equal(await foo.x(), 10); - }); -}); diff --git a/examples/simple/test/paramrecipe.test.js b/examples/simple/test/paramrecipe.test.js deleted file mode 100644 index 36d156c86f..0000000000 --- a/examples/simple/test/paramrecipe.test.js +++ /dev/null @@ -1,16 +0,0 @@ -const { assert } = require("chai"); -const ParamRecipe = require("../ignition/ParamRecipe"); - -describe("Param Recipe", function () { - it("should be able to pass parameters", async function () { - const { foo } = await ignition.deploy(ParamRecipe, { - parameters: { - IncAmount: 42, - }, - }); - - assert.isDefined(foo); - - assert.equal(await foo.x(), 52); - }); -}); diff --git a/examples/simple/test/simple.test.js b/examples/simple/test/simple.test.js new file mode 100644 index 0000000000..387510e7c5 --- /dev/null +++ b/examples/simple/test/simple.test.js @@ -0,0 +1,24 @@ +const { assert } = require("chai"); +const SimpleRecipe = require("../ignition/Simple"); + +describe("Simple", function () { + let simpleContract; + + before(async () => { + const { simple } = await ignition.deploy(SimpleRecipe, { + parameters: { + IncAmount: 42, + }, + }); + + simpleContract = simple; + }); + + it("should return an instantiated ethers contract", async function () { + assert.isDefined(simpleContract); + }); + + it("should have incremented the count with the deployment config call", async function () { + assert.equal(await simpleContract.count(), 52); + }); +}); diff --git a/package.json b/package.json index fdba16a8d4..1121b4f8f5 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,9 @@ "scripts": { "build": "wsrun --exclude-missing --serial build", "lint": "wsrun --exclude-missing --serial lint", + "postlint": "prettier --check ./docs/*.md ./config/eslint/.eslintrc.js", + "lint:fix": "wsrun --exclude-missing --serial lint:fix", + "postlint:fix": "prettier --write ./docs/*.md ./config/eslint/.eslintrc.js", "test": "wsrun --exclude-missing --serial test", "test:coverage": "wsrun --exclude-missing --serial test:coverage", "test:examples": "wsrun --exclude-missing --serial test:examples", @@ -33,6 +36,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", + "prettier": "2.4.1", "typescript": "^4.7.4" } } diff --git a/packages/core/package.json b/packages/core/package.json index c6d2792b17..529a68bf7f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,5 +1,5 @@ { - "name": "@nomicfoundation/ignition-core", + "name": "@ignored/ignition-core", "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 5bcacb8594..c6702f24ef 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -10,9 +10,9 @@ import { Services } from "services/types"; import { DeploymentResult, UpdateUiAction } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; import { ResultsAccumulator } from "types/graph"; +import { Module } from "types/module"; import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; -import { Recipe } from "types/recipeGraph"; import { SerializedFutureResult } from "types/serialization"; import { isDependable } from "utils/guards"; import { serializeFutureOutput } from "utils/serialize"; @@ -32,7 +32,7 @@ export class Ignition { constructor(private _providers: Providers) {} public async deploy( - recipe: Recipe, + ignitionModule: Module, givenOptions?: IgnitionDeployOptions ): Promise<[DeploymentResult, RecipesOutputs]> { log(`Start deploy`); @@ -45,7 +45,7 @@ export class Ignition { }; const deployment = new Deployment( - recipe.name, + ignitionModule.name, Deployment.setupServices(options, this._providers), options.ui ); @@ -54,7 +54,7 @@ export class Ignition { deployment.setChainId(chainId); const { result: constructResult, recipeOutputs } = - await this._constructExecutionGraphFrom(deployment, recipe); + await this._constructExecutionGraphFrom(deployment, ignitionModule); if (constructResult._kind === "failure") { return [constructResult, {}]; @@ -77,7 +77,7 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } - public async plan(recipe: Recipe): Promise { + public async plan(deploymentModule: Module): Promise { log(`Start plan`); const serviceOptions = { @@ -94,7 +94,9 @@ export class Ignition { const chainId = await this._getChainId(); - const { graph: recipeGraph } = generateRecipeGraphFrom(recipe, { chainId }); + const { graph: recipeGraph } = generateRecipeGraphFrom(deploymentModule, { + chainId, + }); const validationResult = await validateRecipeGraph(recipeGraph, services); @@ -118,11 +120,11 @@ export class Ignition { private async _constructExecutionGraphFrom( deployment: Deployment, - recipe: Recipe + ignitionModule: Module ): Promise<{ result: any; recipeOutputs: FutureDict }> { log("Generate recipe graph from recipe"); const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( - recipe, + ignitionModule, { chainId: deployment.state.details.chainId } ); diff --git a/packages/core/src/process/generateRecipeGraphFrom.ts b/packages/core/src/process/generateRecipeGraphFrom.ts index 1e33c22984..97b4158ed9 100644 --- a/packages/core/src/process/generateRecipeGraphFrom.ts +++ b/packages/core/src/process/generateRecipeGraphFrom.ts @@ -1,18 +1,18 @@ import { RecipeGraphBuilder } from "recipe/RecipeGraphBuilder"; import { FutureDict } from "types/future"; +import { Module } from "types/module"; import type { RecipeGraphBuilderOptions, - Recipe, IRecipeGraph, } from "types/recipeGraph"; export function generateRecipeGraphFrom( - recipe: Recipe, + ignitionModule: Module, builderOptions: RecipeGraphBuilderOptions ): { graph: IRecipeGraph; recipeOutputs: FutureDict } { const graphBuilder = new RecipeGraphBuilder(builderOptions); - const recipeOutputs = recipe.recipeAction(graphBuilder); + const recipeOutputs = ignitionModule.moduleAction(graphBuilder); return { graph: graphBuilder.graph, recipeOutputs }; } diff --git a/packages/core/test/recipes.ts b/packages/core/test/modules.ts similarity index 95% rename from packages/core/test/recipes.ts rename to packages/core/test/modules.ts index e20755f115..ff8762bd86 100644 --- a/packages/core/test/recipes.ts +++ b/packages/core/test/modules.ts @@ -16,23 +16,24 @@ import type { import { isArtifactContract, isCall, + isCallable, isDeployedContract, isHardhatContract, isHardhatLibrary, } from "utils/guards"; -describe("Recipes", function () { +describe("Modules", function () { describe("single contract", () => { let recipeGraph: IRecipeGraph; before(() => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleModule = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Example"); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateRecipeGraphFrom(singleModule, { chainId: 31337, }); @@ -85,7 +86,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const twoContractsRecipe = buildRecipe( + const twoContractsModule = buildModule( "two contracts", (m: IRecipeGraphBuilder) => { const example1 = m.contract("Example1"); @@ -95,7 +96,7 @@ describe("Recipes", function () { } ); - const { graph } = generateRecipeGraphFrom(twoContractsRecipe, { + const { graph } = generateRecipeGraphFrom(twoContractsModule, { chainId: 31337, }); @@ -149,7 +150,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const withConstructorArgsRecipe = buildRecipe( + const withConstructorArgsRecipe = buildModule( "withConstructorArgs", (m: IRecipeGraphBuilder) => { const token = m.contract("Token", { @@ -213,7 +214,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const depsBetweenContractsRecipe = buildRecipe( + const depsBetweenContractsRecipe = buildModule( "dependenciesBetweenContracts", (m: IRecipeGraphBuilder) => { const a = m.contract("A"); @@ -310,7 +311,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const callRecipe = buildRecipe("call", (m: IRecipeGraphBuilder) => { + const callRecipe = buildModule("call", (m: IRecipeGraphBuilder) => { const token = m.contract("Token"); const exchange = m.contract("Exchange"); const another = m.contract("Another"); @@ -470,7 +471,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const uniswapRecipe = buildRecipe("Uniswap", (m: IRecipeGraphBuilder) => { + const uniswapRecipe = buildModule("Uniswap", (m: IRecipeGraphBuilder) => { const abi = [{}]; const someother = m.contract("Someother"); @@ -526,7 +527,7 @@ describe("Recipes", function () { before(() => { const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; - const fromArtifactRecipe = buildRecipe( + const fromArtifactRecipe = buildModule( "FromArtifact", (m: IRecipeGraphBuilder) => { const someother = m.contract("Someother"); @@ -603,7 +604,7 @@ describe("Recipes", function () { let recipeGraph: IRecipeGraph; before(() => { - const librariesRecipe = buildRecipe( + const librariesRecipe = buildModule( "libraries", (m: IRecipeGraphBuilder) => { const someother = m.contract("Someother"); @@ -701,7 +702,7 @@ describe("Recipes", function () { describe("network chain id", () => { it("should inject the chainId via the builder", () => { - const chainIdRecipe = buildRecipe("chainId", (m: IRecipeGraphBuilder) => { + const chainIdRecipe = buildModule("chainId", (m: IRecipeGraphBuilder) => { if (m.chainId === 42) { return {}; } @@ -715,7 +716,7 @@ describe("Recipes", function () { }); }); - describe("recipe parameters", () => { + describe("module parameters", () => { let recipeGraph: IRecipeGraph; before(() => { @@ -732,15 +733,19 @@ describe("Recipes", function () { } ); - const WrapRecipe = buildRecipe("Wrap", (m) => { + const WrapModule = buildModule("Wrap", (m) => { const { token } = m.useRecipe(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); + if (!isCallable(token)) { + throw new Error("Not callable"); + } + return { token }; }); - const { graph } = generateRecipeGraphFrom(WrapRecipe, { + const { graph } = generateRecipeGraphFrom(WrapModule, { chainId: 31, }); @@ -775,7 +780,7 @@ describe("Recipes", function () { } ); - const WrapRecipe = buildRecipe("Wrap", (m: IRecipeGraphBuilder) => { + const WrapRecipe = buildModule("Wrap", (m: IRecipeGraphBuilder) => { const { token } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -793,7 +798,7 @@ describe("Recipes", function () { recipeGraph = graph; - const DiffParamsRecipe = buildRecipe( + const DiffParamsRecipe = buildModule( "Error", (m: IRecipeGraphBuilder) => { const { token } = m.useModule(librariesRecipe, { @@ -823,7 +828,7 @@ describe("Recipes", function () { } ); - const ReturnTypeRecipe = buildRecipe( + const ReturnTypeRecipe = buildModule( "ReturnsParamRecipe", (m: IRecipeGraphBuilder) => { const { token } = m.useModule(returnTypeModule, { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 6feb8a75a2..ae8c28a6f5 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -2,6 +2,7 @@ import { assert } from "chai"; import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; +import { buildModule } from "recipe/buildModule"; import { buildRecipe } from "recipe/buildRecipe"; import { Artifact } from "types/hardhat"; import type { IRecipeGraphBuilder } from "types/recipeGraph"; @@ -19,7 +20,7 @@ describe("Validation", () => { describe("artifact contract deploy", () => { it("should validate a correct artifact contract deploy", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Example", exampleArtifact); return { example }; @@ -39,7 +40,7 @@ describe("Validation", () => { }); it("should not validate a artifact contract deploy with the wrong number of args", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -75,7 +76,7 @@ describe("Validation", () => { describe("artifact library deploy", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.library("Example", exampleArtifact); return { example }; @@ -95,7 +96,7 @@ describe("Validation", () => { }); it("should not validate a artifact library deploy with the wrong number of args", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.library("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -213,7 +214,7 @@ describe("Validation", () => { }; it("should validate a correct call", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [2] }); @@ -238,7 +239,7 @@ describe("Validation", () => { }); it("should validate an overriden call", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Foo"); m.call(example, "inc(bool,uint256)", { args: [true, 2] }); @@ -263,7 +264,7 @@ describe("Validation", () => { }); it("should fail a call on a nonexistant function", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Foo"); m.call(example, "nonexistant", { args: [] }); @@ -301,7 +302,7 @@ describe("Validation", () => { }); it("should fail a call with wrong number of arguments", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [] }); @@ -339,7 +340,7 @@ describe("Validation", () => { }); it("should fail an overloaded call with wrong number of arguments", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("MyContract"); m.call(example, "inc", { args: [] }); @@ -379,7 +380,7 @@ describe("Validation", () => { describe("deployed contract", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const existing = m.contractAt( "Example", "0x0000000000000000000000000000000000000000", @@ -403,7 +404,7 @@ describe("Validation", () => { }); it("should not validate a deployed contract with an invalid address", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const existing = m.contractAt("Example", "0xBAD", []); return { existing }; @@ -437,7 +438,7 @@ describe("Validation", () => { describe("hardhat contract deploy", () => { it("should validate a correct contract deploy", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.contract("Example"); return { example }; @@ -461,7 +462,7 @@ describe("Validation", () => { }); it("should not validate a contract deploy on a non-existant hardhat contract", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const nonexistant = m.contract("Nonexistant"); return { nonexistant }; @@ -498,7 +499,7 @@ describe("Validation", () => { describe("hardhat library deploy", () => { it("should validate a correct deploy", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const example = m.library("Example"); return { example }; @@ -522,7 +523,7 @@ describe("Validation", () => { }); it("should not validate a library deploy on a non-existant hardhat library", async () => { - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { const nonexistant = m.library("Nonexistant"); return { nonexistant }; @@ -565,10 +566,10 @@ describe("Validation", () => { return { example }; }); - const singleRecipe = buildRecipe("single", (m: IRecipeGraphBuilder) => { - const { example } = m.useRecipe(subrecipe); + const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + m.useRecipe(subrecipe); - return { example }; + return {}; }); const { graph } = generateRecipeGraphFrom(singleRecipe, { diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx index 7ef8e9e904..98576eb8e1 100644 --- a/packages/core/ui-samples/index.tsx +++ b/packages/core/ui-samples/index.tsx @@ -6,7 +6,7 @@ import { RecipeState, } from "../src/deployment-state"; -import { IgnitionUi } from "@nomicfoundation/hardhat-ignition/src/ui/components"; +import { IgnitionUi } from "@ignored/hardhat-ignition/src/ui/components"; import { Example } from "./types"; diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 6d4ca99b9e..6ad3ac8839 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -9,19 +9,19 @@ This plugin brings **Ignition** to your **Hardhat** project, allowing you to orc ## Installation ```bash -npm install --save-dev @nomicfoundation/hardhat-ignition +npm install --save-dev @ignored/hardhat-ignition ``` And add the following statement to your `hardhat.config.js`: ```js -require("@nomicfoundation/hardhat-ignition"); +require("@ignored/hardhat-ignition"); ``` Or, if you are using TypeScript, add this to your `hardhat.config.ts`: ```js -import "@nomicfoundation/hardhat-ignition"; +import "@ignored/hardhat-ignition"; ``` ## Tasks diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3000cedf01..bb039e54a6 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,5 +1,5 @@ { - "name": "@nomicfoundation/hardhat-ignition", + "name": "@ignored/hardhat-ignition", "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", @@ -17,7 +17,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomicfoundation/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", @@ -49,7 +49,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@nomicfoundation/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.10.0" }, diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index edb4a4e232..c1bfdef979 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -2,7 +2,7 @@ import type { ConfigProvider, ExternalParamValue, HasParamResult, -} from "@nomicfoundation/ignition-core"; +} from "@ignored/ignition-core"; export class ConfigWrapper implements ConfigProvider { private parameters: { [key: string]: ExternalParamValue } | undefined; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 5c6a8cbf4d..eaea658727 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -3,8 +3,8 @@ import { IgnitionDeployOptions, Providers, ExternalParamValue, - Recipe, -} from "@nomicfoundation/ignition-core"; + Module, +} from "@ignored/ignition-core"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { renderToCli } from "./ui/renderToCli"; @@ -26,7 +26,7 @@ export class IgnitionWrapper { } public async deploy( - recipe: Recipe, + ignitionModule: Module, deployParams: | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } | undefined @@ -37,7 +37,7 @@ export class IgnitionWrapper { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await this._ignition.deploy(recipe, { + const [deploymentResult] = await this._ignition.deploy(ignitionModule, { ...this._deployOptions, ui: Boolean(deployParams?.ui) ? renderToCli : undefined, }); @@ -87,7 +87,7 @@ export class IgnitionWrapper { return resolvedOutput; } - public async plan(recipe: Recipe) { - return this._ignition.plan(recipe); + public async plan(ignitionModule: Module) { + return this._ignition.plan(ignitionModule); } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 2174d378b0..67ebdfb732 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import "@nomiclabs/hardhat-ethers"; -import { Providers, Recipe } from "@nomicfoundation/ignition-core"; +import { Module, Providers } from "@ignored/ignition-core"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -7,10 +7,10 @@ import path from "path"; import { ConfigWrapper } from "./ConfigWrapper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { Renderer } from "./plan"; -import { loadUserRecipes, loadAllUserRecipes } from "./user-recipes"; +import { loadUserModules, loadAllUserModules } from "./user-recipes"; import "./type-extensions"; -export { buildRecipe, buildModule } from "@nomicfoundation/ignition-core"; +export { buildRecipe, buildModule } from "@ignored/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; @@ -123,11 +123,11 @@ task("deploy") process.exit(0); } - let userRecipes: Recipe[]; + let userRecipes: Module[]; if (userRecipesPaths.length === 0) { - userRecipes = loadAllUserRecipes(hre.config.paths.ignition); + userRecipes = loadAllUserModules(hre.config.paths.ignition); } else { - userRecipes = loadUserRecipes( + userRecipes = loadUserModules( hre.config.paths.ignition, userRecipesPaths ); @@ -155,22 +155,22 @@ task("plan") ) => { await hre.run("compile", { quiet: true }); - let userRecipes: Recipe[]; + let userModules: Module[]; if (userRecipesPaths.length === 0) { - userRecipes = loadAllUserRecipes(hre.config.paths.ignition); + userModules = loadAllUserModules(hre.config.paths.ignition); } else { - userRecipes = loadUserRecipes( + userModules = loadUserModules( hre.config.paths.ignition, userRecipesPaths ); } - if (userRecipes.length === 0) { + if (userModules.length === 0) { console.warn("No Ignition recipes found"); process.exit(0); } - const [recipe] = userRecipes; + const [recipe] = userModules; const plan = await hre.ignition.plan(recipe); diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index ffc21f6cca..dc04075baa 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -1,4 +1,4 @@ -import type { IgnitionPlan } from "@nomicfoundation/ignition-core"; +import type { IgnitionPlan } from "@ignored/ignition-core"; import { exec } from "child_process"; import fs from "fs-extra"; import os from "os"; diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 06d6da1d07..65d4ba8686 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,7 +1,4 @@ -import type { - VertexGraph, - VertexDescriptor, -} from "@nomicfoundation/ignition-core"; +import type { VertexGraph, VertexDescriptor } from "@ignored/ignition-core"; function getVertexes(graph: VertexGraph): VertexDescriptor[] { return [...graph.vertexes.values()]; diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index 75f9cbf3b3..9ddae87029 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { Box, Text } from "ink"; export const ValidationFailedPanel = ({ diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index 23cde06a80..d7c8bfbbf7 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 15089c7725..36a2c9bd62 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { Box } from "ink"; import { BatchExecution } from "./BatchExecution"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 5a47a94e38..ecdfdbe912 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,4 +1,4 @@ -import { DeployState, ExecutionVertex } from "@nomicfoundation/ignition-core"; +import { DeployState, ExecutionVertex } from "@ignored/ignition-core"; import { Box, Text } from "ink"; import { DeploymentError } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 1cdfe5373e..200746bcea 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { Box, Text } from "ink"; export const SummarySection = ({ diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index 2b389191a4..63fa545adc 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { StartingPanel } from "./StartingPanel"; import { ValidationFailedPanel } from "./ValidationFailedPanel"; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index c9c38f90ce..a52c27c408 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@nomicfoundation/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; import { render } from "ink"; import { IgnitionUi } from "./components"; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index d111226acd..5f446653f8 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -3,7 +3,7 @@ import { ExecutionVertex, ExecutionVertexType, VertexVisitResultFailure, -} from "@nomicfoundation/ignition-core"; +} from "@ignored/ignition-core"; interface VertexSuccess { status: "success"; diff --git a/packages/hardhat-plugin/src/user-recipes.ts b/packages/hardhat-plugin/src/user-recipes.ts index 4f7c8c6419..745fb3c933 100644 --- a/packages/hardhat-plugin/src/user-recipes.ts +++ b/packages/hardhat-plugin/src/user-recipes.ts @@ -1,43 +1,43 @@ -import { Recipe } from "@nomicfoundation/ignition-core"; +import { Module } from "@ignored/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; const debug = setupDebug("hardhat-ignition:recipes"); -export function loadAllUserRecipes(userRecipesDirectory: string): Recipe[] { - debug(`Loading all user recipes from '${userRecipesDirectory}'`); +export function loadAllUserModules(userRecipesDirectory: string): Module[] { + debug(`Loading all user modules from '${userRecipesDirectory}'`); if (!fsExtra.existsSync(userRecipesDirectory)) { throw new Error(`Directory ${userRecipesDirectory} not found.`); } - const resolvedUserRecipesPaths = getAllUserRecipesPaths(userRecipesDirectory); + const resolvedUserRecipesPaths = getAllUserModulesPaths(userRecipesDirectory); - return getUserRecipesFromPaths(resolvedUserRecipesPaths); + return getUserModulesFromPaths(resolvedUserRecipesPaths); } -export function loadUserRecipes( +export function loadUserModules( userRecipesDirectory: string, userRecipesFiles: string[] = [] -): Recipe[] { - debug(`Loading user recipes from '${userRecipesDirectory}'`); +): Module[] { + debug(`Loading user modules from '${userRecipesDirectory}'`); if (!fsExtra.existsSync(userRecipesDirectory)) { throw new Error(`Directory ${userRecipesDirectory} not found.`); } - const resolvedUserRecipesPaths = getUserRecipesPaths( + const resolvedUserRecipesPaths = getUserModulesPaths( userRecipesDirectory, userRecipesFiles ); - return getUserRecipesFromPaths(resolvedUserRecipesPaths); + return getUserModulesFromPaths(resolvedUserRecipesPaths); } -export function getUserRecipesFromPaths( +export function getUserModulesFromPaths( resolvedUserRecipesPaths: string[] -): Recipe[] { +): Module[] { debug(`Loading '${resolvedUserRecipesPaths.length}' recipe files`); const userRecipes: any[] = []; @@ -56,14 +56,14 @@ export function getUserRecipesFromPaths( return userRecipes; } -export function getUserRecipesPaths( +export function getUserModulesPaths( userRecipesDirectory: string, userRecipesFiles: string[] ): string[] { return userRecipesFiles.map((x) => path.resolve(userRecipesDirectory, x)); } -export function getAllUserRecipesPaths(userRecipesDirectory: string) { +export function getAllUserModulesPaths(userRecipesDirectory: string) { return fsExtra .readdirSync(userRecipesDirectory) .filter((x) => !x.startsWith(".")) diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index 7534907e34..a4f812284d 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,14 +1,14 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "./helpers"; +import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("calls", () => { useEnvironment("minimal"); it("should be able to call contracts", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", { args: ["0x0000000000000000000000000000000000000000"], @@ -30,7 +30,7 @@ describe("calls", () => { }); it("should be able to make calls in order", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const trace = m.contract("Trace", { args: ["first"], }); diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts index 8cc7ee4343..5b97aa9afe 100644 --- a/packages/hardhat-plugin/test/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -1,14 +1,14 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "./helpers"; +import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("chain id", () => { useEnvironment("minimal"); it("should have a chain id", async function () { - await deployRecipe(this.hre, (m) => { + await deployModule(this.hre, (m) => { const chainId = m.chainId; assert.equal(chainId, 31337); diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 0943657d29..d2e3dada35 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,14 +1,14 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "./helpers"; +import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("contract deploys", () => { useEnvironment("minimal"); it("should be able to deploy a contract", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const foo = m.contract("Foo"); return { foo }; @@ -22,7 +22,7 @@ describe("contract deploys", () => { }); it("should be able to deploy a contract with arguments", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const greeter = m.contract("Greeter", { args: ["Hello World"], }); @@ -38,7 +38,7 @@ describe("contract deploys", () => { }); it("should be able to deploy contracts with dependencies", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", { args: [bar], @@ -56,7 +56,7 @@ describe("contract deploys", () => { }); it("should be able to deploy contracts without dependencies", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const foo = m.contract("Foo"); const bar = m.contract("Bar"); @@ -77,7 +77,7 @@ describe("contract deploys", () => { const artifact = await this.hre.artifacts.readArtifact("Greeter"); - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const greeter = m.contract("Greeter", artifact, { args: ["Hello World"], }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index e2feae3007..a6cc735cd8 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "./helpers"; +import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("existing contract", () => { @@ -10,7 +10,7 @@ describe("existing contract", () => { it("should be able to use an existing contract", async function () { await this.hre.run("compile", { quiet: true }); - const firstResult = await deployRecipe(this.hre, (m) => { + const firstResult = await deployModule(this.hre, (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", { args: ["0x0000000000000000000000000000000000000000"], @@ -26,7 +26,7 @@ describe("existing contract", () => { const usesContractAddress: string = firstResult.usesContract.address; const usesContractAbi: any[] = firstResult.usesContract.abi; - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const bar = m.contractAt("Bar", barAddress, barAbi); const usesContract = m.contractAt( "UsesContract", diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js similarity index 60% rename from packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js rename to packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js index a607d6c0ad..3a4fc78c52 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyRecipe.js +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js @@ -1,6 +1,7 @@ -const { buildRecipe } = require("@nomicfoundation/ignition-core"); +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@ignored/ignition-core"); -module.exports = buildRecipe("MyRecipe", (m) => { +module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", { args: ["0x0000000000000000000000000000000000000000"], diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 0999bd2686..647f71bafe 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -3,10 +3,10 @@ import { SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, - buildRecipe, IRecipeGraphBuilder, - FutureDict, -} from "@nomicfoundation/ignition-core"; + buildModule, +} from "@ignored/ignition-core"; +import { ModuleDict } from "@ignored/ignition-core/src/types/module"; import { assert } from "chai"; export const resultAssertions = { @@ -105,12 +105,12 @@ async function assertTxMined(hre: any, hash: string) { } /** - * Deploy all the recipes in `userRecipes`. + * Deploy all the modules in `userModuless`. * * Assert that `expectedBlocks.length` blocks are mined, and that * each mined block has `expectedBlocks[i]` transactions. */ -export async function deployRecipes( +export async function deployModules( hre: any, userRecipes: Recipe[], expectedBlocks: number[] @@ -118,7 +118,7 @@ export async function deployRecipes( await hre.run("compile", { quiet: true }); const deploymentResultPromise: Promise = hre.run( - "deploy:deploy-recipes", + "deploy:deploy-modules", { userRecipes, } @@ -197,14 +197,14 @@ async function assertContract(hre: any, futureResult: SerializedFutureResult) { return contract; } -export async function deployRecipe( +export async function deployModule( hre: any, - recipeDefinition: (m: IRecipeGraphBuilder) => FutureDict, + recipeDefinition: (m: IRecipeGraphBuilder) => ModuleDict, options?: { parameters: {} } ): Promise { await hre.run("compile", { quiet: true }); - const userRecipe = buildRecipe("MyRecipe", recipeDefinition); + const userRecipe = buildModule("MyModule", recipeDefinition); const deployPromise = hre.ignition.deploy(userRecipe, { ...options, diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 4ebfefa6b5..fafee6c3c0 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { deployRecipe } from "./helpers"; +import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("libraries", () => { @@ -10,7 +10,7 @@ describe("libraries", () => { it("should be able to deploy a contract that depends on a hardhat library", async function () { await this.hre.run("compile", { quiet: true }); - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const rubbishMath = m.library("RubbishMath"); const dependsOnLib = m.contract("DependsOnLib", { libraries: { @@ -44,7 +44,7 @@ describe("libraries", () => { "RubbishMath" ); - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const rubbishMath = m.library("RubbishMath", libraryArtifact); const dependsOnLib = m.contract("DependsOnLib", { libraries: { @@ -73,7 +73,7 @@ describe("libraries", () => { it("should deploy a contract with an existing library", async function () { // given - const libDeployResult = await deployRecipe(this.hre, (m) => { + const libDeployResult = await deployModule(this.hre, (m) => { const rubbishMath = m.contract("RubbishMath"); return { rubbishMath }; @@ -82,7 +82,7 @@ describe("libraries", () => { const libAddress = libDeployResult.rubbishMath.address; const libAbi = libDeployResult.rubbishMath.abi; - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const rubbishMath = m.contractAt("RubbishMath", libAddress, libAbi); const dependsOnLib = m.contract("DependsOnLib", { diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index d9b7fb40a9..6e45bbe382 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -1,8 +1,8 @@ /* eslint-disable import/no-unused-modules */ -import { buildRecipe } from "@nomicfoundation/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployRecipe, mineBlocks } from "./helpers"; +import { deployModule, mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("recipe parameters", () => { @@ -10,7 +10,7 @@ describe("recipe parameters", () => { describe("required", () => { it("should be able to retrieve a number", async function () { - const result = await deployRecipe( + const result = await deployModule( this.hre, (m) => { const myNumber = m.getParam("MyNumber"); @@ -36,7 +36,7 @@ describe("recipe parameters", () => { }); it("should be able to retrieve a string", async function () { - const result = await deployRecipe( + const result = await deployModule( this.hre, (m) => { const myString = m.getParam("MyString"); @@ -62,7 +62,7 @@ describe("recipe parameters", () => { describe("optional", () => { it("should be able to retrieve a default number", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const myNumber = m.getOptionalParam("MyNumber", 42); const foo = m.contract("Foo"); @@ -81,7 +81,7 @@ describe("recipe parameters", () => { }); it("should be able to override a default number", async function () { - const result = await deployRecipe( + const result = await deployModule( this.hre, (m) => { const myNumber = m.getOptionalParam("MyNumber", 10); @@ -108,7 +108,7 @@ describe("recipe parameters", () => { }); it("should be able to retrieve a default string", async function () { - const result = await deployRecipe(this.hre, (m) => { + const result = await deployModule(this.hre, (m) => { const myString = m.getOptionalParam("MyString", "Example"); const greeter = m.contract("Greeter", { @@ -124,7 +124,7 @@ describe("recipe parameters", () => { }); it("should be able to override a default string", async function () { - const result = await deployRecipe( + const result = await deployModule( this.hre, (m) => { const myString = m.getOptionalParam("MyString", "Example"); @@ -153,7 +153,7 @@ describe("recipe parameters", () => { it("should throw if no parameters object provided", async function () { await this.hre.run("compile", { quiet: true }); - const userRecipe = buildRecipe("MyRecipe", (m) => { + const userRecipe = buildModule("MyModule", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -178,7 +178,7 @@ describe("recipe parameters", () => { it("should throw if parameter missing from parameters", async function () { await this.hre.run("compile", { quiet: true }); - const userRecipe = buildRecipe("MyRecipe", (m) => { + const userModule = buildModule("MyModule", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -190,7 +190,7 @@ describe("recipe parameters", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: { NotMyNumber: 11, }, diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index d972ef6f77..68ab6f6c26 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -15,7 +15,7 @@ describe("plan", () => { await this.hre.run("compile", { quiet: true }); await this.hre.run("plan", { quiet: true, - userRecipesPaths: ["MyRecipe.js"], + userModulesPaths: ["MyRecipe.js"], }); const files = await fs.readdir(planPath); diff --git a/packages/hardhat-plugin/test/use-recipe.ts b/packages/hardhat-plugin/test/use-module.ts similarity index 84% rename from packages/hardhat-plugin/test/use-recipe.ts rename to packages/hardhat-plugin/test/use-module.ts index 47b9a1fa17..e060f7b3b5 100644 --- a/packages/hardhat-plugin/test/use-recipe.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,18 +1,20 @@ /* eslint-disable import/no-unused-modules */ import { + buildModule, buildRecipe, IRecipeGraphBuilder, -} from "@nomicfoundation/ignition-core"; +} from "@ignored/ignition-core"; +import { isCallable } from "@ignored/ignition-core/src/utils/guards"; import { assert } from "chai"; import { mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("useRecipe", function () { +describe("useModule", function () { useEnvironment("minimal"); - describe("returning futures from recipe usage", () => { - it("using useRecipe", async function () { + describe("returning futures from module usage", () => { + it("using useModule", async function () { await this.hre.run("compile", { quiet: true }); const thirdPartyRecipe = buildRecipe( @@ -24,17 +26,21 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { const { foo } = m.useRecipe(thirdPartyRecipe); m.call(foo, "inc", { args: [], }); + if (!isCallable(foo)) { + throw new Error("Not callable"); + } + return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, ui: false, }); @@ -68,7 +74,7 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { const foo = m.contract("Foo"); m.useRecipe(thirdPartyRecipe, { @@ -80,7 +86,7 @@ describe("useRecipe", function () { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, ui: false, }); @@ -97,7 +103,7 @@ describe("useRecipe", function () { }); }); - describe("passing futures into and out of recipes", () => { + describe("passing futures into and out of modules", () => { it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); @@ -119,7 +125,7 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { const trace = m.contract("Trace", { args: ["first"], }); @@ -138,7 +144,7 @@ describe("useRecipe", function () { return { trace }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, ui: false, }); @@ -181,7 +187,7 @@ describe("useRecipe", function () { } ); - const userRecipe = buildRecipe("UserRecipe", (m: IRecipeGraphBuilder) => { + const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { const trace = m.contract("Trace", { args: ["first"], }); @@ -200,7 +206,7 @@ describe("useRecipe", function () { return { trace }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, ui: false, }); diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts index 6b128ee7ed..ebb59638e5 100644 --- a/packages/hardhat-plugin/test/user-recipes.ts +++ b/packages/hardhat-plugin/test/user-recipes.ts @@ -2,11 +2,11 @@ import { assert } from "chai"; import { - loadUserRecipes, - loadAllUserRecipes, - getUserRecipesFromPaths, - getUserRecipesPaths, - getAllUserRecipesPaths, + loadUserModules, + loadAllUserModules, + getUserModulesFromPaths, + getUserModulesPaths, + getAllUserModulesPaths, } from "../src/user-recipes"; import { useEnvironment } from "./useEnvironment"; @@ -17,7 +17,7 @@ describe("User recipes", function () { describe("loadUserRecipes", function () { it("should throw if given a user recipe directory that does not exist", async () => { assert.throws( - () => loadUserRecipes("/fake", []), + () => loadUserModules("/fake", []), `Directory /fake not found.` ); }); @@ -26,7 +26,7 @@ describe("User recipes", function () { describe("loadAllUserRecipes", function () { it("should throw if given a user recipe directory that does not exist", async () => { assert.throws( - () => loadAllUserRecipes("/fake"), + () => loadAllUserModules("/fake"), `Directory /fake not found.` ); }); @@ -34,7 +34,7 @@ describe("User recipes", function () { describe("getAllUserRecipesPaths", function () { it("should return file paths for all user recipes in a given directory", () => { - const paths = getAllUserRecipesPaths("ignition"); + const paths = getAllUserModulesPaths("ignition"); assert.equal(paths.length, 1); assert(paths[0].endsWith("TestRecipe.js")); @@ -43,7 +43,7 @@ describe("User recipes", function () { describe("getUserRecipesPaths", function () { it("should return file paths for the given user recipe files", () => { - const paths = getUserRecipesPaths("ignition", ["TestRecipe.js"]); + const paths = getUserModulesPaths("ignition", ["TestRecipe.js"]); assert.equal(paths.length, 1); assert(paths[0].endsWith("TestRecipe.js")); @@ -52,15 +52,15 @@ describe("User recipes", function () { describe("getUserRecipesFromPaths", function () { it("should return a user recipe from a given path", () => { - const paths = getUserRecipesPaths("ignition", ["TestRecipe.js"]); - const recipes = getUserRecipesFromPaths(paths); + const paths = getUserModulesPaths("ignition", ["TestRecipe.js"]); + const recipes = getUserModulesFromPaths(paths); assert.equal(recipes.length, 1); // assert.equal(recipes[0].id, "testing123"); }); it("should throw if given a file that does not exist", () => { - assert.throws(() => getUserRecipesFromPaths(["/fake"])); + assert.throws(() => getUserModulesFromPaths(["/fake"])); }); }); }); From 05d614f722eee75f1dc7752adaee7e65a9caadd8 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 12:54:09 +0100 Subject: [PATCH 0129/1302] docs/publish-notes (#46) * chore: update core package.json Add missing attributes in prep for release to @ignored. * chore: add npmignore * chore: update the hardhat-plugin package.json In prep for release to @ignored on npm. * chore: add npmignore for hardhat-plugin * docs: add publishing instructions --- CONTRIBUTING.md | 4 + docs/publish.md | 10 ++ packages/core/.npmignore | 9 ++ packages/core/package.json | 16 +++ packages/core/ui-samples/index.tsx | 142 --------------------------- packages/core/ui-samples/types.ts | 10 -- packages/hardhat-plugin/.npmignore | 11 +++ packages/hardhat-plugin/package.json | 16 +++ yarn.lock | 26 +---- 9 files changed, 67 insertions(+), 177 deletions(-) create mode 100644 docs/publish.md create mode 100644 packages/core/.npmignore delete mode 100644 packages/core/ui-samples/index.tsx delete mode 100644 packages/core/ui-samples/types.ts create mode 100644 packages/hardhat-plugin/.npmignore diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index bd68f7f853..27d91a8410 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,3 +66,7 @@ If typescript or testing gets into a weird state, `clean` will remove ephemeral ```shell yarn clean ``` + +## Publish + +To publish the **Ignition** packages to npm follow the [publishing instructions](./docs/publish.md). diff --git a/docs/publish.md b/docs/publish.md new file mode 100644 index 0000000000..535fb30949 --- /dev/null +++ b/docs/publish.md @@ -0,0 +1,10 @@ +# Publish Ignition + +To publish ignition: + +1. git fetch, Checkout out `main`, then ensure your branch is up to date `git pull --ff-only` +2. Run a full check, stopping on failure: `yarn fullcheck` +3. Under `./packages/core`, update the package version based on semver if appropriate. +4. Publish `core` if appropriate: `npm publish` +5. Under `./packages/hardhat-plugin`, update the package version based on semver if appropriate. +6. Publish `hardhat-plugin` if appropriate: `npm publish` diff --git a/packages/core/.npmignore b/packages/core/.npmignore new file mode 100644 index 0000000000..bb8c6cb518 --- /dev/null +++ b/packages/core/.npmignore @@ -0,0 +1,9 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc diff --git a/packages/core/package.json b/packages/core/package.json index 529a68bf7f..3aa88979b0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,23 @@ "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "repository": "github:nomicfoundation/ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment" + ], + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, "main": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { "build": "tsc --build && node post-build.js", "lint": "yarn prettier --check && yarn eslint", diff --git a/packages/core/ui-samples/index.tsx b/packages/core/ui-samples/index.tsx deleted file mode 100644 index 98576eb8e1..0000000000 --- a/packages/core/ui-samples/index.tsx +++ /dev/null @@ -1,142 +0,0 @@ -import { render, useInput } from "ink"; -import { useRef, useState } from "react"; -import { - FutureState, - DeploymentState, - RecipeState, -} from "../src/deployment-state"; - -import { IgnitionUi } from "@ignored/hardhat-ignition/src/ui/components"; - -import { Example } from "./types"; - -async function main() { - const examples = getExamples(); - - for (const example of examples) { - console.log(example.description); - console.log(example.description.replace(/./g, "=")); - console.log(); - - await renderExample(example); - - console.log(); - } -} - -function getExamples(): Example[] { - const examples: Example[] = []; - - examples.push({ - description: "Single recipe with single contract", - initialData: { - MyRecipe: ["Foo"], - }, - transitions: [ - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.running()), - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), - ], - }); - - examples.push({ - description: "Single recipe with two contracts deployed in parallel", - initialData: { - MyRecipe: ["Foo", "Bar"], - }, - transitions: [ - (d) => { - d.setFutureState("MyRecipe", "Foo", FutureState.running()); - d.setFutureState("MyRecipe", "Bar", FutureState.running()); - }, - (d) => d.setFutureState("MyRecipe", "Bar", FutureState.success(2)), - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), - ], - }); - - examples.push({ - description: "Two recipes", - initialData: { - MyRecipe: ["Foo"], - MyOtherRecipe: ["Bar"], - }, - transitions: [ - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.running()), - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), - (d) => d.setFutureState("MyOtherRecipe", "Bar", FutureState.running()), - (d) => d.setFutureState("MyOtherRecipe", "Bar", FutureState.success(1)), - ], - }); - - examples.push({ - description: "Two parallel deploys followed by two parallel calls", - initialData: { - MyRecipe: ["Foo", "Bar", "Foo.f", "Bar.b"], - }, - transitions: [ - (d) => { - d.setFutureState("MyRecipe", "Foo", FutureState.running()); - d.setFutureState("MyRecipe", "Bar", FutureState.running()); - }, - (d) => d.setFutureState("MyRecipe", "Bar", FutureState.success(1)), - (d) => d.setFutureState("MyRecipe", "Foo", FutureState.success(1)), - (d) => d.setFutureState("MyRecipe", "Foo.f", FutureState.running()), - (d) => d.setFutureState("MyRecipe", "Bar.b", FutureState.running()), - (d) => d.setFutureState("MyRecipe", "Foo.f", FutureState.success(1)), - (d) => d.setFutureState("MyRecipe", "Bar.b", FutureState.success(1)), - ], - }); - - if (examples.some((x) => x.only)) { - return examples.filter((x) => x.only); - } - - return examples; -} - -function renderExample(example: Example) { - return new Promise((resolve) => { - const { unmount } = render( - { - unmount(); - resolve(); - }} - /> - ); - }); -} - -const ExampleRenderer = ({ - example: { initialData, transitions }, - onFinish, -}: { - example: Example; - onFinish: () => void; -}) => { - const deploymentState = new DeploymentState(); - for (const [recipeId, futuresIds] of Object.entries(initialData)) { - const recipeState = new RecipeState(recipeId); - for (const futureId of futuresIds) { - recipeState.addFuture(futureId, FutureState.waiting()); - } - deploymentState.addRecipe(recipeState); - } - const deploymentStateRef = useRef(deploymentState); - const [transitionIndex, setTransitionIndex] = useState(0); - - useInput((input, key) => { - if (input === "n") { - if (transitionIndex < transitions.length) { - transitions[transitionIndex](deploymentStateRef.current); - setTransitionIndex(transitionIndex + 1); - } else { - onFinish(); - } - } - }); - - return ; -}; - -main(); diff --git a/packages/core/ui-samples/types.ts b/packages/core/ui-samples/types.ts deleted file mode 100644 index 83a2af2dd5..0000000000 --- a/packages/core/ui-samples/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { DeploymentState } from "../src/deployment-state"; - -type ExampleTransition = (d: DeploymentState) => void; - -export interface Example { - only?: boolean; - description: string; - initialData: Record; - transitions: ExampleTransition[]; -} diff --git a/packages/hardhat-plugin/.npmignore b/packages/hardhat-plugin/.npmignore new file mode 100644 index 0000000000..d389e78726 --- /dev/null +++ b/packages/hardhat-plugin/.npmignore @@ -0,0 +1,11 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc +test/ +esbuild.js diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index bb039e54a6..7867cd9deb 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -3,7 +3,23 @@ "version": "0.0.2", "license": "MIT", "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "repository": "github:nomicfoundation/ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment" + ], + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, "main": "dist/index.js", + "types": "dist/index.d.ts", "scripts": { "build": "tsc --build && node ./esbuild.js", "lint": "yarn prettier --check && yarn eslint", diff --git a/yarn.lock b/yarn.lock index 5369f1df1e..65e0da8de1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1052,7 +1052,7 @@ ethers "^4.0.0-beta.1" source-map-support "^0.5.19" -"@openzeppelin/contracts@^4.1.0", "@openzeppelin/contracts@^4.3.2": +"@openzeppelin/contracts@^4.1.0": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== @@ -1463,11 +1463,6 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== -"@types/node@^16.11.1": - version "16.11.64" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.64.tgz#9171f327298b619e2c52238b120c19056415d820" - integrity sha512-z5hPTlVFzNwtJ2LNozTpJcD1Cu44c4LNuzaq1mwxmiHWQh2ULdR6Vjwo1UGldzRpzL0yUEdZddnfqGW2G70z6Q== - "@types/object-hash@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-2.2.1.tgz#67c169f8f033e0b62abbf81df2d00f4598d540b9" @@ -8059,25 +8054,6 @@ ts-node@10.8.1: v8-compile-cache-lib "^3.0.1" yn "3.1.1" -ts-node@^10.3.0: - version "10.9.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - tsconfig-paths@^3.11.0: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" From bba0c0b21d7272dc3cb906682fd2c02019c66c19 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 13:01:21 +0100 Subject: [PATCH 0130/1302] docs: fix bad link --- README.md | 2 +- examples/simple/README.md | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 6c174ca05b..4bdf0b9622 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex ## Documentation -- [Creating recipes for deployment](./docs/creating-recipes-for-deployment.md) +- [Creating modules for deployment](./docs/creating-modules-for-deployment.md) ### Examples diff --git a/examples/simple/README.md b/examples/simple/README.md index b9959d7d94..d47cfbb475 100644 --- a/examples/simple/README.md +++ b/examples/simple/README.md @@ -2,8 +2,6 @@ This hardhat project is an example of using ignition to deploy a simple set of contracts. -See the - ## Deploying To run the ignition deploy against the ephemeral hardhat network: From 0237a950d46d4e0b1b64521f05b741362ade56f9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 13:11:47 +0100 Subject: [PATCH 0131/1302] refactor: rename `useRecipe` to `useSubgraph` Make it more obvious that this is an internal function. --- docs/design.md | 6 +-- examples/ens/ignition/ENS.js | 10 ++--- packages/core/src/index.ts | 4 +- .../core/src/recipe/RecipeGraphBuilder.ts | 6 +-- packages/core/src/recipe/buildRecipe.ts | 12 ------ packages/core/src/recipe/buildSubgraph.ts | 12 ++++++ packages/core/src/types/recipeGraph.ts | 6 +-- packages/core/test/modules.ts | 6 +-- packages/core/test/validation.ts | 6 +-- packages/hardhat-plugin/src/index.ts | 2 +- packages/hardhat-plugin/test/use-module.ts | 41 +++++++++---------- 11 files changed, 54 insertions(+), 57 deletions(-) delete mode 100644 packages/core/src/recipe/buildRecipe.ts create mode 100644 packages/core/src/recipe/buildSubgraph.ts diff --git a/docs/design.md b/docs/design.md index 0631caf50f..fa9c8748a9 100644 --- a/docs/design.md +++ b/docs/design.md @@ -32,7 +32,7 @@ The `ExecutionGraph` is passed to the execution engine which submits the transac The user describes the dependency graph as a `Recipe`, a utility function that takes a graph builder as its first argument. The user can express the on-chain transactions and their dependencies by calls on the graph builder. ```javascript -const subrecipe = buildRecipe("Subrecipe", (m) => { +const subgraph = buildSubgraph("Subgraph", (m) => { const f = m.contract("F"); m.call(f, "G"); @@ -40,7 +40,7 @@ const subrecipe = buildRecipe("Subrecipe", (m) => { return { f }; }); -module.exports = buildRecipe("Example", (m) => { +module.exports = buildModule("Example", (m) => { const a = m.contract("A"); const bCall = m.call(a, "B"); @@ -49,7 +49,7 @@ module.exports = buildRecipe("Example", (m) => { after: [bCall], }); - const { recipe: sub } = m.subrecipe(subrecipe, { + const { recipe: sub } = m.useSubgraph(subgraph, { after: [a], }); diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 8ed101291d..4c5216d7c2 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { buildRecipe, buildModule } = require("@ignored/hardhat-ignition"); +const { buildSubgraph, buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; @@ -18,7 +18,7 @@ const ZERO_HASH = const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -const setupResolver = buildRecipe("RESOLVER", (m) => { +const setupResolver = buildSubgraph("RESOLVER", (m) => { const ens = m.getParam("ENS"); const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); @@ -43,7 +43,7 @@ const setupResolver = buildRecipe("RESOLVER", (m) => { return { resolver }; }); -const setupReverseRegistrar = buildRecipe("REVERSEREGISTRAR", (m) => { +const setupReverseRegistrar = buildSubgraph("REVERSEREGISTRAR", (m) => { const ens = m.getParam("ENS"); const resolver = m.getParam("RESOLVER"); const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); @@ -71,14 +71,14 @@ module.exports = buildModule("ENS", (m) => { const ens = m.contract("ENSRegistry"); - const { resolver } = m.useRecipe(setupResolver, { + const { resolver } = m.useSubgraph(setupResolver, { parameters: { ENS: ens, ACCOUNT: owner, }, }); - const { reverseRegistrar } = m.useRecipe(setupReverseRegistrar, { + const { reverseRegistrar } = m.useSubgraph(setupReverseRegistrar, { parameters: { ENS: ens, RESOLVER: resolver, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 4576a2a1a3..7280901506 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,6 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; export { buildModule } from "recipe/buildModule"; -export { buildRecipe } from "recipe/buildRecipe"; +export { buildSubgraph } from "recipe/buildSubgraph"; export type { SerializedDeploymentResult, @@ -19,7 +19,7 @@ export type { } from "types/deployment"; export type { Module } from "types/module"; export type { - Recipe, + Subgraph as Recipe, ExternalParamValue, IRecipeGraphBuilder, } from "types/recipeGraph"; diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/recipe/RecipeGraphBuilder.ts index 973b960b6d..00f61afabb 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/recipe/RecipeGraphBuilder.ts @@ -23,7 +23,7 @@ import { InternalParamValue, IRecipeGraph, IRecipeGraphBuilder, - Recipe, + Subgraph, RecipeGraphBuilderOptions, RecipeVertex, UseRecipeOptions, @@ -277,7 +277,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return paramFuture; } - public useRecipe(recipe: Recipe, options?: UseRecipeOptions): FutureDict { + public useSubgraph(recipe: Subgraph, options?: UseRecipeOptions): FutureDict { const useRecipeInvocationId = this.useRecipeInvocationCounter++; const label = `${recipe.name}:${useRecipeInvocationId}`; @@ -288,7 +288,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { this.graph.registeredParameters[scopeLabel] = options.parameters; } - const result = recipe.recipeAction(this); + const result = recipe.subgraphAction(this); const virtualVertex = this._createRecipeVirtualVertex(label); diff --git a/packages/core/src/recipe/buildRecipe.ts b/packages/core/src/recipe/buildRecipe.ts deleted file mode 100644 index d57986b044..0000000000 --- a/packages/core/src/recipe/buildRecipe.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { FutureDict } from "types/future"; -import type { IRecipeGraphBuilder, Recipe } from "types/recipeGraph"; - -export function buildRecipe( - recipeName: string, - recipeFunc: (m: IRecipeGraphBuilder) => FutureDict -): Recipe { - return { - name: recipeName, - recipeAction: recipeFunc, - }; -} diff --git a/packages/core/src/recipe/buildSubgraph.ts b/packages/core/src/recipe/buildSubgraph.ts new file mode 100644 index 0000000000..fc7e4f5ccb --- /dev/null +++ b/packages/core/src/recipe/buildSubgraph.ts @@ -0,0 +1,12 @@ +import type { FutureDict } from "types/future"; +import type { IRecipeGraphBuilder, Subgraph } from "types/recipeGraph"; + +export function buildSubgraph( + subgraphName: string, + subgraphAction: (m: IRecipeGraphBuilder) => FutureDict +): Subgraph { + return { + name: subgraphName, + subgraphAction, + }; +} diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/recipeGraph.ts index 69619846b0..36f760153f 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/recipeGraph.ts @@ -152,13 +152,13 @@ export interface IRecipeGraphBuilder { defaultValue: ParameterValue ) => OptionalParameter; - useRecipe: (recipe: Recipe, options?: UseRecipeOptions) => FutureDict; + useSubgraph: (subgraph: Subgraph, options?: UseRecipeOptions) => FutureDict; useModule: (module: Module, options?: UseRecipeOptions) => ModuleDict; } -export interface Recipe { +export interface Subgraph { name: string; - recipeAction: (builder: IRecipeGraphBuilder) => FutureDict; + subgraphAction: (builder: IRecipeGraphBuilder) => FutureDict; } export interface RecipeGraphBuilderOptions { diff --git a/packages/core/test/modules.ts b/packages/core/test/modules.ts index ff8762bd86..6e00105bc8 100644 --- a/packages/core/test/modules.ts +++ b/packages/core/test/modules.ts @@ -5,7 +5,7 @@ import { getDependenciesFor } from "graph/adjacencyList"; import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; import { RecipeGraph } from "recipe/RecipeGraph"; import { buildModule } from "recipe/buildModule"; -import { buildRecipe } from "recipe/buildRecipe"; +import { buildSubgraph } from "recipe/buildSubgraph"; import { VertexDescriptor } from "types/graph"; import { Artifact } from "types/hardhat"; import type { @@ -720,7 +720,7 @@ describe("Modules", function () { let recipeGraph: IRecipeGraph; before(() => { - const librariesRecipe = buildRecipe( + const librariesRecipe = buildSubgraph( "libraries", (m: IRecipeGraphBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); @@ -734,7 +734,7 @@ describe("Modules", function () { ); const WrapModule = buildModule("Wrap", (m) => { - const { token } = m.useRecipe(librariesRecipe, { + const { token } = m.useSubgraph(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index ae8c28a6f5..e827413baf 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; import { buildModule } from "recipe/buildModule"; -import { buildRecipe } from "recipe/buildRecipe"; +import { buildSubgraph } from "recipe/buildSubgraph"; import { Artifact } from "types/hardhat"; import type { IRecipeGraphBuilder } from "types/recipeGraph"; import { validateRecipeGraph } from "validation/validateRecipeGraph"; @@ -560,14 +560,14 @@ describe("Validation", () => { describe("virtual", () => { it("should validate", async () => { - const subrecipe = buildRecipe("sub", (m) => { + const subgraph = buildSubgraph("sub", (m) => { const example = m.contract("Example"); return { example }; }); const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { - m.useRecipe(subrecipe); + m.useSubgraph(subgraph); return {}; }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 67ebdfb732..3c1d184b95 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -10,7 +10,7 @@ import { Renderer } from "./plan"; import { loadUserModules, loadAllUserModules } from "./user-recipes"; import "./type-extensions"; -export { buildRecipe, buildModule } from "@ignored/ignition-core"; +export { buildSubgraph, buildModule } from "@ignored/ignition-core"; extendConfig((config, userConfig) => { const userIgnitionPath = userConfig.paths?.ignition; diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index e060f7b3b5..c42ea3c9a4 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { buildModule, - buildRecipe, + buildSubgraph, IRecipeGraphBuilder, } from "@ignored/ignition-core"; import { isCallable } from "@ignored/ignition-core/src/utils/guards"; @@ -17,7 +17,7 @@ describe("useModule", function () { it("using useModule", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipe( + const thirdPartyModule = buildModule( "ThirdPartyRecipe", (m: IRecipeGraphBuilder) => { const foo = m.contract("Foo"); @@ -27,7 +27,7 @@ describe("useModule", function () { ); const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { - const { foo } = m.useRecipe(thirdPartyRecipe); + const { foo } = m.useModule(thirdPartyModule); m.call(foo, "inc", { args: [], @@ -57,27 +57,24 @@ describe("useModule", function () { }); }); - describe("passing futures into recipes", () => { - it("using useRecipe", async function () { + describe("passing futures into subgraphs", () => { + it("using useSubgraph", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyRecipe = buildRecipe( - "ThirdPartyRecipe", - (m: IRecipeGraphBuilder) => { - const foo = m.getParam("Foo"); + const thirdPartySubgraph = buildSubgraph("ThirdPartySubgraph", (m) => { + const foo = m.getParam("Foo"); - m.call(foo, "inc", { - args: [], - }); + m.call(foo, "inc", { + args: [], + }); - return { foo }; - } - ); + return { foo }; + }); const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { const foo = m.contract("Foo"); - m.useRecipe(thirdPartyRecipe, { + m.useSubgraph(thirdPartySubgraph, { parameters: { Foo: foo, }, @@ -107,8 +104,8 @@ describe("useModule", function () { it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); - const addSecondAndThirdEntryRecipe = buildRecipe( - "ThirdPartyRecipe", + const addSecondAndThirdEntrySubgraph = buildSubgraph( + "ThirdPartySubgraph", (m: IRecipeGraphBuilder) => { const trace = m.getParam("Trace"); @@ -130,7 +127,7 @@ describe("useModule", function () { args: ["first"], }); - const { thirdCall } = m.useRecipe(addSecondAndThirdEntryRecipe, { + const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { parameters: { Trace: trace, }, @@ -169,8 +166,8 @@ describe("useModule", function () { it("should allow ordering based on the recipe overall", async function () { await this.hre.run("compile", { quiet: true }); - const addSecondAndThirdEntryRecipe = buildRecipe( - "ThirdPartyRecipe", + const addSecondAndThirdEntryRecipe = buildSubgraph( + "ThirdPartySubgraph", (m: IRecipeGraphBuilder) => { const trace = m.getParam("Trace"); @@ -192,7 +189,7 @@ describe("useModule", function () { args: ["first"], }); - const { recipe } = m.useRecipe(addSecondAndThirdEntryRecipe, { + const { recipe } = m.useSubgraph(addSecondAndThirdEntryRecipe, { parameters: { Trace: trace, }, From 4928dd75c46a4a1e8499cdd6167be4d57554da7b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 13:32:57 +0100 Subject: [PATCH 0132/1302] refactor: rename recipeGraph to deploymentGraph --- docs/design.md | 12 +- packages/core/src/Ignition.ts | 42 +-- .../DeploymentBuilder.ts} | 102 +++--- packages/core/src/dsl/DeploymentGraph.ts | 15 + .../core/src/{recipe => dsl}/ScopeStack.ts | 0 .../core/src/{recipe => dsl}/buildModule.ts | 4 +- .../core/src/{recipe => dsl}/buildSubgraph.ts | 4 +- packages/core/src/index.ts | 10 +- .../process/generateDeploymentGraphFrom.ts | 18 ++ .../src/process/generateRecipeGraphFrom.ts | 18 -- ...nvertDeploymentVertexToExecutionVertex.ts} | 48 +-- ...oymentGraphByEliminatingVirtualVertexes.ts | 46 +++ ...RecipeGraphByEliminatingVirtualVertexes.ts | 46 --- ...ransformDeploymentGraphToExecutionGraph.ts | 43 +++ .../transformRecipeGraphToExecutionGraph.ts | 43 --- packages/core/src/recipe/RecipeGraph.ts | 15 - packages/core/src/services/ConfigService.ts | 2 +- .../{recipeGraph.ts => deploymentGraph.ts} | 78 ++--- packages/core/src/types/executionGraph.ts | 6 +- packages/core/src/types/future.ts | 6 +- packages/core/src/types/module.ts | 4 +- packages/core/src/types/plan.ts | 4 +- packages/core/src/types/providers.ts | 2 +- packages/core/src/utils/guards.ts | 52 +-- .../dispatch/validateArtifactContract.ts | 4 +- .../dispatch/validateArtifactLibrary.ts | 4 +- .../src/validation/dispatch/validateCall.ts | 4 +- .../dispatch/validateDeployedContract.ts | 4 +- .../dispatch/validateHardhatContract.ts | 4 +- .../dispatch/validateHardhatLibrary.ts | 4 +- .../validation/dispatch/validateVirtual.ts | 4 +- .../validation/dispatch/validationDispatch.ts | 4 +- ...ipeGraph.ts => validateDeploymentGraph.ts} | 10 +- packages/core/test/modules.ts | 299 +++++++++--------- packages/core/test/validation.ts | 154 +++++---- packages/hardhat-plugin/src/plan/index.ts | 10 +- packages/hardhat-plugin/test/helpers.ts | 8 +- packages/hardhat-plugin/test/use-module.ts | 118 +++---- 38 files changed, 669 insertions(+), 582 deletions(-) rename packages/core/src/{recipe/RecipeGraphBuilder.ts => dsl/DeploymentBuilder.ts} (83%) create mode 100644 packages/core/src/dsl/DeploymentGraph.ts rename packages/core/src/{recipe => dsl}/ScopeStack.ts (100%) rename packages/core/src/{recipe => dsl}/buildModule.ts (61%) rename packages/core/src/{recipe => dsl}/buildSubgraph.ts (57%) create mode 100644 packages/core/src/process/generateDeploymentGraphFrom.ts delete mode 100644 packages/core/src/process/generateRecipeGraphFrom.ts rename packages/core/src/process/transform/{convertRecipeVertexToExecutionVertex.ts => convertDeploymentVertexToExecutionVertex.ts} (83%) create mode 100644 packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts delete mode 100644 packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts create mode 100644 packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts delete mode 100644 packages/core/src/process/transformRecipeGraphToExecutionGraph.ts delete mode 100644 packages/core/src/recipe/RecipeGraph.ts rename packages/core/src/types/{recipeGraph.ts => deploymentGraph.ts} (54%) rename packages/core/src/validation/{validateRecipeGraph.ts => validateDeploymentGraph.ts} (67%) diff --git a/docs/design.md b/docs/design.md index fa9c8748a9..d376f7a905 100644 --- a/docs/design.md +++ b/docs/design.md @@ -23,7 +23,7 @@ Ignition expresses a deployment as a dependency graph of on-chain transactions, Ignition provides the **recipe api** (a js based dsl) so users can succintly describe a dependency graph of contract deploys and calls. -To deploy on-chain Ignition takes a `Recipe` specified via the **recipe api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `RecipeGraph`). +To deploy on-chain Ignition takes a `Recipe` specified via the **recipe api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). The `ExecutionGraph` is passed to the execution engine which submits the transactions on-chain, ordering them and batching them based on the dependency constraints of the `ExecutionGraph`. @@ -65,7 +65,7 @@ module.exports = buildModule("Example", (m) => { }); ``` -Ignition uses the `Recipe` to construct a `RecipeGraph`. The `RecipeGraph` matches closely with the high level **recipe api** and contains constructs that are **Hardhat** specific (i.e. "Deploy the 'A' Hardhat contract"). +Ignition uses the `Module` to construct a `DeploymentGraph`. The `DeploymentGraph` matches closely with the high level **api** and contains constructs that are **Hardhat** specific (i.e. "Deploy the 'A' Hardhat contract"). ```mermaid flowchart BT @@ -94,7 +94,7 @@ flowchart BT classDef ccall fill:#b2e061,stroke:darkgray; ``` -During construction of the `RecipeGraph`, subrecipes are collapsed down to a single level. A vertex that depends on subrecipe, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. +During construction of the `DeploymentGraph`, subrecipes are collapsed down to a single level. A vertex that depends on subrecipe, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. ```mermaid flowchart BT @@ -123,9 +123,9 @@ flowchart BT classDef ccall fill:#b2e061,stroke:darkgray; ``` -This `RecipeGraph` is validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). The validation attempts to ensure the `RecipeGraph` can be transformed into an `ExecutionGraph` without error and to reduce the chance of an on-chain errors during execution. Validation checks do not take into account on-chain state, only enforcing that the deployment makes sense internally. +This `DeploymentGraph` is validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). The validation attempts to ensure the `DeploymentGraph` can be transformed into an `ExecutionGraph` without error and to reduce the chance of an on-chain errors during execution. Validation checks do not take into account on-chain state, only enforcing that the deployment makes sense internally. -A valid `RecipeGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subrecipe virtual nodes**). +A valid `DeploymentGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subrecipe virtual nodes**). ```mermaid flowchart BT @@ -149,7 +149,7 @@ flowchart BT classDef ccall fill:#b2e061,stroke:darkgray; ``` -The reduced `RecipeGraph` will contain lots of **Hardhat** specific references. Ignition transforms the `RecipeGraph` into an `ExecutionGraph` that is designed for use by the execution engine without any reference to **Hardhat**. The edge structure is copied across but each **Hardhat** specific vertex (an on-chain transaction) is translated into an agnostic equivalent. For instance, a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. +The reduced `DeploymentGraph` will contain lots of **Hardhat** specific references. Ignition transforms the `DeploymentGraph` into an `ExecutionGraph` that is designed for use by the execution engine without any reference to **Hardhat**. The edge structure is copied across but each **Hardhat** specific vertex (an on-chain transaction) is translated into an agnostic equivalent. For instance, a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. Validated, simplified and converted to the agnostic `ExecutionGraph` representation, the execution engine can now run the deployment. diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index c6702f24ef..b9b1658578 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -3,8 +3,8 @@ import setupDebug from "debug"; import { Deployment } from "deployment/Deployment"; import { execute } from "execution/execute"; import { InMemoryJournal } from "journal/InMemoryJournal"; -import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; -import { transformRecipeGraphToExecutionGraph } from "process/transformRecipeGraphToExecutionGraph"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; import { createServices } from "services/createServices"; import { Services } from "services/types"; import { DeploymentResult, UpdateUiAction } from "types/deployment"; @@ -16,7 +16,7 @@ import { Providers } from "types/providers"; import { SerializedFutureResult } from "types/serialization"; import { isDependable } from "utils/guards"; import { serializeFutureOutput } from "utils/serialize"; -import { validateRecipeGraph } from "validation/validateRecipeGraph"; +import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); @@ -94,18 +94,24 @@ export class Ignition { const chainId = await this._getChainId(); - const { graph: recipeGraph } = generateRecipeGraphFrom(deploymentModule, { - chainId, - }); + const { graph: deploymentGraph } = generateDeploymentGraphFrom( + deploymentModule, + { + chainId, + } + ); - const validationResult = await validateRecipeGraph(recipeGraph, services); + const validationResult = await validateDeploymentGraph( + deploymentGraph, + services + ); if (validationResult._kind === "failure") { throw new Error(validationResult.failures[0]); } - const transformResult = await transformRecipeGraphToExecutionGraph( - recipeGraph, + const transformResult = await transformDeploymentGraphToExecutionGraph( + deploymentGraph, services ); @@ -115,7 +121,7 @@ export class Ignition { const { executionGraph } = transformResult; - return { recipeGraph, executionGraph }; + return { deploymentGraph, executionGraph }; } private async _constructExecutionGraphFrom( @@ -123,14 +129,14 @@ export class Ignition { ignitionModule: Module ): Promise<{ result: any; recipeOutputs: FutureDict }> { log("Generate recipe graph from recipe"); - const { graph: recipeGraph, recipeOutputs } = generateRecipeGraphFrom( - ignitionModule, - { chainId: deployment.state.details.chainId } - ); + const { graph: deploymentGraph, recipeOutputs } = + generateDeploymentGraphFrom(ignitionModule, { + chainId: deployment.state.details.chainId, + }); deployment.startValidation(); - const validationResult = await validateRecipeGraph( - recipeGraph, + const validationResult = await validateDeploymentGraph( + deploymentGraph, deployment.services ); @@ -141,8 +147,8 @@ export class Ignition { } log("Transform recipe graph to execution graph"); - const transformResult = await transformRecipeGraphToExecutionGraph( - recipeGraph, + const transformResult = await transformDeploymentGraphToExecutionGraph( + deploymentGraph, deployment.services ); diff --git a/packages/core/src/recipe/RecipeGraphBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts similarity index 83% rename from packages/core/src/recipe/RecipeGraphBuilder.ts rename to packages/core/src/dsl/DeploymentBuilder.ts index 00f61afabb..f33a8ba9aa 100644 --- a/packages/core/src/recipe/RecipeGraphBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -1,8 +1,18 @@ import hash from "object-hash"; import { addEdge, ensureVertex } from "graph/adjacencyList"; +import { + ContractOptions, + InternalParamValue, + IDeploymentGraph, + IDeploymentBuilder, + Subgraph, + DeploymentBuilderOptions, + DeploymentGraphVertex, + UseSubgraphOptions, +} from "types/deploymentGraph"; import type { - RecipeFuture, + DeploymentGraphFuture, HardhatContract, ArtifactLibrary, HardhatLibrary, @@ -18,16 +28,6 @@ import type { } from "types/future"; import type { Artifact } from "types/hardhat"; import type { Module, ModuleCache, ModuleDict } from "types/module"; -import { - ContractOptions, - InternalParamValue, - IRecipeGraph, - IRecipeGraphBuilder, - Subgraph, - RecipeGraphBuilderOptions, - RecipeVertex, - UseRecipeOptions, -} from "types/recipeGraph"; import { IgnitionError } from "utils/errors"; import { isArtifact, @@ -36,18 +36,18 @@ import { isParameter, } from "utils/guards"; -import { RecipeGraph } from "./RecipeGraph"; +import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; -export class RecipeGraphBuilder implements IRecipeGraphBuilder { +export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; - public graph: IRecipeGraph = new RecipeGraph(); + public graph: IDeploymentGraph = new DeploymentGraph(); private idCounter: number = 0; private moduleCache: ModuleCache = {}; private useRecipeInvocationCounter: number = 0; private scopes: ScopeStack = new ScopeStack(); - constructor(options: RecipeGraphBuilderOptions) { + constructor(options: DeploymentBuilderOptions) { this.chainId = options.chainId; } @@ -69,7 +69,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: artifactContractFuture.vertexId, label: libraryName, type: "ArtifactLibrary", @@ -92,7 +92,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: libraryFuture.vertexId, label: libraryName, type: "HardhatLibrary", @@ -124,7 +124,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: artifactContractFuture.vertexId, label: contractName, type: "ArtifactContract", @@ -148,7 +148,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: contractFuture.vertexId, label: contractName, type: "HardhatContract", @@ -167,7 +167,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { contractName: string, address: string, abi: any[], - options?: { after?: RecipeFuture[] } + options?: { after?: DeploymentGraphFuture[] } ): DeployedContract { const deployedFuture: DeployedContract = { vertexId: this._resolveNextId(), @@ -178,7 +178,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { _future: true, }; - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: deployedFuture.vertexId, label: contractName, type: "DeployedContract", @@ -192,14 +192,14 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } public call( - contractFuture: RecipeFuture, + contractFuture: DeploymentGraphFuture, functionName: string, { args, after, }: { - args: Array; - after?: RecipeFuture[]; + args: Array; + after?: DeploymentGraphFuture[]; } ): ContractCall { const callFuture: ContractCall = { @@ -235,7 +235,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { ); } - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: callFuture.vertexId, label: callFuture.label, type: "Call", @@ -277,7 +277,10 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return paramFuture; } - public useSubgraph(recipe: Subgraph, options?: UseRecipeOptions): FutureDict { + public useSubgraph( + recipe: Subgraph, + options?: UseSubgraphOptions + ): FutureDict { const useRecipeInvocationId = this.useRecipeInvocationCounter++; const label = `${recipe.name}:${useRecipeInvocationId}`; @@ -297,7 +300,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return { ...result, recipe: virtualVertex }; } - public useModule(module: Module, options?: UseRecipeOptions): ModuleDict { + public useModule(module: Module, options?: UseSubgraphOptions): ModuleDict { const label = `module:${module.name}`; if (this.moduleCache[label] === undefined) { @@ -354,7 +357,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { const afterVertexFutures = [...this.graph.vertexes.values()] .filter((v) => v.scopeAdded === scopeLabel) .map( - (v): RecipeFuture => ({ + (v): DeploymentGraphFuture => ({ vertexId: v.id, label: v.label, type: "virtual", @@ -362,7 +365,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { }) ); - RecipeGraphBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addRecipeVertex(this.graph, { id: virtualFuture.vertexId, label, type: "Virtual", @@ -377,46 +380,49 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { return this.idCounter++; } - private static _addRecipeVertex(graph: RecipeGraph, depNode: RecipeVertex) { + private static _addRecipeVertex( + graph: DeploymentGraph, + depNode: DeploymentGraphVertex + ) { graph.vertexes.set(depNode.id, depNode); ensureVertex(graph.adjacencyList, depNode.id); if (depNode.type === "HardhatContract") { - RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - RecipeGraphBuilder._addEdgesBasedOn( + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.libraries), graph, depNode ); - RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); return; } if (depNode.type === "ArtifactContract") { - RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - RecipeGraphBuilder._addEdgesBasedOn( + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.libraries), graph, depNode ); - RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); return; } if (depNode.type === "DeployedContract") { - RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); return; } if (depNode.type === "HardhatLibrary") { - RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); return; } if (depNode.type === "ArtifactLibrary") { - RecipeGraphBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - RecipeGraphBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); return; } @@ -426,12 +432,12 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { to: depNode.id, }); - RecipeGraphBuilder._addEdgesBasedOn( + DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.args), graph, depNode ); - RecipeGraphBuilder._addEdgesBasedOn( + DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.after), graph, depNode @@ -440,7 +446,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } if (depNode.type === "Virtual") { - RecipeGraphBuilder._addEdgesBasedOn( + DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.after), graph, depNode @@ -451,8 +457,8 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { private static _addEdgesBasedOn( args: InternalParamValue[], - graph: RecipeGraph, - depNode: RecipeVertex + graph: DeploymentGraph, + depNode: DeploymentGraphVertex ) { for (const arg of args) { if ( @@ -469,7 +475,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } if (isParameter(arg)) { - const resolvedArg = RecipeGraphBuilder._resolveParameterFromScope( + const resolvedArg = DeploymentBuilder._resolveParameterFromScope( graph, arg ); @@ -488,7 +494,7 @@ export class RecipeGraphBuilder implements IRecipeGraphBuilder { } private static _resolveParameterFromScope( - graph: RecipeGraph, + graph: DeploymentGraph, param: RequiredParameter | OptionalParameter ) { const parametersFromScope = graph.registeredParameters[param.scope]; diff --git a/packages/core/src/dsl/DeploymentGraph.ts b/packages/core/src/dsl/DeploymentGraph.ts new file mode 100644 index 0000000000..a3df24d07e --- /dev/null +++ b/packages/core/src/dsl/DeploymentGraph.ts @@ -0,0 +1,15 @@ +import { Graph } from "graph/Graph"; +import { DeploymentGraphVertex as DeploymentGraphVertex } from "types/deploymentGraph"; +import { DeploymentGraphFuture } from "types/future"; + +export class DeploymentGraph extends Graph { + public registeredParameters: { + [key: string]: { [key: string]: string | number | DeploymentGraphFuture }; + }; + + constructor() { + super(); + + this.registeredParameters = {}; + } +} diff --git a/packages/core/src/recipe/ScopeStack.ts b/packages/core/src/dsl/ScopeStack.ts similarity index 100% rename from packages/core/src/recipe/ScopeStack.ts rename to packages/core/src/dsl/ScopeStack.ts diff --git a/packages/core/src/recipe/buildModule.ts b/packages/core/src/dsl/buildModule.ts similarity index 61% rename from packages/core/src/recipe/buildModule.ts rename to packages/core/src/dsl/buildModule.ts index a9ce6ed396..cf47a7caf8 100644 --- a/packages/core/src/recipe/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,9 +1,9 @@ +import type { IDeploymentBuilder } from "types/deploymentGraph"; import type { Module, ModuleDict } from "types/module"; -import type { IRecipeGraphBuilder } from "types/recipeGraph"; export function buildModule( moduleName: string, - moduleFunc: (m: IRecipeGraphBuilder) => ModuleDict + moduleFunc: (m: IDeploymentBuilder) => ModuleDict ): Module { return { name: moduleName, diff --git a/packages/core/src/recipe/buildSubgraph.ts b/packages/core/src/dsl/buildSubgraph.ts similarity index 57% rename from packages/core/src/recipe/buildSubgraph.ts rename to packages/core/src/dsl/buildSubgraph.ts index fc7e4f5ccb..5add34a88e 100644 --- a/packages/core/src/recipe/buildSubgraph.ts +++ b/packages/core/src/dsl/buildSubgraph.ts @@ -1,9 +1,9 @@ +import type { IDeploymentBuilder, Subgraph } from "types/deploymentGraph"; import type { FutureDict } from "types/future"; -import type { IRecipeGraphBuilder, Subgraph } from "types/recipeGraph"; export function buildSubgraph( subgraphName: string, - subgraphAction: (m: IRecipeGraphBuilder) => FutureDict + subgraphAction: (m: IDeploymentBuilder) => FutureDict ): Subgraph { return { name: subgraphName, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 7280901506..0cc54cd23d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,6 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; -export { buildModule } from "recipe/buildModule"; -export { buildSubgraph } from "recipe/buildSubgraph"; +export { buildModule } from "dsl/buildModule"; +export { buildSubgraph } from "dsl/buildSubgraph"; export type { SerializedDeploymentResult, @@ -19,10 +19,10 @@ export type { } from "types/deployment"; export type { Module } from "types/module"; export type { - Subgraph as Recipe, + Subgraph, ExternalParamValue, - IRecipeGraphBuilder, -} from "types/recipeGraph"; + IDeploymentBuilder, +} from "types/deploymentGraph"; export type { FutureDict } from "types/future"; export type { IgnitionPlan } from "types/plan"; export type { diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts new file mode 100644 index 0000000000..e338298612 --- /dev/null +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -0,0 +1,18 @@ +import { DeploymentBuilder } from "dsl/DeploymentBuilder"; +import type { + DeploymentBuilderOptions, + IDeploymentGraph, +} from "types/deploymentGraph"; +import { FutureDict } from "types/future"; +import { Module } from "types/module"; + +export function generateDeploymentGraphFrom( + ignitionModule: Module, + builderOptions: DeploymentBuilderOptions +): { graph: IDeploymentGraph; recipeOutputs: FutureDict } { + const graphBuilder = new DeploymentBuilder(builderOptions); + + const recipeOutputs = ignitionModule.moduleAction(graphBuilder); + + return { graph: graphBuilder.graph, recipeOutputs }; +} diff --git a/packages/core/src/process/generateRecipeGraphFrom.ts b/packages/core/src/process/generateRecipeGraphFrom.ts deleted file mode 100644 index 97b4158ed9..0000000000 --- a/packages/core/src/process/generateRecipeGraphFrom.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { RecipeGraphBuilder } from "recipe/RecipeGraphBuilder"; -import { FutureDict } from "types/future"; -import { Module } from "types/module"; -import type { - RecipeGraphBuilderOptions, - IRecipeGraph, -} from "types/recipeGraph"; - -export function generateRecipeGraphFrom( - ignitionModule: Module, - builderOptions: RecipeGraphBuilderOptions -): { graph: IRecipeGraph; recipeOutputs: FutureDict } { - const graphBuilder = new RecipeGraphBuilder(builderOptions); - - const recipeOutputs = ignitionModule.moduleAction(graphBuilder); - - return { graph: graphBuilder.graph, recipeOutputs }; -} diff --git a/packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts similarity index 83% rename from packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts rename to packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 834eafe41d..b25ba71177 100644 --- a/packages/core/src/process/transform/convertRecipeVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,4 +1,14 @@ import { Services } from "services/types"; +import { + ArtifactContractDeploymentVertex, + ArtifactLibraryDeploymentVertex, + CallDeploymentVertex, + DeployedContractDeploymentVertex, + HardhatContractDeploymentVertex, + HardhatLibraryDeploymentVertex, + IDeploymentGraph, + DeploymentGraphVertex, +} from "types/deploymentGraph"; import { ContractCall, ContractDeploy, @@ -6,29 +16,19 @@ import { ExecutionVertex, LibraryDeploy, } from "types/executionGraph"; -import { RecipeFuture } from "types/future"; +import { DeploymentGraphFuture } from "types/future"; import { Artifact } from "types/hardhat"; -import { - ArtifactContractRecipeVertex, - ArtifactLibraryRecipeVertex, - CallRecipeVertex, - DeployedContractRecipeVertex, - HardhatContractRecipeVertex, - HardhatLibraryRecipeVertex, - IRecipeGraph, - RecipeVertex, -} from "types/recipeGraph"; import { isFuture } from "utils/guards"; interface TransformContext { services: Services; - graph: IRecipeGraph; + graph: IDeploymentGraph; } -export function convertRecipeVertexToExecutionVertex( +export function convertDeploymentVertexToExecutionVertex( context: TransformContext -): (recipeVertex: RecipeVertex) => Promise { - return (recipeVertex: RecipeVertex): Promise => { +): (recipeVertex: DeploymentGraphVertex) => Promise { + return (recipeVertex: DeploymentGraphVertex): Promise => { switch (recipeVertex.type) { case "HardhatContract": return convertHardhatContractToContractDeploy(recipeVertex, context); @@ -53,7 +53,7 @@ export function convertRecipeVertexToExecutionVertex( } async function convertHardhatContractToContractDeploy( - vertex: HardhatContractRecipeVertex, + vertex: HardhatContractDeploymentVertex, transformContext: TransformContext ): Promise { const artifact: Artifact = @@ -70,7 +70,7 @@ async function convertHardhatContractToContractDeploy( } async function convertArtifactContractToContractDeploy( - vertex: ArtifactContractRecipeVertex, + vertex: ArtifactContractDeploymentVertex, transformContext: TransformContext ): Promise { return { @@ -84,7 +84,7 @@ async function convertArtifactContractToContractDeploy( } async function convertDeployedContractToDeployedDeploy( - vertex: DeployedContractRecipeVertex, + vertex: DeployedContractDeploymentVertex, _transformContext: TransformContext ): Promise { return { @@ -97,7 +97,7 @@ async function convertDeployedContractToDeployedDeploy( } async function convertCallToContractCall( - vertex: CallRecipeVertex, + vertex: CallDeploymentVertex, transformContext: TransformContext ): Promise { return { @@ -112,7 +112,7 @@ async function convertCallToContractCall( } async function convertHardhatLibraryToLibraryDeploy( - vertex: HardhatLibraryRecipeVertex, + vertex: HardhatLibraryDeploymentVertex, transformContext: TransformContext ): Promise { const artifact: Artifact = @@ -128,7 +128,7 @@ async function convertHardhatLibraryToLibraryDeploy( } async function convertArtifactLibraryToLibraryDeploy( - vertex: ArtifactLibraryRecipeVertex, + vertex: ArtifactLibraryDeploymentVertex, transformContext: TransformContext ): Promise { return { @@ -151,9 +151,9 @@ function assertRecipeVertexNotExpected( } async function convertArgs( - args: Array, + args: Array, transformContext: TransformContext -): Promise> { +): Promise> { const resolvedArgs = []; for (const arg of args) { @@ -166,7 +166,7 @@ async function convertArgs( } async function resolveParameter( - arg: boolean | string | number | RecipeFuture, + arg: boolean | string | number | DeploymentGraphFuture, { services, graph }: TransformContext ) { if (!isFuture(arg)) { diff --git a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts new file mode 100644 index 0000000000..c110a081f3 --- /dev/null +++ b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -0,0 +1,46 @@ +import { DeploymentGraph } from "dsl/DeploymentGraph"; +import { eliminate } from "graph/adjacencyList"; +import { DeploymentGraphVertex } from "types/deploymentGraph"; + +/** + * Recipe graphs can have virtual vertex that represent the + * execution of all vertex in a recipe. + * + * We reduce the graph to remove the virtual nodes, by adding + * edges from any dependents to the virtual nodes dependents: + * + * A B A B + * │ │ │ │ + * └──►V◄──┘ ~ └─►C◄─┘ + * │ ~ + * ▼ + * C + * + * @param deploymentGraph the recipe graph with recipe virtual vertexes + * @returns a reduced recipe graph + */ +export function reduceDeploymentGraphByEliminatingVirtualVertexes( + deploymentGraph: DeploymentGraph +): DeploymentGraph { + const virtualVertexes = [...deploymentGraph.vertexes.values()].filter( + (v) => v.type === "Virtual" + ); + + for (const virtualVertex of virtualVertexes) { + eliminateVirtualVertexFrom(deploymentGraph, virtualVertex); + } + + return deploymentGraph; +} + +function eliminateVirtualVertexFrom( + deploymentGraph: DeploymentGraph, + virtualVertex: DeploymentGraphVertex +): void { + deploymentGraph.adjacencyList = eliminate( + deploymentGraph.adjacencyList, + virtualVertex.id + ); + + deploymentGraph.vertexes.delete(virtualVertex.id); +} diff --git a/packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts deleted file mode 100644 index f9dd506a83..0000000000 --- a/packages/core/src/process/transform/reduceRecipeGraphByEliminatingVirtualVertexes.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { eliminate } from "graph/adjacencyList"; -import { RecipeGraph } from "recipe/RecipeGraph"; -import { RecipeVertex } from "types/recipeGraph"; - -/** - * Recipe graphs can have virtual vertex that represent the - * execution of all vertex in a recipe. - * - * We reduce the graph to remove the virtual nodes, by adding - * edges from any dependents to the virtual nodes dependents: - * - * A B A B - * │ │ │ │ - * └──►V◄──┘ ~ └─►C◄─┘ - * │ ~ - * ▼ - * C - * - * @param recipeGraph the recipe graph with recipe virtual vertexes - * @returns a reduced recipe graph - */ -export function reduceRecipeGraphByEliminatingVirtualVertexes( - recipeGraph: RecipeGraph -): RecipeGraph { - const virtualVertexes = [...recipeGraph.vertexes.values()].filter( - (v) => v.type === "Virtual" - ); - - for (const virtualVertex of virtualVertexes) { - eliminateVirtualVertexFrom(recipeGraph, virtualVertex); - } - - return recipeGraph; -} - -function eliminateVirtualVertexFrom( - recipeGraph: RecipeGraph, - virtualVertex: RecipeVertex -): void { - recipeGraph.adjacencyList = eliminate( - recipeGraph.adjacencyList, - virtualVertex.id - ); - - recipeGraph.vertexes.delete(virtualVertex.id); -} diff --git a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts new file mode 100644 index 0000000000..564f78b627 --- /dev/null +++ b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts @@ -0,0 +1,43 @@ +import { ExecutionGraph } from "execution/ExecutionGraph"; +import { clone } from "graph/adjacencyList"; +import { Services } from "services/types"; +import { IDeploymentGraph, DeploymentGraphVertex } from "types/deploymentGraph"; +import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; +import { TransformResult } from "types/process"; + +import { convertDeploymentVertexToExecutionVertex as convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; +import { reduceDeploymentGraphByEliminatingVirtualVertexes } from "./transform/reduceDeploymentGraphByEliminatingVirtualVertexes"; + +export async function transformDeploymentGraphToExecutionGraph( + deploymentGraph: IDeploymentGraph, + services: Services +): Promise { + const reducedDeploymentGraph = + reduceDeploymentGraphByEliminatingVirtualVertexes(deploymentGraph); + + const executionGraph: IExecutionGraph = await convertDeploymentToExecution( + reducedDeploymentGraph, + convertDeploymentVertexToExecutionVertex({ + services, + graph: reducedDeploymentGraph, + }) + ); + + return { _kind: "success", executionGraph }; +} + +async function convertDeploymentToExecution( + deploymentGraph: IDeploymentGraph, + convert: (vertex: DeploymentGraphVertex) => Promise +) { + const executionGraph = new ExecutionGraph(); + executionGraph.adjacencyList = clone(deploymentGraph.adjacencyList); + + for (const [id, recipeVertex] of deploymentGraph.vertexes.entries()) { + const executionVertex = await convert(recipeVertex); + + executionGraph.vertexes.set(id, executionVertex); + } + + return executionGraph; +} diff --git a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts b/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts deleted file mode 100644 index 8c2e1281f9..0000000000 --- a/packages/core/src/process/transformRecipeGraphToExecutionGraph.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { ExecutionGraph } from "execution/ExecutionGraph"; -import { clone } from "graph/adjacencyList"; -import { Services } from "services/types"; -import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; -import { TransformResult } from "types/process"; -import { IRecipeGraph, RecipeVertex } from "types/recipeGraph"; - -import { convertRecipeVertexToExecutionVertex } from "./transform/convertRecipeVertexToExecutionVertex"; -import { reduceRecipeGraphByEliminatingVirtualVertexes } from "./transform/reduceRecipeGraphByEliminatingVirtualVertexes"; - -export async function transformRecipeGraphToExecutionGraph( - recipeGraph: IRecipeGraph, - services: Services -): Promise { - const reducedRecipeGraph = - reduceRecipeGraphByEliminatingVirtualVertexes(recipeGraph); - - const executionGraph: IExecutionGraph = await convertRecipeToExecution( - reducedRecipeGraph, - convertRecipeVertexToExecutionVertex({ - services, - graph: reducedRecipeGraph, - }) - ); - - return { _kind: "success", executionGraph }; -} - -async function convertRecipeToExecution( - recipeGraph: IRecipeGraph, - convert: (vertex: RecipeVertex) => Promise -) { - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = clone(recipeGraph.adjacencyList); - - for (const [id, recipeVertex] of recipeGraph.vertexes.entries()) { - const executionVertex = await convert(recipeVertex); - - executionGraph.vertexes.set(id, executionVertex); - } - - return executionGraph; -} diff --git a/packages/core/src/recipe/RecipeGraph.ts b/packages/core/src/recipe/RecipeGraph.ts deleted file mode 100644 index 6ca67e5565..0000000000 --- a/packages/core/src/recipe/RecipeGraph.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Graph } from "graph/Graph"; -import { RecipeFuture } from "types/future"; -import { RecipeVertex } from "types/recipeGraph"; - -export class RecipeGraph extends Graph { - public registeredParameters: { - [key: string]: { [key: string]: string | number | RecipeFuture }; - }; - - constructor() { - super(); - - this.registeredParameters = {}; - } -} diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 175a9194b1..4f23f336a5 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,5 +1,5 @@ +import { ExternalParamValue } from "types/deploymentGraph"; import { HasParamResult, Providers } from "types/providers"; -import { ExternalParamValue } from "types/recipeGraph"; export interface IConfigService { getParam(paramName: string): Promise; diff --git a/packages/core/src/types/recipeGraph.ts b/packages/core/src/types/deploymentGraph.ts similarity index 54% rename from packages/core/src/types/recipeGraph.ts rename to packages/core/src/types/deploymentGraph.ts index 36f760153f..654804156d 100644 --- a/packages/core/src/types/recipeGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -3,7 +3,7 @@ import { ArtifactLibrary, ContractCall, DeployedContract, - RecipeFuture, + DeploymentGraphFuture, FutureDict, HardhatContract, HardhatLibrary, @@ -16,104 +16,104 @@ import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; import { Module, ModuleDict } from "./module"; -export interface IRecipeGraph { - vertexes: Map; +export interface IDeploymentGraph { + vertexes: Map; adjacencyList: AdjacencyList; registeredParameters: { - [key: string]: { [key: string]: string | number | RecipeFuture }; + [key: string]: { [key: string]: string | number | DeploymentGraphFuture }; }; getEdges(): Array<{ from: number; to: number }>; } export interface LibraryMap { - [key: string]: RecipeFuture; + [key: string]: DeploymentGraphFuture; } export type ExternalParamValue = boolean | string | number; -export type InternalParamValue = ExternalParamValue | RecipeFuture; +export type InternalParamValue = ExternalParamValue | DeploymentGraphFuture; -export type RecipeVertex = - | HardhatContractRecipeVertex - | ArtifactContractRecipeVertex - | DeployedContractRecipeVertex - | HardhatLibraryRecipeVertex - | ArtifactLibraryRecipeVertex - | CallRecipeVertex +export type DeploymentGraphVertex = + | HardhatContractDeploymentVertex + | ArtifactContractDeploymentVertex + | DeployedContractDeploymentVertex + | HardhatLibraryDeploymentVertex + | ArtifactLibraryDeploymentVertex + | CallDeploymentVertex | VirtualVertex; -export interface HardhatContractRecipeVertex extends VertexDescriptor { +export interface HardhatContractDeploymentVertex extends VertexDescriptor { type: "HardhatContract"; scopeAdded: string; contractName: string; args: InternalParamValue[]; libraries: LibraryMap; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } -export interface ArtifactContractRecipeVertex extends VertexDescriptor { +export interface ArtifactContractDeploymentVertex extends VertexDescriptor { type: "ArtifactContract"; scopeAdded: string; artifact: Artifact; args: InternalParamValue[]; libraries: LibraryMap; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } -export interface DeployedContractRecipeVertex extends VertexDescriptor { +export interface DeployedContractDeploymentVertex extends VertexDescriptor { type: "DeployedContract"; scopeAdded: string; address: string; abi: any[]; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } -export interface HardhatLibraryRecipeVertex extends VertexDescriptor { +export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { type: "HardhatLibrary"; libraryName: string; scopeAdded: string; args: InternalParamValue[]; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } -export interface ArtifactLibraryRecipeVertex extends VertexDescriptor { +export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { type: "ArtifactLibrary"; scopeAdded: string; artifact: Artifact; args: InternalParamValue[]; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } -export interface CallRecipeVertex extends VertexDescriptor { +export interface CallDeploymentVertex extends VertexDescriptor { type: "Call"; scopeAdded: string; contract: CallableFuture; method: string; args: InternalParamValue[]; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } export interface VirtualVertex extends VertexDescriptor { type: "Virtual"; scopeAdded: string; - after: RecipeFuture[]; + after: DeploymentGraphFuture[]; } export interface ContractOptions { args?: InternalParamValue[]; libraries?: { - [key: string]: RecipeFuture; + [key: string]: DeploymentGraphFuture; }; - after?: RecipeFuture[]; + after?: DeploymentGraphFuture[]; } -export interface UseRecipeOptions { - parameters?: { [key: string]: number | string | RecipeFuture }; +export interface UseSubgraphOptions { + parameters?: { [key: string]: number | string | DeploymentGraphFuture }; } -export interface IRecipeGraphBuilder { +export interface IDeploymentBuilder { chainId: number; - graph: IRecipeGraph; + graph: IDeploymentGraph; contract: ( contractName: string, @@ -125,7 +125,7 @@ export interface IRecipeGraphBuilder { contractName: string, address: string, abi: any[], - options?: { after?: RecipeFuture[] } + options?: { after?: DeploymentGraphFuture[] } ) => DeployedContract; library: ( @@ -135,13 +135,13 @@ export interface IRecipeGraphBuilder { ) => HardhatLibrary | ArtifactLibrary; call: ( - contractFuture: RecipeFuture, + contractFuture: DeploymentGraphFuture, functionName: string, { args, }: { args: InternalParamValue[]; - after?: RecipeFuture[]; + after?: DeploymentGraphFuture[]; } ) => ContractCall; @@ -152,15 +152,15 @@ export interface IRecipeGraphBuilder { defaultValue: ParameterValue ) => OptionalParameter; - useSubgraph: (subgraph: Subgraph, options?: UseRecipeOptions) => FutureDict; - useModule: (module: Module, options?: UseRecipeOptions) => ModuleDict; + useSubgraph: (subgraph: Subgraph, options?: UseSubgraphOptions) => FutureDict; + useModule: (module: Module, options?: UseSubgraphOptions) => ModuleDict; } export interface Subgraph { name: string; - subgraphAction: (builder: IRecipeGraphBuilder) => FutureDict; + subgraphAction: (builder: IDeploymentBuilder) => FutureDict; } -export interface RecipeGraphBuilderOptions { +export interface DeploymentBuilderOptions { chainId: number; } diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index 9ec2d52f61..de46a95495 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,7 +1,7 @@ -import { RecipeFuture } from "./future"; +import { LibraryMap } from "./deploymentGraph"; +import { DeploymentGraphFuture } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; -import { LibraryMap } from "./recipeGraph"; export interface IExecutionGraph { adjacencyList: AdjacencyList; @@ -9,7 +9,7 @@ export interface IExecutionGraph { getEdges(): Array<{ from: number; to: number }>; } -export type ArgValue = boolean | string | number | RecipeFuture; +export type ArgValue = boolean | string | number | DeploymentGraphFuture; export type ExecutionVertexType = | "ContractDeploy" diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index ba46ee606d..308fc30684 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -52,7 +52,7 @@ export interface ContractCall { _future: true; } -export type ParameterValue = string | number | RecipeFuture; +export type ParameterValue = string | number | DeploymentGraphFuture; export interface RequiredParameter { label: string; @@ -91,8 +91,8 @@ export type DependableFuture = CallableFuture | ContractCall | Virtual; export type ParameterFuture = RequiredParameter | OptionalParameter; -export type RecipeFuture = DependableFuture | ParameterFuture; +export type DeploymentGraphFuture = DependableFuture | ParameterFuture; export interface FutureDict { - [key: string]: RecipeFuture; + [key: string]: DeploymentGraphFuture; } diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 7d52f7485c..4a25ce6f69 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,5 +1,5 @@ +import type { IDeploymentBuilder } from "./deploymentGraph"; import type { CallableFuture } from "./future"; -import type { IRecipeGraphBuilder } from "./recipeGraph"; export interface ModuleDict { [key: string]: CallableFuture; @@ -7,7 +7,7 @@ export interface ModuleDict { export interface Module { name: string; - moduleAction: (builder: IRecipeGraphBuilder) => ModuleDict; + moduleAction: (builder: IDeploymentBuilder) => ModuleDict; } export interface ModuleData { diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts index b769695051..c5d6011822 100644 --- a/packages/core/src/types/plan.ts +++ b/packages/core/src/types/plan.ts @@ -1,7 +1,7 @@ +import { IDeploymentGraph } from "./deploymentGraph"; import { IExecutionGraph } from "./executionGraph"; -import { IRecipeGraph } from "./recipeGraph"; export interface IgnitionPlan { - recipeGraph: IRecipeGraph; + deploymentGraph: IDeploymentGraph; executionGraph: IExecutionGraph; } diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 9948ef0401..1913dc4b3e 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,7 +1,7 @@ import type { ethers } from "ethers"; +import type { ExternalParamValue } from "./deploymentGraph"; import type { Artifact } from "./hardhat"; -import type { ExternalParamValue } from "./recipeGraph"; export interface Providers { artifacts: ArtifactsProvider; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index b11f39bca6..cadc19acc7 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -1,20 +1,20 @@ +import type { + DeploymentGraphVertex, + HardhatContractDeploymentVertex, + ArtifactContractDeploymentVertex, + DeployedContractDeploymentVertex, + CallDeploymentVertex, + HardhatLibraryDeploymentVertex, + ArtifactLibraryDeploymentVertex, +} from "types/deploymentGraph"; import type { CallableFuture, DependableFuture, OptionalParameter, - RecipeFuture, + DeploymentGraphFuture, RequiredParameter, } from "types/future"; import { Artifact } from "types/hardhat"; -import type { - RecipeVertex, - HardhatContractRecipeVertex, - ArtifactContractRecipeVertex, - DeployedContractRecipeVertex, - CallRecipeVertex, - HardhatLibraryRecipeVertex, - ArtifactLibraryRecipeVertex, -} from "types/recipeGraph"; export function isArtifact(artifact: any): artifact is Artifact { return ( @@ -26,40 +26,42 @@ export function isArtifact(artifact: any): artifact is Artifact { } export function isHardhatContract( - node: RecipeVertex -): node is HardhatContractRecipeVertex { + node: DeploymentGraphVertex +): node is HardhatContractDeploymentVertex { return node.type === "HardhatContract"; } export function isArtifactContract( - node: RecipeVertex -): node is ArtifactContractRecipeVertex { + node: DeploymentGraphVertex +): node is ArtifactContractDeploymentVertex { return node.type === "ArtifactContract"; } export function isDeployedContract( - node: RecipeVertex -): node is DeployedContractRecipeVertex { + node: DeploymentGraphVertex +): node is DeployedContractDeploymentVertex { return node.type === "DeployedContract"; } -export function isCall(node: RecipeVertex): node is CallRecipeVertex { +export function isCall( + node: DeploymentGraphVertex +): node is CallDeploymentVertex { return node.type === "Call"; } export function isHardhatLibrary( - node: RecipeVertex -): node is HardhatLibraryRecipeVertex { + node: DeploymentGraphVertex +): node is HardhatLibraryDeploymentVertex { return node.type === "HardhatLibrary"; } export function isArtifactLibrary( - node: RecipeVertex -): node is ArtifactLibraryRecipeVertex { + node: DeploymentGraphVertex +): node is ArtifactLibraryDeploymentVertex { return node.type === "ArtifactLibrary"; } -export function isFuture(possible: {}): possible is RecipeFuture { +export function isFuture(possible: {}): possible is DeploymentGraphFuture { return ( possible !== undefined && possible !== null && @@ -79,11 +81,13 @@ export function isDependable(possible: any): possible is DependableFuture { } export function isParameter( - future: RecipeFuture + future: DeploymentGraphFuture ): future is RequiredParameter | OptionalParameter { return future.type === "parameter"; } -export function isCallable(future: RecipeFuture): future is CallableFuture { +export function isCallable( + future: DeploymentGraphFuture +): future is CallableFuture { return future.type === "contract" || future.type === "library"; } diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index 793fb787df..e021b0ed11 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; +import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { ArtifactContractRecipeVertex } from "types/recipeGraph"; import { isArtifact } from "utils/guards"; export async function validateArtifactContract( - vertex: ArtifactContractRecipeVertex, + vertex: ArtifactContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 042cb57326..10db27ef59 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; +import { ArtifactLibraryDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { ArtifactLibraryRecipeVertex } from "types/recipeGraph"; import { isArtifact } from "utils/guards"; export async function validateArtifactLibrary( - vertex: ArtifactLibraryRecipeVertex, + vertex: ArtifactLibraryDeploymentVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index efee51fddb..8afdcd7f9b 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; +import { CallDeploymentVertex } from "types/deploymentGraph"; import { CallableFuture } from "types/future"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { CallRecipeVertex } from "types/recipeGraph"; export async function validateCall( - vertex: CallRecipeVertex, + vertex: CallDeploymentVertex, _resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 323bc3757b..9f1f6da9bf 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,11 +1,11 @@ import { isAddress } from "@ethersproject/address"; import { Services } from "services/types"; +import { DeployedContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { DeployedContractRecipeVertex } from "types/recipeGraph"; export async function validateDeployedContract( - vertex: DeployedContractRecipeVertex, + vertex: DeployedContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index f6559b34b5..0d62dd3f1f 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,11 +1,11 @@ import { ethers } from "ethers"; import { Services } from "services/types"; +import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { HardhatContractRecipeVertex } from "types/recipeGraph"; export async function validateHardhatContract( - vertex: HardhatContractRecipeVertex, + vertex: HardhatContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index d8eb3af618..e7327c55fd 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,11 +1,11 @@ import { ethers } from "ethers"; import { Services } from "services/types"; +import { HardhatLibraryDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { HardhatLibraryRecipeVertex } from "types/recipeGraph"; export async function validateHardhatLibrary( - vertex: HardhatLibraryRecipeVertex, + vertex: HardhatLibraryDeploymentVertex, _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index 483bb1f0fa..af791c0f8b 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,9 +1,9 @@ import { Services } from "services/types"; +import { DeploymentGraphVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { RecipeVertex } from "types/recipeGraph"; export async function validateVirtual( - _recipeVertex: RecipeVertex, + _recipeVertex: DeploymentGraphVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index e340e7f8c6..b44040ee3a 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,6 +1,6 @@ import { Services } from "services/types"; +import { DeploymentGraphVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { RecipeVertex } from "types/recipeGraph"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; @@ -11,7 +11,7 @@ import { validateHardhatLibrary } from "./validateHardhatLibrary"; import { validateVirtual } from "./validateVirtual"; export function validationDispatch( - recipeVertex: RecipeVertex, + recipeVertex: DeploymentGraphVertex, resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/validateRecipeGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts similarity index 67% rename from packages/core/src/validation/validateRecipeGraph.ts rename to packages/core/src/validation/validateDeploymentGraph.ts index 94effc52a2..477257127a 100644 --- a/packages/core/src/validation/validateRecipeGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -1,21 +1,21 @@ import { getSortedVertexIdsFrom } from "graph/utils"; import { visit } from "graph/visit"; import { Services } from "services/types"; +import { IDeploymentGraph } from "types/deploymentGraph"; import { VertexVisitResult, VisitResult } from "types/graph"; -import { IRecipeGraph } from "types/recipeGraph"; import { validationDispatch } from "./dispatch/validationDispatch"; -export function validateRecipeGraph( - recipeGraph: IRecipeGraph, +export function validateDeploymentGraph( + deploymentGraph: IDeploymentGraph, services: Services ): Promise { - const orderedVertexIds = getSortedVertexIdsFrom(recipeGraph); + const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); return visit( "Validation", orderedVertexIds, - recipeGraph, + deploymentGraph, { services }, new Map(), validationDispatch diff --git a/packages/core/test/modules.ts b/packages/core/test/modules.ts index 6e00105bc8..0bf8e7e115 100644 --- a/packages/core/test/modules.ts +++ b/packages/core/test/modules.ts @@ -1,18 +1,18 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { DeploymentGraph } from "dsl/DeploymentGraph"; +import { buildModule } from "dsl/buildModule"; +import { buildSubgraph } from "dsl/buildSubgraph"; import { getDependenciesFor } from "graph/adjacencyList"; -import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; -import { RecipeGraph } from "recipe/RecipeGraph"; -import { buildModule } from "recipe/buildModule"; -import { buildSubgraph } from "recipe/buildSubgraph"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, + DeploymentGraphVertex, +} from "types/deploymentGraph"; import { VertexDescriptor } from "types/graph"; import { Artifact } from "types/hardhat"; -import type { - IRecipeGraph, - IRecipeGraphBuilder, - RecipeVertex, -} from "types/recipeGraph"; import { isArtifactContract, isCall, @@ -24,51 +24,51 @@ import { describe("Modules", function () { describe("single contract", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { - const singleModule = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example"); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleModule, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 1); + assert.equal(deploymentGraph.vertexes.size, 1); }); it("should have the contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); assert.isDefined(depNode); assert.equal(depNode?.label, "Example"); }); it("should show no dependencies for the contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node as empty", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Example"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -83,12 +83,12 @@ describe("Modules", function () { }); describe("two unrelated contracts", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const twoContractsModule = buildModule( "two contracts", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const example1 = m.contract("Example1"); const example2 = m.contract("Example2"); @@ -96,63 +96,63 @@ describe("Modules", function () { } ); - const { graph } = generateRecipeGraphFrom(twoContractsModule, { + const { graph } = generateDeploymentGraphFrom(twoContractsModule, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexes.size, 2); + assert.equal(deploymentGraph.vertexes.size, 2); }); it("should have both contract nodes", () => { - const depNode1 = getRecipeVertexByLabel(recipeGraph, "Example1"); + const depNode1 = getRecipeVertexByLabel(deploymentGraph, "Example1"); assert.isDefined(depNode1); assert.equal(depNode1?.label, "Example1"); - const depNode2 = getRecipeVertexByLabel(recipeGraph, "Example2"); + const depNode2 = getRecipeVertexByLabel(deploymentGraph, "Example2"); assert.isDefined(depNode2); assert.equal(depNode2?.label, "Example2"); }); it("should show no dependencies either contract node", () => { - const depNode1 = getRecipeVertexByLabel(recipeGraph, "Example1"); + const depNode1 = getRecipeVertexByLabel(deploymentGraph, "Example1"); if (depNode1 === undefined) { return assert.isDefined(depNode1); } - const deps1 = getDependenciesForVertex(recipeGraph, depNode1); + const deps1 = getDependenciesForVertex(deploymentGraph, depNode1); assert.deepStrictEqual(deps1, []); - const depNode2 = getRecipeVertexByLabel(recipeGraph, "Example2"); + const depNode2 = getRecipeVertexByLabel(deploymentGraph, "Example2"); if (depNode2 === undefined) { return assert.isDefined(depNode1); } - const deps2 = getDependenciesForVertex(recipeGraph, depNode2); + const deps2 = getDependenciesForVertex(deploymentGraph, depNode2); assert.deepStrictEqual(deps2, []); }); }); describe("contract with constructor args", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const withConstructorArgsRecipe = buildModule( "withConstructorArgs", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const token = m.contract("Token", { args: ["My Token", "TKN", 18], }); @@ -161,42 +161,42 @@ describe("Modules", function () { } ); - const { graph } = generateRecipeGraphFrom(withConstructorArgsRecipe, { + const { graph } = generateDeploymentGraphFrom(withConstructorArgsRecipe, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 1); + assert.equal(deploymentGraph.vertexes.size, 1); }); it("should have the contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); assert.isDefined(depNode); assert.equal(depNode?.label, "Token"); }); it("should show no dependencies for the contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should record the argument list for the contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -211,12 +211,12 @@ describe("Modules", function () { }); describe("dependencies between contracts", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const depsBetweenContractsRecipe = buildModule( "dependenciesBetweenContracts", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const a = m.contract("A"); const someother = m.contract("Someother"); @@ -229,23 +229,26 @@ describe("Modules", function () { } ); - const { graph } = generateRecipeGraphFrom(depsBetweenContractsRecipe, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom( + depsBetweenContractsRecipe, + { + chainId: 31337, + } + ); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have three nodes", () => { - assert.equal(recipeGraph.vertexes.size, 3); + assert.equal(deploymentGraph.vertexes.size, 3); }); it("should have the contract node A", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "A"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -255,7 +258,7 @@ describe("Modules", function () { }); it("should have the contract node B", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "B"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -266,25 +269,25 @@ describe("Modules", function () { }); it("should show no dependencies for the contract node A", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "A"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show two dependencies, on A for the contract node B, on A for Someother", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "B"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [ { id: 0, label: "A", type: "" }, @@ -293,7 +296,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node A as empty", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "A"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -308,10 +311,10 @@ describe("Modules", function () { }); describe("make a call on a contract", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { - const callRecipe = buildModule("call", (m: IRecipeGraphBuilder) => { + const callRecipe = buildModule("call", (m: IDeploymentBuilder) => { const token = m.contract("Token"); const exchange = m.contract("Exchange"); const another = m.contract("Another"); @@ -324,23 +327,23 @@ describe("Modules", function () { return {}; }); - const { graph } = generateRecipeGraphFrom(callRecipe, { + const { graph } = generateDeploymentGraphFrom(callRecipe, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have four nodes", () => { - assert.equal(recipeGraph.vertexes.size, 4); + assert.equal(deploymentGraph.vertexes.size, 4); }); it("should have the contract node Token", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -350,7 +353,7 @@ describe("Modules", function () { }); it("should have the contract node Exchange", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -361,7 +364,10 @@ describe("Modules", function () { }); it("should have the call node Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); + const depNode = getRecipeVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); if (depNode === undefined) { return assert.isDefined(depNode); @@ -372,37 +378,40 @@ describe("Modules", function () { }); it("should show no dependencies for the contract node Token", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show no dependencies for the contract node Exchange", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, []); }); it("should show three dependencies for the call node Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); + const depNode = getRecipeVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [ { @@ -416,7 +425,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node Token as empty", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Token"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -430,7 +439,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -444,7 +453,10 @@ describe("Modules", function () { }); it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Exchange/addToken"); + const depNode = getRecipeVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); if (depNode === undefined) { return assert.isDefined(depNode); @@ -468,10 +480,10 @@ describe("Modules", function () { }); describe("existing contract", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { - const uniswapRecipe = buildModule("Uniswap", (m: IRecipeGraphBuilder) => { + const uniswapRecipe = buildModule("Uniswap", (m: IDeploymentBuilder) => { const abi = [{}]; const someother = m.contract("Someother"); @@ -482,23 +494,23 @@ describe("Modules", function () { return { uniswap }; }); - const { graph } = generateRecipeGraphFrom(uniswapRecipe, { + const { graph } = generateDeploymentGraphFrom(uniswapRecipe, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexes.size, 2); + assert.equal(deploymentGraph.vertexes.size, 2); }); it("should have the deployed contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "UniswapRouter"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -509,27 +521,27 @@ describe("Modules", function () { }); it("should show one dependencies for the deployed contract node on someother", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "UniswapRouter"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "UniswapRouter"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); }); }); describe("deploying a contract from an artifact", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; const fromArtifactRecipe = buildModule( "FromArtifact", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const someother = m.contract("Someother"); const foo = m.contract("Foo", artifact, { @@ -541,23 +553,23 @@ describe("Modules", function () { } ); - const { graph } = generateRecipeGraphFrom(fromArtifactRecipe, { + const { graph } = generateDeploymentGraphFrom(fromArtifactRecipe, { chainId: 31337, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have two nodes", () => { - assert.equal(recipeGraph.vertexes.size, 2); + assert.equal(deploymentGraph.vertexes.size, 2); }); it("should have the artifact contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -568,13 +580,13 @@ describe("Modules", function () { }); it("should show one dependency for the artifact contract node on Someother", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [ { @@ -586,7 +598,7 @@ describe("Modules", function () { }); it("should record the argument list for the artifact contract node", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Foo"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -601,12 +613,12 @@ describe("Modules", function () { }); describe("libraries", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const librariesRecipe = buildModule( "libraries", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const someother = m.contract("Someother"); const safeMath = m.library("SafeMath", { @@ -624,23 +636,23 @@ describe("Modules", function () { } ); - const { graph } = generateRecipeGraphFrom(librariesRecipe, { + const { graph } = generateDeploymentGraphFrom(librariesRecipe, { chainId: 31, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have three nodes", () => { - assert.equal(recipeGraph.vertexes.size, 3); + assert.equal(deploymentGraph.vertexes.size, 3); }); it("should have the library node SafeMath", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -651,7 +663,7 @@ describe("Modules", function () { }); it("should have the contract node Contract", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Contract"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -662,31 +674,31 @@ describe("Modules", function () { }); it("should show one dependencies for the library node SafeMath to Someother", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); }); it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "Contract"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); } - const deps = getDependenciesForVertex(recipeGraph, depNode); + const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath", type: "" }]); }); it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = getRecipeVertexByLabel(recipeGraph, "SafeMath"); + const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -702,7 +714,7 @@ describe("Modules", function () { describe("network chain id", () => { it("should inject the chainId via the builder", () => { - const chainIdRecipe = buildModule("chainId", (m: IRecipeGraphBuilder) => { + const chainIdRecipe = buildModule("chainId", (m: IDeploymentBuilder) => { if (m.chainId === 42) { return {}; } @@ -712,17 +724,17 @@ describe("Modules", function () { return {}; }); - generateRecipeGraphFrom(chainIdRecipe, { chainId: 42 }); + generateDeploymentGraphFrom(chainIdRecipe, { chainId: 42 }); }); }); describe("module parameters", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; before(() => { const librariesRecipe = buildSubgraph( "libraries", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); const name = m.getParam("tokenName"); const token = m.contract("Token", { @@ -745,31 +757,31 @@ describe("Modules", function () { return { token }; }); - const { graph } = generateRecipeGraphFrom(WrapModule, { + const { graph } = generateDeploymentGraphFrom(WrapModule, { chainId: 31, }); - recipeGraph = graph; + deploymentGraph = graph; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 2); + assert.equal(deploymentGraph.vertexes.size, 2); }); }); describe("useModule", () => { - let recipeGraph: IRecipeGraph; + let deploymentGraph: IDeploymentGraph; let returnsWrongFutureType: () => void; let differentParams: () => void; before(() => { const librariesRecipe = buildModule( "libraries", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); const name = m.getParam("tokenName"); const token = m.contract("Token", { @@ -780,7 +792,7 @@ describe("Modules", function () { } ); - const WrapRecipe = buildModule("Wrap", (m: IRecipeGraphBuilder) => { + const WrapRecipe = buildModule("Wrap", (m: IDeploymentBuilder) => { const { token } = m.useModule(librariesRecipe, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -792,32 +804,29 @@ describe("Modules", function () { return { token, token2 }; }); - const { graph } = generateRecipeGraphFrom(WrapRecipe, { + const { graph } = generateDeploymentGraphFrom(WrapRecipe, { chainId: 31, }); - recipeGraph = graph; + deploymentGraph = graph; - const DiffParamsRecipe = buildModule( - "Error", - (m: IRecipeGraphBuilder) => { - const { token } = m.useModule(librariesRecipe, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); + const DiffParamsRecipe = buildModule("Error", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); - const { token: token2 } = m.useModule(librariesRecipe, { - parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, - }); + const { token: token2 } = m.useModule(librariesRecipe, { + parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, + }); - return { token, token2 }; - } - ); + return { token, token2 }; + }); const returnTypeModule = buildModule( "returnsParam", // @ts-ignore // ignoring here to specifically test for js ability to bypass type guards - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); const name = m.getParam("tokenName"); const token = m.contract("Token", { @@ -830,7 +839,7 @@ describe("Modules", function () { const ReturnTypeRecipe = buildModule( "ReturnsParamRecipe", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentBuilder) => { const { token } = m.useModule(returnTypeModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -840,20 +849,20 @@ describe("Modules", function () { ); returnsWrongFutureType = () => { - generateRecipeGraphFrom(ReturnTypeRecipe, { chainId: 31 }); + generateDeploymentGraphFrom(ReturnTypeRecipe, { chainId: 31 }); }; differentParams = () => { - generateRecipeGraphFrom(DiffParamsRecipe, { chainId: 31 }); + generateDeploymentGraphFrom(DiffParamsRecipe, { chainId: 31 }); }; }); it("should create a graph", () => { - assert.isDefined(recipeGraph); + assert.isDefined(deploymentGraph); }); it("should have one node", () => { - assert.equal(recipeGraph.vertexes.size, 2); + assert.equal(deploymentGraph.vertexes.size, 2); }); it("should not allow using the same module with different parameters", () => { @@ -873,22 +882,24 @@ describe("Modules", function () { }); function getRecipeVertexByLabel( - recipeGraph: RecipeGraph, + deploymentGraph: DeploymentGraph, label: string -): RecipeVertex | undefined { - return Array.from(recipeGraph.vertexes.values()).find( +): DeploymentGraphVertex | undefined { + return Array.from(deploymentGraph.vertexes.values()).find( (n) => n.label === label ); } function getDependenciesForVertex( - recipeGraph: RecipeGraph, + deploymentGraph: DeploymentGraph, { id }: { id: number } ): VertexDescriptor[] { - const depIds = getDependenciesFor(recipeGraph.adjacencyList, id); + const depIds = getDependenciesFor(deploymentGraph.adjacencyList, id); return depIds - .map((depId) => recipeGraph.vertexes.get(depId)) - .filter((nodeDesc): nodeDesc is RecipeVertex => nodeDesc !== undefined) + .map((depId) => deploymentGraph.vertexes.get(depId)) + .filter( + (nodeDesc): nodeDesc is DeploymentGraphVertex => nodeDesc !== undefined + ) .map((vertex) => ({ id: vertex.id, label: vertex.label, type: "" })); } diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index e827413baf..11e29a6639 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,12 +1,12 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { generateRecipeGraphFrom } from "process/generateRecipeGraphFrom"; -import { buildModule } from "recipe/buildModule"; -import { buildSubgraph } from "recipe/buildSubgraph"; +import { buildModule } from "dsl/buildModule"; +import { buildSubgraph } from "dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { IDeploymentBuilder } from "types/deploymentGraph"; import { Artifact } from "types/hardhat"; -import type { IRecipeGraphBuilder } from "types/recipeGraph"; -import { validateRecipeGraph } from "validation/validateRecipeGraph"; +import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; import { getMockServices } from "./helpers"; @@ -20,13 +20,13 @@ describe("Validation", () => { describe("artifact contract deploy", () => { it("should validate a correct artifact contract deploy", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example", exampleArtifact); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -34,13 +34,16 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should not validate a artifact contract deploy with the wrong number of args", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -48,7 +51,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -56,7 +59,10 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -76,13 +82,13 @@ describe("Validation", () => { describe("artifact library deploy", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -90,13 +96,16 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should not validate a artifact library deploy with the wrong number of args", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -104,7 +113,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -112,7 +121,10 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -214,7 +226,7 @@ describe("Validation", () => { }; it("should validate a correct call", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [2] }); @@ -222,7 +234,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -234,12 +246,15 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should validate an overriden call", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "inc(bool,uint256)", { args: [true, 2] }); @@ -247,7 +262,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -259,12 +274,15 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should fail a call on a nonexistant function", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "nonexistant", { args: [] }); @@ -272,7 +290,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -284,7 +302,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -302,7 +323,7 @@ describe("Validation", () => { }); it("should fail a call with wrong number of arguments", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [] }); @@ -310,7 +331,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -322,7 +343,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -340,7 +364,7 @@ describe("Validation", () => { }); it("should fail an overloaded call with wrong number of arguments", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("MyContract"); m.call(example, "inc", { args: [] }); @@ -348,7 +372,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -360,7 +384,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -380,7 +407,7 @@ describe("Validation", () => { describe("deployed contract", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const existing = m.contractAt( "Example", "0x0000000000000000000000000000000000000000", @@ -390,7 +417,7 @@ describe("Validation", () => { return { existing }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -398,19 +425,22 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should not validate a deployed contract with an invalid address", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const existing = m.contractAt("Example", "0xBAD", []); return { existing }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -418,7 +448,10 @@ describe("Validation", () => { ...getMockServices(), } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -438,13 +471,13 @@ describe("Validation", () => { describe("hardhat contract deploy", () => { it("should validate a correct contract deploy", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example"); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -456,19 +489,22 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should not validate a contract deploy on a non-existant hardhat contract", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const nonexistant = m.contract("Nonexistant"); return { nonexistant }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -479,7 +515,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -499,13 +538,13 @@ describe("Validation", () => { describe("hardhat library deploy", () => { it("should validate a correct deploy", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example"); return { example }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -517,19 +556,22 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); it("should not validate a library deploy on a non-existant hardhat library", async () => { - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { const nonexistant = m.library("Nonexistant"); return { nonexistant }; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -540,7 +582,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); if (validationResult._kind !== "failure") { return assert.fail("validation should have failed"); @@ -566,13 +611,13 @@ describe("Validation", () => { return { example }; }); - const singleRecipe = buildModule("single", (m: IRecipeGraphBuilder) => { + const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { m.useSubgraph(subgraph); return {}; }); - const { graph } = generateRecipeGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleRecipe, { chainId: 31337, }); @@ -584,7 +629,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateRecipeGraph(graph, mockServices); + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); assert.equal(validationResult._kind, "success"); }); diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index dc04075baa..f97aa248f8 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -59,8 +59,8 @@ export class Renderer { // summary const networkName = this.config.network.name; const networkId = this.config.network.id as string; - const txTotal = utils.getTxTotal(this.plan.recipeGraph); - const summaryLists = utils.getSummaryLists(this.plan.recipeGraph); + const txTotal = utils.getTxTotal(this.plan.deploymentGraph); + const summaryLists = utils.getSummaryLists(this.plan.deploymentGraph); const summary = this._templates.summary.replace( regex, utils.replacer({ networkName, networkId, txTotal, summaryLists }) @@ -68,9 +68,9 @@ export class Renderer { // plan const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid(this.plan.recipeGraph) + utils.graphToMermaid(this.plan.deploymentGraph) ); - const actions = utils.getActions(this.plan.recipeGraph); + const actions = utils.getActions(this.plan.deploymentGraph); const plan = this._templates.plan.replace( regex, utils.replacer({ mermaid, actions }) @@ -84,7 +84,7 @@ export class Renderer { this._writeMainHTML(mainOutput); - for (const vertex of this.plan.recipeGraph.vertexes.values()) { + for (const vertex of this.plan.deploymentGraph.vertexes.values()) { const type = vertex.type === "HardhatContract" ? "Deploy" : "Call"; const label = vertex.label; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 647f71bafe..93283aad02 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,10 +1,10 @@ import { - Recipe, SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, - IRecipeGraphBuilder, + Module, buildModule, + IDeploymentBuilder, } from "@ignored/ignition-core"; import { ModuleDict } from "@ignored/ignition-core/src/types/module"; import { assert } from "chai"; @@ -112,7 +112,7 @@ async function assertTxMined(hre: any, hash: string) { */ export async function deployModules( hre: any, - userRecipes: Recipe[], + userRecipes: Module[], expectedBlocks: number[] ): Promise { await hre.run("compile", { quiet: true }); @@ -199,7 +199,7 @@ async function assertContract(hre: any, futureResult: SerializedFutureResult) { export async function deployModule( hre: any, - recipeDefinition: (m: IRecipeGraphBuilder) => ModuleDict, + recipeDefinition: (m: IDeploymentBuilder) => ModuleDict, options?: { parameters: {} } ): Promise { await hre.run("compile", { quiet: true }); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index c42ea3c9a4..aec378099c 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -2,7 +2,7 @@ import { buildModule, buildSubgraph, - IRecipeGraphBuilder, + IDeploymentGraphBuilder, } from "@ignored/ignition-core"; import { isCallable } from "@ignored/ignition-core/src/utils/guards"; import { assert } from "chai"; @@ -19,26 +19,29 @@ describe("useModule", function () { const thirdPartyModule = buildModule( "ThirdPartyRecipe", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentGraphBuilder) => { const foo = m.contract("Foo"); return { foo }; } ); - const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { - const { foo } = m.useModule(thirdPartyModule); + const userModule = buildModule( + "UserModule", + (m: IDeploymentGraphBuilder) => { + const { foo } = m.useModule(thirdPartyModule); - m.call(foo, "inc", { - args: [], - }); + m.call(foo, "inc", { + args: [], + }); - if (!isCallable(foo)) { - throw new Error("Not callable"); - } + if (!isCallable(foo)) { + throw new Error("Not callable"); + } - return { foo }; - }); + return { foo }; + } + ); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -71,17 +74,20 @@ describe("useModule", function () { return { foo }; }); - const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { - const foo = m.contract("Foo"); + const userModule = buildModule( + "UserModule", + (m: IDeploymentGraphBuilder) => { + const foo = m.contract("Foo"); - m.useSubgraph(thirdPartySubgraph, { - parameters: { - Foo: foo, - }, - }); + m.useSubgraph(thirdPartySubgraph, { + parameters: { + Foo: foo, + }, + }); - return { foo }; - }); + return { foo }; + } + ); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -106,7 +112,7 @@ describe("useModule", function () { const addSecondAndThirdEntrySubgraph = buildSubgraph( "ThirdPartySubgraph", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentGraphBuilder) => { const trace = m.getParam("Trace"); const secondCall = m.call(trace, "addEntry", { @@ -122,24 +128,27 @@ describe("useModule", function () { } ); - const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userModule = buildModule( + "UserModule", + (m: IDeploymentGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { - parameters: { - Trace: trace, - }, - }); + const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [thirdCall], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [thirdCall], + }); - return { trace }; - }); + return { trace }; + } + ); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -168,7 +177,7 @@ describe("useModule", function () { const addSecondAndThirdEntryRecipe = buildSubgraph( "ThirdPartySubgraph", - (m: IRecipeGraphBuilder) => { + (m: IDeploymentGraphBuilder) => { const trace = m.getParam("Trace"); const secondCall = m.call(trace, "addEntry", { @@ -184,24 +193,27 @@ describe("useModule", function () { } ); - const userModule = buildModule("UserModule", (m: IRecipeGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userModule = buildModule( + "UserModule", + (m: IDeploymentGraphBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { recipe } = m.useSubgraph(addSecondAndThirdEntryRecipe, { - parameters: { - Trace: trace, - }, - }); + const { recipe } = m.useSubgraph(addSecondAndThirdEntryRecipe, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [recipe], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [recipe], + }); - return { trace }; - }); + return { trace }; + } + ); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, From 303361bfdca44168fd859ae9906c5ef6c6e461e9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 14:20:50 +0100 Subject: [PATCH 0133/1302] refactor: cleanup usages of recipe --- docs/creating-modules-for-deployment.md | 6 +- docs/design.md | 28 ++-- examples/simple/ignition/Simple.js | 2 +- examples/simple/test/simple.test.js | 4 +- packages/core/src/Ignition.ts | 26 ++-- packages/core/src/deployment/Deployment.ts | 8 +- .../core/src/deployment/deployStateReducer.ts | 4 +- packages/core/src/dsl/DeploymentBuilder.ts | 34 ++--- packages/core/src/journal/FileJournal.ts | 32 ++--- packages/core/src/journal/InMemoryJournal.ts | 32 ++--- packages/core/src/journal/types.ts | 8 +- .../process/generateDeploymentGraphFrom.ts | 6 +- ...onvertDeploymentVertexToExecutionVertex.ts | 37 +++-- ...oymentGraphByEliminatingVirtualVertexes.ts | 8 +- ...ransformDeploymentGraphToExecutionGraph.ts | 4 +- packages/core/src/services/createServices.ts | 4 +- packages/core/src/types/deployment.ts | 10 +- packages/core/src/utils/tx-sender.ts | 10 +- .../src/validation/dispatch/validateCall.ts | 10 +- .../validation/dispatch/validateVirtual.ts | 2 +- .../validation/dispatch/validationDispatch.ts | 48 +++++-- packages/core/test/batch/visitInBatches.ts | 2 +- packages/core/test/execution.ts | 4 +- packages/core/test/modules.ts | 132 +++++++++--------- packages/core/test/tx-sender.ts | 6 +- packages/core/test/validation.ts | 64 ++++----- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +- packages/hardhat-plugin/src/index.ts | 44 +++--- .../src/plan/assets/templates/title.html | 2 +- packages/hardhat-plugin/src/plan/index.ts | 20 +-- packages/hardhat-plugin/src/plan/utils.ts | 4 +- .../ui/components/ValidationFailedPanel.tsx | 4 +- .../ui/components/execution/FinalStatus.tsx | 6 +- .../components/execution/SummarySection.tsx | 4 +- packages/hardhat-plugin/src/ui/types.ts | 6 +- packages/hardhat-plugin/src/user-modules.ts | 71 ++++++++++ packages/hardhat-plugin/src/user-recipes.ts | 71 ---------- .../contracts/Contracts.sol | 0 .../contracts/WithLibrary.sol | 0 .../hardhat.config.js | 0 .../ignition/.testignore | 0 .../ignition/TestModule.js} | 0 packages/hardhat-plugin/test/helpers.ts | 42 +++--- packages/hardhat-plugin/test/params.ts | 8 +- packages/hardhat-plugin/test/plan/index.ts | 2 +- packages/hardhat-plugin/test/use-module.ts | 124 ++++++++-------- packages/hardhat-plugin/test/user-modules.ts | 65 +++++++++ packages/hardhat-plugin/test/user-recipes.ts | 66 --------- 49 files changed, 552 insertions(+), 528 deletions(-) create mode 100644 packages/hardhat-plugin/src/user-modules.ts delete mode 100644 packages/hardhat-plugin/src/user-recipes.ts rename packages/hardhat-plugin/test/fixture-projects/{user-recipes => user-modules}/contracts/Contracts.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-recipes => user-modules}/contracts/WithLibrary.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-recipes => user-modules}/hardhat.config.js (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-recipes => user-modules}/ignition/.testignore (100%) rename packages/hardhat-plugin/test/fixture-projects/{user-recipes/ignition/TestRecipe.js => user-modules/ignition/TestModule.js} (100%) create mode 100644 packages/hardhat-plugin/test/user-modules.ts delete mode 100644 packages/hardhat-plugin/test/user-recipes.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 10c1ab63d0..6af2607df0 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -17,7 +17,7 @@ module.exports = buildModule("MyModule", (m) => { Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. -During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `RecipeBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. +During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. ## Deploying a contract @@ -116,7 +116,7 @@ m.call(exchange, "addToken", { ## Using the network chain id -The recipe builder (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. +The`DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. ```tsx const userModule = buildModule("MyModule", (m) => { @@ -134,7 +134,7 @@ const userModule = buildModule("MyModule", (m) => { ## Module Parameters -Modules can have parameters that are accessed using the RecipeBuilder object: +Modules can have parameters that are accessed using the `DeploymentBuilder` object: ```tsx const symbol = m.getParam("tokenSymbol"); diff --git a/docs/design.md b/docs/design.md index d376f7a905..2d395cb140 100644 --- a/docs/design.md +++ b/docs/design.md @@ -6,10 +6,10 @@ Ignition allows users to describe complex deployments and execute them on-chain. ```mermaid flowchart LR - 0[User Recipe] + 0[User Module] subgraph Ignition - 1[Build Recipe Graph] - 2[Validate Recipe Graph] + 1[Build Deployment Graph] + 2[Validate Deployment Graph] 3[Transform to Execution Graph] 4[Execute] end @@ -21,15 +21,15 @@ flowchart LR Ignition expresses a deployment as a dependency graph of on-chain transactions, that is, contract deployments and contract calls. Deployments and calls can be dependent on each other. A call to a contract requires that that contract first be deployed; the call should not be invoked until the contract deploy has completed entirely and successfully. -Ignition provides the **recipe api** (a js based dsl) so users can succintly describe a dependency graph of contract deploys and calls. +Ignition provides the **deployment api** (a js based dsl) so users can succintly describe a dependency graph of contract deploys and calls. -To deploy on-chain Ignition takes a `Recipe` specified via the **recipe api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). +To deploy on-chain Ignition takes a `Module` specified via the **deployment api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). The `ExecutionGraph` is passed to the execution engine which submits the transactions on-chain, ordering them and batching them based on the dependency constraints of the `ExecutionGraph`. -## Building an `ExecutionGraph` from a Recipe +## Building an `ExecutionGraph` from a Module -The user describes the dependency graph as a `Recipe`, a utility function that takes a graph builder as its first argument. The user can express the on-chain transactions and their dependencies by calls on the graph builder. +The user describes the dependency graph as a `Module`, a utility function that takes a graph builder as its first argument. The user can express the on-chain transactions and their dependencies by calls on the graph builder. ```javascript const subgraph = buildSubgraph("Subgraph", (m) => { @@ -49,7 +49,7 @@ module.exports = buildModule("Example", (m) => { after: [bCall], }); - const { recipe: sub } = m.useSubgraph(subgraph, { + const { subgraph: sub } = m.useSubgraph(subgraph, { after: [a], }); @@ -75,7 +75,7 @@ flowchart BT D(D):::ccall E(E):::ccall - subgraph subrecipe + subgraph sub direction RL F:::contract G(G):::ccall @@ -83,9 +83,9 @@ flowchart BT end B -- calls --> A - subrecipe -.->|after| A - D -.->|after| subrecipe - C -.->|after| subrecipe + sub -.->|after| A + D -.->|after| sub + C -.->|after| sub E -->|after| B D -->|calls| A E -->|calls| A @@ -94,7 +94,7 @@ flowchart BT classDef ccall fill:#b2e061,stroke:darkgray; ``` -During construction of the `DeploymentGraph`, subrecipes are collapsed down to a single level. A vertex that depends on subrecipe, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. +During construction of the `DeploymentGraph`, subgraphs are collapsed down to a single level. A vertex that depends on subgraph, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. ```mermaid flowchart BT @@ -125,7 +125,7 @@ flowchart BT This `DeploymentGraph` is validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). The validation attempts to ensure the `DeploymentGraph` can be transformed into an `ExecutionGraph` without error and to reduce the chance of an on-chain errors during execution. Validation checks do not take into account on-chain state, only enforcing that the deployment makes sense internally. -A valid `DeploymentGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subrecipe virtual nodes**). +A valid `DeploymentGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subgraph virtual nodes**). ```mermaid flowchart BT diff --git a/examples/simple/ignition/Simple.js b/examples/simple/ignition/Simple.js index 9c059568cd..8f27543f0d 100644 --- a/examples/simple/ignition/Simple.js +++ b/examples/simple/ignition/Simple.js @@ -1,7 +1,7 @@ const { buildModule } = require("@ignored/hardhat-ignition"); module.exports = buildModule("Simple", (m) => { - const incAmount = m.getParam("IncAmount"); + const incAmount = m.getOptionalParam("IncAmount", 1); const simple = m.contract("Simple"); diff --git a/examples/simple/test/simple.test.js b/examples/simple/test/simple.test.js index 387510e7c5..a900130977 100644 --- a/examples/simple/test/simple.test.js +++ b/examples/simple/test/simple.test.js @@ -1,11 +1,11 @@ const { assert } = require("chai"); -const SimpleRecipe = require("../ignition/Simple"); +const SimpleModule = require("../ignition/Simple"); describe("Simple", function () { let simpleContract; before(async () => { - const { simple } = await ignition.deploy(SimpleRecipe, { + const { simple } = await ignition.deploy(SimpleModule, { parameters: { IncAmount: 42, }, diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index b9b1658578..5b5068e414 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -26,7 +26,7 @@ export interface IgnitionDeployOptions { ui?: UpdateUiAction; } -type RecipesOutputs = Record; +type ModuleOutputs = Record; export class Ignition { constructor(private _providers: Providers) {} @@ -34,7 +34,7 @@ export class Ignition { public async deploy( ignitionModule: Module, givenOptions?: IgnitionDeployOptions - ): Promise<[DeploymentResult, RecipesOutputs]> { + ): Promise<[DeploymentResult, ModuleOutputs]> { log(`Start deploy`); const options = { @@ -53,7 +53,7 @@ export class Ignition { const chainId = await this._getChainId(); deployment.setChainId(chainId); - const { result: constructResult, recipeOutputs } = + const { result: constructResult, moduleOutputs } = await this._constructExecutionGraphFrom(deployment, ignitionModule); if (constructResult._kind === "failure") { @@ -70,7 +70,7 @@ export class Ignition { } const serializedDeploymentResult = this._serialize( - recipeOutputs, + moduleOutputs, executionResult.result ); @@ -87,7 +87,7 @@ export class Ignition { }; const services: Services = createServices( - "recipeIdEXECUTE", + "moduleIdEXECUTE", "executorIdEXECUTE", serviceOptions ); @@ -127,9 +127,9 @@ export class Ignition { private async _constructExecutionGraphFrom( deployment: Deployment, ignitionModule: Module - ): Promise<{ result: any; recipeOutputs: FutureDict }> { - log("Generate recipe graph from recipe"); - const { graph: deploymentGraph, recipeOutputs } = + ): Promise<{ result: any; moduleOutputs: FutureDict }> { + log("Generate deployment graph from module"); + const { graph: deploymentGraph, moduleOutputs } = generateDeploymentGraphFrom(ignitionModule, { chainId: deployment.state.details.chainId, }); @@ -143,16 +143,16 @@ export class Ignition { if (validationResult._kind === "failure") { deployment.failValidation(validationResult.failures[1]); - return { result: validationResult, recipeOutputs }; + return { result: validationResult, moduleOutputs }; } - log("Transform recipe graph to execution graph"); + log("Transform deployment graph to execution graph"); const transformResult = await transformDeploymentGraphToExecutionGraph( deploymentGraph, deployment.services ); - return { result: transformResult, recipeOutputs }; + return { result: transformResult, moduleOutputs }; } private async _getChainId(): Promise { @@ -163,8 +163,8 @@ export class Ignition { return Number(result); } - private _serialize(recipeOutputs: FutureDict, result: ResultsAccumulator) { - const entries = Object.entries(recipeOutputs).filter( + private _serialize(moduleOutputs: FutureDict, result: ResultsAccumulator) { + const entries = Object.entries(moduleOutputs).filter( (entry): entry is [string, DependableFuture] => isDependable(entry[1]) ); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index ac23022b04..3d5c96496b 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -22,8 +22,8 @@ export class Deployment { public services: Services; public ui?: UpdateUiAction; - constructor(recipeName: string, services: Services, ui?: UpdateUiAction) { - this.state = initializeDeployState(recipeName); + constructor(moduleName: string, services: Services, ui?: UpdateUiAction) { + this.state = initializeDeployState(moduleName); this.services = services; this.ui = ui; } @@ -47,7 +47,7 @@ export class Deployment { }; const services: Services = createServices( - "recipeIdEXECUTE", + "moduleIdEXECUTE", "executorIdEXECUTE", serviceOptions ); @@ -64,7 +64,7 @@ export class Deployment { } public startValidation() { - log("Validate recipe graph"); + log("Validate deployment graph"); this.state = deployStateReducer(this.state, { type: "START_VALIDATION", }); diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index cce3f29600..e0ebc3db48 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -4,11 +4,11 @@ import { DeployPhase, DeployState, ExecutionState } from "types/deployment"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { difference, union } from "utils/sets"; -export function initializeDeployState(recipeName: string): DeployState { +export function initializeDeployState(moduleName: string): DeployState { return { phase: "uninitialized", details: { - recipeName, + moduleName, chainId: 0, }, validation: { diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index f33a8ba9aa..7a5d02038e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -44,7 +44,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public graph: IDeploymentGraph = new DeploymentGraph(); private idCounter: number = 0; private moduleCache: ModuleCache = {}; - private useRecipeInvocationCounter: number = 0; + private useModuleInvocationCounter: number = 0; private scopes: ScopeStack = new ScopeStack(); constructor(options: DeploymentBuilderOptions) { @@ -69,7 +69,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: artifactContractFuture.vertexId, label: libraryName, type: "ArtifactLibrary", @@ -92,7 +92,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: libraryFuture.vertexId, label: libraryName, type: "HardhatLibrary", @@ -124,7 +124,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: artifactContractFuture.vertexId, label: contractName, type: "ArtifactContract", @@ -148,7 +148,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: contractFuture.vertexId, label: contractName, type: "HardhatContract", @@ -178,7 +178,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: deployedFuture.vertexId, label: contractName, type: "DeployedContract", @@ -235,7 +235,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: callFuture.vertexId, label: callFuture.label, type: "Call", @@ -278,11 +278,11 @@ export class DeploymentBuilder implements IDeploymentBuilder { } public useSubgraph( - recipe: Subgraph, + subgraph: Subgraph, options?: UseSubgraphOptions ): FutureDict { - const useRecipeInvocationId = this.useRecipeInvocationCounter++; - const label = `${recipe.name}:${useRecipeInvocationId}`; + const useModuleInvocationId = this.useModuleInvocationCounter++; + const label = `${subgraph.name}:${useModuleInvocationId}`; this.scopes.push(label); const scopeLabel = this.scopes.getScopedLabel(); @@ -291,13 +291,13 @@ export class DeploymentBuilder implements IDeploymentBuilder { this.graph.registeredParameters[scopeLabel] = options.parameters; } - const result = recipe.subgraphAction(this); + const result = subgraph.subgraphAction(this); - const virtualVertex = this._createRecipeVirtualVertex(label); + const virtualVertex = this._createVirtualVertex(label); this.scopes.pop(); - return { ...result, recipe: virtualVertex }; + return { ...result, subgraph: virtualVertex }; } public useModule(module: Module, options?: UseSubgraphOptions): ModuleDict { @@ -322,7 +322,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { } } - this._createRecipeVirtualVertex(label); + this._createVirtualVertex(label); this.scopes.pop(); @@ -344,7 +344,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return this.moduleCache[label].result; } - private _createRecipeVirtualVertex(label: string): Virtual { + private _createVirtualVertex(label: string): Virtual { const virtualFuture: Virtual = { vertexId: this._resolveNextId(), label, @@ -365,7 +365,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { }) ); - DeploymentBuilder._addRecipeVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, { id: virtualFuture.vertexId, label, type: "Virtual", @@ -380,7 +380,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return this.idCounter++; } - private static _addRecipeVertex( + private static _addVertex( graph: DeploymentGraph, depNode: DeploymentGraphVertex ) { diff --git a/packages/core/src/journal/FileJournal.ts b/packages/core/src/journal/FileJournal.ts index 19864c70e2..1bb10bcaf2 100644 --- a/packages/core/src/journal/FileJournal.ts +++ b/packages/core/src/journal/FileJournal.ts @@ -9,11 +9,11 @@ export class FileJournal implements Journal { constructor(private _path: string) {} public async addEntry( - recipeId: string, + moduleId: string, executorId: string, journalEntry: JournalEntry ): Promise { - this._log(`Adding entry to ${recipeId}/${executorId}`); + this._log(`Adding entry to ${moduleId}/${executorId}`); let content; if (await fsExtra.pathExists(this._path)) { @@ -22,39 +22,39 @@ export class FileJournal implements Journal { content = {}; } - content[recipeId] = content[recipeId] ?? {}; - content[recipeId][executorId] = content[recipeId][executorId] ?? []; - content[recipeId][executorId].push(journalEntry); + content[moduleId] = content[moduleId] ?? {}; + content[moduleId][executorId] = content[moduleId][executorId] ?? []; + content[moduleId][executorId].push(journalEntry); await fsExtra.writeJson(this._path, content, { spaces: 2, }); - return content[recipeId][executorId].length - 1; + return content[moduleId][executorId].length - 1; } public async getEntry( - recipeId: string, + moduleId: string, executorId: string, entryIndex: number ): Promise { - this._log(`Getting entry ${entryIndex} from ${recipeId}/${executorId}`); + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); if (!(await fsExtra.pathExists(this._path))) { return; } const content = await fsExtra.readJson(this._path); - return content?.[recipeId]?.[executorId]?.[entryIndex]; + return content?.[moduleId]?.[executorId]?.[entryIndex]; } public async replaceEntry( - recipeId: string, + moduleId: string, executorId: string, txIndex: number, journalEntry: JournalEntry ): Promise { - this._log(`Replacing entry ${txIndex} from ${recipeId}/${executorId}`); + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); let content; if (await fsExtra.pathExists(this._path)) { @@ -63,26 +63,26 @@ export class FileJournal implements Journal { content = {}; } - if (content[recipeId]?.[executorId]?.[txIndex] === undefined) { + if (content[moduleId]?.[executorId]?.[txIndex] === undefined) { throw new Error(`Assertion error: replacing non-existent transaction`); } - content[recipeId][executorId][txIndex] = journalEntry; + content[moduleId][executorId][txIndex] = journalEntry; await fsExtra.writeJson(this._path, content, { spaces: 2, }); } - public async delete(recipeId: string) { - this._log(`Deleting recipe ${recipeId}`); + public async delete(moduleId: string) { + this._log(`Deleting module ${moduleId}`); if (!(await fsExtra.pathExists(this._path))) { return; } const content = await fsExtra.readJson(this._path); - delete content?.[recipeId]; + delete content?.[moduleId]; if (Object.entries(content).length === 0) { await fsExtra.remove(this._path); diff --git a/packages/core/src/journal/InMemoryJournal.ts b/packages/core/src/journal/InMemoryJournal.ts index a5046f11e9..7940340373 100644 --- a/packages/core/src/journal/InMemoryJournal.ts +++ b/packages/core/src/journal/InMemoryJournal.ts @@ -9,43 +9,43 @@ export class InMemoryJournal implements Journal { private _journal: Map> = new Map(); public async addEntry( - recipeId: string, + moduleId: string, executorId: string, journalEntry: JournalEntry ): Promise { - this._log(`Adding entry to ${recipeId}/${executorId}`); + this._log(`Adding entry to ${moduleId}/${executorId}`); - const recipeEntry: Map = - this._journal.get(recipeId) ?? new Map(); - const executorEntries = recipeEntry.get(executorId) ?? []; + const moduleEntry: Map = + this._journal.get(moduleId) ?? new Map(); + const executorEntries = moduleEntry.get(executorId) ?? []; executorEntries.push(journalEntry); - recipeEntry.set(executorId, executorEntries); - this._journal.set(recipeId, recipeEntry); + moduleEntry.set(executorId, executorEntries); + this._journal.set(moduleId, moduleEntry); return executorEntries.length - 1; } public async getEntry( - recipeId: string, + moduleId: string, executorId: string, entryIndex: number ): Promise { - this._log(`Getting entry ${entryIndex} from ${recipeId}/${executorId}`); + this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); - return this._journal.get(recipeId)?.get(executorId)?.[entryIndex]; + return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; } public async replaceEntry( - recipeId: string, + moduleId: string, executorId: string, txIndex: number, entryIndex: JournalEntry ): Promise { - this._log(`Replacing entry ${txIndex} from ${recipeId}/${executorId}`); + this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); - const transactions = this._journal.get(recipeId)?.get(executorId); + const transactions = this._journal.get(moduleId)?.get(executorId); if (transactions === undefined || transactions[txIndex] === undefined) { throw new Error(`Assertion error: replacing non-existent transaction`); } @@ -53,9 +53,9 @@ export class InMemoryJournal implements Journal { transactions[txIndex] = entryIndex; } - public async delete(recipeId: string) { - this._log(`Deleting recipe ${recipeId}`); + public async delete(moduleId: string) { + this._log(`Deleting module ${moduleId}`); - this._journal.delete(recipeId); + this._journal.delete(moduleId); } } diff --git a/packages/core/src/journal/types.ts b/packages/core/src/journal/types.ts index f85bb3e4de..f990b339a1 100644 --- a/packages/core/src/journal/types.ts +++ b/packages/core/src/journal/types.ts @@ -10,20 +10,20 @@ export interface JournalEntry { */ export interface Journal { addEntry( - recipeId: string, + moduleId: string, executorId: string, entry: JournalEntry ): Promise; getEntry( - recipeId: string, + moduleId: string, executorId: string, entryIndex: number ): Promise; replaceEntry( - recipeId: string, + moduleId: string, executorId: string, entryIndex: number, entry: JournalEntry ): Promise; - delete(recipeId: string): Promise; + delete(moduleId: string): Promise; } diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index e338298612..d776dffa22 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -9,10 +9,10 @@ import { Module } from "types/module"; export function generateDeploymentGraphFrom( ignitionModule: Module, builderOptions: DeploymentBuilderOptions -): { graph: IDeploymentGraph; recipeOutputs: FutureDict } { +): { graph: IDeploymentGraph; moduleOutputs: FutureDict } { const graphBuilder = new DeploymentBuilder(builderOptions); - const recipeOutputs = ignitionModule.moduleAction(graphBuilder); + const moduleOutputs = ignitionModule.moduleAction(graphBuilder); - return { graph: graphBuilder.graph, recipeOutputs }; + return { graph: graphBuilder.graph, moduleOutputs }; } diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index b25ba71177..c7ec64f8cd 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -27,27 +27,38 @@ interface TransformContext { export function convertDeploymentVertexToExecutionVertex( context: TransformContext -): (recipeVertex: DeploymentGraphVertex) => Promise { - return (recipeVertex: DeploymentGraphVertex): Promise => { - switch (recipeVertex.type) { +): (deploymentVertex: DeploymentGraphVertex) => Promise { + return ( + deploymentVertex: DeploymentGraphVertex + ): Promise => { + switch (deploymentVertex.type) { case "HardhatContract": - return convertHardhatContractToContractDeploy(recipeVertex, context); + return convertHardhatContractToContractDeploy( + deploymentVertex, + context + ); case "ArtifactContract": - return convertArtifactContractToContractDeploy(recipeVertex, context); + return convertArtifactContractToContractDeploy( + deploymentVertex, + context + ); case "DeployedContract": - return convertDeployedContractToDeployedDeploy(recipeVertex, context); + return convertDeployedContractToDeployedDeploy( + deploymentVertex, + context + ); case "Call": - return convertCallToContractCall(recipeVertex, context); + return convertCallToContractCall(deploymentVertex, context); case "HardhatLibrary": - return convertHardhatLibraryToLibraryDeploy(recipeVertex, context); + return convertHardhatLibraryToLibraryDeploy(deploymentVertex, context); case "ArtifactLibrary": - return convertArtifactLibraryToLibraryDeploy(recipeVertex, context); + return convertArtifactLibraryToLibraryDeploy(deploymentVertex, context); case "Virtual": throw new Error( - `Virtual vertex should be removed ${recipeVertex.id} (${recipeVertex.label})` + `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` ); default: - return assertRecipeVertexNotExpected(recipeVertex); + return assertDeploymentVertexNotExpected(deploymentVertex); } }; } @@ -140,7 +151,7 @@ async function convertArtifactLibraryToLibraryDeploy( }; } -function assertRecipeVertexNotExpected( +function assertDeploymentVertexNotExpected( vertex: never ): Promise { const v: any = vertex; @@ -196,7 +207,7 @@ async function resolveParameter( switch (hasParamResult.errorCode) { case "no-params": throw new Error( - `No parameters object provided to deploy options, but recipe requires parameter "${arg.label}"` + `No parameters object provided to deploy options, but module requires parameter "${arg.label}"` ); case "param-missing": throw new Error(`No parameter provided for "${arg.label}"`); diff --git a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts index c110a081f3..868d63a716 100644 --- a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -3,8 +3,8 @@ import { eliminate } from "graph/adjacencyList"; import { DeploymentGraphVertex } from "types/deploymentGraph"; /** - * Recipe graphs can have virtual vertex that represent the - * execution of all vertex in a recipe. + * Deployment graphs can have virtual vertex that represent the + * execution of all vertex in a module/subgraph. * * We reduce the graph to remove the virtual nodes, by adding * edges from any dependents to the virtual nodes dependents: @@ -16,8 +16,8 @@ import { DeploymentGraphVertex } from "types/deploymentGraph"; * ▼ * C * - * @param deploymentGraph the recipe graph with recipe virtual vertexes - * @returns a reduced recipe graph + * @param deploymentGraph the deployment graph with virtual vertexes + * @returns a reduced deployment graph */ export function reduceDeploymentGraphByEliminatingVirtualVertexes( deploymentGraph: DeploymentGraph diff --git a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts index 564f78b627..199ee30add 100644 --- a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts @@ -33,8 +33,8 @@ async function convertDeploymentToExecution( const executionGraph = new ExecutionGraph(); executionGraph.adjacencyList = clone(deploymentGraph.adjacencyList); - for (const [id, recipeVertex] of deploymentGraph.vertexes.entries()) { - const executionVertex = await convert(recipeVertex); + for (const [id, deploymentVertex] of deploymentGraph.vertexes.entries()) { + const executionVertex = await convert(deploymentVertex); executionGraph.vertexes.set(id, executionVertex); } diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index 0ef51389d3..70dabe2779 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -9,7 +9,7 @@ import { TransactionsService } from "./TransactionsService"; import { Services } from "./types"; export function createServices( - recipeId: string, + moduleId: string, executorId: string, { providers, @@ -22,7 +22,7 @@ export function createServices( } ): Services { const txSender = new TxSender( - recipeId, + moduleId, executorId, providers.gasProvider, journal diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 157c710977..d6f9c03a51 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -8,11 +8,11 @@ import { export type UpdateUiAction = (deployState: DeployState) => void; -export interface IgnitionRecipesResults { - load: (recipeId: string) => Promise; +export interface IgnitionModuleResults { + load: (moduleId: string) => Promise; save: ( - recipeId: string, - recipeResult: SerializedFutureResult + moduleId: string, + moduleResult: SerializedFutureResult ) => Promise; } @@ -48,7 +48,7 @@ export interface ExecutionState { export interface DeployState { phase: DeployPhase; details: { - recipeName: string; + moduleName: string; chainId: number; }; validation: ValidationState; diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/utils/tx-sender.ts index e21547fe53..d1928634e3 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -17,12 +17,12 @@ export class TxSender { private _txIndex = -1; constructor( - private _recipeId: string, + private _moduleId: string, private _executorId: string, private _gasProvider: GasProvider, private _journal: Journal ) { - this._debug = setupDebug(`ignition:tx-sender:${_recipeId}:${_executorId}`); + this._debug = setupDebug(`ignition:tx-sender:${_moduleId}:${_executorId}`); } /** @@ -38,7 +38,7 @@ export class TxSender { const nextTxIndex = this._txIndex + 1; this._debug(`Getting transaction ${nextTxIndex} from journal`); const journaledTx = await this._journal.getEntry( - this._recipeId, + this._moduleId, this._executorId, nextTxIndex ); @@ -56,7 +56,7 @@ export class TxSender { const sentTx = await this._send(signer, tx); this._txIndex = await this._journal.addEntry( - this._recipeId, + this._moduleId, this._executorId, { txHash: sentTx.hash, blockNumberWhenSent } ); @@ -77,7 +77,7 @@ export class TxSender { ): Promise { const sentTx = await this._send(signer, tx); await this._journal.replaceEntry( - this._recipeId, + this._moduleId, this._executorId, txIndex, { txHash: sentTx.hash, blockNumberWhenSent } diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 8afdcd7f9b..ae8774938f 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -90,7 +90,7 @@ async function resolveArtifactForCallableFuture( ); return artifact.abi; default: - return assertNeverRecipeFuture(future); + return assertNeverDeploymentFuture(future); } case "library": switch (future.subtype) { @@ -102,13 +102,13 @@ async function resolveArtifactForCallableFuture( ); return artifact.abi; default: - return assertNeverRecipeFuture(future); + return assertNeverDeploymentFuture(future); } default: - return assertNeverRecipeFuture(future); + return assertNeverDeploymentFuture(future); } } -function assertNeverRecipeFuture(f: never): undefined { - throw new Error(`Unexpected recipe future type/subtype ${f}`); +function assertNeverDeploymentFuture(f: never): undefined { + throw new Error(`Unexpected deployment future type/subtype ${f}`); } diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index af791c0f8b..d833006215 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -3,7 +3,7 @@ import { DeploymentGraphVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; export async function validateVirtual( - _recipeVertex: DeploymentGraphVertex, + _deploymentVertex: DeploymentGraphVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index b44040ee3a..0a22dd5027 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -11,36 +11,56 @@ import { validateHardhatLibrary } from "./validateHardhatLibrary"; import { validateVirtual } from "./validateVirtual"; export function validationDispatch( - recipeVertex: DeploymentGraphVertex, + deploymentVertex: DeploymentGraphVertex, resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { - switch (recipeVertex.type) { + switch (deploymentVertex.type) { case "ArtifactContract": - return validateArtifactContract(recipeVertex, resultAccumulator, context); + return validateArtifactContract( + deploymentVertex, + resultAccumulator, + context + ); case "ArtifactLibrary": - return validateArtifactLibrary(recipeVertex, resultAccumulator, context); + return validateArtifactLibrary( + deploymentVertex, + resultAccumulator, + context + ); case "DeployedContract": - return validateDeployedContract(recipeVertex, resultAccumulator, context); + return validateDeployedContract( + deploymentVertex, + resultAccumulator, + context + ); case "Call": - return validateCall(recipeVertex, resultAccumulator, context); + return validateCall(deploymentVertex, resultAccumulator, context); case "HardhatLibrary": - return validateHardhatLibrary(recipeVertex, resultAccumulator, context); + return validateHardhatLibrary( + deploymentVertex, + resultAccumulator, + context + ); case "HardhatContract": - return validateHardhatContract(recipeVertex, resultAccumulator, context); + return validateHardhatContract( + deploymentVertex, + resultAccumulator, + context + ); case "Virtual": - return validateVirtual(recipeVertex, resultAccumulator, context); + return validateVirtual(deploymentVertex, resultAccumulator, context); default: - return assertUnknownRecipeVertexType(recipeVertex); + return assertUnknownDeploymentVertexType(deploymentVertex); } } -function assertUnknownRecipeVertexType( - recipeVertex: never +function assertUnknownDeploymentVertexType( + deploymentVertex: never ): Promise { - const vertex = recipeVertex as any; + const vertex = deploymentVertex as any; const forReport = "type" in vertex ? vertex.type : vertex; - throw new Error(`Unknown recipe vertex type: ${forReport}`); + throw new Error(`Unknown deployment vertex type: ${forReport}`); } diff --git a/packages/core/test/batch/visitInBatches.ts b/packages/core/test/batch/visitInBatches.ts index 1001dc8a91..8a5fef2cc7 100644 --- a/packages/core/test/batch/visitInBatches.ts +++ b/packages/core/test/batch/visitInBatches.ts @@ -33,7 +33,7 @@ describe("Execution - visitInBatches", () => { const mockUpdateUiAction = () => {}; const deployment = new Deployment( - "MyRecipe", + "MyModule", mockServices, mockUpdateUiAction ); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index d383f4e5d3..37daba6da2 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -296,7 +296,7 @@ async function assertExecuteSingleVertex( const mockUpdateUiAction = () => {}; const deployment = new Deployment( - "MyRecipe", + "MyModule", mockServices, mockUpdateUiAction ); @@ -322,7 +322,7 @@ async function assertDependentVertex( const mockUpdateUiAction = () => {}; const deployment = new Deployment( - "MyRecipe", + "MyModule", mockServices, mockUpdateUiAction ); diff --git a/packages/core/test/modules.ts b/packages/core/test/modules.ts index 0bf8e7e115..916822fcf6 100644 --- a/packages/core/test/modules.ts +++ b/packages/core/test/modules.ts @@ -49,14 +49,14 @@ describe("Modules", function () { }); it("should have the contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); assert.isDefined(depNode); assert.equal(depNode?.label, "Example"); }); it("should show no dependencies for the contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -68,7 +68,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node as empty", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Example"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -112,19 +112,19 @@ describe("Modules", function () { }); it("should have both contract nodes", () => { - const depNode1 = getRecipeVertexByLabel(deploymentGraph, "Example1"); + const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); assert.isDefined(depNode1); assert.equal(depNode1?.label, "Example1"); - const depNode2 = getRecipeVertexByLabel(deploymentGraph, "Example2"); + const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); assert.isDefined(depNode2); assert.equal(depNode2?.label, "Example2"); }); it("should show no dependencies either contract node", () => { - const depNode1 = getRecipeVertexByLabel(deploymentGraph, "Example1"); + const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); if (depNode1 === undefined) { return assert.isDefined(depNode1); @@ -134,7 +134,7 @@ describe("Modules", function () { assert.deepStrictEqual(deps1, []); - const depNode2 = getRecipeVertexByLabel(deploymentGraph, "Example2"); + const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); if (depNode2 === undefined) { return assert.isDefined(depNode1); @@ -150,7 +150,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const withConstructorArgsRecipe = buildModule( + const withConstructorArgsModule = buildModule( "withConstructorArgs", (m: IDeploymentBuilder) => { const token = m.contract("Token", { @@ -161,7 +161,7 @@ describe("Modules", function () { } ); - const { graph } = generateDeploymentGraphFrom(withConstructorArgsRecipe, { + const { graph } = generateDeploymentGraphFrom(withConstructorArgsModule, { chainId: 31337, }); @@ -177,14 +177,14 @@ describe("Modules", function () { }); it("should have the contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); assert.isDefined(depNode); assert.equal(depNode?.label, "Token"); }); it("should show no dependencies for the contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -196,7 +196,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -214,7 +214,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const depsBetweenContractsRecipe = buildModule( + const depsBetweenContractsModule = buildModule( "dependenciesBetweenContracts", (m: IDeploymentBuilder) => { const a = m.contract("A"); @@ -230,7 +230,7 @@ describe("Modules", function () { ); const { graph } = generateDeploymentGraphFrom( - depsBetweenContractsRecipe, + depsBetweenContractsModule, { chainId: 31337, } @@ -248,7 +248,7 @@ describe("Modules", function () { }); it("should have the contract node A", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -258,7 +258,7 @@ describe("Modules", function () { }); it("should have the contract node B", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "B"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -269,7 +269,7 @@ describe("Modules", function () { }); it("should show no dependencies for the contract node A", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -281,7 +281,7 @@ describe("Modules", function () { }); it("should show two dependencies, on A for the contract node B, on A for Someother", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "B"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -296,7 +296,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node A as empty", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "A"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -314,7 +314,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const callRecipe = buildModule("call", (m: IDeploymentBuilder) => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { const token = m.contract("Token"); const exchange = m.contract("Exchange"); const another = m.contract("Another"); @@ -327,7 +327,7 @@ describe("Modules", function () { return {}; }); - const { graph } = generateDeploymentGraphFrom(callRecipe, { + const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, }); @@ -343,7 +343,7 @@ describe("Modules", function () { }); it("should have the contract node Token", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -353,7 +353,7 @@ describe("Modules", function () { }); it("should have the contract node Exchange", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -364,7 +364,7 @@ describe("Modules", function () { }); it("should have the call node Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel( + const depNode = getDeploymentVertexByLabel( deploymentGraph, "Exchange/addToken" ); @@ -378,7 +378,7 @@ describe("Modules", function () { }); it("should show no dependencies for the contract node Token", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -390,7 +390,7 @@ describe("Modules", function () { }); it("should show no dependencies for the contract node Exchange", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -402,7 +402,7 @@ describe("Modules", function () { }); it("should show three dependencies for the call node Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel( + const depNode = getDeploymentVertexByLabel( deploymentGraph, "Exchange/addToken" ); @@ -425,7 +425,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node Token as empty", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Token"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -439,7 +439,7 @@ describe("Modules", function () { }); it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Exchange"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -453,7 +453,7 @@ describe("Modules", function () { }); it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getRecipeVertexByLabel( + const depNode = getDeploymentVertexByLabel( deploymentGraph, "Exchange/addToken" ); @@ -483,7 +483,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const uniswapRecipe = buildModule("Uniswap", (m: IDeploymentBuilder) => { + const uniswapModule = buildModule("Uniswap", (m: IDeploymentBuilder) => { const abi = [{}]; const someother = m.contract("Someother"); @@ -494,7 +494,7 @@ describe("Modules", function () { return { uniswap }; }); - const { graph } = generateDeploymentGraphFrom(uniswapRecipe, { + const { graph } = generateDeploymentGraphFrom(uniswapModule, { chainId: 31337, }); @@ -510,7 +510,10 @@ describe("Modules", function () { }); it("should have the deployed contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "UniswapRouter"); + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "UniswapRouter" + ); if (depNode === undefined) { return assert.isDefined(depNode); @@ -521,7 +524,10 @@ describe("Modules", function () { }); it("should show one dependencies for the deployed contract node on someother", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "UniswapRouter"); + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "UniswapRouter" + ); if (depNode === undefined) { return assert.isDefined(depNode); @@ -539,7 +545,7 @@ describe("Modules", function () { before(() => { const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; - const fromArtifactRecipe = buildModule( + const fromArtifactModule = buildModule( "FromArtifact", (m: IDeploymentBuilder) => { const someother = m.contract("Someother"); @@ -553,7 +559,7 @@ describe("Modules", function () { } ); - const { graph } = generateDeploymentGraphFrom(fromArtifactRecipe, { + const { graph } = generateDeploymentGraphFrom(fromArtifactModule, { chainId: 31337, }); @@ -569,7 +575,7 @@ describe("Modules", function () { }); it("should have the artifact contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -580,7 +586,7 @@ describe("Modules", function () { }); it("should show one dependency for the artifact contract node on Someother", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -598,7 +604,7 @@ describe("Modules", function () { }); it("should record the argument list for the artifact contract node", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Foo"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -616,7 +622,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const librariesRecipe = buildModule( + const librariesModule = buildModule( "libraries", (m: IDeploymentBuilder) => { const someother = m.contract("Someother"); @@ -636,7 +642,7 @@ describe("Modules", function () { } ); - const { graph } = generateDeploymentGraphFrom(librariesRecipe, { + const { graph } = generateDeploymentGraphFrom(librariesModule, { chainId: 31, }); @@ -652,7 +658,7 @@ describe("Modules", function () { }); it("should have the library node SafeMath", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -663,7 +669,7 @@ describe("Modules", function () { }); it("should have the contract node Contract", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Contract"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -674,7 +680,7 @@ describe("Modules", function () { }); it("should show one dependencies for the library node SafeMath to Someother", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -686,7 +692,7 @@ describe("Modules", function () { }); it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "Contract"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -698,7 +704,7 @@ describe("Modules", function () { }); it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = getRecipeVertexByLabel(deploymentGraph, "SafeMath"); + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -714,7 +720,7 @@ describe("Modules", function () { describe("network chain id", () => { it("should inject the chainId via the builder", () => { - const chainIdRecipe = buildModule("chainId", (m: IDeploymentBuilder) => { + const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { if (m.chainId === 42) { return {}; } @@ -724,7 +730,7 @@ describe("Modules", function () { return {}; }); - generateDeploymentGraphFrom(chainIdRecipe, { chainId: 42 }); + generateDeploymentGraphFrom(chainIdModule, { chainId: 42 }); }); }); @@ -732,7 +738,7 @@ describe("Modules", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const librariesRecipe = buildSubgraph( + const librariesSubgraph = buildSubgraph( "libraries", (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); @@ -746,7 +752,7 @@ describe("Modules", function () { ); const WrapModule = buildModule("Wrap", (m) => { - const { token } = m.useSubgraph(librariesRecipe, { + const { token } = m.useSubgraph(librariesSubgraph, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); @@ -779,7 +785,7 @@ describe("Modules", function () { let differentParams: () => void; before(() => { - const librariesRecipe = buildModule( + const librariesModule = buildModule( "libraries", (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); @@ -792,30 +798,30 @@ describe("Modules", function () { } ); - const WrapRecipe = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesRecipe, { + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - const { token: token2 } = m.useModule(librariesRecipe, { + const { token: token2 } = m.useModule(librariesModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); return { token, token2 }; }); - const { graph } = generateDeploymentGraphFrom(WrapRecipe, { + const { graph } = generateDeploymentGraphFrom(WrapModule, { chainId: 31, }); deploymentGraph = graph; - const DiffParamsRecipe = buildModule("Error", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesRecipe, { + const DiffParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - const { token: token2 } = m.useModule(librariesRecipe, { + const { token: token2 } = m.useModule(librariesModule, { parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, }); @@ -837,8 +843,8 @@ describe("Modules", function () { } ); - const ReturnTypeRecipe = buildModule( - "ReturnsParamRecipe", + const ReturnTypeModule = buildModule( + "ReturnsParamModule", (m: IDeploymentBuilder) => { const { token } = m.useModule(returnTypeModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, @@ -849,11 +855,11 @@ describe("Modules", function () { ); returnsWrongFutureType = () => { - generateDeploymentGraphFrom(ReturnTypeRecipe, { chainId: 31 }); + generateDeploymentGraphFrom(ReturnTypeModule, { chainId: 31 }); }; differentParams = () => { - generateDeploymentGraphFrom(DiffParamsRecipe, { chainId: 31 }); + generateDeploymentGraphFrom(DiffParamsModule, { chainId: 31 }); }; }); @@ -881,7 +887,7 @@ describe("Modules", function () { }); }); -function getRecipeVertexByLabel( +function getDeploymentVertexByLabel( deploymentGraph: DeploymentGraph, label: string ): DeploymentGraphVertex | undefined { diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index d41d12cacd..7875dc10b2 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -47,7 +47,7 @@ function runTests(createJournal: () => Journal) { it("should add two transactions to journal", async function () { const txSender = new TxSender( - "MyRecipe", + "MyModule", "MyExecutor", mockGasProvider, createJournal() @@ -70,7 +70,7 @@ function runTests(createJournal: () => Journal) { it("should not re-send an already sent transaction", async function () { const journal = createJournal(); const txSender = new TxSender( - "MyRecipe", + "MyModule", "MyExecutor", mockGasProvider, journal @@ -85,7 +85,7 @@ function runTests(createJournal: () => Journal) { signerStub.sendTransaction.resetHistory(); const txSender2 = new TxSender( - "MyRecipe", + "MyModule", "MyExecutor", mockGasProvider, journal diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 11e29a6639..8ad69e89b8 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -20,13 +20,13 @@ describe("Validation", () => { describe("artifact contract deploy", () => { it("should validate a correct artifact contract deploy", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example", exampleArtifact); return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -43,7 +43,7 @@ describe("Validation", () => { }); it("should not validate a artifact contract deploy with the wrong number of args", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -51,7 +51,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -82,13 +82,13 @@ describe("Validation", () => { describe("artifact library deploy", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact); return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -105,7 +105,7 @@ describe("Validation", () => { }); it("should not validate a artifact library deploy with the wrong number of args", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact, { args: [1, 2, 3], }); @@ -113,7 +113,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -226,7 +226,7 @@ describe("Validation", () => { }; it("should validate a correct call", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [2] }); @@ -234,7 +234,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -254,7 +254,7 @@ describe("Validation", () => { }); it("should validate an overriden call", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "inc(bool,uint256)", { args: [true, 2] }); @@ -262,7 +262,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -282,7 +282,7 @@ describe("Validation", () => { }); it("should fail a call on a nonexistant function", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "nonexistant", { args: [] }); @@ -290,7 +290,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -323,7 +323,7 @@ describe("Validation", () => { }); it("should fail a call with wrong number of arguments", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); m.call(example, "sub", { args: [] }); @@ -331,7 +331,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -364,7 +364,7 @@ describe("Validation", () => { }); it("should fail an overloaded call with wrong number of arguments", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("MyContract"); m.call(example, "inc", { args: [] }); @@ -372,7 +372,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -407,7 +407,7 @@ describe("Validation", () => { describe("deployed contract", () => { it("should validate a correct artifact library deploy", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const existing = m.contractAt( "Example", "0x0000000000000000000000000000000000000000", @@ -417,7 +417,7 @@ describe("Validation", () => { return { existing }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -434,13 +434,13 @@ describe("Validation", () => { }); it("should not validate a deployed contract with an invalid address", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const existing = m.contractAt("Example", "0xBAD", []); return { existing }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -471,13 +471,13 @@ describe("Validation", () => { describe("hardhat contract deploy", () => { it("should validate a correct contract deploy", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example"); return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -498,13 +498,13 @@ describe("Validation", () => { }); it("should not validate a contract deploy on a non-existant hardhat contract", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const nonexistant = m.contract("Nonexistant"); return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -538,13 +538,13 @@ describe("Validation", () => { describe("hardhat library deploy", () => { it("should validate a correct deploy", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example"); return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -565,13 +565,13 @@ describe("Validation", () => { }); it("should not validate a library deploy on a non-existant hardhat library", async () => { - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const nonexistant = m.library("Nonexistant"); return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); @@ -611,13 +611,13 @@ describe("Validation", () => { return { example }; }); - const singleRecipe = buildModule("single", (m: IDeploymentBuilder) => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { m.useSubgraph(subgraph); return {}; }); - const { graph } = generateDeploymentGraphFrom(singleRecipe, { + const { graph } = generateDeploymentGraphFrom(singleModule, { chainId: 31337, }); diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index c1bfdef979..5c3df5cc30 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -24,7 +24,7 @@ export class ConfigWrapper implements ConfigProvider { public async getParam(paramName: string): Promise { if (this.parameters === undefined) { throw new Error( - `No parameters object provided to deploy options, but recipe requires parameter "${paramName}"` + `No parameters object provided to deploy options, but module/subgraph requires parameter "${paramName}"` ); } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index eaea658727..3b4ecf82f2 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -43,12 +43,12 @@ export class IgnitionWrapper { }); if (deploymentResult._kind === "hold") { - const [recipeId, holdReason] = deploymentResult.holds; - throw new Error(`Execution held for recipe '${recipeId}': ${holdReason}`); + const [moduleId, holdReason] = deploymentResult.holds; + throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); } if (deploymentResult._kind === "failure") { - const [recipeId, failures] = deploymentResult.failures; + const [moduleId, failures] = deploymentResult.failures; let failuresMessage = ""; for (const failure of failures) { @@ -59,7 +59,7 @@ export class IgnitionWrapper { return process.exit(1); } else { throw new Error( - `Execution failed for recipe '${recipeId}':\n\n${failuresMessage}` + `Execution failed for module '${moduleId}':\n\n${failuresMessage}` ); } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3c1d184b95..f310043bd8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -7,7 +7,7 @@ import path from "path"; import { ConfigWrapper } from "./ConfigWrapper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { Renderer } from "./plan"; -import { loadUserModules, loadAllUserModules } from "./user-recipes"; +import { loadUserModules, loadAllUserModules } from "./user-modules"; import "./type-extensions"; export { buildSubgraph, buildModule } from "@ignored/ignition-core"; @@ -97,17 +97,17 @@ extendEnvironment((hre) => { }); task("deploy") - .addOptionalVariadicPositionalParam("userRecipesPaths") + .addOptionalVariadicPositionalParam("userModulesPaths") .addOptionalParam( "parameters", - "A json object as a string, of the recipe parameters" + "A json object as a string, of the module parameters" ) .setAction( async ( { - userRecipesPaths = [], + userModulesPaths = [], parameters: parametersAsJson, - }: { userRecipesPaths: string[]; parameters?: string }, + }: { userModulesPaths: string[]; parameters?: string }, hre ) => { await hre.run("compile", { quiet: true }); @@ -123,58 +123,58 @@ task("deploy") process.exit(0); } - let userRecipes: Module[]; - if (userRecipesPaths.length === 0) { - userRecipes = loadAllUserModules(hre.config.paths.ignition); + let userModules: Module[]; + if (userModulesPaths.length === 0) { + userModules = loadAllUserModules(hre.config.paths.ignition); } else { - userRecipes = loadUserModules( + userModules = loadUserModules( hre.config.paths.ignition, - userRecipesPaths + userModulesPaths ); } - if (userRecipes.length === 0) { - console.warn("No Ignition recipes found"); + if (userModules.length === 0) { + console.warn("No Ignition modules found"); process.exit(0); } - await hre.ignition.deploy(userRecipes[0], { parameters, ui: true }); + await hre.ignition.deploy(userModules[0], { parameters, ui: true }); } ); task("plan") .addFlag("quiet", "Disables logging output path to terminal") - .addOptionalVariadicPositionalParam("userRecipesPaths") + .addOptionalVariadicPositionalParam("userModulesPaths") .setAction( async ( { quiet = false, - userRecipesPaths = [], - }: { quiet: boolean; userRecipesPaths: string[] }, + userModulesPaths = [], + }: { quiet: boolean; userModulesPaths: string[] }, hre ) => { await hre.run("compile", { quiet: true }); let userModules: Module[]; - if (userRecipesPaths.length === 0) { + if (userModulesPaths.length === 0) { userModules = loadAllUserModules(hre.config.paths.ignition); } else { userModules = loadUserModules( hre.config.paths.ignition, - userRecipesPaths + userModulesPaths ); } if (userModules.length === 0) { - console.warn("No Ignition recipes found"); + console.warn("No Ignition modules found"); process.exit(0); } - const [recipe] = userModules; + const [module] = userModules; - const plan = await hre.ignition.plan(recipe); + const plan = await hre.ignition.plan(module); - const renderer = new Renderer(recipe.name, plan, { + const renderer = new Renderer(module.name, plan, { cachePath: hre.config.paths.cache, network: { name: hre.network.name, diff --git a/packages/hardhat-plugin/src/plan/assets/templates/title.html b/packages/hardhat-plugin/src/plan/assets/templates/title.html index 0338fb3137..9dda31cc2e 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/title.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/title.html @@ -1,5 +1,5 @@
      -

      Ignition - %recipeName%

      +

      Ignition - %moduleName%

      diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index f97aa248f8..e530df164a 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -13,7 +13,7 @@ import * as utils from "./utils"; * plan/ * execution/ * .html - * recipe/ + * module/ * .html * index.html */ @@ -38,7 +38,7 @@ export class Renderer { private _templates: LoadedTemplates = {}; constructor( - public recipeName: string, + public moduleName: string, public plan: IgnitionPlan, public config: RendererConfig ) { @@ -53,7 +53,7 @@ export class Renderer { // title bar const title = this._templates.title.replace( regex, - utils.replacer({ recipeName: this.recipeName }) + utils.replacer({ moduleName: this.moduleName }) ); // summary @@ -95,7 +95,7 @@ export class Renderer { utils.replacer({ type, label, networkName, networkId, params }) ); - this._writeRecipeHTML(vertex.id, vertexOutput); + this._writeModuleHTML(vertex.id, vertexOutput); this._writeDebugJSON(vertex.id, JSON.stringify(vertex, null, 2)); } } @@ -125,8 +125,8 @@ export class Renderer { return path.resolve(this.config.cachePath, "plan"); } - public get recipePath(): string { - return path.resolve(this.planPath, "recipe"); + public get modulePath(): string { + return path.resolve(this.planPath, "module"); } public get executionPath(): string { @@ -141,8 +141,8 @@ export class Renderer { return path.resolve(this._assetsPath, "templates"); } - private _writeRecipeHTML(id: number, text: string): void { - fs.writeFileSync(`${this.recipePath}/${id}.html`, text, "utf8"); + private _writeModuleHTML(id: number, text: string): void { + fs.writeFileSync(`${this.modulePath}/${id}.html`, text, "utf8"); } private _writeMainHTML(text: string): void { @@ -150,7 +150,7 @@ export class Renderer { } private _writeDebugJSON(id: number, text: string): void { - fs.writeFileSync(`${this.recipePath}/${id}.json`, text, "utf8"); + fs.writeFileSync(`${this.modulePath}/${id}.json`, text, "utf8"); } private _loadHTMLAssets(): void { @@ -178,7 +178,7 @@ export class Renderer { } private _ensureDirectoryStructure(): void { - fs.ensureDirSync(this.recipePath); + fs.ensureDirSync(this.modulePath); fs.ensureDirSync(this.executionPath); this._copyUserAssets(); } diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 65d4ba8686..1566ff6e79 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -68,7 +68,7 @@ export function graphToMermaid(graph: VertexGraph): string { .join("\n"); const linkDefinitions = vertexes - .map((v) => `click ${v.id} "recipe/${v.id}.html" _self`) + .map((v) => `click ${v.id} "module/${v.id}.html" _self`) .join("\n"); return ` @@ -96,7 +96,7 @@ export function getActions(graph: VertexGraph): string { return `
    • Contract ${type} ${v.label}
    • diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index 9ddae87029..140987ce9b 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -9,8 +9,8 @@ export const ValidationFailedPanel = ({ return ( - Ignition validation failed for recipe{" "} - {deployState.details.recipeName} + Ignition validation failed for module{" "} + {deployState.details.moduleName} diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index ecdfdbe912..fe0d39fbe5 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -11,8 +11,8 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { - 🚀 Deployment Complete for recipe{" "} - {deployState.details.recipeName} + 🚀 Deployment Complete for module{" "} + {deployState.details.moduleName} ); @@ -28,7 +28,7 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { - ⛔ {deployState.details.recipeName}{" "} + ⛔ {deployState.details.moduleName}{" "} deployment{" "} failed diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 200746bcea..5d9b0c87dc 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -3,7 +3,7 @@ import { Box, Text } from "ink"; export const SummarySection = ({ deployState: { - details: { recipeName }, + details: { moduleName }, }, }: { deployState: DeployState; @@ -11,7 +11,7 @@ export const SummarySection = ({ return ( - Deploying recipe {recipeName} + Deploying module {moduleName} ); diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 5f446653f8..259be9cad8 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -45,15 +45,15 @@ export interface DeploymentError { export class DeploymentState { public phase: DeployPhase; - public recipeName: string; + public moduleName: string; private executionVertexes: { [key: string]: VertexStatus }; private order: number[]; public batches: UiBatch[]; private errors: { [key: number]: VertexVisitResultFailure } | undefined; - constructor({ recipeName }: { recipeName: string }) { - this.recipeName = recipeName; + constructor({ moduleName }: { moduleName: string }) { + this.moduleName = moduleName; this.phase = "uninitialized"; this.order = []; diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts new file mode 100644 index 0000000000..ba07834a1c --- /dev/null +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -0,0 +1,71 @@ +import { Module } from "@ignored/ignition-core"; +import setupDebug from "debug"; +import fsExtra from "fs-extra"; +import path from "path"; + +const debug = setupDebug("hardhat-ignition:modules"); + +export function loadAllUserModules(userModulesDirectory: string): Module[] { + debug(`Loading all user modules from '${userModulesDirectory}'`); + + if (!fsExtra.existsSync(userModulesDirectory)) { + throw new Error(`Directory ${userModulesDirectory} not found.`); + } + + const resolvedUserRecipesPaths = getAllUserModulesPaths(userModulesDirectory); + + return getUserModulesFromPaths(resolvedUserRecipesPaths); +} + +export function loadUserModules( + userModulesDirectory: string, + userModulesFiles: string[] = [] +): Module[] { + debug(`Loading user modules from '${userModulesDirectory}'`); + + if (!fsExtra.existsSync(userModulesDirectory)) { + throw new Error(`Directory ${userModulesDirectory} not found.`); + } + + const resolvedUserModulesPaths = getUserModulesPaths( + userModulesDirectory, + userModulesFiles + ); + + return getUserModulesFromPaths(resolvedUserModulesPaths); +} + +export function getUserModulesFromPaths( + resolvedUserModulesPaths: string[] +): Module[] { + debug(`Loading '${resolvedUserModulesPaths.length}' recipe files`); + + const userModules: any[] = []; + for (const pathToFile of resolvedUserModulesPaths) { + const fileExists = fsExtra.pathExistsSync(pathToFile); + if (!fileExists) { + throw new Error(`Module ${pathToFile} doesn't exist`); + } + + debug(`Loading module file '${pathToFile}'`); + + const userModule = require(pathToFile); + userModules.push(userModule.default ?? userModule); + } + + return userModules; +} + +export function getUserModulesPaths( + userModulesDirectory: string, + userModulesFiles: string[] +): string[] { + return userModulesFiles.map((x) => path.resolve(userModulesDirectory, x)); +} + +export function getAllUserModulesPaths(userModulessDirectory: string) { + return fsExtra + .readdirSync(userModulessDirectory) + .filter((x) => !x.startsWith(".")) + .map((x) => path.resolve(userModulessDirectory, x)); +} diff --git a/packages/hardhat-plugin/src/user-recipes.ts b/packages/hardhat-plugin/src/user-recipes.ts deleted file mode 100644 index 745fb3c933..0000000000 --- a/packages/hardhat-plugin/src/user-recipes.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { Module } from "@ignored/ignition-core"; -import setupDebug from "debug"; -import fsExtra from "fs-extra"; -import path from "path"; - -const debug = setupDebug("hardhat-ignition:recipes"); - -export function loadAllUserModules(userRecipesDirectory: string): Module[] { - debug(`Loading all user modules from '${userRecipesDirectory}'`); - - if (!fsExtra.existsSync(userRecipesDirectory)) { - throw new Error(`Directory ${userRecipesDirectory} not found.`); - } - - const resolvedUserRecipesPaths = getAllUserModulesPaths(userRecipesDirectory); - - return getUserModulesFromPaths(resolvedUserRecipesPaths); -} - -export function loadUserModules( - userRecipesDirectory: string, - userRecipesFiles: string[] = [] -): Module[] { - debug(`Loading user modules from '${userRecipesDirectory}'`); - - if (!fsExtra.existsSync(userRecipesDirectory)) { - throw new Error(`Directory ${userRecipesDirectory} not found.`); - } - - const resolvedUserRecipesPaths = getUserModulesPaths( - userRecipesDirectory, - userRecipesFiles - ); - - return getUserModulesFromPaths(resolvedUserRecipesPaths); -} - -export function getUserModulesFromPaths( - resolvedUserRecipesPaths: string[] -): Module[] { - debug(`Loading '${resolvedUserRecipesPaths.length}' recipe files`); - - const userRecipes: any[] = []; - for (const pathToFile of resolvedUserRecipesPaths) { - const fileExists = fsExtra.pathExistsSync(pathToFile); - if (!fileExists) { - throw new Error(`Recipe ${pathToFile} doesn't exist`); - } - - debug(`Loading recipe file '${pathToFile}'`); - - const userRecipe = require(pathToFile); - userRecipes.push(userRecipe.default ?? userRecipe); - } - - return userRecipes; -} - -export function getUserModulesPaths( - userRecipesDirectory: string, - userRecipesFiles: string[] -): string[] { - return userRecipesFiles.map((x) => path.resolve(userRecipesDirectory, x)); -} - -export function getAllUserModulesPaths(userRecipesDirectory: string) { - return fsExtra - .readdirSync(userRecipesDirectory) - .filter((x) => !x.startsWith(".")) - .map((x) => path.resolve(userRecipesDirectory, x)); -} diff --git a/packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/Contracts.sol rename to packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-recipes/contracts/WithLibrary.sol rename to packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-recipes/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-recipes/hardhat.config.js rename to packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/.testignore b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/.testignore rename to packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore diff --git a/packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/TestRecipe.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-recipes/ignition/TestRecipe.js rename to packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 93283aad02..b4022739ec 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -32,13 +32,13 @@ type ExpectedFutureResult = | { kind: "transaction"; }; -type ExpectedRecipeResult = Record; -type ExpectedDeploymentState = Record; +type ExpectedModuleResult = Record; +type ExpectedDeploymentState = Record; /** * Check that the given deployment result matches some conditions. * - * `expectedResult` is an object with expected recipes results, which have + * `expectedResult` is an object with expected modules results, which have * expected futures results. These futures results assert that that the * result of each future is of the correct type, and it can also run * some custom predicate logic on the result to further verify it. @@ -48,30 +48,30 @@ export async function assertDeploymentState( result: SerializedDeploymentResult, expectedResult: ExpectedDeploymentState ) { - const recipesResults = Object.entries(result); - const expectedRecipes = Object.entries(expectedResult); + const modulesResults = Object.entries(result); + const expectedModules = Object.entries(expectedResult); assert.equal( - recipesResults.length, - expectedRecipes.length, - "Expected result and actual result have a different number of recipes" + modulesResults.length, + expectedModules.length, + "Expected result and actual result have a different number of modules" ); - for (const [recipeId, recipeResult] of recipesResults) { - const expectedRecipe = expectedResult[recipeId]; + for (const [moduleId, moduleResult] of modulesResults) { + const expectedModule = expectedResult[moduleId]; assert.isDefined( - expectedRecipe, - `Recipe ${recipeId} is not part of the expected result` + expectedModule, + `Module ${moduleId} is not part of the expected result` ); assert.equal( - Object.entries(recipeResult).length, - Object.entries(expectedRecipe).length + Object.entries(moduleResult).length, + Object.entries(expectedModule).length ); - for (const [futureId, futureResult] of Object.entries(recipeResult)) { - const expectedFutureResult = expectedRecipe[futureId]; + for (const [futureId, futureResult] of Object.entries(moduleResult)) { + const expectedFutureResult = expectedModule[futureId]; if (expectedFutureResult.kind === "contract") { const contract = await assertContract(hre, futureResult); @@ -112,7 +112,7 @@ async function assertTxMined(hre: any, hash: string) { */ export async function deployModules( hre: any, - userRecipes: Module[], + userModules: Module[], expectedBlocks: number[] ): Promise { await hre.run("compile", { quiet: true }); @@ -120,7 +120,7 @@ export async function deployModules( const deploymentResultPromise: Promise = hre.run( "deploy:deploy-modules", { - userRecipes, + userModules, } ); @@ -199,14 +199,14 @@ async function assertContract(hre: any, futureResult: SerializedFutureResult) { export async function deployModule( hre: any, - recipeDefinition: (m: IDeploymentBuilder) => ModuleDict, + moduleDefinition: (m: IDeploymentBuilder) => ModuleDict, options?: { parameters: {} } ): Promise { await hre.run("compile", { quiet: true }); - const userRecipe = buildModule("MyModule", recipeDefinition); + const userModule = buildModule("MyModule", moduleDefinition); - const deployPromise = hre.ignition.deploy(userRecipe, { + const deployPromise = hre.ignition.deploy(userModule, { ...options, ui: false, }); diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index 6e45bbe382..efae843c8a 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { deployModule, mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("recipe parameters", () => { +describe("module parameters", () => { useEnvironment("minimal"); describe("required", () => { @@ -153,7 +153,7 @@ describe("recipe parameters", () => { it("should throw if no parameters object provided", async function () { await this.hre.run("compile", { quiet: true }); - const userRecipe = buildModule("MyModule", (m) => { + const userModule = buildModule("MyModule", (m) => { const myNumber = m.getParam("MyNumber"); const foo = m.contract("Foo"); @@ -165,13 +165,13 @@ describe("recipe parameters", () => { return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userRecipe, { ui: false }); + const deployPromise = this.hre.ignition.deploy(userModule, { ui: false }); await mineBlocks(this.hre, [1, 1], deployPromise); await assert.isRejected( deployPromise, - 'No parameters object provided to deploy options, but recipe requires parameter "MyNumber"' + 'No parameters object provided to deploy options, but module requires parameter "MyNumber"' ); }); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 68ab6f6c26..0709a1e7ae 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -15,7 +15,7 @@ describe("plan", () => { await this.hre.run("compile", { quiet: true }); await this.hre.run("plan", { quiet: true, - userModulesPaths: ["MyRecipe.js"], + userModulesPaths: ["MyModule.js"], }); const files = await fs.readdir(planPath); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index aec378099c..8fcae04393 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -2,7 +2,7 @@ import { buildModule, buildSubgraph, - IDeploymentGraphBuilder, + IDeploymentBuilder, } from "@ignored/ignition-core"; import { isCallable } from "@ignored/ignition-core/src/utils/guards"; import { assert } from "chai"; @@ -18,30 +18,27 @@ describe("useModule", function () { await this.hre.run("compile", { quiet: true }); const thirdPartyModule = buildModule( - "ThirdPartyRecipe", - (m: IDeploymentGraphBuilder) => { + "ThirdPartySubgraph", + (m: IDeploymentBuilder) => { const foo = m.contract("Foo"); return { foo }; } ); - const userModule = buildModule( - "UserModule", - (m: IDeploymentGraphBuilder) => { - const { foo } = m.useModule(thirdPartyModule); - - m.call(foo, "inc", { - args: [], - }); + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const { foo } = m.useModule(thirdPartyModule); - if (!isCallable(foo)) { - throw new Error("Not callable"); - } + m.call(foo, "inc", { + args: [], + }); - return { foo }; + if (!isCallable(foo)) { + throw new Error("Not callable"); } - ); + + return { foo }; + }); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -74,20 +71,17 @@ describe("useModule", function () { return { foo }; }); - const userModule = buildModule( - "UserModule", - (m: IDeploymentGraphBuilder) => { - const foo = m.contract("Foo"); + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const foo = m.contract("Foo"); - m.useSubgraph(thirdPartySubgraph, { - parameters: { - Foo: foo, - }, - }); + m.useSubgraph(thirdPartySubgraph, { + parameters: { + Foo: foo, + }, + }); - return { foo }; - } - ); + return { foo }; + }); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -112,7 +106,7 @@ describe("useModule", function () { const addSecondAndThirdEntrySubgraph = buildSubgraph( "ThirdPartySubgraph", - (m: IDeploymentGraphBuilder) => { + (m: IDeploymentBuilder) => { const trace = m.getParam("Trace"); const secondCall = m.call(trace, "addEntry", { @@ -128,27 +122,24 @@ describe("useModule", function () { } ); - const userModule = buildModule( - "UserModule", - (m: IDeploymentGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { - parameters: { - Trace: trace, - }, - }); + const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [thirdCall], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [thirdCall], + }); - return { trace }; - } - ); + return { trace }; + }); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, @@ -172,12 +163,12 @@ describe("useModule", function () { ); }); - it("should allow ordering based on the recipe overall", async function () { + it("should allow ordering based on the module overall", async function () { await this.hre.run("compile", { quiet: true }); - const addSecondAndThirdEntryRecipe = buildSubgraph( + const addSecondAndThirdEntrySubgraph = buildSubgraph( "ThirdPartySubgraph", - (m: IDeploymentGraphBuilder) => { + (m: IDeploymentBuilder) => { const trace = m.getParam("Trace"); const secondCall = m.call(trace, "addEntry", { @@ -193,27 +184,24 @@ describe("useModule", function () { } ); - const userModule = buildModule( - "UserModule", - (m: IDeploymentGraphBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); - const { recipe } = m.useSubgraph(addSecondAndThirdEntryRecipe, { - parameters: { - Trace: trace, - }, - }); + const { subgraph } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { + parameters: { + Trace: trace, + }, + }); - m.call(trace, "addEntry", { - args: ["fourth"], - after: [recipe], - }); + m.call(trace, "addEntry", { + args: ["fourth"], + after: [subgraph], + }); - return { trace }; - } - ); + return { trace }; + }); const deployPromise = this.hre.ignition.deploy(userModule, { parameters: {}, diff --git a/packages/hardhat-plugin/test/user-modules.ts b/packages/hardhat-plugin/test/user-modules.ts new file mode 100644 index 0000000000..357348749e --- /dev/null +++ b/packages/hardhat-plugin/test/user-modules.ts @@ -0,0 +1,65 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { + loadUserModules, + loadAllUserModules, + getUserModulesFromPaths, + getUserModulesPaths, + getAllUserModulesPaths, +} from "../src/user-modules"; + +import { useEnvironment } from "./useEnvironment"; + +describe("User modules", function () { + useEnvironment("user-modules"); + + describe("loadUserModules", function () { + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadUserModules("/fake", []), + `Directory /fake not found.` + ); + }); + }); + + describe("loadAllUserModuless", function () { + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadAllUserModules("/fake"), + `Directory /fake not found.` + ); + }); + }); + + describe("getAllUserModulessPaths", function () { + it("should return file paths for all user modules in a given directory", () => { + const paths = getAllUserModulesPaths("ignition"); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestModule.js")); + }); + }); + + describe("getUserModulesPaths", function () { + it("should return file paths for the given user module files", () => { + const paths = getUserModulesPaths("ignition", ["TestModule.js"]); + + assert.equal(paths.length, 1); + assert(paths[0].endsWith("TestModule.js")); + }); + }); + + describe("getUserModulesFromPaths", function () { + it("should return a user module from a given path", () => { + const paths = getUserModulesPaths("ignition", ["TestModule.js"]); + const modules = getUserModulesFromPaths(paths); + + assert.equal(modules.length, 1); + }); + + it("should throw if given a file that does not exist", () => { + assert.throws(() => getUserModulesFromPaths(["/fake"])); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/user-recipes.ts b/packages/hardhat-plugin/test/user-recipes.ts deleted file mode 100644 index ebb59638e5..0000000000 --- a/packages/hardhat-plugin/test/user-recipes.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { - loadUserModules, - loadAllUserModules, - getUserModulesFromPaths, - getUserModulesPaths, - getAllUserModulesPaths, -} from "../src/user-recipes"; - -import { useEnvironment } from "./useEnvironment"; - -describe("User recipes", function () { - useEnvironment("user-recipes"); - - describe("loadUserRecipes", function () { - it("should throw if given a user recipe directory that does not exist", async () => { - assert.throws( - () => loadUserModules("/fake", []), - `Directory /fake not found.` - ); - }); - }); - - describe("loadAllUserRecipes", function () { - it("should throw if given a user recipe directory that does not exist", async () => { - assert.throws( - () => loadAllUserModules("/fake"), - `Directory /fake not found.` - ); - }); - }); - - describe("getAllUserRecipesPaths", function () { - it("should return file paths for all user recipes in a given directory", () => { - const paths = getAllUserModulesPaths("ignition"); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestRecipe.js")); - }); - }); - - describe("getUserRecipesPaths", function () { - it("should return file paths for the given user recipe files", () => { - const paths = getUserModulesPaths("ignition", ["TestRecipe.js"]); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestRecipe.js")); - }); - }); - - describe("getUserRecipesFromPaths", function () { - it("should return a user recipe from a given path", () => { - const paths = getUserModulesPaths("ignition", ["TestRecipe.js"]); - const recipes = getUserModulesFromPaths(paths); - - assert.equal(recipes.length, 1); - // assert.equal(recipes[0].id, "testing123"); - }); - - it("should throw if given a file that does not exist", () => { - assert.throws(() => getUserModulesFromPaths(["/fake"])); - }); - }); -}); From c1b177be5210c62716f501d208d9e7d27278d07c Mon Sep 17 00:00:00 2001 From: Morgan Date: Wed, 26 Oct 2022 16:11:49 -0400 Subject: [PATCH 0134/1302] fix typo --- docs/creating-modules-for-deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 6af2607df0..42efec2cab 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -116,7 +116,7 @@ m.call(exchange, "addToken", { ## Using the network chain id -The`DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. +The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. ```tsx const userModule = buildModule("MyModule", (m) => { From b9b6169fef65a246a519fc54cded6afad904d2d2 Mon Sep 17 00:00:00 2001 From: Morgan Date: Wed, 26 Oct 2022 16:19:53 -0400 Subject: [PATCH 0135/1302] make subgraph naming consistent --- packages/core/src/dsl/DeploymentBuilder.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 7a5d02038e..a50c656c23 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -44,7 +44,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public graph: IDeploymentGraph = new DeploymentGraph(); private idCounter: number = 0; private moduleCache: ModuleCache = {}; - private useModuleInvocationCounter: number = 0; + private useSubgraphInvocationCounter: number = 0; private scopes: ScopeStack = new ScopeStack(); constructor(options: DeploymentBuilderOptions) { @@ -281,8 +281,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { subgraph: Subgraph, options?: UseSubgraphOptions ): FutureDict { - const useModuleInvocationId = this.useModuleInvocationCounter++; - const label = `${subgraph.name}:${useModuleInvocationId}`; + const useSubgraphInvocationId = this.useSubgraphInvocationCounter++; + const label = `${subgraph.name}:${useSubgraphInvocationId}`; this.scopes.push(label); const scopeLabel = this.scopes.getScopedLabel(); From 855d5713f588a3c9f931696cc307ea81b89cc1c0 Mon Sep 17 00:00:00 2001 From: Morgan Date: Wed, 26 Oct 2022 16:23:00 -0400 Subject: [PATCH 0136/1302] match buildSubgraph param names --- packages/core/src/dsl/buildModule.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index cf47a7caf8..77a7d45a73 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -3,10 +3,10 @@ import type { Module, ModuleDict } from "types/module"; export function buildModule( moduleName: string, - moduleFunc: (m: IDeploymentBuilder) => ModuleDict + moduleAction: (m: IDeploymentBuilder) => ModuleDict ): Module { return { name: moduleName, - moduleAction: moduleFunc, + moduleAction, }; } From 3990c71b3ce5bf6996729a5f003da606998d7c12 Mon Sep 17 00:00:00 2001 From: Morgan Date: Wed, 26 Oct 2022 16:39:30 -0400 Subject: [PATCH 0137/1302] fix missed recipe references --- packages/hardhat-plugin/src/user-modules.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index ba07834a1c..9ef7f53af6 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -12,9 +12,9 @@ export function loadAllUserModules(userModulesDirectory: string): Module[] { throw new Error(`Directory ${userModulesDirectory} not found.`); } - const resolvedUserRecipesPaths = getAllUserModulesPaths(userModulesDirectory); + const resolvedUserModulesPaths = getAllUserModulesPaths(userModulesDirectory); - return getUserModulesFromPaths(resolvedUserRecipesPaths); + return getUserModulesFromPaths(resolvedUserModulesPaths); } export function loadUserModules( @@ -38,7 +38,7 @@ export function loadUserModules( export function getUserModulesFromPaths( resolvedUserModulesPaths: string[] ): Module[] { - debug(`Loading '${resolvedUserModulesPaths.length}' recipe files`); + debug(`Loading '${resolvedUserModulesPaths.length}' module files`); const userModules: any[] = []; for (const pathToFile of resolvedUserModulesPaths) { From 562b10413ca12a3292d24af065b1375b624ced8a Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 26 Oct 2022 06:38:58 -0400 Subject: [PATCH 0138/1302] refactored contracts service --- .../execution/dispatch/executeContractCall.ts | 9 +- .../dispatch/executeContractDeploy.ts | 12 +- .../dispatch/executeLibraryDeploy.ts | 10 +- .../core/src/services/ContractsService.ts | 116 ++++++------------ packages/core/src/services/createServices.ts | 19 ++- packages/core/test/contractsService.ts | 116 ++++++++++++++++++ packages/core/test/setup.ts | 5 + 7 files changed, 201 insertions(+), 86 deletions(-) create mode 100644 packages/core/test/contractsService.ts diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 48dc18e937..f692c35d6e 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,3 +1,5 @@ +import { Contract } from "ethers"; + import { Services } from "services/types"; import { ContractCall } from "types/executionGraph"; import { VertexVisitResult } from "types/graph"; @@ -17,7 +19,12 @@ export async function executeContractCall( let txHash: string; try { - txHash = await services.contracts.call(address, abi, method, resolvedArgs); + const contractInstance = new Contract(address, abi); + + const unsignedTx = await contractInstance.populateTransaction[method]( + ...resolvedArgs + ); + txHash = await services.contracts.call(unsignedTx); } catch (err) { return { _kind: "failure", diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index f6efa24d68..7661563849 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,6 +1,9 @@ +import { ContractFactory } from "ethers"; + import { Services } from "services/types"; import { ContractDeploy } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; @@ -21,12 +24,17 @@ export async function executeContractDeploy( ]) ); - const txHash = await services.contracts.deploy( + const linkedByteCode = await collectLibrariesAndLink( artifact, - resolvedArgs, resolvedLibraries ); + const Factory = new ContractFactory(artifact.abi, linkedByteCode); + + const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); + + const txHash = await services.contracts.deploy(deployTransaction); + const receipt = await services.transactions.wait(txHash); return { diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 4816a67636..2b101310ab 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,6 +1,9 @@ +import { ContractFactory } from "ethers"; + import { Services } from "services/types"; import { LibraryDeploy } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; @@ -14,7 +17,12 @@ export async function executeLibraryDeploy( .map(resolveFrom(resultAccumulator)) .map(toAddress); - const txHash = await services.contracts.deploy(artifact, resolvedArgs, {}); + const linkedByteCode = await collectLibrariesAndLink(artifact, {}); + + const Factory = new ContractFactory(artifact.abi, linkedByteCode); + + const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); + const txHash = await services.contracts.deploy(deployTransaction); const receipt = await services.transactions.wait(txHash); diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 87dd022345..d7b736279b 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,9 +1,12 @@ import setupDebug from "debug"; -import { ethers, Contract, ContractFactory } from "ethers"; - -import { Artifact } from "types/hardhat"; -import { IgnitionSigner, Providers } from "types/providers"; -import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; +import { ethers } from "ethers"; + +import { + GasProvider, + IgnitionSigner, + SignersProvider, + TransactionsProvider, +} from "types/providers"; import { sleep } from "utils/sleep"; import { TxSender } from "utils/tx-sender"; @@ -11,106 +14,52 @@ import type { TransactionOptions } from "./types"; export interface IContractsService { deploy( - artifact: Artifact, - args: any[], - libraries: { [k: string]: any }, + deployTransaction: ethers.providers.TransactionRequest, txOptions?: TransactionOptions ): Promise; call( - address: string, - abi: any[], - method: string, - args: any[], + unsignedTx: ethers.PopulatedTransaction, txOptions?: TransactionOptions ): Promise; } +export interface ContractsServiceProviders { + web3Provider: ethers.providers.Web3Provider; + signersProvider: SignersProvider; + transactionsProvider: TransactionsProvider; + gasProvider: GasProvider; +} + export class ContractsService implements IContractsService { private _debug = setupDebug("ignition:services:contracts-service"); - private _ethersProvider: ethers.providers.Web3Provider; constructor( - private _providers: Providers, + private _providers: ContractsServiceProviders, private _txSender: TxSender, private _options: { pollingInterval: number } - ) { - this._ethersProvider = new ethers.providers.Web3Provider( - _providers.ethereumProvider - ); - } + ) {} public async deploy( - artifact: Artifact, - args: any[], - libraries: { [k: string]: any }, + deployTransaction: ethers.providers.TransactionRequest, txOptions?: TransactionOptions ): Promise { this._debug("Deploying contract"); - const signer = await this._providers.signers.getDefaultSigner(); - - const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); - - const Factory = new ContractFactory(artifact.abi, linkedByteCode); - - const deployTransaction = Factory.getDeployTransaction(...args); + const signer = await this._providers.signersProvider.getDefaultSigner(); return this._sendTx(signer, deployTransaction, txOptions); } public async call( - address: string, - abi: any[], - method: string, - args: any[], + unsignedTx: ethers.PopulatedTransaction, txOptions?: TransactionOptions ): Promise { this._debug("Calling method of contract"); - const signer = await this._providers.signers.getDefaultSigner(); - const contract = new Contract(address, abi); - - const unsignedTx = await contract.populateTransaction[method](...args); + const signer = await this._providers.signersProvider.getDefaultSigner(); return this._sendTx(signer, unsignedTx, txOptions); } - public async staticCall( - address: string, - abi: any[], - method: string, - args: any[] - ): Promise { - const provider = new ethers.providers.Web3Provider( - this._providers.ethereumProvider - ); - const contract = new Contract(address, abi, provider); - - return contract.callStatic[method](...args); - } - - public async getLog( - txHash: string, - eventName: string, - address: string, - abi: any[] - ): Promise { - const provider = new ethers.providers.Web3Provider( - this._providers.ethereumProvider - ); - const contract = new ethers.Contract(address, abi, provider); - - const receipt = await provider.waitForTransaction(txHash); - - for (const log of receipt.logs) { - const parsedLog = contract.interface.parseLog(log); - if (parsedLog.name === eventName) { - return parsedLog; - } - } - - return undefined; - } - private async _sendTx( signer: IgnitionSigner, tx: ethers.providers.TransactionRequest, @@ -124,7 +73,8 @@ export class ContractsService implements IContractsService { tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); } - let blockNumberWhenSent = await this._ethersProvider.getBlockNumber(); + let blockNumberWhenSent = + await this._providers.web3Provider.getBlockNumber(); const txIndexAndHash = await this._txSender.send( signer, tx, @@ -135,17 +85,24 @@ export class ContractsService implements IContractsService { let txHash = txIndexAndHash[1]; let txSent = tx; + let retries = 0; while (true) { - const currentBlockNumber = await this._ethersProvider.getBlockNumber(); + const currentBlockNumber = + await this._providers.web3Provider.getBlockNumber(); - if (await this._providers.transactions.isConfirmed(txHash)) { + if (await this._providers.transactionsProvider.isConfirmed(txHash)) { break; } if (blockNumberWhenSent + 5 <= currentBlockNumber) { + if (retries === 4) { + throw new Error("Transaction not confirmed within max retry limit"); + } + const txToSend = await this._bump(txHash, signer, txSent, txHash); - blockNumberWhenSent = await this._ethersProvider.getBlockNumber(); + blockNumberWhenSent = + await this._providers.web3Provider.getBlockNumber(); txHash = await this._txSender.sendAndReplace( signer, txToSend, @@ -154,6 +111,7 @@ export class ContractsService implements IContractsService { ); txSent = txToSend; + retries++; } await sleep(this._options.pollingInterval); @@ -168,7 +126,7 @@ export class ContractsService implements IContractsService { previousTxRequest: ethers.providers.TransactionRequest, previousTxHash: string ): Promise { - const previousTx = await this._ethersProvider.getTransaction( + const previousTx = await this._providers.web3Provider.getTransaction( previousTxHash ); const newEstimatedGasPrice = diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index 70dabe2779..a437ec3561 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,3 +1,5 @@ +import { ethers } from "ethers"; + import { Journal } from "journal/types"; import { Providers } from "types/providers"; import { TxSender } from "utils/tx-sender"; @@ -30,9 +32,20 @@ export function createServices( const services: Services = { artifacts: new ArtifactsService(providers), - contracts: new ContractsService(providers, txSender, { - pollingInterval: txPollingInterval, - }), + contracts: new ContractsService( + { + gasProvider: providers.gasProvider, + signersProvider: providers.signers, + transactionsProvider: providers.transactions, + web3Provider: new ethers.providers.Web3Provider( + providers.ethereumProvider + ), + }, + txSender, + { + pollingInterval: txPollingInterval, + } + ), transactions: new TransactionsService(providers), config: new ConfigService(providers), }; diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts new file mode 100644 index 0000000000..57ef7ee0db --- /dev/null +++ b/packages/core/test/contractsService.ts @@ -0,0 +1,116 @@ +/* eslint-disable import/no-unused-modules */ +import { providers, ethers } from "ethers"; +import sinon from "sinon"; + +import { ContractsService } from "services/ContractsService"; +import { Artifact } from "types/hardhat"; +import type { Providers } from "types/providers"; +import type { TxSender } from "utils/tx-sender"; + +const txSender: TxSender = { + async send(..._) { + console.log("send called"); + return [0, "0xabc"]; + }, + async sendAndReplace(..._) { + console.log("sendAndReplace called"); + return "0xabc"; + }, +} as TxSender; + +const providersFake: Providers = { + signers: { + async getDefaultSigner() { + return { + async sendTransaction(_) { + return { + hash: "", + blockHash: "", + blockNumber: 0, + nonce: 0, + gasLimit: 100, + confirmations: 0, + chainId: 0, + data: "", + from: "", + } as unknown as ethers.providers.TransactionResponse; + }, + }; + }, + }, + ethereumProvider: { + async request(_) { + return {}; + }, + }, + transactions: { + async isConfirmed(_) { + return false; + }, + async isMined(_) { + return false; + }, + }, + gasProvider: { + async estimateGasLimit(_) { + return ethers.BigNumber.from(0); + }, + async estimateGasPrice() { + return ethers.BigNumber.from(0); + }, + }, +} as Providers; + +describe.skip("ContractsService", function () { + it("should retry an unconfirmed transaction until the retry limit is hit", async function () { + class Web3Provider { + public blockNumber: 0; + public getBlockNumber = () => { + this.blockNumber += 5; + return this.blockNumber; + }; + public getTransaction = () => { + return { + hash: "", + blockHash: "", + blockNumber: 0, + nonce: 0, + gasLimit: 100, + confirmations: 0, + chainId: 0, + data: "", + from: "", + } as unknown as ethers.providers.TransactionResponse; + }; + } + + class ContractFactory { + public getDeployTransaction = () => { + return {}; + }; + } + + sinon.stub(ethers, "providers").returns({ Web3Provider }); + sinon.stub(ethers, "ContractFactory").returns(ContractFactory); + + // @ts-ignore + // sinon.replace(ethers.providers, "Web3Provider", Web3Provider); + // @ts-ignore + // sinon.replace(ethers, "ContractFactory", ContractFactory); + + const contractsService = new ContractsService(providersFake, txSender, { + pollingInterval: 10, + }); + + const fakeArtifact: Artifact = { + contractName: "Foo", + abi: [], + bytecode: "0x0", + linkReferences: {}, + }; + + const tx = await contractsService.deploy(fakeArtifact, [], {}); + + console.log(tx); + }); +}); diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts index 293d0d9c78..69cdaf24d5 100644 --- a/packages/core/test/setup.ts +++ b/packages/core/test/setup.ts @@ -1,5 +1,10 @@ /* eslint-disable import/no-unused-modules */ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; chai.use(chaiAsPromised); + +afterEach(() => { + sinon.restore(); +}); From 03ed264af44739a96ff17f812674296ce089f9ac Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 26 Oct 2022 19:48:13 -0400 Subject: [PATCH 0139/1302] fixed existing tests --- .../execution/dispatch/executeContractCall.ts | 2 +- .../dispatch/executeContractDeploy.ts | 2 +- .../dispatch/executeLibraryDeploy.ts | 3 +- packages/core/src/execution/execute.ts | 1 - .../core/src/services/ContractsService.ts | 25 +--- packages/core/test/execution.ts | 132 ++++++++---------- packages/core/test/helpers.ts | 16 +-- packages/core/test/setup.ts | 5 - 8 files changed, 74 insertions(+), 112 deletions(-) diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index f692c35d6e..9e59153108 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -24,7 +24,7 @@ export async function executeContractCall( const unsignedTx = await contractInstance.populateTransaction[method]( ...resolvedArgs ); - txHash = await services.contracts.call(unsignedTx); + txHash = await services.contracts.sendTx(unsignedTx); } catch (err) { return { _kind: "failure", diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 7661563849..556ada26e6 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -33,7 +33,7 @@ export async function executeContractDeploy( const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - const txHash = await services.contracts.deploy(deployTransaction); + const txHash = await services.contracts.sendTx(deployTransaction); const receipt = await services.transactions.wait(txHash); diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 2b101310ab..84211f2691 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -22,7 +22,8 @@ export async function executeLibraryDeploy( const Factory = new ContractFactory(artifact.abi, linkedByteCode); const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - const txHash = await services.contracts.deploy(deployTransaction); + + const txHash = await services.contracts.sendTx(deployTransaction); const receipt = await services.transactions.wait(txHash); diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index fb4bd1cbd2..5e94303594 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -8,7 +8,6 @@ export async function execute(deployment: Deployment): Promise { if (deployment.state.transform.executionGraph === null) { throw new Error("Cannot execute without an execution graph"); } - return visitInBatches( deployment, deployment.state.transform.executionGraph, diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index d7b736279b..29cae5f4d6 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -13,15 +13,10 @@ import { TxSender } from "utils/tx-sender"; import type { TransactionOptions } from "./types"; export interface IContractsService { - deploy( + sendTx( deployTransaction: ethers.providers.TransactionRequest, txOptions?: TransactionOptions ): Promise; - - call( - unsignedTx: ethers.PopulatedTransaction, - txOptions?: TransactionOptions - ): Promise; } export interface ContractsServiceProviders { @@ -40,26 +35,20 @@ export class ContractsService implements IContractsService { private _options: { pollingInterval: number } ) {} - public async deploy( + public async sendTx( deployTransaction: ethers.providers.TransactionRequest, txOptions?: TransactionOptions ): Promise { - this._debug("Deploying contract"); + if (deployTransaction.to !== undefined) { + this._debug("Calling method of contract"); + } else { + this._debug("Deploying contract"); + } const signer = await this._providers.signersProvider.getDefaultSigner(); return this._sendTx(signer, deployTransaction, txOptions); } - public async call( - unsignedTx: ethers.PopulatedTransaction, - txOptions?: TransactionOptions - ): Promise { - this._debug("Calling method of contract"); - const signer = await this._providers.signersProvider.getDefaultSigner(); - - return this._sendTx(signer, unsignedTx, txOptions); - } - private async _sendTx( signer: IgnitionSigner, tx: ethers.providers.TransactionRequest, diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 37daba6da2..c9067a1243 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -1,5 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { ethers } from "ethers"; +import sinon from "sinon"; import { Deployment } from "deployment/Deployment"; import { ExecutionGraph } from "execution/ExecutionGraph"; @@ -12,11 +14,16 @@ import { buildAdjacencyListFrom } from "./graph/helpers"; import { getMockServices } from "./helpers"; describe("Execution", () => { + afterEach(() => { + sinon.restore(); + }); + it("should execute a contract deploy", async () => { const fakeArtifact: Artifact = { contractName: "Foo", abi: [], - bytecode: "0x0", + bytecode: + "6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", linkReferences: {}, }; @@ -25,29 +32,17 @@ describe("Execution", () => { id: 0, label: "Foo", artifact: fakeArtifact, - args: [1, "example"], - libraries: { - Math: {} as any, - }, + args: [], + libraries: {}, }; - let actualArtifact: Artifact | undefined; - let actualArgs: any[] | undefined; - let actualLibraries: { [k: string]: any } | undefined; - const mockServices = { ...getMockServices(), contracts: { - deploy: async ( - artifact: Artifact, - args: any[], - libraries: { [k: string]: any }, + sendTx: async ( + _deployedTx: ethers.providers.TransactionRequest, _txOptions?: TransactionOptions ): Promise => { - actualArtifact = artifact; - actualArgs = args; - actualLibraries = libraries; - return "0x0"; }, } as any, @@ -67,10 +62,6 @@ describe("Execution", () => { mockServices ); - assert.deepStrictEqual(actualArtifact, fakeArtifact); - assert.deepStrictEqual(actualArgs, contractDeploy.args); - assert.deepStrictEqual(actualLibraries, contractDeploy.libraries); - assert.isDefined(response); if (response._kind === "failure") { return assert.fail("deploy failed"); @@ -81,7 +72,7 @@ describe("Execution", () => { result: { abi: [], address: "0xAddr", - bytecode: "0x0", + bytecode: fakeArtifact.bytecode, name: "Foo", }, }); @@ -91,7 +82,8 @@ describe("Execution", () => { const fakeArtifact: Artifact = { contractName: "Foo", abi: [], - bytecode: "0x0", + bytecode: + "6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", linkReferences: {}, }; @@ -100,26 +92,16 @@ describe("Execution", () => { id: 0, label: "Foo", artifact: fakeArtifact, - args: [1, "example"], + args: [], }; - let actualArtifact: Artifact | undefined; - let actualArgs: any[] | undefined; - let actualLibraries: { [k: string]: any } | undefined; - const mockServices = { ...getMockServices(), contracts: { - deploy: async ( - artifact: Artifact, - args: any[], - libraries: { [k: string]: any }, + sendTx: async ( + _deployedTx: ethers.providers.TransactionRequest, _txOptions?: TransactionOptions ): Promise => { - actualArtifact = artifact; - actualArgs = args; - actualLibraries = libraries; - return "0x0"; }, } as any, @@ -139,10 +121,6 @@ describe("Execution", () => { mockServices ); - assert.deepStrictEqual(actualArtifact, fakeArtifact); - assert.deepStrictEqual(actualArgs, contractDeploy.args); - assert.deepStrictEqual(actualLibraries, {}); - assert.isDefined(response); if (response._kind === "failure") { return assert.fail("deploy failed"); @@ -153,7 +131,7 @@ describe("Execution", () => { result: { abi: [], address: "0xAddr", - bytecode: "0x0", + bytecode: fakeArtifact.bytecode, name: "Foo", }, }); @@ -162,8 +140,36 @@ describe("Execution", () => { it("should execute a contract call", async () => { const fakeArtifact: Artifact = { contractName: "Foo", - abi: [], - bytecode: "0x0", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", linkReferences: {}, }; @@ -172,10 +178,8 @@ describe("Execution", () => { id: 0, label: "Foo", artifact: fakeArtifact, - args: [1, "example"], - libraries: { - Math: {} as any, - }, + args: [], + libraries: {}, }; const contractCall: ExecutionVertex = { @@ -187,36 +191,26 @@ describe("Execution", () => { args: [1], }; - let calledAddress: string | undefined; - let calledMethod: string | undefined; - let calledArgs: any[] | undefined; + const sendTxStub = sinon.stub(); + sendTxStub.onCall(0).resolves("0x1"); + sendTxStub.onCall(1).resolves("0x2"); const mockServices: Services = { ...getMockServices(), contracts: { - deploy: async (): Promise => { - return "0x1"; - }, - call: async ( - address: string, - _abi: any[], - method: string, - args: any[], - _txOptions?: TransactionOptions - ): Promise => { - calledAddress = address; - calledMethod = method; - calledArgs = args; - return "0x2"; - }, + sendTx: sendTxStub, } as any, transactions: { wait: (txHash: string) => { if (txHash === "0x1") { - return { contractAddress: "0xAddr1" }; + return { + contractAddress: "0x0000000000000000000000000000000000000001", + }; } - return { contractAddress: "0xAddr2" }; + return { + contractAddress: "0x0000000000000000000000000000000000000002", + }; }, } as any, }; @@ -227,10 +221,6 @@ describe("Execution", () => { mockServices ); - assert.deepStrictEqual(calledAddress, "0xAddr1"); - assert.deepStrictEqual(calledMethod, "inc"); - assert.deepStrictEqual(calledArgs, [1]); - assert.isDefined(response); if (response._kind === "failure") { return assert.fail("deploy failed"); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 3b3bdc53ca..04ed8632bf 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -20,20 +20,8 @@ export function getMockServices() { } class MockContractsService implements IContractsService { - public deploy( - _artifact: Artifact, - _args: any[], - _libraries: { [k: string]: any }, - _txOptions?: TransactionOptions | undefined - ): Promise { - throw new Error("Method not implemented."); - } - - public call( - _address: string, - _abi: any[], - _method: string, - _args: any[], + public sendTx( + _deployTransaction: ethers.providers.TransactionRequest, _txOptions?: TransactionOptions | undefined ): Promise { throw new Error("Method not implemented."); diff --git a/packages/core/test/setup.ts b/packages/core/test/setup.ts index 69cdaf24d5..293d0d9c78 100644 --- a/packages/core/test/setup.ts +++ b/packages/core/test/setup.ts @@ -1,10 +1,5 @@ /* eslint-disable import/no-unused-modules */ import chai from "chai"; import chaiAsPromised from "chai-as-promised"; -import sinon from "sinon"; chai.use(chaiAsPromised); - -afterEach(() => { - sinon.restore(); -}); From 9e1a0e4f2b7c7dff2daa04251ec207c08933f8d9 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 26 Oct 2022 20:38:17 -0400 Subject: [PATCH 0140/1302] added test for retry mechanism --- packages/core/test/contractsService.ts | 88 +++++++++----------------- 1 file changed, 29 insertions(+), 59 deletions(-) diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index 57ef7ee0db..7d4c6f36ba 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -1,25 +1,24 @@ /* eslint-disable import/no-unused-modules */ -import { providers, ethers } from "ethers"; -import sinon from "sinon"; +import { assert } from "chai"; +import { ethers } from "ethers"; -import { ContractsService } from "services/ContractsService"; -import { Artifact } from "types/hardhat"; -import type { Providers } from "types/providers"; +import { + ContractsService, + ContractsServiceProviders, +} from "services/ContractsService"; import type { TxSender } from "utils/tx-sender"; const txSender: TxSender = { async send(..._) { - console.log("send called"); return [0, "0xabc"]; }, async sendAndReplace(..._) { - console.log("sendAndReplace called"); return "0xabc"; }, } as TxSender; -const providersFake: Providers = { - signers: { +const providersFake = { + signersProvider: { async getDefaultSigner() { return { async sendTransaction(_) { @@ -38,12 +37,22 @@ const providersFake: Providers = { }; }, }, - ethereumProvider: { - async request(_) { - return {}; + web3Provider: { + n: 0, + async getBlockNumber() { + this.n++; + return this.n; + }, + async getTransaction() { + return { + hash: "", + nonce: 0, + gasLimit: 21000, + gasPrice: 100, + }; }, }, - transactions: { + transactionsProvider: { async isConfirmed(_) { return false; }, @@ -59,58 +68,19 @@ const providersFake: Providers = { return ethers.BigNumber.from(0); }, }, -} as Providers; +} as unknown as ContractsServiceProviders; -describe.skip("ContractsService", function () { +describe("ContractsService", function () { it("should retry an unconfirmed transaction until the retry limit is hit", async function () { - class Web3Provider { - public blockNumber: 0; - public getBlockNumber = () => { - this.blockNumber += 5; - return this.blockNumber; - }; - public getTransaction = () => { - return { - hash: "", - blockHash: "", - blockNumber: 0, - nonce: 0, - gasLimit: 100, - confirmations: 0, - chainId: 0, - data: "", - from: "", - } as unknown as ethers.providers.TransactionResponse; - }; - } - - class ContractFactory { - public getDeployTransaction = () => { - return {}; - }; - } - - sinon.stub(ethers, "providers").returns({ Web3Provider }); - sinon.stub(ethers, "ContractFactory").returns(ContractFactory); - - // @ts-ignore - // sinon.replace(ethers.providers, "Web3Provider", Web3Provider); - // @ts-ignore - // sinon.replace(ethers, "ContractFactory", ContractFactory); - const contractsService = new ContractsService(providersFake, txSender, { pollingInterval: 10, }); - const fakeArtifact: Artifact = { - contractName: "Foo", - abi: [], - bytecode: "0x0", - linkReferences: {}, - }; - - const tx = await contractsService.deploy(fakeArtifact, [], {}); + const fakeTx: ethers.providers.TransactionRequest = {}; - console.log(tx); + await assert.isRejected( + contractsService.sendTx(fakeTx), + /Transaction not confirmed within max retry limit/ + ); }); }); From d93f817648be0a2ebf5cbab94a9563b567b2ea94 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 27 Oct 2022 17:03:23 -0400 Subject: [PATCH 0141/1302] added docs for the `plan` task --- docs/creating-modules-for-deployment.md | 28 +++++++++++++-- docs/getting-started-guide.md | 32 ++++++++++++++---- docs/images/plan-1.png | Bin 0 -> 135968 bytes docs/images/plan-2.png | Bin 0 -> 34127 bytes docs/visualizing-your-deployment.md | 43 ++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 docs/images/plan-1.png create mode 100644 docs/images/plan-2.png create mode 100644 docs/visualizing-your-deployment.md diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 42efec2cab..3d2d2ccb80 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -1,5 +1,23 @@ # Creating Modules for Deployments +--- + +### Table of Contents + +- [Getting Started](./getting-started-guide.md) + - [Setup](./getting-started-guide.md#setup) + - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- Creating Modules for Deployment + - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) + - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) + - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) + - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) + - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) +- [Visualizing Your Deployment](./visualizing-your-deployment.md) + - [Actions](./visualizing-your-deployment.md#actions) + +--- + An **Ignition** deployment is composed of modules. A module is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: @@ -101,7 +119,7 @@ const contract = m.contract("Contract", { A library is deployed in the same way as a contract. -## Executing a method on a contract +## Executing a Method on a Contract Not all contract configuration happens via the constructor. To configure a contract calls can be made: @@ -114,7 +132,7 @@ m.call(exchange, "addToken", { }); ``` -## Using the network chain id +## Using the Network Chain ID The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. @@ -151,7 +169,7 @@ When a module is deployed, the proper parameters must be provided. If they are n const symbol = m.getOptionalParam("tokenSymbol", "TKN"); ``` -## Modules within modules +## Modules Within Modules Modules can be deployed and consumed within other modules via `m.useModule(...)`: @@ -180,3 +198,7 @@ module.exports = buildModule("`TEST` registrar", (m) => { Calls to `useModule` memoize the results object, assuming the same parameters are passed. Multiple calls to the same module with different parameters are banned. Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). + +Next, let's take a look at another way to visualize your deployments: + +[Visualizing your deployment](./visualizing-your-deployment.md) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 0d89d0d7c8..29cebba687 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -1,5 +1,23 @@ # Getting Started +--- + +### Table of Contents + +- Getting Started + - [Setup](./getting-started-guide.md#setup) + - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- [Creating Modules for Deployment](./creating-modules-for-deployment.md) + - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) + - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) + - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) + - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) + - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) +- [Visualizing Your Deployment](./visualizing-your-deployment.md) + - [Actions](./visualizing-your-deployment.md#actions) + +--- + ## Setup This guide assumes you are starting with the Hardhat Javascript project as covered in the [Hardhat quick start](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start). @@ -26,7 +44,7 @@ $ npx hardhat Add **Ignition** to your **Hardhat** project by installing the plugin: -```shell +```bash npm install @ignored/hardhat-ignition ``` @@ -40,11 +58,11 @@ require("@ignored/hardhat-ignition"); Create an `./ignition` folder in your project root to contain your deployment modules. -```shell +```bash mkdir ./ignition ``` -## Write a deployment module +## Writing Your First Deployment Module Add a deployment module under the `./ignition` folder for the example `Lock.sol` contract: @@ -65,22 +83,22 @@ module.exports = buildModule("LockModule", (m) => { Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): -```shell +```bash npx hardhat deploy LockModule.js ``` Parameters can be passed as a flag at the command line via a json string: -```shell +```bash npx hardhat deploy --parameters "{\"unlockTime\":4102491600}" LockModule.js # Ensure you have properly escaped the json string ``` To deploy against a local hardhat node: -```shell +```bash npx hardhat node -// in another terminal +# in another terminal npx hardhat deploy --network localhost LockModule.js ``` diff --git a/docs/images/plan-1.png b/docs/images/plan-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2b252ea46d9868d60d80c398454445503e9713e8 GIT binary patch literal 135968 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 literal 0 HcmV?d00001 diff --git a/docs/visualizing-your-deployment.md b/docs/visualizing-your-deployment.md new file mode 100644 index 0000000000..f3f5110642 --- /dev/null +++ b/docs/visualizing-your-deployment.md @@ -0,0 +1,43 @@ +# Visualizing Your Deployment + +--- + +### Table of Contents + +- [Getting Started](./getting-started-guide.md) + - [Setup](./getting-started-guide.md#setup) + - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- [Creating Modules for Deployment](./creating-modules-for-deployment.md) + - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) + - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) + - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) + - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) + - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) +- Visualizing Your Deployment + - [Actions](./visualizing-your-deployment.md#actions) + +--- + +Within any **Ignition** project, you can use the `plan` task to gain a better understanding of how your deployment module connects together from one transaction to the next. + +For example, using our [ENS example project](../examples/ens): + +```bash +npx hardhat plan ENS.js +``` + +This task performs a "dry run" of the given deployment module and outputs a full HTML report that opens in your system's default browser: + +![Main plan output](images/plan-1.png) + +At a glance, you can easily gain a visual reference for how many contract deploys and/or calls your deployment includes as well as a hierarchy for which transactions depend on which other transactions. + +If something in your deployment isn't behaving the way you expected, the `plan` task can be an extremely helpful tool for debugging and verifying that you and your code are on the same page. + +## Actions + +To view more details about any given transaction, simply clicking on it will navigate you to a more detailed page: + +![Action detail output](images/plan-2.png) + +Notice that, since this is just a dry run and not an actual deployment, any Futures passed as arguments will not have a resolved value yet. We include a placeholder for that data in the output above, and during an actual deployment that future will, of course, be replaced by the appropriate value. From 535a6a508de051bd8f5ef797729ddd32447051d2 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 28 Oct 2022 03:40:20 -0400 Subject: [PATCH 0142/1302] added guide for testing with ignition --- docs/creating-modules-for-deployment.md | 1 + docs/getting-started-guide.md | 1 + docs/testing-with-hardhat.md | 69 +++++++++++++++++++++++++ docs/visualizing-your-deployment.md | 5 ++ 4 files changed, 76 insertions(+) create mode 100644 docs/testing-with-hardhat.md diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 3d2d2ccb80..3c5eb17909 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -15,6 +15,7 @@ - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) - [Visualizing Your Deployment](./visualizing-your-deployment.md) - [Actions](./visualizing-your-deployment.md#actions) +- [Testing With Hardhat](./testing-with-hardhat.md) --- diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 29cebba687..93008e7a48 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -15,6 +15,7 @@ - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) - [Visualizing Your Deployment](./visualizing-your-deployment.md) - [Actions](./visualizing-your-deployment.md#actions) +- [Testing With Hardhat](./testing-with-hardhat.md) --- diff --git a/docs/testing-with-hardhat.md b/docs/testing-with-hardhat.md new file mode 100644 index 0000000000..c98853ce4f --- /dev/null +++ b/docs/testing-with-hardhat.md @@ -0,0 +1,69 @@ +# Testing With Hardhat + +--- + +### Table of Contents + +- [Getting Started](./getting-started-guide.md) + - [Setup](./getting-started-guide.md#setup) + - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- [Creating Modules for Deployment](./creating-modules-for-deployment.md) + - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) + - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) + - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) + - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) + - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) +- [Visualizing Your Deployment](./visualizing-your-deployment.md) + - [Actions](./visualizing-your-deployment.md#actions) +- Testing With Hardhat + +--- + +For this guide, we'll be referring to the **Ignition** module and test inside the [simple example](../examples/simple): + +```javascript +// ignition/Simple.js +const { buildModule } = require("@ignored/hardhat-ignition"); + +module.exports = buildModule("Simple", (m) => { + const incAmount = m.getOptionalParam("IncAmount", 1); + + const simple = m.contract("Simple"); + + m.call(simple, "inc", { + args: [incAmount], + }); + + return { simple }; +}); + +// test/simple.test.js +const { assert } = require("chai"); +const SimpleModule = require("../ignition/Simple"); + +describe("Simple", function () { + let simpleContract; + + before(async () => { + const { simple } = await ignition.deploy(SimpleModule, { + parameters: { + IncAmount: 42, + }, + }); + + simpleContract = simple; + }); + + it("should return an instantiated ethers contract", async function () { + assert.isDefined(simpleContract); + }); + + it("should have incremented the count with the deployment config call", async function () { + assert.equal(await simpleContract.count(), 52); + }); +}); +``` + +As you can see above, the **Ignition** Hardhat plugin makes an `ignition` instance available globally during your Mocha tests. Using this instance allows you to deploy your imported modules exactly as you would on the command line! + +Since the contract instances returned from modules are resolved as ethers contracts, you can then call functions on them according to your testing needs just like you normally would. diff --git a/docs/visualizing-your-deployment.md b/docs/visualizing-your-deployment.md index f3f5110642..f00fde8ca4 100644 --- a/docs/visualizing-your-deployment.md +++ b/docs/visualizing-your-deployment.md @@ -15,6 +15,7 @@ - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) - Visualizing Your Deployment - [Actions](./visualizing-your-deployment.md#actions) +- [Testing With Hardhat](./testing-with-hardhat.md) --- @@ -41,3 +42,7 @@ To view more details about any given transaction, simply clicking on it will nav ![Action detail output](images/plan-2.png) Notice that, since this is just a dry run and not an actual deployment, any Futures passed as arguments will not have a resolved value yet. We include a placeholder for that data in the output above, and during an actual deployment that future will, of course, be replaced by the appropriate value. + +Next we'll see how to use **Ignition** inside Hardhat tests + +[Testing With Hardhat](./testing-with-hardhat.md) From 383e8a2b20abd1bc71ad7f9c160d2984f9005b44 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Oct 2022 10:33:50 +0100 Subject: [PATCH 0143/1302] docs: add deferred values to the modules docs This is taken from our design docs, and marked as TBD for now. --- docs/creating-modules-for-deployment.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 3c5eb17909..64ec5d2202 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -133,6 +133,29 @@ m.call(exchange, "addToken", { }); ``` +### Using the results of a call with a deferred value (TBD) + +A contract might need the result of some other contract method as an input: + +```tsx +const token = m.contract("Token"); +const totalSupply = m.call(token, "totalSupply"); + +const someContract = m.contract("ContractName", { + args: [totalSupply], +}); +``` + +In this example, `totalSupply` is called a **deferred value**. Similar to how a contract future is a contract that will eventually be deployed, a deferred value is some value that will eventually be available. That means **you can't do this**: + +```tsx +if (totalSupply > 0) { + ... +} +``` + +Because `totalSupply` is not a number, it is a future. + ## Using the Network Chain ID The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. From 8dac1a704c92bd19cf26a49effe5e8738e1b05a6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Oct 2022 10:56:37 +0100 Subject: [PATCH 0144/1302] docs: add `await` to modules This is a section explaining the intended `await` behaviour and marked as TBD. --- docs/creating-modules-for-deployment.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 64ec5d2202..c5ed17db1e 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -156,6 +156,26 @@ if (totalSupply > 0) { Because `totalSupply` is not a number, it is a future. +## Waiting for on-chain events (TBD) + +A deployment can be put `on-hold` until an on-chain action, external to the deployment, has taken place (for instance a timelock or multisig approval). The `await` condition can be specified: + +```tsx +let multisig = m.deploy("Multisig"); + +m.call(multisig, "authorize"); + +m.await({ + from: "0xUser1", + to: multisig.address, + // value: 20.toWei(), + // function: 'authorize', + events: [{ name: "AuthorizedBy", data: "0xUser1" }], +}); +``` + +The `await` during deployment will check whether a transaction matching the parameters has occured. If it has the deployment will continue, if not the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `await` condition. + ## Using the Network Chain ID The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. From 92f06fd77ec86ca4b03441dda51113ab4b899a65 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Oct 2022 11:40:48 +0100 Subject: [PATCH 0145/1302] tests(core): split out deployment builder tests Separate out single file into folder. --- packages/core/test/deploymentBuilder/calls.ts | 181 ++++ .../core/test/deploymentBuilder/chainId.ts | 20 + .../core/test/deploymentBuilder/deploy.ts | 448 +++++++++ .../core/test/deploymentBuilder/helpers.ts | 27 + .../core/test/deploymentBuilder/libraries.ts | 117 +++ .../core/test/deploymentBuilder/parameters.ts | 56 ++ .../core/test/deploymentBuilder/useModule.ts | 116 +++ packages/core/test/modules.ts | 911 ------------------ 8 files changed, 965 insertions(+), 911 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/calls.ts create mode 100644 packages/core/test/deploymentBuilder/chainId.ts create mode 100644 packages/core/test/deploymentBuilder/deploy.ts create mode 100644 packages/core/test/deploymentBuilder/helpers.ts create mode 100644 packages/core/test/deploymentBuilder/libraries.ts create mode 100644 packages/core/test/deploymentBuilder/parameters.ts create mode 100644 packages/core/test/deploymentBuilder/useModule.ts delete mode 100644 packages/core/test/modules.ts diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts new file mode 100644 index 0000000000..04156509c7 --- /dev/null +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -0,0 +1,181 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; +import { isCall, isHardhatContract } from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - chainId", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); + const another = m.contract("Another"); + + m.call(exchange, "addToken", { + args: [token], + after: [another], + }); + + return {}; + }); + + const { graph } = generateDeploymentGraphFrom(callModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); + + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); + + it("should have the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange/addToken"); + assert(isCall(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show no dependencies for the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show three dependencies for the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + { id: 1, label: "Exchange", type: "" }, + { id: 2, label: "Another", type: "" }, + ]); + }); + + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the contract node Exchange as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 0, + label: "Token", + type: "contract", + subtype: "hardhat", + contractName: "Token", + _future: true, + }, + ]); + }); +}); diff --git a/packages/core/test/deploymentBuilder/chainId.ts b/packages/core/test/deploymentBuilder/chainId.ts new file mode 100644 index 0000000000..455e6d5edf --- /dev/null +++ b/packages/core/test/deploymentBuilder/chainId.ts @@ -0,0 +1,20 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder } from "types/deploymentGraph"; + +describe("deployment builder - chainId", () => { + it("should inject the chainId via the builder", () => { + const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { + if (m.chainId === 42) { + return {}; + } + + assert.fail("Chain id was not injected"); + }); + + generateDeploymentGraphFrom(chainIdModule, { chainId: 42 }); + }); +}); diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts new file mode 100644 index 0000000000..1b7bd4a8e4 --- /dev/null +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -0,0 +1,448 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; +import { Artifact } from "types/hardhat"; +import { + isArtifactContract, + isDeployedContract, + isHardhatContract, +} from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - deploy", function () { + describe("single contract", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Example"); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have one node", () => { + assert.equal(deploymentGraph.vertexes.size, 1); + }); + + it("should have the contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Example"); + }); + + it("should show no dependencies for the contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should record the argument list for the contract node as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + }); + + describe("two unrelated contracts", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const twoContractsModule = buildModule( + "two contracts", + (m: IDeploymentBuilder) => { + const example1 = m.contract("Example1"); + const example2 = m.contract("Example2"); + + return { example1, example2 }; + } + ); + + const { graph } = generateDeploymentGraphFrom(twoContractsModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have two nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have both contract nodes", () => { + const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); + + assert.isDefined(depNode1); + assert.equal(depNode1?.label, "Example1"); + + const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); + + assert.isDefined(depNode2); + assert.equal(depNode2?.label, "Example2"); + }); + + it("should show no dependencies either contract node", () => { + const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); + + if (depNode1 === undefined) { + return assert.isDefined(depNode1); + } + + const deps1 = getDependenciesForVertex(deploymentGraph, depNode1); + + assert.deepStrictEqual(deps1, []); + + const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); + + if (depNode2 === undefined) { + return assert.isDefined(depNode1); + } + + const deps2 = getDependenciesForVertex(deploymentGraph, depNode2); + + assert.deepStrictEqual(deps2, []); + }); + }); + + describe("contract with constructor args", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const withConstructorArgsModule = buildModule( + "withConstructorArgs", + (m: IDeploymentBuilder) => { + const token = m.contract("Token", { + args: ["My Token", "TKN", 18], + }); + + return { token }; + } + ); + + const { graph } = generateDeploymentGraphFrom(withConstructorArgsModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have one node", () => { + assert.equal(deploymentGraph.vertexes.size, 1); + }); + + it("should have the contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Token"); + }); + + it("should show no dependencies for the contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should record the argument list for the contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, ["My Token", "TKN", 18]); + }); + }); + + describe("dependencies between contracts", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const depsBetweenContractsModule = buildModule( + "dependenciesBetweenContracts", + (m: IDeploymentBuilder) => { + const a = m.contract("A"); + const someother = m.contract("Someother"); + + const b = m.contract("B", { + args: [a], + after: [someother], + }); + + return { a, b }; + } + ); + + const { graph } = generateDeploymentGraphFrom( + depsBetweenContractsModule, + { + chainId: 31337, + } + ); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); + }); + + it("should have the contract node A", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "A"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node B", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "B"); + assert(isHardhatContract(depNode)); + }); + + it("should show no dependencies for the contract node A", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show two dependencies, on A for the contract node B, on A for Someother", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 0, label: "A", type: "" }, + { id: 1, label: "Someother", type: "" }, + ]); + }); + + it("should record the argument list for the contract node A as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + }); + + describe("existing contract", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const uniswapModule = buildModule("Uniswap", (m: IDeploymentBuilder) => { + const abi = [{}]; + const someother = m.contract("Someother"); + + const uniswap = m.contractAt("UniswapRouter", "0x123...", abi, { + after: [someother], + }); + + return { uniswap }; + }); + + const { graph } = generateDeploymentGraphFrom(uniswapModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have two nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have the deployed contract node", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "UniswapRouter" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "UniswapRouter"); + assert(isDeployedContract(depNode)); + }); + + it("should show one dependencies for the deployed contract node on someother", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "UniswapRouter" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); + }); + }); + + describe("deploying a contract from an artifact", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + + const fromArtifactModule = buildModule( + "FromArtifact", + (m: IDeploymentBuilder) => { + const someother = m.contract("Someother"); + + const foo = m.contract("Foo", artifact, { + args: [0], + after: [someother], + }); + + return { foo }; + } + ); + + const { graph } = generateDeploymentGraphFrom(fromArtifactModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have two nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have the artifact contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Foo"); + assert(isArtifactContract(depNode)); + }); + + it("should show one dependency for the artifact contract node on Someother", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Someother", + type: "", + }, + ]); + }); + + it("should record the argument list for the artifact contract node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isArtifactContract(depNode)) { + return assert.fail("Not an artifact contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, [0]); + }); + }); +}); diff --git a/packages/core/test/deploymentBuilder/helpers.ts b/packages/core/test/deploymentBuilder/helpers.ts new file mode 100644 index 0000000000..0fc73c9030 --- /dev/null +++ b/packages/core/test/deploymentBuilder/helpers.ts @@ -0,0 +1,27 @@ +import { DeploymentGraph } from "dsl/DeploymentGraph"; +import { getDependenciesFor } from "graph/adjacencyList"; +import { DeploymentGraphVertex } from "types/deploymentGraph"; +import { VertexDescriptor } from "types/graph"; + +export function getDeploymentVertexByLabel( + deploymentGraph: DeploymentGraph, + label: string +): DeploymentGraphVertex | undefined { + return Array.from(deploymentGraph.vertexes.values()).find( + (n) => n.label === label + ); +} + +export function getDependenciesForVertex( + deploymentGraph: DeploymentGraph, + { id }: { id: number } +): VertexDescriptor[] { + const depIds = getDependenciesFor(deploymentGraph.adjacencyList, id); + + return depIds + .map((depId) => deploymentGraph.vertexes.get(depId)) + .filter( + (nodeDesc): nodeDesc is DeploymentGraphVertex => nodeDesc !== undefined + ) + .map((vertex) => ({ id: vertex.id, label: vertex.label, type: "" })); +} diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts new file mode 100644 index 0000000000..34eb60ffa2 --- /dev/null +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -0,0 +1,117 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; +import { isHardhatContract, isHardhatLibrary } from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - libraries", () => { + describe("libraries", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const librariesModule = buildModule( + "libraries", + (m: IDeploymentBuilder) => { + const someother = m.contract("Someother"); + + const safeMath = m.library("SafeMath", { + args: [42], + after: [someother], + }); + + const contract = m.contract("Contract", { + libraries: { + SafeMath: safeMath, + }, + }); + + return { safeMath, contract }; + } + ); + + const { graph } = generateDeploymentGraphFrom(librariesModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); + }); + + it("should have the library node SafeMath", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "SafeMath"); + assert(isHardhatLibrary(depNode)); + }); + + it("should have the contract node Contract", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Contract"); + assert(isHardhatContract(depNode)); + }); + + it("should show one dependencies for the library node SafeMath to Someother", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); + }); + + it("should show one dependency on library node SafeMath for Contract", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath", type: "" }]); + }); + + it("should record the argument list for the library node SafeMath as [42]", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatLibrary(depNode)) { + return assert.fail("Not a hardhat library dependency node"); + } + + assert.deepStrictEqual(depNode.args, [42]); + }); + }); +}); diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts new file mode 100644 index 0000000000..6e3100b83a --- /dev/null +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -0,0 +1,56 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { buildSubgraph } from "dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; +import { isCallable } from "utils/guards"; + +describe("deployment builder - parameters", function () { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const librariesSubgraph = buildSubgraph( + "libraries", + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + const WrapModule = buildModule("Wrap", (m) => { + const { token } = m.useSubgraph(librariesSubgraph, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + if (!isCallable(token)) { + throw new Error("Not callable"); + } + + return { token }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have one node", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); +}); diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts new file mode 100644 index 0000000000..fafc672296 --- /dev/null +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -0,0 +1,116 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; + +describe("deployment builder - useModule", () => { + let deploymentGraph: IDeploymentGraph; + let returnsWrongFutureType: () => void; + let differentParams: () => void; + + before(() => { + const librariesModule = buildModule( + "libraries", + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + const { token: token2 } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token, token2 }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + + const DiffParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + const { token: token2 } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, + }); + + return { token, token2 }; + }); + + const returnTypeModule = buildModule( + "returnsParam", + // @ts-ignore + // ignoring here to specifically test for js ability to bypass type guards + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token, name }; + } + ); + + const ReturnTypeModule = buildModule( + "ReturnsParamModule", + (m: IDeploymentBuilder) => { + const { token } = m.useModule(returnTypeModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token }; + } + ); + + returnsWrongFutureType = () => { + generateDeploymentGraphFrom(ReturnTypeModule, { chainId: 31 }); + }; + + differentParams = () => { + generateDeploymentGraphFrom(DiffParamsModule, { chainId: 31 }); + }; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have one node", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should not allow using the same module with different parameters", () => { + assert.throws( + differentParams, + /`useModule` cannot be invoked on the same module using different parameters/ + ); + }); + + it("should not allow an uncallable future to be returned from a module", () => { + assert.throws( + returnsWrongFutureType, + /Cannot return Future of type "parameter" from a module/ + ); + }); +}); diff --git a/packages/core/test/modules.ts b/packages/core/test/modules.ts deleted file mode 100644 index 916822fcf6..0000000000 --- a/packages/core/test/modules.ts +++ /dev/null @@ -1,911 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { DeploymentGraph } from "dsl/DeploymentGraph"; -import { buildModule } from "dsl/buildModule"; -import { buildSubgraph } from "dsl/buildSubgraph"; -import { getDependenciesFor } from "graph/adjacencyList"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import type { - IDeploymentGraph, - IDeploymentBuilder, - DeploymentGraphVertex, -} from "types/deploymentGraph"; -import { VertexDescriptor } from "types/graph"; -import { Artifact } from "types/hardhat"; -import { - isArtifactContract, - isCall, - isCallable, - isDeployedContract, - isHardhatContract, - isHardhatLibrary, -} from "utils/guards"; - -describe("Modules", function () { - describe("single contract", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example"); - - return { example }; - }); - - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 1); - }); - - it("should have the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Example"); - }); - - it("should show no dependencies for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should record the argument list for the contract node as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - }); - - describe("two unrelated contracts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const twoContractsModule = buildModule( - "two contracts", - (m: IDeploymentBuilder) => { - const example1 = m.contract("Example1"); - const example2 = m.contract("Example2"); - - return { example1, example2 }; - } - ); - - const { graph } = generateDeploymentGraphFrom(twoContractsModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have both contract nodes", () => { - const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); - - assert.isDefined(depNode1); - assert.equal(depNode1?.label, "Example1"); - - const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); - - assert.isDefined(depNode2); - assert.equal(depNode2?.label, "Example2"); - }); - - it("should show no dependencies either contract node", () => { - const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); - - if (depNode1 === undefined) { - return assert.isDefined(depNode1); - } - - const deps1 = getDependenciesForVertex(deploymentGraph, depNode1); - - assert.deepStrictEqual(deps1, []); - - const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); - - if (depNode2 === undefined) { - return assert.isDefined(depNode1); - } - - const deps2 = getDependenciesForVertex(deploymentGraph, depNode2); - - assert.deepStrictEqual(deps2, []); - }); - }); - - describe("contract with constructor args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const withConstructorArgsModule = buildModule( - "withConstructorArgs", - (m: IDeploymentBuilder) => { - const token = m.contract("Token", { - args: ["My Token", "TKN", 18], - }); - - return { token }; - } - ); - - const { graph } = generateDeploymentGraphFrom(withConstructorArgsModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 1); - }); - - it("should have the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Token"); - }); - - it("should show no dependencies for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should record the argument list for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, ["My Token", "TKN", 18]); - }); - }); - - describe("dependencies between contracts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const depsBetweenContractsModule = buildModule( - "dependenciesBetweenContracts", - (m: IDeploymentBuilder) => { - const a = m.contract("A"); - const someother = m.contract("Someother"); - - const b = m.contract("B", { - args: [a], - after: [someother], - }); - - return { a, b }; - } - ); - - const { graph } = generateDeploymentGraphFrom( - depsBetweenContractsModule, - { - chainId: 31337, - } - ); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the contract node A", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "A"); - assert(isHardhatContract(depNode)); - }); - - it("should have the contract node B", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "B"); - assert(isHardhatContract(depNode)); - }); - - it("should show no dependencies for the contract node A", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show two dependencies, on A for the contract node B, on A for Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 0, label: "A", type: "" }, - { id: 1, label: "Someother", type: "" }, - ]); - }); - - it("should record the argument list for the contract node A as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - }); - - describe("make a call on a contract", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); - const another = m.contract("Another"); - - m.call(exchange, "addToken", { - args: [token], - after: [another], - }); - - return {}; - }); - - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); - - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); - }); - - it("should have the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange/addToken"); - assert(isCall(depNode)); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show no dependencies for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show three dependencies for the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Token", - type: "", - }, - { id: 1, label: "Exchange", type: "" }, - { id: 2, label: "Another", type: "" }, - ]); - }); - - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 0, - label: "Token", - type: "contract", - subtype: "hardhat", - contractName: "Token", - _future: true, - }, - ]); - }); - }); - - describe("existing contract", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const uniswapModule = buildModule("Uniswap", (m: IDeploymentBuilder) => { - const abi = [{}]; - const someother = m.contract("Someother"); - - const uniswap = m.contractAt("UniswapRouter", "0x123...", abi, { - after: [someother], - }); - - return { uniswap }; - }); - - const { graph } = generateDeploymentGraphFrom(uniswapModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the deployed contract node", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "UniswapRouter" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "UniswapRouter"); - assert(isDeployedContract(depNode)); - }); - - it("should show one dependencies for the deployed contract node on someother", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "UniswapRouter" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); - }); - }); - - describe("deploying a contract from an artifact", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; - - const fromArtifactModule = buildModule( - "FromArtifact", - (m: IDeploymentBuilder) => { - const someother = m.contract("Someother"); - - const foo = m.contract("Foo", artifact, { - args: [0], - after: [someother], - }); - - return { foo }; - } - ); - - const { graph } = generateDeploymentGraphFrom(fromArtifactModule, { - chainId: 31337, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the artifact contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Foo"); - assert(isArtifactContract(depNode)); - }); - - it("should show one dependency for the artifact contract node on Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Someother", - type: "", - }, - ]); - }); - - it("should record the argument list for the artifact contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isArtifactContract(depNode)) { - return assert.fail("Not an artifact contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, [0]); - }); - }); - - describe("libraries", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const someother = m.contract("Someother"); - - const safeMath = m.library("SafeMath", { - args: [42], - after: [someother], - }); - - const contract = m.contract("Contract", { - libraries: { - SafeMath: safeMath, - }, - }); - - return { safeMath, contract }; - } - ); - - const { graph } = generateDeploymentGraphFrom(librariesModule, { - chainId: 31, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the library node SafeMath", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "SafeMath"); - assert(isHardhatLibrary(depNode)); - }); - - it("should have the contract node Contract", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Contract"); - assert(isHardhatContract(depNode)); - }); - - it("should show one dependencies for the library node SafeMath to Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); - }); - - it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath", type: "" }]); - }); - - it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatLibrary(depNode)) { - return assert.fail("Not a hardhat library dependency node"); - } - - assert.deepStrictEqual(depNode.args, [42]); - }); - }); - - describe("network chain id", () => { - it("should inject the chainId via the builder", () => { - const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { - if (m.chainId === 42) { - return {}; - } - - assert.fail("Chain id was not injected"); - - return {}; - }); - - generateDeploymentGraphFrom(chainIdModule, { chainId: 42 }); - }); - }); - - describe("module parameters", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const librariesSubgraph = buildSubgraph( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m) => { - const { token } = m.useSubgraph(librariesSubgraph, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - if (!isCallable(token)) { - throw new Error("Not callable"); - } - - return { token }; - }); - - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - }); - - describe("useModule", () => { - let deploymentGraph: IDeploymentGraph; - let returnsWrongFutureType: () => void; - let differentParams: () => void; - - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - return { token, token2 }; - }); - - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); - - deploymentGraph = graph; - - const DiffParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, - }); - - return { token, token2 }; - }); - - const returnTypeModule = buildModule( - "returnsParam", - // @ts-ignore - // ignoring here to specifically test for js ability to bypass type guards - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token, name }; - } - ); - - const ReturnTypeModule = buildModule( - "ReturnsParamModule", - (m: IDeploymentBuilder) => { - const { token } = m.useModule(returnTypeModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - return { token }; - } - ); - - returnsWrongFutureType = () => { - generateDeploymentGraphFrom(ReturnTypeModule, { chainId: 31 }); - }; - - differentParams = () => { - generateDeploymentGraphFrom(DiffParamsModule, { chainId: 31 }); - }; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should not allow using the same module with different parameters", () => { - assert.throws( - differentParams, - /`useModule` cannot be invoked on the same module using different parameters/ - ); - }); - - it("should not allow an uncallable future to be returned from a module", () => { - assert.throws( - returnsWrongFutureType, - /Cannot return Future of type "parameter" from a module/ - ); - }); - }); -}); - -function getDeploymentVertexByLabel( - deploymentGraph: DeploymentGraph, - label: string -): DeploymentGraphVertex | undefined { - return Array.from(deploymentGraph.vertexes.values()).find( - (n) => n.label === label - ); -} - -function getDependenciesForVertex( - deploymentGraph: DeploymentGraph, - { id }: { id: number } -): VertexDescriptor[] { - const depIds = getDependenciesFor(deploymentGraph.adjacencyList, id); - - return depIds - .map((depId) => deploymentGraph.vertexes.get(depId)) - .filter( - (nodeDesc): nodeDesc is DeploymentGraphVertex => nodeDesc !== undefined - ) - .map((vertex) => ({ id: vertex.id, label: vertex.label, type: "" })); -} From 45b7d7fda35f63c67c347351a3d575cd956c26e9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Oct 2022 11:57:36 +0100 Subject: [PATCH 0146/1302] test(core): split up use-module tests --- .../core/test/deploymentBuilder/useModule.ts | 186 ++++++++++-------- 1 file changed, 105 insertions(+), 81 deletions(-) diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index fafc672296..dd8d84c17c 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -7,110 +7,134 @@ import type { IDeploymentGraph, IDeploymentBuilder, } from "types/deploymentGraph"; +import { Module } from "types/module"; describe("deployment builder - useModule", () => { let deploymentGraph: IDeploymentGraph; - let returnsWrongFutureType: () => void; - let differentParams: () => void; - - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], + + describe("use one module from another", () => { + before(() => { + const librariesModule = buildModule( + "libraries", + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - return { token }; - } - ); + const { token: token2 } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + return { token, token2 }; }); - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, }); - return { token, token2 }; + deploymentGraph = graph; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, + it("should create a graph", () => { + assert.isDefined(deploymentGraph); }); - deploymentGraph = graph; - - const DiffParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, - }); - - return { token, token2 }; + it("should have one node", () => { + assert.equal(deploymentGraph.vertexes.size, 2); }); + }); - const returnTypeModule = buildModule( - "returnsParam", - // @ts-ignore - // ignoring here to specifically test for js ability to bypass type guards - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token, name }; - } - ); - - const ReturnTypeModule = buildModule( - "ReturnsParamModule", - (m: IDeploymentBuilder) => { - const { token } = m.useModule(returnTypeModule, { + describe("reusing the same module with different parameters", () => { + let differentParamsModule: Module; + + before(() => { + const librariesModule = buildModule( + "libraries", + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token }; + } + ); + + differentParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { + const { token } = m.useModule(librariesModule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - return { token }; - } - ); - - returnsWrongFutureType = () => { - generateDeploymentGraphFrom(ReturnTypeModule, { chainId: 31 }); - }; - - differentParams = () => { - generateDeploymentGraphFrom(DiffParamsModule, { chainId: 31 }); - }; - }); + const { token: token2 } = m.useModule(librariesModule, { + parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, + }); - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); + return { token, token2 }; + }); + }); - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 2); + it("should throw", () => { + assert.throws( + () => + generateDeploymentGraphFrom(differentParamsModule, { + chainId: 31, + }), + /`useModule` cannot be invoked on the same module using different parameters/ + ); + }); }); - it("should not allow using the same module with different parameters", () => { - assert.throws( - differentParams, - /`useModule` cannot be invoked on the same module using different parameters/ - ); - }); + describe("returning non contract/library futures from within a module", () => { + let returnsWrongFutureTypeModule: Module; + + before(() => { + const returnTypeModule = buildModule( + "returnsParam", + // @ts-ignore + // ignoring here to specifically test for js ability to bypass type guards + (m: IDeploymentBuilder) => { + const symbol = m.getOptionalParam("tokenSymbol", "TKN"); + const name = m.getParam("tokenName"); + const token = m.contract("Token", { + args: [symbol, name, 1_000_000], + }); + + return { token, name }; + } + ); + + returnsWrongFutureTypeModule = buildModule( + "ReturnsParamModule", + (m: IDeploymentBuilder) => { + const { token } = m.useModule(returnTypeModule, { + parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, + }); + + return { token }; + } + ); + }); - it("should not allow an uncallable future to be returned from a module", () => { - assert.throws( - returnsWrongFutureType, - /Cannot return Future of type "parameter" from a module/ - ); + it("should throw", () => { + assert.throws( + () => + generateDeploymentGraphFrom(returnsWrongFutureTypeModule, { + chainId: 31, + }), + /Cannot return Future of type "parameter" from a module/ + ); + }); }); }); From 7a632d4471e26cb7fee496ff3c93ac8201bd0780 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 26 Oct 2022 17:37:50 +0100 Subject: [PATCH 0147/1302] refactor(core): delegate useModule onto subgraph Pull out the common behaviour between both so that `useModule` is `useSubgraph` with additional constraints. --- packages/core/src/dsl/DeploymentBuilder.ts | 108 +++++++------ packages/core/src/types/module.ts | 4 +- packages/core/src/utils/guards.ts | 10 ++ .../core/test/deploymentBuilder/useModule.ts | 146 +++++++++++++++++- .../user-modules/ignition/TestModule.js | 1 + 5 files changed, 221 insertions(+), 48 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index a50c656c23..8338a79444 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -33,7 +33,9 @@ import { isArtifact, isCallable, isDependable, + isModule, isParameter, + isSubgraph, } from "utils/guards"; import { DeploymentGraph } from "./DeploymentGraph"; @@ -281,56 +283,16 @@ export class DeploymentBuilder implements IDeploymentBuilder { subgraph: Subgraph, options?: UseSubgraphOptions ): FutureDict { - const useSubgraphInvocationId = this.useSubgraphInvocationCounter++; - const label = `${subgraph.name}:${useSubgraphInvocationId}`; - - this.scopes.push(label); - const scopeLabel = this.scopes.getScopedLabel(); - - if (options !== undefined && options.parameters !== undefined) { - this.graph.registeredParameters[scopeLabel] = options.parameters; - } - - const result = subgraph.subgraphAction(this); - - const virtualVertex = this._createVirtualVertex(label); - - this.scopes.pop(); + const { result, virtualVertex } = this._useSubscope(subgraph, options); return { ...result, subgraph: virtualVertex }; } public useModule(module: Module, options?: UseSubgraphOptions): ModuleDict { - const label = `module:${module.name}`; - - if (this.moduleCache[label] === undefined) { - this.scopes.push(label); - const scopeLabel = this.scopes.getScopedLabel(); - - if (options?.parameters !== undefined) { - this.graph.registeredParameters[scopeLabel] = options.parameters; - } + const moduleKey = `module:${module.name}`; - const result = module.moduleAction(this); - - // type casting here so that typescript lets us validate against js users bypassing typeguards - for (const future of Object.values(result as FutureDict)) { - if (!isCallable(future)) { - throw new IgnitionError( - `Cannot return Future of type "${future.type}" from a module` - ); - } - } - - this._createVirtualVertex(label); - - this.scopes.pop(); - - const optionsHash = hash(options ?? null); - - this.moduleCache[label] = { result, optionsHash }; - } else { - const moduleData = this.moduleCache[label]; + if (this.moduleCache[moduleKey] !== undefined) { + const moduleData = this.moduleCache[moduleKey]; const newHash = hash(options ?? null); @@ -339,9 +301,30 @@ export class DeploymentBuilder implements IDeploymentBuilder { "`useModule` cannot be invoked on the same module using different parameters" ); } + + return this.moduleCache[moduleKey].result; } - return this.moduleCache[label].result; + const { result, virtualVertex } = this._useSubscope(module, options); + + // type casting here so that typescript lets us validate against js users bypassing typeguards + for (const future of Object.values(result)) { + if (isCallable(future)) { + continue; + } + + throw new IgnitionError( + `Cannot return Future of type "${future.type}" from a module` + ); + } + + const moduleResult = { ...result, module: virtualVertex }; + + const optionsHash = hash(options ?? null); + + this.moduleCache[moduleKey] = { result: moduleResult, optionsHash }; + + return moduleResult; } private _createVirtualVertex(label: string): Virtual { @@ -515,4 +498,39 @@ export class DeploymentBuilder implements IDeploymentBuilder { return scopeValue; } + + private _useSubscope( + subgraphOrModule: Subgraph | Module, + options?: UseSubgraphOptions + ) { + const useModuleInvocationId = this.useSubgraphInvocationCounter++; + const label = `${subgraphOrModule.name}:${useModuleInvocationId}`; + + this.scopes.push(label); + const scopeLabel = this.scopes.getScopedLabel(); + + if (options !== undefined && options.parameters !== undefined) { + this.graph.registeredParameters[scopeLabel] = options.parameters; + } + + const result = this._invokeAction(subgraphOrModule); + + const virtualVertex = this._createVirtualVertex(label); + + this.scopes.pop(); + + return { result, virtualVertex }; + } + + private _invokeAction(subgraphOrModule: Subgraph | Module) { + if (isSubgraph(subgraphOrModule)) { + return subgraphOrModule.subgraphAction(this); + } + + if (isModule(subgraphOrModule)) { + return subgraphOrModule.moduleAction(this); + } + + throw new Error("Unknown module type"); + } } diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 4a25ce6f69..3b95d32622 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,8 +1,8 @@ import type { IDeploymentBuilder } from "./deploymentGraph"; -import type { CallableFuture } from "./future"; +import type { CallableFuture, Virtual } from "./future"; export interface ModuleDict { - [key: string]: CallableFuture; + [key: string]: CallableFuture | Virtual; } export interface Module { diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index cadc19acc7..8674bd7296 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -6,6 +6,7 @@ import type { CallDeploymentVertex, HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, + Subgraph, } from "types/deploymentGraph"; import type { CallableFuture, @@ -15,6 +16,7 @@ import type { RequiredParameter, } from "types/future"; import { Artifact } from "types/hardhat"; +import { Module } from "types/module"; export function isArtifact(artifact: any): artifact is Artifact { return ( @@ -91,3 +93,11 @@ export function isCallable( ): future is CallableFuture { return future.type === "contract" || future.type === "library"; } + +export function isSubgraph(subgraph: {}): subgraph is Subgraph { + return `subgraphAction` in subgraph; +} + +export function isModule(mod: {}): mod is Module { + return `moduleAction` in mod; +} diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index dd8d84c17c..ed5a45bd4a 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -9,6 +9,11 @@ import type { } from "types/deploymentGraph"; import { Module } from "types/module"; +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + describe("deployment builder - useModule", () => { let deploymentGraph: IDeploymentGraph; @@ -50,11 +55,150 @@ describe("deployment builder - useModule", () => { assert.isDefined(deploymentGraph); }); - it("should have one node", () => { + it("should have two nodes", () => { assert.equal(deploymentGraph.vertexes.size, 2); }); }); + describe("depending on a module", () => { + before(() => { + const TokenModule = buildModule( + "TokenModule", + (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + + return { token }; + } + ); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { module } = m.useModule(TokenModule); + + const foo = m.contract("Foo", { after: [module] }); + + return { foo }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three node", () => { + assert.equal(deploymentGraph.vertexes.size, 3); + }); + + it("should have the Token node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Token"); + }); + + it("should show no dependencies for the Token node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should show one dependencies, on Foo for the virtual node of the module", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 1, label: "TokenModule:0", type: "" }, + ]); + }); + }); + + describe("nesting modules within modules within modules", () => { + before(() => { + const BottomModule = buildModule("Bottom", (m: IDeploymentBuilder) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const MiddleModule = buildModule("Middle", (m: IDeploymentBuilder) => { + const { foo } = m.useModule(BottomModule); + + return { foo }; + }); + + const TopModule = buildModule("Top", (m: IDeploymentBuilder) => { + const { foo } = m.useModule(MiddleModule); + + const bar = m.contract("Bar", { args: [foo] }); + + return { foo, bar }; + }); + + const { graph } = generateDeploymentGraphFrom(TopModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should have the Bar node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Bar"); + }); + + it("should show one dependencies, between Bar and Foo", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); + }); + }); + describe("reusing the same module with different parameters", () => { let differentParamsModule: Module; diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js index dff6bc6679..b270e39495 100644 --- a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-unused-modules module.exports = { id: "testing123", }; From ad868d77d97e9db777eedb2a5e2314bf6baf59e0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Oct 2022 12:42:08 +0100 Subject: [PATCH 0148/1302] feat: `after` option on useModule When invoking `useModule` or `useSubgraph` you can pass an `after` array of futures. All vertexes in the module/subgraph will depend on whatever is passed to as the `after`. The graph generation now adds an addition `before` vertex when a subgraph is created. --- packages/core/src/dsl/DeploymentBuilder.ts | 115 +++++++--- packages/core/src/dsl/DeploymentGraph.ts | 12 +- ...onvertDeploymentVertexToExecutionVertex.ts | 12 +- packages/core/src/types/deploymentGraph.ts | 12 +- packages/core/src/utils/guards.ts | 5 + .../core/test/deploymentBuilder/parameters.ts | 4 +- .../core/test/deploymentBuilder/useModule.ts | 208 +++++++++++++++++- .../test/deploymentBuilder/useSubgraph.ts | 104 +++++++++ packages/hardhat-plugin/test/use-module.ts | 79 +++++++ 9 files changed, 498 insertions(+), 53 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/useSubgraph.ts diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 8338a79444..50bdc1042e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -10,6 +10,7 @@ import { DeploymentBuilderOptions, DeploymentGraphVertex, UseSubgraphOptions, + ScopeData, } from "types/deploymentGraph"; import type { DeploymentGraphFuture, @@ -25,6 +26,7 @@ import type { FutureDict, CallableFuture, Virtual, + DependableFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { Module, ModuleCache, ModuleDict } from "types/module"; @@ -216,16 +218,17 @@ export class DeploymentBuilder implements IDeploymentBuilder { const parameter = contractFuture; const scope = parameter.scope; - const registeredScope = this.graph.registeredParameters[scope]; + const scopeData = this.graph.scopeData[scope]; if ( - registeredScope === undefined || - !(parameter.label in registeredScope) + scopeData === undefined || + scopeData.parameters === undefined || + !(parameter.label in scopeData.parameters) ) { throw new Error("Could not resolve contract from parameter"); } - contract = registeredScope[parameter.label] as + contract = scopeData.parameters[parameter.label] as | HardhatContract | ArtifactContract | DeployedContract; @@ -283,9 +286,9 @@ export class DeploymentBuilder implements IDeploymentBuilder { subgraph: Subgraph, options?: UseSubgraphOptions ): FutureDict { - const { result, virtualVertex } = this._useSubscope(subgraph, options); + const { result, after } = this._useSubscope(subgraph, options); - return { ...result, subgraph: virtualVertex }; + return { ...result, subgraph: after }; } public useModule(module: Module, options?: UseSubgraphOptions): ModuleDict { @@ -305,7 +308,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return this.moduleCache[moduleKey].result; } - const { result, virtualVertex } = this._useSubscope(module, options); + const { result, after } = this._useSubscope(module, options); // type casting here so that typescript lets us validate against js users bypassing typeguards for (const future of Object.values(result)) { @@ -318,7 +321,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - const moduleResult = { ...result, module: virtualVertex }; + const moduleResult = { ...result, module: after }; const optionsHash = hash(options ?? null); @@ -327,32 +330,52 @@ export class DeploymentBuilder implements IDeploymentBuilder { return moduleResult; } - private _createVirtualVertex(label: string): Virtual { + private _createBeforeVirtualVertex( + label: string, + after: DeploymentGraphFuture[] = [] + ): Virtual { + const afterLabel = `${label}::before`; + const virtualFuture: Virtual = { vertexId: this._resolveNextId(), - label, + label: afterLabel, type: "virtual", _future: true, }; const scopeLabel = this.scopes.getScopedLabel(); - const afterVertexFutures = [...this.graph.vertexes.values()] - .filter((v) => v.scopeAdded === scopeLabel) - .map( - (v): DeploymentGraphFuture => ({ - vertexId: v.id, - label: v.label, - type: "virtual", - _future: true, - }) - ); + DeploymentBuilder._addVertex(this.graph, { + id: virtualFuture.vertexId, + label: afterLabel, + type: "Virtual", + after, + scopeAdded: scopeLabel, + }); + + return virtualFuture; + } + + private _createAfterVirtualVertex( + label: string, + after: DeploymentGraphFuture[] = [] + ): Virtual { + const afterLabel = `${label}::after`; + + const virtualFuture: Virtual = { + vertexId: this._resolveNextId(), + label: afterLabel, + type: "virtual", + _future: true, + }; + + const scopeLabel = this.scopes.getScopedLabel(); DeploymentBuilder._addVertex(this.graph, { id: virtualFuture.vertexId, - label, + label: afterLabel, type: "Virtual", - after: afterVertexFutures, + after, scopeAdded: scopeLabel, }); @@ -480,13 +503,13 @@ export class DeploymentBuilder implements IDeploymentBuilder { graph: DeploymentGraph, param: RequiredParameter | OptionalParameter ) { - const parametersFromScope = graph.registeredParameters[param.scope]; + const scopeData = graph.scopeData[param.scope]; - if (parametersFromScope === undefined) { + if (scopeData === undefined || scopeData.parameters === undefined) { return param; } - const scopeValue = parametersFromScope[param.label]; + const scopeValue = scopeData.parameters[param.label]; if (param.subtype === "optional") { return scopeValue ?? param.defaultValue; @@ -509,17 +532,49 @@ export class DeploymentBuilder implements IDeploymentBuilder { this.scopes.push(label); const scopeLabel = this.scopes.getScopedLabel(); - if (options !== undefined && options.parameters !== undefined) { - this.graph.registeredParameters[scopeLabel] = options.parameters; - } + const beforeVirtualVertex = this._createBeforeVirtualVertex( + label, + options?.after + ); + + const scopeData: ScopeData = { + before: beforeVirtualVertex, + parameters: options?.parameters, + }; + + this.graph.scopeData[scopeLabel] = scopeData; const result = this._invokeAction(subgraphOrModule); - const virtualVertex = this._createVirtualVertex(label); + const addedVertexes = [...this.graph.vertexes.values()] + .filter((v) => v.scopeAdded === scopeLabel) + .filter((v) => v.type !== "Virtual") + .map( + (v): DependableFuture => ({ + vertexId: v.id, + label: v.label, + type: "virtual", + _future: true, + }) + ); + + for (const addedVertex of addedVertexes) { + addEdge(this.graph.adjacencyList, { + from: beforeVirtualVertex.vertexId, + to: addedVertex.vertexId, + }); + } + + const afterVirtualVertex = this._createAfterVirtualVertex( + label, + addedVertexes + ); + + scopeData.after = afterVirtualVertex; this.scopes.pop(); - return { result, virtualVertex }; + return { before: beforeVirtualVertex, result, after: afterVirtualVertex }; } private _invokeAction(subgraphOrModule: Subgraph | Module) { diff --git a/packages/core/src/dsl/DeploymentGraph.ts b/packages/core/src/dsl/DeploymentGraph.ts index a3df24d07e..c37b7a638f 100644 --- a/packages/core/src/dsl/DeploymentGraph.ts +++ b/packages/core/src/dsl/DeploymentGraph.ts @@ -1,15 +1,17 @@ import { Graph } from "graph/Graph"; -import { DeploymentGraphVertex as DeploymentGraphVertex } from "types/deploymentGraph"; -import { DeploymentGraphFuture } from "types/future"; +import { + DeploymentGraphVertex as DeploymentGraphVertex, + ScopeData, +} from "types/deploymentGraph"; export class DeploymentGraph extends Graph { - public registeredParameters: { - [key: string]: { [key: string]: string | number | DeploymentGraphFuture }; + public scopeData: { + [key: string]: ScopeData; }; constructor() { super(); - this.registeredParameters = {}; + this.scopeData = {}; } } diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index c7ec64f8cd..0e553db448 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -189,10 +189,14 @@ async function resolveParameter( } const scope = arg.scope; - const scopeParameters = graph.registeredParameters[scope]; - - if (scopeParameters !== undefined && arg.label in scopeParameters) { - return scopeParameters[arg.label]; + const scopeData = graph.scopeData[scope]; + + if ( + scopeData !== undefined && + scopeData.parameters !== undefined && + arg.label in scopeData.parameters + ) { + return scopeData.parameters[arg.label]; } const hasParamResult = await services.config.hasParam(arg.label); diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 654804156d..031bb5b3e5 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -11,16 +11,23 @@ import { ParameterValue, RequiredParameter, CallableFuture, + Virtual, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; import { Module, ModuleDict } from "./module"; +export interface ScopeData { + before: Virtual; + after?: Virtual; + parameters?: { [key: string]: string | number | DeploymentGraphFuture }; +} + export interface IDeploymentGraph { vertexes: Map; adjacencyList: AdjacencyList; - registeredParameters: { - [key: string]: { [key: string]: string | number | DeploymentGraphFuture }; + scopeData: { + [key: string]: ScopeData; }; getEdges(): Array<{ from: number; to: number }>; } @@ -109,6 +116,7 @@ export interface ContractOptions { export interface UseSubgraphOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; + after?: DeploymentGraphFuture[]; } export interface IDeploymentBuilder { diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 8674bd7296..78a4948bf5 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -14,6 +14,7 @@ import type { OptionalParameter, DeploymentGraphFuture, RequiredParameter, + Virtual, } from "types/future"; import { Artifact } from "types/hardhat"; import { Module } from "types/module"; @@ -82,6 +83,10 @@ export function isDependable(possible: any): possible is DependableFuture { ); } +export function isVirtual(possible: any): possible is Virtual { + return isFuture(possible) && possible.type === "virtual"; +} + export function isParameter( future: DeploymentGraphFuture ): future is RequiredParameter | OptionalParameter { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 6e3100b83a..b17bde2b3b 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -50,7 +50,7 @@ describe("deployment builder - parameters", function () { assert.isDefined(deploymentGraph); }); - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 2); + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); }); }); diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index ed5a45bd4a..6a7135ad9a 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -55,8 +55,8 @@ describe("deployment builder - useModule", () => { assert.isDefined(deploymentGraph); }); - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); }); }); @@ -90,8 +90,8 @@ describe("deployment builder - useModule", () => { assert.isDefined(deploymentGraph); }); - it("should have three node", () => { - assert.equal(deploymentGraph.vertexes.size, 3); + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); }); it("should have the Token node", () => { @@ -101,7 +101,7 @@ describe("deployment builder - useModule", () => { assert.equal(depNode?.label, "Token"); }); - it("should show no dependencies for the Token node", () => { + it("should show the Token node depending on the modules before virtual node", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); if (depNode === undefined) { @@ -110,7 +110,13 @@ describe("deployment builder - useModule", () => { const deps = getDependenciesForVertex(deploymentGraph, depNode); - assert.deepStrictEqual(deps, []); + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "TokenModule:0::before", + type: "", + }, + ]); }); it("should have the Foo node", () => { @@ -130,7 +136,189 @@ describe("deployment builder - useModule", () => { const deps = getDependenciesForVertex(deploymentGraph, depNode); assert.deepStrictEqual(deps, [ - { id: 1, label: "TokenModule:0", type: "" }, + { id: 2, label: "TokenModule:0::after", type: "" }, + ]); + }); + }); + + describe("a module depending on a contract", () => { + before(() => { + const TokenModule = buildModule( + "TokenModule", + (m: IDeploymentBuilder) => { + const bar = m.contract("Bar"); + const baz = m.contract("Baz"); + + return { bar, baz }; + } + ); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const foo = m.contract("Foo"); + + const { bar, baz } = m.useModule(TokenModule, { after: [foo] }); + + return { foo, bar, baz }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have five nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 5); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should have the Bar node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Bar"); + }); + + it("should have the Baz node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Baz"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Baz"); + }); + + it("should show Bar depending on the module before node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 1, label: "TokenModule:0::before", type: "" }, + ]); + }); + + it("should show Baz depending on the module before node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Baz"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 1, label: "TokenModule:0::before", type: "" }, + ]); + }); + + it("should show module before virtual vertex depending on the Foo contract", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "TokenModule:0::before" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); + }); + }); + + describe("a module depending on a module", () => { + before(() => { + const FooModule = buildModule("FooModule", (m: IDeploymentBuilder) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const BarModule = buildModule("BarModule", (m: IDeploymentBuilder) => { + const bar = m.contract("Bar"); + + return { bar }; + }); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { module: barModule, foo } = m.useModule(FooModule); + const { bar } = m.useModule(BarModule, { after: [barModule] }); + + return { foo, bar }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have six nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 6); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should have the Bar node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Bar"); + }); + + it("should show Bar depending on the module before node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 3, label: "BarModule:1::before", type: "" }, + ]); + }); + + it("should show bar module before virtual vertex depending on the Foo module after virtual vertex", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "BarModule:1::before" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 2, label: "FooModule:0::after", type: "" }, ]); }); }); @@ -168,8 +356,8 @@ describe("deployment builder - useModule", () => { assert.isDefined(deploymentGraph); }); - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); + it("should have six nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 6); }); it("should have the Foo node", () => { @@ -195,7 +383,7 @@ describe("deployment builder - useModule", () => { const deps = getDependenciesForVertex(deploymentGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); + assert.deepStrictEqual(deps, [{ id: 2, label: "Foo", type: "" }]); }); }); diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts new file mode 100644 index 0000000000..79d9048abd --- /dev/null +++ b/packages/core/test/deploymentBuilder/useSubgraph.ts @@ -0,0 +1,104 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { buildSubgraph } from "dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; +import { isCallable } from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - useSubgraph", () => { + let deploymentGraph: IDeploymentGraph; + + describe("use subgraph from within a module", () => { + before(() => { + const BarSubgraph = buildSubgraph( + "BarSubgraph", + (m: IDeploymentBuilder) => { + const bar = m.contract("Bar"); + + return { bar }; + } + ); + + const WrapModule = buildModule("Wrap", (m) => { + const foo = m.contract("Foo"); + + const { bar } = m.useSubgraph(BarSubgraph, { + after: [foo], + }); + + if (!isCallable(bar)) { + throw new Error("Not callable"); + } + + return { foo, bar }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should have the Bar node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Bar"); + }); + + it("should show bar depending on the subgraph before node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 1, label: "BarSubgraph:0::before", type: "" }, + ]); + }); + + it("should show the subgraph before node dependent on Foo", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "BarSubgraph:0::before" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index 8fcae04393..f3a65bb8b0 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -225,4 +225,83 @@ describe("useModule", function () { ); }); }); + + describe("modules depending on modules", () => { + it("should allow ordering using returned futures", async function () { + await this.hre.run("compile", { quiet: true }); + + const addSecondAndThirdEntryModule = buildModule( + "SecondAndThirdCallModule", + (m) => { + const trace = m.getParam("Trace"); + + const secondCall = m.call(trace, "addEntry", { + args: ["second"], + }); + + m.call(trace, "addEntry", { + args: ["third"], + after: [secondCall], + }); + + return {}; + } + ); + + const fourthCallModule = buildModule("FourthCallModule", (m) => { + const trace = m.getParam("Trace"); + + m.call(trace, "addEntry", { + args: ["fourth"], + }); + + return {}; + }); + + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const trace = m.contract("Trace", { + args: ["first"], + }); + + const { module: secondAndThirdModule } = m.useModule( + addSecondAndThirdEntryModule, + { + parameters: { + Trace: trace, + }, + } + ); + + m.useModule(fourthCallModule, { + parameters: { + Trace: trace, + }, + after: [secondAndThirdModule], + }); + + return { trace }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: {}, + ui: false, + }); + + await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + const entry4 = await result.trace.entries(3); + + assert.deepStrictEqual( + [entry1, entry2, entry3, entry4], + ["first", "second", "third", "fourth"] + ); + }); + }); }); From d2d0836e4e24a7f8bc2471f880e2a7a7230e2a0f Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 31 Oct 2022 12:26:38 +0000 Subject: [PATCH 0149/1302] refactor(core): share subgraph/module holder The holder object for the module/subgraph object is now shared, with a `Module` just being `Subgraph`, but with further constraints on the type of T (specifically that T is a `ModuleDict` which is more constrained than a a subgraphs `FutureDict`). --- packages/core/src/Ignition.ts | 14 ++++---- packages/core/src/dsl/DeploymentBuilder.ts | 35 +++++++------------ packages/core/src/dsl/buildModule.ts | 8 ++--- packages/core/src/dsl/buildSubgraph.ts | 8 ++--- packages/core/src/index.ts | 2 +- .../process/generateDeploymentGraphFrom.ts | 8 ++--- packages/core/src/types/deploymentGraph.ts | 16 ++++++--- packages/core/src/types/module.ts | 11 +++--- packages/core/src/utils/guards.ts | 10 ------ .../hardhat-plugin/src/ignition-wrapper.ts | 7 ++-- packages/hardhat-plugin/src/index.ts | 6 ++-- packages/hardhat-plugin/src/user-modules.ts | 10 +++--- 12 files changed, 61 insertions(+), 74 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 5b5068e414..4e22c6b0c2 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -10,7 +10,7 @@ import { Services } from "services/types"; import { DeploymentResult, UpdateUiAction } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; import { ResultsAccumulator } from "types/graph"; -import { Module } from "types/module"; +import { Module, ModuleDict } from "types/module"; import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; import { SerializedFutureResult } from "types/serialization"; @@ -31,8 +31,8 @@ type ModuleOutputs = Record; export class Ignition { constructor(private _providers: Providers) {} - public async deploy( - ignitionModule: Module, + public async deploy( + ignitionModule: Module, givenOptions?: IgnitionDeployOptions ): Promise<[DeploymentResult, ModuleOutputs]> { log(`Start deploy`); @@ -77,7 +77,9 @@ export class Ignition { return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } - public async plan(deploymentModule: Module): Promise { + public async plan( + deploymentModule: Module + ): Promise { log(`Start plan`); const serviceOptions = { @@ -124,9 +126,9 @@ export class Ignition { return { deploymentGraph, executionGraph }; } - private async _constructExecutionGraphFrom( + private async _constructExecutionGraphFrom( deployment: Deployment, - ignitionModule: Module + ignitionModule: Module ): Promise<{ result: any; moduleOutputs: FutureDict }> { log("Generate deployment graph from module"); const { graph: deploymentGraph, moduleOutputs } = diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 50bdc1042e..a6d19f137c 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -29,15 +29,13 @@ import type { DependableFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; -import type { Module, ModuleCache, ModuleDict } from "types/module"; +import type { ModuleCache, ModuleDict } from "types/module"; import { IgnitionError } from "utils/errors"; import { isArtifact, isCallable, isDependable, - isModule, isParameter, - isSubgraph, } from "utils/guards"; import { DeploymentGraph } from "./DeploymentGraph"; @@ -282,16 +280,19 @@ export class DeploymentBuilder implements IDeploymentBuilder { return paramFuture; } - public useSubgraph( - subgraph: Subgraph, + public useSubgraph( + subgraph: Subgraph, options?: UseSubgraphOptions - ): FutureDict { + ): T { const { result, after } = this._useSubscope(subgraph, options); return { ...result, subgraph: after }; } - public useModule(module: Module, options?: UseSubgraphOptions): ModuleDict { + public useModule( + module: Subgraph, + options?: UseSubgraphOptions + ): T { const moduleKey = `module:${module.name}`; if (this.moduleCache[moduleKey] !== undefined) { @@ -305,7 +306,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - return this.moduleCache[moduleKey].result; + return this.moduleCache[moduleKey].result as any; } const { result, after } = this._useSubscope(module, options); @@ -522,8 +523,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { return scopeValue; } - private _useSubscope( - subgraphOrModule: Subgraph | Module, + private _useSubscope( + subgraphOrModule: Subgraph, options?: UseSubgraphOptions ) { const useModuleInvocationId = this.useSubgraphInvocationCounter++; @@ -544,7 +545,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { this.graph.scopeData[scopeLabel] = scopeData; - const result = this._invokeAction(subgraphOrModule); + const result = subgraphOrModule.action(this); const addedVertexes = [...this.graph.vertexes.values()] .filter((v) => v.scopeAdded === scopeLabel) @@ -576,16 +577,4 @@ export class DeploymentBuilder implements IDeploymentBuilder { return { before: beforeVirtualVertex, result, after: afterVirtualVertex }; } - - private _invokeAction(subgraphOrModule: Subgraph | Module) { - if (isSubgraph(subgraphOrModule)) { - return subgraphOrModule.subgraphAction(this); - } - - if (isModule(subgraphOrModule)) { - return subgraphOrModule.moduleAction(this); - } - - throw new Error("Unknown module type"); - } } diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index 77a7d45a73..c56859433a 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,12 +1,12 @@ import type { IDeploymentBuilder } from "types/deploymentGraph"; import type { Module, ModuleDict } from "types/module"; -export function buildModule( +export function buildModule( moduleName: string, - moduleAction: (m: IDeploymentBuilder) => ModuleDict -): Module { + moduleAction: (m: IDeploymentBuilder) => T +): Module { return { name: moduleName, - moduleAction, + action: moduleAction, }; } diff --git a/packages/core/src/dsl/buildSubgraph.ts b/packages/core/src/dsl/buildSubgraph.ts index 5add34a88e..4c3f560e1e 100644 --- a/packages/core/src/dsl/buildSubgraph.ts +++ b/packages/core/src/dsl/buildSubgraph.ts @@ -1,12 +1,12 @@ import type { IDeploymentBuilder, Subgraph } from "types/deploymentGraph"; import type { FutureDict } from "types/future"; -export function buildSubgraph( +export function buildSubgraph( subgraphName: string, - subgraphAction: (m: IDeploymentBuilder) => FutureDict -): Subgraph { + subgraphAction: (m: IDeploymentBuilder) => T +): Subgraph { return { name: subgraphName, - subgraphAction, + action: subgraphAction, }; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 0cc54cd23d..1812bb1503 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -17,7 +17,7 @@ export type { DeployPhase, DeploymentResult, } from "types/deployment"; -export type { Module } from "types/module"; +export type { Module, ModuleDict } from "types/module"; export type { Subgraph, ExternalParamValue, diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index d776dffa22..3c05208d38 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -4,15 +4,15 @@ import type { IDeploymentGraph, } from "types/deploymentGraph"; import { FutureDict } from "types/future"; -import { Module } from "types/module"; +import { Module, ModuleDict } from "types/module"; -export function generateDeploymentGraphFrom( - ignitionModule: Module, +export function generateDeploymentGraphFrom( + ignitionModule: Module, builderOptions: DeploymentBuilderOptions ): { graph: IDeploymentGraph; moduleOutputs: FutureDict } { const graphBuilder = new DeploymentBuilder(builderOptions); - const moduleOutputs = ignitionModule.moduleAction(graphBuilder); + const moduleOutputs = ignitionModule.action(graphBuilder); return { graph: graphBuilder.graph, moduleOutputs }; } diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 031bb5b3e5..2a1abbc735 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -15,7 +15,7 @@ import { } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; -import { Module, ModuleDict } from "./module"; +import { ModuleDict } from "./module"; export interface ScopeData { before: Virtual; @@ -160,13 +160,19 @@ export interface IDeploymentBuilder { defaultValue: ParameterValue ) => OptionalParameter; - useSubgraph: (subgraph: Subgraph, options?: UseSubgraphOptions) => FutureDict; - useModule: (module: Module, options?: UseSubgraphOptions) => ModuleDict; + useSubgraph: ( + subgraph: Subgraph, + options?: UseSubgraphOptions + ) => T; + useModule: ( + module: Subgraph, + options?: UseSubgraphOptions + ) => T; } -export interface Subgraph { +export interface Subgraph { name: string; - subgraphAction: (builder: IDeploymentBuilder) => FutureDict; + action: (builder: IDeploymentBuilder) => T; } export interface DeploymentBuilderOptions { diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 3b95d32622..dd418048eb 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,14 +1,11 @@ -import type { IDeploymentBuilder } from "./deploymentGraph"; -import type { CallableFuture, Virtual } from "./future"; +import { Subgraph } from "./deploymentGraph"; +import type { CallableFuture, FutureDict, Virtual } from "./future"; -export interface ModuleDict { +export interface ModuleDict extends FutureDict { [key: string]: CallableFuture | Virtual; } -export interface Module { - name: string; - moduleAction: (builder: IDeploymentBuilder) => ModuleDict; -} +export type Module = Subgraph; export interface ModuleData { result: ModuleDict; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 78a4948bf5..bf9f99ac9a 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -6,7 +6,6 @@ import type { CallDeploymentVertex, HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, - Subgraph, } from "types/deploymentGraph"; import type { CallableFuture, @@ -17,7 +16,6 @@ import type { Virtual, } from "types/future"; import { Artifact } from "types/hardhat"; -import { Module } from "types/module"; export function isArtifact(artifact: any): artifact is Artifact { return ( @@ -98,11 +96,3 @@ export function isCallable( ): future is CallableFuture { return future.type === "contract" || future.type === "library"; } - -export function isSubgraph(subgraph: {}): subgraph is Subgraph { - return `subgraphAction` in subgraph; -} - -export function isModule(mod: {}): mod is Module { - return `moduleAction` in mod; -} diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 3b4ecf82f2..f2329b1c21 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -4,6 +4,7 @@ import { Providers, ExternalParamValue, Module, + ModuleDict, } from "@ignored/ignition-core"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -25,8 +26,8 @@ export class IgnitionWrapper { this._ignition = new Ignition(_providers); } - public async deploy( - ignitionModule: Module, + public async deploy( + ignitionModule: Module, deployParams: | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } | undefined @@ -87,7 +88,7 @@ export class IgnitionWrapper { return resolvedOutput; } - public async plan(ignitionModule: Module) { + public async plan(ignitionModule: Module) { return this._ignition.plan(ignitionModule); } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index f310043bd8..419df1fe6b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import "@nomiclabs/hardhat-ethers"; -import { Module, Providers } from "@ignored/ignition-core"; +import { Module, ModuleDict, Providers } from "@ignored/ignition-core"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -123,7 +123,7 @@ task("deploy") process.exit(0); } - let userModules: Module[]; + let userModules: Array>; if (userModulesPaths.length === 0) { userModules = loadAllUserModules(hre.config.paths.ignition); } else { @@ -155,7 +155,7 @@ task("plan") ) => { await hre.run("compile", { quiet: true }); - let userModules: Module[]; + let userModules: Array>; if (userModulesPaths.length === 0) { userModules = loadAllUserModules(hre.config.paths.ignition); } else { diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts index 9ef7f53af6..4644fd2220 100644 --- a/packages/hardhat-plugin/src/user-modules.ts +++ b/packages/hardhat-plugin/src/user-modules.ts @@ -1,11 +1,13 @@ -import { Module } from "@ignored/ignition-core"; +import { Module, ModuleDict } from "@ignored/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; const debug = setupDebug("hardhat-ignition:modules"); -export function loadAllUserModules(userModulesDirectory: string): Module[] { +export function loadAllUserModules( + userModulesDirectory: string +): Array> { debug(`Loading all user modules from '${userModulesDirectory}'`); if (!fsExtra.existsSync(userModulesDirectory)) { @@ -20,7 +22,7 @@ export function loadAllUserModules(userModulesDirectory: string): Module[] { export function loadUserModules( userModulesDirectory: string, userModulesFiles: string[] = [] -): Module[] { +): Array> { debug(`Loading user modules from '${userModulesDirectory}'`); if (!fsExtra.existsSync(userModulesDirectory)) { @@ -37,7 +39,7 @@ export function loadUserModules( export function getUserModulesFromPaths( resolvedUserModulesPaths: string[] -): Module[] { +): Array> { debug(`Loading '${resolvedUserModulesPaths.length}' module files`); const userModules: any[] = []; From 9f6fc4a9efac2447057759fe7acb587dff20500e Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 31 Oct 2022 12:35:25 +0000 Subject: [PATCH 0150/1302] feat: `useModule` returns a future Instead of returning a dictionary of futures, we now return a future from `useModule` that is the after virtual node for the module, that contains the entries that are also futures. This allows users to depend on the module directly or to destructure the response and depend on those futures: ```ts const module = m.useModule(MyModule); m.contract("Foo", { after: [module] }); m.constract("Bar", { after: [module.baz]}); ``` --- packages/core/src/dsl/DeploymentBuilder.ts | 10 +-- packages/core/src/types/deploymentGraph.ts | 4 +- packages/core/src/types/module.ts | 2 +- .../core/test/deploymentBuilder/useModule.ts | 23 +++++-- .../test/deploymentBuilder/useSubgraph.ts | 64 ++++++++++++++++++- packages/hardhat-plugin/test/use-module.ts | 15 ++--- 6 files changed, 94 insertions(+), 24 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index a6d19f137c..50e9cbc959 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -283,16 +283,16 @@ export class DeploymentBuilder implements IDeploymentBuilder { public useSubgraph( subgraph: Subgraph, options?: UseSubgraphOptions - ): T { + ): Virtual & T { const { result, after } = this._useSubscope(subgraph, options); - return { ...result, subgraph: after }; + return { ...result, ...after }; } public useModule( module: Subgraph, options?: UseSubgraphOptions - ): T { + ): Virtual & T { const moduleKey = `module:${module.name}`; if (this.moduleCache[moduleKey] !== undefined) { @@ -306,7 +306,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - return this.moduleCache[moduleKey].result as any; + return moduleData.result as any; } const { result, after } = this._useSubscope(module, options); @@ -322,7 +322,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - const moduleResult = { ...result, module: after }; + const moduleResult = { ...result, ...after }; const optionsHash = hash(options ?? null); diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 2a1abbc735..885dd747e4 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -163,11 +163,11 @@ export interface IDeploymentBuilder { useSubgraph: ( subgraph: Subgraph, options?: UseSubgraphOptions - ) => T; + ) => Virtual & T; useModule: ( module: Subgraph, options?: UseSubgraphOptions - ) => T; + ) => Virtual & T; } export interface Subgraph { diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index dd418048eb..286ee0ba54 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -8,7 +8,7 @@ export interface ModuleDict extends FutureDict { export type Module = Subgraph; export interface ModuleData { - result: ModuleDict; + result: Virtual & ModuleDict; optionsHash: string; } diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 6a7135ad9a..c8ab045761 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -7,6 +7,12 @@ import type { IDeploymentGraph, IDeploymentBuilder, } from "types/deploymentGraph"; +import { + ArtifactContract, + CallableFuture, + HardhatContract, + Virtual, +} from "types/future"; import { Module } from "types/module"; import { @@ -72,7 +78,7 @@ describe("deployment builder - useModule", () => { ); const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { module } = m.useModule(TokenModule); + const module = m.useModule(TokenModule); const foo = m.contract("Foo", { after: [module] }); @@ -256,10 +262,10 @@ describe("deployment builder - useModule", () => { }); const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { module: barModule, foo } = m.useModule(FooModule); - const { bar } = m.useModule(BarModule, { after: [barModule] }); + const fooModule = m.useModule(FooModule); + const { bar } = m.useModule(BarModule, { after: [fooModule] }); - return { foo, bar }; + return { foo: fooModule.foo, bar }; }); const { graph } = generateDeploymentGraphFrom(WrapModule, { @@ -388,7 +394,10 @@ describe("deployment builder - useModule", () => { }); describe("reusing the same module with different parameters", () => { - let differentParamsModule: Module; + let differentParamsModule: Module<{ + token: HardhatContract | ArtifactContract; + token2: HardhatContract | ArtifactContract; + }>; before(() => { const librariesModule = buildModule( @@ -429,7 +438,9 @@ describe("deployment builder - useModule", () => { }); describe("returning non contract/library futures from within a module", () => { - let returnsWrongFutureTypeModule: Module; + let returnsWrongFutureTypeModule: Module<{ + token: CallableFuture | Virtual; + }>; before(() => { const returnTypeModule = buildModule( diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts index 79d9048abd..06b498ba50 100644 --- a/packages/core/test/deploymentBuilder/useSubgraph.ts +++ b/packages/core/test/deploymentBuilder/useSubgraph.ts @@ -54,7 +54,7 @@ describe("deployment builder - useSubgraph", () => { assert.isDefined(deploymentGraph); }); - it("should have three nodes", () => { + it("should have four nodes", () => { assert.equal(deploymentGraph.vertexes.size, 4); }); @@ -101,4 +101,66 @@ describe("deployment builder - useSubgraph", () => { assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); }); }); + + describe("depened on a subgraph", () => { + before(() => { + const FooSubgraph = buildSubgraph("BarSubgraph", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const WrapModule = buildModule("Wrap", (m) => { + const fooSubgraph = m.useSubgraph(FooSubgraph); + + const bar = m.contract("Bar", { + after: [fooSubgraph], + }); + + return { foo: fooSubgraph.foo, bar }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); + + it("should have the Foo node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Foo"); + }); + + it("should have the Bar node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + assert.isDefined(depNode); + assert.equal(depNode?.label, "Bar"); + }); + + it("should show bar depending on the subgraph after node", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 2, label: "BarSubgraph:0::after", type: "" }, + ]); + }); + }); }); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index f3a65bb8b0..a6a4b175a3 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -189,7 +189,7 @@ describe("useModule", function () { args: ["first"], }); - const { subgraph } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { + const subgraph = m.useSubgraph(addSecondAndThirdEntrySubgraph, { parameters: { Trace: trace, }, @@ -263,14 +263,11 @@ describe("useModule", function () { args: ["first"], }); - const { module: secondAndThirdModule } = m.useModule( - addSecondAndThirdEntryModule, - { - parameters: { - Trace: trace, - }, - } - ); + const secondAndThirdModule = m.useModule(addSecondAndThirdEntryModule, { + parameters: { + Trace: trace, + }, + }); m.useModule(fourthCallModule, { parameters: { From e0edf2256ad566cd49155d0d365898b3b96cb412 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 1 Nov 2022 18:09:48 +0000 Subject: [PATCH 0151/1302] feat: module contract dep equivalent to module dep If a contract future returned from a module is passed to a subsequent deployment builder call, the dependency created will be to the containing module rather than the vertex itself. This makes the following have the same execution graph: ```ts const module = m.useModule(MyModule); m.contract("Foo", { after: [module] }); ``` and ```ts const { bar } = m.useModule(MyModule); m.contract("Foo", { after: [bar] }); ``` In both cases, the entirety of the module is executed before `Foo` is deployed. This is done by having `useModule` switch in proxy futures for the return results of the module. Each proxy points at both the module and the underlying future. Any dependency on the proxy is resolved to the module, but any value is resolved to the underlying future. --- packages/core/src/Ignition.ts | 5 +- packages/core/src/dsl/DeploymentBuilder.ts | 88 ++++++++++++------- packages/core/src/execution/dispatch/utils.ts | 38 ++++---- packages/core/src/types/future.ts | 14 ++- packages/core/src/types/module.ts | 9 +- packages/core/src/utils/guards.ts | 12 ++- packages/core/src/utils/proxy.ts | 28 ++++++ .../src/validation/dispatch/validateCall.ts | 13 ++- .../core/test/deploymentBuilder/useModule.ts | 60 ++++++++++++- packages/hardhat-plugin/test/use-module.ts | 67 +++++++++++++- 10 files changed, 274 insertions(+), 60 deletions(-) create mode 100644 packages/core/src/utils/proxy.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 4e22c6b0c2..89befb9f9c 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -15,6 +15,7 @@ import { IgnitionPlan } from "types/plan"; import { Providers } from "types/providers"; import { SerializedFutureResult } from "types/serialization"; import { isDependable } from "utils/guards"; +import { resolveProxyValue } from "utils/proxy"; import { serializeFutureOutput } from "utils/serialize"; import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; @@ -171,7 +172,9 @@ export class Ignition { ); const convertedEntries: Array<[string, SerializedFutureResult]> = entries - .map(([name, future]): [string, SerializedFutureResult] | null => { + .map(([name, givenFuture]): [string, SerializedFutureResult] | null => { + const future = resolveProxyValue(givenFuture); + const executionResultValue = result.get(future.vertexId); if ( diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 50e9cbc959..99ab30e66f 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -27,6 +27,7 @@ import type { CallableFuture, Virtual, DependableFuture, + ProxyFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; @@ -37,6 +38,7 @@ import { isDependable, isParameter, } from "utils/guards"; +import { resolveProxyDependency } from "utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; @@ -306,7 +308,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - return moduleData.result as any; + return moduleData.result as Virtual & T; } const { result, after } = this._useSubscope(module, options); @@ -322,7 +324,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - const moduleResult = { ...result, ...after }; + const moduleResult = { ...this._enhance(result, after), ...after }; const optionsHash = hash(options ?? null); @@ -331,6 +333,21 @@ export class DeploymentBuilder implements IDeploymentBuilder { return moduleResult; } + private _enhance(result: T, after: Virtual): T { + return Object.fromEntries( + Object.entries(result).map(([key, value]) => [ + key, + { + label: key, + type: "proxy", + proxy: after, + value, + _future: true, + } as ProxyFuture, + ]) + ) as T; + } + private _createBeforeVirtualVertex( label: string, after: DeploymentGraphFuture[] = [] @@ -434,10 +451,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { } if (depNode.type === "Call") { - addEdge(graph.adjacencyList, { - from: depNode.contract.vertexId, - to: depNode.id, - }); + DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.args), @@ -468,35 +482,47 @@ export class DeploymentBuilder implements IDeploymentBuilder { depNode: DeploymentGraphVertex ) { for (const arg of args) { - if ( - typeof arg === "string" || - typeof arg === "number" || - typeof arg === "boolean" - ) { - continue; - } + DeploymentBuilder._addEdgeBasedOn(arg, graph, depNode); + } + } - if (isDependable(arg)) { - addEdge(graph.adjacencyList, { from: arg.vertexId, to: depNode.id }); - continue; - } + private static _addEdgeBasedOn( + arg: InternalParamValue, + graph: DeploymentGraph, + depNode: DeploymentGraphVertex + ) { + if ( + typeof arg === "string" || + typeof arg === "number" || + typeof arg === "boolean" + ) { + return; + } - if (isParameter(arg)) { - const resolvedArg = DeploymentBuilder._resolveParameterFromScope( - graph, - arg - ); + if (isDependable(arg)) { + addEdge(graph.adjacencyList, { + from: resolveProxyDependency(arg).vertexId, + to: depNode.id, + }); - if (isDependable(resolvedArg)) { - addEdge(graph.adjacencyList, { - from: resolvedArg.vertexId, - to: depNode.id, - }); - continue; - } + return; + } - continue; + if (isParameter(arg)) { + const resolvedArg = DeploymentBuilder._resolveParameterFromScope( + graph, + arg + ); + + if (isDependable(resolvedArg)) { + addEdge(graph.adjacencyList, { + from: resolveProxyDependency(resolvedArg).vertexId, + to: depNode.id, + }); + return; } + + return; } } @@ -562,7 +588,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { for (const addedVertex of addedVertexes) { addEdge(this.graph.adjacencyList, { from: beforeVirtualVertex.vertexId, - to: addedVertex.vertexId, + to: resolveProxyDependency(addedVertex).vertexId, }); } diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index 231e042c10..53a60c4549 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,6 +1,6 @@ import { ArgValue } from "types/executionGraph"; import { ResultsAccumulator } from "types/graph"; -import { isDependable } from "utils/guards"; +import { isDependable, isProxy } from "utils/guards"; export function toAddress(v: any) { if (typeof v === "object" && "address" in v) { @@ -11,23 +11,29 @@ export function toAddress(v: any) { } export function resolveFrom(context: ResultsAccumulator) { - return (arg: ArgValue) => { - if (!isDependable(arg)) { - return arg; - } + return (arg: ArgValue) => resolveFromContext(context, arg); +} + +function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { + if (isProxy(arg)) { + return resolveFromContext(context, arg.value); + } - const entry = context.get(arg.vertexId); + if (!isDependable(arg)) { + return arg; + } - if (!entry) { - throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); - } + const entry = context.get(arg.vertexId); - if (entry._kind === "failure") { - throw new Error( - `Looking up context on a failed vertex - violation of constraint` - ); - } + if (!entry) { + throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); + } + + if (entry._kind === "failure") { + throw new Error( + `Looking up context on a failed vertex - violation of constraint` + ); + } - return entry.result; - }; + return entry.result; } diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 308fc30684..1cfd95fc07 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -78,6 +78,14 @@ export interface Virtual { _future: true; } +export interface ProxyFuture { + label: string; + type: "proxy"; + proxy: DependableFuture; + value: DependableFuture; + _future: true; +} + export type ContractFuture = | HardhatContract | ArtifactContract @@ -87,7 +95,11 @@ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; export type CallableFuture = ContractFuture | LibraryFuture; -export type DependableFuture = CallableFuture | ContractCall | Virtual; +export type DependableFuture = + | CallableFuture + | ContractCall + | Virtual + | ProxyFuture; export type ParameterFuture = RequiredParameter | OptionalParameter; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 286ee0ba54..2d7c81ce55 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,8 +1,13 @@ import { Subgraph } from "./deploymentGraph"; -import type { CallableFuture, FutureDict, Virtual } from "./future"; +import type { + CallableFuture, + FutureDict, + ProxyFuture, + Virtual, +} from "./future"; export interface ModuleDict extends FutureDict { - [key: string]: CallableFuture | Virtual; + [key: string]: CallableFuture | Virtual | ProxyFuture; } export type Module = Subgraph; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index bf9f99ac9a..6c57077e52 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -14,6 +14,7 @@ import type { DeploymentGraphFuture, RequiredParameter, Virtual, + ProxyFuture, } from "types/future"; import { Artifact } from "types/hardhat"; @@ -77,10 +78,15 @@ export function isDependable(possible: any): possible is DependableFuture { (possible.type === "call" || possible.type === "contract" || possible.type === "library" || - possible.type === "virtual") + possible.type === "virtual" || + possible.type === "proxy") ); } +export function isProxy(possible: any): possible is ProxyFuture { + return isFuture(possible) && possible.type === "proxy"; +} + export function isVirtual(possible: any): possible is Virtual { return isFuture(possible) && possible.type === "virtual"; } @@ -94,5 +100,9 @@ export function isParameter( export function isCallable( future: DeploymentGraphFuture ): future is CallableFuture { + if (isProxy(future)) { + return isCallable(future.value); + } + return future.type === "contract" || future.type === "library"; } diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/utils/proxy.ts new file mode 100644 index 0000000000..24c15f24c3 --- /dev/null +++ b/packages/core/src/utils/proxy.ts @@ -0,0 +1,28 @@ +import { + CallableFuture, + ContractCall, + DependableFuture, + Virtual, +} from "types/future"; + +import { isProxy } from "./guards"; + +export function resolveProxyDependency( + future: DependableFuture +): CallableFuture | ContractCall | Virtual { + if (isProxy(future)) { + return resolveProxyDependency(future.proxy); + } + + return future; +} + +export function resolveProxyValue( + future: DependableFuture +): CallableFuture | ContractCall | Virtual { + if (isProxy(future)) { + return resolveProxyValue(future.value); + } + + return future; +} diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index ae8774938f..24a2069b16 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -4,6 +4,7 @@ import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; import { CallableFuture } from "types/future"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { resolveProxyValue } from "utils/proxy"; export async function validateCall( vertex: CallDeploymentVertex, @@ -74,9 +75,11 @@ export async function validateCall( } async function resolveArtifactForCallableFuture( - future: CallableFuture, + givenFuture: CallableFuture, { services }: { services: Services } ): Promise { + const future = resolveProxyValue(givenFuture); + switch (future.type) { case "contract": switch (future.subtype) { @@ -104,11 +107,17 @@ async function resolveArtifactForCallableFuture( default: return assertNeverDeploymentFuture(future); } + case "virtual": + throw new Error(`Cannot call virtual future`); + case "call": + throw new Error(`Cannot call call future`); default: return assertNeverDeploymentFuture(future); } } function assertNeverDeploymentFuture(f: never): undefined { - throw new Error(`Unexpected deployment future type/subtype ${f}`); + throw new Error( + `Unexpected deployment future type/subtype ${JSON.stringify(f)}` + ); } diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index c8ab045761..8021e9ec02 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -11,6 +11,7 @@ import { ArtifactContract, CallableFuture, HardhatContract, + ProxyFuture, Virtual, } from "types/future"; import { Module } from "types/module"; @@ -132,7 +133,56 @@ describe("deployment builder - useModule", () => { assert.equal(depNode?.label, "Foo"); }); - it("should show one dependencies, on Foo for the virtual node of the module", () => { + it("should foo depending on the after virtual node of the TokenModule", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 2, label: "TokenModule:0::after", type: "" }, + ]); + }); + }); + + describe("depending on a contract within a module", () => { + before(() => { + const TokenModule = buildModule( + "TokenModule", + (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + + return { token }; + } + ); + + const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { + const { token } = m.useModule(TokenModule); + + const foo = m.contract("Foo", { after: [token] }); + + return { foo }; + }); + + const { graph } = generateDeploymentGraphFrom(WrapModule, { + chainId: 31, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); + + it("should show foo depending on the after virtual node of the TokenModule (magic of proxy)", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); if (depNode === undefined) { @@ -380,7 +430,7 @@ describe("deployment builder - useModule", () => { assert.equal(depNode?.label, "Bar"); }); - it("should show one dependencies, between Bar and Foo", () => { + it("should show one dependencies, between Bar and Middle module", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); if (depNode === undefined) { @@ -389,7 +439,9 @@ describe("deployment builder - useModule", () => { const deps = getDependenciesForVertex(deploymentGraph, depNode); - assert.deepStrictEqual(deps, [{ id: 2, label: "Foo", type: "" }]); + assert.deepStrictEqual(deps, [ + { id: 4, label: "Middle:0::after", type: "" }, + ]); }); }); @@ -439,7 +491,7 @@ describe("deployment builder - useModule", () => { describe("returning non contract/library futures from within a module", () => { let returnsWrongFutureTypeModule: Module<{ - token: CallableFuture | Virtual; + token: CallableFuture | Virtual | ProxyFuture; }>; before(() => { diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index a6a4b175a3..d5de81b36d 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -100,7 +100,7 @@ describe("useModule", function () { }); }); - describe("passing futures into and out of modules", () => { + describe("passing futures into and out of subgraphs", () => { it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); @@ -180,7 +180,7 @@ describe("useModule", function () { after: [secondCall], }); - return { secondCall }; + return {}; } ); @@ -301,4 +301,67 @@ describe("useModule", function () { ); }); }); + + describe("modules depending on other modules contracts", () => { + it("should execute all in a module before any that depends on a contract within the module", async function () { + await this.hre.run("compile", { quiet: true }); + + const firstSecondAndThirdModule = buildModule( + "SecondAndThirdCallModule", + (m) => { + const trace = m.contract("Trace", { + args: ["first"], + }); + + const secondCall = m.call(trace, "addEntry", { + args: ["second"], + }); + + m.call(trace, "addEntry", { + args: ["third"], + after: [secondCall], + }); + + return { trace }; + } + ); + + const fourthCallModule = buildModule("FourthCallModule", (m) => { + const { trace } = m.useModule(firstSecondAndThirdModule); + + m.call(trace, "addEntry", { + args: ["fourth"], + }); + + return { trace }; + }); + + const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const { trace } = m.useModule(fourthCallModule, {}); + + return { trace }; + }); + + const deployPromise = this.hre.ignition.deploy(userModule, { + parameters: {}, + ui: false, + }); + + await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); + + const result = await deployPromise; + + assert.isDefined(result); + + const entry1 = await result.trace.entries(0); + const entry2 = await result.trace.entries(1); + const entry3 = await result.trace.entries(2); + const entry4 = await result.trace.entries(3); + + assert.deepStrictEqual( + [entry1, entry2, entry3, entry4], + ["first", "second", "third", "fourth"] + ); + }); + }); }); From 91edb728245e6d969e0573e7d72712b8733bf8e4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 2 Nov 2022 02:03:08 -0400 Subject: [PATCH 0152/1302] added doc detailing resumability --- docs/resumability.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/resumability.md diff --git a/docs/resumability.md b/docs/resumability.md new file mode 100644 index 0000000000..dd1a73e301 --- /dev/null +++ b/docs/resumability.md @@ -0,0 +1,11 @@ +# Deployment Resumability (implementation TBD) + +Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? + +Broadly speaking, if some part of the deployment fails, the user will be able to retry it, or to modify the failing action. With the help of an internal journaling service, successfully completed transactions would not be run a second time when resuming a partially failed deployment. + +Similarly, a user with a deployment that is considered "on hold" and awaiting the completion of an external action of some kind (multisig wallet signatures, as an example) would be able to close the running **Ignition** process and resume the deployment safely whenever they choose without worrying about the previous actions being resolved again. + +For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. + +The exact nature of these files is TBD as this feature is being developed. From 32cfcb6cdaea59130400d93ca354644075236155 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 3 Nov 2022 22:22:35 -0400 Subject: [PATCH 0153/1302] added address display for successful deployments --- .../ui/components/execution/AddressResults.tsx | 16 ++++++++++++++++ .../ui/components/execution/FinalStatus.tsx | 18 +++++++++++++++++- packages/hardhat-plugin/src/ui/types.ts | 4 ++++ 3 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx new file mode 100644 index 0000000000..09926bd573 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -0,0 +1,16 @@ +import { Box, Text } from "ink"; + +import { AddressMap } from "ui/types"; + +export const AddressResults = ({ addressMap }: { addressMap: AddressMap }) => { + return ( + + Deployed Addresses: + {...Object.entries(addressMap).map(([label, address]) => ( + + {label} {`->`} {address} + + ))} + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index fe0d39fbe5..a872d99264 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,12 +1,25 @@ import { DeployState, ExecutionVertex } from "@ignored/ignition-core"; import { Box, Text } from "ink"; -import { DeploymentError } from "../../types"; +import { DeploymentError, AddressMap } from "ui/types"; +import { AddressResults } from "./AddressResults"; import { Divider } from "./Divider"; export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { if (deployState.phase === "complete") { + const addressMap: AddressMap = {}; + for (const value of deployState.execution.resultsAccumulator.values()) { + if ( + value !== null && + value._kind === "success" && + "name" in value.result && + "address" in value.result + ) { + addressMap[value.result.name] = value.result.address; + } + } + return ( @@ -14,6 +27,9 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { 🚀 Deployment Complete for module{" "} {deployState.details.moduleName} + + + ); } diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 259be9cad8..772f9e2c6f 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -178,6 +178,10 @@ export class DeploymentState { } } +export interface AddressMap { + [label: string]: string; +} + function assertNeverUiVertexType(type: never): string { throw new Error(`Unexpected ui vertex type ${type}`); } From d870880b7875aa003d17b41cdcaa8d1cfcc7489d Mon Sep 17 00:00:00 2001 From: morgansliman Date: Sun, 6 Nov 2022 19:31:36 -0500 Subject: [PATCH 0154/1302] added user validation for buildModule --- packages/core/src/dsl/buildModule.ts | 16 ++++++++++ packages/core/test/buildModule.ts | 48 ++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 packages/core/test/buildModule.ts diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index c56859433a..d031c66c76 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,12 +1,28 @@ import type { IDeploymentBuilder } from "types/deploymentGraph"; import type { Module, ModuleDict } from "types/module"; +import { IgnitionError } from "utils/errors"; export function buildModule( moduleName: string, moduleAction: (m: IDeploymentBuilder) => T ): Module { + assertValidModuleName(moduleName); + assertValidModuleAction(moduleAction); + return { name: moduleName, action: moduleAction, }; } + +function assertValidModuleName(moduleName: any) { + if (typeof moduleName !== "string") { + throw new IgnitionError("buildModule: `moduleName` must be a string"); + } +} + +function assertValidModuleAction(moduleAction: any) { + if (typeof moduleAction !== "function") { + throw new IgnitionError("buildModule: `moduleAction` must be a function"); + } +} diff --git a/packages/core/test/buildModule.ts b/packages/core/test/buildModule.ts new file mode 100644 index 0000000000..ad59bc405b --- /dev/null +++ b/packages/core/test/buildModule.ts @@ -0,0 +1,48 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; + +describe("buildModule", () => { + const values = [ + [42, "number"], + ["thanks for all the fish", "string"], + [{}, "object"], + [[], "object"], + [() => {}, "function"], + [undefined, "undefined"], + [null, "null"], + ]; + + describe("param validation", () => { + it("should only allow a string to be passed as `moduleName`", () => { + for (const [value, type] of values) { + if (type === "string") { + // @ts-ignore + assert.doesNotThrow(() => buildModule(value, () => {})); + } else { + assert.throws( + // @ts-ignore + () => buildModule(value, () => {}), + /buildModule: `moduleName` must be a string/ + ); + } + } + }); + + it("should only allow a function to be passed as `moduleAction`", () => { + for (const [value, type] of values) { + if (type === "function") { + // @ts-ignore + assert.doesNotThrow(() => buildModule("", value)); + } else { + assert.throws( + // @ts-ignore + () => buildModule("", value), + /buildModule: `moduleAction` must be a function/ + ); + } + } + }); + }); +}); From 654bc6c25d29e75a0eec0b59d589500e7628a05f Mon Sep 17 00:00:00 2001 From: morgansliman Date: Sun, 6 Nov 2022 19:04:52 -0500 Subject: [PATCH 0155/1302] added ability to send eth with deploy/call --- packages/core/src/dsl/DeploymentBuilder.ts | 15 ++++++++------- .../execution/dispatch/executeContractCall.ts | 5 +++-- .../dispatch/executeContractDeploy.ts | 7 +++++-- ...onvertDeploymentVertexToExecutionVertex.ts | 4 +++- packages/core/src/types/deploymentGraph.ts | 19 +++++++++++++------ packages/core/src/types/executionGraph.ts | 4 ++++ packages/core/test/execution.ts | 2 ++ 7 files changed, 38 insertions(+), 18 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 99ab30e66f..3ef8aebe46 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -1,7 +1,9 @@ +import { ethers } from "ethers"; import hash from "object-hash"; import { addEdge, ensureVertex } from "graph/adjacencyList"; import { + CallOptions, ContractOptions, InternalParamValue, IDeploymentGraph, @@ -43,6 +45,8 @@ import { resolveProxyDependency } from "utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; +const DEFAULT_VALUE = ethers.utils.parseUnits("0"); + export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; public graph: IDeploymentGraph = new DeploymentGraph(); @@ -137,6 +141,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { libraries: options?.libraries ?? {}, scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], + value: options?.value ?? DEFAULT_VALUE, }); return artifactContractFuture; @@ -161,6 +166,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { libraries: options?.libraries ?? {}, scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], + value: options?.value ?? DEFAULT_VALUE, }); return contractFuture; @@ -198,13 +204,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public call( contractFuture: DeploymentGraphFuture, functionName: string, - { - args, - after, - }: { - args: Array; - after?: DeploymentGraphFuture[]; - } + { args, after, value }: CallOptions ): ContractCall { const callFuture: ContractCall = { vertexId: this._resolveNextId(), @@ -249,6 +249,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { args: args ?? [], after: after ?? [], scopeAdded: this.scopes.getScopedLabel(), + value: value ?? DEFAULT_VALUE, }); return callFuture; diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 9e59153108..8aeba0f100 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -7,7 +7,7 @@ import { VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( - { method, contract, args }: ContractCall, + { method, contract, args, value }: ContractCall, resultAccumulator: Map, { services }: { services: Services } ): Promise { @@ -22,7 +22,8 @@ export async function executeContractCall( const contractInstance = new Contract(address, abi); const unsignedTx = await contractInstance.populateTransaction[method]( - ...resolvedArgs + ...resolvedArgs, + { value } ); txHash = await services.contracts.sendTx(unsignedTx); } catch (err) { diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 556ada26e6..926c3b90b2 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -8,7 +8,7 @@ import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( - { artifact, args, libraries }: ContractDeploy, + { artifact, args, libraries, value }: ContractDeploy, resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { @@ -31,7 +31,9 @@ export async function executeContractDeploy( const Factory = new ContractFactory(artifact.abi, linkedByteCode); - const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); + const deployTransaction = Factory.getDeployTransaction(...resolvedArgs, { + value, + }); const txHash = await services.contracts.sendTx(deployTransaction); @@ -44,6 +46,7 @@ export async function executeContractDeploy( abi: artifact.abi, bytecode: artifact.bytecode, address: receipt.contractAddress, + value, }, }; } catch (err) { diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 0e553db448..3fddd53e5f 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -77,6 +77,7 @@ async function convertHardhatContractToContractDeploy( artifact, args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, + value: vertex.value, }; } @@ -91,6 +92,7 @@ async function convertArtifactContractToContractDeploy( artifact: vertex.artifact, args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, + value: vertex.value, }; } @@ -115,10 +117,10 @@ async function convertCallToContractCall( type: "ContractCall", id: vertex.id, label: vertex.label, - contract: await resolveParameter(vertex.contract, transformContext), method: vertex.method, args: await convertArgs(vertex.args, transformContext), + value: vertex.value, }; } diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 885dd747e4..c6c8b35a21 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -1,3 +1,5 @@ +import type { BigNumber } from "ethers"; + import { ArtifactContract, ArtifactLibrary, @@ -56,6 +58,7 @@ export interface HardhatContractDeploymentVertex extends VertexDescriptor { args: InternalParamValue[]; libraries: LibraryMap; after: DeploymentGraphFuture[]; + value: BigNumber; } export interface ArtifactContractDeploymentVertex extends VertexDescriptor { @@ -65,6 +68,7 @@ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { args: InternalParamValue[]; libraries: LibraryMap; after: DeploymentGraphFuture[]; + value: BigNumber; } export interface DeployedContractDeploymentVertex extends VertexDescriptor { @@ -98,6 +102,7 @@ export interface CallDeploymentVertex extends VertexDescriptor { method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; + value: BigNumber; } export interface VirtualVertex extends VertexDescriptor { @@ -112,6 +117,13 @@ export interface ContractOptions { [key: string]: DeploymentGraphFuture; }; after?: DeploymentGraphFuture[]; + value?: BigNumber; +} + +export interface CallOptions { + args: InternalParamValue[]; + after?: DeploymentGraphFuture[]; + value?: BigNumber; } export interface UseSubgraphOptions { @@ -145,12 +157,7 @@ export interface IDeploymentBuilder { call: ( contractFuture: DeploymentGraphFuture, functionName: string, - { - args, - }: { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; - } + options: CallOptions ) => ContractCall; getParam: (paramName: string) => RequiredParameter; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index de46a95495..0eba838d7a 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,3 +1,5 @@ +import type { BigNumber } from "ethers"; + import { LibraryMap } from "./deploymentGraph"; import { DeploymentGraphFuture } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; @@ -28,6 +30,7 @@ export interface ContractDeploy extends VertexDescriptor { artifact: Artifact; args: ArgValue[]; libraries: LibraryMap; + value: BigNumber; } export interface DeployedContract extends VertexDescriptor { @@ -47,4 +50,5 @@ export interface ContractCall extends VertexDescriptor { contract: any; method: string; args: ArgValue[]; + value: BigNumber; } diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index c9067a1243..f9e6f0436f 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -34,6 +34,7 @@ describe("Execution", () => { artifact: fakeArtifact, args: [], libraries: {}, + value: ethers.utils.parseUnits("0"), }; const mockServices = { @@ -74,6 +75,7 @@ describe("Execution", () => { address: "0xAddr", bytecode: fakeArtifact.bytecode, name: "Foo", + value: ethers.utils.parseUnits("0"), }, }); }); From 1bcdfd7b6ab830cd9beffef71eeec78198ab40f4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 7 Nov 2022 19:22:42 -0500 Subject: [PATCH 0156/1302] ensure value is BigNumber --- packages/core/src/dsl/DeploymentBuilder.ts | 6 +++++- packages/core/src/dsl/buildModule.ts | 18 +++--------------- packages/core/src/utils/errors.ts | 21 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 3ef8aebe46..aac41ae9ba 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -33,7 +33,7 @@ import type { } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; -import { IgnitionError } from "utils/errors"; +import { IgnitionError, assertBigNumberParam } from "utils/errors"; import { isArtifact, isCallable, @@ -123,6 +123,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { const artifact = artifactOrOptions; const options: ContractOptions | undefined = givenOptions; + assertBigNumberParam(options?.value, "value"); + const artifactContractFuture: ArtifactContract = { vertexId: this._resolveNextId(), label: contractName, @@ -206,6 +208,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { functionName: string, { args, after, value }: CallOptions ): ContractCall { + assertBigNumberParam(value, "value"); + const callFuture: ContractCall = { vertexId: this._resolveNextId(), label: `${contractFuture.label}/${functionName}`, diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index d031c66c76..2187b2ab2e 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,28 +1,16 @@ import type { IDeploymentBuilder } from "types/deploymentGraph"; import type { Module, ModuleDict } from "types/module"; -import { IgnitionError } from "utils/errors"; +import { assertStringParam, assertFunctionParam } from "utils/errors"; export function buildModule( moduleName: string, moduleAction: (m: IDeploymentBuilder) => T ): Module { - assertValidModuleName(moduleName); - assertValidModuleAction(moduleAction); + assertStringParam(moduleName, "moduleName"); + assertFunctionParam(moduleAction, "moduleAction"); return { name: moduleName, action: moduleAction, }; } - -function assertValidModuleName(moduleName: any) { - if (typeof moduleName !== "string") { - throw new IgnitionError("buildModule: `moduleName` must be a string"); - } -} - -function assertValidModuleAction(moduleAction: any) { - if (typeof moduleAction !== "function") { - throw new IgnitionError("buildModule: `moduleAction` must be a function"); - } -} diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index c3a74207d6..44141875e0 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,3 +1,4 @@ +import { BigNumber } from "ethers"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; export class IgnitionError extends NomicLabsHardhatPluginError { @@ -5,3 +6,23 @@ export class IgnitionError extends NomicLabsHardhatPluginError { super("ignition", message); } } + +export function assertStringParam(param: any, paramName: string) { + if (typeof param !== "string") { + throw new IgnitionError(`\`${paramName}\` must be a string`); + } +} + +export function assertFunctionParam(param: any, paramName: string) { + if (typeof param !== "function") { + throw new IgnitionError(`\`${paramName}\` must be a function`); + } +} + +export function assertBigNumberParam(param: any, paramName: string) { + if (param !== undefined) { + if (!BigNumber.isBigNumber(param)) { + throw new IgnitionError(`\`${paramName}\` must be a BigNumber`); + } + } +} From 41d1b9a9b5b0efbf751e354aef393b09ab9a3b14 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 7 Nov 2022 20:34:09 -0500 Subject: [PATCH 0157/1302] added tests for value functionality --- packages/core/src/dsl/DeploymentBuilder.ts | 2 + packages/core/test/buildModule.ts | 4 +- packages/core/test/deploymentBuilder/value.ts | 179 ++++++++++++++++++ 3 files changed, 183 insertions(+), 2 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/value.ts diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index aac41ae9ba..8af486fb40 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -150,6 +150,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { } else { const options: ContractOptions | undefined = artifactOrOptions; + assertBigNumberParam(options?.value, "value"); + const contractFuture: HardhatContract = { vertexId: this._resolveNextId(), label: contractName, diff --git a/packages/core/test/buildModule.ts b/packages/core/test/buildModule.ts index ad59bc405b..dc76da2402 100644 --- a/packages/core/test/buildModule.ts +++ b/packages/core/test/buildModule.ts @@ -24,7 +24,7 @@ describe("buildModule", () => { assert.throws( // @ts-ignore () => buildModule(value, () => {}), - /buildModule: `moduleName` must be a string/ + /`moduleName` must be a string/ ); } } @@ -39,7 +39,7 @@ describe("buildModule", () => { assert.throws( // @ts-ignore () => buildModule("", value), - /buildModule: `moduleAction` must be a function/ + /`moduleAction` must be a function/ ); } } diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts new file mode 100644 index 0000000000..5e634c3ae2 --- /dev/null +++ b/packages/core/test/deploymentBuilder/value.ts @@ -0,0 +1,179 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { ethers } from "ethers"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, + HardhatContractDeploymentVertex, + CallDeploymentVertex, + ArtifactContractDeploymentVertex, +} from "types/deploymentGraph"; +import type { Artifact } from "types/hardhat"; + +import { getDeploymentVertexByLabel } from "./helpers"; + +function isHardhatContract(d: { + type: string; +}): d is HardhatContractDeploymentVertex { + return d.type === "HardhatContract"; +} + +function isHardhatCall(d: { type: string }): d is CallDeploymentVertex { + return d.type === "Call"; +} + +function isHardhatArtifact(d: { + type: string; +}): d is ArtifactContractDeploymentVertex { + return d.type === "ArtifactContract"; +} + +describe("deployment builder - value", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange", { + value: ethers.utils.parseUnits("42"), + }); + + m.call(exchange, "addToken", { + args: [token], + value: ethers.utils.parseUnits("10"), + }); + + const foo = m.contract("Foo", artifact, { + args: [0], + value: ethers.utils.parseUnits("3"), + }); + + return { foo }; + }); + + const { graph } = generateDeploymentGraphFrom(callModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should default to zero value if not given a value parameter", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + assert.isDefined(depNode); + if (!isHardhatContract(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("0").toString() + ); + }); + + it("should deploy with a given value - contract", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + assert.isDefined(depNode); + if (!isHardhatContract(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("42").toString() + ); + }); + + it("should deploy with a given value - call", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + assert.isDefined(depNode); + if (!isHardhatCall(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("10").toString() + ); + }); + + it("should deploy with a given value - artifact", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); + + assert.isDefined(depNode); + if (!isHardhatArtifact(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("3").toString() + ); + }); + + it("should throw if given a value that is not a BigNumber - contract", () => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + // @ts-ignore + const token = m.contract("Token", { value: "42" }); + + return { token }; + }); + + assert.throws( + () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); + }); + + it("should throw if given a value that is not a BigNumber - call", () => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); + + m.call(exchange, "addToken", { + args: [token], + // @ts-ignore + value: 10, + }); + + return {}; + }); + + assert.throws( + () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); + }); + + it("should throw if given a value that is not a BigNumber - call", () => { + const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + + const fromArtifactModule = buildModule( + "FromArtifact", + (m: IDeploymentBuilder) => { + const foo = m.contract("Foo", artifact, { + args: [0], + value: null, + }); + + return { foo }; + } + ); + + assert.throws( + () => generateDeploymentGraphFrom(fromArtifactModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); + }); +}); From 85a93ddb6585d600b1bbb462386b335c6b3053d4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 8 Nov 2022 12:45:48 -0500 Subject: [PATCH 0158/1302] cleanup to address comments --- packages/core/test/deploymentBuilder/value.ts | 181 ++++++++---------- 1 file changed, 85 insertions(+), 96 deletions(-) diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 5e634c3ae2..fca41be4cc 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -7,30 +7,12 @@ import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom import type { IDeploymentGraph, IDeploymentBuilder, - HardhatContractDeploymentVertex, - CallDeploymentVertex, - ArtifactContractDeploymentVertex, } from "types/deploymentGraph"; import type { Artifact } from "types/hardhat"; +import { isArtifactContract, isHardhatContract, isCall } from "utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; -function isHardhatContract(d: { - type: string; -}): d is HardhatContractDeploymentVertex { - return d.type === "HardhatContract"; -} - -function isHardhatCall(d: { type: string }): d is CallDeploymentVertex { - return d.type === "Call"; -} - -function isHardhatArtifact(d: { - type: string; -}): d is ArtifactContractDeploymentVertex { - return d.type === "ArtifactContract"; -} - describe("deployment builder - value", () => { let deploymentGraph: IDeploymentGraph; @@ -77,103 +59,110 @@ describe("deployment builder - value", () => { ); }); - it("should deploy with a given value - contract", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + describe("contract", () => { + it("should deploy with a given value", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - assert.isDefined(depNode); - if (!isHardhatContract(depNode)) { - return assert.fail("unknown error"); - } + assert.isDefined(depNode); + if (!isHardhatContract(depNode)) { + return assert.fail("unknown error"); + } - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("42").toString() - ); - }); + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("42").toString() + ); + }); - it("should deploy with a given value - call", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); + it("should throw if given a value that is not a BigNumber", () => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + // @ts-ignore + const token = m.contract("Token", { value: "42" }); - assert.isDefined(depNode); - if (!isHardhatCall(depNode)) { - return assert.fail("unknown error"); - } + return { token }; + }); - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("10").toString() - ); + assert.throws( + () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); + }); }); - it("should deploy with a given value - artifact", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - if (!isHardhatArtifact(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("3").toString() - ); - }); + describe("call", () => { + it("should deploy with a given value", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); - it("should throw if given a value that is not a BigNumber - contract", () => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - // @ts-ignore - const token = m.contract("Token", { value: "42" }); + assert.isDefined(depNode); + if (!isCall(depNode)) { + return assert.fail("unknown error"); + } - return { token }; + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("10").toString() + ); }); - assert.throws( - () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); - }); + it("should throw if given a value that is not a BigNumber", () => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); - it("should throw if given a value that is not a BigNumber - call", () => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); + m.call(exchange, "addToken", { + args: [token], + // @ts-ignore + value: 10, + }); - m.call(exchange, "addToken", { - args: [token], - // @ts-ignore - value: 10, + return {}; }); - return {}; + assert.throws( + () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); }); - - assert.throws( - () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); }); - it("should throw if given a value that is not a BigNumber - call", () => { - const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + describe("artifact", () => { + it("should deploy with a given value", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - const fromArtifactModule = buildModule( - "FromArtifact", - (m: IDeploymentBuilder) => { - const foo = m.contract("Foo", artifact, { - args: [0], - value: null, - }); - - return { foo }; + assert.isDefined(depNode); + if (!isArtifactContract(depNode)) { + return assert.fail("unknown error"); } - ); - assert.throws( - () => generateDeploymentGraphFrom(fromArtifactModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); + assert.equal( + depNode.value.toString(), + ethers.utils.parseUnits("3").toString() + ); + }); + + it("should throw if given a value that is not a BigNumber", () => { + const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + + const fromArtifactModule = buildModule( + "FromArtifact", + (m: IDeploymentBuilder) => { + const foo = m.contract("Foo", artifact, { + args: [0], + value: null, + }); + + return { foo }; + } + ); + + assert.throws( + () => + generateDeploymentGraphFrom(fromArtifactModule, { chainId: 31337 }), + /`value` must be a BigNumber/ + ); + }); }); }); From e1ce7f7f9edb218b9135ad18b07b03e145a9f582 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 9 Nov 2022 13:46:43 +0000 Subject: [PATCH 0159/1302] chore: bump versions to v0.0.3 --- packages/core/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 3aa88979b0..171d385165 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 7867cd9deb..b6d9c420d4 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.2", + "version": "0.0.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", From 1f8851972f640615bf7cd8bc8168c1b5055bc7fd Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 8 Nov 2022 13:54:19 -0500 Subject: [PATCH 0160/1302] added network info to cli ui --- packages/core/src/Ignition.ts | 3 +++ packages/core/src/deployment/Deployment.ts | 8 ++++++++ .../core/src/deployment/deployStateReducer.ts | 10 ++++++++++ packages/core/src/types/deployment.ts | 11 +++++++---- packages/hardhat-plugin/src/ignition-wrapper.ts | 9 +++++++-- packages/hardhat-plugin/src/index.ts | 6 +++++- .../src/ui/components/execution/FinalStatus.tsx | 8 ++++++++ .../src/ui/components/execution/NetworkInfo.tsx | 16 ++++++++++++++++ .../ui/components/execution/SummarySection.tsx | 7 +++++-- 9 files changed, 69 insertions(+), 9 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 89befb9f9c..5d48fb0b2b 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -24,6 +24,7 @@ const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { pathToJournal: string | undefined; txPollingInterval: number; + networkName: string; ui?: UpdateUiAction; } @@ -42,6 +43,7 @@ export class Ignition { pathToJournal: undefined, txPollingInterval: 300, ui: undefined, + networkName: "", ...givenOptions, }; @@ -53,6 +55,7 @@ export class Ignition { const chainId = await this._getChainId(); deployment.setChainId(chainId); + deployment.setNetworkName(options.networkName); const { result: constructResult, moduleOutputs } = await this._constructExecutionGraphFrom(deployment, ignitionModule); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 3d5c96496b..abce7f2d96 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -63,6 +63,14 @@ export class Deployment { }); } + public setNetworkName(networkName: string) { + log("NetworkName resolved as '%s'", networkName); + this.state = deployStateReducer(this.state, { + type: "SET_NETWORK_NAME", + networkName, + }); + } + public startValidation() { log("Validate deployment graph"); this.state = deployStateReducer(this.state, { diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index e0ebc3db48..87aed8e023 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -10,6 +10,7 @@ export function initializeDeployState(moduleName: string): DeployState { details: { moduleName, chainId: 0, + networkName: "", }, validation: { errors: [], @@ -57,6 +58,7 @@ export function deployStateReducer( state: DeployState, action: | { type: "SET_CHAIN_ID"; chainId: number } + | { type: "SET_NETWORK_NAME"; networkName: string } | { type: "START_VALIDATION"; } @@ -95,6 +97,14 @@ export function deployStateReducer( chainId: action.chainId, }, }; + case "SET_NETWORK_NAME": + return { + ...state, + details: { + ...state.details, + networkName: action.networkName, + }, + }; case "START_VALIDATION": return { ...state, diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index d6f9c03a51..73dcbad29f 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -45,12 +45,15 @@ export interface ExecutionState { resultsAccumulator: ResultsAccumulator; } +export interface DeployNetworkConfig { + moduleName: string; + chainId: number; + networkName: string; +} + export interface DeployState { phase: DeployPhase; - details: { - moduleName: string; - chainId: number; - }; + details: DeployNetworkConfig; validation: ValidationState; transform: { executionGraph: ExecutionGraph | null; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index f2329b1c21..61bdec7dfe 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -20,7 +20,7 @@ export class IgnitionWrapper { private _ethers: HardhatEthers, private _deployOptions: Omit< IgnitionDeployOptions, - keyof { ui?: boolean } + keyof { ui?: boolean; networkName: string } > & { ui?: boolean } ) { this._ignition = new Ignition(_providers); @@ -29,7 +29,11 @@ export class IgnitionWrapper { public async deploy( ignitionModule: Module, deployParams: - | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean } + | { + parameters: { [key: string]: ExternalParamValue }; + ui?: boolean; + networkName: string; + } | undefined ) { const showUi = deployParams?.ui ?? true; @@ -41,6 +45,7 @@ export class IgnitionWrapper { const [deploymentResult] = await this._ignition.deploy(ignitionModule, { ...this._deployOptions, ui: Boolean(deployParams?.ui) ? renderToCli : undefined, + networkName: deployParams?.networkName ?? "", }); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 419df1fe6b..982e587a60 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -138,7 +138,11 @@ task("deploy") process.exit(0); } - await hre.ignition.deploy(userModules[0], { parameters, ui: true }); + await hre.ignition.deploy(userModules[0], { + parameters, + ui: true, + networkName: hre.network.name, + }); } ); diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index a872d99264..e77c8c0197 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -5,6 +5,7 @@ import { DeploymentError, AddressMap } from "ui/types"; import { AddressResults } from "./AddressResults"; import { Divider } from "./Divider"; +import { NetworkInfo } from "./NetworkInfo"; export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { if (deployState.phase === "complete") { @@ -20,6 +21,11 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { } } + const networkInfo = { + chainId: deployState.details.chainId, + networkName: deployState.details.networkName, + }; + return ( @@ -28,6 +34,8 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { {deployState.details.moduleName} + + diff --git a/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx b/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx new file mode 100644 index 0000000000..32b069fa8a --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx @@ -0,0 +1,16 @@ +import { Text } from "ink"; + +export const NetworkInfo = ({ + networkInfo: { chainId, networkName }, +}: { + networkInfo: { + chainId: number; + networkName: string; + }; +}) => { + return ( + + Network: {networkName} ({chainId}) + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 5d9b0c87dc..93533d72b0 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,18 +1,21 @@ import { DeployState } from "@ignored/ignition-core"; import { Box, Text } from "ink"; +import { NetworkInfo } from "./NetworkInfo"; + export const SummarySection = ({ deployState: { - details: { moduleName }, + details: { moduleName, ...networkInfo }, }, }: { deployState: DeployState; }) => { return ( - + Deploying module {moduleName} + ); }; From 3364630ab49539e45c2b93d492da77c5a9d07c95 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 9 Nov 2022 10:46:59 +0000 Subject: [PATCH 0161/1302] feat(cli): move network info to align right --- .../components/execution/AddressResults.tsx | 19 ++++++++++++++++--- .../ui/components/execution/FinalStatus.tsx | 9 ++++----- .../components/execution/SummarySection.tsx | 5 +++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 09926bd573..5c5d2a41d2 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,11 +1,24 @@ -import { Box, Text } from "ink"; +import { Box, Spacer, Text } from "ink"; import { AddressMap } from "ui/types"; -export const AddressResults = ({ addressMap }: { addressMap: AddressMap }) => { +import { NetworkInfo } from "./NetworkInfo"; + +export const AddressResults = ({ + addressMap, + networkInfo, +}: { + addressMap: AddressMap; + networkInfo: { chainId: number; networkName: string }; +}) => { return ( - Deployed Addresses: + + Deployed Addresses + + + + {...Object.entries(addressMap).map(([label, address]) => ( {label} {`->`} {address} diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index e77c8c0197..f74191e25c 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -5,11 +5,11 @@ import { DeploymentError, AddressMap } from "ui/types"; import { AddressResults } from "./AddressResults"; import { Divider } from "./Divider"; -import { NetworkInfo } from "./NetworkInfo"; export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { if (deployState.phase === "complete") { const addressMap: AddressMap = {}; + for (const value of deployState.execution.resultsAccumulator.values()) { if ( value !== null && @@ -29,15 +29,14 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { return ( + 🚀 Deployment Complete for module{" "} {deployState.details.moduleName} + - - - - + ); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 93533d72b0..5081728319 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,5 +1,5 @@ import { DeployState } from "@ignored/ignition-core"; -import { Box, Text } from "ink"; +import { Box, Text, Spacer } from "ink"; import { NetworkInfo } from "./NetworkInfo"; @@ -11,10 +11,11 @@ export const SummarySection = ({ deployState: DeployState; }) => { return ( - + Deploying module {moduleName} + ); From 527998e57b77a499c12892a85b9042ac0b4ce398 Mon Sep 17 00:00:00 2001 From: Morgan Date: Wed, 9 Nov 2022 11:16:40 -0500 Subject: [PATCH 0162/1302] Restore newline --- .../hardhat-plugin/src/ui/components/execution/FinalStatus.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index f74191e25c..53b915ad8c 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -37,6 +37,7 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { + ); } From 70e00aeb9a27515a8ff9cb365222533baaf382e3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 9 Nov 2022 16:36:15 +0000 Subject: [PATCH 0163/1302] chore: bump versions in dependent files --- examples/ens/package.json | 2 +- examples/simple/package.json | 2 +- packages/hardhat-plugin/package.json | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/ens/package.json b/examples/ens/package.json index 7273db9731..c160428998 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.2" + "@ignored/hardhat-ignition": "^0.0.3" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/simple/package.json b/examples/simple/package.json index ad9b08c75b..12b278e0a1 100644 --- a/examples/simple/package.json +++ b/examples/simple/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.0.2", - "@ignored/hardhat-ignition": "^0.0.2" + "@ignored/hardhat-ignition": "^0.0.3" }, "devDependencies": { "hardhat": "^2.10.0" diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index b6d9c420d4..b2f95c231f 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@ignored/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", @@ -65,7 +65,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.10.0" }, From 4e28907bee1dc8ddb0943551b5a8378bd9dc65e9 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 9 Nov 2022 11:39:08 -0500 Subject: [PATCH 0164/1302] version bump for core --- packages/hardhat-plugin/package.json | 4 ++-- yarn.lock | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index b6d9c420d4..b2f95c231f 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -33,7 +33,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@ignored/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", @@ -65,7 +65,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.2", + "@ignored/ignition-core": "^0.0.3", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.10.0" }, diff --git a/yarn.lock b/yarn.lock index 65e0da8de1..e8fa2df024 100644 --- a/yarn.lock +++ b/yarn.lock @@ -690,6 +690,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@ignored/hardhat-ignition@^0.0.2": + version "0.0.2" + resolved "https://registry.yarnpkg.com/@ignored/hardhat-ignition/-/hardhat-ignition-0.0.2.tgz#01a7e5c46c62af85162e6270a2ad6e5be8405d40" + integrity sha512-ST32uHMJM7hmB7p6LsrEBmL2KB4TjgEBhwtpCoampBXwInp0N95yq2SV6jwnDM2qZM5ZxgujfV7iqQGdHSXpiQ== + dependencies: + debug "^4.3.2" + ethers "^5.4.7" + fs-extra "^10.0.0" + ink "3.2.0" + ink-spinner "4.0.3" + react "18.2.0" + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" From 2ca0fba7ae68132e7050618721aadfa852074b27 Mon Sep 17 00:00:00 2001 From: Morgan Date: Mon, 14 Nov 2022 05:59:28 -0500 Subject: [PATCH 0165/1302] Config Upgrade (#63) Added user config passthrough for maxRetries and gasIncrementPerRetry as config options. They can be set in the `hardhat.config.{js,ts}` --- docs/configuration.md | 39 +++++++++++ docs/creating-modules-for-deployment.md | 27 ++++++++ packages/core/src/Ignition.ts | 20 +++--- packages/core/src/execution/batch/types.ts | 4 +- .../src/execution/batch/visitInBatches.ts | 12 ++-- .../execution/dispatch/executeContractCall.ts | 6 +- .../dispatch/executeContractDeploy.ts | 6 +- .../dispatch/executeLibraryDeploy.ts | 6 +- .../execution/dispatch/executionDispatch.ts | 4 +- packages/core/src/execution/execute.ts | 13 ++-- .../core/src/services/ContractsService.ts | 28 +++++--- packages/core/src/services/types.ts | 2 + packages/core/src/types/deployment.ts | 13 ++++ packages/core/test/contractsService.ts | 5 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +-- packages/hardhat-plugin/src/index.ts | 62 ++++++++++------- .../hardhat-plugin/src/type-extensions.ts | 10 +++ packages/hardhat-plugin/test/config.ts | 69 +++++++++++++++++++ .../with-config/contracts/Contracts.sol | 49 +++++++++++++ .../with-config/contracts/Trace.sol | 14 ++++ .../with-config/contracts/WithLibrary.sol | 18 +++++ .../with-config/hardhat.config.js | 17 +++++ .../with-config/ignition/MyModule.js | 15 ++++ yarn.lock | 12 ---- 24 files changed, 376 insertions(+), 83 deletions(-) create mode 100644 docs/configuration.md create mode 100644 packages/hardhat-plugin/test/config.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000000..ff3cc168f1 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,39 @@ +[going to leave this doc for future reference since some things need to be circled back to] + +Config options: + +Global config: + +- maxRetries: number +- gasIncrementPerRetry: BigNumber + - Increments gasPrice if legacy tx + - Increments maxPriorityFeePerGas otherwise + - ** proposal ** currently incrementing maxFeePerGas as well, but maybe should remove that. + - ?? Can we even send London style tx’s currently? +- gasLimit: BigNumber +- gasPrice: BigNumber +- OR +- maxFeePerGas: BigNumber +- maxPriorityFeePerGas: BigNumber +- - +- interactive: boolean + - Allows user to confirm each tx before it’s sent + - Probably a later feature +- noCompile: boolean + - Allow user to deploy without running compilation task first? +- ui: boolean + - Allow user to deploy without the cli ui? + - If we add this, we still need to add cli output of the new addresses +- Freeze: boolean + - Lets user “freeze” a deployed module according to resumability rules (see resumability doc - much still TBD) + - Requires journaling + +Per-tx config: + +- gasLimit: BigNumber +- gasPrice: BigNumber +- OR +- maxFeePerGas: BigNumber +- maxPriorityFeePerGas: BigNumber +- ** should not be able to mix and match legacy and London tx fields ** +- ** per-tx config takes precedence if given ** diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index c5ed17db1e..c5a1dcb78e 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -243,6 +243,33 @@ Calls to `useModule` memoize the results object, assuming the same parameters ar Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). +## Global Configuration + +There are currently two configurable options you can add to your `hardhat.config.js` file in order to adjust the way **Ignition** functions: + +```typescript +interface IgnitionConfig { + maxRetries: number; + gasIncrementPerRetry: BigNumber | null; +} + +// example inside hardhat.config.js +const { ethers } = require('ethers'); + +module.exports = { + ignition: { + maxRetries: 10, + gasIncrementPerRetry: ethers.utils.parseUnits('0.001'); + } +} +``` + +These config values control how **Ignition** retries unconfirmed transactions that are taking too long to confirm. + +The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) + +The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. + Next, let's take a look at another way to visualize your deployments: [Visualizing your deployment](./visualizing-your-deployment.md) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 5d48fb0b2b..16b039f8ff 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,4 +1,5 @@ import setupDebug from "debug"; +import { BigNumber } from "ethers"; import { Deployment } from "deployment/Deployment"; import { execute } from "execution/execute"; @@ -24,8 +25,10 @@ const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { pathToJournal: string | undefined; txPollingInterval: number; - networkName: string; ui?: UpdateUiAction; + networkName: string; + maxRetries: number; + gasIncrementPerRetry: BigNumber | null; } type ModuleOutputs = Record; @@ -35,18 +38,10 @@ export class Ignition { public async deploy( ignitionModule: Module, - givenOptions?: IgnitionDeployOptions + options: IgnitionDeployOptions ): Promise<[DeploymentResult, ModuleOutputs]> { log(`Start deploy`); - const options = { - pathToJournal: undefined, - txPollingInterval: 300, - ui: undefined, - networkName: "", - ...givenOptions, - }; - const deployment = new Deployment( ignitionModule.name, Deployment.setupServices(options, this._providers), @@ -67,7 +62,10 @@ export class Ignition { deployment.transformComplete(constructResult.executionGraph); log("Execute based on execution graph"); - const executionResult = await execute(deployment); + const executionResult = await execute(deployment, { + maxRetries: options.maxRetries, + gasIncrementPerRetry: options.gasIncrementPerRetry, + }); if (executionResult._kind === "failure") { return [executionResult, {}]; diff --git a/packages/core/src/execution/batch/types.ts b/packages/core/src/execution/batch/types.ts index a8911d0b63..333771e816 100644 --- a/packages/core/src/execution/batch/types.ts +++ b/packages/core/src/execution/batch/types.ts @@ -1,4 +1,4 @@ -import { Services } from "services/types"; +import { ExecutionContext } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; @@ -15,7 +15,7 @@ export type BatcherResult = export type ExecutionVertexDispatcher = ( vertex: ExecutionVertex, resultAccumulator: ResultsAccumulator, - context: { services: Services } + context: ExecutionContext ) => Promise; export interface ExecuteBatchResult { diff --git a/packages/core/src/execution/batch/visitInBatches.ts b/packages/core/src/execution/batch/visitInBatches.ts index ac463b44cd..7c5a8f3844 100644 --- a/packages/core/src/execution/batch/visitInBatches.ts +++ b/packages/core/src/execution/batch/visitInBatches.ts @@ -1,6 +1,6 @@ import { Deployment } from "deployment/Deployment"; import { Services } from "services/types"; -import { ExecutionState } from "types/deployment"; +import { ExecutionState, ExecutionOptions } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { ResultsAccumulator, @@ -19,7 +19,8 @@ import { allDependenciesCompleted } from "./utils"; export async function visitInBatches( deployment: Deployment, executionGraph: ExecutionGraph, - executionVertexDispatcher: ExecutionVertexDispatcher + executionVertexDispatcher: ExecutionVertexDispatcher, + options: ExecutionOptions ): Promise { deployment.startExecutionPhase(executionGraph); @@ -37,7 +38,8 @@ export async function visitInBatches( deployment.state.execution.resultsAccumulator, deployment.updateCurrentBatchWithResult.bind(deployment), { services: deployment.services }, - executionVertexDispatcher + executionVertexDispatcher, + options ); deployment.updateExecutionWithBatchResults(executeBatchResult); @@ -80,7 +82,8 @@ async function executeBatch( resultsAccumulator: ResultsAccumulator, uiUpdate: (vertexId: number, result: VertexVisitResult) => void, { services }: { services: Services }, - executionVertexDispatcher: ExecutionVertexDispatcher + executionVertexDispatcher: ExecutionVertexDispatcher, + options: ExecutionOptions ): Promise { const batchVertexes = [...batch] .map((vertexId) => executionGraph.vertexes.get(vertexId)) @@ -93,6 +96,7 @@ async function executeBatch( const promises = batchVertexes.map(async (vertex) => { const result = await executionVertexDispatcher(vertex, resultsAccumulator, { services, + options, }); uiUpdate(vertex.id, result); diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 8aeba0f100..11ff68ae9e 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,6 +1,6 @@ import { Contract } from "ethers"; -import { Services } from "services/types"; +import { ExecutionContext } from "types/deployment"; import { ContractCall } from "types/executionGraph"; import { VertexVisitResult } from "types/graph"; @@ -9,7 +9,7 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( { method, contract, args, value }: ContractCall, resultAccumulator: Map, - { services }: { services: Services } + { services, options }: ExecutionContext ): Promise { const resolve = resolveFrom(resultAccumulator); @@ -25,7 +25,7 @@ export async function executeContractCall( ...resolvedArgs, { value } ); - txHash = await services.contracts.sendTx(unsignedTx); + txHash = await services.contracts.sendTx(unsignedTx, options); } catch (err) { return { _kind: "failure", diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 926c3b90b2..7371980eda 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,6 +1,6 @@ import { ContractFactory } from "ethers"; -import { Services } from "services/types"; +import { ExecutionContext } from "types/deployment"; import { ContractDeploy } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; @@ -10,7 +10,7 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( { artifact, args, libraries, value }: ContractDeploy, resultAccumulator: ResultsAccumulator, - { services }: { services: Services } + { services, options }: ExecutionContext ): Promise { try { const resolve = resolveFrom(resultAccumulator); @@ -35,7 +35,7 @@ export async function executeContractDeploy( value, }); - const txHash = await services.contracts.sendTx(deployTransaction); + const txHash = await services.contracts.sendTx(deployTransaction, options); const receipt = await services.transactions.wait(txHash); diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 84211f2691..fd2165b67a 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,6 +1,6 @@ import { ContractFactory } from "ethers"; -import { Services } from "services/types"; +import { ExecutionContext } from "types/deployment"; import { LibraryDeploy } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; @@ -10,7 +10,7 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeLibraryDeploy( { artifact, args }: LibraryDeploy, resultAccumulator: ResultsAccumulator, - { services }: { services: Services } + { services, options }: ExecutionContext ): Promise { try { const resolvedArgs = args @@ -23,7 +23,7 @@ export async function executeLibraryDeploy( const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - const txHash = await services.contracts.sendTx(deployTransaction); + const txHash = await services.contracts.sendTx(deployTransaction, options); const receipt = await services.transactions.wait(txHash); diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 7c98e5eabd..f512c30425 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,4 +1,4 @@ -import { Services } from "services/types"; +import { ExecutionContext } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; @@ -10,7 +10,7 @@ import { executeLibraryDeploy } from "./executeLibraryDeploy"; export function executionDispatch( executionVertex: ExecutionVertex, resultAccumulator: ResultsAccumulator, - context: { services: Services } + context: ExecutionContext ): Promise { switch (executionVertex.type) { case "ContractDeploy": diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 5e94303594..6762f9957b 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,16 +1,21 @@ -import { Deployment } from "deployment/Deployment"; -import { VisitResult } from "types/graph"; +import type { Deployment } from "deployment/Deployment"; +import type { ExecutionOptions } from "types/deployment"; +import type { VisitResult } from "types/graph"; import { visitInBatches } from "./batch/visitInBatches"; import { executionDispatch } from "./dispatch/executionDispatch"; -export async function execute(deployment: Deployment): Promise { +export async function execute( + deployment: Deployment, + options: ExecutionOptions +): Promise { if (deployment.state.transform.executionGraph === null) { throw new Error("Cannot execute without an execution graph"); } return visitInBatches( deployment, deployment.state.transform.executionGraph, - executionDispatch + executionDispatch, + options ); } diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 29cae5f4d6..1415f8504d 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -37,7 +37,7 @@ export class ContractsService implements IContractsService { public async sendTx( deployTransaction: ethers.providers.TransactionRequest, - txOptions?: TransactionOptions + txOptions: TransactionOptions ): Promise { if (deployTransaction.to !== undefined) { this._debug("Calling method of contract"); @@ -52,7 +52,7 @@ export class ContractsService implements IContractsService { private async _sendTx( signer: IgnitionSigner, tx: ethers.providers.TransactionRequest, - txOptions?: TransactionOptions + txOptions: TransactionOptions ): Promise { if (txOptions?.gasLimit !== undefined) { tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); @@ -84,11 +84,17 @@ export class ContractsService implements IContractsService { } if (blockNumberWhenSent + 5 <= currentBlockNumber) { - if (retries === 4) { + if (retries === txOptions.maxRetries) { throw new Error("Transaction not confirmed within max retry limit"); } - const txToSend = await this._bump(txHash, signer, txSent, txHash); + const txToSend = await this._bump( + txHash, + signer, + txSent, + txHash, + txOptions.gasIncrementPerRetry + ); blockNumberWhenSent = await this._providers.web3Provider.getBlockNumber(); @@ -113,7 +119,8 @@ export class ContractsService implements IContractsService { _txHash: string, _signer: IgnitionSigner, previousTxRequest: ethers.providers.TransactionRequest, - previousTxHash: string + previousTxHash: string, + gasIncrementPerRetry: ethers.BigNumber | null ): Promise { const previousTx = await this._providers.web3Provider.getTransaction( previousTxHash @@ -123,10 +130,13 @@ export class ContractsService implements IContractsService { if (previousTx.gasPrice !== undefined) { // Increase 10%, and add 1 to be sure it's at least rounded up - const newGasPrice = ethers.BigNumber.from(previousTx.gasPrice) - .mul(110000) - .div(100000) - .add(1); + // or add by user's config value if present + const newGasPrice = gasIncrementPerRetry + ? ethers.BigNumber.from(previousTx.gasPrice).add(gasIncrementPerRetry) + : ethers.BigNumber.from(previousTx.gasPrice) + .mul(110000) + .div(100000) + .add(1); return { ...previousTxRequest, diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 97e75e4f6f..491b7189d7 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -8,6 +8,8 @@ import { ITransactionsService } from "./TransactionsService"; export interface TransactionOptions { gasLimit?: ethers.BigNumberish; gasPrice?: ethers.BigNumberish; + maxRetries: number; + gasIncrementPerRetry: ethers.BigNumber | null; } export interface Services { diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 73dcbad29f..920a5b9a7d 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,4 +1,7 @@ +import type { BigNumber } from "ethers"; + import { ExecutionGraph } from "execution/ExecutionGraph"; +import { Services } from "services/types"; import { ResultsAccumulator, VertexVisitResult } from "./graph"; import { @@ -60,3 +63,13 @@ export interface DeployState { }; execution: ExecutionState; } + +export interface ExecutionOptions { + maxRetries: number; + gasIncrementPerRetry: BigNumber | null; +} + +export interface ExecutionContext { + services: Services; + options: ExecutionOptions; +} diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index 7d4c6f36ba..4caac81b12 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -79,7 +79,10 @@ describe("ContractsService", function () { const fakeTx: ethers.providers.TransactionRequest = {}; await assert.isRejected( - contractsService.sendTx(fakeTx), + contractsService.sendTx(fakeTx, { + maxRetries: 4, + gasIncrementPerRetry: null, + }), /Transaction not confirmed within max retry limit/ ); }); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 61bdec7dfe..e0525eb488 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -20,7 +20,7 @@ export class IgnitionWrapper { private _ethers: HardhatEthers, private _deployOptions: Omit< IgnitionDeployOptions, - keyof { ui?: boolean; networkName: string } + keyof { ui?: boolean } > & { ui?: boolean } ) { this._ignition = new Ignition(_providers); @@ -32,11 +32,10 @@ export class IgnitionWrapper { | { parameters: { [key: string]: ExternalParamValue }; ui?: boolean; - networkName: string; } | undefined ) { - const showUi = deployParams?.ui ?? true; + const showUi = deployParams?.ui ?? this._deployOptions.ui ?? true; if (deployParams !== undefined) { await this._providers.config.setParams(deployParams.parameters); @@ -44,8 +43,7 @@ export class IgnitionWrapper { const [deploymentResult] = await this._ignition.deploy(ignitionModule, { ...this._deployOptions, - ui: Boolean(deployParams?.ui) ? renderToCli : undefined, - networkName: deployParams?.networkName ?? "", + ui: showUi ? renderToCli : undefined, }); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 982e587a60..dde00a4ced 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,6 @@ import "@nomiclabs/hardhat-ethers"; import { Module, ModuleDict, Providers } from "@ignored/ignition-core"; +import { BigNumber } from "ethers"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -12,26 +13,41 @@ import "./type-extensions"; export { buildSubgraph, buildModule } from "@ignored/ignition-core"; +export interface IgnitionConfig { + maxRetries: number; + gasIncrementPerRetry: BigNumber | null; +} + +/* ignition config defaults */ +const IGNITION_DIR = "ignition"; +const DEPLOYMENTS_DIR = "deployments"; +const MAX_RETRIES = 4; +const GAS_INCREMENT_PER_RETRY = null; + extendConfig((config, userConfig) => { - const userIgnitionPath = userConfig.paths?.ignition; - const userDeploymentsPath = userConfig.paths?.deployments; - - let ignitionPath: string; - if (userIgnitionPath === undefined) { - ignitionPath = path.join(config.paths.root, "ignition"); - } else { - ignitionPath = path.resolve(config.paths.root, userIgnitionPath); - } - - let deploymentsPath: string; - if (userDeploymentsPath === undefined) { - deploymentsPath = path.join(config.paths.root, "deployments"); - } else { - deploymentsPath = path.resolve(config.paths.root, userDeploymentsPath); - } - - config.paths.ignition = ignitionPath; - config.paths.deployments = deploymentsPath; + /* setup path configs */ + const userPathsConfig = userConfig.paths ?? {}; + + config.paths = { + ...config.paths, + ignition: path.resolve( + config.paths.root, + userPathsConfig.ignition ?? IGNITION_DIR + ), + deployments: path.resolve( + config.paths.root, + userPathsConfig.deployments ?? DEPLOYMENTS_DIR + ), + }; + + /* setup core configs */ + const userIgnitionConfig = userConfig.ignition ?? {}; + + config.ignition = { + maxRetries: userIgnitionConfig.maxRetries ?? MAX_RETRIES, + gasIncrementPerRetry: + userIgnitionConfig.gasIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, + }; }); /** @@ -89,9 +105,11 @@ extendEnvironment((hre) => { const txPollingInterval = isHardhatNetwork ? 100 : 5000; return new IgnitionWrapper(providers, hre.ethers, { + ...hre.config.ignition, pathToJournal, txPollingInterval, ui: true, + networkName: hre.network.name, }); }); }); @@ -138,11 +156,7 @@ task("deploy") process.exit(0); } - await hre.ignition.deploy(userModules[0], { - parameters, - ui: true, - networkName: hre.network.name, - }); + await hre.ignition.deploy(userModules[0], { parameters }); } ); diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 888dfd8bf1..eb8ba6b6a0 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -4,6 +4,8 @@ import "hardhat/types/runtime"; import type { IgnitionWrapper } from "./ignition-wrapper"; +import type { IgnitionConfig } from "./index"; + declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { ignition?: string; @@ -14,6 +16,14 @@ declare module "hardhat/types/config" { ignition: string; deployments: string; } + + export interface HardhatUserConfig { + ignition?: Partial; + } + + export interface HardhatConfig { + ignition: IgnitionConfig; + } } declare module "hardhat/types/runtime" { diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts new file mode 100644 index 0000000000..3d0f749409 --- /dev/null +++ b/packages/hardhat-plugin/test/config.ts @@ -0,0 +1,69 @@ +/* eslint-disable import/no-unused-modules */ +import { ContractsService } from "@ignored/ignition-core/dist/services/ContractsService"; +import { TransactionsService } from "@ignored/ignition-core/dist/services/TransactionsService"; +import { assert } from "chai"; +import { BigNumber } from "ethers"; +import sinon from "sinon"; + +import { deployModule } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("config", () => { + useEnvironment("with-config"); + let sendTxStub: sinon.SinonStub; + + before(async function () { + sinon.stub(TransactionsService.prototype, "wait").resolves({ + blockHash: "", + blockNumber: 0, + confirmations: 0, + from: "", + byzantium: true, + contractAddress: "", + cumulativeGasUsed: BigNumber.from(0), + effectiveGasPrice: BigNumber.from(0), + gasUsed: BigNumber.from(0), + logs: [], + logsBloom: "", + to: "", + transactionHash: "", + transactionIndex: 0, + type: 0, + }); + + sendTxStub = sinon + .stub(ContractsService.prototype, "sendTx") + .resolves( + "0xb75381e904154b34814d387c29e1927449edd98d30f5e310f25e9b1f19b0b077" + ); + }); + + afterEach(() => { + sinon.restore(); + }); + + it("should apply maxRetries", async function () { + await deployModule(this.hre, (m) => { + m.contract("Bar"); + + return {}; + }); + + const sendTxOptions = sendTxStub.getCalls()[0].lastArg; + + assert.equal(sendTxOptions.maxRetries, 1); + }); + + it("should apply gasIncrementPerRetry", async function () { + await deployModule(this.hre, (m) => { + m.contract("Bar"); + + return {}; + }); + + const sendTxOptions = sendTxStub.getCalls()[0].lastArg; + + assert(BigNumber.isBigNumber(sendTxOptions.gasIncrementPerRetry)); + assert(BigNumber.from(sendTxOptions.gasIncrementPerRetry).eq(1000)); + }); +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol new file mode 100644 index 0000000000..7b168b2d7d --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol new file mode 100644 index 0000000000..1687a1d485 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol new file mode 100644 index 0000000000..903f589c6c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js new file mode 100644 index 0000000000..9d42786f09 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -0,0 +1,17 @@ +const { BigNumber } = require("../../../node_modules/ethers/lib/index"); + +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, + ignition: { + maxRetries: 1, + gasIncrementPerRetry: BigNumber.from(1000), + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js new file mode 100644 index 0000000000..3a4fc78c52 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js @@ -0,0 +1,15 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@ignored/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", { + args: ["0x0000000000000000000000000000000000000000"], + }); + + m.call(usesContract, "setAddress", { + args: [bar], + }); + + return { bar, usesContract }; +}); diff --git a/yarn.lock b/yarn.lock index e8fa2df024..65e0da8de1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -690,18 +690,6 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== -"@ignored/hardhat-ignition@^0.0.2": - version "0.0.2" - resolved "https://registry.yarnpkg.com/@ignored/hardhat-ignition/-/hardhat-ignition-0.0.2.tgz#01a7e5c46c62af85162e6270a2ad6e5be8405d40" - integrity sha512-ST32uHMJM7hmB7p6LsrEBmL2KB4TjgEBhwtpCoampBXwInp0N95yq2SV6jwnDM2qZM5ZxgujfV7iqQGdHSXpiQ== - dependencies: - debug "^4.3.2" - ethers "^5.4.7" - fs-extra "^10.0.0" - ink "3.2.0" - ink-spinner "4.0.3" - react "18.2.0" - "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" From a84d9701592737c8984f636ac909c4359a2bca50 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 2 Nov 2022 13:55:40 +0000 Subject: [PATCH 0166/1302] docs(examples): add create2 example Add an example of adding a contract via a `create2` factory. Currently our api isn't flexible enough to express interactions with the factory directly. We can do it with some extra flexibility when used via the testing api. The docs have been updated with a section on `create2` as it is likely to come up. --- README.md | 1 + docs/creating-modules-for-deployment.md | 49 ++++++++++++++ examples/create2/.eslintrc.js | 14 ++++ examples/create2/.gitignore | 9 +++ examples/create2/.prettierignore | 5 ++ examples/create2/README.md | 15 +++++ examples/create2/contracts/Bar.sol | 6 ++ examples/create2/contracts/Create2Factory.sol | 21 ++++++ examples/create2/contracts/Foo.sol | 6 ++ examples/create2/hardhat.config.js | 17 +++++ .../create2/ignition/Create2FactoryModule.js | 7 ++ examples/create2/package.json | 19 ++++++ examples/create2/test/create2.test.js | 66 +++++++++++++++++++ yarn.lock | 2 +- 14 files changed, 236 insertions(+), 1 deletion(-) create mode 100644 examples/create2/.eslintrc.js create mode 100644 examples/create2/.gitignore create mode 100644 examples/create2/.prettierignore create mode 100644 examples/create2/README.md create mode 100644 examples/create2/contracts/Bar.sol create mode 100644 examples/create2/contracts/Create2Factory.sol create mode 100644 examples/create2/contracts/Foo.sol create mode 100644 examples/create2/hardhat.config.js create mode 100644 examples/create2/ignition/Create2FactoryModule.js create mode 100644 examples/create2/package.json create mode 100644 examples/create2/test/create2.test.js diff --git a/README.md b/README.md index 4bdf0b9622..ca722b6bb0 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Simple](./examples/simple/README.md) - [ENS](./examples/ens/README.md) +- [Create2](./examples//create2/README.md) ## Contributing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index c5a1dcb78e..049ee0dec2 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -13,6 +13,7 @@ - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) + - [Create2 (TBD)](./creating-modules-for-deployment.md#create2-tbd) - [Visualizing Your Deployment](./visualizing-your-deployment.md) - [Actions](./visualizing-your-deployment.md#actions) - [Testing With Hardhat](./testing-with-hardhat.md) @@ -243,6 +244,54 @@ Calls to `useModule` memoize the results object, assuming the same parameters ar Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). +## Create2 (TBD) + +`Create2` allows for reliably determining the address of a contract before it is deployed. + +It requires a factory contract: + +```solidity +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +import "@openzeppelin/contracts/utils/Create2.sol"; + +contract Create2Factory { + event Deployed(bytes32 indexed salt, address deployed); + + function deploy( + uint256 amount, + bytes32 salt, + bytes memory bytecode + ) public returns (address) { + address deployedAddress; + + deployedAddress = Create2.deploy(amount, salt, bytecode); + emit Deployed(salt, deployedAddress); + + return deployedAddress; + } +} +``` + +Given the `create2` factory, you can deploy a contract via it by: + +```ts +module.exports = buildModule("Create2Example", (m) => { + const create2 = m.contract("Create2Factory"); + + const fooAddress = m.call(create2, "deploy", { + args: [ + 0, // amount + toBytes32(1), // salt + m.getBytesForArtifact("Foo"), // contract bytecode + ], + }); + + return { create2, foo: m.asContract(fooAddress) }; +}); +``` + ## Global Configuration There are currently two configurable options you can add to your `hardhat.config.js` file in order to adjust the way **Ignition** functions: diff --git a/examples/create2/.eslintrc.js b/examples/create2/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/create2/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/create2/.gitignore b/examples/create2/.gitignore new file mode 100644 index 0000000000..36077f2884 --- /dev/null +++ b/examples/create2/.gitignore @@ -0,0 +1,9 @@ +node_modules +.env +coverage +coverage.json +typechain + +#Hardhat files +cache +artifacts diff --git a/examples/create2/.prettierignore b/examples/create2/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/create2/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/create2/README.md b/examples/create2/README.md new file mode 100644 index 0000000000..f683e9bc4d --- /dev/null +++ b/examples/create2/README.md @@ -0,0 +1,15 @@ +# Create2 Example for Ignition + +This hardhat project is an example of using ignition to deploy contracts with a `create2` factory. + +## Deploying + +Currently our api isn't flexible enough to support direct cli use of `create2` factories, as we haven't yet implemented a native approach to loading bytecode. See the tests for an example of usage where we work around this constraint with async calls to read artifacts directly. + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` diff --git a/examples/create2/contracts/Bar.sol b/examples/create2/contracts/Bar.sol new file mode 100644 index 0000000000..a96f102f60 --- /dev/null +++ b/examples/create2/contracts/Bar.sol @@ -0,0 +1,6 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +contract Bar { + string public name = "Bar"; +} diff --git a/examples/create2/contracts/Create2Factory.sol b/examples/create2/contracts/Create2Factory.sol new file mode 100644 index 0000000000..f50e9e8933 --- /dev/null +++ b/examples/create2/contracts/Create2Factory.sol @@ -0,0 +1,21 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +import "@openzeppelin/contracts/utils/Create2.sol"; + +contract Create2Factory { + event Deployed(bytes32 indexed salt, address deployed); + + function deploy( + uint256 amount, + bytes32 salt, + bytes memory bytecode + ) public returns (address) { + address deployedAddress; + + deployedAddress = Create2.deploy(amount, salt, bytecode); + emit Deployed(salt, deployedAddress); + + return deployedAddress; + } +} diff --git a/examples/create2/contracts/Foo.sol b/examples/create2/contracts/Foo.sol new file mode 100644 index 0000000000..8c401da3e6 --- /dev/null +++ b/examples/create2/contracts/Foo.sol @@ -0,0 +1,6 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +contract Foo { + string public name = "Foo"; +} diff --git a/examples/create2/hardhat.config.js b/examples/create2/hardhat.config.js new file mode 100644 index 0000000000..1c2232b7f9 --- /dev/null +++ b/examples/create2/hardhat.config.js @@ -0,0 +1,17 @@ +require("@ignored/hardhat-ignition"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.5", + networks: { + hardhat: { + mining: { + // auto: false + }, + blockGasLimit: 5_000_000_000, + initialBaseFeePerGas: 1_000_000_000, + }, + }, +}; diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js new file mode 100644 index 0000000000..a7f93663c3 --- /dev/null +++ b/examples/create2/ignition/Create2FactoryModule.js @@ -0,0 +1,7 @@ +const { buildModule } = require("@ignored/hardhat-ignition"); + +module.exports = buildModule("Create2Factory", (m) => { + const create2 = m.contract("Create2Factory"); + + return { create2 }; +}); diff --git a/examples/create2/package.json b/examples/create2/package.json new file mode 100644 index 0000000000..4592f0b4cc --- /dev/null +++ b/examples/create2/package.json @@ -0,0 +1,19 @@ +{ + "name": "@nomicfoundation/ignition-create2-example", + "private": true, + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + }, + "devDependencies": { + "hardhat": "^2.10.0", + "@ignored/hardhat-ignition": "^0.0.3" + }, + "dependencies": { + "@openzeppelin/contracts": "4.7.3" + } +} diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js new file mode 100644 index 0000000000..754e1d5f32 --- /dev/null +++ b/examples/create2/test/create2.test.js @@ -0,0 +1,66 @@ +const { assert } = require("chai"); +const { buildModule } = require("@ignored/hardhat-ignition"); + +const Create2FactoryModule = require("../ignition/Create2FactoryModule"); + +describe("Create2", function () { + let factory; + + before(async () => { + const FooArtifact = await hre.artifacts.readArtifact("Foo"); + const BarArtifact = await hre.artifacts.readArtifact("Bar"); + + const DeployViaCreate2Module = buildModule( + "DeployViaCreate2Module", + (m) => { + const { create2 } = m.useModule(Create2FactoryModule); + + m.call(create2, "deploy", { + args: [0, toBytes32(1), FooArtifact.bytecode], + }); + + m.call(create2, "deploy", { + args: [0, toBytes32(2), BarArtifact.bytecode], + }); + + return { create2 }; + } + ); + + const { create2 } = await ignition.deploy(DeployViaCreate2Module); + + factory = create2; + }); + + it("should return an instantiated factory", async function () { + assert.isDefined(factory); + }); + + it("should have deployed the foo contract", async () => { + const address = await resolveAddressBasedOnSalt(factory, 1); + const FooFactory = await hre.ethers.getContractFactory("Foo"); + const foo = FooFactory.attach(address); + + assert.equal(await foo.name(), "Foo"); + }); + + it("should have deployed the bar contract", async () => { + const address = await resolveAddressBasedOnSalt(factory, 2); + const FooFactory = await hre.ethers.getContractFactory("Bar"); + const foo = FooFactory.attach(address); + + assert.equal(await foo.name(), "Bar"); + }); +}); + +function toBytes32(n) { + return hre.ethers.utils.hexZeroPad(hre.ethers.utils.hexlify(n), 32); +} + +async function resolveAddressBasedOnSalt(factory, salt) { + const deployedEvents = await factory.queryFilter( + factory.filters.Deployed(toBytes32(salt)) + ); + + return deployedEvents[0].args.deployed; +} diff --git a/yarn.lock b/yarn.lock index 65e0da8de1..c143440a15 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1052,7 +1052,7 @@ ethers "^4.0.0-beta.1" source-map-support "^0.5.19" -"@openzeppelin/contracts@^4.1.0": +"@openzeppelin/contracts@4.7.3", "@openzeppelin/contracts@^4.1.0": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== From d2d964643267469459b864e0e978fe2707e95726 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 14 Nov 2022 23:41:18 -0500 Subject: [PATCH 0167/1302] adjusted the ui option --- packages/core/src/Ignition.ts | 9 +++++--- .../hardhat-plugin/src/ignition-wrapper.ts | 21 +++++++------------ packages/hardhat-plugin/src/index.ts | 3 +-- 3 files changed, 15 insertions(+), 18 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 16b039f8ff..c7b9ca4716 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -25,7 +25,7 @@ const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { pathToJournal: string | undefined; txPollingInterval: number; - ui?: UpdateUiAction; + ui: boolean; networkName: string; maxRetries: number; gasIncrementPerRetry: BigNumber | null; @@ -34,7 +34,10 @@ export interface IgnitionDeployOptions { type ModuleOutputs = Record; export class Ignition { - constructor(private _providers: Providers) {} + constructor( + private _providers: Providers, + private _uiRenderer: UpdateUiAction + ) {} public async deploy( ignitionModule: Module, @@ -45,7 +48,7 @@ export class Ignition { const deployment = new Deployment( ignitionModule.name, Deployment.setupServices(options, this._providers), - options.ui + options.ui ? this._uiRenderer : undefined ); const chainId = await this._getChainId(); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index e0525eb488..6fe3429762 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -18,24 +18,19 @@ export class IgnitionWrapper { constructor( private _providers: Providers, private _ethers: HardhatEthers, - private _deployOptions: Omit< - IgnitionDeployOptions, - keyof { ui?: boolean } - > & { ui?: boolean } + private _deployOptions: Omit ) { - this._ignition = new Ignition(_providers); + this._ignition = new Ignition(_providers, renderToCli); } public async deploy( ignitionModule: Module, - deployParams: - | { - parameters: { [key: string]: ExternalParamValue }; - ui?: boolean; - } - | undefined + deployParams?: { + parameters: { [key: string]: ExternalParamValue }; + ui?: boolean; + } ) { - const showUi = deployParams?.ui ?? this._deployOptions.ui ?? true; + const showUi = deployParams?.ui ?? false; if (deployParams !== undefined) { await this._providers.config.setParams(deployParams.parameters); @@ -43,7 +38,7 @@ export class IgnitionWrapper { const [deploymentResult] = await this._ignition.deploy(ignitionModule, { ...this._deployOptions, - ui: showUi ? renderToCli : undefined, + ui: showUi, }); if (deploymentResult._kind === "hold") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index dde00a4ced..95e5273ac9 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -108,7 +108,6 @@ extendEnvironment((hre) => { ...hre.config.ignition, pathToJournal, txPollingInterval, - ui: true, networkName: hre.network.name, }); }); @@ -156,7 +155,7 @@ task("deploy") process.exit(0); } - await hre.ignition.deploy(userModules[0], { parameters }); + await hre.ignition.deploy(userModules[0], { parameters, ui: true }); } ); From f28fd6c54f3e85eed8bc30f039f32bac2e81a129 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 16 Nov 2022 08:59:14 +0000 Subject: [PATCH 0168/1302] feat:params for value (#66) * chore: change simple example to sample Use the hardhat javascript sample project instead of our simple example. * feat: allow parameters in `value` slot The value slot now accepts a `ParameterFuture` as well as a BigNumber. The validation is been moved to the validation phase, and tests ported. * reword big number tests for clarity Co-authored-by: Morgan --- docs/getting-started-guide.md | 13 +- examples/ens/hardhat.config.js | 1 + examples/ens/package.json | 18 +- examples/{simple => sample}/.eslintrc.js | 0 examples/sample/.gitignore | 11 + examples/{simple => sample}/.prettierignore | 0 examples/sample/README.md | 19 + examples/sample/contracts/Lock.sol | 34 + examples/sample/hardhat.config.js | 7 + examples/sample/ignition/LockModule.js | 17 + examples/sample/package.json | 30 + examples/sample/test/Lock.js | 131 ++ examples/simple/.gitignore | 3 - examples/simple/README.md | 19 - examples/simple/contracts/Simple.sol | 13 - examples/simple/hardhat.config.js | 13 - examples/simple/ignition/Simple.js | 13 - examples/simple/package.json | 19 - examples/simple/test/simple.test.js | 24 - packages/core/package.json | 4 +- packages/core/src/dsl/DeploymentBuilder.ts | 13 +- ...onvertDeploymentVertexToExecutionVertex.ts | 34 +- packages/core/src/types/deploymentGraph.ts | 13 +- packages/core/src/types/executionGraph.ts | 7 +- .../dispatch/validateArtifactContract.ts | 12 +- .../src/validation/dispatch/validateCall.ts | 11 +- .../dispatch/validateHardhatContract.ts | 11 +- packages/core/test/deploymentBuilder/value.ts | 56 - packages/core/test/validation.ts | 108 ++ packages/hardhat-plugin/package.json | 4 +- packages/hardhat-plugin/test/calls.ts | 63 + packages/hardhat-plugin/test/contracts.ts | 57 + .../minimal/contracts/Contracts.sol | 6 + packages/hardhat-plugin/test/helpers.ts | 4 +- yarn.lock | 1472 +++++++++++++++-- 35 files changed, 1908 insertions(+), 352 deletions(-) rename examples/{simple => sample}/.eslintrc.js (100%) create mode 100644 examples/sample/.gitignore rename examples/{simple => sample}/.prettierignore (100%) create mode 100644 examples/sample/README.md create mode 100644 examples/sample/contracts/Lock.sol create mode 100644 examples/sample/hardhat.config.js create mode 100644 examples/sample/ignition/LockModule.js create mode 100644 examples/sample/package.json create mode 100644 examples/sample/test/Lock.js delete mode 100644 examples/simple/.gitignore delete mode 100644 examples/simple/README.md delete mode 100644 examples/simple/contracts/Simple.sol delete mode 100644 examples/simple/hardhat.config.js delete mode 100644 examples/simple/ignition/Simple.js delete mode 100644 examples/simple/package.json delete mode 100644 examples/simple/test/simple.test.js diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 93008e7a48..2e5616fd4b 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -71,12 +71,17 @@ Add a deployment module under the `./ignition` folder for the example `Lock.sol` // ./ignition/LockModule.js const { buildModule } = require("@ignored/hardhat-ignition"); -const JAN_01_2100 = 4102491600; +const currentTimestampInSeconds = Math.round(Date.now() / 1000); +const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; +const ONE_YEAR_IN_FUTURE = currentTimestampInSeconds + ONE_YEAR_IN_SECS; + +const ONE_ETHER = hre.ethers.utils.parseEther("1"); module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", JAN_01_2100); + const unlockTime = m.getOptionalParam("unlockTime", ONE_YEAR_IN_FUTURE); + const lockedAmount = m.getOptionalParam("lockedAmount", ONE_ETHER); - const lock = m.contract("Lock", { args: [unlockTime] }); + const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); return { lock }; }); @@ -91,7 +96,7 @@ npx hardhat deploy LockModule.js Parameters can be passed as a flag at the command line via a json string: ```bash -npx hardhat deploy --parameters "{\"unlockTime\":4102491600}" LockModule.js +npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule.js # Ensure you have properly escaped the json string ``` diff --git a/examples/ens/hardhat.config.js b/examples/ens/hardhat.config.js index 1c2232b7f9..0e8d9661a2 100644 --- a/examples/ens/hardhat.config.js +++ b/examples/ens/hardhat.config.js @@ -1,3 +1,4 @@ +require("@nomicfoundation/hardhat-toolbox"); require("@ignored/hardhat-ignition"); /** diff --git a/examples/ens/package.json b/examples/ens/package.json index c160428998..bac15b3a92 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -10,8 +10,22 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.3" + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.3", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/simple/.eslintrc.js b/examples/sample/.eslintrc.js similarity index 100% rename from examples/simple/.eslintrc.js rename to examples/sample/.eslintrc.js diff --git a/examples/sample/.gitignore b/examples/sample/.gitignore new file mode 100644 index 0000000000..71f6a160fc --- /dev/null +++ b/examples/sample/.gitignore @@ -0,0 +1,11 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + diff --git a/examples/simple/.prettierignore b/examples/sample/.prettierignore similarity index 100% rename from examples/simple/.prettierignore rename to examples/sample/.prettierignore diff --git a/examples/sample/README.md b/examples/sample/README.md new file mode 100644 index 0000000000..8788371a0e --- /dev/null +++ b/examples/sample/README.md @@ -0,0 +1,19 @@ +# Hardhat Sample for Ignition + +This hardhat project is a variant of Hardhat's javascript sample project. + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy LockModule.js +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` diff --git a/examples/sample/contracts/Lock.sol b/examples/sample/contracts/Lock.sol new file mode 100644 index 0000000000..50935f61fd --- /dev/null +++ b/examples/sample/contracts/Lock.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/examples/sample/hardhat.config.js b/examples/sample/hardhat.config.js new file mode 100644 index 0000000000..25f05d06a5 --- /dev/null +++ b/examples/sample/hardhat.config.js @@ -0,0 +1,7 @@ +require("@nomicfoundation/hardhat-toolbox"); +require("@ignored/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.17", +}; diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js new file mode 100644 index 0000000000..4a04affb27 --- /dev/null +++ b/examples/sample/ignition/LockModule.js @@ -0,0 +1,17 @@ +// ./ignition/LockModule.js +const { buildModule } = require("@ignored/hardhat-ignition"); + +const currentTimestampInSeconds = Math.round(Date.now() / 1000); +const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; +const ONE_YEAR_IN_FUTURE = currentTimestampInSeconds + ONE_YEAR_IN_SECS; + +const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); + +module.exports = buildModule("LockModule", (m) => { + const unlockTime = m.getOptionalParam("unlockTime", ONE_YEAR_IN_FUTURE); + const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); + + const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); + + return { lock }; +}); diff --git a/examples/sample/package.json b/examples/sample/package.json new file mode 100644 index 0000000000..11b9c7b4e0 --- /dev/null +++ b/examples/sample/package.json @@ -0,0 +1,30 @@ +{ + "name": "@nomicfoundation/ignition-sample-example", + "private": true, + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.3", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + } +} diff --git a/examples/sample/test/Lock.js b/examples/sample/test/Lock.js new file mode 100644 index 0000000000..74320dd98d --- /dev/null +++ b/examples/sample/test/Lock.js @@ -0,0 +1,131 @@ +const { + time, + loadFixture, +} = require("@nomicfoundation/hardhat-network-helpers"); +const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); +const { expect } = require("chai"); +const LockModule = require("../ignition/LockModule"); + +describe("Lock", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await ethers.getSigners(); + + const { lock } = await ignition.deploy(LockModule, { + parameters: { + unlockTime, + lockedAmount, + }, + }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.unlockTime()).to.equal(unlockTime); + }); + + it("Should set the right owner", async function () { + const { lock, owner } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.owner()).to.equal(owner.address); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + expect(await ethers.provider.getBalance(lock.address)).to.equal( + lockedAmount + ); + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const latestTime = await time.latest(); + const Lock = await ethers.getContractFactory("Lock"); + await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( + "Unlock time should be in the future" + ); + }); + }); + + describe("Withdrawals", function () { + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + const { lock } = await loadFixture(deployOneYearLockFixture); + + await expect(lock.withdraw()).to.be.revertedWith( + "You can't withdraw yet" + ); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime, otherAccount } = await loadFixture( + deployOneYearLockFixture + ); + + // We can increase the time in Hardhat Network + await time.increaseTo(unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( + "You aren't the owner" + ); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + const { lock, unlockTime } = await loadFixture( + deployOneYearLockFixture + ); + + // Transactions are sent using the first signer by default + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).not.to.be.reverted; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()) + .to.emit(lock, "Withdrawal") + .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg + }); + }); + + describe("Transfers", function () { + it.skip("Should transfer the funds to the owner", async function () { + const { lock, unlockTime, lockedAmount, owner } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).to.changeEtherBalances( + [owner, lock], + [lockedAmount, -lockedAmount] + ); + }); + }); + }); +}); diff --git a/examples/simple/.gitignore b/examples/simple/.gitignore deleted file mode 100644 index f1462f7a56..0000000000 --- a/examples/simple/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -artifacts/ -cache/ -deployments/ diff --git a/examples/simple/README.md b/examples/simple/README.md deleted file mode 100644 index d47cfbb475..0000000000 --- a/examples/simple/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Simple Example for Ignition - -This hardhat project is an example of using ignition to deploy a simple set of contracts. - -## Deploying - -To run the ignition deploy against the ephemeral hardhat network: - -```shell -npx hardhat deploy Simple.js --parameters "{\"IncAmount\": 42}" -``` - -## Test - -To run the hardhat tests using ignition: - -```shell -yarn test:examples -``` diff --git a/examples/simple/contracts/Simple.sol b/examples/simple/contracts/Simple.sol deleted file mode 100644 index ab1c9e455e..0000000000 --- a/examples/simple/contracts/Simple.sol +++ /dev/null @@ -1,13 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import "hardhat/console.sol"; - -contract Simple { - uint256 public count = 10; - - function inc(uint256 n) public { - require(n > 0, "n must be positive"); - count += n; - } -} diff --git a/examples/simple/hardhat.config.js b/examples/simple/hardhat.config.js deleted file mode 100644 index feb9f3fc4f..0000000000 --- a/examples/simple/hardhat.config.js +++ /dev/null @@ -1,13 +0,0 @@ -require("@ignored/hardhat-ignition"); - -module.exports = { - solidity: "0.8.5", - networks: { - hardhat: { - mining: { - // auto: false - }, - initialBaseFeePerGas: 1_000_000_000, - }, - }, -}; diff --git a/examples/simple/ignition/Simple.js b/examples/simple/ignition/Simple.js deleted file mode 100644 index 8f27543f0d..0000000000 --- a/examples/simple/ignition/Simple.js +++ /dev/null @@ -1,13 +0,0 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); - -module.exports = buildModule("Simple", (m) => { - const incAmount = m.getOptionalParam("IncAmount", 1); - - const simple = m.contract("Simple"); - - m.call(simple, "inc", { - args: [incAmount], - }); - - return { simple }; -}); diff --git a/examples/simple/package.json b/examples/simple/package.json deleted file mode 100644 index 12b278e0a1..0000000000 --- a/examples/simple/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "@nomicfoundation/ignition-multisig-example", - "private": true, - "version": "0.0.1", - "scripts": { - "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", - "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" - }, - "dependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@ignored/hardhat-ignition": "^0.0.3" - }, - "devDependencies": { - "hardhat": "^2.10.0" - } -} diff --git a/examples/simple/test/simple.test.js b/examples/simple/test/simple.test.js deleted file mode 100644 index a900130977..0000000000 --- a/examples/simple/test/simple.test.js +++ /dev/null @@ -1,24 +0,0 @@ -const { assert } = require("chai"); -const SimpleModule = require("../ignition/Simple"); - -describe("Simple", function () { - let simpleContract; - - before(async () => { - const { simple } = await ignition.deploy(SimpleModule, { - parameters: { - IncAmount: 42, - }, - }); - - simpleContract = simple; - }); - - it("should return an instantiated ethers contract", async function () { - assert.isDefined(simpleContract); - }); - - it("should have incremented the count with the deployment config call", async function () { - assert.equal(await simpleContract.count(), 52); - }); -}); diff --git a/packages/core/package.json b/packages/core/package.json index 171d385165..8e48d7317f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -54,7 +54,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", - "hardhat": "^2.10.0", + "hardhat": "^2.12.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", @@ -66,7 +66,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "hardhat": "^2.10.0" + "hardhat": "^2.12.0" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 8af486fb40..1904fd6550 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -1,4 +1,4 @@ -import { ethers } from "ethers"; +import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; import { addEdge, ensureVertex } from "graph/adjacencyList"; @@ -33,7 +33,7 @@ import type { } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; -import { IgnitionError, assertBigNumberParam } from "utils/errors"; +import { IgnitionError } from "utils/errors"; import { isArtifact, isCallable, @@ -123,8 +123,6 @@ export class DeploymentBuilder implements IDeploymentBuilder { const artifact = artifactOrOptions; const options: ContractOptions | undefined = givenOptions; - assertBigNumberParam(options?.value, "value"); - const artifactContractFuture: ArtifactContract = { vertexId: this._resolveNextId(), label: contractName, @@ -150,8 +148,6 @@ export class DeploymentBuilder implements IDeploymentBuilder { } else { const options: ContractOptions | undefined = artifactOrOptions; - assertBigNumberParam(options?.value, "value"); - const contractFuture: HardhatContract = { vertexId: this._resolveNextId(), label: contractName, @@ -210,8 +206,6 @@ export class DeploymentBuilder implements IDeploymentBuilder { functionName: string, { args, after, value }: CallOptions ): ContractCall { - assertBigNumberParam(value, "value"); - const callFuture: ContractCall = { vertexId: this._resolveNextId(), label: `${contractFuture.label}/${functionName}`, @@ -501,7 +495,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { if ( typeof arg === "string" || typeof arg === "number" || - typeof arg === "boolean" + typeof arg === "boolean" || + BigNumber.isBigNumber(arg) ) { return; } diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 3fddd53e5f..33548cc041 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,3 +1,5 @@ +import { BigNumber } from "ethers"; + import { Services } from "services/types"; import { ArtifactContractDeploymentVertex, @@ -8,6 +10,7 @@ import { HardhatLibraryDeploymentVertex, IDeploymentGraph, DeploymentGraphVertex, + ExternalParamValue, } from "types/deploymentGraph"; import { ContractCall, @@ -77,7 +80,10 @@ async function convertHardhatContractToContractDeploy( artifact, args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, - value: vertex.value, + value: (await resolveParameter( + vertex.value, + transformContext + )) as BigNumber, }; } @@ -92,7 +98,10 @@ async function convertArtifactContractToContractDeploy( artifact: vertex.artifact, args: await convertArgs(vertex.args, transformContext), libraries: vertex.libraries, - value: vertex.value, + value: (await resolveParameter( + vertex.value, + transformContext + )) as BigNumber, }; } @@ -120,7 +129,10 @@ async function convertCallToContractCall( contract: await resolveParameter(vertex.contract, transformContext), method: vertex.method, args: await convertArgs(vertex.args, transformContext), - value: vertex.value, + value: (await resolveParameter( + vertex.value, + transformContext + )) as BigNumber, }; } @@ -164,9 +176,11 @@ function assertDeploymentVertexNotExpected( } async function convertArgs( - args: Array, + args: Array, transformContext: TransformContext -): Promise> { +): Promise< + Array +> { const resolvedArgs = []; for (const arg of args) { @@ -178,10 +192,10 @@ async function convertArgs( return resolvedArgs; } -async function resolveParameter( - arg: boolean | string | number | DeploymentGraphFuture, +async function resolveParameter( + arg: ExternalParamValue | T, { services, graph }: TransformContext -) { +): Promise { if (!isFuture(arg)) { return arg; } @@ -198,7 +212,7 @@ async function resolveParameter( scopeData.parameters !== undefined && arg.label in scopeData.parameters ) { - return scopeData.parameters[arg.label]; + return scopeData.parameters[arg.label] as string | number | T; } const hasParamResult = await services.config.hasParam(arg.label); @@ -206,7 +220,7 @@ async function resolveParameter( if (arg.subtype === "optional") { return hasParamResult.found ? services.config.getParam(arg.label) - : arg.defaultValue; + : (arg.defaultValue as T); } if (hasParamResult.found === false) { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index c6c8b35a21..5736fb1d5e 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -14,6 +14,7 @@ import { RequiredParameter, CallableFuture, Virtual, + ParameterFuture, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -38,7 +39,7 @@ export interface LibraryMap { [key: string]: DeploymentGraphFuture; } -export type ExternalParamValue = boolean | string | number; +export type ExternalParamValue = boolean | string | number | BigNumber; export type InternalParamValue = ExternalParamValue | DeploymentGraphFuture; @@ -58,7 +59,7 @@ export interface HardhatContractDeploymentVertex extends VertexDescriptor { args: InternalParamValue[]; libraries: LibraryMap; after: DeploymentGraphFuture[]; - value: BigNumber; + value: BigNumber | ParameterFuture; } export interface ArtifactContractDeploymentVertex extends VertexDescriptor { @@ -68,7 +69,7 @@ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { args: InternalParamValue[]; libraries: LibraryMap; after: DeploymentGraphFuture[]; - value: BigNumber; + value: BigNumber | ParameterFuture; } export interface DeployedContractDeploymentVertex extends VertexDescriptor { @@ -102,7 +103,7 @@ export interface CallDeploymentVertex extends VertexDescriptor { method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; - value: BigNumber; + value: BigNumber | ParameterFuture; } export interface VirtualVertex extends VertexDescriptor { @@ -117,13 +118,13 @@ export interface ContractOptions { [key: string]: DeploymentGraphFuture; }; after?: DeploymentGraphFuture[]; - value?: BigNumber; + value?: BigNumber | ParameterFuture; } export interface CallOptions { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; - value?: BigNumber; + value?: BigNumber | ParameterFuture; } export interface UseSubgraphOptions { diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index 0eba838d7a..9df5819835 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -11,7 +11,12 @@ export interface IExecutionGraph { getEdges(): Array<{ from: number; to: number }>; } -export type ArgValue = boolean | string | number | DeploymentGraphFuture; +export type ArgValue = + | boolean + | string + | number + | BigNumber + | DeploymentGraphFuture; export type ExecutionVertexType = | "ContractDeploy" diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index e021b0ed11..7024fe18e5 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,15 +1,23 @@ -import { ethers } from "ethers"; +import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { isArtifact } from "utils/guards"; +import { IgnitionError } from "utils/errors"; +import { isArtifact, isParameter } from "utils/guards"; export async function validateArtifactContract( vertex: ArtifactContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { + if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { + return { + _kind: "failure", + failure: new IgnitionError(`For contract 'value' must be a BigNumber`), + }; + } + const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 24a2069b16..21a7cf3163 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,9 +1,11 @@ -import { ethers } from "ethers"; +import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; import { CallableFuture } from "types/future"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; +import { isParameter } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; export async function validateCall( @@ -11,6 +13,13 @@ export async function validateCall( _resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { + if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { + return { + _kind: "failure", + failure: new IgnitionError(`For call 'value' must be a BigNumber`), + }; + } + const contractName = vertex.contract.label; const artifactAbi = await resolveArtifactForCallableFuture( diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 0d62dd3f1f..26e095754a 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,14 +1,23 @@ -import { ethers } from "ethers"; +import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; +import { isParameter } from "utils/guards"; export async function validateHardhatContract( vertex: HardhatContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { + if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { + return { + _kind: "failure", + failure: new IgnitionError(`For contract 'value' must be a BigNumber`), + }; + } + const artifactExists = await services.artifacts.hasArtifact( vertex.contractName ); diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index fca41be4cc..a3f2136c5b 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -73,20 +73,6 @@ describe("deployment builder - value", () => { ethers.utils.parseUnits("42").toString() ); }); - - it("should throw if given a value that is not a BigNumber", () => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - // @ts-ignore - const token = m.contract("Token", { value: "42" }); - - return { token }; - }); - - assert.throws( - () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); - }); }); describe("call", () => { @@ -106,26 +92,6 @@ describe("deployment builder - value", () => { ethers.utils.parseUnits("10").toString() ); }); - - it("should throw if given a value that is not a BigNumber", () => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); - - m.call(exchange, "addToken", { - args: [token], - // @ts-ignore - value: 10, - }); - - return {}; - }); - - assert.throws( - () => generateDeploymentGraphFrom(callModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); - }); }); describe("artifact", () => { @@ -142,27 +108,5 @@ describe("deployment builder - value", () => { ethers.utils.parseUnits("3").toString() ); }); - - it("should throw if given a value that is not a BigNumber", () => { - const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; - - const fromArtifactModule = buildModule( - "FromArtifact", - (m: IDeploymentBuilder) => { - const foo = m.contract("Foo", artifact, { - args: [0], - value: null, - }); - - return { foo }; - } - ); - - assert.throws( - () => - generateDeploymentGraphFrom(fromArtifactModule, { chainId: 31337 }), - /`value` must be a BigNumber/ - ); - }); }); }); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 8ad69e89b8..fb3c783454 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -78,6 +78,41 @@ describe("Validation", () => { "The constructor of the contract 'Example' expects 0 arguments but 3 were given" ); }); + + it("should not validate a artifact contract deploy with a non-BigNumber value", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Example", exampleArtifact, { + args: [1, 2, 3], + value: "42" as any, + }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, "For contract 'value' must be a BigNumber"); + }); }); describe("artifact library deploy", () => { @@ -403,6 +438,44 @@ describe("Validation", () => { "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments" ); }); + + it("should fail a call on a non-BigNumber as value", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "nonexistant", { args: [], value: true as any }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, "For call 'value' must be a BigNumber"); + }); }); describe("deployed contract", () => { @@ -534,6 +607,41 @@ describe("Validation", () => { "Artifact with name 'Nonexistant' doesn't exist" ); }); + + it("should not validate a contract with non-BigNumber value", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const nonexistant = m.contract("Nonexistant", { value: "42" as any }); + + return { nonexistant }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => false, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, "For contract 'value' must be a BigNumber"); + }); }); describe("hardhat library deploy", () => { diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index b2f95c231f..6289134316 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -53,7 +53,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.10.0", + "hardhat": "^2.12.0", "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", @@ -67,7 +67,7 @@ "peerDependencies": { "@ignored/ignition-core": "^0.0.3", "@nomiclabs/hardhat-ethers": "^2.0.2", - "hardhat": "^2.10.0" + "hardhat": "^2.12.0" }, "dependencies": { "debug": "^4.3.2", diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index a4f812284d..c0ed898503 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,4 +1,5 @@ /* eslint-disable import/no-unused-modules */ +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { deployModule } from "./helpers"; @@ -59,5 +60,67 @@ describe("calls", () => { ); }); + describe("passing value", () => { + it("should be able to call a contract passing a value", async function () { + const result = await deployModule(this.hre, (m) => { + const passingValue = m.contract("PassingValue"); + + m.call(passingValue, "deposit", { + args: [], + value: this.hre.ethers.utils.parseEther("1"), + }); + + return { passingValue }; + }); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + result.passingValue.address + ); + + assert.equal( + actualInstanceBalance.toString(), + this.hre.ethers.utils.parseEther("1").toString() + ); + }); + + it("should be able to call a contract passing a value via a parameter", async function () { + const submodule = buildModule("submodule", (m) => { + const depositValue = m.getParam("depositValue"); + + const passingValue = m.contract("PassingValue"); + + m.call(passingValue, "deposit", { + args: [], + value: depositValue, + }); + + return { passingValue }; + }); + + const result = await deployModule(this.hre, (m) => { + const { passingValue } = m.useModule(submodule, { + parameters: { + depositValue: this.hre.ethers.utils.parseEther("1"), + }, + }); + + return { passingValue }; + }); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + result.passingValue.address + ); + + assert.equal( + actualInstanceBalance.toString(), + this.hre.ethers.utils.parseEther("1").toString() + ); + }); + }); + it("should note fail if call fails"); }); diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index d2e3dada35..1d83cd5ad3 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,4 +1,5 @@ /* eslint-disable import/no-unused-modules */ +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { deployModule } from "./helpers"; @@ -91,4 +92,60 @@ describe("contract deploys", () => { assert.equal(greeting, "Hello World"); }); + + describe("with endowment", () => { + it("should be able to deploy a contract with an endowment", async function () { + const result = await deployModule(this.hre, (m) => { + const passingValue = m.contract("PassingValue", { + value: this.hre.ethers.utils.parseEther("1"), + }); + + return { passingValue }; + }); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + result.passingValue.address + ); + + assert.equal( + actualInstanceBalance.toString(), + this.hre.ethers.utils.parseEther("1").toString() + ); + }); + + it("should be able to deploy a contract with an endowment via a parameter", async function () { + const submodule = buildModule("submodule", (m) => { + const endowment = m.getParam("endowment"); + + const passingValue = m.contract("PassingValue", { + value: endowment, + }); + + return { passingValue }; + }); + + const result = await deployModule(this.hre, (m) => { + const { passingValue } = m.useModule(submodule, { + parameters: { + endowment: this.hre.ethers.utils.parseEther("1"), + }, + }); + + return { passingValue }; + }); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + result.passingValue.address + ); + + assert.equal( + actualInstanceBalance.toString(), + this.hre.ethers.utils.parseEther("1").toString() + ); + }); + }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 7b168b2d7d..c6d6336bf4 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -47,3 +47,9 @@ contract Greeter { return _greeting; } } + +contract PassingValue { + constructor() payable {} + + function deposit() public payable {} +} diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index b4022739ec..7af7f610ec 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -110,9 +110,9 @@ async function assertTxMined(hre: any, hash: string) { * Assert that `expectedBlocks.length` blocks are mined, and that * each mined block has `expectedBlocks[i]` transactions. */ -export async function deployModules( +export async function deployModules( hre: any, - userModules: Module[], + userModules: Array>, expectedBlocks: number[] ): Promise { await hre.run("compile", { quiet: true }); diff --git a/yarn.lock b/yarn.lock index c143440a15..202cbd609c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -323,7 +323,7 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -373,7 +373,7 @@ "@ethersproject/logger" "^5.6.0" "@ethersproject/rlp" "^5.6.1" -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -551,6 +551,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + dependencies: + "@ethersproject/abstract-provider" "^5.7.0" + "@ethersproject/abstract-signer" "^5.7.0" + "@ethersproject/address" "^5.7.0" + "@ethersproject/base64" "^5.7.0" + "@ethersproject/basex" "^5.7.0" + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/bytes" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/hash" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/networks" "^5.7.0" + "@ethersproject/properties" "^5.7.0" + "@ethersproject/random" "^5.7.0" + "@ethersproject/rlp" "^5.7.0" + "@ethersproject/sha2" "^5.7.0" + "@ethersproject/strings" "^5.7.0" + "@ethersproject/transactions" "^5.7.0" + "@ethersproject/web" "^5.7.0" + bech32 "1.1.4" + ws "7.4.6" + "@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" @@ -954,77 +980,122 @@ mcl-wasm "^0.7.1" rustbn.js "~0.2.0" -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.0.3.tgz#1d49e4ac028831a3011a9f3dca60bd1963185342" - integrity sha512-W+bIiNiZmiy+MTYFZn3nwjyPUO6wfWJ0lnXx2zZrM8xExKObMrhCh50yy8pQING24mHfpPFCn89wEB/iG7vZDw== +"@nomicfoundation/hardhat-chai-matchers@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.4.tgz#4b5c0d6eba637aabb49342272ae15ee6877a462e" + integrity sha512-n/5UMwGaUK2zM8ALuMChVwB1lEPeDTb5oBjQ1g7hVsUdS8x+XG9JIEp4Ze6Bwy98tghA7Y1+PCH4SNE2P3UQ2g== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@types/chai-as-promised" "^7.1.3" + chai-as-promised "^7.1.1" + chalk "^2.4.2" + deep-eql "^4.0.1" + ordinal "^1.0.3" -"@nomicfoundation/solidity-analyzer-darwin-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.0.3.tgz#c0fccecc5506ff5466225e41e65691abafef3dbe" - integrity sha512-HuJd1K+2MgmFIYEpx46uzwEFjvzKAI765mmoMxy4K+Aqq1p+q7hHRlsFU2kx3NB8InwotkkIq3A5FLU1sI1WDw== +"@nomicfoundation/hardhat-network-helpers@1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz#5e2026ddde5ca539f70a2bf498528afd08bd0827" + integrity sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ== + dependencies: + ethereumjs-util "^7.1.4" -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.0.3.tgz#8261d033f7172b347490cd005931ef8168ab4d73" - integrity sha512-2cR8JNy23jZaO/vZrsAnWCsO73asU7ylrHIe0fEsXbZYqBP9sMr+/+xP3CELDHJxUbzBY8zqGvQt1ULpyrG+Kw== +"@nomicfoundation/hardhat-toolbox@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz#7f86e35c380babb8f26440b7f9a92d7febc1a8ac" + integrity sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ== -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.0.3.tgz#1ba64b1d76425f8953dedc6367bd7dd46f31dfc5" - integrity sha512-Eyv50EfYbFthoOb0I1568p+eqHGLwEUhYGOxcRNywtlTE9nj+c+MT1LA53HnxD9GsboH4YtOOmJOulrjG7KtbA== +"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" + integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.0.3.tgz#8d864c49b55e683f7e3b5cce9d10b628797280ac" - integrity sha512-V8grDqI+ivNrgwEt2HFdlwqV2/EQbYAdj3hbOvjrA8Qv+nq4h9jhQUxFpegYMDtpU8URJmNNlXgtfucSrAQwtQ== +"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" + integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.0.3.tgz#16e769500cf1a8bb42ab9498cee3b93c30f78295" - integrity sha512-uRfVDlxtwT1vIy7MAExWAkRD4r9M79zMG7S09mCrWUn58DbLs7UFl+dZXBX0/8FTGYWHhOT/1Etw1ZpAf5DTrg== +"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" + integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.0.3.tgz#75f4e1a25526d54c506e4eba63b3d698b6255b8f" - integrity sha512-8HPwYdLbhcPpSwsE0yiU/aZkXV43vlXT2ycH+XlOjWOnLfH8C41z0njK8DHRtEFnp4OVN6E7E5lHBBKDZXCliA== +"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" + integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.0.3.tgz#ef6e20cfad5eedfdb145cc34a44501644cd7d015" - integrity sha512-5WWcT6ZNvfCuxjlpZOY7tdvOqT1kIQYlDF9Q42wMpZ5aTm4PvjdCmFDDmmTvyXEBJ4WTVmY5dWNWaxy8h/E28g== +"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" + integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.0.3.tgz#98c4e3af9cee68896220fa7e270aefdf7fc89c7b" - integrity sha512-P/LWGZwWkyjSwkzq6skvS2wRc3gabzAbk6Akqs1/Iiuggql2CqdLBkcYWL5Xfv3haynhL+2jlNkak+v2BTZI4A== +"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" + integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.0.3.tgz#12da288e7ef17ec14848f19c1e8561fed20d231d" - integrity sha512-4AcTtLZG1s/S5mYAIr/sdzywdNwJpOcdStGF3QMBzEt+cGn3MchMaS9b1gyhb2KKM2c39SmPF5fUuWq1oBSQZQ== +"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" + integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== -"@nomicfoundation/solidity-analyzer@^0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.0.3.tgz#d1029f872e66cb1082503b02cc8b0be12f8dd95e" - integrity sha512-VFMiOQvsw7nx5bFmrmVp2Q9rhIjw2AFST4DYvWVVO9PMHPE23BY2+kyfrQ4J3xCMFC8fcBbGLt7l4q7m1SlTqg== +"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" + integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== + +"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" + integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== + +"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" + integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== + +"@nomicfoundation/solidity-analyzer@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" + integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.0.3" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.0.3" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.0.3" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.0.3" + "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" + "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" + "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" + +"@nomiclabs/hardhat-ethers@2.2.1": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" + integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== "@nomiclabs/hardhat-ethers@^2.0.2": version "2.1.1" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== +"@nomiclabs/hardhat-etherscan@3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.2.tgz#1f9af26ce7db437eb705d46a99996811b43d0e4a" + integrity sha512-IEikeOVq0C/7CY6aD74d8L4BpGoc/FNiN6ldiPVg0QIFIUSu4FSGA1dmtJZJKk1tjpwgrfTLQNWnigtEaN9REg== + dependencies: + "@ethersproject/abi" "^5.1.2" + "@ethersproject/address" "^5.0.2" + cbor "^5.0.2" + chalk "^2.4.2" + debug "^4.1.1" + fs-extra "^7.0.1" + lodash "^4.17.11" + semver "^6.3.0" + table "^6.8.0" + undici "^5.4.0" + "@nomiclabs/hardhat-truffle5@^2.0.0": version "2.0.7" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz#7519eadd2c6c460c2addc3d4d6efda7a8883361e" @@ -1204,6 +1275,13 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== +"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": + version "0.14.5" + resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" + integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== + dependencies: + antlr4ts "^0.5.0-alpha.4" + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -1331,6 +1409,21 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== +"@typechain/ethers-v5@10.1.1": + version "10.1.1" + resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz#fdb527d8854129cea5f139d76c6c6e1c9bb040ec" + integrity sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw== + dependencies: + lodash "^4.17.15" + ts-essentials "^7.0.1" + +"@typechain/hardhat@6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.4.tgz#da930bf17bdae5e0996b86d37992c6c58b8a49c8" + integrity sha512-S8k5d1Rjc+plwKpkorlifmh72M7Ki0XNUOVVLtdbcA/vLaEkuqZSJFdddpBgS5QxiJP+6CbRa/yO6EVTE2+fMQ== + dependencies: + fs-extra "^9.1.0" + "@types/async-eventemitter@^0.2.1": version "0.2.1" resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" @@ -1360,7 +1453,7 @@ "@types/node" "*" "@types/responselike" "*" -"@types/chai-as-promised@^7.1.4": +"@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4": version "7.1.5" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== @@ -1372,6 +1465,13 @@ resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== +"@types/concat-stream@^1.6.0": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" + integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== + dependencies: + "@types/node" "*" + "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" @@ -1379,6 +1479,13 @@ dependencies: "@types/ms" "*" +"@types/form-data@0.0.33": + version "0.0.33" + resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" + integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== + dependencies: + "@types/node" "*" + "@types/fs-extra@^9.0.13": version "9.0.13" resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" @@ -1386,6 +1493,14 @@ dependencies: "@types/node" "*" +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/http-cache-semantics@*": version "4.0.1" resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" @@ -1438,6 +1553,11 @@ resolved "https://registry.yarnpkg.com/@types/mermaid/-/mermaid-9.1.0.tgz#e9ba511d8a6793749d6be84f86325f0f58553154" integrity sha512-rc8QqhveKAY7PouzY/p8ljS+eBSNCv7o79L97RSub/Ic2SQ34ph1Ng3s8wFLWVjvaEt6RLOWtSCsgYWd95NY8A== +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + "@types/mocha@^9.0.0": version "9.1.1" resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" @@ -1458,11 +1578,21 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== +"@types/node@^10.0.3": + version "10.17.60" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" + integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== + "@types/node@^12.12.6": version "12.20.55" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== +"@types/node@^8.0.0": + version "8.10.66" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" + integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== + "@types/object-hash@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-2.2.1.tgz#67c169f8f033e0b62abbf81df2d00f4598d540b9" @@ -1475,11 +1605,21 @@ dependencies: "@types/node" "*" +"@types/prettier@^2.1.1": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" + integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== +"@types/qs@^6.2.31": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + "@types/react@^17.0.35": version "17.0.50" resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.50.tgz#39abb4f7098f546cfcd6b51207c90c4295ee81fc" @@ -1616,6 +1756,16 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@1.0.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -1669,6 +1819,11 @@ acorn@^8.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== +address@^1.0.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" + integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== + adm-zip@^0.4.16: version "0.4.16" resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" @@ -1714,6 +1869,16 @@ ajv@^8.0.1: require-from-string "^2.0.2" uri-js "^4.2.2" +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-colors@3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + ansi-colors@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -1765,7 +1930,12 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@~3.1.2: +antlr4ts@^0.5.0-alpha.4: + version "0.5.0-alpha.4" + resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" + integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== + +anymatch@~3.1.1, anymatch@~3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== @@ -1802,6 +1972,16 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +array-back@^3.0.1, array-back@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" + integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== + +array-back@^4.0.1, array-back@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" + integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -1823,6 +2003,11 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array-uniq@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + array.prototype.flat@^1.2.4: version "1.3.0" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" @@ -1833,6 +2018,22 @@ array.prototype.flat@^1.2.4: es-abstract "^1.19.2" es-shim-unscopables "^1.0.0" +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + asn1.js@^5.2.0: version "5.4.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" @@ -1877,6 +2078,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async@1.x: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== + async@^2.4.0: version "2.6.4" resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" @@ -1889,6 +2095,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + auto-bind@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" @@ -2287,7 +2498,7 @@ caniuse-lite@^1.0.30001400: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg== -caseless@~0.12.0: +caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== @@ -2297,7 +2508,7 @@ catering@^2.1.0, catering@^2.1.1: resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== -cbor@^5.2.0: +cbor@^5.0.2, cbor@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== @@ -2305,13 +2516,26 @@ cbor@^5.2.0: bignumber.js "^9.0.1" nofilter "^1.0.4" -chai-as-promised@7.1.1: +chai-as-promised@7.1.1, chai-as-promised@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== dependencies: check-error "^1.0.2" +chai@4.3.7: + version "4.3.7" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" + integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.2" + deep-eql "^4.1.2" + get-func-name "^2.0.0" + loupe "^2.3.1" + pathval "^1.1.1" + type-detect "^4.0.5" + chai@^4.2.0, chai@^4.3.4: version "4.3.6" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" @@ -2366,6 +2590,11 @@ change-case@3.0.2: upper-case "^1.1.1" upper-case-first "^1.1.0" +"charenc@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -2396,6 +2625,21 @@ cheerio@^1.0.0-rc.2: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" +chokidar@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" + integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.2.0" + optionalDependencies: + fsevents "~2.1.1" + chokidar@3.5.3, chokidar@^3.4.0: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" @@ -2478,6 +2722,16 @@ cli-spinners@^2.3.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== +cli-table3@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" + integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== + dependencies: + object-assign "^4.1.0" + string-width "^2.1.1" + optionalDependencies: + colors "^1.1.2" + cli-truncate@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" @@ -2565,7 +2819,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colors@1.4.0: +colors@1.4.0, colors@^1.1.2: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -2582,6 +2836,26 @@ command-exists@^1.2.8: resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== +command-line-args@^5.1.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" + integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== + dependencies: + array-back "^3.1.0" + find-replace "^3.0.0" + lodash.camelcase "^4.3.0" + typical "^4.0.0" + +command-line-usage@^6.1.0: + version "6.1.3" + resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" + integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== + dependencies: + array-back "^4.0.2" + chalk "^2.4.2" + table-layout "^1.0.2" + typical "^5.2.0" + commander@2: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -2607,6 +2881,16 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +concat-stream@^1.6.0, concat-stream@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + constant-case@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" @@ -2673,6 +2957,11 @@ core-util-is@1.0.2: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cors@^2.8.1: version "2.8.5" resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" @@ -2749,6 +3038,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +"crypt@>= 0.0.1": + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + crypto-addr-codec@^0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" @@ -3325,6 +3619,11 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +death@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" + integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== + debug@2.6.9, debug@^2.2.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -3332,6 +3631,13 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9: dependencies: ms "2.0.0" +debug@3.2.6: + version "3.2.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" + integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== + dependencies: + ms "^2.1.1" + debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: version "4.3.4" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" @@ -3389,7 +3695,19 @@ deep-eql@^3.0.1: dependencies: type-detect "^4.0.0" -deep-is@^0.1.3: +deep-eql@^4.0.1, deep-eql@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" + integrity sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w== + dependencies: + type-detect "^4.0.0" + +deep-extend@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== @@ -3416,7 +3734,7 @@ define-lazy-prop@^2.0.0: resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4: +define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== @@ -3459,6 +3777,19 @@ detect-indent@^5.0.0: resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== +detect-port@^1.3.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" + integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== + dependencies: + address "^1.0.1" + debug "4" + +diff@3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== + diff@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" @@ -3483,6 +3814,13 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +difflib@^0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" + integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== + dependencies: + heap ">= 0.2.0" + dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" @@ -3648,7 +3986,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0: +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0, es-abstract@^1.20.4: version "1.20.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== @@ -3678,6 +4016,11 @@ es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19 string.prototype.trimstart "^1.0.5" unbox-primitive "^1.0.2" +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + es-shim-unscopables@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" @@ -3868,21 +4211,33 @@ escape-html@~1.0.3: resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== +escodegen@1.8.x: + version "1.8.1" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + eslint-config-prettier@8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" @@ -4039,6 +4394,11 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +esprima@2.7.x, esprima@^2.7.1: + version "2.7.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== + esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -4058,6 +4418,11 @@ esrecurse@^4.3.0: dependencies: estraverse "^5.2.0" +estraverse@^1.9.1: + version "1.9.3" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== + estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" @@ -4086,6 +4451,27 @@ eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8: idna-uts46-hx "^2.3.1" js-sha3 "^0.5.7" +eth-gas-reporter@^0.2.25: + version "0.2.25" + resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" + integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== + dependencies: + "@ethersproject/abi" "^5.0.0-beta.146" + "@solidity-parser/parser" "^0.14.0" + cli-table3 "^0.5.0" + colors "1.4.0" + ethereum-cryptography "^1.0.3" + ethers "^4.0.40" + fs-readdir-recursive "^1.1.0" + lodash "^4.17.14" + markdown-table "^1.1.3" + mocha "^7.1.1" + req-cwd "^2.0.0" + request "^2.88.0" + request-promise-native "^1.0.5" + sha1 "^1.1.1" + sync-request "^6.0.0" + eth-lib@0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" @@ -4189,7 +4575,43 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@^4.0.0-beta.1, ethers@^4.0.32: +ethers@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + dependencies: + "@ethersproject/abi" "5.7.0" + "@ethersproject/abstract-provider" "5.7.0" + "@ethersproject/abstract-signer" "5.7.0" + "@ethersproject/address" "5.7.0" + "@ethersproject/base64" "5.7.0" + "@ethersproject/basex" "5.7.0" + "@ethersproject/bignumber" "5.7.0" + "@ethersproject/bytes" "5.7.0" + "@ethersproject/constants" "5.7.0" + "@ethersproject/contracts" "5.7.0" + "@ethersproject/hash" "5.7.0" + "@ethersproject/hdnode" "5.7.0" + "@ethersproject/json-wallets" "5.7.0" + "@ethersproject/keccak256" "5.7.0" + "@ethersproject/logger" "5.7.0" + "@ethersproject/networks" "5.7.1" + "@ethersproject/pbkdf2" "5.7.0" + "@ethersproject/properties" "5.7.0" + "@ethersproject/providers" "5.7.2" + "@ethersproject/random" "5.7.0" + "@ethersproject/rlp" "5.7.0" + "@ethersproject/sha2" "5.7.0" + "@ethersproject/signing-key" "5.7.0" + "@ethersproject/solidity" "5.7.0" + "@ethersproject/strings" "5.7.0" + "@ethersproject/transactions" "5.7.0" + "@ethersproject/units" "5.7.0" + "@ethersproject/wallet" "5.7.0" + "@ethersproject/web" "5.7.1" + "@ethersproject/wordlists" "5.7.0" + +ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: version "4.0.49" resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== @@ -4363,7 +4785,7 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: +fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== @@ -4379,7 +4801,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== -fast-levenshtein@^2.0.6: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== @@ -4427,6 +4849,20 @@ find-cache-dir@^3.2.0: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-replace@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" + integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== + dependencies: + array-back "^3.0.1" + +find-up@3.0.0, find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + find-up@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -4450,13 +4886,6 @@ find-up@^2.0.0, find-up@^2.1.0: dependencies: locate-path "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -4473,6 +4902,13 @@ flat-cache@^3.0.4: flatted "^3.1.0" rimraf "^3.0.2" +flat@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" + integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== + dependencies: + is-buffer "~2.0.3" + flat@^5.0.2: version "5.0.2" resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" @@ -4513,6 +4949,15 @@ form-data-encoder@1.7.1: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== +form-data@^2.2.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" + integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -4576,7 +5021,7 @@ fs-extra@^4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" -fs-extra@^7.0.1: +fs-extra@^7.0.0, fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== @@ -4585,18 +5030,47 @@ fs-extra@^7.0.1: jsonfile "^4.0.0" universalify "^0.1.0" -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== +fs-extra@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" + integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== dependencies: - minipass "^2.6.0" + graceful-fs "^4.2.0" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" + integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== + dependencies: + minipass "^2.6.0" + +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== +fsevents@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== + fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" @@ -4661,6 +5135,11 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-port@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" + integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== + get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -4700,13 +5179,45 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -glob-parent@^5.1.2, glob-parent@~5.1.2: +ghost-testrpc@^0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" + integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== + dependencies: + chalk "^2.4.2" + node-emoji "^1.10.0" + +glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob@7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.7: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + glob@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" @@ -4719,7 +5230,18 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^5.0.15: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -4731,6 +5253,22 @@ glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + global@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -4756,6 +5294,20 @@ globalyzer@0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^11.0.3: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" @@ -4854,6 +5406,18 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== +handlebars@^4.0.1: + version "4.7.7" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -4867,10 +5431,19 @@ har-validator@~5.1.3: ajv "^6.12.3" har-schema "^2.0.0" -hardhat@^2.10.0: - version "2.11.2" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.11.2.tgz#c81388630255823bb1717ec07c4ee651b1fbe97f" - integrity sha512-BdsXC1CFJQDJKmAgCwpmGhFuVU6dcqlgMgT0Kg/xmFAFVugkpYu6NRmh4AaJ3Fah0/BR9DOR4XgQGIbg4eon/Q== +hardhat-gas-reporter@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" + integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== + dependencies: + array-uniq "1.0.3" + eth-gas-reporter "^0.2.25" + sha1 "^1.1.1" + +hardhat@^2.12.0: + version "2.12.2" + resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.2.tgz#6ae985007b20c1f381c6573799d66c1438c4c802" + integrity sha512-f3ZhzXy1uyQv0UXnAQ8GCBOWjzv++WJNb7bnm10SsyC3dB7vlPpsMWBNhq7aoRxKrNhX9tCev81KFV3i5BTeMQ== dependencies: "@ethersproject/abi" "^5.1.2" "@metamask/eth-sig-util" "^4.0.0" @@ -4884,7 +5457,7 @@ hardhat@^2.10.0: "@nomicfoundation/ethereumjs-tx" "^4.0.0" "@nomicfoundation/ethereumjs-util" "^8.0.0" "@nomicfoundation/ethereumjs-vm" "^6.0.0" - "@nomicfoundation/solidity-analyzer" "^0.0.3" + "@nomicfoundation/solidity-analyzer" "^0.1.0" "@sentry/node" "^5.18.1" "@types/bn.js" "^5.1.0" "@types/lru-cache" "^5.1.0" @@ -4928,6 +5501,11 @@ has-bigints@^1.0.1, has-bigints@^1.0.2: resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -4945,7 +5523,7 @@ has-property-descriptors@^1.0.0: dependencies: get-intrinsic "^1.1.1" -has-symbols@^1.0.2, has-symbols@^1.0.3: +has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -5015,6 +5593,11 @@ header-case@^1.0.0: no-case "^2.2.0" upper-case "^1.1.3" +"heap@>= 0.2.0": + version "0.2.7" + resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" + integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== + highlight.js@^10.4.1: version "10.7.3" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" @@ -5054,6 +5637,16 @@ htmlparser2@^8.0.1: domutils "^3.0.1" entities "^4.3.0" +http-basic@^8.1.1: + version "8.1.3" + resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" + integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== + dependencies: + caseless "^0.12.0" + concat-stream "^1.6.2" + http-response-object "^3.0.1" + parse-cache-control "^1.0.1" + http-cache-semantics@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" @@ -5075,6 +5668,13 @@ http-https@^1.0.0: resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== +http-response-object@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" + integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== + dependencies: + "@types/node" "^10.0.3" + http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" @@ -5139,7 +5739,7 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: +ignore@^5.1.1, ignore@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== @@ -5175,11 +5775,16 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + ink-spinner@4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-4.0.3.tgz#0d0f4a787ae1a4270928e063d9c52527cb264feb" @@ -5230,6 +5835,11 @@ internal-slot@^1.0.3: resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== +interpret@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -5282,7 +5892,7 @@ is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^2.0.5: +is-buffer@^2.0.5, is-buffer@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== @@ -5489,6 +6099,11 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -5588,14 +6203,15 @@ js-sha3@0.8.0, js-sha3@^0.8.0: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== +js-yaml@3.13.1: + version "3.13.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" + integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: - argparse "^2.0.1" + argparse "^1.0.7" + esprima "^4.0.0" -js-yaml@^3.13.1: +js-yaml@3.x, js-yaml@^3.13.1: version "3.14.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -5603,6 +6219,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -5688,6 +6311,11 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonschema@^1.2.4: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== + jsprim@^1.2.2: version "1.4.2" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" @@ -5731,6 +6359,11 @@ khroma@^2.0.0: resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + klaw@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" @@ -5774,6 +6407,14 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -5830,6 +6471,11 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -5850,11 +6496,18 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +log-symbols@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + log-symbols@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" @@ -5935,6 +6588,11 @@ make-error@^1.1.1: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +markdown-table@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" + integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== + mcl-wasm@^0.7.1: version "0.7.9" resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" @@ -5973,7 +6631,7 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== -merge2@^1.3.0, merge2@^1.4.1: +merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== @@ -6063,6 +6721,20 @@ minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== +"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" + minimatch@4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" @@ -6077,18 +6749,16 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.4, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - minimist@^1.2.0, minimist@^1.2.6: version "1.2.6" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +minimist@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + minipass@^2.6.0, minipass@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" @@ -6111,12 +6781,19 @@ mkdirp-promise@^5.0.1: dependencies: mkdirp "*" -mkdirp@*: +mkdirp@*, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mkdirp@^0.5.5: +mkdirp@0.5.5: + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== + dependencies: + minimist "^1.2.5" + +mkdirp@0.5.x, mkdirp@^0.5.5: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== @@ -6130,6 +6807,36 @@ mnemonist@^0.38.0: dependencies: obliterator "^2.0.0" +mocha@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" + integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + mocha@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" @@ -6158,6 +6865,36 @@ mocha@^10.0.0: yargs-parser "20.2.4" yargs-unparser "2.0.0" +mocha@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" + integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== + dependencies: + ansi-colors "3.2.3" + browser-stdout "1.3.1" + chokidar "3.3.0" + debug "3.2.6" + diff "3.5.0" + escape-string-regexp "1.0.5" + find-up "3.0.0" + glob "7.1.3" + growl "1.10.5" + he "1.2.0" + js-yaml "3.13.1" + log-symbols "3.0.0" + minimatch "3.0.4" + mkdirp "0.5.5" + ms "2.1.1" + node-environment-flags "1.0.6" + object.assign "4.1.0" + strip-json-comments "2.0.1" + supports-color "6.0.0" + which "1.3.1" + wide-align "1.1.3" + yargs "13.3.2" + yargs-parser "13.1.2" + yargs-unparser "1.6.0" + mocha@^9.1.1, mocha@^9.1.3: version "9.2.2" resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" @@ -6208,6 +6945,11 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== + ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" @@ -6293,6 +7035,11 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +neo-async@^2.6.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + next-tick@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" @@ -6326,6 +7073,21 @@ node-addon-api@^2.0.0: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== +node-emoji@^1.10.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" + integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== + dependencies: + lodash "^4.17.21" + +node-environment-flags@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" + integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== + dependencies: + object.getownpropertydescriptors "^2.0.3" + semver "^5.7.0" + node-fetch@2.6.7: version "2.6.7" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" @@ -6355,6 +7117,13 @@ nofilter@^1.0.4: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== +nopt@3.x: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== + dependencies: + abbrev "1" + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -6460,11 +7229,21 @@ object-inspect@^1.12.2, object-inspect@^1.9.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.1.1: +object-keys@^1.0.11, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object.assign@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" + integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== + dependencies: + define-properties "^1.1.2" + function-bind "^1.1.1" + has-symbols "^1.0.0" + object-keys "^1.0.11" + object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" @@ -6475,6 +7254,16 @@ object.assign@^4.1.4: has-symbols "^1.0.3" object-keys "^1.1.1" +object.getownpropertydescriptors@^2.0.3: + version "2.1.5" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" + integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + object.values@^1.1.4: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -6503,7 +7292,7 @@ on-finished@2.4.1: dependencies: ee-first "1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -6526,6 +7315,18 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" +optionator@^0.8.1: + version "0.8.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + optionator@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" @@ -6538,6 +7339,11 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" +ordinal@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" + integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== + os-locale@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" @@ -6683,6 +7489,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-cache-control@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" + integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== + parse-headers@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" @@ -6854,6 +7665,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -6885,6 +7701,11 @@ prelude-ls@^1.2.1: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== + prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -6902,6 +7723,16 @@ prettier@2.4.1: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@^2.3.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + process-on-spawn@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" @@ -6919,6 +7750,13 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise@^8.0.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -6972,7 +7810,7 @@ purecss@^2.1.0: resolved "https://registry.yarnpkg.com/purecss/-/purecss-2.1.0.tgz#7d7eca2896e57a75cf7620ccf73aa42ded4ddc97" integrity sha512-QIgWhat8QkHTXdejFJNwZuw0pZ7Mj0MHILHNz8sV6HZBfbWtHpW3b1+Q1D6W/9x4chFhaq9u4+Uk8YbwELzsXg== -qs@6.11.0, qs@^6.7.0: +qs@6.11.0, qs@^6.4.0, qs@^6.7.0: version "6.11.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== @@ -7096,6 +7934,19 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@^2.2.2: + version "2.3.7" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -7105,6 +7956,13 @@ readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readdirp@~3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" + integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== + dependencies: + picomatch "^2.0.4" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7112,6 +7970,25 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== + dependencies: + resolve "^1.1.6" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +reduce-flatten@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" + integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== + regenerator-runtime@^0.13.4: version "0.13.9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" @@ -7138,7 +8015,37 @@ release-zalgo@^1.0.0: dependencies: es6-error "^4.0.1" -request@^2.79.0: +req-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" + integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== + dependencies: + req-from "^2.0.0" + +req-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" + integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== + dependencies: + resolve-from "^3.0.0" + +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== + dependencies: + lodash "^4.17.19" + +request-promise-native@^1.0.5: + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== + dependencies: + request-promise-core "1.1.4" + stealthy-require "^1.1.1" + tough-cookie "^2.3.3" + +request@^2.79.0, request@^2.88.0: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -7194,6 +8101,11 @@ resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -7204,6 +8116,11 @@ resolve-from@^5.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== +resolve@1.1.x: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== + resolve@1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -7211,7 +8128,7 @@ resolve@1.17.0: dependencies: path-parse "^1.0.6" -resolve@^1.10.0, resolve@^1.20.0: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -7334,6 +8251,26 @@ safe-regex-test@^1.0.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sc-istanbul@^0.4.5: + version "0.4.6" + resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" + integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + scheduler@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" @@ -7361,7 +8298,7 @@ secp256k1@^4.0.1: node-addon-api "^2.0.0" node-gyp-build "^4.2.0" -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.7.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -7378,7 +8315,7 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.5: +semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== @@ -7468,6 +8405,14 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +sha1@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" + integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== + dependencies: + charenc ">= 0.0.1" + crypt ">= 0.0.1" + sha3@^2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" @@ -7504,6 +8449,15 @@ shell-quote@^1.6.1: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== +shelljs@^0.8.3: + version "0.8.5" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" + integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -7617,6 +8571,32 @@ solc@^0.4.20: semver "^5.3.0" yargs "^4.7.1" +solidity-coverage@0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" + integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== + dependencies: + "@ethersproject/abi" "^5.0.9" + "@solidity-parser/parser" "^0.14.1" + chalk "^2.4.2" + death "^1.1.0" + detect-port "^1.3.0" + difflib "^0.2.4" + fs-extra "^8.1.0" + ghost-testrpc "^0.0.2" + global-modules "^2.0.0" + globby "^10.0.1" + jsonschema "^1.2.4" + lodash "^4.17.15" + mocha "7.1.2" + node-emoji "^1.10.0" + pify "^4.0.1" + recursive-readdir "^2.2.2" + sc-istanbul "^0.4.5" + semver "^7.3.4" + shelljs "^0.8.3" + web3-utils "^1.3.6" + source-map-support@^0.5.13, source-map-support@^0.5.19: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -7630,6 +8610,13 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== +source-map@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== + dependencies: + amdefine ">=0.0.4" + spawn-wrap@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" @@ -7714,6 +8701,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +stealthy-require@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" + integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" @@ -7724,6 +8716,11 @@ strict-uri-encode@^1.0.0: resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== +string-format@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" + integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== + string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -7733,6 +8730,14 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" +"string-width@^1.0.2 || 2", string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string-width@^3.0.0, string-width@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" @@ -7776,6 +8781,13 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -7838,6 +8850,11 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== +strip-json-comments@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -7848,6 +8865,13 @@ stylis@^4.0.10: resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.2.tgz#870b3c1c2275f51b702bb3da9e94eedad87bba41" integrity sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA== +supports-color@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" + integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== + dependencies: + has-flag "^3.0.0" + supports-color@8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" @@ -7855,6 +8879,13 @@ supports-color@8.1.1: dependencies: has-flag "^4.0.0" +supports-color@^3.1.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== + dependencies: + has-flag "^1.0.0" + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -7899,6 +8930,22 @@ swarm-js@^0.1.40: tar "^4.0.2" xhr-request "^1.0.1" +sync-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" + integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== + dependencies: + http-response-object "^3.0.1" + sync-rpc "^1.2.1" + then-request "^6.0.0" + +sync-rpc@^1.2.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" + integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== + dependencies: + get-port "^3.1.0" + synckit@^0.8.3: version "0.8.4" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" @@ -7907,6 +8954,16 @@ synckit@^0.8.3: "@pkgr/utils" "^2.3.1" tslib "^2.4.0" +table-layout@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" + integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== + dependencies: + array-back "^4.0.1" + deep-extend "~0.6.0" + typical "^5.2.0" + wordwrapjs "^4.0.0" + table@^6.0.9: version "6.8.0" resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" @@ -7918,6 +8975,17 @@ table@^6.0.9: string-width "^4.2.3" strip-ansi "^6.0.1" +table@^6.8.0: + version "6.8.1" + resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + dependencies: + ajv "^8.0.1" + lodash.truncate "^4.4.2" + slice-ansi "^4.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + tapable@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -7955,6 +9023,23 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +then-request@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" + integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== + dependencies: + "@types/concat-stream" "^1.6.0" + "@types/form-data" "0.0.33" + "@types/node" "^8.0.0" + "@types/qs" "^6.2.31" + caseless "~0.12.0" + concat-stream "^1.6.0" + form-data "^2.2.0" + http-basic "^8.1.1" + http-response-object "^3.0.1" + promise "^8.0.0" + qs "^6.4.0" + throat@^4.0.0, throat@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" @@ -8022,7 +9107,7 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== -tough-cookie@~2.5.0: +tough-cookie@^2.3.3, tough-cookie@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== @@ -8035,6 +9120,21 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +ts-command-line-args@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" + integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== + dependencies: + chalk "^4.1.0" + command-line-args "^5.1.1" + command-line-usage "^6.1.0" + string-format "^2.0.0" + +ts-essentials@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" + integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== + ts-node@10.8.1: version "10.8.1" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" @@ -8124,6 +9224,13 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== + dependencies: + prelude-ls "~1.1.2" + type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" @@ -8172,6 +9279,22 @@ type@^2.7.2: resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== +typechain@8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" + integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== + dependencies: + "@types/prettier" "^2.1.1" + debug "^4.3.1" + fs-extra "^7.0.0" + glob "7.1.7" + js-sha3 "^0.8.0" + lodash "^4.17.15" + mkdirp "^1.0.4" + prettier "^2.3.1" + ts-command-line-args "^2.2.0" + ts-essentials "^7.0.1" + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -8179,11 +9302,31 @@ typedarray-to-buffer@^3.1.5: dependencies: is-typedarray "^1.0.0" +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + typescript@^4.7.4: version "4.8.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typical@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" + integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== + +typical@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" + integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== + +uglify-js@^3.1.4: + version "3.17.4" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" + integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== + ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" @@ -8277,7 +9420,7 @@ utf8@3.0.0, utf8@^3.0.0: resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== -util-deprecate@^1.0.1: +util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== @@ -8775,7 +9918,7 @@ web3-utils@1.7.4: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@1.8.0, web3-utils@^1.0.0-beta.31: +web3-utils@1.8.0, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: version "1.8.0" resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== @@ -8872,6 +10015,13 @@ which-typed-array@^1.1.2: has-tostringtag "^1.0.0" is-typed-array "^1.1.9" +which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -8879,12 +10029,12 @@ which@2.0.2, which@^2.0.1: dependencies: isexe "^2.0.0" -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== +wide-align@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" + integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== dependencies: - isexe "^2.0.0" + string-width "^1.0.2 || 2" widest-line@^3.1.0: version "3.1.0" @@ -8898,11 +10048,24 @@ window-size@^0.2.0: resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== -word-wrap@^1.2.3: +word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +wordwrapjs@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" + integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== + dependencies: + reduce-flatten "^2.0.0" + typical "^5.2.0" + workerpool@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" @@ -9074,12 +10237,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^13.1.2: +yargs-parser@13.1.2, yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== @@ -9087,6 +10245,11 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@20.2.4: + version "20.2.4" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" + integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -9108,6 +10271,15 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-unparser@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" + integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== + dependencies: + flat "^4.1.0" + lodash "^4.17.15" + yargs "^13.3.0" + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -9118,20 +10290,7 @@ yargs-unparser@2.0.0: flat "^5.0.2" is-plain-obj "^2.1.0" -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^13.0.0: +yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== @@ -9147,6 +10306,19 @@ yargs@^13.0.0: y18n "^4.0.0" yargs-parser "^13.1.2" +yargs@16.2.0: + version "16.2.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + yargs@^15.0.2: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" From 4e3ee737219c7d351fd015f0dd1b3eba9717c4ba Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 16 Nov 2022 10:06:11 +0000 Subject: [PATCH 0169/1302] docs(readme): add experimental warning A warning to clarify the status of the Ignition code, specifically that is is still under active development, the api will change, we are pre-alpha. --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index ca722b6bb0..3062c515bf 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Ignition +> **WARNING**: This repository is **highly experimental**, and is under **active development**. Any code or binaries produced from this project **should not be used in any production or critical workloads**. The API is preliminary, **the API will change**. + Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. From 8d9405012a8de33cfe2781fb326c8f4260feb489 Mon Sep 17 00:00:00 2001 From: Morgan Date: Thu, 17 Nov 2022 04:54:44 -0500 Subject: [PATCH 0170/1302] Support setting module params from JSON file (#64) * module params are now read from a file instead of json string * error message and param file path function * add param string back --- docs/getting-started-guide.md | 15 +++- .../hardhat-plugin/src/ignition-wrapper.ts | 4 +- packages/hardhat-plugin/src/index.ts | 72 +++++++++++++++---- yarn.lock | 2 +- 4 files changed, 75 insertions(+), 18 deletions(-) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 2e5616fd4b..ad4662d71f 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -93,7 +93,20 @@ Run the `deploy` task to test the module against an ephemeral **Hardhat** node ( npx hardhat deploy LockModule.js ``` -Parameters can be passed as a flag at the command line via a json string: +A relative path to a file containing module parameters can be passed as a flag at the command line: + +```json +// ignition/LockModule.config.json +{ + "unlockTime": 4102491600 +} +``` + +```bash +npx hardhat deploy --parameters ignition/LockModule.config.json LockModule.js +``` + +Parameters can also be passed at the command line via a json string: ```bash npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule.js diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 6fe3429762..ee653a75a2 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -26,13 +26,13 @@ export class IgnitionWrapper { public async deploy( ignitionModule: Module, deployParams?: { - parameters: { [key: string]: ExternalParamValue }; + parameters?: { [key: string]: ExternalParamValue }; ui?: boolean; } ) { const showUi = deployParams?.ui ?? false; - if (deployParams !== undefined) { + if (deployParams?.parameters !== undefined) { await this._providers.config.setParams(deployParams.parameters); } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 95e5273ac9..a9085a3c00 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,6 +1,7 @@ import "@nomiclabs/hardhat-ethers"; import { Module, ModuleDict, Providers } from "@ignored/ignition-core"; import { BigNumber } from "ethers"; +import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -18,6 +19,10 @@ export interface IgnitionConfig { gasIncrementPerRetry: BigNumber | null; } +interface ModuleParams { + [key: string]: number | string; +} + /* ignition config defaults */ const IGNITION_DIR = "ignition"; const DEPLOYMENTS_DIR = "deployments"; @@ -117,29 +122,18 @@ task("deploy") .addOptionalVariadicPositionalParam("userModulesPaths") .addOptionalParam( "parameters", - "A json object as a string, of the module parameters" + "A JSON object as a string, of the module parameters, or a relative path to a JSON file" ) .setAction( async ( { userModulesPaths = [], - parameters: parametersAsJson, + parameters: parametersInput, }: { userModulesPaths: string[]; parameters?: string }, hre ) => { await hre.run("compile", { quiet: true }); - let parameters: { [key: string]: number | string }; - try { - parameters = - parametersAsJson !== undefined - ? JSON.parse(parametersAsJson) - : undefined; - } catch { - console.warn("Could not parse parameters json"); - process.exit(0); - } - let userModules: Array>; if (userModulesPaths.length === 0) { userModules = loadAllUserModules(hre.config.paths.ignition); @@ -155,7 +149,21 @@ task("deploy") process.exit(0); } - await hre.ignition.deploy(userModules[0], { parameters, ui: true }); + const [userModule] = userModules; + + let parameters: ModuleParams | undefined; + if (parametersInput === undefined) { + parameters = resolveParametersFromModuleName( + userModule.name, + hre.config.paths.ignition + ); + } else if (parametersInput.endsWith(".json")) { + parameters = resolveParametersFromFileName(parametersInput); + } else { + parameters = resolveParametersString(parametersInput); + } + + await hre.ignition.deploy(userModule, { parameters, ui: true }); } ); @@ -207,3 +215,39 @@ task("plan") } } ); + +function resolveParametersFromModuleName( + moduleName: string, + ignitionPath: string +): ModuleParams | undefined { + const files = fs.readdirSync(ignitionPath); + const configFilename = `${moduleName}.config.json`; + + return files.includes(configFilename) + ? resolveConfigPath(path.resolve(ignitionPath, configFilename)) + : undefined; +} + +function resolveParametersFromFileName(fileName: string): ModuleParams { + const filepath = path.resolve(process.cwd(), fileName); + + return resolveConfigPath(filepath); +} + +function resolveConfigPath(filepath: string): ModuleParams { + try { + return require(filepath); + } catch { + console.warn(`Could not parse parameters from ${filepath}`); + process.exit(0); + } +} + +function resolveParametersString(paramString: string): ModuleParams { + try { + return JSON.parse(paramString); + } catch { + console.warn(`Could not parse JSON parameters`); + process.exit(0); + } +} diff --git a/yarn.lock b/yarn.lock index 202cbd609c..563dd4c834 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5440,7 +5440,7 @@ hardhat-gas-reporter@1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" -hardhat@^2.12.0: +hardhat@^2.10.0, hardhat@^2.12.0: version "2.12.2" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.2.tgz#6ae985007b20c1f381c6573799d66c1438c4c802" integrity sha512-f3ZhzXy1uyQv0UXnAQ8GCBOWjzv++WJNb7bnm10SsyC3dB7vlPpsMWBNhq7aoRxKrNhX9tCev81KFV3i5BTeMQ== From 4b9e17fc00b63b0ba561aa9ba690c62bdf9e2d21 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 17 Nov 2022 15:52:03 -0300 Subject: [PATCH 0171/1302] Add LICENSE --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..347e6d66a9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 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. \ No newline at end of file From b5da9424153e453fb3383e716115782c2e2d76a4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 7 Oct 2022 14:33:44 +0100 Subject: [PATCH 0172/1302] docs: add a uniswap example Add a uniswap example based on the `uniswap-v3-deployer`. --- README.md | 3 +- examples/uniswap/.eslintrc.js | 14 + examples/uniswap/.gitignore | 9 + examples/uniswap/.prettierignore | 5 + examples/uniswap/README.md | 19 + examples/uniswap/contracts/Florin.sol | 13 + examples/uniswap/contracts/Solidus.sol | 13 + examples/uniswap/contracts/Uniswap.sol | 12 + examples/uniswap/contracts/WETH9.sol | 758 ++++++++++++ examples/uniswap/hardhat.config.js | 39 + examples/uniswap/ignition/Uniswap.js | 159 +++ examples/uniswap/package.json | 39 + examples/uniswap/test/helpers.js | 65 ++ examples/uniswap/test/uniswap-test.js | 164 +++ packages/hardhat-plugin/package.json | 4 +- yarn.lock | 1483 +++++++++++++----------- 16 files changed, 2139 insertions(+), 660 deletions(-) create mode 100644 examples/uniswap/.eslintrc.js create mode 100644 examples/uniswap/.gitignore create mode 100644 examples/uniswap/.prettierignore create mode 100644 examples/uniswap/README.md create mode 100644 examples/uniswap/contracts/Florin.sol create mode 100644 examples/uniswap/contracts/Solidus.sol create mode 100644 examples/uniswap/contracts/Uniswap.sol create mode 100644 examples/uniswap/contracts/WETH9.sol create mode 100644 examples/uniswap/hardhat.config.js create mode 100644 examples/uniswap/ignition/Uniswap.js create mode 100644 examples/uniswap/package.json create mode 100644 examples/uniswap/test/helpers.js create mode 100644 examples/uniswap/test/uniswap-test.js diff --git a/README.md b/README.md index 3062c515bf..296c9b0d91 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,8 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Simple](./examples/simple/README.md) - [ENS](./examples/ens/README.md) -- [Create2](./examples//create2/README.md) +- [Create2](./examples/create2/README.md) +- [Uniswap](./examples/uniswap/README.md) ## Contributing diff --git a/examples/uniswap/.eslintrc.js b/examples/uniswap/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/uniswap/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/uniswap/.gitignore b/examples/uniswap/.gitignore new file mode 100644 index 0000000000..36077f2884 --- /dev/null +++ b/examples/uniswap/.gitignore @@ -0,0 +1,9 @@ +node_modules +.env +coverage +coverage.json +typechain + +#Hardhat files +cache +artifacts diff --git a/examples/uniswap/.prettierignore b/examples/uniswap/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/uniswap/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/uniswap/README.md b/examples/uniswap/README.md new file mode 100644 index 0000000000..b6579d390b --- /dev/null +++ b/examples/uniswap/README.md @@ -0,0 +1,19 @@ +# Uniswap Example for Ignition + +This hardhat project is an example of using ignition to deploy the Uniswap system of contracts, based on the [_Deploy Uniswap v3 script_](https://github.com/Uniswap/deploy-v3). + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy Uniswap.js +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` diff --git a/examples/uniswap/contracts/Florin.sol b/examples/uniswap/contracts/Florin.sol new file mode 100644 index 0000000000..a23ca454f2 --- /dev/null +++ b/examples/uniswap/contracts/Florin.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.7.6; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract Florin is ERC20, Ownable { + constructor() ERC20("Florin", "FN") {} + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } +} diff --git a/examples/uniswap/contracts/Solidus.sol b/examples/uniswap/contracts/Solidus.sol new file mode 100644 index 0000000000..4a8e725e12 --- /dev/null +++ b/examples/uniswap/contracts/Solidus.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.7.6; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; +import "@openzeppelin/contracts/access/Ownable.sol"; + +contract Solidus is ERC20, Ownable { + constructor() ERC20("Solidus", "SO") {} + + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } +} diff --git a/examples/uniswap/contracts/Uniswap.sol b/examples/uniswap/contracts/Uniswap.sol new file mode 100644 index 0000000000..500c289377 --- /dev/null +++ b/examples/uniswap/contracts/Uniswap.sol @@ -0,0 +1,12 @@ +//SPDX-License-Identifier: Unlicense +pragma solidity ^0.7.6; +// import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; +// import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; +// import "@uniswap/v3-core/contracts/interfaces/IERC20Minimal.sol"; +// import "@uniswap/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol"; +// import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; + +// import "./core/UniswapV3Factory.sol"; +// import "./periphery/SwapRouter.sol"; + +import "@openzeppelin/contracts/proxy/ProxyAdmin.sol"; diff --git a/examples/uniswap/contracts/WETH9.sol b/examples/uniswap/contracts/WETH9.sol new file mode 100644 index 0000000000..363c81cd35 --- /dev/null +++ b/examples/uniswap/contracts/WETH9.sol @@ -0,0 +1,758 @@ +// Copyright (C) 2015, 2016, 2017 Dapphub + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +pragma solidity >=0.4.22 <0.6; + +contract WETH9 { + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + function() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + msg.sender.transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; + } + + balanceOf[src] -= wad; + balanceOf[dst] += wad; + + emit Transfer(src, dst, wad); + + return true; + } +} + +/* + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. + +*/ diff --git a/examples/uniswap/hardhat.config.js b/examples/uniswap/hardhat.config.js new file mode 100644 index 0000000000..08c4c1b029 --- /dev/null +++ b/examples/uniswap/hardhat.config.js @@ -0,0 +1,39 @@ +require("@nomicfoundation/hardhat-toolbox"); +require("@ignored/hardhat-ignition"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: { + compilers: [ + { + version: "0.5.5", + }, + { + version: "0.7.6", + settings: { + optimizer: { + enabled: true, + runs: 800, + }, + metadata: { + // do not include the metadata hash, since this is machine dependent + // and we want all generated code to be deterministic + // https://docs.soliditylang.org/en/v0.7.6/metadata.html + bytecodeHash: "none", + }, + }, + }, + ], + }, + networks: { + hardhat: { + mining: { + // auto: false + }, + blockGasLimit: 5_000_000_000, + initialBaseFeePerGas: 1_000_000_000, + }, + }, +}; diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js new file mode 100644 index 0000000000..5075d803f0 --- /dev/null +++ b/examples/uniswap/ignition/Uniswap.js @@ -0,0 +1,159 @@ +const { buildModule } = require("@ignored/hardhat-ignition"); + +const UniswapV3Factory = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json"); +const UniswapInterfaceMulticall = require("@uniswap/v3-periphery/artifacts/contracts/lens/UniswapInterfaceMulticall.sol/UniswapInterfaceMulticall.json"); +const ProxyAdmin = require("@openzeppelin/contracts/build/contracts/ProxyAdmin.json"); +const TickLens = require("@uniswap/v3-periphery/artifacts/contracts/lens/TickLens.sol/TickLens.json"); +const NFTDescriptor = require("v3-periphery-1_3_0/artifacts/contracts/libraries/NFTDescriptor.sol/NFTDescriptor.json"); +const NonfungibleTokenPositionDescriptor = require("v3-periphery-1_3_0/artifacts/contracts/NonfungibleTokenPositionDescriptor.sol/NonfungibleTokenPositionDescriptor.json"); +const TransparentUpgradeableProxy = require("@openzeppelin/contracts/build/contracts/TransparentUpgradeableProxy.json"); +const NonfungiblePositionManager = require("@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json"); +const V3Migrator = require("@uniswap/v3-periphery/artifacts/contracts/V3Migrator.sol/V3Migrator.json"); +const UniswapV3Staker = require("@uniswap/v3-staker/artifacts/contracts/UniswapV3Staker.sol/UniswapV3Staker.json"); +const QuoterV2 = require("@uniswap/swap-router-contracts/artifacts/contracts/lens/QuoterV2.sol/QuoterV2.json"); +const SwapRouter02 = require("@uniswap/swap-router-contracts/artifacts/contracts/SwapRouter02.sol/SwapRouter02.json"); + +const ONE_BP_FEE = 100; +const ONE_BP_TICK_SPACING = 1; +const NATIVE_CURRENCY_LABEL = "ETH"; + +const ONE_MINUTE_SECONDS = 60; +const ONE_HOUR_SECONDS = ONE_MINUTE_SECONDS * 60; +const ONE_DAY_SECONDS = ONE_HOUR_SECONDS * 24; +const ONE_MONTH_SECONDS = ONE_DAY_SECONDS * 30; +const ONE_YEAR_SECONDS = ONE_DAY_SECONDS * 365; + +// 2592000 +const MAX_INCENTIVE_START_LEAD_TIME = ONE_MONTH_SECONDS; +// 1892160000 +const MAX_INCENTIVE_DURATION = ONE_YEAR_SECONDS * 2; + +const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; + +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + +function isAscii(str) { + return /^[\x00-\x7F]*$/.test(str); +} + +function asciiStringToBytes32(str) { + if (str.length > 32 || !isAscii(str)) { + throw new Error("Invalid label, must be less than 32 characters"); + } + + return "0x" + Buffer.from(str, "ascii").toString("hex").padEnd(64, "0"); +} + +module.exports = buildModule("Uniswap", (m) => { + const owner = ACCOUNT_0; + const v2CoreFactoryAddress = ADDRESS_ZERO; + + const weth9 = m.contract("WETH9"); + + // DEPLOY_V3_CORE_FACTORY + const uniswapV3Factory = m.contract("UniswapV3Factory", UniswapV3Factory); + + // 1 - add-1bp-fee-tier + m.call(uniswapV3Factory, "enableFeeAmount", { + args: [ONE_BP_FEE, ONE_BP_TICK_SPACING], + }); + + // 2 - deploy-multicall2 + const multicall2Address = m.contract("Multicall2", UniswapInterfaceMulticall); + + // DEPLOY_PROXY_ADMIN + const proxyAdmin = m.contract("ProxyAdmin", ProxyAdmin); + + // DEPLOY_TICK_LENS + const tickLens = m.contract("TickLens", TickLens); + + // DEPLOY_NFT_DESCRIPTOR_LIBRARY_V1_3_0 + const nftDescriptor = m.contract("NFTDescriptor", NFTDescriptor); + + // DEPLOY_NFT_POSITION_DESCRIPTOR_V1_3_0 + const nonfungibleTokenPositionDescriptor = m.contract( + "nonfungibleTokenPositionDescriptorAddressV1_3_0", + NonfungibleTokenPositionDescriptor, + { + args: [weth9, asciiStringToBytes32(NATIVE_CURRENCY_LABEL)], + libraries: { + NFTDescriptor: nftDescriptor, + }, + } + ); + + // DEPLOY_TRANSPARENT_PROXY_DESCRIPTOR + const descriptorProxy = m.contract( + "TransparentUpgradeableProxy", + TransparentUpgradeableProxy, + { + args: [nonfungibleTokenPositionDescriptor, proxyAdmin, "0x"], + } + ); + + // DEPLOY_NONFUNGIBLE_POSITION_MANAGER + const nonfungibleTokenPositionManager = m.contract( + "NonfungibleTokenPositionManager", + NonfungiblePositionManager, + { + args: [uniswapV3Factory, weth9, descriptorProxy], + } + ); + + // DEPLOY_V3_MIGRATOR + const v3Migrator = m.contract("V3Migrator", V3Migrator, { + args: [uniswapV3Factory, weth9, nonfungibleTokenPositionManager], + }); + + // TRANSFER_V3_CORE_FACTORY_OWNER + m.call(uniswapV3Factory, "setOwner", { + args: [owner], + after: [v3Migrator], + }); + + // DEPLOY_V3_STAKER + const v3Staker = m.contract("UniswapV3Staker", UniswapV3Staker, { + args: [ + uniswapV3Factory, + nonfungibleTokenPositionManager, + MAX_INCENTIVE_START_LEAD_TIME, + MAX_INCENTIVE_DURATION, + ], + }); + + // DEPLOY_QUOTER_V2 + const quoterV2 = m.contract("QuoterV2", QuoterV2, { + args: [uniswapV3Factory, weth9], + }); + + // DEPLOY_V3_SWAP_ROUTER_02 + const swapRouter02 = m.contract("SwapRouter02", SwapRouter02, { + args: [ + v2CoreFactoryAddress, + uniswapV3Factory, + nonfungibleTokenPositionManager, + weth9, + ], + }); + + // TRANSFER_PROXY_ADMIN + m.call(proxyAdmin, "transferOwnership", { + args: [owner], + }); + + return { + weth9, + uniswapV3Factory, + multicall2Address, + proxyAdmin, + tickLens, + nftDescriptor, + nonfungibleTokenPositionDescriptor, + descriptorProxy, + nonfungibleTokenPositionManager, + v3Migrator, + v3Staker, + quoterV2, + swapRouter02, + }; +}); diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json new file mode 100644 index 0000000000..d83ff0af4b --- /dev/null +++ b/examples/uniswap/package.json @@ -0,0 +1,39 @@ +{ + "name": "@nomicfoundation/ignition-uniswap-example", + "private": true, + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.3", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + }, + "dependencies": { + "@uniswap/swap-router-contracts": "1.1.0", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.1.1", + "@uniswap/v3-sdk": "3.9.0", + "@uniswap/v3-staker": "1.0.2", + "bignumber.js": "9.1.0", + "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" + } +} diff --git a/examples/uniswap/test/helpers.js b/examples/uniswap/test/helpers.js new file mode 100644 index 0000000000..a7f59fe654 --- /dev/null +++ b/examples/uniswap/test/helpers.js @@ -0,0 +1,65 @@ +const bn = require("bignumber.js"); +const { BigNumber } = require("ethers"); + +bn.config({ EXPONENTIAL_AT: 999999, DECIMAL_PLACES: 40 }); + +// returns the sqrt price as a 64x96 +function encodePriceSqrt(reserve1, reserve0) { + return BigNumber.from( + new bn(reserve1.toString()) + .div(reserve0.toString()) + .sqrt() + .multipliedBy(new bn(2).pow(96)) + .integerValue(3) + .toString() + ); +} + +async function getPoolImmutables(poolContract) { + const [factory, token0, token1, fee, tickSpacing, maxLiquidityPerTick] = + await Promise.all([ + poolContract.factory(), + poolContract.token0(), + poolContract.token1(), + poolContract.fee(), + poolContract.tickSpacing(), + poolContract.maxLiquidityPerTick(), + ]); + + const immutables = { + factory, + token0, + token1, + fee, + tickSpacing, + maxLiquidityPerTick, + }; + + return immutables; +} + +async function getPoolState(poolContract) { + const [liquidity, slot] = await Promise.all([ + poolContract.liquidity(), + poolContract.slot0(), + ]); + + const PoolState = { + liquidity, + sqrtPriceX96: slot[0], + tick: slot[1], + observationIndex: slot[2], + observationCardinality: slot[3], + observationCardinalityNext: slot[4], + feeProtocol: slot[5], + unlocked: slot[6], + }; + + return PoolState; +} + +module.exports = { + encodePriceSqrt, + getPoolImmutables, + getPoolState, +}; diff --git a/examples/uniswap/test/uniswap-test.js b/examples/uniswap/test/uniswap-test.js new file mode 100644 index 0000000000..9f43896d97 --- /dev/null +++ b/examples/uniswap/test/uniswap-test.js @@ -0,0 +1,164 @@ +const { assert } = require("chai"); +const { Token } = require("@uniswap/sdk-core"); +const { Pool, Position, nearestUsableTick } = require("@uniswap/v3-sdk"); +const UniswapV3Pool = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Pool.sol/UniswapV3Pool.json"); +const UniswapModule = require("../ignition/Uniswap"); +const { + encodePriceSqrt, + getPoolImmutables, + getPoolState, +} = require("./helpers"); + +describe("Uniswap", function () { + const fee = 500; + let owner, user1, solidus, florin; + let nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02; + let pool; + + before(async () => { + const [sign1, sign2] = await hre.ethers.getSigners(); + owner = sign1; + user1 = sign2; + + // Deploy Uniswap + ({ nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02 } = + await ignition.deploy(UniswapModule)); + + // Deploy example tokens Solidus and Florin + const Solidus = await hre.ethers.getContractFactory("Solidus"); + solidus = await Solidus.deploy(); + + const Florin = await hre.ethers.getContractFactory("Florin"); + florin = await Florin.deploy(); + + // Create pool for solidus/florin + await nonfungibleTokenPositionManager.createAndInitializePoolIfNecessary( + solidus.address, + florin.address, + fee, + encodePriceSqrt(1, 1), + { gasLimit: 5000000 } + ); + + const poolAddress = await uniswapV3Factory.getPool( + solidus.address, + florin.address, + fee + ); + + pool = await hre.ethers.getContractAtFromArtifact( + UniswapV3Pool, + poolAddress + ); + + // Add liquidity to pool + await solidus.mint(owner.address, hre.ethers.utils.parseUnits("1000", 18)); + await solidus + .connect(owner) + .approve( + nonfungibleTokenPositionManager.address, + hre.ethers.utils.parseUnits("1000", 18) + ); + + await florin.mint(owner.address, hre.ethers.utils.parseUnits("1000", 18)); + await florin + .connect(owner) + .approve( + nonfungibleTokenPositionManager.address, + hre.ethers.utils.parseUnits("1000", 18) + ); + + const [poolImmutables, poolState] = await Promise.all([ + getPoolImmutables(pool), + getPoolState(pool), + ]); + + const SolidusToken = new Token( + 31337, + poolImmutables.token0, + 18, + "SO", + "Solidus" + ); + + const FlorinToken = new Token( + 31337, + poolImmutables.token1, + 18, + "FN", + "Florin" + ); + + const poolFromSdk = new Pool( + SolidusToken, + FlorinToken, + poolImmutables.fee, + poolState.sqrtPriceX96.toString(), + poolState.liquidity.toString(), + poolState.tick + ); + + const position = new Position({ + pool: poolFromSdk, + liquidity: hre.ethers.utils.parseUnits("1", 18), + tickLower: + nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) - + poolImmutables.tickSpacing * 2, + tickUpper: + nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) + + poolImmutables.tickSpacing * 2, + }); + + const { amount0: amount0Desired, amount1: amount1Desired } = + position.mintAmounts; + + await nonfungibleTokenPositionManager.connect(owner).mint( + { + token0: solidus.address, + token1: florin.address, + fee: fee, + tickLower: + nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) - + poolImmutables.tickSpacing * 2, + tickUpper: + nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) + + poolImmutables.tickSpacing * 2, + amount0Desired: amount0Desired.toString(), + amount1Desired: amount1Desired.toString(), + amount0Min: 0, + amount1Min: 0, + recipient: owner.address, + deadline: Math.floor(Date.now() / 1000) + 60 * 10, + }, + { gasLimit: "1000000" } + ); + }); + + it("should allow swapping from florin token to solidus token", async function () { + // arrange + const amountToSwap = 100; + + // add that amount to the users florin's balance + await florin.mint(user1.address, 100); + await florin.connect(user1).approve(swapRouter02.address, 100); + + assert.equal(await florin.balanceOf(user1.address), 100); + assert.equal(await solidus.balanceOf(user1.address), 0); + + // act + await swapRouter02.connect(user1).exactInputSingle({ + tokenIn: florin.address, + tokenOut: solidus.address, + fee, + recipient: user1.address, + deadline: Math.floor(Date.now() / 1000) + 60 * 10, + amountIn: amountToSwap, + amountOutMinimum: 0, + sqrtPriceLimitX96: 0, + }); + + // assert + assert.equal(await florin.balanceOf(user1.address), 0); + assert.equal(await solidus.balanceOf(user1.address), 98); + }); +}); diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 6289134316..a5c7f48bfd 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -32,13 +32,15 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", "@ignored/ignition-core": "^0.0.3", + "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/debug": "^4.1.7", + "@types/dompurify": "2.4.0", "@types/fs-extra": "^9.0.13", + "@types/lodash": "4.14.189", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", "@types/node": "12.20.25", diff --git a/yarn.lock b/yarn.lock index 563dd4c834..0e30f57587 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,47 +24,47 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/compat-data@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.3.tgz#707b939793f867f5a73b2666e6d9a3396eb03151" - integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw== +"@babel/compat-data@^7.20.0": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" + integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== "@babel/core@^7.7.5": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" - integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ== + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" + integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" - "@babel/helper-compilation-targets" "^7.19.3" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.3" + "@babel/generator" "^7.20.2" + "@babel/helper-compilation-targets" "^7.20.0" + "@babel/helper-module-transforms" "^7.20.2" + "@babel/helpers" "^7.20.1" + "@babel/parser" "^7.20.2" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.1" semver "^6.3.0" -"@babel/generator@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.19.3.tgz#d7f4d1300485b4547cb6f94b27d10d237b42bf59" - integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ== +"@babel/generator@^7.20.1", "@babel/generator@^7.20.2": + version "7.20.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" + integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== dependencies: - "@babel/types" "^7.19.3" + "@babel/types" "^7.20.2" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz#a10a04588125675d7c7ae299af86fa1b2ee038ca" - integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg== +"@babel/helper-compilation-targets@^7.20.0": + version "7.20.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" + integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== dependencies: - "@babel/compat-data" "^7.19.3" + "@babel/compat-data" "^7.20.0" "@babel/helper-validator-option" "^7.18.6" browserslist "^4.21.3" semver "^6.3.0" @@ -96,26 +96,26 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz#309b230f04e22c58c6a2c0c0c7e50b216d350c30" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== +"@babel/helper-module-transforms@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" + integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-validator-identifier" "^7.19.1" "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.2" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-split-export-declaration@^7.18.6": version "7.18.6" @@ -124,10 +124,10 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz#181f22d28ebe1b3857fa575f5c290b1aaf659b56" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -139,14 +139,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.19.0.tgz#f30534657faf246ae96551d88dd31e9d1fa1fc18" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== +"@babel/helpers@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" + integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== dependencies: "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" + "@babel/traverse" "^7.20.1" + "@babel/types" "^7.20.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": version "7.18.6" @@ -157,17 +157,17 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.18.10", "@babel/parser@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.3.tgz#8dd36d17c53ff347f9e55c328710321b49479a9a" - integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ== +"@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": + version "7.20.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" + integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== "@babel/runtime@^7.4.4": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.19.0.tgz#22b11c037b094d27a8a2504ea4dcff00f50e2259" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" + integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== dependencies: - regenerator-runtime "^0.13.4" + regenerator-runtime "^0.13.10" "@babel/template@^7.18.10": version "7.18.10" @@ -178,35 +178,35 @@ "@babel/parser" "^7.18.10" "@babel/types" "^7.18.10" -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.19.3.tgz#3a3c5348d4988ba60884e8494b0592b2f15a04b4" - integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ== +"@babel/traverse@^7.20.1": + version "7.20.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" + integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.3" + "@babel/generator" "^7.20.1" "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.3" - "@babel/types" "^7.19.3" + "@babel/parser" "^7.20.1" + "@babel/types" "^7.20.0" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.19.3": - version "7.19.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.19.3.tgz#fc420e6bbe54880bce6779ffaf315f5e43ec9624" - integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw== +"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" + integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== dependencies: - "@babel/helper-string-parser" "^7.18.10" + "@babel/helper-string-parser" "^7.19.4" "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@braintree/sanitize-url@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.0.tgz#fe364f025ba74f6de6c837a84ef44bdb1d61e68f" - integrity sha512-mgmE7XBYY/21erpzhexk4Cj1cyTQ9LzvnTxtzM17BJ7ERMNE6W72mQRo0I1Ud8eFJ+RVVIcBNhLFZ3GX4XFz5w== + version "6.0.2" + resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" + integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== "@cspotcode/source-map-support@^0.8.0": version "0.8.1" @@ -282,15 +282,15 @@ dependencies: hash-test-vectors "^1.3.2" -"@esbuild/android-arm@0.15.10": - version "0.15.10" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.10.tgz#a5f9432eb221afc243c321058ef25fe899886892" - integrity sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg== +"@esbuild/android-arm@0.15.14": + version "0.15.14" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.14.tgz#5d0027f920eeeac313c01fd6ecb8af50c306a466" + integrity sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA== -"@esbuild/linux-loong64@0.15.10": - version "0.15.10" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz#78a42897c2cf8db9fd5f1811f7590393b77774c7" - integrity sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg== +"@esbuild/linux-loong64@0.15.14": + version "0.15.14" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.14.tgz#1221684955c44385f8af34f7240088b7dc08d19d" + integrity sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -307,6 +307,14 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@ethereumjs/common@2.5.0": + version "2.5.0" + resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" + integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== + dependencies: + crc-32 "^1.2.0" + ethereumjs-util "^7.1.1" + "@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": version "2.6.5" resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" @@ -315,6 +323,14 @@ crc-32 "^1.2.0" ethereumjs-util "^7.1.5" +"@ethereumjs/tx@3.3.2": + version "3.3.2" + resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" + integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== + dependencies: + "@ethereumjs/common" "^2.5.0" + ethereumjs-util "^7.1.2" + "@ethereumjs/tx@^3.3.2": version "3.5.2" resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" @@ -323,7 +339,7 @@ "@ethereumjs/common" "^2.6.4" ethereumjs-util "^7.1.5" -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.12", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -525,32 +541,6 @@ dependencies: "@ethersproject/logger" "^5.7.0" -"@ethersproject/providers@5.7.1": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.1.tgz#b0799b616d5579cd1067a8ebf1fc1ec74c1e122c" - integrity sha512-vZveG/DLyo+wk4Ga1yx6jSEHrLPgmTt+dFv0dv8URpVCRf0jVhalps1jq/emN/oXnMRsC7cQgAF32DcXLL7BPQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - "@ethersproject/providers@5.7.2": version "5.7.2" resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" @@ -614,7 +604,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/solidity@5.7.0": +"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.0.9": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== @@ -789,9 +779,9 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping@^0.3.9": - version "0.3.16" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.16.tgz#a7982f16c18cae02be36274365433e5b49d7b23f" - integrity sha512-LCQ+NeThyJ4k1W2d+vIKdxuSt9R3pQSZ4P92m7EakaYuXcVWbHuT5bjNcqLd4Rdgi6xYWYDvBJZJLZSLanjDcA== + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" @@ -1070,16 +1060,11 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" -"@nomiclabs/hardhat-ethers@2.2.1": +"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2": version "2.2.1" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== -"@nomiclabs/hardhat-ethers@^2.0.2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.1.1.tgz#3f1d1ab49813d1bae4c035cc1adec224711e528b" - integrity sha512-Gg0IFkT/DW3vOpih4/kMjeZCLYqtfgECLeLXTs7ZDPzcK0cfoc5wKk4nq5n/izCUzdhidO/Utd6ptF9JrWwWVA== - "@nomiclabs/hardhat-etherscan@3.1.2": version "3.1.2" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.2.tgz#1f9af26ce7db437eb705d46a99996811b43d0e4a" @@ -1123,11 +1108,26 @@ ethers "^4.0.0-beta.1" source-map-support "^0.5.19" -"@openzeppelin/contracts@4.7.3", "@openzeppelin/contracts@^4.1.0": +"@openzeppelin/contracts@3.4.1-solc-0.7-2": + version "3.4.1-solc-0.7-2" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz#371c67ebffe50f551c3146a9eec5fe6ffe862e92" + integrity sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q== + +"@openzeppelin/contracts@3.4.2-solc-0.7": + version "3.4.2-solc-0.7" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" + integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== + +"@openzeppelin/contracts@4.7.3": version "4.7.3" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== +"@openzeppelin/contracts@^4.1.0": + version "4.8.0" + resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.0.tgz#6854c37df205dd2c056bdfa1b853f5d732109109" + integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== + "@pkgr/utils@^2.3.1": version "2.3.1" resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" @@ -1241,16 +1241,23 @@ integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== "@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - version "1.8.3" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== + version "1.8.5" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" + integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@>=5", "@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^7.0.4": + version "7.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" + integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== dependencies: "@sinonjs/commons" "^1.7.0" @@ -1261,15 +1268,31 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@sinonjs/samsam@^6.0.2", "@sinonjs/samsam@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.1.tgz#627f7f4cbdb56e6419fa2c1a3e4751ce4f6a00b1" - integrity sha512-cZ7rKJTLiE7u7Wi/v9Hc2fs3Ucc3jrWeMgPHbbTCeVAB2S0wOBbYlkJVeNSL04i7fdhT8wIbDq1zhC/PXTD2SA== +"@sinonjs/fake-timers@^9.1.2": + version "9.1.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" + integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@sinonjs/samsam@^6.0.2": + version "6.1.3" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.3.tgz#4e30bcd4700336363302a7d72cbec9b9ab87b104" + integrity sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ== dependencies: "@sinonjs/commons" "^1.6.0" lodash.get "^4.4.2" type-detect "^4.0.8" +"@sinonjs/samsam@^7.0.1": + version "7.0.1" + resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" + integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + lodash.get "^4.4.2" + type-detect "^4.0.8" + "@sinonjs/text-encoding@^0.7.1": version "0.7.2" resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" @@ -1303,10 +1326,10 @@ dependencies: defer-to-connect "^2.0.1" -"@truffle/abi-utils@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.2.tgz#71184255cfa05a5ded3c7b7fb50a3de813446224" - integrity sha512-32queMD64YKL/tmQgSV4Xs073dIaZ9tp7NP1icjwvFSA3Q9yeu7ApYbSbYMsx9H9zWkkVOsfcoJ2kJEieOCzsA== +"@truffle/abi-utils@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.4.tgz#004ec7211cbc2117cf173522107ffaf162b0fa0a" + integrity sha512-cgFwIEugsRdh/NnLJ5ZKDeShkRx3dz1tl/XgFxChuvMjJ9ymlIB8ixSIRuIXP0jlvOs0O8rNJWEjEnUdW5G/VQ== dependencies: change-case "3.0.2" fast-check "3.1.1" @@ -1317,13 +1340,13 @@ resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz#1365b88c3d2922a066d947e93748f09b0fac2e93" integrity sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A== -"@truffle/codec@^0.14.5": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.5.tgz#5b1574fb55d20a56af3039adaac7cd9dd421b1fe" - integrity sha512-3FCpTJe6o7LGWUfrSdguMpdpH1PTn3u7bIfbj6Cfdzym2OAVSgxTgdlqC1poepbk0xcOVcUW+EsqNwLMqmBiPA== +"@truffle/codec@^0.14.9": + version "0.14.9" + resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.9.tgz#4d2982822d6a2908eaa81113ab48c77dc4b89efe" + integrity sha512-NhgZkFjy73GUasWPq+pga0Qf9DRKmJm42N3rIL1A5ji+bCPgSpOPM4+4xbueEU5oClsUIBR41dEAFy1FvTPmQA== dependencies: - "@truffle/abi-utils" "^0.3.2" - "@truffle/compile-common" "^0.8.1" + "@truffle/abi-utils" "^0.3.4" + "@truffle/compile-common" "^0.9.0" big.js "^6.0.3" bn.js "^5.1.3" cbor "^5.2.0" @@ -1333,10 +1356,10 @@ utf8 "^3.0.0" web3-utils "1.7.4" -"@truffle/compile-common@^0.8.1": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.8.1.tgz#a3fe500edb880a3104324c9885bbd27b6ce05c54" - integrity sha512-7mzzG9Cfrn+fDT5Sqi7B6pccvIIV5w/GM8/56YgnjysbDzy5aZ6mv0fe37ZbcznEVQ35NJjBy+lEr/ozOGXwQA== +"@truffle/compile-common@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.0.tgz#92ed5f91820b56e15604818464fa3803c6da13e7" + integrity sha512-kpTTU/7ZlQedH6cemCgrqXL4sUjsWAPj7X4LaqQ+KSna3egNJZ6wrKt2kpSYPpCpLihq2IpcBwWar3dTPZ7a5Q== dependencies: "@truffle/error" "^0.1.1" colors "1.4.0" @@ -1350,11 +1373,11 @@ debug "^4.3.1" "@truffle/debug-utils@^6.0.22": - version "6.0.35" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.35.tgz#c9e93d9968857bae14789737f986b8d601a03eb2" - integrity sha512-GuLsc+GFEYiUM683GWh4/ol3jkBts5a601detVWu1Xo5/bSL5gxooOjgOTovjA8dimCjkyi/DnK2yHHC+q+g0g== + version "6.0.40" + resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.40.tgz#e93a263f564d652af4be0c17b476f643890162ce" + integrity sha512-4zmMIUjGCKjRmj0W6tJ72RXldPVAoyTHR524r/g70IBJRf67gQnWq3k8K3EWuepQoeL1jLhzGFO+lb5AZTAoUQ== dependencies: - "@truffle/codec" "^0.14.5" + "@truffle/codec" "^0.14.9" "@trufflesuite/chromafi" "^3.0.0" bn.js "^5.1.3" chalk "^2.4.2" @@ -1367,9 +1390,9 @@ integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== "@truffle/interface-adapter@^0.5.16": - version "0.5.22" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.22.tgz#a25677cce02e3ce192d8d88fbbb11c116cc05334" - integrity sha512-Bgl5Afb1mPVNedI8CJzZQzVIdrZWSXISTBrXPZmppD4Q+6V1RUzlLxiaGGB4gYHOA+U0pBzD8MCcSycPAD9RsA== + version "0.5.24" + resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.24.tgz#c537cced3f2d991afd44046a047b3b62f3f995f5" + integrity sha512-c4nFMnzSuE//xUd16CDc7mjx1NVe5kEDoid/utsma5JPg+AxnOkD4j1QGl7xMqCwQVARLF53FfQzt4DFmZcznQ== dependencies: bn.js "^5.1.3" ethers "^4.0.32" @@ -1444,14 +1467,14 @@ "@types/node" "*" "@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.2.tgz#c324da0197de0a98a2312156536ae262429ff6b9" - integrity sha512-B3xVo+dlKM6nnKTcmm5ZtY/OL8bOAOd2Olee9M1zft65ox50OzjEHW91sDiU9j6cvW8Ejg1/Qkf4xd2kugApUA== + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: "@types/http-cache-semantics" "*" - "@types/keyv" "*" + "@types/keyv" "^3.1.4" "@types/node" "*" - "@types/responselike" "*" + "@types/responselike" "^1.0.0" "@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4": version "7.1.5" @@ -1461,9 +1484,9 @@ "@types/chai" "*" "@types/chai@*", "@types/chai@^4.2.0", "@types/chai@^4.2.22": - version "4.3.3" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.3.tgz#3c90752792660c4b562ad73b3fbd68bf3bc7ae07" - integrity sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g== + version "4.3.4" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" + integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== "@types/concat-stream@^1.6.0": version "1.6.1" @@ -1479,6 +1502,13 @@ dependencies: "@types/ms" "*" +"@types/dompurify@2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.4.0.tgz#fd9706392a88e0e0e6d367f3588482d817df0ab9" + integrity sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg== + dependencies: + "@types/trusted-types" "*" + "@types/form-data@0.0.33": version "0.0.33" resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" @@ -1536,13 +1566,18 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== -"@types/keyv@*": +"@types/keyv@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== dependencies: "@types/node" "*" +"@types/lodash@4.14.189": + version "4.14.189" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.189.tgz#975ff8c38da5ae58b751127b19ad5e44b5b7f6d2" + integrity sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA== + "@types/lru-cache@^5.1.0": version "5.1.1" resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" @@ -1569,9 +1604,9 @@ integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== "@types/node@*": - version "18.8.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.8.3.tgz#ce750ab4017effa51aed6a7230651778d54e327c" - integrity sha512-0os9vz6BpGwxGe9LOhgP/ncvYN5Tx1fNcd2TM3rD/aCGBkysb+ZWpXEocG24h6ZzOi13+VB8HndAQFezsSOw1w== + version "18.11.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" + integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== "@types/node@12.20.25": version "12.20.25" @@ -1621,15 +1656,15 @@ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== "@types/react@^17.0.35": - version "17.0.50" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.50.tgz#39abb4f7098f546cfcd6b51207c90c4295ee81fc" - integrity sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA== + version "17.0.52" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" + integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" -"@types/responselike@*", "@types/responselike@^1.0.0": +"@types/responselike@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== @@ -1665,6 +1700,11 @@ resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== +"@types/trusted-types@*": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" + integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== + "@types/yargs-parser@*": version "21.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" @@ -1756,6 +1796,136 @@ resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== +"@uniswap/lib@^4.0.1-alpha": + version "4.0.1-alpha" + resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-4.0.1-alpha.tgz#2881008e55f075344675b3bca93f020b028fbd02" + integrity sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== + +"@uniswap/sdk-core@^3.0.1": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@uniswap/sdk-core/-/sdk-core-3.1.0.tgz#595b6396763fd2553531423c8eec83bfb4840a27" + integrity sha512-YRrp6vYAbYmi3uDXQGkvj2eT8BMpNnUdCFb8GifDG0Ei+ohIpC4RNAB+5/ru3zR2Byhx8VahGrSKuvdd6BVMyA== + dependencies: + "@ethersproject/address" "^5.0.2" + big.js "^5.2.2" + decimal.js-light "^2.5.0" + jsbi "^3.1.4" + tiny-invariant "^1.1.0" + toformat "^2.0.0" + +"@uniswap/swap-router-contracts@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz#e027b14d4c172f231c53c48e1fd708a78d7d94d8" + integrity sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA== + dependencies: + "@openzeppelin/contracts" "3.4.1-solc-0.7-2" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + "@uniswap/v3-periphery" "1.3.0" + hardhat-watcher "^2.1.1" + +"@uniswap/swap-router-contracts@^1.2.1": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz#8d555ca6d74b888d6e02a26ebb806ce315605f1f" + integrity sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A== + dependencies: + "@openzeppelin/contracts" "3.4.2-solc-0.7" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + "@uniswap/v3-periphery" "1.4.1" + dotenv "^14.2.0" + hardhat-watcher "^2.1.1" + +"@uniswap/v2-core@1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" + integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== + +"@uniswap/v3-core@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@uniswap/v3-core/-/v3-core-1.0.0.tgz#6c24adacc4c25dceee0ba3ca142b35adbd7e359d" + integrity sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA== + +"@uniswap/v3-periphery@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz#be6dfca7b29318ea0d76a7baf15d3b33c3c5e90a" + integrity sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg== + dependencies: + "@openzeppelin/contracts" "3.4.1-solc-0.7-2" + "@uniswap/lib" "^4.0.1-alpha" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + base64-sol "1.0.1" + hardhat-watcher "^2.1.1" + +"@uniswap/v3-periphery@1.3.0", "v3-periphery-1_3_0@npm:@uniswap/v3-periphery@1.3.0": + name v3-periphery-1_3_0 + version "1.3.0" + resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz#37f0a1ef6025221722e50e9f3f2009c2d5d6e4ec" + integrity sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw== + dependencies: + "@openzeppelin/contracts" "3.4.1-solc-0.7-2" + "@uniswap/lib" "^4.0.1-alpha" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + base64-sol "1.0.1" + hardhat-watcher "^2.1.1" + +"@uniswap/v3-periphery@1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz#b90f08b7386163c0abfd7258831caef6339c7862" + integrity sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg== + dependencies: + "@openzeppelin/contracts" "3.4.2-solc-0.7" + "@uniswap/lib" "^4.0.1-alpha" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + base64-sol "1.0.1" + hardhat-watcher "^2.1.1" + +"@uniswap/v3-periphery@^1.0.1", "@uniswap/v3-periphery@^1.1.1": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz#a6da4632dbd46b139cc13a410e4ec09ad22bd19f" + integrity sha512-80c+wtVzl5JJT8UQskxVYYG3oZb4pkhY0zDe0ab/RX4+8f9+W5d8wI4BT0wLB0wFQTSnbW+QdBSpkHA/vRyGBA== + dependencies: + "@openzeppelin/contracts" "3.4.2-solc-0.7" + "@uniswap/lib" "^4.0.1-alpha" + "@uniswap/v2-core" "1.0.1" + "@uniswap/v3-core" "1.0.0" + base64-sol "1.0.1" + +"@uniswap/v3-sdk@3.9.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz#de93fa19f89c29d460996aa4d0b4bb6531641105" + integrity sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ== + dependencies: + "@ethersproject/abi" "^5.0.12" + "@ethersproject/solidity" "^5.0.9" + "@uniswap/sdk-core" "^3.0.1" + "@uniswap/swap-router-contracts" "^1.2.1" + "@uniswap/v3-periphery" "^1.1.1" + "@uniswap/v3-staker" "1.0.0" + tiny-invariant "^1.1.0" + tiny-warning "^1.0.3" + +"@uniswap/v3-staker@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz#9a6915ec980852479dfc903f50baf822ff8fa66e" + integrity sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw== + dependencies: + "@openzeppelin/contracts" "3.4.1-solc-0.7-2" + "@uniswap/v3-core" "1.0.0" + "@uniswap/v3-periphery" "^1.0.1" + +"@uniswap/v3-staker@1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz#febad4905903032bb114ab58138c2d5200c87a3c" + integrity sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ== + dependencies: + "@openzeppelin/contracts" "3.4.1-solc-0.7-2" + "@uniswap/v3-core" "1.0.0" + "@uniswap/v3-periphery" "^1.0.1" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1815,9 +1985,9 @@ acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.4.1: - version "8.8.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== + version "8.8.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" + integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== address@^1.0.1: version "1.2.1" @@ -1860,9 +2030,9 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== + version "8.11.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" + integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1988,14 +2158,14 @@ array-flatten@1.1.1: integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== array-includes@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== + version "3.1.6" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" is-string "^1.0.7" array-union@^2.1.0: @@ -2009,13 +2179,13 @@ array-uniq@1.0.3: integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== array.prototype.flat@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" es-shim-unscopables "^1.0.0" array.prototype.reduce@^1.0.5: @@ -2137,6 +2307,11 @@ base64-js@^1.3.1: resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +base64-sol@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" + integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== + bcrypt-pbkdf@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" @@ -2154,6 +2329,11 @@ big-integer@1.6.36: resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + big.js@^6.0.3: version "6.2.1" resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" @@ -2171,16 +2351,16 @@ bigint-mod-arith@^3.1.0: resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== +bignumber.js@9.1.0, bignumber.js@^9.0.0, bignumber.js@^9.0.1: + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== + bignumber.js@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== -bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -2388,9 +2568,9 @@ buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: ieee754 "^1.1.13" bufferutil@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.6.tgz#ebd6c67c7922a0e902f053e5d8be5ec850e48433" - integrity sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw== + version "4.0.7" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" + integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== dependencies: node-gyp-build "^4.3.0" @@ -2494,9 +2674,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001400: - version "1.0.30001418" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001418.tgz#5f459215192a024c99e3e3a53aac310fc7cf24e6" - integrity sha512-oIs7+JL3K9JRQ3jPZjlH6qyYDp+nBTCais7hjh0s+fuBwufc7uZ7hPYMXrDOJhV360KGMTcczMRObk0/iMqZRg== + version "1.0.30001431" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" + integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" @@ -2523,7 +2703,7 @@ chai-as-promised@7.1.1, chai-as-promised@^7.1.1: dependencies: check-error "^1.0.2" -chai@4.3.7: +chai@4.3.7, chai@^4.2.0, chai@^4.3.4: version "4.3.7" resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== @@ -2536,19 +2716,6 @@ chai@4.3.7: pathval "^1.1.1" type-detect "^4.0.5" -chai@^4.2.0, chai@^4.3.4: - version "4.3.6" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.6.tgz#ffe4ba2d9fa9d6680cc0b370adae709ec9011e9c" - integrity sha512-bbcp3YfHCUzMOvKqsztczerVgBKSsEijCySNlHHbX3VG1nskvqjz5Rfso1gGwD6w6oOV3eI60pKuMOV5MV7p3Q== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^3.0.1" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -2640,7 +2807,7 @@ chokidar@3.3.0: optionalDependencies: fsevents "~2.1.1" -chokidar@3.5.3, chokidar@^3.4.0: +chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -2921,11 +3088,9 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== convert-to-spaces@^1.0.1: version "1.0.2" @@ -3669,6 +3834,11 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decimal.js-light@^2.5.0: + version "2.5.1" + resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" + integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== + decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -3688,13 +3858,6 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-eql@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" - integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== - dependencies: - type-detect "^4.0.0" - deep-eql@^4.0.1, deep-eql@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" @@ -3896,6 +4059,11 @@ dot-case@^2.1.0: dependencies: no-case "^2.2.0" +dotenv@^14.2.0: + version "14.3.2" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" + integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== + duplexer3@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" @@ -3915,9 +4083,9 @@ ee-first@1.1.1: integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== electron-to-chromium@^1.4.251: - version "1.4.276" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.276.tgz#17837b19dafcc43aba885c4689358b298c19b520" - integrity sha512-EpuHPqu8YhonqLBXHoU6hDJCD98FCe6KDoet3/gY1qsQ6usjJoHqBH2YIVs8FXaAtHwVL8Uqa/fsYao/vq9VWQ== + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: version "6.5.4" @@ -3986,7 +4154,7 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5, es-abstract@^1.20.0, es-abstract@^1.20.4: +es-abstract@^1.19.0, es-abstract@^1.20.4: version "1.20.4" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== @@ -4073,133 +4241,133 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild-android-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz#8a59a84acbf2eca96996cadc35642cf055c494f0" - integrity sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA== - -esbuild-android-arm64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz#f453851dc1d8c5409a38cf7613a33852faf4915d" - integrity sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg== - -esbuild-darwin-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz#778bd29c8186ff47b176c8af58c08cf0fb8e6b86" - integrity sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA== - -esbuild-darwin-arm64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz#b30bbefb46dc3c5d4708b0435e52f6456578d6df" - integrity sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ== - -esbuild-freebsd-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz#ab301c5f6ded5110dbdd611140bef1a7c2e99236" - integrity sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w== - -esbuild-freebsd-arm64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz#a5b09b867a6ff49110f52343b6f12265db63d43f" - integrity sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg== - -esbuild-linux-32@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz#5282fe9915641caf9c8070e4ba2c3e16d358f837" - integrity sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w== - -esbuild-linux-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz#f3726e85a00149580cb19f8abfabcbb96f5d52bb" - integrity sha512-jd8XfaSJeucMpD63YNMO1JCrdJhckHWcMv6O233bL4l6ogQKQOxBYSRP/XLWP+6kVTu0obXovuckJDcA0DKtQA== - -esbuild-linux-arm64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz#2f0056e9d5286edb0185b56655caa8c574d8dbe7" - integrity sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A== - -esbuild-linux-arm@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz#40a9270da3c8ffa32cf72e24a79883e323dff08d" - integrity sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A== - -esbuild-linux-mips64le@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz#90ce1c4ee0202edb4ac69807dea77f7e5804abc4" - integrity sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q== - -esbuild-linux-ppc64le@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz#782837ae7bd5b279178106c9dd801755a21fabdf" - integrity sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ== - -esbuild-linux-riscv64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz#d7420d806ece5174f24f4634303146f915ab4207" - integrity sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q== - -esbuild-linux-s390x@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz#21fdf0cb3494a7fb520a71934e4dffce67fe47be" - integrity sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA== - -esbuild-netbsd-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz#6c06b3107e3df53de381e6299184d4597db0440f" - integrity sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw== - -esbuild-openbsd-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz#4daef5f5d8e74bbda53b65160029445d582570cf" - integrity sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ== - -esbuild-sunos-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz#5fe7bef267a02f322fd249a8214d0274937388a7" - integrity sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg== - -esbuild-windows-32@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz#48e3dde25ab0135579a288b30ab6ddef6d1f0b28" - integrity sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg== - -esbuild-windows-64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz#387a9515bef3fee502d277a5d0a2db49a4ecda05" - integrity sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA== - -esbuild-windows-arm64@0.15.10: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz#5a6fcf2fa49e895949bf5495cf088ab1b43ae879" - integrity sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw== +esbuild-android-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.14.tgz#114e55b0d58fb7b45d7fa3d93516bd13fc8869cc" + integrity sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg== + +esbuild-android-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.14.tgz#8541f38a9aacf88e574fb13f5ad4ca51a04c12bb" + integrity sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg== + +esbuild-darwin-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.14.tgz#b40b334db81ff1e3677a6712b23761748a157c57" + integrity sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg== + +esbuild-darwin-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.14.tgz#44b5c1477bb7bdb852dd905e906f68765e2828bc" + integrity sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A== + +esbuild-freebsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.14.tgz#8c57315d238690f34b6ed0c94e5cfc04c858247a" + integrity sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA== + +esbuild-freebsd-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.14.tgz#2e92acca09258daa849e635565f52469266f0b7b" + integrity sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg== + +esbuild-linux-32@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.14.tgz#ca5ed3e9dff82df486ddde362d7e00775a597dfd" + integrity sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA== + +esbuild-linux-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.14.tgz#42952e1d08a299d5f573c567639fb37b033befbf" + integrity sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw== + +esbuild-linux-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.14.tgz#0c0d788099703327ec0ae70758cb2639ef6c5d88" + integrity sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg== + +esbuild-linux-arm@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.14.tgz#751a5ca5042cd60f669b07c3bcec3dd6c4f8151c" + integrity sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q== + +esbuild-linux-mips64le@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.14.tgz#da8ac35f2704de0b52bf53a99c12f604fbe9b916" + integrity sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA== + +esbuild-linux-ppc64le@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.14.tgz#a315b5016917429080c3d32e03319f1ff876ac55" + integrity sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w== + +esbuild-linux-riscv64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.14.tgz#9f2e0a935e5086d398fc19c7ff5d217bfefe3e12" + integrity sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q== + +esbuild-linux-s390x@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.14.tgz#53108112faff5a4e1bad17f7b0b0ffa1df4b7efb" + integrity sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw== + +esbuild-netbsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.14.tgz#5330efc41fe4f1c2bab5462bcfe7a4ffce7ba00a" + integrity sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ== + +esbuild-openbsd-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.14.tgz#ee64944d863e937611fc31adf349e9bb4f5f7eac" + integrity sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA== + +esbuild-sunos-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.14.tgz#29b0b20de6fe6ef50f9fbe533ec20dc4b595f9aa" + integrity sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q== + +esbuild-windows-32@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.14.tgz#05e9b159d664809f7a4a8a68ed048d193457b27d" + integrity sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg== + +esbuild-windows-64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.14.tgz#d5ae086728ab30b72969e40ed0a7a0d9082f2cdd" + integrity sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog== + +esbuild-windows-arm64@0.15.14: + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.14.tgz#8eb50ab9a0ecaf058593fbad17502749306f801d" + integrity sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw== esbuild@^0.15.9: - version "0.15.10" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.10.tgz#85c2f8446e9b1fe04fae68daceacba033eedbd42" - integrity sha512-N7wBhfJ/E5fzn/SpNgX+oW2RLRjwaL8Y0ezqNqhjD6w0H2p0rDuEz2FKZqpqLnO8DCaWumKe8dsC/ljvVSSxng== + version "0.15.14" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.14.tgz#09202b811f1710363d5088a3401a351351c79875" + integrity sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ== optionalDependencies: - "@esbuild/android-arm" "0.15.10" - "@esbuild/linux-loong64" "0.15.10" - esbuild-android-64 "0.15.10" - esbuild-android-arm64 "0.15.10" - esbuild-darwin-64 "0.15.10" - esbuild-darwin-arm64 "0.15.10" - esbuild-freebsd-64 "0.15.10" - esbuild-freebsd-arm64 "0.15.10" - esbuild-linux-32 "0.15.10" - esbuild-linux-64 "0.15.10" - esbuild-linux-arm "0.15.10" - esbuild-linux-arm64 "0.15.10" - esbuild-linux-mips64le "0.15.10" - esbuild-linux-ppc64le "0.15.10" - esbuild-linux-riscv64 "0.15.10" - esbuild-linux-s390x "0.15.10" - esbuild-netbsd-64 "0.15.10" - esbuild-openbsd-64 "0.15.10" - esbuild-sunos-64 "0.15.10" - esbuild-windows-32 "0.15.10" - esbuild-windows-64 "0.15.10" - esbuild-windows-arm64 "0.15.10" + "@esbuild/android-arm" "0.15.14" + "@esbuild/linux-loong64" "0.15.14" + esbuild-android-64 "0.15.14" + esbuild-android-arm64 "0.15.14" + esbuild-darwin-64 "0.15.14" + esbuild-darwin-arm64 "0.15.14" + esbuild-freebsd-64 "0.15.14" + esbuild-freebsd-arm64 "0.15.14" + esbuild-linux-32 "0.15.14" + esbuild-linux-64 "0.15.14" + esbuild-linux-arm "0.15.14" + esbuild-linux-arm64 "0.15.14" + esbuild-linux-mips64le "0.15.14" + esbuild-linux-ppc64le "0.15.14" + esbuild-linux-riscv64 "0.15.14" + esbuild-linux-s390x "0.15.14" + esbuild-netbsd-64 "0.15.14" + esbuild-openbsd-64 "0.15.14" + esbuild-sunos-64 "0.15.14" + esbuild-windows-32 "0.15.14" + esbuild-windows-64 "0.15.14" + esbuild-windows-arm64 "0.15.14" escalade@^3.1.1: version "3.1.1" @@ -4252,9 +4420,9 @@ eslint-import-resolver-node@^0.3.6: resolve "^1.20.0" eslint-import-resolver-typescript@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.1.tgz#c72634da072eebd04fe73007fa58a62c333c8147" - integrity sha512-U7LUjNJPYjNsHvAUAkt/RU3fcTSpbllA0//35B4eLYTX74frmOepbt7F7J3D1IGtj9k21buOpaqtDd4ZlS/BYQ== + version "3.5.2" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz#9431acded7d898fd94591a08ea9eec3514c7de91" + integrity sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ== dependencies: debug "^4.3.4" enhanced-resolve "^5.10.0" @@ -4262,7 +4430,7 @@ eslint-import-resolver-typescript@^3.5.1: globby "^13.1.2" is-core-module "^2.10.0" is-glob "^4.0.3" - synckit "^0.8.3" + synckit "^0.8.4" eslint-module-utils@^2.6.2: version "2.7.4" @@ -4564,7 +4732,7 @@ ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: ethjs-util "0.1.6" rlp "^2.2.3" -ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: +ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: version "7.1.5" resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== @@ -4575,7 +4743,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.4, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@5.7.2: +ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -4626,42 +4794,6 @@ ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: uuid "2.0.1" xmlhttprequest "1.8.0" -ethers@^5.0.13, ethers@^5.4.7: - version "5.7.1" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.1.tgz#48c83a44900b5f006eb2f65d3ba6277047fd4f33" - integrity sha512-5krze4dRLITX7FpU8J4WscXqADiKmyeNlylmmDLbS95DaZpBhDe2YSwRQwKXWNyXcox7a3gBgm/MkGXV1O1S/Q== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.1" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - ethjs-unit@0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" @@ -4775,6 +4907,11 @@ fast-check@3.1.1: dependencies: pure-rand "^5.0.1" +fast-clone@^1.5.13: + version "1.5.13" + resolved "https://registry.yarnpkg.com/fast-clone/-/fast-clone-1.5.13.tgz#7fe17542ae1c872e71bf80d177d00c11f51c2ea7" + integrity sha512-0ez7coyFBQFjZtId+RJqJ+EQs61w9xARfqjqK0AD9vIUkSxWD4HvPt80+5evebZ1tTnv1GYKrPTipx7kOW5ipA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -5336,6 +5473,13 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + got@12.1.0: version "12.1.0" resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" @@ -5440,6 +5584,13 @@ hardhat-gas-reporter@1.0.9: eth-gas-reporter "^0.2.25" sha1 "^1.1.1" +hardhat-watcher@^2.1.1: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz#3ee76c3cb5b99f2875b78d176207745aa484ed4a" + integrity sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA== + dependencies: + chokidar "^3.5.3" + hardhat@^2.10.0, hardhat@^2.12.0: version "2.12.2" resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.2.tgz#6ae985007b20c1f381c6573799d66c1438c4c802" @@ -5693,9 +5844,9 @@ http2-wrapper@^1.0.0-beta.5.2: resolve-alpn "^1.0.0" http2-wrapper@^2.1.10: - version "2.1.11" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.1.11.tgz#d7c980c7ffb85be3859b6a96c800b2951ae257ef" - integrity sha512-aNAk5JzLturWEUiuhAN73Jcbq96R7rTitAoXV54FYMatvihnpD2+6PUgU4ce3D/m5VDbw+F5CsyKSF176ptitQ== + version "2.2.0" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" + integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" @@ -5910,9 +6061,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.10.0, is-core-module@^2.6.0, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== + version "2.11.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" + integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== dependencies: has "^1.0.3" @@ -6042,15 +6193,15 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.3, is-typed-array@^1.1.9: - version "1.1.9" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.9.tgz#246d77d2871e7d9f5aeb1d54b9f52c71329ece67" - integrity sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A== +is-typed-array@^1.1.10, is-typed-array@^1.1.3: + version "1.1.10" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-abstract "^1.20.0" for-each "^0.3.3" + gopd "^1.0.1" has-tostringtag "^1.0.0" is-typedarray@^1.0.0, is-typedarray@~1.0.0: @@ -6226,6 +6377,11 @@ js-yaml@4.1.0: dependencies: argparse "^2.0.1" +jsbi@^3.1.4: + version "3.2.5" + resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" + integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" @@ -6348,9 +6504,9 @@ keyv@^3.0.0: json-buffer "3.0.0" keyv@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.0.tgz#dbce9ade79610b6e641a9a65f2f6499ba06b9bc6" - integrity sha512-2YvuMsA+jnFGtBareKqgANOEKe1mk3HKiXu2fRmAfyxG0MJAywNhi5ttWA3PMjl4NmpyjZNbFifR2vNjW1znfA== + version "4.5.2" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" + integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== dependencies: json-buffer "3.0.1" @@ -6524,9 +6680,9 @@ loose-envify@^1.1.0: js-tokens "^3.0.0 || ^4.0.0" loupe@^2.3.1: - version "2.3.4" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.4.tgz#7e0b9bffc76f148f9be769cb1321d3dcf3cb25f3" - integrity sha512-OvKfgCC2Ndby6aSTREl5aCCPTNIzlDfQZvZxNUrBrihDhL3xcrYegTblhmEiCrg2kKQz4XsFIaemE5BF4ybSaQ== + version "2.3.6" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" + integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== dependencies: get-func-name "^2.0.0" @@ -6637,19 +6793,23 @@ merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== mermaid@^9.1.7: - version "9.1.7" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.1.7.tgz#e24de9b2d36c8cb25a09d72ffce966941b24bd6e" - integrity sha512-MRVHXy5FLjnUQUG7YS3UN9jEN6FXCJbFCXVGJQjVIbiR6Vhw0j/6pLIjqsiah9xoHmQU6DEaKOvB3S1g/1nBPA== + version "9.2.2" + resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.2.2.tgz#73cca1f0b74e7e674c0de3519d7e7e8ea83bea4a" + integrity sha512-6s7eKMqFJGS+0MYjmx8f6ZigqKBJVoSx5ql2gw6a4Aa+WJ49QiEJg7gPwywaBg3DZMs79UP7trESp4+jmaQccw== dependencies: "@braintree/sanitize-url" "^6.0.0" d3 "^7.0.0" dagre "^0.8.5" dagre-d3 "^0.6.4" dompurify "2.4.0" + fast-clone "^1.5.13" graphlib "^2.1.8" khroma "^2.0.0" - moment-mini "2.24.0" - stylis "^4.0.10" + lodash "^4.17.21" + moment-mini "^2.24.0" + non-layered-tidy-tree-layout "^2.0.2" + stylis "^4.1.2" + uuid "^9.0.0" methods@~1.1.2: version "1.1.2" @@ -6749,12 +6909,7 @@ minimatch@5.0.1: dependencies: brace-expansion "^2.0.1" -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== @@ -6838,11 +6993,10 @@ mocha@7.1.2: yargs-unparser "1.6.0" mocha@^10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.0.0.tgz#205447d8993ec755335c4b13deba3d3a13c4def9" - integrity sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA== + version "10.1.0" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" + integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== dependencies: - "@ungap/promise-all-settled" "1.1.2" ansi-colors "4.1.1" browser-stdout "1.3.1" chokidar "3.5.3" @@ -6935,10 +7089,10 @@ module-error@^1.0.1, module-error@^1.0.2: resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== -moment-mini@2.24.0: - version "2.24.0" - resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18" - integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ== +moment-mini@^2.24.0: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f" + integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg== ms@2.0.0: version "2.0.0" @@ -7050,13 +7204,13 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -nise@^5.1.0, nise@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" - integrity sha512-yr5kW2THW1AkxVmCnKEh4nbYkJdB3I7LUkiUgOvEkOp414mc2UMaHMA7pjq1nYowhdoJZGwEKGaQVbxfpWj10A== +nise@^5.1.0, nise@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.2.tgz#a7b8909c216b3491fd4fc0b124efb69f3939b449" + integrity sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA== dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" ">=5" + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers" "^7.0.4" "@sinonjs/text-encoding" "^0.7.1" just-extend "^4.0.2" path-to-regexp "^1.7.0" @@ -7117,6 +7271,11 @@ nofilter@^1.0.4: resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== +non-layered-tidy-tree-layout@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" + integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== + nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -7265,13 +7424,13 @@ object.getownpropertydescriptors@^2.0.3: es-abstract "^1.20.4" object.values@^1.1.4: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" + define-properties "^1.1.4" + es-abstract "^1.20.4" obliterator@^2.0.0: version "2.0.4" @@ -7806,9 +7965,9 @@ pure-rand@^5.0.1: integrity sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw== purecss@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/purecss/-/purecss-2.1.0.tgz#7d7eca2896e57a75cf7620ccf73aa42ded4ddc97" - integrity sha512-QIgWhat8QkHTXdejFJNwZuw0pZ7Mj0MHILHNz8sV6HZBfbWtHpW3b1+Q1D6W/9x4chFhaq9u4+Uk8YbwELzsXg== + version "2.2.0" + resolved "https://registry.yarnpkg.com/purecss/-/purecss-2.2.0.tgz#71249802e1babd562b236cf5d0b75b16f158a421" + integrity sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA== qs@6.11.0, qs@^6.4.0, qs@^6.7.0: version "6.11.0" @@ -7877,9 +8036,9 @@ raw-body@2.5.1, raw-body@^2.4.1: unpipe "1.0.0" react-devtools-core@^4.19.1: - version "4.26.0" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.26.0.tgz#d3d0f59d62ccf1ac03017a7e92f0fe71455019cc" - integrity sha512-OO0Q+vXtHYCXvRQ6elLiOUph3MjsCpuYktGTLnBpizYm46f8tAPuJKihGkwsceitHSJNpzNIjJaYHgX96CyTUQ== + version "4.26.1" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.26.1.tgz#2893fea58089be64c5356d5bd0eebda8d1bbf317" + integrity sha512-r1csa5n9nABVpSdAadwTG7K+SfgRJPc/Hdx89BkV5IlA1mEGgGi3ir630ST5D/xYlJQaY3VE75YGADgpNW7HIw== dependencies: shell-quote "^1.6.1" ws "^7" @@ -7989,10 +8148,10 @@ reduce-flatten@^2.0.0: resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== +regenerator-runtime@^0.13.10: + version "0.13.10" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" + integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== regexp.prototype.flags@^1.4.3: version "1.4.3" @@ -8445,9 +8604,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + version "1.7.4" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" + integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== shelljs@^0.8.3: version "0.8.5" @@ -8499,15 +8658,15 @@ sinon@^12.0.1: supports-color "^7.2.0" sinon@^14.0.0: - version "14.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.1.tgz#9f02e13ad86b695c0c554525e3bf7f8245b31a9c" - integrity sha512-JhJ0jCiyBWVAHDS+YSjgEbDn7Wgz9iIjA1/RK+eseJN0vAAWIWiXBdrnb92ELPyjsfreCYntD1ORtLSfIrlvSQ== + version "14.0.2" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" + integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== dependencies: - "@sinonjs/commons" "^1.8.3" + "@sinonjs/commons" "^2.0.0" "@sinonjs/fake-timers" "^9.1.2" - "@sinonjs/samsam" "^6.1.1" + "@sinonjs/samsam" "^7.0.1" diff "^5.0.0" - nise "^5.1.1" + nise "^5.1.2" supports-color "^7.2.0" slash@^3.0.0: @@ -8683,9 +8842,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" stack-utils@^2.0.2: - version "2.0.5" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.5.tgz#d25265fca995154659dbbfba3b49254778d2fdd5" - integrity sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA== + version "2.0.6" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== dependencies: escape-string-regexp "^2.0.0" @@ -8757,22 +8916,22 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 strip-ansi "^6.0.1" string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== dependencies: call-bind "^1.0.2" define-properties "^1.1.4" - es-abstract "^1.19.5" + es-abstract "^1.20.4" string_decoder@^1.1.1: version "1.3.0" @@ -8860,10 +9019,10 @@ strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1. resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -stylis@^4.0.10: - version "4.1.2" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.2.tgz#870b3c1c2275f51b702bb3da9e94eedad87bba41" - integrity sha512-Nn2CCrG2ZaFziDxaZPN43CXqn+j7tcdjPFCkRBkFue8QYXC2HdEwnw5TCBo4yQZ2WxKYeSi0fdoOrtEqgDrXbA== +stylis@^4.1.2: + version "4.1.3" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" + integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== supports-color@6.0.0: version "6.0.0" @@ -8946,7 +9105,7 @@ sync-rpc@^1.2.1: dependencies: get-port "^3.1.0" -synckit@^0.8.3: +synckit@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== @@ -8964,18 +9123,7 @@ table-layout@^1.0.2: typical "^5.2.0" wordwrapjs "^4.0.0" -table@^6.0.9: - version "6.8.0" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -table@^6.8.0: +table@^6.0.9, table@^6.8.0: version "6.8.1" resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== @@ -9063,6 +9211,16 @@ tiny-glob@^0.2.9: globalyzer "0.1.0" globrex "^0.1.2" +tiny-invariant@^1.1.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" + integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + title-case@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" @@ -9102,6 +9260,11 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" +toformat@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" + integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== + toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -9179,9 +9342,9 @@ tslib@^1.8.1, tslib@^1.9.3: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" + integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== tsort@0.0.1: version "0.0.1" @@ -9308,9 +9471,9 @@ typedarray@^0.0.6: integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== typescript@^4.7.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + version "4.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" + integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== typical@^4.0.0: version "4.0.0" @@ -9348,9 +9511,9 @@ underscore@^1.8.3: integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== undici@^5.4.0: - version "5.11.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.11.0.tgz#1db25f285821828fc09d3804b9e2e934ae86fc13" - integrity sha512-oWjWJHzFet0Ow4YZBkyiJwiK5vWqEYoH7BINzJAJOLedZ++JpAlCbUktW2GQ2DS2FpKmxD/JMtWUUWl1BtghGw== + version "5.12.0" + resolved "https://registry.yarnpkg.com/undici/-/undici-5.12.0.tgz#c758ffa704fbcd40d506e4948860ccaf4099f531" + integrity sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg== dependencies: busboy "^1.6.0" @@ -9409,9 +9572,9 @@ url-set-query@^1.0.0: integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== utf-8-validate@^5.0.2: - version "5.0.9" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.9.tgz#ba16a822fbeedff1a58918f2a6a6b36387493ea3" - integrity sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q== + version "5.0.10" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" + integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== dependencies: node-gyp-build "^4.3.0" @@ -9426,15 +9589,14 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@^0.12.0: - version "0.12.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.4.tgz#66121a31420df8f01ca0c464be15dfa1d1850253" - integrity sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw== + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== dependencies: inherits "^2.0.3" is-arguments "^1.0.4" is-generator-function "^1.0.7" is-typed-array "^1.1.3" - safe-buffer "^5.1.2" which-typed-array "^1.1.2" utils-merge@1.0.1: @@ -9462,6 +9624,11 @@ uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" + integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" @@ -9508,10 +9675,10 @@ web3-bzz@1.7.4: got "9.6.0" swarm-js "^0.1.40" -web3-bzz@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.0.tgz#2023676d7c17ea36512bf76eb310755a02a3d464" - integrity sha512-caDtdKeLi7+2Vb+y+cq2yyhkNjnxkFzVW0j1DtemarBg3dycG1iEl75CVQMLNO6Wkg+HH9tZtRnUyFIe5LIUeQ== +web3-bzz@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.1.tgz#81397be5ce262d03d82b92e9d8acc11f8a609ea1" + integrity sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w== dependencies: "@types/node" "^12.12.6" got "12.1.0" @@ -9525,13 +9692,13 @@ web3-core-helpers@1.7.4: web3-eth-iban "1.7.4" web3-utils "1.7.4" -web3-core-helpers@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.0.tgz#5dcfdda1a4ea277041d912003198f1334ca29d7c" - integrity sha512-nMAVwZB3rEp/khHI2BvFy0e/xCryf501p5NGjswmJtEM+Zrd3Biaw52JrB1qAZZIzCA8cmLKaOgdfamoDOpWdw== +web3-core-helpers@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz#7904747b23fd0afa4f2c86ed98ea9418ccad7672" + integrity sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw== dependencies: - web3-eth-iban "1.8.0" - web3-utils "1.8.0" + web3-eth-iban "1.8.1" + web3-utils "1.8.1" web3-core-method@1.7.4: version "1.7.4" @@ -9544,16 +9711,16 @@ web3-core-method@1.7.4: web3-core-subscriptions "1.7.4" web3-utils "1.7.4" -web3-core-method@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.0.tgz#9c2da8896808917d1679c319f19e2174ba17086c" - integrity sha512-c94RAzo3gpXwf2rf8rL8C77jOzNWF4mXUoUfZYYsiY35cJFd46jQDPI00CB5+ZbICTiA5mlVzMj4e7jAsTqiLA== +web3-core-method@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.1.tgz#0fc5a433a9fc784c447522f141c0a8e0163c7790" + integrity sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA== dependencies: "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.8.0" - web3-core-promievent "1.8.0" - web3-core-subscriptions "1.8.0" - web3-utils "1.8.0" + web3-core-helpers "1.8.1" + web3-core-promievent "1.8.1" + web3-core-subscriptions "1.8.1" + web3-utils "1.8.1" web3-core-promievent@1.7.4: version "1.7.4" @@ -9562,10 +9729,10 @@ web3-core-promievent@1.7.4: dependencies: eventemitter3 "4.0.4" -web3-core-promievent@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.0.tgz#979765fd4d37ab0f158f0ee54037b279b737bd53" - integrity sha512-FGLyjAuOaAQ+ZhV6iuw9tg/9WvIkSZXKHQ4mdTyQ8MxVraOtFivOCbuLLsGgapfHYX+RPxsc1j1YzQjKoupagQ== +web3-core-promievent@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz#f334c8b2ceac6c2228f06d2a515f6d103157f036" + integrity sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg== dependencies: eventemitter3 "4.0.4" @@ -9580,16 +9747,16 @@ web3-core-requestmanager@1.7.4: web3-providers-ipc "1.7.4" web3-providers-ws "1.7.4" -web3-core-requestmanager@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.0.tgz#06189df80cf52d24a195a7ef655031afe8192df3" - integrity sha512-2AoYCs3Owl5foWcf4uKPONyqFygSl9T54L8b581U16nsUirjhoTUGK/PBhMDVcLCmW4QQmcY5A8oPFpkQc1TTg== +web3-core-requestmanager@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz#272ffa55b7b568ecbc8e4a257ca080355c31c60e" + integrity sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw== dependencies: util "^0.12.0" - web3-core-helpers "1.8.0" - web3-providers-http "1.8.0" - web3-providers-ipc "1.8.0" - web3-providers-ws "1.8.0" + web3-core-helpers "1.8.1" + web3-providers-http "1.8.1" + web3-providers-ipc "1.8.1" + web3-providers-ws "1.8.1" web3-core-subscriptions@1.7.4: version "1.7.4" @@ -9599,13 +9766,13 @@ web3-core-subscriptions@1.7.4: eventemitter3 "4.0.4" web3-core-helpers "1.7.4" -web3-core-subscriptions@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.0.tgz#ff66ae4467c8cb4716367248bcefb1845c0f8b83" - integrity sha512-7lHVRzDdg0+Gcog55lG6Q3D8JV+jN+4Ly6F8cSn9xFUAwOkdbgdWsjknQG7t7CDWy21DQkvdiY2BJF8S68AqOA== +web3-core-subscriptions@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz#f5ae1380e92746eadfab6475b8a70ef5a1be6bbf" + integrity sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.8.0" + web3-core-helpers "1.8.1" web3-core@1.7.4: version "1.7.4" @@ -9620,18 +9787,18 @@ web3-core@1.7.4: web3-core-requestmanager "1.7.4" web3-utils "1.7.4" -web3-core@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.0.tgz#90afce527ac1b1dff8cbed2acbc0336530b8aacf" - integrity sha512-9sCA+Z02ci6zoY2bAquFiDjujRwmSKHiSGi4B8IstML8okSytnzXk1izHYSynE7ahIkguhjWAuXFvX76F5rAbA== +web3-core@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.1.tgz#050b1c408d1f9b7ae539e90f7f7d1b7a7d10578b" + integrity sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw== dependencies: "@types/bn.js" "^5.1.0" "@types/node" "^12.12.6" bignumber.js "^9.0.0" - web3-core-helpers "1.8.0" - web3-core-method "1.8.0" - web3-core-requestmanager "1.8.0" - web3-utils "1.8.0" + web3-core-helpers "1.8.1" + web3-core-method "1.8.1" + web3-core-requestmanager "1.8.1" + web3-utils "1.8.1" web3-eth-abi@1.7.4: version "1.7.4" @@ -9641,13 +9808,13 @@ web3-eth-abi@1.7.4: "@ethersproject/abi" "^5.6.3" web3-utils "1.7.4" -web3-eth-abi@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.0.tgz#47fdff00bfdfa72064c9c612ff6369986598196d" - integrity sha512-xPeMb2hS9YLQK/Q5YZpkcmzoRGM+/R8bogSrYHhNC3hjZSSU0YRH+1ZKK0f9YF4qDZaPMI8tKWIMSCDIpjG6fg== +web3-eth-abi@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz#47455d6513217c4b0866fea6f97b1c4afa0b6535" + integrity sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w== dependencies: "@ethersproject/abi" "^5.6.3" - web3-utils "1.8.0" + web3-utils "1.8.1" web3-eth-accounts@1.7.4: version "1.7.4" @@ -9666,22 +9833,22 @@ web3-eth-accounts@1.7.4: web3-core-method "1.7.4" web3-utils "1.7.4" -web3-eth-accounts@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.0.tgz#960d947ee87a49d6c706dc6312334fbfbd6ff812" - integrity sha512-HQ/MDSv4bexwJLvnqsM6xpGE7c2NVOqyhzOZFyMUKXbIwIq85T3TaLnM9pCN7XqMpDcfxqiZ3q43JqQVkzHdmw== +web3-eth-accounts@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz#1ce7387721f118aeb0376291e4d8bbe2ac323406" + integrity sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg== dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.2" + "@ethereumjs/common" "2.5.0" + "@ethereumjs/tx" "3.3.2" crypto-browserify "3.12.0" eth-lib "0.2.8" ethereumjs-util "^7.0.10" scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.8.0" - web3-core-helpers "1.8.0" - web3-core-method "1.8.0" - web3-utils "1.8.0" + uuid "^9.0.0" + web3-core "1.8.1" + web3-core-helpers "1.8.1" + web3-core-method "1.8.1" + web3-utils "1.8.1" web3-eth-contract@1.7.4: version "1.7.4" @@ -9697,19 +9864,19 @@ web3-eth-contract@1.7.4: web3-eth-abi "1.7.4" web3-utils "1.7.4" -web3-eth-contract@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.0.tgz#58f4ce0bde74e5ce87663502e409a92abad7b2c5" - integrity sha512-6xeXhW2YoCrz2Ayf2Vm4srWiMOB6LawkvxWJDnUWJ8SMATg4Pgu42C/j8rz/enXbYWt2IKuj0kk8+QszxQbK+Q== +web3-eth-contract@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz#bdf3e33bbcb79a1b6144dffd6a0deefd2e459272" + integrity sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg== dependencies: "@types/bn.js" "^5.1.0" - web3-core "1.8.0" - web3-core-helpers "1.8.0" - web3-core-method "1.8.0" - web3-core-promievent "1.8.0" - web3-core-subscriptions "1.8.0" - web3-eth-abi "1.8.0" - web3-utils "1.8.0" + web3-core "1.8.1" + web3-core-helpers "1.8.1" + web3-core-method "1.8.1" + web3-core-promievent "1.8.1" + web3-core-subscriptions "1.8.1" + web3-eth-abi "1.8.1" + web3-utils "1.8.1" web3-eth-ens@1.7.4: version "1.7.4" @@ -9725,19 +9892,19 @@ web3-eth-ens@1.7.4: web3-eth-contract "1.7.4" web3-utils "1.7.4" -web3-eth-ens@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.0.tgz#f1937371eac54b087ebe2e871780c2710d39998d" - integrity sha512-/eFbQEwvsMOEiOhw9/iuRXCsPkqAmHHWuFOrThQkozRgcnSTRnvxkkRC/b6koiT5/HaKeUs4yQDg+/ixsIxZxA== +web3-eth-ens@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz#e78a9651fea8282abe8565b001819e2d645e5929" + integrity sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ== dependencies: content-hash "^2.5.2" eth-ens-namehash "2.0.8" - web3-core "1.8.0" - web3-core-helpers "1.8.0" - web3-core-promievent "1.8.0" - web3-eth-abi "1.8.0" - web3-eth-contract "1.8.0" - web3-utils "1.8.0" + web3-core "1.8.1" + web3-core-helpers "1.8.1" + web3-core-promievent "1.8.1" + web3-eth-abi "1.8.1" + web3-eth-contract "1.8.1" + web3-utils "1.8.1" web3-eth-iban@1.7.4: version "1.7.4" @@ -9747,13 +9914,13 @@ web3-eth-iban@1.7.4: bn.js "^5.2.1" web3-utils "1.7.4" -web3-eth-iban@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.0.tgz#3af8a0c95b5f7b0b81ab0bcd2075c1e5dda31520" - integrity sha512-4RbvUxcMpo/e5811sE3a6inJ2H4+FFqUVmlRYs0RaXaxiHweahSRBNcpO0UWgmlePTolj0rXqPT2oEr0DuC8kg== +web3-eth-iban@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz#c6484e5d68ca644aa78431301e7acd5df24598d1" + integrity sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg== dependencies: bn.js "^5.2.1" - web3-utils "1.8.0" + web3-utils "1.8.1" web3-eth-personal@1.7.4: version "1.7.4" @@ -9767,17 +9934,17 @@ web3-eth-personal@1.7.4: web3-net "1.7.4" web3-utils "1.7.4" -web3-eth-personal@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.0.tgz#433c35e2e042844402a12d543c4126ea1494b478" - integrity sha512-L7FT4nR3HmsfZyIAhFpEctKkYGOjRC2h6iFKs9gnFCHZga8yLcYcGaYOBIoYtaKom99MuGBoosayWt/Twh7F5A== +web3-eth-personal@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz#00b5ff1898b62044d25ed5fddd8486168d4827cf" + integrity sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA== dependencies: "@types/node" "^12.12.6" - web3-core "1.8.0" - web3-core-helpers "1.8.0" - web3-core-method "1.8.0" - web3-net "1.8.0" - web3-utils "1.8.0" + web3-core "1.8.1" + web3-core-helpers "1.8.1" + web3-core-method "1.8.1" + web3-net "1.8.1" + web3-utils "1.8.1" web3-eth@1.7.4: version "1.7.4" @@ -9797,23 +9964,23 @@ web3-eth@1.7.4: web3-net "1.7.4" web3-utils "1.7.4" -web3-eth@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.0.tgz#006974a5d5e30644d05814111f9e162a72e4a09c" - integrity sha512-hist52os3OT4TQFB/GxPSMxTh3995sz6LPvQpPvj7ktSbpg9RNSFaSsPlCT63wUAHA3PZb1FemkAIeQM5t72Lw== - dependencies: - web3-core "1.8.0" - web3-core-helpers "1.8.0" - web3-core-method "1.8.0" - web3-core-subscriptions "1.8.0" - web3-eth-abi "1.8.0" - web3-eth-accounts "1.8.0" - web3-eth-contract "1.8.0" - web3-eth-ens "1.8.0" - web3-eth-iban "1.8.0" - web3-eth-personal "1.8.0" - web3-net "1.8.0" - web3-utils "1.8.0" +web3-eth@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.1.tgz#395f6cd56edaac5dbb23e8cec9886c3fd32c430e" + integrity sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg== + dependencies: + web3-core "1.8.1" + web3-core-helpers "1.8.1" + web3-core-method "1.8.1" + web3-core-subscriptions "1.8.1" + web3-eth-abi "1.8.1" + web3-eth-accounts "1.8.1" + web3-eth-contract "1.8.1" + web3-eth-ens "1.8.1" + web3-eth-iban "1.8.1" + web3-eth-personal "1.8.1" + web3-net "1.8.1" + web3-utils "1.8.1" web3-net@1.7.4: version "1.7.4" @@ -9824,14 +9991,14 @@ web3-net@1.7.4: web3-core-method "1.7.4" web3-utils "1.7.4" -web3-net@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.0.tgz#9acff92d7c647d801bc68df0ff4416f104dbe789" - integrity sha512-kX6EAacK7QrOe7DOh0t5yHS5q2kxZmTCxPVwSz9io9xBeE4n4UhmzGJ/VfhP2eM3OPKYeypcR3LEO6zZ8xn2vw== +web3-net@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.1.tgz#2bed4d4b93166724129ec33d0e5dea98880285f4" + integrity sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ== dependencies: - web3-core "1.8.0" - web3-core-method "1.8.0" - web3-utils "1.8.0" + web3-core "1.8.1" + web3-core-method "1.8.1" + web3-utils "1.8.1" web3-providers-http@1.7.4: version "1.7.4" @@ -9841,15 +10008,15 @@ web3-providers-http@1.7.4: web3-core-helpers "1.7.4" xhr2-cookies "1.1.0" -web3-providers-http@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.0.tgz#3fd1e569ead2095343fac17d53160a3bae674c23" - integrity sha512-/MqxwRzExohBWW97mqlCSW/+NHydGRyoEDUS1bAIF2YjfKFwyRtHgrEzOojzkC9JvB+8LofMvbXk9CcltpZapw== +web3-providers-http@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.1.tgz#8aa89c11a9272f11ddb74b871273c92225faa28d" + integrity sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg== dependencies: abortcontroller-polyfill "^1.7.3" cross-fetch "^3.1.4" es6-promise "^4.2.8" - web3-core-helpers "1.8.0" + web3-core-helpers "1.8.1" web3-providers-ipc@1.7.4: version "1.7.4" @@ -9859,13 +10026,13 @@ web3-providers-ipc@1.7.4: oboe "2.1.5" web3-core-helpers "1.7.4" -web3-providers-ipc@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.0.tgz#d339a24c4d764e459e425d3ac868a551ac33e3ea" - integrity sha512-tAXHtVXNUOgehaBU8pzAlB3qhjn/PRpjdzEjzHNFqtRRTwzSEKOJxFeEhaUA4FzHnTlbnrs8ujHWUitcp1elfg== +web3-providers-ipc@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz#6128a3a3a824d06bf0efcfe86325401f8691a5ca" + integrity sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA== dependencies: oboe "2.1.5" - web3-core-helpers "1.8.0" + web3-core-helpers "1.8.1" web3-providers-ws@1.7.4: version "1.7.4" @@ -9876,13 +10043,13 @@ web3-providers-ws@1.7.4: web3-core-helpers "1.7.4" websocket "^1.0.32" -web3-providers-ws@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.0.tgz#a0a73e0606981ea32bed40d215000a64753899de" - integrity sha512-bcZtSifsqyJxwkfQYamfdIRp4nhj9eJd7cxHg1uUkfLJK125WP96wyJL1xbPt7qt0MpfnTFn8/UuIqIB6nFENg== +web3-providers-ws@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz#5e5370e07eb8c615ed298ebc8602b283c7b7d649" + integrity sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA== dependencies: eventemitter3 "4.0.4" - web3-core-helpers "1.8.0" + web3-core-helpers "1.8.1" websocket "^1.0.32" web3-shh@1.7.4: @@ -9895,15 +10062,15 @@ web3-shh@1.7.4: web3-core-subscriptions "1.7.4" web3-net "1.7.4" -web3-shh@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.0.tgz#b4abbf4f59d097ce2f74360e61e2e5c0bd6507c7" - integrity sha512-DNRgSa9Jf9xYFUGKSMylrf+zt3MPjhI2qF+UWX07o0y3+uf8zalDGiJOWvIS4upAsdPiKKVJ7co+Neof47OMmg== +web3-shh@1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.1.tgz#028a95cf9d3a36020380938b9a127610efbb9be7" + integrity sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g== dependencies: - web3-core "1.8.0" - web3-core-method "1.8.0" - web3-core-subscriptions "1.8.0" - web3-net "1.8.0" + web3-core "1.8.1" + web3-core-method "1.8.1" + web3-core-subscriptions "1.8.1" + web3-net "1.8.1" web3-utils@1.7.4: version "1.7.4" @@ -9918,10 +10085,10 @@ web3-utils@1.7.4: randombytes "^2.1.0" utf8 "3.0.0" -web3-utils@1.8.0, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.0.tgz#0a506f8c6af9a2ad6ba79689892662769534fc03" - integrity sha512-7nUIl7UWpLVka2f09CMbKOSEvorvHnaugIabU4mj7zfMvm0tSByLcEu3eyV9qgS11qxxLuOkzBIwCstTflhmpQ== +web3-utils@1.8.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" + integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== dependencies: bn.js "^5.2.1" ethereum-bloom-filters "^1.0.6" @@ -9945,17 +10112,17 @@ web3@1.7.4: web3-utils "1.7.4" web3@^1.0.0-beta.34: - version "1.8.0" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.0.tgz#3ca5f0b32de6a1f626407740411219035b5fde64" - integrity sha512-sldr9stK/SALSJTgI/8qpnDuBJNMGjVR84hJ+AcdQ+MLBGLMGsCDNubCoyO6qgk1/Y9SQ7ignegOI/7BPLoiDA== + version "1.8.1" + resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.1.tgz#8ea67215ef5f3a6f6d3381800b527242ea22885a" + integrity sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ== dependencies: - web3-bzz "1.8.0" - web3-core "1.8.0" - web3-eth "1.8.0" - web3-eth-personal "1.8.0" - web3-net "1.8.0" - web3-shh "1.8.0" - web3-utils "1.8.0" + web3-bzz "1.8.1" + web3-core "1.8.1" + web3-eth "1.8.1" + web3-eth-personal "1.8.1" + web3-net "1.8.1" + web3-shh "1.8.1" + web3-utils "1.8.1" webidl-conversions@^3.0.0: version "3.0.1" @@ -10004,16 +10171,16 @@ which-module@^2.0.0: integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== which-typed-array@^1.1.2: - version "1.1.8" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.8.tgz#0cfd53401a6f334d90ed1125754a42ed663eb01f" - integrity sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw== + version "1.1.9" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== dependencies: available-typed-arrays "^1.0.5" call-bind "^1.0.2" - es-abstract "^1.20.0" for-each "^0.3.3" + gopd "^1.0.1" has-tostringtag "^1.0.0" - is-typed-array "^1.1.9" + is-typed-array "^1.1.10" which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: version "1.3.1" From 1bd9674f9124646abe3398daf44f74ff1e57dc24 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 21 Nov 2022 16:11:17 +0000 Subject: [PATCH 0173/1302] docs(readme): update toc on documentation (#59) * docs(readme): update toc on documentation Add the missing pages into the documentation from the readme. Add shields to the readme as well. * docs(readme): rename calling contracts section * docs(readme): change title of network chain id section * docs(readme): reorder module in modules section * docs(readme): move module params section * docs(readme): renaming resumability to general doc Renaming from `resumability` to a general `running-a-deployment.md` so there is a place to gather all the info on running a deployment. * docs(readme): merge visualization into running Collapse the vizualization doc into the `running-a-deployment.md` page. * docs(running-a-deployment): fix link to ens example * docs(readme): rename testing with HH file * docs(getting-started-guide): add HH tests section Show off the ability to use ignition in HH tests. * docs(modules): update with value passing * docs(testing): update using in hardhat tests Update the example (as `simple` no longer exists). * docs(running-a-deployment): add `deploy` section Add instructions on running the `deploy` task and its flags to the `running-a-deployment.md` instructions. * docs: move config section to running the deploy * docs: add endowment to module docs * docs(modules): move create2 under contract deploy * docs(running): split config code example --- README.md | 39 ++-- docs/creating-modules-for-deployment.md | 248 ++++++++++++------------ docs/getting-started-guide.md | 64 ++++-- docs/resumability.md | 11 -- docs/running-a-deployment.md | 96 +++++++++ docs/testing-with-hardhat.md | 69 ------- docs/using-ignition-in-hardhat-tests.md | 37 ++++ docs/visualizing-your-deployment.md | 48 ----- packages/hardhat-plugin/README.md | 4 +- 9 files changed, 334 insertions(+), 282 deletions(-) delete mode 100644 docs/resumability.md create mode 100644 docs/running-a-deployment.md delete mode 100644 docs/testing-with-hardhat.md create mode 100644 docs/using-ignition-in-hardhat-tests.md delete mode 100644 docs/visualizing-your-deployment.md diff --git a/README.md b/README.md index 296c9b0d91..aea43c152e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +[![npm](https://img.shields.io/npm/v/@ignored/hardhat-ignition.svg)](https://www.npmjs.com/package/@ignored/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + # Ignition > **WARNING**: This repository is **highly experimental**, and is under **active development**. Any code or binaries produced from this project **should not be used in any production or critical workloads**. The API is preliminary, **the API will change**. @@ -10,16 +12,19 @@ Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay u ## Installation -Add **Ignition** as a plugin to an existing [Hardhat](https://hardhat.org/) project: +```bash +npm install --save-dev @ignored/hardhat-ignition +``` + +And add the following statement to your `hardhat.config.js`: -```shell -npm install @ignored/hardhat-ignition +```js +require("@ignored/hardhat-ignition"); ``` -Modify your `hardhat.config.{ts,js}` file, to include Ignition: +Or, if you are using TypeScript, add this to your `hardhat.config.ts`: -```javascript -// ... +```js import "@ignored/hardhat-ignition"; ``` @@ -29,14 +34,26 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex ## Documentation -- [Creating modules for deployment](./docs/creating-modules-for-deployment.md) +- [Getting started](./docs/getting-started-guide.md) +- [Creating Modules for Deployments](./docs/creating-modules-for-deployment.md) + - [Deploying a Contract](./docs/creating-modules-for-deployment.md#deploying-a-contract) + - [Calling contract methods](./docs/creating-modules-for-deployment.md#calling-contract-methods) + - [Including modules within modules](./docs/creating-modules-for-deployment.md#including-modules-within-modules) + - [Module Parameters](./docs/creating-modules-for-deployment.md#module-parameters) + - [Switching based on the _Network Chain ID_](./docs/creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) +- [Using Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) +- [Running a deployment](./docs/running-a-deployment.md) + - [Visualizing your deployment with the `plan` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) + - [Executing the deployment](./docs/running-a-deployment.md#executing-the-deployment) ### Examples -- [Simple](./examples/simple/README.md) -- [ENS](./examples/ens/README.md) -- [Create2](./examples/create2/README.md) -- [Uniswap](./examples/uniswap/README.md) +This repo contains example projects that show **Ignitions** features in context (under `./examples`): + +- [Sample](./examples/sample/README.md) - the **Hardhat** starter project enhanced with Ignition +- [ENS](./examples/ens/README.md) - deploy ENS and its registry for local testing +- [Create2](./examples/create2/README.md) - deploy contracts using a `create2` factory +- [Uniswap](./examples/uniswap/README.md) - deploy Uniswap and test swaps ## Contributing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 049ee0dec2..f2e649547b 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -4,19 +4,22 @@ ### Table of Contents -- [Getting Started](./getting-started-guide.md) - - [Setup](./getting-started-guide.md#setup) - - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) -- Creating Modules for Deployment - - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) - - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) - - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) - - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) +- Creating Modules for Deployments +- [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) + - [Constructor arguments](./creating-modules-for-deployment.md#constructor-arguments) + - [Adding an endowment of _Eth_](./creating-modules-for-deployment.md#adding-an-endowment-of-eth) + - [Dependencies between contracts](./creating-modules-for-deployment.md#dependencies-between-contracts) + - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) + - [Deploying from an artifact](./creating-modules-for-deployment.md#deploying-from-an-artifact) + - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) - [Create2 (TBD)](./creating-modules-for-deployment.md#create2-tbd) -- [Visualizing Your Deployment](./visualizing-your-deployment.md) - - [Actions](./visualizing-your-deployment.md#actions) -- [Testing With Hardhat](./testing-with-hardhat.md) +- [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) + - [Transfering _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) + - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) + - [Waiting for on-chain events (TBD)](./creating-modules-for-deployment.md#waiting-for-on-chain-events-tbd) +- [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) +- [Module Parameters](./creating-modules-for-deployment.md#module-parameters) +- [Switching based on the _Network Chain ID_](./creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) --- @@ -25,7 +28,6 @@ An **Ignition** deployment is composed of modules. A module is a special javascr For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: ```javascript -// ./ignition/MyModule.js const { buildModule } = require("@ignored/hardhat-ignition"); module.exports = buildModule("MyModule", (m) => { @@ -35,9 +37,9 @@ module.exports = buildModule("MyModule", (m) => { }); ``` -Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](TBD)) or consumed by other Modules to allow for complex deployments. +Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](./using-ignition-in-hardhat-tests.md)) or consumed by other Modules to allow for complex deployments. -During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the passed `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they relate to each other to allow building a dependency graph. +During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the injected `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they interdepend on each other. ## Deploying a contract @@ -59,6 +61,16 @@ const token = m.contract("Token", { }); ``` +### Adding an endowment of _Eth_ + +The deployed contract can be given an endowment of _Eth_ by passing the value of the endowment under the options object: + +```tsx +const token = m.contract("Token", { + value: ethers.utils.parseUnits("1"), +}); +``` + ### Dependencies between contracts If a contract needs the address of another contract as a constructor argument, the contract future can be used: @@ -121,9 +133,57 @@ const contract = m.contract("Contract", { A library is deployed in the same way as a contract. -## Executing a Method on a Contract +### Create2 (TBD) + +`Create2` allows for reliably determining the address of a contract before it is deployed. + +It requires a factory contract: + +```solidity +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + +import "@openzeppelin/contracts/utils/Create2.sol"; + +contract Create2Factory { + event Deployed(bytes32 indexed salt, address deployed); + + function deploy( + uint256 amount, + bytes32 salt, + bytes memory bytecode + ) public returns (address) { + address deployedAddress; + + deployedAddress = Create2.deploy(amount, salt, bytecode); + emit Deployed(salt, deployedAddress); + + return deployedAddress; + } +} +``` + +Given the `create2` factory, you can deploy a contract via the factory by: -Not all contract configuration happens via the constructor. To configure a contract calls can be made: +```ts +module.exports = buildModule("Create2Example", (m) => { + const create2 = m.contract("Create2Factory"); + + const fooAddress = m.call(create2, "deploy", { + args: [ + 0, // amount + toBytes32(1), // salt + m.getBytesForArtifact("Foo"), // contract bytecode + ], + }); + + return { create2, foo: m.asContract(fooAddress) }; +}); +``` + +## Calling contract methods + +Not all contract configuration happens via the constructor. To configure a contract through a call to a contract method: ```tsx const token = m.contract("Token"); @@ -134,6 +194,17 @@ m.call(exchange, "addToken", { }); ``` +### Transfering _Eth_ as part of a call + +Similar to `ethers`, a call can transfer `Eth` by passing a `value` under the options: + +```tsx +m.call(exchange, "deposit", { + args: [], + value: ethers.utils.parseUnits("1"), +}); +``` + ### Using the results of a call with a deferred value (TBD) A contract might need the result of some other contract method as an input: @@ -175,66 +246,23 @@ m.await({ }); ``` -The `await` during deployment will check whether a transaction matching the parameters has occured. If it has the deployment will continue, if not the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `await` condition. - -## Using the Network Chain ID - -The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. - -```tsx -const userModule = buildModule("MyModule", (m) => { - const daiAddresses = { - 1: "0x123...", // mainnet DAI - 4: "0x234...", // rinkeby DAI - }; - - const daiAddress = daiAddresses[m.chainId]; - const myContract = m.contract("MyContract", { - args: [daiAddress], - }); -}); -``` - -## Module Parameters - -Modules can have parameters that are accessed using the `DeploymentBuilder` object: - -```tsx -const symbol = m.getParam("tokenSymbol"); -const name = m.getParam("tokenName"); - -const token = m.contract("Token", { - args: [symbol, name, 1_000_000], -}); -``` - -When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed. You can use optional params with default values too: +The `await` during deployment will check whether a transaction matching the parameters has occured. If it has, the deployment will continue, if not the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `await` condition. -```tsx -const symbol = m.getOptionalParam("tokenSymbol", "TKN"); -``` - -## Modules Within Modules +## Including modules within modules Modules can be deployed and consumed within other modules via `m.useModule(...)`: ```tsx module.exports = buildModule("`TEST` registrar", (m) => { - const tld = "test"; - const tldHash = namehash.hash(tld); - const tldLabel = labelhash(tld); + // ... const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); - // Setup registrar const registrar = m.contract("FIFSRegistrar", { - args: [ens, tldHash], + args: [ens, namehash.hash("test")], }); - m.call(ens, "setSubnodeOwner", { - id: "set sub-node owner for registrar", - args: [ZERO_HASH, tldLabel, ACCOUNT_0], - }); + // ... return { ens, resolver, registrar, reverseRegistrar }; }); @@ -244,81 +272,47 @@ Calls to `useModule` memoize the results object, assuming the same parameters ar Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). -## Create2 (TBD) - -`Create2` allows for reliably determining the address of a contract before it is deployed. - -It requires a factory contract: - -```solidity -//SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -import "@openzeppelin/contracts/utils/Create2.sol"; +## Module parameters -contract Create2Factory { - event Deployed(bytes32 indexed salt, address deployed); - - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) public returns (address) { - address deployedAddress; +Modules can have parameters that are accessed using the `DeploymentBuilder` object: - deployedAddress = Create2.deploy(amount, salt, bytecode); - emit Deployed(salt, deployedAddress); +```tsx +const symbol = m.getParam("tokenSymbol"); +const name = m.getParam("tokenName"); - return deployedAddress; - } -} +const token = m.contract("Token", { + args: [symbol, name, 1_000_000], +}); ``` -Given the `create2` factory, you can deploy a contract via it by: - -```ts -module.exports = buildModule("Create2Example", (m) => { - const create2 = m.contract("Create2Factory"); +When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed and will error. - const fooAddress = m.call(create2, "deploy", { - args: [ - 0, // amount - toBytes32(1), // salt - m.getBytesForArtifact("Foo"), // contract bytecode - ], - }); +You can use optional params with default values too: - return { create2, foo: m.asContract(fooAddress) }; -}); +```tsx +const symbol = m.getOptionalParam("tokenSymbol", "TKN"); ``` -## Global Configuration - -There are currently two configurable options you can add to your `hardhat.config.js` file in order to adjust the way **Ignition** functions: +## Switching based on the _Network Chain ID_ -```typescript -interface IgnitionConfig { - maxRetries: number; - gasIncrementPerRetry: BigNumber | null; -} +The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. -// example inside hardhat.config.js -const { ethers } = require('ethers'); +```tsx +const userModule = buildModule("MyModule", (m) => { + const daiAddresses = { + 1: "0x123...", // mainnet DAI + 4: "0x234...", // rinkeby DAI + }; -module.exports = { - ignition: { - maxRetries: 10, - gasIncrementPerRetry: ethers.utils.parseUnits('0.001'); - } -} + const daiAddress = daiAddresses[m.chainId]; + const myContract = m.contract("MyContract", { + args: [daiAddress], + }); +}); ``` -These config values control how **Ignition** retries unconfirmed transactions that are taking too long to confirm. - -The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) - -The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. +--- -Next, let's take a look at another way to visualize your deployments: +Next, let's take a look at using an **Ignition** module within _Hardhat_ tests: -[Visualizing your deployment](./visualizing-your-deployment.md) +[Using Ignition in _Hardhat_ tests](./using-ignition-in-hardhat-tests.md) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index ad4662d71f..4f8700a51a 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -4,18 +4,10 @@ ### Table of Contents -- Getting Started - - [Setup](./getting-started-guide.md#setup) - - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) -- [Creating Modules for Deployment](./creating-modules-for-deployment.md) - - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) - - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) - - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) - - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) -- [Visualizing Your Deployment](./visualizing-your-deployment.md) - - [Actions](./visualizing-your-deployment.md#actions) -- [Testing With Hardhat](./testing-with-hardhat.md) +- [Setup](./getting-started-guide.md#setup) +- [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- [Deploying the module](./getting-started-guide.md#deploying-the-module) +- [Using the module within **Hardhat** tests](./getting-started-guide.md#using-the-module-within-hardhat-tests) --- @@ -75,11 +67,11 @@ const currentTimestampInSeconds = Math.round(Date.now() / 1000); const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const ONE_YEAR_IN_FUTURE = currentTimestampInSeconds + ONE_YEAR_IN_SECS; -const ONE_ETHER = hre.ethers.utils.parseEther("1"); +const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); module.exports = buildModule("LockModule", (m) => { const unlockTime = m.getOptionalParam("unlockTime", ONE_YEAR_IN_FUTURE); - const lockedAmount = m.getOptionalParam("lockedAmount", ONE_ETHER); + const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); @@ -87,6 +79,8 @@ module.exports = buildModule("LockModule", (m) => { }); ``` +### Deploying the Module + Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): ```bash @@ -113,7 +107,7 @@ npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":200 # Ensure you have properly escaped the json string ``` -To deploy against a local hardhat node: +To deploy against a specific network pass it on the command line, for instance to deploy against a local **Hardhat** node: ```bash npx hardhat node @@ -121,6 +115,46 @@ npx hardhat node npx hardhat deploy --network localhost LockModule.js ``` +### Using the Module within Hardhat Tests + +Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide the `./test/Lock.js` test file can be leverage **Ingition** by updating the `deployOneYearLockFixture` fixture: + +```js +... +const { expect } = require("chai"); +const LockModule = require("../ignition/LockModule"); + +... + + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await ethers.getSigners(); + + const { lock } = await ignition.deploy(LockModule, { + parameters: { + unlockTime, + lockedAmount, + }, + }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } +``` + +The **Hardhat** test command will automtically include the `ignition` object within the scope of test files when running tests: + +```sh +npx hardhat test +``` + +--- + Next, dig deeper into defining modules: [Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/docs/resumability.md b/docs/resumability.md deleted file mode 100644 index dd1a73e301..0000000000 --- a/docs/resumability.md +++ /dev/null @@ -1,11 +0,0 @@ -# Deployment Resumability (implementation TBD) - -Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? - -Broadly speaking, if some part of the deployment fails, the user will be able to retry it, or to modify the failing action. With the help of an internal journaling service, successfully completed transactions would not be run a second time when resuming a partially failed deployment. - -Similarly, a user with a deployment that is considered "on hold" and awaiting the completion of an external action of some kind (multisig wallet signatures, as an example) would be able to close the running **Ignition** process and resume the deployment safely whenever they choose without worrying about the previous actions being resolved again. - -For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. - -The exact nature of these files is TBD as this feature is being developed. diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md new file mode 100644 index 0000000000..2476939219 --- /dev/null +++ b/docs/running-a-deployment.md @@ -0,0 +1,96 @@ +# Running a deployment + +--- + +### Table of Contents + +- [Visualizing your deployment with the `plan` task](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) +- [Executing the deployment](./running-a-deployment.md#executing-the-deployment) + - [Configuration options](./running-a-deployment.md#configuration-options) + - [Resuming a failed or onhold deployment (TBD)](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) + +--- + +Once you have built and tested your deployment module, it is time to deploy it! Start by making sure you understand exactly what will be executed on chain. + +## Visualizing your deployment with the `plan` task + +**Ignition** adds a `plan` task to the cli, that will generate a HTML report showing a _dry run_ of the deployment - the contract deploys and contract calls. + +The `plan` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): + +```bash +npx hardhat plan ENS.js +``` + +Running `plan` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: + +![Main plan output](images/plan-1.png) + +The report summarises the contract that will be deployed and the contract calls that will be made. + +It shows the dependency graph as it will be executed by Ignition (where a dependency will not be run until all its dependents have successfully completed). + +If something in your deployment isn't behaving the way you expected, the `plan` task can be an extremely helpful tool for debugging and verifying that your and **Ignition**'s understanding of the deployment are the same. + +## Executing the deployment + +Deploying a module is done using the **Ignition** deploy task: + +```sh +npx hardhat deploy LockModule.js +``` + +Module parameters can be passed as a `json` string to the `parameters` flag: + +```sh +npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule.js +``` + +By default the deploy task will deploy to an ephemeral Hardhat network. To target a network from your Hardhat config, you can pass its name to the network flag: + +```sh +npx hardhat deploy --network mainnet LockModule.js +``` + +### Configuration options + +There are currently two configurable options you can add to your Hardhat config file in order to adjust the way **Ignition** runs the deployment: + +```tsx +interface IgnitionConfig { + maxRetries: number; + gasIncrementPerRetry: BigNumber | null; +} +``` + +These can be set within Hardhat config under the `ignition` property: + +```tsx +const { ethers } = require('ethers'); + +module.exports = { + ignition: { + maxRetries: 10, + gasIncrementPerRetry: ethers.utils.parseUnits('0.001'); + } +} +``` + +These config values control how **Ignition** retries transactions that are taking too long to confirm. + +The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) + +The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if the given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. + +## Resuming a failed or onhold deployment (TBD) + +Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? + +Broadly speaking, if some part of the deployment fails, the user will be able to retry it, or to modify the failing action. With the help of an internal journaling service, successfully completed transactions would not be run a second time when resuming a partially failed deployment. + +Similarly, a user with a deployment that is considered "on hold" and awaiting the completion of an external action of some kind (multisig wallet signatures, as an example) would be able to close the running **Ignition** process and resume the deployment safely whenever they choose without worrying about the previous actions being resolved again. + +For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. + +The exact nature of these files is TBD as this feature is being developed. diff --git a/docs/testing-with-hardhat.md b/docs/testing-with-hardhat.md deleted file mode 100644 index c98853ce4f..0000000000 --- a/docs/testing-with-hardhat.md +++ /dev/null @@ -1,69 +0,0 @@ -# Testing With Hardhat - ---- - -### Table of Contents - -- [Getting Started](./getting-started-guide.md) - - [Setup](./getting-started-guide.md#setup) - - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) -- [Creating Modules for Deployment](./creating-modules-for-deployment.md) - - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) - - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) - - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) - - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) -- [Visualizing Your Deployment](./visualizing-your-deployment.md) - - [Actions](./visualizing-your-deployment.md#actions) -- Testing With Hardhat - ---- - -For this guide, we'll be referring to the **Ignition** module and test inside the [simple example](../examples/simple): - -```javascript -// ignition/Simple.js -const { buildModule } = require("@ignored/hardhat-ignition"); - -module.exports = buildModule("Simple", (m) => { - const incAmount = m.getOptionalParam("IncAmount", 1); - - const simple = m.contract("Simple"); - - m.call(simple, "inc", { - args: [incAmount], - }); - - return { simple }; -}); - -// test/simple.test.js -const { assert } = require("chai"); -const SimpleModule = require("../ignition/Simple"); - -describe("Simple", function () { - let simpleContract; - - before(async () => { - const { simple } = await ignition.deploy(SimpleModule, { - parameters: { - IncAmount: 42, - }, - }); - - simpleContract = simple; - }); - - it("should return an instantiated ethers contract", async function () { - assert.isDefined(simpleContract); - }); - - it("should have incremented the count with the deployment config call", async function () { - assert.equal(await simpleContract.count(), 52); - }); -}); -``` - -As you can see above, the **Ignition** Hardhat plugin makes an `ignition` instance available globally during your Mocha tests. Using this instance allows you to deploy your imported modules exactly as you would on the command line! - -Since the contract instances returned from modules are resolved as ethers contracts, you can then call functions on them according to your testing needs just like you normally would. diff --git a/docs/using-ignition-in-hardhat-tests.md b/docs/using-ignition-in-hardhat-tests.md new file mode 100644 index 0000000000..3a14db2bdb --- /dev/null +++ b/docs/using-ignition-in-hardhat-tests.md @@ -0,0 +1,37 @@ +# Using Ignition in _Hardhat_ tests + +**Ignition** can be used in **Hardhat** tests to simplify test setup, as **Ignition** modules can capture complex deployments of contract systems, which is a common problem when creating test fixtures. + +## The Ignition object + +Requiring **Ignition** within your `hardhat.config.{ts,js}` will automatically inject the `ignition` object as a global variable within **Hardhat** test files. + +The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional options object as the second argument. Module parameters can be passed under the `parameters` property of the options object: + +```js +it("should allow setting the start count for new counters", async function () { + const CounterModule = buildModule("Counter", (m) => { + const startCount = m.getOptionalParam("startCount", 0); + + const counter = m.contract("Counter", { args: [startCount] }); + + return { counter }; + }); + + const { counter } = await ignition.deploy(CounterModule, { + parameters: { + startCount: 42, + }, + }); + + assert.equal(await counter.count(), 42); +}); +``` + +The `ignition.deploy` method automatically converts any `ContractFuture`s returned from the passed module into `ether`'s contract objects, so they can be manipulated and invoked. + +--- + +Next learn how to run a deployment: + +[Running a deployment](./running-a-deployment.md) diff --git a/docs/visualizing-your-deployment.md b/docs/visualizing-your-deployment.md deleted file mode 100644 index f00fde8ca4..0000000000 --- a/docs/visualizing-your-deployment.md +++ /dev/null @@ -1,48 +0,0 @@ -# Visualizing Your Deployment - ---- - -### Table of Contents - -- [Getting Started](./getting-started-guide.md) - - [Setup](./getting-started-guide.md#setup) - - [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) -- [Creating Modules for Deployment](./creating-modules-for-deployment.md) - - [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) - - [Executing a Method on a Contract](./creating-modules-for-deployment.md#executing-a-method-on-a-contract) - - [Using the Network Chain ID](./creating-modules-for-deployment.md#using-the-network-chain-id) - - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - - [Modules Within Modules](./creating-modules-for-deployment.md#modules-within-modules) -- Visualizing Your Deployment - - [Actions](./visualizing-your-deployment.md#actions) -- [Testing With Hardhat](./testing-with-hardhat.md) - ---- - -Within any **Ignition** project, you can use the `plan` task to gain a better understanding of how your deployment module connects together from one transaction to the next. - -For example, using our [ENS example project](../examples/ens): - -```bash -npx hardhat plan ENS.js -``` - -This task performs a "dry run" of the given deployment module and outputs a full HTML report that opens in your system's default browser: - -![Main plan output](images/plan-1.png) - -At a glance, you can easily gain a visual reference for how many contract deploys and/or calls your deployment includes as well as a hierarchy for which transactions depend on which other transactions. - -If something in your deployment isn't behaving the way you expected, the `plan` task can be an extremely helpful tool for debugging and verifying that you and your code are on the same page. - -## Actions - -To view more details about any given transaction, simply clicking on it will navigate you to a more detailed page: - -![Action detail output](images/plan-2.png) - -Notice that, since this is just a dry run and not an actual deployment, any Futures passed as arguments will not have a resolved value yet. We include a placeholder for that data in the output above, and during an actual deployment that future will, of course, be replaced by the appropriate value. - -Next we'll see how to use **Ignition** inside Hardhat tests - -[Testing With Hardhat](./testing-with-hardhat.md) diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 6ad3ac8839..a6557f3c92 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -1,3 +1,5 @@ +[![npm](https://img.shields.io/npm/v/@ignored/hardhat-ignition.svg)](https://www.npmjs.com/package/@ignored/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + # hardhat-ignition Hardhat plugin for orchestrating deployments. @@ -26,7 +28,7 @@ import "@ignored/hardhat-ignition"; ## Tasks -This plugin provides the `deploy` task. +This plugin provides the `deploy` and `plan` tasks. ## Usage From 51a6334866a2e2eec5d641deb4b23241a6c514cd Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 18 Nov 2022 12:38:16 +0000 Subject: [PATCH 0174/1302] refactor: make deploy return type explicit The return type of deploy on the Ignition wrapper now has an explicit type. Note: the return value of serialized result for string and number has been changed to the value itself. I cannot find a current path that would lead to this code being used, but I am going to defer the cleanup to a later refactor. --- packages/hardhat-plugin/src/ignition-wrapper.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index ee653a75a2..905160b9b5 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -6,12 +6,17 @@ import { Module, ModuleDict, } from "@ignored/ignition-core"; +import { Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; +interface DeployResult { + [key: string]: string | number | Contract; +} + export class IgnitionWrapper { private _ignition: Ignition; @@ -29,7 +34,7 @@ export class IgnitionWrapper { parameters?: { [key: string]: ExternalParamValue }; ui?: boolean; } - ) { + ): Promise { const showUi = deployParams?.ui ?? false; if (deployParams?.parameters !== undefined) { @@ -63,15 +68,15 @@ export class IgnitionWrapper { } } - const resolvedOutput: any = {}; - for (const [key, serializedFutureResult] of Object.entries( + const resolvedOutput: { [key: string]: string | number | Contract } = {}; + for (const [key, serializedFutureResult] of Object.entries( deploymentResult.result )) { if ( serializedFutureResult._kind === "string" || serializedFutureResult._kind === "number" ) { - resolvedOutput[key] = serializedFutureResult; + resolvedOutput[key] = serializedFutureResult.value; } else if (serializedFutureResult._kind === "tx") { resolvedOutput[key] = serializedFutureResult.value.hash; } else { From 17d45aaab6d19d82903c01d3d78d05333d55e882 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 22 Nov 2022 09:23:31 +0000 Subject: [PATCH 0175/1302] chore: bump version to v0.0.4 Update the packages versions and changelogs for the `0.0.4 - 2022-11-22` release. --- docs/publish.md | 24 +++++++++++++++++++--- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/uniswap/package.json | 2 +- packages/core/CHANGELOG.md | 30 ++++++++++++++++++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 29 +++++++++++++++++++++++++++ packages/hardhat-plugin/package.json | 6 +++--- 9 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 packages/core/CHANGELOG.md create mode 100644 packages/hardhat-plugin/CHANGELOG.md diff --git a/docs/publish.md b/docs/publish.md index 535fb30949..2aada807eb 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -4,7 +4,25 @@ To publish ignition: 1. git fetch, Checkout out `main`, then ensure your branch is up to date `git pull --ff-only` 2. Run a full check, stopping on failure: `yarn fullcheck` -3. Under `./packages/core`, update the package version based on semver if appropriate. -4. Publish `core` if appropriate: `npm publish` +3. Create a release branch `git checkout -b release/yyyy-mm-dd` +4. Under `./packages/core`, update the package version based on semver if appropriate. 5. Under `./packages/hardhat-plugin`, update the package version based on semver if appropriate. -6. Publish `hardhat-plugin` if appropriate: `npm publish` +6. Update dependency package versions in examples to match +7. Update the `CHANGELOG.md` under `./packages/core`. +8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. +9. Commit the version update `git commit`: + +``` +chore: bump version to vX.X.X + +Update the packages versions and changelogs for the `X.X.X - +yyyy-mm-dd` release. +``` + +10. Push the release branch and open a pull request, the PR description should match the changelogs +11. On a successful check, `rebase merge` the release branch into main +12. Switch to main branch and pull the latest changes +13. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +14. Publish `core` if appropriate: `npm publish` +15. Publish `hardhat-plugin` if appropriate: `npm publish` +16. Create a release on github off of the pushed tag diff --git a/examples/create2/package.json b/examples/create2/package.json index 4592f0b4cc..d5b9ce4cc7 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.3" + "@ignored/hardhat-ignition": "^0.0.4" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index bac15b3a92..40403ee5b2 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.3", + "@ignored/hardhat-ignition": "^0.0.4", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index 11b9c7b4e0..e35fa772ae 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.3", + "@ignored/hardhat-ignition": "^0.0.4", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index d83ff0af4b..c40b6e02c8 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.3", + "@ignored/hardhat-ignition": "^0.0.4", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md new file mode 100644 index 0000000000..d181a2988d --- /dev/null +++ b/packages/core/CHANGELOG.md @@ -0,0 +1,30 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## 0.0.4 - 2022-11-22 + +### Added + +- Pass eth as `value` on deploy or call ([#60](https://github.com/NomicFoundation/ignition/pull/60)) +- Pass parameters for `value` ([#66](https://github.com/NomicFoundation/ignition/pull/66)) + +## 0.0.3 - 2022-11-09 + +### Added + +- Allow modules to depend on other calls ([#53](https://github.com/NomicFoundation/ignition/pull/53)) +- Allow depending on a module ([#54](https://github.com/NomicFoundation/ignition/pull/54)) + +### Changed + +- Dependening on returned module contract equivalent to depending on the module ([#55](https://github.com/NomicFoundation/ignition/pull/55)) + +## 0.0.2 - 2022-10-26 + +### Added + +- Deploy a module to a ephemeral local hardhat node +- Generate example execution graph for plans diff --git a/packages/core/package.json b/packages/core/package.json index 8e48d7317f..d019b0820d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.3", + "version": "0.0.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md new file mode 100644 index 0000000000..80453024f4 --- /dev/null +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -0,0 +1,29 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## 0.0.4 - 2022-11-22 + +### Added + +- Support setting module params from JSON file ([#64](https://github.com/NomicFoundation/ignition/pull/64)) + +## 0.0.3 - 2022-11-09 + +### Added + +- Allow modules to depend on other calls ([#53](https://github.com/NomicFoundation/ignition/pull/53)) +- Allow depending on a module ([#54](https://github.com/NomicFoundation/ignition/pull/54)) + +### Changed + +- Dependening on returned module contract equivalent to depending on the module ([#55](https://github.com/NomicFoundation/ignition/pull/55)) + +## 0.0.2 - 2022-10-26 + +### Added + +- Add `deploy` task to hardhat via the plugin +- Add `plan` task to hardhat via the plugin diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index a5c7f48bfd..c28a1cfcef 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.3", + "version": "0.0.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -32,7 +32,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.3", + "@ignored/ignition-core": "^0.0.4", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -67,7 +67,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.3", + "@ignored/ignition-core": "^0.0.4", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 49106cf07b605ad3deeab481040e7f3b09af7d28 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 23 Nov 2022 02:58:13 -0500 Subject: [PATCH 0176/1302] handle plan for deploys from artifacts --- packages/hardhat-plugin/src/plan/utils.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 1566ff6e79..021fc8619c 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,5 +1,9 @@ import type { VertexGraph, VertexDescriptor } from "@ignored/ignition-core"; +function isDeploy(v: VertexDescriptor): boolean { + return v.type === "HardhatContract" || v.type === "ArtifactContract"; +} + function getVertexes(graph: VertexGraph): VertexDescriptor[] { return [...graph.vertexes.values()]; } @@ -26,7 +30,7 @@ export function getSummaryLists(graph: VertexGraph): string { const deploys = []; const calls = []; for (const vertex of vertexes) { - if (vertex.type === "HardhatContract") { + if (isDeploy(vertex)) { deploys.push(li(vertex.label)); } else if (vertex.type === "Call") { calls.push(li(vertex.label)); @@ -52,7 +56,7 @@ export function getSummaryLists(graph: VertexGraph): string { function wrapNode(v: VertexDescriptor): string { const text = `"${v.label}"`; - return v.type === "HardhatContract" + return isDeploy(v) ? `${v.id}[${text}]:::deploy-${v.id}` : `${v.id}{{${text}}}:::call-${v.id}`; } @@ -91,7 +95,7 @@ export function getActions(graph: VertexGraph): string { const vertexes = getVertexes(graph); const items = vertexes.map((v) => { - const type = v.type === "HardhatContract" ? "Deploy" : v.type; + const type = isDeploy(v) ? "Deploy" : v.type; return `

    • { return `
    • ${ - a.defaultValue ?? a._future ? `Future < ${a.label} > address` : a + a.defaultValue ?? a._future + ? `Future < ${a.label} > ${ + a.type === "contract" ? "address" : a.type + } parameter` + : a }
    • `; }) .join("\n"); From a984d7a21c1c69b1f575d180a5ec7d2d7bc214f4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 24 Nov 2022 07:55:47 -0500 Subject: [PATCH 0177/1302] added params section in cli ui --- packages/core/src/Ignition.ts | 8 +++-- packages/core/src/index.ts | 3 +- packages/core/src/types/deployment.ts | 2 ++ packages/core/src/types/module.ts | 6 +++- packages/core/src/types/providers.ts | 3 ++ packages/hardhat-plugin/src/ConfigWrapper.ts | 11 ++---- .../hardhat-plugin/src/ignition-wrapper.ts | 4 +-- packages/hardhat-plugin/src/index.ts | 11 +++--- .../components/execution/ExecutionPanel.tsx | 6 ++-- .../components/execution/ModuleParameters.tsx | 34 +++++++++++++++++++ .../components/execution/SummarySection.tsx | 20 +++++++---- .../src/ui/components/index.tsx | 14 ++++++-- .../hardhat-plugin/src/ui/renderToCli.tsx | 12 +++++-- 13 files changed, 99 insertions(+), 35 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index c7b9ca4716..31fe7b1ce9 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -8,7 +8,7 @@ import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; import { createServices } from "services/createServices"; import { Services } from "services/types"; -import { DeploymentResult, UpdateUiAction } from "types/deployment"; +import { DeploymentResult, UiParamsClosure } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; import { ResultsAccumulator } from "types/graph"; import { Module, ModuleDict } from "types/module"; @@ -36,7 +36,7 @@ type ModuleOutputs = Record; export class Ignition { constructor( private _providers: Providers, - private _uiRenderer: UpdateUiAction + private _uiRenderer: UiParamsClosure ) {} public async deploy( @@ -48,7 +48,9 @@ export class Ignition { const deployment = new Deployment( ignitionModule.name, Deployment.setupServices(options, this._providers), - options.ui ? this._uiRenderer : undefined + options.ui + ? this._uiRenderer(this._providers.config.parameters) + : undefined ); const chainId = await this._getChainId(); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 1812bb1503..9c7d157b4a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -16,8 +16,9 @@ export type { DeployState, DeployPhase, DeploymentResult, + UpdateUiAction, } from "types/deployment"; -export type { Module, ModuleDict } from "types/module"; +export type { Module, ModuleDict, ModuleParams } from "types/module"; export type { Subgraph, ExternalParamValue, diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 920a5b9a7d..5c7fe0a793 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -4,12 +4,14 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; import { Services } from "services/types"; import { ResultsAccumulator, VertexVisitResult } from "./graph"; +import { ModuleParams } from "./module"; import { SerializedDeploymentResult, SerializedFutureResult, } from "./serialization"; export type UpdateUiAction = (deployState: DeployState) => void; +export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; export interface IgnitionModuleResults { load: (moduleId: string) => Promise; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 2d7c81ce55..7526b7d63a 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,4 +1,4 @@ -import { Subgraph } from "./deploymentGraph"; +import type { ExternalParamValue, Subgraph } from "./deploymentGraph"; import type { CallableFuture, FutureDict, @@ -20,3 +20,7 @@ export interface ModuleData { export interface ModuleCache { [label: string]: ModuleData; } + +export interface ModuleParams { + [key: string]: ExternalParamValue; +} diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 1913dc4b3e..defa4e3664 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -2,6 +2,7 @@ import type { ethers } from "ethers"; import type { ExternalParamValue } from "./deploymentGraph"; import type { Artifact } from "./hardhat"; +import { ModuleParams } from "./module"; export interface Providers { artifacts: ArtifactsProvider; @@ -47,6 +48,8 @@ export type HasParamResult = | { found: true }; export interface ConfigProvider { + parameters: ModuleParams | undefined; + setParams(parameters: { [key: string]: ExternalParamValue }): Promise; getParam(paramName: string): Promise; diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 5c3df5cc30..2c99e84ca2 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -2,22 +2,17 @@ import type { ConfigProvider, ExternalParamValue, HasParamResult, + ModuleParams, } from "@ignored/ignition-core"; export class ConfigWrapper implements ConfigProvider { - private parameters: { [key: string]: ExternalParamValue } | undefined; + public parameters: ModuleParams | undefined; constructor() { this.parameters = undefined; } - public async setParams( - parameters: - | { - [key: string]: ExternalParamValue; - } - | undefined - ): Promise { + public async setParams(parameters: ModuleParams | undefined): Promise { this.parameters = parameters; } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 905160b9b5..4ce41e66f3 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -2,9 +2,9 @@ import { Ignition, IgnitionDeployOptions, Providers, - ExternalParamValue, Module, ModuleDict, + ModuleParams, } from "@ignored/ignition-core"; import { Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -31,7 +31,7 @@ export class IgnitionWrapper { public async deploy( ignitionModule: Module, deployParams?: { - parameters?: { [key: string]: ExternalParamValue }; + parameters?: ModuleParams; ui?: boolean; } ): Promise { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index a9085a3c00..ffc37825ba 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,10 @@ import "@nomiclabs/hardhat-ethers"; -import { Module, ModuleDict, Providers } from "@ignored/ignition-core"; +import { + Module, + ModuleDict, + Providers, + ModuleParams, +} from "@ignored/ignition-core"; import { BigNumber } from "ethers"; import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; @@ -19,10 +24,6 @@ export interface IgnitionConfig { gasIncrementPerRetry: BigNumber | null; } -interface ModuleParams { - [key: string]: number | string; -} - /* ignition config defaults */ const IGNITION_DIR = "ignition"; const DEPLOYMENTS_DIR = "deployments"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 36a2c9bd62..0d2761d897 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import type { DeployState, ModuleParams } from "@ignored/ignition-core"; import { Box } from "ink"; import { BatchExecution } from "./BatchExecution"; @@ -7,12 +7,14 @@ import { SummarySection } from "./SummarySection"; export const ExecutionPanel = ({ deployState, + moduleParams, }: { deployState: DeployState; + moduleParams?: ModuleParams; }) => { return ( - + diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx new file mode 100644 index 0000000000..b63f89b4a4 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx @@ -0,0 +1,34 @@ +import type { ModuleParams } from "@ignored/ignition-core"; +import { Text, Newline } from "ink"; + +export const ModuleParameters = ({ + moduleParams, +}: { + moduleParams?: ModuleParams; +}) => { + if (moduleParams) { + const params = []; + + for (const [key, value] of Object.entries(moduleParams)) { + const item = ( + + {key}: {value} + + ); + + params.push(item, ); + } + + params.pop(); + + return ( + + Module parameters: + + {...params} + + ); + } else { + return null; + } +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 5081728319..5735264743 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,22 +1,28 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState, ModuleParams } from "@ignored/ignition-core"; import { Box, Text, Spacer } from "ink"; +import { ModuleParameters } from "./ModuleParameters"; import { NetworkInfo } from "./NetworkInfo"; export const SummarySection = ({ deployState: { details: { moduleName, ...networkInfo }, }, + moduleParams, }: { deployState: DeployState; + moduleParams?: ModuleParams; }) => { return ( - - - Deploying module {moduleName} - - - + + + + Deploying module {moduleName} + + + + + ); }; diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index 63fa545adc..fda1c9765b 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,10 +1,16 @@ -import { DeployState } from "@ignored/ignition-core"; +import type { DeployState, ModuleParams } from "@ignored/ignition-core"; import { StartingPanel } from "./StartingPanel"; import { ValidationFailedPanel } from "./ValidationFailedPanel"; import { ExecutionPanel } from "./execution/ExecutionPanel"; -export const IgnitionUi = ({ deployState }: { deployState: DeployState }) => { +export const IgnitionUi = ({ + deployState, + moduleParams, +}: { + deployState: DeployState; + moduleParams?: ModuleParams; +}) => { if ( deployState.phase === "uninitialized" || deployState.phase === "validating" @@ -16,5 +22,7 @@ export const IgnitionUi = ({ deployState }: { deployState: DeployState }) => { return ; } - return ; + return ( + + ); }; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index a52c27c408..661774e6d6 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -1,8 +1,14 @@ -import { DeployState } from "@ignored/ignition-core"; +import { + DeployState, + ModuleParams, + UpdateUiAction, +} from "@ignored/ignition-core"; import { render } from "ink"; import { IgnitionUi } from "./components"; -export function renderToCli(state: DeployState) { - render(); +export function renderToCli(moduleParams?: ModuleParams): UpdateUiAction { + return (state: DeployState) => { + render(); + }; } From b6c11ed1736bc6fc0a6f23973f7a73785db6cf2d Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 24 Nov 2022 08:16:46 -0500 Subject: [PATCH 0178/1302] added config for pollingInterval --- packages/core/src/Ignition.ts | 3 ++- packages/core/src/deployment/Deployment.ts | 1 - packages/core/src/services/ContractsService.ts | 5 ++--- packages/core/src/services/createServices.ts | 7 +------ packages/core/src/services/types.ts | 1 + packages/core/src/types/deployment.ts | 1 + packages/core/test/contractsService.ts | 5 ++--- packages/hardhat-plugin/src/index.ts | 3 +++ packages/hardhat-plugin/test/config.ts | 12 ++++++++++++ .../fixture-projects/with-config/hardhat.config.js | 1 + 10 files changed, 25 insertions(+), 14 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index c7b9ca4716..bbbe981bd7 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -29,6 +29,7 @@ export interface IgnitionDeployOptions { networkName: string; maxRetries: number; gasIncrementPerRetry: BigNumber | null; + pollingInterval: number; } type ModuleOutputs = Record; @@ -68,6 +69,7 @@ export class Ignition { const executionResult = await execute(deployment, { maxRetries: options.maxRetries, gasIncrementPerRetry: options.gasIncrementPerRetry, + pollingInterval: options.pollingInterval, }); if (executionResult._kind === "failure") { @@ -90,7 +92,6 @@ export class Ignition { const serviceOptions = { providers: this._providers, journal: new InMemoryJournal(), - txPollingInterval: 300, }; const services: Services = createServices( diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index abce7f2d96..9884272b37 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -43,7 +43,6 @@ export class Deployment { const serviceOptions = { providers, journal, - txPollingInterval: 300, }; const services: Services = createServices( diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 1415f8504d..088deb57d4 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -31,8 +31,7 @@ export class ContractsService implements IContractsService { constructor( private _providers: ContractsServiceProviders, - private _txSender: TxSender, - private _options: { pollingInterval: number } + private _txSender: TxSender ) {} public async sendTx( @@ -109,7 +108,7 @@ export class ContractsService implements IContractsService { retries++; } - await sleep(this._options.pollingInterval); + await sleep(txOptions.pollingInterval); } return txHash; diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index a437ec3561..ee35ff8d6f 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -16,11 +16,9 @@ export function createServices( { providers, journal, - txPollingInterval, }: { providers: Providers; journal: Journal; - txPollingInterval: number; } ): Services { const txSender = new TxSender( @@ -41,10 +39,7 @@ export function createServices( providers.ethereumProvider ), }, - txSender, - { - pollingInterval: txPollingInterval, - } + txSender ), transactions: new TransactionsService(providers), config: new ConfigService(providers), diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 491b7189d7..99893737b4 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -10,6 +10,7 @@ export interface TransactionOptions { gasPrice?: ethers.BigNumberish; maxRetries: number; gasIncrementPerRetry: ethers.BigNumber | null; + pollingInterval: number; } export interface Services { diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 920a5b9a7d..f767ec12e1 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -67,6 +67,7 @@ export interface DeployState { export interface ExecutionOptions { maxRetries: number; gasIncrementPerRetry: BigNumber | null; + pollingInterval: number; } export interface ExecutionContext { diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index 4caac81b12..fbcf3486a4 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -72,9 +72,7 @@ const providersFake = { describe("ContractsService", function () { it("should retry an unconfirmed transaction until the retry limit is hit", async function () { - const contractsService = new ContractsService(providersFake, txSender, { - pollingInterval: 10, - }); + const contractsService = new ContractsService(providersFake, txSender); const fakeTx: ethers.providers.TransactionRequest = {}; @@ -82,6 +80,7 @@ describe("ContractsService", function () { contractsService.sendTx(fakeTx, { maxRetries: 4, gasIncrementPerRetry: null, + pollingInterval: 10, }), /Transaction not confirmed within max retry limit/ ); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index a9085a3c00..a21b66c060 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -17,6 +17,7 @@ export { buildSubgraph, buildModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; + pollingInterval: number; } interface ModuleParams { @@ -28,6 +29,7 @@ const IGNITION_DIR = "ignition"; const DEPLOYMENTS_DIR = "deployments"; const MAX_RETRIES = 4; const GAS_INCREMENT_PER_RETRY = null; +const POLLING_INTERVAL = 300; extendConfig((config, userConfig) => { /* setup path configs */ @@ -52,6 +54,7 @@ extendConfig((config, userConfig) => { maxRetries: userIgnitionConfig.maxRetries ?? MAX_RETRIES, gasIncrementPerRetry: userIgnitionConfig.gasIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, + pollingInterval: userIgnitionConfig.pollingInterval ?? POLLING_INTERVAL, }; }); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 3d0f749409..4c3e229902 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -66,4 +66,16 @@ describe("config", () => { assert(BigNumber.isBigNumber(sendTxOptions.gasIncrementPerRetry)); assert(BigNumber.from(sendTxOptions.gasIncrementPerRetry).eq(1000)); }); + + it("should apply pollingInterval", async function () { + await deployModule(this.hre, (m) => { + m.contract("Bar"); + + return {}; + }); + + const sendTxOptions = sendTxStub.getCalls()[0].lastArg; + + assert.equal(sendTxOptions.pollingInterval, 4); + }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index 9d42786f09..f36825287e 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -13,5 +13,6 @@ module.exports = { ignition: { maxRetries: 1, gasIncrementPerRetry: BigNumber.from(1000), + pollingInterval: 4, }, }; From d0018a9309402c933c2d25034d48cf5b8ba2d9bd Mon Sep 17 00:00:00 2001 From: morgansliman Date: Sat, 26 Nov 2022 01:52:24 -0500 Subject: [PATCH 0179/1302] added docs for pollingInterval --- docs/running-a-deployment.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 2476939219..7adf93c498 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -55,34 +55,44 @@ npx hardhat deploy --network mainnet LockModule.js ### Configuration options -There are currently two configurable options you can add to your Hardhat config file in order to adjust the way **Ignition** runs the deployment: +There are currently some configurable options you can add to your Hardhat config file in order to adjust the way **Ignition** runs the deployment: ```tsx interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; + pollingInterval: number; // milliseconds } ``` These can be set within Hardhat config under the `ignition` property: ```tsx -const { ethers } = require('ethers'); +const { ethers } = require("ethers"); module.exports = { ignition: { maxRetries: 10, - gasIncrementPerRetry: ethers.utils.parseUnits('0.001'); - } -} + gasIncrementPerRetry: ethers.utils.parseUnits("0.001"), + pollingInterval: 300, + }, +}; ``` +--- + +`maxRetries`, `gasIncrementPerRetry`, and `pollingInterval` + +--- + These config values control how **Ignition** retries transactions that are taking too long to confirm. The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if the given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. +The value of `pollingInterval` is the number of milliseconds the process will wait between polls when checking if the transaction has been confirmed yet. The default value is 300 milliseconds. + ## Resuming a failed or onhold deployment (TBD) Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? From 3d0d097d6ca4759df730b377af9354f0186f8e69 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 28 Nov 2022 10:28:07 -0500 Subject: [PATCH 0180/1302] small fixes --- .../components/execution/ModuleParameters.tsx | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx index b63f89b4a4..71db7bd7ed 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx @@ -6,29 +6,24 @@ export const ModuleParameters = ({ }: { moduleParams?: ModuleParams; }) => { - if (moduleParams) { - const params = []; - - for (const [key, value] of Object.entries(moduleParams)) { - const item = ( - - {key}: {value} - - ); - - params.push(item, ); - } - - params.pop(); + if (!moduleParams) { + return null; + } - return ( + const params = Object.entries(moduleParams).map(([key, value]) => ( + - Module parameters: - - {...params} + {key}: {value} - ); - } else { - return null; - } + + + )); + + return ( + + Module parameters: + + {...params} + + ); }; From 5480bbe9d733def1c493d8686df99dcb795b3c02 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 21 Nov 2022 07:23:57 -0500 Subject: [PATCH 0181/1302] multisig example and awaitEvent --- examples/multisig/.eslintrc.js | 14 + examples/multisig/.gitignore | 9 + examples/multisig/.prettierignore | 5 + examples/multisig/contracts/Multisig.sol | 317 ++++++++++++++++++ examples/multisig/contracts/Owned.sol | 16 + examples/multisig/contracts/Timelock.sol | 1 + examples/multisig/hardhat.config.js | 18 + examples/multisig/ignition/Multisig.js | 31 ++ examples/multisig/package.json | 21 ++ examples/multisig/test/Multisig.js | 32 ++ packages/core/src/dsl/DeploymentBuilder.ts | 73 ++++ .../execution/dispatch/executeAwaitedEvent.ts | 51 +++ .../execution/dispatch/executionDispatch.ts | 3 + ...onvertDeploymentVertexToExecutionVertex.ts | 18 + packages/core/src/types/deploymentGraph.ts | 24 +- packages/core/src/types/executionGraph.ts | 13 +- packages/core/src/types/future.ts | 10 +- packages/core/src/utils/guards.ts | 1 + packages/core/src/utils/proxy.ts | 5 +- .../validation/dispatch/validateAwaitEvent.ts | 125 +++++++ .../src/validation/dispatch/validateCall.ts | 2 + .../validation/dispatch/validationDispatch.ts | 3 + .../ui/components/execution/FinalStatus.tsx | 2 + packages/hardhat-plugin/src/ui/types.ts | 2 + yarn.lock | 301 +++++++++-------- 25 files changed, 940 insertions(+), 157 deletions(-) create mode 100644 examples/multisig/.eslintrc.js create mode 100644 examples/multisig/.gitignore create mode 100644 examples/multisig/.prettierignore create mode 100644 examples/multisig/contracts/Multisig.sol create mode 100644 examples/multisig/contracts/Owned.sol create mode 100644 examples/multisig/contracts/Timelock.sol create mode 100644 examples/multisig/hardhat.config.js create mode 100644 examples/multisig/ignition/Multisig.js create mode 100644 examples/multisig/package.json create mode 100644 examples/multisig/test/Multisig.js create mode 100644 packages/core/src/execution/dispatch/executeAwaitedEvent.ts create mode 100644 packages/core/src/validation/dispatch/validateAwaitEvent.ts diff --git a/examples/multisig/.eslintrc.js b/examples/multisig/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/multisig/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/multisig/.gitignore b/examples/multisig/.gitignore new file mode 100644 index 0000000000..36077f2884 --- /dev/null +++ b/examples/multisig/.gitignore @@ -0,0 +1,9 @@ +node_modules +.env +coverage +coverage.json +typechain + +#Hardhat files +cache +artifacts diff --git a/examples/multisig/.prettierignore b/examples/multisig/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/multisig/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol new file mode 100644 index 0000000000..9a0d46a506 --- /dev/null +++ b/examples/multisig/contracts/Multisig.sol @@ -0,0 +1,317 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract Multisig { + + event Confirmation(address indexed sender, uint indexed transactionId); + event Revocation(address indexed sender, uint indexed transactionId); + event Submission(uint indexed transactionId); + event Execution(uint indexed transactionId); + event ExecutionFailure(uint indexed transactionId); + event Deposit(address indexed sender, uint value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint required); + + uint constant public MAX_OWNER_COUNT = 50; + + mapping (uint => Transaction) public transactions; + mapping (uint => mapping (address => bool)) public confirmations; + mapping (address => bool) public isOwner; + address[] public owners; + uint public required; + uint public transactionCount; + + struct Transaction { + address destination; + uint value; + bytes data; + bool executed; + } + + modifier onlyWallet() { + require(msg.sender == address(this)); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner]); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner]); + _; + } + + modifier transactionExists(uint transactionId) { + require(transactions[transactionId].destination != address(0)); + _; + } + + modifier confirmed(uint transactionId, address owner) { + require(confirmations[transactionId][owner]); + _; + } + + modifier notConfirmed(uint transactionId, address owner) { + require(!confirmations[transactionId][owner]); + _; + } + + modifier notExecuted(uint transactionId) { + require(!transactions[transactionId].executed); + _; + } + + modifier notNull(address _address) { + require(_address != address(0)); + _; + } + + modifier validRequirement(uint ownerCount, uint _required) { + require(ownerCount <= MAX_OWNER_COUNT + && _required <= ownerCount + && _required != 0 + && ownerCount != 0); + _; + } + + receive() + external payable + { + if (msg.value > 0) + emit Deposit(msg.sender, msg.value); + } + + constructor(address[] memory _owners, uint _required) payable + validRequirement(_owners.length, _required) + { + for (uint i=0; i<_owners.length; i++) { + require(!isOwner[_owners[i]] && _owners[i] != address(0)); + isOwner[_owners[i]] = true; + } + owners = _owners; + required = _required; + } + + function addOwner(address owner) + public + onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + function removeOwner(address owner) + public + onlyWallet + ownerExists(owner) + { + isOwner[owner] = false; + for (uint i=0; i owners.length) + changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + function replaceOwner(address owner, address newOwner) + public + onlyWallet + ownerExists(owner) + ownerDoesNotExist(newOwner) + { + for (uint i=0; i { + const owners = [ACCOUNT_0, ACCOUNT_1]; + const required = 2; + const value = ethers.utils.parseUnits("100"); + + // todo: support arbitrary tx + const multisig = m.contract("Multisig", { + args: [owners, required], + value, + }); + + const call = m.call(multisig, "submitTransaction", { + args: [ACCOUNT_0, ethers.utils.parseUnits("50"), "0x00"], + after: [multisig], + }); + + const event = m.awaitEvent(multisig, "Confirmation", { + args: [ACCOUNT_1, 0], + after: [call], + }); + + m.call(multisig, "executeTransaction", { args: [0], after: [event] }); + + return { multisig }; +}); diff --git a/examples/multisig/package.json b/examples/multisig/package.json new file mode 100644 index 0000000000..b69fd77518 --- /dev/null +++ b/examples/multisig/package.json @@ -0,0 +1,21 @@ +{ + "name": "@nomicfoundation/ignition-example-multisig", + "private": true, + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test", + "lint": "yarn prettier --check && yarn eslint", + "lint:fix": "yarn prettier --write && yarn eslint --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + }, + "dependencies": { + "@nomiclabs/hardhat-ethers": "^2.2.1", + "@ignored/hardhat-ignition": "^0.0.3", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@openzeppelin/contracts": "^4.3.2", + "chai": "^4.3.4", + "ethers": "^5.7.2", + "hardhat": "^2.12.0" + } +} diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js new file mode 100644 index 0000000000..2a45bcfb7c --- /dev/null +++ b/examples/multisig/test/Multisig.js @@ -0,0 +1,32 @@ +const { expect } = require("chai"); +const Multisig = require("../ignition/Multisig"); +const namehash = require("eth-ens-namehash"); +const labelhash = (label) => + hre.ethers.utils.keccak256(hre.ethers.utils.toUtf8Bytes(label)); + +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; +const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; + +describe("Multisig", function () { + it("should be able to create new subrecords", async function () { + // Arrange + const { ens, resolver } = await ignition.deploy(ENSModule); + + await ens.setSubnodeOwner( + namehash.hash("test"), + labelhash("alice"), + ACCOUNT_0 + ); + + // Act + await resolver["setAddr(bytes32,address)"]( + namehash.hash("alice.test"), + ACCOUNT_1 + ); + + // Assert + const after = await resolver["addr(bytes32)"](namehash.hash("alice.test")); + + expect(after).to.equal(ACCOUNT_1); + }); +}); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 1904fd6550..19454173bd 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -13,6 +13,7 @@ import { DeploymentGraphVertex, UseSubgraphOptions, ScopeData, + AwaitOptions, } from "types/deploymentGraph"; import type { DeploymentGraphFuture, @@ -30,6 +31,7 @@ import type { Virtual, DependableFuture, ProxyFuture, + AwaitFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; @@ -255,6 +257,61 @@ export class DeploymentBuilder implements IDeploymentBuilder { return callFuture; } + public awaitEvent( + contractFuture: DeploymentGraphFuture, + eventName: string, + { args, after }: AwaitOptions + ): AwaitFuture { + const vertexId = this._resolveNextId(); + + const awaitFuture: AwaitFuture = { + vertexId, + label: `${contractFuture.label}/${eventName}`, + type: "await", + _future: true, + }; + + let contract: CallableFuture; + if (isParameter(contractFuture)) { + const parameter = contractFuture; + const scope = parameter.scope; + + const scopeData = this.graph.scopeData[scope]; + + if ( + scopeData === undefined || + scopeData.parameters === undefined || + !(parameter.label in scopeData.parameters) + ) { + throw new Error("Could not resolve contract from parameter"); + } + + contract = scopeData.parameters[parameter.label] as + | HardhatContract + | ArtifactContract + | DeployedContract; + } else if (isCallable(contractFuture)) { + contract = contractFuture; + } else { + throw new Error( + `Not a callable future ${contractFuture.label} (${contractFuture.type})` + ); + } + + DeploymentBuilder._addVertex(this.graph, { + id: awaitFuture.vertexId, + label: awaitFuture.label, + type: "Await", + contract, + event: eventName, + args: args ?? [], + after: after ?? [], + scopeAdded: this.scopes.getScopedLabel(), + }); + + return awaitFuture; + } + public getParam(paramName: string): RequiredParameter { const paramFuture: RequiredParameter = { label: paramName, @@ -467,6 +524,22 @@ export class DeploymentBuilder implements IDeploymentBuilder { return; } + if (depNode.type === "Await") { + DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); + + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.args), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + return; + } + if (depNode.type === "Virtual") { DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.after), diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts new file mode 100644 index 0000000000..ff6b05c436 --- /dev/null +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -0,0 +1,51 @@ +import { Contract } from "ethers"; + +import { ExecutionContext } from "types/deployment"; +import { AwaitedEvent } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeAwaitedEvent( + { event, contract, args }: AwaitedEvent, + resultAccumulator: Map, + _: ExecutionContext +): Promise { + console.log(event); + console.log(args); + const resolve = resolveFrom(resultAccumulator); + + const resolvedArgs = args.map(resolve).map(toAddress); + + const { address, abi } = resolve(contract); + + let attempt = 1; + try { + while (true) { + console.log(`attempt ${attempt}`); + + const contractInstance = new Contract(address, abi); + + const results = contractInstance.filters[event](...resolvedArgs); + console.log("results"); + console.log(results); + + if (results.topics && results.topics.length !== 0) { + break; + } + + attempt++; + } + } catch (err) { + console.log(err); + return { + _kind: "failure", + failure: err as any, + }; + } + + return { + _kind: "success", + result: {}, + }; +} diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index f512c30425..9fd63df973 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -2,6 +2,7 @@ import { ExecutionContext } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { executeAwaitedEvent } from "./executeAwaitedEvent"; import { executeContractCall } from "./executeContractCall"; import { executeContractDeploy } from "./executeContractDeploy"; import { executeDeployedContract } from "./executeDeployedContract"; @@ -25,6 +26,8 @@ export function executionDispatch( return executeContractCall(executionVertex, resultAccumulator, context); case "LibraryDeploy": return executeLibraryDeploy(executionVertex, resultAccumulator, context); + case "AwaitedEvent": + return executeAwaitedEvent(executionVertex, resultAccumulator, context); default: return assertUnknownExecutionVertexType(executionVertex); } diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 33548cc041..a99e0e2473 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -11,8 +11,10 @@ import { IDeploymentGraph, DeploymentGraphVertex, ExternalParamValue, + AwaitVertex, } from "types/deploymentGraph"; import { + AwaitedEvent, ContractCall, ContractDeploy, DeployedContract, @@ -56,6 +58,8 @@ export function convertDeploymentVertexToExecutionVertex( return convertHardhatLibraryToLibraryDeploy(deploymentVertex, context); case "ArtifactLibrary": return convertArtifactLibraryToLibraryDeploy(deploymentVertex, context); + case "Await": + return convertAwaitToAwaitedEvent(deploymentVertex, context); case "Virtual": throw new Error( `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` @@ -165,6 +169,20 @@ async function convertArtifactLibraryToLibraryDeploy( }; } +async function convertAwaitToAwaitedEvent( + vertex: AwaitVertex, + transformContext: TransformContext +): Promise { + return { + type: "AwaitedEvent", + id: vertex.id, + label: vertex.label, + contract: await resolveParameter(vertex.contract, transformContext), + event: vertex.event, + args: await convertArgs(vertex.args, transformContext), + }; +} + function assertDeploymentVertexNotExpected( vertex: never ): Promise { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 5736fb1d5e..b45af4a233 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -3,6 +3,7 @@ import type { BigNumber } from "ethers"; import { ArtifactContract, ArtifactLibrary, + AwaitFuture, ContractCall, DeployedContract, DeploymentGraphFuture, @@ -50,7 +51,8 @@ export type DeploymentGraphVertex = | HardhatLibraryDeploymentVertex | ArtifactLibraryDeploymentVertex | CallDeploymentVertex - | VirtualVertex; + | VirtualVertex + | AwaitVertex; export interface HardhatContractDeploymentVertex extends VertexDescriptor { type: "HardhatContract"; @@ -112,6 +114,15 @@ export interface VirtualVertex extends VertexDescriptor { after: DeploymentGraphFuture[]; } +export interface AwaitVertex extends VertexDescriptor { + type: "Await"; + scopeAdded: string; + contract: CallableFuture; + event: string; + args: InternalParamValue[]; + after: DeploymentGraphFuture[]; +} + export interface ContractOptions { args?: InternalParamValue[]; libraries?: { @@ -127,6 +138,11 @@ export interface CallOptions { value?: BigNumber | ParameterFuture; } +export interface AwaitOptions { + args: InternalParamValue[]; + after?: DeploymentGraphFuture[]; +} + export interface UseSubgraphOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; after?: DeploymentGraphFuture[]; @@ -161,6 +177,12 @@ export interface IDeploymentBuilder { options: CallOptions ) => ContractCall; + awaitEvent: ( + contractFuture: DeploymentGraphFuture, + eventName: string, + options: AwaitOptions + ) => AwaitFuture; + getParam: (paramName: string) => RequiredParameter; getOptionalParam: ( diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index 9df5819835..75494bd0bf 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -22,13 +22,15 @@ export type ExecutionVertexType = | "ContractDeploy" | "DeployedContract" | "LibraryDeploy" - | "ContractCall"; + | "ContractCall" + | "AwaitedEvent"; export type ExecutionVertex = | ContractDeploy | DeployedContract | LibraryDeploy - | ContractCall; + | ContractCall + | AwaitedEvent; export interface ContractDeploy extends VertexDescriptor { type: "ContractDeploy"; @@ -57,3 +59,10 @@ export interface ContractCall extends VertexDescriptor { args: ArgValue[]; value: BigNumber; } + +export interface AwaitedEvent extends VertexDescriptor { + type: "AwaitedEvent"; + contract: any; + event: string; + args: ArgValue[]; +} diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 1cfd95fc07..13357a94a6 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -52,6 +52,13 @@ export interface ContractCall { _future: true; } +export interface AwaitFuture { + vertexId: number; + label: string; + type: "await"; + _future: true; +} + export type ParameterValue = string | number | DeploymentGraphFuture; export interface RequiredParameter { @@ -99,7 +106,8 @@ export type DependableFuture = | CallableFuture | ContractCall | Virtual - | ProxyFuture; + | ProxyFuture + | AwaitFuture; export type ParameterFuture = RequiredParameter | OptionalParameter; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 6c57077e52..a3ad571d1f 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -79,6 +79,7 @@ export function isDependable(possible: any): possible is DependableFuture { possible.type === "contract" || possible.type === "library" || possible.type === "virtual" || + possible.type === "await" || possible.type === "proxy") ); } diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/utils/proxy.ts index 24c15f24c3..d1231a72a1 100644 --- a/packages/core/src/utils/proxy.ts +++ b/packages/core/src/utils/proxy.ts @@ -3,13 +3,14 @@ import { ContractCall, DependableFuture, Virtual, + AwaitFuture, } from "types/future"; import { isProxy } from "./guards"; export function resolveProxyDependency( future: DependableFuture -): CallableFuture | ContractCall | Virtual { +): CallableFuture | ContractCall | Virtual | AwaitFuture { if (isProxy(future)) { return resolveProxyDependency(future.proxy); } @@ -19,7 +20,7 @@ export function resolveProxyDependency( export function resolveProxyValue( future: DependableFuture -): CallableFuture | ContractCall | Virtual { +): CallableFuture | ContractCall | Virtual | AwaitFuture { if (isProxy(future)) { return resolveProxyValue(future.value); } diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts new file mode 100644 index 0000000000..a937548825 --- /dev/null +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -0,0 +1,125 @@ +import { ethers } from "ethers"; + +import { Services } from "services/types"; +import { AwaitVertex } from "types/deploymentGraph"; +import { CallableFuture } from "types/future"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { resolveProxyValue } from "utils/proxy"; + +export async function validateAwaitEvent( + vertex: AwaitVertex, + _resultAccumulator: ResultsAccumulator, + context: { services: Services } +): Promise { + const contractName = vertex.contract.label; + + const artifactAbi = await resolveArtifactForCallableFuture( + vertex.contract, + context + ); + + if (artifactAbi === undefined) { + return { + _kind: "failure", + failure: new Error(`Artifact with name '${contractName}' doesn't exist`), + }; + } + + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(artifactAbi); + + const events = Object.entries(iface.events) + .filter(([fname]) => fname === vertex.event) + .map(([, fragment]) => fragment); + + const eventFragments = iface.fragments + .filter((frag) => frag.name === vertex.event) + .concat(events); + + if (eventFragments.length === 0) { + return { + _kind: "failure", + failure: new Error( + `Contract '${contractName}' doesn't have an event ${vertex.event}` + ), + }; + } + + const matchingEventFragments = eventFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingEventFragments.length === 0) { + if (eventFragments.length === 1) { + return { + _kind: "failure", + failure: new Error( + `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` + ), + }; + } else { + return { + _kind: "failure", + failure: new Error( + `Event ${vertex.event} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments` + ), + }; + } + } + + return { + _kind: "success", + result: undefined, + }; +} + +async function resolveArtifactForCallableFuture( + givenFuture: CallableFuture, + { services }: { services: Services } +): Promise { + const future = resolveProxyValue(givenFuture); + + switch (future.type) { + case "contract": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "deployed": + return future.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.contractName + ); + return artifact.abi; + default: + return assertNeverDeploymentFuture(future); + } + case "library": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.libraryName + ); + return artifact.abi; + default: + return assertNeverDeploymentFuture(future); + } + case "virtual": + throw new Error(`Cannot call virtual future`); + case "call": + throw new Error(`Cannot call call future`); + case "await": + throw new Error(`Cannot call await future`); + default: + return assertNeverDeploymentFuture(future); + } +} + +function assertNeverDeploymentFuture(f: never): undefined { + throw new Error( + `Unexpected deployment future type/subtype ${JSON.stringify(f)}` + ); +} diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 21a7cf3163..cfc43a14bb 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -120,6 +120,8 @@ async function resolveArtifactForCallableFuture( throw new Error(`Cannot call virtual future`); case "call": throw new Error(`Cannot call call future`); + case "await": + throw new Error(`Cannot call await future`); default: return assertNeverDeploymentFuture(future); } diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 0a22dd5027..70d2af04f5 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -4,6 +4,7 @@ import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; +import { validateAwaitEvent } from "./validateAwaitEvent"; import { validateCall } from "./validateCall"; import { validateDeployedContract } from "./validateDeployedContract"; import { validateHardhatContract } from "./validateHardhatContract"; @@ -50,6 +51,8 @@ export function validationDispatch( ); case "Virtual": return validateVirtual(deploymentVertex, resultAccumulator, context); + case "Await": + return validateAwaitEvent(deploymentVertex, resultAccumulator, context); default: return assertUnknownDeploymentVertexType(deploymentVertex); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 53b915ad8c..3702f3068f 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -124,6 +124,8 @@ const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { return "-"; case "LibraryDeploy": return "Failed library deploy"; + case "AwaitedEvent": + return "Failed awaited event"; default: return assertNeverUiVertexType(vertex); } diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 772f9e2c6f..c0ad65bda4 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -172,6 +172,8 @@ export class DeploymentState { return "-"; case "LibraryDeploy": return "Failed library deploy"; + case "AwaitedEvent": + return "Failed awaited event"; default: return assertNeverUiVertexType(vertex.type); } diff --git a/yarn.lock b/yarn.lock index 0e30f57587..9c3c823806 100644 --- a/yarn.lock +++ b/yarn.lock @@ -282,15 +282,15 @@ dependencies: hash-test-vectors "^1.3.2" -"@esbuild/android-arm@0.15.14": - version "0.15.14" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.14.tgz#5d0027f920eeeac313c01fd6ecb8af50c306a466" - integrity sha512-+Rb20XXxRGisNu2WmNKk+scpanb7nL5yhuI1KR9wQFiC43ddPj/V1fmNyzlFC9bKiG4mYzxW7egtoHVcynr+OA== +"@esbuild/android-arm@0.15.15": + version "0.15.15" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.15.tgz#35b3cc0f9e69cb53932d44f60b99dd440335d2f0" + integrity sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw== -"@esbuild/linux-loong64@0.15.14": - version "0.15.14" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.14.tgz#1221684955c44385f8af34f7240088b7dc08d19d" - integrity sha512-eQi9rosGNVQFJyJWV0HCA5WZae/qWIQME7s8/j8DMvnylfBv62Pbu+zJ2eUDqNf2O4u3WB+OEXyfkpBoe194sg== +"@esbuild/linux-loong64@0.15.15": + version "0.15.15" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz#32c65517a09320b62530867345222fde7794fbe1" + integrity sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA== "@eslint/eslintrc@^0.4.3": version "0.4.3" @@ -1060,7 +1060,7 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" -"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2": +"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2", "@nomiclabs/hardhat-ethers@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== @@ -1123,7 +1123,7 @@ resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== -"@openzeppelin/contracts@^4.1.0": +"@openzeppelin/contracts@^4.1.0", "@openzeppelin/contracts@^4.3.2": version "4.8.0" resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.0.tgz#6854c37df205dd2c056bdfa1b853f5d732109109" integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== @@ -1859,7 +1859,6 @@ hardhat-watcher "^2.1.1" "@uniswap/v3-periphery@1.3.0", "v3-periphery-1_3_0@npm:@uniswap/v3-periphery@1.3.0": - name v3-periphery-1_3_0 version "1.3.0" resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz#37f0a1ef6025221722e50e9f3f2009c2d5d6e4ec" integrity sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw== @@ -2106,9 +2105,9 @@ antlr4ts@^0.5.0-alpha.4: integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2674,9 +2673,9 @@ camelcase@^6.0.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== caniuse-lite@^1.0.30001400: - version "1.0.30001431" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001431.tgz#e7c59bd1bc518fae03a4656be442ce6c4887a795" - integrity sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ== + version "1.0.30001434" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" + integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== caseless@^0.12.0, caseless@~0.12.0: version "0.12.0" @@ -4241,133 +4240,133 @@ es6-symbol@^3.1.1, es6-symbol@^3.1.3: d "^1.0.1" ext "^1.1.2" -esbuild-android-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.14.tgz#114e55b0d58fb7b45d7fa3d93516bd13fc8869cc" - integrity sha512-HuilVIb4rk9abT4U6bcFdU35UHOzcWVGLSjEmC58OVr96q5UiRqzDtWjPlCMugjhgUGKEs8Zf4ueIvYbOStbIg== - -esbuild-android-arm64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.14.tgz#8541f38a9aacf88e574fb13f5ad4ca51a04c12bb" - integrity sha512-/QnxRVxsR2Vtf3XottAHj7hENAMW2wCs6S+OZcAbc/8nlhbAL/bCQRCVD78VtI5mdwqWkVi3wMqM94kScQCgqg== - -esbuild-darwin-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.14.tgz#b40b334db81ff1e3677a6712b23761748a157c57" - integrity sha512-ToNuf1uifu8hhwWvoZJGCdLIX/1zpo8cOGnT0XAhDQXiKOKYaotVNx7pOVB1f+wHoWwTLInrOmh3EmA7Fd+8Vg== - -esbuild-darwin-arm64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.14.tgz#44b5c1477bb7bdb852dd905e906f68765e2828bc" - integrity sha512-KgGP+y77GszfYJgceO0Wi/PiRtYo5y2Xo9rhBUpxTPaBgWDJ14gqYN0+NMbu+qC2fykxXaipHxN4Scaj9tUS1A== - -esbuild-freebsd-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.14.tgz#8c57315d238690f34b6ed0c94e5cfc04c858247a" - integrity sha512-xr0E2n5lyWw3uFSwwUXHc0EcaBDtsal/iIfLioflHdhAe10KSctV978Te7YsfnsMKzcoGeS366+tqbCXdqDHQA== - -esbuild-freebsd-arm64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.14.tgz#2e92acca09258daa849e635565f52469266f0b7b" - integrity sha512-8XH96sOQ4b1LhMlO10eEWOjEngmZ2oyw3pW4o8kvBcpF6pULr56eeYVP5radtgw54g3T8nKHDHYEI5AItvskZg== - -esbuild-linux-32@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.14.tgz#ca5ed3e9dff82df486ddde362d7e00775a597dfd" - integrity sha512-6ssnvwaTAi8AzKN8By2V0nS+WF5jTP7SfuK6sStGnDP7MCJo/4zHgM9oE1eQTS2jPmo3D673rckuCzRlig+HMA== - -esbuild-linux-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.14.tgz#42952e1d08a299d5f573c567639fb37b033befbf" - integrity sha512-ONySx3U0wAJOJuxGUlXBWxVKFVpWv88JEv0NZ6NlHknmDd1yCbf4AEdClSgLrqKQDXYywmw4gYDvdLsS6z0hcw== - -esbuild-linux-arm64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.14.tgz#0c0d788099703327ec0ae70758cb2639ef6c5d88" - integrity sha512-kle2Ov6a1e5AjlHlMQl1e+c4myGTeggrRzArQFmWp6O6JoqqB9hT+B28EW4tjFWgV/NxUq46pWYpgaWXsXRPAg== - -esbuild-linux-arm@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.14.tgz#751a5ca5042cd60f669b07c3bcec3dd6c4f8151c" - integrity sha512-D2LImAIV3QzL7lHURyCHBkycVFbKwkDb1XEUWan+2fb4qfW7qAeUtul7ZIcIwFKZgPcl+6gKZmvLgPSj26RQ2Q== - -esbuild-linux-mips64le@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.14.tgz#da8ac35f2704de0b52bf53a99c12f604fbe9b916" - integrity sha512-FVdMYIzOLXUq+OE7XYKesuEAqZhmAIV6qOoYahvUp93oXy0MOVTP370ECbPfGXXUdlvc0TNgkJa3YhEwyZ6MRA== - -esbuild-linux-ppc64le@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.14.tgz#a315b5016917429080c3d32e03319f1ff876ac55" - integrity sha512-2NzH+iuzMDA+jjtPjuIz/OhRDf8tzbQ1tRZJI//aT25o1HKc0reMMXxKIYq/8nSHXiJSnYV4ODzTiv45s+h73w== - -esbuild-linux-riscv64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.14.tgz#9f2e0a935e5086d398fc19c7ff5d217bfefe3e12" - integrity sha512-VqxvutZNlQxmUNS7Ac+aczttLEoHBJ9e3OYGqnULrfipRvG97qLrAv9EUY9iSrRKBqeEbSvS9bSfstZqwz0T4Q== - -esbuild-linux-s390x@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.14.tgz#53108112faff5a4e1bad17f7b0b0ffa1df4b7efb" - integrity sha512-+KVHEUshX5n6VP6Vp/AKv9fZIl5kr2ph8EUFmQUJnDpHwcfTSn2AQgYYm0HTBR2Mr4d0Wlr0FxF/Cs5pbFgiOw== - -esbuild-netbsd-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.14.tgz#5330efc41fe4f1c2bab5462bcfe7a4ffce7ba00a" - integrity sha512-6D/dr17piEgevIm1xJfZP2SjB9Z+g8ERhNnBdlZPBWZl+KSPUKLGF13AbvC+nzGh8IxOH2TyTIdRMvKMP0nEzQ== - -esbuild-openbsd-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.14.tgz#ee64944d863e937611fc31adf349e9bb4f5f7eac" - integrity sha512-rREQBIlMibBetgr2E9Lywt2Qxv2ZdpmYahR4IUlAQ1Efv/A5gYdO0/VIN3iowDbCNTLxp0bb57Vf0LFcffD6kA== - -esbuild-sunos-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.14.tgz#29b0b20de6fe6ef50f9fbe533ec20dc4b595f9aa" - integrity sha512-DNVjSp/BY4IfwtdUAvWGIDaIjJXY5KI4uD82+15v6k/w7px9dnaDaJJ2R6Mu+KCgr5oklmFc0KjBjh311Gxl9Q== - -esbuild-windows-32@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.14.tgz#05e9b159d664809f7a4a8a68ed048d193457b27d" - integrity sha512-pHBWrcA+/oLgvViuG9FO3kNPO635gkoVrRQwe6ZY1S0jdET07xe2toUvQoJQ8KT3/OkxqUasIty5hpuKFLD+eg== - -esbuild-windows-64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.14.tgz#d5ae086728ab30b72969e40ed0a7a0d9082f2cdd" - integrity sha512-CszIGQVk/P8FOS5UgAH4hKc9zOaFo69fe+k1rqgBHx3CSK3Opyk5lwYriIamaWOVjBt7IwEP6NALz+tkVWdFog== - -esbuild-windows-arm64@0.15.14: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.14.tgz#8eb50ab9a0ecaf058593fbad17502749306f801d" - integrity sha512-KW9W4psdZceaS9A7Jsgl4WialOznSURvqX/oHZk3gOP7KbjtHLSsnmSvNdzagGJfxbAe30UVGXRe8q8nDsOSQw== +esbuild-android-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz#fd959b034dd761d14e13dda6214b6948841ff4ff" + integrity sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q== + +esbuild-android-arm64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz#9733b71cf0229b4356f106a455b2cfdf7884aa59" + integrity sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ== + +esbuild-darwin-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz#fc3482fdf5e798dbc0b8b2fe13287d257a45efc6" + integrity sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ== + +esbuild-darwin-arm64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz#e922ec387c00fa84d664e14b5722fe13613f4adc" + integrity sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag== + +esbuild-freebsd-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz#69a42d79137d7d3ea718414c432bc10e8bb97c68" + integrity sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA== + +esbuild-freebsd-arm64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz#63b6d0dd492f7394f8d07a0e2b931151eb9d60c4" + integrity sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g== + +esbuild-linux-32@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz#7f295795fd7e61ea57d1135f717424a6771a7472" + integrity sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q== + +esbuild-linux-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz#11a430a86403b0411ca0a355b891f1cb8c4c4ec6" + integrity sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg== + +esbuild-linux-arm64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz#b65f9a2c60e8e5b62f6cfd392cd0410f22e8c390" + integrity sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g== + +esbuild-linux-arm@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz#c8e13e45a0a6f0cb145ce13ae26ce1d2551d9bcc" + integrity sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w== + +esbuild-linux-mips64le@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz#d4c24d47e43966fcac748c90621be7edd53456c0" + integrity sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A== + +esbuild-linux-ppc64le@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz#2eba53fe2282438ceca5471bdb57ba2e00216ed6" + integrity sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA== + +esbuild-linux-riscv64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz#1afa8dfe55a6c312f1904ee608b81417205f5027" + integrity sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw== + +esbuild-linux-s390x@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz#1f7b3c4429c8ca99920ba6bf356ccc5b38fabd34" + integrity sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ== + +esbuild-netbsd-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz#d72c7155686c938c1aff126209b689c22823347c" + integrity sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw== + +esbuild-openbsd-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz#761bd87ecab97386948eaf667a065cb0ecaa0f76" + integrity sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ== + +esbuild-sunos-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz#07e04cbf9747f281a967d09230a158a1be5b530c" + integrity sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA== + +esbuild-windows-32@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz#130d1982cc41fb67461e9f8a65c6ebd13a1f35bb" + integrity sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA== + +esbuild-windows-64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz#638bdf495c109c1882e8b0529cb8e2fea11383fb" + integrity sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA== + +esbuild-windows-arm64@0.15.15: + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz#5a277ce10de999d2a6465fc92a8c2a2d207ebd31" + integrity sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ== esbuild@^0.15.9: - version "0.15.14" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.14.tgz#09202b811f1710363d5088a3401a351351c79875" - integrity sha512-pJN8j42fvWLFWwSMG4luuupl2Me7mxciUOsMegKvwCmhEbJ2covUdFnihxm0FMIBV+cbwbtMoHgMCCI+pj1btQ== + version "0.15.15" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.15.tgz#503b70bdc18d72d8fc2962ed3ab9219249e58bbe" + integrity sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w== optionalDependencies: - "@esbuild/android-arm" "0.15.14" - "@esbuild/linux-loong64" "0.15.14" - esbuild-android-64 "0.15.14" - esbuild-android-arm64 "0.15.14" - esbuild-darwin-64 "0.15.14" - esbuild-darwin-arm64 "0.15.14" - esbuild-freebsd-64 "0.15.14" - esbuild-freebsd-arm64 "0.15.14" - esbuild-linux-32 "0.15.14" - esbuild-linux-64 "0.15.14" - esbuild-linux-arm "0.15.14" - esbuild-linux-arm64 "0.15.14" - esbuild-linux-mips64le "0.15.14" - esbuild-linux-ppc64le "0.15.14" - esbuild-linux-riscv64 "0.15.14" - esbuild-linux-s390x "0.15.14" - esbuild-netbsd-64 "0.15.14" - esbuild-openbsd-64 "0.15.14" - esbuild-sunos-64 "0.15.14" - esbuild-windows-32 "0.15.14" - esbuild-windows-64 "0.15.14" - esbuild-windows-arm64 "0.15.14" + "@esbuild/android-arm" "0.15.15" + "@esbuild/linux-loong64" "0.15.15" + esbuild-android-64 "0.15.15" + esbuild-android-arm64 "0.15.15" + esbuild-darwin-64 "0.15.15" + esbuild-darwin-arm64 "0.15.15" + esbuild-freebsd-64 "0.15.15" + esbuild-freebsd-arm64 "0.15.15" + esbuild-linux-32 "0.15.15" + esbuild-linux-64 "0.15.15" + esbuild-linux-arm "0.15.15" + esbuild-linux-arm64 "0.15.15" + esbuild-linux-mips64le "0.15.15" + esbuild-linux-ppc64le "0.15.15" + esbuild-linux-riscv64 "0.15.15" + esbuild-linux-s390x "0.15.15" + esbuild-netbsd-64 "0.15.15" + esbuild-openbsd-64 "0.15.15" + esbuild-sunos-64 "0.15.15" + esbuild-windows-32 "0.15.15" + esbuild-windows-64 "0.15.15" + esbuild-windows-arm64 "0.15.15" escalade@^3.1.1: version "3.1.1" @@ -4743,7 +4742,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7: +ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7, ethers@^5.7.2: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -5420,9 +5419,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== + version "13.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" + integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== dependencies: type-fest "^0.20.2" @@ -7682,9 +7681,9 @@ parse5-htmlparser2-tree-adapter@^7.0.0: parse5 "^7.0.0" parse5@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.1.tgz#4649f940ccfb95d8754f37f73078ea20afe0c746" - integrity sha512-kwpuwzB+px5WUg9pyK0IcK/shltJN5/OVhQagxhCQNtT9Y9QRZqNY2e1cmbu/paRh5LMnz/oVTVLBpjFmMZhSg== + version "7.1.2" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== dependencies: entities "^4.4.0" @@ -8149,9 +8148,9 @@ reduce-flatten@^2.0.0: integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== regenerator-runtime@^0.13.10: - version "0.13.10" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" - integrity sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw== + version "0.13.11" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== regexp.prototype.flags@^1.4.3: version "1.4.3" From 9e7a98a2724d053407733ba71cc8ae882c020d03 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 21 Nov 2022 17:22:18 -0500 Subject: [PATCH 0182/1302] added event handler with global config --- examples/multisig/ignition/Multisig.js | 1 + packages/core/src/Ignition.ts | 2 + .../execution/dispatch/executeAwaitedEvent.ts | 42 ++++++++++--------- .../core/src/services/TransactionsService.ts | 25 +++++++++++ packages/core/src/types/deployment.ts | 1 + packages/hardhat-plugin/src/index.ts | 4 ++ packages/hardhat-plugin/test/config.ts | 12 ++++++ .../with-config/hardhat.config.js | 1 + 8 files changed, 68 insertions(+), 20 deletions(-) diff --git a/examples/multisig/ignition/Multisig.js b/examples/multisig/ignition/Multisig.js index 76121ffaac..2fd16c22a2 100644 --- a/examples/multisig/ignition/Multisig.js +++ b/examples/multisig/ignition/Multisig.js @@ -20,6 +20,7 @@ module.exports = buildModule("MultisigModule", (m) => { after: [multisig], }); + // todo: support sending via non-default account const event = m.awaitEvent(multisig, "Confirmation", { args: [ACCOUNT_1, 0], after: [call], diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index d1a8b7007e..0c13e01423 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -30,6 +30,7 @@ export interface IgnitionDeployOptions { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; + awaitEventDuration: number; } type ModuleOutputs = Record; @@ -72,6 +73,7 @@ export class Ignition { maxRetries: options.maxRetries, gasIncrementPerRetry: options.gasIncrementPerRetry, pollingInterval: options.pollingInterval, + awaitEventDuration: options.awaitEventDuration, }); if (executionResult._kind === "failure") { diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index ff6b05c436..2c6b1be583 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -9,35 +9,35 @@ import { resolveFrom, toAddress } from "./utils"; export async function executeAwaitedEvent( { event, contract, args }: AwaitedEvent, resultAccumulator: Map, - _: ExecutionContext + { services, options }: ExecutionContext ): Promise { - console.log(event); - console.log(args); const resolve = resolveFrom(resultAccumulator); const resolvedArgs = args.map(resolve).map(toAddress); const { address, abi } = resolve(contract); - let attempt = 1; + let log; try { - while (true) { - console.log(`attempt ${attempt}`); - - const contractInstance = new Contract(address, abi); - - const results = contractInstance.filters[event](...resolvedArgs); - console.log("results"); - console.log(results); - - if (results.topics && results.topics.length !== 0) { - break; - } - - attempt++; + const contractInstance = new Contract(address, abi); + + const filter = contractInstance.filters[event](...resolvedArgs); + + log = await services.transactions.waitForEvent( + filter, + options.awaitEventDuration + ); + + if (log === null) { + // todo: implement on hold state + return { + _kind: "failure", + failure: new Error( + "Event not emitted within duration - try again later" + ), + }; } } catch (err) { - console.log(err); return { _kind: "failure", failure: err as any, @@ -46,6 +46,8 @@ export async function executeAwaitedEvent( return { _kind: "success", - result: {}, + result: { + hash: log.transactionHash, + }, }; } diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index 74f19f4907..4d2c7ffae5 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -4,6 +4,10 @@ import { Providers } from "types/providers"; export interface ITransactionsService { wait(txHash: string): Promise; + waitForEvent( + filter: ethers.EventFilter, + durationMs: number + ): Promise; } export class TransactionsService implements ITransactionsService { @@ -18,4 +22,25 @@ export class TransactionsService implements ITransactionsService { return provider.waitForTransaction(txHash); } + + public async waitForEvent( + filter: ethers.EventFilter, + durationMs: number + ): Promise { + const provider = new ethers.providers.Web3Provider( + this._providers.ethereumProvider + ); + + return new Promise((resolve) => { + const timeout = setTimeout(() => { + resolve(null); + }, durationMs); + + provider.once(filter, (log) => { + clearTimeout(timeout); + + resolve(log); + }); + }); + } } diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index f1a1a22714..c523153fcd 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -70,6 +70,7 @@ export interface ExecutionOptions { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; + awaitEventDuration: number; } export interface ExecutionContext { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 51c55f87af..ab059d2a1d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -23,6 +23,7 @@ export interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; + awaitEventDuration: number; } /* ignition config defaults */ @@ -31,6 +32,7 @@ const DEPLOYMENTS_DIR = "deployments"; const MAX_RETRIES = 4; const GAS_INCREMENT_PER_RETRY = null; const POLLING_INTERVAL = 300; +const AWAIT_EVENT_DURATION = 30000; // ms extendConfig((config, userConfig) => { /* setup path configs */ @@ -56,6 +58,8 @@ extendConfig((config, userConfig) => { gasIncrementPerRetry: userIgnitionConfig.gasIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, pollingInterval: userIgnitionConfig.pollingInterval ?? POLLING_INTERVAL, + awaitEventDuration: + userIgnitionConfig.awaitEventDuration ?? AWAIT_EVENT_DURATION, }; }); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 4c3e229902..9b87cf2df9 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -78,4 +78,16 @@ describe("config", () => { assert.equal(sendTxOptions.pollingInterval, 4); }); + + it("should apply awaitEventDuration", async function () { + await deployModule(this.hre, (m) => { + m.contract("Bar"); + + return {}; + }); + + const sendTxOptions = sendTxStub.getCalls()[0].lastArg; + + assert.equal(sendTxOptions.awaitEventDuration, 10000); + }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index f36825287e..c5f367c541 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -14,5 +14,6 @@ module.exports = { maxRetries: 1, gasIncrementPerRetry: BigNumber.from(1000), pollingInterval: 4, + awaitEventDuration: 10000, }, }; From a71fb943136f05db809c59b4cb7b3e3b741cca58 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 22 Nov 2022 04:47:00 -0500 Subject: [PATCH 0183/1302] added tests --- packages/core/src/utils/guards.ts | 7 + .../test/deploymentBuilder/awaitedEvent.ts | 249 ++++++++++++++++++ packages/core/test/execution.ts | 132 +++++++++- packages/core/test/validation.ts | 152 +++++++++++ 4 files changed, 529 insertions(+), 11 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/awaitedEvent.ts diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index a3ad571d1f..73b2901b01 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -6,6 +6,7 @@ import type { CallDeploymentVertex, HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, + AwaitVertex, } from "types/deploymentGraph"; import type { CallableFuture, @@ -51,6 +52,12 @@ export function isCall( return node.type === "Call"; } +export function isAwaitedEvent( + node: DeploymentGraphVertex +): node is AwaitVertex { + return node.type === "Await"; +} + export function isHardhatLibrary( node: DeploymentGraphVertex ): node is HardhatLibraryDeploymentVertex { diff --git a/packages/core/test/deploymentBuilder/awaitedEvent.ts b/packages/core/test/deploymentBuilder/awaitedEvent.ts new file mode 100644 index 0000000000..6db343b653 --- /dev/null +++ b/packages/core/test/deploymentBuilder/awaitedEvent.ts @@ -0,0 +1,249 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; +import { isAwaitedEvent, isCall, isHardhatContract } from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - await event", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const eventModule = buildModule("event", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); + const another = m.contract("Another"); + + const call = m.call(exchange, "addToken", { + args: [token], + after: [another], + }); + + m.awaitEvent(token, "Transfer", { args: [token], after: [call] }); + + return {}; + }); + + const { graph } = generateDeploymentGraphFrom(eventModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have five nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 5); + }); + + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); + + it("should have the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange/addToken"); + assert(isCall(depNode)); + }); + + it("should have the await event node Token/Transfer", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/Transfer" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Token/Transfer"); + assert(isAwaitedEvent(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show no dependencies for the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show three dependencies for the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + { id: 1, label: "Exchange", type: "" }, + { id: 2, label: "Another", type: "" }, + ]); + }); + + it("should show two dependencies for the call node Token/Transfer", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/Transfer" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + { + id: 3, + label: "Exchange/addToken", + type: "", + }, + ]); + }); + + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the contract node Exchange as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 0, + label: "Token", + type: "contract", + subtype: "hardhat", + contractName: "Token", + _future: true, + }, + ]); + }); + + it("should record the argument list for the event node Token at Token/Transfer", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/Transfer" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isAwaitedEvent(depNode)) { + return assert.fail("Not an awaited event dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 0, + label: "Token", + type: "contract", + subtype: "hardhat", + contractName: "Token", + _future: true, + }, + ]); + }); +}); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index f9e6f0436f..0bf22cda20 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -13,6 +13,8 @@ import { Artifact } from "types/hardhat"; import { buildAdjacencyListFrom } from "./graph/helpers"; import { getMockServices } from "./helpers"; +const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; + describe("Execution", () => { afterEach(() => { sinon.restore(); @@ -218,8 +220,7 @@ describe("Execution", () => { }; const response = await assertDependentVertex( - contractDeploy, - contractCall, + [contractDeploy, contractCall], mockServices ); @@ -236,6 +237,111 @@ describe("Execution", () => { }); }); + it("should execute an awaited event", async () => { + const fakeArtifact = { + contractName: "Test", + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "SomeEvent", + type: "event", + }, + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + bytecode: + "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", + linkReferences: {}, + }; + + const contractDeploy: ExecutionVertex = { + type: "ContractDeploy", + id: 0, + label: "Test", + artifact: fakeArtifact, + args: [], + libraries: {}, + value: ethers.utils.parseUnits("0"), + }; + + const contractCall: ExecutionVertex = { + type: "ContractCall", + id: 1, + label: "Test/test", + contract: { vertexId: 0, type: "contract", label: "Test", _future: true }, + method: "test", + args: [], + value: ethers.utils.parseUnits("0"), + }; + + const awaitedEvent: ExecutionVertex = { + type: "AwaitedEvent", + id: 2, + contract: { vertexId: 0, type: "contract", label: "Test", _future: true }, + label: "Test/SomeEvent", + event: "SomeEvent", + args: [ACCOUNT_0], + }; + + const sendTxStub = sinon.stub(); + sendTxStub.onCall(0).resolves("0x1"); + sendTxStub.onCall(1).resolves("0x2"); + + const waitForEventStub = sinon.stub(); + waitForEventStub.onFirstCall().resolves({ transactionHash: "0x3" }); + + const mockServices: Services = { + ...getMockServices(), + contracts: { + sendTx: sendTxStub, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash === "0x1") { + return { + contractAddress: "0x0000000000000000000000000000000000000001", + }; + } + + return { + contractAddress: "0x0000000000000000000000000000000000000002", + }; + }, + waitForEvent: waitForEventStub, + } as any, + }; + + const response = await assertDependentVertex( + [contractDeploy, contractCall, awaitedEvent], + mockServices + ); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(2), { + _kind: "success", + result: { + hash: "0x3", + }, + }); + }); + it("should ignore an already deployed contract", async () => { const contractDeploy: ExecutionVertex = { type: "DeployedContract", @@ -295,21 +401,25 @@ async function assertExecuteSingleVertex( deployment.state.transform.executionGraph = executionGraph; - return execute(deployment); + return execute(deployment, {} as any); } async function assertDependentVertex( - parent: ExecutionVertex, - child: ExecutionVertex, + vertexes: ExecutionVertex[], mockServices: Services ) { + const obj = {}; + const len = vertexes.length; + for (let i = 0; i < len; i++) { + obj[i] = i === len - 1 ? [] : [i + 1]; + } + const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = buildAdjacencyListFrom({ - 0: [1], - 1: [], + executionGraph.adjacencyList = buildAdjacencyListFrom(obj); + + vertexes.forEach((vertex, i) => { + executionGraph.vertexes.set(i, vertex); }); - executionGraph.vertexes.set(0, parent); - executionGraph.vertexes.set(1, child); const mockUpdateUiAction = () => {}; @@ -321,5 +431,5 @@ async function assertDependentVertex( deployment.state.transform.executionGraph = executionGraph; - return execute(deployment); + return execute(deployment, {} as any); } diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index fb3c783454..6818a6b1ea 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -478,6 +478,158 @@ describe("Validation", () => { }); }); + describe("awaited event", () => { + const exampleEventArtifact = { + _format: "hh-sol-artifact-1", + contractName: "Test", + sourceName: "contracts/Test.sol", + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + name: "SomeEvent", + type: "event", + }, + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + bytecode: + "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", + deployedBytecode: + "6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", + linkReferences: {}, + deployedLinkReferences: {}, + }; + + it("should validate a correct awaited event", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Test"); + + const call = m.call(example, "test", { args: [] }); + + m.awaitEvent(example, "SomeEvent", { after: [call], args: ["0x0"] }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleEventArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + assert.equal(validationResult._kind, "success"); + }); + + it("should fail awaiting a nonexistant event", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Test"); + + const call = m.call(example, "test", { args: [] }); + + m.awaitEvent(example, "Nonexistant", { args: [], after: [call] }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleEventArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Contract 'Test' doesn't have an event Nonexistant" + ); + }); + + it("should fail an awaited event with wrong number of arguments", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Test"); + + const call = m.call(example, "test", { args: [] }); + + m.awaitEvent(example, "SomeEvent", { after: [call], args: [] }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleEventArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Event SomeEvent in contract Test expects 1 arguments but 0 were given" + ); + }); + }); + describe("deployed contract", () => { it("should validate a correct artifact library deploy", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { From f8c1cc1b6949368509583cb47bf937eb818970dd Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 23 Nov 2022 01:07:53 -0500 Subject: [PATCH 0184/1302] pull out helper function from validation --- .../execution/dispatch/executeAwaitedEvent.ts | 8 +-- .../core/src/validation/dispatch/helpers.ts | 53 ++++++++++++++++++ .../validation/dispatch/validateAwaitEvent.ts | 54 +------------------ .../src/validation/dispatch/validateCall.ts | 54 +------------------ 4 files changed, 61 insertions(+), 108 deletions(-) create mode 100644 packages/core/src/validation/dispatch/helpers.ts diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index 2c6b1be583..efd10c153f 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -17,18 +17,18 @@ export async function executeAwaitedEvent( const { address, abi } = resolve(contract); - let log; + let eventResult; try { const contractInstance = new Contract(address, abi); const filter = contractInstance.filters[event](...resolvedArgs); - log = await services.transactions.waitForEvent( + eventResult = await services.transactions.waitForEvent( filter, options.awaitEventDuration ); - if (log === null) { + if (eventResult === null) { // todo: implement on hold state return { _kind: "failure", @@ -47,7 +47,7 @@ export async function executeAwaitedEvent( return { _kind: "success", result: { - hash: log.transactionHash, + hash: eventResult.transactionHash, }, }; } diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts new file mode 100644 index 0000000000..0b899beaae --- /dev/null +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -0,0 +1,53 @@ +import type { Services } from "services/types"; +import type { CallableFuture } from "types/future"; +import { resolveProxyValue } from "utils/proxy"; + +export async function resolveArtifactForCallableFuture( + givenFuture: CallableFuture, + { services }: { services: Services } +): Promise { + const future = resolveProxyValue(givenFuture); + + switch (future.type) { + case "contract": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "deployed": + return future.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.contractName + ); + return artifact.abi; + default: + return assertNeverDeploymentFuture(future); + } + case "library": + switch (future.subtype) { + case "artifact": + return future.artifact.abi; + case "hardhat": + const artifact = await services.artifacts.getArtifact( + future.libraryName + ); + return artifact.abi; + default: + return assertNeverDeploymentFuture(future); + } + case "virtual": + throw new Error(`Cannot call virtual future`); + case "call": + throw new Error(`Cannot call call future`); + case "await": + throw new Error(`Cannot call await future`); + default: + return assertNeverDeploymentFuture(future); + } +} + +function assertNeverDeploymentFuture(f: never): undefined { + throw new Error( + `Unexpected deployment future type/subtype ${JSON.stringify(f)}` + ); +} diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index a937548825..fa3e411086 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -2,9 +2,9 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { AwaitVertex } from "types/deploymentGraph"; -import { CallableFuture } from "types/future"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { resolveProxyValue } from "utils/proxy"; + +import { resolveArtifactForCallableFuture } from "./helpers"; export async function validateAwaitEvent( vertex: AwaitVertex, @@ -73,53 +73,3 @@ export async function validateAwaitEvent( result: undefined, }; } - -async function resolveArtifactForCallableFuture( - givenFuture: CallableFuture, - { services }: { services: Services } -): Promise { - const future = resolveProxyValue(givenFuture); - - switch (future.type) { - case "contract": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "deployed": - return future.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.contractName - ); - return artifact.abi; - default: - return assertNeverDeploymentFuture(future); - } - case "library": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.libraryName - ); - return artifact.abi; - default: - return assertNeverDeploymentFuture(future); - } - case "virtual": - throw new Error(`Cannot call virtual future`); - case "call": - throw new Error(`Cannot call call future`); - case "await": - throw new Error(`Cannot call await future`); - default: - return assertNeverDeploymentFuture(future); - } -} - -function assertNeverDeploymentFuture(f: never): undefined { - throw new Error( - `Unexpected deployment future type/subtype ${JSON.stringify(f)}` - ); -} diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index cfc43a14bb..998fdb789e 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -2,11 +2,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; -import { CallableFuture } from "types/future"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { IgnitionError } from "utils/errors"; import { isParameter } from "utils/guards"; -import { resolveProxyValue } from "utils/proxy"; + +import { resolveArtifactForCallableFuture } from "./helpers"; export async function validateCall( vertex: CallDeploymentVertex, @@ -82,53 +82,3 @@ export async function validateCall( result: undefined, }; } - -async function resolveArtifactForCallableFuture( - givenFuture: CallableFuture, - { services }: { services: Services } -): Promise { - const future = resolveProxyValue(givenFuture); - - switch (future.type) { - case "contract": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "deployed": - return future.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.contractName - ); - return artifact.abi; - default: - return assertNeverDeploymentFuture(future); - } - case "library": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.libraryName - ); - return artifact.abi; - default: - return assertNeverDeploymentFuture(future); - } - case "virtual": - throw new Error(`Cannot call virtual future`); - case "call": - throw new Error(`Cannot call call future`); - case "await": - throw new Error(`Cannot call await future`); - default: - return assertNeverDeploymentFuture(future); - } -} - -function assertNeverDeploymentFuture(f: never): undefined { - throw new Error( - `Unexpected deployment future type/subtype ${JSON.stringify(f)}` - ); -} From 2ac181a07bf345f0e7ee77e1d1b57b65d131ba96 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 23 Nov 2022 01:40:54 -0500 Subject: [PATCH 0185/1302] fix multisig test --- examples/multisig/ignition/Multisig.js | 8 ++--- examples/multisig/test/Multisig.js | 41 +++++++++++++------------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/examples/multisig/ignition/Multisig.js b/examples/multisig/ignition/Multisig.js index 2fd16c22a2..f79c44867a 100644 --- a/examples/multisig/ignition/Multisig.js +++ b/examples/multisig/ignition/Multisig.js @@ -6,7 +6,7 @@ const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; module.exports = buildModule("MultisigModule", (m) => { const owners = [ACCOUNT_0, ACCOUNT_1]; - const required = 2; + const required = 1; const value = ethers.utils.parseUnits("100"); // todo: support arbitrary tx @@ -21,12 +21,12 @@ module.exports = buildModule("MultisigModule", (m) => { }); // todo: support sending via non-default account - const event = m.awaitEvent(multisig, "Confirmation", { - args: [ACCOUNT_1, 0], + m.awaitEvent(multisig, "Confirmation", { + args: [ACCOUNT_0, 0], after: [call], }); - m.call(multisig, "executeTransaction", { args: [0], after: [event] }); + // m.call(multisig, "executeTransaction", { args: [0], after: [event] }); return { multisig }; }); diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 2a45bcfb7c..82267d2cb4 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -1,32 +1,33 @@ const { expect } = require("chai"); +const { ethers } = require("ethers"); + const Multisig = require("../ignition/Multisig"); -const namehash = require("eth-ens-namehash"); -const labelhash = (label) => - hre.ethers.utils.keccak256(hre.ethers.utils.toUtf8Bytes(label)); const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; describe("Multisig", function () { - it("should be able to create new subrecords", async function () { - // Arrange - const { ens, resolver } = await ignition.deploy(ENSModule); - - await ens.setSubnodeOwner( - namehash.hash("test"), - labelhash("alice"), - ACCOUNT_0 - ); + let multisig; - // Act - await resolver["setAddr(bytes32,address)"]( - namehash.hash("alice.test"), - ACCOUNT_1 + before(async () => { + const moduleResult = await ignition.deploy(Multisig); + + multisig = moduleResult.multisig; + }); + + it("should store a submitted transaction", async function () { + const submittedTx = await multisig.functions.transactions(0); + + expect(submittedTx.destination).to.equal(ACCOUNT_0); + expect(submittedTx.value.toString()).to.equal( + ethers.utils.parseUnits("50").toString() ); + expect(submittedTx.data).to.equal("0x00"); + expect(submittedTx.executed).to.equal(false); + }); - // Assert - const after = await resolver["addr(bytes32)"](namehash.hash("alice.test")); + it("should confirm a stored transaction", async function () { + const [isConfirmed] = await multisig.functions.confirmations(0, ACCOUNT_0); - expect(after).to.equal(ACCOUNT_1); + expect(isConfirmed).to.equal(true); }); }); From 7786691ff92d56e8871d0d0486e405038f473038 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 23 Nov 2022 02:16:54 -0500 Subject: [PATCH 0186/1302] added docs for `awaitEvent` --- docs/creating-modules-for-deployment.md | 23 +++++++++++------------ docs/running-a-deployment.md | 10 ++++++++++ examples/multisig/README.md | 21 +++++++++++++++++++++ 3 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 examples/multisig/README.md diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index f2e649547b..b28339f496 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -16,7 +16,7 @@ - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - [Transfering _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) - - [Waiting for on-chain events (TBD)](./creating-modules-for-deployment.md#waiting-for-on-chain-events-tbd) + - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - [Switching based on the _Network Chain ID_](./creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) @@ -228,25 +228,24 @@ if (totalSupply > 0) { Because `totalSupply` is not a number, it is a future. -## Waiting for on-chain events (TBD) +## Waiting for on-chain events -A deployment can be put `on-hold` until an on-chain action, external to the deployment, has taken place (for instance a timelock or multisig approval). The `await` condition can be specified: +A deployment can be put `on-hold` until an on-chain event has been emitted (for instance a timelock or multisig approval): ```tsx -let multisig = m.deploy("Multisig"); +const multisig = m.deploy("Multisig"); -m.call(multisig, "authorize"); +const call = m.call(multisig, "authorize"); -m.await({ - from: "0xUser1", - to: multisig.address, - // value: 20.toWei(), - // function: 'authorize', - events: [{ name: "AuthorizedBy", data: "0xUser1" }], +m.awaitEvent(multisig, "AuthorizedBy", { + args: ["0xUser1"], + after: [call], }); ``` -The `await` during deployment will check whether a transaction matching the parameters has occured. If it has, the deployment will continue, if not the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `await` condition. +The `awaitEvent` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `awaitEvent` condition. + +A full example of the `awaitEvent` function can be seen in our [Multisig example](../examples/multisig/README.md). ## Including modules within modules diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 7adf93c498..b5969726f6 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -62,6 +62,7 @@ interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; // milliseconds + awaitEventDuration: number; // milliseconds } ``` @@ -75,6 +76,7 @@ module.exports = { maxRetries: 10, gasIncrementPerRetry: ethers.utils.parseUnits("0.001"), pollingInterval: 300, + awaitEventDuration: 10000, }, }; ``` @@ -93,6 +95,14 @@ The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed The value of `pollingInterval` is the number of milliseconds the process will wait between polls when checking if the transaction has been confirmed yet. The default value is 300 milliseconds. +--- + +`awaitEventDuration` + +--- + +This config value determines how long `m.awaitEvent` waits for the given event to be emitted on-chain before marking the deployment as "on-hold". It should be given as a number of milliseconds, with the default value being 30000, or 30 seconds. + ## Resuming a failed or onhold deployment (TBD) Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? diff --git a/examples/multisig/README.md b/examples/multisig/README.md new file mode 100644 index 0000000000..31004079c5 --- /dev/null +++ b/examples/multisig/README.md @@ -0,0 +1,21 @@ +# Multisig Example for Ignition + +This hardhat project is an example of using ignition to deploy a basic Multisig contract. + +The module demonstrates how `m.awaitEvent(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy Multisig.js +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +yarn test:examples +``` From 6c00b60573d54875fb45bb8908a1f44273b90f7c Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 23 Nov 2022 02:28:39 -0500 Subject: [PATCH 0187/1302] fix multisig contract --- examples/multisig/contracts/Timelock.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/multisig/contracts/Timelock.sol b/examples/multisig/contracts/Timelock.sol index cd2addbf85..ceaf0a387b 100644 --- a/examples/multisig/contracts/Timelock.sol +++ b/examples/multisig/contracts/Timelock.sol @@ -1 +1,4 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.5; + import "@openzeppelin/contracts/governance/TimelockController.sol"; From 369f19679352d0323b6737a6e631bd57e58faab6 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 29 Nov 2022 10:47:26 -0500 Subject: [PATCH 0188/1302] temp disable for multisig tests --- examples/multisig/test/Multisig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 82267d2cb4..556963db1d 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -5,7 +5,7 @@ const Multisig = require("../ignition/Multisig"); const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -describe("Multisig", function () { +describe.skip("Multisig", function () { let multisig; before(async () => { From 2d59765d9b402f718e252302e17436d0f04a30e6 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 30 Nov 2022 03:59:10 -0500 Subject: [PATCH 0189/1302] getBytesForArtifact implementation --- examples/create2/test/create2.test.js | 7 ++--- packages/core/src/dsl/DeploymentBuilder.ts | 12 +++++++++ ...onvertDeploymentVertexToExecutionVertex.ts | 17 +++++++++--- packages/core/src/types/deploymentGraph.ts | 3 +++ packages/core/src/types/future.ts | 12 ++++++++- packages/core/src/utils/errors.ts | 6 +++++ packages/core/src/utils/guards.ts | 12 +++++++++ .../core/src/validation/dispatch/helpers.ts | 26 +++++++++++++++++++ .../dispatch/validateArtifactContract.ts | 17 +++++++++--- .../dispatch/validateArtifactLibrary.ts | 11 ++++++++ .../validation/dispatch/validateAwaitEvent.ts | 14 +++++++++- .../src/validation/dispatch/validateCall.ts | 18 ++++++++++--- .../dispatch/validateHardhatContract.ts | 14 +++++++--- .../dispatch/validateHardhatLibrary.ts | 13 +++++++--- packages/core/test/execution.ts | 2 ++ packages/core/test/validation.ts | 2 +- 16 files changed, 161 insertions(+), 25 deletions(-) diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js index 754e1d5f32..420ef2d3bd 100644 --- a/examples/create2/test/create2.test.js +++ b/examples/create2/test/create2.test.js @@ -7,20 +7,17 @@ describe("Create2", function () { let factory; before(async () => { - const FooArtifact = await hre.artifacts.readArtifact("Foo"); - const BarArtifact = await hre.artifacts.readArtifact("Bar"); - const DeployViaCreate2Module = buildModule( "DeployViaCreate2Module", (m) => { const { create2 } = m.useModule(Create2FactoryModule); m.call(create2, "deploy", { - args: [0, toBytes32(1), FooArtifact.bytecode], + args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], }); m.call(create2, "deploy", { - args: [0, toBytes32(2), BarArtifact.bytecode], + args: [0, toBytes32(2), m.getBytesForArtifact("Bar")], }); return { create2 }; diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 19454173bd..9dfa6ed89e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -32,6 +32,7 @@ import type { DependableFuture, ProxyFuture, AwaitFuture, + BytesFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; @@ -340,6 +341,17 @@ export class DeploymentBuilder implements IDeploymentBuilder { return paramFuture; } + public getBytesForArtifact(artifactName: string): BytesFuture { + const bytesFuture: BytesFuture = { + label: artifactName, + type: "bytes", + scope: this.scopes.getScopedLabel(), + _future: true, + }; + + return bytesFuture; + } + public useSubgraph( subgraph: Subgraph, options?: UseSubgraphOptions diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index a99e0e2473..01fc2126f0 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -21,9 +21,9 @@ import { ExecutionVertex, LibraryDeploy, } from "types/executionGraph"; -import { DeploymentGraphFuture } from "types/future"; +import { BytesFuture, DeploymentGraphFuture } from "types/future"; import { Artifact } from "types/hardhat"; -import { isFuture } from "utils/guards"; +import { isBytesArg, isFuture } from "utils/guards"; interface TransformContext { services: Services; @@ -202,7 +202,9 @@ async function convertArgs( const resolvedArgs = []; for (const arg of args) { - const resolvedArg = await resolveParameter(arg, transformContext); + const resolvedArg = isBytesArg(arg) + ? await resolveBytesForArtifact(arg, transformContext.services) + : await resolveParameter(arg, transformContext); resolvedArgs.push(resolvedArg); } @@ -257,6 +259,15 @@ async function resolveParameter( return services.config.getParam(arg.label); } +async function resolveBytesForArtifact( + arg: BytesFuture, + services: Services +): Promise { + const artifact = await services.artifacts.getArtifact(arg.label); + + return artifact.bytecode; +} + function assertNeverParamResult(hasParamResult: never) { throw new Error(`Unexpected error code ${hasParamResult}`); } diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index b45af4a233..05e0664f82 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -16,6 +16,7 @@ import { CallableFuture, Virtual, ParameterFuture, + BytesFuture, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -190,6 +191,8 @@ export interface IDeploymentBuilder { defaultValue: ParameterValue ) => OptionalParameter; + getBytesForArtifact: (artifactName: string) => BytesFuture; + useSubgraph: ( subgraph: Subgraph, options?: UseSubgraphOptions diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 13357a94a6..9f93acdd97 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -78,6 +78,13 @@ export interface OptionalParameter { _future: true; } +export interface BytesFuture { + label: string; + type: "bytes"; + scope: string; + _future: true; +} + export interface Virtual { vertexId: number; label: string; @@ -111,7 +118,10 @@ export type DependableFuture = export type ParameterFuture = RequiredParameter | OptionalParameter; -export type DeploymentGraphFuture = DependableFuture | ParameterFuture; +export type DeploymentGraphFuture = + | DependableFuture + | ParameterFuture + | BytesFuture; export interface FutureDict { [key: string]: DeploymentGraphFuture; diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 44141875e0..1020e9b7bb 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,6 +1,12 @@ import { BigNumber } from "ethers"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +export class InvalidArtifactError extends NomicLabsHardhatPluginError { + constructor(name: string) { + super("ignition", `Artifact with name '${name}' doesn't exist`); + } +} + export class IgnitionError extends NomicLabsHardhatPluginError { constructor(message: string) { super("ignition", message); diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 73b2901b01..01ef3188c7 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -1,3 +1,5 @@ +import { BigNumber } from "ethers"; + import type { DeploymentGraphVertex, HardhatContractDeploymentVertex, @@ -7,6 +9,7 @@ import type { HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, AwaitVertex, + InternalParamValue, } from "types/deploymentGraph"; import type { CallableFuture, @@ -16,6 +19,7 @@ import type { RequiredParameter, Virtual, ProxyFuture, + BytesFuture, } from "types/future"; import { Artifact } from "types/hardhat"; @@ -105,6 +109,14 @@ export function isParameter( return future.type === "parameter"; } +export function isBytesArg(arg: InternalParamValue): arg is BytesFuture { + return ( + typeof arg === "object" && + !BigNumber.isBigNumber(arg) && + arg.type === "bytes" + ); +} + export function isCallable( future: DeploymentGraphFuture ): future is CallableFuture { diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 0b899beaae..107642cdab 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -1,5 +1,9 @@ import type { Services } from "services/types"; +import { InternalParamValue } from "types/deploymentGraph"; import type { CallableFuture } from "types/future"; +import { VertexVisitResultFailure } from "types/graph"; +import { InvalidArtifactError } from "utils/errors"; +import { isBytesArg } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; export async function resolveArtifactForCallableFuture( @@ -46,6 +50,28 @@ export async function resolveArtifactForCallableFuture( } } +export async function validateBytesForArtifact( + args: InternalParamValue[], + services: Services +): Promise { + const bytesArgs = args.filter(isBytesArg); + + const bytesExists = await Promise.all( + bytesArgs.map((v) => services.artifacts.hasArtifact(v.label)) + ); + + const bytesDoesNotExistIndex = bytesExists.findIndex((v) => !v); + + if (bytesDoesNotExistIndex === -1) { + return null; + } + + return { + _kind: "failure", + failure: new InvalidArtifactError(bytesArgs[bytesDoesNotExistIndex].label), + }; +} + function assertNeverDeploymentFuture(f: never): undefined { throw new Error( `Unexpected deployment future type/subtype ${JSON.stringify(f)}` diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index 7024fe18e5..24c2a9bc5c 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -3,9 +3,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { IgnitionError } from "utils/errors"; +import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isArtifact, isParameter } from "utils/guards"; +import { validateBytesForArtifact } from "./helpers"; + export async function validateArtifactContract( vertex: ArtifactContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, @@ -18,14 +20,21 @@ export async function validateArtifactContract( }; } + const invalidBytes = await validateBytesForArtifact( + vertex.args, + _context.services + ); + + if (invalidBytes !== null) { + return invalidBytes; + } + const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { return { _kind: "failure", - failure: new Error( - `Artifact not provided for contract '${vertex.label}'` - ), + failure: new InvalidArtifactError(vertex.label), }; } diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 10db27ef59..326c4c6e16 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -5,11 +5,22 @@ import { ArtifactLibraryDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { isArtifact } from "utils/guards"; +import { validateBytesForArtifact } from "./helpers"; + export async function validateArtifactLibrary( vertex: ArtifactLibraryDeploymentVertex, _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { + const invalidBytes = await validateBytesForArtifact( + vertex.args, + _context.services + ); + + if (invalidBytes !== null) { + return invalidBytes; + } + const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index fa3e411086..630e619ecc 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -4,7 +4,10 @@ import { Services } from "services/types"; import { AwaitVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { resolveArtifactForCallableFuture } from "./helpers"; +import { + resolveArtifactForCallableFuture, + validateBytesForArtifact, +} from "./helpers"; export async function validateAwaitEvent( vertex: AwaitVertex, @@ -13,6 +16,15 @@ export async function validateAwaitEvent( ): Promise { const contractName = vertex.contract.label; + const invalidBytes = await validateBytesForArtifact( + vertex.args, + context.services + ); + + if (invalidBytes !== null) { + return invalidBytes; + } + const artifactAbi = await resolveArtifactForCallableFuture( vertex.contract, context diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 998fdb789e..24c82d9ee8 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -3,10 +3,13 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { IgnitionError } from "utils/errors"; +import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; -import { resolveArtifactForCallableFuture } from "./helpers"; +import { + resolveArtifactForCallableFuture, + validateBytesForArtifact, +} from "./helpers"; export async function validateCall( vertex: CallDeploymentVertex, @@ -20,6 +23,15 @@ export async function validateCall( }; } + const invalidBytes = await validateBytesForArtifact( + vertex.args, + context.services + ); + + if (invalidBytes !== null) { + return invalidBytes; + } + const contractName = vertex.contract.label; const artifactAbi = await resolveArtifactForCallableFuture( @@ -30,7 +42,7 @@ export async function validateCall( if (artifactAbi === undefined) { return { _kind: "failure", - failure: new Error(`Artifact with name '${contractName}' doesn't exist`), + failure: new InvalidArtifactError(contractName), }; } diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 26e095754a..11dc23dafc 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -3,9 +3,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { IgnitionError } from "utils/errors"; +import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; +import { validateBytesForArtifact } from "./helpers"; + export async function validateHardhatContract( vertex: HardhatContractDeploymentVertex, _resultAccumulator: ResultsAccumulator, @@ -18,6 +20,12 @@ export async function validateHardhatContract( }; } + const invalidBytes = await validateBytesForArtifact(vertex.args, services); + + if (invalidBytes !== null) { + return invalidBytes; + } + const artifactExists = await services.artifacts.hasArtifact( vertex.contractName ); @@ -25,9 +33,7 @@ export async function validateHardhatContract( if (!artifactExists) { return { _kind: "failure", - failure: new Error( - `Artifact with name '${vertex.contractName}' doesn't exist` - ), + failure: new InvalidArtifactError(vertex.contractName), }; } diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index e7327c55fd..75b052bc96 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -3,12 +3,21 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { HardhatLibraryDeploymentVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { InvalidArtifactError } from "utils/errors"; + +import { validateBytesForArtifact } from "./helpers"; export async function validateHardhatLibrary( vertex: HardhatLibraryDeploymentVertex, _resultAccumulator: ResultsAccumulator, { services }: { services: Services } ): Promise { + const invalidBytes = await validateBytesForArtifact(vertex.args, services); + + if (invalidBytes !== null) { + return invalidBytes; + } + const artifactExists = await services.artifacts.hasArtifact( vertex.libraryName ); @@ -16,9 +25,7 @@ export async function validateHardhatLibrary( if (!artifactExists) { return { _kind: "failure", - failure: new Error( - `Library with name '${vertex.libraryName}' doesn't exist` - ), + failure: new InvalidArtifactError(vertex.libraryName), }; } diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 0bf22cda20..4757bed159 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -184,6 +184,7 @@ describe("Execution", () => { artifact: fakeArtifact, args: [], libraries: {}, + value: ethers.utils.parseUnits("0"), }; const contractCall: ExecutionVertex = { @@ -193,6 +194,7 @@ describe("Execution", () => { contract: { vertexId: 0, type: "contract", label: "Foo", _future: true }, method: "inc", args: [1], + value: ethers.utils.parseUnits("0"), }; const sendTxStub = sinon.stub(); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 6818a6b1ea..75ca227558 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -858,7 +858,7 @@ describe("Validation", () => { assert.equal(text, "Validation failed"); assert.equal( error.message, - "Library with name 'Nonexistant' doesn't exist" + "Artifact with name 'Nonexistant' doesn't exist" ); }); }); From c2cca682f70b38d2849c0c42c01a1782fde4348a Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 30 Nov 2022 04:06:08 -0500 Subject: [PATCH 0190/1302] remove unneeded scope field --- packages/core/src/dsl/DeploymentBuilder.ts | 1 - packages/core/src/types/future.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 9dfa6ed89e..ad331a9e55 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -345,7 +345,6 @@ export class DeploymentBuilder implements IDeploymentBuilder { const bytesFuture: BytesFuture = { label: artifactName, type: "bytes", - scope: this.scopes.getScopedLabel(), _future: true, }; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 9f93acdd97..dafeea5770 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -81,7 +81,6 @@ export interface OptionalParameter { export interface BytesFuture { label: string; type: "bytes"; - scope: string; _future: true; } From dcd0250caa5d26d31c06c7032779a54d9222a8eb Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 30 Nov 2022 05:34:43 -0500 Subject: [PATCH 0191/1302] tests and docs for getBytesForArtifact --- docs/creating-modules-for-deployment.md | 6 +- .../deploymentBuilder/getBytesForArtifact.ts | 89 +++++++++ packages/core/test/validation.ts | 169 ++++++++++++++++++ 3 files changed, 261 insertions(+), 3 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/getBytesForArtifact.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index b28339f496..e8ffd32d55 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -12,7 +12,7 @@ - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) - [Deploying from an artifact](./creating-modules-for-deployment.md#deploying-from-an-artifact) - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) - - [Create2 (TBD)](./creating-modules-for-deployment.md#create2-tbd) + - [Create2](./creating-modules-for-deployment.md#create2) - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - [Transfering _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) @@ -133,7 +133,7 @@ const contract = m.contract("Contract", { A library is deployed in the same way as a contract. -### Create2 (TBD) +### Create2 `Create2` allows for reliably determining the address of a contract before it is deployed. @@ -177,7 +177,7 @@ module.exports = buildModule("Create2Example", (m) => { ], }); - return { create2, foo: m.asContract(fooAddress) }; + return { create2, foo: m.contractAt(fooAddress) }; }); ``` diff --git a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts new file mode 100644 index 0000000000..ecd4996ae1 --- /dev/null +++ b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts @@ -0,0 +1,89 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; +import { isCall, isHardhatContract } from "utils/guards"; + +import { getDeploymentVertexByLabel } from "./helpers"; + +describe("deployment builder - getBytesForArtifact", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const exchange = m.contract("Exchange"); + const another = m.contract("Another"); + + m.call(exchange, "addToken", { + args: [m.getBytesForArtifact("Token")], + after: [another], + }); + + return {}; + }); + + const { graph } = generateDeploymentGraphFrom(callModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); + }); + + it("should have the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); + + it("should have the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange/addToken"); + assert(isCall(depNode)); + }); + + it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + label: "Token", + type: "bytes", + _future: true, + }, + ]); + }); +}); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 75ca227558..19958472d5 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,5 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import sinon from "sinon"; import { buildModule } from "dsl/buildModule"; import { buildSubgraph } from "dsl/buildSubgraph"; @@ -113,6 +114,48 @@ describe("Validation", () => { assert.equal(text, "Validation failed"); assert.equal(error.message, "For contract 'value' must be a BigNumber"); }); + + it("should not validate a artifact contract deploy with a non-existent bytes artifact arg", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Example", exampleArtifact, { + args: [1, 2, m.getBytesForArtifact("Nonexistant")], + }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact(_name: string) { + return false; + }, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Artifact with name 'Nonexistant' doesn't exist" + ); + }); }); describe("artifact library deploy", () => { @@ -175,6 +218,48 @@ describe("Validation", () => { "The constructor of the library 'Example' expects 0 arguments but 3 were given" ); }); + + it("should not validate a artifact library deploy with a non-existent bytes artifact arg", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.library("Example", exampleArtifact, { + args: [1, 2, m.getBytesForArtifact("Nonexistant")], + }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact(_name: string) { + return false; + }, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Artifact with name 'Nonexistant' doesn't exist" + ); + }); }); describe("call", () => { @@ -476,6 +561,50 @@ describe("Validation", () => { assert.equal(text, "Validation failed"); assert.equal(error.message, "For call 'value' must be a BigNumber"); }); + + it("should fail a call with a non-existent bytes artifact arg", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "nonexistant", { + args: [m.getBytesForArtifact("Bar")], + }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const fakeHasArtifact = sinon.stub(); + fakeHasArtifact.onFirstCall().resolves(true); + fakeHasArtifact.onSecondCall().resolves(false); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: fakeHasArtifact, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, "Artifact with name 'Bar' doesn't exist"); + }); }); describe("awaited event", () => { @@ -794,6 +923,46 @@ describe("Validation", () => { assert.equal(text, "Validation failed"); assert.equal(error.message, "For contract 'value' must be a BigNumber"); }); + + it("should not validate a contract with non-existing bytes artifact arg", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const nonexistant = m.contract("Nonexistant", { + args: [m.getBytesForArtifact("Nonexistant")], + }); + + return { nonexistant }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => false, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal( + error.message, + "Artifact with name 'Nonexistant' doesn't exist" + ); + }); }); describe("hardhat library deploy", () => { From fc67cad6febb27564a676cfa3a0344b145901ff6 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 2 Dec 2022 01:19:02 -0500 Subject: [PATCH 0192/1302] resolve AwaitFuture to emitted event args --- docs/creating-modules-for-deployment.md | 4 +++- examples/multisig/ignition/Multisig.js | 4 ++-- examples/multisig/test/Multisig.js | 7 +++++++ .../src/execution/dispatch/executeAwaitedEvent.ts | 10 ++++++---- packages/core/src/types/serialization.ts | 11 +++++++++-- packages/core/src/utils/serialize.ts | 2 ++ packages/hardhat-plugin/src/ignition-wrapper.ts | 10 +++++++--- 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index e8ffd32d55..8f0b2b4954 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -237,7 +237,7 @@ const multisig = m.deploy("Multisig"); const call = m.call(multisig, "authorize"); -m.awaitEvent(multisig, "AuthorizedBy", { +const event = m.awaitEvent(multisig, "AuthorizedBy", { args: ["0xUser1"], after: [call], }); @@ -245,6 +245,8 @@ m.awaitEvent(multisig, "AuthorizedBy", { The `awaitEvent` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `awaitEvent` condition. +Upon execution, the `AwaitFuture` will be resolved to the values of the args emitted by the given event. You can then use those values in tests or other modules as expected. + A full example of the `awaitEvent` function can be seen in our [Multisig example](../examples/multisig/README.md). ## Including modules within modules diff --git a/examples/multisig/ignition/Multisig.js b/examples/multisig/ignition/Multisig.js index f79c44867a..122f6492aa 100644 --- a/examples/multisig/ignition/Multisig.js +++ b/examples/multisig/ignition/Multisig.js @@ -21,12 +21,12 @@ module.exports = buildModule("MultisigModule", (m) => { }); // todo: support sending via non-default account - m.awaitEvent(multisig, "Confirmation", { + const event = m.awaitEvent(multisig, "Confirmation", { args: [ACCOUNT_0, 0], after: [call], }); // m.call(multisig, "executeTransaction", { args: [0], after: [event] }); - return { multisig }; + return { multisig, event }; }); diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 556963db1d..4e25c7e4f3 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -7,11 +7,13 @@ const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; describe.skip("Multisig", function () { let multisig; + let event; before(async () => { const moduleResult = await ignition.deploy(Multisig); multisig = moduleResult.multisig; + event = moduleResult.event; }); it("should store a submitted transaction", async function () { @@ -30,4 +32,9 @@ describe.skip("Multisig", function () { expect(isConfirmed).to.equal(true); }); + + it("should emit the sender and transaction id after confirming a stored transaction", async function () { + expect(event.sender).to.equal(ACCOUNT_0); + expect(ethers.BigNumber.from("0").eq(event.transactionId)).to.be.true; + }); }); diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index efd10c153f..e5f4e97e30 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -1,4 +1,4 @@ -import { Contract } from "ethers"; +import { Contract, ethers } from "ethers"; import { ExecutionContext } from "types/deployment"; import { AwaitedEvent } from "types/executionGraph"; @@ -17,13 +17,13 @@ export async function executeAwaitedEvent( const { address, abi } = resolve(contract); - let eventResult; + let topics: ethers.utils.Result; try { const contractInstance = new Contract(address, abi); const filter = contractInstance.filters[event](...resolvedArgs); - eventResult = await services.transactions.waitForEvent( + const eventResult = await services.transactions.waitForEvent( filter, options.awaitEventDuration ); @@ -37,6 +37,8 @@ export async function executeAwaitedEvent( ), }; } + + topics = contractInstance.interface.parseLog(eventResult).args; } catch (err) { return { _kind: "failure", @@ -47,7 +49,7 @@ export async function executeAwaitedEvent( return { _kind: "success", result: { - hash: eventResult.transactionHash, + topics, }, }; } diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 6fe61d76a5..6fd6d197a7 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -1,14 +1,17 @@ +import type { ethers } from "ethers"; + export type SerializedFutureResult = | { _kind: "string"; value: string } | { _kind: "number"; value: number } | { _kind: "contract"; value: Contract } - | { _kind: "tx"; value: Tx }; + | { _kind: "tx"; value: Tx } + | { _kind: "event"; value: Event }; export interface SerializedDeploymentResult { [key: string]: SerializedFutureResult; } -export type FutureOutput = string | number | Contract | Tx; +export type FutureOutput = string | number | Contract | Tx | Event; export interface Contract { name: string; @@ -19,3 +22,7 @@ export interface Contract { export interface Tx { hash: string; } + +export interface Event { + topics: ethers.utils.Result; +} diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index b9bb7e0635..542c824039 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -9,6 +9,8 @@ export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { return { _kind: "contract" as const, value: x }; } else if ("hash" in x) { return { _kind: "tx" as const, value: x }; + } else if ("topics" in x) { + return { _kind: "event" as const, value: x }; } const exhaustiveCheck: never = x; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 4ce41e66f3..afface6d19 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -6,7 +6,7 @@ import { ModuleDict, ModuleParams, } from "@ignored/ignition-core"; -import { Contract } from "ethers"; +import { Contract, ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { renderToCli } from "./ui/renderToCli"; @@ -14,7 +14,7 @@ import { renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; interface DeployResult { - [key: string]: string | number | Contract; + [key: string]: string | number | Contract | ethers.utils.Result; } export class IgnitionWrapper { @@ -68,7 +68,9 @@ export class IgnitionWrapper { } } - const resolvedOutput: { [key: string]: string | number | Contract } = {}; + const resolvedOutput: { + [key: string]: string | number | Contract | ethers.utils.Result; + } = {}; for (const [key, serializedFutureResult] of Object.entries( deploymentResult.result )) { @@ -79,6 +81,8 @@ export class IgnitionWrapper { resolvedOutput[key] = serializedFutureResult.value; } else if (serializedFutureResult._kind === "tx") { resolvedOutput[key] = serializedFutureResult.value.hash; + } else if (serializedFutureResult._kind === "event") { + resolvedOutput[key] = serializedFutureResult.value.topics; } else { const { abi, address } = serializedFutureResult.value; From a19c9376f3ac9ccf078d15d2724cde6957357ebd Mon Sep 17 00:00:00 2001 From: morgansliman Date: Fri, 2 Dec 2022 02:27:17 -0500 Subject: [PATCH 0193/1302] fix test --- packages/core/test/execution.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 4757bed159..5dcd6cc895 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -298,12 +298,19 @@ describe("Execution", () => { args: [ACCOUNT_0], }; + const iface = new ethers.utils.Interface(fakeArtifact.abi); + + const fakeLog = iface.encodeEventLog( + ethers.utils.EventFragment.from(fakeArtifact.abi[0]), + ["0x0000000000000000000000000000000000000003"] + ); + const sendTxStub = sinon.stub(); sendTxStub.onCall(0).resolves("0x1"); sendTxStub.onCall(1).resolves("0x2"); const waitForEventStub = sinon.stub(); - waitForEventStub.onFirstCall().resolves({ transactionHash: "0x3" }); + waitForEventStub.onFirstCall().resolves(fakeLog); const mockServices: Services = { ...getMockServices(), @@ -339,7 +346,7 @@ describe("Execution", () => { assert.deepStrictEqual(response.result.get(2), { _kind: "success", result: { - hash: "0x3", + topics: ["0x0000000000000000000000000000000000000003"], }, }); }); From 59c71eb78c4f3ab1ed84a0dc272e5d4ce4928c5a Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 7 Dec 2022 04:26:26 -0500 Subject: [PATCH 0194/1302] most of event params added --- docs/creating-modules-for-deployment.md | 2 +- examples/multisig/ignition/Multisig.js | 9 +- examples/multisig/package.json | 2 +- examples/multisig/test/Multisig.js | 2 +- packages/core/src/dsl/DeploymentBuilder.ts | 91 ++++++++++++------- .../execution/dispatch/executeAwaitedEvent.ts | 8 +- ...onvertDeploymentVertexToExecutionVertex.ts | 24 +++-- packages/core/src/types/deploymentGraph.ts | 16 ++-- packages/core/src/types/executionGraph.ts | 5 +- packages/core/src/types/future.ts | 19 +++- packages/core/src/utils/guards.ts | 6 +- packages/core/src/utils/proxy.ts | 6 +- .../validation/dispatch/validateAwaitEvent.ts | 36 +++++--- .../validation/dispatch/validationDispatch.ts | 2 +- .../test/deploymentBuilder/awaitedEvent.ts | 2 +- yarn.lock | 1 + 16 files changed, 149 insertions(+), 82 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 8f0b2b4954..21cf9b36ec 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -245,7 +245,7 @@ const event = m.awaitEvent(multisig, "AuthorizedBy", { The `awaitEvent` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `awaitEvent` condition. -Upon execution, the `AwaitFuture` will be resolved to the values of the args emitted by the given event. You can then use those values in tests or other modules as expected. +Upon execution, the `EventFuture` will be resolved to the values of the args emitted by the given event. You can then use those values in tests or other modules as expected. A full example of the `awaitEvent` function can be seen in our [Multisig example](../examples/multisig/README.md). diff --git a/examples/multisig/ignition/Multisig.js b/examples/multisig/ignition/Multisig.js index 122f6492aa..f6f42594b1 100644 --- a/examples/multisig/ignition/Multisig.js +++ b/examples/multisig/ignition/Multisig.js @@ -1,6 +1,8 @@ const { ethers } = require("ethers"); const { buildModule } = require("@ignored/hardhat-ignition"); +const MultisigArtifact = require("../artifacts/contracts/Multisig.sol/Multisig.json"); + const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; @@ -10,7 +12,7 @@ module.exports = buildModule("MultisigModule", (m) => { const value = ethers.utils.parseUnits("100"); // todo: support arbitrary tx - const multisig = m.contract("Multisig", { + const multisig = m.contract("Multisig", MultisigArtifact, { args: [owners, required], value, }); @@ -26,7 +28,10 @@ module.exports = buildModule("MultisigModule", (m) => { after: [call], }); - // m.call(multisig, "executeTransaction", { args: [0], after: [event] }); + m.call(multisig, "executeTransaction", { + args: [event.params.transactionId], + after: [event], + }); return { multisig, event }; }); diff --git a/examples/multisig/package.json b/examples/multisig/package.json index b69fd77518..54955db387 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.2.1", - "@ignored/hardhat-ignition": "^0.0.3", + "@ignored/hardhat-ignition": "^0.0.4", "@nomicfoundation/hardhat-toolbox": "2.0.0", "@openzeppelin/contracts": "^4.3.2", "chai": "^4.3.4", diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 4e25c7e4f3..beb417786f 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -5,7 +5,7 @@ const Multisig = require("../ignition/Multisig"); const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -describe.skip("Multisig", function () { +describe("Multisig", function () { let multisig; let event; diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index ad331a9e55..e0550c4de9 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -31,8 +31,10 @@ import type { Virtual, DependableFuture, ProxyFuture, - AwaitFuture, + EventFuture, BytesFuture, + EventParams, + ArtifactFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; @@ -50,6 +52,27 @@ import { ScopeStack } from "./ScopeStack"; const DEFAULT_VALUE = ethers.utils.parseUnits("0"); +function parseEventParams( + abi: Array<{ type: string; name: string; inputs: any[] }>, + eventName: string +): EventParams { + const event = abi.find((v) => v.type === "event" && v.name === eventName); + + if (!event) { + return {}; + } + + return event.inputs.reduce((acc, { name }) => { + acc[name] = { + label: name, + type: "eventParam", + _future: true, + }; + + return acc; + }, {}); +} + export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; public graph: IDeploymentGraph = new DeploymentGraph(); @@ -188,6 +211,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { type: "contract", subtype: "deployed", abi, + address, _future: true, }; @@ -259,58 +283,57 @@ export class DeploymentBuilder implements IDeploymentBuilder { } public awaitEvent( - contractFuture: DeploymentGraphFuture, + artifactFuture: ArtifactFuture, eventName: string, { args, after }: AwaitOptions - ): AwaitFuture { + ): EventFuture { const vertexId = this._resolveNextId(); - const awaitFuture: AwaitFuture = { + const eventFuture: EventFuture = { vertexId, - label: `${contractFuture.label}/${eventName}`, + label: `${artifactFuture.label}/${eventName}`, type: "await", + subtype: "event", _future: true, + params: {}, }; - let contract: CallableFuture; - if (isParameter(contractFuture)) { - const parameter = contractFuture; - const scope = parameter.scope; - - const scopeData = this.graph.scopeData[scope]; - - if ( - scopeData === undefined || - scopeData.parameters === undefined || - !(parameter.label in scopeData.parameters) - ) { - throw new Error("Could not resolve contract from parameter"); - } + if ( + artifactFuture.subtype !== "artifact" && + artifactFuture.subtype !== "deployed" + ) { + const future = artifactFuture as any; - contract = scopeData.parameters[parameter.label] as - | HardhatContract - | ArtifactContract - | DeployedContract; - } else if (isCallable(contractFuture)) { - contract = contractFuture; - } else { throw new Error( - `Not a callable future ${contractFuture.label} (${contractFuture.type})` + `Not an artifact future ${future.label} (${future.type})` ); } + let abi: any[]; + let address: string | ArtifactContract; + if (artifactFuture.subtype === "artifact") { + abi = artifactFuture.artifact.abi; + address = artifactFuture; + } else { + abi = artifactFuture.abi; + address = artifactFuture.address; + } + + eventFuture.params = parseEventParams(abi, eventName); + DeploymentBuilder._addVertex(this.graph, { - id: awaitFuture.vertexId, - label: awaitFuture.label, - type: "Await", - contract, + id: eventFuture.vertexId, + label: eventFuture.label, + type: "Event", + address, + abi, event: eventName, args: args ?? [], after: after ?? [], scopeAdded: this.scopes.getScopedLabel(), }); - return awaitFuture; + return eventFuture; } public getParam(paramName: string): RequiredParameter { @@ -535,8 +558,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { return; } - if (depNode.type === "Await") { - DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); + if (depNode.type === "Event") { + DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.args), diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index e5f4e97e30..e0d8e9af26 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -7,19 +7,19 @@ import { VertexVisitResult } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeAwaitedEvent( - { event, contract, args }: AwaitedEvent, + { event, address, abi, args }: AwaitedEvent, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { const resolve = resolveFrom(resultAccumulator); - const resolvedArgs = args.map(resolve).map(toAddress); + const resolvedArgs = [...args, address].map(resolve).map(toAddress); - const { address, abi } = resolve(contract); + const resolvedAddress = resolvedArgs.pop(); let topics: ethers.utils.Result; try { - const contractInstance = new Contract(address, abi); + const contractInstance = new Contract(resolvedAddress, abi); const filter = contractInstance.filters[event](...resolvedArgs); diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 01fc2126f0..eac9989706 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -11,7 +11,7 @@ import { IDeploymentGraph, DeploymentGraphVertex, ExternalParamValue, - AwaitVertex, + EventVertex, } from "types/deploymentGraph"; import { AwaitedEvent, @@ -21,7 +21,11 @@ import { ExecutionVertex, LibraryDeploy, } from "types/executionGraph"; -import { BytesFuture, DeploymentGraphFuture } from "types/future"; +import { + BytesFuture, + DeploymentGraphFuture, + EventParamFuture, +} from "types/future"; import { Artifact } from "types/hardhat"; import { isBytesArg, isFuture } from "utils/guards"; @@ -58,7 +62,7 @@ export function convertDeploymentVertexToExecutionVertex( return convertHardhatLibraryToLibraryDeploy(deploymentVertex, context); case "ArtifactLibrary": return convertArtifactLibraryToLibraryDeploy(deploymentVertex, context); - case "Await": + case "Event": return convertAwaitToAwaitedEvent(deploymentVertex, context); case "Virtual": throw new Error( @@ -170,14 +174,15 @@ async function convertArtifactLibraryToLibraryDeploy( } async function convertAwaitToAwaitedEvent( - vertex: AwaitVertex, + vertex: EventVertex, transformContext: TransformContext ): Promise { return { type: "AwaitedEvent", id: vertex.id, label: vertex.label, - contract: await resolveParameter(vertex.contract, transformContext), + abi: vertex.abi, + address: vertex.address, event: vertex.event, args: await convertArgs(vertex.args, transformContext), }; @@ -194,7 +199,14 @@ function assertDeploymentVertexNotExpected( } async function convertArgs( - args: Array, + args: Array< + | boolean + | string + | number + | BigNumber + | DeploymentGraphFuture + | EventParamFuture + >, transformContext: TransformContext ): Promise< Array diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 05e0664f82..175dfe6cf5 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -3,7 +3,7 @@ import type { BigNumber } from "ethers"; import { ArtifactContract, ArtifactLibrary, - AwaitFuture, + EventFuture, ContractCall, DeployedContract, DeploymentGraphFuture, @@ -17,6 +17,7 @@ import { Virtual, ParameterFuture, BytesFuture, + ArtifactFuture, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -53,7 +54,7 @@ export type DeploymentGraphVertex = | ArtifactLibraryDeploymentVertex | CallDeploymentVertex | VirtualVertex - | AwaitVertex; + | EventVertex; export interface HardhatContractDeploymentVertex extends VertexDescriptor { type: "HardhatContract"; @@ -115,10 +116,11 @@ export interface VirtualVertex extends VertexDescriptor { after: DeploymentGraphFuture[]; } -export interface AwaitVertex extends VertexDescriptor { - type: "Await"; +export interface EventVertex extends VertexDescriptor { + type: "Event"; scopeAdded: string; - contract: CallableFuture; + abi: any[]; + address: string | ArtifactContract; event: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; @@ -179,10 +181,10 @@ export interface IDeploymentBuilder { ) => ContractCall; awaitEvent: ( - contractFuture: DeploymentGraphFuture, + contractFuture: ArtifactFuture, eventName: string, options: AwaitOptions - ) => AwaitFuture; + ) => EventFuture; getParam: (paramName: string) => RequiredParameter; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index 75494bd0bf..e9cc7b839c 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,7 +1,7 @@ import type { BigNumber } from "ethers"; import { LibraryMap } from "./deploymentGraph"; -import { DeploymentGraphFuture } from "./future"; +import { ArtifactContract, DeploymentGraphFuture } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -62,7 +62,8 @@ export interface ContractCall extends VertexDescriptor { export interface AwaitedEvent extends VertexDescriptor { type: "AwaitedEvent"; - contract: any; + abi: any[]; + address: string | ArtifactContract; event: string; args: ArgValue[]; } diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index dafeea5770..c6b3506701 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -24,6 +24,7 @@ export interface DeployedContract { type: "contract"; subtype: "deployed"; abi: any[]; + address: string; _future: true; } @@ -52,10 +53,22 @@ export interface ContractCall { _future: true; } -export interface AwaitFuture { +export interface EventFuture { vertexId: number; label: string; type: "await"; + subtype: "event"; + _future: true; + params: EventParams; +} + +export interface EventParams { + [eventParam: string]: EventParamFuture; +} + +export interface EventParamFuture { + label: string; + type: "eventParam"; _future: true; } @@ -99,6 +112,8 @@ export interface ProxyFuture { _future: true; } +export type ArtifactFuture = ArtifactContract | DeployedContract; + export type ContractFuture = | HardhatContract | ArtifactContract @@ -113,7 +128,7 @@ export type DependableFuture = | ContractCall | Virtual | ProxyFuture - | AwaitFuture; + | EventFuture; export type ParameterFuture = RequiredParameter | OptionalParameter; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 01ef3188c7..474a9b2044 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -8,7 +8,7 @@ import type { CallDeploymentVertex, HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, - AwaitVertex, + EventVertex, InternalParamValue, } from "types/deploymentGraph"; import type { @@ -58,8 +58,8 @@ export function isCall( export function isAwaitedEvent( node: DeploymentGraphVertex -): node is AwaitVertex { - return node.type === "Await"; +): node is EventVertex { + return node.type === "Event"; } export function isHardhatLibrary( diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/utils/proxy.ts index d1231a72a1..f6e1e2977f 100644 --- a/packages/core/src/utils/proxy.ts +++ b/packages/core/src/utils/proxy.ts @@ -3,14 +3,14 @@ import { ContractCall, DependableFuture, Virtual, - AwaitFuture, + EventFuture, } from "types/future"; import { isProxy } from "./guards"; export function resolveProxyDependency( future: DependableFuture -): CallableFuture | ContractCall | Virtual | AwaitFuture { +): CallableFuture | ContractCall | Virtual | EventFuture { if (isProxy(future)) { return resolveProxyDependency(future.proxy); } @@ -20,7 +20,7 @@ export function resolveProxyDependency( export function resolveProxyValue( future: DependableFuture -): CallableFuture | ContractCall | Virtual | AwaitFuture { +): CallableFuture | ContractCall | Virtual | EventFuture { if (isProxy(future)) { return resolveProxyValue(future.value); } diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index 630e619ecc..ec40441469 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { Services } from "services/types"; -import { AwaitVertex } from "types/deploymentGraph"; +import { EventVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; import { @@ -10,12 +10,10 @@ import { } from "./helpers"; export async function validateAwaitEvent( - vertex: AwaitVertex, + vertex: EventVertex, _resultAccumulator: ResultsAccumulator, context: { services: Services } ): Promise { - const contractName = vertex.contract.label; - const invalidBytes = await validateBytesForArtifact( vertex.args, context.services @@ -25,21 +23,31 @@ export async function validateAwaitEvent( return invalidBytes; } - const artifactAbi = await resolveArtifactForCallableFuture( - vertex.contract, - context - ); + let artifactAbi: any[] | undefined; + if (typeof vertex.address !== "string") { + artifactAbi = await resolveArtifactForCallableFuture( + vertex.address, + context + ); - if (artifactAbi === undefined) { + if (artifactAbi === undefined) { + return { + _kind: "failure", + failure: new Error( + `Artifact with name '${vertex.address.label}' doesn't exist` + ), + }; + } + } else if (!ethers.utils.isAddress(vertex.address)) { return { _kind: "failure", - failure: new Error(`Artifact with name '${contractName}' doesn't exist`), + failure: new Error(`Invalid address ${vertex.address}`), }; } const argsLength = vertex.args.length; - const iface = new ethers.utils.Interface(artifactAbi); + const iface = new ethers.utils.Interface(artifactAbi ?? vertex.abi); const events = Object.entries(iface.events) .filter(([fname]) => fname === vertex.event) @@ -53,7 +61,7 @@ export async function validateAwaitEvent( return { _kind: "failure", failure: new Error( - `Contract '${contractName}' doesn't have an event ${vertex.event}` + `Given contract doesn't have an event ${vertex.event}` ), }; } @@ -67,14 +75,14 @@ export async function validateAwaitEvent( return { _kind: "failure", failure: new Error( - `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` + `Event ${vertex.event} in contract expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` ), }; } else { return { _kind: "failure", failure: new Error( - `Event ${vertex.event} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments` + `Event ${vertex.event} in contract is overloaded, but no overload expects ${argsLength} arguments` ), }; } diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 70d2af04f5..8876a9f74c 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -51,7 +51,7 @@ export function validationDispatch( ); case "Virtual": return validateVirtual(deploymentVertex, resultAccumulator, context); - case "Await": + case "Event": return validateAwaitEvent(deploymentVertex, resultAccumulator, context); default: return assertUnknownDeploymentVertexType(deploymentVertex); diff --git a/packages/core/test/deploymentBuilder/awaitedEvent.ts b/packages/core/test/deploymentBuilder/awaitedEvent.ts index 6db343b653..9c1e0a6c6c 100644 --- a/packages/core/test/deploymentBuilder/awaitedEvent.ts +++ b/packages/core/test/deploymentBuilder/awaitedEvent.ts @@ -25,7 +25,7 @@ describe("deployment builder - await event", () => { after: [another], }); - m.awaitEvent(token, "Transfer", { args: [token], after: [call] }); + m.awaitEvent({}); return {}; }); diff --git a/yarn.lock b/yarn.lock index 9c3c823806..70243ad2af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1859,6 +1859,7 @@ hardhat-watcher "^2.1.1" "@uniswap/v3-periphery@1.3.0", "v3-periphery-1_3_0@npm:@uniswap/v3-periphery@1.3.0": + name v3-periphery-1_3_0 version "1.3.0" resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz#37f0a1ef6025221722e50e9f3f2009c2d5d6e4ec" integrity sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw== From 54144ad8746f51990b5145d6703d33714dadabda Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Dec 2022 07:13:22 -0500 Subject: [PATCH 0195/1302] added EventParamFuture and enabled using it as an arg --- examples/multisig/test/Multisig.js | 22 ++++++++-------- packages/core/src/dsl/DeploymentBuilder.ts | 26 ++++++++++++++----- packages/core/src/execution/dispatch/utils.ts | 8 ++++-- packages/core/src/types/deploymentGraph.ts | 6 ++++- packages/core/src/types/future.ts | 4 ++- packages/core/src/utils/guards.ts | 5 ++++ 6 files changed, 50 insertions(+), 21 deletions(-) diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index beb417786f..1b6631b4c8 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -16,17 +16,6 @@ describe("Multisig", function () { event = moduleResult.event; }); - it("should store a submitted transaction", async function () { - const submittedTx = await multisig.functions.transactions(0); - - expect(submittedTx.destination).to.equal(ACCOUNT_0); - expect(submittedTx.value.toString()).to.equal( - ethers.utils.parseUnits("50").toString() - ); - expect(submittedTx.data).to.equal("0x00"); - expect(submittedTx.executed).to.equal(false); - }); - it("should confirm a stored transaction", async function () { const [isConfirmed] = await multisig.functions.confirmations(0, ACCOUNT_0); @@ -37,4 +26,15 @@ describe("Multisig", function () { expect(event.sender).to.equal(ACCOUNT_0); expect(ethers.BigNumber.from("0").eq(event.transactionId)).to.be.true; }); + + it("should execute a confirmed transaction", async function () { + const submittedTx = await multisig.functions.transactions(0); + + expect(submittedTx.destination).to.equal(ACCOUNT_0); + expect(submittedTx.value.toString()).to.equal( + ethers.utils.parseUnits("50").toString() + ); + expect(submittedTx.data).to.equal("0x00"); + expect(submittedTx.executed).to.equal(true); + }); }); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index e0550c4de9..16fe7202d4 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -54,16 +54,21 @@ const DEFAULT_VALUE = ethers.utils.parseUnits("0"); function parseEventParams( abi: Array<{ type: string; name: string; inputs: any[] }>, - eventName: string + event: EventFuture ): EventParams { - const event = abi.find((v) => v.type === "event" && v.name === eventName); + const [contractName, eventName] = event.label.split("/"); - if (!event) { - return {}; + const abiEvent = abi.find((v) => v.type === "event" && v.name === eventName); + + if (!abiEvent) { + throw new Error( + `No event "${eventName}" found in ABI for contract "${contractName}"` + ); } - return event.inputs.reduce((acc, { name }) => { + return abiEvent.inputs.reduce((acc, { name }) => { acc[name] = { + vertexId: event.vertexId, label: name, type: "eventParam", _future: true, @@ -319,7 +324,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { address = artifactFuture.address; } - eventFuture.params = parseEventParams(abi, eventName); + eventFuture.params = parseEventParams(abi, eventFuture); DeploymentBuilder._addVertex(this.graph, { id: eventFuture.vertexId, @@ -617,6 +622,15 @@ export class DeploymentBuilder implements IDeploymentBuilder { return; } + if (arg.type === "eventParam") { + addEdge(graph.adjacencyList, { + from: arg.vertexId, + to: depNode.id, + }); + + return; + } + if (isParameter(arg)) { const resolvedArg = DeploymentBuilder._resolveParameterFromScope( graph, diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index 53a60c4549..d280c0dffe 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,6 +1,6 @@ import { ArgValue } from "types/executionGraph"; import { ResultsAccumulator } from "types/graph"; -import { isDependable, isProxy } from "utils/guards"; +import { isDependable, isEventParam, isProxy } from "utils/guards"; export function toAddress(v: any) { if (typeof v === "object" && "address" in v) { @@ -19,7 +19,7 @@ function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { return resolveFromContext(context, arg.value); } - if (!isDependable(arg)) { + if (!isDependable(arg) && !isEventParam(arg)) { return arg; } @@ -35,5 +35,9 @@ function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { ); } + if (isEventParam(arg)) { + return entry.result.topics[arg.label]; + } + return entry.result; } diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 175dfe6cf5..8014b3a4d4 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -18,6 +18,7 @@ import { ParameterFuture, BytesFuture, ArtifactFuture, + EventParamFuture, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -44,7 +45,10 @@ export interface LibraryMap { export type ExternalParamValue = boolean | string | number | BigNumber; -export type InternalParamValue = ExternalParamValue | DeploymentGraphFuture; +export type InternalParamValue = + | ExternalParamValue + | DeploymentGraphFuture + | EventParamFuture; export type DeploymentGraphVertex = | HardhatContractDeploymentVertex diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index c6b3506701..25c0826996 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -67,6 +67,7 @@ export interface EventParams { } export interface EventParamFuture { + vertexId: number; label: string; type: "eventParam"; _future: true; @@ -135,7 +136,8 @@ export type ParameterFuture = RequiredParameter | OptionalParameter; export type DeploymentGraphFuture = | DependableFuture | ParameterFuture - | BytesFuture; + | BytesFuture + | EventParamFuture; export interface FutureDict { [key: string]: DeploymentGraphFuture; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 474a9b2044..eb62c9b45d 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -20,6 +20,7 @@ import type { Virtual, ProxyFuture, BytesFuture, + EventParamFuture, } from "types/future"; import { Artifact } from "types/hardhat"; @@ -103,6 +104,10 @@ export function isVirtual(possible: any): possible is Virtual { return isFuture(possible) && possible.type === "virtual"; } +export function isEventParam(possible: any): possible is EventParamFuture { + return isFuture(possible) && possible.type === "eventParam"; +} + export function isParameter( future: DeploymentGraphFuture ): future is RequiredParameter | OptionalParameter { From 0ecf1cbb1d66c91098232ff2a1ee3c1ad8f993c5 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Dec 2022 08:03:23 -0500 Subject: [PATCH 0196/1302] added tests for awaitEvent values --- packages/core/src/dsl/DeploymentBuilder.ts | 6 +- packages/core/src/types/module.ts | 3 +- .../validation/dispatch/validateAwaitEvent.ts | 8 +- .../test/deploymentBuilder/awaitedEvent.ts | 202 +++++++++++------- packages/core/test/execution.ts | 10 +- packages/core/test/validation.ts | 22 +- 6 files changed, 163 insertions(+), 88 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 16fe7202d4..48280f3b93 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -56,14 +56,12 @@ function parseEventParams( abi: Array<{ type: string; name: string; inputs: any[] }>, event: EventFuture ): EventParams { - const [contractName, eventName] = event.label.split("/"); + const [_, eventName] = event.label.split("/"); const abiEvent = abi.find((v) => v.type === "event" && v.name === eventName); if (!abiEvent) { - throw new Error( - `No event "${eventName}" found in ABI for contract "${contractName}"` - ); + return {}; } return abiEvent.inputs.reduce((acc, { name }) => { diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 7526b7d63a..aa55f51621 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,13 +1,14 @@ import type { ExternalParamValue, Subgraph } from "./deploymentGraph"; import type { CallableFuture, + EventFuture, FutureDict, ProxyFuture, Virtual, } from "./future"; export interface ModuleDict extends FutureDict { - [key: string]: CallableFuture | Virtual | ProxyFuture; + [key: string]: CallableFuture | Virtual | ProxyFuture | EventFuture; } export type Module = Subgraph; diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index ec40441469..9b503ab05e 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -58,10 +58,12 @@ export async function validateAwaitEvent( .concat(events); if (eventFragments.length === 0) { + const contractName = vertex.label.split("/")[0]; + return { _kind: "failure", failure: new Error( - `Given contract doesn't have an event ${vertex.event}` + `Contract '${contractName}' doesn't have an event ${vertex.event}` ), }; } @@ -72,10 +74,12 @@ export async function validateAwaitEvent( if (matchingEventFragments.length === 0) { if (eventFragments.length === 1) { + const contractName = vertex.label.split("/")[0]; + return { _kind: "failure", failure: new Error( - `Event ${vertex.event} in contract expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` + `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` ), }; } else { diff --git a/packages/core/test/deploymentBuilder/awaitedEvent.ts b/packages/core/test/deploymentBuilder/awaitedEvent.ts index 9c1e0a6c6c..34501a13fc 100644 --- a/packages/core/test/deploymentBuilder/awaitedEvent.ts +++ b/packages/core/test/deploymentBuilder/awaitedEvent.ts @@ -4,28 +4,83 @@ import { assert } from "chai"; import { buildModule } from "dsl/buildModule"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; -import { isAwaitedEvent, isCall, isHardhatContract } from "utils/guards"; +import { ArtifactContract } from "types/future"; +import { isAwaitedEvent, isCall, isArtifactContract } from "utils/guards"; import { getDependenciesForVertex, getDeploymentVertexByLabel, } from "./helpers"; +const artifact = { + contractName: "Token", + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + { + indexed: false, + internalType: "uint256", + name: "value", + type: "uint256", + }, + ], + name: "SomeEvent", + type: "event", + }, + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "num", + type: "uint256", + }, + ], + name: "verify", + outputs: [], + stateMutability: "pure", + type: "function", + }, + ], + bytecode: + "608060405234801561001057600080fd5b5061019c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638753367f1461003b578063f8a8fd6d14610057575b600080fd5b610055600480360381019061005091906100d7565b610061565b005b61005f610071565b005b607b811461006e57600080fd5b50565b3073ffffffffffffffffffffffffffffffffffffffff167fdde371250dcd21c331edbb965b9163f4898566e8c60e28868533281edf66ab03607b6040516100b89190610113565b60405180910390a2565b6000813590506100d18161014f565b92915050565b6000602082840312156100ed576100ec61014a565b5b60006100fb848285016100c2565b91505092915050565b61010d81610138565b82525050565b60006020820190506101286000830184610104565b92915050565b6000819050919050565b60006101438261012e565b9050919050565b600080fd5b6101588161012e565b811461016357600080fd5b5056fea2646970667358221220feb2fe32fb60d1ce42ae5b67f1d29871608dc1e7f38f6abad28706024c3aa14864736f6c63430008070033", + linkReferences: {}, +}; + describe("deployment builder - await event", () => { let deploymentGraph: IDeploymentGraph; before(() => { const eventModule = buildModule("event", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); - const another = m.contract("Another"); + const testContract = m.contract("Test", artifact); - const call = m.call(exchange, "addToken", { - args: [token], - after: [another], - }); + const call = m.call(testContract, "test", { args: [] }); + + const event = m.awaitEvent( + testContract as ArtifactContract, + "SomeEvent", + { + args: [testContract], + after: [call], + } + ); - m.awaitEvent({}); + m.call(testContract, "verify", { + args: [event.params.value], + }); return {}; }); @@ -41,61 +96,59 @@ describe("deployment builder - await event", () => { assert.isDefined(deploymentGraph); }); - it("should have five nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 5); + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); }); - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + it("should have the contract node Test", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); if (depNode === undefined) { return assert.isDefined(depNode); } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); + + assert.equal(depNode?.label, "Test"); + assert(isArtifactContract(depNode)); }); - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + it("should have the call node Test/test", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); if (depNode === undefined) { return assert.isDefined(depNode); } - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); + assert.equal(depNode?.label, "Test/test"); + assert(isCall(depNode)); }); - it("should have the call node Exchange/addToken", () => { + it("should have the await event node Test/SomeEvent", () => { const depNode = getDeploymentVertexByLabel( deploymentGraph, - "Exchange/addToken" + "Test/SomeEvent" ); if (depNode === undefined) { return assert.isDefined(depNode); } - assert.equal(depNode?.label, "Exchange/addToken"); - assert(isCall(depNode)); + assert.equal(depNode?.label, "Test/SomeEvent"); + assert(isAwaitedEvent(depNode)); }); - it("should have the await event node Token/Transfer", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/Transfer" - ); + it("should have the call node Test/verify", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); if (depNode === undefined) { return assert.isDefined(depNode); } - assert.equal(depNode?.label, "Token/Transfer"); - assert(isAwaitedEvent(depNode)); + assert.equal(depNode?.label, "Test/verify"); + assert(isCall(depNode)); }); - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + it("should show no dependencies for the contract node Test", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -106,8 +159,8 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(deps, []); }); - it("should show no dependencies for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + it("should show one dependency for the call node Test/test", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -115,13 +168,19 @@ describe("deployment builder - await event", () => { const deps = getDependenciesForVertex(deploymentGraph, depNode); - assert.deepStrictEqual(deps, []); + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Test", + type: "", + }, + ]); }); - it("should show three dependencies for the call node Exchange/addToken", () => { + it("should show two dependencies for the event node Test/SomeEvent", () => { const depNode = getDeploymentVertexByLabel( deploymentGraph, - "Exchange/addToken" + "Test/SomeEvent" ); if (depNode === undefined) { @@ -133,19 +192,19 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(deps, [ { id: 0, - label: "Token", + label: "Test", + type: "", + }, + { + id: 1, + label: "Test/test", type: "", }, - { id: 1, label: "Exchange", type: "" }, - { id: 2, label: "Another", type: "" }, ]); }); - it("should show two dependencies for the call node Token/Transfer", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/Transfer" - ); + it("should show two dependencies for the call node Test/verify", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); if (depNode === undefined) { return assert.isDefined(depNode); @@ -156,92 +215,87 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(deps, [ { id: 0, - label: "Token", + label: "Test", type: "", }, { - id: 3, - label: "Exchange/addToken", + id: 2, + label: "Test/SomeEvent", type: "", }, ]); }); - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + it("should record the argument list for the contract node Test as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); if (depNode === undefined) { return assert.isDefined(depNode); } - if (!isHardhatContract(depNode)) { + if (!isArtifactContract(depNode)) { return assert.fail("Not a hardhat contract dependency node"); } assert.deepStrictEqual(depNode.args, []); }); - it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + it("should record the argument list for the call node Test/test as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); if (depNode === undefined) { return assert.isDefined(depNode); } - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); } assert.deepStrictEqual(depNode.args, []); }); - it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + it("should record the argument list for the event node Test/SomeEvent", () => { const depNode = getDeploymentVertexByLabel( deploymentGraph, - "Exchange/addToken" + "Test/SomeEvent" ); if (depNode === undefined) { return assert.isDefined(depNode); } - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); + if (!isAwaitedEvent(depNode)) { + return assert.fail("Not an awaited event dependency node"); } assert.deepStrictEqual(depNode.args, [ { vertexId: 0, - label: "Token", + label: "Test", type: "contract", - subtype: "hardhat", - contractName: "Token", + subtype: "artifact", + artifact, _future: true, }, ]); }); - it("should record the argument list for the event node Token at Token/Transfer", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/Transfer" - ); + it("should record the argument list for the call node Test/verify", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); if (depNode === undefined) { return assert.isDefined(depNode); } - if (!isAwaitedEvent(depNode)) { - return assert.fail("Not an awaited event dependency node"); + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); } assert.deepStrictEqual(depNode.args, [ { - vertexId: 0, - label: "Token", - type: "contract", - subtype: "hardhat", - contractName: "Token", + vertexId: 2, + label: "value", + type: "eventParam", _future: true, }, ]); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 5dcd6cc895..629914e781 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -292,7 +292,15 @@ describe("Execution", () => { const awaitedEvent: ExecutionVertex = { type: "AwaitedEvent", id: 2, - contract: { vertexId: 0, type: "contract", label: "Test", _future: true }, + abi: fakeArtifact.abi, + address: { + vertexId: 0, + type: "contract", + subtype: "artifact", + artifact: fakeArtifact, + label: "Test", + _future: true, + }, label: "Test/SomeEvent", event: "SomeEvent", args: [ACCOUNT_0], diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 19958472d5..3ae1362699 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -6,6 +6,7 @@ import { buildModule } from "dsl/buildModule"; import { buildSubgraph } from "dsl/buildSubgraph"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentBuilder } from "types/deploymentGraph"; +import { ArtifactContract } from "types/future"; import { Artifact } from "types/hardhat"; import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; @@ -644,11 +645,14 @@ describe("Validation", () => { it("should validate a correct awaited event", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test"); + const example = m.contract("Test", exampleEventArtifact); const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example, "SomeEvent", { after: [call], args: ["0x0"] }); + m.awaitEvent(example as ArtifactContract, "SomeEvent", { + after: [call], + args: ["0x0"], + }); return { example }; }); @@ -674,11 +678,14 @@ describe("Validation", () => { it("should fail awaiting a nonexistant event", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test"); + const example = m.contract("Test", exampleEventArtifact); const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example, "Nonexistant", { args: [], after: [call] }); + m.awaitEvent(example as ArtifactContract, "Nonexistant", { + args: [], + after: [call], + }); return { example }; }); @@ -717,11 +724,14 @@ describe("Validation", () => { it("should fail an awaited event with wrong number of arguments", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test"); + const example = m.contract("Test", exampleEventArtifact); const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example, "SomeEvent", { after: [call], args: [] }); + m.awaitEvent(example as ArtifactContract, "SomeEvent", { + after: [call], + args: [], + }); return { example }; }); From a7bb35a32f08fa16c65923e84af4aae2d12d0e30 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Dec 2022 08:06:17 -0500 Subject: [PATCH 0197/1302] added docs note for event param values --- docs/creating-modules-for-deployment.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 21cf9b36ec..b3ffedc27f 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -241,11 +241,13 @@ const event = m.awaitEvent(multisig, "AuthorizedBy", { args: ["0xUser1"], after: [call], }); + +m.call(multisig, "execute", { args: [event.params.transactionId] }); ``` The `awaitEvent` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `awaitEvent` condition. -Upon execution, the `EventFuture` will be resolved to the values of the args emitted by the given event. You can then use those values in tests or other modules as expected. +Upon execution, the `EventFuture` will be resolved to the values of the params emitted by the given event. You can then use those values in tests or other modules as expected. A full example of the `awaitEvent` function can be seen in our [Multisig example](../examples/multisig/README.md). From e01ea63ab0285aea2e8b7f5624c1d2dc920be9d6 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 12 Dec 2022 23:03:20 -0500 Subject: [PATCH 0198/1302] added ability to pass event param futures as address --- examples/create2/test/create2.test.js | 9 +++++++-- packages/core/src/dsl/DeploymentBuilder.ts | 5 +++-- packages/core/src/types/deploymentGraph.ts | 6 +++--- packages/core/src/types/executionGraph.ts | 10 +++++++--- packages/core/src/types/future.ts | 4 +++- .../validation/dispatch/validateAwaitEvent.ts | 16 ++++++++++------ .../dispatch/validateDeployedContract.ts | 2 +- 7 files changed, 34 insertions(+), 18 deletions(-) diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js index 420ef2d3bd..c50da8b74f 100644 --- a/examples/create2/test/create2.test.js +++ b/examples/create2/test/create2.test.js @@ -16,11 +16,16 @@ describe("Create2", function () { args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], }); - m.call(create2, "deploy", { + const call = m.call(create2, "deploy", { args: [0, toBytes32(2), m.getBytesForArtifact("Bar")], }); - return { create2 }; + const event = m.awaitEvent(create2, "Deployed", { + args: [toBytes32(2)], + after: [call], + }); + + return { create2, bar: m.contractAt(event.params.deployed) }; } ); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 48280f3b93..527166e98e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -35,6 +35,7 @@ import type { BytesFuture, EventParams, ArtifactFuture, + EventParamFuture, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; @@ -204,7 +205,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public contractAt( contractName: string, - address: string, + address: string | EventParamFuture, abi: any[], options?: { after?: DeploymentGraphFuture[] } ): DeployedContract { @@ -313,7 +314,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { } let abi: any[]; - let address: string | ArtifactContract; + let address: string | ArtifactContract | EventParamFuture; if (artifactFuture.subtype === "artifact") { abi = artifactFuture.artifact.abi; address = artifactFuture; diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 8014b3a4d4..c2dcf577df 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -83,7 +83,7 @@ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { export interface DeployedContractDeploymentVertex extends VertexDescriptor { type: "DeployedContract"; scopeAdded: string; - address: string; + address: string | EventParamFuture; abi: any[]; after: DeploymentGraphFuture[]; } @@ -124,7 +124,7 @@ export interface EventVertex extends VertexDescriptor { type: "Event"; scopeAdded: string; abi: any[]; - address: string | ArtifactContract; + address: string | ArtifactContract | EventParamFuture; event: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; @@ -167,7 +167,7 @@ export interface IDeploymentBuilder { contractAt: ( contractName: string, - address: string, + address: string | EventParamFuture, abi: any[], options?: { after?: DeploymentGraphFuture[] } ) => DeployedContract; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index e9cc7b839c..bac4d47770 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,7 +1,11 @@ import type { BigNumber } from "ethers"; import { LibraryMap } from "./deploymentGraph"; -import { ArtifactContract, DeploymentGraphFuture } from "./future"; +import { + ArtifactContract, + DeploymentGraphFuture, + EventParamFuture, +} from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -42,7 +46,7 @@ export interface ContractDeploy extends VertexDescriptor { export interface DeployedContract extends VertexDescriptor { type: "DeployedContract"; - address: string; + address: string | EventParamFuture; abi: any[]; } @@ -63,7 +67,7 @@ export interface ContractCall extends VertexDescriptor { export interface AwaitedEvent extends VertexDescriptor { type: "AwaitedEvent"; abi: any[]; - address: string | ArtifactContract; + address: string | ArtifactContract | EventParamFuture; event: string; args: ArgValue[]; } diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 25c0826996..ad80239644 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -24,7 +24,7 @@ export interface DeployedContract { type: "contract"; subtype: "deployed"; abi: any[]; - address: string; + address: string | EventParamFuture; _future: true; } @@ -115,6 +115,8 @@ export interface ProxyFuture { export type ArtifactFuture = ArtifactContract | DeployedContract; +export type AddressResolvable = EventParamFuture | ArtifactFuture; + export type ContractFuture = | HardhatContract | ArtifactContract diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index 9b503ab05e..6fb3f49e46 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -24,7 +24,16 @@ export async function validateAwaitEvent( } let artifactAbi: any[] | undefined; - if (typeof vertex.address !== "string") { + if (typeof vertex.address === "string") { + if (!ethers.utils.isAddress(vertex.address)) { + return { + _kind: "failure", + failure: new Error(`Invalid address ${vertex.address}`), + }; + } + + artifactAbi = vertex.abi; + } else if (vertex.address.type === "contract") { artifactAbi = await resolveArtifactForCallableFuture( vertex.address, context @@ -38,11 +47,6 @@ export async function validateAwaitEvent( ), }; } - } else if (!ethers.utils.isAddress(vertex.address)) { - return { - _kind: "failure", - failure: new Error(`Invalid address ${vertex.address}`), - }; } const argsLength = vertex.args.length; diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 9f1f6da9bf..9d2d152563 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -9,7 +9,7 @@ export async function validateDeployedContract( _resultAccumulator: ResultsAccumulator, _context: { services: Services } ): Promise { - if (!isAddress(vertex.address)) { + if (typeof vertex.address === "string" && !isAddress(vertex.address)) { return { _kind: "failure", failure: new Error( From d7186cdfa71ccec12308d8d524af71846832a242 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 13 Dec 2022 02:17:40 -0500 Subject: [PATCH 0199/1302] update create2 example to use contractAt --- .../create2/ignition/Create2FactoryModule.js | 39 +++++++++++++- examples/create2/test/create2.test.js | 53 +++---------------- .../validation/dispatch/validateAwaitEvent.ts | 2 +- packages/core/test/validation.ts | 6 +-- 4 files changed, 49 insertions(+), 51 deletions(-) diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js index a7f93663c3..638fc5d653 100644 --- a/examples/create2/ignition/Create2FactoryModule.js +++ b/examples/create2/ignition/Create2FactoryModule.js @@ -1,7 +1,42 @@ const { buildModule } = require("@ignored/hardhat-ignition"); +const Create2Artifact = require("../artifacts/contracts/Create2Factory.sol/Create2Factory.json"); +const BarArtifact = require("../artifacts/contracts/Bar.sol/Bar.json"); +const FooArtifact = require("../artifacts/contracts/Foo.sol/Foo.json"); + module.exports = buildModule("Create2Factory", (m) => { - const create2 = m.contract("Create2Factory"); + const create2 = m.contract("Create2Factory", Create2Artifact, { args: [] }); + + const fooCall = m.call(create2, "deploy", { + args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], + }); + + const fooEvent = m.awaitEvent(create2, "Deployed", { + args: [toBytes32(1)], + after: [fooCall], + }); + + const barCall = m.call(create2, "deploy", { + args: [0, toBytes32(2), m.getBytesForArtifact("Bar")], + after: [fooEvent], + }); - return { create2 }; + const barEvent = m.awaitEvent(create2, "Deployed", { + args: [toBytes32(2)], + after: [barCall], + }); + + const foo = m.contractAt("Foo", fooEvent.params.deployed, FooArtifact.abi, { + after: [fooEvent], + }); + + const bar = m.contractAt("Bar", barEvent.params.deployed, BarArtifact.abi, { + after: [barEvent], + }); + + return { create2, foo, bar, fooEvent, barEvent }; }); + +function toBytes32(n) { + return hre.ethers.utils.hexZeroPad(hre.ethers.utils.hexlify(n), 32); +} diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js index c50da8b74f..5a2832dee7 100644 --- a/examples/create2/test/create2.test.js +++ b/examples/create2/test/create2.test.js @@ -1,45 +1,20 @@ const { assert } = require("chai"); -const { buildModule } = require("@ignored/hardhat-ignition"); const Create2FactoryModule = require("../ignition/Create2FactoryModule"); describe("Create2", function () { - let factory; + let deployResults; before(async () => { - const DeployViaCreate2Module = buildModule( - "DeployViaCreate2Module", - (m) => { - const { create2 } = m.useModule(Create2FactoryModule); - - m.call(create2, "deploy", { - args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], - }); - - const call = m.call(create2, "deploy", { - args: [0, toBytes32(2), m.getBytesForArtifact("Bar")], - }); - - const event = m.awaitEvent(create2, "Deployed", { - args: [toBytes32(2)], - after: [call], - }); - - return { create2, bar: m.contractAt(event.params.deployed) }; - } - ); - - const { create2 } = await ignition.deploy(DeployViaCreate2Module); - - factory = create2; + deployResults = await ignition.deploy(Create2FactoryModule); }); it("should return an instantiated factory", async function () { - assert.isDefined(factory); + assert.isDefined(deployResults.create2); }); it("should have deployed the foo contract", async () => { - const address = await resolveAddressBasedOnSalt(factory, 1); + const address = deployResults.fooEvent.deployed; const FooFactory = await hre.ethers.getContractFactory("Foo"); const foo = FooFactory.attach(address); @@ -47,22 +22,10 @@ describe("Create2", function () { }); it("should have deployed the bar contract", async () => { - const address = await resolveAddressBasedOnSalt(factory, 2); - const FooFactory = await hre.ethers.getContractFactory("Bar"); - const foo = FooFactory.attach(address); + const address = deployResults.barEvent.deployed; + const BarFactory = await hre.ethers.getContractFactory("Bar"); + const bar = BarFactory.attach(address); - assert.equal(await foo.name(), "Bar"); + assert.equal(await bar.name(), "Bar"); }); }); - -function toBytes32(n) { - return hre.ethers.utils.hexZeroPad(hre.ethers.utils.hexlify(n), 32); -} - -async function resolveAddressBasedOnSalt(factory, salt) { - const deployedEvents = await factory.queryFilter( - factory.filters.Deployed(toBytes32(salt)) - ); - - return deployedEvents[0].args.deployed; -} diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateAwaitEvent.ts index 6fb3f49e46..531dc9ee73 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateAwaitEvent.ts @@ -73,7 +73,7 @@ export async function validateAwaitEvent( } const matchingEventFragments = eventFragments.filter( - (f) => f.inputs.length === argsLength + (f) => f.inputs.length >= argsLength ); if (matchingEventFragments.length === 0) { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 3ae1362699..ba903a5f98 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -722,7 +722,7 @@ describe("Validation", () => { ); }); - it("should fail an awaited event with wrong number of arguments", async () => { + it("should fail an awaited event with too many arguments", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Test", exampleEventArtifact); @@ -730,7 +730,7 @@ describe("Validation", () => { m.awaitEvent(example as ArtifactContract, "SomeEvent", { after: [call], - args: [], + args: [1, 2, 3, 4], }); return { example }; @@ -764,7 +764,7 @@ describe("Validation", () => { assert.equal(text, "Validation failed"); assert.equal( error.message, - "Event SomeEvent in contract Test expects 1 arguments but 0 were given" + "Event SomeEvent in contract Test expects 1 arguments but 4 were given" ); }); }); From b42c7126f7d7d386cd3a8c7cab1fbae20bd43192 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 20 Dec 2022 10:07:24 +0000 Subject: [PATCH 0200/1302] chore: bump version to v0.0.5 Update the packages versions and changelogs for the `0.0.5 - 2022-12-20` release. --- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/multisig/package.json | 2 +- examples/sample/package.json | 2 +- examples/uniswap/package.json | 2 +- packages/core/CHANGELOG.md | 13 +++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin/package.json | 6 +++--- 9 files changed, 36 insertions(+), 9 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index d5b9ce4cc7..c6f02c61f0 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.4" + "@ignored/hardhat-ignition": "^0.0.5" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 40403ee5b2..0b8fbf6b36 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.4", + "@ignored/hardhat-ignition": "^0.0.5", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 54955db387..1a7fd38d5b 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@nomiclabs/hardhat-ethers": "^2.2.1", - "@ignored/hardhat-ignition": "^0.0.4", + "@ignored/hardhat-ignition": "^0.0.5", "@nomicfoundation/hardhat-toolbox": "2.0.0", "@openzeppelin/contracts": "^4.3.2", "chai": "^4.3.4", diff --git a/examples/sample/package.json b/examples/sample/package.json index e35fa772ae..7edbe31a65 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.4", + "@ignored/hardhat-ignition": "^0.0.5", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index c40b6e02c8..3863790cfc 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.4", + "@ignored/hardhat-ignition": "^0.0.5", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d181a2988d..b6412e8860 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.5 - 2022-12-20 + +### Added + +- Expose config for pollingInterval ([#75](https://github.com/NomicFoundation/ignition/pull/75)) +- Support `getBytesForArtifact` in deployment api ([#76](https://github.com/NomicFoundation/ignition/pull/76)) +- Support use of emitted event args as futures for later deployment api calls ([#77](https://github.com/NomicFoundation/ignition/pull/77)) +- Support event params futures in `contractAt` ([#78](https://github.com/NomicFoundation/ignition/pull/78)) + +### Fixed + +- Fix for planning on modules with deploys from artifacts ([#73](https://github.com/NomicFoundation/ignition/pull/73)) + ## 0.0.4 - 2022-11-22 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index d019b0820d..cf7b18d166 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 80453024f4..3d47ae073b 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.5 - 2022-12-20 + +### Added + +- Add params section to deploy display in cli ([#74](https://github.com/NomicFoundation/ignition/pull/74)) +- Expose config for pollingInterval ([#75](https://github.com/NomicFoundation/ignition/pull/75)) +- Support `getBytesForArtifact` in deployment api ([#76](https://github.com/NomicFoundation/ignition/pull/76)) +- Support use of emitted event args as futures for later deployment api calls ([#77](https://github.com/NomicFoundation/ignition/pull/77)) +- Support event params futures in `contractAt` ([#78](https://github.com/NomicFoundation/ignition/pull/78)) + +### Fixed + +- Fix for planning on modules with deploys from artifacts ([#73](https://github.com/NomicFoundation/ignition/pull/73)) + ## 0.0.4 - 2022-11-22 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index c28a1cfcef..ea849adcc8 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.4", + "version": "0.0.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -32,7 +32,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.4", + "@ignored/ignition-core": "^0.0.5", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -67,7 +67,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.4", + "@ignored/ignition-core": "^0.0.5", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 4d872cac20a925bc4d7a0f49619bf013e0961581 Mon Sep 17 00:00:00 2001 From: Morgan Date: Tue, 20 Dec 2022 05:31:56 -0500 Subject: [PATCH 0201/1302] added ability to send a normal ETH transaction (#79) Support sending `ETH` to a contract without having to make a call/deploy: ```tsx m.sendETH(exchange, { value: ethers.utils.parseUnits("1"), }); ``` --- docs/creating-modules-for-deployment.md | 11 ++ examples/multisig/contracts/Multisig.sol | 2 +- examples/multisig/ignition/Multisig.js | 6 +- packages/core/src/dsl/DeploymentBuilder.ts | 74 +++++++++- .../src/execution/dispatch/executeSendETH.ts | 38 ++++++ .../execution/dispatch/executionDispatch.ts | 9 +- ...onvertDeploymentVertexToExecutionVertex.ts | 20 +++ packages/core/src/types/deploymentGraph.ts | 20 ++- packages/core/src/types/executionGraph.ts | 13 +- packages/core/src/types/future.ts | 17 ++- packages/core/src/utils/guards.ts | 21 +++ .../validation/dispatch/validateSendETH.ts | 33 +++++ .../validation/dispatch/validationDispatch.ts | 16 +-- .../test/deploymentBuilder/awaitedEvent.ts | 1 + .../core/test/deploymentBuilder/sendETH.ts | 107 +++++++++++++++ packages/core/test/execution.ts | 81 +++++++++++ packages/core/test/validation.ts | 126 ++++++++++++++++++ .../ui/components/execution/FinalStatus.tsx | 2 + packages/hardhat-plugin/src/ui/types.ts | 2 + 19 files changed, 574 insertions(+), 25 deletions(-) create mode 100644 packages/core/src/execution/dispatch/executeSendETH.ts create mode 100644 packages/core/src/validation/dispatch/validateSendETH.ts create mode 100644 packages/core/test/deploymentBuilder/sendETH.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index b3ffedc27f..2683430eec 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -15,6 +15,7 @@ - [Create2](./creating-modules-for-deployment.md#create2) - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - [Transfering _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) + - [Transfering _Eth_ outside of a call](./creating-modules-for-deployment.md#transfering-eth-outside-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) @@ -205,6 +206,16 @@ m.call(exchange, "deposit", { }); ``` +### Transferring _Eth_ outside of a call + +It's also possible to transfer `Eth` to a given address via a regular Ethereum transaction: + +```tsx +m.sendETH(exchange, { + value: ethers.utils.parseUnits("1"), +}); +``` + ### Using the results of a call with a deferred value (TBD) A contract might need the result of some other contract method as an input: diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol index 9a0d46a506..f89abc856e 100644 --- a/examples/multisig/contracts/Multisig.sol +++ b/examples/multisig/contracts/Multisig.sol @@ -84,7 +84,7 @@ contract Multisig { emit Deposit(msg.sender, msg.value); } - constructor(address[] memory _owners, uint _required) payable + constructor(address[] memory _owners, uint _required) validRequirement(_owners.length, _required) { for (uint i=0; i<_owners.length; i++) { diff --git a/examples/multisig/ignition/Multisig.js b/examples/multisig/ignition/Multisig.js index f6f42594b1..da4033de7b 100644 --- a/examples/multisig/ignition/Multisig.js +++ b/examples/multisig/ignition/Multisig.js @@ -11,15 +11,15 @@ module.exports = buildModule("MultisigModule", (m) => { const required = 1; const value = ethers.utils.parseUnits("100"); - // todo: support arbitrary tx const multisig = m.contract("Multisig", MultisigArtifact, { args: [owners, required], - value, }); + const funding = m.sendETH(multisig, { value, after: [multisig] }); + const call = m.call(multisig, "submitTransaction", { args: [ACCOUNT_0, ethers.utils.parseUnits("50"), "0x00"], - after: [multisig], + after: [funding], }); // todo: support sending via non-default account diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 527166e98e..132220172e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -14,6 +14,7 @@ import { UseSubgraphOptions, ScopeData, AwaitOptions, + SendOptions, } from "types/deploymentGraph"; import type { DeploymentGraphFuture, @@ -36,13 +37,18 @@ import type { EventParams, ArtifactFuture, EventParamFuture, + SendFuture, + ContractFuture, + AddressResolvable, } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict } from "types/module"; import { IgnitionError } from "utils/errors"; import { + assertUnknownDeploymentVertexType, isArtifact, isCallable, + isContract, isDependable, isParameter, } from "utils/guards"; @@ -65,11 +71,12 @@ function parseEventParams( return {}; } - return abiEvent.inputs.reduce((acc, { name }) => { + return abiEvent.inputs.reduce((acc, { name, type }) => { acc[name] = { vertexId: event.vertexId, label: name, type: "eventParam", + subtype: type, _future: true, }; @@ -340,6 +347,58 @@ export class DeploymentBuilder implements IDeploymentBuilder { return eventFuture; } + public sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture { + const vertexId = this._resolveNextId(); + + const sendFuture: SendFuture = { + vertexId, + label: `send/${vertexId}`, + type: "send", + subtype: "eth", + _future: true, + }; + + let address: AddressResolvable; + if (typeof sendTo === "string" || isContract(sendTo)) { + address = sendTo; + } else if (isParameter(sendTo)) { + const parameter = sendTo; + const scope = parameter.scope; + + const scopeData = this.graph.scopeData[scope]; + + if ( + scopeData === undefined || + scopeData.parameters === undefined || + !(parameter.label in scopeData.parameters) + ) { + throw new Error("Could not resolve contract from parameter"); + } + + address = scopeData.parameters[parameter.label] as ContractFuture; + } else { + if (sendTo.subtype !== "address") { + throw new Error( + `Event param "${sendTo.label}" is type "${sendTo.subtype}" but must be type "address"` + ); + } + + address = sendTo; + } + + DeploymentBuilder._addVertex(this.graph, { + id: vertexId, + label: sendFuture.label, + type: "SendETH", + address, + value: options.value, + after: options.after ?? [], + scopeAdded: this.scopes.getScopedLabel(), + }); + + return sendFuture; + } + public getParam(paramName: string): RequiredParameter { const paramFuture: RequiredParameter = { label: paramName, @@ -578,6 +637,17 @@ export class DeploymentBuilder implements IDeploymentBuilder { return; } + if (depNode.type === "SendETH") { + DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); + + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + return; + } + if (depNode.type === "Virtual") { DeploymentBuilder._addEdgesBasedOn( Object.values(depNode.after), @@ -586,6 +656,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); return; } + + assertUnknownDeploymentVertexType(depNode); } private static _addEdgesBasedOn( diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts new file mode 100644 index 0000000000..8aa58ea149 --- /dev/null +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -0,0 +1,38 @@ +import type { PopulatedTransaction } from "ethers"; + +import { ExecutionContext } from "types/deployment"; +import { SentETH } from "types/executionGraph"; +import { VertexVisitResult } from "types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeSendETH( + { address, value }: SentETH, + resultAccumulator: Map, + { services, options }: ExecutionContext +): Promise { + const resolve = resolveFrom(resultAccumulator); + + const to = toAddress(resolve(address)); + + let txHash: string; + try { + const tx: PopulatedTransaction = { to, value }; + + txHash = await services.contracts.sendTx(tx, options); + } catch (err) { + return { + _kind: "failure", + failure: err as any, + }; + } + + await services.transactions.wait(txHash); + + return { + _kind: "success", + result: { + hash: txHash, + }, + }; +} diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 9fd63df973..57ee942827 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -7,6 +7,7 @@ import { executeContractCall } from "./executeContractCall"; import { executeContractDeploy } from "./executeContractDeploy"; import { executeDeployedContract } from "./executeDeployedContract"; import { executeLibraryDeploy } from "./executeLibraryDeploy"; +import { executeSendETH } from "./executeSendETH"; export function executionDispatch( executionVertex: ExecutionVertex, @@ -28,14 +29,14 @@ export function executionDispatch( return executeLibraryDeploy(executionVertex, resultAccumulator, context); case "AwaitedEvent": return executeAwaitedEvent(executionVertex, resultAccumulator, context); + case "SentETH": + return executeSendETH(executionVertex, resultAccumulator, context); default: - return assertUnknownExecutionVertexType(executionVertex); + assertUnknownExecutionVertexType(executionVertex); } } -function assertUnknownExecutionVertexType( - executionVertex: never -): Promise { +function assertUnknownExecutionVertexType(executionVertex: never): never { const vertex = executionVertex as any; const forReport = "type" in vertex ? vertex.type : vertex; diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index eac9989706..be4942ad23 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -12,6 +12,7 @@ import { DeploymentGraphVertex, ExternalParamValue, EventVertex, + SendVertex, } from "types/deploymentGraph"; import { AwaitedEvent, @@ -20,6 +21,7 @@ import { DeployedContract, ExecutionVertex, LibraryDeploy, + SentETH, } from "types/executionGraph"; import { BytesFuture, @@ -64,6 +66,8 @@ export function convertDeploymentVertexToExecutionVertex( return convertArtifactLibraryToLibraryDeploy(deploymentVertex, context); case "Event": return convertAwaitToAwaitedEvent(deploymentVertex, context); + case "SendETH": + return convertSendToSentETH(deploymentVertex, context); case "Virtual": throw new Error( `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` @@ -188,6 +192,22 @@ async function convertAwaitToAwaitedEvent( }; } +async function convertSendToSentETH( + vertex: SendVertex, + transformContext: TransformContext +): Promise { + return { + type: "SentETH", + id: vertex.id, + label: vertex.label, + address: vertex.address, + value: (await resolveParameter( + vertex.value, + transformContext + )) as BigNumber, + }; +} + function assertDeploymentVertexNotExpected( vertex: never ): Promise { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index c2dcf577df..f3d38f3234 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -19,6 +19,8 @@ import { BytesFuture, ArtifactFuture, EventParamFuture, + SendFuture, + AddressResolvable, } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; @@ -58,7 +60,8 @@ export type DeploymentGraphVertex = | ArtifactLibraryDeploymentVertex | CallDeploymentVertex | VirtualVertex - | EventVertex; + | EventVertex + | SendVertex; export interface HardhatContractDeploymentVertex extends VertexDescriptor { type: "HardhatContract"; @@ -130,6 +133,14 @@ export interface EventVertex extends VertexDescriptor { after: DeploymentGraphFuture[]; } +export interface SendVertex extends VertexDescriptor { + type: "SendETH"; + scopeAdded: string; + address: AddressResolvable; + value: BigNumber | ParameterFuture; + after: DeploymentGraphFuture[]; +} + export interface ContractOptions { args?: InternalParamValue[]; libraries?: { @@ -150,6 +161,11 @@ export interface AwaitOptions { after?: DeploymentGraphFuture[]; } +export interface SendOptions { + value: BigNumber | ParameterFuture; + after?: DeploymentGraphFuture[]; +} + export interface UseSubgraphOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; after?: DeploymentGraphFuture[]; @@ -190,6 +206,8 @@ export interface IDeploymentBuilder { options: AwaitOptions ) => EventFuture; + sendETH: (sendTo: AddressResolvable, options: SendOptions) => SendFuture; + getParam: (paramName: string) => RequiredParameter; getOptionalParam: ( diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index bac4d47770..bae2b79c15 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -2,6 +2,7 @@ import type { BigNumber } from "ethers"; import { LibraryMap } from "./deploymentGraph"; import { + AddressResolvable, ArtifactContract, DeploymentGraphFuture, EventParamFuture, @@ -27,14 +28,16 @@ export type ExecutionVertexType = | "DeployedContract" | "LibraryDeploy" | "ContractCall" - | "AwaitedEvent"; + | "AwaitedEvent" + | "SentETH"; export type ExecutionVertex = | ContractDeploy | DeployedContract | LibraryDeploy | ContractCall - | AwaitedEvent; + | AwaitedEvent + | SentETH; export interface ContractDeploy extends VertexDescriptor { type: "ContractDeploy"; @@ -71,3 +74,9 @@ export interface AwaitedEvent extends VertexDescriptor { event: string; args: ArgValue[]; } + +export interface SentETH extends VertexDescriptor { + type: "SentETH"; + address: AddressResolvable; + value: BigNumber; +} diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index ad80239644..ef143c97be 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -62,6 +62,14 @@ export interface EventFuture { params: EventParams; } +export interface SendFuture { + vertexId: number; + label: string; + type: "send"; + subtype: "eth"; + _future: true; +} + export interface EventParams { [eventParam: string]: EventParamFuture; } @@ -70,6 +78,7 @@ export interface EventParamFuture { vertexId: number; label: string; type: "eventParam"; + subtype: string; _future: true; } @@ -115,8 +124,6 @@ export interface ProxyFuture { export type ArtifactFuture = ArtifactContract | DeployedContract; -export type AddressResolvable = EventParamFuture | ArtifactFuture; - export type ContractFuture = | HardhatContract | ArtifactContract @@ -133,6 +140,12 @@ export type DependableFuture = | ProxyFuture | EventFuture; +export type AddressResolvable = + | string + | ParameterFuture + | EventParamFuture + | ContractFuture; + export type ParameterFuture = RequiredParameter | OptionalParameter; export type DeploymentGraphFuture = diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index eb62c9b45d..c96d95c076 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -21,6 +21,7 @@ import type { ProxyFuture, BytesFuture, EventParamFuture, + ContractFuture, } from "types/future"; import { Artifact } from "types/hardhat"; @@ -131,3 +132,23 @@ export function isCallable( return future.type === "contract" || future.type === "library"; } + +export function isContract( + future: DeploymentGraphFuture +): future is ContractFuture { + if (isProxy(future)) { + return isContract(future.value); + } + + return future.type === "contract"; +} + +export function assertUnknownDeploymentVertexType( + deploymentVertex: never +): never { + const vertex = deploymentVertex as any; + + const forReport = "type" in vertex ? vertex.type : vertex; + + throw new Error(`Unknown deployment vertex type: ${forReport}`); +} diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/validation/dispatch/validateSendETH.ts new file mode 100644 index 0000000000..99522f85ae --- /dev/null +++ b/packages/core/src/validation/dispatch/validateSendETH.ts @@ -0,0 +1,33 @@ +import { ethers, BigNumber } from "ethers"; + +import { SendVertex } from "types/deploymentGraph"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; +import { isParameter } from "utils/guards"; + +export async function validateSendETH( + vertex: SendVertex, + _resultAccumulator: ResultsAccumulator +): Promise { + if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { + return { + _kind: "failure", + failure: new IgnitionError(`For send 'value' must be a BigNumber`), + }; + } + + if ( + typeof vertex.address === "string" && + !ethers.utils.isAddress(vertex.address) + ) { + return { + _kind: "failure", + failure: new Error(`"${vertex.address}" is not a valid address`), + }; + } + + return { + _kind: "success", + result: undefined, + }; +} diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 8876a9f74c..481c4eaff2 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,6 +1,7 @@ import { Services } from "services/types"; import { DeploymentGraphVertex } from "types/deploymentGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { assertUnknownDeploymentVertexType } from "utils/guards"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; @@ -9,6 +10,7 @@ import { validateCall } from "./validateCall"; import { validateDeployedContract } from "./validateDeployedContract"; import { validateHardhatContract } from "./validateHardhatContract"; import { validateHardhatLibrary } from "./validateHardhatLibrary"; +import { validateSendETH } from "./validateSendETH"; import { validateVirtual } from "./validateVirtual"; export function validationDispatch( @@ -53,17 +55,9 @@ export function validationDispatch( return validateVirtual(deploymentVertex, resultAccumulator, context); case "Event": return validateAwaitEvent(deploymentVertex, resultAccumulator, context); + case "SendETH": + return validateSendETH(deploymentVertex, resultAccumulator); default: - return assertUnknownDeploymentVertexType(deploymentVertex); + assertUnknownDeploymentVertexType(deploymentVertex); } } - -function assertUnknownDeploymentVertexType( - deploymentVertex: never -): Promise { - const vertex = deploymentVertex as any; - - const forReport = "type" in vertex ? vertex.type : vertex; - - throw new Error(`Unknown deployment vertex type: ${forReport}`); -} diff --git a/packages/core/test/deploymentBuilder/awaitedEvent.ts b/packages/core/test/deploymentBuilder/awaitedEvent.ts index 34501a13fc..59243db8e4 100644 --- a/packages/core/test/deploymentBuilder/awaitedEvent.ts +++ b/packages/core/test/deploymentBuilder/awaitedEvent.ts @@ -296,6 +296,7 @@ describe("deployment builder - await event", () => { vertexId: 2, label: "value", type: "eventParam", + subtype: "uint256", _future: true, }, ]); diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts new file mode 100644 index 0000000000..b0dbd1b685 --- /dev/null +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -0,0 +1,107 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { ethers } from "ethers"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; +import { isHardhatContract } from "utils/guards"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - send ETH", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const sendModule = buildModule("send", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const value = ethers.utils.parseUnits("10"); + + m.sendETH(token, { value, after: [token] }); + + return {}; + }); + + const { graph } = generateDeploymentGraphFrom(sendModule, { + chainId: 31337, + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have two nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + + it("should have the send node send/1", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "send/1"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "send/1"); + assert(depNode.type === "SendETH"); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show 1 dependency for the send node send/1", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "send/1"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + ]); + }); + + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); +}); diff --git a/packages/core/test/execution.ts b/packages/core/test/execution.ts index 629914e781..800a621a85 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution.ts @@ -239,6 +239,87 @@ describe("Execution", () => { }); }); + it("should execute an ETH send", async () => { + const fakeArtifact: Artifact = { + contractName: "Foo", + abi: [ + { + stateMutability: "payable", + type: "receive", + }, + ], + bytecode: + "6080604052348015600f57600080fd5b50604580601d6000396000f3fe608060405236600a57005b600080fdfea2646970667358221220da7e5683d44d4d83925bddf4a1eb18237892d4fe13551888fef8b0925eb9023664736f6c63430008070033", + linkReferences: {}, + }; + + const contractDeploy: ExecutionVertex = { + type: "ContractDeploy", + id: 0, + label: "Foo", + artifact: fakeArtifact, + args: [], + libraries: {}, + value: ethers.utils.parseUnits("0"), + }; + + const sendETH: ExecutionVertex = { + type: "SentETH", + id: 1, + label: "Foo", + address: { + vertexId: 0, + type: "contract", + subtype: "artifact", + artifact: fakeArtifact, + label: "Foo", + _future: true, + }, + value: ethers.utils.parseUnits("42"), + }; + + const sendTxStub = sinon.stub(); + sendTxStub.onCall(0).resolves("0x1"); + sendTxStub.onCall(1).resolves("0x2"); + + const mockServices: Services = { + ...getMockServices(), + contracts: { + sendTx: sendTxStub, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash === "0x1") { + return { + contractAddress: "0x0000000000000000000000000000000000000001", + }; + } + + return { + contractAddress: "0x0000000000000000000000000000000000000002", + }; + }, + } as any, + }; + + const response = await assertDependentVertex( + [contractDeploy, sendETH], + mockServices + ); + + assert.isDefined(response); + if (response._kind === "failure") { + return assert.fail("deploy failed"); + } + + assert.deepStrictEqual(response.result.get(1), { + _kind: "success", + result: { + hash: "0x2", + }, + }); + }); + it("should execute an awaited event", async () => { const fakeArtifact = { contractName: "Test", diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index ba903a5f98..1132adc539 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,5 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { ethers } from "ethers"; import sinon from "sinon"; import { buildModule } from "dsl/buildModule"; @@ -608,6 +609,131 @@ describe("Validation", () => { }); }); + describe("sendETH", () => { + const exampleCallArtifact = { + _format: "hh-sol-artifact-1", + contractName: "Foo", + sourceName: "contracts/Foo.sol", + abi: [ + { + stateMutability: "payable", + type: "receive", + }, + ], + bytecode: + "6080604052348015600f57600080fd5b50604580601d6000396000f3fe608060405236600a57005b600080fdfea2646970667358221220da7e5683d44d4d83925bddf4a1eb18237892d4fe13551888fef8b0925eb9023664736f6c63430008070033", + deployedBytecode: "0x0", + linkReferences: {}, + deployedLinkReferences: {}, + }; + + it("should validate a correct send", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + const value = ethers.utils.parseUnits("42"); + + m.sendETH(example, { value }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + assert.equal(validationResult._kind, "success"); + }); + + it("should fail a send with an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + const value = ethers.utils.parseUnits("42"); + + m.sendETH("0xnull", { value }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, `"0xnull" is not a valid address`); + }); + + it("should fail a call on a non-BigNumber as value", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.sendETH(example, { value: true as any }); + + return { example }; + }); + + const { graph } = generateDeploymentGraphFrom(singleModule, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await validateDeploymentGraph( + graph, + mockServices + ); + + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, "For send 'value' must be a BigNumber"); + }); + }); + describe("awaited event", () => { const exampleEventArtifact = { _format: "hh-sol-artifact-1", diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 3702f3068f..b79013dbed 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -126,6 +126,8 @@ const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { return "Failed library deploy"; case "AwaitedEvent": return "Failed awaited event"; + case "SentETH": + return "Failed to send ETH"; default: return assertNeverUiVertexType(vertex); } diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index c0ad65bda4..4eeb8570e2 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -174,6 +174,8 @@ export class DeploymentState { return "Failed library deploy"; case "AwaitedEvent": return "Failed awaited event"; + case "SentETH": + return "Failed to send ETH"; default: return assertNeverUiVertexType(vertex.type); } From 917b4f014929ddf56f33e9228250d8867137685e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Dec 2022 19:31:14 +0000 Subject: [PATCH 0202/1302] feat:restart-deployment (#70) Support restarting or rerunning deployments by recording a deployment run to a journal, then rebuilding the state from the journal on subsequent runs. The journal is stored as a sibling to the js module file. It records the state change commands that get passed during the execution phase. On a rerun the journal is read and the execution state reconstructed. Any on hold or errored vertexes are set back to unstarted, then the execution runs again. In parts: * feat: add state command journal Every command that updates the Deployment state, _during execution_, is written to a Journal. The journal is passed in at `Ignition` creation. In the **hardhat-plugin**, the journal implementation writes to a file that is a sibling to the module being deployed. Supporting refactorings: * remove `ui` flag infavour of constructor The `Ignition` object can be setup with a UI renderer. If none is given a noop renderer is put in its place. The deploy function can then focus on `deploy` options. This means the `IgnitionWrapper` creates a new ignition object in each of its tasks. * refactor(deploymentState): pull out run logic Create a shared run command function to dry up the repetition on conversion to commands. * feat: read messages from journal The journal uses ndjson, so read them one line at a time through an async generator. test(stateReducer): add tests and simplify Increase the test coverage over the state reducer before changing the message structure. Supporting refactors: * move reducer types out * separate out execution state reducer * deployState - restructure execution state Use a map of vertex ids to states rather than collections of states. The intermediary batch results are stored against the vertexes structure rather than the batch. The batch is reduced down to a list of vertex ids. * deployState - remove end batch message Replace the end batch message updating the state with a check in the individual vertex update to see if the batch is complete. We also change `batch` in execution state so that it is nullable, either befor or after a batch is started/completed. This is a change from the empty set that was used before. * change the names of execution messages * feat: show message if nothing to be rerun If the journal indicates that all contract deploys/calls have already completed, then display a message to that effect at the cli and then display the previously deployed contract addresses. Supporting refactor: * refactor(core): merge batch into execution In the short term there is no other planned execution policy other than batching so merge the batching code into execution proper. * feat: add hold state Allow execution on a vertex to return a `hold` result. * chore: run build on tests Enforce typing in tests by running `tsc` on tests. This is done through the cli and included in the `fullcheck` script. * feat(core): reach end on hold Either a failure or a on-hold from a vertex stops further execution. The deployment is complete. * feat(cli): show message on hold Display more details of the on hold vertexes when a deployment stops as on hold. Supporting refactors: * refactor(core): remove journal from tx service The journaling is happening at the execution graph level for the moment. * refactor(core): encapsulate providers in services Seal the usage of providers behind services to ease mocking. * refactor: externalise services Move services to be external to ignition core. This is to support mocking. We should look again at the best api for this. * test(core): add rerun tests Component level testing of reruns using an in-memory journal and mocking out the services. * fix(plugin): serialization/deserializtion of messages Support more complex return results from ethers in the messages for the journal. We need to be able to serialize/deserialize results with BigNumber and complex `Error` objects. For now we are only holding on to the message in the error. refactor(core): remove old journal files * chore: updating multisig example Change the multisig example so that an external script is required. Reflect an equivalent of that in the matching test. --- .github/workflows/ci.yml | 6 + .gitignore | 1 + .vscode/launch.json | 4 +- docs/running-a-deployment.md | 12 +- examples/multisig/README.md | 30 +- examples/multisig/contracts/Multisig.sol | 218 +++++------ .../{Multisig.js => MultisigModule.js} | 0 examples/multisig/package.json | 24 +- .../multisig/scripts/confirmTransaction.js | 20 + examples/multisig/test/Multisig.js | 94 +++-- package.json | 3 +- packages/core/package.json | 2 + packages/core/src/Ignition.ts | 109 +++--- packages/core/src/deployment/Deployment.ts | 244 ++++++------ .../deployment/deployExecutionStateReducer.ts | 108 ++++++ .../core/src/deployment/deployStateReducer.ts | 275 ++++--------- packages/core/src/deployment/utils.ts | 33 ++ packages/core/src/execution/batch/types.ts | 26 -- .../src/execution/batch/visitInBatches.ts | 141 ------- .../execution/dispatch/executeAwaitedEvent.ts | 6 +- .../execution/dispatch/executeContractCall.ts | 1 + packages/core/src/execution/dispatch/utils.ts | 6 + packages/core/src/execution/execute.ts | 130 ++++++- .../core/src/execution/loadJournalInto.ts | 12 + .../core/src/execution/{batch => }/utils.ts | 0 packages/core/src/graph/visit.ts | 7 + packages/core/src/index.ts | 4 + packages/core/src/journal/FileJournal.ts | 95 ----- packages/core/src/journal/InMemoryJournal.ts | 61 --- .../core/src/journal/NoopCommandJournal.ts | 16 + .../core/src/services/ContractsService.ts | 18 +- packages/core/src/services/NetworkService.ts | 17 + packages/core/src/services/createServices.ts | 22 +- packages/core/src/services/types.ts | 2 + packages/core/src/types/deployment.ts | 101 ++++- packages/core/src/types/execution.ts | 19 + packages/core/src/types/graph.ts | 11 +- .../{journal/types.ts => types/journal.ts} | 8 + packages/core/src/utils/tx-sender.ts | 54 +-- packages/core/test/contractsService.ts | 2 +- .../core/test/deploymentBuilder/useModule.ts | 3 +- .../batching.ts} | 17 +- .../{execution.ts => execution/dispatch.ts} | 366 ++++++++---------- packages/core/test/execution/rerun.ts | 358 +++++++++++++++++ packages/core/test/helpers.ts | 33 +- packages/core/test/state-reducer/execution.ts | 343 ++++++++++++++++ .../test/state-reducer/preparation-steps.ts | 121 ++++++ packages/core/test/state-reducer/utils.ts | 58 +++ packages/core/test/tx-sender.ts | 59 +-- .../core/test/util/MemoryCommandJournal.ts | 30 ++ packages/hardhat-plugin/package.json | 6 +- packages/hardhat-plugin/src/CommandJournal.ts | 90 +++++ .../src/buildIgnitionProvidersFrom.ts | 49 +++ .../hardhat-plugin/src/ignition-wrapper.ts | 59 ++- packages/hardhat-plugin/src/index.ts | 80 ++-- .../components/execution/AddressResults.tsx | 31 +- .../components/execution/BatchExecution.tsx | 40 +- .../components/execution/ExecutionPanel.tsx | 9 + .../ui/components/execution/FinalStatus.tsx | 124 ++++-- .../components/execution/ModuleParameters.tsx | 8 +- .../components/execution/SummarySection.tsx | 4 +- .../src/ui/components/execution/views.ts | 16 + packages/hardhat-plugin/src/ui/types.ts | 6 + .../hardhat-plugin/test/CommandJournal.ts | 88 +++++ yarn.lock | 73 +++- 65 files changed, 2664 insertions(+), 1349 deletions(-) rename examples/multisig/ignition/{Multisig.js => MultisigModule.js} (100%) create mode 100644 examples/multisig/scripts/confirmTransaction.js create mode 100644 packages/core/src/deployment/deployExecutionStateReducer.ts create mode 100644 packages/core/src/deployment/utils.ts delete mode 100644 packages/core/src/execution/batch/types.ts delete mode 100644 packages/core/src/execution/batch/visitInBatches.ts create mode 100644 packages/core/src/execution/loadJournalInto.ts rename packages/core/src/execution/{batch => }/utils.ts (100%) delete mode 100644 packages/core/src/journal/FileJournal.ts delete mode 100644 packages/core/src/journal/InMemoryJournal.ts create mode 100644 packages/core/src/journal/NoopCommandJournal.ts create mode 100644 packages/core/src/services/NetworkService.ts create mode 100644 packages/core/src/types/execution.ts rename packages/core/src/{journal/types.ts => types/journal.ts} (75%) rename packages/core/test/{batch/visitInBatches.ts => execution/batching.ts} (80%) rename packages/core/test/{execution.ts => execution/dispatch.ts} (66%) create mode 100644 packages/core/test/execution/rerun.ts create mode 100644 packages/core/test/state-reducer/execution.ts create mode 100644 packages/core/test/state-reducer/preparation-steps.ts create mode 100644 packages/core/test/state-reducer/utils.ts create mode 100644 packages/core/test/util/MemoryCommandJournal.ts create mode 100644 packages/hardhat-plugin/src/CommandJournal.ts create mode 100644 packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts create mode 100644 packages/hardhat-plugin/src/ui/components/execution/views.ts create mode 100644 packages/hardhat-plugin/test/CommandJournal.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 636a120531..2babedaa35 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,6 +23,8 @@ jobs: run: yarn build - name: Lint run: yarn lint + - name: Check tests typecheck + run: yarn test:build - name: Run tests run: yarn test - name: Run tests in examples @@ -43,6 +45,8 @@ jobs: run: yarn build - name: Lint run: yarn lint + - name: Check tests typecheck + run: yarn test:build - name: Run tests run: yarn test - name: Run tests in examples @@ -66,6 +70,8 @@ jobs: run: yarn build - name: Lint run: yarn lint + - name: Check tests typecheck + run: yarn test:build - name: Run tests run: yarn test - name: Run tests in examples diff --git a/.gitignore b/.gitignore index 8edc81843d..4fe0e3b1f3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ yarn-debug.log* yarn-error.log* lerna-debug.log* .pnpm-debug.log* +*.ndjson # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json diff --git a/.vscode/launch.json b/.vscode/launch.json index 699209ed53..a03d1bcfdc 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -22,7 +22,7 @@ { "name": "Debug core tests", "internalConsoleOptions": "openOnSessionStart", - "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "program": "${workspaceFolder}/packages/core/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], "type": "node", @@ -40,7 +40,7 @@ { "name": "Debug integration tests", "internalConsoleOptions": "openOnSessionStart", - "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", + "program": "${workspaceFolder}/packages/hardhat-plugin/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], "type": "node", diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index b5969726f6..a68b7ab4fa 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -7,7 +7,7 @@ - [Visualizing your deployment with the `plan` task](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) - [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - [Configuration options](./running-a-deployment.md#configuration-options) - - [Resuming a failed or onhold deployment (TBD)](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) + - [Resuming a failed or onhold deployment](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) --- @@ -103,14 +103,12 @@ The value of `pollingInterval` is the number of milliseconds the process will wa This config value determines how long `m.awaitEvent` waits for the given event to be emitted on-chain before marking the deployment as "on-hold". It should be given as a number of milliseconds, with the default value being 30000, or 30 seconds. -## Resuming a failed or onhold deployment (TBD) +## Resuming a failed or onhold deployment -Currently, failed transactions will be retried a number of times, with an increasing gas price each time, up to a max retry limit. If it has failed past that point, the deployment is considered failed and will be stopped. But what happens if some transactions in the deployment had already succeeded? +A run of a deployment can succeed, fail or be on hold. A failed deployment or one that is on hold, assuming it was run against a non-ephemeral network, can be rerun using the deploy command: -Broadly speaking, if some part of the deployment fails, the user will be able to retry it, or to modify the failing action. With the help of an internal journaling service, successfully completed transactions would not be run a second time when resuming a partially failed deployment. +`npx hardhat deploy MyModule.js --network localhost` -Similarly, a user with a deployment that is considered "on hold" and awaiting the completion of an external action of some kind (multisig wallet signatures, as an example) would be able to close the running **Ignition** process and resume the deployment safely whenever they choose without worrying about the previous actions being resolved again. +Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `awaitEvent` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. - -The exact nature of these files is TBD as this feature is being developed. diff --git a/examples/multisig/README.md b/examples/multisig/README.md index 31004079c5..b54c534038 100644 --- a/examples/multisig/README.md +++ b/examples/multisig/README.md @@ -1,15 +1,37 @@ # Multisig Example for Ignition -This hardhat project is an example of using ignition to deploy a basic Multisig contract. +This hardhat project is an example of using ignition to deploy a basic Multisig contract, send a transaction via the multisig, wait for an external confirmation, then resume the deploy to execute the confirmed transaction. -The module demonstrates how `m.awaitEvent(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain +The module demonstrates how `m.awaitEvent(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain. ## Deploying -To run the ignition deploy against the ephemeral hardhat network: +To run the ignition deploy against a local hardhat node, first start the node: ```shell -npx hardhat deploy Multisig.js +npx hardhat node +``` + +In a different tab, run the MultisigModule to deploy the multisig contract and submit a transaction: + +```shell +npx hardhat deploy MultisigModule.js --network localhost +``` + +The run should deploy and submit the transaction successfully but show the multisig/confirmation as pending and so the deployment is on `Hold`. + +Confirm the transaction (externally to the deployment) with a hardhat scripts under `./scripts`: + +```shell +npx hardhat run ./scripts/confirmTransaction.js --network localhost +``` + +The submitted transaction is now confirmed within the multisig. + +A rerun of the deployment will skip to the previously on hold `Multisig/Confirmation` step, and proceed to completion from there: + +```shell +npx hardhat deploy MultisigModule.js --network localhost ``` ## Test diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol index f89abc856e..96e3aab704 100644 --- a/examples/multisig/contracts/Multisig.sol +++ b/examples/multisig/contracts/Multisig.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.0; contract Multisig { - event Confirmation(address indexed sender, uint indexed transactionId); event Revocation(address indexed sender, uint indexed transactionId); event Submission(uint indexed transactionId); @@ -13,11 +12,11 @@ contract Multisig { event OwnerRemoval(address indexed owner); event RequirementChange(uint required); - uint constant public MAX_OWNER_COUNT = 50; + uint public constant MAX_OWNER_COUNT = 50; - mapping (uint => Transaction) public transactions; - mapping (uint => mapping (address => bool)) public confirmations; - mapping (address => bool) public isOwner; + mapping(uint => Transaction) public transactions; + mapping(uint => mapping(address => bool)) public confirmations; + mapping(address => bool) public isOwner; address[] public owners; uint public required; uint public transactionCount; @@ -70,24 +69,24 @@ contract Multisig { } modifier validRequirement(uint ownerCount, uint _required) { - require(ownerCount <= MAX_OWNER_COUNT - && _required <= ownerCount - && _required != 0 - && ownerCount != 0); + require( + ownerCount <= MAX_OWNER_COUNT && + _required <= ownerCount && + _required != 0 && + ownerCount != 0 + ); _; } - receive() - external payable - { - if (msg.value > 0) - emit Deposit(msg.sender, msg.value); + receive() external payable { + if (msg.value > 0) emit Deposit(msg.sender, msg.value); } - constructor(address[] memory _owners, uint _required) - validRequirement(_owners.length, _required) - { - for (uint i=0; i<_owners.length; i++) { + constructor( + address[] memory _owners, + uint _required + ) payable validRequirement(_owners.length, _required) { + for (uint i = 0; i < _owners.length; i++) { require(!isOwner[_owners[i]] && _owners[i] != address(0)); isOwner[_owners[i]] = true; } @@ -95,7 +94,9 @@ contract Multisig { required = _required; } - function addOwner(address owner) + function addOwner( + address owner + ) public onlyWallet ownerDoesNotExist(owner) @@ -107,30 +108,23 @@ contract Multisig { emit OwnerAddition(owner); } - function removeOwner(address owner) - public - onlyWallet - ownerExists(owner) - { + function removeOwner(address owner) public onlyWallet ownerExists(owner) { isOwner[owner] = false; - for (uint i=0; i owners.length) - changeRequirement(owners.length); + if (required > owners.length) changeRequirement(owners.length); emit OwnerRemoval(owner); } - function replaceOwner(address owner, address newOwner) - public - onlyWallet - ownerExists(owner) - ownerDoesNotExist(newOwner) - { - for (uint i=0; i { + // eslint-disable-next-line no-console + console.error(error); + process.exitCode = 1; +}); diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 1b6631b4c8..8afa1a5b9f 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -1,40 +1,86 @@ const { expect } = require("chai"); const { ethers } = require("ethers"); -const Multisig = require("../ignition/Multisig"); +const Multisig = require("../ignition/MultisigModule"); const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; describe("Multisig", function () { - let multisig; - let event; + describe("a deploy broken up by an external call", () => { + let multisig; + let event; - before(async () => { - const moduleResult = await ignition.deploy(Multisig); + this.beforeAll(async () => { + const journal = new MemoryCommandJournal(); - multisig = moduleResult.multisig; - event = moduleResult.event; - }); + try { + await ignition.deploy(Multisig, { + journal, + }); + } catch (err) { + // ignore + } - it("should confirm a stored transaction", async function () { - const [isConfirmed] = await multisig.functions.confirmations(0, ACCOUNT_0); + const artifact = await hre.artifacts.readArtifact("Multisig"); + const multisigInstance = await hre.ethers.getContractAt( + artifact.abi, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + await multisigInstance.confirmTransaction(0); - expect(isConfirmed).to.equal(true); - }); + const moduleResult = await ignition.deploy(Multisig, { + journal, + }); - it("should emit the sender and transaction id after confirming a stored transaction", async function () { - expect(event.sender).to.equal(ACCOUNT_0); - expect(ethers.BigNumber.from("0").eq(event.transactionId)).to.be.true; - }); + multisig = moduleResult.multisig; + event = moduleResult.event; + }); + + it("should confirm a stored transaction", async function () { + const [isConfirmed] = await multisig.functions.confirmations( + 0, + ACCOUNT_0 + ); + + expect(isConfirmed).to.equal(true); + }); + + it("should emit the sender and transaction id after confirming a stored transaction", async function () { + expect(event.sender).to.equal(ACCOUNT_0); + expect(ethers.BigNumber.from("0").eq(event.transactionId)).to.be.true; + }); - it("should execute a confirmed transaction", async function () { - const submittedTx = await multisig.functions.transactions(0); + it("should execute a confirmed transaction", async function () { + const submittedTx = await multisig.functions.transactions(0); - expect(submittedTx.destination).to.equal(ACCOUNT_0); - expect(submittedTx.value.toString()).to.equal( - ethers.utils.parseUnits("50").toString() - ); - expect(submittedTx.data).to.equal("0x00"); - expect(submittedTx.executed).to.equal(true); + expect(submittedTx.destination).to.equal(ACCOUNT_0); + expect(submittedTx.value.toString()).to.equal( + ethers.utils.parseUnits("50").toString() + ); + expect(submittedTx.data).to.equal("0x00"); + expect(submittedTx.executed).to.equal(true); + }); }); }); + +class MemoryCommandJournal { + constructor() { + this.entries = []; + } + + async record(command) { + this.entries.push(JSON.stringify(command)); + } + + async *read() { + for (const entry of this.entries) { + const command = JSON.parse(entry); + + yield command; + } + } + + clear() { + this.entries = []; + } +} diff --git a/package.json b/package.json index 1121b4f8f5..bc82ed6566 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,9 @@ "test": "wsrun --exclude-missing --serial test", "test:coverage": "wsrun --exclude-missing --serial test:coverage", "test:examples": "wsrun --exclude-missing --serial test:examples", + "test:build": "wsrun --exclude-missing --serial test:build", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "yarn build && yarn lint && yarn test:coverage && yarn test:examples", + "fullcheck": "yarn build && yarn lint && yarn test:build && yarn test:coverage && yarn test:examples", "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index cf7b18d166..239ce9d9d7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -28,6 +28,7 @@ "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' yarn test", + "test:build": "tsc --project ./test/", "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", "test:coverage": "nyc mocha \"test/**/*.ts\"", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" @@ -35,6 +36,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "^9.0.0", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 0c13e01423..0c3de64976 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -3,17 +3,17 @@ import { BigNumber } from "ethers"; import { Deployment } from "deployment/Deployment"; import { execute } from "execution/execute"; -import { InMemoryJournal } from "journal/InMemoryJournal"; +import { loadJournalInto } from "execution/loadJournalInto"; +import { NoopCommandJournal } from "journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; -import { createServices } from "services/createServices"; import { Services } from "services/types"; -import { DeploymentResult, UiParamsClosure } from "types/deployment"; +import { DeploymentResult, UpdateUiAction } from "types/deployment"; import { DependableFuture, FutureDict } from "types/future"; -import { ResultsAccumulator } from "types/graph"; +import { ResultsAccumulator, VisitResult } from "types/graph"; +import { ICommandJournal } from "types/journal"; import { Module, ModuleDict } from "types/module"; import { IgnitionPlan } from "types/plan"; -import { Providers } from "types/providers"; import { SerializedFutureResult } from "types/serialization"; import { isDependable } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; @@ -23,9 +23,7 @@ import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); export interface IgnitionDeployOptions { - pathToJournal: string | undefined; txPollingInterval: number; - ui: boolean; networkName: string; maxRetries: number; gasIncrementPerRetry: BigNumber | null; @@ -36,10 +34,23 @@ export interface IgnitionDeployOptions { type ModuleOutputs = Record; export class Ignition { - constructor( - private _providers: Providers, - private _uiRenderer: UiParamsClosure - ) {} + private _services: Services; + private _uiRenderer: UpdateUiAction; + private _journal: ICommandJournal; + + constructor({ + services, + uiRenderer, + journal, + }: { + services: Services; + uiRenderer?: UpdateUiAction; + journal?: ICommandJournal; + }) { + this._services = services; + this._uiRenderer = uiRenderer ?? (() => {}); + this._journal = journal ?? new NoopCommandJournal(); + } public async deploy( ignitionModule: Module, @@ -49,15 +60,14 @@ export class Ignition { const deployment = new Deployment( ignitionModule.name, - Deployment.setupServices(options, this._providers), - options.ui - ? this._uiRenderer(this._providers.config.parameters) - : undefined + this._services, + this._journal, + this._uiRenderer ); - const chainId = await this._getChainId(); - deployment.setChainId(chainId); - deployment.setNetworkName(options.networkName); + const chainId = await this._services.network.getChainId(); + await deployment.setChainId(chainId); + await deployment.setNetworkName(options.networkName); const { result: constructResult, moduleOutputs } = await this._constructExecutionGraphFrom(deployment, ignitionModule); @@ -66,9 +76,13 @@ export class Ignition { return [constructResult, {}]; } - deployment.transformComplete(constructResult.executionGraph); + await deployment.transformComplete(constructResult.executionGraph); log("Execute based on execution graph"); + + // rebuild previous execution state based on journal + await loadJournalInto(deployment, this._journal); + const executionResult = await execute(deployment, { maxRetries: options.maxRetries, gasIncrementPerRetry: options.gasIncrementPerRetry, @@ -76,16 +90,7 @@ export class Ignition { awaitEventDuration: options.awaitEventDuration, }); - if (executionResult._kind === "failure") { - return [executionResult, {}]; - } - - const serializedDeploymentResult = this._serialize( - moduleOutputs, - executionResult.result - ); - - return [{ _kind: "success", result: serializedDeploymentResult }, {}]; + return this._buildOutputFrom(executionResult, moduleOutputs); } public async plan( @@ -93,18 +98,7 @@ export class Ignition { ): Promise { log(`Start plan`); - const serviceOptions = { - providers: this._providers, - journal: new InMemoryJournal(), - }; - - const services: Services = createServices( - "moduleIdEXECUTE", - "executorIdEXECUTE", - serviceOptions - ); - - const chainId = await this._getChainId(); + const chainId = await this._services.network.getChainId(); const { graph: deploymentGraph } = generateDeploymentGraphFrom( deploymentModule, @@ -115,7 +109,7 @@ export class Ignition { const validationResult = await validateDeploymentGraph( deploymentGraph, - services + this._services ); if (validationResult._kind === "failure") { @@ -124,7 +118,7 @@ export class Ignition { const transformResult = await transformDeploymentGraphToExecutionGraph( deploymentGraph, - services + this._services ); if (transformResult._kind === "failure") { @@ -146,14 +140,14 @@ export class Ignition { chainId: deployment.state.details.chainId, }); - deployment.startValidation(); + await deployment.startValidation(); const validationResult = await validateDeploymentGraph( deploymentGraph, deployment.services ); if (validationResult._kind === "failure") { - deployment.failValidation(validationResult.failures[1]); + await deployment.failValidation(validationResult.failures[1]); return { result: validationResult, moduleOutputs }; } @@ -167,12 +161,24 @@ export class Ignition { return { result: transformResult, moduleOutputs }; } - private async _getChainId(): Promise { - const result = await this._providers.ethereumProvider.request({ - method: "eth_chainId", - }); + private _buildOutputFrom( + executionResult: VisitResult, + moduleOutputs: FutureDict + ): [DeploymentResult, ModuleOutputs] { + if (executionResult._kind === "failure") { + return [executionResult, {}]; + } + + if (executionResult._kind === "hold") { + return [executionResult, {}]; + } - return Number(result); + const serializedDeploymentResult = this._serialize( + moduleOutputs, + executionResult.result + ); + + return [{ _kind: "success", result: serializedDeploymentResult }, {}]; } private _serialize(moduleOutputs: FutureDict, result: ResultsAccumulator) { @@ -189,7 +195,8 @@ export class Ignition { if ( executionResultValue === undefined || executionResultValue === null || - executionResultValue._kind === "failure" + executionResultValue._kind === "failure" || + executionResultValue._kind === "hold" ) { return null; } diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 9884272b37..5c9c076ef5 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -1,19 +1,25 @@ import setupDebug from "debug"; -import { IgnitionDeployOptions } from "Ignition"; import { ExecutionGraph } from "execution/ExecutionGraph"; -import { ExecuteBatchResult } from "execution/batch/types"; -import { InMemoryJournal } from "journal/InMemoryJournal"; -import { createServices } from "services/createServices"; import { Services } from "services/types"; -import { DeployState, UpdateUiAction } from "types/deployment"; -import { VertexVisitResult, VertexVisitResultFailure } from "types/graph"; -import { Providers } from "types/providers"; +import { + DeployState, + UpdateUiAction, + DeployStateCommand, + DeployStateExecutionCommand, +} from "types/deployment"; +import { + VertexDescriptor, + VertexVisitResult, + VertexVisitResultFailure, +} from "types/graph"; +import { ICommandJournal } from "types/journal"; import { - deployStateReducer, initializeDeployState, + deployStateReducer, } from "./deployStateReducer"; +import { isDeployStateExecutionCommand } from "./utils"; const log = setupDebug("ignition:deployment"); @@ -21,157 +27,179 @@ export class Deployment { public state: DeployState; public services: Services; public ui?: UpdateUiAction; + private commandJournal: ICommandJournal; - constructor(moduleName: string, services: Services, ui?: UpdateUiAction) { + constructor( + moduleName: string, + services: Services, + journal: ICommandJournal, + ui?: UpdateUiAction + ) { this.state = initializeDeployState(moduleName); this.services = services; + this.commandJournal = journal; this.ui = ui; } - public static setupServices( - options: IgnitionDeployOptions, - providers: Providers - ): Services { - log("Create journal with path '%s'", options.pathToJournal); - - const journal = - options.pathToJournal !== undefined - ? // TODO: bring back FileJournal - new InMemoryJournal() // ? new FileJournal(options.pathToJournal) - : new InMemoryJournal(); - - const serviceOptions = { - providers, - journal, - }; - - const services: Services = createServices( - "moduleIdEXECUTE", - "executorIdEXECUTE", - serviceOptions - ); + public async load( + commandStream: AsyncGenerator + ) { + log("Loading from journal"); - return services; + for await (const command of commandStream) { + this.state = deployStateReducer(this.state, command); + } } public setChainId(chainId: number) { - log("ChainId resolved as '%s'", chainId); - this.state = deployStateReducer(this.state, { + return this._runDeploymentCommand(`ChainId resolved as '${chainId}'`, { type: "SET_CHAIN_ID", chainId, }); } public setNetworkName(networkName: string) { - log("NetworkName resolved as '%s'", networkName); - this.state = deployStateReducer(this.state, { - type: "SET_NETWORK_NAME", - networkName, - }); + return this._runDeploymentCommand( + `NetworkName resolved as '${networkName}'`, + { + type: "SET_NETWORK_NAME", + networkName, + } + ); } public startValidation() { - log("Validate deployment graph"); - this.state = deployStateReducer(this.state, { + return this._runDeploymentCommand("Validate deployment graph", { type: "START_VALIDATION", }); - - this._renderToUi(this.state); } public failValidation(errors: Error[]) { - log(`Validation failed with errors`, errors); - this.state = deployStateReducer(this.state, { - type: "VALIDATION_FAIL", - errors, - }); - - this._renderToUi(this.state); + return this._runDeploymentCommand( + [`Validation failed with errors`, errors], + { + type: "VALIDATION_FAIL", + errors, + } + ); } public transformComplete(executionGraph: ExecutionGraph) { - log(`Transform complete`, executionGraph); - this.state = deployStateReducer(this.state, { - type: "TRANSFORM_COMPLETE", - executionGraph, - }); - - this._renderToUi(this.state); + return this._runDeploymentCommand( + [`Transform complete`, [executionGraph]], + { + type: "TRANSFORM_COMPLETE", + executionGraph, + } + ); } - public startExecutionPhase(executionGraph: ExecutionGraph) { - log(`Starting Execution`); - this.state = deployStateReducer(this.state, { - type: "START_EXECUTION_PHASE", - executionGraph, + public startExecutionPhase() { + return this._runDeploymentCommand("Starting Execution", { + type: "EXECUTION::START", }); - - this._renderToUi(this.state); } - public updateExecutionWithNewBatch(batch: Set) { - log(`Update execution with new batch`, batch); - this.state = deployStateReducer(this.state, { - type: "UPDATE_EXECUTION_WITH_NEW_BATCH", + public updateExecutionWithNewBatch(batch: number[]) { + return this._runDeploymentCommand("Update execution with new batch", { + type: "EXECUTION::SET_BATCH", batch, }); + } - this._renderToUi(this.state); + public async updateVertexResult(vertexId: number, result: VertexVisitResult) { + return this._runDeploymentCommand( + [`Update current with batch result for ${vertexId}`, [result]], + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId, + result, + } + ); } - public updateExecutionWithBatchResults(batchResult: ExecuteBatchResult) { - log(`Update execution with batch results`, batchResult); - this.state = deployStateReducer(this.state, { - type: "UPDATE_EXECUTION_WITH_BATCH_RESULTS", - batchResult, - }); + public readExecutionErrors() { + return [...Object.entries(this.state.execution.vertexes)] + .filter(([_id, value]) => value.status === "FAILED") + .reduce( + ( + acc: { [key: number]: VertexVisitResultFailure }, + [id, { result }] + ) => { + if ( + result === undefined || + result === null || + result._kind !== "failure" + ) { + return acc; + } + + acc[parseInt(id, 10)] = result; - this._renderToUi(this.state); + return acc; + }, + {} + ); } - public updateCurrentBatchWithResult( - vertexId: number, - result: VertexVisitResult - ) { - log(`Update current with batch result for ${vertexId}`, result); - this.state = deployStateReducer(this.state, { - type: "UPDATE_CURRENT_BATCH_WITH_RESULT", - vertexId, - result, - }); + public readExecutionHolds(): VertexDescriptor[] { + const executionGraph = this.state.transform.executionGraph; - this._renderToUi(this.state); - } + if (executionGraph === null) { + throw new Error("Cannot read from unset execution graph"); + } - public readExecutionErrors() { - const errors = [...this.state.execution.errored].reduce( - (acc: { [key: number]: VertexVisitResultFailure }, id) => { - const result = this.state.execution.resultsAccumulator.get(id); - - if ( - result === undefined || - result === null || - result._kind === "success" - ) { - return acc; + return [...Object.entries(this.state.execution.vertexes)] + .filter(([_id, value]) => value.status === "HOLD") + .map(([id]) => { + const vertex = executionGraph.vertexes.get(parseInt(id, 10)); + + if (vertex === undefined) { + return null; } - acc[id] = result; + const descriptor: VertexDescriptor = { + id: vertex.id, + label: vertex.label, + type: vertex.type, + }; - return acc; - }, - {} - ); - - return errors; + return descriptor; + }) + .filter((x): x is VertexDescriptor => Boolean(x)); } public hasUnstarted(): boolean { - return this.state.execution.unstarted.size > 0; + return Object.values(this.state.execution.vertexes).some( + (v) => v.status === "UNSTARTED" + ); } public hasErrors(): boolean { - return this.state.execution.errored.size > 0; + return Object.values(this.state.execution.vertexes).some( + (v) => v.status === "FAILED" + ); + } + + public hasHolds(): boolean { + return Object.values(this.state.execution.vertexes).some( + (v) => v.status === "HOLD" + ); + } + + private async _runDeploymentCommand( + logMessage: string | [string, any[]], + command: DeployStateCommand + ): Promise { + log.apply(this, typeof logMessage === "string" ? [logMessage] : logMessage); + + if (isDeployStateExecutionCommand(command)) { + await this.commandJournal.record(command); + } + + this.state = deployStateReducer(this.state, command); + + this._renderToUi(this.state); } private _renderToUi(state: DeployState) { diff --git a/packages/core/src/deployment/deployExecutionStateReducer.ts b/packages/core/src/deployment/deployExecutionStateReducer.ts new file mode 100644 index 0000000000..03d06dc047 --- /dev/null +++ b/packages/core/src/deployment/deployExecutionStateReducer.ts @@ -0,0 +1,108 @@ +import type { + ExecutionState, + DeployStateExecutionCommand, + VertexExecutionState, + VertexExecutionStatusUnstarted, + VertexExecutionStatusFailed, + VertexExecutionStatusCompleted, + VertexExecutionStatusHold, +} from "types/deployment"; +import { VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; + +import { assertNeverMessageType } from "./utils"; + +export function deployExecutionStateReducer( + state: ExecutionState, + action: DeployStateExecutionCommand +): ExecutionState { + switch (action.type) { + case "EXECUTION::START": + // initialisation is done at the deployStateReducer level + return state; + case "EXECUTION::SET_BATCH": + return updateExecutionStateWithNewBatch(state, action.batch); + case "EXECUTION::SET_VERTEX_RESULT": + const updatedVertexes: { [key: number]: VertexExecutionState } = { + ...state.vertexes, + [action.vertexId]: convertTo(action.result), + }; + + if ( + state.batch !== null && + [...state.batch].every( + (id) => + updatedVertexes[id]?.status === "COMPLETED" || + updatedVertexes[id]?.status === "FAILED" || + updatedVertexes[id]?.status === "HOLD" + ) + ) { + return { + ...state, + batch: null, + previousBatches: [...state.previousBatches, state.batch], + vertexes: updatedVertexes, + }; + } + + return { + ...state, + vertexes: updatedVertexes, + }; + default: + assertNeverMessageType(action); + return state; + } +} + +function updateExecutionStateWithNewBatch( + state: ExecutionState, + batch: number[] +): ExecutionState { + const uniqueBatch = new Set(batch); + + const updatedVertexes = [...uniqueBatch].reduce( + (vertexes, id): { [key: number]: VertexExecutionState } => ({ + ...vertexes, + [id]: { + status: "RUNNING" as VertexExecutionStatusUnstarted, + result: null, + }, + }), + state.vertexes + ); + + return { + ...state, + batch: uniqueBatch, + vertexes: updatedVertexes, + }; +} + +function convertTo(vertexVisitResult: VertexVisitResult): VertexExecutionState { + switch (vertexVisitResult._kind) { + case "success": + return { + status: "COMPLETED" as VertexExecutionStatusCompleted, + result: vertexVisitResult, + }; + case "failure": + return { + status: "FAILED" as VertexExecutionStatusFailed, + result: vertexVisitResult, + }; + case "hold": + return { + status: "HOLD" as VertexExecutionStatusHold, + result: null, + }; + default: + return assertNeverKind(vertexVisitResult); + } +} + +function assertNeverKind(kind: never): VertexExecutionState { + throw new IgnitionError( + `Unknown visit result kind: ${JSON.stringify(kind, null, 2)}` + ); +} diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 87aed8e023..911afc3127 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -1,8 +1,14 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; -import { ExecuteBatchResult } from "execution/batch/types"; -import { DeployPhase, DeployState, ExecutionState } from "types/deployment"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { difference, union } from "utils/sets"; +import type { + DeployPhase, + DeployState, + ExecutionState, + DeployStateCommand, + VertexExecutionState, +} from "types/deployment"; + +import { deployExecutionStateReducer } from "./deployExecutionStateReducer"; +import { assertNeverMessageType } from "./utils"; export function initializeDeployState(moduleName: string): DeployState { return { @@ -19,74 +25,17 @@ export function initializeDeployState(moduleName: string): DeployState { executionGraph: null, }, execution: { - unstarted: new Set(), - onHold: new Set(), - completed: new Set(), - errored: new Set(), - batch: new Map(), + run: 0, + vertexes: {}, + batch: null, previousBatches: [], - resultsAccumulator: new Map(), }, }; } -export function initialiseExecutionStateFrom( - executionGraph: ExecutionGraph -): ExecutionState { - const unstarted = new Set(executionGraph.vertexes.keys()); - - const executionState: ExecutionState = { - unstarted, - onHold: new Set(), - completed: new Set(), - errored: new Set(), - batch: new Map(), - previousBatches: [], - resultsAccumulator: [...unstarted].reduce< - Map - >((acc, id) => { - acc.set(id, null); - - return acc; - }, new Map()), - }; - - return executionState; -} - export function deployStateReducer( state: DeployState, - action: - | { type: "SET_CHAIN_ID"; chainId: number } - | { type: "SET_NETWORK_NAME"; networkName: string } - | { - type: "START_VALIDATION"; - } - | { - type: "VALIDATION_FAIL"; - errors: Error[]; - } - | { - type: "TRANSFORM_COMPLETE"; - executionGraph: ExecutionGraph; - } - | { - type: "START_EXECUTION_PHASE"; - executionGraph: ExecutionGraph; - } - | { - type: "UPDATE_EXECUTION_WITH_NEW_BATCH"; - batch: Set; - } - | { - type: "UPDATE_EXECUTION_WITH_BATCH_RESULTS"; - batchResult: ExecuteBatchResult; - } - | { - type: "UPDATE_CURRENT_BATCH_WITH_RESULT"; - vertexId: number; - result: VertexVisitResult; - } + action: DeployStateCommand ): DeployState { switch (action.type) { case "SET_CHAIN_ID": @@ -124,24 +73,33 @@ export function deployStateReducer( ...state, transform: { executionGraph: action.executionGraph }, }; - case "START_EXECUTION_PHASE": + case "EXECUTION::START": + if (state.transform.executionGraph === null) { + return state; + } + + const executionStateForRun = deployExecutionStateReducer( + initialiseExecutionStateFrom( + state.transform.executionGraph, + state.execution + ), + action + ); + return { ...state, - phase: "execution", - execution: initialiseExecutionStateFrom(action.executionGraph), + phase: resolvePhaseFrom(executionStateForRun), + execution: executionStateForRun, }; - case "UPDATE_EXECUTION_WITH_NEW_BATCH": + case "EXECUTION::SET_BATCH": return { ...state, - execution: updateExecutionStateWithNewBatch( - state.execution, - action.batch - ), + execution: deployExecutionStateReducer(state.execution, action), }; - case "UPDATE_EXECUTION_WITH_BATCH_RESULTS": - const updatedExecution = updateExecutionStateWithBatchResults( + case "EXECUTION::SET_VERTEX_RESULT": + const updatedExecution = deployExecutionStateReducer( state.execution, - action.batchResult + action ); return { @@ -149,152 +107,55 @@ export function deployStateReducer( phase: resolvePhaseFrom(updatedExecution), execution: updatedExecution, }; - case "UPDATE_CURRENT_BATCH_WITH_RESULT": - const updatedBatch = new Map(state.execution.batch); - updatedBatch.set(action.vertexId, action.result); - - return { - ...state, - execution: { - ...state.execution, - batch: updatedBatch, - }, - }; default: assertNeverMessageType(action); return state; } } -function resolvePhaseFrom(updatedState: ExecutionState): DeployPhase { - if (updatedState.errored.size > 0) { - return "failed"; - } - - if (updatedState.unstarted.size === 0) { - return "complete"; - } - - return "execution"; -} - -export function updateExecutionStateWithNewBatch( - executionState: ExecutionState, - batch: Set -): ExecutionState { - const batchEntries = new Map(); - - for (const vertexId of batch) { - batchEntries.set(vertexId, null); - } - - return { - ...executionState, - unstarted: difference(executionState.unstarted, batch), - onHold: difference(executionState.onHold, batch), - batch: batchEntries, - }; -} - -export function updateExecutionStateWithBatchResults( - executionState: ExecutionState, - { - errored, - completed, - onhold, - resultsAccumulator: batchResultsAcc, - }: ExecuteBatchResult +function initialiseExecutionStateFrom( + executionGraph: ExecutionGraph, + previousExecutionState: ExecutionState ): ExecutionState { - const batch = new Set([...errored, ...completed, ...onhold]); - - const exState1 = transferFromBatchToCompleted(executionState, completed); - const exState2 = transferFromBatchToOnHold(exState1, onhold); - const exState3 = transferFromBatchToErrored(exState2, errored); + const vertexes = Array.from(executionGraph.vertexes.keys()).reduce<{ + [key: number]: VertexExecutionState; + }>((acc, id) => { + if (previousExecutionState.vertexes[id]?.status === "COMPLETED") { + return { ...acc, [id]: previousExecutionState.vertexes[id] }; + } - const exState4 = mergeBatchResultsInResultsAccumulator( - exState3, - batchResultsAcc - ); - - const exState5: ExecutionState = appendBatchToArchive(exState4, batch); - - return exState5; -} - -export function mergeBatchResultsInResultsAccumulator( - executionState: ExecutionState, - batchResultsAcc: ResultsAccumulator -): ExecutionState { - const updatedResultsAccumulator: ResultsAccumulator = new Map( - executionState.resultsAccumulator - ); - - batchResultsAcc.forEach((result, vertexId) => { - updatedResultsAccumulator.set(vertexId, result); - }); - - return { - ...executionState, - resultsAccumulator: updatedResultsAccumulator, - }; -} - -export function transferFromBatchToCompleted( - executionState: ExecutionState, - completed: Set -): ExecutionState { - return { - ...executionState, - batch: removeFromBatch(executionState.batch, completed), - completed: union(executionState.completed, completed), - }; -} + return { ...acc, [id]: { status: "UNSTARTED", result: null } }; + }, {}); -export function transferFromBatchToOnHold( - executionState: ExecutionState, - onHold: Set -): ExecutionState { - return { - ...executionState, - batch: removeFromBatch(executionState.batch, onHold), - onHold: union(executionState.onHold, onHold), - }; -} - -export function transferFromBatchToErrored( - executionState: ExecutionState, - errored: Set -): ExecutionState { - return { - ...executionState, - batch: removeFromBatch(executionState.batch, errored), - errored: union(executionState.errored, errored), + const executionState: ExecutionState = { + ...previousExecutionState, + run: previousExecutionState.run + 1, + vertexes, + batch: null, + previousBatches: [], }; -} -function appendBatchToArchive( - extensionState: ExecutionState, - previousBatch: Set -): ExecutionState { - return { - ...extensionState, - previousBatches: [...extensionState.previousBatches, previousBatch], - }; + return executionState; } -function removeFromBatch( - batch: Map, - toRemove: Set -): Map { - const updated = new Map(batch); +function resolvePhaseFrom(executionState: ExecutionState): DeployPhase { + if ( + Object.values(executionState.vertexes).some((v) => v.status === "FAILED") + ) { + return "failed"; + } - for (const vertexId of toRemove) { - updated.delete(vertexId); + if (Object.values(executionState.vertexes).some((v) => v.status === "HOLD")) { + return "hold"; } - return updated; -} + if ( + Object.values(executionState.vertexes).every( + (v) => v.status !== "UNSTARTED" + ) + ) { + return "complete"; + } -function assertNeverMessageType(action: never) { - throw new Error(`Unexpected message type ${action}`); + return "execution"; } diff --git a/packages/core/src/deployment/utils.ts b/packages/core/src/deployment/utils.ts new file mode 100644 index 0000000000..a937de35c6 --- /dev/null +++ b/packages/core/src/deployment/utils.ts @@ -0,0 +1,33 @@ +import type { + DeployState, + DeployStateCommand, + DeployStateExecutionCommand, +} from "types/deployment"; +import { ResultsAccumulator, VertexVisitResult } from "types/graph"; + +export function isDeployStateExecutionCommand( + command: DeployStateCommand +): command is DeployStateExecutionCommand { + return [ + "EXECUTION::START", + "EXECUTION::SET_BATCH", + "EXECUTION::SET_VERTEX_RESULT", + ].includes(command.type); +} + +export function assertNeverMessageType(action: never) { + throw new Error(`Unexpected message type ${action}`); +} + +export function viewExecutionResults( + deployState: DeployState +): ResultsAccumulator { + const entries: Array<[number, VertexVisitResult | null]> = Object.entries( + deployState.execution.vertexes + ).map(([vertexId, vertexState]) => [ + parseInt(vertexId, 10), + vertexState.result, + ]); + + return new Map(entries); +} diff --git a/packages/core/src/execution/batch/types.ts b/packages/core/src/execution/batch/types.ts deleted file mode 100644 index 333771e816..0000000000 --- a/packages/core/src/execution/batch/types.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ExecutionContext } from "types/deployment"; -import { ExecutionVertex } from "types/executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; - -export type BatcherResult = - | { - _kind: "success"; - context: Map; - } - | { - _kind: "failure"; - errors: any[]; - }; - -export type ExecutionVertexDispatcher = ( - vertex: ExecutionVertex, - resultAccumulator: ResultsAccumulator, - context: ExecutionContext -) => Promise; - -export interface ExecuteBatchResult { - completed: Set; - onhold: Set; - errored: Set; - resultsAccumulator: Map; -} diff --git a/packages/core/src/execution/batch/visitInBatches.ts b/packages/core/src/execution/batch/visitInBatches.ts deleted file mode 100644 index 7c5a8f3844..0000000000 --- a/packages/core/src/execution/batch/visitInBatches.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { Deployment } from "deployment/Deployment"; -import { Services } from "services/types"; -import { ExecutionState, ExecutionOptions } from "types/deployment"; -import { ExecutionVertex } from "types/executionGraph"; -import { - ResultsAccumulator, - VertexVisitResult, - VertexVisitResultFailure, - VertexVisitResultSuccess, - VisitResult, -} from "types/graph"; -import { union } from "utils/sets"; - -import { ExecutionGraph } from "../ExecutionGraph"; - -import { ExecutionVertexDispatcher, ExecuteBatchResult } from "./types"; -import { allDependenciesCompleted } from "./utils"; - -export async function visitInBatches( - deployment: Deployment, - executionGraph: ExecutionGraph, - executionVertexDispatcher: ExecutionVertexDispatcher, - options: ExecutionOptions -): Promise { - deployment.startExecutionPhase(executionGraph); - - while (deployment.hasUnstarted()) { - const batch = calculateNextBatch( - deployment.state.execution, - executionGraph - ); - - deployment.updateExecutionWithNewBatch(batch); - - const executeBatchResult = await executeBatch( - batch, - executionGraph, - deployment.state.execution.resultsAccumulator, - deployment.updateCurrentBatchWithResult.bind(deployment), - { services: deployment.services }, - executionVertexDispatcher, - options - ); - - deployment.updateExecutionWithBatchResults(executeBatchResult); - - if (deployment.hasErrors()) { - const errors = deployment.readExecutionErrors(); - - return { - _kind: "failure", - failures: [ - "execution failed", - Object.values(errors).map((err) => err.failure), - ], - }; - } - } - - return { - _kind: "success", - result: deployment.state.execution.resultsAccumulator, - }; -} - -function calculateNextBatch( - executionState: ExecutionState, - executionGraph: ExecutionGraph -): Set { - const potentials = union(executionState.unstarted, executionState.onHold); - - const batch = [...potentials].filter((vertexId) => - allDependenciesCompleted(vertexId, executionGraph, executionState.completed) - ); - - return new Set(batch); -} - -async function executeBatch( - batch: Set, - executionGraph: ExecutionGraph, - resultsAccumulator: ResultsAccumulator, - uiUpdate: (vertexId: number, result: VertexVisitResult) => void, - { services }: { services: Services }, - executionVertexDispatcher: ExecutionVertexDispatcher, - options: ExecutionOptions -): Promise { - const batchVertexes = [...batch] - .map((vertexId) => executionGraph.vertexes.get(vertexId)) - .filter((v): v is ExecutionVertex => v !== undefined); - - if (batchVertexes.length !== batch.size) { - throw new Error("Unable to retrieve all vertexes while executing batch"); - } - - const promises = batchVertexes.map(async (vertex) => { - const result = await executionVertexDispatcher(vertex, resultsAccumulator, { - services, - options, - }); - - uiUpdate(vertex.id, result); - - return { vertexId: vertex.id, result }; - }); - - const results = await Promise.all(promises); - - const successes = results.filter( - ( - executionResult - ): executionResult is { - vertexId: number; - result: VertexVisitResultSuccess; - } => executionResult.result._kind === "success" - ); - - const errored = results.filter( - ( - executionResult - ): executionResult is { - vertexId: number; - result: VertexVisitResultFailure; - } => executionResult.result._kind === "failure" - ); - - const updatedResultsAccumulator = [...successes, ...errored].reduce( - (acc, success) => { - acc.set(success.vertexId, success.result); - return acc; - }, - new Map() - ); - - return { - completed: new Set(successes.map(({ vertexId }) => vertexId)), - onhold: new Set(), - errored: new Set(errored.map(({ vertexId }) => vertexId)), - resultsAccumulator: updatedResultsAccumulator, - }; -} diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index e0d8e9af26..70fe0c99bd 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -29,12 +29,8 @@ export async function executeAwaitedEvent( ); if (eventResult === null) { - // todo: implement on hold state return { - _kind: "failure", - failure: new Error( - "Event not emitted within duration - try again later" - ), + _kind: "hold", }; } diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 11ff68ae9e..da47358240 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -25,6 +25,7 @@ export async function executeContractCall( ...resolvedArgs, { value } ); + txHash = await services.contracts.sendTx(unsignedTx, options); } catch (err) { return { diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index d280c0dffe..c0e9e50241 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -35,6 +35,12 @@ function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { ); } + if (entry._kind === "hold") { + throw new Error( + `Looking up context on a on hold - violation of constraint` + ); + } + if (isEventParam(arg)) { return entry.result.topics[arg.label]; } diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 6762f9957b..82c05c1621 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,21 +1,141 @@ import type { Deployment } from "deployment/Deployment"; -import type { ExecutionOptions } from "types/deployment"; -import type { VisitResult } from "types/graph"; +import { viewExecutionResults } from "deployment/utils"; +import { Services } from "services/types"; +import type { ExecutionOptions, ExecutionState } from "types/deployment"; +import { ExecutionVertexDispatcher } from "types/execution"; +import { ExecutionVertex } from "types/executionGraph"; +import type { + ResultsAccumulator, + VertexVisitResult, + VisitResult, +} from "types/graph"; +import { IgnitionError } from "utils/errors"; -import { visitInBatches } from "./batch/visitInBatches"; +import { ExecutionGraph } from "./ExecutionGraph"; import { executionDispatch } from "./dispatch/executionDispatch"; +import { allDependenciesCompleted } from "./utils"; export async function execute( deployment: Deployment, options: ExecutionOptions ): Promise { if (deployment.state.transform.executionGraph === null) { - throw new Error("Cannot execute without an execution graph"); + throw new IgnitionError("Cannot execute without an execution graph"); } - return visitInBatches( + + return executeInBatches( deployment, deployment.state.transform.executionGraph, executionDispatch, options ); } + +export async function executeInBatches( + deployment: Deployment, + executionGraph: ExecutionGraph, + executionVertexDispatcher: ExecutionVertexDispatcher, + options: ExecutionOptions +): Promise { + await deployment.startExecutionPhase(); + + while (deployment.hasUnstarted()) { + const batch = calculateNextBatch( + deployment.state.execution, + executionGraph + ); + + await deployment.updateExecutionWithNewBatch(batch); + + await executeBatch( + batch, + executionGraph, + viewExecutionResults(deployment.state), + deployment.updateVertexResult.bind(deployment), + { services: deployment.services }, + executionVertexDispatcher, + options + ); + + if (deployment.hasErrors()) { + const errors = deployment.readExecutionErrors(); + + return { + _kind: "failure", + failures: [ + "execution failed", + Object.values(errors).map((err) => err.failure), + ], + }; + } + + if (deployment.hasHolds()) { + const holds = deployment.readExecutionHolds(); + + return { + _kind: "hold", + holds, + }; + } + } + + return { + _kind: "success", + result: viewExecutionResults(deployment.state), + }; +} + +function calculateNextBatch( + executionState: ExecutionState, + executionGraph: ExecutionGraph +): number[] { + const potentials = new Set( + Object.entries(executionState.vertexes) + .filter(([_id, v]) => v.status === "UNSTARTED") + .map(([id]) => parseInt(id, 10)) + ); + + const alreadyCompleted = new Set( + Object.entries(executionState.vertexes) + .filter(([_id, v]) => v.status === "COMPLETED") + .map(([id]) => parseInt(id, 10)) + ); + + return [...potentials].filter((vertexId) => + allDependenciesCompleted(vertexId, executionGraph, alreadyCompleted) + ); +} + +async function executeBatch( + batch: number[], + executionGraph: ExecutionGraph, + resultsAccumulator: ResultsAccumulator, + deploymentStateUpdate: ( + vertexId: number, + result: VertexVisitResult + ) => Promise, + { services }: { services: Services }, + executionVertexDispatcher: ExecutionVertexDispatcher, + options: ExecutionOptions +): Promise { + const batchVertexes = [...batch] + .map((vertexId) => executionGraph.vertexes.get(vertexId)) + .filter((v): v is ExecutionVertex => v !== undefined); + + if (batchVertexes.length !== batch.length) { + throw new Error("Unable to retrieve all vertexes while executing batch"); + } + + const promises = batchVertexes.map(async (vertex) => { + const result = await executionVertexDispatcher(vertex, resultsAccumulator, { + services, + options, + }); + + await deploymentStateUpdate(vertex.id, result); + + return { vertexId: vertex.id, result }; + }); + + await Promise.all(promises); +} diff --git a/packages/core/src/execution/loadJournalInto.ts b/packages/core/src/execution/loadJournalInto.ts new file mode 100644 index 0000000000..21ee851028 --- /dev/null +++ b/packages/core/src/execution/loadJournalInto.ts @@ -0,0 +1,12 @@ +import { Deployment } from "deployment/Deployment"; +import { ICommandJournal } from "types/journal"; + +/** + * Update the deployment execution state with the previous runs in the journal. + */ +export async function loadJournalInto( + deployment: Deployment, + journal: ICommandJournal +): Promise { + return deployment.load(journal.read()); +} diff --git a/packages/core/src/execution/batch/utils.ts b/packages/core/src/execution/utils.ts similarity index 100% rename from packages/core/src/execution/batch/utils.ts rename to packages/core/src/execution/utils.ts diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 8c85f0c0c7..03e37f7402 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -42,6 +42,13 @@ export async function visit( }; } + if (vertexVisitResult._kind === "hold") { + return { + _kind: "hold", + holds: [vertex as any], + }; + } + resultAccumulator.set(vertexId, vertexVisitResult.result); if (afterAction !== undefined) { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9c7d157b4a..ac512299c3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,8 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; export { buildModule } from "dsl/buildModule"; export { buildSubgraph } from "dsl/buildSubgraph"; +export { viewExecutionResults } from "deployment/utils"; +export { createServices } from "services/createServices"; export type { SerializedDeploymentResult, @@ -35,3 +37,5 @@ export type { ExecutionVertex, ExecutionVertexType, } from "types/executionGraph"; +export type { ICommandJournal } from "types/journal"; +export type { DeployStateExecutionCommand } from "types/deployment"; diff --git a/packages/core/src/journal/FileJournal.ts b/packages/core/src/journal/FileJournal.ts deleted file mode 100644 index 1bb10bcaf2..0000000000 --- a/packages/core/src/journal/FileJournal.ts +++ /dev/null @@ -1,95 +0,0 @@ -import setupDebug, { IDebugger } from "debug"; -import fsExtra from "fs-extra"; - -import { Journal, JournalEntry } from "./types"; - -export class FileJournal implements Journal { - private _log: IDebugger = setupDebug("ignition:journal:file-journal"); - - constructor(private _path: string) {} - - public async addEntry( - moduleId: string, - executorId: string, - journalEntry: JournalEntry - ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); - - let content; - if (await fsExtra.pathExists(this._path)) { - content = await fsExtra.readJson(this._path); - } else { - content = {}; - } - - content[moduleId] = content[moduleId] ?? {}; - content[moduleId][executorId] = content[moduleId][executorId] ?? []; - content[moduleId][executorId].push(journalEntry); - - await fsExtra.writeJson(this._path, content, { - spaces: 2, - }); - - return content[moduleId][executorId].length - 1; - } - - public async getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); - - if (!(await fsExtra.pathExists(this._path))) { - return; - } - const content = await fsExtra.readJson(this._path); - - return content?.[moduleId]?.[executorId]?.[entryIndex]; - } - - public async replaceEntry( - moduleId: string, - executorId: string, - txIndex: number, - journalEntry: JournalEntry - ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); - - let content; - if (await fsExtra.pathExists(this._path)) { - content = await fsExtra.readJson(this._path); - } else { - content = {}; - } - - if (content[moduleId]?.[executorId]?.[txIndex] === undefined) { - throw new Error(`Assertion error: replacing non-existent transaction`); - } - - content[moduleId][executorId][txIndex] = journalEntry; - - await fsExtra.writeJson(this._path, content, { - spaces: 2, - }); - } - - public async delete(moduleId: string) { - this._log(`Deleting module ${moduleId}`); - - if (!(await fsExtra.pathExists(this._path))) { - return; - } - - const content = await fsExtra.readJson(this._path); - delete content?.[moduleId]; - - if (Object.entries(content).length === 0) { - await fsExtra.remove(this._path); - } else { - await fsExtra.writeJson(this._path, content, { - spaces: 2, - }); - } - } -} diff --git a/packages/core/src/journal/InMemoryJournal.ts b/packages/core/src/journal/InMemoryJournal.ts deleted file mode 100644 index 7940340373..0000000000 --- a/packages/core/src/journal/InMemoryJournal.ts +++ /dev/null @@ -1,61 +0,0 @@ -import setupDebug from "debug"; - -import { Journal, JournalEntry } from "./types"; - -export class InMemoryJournal implements Journal { - private _log: debug.IDebugger = setupDebug( - "ignition:journal:in-memory-journal" - ); - private _journal: Map> = new Map(); - - public async addEntry( - moduleId: string, - executorId: string, - journalEntry: JournalEntry - ): Promise { - this._log(`Adding entry to ${moduleId}/${executorId}`); - - const moduleEntry: Map = - this._journal.get(moduleId) ?? new Map(); - const executorEntries = moduleEntry.get(executorId) ?? []; - - executorEntries.push(journalEntry); - - moduleEntry.set(executorId, executorEntries); - this._journal.set(moduleId, moduleEntry); - - return executorEntries.length - 1; - } - - public async getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise { - this._log(`Getting entry ${entryIndex} from ${moduleId}/${executorId}`); - - return this._journal.get(moduleId)?.get(executorId)?.[entryIndex]; - } - - public async replaceEntry( - moduleId: string, - executorId: string, - txIndex: number, - entryIndex: JournalEntry - ): Promise { - this._log(`Replacing entry ${txIndex} from ${moduleId}/${executorId}`); - - const transactions = this._journal.get(moduleId)?.get(executorId); - if (transactions === undefined || transactions[txIndex] === undefined) { - throw new Error(`Assertion error: replacing non-existent transaction`); - } - - transactions[txIndex] = entryIndex; - } - - public async delete(moduleId: string) { - this._log(`Deleting module ${moduleId}`); - - this._journal.delete(moduleId); - } -} diff --git a/packages/core/src/journal/NoopCommandJournal.ts b/packages/core/src/journal/NoopCommandJournal.ts new file mode 100644 index 0000000000..19e59b959b --- /dev/null +++ b/packages/core/src/journal/NoopCommandJournal.ts @@ -0,0 +1,16 @@ +import type { DeployStateExecutionCommand } from "types/deployment"; +import type { ICommandJournal } from "types/journal"; + +export class NoopCommandJournal implements ICommandJournal { + public async record(_command: DeployStateExecutionCommand): Promise { + return; + } + + public read(): AsyncGenerator { + return fakeRead(); + } +} + +async function* fakeRead() { + return; +} diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 088deb57d4..b99d185109 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -43,6 +43,7 @@ export class ContractsService implements IContractsService { } else { this._debug("Deploying contract"); } + const signer = await this._providers.signersProvider.getDefaultSigner(); return this._sendTx(signer, deployTransaction, txOptions); @@ -63,14 +64,8 @@ export class ContractsService implements IContractsService { let blockNumberWhenSent = await this._providers.web3Provider.getBlockNumber(); - const txIndexAndHash = await this._txSender.send( - signer, - tx, - blockNumberWhenSent - ); - const txIndex = txIndexAndHash[0]; - let txHash = txIndexAndHash[1]; + let txHash = await this._txSender.send(signer, tx); let txSent = tx; let retries = 0; @@ -97,12 +92,8 @@ export class ContractsService implements IContractsService { blockNumberWhenSent = await this._providers.web3Provider.getBlockNumber(); - txHash = await this._txSender.sendAndReplace( - signer, - txToSend, - blockNumberWhenSent, - txIndex - ); + + txHash = await this._txSender.sendAndReplace(signer, txToSend); txSent = txToSend; retries++; @@ -124,6 +115,7 @@ export class ContractsService implements IContractsService { const previousTx = await this._providers.web3Provider.getTransaction( previousTxHash ); + const newEstimatedGasPrice = await this._providers.gasProvider.estimateGasPrice(); diff --git a/packages/core/src/services/NetworkService.ts b/packages/core/src/services/NetworkService.ts new file mode 100644 index 0000000000..c67b8ce7ea --- /dev/null +++ b/packages/core/src/services/NetworkService.ts @@ -0,0 +1,17 @@ +import { Providers } from "types/providers"; + +export interface INetworkService { + getChainId(): Promise; +} + +export class NetworkService implements INetworkService { + constructor(private readonly _providers: Providers) {} + + public async getChainId(): Promise { + const result = await this._providers.ethereumProvider.request({ + method: "eth_chainId", + }); + + return Number(result); + } +} diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index ee35ff8d6f..6d41303833 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,34 +1,20 @@ import { ethers } from "ethers"; -import { Journal } from "journal/types"; import { Providers } from "types/providers"; import { TxSender } from "utils/tx-sender"; import { ArtifactsService } from "./ArtifactsService"; import { ConfigService } from "./ConfigService"; import { ContractsService } from "./ContractsService"; +import { NetworkService } from "./NetworkService"; import { TransactionsService } from "./TransactionsService"; import { Services } from "./types"; -export function createServices( - moduleId: string, - executorId: string, - { - providers, - journal, - }: { - providers: Providers; - journal: Journal; - } -): Services { - const txSender = new TxSender( - moduleId, - executorId, - providers.gasProvider, - journal - ); +export function createServices(providers: Providers): Services { + const txSender = new TxSender(providers.gasProvider); const services: Services = { + network: new NetworkService(providers), artifacts: new ArtifactsService(providers), contracts: new ContractsService( { diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 99893737b4..ded01529d5 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -3,6 +3,7 @@ import { ethers } from "ethers"; import { IArtifactsService } from "./ArtifactsService"; import { IConfigService } from "./ConfigService"; import { IContractsService } from "./ContractsService"; +import { INetworkService } from "./NetworkService"; import { ITransactionsService } from "./TransactionsService"; export interface TransactionOptions { @@ -14,6 +15,7 @@ export interface TransactionOptions { } export interface Services { + network: INetworkService; contracts: IContractsService; artifacts: IArtifactsService; transactions: ITransactionsService; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index c523153fcd..4731f2b220 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,9 +1,15 @@ import type { BigNumber } from "ethers"; -import { ExecutionGraph } from "execution/ExecutionGraph"; import { Services } from "services/types"; -import { ResultsAccumulator, VertexVisitResult } from "./graph"; +import { ExecutionVertex } from "./executionGraph"; +import { + IGraph, + VertexDescriptor, + VertexVisitResult, + VertexVisitResultFailure, + VertexVisitResultSuccess, +} from "./graph"; import { ModuleParams } from "./module"; import { SerializedDeploymentResult, @@ -23,7 +29,7 @@ export interface IgnitionModuleResults { export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } - | { _kind: "hold"; holds: [string, string[]] } + | { _kind: "hold"; holds: VertexDescriptor[] } | { _kind: "success"; result: SerializedDeploymentResult }; export type DeployPhase = @@ -32,22 +38,93 @@ export type DeployPhase = | "execution" | "complete" | "failed" + | "hold" | "validation-failed"; +export type DeployStateExecutionCommand = + | { + type: "EXECUTION::START"; + } + | { + type: "EXECUTION::SET_BATCH"; + batch: number[]; + } + | { + type: "EXECUTION::SET_VERTEX_RESULT"; + vertexId: number; + result: VertexVisitResult; + }; + +export type DeployStateCommand = + | { type: "SET_CHAIN_ID"; chainId: number } + | { type: "SET_NETWORK_NAME"; networkName: string } + | { + type: "START_VALIDATION"; + } + | { + type: "VALIDATION_FAIL"; + errors: Error[]; + } + | { + type: "TRANSFORM_COMPLETE"; + executionGraph: IGraph; + } + | DeployStateExecutionCommand; + export interface ValidationState { errors: Error[]; } -export interface ExecutionState { - unstarted: Set; - onHold: Set; - completed: Set; - errored: Set; +export type VertexExecutionStatusUnstarted = "UNSTARTED"; +export type VertexExecutionStatusRunning = "RUNNING"; +export type VertexExecutionStatusCompleted = "COMPLETED"; +export type VertexExecutionStatusFailed = "FAILED"; +export type VertexExecutionStatusHold = "HOLD"; - batch: Map; - previousBatches: Array>; +export type VertexExecutionStatus = + | VertexExecutionStatusUnstarted + | VertexExecutionStatusRunning + | VertexExecutionStatusCompleted + | VertexExecutionStatusFailed + | VertexExecutionStatusHold; + +export interface VertexExecutionStateRunning { + status: VertexExecutionStatusUnstarted; + result: null; +} + +export interface VertexExecutionStateUnstarted { + status: VertexExecutionStatusRunning; + result: null; +} - resultsAccumulator: ResultsAccumulator; +export interface VertexExecutionStateCompleted { + status: VertexExecutionStatusCompleted; + result: VertexVisitResultSuccess; +} + +export interface VertexExecutionStateFailed { + status: VertexExecutionStatusFailed; + result: VertexVisitResultFailure; +} + +export interface VertexExecutionStateHold { + status: VertexExecutionStatusHold; + result: null; +} + +export type VertexExecutionState = + | VertexExecutionStateUnstarted + | VertexExecutionStateRunning + | VertexExecutionStateCompleted + | VertexExecutionStateFailed + | VertexExecutionStateHold; + +export interface ExecutionState { + run: number; + vertexes: { [key: number]: VertexExecutionState }; + batch: Set | null; + previousBatches: Array>; } export interface DeployNetworkConfig { @@ -61,7 +138,7 @@ export interface DeployState { details: DeployNetworkConfig; validation: ValidationState; transform: { - executionGraph: ExecutionGraph | null; + executionGraph: IGraph | null; }; execution: ExecutionState; } diff --git a/packages/core/src/types/execution.ts b/packages/core/src/types/execution.ts new file mode 100644 index 0000000000..52071235d3 --- /dev/null +++ b/packages/core/src/types/execution.ts @@ -0,0 +1,19 @@ +import { ExecutionContext } from "./deployment"; +import { ExecutionVertex } from "./executionGraph"; +import { ResultsAccumulator, VertexVisitResult } from "./graph"; + +export type BatcherResult = + | { + _kind: "success"; + context: Map; + } + | { + _kind: "failure"; + errors: any[]; + }; + +export type ExecutionVertexDispatcher = ( + vertex: ExecutionVertex, + resultAccumulator: ResultsAccumulator, + context: ExecutionContext +) => Promise; diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index fcffc34a29..2407ddb5ec 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -25,9 +25,14 @@ export interface VertexVisitResultFailure { failure: Error; } +export interface VertexVisitResultHold { + _kind: "hold"; +} + export type VertexVisitResult = | VertexVisitResultSuccess - | VertexVisitResultFailure; + | VertexVisitResultFailure + | VertexVisitResultHold; export type VisitResult = | { @@ -37,6 +42,10 @@ export type VisitResult = | { _kind: "failure"; failures: [string, Error[]]; + } + | { + _kind: "hold"; + holds: VertexDescriptor[]; }; export type ResultsAccumulator = Map; diff --git a/packages/core/src/journal/types.ts b/packages/core/src/types/journal.ts similarity index 75% rename from packages/core/src/journal/types.ts rename to packages/core/src/types/journal.ts index f990b339a1..21223a5b5f 100644 --- a/packages/core/src/journal/types.ts +++ b/packages/core/src/types/journal.ts @@ -1,3 +1,5 @@ +import type { DeployStateExecutionCommand } from "types/deployment"; + export interface JournalEntry { txHash: string; blockNumberWhenSent: number; @@ -27,3 +29,9 @@ export interface Journal { ): Promise; delete(moduleId: string): Promise; } + +export interface ICommandJournal { + record(command: DeployStateExecutionCommand): Promise; + + read(): AsyncGenerator; +} diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/utils/tx-sender.ts index d1928634e3..899eaf9ca0 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -1,7 +1,6 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { Journal } from "journal/types"; import { GasProvider, IgnitionSigner } from "types/providers"; /** @@ -13,16 +12,8 @@ import { GasProvider, IgnitionSigner } from "types/providers"; export class TxSender { private _debug: IDebugger; - // Index of the last sent tx, or -1 if none was sent yet - private _txIndex = -1; - - constructor( - private _moduleId: string, - private _executorId: string, - private _gasProvider: GasProvider, - private _journal: Journal - ) { - this._debug = setupDebug(`ignition:tx-sender:${_moduleId}:${_executorId}`); + constructor(private _gasProvider: GasProvider) { + this._debug = setupDebug(`ignition:tx-sender`); } /** @@ -32,36 +23,13 @@ export class TxSender { */ public async send( signer: IgnitionSigner, - tx: ethers.providers.TransactionRequest, - blockNumberWhenSent: number - ): Promise<[number, string]> { - const nextTxIndex = this._txIndex + 1; - this._debug(`Getting transaction ${nextTxIndex} from journal`); - const journaledTx = await this._journal.getEntry( - this._moduleId, - this._executorId, - nextTxIndex - ); - - if (journaledTx !== undefined) { - this._debug(`Transaction with index ${nextTxIndex} found in journal`); - this._txIndex = nextTxIndex; - return [this._txIndex, journaledTx.txHash]; - } - - this._debug( - `Transaction with index ${nextTxIndex} not found in journal, sending` - ); + tx: ethers.providers.TransactionRequest + ): Promise { + this._debug(`sending transaction`, [tx]); const sentTx = await this._send(signer, tx); - this._txIndex = await this._journal.addEntry( - this._moduleId, - this._executorId, - { txHash: sentTx.hash, blockNumberWhenSent } - ); - - return [this._txIndex, sentTx.hash]; + return sentTx.hash; } /** @@ -71,17 +39,9 @@ export class TxSender { */ public async sendAndReplace( signer: IgnitionSigner, - tx: ethers.providers.TransactionRequest, - blockNumberWhenSent: number, - txIndex: number + tx: ethers.providers.TransactionRequest ): Promise { const sentTx = await this._send(signer, tx); - await this._journal.replaceEntry( - this._moduleId, - this._executorId, - txIndex, - { txHash: sentTx.hash, blockNumberWhenSent } - ); return sentTx.hash; } diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index fbcf3486a4..712cdae3ef 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -10,7 +10,7 @@ import type { TxSender } from "utils/tx-sender"; const txSender: TxSender = { async send(..._) { - return [0, "0xabc"]; + return "0xabc"; }, async sendAndReplace(..._) { return "0xabc"; diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 8021e9ec02..ff860bf50b 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -10,6 +10,7 @@ import type { import { ArtifactContract, CallableFuture, + EventFuture, HardhatContract, ProxyFuture, Virtual, @@ -491,7 +492,7 @@ describe("deployment builder - useModule", () => { describe("returning non contract/library futures from within a module", () => { let returnsWrongFutureTypeModule: Module<{ - token: CallableFuture | Virtual | ProxyFuture; + token: CallableFuture | Virtual | ProxyFuture | EventFuture; }>; before(() => { diff --git a/packages/core/test/batch/visitInBatches.ts b/packages/core/test/execution/batching.ts similarity index 80% rename from packages/core/test/batch/visitInBatches.ts rename to packages/core/test/execution/batching.ts index 8a5fef2cc7..deb34034b4 100644 --- a/packages/core/test/batch/visitInBatches.ts +++ b/packages/core/test/execution/batching.ts @@ -1,15 +1,17 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { BigNumber } from "ethers"; import { Deployment } from "deployment/Deployment"; import { ExecutionGraph } from "execution/ExecutionGraph"; -import { visitInBatches } from "execution/batch/visitInBatches"; +import { executeInBatches } from "execution/execute"; import { ContractDeploy, ExecutionVertex } from "types/executionGraph"; import { VertexVisitResult } from "types/graph"; +import { ICommandJournal } from "types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; -describe("Execution - visitInBatches", () => { +describe("Execution - batching", () => { it("should run", async () => { const vertex0: ExecutionVertex = createFakeContractDeployVertex(0, "first"); const vertex1: ExecutionVertex = createFakeContractDeployVertex( @@ -30,20 +32,26 @@ describe("Execution - visitInBatches", () => { executionGraph.vertexes.set(2, vertex2); const mockServices = {} as any; + const mockJournal: ICommandJournal = { + record: async () => {}, + read: () => null, + }; const mockUpdateUiAction = () => {}; const deployment = new Deployment( "MyModule", mockServices, + mockJournal, mockUpdateUiAction ); - const result = await visitInBatches( + const result = await executeInBatches( deployment, executionGraph, async (): Promise => { return { _kind: "success", result: true }; - } + }, + {} as any ); assert.isDefined(result); @@ -62,5 +70,6 @@ function createFakeContractDeployVertex( artifact: {} as any, args: [], libraries: {}, + value: BigNumber.from(0), }; } diff --git a/packages/core/test/execution.ts b/packages/core/test/execution/dispatch.ts similarity index 66% rename from packages/core/test/execution.ts rename to packages/core/test/execution/dispatch.ts index 800a621a85..062c2201e0 100644 --- a/packages/core/test/execution.ts +++ b/packages/core/test/execution/dispatch.ts @@ -9,13 +9,14 @@ import { execute } from "execution/execute"; import { Services, TransactionOptions } from "services/types"; import { ExecutionVertex } from "types/executionGraph"; import { Artifact } from "types/hardhat"; +import { ICommandJournal } from "types/journal"; -import { buildAdjacencyListFrom } from "./graph/helpers"; -import { getMockServices } from "./helpers"; +import { buildAdjacencyListFrom } from "../graph/helpers"; +import { getMockServices } from "../helpers"; const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -describe("Execution", () => { +describe("Execution - dispatch", () => { afterEach(() => { sinon.restore(); }); @@ -60,13 +61,14 @@ describe("Execution", () => { } as any, }; - const response = await assertExecuteSingleVertex( + const response = await runExecuteOnSingleVertex( contractDeploy, mockServices ); assert.isDefined(response); - if (response._kind === "failure") { + + if (response._kind !== "success") { return assert.fail("deploy failed"); } @@ -120,13 +122,13 @@ describe("Execution", () => { } as any, }; - const response = await assertExecuteSingleVertex( + const response = await runExecuteOnSingleVertex( contractDeploy, mockServices ); assert.isDefined(response); - if (response._kind === "failure") { + if (response._kind !== "success") { return assert.fail("deploy failed"); } @@ -221,13 +223,13 @@ describe("Execution", () => { } as any, }; - const response = await assertDependentVertex( + const response = await runExecuteOnDependentVertex( [contractDeploy, contractCall], mockServices ); assert.isDefined(response); - if (response._kind === "failure") { + if (response._kind !== "success") { return assert.fail("deploy failed"); } @@ -239,204 +241,154 @@ describe("Execution", () => { }); }); - it("should execute an ETH send", async () => { - const fakeArtifact: Artifact = { - contractName: "Foo", - abi: [ - { - stateMutability: "payable", - type: "receive", - }, - ], - bytecode: - "6080604052348015600f57600080fd5b50604580601d6000396000f3fe608060405236600a57005b600080fdfea2646970667358221220da7e5683d44d4d83925bddf4a1eb18237892d4fe13551888fef8b0925eb9023664736f6c63430008070033", - linkReferences: {}, - }; - - const contractDeploy: ExecutionVertex = { - type: "ContractDeploy", - id: 0, - label: "Foo", - artifact: fakeArtifact, - args: [], - libraries: {}, - value: ethers.utils.parseUnits("0"), - }; - - const sendETH: ExecutionVertex = { - type: "SentETH", - id: 1, - label: "Foo", - address: { - vertexId: 0, - type: "contract", - subtype: "artifact", + describe("await event", () => { + let contractDeploy: ExecutionVertex; + let contractCall: ExecutionVertex; + let awaitedEvent: ExecutionVertex; + let mockServices: Services; + + beforeEach(() => { + const fakeArtifact = { + contractName: "Test", + abi: [ + { + type: "event", + name: "SomeEvent", + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "sender", + type: "address", + }, + ], + }, + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + bytecode: + "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", + linkReferences: {}, + }; + + contractDeploy = { + type: "ContractDeploy", + id: 0, + label: "Test", artifact: fakeArtifact, - label: "Foo", - _future: true, - }, - value: ethers.utils.parseUnits("42"), - }; - - const sendTxStub = sinon.stub(); - sendTxStub.onCall(0).resolves("0x1"); - sendTxStub.onCall(1).resolves("0x2"); - - const mockServices: Services = { - ...getMockServices(), - contracts: { - sendTx: sendTxStub, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash === "0x1") { - return { - contractAddress: "0x0000000000000000000000000000000000000001", - }; - } - - return { - contractAddress: "0x0000000000000000000000000000000000000002", - }; - }, - } as any, - }; - - const response = await assertDependentVertex( - [contractDeploy, sendETH], - mockServices - ); - - assert.isDefined(response); - if (response._kind === "failure") { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(1), { - _kind: "success", - result: { - hash: "0x2", - }, - }); - }); - - it("should execute an awaited event", async () => { - const fakeArtifact = { - contractName: "Test", - abi: [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - ], - name: "SomeEvent", - type: "event", + args: [], + libraries: {}, + value: ethers.utils.parseUnits("0"), + }; + + contractCall = { + type: "ContractCall", + id: 1, + label: "Test/test", + contract: { + vertexId: 0, + type: "contract", + label: "Test", + _future: true, }, - { - inputs: [], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", + method: "test", + args: [], + value: ethers.utils.parseUnits("0"), + }; + + awaitedEvent = { + type: "AwaitedEvent", + id: 2, + abi: fakeArtifact.abi, + address: { + vertexId: 0, + type: "contract", + subtype: "artifact", + artifact: fakeArtifact, + label: "Test", + _future: true, }, - ], - bytecode: - "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", - linkReferences: {}, - }; - - const contractDeploy: ExecutionVertex = { - type: "ContractDeploy", - id: 0, - label: "Test", - artifact: fakeArtifact, - args: [], - libraries: {}, - value: ethers.utils.parseUnits("0"), - }; - - const contractCall: ExecutionVertex = { - type: "ContractCall", - id: 1, - label: "Test/test", - contract: { vertexId: 0, type: "contract", label: "Test", _future: true }, - method: "test", - args: [], - value: ethers.utils.parseUnits("0"), - }; - - const awaitedEvent: ExecutionVertex = { - type: "AwaitedEvent", - id: 2, - abi: fakeArtifact.abi, - address: { - vertexId: 0, - type: "contract", - subtype: "artifact", - artifact: fakeArtifact, - label: "Test", - _future: true, - }, - label: "Test/SomeEvent", - event: "SomeEvent", - args: [ACCOUNT_0], - }; - - const iface = new ethers.utils.Interface(fakeArtifact.abi); + label: "Test/SomeEvent", + event: "SomeEvent", + args: [ACCOUNT_0], + }; + + const iface = new ethers.utils.Interface(fakeArtifact.abi); + + const fakeLog = iface.encodeEventLog( + ethers.utils.EventFragment.from(fakeArtifact.abi[0]), + ["0x0000000000000000000000000000000000000003"] + ); + + const sendTxStub = sinon.stub(); + sendTxStub.onCall(0).resolves("0x1"); + sendTxStub.onCall(1).resolves("0x2"); + + const waitForEventStub = sinon.stub(); + waitForEventStub.onFirstCall().resolves(fakeLog); + + mockServices = { + ...getMockServices(), + contracts: { + sendTx: sendTxStub, + } as any, + transactions: { + wait: (txHash: string) => { + if (txHash === "0x1") { + return { + contractAddress: "0x0000000000000000000000000000000000000001", + }; + } - const fakeLog = iface.encodeEventLog( - ethers.utils.EventFragment.from(fakeArtifact.abi[0]), - ["0x0000000000000000000000000000000000000003"] - ); - - const sendTxStub = sinon.stub(); - sendTxStub.onCall(0).resolves("0x1"); - sendTxStub.onCall(1).resolves("0x2"); - - const waitForEventStub = sinon.stub(); - waitForEventStub.onFirstCall().resolves(fakeLog); - - const mockServices: Services = { - ...getMockServices(), - contracts: { - sendTx: sendTxStub, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash === "0x1") { return { - contractAddress: "0x0000000000000000000000000000000000000001", + contractAddress: "0x0000000000000000000000000000000000000002", }; - } + }, + waitForEvent: waitForEventStub, + } as any, + }; + }); - return { - contractAddress: "0x0000000000000000000000000000000000000002", - }; - }, - waitForEvent: waitForEventStub, - } as any, - }; + it("should return the result of an awaited event that completes within the timeout", async () => { + const response = await runExecuteOnDependentVertex( + [contractDeploy, contractCall, awaitedEvent], + mockServices + ); - const response = await assertDependentVertex( - [contractDeploy, contractCall, awaitedEvent], - mockServices - ); + if (response._kind !== "success") { + return assert.fail("deploy failed"); + } - assert.isDefined(response); - if (response._kind === "failure") { - return assert.fail("deploy failed"); - } + assert.deepStrictEqual(response.result.get(2), { + _kind: "success", + result: { + topics: ["0x0000000000000000000000000000000000000003"], + }, + }); + }); - assert.deepStrictEqual(response.result.get(2), { - _kind: "success", - result: { - topics: ["0x0000000000000000000000000000000000000003"], - }, + it("should return as on hold if an awaited event is not detected within the timeout", async () => { + const response = await runExecuteOnDependentVertex( + [contractDeploy, awaitedEvent], + { + ...mockServices, + transactions: { + ...mockServices.transactions, + waitForEvent: sinon.stub().resolves(null), + }, + } + ); + + assert( + response._kind === "hold", + `response should be hold, not: ${response._kind}` + ); }); }); @@ -452,19 +404,19 @@ describe("Execution", () => { const mockServices: Services = { ...getMockServices(), contracts: { - deploy: async (): Promise => { + deploy: async (): Promise => { assert.fail("deploy should not be called"); }, } as any, }; - const response = await assertExecuteSingleVertex( + const response = await runExecuteOnSingleVertex( contractDeploy, mockServices ); assert.isDefined(response); - if (response._kind === "failure") { + if (response._kind !== "success") { return assert.fail("deploy failed"); } @@ -479,7 +431,7 @@ describe("Execution", () => { }); }); -async function assertExecuteSingleVertex( +async function runExecuteOnSingleVertex( executionVertex: ExecutionVertex, mockServices: Services ) { @@ -490,10 +442,15 @@ async function assertExecuteSingleVertex( executionGraph.vertexes.set(0, executionVertex); const mockUpdateUiAction = () => {}; + const mockJournal: ICommandJournal = { + record: async () => {}, + read: () => null, + }; const deployment = new Deployment( "MyModule", mockServices, + mockJournal, mockUpdateUiAction ); @@ -502,7 +459,7 @@ async function assertExecuteSingleVertex( return execute(deployment, {} as any); } -async function assertDependentVertex( +async function runExecuteOnDependentVertex( vertexes: ExecutionVertex[], mockServices: Services ) { @@ -520,10 +477,15 @@ async function assertDependentVertex( }); const mockUpdateUiAction = () => {}; + const mockJournal: ICommandJournal = { + record: async () => {}, + read: () => null, + }; const deployment = new Deployment( "MyModule", mockServices, + mockJournal, mockUpdateUiAction ); diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts new file mode 100644 index 0000000000..06600e6179 --- /dev/null +++ b/packages/core/test/execution/rerun.ts @@ -0,0 +1,358 @@ +/* eslint-disable import/no-unused-modules */ + +import { assert } from "chai"; +import { ethers } from "ethers"; + +import { buildModule } from "dsl/buildModule"; +import { Artifact } from "types/hardhat"; + +import { Ignition } from "../../src/Ignition"; +import { getMockServices } from "../helpers"; +import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; + +describe("Reruning execution", () => { + const tokenArtifact: Artifact = { + contractName: "Token", + abi: [ + { + name: "ConfigComplete", + type: "event", + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "name", + type: "address", + }, + ], + }, + { + inputs: [ + { + internalType: "uint256", + name: "supply", + type: "uint256", + }, + ], + name: "configure", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + bytecode: "0x0000000001", + linkReferences: {}, + }; + + describe("when a deploment is already complete", () => { + let sentTransactionCount: number; + let ignition: Ignition; + let myModule: any; + + beforeEach(() => { + sentTransactionCount = 0; + + myModule = buildModule("MyModule", (m) => { + const token = m.contract("Token"); + + m.call(token, "configure", { args: [100] }); + + return { token }; + }); + + ignition = new Ignition({ + services: { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => tokenArtifact, + }, + transactions: { + wait: (tx) => { + sentTransactionCount++; + + if (tx === "0x00001") { + return { + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }; + } + + if (tx === "0x00002") { + return {}; + } + + throw new Error(`Unexpected transaction sent: ${tx}`); + }, + }, + } as any, + journal: new MemoryCommandJournal(), + }); + }); + + it("should record complete on first run", async () => { + // Act + const [result] = await ignition.deploy(myModule, {} as any); + + // Assert + assert.equal(result._kind, "success"); + + // two transactions have been sent + assert.equal(sentTransactionCount, 2, "precondition before rerun"); + }); + + it("should not rerun any on-chain transactions on second run", async () => { + // Arrange + await ignition.deploy(myModule, {} as any); + + // Act + const [redeployResult] = await ignition.deploy(myModule, {} as any); + + // Assert + assert.equal(redeployResult._kind, "success"); + + // only two on-chain transactions happen, none from the rerun + assert.equal( + sentTransactionCount, + 2, + "postcondition on-chain transactions" + ); + + assert.equal(redeployResult._kind, "success"); + if (redeployResult._kind !== "success") { + return assert.fail("Not a successful deploy"); + } + + if (redeployResult.result.token._kind !== "contract") { + return assert.fail("Unable to retrieve the token contract result"); + } + + assert.equal( + redeployResult.result.token.value.address, + "0x1F98431c8aD98523631AE4a59f267346ea31F984" + ); + }); + }); + + describe("when a deployment is on hold", () => { + let sentTransactionCount: number; + let eventQueryCount: number; + let ignition: Ignition; + let myModule: any; + + beforeEach(() => { + sentTransactionCount = 0; + eventQueryCount = 0; + + myModule = buildModule("MyModule", (m) => { + const token = m.contract("Token", tokenArtifact); + + const configureCall = m.call(token, "configure", { args: [100] }); + + m.awaitEvent(token as any, "ConfigComplete", { + after: [configureCall], + args: [], + }); + + return { token }; + }); + + const iface = new ethers.utils.Interface(tokenArtifact.abi); + + const fakeLog = iface.encodeEventLog( + ethers.utils.EventFragment.from(tokenArtifact.abi[0]), + ["0x0000000000000000000000000000000000000003"] + ); + + ignition = new Ignition({ + services: { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => tokenArtifact, + }, + transactions: { + wait: (tx) => { + sentTransactionCount++; + + if (tx === "0x00001") { + return { + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }; + } + + if (tx === "0x00002") { + return {}; + } + + throw new Error(`Unexpected transaction sent: ${tx}`); + }, + waitForEvent: async () => { + eventQueryCount++; + + if (eventQueryCount === 1) { + return null; + } else if (eventQueryCount === 2) { + return fakeLog; + } else { + throw new Error("Unexpected query call"); + } + }, + }, + } as any, + journal: new MemoryCommandJournal(), + }); + }); + + it("should record hold on first run", async () => { + // Act + const [result] = await ignition.deploy(myModule, {} as any); + + // Assert + assert.equal(result._kind, "hold"); + + // two calls sent + assert.equal( + sentTransactionCount, + 2, + "Wrong number of on-chain transactions" + ); + + // one event waited for + assert.equal(eventQueryCount, 1, "Wrong number of on-chain queries"); + }); + + it("should rerun the await event on a rerun", async () => { + // arrange + await ignition.deploy(myModule, {} as any); + + // Act + const [redeployResult] = await ignition.deploy(myModule, {} as any); + + // Assert + // only the original two transactions, no more + assert.equal(sentTransactionCount, 2, "postconditition after rerun"); + + // additional query call on second run + assert.equal(eventQueryCount, 2, "Wrong number of on-chain queries"); + + if (redeployResult._kind !== "success") { + return assert.fail("Not a successful deploy"); + } + + if (redeployResult.result.token._kind !== "contract") { + return assert.fail("Unable to retrieve the token contract result"); + } + + assert.equal( + redeployResult.result.token.value.address, + "0x1F98431c8aD98523631AE4a59f267346ea31F984" + ); + }); + }); + + describe("when a deployment fails", () => { + let sentTransactionCount; + let ignition: Ignition; + let myModule: any; + + beforeEach(() => { + sentTransactionCount = 0; + let configureCallErroredBefore = false; + + myModule = buildModule("MyModule", (m) => { + const token = m.contract("Token"); + + m.call(token, "configure", { args: [100] }); + + return { token }; + }); + + ignition = new Ignition({ + services: { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => tokenArtifact, + }, + contracts: { + transactionCount: 0, + async sendTx(): Promise { + this.transactionCount++; + + if (this.transactionCount === 2) { + if (!configureCallErroredBefore) { + configureCallErroredBefore = true; + throw new Error("Revert: All the apes have gone!"); + } else { + return `0x0000${this.contractCount}`; + } + } + + return `0x0000${this.contractCount}`; + }, + }, + transactions: { + wait: () => { + sentTransactionCount++; + + return { + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }; + }, + }, + } as any, + journal: new MemoryCommandJournal(), + }); + }); + + it("should record fail on first run", async () => { + // Act + const [result] = await ignition.deploy(myModule, {} as any); + + // Assert + assert.equal(result._kind, "failure"); + + // two calls sent + assert.equal( + sentTransactionCount, + 1, + "Wrong number of on-chain transactions" + ); + + assert.deepStrictEqual(result, { + _kind: "failure", + failures: [ + "execution failed", + [new Error("Revert: All the apes have gone!")], + ], + }); + }); + + it("should recall the failed transaction on a rerun", async () => { + // Arrange + await ignition.deploy(myModule, {} as any); + + // Act + const [redeployResult] = await ignition.deploy(myModule, {} as any); + + // Assert + // the second transaction is successfully sent + assert.equal(sentTransactionCount, 2, "postconditition after rerun"); + + assert.equal(redeployResult._kind, "success"); + if (redeployResult._kind !== "success") { + return assert.fail("Not a successful deploy"); + } + + if (redeployResult.result.token._kind !== "contract") { + return assert.fail("Unable to retrieve the token contract result"); + } + + assert.equal( + redeployResult.result.token.value.address, + "0x1F98431c8aD98523631AE4a59f267346ea31F984" + ); + }); + }); +}); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 04ed8632bf..defe5599c7 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -3,6 +3,7 @@ import { ethers } from "ethers"; import { IArtifactsService } from "services/ArtifactsService"; import { IConfigService } from "services/ConfigService"; import { IContractsService } from "services/ContractsService"; +import { INetworkService } from "services/NetworkService"; import { ITransactionsService } from "services/TransactionsService"; import { Services, TransactionOptions } from "services/types"; import { Artifact } from "types/hardhat"; @@ -10,6 +11,7 @@ import { HasParamResult } from "types/providers"; export function getMockServices() { const mockServices: Services = { + network: new MockNetworkService(), contracts: new MockContractsService(), artifacts: new MockArtifactsService(), transactions: new MockTransactionService(), @@ -19,21 +21,35 @@ export function getMockServices() { return mockServices; } +class MockNetworkService implements INetworkService { + public async getChainId(): Promise { + return 31337; + } +} + class MockContractsService implements IContractsService { - public sendTx( + private contractCount: number; + + constructor() { + this.contractCount = 0; + } + + public async sendTx( _deployTransaction: ethers.providers.TransactionRequest, _txOptions?: TransactionOptions | undefined ): Promise { - throw new Error("Method not implemented."); + this.contractCount++; + + return `0x0000${this.contractCount}`; } } class MockArtifactsService implements IArtifactsService { - public getArtifact(_name: string): Promise { - throw new Error("Method not implemented."); + public async hasArtifact(_name: string): Promise { + return true; } - public hasArtifact(_name: string): Promise { + public getArtifact(_name: string): Promise { throw new Error("Method not implemented."); } } @@ -42,6 +58,13 @@ class MockTransactionService implements ITransactionsService { public wait(_txHash: string): Promise { return {} as any; } + + public waitForEvent( + _filter: ethers.EventFilter, + _durationMs: number + ): Promise { + throw new Error("Method not implemented."); + } } class MockConfigService implements IConfigService { diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts new file mode 100644 index 0000000000..db60c109fe --- /dev/null +++ b/packages/core/test/state-reducer/execution.ts @@ -0,0 +1,343 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { + deployStateReducer, + initializeDeployState, +} from "deployment/deployStateReducer"; +import { buildModule } from "dsl/buildModule"; +import { DeployState } from "types/deployment"; + +import { applyActions, resolveExecutionGraphFor } from "./utils"; + +describe("deployment state reducer", () => { + let state: DeployState; + + beforeEach(async () => { + const initialState = initializeDeployState("ExecutionExample"); + + const exampleExecutionGraph = await resolveExecutionGraphFor( + buildModule("TokenModule", (m) => { + const token = m.contract("Token"); + + const dex = m.contract("Dex", { after: [token] }); + const registrar = m.contract("Registrar", { after: [token] }); + + const aggregator = m.contract("Aggregator", { + after: [registrar], + }); + + return { token, dex, registrar, aggregator }; + }) + ); + + state = applyActions(initialState, [ + { + type: "SET_CHAIN_ID", + chainId: 31337, + }, + { + type: "SET_NETWORK_NAME", + networkName: "Hardhat", + }, + { + type: "START_VALIDATION", + }, + { + type: "TRANSFORM_COMPLETE", + executionGraph: exampleExecutionGraph, + }, + ]); + }); + + describe("starting execution", () => { + beforeEach(() => { + state = deployStateReducer(state, { + type: "EXECUTION::START", + }); + }); + + it("should update the phase to execution", () => { + assert.equal(state.phase, "execution"); + }); + + it("should set the vertexes to unstarted", () => { + assert.deepStrictEqual(state.execution.vertexes, { + "0": { + status: "UNSTARTED", + result: null, + }, + "1": { + status: "UNSTARTED", + result: null, + }, + "2": { + status: "UNSTARTED", + result: null, + }, + "3": { + status: "UNSTARTED", + result: null, + }, + }); + }); + }); + + describe("setting new batch", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + ]); + }); + + it("should move the Token vertex from uninitialized to batch", () => { + assert.equal(state.execution.vertexes[0].status, "RUNNING"); + assert.deepStrictEqual(state.execution.batch, new Set([0])); + }); + }); + + describe("updating batch", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + ]); + }); + + it("should update the batch result", () => { + assert.equal(state.execution.batch, null); + + assert.deepStrictEqual(state.execution.vertexes[0], { + status: "COMPLETED", + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }); + }); + }); + + describe("completing batch", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + ]); + }); + + it("should complete the batch", () => { + assert.equal(state.execution.batch, null); + assert.deepStrictEqual(state.execution.vertexes[0], { + status: "COMPLETED", + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }); + }); + }); + + describe("completing deployment", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [1, 2], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 1, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 2, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [3], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 3, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + ]); + }); + + it("should be in the complete phase", () => { + assert.equal(state.phase, "complete"); + }); + + it("should show the vertexes as complete", () => { + assert.equal(state.execution.batch, null); + + assert.equal( + Object.values(state.execution.vertexes).every( + (v) => v.status === "COMPLETED" && Boolean(v.result) + ), + true + ); + }); + }); + + describe("stopping on an on hold state", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [1], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 1, + result: { + _kind: "hold", + }, + }, + ]); + }); + + it("should be in the complete phase", () => { + assert.equal(state.phase, "hold"); + }); + + it("should show the vertexes as complete", () => { + assert.equal(state.execution.batch, null); + + assert.deepStrictEqual(state.execution.vertexes[1], { + status: "HOLD", + result: null, + }); + }); + }); + + describe("stopping on an failed state", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "EXECUTION::START", + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [0], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { someValue: "example" }, + }, + }, + + { + type: "EXECUTION::SET_BATCH", + batch: [1], + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 1, + result: { + _kind: "failure", + failure: new Error("No connection"), + }, + }, + ]); + }); + + it("should be in the complete phase", () => { + assert.equal(state.phase, "failed"); + }); + + it("should show the vertexes as complete", () => { + assert.equal(state.execution.batch, null); + + assert.deepStrictEqual(state.execution.vertexes[1], { + status: "FAILED", + result: { + _kind: "failure", + failure: new Error("No connection"), + }, + }); + }); + }); +}); diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts new file mode 100644 index 0000000000..d3fd1007b6 --- /dev/null +++ b/packages/core/test/state-reducer/preparation-steps.ts @@ -0,0 +1,121 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { + deployStateReducer, + initializeDeployState, +} from "deployment/deployStateReducer"; +import { buildModule } from "dsl/buildModule"; +import { DeployState } from "types/deployment"; + +import { applyActions, resolveExecutionGraphFor } from "./utils"; + +describe("deployment state reducer", () => { + let state: DeployState; + beforeEach(() => { + state = initializeDeployState("Example"); + }); + + describe("initialization", () => { + it("sets the module name", () => { + assert.equal(state.details.moduleName, "Example"); + }); + }); + + describe("setup", () => { + it("supports setting the chainId", () => { + const updated = deployStateReducer(state, { + type: "SET_CHAIN_ID", + chainId: 31337, + }); + + assert.equal(updated.details.chainId, 31337); + }); + + it("supports setting the network name", () => { + const updated = deployStateReducer(state, { + type: "SET_NETWORK_NAME", + networkName: "Hardhat", + }); + + assert.equal(updated.details.networkName, "Hardhat"); + }); + }); + + describe("validation", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "SET_CHAIN_ID", + chainId: 31337, + }, + { + type: "SET_NETWORK_NAME", + networkName: "Hardhat", + }, + { + type: "START_VALIDATION", + }, + ]); + }); + + describe("starting", () => { + it("should update the phase", () => { + assert.equal(state.phase, "validating"); + }); + }); + + describe("failure", () => { + beforeEach(() => { + state = deployStateReducer(state, { + type: "VALIDATION_FAIL", + errors: [new Error("Bad input")], + }); + }); + + it("should update the phase", () => { + assert.equal(state.phase, "validation-failed"); + }); + + it("should set errors against the validation phase", () => { + assert.equal(state.validation.errors.length, 1); + assert.equal(state.validation.errors[0].message, "Bad input"); + }); + }); + }); + + describe("transform", () => { + beforeEach(async () => { + const exampleExecutionGraph = await resolveExecutionGraphFor( + buildModule("TokenModule", (m) => { + const token = m.contract("Token"); + + return { token }; + }) + ); + + state = applyActions(state, [ + { + type: "SET_CHAIN_ID", + chainId: 31337, + }, + { + type: "SET_NETWORK_NAME", + networkName: "Hardhat", + }, + { + type: "START_VALIDATION", + }, + { + type: "TRANSFORM_COMPLETE", + executionGraph: exampleExecutionGraph, + }, + ]); + }); + + it("should set the execution graph", () => { + assert.isDefined(state.transform.executionGraph); + assert.equal(state.transform.executionGraph.vertexes.size, 1); + }); + }); +}); diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts new file mode 100644 index 0000000000..1741ad4383 --- /dev/null +++ b/packages/core/test/state-reducer/utils.ts @@ -0,0 +1,58 @@ +import { deployStateReducer } from "deployment/deployStateReducer"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; +import { DeployState, DeployStateCommand } from "types/deployment"; +import { Module } from "types/module"; +import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; + +import { getMockServices } from "../helpers"; + +export function applyActions( + state: DeployState, + actions: DeployStateCommand[] +) { + return actions.reduce(deployStateReducer, state); +} + +export async function resolveExecutionGraphFor(module: Module) { + const { graph: deploymentGraph } = generateDeploymentGraphFrom(module, { + chainId: 31337, + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: (name: string) => ({ + _format: "hh-sol-artifact-1", + contractName: name, + sourceName: `contracts/${name}.sol`, + abi: [], + bytecode: "0x0", + deployedBytecode: "0x0", + linkReferences: {}, + deployedLinkReferences: {}, + }), + }, + } as any; + + const { _kind: validationKind } = await validateDeploymentGraph( + deploymentGraph, + mockServices + ); + + if (validationKind === "failure") { + throw new Error("Cannot resolve graph, failed validation"); + } + + const transformResult = await transformDeploymentGraphToExecutionGraph( + deploymentGraph, + mockServices + ); + + if (transformResult._kind === "failure") { + throw new Error("Cannot resolve graph, failed transform"); + } + + return transformResult.executionGraph; +} diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index 7875dc10b2..59824d7aa1 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -2,11 +2,7 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import tmp from "tmp"; -import { FileJournal } from "journal/FileJournal"; -import { InMemoryJournal } from "journal/InMemoryJournal"; -import { Journal } from "journal/types"; import { GasProvider, IgnitionSigner } from "types/providers"; import { TxSender } from "utils/tx-sender"; @@ -42,70 +38,25 @@ function createMockTx() { return {} as ethers.providers.TransactionRequest; } -function runTests(createJournal: () => Journal) { +function runTests() { const mockGasProvider = new MockGasProvider(); it("should add two transactions to journal", async function () { - const txSender = new TxSender( - "MyModule", - "MyExecutor", - mockGasProvider, - createJournal() - ); + const txSender = new TxSender(mockGasProvider); const signerStub = createSignerSpy(); const mockTx1 = createMockTx(); - const [txIndex1, hash1] = await txSender.send(signerStub, mockTx1, 0); - assert.equal(txIndex1, 0); + const hash1 = await txSender.send(signerStub, mockTx1); assert.equal(hash1, "hash-0"); assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); const mockTx2 = createMockTx(); - const [txIndex2, hash2] = await txSender.send(signerStub, mockTx2, 0); - assert.equal(txIndex2, 1); + const hash2 = await txSender.send(signerStub, mockTx2); assert.equal(hash2, "hash-1"); assert.isTrue(signerStub.sendTransaction.calledWith(mockTx2)); }); - - it("should not re-send an already sent transaction", async function () { - const journal = createJournal(); - const txSender = new TxSender( - "MyModule", - "MyExecutor", - mockGasProvider, - journal - ); - - const signerStub = createSignerSpy(); - const mockTx1 = createMockTx(); - const [txIndex1, hash1] = await txSender.send(signerStub, mockTx1, 0); - assert.equal(txIndex1, 0); - assert.equal(hash1, "hash-0"); - assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); - signerStub.sendTransaction.resetHistory(); - - const txSender2 = new TxSender( - "MyModule", - "MyExecutor", - mockGasProvider, - journal - ); - const [txIndex2, hash2] = await txSender2.send(signerStub, mockTx1, 0); - assert.equal(txIndex2, 0); - assert.equal(hash2, "hash-0"); - assert.isFalse(signerStub.sendTransaction.called); - }); } describe("TxSender", function () { - describe("in-memory journal", function () { - runTests(() => new InMemoryJournal()); - }); - - describe("file journal", function () { - runTests(() => { - const pathToJournal = tmp.tmpNameSync(); - return new FileJournal(pathToJournal); - }); - }); + runTests(); }); diff --git a/packages/core/test/util/MemoryCommandJournal.ts b/packages/core/test/util/MemoryCommandJournal.ts new file mode 100644 index 0000000000..867ea93c89 --- /dev/null +++ b/packages/core/test/util/MemoryCommandJournal.ts @@ -0,0 +1,30 @@ +import { DeployStateExecutionCommand } from "types/deployment"; +import { ICommandJournal } from "types/journal"; + +export class MemoryCommandJournal implements ICommandJournal { + private entries: string[]; + + constructor() { + this.entries = []; + } + + public async record(command: DeployStateExecutionCommand): Promise { + this.entries.push(JSON.stringify(command)); + } + + public async *read(): AsyncGenerator< + DeployStateExecutionCommand, + void, + unknown + > { + for (const entry of this.entries) { + const command: DeployStateExecutionCommand = JSON.parse(entry); + + yield command; + } + } + + public clear() { + this.entries = []; + } +} diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index ea849adcc8..15215bfe56 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -29,6 +29,7 @@ "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test", "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:build": "tsc --project ./test/", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { @@ -43,6 +44,7 @@ "@types/lodash": "4.14.189", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", + "@types/ndjson": "2.0.1", "@types/node": "12.20.25", "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "4.31.2", @@ -77,6 +79,8 @@ "fs-extra": "^10.0.0", "ink": "3.2.0", "ink-spinner": "4.0.3", - "react": "18.2.0" + "ndjson": "2.0.0", + "react": "18.2.0", + "serialize-error": "8.1.0" } } diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts new file mode 100644 index 0000000000..ad89efc5fe --- /dev/null +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -0,0 +1,90 @@ +import { + DeployStateExecutionCommand, + ICommandJournal, +} from "@ignored/ignition-core"; +import { BigNumber } from "ethers"; +import fs from "fs"; +import ndjson from "ndjson"; +import { serializeError, deserializeError } from "serialize-error"; + +export class CommandJournal implements ICommandJournal { + constructor(private _path: string) {} + + public async record(command: DeployStateExecutionCommand) { + return fs.promises.appendFile( + this._path, + `${JSON.stringify(command, this._serializeReplacer.bind(this))}\n` + ); + } + + public read(): AsyncGenerator { + return this._readFromNdjsonFile(this._path); + } + + private async *_readFromNdjsonFile(ndjsonFilePath: string) { + if (!fs.existsSync(ndjsonFilePath)) { + return; + } + + const stream = fs.createReadStream(ndjsonFilePath).pipe(ndjson.parse()); + + for await (const chunk of stream) { + // TODO: we need to pull out ndjson, and come up with a different + // line level deserializer to avoid this serialize/deserialize step + const json = JSON.stringify(chunk); + const deserializedChunk = JSON.parse( + json, + this._deserializeReplace.bind(this) + ); + + yield deserializedChunk as DeployStateExecutionCommand; + } + } + + private _serializeReplacer(_key: string, value: unknown) { + if (value instanceof Set) { + return Array.from(value); + } + + if (value instanceof Map) { + return Object.fromEntries(value); + } + + if (typeof value === "bigint") { + return `${value.toString(10)}n`; + } + + if (value instanceof Error) { + return serializeError(new Error(value.message)); + } + + return value; + } + + private _deserializeReplace(_key: string, value: unknown) { + if (typeof value === "string" && /^\d+n$/.test(value)) { + return BigInt(value.substr(0, value.length - 1)); + } + + if (this._isSerializedBigInt(value)) { + return BigNumber.from(value.hex); + } + + if (typeof value === "object" && value !== null && "message" in value) { + return deserializeError(value); + } + + return value; + } + + private _isSerializedBigInt( + value: unknown + ): value is { type: "BigNumber"; hex: string } { + return ( + typeof value === "object" && + value !== null && + "type" in value && + (value as { type: string }).type === "BigNumber" + ); + } +} diff --git a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts new file mode 100644 index 0000000000..9030115bb0 --- /dev/null +++ b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts @@ -0,0 +1,49 @@ +import { Providers } from "@ignored/ignition-core"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { ConfigWrapper } from "./ConfigWrapper"; + +export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { + const providers: Providers = { + artifacts: { + getArtifact: (name: string) => hre.artifacts.readArtifact(name), + hasArtifact: (name: string) => hre.artifacts.artifactExists(name), + }, + gasProvider: { + estimateGasLimit: async (tx: any) => { + const gasLimit = await hre.ethers.provider.estimateGas(tx); + + // return 1.5x estimated gas + return gasLimit.mul(15).div(10); + }, + estimateGasPrice: async () => { + return hre.ethers.provider.getGasPrice(); + }, + }, + ethereumProvider: hre.network.provider, + signers: { + getDefaultSigner: async () => { + const [signer] = await hre.ethers.getSigners(); + return signer; + }, + }, + transactions: { + isConfirmed: async (txHash: any) => { + const blockNumber = await hre.ethers.provider.getBlockNumber(); + const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); + if (receipt === null) { + return false; + } + + return receipt.blockNumber <= blockNumber; + }, + isMined: async (txHash: any) => { + const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); + return receipt !== null; + }, + }, + config: new ConfigWrapper(), + }; + + return providers; +} diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index afface6d19..c50c92c83a 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -5,10 +5,13 @@ import { Module, ModuleDict, ModuleParams, + createServices, + ICommandJournal, } from "@ignored/ignition-core"; import { Contract, ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { CommandJournal } from "./CommandJournal"; import { renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; @@ -18,37 +21,55 @@ interface DeployResult { } export class IgnitionWrapper { - private _ignition: Ignition; - constructor( private _providers: Providers, private _ethers: HardhatEthers, private _deployOptions: Omit - ) { - this._ignition = new Ignition(_providers, renderToCli); - } + ) {} public async deploy( ignitionModule: Module, deployParams?: { parameters?: ModuleParams; + journalPath?: string | undefined; ui?: boolean; + journal?: ICommandJournal; } ): Promise { const showUi = deployParams?.ui ?? false; + const ignition = new Ignition({ + services: createServices(this._providers), + uiRenderer: showUi + ? renderToCli(this._providers.config.parameters) + : undefined, + journal: deployParams?.journal + ? deployParams?.journal + : deployParams?.journalPath !== undefined + ? new CommandJournal(deployParams?.journalPath) + : undefined, + }); + if (deployParams?.parameters !== undefined) { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await this._ignition.deploy(ignitionModule, { - ...this._deployOptions, - ui: showUi, - }); + const [deploymentResult] = await ignition.deploy( + ignitionModule, + this._deployOptions + ); if (deploymentResult._kind === "hold") { - const [moduleId, holdReason] = deploymentResult.holds; - throw new Error(`Execution held for module '${moduleId}': ${holdReason}`); + const heldVertexes = deploymentResult.holds; + + let heldMessage = ""; + for (const vertex of heldVertexes) { + heldMessage += ` - ${vertex.label}\n`; + } + + throw new Error( + `Execution held for module '${ignitionModule.name}':\n\n${heldMessage}` + ); } if (deploymentResult._kind === "failure") { @@ -59,13 +80,9 @@ export class IgnitionWrapper { failuresMessage += ` - ${failure.message}\n`; } - if (showUi) { - return process.exit(1); - } else { - throw new Error( - `Execution failed for module '${moduleId}':\n\n${failuresMessage}` - ); - } + throw new Error( + `Execution failed for module '${moduleId}':\n\n${failuresMessage}` + ); } const resolvedOutput: { @@ -96,6 +113,10 @@ export class IgnitionWrapper { } public async plan(ignitionModule: Module) { - return this._ignition.plan(ignitionModule); + const ignition = new Ignition({ + services: createServices(this._providers), + }); + + return ignition.plan(ignitionModule); } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ab059d2a1d..1c3f1365f9 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,17 +1,12 @@ import "@nomiclabs/hardhat-ethers"; -import { - Module, - ModuleDict, - Providers, - ModuleParams, -} from "@ignored/ignition-core"; +import { Module, ModuleDict, ModuleParams } from "@ignored/ignition-core"; import { BigNumber } from "ethers"; import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; -import { ConfigWrapper } from "./ConfigWrapper"; +import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionWrapper } from "./ignition-wrapper"; import { Renderer } from "./plan"; import { loadUserModules, loadAllUserModules } from "./user-modules"; @@ -32,7 +27,7 @@ const DEPLOYMENTS_DIR = "deployments"; const MAX_RETRIES = 4; const GAS_INCREMENT_PER_RETRY = null; const POLLING_INTERVAL = 300; -const AWAIT_EVENT_DURATION = 30000; // ms +const AWAIT_EVENT_DURATION = 3000; // ms extendConfig((config, userConfig) => { /* setup path configs */ @@ -67,59 +62,15 @@ extendConfig((config, userConfig) => { * Add an `ignition` object to the HRE. */ extendEnvironment((hre) => { - const providers: Providers = { - artifacts: { - getArtifact: (name: string) => hre.artifacts.readArtifact(name), - hasArtifact: (name: string) => hre.artifacts.artifactExists(name), - }, - gasProvider: { - estimateGasLimit: async (tx: any) => { - const gasLimit = await hre.ethers.provider.estimateGas(tx); - - // return 1.5x estimated gas - return gasLimit.mul(15).div(10); - }, - estimateGasPrice: async () => { - return hre.ethers.provider.getGasPrice(); - }, - }, - ethereumProvider: hre.network.provider, - signers: { - getDefaultSigner: async () => { - const [signer] = await hre.ethers.getSigners(); - return signer; - }, - }, - transactions: { - isConfirmed: async (txHash: any) => { - const blockNumber = await hre.ethers.provider.getBlockNumber(); - const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); - if (receipt === null) { - return false; - } - - return receipt.blockNumber <= blockNumber; - }, - isMined: async (txHash: any) => { - const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); - return receipt !== null; - }, - }, - config: new ConfigWrapper(), - }; + const providers = buildIgnitionProvidersFrom(hre); hre.ignition = lazyObject(() => { const isHardhatNetwork = hre.network.name === "hardhat"; - const pathToJournal = isHardhatNetwork - ? undefined - : path.resolve(hre.config.paths.root, "ignition-journal.json"); - const txPollingInterval = isHardhatNetwork ? 100 : 5000; return new IgnitionWrapper(providers, hre.ethers, { ...hre.config.ignition, - pathToJournal, txPollingInterval, networkName: hre.network.name, }); @@ -171,7 +122,22 @@ task("deploy") parameters = resolveParametersString(parametersInput); } - await hre.ignition.deploy(userModule, { parameters, ui: true }); + const isHardhatNetwork = hre.network.name === "hardhat"; + const journalPath = isHardhatNetwork + ? undefined + : resolveJournalPath(userModule.name, hre.config.paths.ignition); + + try { + await hre.ignition.deploy(userModule, { + parameters, + journalPath, + ui: true, + }); + } catch { + // display of error or on hold is done + // based on state, thrown error can be ignored + process.exit(1); + } } ); @@ -251,6 +217,12 @@ function resolveConfigPath(filepath: string): ModuleParams { } } +function resolveJournalPath(moduleName: string, ignitionPath: string) { + const journalFile = `${moduleName}.journal.ndjson`; + + return path.join(ignitionPath, journalFile); +} + function resolveParametersString(paramString: string): ModuleParams { try { return JSON.parse(paramString); diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 5c5d2a41d2..a4c9bf54e7 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,3 +1,4 @@ +import { DeployState, viewExecutionResults } from "@ignored/ignition-core"; import { Box, Spacer, Text } from "ink"; import { AddressMap } from "ui/types"; @@ -5,12 +6,17 @@ import { AddressMap } from "ui/types"; import { NetworkInfo } from "./NetworkInfo"; export const AddressResults = ({ - addressMap, - networkInfo, + deployState, }: { - addressMap: AddressMap; - networkInfo: { chainId: number; networkName: string }; + deployState: DeployState; }) => { + const addressMap = resolveDeployAddresses(deployState); + + const networkInfo = { + chainId: deployState.details.chainId, + networkName: deployState.details.networkName, + }; + return ( @@ -27,3 +33,20 @@ export const AddressResults = ({ ); }; + +const resolveDeployAddresses = (deployState: DeployState) => { + const addressMap: AddressMap = {}; + + for (const value of viewExecutionResults(deployState).values()) { + if ( + value !== null && + value._kind === "success" && + "name" in value.result && + "address" in value.result + ) { + addressMap[value.result.name] = value.result.address; + } + } + + return addressMap; +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index d7c8bfbbf7..b4338de0ac 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -13,6 +13,10 @@ export const BatchExecution = ({ }) => { const batches = resolveBatchesFrom(deployState); + if (batches.length === 0) { + return null; + } + return ( <> @@ -78,7 +82,7 @@ const StatusBadge = ({ vertex }: { vertex: UiVertex }) => { badge = ; break; case "HELD": - badge = ; + badge = 🔶; break; case "RUNNING": badge = ; @@ -105,6 +109,10 @@ function resolveBatchBorderColor(vertexes: UiVertex[]) { return "red"; } + if (vertexes.some((v) => v.status === "HELD")) { + return "yellow"; + } + if (vertexes.every((v) => v.status === "COMPELETED")) { return "green"; } @@ -132,7 +140,7 @@ function resolveVertexColors(vertex: UiVertex): { }; case "HELD": return { - borderColor: "darkgray", + borderColor: "yellow", borderStyle: "bold", textColor: "white", }; @@ -149,7 +157,7 @@ function resolveVertexColors(vertex: UiVertex): { const resolveBatchesFrom = (deployState: DeployState): UiBatch[] => { const stateBatches = - deployState.execution.batch.size > 0 + deployState.execution.batch !== null ? [ ...deployState.execution.previousBatches, deployState.execution.batch.keys(), @@ -187,29 +195,19 @@ const determineStatusOf = ( ): UiVertexStatus => { const execution = deployState.execution; - if (execution.batch.has(vertexId)) { - const entry = execution.batch.get(vertexId); - - if (entry === null) { - return "RUNNING"; - } - - if (entry?._kind === "success") { - return "COMPELETED"; - } - - if (entry?._kind === "failure") { - return "ERRORED"; - } - - throw new Error(`Unable to determine current batch status ${entry}`); + if (execution.vertexes[vertexId]?.status === "RUNNING") { + return "RUNNING"; } - if (execution.errored.has(vertexId)) { + if (execution.vertexes[vertexId]?.status === "FAILED") { return "ERRORED"; } - if (execution.completed.has(vertexId)) { + if (execution.vertexes[vertexId]?.status === "HOLD") { + return "HELD"; + } + + if (execution.vertexes[vertexId]?.status === "COMPLETED") { return "COMPELETED"; } diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 0d2761d897..1b93b6852a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -4,6 +4,7 @@ import { Box } from "ink"; import { BatchExecution } from "./BatchExecution"; import { FinalStatus } from "./FinalStatus"; import { SummarySection } from "./SummarySection"; +import { viewEverthingExecutedAlready } from "./views"; export const ExecutionPanel = ({ deployState, @@ -12,6 +13,14 @@ export const ExecutionPanel = ({ deployState: DeployState; moduleParams?: ModuleParams; }) => { + if (viewEverthingExecutedAlready(deployState)) { + return ( + + + + ); + } + return ( diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index b79013dbed..a9c9de3d5d 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,33 +1,37 @@ -import { DeployState, ExecutionVertex } from "@ignored/ignition-core"; +import { + DeployState, + ExecutionVertex, + viewExecutionResults, +} from "@ignored/ignition-core"; import { Box, Text } from "ink"; -import { DeploymentError, AddressMap } from "ui/types"; +import { DeploymentError, DeploymentHold } from "ui/types"; import { AddressResults } from "./AddressResults"; import { Divider } from "./Divider"; +import { viewEverthingExecutedAlready } from "./views"; export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { if (deployState.phase === "complete") { - const addressMap: AddressMap = {}; + if (viewEverthingExecutedAlready(deployState)) { + return ( + + - for (const value of deployState.execution.resultsAccumulator.values()) { - if ( - value !== null && - value._kind === "success" && - "name" in value.result && - "address" in value.result - ) { - addressMap[value.result.name] = value.result.address; - } - } + + Nothing new to deploy, everything deployed on a previous run of{" "} + {deployState.details.moduleName} + - const networkInfo = { - chainId: deployState.details.chainId, - networkName: deployState.details.networkName, - }; + + + + + ); + } return ( - + @@ -36,12 +40,38 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { - + ); } + if (deployState.phase === "hold") { + const deploymentHolds: DeploymentHold[] = getDeploymentHolds(deployState); + + return ( + + + + + + 🟡 {deployState.details.moduleName}{" "} + deployment{" "} + + on hold + + + + + + {deploymentHolds.map((dh) => ( + + ))} + + + ); + } + if (deployState.phase === "failed") { const deploymentErrors: DeploymentError[] = getDeploymentErrors(deployState); @@ -73,14 +103,19 @@ export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { }; const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { - return [...deployState.execution.errored] + const executionResults = viewExecutionResults(deployState); + + return Object.entries(deployState.execution.vertexes) + .filter(([_id, v]) => v.status === "FAILED") + .map(([id]) => parseInt(id, 10)) .map((id) => { - const vertexResult = deployState.execution.resultsAccumulator.get(id); + const vertexResult = executionResults.get(id); if ( vertexResult === undefined || vertexResult === null || - vertexResult._kind === "success" + vertexResult._kind === "success" || + vertexResult._kind === "hold" ) { return null; } @@ -100,6 +135,24 @@ const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { .filter((x): x is DeploymentError => x !== null); }; +const getDeploymentHolds = (deployState: DeployState): DeploymentHold[] => { + return Object.entries(deployState.execution.vertexes) + .filter(([_id, v]) => v.status === "HOLD") + .map(([id]) => parseInt(id, 10)) + .map((id) => { + const vertex = deployState.transform.executionGraph?.vertexes.get(id); + + if (vertex === undefined) { + return null; + } + + const holdDescription = buildHoldDescriptionFrom(vertex); + + return holdDescription; + }) + .filter((x): x is DeploymentError => x !== null); +}; + const buildErrorDescriptionFrom = ( error: Error, vertex: ExecutionVertex @@ -114,6 +167,14 @@ const buildErrorDescriptionFrom = ( }; }; +const buildHoldDescriptionFrom = (vertex: ExecutionVertex): DeploymentHold => { + return { + id: vertex.id, + vertex: vertex.label, + event: vertex.type === "AwaitedEvent" ? vertex.event : undefined, + }; +}; + const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { switch (vertex.type) { case "ContractCall": @@ -151,3 +212,22 @@ const DepError = ({ ); }; + +const DepHold = ({ deploymentHold }: { deploymentHold: DeploymentHold }) => { + if (deploymentHold.event === undefined) { + return ( + + {deploymentHold.vertex} + + ); + } + + return ( + + + {deploymentHold.vertex} waiting on event{" "} + {deploymentHold.event} + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx index 71db7bd7ed..1365d38221 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx @@ -10,7 +10,13 @@ export const ModuleParameters = ({ return null; } - const params = Object.entries(moduleParams).map(([key, value]) => ( + const entries = Object.entries(moduleParams); + + if (entries.length === 0) { + return null; + } + + const params = entries.map(([key, value]) => ( {key}: {value} diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 5735264743..24e8818333 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -14,8 +14,8 @@ export const SummarySection = ({ moduleParams?: ModuleParams; }) => { return ( - - + + Deploying module {moduleName} diff --git a/packages/hardhat-plugin/src/ui/components/execution/views.ts b/packages/hardhat-plugin/src/ui/components/execution/views.ts new file mode 100644 index 0000000000..164c3a1beb --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/views.ts @@ -0,0 +1,16 @@ +import { DeployState } from "@ignored/ignition-core"; + +/** + * Determine whether any on-chain executions happened in this + * run. An execution that requires on-chain updates in this + * run will have batches, a lack of batches indicates nothing + * to execute or execution happened on a previous run. + * @param deployState the deploy state + * @returns whether on-chain executions happened in this run + */ +export function viewEverthingExecutedAlready(deployState: DeployState) { + return ( + deployState.execution.batch === null && + deployState.execution.previousBatches.length === 0 + ); +} diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 4eeb8570e2..19efc92d19 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -43,6 +43,12 @@ export interface DeploymentError { failureType: string; } +export interface DeploymentHold { + id: number; + vertex: string; + event?: string; +} + export class DeploymentState { public phase: DeployPhase; public moduleName: string; diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts new file mode 100644 index 0000000000..1d275c91cd --- /dev/null +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -0,0 +1,88 @@ +/* eslint-disable import/no-unused-modules */ +import { DeployStateExecutionCommand } from "@ignored/ignition-core"; +import { assert } from "chai"; +import { BigNumber } from "ethers"; +import fs from "fs"; + +import { CommandJournal } from "../src/CommandJournal"; + +const tempCommandFilePath = "./tmp-test-journal.journal.ndjson"; + +describe("File based command journal", () => { + after(() => { + if (fs.existsSync(tempCommandFilePath)) { + fs.unlinkSync(tempCommandFilePath); + } + }); + + it("should write and read commands", async () => { + const journal = new CommandJournal(tempCommandFilePath); + + const commands: DeployStateExecutionCommand[] = [ + { type: "EXECUTION::START" }, + { type: "EXECUTION::SET_BATCH", batch: [0, 1, 2, 3] }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 0, + result: { + _kind: "success", + result: { + name: "Example", + abi: [ + { + inputs: [ + { internalType: "uint256", name: "n", type: "uint256" }, + ], + name: "readExample", + outputs: [{ internalType: "string", name: "", type: "string" }], + stateMutability: "pure", + type: "function", + }, + ], + bytecode: + "0x608060405234801561001057600080fd5b5061022f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063820fc73b14610030575b600080fd5b61004a600480360381019061004591906100eb565b610060565b60405161005791906101a8565b60405180910390f35b606060008203610073576100726101ca565b5b6040518060400160405280600781526020017f6578616d706c65000000000000000000000000000000000000000000000000008152509050919050565b600080fd5b6000819050919050565b6100c8816100b5565b81146100d357600080fd5b50565b6000813590506100e5816100bf565b92915050565b600060208284031215610101576101006100b0565b5b600061010f848285016100d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610152578082015181840152602081019050610137565b60008484015250505050565b6000601f19601f8301169050919050565b600061017a82610118565b6101848185610123565b9350610194818560208601610134565b61019d8161015e565b840191505092915050565b600060208201905081810360008301526101c2818461016f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea26469706673582212202d2263b386bafd8054b95874b748ed34129acf3f6521259fcc745499f85fd30064736f6c63430008110033", + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + value: BigNumber.from(0), + }, + }, + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 1, + result: { + _kind: "success", + result: { + hash: "0x7058ee5c5c027de2480a3d559695d0a1311763c5dcb3d301ee1203cc44a9031d", + }, + }, + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 2, + result: { + _kind: "failure", + failure: {} as any, // new Error("Example Error"), + }, + }, + { + type: "EXECUTION::SET_VERTEX_RESULT", + vertexId: 3, + result: { + _kind: "hold", + }, + }, + ]; + + for (const command of commands) { + await journal.record(command); + } + + const readCommands: DeployStateExecutionCommand[] = []; + + for await (const readCommand of journal.read()) { + readCommands.push(readCommand); + } + + assert.deepStrictEqual(readCommands, commands); + }); +}); diff --git a/yarn.lock b/yarn.lock index 70243ad2af..1a3d8774ec 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1060,7 +1060,7 @@ "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" -"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2", "@nomiclabs/hardhat-ethers@^2.2.1": +"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2": version "2.2.1" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== @@ -1476,7 +1476,7 @@ "@types/node" "*" "@types/responselike" "^1.0.0" -"@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4": +"@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4", "@types/chai-as-promised@^7.1.5": version "7.1.5" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== @@ -1603,6 +1603,14 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== +"@types/ndjson@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/ndjson/-/ndjson-2.0.1.tgz#0279bc20949bfb861d69ac3de5292775b169a2d0" + integrity sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw== + dependencies: + "@types/node" "*" + "@types/through" "*" + "@types/node@*": version "18.11.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" @@ -1695,6 +1703,13 @@ resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== +"@types/through@*": + version "0.0.30" + resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" + integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== + dependencies: + "@types/node" "*" + "@types/tmp@^0.2.2": version "0.2.3" resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" @@ -4743,7 +4758,7 @@ ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereu ethereum-cryptography "^0.1.3" rlp "^2.2.4" -ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7, ethers@^5.7.2: +ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7: version "5.7.2" resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== @@ -6427,7 +6442,7 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@~5.0.1: +json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== @@ -7184,6 +7199,17 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +ndjson@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" + integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.5" + readable-stream "^3.6.0" + split2 "^3.0.0" + through2 "^4.0.0" + negotiator@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -8093,6 +8119,15 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" + integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readable-stream@^2.2.2: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" @@ -8106,15 +8141,6 @@ readable-stream@^2.2.2: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readdirp@~3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" @@ -8508,6 +8534,13 @@ sentence-case@^2.1.0: no-case "^2.2.0" upper-case-first "^1.1.2" +serialize-error@8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" + integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== + dependencies: + type-fest "^0.20.2" + serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -8814,6 +8847,13 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== +split2@^3.0.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" + integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== + dependencies: + readable-stream "^3.0.0" + split@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" @@ -9193,6 +9233,13 @@ throat@^4.0.0, throat@^4.1.0: resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== +through2@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" + integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== + dependencies: + readable-stream "3" + through@2: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" From cbf08aec62e2d74c0e4ff85a1f016863b81e1426 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 4 Jan 2023 03:19:33 -0500 Subject: [PATCH 0203/1302] fixed some grammatical errors --- README.md | 2 +- docs/creating-modules-for-deployment.md | 4 ++-- docs/using-ignition-in-hardhat-tests.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aea43c152e..96237bed5a 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex ### Examples -This repo contains example projects that show **Ignitions** features in context (under `./examples`): +This repo contains example projects that show **Ignition** features in context (under `./examples`): - [Sample](./examples/sample/README.md) - the **Hardhat** starter project enhanced with Ignition - [ENS](./examples/ens/README.md) - deploy ENS and its registry for local testing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 2683430eec..8022ac88b3 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -40,7 +40,7 @@ module.exports = buildModule("MyModule", (m) => { Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](./using-ignition-in-hardhat-tests.md)) or consumed by other Modules to allow for complex deployments. -During a deployment **Ignition** uses the module to generate an execution plan of the transactions to run and the order and dependency in which to run them. A module uses the injected `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they interdepend on each other. +During a deployment, **Ignition** uses the module to generate an execution plan of the transactions to run and the order in which to run them based on their dependencies. A module uses the injected `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they interdepend on each other. ## Deploying a contract @@ -83,7 +83,7 @@ const b = m.contract("B", { }); ``` -You can think of this as `b` being the equivalent of a promise of an address, although futures are not promises. +You can think of this as `b` being the equivalent of a promise of an address, although **_futures are not promises_**. If a contract does not directly depend through arguments on another contract, a dependency (don't deploy `b` until `a` is successfully deployed) can still be created using the `after` array of options: diff --git a/docs/using-ignition-in-hardhat-tests.md b/docs/using-ignition-in-hardhat-tests.md index 3a14db2bdb..6d0572ed39 100644 --- a/docs/using-ignition-in-hardhat-tests.md +++ b/docs/using-ignition-in-hardhat-tests.md @@ -6,7 +6,7 @@ Requiring **Ignition** within your `hardhat.config.{ts,js}` will automatically inject the `ignition` object as a global variable within **Hardhat** test files. -The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional options object as the second argument. Module parameters can be passed under the `parameters` property of the options object: +The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional configuration object as the second argument. Module parameters can be passed under the `parameters` property of the options object: ```js it("should allow setting the start count for new counters", async function () { From 253b5466dbec8d8bed37566ea183d585e296c105 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 4 Jan 2023 12:13:20 +0000 Subject: [PATCH 0204/1302] chore: add github project automations Automatically assign new issues and prs to the Ignition project. Add a triaging label as well. --- .github/workflows/add-issue-to-project.yml | 16 +++++++++ .github/workflows/add-label-to-new-issue.yml | 38 ++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 .github/workflows/add-issue-to-project.yml create mode 100644 .github/workflows/add-label-to-new-issue.yml diff --git a/.github/workflows/add-issue-to-project.yml b/.github/workflows/add-issue-to-project.yml new file mode 100644 index 0000000000..4db90920e5 --- /dev/null +++ b/.github/workflows/add-issue-to-project.yml @@ -0,0 +1,16 @@ +name: Add issue to project + +on: + issues: + types: [opened] + pull_request_target: + types: [opened] + +jobs: + add-to-project: + runs-on: ubuntu-latest + steps: + - uses: actions/add-to-project@v0.4.0 + with: + project-url: https://github.com/orgs/NomicFoundation/projects/7 + github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} diff --git a/.github/workflows/add-label-to-new-issue.yml b/.github/workflows/add-label-to-new-issue.yml new file mode 100644 index 0000000000..e35f68a2b5 --- /dev/null +++ b/.github/workflows/add-label-to-new-issue.yml @@ -0,0 +1,38 @@ +name: Add label to new issue + +on: + issues: + types: [opened] + pull_request: + types: [opened] + +jobs: + label-new-issue: + runs-on: ubuntu-latest + permissions: + issues: write + pull-requests: write + steps: + - uses: actions/github-script@v6 + with: + script: | + const issue = await github.rest.issues.get({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number + }); + + const statusLabel = issue.data.labels.find(({ name }) => + name.startsWith("status:") + ); + + if (statusLabel === undefined) { + await github.rest.issues.addLabels({ + owner: context.issue.owner, + repo: context.issue.repo, + issue_number: context.issue.number, + labels: ["status:triaging"] + }); + } else { + console.log(`Issue already has a status: ${statusLabel.name}`); + } From 5dfd132dab3837827e2803c03c10d57ec9a46f4e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 13 Jan 2023 09:26:53 +0000 Subject: [PATCH 0205/1302] docs/explanation (#81) Add an explanation doc to the documentation. The goal is to give the user a mental model to understand ignition and its motivation. --- README.md | 1 + docs/explanation.md | 131 ++++++++++++++++++++++++++++++++++ docs/getting-started-guide.md | 4 +- 3 files changed, 134 insertions(+), 2 deletions(-) create mode 100644 docs/explanation.md diff --git a/README.md b/README.md index 96237bed5a..4a4b1dfcdc 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex ## Documentation - [Getting started](./docs/getting-started-guide.md) +- [Explanation](./docs/explanation.md) - [Creating Modules for Deployments](./docs/creating-modules-for-deployment.md) - [Deploying a Contract](./docs/creating-modules-for-deployment.md#deploying-a-contract) - [Calling contract methods](./docs/creating-modules-for-deployment.md#calling-contract-methods) diff --git a/docs/explanation.md b/docs/explanation.md new file mode 100644 index 0000000000..e811cffb1a --- /dev/null +++ b/docs/explanation.md @@ -0,0 +1,131 @@ +# Explanation + +> This document explains what Ignition is, what it is used for, and the building blocks that make it up. + +Ignition is an infrastructure-as-code system to both deploy and distribute smart contract systems. + +When working with Ignition you define how your smart contracts should be deployed, and let it be in charge of the execution. This means that Ignition will be responsible for sending your transactions, managing gas, handling errors and restarts, and other situations that can appear when deploying a complex system. + +Ignition can be used to deploy a complex smart contract system and will support the deployment with: planning tools, visualisations of the running deployment and the capability to restart partial or failed deployments. + +Specifying a deployment through Ignition provides the option to leverage that specification in Hardhat tests, simplifying test setup. It is a goal of Ignition to enable the distribution of Ignition deployments to allow Solidity developers to quickly create in their tests complex on-chain scenarios (e.g. testing your contract's interaction with [Maker during an emergency shutdown](https://docs.makerdao.com/smart-contract-modules/shutdown)), that are not possible through forking tests. + +> NOTE: This initial release focuses on deploying your local contracts, and not on distributing them. Deployment distribution is not part of this initial prototype. + +## Understanding the Module API + +Ignition achieves a separation of _what is to be deployed_ from _how it will be deployed_ through a `Future`-orientated declarative api called the **Module API**. In contrast to the procedural approach used in most deployment scripts, a declarative API allows Ignition to statically analyse a deployment without running it. That analysis supports: improved validation, resuming partial deployments and efficient grouping and processing of transactions. + +### What is a Module? + +Deployments in Ignition are organized by modules. A module is a set of related smart contracts to be deployed and potentially some contract calls that need to be run on them (e.g. calling an `initialize()` function). + +A module is built by calling the `buildModule` function and passing it a unique name and a callback, the `moduleDefinition`. A common pattern is building one module per file and exporting it. + +```tsx +module.exports = buildModule("CounterModule", (m) => { + const intialCounterValue = 123; + + const counter = m.contract("Counter", { args: [initialCounterValue] }); + + return { counter }; +}); +``` + +The `moduleDefinition` callback receives a `moduleBuilder` object, which is used to define the different on-chain `Action`s that are needed to complete the deployment of the module, and returns the contracts it wants to export. + +`moduleBuidler` methods don’t execute any `Action`, they record the intent and its relationship to other `Actions` and return a `Future` that represents the eventual result of its execution. + +In the above example, when we call `m.contract`, we create a contract deployment `Action`, and get a `Future` that represents its eventual result, the address the contract is deployed to. + +`Actions` can depend on other `Action`'s results. We do this by using an `Action`'s `Future` as an argument to a subsequent `moduleBuidler` method. For example, here we define two `Actions`. One that deploys a contract, and another one that initializes it. + +```tsx +module.exports = buildModule("ContractWithInitModule", (m) => { + const c = m.contract("ContractWithInitModule"); + + m.call(c, "init", { args: [123] }); + + return { c }; +}); +``` + +You can create complex graphs of `Actions` like this. + +## How modules get executed + +Deploying a module goes through several stages: + +```mermaid +flowchart LR + 0[Module] + subgraph Ignition + 1[Validate Module] + 2[Build Action Graph] + 3[Execute] + end + 0 --> 1 + 1 --> 2 + 2 --> 3 +``` + +Ignition first runs validation checks on the module to increase the likelyhood that it will execute on-chain (e.g. that all contract calls match methods available on the contracts abi). + +A valid module is then analysed to build a graph of `Actions` to be executed. Tracing the flow of `Futures` between `Actions` in the module, allows Ignition to understand each `Action`'s dependencies, which in turn will control the order of execution. + +The graph of `Actions` is then run by Ignition's execution engine, which proceeds through the dependencies of the graph, batching those `Actions` whose dependencies have successfully completed. `Actions` in a batch are run in parallel. + +Most actions get executed by submitting a transaction; though not every action results in a transaction. An action may lead to the submission of multiple transactions because of errors or gas management. The retrying of transactions is handled by the Ignition execution engine and is transparent to the user. + +Executing an Action successfully _resolves_ its associated `Future`. Because an action is not run until all its dependencies have completed, any `Futures` it depends upon will have been resolved to an appropriate value (e.g. the address of a newly deployed contract) before it is run. + +The execution is complete when all actions have been run successfully. + +### Handling errors and restarting + +Ignition keeps a journal of the execution. When a deployment fails, you can rerun the deployment. Ignition will rebuild the previous state based on the journal, and will retry the failed transaction and proceed from there. Previous successful `Actions` will not be resubmitted. + +The Module API allows for waiting on an Ethereum `Event`, in this case the deployment will halt as _on hold_ if the `Event` has not occurred. Rerunning the Module will restart from the `Event` check. + +### Modifying your Modules between deployments + +You can modify your deployments between Ignition runs, for instance, when dealing with errors. This allows you to incrementally grow your system. + +Ignition will reconcile your modified Module with the `Actions` that are recorded in the journal from previous runs. If it determines that an `Action` has already been run, then it will not be rerun. If the Module has diverged too far for Ignition to safely make an assessment of whether an `Action` has been previously run, then it will alert the user. + +The tracking and reconciling of `Actions` in previous runs is done automatically, but you can identify an `Action` explicity with an `id` to eliminate ambiguity. + + + + + + + + + +--- + +Next, dig deeper into defining modules: + +[Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 4f8700a51a..ec7da5f066 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -155,6 +155,6 @@ npx hardhat test --- -Next, dig deeper into defining modules: +Next, get a better understanding of the motivations of **Ignition** and how it sets out to achieve them: -[Creating modules for deployment](./creating-modules-for-deployment.md) +[Explanation](./explanation.md) From 00f57d95bb68d418128f2a23a74aa1d10e1bec68 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 4 Jan 2023 17:21:49 +0000 Subject: [PATCH 0206/1302] docs: add manual test doc A set of smoke tests to be run before a release. --- docs/manual.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 docs/manual.md diff --git a/docs/manual.md b/docs/manual.md new file mode 100644 index 0000000000..eeb6cc48d3 --- /dev/null +++ b/docs/manual.md @@ -0,0 +1,35 @@ +# Manual Test Doc + +> To knock off the rough edges + +## Tests + +### Try and deploy a module that doesn't exist + +#### Arrange + +Setup ignition in a new hardhat project based on the getting started guide. + +#### Act + +Run a deploy with a module that doesn't exist + +#### Assert + +Check that a sensible error message is displayed + +#### Try and run a module with a validation error + +#### Arrange + +Setup ignition in a new hardhat project based on the getting started guide. + +Tweak the module so that it has a problem that will be caught by validation (ADD_MORE_DETAILS_HERE). + +#### Act + +Run a deploy with a invalid module + +#### Assert + +Check that a sensible error message is displayed From 9003c2c187e92ab32eecac98af3b0eb3d3d9afd4 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 9 Jan 2023 05:24:55 -0500 Subject: [PATCH 0207/1302] added instructions to deploy to sepolia --- docs/manual.md | 44 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/docs/manual.md b/docs/manual.md index eeb6cc48d3..ab80c2c35b 100644 --- a/docs/manual.md +++ b/docs/manual.md @@ -4,32 +4,60 @@ ## Tests -### Try and deploy a module that doesn't exist +--- -#### Arrange +### **Try and deploy a module that doesn't exist** + +--- + +#### _Arrange_ Setup ignition in a new hardhat project based on the getting started guide. -#### Act +#### _Act_ Run a deploy with a module that doesn't exist -#### Assert +#### _Assert_ Check that a sensible error message is displayed -#### Try and run a module with a validation error +--- + +### **Try and run a module with a validation error** + +--- -#### Arrange +#### _Arrange_ Setup ignition in a new hardhat project based on the getting started guide. Tweak the module so that it has a problem that will be caught by validation (ADD_MORE_DETAILS_HERE). -#### Act +#### _Act_ Run a deploy with a invalid module -#### Assert +#### _Assert_ Check that a sensible error message is displayed + +--- + +### **Deploy to Sepolia testnet** + +--- + +#### _Arrange_ + +Ensure you have an infura/alchemy RPC endpoint set up for Sepolia as well as an ETH address with Sepolia ETH that you don't mind pasting the privkey in plaintext for. I used metamask + +Setup the network settings in the `hardhat.config.js` of the example you want to test + +#### _Act_ + +Run a deploy/test from the example directory you set up + +#### _Assert_ + +Check that deployment was successful, or results match expected (for instance, on-hold for multisig) From 35bc95a9f8db2cabe57a86944908080a08406f1c Mon Sep 17 00:00:00 2001 From: morgansliman Date: Mon, 9 Jan 2023 05:26:28 -0500 Subject: [PATCH 0208/1302] fixed sendETH graphing --- packages/core/src/types/future.ts | 3 ++- packages/core/src/utils/guards.ts | 3 ++- packages/core/src/utils/proxy.ts | 5 +++-- packages/core/src/validation/dispatch/helpers.ts | 2 ++ 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index ef143c97be..8ee80652b5 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -138,7 +138,8 @@ export type DependableFuture = | ContractCall | Virtual | ProxyFuture - | EventFuture; + | EventFuture + | SendFuture; export type AddressResolvable = | string diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index c96d95c076..1b84f72657 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -93,7 +93,8 @@ export function isDependable(possible: any): possible is DependableFuture { possible.type === "library" || possible.type === "virtual" || possible.type === "await" || - possible.type === "proxy") + possible.type === "proxy" || + possible.type === "send") ); } diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/utils/proxy.ts index f6e1e2977f..ed63c40c9b 100644 --- a/packages/core/src/utils/proxy.ts +++ b/packages/core/src/utils/proxy.ts @@ -4,13 +4,14 @@ import { DependableFuture, Virtual, EventFuture, + SendFuture, } from "types/future"; import { isProxy } from "./guards"; export function resolveProxyDependency( future: DependableFuture -): CallableFuture | ContractCall | Virtual | EventFuture { +): CallableFuture | ContractCall | Virtual | EventFuture | SendFuture { if (isProxy(future)) { return resolveProxyDependency(future.proxy); } @@ -20,7 +21,7 @@ export function resolveProxyDependency( export function resolveProxyValue( future: DependableFuture -): CallableFuture | ContractCall | Virtual | EventFuture { +): CallableFuture | ContractCall | Virtual | EventFuture | SendFuture { if (isProxy(future)) { return resolveProxyValue(future.value); } diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 107642cdab..73bce18bad 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -45,6 +45,8 @@ export async function resolveArtifactForCallableFuture( throw new Error(`Cannot call call future`); case "await": throw new Error(`Cannot call await future`); + case "send": + throw new Error(`Cannot call send future`); default: return assertNeverDeploymentFuture(future); } From 3aaa92c0262686c26541b3343f64c8a19acc6511 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 10 Jan 2023 10:59:39 -0500 Subject: [PATCH 0209/1302] fixing plan task for send and event --- .../hardhat-plugin/src/plan/assets/bundle.ts | 2 +- .../hardhat-plugin/src/plan/assets/main.css | 30 ++++++- .../src/plan/assets/templates/summary.html | 2 +- .../src/plan/assets/templates/vertex.html | 4 +- packages/hardhat-plugin/src/plan/index.ts | 14 +++- packages/hardhat-plugin/src/plan/utils.ts | 78 ++++++++++++------- 6 files changed, 95 insertions(+), 35 deletions(-) diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts index e691b7ff77..c9edec8d32 100644 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -11,7 +11,7 @@ window.onload = () => { const classList = [...vertexElement.classList.values()]; for (const className of classList) { - if (/^(deploy|call)/.test(className)) { + if (/^(deploy|call|transfer|event)/.test(className)) { const actionElement = document.getElementById(`action-${className}`); const vertexClassString = [...classList, "hovering"].join(" "); diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index 1a0abbdca8..6092be4912 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -12,6 +12,15 @@ padding: 1rem; } +.summary-lists { + font-size: 90%; +} + +.summary-lists ul { + list-style-type: none; + padding-inline-start: 1em; +} + .mermaid { text-align: center; } @@ -42,17 +51,32 @@ ul.actions > li { background-color: yellow; } +[id^="action-transfer"] { + background-color: orange; +} + +[id^="action-event"] { + background-color: cyan; +} + [class*="deploy-"] > rect { fill: green !important; } -[class*="call-"] > polygon { +[class*="call-"] > rect { fill: yellow !important; } +[class*="transfer-"] > rect { + fill: orange !important; +} + +[class*="event-"] > rect { + fill: cyan !important; +} + /* style for nodes & actions when hovered */ -.hovering > rect, -.hovering > polygon { +.hovering > rect { fill: blue !important; } diff --git a/packages/hardhat-plugin/src/plan/assets/templates/summary.html b/packages/hardhat-plugin/src/plan/assets/templates/summary.html index 45261feef2..2b30d4f9c3 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/summary.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/summary.html @@ -11,7 +11,7 @@

      Network: %networkName% (%networkId%)

    -
    %summaryLists%
    +
    %summaryLists%
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html index 91eb83c0af..a4697205ba 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html @@ -19,10 +19,12 @@

    Network: %networkName% (%networkId%)

    -

    Transaction data:

    +

    Transaction data

    Params: %params%
    + +
    Value: %value%
    diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index e530df164a..b920d2de2c 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -1,5 +1,6 @@ import type { IgnitionPlan } from "@ignored/ignition-core"; import { exec } from "child_process"; +import { ethers } from "ethers"; import fs from "fs-extra"; import os from "os"; import path from "path"; @@ -85,14 +86,23 @@ export class Renderer { this._writeMainHTML(mainOutput); for (const vertex of this.plan.deploymentGraph.vertexes.values()) { - const type = vertex.type === "HardhatContract" ? "Deploy" : "Call"; + const type = utils.parseType(vertex); const label = vertex.label; const params = utils.getParams(vertex); + let value: string = "None"; + if ("value" in vertex) { + if ("type" in vertex.value) { + value = `Future < ${vertex.value.label} > value parameter`; + } else { + value = ethers.utils.formatEther(vertex.value); + } + } + const vertexOutput = this._templates.vertex.replace( regex, - utils.replacer({ type, label, networkName, networkId, params }) + utils.replacer({ type, label, networkName, networkId, params, value }) ); this._writeModuleHTML(vertex.id, vertexOutput); diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 021fc8619c..a8e5f3a085 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,7 +1,26 @@ import type { VertexGraph, VertexDescriptor } from "@ignored/ignition-core"; -function isDeploy(v: VertexDescriptor): boolean { - return v.type === "HardhatContract" || v.type === "ArtifactContract"; +export function parseType(v: VertexDescriptor): string { + let type: string; + switch (v.type) { + case "HardhatContract": + case "ArtifactContract": + type = "deploy"; + break; + case "Call": + type = "call"; + break; + case "SendETH": + type = "transfer"; + break; + case "Event": + type = "event"; + break; + default: + throw new Error(`Unknown vertex type: ${v.type}`); + } + + return type; } function getVertexes(graph: VertexGraph): VertexDescriptor[] { @@ -16,6 +35,13 @@ function li(s: string): string { return `
  • ${s}
  • `; } +function ul(a: string[]): string { + return ` +
      + ${a.join("\n")} +
    `; +} + export function getTxTotal(graph: VertexGraph): string { const vertexes = getVertexes(graph); @@ -27,38 +53,36 @@ export function getTxTotal(graph: VertexGraph): string { export function getSummaryLists(graph: VertexGraph): string { const vertexes = getVertexes(graph); - const deploys = []; - const calls = []; + const obj: { [k: string]: string[] } = {}; + + let cols = 0; for (const vertex of vertexes) { - if (isDeploy(vertex)) { - deploys.push(li(vertex.label)); - } else if (vertex.type === "Call") { - calls.push(li(vertex.label)); + const type = parseType(vertex); + + if (obj[type] === undefined) { + cols++; + obj[type] = []; } - } - return ` -
    - ${deploys.length} contract ${plural("deploy", deploys.length)} -
      - ${deploys.join("\n")} -
    -
    + obj[type].push(li(vertex.label)); + } -
    - ${calls.length} contract ${plural("call", calls.length)} -
      - ${calls.join("\n")} -
    + const output = []; + for (const [type, value] of Object.entries(obj)) { + const item = ` +
    + ${value.length} contract ${plural(type, value.length)} + ${ul(value)}
    `; + output.push(item); + } + + return output.join("\n"); } function wrapNode(v: VertexDescriptor): string { - const text = `"${v.label}"`; - return isDeploy(v) - ? `${v.id}[${text}]:::deploy-${v.id}` - : `${v.id}{{${text}}}:::call-${v.id}`; + return `${v.id}[${v.label}]:::${parseType(v)}-${v.id}`; } export function graphToMermaid(graph: VertexGraph): string { @@ -95,11 +119,11 @@ export function getActions(graph: VertexGraph): string { const vertexes = getVertexes(graph); const items = vertexes.map((v) => { - const type = isDeploy(v) ? "Deploy" : v.type; + const type = parseType(v); return `
  • Contract ${type} ${v.label} From 05b01edeaea7f2611f30ced92792ea2c822d7b1b Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 12 Jan 2023 23:29:05 -0500 Subject: [PATCH 0210/1302] added confirmation for non-hardhat deploy --- packages/hardhat-plugin/package.json | 2 ++ packages/hardhat-plugin/src/index.ts | 21 +++++++++++++++++++++ yarn.lock | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 15215bfe56..73e661fdee 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -46,6 +46,7 @@ "@types/mocha": "^9.0.0", "@types/ndjson": "2.0.1", "@types/node": "12.20.25", + "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", @@ -80,6 +81,7 @@ "ink": "3.2.0", "ink-spinner": "4.0.3", "ndjson": "2.0.0", + "prompts": "^2.4.2", "react": "18.2.0", "serialize-error": "8.1.0" } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1c3f1365f9..834ac54008 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -5,6 +5,7 @@ import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; +import prompts from "prompts"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionWrapper } from "./ignition-wrapper"; @@ -91,6 +92,26 @@ task("deploy") }: { userModulesPaths: string[]; parameters?: string }, hre ) => { + if (hre.network.name !== "hardhat") { + const chainId = await hre.network.provider.request({ + method: "eth_chainId", + }); + + const prompt = await prompts({ + type: "confirm", + name: "networkConfirmation", + message: `Confirm deploy to network ${hre.network.name} (${Number( + chainId + )})?`, + initial: true, + }); + + if (!prompt.networkConfirmation) { + console.log("Deploy cancelled"); + return; + } + } + await hre.run("compile", { quiet: true }); let userModules: Array>; diff --git a/yarn.lock b/yarn.lock index 1a3d8774ec..0b8444a19c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1653,6 +1653,14 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== +"@types/prompts@^2.4.2": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.4.2.tgz#0785dc09ca79e15ff11b20b7cda2f87af3165a7d" + integrity sha512-TwNx7qsjvRIUv/BCx583tqF5IINEVjCNqg9ofKHRlSoUHE62WBHrem4B1HGXcIrG511v29d1kJ9a/t2Esz7MIg== + dependencies: + "@types/node" "*" + kleur "^3.0.3" + "@types/prop-types@*": version "15.7.5" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" @@ -6542,6 +6550,11 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -7942,6 +7955,14 @@ promise@^8.0.0: dependencies: asap "~2.0.6" +prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -8702,6 +8723,11 @@ sinon@^14.0.0: nise "^5.1.2" supports-color "^7.2.0" +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" From c2a63221fbd8e294380b123cb879feaab7989aa0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 13 Jan 2023 11:44:09 +0000 Subject: [PATCH 0211/1302] docs: remove unneeded args from transferring --- docs/creating-modules-for-deployment.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 8022ac88b3..e7bf0a0641 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -201,7 +201,6 @@ Similar to `ethers`, a call can transfer `Eth` by passing a `value` under the op ```tsx m.call(exchange, "deposit", { - args: [], value: ethers.utils.parseUnits("1"), }); ``` From b15e00b861c8c0e87fc3216bd8ced82e89a428a5 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Wed, 18 Jan 2023 01:34:01 -0500 Subject: [PATCH 0212/1302] refactored awaitEvent to just event --- docs/creating-modules-for-deployment.md | 6 +++--- docs/running-a-deployment.md | 10 +++++----- examples/create2/ignition/Create2FactoryModule.js | 4 ++-- examples/multisig/README.md | 2 +- examples/multisig/ignition/MultisigModule.js | 2 +- packages/core/src/Ignition.ts | 4 ++-- packages/core/src/dsl/DeploymentBuilder.ts | 2 +- .../src/execution/dispatch/executeAwaitedEvent.ts | 2 +- packages/core/src/types/deployment.ts | 2 +- packages/core/src/types/deploymentGraph.ts | 2 +- .../{validateAwaitEvent.ts => validateEvent.ts} | 2 +- .../src/validation/dispatch/validationDispatch.ts | 4 ++-- .../deploymentBuilder/{awaitedEvent.ts => event.ts} | 12 ++++-------- packages/core/test/execution/rerun.ts | 2 +- packages/core/test/validation.ts | 6 +++--- packages/hardhat-plugin/src/index.ts | 5 ++--- packages/hardhat-plugin/test/config.ts | 4 ++-- .../fixture-projects/with-config/hardhat.config.js | 2 +- 18 files changed, 34 insertions(+), 39 deletions(-) rename packages/core/src/validation/dispatch/{validateAwaitEvent.ts => validateEvent.ts} (98%) rename packages/core/test/deploymentBuilder/{awaitedEvent.ts => event.ts} (97%) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index e7bf0a0641..0643106d0f 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -247,7 +247,7 @@ const multisig = m.deploy("Multisig"); const call = m.call(multisig, "authorize"); -const event = m.awaitEvent(multisig, "AuthorizedBy", { +const event = m.event(multisig, "AuthorizedBy", { args: ["0xUser1"], after: [call], }); @@ -255,11 +255,11 @@ const event = m.awaitEvent(multisig, "AuthorizedBy", { m.call(multisig, "execute", { args: [event.params.transactionId] }); ``` -The `awaitEvent` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `awaitEvent` condition. +The `event` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `event` condition. Upon execution, the `EventFuture` will be resolved to the values of the params emitted by the given event. You can then use those values in tests or other modules as expected. -A full example of the `awaitEvent` function can be seen in our [Multisig example](../examples/multisig/README.md). +A full example of the `event` function can be seen in our [Multisig example](../examples/multisig/README.md). ## Including modules within modules diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index a68b7ab4fa..8dbb58dbd4 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -62,7 +62,7 @@ interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; // milliseconds - awaitEventDuration: number; // milliseconds + eventDuration: number; // milliseconds } ``` @@ -76,7 +76,7 @@ module.exports = { maxRetries: 10, gasIncrementPerRetry: ethers.utils.parseUnits("0.001"), pollingInterval: 300, - awaitEventDuration: 10000, + eventDuration: 10000, }, }; ``` @@ -97,11 +97,11 @@ The value of `pollingInterval` is the number of milliseconds the process will wa --- -`awaitEventDuration` +`eventDuration` --- -This config value determines how long `m.awaitEvent` waits for the given event to be emitted on-chain before marking the deployment as "on-hold". It should be given as a number of milliseconds, with the default value being 30000, or 30 seconds. +This config value determines how long `m.event` waits for the given event to be emitted on-chain before marking the deployment as "on-hold". It should be given as a number of milliseconds, with the default value being 30000, or 30 seconds. ## Resuming a failed or onhold deployment @@ -109,6 +109,6 @@ A run of a deployment can succeed, fail or be on hold. A failed deployment or on `npx hardhat deploy MyModule.js --network localhost` -Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `awaitEvent` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. +Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `event` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js index 638fc5d653..d2e3350585 100644 --- a/examples/create2/ignition/Create2FactoryModule.js +++ b/examples/create2/ignition/Create2FactoryModule.js @@ -11,7 +11,7 @@ module.exports = buildModule("Create2Factory", (m) => { args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], }); - const fooEvent = m.awaitEvent(create2, "Deployed", { + const fooEvent = m.event(create2, "Deployed", { args: [toBytes32(1)], after: [fooCall], }); @@ -21,7 +21,7 @@ module.exports = buildModule("Create2Factory", (m) => { after: [fooEvent], }); - const barEvent = m.awaitEvent(create2, "Deployed", { + const barEvent = m.event(create2, "Deployed", { args: [toBytes32(2)], after: [barCall], }); diff --git a/examples/multisig/README.md b/examples/multisig/README.md index b54c534038..55b83f27c1 100644 --- a/examples/multisig/README.md +++ b/examples/multisig/README.md @@ -2,7 +2,7 @@ This hardhat project is an example of using ignition to deploy a basic Multisig contract, send a transaction via the multisig, wait for an external confirmation, then resume the deploy to execute the confirmed transaction. -The module demonstrates how `m.awaitEvent(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain. +The module demonstrates how `m.event(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain. ## Deploying diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js index da4033de7b..07e4bbb040 100644 --- a/examples/multisig/ignition/MultisigModule.js +++ b/examples/multisig/ignition/MultisigModule.js @@ -23,7 +23,7 @@ module.exports = buildModule("MultisigModule", (m) => { }); // todo: support sending via non-default account - const event = m.awaitEvent(multisig, "Confirmation", { + const event = m.event(multisig, "Confirmation", { args: [ACCOUNT_0, 0], after: [call], }); diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 0c3de64976..6f3ed6e568 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -28,7 +28,7 @@ export interface IgnitionDeployOptions { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; - awaitEventDuration: number; + eventDuration: number; } type ModuleOutputs = Record; @@ -87,7 +87,7 @@ export class Ignition { maxRetries: options.maxRetries, gasIncrementPerRetry: options.gasIncrementPerRetry, pollingInterval: options.pollingInterval, - awaitEventDuration: options.awaitEventDuration, + eventDuration: options.eventDuration, }); return this._buildOutputFrom(executionResult, moduleOutputs); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 132220172e..4e11f400d8 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -293,7 +293,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return callFuture; } - public awaitEvent( + public event( artifactFuture: ArtifactFuture, eventName: string, { args, after }: AwaitOptions diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index 70fe0c99bd..c07f06f429 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -25,7 +25,7 @@ export async function executeAwaitedEvent( const eventResult = await services.transactions.waitForEvent( filter, - options.awaitEventDuration + options.eventDuration ); if (eventResult === null) { diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 4731f2b220..2c3506e2bf 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -147,7 +147,7 @@ export interface ExecutionOptions { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; - awaitEventDuration: number; + eventDuration: number; } export interface ExecutionContext { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index f3d38f3234..766bce4b07 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -200,7 +200,7 @@ export interface IDeploymentBuilder { options: CallOptions ) => ContractCall; - awaitEvent: ( + event: ( contractFuture: ArtifactFuture, eventName: string, options: AwaitOptions diff --git a/packages/core/src/validation/dispatch/validateAwaitEvent.ts b/packages/core/src/validation/dispatch/validateEvent.ts similarity index 98% rename from packages/core/src/validation/dispatch/validateAwaitEvent.ts rename to packages/core/src/validation/dispatch/validateEvent.ts index 531dc9ee73..3ef1cceade 100644 --- a/packages/core/src/validation/dispatch/validateAwaitEvent.ts +++ b/packages/core/src/validation/dispatch/validateEvent.ts @@ -9,7 +9,7 @@ import { validateBytesForArtifact, } from "./helpers"; -export async function validateAwaitEvent( +export async function validateEvent( vertex: EventVertex, _resultAccumulator: ResultsAccumulator, context: { services: Services } diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 481c4eaff2..226e0a37e3 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -5,9 +5,9 @@ import { assertUnknownDeploymentVertexType } from "utils/guards"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; -import { validateAwaitEvent } from "./validateAwaitEvent"; import { validateCall } from "./validateCall"; import { validateDeployedContract } from "./validateDeployedContract"; +import { validateEvent } from "./validateEvent"; import { validateHardhatContract } from "./validateHardhatContract"; import { validateHardhatLibrary } from "./validateHardhatLibrary"; import { validateSendETH } from "./validateSendETH"; @@ -54,7 +54,7 @@ export function validationDispatch( case "Virtual": return validateVirtual(deploymentVertex, resultAccumulator, context); case "Event": - return validateAwaitEvent(deploymentVertex, resultAccumulator, context); + return validateEvent(deploymentVertex, resultAccumulator, context); case "SendETH": return validateSendETH(deploymentVertex, resultAccumulator); default: diff --git a/packages/core/test/deploymentBuilder/awaitedEvent.ts b/packages/core/test/deploymentBuilder/event.ts similarity index 97% rename from packages/core/test/deploymentBuilder/awaitedEvent.ts rename to packages/core/test/deploymentBuilder/event.ts index 59243db8e4..6cd1ef8883 100644 --- a/packages/core/test/deploymentBuilder/awaitedEvent.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -69,14 +69,10 @@ describe("deployment builder - await event", () => { const call = m.call(testContract, "test", { args: [] }); - const event = m.awaitEvent( - testContract as ArtifactContract, - "SomeEvent", - { - args: [testContract], - after: [call], - } - ); + const event = m.event(testContract as ArtifactContract, "SomeEvent", { + args: [testContract], + after: [call], + }); m.call(testContract, "verify", { args: [event.params.value], diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 06600e6179..7eaed0d927 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -149,7 +149,7 @@ describe("Reruning execution", () => { const configureCall = m.call(token, "configure", { args: [100] }); - m.awaitEvent(token as any, "ConfigComplete", { + m.event(token as any, "ConfigComplete", { after: [configureCall], args: [], }); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 1132adc539..b2957e3ea2 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -775,7 +775,7 @@ describe("Validation", () => { const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example as ArtifactContract, "SomeEvent", { + m.event(example as ArtifactContract, "SomeEvent", { after: [call], args: ["0x0"], }); @@ -808,7 +808,7 @@ describe("Validation", () => { const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example as ArtifactContract, "Nonexistant", { + m.event(example as ArtifactContract, "Nonexistant", { args: [], after: [call], }); @@ -854,7 +854,7 @@ describe("Validation", () => { const call = m.call(example, "test", { args: [] }); - m.awaitEvent(example as ArtifactContract, "SomeEvent", { + m.event(example as ArtifactContract, "SomeEvent", { after: [call], args: [1, 2, 3, 4], }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1c3f1365f9..b1f976286d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -18,7 +18,7 @@ export interface IgnitionConfig { maxRetries: number; gasIncrementPerRetry: BigNumber | null; pollingInterval: number; - awaitEventDuration: number; + eventDuration: number; } /* ignition config defaults */ @@ -53,8 +53,7 @@ extendConfig((config, userConfig) => { gasIncrementPerRetry: userIgnitionConfig.gasIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, pollingInterval: userIgnitionConfig.pollingInterval ?? POLLING_INTERVAL, - awaitEventDuration: - userIgnitionConfig.awaitEventDuration ?? AWAIT_EVENT_DURATION, + eventDuration: userIgnitionConfig.eventDuration ?? AWAIT_EVENT_DURATION, }; }); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 9b87cf2df9..2447edb920 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -79,7 +79,7 @@ describe("config", () => { assert.equal(sendTxOptions.pollingInterval, 4); }); - it("should apply awaitEventDuration", async function () { + it("should apply eventDuration", async function () { await deployModule(this.hre, (m) => { m.contract("Bar"); @@ -88,6 +88,6 @@ describe("config", () => { const sendTxOptions = sendTxStub.getCalls()[0].lastArg; - assert.equal(sendTxOptions.awaitEventDuration, 10000); + assert.equal(sendTxOptions.eventDuration, 10000); }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index c5f367c541..599d1f21b9 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -14,6 +14,6 @@ module.exports = { maxRetries: 1, gasIncrementPerRetry: BigNumber.from(1000), pollingInterval: 4, - awaitEventDuration: 10000, + eventDuration: 10000, }, }; From 9bba704351bfad5dce77ddb53cc9e1684e068a87 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Jan 2023 16:52:44 +0000 Subject: [PATCH 0213/1302] fix(journal): categorise commands by chainId Record the `chainId` along with the execution command, so that reruns are scoped by chain. Fixes #99. --- docs/running-a-deployment.md | 2 +- packages/hardhat-plugin/src/CommandJournal.ts | 16 ++++++- .../hardhat-plugin/src/ignition-wrapper.ts | 7 +++- .../hardhat-plugin/test/CommandJournal.ts | 42 ++++++++++++++++++- 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index a68b7ab4fa..048a9da286 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -109,6 +109,6 @@ A run of a deployment can succeed, fail or be on hold. A failed deployment or on `npx hardhat deploy MyModule.js --network localhost` -Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `awaitEvent` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. +Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Runs are scoped to the `chainId` of the network, so that runs against different networks do not interact. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `awaitEvent` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts index ad89efc5fe..2d3f02a224 100644 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -8,12 +8,15 @@ import ndjson from "ndjson"; import { serializeError, deserializeError } from "serialize-error"; export class CommandJournal implements ICommandJournal { - constructor(private _path: string) {} + constructor(private _chainId: number, private _path: string) {} public async record(command: DeployStateExecutionCommand) { return fs.promises.appendFile( this._path, - `${JSON.stringify(command, this._serializeReplacer.bind(this))}\n` + `${JSON.stringify( + { chainId: this._chainId, ...command }, + this._serializeReplacer.bind(this) + )}\n` ); } @@ -37,6 +40,15 @@ export class CommandJournal implements ICommandJournal { this._deserializeReplace.bind(this) ); + if ( + !("chainId" in deserializedChunk) || + deserializedChunk.chainId !== this._chainId + ) { + continue; + } + + delete deserializedChunk.chainId; + yield deserializedChunk as DeployStateExecutionCommand; } } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index c50c92c83a..4494b31120 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -38,15 +38,18 @@ export class IgnitionWrapper { ): Promise { const showUi = deployParams?.ui ?? false; + const services = createServices(this._providers); + const chainId = await services.network.getChainId(); + const ignition = new Ignition({ - services: createServices(this._providers), + services, uiRenderer: showUi ? renderToCli(this._providers.config.parameters) : undefined, journal: deployParams?.journal ? deployParams?.journal : deployParams?.journalPath !== undefined - ? new CommandJournal(deployParams?.journalPath) + ? new CommandJournal(chainId, deployParams?.journalPath) : undefined, }); diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 1d275c91cd..d3704feadf 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -9,14 +9,14 @@ import { CommandJournal } from "../src/CommandJournal"; const tempCommandFilePath = "./tmp-test-journal.journal.ndjson"; describe("File based command journal", () => { - after(() => { + afterEach(() => { if (fs.existsSync(tempCommandFilePath)) { fs.unlinkSync(tempCommandFilePath); } }); it("should write and read commands", async () => { - const journal = new CommandJournal(tempCommandFilePath); + const journal = new CommandJournal(31337, tempCommandFilePath); const commands: DeployStateExecutionCommand[] = [ { type: "EXECUTION::START" }, @@ -85,4 +85,42 @@ describe("File based command journal", () => { assert.deepStrictEqual(readCommands, commands); }); + + it("should scope runs by chainId", async () => { + const hardhatNetworkJournal = new CommandJournal( + 31337, + tempCommandFilePath + ); + + const commands: DeployStateExecutionCommand[] = [ + { type: "EXECUTION::START" }, + ]; + + for (const command of commands) { + await hardhatNetworkJournal.record(command); + } + + const otherNetworkJournal = new CommandJournal(99999, tempCommandFilePath); + + const otherNetworkCommands: DeployStateExecutionCommand[] = []; + + for await (const readCommand of otherNetworkJournal.read()) { + otherNetworkCommands.push(readCommand); + } + + assert.deepStrictEqual(otherNetworkCommands, []); + + const laterHardhatNetworkJournal = new CommandJournal( + 31337, + tempCommandFilePath + ); + + const laterHardhatNetworkCommands: DeployStateExecutionCommand[] = []; + + for await (const readCommand of laterHardhatNetworkJournal.read()) { + laterHardhatNetworkCommands.push(readCommand); + } + + assert.deepStrictEqual(laterHardhatNetworkCommands, commands); + }); }); From 9874468ff2f035cbfd5dc6f6a4029da6d745ec40 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 19 Jan 2023 04:58:40 -0500 Subject: [PATCH 0214/1302] add catch to return on hold --- .../execution/dispatch/executeContractCall.ts | 8 +++- .../dispatch/executeContractDeploy.ts | 38 +++++++++++-------- .../dispatch/executeLibraryDeploy.ts | 36 +++++++++++------- .../src/execution/dispatch/executeSendETH.ts | 8 +++- 4 files changed, 59 insertions(+), 31 deletions(-) diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index da47358240..24ddaa16bc 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -34,7 +34,13 @@ export async function executeContractCall( }; } - await services.transactions.wait(txHash); + try { + await services.transactions.wait(txHash); + } catch { + return { + _kind: "hold", + }; + } return { _kind: "success", diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 7371980eda..0a9c5f4b63 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,4 +1,4 @@ -import { ContractFactory } from "ethers"; +import { ContractFactory, ethers } from "ethers"; import { ExecutionContext } from "types/deployment"; import { ContractDeploy } from "types/executionGraph"; @@ -12,6 +12,7 @@ export async function executeContractDeploy( resultAccumulator: ResultsAccumulator, { services, options }: ExecutionContext ): Promise { + let txHash: string; try { const resolve = resolveFrom(resultAccumulator); @@ -35,24 +36,31 @@ export async function executeContractDeploy( value, }); - const txHash = await services.contracts.sendTx(deployTransaction, options); - - const receipt = await services.transactions.wait(txHash); - - return { - _kind: "success", - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - value, - }, - }; + txHash = await services.contracts.sendTx(deployTransaction, options); } catch (err) { return { _kind: "failure", failure: err as any, }; } + + let receipt: ethers.providers.TransactionReceipt; + try { + receipt = await services.transactions.wait(txHash); + } catch { + return { + _kind: "hold", + }; + } + + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + value, + }, + }; } diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index fd2165b67a..bba6a3fae6 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,4 +1,4 @@ -import { ContractFactory } from "ethers"; +import { ContractFactory, ethers } from "ethers"; import { ExecutionContext } from "types/deployment"; import { LibraryDeploy } from "types/executionGraph"; @@ -12,6 +12,7 @@ export async function executeLibraryDeploy( resultAccumulator: ResultsAccumulator, { services, options }: ExecutionContext ): Promise { + let txHash: string; try { const resolvedArgs = args .map(resolveFrom(resultAccumulator)) @@ -23,23 +24,30 @@ export async function executeLibraryDeploy( const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - const txHash = await services.contracts.sendTx(deployTransaction, options); - - const receipt = await services.transactions.wait(txHash); - - return { - _kind: "success", - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }, - }; + txHash = await services.contracts.sendTx(deployTransaction, options); } catch (err) { return { _kind: "failure", failure: err as any, }; } + + let receipt: ethers.providers.TransactionReceipt; + try { + receipt = await services.transactions.wait(txHash); + } catch { + return { + _kind: "hold", + }; + } + + return { + _kind: "success", + result: { + name: artifact.contractName, + abi: artifact.abi, + bytecode: artifact.bytecode, + address: receipt.contractAddress, + }, + }; } diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts index 8aa58ea149..c4ea0442af 100644 --- a/packages/core/src/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -27,7 +27,13 @@ export async function executeSendETH( }; } - await services.transactions.wait(txHash); + try { + await services.transactions.wait(txHash); + } catch { + return { + _kind: "hold", + }; + } return { _kind: "success", From aa1cc56ce031d2a87527830a04d10e4568f0223e Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 19 Jan 2023 05:18:47 -0500 Subject: [PATCH 0215/1302] add test for new on hold case --- packages/core/test/execution/rerun.ts | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 7eaed0d927..ea5e7f6c2a 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -4,7 +4,9 @@ import { assert } from "chai"; import { ethers } from "ethers"; import { buildModule } from "dsl/buildModule"; +import { TransactionsService } from "services/TransactionsService"; import { Artifact } from "types/hardhat"; +import { Providers } from "types/providers"; import { Ignition } from "../../src/Ignition"; import { getMockServices } from "../helpers"; @@ -249,6 +251,30 @@ describe("Reruning execution", () => { "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); + + it("should return on hold if there is an error waiting for the tx hash to confirm", async () => { + myModule = buildModule("TxModule", (m) => { + const token = m.contract("Token", tokenArtifact); + + return { token }; + }); + + ignition = new Ignition({ + services: { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => tokenArtifact, + }, + transactions: new TransactionsService({} as Providers), + } as any, + journal: new MemoryCommandJournal(), + }); + + const [result] = await ignition.deploy(myModule, {} as any); + + assert.equal(result._kind, "hold"); + }); }); describe("when a deployment fails", () => { From 87f36b94afd399b4f50cc2445651b38b0a779b28 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 17 Jan 2023 11:27:47 +0000 Subject: [PATCH 0216/1302] fix: add guard for changed modules Only allow a rerun if the module is unchanged on the previous version. We intend to loosen this constraint in future, but for the moment we ban changes to modules between runs. The changes are calculated based on the structure of the execution graph. The serialization replacer was moved from the plugin into core to allow for the hashing check. --- examples/sample/ignition/LockModule.js | 8 +-- packages/core/package.json | 3 +- packages/core/src/Ignition.ts | 48 +++++++++++++++++ packages/core/src/deployment/Deployment.ts | 9 +++- .../core/src/deployment/deployStateReducer.ts | 6 +++ packages/core/src/execution/execute.ts | 6 ++- packages/core/src/execution/utils.ts | 7 +++ packages/core/src/index.ts | 2 + packages/core/src/types/deployment.ts | 8 ++- packages/core/src/utils/serialize.ts | 35 ++++++++++++ packages/core/test/execution/rerun.ts | 42 ++++++++++++++- packages/core/test/state-reducer/execution.ts | 7 +++ packages/hardhat-plugin/src/CommandJournal.ts | 25 ++------- .../hardhat-plugin/src/ignition-wrapper.ts | 12 +++-- .../components/ReconciliationFailedPanel.tsx | 24 +++++++++ .../src/ui/components/index.tsx | 5 ++ .../hardhat-plugin/src/ui/renderToCli.tsx | 54 ++++++++++++++++++- .../hardhat-plugin/test/CommandJournal.ts | 4 +- 18 files changed, 265 insertions(+), 40 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index 4a04affb27..e5b85d9cd2 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -1,14 +1,14 @@ // ./ignition/LockModule.js const { buildModule } = require("@ignored/hardhat-ignition"); -const currentTimestampInSeconds = Math.round(Date.now() / 1000); -const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; -const ONE_YEAR_IN_FUTURE = currentTimestampInSeconds + ONE_YEAR_IN_SECS; +const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); +const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", ONE_YEAR_IN_FUTURE); + const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); diff --git a/packages/core/package.json b/packages/core/package.json index 239ce9d9d7..68c4a8b59b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -76,6 +76,7 @@ "ethers": "^5.4.7", "fs-extra": "^10.0.0", "js-graph-algorithms": "1.0.18", - "object-hash": "^3.0.0" + "object-hash": "^3.0.0", + "serialize-error": "8.1.0" } } diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 6f3ed6e568..26802dc5a9 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -4,6 +4,7 @@ import { BigNumber } from "ethers"; import { Deployment } from "deployment/Deployment"; import { execute } from "execution/execute"; import { loadJournalInto } from "execution/loadJournalInto"; +import { hashExecutionGraph } from "execution/utils"; import { NoopCommandJournal } from "journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; @@ -15,6 +16,7 @@ import { ICommandJournal } from "types/journal"; import { Module, ModuleDict } from "types/module"; import { IgnitionPlan } from "types/plan"; import { SerializedFutureResult } from "types/serialization"; +import { IgnitionError } from "utils/errors"; import { isDependable } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; import { serializeFutureOutput } from "utils/serialize"; @@ -83,6 +85,15 @@ export class Ignition { // rebuild previous execution state based on journal await loadJournalInto(deployment, this._journal); + // check that safe to run based on changes + const moduleChangeResult = this._checkSafeDeployment(deployment); + + if (moduleChangeResult?._kind === "failure") { + await deployment.failReconciliation(); + + return [moduleChangeResult, {}]; + } + const executionResult = await execute(deployment, { maxRetries: options.maxRetries, gasIncrementPerRetry: options.gasIncrementPerRetry, @@ -211,4 +222,41 @@ export class Ignition { return Object.fromEntries(convertedEntries); } + + private _checkSafeDeployment( + deployment: Deployment + ): DeploymentResult | { _kind: "success" } { + if (deployment.state.transform.executionGraph === null) { + throw new IgnitionError( + "Execution graph must be set to check safe deployment" + ); + } + + const previousExecutionGraphHash = + deployment.state.execution.executionGraphHash; + + if (previousExecutionGraphHash === "") { + return { _kind: "success" }; + } + + const currentExecutionGraphHash = hashExecutionGraph( + deployment.state.transform.executionGraph + ); + + if (previousExecutionGraphHash === currentExecutionGraphHash) { + return { _kind: "success" }; + } + + return { + _kind: "failure", + failures: [ + "module change failure", + [ + new Error( + "The module has been modified since the last run. Delete the journal file to start again." + ), + ], + ], + }; + } } diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 5c9c076ef5..5ec3b5e8bc 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -94,9 +94,16 @@ export class Deployment { ); } - public startExecutionPhase() { + public failReconciliation() { + return this._runDeploymentCommand(`Reconciliation failed`, { + type: "RECONCILIATION_FAILED", + }); + } + + public startExecutionPhase(executionGraphHash: string) { return this._runDeploymentCommand("Starting Execution", { type: "EXECUTION::START", + executionGraphHash, }); } diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 911afc3127..2137234bb1 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -29,6 +29,7 @@ export function initializeDeployState(moduleName: string): DeployState { vertexes: {}, batch: null, previousBatches: [], + executionGraphHash: "", }, }; } @@ -73,6 +74,8 @@ export function deployStateReducer( ...state, transform: { executionGraph: action.executionGraph }, }; + case "RECONCILIATION_FAILED": + return { ...state, phase: "reconciliation-failed" }; case "EXECUTION::START": if (state.transform.executionGraph === null) { return state; @@ -81,6 +84,7 @@ export function deployStateReducer( const executionStateForRun = deployExecutionStateReducer( initialiseExecutionStateFrom( state.transform.executionGraph, + action.executionGraphHash, state.execution ), action @@ -115,6 +119,7 @@ export function deployStateReducer( function initialiseExecutionStateFrom( executionGraph: ExecutionGraph, + executionGraphHash: string, previousExecutionState: ExecutionState ): ExecutionState { const vertexes = Array.from(executionGraph.vertexes.keys()).reduce<{ @@ -133,6 +138,7 @@ function initialiseExecutionStateFrom( vertexes, batch: null, previousBatches: [], + executionGraphHash, }; return executionState; diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 82c05c1621..749972deee 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -13,7 +13,7 @@ import { IgnitionError } from "utils/errors"; import { ExecutionGraph } from "./ExecutionGraph"; import { executionDispatch } from "./dispatch/executionDispatch"; -import { allDependenciesCompleted } from "./utils"; +import { allDependenciesCompleted, hashExecutionGraph } from "./utils"; export async function execute( deployment: Deployment, @@ -37,7 +37,9 @@ export async function executeInBatches( executionVertexDispatcher: ExecutionVertexDispatcher, options: ExecutionOptions ): Promise { - await deployment.startExecutionPhase(); + const executionGraphHash = hashExecutionGraph(executionGraph); + + await deployment.startExecutionPhase(executionGraphHash); while (deployment.hasUnstarted()) { const batch = calculateNextBatch( diff --git a/packages/core/src/execution/utils.ts b/packages/core/src/execution/utils.ts index 19be6d55f2..2a9ef5cfc6 100644 --- a/packages/core/src/execution/utils.ts +++ b/packages/core/src/execution/utils.ts @@ -1,5 +1,8 @@ +import hash from "object-hash"; + import { ExecutionGraph } from "execution/ExecutionGraph"; import { getDependenciesFor } from "graph/adjacencyList"; +import { serializeReplacer } from "utils/serialize"; export function allDependenciesCompleted( vertexId: number, @@ -13,3 +16,7 @@ export function allDependenciesCompleted( return depenencies.every((vid) => completed.has(vid)); } + +export function hashExecutionGraph(executionGrpah: ExecutionGraph) { + return hash(JSON.parse(JSON.stringify(executionGrpah, serializeReplacer))); +} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index ac512299c3..408587b2b7 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,8 @@ export { buildModule } from "dsl/buildModule"; export { buildSubgraph } from "dsl/buildSubgraph"; export { viewExecutionResults } from "deployment/utils"; export { createServices } from "services/createServices"; +export { serializeReplacer } from "utils/serialize"; +export { IgnitionError } from "utils/errors"; export type { SerializedDeploymentResult, diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 2c3506e2bf..c51b863ac4 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -39,11 +39,13 @@ export type DeployPhase = | "complete" | "failed" | "hold" - | "validation-failed"; + | "validation-failed" + | "reconciliation-failed"; export type DeployStateExecutionCommand = | { type: "EXECUTION::START"; + executionGraphHash: string; } | { type: "EXECUTION::SET_BATCH"; @@ -69,6 +71,9 @@ export type DeployStateCommand = type: "TRANSFORM_COMPLETE"; executionGraph: IGraph; } + | { + type: "RECONCILIATION_FAILED"; + } | DeployStateExecutionCommand; export interface ValidationState { @@ -125,6 +130,7 @@ export interface ExecutionState { vertexes: { [key: number]: VertexExecutionState }; batch: Set | null; previousBatches: Array>; + executionGraphHash: string; } export interface DeployNetworkConfig { diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index 542c824039..d07768f131 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -1,3 +1,5 @@ +import { serializeError } from "serialize-error"; + import { FutureOutput, SerializedFutureResult } from "types/serialization"; export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { @@ -30,3 +32,36 @@ export function deserializeFutureOutput(x: any) { return x.value; } + +/** + * When stringifying core state, use this as the replacer. + */ +export function serializeReplacer(_key: string, value: unknown) { + if (value instanceof Set) { + return Array.from(value).sort(); + } + + if (value instanceof Map) { + return Object.fromEntries(value); + } + + if (typeof value === "bigint") { + return `${value.toString(10)}n`; + } + + if (value instanceof Error) { + return serializeError(new Error(value.message)); + } + + if (value instanceof Object && !(value instanceof Array)) { + const obj: any = value; + return Object.keys(obj) + .sort() + .reduce((sorted: any, key) => { + sorted[key] = obj[key]; + return sorted; + }, {}); + } + + return value; +} diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index ea5e7f6c2a..7edd51263e 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -339,7 +339,7 @@ describe("Reruning execution", () => { // Assert assert.equal(result._kind, "failure"); - // two calls sent + // one calls sent assert.equal( sentTransactionCount, 1, @@ -380,5 +380,45 @@ describe("Reruning execution", () => { "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); + + it("should error if the module has been changed", async () => { + // Arrange + const someModule = buildModule("MyModule", (m) => { + const token = m.contract("Token"); + + m.call(token, "configure", { args: [100] }); + + return { token }; + }); + + const modifiedModule = buildModule("MyModule", (m) => { + const token = m.contract("Token"); + + m.call(token, "configure", { args: [999] }); + + return { token }; + }); + + await ignition.deploy(someModule, {} as any); + + // Act + const [modifiedResult] = await ignition.deploy(modifiedModule, {} as any); + + // Assert + // the second transaction is not sent + assert.equal(sentTransactionCount, 1, "postconditition after rerun"); + + assert.deepStrictEqual(modifiedResult, { + _kind: "failure", + failures: [ + "module change failure", + [ + new Error( + "The module has been modified since the last run. Delete the journal file to start again." + ), + ], + ], + }); + }); }); }); diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index db60c109fe..2e925f4ceb 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -54,6 +54,7 @@ describe("deployment state reducer", () => { beforeEach(() => { state = deployStateReducer(state, { type: "EXECUTION::START", + executionGraphHash: "XXX", }); }); @@ -88,6 +89,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { type: "EXECUTION::SET_BATCH", @@ -107,6 +109,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { type: "EXECUTION::SET_BATCH", @@ -141,6 +144,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { type: "EXECUTION::SET_BATCH", @@ -174,6 +178,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { @@ -246,6 +251,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { @@ -294,6 +300,7 @@ describe("deployment state reducer", () => { state = applyActions(state, [ { type: "EXECUTION::START", + executionGraphHash: "XXX", }, { diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts index 2d3f02a224..3b9ecbbc7c 100644 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -1,11 +1,12 @@ import { DeployStateExecutionCommand, ICommandJournal, + serializeReplacer, } from "@ignored/ignition-core"; import { BigNumber } from "ethers"; import fs from "fs"; import ndjson from "ndjson"; -import { serializeError, deserializeError } from "serialize-error"; +import { deserializeError } from "serialize-error"; export class CommandJournal implements ICommandJournal { constructor(private _chainId: number, private _path: string) {} @@ -15,7 +16,7 @@ export class CommandJournal implements ICommandJournal { this._path, `${JSON.stringify( { chainId: this._chainId, ...command }, - this._serializeReplacer.bind(this) + serializeReplacer.bind(this) )}\n` ); } @@ -53,26 +54,6 @@ export class CommandJournal implements ICommandJournal { } } - private _serializeReplacer(_key: string, value: unknown) { - if (value instanceof Set) { - return Array.from(value); - } - - if (value instanceof Map) { - return Object.fromEntries(value); - } - - if (typeof value === "bigint") { - return `${value.toString(10)}n`; - } - - if (value instanceof Error) { - return serializeError(new Error(value.message)); - } - - return value; - } - private _deserializeReplace(_key: string, value: unknown) { if (typeof value === "string" && /^\d+n$/.test(value)) { return BigInt(value.substr(0, value.length - 1)); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 4494b31120..d4f9ccffc3 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -7,12 +7,13 @@ import { ModuleParams, createServices, ICommandJournal, + IgnitionError, } from "@ignored/ignition-core"; import { Contract, ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; -import { renderToCli } from "./ui/renderToCli"; +import { initializeRenderState, renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; @@ -44,7 +45,10 @@ export class IgnitionWrapper { const ignition = new Ignition({ services, uiRenderer: showUi - ? renderToCli(this._providers.config.parameters) + ? renderToCli( + initializeRenderState(), + this._providers.config.parameters + ) : undefined, journal: deployParams?.journal ? deployParams?.journal @@ -70,7 +74,7 @@ export class IgnitionWrapper { heldMessage += ` - ${vertex.label}\n`; } - throw new Error( + throw new IgnitionError( `Execution held for module '${ignitionModule.name}':\n\n${heldMessage}` ); } @@ -83,7 +87,7 @@ export class IgnitionWrapper { failuresMessage += ` - ${failure.message}\n`; } - throw new Error( + throw new IgnitionError( `Execution failed for module '${moduleId}':\n\n${failuresMessage}` ); } diff --git a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx new file mode 100644 index 0000000000..0164cdbeb2 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx @@ -0,0 +1,24 @@ +import { DeployState } from "@ignored/ignition-core"; +import { Box, Text } from "ink"; + +export const ReconciliationFailedPanel = ({ + deployState, +}: { + deployState: DeployState; +}) => { + return ( + + + Ignition cannot rerun the module{" "} + {deployState.details.moduleName}, it has been altered. + since the last run + + + + + Remove the journal file to restart the deployment from a clean state. + + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index fda1c9765b..532a43fa14 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,5 +1,6 @@ import type { DeployState, ModuleParams } from "@ignored/ignition-core"; +import { ReconciliationFailedPanel } from "./ReconciliationFailedPanel"; import { StartingPanel } from "./StartingPanel"; import { ValidationFailedPanel } from "./ValidationFailedPanel"; import { ExecutionPanel } from "./execution/ExecutionPanel"; @@ -22,6 +23,10 @@ export const IgnitionUi = ({ return ; } + if (deployState.phase === "reconciliation-failed") { + return ; + } + return ( ); diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index 661774e6d6..8f5a943683 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -7,8 +7,58 @@ import { render } from "ink"; import { IgnitionUi } from "./components"; -export function renderToCli(moduleParams?: ModuleParams): UpdateUiAction { +interface RenderState { + rerender: null | ((node: React.ReactNode) => void); + unmount: null | (() => void); + waitUntilExit: null | (() => Promise); + clear: null | (() => void); +} + +export function initializeRenderState(): RenderState { + return { + rerender: null, + unmount: null, + waitUntilExit: null, + clear: null, + }; +} + +export function renderToCli( + renderState: RenderState, + moduleParams?: ModuleParams +): UpdateUiAction { return (state: DeployState) => { - render(); + if (renderState.rerender === null) { + const { rerender, unmount, waitUntilExit, clear } = render( + , + { patchConsole: false } + ); + + renderState.rerender = rerender; + renderState.unmount = unmount; + renderState.waitUntilExit = waitUntilExit; + renderState.clear = clear; + + return; + } + + renderState.rerender( + + ); }; } + +export function unmountCli(state: RenderState): Promise { + if ( + state.unmount === null || + state.waitUntilExit === null || + state.clear === null + ) { + throw new Error("Cannot unmount with no unmount function"); + } + + state.clear(); + state.unmount(); + + return state.waitUntilExit(); +} diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index d3704feadf..77aca86f74 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -19,7 +19,7 @@ describe("File based command journal", () => { const journal = new CommandJournal(31337, tempCommandFilePath); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START" }, + { type: "EXECUTION::START", executionGraphHash: "XXX" }, { type: "EXECUTION::SET_BATCH", batch: [0, 1, 2, 3] }, { type: "EXECUTION::SET_VERTEX_RESULT", @@ -93,7 +93,7 @@ describe("File based command journal", () => { ); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START" }, + { type: "EXECUTION::START", executionGraphHash: "XXX" }, ]; for (const command of commands) { From fb664370053e47d39c04b65701045dab704e6c61 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 20 Jan 2023 14:12:21 +0000 Subject: [PATCH 0217/1302] fix: grammar mistake in rerun warning and docs changes (#119) * fix: update the warning message for reruns Remove the odd grammar. * docs: update rerun section Exclude explanation note on rerunning changed modules. --- docs/explanation.md | 33 +------------------ docs/running-a-deployment.md | 2 ++ examples/sample/ignition/LockModule.js | 3 +- .../components/ReconciliationFailedPanel.tsx | 4 +-- 4 files changed, 7 insertions(+), 35 deletions(-) diff --git a/docs/explanation.md b/docs/explanation.md index e811cffb1a..ff51abbd2b 100644 --- a/docs/explanation.md +++ b/docs/explanation.md @@ -87,7 +87,7 @@ Ignition keeps a journal of the execution. When a deployment fails, you can reru The Module API allows for waiting on an Ethereum `Event`, in this case the deployment will halt as _on hold_ if the `Event` has not occurred. Rerunning the Module will restart from the `Event` check. -### Modifying your Modules between deployments +### Modifying your Modules between deployments (TBD) You can modify your deployments between Ignition runs, for instance, when dealing with errors. This allows you to incrementally grow your system. @@ -95,37 +95,6 @@ Ignition will reconcile your modified Module with the `Actions` that are recorde The tracking and reconciling of `Actions` in previous runs is done automatically, but you can identify an `Action` explicity with an `id` to eliminate ambiguity. - - - - - - - - ---- - Next, dig deeper into defining modules: [Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 7db33aad79..1a8f5a5cde 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -111,4 +111,6 @@ A run of a deployment can succeed, fail or be on hold. A failed deployment or on Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Runs are scoped to the `chainId` of the network, so that runs against different networks do not interact. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `event` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. +> **NOTE**: Changes to modules between runs of a deployment are not currently supported + For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index e5b85d9cd2..710701af4d 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -12,6 +12,7 @@ module.exports = buildModule("LockModule", (m) => { const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); + const lock2 = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); - return { lock }; + return { lock, lock2 }; }); diff --git a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx index 0164cdbeb2..1135722752 100644 --- a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx @@ -10,8 +10,8 @@ export const ReconciliationFailedPanel = ({ Ignition cannot rerun the module{" "} - {deployState.details.moduleName}, it has been altered. - since the last run + {deployState.details.moduleName}, it has been altered + since the last run. From 83b9e65388bf6ebfc5f4e1d208be3741ed4e7bdb Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 20 Jan 2023 14:37:47 +0000 Subject: [PATCH 0218/1302] chore: bump version to v0.0.6 Update the packages versions and changelogs for the `0.0.6 - 2023-01-20` release. --- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/multisig/package.json | 2 +- examples/sample/package.json | 2 +- examples/uniswap/package.json | 2 +- packages/core/CHANGELOG.md | 12 ++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 12 ++++++++++++ packages/hardhat-plugin/package.json | 6 +++--- 9 files changed, 33 insertions(+), 9 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index c6f02c61f0..f32b1cd4a1 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.5" + "@ignored/hardhat-ignition": "^0.0.6" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 0b8fbf6b36..bcedb926e8 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.5", + "@ignored/hardhat-ignition": "^0.0.6", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 9b92c20a70..f1ce8c25e7 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.5", + "@ignored/hardhat-ignition": "^0.0.6", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index 7edbe31a65..269c3106be 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.5", + "@ignored/hardhat-ignition": "^0.0.6", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 3863790cfc..62fbd2e948 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.5", + "@ignored/hardhat-ignition": "^0.0.6", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b6412e8860..6c0cdf85c3 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.6 - 2023-01-20 + +### Added + +- Support rerunning deployments that errored or went to on-hold on a previous run ([#70](https://github.com/NomicFoundation/ignition/pull/70)) +- Support sending `ETH` to a contract without having to make a call/deploy ([#79](https://github.com/NomicFoundation/ignition/pull/79)) +- Confirm dialog on deploys to non-hardhat networks ([#95](https://github.com/NomicFoundation/ignition/issues/95)) + +### Changed + +- Rename the `awaitEvent` action in the api to `event` ([#108](https://github.com/NomicFoundation/ignition/issues/108)) + ## 0.0.5 - 2022-12-20 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 68c4a8b59b..aef13d8557 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.5", + "version": "0.0.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 3d47ae073b..ec7cddd703 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.6 - 2023-01-20 + +### Added + +- Support rerunning deployments that errored or went to on-hold on a previous run ([#70](https://github.com/NomicFoundation/ignition/pull/70)) +- Support sending `ETH` to a contract without having to make a call/deploy ([#79](https://github.com/NomicFoundation/ignition/pull/79)) +- Confirm dialog on deploys to non-hardhat networks ([#95](https://github.com/NomicFoundation/ignition/issues/95)) + +### Changed + +- Rename the `awaitEvent` action in the api to `event` ([#108](https://github.com/NomicFoundation/ignition/issues/108)) + ## 0.0.5 - 2022-12-20 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 73e661fdee..bfa744c25b 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.5", + "version": "0.0.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.5", + "@ignored/ignition-core": "^0.0.6", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -70,7 +70,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.5", + "@ignored/ignition-core": "^0.0.6", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 654d814d86e918ca213d04f5b2709b33c4625e17 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Thu, 26 Jan 2023 16:34:56 -0300 Subject: [PATCH 0219/1302] Fix typos --- docs/explanation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/explanation.md b/docs/explanation.md index ff51abbd2b..67b6c435c3 100644 --- a/docs/explanation.md +++ b/docs/explanation.md @@ -34,11 +34,11 @@ module.exports = buildModule("CounterModule", (m) => { The `moduleDefinition` callback receives a `moduleBuilder` object, which is used to define the different on-chain `Action`s that are needed to complete the deployment of the module, and returns the contracts it wants to export. -`moduleBuidler` methods don’t execute any `Action`, they record the intent and its relationship to other `Actions` and return a `Future` that represents the eventual result of its execution. +`moduleBuilder` methods don’t execute any `Action`, they record the intent and its relationship to other `Actions` and return a `Future` that represents the eventual result of its execution. In the above example, when we call `m.contract`, we create a contract deployment `Action`, and get a `Future` that represents its eventual result, the address the contract is deployed to. -`Actions` can depend on other `Action`'s results. We do this by using an `Action`'s `Future` as an argument to a subsequent `moduleBuidler` method. For example, here we define two `Actions`. One that deploys a contract, and another one that initializes it. +`Actions` can depend on other `Action`'s results. We do this by using an `Action`'s `Future` as an argument to a subsequent `moduleBuilder` method. For example, here we define two `Actions`. One that deploys a contract, and another one that initializes it. ```tsx module.exports = buildModule("ContractWithInitModule", (m) => { From 78045be4da05e2f9743fd51ad03a8f0636d1dcb6 Mon Sep 17 00:00:00 2001 From: Franco Victorio Date: Thu, 26 Jan 2023 16:44:02 -0300 Subject: [PATCH 0220/1302] Remove this and use sync version of readArtifact --- docs/creating-modules-for-deployment.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 0643106d0f..62afa051ea 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -110,7 +110,7 @@ m.call(uniswap, "swap", { ... }) To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as an optional second parameter: ```javascript -const artifact = await this.hre.artifacts.readArtifact("Foo"); +const artifact = hre.artifacts.readArtifactSync("Foo"); const userModule = buildModule("MyModule", (m) => { m.contract("Foo", artifact, { From 44ed36e7ceae1121ec6a484ce11aeaadc962f5ba Mon Sep 17 00:00:00 2001 From: Armando Andini Date: Tue, 24 Jan 2023 09:43:33 -0300 Subject: [PATCH 0221/1302] fix: typo in Readme.md --- docs/getting-started-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index ec7da5f066..8ffe2eb27d 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -117,7 +117,7 @@ npx hardhat deploy --network localhost LockModule.js ### Using the Module within Hardhat Tests -Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide the `./test/Lock.js` test file can be leverage **Ingition** by updating the `deployOneYearLockFixture` fixture: +Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide the `./test/Lock.js` test file can be leverage **Ignition** by updating the `deployOneYearLockFixture` fixture: ```js ... From 05afb5aa6cdb316e29d23bf9313409749c3faa48 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 31 Jan 2023 08:13:53 -0500 Subject: [PATCH 0222/1302] resolve event param arg to deployed contract --- .../src/execution/dispatch/executeDeployedContract.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index 36f42e2dc5..4b84c0f549 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -2,17 +2,23 @@ import { Services } from "services/types"; import { DeployedContract } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { resolveFrom, toAddress } from "./utils"; + export async function executeDeployedContract( { label, address, abi }: DeployedContract, _resultAccumulator: ResultsAccumulator, _: { services: Services } ): Promise { + const resolve = resolveFrom(_resultAccumulator); + + const resolvedAddress = toAddress(resolve(address)); + return { _kind: "success", result: { name: label, abi, - address, + address: resolvedAddress, }, }; } From 59aa3e19a5092372531f235813bd401d237c986d Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 31 Jan 2023 08:45:26 -0500 Subject: [PATCH 0223/1302] chore: bump version to v0.0.7 Update the packages versions and changelogs for the `0.0.7 - 2023-01-31` release. --- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/multisig/package.json | 2 +- examples/sample/package.json | 2 +- examples/uniswap/package.json | 2 +- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 6 ++++++ packages/hardhat-plugin/package.json | 6 +++--- 9 files changed, 21 insertions(+), 9 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index f32b1cd4a1..c4f905bd68 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.6" + "@ignored/hardhat-ignition": "^0.0.7" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index bcedb926e8..218be9a650 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.6", + "@ignored/hardhat-ignition": "^0.0.7", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index f1ce8c25e7..2059b4afef 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.6", + "@ignored/hardhat-ignition": "^0.0.7", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index 269c3106be..ef6f2c3632 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.6", + "@ignored/hardhat-ignition": "^0.0.7", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 62fbd2e948..cf91cae7aa 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.6", + "@ignored/hardhat-ignition": "^0.0.7", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6c0cdf85c3..2b3650a34e 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.7 - 2023-01-31 + +### Fixed + +- Resolve parameter args for deployed contracts during execution ([#125](https://github.com/NomicFoundation/ignition/pull/125)) + ## 0.0.6 - 2023-01-20 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index aef13d8557..8ed46e7577 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index ec7cddd703..ab5801709f 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.7 - 2023-01-31 + +### Fixed + +- Resolve parameter args for deployed contracts during execution ([#125](https://github.com/NomicFoundation/ignition/pull/125)) + ## 0.0.6 - 2023-01-20 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index bfa744c25b..92c4d5786d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.6", + "version": "0.0.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.6", + "@ignored/ignition-core": "^0.0.7", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -70,7 +70,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.6", + "@ignored/ignition-core": "^0.0.7", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 280c9882a5b1160ea521ad5b85ab9d6431e602f0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 09:34:47 +0000 Subject: [PATCH 0224/1302] feat: specify module by path (#142) * refactor(plugin): load only one module This is a constraint, so lets make it explicit that you can only load one module at a time. Previously loading multiple modules at once made sense, but it cannot be supported with the current journal setup. * feat: allow relative path to module At the cli, allow the relative path to the module to be given (rather than just the name). This allows the user to leverage shell completions to the file. The module file must be within the modules folder still. Fixes #102. * error -> ignition error --------- Co-authored-by: Zoey --- docs/getting-started-guide.md | 4 +- docs/running-a-deployment.md | 4 +- packages/hardhat-plugin/src/index.ts | 52 +++++------- packages/hardhat-plugin/src/load-module.ts | 85 +++++++++++++++++++ packages/hardhat-plugin/src/user-modules.ts | 73 ---------------- .../user-modules/ignition/TestModule.js | 3 +- packages/hardhat-plugin/test/load-module.ts | 50 +++++++++++ packages/hardhat-plugin/test/plan/index.ts | 2 +- packages/hardhat-plugin/test/user-modules.ts | 65 -------------- 9 files changed, 161 insertions(+), 177 deletions(-) create mode 100644 packages/hardhat-plugin/src/load-module.ts delete mode 100644 packages/hardhat-plugin/src/user-modules.ts create mode 100644 packages/hardhat-plugin/test/load-module.ts delete mode 100644 packages/hardhat-plugin/test/user-modules.ts diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 8ffe2eb27d..cf5f744ca3 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -84,10 +84,10 @@ module.exports = buildModule("LockModule", (m) => { Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): ```bash -npx hardhat deploy LockModule.js +npx hardhat deploy LockModule ``` -A relative path to a file containing module parameters can be passed as a flag at the command line: +A file containing module parameters can be passed as a flag at the command line: ```json // ignition/LockModule.config.json diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 1a8f5a5cde..c10f183117 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -20,7 +20,7 @@ Once you have built and tested your deployment module, it is time to deploy it! The `plan` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): ```bash -npx hardhat plan ENS.js +npx hardhat plan ENS ``` Running `plan` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: @@ -38,7 +38,7 @@ If something in your deployment isn't behaving the way you expected, the `plan` Deploying a module is done using the **Ignition** deploy task: ```sh -npx hardhat deploy LockModule.js +npx hardhat deploy LockModule ``` Module parameters can be passed as a `json` string to the `parameters` flag: diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 8183f8fcf1..90d67f8d71 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -9,8 +9,8 @@ import prompts from "prompts"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionWrapper } from "./ignition-wrapper"; +import { loadModule } from "./load-module"; import { Renderer } from "./plan"; -import { loadUserModules, loadAllUserModules } from "./user-modules"; import "./type-extensions"; export { buildSubgraph, buildModule } from "@ignored/ignition-core"; @@ -78,7 +78,7 @@ extendEnvironment((hre) => { }); task("deploy") - .addOptionalVariadicPositionalParam("userModulesPaths") + .addPositionalParam("moduleNameOrPath") .addOptionalParam( "parameters", "A JSON object as a string, of the module parameters, or a relative path to a JSON file" @@ -86,9 +86,9 @@ task("deploy") .setAction( async ( { - userModulesPaths = [], + moduleNameOrPath, parameters: parametersInput, - }: { userModulesPaths: string[]; parameters?: string }, + }: { moduleNameOrPath: string; parameters?: string }, hre ) => { if (hre.network.name !== "hardhat") { @@ -113,23 +113,16 @@ task("deploy") await hre.run("compile", { quiet: true }); - let userModules: Array>; - if (userModulesPaths.length === 0) { - userModules = loadAllUserModules(hre.config.paths.ignition); - } else { - userModules = loadUserModules( - hre.config.paths.ignition, - userModulesPaths - ); - } + const userModule: Module | undefined = loadModule( + hre.config.paths.ignition, + moduleNameOrPath + ); - if (userModules.length === 0) { + if (userModule === undefined) { console.warn("No Ignition modules found"); process.exit(0); } - const [userModule] = userModules; - let parameters: ModuleParams | undefined; if (parametersInput === undefined) { parameters = resolveParametersFromModuleName( @@ -163,37 +156,30 @@ task("deploy") task("plan") .addFlag("quiet", "Disables logging output path to terminal") - .addOptionalVariadicPositionalParam("userModulesPaths") + .addPositionalParam("moduleNameOrPath") .setAction( async ( { quiet = false, - userModulesPaths = [], - }: { quiet: boolean; userModulesPaths: string[] }, + moduleNameOrPath, + }: { quiet: boolean; moduleNameOrPath: string }, hre ) => { await hre.run("compile", { quiet: true }); - let userModules: Array>; - if (userModulesPaths.length === 0) { - userModules = loadAllUserModules(hre.config.paths.ignition); - } else { - userModules = loadUserModules( - hre.config.paths.ignition, - userModulesPaths - ); - } + const userModule: Module | undefined = loadModule( + hre.config.paths.ignition, + moduleNameOrPath + ); - if (userModules.length === 0) { + if (userModule === undefined) { console.warn("No Ignition modules found"); process.exit(0); } - const [module] = userModules; - - const plan = await hre.ignition.plan(module); + const plan = await hre.ignition.plan(userModule); - const renderer = new Renderer(module.name, plan, { + const renderer = new Renderer(userModule.name, plan, { cachePath: hre.config.paths.cache, network: { name: hre.network.name, diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts new file mode 100644 index 0000000000..50f3c3c8a5 --- /dev/null +++ b/packages/hardhat-plugin/src/load-module.ts @@ -0,0 +1,85 @@ +import { IgnitionError, Module, ModuleDict } from "@ignored/ignition-core"; +import setupDebug from "debug"; +import fsExtra from "fs-extra"; +import path from "path"; + +const debug = setupDebug("hardhat-ignition:modules"); + +export function loadModule( + modulesDirectory: string, + moduleNameOrPath: string +): Module | undefined { + debug(`Loading user modules from '${modulesDirectory}'`); + + if (!fsExtra.existsSync(modulesDirectory)) { + throw new IgnitionError(`Directory ${modulesDirectory} not found.`); + } + + const fullpathToModule = resolveFullPathToModule( + modulesDirectory, + moduleNameOrPath + ); + + if (fullpathToModule === undefined) { + throw new IgnitionError(`Could not find module ${moduleNameOrPath}`); + } + + if (!isInModuleDirectory(modulesDirectory, fullpathToModule)) { + throw new IgnitionError( + `The referenced module ${moduleNameOrPath} is outside the module directory ${modulesDirectory}` + ); + } + + debug(`Loading module file '${fullpathToModule}'`); + + const module = require(fullpathToModule); + + return module; +} + +function resolveFullPathToModule( + modulesDirectory: string, + moduleNameOrPath: string +): string | undefined { + const pathToModule = path.resolve(moduleNameOrPath); + if (fsExtra.pathExistsSync(pathToModule)) { + return pathToModule; + } + + const relativeToModules = path.resolve(modulesDirectory, moduleNameOrPath); + if (fsExtra.pathExistsSync(relativeToModules)) { + return relativeToModules; + } + + const relativeToModulesWithJsExtension = path.resolve( + modulesDirectory, + `${moduleNameOrPath}.js` + ); + if (fsExtra.pathExistsSync(relativeToModulesWithJsExtension)) { + return relativeToModulesWithJsExtension; + } + + const relativeToModulesWithTsExtension = path.resolve( + modulesDirectory, + `${moduleNameOrPath}.ts` + ); + if (fsExtra.pathExistsSync(relativeToModulesWithTsExtension)) { + return relativeToModulesWithTsExtension; + } + + return undefined; +} + +function isInModuleDirectory(modulesDirectory: string, modulePath: string) { + const resolvedModulesDirectory = path.resolve(modulesDirectory); + const moduleRelativeToModuleDir = path.relative( + resolvedModulesDirectory, + modulePath + ); + + return ( + Boolean(moduleRelativeToModuleDir) && + !moduleRelativeToModuleDir.startsWith("..") && + !path.isAbsolute(moduleRelativeToModuleDir) + ); +} diff --git a/packages/hardhat-plugin/src/user-modules.ts b/packages/hardhat-plugin/src/user-modules.ts deleted file mode 100644 index 4644fd2220..0000000000 --- a/packages/hardhat-plugin/src/user-modules.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { Module, ModuleDict } from "@ignored/ignition-core"; -import setupDebug from "debug"; -import fsExtra from "fs-extra"; -import path from "path"; - -const debug = setupDebug("hardhat-ignition:modules"); - -export function loadAllUserModules( - userModulesDirectory: string -): Array> { - debug(`Loading all user modules from '${userModulesDirectory}'`); - - if (!fsExtra.existsSync(userModulesDirectory)) { - throw new Error(`Directory ${userModulesDirectory} not found.`); - } - - const resolvedUserModulesPaths = getAllUserModulesPaths(userModulesDirectory); - - return getUserModulesFromPaths(resolvedUserModulesPaths); -} - -export function loadUserModules( - userModulesDirectory: string, - userModulesFiles: string[] = [] -): Array> { - debug(`Loading user modules from '${userModulesDirectory}'`); - - if (!fsExtra.existsSync(userModulesDirectory)) { - throw new Error(`Directory ${userModulesDirectory} not found.`); - } - - const resolvedUserModulesPaths = getUserModulesPaths( - userModulesDirectory, - userModulesFiles - ); - - return getUserModulesFromPaths(resolvedUserModulesPaths); -} - -export function getUserModulesFromPaths( - resolvedUserModulesPaths: string[] -): Array> { - debug(`Loading '${resolvedUserModulesPaths.length}' module files`); - - const userModules: any[] = []; - for (const pathToFile of resolvedUserModulesPaths) { - const fileExists = fsExtra.pathExistsSync(pathToFile); - if (!fileExists) { - throw new Error(`Module ${pathToFile} doesn't exist`); - } - - debug(`Loading module file '${pathToFile}'`); - - const userModule = require(pathToFile); - userModules.push(userModule.default ?? userModule); - } - - return userModules; -} - -export function getUserModulesPaths( - userModulesDirectory: string, - userModulesFiles: string[] -): string[] { - return userModulesFiles.map((x) => path.resolve(userModulesDirectory, x)); -} - -export function getAllUserModulesPaths(userModulessDirectory: string) { - return fsExtra - .readdirSync(userModulessDirectory) - .filter((x) => !x.startsWith(".")) - .map((x) => path.resolve(userModulessDirectory, x)); -} diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js index b270e39495..9da83b38b8 100644 --- a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js @@ -1,4 +1,5 @@ // eslint-disable-next-line import/no-unused-modules module.exports = { - id: "testing123", + name: "testing123", + action: () => {}, }; diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts new file mode 100644 index 0000000000..9641e95fcb --- /dev/null +++ b/packages/hardhat-plugin/test/load-module.ts @@ -0,0 +1,50 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { loadModule } from "../src/load-module"; + +import { useEnvironment } from "./useEnvironment"; + +describe("loadModule", function () { + useEnvironment("user-modules"); + + it("should return the module given the module name", () => { + const module = loadModule("ignition", "TestModule"); + + assert.isDefined(module); + assert.equal(module.name, "testing123"); + }); + + it("should return the module given the module name and extension", () => { + const module = loadModule("ignition", "TestModule.js"); + + assert.isDefined(module); + assert.equal(module.name, "testing123"); + }); + + it("should throw if the module name does not exist", () => { + assert.throws(() => loadModule("ignition", "Fake")); + }); + + it("should throw if the module name with extension does not exist", () => { + assert.throws(() => loadModule("ignition", "Fake.js")); + }); + + it("should throw if the full path to the module does not exist", () => { + assert.throws(() => loadModule("ignition", "./ignition/Fake.js")); + }); + + it("should throw if the full path to the module is outside the module directory", () => { + assert.throws( + () => loadModule("contracts", "./ignition/TestModule.js"), + `The referenced module ./ignition/TestModule.js is outside the module directory contracts` + ); + }); + + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadModule("/fake", "AFile.js"), + `Directory /fake not found.` + ); + }); +}); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 0709a1e7ae..90c9b302e8 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -15,7 +15,7 @@ describe("plan", () => { await this.hre.run("compile", { quiet: true }); await this.hre.run("plan", { quiet: true, - userModulesPaths: ["MyModule.js"], + moduleNameOrPath: "MyModule.js", }); const files = await fs.readdir(planPath); diff --git a/packages/hardhat-plugin/test/user-modules.ts b/packages/hardhat-plugin/test/user-modules.ts deleted file mode 100644 index 357348749e..0000000000 --- a/packages/hardhat-plugin/test/user-modules.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { - loadUserModules, - loadAllUserModules, - getUserModulesFromPaths, - getUserModulesPaths, - getAllUserModulesPaths, -} from "../src/user-modules"; - -import { useEnvironment } from "./useEnvironment"; - -describe("User modules", function () { - useEnvironment("user-modules"); - - describe("loadUserModules", function () { - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadUserModules("/fake", []), - `Directory /fake not found.` - ); - }); - }); - - describe("loadAllUserModuless", function () { - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadAllUserModules("/fake"), - `Directory /fake not found.` - ); - }); - }); - - describe("getAllUserModulessPaths", function () { - it("should return file paths for all user modules in a given directory", () => { - const paths = getAllUserModulesPaths("ignition"); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestModule.js")); - }); - }); - - describe("getUserModulesPaths", function () { - it("should return file paths for the given user module files", () => { - const paths = getUserModulesPaths("ignition", ["TestModule.js"]); - - assert.equal(paths.length, 1); - assert(paths[0].endsWith("TestModule.js")); - }); - }); - - describe("getUserModulesFromPaths", function () { - it("should return a user module from a given path", () => { - const paths = getUserModulesPaths("ignition", ["TestModule.js"]); - const modules = getUserModulesFromPaths(paths); - - assert.equal(modules.length, 1); - }); - - it("should throw if given a file that does not exist", () => { - assert.throws(() => getUserModulesFromPaths(["/fake"])); - }); - }); -}); From 38d87dc34e97d24b733231377a993e0631c99c5d Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 09:35:41 +0000 Subject: [PATCH 0225/1302] refactor(config): rename config to `gasPriceIncrementPerRetry` (#143) * docs: separate out config option sections Split out the transaction retry configs into one section each. Update the gasIncrementPerRetry example to be explicitly in gwei. * refactor: rename config to `gasPriceIncrementPerRetry` To minimise confusion `gasIncrementPerRetry` has been renamed to `gasPriceIncrementPerRetry`. Resolves #113. --- docs/configuration.md | 2 +- docs/running-a-deployment.md | 22 +++++++++++-------- packages/core/src/Ignition.ts | 4 ++-- .../core/src/services/ContractsService.ts | 10 +++++---- packages/core/src/services/types.ts | 2 +- packages/core/src/types/deployment.ts | 2 +- packages/core/test/contractsService.ts | 2 +- packages/hardhat-plugin/src/index.ts | 6 ++--- packages/hardhat-plugin/test/config.ts | 6 ++--- .../with-config/hardhat.config.js | 2 +- 10 files changed, 32 insertions(+), 26 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index ff3cc168f1..cf44696fef 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -5,7 +5,7 @@ Config options: Global config: - maxRetries: number -- gasIncrementPerRetry: BigNumber +- gasPriceIncrementPerRetry: BigNumber - Increments gasPrice if legacy tx - Increments maxPriorityFeePerGas otherwise - ** proposal ** currently incrementing maxFeePerGas as well, but maybe should remove that. diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index c10f183117..6c630f4b8b 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -60,7 +60,7 @@ There are currently some configurable options you can add to your Hardhat config ```tsx interface IgnitionConfig { maxRetries: number; - gasIncrementPerRetry: BigNumber | null; + gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; // milliseconds eventDuration: number; // milliseconds } @@ -74,7 +74,7 @@ const { ethers } = require("ethers"); module.exports = { ignition: { maxRetries: 10, - gasIncrementPerRetry: ethers.utils.parseUnits("0.001"), + gasPriceIncrementPerRetry: ethers.utils.parseUnits("5", "gwei"), pollingInterval: 300, eventDuration: 10000, }, @@ -83,26 +83,30 @@ module.exports = { --- -`maxRetries`, `gasIncrementPerRetry`, and `pollingInterval` +#### `maxRetries` + +The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) --- -These config values control how **Ignition** retries transactions that are taking too long to confirm. +#### `gasPriceIncrementPerRetry` -The value of `maxRetries` is the number of times an unconfirmed transaction will be retried before considering it failed. (default value is 4) +The value of `gasPriceIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if the given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. + +--- -The value of `gasIncrementPerRetry` must be an `ethers.BigNumber` and is assumed to be in wei units. This value will be added to the previous transactions gas price on each subsequent retry. However, if not given or if the given value is `null`, then the default logic will run which adds 10% of the previous transactions gas price on each retry. +#### `pollingInterval` The value of `pollingInterval` is the number of milliseconds the process will wait between polls when checking if the transaction has been confirmed yet. The default value is 300 milliseconds. --- -`eventDuration` - ---- +#### `eventDuration` This config value determines how long `m.event` waits for the given event to be emitted on-chain before marking the deployment as "on-hold". It should be given as a number of milliseconds, with the default value being 30000, or 30 seconds. +--- + ## Resuming a failed or onhold deployment A run of a deployment can succeed, fail or be on hold. A failed deployment or one that is on hold, assuming it was run against a non-ephemeral network, can be rerun using the deploy command: diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 26802dc5a9..fb9abd4343 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -28,7 +28,7 @@ export interface IgnitionDeployOptions { txPollingInterval: number; networkName: string; maxRetries: number; - gasIncrementPerRetry: BigNumber | null; + gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; } @@ -96,7 +96,7 @@ export class Ignition { const executionResult = await execute(deployment, { maxRetries: options.maxRetries, - gasIncrementPerRetry: options.gasIncrementPerRetry, + gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, pollingInterval: options.pollingInterval, eventDuration: options.eventDuration, }); diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index b99d185109..6e6e0c82a9 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -87,7 +87,7 @@ export class ContractsService implements IContractsService { signer, txSent, txHash, - txOptions.gasIncrementPerRetry + txOptions.gasPriceIncrementPerRetry ); blockNumberWhenSent = @@ -110,7 +110,7 @@ export class ContractsService implements IContractsService { _signer: IgnitionSigner, previousTxRequest: ethers.providers.TransactionRequest, previousTxHash: string, - gasIncrementPerRetry: ethers.BigNumber | null + gasPriceIncrementPerRetry: ethers.BigNumber | null ): Promise { const previousTx = await this._providers.web3Provider.getTransaction( previousTxHash @@ -122,8 +122,10 @@ export class ContractsService implements IContractsService { if (previousTx.gasPrice !== undefined) { // Increase 10%, and add 1 to be sure it's at least rounded up // or add by user's config value if present - const newGasPrice = gasIncrementPerRetry - ? ethers.BigNumber.from(previousTx.gasPrice).add(gasIncrementPerRetry) + const newGasPrice = gasPriceIncrementPerRetry + ? ethers.BigNumber.from(previousTx.gasPrice).add( + gasPriceIncrementPerRetry + ) : ethers.BigNumber.from(previousTx.gasPrice) .mul(110000) .div(100000) diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index ded01529d5..8662ad99ba 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -10,7 +10,7 @@ export interface TransactionOptions { gasLimit?: ethers.BigNumberish; gasPrice?: ethers.BigNumberish; maxRetries: number; - gasIncrementPerRetry: ethers.BigNumber | null; + gasPriceIncrementPerRetry: ethers.BigNumber | null; pollingInterval: number; } diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index c51b863ac4..caf573d26d 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -151,7 +151,7 @@ export interface DeployState { export interface ExecutionOptions { maxRetries: number; - gasIncrementPerRetry: BigNumber | null; + gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; } diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index 712cdae3ef..5ba3eaccaa 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -79,7 +79,7 @@ describe("ContractsService", function () { await assert.isRejected( contractsService.sendTx(fakeTx, { maxRetries: 4, - gasIncrementPerRetry: null, + gasPriceIncrementPerRetry: null, pollingInterval: 10, }), /Transaction not confirmed within max retry limit/ diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 90d67f8d71..2b049293e8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -17,7 +17,7 @@ export { buildSubgraph, buildModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; - gasIncrementPerRetry: BigNumber | null; + gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; } @@ -51,8 +51,8 @@ extendConfig((config, userConfig) => { config.ignition = { maxRetries: userIgnitionConfig.maxRetries ?? MAX_RETRIES, - gasIncrementPerRetry: - userIgnitionConfig.gasIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, + gasPriceIncrementPerRetry: + userIgnitionConfig.gasPriceIncrementPerRetry ?? GAS_INCREMENT_PER_RETRY, pollingInterval: userIgnitionConfig.pollingInterval ?? POLLING_INTERVAL, eventDuration: userIgnitionConfig.eventDuration ?? AWAIT_EVENT_DURATION, }; diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 2447edb920..244feb72cb 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -54,7 +54,7 @@ describe("config", () => { assert.equal(sendTxOptions.maxRetries, 1); }); - it("should apply gasIncrementPerRetry", async function () { + it("should apply gasPriceIncrementPerRetry", async function () { await deployModule(this.hre, (m) => { m.contract("Bar"); @@ -63,8 +63,8 @@ describe("config", () => { const sendTxOptions = sendTxStub.getCalls()[0].lastArg; - assert(BigNumber.isBigNumber(sendTxOptions.gasIncrementPerRetry)); - assert(BigNumber.from(sendTxOptions.gasIncrementPerRetry).eq(1000)); + assert(BigNumber.isBigNumber(sendTxOptions.gasPriceIncrementPerRetry)); + assert(BigNumber.from(sendTxOptions.gasPriceIncrementPerRetry).eq(1000)); }); it("should apply pollingInterval", async function () { diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index 599d1f21b9..f6cf497d06 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -12,7 +12,7 @@ module.exports = { }, ignition: { maxRetries: 1, - gasIncrementPerRetry: BigNumber.from(1000), + gasPriceIncrementPerRetry: BigNumber.from(1000), pollingInterval: 4, eventDuration: 10000, }, From 8fa7fc95f3d947b3fff45d089ece848924cf12e5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 09:48:23 +0000 Subject: [PATCH 0226/1302] docs(quick-start): make LockModule time agnostic The LockModule as taken from the HH quickstart changes the input time based on the time it is run. This was taken over but causes an issue on rerunning a deployment as the one of the module parameters has changed. The sample project was previously changed to use a specific time in the example, this commit applies the same change to the quick start guide. Fixes #133. --- docs/getting-started-guide.md | 14 +++++++------- examples/sample/ignition/LockModule.js | 3 +-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index cf5f744ca3..f108ba9fa7 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -63,14 +63,14 @@ Add a deployment module under the `./ignition` folder for the example `Lock.sol` // ./ignition/LockModule.js const { buildModule } = require("@ignored/hardhat-ignition"); -const currentTimestampInSeconds = Math.round(Date.now() / 1000); -const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; -const ONE_YEAR_IN_FUTURE = currentTimestampInSeconds + ONE_YEAR_IN_SECS; +const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); +const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", ONE_YEAR_IN_FUTURE); + const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); @@ -97,13 +97,13 @@ A file containing module parameters can be passed as a flag at the command line: ``` ```bash -npx hardhat deploy --parameters ignition/LockModule.config.json LockModule.js +npx hardhat deploy --parameters ignition/LockModule.config.json LockModule ``` Parameters can also be passed at the command line via a json string: ```bash -npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule.js +npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule # Ensure you have properly escaped the json string ``` @@ -112,7 +112,7 @@ To deploy against a specific network pass it on the command line, for instance t ```bash npx hardhat node # in another terminal -npx hardhat deploy --network localhost LockModule.js +npx hardhat deploy --network localhost LockModule ``` ### Using the Module within Hardhat Tests diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index 710701af4d..e5b85d9cd2 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -12,7 +12,6 @@ module.exports = buildModule("LockModule", (m) => { const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); - const lock2 = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); - return { lock, lock2 }; + return { lock }; }); From 1c9ffc7bc4ea110598492affb22c7a50fa9d167c Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 10:42:12 +0000 Subject: [PATCH 0227/1302] fix(plugin): pass module params to ui --- packages/hardhat-plugin/src/ignition-wrapper.ts | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index d4f9ccffc3..8c472af137 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -45,10 +45,7 @@ export class IgnitionWrapper { const ignition = new Ignition({ services, uiRenderer: showUi - ? renderToCli( - initializeRenderState(), - this._providers.config.parameters - ) + ? renderToCli(initializeRenderState(), deployParams?.parameters) : undefined, journal: deployParams?.journal ? deployParams?.journal From da6cd5c241231b2a3ee117f3b2ffb68cf1fbcf67 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 12:32:27 +0000 Subject: [PATCH 0228/1302] chore: turn off ink ui in debug The ink ui suppresses logging display. Toggle the ink ui based on the presence of a `DEBUG` env variable. --- packages/hardhat-plugin/src/index.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 2b049293e8..74f5c3c728 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -22,6 +22,8 @@ export interface IgnitionConfig { eventDuration: number; } +const DISPLAY_UI = !Boolean(process.env.DEBUG); + /* ignition config defaults */ const IGNITION_DIR = "ignition"; const DEPLOYMENTS_DIR = "deployments"; @@ -144,12 +146,17 @@ task("deploy") await hre.ignition.deploy(userModule, { parameters, journalPath, - ui: true, + ui: DISPLAY_UI, }); - } catch { - // display of error or on hold is done - // based on state, thrown error can be ignored - process.exit(1); + } catch (err) { + if (DISPLAY_UI) { + // display of error or on hold is done + // based on state, thrown error display + // can be ignored + process.exit(1); + } else { + throw err; + } } } ); From 4a244241856ea712a2a9217fc703b7e91dc6483f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 12:37:59 +0000 Subject: [PATCH 0229/1302] fix: display unexpected errors General errors during transform were not being reported back, instead leaking out to the top level but not being shown. A top level handler has been added to the deploy process in ignition core that moves the phase to `failed-unexpectedly`. The cli has been modified to display errors in this state. A caveat to the general handling of unexpected errors is that any exception happening in the validation phase is treated as a validation error rather than an unexpected error. The top level ui display component has been refactored to show a type error if it is not covering all phases. Fixes #141. --- packages/core/src/Ignition.ts | 84 +++++++++++++------ packages/core/src/deployment/Deployment.ts | 10 +++ .../core/src/deployment/deployStateReducer.ts | 11 +++ packages/core/src/types/deployment.ts | 10 ++- .../src/validation/validateDeploymentGraph.ts | 38 ++++++--- .../test/state-reducer/preparation-steps.ts | 47 +++++++++-- .../ui/components/UnexpectedErrorPanel.tsx | 27 ++++++ .../src/ui/components/index.tsx | 30 ++++++- 8 files changed, 209 insertions(+), 48 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index fb9abd4343..f89a1dc8a8 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -67,41 +67,69 @@ export class Ignition { this._uiRenderer ); - const chainId = await this._services.network.getChainId(); - await deployment.setChainId(chainId); - await deployment.setNetworkName(options.networkName); + try { + const chainId = await this._services.network.getChainId(); + await deployment.setChainId(chainId); + await deployment.setNetworkName(options.networkName); - const { result: constructResult, moduleOutputs } = - await this._constructExecutionGraphFrom(deployment, ignitionModule); + const { result: constructResult, moduleOutputs } = + await this._constructExecutionGraphFrom(deployment, ignitionModule); - if (constructResult._kind === "failure") { - return [constructResult, {}]; - } + if (constructResult._kind === "failure") { + log("Failed to construct execution graph"); + return [constructResult, {}]; + } - await deployment.transformComplete(constructResult.executionGraph); + log("Execution graph constructed"); + await deployment.transformComplete(constructResult.executionGraph); - log("Execute based on execution graph"); + // rebuild previous execution state based on journal + log("Load journal entries for network"); + await loadJournalInto(deployment, this._journal); - // rebuild previous execution state based on journal - await loadJournalInto(deployment, this._journal); + // check that safe to run based on changes + log("Reconciling previous runs with current module"); + const moduleChangeResult = this._checkSafeDeployment(deployment); - // check that safe to run based on changes - const moduleChangeResult = this._checkSafeDeployment(deployment); + if (moduleChangeResult?._kind === "failure") { + log("Failed to reconcile"); + await deployment.failReconciliation(); - if (moduleChangeResult?._kind === "failure") { - await deployment.failReconciliation(); + return [moduleChangeResult, {}]; + } - return [moduleChangeResult, {}]; - } + log("Execute based on execution graph"); + const executionResult = await execute(deployment, { + maxRetries: options.maxRetries, + gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, + pollingInterval: options.pollingInterval, + eventDuration: options.eventDuration, + }); - const executionResult = await execute(deployment, { - maxRetries: options.maxRetries, - gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, - pollingInterval: options.pollingInterval, - eventDuration: options.eventDuration, - }); + return this._buildOutputFrom(executionResult, moduleOutputs); + } catch (err) { + if (!(err instanceof Error)) { + const unexpectedError = new IgnitionError("Unexpected error"); + + await deployment.failUnexpected([unexpectedError]); + return [ + { + _kind: "failure", + failures: ["Unexpected error", [unexpectedError]], + }, + {}, + ]; + } - return this._buildOutputFrom(executionResult, moduleOutputs); + await deployment.failUnexpected([err]); + return [ + { + _kind: "failure", + failures: ["Unexpected error", [err]], + }, + {}, + ]; + } } public async plan( @@ -169,6 +197,12 @@ export class Ignition { deployment.services ); + if (transformResult._kind === "failure") { + await deployment.failUnexpected(transformResult.failures[1]); + + return { result: transformResult, moduleOutputs }; + } + return { result: transformResult, moduleOutputs }; } diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 5ec3b5e8bc..dc41164862 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -94,6 +94,16 @@ export class Deployment { ); } + public failUnexpected(errors: Error[]) { + return this._runDeploymentCommand( + [`Failure from unexpected errors`, errors], + { + type: "UNEXPECTED_FAIL", + errors, + } + ); + } + public failReconciliation() { return this._runDeploymentCommand(`Reconciliation failed`, { type: "RECONCILIATION_FAILED", diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 2137234bb1..8c0b04b41f 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -31,6 +31,9 @@ export function initializeDeployState(moduleName: string): DeployState { previousBatches: [], executionGraphHash: "", }, + unexpected: { + errors: [], + }, }; } @@ -76,6 +79,14 @@ export function deployStateReducer( }; case "RECONCILIATION_FAILED": return { ...state, phase: "reconciliation-failed" }; + case "UNEXPECTED_FAIL": + return { + ...state, + phase: "failed-unexpectedly", + unexpected: { + errors: action.errors, + }, + }; case "EXECUTION::START": if (state.transform.executionGraph === null) { return state; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index caf573d26d..dbbdc9f985 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -40,7 +40,8 @@ export type DeployPhase = | "failed" | "hold" | "validation-failed" - | "reconciliation-failed"; + | "reconciliation-failed" + | "failed-unexpectedly"; export type DeployStateExecutionCommand = | { @@ -74,6 +75,10 @@ export type DeployStateCommand = | { type: "RECONCILIATION_FAILED"; } + | { + type: "UNEXPECTED_FAIL"; + errors: Error[]; + } | DeployStateExecutionCommand; export interface ValidationState { @@ -147,6 +152,9 @@ export interface DeployState { executionGraph: IGraph | null; }; execution: ExecutionState; + unexpected: { + errors: Error[]; + }; } export interface ExecutionOptions { diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts index 477257127a..32a9462b79 100644 --- a/packages/core/src/validation/validateDeploymentGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -3,21 +3,39 @@ import { visit } from "graph/visit"; import { Services } from "services/types"; import { IDeploymentGraph } from "types/deploymentGraph"; import { VertexVisitResult, VisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; import { validationDispatch } from "./dispatch/validationDispatch"; -export function validateDeploymentGraph( +export async function validateDeploymentGraph( deploymentGraph: IDeploymentGraph, services: Services ): Promise { - const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); + try { + const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); - return visit( - "Validation", - orderedVertexIds, - deploymentGraph, - { services }, - new Map(), - validationDispatch - ); + return await visit( + "Validation", + orderedVertexIds, + deploymentGraph, + { services }, + new Map(), + validationDispatch + ); + } catch (err) { + if (!(err instanceof Error)) { + return { + _kind: "failure", + failures: [ + "Unsuccessful module validation", + [new IgnitionError("Unknown validation error")], + ], + }; + } + + return { + _kind: "failure", + failures: ["Unsuccessful module validation", [err]], + }; + } } diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts index d3fd1007b6..6e021abfa9 100644 --- a/packages/core/test/state-reducer/preparation-steps.ts +++ b/packages/core/test/state-reducer/preparation-steps.ts @@ -7,6 +7,7 @@ import { } from "deployment/deployStateReducer"; import { buildModule } from "dsl/buildModule"; import { DeployState } from "types/deployment"; +import { IExecutionGraph } from "types/executionGraph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; @@ -85,8 +86,10 @@ describe("deployment state reducer", () => { }); describe("transform", () => { + let exampleExecutionGraph: IExecutionGraph; + beforeEach(async () => { - const exampleExecutionGraph = await resolveExecutionGraphFor( + exampleExecutionGraph = await resolveExecutionGraphFor( buildModule("TokenModule", (m) => { const token = m.contract("Token"); @@ -106,16 +109,44 @@ describe("deployment state reducer", () => { { type: "START_VALIDATION", }, - { - type: "TRANSFORM_COMPLETE", - executionGraph: exampleExecutionGraph, - }, ]); }); - it("should set the execution graph", () => { - assert.isDefined(state.transform.executionGraph); - assert.equal(state.transform.executionGraph.vertexes.size, 1); + describe("completion", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "TRANSFORM_COMPLETE", + executionGraph: exampleExecutionGraph, + }, + ]); + }); + + it("should set the execution graph", () => { + assert.isDefined(state.transform.executionGraph); + assert.equal(state.transform.executionGraph.vertexes.size, 1); + }); + }); + + describe("unexpected failure", () => { + beforeEach(() => { + state = applyActions(state, [ + { + type: "UNEXPECTED_FAIL", + errors: [new Error("Failed graph transform")], + }, + ]); + }); + + it("should not set the execution graph", () => { + assert.isNull(state.transform.executionGraph); + }); + + it("should set the an entry in the unexpected errors", () => { + assert.deepStrictEqual(state.unexpected.errors, [ + new Error("Failed graph transform"), + ]); + }); }); }); }); diff --git a/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx b/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx new file mode 100644 index 0000000000..fb7fcb7abb --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx @@ -0,0 +1,27 @@ +import { DeployState } from "@ignored/ignition-core"; +import { Box, Text } from "ink"; + +export const UnexpectedErrorPanel = ({ + deployState, +}: { + deployState: DeployState; +}) => { + return ( + + + Ignition failed with an error for{" "} + {deployState.details.moduleName} + + + + {deployState.unexpected.errors.map((err, i) => ( + + ))} + + + ); +}; + +export const ErrorBox = ({ error }: { error: Error }) => { + return {error.message}; +}; diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index 532a43fa14..c431fa69a0 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,7 +1,12 @@ -import type { DeployState, ModuleParams } from "@ignored/ignition-core"; +import { + DeployState, + IgnitionError, + ModuleParams, +} from "@ignored/ignition-core"; import { ReconciliationFailedPanel } from "./ReconciliationFailedPanel"; import { StartingPanel } from "./StartingPanel"; +import { UnexpectedErrorPanel } from "./UnexpectedErrorPanel"; import { ValidationFailedPanel } from "./ValidationFailedPanel"; import { ExecutionPanel } from "./execution/ExecutionPanel"; @@ -23,11 +28,28 @@ export const IgnitionUi = ({ return ; } + if (deployState.phase === "failed-unexpectedly") { + return ; + } + if (deployState.phase === "reconciliation-failed") { return ; } - return ( - - ); + if ( + deployState.phase === "execution" || + deployState.phase === "complete" || + deployState.phase === "failed" || + deployState.phase === "hold" + ) { + return ( + + ); + } + + return assertNeverPhase(deployState.phase); }; + +function assertNeverPhase(deployStatePhase: never): null { + throw new IgnitionError(`Unknown deploy state phase ${deployStatePhase}`); +} From e7bb0907fea625bfa19653063df417d9cac10497 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 13 Feb 2023 16:18:22 +0000 Subject: [PATCH 0230/1302] chore: switch to npm (#148) We are moving to `npm` and away from `yarn` across nomic. At the same time the uniswap example is explicit about which version of @openzeppelin is used. This allows us to leverage hoisting to share `node_modules` across all packages. To leverage npm7 and workspaces in the ci, an additional npm install step is needed. This can be removed once node 14 is out of Maintenance LTS. Resolves #147. --------- Co-authored-by: Zoey --- .github/workflows/ci.yml | 48 +- .vscode/tasks.json | 2 +- CONTRIBUTING.md | 18 +- docs/publish.md | 2 +- examples/create2/README.md | 2 +- examples/create2/package.json | 4 +- examples/ens/README.md | 2 +- examples/ens/package.json | 4 +- examples/multisig/README.md | 2 +- examples/multisig/package.json | 4 +- examples/sample/README.md | 2 +- examples/sample/package.json | 4 +- examples/uniswap/README.md | 2 +- examples/uniswap/package.json | 5 +- package-lock.json | 18497 ++++++++++++++++ package.json | 5 +- packages/core/package.json | 6 +- packages/core/src/index.ts | 2 + packages/hardhat-plugin/package.json | 7 +- .../hardhat-plugin/src/plan/assets/main.css | 2 +- packages/hardhat-plugin/test/config.ts | 3 +- .../with-config/hardhat.config.js | 2 +- packages/hardhat-plugin/tsconfig.json | 3 +- yarn.lock | 10614 --------- 24 files changed, 18566 insertions(+), 10676 deletions(-) create mode 100644 package-lock.json delete mode 100644 yarn.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2babedaa35..f669c6c8e7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,19 +16,21 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 14 - cache: yarn + cache: npm + - name: npm 7 + run: npm i -g npm@7 - name: Install - run: yarn --frozen-lockfile + run: npm install - name: Build - run: yarn build + run: npm run build - name: Lint - run: yarn lint + run: npm run lint - name: Check tests typecheck - run: yarn test:build + run: npm run test:build - name: Run tests - run: yarn test + run: npm run test - name: Run tests in examples - run: yarn test:examples + run: npm run test:examples test_on_macos: name: Test Ignition on MacOS with Node 14 @@ -38,19 +40,21 @@ jobs: - uses: actions/setup-node@v2 with: node-version: 14 - cache: yarn + cache: npm + - name: npm 7 + run: npm i -g npm@7 - name: Install - run: yarn --frozen-lockfile + run: npm install - name: Build - run: yarn build + run: npm run build - name: Lint - run: yarn lint + run: npm run lint - name: Check tests typecheck - run: yarn test:build + run: npm run test:build - name: Run tests - run: yarn test + run: npm run test - name: Run tests in examples - run: yarn test:examples + run: npm run test:examples test_on_linux: name: Test Ignition on Ubuntu with Node ${{ matrix.node }} @@ -63,16 +67,18 @@ jobs: - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: yarn + cache: npm + - name: npm 7 + run: npm i -g npm@7 - name: Install - run: yarn --frozen-lockfile + run: npm install - name: Build - run: yarn build + run: npm run build - name: Lint - run: yarn lint + run: npm run lint - name: Check tests typecheck - run: yarn test:build + run: npm run test:build - name: Run tests - run: yarn test + run: npm run test - name: Run tests in examples - run: yarn test:examples + run: npm run test:examples diff --git a/.vscode/tasks.json b/.vscode/tasks.json index b08d826c16..f4dc58d37c 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,7 +4,7 @@ { "label": "Run watch", "type": "shell", - "command": "yarn watch", + "command": "npm run watch", "group": "none", "presentation": { "reveal": "never", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 27d91a8410..38d6bb42b8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ If you find a bug or want to propose a new feature, please open an issue. Pull r ## Project Structure -This repository is a monorepo handled with `Yarn` workspaces. +This repository is a monorepo handled with `npm` workspaces. There are two packages: @@ -21,12 +21,12 @@ An overview of the [design of the deploy process is explained here](./docs/desig ## Setup -Ignition is a `typescript` project managed by `yarn`. +Ignition is a `typescript` project managed by `npm`. -The install the dependencies, run `yarn` in the project root: +To install the dependencies, run `npm` in the project root: ```shell -yarn +npm install ``` ## Building @@ -34,13 +34,13 @@ yarn The packages are written in `typescript` and so require a build step, to build: ```shell -yarn build +npm run build ``` The **Hardhat** plugin depends on **core**, while developing you may want to run a continuous build with `watch`: ```shell -yarn watch +npm run watch ``` ## Testing @@ -48,7 +48,7 @@ yarn watch The test suite is written in `mocha`, to run: ```shell -yarn test +npm run test ``` ## Linting @@ -56,7 +56,7 @@ yarn test Formatting is enforced with `prettier` and code rules with `eslint`, to run both: ```shell -yarn lint +npm run lint ``` ## Clean @@ -64,7 +64,7 @@ yarn lint If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from clean: ```shell -yarn clean +npm run clean ``` ## Publish diff --git a/docs/publish.md b/docs/publish.md index 2aada807eb..01ffb7e8d2 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -3,7 +3,7 @@ To publish ignition: 1. git fetch, Checkout out `main`, then ensure your branch is up to date `git pull --ff-only` -2. Run a full check, stopping on failure: `yarn fullcheck` +2. Run a full check, stopping on failure: `npm run fullcheck` 3. Create a release branch `git checkout -b release/yyyy-mm-dd` 4. Under `./packages/core`, update the package version based on semver if appropriate. 5. Under `./packages/hardhat-plugin`, update the package version based on semver if appropriate. diff --git a/examples/create2/README.md b/examples/create2/README.md index f683e9bc4d..07c18c93b6 100644 --- a/examples/create2/README.md +++ b/examples/create2/README.md @@ -11,5 +11,5 @@ Currently our api isn't flexible enough to support direct cli use of `create2` f To run the hardhat tests using ignition: ```shell -yarn test:examples +npm run test:examples ``` diff --git a/examples/create2/package.json b/examples/create2/package.json index c4f905bd68..48e988847a 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -4,8 +4,8 @@ "version": "0.0.1", "scripts": { "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, diff --git a/examples/ens/README.md b/examples/ens/README.md index 047b319e93..9750187707 100644 --- a/examples/ens/README.md +++ b/examples/ens/README.md @@ -23,5 +23,5 @@ npx hardhat deploy test-registrar.js --network localhost To run the hardhat tests using ignition: ```shell -yarn test:examples +npm run test:examples ``` diff --git a/examples/ens/package.json b/examples/ens/package.json index 218be9a650..1cef156624 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -4,8 +4,8 @@ "version": "0.0.1", "scripts": { "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, diff --git a/examples/multisig/README.md b/examples/multisig/README.md index 55b83f27c1..7d07dcec0f 100644 --- a/examples/multisig/README.md +++ b/examples/multisig/README.md @@ -39,5 +39,5 @@ npx hardhat deploy MultisigModule.js --network localhost To run the hardhat tests using ignition: ```shell -yarn test:examples +npm run test:examples ``` diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 2059b4afef..883d6eaff9 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -4,8 +4,8 @@ "version": "0.0.1", "scripts": { "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, diff --git a/examples/sample/README.md b/examples/sample/README.md index 8788371a0e..d252ff6fdf 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -15,5 +15,5 @@ npx hardhat deploy LockModule.js To run the hardhat tests using ignition: ```shell -yarn test:examples +npm run test:examples ``` diff --git a/examples/sample/package.json b/examples/sample/package.json index ef6f2c3632..66d2160bde 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -4,8 +4,8 @@ "version": "0.0.1", "scripts": { "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, diff --git a/examples/uniswap/README.md b/examples/uniswap/README.md index b6579d390b..0d088dc77a 100644 --- a/examples/uniswap/README.md +++ b/examples/uniswap/README.md @@ -15,5 +15,5 @@ npx hardhat deploy Uniswap.js To run the hardhat tests using ignition: ```shell -yarn test:examples +npm run test:examples ``` diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index cf91cae7aa..b83213fdc2 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -4,8 +4,8 @@ "version": "0.0.1", "scripts": { "test:examples": "hardhat test", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, @@ -28,6 +28,7 @@ "typechain": "8.1.1" }, "dependencies": { + "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", "@uniswap/v3-core": "1.0.0", "@uniswap/v3-periphery": "1.1.1", diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..e7966d5d8f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,18497 @@ +{ + "name": "root", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "root", + "version": "0.0.0", + "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", + "devDependencies": { + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-prettier": "4.0.0", + "prettier": "2.4.1", + "typescript": "^4.7.4", + "wsrun": "^5.2.4" + }, + "workspaces": { + "packages": [ + "packages/*", + "examples/*" + ] + } + }, + "examples/create2": { + "name": "@nomicfoundation/ignition-create2-example", + "version": "0.0.1", + "dependencies": { + "@openzeppelin/contracts": "4.7.3" + }, + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.7", + "hardhat": "^2.10.0" + } + }, + "examples/create2/node_modules/@openzeppelin/contracts": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", + "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" + }, + "examples/ens": { + "name": "@nomicfoundation/ignition-ens-example", + "version": "0.0.1", + "dependencies": { + "@ensdomains/ens-contracts": "0.0.11" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.7", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + } + }, + "examples/ens/node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", + "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "examples/multisig": { + "name": "@nomicfoundation/ignition-example-multisig", + "version": "0.0.1", + "dependencies": { + "@openzeppelin/contracts": "^4.3.2" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.7", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + } + }, + "examples/multisig/node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", + "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "examples/sample": { + "name": "@nomicfoundation/ignition-sample-example", + "version": "0.0.1", + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.7", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + } + }, + "examples/sample/node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", + "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "examples/uniswap": { + "name": "@nomicfoundation/ignition-uniswap-example", + "version": "0.0.1", + "dependencies": { + "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", + "@uniswap/swap-router-contracts": "1.1.0", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.1.1", + "@uniswap/v3-sdk": "3.9.0", + "@uniswap/v3-staker": "1.0.2", + "bignumber.js": "9.1.0", + "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.7", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "chai": "4.3.7", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1" + } + }, + "examples/uniswap/node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", + "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "examples/uniswap/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", + "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.20.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", + "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.20.11", + "@babel/helpers": "^7.20.7", + "@babel/parser": "^7.20.7", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.12", + "@babel/types": "^7.20.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.20.14", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", + "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7", + "@jridgewell/gen-mapping": "^0.3.2", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", + "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.18.10", + "@babel/types": "^7.19.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.20.11", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", + "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.10", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", + "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.20.13", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.20.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", + "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", + "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.20.7", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.20.13", + "@babel/types": "^7.20.7", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", + "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "dev": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "dependencies": { + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" + } + }, + "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@ensdomains/buffer": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", + "dependencies": { + "@nomiclabs/hardhat-truffle5": "^2.0.0" + } + }, + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", + "dependencies": { + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" + } + }, + "node_modules/@ensdomains/ens-contracts": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "dependencies": { + "@ensdomains/buffer": "^0.0.13", + "@ensdomains/solsha1": "0.0.3", + "@openzeppelin/contracts": "^4.1.0", + "dns-packet": "^5.3.0" + } + }, + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" + }, + "node_modules/@ensdomains/solsha1": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", + "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", + "dependencies": { + "hash-test-vectors": "^1.3.2" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" + } + }, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" + } + }, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" + } + }, + "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@ignored/hardhat-ignition": { + "resolved": "packages/hardhat-plugin", + "link": true + }, + "node_modules/@ignored/ignition-core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@morgan-stanley/ts-mocking-bird": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", + "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.16", + "uuid": "^7.0.3" + }, + "peerDependencies": { + "jasmine": "2.x || 3.x || 4.x", + "jest": "26.x || 27.x || 28.x", + "typescript": ">=4.2" + }, + "peerDependenciesMeta": { + "jasmine": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", + "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", + "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-ethash": "^2.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", + "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", + "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", + "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", + "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", + "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", + "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", + "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", + "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.4.tgz", + "integrity": "sha512-n/5UMwGaUK2zM8ALuMChVwB1lEPeDTb5oBjQ1g7hVsUdS8x+XG9JIEp4Ze6Bwy98tghA7Y1+PCH4SNE2P3UQ2g==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "chalk": "^2.4.2", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.0", + "chai": "^4.2.0", + "ethers": "^5.0.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", + "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", + "dev": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz", + "integrity": "sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ==", + "dev": true, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomiclabs/hardhat-etherscan": "^3.0.0", + "@typechain/ethers-v5": "^10.1.0", + "@typechain/hardhat": "^6.1.2", + "@types/chai": "^4.2.0", + "@types/mocha": "^9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^5.4.7", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.1.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/ignition-create2-example": { + "resolved": "examples/create2", + "link": true + }, + "node_modules/@nomicfoundation/ignition-ens-example": { + "resolved": "examples/ens", + "link": true + }, + "node_modules/@nomicfoundation/ignition-example-multisig": { + "resolved": "examples/multisig", + "link": true + }, + "node_modules/@nomicfoundation/ignition-sample-example": { + "resolved": "examples/sample", + "link": true + }, + "node_modules/@nomicfoundation/ignition-uniswap-example": { + "resolved": "examples/uniswap", + "link": true + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", + "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", + "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", + "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", + "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", + "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", + "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", + "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", + "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", + "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", + "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", + "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", + "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.2.tgz", + "integrity": "sha512-IEikeOVq0C/7CY6aD74d8L4BpGoc/FNiN6ldiPVg0QIFIUSu4FSGA1dmtJZJKk1tjpwgrfTLQNWnigtEaN9REg==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^5.0.2", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.4.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "peer": true, + "dependencies": { + "@types/bignumber.js": "^5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.1.tgz", + "integrity": "sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ==" + }, + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "dependencies": { + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "dependencies": { + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "dependencies": { + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@truffle/abi-utils": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.7.tgz", + "integrity": "sha512-IhX+Hxu9fTEOxR+34r3Tt/AJS1gkqdEBZDzERG/9X43bLGzu5pLWzDgDBpNDqYM3lTICIg3UHfqLdUzSC7g4pg==", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.8.2" + } + }, + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", + "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==" + }, + "node_modules/@truffle/codec": { + "version": "0.14.14", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.14.tgz", + "integrity": "sha512-EP+iTGowElaJJgQI4Ztizmb+hYOHwOv4OiX09sjqX/v/GdmnvyWoS8RGHtERze8DoBi5cs4ZY8vlM3nVDbRv5A==", + "dependencies": { + "@truffle/abi-utils": "^0.3.7", + "@truffle/compile-common": "^0.9.2", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.8.2" + } + }, + "node_modules/@truffle/codec/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@truffle/compile-common": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.2.tgz", + "integrity": "sha512-n7MF/4/dntccj44RGe3PRMD8Vk46PU8dJtzd1VLAfgokK2Y2N+SjAzDskBnmAydZVWAM315nZIUQsgnY8xoATw==", + "dependencies": { + "@truffle/error": "^0.2.0", + "colors": "1.4.0" + } + }, + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" + }, + "node_modules/@truffle/contract-schema": { + "version": "3.4.11", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", + "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "node_modules/@truffle/debug-utils": { + "version": "6.0.45", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.45.tgz", + "integrity": "sha512-yrEM8znplrVzxczzsvRlFrA56S3KSLD0XZpAQ8nDRd82Omn4Y7AaJtkAoOILjkPHeuBS1bvHm7FjKhszgOe3mg==", + "dependencies": { + "@truffle/codec": "^0.14.14", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" + } + }, + "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@truffle/debug-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@truffle/debug-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/debug-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" + }, + "node_modules/@truffle/interface-adapter": { + "version": "0.5.28", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.28.tgz", + "integrity": "sha512-xnjWXiOihApI+XLrs0xpw9s+av6Qvrc2lkXAfrBluuKgaJOQIdLVz6vi2Bt6oiTQAoWUkUGa0hne78mxFI2J1w==", + "dependencies": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.8.2" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "dependencies": { + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "devOptional": true + }, + "node_modules/@typechain/ethers-v5": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz", + "integrity": "sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.0.0", + "@ethersproject/bytes": "^5.0.0", + "@ethersproject/providers": "^5.0.0", + "ethers": "^5.1.3", + "typechain": "^8.1.1", + "typescript": ">=4.3.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.4.tgz", + "integrity": "sha512-S8k5d1Rjc+plwKpkorlifmh72M7Ki0XNUOVVLtdbcA/vLaEkuqZSJFdddpBgS5QxiJP+6CbRa/yO6EVTE2+fMQ==", + "dev": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@typechain/ethers-v5": "^10.1.1", + "ethers": "^5.4.7", + "hardhat": "^2.9.9", + "typechain": "^8.1.1" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/async-eventemitter": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" + }, + "node_modules/@types/bignumber.js": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", + "peer": true, + "dependencies": { + "bignumber.js": "*" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + }, + "node_modules/@types/chai-as-promised": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, + "node_modules/@types/concat-stream": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/d3": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", + "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==", + "dev": true + }, + "node_modules/@types/d3-axis": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true + }, + "node_modules/@types/d3-contour": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", + "dev": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-delaunay": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true + }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", + "dev": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true + }, + "node_modules/@types/d3-format": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true + }, + "node_modules/@types/d3-geo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", + "dev": true, + "dependencies": { + "@types/geojson": "*" + } + }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dev": true, + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true + }, + "node_modules/@types/d3-polygon": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dev": true, + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.4.tgz", + "integrity": "sha512-ZeykX7286BCyMg9sH5fIAORyCB6hcATPSRQpN47jwBA2bMbAT0s+EvtDP5r1FZYJ95R8QoEE1CKJX+n0/M5Vhg==", + "dev": true + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dev": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true + }, + "node_modules/@types/d3-time-format": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", + "dev": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", + "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "dev": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/dompurify": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", + "dev": true, + "dependencies": { + "@types/trusted-types": "*" + } + }, + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/geojson": { + "version": "7946.0.10", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.14.189", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", + "dev": true + }, + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + }, + "node_modules/@types/mermaid": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", + "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", + "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "mermaid": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/ms": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true + }, + "node_modules/@types/ndjson": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", + "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/through": "*" + } + }, + "node_modules/@types/node": { + "version": "12.20.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" + }, + "node_modules/@types/object-hash": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.2.1.tgz", + "integrity": "sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ==", + "dev": true + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/prettier": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", + "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "dev": true + }, + "node_modules/@types/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-TwNx7qsjvRIUv/BCx583tqF5IINEVjCNqg9ofKHRlSoUHE62WBHrem4B1HGXcIrG511v29d1kJ9a/t2Esz7MIg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "kleur": "^3.0.3" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "devOptional": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "17.0.53", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", + "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "devOptional": true + }, + "node_modules/@types/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/sinon": { + "version": "10.0.13", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", + "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "dev": true, + "dependencies": { + "@types/sinonjs__fake-timers": "*" + } + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true + }, + "node_modules/@types/through": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==", + "dev": true + }, + "node_modules/@types/trusted-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", + "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "13.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", + "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "dev": true + }, + "node_modules/@types/yoga-layout": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", + "dev": true, + "dependencies": { + "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/scope-manager": "4.31.2", + "debug": "^4.3.1", + "functional-red-black-tree": "^1.0.1", + "regexpp": "^3.1.0", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^4.0.0", + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "debug": "^4.3.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", + "dev": true, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "4.31.2", + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/@uniswap/lib": { + "version": "4.0.1-alpha", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/sdk-core": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.1.1.tgz", + "integrity": "sha512-afXn3R2ICf1mAZU+Ug8MmPbuXG7PYjoUYr0+sKLApyOPuhlxpwV4tR4ba8w4jSXoFhqOWxZ9qh44isWoScK96w==", + "dependencies": { + "@ethersproject/address": "^5.0.2", + "big.js": "^5.2.2", + "decimal.js-light": "^2.5.0", + "jsbi": "^3.1.4", + "tiny-invariant": "^1.1.0", + "toformat": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/sdk-core/node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/@uniswap/swap-router-contracts": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz", + "integrity": "sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA==", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.3.0", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/swap-router-contracts/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + }, + "node_modules/@uniswap/swap-router-contracts/node_modules/@uniswap/v3-periphery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", + "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v2-core": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-core": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", + "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz", + "integrity": "sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg==", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + }, + "node_modules/@uniswap/v3-sdk": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz", + "integrity": "sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ==", + "dependencies": { + "@ethersproject/abi": "^5.0.12", + "@ethersproject/solidity": "^5.0.9", + "@uniswap/sdk-core": "^3.0.1", + "@uniswap/swap-router-contracts": "^1.2.1", + "@uniswap/v3-periphery": "^1.1.1", + "@uniswap/v3-staker": "1.0.0", + "tiny-invariant": "^1.1.0", + "tiny-warning": "^1.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-sdk/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + }, + "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/swap-router-contracts": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz", + "integrity": "sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A==", + "dependencies": { + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.4.1", + "dotenv": "^14.2.0", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-periphery": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz", + "integrity": "sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg==", + "dependencies": { + "@openzeppelin/contracts": "3.4.2-solc-0.7", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz", + "integrity": "sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw==", + "deprecated": "Please upgrade to 1.0.1", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + }, + "node_modules/@uniswap/v3-staker": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz", + "integrity": "sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ==", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + }, + "node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dependencies": { + "event-target-shim": "^5.0.0" + }, + "engines": { + "node": ">=6.5" + } + }, + "node_modules/abortcontroller-polyfill": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + }, + "node_modules/abstract-level": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "dependencies": { + "buffer": "^6.0.3", + "catering": "^2.1.0", + "is-buffer": "^2.0.5", + "level-supports": "^4.0.0", + "level-transcoder": "^1.0.1", + "module-error": "^1.0.1", + "queue-microtask": "^1.2.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/abstract-level/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/antlr4ts": { + "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-back": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "engines": { + "node": "*" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-eventemitter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", + "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dependencies": { + "async": "^2.4.0" + } + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base-x": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64-sol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/big.js": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "engines": { + "node": "*" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bigjs" + } + }, + "node_modules/bigint-crypto-utils": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", + "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", + "dependencies": { + "bigint-mod-arith": "^3.1.0" + }, + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bigint-mod-arith": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", + "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", + "engines": { + "node": ">=10.4.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blakejs": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + }, + "node_modules/browser-level": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.1", + "module-error": "^1.0.2", + "run-parallel-limit": "^1.1.0" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs58": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "dependencies": { + "base-x": "^3.0.2" + } + }, + "node_modules/bs58check": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "dependencies": { + "bs58": "^4.0.0", + "create-hash": "^1.1.0", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-to-arraybuffer": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001451", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", + "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/catering": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/chai": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dependencies": { + "camel-case": "^3.0.0", + "constant-case": "^2.0.0", + "dot-case": "^2.1.0", + "header-case": "^1.0.0", + "is-lower-case": "^1.1.0", + "is-upper-case": "^1.1.0", + "lower-case": "^1.1.1", + "lower-case-first": "^1.0.0", + "no-case": "^2.3.2", + "param-case": "^2.1.0", + "pascal-case": "^2.0.0", + "path-case": "^2.1.0", + "sentence-case": "^2.1.0", + "snake-case": "^2.1.0", + "swap-case": "^1.1.0", + "title-case": "^2.1.0", + "upper-case": "^1.1.1", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cids": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.5.0", + "class-is": "^1.1.0", + "multibase": "~0.6.0", + "multicodec": "^1.0.0", + "multihashes": "~0.4.15" + }, + "engines": { + "node": ">=4.0.0", + "npm": ">=3.0.0" + } + }, + "node_modules/cids/node_modules/multicodec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "buffer": "^5.6.0", + "varint": "^5.0.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-is": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + }, + "node_modules/classic-level": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", + "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "hasInstallScript": true, + "dependencies": { + "abstract-level": "^1.0.2", + "catering": "^2.1.0", + "module-error": "^1.0.1", + "napi-macros": "~2.0.0", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", + "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/code-excerpt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "dependencies": { + "convert-to-spaces": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/command-line-args": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", + "dev": true, + "dependencies": { + "array-back": "^3.1.0", + "find-replace": "^3.0.0", + "lodash.camelcase": "^4.3.0", + "typical": "^4.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/command-line-usage": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", + "dev": true, + "dependencies": { + "array-back": "^4.0.2", + "chalk": "^2.4.2", + "table-layout": "^1.0.2", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dependencies": { + "snake-case": "^2.1.0", + "upper-case": "^1.1.1" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-hash": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-addr-codec": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "dependencies": { + "base-x": "^3.0.8", + "big-integer": "1.6.36", + "blakejs": "^1.1.0", + "bs58": "^4.0.1", + "ripemd160-min": "0.0.6", + "safe-buffer": "^5.2.0", + "sha3": "^2.1.1" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csstype": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", + "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "devOptional": true + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", + "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", + "dev": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "dev": true, + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "dev": true, + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dev": true, + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", + "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "dev": true, + "dependencies": { + "d3": "^7.7.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/death": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delaunator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dev": true, + "dependencies": { + "robust-predicates": "^3.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-port": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", + "dev": true, + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/difflib": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", + "dev": true, + "dependencies": { + "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", + "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-walk": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "dev": true + }, + "node_modules/domutils": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", + "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.1" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/dotenv": { + "version": "14.3.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.294", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz", + "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", + "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", + "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", + "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.4", + "is-array-buffer": "^3.0.1", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "dev": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" + } + }, + "node_modules/escodegen/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dev": true, + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz", + "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.10.0", + "get-tsconfig": "^4.2.0", + "globby": "^13.1.2", + "is-core-module": "^2.10.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.4" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/globby": { + "version": "13.1.3", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", + "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-import-resolver-typescript/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", + "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "ramda": "^0.27.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" + } + }, + "node_modules/eth-ens-namehash/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/eth-gas-reporter": { + "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.0.0-beta.146", + "@solidity-parser/parser": "^0.14.0", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^4.0.40", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^7.1.1", + "req-cwd": "^2.0.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" + }, + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/eth-gas-reporter/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dev": true, + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eth-gas-reporter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eth-gas-reporter/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/eth-gas-reporter/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eth-gas-reporter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-gas-reporter/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/eth-gas-reporter/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eth-lib": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "nano-json-stream-parser": "^0.1.2", + "servify": "^0.1.12", + "ws": "^3.0.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/eth-lib/node_modules/ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "dependencies": { + "async-limiter": "~1.0.0", + "safe-buffer": "~5.1.0", + "ultron": "~1.1.0" + } + }, + "node_modules/ethereum-bloom-filters": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "dependencies": { + "js-sha3": "^0.8.0" + } + }, + "node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/ethereum-ens": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "dependencies": { + "bluebird": "^3.4.7", + "eth-ens-namehash": "^2.0.0", + "js-sha3": "^0.5.7", + "pako": "^1.0.4", + "underscore": "^1.8.3", + "web3": "^1.0.0-beta.34" + } + }, + "node_modules/ethereum-ens/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/ethereumjs-abi": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "dependencies": { + "bn.js": "^4.11.8", + "ethereumjs-util": "^6.0.0" + } + }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/ethereumjs-abi/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-check": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "dependencies": { + "pure-rand": "^5.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", + "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "dependencies": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat": { + "version": "2.12.7", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.7.tgz", + "integrity": "sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A==", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/cli.js" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" + } + }, + "node_modules/hardhat-watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", + "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", + "dependencies": { + "chokidar": "^3.5.3" + }, + "peerDependencies": { + "hardhat": "^2.0.0" + } + }, + "node_modules/hardhat/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/hardhat/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/hardhat/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/hardhat/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/hardhat/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/hardhat/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/hardhat/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, + "node_modules/hardhat/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/hardhat/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hardhat/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/hardhat/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/hardhat/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/hardhat/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hardhat/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hardhat/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/hardhat/node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/hardhat/node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/hardhat/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/hardhat/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-test-vectors": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", + "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/highlightjs-solidity": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/htmlparser2": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", + "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "entities": "^4.3.0" + } + }, + "node_modules/http-basic": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "dev": true, + "dependencies": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + }, + "node_modules/http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "dev": true, + "dependencies": { + "@types/node": "^10.0.3" + } + }, + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "dependencies": { + "punycode": "2.1.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", + "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/ink": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", + "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "auto-bind": "4.0.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "indent-string": "^4.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.20", + "patch-console": "^1.0.0", + "react-devtools-core": "^4.19.1", + "react-reconciler": "^0.26.2", + "scheduler": "^0.20.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "stack-utils": "^2.0.2", + "string-width": "^4.2.2", + "type-fest": "^0.12.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "ws": "^7.5.5", + "yoga-layout-prebuilt": "^1.9.6" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/ink-spinner": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", + "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", + "dependencies": { + "cli-spinners": "^2.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ink": ">=3.0.5", + "react": ">=16.8.2" + } + }, + "node_modules/ink/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ink/node_modules/type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/io-ts": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "dependencies": { + "fp-ts": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", + "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dependencies": { + "lower-case": "^1.1.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dependencies": { + "upper-case": "^1.1.0" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", + "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", + "dev": true, + "dependencies": { + "@jest/types": "^24.9.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/js-graph-algorithms": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", + "integrity": "sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==", + "bin": { + "js-graphs": "src/jsgraphs.js" + } + }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbi": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/keccak": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/level": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/level" + } + }, + "node_modules/level-supports": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/level-transcoder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dependencies": { + "get-func-name": "^2.0.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true + }, + "node_modules/markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "dev": true + }, + "node_modules/mcl-wasm": { + "version": "0.7.9", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-level": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "dependencies": { + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mermaid": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", + "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "dev": true, + "dependencies": { + "@braintree/sanitize-url": "^6.0.0", + "d3": "^7.0.0", + "dagre-d3-es": "7.0.6", + "dompurify": "2.4.1", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "moment-mini": "^2.24.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "uuid": "^9.0.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "dependencies": { + "dom-walk": "^0.1.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "dependencies": { + "mkdirp": "*" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mnemonist": { + "version": "0.38.5", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "dependencies": { + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mock-fs": { + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + }, + "node_modules/module-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/moment-mini": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", + "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multibase": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/multicodec": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "varint": "^5.0.0" + } + }, + "node_modules/multihashes": { + "version": "0.4.21", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "dependencies": { + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" + } + }, + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", + "dependencies": { + "base-x": "^3.0.8", + "buffer": "^5.5.0" + } + }, + "node_modules/nano-base32": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" + }, + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-macros": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", + "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/ndjson": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "dependencies": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "ndjson": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dependencies": { + "lower-case": "^1.1.1" + } + }, + "node_modules/node-addon-api": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-environment-flags": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", + "dev": true, + "dependencies": { + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "dev": true + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", + "dev": true, + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-to-bn": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "dependencies": { + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", + "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "dev": true, + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, + "node_modules/oboe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "dependencies": { + "http-https": "^1.0.0" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", + "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ordinal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "dev": true + }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, + "node_modules/parse-headers": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dependencies": { + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" + } + }, + "node_modules/patch-console": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", + "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dev": true, + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pure-rand": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/purecss": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", + "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", + "dev": true + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "4.27.2", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.2.tgz", + "integrity": "sha512-8SzmIkpO87alD7Xr6gWIEa1jHkMjawOZ+6egjazlnjB4UUcbnzGDf/vBJ4BzGuWWEM+pzrxuzsPpcMqlQkYK2g==", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-reconciler": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", + "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^17.0.2" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/reduce-flatten": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "dev": true, + "dependencies": { + "req-from": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "dev": true, + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/req-from/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.19" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "dev": true, + "dependencies": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, + "engines": { + "node": ">=0.12.0" + }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/ripemd160-min": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rlp": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/robust-predicates": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", + "dev": true + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", + "dev": true, + "dependencies": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "istanbul": "lib/cli.js" + } + }, + "node_modules/sc-istanbul/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "dev": true, + "dependencies": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", + "dev": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", + "hasInstallScript": true, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" + } + }, + "node_modules/serialize-error": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/servify": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "dependencies": { + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/sha1": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "dev": true, + "dependencies": { + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sha3": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/sha3/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", + "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "dependencies": { + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sinon": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dependencies": { + "no-case": "^2.2.0" + } + }, + "node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "dependencies": { + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" + } + }, + "node_modules/solc/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/solc/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/solc/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dependencies": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/solc/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "node_modules/solc/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solc/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/solc/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "node_modules/solc/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/solidity-coverage": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.14.1", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" + }, + "bin": { + "solidity-coverage": "plugins/bin.js" + }, + "peerDependencies": { + "hardhat": "^2.11.0" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/solidity-coverage/node_modules/diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/solidity-coverage/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/solidity-coverage/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/flat": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "dev": true, + "dependencies": { + "is-buffer": "~2.0.3" + }, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/solidity-coverage/node_modules/fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solidity-coverage/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/solidity-coverage/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", + "dev": true, + "dependencies": { + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/solidity-coverage/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/readdirp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "dev": true, + "dependencies": { + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/solidity-coverage/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/solidity-coverage/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/solidity-coverage/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/solidity-coverage/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/solidity-coverage/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/solidity-coverage/node_modules/yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", + "dev": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", + "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "dev": true + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "dependencies": { + "is-hex-prefixed": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dependencies": { + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" + } + }, + "node_modules/swarm-js": { + "version": "0.1.42", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "dependencies": { + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" + } + }, + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/swarm-js/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/swarm-js/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/swarm-js/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/sync-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "dev": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/sync-rpc": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "dev": true, + "dependencies": { + "get-port": "^3.1.0" + } + }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table-layout": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "dev": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/testrpc": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/then-request": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "dev": true, + "dependencies": { + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "dev": true + }, + "node_modules/throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dependencies": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-command-line-args": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", + "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==", + "dev": true, + "dependencies": { + "@morgan-stanley/ts-mocking-bird": "^0.6.2", + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-essentials": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "dev": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { + "version": "10.8.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", + "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tsort": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "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" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typechain": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", + "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", + "dev": true, + "dependencies": { + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" + } + }, + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/undici": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", + "integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", + "dependencies": { + "busboy": "^1.6.0" + }, + "engines": { + "node": ">=12.18" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dependencies": { + "upper-case": "^1.1.1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-set-query": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v3-periphery-1_3_0": { + "name": "@uniswap/v3-periphery", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", + "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", + "dependencies": { + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1", + "hardhat-watcher": "^2.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/v3-periphery-1_3_0/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/varint": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/web3": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", + "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", + "hasInstallScript": true, + "dependencies": { + "web3-bzz": "1.8.2", + "web3-core": "1.8.2", + "web3-eth": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-shh": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-bzz": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", + "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", + "hasInstallScript": true, + "dependencies": { + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", + "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-requestmanager": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-helpers": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", + "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", + "dependencies": { + "web3-eth-iban": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-method": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", + "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", + "dependencies": { + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-promievent": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", + "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-requestmanager": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", + "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", + "dependencies": { + "util": "^0.12.5", + "web3-core-helpers": "1.8.2", + "web3-providers-http": "1.8.2", + "web3-providers-ipc": "1.8.2", + "web3-providers-ws": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-core-subscriptions": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", + "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", + "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", + "dependencies": { + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-accounts": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-eth-ens": "1.8.2", + "web3-eth-iban": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-abi": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", + "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", + "dependencies": { + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", + "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", + "dependencies": { + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-accounts/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/web3-eth-contract": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", + "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-ens": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", + "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", + "dependencies": { + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-iban": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", + "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-eth-personal": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", + "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", + "dependencies": { + "@types/node": "^12.12.6", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-net": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", + "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", + "dependencies": { + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-http": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", + "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ipc": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", + "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-providers-ws": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", + "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.2", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-shh": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", + "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", + "hasInstallScript": true, + "dependencies": { + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-net": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/web3-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/window-size": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "dev": true, + "dependencies": { + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/wsrun": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/wsrun/-/wsrun-5.2.4.tgz", + "integrity": "sha512-akv3WtKBohdHsD/5uqhYRHw6GXeCXe87FsSg28Szq+2cpoqRW2SY4yPfm1D0za1cS6MgNy5hPgzS5SqYJaGUxg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.1", + "chalk": "^2.3.0", + "glob": "^7.1.2", + "jest-changed-files": "^24.9.0", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "split": "^1.0.1", + "throat": "^4.1.0", + "yargs": "^13.0.0" + }, + "bin": { + "wsrun": "bin/wsrun.js" + } + }, + "node_modules/wsrun/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wsrun/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wsrun/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/wsrun/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wsrun/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/wsrun/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/wsrun/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/wsrun/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wsrun/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wsrun/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wsrun/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wsrun/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wsrun/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/wsrun/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/wsrun/node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/xhr": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "dependencies": { + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/xhr-request": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "dependencies": { + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" + } + }, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "dependencies": { + "xhr-request": "^1.1.0" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", + "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", + "dependencies": { + "@types/yoga-layout": "1.9.2" + }, + "engines": { + "node": ">=8" + } + }, + "packages/core": { + "name": "@ignored/ignition-core", + "version": "0.0.7", + "license": "MIT", + "dependencies": { + "@ethersproject/address": "5.6.1", + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0", + "js-graph-algorithms": "1.0.18", + "object-hash": "^3.0.0", + "serialize-error": "8.1.0" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/mocha": "^9.0.0", + "@types/node": "12.20.25", + "@types/object-hash": "^2.2.1", + "@types/react": "^17.0.35", + "@types/sinon": "^10.0.6", + "@types/tmp": "^0.2.2", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-prettier": "4.0.0", + "fast-glob": "^3.2.12", + "hardhat": "^2.12.0", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.4.1", + "rimraf": "3.0.2", + "sinon": "^12.0.1", + "tmp": "^0.2.1", + "ts-node": "10.8.1", + "tsconfig-paths": "^4.1.0", + "typescript": "^4.7.4" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, + "peerDependencies": { + "hardhat": "^2.12.0" + } + }, + "packages/core/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "packages/core/node_modules/tsconfig-paths": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", + "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "packages/hardhat-plugin": { + "name": "@ignored/hardhat-ignition", + "version": "0.0.7", + "license": "MIT", + "dependencies": { + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0", + "ink": "3.2.0", + "ink-spinner": "4.0.3", + "ndjson": "2.0.0", + "prompts": "^2.4.2", + "react": "18.2.0", + "serialize-error": "8.1.0" + }, + "devDependencies": { + "@ignored/ignition-core": "^0.0.7", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/d3": "7.4.0", + "@types/debug": "^4.1.7", + "@types/dompurify": "2.4.0", + "@types/fs-extra": "^9.0.13", + "@types/lodash": "4.14.189", + "@types/mermaid": "^9.1.0", + "@types/mocha": "^9.0.0", + "@types/ndjson": "2.0.1", + "@types/node": "12.20.25", + "@types/prompts": "^2.4.2", + "@types/sinon": "^10.0.13", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "esbuild": "^0.15.9", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "^2.12.0", + "mermaid": "^9.1.7", + "mocha": "^9.1.1", + "nyc": "15.1.0", + "prettier": "2.4.1", + "purecss": "^2.1.0", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.8.1", + "typescript": "^4.7.4" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, + "peerDependencies": { + "@ignored/ignition-core": "^0.0.7", + "@nomiclabs/hardhat-ethers": "^2.0.2", + "hardhat": "^2.12.0" + } + }, + "packages/hardhat-plugin/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "packages/hardhat-plugin/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "packages/hardhat-plugin/node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + } + } +} diff --git a/package.json b/package.json index bc82ed6566..e7cfd37eee 100644 --- a/package.json +++ b/package.json @@ -8,9 +8,6 @@ "packages": [ "packages/*", "examples/*" - ], - "nohoist": [ - "**" ] }, "scripts": { @@ -24,7 +21,7 @@ "test:examples": "wsrun --exclude-missing --serial test:examples", "test:build": "wsrun --exclude-missing --serial test:build", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "yarn build && yarn lint && yarn test:build && yarn test:coverage && yarn test:examples", + "fullcheck": "npm run build && npm run lint && npm run test:build && npm run test:coverage && npm run test:examples", "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { diff --git a/packages/core/package.json b/packages/core/package.json index 8ed46e7577..1bc159c126 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,12 +22,12 @@ "types": "dist/index.d.ts", "scripts": { "build": "tsc --build && node post-build.js", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='ignition:*' yarn test", + "test:debug": "DEBUG='ignition:*' npm run test", "test:build": "tsc --project ./test/", "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", "test:coverage": "nyc mocha \"test/**/*.ts\"", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 408587b2b7..6ab75dba6f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,6 +5,8 @@ export { viewExecutionResults } from "deployment/utils"; export { createServices } from "services/createServices"; export { serializeReplacer } from "utils/serialize"; export { IgnitionError } from "utils/errors"; +export { TransactionsService } from "services/TransactionsService"; +export { ContractsService } from "services/ContractsService"; export type { SerializedDeploymentResult, diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 92c4d5786d..83d5adff91 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -22,12 +22,12 @@ "types": "dist/index.d.ts", "scripts": { "build": "tsc --build && node ./esbuild.js", - "lint": "yarn prettier --check && yarn eslint", - "lint:fix": "yarn prettier --write && yarn eslint --fix", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' yarn test", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" @@ -38,6 +38,7 @@ "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", + "@types/d3": "7.4.0", "@types/debug": "^4.1.7", "@types/dompurify": "2.4.0", "@types/fs-extra": "^9.0.13", diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css index 6092be4912..4b0cbd3845 100644 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ b/packages/hardhat-plugin/src/plan/assets/main.css @@ -1,4 +1,4 @@ -@import url("../../../node_modules/purecss/build/pure-min.css"); +@import url("../../../../../node_modules/purecss/build/pure-min.css"); .title-bar, .summary, diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 244feb72cb..1661ba7a0b 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,6 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { ContractsService } from "@ignored/ignition-core/dist/services/ContractsService"; -import { TransactionsService } from "@ignored/ignition-core/dist/services/TransactionsService"; +import { ContractsService, TransactionsService } from "@ignored/ignition-core"; import { assert } from "chai"; import { BigNumber } from "ethers"; import sinon from "sinon"; diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index f6cf497d06..0ab4ebde51 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -1,4 +1,4 @@ -const { BigNumber } = require("../../../node_modules/ethers/lib/index"); +const { BigNumber } = require("../../../../../node_modules/ethers/lib/index"); require("../../../src/index"); diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index bb9d637b2b..9e320a8d23 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -7,7 +7,8 @@ "rootDir": "src", "baseUrl": "src", "jsx": "react-jsx", - "lib": ["es2021", "DOM", "DOM.Iterable"] + "lib": ["es2021", "DOM", "DOM.Iterable"], + "skipLibCheck": true }, "include": ["src"] } diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 0b8444a19c..0000000000 --- a/yarn.lock +++ /dev/null @@ -1,10614 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.20.0": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.1.tgz#f2e6ef7790d8c8dbf03d379502dcc246dcce0b30" - integrity sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ== - -"@babel/core@^7.7.5": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.2.tgz#8dc9b1620a673f92d3624bd926dc49a52cf25b92" - integrity sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.2" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.1" - "@babel/parser" "^7.20.2" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.20.1", "@babel/generator@^7.20.2": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.4.tgz#4d9f8f0c30be75fd90a0562099a26e5839602ab8" - integrity sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA== - dependencies: - "@babel/types" "^7.20.2" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== - dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" - -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.1.tgz#2ab7a0fcb0a03b5bf76629196ed63c2d7311f4c9" - integrity sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.0" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.18.10", "@babel/parser@^7.20.1", "@babel/parser@^7.20.2": - version "7.20.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.3.tgz#5358cf62e380cf69efcb87a7bb922ff88bfac6e2" - integrity sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg== - -"@babel/runtime@^7.4.4": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.1.tgz#1148bb33ab252b165a06698fde7576092a78b4a9" - integrity sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg== - dependencies: - regenerator-runtime "^0.13.10" - -"@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.1.tgz#9b15ccbf882f6d107eeeecf263fbcdd208777ec8" - integrity sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.1" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.1" - "@babel/types" "^7.20.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.2.tgz#67ac09266606190f496322dbaff360fdaa5e7842" - integrity sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@braintree/sanitize-url@^6.0.0": - version "6.0.2" - resolved "https://registry.yarnpkg.com/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz#6110f918d273fe2af8ea1c4398a88774bb9fc12f" - integrity sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@ensdomains/address-encoder@^0.1.7": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz#f948c485443d9ef7ed2c0c4790e931c33334d02d" - integrity sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg== - dependencies: - bech32 "^1.1.3" - blakejs "^1.1.0" - bn.js "^4.11.8" - bs58 "^4.0.1" - crypto-addr-codec "^0.1.7" - nano-base32 "^1.0.1" - ripemd160 "^2.0.2" - -"@ensdomains/buffer@^0.0.13": - version "0.0.13" - resolved "https://registry.yarnpkg.com/@ensdomains/buffer/-/buffer-0.0.13.tgz#b9f60defb78fc5f2bee30faca17e63dfbef19253" - integrity sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ== - dependencies: - "@nomiclabs/hardhat-truffle5" "^2.0.0" - -"@ensdomains/ens-contracts@0.0.11": - version "0.0.11" - resolved "https://registry.yarnpkg.com/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz#a1cd87af8c454b694acba5be1a44c1b20656a9be" - integrity sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg== - dependencies: - "@ensdomains/buffer" "^0.0.13" - "@ensdomains/solsha1" "0.0.3" - "@openzeppelin/contracts" "^4.1.0" - dns-packet "^5.3.0" - -"@ensdomains/ens@0.4.5": - version "0.4.5" - resolved "https://registry.yarnpkg.com/@ensdomains/ens/-/ens-0.4.5.tgz#e0aebc005afdc066447c6e22feb4eda89a5edbfc" - integrity sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw== - dependencies: - bluebird "^3.5.2" - eth-ens-namehash "^2.0.8" - solc "^0.4.20" - testrpc "0.0.1" - web3-utils "^1.0.0-beta.31" - -"@ensdomains/ensjs@^2.0.1": - version "2.1.0" - resolved "https://registry.yarnpkg.com/@ensdomains/ensjs/-/ensjs-2.1.0.tgz#0a7296c1f3d735ef019320d863a7846a0760c460" - integrity sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog== - dependencies: - "@babel/runtime" "^7.4.4" - "@ensdomains/address-encoder" "^0.1.7" - "@ensdomains/ens" "0.4.5" - "@ensdomains/resolver" "0.2.4" - content-hash "^2.5.2" - eth-ens-namehash "^2.0.8" - ethers "^5.0.13" - js-sha3 "^0.8.0" - -"@ensdomains/resolver@0.2.4": - version "0.2.4" - resolved "https://registry.yarnpkg.com/@ensdomains/resolver/-/resolver-0.2.4.tgz#c10fe28bf5efbf49bff4666d909aed0265efbc89" - integrity sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA== - -"@ensdomains/solsha1@0.0.3": - version "0.0.3" - resolved "https://registry.yarnpkg.com/@ensdomains/solsha1/-/solsha1-0.0.3.tgz#fd479da9d40aadb59ff4fb4ec50632e7d2275a83" - integrity sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q== - dependencies: - hash-test-vectors "^1.3.2" - -"@esbuild/android-arm@0.15.15": - version "0.15.15" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.15.tgz#35b3cc0f9e69cb53932d44f60b99dd440335d2f0" - integrity sha512-JJjZjJi2eBL01QJuWjfCdZxcIgot+VoK6Fq7eKF9w4YHm9hwl7nhBR1o2Wnt/WcANk5l9SkpvrldW1PLuXxcbw== - -"@esbuild/linux-loong64@0.15.15": - version "0.15.15" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.15.tgz#32c65517a09320b62530867345222fde7794fbe1" - integrity sha512-lhz6UNPMDXUhtXSulw8XlFAtSYO26WmHQnCi2Lg2p+/TMiJKNLtZCYUxV4wG6rZMzXmr8InGpNwk+DLT2Hm0PA== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@ethereumjs/common@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.5.0.tgz#ec61551b31bef7a69d1dc634d8932468866a4268" - integrity sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.1" - -"@ethereumjs/common@^2.5.0", "@ethereumjs/common@^2.6.4": - version "2.6.5" - resolved "https://registry.yarnpkg.com/@ethereumjs/common/-/common-2.6.5.tgz#0a75a22a046272579d91919cb12d84f2756e8d30" - integrity sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA== - dependencies: - crc-32 "^1.2.0" - ethereumjs-util "^7.1.5" - -"@ethereumjs/tx@3.3.2": - version "3.3.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.3.2.tgz#348d4624bf248aaab6c44fec2ae67265efe3db00" - integrity sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog== - dependencies: - "@ethereumjs/common" "^2.5.0" - ethereumjs-util "^7.1.2" - -"@ethereumjs/tx@^3.3.2": - version "3.5.2" - resolved "https://registry.yarnpkg.com/@ethereumjs/tx/-/tx-3.5.2.tgz#197b9b6299582ad84f9527ca961466fce2296c1c" - integrity sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw== - dependencies: - "@ethereumjs/common" "^2.6.4" - ethereumjs-util "^7.1.5" - -"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.0.0-beta.146", "@ethersproject/abi@^5.0.12", "@ethersproject/abi@^5.0.9", "@ethersproject/abi@^5.1.2", "@ethersproject/abi@^5.6.3", "@ethersproject/abi@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" - integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" - integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - -"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" - integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/address@5.6.1": - version "5.6.1" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.6.1.tgz#ab57818d9aefee919c5721d28cd31fd95eff413d" - integrity sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q== - dependencies: - "@ethersproject/bignumber" "^5.6.2" - "@ethersproject/bytes" "^5.6.1" - "@ethersproject/keccak256" "^5.6.1" - "@ethersproject/logger" "^5.6.0" - "@ethersproject/rlp" "^5.6.1" - -"@ethersproject/address@5.7.0", "@ethersproject/address@^5.0.2", "@ethersproject/address@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" - integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - -"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" - integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - -"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" - integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - -"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.6.2", "@ethersproject/bignumber@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" - integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - bn.js "^5.2.1" - -"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.6.1", "@ethersproject/bytes@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" - integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" - integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - -"@ethersproject/contracts@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" - integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== - dependencies: - "@ethersproject/abi" "^5.7.0" - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - -"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" - integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" - integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" - integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== - dependencies: - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/pbkdf2" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - aes-js "3.0.0" - scrypt-js "3.0.1" - -"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.6.1", "@ethersproject/keccak256@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" - integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - js-sha3 "0.8.0" - -"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.6.0", "@ethersproject/logger@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" - integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== - -"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" - integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" - integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - -"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" - integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== - dependencies: - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/providers@5.7.2": - version "5.7.2" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" - integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/base64" "^5.7.0" - "@ethersproject/basex" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/networks" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/web" "^5.7.0" - bech32 "1.1.4" - ws "7.4.6" - -"@ethersproject/random@5.7.0", "@ethersproject/random@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" - integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.6.1", "@ethersproject/rlp@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" - integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" - integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - hash.js "1.1.7" - -"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" - integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - bn.js "^5.2.1" - elliptic "6.5.4" - hash.js "1.1.7" - -"@ethersproject/solidity@5.7.0", "@ethersproject/solidity@^5.0.9": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" - integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/sha2" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" - integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.6.2", "@ethersproject/transactions@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" - integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== - dependencies: - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/rlp" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - -"@ethersproject/units@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" - integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== - dependencies: - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/constants" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - -"@ethersproject/wallet@5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" - integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== - dependencies: - "@ethersproject/abstract-provider" "^5.7.0" - "@ethersproject/abstract-signer" "^5.7.0" - "@ethersproject/address" "^5.7.0" - "@ethersproject/bignumber" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/hdnode" "^5.7.0" - "@ethersproject/json-wallets" "^5.7.0" - "@ethersproject/keccak256" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/random" "^5.7.0" - "@ethersproject/signing-key" "^5.7.0" - "@ethersproject/transactions" "^5.7.0" - "@ethersproject/wordlists" "^5.7.0" - -"@ethersproject/web@5.7.1", "@ethersproject/web@^5.7.0": - version "5.7.1" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" - integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== - dependencies: - "@ethersproject/base64" "^5.7.0" - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.7.0": - version "5.7.0" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" - integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== - dependencies: - "@ethersproject/bytes" "^5.7.0" - "@ethersproject/hash" "^5.7.0" - "@ethersproject/logger" "^5.7.0" - "@ethersproject/properties" "^5.7.0" - "@ethersproject/strings" "^5.7.0" - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" - integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - get-package-type "^0.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/nyc-config-typescript@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz#1f5235b28540a07219ae0dd42014912a0b19cf89" - integrity sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - -"@istanbuljs/schema@^0.1.2": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" - integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== - -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@metamask/eth-sig-util@^4.0.0": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz#3ad61f6ea9ad73ba5b19db780d40d9aae5157088" - integrity sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ== - dependencies: - ethereumjs-abi "^0.6.8" - ethereumjs-util "^6.2.1" - ethjs-util "^0.1.6" - tweetnacl "^1.0.3" - tweetnacl-util "^0.15.1" - -"@noble/hashes@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.2.tgz#e9e035b9b166ca0af657a7848eb2718f0f22f183" - integrity sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA== - -"@noble/hashes@~1.1.1": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.1.3.tgz#360afc77610e0a61f3417e497dcf36862e4f8111" - integrity sha512-CE0FCR57H2acVI5UOzIGSSIYxZ6v/HOhDR0Ro9VLyhnzLwx0o8W1mmgaqlEUx4049qJDlIBRztv5k+MM8vbO3A== - -"@noble/secp256k1@1.6.3", "@noble/secp256k1@~1.6.0": - version "1.6.3" - resolved "https://registry.yarnpkg.com/@noble/secp256k1/-/secp256k1-1.6.3.tgz#7eed12d9f4404b416999d0c87686836c4c5c9b94" - integrity sha512-T04e4iTurVy7I8Sw4+c5OSN9/RkPlo1uKxAomtxQNLq8j1uPAqnsqG1bqvY3Jv7c13gyr6dui0zmh/I3+f/JaQ== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@nomicfoundation/ethereumjs-block@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz#fdd5c045e7baa5169abeed0e1202bf94e4481c49" - integrity sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-blockchain@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz#1a8c243a46d4d3691631f139bfb3a4a157187b0c" - integrity sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-ethash" "^2.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - level "^8.0.0" - lru-cache "^5.1.1" - memory-level "^1.0.0" - -"@nomicfoundation/ethereumjs-common@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz#f6bcc7753994555e49ab3aa517fc8bcf89c280b9" - integrity sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA== - dependencies: - "@nomicfoundation/ethereumjs-util" "^8.0.0" - crc-32 "^1.2.0" - -"@nomicfoundation/ethereumjs-ethash@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz#11539c32fe0990e1122ff987d1b84cfa34774e81" - integrity sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - abstract-level "^1.0.3" - bigint-crypto-utils "^3.0.23" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-evm@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz#99cd173c03b59107c156a69c5e215409098a370b" - integrity sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/ethereumjs-rlp@^4.0.0", "@nomicfoundation/ethereumjs-rlp@^4.0.0-beta.2": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz#d9a9c5f0f10310c8849b6525101de455a53e771d" - integrity sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw== - -"@nomicfoundation/ethereumjs-statemanager@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz#14a9d4e1c828230368f7ab520c144c34d8721e4b" - integrity sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - -"@nomicfoundation/ethereumjs-trie@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz#dcfbe3be53a94bc061c9767a396c16702bc2f5b7" - integrity sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - readable-stream "^3.6.0" - -"@nomicfoundation/ethereumjs-tx@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz#59dc7452b0862b30342966f7052ab9a1f7802f52" - integrity sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w== - dependencies: - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-util@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz#deb2b15d2c308a731e82977aefc4e61ca0ece6c5" - integrity sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A== - dependencies: - "@nomicfoundation/ethereumjs-rlp" "^4.0.0-beta.2" - ethereum-cryptography "0.1.3" - -"@nomicfoundation/ethereumjs-vm@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz#2bb50d332bf41790b01a3767ffec3987585d1de6" - integrity sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w== - dependencies: - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@types/async-eventemitter" "^0.2.1" - async-eventemitter "^0.2.4" - debug "^4.3.3" - ethereum-cryptography "0.1.3" - functional-red-black-tree "^1.0.1" - mcl-wasm "^0.7.1" - rustbn.js "~0.2.0" - -"@nomicfoundation/hardhat-chai-matchers@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.4.tgz#4b5c0d6eba637aabb49342272ae15ee6877a462e" - integrity sha512-n/5UMwGaUK2zM8ALuMChVwB1lEPeDTb5oBjQ1g7hVsUdS8x+XG9JIEp4Ze6Bwy98tghA7Y1+PCH4SNE2P3UQ2g== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@types/chai-as-promised" "^7.1.3" - chai-as-promised "^7.1.1" - chalk "^2.4.2" - deep-eql "^4.0.1" - ordinal "^1.0.3" - -"@nomicfoundation/hardhat-network-helpers@1.0.6": - version "1.0.6" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz#5e2026ddde5ca539f70a2bf498528afd08bd0827" - integrity sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ== - dependencies: - ethereumjs-util "^7.1.4" - -"@nomicfoundation/hardhat-toolbox@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz#7f86e35c380babb8f26440b7f9a92d7febc1a8ac" - integrity sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ== - -"@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz#83a7367342bd053a76d04bbcf4f373fef07cf760" - integrity sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw== - -"@nomicfoundation/solidity-analyzer-darwin-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz#1225f7da647ae1ad25a87125664704ecc0af6ccc" - integrity sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA== - -"@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz#dbc052dcdfd50ae50fd5ae1788b69b4e0fa40040" - integrity sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg== - -"@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz#e6b2eea633995b557e74e881d2a43eab4760903d" - integrity sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ== - -"@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz#af81107f5afa794f19988a368647727806e18dc4" - integrity sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w== - -"@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz#6877e1da1a06a9f08446070ab6e0a5347109f868" - integrity sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw== - -"@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz#bb6cd83a0c259eccef4183796b6329a66cf7ebd9" - integrity sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg== - -"@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz#9d4bca1cc9a1333fde985675083b0b7d165f6076" - integrity sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw== - -"@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz#0db5bfc6aa952bea4098d8d2c8947b4e5c4337ee" - integrity sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw== - -"@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz#2e0f39a2924dcd77db6b419828595e984fabcb33" - integrity sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA== - -"@nomicfoundation/solidity-analyzer@^0.1.0": - version "0.1.0" - resolved "https://registry.yarnpkg.com/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz#e5ddc43ad5c0aab96e5054520d8e16212e125f50" - integrity sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg== - optionalDependencies: - "@nomicfoundation/solidity-analyzer-darwin-arm64" "0.1.0" - "@nomicfoundation/solidity-analyzer-darwin-x64" "0.1.0" - "@nomicfoundation/solidity-analyzer-freebsd-x64" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-arm64-musl" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-x64-gnu" "0.1.0" - "@nomicfoundation/solidity-analyzer-linux-x64-musl" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc" "0.1.0" - "@nomicfoundation/solidity-analyzer-win32-x64-msvc" "0.1.0" - -"@nomiclabs/hardhat-ethers@2.2.1", "@nomiclabs/hardhat-ethers@^2.0.2": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz#8057b43566a0e41abeb8142064a3c0d3f23dca86" - integrity sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg== - -"@nomiclabs/hardhat-etherscan@3.1.2": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.2.tgz#1f9af26ce7db437eb705d46a99996811b43d0e4a" - integrity sha512-IEikeOVq0C/7CY6aD74d8L4BpGoc/FNiN6ldiPVg0QIFIUSu4FSGA1dmtJZJKk1tjpwgrfTLQNWnigtEaN9REg== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@ethersproject/address" "^5.0.2" - cbor "^5.0.2" - chalk "^2.4.2" - debug "^4.1.1" - fs-extra "^7.0.1" - lodash "^4.17.11" - semver "^6.3.0" - table "^6.8.0" - undici "^5.4.0" - -"@nomiclabs/hardhat-truffle5@^2.0.0": - version "2.0.7" - resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz#7519eadd2c6c460c2addc3d4d6efda7a8883361e" - integrity sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig== - dependencies: - "@nomiclabs/truffle-contract" "^4.2.23" - "@types/chai" "^4.2.0" - chai "^4.2.0" - ethereumjs-util "^7.1.4" - fs-extra "^7.0.1" - -"@nomiclabs/truffle-contract@^4.2.23": - version "4.5.10" - resolved "https://registry.yarnpkg.com/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz#52adcca1068647e1c2b44bf0e6a89fc4ad7f9213" - integrity sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ== - dependencies: - "@ensdomains/ensjs" "^2.0.1" - "@truffle/blockchain-utils" "^0.1.3" - "@truffle/contract-schema" "^3.4.7" - "@truffle/debug-utils" "^6.0.22" - "@truffle/error" "^0.1.0" - "@truffle/interface-adapter" "^0.5.16" - bignumber.js "^7.2.1" - ethereum-ens "^0.8.0" - ethers "^4.0.0-beta.1" - source-map-support "^0.5.19" - -"@openzeppelin/contracts@3.4.1-solc-0.7-2": - version "3.4.1-solc-0.7-2" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz#371c67ebffe50f551c3146a9eec5fe6ffe862e92" - integrity sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q== - -"@openzeppelin/contracts@3.4.2-solc-0.7": - version "3.4.2-solc-0.7" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz#38f4dbab672631034076ccdf2f3201fab1726635" - integrity sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA== - -"@openzeppelin/contracts@4.7.3": - version "4.7.3" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.7.3.tgz#939534757a81f8d69cc854c7692805684ff3111e" - integrity sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw== - -"@openzeppelin/contracts@^4.1.0", "@openzeppelin/contracts@^4.3.2": - version "4.8.0" - resolved "https://registry.yarnpkg.com/@openzeppelin/contracts/-/contracts-4.8.0.tgz#6854c37df205dd2c056bdfa1b853f5d732109109" - integrity sha512-AGuwhRRL+NaKx73WKRNzeCxOCOCxpaqF+kp8TJ89QzAipSwZy/NoflkWaL9bywXFRhIzXt8j38sfF7KBKCPWLw== - -"@pkgr/utils@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" - integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== - dependencies: - cross-spawn "^7.0.3" - is-glob "^4.0.3" - open "^8.4.0" - picocolors "^1.0.0" - tiny-glob "^0.2.9" - tslib "^2.4.0" - -"@scure/base@~1.1.0": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.1.1.tgz#ebb651ee52ff84f420097055f4bf46cfba403938" - integrity sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA== - -"@scure/bip32@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.1.0.tgz#dea45875e7fbc720c2b4560325f1cf5d2246d95b" - integrity sha512-ftTW3kKX54YXLCxH6BB7oEEoJfoE2pIgw7MINKAs5PsS6nqKPuKk1haTF/EuHmYqG330t5GSrdmtRuHaY1a62Q== - dependencies: - "@noble/hashes" "~1.1.1" - "@noble/secp256k1" "~1.6.0" - "@scure/base" "~1.1.0" - -"@scure/bip39@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a" - integrity sha512-pwrPOS16VeTKg98dYXQyIjJEcWfz7/1YJIwxUEPFfQPtc86Ym/1sVgQ2RLoD43AazMk2l/unK4ITySSpW2+82w== - dependencies: - "@noble/hashes" "~1.1.1" - "@scure/base" "~1.1.0" - -"@sentry/core@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" - integrity sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/hub@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" - integrity sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ== - dependencies: - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/minimal@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" - integrity sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sentry/node@^5.18.1": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/node/-/node-5.30.0.tgz#4ca479e799b1021285d7fe12ac0858951c11cd48" - integrity sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg== - dependencies: - "@sentry/core" "5.30.0" - "@sentry/hub" "5.30.0" - "@sentry/tracing" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - cookie "^0.4.1" - https-proxy-agent "^5.0.0" - lru_map "^0.3.3" - tslib "^1.9.3" - -"@sentry/tracing@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" - integrity sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw== - dependencies: - "@sentry/hub" "5.30.0" - "@sentry/minimal" "5.30.0" - "@sentry/types" "5.30.0" - "@sentry/utils" "5.30.0" - tslib "^1.9.3" - -"@sentry/types@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" - integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== - -"@sentry/utils@5.30.0": - version "5.30.0" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" - integrity sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww== - dependencies: - "@sentry/types" "5.30.0" - tslib "^1.9.3" - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": - version "4.6.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" - integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== - -"@sinonjs/commons@^1.6.0", "@sinonjs/commons@^1.7.0", "@sinonjs/commons@^1.8.3": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.5.tgz#e280c94c95f206dcfd5aca00a43f2156b758c764" - integrity sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA== - dependencies: - type-detect "4.0.8" - -"@sinonjs/commons@^2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" - integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^7.0.4": - version "7.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz#2524eae70c4910edccf99b2f4e6efc5894aff7b5" - integrity sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/fake-timers@^9.1.2": - version "9.1.2" - resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" - integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@sinonjs/samsam@^6.0.2": - version "6.1.3" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-6.1.3.tgz#4e30bcd4700336363302a7d72cbec9b9ab87b104" - integrity sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ== - dependencies: - "@sinonjs/commons" "^1.6.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/samsam@^7.0.1": - version "7.0.1" - resolved "https://registry.yarnpkg.com/@sinonjs/samsam/-/samsam-7.0.1.tgz#5b5fa31c554636f78308439d220986b9523fc51f" - integrity sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw== - dependencies: - "@sinonjs/commons" "^2.0.0" - lodash.get "^4.4.2" - type-detect "^4.0.8" - -"@sinonjs/text-encoding@^0.7.1": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" - integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== - -"@solidity-parser/parser@^0.14.0", "@solidity-parser/parser@^0.14.1": - version "0.14.5" - resolved "https://registry.yarnpkg.com/@solidity-parser/parser/-/parser-0.14.5.tgz#87bc3cc7b068e08195c219c91cd8ddff5ef1a804" - integrity sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg== - dependencies: - antlr4ts "^0.5.0-alpha.4" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@szmarczak/http-timer@^4.0.5": - version "4.0.6" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" - integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== - dependencies: - defer-to-connect "^2.0.0" - -"@szmarczak/http-timer@^5.0.1": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-5.0.1.tgz#c7c1bf1141cdd4751b0399c8fc7b8b664cd5be3a" - integrity sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw== - dependencies: - defer-to-connect "^2.0.1" - -"@truffle/abi-utils@^0.3.4": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@truffle/abi-utils/-/abi-utils-0.3.4.tgz#004ec7211cbc2117cf173522107ffaf162b0fa0a" - integrity sha512-cgFwIEugsRdh/NnLJ5ZKDeShkRx3dz1tl/XgFxChuvMjJ9ymlIB8ixSIRuIXP0jlvOs0O8rNJWEjEnUdW5G/VQ== - dependencies: - change-case "3.0.2" - fast-check "3.1.1" - web3-utils "1.7.4" - -"@truffle/blockchain-utils@^0.1.3": - version "0.1.4" - resolved "https://registry.yarnpkg.com/@truffle/blockchain-utils/-/blockchain-utils-0.1.4.tgz#1365b88c3d2922a066d947e93748f09b0fac2e93" - integrity sha512-HegAo5A8UX9vE8dtceBRgCY207gOb9wj54c8mNOOWHcFpkyJz7kZYGo44As6Imh10/0hD2j7vHQ56Jf+uszJ3A== - -"@truffle/codec@^0.14.9": - version "0.14.9" - resolved "https://registry.yarnpkg.com/@truffle/codec/-/codec-0.14.9.tgz#4d2982822d6a2908eaa81113ab48c77dc4b89efe" - integrity sha512-NhgZkFjy73GUasWPq+pga0Qf9DRKmJm42N3rIL1A5ji+bCPgSpOPM4+4xbueEU5oClsUIBR41dEAFy1FvTPmQA== - dependencies: - "@truffle/abi-utils" "^0.3.4" - "@truffle/compile-common" "^0.9.0" - big.js "^6.0.3" - bn.js "^5.1.3" - cbor "^5.2.0" - debug "^4.3.1" - lodash "^4.17.21" - semver "7.3.7" - utf8 "^3.0.0" - web3-utils "1.7.4" - -"@truffle/compile-common@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@truffle/compile-common/-/compile-common-0.9.0.tgz#92ed5f91820b56e15604818464fa3803c6da13e7" - integrity sha512-kpTTU/7ZlQedH6cemCgrqXL4sUjsWAPj7X4LaqQ+KSna3egNJZ6wrKt2kpSYPpCpLihq2IpcBwWar3dTPZ7a5Q== - dependencies: - "@truffle/error" "^0.1.1" - colors "1.4.0" - -"@truffle/contract-schema@^3.4.7": - version "3.4.10" - resolved "https://registry.yarnpkg.com/@truffle/contract-schema/-/contract-schema-3.4.10.tgz#c11a814c13ad55a5e454fb35ddfa291ae0d24ace" - integrity sha512-BhRNRoRvlj2th6E5RNS0BnS0ZxQe01JJz8I7MjkGqdeXSvrn6qDCAnbmvhNgUv0l5h8w5+gBOQhAJhILf1shdQ== - dependencies: - ajv "^6.10.0" - debug "^4.3.1" - -"@truffle/debug-utils@^6.0.22": - version "6.0.40" - resolved "https://registry.yarnpkg.com/@truffle/debug-utils/-/debug-utils-6.0.40.tgz#e93a263f564d652af4be0c17b476f643890162ce" - integrity sha512-4zmMIUjGCKjRmj0W6tJ72RXldPVAoyTHR524r/g70IBJRf67gQnWq3k8K3EWuepQoeL1jLhzGFO+lb5AZTAoUQ== - dependencies: - "@truffle/codec" "^0.14.9" - "@trufflesuite/chromafi" "^3.0.0" - bn.js "^5.1.3" - chalk "^2.4.2" - debug "^4.3.1" - highlightjs-solidity "^2.0.5" - -"@truffle/error@^0.1.0", "@truffle/error@^0.1.1": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@truffle/error/-/error-0.1.1.tgz#e52026ac8ca7180d83443dca73c03e07ace2a301" - integrity sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA== - -"@truffle/interface-adapter@^0.5.16": - version "0.5.24" - resolved "https://registry.yarnpkg.com/@truffle/interface-adapter/-/interface-adapter-0.5.24.tgz#c537cced3f2d991afd44046a047b3b62f3f995f5" - integrity sha512-c4nFMnzSuE//xUd16CDc7mjx1NVe5kEDoid/utsma5JPg+AxnOkD4j1QGl7xMqCwQVARLF53FfQzt4DFmZcznQ== - dependencies: - bn.js "^5.1.3" - ethers "^4.0.32" - web3 "1.7.4" - -"@trufflesuite/chromafi@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz#f6956408c1af6a38a6ed1657783ce59504a1eb8b" - integrity sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ== - dependencies: - camelcase "^4.1.0" - chalk "^2.3.2" - cheerio "^1.0.0-rc.2" - detect-indent "^5.0.0" - highlight.js "^10.4.1" - lodash.merge "^4.6.2" - strip-ansi "^4.0.0" - strip-indent "^2.0.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@typechain/ethers-v5@10.1.1": - version "10.1.1" - resolved "https://registry.yarnpkg.com/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz#fdb527d8854129cea5f139d76c6c6e1c9bb040ec" - integrity sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw== - dependencies: - lodash "^4.17.15" - ts-essentials "^7.0.1" - -"@typechain/hardhat@6.1.4": - version "6.1.4" - resolved "https://registry.yarnpkg.com/@typechain/hardhat/-/hardhat-6.1.4.tgz#da930bf17bdae5e0996b86d37992c6c58b8a49c8" - integrity sha512-S8k5d1Rjc+plwKpkorlifmh72M7Ki0XNUOVVLtdbcA/vLaEkuqZSJFdddpBgS5QxiJP+6CbRa/yO6EVTE2+fMQ== - dependencies: - fs-extra "^9.1.0" - -"@types/async-eventemitter@^0.2.1": - version "0.2.1" - resolved "https://registry.yarnpkg.com/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz#f8e6280e87e8c60b2b938624b0a3530fb3e24712" - integrity sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg== - -"@types/bn.js@^4.11.3": - version "4.11.6" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" - integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== - dependencies: - "@types/node" "*" - -"@types/bn.js@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.1.tgz#b51e1b55920a4ca26e9285ff79936bbdec910682" - integrity sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g== - dependencies: - "@types/node" "*" - -"@types/cacheable-request@^6.0.1", "@types/cacheable-request@^6.0.2": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" - integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== - dependencies: - "@types/http-cache-semantics" "*" - "@types/keyv" "^3.1.4" - "@types/node" "*" - "@types/responselike" "^1.0.0" - -"@types/chai-as-promised@^7.1.3", "@types/chai-as-promised@^7.1.4", "@types/chai-as-promised@^7.1.5": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz#6e016811f6c7a64f2eed823191c3a6955094e255" - integrity sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ== - dependencies: - "@types/chai" "*" - -"@types/chai@*", "@types/chai@^4.2.0", "@types/chai@^4.2.22": - version "4.3.4" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.4.tgz#e913e8175db8307d78b4e8fa690408ba6b65dee4" - integrity sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw== - -"@types/concat-stream@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@types/concat-stream/-/concat-stream-1.6.1.tgz#24bcfc101ecf68e886aaedce60dfd74b632a1b74" - integrity sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA== - dependencies: - "@types/node" "*" - -"@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== - dependencies: - "@types/ms" "*" - -"@types/dompurify@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@types/dompurify/-/dompurify-2.4.0.tgz#fd9706392a88e0e0e6d367f3588482d817df0ab9" - integrity sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg== - dependencies: - "@types/trusted-types" "*" - -"@types/form-data@0.0.33": - version "0.0.33" - resolved "https://registry.yarnpkg.com/@types/form-data/-/form-data-0.0.33.tgz#c9ac85b2a5fd18435b8c85d9ecb50e6d6c893ff8" - integrity sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw== - dependencies: - "@types/node" "*" - -"@types/fs-extra@^9.0.13": - version "9.0.13" - resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-9.0.13.tgz#7594fbae04fe7f1918ce8b3d213f74ff44ac1f45" - integrity sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/http-cache-semantics@*": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" - integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/json-schema@^7.0.7": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/keyv@^3.1.4": - version "3.1.4" - resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" - integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== - dependencies: - "@types/node" "*" - -"@types/lodash@4.14.189": - version "4.14.189" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.189.tgz#975ff8c38da5ae58b751127b19ad5e44b5b7f6d2" - integrity sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA== - -"@types/lru-cache@^5.1.0": - version "5.1.1" - resolved "https://registry.yarnpkg.com/@types/lru-cache/-/lru-cache-5.1.1.tgz#c48c2e27b65d2a153b19bfc1a317e30872e01eef" - integrity sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw== - -"@types/mermaid@^9.1.0": - version "9.1.0" - resolved "https://registry.yarnpkg.com/@types/mermaid/-/mermaid-9.1.0.tgz#e9ba511d8a6793749d6be84f86325f0f58553154" - integrity sha512-rc8QqhveKAY7PouzY/p8ljS+eBSNCv7o79L97RSub/Ic2SQ34ph1Ng3s8wFLWVjvaEt6RLOWtSCsgYWd95NY8A== - -"@types/minimatch@*": - version "5.1.2" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-5.1.2.tgz#07508b45797cb81ec3f273011b054cd0755eddca" - integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== - -"@types/mocha@^9.0.0": - version "9.1.1" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" - integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== - -"@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== - -"@types/ndjson@2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/ndjson/-/ndjson-2.0.1.tgz#0279bc20949bfb861d69ac3de5292775b169a2d0" - integrity sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw== - dependencies: - "@types/node" "*" - "@types/through" "*" - -"@types/node@*": - version "18.11.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" - integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== - -"@types/node@12.20.25": - version "12.20.25" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.25.tgz#882bea2ca0d2ec22126b92b4dd2dc24b35a07469" - integrity sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q== - -"@types/node@^10.0.3": - version "10.17.60" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.60.tgz#35f3d6213daed95da7f0f73e75bcc6980e90597b" - integrity sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw== - -"@types/node@^12.12.6": - version "12.20.55" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" - integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== - -"@types/node@^8.0.0": - version "8.10.66" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3" - integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw== - -"@types/object-hash@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@types/object-hash/-/object-hash-2.2.1.tgz#67c169f8f033e0b62abbf81df2d00f4598d540b9" - integrity sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ== - -"@types/pbkdf2@^3.0.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" - integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== - dependencies: - "@types/node" "*" - -"@types/prettier@^2.1.1": - version "2.7.1" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" - integrity sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow== - -"@types/prompts@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@types/prompts/-/prompts-2.4.2.tgz#0785dc09ca79e15ff11b20b7cda2f87af3165a7d" - integrity sha512-TwNx7qsjvRIUv/BCx583tqF5IINEVjCNqg9ofKHRlSoUHE62WBHrem4B1HGXcIrG511v29d1kJ9a/t2Esz7MIg== - dependencies: - "@types/node" "*" - kleur "^3.0.3" - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/qs@^6.2.31": - version "6.9.7" - resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/react@^17.0.35": - version "17.0.52" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" - integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/responselike@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29" - integrity sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== - -"@types/secp256k1@^4.0.1": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.3.tgz#1b8e55d8e00f08ee7220b4d59a6abe89c37a901c" - integrity sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w== - dependencies: - "@types/node" "*" - -"@types/sinon@^10.0.13", "@types/sinon@^10.0.6": - version "10.0.13" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-10.0.13.tgz#60a7a87a70d9372d0b7b38cc03e825f46981fb83" - integrity sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ== - dependencies: - "@types/sinonjs__fake-timers" "*" - -"@types/sinonjs__fake-timers@*": - version "8.1.2" - resolved "https://registry.yarnpkg.com/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz#bf2e02a3dbd4aecaf95942ecd99b7402e03fad5e" - integrity sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA== - -"@types/through@*": - version "0.0.30" - resolved "https://registry.yarnpkg.com/@types/through/-/through-0.0.30.tgz#e0e42ce77e897bd6aead6f6ea62aeb135b8a3895" - integrity sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg== - dependencies: - "@types/node" "*" - -"@types/tmp@^0.2.2": - version "0.2.3" - resolved "https://registry.yarnpkg.com/@types/tmp/-/tmp-0.2.3.tgz#908bfb113419fd6a42273674c00994d40902c165" - integrity sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA== - -"@types/trusted-types@*": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.2.tgz#fc25ad9943bcac11cceb8168db4f275e0e72e756" - integrity sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg== - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^13.0.0": - version "13.0.12" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.12.tgz#d895a88c703b78af0465a9de88aa92c61430b092" - integrity sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ== - dependencies: - "@types/yargs-parser" "*" - -"@types/yoga-layout@1.9.2": - version "1.9.2" - resolved "https://registry.yarnpkg.com/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" - integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== - -"@typescript-eslint/eslint-plugin@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz#9f41efaee32cdab7ace94b15bd19b756dd099b0a" - integrity sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA== - dependencies: - "@typescript-eslint/experimental-utils" "4.31.2" - "@typescript-eslint/scope-manager" "4.31.2" - debug "^4.3.1" - functional-red-black-tree "^1.0.1" - regexpp "^3.1.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz#98727a9c1e977dd5d20c8705e69cd3c2a86553fa" - integrity sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.31.2" - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/typescript-estree" "4.31.2" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.31.2.tgz#54aa75986e3302d91eff2bbbaa6ecfa8084e9c34" - integrity sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw== - dependencies: - "@typescript-eslint/scope-manager" "4.31.2" - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/typescript-estree" "4.31.2" - debug "^4.3.1" - -"@typescript-eslint/scope-manager@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz#1d528cb3ed3bcd88019c20a57c18b897b073923a" - integrity sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - -"@typescript-eslint/types@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.31.2.tgz#2aea7177d6d744521a168ed4668eddbd912dfadf" - integrity sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w== - -"@typescript-eslint/typescript-estree@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz#abfd50594d8056b37e7428df3b2d185ef2d0060c" - integrity sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA== - dependencies: - "@typescript-eslint/types" "4.31.2" - "@typescript-eslint/visitor-keys" "4.31.2" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/visitor-keys@4.31.2": - version "4.31.2" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz#7d5b4a4705db7fe59ecffb273c1d082760f635cc" - integrity sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug== - dependencies: - "@typescript-eslint/types" "4.31.2" - eslint-visitor-keys "^2.0.0" - -"@ungap/promise-all-settled@1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" - integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== - -"@uniswap/lib@^4.0.1-alpha": - version "4.0.1-alpha" - resolved "https://registry.yarnpkg.com/@uniswap/lib/-/lib-4.0.1-alpha.tgz#2881008e55f075344675b3bca93f020b028fbd02" - integrity sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA== - -"@uniswap/sdk-core@^3.0.1": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@uniswap/sdk-core/-/sdk-core-3.1.0.tgz#595b6396763fd2553531423c8eec83bfb4840a27" - integrity sha512-YRrp6vYAbYmi3uDXQGkvj2eT8BMpNnUdCFb8GifDG0Ei+ohIpC4RNAB+5/ru3zR2Byhx8VahGrSKuvdd6BVMyA== - dependencies: - "@ethersproject/address" "^5.0.2" - big.js "^5.2.2" - decimal.js-light "^2.5.0" - jsbi "^3.1.4" - tiny-invariant "^1.1.0" - toformat "^2.0.0" - -"@uniswap/swap-router-contracts@1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz#e027b14d4c172f231c53c48e1fd708a78d7d94d8" - integrity sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - "@uniswap/v3-periphery" "1.3.0" - hardhat-watcher "^2.1.1" - -"@uniswap/swap-router-contracts@^1.2.1": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz#8d555ca6d74b888d6e02a26ebb806ce315605f1f" - integrity sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A== - dependencies: - "@openzeppelin/contracts" "3.4.2-solc-0.7" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - "@uniswap/v3-periphery" "1.4.1" - dotenv "^14.2.0" - hardhat-watcher "^2.1.1" - -"@uniswap/v2-core@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@uniswap/v2-core/-/v2-core-1.0.1.tgz#af8f508bf183204779938969e2e54043e147d425" - integrity sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q== - -"@uniswap/v3-core@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-core/-/v3-core-1.0.0.tgz#6c24adacc4c25dceee0ba3ca142b35adbd7e359d" - integrity sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA== - -"@uniswap/v3-periphery@1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz#be6dfca7b29318ea0d76a7baf15d3b33c3c5e90a" - integrity sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - hardhat-watcher "^2.1.1" - -"@uniswap/v3-periphery@1.3.0", "v3-periphery-1_3_0@npm:@uniswap/v3-periphery@1.3.0": - name v3-periphery-1_3_0 - version "1.3.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz#37f0a1ef6025221722e50e9f3f2009c2d5d6e4ec" - integrity sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - hardhat-watcher "^2.1.1" - -"@uniswap/v3-periphery@1.4.1": - version "1.4.1" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz#b90f08b7386163c0abfd7258831caef6339c7862" - integrity sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg== - dependencies: - "@openzeppelin/contracts" "3.4.2-solc-0.7" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - hardhat-watcher "^2.1.1" - -"@uniswap/v3-periphery@^1.0.1", "@uniswap/v3-periphery@^1.1.1": - version "1.4.3" - resolved "https://registry.yarnpkg.com/@uniswap/v3-periphery/-/v3-periphery-1.4.3.tgz#a6da4632dbd46b139cc13a410e4ec09ad22bd19f" - integrity sha512-80c+wtVzl5JJT8UQskxVYYG3oZb4pkhY0zDe0ab/RX4+8f9+W5d8wI4BT0wLB0wFQTSnbW+QdBSpkHA/vRyGBA== - dependencies: - "@openzeppelin/contracts" "3.4.2-solc-0.7" - "@uniswap/lib" "^4.0.1-alpha" - "@uniswap/v2-core" "1.0.1" - "@uniswap/v3-core" "1.0.0" - base64-sol "1.0.1" - -"@uniswap/v3-sdk@3.9.0": - version "3.9.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz#de93fa19f89c29d460996aa4d0b4bb6531641105" - integrity sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ== - dependencies: - "@ethersproject/abi" "^5.0.12" - "@ethersproject/solidity" "^5.0.9" - "@uniswap/sdk-core" "^3.0.1" - "@uniswap/swap-router-contracts" "^1.2.1" - "@uniswap/v3-periphery" "^1.1.1" - "@uniswap/v3-staker" "1.0.0" - tiny-invariant "^1.1.0" - tiny-warning "^1.0.3" - -"@uniswap/v3-staker@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz#9a6915ec980852479dfc903f50baf822ff8fa66e" - integrity sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/v3-core" "1.0.0" - "@uniswap/v3-periphery" "^1.0.1" - -"@uniswap/v3-staker@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz#febad4905903032bb114ab58138c2d5200c87a3c" - integrity sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ== - dependencies: - "@openzeppelin/contracts" "3.4.1-solc-0.7-2" - "@uniswap/v3-core" "1.0.0" - "@uniswap/v3-periphery" "^1.0.1" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@1.0.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -abortcontroller-polyfill@^1.7.3: - version "1.7.5" - resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz#6738495f4e901fbb57b6c0611d0c75f76c485bed" - integrity sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ== - -abstract-level@^1.0.0, abstract-level@^1.0.2, abstract-level@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/abstract-level/-/abstract-level-1.0.3.tgz#78a67d3d84da55ee15201486ab44c09560070741" - integrity sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA== - dependencies: - buffer "^6.0.3" - catering "^2.1.0" - is-buffer "^2.0.5" - level-supports "^4.0.0" - level-transcoder "^1.0.1" - module-error "^1.0.1" - queue-microtask "^1.2.3" - -accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-jsx@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.4.1: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== - -address@^1.0.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/address/-/address-1.2.1.tgz#25bb61095b7522d65b357baa11bc05492d4c8acd" - integrity sha512-B+6bi5D34+fDYENiH5qOlA0cV2rAGKuWZ9LeyUUehbXy8e0VS9e498yO0Jeeh+iM+6KbfudHTFjXw2MmJD4QRA== - -adm-zip@^0.4.16: - version "0.4.16" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.16.tgz#cf4c508fdffab02c269cbc7f471a875f05570365" - integrity sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg== - -aes-js@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" - integrity sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw== - -agent-base@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.1: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -amdefine@>=0.0.4: - version "1.0.1" - resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== - -ansi-colors@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" - integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== - -ansi-colors@4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-colors@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" - integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -antlr4ts@^0.5.0-alpha.4: - version "0.5.0-alpha.4" - resolved "https://registry.yarnpkg.com/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz#71702865a87478ed0b40c0709f422cf14d51652a" - integrity sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ== - -anymatch@~3.1.1, anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -append-transform@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" - integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== - dependencies: - default-require-extensions "^3.0.0" - -archy@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-back@^3.0.1, array-back@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-3.1.0.tgz#b8859d7a508871c9a7b2cf42f99428f65e96bfb0" - integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q== - -array-back@^4.0.1, array-back@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/array-back/-/array-back-4.0.2.tgz#8004e999a6274586beeb27342168652fdb89fa1e" - integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-includes@^3.1.3: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-uniq@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== - -array.prototype.flat@^1.2.4: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.reduce@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz#6b20b0daa9d9734dd6bc7ea66b5bbce395471eac" - integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-array-method-boxes-properly "^1.0.0" - is-string "^1.0.7" - -asap@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -asn1.js@^5.2.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-5.4.1.tgz#11a980b84ebb91781ce35b0fdc2ee294e3783f07" - integrity sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - safer-buffer "^2.1.0" - -asn1@~0.2.3: - version "0.2.6" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d" - integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== - dependencies: - safer-buffer "~2.1.0" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== - -assertion-error@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async-eventemitter@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" - integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== - dependencies: - async "^2.4.0" - -async-limiter@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" - integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== - -async@1.x: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w== - -async@^2.4.0: - version "2.6.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" - integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== - dependencies: - lodash "^4.17.14" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -auto-bind@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" - integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== - -aws4@^1.8.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^3.0.2, base-x@^3.0.8: - version "3.0.9" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" - integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== - dependencies: - safe-buffer "^5.0.1" - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base64-sol@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/base64-sol/-/base64-sol-1.0.1.tgz#91317aa341f0bc763811783c5729f1c2574600f6" - integrity sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg== - -bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== - dependencies: - tweetnacl "^0.14.3" - -bech32@1.1.4, bech32@^1.1.3: - version "1.1.4" - resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" - integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== - -big-integer@1.6.36: - version "1.6.36" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.36.tgz#78631076265d4ae3555c04f85e7d9d2f3a071a36" - integrity sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -big.js@^6.0.3: - version "6.2.1" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" - integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== - -bigint-crypto-utils@^3.0.23: - version "3.1.7" - resolved "https://registry.yarnpkg.com/bigint-crypto-utils/-/bigint-crypto-utils-3.1.7.tgz#c4c1b537c7c1ab7aadfaecf3edfd45416bf2c651" - integrity sha512-zpCQpIE2Oy5WIQpjC9iYZf8Uh9QqoS51ZCooAcNvzv1AQ3VWdT52D0ksr1+/faeK8HVIej1bxXcP75YcqH3KPA== - dependencies: - bigint-mod-arith "^3.1.0" - -bigint-mod-arith@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz#658e416bc593a463d97b59766226d0a3021a76b1" - integrity sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ== - -bignumber.js@9.1.0, bignumber.js@^9.0.0, bignumber.js@^9.0.1: - version "9.1.0" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" - integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== - -bignumber.js@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-7.2.1.tgz#80c048759d826800807c4bfd521e50edbba57a5f" - integrity sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -blakejs@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.2.1.tgz#5057e4206eadb4a97f7c0b6e197a505042fc3814" - integrity sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ== - -bluebird@^3.4.7, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@^3.5.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@4.11.6: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - integrity sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.0, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9: - version "4.12.0" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" - integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== - -bn.js@^5.0.0, bn.js@^5.1.1, bn.js@^5.1.2, bn.js@^5.1.3, bn.js@^5.2.0, bn.js@^5.2.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" - integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== - -body-parser@1.20.1, body-parser@^1.16.0: - version "1.20.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.0.1, brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browser-level@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browser-level/-/browser-level-1.0.1.tgz#36e8c3183d0fe1c405239792faaab5f315871011" - integrity sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.1" - module-error "^1.0.2" - run-parallel-limit "^1.1.0" - -browser-stdout@1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.1.0.tgz#b2fd06b5b75ae297f7ce2dc651f918f5be158c8d" - integrity sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog== - dependencies: - bn.js "^5.0.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.1.tgz#eaf4add46dd54be3bb3b36c0cf15abbeba7956c3" - integrity sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg== - dependencies: - bn.js "^5.1.1" - browserify-rsa "^4.0.1" - create-hash "^1.2.0" - create-hmac "^1.1.7" - elliptic "^6.5.3" - inherits "^2.0.4" - parse-asn1 "^5.1.5" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -bs58@^4.0.0, bs58@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" - integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== - dependencies: - base-x "^3.0.2" - -bs58check@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" - integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== - dependencies: - bs58 "^4.0.0" - create-hash "^1.1.0" - safe-buffer "^5.1.2" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-to-arraybuffer@^0.0.5: - version "0.0.5" - resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" - integrity sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ== - -buffer@6.0.3, buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffer@^5.0.5, buffer@^5.5.0, buffer@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -bufferutil@^4.0.1: - version "4.0.7" - resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.7.tgz#60c0d19ba2c992dd8273d3f73772ffc894c153ad" - integrity sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw== - dependencies: - node-gyp-build "^4.3.0" - -busboy@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-lookup@^5.0.3: - version "5.0.4" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" - integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== - -cacheable-lookup@^6.0.4: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz#0330a543471c61faa4e9035db583aad753b36385" - integrity sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -cacheable-request@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.2.tgz#ea0d0b889364a25854757301ca12b2da77f91d27" - integrity sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" - responselike "^2.0.0" - -caching-transform@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" - integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== - dependencies: - hasha "^5.0.0" - make-dir "^3.0.0" - package-hash "^4.0.0" - write-file-atomic "^3.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz#ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73" - integrity sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w== - dependencies: - no-case "^2.2.0" - upper-case "^1.1.1" - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg== - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-lite@^1.0.30001400: - version "1.0.30001434" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001434.tgz#ec1ec1cfb0a93a34a0600d37903853030520a4e5" - integrity sha512-aOBHrLmTQw//WFa2rcF1If9fa3ypkC1wzqqiKHgfdrXTWcU8C4gKVZT77eQAPWN1APys3+uQ0Df07rKauXGEYA== - -caseless@^0.12.0, caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== - -catering@^2.1.0, catering@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/catering/-/catering-2.1.1.tgz#66acba06ed5ee28d5286133982a927de9a04b510" - integrity sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w== - -cbor@^5.0.2, cbor@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cbor/-/cbor-5.2.0.tgz#4cca67783ccd6de7b50ab4ed62636712f287a67c" - integrity sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A== - dependencies: - bignumber.js "^9.0.1" - nofilter "^1.0.4" - -chai-as-promised@7.1.1, chai-as-promised@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" - integrity sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA== - dependencies: - check-error "^1.0.2" - -chai@4.3.7, chai@^4.2.0, chai@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== - dependencies: - assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" - pathval "^1.1.1" - type-detect "^4.0.5" - -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.3.2, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -change-case@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/change-case/-/change-case-3.0.2.tgz#fd48746cce02f03f0a672577d1d3a8dc2eceb037" - integrity sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA== - dependencies: - camel-case "^3.0.0" - constant-case "^2.0.0" - dot-case "^2.1.0" - header-case "^1.0.0" - is-lower-case "^1.1.0" - is-upper-case "^1.1.0" - lower-case "^1.1.1" - lower-case-first "^1.0.0" - no-case "^2.3.2" - param-case "^2.1.0" - pascal-case "^2.0.0" - path-case "^2.1.0" - sentence-case "^2.1.0" - snake-case "^2.1.0" - swap-case "^1.1.0" - title-case "^2.1.0" - upper-case "^1.1.1" - upper-case-first "^1.1.0" - -"charenc@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== - -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.2: - version "1.0.0-rc.12" - resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" - integrity sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A== - dependencies: - anymatch "~3.1.1" - braces "~3.0.2" - glob-parent "~5.1.0" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.2.0" - optionalDependencies: - fsevents "~2.1.1" - -chokidar@3.5.3, chokidar@^3.4.0, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cids@^0.7.1: - version "0.7.5" - resolved "https://registry.yarnpkg.com/cids/-/cids-0.7.5.tgz#60a08138a99bfb69b6be4ceb63bfef7a396b28b2" - integrity sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA== - dependencies: - buffer "^5.5.0" - class-is "^1.1.0" - multibase "~0.6.0" - multicodec "^1.0.0" - multihashes "~0.4.15" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-is@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/class-is/-/class-is-1.1.0.tgz#9d3c0fba0440d211d843cec3dedfa48055005825" - integrity sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw== - -classic-level@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/classic-level/-/classic-level-1.2.0.tgz#2d52bdec8e7a27f534e67fdeb890abef3e643c27" - integrity sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg== - dependencies: - abstract-level "^1.0.2" - catering "^2.1.0" - module-error "^1.0.1" - napi-macros "~2.0.0" - node-gyp-build "^4.3.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-spinners@^2.3.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== - -cli-table3@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== - dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" - optionalDependencies: - colors "^1.1.2" - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -cliui@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" - integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^6.2.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -code-excerpt@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" - integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== - dependencies: - convert-to-spaces "^1.0.1" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colors@1.4.0, colors@^1.1.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -combined-stream@^1.0.6, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -command-exists@^1.2.8: - version "1.2.9" - resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.9.tgz#c50725af3808c8ab0260fd60b01fbfa25b954f69" - integrity sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w== - -command-line-args@^5.1.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/command-line-args/-/command-line-args-5.2.1.tgz#c44c32e437a57d7c51157696893c5909e9cec42e" - integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg== - dependencies: - array-back "^3.1.0" - find-replace "^3.0.0" - lodash.camelcase "^4.3.0" - typical "^4.0.0" - -command-line-usage@^6.1.0: - version "6.1.3" - resolved "https://registry.yarnpkg.com/command-line-usage/-/command-line-usage-6.1.3.tgz#428fa5acde6a838779dfa30e44686f4b6761d957" - integrity sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw== - dependencies: - array-back "^4.0.2" - chalk "^2.4.2" - table-layout "^1.0.2" - typical "^5.2.0" - -commander@2: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-3.0.2.tgz#6837c3fb677ad9933d1cfba42dd14d5117d6b39e" - integrity sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow== - -commander@7: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -concat-stream@^1.6.0, concat-stream@^1.6.2: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -constant-case@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-2.0.0.tgz#4175764d389d3fa9c8ecd29186ed6005243b6a46" - integrity sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ== - dependencies: - snake-case "^2.1.0" - upper-case "^1.1.1" - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-hash@^2.5.2: - version "2.5.2" - resolved "https://registry.yarnpkg.com/content-hash/-/content-hash-2.5.2.tgz#bbc2655e7c21f14fd3bfc7b7d4bfe6e454c9e211" - integrity sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw== - dependencies: - cids "^0.7.1" - multicodec "^0.5.5" - multihashes "^0.4.15" - -content-type@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -convert-to-spaces@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -cookie@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" - integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== - -cookiejar@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== - -core-util-is@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cors@^2.8.1: - version "2.8.5" - resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29" - integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== - dependencies: - object-assign "^4" - vary "^1" - -crc-32@^1.2.0: - version "1.2.2" - resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff" - integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== - -create-ecdh@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.4.tgz#d6e7f4bffa66736085a0762fd3a632684dabcc4e" - integrity sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A== - dependencies: - bn.js "^4.1.0" - elliptic "^6.5.3" - -create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-fetch@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -"crypt@>= 0.0.1": - version "0.0.2" - resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== - -crypto-addr-codec@^0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz#e16cea892730178fe25a38f6d15b680cab3124ae" - integrity sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg== - dependencies: - base-x "^3.0.8" - big-integer "1.6.36" - blakejs "^1.1.0" - bs58 "^4.0.1" - ripemd160-min "0.0.6" - safe-buffer "^5.2.0" - sha3 "^2.1.1" - -crypto-browserify@3.12.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== - -d3-array@1, d3-array@^1.1.1, d3-array@^1.2.0: - version "1.2.4" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-1.2.4.tgz#635ce4d5eea759f6f605863dbcfc30edc737f71f" - integrity sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw== - -"d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.0.tgz#15bf96cd9b7333e02eb8de8053d78962eafcff14" - integrity sha512-3yXFQo0oG3QCxbF06rMPFyGRMGJNS7NvsV1+2joOjbBE+9xvWQ8+GcMJAjRCzw06zQ3/arXeJgbPYcjUCuC+3g== - dependencies: - internmap "1 - 2" - -d3-axis@1: - version "1.0.12" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-1.0.12.tgz#cdf20ba210cfbb43795af33756886fb3638daac9" - integrity sha512-ejINPfPSNdGFKEOAtnBtdkpr24c4d4jsei6Lg98mxf424ivoDP2956/5HDpIAtmHo85lqT4pruy+zEgvRUBqaQ== - -d3-axis@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-axis/-/d3-axis-3.0.0.tgz#c42a4a13e8131d637b745fc2973824cfeaf93322" - integrity sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw== - -d3-brush@1: - version "1.1.6" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-1.1.6.tgz#b0a22c7372cabec128bdddf9bddc058592f89e9b" - integrity sha512-7RW+w7HfMCPyZLifTz/UnJmI5kdkXtpCbombUSs8xniAyo0vIbrDzDwUJB6eJOgl9u5DQOt2TQlYumxzD1SvYA== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-brush@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-brush/-/d3-brush-3.0.0.tgz#6f767c4ed8dcb79de7ede3e1c0f89e63ef64d31c" - integrity sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "3" - d3-transition "3" - -d3-chord@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-1.0.6.tgz#309157e3f2db2c752f0280fedd35f2067ccbb15f" - integrity sha512-JXA2Dro1Fxw9rJe33Uv+Ckr5IrAa74TlfDEhE/jfLOaXegMQFQTAgAw9WnZL8+HxVBRXaRGCkrNU7pJeylRIuA== - dependencies: - d3-array "1" - d3-path "1" - -d3-chord@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-chord/-/d3-chord-3.0.1.tgz#d156d61f485fce8327e6abf339cb41d8cbba6966" - integrity sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g== - dependencies: - d3-path "1 - 3" - -d3-collection@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" - integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -"d3-color@1 - 3", d3-color@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" - integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== - -d3-contour@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-1.3.2.tgz#652aacd500d2264cb3423cee10db69f6f59bead3" - integrity sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg== - dependencies: - d3-array "^1.1.1" - -d3-contour@4: - version "4.0.0" - resolved "https://registry.yarnpkg.com/d3-contour/-/d3-contour-4.0.0.tgz#5a1337c6da0d528479acdb5db54bc81a0ff2ec6b" - integrity sha512-7aQo0QHUTu/Ko3cP9YK9yUTxtoDEiDGwnBHyLxG5M4vqlBkO/uixMRele3nfsfj6UXOcuReVpVXzAboGraYIJw== - dependencies: - d3-array "^3.2.0" - -d3-delaunay@6: - version "6.0.2" - resolved "https://registry.yarnpkg.com/d3-delaunay/-/d3-delaunay-6.0.2.tgz#7fd3717ad0eade2fc9939f4260acfb503f984e92" - integrity sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ== - dependencies: - delaunator "5" - -d3-dispatch@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-1.0.6.tgz#00d37bcee4dd8cd97729dd893a0ac29caaba5d58" - integrity sha512-fVjoElzjhCEy+Hbn8KygnmMS7Or0a9sI2UzGwoB7cCtvI1XpVN9GpoYlnb3xt2YV66oXYb1fLJ8GMvP4hdU1RA== - -"d3-dispatch@1 - 3", d3-dispatch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" - integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== - -d3-drag@1: - version "1.2.5" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-1.2.5.tgz#2537f451acd39d31406677b7dc77c82f7d988f70" - integrity sha512-rD1ohlkKQwMZYkQlYVCrSFxsWPzI97+W+PaEIBNTMxRuxz9RF0Hi5nJWHGVJ3Om9d2fRTe1yOBINJyy/ahV95w== - dependencies: - d3-dispatch "1" - d3-selection "1" - -"d3-drag@2 - 3", d3-drag@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-drag/-/d3-drag-3.0.0.tgz#994aae9cd23c719f53b5e10e3a0a6108c69607ba" - integrity sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg== - dependencies: - d3-dispatch "1 - 3" - d3-selection "3" - -d3-dsv@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-1.2.0.tgz#9d5f75c3a5f8abd611f74d3f5847b0d4338b885c" - integrity sha512-9yVlqvZcSOMhCYzniHE7EVUws7Fa1zgw+/EAV2BxJoG3ME19V6BQFBwI855XQDsxyOuG7NibqRMTtiF/Qup46g== - dependencies: - commander "2" - iconv-lite "0.4" - rw "1" - -"d3-dsv@1 - 3", d3-dsv@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" - integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== - dependencies: - commander "7" - iconv-lite "0.6" - rw "1" - -d3-ease@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== - -"d3-ease@1 - 3", d3-ease@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" - integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== - -d3-fetch@1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-1.2.0.tgz#15ce2ecfc41b092b1db50abd2c552c2316cf7fc7" - integrity sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA== - dependencies: - d3-dsv "1" - -d3-fetch@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" - integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== - dependencies: - d3-dsv "1 - 3" - -d3-force@1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-1.2.1.tgz#fd29a5d1ff181c9e7f0669e4bd72bdb0e914ec0b" - integrity sha512-HHvehyaiUlVo5CxBJ0yF/xny4xoaxFxDnBXNvNcfW9adORGZfyNF1dj6DGLKyk4Yh3brP/1h3rnDzdIAwL08zg== - dependencies: - d3-collection "1" - d3-dispatch "1" - d3-quadtree "1" - d3-timer "1" - -d3-force@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" - integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== - dependencies: - d3-dispatch "1 - 3" - d3-quadtree "1 - 3" - d3-timer "1 - 3" - -d3-format@1: - version "1.4.5" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-1.4.5.tgz#374f2ba1320e3717eb74a9356c67daee17a7edb4" - integrity sha512-J0piedu6Z8iB6TbIGfZgDzfXxUFN3qQRMofy2oPdXzQibYGqPB/9iMcxr/TGalU+2RsyDO+U4f33id8tbnSRMQ== - -"d3-format@1 - 3", d3-format@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" - integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== - -d3-geo@1: - version "1.12.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-1.12.1.tgz#7fc2ab7414b72e59fbcbd603e80d9adc029b035f" - integrity sha512-XG4d1c/UJSEX9NfU02KwBL6BYPj8YKHxgBEw5om2ZnTRSbIcego6dhHwcxuSR3clxh0EpE38os1DVPOmnYtTPg== - dependencies: - d3-array "1" - -d3-geo@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.0.1.tgz#4f92362fd8685d93e3b1fae0fd97dc8980b1ed7e" - integrity sha512-Wt23xBych5tSy9IYAM1FR2rWIBFWa52B/oF/GYe5zbdHrg08FU8+BuI6X4PvTwPDdqdAdq04fuWJpELtsaEjeA== - dependencies: - d3-array "2.5.0 - 3" - -d3-hierarchy@1: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-hierarchy@3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" - integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== - -d3-interpolate@1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" - integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== - dependencies: - d3-color "1 - 3" - -d3-path@1: - version "1.0.9" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-1.0.9.tgz#48c050bb1fe8c262493a8caf5524e3e9591701cf" - integrity sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg== - -"d3-path@1 - 3", d3-path@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.0.1.tgz#f09dec0aaffd770b7995f1a399152bf93052321e" - integrity sha512-gq6gZom9AFZby0YLduxT1qmrp4xpBA1YZr19OI717WIdKE2OM5ETq5qrHLb301IgxhLwcuxvGZVLeeWc/k1I6w== - -d3-polygon@1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-1.0.6.tgz#0bf8cb8180a6dc107f518ddf7975e12abbfbd38e" - integrity sha512-k+RF7WvI08PC8reEoXa/w2nSg5AUMTi+peBD9cmFc+0ixHfbs4QmxxkarVal1IkVkgxVuk9JSHhJURHiyHKAuQ== - -d3-polygon@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-polygon/-/d3-polygon-3.0.1.tgz#0b45d3dd1c48a29c8e057e6135693ec80bf16398" - integrity sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg== - -d3-quadtree@1: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-1.0.7.tgz#ca8b84df7bb53763fe3c2f24bd435137f4e53135" - integrity sha512-RKPAeXnkC59IDGD0Wu5mANy0Q2V28L+fNe65pOCXVdVuTJS3WPKaJlFHer32Rbh9gIo9qMuJXio8ra4+YmIymA== - -"d3-quadtree@1 - 3", d3-quadtree@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" - integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== - -d3-random@1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-1.1.2.tgz#2833be7c124360bf9e2d3fd4f33847cfe6cab291" - integrity sha512-6AK5BNpIFqP+cx/sreKzNjWbwZQCSUatxq+pPRmFIQaWuoD+NrbVWw7YWpHiXpCQ/NanKdtGDuB+VQcZDaEmYQ== - -d3-random@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" - integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== - -d3-scale-chromatic@1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz#54e333fc78212f439b14641fb55801dd81135a98" - integrity sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg== - dependencies: - d3-color "1" - d3-interpolate "1" - -d3-scale-chromatic@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz#15b4ceb8ca2bb0dcb6d1a641ee03d59c3b62376a" - integrity sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g== - dependencies: - d3-color "1 - 3" - d3-interpolate "1 - 3" - -d3-scale@2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-2.2.2.tgz#4e880e0b2745acaaddd3ede26a9e908a9e17b81f" - integrity sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw== - dependencies: - d3-array "^1.2.0" - d3-collection "1" - d3-format "1" - d3-interpolate "1" - d3-time "1" - d3-time-format "2" - -d3-scale@4: - version "4.0.2" - resolved "https://registry.yarnpkg.com/d3-scale/-/d3-scale-4.0.2.tgz#82b38e8e8ff7080764f8dcec77bd4be393689396" - integrity sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ== - dependencies: - d3-array "2.10.0 - 3" - d3-format "1 - 3" - d3-interpolate "1.2.0 - 3" - d3-time "2.1.1 - 3" - d3-time-format "2 - 4" - -d3-selection@1, d3-selection@^1.1.0: - version "1.4.2" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-1.4.2.tgz#dcaa49522c0dbf32d6c1858afc26b6094555bc5c" - integrity sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg== - -"d3-selection@2 - 3", d3-selection@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-selection/-/d3-selection-3.0.0.tgz#c25338207efa72cc5b9bd1458a1a41901f1e1b31" - integrity sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ== - -d3-shape@1: - version "1.3.7" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-1.3.7.tgz#df63801be07bc986bc54f63789b4fe502992b5d7" - integrity sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw== - dependencies: - d3-path "1" - -d3-shape@3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.1.0.tgz#c8a495652d83ea6f524e482fca57aa3f8bc32556" - integrity sha512-tGDh1Muf8kWjEDT/LswZJ8WF85yDZLvVJpYU9Nq+8+yW1Z5enxrmXOhTArlkaElU+CTn0OTVNli+/i+HP45QEQ== - dependencies: - d3-path "1 - 3" - -d3-time-format@2: - version "2.3.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-2.3.0.tgz#107bdc028667788a8924ba040faf1fbccd5a7850" - integrity sha512-guv6b2H37s2Uq/GefleCDtbe0XZAuy7Wa49VGkPVPMfLL9qObgBST3lEHJBMUp8S7NdLQAGIvr2KXk8Hc98iKQ== - dependencies: - d3-time "1" - -"d3-time-format@2 - 4", d3-time-format@4: - version "4.1.0" - resolved "https://registry.yarnpkg.com/d3-time-format/-/d3-time-format-4.1.0.tgz#7ab5257a5041d11ecb4fe70a5c7d16a195bb408a" - integrity sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg== - dependencies: - d3-time "1 - 3" - -d3-time@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-1.1.0.tgz#b1e19d307dae9c900b7e5b25ffc5dcc249a8a0f1" - integrity sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA== - -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.0.0.tgz#65972cb98ae2d4954ef5c932e8704061335d4975" - integrity sha512-zmV3lRnlaLI08y9IMRXSDshQb5Nj77smnfpnd2LrBa/2K281Jijactokeak14QacHs/kKq0AQ121nidNYlarbQ== - dependencies: - d3-array "2 - 3" - -d3-timer@1: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -"d3-timer@1 - 3", d3-timer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" - integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== - -d3-transition@1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-1.3.2.tgz#a98ef2151be8d8600543434c1ca80140ae23b398" - integrity sha512-sc0gRU4PFqZ47lPVHloMn9tlPcv8jxgOQg+0zjhfZXMQuvppjG6YuwdMBE0TuqCZjeJkLecku/l9R0JPcRhaDA== - dependencies: - d3-color "1" - d3-dispatch "1" - d3-ease "1" - d3-interpolate "1" - d3-selection "^1.1.0" - d3-timer "1" - -"d3-transition@2 - 3", d3-transition@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/d3-transition/-/d3-transition-3.0.1.tgz#6869fdde1448868077fdd5989200cb61b2a1645f" - integrity sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w== - dependencies: - d3-color "1 - 3" - d3-dispatch "1 - 3" - d3-ease "1 - 3" - d3-interpolate "1 - 3" - d3-timer "1 - 3" - -d3-voronoi@1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/d3-voronoi/-/d3-voronoi-1.1.4.tgz#dd3c78d7653d2bb359284ae478645d95944c8297" - integrity sha512-dArJ32hchFsrQ8uMiTBLq256MpnZjeuBtdHpaDlYuQyjU0CVzCJl/BVW+SkszaAeH95D/8gxqAhgx0ouAWAfRg== - -d3-zoom@1: - version "1.8.3" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-1.8.3.tgz#b6a3dbe738c7763121cd05b8a7795ffe17f4fc0a" - integrity sha512-VoLXTK4wvy1a0JpH2Il+F2CiOhVu7VRXWF5M/LroMIh3/zBAC3WAt7QoIvPibOavVo20hN6/37vwAsdBejLyKQ== - dependencies: - d3-dispatch "1" - d3-drag "1" - d3-interpolate "1" - d3-selection "1" - d3-transition "1" - -d3-zoom@3: - version "3.0.0" - resolved "https://registry.yarnpkg.com/d3-zoom/-/d3-zoom-3.0.0.tgz#d13f4165c73217ffeaa54295cd6969b3e7aee8f3" - integrity sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw== - dependencies: - d3-dispatch "1 - 3" - d3-drag "2 - 3" - d3-interpolate "1 - 3" - d3-selection "2 - 3" - d3-transition "2 - 3" - -d3@^5.14: - version "5.16.0" - resolved "https://registry.yarnpkg.com/d3/-/d3-5.16.0.tgz#9c5e8d3b56403c79d4ed42fbd62f6113f199c877" - integrity sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw== - dependencies: - d3-array "1" - d3-axis "1" - d3-brush "1" - d3-chord "1" - d3-collection "1" - d3-color "1" - d3-contour "1" - d3-dispatch "1" - d3-drag "1" - d3-dsv "1" - d3-ease "1" - d3-fetch "1" - d3-force "1" - d3-format "1" - d3-geo "1" - d3-hierarchy "1" - d3-interpolate "1" - d3-path "1" - d3-polygon "1" - d3-quadtree "1" - d3-random "1" - d3-scale "2" - d3-scale-chromatic "1" - d3-selection "1" - d3-shape "1" - d3-time "1" - d3-time-format "2" - d3-timer "1" - d3-transition "1" - d3-voronoi "1" - d3-zoom "1" - -d3@^7.0.0: - version "7.6.1" - resolved "https://registry.yarnpkg.com/d3/-/d3-7.6.1.tgz#b21af9563485ed472802f8c611cc43be6c37c40c" - integrity sha512-txMTdIHFbcpLx+8a0IFhZsbp+PfBBPt8yfbmukZTQFroKuFqIwqswF0qE5JXWefylaAVpSXFoKm3yP+jpNLFLw== - dependencies: - d3-array "3" - d3-axis "3" - d3-brush "3" - d3-chord "3" - d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" - d3-fetch "3" - d3-force "3" - d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" - d3-polygon "3" - d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" - d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" - d3-transition "3" - d3-zoom "3" - -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - -dagre-d3@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/dagre-d3/-/dagre-d3-0.6.4.tgz#0728d5ce7f177ca2337df141ceb60fbe6eeb7b29" - integrity sha512-e/6jXeCP7/ptlAM48clmX4xTZc5Ek6T6kagS7Oz2HrYSdqcLZFLqpAfh7ldbZRFfxCZVyh61NEPR08UQRVxJzQ== - dependencies: - d3 "^5.14" - dagre "^0.8.5" - graphlib "^2.1.8" - lodash "^4.17.15" - -dagre@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" - integrity sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw== - dependencies: - graphlib "^2.1.8" - lodash "^4.17.15" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== - dependencies: - assert-plus "^1.0.0" - -death@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/death/-/death-1.1.0.tgz#01aa9c401edd92750514470b8266390c66c67318" - integrity sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w== - -debug@2.6.9, debug@^2.2.0, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.1.1, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decimal.js-light@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/decimal.js-light/-/decimal.js-light-2.5.1.tgz#134fd32508f19e208f4fb2f8dac0d2626a867934" - integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-eql@^4.0.1, deep-eql@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.2.tgz#270ceb902f87724077e6f6449aed81463f42fc1c" - integrity sha512-gT18+YW4CcW/DBNTwAmqTtkJh7f9qqScu2qFVlx7kCoeY9tlBu9cUcr7+I+Z/noG8INehS3xQgLpTtd/QUTn4w== - dependencies: - type-detect "^4.0.0" - -deep-extend@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -default-require-extensions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" - integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== - dependencies: - strip-bom "^4.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -defer-to-connect@^2.0.0, defer-to-connect@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" - integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.2, define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -delaunator@5: - version "5.0.0" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b" - integrity sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw== - dependencies: - robust-predicates "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -diff@3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" - integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -diff@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-5.1.0.tgz#bc52d298c5ea8df9194800224445ed43ffc87e40" - integrity sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw== - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -difflib@^0.2.4: - version "0.2.4" - resolved "https://registry.yarnpkg.com/difflib/-/difflib-0.2.4.tgz#b5e30361a6db023176d562892db85940a718f47e" - integrity sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w== - dependencies: - heap ">= 0.2.0" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-packet@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b" - integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^5.0.1, domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.0.tgz#c9c88390f024c2823332615c9e20a453cf3825dd" - integrity sha512-Be9tbQMZds4a3C6xTmz68NlMfeONA//4dOavl/1rNw50E+/QO0KVpbcU0PcaW0nsQxurXls9ZocqFxk8R2mWEA== - -domutils@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.0.1.tgz#696b3875238338cb186b6c0612bd4901c89a4f1c" - integrity sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.1" - -dot-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-2.1.1.tgz#34dcf37f50a8e93c2b3bca8bb7fb9155c7da3bee" - integrity sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug== - dependencies: - no-case "^2.2.0" - -dotenv@^14.2.0: - version "14.3.2" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-14.3.2.tgz#7c30b3a5f777c79a3429cb2db358eef6751e8369" - integrity sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ== - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== - -elliptic@6.5.4, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3, elliptic@^6.5.4: - version "6.5.4" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" - integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enquirer@^2.3.0, enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^4.2.0, entities@^4.3.0, entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -env-paths@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" - integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== - -error-ex@^1.2.0, error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-array-method-boxes-properly@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz#873f3e84418de4ee19c5be752990b2e44718d09e" - integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -es5-ext@^0.10.35, es5-ext@^0.10.50: - version "0.10.62" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5" - integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA== - dependencies: - es6-iterator "^2.0.3" - es6-symbol "^3.1.3" - next-tick "^1.1.0" - -es6-error@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" - integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== - -es6-iterator@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g== - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - -es6-promise@^4.2.8: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== - dependencies: - d "^1.0.1" - ext "^1.1.2" - -esbuild-android-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.15.tgz#fd959b034dd761d14e13dda6214b6948841ff4ff" - integrity sha512-F+WjjQxO+JQOva3tJWNdVjouFMLK6R6i5gjDvgUthLYJnIZJsp1HlF523k73hELY20WPyEO8xcz7aaYBVkeg5Q== - -esbuild-android-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.15.tgz#9733b71cf0229b4356f106a455b2cfdf7884aa59" - integrity sha512-attlyhD6Y22jNyQ0fIIQ7mnPvDWKw7k6FKnsXlBvQE6s3z6s6cuEHcSgoirquQc7TmZgVCK5fD/2uxmRN+ZpcQ== - -esbuild-darwin-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.15.tgz#fc3482fdf5e798dbc0b8b2fe13287d257a45efc6" - integrity sha512-ohZtF8W1SHJ4JWldsPVdk8st0r9ExbAOSrBOh5L+Mq47i696GVwv1ab/KlmbUoikSTNoXEhDzVpxUR/WIO19FQ== - -esbuild-darwin-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.15.tgz#e922ec387c00fa84d664e14b5722fe13613f4adc" - integrity sha512-P8jOZ5zshCNIuGn+9KehKs/cq5uIniC+BeCykvdVhx/rBXSxmtj3CUIKZz4sDCuESMbitK54drf/2QX9QHG5Ag== - -esbuild-freebsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.15.tgz#69a42d79137d7d3ea718414c432bc10e8bb97c68" - integrity sha512-KkTg+AmDXz1IvA9S1gt8dE24C8Thx0X5oM0KGF322DuP+P3evwTL9YyusHAWNsh4qLsR80nvBr/EIYs29VSwuA== - -esbuild-freebsd-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.15.tgz#63b6d0dd492f7394f8d07a0e2b931151eb9d60c4" - integrity sha512-FUcML0DRsuyqCMfAC+HoeAqvWxMeq0qXvclZZ/lt2kLU6XBnDA5uKTLUd379WYEyVD4KKFctqWd9tTuk8C/96g== - -esbuild-linux-32@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.15.tgz#7f295795fd7e61ea57d1135f717424a6771a7472" - integrity sha512-q28Qn5pZgHNqug02aTkzw5sW9OklSo96b5nm17Mq0pDXrdTBcQ+M6Q9A1B+dalFeynunwh/pvfrNucjzwDXj+Q== - -esbuild-linux-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.15.tgz#11a430a86403b0411ca0a355b891f1cb8c4c4ec6" - integrity sha512-217KPmWMirkf8liO+fj2qrPwbIbhNTGNVtvqI1TnOWJgcMjUWvd677Gq3fTzXEjilkx2yWypVnTswM2KbXgoAg== - -esbuild-linux-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.15.tgz#b65f9a2c60e8e5b62f6cfd392cd0410f22e8c390" - integrity sha512-/ltmNFs0FivZkYsTzAsXIfLQX38lFnwJTWCJts0IbCqWZQe+jjj0vYBNbI0kmXLb3y5NljiM5USVAO1NVkdh2g== - -esbuild-linux-arm@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.15.tgz#c8e13e45a0a6f0cb145ce13ae26ce1d2551d9bcc" - integrity sha512-RYVW9o2yN8yM7SB1yaWr378CwrjvGCyGybX3SdzPHpikUHkME2AP55Ma20uNwkNyY2eSYFX9D55kDrfQmQBR4w== - -esbuild-linux-mips64le@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.15.tgz#d4c24d47e43966fcac748c90621be7edd53456c0" - integrity sha512-PksEPb321/28GFFxtvL33yVPfnMZihxkEv5zME2zapXGp7fA1X2jYeiTUK+9tJ/EGgcNWuwvtawPxJG7Mmn86A== - -esbuild-linux-ppc64le@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.15.tgz#2eba53fe2282438ceca5471bdb57ba2e00216ed6" - integrity sha512-ek8gJBEIhcpGI327eAZigBOHl58QqrJrYYIZBWQCnH3UnXoeWMrMZLeeZL8BI2XMBhP+sQ6ERctD5X+ajL/AIA== - -esbuild-linux-riscv64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.15.tgz#1afa8dfe55a6c312f1904ee608b81417205f5027" - integrity sha512-H5ilTZb33/GnUBrZMNJtBk7/OXzDHDXjIzoLXHSutwwsLxSNaLxzAaMoDGDd/keZoS+GDBqNVxdCkpuiRW4OSw== - -esbuild-linux-s390x@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.15.tgz#1f7b3c4429c8ca99920ba6bf356ccc5b38fabd34" - integrity sha512-jKaLUg78mua3rrtrkpv4Or2dNTJU7bgHN4bEjT4OX4GR7nLBSA9dfJezQouTxMmIW7opwEC5/iR9mpC18utnxQ== - -esbuild-netbsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.15.tgz#d72c7155686c938c1aff126209b689c22823347c" - integrity sha512-aOvmF/UkjFuW6F36HbIlImJTTx45KUCHJndtKo+KdP8Dhq3mgLRKW9+6Ircpm8bX/RcS3zZMMmaBLkvGY06Gvw== - -esbuild-openbsd-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.15.tgz#761bd87ecab97386948eaf667a065cb0ecaa0f76" - integrity sha512-HFFX+WYedx1w2yJ1VyR1Dfo8zyYGQZf1cA69bLdrHzu9svj6KH6ZLK0k3A1/LFPhcEY9idSOhsB2UyU0tHPxgQ== - -esbuild-sunos-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.15.tgz#07e04cbf9747f281a967d09230a158a1be5b530c" - integrity sha512-jOPBudffG4HN8yJXcK9rib/ZTFoTA5pvIKbRrt3IKAGMq1EpBi4xoVoSRrq/0d4OgZLaQbmkHp8RO9eZIn5atA== - -esbuild-windows-32@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.15.tgz#130d1982cc41fb67461e9f8a65c6ebd13a1f35bb" - integrity sha512-MDkJ3QkjnCetKF0fKxCyYNBnOq6dmidcwstBVeMtXSgGYTy8XSwBeIE4+HuKiSsG6I/mXEb++px3IGSmTN0XiA== - -esbuild-windows-64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.15.tgz#638bdf495c109c1882e8b0529cb8e2fea11383fb" - integrity sha512-xaAUIB2qllE888SsMU3j9nrqyLbkqqkpQyWVkfwSil6BBPgcPk3zOFitTTncEKCLTQy3XV9RuH7PDj3aJDljWA== - -esbuild-windows-arm64@0.15.15: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.15.tgz#5a277ce10de999d2a6465fc92a8c2a2d207ebd31" - integrity sha512-ttuoCYCIJAFx4UUKKWYnFdrVpoXa3+3WWkXVI6s09U+YjhnyM5h96ewTq/WgQj9LFSIlABQvadHSOQyAVjW5xQ== - -esbuild@^0.15.9: - version "0.15.15" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.15.tgz#503b70bdc18d72d8fc2962ed3ab9219249e58bbe" - integrity sha512-TEw/lwK4Zzld9x3FedV6jy8onOUHqcEX3ADFk4k+gzPUwrxn8nWV62tH0udo8jOtjFodlEfc4ypsqX3e+WWO6w== - optionalDependencies: - "@esbuild/android-arm" "0.15.15" - "@esbuild/linux-loong64" "0.15.15" - esbuild-android-64 "0.15.15" - esbuild-android-arm64 "0.15.15" - esbuild-darwin-64 "0.15.15" - esbuild-darwin-arm64 "0.15.15" - esbuild-freebsd-64 "0.15.15" - esbuild-freebsd-arm64 "0.15.15" - esbuild-linux-32 "0.15.15" - esbuild-linux-64 "0.15.15" - esbuild-linux-arm "0.15.15" - esbuild-linux-arm64 "0.15.15" - esbuild-linux-mips64le "0.15.15" - esbuild-linux-ppc64le "0.15.15" - esbuild-linux-riscv64 "0.15.15" - esbuild-linux-s390x "0.15.15" - esbuild-netbsd-64 "0.15.15" - esbuild-openbsd-64 "0.15.15" - esbuild-sunos-64 "0.15.15" - esbuild-windows-32 "0.15.15" - esbuild-windows-64 "0.15.15" - esbuild-windows-arm64 "0.15.15" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escodegen@1.8.x: - version "1.8.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A== - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - -eslint-config-prettier@8.3.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" - integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-import-resolver-typescript@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.2.tgz#9431acded7d898fd94591a08ea9eec3514c7de91" - integrity sha512-zX4ebnnyXiykjhcBvKIf5TNvt8K7yX6bllTRZ14MiurKPjDpCAZujlszTdB8pcNXhZcOf+god4s9SjQa5GnytQ== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.10.0" - get-tsconfig "^4.2.0" - globby "^13.1.2" - is-core-module "^2.10.0" - is-glob "^4.0.3" - synckit "^0.8.4" - -eslint-module-utils@^2.6.2: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@2.24.2: - version "2.24.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz#2c8cd2e341f3885918ee27d18479910ade7bb4da" - integrity sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q== - dependencies: - array-includes "^3.1.3" - array.prototype.flat "^1.2.4" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.6.2" - find-up "^2.0.0" - has "^1.0.3" - is-core-module "^2.6.0" - minimatch "^3.0.4" - object.values "^1.1.4" - pkg-up "^2.0.0" - read-pkg-up "^3.0.0" - resolve "^1.20.0" - tsconfig-paths "^3.11.0" - -eslint-plugin-mocha@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz#b4457d066941eecb070dc06ed301c527d9c61b60" - integrity sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg== - dependencies: - eslint-utils "^3.0.0" - ramda "^0.27.1" - -eslint-plugin-prettier@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@2.7.x, esprima@^2.7.1: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A== - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA== - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eth-ens-namehash@2.0.8, eth-ens-namehash@^2.0.0, eth-ens-namehash@^2.0.8: - version "2.0.8" - resolved "https://registry.yarnpkg.com/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz#229ac46eca86d52e0c991e7cb2aef83ff0f68bcf" - integrity sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw== - dependencies: - idna-uts46-hx "^2.3.1" - js-sha3 "^0.5.7" - -eth-gas-reporter@^0.2.25: - version "0.2.25" - resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz#546dfa946c1acee93cb1a94c2a1162292d6ff566" - integrity sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ== - dependencies: - "@ethersproject/abi" "^5.0.0-beta.146" - "@solidity-parser/parser" "^0.14.0" - cli-table3 "^0.5.0" - colors "1.4.0" - ethereum-cryptography "^1.0.3" - ethers "^4.0.40" - fs-readdir-recursive "^1.1.0" - lodash "^4.17.14" - markdown-table "^1.1.3" - mocha "^7.1.1" - req-cwd "^2.0.0" - request "^2.88.0" - request-promise-native "^1.0.5" - sha1 "^1.1.1" - sync-request "^6.0.0" - -eth-lib@0.2.8: - version "0.2.8" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" - integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - xhr-request-promise "^0.1.2" - -eth-lib@^0.1.26: - version "0.1.29" - resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.1.29.tgz#0c11f5060d42da9f931eab6199084734f4dbd1d9" - integrity sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ== - dependencies: - bn.js "^4.11.6" - elliptic "^6.4.0" - nano-json-stream-parser "^0.1.2" - servify "^0.1.12" - ws "^3.0.0" - xhr-request-promise "^0.1.2" - -ethereum-bloom-filters@^1.0.6: - version "1.0.10" - resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz#3ca07f4aed698e75bd134584850260246a5fed8a" - integrity sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA== - dependencies: - js-sha3 "^0.8.0" - -ethereum-cryptography@0.1.3, ethereum-cryptography@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" - integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== - dependencies: - "@types/pbkdf2" "^3.0.0" - "@types/secp256k1" "^4.0.1" - blakejs "^1.1.0" - browserify-aes "^1.2.0" - bs58check "^2.1.2" - create-hash "^1.2.0" - create-hmac "^1.1.7" - hash.js "^1.1.7" - keccak "^3.0.0" - pbkdf2 "^3.0.17" - randombytes "^2.1.0" - safe-buffer "^5.1.2" - scrypt-js "^3.0.0" - secp256k1 "^4.0.1" - setimmediate "^1.0.5" - -ethereum-cryptography@^1.0.3: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-1.1.2.tgz#74f2ac0f0f5fe79f012c889b3b8446a9a6264e6d" - integrity sha512-XDSJlg4BD+hq9N2FjvotwUET9Tfxpxc3kWGE2AqUG5vcbeunnbImVk3cj6e/xT3phdW21mE8R5IugU4fspQDcQ== - dependencies: - "@noble/hashes" "1.1.2" - "@noble/secp256k1" "1.6.3" - "@scure/bip32" "1.1.0" - "@scure/bip39" "1.1.0" - -ethereum-ens@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/ethereum-ens/-/ethereum-ens-0.8.0.tgz#6d0f79acaa61fdbc87d2821779c4e550243d4c57" - integrity sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg== - dependencies: - bluebird "^3.4.7" - eth-ens-namehash "^2.0.0" - js-sha3 "^0.5.7" - pako "^1.0.4" - underscore "^1.8.3" - web3 "^1.0.0-beta.34" - -ethereumjs-abi@^0.6.8: - version "0.6.8" - resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz#71bc152db099f70e62f108b7cdfca1b362c6fcae" - integrity sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA== - dependencies: - bn.js "^4.11.8" - ethereumjs-util "^6.0.0" - -ethereumjs-util@^6.0.0, ethereumjs-util@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" - integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== - dependencies: - "@types/bn.js" "^4.11.3" - bn.js "^4.11.0" - create-hash "^1.1.2" - elliptic "^6.5.2" - ethereum-cryptography "^0.1.3" - ethjs-util "0.1.6" - rlp "^2.2.3" - -ethereumjs-util@^7.0.10, ethereumjs-util@^7.1.0, ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.2, ethereumjs-util@^7.1.4, ethereumjs-util@^7.1.5: - version "7.1.5" - resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" - integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== - dependencies: - "@types/bn.js" "^5.1.0" - bn.js "^5.1.2" - create-hash "^1.1.2" - ethereum-cryptography "^0.1.3" - rlp "^2.2.4" - -ethers@5.7.2, ethers@^5.0.13, ethers@^5.4.7: - version "5.7.2" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" - integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== - dependencies: - "@ethersproject/abi" "5.7.0" - "@ethersproject/abstract-provider" "5.7.0" - "@ethersproject/abstract-signer" "5.7.0" - "@ethersproject/address" "5.7.0" - "@ethersproject/base64" "5.7.0" - "@ethersproject/basex" "5.7.0" - "@ethersproject/bignumber" "5.7.0" - "@ethersproject/bytes" "5.7.0" - "@ethersproject/constants" "5.7.0" - "@ethersproject/contracts" "5.7.0" - "@ethersproject/hash" "5.7.0" - "@ethersproject/hdnode" "5.7.0" - "@ethersproject/json-wallets" "5.7.0" - "@ethersproject/keccak256" "5.7.0" - "@ethersproject/logger" "5.7.0" - "@ethersproject/networks" "5.7.1" - "@ethersproject/pbkdf2" "5.7.0" - "@ethersproject/properties" "5.7.0" - "@ethersproject/providers" "5.7.2" - "@ethersproject/random" "5.7.0" - "@ethersproject/rlp" "5.7.0" - "@ethersproject/sha2" "5.7.0" - "@ethersproject/signing-key" "5.7.0" - "@ethersproject/solidity" "5.7.0" - "@ethersproject/strings" "5.7.0" - "@ethersproject/transactions" "5.7.0" - "@ethersproject/units" "5.7.0" - "@ethersproject/wallet" "5.7.0" - "@ethersproject/web" "5.7.1" - "@ethersproject/wordlists" "5.7.0" - -ethers@^4.0.0-beta.1, ethers@^4.0.32, ethers@^4.0.40: - version "4.0.49" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.49.tgz#0eb0e9161a0c8b4761be547396bbe2fb121a8894" - integrity sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg== - dependencies: - aes-js "3.0.0" - bn.js "^4.11.9" - elliptic "6.5.4" - hash.js "1.1.3" - js-sha3 "0.5.7" - scrypt-js "2.0.4" - setimmediate "1.0.4" - uuid "2.0.1" - xmlhttprequest "1.8.0" - -ethjs-unit@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" - integrity sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw== - dependencies: - bn.js "4.11.6" - number-to-bn "1.7.0" - -ethjs-util@0.1.6, ethjs-util@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" - integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== - dependencies: - is-hex-prefixed "1.0.0" - strip-hex-prefix "1.0.0" - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@4.0.4: - version "4.0.4" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" - integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -express@^4.14.0: - version "4.18.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -ext@^1.1.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" - integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== - dependencies: - type "^2.7.2" - -extend@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== - -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== - -fast-check@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-check/-/fast-check-3.1.1.tgz#72c5ae7022a4e86504762e773adfb8a5b0b01252" - integrity sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA== - dependencies: - pure-rand "^5.0.1" - -fast-clone@^1.5.13: - version "1.5.13" - resolved "https://registry.yarnpkg.com/fast-clone/-/fast-clone-1.5.13.tgz#7fe17542ae1c872e71bf80d177d00c11f51c2ea7" - integrity sha512-0ez7coyFBQFjZtId+RJqJ+EQs61w9xARfqjqK0AD9vIUkSxWD4HvPt80+5evebZ1tTnv1GYKrPTipx7kOW5ipA== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.0.3, fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.13.0.tgz#616760f88a7526bdfc596b7cab8c18938c36b98c" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.2.0: - version "3.3.2" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-replace@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-replace/-/find-replace-3.0.0.tgz#3e7e23d3b05167a76f770c9fbd5258b0def68c38" - integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ== - dependencies: - array-back "^3.0.1" - -find-up@3.0.0, find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA== - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== - dependencies: - locate-path "^2.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.1.tgz#a392059cc382881ff98642f5da4dde0a959f309b" - integrity sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA== - dependencies: - is-buffer "~2.0.3" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@^1.12.1: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -foreground-child@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" - integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^3.0.2" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== - -form-data-encoder@1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-1.7.1.tgz#ac80660e4f87ee0d3d3c3638b7da8278ddb8ec96" - integrity sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg== - -form-data@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fp-ts@1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.3.tgz#261a60d1088fbff01f91256f91d21d0caaaaa96f" - integrity sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg== - -fp-ts@^1.0.0: - version "1.19.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.19.5.tgz#3da865e585dfa1fdfd51785417357ac50afc520a" - integrity sha512-wDNqTimnzs8QqpldiId9OavWK2NptormjXnRJTQecNjzwfyp6P/8s/zG8e4h3ja3oqkKaY72UlTjQYt/1yXf9A== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fromentries@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" - integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== - -fs-extra@^0.30.0: - version "0.30.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" - integrity sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" - path-is-absolute "^1.0.0" - rimraf "^2.2.8" - -fs-extra@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^4.0.2: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^7.0.0, fs-extra@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-minipass@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-readdir-recursive@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" - integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" - integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-caller-file@^2.0.1, get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - integrity sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-package-type@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" - integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== - -get-port@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc" - integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg== - -get-stream@^4.0.0, get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" - integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== - dependencies: - assert-plus "^1.0.0" - -ghost-testrpc@^0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz#c4de9557b1d1ae7b2d20bbe474a91378ca90ce92" - integrity sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ== - dependencies: - chalk "^2.4.2" - node-emoji "^1.10.0" - -glob-parent@^5.1.2, glob-parent@~5.1.0, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob@7.1.3: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^5.0.15: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA== - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.0, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -global@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0, globals@^13.9.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== - dependencies: - type-fest "^0.20.2" - -globalyzer@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^11.0.3: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@12.1.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/got/-/got-12.1.0.tgz#099f3815305c682be4fd6b0ee0726d8e4c6b0af4" - integrity sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig== - dependencies: - "@sindresorhus/is" "^4.6.0" - "@szmarczak/http-timer" "^5.0.1" - "@types/cacheable-request" "^6.0.2" - "@types/responselike" "^1.0.0" - cacheable-lookup "^6.0.4" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - form-data-encoder "1.7.1" - get-stream "^6.0.1" - http2-wrapper "^2.1.10" - lowercase-keys "^3.0.0" - p-cancelable "^3.0.0" - responselike "^2.0.0" - -got@9.6.0: - version "9.6.0" - resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -got@^11.8.5: - version "11.8.5" - resolved "https://registry.yarnpkg.com/got/-/got-11.8.5.tgz#ce77d045136de56e8f024bebb82ea349bc730046" - integrity sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ== - dependencies: - "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" - cacheable-lookup "^5.0.3" - cacheable-request "^7.0.2" - decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" - -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graphlib@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/graphlib/-/graphlib-2.1.8.tgz#5761d414737870084c92ec7b5dbcb0592c9d35da" - integrity sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A== - dependencies: - lodash "^4.17.15" - -growl@1.10.5: - version "1.10.5" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" - integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== - -handlebars@^4.0.1: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -har-schema@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== - -har-validator@~5.1.3: - version "5.1.5" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - -hardhat-gas-reporter@1.0.9: - version "1.0.9" - resolved "https://registry.yarnpkg.com/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz#9a2afb354bc3b6346aab55b1c02ca556d0e16450" - integrity sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg== - dependencies: - array-uniq "1.0.3" - eth-gas-reporter "^0.2.25" - sha1 "^1.1.1" - -hardhat-watcher@^2.1.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz#3ee76c3cb5b99f2875b78d176207745aa484ed4a" - integrity sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA== - dependencies: - chokidar "^3.5.3" - -hardhat@^2.10.0, hardhat@^2.12.0: - version "2.12.2" - resolved "https://registry.yarnpkg.com/hardhat/-/hardhat-2.12.2.tgz#6ae985007b20c1f381c6573799d66c1438c4c802" - integrity sha512-f3ZhzXy1uyQv0UXnAQ8GCBOWjzv++WJNb7bnm10SsyC3dB7vlPpsMWBNhq7aoRxKrNhX9tCev81KFV3i5BTeMQ== - dependencies: - "@ethersproject/abi" "^5.1.2" - "@metamask/eth-sig-util" "^4.0.0" - "@nomicfoundation/ethereumjs-block" "^4.0.0" - "@nomicfoundation/ethereumjs-blockchain" "^6.0.0" - "@nomicfoundation/ethereumjs-common" "^3.0.0" - "@nomicfoundation/ethereumjs-evm" "^1.0.0" - "@nomicfoundation/ethereumjs-rlp" "^4.0.0" - "@nomicfoundation/ethereumjs-statemanager" "^1.0.0" - "@nomicfoundation/ethereumjs-trie" "^5.0.0" - "@nomicfoundation/ethereumjs-tx" "^4.0.0" - "@nomicfoundation/ethereumjs-util" "^8.0.0" - "@nomicfoundation/ethereumjs-vm" "^6.0.0" - "@nomicfoundation/solidity-analyzer" "^0.1.0" - "@sentry/node" "^5.18.1" - "@types/bn.js" "^5.1.0" - "@types/lru-cache" "^5.1.0" - abort-controller "^3.0.0" - adm-zip "^0.4.16" - aggregate-error "^3.0.0" - ansi-escapes "^4.3.0" - chalk "^2.4.2" - chokidar "^3.4.0" - ci-info "^2.0.0" - debug "^4.1.1" - enquirer "^2.3.0" - env-paths "^2.2.0" - ethereum-cryptography "^1.0.3" - ethereumjs-abi "^0.6.8" - find-up "^2.1.0" - fp-ts "1.19.3" - fs-extra "^7.0.1" - glob "7.2.0" - immutable "^4.0.0-rc.12" - io-ts "1.10.4" - keccak "^3.0.2" - lodash "^4.17.11" - mnemonist "^0.38.0" - mocha "^10.0.0" - p-map "^4.0.0" - qs "^6.7.0" - raw-body "^2.4.1" - resolve "1.17.0" - semver "^6.3.0" - solc "0.7.3" - source-map-support "^0.5.13" - stacktrace-parser "^0.1.10" - tsort "0.0.1" - undici "^5.4.0" - uuid "^8.3.2" - ws "^7.4.6" - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.0, has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hash-base@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" - integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== - dependencies: - inherits "^2.0.4" - readable-stream "^3.6.0" - safe-buffer "^5.2.0" - -hash-test-vectors@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz#f050fde1aff46ec28dcf4f70e4e3238cd5000f4c" - integrity sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ== - -hash.js@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.3.tgz#340dedbe6290187151c1ea1d777a3448935df846" - integrity sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.0" - -hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasha@^5.0.0: - version "5.2.2" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" - integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== - dependencies: - is-stream "^2.0.0" - type-fest "^0.8.0" - -he@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -header-case@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/header-case/-/header-case-1.0.1.tgz#9535973197c144b09613cd65d317ef19963bd02d" - integrity sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ== - dependencies: - no-case "^2.2.0" - upper-case "^1.1.3" - -"heap@>= 0.2.0": - version "0.2.7" - resolved "https://registry.yarnpkg.com/heap/-/heap-0.2.7.tgz#1e6adf711d3f27ce35a81fe3b7bd576c2260a8fc" - integrity sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg== - -highlight.js@^10.4.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -highlightjs-solidity@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/highlightjs-solidity/-/highlightjs-solidity-2.0.5.tgz#48b945f41886fa49af9f06023e6e87fffc243745" - integrity sha512-ReXxQSGQkODMUgHcWzVSnfDCDrL2HshOYgw3OlIYmfHeRzUPkfJTUIp95pK4CmbiNG2eMTOmNLpfCz9Zq7Cwmg== - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -htmlparser2@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-8.0.1.tgz#abaa985474fcefe269bc761a779b544d7196d010" - integrity sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - domutils "^3.0.1" - entities "^4.3.0" - -http-basic@^8.1.1: - version "8.1.3" - resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-8.1.3.tgz#a7cabee7526869b9b710136970805b1004261bbf" - integrity sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw== - dependencies: - caseless "^0.12.0" - concat-stream "^1.6.2" - http-response-object "^3.0.1" - parse-cache-control "^1.0.1" - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-https@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" - integrity sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg== - -http-response-object@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810" - integrity sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA== - dependencies: - "@types/node" "^10.0.3" - -http-signature@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -http2-wrapper@^1.0.0-beta.5.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" - integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.0.0" - -http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== - dependencies: - quick-lru "^5.1.1" - resolve-alpn "^1.2.0" - -https-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" - integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== - dependencies: - agent-base "6" - debug "4" - -iconv-lite@0.4, iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@0.6: - version "0.6.3" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -idna-uts46-hx@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz#a1dc5c4df37eee522bf66d969cc980e00e8711f9" - integrity sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA== - dependencies: - punycode "2.1.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.1.1, ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immutable@^4.0.0-rc.12: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -ink-spinner@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/ink-spinner/-/ink-spinner-4.0.3.tgz#0d0f4a787ae1a4270928e063d9c52527cb264feb" - integrity sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ== - dependencies: - cli-spinners "^2.3.0" - -ink@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" - integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== - dependencies: - ansi-escapes "^4.2.1" - auto-bind "4.0.0" - chalk "^4.1.0" - cli-boxes "^2.2.0" - cli-cursor "^3.1.0" - cli-truncate "^2.1.0" - code-excerpt "^3.0.0" - indent-string "^4.0.0" - is-ci "^2.0.0" - lodash "^4.17.20" - patch-console "^1.0.0" - react-devtools-core "^4.19.1" - react-reconciler "^0.26.2" - scheduler "^0.20.2" - signal-exit "^3.0.2" - slice-ansi "^3.0.0" - stack-utils "^2.0.2" - string-width "^4.2.2" - type-fest "^0.12.0" - widest-line "^3.1.0" - wrap-ansi "^6.2.0" - ws "^7.5.5" - yoga-layout-prebuilt "^1.9.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -"internmap@1 - 2": - version "2.0.3" - resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" - integrity sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ== - -io-ts@1.10.4: - version "1.10.4" - resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.10.4.tgz#cd5401b138de88e4f920adbcb7026e2d1967e6e2" - integrity sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g== - dependencies: - fp-ts "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -is-arguments@^1.0.4: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" - integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^2.0.5, is-buffer@~2.0.3: - version "2.0.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.10.0, is-core-module@^2.6.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw== - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-function@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" - integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== - -is-generator-function@^1.0.7: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hex-prefixed@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" - integrity sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA== - -is-lower-case@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-lower-case/-/is-lower-case-1.1.3.tgz#7e147be4768dc466db3bfb21cc60b31e6ad69393" - integrity sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA== - dependencies: - lower-case "^1.1.0" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.3: - version "1.1.10" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0, is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-upper-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-upper-case/-/is-upper-case-1.1.2.tgz#8d0b1fa7e7933a1e58483600ec7d9661cbaf756f" - integrity sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw== - dependencies: - upper-case "^1.1.0" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== - -istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-hook@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" - integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== - dependencies: - append-transform "^2.0.0" - -istanbul-lib-instrument@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d" - integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ== - dependencies: - "@babel/core" "^7.7.5" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.0.0" - semver "^6.3.0" - -istanbul-lib-processinfo@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz#366d454cd0dcb7eb6e0e419378e60072c8626169" - integrity sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg== - dependencies: - archy "^1.0.0" - cross-spawn "^7.0.3" - istanbul-lib-coverage "^3.2.0" - p-map "^3.0.0" - rimraf "^3.0.0" - uuid "^8.3.2" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" - integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jest-changed-files@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-24.9.0.tgz#08d8c15eb79a7fa3fc98269bc14b451ee82f8039" - integrity sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg== - dependencies: - "@jest/types" "^24.9.0" - execa "^1.0.0" - throat "^4.0.0" - -js-graph-algorithms@1.0.18: - version "1.0.18" - resolved "https://registry.yarnpkg.com/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz#f96ec87bf194f5c0a31365fa0e1d07b7b962d891" - integrity sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA== - -js-sha3@0.5.7, js-sha3@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" - integrity sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g== - -js-sha3@0.8.0, js-sha3@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" - integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@3.13.1: - version "3.13.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@3.x, js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsbi@^3.1.4: - version "3.2.5" - resolved "https://registry.yarnpkg.com/jsbi/-/jsbi-3.2.5.tgz#b37bb90e0e5c2814c1c2a1bcd8c729888a2e37d6" - integrity sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ== - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-schema@0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5" - integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== - -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - integrity sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonschema@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" - integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== - -jsprim@^1.2.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb" - integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.4.0" - verror "1.10.0" - -just-extend@^4.0.2: - version "4.2.1" - resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== - -keccak@^3.0.0, keccak@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.2.tgz#4c2c6e8c54e04f2670ee49fa734eb9da152206e0" - integrity sha512-PyKKjkH53wDMLGrvmRGSNWgmSxZOUqbnXwKL9tmgbFYA1iAYqW21kfR7mZXV0MlESiefxQQE9X9fTa3X+2MPDQ== - dependencies: - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - readable-stream "^3.6.0" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -keyv@^4.0.0: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== - dependencies: - json-buffer "3.0.1" - -khroma@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/khroma/-/khroma-2.0.0.tgz#7577de98aed9f36c7a474c4d453d94c0d6c6588b" - integrity sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g== - -kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - integrity sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw== - optionalDependencies: - graceful-fs "^4.1.9" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw== - dependencies: - invert-kv "^1.0.0" - -level-supports@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-4.0.1.tgz#431546f9d81f10ff0fea0e74533a0e875c08c66a" - integrity sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA== - -level-transcoder@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/level-transcoder/-/level-transcoder-1.0.1.tgz#f8cef5990c4f1283d4c86d949e73631b0bc8ba9c" - integrity sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w== - dependencies: - buffer "^6.0.3" - module-error "^1.0.1" - -level@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/level/-/level-8.0.0.tgz#41b4c515dabe28212a3e881b61c161ffead14394" - integrity sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ== - dependencies: - browser-level "^1.0.1" - classic-level "^1.2.0" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA== - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A== - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.assign@^4.0.3, lodash.assign@^4.0.6: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw== - -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== - -lodash.flattendeep@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" - integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== - -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4: - version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4" - integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== - dependencies: - chalk "^2.4.2" - -log-symbols@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== - dependencies: - get-func-name "^2.0.0" - -lower-case-first@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lower-case-first/-/lower-case-first-1.0.2.tgz#e5da7c26f29a7073be02d52bac9980e5922adfa1" - integrity sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA== - dependencies: - lower-case "^1.1.2" - -lower-case@^1.1.0, lower-case@^1.1.1, lower-case@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" - integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lowercase-keys@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-3.0.0.tgz#c5e7d442e37ead247ae9db117a9d0a467c89d4f2" - integrity sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru_map@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/lru_map/-/lru_map-0.3.3.tgz#b5c8351b9464cbd750335a79650a0ec0e56118dd" - integrity sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ== - -make-dir@^3.0.0, make-dir@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -markdown-table@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.3.tgz#9fcb69bcfdb8717bfd0398c6ec2d93036ef8de60" - integrity sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q== - -mcl-wasm@^0.7.1: - version "0.7.9" - resolved "https://registry.yarnpkg.com/mcl-wasm/-/mcl-wasm-0.7.9.tgz#c1588ce90042a8700c3b60e40efb339fc07ab87f" - integrity sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ== - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memory-level@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/memory-level/-/memory-level-1.0.0.tgz#7323c3fd368f9af2f71c3cd76ba403a17ac41692" - integrity sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og== - dependencies: - abstract-level "^1.0.0" - functional-red-black-tree "^1.0.1" - module-error "^1.0.1" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -mermaid@^9.1.7: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mermaid/-/mermaid-9.2.2.tgz#73cca1f0b74e7e674c0de3519d7e7e8ea83bea4a" - integrity sha512-6s7eKMqFJGS+0MYjmx8f6ZigqKBJVoSx5ql2gw6a4Aa+WJ49QiEJg7gPwywaBg3DZMs79UP7trESp4+jmaQccw== - dependencies: - "@braintree/sanitize-url" "^6.0.0" - d3 "^7.0.0" - dagre "^0.8.5" - dagre-d3 "^0.6.4" - dompurify "2.4.0" - fast-clone "^1.5.13" - graphlib "^2.1.8" - khroma "^2.0.0" - lodash "^4.17.21" - moment-mini "^2.24.0" - non-layered-tidy-tree-layout "^2.0.2" - stylis "^4.1.2" - uuid "^9.0.0" - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.4: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mime-db@1.52.0: - version "1.52.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-types@^2.1.12, mime-types@^2.1.16, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -"minimatch@2 || 3", minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-4.2.1.tgz#40d9d511a46bdc4e563c22c3080cde9c0d8299b4" - integrity sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g== - dependencies: - brace-expansion "^1.1.7" - -minimatch@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== - -minipass@^2.6.0, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mkdirp-promise@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz#e9b8f68e552c68a9c1713b84883f7a1dd039b8a1" - integrity sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w== - dependencies: - mkdirp "*" - -mkdirp@*, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mkdirp@0.5.5: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@0.5.x, mkdirp@^0.5.5: - version "0.5.6" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - -mnemonist@^0.38.0: - version "0.38.5" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.5.tgz#4adc7f4200491237fe0fa689ac0b86539685cade" - integrity sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg== - dependencies: - obliterator "^2.0.0" - -mocha@7.1.2: - version "7.1.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.1.2.tgz#8e40d198acf91a52ace122cd7599c9ab857b29e6" - integrity sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mocha@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.1.0.tgz#dbf1114b7c3f9d0ca5de3133906aea3dfc89ef7a" - integrity sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg== - dependencies: - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.4" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "5.0.1" - ms "2.1.3" - nanoid "3.3.3" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - workerpool "6.2.1" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -mocha@^7.1.1: - version "7.2.0" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-7.2.0.tgz#01cc227b00d875ab1eed03a75106689cfed5a604" - integrity sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ== - dependencies: - ansi-colors "3.2.3" - browser-stdout "1.3.1" - chokidar "3.3.0" - debug "3.2.6" - diff "3.5.0" - escape-string-regexp "1.0.5" - find-up "3.0.0" - glob "7.1.3" - growl "1.10.5" - he "1.2.0" - js-yaml "3.13.1" - log-symbols "3.0.0" - minimatch "3.0.4" - mkdirp "0.5.5" - ms "2.1.1" - node-environment-flags "1.0.6" - object.assign "4.1.0" - strip-json-comments "2.0.1" - supports-color "6.0.0" - which "1.3.1" - wide-align "1.1.3" - yargs "13.3.2" - yargs-parser "13.1.2" - yargs-unparser "1.6.0" - -mocha@^9.1.1, mocha@^9.1.3: - version "9.2.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.2.2.tgz#d70db46bdb93ca57402c809333e5a84977a88fb9" - integrity sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g== - dependencies: - "@ungap/promise-all-settled" "1.1.2" - ansi-colors "4.1.1" - browser-stdout "1.3.1" - chokidar "3.5.3" - debug "4.3.3" - diff "5.0.0" - escape-string-regexp "4.0.0" - find-up "5.0.0" - glob "7.2.0" - growl "1.10.5" - he "1.2.0" - js-yaml "4.1.0" - log-symbols "4.1.0" - minimatch "4.2.1" - ms "2.1.3" - nanoid "3.3.1" - serialize-javascript "6.0.0" - strip-json-comments "3.1.1" - supports-color "8.1.1" - which "2.0.2" - workerpool "6.2.0" - yargs "16.2.0" - yargs-parser "20.2.4" - yargs-unparser "2.0.0" - -mock-fs@^4.1.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.14.0.tgz#ce5124d2c601421255985e6e94da80a7357b1b18" - integrity sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw== - -module-error@^1.0.1, module-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/module-error/-/module-error-1.0.2.tgz#8d1a48897ca883f47a45816d4fb3e3c6ba404d86" - integrity sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA== - -moment-mini@^2.24.0: - version "2.29.4" - resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.29.4.tgz#cbbcdc58ce1b267506f28ea6668dbe060a32758f" - integrity sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multibase@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.7.0.tgz#1adfc1c50abe05eefeb5091ac0c2728d6b84581b" - integrity sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multibase@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/multibase/-/multibase-0.6.1.tgz#b76df6298536cc17b9f6a6db53ec88f85f8cc12b" - integrity sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw== - dependencies: - base-x "^3.0.8" - buffer "^5.5.0" - -multicodec@^0.5.5: - version "0.5.7" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-0.5.7.tgz#1fb3f9dd866a10a55d226e194abba2dcc1ee9ffd" - integrity sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA== - dependencies: - varint "^5.0.0" - -multicodec@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/multicodec/-/multicodec-1.0.4.tgz#46ac064657c40380c28367c90304d8ed175a714f" - integrity sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg== - dependencies: - buffer "^5.6.0" - varint "^5.0.0" - -multihashes@^0.4.15, multihashes@~0.4.15: - version "0.4.21" - resolved "https://registry.yarnpkg.com/multihashes/-/multihashes-0.4.21.tgz#dc02d525579f334a7909ade8a122dabb58ccfcb5" - integrity sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw== - dependencies: - buffer "^5.5.0" - multibase "^0.7.0" - varint "^5.0.0" - -nano-base32@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/nano-base32/-/nano-base32-1.0.1.tgz#ba548c879efcfb90da1c4d9e097db4a46c9255ef" - integrity sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw== - -nano-json-stream-parser@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz#0cc8f6d0e2b622b479c40d499c46d64b755c6f5f" - integrity sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew== - -nanoid@3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" - integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== - -nanoid@3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.3.tgz#fd8e8b7aa761fe807dba2d1b98fb7241bb724a25" - integrity sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w== - -napi-macros@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b" - integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -ndjson@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-2.0.0.tgz#320ac86f6fe53f5681897349b86ac6f43bfa3a19" - integrity sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ== - dependencies: - json-stringify-safe "^5.0.1" - minimist "^1.2.5" - readable-stream "^3.6.0" - split2 "^3.0.0" - through2 "^4.0.0" - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb" - integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -nise@^5.1.0, nise@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.2.tgz#a7b8909c216b3491fd4fc0b124efb69f3939b449" - integrity sha512-+gQjFi8v+tkfCuSCxfURHLhRhniE/+IaYbIphxAN2JRR9SHKhY8hgXpaXiYfHdw+gcGe4buxgbprBQFab9FkhA== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers" "^7.0.4" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - path-to-regexp "^1.7.0" - -no-case@^2.2.0, no-case@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz#60b813396be39b3f1288a4c1ed5d1e7d28b464ac" - integrity sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ== - dependencies: - lower-case "^1.1.1" - -node-addon-api@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" - integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-environment-flags@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/node-environment-flags/-/node-environment-flags-1.0.6.tgz#a30ac13621f6f7d674260a54dede048c3982c088" - integrity sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw== - dependencies: - object.getownpropertydescriptors "^2.0.3" - semver "^5.7.0" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.5.0.tgz#7a64eefa0b21112f89f58379da128ac177f20e40" - integrity sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg== - -node-preload@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" - integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== - dependencies: - process-on-spawn "^1.0.0" - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -nofilter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/nofilter/-/nofilter-1.0.4.tgz#78d6f4b6a613e7ced8b015cec534625f7667006e" - integrity sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA== - -non-layered-tidy-tree-layout@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz#57d35d13c356643fc296a55fb11ac15e74da7804" - integrity sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw== - -nopt@3.x: - version "3.0.6" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg== - dependencies: - abbrev "1" - -normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ== - -number-to-bn@1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" - integrity sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig== - dependencies: - bn.js "4.11.6" - strip-hex-prefix "1.0.0" - -nyc@15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/nyc/-/nyc-15.1.0.tgz#1335dae12ddc87b6e249d5a1994ca4bdaea75f02" - integrity sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A== - dependencies: - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - caching-transform "^4.0.0" - convert-source-map "^1.7.0" - decamelize "^1.2.0" - find-cache-dir "^3.2.0" - find-up "^4.1.0" - foreground-child "^2.0.0" - get-package-type "^0.1.0" - glob "^7.1.6" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-hook "^3.0.0" - istanbul-lib-instrument "^4.0.0" - istanbul-lib-processinfo "^2.0.2" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.0.2" - make-dir "^3.0.0" - node-preload "^0.2.1" - p-map "^3.0.0" - process-on-spawn "^1.0.0" - resolve-from "^5.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - spawn-wrap "^2.0.0" - test-exclude "^6.0.0" - yargs "^15.0.2" - -oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== - -object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.0.11, object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== - dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.getownpropertydescriptors@^2.0.3: - version "2.1.5" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz#db5a9002489b64eef903df81d6623c07e5b4b4d3" - integrity sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw== - dependencies: - array.prototype.reduce "^1.0.5" - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -object.values@^1.1.4: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -obliterator@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-2.0.4.tgz#fa650e019b2d075d745e44f1effeb13a2adbe816" - integrity sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ== - -oboe@2.1.5: - version "2.1.5" - resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" - integrity sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA== - dependencies: - http-https "^1.0.0" - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -once@1.x, once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -ordinal@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ordinal/-/ordinal-1.0.3.tgz#1a3c7726a61728112f50944ad7c35c06ae3a0d4d" - integrity sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ== - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g== - dependencies: - lcid "^1.0.0" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-cancelable@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" - integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== - -p-cancelable@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-3.0.0.tgz#63826694b54d61ca1c20ebcb6d3ecf5e14cd8050" - integrity sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-hash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" - integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== - dependencies: - graceful-fs "^4.1.15" - hasha "^5.0.0" - lodash.flattendeep "^4.4.0" - release-zalgo "^1.0.0" - -pako@^1.0.4: - version "1.0.11" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" - integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== - -param-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz#df94fd8cf6531ecf75e6bef9a0858fbc72be2247" - integrity sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w== - dependencies: - no-case "^2.2.0" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-asn1@^5.0.0, parse-asn1@^5.1.5: - version "5.1.6" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" - integrity sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw== - dependencies: - asn1.js "^5.2.0" - browserify-aes "^1.0.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-cache-control@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e" - integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg== - -parse-headers@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.5.tgz#069793f9356a54008571eb7f9761153e6c770da9" - integrity sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA== - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ== - dependencies: - error-ex "^1.2.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-2.0.1.tgz#2d578d3455f660da65eca18ef95b4e0de912761e" - integrity sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ== - dependencies: - camel-case "^3.0.0" - upper-case-first "^1.1.0" - -patch-console@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" - integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== - -path-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/path-case/-/path-case-2.1.1.tgz#94b8037c372d3fe2906e465bb45e25d226e8eea5" - integrity sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q== - dependencies: - no-case "^2.2.0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ== - dependencies: - pinkie-promise "^2.0.0" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg== - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -pathval@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" - integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== - -pbkdf2@^3.0.17, pbkdf2@^3.0.3: - version "3.1.2" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" - integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -performance-now@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz#c819ac728059a461cab1c3889a2be3c49a004d7f" - integrity sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg== - dependencies: - find-up "^2.1.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w== - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - -prettier@^2.3.1: - version "2.7.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process-on-spawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" - integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== - dependencies: - fromentries "^1.2.0" - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise@^8.0.0: - version "8.3.0" - resolved "https://registry.yarnpkg.com/promise/-/promise-8.3.0.tgz#8cb333d1edeb61ef23869fbb8a4ea0279ab60e0a" - integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== - dependencies: - asap "~2.0.6" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -psl@^1.1.28: - version "1.9.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" - integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - integrity sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -pure-rand@^5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-5.0.3.tgz#a2f15dfbc3be8433d1d8ed67ee411aa83fb90406" - integrity sha512-9N8x1h8dptBQpHyC7aZMS+iNOAm97WMGY0AFrguU1cpfW3I5jINkWe5BIY5md0ofy+1TCIELsVcm/GJXZSaPbw== - -purecss@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/purecss/-/purecss-2.2.0.tgz#71249802e1babd562b236cf5d0b75b16f158a421" - integrity sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA== - -qs@6.11.0, qs@^6.4.0, qs@^6.7.0: - version "6.11.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -qs@~6.5.2: - version "6.5.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad" - integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== - -query-string@^5.0.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" - integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== - dependencies: - decode-uri-component "^0.2.0" - object-assign "^4.1.0" - strict-uri-encode "^1.0.0" - -queue-microtask@^1.2.2, queue-microtask@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" - integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== - -ramda@^0.27.1: - version "0.27.2" - resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.27.2.tgz#84463226f7f36dc33592f6f4ed6374c48306c3f1" - integrity sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA== - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1, raw-body@^2.4.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -react-devtools-core@^4.19.1: - version "4.26.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.26.1.tgz#2893fea58089be64c5356d5bd0eebda8d1bbf317" - integrity sha512-r1csa5n9nABVpSdAadwTG7K+SfgRJPc/Hdx89BkV5IlA1mEGgGi3ir630ST5D/xYlJQaY3VE75YGADgpNW7HIw== - dependencies: - shell-quote "^1.6.1" - ws "^7" - -react-reconciler@^0.26.2: - version "0.26.2" - resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" - integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react@18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A== - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ== - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.2.2: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== - dependencies: - picomatch "^2.0.4" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -reduce-flatten@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/reduce-flatten/-/reduce-flatten-2.0.0.tgz#734fd84e65f375d7ca4465c69798c25c9d10ae27" - integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w== - -regenerator-runtime@^0.13.10: - version "0.13.11" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -release-zalgo@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" - integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== - dependencies: - es6-error "^4.0.1" - -req-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-cwd/-/req-cwd-2.0.0.tgz#d4082b4d44598036640fb73ddea01ed53db49ebc" - integrity sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ== - dependencies: - req-from "^2.0.0" - -req-from@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/req-from/-/req-from-2.0.0.tgz#d74188e47f93796f4aa71df6ee35ae689f3e0e70" - integrity sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA== - dependencies: - resolve-from "^3.0.0" - -request-promise-core@1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" - integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== - dependencies: - lodash "^4.17.19" - -request-promise-native@^1.0.5: - version "1.0.9" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" - integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== - dependencies: - request-promise-core "1.1.4" - stealthy-require "^1.1.1" - tough-cookie "^2.3.3" - -request@^2.79.0, request@^2.88.0: - version "2.88.2" - resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q== - -require-from-string@^2.0.0, require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug== - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-alpn@^1.0.0, resolve-alpn@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" - integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve@1.1.x: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg== - -resolve@1.17.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.20.0: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -responselike@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" - integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== - dependencies: - lowercase-keys "^2.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@3.0.2, rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^2.2.8: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160-min@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/ripemd160-min/-/ripemd160-min-0.0.6.tgz#a904b77658114474d02503e819dcc55853b67e62" - integrity sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A== - -ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -rlp@^2.2.3, rlp@^2.2.4: - version "2.2.7" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.7.tgz#33f31c4afac81124ac4b283e2bd4d9720b30beaf" - integrity sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ== - dependencies: - bn.js "^5.2.0" - -robust-predicates@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.1.tgz#ecde075044f7f30118682bd9fb3f123109577f9a" - integrity sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g== - -run-parallel-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz#be80e936f5768623a38a963262d6bef8ff11e7ba" - integrity sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw== - dependencies: - queue-microtask "^1.2.2" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rustbn.js@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" - integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== - -rw@1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" - integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== - -safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@^5.2.1, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sc-istanbul@^0.4.5: - version "0.4.6" - resolved "https://registry.yarnpkg.com/sc-istanbul/-/sc-istanbul-0.4.6.tgz#cf6784355ff2076f92d70d59047d71c13703e839" - integrity sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g== - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -scrypt-js@2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" - integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== - -scrypt-js@3.0.1, scrypt-js@^3.0.0, scrypt-js@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" - integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== - -secp256k1@^4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.3.tgz#c4559ecd1b8d3c1827ed2d1b94190d69ce267303" - integrity sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA== - dependencies: - elliptic "^6.5.4" - node-addon-api "^2.0.0" - node-gyp-build "^4.2.0" - -"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.5.0, semver@^5.7.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -sentence-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-2.1.1.tgz#1f6e2dda39c168bf92d13f86d4a918933f667ed4" - integrity sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ== - dependencies: - no-case "^2.2.0" - upper-case-first "^1.1.2" - -serialize-error@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/serialize-error/-/serialize-error-8.1.0.tgz#3a069970c712f78634942ddd50fbbc0eaebe2f67" - integrity sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ== - dependencies: - type-fest "^0.20.2" - -serialize-javascript@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -servify@^0.1.12: - version "0.1.12" - resolved "https://registry.yarnpkg.com/servify/-/servify-0.1.12.tgz#142ab7bee1f1d033b66d0707086085b17c06db95" - integrity sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw== - dependencies: - body-parser "^1.16.0" - cors "^2.8.1" - express "^4.14.0" - request "^2.79.0" - xhr "^2.3.3" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -setimmediate@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" - integrity sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog== - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -sha1@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/sha1/-/sha1-1.1.1.tgz#addaa7a93168f393f19eb2b15091618e2700f848" - integrity sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA== - dependencies: - charenc ">= 0.0.1" - crypt ">= 0.0.1" - -sha3@^2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/sha3/-/sha3-2.1.4.tgz#000fac0fe7c2feac1f48a25e7a31b52a6492cc8f" - integrity sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg== - dependencies: - buffer "6.0.3" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== - -shelljs@^0.8.3: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.7" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^2.7.0: - version "2.8.2" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.2.tgz#5708fb0919d440657326cd5fe7d2599d07705019" - integrity sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw== - dependencies: - decompress-response "^3.3.0" - once "^1.3.1" - simple-concat "^1.0.0" - -sinon@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-12.0.1.tgz#331eef87298752e1b88a662b699f98e403c859e9" - integrity sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg== - dependencies: - "@sinonjs/commons" "^1.8.3" - "@sinonjs/fake-timers" "^8.1.0" - "@sinonjs/samsam" "^6.0.2" - diff "^5.0.0" - nise "^5.1.0" - supports-color "^7.2.0" - -sinon@^14.0.0: - version "14.0.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-14.0.2.tgz#585a81a3c7b22cf950762ac4e7c28eb8b151c46f" - integrity sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w== - dependencies: - "@sinonjs/commons" "^2.0.0" - "@sinonjs/fake-timers" "^9.1.2" - "@sinonjs/samsam" "^7.0.1" - diff "^5.0.0" - nise "^5.1.2" - supports-color "^7.2.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snake-case@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-2.1.0.tgz#41bdb1b73f30ec66a04d4e2cad1b76387d4d6d9f" - integrity sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q== - dependencies: - no-case "^2.2.0" - -solc@0.7.3: - version "0.7.3" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.7.3.tgz#04646961bd867a744f63d2b4e3c0701ffdc7d78a" - integrity sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA== - dependencies: - command-exists "^1.2.8" - commander "3.0.2" - follow-redirects "^1.12.1" - fs-extra "^0.30.0" - js-sha3 "0.8.0" - memorystream "^0.3.1" - require-from-string "^2.0.0" - semver "^5.5.0" - tmp "0.0.33" - -solc@^0.4.20: - version "0.4.26" - resolved "https://registry.yarnpkg.com/solc/-/solc-0.4.26.tgz#5390a62a99f40806b86258c737c1cf653cc35cb5" - integrity sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA== - dependencies: - fs-extra "^0.30.0" - memorystream "^0.3.1" - require-from-string "^1.1.0" - semver "^5.3.0" - yargs "^4.7.1" - -solidity-coverage@0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/solidity-coverage/-/solidity-coverage-0.8.2.tgz#bc39604ab7ce0a3fa7767b126b44191830c07813" - integrity sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ== - dependencies: - "@ethersproject/abi" "^5.0.9" - "@solidity-parser/parser" "^0.14.1" - chalk "^2.4.2" - death "^1.1.0" - detect-port "^1.3.0" - difflib "^0.2.4" - fs-extra "^8.1.0" - ghost-testrpc "^0.0.2" - global-modules "^2.0.0" - globby "^10.0.1" - jsonschema "^1.2.4" - lodash "^4.17.15" - mocha "7.1.2" - node-emoji "^1.10.0" - pify "^4.0.1" - recursive-readdir "^2.2.2" - sc-istanbul "^0.4.5" - semver "^7.3.4" - shelljs "^0.8.3" - web3-utils "^1.3.6" - -source-map-support@^0.5.13, source-map-support@^0.5.19: - version "0.5.21" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0, source-map@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@~0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA== - dependencies: - amdefine ">=0.0.4" - -spawn-wrap@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" - integrity sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg== - dependencies: - foreground-child "^2.0.0" - is-windows "^1.0.2" - make-dir "^3.0.0" - rimraf "^3.0.0" - signal-exit "^3.0.2" - which "^2.0.1" - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -split@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -sshpk@^1.7.0: - version "1.17.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5" - integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ== - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - -stack-utils@^2.0.2: - version "2.0.6" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" - integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== - dependencies: - escape-string-regexp "^2.0.0" - -stacktrace-parser@^0.1.10: - version "0.1.10" - resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" - integrity sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg== - dependencies: - type-fest "^0.7.1" - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -stealthy-require@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - integrity sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -strict-uri-encode@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" - integrity sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ== - -string-format@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-format/-/string-format-2.0.0.tgz#f2df2e7097440d3b65de31b6d40d54c96eaffb9b" - integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA== - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2", string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g== - dependencies: - is-utf8 "^0.2.0" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-hex-prefix@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" - integrity sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A== - dependencies: - is-hex-prefixed "1.0.0" - -strip-indent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" - integrity sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA== - -strip-json-comments@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -stylis@^4.1.2: - version "4.1.3" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.3.tgz#fd2fbe79f5fed17c55269e16ed8da14c84d069f7" - integrity sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA== - -supports-color@6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.0.0.tgz#76cfe742cf1f41bb9b1c29ad03068c05b4c0e40a" - integrity sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg== - dependencies: - has-flag "^3.0.0" - -supports-color@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^3.1.0: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A== - dependencies: - has-flag "^1.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0, supports-color@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -swap-case@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/swap-case/-/swap-case-1.1.2.tgz#c39203a4587385fad3c850a0bd1bcafa081974e3" - integrity sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ== - dependencies: - lower-case "^1.1.1" - upper-case "^1.1.1" - -swarm-js@^0.1.40: - version "0.1.42" - resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.42.tgz#497995c62df6696f6e22372f457120e43e727979" - integrity sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ== - dependencies: - bluebird "^3.5.0" - buffer "^5.0.5" - eth-lib "^0.1.26" - fs-extra "^4.0.2" - got "^11.8.5" - mime-types "^2.1.16" - mkdirp-promise "^5.0.1" - mock-fs "^4.1.0" - setimmediate "^1.0.5" - tar "^4.0.2" - xhr-request "^1.0.1" - -sync-request@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-6.1.0.tgz#e96217565b5e50bbffe179868ba75532fb597e68" - integrity sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw== - dependencies: - http-response-object "^3.0.1" - sync-rpc "^1.2.1" - then-request "^6.0.0" - -sync-rpc@^1.2.1: - version "1.3.6" - resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7" - integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw== - dependencies: - get-port "^3.1.0" - -synckit@^0.8.4: - version "0.8.4" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" - integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.4.0" - -table-layout@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/table-layout/-/table-layout-1.0.2.tgz#c4038a1853b0136d63365a734b6931cf4fad4a04" - integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A== - dependencies: - array-back "^4.0.1" - deep-extend "~0.6.0" - typical "^5.2.0" - wordwrapjs "^4.0.0" - -table@^6.0.9, table@^6.8.0: - version "6.8.1" - resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf" - integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar@^4.0.2: - version "4.4.19" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.19.tgz#2e4d7263df26f2b914dee10c825ab132123742f3" - integrity sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA== - dependencies: - chownr "^1.1.4" - fs-minipass "^1.2.7" - minipass "^2.9.0" - minizlib "^1.3.3" - mkdirp "^0.5.5" - safe-buffer "^5.2.1" - yallist "^3.1.1" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -testrpc@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/testrpc/-/testrpc-0.0.1.tgz#83e2195b1f5873aec7be1af8cbe6dcf39edb7aed" - integrity sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -then-request@^6.0.0: - version "6.0.2" - resolved "https://registry.yarnpkg.com/then-request/-/then-request-6.0.2.tgz#ec18dd8b5ca43aaee5cb92f7e4c1630e950d4f0c" - integrity sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA== - dependencies: - "@types/concat-stream" "^1.6.0" - "@types/form-data" "0.0.33" - "@types/node" "^8.0.0" - "@types/qs" "^6.2.31" - caseless "~0.12.0" - concat-stream "^1.6.0" - form-data "^2.2.0" - http-basic "^8.1.1" - http-response-object "^3.0.1" - promise "^8.0.0" - qs "^6.4.0" - -throat@^4.0.0, throat@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - integrity sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA== - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -through@2: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -timed-out@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA== - -tiny-glob@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" - integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== - dependencies: - globalyzer "0.1.0" - globrex "^0.1.2" - -tiny-invariant@^1.1.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -title-case@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/title-case/-/title-case-2.1.1.tgz#3e127216da58d2bc5becf137ab91dae3a7cd8faa" - integrity sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q== - dependencies: - no-case "^2.2.0" - upper-case "^1.0.3" - -tmp@0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/toformat/-/toformat-2.0.0.tgz#7a043fd2dfbe9021a4e36e508835ba32056739d8" - integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -tough-cookie@^2.3.3, tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -ts-command-line-args@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/ts-command-line-args/-/ts-command-line-args-2.3.1.tgz#b6188e42efc6cf7a8898e438a873fbb15505ddd6" - integrity sha512-FR3y7pLl/fuUNSmnPhfLArGqRrpojQgIEEOVzYx9DhTmfIN7C9RWSfpkJEF4J+Gk7aVx5pak8I7vWZsaN4N84g== - dependencies: - chalk "^4.1.0" - command-line-args "^5.1.1" - command-line-usage "^6.1.0" - string-format "^2.0.0" - -ts-essentials@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ts-essentials/-/ts-essentials-7.0.3.tgz#686fd155a02133eedcc5362dc8b5056cde3e5a38" - integrity sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ== - -ts-node@10.8.1: - version "10.8.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" - integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.11.0: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.1.0.tgz#f8ef7d467f08ae3a695335bf1ece088c5538d2c1" - integrity sha512-AHx4Euop/dXFC+Vx589alFba8QItjF+8hf8LtmuiCwHyI4rHXQtOOENaM8kvYf5fR0dRChy3wzWIZ9WbB7FWow== - dependencies: - json5 "^2.2.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.3: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== - -tsort@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" - integrity sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -tweetnacl-util@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" - integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== - -tweetnacl@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" - integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg== - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" - integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" - integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== - -type-fest@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== - -type@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" - integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== - -typechain@8.1.1: - version "8.1.1" - resolved "https://registry.yarnpkg.com/typechain/-/typechain-8.1.1.tgz#9c2e8012c2c4c586536fc18402dcd7034c4ff0bd" - integrity sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ== - dependencies: - "@types/prettier" "^2.1.1" - debug "^4.3.1" - fs-extra "^7.0.0" - glob "7.1.7" - js-sha3 "^0.8.0" - lodash "^4.17.15" - mkdirp "^1.0.4" - prettier "^2.3.1" - ts-command-line-args "^2.2.0" - ts-essentials "^7.0.1" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== - -typescript@^4.7.4: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== - -typical@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-4.0.0.tgz#cbeaff3b9d7ae1e2bbfaf5a4e6f11eccfde94fc4" - integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw== - -typical@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/typical/-/typical-5.2.0.tgz#4daaac4f2b5315460804f0acf6cb69c52bb93066" - integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== - -uglify-js@^3.1.4: - version "3.17.4" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.17.4.tgz#61678cf5fa3f5b7eb789bb345df29afb8257c22c" - integrity sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== - -ultron@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" - integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -underscore@^1.8.3: - version "1.13.6" - resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" - integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== - -undici@^5.4.0: - version "5.12.0" - resolved "https://registry.yarnpkg.com/undici/-/undici-5.12.0.tgz#c758ffa704fbcd40d506e4948860ccaf4099f531" - integrity sha512-zMLamCG62PGjd9HHMpo05bSLvvwWOZgGeiWlN/vlqu3+lRo3elxktVGEyLMX+IO7c2eflLjcW74AlkhEZm15mg== - dependencies: - busboy "^1.6.0" - -universalify@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -upper-case-first@^1.1.0, upper-case-first@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-1.1.2.tgz#5d79bedcff14419518fd2edb0a0507c9b6859115" - integrity sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ== - dependencies: - upper-case "^1.1.1" - -upper-case@^1.0.3, upper-case@^1.1.0, upper-case@^1.1.1, upper-case@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" - integrity sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA== - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-set-query@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" - integrity sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg== - -utf-8-validate@^5.0.2: - version "5.0.10" - resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" - integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== - dependencies: - node-gyp-build "^4.3.0" - -utf8@3.0.0, utf8@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" - integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -util@^0.12.0: - version "0.12.5" - resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" - integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== - dependencies: - inherits "^2.0.3" - is-arguments "^1.0.4" - is-generator-function "^1.0.7" - is-typed-array "^1.1.3" - which-typed-array "^1.1.2" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" - integrity sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg== - -uuid@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -varint@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/varint/-/varint-5.0.2.tgz#5b47f8a947eb668b848e034dcfa87d0ff8a7f7a4" - integrity sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow== - -vary@^1, vary@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -web3-bzz@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.7.4.tgz#9419e606e38a9777443d4ce40506ebd796e06075" - integrity sha512-w9zRhyEqTK/yi0LGRHjZMcPCfP24LBjYXI/9YxFw9VqsIZ9/G0CRCnUt12lUx0A56LRAMpF7iQ8eA73aBcO29Q== - dependencies: - "@types/node" "^12.12.6" - got "9.6.0" - swarm-js "^0.1.40" - -web3-bzz@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.8.1.tgz#81397be5ce262d03d82b92e9d8acc11f8a609ea1" - integrity sha512-dJJHS84nvpoxv6ijTMkdUSlRr5beCXNtx4UZcrFLHBva8dT63QEtKdLyDt2AyMJJdVzTCk78uir/6XtVWrdS6w== - dependencies: - "@types/node" "^12.12.6" - got "12.1.0" - swarm-js "^0.1.40" - -web3-core-helpers@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.7.4.tgz#f8f808928560d3e64e0c8d7bdd163aa4766bcf40" - integrity sha512-F8PH11qIkE/LpK4/h1fF/lGYgt4B6doeMi8rukeV/s4ivseZHHslv1L6aaijLX/g/j4PsFmR42byynBI/MIzFg== - dependencies: - web3-eth-iban "1.7.4" - web3-utils "1.7.4" - -web3-core-helpers@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.8.1.tgz#7904747b23fd0afa4f2c86ed98ea9418ccad7672" - integrity sha512-ClzNO6T1S1gifC+BThw0+GTfcsjLEY8T1qUp6Ly2+w4PntAdNtKahxWKApWJ0l9idqot/fFIDXwO3Euu7I0Xqw== - dependencies: - web3-eth-iban "1.8.1" - web3-utils "1.8.1" - -web3-core-method@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.7.4.tgz#3873c6405e1a0a8a1efc1d7b28de8b7550b00c15" - integrity sha512-56K7pq+8lZRkxJyzf5MHQPI9/VL3IJLoy4L/+q8HRdZJ3CkB1DkXYaXGU2PeylG1GosGiSzgIfu1ljqS7CP9xQ== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-utils "1.7.4" - -web3-core-method@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.8.1.tgz#0fc5a433a9fc784c447522f141c0a8e0163c7790" - integrity sha512-oYGRodktfs86NrnFwaWTbv2S38JnpPslFwSSARwFv4W9cjbGUW3LDeA5MKD/dRY+ssZ5OaekeMsUCLoGhX68yA== - dependencies: - "@ethersproject/transactions" "^5.6.2" - web3-core-helpers "1.8.1" - web3-core-promievent "1.8.1" - web3-core-subscriptions "1.8.1" - web3-utils "1.8.1" - -web3-core-promievent@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.7.4.tgz#80a75633fdfe21fbaae2f1e38950edb2f134868c" - integrity sha512-o4uxwXKDldN7ER7VUvDfWsqTx9nQSP1aDssi1XYXeYC2xJbVo0n+z6ryKtmcoWoRdRj7uSpVzal3nEmlr480mA== - dependencies: - eventemitter3 "4.0.4" - -web3-core-promievent@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.8.1.tgz#f334c8b2ceac6c2228f06d2a515f6d103157f036" - integrity sha512-9mxqHlgB0MrZI4oUIRFkuoJMNj3E7btjrMv3sMer/Z9rYR1PfoSc1aAokw4rxKIcAh+ylVtd/acaB2HKB7aRPg== - dependencies: - eventemitter3 "4.0.4" - -web3-core-requestmanager@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.7.4.tgz#2dc8a526dab8183dca3fef54658621801b1d0469" - integrity sha512-IuXdAm65BQtPL4aI6LZJJOrKAs0SM5IK2Cqo2/lMNvVMT9Kssq6qOk68Uf7EBDH0rPuINi+ReLP+uH+0g3AnPA== - dependencies: - util "^0.12.0" - web3-core-helpers "1.7.4" - web3-providers-http "1.7.4" - web3-providers-ipc "1.7.4" - web3-providers-ws "1.7.4" - -web3-core-requestmanager@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.8.1.tgz#272ffa55b7b568ecbc8e4a257ca080355c31c60e" - integrity sha512-x+VC2YPPwZ1khvqA6TA69LvfFCOZXsoUVOxmTx/vIN22PrY9KzKhxcE7pBSiGhmab1jtmRYXUbcQSVpAXqL8cw== - dependencies: - util "^0.12.0" - web3-core-helpers "1.8.1" - web3-providers-http "1.8.1" - web3-providers-ipc "1.8.1" - web3-providers-ws "1.8.1" - -web3-core-subscriptions@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.7.4.tgz#cfbd3fa71081a8c8c6f1a64577a1a80c5bd9826f" - integrity sha512-VJvKWaXRyxk2nFWumOR94ut9xvjzMrRtS38c4qj8WBIRSsugrZr5lqUwgndtj0qx4F+50JhnU++QEqUEAtKm3g== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" - -web3-core-subscriptions@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.8.1.tgz#f5ae1380e92746eadfab6475b8a70ef5a1be6bbf" - integrity sha512-bmCMq5OeA3E2vZUh8Js1HcJbhwtsE+yeMqGC4oIZB3XsL5SLqyKLB/pU+qUYqQ9o4GdcrFTDPhPg1bgvf7p1Pw== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.8.1" - -web3-core@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.7.4.tgz#943fff99134baedafa7c65b4a0bbd424748429ff" - integrity sha512-L0DCPlIh9bgIED37tYbe7bsWrddoXYc897ANGvTJ6MFkSNGiMwDkTLWSgYd9Mf8qu8b4iuPqXZHMwIo4atoh7Q== - dependencies: - "@types/bn.js" "^5.1.0" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-requestmanager "1.7.4" - web3-utils "1.7.4" - -web3-core@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.8.1.tgz#050b1c408d1f9b7ae539e90f7f7d1b7a7d10578b" - integrity sha512-LbRZlJH2N6nS3n3Eo9Y++25IvzMY7WvYnp4NM/Ajhh97dAdglYs6rToQ2DbL2RLvTYmTew4O/y9WmOk4nq9COw== - dependencies: - "@types/bn.js" "^5.1.0" - "@types/node" "^12.12.6" - bignumber.js "^9.0.0" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-requestmanager "1.8.1" - web3-utils "1.8.1" - -web3-eth-abi@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.7.4.tgz#3fee967bafd67f06b99ceaddc47ab0970f2a614a" - integrity sha512-eMZr8zgTbqyL9MCTCAvb67RbVyN5ZX7DvA0jbLOqRWCiw+KlJKTGnymKO6jPE8n5yjk4w01e165Qb11hTDwHgg== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.7.4" - -web3-eth-abi@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.8.1.tgz#47455d6513217c4b0866fea6f97b1c4afa0b6535" - integrity sha512-0mZvCRTIG0UhDhJwNQJgJxu4b4DyIpuMA0GTfqxqeuqzX4Q/ZvmoNurw0ExTfXaGPP82UUmmdkRi6FdZOx+C6w== - dependencies: - "@ethersproject/abi" "^5.6.3" - web3-utils "1.8.1" - -web3-eth-accounts@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.7.4.tgz#7a24a4dfe947f7e9d1bae678529e591aa146167a" - integrity sha512-Y9vYLRKP7VU7Cgq6wG1jFaG2k3/eIuiTKAG8RAuQnb6Cd9k5BRqTm5uPIiSo0AP/u11jDomZ8j7+WEgkU9+Btw== - dependencies: - "@ethereumjs/common" "^2.5.0" - "@ethereumjs/tx" "^3.3.2" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "3.3.2" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" - -web3-eth-accounts@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.8.1.tgz#1ce7387721f118aeb0376291e4d8bbe2ac323406" - integrity sha512-mgzxSYgN54/NsOFBO1Fq1KkXp1S5KlBvI/DlgvajU72rupoFMq6Cu6Yp9GUaZ/w2ij9PzEJuFJk174XwtfMCmg== - dependencies: - "@ethereumjs/common" "2.5.0" - "@ethereumjs/tx" "3.3.2" - crypto-browserify "3.12.0" - eth-lib "0.2.8" - ethereumjs-util "^7.0.10" - scrypt-js "^3.0.1" - uuid "^9.0.0" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-utils "1.8.1" - -web3-eth-contract@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.7.4.tgz#e5761cfb43d453f57be4777b2e5e7e1082078ff7" - integrity sha512-ZgSZMDVI1pE9uMQpK0T0HDT2oewHcfTCv0osEqf5qyn5KrcQDg1GT96/+S0dfqZ4HKj4lzS5O0rFyQiLPQ8LzQ== - dependencies: - "@types/bn.js" "^5.1.0" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-promievent "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-utils "1.7.4" - -web3-eth-contract@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.8.1.tgz#bdf3e33bbcb79a1b6144dffd6a0deefd2e459272" - integrity sha512-1wphnl+/xwCE2io44JKnN+ti3oa47BKRiVzvWd42icwRbcpFfRxH9QH+aQX3u8VZIISNH7dAkTWpGIIJgGFTmg== - dependencies: - "@types/bn.js" "^5.1.0" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-promievent "1.8.1" - web3-core-subscriptions "1.8.1" - web3-eth-abi "1.8.1" - web3-utils "1.8.1" - -web3-eth-ens@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.7.4.tgz#346720305379c0a539e226141a9602f1da7bc0c8" - integrity sha512-Gw5CVU1+bFXP5RVXTCqJOmHn71X2ghNk9VcEH+9PchLr0PrKbHTA3hySpsPco1WJAyK4t8SNQVlNr3+bJ6/WZA== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-promievent "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-contract "1.7.4" - web3-utils "1.7.4" - -web3-eth-ens@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.8.1.tgz#e78a9651fea8282abe8565b001819e2d645e5929" - integrity sha512-FT8xTI9uN8RxeBQa/W8pLa2aoFh4+EE34w7W2271LICKzla1dtLyb6XSdn48vsUcPmhWsTVk9mO9RTU0l4LGQQ== - dependencies: - content-hash "^2.5.2" - eth-ens-namehash "2.0.8" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-promievent "1.8.1" - web3-eth-abi "1.8.1" - web3-eth-contract "1.8.1" - web3-utils "1.8.1" - -web3-eth-iban@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.7.4.tgz#711fb2547fdf0f988060027331b2b6c430505753" - integrity sha512-XyrsgWlZQMv5gRcjXMsNvAoCRvV5wN7YCfFV5+tHUCqN8g9T/o4XUS20vDWD0k4HNiAcWGFqT1nrls02MGZ08w== - dependencies: - bn.js "^5.2.1" - web3-utils "1.7.4" - -web3-eth-iban@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.8.1.tgz#c6484e5d68ca644aa78431301e7acd5df24598d1" - integrity sha512-DomoQBfvIdtM08RyMGkMVBOH0vpOIxSSQ+jukWk/EkMLGMWJtXw/K2c2uHAeq3L/VPWNB7zXV2DUEGV/lNE2Dg== - dependencies: - bn.js "^5.2.1" - web3-utils "1.8.1" - -web3-eth-personal@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.7.4.tgz#22c399794cb828a75703df8bb4b3c1331b471546" - integrity sha512-O10C1Hln5wvLQsDhlhmV58RhXo+GPZ5+W76frSsyIrkJWLtYQTCr5WxHtRC9sMD1idXLqODKKgI2DL+7xeZ0/g== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-eth-personal@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.8.1.tgz#00b5ff1898b62044d25ed5fddd8486168d4827cf" - integrity sha512-myIYMvj7SDIoV9vE5BkVdon3pya1WinaXItugoii2VoTcQNPOtBxmYVH+XS5ErzCJlnxzphpQrkywyY64bbbCA== - dependencies: - "@types/node" "^12.12.6" - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-net "1.8.1" - web3-utils "1.8.1" - -web3-eth@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.7.4.tgz#a7c1d3ccdbba4de4a82df7e3c4db716e4a944bf2" - integrity sha512-JG0tTMv0Ijj039emXNHi07jLb0OiWSA9O24MRSk5vToTQyDNXihdF2oyq85LfHuF690lXZaAXrjhtLNlYqb7Ug== - dependencies: - web3-core "1.7.4" - web3-core-helpers "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-eth-abi "1.7.4" - web3-eth-accounts "1.7.4" - web3-eth-contract "1.7.4" - web3-eth-ens "1.7.4" - web3-eth-iban "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-utils "1.7.4" - -web3-eth@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.8.1.tgz#395f6cd56edaac5dbb23e8cec9886c3fd32c430e" - integrity sha512-LgyzbhFqiFRd8M8sBXoFN4ztzOnkeckl3H/9lH5ek7AdoRMhBg7tYpYRP3E5qkhd/q+yiZmcUgy1AF6NHrC1wg== - dependencies: - web3-core "1.8.1" - web3-core-helpers "1.8.1" - web3-core-method "1.8.1" - web3-core-subscriptions "1.8.1" - web3-eth-abi "1.8.1" - web3-eth-accounts "1.8.1" - web3-eth-contract "1.8.1" - web3-eth-ens "1.8.1" - web3-eth-iban "1.8.1" - web3-eth-personal "1.8.1" - web3-net "1.8.1" - web3-utils "1.8.1" - -web3-net@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.7.4.tgz#3153dfd3423262dd6fbec7aae5467202c4cad431" - integrity sha512-d2Gj+DIARHvwIdmxFQ4PwAAXZVxYCR2lET0cxz4KXbE5Og3DNjJi+MoPkX+WqoUXqimu/EOd4Cd+7gefqVAFDg== - dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-utils "1.7.4" - -web3-net@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.8.1.tgz#2bed4d4b93166724129ec33d0e5dea98880285f4" - integrity sha512-LyEJAwogdFo0UAXZqoSJGFjopdt+kLw0P00FSZn2yszbgcoI7EwC+nXiOsEe12xz4LqpYLOtbR7+gxgiTVjjHQ== - dependencies: - web3-core "1.8.1" - web3-core-method "1.8.1" - web3-utils "1.8.1" - -web3-providers-http@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.7.4.tgz#8209cdcb115db5ccae1f550d1c4e3005e7538d02" - integrity sha512-AU+/S+49rcogUER99TlhW+UBMk0N2DxvN54CJ2pK7alc2TQ7+cprNPLHJu4KREe8ndV0fT6JtWUfOMyTvl+FRA== - dependencies: - web3-core-helpers "1.7.4" - xhr2-cookies "1.1.0" - -web3-providers-http@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.8.1.tgz#8aa89c11a9272f11ddb74b871273c92225faa28d" - integrity sha512-1Zyts4O9W/UNEPkp+jyL19Jc3D15S4yp8xuLTjVhcUEAlHo24NDWEKxtZGUuHk4HrKL2gp8OlsDbJ7MM+ESDgg== - dependencies: - abortcontroller-polyfill "^1.7.3" - cross-fetch "^3.1.4" - es6-promise "^4.2.8" - web3-core-helpers "1.8.1" - -web3-providers-ipc@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.7.4.tgz#02e85e99e48f432c9d34cee7d786c3685ec9fcfa" - integrity sha512-jhArOZ235dZy8fS8090t60nTxbd1ap92ibQw5xIrAQ9m7LcZKNfmLAQUVsD+3dTFvadRMi6z1vCO7zRi84gWHw== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.7.4" - -web3-providers-ipc@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.8.1.tgz#6128a3a3a824d06bf0efcfe86325401f8691a5ca" - integrity sha512-nw/W5nclvi+P2z2dYkLWReKLnocStflWqFl+qjtv0xn3MrUTyXMzSF0+61i77+16xFsTgzo4wS/NWIOVkR0EFA== - dependencies: - oboe "2.1.5" - web3-core-helpers "1.8.1" - -web3-providers-ws@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.7.4.tgz#6e60bcefb456f569a3e766e386d7807a96f90595" - integrity sha512-g72X77nrcHMFU8hRzQJzfgi/072n8dHwRCoTw+WQrGp+XCQ71fsk2qIu3Tp+nlp5BPn8bRudQbPblVm2uT4myQ== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.7.4" - websocket "^1.0.32" - -web3-providers-ws@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.8.1.tgz#5e5370e07eb8c615ed298ebc8602b283c7b7d649" - integrity sha512-TNefIDAMpdx57+YdWpYZ/xdofS0P+FfKaDYXhn24ie/tH9G+AB+UBSOKnjN0KSadcRSCMBwGPRiEmNHPavZdsA== - dependencies: - eventemitter3 "4.0.4" - web3-core-helpers "1.8.1" - websocket "^1.0.32" - -web3-shh@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.7.4.tgz#bee91cce2737c529fd347274010b548b6ea060f1" - integrity sha512-mlSZxSYcMkuMCxqhTYnZkUdahZ11h+bBv/8TlkXp/IHpEe4/Gg+KAbmfudakq3EzG/04z70XQmPgWcUPrsEJ+A== - dependencies: - web3-core "1.7.4" - web3-core-method "1.7.4" - web3-core-subscriptions "1.7.4" - web3-net "1.7.4" - -web3-shh@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.8.1.tgz#028a95cf9d3a36020380938b9a127610efbb9be7" - integrity sha512-sqHgarnfcY2Qt3PYS4R6YveHrDy7hmL09yeLLHHCI+RKirmjLVqV0rc5LJWUtlbYI+kDoa5gbgde489M9ZAC0g== - dependencies: - web3-core "1.8.1" - web3-core-method "1.8.1" - web3-core-subscriptions "1.8.1" - web3-net "1.8.1" - -web3-utils@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.7.4.tgz#eb6fa3706b058602747228234453811bbee017f5" - integrity sha512-acBdm6Evd0TEZRnChM/MCvGsMwYKmSh7OaUfNf5OKG0CIeGWD/6gqLOWIwmwSnre/2WrA1nKGId5uW2e5EfluA== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3-utils@1.8.1, web3-utils@^1.0.0-beta.31, web3-utils@^1.3.6: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.8.1.tgz#f2f7ca7eb65e6feb9f3d61056d0de6bbd57125ff" - integrity sha512-LgnM9p6V7rHHUGfpMZod+NST8cRfGzJ1BTXAyNo7A9cJX9LczBfSRxJp+U/GInYe9mby40t3v22AJdlELibnsQ== - dependencies: - bn.js "^5.2.1" - ethereum-bloom-filters "^1.0.6" - ethereumjs-util "^7.1.0" - ethjs-unit "0.1.6" - number-to-bn "1.7.0" - randombytes "^2.1.0" - utf8 "3.0.0" - -web3@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.7.4.tgz#00c9aef8e13ade92fd773d845fff250535828e93" - integrity sha512-iFGK5jO32vnXM/ASaJBaI0+gVR6uHozvYdxkdhaeOCD6HIQ4iIXadbO2atVpE9oc/H8l2MovJ4LtPhG7lIBN8A== - dependencies: - web3-bzz "1.7.4" - web3-core "1.7.4" - web3-eth "1.7.4" - web3-eth-personal "1.7.4" - web3-net "1.7.4" - web3-shh "1.7.4" - web3-utils "1.7.4" - -web3@^1.0.0-beta.34: - version "1.8.1" - resolved "https://registry.yarnpkg.com/web3/-/web3-1.8.1.tgz#8ea67215ef5f3a6f6d3381800b527242ea22885a" - integrity sha512-tAqFsQhGv340C9OgRJIuoScN7f7wa1tUvsnnDUMt9YE6J4gcm7TV2Uwv+KERnzvV+xgdeuULYpsioRRNKrUvoQ== - dependencies: - web3-bzz "1.8.1" - web3-core "1.8.1" - web3-eth "1.8.1" - web3-eth-personal "1.8.1" - web3-net "1.8.1" - web3-shh "1.8.1" - web3-utils "1.8.1" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -websocket@^1.0.32: - version "1.0.34" - resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.34.tgz#2bdc2602c08bf2c82253b730655c0ef7dcab3111" - integrity sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ== - dependencies: - bufferutil "^4.0.1" - debug "^2.2.0" - es5-ext "^0.10.50" - typedarray-to-buffer "^3.1.5" - utf-8-validate "^5.0.2" - yaeti "^0.0.6" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ== - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== - -which-typed-array@^1.1.2: - version "1.1.9" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" - integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@1.3.1, which@^1.1.1, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@2.0.2, which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wide-align@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -window-size@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.2.0.tgz#b4315bb4214a3d7058ebeee892e13fa24d98b075" - integrity sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw== - -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== - -wordwrapjs@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/wordwrapjs/-/wordwrapjs-4.0.1.tgz#d9790bccfb110a0fc7836b5ebce0937b37a8b98f" - integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA== - dependencies: - reduce-flatten "^2.0.0" - typical "^5.2.0" - -workerpool@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" - integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== - -workerpool@6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" - integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw== - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@7.4.6: - version "7.4.6" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" - integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== - -ws@^3.0.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" - integrity sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA== - dependencies: - async-limiter "~1.0.0" - safe-buffer "~5.1.0" - ultron "~1.1.0" - -ws@^7, ws@^7.4.6, ws@^7.5.5: - version "7.5.9" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -wsrun@^5.2.4: - version "5.2.4" - resolved "https://registry.yarnpkg.com/wsrun/-/wsrun-5.2.4.tgz#6eb6c3ccd3327721a8df073a5e3578fb0dea494e" - integrity sha512-akv3WtKBohdHsD/5uqhYRHw6GXeCXe87FsSg28Szq+2cpoqRW2SY4yPfm1D0za1cS6MgNy5hPgzS5SqYJaGUxg== - dependencies: - bluebird "^3.5.1" - chalk "^2.3.0" - glob "^7.1.2" - jest-changed-files "^24.9.0" - lodash "^4.17.4" - minimatch "^3.0.4" - split "^1.0.1" - throat "^4.1.0" - yargs "^13.0.0" - -xhr-request-promise@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" - integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== - dependencies: - xhr-request "^1.1.0" - -xhr-request@^1.0.1, xhr-request@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" - integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== - dependencies: - buffer-to-arraybuffer "^0.0.5" - object-assign "^4.1.1" - query-string "^5.0.1" - simple-get "^2.7.0" - timed-out "^4.0.1" - url-set-query "^1.0.0" - xhr "^2.0.4" - -xhr2-cookies@1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" - integrity sha512-hjXUA6q+jl/bd8ADHcVfFsSPIf+tyLIjuO9TwJC9WI6JP2zKcS7C+p56I9kCLLsaCiNT035iYvEUUzdEFj/8+g== - dependencies: - cookiejar "^2.1.1" - -xhr@^2.0.4, xhr@^2.3.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d" - integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA== - dependencies: - global "~4.4.0" - is-function "^1.0.1" - parse-headers "^2.0.0" - xtend "^4.0.0" - -xmlhttprequest@1.8.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" - integrity sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA== - -xtend@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ== - -y18n@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" - integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yaeti@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" - integrity sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@13.1.2, yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@^18.1.2: - version "18.1.3" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs-parser@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-2.4.1.tgz#85568de3cf150ff49fa51825f03a8c880ddcc5c4" - integrity sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA== - dependencies: - camelcase "^3.0.0" - lodash.assign "^4.0.6" - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-unparser@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-1.6.0.tgz#ef25c2c769ff6bd09e4b0f9d7c605fb27846ea9f" - integrity sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw== - dependencies: - flat "^4.1.0" - lodash "^4.17.15" - yargs "^13.3.0" - -yargs-unparser@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - -yargs@13.3.2, yargs@^13.0.0, yargs@^13.3.0: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - -yargs@16.2.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^15.0.2: - version "15.4.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" - integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== - dependencies: - cliui "^6.0.0" - decamelize "^1.2.0" - find-up "^4.1.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^4.2.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^18.1.2" - -yargs@^4.7.1: - version "4.8.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" - integrity sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA== - dependencies: - cliui "^3.2.0" - decamelize "^1.1.1" - get-caller-file "^1.0.1" - lodash.assign "^4.0.3" - os-locale "^1.4.0" - read-pkg-up "^1.0.1" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^1.0.1" - which-module "^1.0.0" - window-size "^0.2.0" - y18n "^3.2.1" - yargs-parser "^2.4.1" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -yoga-layout-prebuilt@^1.9.6: - version "1.10.0" - resolved "https://registry.yarnpkg.com/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6" - integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g== - dependencies: - "@types/yoga-layout" "1.9.2" From b2d9a2f4b5accc4ef3d226a27d190db9348b50b1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 Feb 2023 16:44:02 +0000 Subject: [PATCH 0231/1302] fix: display error on async callback to buildModule Due to typescript transpilation we can't check that the function passed into `buildModule` is async, instead we check whether the returned result is a promise or not. If we detect a promise being returned Ignition throws and relys on the general error handler for display in the UI. Fixes #138. --- .../process/generateDeploymentGraphFrom.ts | 15 ++++++++++++++ .../test/deploymentBuilder/buildModule.ts | 19 ++++++++++++++++++ .../hardhat-plugin/test/error-handling.ts | 20 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 packages/core/test/deploymentBuilder/buildModule.ts create mode 100644 packages/hardhat-plugin/test/error-handling.ts diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index 3c05208d38..d344e39ac2 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -5,6 +5,7 @@ import type { } from "types/deploymentGraph"; import { FutureDict } from "types/future"; import { Module, ModuleDict } from "types/module"; +import { IgnitionError } from "utils/errors"; export function generateDeploymentGraphFrom( ignitionModule: Module, @@ -14,5 +15,19 @@ export function generateDeploymentGraphFrom( const moduleOutputs = ignitionModule.action(graphBuilder); + if (isPromise(moduleOutputs)) { + throw new IgnitionError( + `The callback passed to 'buildModule' for ${ignitionModule.name} returns a Promise; async callbacks are not allowed in 'buildModule'.` + ); + } + return { graph: graphBuilder.graph, moduleOutputs }; } + +function isPromise(promise: any) { + return ( + promise && + typeof promise.then === "function" && + promise[Symbol.toStringTag] === "Promise" + ); +} diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts new file mode 100644 index 0000000000..dc73c2ddde --- /dev/null +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -0,0 +1,19 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; + +describe("deployment builder - buildModule", () => { + it("should throw if build module is given an async callback", () => { + assert.throws(() => { + const badAsyncModule = buildModule("BadAsyncModule", (async () => { + return {}; + }) as any); + + return generateDeploymentGraphFrom(badAsyncModule, { + chainId: 31337, + }); + }, /The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./); + }); +}); diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts new file mode 100644 index 0000000000..db9d4656b8 --- /dev/null +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -0,0 +1,20 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { deployModule } from "./helpers"; +import { useEnvironment } from "./useEnvironment"; + +describe("module error handling", () => { + useEnvironment("minimal"); + + it("should error on passing async callback", async function () { + const promise = deployModule(this.hre, (async () => { + return {}; + }) as any); + + return assert.isRejected( + promise, + /The callback passed to 'buildModule' for MyModule returns a Promise; async callbacks are not allowed in 'buildModule'./ + ); + }); +}); From 3fecf245eeed1608e28e0ffc2eb495d30e36de15 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 10 Feb 2023 10:38:59 +0000 Subject: [PATCH 0232/1302] test: check rethrow of exceptions in modules Add tests that ensure that exceptions thrown in the body of a module are rethrown and shown on the cli. --- packages/core/test/deploymentBuilder/buildModule.ts | 12 ++++++++++++ packages/hardhat-plugin/test/error-handling.ts | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index dc73c2ddde..a0dfd5dc11 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -16,4 +16,16 @@ describe("deployment builder - buildModule", () => { }); }, /The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./); }); + + it("should throw if build module throws an exception", () => { + assert.throws(() => { + const badAsyncModule = buildModule("BadAsyncModule", () => { + throw new Error("User thrown error"); + }); + + return generateDeploymentGraphFrom(badAsyncModule, { + chainId: 31337, + }); + }, /User thrown error/); + }); }); diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts index db9d4656b8..5f5dd581c3 100644 --- a/packages/hardhat-plugin/test/error-handling.ts +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -17,4 +17,12 @@ describe("module error handling", () => { /The callback passed to 'buildModule' for MyModule returns a Promise; async callbacks are not allowed in 'buildModule'./ ); }); + + it("should error on module throwing an exception", async function () { + const promise = deployModule(this.hre, () => { + throw new Error("User thrown error"); + }); + + return assert.isRejected(promise, /User thrown error/); + }); }); From da7c2438de1523f27e5a64e75c2f70420ffe8bb8 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 24 Jan 2023 06:06:22 -0500 Subject: [PATCH 0233/1302] default to no for deploy confirmation --- packages/hardhat-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 74f5c3c728..d81aa8d47c 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -104,7 +104,7 @@ task("deploy") message: `Confirm deploy to network ${hre.network.name} (${Number( chainId )})?`, - initial: true, + initial: false, }); if (!prompt.networkConfirmation) { From afa18909aababc6de3ad97e75064de3a6a1f78b8 Mon Sep 17 00:00:00 2001 From: morgansliman Date: Tue, 24 Jan 2023 08:20:02 -0500 Subject: [PATCH 0234/1302] change all thrown errors to IgnitionError --- packages/core/src/Ignition.ts | 4 ++-- packages/core/src/deployment/Deployment.ts | 3 ++- packages/core/src/deployment/utils.ts | 3 ++- packages/core/src/dsl/DeploymentBuilder.ts | 10 +++++----- .../core/src/execution/dispatch/executionDispatch.ts | 3 ++- packages/core/src/execution/dispatch/utils.ts | 9 ++++++--- packages/core/src/execution/execute.ts | 4 +++- packages/core/src/graph/adjacencyList.ts | 3 ++- packages/core/src/graph/visit.ts | 3 ++- .../convertDeploymentVertexToExecutionVertex.ts | 11 ++++++----- packages/core/src/services/ContractsService.ts | 7 +++++-- packages/core/src/utils/guards.ts | 4 +++- packages/core/src/utils/serialize.ts | 10 +++++++--- packages/core/src/validation/dispatch/helpers.ts | 12 ++++++------ packages/core/test/deploymentBuilder/parameters.ts | 3 ++- packages/core/test/deploymentBuilder/useSubgraph.ts | 3 ++- packages/core/test/helpers.ts | 9 +++++---- packages/hardhat-plugin/src/ConfigWrapper.ts | 5 +++-- packages/hardhat-plugin/src/plan/utils.ts | 8 ++++++-- .../src/ui/components/execution/BatchExecution.tsx | 6 +++--- .../src/ui/components/execution/FinalStatus.tsx | 3 ++- packages/hardhat-plugin/src/ui/renderToCli.tsx | 3 ++- packages/hardhat-plugin/src/ui/types.ts | 3 ++- packages/hardhat-plugin/test/helpers.ts | 2 +- 24 files changed, 81 insertions(+), 50 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index f89a1dc8a8..eef0c82f18 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -152,7 +152,7 @@ export class Ignition { ); if (validationResult._kind === "failure") { - throw new Error(validationResult.failures[0]); + throw new IgnitionError(validationResult.failures[0]); } const transformResult = await transformDeploymentGraphToExecutionGraph( @@ -161,7 +161,7 @@ export class Ignition { ); if (transformResult._kind === "failure") { - throw new Error(transformResult.failures[0]); + throw new IgnitionError(transformResult.failures[0]); } const { executionGraph } = transformResult; diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index dc41164862..1d46943b73 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -14,6 +14,7 @@ import { VertexVisitResultFailure, } from "types/graph"; import { ICommandJournal } from "types/journal"; +import { IgnitionError } from "utils/errors"; import { initializeDeployState, @@ -163,7 +164,7 @@ export class Deployment { const executionGraph = this.state.transform.executionGraph; if (executionGraph === null) { - throw new Error("Cannot read from unset execution graph"); + throw new IgnitionError("Cannot read from unset execution graph"); } return [...Object.entries(this.state.execution.vertexes)] diff --git a/packages/core/src/deployment/utils.ts b/packages/core/src/deployment/utils.ts index a937de35c6..87c2f00ed4 100644 --- a/packages/core/src/deployment/utils.ts +++ b/packages/core/src/deployment/utils.ts @@ -4,6 +4,7 @@ import type { DeployStateExecutionCommand, } from "types/deployment"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; export function isDeployStateExecutionCommand( command: DeployStateCommand @@ -16,7 +17,7 @@ export function isDeployStateExecutionCommand( } export function assertNeverMessageType(action: never) { - throw new Error(`Unexpected message type ${action}`); + throw new IgnitionError(`Unexpected message type ${action}`); } export function viewExecutionResults( diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 4e11f400d8..755c82b1de 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -263,7 +263,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { scopeData.parameters === undefined || !(parameter.label in scopeData.parameters) ) { - throw new Error("Could not resolve contract from parameter"); + throw new IgnitionError("Could not resolve contract from parameter"); } contract = scopeData.parameters[parameter.label] as @@ -273,7 +273,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { } else if (isCallable(contractFuture)) { contract = contractFuture; } else { - throw new Error( + throw new IgnitionError( `Not a callable future ${contractFuture.label} (${contractFuture.type})` ); } @@ -315,7 +315,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ) { const future = artifactFuture as any; - throw new Error( + throw new IgnitionError( `Not an artifact future ${future.label} (${future.type})` ); } @@ -372,13 +372,13 @@ export class DeploymentBuilder implements IDeploymentBuilder { scopeData.parameters === undefined || !(parameter.label in scopeData.parameters) ) { - throw new Error("Could not resolve contract from parameter"); + throw new IgnitionError("Could not resolve contract from parameter"); } address = scopeData.parameters[parameter.label] as ContractFuture; } else { if (sendTo.subtype !== "address") { - throw new Error( + throw new IgnitionError( `Event param "${sendTo.label}" is type "${sendTo.subtype}" but must be type "address"` ); } diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 57ee942827..772c9a9267 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,6 +1,7 @@ import { ExecutionContext } from "types/deployment"; import { ExecutionVertex } from "types/executionGraph"; import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { IgnitionError } from "utils/errors"; import { executeAwaitedEvent } from "./executeAwaitedEvent"; import { executeContractCall } from "./executeContractCall"; @@ -41,5 +42,5 @@ function assertUnknownExecutionVertexType(executionVertex: never): never { const forReport = "type" in vertex ? vertex.type : vertex; - throw new Error(`Unknown execution vertex type: ${forReport}`); + throw new IgnitionError(`Unknown execution vertex type: ${forReport}`); } diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index c0e9e50241..a73f7d9dc8 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,5 +1,6 @@ import { ArgValue } from "types/executionGraph"; import { ResultsAccumulator } from "types/graph"; +import { IgnitionError } from "utils/errors"; import { isDependable, isEventParam, isProxy } from "utils/guards"; export function toAddress(v: any) { @@ -26,17 +27,19 @@ function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { const entry = context.get(arg.vertexId); if (!entry) { - throw new Error(`No context entry for ${arg.vertexId} (${arg.label})`); + throw new IgnitionError( + `No context entry for ${arg.vertexId} (${arg.label})` + ); } if (entry._kind === "failure") { - throw new Error( + throw new IgnitionError( `Looking up context on a failed vertex - violation of constraint` ); } if (entry._kind === "hold") { - throw new Error( + throw new IgnitionError( `Looking up context on a on hold - violation of constraint` ); } diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 749972deee..6b0f1d4e7c 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -125,7 +125,9 @@ async function executeBatch( .filter((v): v is ExecutionVertex => v !== undefined); if (batchVertexes.length !== batch.length) { - throw new Error("Unable to retrieve all vertexes while executing batch"); + throw new IgnitionError( + "Unable to retrieve all vertexes while executing batch" + ); } const promises = batchVertexes.map(async (vertex) => { diff --git a/packages/core/src/graph/adjacencyList.ts b/packages/core/src/graph/adjacencyList.ts index 72c18b4430..c1f7de06f0 100644 --- a/packages/core/src/graph/adjacencyList.ts +++ b/packages/core/src/graph/adjacencyList.ts @@ -1,6 +1,7 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; import { AdjacencyList } from "types/graph"; +import { IgnitionError } from "utils/errors"; export function constructEmptyAdjacencyList(): AdjacencyList { return new Map>(); @@ -84,7 +85,7 @@ export function eliminate( const toSet = updatedList.get(dependency); if (toSet === undefined) { - throw new Error("Dependency sets should be defined"); + throw new IgnitionError("Dependency sets should be defined"); } const setWithoutV = new Set([...toSet].filter((n) => n !== v)); diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 03e37f7402..04e6a28097 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -4,6 +4,7 @@ import { VertexVisitResult, VisitResult, } from "types/graph"; +import { IgnitionError } from "utils/errors"; export async function visit( phase: "Execution" | "Validation", @@ -22,7 +23,7 @@ export async function visit( const vertex = graph.vertexes.get(vertexId); if (vertex === undefined) { - throw new Error(`Could not get vertex ${vertexId}`); + throw new IgnitionError(`Could not get vertex ${vertexId}`); } const vertexVisitResult = await vistitorAction( diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index be4942ad23..731190dbb8 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -29,6 +29,7 @@ import { EventParamFuture, } from "types/future"; import { Artifact } from "types/hardhat"; +import { IgnitionError } from "utils/errors"; import { isBytesArg, isFuture } from "utils/guards"; interface TransformContext { @@ -69,7 +70,7 @@ export function convertDeploymentVertexToExecutionVertex( case "SendETH": return convertSendToSentETH(deploymentVertex, context); case "Virtual": - throw new Error( + throw new IgnitionError( `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` ); default: @@ -215,7 +216,7 @@ function assertDeploymentVertexNotExpected( const obj = typeof v === "object" && "type" in v ? v.type : v; - throw new Error(`Type not expected: ${obj}`); + throw new IgnitionError(`Type not expected: ${obj}`); } async function convertArgs( @@ -278,11 +279,11 @@ async function resolveParameter( if (hasParamResult.found === false) { switch (hasParamResult.errorCode) { case "no-params": - throw new Error( + throw new IgnitionError( `No parameters object provided to deploy options, but module requires parameter "${arg.label}"` ); case "param-missing": - throw new Error(`No parameter provided for "${arg.label}"`); + throw new IgnitionError(`No parameter provided for "${arg.label}"`); default: assertNeverParamResult(hasParamResult.errorCode); } @@ -301,5 +302,5 @@ async function resolveBytesForArtifact( } function assertNeverParamResult(hasParamResult: never) { - throw new Error(`Unexpected error code ${hasParamResult}`); + throw new IgnitionError(`Unexpected error code ${hasParamResult}`); } diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 6e6e0c82a9..41d520bc2b 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -7,6 +7,7 @@ import { SignersProvider, TransactionsProvider, } from "types/providers"; +import { IgnitionError } from "utils/errors"; import { sleep } from "utils/sleep"; import { TxSender } from "utils/tx-sender"; @@ -79,7 +80,9 @@ export class ContractsService implements IContractsService { if (blockNumberWhenSent + 5 <= currentBlockNumber) { if (retries === txOptions.maxRetries) { - throw new Error("Transaction not confirmed within max retry limit"); + throw new IgnitionError( + "Transaction not confirmed within max retry limit" + ); } const txToSend = await this._bump( @@ -162,7 +165,7 @@ export class ContractsService implements IContractsService { }; } - throw new Error( + throw new IgnitionError( `Transaction doesn't have gasPrice or maxFeePerGas/maxPriorityFeePerGas` ); } diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 1b84f72657..2e47e08680 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -25,6 +25,8 @@ import type { } from "types/future"; import { Artifact } from "types/hardhat"; +import { IgnitionError } from "./errors"; + export function isArtifact(artifact: any): artifact is Artifact { return ( artifact !== null && @@ -151,5 +153,5 @@ export function assertUnknownDeploymentVertexType( const forReport = "type" in vertex ? vertex.type : vertex; - throw new Error(`Unknown deployment vertex type: ${forReport}`); + throw new IgnitionError(`Unknown deployment vertex type: ${forReport}`); } diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index d07768f131..74874cbdc6 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -2,6 +2,8 @@ import { serializeError } from "serialize-error"; import { FutureOutput, SerializedFutureResult } from "types/serialization"; +import { IgnitionError } from "./errors"; + export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { if (typeof x === "string") { return { _kind: "string" as const, value: x }; @@ -16,16 +18,18 @@ export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { } const exhaustiveCheck: never = x; - throw new Error(`Unexpected serialization type ${exhaustiveCheck}`); + throw new IgnitionError(`Unexpected serialization type ${exhaustiveCheck}`); } export function deserializeFutureOutput(x: any) { if (x === null || x === undefined) { - throw new Error("[deserializeFutureOutput] value is null or undefined"); + throw new IgnitionError( + "[deserializeFutureOutput] value is null or undefined" + ); } if (!("_kind" in x)) { - throw new Error( + throw new IgnitionError( "[deserializeFutureOutput] value was not serialized by Ignition" ); } diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 73bce18bad..369d3a36d1 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -2,7 +2,7 @@ import type { Services } from "services/types"; import { InternalParamValue } from "types/deploymentGraph"; import type { CallableFuture } from "types/future"; import { VertexVisitResultFailure } from "types/graph"; -import { InvalidArtifactError } from "utils/errors"; +import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isBytesArg } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; @@ -40,13 +40,13 @@ export async function resolveArtifactForCallableFuture( return assertNeverDeploymentFuture(future); } case "virtual": - throw new Error(`Cannot call virtual future`); + throw new IgnitionError(`Cannot call virtual future`); case "call": - throw new Error(`Cannot call call future`); + throw new IgnitionError(`Cannot call call future`); case "await": - throw new Error(`Cannot call await future`); + throw new IgnitionError(`Cannot call await future`); case "send": - throw new Error(`Cannot call send future`); + throw new IgnitionError(`Cannot call send future`); default: return assertNeverDeploymentFuture(future); } @@ -75,7 +75,7 @@ export async function validateBytesForArtifact( } function assertNeverDeploymentFuture(f: never): undefined { - throw new Error( + throw new IgnitionError( `Unexpected deployment future type/subtype ${JSON.stringify(f)}` ); } diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index b17bde2b3b..15f470a2e5 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -8,6 +8,7 @@ import type { IDeploymentGraph, IDeploymentBuilder, } from "types/deploymentGraph"; +import { IgnitionError } from "utils/errors"; import { isCallable } from "utils/guards"; describe("deployment builder - parameters", function () { @@ -33,7 +34,7 @@ describe("deployment builder - parameters", function () { }); if (!isCallable(token)) { - throw new Error("Not callable"); + throw new IgnitionError("Not callable"); } return { token }; diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts index 06b498ba50..48f3600f00 100644 --- a/packages/core/test/deploymentBuilder/useSubgraph.ts +++ b/packages/core/test/deploymentBuilder/useSubgraph.ts @@ -8,6 +8,7 @@ import type { IDeploymentGraph, IDeploymentBuilder, } from "types/deploymentGraph"; +import { IgnitionError } from "utils/errors"; import { isCallable } from "utils/guards"; import { @@ -37,7 +38,7 @@ describe("deployment builder - useSubgraph", () => { }); if (!isCallable(bar)) { - throw new Error("Not callable"); + throw new IgnitionError("Not callable"); } return { foo, bar }; diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index defe5599c7..0b0605a877 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -8,6 +8,7 @@ import { ITransactionsService } from "services/TransactionsService"; import { Services, TransactionOptions } from "services/types"; import { Artifact } from "types/hardhat"; import { HasParamResult } from "types/providers"; +import { IgnitionError } from "utils/errors"; export function getMockServices() { const mockServices: Services = { @@ -50,7 +51,7 @@ class MockArtifactsService implements IArtifactsService { } public getArtifact(_name: string): Promise { - throw new Error("Method not implemented."); + throw new IgnitionError("Method not implemented."); } } @@ -63,16 +64,16 @@ class MockTransactionService implements ITransactionsService { _filter: ethers.EventFilter, _durationMs: number ): Promise { - throw new Error("Method not implemented."); + throw new IgnitionError("Method not implemented."); } } class MockConfigService implements IConfigService { public getParam(_paramName: string): Promise { - throw new Error("Method not implemented."); + throw new IgnitionError("Method not implemented."); } public hasParam(_paramName: string): Promise { - throw new Error("Method not implemented."); + throw new IgnitionError("Method not implemented."); } } diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 2c99e84ca2..3c49474de2 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -1,8 +1,9 @@ -import type { +import { ConfigProvider, ExternalParamValue, HasParamResult, ModuleParams, + IgnitionError, } from "@ignored/ignition-core"; export class ConfigWrapper implements ConfigProvider { @@ -18,7 +19,7 @@ export class ConfigWrapper implements ConfigProvider { public async getParam(paramName: string): Promise { if (this.parameters === undefined) { - throw new Error( + throw new IgnitionError( `No parameters object provided to deploy options, but module/subgraph requires parameter "${paramName}"` ); } diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index a8e5f3a085..6640af3883 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,4 +1,8 @@ -import type { VertexGraph, VertexDescriptor } from "@ignored/ignition-core"; +import { + VertexGraph, + VertexDescriptor, + IgnitionError, +} from "@ignored/ignition-core"; export function parseType(v: VertexDescriptor): string { let type: string; @@ -17,7 +21,7 @@ export function parseType(v: VertexDescriptor): string { type = "event"; break; default: - throw new Error(`Unknown vertex type: ${v.type}`); + throw new IgnitionError(`Unknown vertex type: ${v.type}`); } return type; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index b4338de0ac..dc23516db4 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState, IgnitionError } from "@ignored/ignition-core"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; @@ -211,9 +211,9 @@ const determineStatusOf = ( return "COMPELETED"; } - throw new Error(`Unable to determine vertex status for ${vertexId}`); + throw new IgnitionError(`Unable to determine vertex status for ${vertexId}`); }; function assertNeverVertexStatus(status: never): any { - throw new Error(`Unexpected vertex status ${status}`); + throw new IgnitionError(`Unexpected vertex status ${status}`); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index a9c9de3d5d..1c4639e2e1 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -2,6 +2,7 @@ import { DeployState, ExecutionVertex, viewExecutionResults, + IgnitionError, } from "@ignored/ignition-core"; import { Box, Text } from "ink"; @@ -195,7 +196,7 @@ const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { }; function assertNeverUiVertexType(vertex: never): string { - throw new Error(`Unexpected ui vertex type ${vertex}`); + throw new IgnitionError(`Unexpected ui vertex type ${vertex}`); } const DepError = ({ diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index 8f5a943683..bbd35caf5a 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -2,6 +2,7 @@ import { DeployState, ModuleParams, UpdateUiAction, + IgnitionError, } from "@ignored/ignition-core"; import { render } from "ink"; @@ -54,7 +55,7 @@ export function unmountCli(state: RenderState): Promise { state.waitUntilExit === null || state.clear === null ) { - throw new Error("Cannot unmount with no unmount function"); + throw new IgnitionError("Cannot unmount with no unmount function"); } state.clear(); diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 19efc92d19..1c339f675d 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -3,6 +3,7 @@ import { ExecutionVertex, ExecutionVertexType, VertexVisitResultFailure, + IgnitionError, } from "@ignored/ignition-core"; interface VertexSuccess { @@ -193,5 +194,5 @@ export interface AddressMap { } function assertNeverUiVertexType(type: never): string { - throw new Error(`Unexpected ui vertex type ${type}`); + throw new IgnitionError(`Unexpected ui vertex type ${type}`); } diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 7af7f610ec..349d58e287 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -219,5 +219,5 @@ export async function deployModule( } function assertNeverFutureResult(expectedFutureResult: never) { - throw new Error(`Unextectped future result ${expectedFutureResult}`); + throw new Error(`Unexpected future result ${expectedFutureResult}`); } From f8a71f34c0eb7bce2d3d15c71fd512e6383b4a3d Mon Sep 17 00:00:00 2001 From: morgansliman Date: Thu, 9 Feb 2023 00:13:50 -0500 Subject: [PATCH 0235/1302] add eslint rule for hardhat plugin errors --- config/eslint/.eslintrc.js | 8 +++++++- packages/core/package.json | 1 + packages/core/src/utils/errors.ts | 6 +++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/config/eslint/.eslintrc.js b/config/eslint/.eslintrc.js index 1e49c764cb..5f7910024d 100644 --- a/config/eslint/.eslintrc.js +++ b/config/eslint/.eslintrc.js @@ -20,8 +20,14 @@ module.exports = { project: "./tsconfig.json", tsConfigRootDir: "./", }, - plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], + plugins: [ + "@nomiclabs/eslint-plugin-hardhat-internal-rules", + "eslint-plugin-import", + "@typescript-eslint", + "mocha", + ], rules: { + "@nomiclabs/only-hardhat-error": "off", "import/no-unused-modules": [ 1, { unusedExports: true, missingExports: true }, diff --git a/packages/core/package.json b/packages/core/package.json index 1bc159c126..9c688e1212 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -35,6 +35,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 1020e9b7bb..98830932b5 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,13 +1,13 @@ import { BigNumber } from "ethers"; -import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { HardhatPluginError } from "hardhat/plugins"; -export class InvalidArtifactError extends NomicLabsHardhatPluginError { +export class InvalidArtifactError extends HardhatPluginError { constructor(name: string) { super("ignition", `Artifact with name '${name}' doesn't exist`); } } -export class IgnitionError extends NomicLabsHardhatPluginError { +export class IgnitionError extends HardhatPluginError { constructor(message: string) { super("ignition", message); } From 195c7bd8b2e1fd9abe75ceac0f551006d4fe2e93 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 16 Feb 2023 10:49:38 +0000 Subject: [PATCH 0236/1302] chore: bump version to v0.0.8 Update the packages versions and changelogs for the `0.0.8 - 2023-02-16` release. --- .github/workflows/ci.yml | 12 +- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/multisig/package.json | 2 +- examples/sample/package.json | 2 +- examples/uniswap/package.json | 2 +- package-lock.json | 176 ++++++++++++++++++++------- package.json | 4 +- packages/core/CHANGELOG.md | 10 ++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 15 +++ packages/hardhat-plugin/package.json | 4 +- 12 files changed, 174 insertions(+), 59 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f669c6c8e7..db2ef801cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,8 +17,8 @@ jobs: with: node-version: 14 cache: npm - - name: npm 7 - run: npm i -g npm@7 + - name: npm latest + run: npm i -g npm@8 && npm i -g npm@latest - name: Install run: npm install - name: Build @@ -41,8 +41,8 @@ jobs: with: node-version: 14 cache: npm - - name: npm 7 - run: npm i -g npm@7 + - name: npm latest + run: npm i -g npm - name: Install run: npm install - name: Build @@ -68,8 +68,8 @@ jobs: with: node-version: ${{ matrix.node }} cache: npm - - name: npm 7 - run: npm i -g npm@7 + - name: npm latest + run: npm i -g npm - name: Install run: npm install - name: Build diff --git a/examples/create2/package.json b/examples/create2/package.json index 48e988847a..f2ce5e51b5 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.7" + "@ignored/hardhat-ignition": "^0.0.8" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 1cef156624..a914bf7fed 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 883d6eaff9..e6b4f8d031 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index 66d2160bde..fad4e391cc 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index b83213fdc2..d82d91e8dc 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/package-lock.json b/package-lock.json index e7966d5d8f..3da8adeaef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "hardhat": "^2.10.0" } }, @@ -53,7 +53,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -88,7 +88,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -120,7 +120,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -162,7 +162,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.7", + "@ignored/hardhat-ignition": "^0.0.8", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -3990,9 +3990,9 @@ "dev": true }, "node_modules/@types/trusted-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz", - "integrity": "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, "node_modules/@types/yargs": { @@ -5297,9 +5297,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001451", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001451.tgz", - "integrity": "sha512-XY7UbUpGRatZzoRft//5xOa69/1iGJRBlrieH6QYrkKLIFn3m7OVEJ81dSrKoy2BnKsdbX5cLrOispZNYo9v2w==", + "version": "1.0.30001453", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001453.tgz", + "integrity": "sha512-R9o/uySW38VViaTrOtwfbFEiBFUh7ST3uIG4OEymIG3/uKdHDO4xk/FaqfUw0d+irSUyFPy3dZszf9VvSTPnsA==", "dev": true, "funding": [ { @@ -6018,6 +6018,15 @@ "node": ">= 0.10" } }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -6137,6 +6146,58 @@ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "devOptional": true }, + "node_modules/cytoscape": { + "version": "3.23.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.23.0.tgz", + "integrity": "sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==", + "dev": true, + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true + }, "node_modules/d": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", @@ -6548,12 +6609,12 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", - "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.8.tgz", + "integrity": "sha512-eykdoYQ4FwCJinEYS0gPL2f2w+BPbSLvnQSJ3Ye1vAoPjdkq6xIMKBv+UkICd3qZE26wBKIn3p+6n0QC7R1LyA==", "dev": true, "dependencies": { - "d3": "^7.7.0", + "d3": "^7.8.2", "lodash-es": "^4.17.21" } }, @@ -6695,9 +6756,9 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", @@ -6865,9 +6926,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", "dev": true }, "node_modules/domutils": { @@ -6914,9 +6975,15 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.294", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.294.tgz", - "integrity": "sha512-PuHZB3jEN7D8WPPjLmBQAsqQz8tWHlkkB4n0E2OYw8RwVdmBYV0Wn+rUFH8JqYyIRb4HQhhedgxlZL163wqLrQ==", + "version": "1.4.299", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.299.tgz", + "integrity": "sha512-lQ7ijJghH6pCGbfWXr6EY+KYCMaRSjgsY925r1p/TlpSfVM1VjHTcn1gAc15VM4uwti283X6QtjPTXdpoSGiZQ==", + "dev": true + }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", "dev": true }, "node_modules/elliptic": { @@ -8010,9 +8077,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.1.tgz", + "integrity": "sha512-3ZggxvMv5EEY1ssUVyHSVt0oPreyBfbUi1XikJVfjFiBeBDLdrb0IWoDiEwqT/2sUQi0TGaWtFhOGDD8RTpXgQ==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -11759,6 +11826,12 @@ "node": ">=6" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true + }, "node_modules/lcid": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", @@ -12092,20 +12165,25 @@ } }, "node_modules/mermaid": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", - "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.0.tgz", + "integrity": "sha512-4PWbOND7CNRbjHrdG3WUUGBreKAFVnMhdlPjttuUkeHbCQmAHkwzSh5dGwbrKmXGRaR4uTvfFVYzUcg++h0DkA==", "dev": true, "dependencies": { "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", "d3": "^7.0.0", - "dagre-d3-es": "7.0.6", - "dompurify": "2.4.1", + "dagre-d3-es": "7.0.8", + "dompurify": "2.4.3", + "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", - "moment-mini": "^2.24.0", + "moment": "^2.29.4", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", "uuid": "^9.0.0" } }, @@ -12479,11 +12557,14 @@ "node": ">=10" } }, - "node_modules/moment-mini": { + "node_modules/moment": { "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", - "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==", - "dev": true + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } }, "node_modules/ms": { "version": "2.1.2", @@ -16680,6 +16761,15 @@ "write-markdown": "dist/write-markdown.js" } }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, + "engines": { + "node": ">=6.10" + } + }, "node_modules/ts-essentials": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", @@ -17057,9 +17147,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.18.0.tgz", - "integrity": "sha512-1iVwbhonhFytNdg0P4PqyIAXbdlVZVebtPDvuM36m66mRw4OGrCm2MYynJv/UENFLdP13J1nPVQzVE2zTs1OeA==", + "version": "5.19.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", + "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", "dependencies": { "busboy": "^1.6.0" }, @@ -18289,7 +18379,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -18366,7 +18456,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -18380,7 +18470,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.7", + "@ignored/ignition-core": "^0.0.8", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", diff --git a/package.json b/package.json index e7cfd37eee..89e422022d 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,6 @@ "clean": "wsrun --exclude-missing --serial clean" }, "devDependencies": { - "wsrun": "^5.2.4", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "eslint": "^7.32.0", @@ -35,6 +34,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "prettier": "2.4.1", - "typescript": "^4.7.4" + "typescript": "^4.7.4", + "wsrun": "^5.2.4" } } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2b3650a34e..1757f637ab 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.8 - 2023-02-16 + +### Changed + +- Rename config option `gasIncrementPerRetry` to `gasPriceIncrementPerRetry` for clarity ([#143](https://github.com/NomicFoundation/ignition/pull/143)) + +### Fixed + +- Ban passing async functions to `buildModule` ([#138](https://github.com/NomicFoundation/ignition/issues/138)) + ## 0.0.7 - 2023-01-31 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 1bc159c126..41c6ebe79c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index ab5801709f..bebe0f4ddf 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.8 - 2023-02-16 + +### Added + +- Allow file paths to ignition modules on cli to support cli completions for file discovery ([#102](https://github.com/NomicFoundation/ignition/issues/102)) + +### Changed + +- Rename config option `gasIncrementPerRetry` to `gasPriceIncrementPerRetry` for clarity ([#143](https://github.com/NomicFoundation/ignition/pull/143)) + +### Fixed + +- Improve error messages display during module validation ([#141](https://github.com/NomicFoundation/ignition/issues/141)) +- Ban passing async functions to `buildModule` ([#138](https://github.com/NomicFoundation/ignition/issues/138)) + ## 0.0.7 - 2023-01-31 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 83d5adff91..a76c2feaf7 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.7", + "version": "0.0.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.7", + "@ignored/ignition-core": "^0.0.8", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", From ba218a52a501731f003cd1382fdf9544d9422518 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 21 Feb 2023 17:00:47 -0500 Subject: [PATCH 0237/1302] setup the eslint rule --- config/eslint/.eslintrc.js | 1 - package-lock.json | 7 +++++++ packages/core/.eslintrc.js | 1 + packages/core/package.json | 2 +- packages/core/test/.eslintrc.js | 1 + 5 files changed, 10 insertions(+), 2 deletions(-) diff --git a/config/eslint/.eslintrc.js b/config/eslint/.eslintrc.js index 5f7910024d..7c014f53ac 100644 --- a/config/eslint/.eslintrc.js +++ b/config/eslint/.eslintrc.js @@ -27,7 +27,6 @@ module.exports = { "mocha", ], rules: { - "@nomiclabs/only-hardhat-error": "off", "import/no-unused-modules": [ 1, { unusedExports: true, missingExports: true }, diff --git a/package-lock.json b/package-lock.json index e7966d5d8f..9769b2df0f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2499,6 +2499,12 @@ "node": ">= 10" } }, + "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", + "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", + "dev": true + }, "node_modules/@nomiclabs/hardhat-ethers": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", @@ -18302,6 +18308,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 3367c1761f..e63cd1aa4d 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -8,6 +8,7 @@ module.exports = { createDefaultProgram: true, }, rules: { + "@nomiclabs/hardhat-internal-rules/only-hardhat-plugin-error": "error", "no-console": "error", }, ignorePatterns: ["post-build.js"], diff --git a/packages/core/package.json b/packages/core/package.json index 9c688e1212..82c85a477b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -35,7 +35,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.1", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", diff --git a/packages/core/test/.eslintrc.js b/packages/core/test/.eslintrc.js index 757fe8a3ca..bf6d9e6e4c 100644 --- a/packages/core/test/.eslintrc.js +++ b/packages/core/test/.eslintrc.js @@ -5,6 +5,7 @@ module.exports = { sourceType: "module", }, rules: { + "@nomiclabs/hardhat-internal-rules/only-hardhat-plugin-error": "off", "import/no-extraneous-dependencies": [ "error", { From 5ffe1d48f235fd318da457f6f57bc749a427df02 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 21 Feb 2023 10:06:16 +0000 Subject: [PATCH 0238/1302] feat: force flag on deploy Support `--force` on deploy to ignore previous deployment runs and start again as if from a clean deployment. The history in the journal is kept but each action in the execution graph will be executed. Resolves #132. --- .vscode/launch.json | 2 +- docs/getting-started-guide.md | 2 +- docs/running-a-deployment.md | 6 +++++ package-lock.json | 2 +- packages/core/package.json | 4 ++-- packages/core/src/Ignition.ts | 2 ++ packages/core/src/deployment/Deployment.ts | 3 ++- .../core/src/deployment/deployStateReducer.ts | 8 ++++--- packages/core/src/execution/execute.ts | 2 +- packages/core/src/types/deployment.ts | 2 ++ packages/core/test/execution/rerun.ts | 23 +++++++++++++++++++ packages/core/test/state-reducer/execution.ts | 7 ++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 15 ++++++++---- packages/hardhat-plugin/src/index.ts | 5 +++- .../hardhat-plugin/test/CommandJournal.ts | 4 ++-- 15 files changed, 69 insertions(+), 18 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index a03d1bcfdc..e38abcc635 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -22,7 +22,7 @@ { "name": "Debug core tests", "internalConsoleOptions": "openOnSessionStart", - "program": "${workspaceFolder}/packages/core/node_modules/mocha/bin/_mocha", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], "type": "node", diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index f108ba9fa7..0b0ecd6654 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -38,7 +38,7 @@ $ npx hardhat Add **Ignition** to your **Hardhat** project by installing the plugin: ```bash -npm install @ignored/hardhat-ignition +npm install --save-dev @ignored/hardhat-ignition ``` Modify your `hardhat.config.js` file, to include **Ignition**: diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 6c630f4b8b..cc5df8427b 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -117,4 +117,10 @@ Each run logs its events to a journal file (recorded in a sibling file to the mo > **NOTE**: Changes to modules between runs of a deployment are not currently supported +To start a deployment again, ignoring the state from previous runs and rerunning the entirety of the module, the force flag can be used: + +``` +npx hardhat deploy MyModule.js --network localhost --force +``` + For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. diff --git a/package-lock.json b/package-lock.json index 1559b240a2..1f7cce82f5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18403,7 +18403,7 @@ "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", - "@types/mocha": "^9.0.0", + "@types/mocha": "9.1.1", "@types/node": "12.20.25", "@types/object-hash": "^2.2.1", "@types/react": "^17.0.35", diff --git a/packages/core/package.json b/packages/core/package.json index 1b333d07ef..dc44295954 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -30,7 +30,7 @@ "test:debug": "DEBUG='ignition:*' npm run test", "test:build": "tsc --project ./test/", "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", - "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:coverage": "nyc mocha --recursive \"test/**/*.ts\"", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { @@ -40,7 +40,7 @@ "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", - "@types/mocha": "^9.0.0", + "@types/mocha": "9.1.1", "@types/node": "12.20.25", "@types/object-hash": "^2.2.1", "@types/react": "^17.0.35", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index eef0c82f18..29890705c9 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -31,6 +31,7 @@ export interface IgnitionDeployOptions { gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; + force: boolean; } type ModuleOutputs = Record; @@ -104,6 +105,7 @@ export class Ignition { gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, pollingInterval: options.pollingInterval, eventDuration: options.eventDuration, + force: options.force, }); return this._buildOutputFrom(executionResult, moduleOutputs); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 1d46943b73..54a2d00aa8 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -111,10 +111,11 @@ export class Deployment { }); } - public startExecutionPhase(executionGraphHash: string) { + public startExecutionPhase(executionGraphHash: string, force: boolean) { return this._runDeploymentCommand("Starting Execution", { type: "EXECUTION::START", executionGraphHash, + force, }); } diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 8c0b04b41f..04768eb33e 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -96,7 +96,8 @@ export function deployStateReducer( initialiseExecutionStateFrom( state.transform.executionGraph, action.executionGraphHash, - state.execution + state.execution, + action.force ), action ); @@ -131,12 +132,13 @@ export function deployStateReducer( function initialiseExecutionStateFrom( executionGraph: ExecutionGraph, executionGraphHash: string, - previousExecutionState: ExecutionState + previousExecutionState: ExecutionState, + force: boolean ): ExecutionState { const vertexes = Array.from(executionGraph.vertexes.keys()).reduce<{ [key: number]: VertexExecutionState; }>((acc, id) => { - if (previousExecutionState.vertexes[id]?.status === "COMPLETED") { + if (!force && previousExecutionState.vertexes[id]?.status === "COMPLETED") { return { ...acc, [id]: previousExecutionState.vertexes[id] }; } diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 6b0f1d4e7c..94a9c09f35 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -39,7 +39,7 @@ export async function executeInBatches( ): Promise { const executionGraphHash = hashExecutionGraph(executionGraph); - await deployment.startExecutionPhase(executionGraphHash); + await deployment.startExecutionPhase(executionGraphHash, options.force); while (deployment.hasUnstarted()) { const batch = calculateNextBatch( diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index dbbdc9f985..53ae35d6f5 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -47,6 +47,7 @@ export type DeployStateExecutionCommand = | { type: "EXECUTION::START"; executionGraphHash: string; + force: boolean; } | { type: "EXECUTION::SET_BATCH"; @@ -162,6 +163,7 @@ export interface ExecutionOptions { gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; + force: boolean; } export interface ExecutionContext { diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 7edd51263e..3210a9ca84 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -84,6 +84,16 @@ describe("Reruning execution", () => { return {}; } + if (tx === "0x00003") { + return { + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }; + } + + if (tx === "0x00004") { + return {}; + } + throw new Error(`Unexpected transaction sent: ${tx}`); }, }, @@ -134,6 +144,19 @@ describe("Reruning execution", () => { "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); + + it("should rerun all on-chain transactions on second run if force enabled", async () => { + // Arrange + await ignition.deploy(myModule, {} as any); + + // Act + const [redeployResult] = await ignition.deploy(myModule, { + force: true, + } as any); + + // Assert + assert.equal(redeployResult._kind, "success"); + }); }); describe("when a deployment is on hold", () => { diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index 2e925f4ceb..ccba39c9a5 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -55,6 +55,7 @@ describe("deployment state reducer", () => { state = deployStateReducer(state, { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }); }); @@ -90,6 +91,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { type: "EXECUTION::SET_BATCH", @@ -110,6 +112,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { type: "EXECUTION::SET_BATCH", @@ -145,6 +148,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { type: "EXECUTION::SET_BATCH", @@ -179,6 +183,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { @@ -252,6 +257,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { @@ -301,6 +307,7 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", + force: false, }, { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 8c472af137..7b6fb734db 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -25,7 +25,10 @@ export class IgnitionWrapper { constructor( private _providers: Providers, private _ethers: HardhatEthers, - private _deployOptions: Omit + private _deployOptions: Omit< + IgnitionDeployOptions, + keyof { force?: boolean } + > ) {} public async deploy( @@ -35,9 +38,11 @@ export class IgnitionWrapper { journalPath?: string | undefined; ui?: boolean; journal?: ICommandJournal; + force?: boolean; } ): Promise { const showUi = deployParams?.ui ?? false; + const force = deployParams?.force ?? false; const services = createServices(this._providers); const chainId = await services.network.getChainId(); @@ -58,10 +63,10 @@ export class IgnitionWrapper { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await ignition.deploy( - ignitionModule, - this._deployOptions - ); + const [deploymentResult] = await ignition.deploy(ignitionModule, { + ...this._deployOptions, + force, + }); if (deploymentResult._kind === "hold") { const heldVertexes = deploymentResult.holds; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d81aa8d47c..83290e5faa 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -85,12 +85,14 @@ task("deploy") "parameters", "A JSON object as a string, of the module parameters, or a relative path to a JSON file" ) + .addFlag("force", "restart the deployment ignoring previous history") .setAction( async ( { moduleNameOrPath, parameters: parametersInput, - }: { moduleNameOrPath: string; parameters?: string }, + force, + }: { moduleNameOrPath: string; parameters?: string; force: boolean }, hre ) => { if (hre.network.name !== "hardhat") { @@ -147,6 +149,7 @@ task("deploy") parameters, journalPath, ui: DISPLAY_UI, + force, }); } catch (err) { if (DISPLAY_UI) { diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 77aca86f74..6b18174fd1 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -19,7 +19,7 @@ describe("File based command journal", () => { const journal = new CommandJournal(31337, tempCommandFilePath); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX" }, + { type: "EXECUTION::START", executionGraphHash: "XXX", force: false }, { type: "EXECUTION::SET_BATCH", batch: [0, 1, 2, 3] }, { type: "EXECUTION::SET_VERTEX_RESULT", @@ -93,7 +93,7 @@ describe("File based command journal", () => { ); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX" }, + { type: "EXECUTION::START", executionGraphHash: "XXX", force: false }, ]; for (const command of commands) { From f96a63f5056273850a71938eab59ca0bbe95a3cf Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 22 Feb 2023 09:30:52 +0000 Subject: [PATCH 0239/1302] fix: change warning check to chain (#152) Switch from network name to chain id for the warning check on deploying to real networks. We do not ask when: * running ephemerally * running in tests * running against local node Fixes #134. --------- Co-authored-by: Zoey --- packages/hardhat-plugin/src/index.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 83290e5faa..4e18a88859 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -95,17 +95,17 @@ task("deploy") }: { moduleNameOrPath: string; parameters?: string; force: boolean }, hre ) => { - if (hre.network.name !== "hardhat") { - const chainId = await hre.network.provider.request({ + const chainId = Number( + await hre.network.provider.request({ method: "eth_chainId", - }); + }) + ); + if (chainId !== 31337) { const prompt = await prompts({ type: "confirm", name: "networkConfirmation", - message: `Confirm deploy to network ${hre.network.name} (${Number( - chainId - )})?`, + message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, initial: false, }); From b5ae759c80d1121fb6ffc0d9fbc85d936deebe9d Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 23 Feb 2023 16:23:39 +0000 Subject: [PATCH 0240/1302] chore: remove wsrun wsrun is for yarn workspaces. Switch to npm for running scripts across the workspaces. --- package-lock.json | 516 +--------------------------------------------- package.json | 19 +- 2 files changed, 10 insertions(+), 525 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f7cce82f5..b2a1662b71 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,8 +18,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "prettier": "2.4.1", - "typescript": "^4.7.4", - "wsrun": "^5.2.4" + "typescript": "^4.7.4" }, "workspaces": { "packages": [ @@ -1810,20 +1809,6 @@ "node": ">=8" } }, - "node_modules/@jest/types": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", - "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^1.1.1", - "@types/yargs": "^13.0.0" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", @@ -3791,31 +3776,6 @@ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", - "dev": true - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "*", - "@types/istanbul-lib-report": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -4001,21 +3961,6 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, - "node_modules/@types/yargs": { - "version": "13.0.12", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.12.tgz", - "integrity": "sha512-qCxJE1qgz2y0hA4pIxjBR+PelCH0U5CK1XJXFwCNqfmliatKp47UCXXE9Dyk1OXBDLvsCF57TqQEJaeLfDYEOQ==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", - "dev": true - }, "node_modules/@types/yoga-layout": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", @@ -9034,112 +8979,6 @@ "safe-buffer": "^5.1.1" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -11628,20 +11467,6 @@ "node": ">=8" } }, - "node_modules/jest-changed-files": { - "version": "24.9.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.9.0.tgz", - "integrity": "sha512-6aTWpe2mHF0DhL28WjdkO8LyGjs3zItPET4bMSeXU6T3ub4FPMw+mcOcbdGXQOAfmLcxofD23/5Bl9Z4AkFwqg==", - "dev": true, - "dependencies": { - "@jest/types": "^24.9.0", - "execa": "^1.0.0", - "throat": "^4.0.0" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/js-graph-algorithms": { "version": "1.0.18", "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", @@ -12686,12 +12511,6 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/nise": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", @@ -12875,27 +12694,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -13347,15 +13145,6 @@ "node": ">=12.20" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -15965,18 +15754,6 @@ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" }, - "node_modules/split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", - "dev": true, - "dependencies": { - "through": "2" - }, - "engines": { - "node": "*" - } - }, "node_modules/split2": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", @@ -16196,15 +15973,6 @@ "node": ">=8" } }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -16624,18 +16392,6 @@ "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true }, - "node_modules/throat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", - "integrity": "sha512-wCVxLDcFxw7ujDxaeJC6nfl2XfHJNYs8yUYJnvMgtPEFlttP9tHSfRUv2vBe6C4hkVFPWoP1P6ZccbYjmSEkKA==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/through2": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", @@ -17938,276 +17694,6 @@ } } }, - "node_modules/wsrun": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/wsrun/-/wsrun-5.2.4.tgz", - "integrity": "sha512-akv3WtKBohdHsD/5uqhYRHw6GXeCXe87FsSg28Szq+2cpoqRW2SY4yPfm1D0za1cS6MgNy5hPgzS5SqYJaGUxg==", - "dev": true, - "dependencies": { - "bluebird": "^3.5.1", - "chalk": "^2.3.0", - "glob": "^7.1.2", - "jest-changed-files": "^24.9.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.4", - "split": "^1.0.1", - "throat": "^4.1.0", - "yargs": "^13.0.0" - }, - "bin": { - "wsrun": "bin/wsrun.js" - } - }, - "node_modules/wsrun/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wsrun/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wsrun/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/wsrun/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/wsrun/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/wsrun/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/wsrun/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/wsrun/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wsrun/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wsrun/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wsrun/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wsrun/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/wsrun/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/wsrun/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "node_modules/wsrun/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, "node_modules/xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", diff --git a/package.json b/package.json index 89e422022d..f0c7442cb4 100644 --- a/package.json +++ b/package.json @@ -11,18 +11,18 @@ ] }, "scripts": { - "build": "wsrun --exclude-missing --serial build", - "lint": "wsrun --exclude-missing --serial lint", + "build": "npm run build -w packages/core -w packages/hardhat-plugin", + "lint": "npm run lint --workspaces", "postlint": "prettier --check ./docs/*.md ./config/eslint/.eslintrc.js", - "lint:fix": "wsrun --exclude-missing --serial lint:fix", + "lint:fix": "npm run lint:fix --workspaces", "postlint:fix": "prettier --write ./docs/*.md ./config/eslint/.eslintrc.js", - "test": "wsrun --exclude-missing --serial test", - "test:coverage": "wsrun --exclude-missing --serial test:coverage", - "test:examples": "wsrun --exclude-missing --serial test:examples", - "test:build": "wsrun --exclude-missing --serial test:build", + "test": "npm run test -w packages/core -w packages/hardhat-plugin", + "test:coverage": "npm run test:coverage -w packages/core -w packages/hardhat-plugin", + "test:examples": "npm run test:examples --workspaces --if-present", + "test:build": "npm run test:build --workspaces --if-present", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", "fullcheck": "npm run build && npm run lint && npm run test:build && npm run test:coverage && npm run test:examples", - "clean": "wsrun --exclude-missing --serial clean" + "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { "@typescript-eslint/eslint-plugin": "4.31.2", @@ -34,7 +34,6 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "prettier": "2.4.1", - "typescript": "^4.7.4", - "wsrun": "^5.2.4" + "typescript": "^4.7.4" } } From 603af290663955b2e66c753c05533ba5db1dba96 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Feb 2023 10:54:56 +0000 Subject: [PATCH 0241/1302] chore: remove autostart of watch Leave the dev to decide if they want auto-watch. --- .vscode/tasks.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/.vscode/tasks.json b/.vscode/tasks.json index f4dc58d37c..a344a015b5 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -9,9 +9,6 @@ "presentation": { "reveal": "never", "panel": "new" - }, - "runOptions": { - "runOn": "folderOpen" } }, { From 6a25db19722e80149a5e37903122041237ed35ac Mon Sep 17 00:00:00 2001 From: Zoey Date: Tue, 28 Feb 2023 09:46:27 -0500 Subject: [PATCH 0242/1302] Typescript support (#149) Allow modules to be defined in typescript and for typescript tests to leverage `hre.ignition.deploy` without a type error (note: typechain support is not included). Improves the signatures on the deployment api. A `ts-sample` project has been added to give a regression test. Only contracts can be returned from deploy, though contracts + libraries can be returned from `useModule`. Internal types have been cleaned up to remove duplication and the serialization/deserialization barrier between core and the plugin has been removed. There was a small refactor to remove testing attribute `contract.abi`. The line appears to be a hack for testing. We have more testing options now, so simplify the types by removing the added property. Closes #101. Co-authored-by: John Kane --- .../create2/ignition/Create2FactoryModule.js | 2 +- examples/create2/test/create2.test.js | 16 - examples/multisig/ignition/MultisigModule.js | 2 +- examples/multisig/test/Multisig.js | 7 - examples/sample/ignition/LockModule.js | 2 +- examples/ts-sample/.eslintrc.js | 17 + examples/ts-sample/.gitignore | 11 + examples/ts-sample/.prettierignore | 5 + examples/ts-sample/README.md | 19 + examples/ts-sample/contracts/Lock.sol | 38 ++ examples/ts-sample/hardhat.config.ts | 10 + examples/ts-sample/ignition/LockModule.ts | 24 + examples/ts-sample/package.json | 35 ++ examples/ts-sample/test/Lock.ts | 130 +++++ examples/ts-sample/tsconfig.json | 10 + package-lock.json | 491 ++++++++++++++++++ packages/core/src/Ignition.ts | 118 ++--- packages/core/src/deployment/Deployment.ts | 18 +- .../deployment/deployExecutionStateReducer.ts | 13 +- packages/core/src/deployment/utils.ts | 19 +- packages/core/src/dsl/DeploymentBuilder.ts | 38 +- packages/core/src/dsl/buildSubgraph.ts | 3 +- .../execution/dispatch/executeAwaitedEvent.ts | 19 +- .../execution/dispatch/executeContractCall.ts | 19 +- .../dispatch/executeContractDeploy.ts | 20 +- .../dispatch/executeDeployedContract.ts | 16 +- .../dispatch/executeLibraryDeploy.ts | 20 +- .../src/execution/dispatch/executeSendETH.ts | 17 +- .../execution/dispatch/executionDispatch.ts | 13 +- packages/core/src/execution/dispatch/utils.ts | 15 +- packages/core/src/execution/execute.ts | 22 +- packages/core/src/graph/visit.ts | 14 +- packages/core/src/index.ts | 6 +- .../process/generateDeploymentGraphFrom.ts | 6 +- packages/core/src/types/deployment.ts | 36 +- packages/core/src/types/deploymentGraph.ts | 52 +- packages/core/src/types/execution.ts | 15 +- packages/core/src/types/executionGraph.ts | 60 ++- packages/core/src/types/future.ts | 2 +- packages/core/src/types/graph.ts | 26 +- packages/core/src/types/module.ts | 21 +- packages/core/src/types/serialization.ts | 27 +- packages/core/src/types/validation.ts | 7 + packages/core/src/utils/guards.ts | 23 + packages/core/src/utils/serialize.ts | 37 -- .../core/src/validation/dispatch/helpers.ts | 4 +- .../dispatch/validateArtifactContract.ts | 20 +- .../dispatch/validateArtifactLibrary.ts | 23 +- .../src/validation/dispatch/validateCall.ts | 28 +- .../dispatch/validateDeployedContract.ts | 17 +- .../src/validation/dispatch/validateEvent.ts | 33 +- .../dispatch/validateHardhatContract.ts | 20 +- .../dispatch/validateHardhatLibrary.ts | 20 +- .../validation/dispatch/validateSendETH.ts | 18 +- .../validation/dispatch/validateVirtual.ts | 12 +- .../validation/dispatch/validationDispatch.ts | 9 +- .../src/validation/validateDeploymentGraph.ts | 6 +- .../test/deploymentBuilder/buildModule.ts | 3 +- .../core/test/deploymentBuilder/useModule.ts | 4 +- packages/core/test/execution/batching.ts | 12 +- packages/core/test/execution/dispatch.ts | 11 +- packages/core/test/execution/rerun.ts | 30 +- packages/core/test/state-reducer/execution.ts | 47 +- .../hardhat-plugin/src/ignition-wrapper.ts | 53 +- packages/hardhat-plugin/src/load-module.ts | 2 +- .../hardhat-plugin/test/CommandJournal.ts | 13 +- .../hardhat-plugin/test/existing-contract.ts | 7 +- packages/hardhat-plugin/test/helpers.ts | 11 +- packages/hardhat-plugin/test/libraries.ts | 8 - packages/tsconfig.settings.json | 1 + 70 files changed, 1409 insertions(+), 524 deletions(-) create mode 100644 examples/ts-sample/.eslintrc.js create mode 100644 examples/ts-sample/.gitignore create mode 100644 examples/ts-sample/.prettierignore create mode 100644 examples/ts-sample/README.md create mode 100644 examples/ts-sample/contracts/Lock.sol create mode 100644 examples/ts-sample/hardhat.config.ts create mode 100644 examples/ts-sample/ignition/LockModule.ts create mode 100644 examples/ts-sample/package.json create mode 100644 examples/ts-sample/test/Lock.ts create mode 100644 examples/ts-sample/tsconfig.json create mode 100644 packages/core/src/types/validation.ts diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js index d2e3350585..217fd05745 100644 --- a/examples/create2/ignition/Create2FactoryModule.js +++ b/examples/create2/ignition/Create2FactoryModule.js @@ -34,7 +34,7 @@ module.exports = buildModule("Create2Factory", (m) => { after: [barEvent], }); - return { create2, foo, bar, fooEvent, barEvent }; + return { create2, foo, bar }; }); function toBytes32(n) { diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js index 5a2832dee7..ccfd687381 100644 --- a/examples/create2/test/create2.test.js +++ b/examples/create2/test/create2.test.js @@ -12,20 +12,4 @@ describe("Create2", function () { it("should return an instantiated factory", async function () { assert.isDefined(deployResults.create2); }); - - it("should have deployed the foo contract", async () => { - const address = deployResults.fooEvent.deployed; - const FooFactory = await hre.ethers.getContractFactory("Foo"); - const foo = FooFactory.attach(address); - - assert.equal(await foo.name(), "Foo"); - }); - - it("should have deployed the bar contract", async () => { - const address = deployResults.barEvent.deployed; - const BarFactory = await hre.ethers.getContractFactory("Bar"); - const bar = BarFactory.attach(address); - - assert.equal(await bar.name(), "Bar"); - }); }); diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js index 07e4bbb040..c30f6d55d2 100644 --- a/examples/multisig/ignition/MultisigModule.js +++ b/examples/multisig/ignition/MultisigModule.js @@ -33,5 +33,5 @@ module.exports = buildModule("MultisigModule", (m) => { after: [event], }); - return { multisig, event }; + return { multisig }; }); diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 8afa1a5b9f..390a4f9ac1 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -8,7 +8,6 @@ const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; describe("Multisig", function () { describe("a deploy broken up by an external call", () => { let multisig; - let event; this.beforeAll(async () => { const journal = new MemoryCommandJournal(); @@ -33,7 +32,6 @@ describe("Multisig", function () { }); multisig = moduleResult.multisig; - event = moduleResult.event; }); it("should confirm a stored transaction", async function () { @@ -45,11 +43,6 @@ describe("Multisig", function () { expect(isConfirmed).to.equal(true); }); - it("should emit the sender and transaction id after confirming a stored transaction", async function () { - expect(event.sender).to.equal(ACCOUNT_0); - expect(ethers.BigNumber.from("0").eq(event.transactionId)).to.be.true; - }); - it("should execute a confirmed transaction", async function () { const submittedTx = await multisig.functions.transactions(0); diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index e5b85d9cd2..eea5a4ad6e 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -5,7 +5,7 @@ const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; -const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); +const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); module.exports = buildModule("LockModule", (m) => { const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); diff --git a/examples/ts-sample/.eslintrc.js b/examples/ts-sample/.eslintrc.js new file mode 100644 index 0000000000..b22007961e --- /dev/null +++ b/examples/ts-sample/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + tsConfigRootDir: "./", + }, + plugins: ["eslint-plugin-import", "@typescript-eslint"], + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/ts-sample/.gitignore b/examples/ts-sample/.gitignore new file mode 100644 index 0000000000..71f6a160fc --- /dev/null +++ b/examples/ts-sample/.gitignore @@ -0,0 +1,11 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + diff --git a/examples/ts-sample/.prettierignore b/examples/ts-sample/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/ts-sample/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/ts-sample/README.md b/examples/ts-sample/README.md new file mode 100644 index 0000000000..31551d51b0 --- /dev/null +++ b/examples/ts-sample/README.md @@ -0,0 +1,19 @@ +# Hardhat Sample for Ignition + +This hardhat project is a variant of Hardhat's typescript sample project. + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy LockModule +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +npm run test:examples +``` diff --git a/examples/ts-sample/contracts/Lock.sol b/examples/ts-sample/contracts/Lock.sol new file mode 100644 index 0000000000..072855038a --- /dev/null +++ b/examples/ts-sample/contracts/Lock.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function test() public { + emit Withdrawal(address(this).balance, block.timestamp); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/examples/ts-sample/hardhat.config.ts b/examples/ts-sample/hardhat.config.ts new file mode 100644 index 0000000000..032fa8e67b --- /dev/null +++ b/examples/ts-sample/hardhat.config.ts @@ -0,0 +1,10 @@ +import type { HardhatUserConfig } from "hardhat/config"; + +import "@nomicfoundation/hardhat-toolbox"; +import "@ignored/hardhat-ignition"; + +const config: HardhatUserConfig = { + solidity: "0.8.17", +}; + +export default config; diff --git a/examples/ts-sample/ignition/LockModule.ts b/examples/ts-sample/ignition/LockModule.ts new file mode 100644 index 0000000000..7c989afbae --- /dev/null +++ b/examples/ts-sample/ignition/LockModule.ts @@ -0,0 +1,24 @@ +import hre from "hardhat"; +import { buildModule } from "@ignored/hardhat-ignition"; + +const currentTimestampInSeconds = Math.round( + new Date(2023, 1, 1).valueOf() / 1000 +); +const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; + +const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); + +const LockModule = buildModule("LockModule", (m) => { + const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); + const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); + + const lock = m.contract("Lock", { + args: [unlockTime], + value: lockedAmount, + }); + + return { lock }; +}); + +export default LockModule; diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json new file mode 100644 index 0000000000..407bbdb4dc --- /dev/null +++ b/examples/ts-sample/package.json @@ -0,0 +1,35 @@ +{ + "name": "@nomicfoundation/ignition-ts-sample-example", + "private": true, + "version": "0.0.1", + "scripts": { + "test:examples": "hardhat test", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx,ts,tsx}\" \"test/**/*.{js,jsx,ts,tsx}\"", + "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" + }, + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.8", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "chai": "4.3.7", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-import": "^2.27.5", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1", + "typescript": "^4.7.4" + } +} diff --git a/examples/ts-sample/test/Lock.ts b/examples/ts-sample/test/Lock.ts new file mode 100644 index 0000000000..30204900e9 --- /dev/null +++ b/examples/ts-sample/test/Lock.ts @@ -0,0 +1,130 @@ +import { ethers, ignition } from "hardhat"; +import { time, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +import { expect } from "chai"; + +import LockModule from "../ignition/LockModule"; + +describe("Lock", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await ethers.getSigners(); + + const { lock } = await ignition.deploy(LockModule, { + parameters: { + unlockTime, + lockedAmount, + }, + }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.unlockTime()).to.equal(unlockTime); + }); + + it("Should set the right owner", async function () { + const { lock, owner } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.owner()).to.equal(owner.address); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + expect(await ethers.provider.getBalance(lock.address)).to.equal( + lockedAmount + ); + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const latestTime = await time.latest(); + const Lock = await ethers.getContractFactory("Lock"); + await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( + "Unlock time should be in the future" + ); + }); + }); + + describe("Withdrawals", function () { + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + const { lock } = await loadFixture(deployOneYearLockFixture); + + await expect(lock.withdraw()).to.be.revertedWith( + "You can't withdraw yet" + ); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime, otherAccount } = await loadFixture( + deployOneYearLockFixture + ); + + // We can increase the time in Hardhat Network + await time.increaseTo(unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( + "You aren't the owner" + ); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + const { lock, unlockTime } = await loadFixture( + deployOneYearLockFixture + ); + + // Transactions are sent using the first signer by default + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).not.to.be.reverted; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()) + .to.emit(lock, "Withdrawal") + .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg + }); + }); + + describe("Transfers", function () { + it.skip("Should transfer the funds to the owner", async function () { + const { lock, unlockTime, lockedAmount, owner } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).to.changeEtherBalances( + [owner, lock], + [lockedAmount, -lockedAmount] + ); + }); + }); + }); +}); diff --git a/examples/ts-sample/tsconfig.json b/examples/ts-sample/tsconfig.json new file mode 100644 index 0000000000..e5f1a64007 --- /dev/null +++ b/examples/ts-sample/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/package-lock.json b/package-lock.json index b2a1662b71..9068bacdd9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -145,6 +145,255 @@ "hardhat": "^2.0.0" } }, + "examples/ts-sample": { + "name": "@nomicfoundation/ignition-ts-sample-example", + "version": "0.0.1", + "devDependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ignored/hardhat-ignition": "^0.0.8", + "@nomicfoundation/hardhat-chai-matchers": "1.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.6", + "@nomicfoundation/hardhat-toolbox": "2.0.0", + "@nomiclabs/hardhat-ethers": "2.2.1", + "@nomiclabs/hardhat-etherscan": "3.1.2", + "@typechain/ethers-v5": "10.1.1", + "@typechain/hardhat": "6.1.4", + "@typescript-eslint/eslint-plugin": "^5.52.0", + "@typescript-eslint/parser": "^5.52.0", + "chai": "4.3.7", + "eslint-import-resolver-typescript": "^3.5.3", + "eslint-plugin-import": "^2.27.5", + "ethers": "5.7.2", + "hardhat": "^2.12.0", + "hardhat-gas-reporter": "1.0.9", + "solidity-coverage": "0.8.2", + "typechain": "8.1.1", + "typescript": "^4.7.4" + } + }, + "examples/ts-sample/node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", + "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", + "dev": true, + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", + "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/type-utils": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/parser": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", + "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "examples/ts-sample/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "examples/ts-sample/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "examples/ts-sample/node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "examples/ts-sample/node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "examples/ts-sample/node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/ts-sample/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "examples/ts-sample/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", "version": "0.0.1", @@ -2310,6 +2559,10 @@ "resolved": "examples/sample", "link": true }, + "node_modules/@nomicfoundation/ignition-ts-sample-example": { + "resolved": "examples/ts-sample", + "link": true + }, "node_modules/@nomicfoundation/ignition-uniswap-example": { "resolved": "examples/uniswap", "link": true @@ -3925,6 +4178,12 @@ "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, "node_modules/@types/sinon": { "version": "10.0.13", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", @@ -4065,6 +4324,99 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", + "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/utils": "5.52.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@typescript-eslint/types": { "version": "4.31.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", @@ -4105,6 +4457,115 @@ } } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", + "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.52.0", + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/typescript-estree": "5.52.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", + "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", + "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", + "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/visitor-keys": "5.52.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.52.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", + "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.52.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", @@ -4674,6 +5135,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", @@ -9817,6 +10296,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -12474,6 +12959,12 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/ndjson": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 29890705c9..f490aad362 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -9,17 +9,20 @@ import { NoopCommandJournal } from "journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; import { Services } from "services/types"; -import { DeploymentResult, UpdateUiAction } from "types/deployment"; -import { DependableFuture, FutureDict } from "types/future"; -import { ResultsAccumulator, VisitResult } from "types/graph"; -import { ICommandJournal } from "types/journal"; -import { Module, ModuleDict } from "types/module"; -import { IgnitionPlan } from "types/plan"; -import { SerializedFutureResult } from "types/serialization"; +import type { DeploymentResult, UpdateUiAction } from "types/deployment"; +import type { + ExecutionResultsAccumulator, + ExecutionVisitResult, +} from "types/executionGraph"; +import type { ICommandJournal } from "types/journal"; +import type { Module, ModuleDict } from "types/module"; +import type { IgnitionPlan } from "types/plan"; +import type { + ContractInfo, + SerializedDeploymentResult, +} from "types/serialization"; import { IgnitionError } from "utils/errors"; -import { isDependable } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; -import { serializeFutureOutput } from "utils/serialize"; import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); @@ -34,8 +37,6 @@ export interface IgnitionDeployOptions { force: boolean; } -type ModuleOutputs = Record; - export class Ignition { private _services: Services; private _uiRenderer: UpdateUiAction; @@ -58,7 +59,7 @@ export class Ignition { public async deploy( ignitionModule: Module, options: IgnitionDeployOptions - ): Promise<[DeploymentResult, ModuleOutputs]> { + ): Promise> { log(`Start deploy`); const deployment = new Deployment( @@ -78,7 +79,7 @@ export class Ignition { if (constructResult._kind === "failure") { log("Failed to construct execution graph"); - return [constructResult, {}]; + return constructResult; } log("Execution graph constructed"); @@ -96,7 +97,7 @@ export class Ignition { log("Failed to reconcile"); await deployment.failReconciliation(); - return [moduleChangeResult, {}]; + return moduleChangeResult; } log("Execute based on execution graph"); @@ -114,23 +115,17 @@ export class Ignition { const unexpectedError = new IgnitionError("Unexpected error"); await deployment.failUnexpected([unexpectedError]); - return [ - { - _kind: "failure", - failures: ["Unexpected error", [unexpectedError]], - }, - {}, - ]; + return { + _kind: "failure", + failures: ["Unexpected error", [unexpectedError]], + }; } await deployment.failUnexpected([err]); - return [ - { - _kind: "failure", - failures: ["Unexpected error", [err]], - }, - {}, - ]; + return { + _kind: "failure", + failures: ["Unexpected error", [err]], + }; } } @@ -174,7 +169,7 @@ export class Ignition { private async _constructExecutionGraphFrom( deployment: Deployment, ignitionModule: Module - ): Promise<{ result: any; moduleOutputs: FutureDict }> { + ): Promise<{ result: any; moduleOutputs: T }> { log("Generate deployment graph from module"); const { graph: deploymentGraph, moduleOutputs } = generateDeploymentGraphFrom(ignitionModule, { @@ -208,16 +203,16 @@ export class Ignition { return { result: transformResult, moduleOutputs }; } - private _buildOutputFrom( - executionResult: VisitResult, - moduleOutputs: FutureDict - ): [DeploymentResult, ModuleOutputs] { + private _buildOutputFrom( + executionResult: ExecutionVisitResult, + moduleOutputs: T + ): DeploymentResult { if (executionResult._kind === "failure") { - return [executionResult, {}]; + return executionResult; } if (executionResult._kind === "hold") { - return [executionResult, {}]; + return executionResult; } const serializedDeploymentResult = this._serialize( @@ -225,38 +220,35 @@ export class Ignition { executionResult.result ); - return [{ _kind: "success", result: serializedDeploymentResult }, {}]; + return { _kind: "success", result: serializedDeploymentResult }; } - private _serialize(moduleOutputs: FutureDict, result: ResultsAccumulator) { - const entries = Object.entries(moduleOutputs).filter( - (entry): entry is [string, DependableFuture] => isDependable(entry[1]) - ); - - const convertedEntries: Array<[string, SerializedFutureResult]> = entries - .map(([name, givenFuture]): [string, SerializedFutureResult] | null => { - const future = resolveProxyValue(givenFuture); - - const executionResultValue = result.get(future.vertexId); - - if ( - executionResultValue === undefined || - executionResultValue === null || - executionResultValue._kind === "failure" || - executionResultValue._kind === "hold" - ) { - return null; - } - - const serializedOutput: SerializedFutureResult = serializeFutureOutput( - executionResultValue.result - ); + private _serialize( + moduleOutputs: T, + result: ExecutionResultsAccumulator + ): SerializedDeploymentResult { + const entries = Object.entries(moduleOutputs); + + const serializedResult: { [k: string]: ContractInfo } = {}; + for (const [key, value] of entries) { + const future = resolveProxyValue(value); + + const executionResultValue = result.get(future.vertexId); + + if ( + executionResultValue === undefined || + executionResultValue === null || + executionResultValue._kind === "failure" || + executionResultValue._kind === "hold" || + future.type !== "contract" + ) { + continue; + } - return [name, serializedOutput]; - }) - .filter((x): x is [string, SerializedFutureResult] => x !== null); + serializedResult[key] = executionResultValue.result as ContractInfo; + } - return Object.fromEntries(convertedEntries); + return serializedResult as SerializedDeploymentResult; } private _checkSafeDeployment( diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 54a2d00aa8..ac15c77b46 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -1,19 +1,16 @@ import setupDebug from "debug"; import { ExecutionGraph } from "execution/ExecutionGraph"; -import { Services } from "services/types"; -import { +import type { Services } from "services/types"; +import type { DeployState, UpdateUiAction, DeployStateCommand, DeployStateExecutionCommand, } from "types/deployment"; -import { - VertexDescriptor, - VertexVisitResult, - VertexVisitResultFailure, -} from "types/graph"; -import { ICommandJournal } from "types/journal"; +import type { ExecutionVertexVisitResult } from "types/executionGraph"; +import type { VertexDescriptor, VertexVisitResultFailure } from "types/graph"; +import type { ICommandJournal } from "types/journal"; import { IgnitionError } from "utils/errors"; import { @@ -126,7 +123,10 @@ export class Deployment { }); } - public async updateVertexResult(vertexId: number, result: VertexVisitResult) { + public async updateVertexResult( + vertexId: number, + result: ExecutionVertexVisitResult + ) { return this._runDeploymentCommand( [`Update current with batch result for ${vertexId}`, [result]], { diff --git a/packages/core/src/deployment/deployExecutionStateReducer.ts b/packages/core/src/deployment/deployExecutionStateReducer.ts index 03d06dc047..ab588b3a1a 100644 --- a/packages/core/src/deployment/deployExecutionStateReducer.ts +++ b/packages/core/src/deployment/deployExecutionStateReducer.ts @@ -7,7 +7,8 @@ import type { VertexExecutionStatusCompleted, VertexExecutionStatusHold, } from "types/deployment"; -import { VertexVisitResult } from "types/graph"; +import type { ExecutionVertexVisitResult } from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { IgnitionError } from "utils/errors"; import { assertNeverMessageType } from "./utils"; @@ -79,19 +80,21 @@ function updateExecutionStateWithNewBatch( }; } -function convertTo(vertexVisitResult: VertexVisitResult): VertexExecutionState { +function convertTo( + vertexVisitResult: ExecutionVertexVisitResult +): VertexExecutionState { switch (vertexVisitResult._kind) { - case "success": + case VertexResultEnum.SUCCESS: return { status: "COMPLETED" as VertexExecutionStatusCompleted, result: vertexVisitResult, }; - case "failure": + case VertexResultEnum.FAILURE: return { status: "FAILED" as VertexExecutionStatusFailed, result: vertexVisitResult, }; - case "hold": + case VertexResultEnum.HOLD: return { status: "HOLD" as VertexExecutionStatusHold, result: null, diff --git a/packages/core/src/deployment/utils.ts b/packages/core/src/deployment/utils.ts index 87c2f00ed4..f1a0ccbcd9 100644 --- a/packages/core/src/deployment/utils.ts +++ b/packages/core/src/deployment/utils.ts @@ -3,7 +3,10 @@ import type { DeployStateCommand, DeployStateExecutionCommand, } from "types/deployment"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import type { + ExecutionResultsAccumulator, + ExecutionVertexVisitResult, +} from "types/executionGraph"; import { IgnitionError } from "utils/errors"; export function isDeployStateExecutionCommand( @@ -22,13 +25,11 @@ export function assertNeverMessageType(action: never) { export function viewExecutionResults( deployState: DeployState -): ResultsAccumulator { - const entries: Array<[number, VertexVisitResult | null]> = Object.entries( - deployState.execution.vertexes - ).map(([vertexId, vertexState]) => [ - parseInt(vertexId, 10), - vertexState.result, - ]); +): ExecutionResultsAccumulator { + const entries: Array<[number, ExecutionVertexVisitResult | null]> = + Object.entries(deployState.execution.vertexes).map( + ([vertexId, vertexState]) => [parseInt(vertexId, 10), vertexState.result] + ); - return new Map(entries); + return new Map(entries); } diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 755c82b1de..33d2f5edc2 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -8,7 +8,6 @@ import { InternalParamValue, IDeploymentGraph, IDeploymentBuilder, - Subgraph, DeploymentBuilderOptions, DeploymentGraphVertex, UseSubgraphOptions, @@ -42,9 +41,10 @@ import type { AddressResolvable, } from "types/future"; import type { Artifact } from "types/hardhat"; -import type { ModuleCache, ModuleDict } from "types/module"; +import type { ModuleCache, ModuleDict, Subgraph } from "types/module"; import { IgnitionError } from "utils/errors"; import { + assertModuleReturnTypes, assertUnknownDeploymentVertexType, isArtifact, isCallable, @@ -95,11 +95,19 @@ export class DeploymentBuilder implements IDeploymentBuilder { constructor(options: DeploymentBuilderOptions) { this.chainId = options.chainId; } - public library( libraryName: string, - artifactOrOptions?: ContractOptions | Artifact | undefined, - givenOptions?: ContractOptions | undefined + options?: ContractOptions + ): HardhatLibrary; + public library( + libraryName: string, + artifact: Artifact, + options?: ContractOptions + ): ArtifactLibrary; + public library( + libraryName: string, + artifactOrOptions?: ContractOptions | Artifact, + givenOptions?: ContractOptions ): HardhatLibrary | ArtifactLibrary { if (isArtifact(artifactOrOptions)) { const artifact = artifactOrOptions; @@ -151,6 +159,15 @@ export class DeploymentBuilder implements IDeploymentBuilder { } } + public contract( + contractName: string, + options?: ContractOptions + ): HardhatContract; + public contract( + contractName: string, + artifact: Artifact, + options?: ContractOptions + ): ArtifactContract; public contract( contractName: string, artifactOrOptions?: Artifact | ContractOptions, @@ -468,16 +485,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { const { result, after } = this._useSubscope(module, options); - // type casting here so that typescript lets us validate against js users bypassing typeguards - for (const future of Object.values(result)) { - if (isCallable(future)) { - continue; - } - - throw new IgnitionError( - `Cannot return Future of type "${future.type}" from a module` - ); - } + assertModuleReturnTypes(result); const moduleResult = { ...this._enhance(result, after), ...after }; diff --git a/packages/core/src/dsl/buildSubgraph.ts b/packages/core/src/dsl/buildSubgraph.ts index 4c3f560e1e..5da45e26f1 100644 --- a/packages/core/src/dsl/buildSubgraph.ts +++ b/packages/core/src/dsl/buildSubgraph.ts @@ -1,5 +1,6 @@ -import type { IDeploymentBuilder, Subgraph } from "types/deploymentGraph"; +import type { IDeploymentBuilder } from "types/deploymentGraph"; import type { FutureDict } from "types/future"; +import { Subgraph } from "types/module"; export function buildSubgraph( subgraphName: string, diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index c07f06f429..b96d3ce6b6 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -1,16 +1,19 @@ import { Contract, ethers } from "ethers"; -import { ExecutionContext } from "types/deployment"; -import { AwaitedEvent } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { + AwaitedEvent, + ExecutionVertexVisitResult, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeAwaitedEvent( { event, address, abi, args }: AwaitedEvent, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext -): Promise { +): Promise { const resolve = resolveFrom(resultAccumulator); const resolvedArgs = [...args, address].map(resolve).map(toAddress); @@ -30,20 +33,20 @@ export async function executeAwaitedEvent( if (eventResult === null) { return { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }; } topics = contractInstance.interface.parseLog(eventResult).args; } catch (err) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: err as any, }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { topics, }, diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 24ddaa16bc..604f0f8cf3 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,16 +1,19 @@ import { Contract } from "ethers"; -import { ExecutionContext } from "types/deployment"; -import { ContractCall } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { + ContractCall, + ExecutionVertexVisitResult, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( { method, contract, args, value }: ContractCall, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext -): Promise { +): Promise { const resolve = resolveFrom(resultAccumulator); const resolvedArgs = args.map(resolve).map(toAddress); @@ -29,7 +32,7 @@ export async function executeContractCall( txHash = await services.contracts.sendTx(unsignedTx, options); } catch (err) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: err as any, }; } @@ -38,12 +41,12 @@ export async function executeContractCall( await services.transactions.wait(txHash); } catch { return { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { hash: txHash, }, diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index 0a9c5f4b63..f92e06dea8 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,17 +1,21 @@ import { ContractFactory, ethers } from "ethers"; -import { ExecutionContext } from "types/deployment"; -import { ContractDeploy } from "types/executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { + ContractDeploy, + ExecutionResultsAccumulator, + ExecutionVertexVisitResult, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( { artifact, args, libraries, value }: ContractDeploy, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext -): Promise { +): Promise { let txHash: string; try { const resolve = resolveFrom(resultAccumulator); @@ -39,7 +43,7 @@ export async function executeContractDeploy( txHash = await services.contracts.sendTx(deployTransaction, options); } catch (err) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: err as any, }; } @@ -49,12 +53,12 @@ export async function executeContractDeploy( receipt = await services.transactions.wait(txHash); } catch { return { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { name: artifact.contractName, abi: artifact.abi, diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index 4b84c0f549..7737696308 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,20 +1,24 @@ -import { Services } from "services/types"; -import { DeployedContract } from "types/executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import type { Services } from "services/types"; +import type { + DeployedContract, + ExecutionResultsAccumulator, + ExecutionVertexVisitResult, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeDeployedContract( { label, address, abi }: DeployedContract, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ExecutionResultsAccumulator, _: { services: Services } -): Promise { +): Promise { const resolve = resolveFrom(_resultAccumulator); const resolvedAddress = toAddress(resolve(address)); return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { name: label, abi, diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index bba6a3fae6..16ec20bd52 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,17 +1,21 @@ import { ContractFactory, ethers } from "ethers"; -import { ExecutionContext } from "types/deployment"; -import { LibraryDeploy } from "types/executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { + ExecutionResultsAccumulator, + ExecutionVertexVisitResult, + LibraryDeploy, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeLibraryDeploy( { artifact, args }: LibraryDeploy, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext -): Promise { +): Promise { let txHash: string; try { const resolvedArgs = args @@ -27,7 +31,7 @@ export async function executeLibraryDeploy( txHash = await services.contracts.sendTx(deployTransaction, options); } catch (err) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: err as any, }; } @@ -37,12 +41,12 @@ export async function executeLibraryDeploy( receipt = await services.transactions.wait(txHash); } catch { return { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { name: artifact.contractName, abi: artifact.abi, diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts index c4ea0442af..0d9fa40a9b 100644 --- a/packages/core/src/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -1,16 +1,16 @@ import type { PopulatedTransaction } from "ethers"; -import { ExecutionContext } from "types/deployment"; -import { SentETH } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { ExecutionVertexVisitResult, SentETH } from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeSendETH( { address, value }: SentETH, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext -): Promise { +): Promise { const resolve = resolveFrom(resultAccumulator); const to = toAddress(resolve(address)); @@ -22,7 +22,7 @@ export async function executeSendETH( txHash = await services.contracts.sendTx(tx, options); } catch (err) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: err as any, }; } @@ -31,14 +31,15 @@ export async function executeSendETH( await services.transactions.wait(txHash); } catch { return { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { hash: txHash, + value, }, }; } diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index 772c9a9267..ec6c0480f5 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,6 +1,9 @@ -import { ExecutionContext } from "types/deployment"; -import { ExecutionVertex } from "types/executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import type { ExecutionContext } from "types/deployment"; +import type { + ExecutionResultsAccumulator, + ExecutionVertex, + ExecutionVertexVisitResult, +} from "types/executionGraph"; import { IgnitionError } from "utils/errors"; import { executeAwaitedEvent } from "./executeAwaitedEvent"; @@ -12,9 +15,9 @@ import { executeSendETH } from "./executeSendETH"; export function executionDispatch( executionVertex: ExecutionVertex, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ExecutionResultsAccumulator, context: ExecutionContext -): Promise { +): Promise { switch (executionVertex.type) { case "ContractDeploy": return executeContractDeploy(executionVertex, resultAccumulator, context); diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index a73f7d9dc8..0d00355ef1 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,5 +1,7 @@ -import { ArgValue } from "types/executionGraph"; -import { ResultsAccumulator } from "types/graph"; +import type { + ArgValue, + ExecutionResultsAccumulator, +} from "types/executionGraph"; import { IgnitionError } from "utils/errors"; import { isDependable, isEventParam, isProxy } from "utils/guards"; @@ -11,11 +13,14 @@ export function toAddress(v: any) { return v; } -export function resolveFrom(context: ResultsAccumulator) { +export function resolveFrom(context: ExecutionResultsAccumulator) { return (arg: ArgValue) => resolveFromContext(context, arg); } -function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { +function resolveFromContext( + context: ExecutionResultsAccumulator, + arg: ArgValue +): any { if (isProxy(arg)) { return resolveFromContext(context, arg.value); } @@ -44,7 +49,7 @@ function resolveFromContext(context: ResultsAccumulator, arg: ArgValue): any { ); } - if (isEventParam(arg)) { + if (isEventParam(arg) && "topics" in entry.result) { return entry.result.topics[arg.label]; } diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 94a9c09f35..728962d3ec 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,14 +1,14 @@ import type { Deployment } from "deployment/Deployment"; import { viewExecutionResults } from "deployment/utils"; -import { Services } from "services/types"; +import type { Services } from "services/types"; import type { ExecutionOptions, ExecutionState } from "types/deployment"; -import { ExecutionVertexDispatcher } from "types/execution"; -import { ExecutionVertex } from "types/executionGraph"; +import type { ExecutionVertexDispatcher } from "types/execution"; import type { - ResultsAccumulator, - VertexVisitResult, - VisitResult, -} from "types/graph"; + ExecutionResultsAccumulator, + ExecutionVertexVisitResult, + ExecutionVisitResult, + ExecutionVertex, +} from "types/executionGraph"; import { IgnitionError } from "utils/errors"; import { ExecutionGraph } from "./ExecutionGraph"; @@ -18,7 +18,7 @@ import { allDependenciesCompleted, hashExecutionGraph } from "./utils"; export async function execute( deployment: Deployment, options: ExecutionOptions -): Promise { +): Promise { if (deployment.state.transform.executionGraph === null) { throw new IgnitionError("Cannot execute without an execution graph"); } @@ -36,7 +36,7 @@ export async function executeInBatches( executionGraph: ExecutionGraph, executionVertexDispatcher: ExecutionVertexDispatcher, options: ExecutionOptions -): Promise { +): Promise { const executionGraphHash = hashExecutionGraph(executionGraph); await deployment.startExecutionPhase(executionGraphHash, options.force); @@ -111,10 +111,10 @@ function calculateNextBatch( async function executeBatch( batch: number[], executionGraph: ExecutionGraph, - resultsAccumulator: ResultsAccumulator, + resultsAccumulator: ExecutionResultsAccumulator, deploymentStateUpdate: ( vertexId: number, - result: VertexVisitResult + result: ExecutionVertexVisitResult ) => Promise, { services }: { services: Services }, executionVertexDispatcher: ExecutionVertexDispatcher, diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 04e6a28097..39458fd068 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -1,24 +1,24 @@ import { IGraph, - ResultsAccumulator, VertexVisitResult, + ResultsAccumulator, VisitResult, } from "types/graph"; import { IgnitionError } from "utils/errors"; -export async function visit( +export async function visit( phase: "Execution" | "Validation", orderedVertexIds: number[], graph: IGraph, context: C, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ResultsAccumulator, vistitorAction: ( vertex: T, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ResultsAccumulator, context: C - ) => Promise, + ) => Promise>, afterAction?: (vertex: T, kind: "success" | "failure", err?: unknown) => void -): Promise { +): Promise> { for (const vertexId of orderedVertexIds) { const vertex = graph.vertexes.get(vertexId); @@ -50,7 +50,7 @@ export async function visit( }; } - resultAccumulator.set(vertexId, vertexVisitResult.result); + resultAccumulator.set(vertexId, vertexVisitResult); if (afterAction !== undefined) { afterAction(vertex, "success"); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6ab75dba6f..eada6d5ed9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -7,10 +7,11 @@ export { serializeReplacer } from "utils/serialize"; export { IgnitionError } from "utils/errors"; export { TransactionsService } from "services/TransactionsService"; export { ContractsService } from "services/ContractsService"; +export { VertexResultEnum } from "types/graph"; export type { SerializedDeploymentResult, - SerializedFutureResult, + ContractInfo, } from "types/serialization"; export type { Services } from "services/types"; export type { @@ -24,9 +25,8 @@ export type { DeploymentResult, UpdateUiAction, } from "types/deployment"; -export type { Module, ModuleDict, ModuleParams } from "types/module"; +export type { Module, ModuleDict, ModuleParams, Subgraph } from "types/module"; export type { - Subgraph, ExternalParamValue, IDeploymentBuilder, } from "types/deploymentGraph"; diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index d344e39ac2..55d1ba98b8 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -3,14 +3,14 @@ import type { DeploymentBuilderOptions, IDeploymentGraph, } from "types/deploymentGraph"; -import { FutureDict } from "types/future"; import { Module, ModuleDict } from "types/module"; import { IgnitionError } from "utils/errors"; +import { assertModuleReturnTypes } from "utils/guards"; export function generateDeploymentGraphFrom( ignitionModule: Module, builderOptions: DeploymentBuilderOptions -): { graph: IDeploymentGraph; moduleOutputs: FutureDict } { +): { graph: IDeploymentGraph; moduleOutputs: T } { const graphBuilder = new DeploymentBuilder(builderOptions); const moduleOutputs = ignitionModule.action(graphBuilder); @@ -21,6 +21,8 @@ export function generateDeploymentGraphFrom( ); } + assertModuleReturnTypes(moduleOutputs); + return { graph: graphBuilder.graph, moduleOutputs }; } diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 53ae35d6f5..86163f0b12 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,36 +1,28 @@ import type { BigNumber } from "ethers"; -import { Services } from "services/types"; - -import { ExecutionVertex } from "./executionGraph"; -import { +import type { Services } from "services/types"; + +import type { + ExecutionVertex, + ExecutionVertexVisitResult, + VertexVisitResultSuccessResult, +} from "./executionGraph"; +import type { IGraph, VertexDescriptor, - VertexVisitResult, VertexVisitResultFailure, VertexVisitResultSuccess, } from "./graph"; -import { ModuleParams } from "./module"; -import { - SerializedDeploymentResult, - SerializedFutureResult, -} from "./serialization"; +import type { ModuleDict, ModuleParams } from "./module"; +import type { SerializedDeploymentResult } from "./serialization"; export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; -export interface IgnitionModuleResults { - load: (moduleId: string) => Promise; - save: ( - moduleId: string, - moduleResult: SerializedFutureResult - ) => Promise; -} - -export type DeploymentResult = +export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } | { _kind: "hold"; holds: VertexDescriptor[] } - | { _kind: "success"; result: SerializedDeploymentResult }; + | { _kind: "success"; result: SerializedDeploymentResult }; export type DeployPhase = | "uninitialized" @@ -56,7 +48,7 @@ export type DeployStateExecutionCommand = | { type: "EXECUTION::SET_VERTEX_RESULT"; vertexId: number; - result: VertexVisitResult; + result: ExecutionVertexVisitResult; }; export type DeployStateCommand = @@ -111,7 +103,7 @@ export interface VertexExecutionStateUnstarted { export interface VertexExecutionStateCompleted { status: VertexExecutionStatusCompleted; - result: VertexVisitResultSuccess; + result: VertexVisitResultSuccess; } export interface VertexExecutionStateFailed { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 766bce4b07..29e07d8db0 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -24,7 +24,7 @@ import { } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; -import { ModuleDict } from "./module"; +import { ModuleDict, Subgraph } from "./module"; export interface ScopeData { before: Virtual; @@ -175,61 +175,59 @@ export interface IDeploymentBuilder { chainId: number; graph: IDeploymentGraph; - contract: ( + contract(contractName: string, options?: ContractOptions): HardhatContract; + contract( contractName: string, - artifactOrOptions?: Artifact | ContractOptions, + artifact: Artifact, options?: ContractOptions - ) => HardhatContract | ArtifactContract; + ): ArtifactContract; - contractAt: ( + contractAt( contractName: string, address: string | EventParamFuture, abi: any[], options?: { after?: DeploymentGraphFuture[] } - ) => DeployedContract; + ): DeployedContract; - library: ( + library(contractName: string, options?: ContractOptions): HardhatLibrary; + library( contractName: string, - artifactOrOptions?: Artifact | ContractOptions, + artifact: Artifact, options?: ContractOptions - ) => HardhatLibrary | ArtifactLibrary; + ): ArtifactLibrary; - call: ( + call( contractFuture: DeploymentGraphFuture, functionName: string, options: CallOptions - ) => ContractCall; + ): ContractCall; - event: ( + event( contractFuture: ArtifactFuture, eventName: string, options: AwaitOptions - ) => EventFuture; + ): EventFuture; - sendETH: (sendTo: AddressResolvable, options: SendOptions) => SendFuture; + sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture; - getParam: (paramName: string) => RequiredParameter; + getParam(paramName: string): RequiredParameter; - getOptionalParam: ( + getOptionalParam( paramName: string, defaultValue: ParameterValue - ) => OptionalParameter; + ): OptionalParameter; - getBytesForArtifact: (artifactName: string) => BytesFuture; + getBytesForArtifact(artifactName: string): BytesFuture; - useSubgraph: ( + useSubgraph( subgraph: Subgraph, options?: UseSubgraphOptions - ) => Virtual & T; - useModule: ( + ): Virtual & T; + + useModule( module: Subgraph, options?: UseSubgraphOptions - ) => Virtual & T; -} - -export interface Subgraph { - name: string; - action: (builder: IDeploymentBuilder) => T; + ): Virtual & T; } export interface DeploymentBuilderOptions { diff --git a/packages/core/src/types/execution.ts b/packages/core/src/types/execution.ts index 52071235d3..dc48c93ec8 100644 --- a/packages/core/src/types/execution.ts +++ b/packages/core/src/types/execution.ts @@ -1,11 +1,14 @@ -import { ExecutionContext } from "./deployment"; -import { ExecutionVertex } from "./executionGraph"; -import { ResultsAccumulator, VertexVisitResult } from "./graph"; +import type { ExecutionContext } from "./deployment"; +import type { + ExecutionResultsAccumulator, + ExecutionVertex, + ExecutionVertexVisitResult, +} from "./executionGraph"; export type BatcherResult = | { _kind: "success"; - context: Map; + context: Map; } | { _kind: "failure"; @@ -14,6 +17,6 @@ export type BatcherResult = export type ExecutionVertexDispatcher = ( vertex: ExecutionVertex, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ExecutionResultsAccumulator, context: ExecutionContext -) => Promise; +) => Promise; diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index bae2b79c15..bf95ae62f0 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -1,4 +1,4 @@ -import type { BigNumber } from "ethers"; +import type { BigNumber, ethers } from "ethers"; import { LibraryMap } from "./deploymentGraph"; import { @@ -7,7 +7,13 @@ import { DeploymentGraphFuture, EventParamFuture, } from "./future"; -import { AdjacencyList, VertexDescriptor } from "./graph"; +import { + AdjacencyList, + ResultsAccumulator, + VertexDescriptor, + VertexVisitResult, + VisitResult, +} from "./graph"; import { Artifact } from "./hardhat"; export interface IExecutionGraph { @@ -80,3 +86,53 @@ export interface SentETH extends VertexDescriptor { address: AddressResolvable; value: BigNumber; } + +export interface ContractDeploySuccess { + name: string; + abi: any[]; + bytecode: string; + address: string; + value: ethers.BigNumber; +} + +export interface DeployedContractSuccess { + name: string; + abi: any[]; + address: string; +} + +export interface LibraryDeploySuccess { + name: string; + abi: any[]; + bytecode: string; + address: string; +} + +export interface AwaitedEventSuccess { + topics: ethers.utils.Result; +} + +export interface ContractCallSuccess { + hash: string; +} + +export interface SendETHSuccess { + hash: string; + value: ethers.BigNumber; +} + +export type VertexVisitResultSuccessResult = + | ContractDeploySuccess + | DeployedContractSuccess + | LibraryDeploySuccess + | AwaitedEventSuccess + | ContractCallSuccess + | SendETHSuccess; + +export type ExecutionVertexVisitResult = + VertexVisitResult; + +export type ExecutionResultsAccumulator = + ResultsAccumulator; + +export type ExecutionVisitResult = VisitResult; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 8ee80652b5..772eaee4bb 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -1,4 +1,4 @@ -import { Artifact } from "./hardhat"; +import type { Artifact } from "./hardhat"; export interface HardhatContract { vertexId: number; diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index 2407ddb5ec..81dd8a2d7b 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -15,29 +15,35 @@ export interface IGraph { export type VertexGraph = IGraph; -export interface VertexVisitResultSuccess { - _kind: "success"; - result: any; +export enum VertexResultEnum { + SUCCESS = "success", + FAILURE = "failure", + HOLD = "hold", +} + +export interface VertexVisitResultSuccess { + _kind: VertexResultEnum.SUCCESS; + result: T; } export interface VertexVisitResultFailure { - _kind: "failure"; + _kind: VertexResultEnum.FAILURE; failure: Error; } export interface VertexVisitResultHold { - _kind: "hold"; + _kind: VertexResultEnum.HOLD; } -export type VertexVisitResult = - | VertexVisitResultSuccess +export type VertexVisitResult = + | VertexVisitResultSuccess | VertexVisitResultFailure | VertexVisitResultHold; -export type VisitResult = +export type VisitResult = | { _kind: "success"; - result: ResultsAccumulator; + result: ResultsAccumulator; } | { _kind: "failure"; @@ -48,4 +54,4 @@ export type VisitResult = holds: VertexDescriptor[]; }; -export type ResultsAccumulator = Map; +export type ResultsAccumulator = Map | null>; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index aa55f51621..b74190a958 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,18 +1,29 @@ -import type { ExternalParamValue, Subgraph } from "./deploymentGraph"; +import type { ExternalParamValue, IDeploymentBuilder } from "./deploymentGraph"; import type { - CallableFuture, - EventFuture, + ContractFuture, FutureDict, + LibraryFuture, ProxyFuture, Virtual, } from "./future"; -export interface ModuleDict extends FutureDict { - [key: string]: CallableFuture | Virtual | ProxyFuture | EventFuture; +export type ModuleReturnValue = + | ContractFuture + | LibraryFuture + | Virtual + | ProxyFuture; + +export interface ModuleDict { + [key: string]: ModuleReturnValue; } export type Module = Subgraph; +export interface Subgraph { + name: string; + action: (builder: IDeploymentBuilder) => T; +} + export interface ModuleData { result: Virtual & ModuleDict; optionsHash: string; diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 6fd6d197a7..06e1e6b3b3 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -1,28 +1,11 @@ -import type { ethers } from "ethers"; +import type { ModuleDict } from "./module"; -export type SerializedFutureResult = - | { _kind: "string"; value: string } - | { _kind: "number"; value: number } - | { _kind: "contract"; value: Contract } - | { _kind: "tx"; value: Tx } - | { _kind: "event"; value: Event }; - -export interface SerializedDeploymentResult { - [key: string]: SerializedFutureResult; -} - -export type FutureOutput = string | number | Contract | Tx | Event; - -export interface Contract { +export interface ContractInfo { name: string; address: string; abi: any[]; } -export interface Tx { - hash: string; -} - -export interface Event { - topics: ethers.utils.Result; -} +export type SerializedDeploymentResult = { + [K in keyof T]: ContractInfo; +}; diff --git a/packages/core/src/types/validation.ts b/packages/core/src/types/validation.ts new file mode 100644 index 0000000000..1eaf9e2b97 --- /dev/null +++ b/packages/core/src/types/validation.ts @@ -0,0 +1,7 @@ +import { ResultsAccumulator, VertexVisitResult, VisitResult } from "./graph"; + +export type ValidationVisitResult = VisitResult; + +export type ValidationVertexVisitResult = VertexVisitResult; + +export type ValidationResultsAccumulator = ResultsAccumulator; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 2e47e08680..16760a52f3 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -24,6 +24,7 @@ import type { ContractFuture, } from "types/future"; import { Artifact } from "types/hardhat"; +import { ModuleDict } from "types/module"; import { IgnitionError } from "./errors"; @@ -146,6 +147,28 @@ export function isContract( return future.type === "contract"; } +export function isLibrary( + future: DeploymentGraphFuture +): future is ContractFuture { + if (isProxy(future)) { + return isLibrary(future.value); + } + + return future.type === "library"; +} + +export function assertModuleReturnTypes(moduleResult: T) { + for (const future of Object.values(moduleResult)) { + if (isContract(future) || isLibrary(future)) { + continue; + } + + throw new IgnitionError( + `Cannot return Future of type "${future.type}" from a module` + ); + } +} + export function assertUnknownDeploymentVertexType( deploymentVertex: never ): never { diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/utils/serialize.ts index 74874cbdc6..1c70106eb2 100644 --- a/packages/core/src/utils/serialize.ts +++ b/packages/core/src/utils/serialize.ts @@ -1,42 +1,5 @@ import { serializeError } from "serialize-error"; -import { FutureOutput, SerializedFutureResult } from "types/serialization"; - -import { IgnitionError } from "./errors"; - -export function serializeFutureOutput(x: FutureOutput): SerializedFutureResult { - if (typeof x === "string") { - return { _kind: "string" as const, value: x }; - } else if (typeof x === "number") { - return { _kind: "number" as const, value: x }; - } else if ("address" in x) { - return { _kind: "contract" as const, value: x }; - } else if ("hash" in x) { - return { _kind: "tx" as const, value: x }; - } else if ("topics" in x) { - return { _kind: "event" as const, value: x }; - } - - const exhaustiveCheck: never = x; - throw new IgnitionError(`Unexpected serialization type ${exhaustiveCheck}`); -} - -export function deserializeFutureOutput(x: any) { - if (x === null || x === undefined) { - throw new IgnitionError( - "[deserializeFutureOutput] value is null or undefined" - ); - } - - if (!("_kind" in x)) { - throw new IgnitionError( - "[deserializeFutureOutput] value was not serialized by Ignition" - ); - } - - return x.value; -} - /** * When stringifying core state, use this as the replacer. */ diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 369d3a36d1..6dc38dcb59 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -1,7 +1,7 @@ import type { Services } from "services/types"; import { InternalParamValue } from "types/deploymentGraph"; import type { CallableFuture } from "types/future"; -import { VertexVisitResultFailure } from "types/graph"; +import { VertexResultEnum, VertexVisitResultFailure } from "types/graph"; import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isBytesArg } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; @@ -69,7 +69,7 @@ export async function validateBytesForArtifact( } return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new InvalidArtifactError(bytesArgs[bytesDoesNotExistIndex].label), }; } diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index 24c2a9bc5c..ef18faf901 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -2,7 +2,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isArtifact, isParameter } from "utils/guards"; @@ -10,12 +14,12 @@ import { validateBytesForArtifact } from "./helpers"; export async function validateArtifactContract( vertex: ArtifactContractDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, _context: { services: Services } -): Promise { +): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new IgnitionError(`For contract 'value' must be a BigNumber`), }; } @@ -33,7 +37,7 @@ export async function validateArtifactContract( if (!artifactExists) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new InvalidArtifactError(vertex.label), }; } @@ -45,15 +49,15 @@ export async function validateArtifactContract( if (argsLength !== expectedArgsLength) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `The constructor of the contract '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` ), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 326c4c6e16..3cc15afa4a 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -2,16 +2,21 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { ArtifactLibraryDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; +import { IgnitionError } from "utils/errors"; import { isArtifact } from "utils/guards"; import { validateBytesForArtifact } from "./helpers"; export async function validateArtifactLibrary( vertex: ArtifactLibraryDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, _context: { services: Services } -): Promise { +): Promise { const invalidBytes = await validateBytesForArtifact( vertex.args, _context.services @@ -25,8 +30,10 @@ export async function validateArtifactLibrary( if (!artifactExists) { return { - _kind: "failure", - failure: new Error(`Artifact not provided for library '${vertex.label}'`), + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( + `Artifact not provided for library '${vertex.label}'` + ), }; } @@ -37,15 +44,15 @@ export async function validateArtifactLibrary( if (argsLength !== expectedArgsLength) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `The constructor of the library '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` ), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 24c82d9ee8..4fdfaa206a 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -2,7 +2,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; @@ -13,12 +17,12 @@ import { export async function validateCall( vertex: CallDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, context: { services: Services } -): Promise { +): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new IgnitionError(`For call 'value' must be a BigNumber`), }; } @@ -41,7 +45,7 @@ export async function validateCall( if (artifactAbi === undefined) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new InvalidArtifactError(contractName), }; } @@ -60,8 +64,8 @@ export async function validateCall( if (functionFragments.length === 0) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Contract '${contractName}' doesn't have a function ${vertex.method}` ), }; @@ -74,15 +78,15 @@ export async function validateCall( if (matchingFunctionFragments.length === 0) { if (functionFragments.length === 1) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given` ), }; } else { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments` ), }; @@ -90,7 +94,7 @@ export async function validateCall( } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 9d2d152563..20d9e369c7 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -2,24 +2,29 @@ import { isAddress } from "@ethersproject/address"; import { Services } from "services/types"; import { DeployedContractDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; +import { IgnitionError } from "utils/errors"; export async function validateDeployedContract( vertex: DeployedContractDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, _context: { services: Services } -): Promise { +): Promise { if (typeof vertex.address === "string" && !isAddress(vertex.address)) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `The existing contract ${vertex.label} has an invalid address ${vertex.address}` ), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateEvent.ts b/packages/core/src/validation/dispatch/validateEvent.ts index 3ef1cceade..fd66c14413 100644 --- a/packages/core/src/validation/dispatch/validateEvent.ts +++ b/packages/core/src/validation/dispatch/validateEvent.ts @@ -2,7 +2,12 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { EventVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; +import { IgnitionError } from "utils/errors"; import { resolveArtifactForCallableFuture, @@ -11,9 +16,9 @@ import { export async function validateEvent( vertex: EventVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, context: { services: Services } -): Promise { +): Promise { const invalidBytes = await validateBytesForArtifact( vertex.args, context.services @@ -27,8 +32,8 @@ export async function validateEvent( if (typeof vertex.address === "string") { if (!ethers.utils.isAddress(vertex.address)) { return { - _kind: "failure", - failure: new Error(`Invalid address ${vertex.address}`), + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError(`Invalid address ${vertex.address}`), }; } @@ -41,8 +46,8 @@ export async function validateEvent( if (artifactAbi === undefined) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Artifact with name '${vertex.address.label}' doesn't exist` ), }; @@ -65,8 +70,8 @@ export async function validateEvent( const contractName = vertex.label.split("/")[0]; return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Contract '${contractName}' doesn't have an event ${vertex.event}` ), }; @@ -81,15 +86,15 @@ export async function validateEvent( const contractName = vertex.label.split("/")[0]; return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` ), }; } else { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `Event ${vertex.event} in contract is overloaded, but no overload expects ${argsLength} arguments` ), }; @@ -97,7 +102,7 @@ export async function validateEvent( } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 11dc23dafc..8ed94a794c 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -2,7 +2,11 @@ import { ethers, BigNumber } from "ethers"; import { Services } from "services/types"; import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; @@ -10,12 +14,12 @@ import { validateBytesForArtifact } from "./helpers"; export async function validateHardhatContract( vertex: HardhatContractDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, { services }: { services: Services } -): Promise { +): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new IgnitionError(`For contract 'value' must be a BigNumber`), }; } @@ -32,7 +36,7 @@ export async function validateHardhatContract( if (!artifactExists) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new InvalidArtifactError(vertex.contractName), }; } @@ -45,15 +49,15 @@ export async function validateHardhatContract( if (argsLength !== expectedArgsLength) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `The constructor of the contract '${vertex.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` ), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index 75b052bc96..dafcd19450 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -2,16 +2,20 @@ import { ethers } from "ethers"; import { Services } from "services/types"; import { HardhatLibraryDeploymentVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; -import { InvalidArtifactError } from "utils/errors"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; +import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { validateBytesForArtifact } from "./helpers"; export async function validateHardhatLibrary( vertex: HardhatLibraryDeploymentVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, { services }: { services: Services } -): Promise { +): Promise { const invalidBytes = await validateBytesForArtifact(vertex.args, services); if (invalidBytes !== null) { @@ -24,7 +28,7 @@ export async function validateHardhatLibrary( if (!artifactExists) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new InvalidArtifactError(vertex.libraryName), }; } @@ -37,15 +41,15 @@ export async function validateHardhatLibrary( if (argsLength !== expectedArgsLength) { return { - _kind: "failure", - failure: new Error( + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError( `The constructor of the library '${vertex.libraryName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` ), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/validation/dispatch/validateSendETH.ts index 99522f85ae..170927ca7e 100644 --- a/packages/core/src/validation/dispatch/validateSendETH.ts +++ b/packages/core/src/validation/dispatch/validateSendETH.ts @@ -1,17 +1,21 @@ import { ethers, BigNumber } from "ethers"; import { SendVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; import { IgnitionError } from "utils/errors"; import { isParameter } from "utils/guards"; export async function validateSendETH( vertex: SendVertex, - _resultAccumulator: ResultsAccumulator -): Promise { + _resultAccumulator: ValidationResultsAccumulator +): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { return { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new IgnitionError(`For send 'value' must be a BigNumber`), }; } @@ -21,13 +25,13 @@ export async function validateSendETH( !ethers.utils.isAddress(vertex.address) ) { return { - _kind: "failure", - failure: new Error(`"${vertex.address}" is not a valid address`), + _kind: VertexResultEnum.FAILURE, + failure: new IgnitionError(`"${vertex.address}" is not a valid address`), }; } return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index d833006215..3df1076964 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,14 +1,18 @@ import { Services } from "services/types"; import { DeploymentGraphVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { VertexResultEnum } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; export async function validateVirtual( _deploymentVertex: DeploymentGraphVertex, - _resultAccumulator: ResultsAccumulator, + _resultAccumulator: ValidationResultsAccumulator, _context: { services: Services } -): Promise { +): Promise { return { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: undefined, }; } diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 226e0a37e3..c8ee0d77c1 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,6 +1,9 @@ import { Services } from "services/types"; import { DeploymentGraphVertex } from "types/deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult } from "types/graph"; +import { + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "types/validation"; import { assertUnknownDeploymentVertexType } from "utils/guards"; import { validateArtifactContract } from "./validateArtifactContract"; @@ -15,9 +18,9 @@ import { validateVirtual } from "./validateVirtual"; export function validationDispatch( deploymentVertex: DeploymentGraphVertex, - resultAccumulator: ResultsAccumulator, + resultAccumulator: ValidationResultsAccumulator, context: { services: Services } -): Promise { +): Promise { switch (deploymentVertex.type) { case "ArtifactContract": return validateArtifactContract( diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts index 32a9462b79..3cbcf000d0 100644 --- a/packages/core/src/validation/validateDeploymentGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -2,7 +2,7 @@ import { getSortedVertexIdsFrom } from "graph/utils"; import { visit } from "graph/visit"; import { Services } from "services/types"; import { IDeploymentGraph } from "types/deploymentGraph"; -import { VertexVisitResult, VisitResult } from "types/graph"; +import { ValidationVisitResult } from "types/validation"; import { IgnitionError } from "utils/errors"; import { validationDispatch } from "./dispatch/validationDispatch"; @@ -10,7 +10,7 @@ import { validationDispatch } from "./dispatch/validationDispatch"; export async function validateDeploymentGraph( deploymentGraph: IDeploymentGraph, services: Services -): Promise { +): Promise { try { const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); @@ -19,7 +19,7 @@ export async function validateDeploymentGraph( orderedVertexIds, deploymentGraph, { services }, - new Map(), + new Map(), validationDispatch ); } catch (err) { diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index a0dfd5dc11..2d20204104 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { buildModule } from "dsl/buildModule"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IgnitionError } from "utils/errors"; describe("deployment builder - buildModule", () => { it("should throw if build module is given an async callback", () => { @@ -20,7 +21,7 @@ describe("deployment builder - buildModule", () => { it("should throw if build module throws an exception", () => { assert.throws(() => { const badAsyncModule = buildModule("BadAsyncModule", () => { - throw new Error("User thrown error"); + throw new IgnitionError("User thrown error"); }); return generateDeploymentGraphFrom(badAsyncModule, { diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index ff860bf50b..c3af5b9e63 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -490,7 +490,8 @@ describe("deployment builder - useModule", () => { }); }); - describe("returning non contract/library futures from within a module", () => { + describe("returning non contract futures from within a module", () => { + // @ts-ignore let returnsWrongFutureTypeModule: Module<{ token: CallableFuture | Virtual | ProxyFuture | EventFuture; }>; @@ -526,6 +527,7 @@ describe("deployment builder - useModule", () => { it("should throw", () => { assert.throws( () => + // @ts-ignore generateDeploymentGraphFrom(returnsWrongFutureTypeModule, { chainId: 31, }), diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index deb34034b4..010bf258e3 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -5,8 +5,12 @@ import { BigNumber } from "ethers"; import { Deployment } from "deployment/Deployment"; import { ExecutionGraph } from "execution/ExecutionGraph"; import { executeInBatches } from "execution/execute"; -import { ContractDeploy, ExecutionVertex } from "types/executionGraph"; -import { VertexVisitResult } from "types/graph"; +import type { + ContractDeploy, + ExecutionVertex, + ExecutionVertexVisitResult, +} from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { ICommandJournal } from "types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; @@ -48,8 +52,8 @@ describe("Execution - batching", () => { const result = await executeInBatches( deployment, executionGraph, - async (): Promise => { - return { _kind: "success", result: true }; + async (): Promise => { + return { _kind: VertexResultEnum.SUCCESS, result: {} as any }; }, {} as any ); diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 062c2201e0..43193e2b5e 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -8,6 +8,7 @@ import { ExecutionGraph } from "execution/ExecutionGraph"; import { execute } from "execution/execute"; import { Services, TransactionOptions } from "services/types"; import { ExecutionVertex } from "types/executionGraph"; +import { VertexResultEnum } from "types/graph"; import { Artifact } from "types/hardhat"; import { ICommandJournal } from "types/journal"; @@ -73,7 +74,7 @@ describe("Execution - dispatch", () => { } assert.deepStrictEqual(response.result.get(0), { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { abi: [], address: "0xAddr", @@ -133,7 +134,7 @@ describe("Execution - dispatch", () => { } assert.deepStrictEqual(response.result.get(0), { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { abi: [], address: "0xAddr", @@ -234,7 +235,7 @@ describe("Execution - dispatch", () => { } assert.deepStrictEqual(response.result.get(1), { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { hash: "0x2", }, @@ -366,7 +367,7 @@ describe("Execution - dispatch", () => { } assert.deepStrictEqual(response.result.get(2), { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { topics: ["0x0000000000000000000000000000000000000003"], }, @@ -421,7 +422,7 @@ describe("Execution - dispatch", () => { } assert.deepStrictEqual(response.result.get(0), { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { name: "Foo", abi: [], diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 3210a9ca84..011a5e5284 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -104,7 +104,7 @@ describe("Reruning execution", () => { it("should record complete on first run", async () => { // Act - const [result] = await ignition.deploy(myModule, {} as any); + const result = await ignition.deploy(myModule, {} as any); // Assert assert.equal(result._kind, "success"); @@ -118,7 +118,7 @@ describe("Reruning execution", () => { await ignition.deploy(myModule, {} as any); // Act - const [redeployResult] = await ignition.deploy(myModule, {} as any); + const redeployResult = await ignition.deploy(myModule, {} as any); // Assert assert.equal(redeployResult._kind, "success"); @@ -135,12 +135,12 @@ describe("Reruning execution", () => { return assert.fail("Not a successful deploy"); } - if (redeployResult.result.token._kind !== "contract") { + if (!redeployResult.result.token.address) { return assert.fail("Unable to retrieve the token contract result"); } assert.equal( - redeployResult.result.token.value.address, + redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); @@ -150,7 +150,7 @@ describe("Reruning execution", () => { await ignition.deploy(myModule, {} as any); // Act - const [redeployResult] = await ignition.deploy(myModule, { + const redeployResult = await ignition.deploy(myModule, { force: true, } as any); @@ -231,7 +231,7 @@ describe("Reruning execution", () => { it("should record hold on first run", async () => { // Act - const [result] = await ignition.deploy(myModule, {} as any); + const result = await ignition.deploy(myModule, {} as any); // Assert assert.equal(result._kind, "hold"); @@ -252,7 +252,7 @@ describe("Reruning execution", () => { await ignition.deploy(myModule, {} as any); // Act - const [redeployResult] = await ignition.deploy(myModule, {} as any); + const redeployResult = await ignition.deploy(myModule, {} as any); // Assert // only the original two transactions, no more @@ -265,12 +265,12 @@ describe("Reruning execution", () => { return assert.fail("Not a successful deploy"); } - if (redeployResult.result.token._kind !== "contract") { + if (!redeployResult.result.token.address) { return assert.fail("Unable to retrieve the token contract result"); } assert.equal( - redeployResult.result.token.value.address, + redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); @@ -294,7 +294,7 @@ describe("Reruning execution", () => { journal: new MemoryCommandJournal(), }); - const [result] = await ignition.deploy(myModule, {} as any); + const result = await ignition.deploy(myModule, {} as any); assert.equal(result._kind, "hold"); }); @@ -357,7 +357,7 @@ describe("Reruning execution", () => { it("should record fail on first run", async () => { // Act - const [result] = await ignition.deploy(myModule, {} as any); + const result = await ignition.deploy(myModule, {} as any); // Assert assert.equal(result._kind, "failure"); @@ -383,7 +383,7 @@ describe("Reruning execution", () => { await ignition.deploy(myModule, {} as any); // Act - const [redeployResult] = await ignition.deploy(myModule, {} as any); + const redeployResult = await ignition.deploy(myModule, {} as any); // Assert // the second transaction is successfully sent @@ -394,12 +394,12 @@ describe("Reruning execution", () => { return assert.fail("Not a successful deploy"); } - if (redeployResult.result.token._kind !== "contract") { + if (!redeployResult.result.token.address) { return assert.fail("Unable to retrieve the token contract result"); } assert.equal( - redeployResult.result.token.value.address, + redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" ); }); @@ -425,7 +425,7 @@ describe("Reruning execution", () => { await ignition.deploy(someModule, {} as any); // Act - const [modifiedResult] = await ignition.deploy(modifiedModule, {} as any); + const modifiedResult = await ignition.deploy(modifiedModule, {} as any); // Assert // the second transaction is not sent diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index ccba39c9a5..323e125987 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -7,6 +7,7 @@ import { } from "deployment/deployStateReducer"; import { buildModule } from "dsl/buildModule"; import { DeployState } from "types/deployment"; +import { VertexResultEnum } from "types/graph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; @@ -122,8 +123,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, ]); @@ -135,8 +136,8 @@ describe("deployment state reducer", () => { assert.deepStrictEqual(state.execution.vertexes[0], { status: "COMPLETED", result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }); }); @@ -158,8 +159,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, ]); @@ -170,8 +171,8 @@ describe("deployment state reducer", () => { assert.deepStrictEqual(state.execution.vertexes[0], { status: "COMPLETED", result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }); }); @@ -194,8 +195,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, @@ -207,16 +208,16 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 1, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 2, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, @@ -228,8 +229,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 3, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, ]); @@ -268,8 +269,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, @@ -281,7 +282,7 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 1, result: { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }, }, ]); @@ -318,8 +319,8 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", - result: { someValue: "example" }, + _kind: VertexResultEnum.SUCCESS, + result: { hash: "example" }, }, }, @@ -331,7 +332,7 @@ describe("deployment state reducer", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 1, result: { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new Error("No connection"), }, }, @@ -348,7 +349,7 @@ describe("deployment state reducer", () => { assert.deepStrictEqual(state.execution.vertexes[1], { status: "FAILED", result: { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: new Error("No connection"), }, }); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 7b6fb734db..3e9f61666f 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -8,8 +8,9 @@ import { createServices, ICommandJournal, IgnitionError, + SerializedDeploymentResult, } from "@ignored/ignition-core"; -import { Contract, ethers } from "ethers"; +import type { Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; @@ -17,9 +18,9 @@ import { initializeRenderState, renderToCli } from "./ui/renderToCli"; type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; -interface DeployResult { - [key: string]: string | number | Contract | ethers.utils.Result; -} +type DeployResult = { + [K in keyof T]: Contract; +}; export class IgnitionWrapper { constructor( @@ -40,7 +41,7 @@ export class IgnitionWrapper { journal?: ICommandJournal; force?: boolean; } - ): Promise { + ): Promise> { const showUi = deployParams?.ui ?? false; const force = deployParams?.force ?? false; @@ -63,7 +64,7 @@ export class IgnitionWrapper { await this._providers.config.setParams(deployParams.parameters); } - const [deploymentResult] = await ignition.deploy(ignitionModule, { + const deploymentResult = await ignition.deploy(ignitionModule, { ...this._deployOptions, force, }); @@ -94,31 +95,7 @@ export class IgnitionWrapper { ); } - const resolvedOutput: { - [key: string]: string | number | Contract | ethers.utils.Result; - } = {}; - for (const [key, serializedFutureResult] of Object.entries( - deploymentResult.result - )) { - if ( - serializedFutureResult._kind === "string" || - serializedFutureResult._kind === "number" - ) { - resolvedOutput[key] = serializedFutureResult.value; - } else if (serializedFutureResult._kind === "tx") { - resolvedOutput[key] = serializedFutureResult.value.hash; - } else if (serializedFutureResult._kind === "event") { - resolvedOutput[key] = serializedFutureResult.value.topics; - } else { - const { abi, address } = serializedFutureResult.value; - - const contract: any = await this._ethers.getContractAt(abi, address); - contract.abi = abi; - resolvedOutput[key] = contract; - } - } - - return resolvedOutput; + return this._toDeploymentResult(deploymentResult.result); } public async plan(ignitionModule: Module) { @@ -128,4 +105,18 @@ export class IgnitionWrapper { return ignition.plan(ignitionModule); } + + private async _toDeploymentResult( + serializedDeploymentResult: SerializedDeploymentResult + ): Promise> { + const resolvedOutput: { [k: string]: Contract } = {}; + + for (const [key, { abi, address }] of Object.entries( + serializedDeploymentResult + )) { + resolvedOutput[key] = await this._ethers.getContractAt(abi, address); + } + + return resolvedOutput as DeployResult; + } } diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 50f3c3c8a5..3ed26c16eb 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -34,7 +34,7 @@ export function loadModule( const module = require(fullpathToModule); - return module; + return module.default ?? module; } function resolveFullPathToModule( diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 6b18174fd1..30b62a8642 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -1,5 +1,8 @@ /* eslint-disable import/no-unused-modules */ -import { DeployStateExecutionCommand } from "@ignored/ignition-core"; +import { + DeployStateExecutionCommand, + VertexResultEnum, +} from "@ignored/ignition-core"; import { assert } from "chai"; import { BigNumber } from "ethers"; import fs from "fs"; @@ -25,7 +28,7 @@ describe("File based command journal", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 0, result: { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { name: "Example", abi: [ @@ -50,7 +53,7 @@ describe("File based command journal", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 1, result: { - _kind: "success", + _kind: VertexResultEnum.SUCCESS, result: { hash: "0x7058ee5c5c027de2480a3d559695d0a1311763c5dcb3d301ee1203cc44a9031d", }, @@ -60,7 +63,7 @@ describe("File based command journal", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 2, result: { - _kind: "failure", + _kind: VertexResultEnum.FAILURE, failure: {} as any, // new Error("Example Error"), }, }, @@ -68,7 +71,7 @@ describe("File based command journal", () => { type: "EXECUTION::SET_VERTEX_RESULT", vertexId: 3, result: { - _kind: "hold", + _kind: VertexResultEnum.HOLD, }, }, ]; diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index a6cc735cd8..e878a00b27 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -10,6 +10,11 @@ describe("existing contract", () => { it("should be able to use an existing contract", async function () { await this.hre.run("compile", { quiet: true }); + const { abi: barAbi } = await this.hre.artifacts.readArtifact("Bar"); + const { abi: usesContractAbi } = await this.hre.artifacts.readArtifact( + "UsesContract" + ); + const firstResult = await deployModule(this.hre, (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", { @@ -22,9 +27,7 @@ describe("existing contract", () => { assert.isDefined(firstResult.bar.address); assert.isDefined(firstResult.usesContract.address); const barAddress: string = firstResult.bar.address; - const barAbi: any[] = firstResult.bar.abi; const usesContractAddress: string = firstResult.usesContract.address; - const usesContractAbi: any[] = firstResult.usesContract.abi; const result = await deployModule(this.hre, (m) => { const bar = m.contractAt("Bar", barAddress, barAbi); diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 349d58e287..e278f01004 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,5 +1,4 @@ import { - SerializedFutureResult, SerializedDeploymentResult, DeploymentResult, Module, @@ -43,9 +42,9 @@ type ExpectedDeploymentState = Record; * result of each future is of the correct type, and it can also run * some custom predicate logic on the result to further verify it. */ -export async function assertDeploymentState( +export async function assertDeploymentState( hre: any, - result: SerializedDeploymentResult, + result: SerializedDeploymentResult, expectedResult: ExpectedDeploymentState ) { const modulesResults = Object.entries(result); @@ -114,10 +113,10 @@ export async function deployModules( hre: any, userModules: Array>, expectedBlocks: number[] -): Promise { +): Promise> { await hre.run("compile", { quiet: true }); - const deploymentResultPromise: Promise = hre.run( + const deploymentResultPromise: Promise> = hre.run( "deploy:deploy-modules", { userModules, @@ -180,7 +179,7 @@ async function waitForPendingTxs( } } -async function assertContract(hre: any, futureResult: SerializedFutureResult) { +async function assertContract(hre: any, futureResult: any) { if (futureResult._kind !== "contract") { assert.fail( `Expected future result to be a contract, but got ${futureResult._kind}` diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index fafee6c3c0..52a8de5a6b 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -22,12 +22,8 @@ describe("libraries", () => { }); assert.isDefined(result); - const math = result.rubbishMath; const contractThatDependsOnLib = result.dependsOnLib; - const addition = await math.add(1, 2); - assert.equal(addition, 3); - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( 1, 2, @@ -56,12 +52,8 @@ describe("libraries", () => { }); assert.isDefined(result); - const math = result.rubbishMath; const contractThatDependsOnLib = result.dependsOnLib; - const addition = await math.add(1, 2); - assert.equal(addition, 3); - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( 1, 2, diff --git a/packages/tsconfig.settings.json b/packages/tsconfig.settings.json index e2cebcc167..3bfe96ac4d 100644 --- a/packages/tsconfig.settings.json +++ b/packages/tsconfig.settings.json @@ -11,6 +11,7 @@ "esModuleInterop": true, "moduleResolution": "node", "declaration": true, + "declarationMap": true, "types": [], "sourceMap": true } From 145eeeef0e49721662b50f21c4ce5f5e888165f1 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 28 Feb 2023 11:49:37 -0300 Subject: [PATCH 0243/1302] Ignore Webstorm files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 4fe0e3b1f3..b5328776b2 100644 --- a/.gitignore +++ b/.gitignore @@ -136,3 +136,6 @@ dist # Custom workspace settings for VSCode .vscode/settings.json + +# Webstorm files +.idea/ From 3d709522972568e47d70de35f74cb29c00714004 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 2 Mar 2023 10:12:20 +0000 Subject: [PATCH 0244/1302] chore: bump version to v0.0.9 Update the packages versions and changelogs for the `0.0.9 - 2023-03-02` release. --- docs/publish.md | 29 ++++++++++++----------- examples/create2/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/multisig/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/uniswap/package.json | 4 ++-- package-lock.json | 35 ++++++++++++++-------------- package.json | 1 - packages/core/CHANGELOG.md | 7 ++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 11 +++++++++ packages/hardhat-plugin/package.json | 6 ++--- 13 files changed, 67 insertions(+), 48 deletions(-) diff --git a/docs/publish.md b/docs/publish.md index 01ffb7e8d2..8c6b924f5d 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -5,12 +5,15 @@ To publish ignition: 1. git fetch, Checkout out `main`, then ensure your branch is up to date `git pull --ff-only` 2. Run a full check, stopping on failure: `npm run fullcheck` 3. Create a release branch `git checkout -b release/yyyy-mm-dd` -4. Under `./packages/core`, update the package version based on semver if appropriate. -5. Under `./packages/hardhat-plugin`, update the package version based on semver if appropriate. -6. Update dependency package versions in examples to match -7. Update the `CHANGELOG.md` under `./packages/core`. -8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. -9. Commit the version update `git commit`: +4. Update the `CHANGELOG.md` under `./packages/core`. +5. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. +6. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` +7. Update the version of dependencies: + +- cores version in hardhat-ignition devDeps and peerDeps +- examples version of hardhat-ignition + +8. Commit the version update `git commit`: ``` chore: bump version to vX.X.X @@ -19,10 +22,10 @@ Update the packages versions and changelogs for the `X.X.X - yyyy-mm-dd` release. ``` -10. Push the release branch and open a pull request, the PR description should match the changelogs -11. On a successful check, `rebase merge` the release branch into main -12. Switch to main branch and pull the latest changes -13. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -14. Publish `core` if appropriate: `npm publish` -15. Publish `hardhat-plugin` if appropriate: `npm publish` -16. Create a release on github off of the pushed tag +9. Push the release branch and open a pull request, the PR description should match the changelogs +10. On a successful check, `rebase merge` the release branch into main +11. Switch to main branch and pull the latest changes +12. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +13. Publish `core` if appropriate: `npm publish` +14. Publish `hardhat-plugin` if appropriate: `npm publish` +15. Create a release on github off of the pushed tag diff --git a/examples/create2/package.json b/examples/create2/package.json index f2ce5e51b5..9f3b6ead1b 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-create2-example", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.8" + "@ignored/hardhat-ignition": "^0.0.9" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index a914bf7fed..dca5b1068c 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index e6b4f8d031..46cabbdba5 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-example-multisig", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index fad4e391cc..09e4bd0c51 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 407bbdb4dc..aae5815b4f 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index d82d91e8dc..74dfe11a64 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.1", + "version": "0.0.9", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/package-lock.json b/package-lock.json index 9068bacdd9..22794c377a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,11 @@ { "name": "root", - "version": "0.0.0", + "version": "0.0.10", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "root", - "version": "0.0.0", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "devDependencies": { "@typescript-eslint/eslint-plugin": "4.31.2", @@ -29,12 +28,12 @@ }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.1", + "version": "0.0.9", "dependencies": { "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "hardhat": "^2.10.0" } }, @@ -45,14 +44,14 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.1", + "version": "0.0.9", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -80,14 +79,14 @@ }, "examples/multisig": { "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.1", + "version": "0.0.9", "dependencies": { "@openzeppelin/contracts": "^4.3.2" }, "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -115,11 +114,11 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.1", + "version": "0.0.9", "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -147,11 +146,11 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.1", + "version": "0.0.9", "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -396,7 +395,7 @@ }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.1", + "version": "0.0.9", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -410,7 +409,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.8", + "@ignored/hardhat-ignition": "^0.0.9", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -18362,7 +18361,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.8", + "version": "0.0.9", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -18440,7 +18439,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.8", + "version": "0.0.9", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -18454,7 +18453,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.8", + "@ignored/ignition-core": "^0.0.9", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -18495,7 +18494,7 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.7", + "@ignored/ignition-core": "^0.0.9", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" } diff --git a/package.json b/package.json index f0c7442cb4..83a72ca669 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "name": "root", - "version": "0.0.0", "author": "Nomic Foundation", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 1757f637ab..00dd8e2bc2 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.9 - 2023-03-02 + +### Added + +- Support defining modules in typescript ([#101](https://github.com/NomicFoundation/ignition/issues/101)) +- Allow rerunning deployment while ignoring journal history through a `--force` flag ([#132](https://github.com/NomicFoundation/ignition/issues/132)) + ## 0.0.8 - 2023-02-16 ### Changed diff --git a/packages/core/package.json b/packages/core/package.json index dc44295954..853a256a4e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.8", + "version": "0.0.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index bebe0f4ddf..167900747d 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.9 - 2023-03-02 + +### Added + +- Support defining modules in typescript ([#101](https://github.com/NomicFoundation/ignition/issues/101)) +- Allow rerunning deployment while ignoring journal history through a `--force` flag ([#132](https://github.com/NomicFoundation/ignition/issues/132)) + +### Changed + +- Do not ask for confirmation when deploying to a hardhat node ([#134](https://github.com/NomicFoundation/ignition/issues/134)) + ## 0.0.8 - 2023-02-16 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index a76c2feaf7..d4c7bc2b8c 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.8", + "version": "0.0.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.8", + "@ignored/ignition-core": "^0.0.9", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -71,7 +71,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.7", + "@ignored/ignition-core": "^0.0.9", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 7315593333afa98f9f8a87f10514ee46b516eafa Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 2 Mar 2023 14:34:16 +0000 Subject: [PATCH 0245/1302] docs: update publish commands --- docs/publish.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/publish.md b/docs/publish.md index 8c6b924f5d..4d66c8a5c1 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -26,6 +26,5 @@ yyyy-mm-dd` release. 10. On a successful check, `rebase merge` the release branch into main 11. Switch to main branch and pull the latest changes 12. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -13. Publish `core` if appropriate: `npm publish` -14. Publish `hardhat-plugin` if appropriate: `npm publish` -15. Create a release on github off of the pushed tag +13. Publish `@ignored/ignition-core` and `@ignored/hardhat-ignition` : `npm publish -w @ignored/ignition-core -w @ignored/hardhat-ignition` +14. Create a release on github off of the pushed tag From e350384ee3e3d4c7485f737cdae37f10a1589680 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 8 Mar 2023 19:47:47 +0000 Subject: [PATCH 0246/1302] improvement: validation errors (#160) Show the file/line/column against each validation error. The display allows cmd+click in the vscode terminal. To support this we capture a potential validation error when the deployment builder action is called. These potential errors are passed to the validation phase, one for each vertex. If a validation check fails we use the pre-captured error so that the stack trace shows the correct point in the module. We have to do some magic in IgnitionValidationError. Firstly need to externally rewrite the stack via a function call `resetStackFrom`, this is because Hardhat Errors manipulate stack themselves. To allow calling a custom function on the error, we need to manipulate the prototype becasue ... javascript. Resolves #87. * fix: cover hh artifactExists bug Currently `artifactExists` is throwing on an artifact not existing. We apply a try/catch to cover the case. --- packages/core/src/Ignition.ts | 15 +- packages/core/src/dsl/DeploymentBuilder.ts | 59 +- packages/core/src/index.ts | 2 +- .../process/generateDeploymentGraphFrom.ts | 9 +- packages/core/src/types/deploymentGraph.ts | 4 + packages/core/src/types/validation.ts | 8 + packages/core/src/utils/errors.ts | 33 +- .../core/src/validation/dispatch/helpers.ts | 41 +- .../dispatch/validateArtifactContract.ts | 45 +- .../dispatch/validateArtifactLibrary.ts | 38 +- .../src/validation/dispatch/validateCall.ts | 66 +- .../dispatch/validateDeployedContract.ts | 18 +- .../src/validation/dispatch/validateEvent.ts | 75 ++- .../dispatch/validateHardhatContract.ts | 42 +- .../dispatch/validateHardhatLibrary.ts | 33 +- .../validation/dispatch/validateSendETH.ts | 25 +- .../validation/dispatch/validateVirtual.ts | 4 +- .../validation/dispatch/validationDispatch.ts | 6 +- .../src/validation/validateDeploymentGraph.ts | 5 +- packages/core/test/state-reducer/utils.ts | 1 + packages/core/test/validation.ts | 609 +++++------------- .../src/buildIgnitionProvidersFrom.ts | 8 +- .../hardhat-plugin/src/ignition-wrapper.ts | 8 +- .../ui/components/ValidationFailedPanel.tsx | 61 +- 24 files changed, 538 insertions(+), 677 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index f490aad362..42a2734983 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -136,7 +136,7 @@ export class Ignition { const chainId = await this._services.network.getChainId(); - const { graph: deploymentGraph } = generateDeploymentGraphFrom( + const { graph: deploymentGraph, callPoints } = generateDeploymentGraphFrom( deploymentModule, { chainId, @@ -145,6 +145,7 @@ export class Ignition { const validationResult = await validateDeploymentGraph( deploymentGraph, + callPoints, this._services ); @@ -171,14 +172,18 @@ export class Ignition { ignitionModule: Module ): Promise<{ result: any; moduleOutputs: T }> { log("Generate deployment graph from module"); - const { graph: deploymentGraph, moduleOutputs } = - generateDeploymentGraphFrom(ignitionModule, { - chainId: deployment.state.details.chainId, - }); + const { + graph: deploymentGraph, + callPoints, + moduleOutputs, + } = generateDeploymentGraphFrom(ignitionModule, { + chainId: deployment.state.details.chainId, + }); await deployment.startValidation(); const validationResult = await validateDeploymentGraph( deploymentGraph, + callPoints, deployment.services ); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 33d2f5edc2..3c88ac688a 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -14,6 +14,7 @@ import { ScopeData, AwaitOptions, SendOptions, + CallPoints, } from "types/deploymentGraph"; import type { DeploymentGraphFuture, @@ -42,7 +43,7 @@ import type { } from "types/future"; import type { Artifact } from "types/hardhat"; import type { ModuleCache, ModuleDict, Subgraph } from "types/module"; -import { IgnitionError } from "utils/errors"; +import { IgnitionError, IgnitionValidationError } from "utils/errors"; import { assertModuleReturnTypes, assertUnknownDeploymentVertexType, @@ -57,6 +58,15 @@ import { resolveProxyDependency } from "utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; +type DeploymentApiPublicFunctions = + | InstanceType["contract"] + | InstanceType["library"] + | InstanceType["contractAt"] + | InstanceType["call"] + | InstanceType["event"] + | InstanceType["sendETH"] + | InstanceType["useModule"]; + const DEFAULT_VALUE = ethers.utils.parseUnits("0"); function parseEventParams( @@ -86,7 +96,9 @@ function parseEventParams( export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; - public graph: IDeploymentGraph = new DeploymentGraph(); + public graph: IDeploymentGraph; + public callPoints: CallPoints; + private idCounter: number = 0; private moduleCache: ModuleCache = {}; private useSubgraphInvocationCounter: number = 0; @@ -94,7 +106,10 @@ export class DeploymentBuilder implements IDeploymentBuilder { constructor(options: DeploymentBuilderOptions) { this.chainId = options.chainId; + this.graph = new DeploymentGraph(); + this.callPoints = {}; } + public library( libraryName: string, options?: ContractOptions @@ -122,7 +137,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.library, { id: artifactContractFuture.vertexId, label: libraryName, type: "ArtifactLibrary", @@ -145,7 +160,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.library, { id: libraryFuture.vertexId, label: libraryName, type: "HardhatLibrary", @@ -186,7 +201,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contract, { id: artifactContractFuture.vertexId, label: contractName, type: "ArtifactContract", @@ -211,7 +226,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contract, { id: contractFuture.vertexId, label: contractName, type: "HardhatContract", @@ -243,7 +258,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contractAt, { id: deployedFuture.vertexId, label: contractName, type: "DeployedContract", @@ -295,7 +310,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.call, { id: callFuture.vertexId, label: callFuture.label, type: "Call", @@ -349,7 +364,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { eventFuture.params = parseEventParams(abi, eventFuture); - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.event, { id: eventFuture.vertexId, label: eventFuture.label, type: "Event", @@ -403,7 +418,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { address = sendTo; } - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.sendETH, { id: vertexId, label: sendFuture.label, type: "SendETH", @@ -515,20 +530,20 @@ export class DeploymentBuilder implements IDeploymentBuilder { label: string, after: DeploymentGraphFuture[] = [] ): Virtual { - const afterLabel = `${label}::before`; + const beforeLabel = `${label}::before`; const virtualFuture: Virtual = { vertexId: this._resolveNextId(), - label: afterLabel, + label: beforeLabel, type: "virtual", _future: true, }; const scopeLabel = this.scopes.getScopedLabel(); - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.useModule, { id: virtualFuture.vertexId, - label: afterLabel, + label: beforeLabel, type: "Virtual", after, scopeAdded: scopeLabel, @@ -552,7 +567,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { const scopeLabel = this.scopes.getScopedLabel(); - DeploymentBuilder._addVertex(this.graph, { + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.useModule, { id: virtualFuture.vertexId, label: afterLabel, type: "Virtual", @@ -567,10 +582,24 @@ export class DeploymentBuilder implements IDeploymentBuilder { return this.idCounter++; } + private static _captureCallPoint( + callPoints: CallPoints, + f: DeploymentApiPublicFunctions, + vertexId: number + ) { + const potentialValidationError = new IgnitionValidationError(""); + potentialValidationError.resetStackFrom(f as any); + callPoints[vertexId] = potentialValidationError; + } + private static _addVertex( graph: DeploymentGraph, + callPoints: CallPoints, + f: DeploymentApiPublicFunctions, depNode: DeploymentGraphVertex ) { + DeploymentBuilder._captureCallPoint(callPoints, f, depNode.id); + graph.vertexes.set(depNode.id, depNode); ensureVertex(graph.adjacencyList, depNode.id); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index eada6d5ed9..476c8205e5 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,7 +4,7 @@ export { buildSubgraph } from "dsl/buildSubgraph"; export { viewExecutionResults } from "deployment/utils"; export { createServices } from "services/createServices"; export { serializeReplacer } from "utils/serialize"; -export { IgnitionError } from "utils/errors"; +export { IgnitionError, IgnitionValidationError } from "utils/errors"; export { TransactionsService } from "services/TransactionsService"; export { ContractsService } from "services/ContractsService"; export { VertexResultEnum } from "types/graph"; diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index 55d1ba98b8..6e646af763 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -1,5 +1,6 @@ import { DeploymentBuilder } from "dsl/DeploymentBuilder"; import type { + CallPoints, DeploymentBuilderOptions, IDeploymentGraph, } from "types/deploymentGraph"; @@ -10,7 +11,7 @@ import { assertModuleReturnTypes } from "utils/guards"; export function generateDeploymentGraphFrom( ignitionModule: Module, builderOptions: DeploymentBuilderOptions -): { graph: IDeploymentGraph; moduleOutputs: T } { +): { graph: IDeploymentGraph; callPoints: CallPoints; moduleOutputs: T } { const graphBuilder = new DeploymentBuilder(builderOptions); const moduleOutputs = ignitionModule.action(graphBuilder); @@ -23,7 +24,11 @@ export function generateDeploymentGraphFrom( assertModuleReturnTypes(moduleOutputs); - return { graph: graphBuilder.graph, moduleOutputs }; + return { + graph: graphBuilder.graph, + callPoints: graphBuilder.callPoints, + moduleOutputs, + }; } function isPromise(promise: any) { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 29e07d8db0..2bf3f13eba 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -233,3 +233,7 @@ export interface IDeploymentBuilder { export interface DeploymentBuilderOptions { chainId: number; } + +export interface CallPoints { + [key: number]: Error; +} diff --git a/packages/core/src/types/validation.ts b/packages/core/src/types/validation.ts index 1eaf9e2b97..dde65fa2c4 100644 --- a/packages/core/src/types/validation.ts +++ b/packages/core/src/types/validation.ts @@ -1,3 +1,6 @@ +import { Services } from "services/types"; + +import { CallPoints } from "./deploymentGraph"; import { ResultsAccumulator, VertexVisitResult, VisitResult } from "./graph"; export type ValidationVisitResult = VisitResult; @@ -5,3 +8,8 @@ export type ValidationVisitResult = VisitResult; export type ValidationVertexVisitResult = VertexVisitResult; export type ValidationResultsAccumulator = ResultsAccumulator; + +export interface ValidationDispatchContext { + services: Services; + callPoints: CallPoints; +} diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 98830932b5..5e3289a6ad 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,15 +1,40 @@ import { BigNumber } from "ethers"; import { HardhatPluginError } from "hardhat/plugins"; -export class InvalidArtifactError extends HardhatPluginError { - constructor(name: string) { - super("ignition", `Artifact with name '${name}' doesn't exist`); +export class IgnitionError extends HardhatPluginError { + constructor(message: string) { + super("ignition", message); } } -export class IgnitionError extends HardhatPluginError { +export class IgnitionValidationError extends HardhatPluginError { constructor(message: string) { super("ignition", message); + + // This is required to allow calls to `resetStackFrom`, + // otherwise the function is not available on the + // error instance + Object.setPrototypeOf(this, new.target.prototype); + } + + /** + * Reset the stack hiding parts that are bellow the given function. + * The intention is the function should be part of the user callable + * api, so that the stack leads directly to the line in the module + * the user called (i.e. `m.contract(...)`) + * + * This is a hack to workaround the stack manipulation + * that `HardhatPluginError` does. + * + * @param f the function to hide all of the stacktrace above + */ + public resetStackFrom(f: () => any) { + Error.captureStackTrace(this, f); + + // the base custom error from HH stores off the stack + // it uses to `_stack`, so we need to override this + // as well ... even though it is private. + (this as any)._stack = this.stack ?? ""; } } diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 6dc38dcb59..d30aec5d08 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -1,8 +1,12 @@ import type { Services } from "services/types"; -import { InternalParamValue } from "types/deploymentGraph"; +import { + CallPoints, + DeploymentGraphVertex, + InternalParamValue, +} from "types/deploymentGraph"; import type { CallableFuture } from "types/future"; import { VertexResultEnum, VertexVisitResultFailure } from "types/graph"; -import { IgnitionError, InvalidArtifactError } from "utils/errors"; +import { IgnitionError } from "utils/errors"; import { isBytesArg } from "utils/guards"; import { resolveProxyValue } from "utils/proxy"; @@ -52,11 +56,16 @@ export async function resolveArtifactForCallableFuture( } } -export async function validateBytesForArtifact( - args: InternalParamValue[], - services: Services -): Promise { - const bytesArgs = args.filter(isBytesArg); +export async function validateBytesForArtifact({ + vertex, + callPoints, + services, +}: { + vertex: DeploymentGraphVertex & { args: InternalParamValue[] }; + callPoints: CallPoints; + services: Services; +}): Promise { + const bytesArgs = vertex.args.filter(isBytesArg); const bytesExists = await Promise.all( bytesArgs.map((v) => services.artifacts.hasArtifact(v.label)) @@ -68,9 +77,25 @@ export async function validateBytesForArtifact( return null; } + return buildValidationError( + vertex, + `Artifact with name '${bytesArgs[bytesDoesNotExistIndex].label}' doesn't exist`, + callPoints + ); +} + +export function buildValidationError( + vertex: DeploymentGraphVertex, + message: string, + callPoints: CallPoints +): VertexVisitResultFailure { + const failure = callPoints[vertex.id] ?? new IgnitionError("-"); + + failure.message = message; + return { _kind: VertexResultEnum.FAILURE, - failure: new InvalidArtifactError(bytesArgs[bytesDoesNotExistIndex].label), + failure, }; } diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index ef18faf901..859d915d0b 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,33 +1,34 @@ import { ethers, BigNumber } from "ethers"; -import { Services } from "services/types"; import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isArtifact, isParameter } from "utils/guards"; -import { validateBytesForArtifact } from "./helpers"; +import { buildValidationError, validateBytesForArtifact } from "./helpers"; export async function validateArtifactContract( vertex: ArtifactContractDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - _context: { services: Services } + { callPoints, services }: ValidationDispatchContext ): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`For contract 'value' must be a BigNumber`), - }; + return buildValidationError( + vertex, + `For contract 'value' must be a BigNumber`, + callPoints + ); } - const invalidBytes = await validateBytesForArtifact( - vertex.args, - _context.services - ); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints, + services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -36,10 +37,11 @@ export async function validateArtifactContract( const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new InvalidArtifactError(vertex.label), - }; + return buildValidationError( + vertex, + `Artifact with name '${vertex.label}' doesn't exist`, + callPoints + ); } const argsLength = vertex.args.length; @@ -48,12 +50,11 @@ export async function validateArtifactContract( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `The constructor of the contract '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `The constructor of the contract '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 3cc15afa4a..37df717f5b 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,26 +1,26 @@ import { ethers } from "ethers"; -import { Services } from "services/types"; import { ArtifactLibraryDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError } from "utils/errors"; import { isArtifact } from "utils/guards"; -import { validateBytesForArtifact } from "./helpers"; +import { buildValidationError, validateBytesForArtifact } from "./helpers"; export async function validateArtifactLibrary( vertex: ArtifactLibraryDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - _context: { services: Services } + context: ValidationDispatchContext ): Promise { - const invalidBytes = await validateBytesForArtifact( - vertex.args, - _context.services - ); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints: context.callPoints, + services: context.services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -29,12 +29,11 @@ export async function validateArtifactLibrary( const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Artifact not provided for library '${vertex.label}'` - ), - }; + return buildValidationError( + vertex, + `Artifact not provided for library '${vertex.label}'`, + context.callPoints + ); } const argsLength = vertex.args.length; @@ -43,12 +42,11 @@ export async function validateArtifactLibrary( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `The constructor of the library '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `The constructor of the library '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + context.callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 4fdfaa206a..551eb2aa9c 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,16 +1,16 @@ import { ethers, BigNumber } from "ethers"; -import { Services } from "services/types"; import { CallDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; import { + buildValidationError, resolveArtifactForCallableFuture, validateBytesForArtifact, } from "./helpers"; @@ -18,19 +18,21 @@ import { export async function validateCall( vertex: CallDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - context: { services: Services } + context: ValidationDispatchContext ): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`For call 'value' must be a BigNumber`), - }; + return buildValidationError( + vertex, + `For call 'value' must be a BigNumber`, + context.callPoints + ); } - const invalidBytes = await validateBytesForArtifact( - vertex.args, - context.services - ); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints: context.callPoints, + services: context.services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -44,10 +46,11 @@ export async function validateCall( ); if (artifactAbi === undefined) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new InvalidArtifactError(contractName), - }; + return buildValidationError( + vertex, + `Artifact with name '${contractName}' doesn't exist`, + context.callPoints + ); } const argsLength = vertex.args.length; @@ -63,12 +66,11 @@ export async function validateCall( .concat(funcs); if (functionFragments.length === 0) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Contract '${contractName}' doesn't have a function ${vertex.method}` - ), - }; + return buildValidationError( + vertex, + `Contract '${contractName}' doesn't have a function ${vertex.method}`, + context.callPoints + ); } const matchingFunctionFragments = functionFragments.filter( @@ -77,19 +79,17 @@ export async function validateCall( if (matchingFunctionFragments.length === 0) { if (functionFragments.length === 1) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, + context.callPoints + ); } else { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments` - ), - }; + return buildValidationError( + vertex, + `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, + context.callPoints + ); } } diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 20d9e369c7..60542212f5 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,26 +1,26 @@ import { isAddress } from "@ethersproject/address"; -import { Services } from "services/types"; import { DeployedContractDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError } from "utils/errors"; + +import { buildValidationError } from "./helpers"; export async function validateDeployedContract( vertex: DeployedContractDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - _context: { services: Services } + { callPoints }: ValidationDispatchContext ): Promise { if (typeof vertex.address === "string" && !isAddress(vertex.address)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `The existing contract ${vertex.label} has an invalid address ${vertex.address}` - ), - }; + return buildValidationError( + vertex, + `The existing contract ${vertex.label} has an invalid address ${vertex.address}`, + callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateEvent.ts b/packages/core/src/validation/dispatch/validateEvent.ts index fd66c14413..1ee8494faf 100644 --- a/packages/core/src/validation/dispatch/validateEvent.ts +++ b/packages/core/src/validation/dispatch/validateEvent.ts @@ -1,15 +1,15 @@ import { ethers } from "ethers"; -import { Services } from "services/types"; import { EventVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError } from "utils/errors"; import { + buildValidationError, resolveArtifactForCallableFuture, validateBytesForArtifact, } from "./helpers"; @@ -17,12 +17,13 @@ import { export async function validateEvent( vertex: EventVertex, _resultAccumulator: ValidationResultsAccumulator, - context: { services: Services } + { callPoints, services }: ValidationDispatchContext ): Promise { - const invalidBytes = await validateBytesForArtifact( - vertex.args, - context.services - ); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints, + services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -31,26 +32,25 @@ export async function validateEvent( let artifactAbi: any[] | undefined; if (typeof vertex.address === "string") { if (!ethers.utils.isAddress(vertex.address)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`Invalid address ${vertex.address}`), - }; + return buildValidationError( + vertex, + `Invalid address ${vertex.address}`, + callPoints + ); } artifactAbi = vertex.abi; } else if (vertex.address.type === "contract") { - artifactAbi = await resolveArtifactForCallableFuture( - vertex.address, - context - ); + artifactAbi = await resolveArtifactForCallableFuture(vertex.address, { + services, + }); if (artifactAbi === undefined) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Artifact with name '${vertex.address.label}' doesn't exist` - ), - }; + return buildValidationError( + vertex, + `Contract with name '${vertex.address.label}' doesn't exist`, + callPoints + ); } } @@ -69,12 +69,11 @@ export async function validateEvent( if (eventFragments.length === 0) { const contractName = vertex.label.split("/")[0]; - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Contract '${contractName}' doesn't have an event ${vertex.event}` - ), - }; + return buildValidationError( + vertex, + `Contract '${contractName}' doesn't have an event ${vertex.event}`, + callPoints + ); } const matchingEventFragments = eventFragments.filter( @@ -85,19 +84,17 @@ export async function validateEvent( if (eventFragments.length === 1) { const contractName = vertex.label.split("/")[0]; - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given`, + callPoints + ); } else { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `Event ${vertex.event} in contract is overloaded, but no overload expects ${argsLength} arguments` - ), - }; + return buildValidationError( + vertex, + `Event ${vertex.event} in contract is overloaded, but no overload expects ${argsLength} arguments`, + callPoints + ); } } diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 8ed94a794c..7fcc28d568 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,30 +1,34 @@ import { ethers, BigNumber } from "ethers"; -import { Services } from "services/types"; import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError, InvalidArtifactError } from "utils/errors"; import { isParameter } from "utils/guards"; -import { validateBytesForArtifact } from "./helpers"; +import { buildValidationError, validateBytesForArtifact } from "./helpers"; export async function validateHardhatContract( vertex: HardhatContractDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - { services }: { services: Services } + { services, callPoints }: ValidationDispatchContext ): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`For contract 'value' must be a BigNumber`), - }; + return buildValidationError( + vertex, + `For contract 'value' must be a BigNumber`, + callPoints + ); } - const invalidBytes = await validateBytesForArtifact(vertex.args, services); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints, + services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -35,10 +39,11 @@ export async function validateHardhatContract( ); if (!artifactExists) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new InvalidArtifactError(vertex.contractName), - }; + return buildValidationError( + vertex, + `Contract with name '${vertex.contractName}' doesn't exist`, + callPoints + ); } const artifact = await services.artifacts.getArtifact(vertex.contractName); @@ -48,12 +53,11 @@ export async function validateHardhatContract( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `The constructor of the contract '${vertex.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `The constructor of the contract '${vertex.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index dafcd19450..11fcd03972 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,22 +1,25 @@ import { ethers } from "ethers"; -import { Services } from "services/types"; import { HardhatLibraryDeploymentVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError, InvalidArtifactError } from "utils/errors"; -import { validateBytesForArtifact } from "./helpers"; +import { buildValidationError, validateBytesForArtifact } from "./helpers"; export async function validateHardhatLibrary( vertex: HardhatLibraryDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - { services }: { services: Services } + { callPoints, services }: ValidationDispatchContext ): Promise { - const invalidBytes = await validateBytesForArtifact(vertex.args, services); + const invalidBytes = await validateBytesForArtifact({ + vertex, + callPoints, + services, + }); if (invalidBytes !== null) { return invalidBytes; @@ -27,10 +30,11 @@ export async function validateHardhatLibrary( ); if (!artifactExists) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new InvalidArtifactError(vertex.libraryName), - }; + return buildValidationError( + vertex, + `Library with name '${vertex.libraryName}' doesn't exist`, + callPoints + ); } const artifact = await services.artifacts.getArtifact(vertex.libraryName); @@ -40,12 +44,11 @@ export async function validateHardhatLibrary( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError( - `The constructor of the library '${vertex.libraryName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` - ), - }; + return buildValidationError( + vertex, + `The constructor of the library '${vertex.libraryName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, + callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/validation/dispatch/validateSendETH.ts index 170927ca7e..41e014b51b 100644 --- a/packages/core/src/validation/dispatch/validateSendETH.ts +++ b/packages/core/src/validation/dispatch/validateSendETH.ts @@ -3,31 +3,36 @@ import { ethers, BigNumber } from "ethers"; import { SendVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; -import { IgnitionError } from "utils/errors"; import { isParameter } from "utils/guards"; +import { buildValidationError } from "./helpers"; + export async function validateSendETH( vertex: SendVertex, - _resultAccumulator: ValidationResultsAccumulator + _resultAccumulator: ValidationResultsAccumulator, + { callPoints }: ValidationDispatchContext ): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`For send 'value' must be a BigNumber`), - }; + return buildValidationError( + vertex, + `For send 'value' must be a BigNumber`, + callPoints + ); } if ( typeof vertex.address === "string" && !ethers.utils.isAddress(vertex.address) ) { - return { - _kind: VertexResultEnum.FAILURE, - failure: new IgnitionError(`"${vertex.address}" is not a valid address`), - }; + return buildValidationError( + vertex, + `"${vertex.address}" is not a valid address`, + callPoints + ); } return { diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index 3df1076964..edeef8e407 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,7 +1,7 @@ -import { Services } from "services/types"; import { DeploymentGraphVertex } from "types/deploymentGraph"; import { VertexResultEnum } from "types/graph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; @@ -9,7 +9,7 @@ import { export async function validateVirtual( _deploymentVertex: DeploymentGraphVertex, _resultAccumulator: ValidationResultsAccumulator, - _context: { services: Services } + _context: ValidationDispatchContext ): Promise { return { _kind: VertexResultEnum.SUCCESS, diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index c8ee0d77c1..10091a9b84 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,6 +1,6 @@ -import { Services } from "services/types"; import { DeploymentGraphVertex } from "types/deploymentGraph"; import { + ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, } from "types/validation"; @@ -19,7 +19,7 @@ import { validateVirtual } from "./validateVirtual"; export function validationDispatch( deploymentVertex: DeploymentGraphVertex, resultAccumulator: ValidationResultsAccumulator, - context: { services: Services } + context: ValidationDispatchContext ): Promise { switch (deploymentVertex.type) { case "ArtifactContract": @@ -59,7 +59,7 @@ export function validationDispatch( case "Event": return validateEvent(deploymentVertex, resultAccumulator, context); case "SendETH": - return validateSendETH(deploymentVertex, resultAccumulator); + return validateSendETH(deploymentVertex, resultAccumulator, context); default: assertUnknownDeploymentVertexType(deploymentVertex); } diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts index 3cbcf000d0..a73676584d 100644 --- a/packages/core/src/validation/validateDeploymentGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -1,7 +1,7 @@ import { getSortedVertexIdsFrom } from "graph/utils"; import { visit } from "graph/visit"; import { Services } from "services/types"; -import { IDeploymentGraph } from "types/deploymentGraph"; +import { CallPoints, IDeploymentGraph } from "types/deploymentGraph"; import { ValidationVisitResult } from "types/validation"; import { IgnitionError } from "utils/errors"; @@ -9,6 +9,7 @@ import { validationDispatch } from "./dispatch/validationDispatch"; export async function validateDeploymentGraph( deploymentGraph: IDeploymentGraph, + callPoints: CallPoints, services: Services ): Promise { try { @@ -18,7 +19,7 @@ export async function validateDeploymentGraph( "Validation", orderedVertexIds, deploymentGraph, - { services }, + { services, callPoints }, new Map(), validationDispatch ); diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 1741ad4383..43b2675569 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -38,6 +38,7 @@ export async function resolveExecutionGraphFor(module: Module) { const { _kind: validationKind } = await validateDeploymentGraph( deploymentGraph, + {}, mockServices ); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index b2957e3ea2..3ccf51734f 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -6,9 +6,13 @@ import sinon from "sinon"; import { buildModule } from "dsl/buildModule"; import { buildSubgraph } from "dsl/buildSubgraph"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { Services } from "services/types"; import type { IDeploymentBuilder } from "types/deploymentGraph"; import { ArtifactContract } from "types/future"; import { Artifact } from "types/hardhat"; +import { Module, ModuleDict } from "types/module"; +import { ValidationVisitResult } from "types/validation"; +import { IgnitionValidationError } from "utils/errors"; import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; import { getMockServices } from "./helpers"; @@ -29,18 +33,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; - - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule); assert.equal(validationResult._kind, "success"); }); @@ -54,30 +47,10 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; + const validationResult = await runValidation(singleModule); - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "The constructor of the contract 'Example' expects 0 arguments but 3 were given" ); }); @@ -92,29 +65,12 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); + const validationResult = await runValidation(singleModule); - const mockServices = { - ...getMockServices(), - } as any; - - const validationResult = await validateDeploymentGraph( - graph, - mockServices + assertValidationError( + validationResult, + "For contract 'value' must be a BigNumber" ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal(error.message, "For contract 'value' must be a BigNumber"); }); it("should not validate a artifact contract deploy with a non-existent bytes artifact arg", async () => { @@ -126,10 +82,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -139,22 +91,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Artifact with name 'Nonexistant' doesn't exist" ); }); @@ -168,18 +108,7 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; - - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule); assert.equal(validationResult._kind, "success"); }); @@ -193,30 +122,10 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; - - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "The constructor of the library 'Example' expects 0 arguments but 3 were given" ); }); @@ -230,10 +139,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -243,22 +148,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Artifact with name 'Nonexistant' doesn't exist" ); }); @@ -356,10 +249,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -368,10 +257,8 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); + assert.equal(validationResult._kind, "success"); }); @@ -384,10 +271,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -396,10 +279,8 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); + assert.equal(validationResult._kind, "success"); }); @@ -412,10 +293,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -424,22 +301,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Contract 'Foo' doesn't have a function nonexistant" ); }); @@ -453,10 +318,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -465,22 +326,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Function sub in contract Foo expects 1 arguments but 0 were given" ); }); @@ -494,10 +343,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -506,22 +351,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments" ); }); @@ -535,10 +368,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -547,21 +376,12 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal(error.message, "For call 'value' must be a BigNumber"); + assertValidationError( + validationResult, + "For call 'value' must be a BigNumber" + ); }); it("should fail a call with a non-existent bytes artifact arg", async () => { @@ -575,10 +395,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const fakeHasArtifact = sinon.stub(); fakeHasArtifact.onFirstCall().resolves(true); fakeHasArtifact.onSecondCall().resolves(false); @@ -591,21 +407,12 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal(error.message, "Artifact with name 'Bar' doesn't exist"); + assertValidationError( + validationResult, + "Artifact with name 'Bar' doesn't exist" + ); }); }); @@ -637,10 +444,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -649,10 +452,8 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); + assert.equal(validationResult._kind, "success"); }); @@ -666,10 +467,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -678,21 +475,12 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal(error.message, `"0xnull" is not a valid address`); + assertValidationError( + validationResult, + `"0xnull" is not a valid address` + ); }); it("should fail a call on a non-BigNumber as value", async () => { @@ -704,10 +492,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -716,21 +500,12 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal(error.message, "For send 'value' must be a BigNumber"); + assertValidationError( + validationResult, + "For send 'value' must be a BigNumber" + ); }); }); @@ -783,10 +558,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -795,10 +566,8 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); + assert.equal(validationResult._kind, "success"); }); @@ -816,10 +585,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -828,22 +593,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Contract 'Test' doesn't have an event Nonexistant" ); }); @@ -862,10 +615,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -874,22 +623,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Event SomeEvent in contract Test expects 1 arguments but 4 were given" ); }); @@ -907,18 +644,7 @@ describe("Validation", () => { return { existing }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; - - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule); assert.equal(validationResult._kind, "success"); }); @@ -930,30 +656,10 @@ describe("Validation", () => { return { existing }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - - const mockServices = { - ...getMockServices(), - } as any; + const validationResult = await runValidation(singleModule); - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "The existing contract Example has an invalid address 0xBAD" ); }); @@ -967,10 +673,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -979,10 +681,7 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); assert.equal(validationResult._kind, "success"); }); @@ -994,10 +693,6 @@ describe("Validation", () => { return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1005,23 +700,11 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } - - const { - failures: [text, [error]], - } = validationResult; + const validationResult = await runValidation(singleModule, mockServices); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, - "Artifact with name 'Nonexistant' doesn't exist" + assertValidationError( + validationResult, + "Contract with name 'Nonexistant' doesn't exist" ); }); @@ -1032,10 +715,6 @@ describe("Validation", () => { return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1043,21 +722,12 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal(error.message, "For contract 'value' must be a BigNumber"); + assertValidationError( + validationResult, + "For contract 'value' must be a BigNumber" + ); }); it("should not validate a contract with non-existing bytes artifact arg", async () => { @@ -1069,10 +739,6 @@ describe("Validation", () => { return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1080,22 +746,10 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); - - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + const validationResult = await runValidation(singleModule, mockServices); - const { - failures: [text, [error]], - } = validationResult; - - assert.equal(text, "Validation failed"); - assert.equal( - error.message, + assertValidationError( + validationResult, "Artifact with name 'Nonexistant' doesn't exist" ); }); @@ -1109,10 +763,6 @@ describe("Validation", () => { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1121,10 +771,7 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); assert.equal(validationResult._kind, "success"); }); @@ -1136,10 +783,6 @@ describe("Validation", () => { return { nonexistant }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1147,23 +790,34 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "Library with name 'Nonexistant' doesn't exist" ); + }); - if (validationResult._kind !== "failure") { - return assert.fail("validation should have failed"); - } + it("should not validate a library deployed with the wrong number of args", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.library("Example", { args: [1, 2] }); - const { - failures: [text, [error]], - } = validationResult; + return { example }; + }); - assert.equal(text, "Validation failed"); - assert.equal( - error.message, - "Artifact with name 'Nonexistant' doesn't exist" + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "The constructor of the library 'Example' expects 0 arguments but 2 were given" ); }); }); @@ -1182,10 +836,6 @@ describe("Validation", () => { return {}; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); - const mockServices = { ...getMockServices(), artifacts: { @@ -1194,12 +844,49 @@ describe("Validation", () => { }, } as any; - const validationResult = await validateDeploymentGraph( - graph, - mockServices - ); + const validationResult = await runValidation(singleModule, mockServices); assert.equal(validationResult._kind, "success"); }); }); }); + +async function runValidation( + ignitionModule: Module, + givenMockServices?: Services | undefined +) { + const mockServices: Services = + givenMockServices ?? + ({ + ...getMockServices(), + } as any); + + const { graph, callPoints } = generateDeploymentGraphFrom(ignitionModule, { + chainId: 31337, + }); + + const validationResult = await validateDeploymentGraph( + graph, + callPoints, + mockServices + ); + + return validationResult; +} + +function assertValidationError( + validationResult: ValidationVisitResult, + expectedMessage: string +) { + if (validationResult._kind !== "failure") { + return assert.fail("validation should have failed"); + } + + const { + failures: [text, [error]], + } = validationResult; + + assert.equal(text, "Validation failed"); + assert.equal(error.message, expectedMessage); + assert.isTrue(error instanceof IgnitionValidationError); +} diff --git a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts index 9030115bb0..9b7a092b8e 100644 --- a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts +++ b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts @@ -7,7 +7,13 @@ export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { const providers: Providers = { artifacts: { getArtifact: (name: string) => hre.artifacts.readArtifact(name), - hasArtifact: (name: string) => hre.artifacts.artifactExists(name), + hasArtifact: async (name: string) => { + try { + return await hre.artifacts.artifactExists(name); + } catch (err) { + return false; + } + }, }, gasProvider: { estimateGasLimit: async (tx: any) => { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 3e9f61666f..6680f611f5 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -83,7 +83,11 @@ export class IgnitionWrapper { } if (deploymentResult._kind === "failure") { - const [moduleId, failures] = deploymentResult.failures; + const [failureType, failures] = deploymentResult.failures; + + if (failures.length === 1) { + throw failures[0]; + } let failuresMessage = ""; for (const failure of failures) { @@ -91,7 +95,7 @@ export class IgnitionWrapper { } throw new IgnitionError( - `Execution failed for module '${moduleId}':\n\n${failuresMessage}` + `${failureType} for module '${ignitionModule.name}':\n\n${failuresMessage}` ); } diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index 140987ce9b..b73421249c 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -1,5 +1,6 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState, IgnitionValidationError } from "@ignored/ignition-core"; import { Box, Text } from "ink"; +import { relative } from "path"; export const ValidationFailedPanel = ({ deployState, @@ -10,7 +11,7 @@ export const ValidationFailedPanel = ({ Ignition validation failed for module{" "} - {deployState.details.moduleName} + {deployState.details.moduleName} @@ -22,6 +23,58 @@ export const ValidationFailedPanel = ({ ); }; -export const ErrorBox = ({ error }: { error: Error }) => { - return {error.message}; +export const ErrorBox: React.FC<{ error: Error }> = ({ error }) => { + return ( + + - error:{" "} + {error.message} + + ); +}; + +export const ErrorFileLocation: React.FC<{ error: Error }> = ({ error }) => { + if (!(error instanceof IgnitionValidationError)) { + return null; + } + + const { file, line, column } = parseFileLink(error); + + if (file === "") { + return null; + } + + return ( + + {file}: + {line}: + {column} + + ); +}; + +const parseFileLink = ( + error: Error +): { file: string; line: string; column: string } => { + try { + // @ts-ignore + // eslint-disable-next-line no-console + const stack = error.stack.split("\n")[1]; + + const regexp = /\s*at Object.action \D([^:]+):([^:]+):([^:]+)\)$/gm; + const matches = stack.matchAll(regexp); + + let file: string = ""; + let line: string = ""; + let column: string = ""; + + for (const match of matches) { + file = match[1]; + line = match[2]; + column = match[3]; + } + + return { file: relative(process.cwd(), file), line, column }; + } catch { + return { file: "", line: "", column: "" }; + } }; From 0498805a58f39d9f7571fb369b59b774465d111a Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 7 Mar 2023 15:24:27 +0000 Subject: [PATCH 0247/1302] refactor(core): remove dep on hardhat Instead of throwing hh errors, we throw our own ignition core errors, this allows us to remove hardhat as a dependency. This is ideal as ignition core should not force you to use hardhat even implicitly. Resolves #163. --- config/eslint/.eslintrc.js | 7 +------ package-lock.json | 11 ----------- packages/core/.eslintrc.js | 1 - packages/core/package.json | 5 ----- packages/core/src/utils/errors.ts | 19 ++++++------------- packages/core/test/.eslintrc.js | 1 - 6 files changed, 7 insertions(+), 37 deletions(-) diff --git a/config/eslint/.eslintrc.js b/config/eslint/.eslintrc.js index 7c014f53ac..1e49c764cb 100644 --- a/config/eslint/.eslintrc.js +++ b/config/eslint/.eslintrc.js @@ -20,12 +20,7 @@ module.exports = { project: "./tsconfig.json", tsConfigRootDir: "./", }, - plugins: [ - "@nomiclabs/eslint-plugin-hardhat-internal-rules", - "eslint-plugin-import", - "@typescript-eslint", - "mocha", - ], + plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], rules: { "import/no-unused-modules": [ 1, diff --git a/package-lock.json b/package-lock.json index 22794c377a..cbc8cb9a0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2736,12 +2736,6 @@ "node": ">= 10" } }, - "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", - "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", - "dev": true - }, "node_modules/@nomiclabs/hardhat-ethers": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", @@ -18374,7 +18368,6 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", @@ -18396,7 +18389,6 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", - "hardhat": "^2.12.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", @@ -18409,9 +18401,6 @@ }, "engines": { "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - }, - "peerDependencies": { - "hardhat": "^2.12.0" } }, "packages/core/node_modules/strip-bom": { diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index e63cd1aa4d..3367c1761f 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -8,7 +8,6 @@ module.exports = { createDefaultProgram: true, }, rules: { - "@nomiclabs/hardhat-internal-rules/only-hardhat-plugin-error": "error", "no-console": "error", }, ignorePatterns: ["post-build.js"], diff --git a/packages/core/package.json b/packages/core/package.json index 853a256a4e..5fde3d21fc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -35,7 +35,6 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", @@ -57,7 +56,6 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", - "hardhat": "^2.12.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", @@ -68,9 +66,6 @@ "tsconfig-paths": "^4.1.0", "typescript": "^4.7.4" }, - "peerDependencies": { - "hardhat": "^2.12.0" - }, "dependencies": { "@ethersproject/address": "5.6.1", "debug": "^4.3.2", diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/utils/errors.ts index 5e3289a6ad..5e0612de64 100644 --- a/packages/core/src/utils/errors.ts +++ b/packages/core/src/utils/errors.ts @@ -1,15 +1,16 @@ import { BigNumber } from "ethers"; -import { HardhatPluginError } from "hardhat/plugins"; -export class IgnitionError extends HardhatPluginError { +export class IgnitionError extends Error { constructor(message: string) { - super("ignition", message); + super(message); + + this.name = this.constructor.name; } } -export class IgnitionValidationError extends HardhatPluginError { +export class IgnitionValidationError extends IgnitionError { constructor(message: string) { - super("ignition", message); + super(message); // This is required to allow calls to `resetStackFrom`, // otherwise the function is not available on the @@ -23,18 +24,10 @@ export class IgnitionValidationError extends HardhatPluginError { * api, so that the stack leads directly to the line in the module * the user called (i.e. `m.contract(...)`) * - * This is a hack to workaround the stack manipulation - * that `HardhatPluginError` does. - * * @param f the function to hide all of the stacktrace above */ public resetStackFrom(f: () => any) { Error.captureStackTrace(this, f); - - // the base custom error from HH stores off the stack - // it uses to `_stack`, so we need to override this - // as well ... even though it is private. - (this as any)._stack = this.stack ?? ""; } } diff --git a/packages/core/test/.eslintrc.js b/packages/core/test/.eslintrc.js index bf6d9e6e4c..757fe8a3ca 100644 --- a/packages/core/test/.eslintrc.js +++ b/packages/core/test/.eslintrc.js @@ -5,7 +5,6 @@ module.exports = { sourceType: "module", }, rules: { - "@nomiclabs/hardhat-internal-rules/only-hardhat-plugin-error": "off", "import/no-extraneous-dependencies": [ "error", { From 464098d73a9675d532a80e32b4d277c6dfcf7e1e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 8 Mar 2023 15:23:31 -0500 Subject: [PATCH 0248/1302] feat: add network accounts to deployment api Hardhat network accounts have been made available through the deployment api (i.e. `m.accounts`). In combination with the accounts being directly available we support setting the account to execute the transaction *from*, this is done through a `from` property on each actions options object. --- docs/creating-modules-for-deployment.md | 30 ++++ examples/ens/ignition/ENS.js | 8 +- examples/multisig/ignition/MultisigModule.js | 5 +- examples/uniswap/ignition/Uniswap.js | 4 +- packages/core/src/Ignition.ts | 14 +- packages/core/src/deployment/Deployment.ts | 10 ++ .../core/src/deployment/deployStateReducer.ts | 9 ++ packages/core/src/dsl/DeploymentBuilder.ts | 10 +- .../execution/dispatch/executeContractCall.ts | 7 +- .../dispatch/executeContractDeploy.ts | 7 +- .../dispatch/executeLibraryDeploy.ts | 7 +- .../src/execution/dispatch/executeSendETH.ts | 7 +- ...onvertDeploymentVertexToExecutionVertex.ts | 24 ++- packages/core/src/services/AccountsService.ts | 33 +++++ .../core/src/services/ContractsService.ts | 16 +- packages/core/src/services/createServices.ts | 3 +- packages/core/src/services/types.ts | 3 + packages/core/src/types/deployment.ts | 2 + packages/core/src/types/deploymentGraph.ts | 11 ++ packages/core/src/types/executionGraph.ts | 4 + packages/core/src/types/providers.ts | 13 +- packages/core/src/utils/tx-sender.ts | 8 +- .../dispatch/validateArtifactContract.ts | 8 + .../dispatch/validateArtifactLibrary.ts | 8 + .../src/validation/dispatch/validateCall.ts | 8 + .../dispatch/validateHardhatContract.ts | 8 + .../dispatch/validateHardhatLibrary.ts | 8 + .../validation/dispatch/validateSendETH.ts | 8 + packages/core/test/contractsService.ts | 20 +-- .../core/test/deploymentBuilder/accounts.ts | 59 ++++++++ .../test/deploymentBuilder/buildModule.ts | 2 + packages/core/test/deploymentBuilder/calls.ts | 19 +++ .../core/test/deploymentBuilder/chainId.ts | 20 --- .../core/test/deploymentBuilder/deploy.ts | 54 ++++--- packages/core/test/deploymentBuilder/event.ts | 1 + .../deploymentBuilder/getBytesForArtifact.ts | 1 + .../core/test/deploymentBuilder/libraries.ts | 16 ++ .../core/test/deploymentBuilder/metadata.ts | 35 +++++ .../core/test/deploymentBuilder/parameters.ts | 1 + .../core/test/deploymentBuilder/sendETH.ts | 17 ++- .../core/test/deploymentBuilder/useModule.ts | 34 ++--- .../test/deploymentBuilder/useSubgraph.ts | 12 +- packages/core/test/deploymentBuilder/value.ts | 1 + packages/core/test/execution/batching.ts | 1 + packages/core/test/execution/dispatch.ts | 6 + packages/core/test/execution/rerun.ts | 36 ++++- packages/core/test/helpers.ts | 12 ++ packages/core/test/state-reducer/utils.ts | 11 ++ packages/core/test/tx-sender.ts | 8 +- packages/core/test/validation.ts | 140 ++++++++++++++++++ .../src/buildIgnitionProvidersFrom.ts | 16 +- 51 files changed, 657 insertions(+), 148 deletions(-) create mode 100644 packages/core/src/services/AccountsService.ts create mode 100644 packages/core/test/deploymentBuilder/accounts.ts delete mode 100644 packages/core/test/deploymentBuilder/chainId.ts create mode 100644 packages/core/test/deploymentBuilder/metadata.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 62afa051ea..2a48f7f6bf 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -18,6 +18,7 @@ - [Transfering _Eth_ outside of a call](./creating-modules-for-deployment.md#transfering-eth-outside-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) +- [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) - [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - [Switching based on the _Network Chain ID_](./creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) @@ -261,6 +262,35 @@ Upon execution, the `EventFuture` will be resolved to the values of the params e A full example of the `event` function can be seen in our [Multisig example](../examples/multisig/README.md). +## Network Accounts Management + +All accounts configured for the current network can be accessed from within an **Ignition** module via `m.accounts`: + +```tsx +module.exports = buildModule("Multisig", (m) => { + const [owner] = m.accounts; // typeof m.accounts === string[] +}); +``` + +You can then use these addresses anywhere you normally would, such as constructor or function args. Additionally, you can pass them as a value to the `from` option in order to specify which account you would like a specific transaction sent from: + +```tsx +module.exports = buildModule("Multisig", (m) => { + const [owner, alsoAnOwner, notAnOwner] = m.accounts; // typeof m.accounts === string[] + + const multisig = m.deploy("Multisig", { args: [owner, alsoAnOwner], { from: owner }}); + + const value = ethers.utils.parseUnits("100"); + const fund = m.sendETH(multisig, { value, from: notAnOwner }) + + const call = m.call(multisig, "authorize", { from: alsoAnOwner }); +}); +``` + +Note that if `from` is not provided, **Ignition** will default to sending transactions using the first configured account (`m.accounts[0]`). + +A more complete example of the `from` option can be found in our [Multisig example](../examples/multisig/README.md) + ## Including modules within modules Modules can be deployed and consumed within other modules via `m.useModule(...)`: diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 4c5216d7c2..3d64b731a8 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -16,11 +16,9 @@ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; const ZERO_HASH = "0x0000000000000000000000000000000000000000000000000000000000000000"; -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; - const setupResolver = buildSubgraph("RESOLVER", (m) => { const ens = m.getParam("ENS"); - const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); + const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); // Setup resolver const resolver = m.contract("PublicResolver", { @@ -46,7 +44,7 @@ const setupResolver = buildSubgraph("RESOLVER", (m) => { const setupReverseRegistrar = buildSubgraph("REVERSEREGISTRAR", (m) => { const ens = m.getParam("ENS"); const resolver = m.getParam("RESOLVER"); - const account = m.getOptionalParam("ACCOUNT", ACCOUNT_0); + const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); // Setup Reverse Registrar const reverseRegistrar = m.contract("ReverseRegistrar", { @@ -67,7 +65,7 @@ const setupReverseRegistrar = buildSubgraph("REVERSEREGISTRAR", (m) => { }); module.exports = buildModule("ENS", (m) => { - const owner = ACCOUNT_0; + const owner = m.accounts[0]; const ens = m.contract("ENSRegistry"); diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js index c30f6d55d2..479517d6fd 100644 --- a/examples/multisig/ignition/MultisigModule.js +++ b/examples/multisig/ignition/MultisigModule.js @@ -3,10 +3,9 @@ const { buildModule } = require("@ignored/hardhat-ignition"); const MultisigArtifact = require("../artifacts/contracts/Multisig.sol/Multisig.json"); -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; - module.exports = buildModule("MultisigModule", (m) => { + const [ACCOUNT_0, ACCOUNT_1] = m.accounts; + const owners = [ACCOUNT_0, ACCOUNT_1]; const required = 1; const value = ethers.utils.parseUnits("100"); diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js index 5075d803f0..ff00f2465b 100644 --- a/examples/uniswap/ignition/Uniswap.js +++ b/examples/uniswap/ignition/Uniswap.js @@ -30,8 +30,6 @@ const MAX_INCENTIVE_DURATION = ONE_YEAR_SECONDS * 2; const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; - function isAscii(str) { return /^[\x00-\x7F]*$/.test(str); } @@ -45,7 +43,7 @@ function asciiStringToBytes32(str) { } module.exports = buildModule("Uniswap", (m) => { - const owner = ACCOUNT_0; + const owner = m.accounts[0]; const v2CoreFactoryAddress = ADDRESS_ZERO; const weth9 = m.contract("WETH9"); diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 42a2734983..96a4ea911d 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -70,9 +70,14 @@ export class Ignition { ); try { - const chainId = await this._services.network.getChainId(); + const [chainId, accounts] = await Promise.all([ + this._services.network.getChainId(), + this._services.accounts.getAccounts(), + ]); + await deployment.setChainId(chainId); await deployment.setNetworkName(options.networkName); + await deployment.setAccounts(accounts); const { result: constructResult, moduleOutputs } = await this._constructExecutionGraphFrom(deployment, ignitionModule); @@ -134,12 +139,16 @@ export class Ignition { ): Promise { log(`Start plan`); - const chainId = await this._services.network.getChainId(); + const [chainId, accounts] = await Promise.all([ + this._services.network.getChainId(), + this._services.accounts.getAccounts(), + ]); const { graph: deploymentGraph, callPoints } = generateDeploymentGraphFrom( deploymentModule, { chainId, + accounts, } ); @@ -178,6 +187,7 @@ export class Ignition { moduleOutputs, } = generateDeploymentGraphFrom(ignitionModule, { chainId: deployment.state.details.chainId, + accounts: deployment.state.details.accounts, }); await deployment.startValidation(); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index ac15c77b46..55f7b564b6 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -66,6 +66,16 @@ export class Deployment { ); } + public setAccounts(accounts: string[]) { + return this._runDeploymentCommand( + `Accounts resolved as '${accounts.join(", ")}'`, + { + type: "SET_ACCOUNTS", + accounts, + } + ); + } + public startValidation() { return this._runDeploymentCommand("Validate deployment graph", { type: "START_VALIDATION", diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 04768eb33e..9dc6f4646c 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -17,6 +17,7 @@ export function initializeDeployState(moduleName: string): DeployState { moduleName, chainId: 0, networkName: "", + accounts: [], }, validation: { errors: [], @@ -58,6 +59,14 @@ export function deployStateReducer( networkName: action.networkName, }, }; + case "SET_ACCOUNTS": + return { + ...state, + details: { + ...state.details, + accounts: action.accounts, + }, + }; case "START_VALIDATION": return { ...state, diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 3c88ac688a..b350ea05ea 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -96,6 +96,7 @@ function parseEventParams( export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; + public accounts: string[]; public graph: IDeploymentGraph; public callPoints: CallPoints; @@ -106,6 +107,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { constructor(options: DeploymentBuilderOptions) { this.chainId = options.chainId; + this.accounts = options.accounts; this.graph = new DeploymentGraph(); this.callPoints = {}; } @@ -145,6 +147,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { args: options?.args ?? [], scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], + from: options?.from ?? this.accounts[0], }); return artifactContractFuture; @@ -168,6 +171,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { args: options?.args ?? [], scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], + from: options?.from ?? this.accounts[0], }); return libraryFuture; @@ -211,6 +215,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], value: options?.value ?? DEFAULT_VALUE, + from: options?.from ?? this.accounts[0], }); return artifactContractFuture; @@ -236,6 +241,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { scopeAdded: this.scopes.getScopedLabel(), after: options?.after ?? [], value: options?.value ?? DEFAULT_VALUE, + from: options?.from ?? this.accounts[0], }); return contractFuture; @@ -274,7 +280,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public call( contractFuture: DeploymentGraphFuture, functionName: string, - { args, after, value }: CallOptions + { args, after, value, from }: CallOptions ): ContractCall { const callFuture: ContractCall = { vertexId: this._resolveNextId(), @@ -320,6 +326,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { after: after ?? [], scopeAdded: this.scopes.getScopedLabel(), value: value ?? DEFAULT_VALUE, + from: from ?? this.accounts[0], }); return callFuture; @@ -426,6 +433,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { value: options.value, after: options.after ?? [], scopeAdded: this.scopes.getScopedLabel(), + from: options?.from ?? this.accounts[0], }); return sendFuture; diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 604f0f8cf3..134e77f3b7 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -10,7 +10,7 @@ import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( - { method, contract, args, value }: ContractCall, + { method, contract, args, value, signer }: ContractCall, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { @@ -29,7 +29,10 @@ export async function executeContractCall( { value } ); - txHash = await services.contracts.sendTx(unsignedTx, options); + txHash = await services.contracts.sendTx(unsignedTx, { + ...options, + signer, + }); } catch (err) { return { _kind: VertexResultEnum.FAILURE, diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index f92e06dea8..d05c8b75f0 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -12,7 +12,7 @@ import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( - { artifact, args, libraries, value }: ContractDeploy, + { artifact, args, libraries, value, signer }: ContractDeploy, resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext ): Promise { @@ -40,7 +40,10 @@ export async function executeContractDeploy( value, }); - txHash = await services.contracts.sendTx(deployTransaction, options); + txHash = await services.contracts.sendTx(deployTransaction, { + ...options, + signer, + }); } catch (err) { return { _kind: VertexResultEnum.FAILURE, diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 16ec20bd52..70537b9958 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -12,7 +12,7 @@ import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeLibraryDeploy( - { artifact, args }: LibraryDeploy, + { artifact, args, signer }: LibraryDeploy, resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext ): Promise { @@ -28,7 +28,10 @@ export async function executeLibraryDeploy( const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - txHash = await services.contracts.sendTx(deployTransaction, options); + txHash = await services.contracts.sendTx(deployTransaction, { + ...options, + signer, + }); } catch (err) { return { _kind: VertexResultEnum.FAILURE, diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts index 0d9fa40a9b..424af59a42 100644 --- a/packages/core/src/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -7,7 +7,7 @@ import { VertexResultEnum } from "types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeSendETH( - { address, value }: SentETH, + { address, value, signer }: SentETH, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { @@ -19,7 +19,10 @@ export async function executeSendETH( try { const tx: PopulatedTransaction = { to, value }; - txHash = await services.contracts.sendTx(tx, options); + txHash = await services.contracts.sendTx(tx, { + ...options, + signer, + }); } catch (err) { return { _kind: VertexResultEnum.FAILURE, diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 731190dbb8..ac8ba90117 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,4 +1,4 @@ -import { BigNumber } from "ethers"; +import { BigNumber, ethers } from "ethers"; import { Services } from "services/types"; import { @@ -85,6 +85,8 @@ async function convertHardhatContractToContractDeploy( ): Promise { const artifact: Artifact = await transformContext.services.artifacts.getArtifact(vertex.contractName); + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); return { type: "ContractDeploy", @@ -97,6 +99,7 @@ async function convertHardhatContractToContractDeploy( vertex.value, transformContext )) as BigNumber, + signer, }; } @@ -104,6 +107,9 @@ async function convertArtifactContractToContractDeploy( vertex: ArtifactContractDeploymentVertex, transformContext: TransformContext ): Promise { + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); + return { type: "ContractDeploy", id: vertex.id, @@ -115,6 +121,7 @@ async function convertArtifactContractToContractDeploy( vertex.value, transformContext )) as BigNumber, + signer, }; } @@ -135,6 +142,9 @@ async function convertCallToContractCall( vertex: CallDeploymentVertex, transformContext: TransformContext ): Promise { + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); + return { type: "ContractCall", id: vertex.id, @@ -146,6 +156,7 @@ async function convertCallToContractCall( vertex.value, transformContext )) as BigNumber, + signer, }; } @@ -155,6 +166,8 @@ async function convertHardhatLibraryToLibraryDeploy( ): Promise { const artifact: Artifact = await transformContext.services.artifacts.getArtifact(vertex.libraryName); + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); return { type: "LibraryDeploy", @@ -162,6 +175,7 @@ async function convertHardhatLibraryToLibraryDeploy( label: vertex.label, artifact, args: await convertArgs(vertex.args, transformContext), + signer, }; } @@ -169,12 +183,16 @@ async function convertArtifactLibraryToLibraryDeploy( vertex: ArtifactLibraryDeploymentVertex, transformContext: TransformContext ): Promise { + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); + return { type: "LibraryDeploy", id: vertex.id, label: vertex.label, artifact: vertex.artifact, args: await convertArgs(vertex.args, transformContext), + signer, }; } @@ -197,6 +215,9 @@ async function convertSendToSentETH( vertex: SendVertex, transformContext: TransformContext ): Promise { + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); + return { type: "SentETH", id: vertex.id, @@ -206,6 +227,7 @@ async function convertSendToSentETH( vertex.value, transformContext )) as BigNumber, + signer, }; } diff --git a/packages/core/src/services/AccountsService.ts b/packages/core/src/services/AccountsService.ts new file mode 100644 index 0000000000..b38e98c394 --- /dev/null +++ b/packages/core/src/services/AccountsService.ts @@ -0,0 +1,33 @@ +import type { ethers } from "ethers"; + +import type { Providers } from "types/providers"; + +export interface IAccountsService { + getAccounts(): Promise; + getSigner(address: string): Promise; +} + +export class AccountsService implements IAccountsService { + private _accounts: string[] = []; + private _signers: { [address: string]: ethers.Signer } = {}; + + constructor(private readonly _providers: Providers) {} + + public async getAccounts(): Promise { + if (this._accounts.length === 0) { + this._accounts = await this._providers.accounts.getAccounts(); + } + + return this._accounts; + } + + public async getSigner(address: string): Promise { + if (this._signers[address] === undefined) { + this._signers[address] = await this._providers.accounts.getSigner( + address + ); + } + + return this._signers[address]; + } +} diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 41d520bc2b..6d3b00d4eb 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,12 +1,7 @@ import setupDebug from "debug"; import { ethers } from "ethers"; -import { - GasProvider, - IgnitionSigner, - SignersProvider, - TransactionsProvider, -} from "types/providers"; +import { GasProvider, TransactionsProvider } from "types/providers"; import { IgnitionError } from "utils/errors"; import { sleep } from "utils/sleep"; import { TxSender } from "utils/tx-sender"; @@ -22,7 +17,6 @@ export interface IContractsService { export interface ContractsServiceProviders { web3Provider: ethers.providers.Web3Provider; - signersProvider: SignersProvider; transactionsProvider: TransactionsProvider; gasProvider: GasProvider; } @@ -45,13 +39,11 @@ export class ContractsService implements IContractsService { this._debug("Deploying contract"); } - const signer = await this._providers.signersProvider.getDefaultSigner(); - - return this._sendTx(signer, deployTransaction, txOptions); + return this._sendTx(txOptions.signer, deployTransaction, txOptions); } private async _sendTx( - signer: IgnitionSigner, + signer: ethers.Signer, tx: ethers.providers.TransactionRequest, txOptions: TransactionOptions ): Promise { @@ -110,7 +102,7 @@ export class ContractsService implements IContractsService { private async _bump( _txHash: string, - _signer: IgnitionSigner, + _signer: ethers.Signer, previousTxRequest: ethers.providers.TransactionRequest, previousTxHash: string, gasPriceIncrementPerRetry: ethers.BigNumber | null diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index 6d41303833..59a46076db 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -3,6 +3,7 @@ import { ethers } from "ethers"; import { Providers } from "types/providers"; import { TxSender } from "utils/tx-sender"; +import { AccountsService } from "./AccountsService"; import { ArtifactsService } from "./ArtifactsService"; import { ConfigService } from "./ConfigService"; import { ContractsService } from "./ContractsService"; @@ -19,7 +20,6 @@ export function createServices(providers: Providers): Services { contracts: new ContractsService( { gasProvider: providers.gasProvider, - signersProvider: providers.signers, transactionsProvider: providers.transactions, web3Provider: new ethers.providers.Web3Provider( providers.ethereumProvider @@ -29,6 +29,7 @@ export function createServices(providers: Providers): Services { ), transactions: new TransactionsService(providers), config: new ConfigService(providers), + accounts: new AccountsService(providers), }; return services; diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts index 8662ad99ba..2042435faa 100644 --- a/packages/core/src/services/types.ts +++ b/packages/core/src/services/types.ts @@ -1,5 +1,6 @@ import { ethers } from "ethers"; +import { IAccountsService } from "./AccountsService"; import { IArtifactsService } from "./ArtifactsService"; import { IConfigService } from "./ConfigService"; import { IContractsService } from "./ContractsService"; @@ -12,6 +13,7 @@ export interface TransactionOptions { maxRetries: number; gasPriceIncrementPerRetry: ethers.BigNumber | null; pollingInterval: number; + signer: ethers.Signer; } export interface Services { @@ -20,4 +22,5 @@ export interface Services { artifacts: IArtifactsService; transactions: ITransactionsService; config: IConfigService; + accounts: IAccountsService; } diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 86163f0b12..06e2796eb9 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -54,6 +54,7 @@ export type DeployStateExecutionCommand = export type DeployStateCommand = | { type: "SET_CHAIN_ID"; chainId: number } | { type: "SET_NETWORK_NAME"; networkName: string } + | { type: "SET_ACCOUNTS"; accounts: string[] } | { type: "START_VALIDATION"; } @@ -135,6 +136,7 @@ export interface DeployNetworkConfig { moduleName: string; chainId: number; networkName: string; + accounts: string[]; } export interface DeployState { diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index 2bf3f13eba..d61d83b31c 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -71,6 +71,7 @@ export interface HardhatContractDeploymentVertex extends VertexDescriptor { libraries: LibraryMap; after: DeploymentGraphFuture[]; value: BigNumber | ParameterFuture; + from: string; } export interface ArtifactContractDeploymentVertex extends VertexDescriptor { @@ -81,6 +82,7 @@ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { libraries: LibraryMap; after: DeploymentGraphFuture[]; value: BigNumber | ParameterFuture; + from: string; } export interface DeployedContractDeploymentVertex extends VertexDescriptor { @@ -97,6 +99,7 @@ export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { scopeAdded: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; + from: string; } export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { @@ -105,6 +108,7 @@ export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { artifact: Artifact; args: InternalParamValue[]; after: DeploymentGraphFuture[]; + from: string; } export interface CallDeploymentVertex extends VertexDescriptor { @@ -115,6 +119,7 @@ export interface CallDeploymentVertex extends VertexDescriptor { args: InternalParamValue[]; after: DeploymentGraphFuture[]; value: BigNumber | ParameterFuture; + from: string; } export interface VirtualVertex extends VertexDescriptor { @@ -139,6 +144,7 @@ export interface SendVertex extends VertexDescriptor { address: AddressResolvable; value: BigNumber | ParameterFuture; after: DeploymentGraphFuture[]; + from: string; } export interface ContractOptions { @@ -148,12 +154,14 @@ export interface ContractOptions { }; after?: DeploymentGraphFuture[]; value?: BigNumber | ParameterFuture; + from?: string; } export interface CallOptions { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; value?: BigNumber | ParameterFuture; + from?: string; } export interface AwaitOptions { @@ -164,6 +172,7 @@ export interface AwaitOptions { export interface SendOptions { value: BigNumber | ParameterFuture; after?: DeploymentGraphFuture[]; + from?: string; } export interface UseSubgraphOptions { @@ -173,6 +182,7 @@ export interface UseSubgraphOptions { export interface IDeploymentBuilder { chainId: number; + accounts: string[]; graph: IDeploymentGraph; contract(contractName: string, options?: ContractOptions): HardhatContract; @@ -232,6 +242,7 @@ export interface IDeploymentBuilder { export interface DeploymentBuilderOptions { chainId: number; + accounts: string[]; } export interface CallPoints { diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/types/executionGraph.ts index bf95ae62f0..4d1ff1da19 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/types/executionGraph.ts @@ -51,6 +51,7 @@ export interface ContractDeploy extends VertexDescriptor { args: ArgValue[]; libraries: LibraryMap; value: BigNumber; + signer: ethers.Signer; } export interface DeployedContract extends VertexDescriptor { @@ -63,6 +64,7 @@ export interface LibraryDeploy extends VertexDescriptor { type: "LibraryDeploy"; artifact: Artifact; args: ArgValue[]; + signer: ethers.Signer; } export interface ContractCall extends VertexDescriptor { @@ -71,6 +73,7 @@ export interface ContractCall extends VertexDescriptor { method: string; args: ArgValue[]; value: BigNumber; + signer: ethers.Signer; } export interface AwaitedEvent extends VertexDescriptor { @@ -85,6 +88,7 @@ export interface SentETH extends VertexDescriptor { type: "SentETH"; address: AddressResolvable; value: BigNumber; + signer: ethers.Signer; } export interface ContractDeploySuccess { diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index defa4e3664..3f8e0402d5 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -8,9 +8,9 @@ export interface Providers { artifacts: ArtifactsProvider; ethereumProvider: EIP1193Provider; gasProvider: GasProvider; - signers: SignersProvider; transactions: TransactionsProvider; config: ConfigProvider; + accounts: AccountsProvider; } export interface ArtifactsProvider { @@ -29,10 +29,6 @@ export interface GasProvider { estimateGasPrice: () => Promise; } -export interface SignersProvider { - getDefaultSigner(): Promise; -} - export interface TransactionsProvider { isConfirmed(txHash: string): Promise; isMined(txHash: string): Promise; @@ -57,8 +53,7 @@ export interface ConfigProvider { hasParam(paramName: string): Promise; } -export interface IgnitionSigner { - sendTransaction: ( - tx: ethers.providers.TransactionRequest - ) => Promise; +export interface AccountsProvider { + getAccounts(): Promise; + getSigner(address: string): Promise; } diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/utils/tx-sender.ts index 899eaf9ca0..cb2942be5b 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -1,7 +1,7 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { GasProvider, IgnitionSigner } from "types/providers"; +import { GasProvider } from "types/providers"; /** * Sends, replaces and keeps track of transactions. @@ -22,7 +22,7 @@ export class TxSender { * Returns the index of the transaction in the journal and its hash. */ public async send( - signer: IgnitionSigner, + signer: ethers.Signer, tx: ethers.providers.TransactionRequest ): Promise { this._debug(`sending transaction`, [tx]); @@ -38,7 +38,7 @@ export class TxSender { * Returns the hash of the new transaction. */ public async sendAndReplace( - signer: IgnitionSigner, + signer: ethers.Signer, tx: ethers.providers.TransactionRequest ): Promise { const sentTx = await this._send(signer, tx); @@ -47,7 +47,7 @@ export class TxSender { } private async _send( - signer: IgnitionSigner, + signer: ethers.Signer, tx: ethers.providers.TransactionRequest ): Promise { if (tx.gasLimit === undefined) { diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index 859d915d0b..c7d5f34cb5 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -24,6 +24,14 @@ export async function validateArtifactContract( ); } + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For contract 'from' must be a valid address string`, + callPoints + ); + } + const invalidBytes = await validateBytesForArtifact({ vertex, callPoints, diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 37df717f5b..5acba8e829 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -16,6 +16,14 @@ export async function validateArtifactLibrary( _resultAccumulator: ValidationResultsAccumulator, context: ValidationDispatchContext ): Promise { + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For library 'from' must be a valid address string`, + context.callPoints + ); + } + const invalidBytes = await validateBytesForArtifact({ vertex, callPoints: context.callPoints, diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 551eb2aa9c..33b4f6190c 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -28,6 +28,14 @@ export async function validateCall( ); } + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For call 'from' must be a valid address string`, + context.callPoints + ); + } + const invalidBytes = await validateBytesForArtifact({ vertex, callPoints: context.callPoints, diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index 7fcc28d568..f37690f472 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -24,6 +24,14 @@ export async function validateHardhatContract( ); } + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For contract 'from' must be a valid address string`, + callPoints + ); + } + const invalidBytes = await validateBytesForArtifact({ vertex, callPoints, diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index 11fcd03972..e51bff9877 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -15,6 +15,14 @@ export async function validateHardhatLibrary( _resultAccumulator: ValidationResultsAccumulator, { callPoints, services }: ValidationDispatchContext ): Promise { + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For library 'from' must be a valid address string`, + callPoints + ); + } + const invalidBytes = await validateBytesForArtifact({ vertex, callPoints, diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/validation/dispatch/validateSendETH.ts index 41e014b51b..d2220f7066 100644 --- a/packages/core/src/validation/dispatch/validateSendETH.ts +++ b/packages/core/src/validation/dispatch/validateSendETH.ts @@ -24,6 +24,14 @@ export async function validateSendETH( ); } + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For send 'from' must be a valid address string`, + callPoints + ); + } + if ( typeof vertex.address === "string" && !ethers.utils.isAddress(vertex.address) diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index 5ba3eaccaa..be9c4e3692 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -18,25 +18,6 @@ const txSender: TxSender = { } as TxSender; const providersFake = { - signersProvider: { - async getDefaultSigner() { - return { - async sendTransaction(_) { - return { - hash: "", - blockHash: "", - blockNumber: 0, - nonce: 0, - gasLimit: 100, - confirmations: 0, - chainId: 0, - data: "", - from: "", - } as unknown as ethers.providers.TransactionResponse; - }, - }; - }, - }, web3Provider: { n: 0, async getBlockNumber() { @@ -81,6 +62,7 @@ describe("ContractsService", function () { maxRetries: 4, gasPriceIncrementPerRetry: null, pollingInterval: 10, + signer: {} as any, }), /Transaction not confirmed within max retry limit/ ); diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts new file mode 100644 index 0000000000..fe20ff1a7d --- /dev/null +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -0,0 +1,59 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "types/deploymentGraph"; +import { isHardhatContract } from "utils/guards"; + +import { getDeploymentVertexByLabel } from "./helpers"; + +describe("deployment builder - accounts", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const accountsModule = buildModule("accounts", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange", { + from: m.accounts[1], + }); + + return { token, exchange }; + }); + + const { graph } = generateDeploymentGraphFrom(accountsModule, { + chainId: 31337, + accounts: [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ], + }); + + deploymentGraph = graph; + }); + + it("should default to the first account if not given a from parameter", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + assert.isDefined(depNode); + if (!isHardhatContract(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); + + it("should deploy with a given from address", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + assert.isDefined(depNode); + if (!isHardhatContract(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal(depNode.from, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); + }); +}); diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index 2d20204104..efc422503b 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -14,6 +14,7 @@ describe("deployment builder - buildModule", () => { return generateDeploymentGraphFrom(badAsyncModule, { chainId: 31337, + accounts: [], }); }, /The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./); }); @@ -26,6 +27,7 @@ describe("deployment builder - buildModule", () => { return generateDeploymentGraphFrom(badAsyncModule, { chainId: 31337, + accounts: [], }); }, /User thrown error/); }); diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index 04156509c7..f1f4cf48d4 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -23,6 +23,7 @@ describe("deployment builder - chainId", () => { m.call(exchange, "addToken", { args: [token], after: [another], + from: m.accounts[0], }); return {}; @@ -30,6 +31,7 @@ describe("deployment builder - chainId", () => { const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], }); deploymentGraph = graph; @@ -178,4 +180,21 @@ describe("deployment builder - chainId", () => { }, ]); }); + + it("should record the address to send from for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); diff --git a/packages/core/test/deploymentBuilder/chainId.ts b/packages/core/test/deploymentBuilder/chainId.ts deleted file mode 100644 index 455e6d5edf..0000000000 --- a/packages/core/test/deploymentBuilder/chainId.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder } from "types/deploymentGraph"; - -describe("deployment builder - chainId", () => { - it("should inject the chainId via the builder", () => { - const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { - if (m.chainId === 42) { - return {}; - } - - assert.fail("Chain id was not injected"); - }); - - generateDeploymentGraphFrom(chainIdModule, { chainId: 42 }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 1b7bd4a8e4..d0634f8330 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -20,19 +20,22 @@ import { } from "./helpers"; describe("deployment builder - deploy", function () { + const options = { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + }; + describe("single contract", () => { let deploymentGraph: IDeploymentGraph; before(() => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example"); + const example = m.contract("Example", { from: m.accounts[0] }); return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom(singleModule, options); deploymentGraph = graph; }); @@ -77,6 +80,20 @@ describe("deployment builder - deploy", function () { assert.deepStrictEqual(depNode.args, []); }); + + it("should record the correct address to send from", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); describe("two unrelated contracts", () => { @@ -93,9 +110,10 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom(twoContractsModule, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom( + twoContractsModule, + options + ); deploymentGraph = graph; }); @@ -158,9 +176,10 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom(withConstructorArgsModule, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom( + withConstructorArgsModule, + options + ); deploymentGraph = graph; }); @@ -228,9 +247,7 @@ describe("deployment builder - deploy", function () { const { graph } = generateDeploymentGraphFrom( depsBetweenContractsModule, - { - chainId: 31337, - } + options ); deploymentGraph = graph; @@ -322,9 +339,7 @@ describe("deployment builder - deploy", function () { return { uniswap }; }); - const { graph } = generateDeploymentGraphFrom(uniswapModule, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom(uniswapModule, options); deploymentGraph = graph; }); @@ -387,9 +402,10 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom(fromArtifactModule, { - chainId: 31337, - }); + const { graph } = generateDeploymentGraphFrom( + fromArtifactModule, + options + ); deploymentGraph = graph; }); diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 6cd1ef8883..f20d0ceec3 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -83,6 +83,7 @@ describe("deployment builder - await event", () => { const { graph } = generateDeploymentGraphFrom(eventModule, { chainId: 31337, + accounts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts index ecd4996ae1..2589c763ee 100644 --- a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts +++ b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts @@ -26,6 +26,7 @@ describe("deployment builder - getBytesForArtifact", () => { const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, + accounts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index 34eb60ffa2..a3469e89f1 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -27,6 +27,7 @@ describe("deployment builder - libraries", () => { const safeMath = m.library("SafeMath", { args: [42], after: [someother], + from: m.accounts[0], }); const contract = m.contract("Contract", { @@ -41,6 +42,7 @@ describe("deployment builder - libraries", () => { const { graph } = generateDeploymentGraphFrom(librariesModule, { chainId: 31, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], }); deploymentGraph = graph; @@ -113,5 +115,19 @@ describe("deployment builder - libraries", () => { assert.deepStrictEqual(depNode.args, [42]); }); + + it("should record the correct address to deploy from", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatLibrary(depNode)) { + return assert.fail("Not a hardhat library dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); }); diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts new file mode 100644 index 0000000000..b956de2ce1 --- /dev/null +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -0,0 +1,35 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "dsl/buildModule"; +import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder } from "types/deploymentGraph"; + +describe("deployment builder - metadata", () => { + it("should inject the chainId via the builder", () => { + const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { + if (m.chainId === 42) { + return {}; + } + + assert.fail("Chain id was not injected"); + }); + + generateDeploymentGraphFrom(chainIdModule, { chainId: 42, accounts: [] }); + }); + + it("should inject the accounts via the builder", () => { + const accountsModule = buildModule("accounts", (m: IDeploymentBuilder) => { + if (m.accounts[0] === "0x1" && m.accounts[1] === "0x2") { + return {}; + } + + assert.fail("Chain id was not injected"); + }); + + generateDeploymentGraphFrom(accountsModule, { + chainId: 42, + accounts: ["0x1", "0x2"], + }); + }); +}); diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 15f470a2e5..70f7374b33 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -42,6 +42,7 @@ describe("deployment builder - parameters", function () { const { graph } = generateDeploymentGraphFrom(WrapModule, { chainId: 31, + accounts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index b0dbd1b685..f800645ca4 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -20,13 +20,14 @@ describe("deployment builder - send ETH", () => { const token = m.contract("Token"); const value = ethers.utils.parseUnits("10"); - m.sendETH(token, { value, after: [token] }); + m.sendETH(token, { value, after: [token], from: m.accounts[0] }); return {}; }); const { graph } = generateDeploymentGraphFrom(sendModule, { chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], }); deploymentGraph = graph; @@ -104,4 +105,18 @@ describe("deployment builder - send ETH", () => { assert.deepStrictEqual(depNode.args, []); }); + + it("should record the correct address to send from", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index c3af5b9e63..d246f66d63 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -24,6 +24,10 @@ import { describe("deployment builder - useModule", () => { let deploymentGraph: IDeploymentGraph; + const options = { + chainId: 31, + accounts: [], + }; describe("use one module from another", () => { before(() => { @@ -52,9 +56,7 @@ describe("deployment builder - useModule", () => { return { token, token2 }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -87,9 +89,7 @@ describe("deployment builder - useModule", () => { return { foo }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -168,9 +168,7 @@ describe("deployment builder - useModule", () => { return { foo }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -218,9 +216,7 @@ describe("deployment builder - useModule", () => { return { foo, bar, baz }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -319,9 +315,7 @@ describe("deployment builder - useModule", () => { return { foo: fooModule.foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -402,9 +396,7 @@ describe("deployment builder - useModule", () => { return { foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(TopModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(TopModule, options); deploymentGraph = graph; }); @@ -481,10 +473,7 @@ describe("deployment builder - useModule", () => { it("should throw", () => { assert.throws( - () => - generateDeploymentGraphFrom(differentParamsModule, { - chainId: 31, - }), + () => generateDeploymentGraphFrom(differentParamsModule, options), /`useModule` cannot be invoked on the same module using different parameters/ ); }); @@ -530,6 +519,7 @@ describe("deployment builder - useModule", () => { // @ts-ignore generateDeploymentGraphFrom(returnsWrongFutureTypeModule, { chainId: 31, + accounts: [], }), /Cannot return Future of type "parameter" from a module/ ); diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts index 48f3600f00..38f85c9b28 100644 --- a/packages/core/test/deploymentBuilder/useSubgraph.ts +++ b/packages/core/test/deploymentBuilder/useSubgraph.ts @@ -18,6 +18,10 @@ import { describe("deployment builder - useSubgraph", () => { let deploymentGraph: IDeploymentGraph; + const options = { + chainId: 31, + accounts: [], + }; describe("use subgraph from within a module", () => { before(() => { @@ -44,9 +48,7 @@ describe("deployment builder - useSubgraph", () => { return { foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); @@ -121,9 +123,7 @@ describe("deployment builder - useSubgraph", () => { return { foo: fooSubgraph.foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - }); + const { graph } = generateDeploymentGraphFrom(WrapModule, options); deploymentGraph = graph; }); diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index a3f2136c5b..1c657578a3 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -40,6 +40,7 @@ describe("deployment builder - value", () => { const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, + accounts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index 010bf258e3..5a4ff9e212 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -75,5 +75,6 @@ function createFakeContractDeployVertex( args: [], libraries: {}, value: BigNumber.from(0), + signer: {} as any, }; } diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 43193e2b5e..3c53972f09 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -39,6 +39,7 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), + signer: {} as any, }; const mockServices = { @@ -100,6 +101,7 @@ describe("Execution - dispatch", () => { label: "Foo", artifact: fakeArtifact, args: [], + signer: {} as any, }; const mockServices = { @@ -188,6 +190,7 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), + signer: {} as any, }; const contractCall: ExecutionVertex = { @@ -198,6 +201,7 @@ describe("Execution - dispatch", () => { method: "inc", args: [1], value: ethers.utils.parseUnits("0"), + signer: {} as any, }; const sendTxStub = sinon.stub(); @@ -286,6 +290,7 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), + signer: {} as any, }; contractCall = { @@ -301,6 +306,7 @@ describe("Execution - dispatch", () => { method: "test", args: [], value: ethers.utils.parseUnits("0"), + signer: {} as any, }; awaitedEvent = { diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 011a5e5284..fa9f83776a 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -12,7 +12,7 @@ import { Ignition } from "../../src/Ignition"; import { getMockServices } from "../helpers"; import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; -describe("Reruning execution", () => { +describe("Rerunning execution", () => { const tokenArtifact: Artifact = { contractName: "Token", abi: [ @@ -47,7 +47,7 @@ describe("Reruning execution", () => { linkReferences: {}, }; - describe("when a deploment is already complete", () => { + describe("when a deployment is already complete", () => { let sentTransactionCount: number; let ignition: Ignition; let myModule: any; @@ -97,6 +97,14 @@ describe("Reruning execution", () => { throw new Error(`Unexpected transaction sent: ${tx}`); }, }, + accounts: { + getAccounts: () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, } as any, journal: new MemoryCommandJournal(), }); @@ -224,6 +232,14 @@ describe("Reruning execution", () => { } }, }, + accounts: { + getAccounts: () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, } as any, journal: new MemoryCommandJournal(), }); @@ -290,6 +306,14 @@ describe("Reruning execution", () => { getArtifact: () => tokenArtifact, }, transactions: new TransactionsService({} as Providers), + accounts: { + getAccounts: () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, } as any, journal: new MemoryCommandJournal(), }); @@ -350,6 +374,14 @@ describe("Reruning execution", () => { }; }, }, + accounts: { + getAccounts: () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, } as any, journal: new MemoryCommandJournal(), }); diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 0b0605a877..52975aee27 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,5 +1,6 @@ import { ethers } from "ethers"; +import { IAccountsService } from "services/AccountsService"; import { IArtifactsService } from "services/ArtifactsService"; import { IConfigService } from "services/ConfigService"; import { IContractsService } from "services/ContractsService"; @@ -17,6 +18,7 @@ export function getMockServices() { artifacts: new MockArtifactsService(), transactions: new MockTransactionService(), config: new MockConfigService(), + accounts: new MockAccountsService(), }; return mockServices; @@ -77,3 +79,13 @@ class MockConfigService implements IConfigService { throw new IgnitionError("Method not implemented."); } } + +class MockAccountsService implements IAccountsService { + public getAccounts(): Promise { + throw new IgnitionError("Method not implemented."); + } + + public getSigner(_address: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 43b2675569..4d3f3eb3c8 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -1,3 +1,5 @@ +import { ethers } from "ethers"; + import { deployStateReducer } from "deployment/deployStateReducer"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; @@ -17,6 +19,7 @@ export function applyActions( export async function resolveExecutionGraphFor(module: Module) { const { graph: deploymentGraph } = generateDeploymentGraphFrom(module, { chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], }); const mockServices = { @@ -34,6 +37,14 @@ export async function resolveExecutionGraphFor(module: Module) { deployedLinkReferences: {}, }), }, + accounts: { + getAccounts: () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, } as any; const { _kind: validationKind } = await validateDeploymentGraph( diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index 59824d7aa1..6488ce382c 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -3,10 +3,10 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import { GasProvider, IgnitionSigner } from "types/providers"; +import { GasProvider } from "types/providers"; import { TxSender } from "utils/tx-sender"; -class SignerSpy implements IgnitionSigner { +class SignerSpy { private _index = -1; public async sendTransaction(_tx: ethers.providers.TransactionRequest) { @@ -46,12 +46,12 @@ function runTests() { const signerStub = createSignerSpy(); const mockTx1 = createMockTx(); - const hash1 = await txSender.send(signerStub, mockTx1); + const hash1 = await txSender.send(signerStub as any, mockTx1); assert.equal(hash1, "hash-0"); assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); const mockTx2 = createMockTx(); - const hash2 = await txSender.send(signerStub, mockTx2); + const hash2 = await txSender.send(signerStub as any, mockTx2); assert.equal(hash2, "hash-1"); assert.isTrue(signerStub.sendTransaction.calledWith(mockTx2)); }); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 3ccf51734f..db40800bfb 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -73,6 +73,25 @@ describe("Validation", () => { ); }); + it("should not validate a artifact contract deploy with a non-address `from`", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Example", exampleArtifact, { + args: [1, 2, 3], + value: ethers.utils.parseUnits("42"), + from: 1 as any, + }); + + return { example }; + }); + + const validationResult = await runValidation(singleModule); + + assertValidationError( + validationResult, + "For contract 'from' must be a valid address string" + ); + }); + it("should not validate a artifact contract deploy with a non-existent bytes artifact arg", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Example", exampleArtifact, { @@ -130,6 +149,24 @@ describe("Validation", () => { ); }); + it("should not validate a artifact library deploy with a non-address `from`", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.library("Example", exampleArtifact, { + args: [], + from: 1 as any, + }); + + return { example }; + }); + + const validationResult = await runValidation(singleModule); + + assertValidationError( + validationResult, + "For library 'from' must be a valid address string" + ); + }); + it("should not validate a artifact library deploy with a non-existent bytes artifact arg", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact, { @@ -384,6 +421,35 @@ describe("Validation", () => { ); }); + it("should fail a call sent from an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.call(example, "nonexistant", { + args: [], + value: ethers.utils.parseUnits("42"), + from: 1 as any, + }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "For call 'from' must be a valid address string" + ); + }); + it("should fail a call with a non-existent bytes artifact arg", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.contract("Foo"); @@ -507,6 +573,34 @@ describe("Validation", () => { "For send 'value' must be a BigNumber" ); }); + + it("should fail a send from an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.sendETH(example, { + value: ethers.utils.parseUnits("42"), + from: 1 as any, + }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "For send 'from' must be a valid address string" + ); + }); }); describe("awaited event", () => { @@ -730,6 +824,28 @@ describe("Validation", () => { ); }); + it("should not validate a contract deployed from an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const nonexistant = m.contract("Nonexistant", { from: 1 as any }); + + return { nonexistant }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => false, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "For contract 'from' must be a valid address string" + ); + }); + it("should not validate a contract with non-existing bytes artifact arg", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const nonexistant = m.contract("Nonexistant", { @@ -820,6 +936,29 @@ describe("Validation", () => { "The constructor of the library 'Example' expects 0 arguments but 2 were given" ); }); + + it("should not validate a library deployed from an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.library("Example", { args: [], from: 1 as any }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "For library 'from' must be a valid address string" + ); + }); }); describe("virtual", () => { @@ -863,6 +1002,7 @@ async function runValidation( const { graph, callPoints } = generateDeploymentGraphFrom(ignitionModule, { chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], }); const validationResult = await validateDeploymentGraph( diff --git a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts index 9b7a092b8e..b47cea42d7 100644 --- a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts +++ b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts @@ -27,12 +27,6 @@ export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { }, }, ethereumProvider: hre.network.provider, - signers: { - getDefaultSigner: async () => { - const [signer] = await hre.ethers.getSigners(); - return signer; - }, - }, transactions: { isConfirmed: async (txHash: any) => { const blockNumber = await hre.ethers.provider.getBlockNumber(); @@ -49,6 +43,16 @@ export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { }, }, config: new ConfigWrapper(), + accounts: { + getAccounts: async () => { + return (await hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + }, + getSigner: async (address) => { + return hre.ethers.getSigner(address); + }, + }, }; return providers; From 729c6cc9c81a75e8970265cd5ef301d8f9ab327c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 8 Mar 2023 20:33:47 -0500 Subject: [PATCH 0249/1302] fix: force flag running Also update/fix multisig example and fixed signers. --- examples/multisig/contracts/Multisig.sol | 2 +- examples/multisig/ignition/MultisigModule.js | 15 ++++++++---- examples/multisig/test/Multisig.js | 18 +++++++------- packages/core/src/Ignition.ts | 14 +++++++---- packages/core/src/deployment/Deployment.ts | 18 ++++++++++++-- .../core/src/deployment/deployStateReducer.ts | 19 ++++++++++++++- .../execution/dispatch/executeContractCall.ts | 4 ++-- .../dispatch/executeContractDeploy.ts | 2 +- .../dispatch/executeLibraryDeploy.ts | 2 +- .../src/execution/dispatch/executeSendETH.ts | 6 ++++- packages/core/src/execution/execute.ts | 2 +- packages/core/src/types/deployment.ts | 5 ++-- .../core/test/deploymentBuilder/accounts.ts | 23 +++++++++++++++++- packages/core/test/execution/dispatch.ts | 24 ++++++++++++++----- packages/core/test/state-reducer/execution.ts | 7 ------ .../hardhat-plugin/test/CommandJournal.ts | 4 ++-- 16 files changed, 120 insertions(+), 45 deletions(-) diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol index 96e3aab704..7790ddc325 100644 --- a/examples/multisig/contracts/Multisig.sol +++ b/examples/multisig/contracts/Multisig.sol @@ -148,7 +148,7 @@ contract Multisig { bytes memory data ) public returns (uint transactionId) { transactionId = addTransaction(destination, value, data); - // confirmTransaction(transactionId); + confirmTransaction(transactionId); } function confirmTransaction( diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js index 479517d6fd..d9e6ef55f9 100644 --- a/examples/multisig/ignition/MultisigModule.js +++ b/examples/multisig/ignition/MultisigModule.js @@ -7,7 +7,7 @@ module.exports = buildModule("MultisigModule", (m) => { const [ACCOUNT_0, ACCOUNT_1] = m.accounts; const owners = [ACCOUNT_0, ACCOUNT_1]; - const required = 1; + const required = 2; const value = ethers.utils.parseUnits("100"); const multisig = m.contract("Multisig", MultisigArtifact, { @@ -16,15 +16,22 @@ module.exports = buildModule("MultisigModule", (m) => { const funding = m.sendETH(multisig, { value, after: [multisig] }); + // contract auto confirms when you submit const call = m.call(multisig, "submitTransaction", { args: [ACCOUNT_0, ethers.utils.parseUnits("50"), "0x00"], after: [funding], }); - // todo: support sending via non-default account - const event = m.event(multisig, "Confirmation", { - args: [ACCOUNT_0, 0], + // second confirmation + const confirm = m.call(multisig, "confirmTransaction", { + args: [0], after: [call], + from: ACCOUNT_1, + }); + + const event = m.event(multisig, "Confirmation", { + args: [ACCOUNT_1, 0], + after: [confirm], }); m.call(multisig, "executeTransaction", { diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js index 390a4f9ac1..dac91e2c6e 100644 --- a/examples/multisig/test/Multisig.js +++ b/examples/multisig/test/Multisig.js @@ -4,6 +4,7 @@ const { ethers } = require("ethers"); const Multisig = require("../ignition/MultisigModule"); const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; +const ACCOUNT_1 = "0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; describe("Multisig", function () { describe("a deploy broken up by an external call", () => { @@ -20,13 +21,6 @@ describe("Multisig", function () { // ignore } - const artifact = await hre.artifacts.readArtifact("Multisig"); - const multisigInstance = await hre.ethers.getContractAt( - artifact.abi, - "0x5FbDB2315678afecb367f032d93F642f64180aa3" - ); - await multisigInstance.confirmTransaction(0); - const moduleResult = await ignition.deploy(Multisig, { journal, }); @@ -35,12 +29,18 @@ describe("Multisig", function () { }); it("should confirm a stored transaction", async function () { - const [isConfirmed] = await multisig.functions.confirmations( + const [isConfirmed0] = await multisig.functions.confirmations( 0, ACCOUNT_0 ); - expect(isConfirmed).to.equal(true); + const [isConfirmed1] = await multisig.functions.confirmations( + 0, + ACCOUNT_1 + ); + + expect(isConfirmed0).to.equal(true); + expect(isConfirmed1).to.equal(true); }); it("should execute a confirmed transaction", async function () { diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 96a4ea911d..ac00c1275f 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -75,9 +75,12 @@ export class Ignition { this._services.accounts.getAccounts(), ]); - await deployment.setChainId(chainId); - await deployment.setNetworkName(options.networkName); - await deployment.setAccounts(accounts); + await deployment.setDeploymentDetails({ + accounts, + chainId, + networkName: options.networkName, + force: options.force, + }); const { result: constructResult, moduleOutputs } = await this._constructExecutionGraphFrom(deployment, ignitionModule); @@ -111,7 +114,6 @@ export class Ignition { gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, pollingInterval: options.pollingInterval, eventDuration: options.eventDuration, - force: options.force, }); return this._buildOutputFrom(executionResult, moduleOutputs); @@ -269,6 +271,10 @@ export class Ignition { private _checkSafeDeployment( deployment: Deployment ): DeploymentResult | { _kind: "success" } { + if (deployment.state.details.force) { + return { _kind: "success" }; + } + if (deployment.state.transform.executionGraph === null) { throw new IgnitionError( "Execution graph must be set to check safe deployment" diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 55f7b564b6..d7f4fc1c53 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -7,6 +7,7 @@ import type { UpdateUiAction, DeployStateCommand, DeployStateExecutionCommand, + DeployNetworkConfig, } from "types/deployment"; import type { ExecutionVertexVisitResult } from "types/executionGraph"; import type { VertexDescriptor, VertexVisitResultFailure } from "types/graph"; @@ -49,6 +50,13 @@ export class Deployment { } } + public setDeploymentDetails(config: Partial) { + return this._runDeploymentCommand( + `DeploymentDetails resolved as ${JSON.stringify(config)}`, + { type: "SET_DETAILS", config } + ); + } + public setChainId(chainId: number) { return this._runDeploymentCommand(`ChainId resolved as '${chainId}'`, { type: "SET_CHAIN_ID", @@ -76,6 +84,13 @@ export class Deployment { ); } + public setForceFlag(force: boolean) { + return this._runDeploymentCommand(`Force resolved as '${force}'`, { + type: "SET_FORCE_FLAG", + force, + }); + } + public startValidation() { return this._runDeploymentCommand("Validate deployment graph", { type: "START_VALIDATION", @@ -118,11 +133,10 @@ export class Deployment { }); } - public startExecutionPhase(executionGraphHash: string, force: boolean) { + public startExecutionPhase(executionGraphHash: string) { return this._runDeploymentCommand("Starting Execution", { type: "EXECUTION::START", executionGraphHash, - force, }); } diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 9dc6f4646c..5529f975b8 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -18,6 +18,7 @@ export function initializeDeployState(moduleName: string): DeployState { chainId: 0, networkName: "", accounts: [], + force: false, }, validation: { errors: [], @@ -43,6 +44,14 @@ export function deployStateReducer( action: DeployStateCommand ): DeployState { switch (action.type) { + case "SET_DETAILS": + return { + ...state, + details: { + ...state.details, + ...action.config, + }, + }; case "SET_CHAIN_ID": return { ...state, @@ -67,6 +76,14 @@ export function deployStateReducer( accounts: action.accounts, }, }; + case "SET_FORCE_FLAG": + return { + ...state, + details: { + ...state.details, + force: action.force, + }, + }; case "START_VALIDATION": return { ...state, @@ -106,7 +123,7 @@ export function deployStateReducer( state.transform.executionGraph, action.executionGraphHash, state.execution, - action.force + state.details.force ), action ); diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 134e77f3b7..7f169b8404 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -22,11 +22,11 @@ export async function executeContractCall( let txHash: string; try { - const contractInstance = new Contract(address, abi); + const contractInstance = new Contract(address, abi, signer); const unsignedTx = await contractInstance.populateTransaction[method]( ...resolvedArgs, - { value } + { value, from: await signer.getAddress() } ); txHash = await services.contracts.sendTx(unsignedTx, { diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index d05c8b75f0..fbe2954a65 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -34,7 +34,7 @@ export async function executeContractDeploy( resolvedLibraries ); - const Factory = new ContractFactory(artifact.abi, linkedByteCode); + const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); const deployTransaction = Factory.getDeployTransaction(...resolvedArgs, { value, diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index 70537b9958..d785846134 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -24,7 +24,7 @@ export async function executeLibraryDeploy( const linkedByteCode = await collectLibrariesAndLink(artifact, {}); - const Factory = new ContractFactory(artifact.abi, linkedByteCode); + const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts index 424af59a42..dc6d26ae7e 100644 --- a/packages/core/src/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -17,7 +17,11 @@ export async function executeSendETH( let txHash: string; try { - const tx: PopulatedTransaction = { to, value }; + const tx: PopulatedTransaction = { + to, + value, + from: await signer.getAddress(), + }; txHash = await services.contracts.sendTx(tx, { ...options, diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 728962d3ec..73749d3b9a 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -39,7 +39,7 @@ export async function executeInBatches( ): Promise { const executionGraphHash = hashExecutionGraph(executionGraph); - await deployment.startExecutionPhase(executionGraphHash, options.force); + await deployment.startExecutionPhase(executionGraphHash); while (deployment.hasUnstarted()) { const batch = calculateNextBatch( diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 06e2796eb9..57bf8122f2 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -39,7 +39,6 @@ export type DeployStateExecutionCommand = | { type: "EXECUTION::START"; executionGraphHash: string; - force: boolean; } | { type: "EXECUTION::SET_BATCH"; @@ -52,9 +51,11 @@ export type DeployStateExecutionCommand = }; export type DeployStateCommand = + | { type: "SET_DETAILS"; config: Partial } | { type: "SET_CHAIN_ID"; chainId: number } | { type: "SET_NETWORK_NAME"; networkName: string } | { type: "SET_ACCOUNTS"; accounts: string[] } + | { type: "SET_FORCE_FLAG"; force: boolean } | { type: "START_VALIDATION"; } @@ -137,6 +138,7 @@ export interface DeployNetworkConfig { chainId: number; networkName: string; accounts: string[]; + force: boolean; } export interface DeployState { @@ -157,7 +159,6 @@ export interface ExecutionOptions { gasPriceIncrementPerRetry: BigNumber | null; pollingInterval: number; eventDuration: number; - force: boolean; } export interface ExecutionContext { diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index fe20ff1a7d..cfde369576 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -1,5 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { ethers } from "ethers"; import { buildModule } from "dsl/buildModule"; import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; @@ -7,7 +8,7 @@ import type { IDeploymentGraph, IDeploymentBuilder, } from "types/deploymentGraph"; -import { isHardhatContract } from "utils/guards"; +import { isCall, isHardhatContract } from "utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -21,6 +22,12 @@ describe("deployment builder - accounts", () => { from: m.accounts[1], }); + m.call(exchange, "addToken", { + args: [token], + value: ethers.utils.parseUnits("10"), + from: m.accounts[1], + }); + return { token, exchange }; }); @@ -56,4 +63,18 @@ describe("deployment builder - accounts", () => { assert.equal(depNode.from, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); }); + + it("should call a function with a given from address", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + assert.isDefined(depNode); + if (!isCall(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal(depNode.from, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); + }); }); diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 3c53972f09..e97ed8d377 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -39,7 +39,9 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; const mockServices = { @@ -101,7 +103,9 @@ describe("Execution - dispatch", () => { label: "Foo", artifact: fakeArtifact, args: [], - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; const mockServices = { @@ -190,7 +194,9 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; const contractCall: ExecutionVertex = { @@ -201,7 +207,9 @@ describe("Execution - dispatch", () => { method: "inc", args: [1], value: ethers.utils.parseUnits("0"), - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; const sendTxStub = sinon.stub(); @@ -290,7 +298,9 @@ describe("Execution - dispatch", () => { args: [], libraries: {}, value: ethers.utils.parseUnits("0"), - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; contractCall = { @@ -306,7 +316,9 @@ describe("Execution - dispatch", () => { method: "test", args: [], value: ethers.utils.parseUnits("0"), - signer: {} as any, + signer: new ethers.VoidSigner( + "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" + ), }; awaitedEvent = { diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index 323e125987..58af1eea1c 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -56,7 +56,6 @@ describe("deployment state reducer", () => { state = deployStateReducer(state, { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }); }); @@ -92,7 +91,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { type: "EXECUTION::SET_BATCH", @@ -113,7 +111,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { type: "EXECUTION::SET_BATCH", @@ -149,7 +146,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { type: "EXECUTION::SET_BATCH", @@ -184,7 +180,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { @@ -258,7 +253,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { @@ -308,7 +302,6 @@ describe("deployment state reducer", () => { { type: "EXECUTION::START", executionGraphHash: "XXX", - force: false, }, { diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 30b62a8642..6528d4b9e1 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -22,7 +22,7 @@ describe("File based command journal", () => { const journal = new CommandJournal(31337, tempCommandFilePath); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX", force: false }, + { type: "EXECUTION::START", executionGraphHash: "XXX" }, { type: "EXECUTION::SET_BATCH", batch: [0, 1, 2, 3] }, { type: "EXECUTION::SET_VERTEX_RESULT", @@ -96,7 +96,7 @@ describe("File based command journal", () => { ); const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX", force: false }, + { type: "EXECUTION::START", executionGraphHash: "XXX" }, ]; for (const command of commands) { From eede498f6f73c811aa8ec9f3ffb3f8413030a12c Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 14 Mar 2023 12:06:37 +0000 Subject: [PATCH 0250/1302] chore: bump version to v0.0.10 Update the packages versions and changelogs for the `0.0.10 - 2023-04-14` release. --- examples/create2/package.json | 4 +- examples/ens/package.json | 4 +- examples/multisig/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/uniswap/package.json | 4 +- package-lock.json | 66 +++++++++++++++++++++------- packages/core/CHANGELOG.md | 10 +++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 10 +++++ packages/hardhat-plugin/package.json | 6 +-- 11 files changed, 86 insertions(+), 32 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index 9f3b6ead1b..4d6e46671e 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-create2-example", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -11,7 +11,7 @@ }, "devDependencies": { "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.9" + "@ignored/hardhat-ignition": "^0.0.10" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index dca5b1068c..2f36776a9b 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 46cabbdba5..338ae63917 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-example-multisig", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/sample/package.json b/examples/sample/package.json index 09e4bd0c51..20e27001f6 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index aae5815b4f..e9caf8c7b4 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 74dfe11a64..9fde1ec60b 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.9", + "version": "0.0.10", "scripts": { "test:examples": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -12,7 +12,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", diff --git a/package-lock.json b/package-lock.json index cbc8cb9a0e..2287e5b9d4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,30 +28,64 @@ }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.9", + "version": "0.0.10", "dependencies": { "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "hardhat": "^2.10.0" } }, + "examples/create2/node_modules/@ignored/ignition-core": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@ignored/ignition-core/-/ignition-core-0.0.9.tgz", + "integrity": "sha512-StlJaxp+eRE9iBTnOmGPj/IkqvuXou+pVlWjRJfXpHyIis1oeodmPWXjBnfI9uluKO1dHxHWj/ox/3xIeFUkOw==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/address": "5.6.1", + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0", + "js-graph-algorithms": "1.0.18", + "object-hash": "^3.0.0", + "serialize-error": "8.1.0" + }, + "engines": { + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + }, + "peerDependencies": { + "hardhat": "^2.12.0" + } + }, "examples/create2/node_modules/@openzeppelin/contracts": { "version": "4.7.3", "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" }, + "examples/create2/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.9", + "version": "0.0.10", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -79,14 +113,14 @@ }, "examples/multisig": { "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.9", + "version": "0.0.10", "dependencies": { "@openzeppelin/contracts": "^4.3.2" }, "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -114,11 +148,11 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.9", + "version": "0.0.10", "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -146,11 +180,11 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.9", + "version": "0.0.10", "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -395,7 +429,7 @@ }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.9", + "version": "0.0.10", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -409,7 +443,7 @@ "devDependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/providers": "5.7.2", - "@ignored/hardhat-ignition": "^0.0.9", + "@ignored/hardhat-ignition": "^0.0.10", "@nomicfoundation/hardhat-chai-matchers": "1.0.4", "@nomicfoundation/hardhat-network-helpers": "1.0.6", "@nomicfoundation/hardhat-toolbox": "2.0.0", @@ -18355,7 +18389,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -18428,7 +18462,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -18442,7 +18476,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.9", + "@ignored/ignition-core": "^0.0.10", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -18483,7 +18517,7 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.9", + "@ignored/ignition-core": "^0.0.10", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 00dd8e2bc2..b1fa9e4dda 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.10 - 2023-04-14 + +### Added + +- Make Hardhat network accounts available within modules ([#166](https://github.com/NomicFoundation/ignition/pull/166)) + +### Changed + +- Show file/line/column against validation errors, so that module problems can more easily be traced back to the source code ([#160](https://github.com/NomicFoundation/ignition/pull/160)) + ## 0.0.9 - 2023-03-02 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 5fde3d21fc..6a31182d54 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 167900747d..3e2d2288e5 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.10 - 2023-04-14 + +### Added + +- Make Hardhat network accounts available within modules ([#166](https://github.com/NomicFoundation/ignition/pull/166)) + +### Changed + +- Show file/line/column against validation errors, so that module problems can more easily be traced back to the source code ([#160](https://github.com/NomicFoundation/ignition/pull/160)) + ## 0.0.9 - 2023-03-02 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index d4c7bc2b8c..f93934e476 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.9", + "version": "0.0.10", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.9", + "@ignored/ignition-core": "^0.0.10", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -71,7 +71,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.9", + "@ignored/ignition-core": "^0.0.10", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 460ca681f012d6545c5556aca088ce3793bf963b Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 24 Jan 2023 17:00:48 +0000 Subject: [PATCH 0251/1302] docs: distributable deployments design doc Outline of our approach to distributable deployments. --- CONTRIBUTING.md | 2 + docs/distributable-deployments.md | 132 ++++++++++++++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 docs/distributable-deployments.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 38d6bb42b8..876a842e5e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -19,6 +19,8 @@ There are two packages: An overview of the [design of the deploy process is explained here](./docs/design.md). +An outline of our plans for [distributable deployments is here](./docs/distributable-deployments.md) + ## Setup Ignition is a `typescript` project managed by `npm`. diff --git a/docs/distributable-deployments.md b/docs/distributable-deployments.md new file mode 100644 index 0000000000..a1d1870f23 --- /dev/null +++ b/docs/distributable-deployments.md @@ -0,0 +1,132 @@ +# Distributable Deployments + +Ignition is intended to allow packaging and distribution of deployment logic. The goal is: + +- the composing of deployment logic to create complex systems +- to allow the distribution of complex contract systems for local testing +- to allow third parties to easily use your deployed contracts and accompanying deployment logic in their own deployment +- multi-targeting of different chains +- deployments should be verifiable +- Deployed contracts should be usable with frontend development frameworks through typescript types + +A verifiable deployment is one where: + +- every internal contract deploy can show the providence of the underlying bytecode back to the source code and constructor args +- every used or depended on external contract is known and has providence +- the external contract code used in the internal contract code matches the code in the external contracts providence + +Demonstrating the providence of bytecode (whether deployed or ready to deploy) means reproducing the bytecode from source with the correct solc version (and build?), solc settings, library references and contract name. If deployed on-chain, the constructor args will be needed as well. + +## Current status + +Ignition allows for the definition of deployment logic through a javascript dsl api. A single unit of deployment logic is a Module. A user can compose modules together to build more complex modules. There is no mechanism for distributing Modules or the artifacts (bytecode + metadata + abi) that they use. + +## Proposal + +Have ignition modules generate a `Deployment artifact`, which will consist of: + +- the chain the deployment is against +- contract artifacts - code + solc version + solc settings + library references + contract name = reproducible bytecode + abi +- registry - key/value pairs where the human readable name (i.e. "uniswap/SwapRouter") points to one of the reproducible contract artifacts +- execution graph - the Ignition execution graph but changed from the current implementation so that vertexes contain not the bytecode + abi but a name that can be resolved through the registry +- module parameters - config settings (not sure on this one - maybe they are integrated into the execution graph) + +Ignition can verify the `Deployment artifact` by checking that the bytecode and abi of each contract has providence. The check that the compiled code uses the external contracts code will be done by hardhat during compile. + +Ignition can deploy the `Deployment artifact` and generates a `Deployment Result` as it progresses, this consists of: + +- the journal - giving a log of the deployment execution +- the deployed contracts list - the address and pointer to the contract artifact of successful deploys +- typing information to make the contracts usable in frontend development + +The module api will be modified to support checking registered deployed contract lists, to enable: + +```js +buildModule((m) => { + if (m.alreadyDeployed("uniswap/SwapRouter")) { + return m.contractAt("uniswap/SwapRouter"); + } else { + // ... lots of steps + } +}); +``` + +With the above in place we can distribute a deployment (via npm or some other mechanism): + +- contract artifacts +- deployed contract list +- js module function(s) - a default setup of the system, and optional setups for specific test scenarios + +A consumer of the distributable deployment will: + +- register the contract artifacts + deployed contract lists with ignition under hardhat.config +- use exported js module functions in their own js module +- import deployed solidity code via nifty custom import resolution i.e. `import { instance as uniswapRouter } from "ignition://uniswap/SwapRouter";` + +### Deployment artifact + +```mermaid +graph LR + subgraph Deployment Artifact + + subgraph AA[Contract A artifacts] + subgraph input[Solc inputs] + direction LR + + cont[contract name] + solidity[solidity files] + end + subgraph output[Solc outputs] + abi + bytecode + end + end + + subgraph BB[Contract B artifacts] + subgraph inputB[Solc inputs] + contb[contract name] + solidityb[solidity files] + end + subgraph outputB[Solc outputs] + abib[abi] + bytecodeb[bytecode] + end + end + + subgraph registry[Registry] + direction LR + A[Contract A] --> AA + B[Contract B] --> BB + end + + subgraph E[Execution Graph] + direction TB + + deployA{Deploy A} --> deployB{Deploy B} + + deployA -.-> A + deployB -.-> B + end + + end +``` + +## NPM package + +We may look at other distribution mechanisms but we want to support distribution via npm as a baseline. We should define a good default package layout to support turning a hh project into a distributable deployment of both code artifacts and deployment logic. + +## Development flow + +- Setup your contracts + - Install any contracts you leverage by adding a package via npm + - Register the external systems in the ignition registry via hardhat config + - write an ignition module for that leverages the imported (via npm) external systems ignition js module, include your own contract deploys in this ignition module + - write hh tests using ignition to setup the external contracts and your own contracts on the hh node +- Deploy your contracts + - use ignition to generate an ignition deployment artifact (including all the data required to deploy/verify/setup in tests your system) + - run the deployment on each chain you are deploying to + - rerun on failures + - recreate the deployment artifact if needed. + - commit your successful deployed contract list and the deployment artifact to the repo +- Distribute your contracts + - push the repo to npm including the deployment artifact and the deployment result's deployed contract list From 4ee401ca0a85afd753dc4f653cbd4d09bd6eac92 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 15 Mar 2023 15:38:47 +0000 Subject: [PATCH 0252/1302] refactor: change imports (#167) * refactor: remove `baseUrl` Remove baseUrl and switch to relative paths in prep for sync with HH setup. * chore: update prettier file checks Apply to readme and contributing. * chore: update eslint to match hardhat Update the eslint config to match the latest version from hardhat. * chore: update examples to use npm for install * chore: switch to plain test in examples Use the workspace flags to separate out examples tests and packages tests. * chore: exclude eslintrc files from eslint This is due to vscodes eslint server. * chore: update ts-node This brings nyc remapping back into working order. * chore: rework tsconfig Copy the structure and package approach taken by hardhat. * refactor(core): simplify isPromise check * refactor(core): switch execution not set value to be undefined We are switching from null to undefined to simplify the later type checks. * style: update eslint import rules * refactor: remove Boolean pattern * refactor: prefer eslint switch exhaustive check Use the eslint rule to enforce that all cases of a union type are covered. Note this requires removing the default branch, which we were using only for throwing errors. --- .editorconfig | 1 + .github/workflows/ci.yml | 6 - CONTRIBUTING.md | 4 +- config/eslint/{.eslintrc.js => eslintrc.js} | 63 +- config/typescript/tsconfig.json | 14 + examples/create2/.eslintrc.js | 2 +- examples/create2/README.md | 2 +- examples/create2/package.json | 7 +- examples/ens/README.md | 2 +- examples/ens/package.json | 19 +- examples/multisig/README.md | 2 +- examples/multisig/package.json | 19 +- examples/sample/README.md | 2 +- examples/sample/package.json | 19 +- examples/ts-sample/README.md | 2 +- examples/ts-sample/package.json | 24 +- examples/uniswap/README.md | 2 +- examples/uniswap/package.json | 19 +- package-lock.json | 2456 ++++++++--------- package.json | 15 +- packages/core/.eslintrc.js | 10 +- packages/core/.mocharc.json | 2 +- packages/core/.npmignore | 4 +- packages/core/package.json | 14 +- packages/core/post-build.js | 104 - packages/core/src/Ignition.ts | 41 +- packages/core/src/deployment/Deployment.ts | 35 +- .../deployment/deployExecutionStateReducer.ts | 23 +- .../core/src/deployment/deployStateReducer.ts | 11 +- packages/core/src/deployment/utils.ts | 13 +- packages/core/src/dsl/DeploymentBuilder.ts | 256 +- packages/core/src/dsl/DeploymentGraph.ts | 4 +- packages/core/src/dsl/buildModule.ts | 7 +- packages/core/src/dsl/buildSubgraph.ts | 7 +- packages/core/src/execution/ExecutionGraph.ts | 4 +- .../execution/dispatch/executeAwaitedEvent.ts | 13 +- .../execution/dispatch/executeContractCall.ts | 13 +- .../dispatch/executeContractDeploy.ts | 13 +- .../dispatch/executeDeployedContract.ts | 7 +- .../dispatch/executeLibraryDeploy.ts | 13 +- .../src/execution/dispatch/executeSendETH.ts | 11 +- .../execution/dispatch/executionDispatch.ts | 15 +- packages/core/src/execution/dispatch/utils.ts | 9 +- packages/core/src/execution/execute.ts | 15 +- .../core/src/execution/loadJournalInto.ts | 4 +- packages/core/src/execution/utils.ts | 6 +- packages/core/src/graph/Graph.ts | 2 +- packages/core/src/graph/adjacencyList.ts | 4 +- packages/core/src/graph/utils.ts | 2 +- packages/core/src/graph/visit.ts | 4 +- packages/core/src/index.ts | 47 +- .../core/src/journal/NoopCommandJournal.ts | 4 +- .../process/generateDeploymentGraphFrom.ts | 21 +- ...onvertDeploymentVertexToExecutionVertex.ts | 32 +- ...oymentGraphByEliminatingVirtualVertexes.ts | 6 +- ...ransformDeploymentGraphToExecutionGraph.ts | 15 +- packages/core/src/services/AccountsService.ts | 3 +- .../core/src/services/ArtifactsService.ts | 4 +- packages/core/src/services/ConfigService.ts | 4 +- .../core/src/services/ContractsService.ts | 29 +- packages/core/src/services/NetworkService.ts | 2 +- .../core/src/services/TransactionsService.ts | 2 +- packages/core/src/services/createServices.ts | 4 +- packages/core/src/types/deployment.ts | 12 +- packages/core/src/types/graph.ts | 5 +- packages/core/src/types/journal.ts | 2 +- packages/core/src/types/providers.ts | 4 +- packages/core/src/types/validation.ts | 2 +- .../core/src/utils/collectLibrariesAndLink.ts | 4 +- packages/core/src/utils/guards.ts | 23 +- packages/core/src/utils/proxy.ts | 2 +- packages/core/src/utils/tx-sender.ts | 2 +- .../core/src/validation/dispatch/helpers.ts | 27 +- .../dispatch/validateArtifactContract.ts | 8 +- .../dispatch/validateArtifactLibrary.ts | 8 +- .../src/validation/dispatch/validateCall.ts | 8 +- .../dispatch/validateDeployedContract.ts | 6 +- .../src/validation/dispatch/validateEvent.ts | 6 +- .../dispatch/validateHardhatContract.ts | 8 +- .../dispatch/validateHardhatLibrary.ts | 6 +- .../validation/dispatch/validateSendETH.ts | 8 +- .../validation/dispatch/validateVirtual.ts | 6 +- .../validation/dispatch/validationDispatch.ts | 7 +- .../src/validation/validateDeploymentGraph.ts | 14 +- packages/core/test/buildModule.ts | 2 +- packages/core/test/collectLibrariesAndLink.ts | 2 +- packages/core/test/contractsService.ts | 30 +- .../core/test/deploymentBuilder/accounts.ts | 30 +- .../test/deploymentBuilder/buildModule.ts | 6 +- packages/core/test/deploymentBuilder/calls.ts | 11 +- .../core/test/deploymentBuilder/deploy.ts | 15 +- packages/core/test/deploymentBuilder/event.ts | 17 +- .../deploymentBuilder/getBytesForArtifact.ts | 11 +- .../core/test/deploymentBuilder/helpers.ts | 8 +- .../core/test/deploymentBuilder/libraries.ts | 13 +- .../core/test/deploymentBuilder/metadata.ts | 6 +- .../core/test/deploymentBuilder/parameters.ts | 17 +- .../core/test/deploymentBuilder/sendETH.ts | 11 +- .../core/test/deploymentBuilder/useModule.ts | 15 +- .../test/deploymentBuilder/useSubgraph.ts | 17 +- packages/core/test/deploymentBuilder/value.ts | 41 +- packages/core/test/execution/batching.ts | 20 +- packages/core/test/execution/dispatch.ts | 23 +- packages/core/test/execution/rerun.ts | 31 +- packages/core/test/graph/adjacencyList.ts | 2 +- packages/core/test/graph/helpers.ts | 2 +- packages/core/test/helpers.ts | 20 +- packages/core/test/state-reducer/execution.ts | 20 +- .../test/state-reducer/preparation-steps.ts | 13 +- packages/core/test/state-reducer/utils.ts | 13 +- packages/core/test/tsconfig.json | 14 - packages/core/test/tx-sender.ts | 4 +- .../core/test/util/MemoryCommandJournal.ts | 4 +- packages/core/test/validation.ts | 23 +- packages/core/tsconfig.json | 10 +- packages/hardhat-plugin/.eslintrc.js | 7 +- packages/hardhat-plugin/package.json | 8 +- .../hardhat-plugin/src/ignition-wrapper.ts | 15 +- packages/hardhat-plugin/src/index.ts | 4 +- packages/hardhat-plugin/src/load-module.ts | 1 - .../hardhat-plugin/src/plan/assets/bundle.ts | 1 + packages/hardhat-plugin/src/plan/index.ts | 1 + packages/hardhat-plugin/src/plan/utils.ts | 29 +- .../hardhat-plugin/src/type-extensions.ts | 1 - .../components/execution/AddressResults.tsx | 4 +- .../components/execution/BatchExecution.tsx | 8 - .../components/execution/ExecutionPanel.tsx | 1 + .../ui/components/execution/FinalStatus.tsx | 9 +- .../components/execution/ModuleParameters.tsx | 3 +- .../src/ui/components/index.tsx | 57 +- packages/hardhat-plugin/src/ui/types.ts | 7 - packages/hardhat-plugin/test/helpers.ts | 35 +- packages/hardhat-plugin/test/load-module.ts | 10 +- packages/hardhat-plugin/test/tsconfig.json | 14 - packages/hardhat-plugin/tsconfig.json | 13 +- packages/tsconfig.json | 4 - packages/tsconfig.settings.json | 18 - tsconfig.json | 16 - 138 files changed, 1984 insertions(+), 2420 deletions(-) rename config/eslint/{.eslintrc.js => eslintrc.js} (85%) create mode 100644 config/typescript/tsconfig.json delete mode 100644 packages/core/post-build.js delete mode 100644 packages/core/test/tsconfig.json delete mode 100644 packages/hardhat-plugin/test/tsconfig.json delete mode 100644 packages/tsconfig.json delete mode 100644 packages/tsconfig.settings.json delete mode 100644 tsconfig.json diff --git a/.editorconfig b/.editorconfig index 9e3c877c76..d774fcf443 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,3 +8,4 @@ indent_style = space indent_size = 2 insert_final_newline = true trim_trailing_whitespace = true +max_line_length = 80 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db2ef801cb..3cbc020292 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -25,8 +25,6 @@ jobs: run: npm run build - name: Lint run: npm run lint - - name: Check tests typecheck - run: npm run test:build - name: Run tests run: npm run test - name: Run tests in examples @@ -49,8 +47,6 @@ jobs: run: npm run build - name: Lint run: npm run lint - - name: Check tests typecheck - run: npm run test:build - name: Run tests run: npm run test - name: Run tests in examples @@ -76,8 +72,6 @@ jobs: run: npm run build - name: Lint run: npm run lint - - name: Check tests typecheck - run: npm run test:build - name: Run tests run: npm run test - name: Run tests in examples diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 876a842e5e..86e34c36cf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,8 +12,8 @@ This repository is a monorepo handled with `npm` workspaces. There are two packages: -* [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments -* [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library +- [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments +- [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library ## Design diff --git a/config/eslint/.eslintrc.js b/config/eslint/eslintrc.js similarity index 85% rename from config/eslint/.eslintrc.js rename to config/eslint/eslintrc.js index 1e49c764cb..c8c7744f02 100644 --- a/config/eslint/.eslintrc.js +++ b/config/eslint/eslintrc.js @@ -1,14 +1,4 @@ module.exports = { - settings: { - "import/resolver": { - typescript: { - project: [ - "packages/core/tsconfig.json", - "packages/hardhat-plugin/tsconfig.json", - ], - }, - }, - }, env: { browser: false, es6: true, @@ -16,16 +6,13 @@ module.exports = { }, extends: ["plugin:prettier/recommended"], parser: "@typescript-eslint/parser", - parserOptions: { - project: "./tsconfig.json", - tsConfigRootDir: "./", - }, - plugins: ["eslint-plugin-import", "@typescript-eslint", "mocha"], + plugins: [ + "@nomiclabs/eslint-plugin-hardhat-internal-rules", + "eslint-plugin-import", + "no-only-tests", + "@typescript-eslint", + ], rules: { - "import/no-unused-modules": [ - 1, - { unusedExports: true, missingExports: true }, - ], "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": [ "error", @@ -88,7 +75,7 @@ module.exports = { trailingUnderscore: "allow", }, { - selector: "classProperty", + selector: ["classProperty"], format: ["camelCase", "UPPER_CASE"], leadingUnderscore: "allow", }, @@ -103,7 +90,11 @@ module.exports = { leadingUnderscore: "require", }, { - selector: ["objectLiteralProperty", "objectLiteralMethod"], + selector: ["objectLiteralProperty"], + format: null, + }, + { + selector: ["objectLiteralMethod"], format: ["camelCase", "PascalCase", "snake_case", "UPPER_CASE"], leadingUnderscore: "allow", }, @@ -116,6 +107,11 @@ module.exports = { selector: "typeLike", format: ["PascalCase"], }, + { + selector: "typeProperty", + filter: "__hardhatContext", + format: null, + }, ], "@typescript-eslint/no-empty-interface": "error", "@typescript-eslint/no-floating-promises": "error", @@ -141,12 +137,22 @@ module.exports = { "@typescript-eslint/prefer-function-type": "error", "@typescript-eslint/prefer-namespace-keyword": "error", "@typescript-eslint/restrict-plus-operands": "error", - "@typescript-eslint/strict-boolean-expressions": [ + "@typescript-eslint/restrict-template-expressions": [ "error", { allowAny: true, }, ], + "@typescript-eslint/strict-boolean-expressions": [ + "error", + { + allowString: false, + allowNumber: false, + allowNullableObject: false, + allowAny: false, + }, + ], + "@typescript-eslint/switch-exhaustiveness-check": "error", "@typescript-eslint/triple-slash-reference": [ "error", { @@ -175,6 +181,7 @@ module.exports = { order: "asc", }, groups: [ + "type", "object", ["builtin", "external"], "internal", @@ -185,10 +192,10 @@ module.exports = { "newlines-between": "always", }, ], + "import/no-default-export": "error", "no-bitwise": "error", "no-caller": "error", "no-cond-assign": "error", - "no-return-assign": ["error", "always"], "no-debugger": "error", "no-duplicate-case": "error", "no-duplicate-imports": "error", @@ -196,7 +203,9 @@ module.exports = { "no-extra-bind": "error", "no-new-func": "error", "no-new-wrappers": "error", + "no-only-tests/no-only-tests": "error", "no-return-await": "off", + "@typescript-eslint/return-await": "error", "no-sequences": "error", "no-sparse-arrays": "error", "no-template-curly-in-string": "error", @@ -220,7 +229,11 @@ module.exports = { }, ], "use-isnan": "error", - "mocha/no-skipped-tests": "error", - "mocha/no-exclusive-tests": "error", + "no-restricted-imports": [ + "error", + { + patterns: ["hardhat/src", "@nomiclabs/*/src"], + }, + ], }, }; diff --git a/config/typescript/tsconfig.json b/config/typescript/tsconfig.json new file mode 100644 index 0000000000..fbbc0efe2c --- /dev/null +++ b/config/typescript/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "commonjs", + "declaration": true, + "declarationMap": true, + "sourceMap": true, + "strict": true, + "esModuleInterop": true, + "noEmitOnError": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true + } +} diff --git a/examples/create2/.eslintrc.js b/examples/create2/.eslintrc.js index 8457c86dfe..89ab13dc05 100644 --- a/examples/create2/.eslintrc.js +++ b/examples/create2/.eslintrc.js @@ -10,5 +10,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: ["artifacts/*", "cache/*"], }; diff --git a/examples/create2/README.md b/examples/create2/README.md index 07c18c93b6..7f9e67be72 100644 --- a/examples/create2/README.md +++ b/examples/create2/README.md @@ -11,5 +11,5 @@ Currently our api isn't flexible enough to support direct cli use of `create2` f To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/create2/package.json b/examples/create2/package.json index 4d6e46671e..f61569ddce 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -3,15 +3,16 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "hardhat": "^2.10.0", - "@ignored/hardhat-ignition": "^0.0.10" + "@ignored/hardhat-ignition": "^0.0.10", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/README.md b/examples/ens/README.md index 9750187707..70ce43f4b2 100644 --- a/examples/ens/README.md +++ b/examples/ens/README.md @@ -23,5 +23,5 @@ npx hardhat deploy test-registrar.js --network localhost To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/ens/package.json b/examples/ens/package.json index 2f36776a9b..98a13997ed 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -3,29 +3,16 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/multisig/README.md b/examples/multisig/README.md index 7d07dcec0f..01e69fbfb5 100644 --- a/examples/multisig/README.md +++ b/examples/multisig/README.md @@ -39,5 +39,5 @@ npx hardhat deploy MultisigModule.js --network localhost To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 338ae63917..98338db862 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -3,29 +3,16 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" }, "dependencies": { "@openzeppelin/contracts": "^4.3.2" diff --git a/examples/sample/README.md b/examples/sample/README.md index d252ff6fdf..cf907930be 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -15,5 +15,5 @@ npx hardhat deploy LockModule.js To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/sample/package.json b/examples/sample/package.json index 20e27001f6..e513d7711d 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -3,28 +3,15 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } } diff --git a/examples/ts-sample/README.md b/examples/ts-sample/README.md index 31551d51b0..673f2058ef 100644 --- a/examples/ts-sample/README.md +++ b/examples/ts-sample/README.md @@ -15,5 +15,5 @@ npx hardhat deploy LockModule To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index e9caf8c7b4..863165a65c 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -3,33 +3,15 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx,ts,tsx}\" \"test/**/*.{js,jsx,ts,tsx}\"", "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", - "chai": "4.3.7", - "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-import": "^2.27.5", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1", - "typescript": "^4.7.4" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } } diff --git a/examples/uniswap/README.md b/examples/uniswap/README.md index 0d088dc77a..d4680d5eac 100644 --- a/examples/uniswap/README.md +++ b/examples/uniswap/README.md @@ -15,5 +15,5 @@ npx hardhat deploy Uniswap.js To run the hardhat tests using ignition: ```shell -npm run test:examples +npm run test ``` diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 9fde1ec60b..c2a1f4ebb6 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -3,29 +3,16 @@ "private": true, "version": "0.0.10", "scripts": { - "test:examples": "hardhat test", + "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" }, "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", diff --git a/package-lock.json b/package-lock.json index 2287e5b9d4..c87b1fdad0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,5 @@ { "name": "root", - "version": "0.0.10", "lockfileVersion": 3, "requires": true, "packages": { @@ -34,47 +33,13 @@ }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.10", - "hardhat": "^2.10.0" - } - }, - "examples/create2/node_modules/@ignored/ignition-core": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/@ignored/ignition-core/-/ignition-core-0.0.9.tgz", - "integrity": "sha512-StlJaxp+eRE9iBTnOmGPj/IkqvuXou+pVlWjRJfXpHyIis1oeodmPWXjBnfI9uluKO1dHxHWj/ox/3xIeFUkOw==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/address": "5.6.1", - "debug": "^4.3.2", - "ethers": "^5.4.7", - "fs-extra": "^10.0.0", - "js-graph-algorithms": "1.0.18", - "object-hash": "^3.0.0", - "serialize-error": "8.1.0" - }, - "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - }, - "peerDependencies": { - "hardhat": "^2.12.0" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/create2/node_modules/@openzeppelin/contracts": { "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" - }, - "examples/create2/node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", @@ -83,32 +48,9 @@ "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" - } - }, - "examples/ens/node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", - "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/multisig": { @@ -118,313 +60,27 @@ "@openzeppelin/contracts": "^4.3.2" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" - } - }, - "examples/multisig/node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", - "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", "version": "0.0.10", "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" - } - }, - "examples/sample/node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", - "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", "version": "0.0.10", "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "@typescript-eslint/eslint-plugin": "^5.52.0", - "@typescript-eslint/parser": "^5.52.0", - "chai": "4.3.7", - "eslint-import-resolver-typescript": "^3.5.3", - "eslint-plugin-import": "^2.27.5", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1", - "typescript": "^4.7.4" - } - }, - "examples/ts-sample/node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", - "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "examples/ts-sample/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "examples/ts-sample/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "examples/ts-sample/node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "examples/ts-sample/node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "examples/ts-sample/node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "examples/ts-sample/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "examples/ts-sample/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/uniswap": { @@ -441,38 +97,14 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/providers": "5.7.2", "@ignored/hardhat-ignition": "^0.0.10", - "@nomicfoundation/hardhat-chai-matchers": "1.0.4", - "@nomicfoundation/hardhat-network-helpers": "1.0.6", - "@nomicfoundation/hardhat-toolbox": "2.0.0", - "@nomiclabs/hardhat-ethers": "2.2.1", - "@nomiclabs/hardhat-etherscan": "3.1.2", - "@typechain/ethers-v5": "10.1.1", - "@typechain/hardhat": "6.1.4", - "chai": "4.3.7", - "ethers": "5.7.2", - "hardhat": "^2.12.0", - "hardhat-gas-reporter": "1.0.9", - "solidity-coverage": "0.8.2", - "typechain": "8.1.1" - } - }, - "examples/uniswap/node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.1.tgz", - "integrity": "sha512-RHWYwnxryWR8hzRmU4Jm/q4gzvXpetUOJ4OPlwH2YARcDB+j79+yAYCwO0lN1SUOb4++oOTJEe6AWLEc42LIvg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" } }, "examples/uniswap/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", @@ -497,30 +129,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.14.tgz", - "integrity": "sha512-0YpKHD6ImkWMEINCyDAD0HLLUH/lPCefG8ld9it8DJB2wnApraKuhgYTvTY1z7UFIfBTGy5LwncZ+5HWWGbhFw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.1.0", + "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -547,6 +179,18 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/core/node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -557,13 +201,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.21.3", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { @@ -603,6 +248,15 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -612,6 +266,12 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -622,13 +282,13 @@ } }, "node_modules/@babel/helper-function-name": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz", - "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/types": "^7.19.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -659,9 +319,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz", - "integrity": "sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", @@ -670,8 +330,8 @@ "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.10", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" @@ -720,23 +380,23 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz", - "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", "dev": true, "dependencies": { "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" @@ -828,9 +488,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.20.15", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.15.tgz", - "integrity": "sha512-DI4a1oZuf8wC+oAJA9RW6ga3Zbe8RZFt7kD9i4qAspz3I/yHet1VvC3DiSy/fsUvv5pvJuNPh0LPOdCcqinDPg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -840,9 +500,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -877,19 +537,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.13.tgz", - "integrity": "sha512-kMJXfF0T6DIS9E8cgdLCSAL+cuCK+YEZHWiLK0SXpTo8YRj5lpJu3CDNKiIBCne4m9hhTIqUg6SYTAI39tAiVQ==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", + "@babel/generator": "^7.21.3", "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", + "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.20.13", - "@babel/types": "^7.20.7", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -919,9 +579,9 @@ } }, "node_modules/@babel/types": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.7.tgz", - "integrity": "sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==", + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -2190,6 +1850,7 @@ "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.16", "uuid": "^7.0.3" @@ -2213,6 +1874,7 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, + "peer": true, "bin": { "uuid": "dist/bin/uuid" } @@ -2312,11 +1974,24 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", - "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", - "dependencies": { + "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", + "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "dependencies": { "@nomicfoundation/ethereumjs-util": "^8.0.0", "crc-32": "^1.2.0" } @@ -2447,15 +2122,15 @@ } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.4.tgz", - "integrity": "sha512-n/5UMwGaUK2zM8ALuMChVwB1lEPeDTb5oBjQ1g7hVsUdS8x+XG9JIEp4Ze6Bwy98tghA7Y1+PCH4SNE2P3UQ2g==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", + "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@types/chai-as-promised": "^7.1.3", "chai-as-promised": "^7.1.1", - "chalk": "^2.4.2", "deep-eql": "^4.0.1", "ordinal": "^1.0.3" }, @@ -2466,82 +2141,12 @@ "hardhat": "^2.9.4" } }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.6.tgz", - "integrity": "sha512-a35iVD4ycF6AoTfllAnKm96IPIzzHpgKX/ep4oKc2bsUKFfMlacWdyntgC/7d5blyCTXfFssgNAvXDZfzNWVGQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", "dev": true, + "peer": true, "dependencies": { "ethereumjs-util": "^7.1.4" }, @@ -2550,9 +2155,9 @@ } }, "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.0.tgz", - "integrity": "sha512-BoOPbzLQ1GArnBZd4Jz4IU8FY3RY4nUwpXlfymXwxlXNimngkPRJj7ivVNurD7igohEjf90v/Axn2M5WwAdCJQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", + "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", "dev": true, "peerDependencies": { "@ethersproject/abi": "^5.4.7", @@ -2564,7 +2169,7 @@ "@typechain/ethers-v5": "^10.1.0", "@typechain/hardhat": "^6.1.2", "@types/chai": "^4.2.0", - "@types/mocha": "^9.1.0", + "@types/mocha": ">=9.1.0", "@types/node": ">=12.0.0", "chai": "^4.2.0", "ethers": "^5.4.7", @@ -2601,29 +2206,29 @@ "link": true }, "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.0.tgz", - "integrity": "sha512-xGWAiVCGOycvGiP/qrlf9f9eOn7fpNbyJygcB0P21a1MDuVPlKt0Srp7rvtBEutYQ48ouYnRXm33zlRnlTOPHg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", "engines": { "node": ">= 12" }, "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.0", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.0", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.0", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.0" + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.0.tgz", - "integrity": "sha512-vEF3yKuuzfMHsZecHQcnkUrqm8mnTWfJeEVFHpg+cO+le96xQA4lAJYdUan8pXZohQxv1fSReQsn4QGNuBNuCw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", "cpu": [ "arm64" ], @@ -2636,9 +2241,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.0.tgz", - "integrity": "sha512-dlHeIg0pTL4dB1l9JDwbi/JG6dHQaU1xpDK+ugYO8eJ1kxx9Dh2isEUtA4d02cQAl22cjOHTvifAk96A+ItEHA==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", "cpu": [ "x64" ], @@ -2651,9 +2256,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.0.tgz", - "integrity": "sha512-WFCZYMv86WowDA4GiJKnebMQRt3kCcFqHeIomW6NMyqiKqhK1kIZCxSLDYsxqlx396kKLPN1713Q1S8tu68GKg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", "cpu": [ "x64" ], @@ -2666,9 +2271,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.0.tgz", - "integrity": "sha512-DTw6MNQWWlCgc71Pq7CEhEqkb7fZnS7oly13pujs4cMH1sR0JzNk90Mp1zpSCsCs4oKan2ClhMlLKtNat/XRKQ==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", "cpu": [ "arm64" ], @@ -2681,9 +2286,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.0.tgz", - "integrity": "sha512-wUpUnR/3GV5Da88MhrxXh/lhb9kxh9V3Jya2NpBEhKDIRCDmtXMSqPMXHZmOR9DfCwCvG6vLFPr/+YrPCnUN0w==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", "cpu": [ "arm64" ], @@ -2696,9 +2301,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.0.tgz", - "integrity": "sha512-lR0AxK1x/MeKQ/3Pt923kPvwigmGX3OxeU5qNtQ9pj9iucgk4PzhbS3ruUeSpYhUxG50jN4RkIGwUMoev5lguw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", "cpu": [ "x64" ], @@ -2711,9 +2316,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.0.tgz", - "integrity": "sha512-A1he/8gy/JeBD3FKvmI6WUJrGrI5uWJNr5Xb9WdV+DK0F8msuOqpEByLlnTdLkXMwW7nSl3awvLezOs9xBHJEg==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", "cpu": [ "x64" ], @@ -2726,9 +2331,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.0.tgz", - "integrity": "sha512-7x5SXZ9R9H4SluJZZP8XPN+ju7Mx+XeUMWZw7ZAqkdhP5mK19I4vz3x0zIWygmfE8RT7uQ5xMap0/9NPsO+ykw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", "cpu": [ "arm64" ], @@ -2741,9 +2346,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.0.tgz", - "integrity": "sha512-m7w3xf+hnE774YRXu+2mGV7RiF3QJtUoiYU61FascCkQhX3QMQavh7saH/vzb2jN5D24nT/jwvaHYX/MAM9zUw==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", "cpu": [ "ia32" ], @@ -2756,9 +2361,9 @@ } }, "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.0.tgz", - "integrity": "sha512-xCuybjY0sLJQnJhupiFAXaek2EqF0AP0eBjgzaalPXSNvCEN6ZYHvUzdA50ENDVeSYFXcUsYf3+FsD3XKaeptA==", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", "cpu": [ "x64" ], @@ -2770,6 +2375,12 @@ "node": ">= 10" } }, + "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", + "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", + "dev": true + }, "node_modules/@nomiclabs/hardhat-ethers": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", @@ -2781,21 +2392,22 @@ } }, "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.2.tgz", - "integrity": "sha512-IEikeOVq0C/7CY6aD74d8L4BpGoc/FNiN6ldiPVg0QIFIUSu4FSGA1dmtJZJKk1tjpwgrfTLQNWnigtEaN9REg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", + "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", "@ethersproject/address": "^5.0.2", - "cbor": "^5.0.2", + "cbor": "^8.1.0", "chalk": "^2.4.2", "debug": "^4.1.1", "fs-extra": "^7.0.1", "lodash": "^4.17.11", "semver": "^6.3.0", "table": "^6.8.0", - "undici": "^5.4.0" + "undici": "^5.14.0" }, "peerDependencies": { "hardhat": "^2.0.4" @@ -2806,6 +2418,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -2818,6 +2431,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -2832,6 +2446,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -2840,13 +2455,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -2856,6 +2473,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -2870,6 +2488,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -2879,6 +2498,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -2888,6 +2508,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver.js" } @@ -2897,6 +2518,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -2909,6 +2531,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -3056,9 +2679,9 @@ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/@openzeppelin/contracts": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.1.tgz", - "integrity": "sha512-xQ6eUZl+RDyb/FiZe1h+U7qr/f4p/SrTSQcTPH2bjur3C5DbuW/zFgCU/b1P/xcIaEqJep+9ju4xDRi3rmChdQ==" + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", + "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==" }, "node_modules/@pkgr/utils": { "version": "2.3.1", @@ -3080,12 +2703,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -3143,6 +2760,11 @@ "node": ">=6" } }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sentry/hub": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", @@ -3156,6 +2778,11 @@ "node": ">=6" } }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sentry/minimal": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", @@ -3169,6 +2796,11 @@ "node": ">=6" } }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sentry/node": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", @@ -3188,6 +2820,11 @@ "node": ">=6" } }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sentry/tracing": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", @@ -3203,6 +2840,11 @@ "node": ">=6" } }, + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sentry/types": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", @@ -3223,6 +2865,11 @@ "node": ">=6" } }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -3274,6 +2921,7 @@ "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, + "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } @@ -3290,9 +2938,9 @@ } }, "node_modules/@truffle/abi-utils": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.7.tgz", - "integrity": "sha512-IhX+Hxu9fTEOxR+34r3Tt/AJS1gkqdEBZDzERG/9X43bLGzu5pLWzDgDBpNDqYM3lTICIg3UHfqLdUzSC7g4pg==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.9.tgz", + "integrity": "sha512-G5dqgwRHx5zwlXjz3QT8OJVfB2cOqWwD6DwKso0KttUt/zejhCjnkKq72rSgyeLMkz7wBB9ERLOsupLBILM8MA==", "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", @@ -3305,12 +2953,12 @@ "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==" }, "node_modules/@truffle/codec": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.14.tgz", - "integrity": "sha512-EP+iTGowElaJJgQI4Ztizmb+hYOHwOv4OiX09sjqX/v/GdmnvyWoS8RGHtERze8DoBi5cs4ZY8vlM3nVDbRv5A==", + "version": "0.14.16", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.16.tgz", + "integrity": "sha512-a9UY3n/FnkKN3Q4zOuMFOOcLWb80mdknj+voim4vvXYtJm1aAZQZE5sG9aLnMBTl4TiGLzUtfNDVYY7WgWgDag==", "dependencies": { - "@truffle/abi-utils": "^0.3.7", - "@truffle/compile-common": "^0.9.2", + "@truffle/abi-utils": "^0.3.9", + "@truffle/compile-common": "^0.9.4", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -3321,15 +2969,24 @@ "web3-utils": "1.8.2" } }, - "node_modules/@truffle/codec/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dependencies": { - "yallist": "^4.0.0" + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" }, "engines": { - "node": ">=10" + "node": ">=6.0.0" + } + }, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" } }, "node_modules/@truffle/codec/node_modules/semver": { @@ -3346,15 +3003,10 @@ "node": ">=10" } }, - "node_modules/@truffle/codec/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@truffle/compile-common": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.2.tgz", - "integrity": "sha512-n7MF/4/dntccj44RGe3PRMD8Vk46PU8dJtzd1VLAfgokK2Y2N+SjAzDskBnmAydZVWAM315nZIUQsgnY8xoATw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", + "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", "dependencies": { "@truffle/error": "^0.2.0", "colors": "1.4.0" @@ -3366,20 +3018,20 @@ "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" }, "node_modules/@truffle/contract-schema": { - "version": "3.4.11", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.11.tgz", - "integrity": "sha512-wReyVZUPyU9Zy5PSCugBLG1nnruBmRAJ/gmoirQiJ9N2n+s1iGBTY49tkDqFMz3XUUE0kplfdb9YKZJlLkTWzQ==", + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", + "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", "dependencies": { "ajv": "^6.10.0", "debug": "^4.3.1" } }, "node_modules/@truffle/debug-utils": { - "version": "6.0.45", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.45.tgz", - "integrity": "sha512-yrEM8znplrVzxczzsvRlFrA56S3KSLD0XZpAQ8nDRd82Omn4Y7AaJtkAoOILjkPHeuBS1bvHm7FjKhszgOe3mg==", + "version": "6.0.47", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.47.tgz", + "integrity": "sha512-bUjdzLPdEKtoUCDzaXkrOoi+PbyAJlMBzGequBK8tirT7xL9bCP2Pd/WxvnmRd7AnfroxGNvXwVXWTItW5SMWQ==", "dependencies": { - "@truffle/codec": "^0.14.14", + "@truffle/codec": "^0.14.16", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -3457,9 +3109,9 @@ "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" }, "node_modules/@truffle/interface-adapter": { - "version": "0.5.28", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.28.tgz", - "integrity": "sha512-xnjWXiOihApI+XLrs0xpw9s+av6Qvrc2lkXAfrBluuKgaJOQIdLVz6vi2Bt6oiTQAoWUkUGa0hne78mxFI2J1w==", + "version": "0.5.30", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.30.tgz", + "integrity": "sha512-wyCcESeZJBkAfuSGU8GHCusIWDUDyQjJZMcyShv59ZTSAwQR7xx0+a0Q1LlS532G/pGFLYe2VzKSY1pRHRwgug==", "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", @@ -3640,10 +3292,11 @@ "devOptional": true }, "node_modules/@typechain/ethers-v5": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.1.1.tgz", - "integrity": "sha512-o6nffJBxwmeX1ZiZpdnP/tqGd/7M7iYvQC88ZXaFFoyAGh7eYncynzVjOJV0XmaKzAc6puqyqZrnva+gJbk4sw==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", + "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.15", "ts-essentials": "^7.0.1" @@ -3658,17 +3311,18 @@ } }, "node_modules/@typechain/hardhat": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.4.tgz", - "integrity": "sha512-S8k5d1Rjc+plwKpkorlifmh72M7Ki0XNUOVVLtdbcA/vLaEkuqZSJFdddpBgS5QxiJP+6CbRa/yO6EVTE2+fMQ==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", + "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", "dev": true, + "peer": true, "dependencies": { "fs-extra": "^9.1.0" }, "peerDependencies": { "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.1.1", + "@typechain/ethers-v5": "^10.2.0", "ethers": "^5.4.7", "hardhat": "^2.9.9", "typechain": "^8.1.1" @@ -3679,6 +3333,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "peer": true, "dependencies": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", @@ -3742,6 +3397,7 @@ "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4022,6 +3678,7 @@ "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, + "peer": true, "dependencies": { "@types/node": "*" } @@ -4046,6 +3703,7 @@ "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "peer": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" @@ -4101,13 +3759,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true, + "peer": true }, "node_modules/@types/ms": { "version": "0.7.31", @@ -4126,9 +3786,9 @@ } }, "node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" }, "node_modules/@types/object-hash": { "version": "2.2.1", @@ -4148,12 +3808,13 @@ "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-TwNx7qsjvRIUv/BCx583tqF5IINEVjCNqg9ofKHRlSoUHE62WBHrem4B1HGXcIrG511v29d1kJ9a/t2Esz7MIg==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.3.tgz", + "integrity": "sha512-qpzXlxoPv67TCtTCS+SwYmz1M+G5ARTrE5YVlrZPy/xBD36dzLqiJLDzOzsMXkcJYq6+6UkWqFwtLAOjsfec5Q==", "dev": true, "dependencies": { "@types/node": "*", @@ -4170,7 +3831,8 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/@types/react": { "version": "17.0.53", @@ -4205,12 +3867,6 @@ "@types/node": "*" } }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, "node_modules/@types/sinon": { "version": "10.0.13", "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", @@ -4285,191 +3941,16 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", - "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", - "debug": "^4.3.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, "dependencies": { + "@types/json-schema": "^7.0.7", + "@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/typescript-estree": "4.31.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" }, "engines": { "node": "^10.12.0 || >=12.0.0" @@ -4478,84 +3959,83 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "eslint": "*" } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "node_modules/@typescript-eslint/parser": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", - "semver": "^7.3.7" + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", + "debug": "^4.3.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "node_modules/@typescript-eslint/types": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", + "debug": "^4.3.1", + "globby": "^11.0.3", + "is-glob": "^4.0.1", + "semver": "^7.3.5", "tsutils": "^3.21.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" }, "funding": { "type": "opencollective", @@ -4567,32 +4047,6 @@ } } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.52.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", @@ -4625,9 +4079,9 @@ } }, "node_modules/@uniswap/sdk-core": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.1.1.tgz", - "integrity": "sha512-afXn3R2ICf1mAZU+Ug8MmPbuXG7PYjoUYr0+sKLApyOPuhlxpwV4tR4ba8w4jSXoFhqOWxZ9qh44isWoScK96w==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.2.2.tgz", + "integrity": "sha512-dPA34T8EVfFzKtw1NC1Mr7M0aXpY1UN+lUpdBv757JxKKMlGQTg96XTIfjYCflqEshxlBdz2+IVQgk6H+dMu5g==", "dependencies": { "@ethersproject/address": "^5.0.2", "big.js": "^5.2.2", @@ -4817,7 +4271,8 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/abort-controller": { "version": "3.0.0", @@ -4922,6 +4377,7 @@ "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "peer": true, "engines": { "node": ">= 10.0.0" } @@ -4983,6 +4439,7 @@ "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, "optional": true, + "peer": true, "engines": { "node": ">=0.4.2" } @@ -5046,7 +4503,8 @@ "version": "0.5.0-alpha.4", "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/anymatch": { "version": "3.1.3", @@ -5098,10 +4556,24 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "peer": true, "engines": { "node": ">=6" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -5140,6 +4612,7 @@ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -5162,29 +4635,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.reduce": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, + "peer": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5203,7 +4659,8 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/asn1": { "version": "0.2.6", @@ -5268,6 +4725,7 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -5433,12 +4891,12 @@ "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -5446,7 +4904,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -5479,6 +4937,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -5754,9 +5226,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001453", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001453.tgz", - "integrity": "sha512-R9o/uySW38VViaTrOtwfbFEiBFUh7ST3uIG4OEymIG3/uKdHDO4xk/FaqfUw0d+irSUyFPy3dZszf9VvSTPnsA==", + "version": "1.0.30001466", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", + "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", "dev": true, "funding": [ { @@ -5783,15 +5255,16 @@ } }, "node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "peer": true, "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" + "nofilter": "^3.1.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.19" } }, "node_modules/chai": { @@ -5868,6 +5341,7 @@ "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -6055,6 +5529,7 @@ "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, + "peer": true, "dependencies": { "object-assign": "^4.1.0", "string-width": "^2.1.1" @@ -6066,6 +5541,53 @@ "colors": "^1.1.2" } }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -6081,14 +5603,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cli-truncate/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=8" @@ -6104,19 +5626,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -6208,6 +5717,7 @@ "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "peer": true, "dependencies": { "array-back": "^3.1.0", "find-replace": "^3.0.0", @@ -6223,6 +5733,7 @@ "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "peer": true, "dependencies": { "array-back": "^4.0.2", "chalk": "^2.4.2", @@ -6238,6 +5749,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -6250,6 +5762,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -6259,6 +5772,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6273,6 +5787,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -6281,13 +5796,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/command-line-usage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -6297,6 +5814,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -6306,6 +5824,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -6318,6 +5837,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -6350,6 +5870,7 @@ "engines": [ "node >= 0.8" ], + "peer": true, "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -6361,13 +5882,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "peer": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -6382,13 +5905,15 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "peer": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -6553,6 +6078,7 @@ "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -7066,9 +6592,9 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.8.tgz", - "integrity": "sha512-eykdoYQ4FwCJinEYS0gPL2f2w+BPbSLvnQSJ3Ye1vAoPjdkq6xIMKBv+UkICd3qZE26wBKIn3p+6n0QC7R1LyA==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "dev": true, "dependencies": { "d3": "^7.8.2", @@ -7086,11 +6612,18 @@ "node": ">=0.10" } }, + "node_modules/dayjs": { + "version": "1.11.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", + "dev": true + }, "node_modules/death": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/debug": { "version": "4.3.4", @@ -7170,6 +6703,7 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "peer": true, "engines": { "node": ">=4.0.0" } @@ -7195,6 +6729,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-require-extensions/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -7275,6 +6818,7 @@ "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "peer": true, "dependencies": { "address": "^1.0.1", "debug": "4" @@ -7297,6 +6841,7 @@ "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, + "peer": true, "dependencies": { "heap": ">= 0.2.0" }, @@ -7432,9 +6977,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.299", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.299.tgz", - "integrity": "sha512-lQ7ijJghH6pCGbfWXr6EY+KYCMaRSjgsY925r1p/TlpSfVM1VjHTcn1gAc15VM4uwti283X6QtjPTXdpoSGiZQ==", + "version": "1.4.330", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", + "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==", "dev": true }, "node_modules/elkjs": { @@ -7535,18 +7080,18 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -7554,8 +7099,8 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", @@ -7563,11 +7108,12 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.10", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.4.3", "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", "typed-array-length": "^1.0.4", @@ -7585,7 +7131,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/es-set-tostringtag": { "version": "2.0.1", @@ -8057,6 +7604,7 @@ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "peer": true, "dependencies": { "esprima": "^2.7.1", "estraverse": "^1.9.1", @@ -8079,6 +7627,7 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8092,6 +7641,7 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8101,6 +7651,7 @@ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" @@ -8114,6 +7665,7 @@ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "peer": true, "dependencies": { "deep-is": "~0.1.3", "fast-levenshtein": "~2.0.6", @@ -8131,6 +7683,7 @@ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -8141,6 +7694,7 @@ "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, + "peer": true, "dependencies": { "amdefine": ">=0.0.4" }, @@ -8153,6 +7707,7 @@ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "peer": true, "dependencies": { "prelude-ls": "~1.1.2" }, @@ -8412,6 +7967,15 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", + "dev": true, + "engines": { + "node": ">=5.0.0" + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", @@ -8534,9 +8098,9 @@ } }, "node_modules/esquery": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.1.tgz", - "integrity": "sha512-3ZggxvMv5EEY1ssUVyHSVt0oPreyBfbUi1XikJVfjFiBeBDLdrb0IWoDiEwqT/2sUQi0TGaWtFhOGDD8RTpXgQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, "dependencies": { "estraverse": "^5.1.0" @@ -8620,6 +8184,7 @@ "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.0-beta.146", "@solidity-parser/parser": "^0.14.0", @@ -8651,6 +8216,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -8660,6 +8226,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -8669,6 +8236,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -8680,13 +8248,15 @@ "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -8696,6 +8266,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -8710,6 +8281,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -8722,6 +8294,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, + "peer": true, "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -8743,6 +8316,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, + "peer": true, "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -8754,6 +8328,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -8762,7 +8337,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", @@ -8770,6 +8346,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -8779,6 +8356,7 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "peer": true, "engines": { "node": ">=0.3.1" } @@ -8787,13 +8365,15 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -8803,6 +8383,7 @@ "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dev": true, + "peer": true, "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -8815,6 +8396,7 @@ "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dev": true, + "peer": true, "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -8832,6 +8414,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -8844,6 +8427,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, + "peer": true, "dependencies": { "is-buffer": "~2.0.3" }, @@ -8862,6 +8446,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -8871,6 +8456,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8888,6 +8474,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -8897,6 +8484,7 @@ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, + "peer": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -8907,6 +8495,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -8915,13 +8504,15 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -8935,6 +8526,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -8948,6 +8540,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "peer": true, "dependencies": { "chalk": "^2.4.2" }, @@ -8960,6 +8553,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8972,6 +8566,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -8984,6 +8579,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, + "peer": true, "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", @@ -9026,13 +8622,15 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, + "peer": true, "dependencies": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -9048,6 +8646,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -9063,6 +8662,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -9075,6 +8675,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -9084,6 +8685,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "peer": true, "dependencies": { "picomatch": "^2.0.4" }, @@ -9095,19 +8697,22 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/setimmediate": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -9122,6 +8727,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -9134,6 +8740,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -9143,6 +8750,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -9155,13 +8763,15 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -9174,6 +8784,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -9187,13 +8798,15 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/eth-gas-reporter/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "peer": true, "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -9212,6 +8825,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, + "peer": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -9222,6 +8836,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "peer": true, "dependencies": { "flat": "^4.1.0", "lodash": "^4.17.15", @@ -9526,6 +9141,29 @@ "node": ">= 0.10.0" } }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -9542,6 +9180,17 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9552,6 +9201,34 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -9715,6 +9392,7 @@ "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "peer": true, "dependencies": { "array-back": "^3.0.1" }, @@ -9892,7 +9570,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -10001,6 +9680,7 @@ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -10054,6 +9734,7 @@ "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "peer": true, "dependencies": { "chalk": "^2.4.2", "node-emoji": "^1.10.0" @@ -10067,6 +9748,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -10079,6 +9761,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -10093,6 +9776,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -10101,13 +9785,15 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -10117,6 +9803,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -10126,6 +9813,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -10134,14 +9822,14 @@ } }, "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -10177,6 +9865,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "peer": true, "dependencies": { "global-prefix": "^3.0.0" }, @@ -10189,6 +9878,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "peer": true, "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -10203,6 +9893,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10323,12 +10014,6 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -10343,6 +10028,7 @@ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.0", @@ -10381,9 +10067,9 @@ } }, "node_modules/hardhat": { - "version": "2.12.7", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.12.7.tgz", - "integrity": "sha512-voWoN6zn5d8BOEaczSyK/1PyfdeOeI3SbGCFb36yCHTJUt6OIqLb+ZDX30VhA1UsYKzLqG7UnWl3fKJUuANc6A==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -10437,10 +10123,10 @@ "ws": "^7.4.6" }, "bin": { - "hardhat": "internal/cli/cli.js" + "hardhat": "internal/cli/bootstrap.js" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "ts-node": "*", @@ -10460,6 +10146,7 @@ "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, + "peer": true, "dependencies": { "array-uniq": "1.0.3", "eth-gas-reporter": "^0.2.25", @@ -10575,6 +10262,25 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/hardhat/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/hardhat/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -10608,17 +10314,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -10673,6 +10368,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hardhat/node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10739,14 +10445,6 @@ "node": ">=8" } }, - "node_modules/hardhat/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/hardhat/node_modules/resolve": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", @@ -11079,6 +10777,7 @@ "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, + "peer": true, "dependencies": { "caseless": "^0.12.0", "concat-stream": "^1.6.2", @@ -11119,6 +10818,7 @@ "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, + "peer": true, "dependencies": { "@types/node": "^10.0.3" } @@ -11127,7 +10827,8 @@ "version": "10.17.60", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/http-signature": { "version": "1.2.0", @@ -11190,6 +10891,14 @@ "node": ">=4.0.0" } }, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "engines": { + "node": ">=6" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -11219,9 +10928,9 @@ } }, "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -11274,7 +10983,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "peer": true }, "node_modules/ink": { "version": "3.2.0", @@ -11333,14 +11043,14 @@ "react": ">=16.8.2" } }, - "node_modules/ink/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/ink/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { "node": ">=8" @@ -11405,6 +11115,7 @@ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "peer": true, "engines": { "node": ">= 0.10" } @@ -11449,13 +11160,13 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { @@ -12065,15 +11776,15 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, "bin": { "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" } }, "node_modules/jsonfile": { @@ -12092,6 +11803,7 @@ "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, + "peer": true, "engines": { "node": "*" } @@ -12149,6 +11861,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -12265,19 +11978,10 @@ "dev": true, "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, "engines": { "node": ">=4" } @@ -12314,7 +12018,8 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", @@ -12403,11 +12108,14 @@ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/make-dir": { @@ -12444,7 +12152,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/mcl-wasm": { "version": "0.7.9", @@ -12508,26 +12217,27 @@ } }, "node_modules/mermaid": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.0.tgz", - "integrity": "sha512-4PWbOND7CNRbjHrdG3WUUGBreKAFVnMhdlPjttuUkeHbCQmAHkwzSh5dGwbrKmXGRaR4uTvfFVYzUcg++h0DkA==", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", + "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", "dev": true, "dependencies": { "@braintree/sanitize-url": "^6.0.0", "cytoscape": "^3.23.0", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.1.0", - "d3": "^7.0.0", - "dagre-d3-es": "7.0.8", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.9", + "dayjs": "^1.11.7", "dompurify": "2.4.3", "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", - "moment": "^2.29.4", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.2", "ts-dedent": "^2.2.0", - "uuid": "^9.0.0" + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, "node_modules/mermaid/node_modules/uuid": { @@ -12652,6 +12362,11 @@ "yallist": "^3.0.0" } }, + "node_modules/minipass/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -12788,6 +12503,38 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -12900,15 +12647,6 @@ "node": ">=10" } }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -12986,12 +12724,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/ndjson": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", @@ -13022,7 +12754,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/next-tick": { "version": "1.1.0", @@ -13078,6 +12811,7 @@ "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.21" } @@ -13087,6 +12821,7 @@ "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, + "peer": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" @@ -13097,6 +12832,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "peer": true, "bin": { "semver": "bin/semver" } @@ -13149,11 +12885,13 @@ "dev": true }, "node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "peer": true, "engines": { - "node": ">=8" + "node": ">=12.19" } }, "node_modules/non-layered-tidy-tree-layout": { @@ -13167,6 +12905,7 @@ "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "peer": true, "dependencies": { "abbrev": "1" }, @@ -13401,20 +13140,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -13520,6 +13245,7 @@ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", "dev": true, + "peer": true, "dependencies": { "array.prototype.reduce": "^1.0.5", "call-bind": "^1.0.2", @@ -13597,9 +13323,9 @@ } }, "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -13634,7 +13360,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/os-locale": { "version": "1.4.0", @@ -13751,7 +13478,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/parse-headers": { "version": "2.0.5", @@ -14087,7 +13815,8 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "dev": true, + "peer": true }, "node_modules/process-on-spawn": { "version": "1.0.0", @@ -14115,6 +13844,7 @@ "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "peer": true, "dependencies": { "asap": "~2.0.6" } @@ -14158,9 +13888,9 @@ } }, "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } @@ -14187,9 +13917,9 @@ "dev": true }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", + "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dependencies": { "side-channel": "^1.0.4" }, @@ -14266,9 +13996,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14368,9 +14098,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14396,6 +14126,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, + "peer": true, "dependencies": { "resolve": "^1.1.6" }, @@ -14408,6 +14139,7 @@ "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "peer": true, "dependencies": { "minimatch": "^3.0.5" }, @@ -14420,6 +14152,7 @@ "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -14475,6 +14208,7 @@ "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, + "peer": true, "dependencies": { "req-from": "^2.0.0" }, @@ -14487,6 +14221,7 @@ "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, + "peer": true, "dependencies": { "resolve-from": "^3.0.0" }, @@ -14499,6 +14234,7 @@ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -14539,6 +14275,7 @@ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, + "peer": true, "dependencies": { "lodash": "^4.17.19" }, @@ -14555,6 +14292,7 @@ "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, + "peer": true, "dependencies": { "request-promise-core": "1.1.4", "stealthy-require": "^1.1.1", @@ -14593,9 +14331,9 @@ } }, "node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } @@ -14825,6 +14563,7 @@ "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "peer": true, "dependencies": { "abbrev": "1.0.x", "async": "1.x", @@ -14849,13 +14588,15 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sc-istanbul/node_modules/esprima": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -14869,6 +14610,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "peer": true, "dependencies": { "inflight": "^1.0.4", "inherits": "2", @@ -14885,6 +14627,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14893,13 +14636,15 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^1.0.0" }, @@ -14912,6 +14657,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -14962,24 +14708,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -15113,6 +14841,7 @@ "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "peer": true, "dependencies": { "charenc": ">= 0.0.1", "crypt": ">= 0.0.1" @@ -15186,6 +14915,7 @@ "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "peer": true, "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", @@ -15289,16 +15019,20 @@ } }, "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/snake-case": { @@ -15481,6 +15215,14 @@ "node": ">=0.10.0" } }, + "node_modules/solc/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/solc/node_modules/require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", @@ -15597,6 +15339,7 @@ "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, + "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", "@solidity-parser/parser": "^0.14.1", @@ -15631,6 +15374,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -15640,6 +15384,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -15649,6 +15394,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, + "peer": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -15661,6 +15407,7 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -15670,6 +15417,7 @@ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -15684,6 +15432,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, + "peer": true, "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -15705,6 +15454,7 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, + "peer": true, "dependencies": { "string-width": "^3.1.0", "strip-ansi": "^5.2.0", @@ -15716,6 +15466,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, + "peer": true, "dependencies": { "color-name": "1.1.3" } @@ -15724,7 +15475,8 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/solidity-coverage/node_modules/debug": { "version": "3.2.6", @@ -15732,6 +15484,7 @@ "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, + "peer": true, "dependencies": { "ms": "^2.1.1" } @@ -15741,6 +15494,7 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "peer": true, "engines": { "node": ">=0.3.1" } @@ -15749,13 +15503,15 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/solidity-coverage/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, + "peer": true, "engines": { "node": ">=0.8.0" } @@ -15765,6 +15521,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "peer": true, "dependencies": { "locate-path": "^3.0.0" }, @@ -15777,6 +15534,7 @@ "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, + "peer": true, "dependencies": { "is-buffer": "~2.0.3" }, @@ -15789,6 +15547,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -15809,6 +15568,7 @@ "os": [ "darwin" ], + "peer": true, "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } @@ -15818,6 +15578,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -15835,6 +15596,7 @@ "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, + "peer": true, "dependencies": { "@types/glob": "^7.1.1", "array-union": "^2.1.0", @@ -15854,6 +15616,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -15863,6 +15626,7 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "peer": true, "engines": { "node": ">= 4" } @@ -15872,6 +15636,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "peer": true, "engines": { "node": ">=4" } @@ -15881,6 +15646,7 @@ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "peer": true, "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -15894,6 +15660,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -15903,6 +15670,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "peer": true, "dependencies": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -15916,6 +15684,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "peer": true, "dependencies": { "chalk": "^2.4.2" }, @@ -15928,6 +15697,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "peer": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15940,6 +15710,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "peer": true, "dependencies": { "minimist": "^1.2.5" }, @@ -15952,6 +15723,7 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", "dev": true, + "peer": true, "dependencies": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", @@ -15995,6 +15767,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -16006,13 +15779,15 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "dev": true, + "peer": true }, "node_modules/solidity-coverage/node_modules/object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, + "peer": true, "dependencies": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", @@ -16028,6 +15803,7 @@ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "peer": true, "dependencies": { "p-try": "^2.0.0" }, @@ -16043,6 +15819,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "peer": true, "dependencies": { "p-limit": "^2.0.0" }, @@ -16055,6 +15832,7 @@ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -16064,6 +15842,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "peer": true, "engines": { "node": ">=6" } @@ -16073,6 +15852,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "peer": true, "dependencies": { "picomatch": "^2.0.4" }, @@ -16085,6 +15865,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "peer": true, "dependencies": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -16099,6 +15880,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "peer": true, "dependencies": { "ansi-regex": "^4.1.0" }, @@ -16111,6 +15893,7 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16120,6 +15903,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, + "peer": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -16132,6 +15916,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -16141,6 +15926,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -16153,6 +15939,7 @@ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "peer": true, "dependencies": { "ansi-styles": "^3.2.0", "string-width": "^3.0.0", @@ -16166,13 +15953,15 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "dev": true, + "peer": true }, "node_modules/solidity-coverage/node_modules/yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "peer": true, "dependencies": { "cliui": "^5.0.0", "find-up": "^3.0.0", @@ -16191,6 +15980,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, + "peer": true, "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -16201,6 +15991,7 @@ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "peer": true, "dependencies": { "flat": "^4.1.0", "lodash": "^4.17.15", @@ -16245,9 +16036,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -16268,9 +16059,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==" + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" }, "node_modules/split2": { "version": "3.2.2", @@ -16366,6 +16157,7 @@ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true, + "peer": true, "engines": { "node": ">=0.10.0" } @@ -16398,49 +16190,37 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, "dependencies": { - "ansi-regex": "^3.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { @@ -16483,12 +16263,12 @@ } }, "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-hex-prefix": { @@ -16679,6 +16459,7 @@ "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, + "peer": true, "dependencies": { "http-response-object": "^3.0.1", "sync-rpc": "^1.2.1", @@ -16693,6 +16474,7 @@ "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, + "peer": true, "dependencies": { "get-port": "^3.1.0" } @@ -16713,12 +16495,6 @@ "url": "https://opencollective.com/unts" } }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -16740,6 +16516,7 @@ "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "peer": true, "dependencies": { "array-back": "^4.0.1", "deep-extend": "~0.6.0", @@ -16755,6 +16532,7 @@ "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -16764,6 +16542,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -16790,46 +16569,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/table/node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -16856,6 +16595,11 @@ "node": ">=4.5" } }, + "node_modules/tar/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16887,6 +16631,7 @@ "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, + "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", "@types/form-data": "0.0.33", @@ -16908,7 +16653,8 @@ "version": "8.10.66", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true + "dev": true, + "peer": true }, "node_modules/through2": { "version": "4.0.2", @@ -17012,14 +16758,6 @@ "node": ">=0.8" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "engines": { - "node": ">=6" - } - }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -17030,6 +16768,7 @@ "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==", "dev": true, + "peer": true, "dependencies": { "@morgan-stanley/ts-mocking-bird": "^0.6.2", "chalk": "^4.1.0", @@ -17055,14 +16794,15 @@ "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, + "peer": true, "peerDependencies": { "typescript": ">=3.7.0" } }, "node_modules/ts-node": { - "version": "10.8.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.8.1.tgz", - "integrity": "sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -17124,42 +16864,22 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true }, "node_modules/tsort": { "version": "0.0.1", @@ -17181,6 +16901,12 @@ "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" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -17255,6 +16981,7 @@ "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", "dev": true, + "peer": true, "dependencies": { "@types/prettier": "^2.1.1", "debug": "^4.3.1", @@ -17279,6 +17006,7 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "peer": true, "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -17293,6 +17021,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, + "peer": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -17313,6 +17042,7 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -17322,6 +17052,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -17334,6 +17065,7 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "peer": true, "engines": { "node": ">= 4.0.0" } @@ -17356,7 +17088,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "dev": true, + "peer": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", @@ -17384,6 +17117,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -17394,6 +17128,7 @@ "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true, + "peer": true, "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -17427,9 +17162,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.19.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.19.1.tgz", - "integrity": "sha512-YiZ61LPIgY73E7syxCDxxa3LV2yl3sN8spnIuTct60boiiRaE1J8mNWHO8Im2Zi/sFrPusjLlmRPrsyraSqX6A==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", + "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", "dependencies": { "busboy": "^1.6.0" }, @@ -17624,6 +17359,12 @@ "extsprintf": "^1.2.0" } }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true + }, "node_modules/web3": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", @@ -17656,6 +17397,11 @@ "node": ">=8.0.0" } }, + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, "node_modules/web3-core": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", @@ -17738,6 +17484,11 @@ "node": ">=8.0.0" } }, + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, "node_modules/web3-eth": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", @@ -17879,6 +17630,11 @@ "node": ">=8.0.0" } }, + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, "node_modules/web3-net": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", @@ -18067,29 +17823,64 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "peer": true, "dependencies": { "string-width": "^1.0.2 || 2" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, "dependencies": { - "string-width": "^4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" }, "engines": { "node": ">=8" @@ -18119,13 +17910,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true + "dev": true, + "peer": true }, "node_modules/wordwrapjs": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", "typical": "^5.2.0" @@ -18139,6 +17932,7 @@ "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "peer": true, "engines": { "node": ">=8" } @@ -18162,19 +17956,6 @@ "node": ">=8" } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -18278,9 +18059,9 @@ } }, "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { "version": "16.2.0", @@ -18343,19 +18124,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -18402,6 +18170,7 @@ }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", @@ -18421,6 +18190,7 @@ "eslint-import-resolver-typescript": "^3.5.1", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", "mocha": "^9.1.3", @@ -18429,36 +18199,24 @@ "rimraf": "3.0.2", "sinon": "^12.0.1", "tmp": "^0.2.1", - "ts-node": "10.8.1", - "tsconfig-paths": "^4.1.0", + "ts-node": "10.9.1", "typescript": "^4.7.4" }, "engines": { "node": "^14.0.0 || ^16.0.0 || ^18.0.0" } }, - "packages/core/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } + "packages/core/node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, - "packages/core/node_modules/tsconfig-paths": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.1.2.tgz", - "integrity": "sha512-uhxiMgnXQp1IR622dUXI+9Ehnws7i/y6xvpZB9IbUVOPy0muvdvgXeZOn88UcGPiT98Vp3rJPTa8bFoalZ3Qhw==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } + "packages/core/node_modules/@types/node": { + "version": "12.20.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", + "dev": true }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", @@ -18510,7 +18268,7 @@ "purecss": "^2.1.0", "rimraf": "3.0.2", "sinon": "^14.0.0", - "ts-node": "10.8.1", + "ts-node": "10.9.1", "typescript": "^4.7.4" }, "engines": { @@ -18560,6 +18318,18 @@ "type-detect": "^4.0.8" } }, + "packages/hardhat-plugin/node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "packages/hardhat-plugin/node_modules/@types/node": { + "version": "12.20.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", + "dev": true + }, "packages/hardhat-plugin/node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", diff --git a/package.json b/package.json index 83a72ca669..98ecf2178f 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,16 @@ ] }, "scripts": { - "build": "npm run build -w packages/core -w packages/hardhat-plugin", + "build": "npm run build -w packages", "lint": "npm run lint --workspaces", - "postlint": "prettier --check ./docs/*.md ./config/eslint/.eslintrc.js", + "postlint": "prettier --check *.{md,json} ./docs/*.md ./config/**/*.{js,json}", "lint:fix": "npm run lint:fix --workspaces", - "postlint:fix": "prettier --write ./docs/*.md ./config/eslint/.eslintrc.js", - "test": "npm run test -w packages/core -w packages/hardhat-plugin", - "test:coverage": "npm run test:coverage -w packages/core -w packages/hardhat-plugin", - "test:examples": "npm run test:examples --workspaces --if-present", - "test:build": "npm run test:build --workspaces --if-present", + "postlint:fix": "prettier --write *.{md,json} ./docs/*.md ./config/**/*.{js,json}", + "test": "npm run test -w packages", + "test:coverage": "npm run test:coverage -w packages", + "test:examples": "npm run test -w examples --if-present", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "npm run build && npm run lint && npm run test:build && npm run test:coverage && npm run test:examples", + "fullcheck": "npm run build && npm run lint && npm run test:coverage && npm run test:examples", "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 3367c1761f..4285f9e252 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -1,14 +1,8 @@ -const { resolve } = require("path"); - module.exports = { - extends: [resolve(__dirname, "../../config/eslint/.eslintrc.js")], + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", - createDefaultProgram: true, }, - rules: { - "no-console": "error", - }, - ignorePatterns: ["post-build.js"], + ignorePatterns: [".eslintrc.js"], }; diff --git a/packages/core/.mocharc.json b/packages/core/.mocharc.json index 814a4a9f69..2ae51f16b6 100644 --- a/packages/core/.mocharc.json +++ b/packages/core/.mocharc.json @@ -1,4 +1,4 @@ { - "require": ["ts-node/register/transpile-only", "tsconfig-paths/register"], + "require": ["ts-node/register/transpile-only"], "file": "./test/setup.ts" } diff --git a/packages/core/.npmignore b/packages/core/.npmignore index bb8c6cb518..36a390e373 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -2,8 +2,10 @@ coverage/ .nyc_output/ *.tsbuildinfo **/.eslintrc.js -post-build.js .mocharc.json .nycrc .prettierignore .prettierrc +dist/test +test +src diff --git a/packages/core/package.json b/packages/core/package.json index 6a31182d54..3e02920bc1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -18,23 +18,23 @@ "engines": { "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", "scripts": { - "build": "tsc --build && node post-build.js", + "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", - "prettier": "prettier \"**/*.{js,md,json}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' npm run test", "test:build": "tsc --project ./test/", - "ui-samples": "TS_NODE_TRANSPILE_ONLY=1 ts-node ui-samples/index.tsx", "test:coverage": "nyc mocha --recursive \"test/**/*.ts\"", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", @@ -54,6 +54,7 @@ "eslint-import-resolver-typescript": "^3.5.1", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", "fast-glob": "^3.2.12", "mocha": "^9.1.3", @@ -62,8 +63,7 @@ "rimraf": "3.0.2", "sinon": "^12.0.1", "tmp": "^0.2.1", - "ts-node": "10.8.1", - "tsconfig-paths": "^4.1.0", + "ts-node": "10.9.1", "typescript": "^4.7.4" }, "dependencies": { diff --git a/packages/core/post-build.js b/packages/core/post-build.js deleted file mode 100644 index 86449c38fc..0000000000 --- a/packages/core/post-build.js +++ /dev/null @@ -1,104 +0,0 @@ -const fs = require("fs-extra"); -const glob = require("fast-glob"); -const { resolve, dirname, relative, join } = require("path"); - -const srcRoot = resolve(__dirname, "src"); -const dir = fs.readdirSync(srcRoot); - -const pwd = process.cwd(); -const configFile = resolve(pwd, "tsconfig.json"); -const { - compilerOptions: { baseUrl }, -} = require(configFile); - -const configDir = dirname(configFile); - -const basePath = resolve(configDir, baseUrl); -const outPath = resolve(__dirname, "dist"); - -const outFileToSrcFile = (x) => resolve(srcRoot, relative(outPath, x)); - -const toRelative = (from, to) => { - const rel = relative(from, to); - return (rel.startsWith(".") ? rel : `./${rel}`).replace(/\\/g, "/"); -}; - -const exts = [".js", ".jsx", ".ts", ".tsx", ".d.ts", ".json"]; - -const aliases = []; - -for (let i = 0; i < dir.length; i++) { - const item = dir[i]; - if (/\.ts|\.js/.test(item)) continue; - aliases.push({ - prefix: `${item}/`, - path: resolve(basePath, item), - name: item, - }); -} - -const absToRel = (modulePath, outFile) => { - const len = aliases.length; - for (let i = 0; i < len; i++) { - const { prefix, path } = aliases[i]; - - if (modulePath.startsWith(prefix)) { - const modulePathRel = modulePath.substring(prefix.length); - const srcFile = outFileToSrcFile(outFile); - const moduleSrc = resolve(path, modulePathRel); - if ( - fs.existsSync(moduleSrc) || - exts.some((ext) => fs.existsSync(moduleSrc + ext)) - ) { - const rel = toRelative(dirname(srcFile), moduleSrc); - return rel; - } - } - } -}; - -const replaceImportStatement = (orig, matched, outFile) => { - const index = orig.indexOf(matched); - - return ( - orig.substring(0, index) + - absToRel(matched, outFile) + - orig.substring(index + matched.length) - ); -}; - -const aliasNames = aliases.map(({ name }) => name).join("|"); -const requireRegex = new RegExp( - `(?:import|require)\\(['"]((${aliasNames})[^'"]*)['"]\\).*`, - "g" -); -const importRegex = new RegExp( - `(?:import|from) ['"]((${aliasNames})[^'"]*)['"].*`, - "g" -); - -const replaceAlias = (text, outFile) => - text - .replace(requireRegex, (orig, matched) => - replaceImportStatement(orig, matched, outFile) - ) - .replace(importRegex, (orig, matched) => - replaceImportStatement(orig, matched, outFile) - ); - -const files = glob - .sync(join(outPath, "**", "*.{js,jsx,ts,tsx}").replace(/\\/g, "/"), { - dot: true, - onlyFiles: true, - }) - .map((x) => resolve(x)); - -const len = files.length; -for (let i = 0; i < len; i++) { - const file = files[i]; - const text = fs.readFileSync(file, "utf8"); - const newText = replaceAlias(text, file); - if (text !== newText) { - fs.writeFileSync(file, newText, "utf8"); - } -} diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index ac00c1275f..410da22518 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,29 +1,30 @@ -import setupDebug from "debug"; -import { BigNumber } from "ethers"; - -import { Deployment } from "deployment/Deployment"; -import { execute } from "execution/execute"; -import { loadJournalInto } from "execution/loadJournalInto"; -import { hashExecutionGraph } from "execution/utils"; -import { NoopCommandJournal } from "journal/NoopCommandJournal"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; -import { Services } from "services/types"; -import type { DeploymentResult, UpdateUiAction } from "types/deployment"; +import type { DeploymentResult, UpdateUiAction } from "./types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVisitResult, -} from "types/executionGraph"; -import type { ICommandJournal } from "types/journal"; -import type { Module, ModuleDict } from "types/module"; -import type { IgnitionPlan } from "types/plan"; +} from "./types/executionGraph"; +import type { ICommandJournal } from "./types/journal"; +import type { Module, ModuleDict } from "./types/module"; +import type { IgnitionPlan } from "./types/plan"; import type { ContractInfo, SerializedDeploymentResult, -} from "types/serialization"; -import { IgnitionError } from "utils/errors"; -import { resolveProxyValue } from "utils/proxy"; -import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; +} from "./types/serialization"; + +import setupDebug from "debug"; +import { BigNumber } from "ethers"; + +import { Deployment } from "./deployment/Deployment"; +import { execute } from "./execution/execute"; +import { loadJournalInto } from "./execution/loadJournalInto"; +import { hashExecutionGraph } from "./execution/utils"; +import { NoopCommandJournal } from "./journal/NoopCommandJournal"; +import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; +import { Services } from "./services/types"; +import { IgnitionError } from "./utils/errors"; +import { resolveProxyValue } from "./utils/proxy"; +import { validateDeploymentGraph } from "./validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index d7f4fc1c53..3c74417132 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -1,18 +1,22 @@ -import setupDebug from "debug"; - -import { ExecutionGraph } from "execution/ExecutionGraph"; -import type { Services } from "services/types"; +import type { Services } from "../services/types"; import type { DeployState, UpdateUiAction, DeployStateCommand, DeployStateExecutionCommand, DeployNetworkConfig, -} from "types/deployment"; -import type { ExecutionVertexVisitResult } from "types/executionGraph"; -import type { VertexDescriptor, VertexVisitResultFailure } from "types/graph"; -import type { ICommandJournal } from "types/journal"; -import { IgnitionError } from "utils/errors"; +} from "../types/deployment"; +import type { ExecutionVertexVisitResult } from "../types/executionGraph"; +import type { + VertexDescriptor, + VertexVisitResultFailure, +} from "../types/graph"; +import type { ICommandJournal } from "../types/journal"; + +import setupDebug from "debug"; + +import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { IgnitionError } from "../utils/errors"; import { initializeDeployState, @@ -85,10 +89,13 @@ export class Deployment { } public setForceFlag(force: boolean) { - return this._runDeploymentCommand(`Force resolved as '${force}'`, { - type: "SET_FORCE_FLAG", - force, - }); + return this._runDeploymentCommand( + `Force resolved as '${force.toString()}'`, + { + type: "SET_FORCE_FLAG", + force, + } + ); } public startValidation() { @@ -209,7 +216,7 @@ export class Deployment { return descriptor; }) - .filter((x): x is VertexDescriptor => Boolean(x)); + .filter((x): x is VertexDescriptor => x !== null); } public hasUnstarted(): boolean { diff --git a/packages/core/src/deployment/deployExecutionStateReducer.ts b/packages/core/src/deployment/deployExecutionStateReducer.ts index ab588b3a1a..acf6bc2112 100644 --- a/packages/core/src/deployment/deployExecutionStateReducer.ts +++ b/packages/core/src/deployment/deployExecutionStateReducer.ts @@ -6,12 +6,10 @@ import type { VertexExecutionStatusFailed, VertexExecutionStatusCompleted, VertexExecutionStatusHold, -} from "types/deployment"; -import type { ExecutionVertexVisitResult } from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; -import { IgnitionError } from "utils/errors"; +} from "../types/deployment"; +import type { ExecutionVertexVisitResult } from "../types/executionGraph"; -import { assertNeverMessageType } from "./utils"; +import { VertexResultEnum } from "../types/graph"; export function deployExecutionStateReducer( state: ExecutionState, @@ -50,9 +48,6 @@ export function deployExecutionStateReducer( ...state, vertexes: updatedVertexes, }; - default: - assertNeverMessageType(action); - return state; } } @@ -67,7 +62,7 @@ function updateExecutionStateWithNewBatch( ...vertexes, [id]: { status: "RUNNING" as VertexExecutionStatusUnstarted, - result: null, + result: undefined, }, }), state.vertexes @@ -97,15 +92,7 @@ function convertTo( case VertexResultEnum.HOLD: return { status: "HOLD" as VertexExecutionStatusHold, - result: null, + result: undefined, }; - default: - return assertNeverKind(vertexVisitResult); } } - -function assertNeverKind(kind: never): VertexExecutionState { - throw new IgnitionError( - `Unknown visit result kind: ${JSON.stringify(kind, null, 2)}` - ); -} diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/deployment/deployStateReducer.ts index 5529f975b8..6cac8e1618 100644 --- a/packages/core/src/deployment/deployStateReducer.ts +++ b/packages/core/src/deployment/deployStateReducer.ts @@ -1,14 +1,14 @@ -import { ExecutionGraph } from "execution/ExecutionGraph"; import type { DeployPhase, DeployState, ExecutionState, DeployStateCommand, VertexExecutionState, -} from "types/deployment"; +} from "../types/deployment"; + +import { ExecutionGraph } from "../execution/ExecutionGraph"; import { deployExecutionStateReducer } from "./deployExecutionStateReducer"; -import { assertNeverMessageType } from "./utils"; export function initializeDeployState(moduleName: string): DeployState { return { @@ -149,9 +149,6 @@ export function deployStateReducer( phase: resolvePhaseFrom(updatedExecution), execution: updatedExecution, }; - default: - assertNeverMessageType(action); - return state; } } @@ -168,7 +165,7 @@ function initialiseExecutionStateFrom( return { ...acc, [id]: previousExecutionState.vertexes[id] }; } - return { ...acc, [id]: { status: "UNSTARTED", result: null } }; + return { ...acc, [id]: { status: "UNSTARTED", result: undefined } }; }, {}); const executionState: ExecutionState = { diff --git a/packages/core/src/deployment/utils.ts b/packages/core/src/deployment/utils.ts index f1a0ccbcd9..5e2d79c2e5 100644 --- a/packages/core/src/deployment/utils.ts +++ b/packages/core/src/deployment/utils.ts @@ -2,12 +2,11 @@ import type { DeployState, DeployStateCommand, DeployStateExecutionCommand, -} from "types/deployment"; +} from "../types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { IgnitionError } from "utils/errors"; +} from "../types/executionGraph"; export function isDeployStateExecutionCommand( command: DeployStateCommand @@ -19,17 +18,13 @@ export function isDeployStateExecutionCommand( ].includes(command.type); } -export function assertNeverMessageType(action: never) { - throw new IgnitionError(`Unexpected message type ${action}`); -} - export function viewExecutionResults( deployState: DeployState ): ExecutionResultsAccumulator { - const entries: Array<[number, ExecutionVertexVisitResult | null]> = + const entries: Array<[number, ExecutionVertexVisitResult | undefined]> = Object.entries(deployState.execution.vertexes).map( ([vertexId, vertexState]) => [parseInt(vertexId, 10), vertexState.result] ); - return new Map(entries); + return new Map(entries); } diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index b350ea05ea..57744fb547 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -1,21 +1,3 @@ -import { BigNumber, ethers } from "ethers"; -import hash from "object-hash"; - -import { addEdge, ensureVertex } from "graph/adjacencyList"; -import { - CallOptions, - ContractOptions, - InternalParamValue, - IDeploymentGraph, - IDeploymentBuilder, - DeploymentBuilderOptions, - DeploymentGraphVertex, - UseSubgraphOptions, - ScopeData, - AwaitOptions, - SendOptions, - CallPoints, -} from "types/deploymentGraph"; import type { DeploymentGraphFuture, HardhatContract, @@ -40,20 +22,47 @@ import type { SendFuture, ContractFuture, AddressResolvable, -} from "types/future"; -import type { Artifact } from "types/hardhat"; -import type { ModuleCache, ModuleDict, Subgraph } from "types/module"; -import { IgnitionError, IgnitionValidationError } from "utils/errors"; +} from "../types/future"; +import type { Artifact } from "../types/hardhat"; +import type { ModuleCache, ModuleDict, Subgraph } from "../types/module"; + +import { BigNumber, ethers } from "ethers"; +import hash from "object-hash"; + +import { addEdge, ensureVertex } from "../graph/adjacencyList"; +import { + CallOptions, + ContractOptions, + InternalParamValue, + IDeploymentGraph, + IDeploymentBuilder, + DeploymentBuilderOptions, + DeploymentGraphVertex, + UseSubgraphOptions, + ScopeData, + AwaitOptions, + SendOptions, + CallPoints, + HardhatContractDeploymentVertex, + ArtifactContractDeploymentVertex, + DeployedContractDeploymentVertex, + HardhatLibraryDeploymentVertex, + ArtifactLibraryDeploymentVertex, + CallDeploymentVertex, + EventVertex, + SendVertex, + VirtualVertex, +} from "../types/deploymentGraph"; +import { IgnitionError, IgnitionValidationError } from "../utils/errors"; import { assertModuleReturnTypes, - assertUnknownDeploymentVertexType, isArtifact, isCallable, isContract, isDependable, isParameter, -} from "utils/guards"; -import { resolveProxyDependency } from "utils/proxy"; +} from "../utils/guards"; +import { resolveProxyDependency } from "../utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; @@ -77,7 +86,7 @@ function parseEventParams( const abiEvent = abi.find((v) => v.type === "event" && v.name === eventName); - if (!abiEvent) { + if (abiEvent === undefined) { return {}; } @@ -605,104 +614,139 @@ export class DeploymentBuilder implements IDeploymentBuilder { callPoints: CallPoints, f: DeploymentApiPublicFunctions, depNode: DeploymentGraphVertex - ) { + ): void { DeploymentBuilder._captureCallPoint(callPoints, f, depNode.id); graph.vertexes.set(depNode.id, depNode); + ensureVertex(graph.adjacencyList, depNode.id); - if (depNode.type === "HardhatContract") { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.libraries), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - return; + switch (depNode.type) { + case "HardhatContract": + return DeploymentBuilder._addHardhatContractVertex(depNode, graph); + case "ArtifactContract": + return DeploymentBuilder._addArtifactContractVertex(depNode, graph); + case "DeployedContract": + return DeploymentBuilder._addDeployedContractVertex(depNode, graph); + case "HardhatLibrary": + return DeploymentBuilder._addHardhatLibraryVertex(depNode, graph); + case "ArtifactLibrary": + return DeploymentBuilder._addArtifactLibraryVertex(depNode, graph); + case "Call": + return DeploymentBuilder._addCallVertex(depNode, graph); + case "Event": + return DeploymentBuilder._addEventVertex(depNode, graph); + case "SendETH": + return DeploymentBuilder._addSendETHVertex(depNode, graph); + case "Virtual": + return DeploymentBuilder._addVirtualVertex(depNode, graph); } + } - if (depNode.type === "ArtifactContract") { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.libraries), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - return; - } + private static _addVirtualVertex( + depNode: VirtualVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + } - if (depNode.type === "DeployedContract") { - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - return; - } + private static _addSendETHVertex( + depNode: SendVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); - if (depNode.type === "HardhatLibrary") { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - return; - } + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + } - if (depNode.type === "ArtifactLibrary") { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - return; - } + private static _addEventVertex(depNode: EventVertex, graph: DeploymentGraph) { + DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); - if (depNode.type === "Call") { - DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.args), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + } - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.args), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - return; - } + private static _addCallVertex( + depNode: CallDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); - if (depNode.type === "Event") { - DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.args), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + } - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.args), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - return; - } + private static _addArtifactLibraryVertex( + depNode: ArtifactLibraryDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + } - if (depNode.type === "SendETH") { - DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); + private static _addHardhatLibraryVertex( + depNode: HardhatLibraryDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + } - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - return; - } + private static _addDeployedContractVertex( + depNode: DeployedContractDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + } - if (depNode.type === "Virtual") { - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - return; - } + private static _addArtifactContractVertex( + depNode: ArtifactContractDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.libraries), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); + } - assertUnknownDeploymentVertexType(depNode); + private static _addHardhatContractVertex( + depNode: HardhatContractDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.libraries), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); } private static _addEdgesBasedOn( diff --git a/packages/core/src/dsl/DeploymentGraph.ts b/packages/core/src/dsl/DeploymentGraph.ts index c37b7a638f..6c53e17154 100644 --- a/packages/core/src/dsl/DeploymentGraph.ts +++ b/packages/core/src/dsl/DeploymentGraph.ts @@ -1,8 +1,8 @@ -import { Graph } from "graph/Graph"; +import { Graph } from "../graph/Graph"; import { DeploymentGraphVertex as DeploymentGraphVertex, ScopeData, -} from "types/deploymentGraph"; +} from "../types/deploymentGraph"; export class DeploymentGraph extends Graph { public scopeData: { diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index 2187b2ab2e..25883db322 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,6 +1,7 @@ -import type { IDeploymentBuilder } from "types/deploymentGraph"; -import type { Module, ModuleDict } from "types/module"; -import { assertStringParam, assertFunctionParam } from "utils/errors"; +import type { IDeploymentBuilder } from "../types/deploymentGraph"; +import type { Module, ModuleDict } from "../types/module"; + +import { assertStringParam, assertFunctionParam } from "../utils/errors"; export function buildModule( moduleName: string, diff --git a/packages/core/src/dsl/buildSubgraph.ts b/packages/core/src/dsl/buildSubgraph.ts index 5da45e26f1..31c2ca86cd 100644 --- a/packages/core/src/dsl/buildSubgraph.ts +++ b/packages/core/src/dsl/buildSubgraph.ts @@ -1,6 +1,7 @@ -import type { IDeploymentBuilder } from "types/deploymentGraph"; -import type { FutureDict } from "types/future"; -import { Subgraph } from "types/module"; +import type { IDeploymentBuilder } from "../types/deploymentGraph"; +import type { FutureDict } from "../types/future"; + +import { Subgraph } from "../types/module"; export function buildSubgraph( subgraphName: string, diff --git a/packages/core/src/execution/ExecutionGraph.ts b/packages/core/src/execution/ExecutionGraph.ts index ab6719bba3..1b24910c7d 100644 --- a/packages/core/src/execution/ExecutionGraph.ts +++ b/packages/core/src/execution/ExecutionGraph.ts @@ -1,4 +1,4 @@ -import { Graph } from "graph/Graph"; -import { ExecutionVertex } from "types/executionGraph"; +import { Graph } from "../graph/Graph"; +import { ExecutionVertex } from "../types/executionGraph"; export class ExecutionGraph extends Graph {} diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts index b96d3ce6b6..6567a8c247 100644 --- a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/execution/dispatch/executeAwaitedEvent.ts @@ -1,17 +1,18 @@ -import { Contract, ethers } from "ethers"; - -import type { ExecutionContext } from "types/deployment"; +import type { ExecutionContext } from "../../types/deployment"; import type { AwaitedEvent, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; +} from "../../types/executionGraph"; + +import { Contract, ethers } from "ethers"; + +import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeAwaitedEvent( { event, address, abi, args }: AwaitedEvent, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { const resolve = resolveFrom(resultAccumulator); diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/execution/dispatch/executeContractCall.ts index 7f169b8404..e7723b2600 100644 --- a/packages/core/src/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/execution/dispatch/executeContractCall.ts @@ -1,17 +1,18 @@ -import { Contract } from "ethers"; - -import type { ExecutionContext } from "types/deployment"; +import type { ExecutionContext } from "../../types/deployment"; import type { ContractCall, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; +} from "../../types/executionGraph"; + +import { Contract } from "ethers"; + +import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( { method, contract, args, value, signer }: ContractCall, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { const resolve = resolveFrom(resultAccumulator); diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/execution/dispatch/executeContractDeploy.ts index fbe2954a65..4566d5e85a 100644 --- a/packages/core/src/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/execution/dispatch/executeContractDeploy.ts @@ -1,13 +1,14 @@ -import { ContractFactory, ethers } from "ethers"; - -import type { ExecutionContext } from "types/deployment"; +import type { ExecutionContext } from "../../types/deployment"; import type { ContractDeploy, ExecutionResultsAccumulator, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; -import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; +} from "../../types/executionGraph"; + +import { ContractFactory, ethers } from "ethers"; + +import { VertexResultEnum } from "../../types/graph"; +import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index 7737696308..fa4292eb2e 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,10 +1,11 @@ -import type { Services } from "services/types"; +import type { Services } from "../../services/types"; import type { DeployedContract, ExecutionResultsAccumulator, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; +} from "../../types/executionGraph"; + +import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts index d785846134..8e309ad1f8 100644 --- a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/execution/dispatch/executeLibraryDeploy.ts @@ -1,13 +1,14 @@ -import { ContractFactory, ethers } from "ethers"; - -import type { ExecutionContext } from "types/deployment"; +import type { ExecutionContext } from "../../types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVertexVisitResult, LibraryDeploy, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; -import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; +} from "../../types/executionGraph"; + +import { ContractFactory, ethers } from "ethers"; + +import { VertexResultEnum } from "../../types/graph"; +import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/execution/dispatch/executeSendETH.ts index dc6d26ae7e..bbd8e772f2 100644 --- a/packages/core/src/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/execution/dispatch/executeSendETH.ts @@ -1,14 +1,17 @@ +import type { ExecutionContext } from "../../types/deployment"; +import type { + ExecutionVertexVisitResult, + SentETH, +} from "../../types/executionGraph"; import type { PopulatedTransaction } from "ethers"; -import type { ExecutionContext } from "types/deployment"; -import type { ExecutionVertexVisitResult, SentETH } from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; +import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeSendETH( { address, value, signer }: SentETH, - resultAccumulator: Map, + resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { const resolve = resolveFrom(resultAccumulator); diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/execution/dispatch/executionDispatch.ts index ec6c0480f5..98b59a1718 100644 --- a/packages/core/src/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/execution/dispatch/executionDispatch.ts @@ -1,10 +1,9 @@ -import type { ExecutionContext } from "types/deployment"; +import type { ExecutionContext } from "../../types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVertex, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { IgnitionError } from "utils/errors"; +} from "../../types/executionGraph"; import { executeAwaitedEvent } from "./executeAwaitedEvent"; import { executeContractCall } from "./executeContractCall"; @@ -35,15 +34,5 @@ export function executionDispatch( return executeAwaitedEvent(executionVertex, resultAccumulator, context); case "SentETH": return executeSendETH(executionVertex, resultAccumulator, context); - default: - assertUnknownExecutionVertexType(executionVertex); } } - -function assertUnknownExecutionVertexType(executionVertex: never): never { - const vertex = executionVertex as any; - - const forReport = "type" in vertex ? vertex.type : vertex; - - throw new IgnitionError(`Unknown execution vertex type: ${forReport}`); -} diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/execution/dispatch/utils.ts index 0d00355ef1..3d52bf10f6 100644 --- a/packages/core/src/execution/dispatch/utils.ts +++ b/packages/core/src/execution/dispatch/utils.ts @@ -1,9 +1,10 @@ import type { ArgValue, ExecutionResultsAccumulator, -} from "types/executionGraph"; -import { IgnitionError } from "utils/errors"; -import { isDependable, isEventParam, isProxy } from "utils/guards"; +} from "../../types/executionGraph"; + +import { IgnitionError } from "../../utils/errors"; +import { isDependable, isEventParam, isProxy } from "../../utils/guards"; export function toAddress(v: any) { if (typeof v === "object" && "address" in v) { @@ -31,7 +32,7 @@ function resolveFromContext( const entry = context.get(arg.vertexId); - if (!entry) { + if (entry === undefined) { throw new IgnitionError( `No context entry for ${arg.vertexId} (${arg.label})` ); diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 73749d3b9a..186ea25d37 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,15 +1,16 @@ -import type { Deployment } from "deployment/Deployment"; -import { viewExecutionResults } from "deployment/utils"; -import type { Services } from "services/types"; -import type { ExecutionOptions, ExecutionState } from "types/deployment"; -import type { ExecutionVertexDispatcher } from "types/execution"; +import type { Deployment } from "../deployment/Deployment"; +import type { Services } from "../services/types"; +import type { ExecutionOptions, ExecutionState } from "../types/deployment"; +import type { ExecutionVertexDispatcher } from "../types/execution"; import type { ExecutionResultsAccumulator, ExecutionVertexVisitResult, ExecutionVisitResult, ExecutionVertex, -} from "types/executionGraph"; -import { IgnitionError } from "utils/errors"; +} from "../types/executionGraph"; + +import { viewExecutionResults } from "../deployment/utils"; +import { IgnitionError } from "../utils/errors"; import { ExecutionGraph } from "./ExecutionGraph"; import { executionDispatch } from "./dispatch/executionDispatch"; diff --git a/packages/core/src/execution/loadJournalInto.ts b/packages/core/src/execution/loadJournalInto.ts index 21ee851028..43ec6b21ef 100644 --- a/packages/core/src/execution/loadJournalInto.ts +++ b/packages/core/src/execution/loadJournalInto.ts @@ -1,5 +1,5 @@ -import { Deployment } from "deployment/Deployment"; -import { ICommandJournal } from "types/journal"; +import { Deployment } from "../deployment/Deployment"; +import { ICommandJournal } from "../types/journal"; /** * Update the deployment execution state with the previous runs in the journal. diff --git a/packages/core/src/execution/utils.ts b/packages/core/src/execution/utils.ts index 2a9ef5cfc6..559a01d828 100644 --- a/packages/core/src/execution/utils.ts +++ b/packages/core/src/execution/utils.ts @@ -1,8 +1,8 @@ import hash from "object-hash"; -import { ExecutionGraph } from "execution/ExecutionGraph"; -import { getDependenciesFor } from "graph/adjacencyList"; -import { serializeReplacer } from "utils/serialize"; +import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { getDependenciesFor } from "../graph/adjacencyList"; +import { serializeReplacer } from "../utils/serialize"; export function allDependenciesCompleted( vertexId: number, diff --git a/packages/core/src/graph/Graph.ts b/packages/core/src/graph/Graph.ts index 8fdd81679a..5f71a8b5cd 100644 --- a/packages/core/src/graph/Graph.ts +++ b/packages/core/src/graph/Graph.ts @@ -1,4 +1,4 @@ -import { AdjacencyList, IGraph } from "types/graph"; +import { AdjacencyList, IGraph } from "../types/graph"; import { constructEmptyAdjacencyList } from "./adjacencyList"; diff --git a/packages/core/src/graph/adjacencyList.ts b/packages/core/src/graph/adjacencyList.ts index c1f7de06f0..d2b836dd4b 100644 --- a/packages/core/src/graph/adjacencyList.ts +++ b/packages/core/src/graph/adjacencyList.ts @@ -1,7 +1,7 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; -import { AdjacencyList } from "types/graph"; -import { IgnitionError } from "utils/errors"; +import { AdjacencyList } from "../types/graph"; +import { IgnitionError } from "../utils/errors"; export function constructEmptyAdjacencyList(): AdjacencyList { return new Map>(); diff --git a/packages/core/src/graph/utils.ts b/packages/core/src/graph/utils.ts index ef381d1017..9bef2aa9dc 100644 --- a/packages/core/src/graph/utils.ts +++ b/packages/core/src/graph/utils.ts @@ -1,4 +1,4 @@ -import { IGraph } from "types/graph"; +import { IGraph } from "../types/graph"; import { topologicalSort } from "./adjacencyList"; diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/graph/visit.ts index 39458fd068..b126d3f16c 100644 --- a/packages/core/src/graph/visit.ts +++ b/packages/core/src/graph/visit.ts @@ -3,8 +3,8 @@ import { VertexVisitResult, ResultsAccumulator, VisitResult, -} from "types/graph"; -import { IgnitionError } from "utils/errors"; +} from "../types/graph"; +import { IgnitionError } from "../utils/errors"; export async function visit( phase: "Execution" | "Validation", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 476c8205e5..fe64e8e1d0 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,45 +1,50 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; -export { buildModule } from "dsl/buildModule"; -export { buildSubgraph } from "dsl/buildSubgraph"; -export { viewExecutionResults } from "deployment/utils"; -export { createServices } from "services/createServices"; -export { serializeReplacer } from "utils/serialize"; -export { IgnitionError, IgnitionValidationError } from "utils/errors"; -export { TransactionsService } from "services/TransactionsService"; -export { ContractsService } from "services/ContractsService"; -export { VertexResultEnum } from "types/graph"; +export { buildModule } from "./dsl/buildModule"; +export { buildSubgraph } from "./dsl/buildSubgraph"; +export { viewExecutionResults } from "./deployment/utils"; +export { createServices } from "./services/createServices"; +export { serializeReplacer } from "./utils/serialize"; +export { IgnitionError, IgnitionValidationError } from "./utils/errors"; +export { TransactionsService } from "./services/TransactionsService"; +export { ContractsService } from "./services/ContractsService"; +export { VertexResultEnum } from "./types/graph"; export type { SerializedDeploymentResult, ContractInfo, -} from "types/serialization"; -export type { Services } from "services/types"; +} from "./types/serialization"; +export type { Services } from "./services/types"; export type { Providers, ConfigProvider, HasParamResult, -} from "types/providers"; +} from "./types/providers"; export type { DeployState, DeployPhase, DeploymentResult, UpdateUiAction, -} from "types/deployment"; -export type { Module, ModuleDict, ModuleParams, Subgraph } from "types/module"; +} from "./types/deployment"; +export type { + Module, + ModuleDict, + ModuleParams, + Subgraph, +} from "./types/module"; export type { ExternalParamValue, IDeploymentBuilder, -} from "types/deploymentGraph"; -export type { FutureDict } from "types/future"; -export type { IgnitionPlan } from "types/plan"; +} from "./types/deploymentGraph"; +export type { FutureDict } from "./types/future"; +export type { IgnitionPlan } from "./types/plan"; export type { VertexGraph, VertexDescriptor, VertexVisitResultFailure, -} from "types/graph"; +} from "./types/graph"; export type { ExecutionVertex, ExecutionVertexType, -} from "types/executionGraph"; -export type { ICommandJournal } from "types/journal"; -export type { DeployStateExecutionCommand } from "types/deployment"; +} from "./types/executionGraph"; +export type { ICommandJournal } from "./types/journal"; +export type { DeployStateExecutionCommand } from "./types/deployment"; diff --git a/packages/core/src/journal/NoopCommandJournal.ts b/packages/core/src/journal/NoopCommandJournal.ts index 19e59b959b..420361d768 100644 --- a/packages/core/src/journal/NoopCommandJournal.ts +++ b/packages/core/src/journal/NoopCommandJournal.ts @@ -1,5 +1,5 @@ -import type { DeployStateExecutionCommand } from "types/deployment"; -import type { ICommandJournal } from "types/journal"; +import type { DeployStateExecutionCommand } from "../types/deployment"; +import type { ICommandJournal } from "../types/journal"; export class NoopCommandJournal implements ICommandJournal { public async record(_command: DeployStateExecutionCommand): Promise { diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/process/generateDeploymentGraphFrom.ts index 6e646af763..bb77b9a57b 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/process/generateDeploymentGraphFrom.ts @@ -1,12 +1,13 @@ -import { DeploymentBuilder } from "dsl/DeploymentBuilder"; import type { CallPoints, DeploymentBuilderOptions, IDeploymentGraph, -} from "types/deploymentGraph"; -import { Module, ModuleDict } from "types/module"; -import { IgnitionError } from "utils/errors"; -import { assertModuleReturnTypes } from "utils/guards"; +} from "../types/deploymentGraph"; + +import { DeploymentBuilder } from "../dsl/DeploymentBuilder"; +import { Module, ModuleDict } from "../types/module"; +import { IgnitionError } from "../utils/errors"; +import { assertModuleReturnTypes } from "../utils/guards"; export function generateDeploymentGraphFrom( ignitionModule: Module, @@ -16,7 +17,7 @@ export function generateDeploymentGraphFrom( const moduleOutputs = ignitionModule.action(graphBuilder); - if (isPromise(moduleOutputs)) { + if (moduleOutputs instanceof Promise) { throw new IgnitionError( `The callback passed to 'buildModule' for ${ignitionModule.name} returns a Promise; async callbacks are not allowed in 'buildModule'.` ); @@ -30,11 +31,3 @@ export function generateDeploymentGraphFrom( moduleOutputs, }; } - -function isPromise(promise: any) { - return ( - promise && - typeof promise.then === "function" && - promise[Symbol.toStringTag] === "Promise" - ); -} diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index ac8ba90117..96cccdd23a 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,6 +1,6 @@ import { BigNumber, ethers } from "ethers"; -import { Services } from "services/types"; +import { Services } from "../../services/types"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, @@ -13,7 +13,7 @@ import { ExternalParamValue, EventVertex, SendVertex, -} from "types/deploymentGraph"; +} from "../../types/deploymentGraph"; import { AwaitedEvent, ContractCall, @@ -22,15 +22,15 @@ import { ExecutionVertex, LibraryDeploy, SentETH, -} from "types/executionGraph"; +} from "../../types/executionGraph"; import { BytesFuture, DeploymentGraphFuture, EventParamFuture, -} from "types/future"; -import { Artifact } from "types/hardhat"; -import { IgnitionError } from "utils/errors"; -import { isBytesArg, isFuture } from "utils/guards"; +} from "../../types/future"; +import { Artifact } from "../../types/hardhat"; +import { IgnitionError } from "../../utils/errors"; +import { isBytesArg, isFuture } from "../../utils/guards"; interface TransformContext { services: Services; @@ -73,8 +73,6 @@ export function convertDeploymentVertexToExecutionVertex( throw new IgnitionError( `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` ); - default: - return assertDeploymentVertexNotExpected(deploymentVertex); } }; } @@ -231,16 +229,6 @@ async function convertSendToSentETH( }; } -function assertDeploymentVertexNotExpected( - vertex: never -): Promise { - const v: any = vertex; - - const obj = typeof v === "object" && "type" in v ? v.type : v; - - throw new IgnitionError(`Type not expected: ${obj}`); -} - async function convertArgs( args: Array< | boolean @@ -306,8 +294,6 @@ async function resolveParameter( ); case "param-missing": throw new IgnitionError(`No parameter provided for "${arg.label}"`); - default: - assertNeverParamResult(hasParamResult.errorCode); } } @@ -322,7 +308,3 @@ async function resolveBytesForArtifact( return artifact.bytecode; } - -function assertNeverParamResult(hasParamResult: never) { - throw new IgnitionError(`Unexpected error code ${hasParamResult}`); -} diff --git a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts index 868d63a716..3995cb4640 100644 --- a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -1,6 +1,6 @@ -import { DeploymentGraph } from "dsl/DeploymentGraph"; -import { eliminate } from "graph/adjacencyList"; -import { DeploymentGraphVertex } from "types/deploymentGraph"; +import { DeploymentGraph } from "../../dsl/DeploymentGraph"; +import { eliminate } from "../../graph/adjacencyList"; +import { DeploymentGraphVertex } from "../../types/deploymentGraph"; /** * Deployment graphs can have virtual vertex that represent the diff --git a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts index 199ee30add..9e93424860 100644 --- a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts @@ -1,9 +1,12 @@ -import { ExecutionGraph } from "execution/ExecutionGraph"; -import { clone } from "graph/adjacencyList"; -import { Services } from "services/types"; -import { IDeploymentGraph, DeploymentGraphVertex } from "types/deploymentGraph"; -import { ExecutionVertex, IExecutionGraph } from "types/executionGraph"; -import { TransformResult } from "types/process"; +import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { clone } from "../graph/adjacencyList"; +import { Services } from "../services/types"; +import { + IDeploymentGraph, + DeploymentGraphVertex, +} from "../types/deploymentGraph"; +import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; +import { TransformResult } from "../types/process"; import { convertDeploymentVertexToExecutionVertex as convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; import { reduceDeploymentGraphByEliminatingVirtualVertexes } from "./transform/reduceDeploymentGraphByEliminatingVirtualVertexes"; diff --git a/packages/core/src/services/AccountsService.ts b/packages/core/src/services/AccountsService.ts index b38e98c394..d6a38d8b90 100644 --- a/packages/core/src/services/AccountsService.ts +++ b/packages/core/src/services/AccountsService.ts @@ -1,7 +1,6 @@ +import type { Providers } from "../types/providers"; import type { ethers } from "ethers"; -import type { Providers } from "types/providers"; - export interface IAccountsService { getAccounts(): Promise; getSigner(address: string): Promise; diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts index f41bd5bf09..b11b47f48f 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/services/ArtifactsService.ts @@ -1,5 +1,5 @@ -import { Artifact } from "types/hardhat"; -import { Providers } from "types/providers"; +import { Artifact } from "../types/hardhat"; +import { Providers } from "../types/providers"; export interface IArtifactsService { getArtifact(name: string): Promise; diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index 4f23f336a5..b6b35911b3 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,5 +1,5 @@ -import { ExternalParamValue } from "types/deploymentGraph"; -import { HasParamResult, Providers } from "types/providers"; +import { ExternalParamValue } from "../types/deploymentGraph"; +import { HasParamResult, Providers } from "../types/providers"; export interface IConfigService { getParam(paramName: string): Promise; diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 6d3b00d4eb..8f65ef6a97 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,12 +1,12 @@ +import type { TransactionOptions } from "./types"; + import setupDebug from "debug"; import { ethers } from "ethers"; -import { GasProvider, TransactionsProvider } from "types/providers"; -import { IgnitionError } from "utils/errors"; -import { sleep } from "utils/sleep"; -import { TxSender } from "utils/tx-sender"; - -import type { TransactionOptions } from "./types"; +import { GasProvider, TransactionsProvider } from "../types/providers"; +import { IgnitionError } from "../utils/errors"; +import { sleep } from "../utils/sleep"; +import { TxSender } from "../utils/tx-sender"; export interface IContractsService { sendTx( @@ -117,14 +117,15 @@ export class ContractsService implements IContractsService { if (previousTx.gasPrice !== undefined) { // Increase 10%, and add 1 to be sure it's at least rounded up // or add by user's config value if present - const newGasPrice = gasPriceIncrementPerRetry - ? ethers.BigNumber.from(previousTx.gasPrice).add( - gasPriceIncrementPerRetry - ) - : ethers.BigNumber.from(previousTx.gasPrice) - .mul(110000) - .div(100000) - .add(1); + const newGasPrice = + gasPriceIncrementPerRetry !== null + ? ethers.BigNumber.from(previousTx.gasPrice).add( + gasPriceIncrementPerRetry + ) + : ethers.BigNumber.from(previousTx.gasPrice) + .mul(110000) + .div(100000) + .add(1); return { ...previousTxRequest, diff --git a/packages/core/src/services/NetworkService.ts b/packages/core/src/services/NetworkService.ts index c67b8ce7ea..09796919d0 100644 --- a/packages/core/src/services/NetworkService.ts +++ b/packages/core/src/services/NetworkService.ts @@ -1,4 +1,4 @@ -import { Providers } from "types/providers"; +import { Providers } from "../types/providers"; export interface INetworkService { getChainId(): Promise; diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index 4d2c7ffae5..c8e21b9855 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Providers } from "types/providers"; +import { Providers } from "../types/providers"; export interface ITransactionsService { wait(txHash: string): Promise; diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index 59a46076db..f1cf481a1e 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; -import { Providers } from "types/providers"; -import { TxSender } from "utils/tx-sender"; +import { Providers } from "../types/providers"; +import { TxSender } from "../utils/tx-sender"; import { AccountsService } from "./AccountsService"; import { ArtifactsService } from "./ArtifactsService"; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 57bf8122f2..64ae0ec1cf 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,7 +1,4 @@ -import type { BigNumber } from "ethers"; - -import type { Services } from "services/types"; - +import type { Services } from "../services/types"; import type { ExecutionVertex, ExecutionVertexVisitResult, @@ -15,6 +12,7 @@ import type { } from "./graph"; import type { ModuleDict, ModuleParams } from "./module"; import type { SerializedDeploymentResult } from "./serialization"; +import type { BigNumber } from "ethers"; export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; @@ -95,12 +93,12 @@ export type VertexExecutionStatus = export interface VertexExecutionStateRunning { status: VertexExecutionStatusUnstarted; - result: null; + result: undefined; } export interface VertexExecutionStateUnstarted { status: VertexExecutionStatusRunning; - result: null; + result: undefined; } export interface VertexExecutionStateCompleted { @@ -115,7 +113,7 @@ export interface VertexExecutionStateFailed { export interface VertexExecutionStateHold { status: VertexExecutionStatusHold; - result: null; + result: undefined; } export type VertexExecutionState = diff --git a/packages/core/src/types/graph.ts b/packages/core/src/types/graph.ts index 81dd8a2d7b..abdfcae9f8 100644 --- a/packages/core/src/types/graph.ts +++ b/packages/core/src/types/graph.ts @@ -54,4 +54,7 @@ export type VisitResult = holds: VertexDescriptor[]; }; -export type ResultsAccumulator = Map | null>; +export type ResultsAccumulator = Map< + number, + VertexVisitResult | undefined +>; diff --git a/packages/core/src/types/journal.ts b/packages/core/src/types/journal.ts index 21223a5b5f..530127b627 100644 --- a/packages/core/src/types/journal.ts +++ b/packages/core/src/types/journal.ts @@ -1,4 +1,4 @@ -import type { DeployStateExecutionCommand } from "types/deployment"; +import type { DeployStateExecutionCommand } from "../types/deployment"; export interface JournalEntry { txHash: string; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 3f8e0402d5..d355751ea4 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,7 +1,7 @@ -import type { ethers } from "ethers"; - import type { ExternalParamValue } from "./deploymentGraph"; import type { Artifact } from "./hardhat"; +import type { ethers } from "ethers"; + import { ModuleParams } from "./module"; export interface Providers { diff --git a/packages/core/src/types/validation.ts b/packages/core/src/types/validation.ts index dde65fa2c4..8ea965c205 100644 --- a/packages/core/src/types/validation.ts +++ b/packages/core/src/types/validation.ts @@ -1,4 +1,4 @@ -import { Services } from "services/types"; +import { Services } from "../services/types"; import { CallPoints } from "./deploymentGraph"; import { ResultsAccumulator, VertexVisitResult, VisitResult } from "./graph"; diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts index 94746e8298..c955fda47a 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { Artifact } from "types/hardhat"; -import { IgnitionError } from "utils/errors"; +import { Artifact } from "../types/hardhat"; +import { IgnitionError } from "../utils/errors"; interface Link { sourceName: string; diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/utils/guards.ts index 16760a52f3..f62debc5cd 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/utils/guards.ts @@ -1,5 +1,3 @@ -import { BigNumber } from "ethers"; - import type { DeploymentGraphVertex, HardhatContractDeploymentVertex, @@ -10,7 +8,7 @@ import type { ArtifactLibraryDeploymentVertex, EventVertex, InternalParamValue, -} from "types/deploymentGraph"; +} from "../types/deploymentGraph"; import type { CallableFuture, DependableFuture, @@ -22,9 +20,12 @@ import type { BytesFuture, EventParamFuture, ContractFuture, -} from "types/future"; -import { Artifact } from "types/hardhat"; -import { ModuleDict } from "types/module"; +} from "../types/future"; + +import { BigNumber } from "ethers"; + +import { Artifact } from "../types/hardhat"; +import { ModuleDict } from "../types/module"; import { IgnitionError } from "./errors"; @@ -168,13 +169,3 @@ export function assertModuleReturnTypes(moduleResult: T) { ); } } - -export function assertUnknownDeploymentVertexType( - deploymentVertex: never -): never { - const vertex = deploymentVertex as any; - - const forReport = "type" in vertex ? vertex.type : vertex; - - throw new IgnitionError(`Unknown deployment vertex type: ${forReport}`); -} diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/utils/proxy.ts index ed63c40c9b..1a37c3b8eb 100644 --- a/packages/core/src/utils/proxy.ts +++ b/packages/core/src/utils/proxy.ts @@ -5,7 +5,7 @@ import { Virtual, EventFuture, SendFuture, -} from "types/future"; +} from "../types/future"; import { isProxy } from "./guards"; diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/utils/tx-sender.ts index cb2942be5b..7d77c50285 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/utils/tx-sender.ts @@ -1,7 +1,7 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { GasProvider } from "types/providers"; +import { GasProvider } from "../types/providers"; /** * Sends, replaces and keeps track of transactions. diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index d30aec5d08..5cf41fd281 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -1,14 +1,15 @@ -import type { Services } from "services/types"; +import type { Services } from "../../services/types"; +import type { CallableFuture } from "../../types/future"; + import { CallPoints, DeploymentGraphVertex, InternalParamValue, -} from "types/deploymentGraph"; -import type { CallableFuture } from "types/future"; -import { VertexResultEnum, VertexVisitResultFailure } from "types/graph"; -import { IgnitionError } from "utils/errors"; -import { isBytesArg } from "utils/guards"; -import { resolveProxyValue } from "utils/proxy"; +} from "../../types/deploymentGraph"; +import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; +import { IgnitionError } from "../../utils/errors"; +import { isBytesArg } from "../../utils/guards"; +import { resolveProxyValue } from "../../utils/proxy"; export async function resolveArtifactForCallableFuture( givenFuture: CallableFuture, @@ -28,8 +29,6 @@ export async function resolveArtifactForCallableFuture( future.contractName ); return artifact.abi; - default: - return assertNeverDeploymentFuture(future); } case "library": switch (future.subtype) { @@ -40,8 +39,6 @@ export async function resolveArtifactForCallableFuture( future.libraryName ); return artifact.abi; - default: - return assertNeverDeploymentFuture(future); } case "virtual": throw new IgnitionError(`Cannot call virtual future`); @@ -51,8 +48,6 @@ export async function resolveArtifactForCallableFuture( throw new IgnitionError(`Cannot call await future`); case "send": throw new IgnitionError(`Cannot call send future`); - default: - return assertNeverDeploymentFuture(future); } } @@ -98,9 +93,3 @@ export function buildValidationError( failure, }; } - -function assertNeverDeploymentFuture(f: never): undefined { - throw new IgnitionError( - `Unexpected deployment future type/subtype ${JSON.stringify(f)}` - ); -} diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/validation/dispatch/validateArtifactContract.ts index c7d5f34cb5..4e212faf18 100644 --- a/packages/core/src/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/validation/dispatch/validateArtifactContract.ts @@ -1,13 +1,13 @@ import { ethers, BigNumber } from "ethers"; -import { ArtifactContractDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { ArtifactContractDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { isArtifact, isParameter } from "utils/guards"; +} from "../../types/validation"; +import { isArtifact, isParameter } from "../../utils/guards"; import { buildValidationError, validateBytesForArtifact } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts index 5acba8e829..f8223f5892 100644 --- a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/validation/dispatch/validateArtifactLibrary.ts @@ -1,13 +1,13 @@ import { ethers } from "ethers"; -import { ArtifactLibraryDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { ArtifactLibraryDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { isArtifact } from "utils/guards"; +} from "../../types/validation"; +import { isArtifact } from "../../utils/guards"; import { buildValidationError, validateBytesForArtifact } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/validation/dispatch/validateCall.ts index 33b4f6190c..56fcd37383 100644 --- a/packages/core/src/validation/dispatch/validateCall.ts +++ b/packages/core/src/validation/dispatch/validateCall.ts @@ -1,13 +1,13 @@ import { ethers, BigNumber } from "ethers"; -import { CallDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { CallDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { isParameter } from "utils/guards"; +} from "../../types/validation"; +import { isParameter } from "../../utils/guards"; import { buildValidationError, diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/validation/dispatch/validateDeployedContract.ts index 60542212f5..691cbcbbc5 100644 --- a/packages/core/src/validation/dispatch/validateDeployedContract.ts +++ b/packages/core/src/validation/dispatch/validateDeployedContract.ts @@ -1,12 +1,12 @@ import { isAddress } from "@ethersproject/address"; -import { DeployedContractDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { DeployedContractDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; +} from "../../types/validation"; import { buildValidationError } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateEvent.ts b/packages/core/src/validation/dispatch/validateEvent.ts index 1ee8494faf..16dab41889 100644 --- a/packages/core/src/validation/dispatch/validateEvent.ts +++ b/packages/core/src/validation/dispatch/validateEvent.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; -import { EventVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { EventVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; +} from "../../types/validation"; import { buildValidationError, diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/validation/dispatch/validateHardhatContract.ts index f37690f472..8f87a6b6a8 100644 --- a/packages/core/src/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/validation/dispatch/validateHardhatContract.ts @@ -1,13 +1,13 @@ import { ethers, BigNumber } from "ethers"; -import { HardhatContractDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { HardhatContractDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { isParameter } from "utils/guards"; +} from "../../types/validation"; +import { isParameter } from "../../utils/guards"; import { buildValidationError, validateBytesForArtifact } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts index e51bff9877..d7faf71bcf 100644 --- a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/validation/dispatch/validateHardhatLibrary.ts @@ -1,12 +1,12 @@ import { ethers } from "ethers"; -import { HardhatLibraryDeploymentVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { HardhatLibraryDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; +} from "../../types/validation"; import { buildValidationError, validateBytesForArtifact } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/validation/dispatch/validateSendETH.ts index d2220f7066..fc641f711d 100644 --- a/packages/core/src/validation/dispatch/validateSendETH.ts +++ b/packages/core/src/validation/dispatch/validateSendETH.ts @@ -1,13 +1,13 @@ import { ethers, BigNumber } from "ethers"; -import { SendVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { SendVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { isParameter } from "utils/guards"; +} from "../../types/validation"; +import { isParameter } from "../../utils/guards"; import { buildValidationError } from "./helpers"; diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/validation/dispatch/validateVirtual.ts index edeef8e407..2dee5b0fa5 100644 --- a/packages/core/src/validation/dispatch/validateVirtual.ts +++ b/packages/core/src/validation/dispatch/validateVirtual.ts @@ -1,10 +1,10 @@ -import { DeploymentGraphVertex } from "types/deploymentGraph"; -import { VertexResultEnum } from "types/graph"; +import { DeploymentGraphVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; +} from "../../types/validation"; export async function validateVirtual( _deploymentVertex: DeploymentGraphVertex, diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/validation/dispatch/validationDispatch.ts index 10091a9b84..9edba39639 100644 --- a/packages/core/src/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/validation/dispatch/validationDispatch.ts @@ -1,10 +1,9 @@ -import { DeploymentGraphVertex } from "types/deploymentGraph"; +import { DeploymentGraphVertex } from "../../types/deploymentGraph"; import { ValidationDispatchContext, ValidationResultsAccumulator, ValidationVertexVisitResult, -} from "types/validation"; -import { assertUnknownDeploymentVertexType } from "utils/guards"; +} from "../../types/validation"; import { validateArtifactContract } from "./validateArtifactContract"; import { validateArtifactLibrary } from "./validateArtifactLibrary"; @@ -60,7 +59,5 @@ export function validationDispatch( return validateEvent(deploymentVertex, resultAccumulator, context); case "SendETH": return validateSendETH(deploymentVertex, resultAccumulator, context); - default: - assertUnknownDeploymentVertexType(deploymentVertex); } } diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts index a73676584d..a579a44c6d 100644 --- a/packages/core/src/validation/validateDeploymentGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -1,9 +1,9 @@ -import { getSortedVertexIdsFrom } from "graph/utils"; -import { visit } from "graph/visit"; -import { Services } from "services/types"; -import { CallPoints, IDeploymentGraph } from "types/deploymentGraph"; -import { ValidationVisitResult } from "types/validation"; -import { IgnitionError } from "utils/errors"; +import { getSortedVertexIdsFrom } from "../graph/utils"; +import { visit } from "../graph/visit"; +import { Services } from "../services/types"; +import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; +import { ValidationVisitResult } from "../types/validation"; +import { IgnitionError } from "../utils/errors"; import { validationDispatch } from "./dispatch/validationDispatch"; @@ -20,7 +20,7 @@ export async function validateDeploymentGraph( orderedVertexIds, deploymentGraph, { services, callPoints }, - new Map(), + new Map(), validationDispatch ); } catch (err) { diff --git a/packages/core/test/buildModule.ts b/packages/core/test/buildModule.ts index dc76da2402..930154d34c 100644 --- a/packages/core/test/buildModule.ts +++ b/packages/core/test/buildModule.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; +import { buildModule } from "../src/dsl/buildModule"; describe("buildModule", () => { const values = [ diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts index d56d7510b7..973c0dfc04 100644 --- a/packages/core/test/collectLibrariesAndLink.ts +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { expect } from "chai"; -import { collectLibrariesAndLink } from "utils/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "../src/utils/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index be9c4e3692..e5cf573176 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -1,12 +1,13 @@ /* eslint-disable import/no-unused-modules */ +import type { TxSender } from "../src/utils/tx-sender"; + import { assert } from "chai"; import { ethers } from "ethers"; import { ContractsService, ContractsServiceProviders, -} from "services/ContractsService"; -import type { TxSender } from "utils/tx-sender"; +} from "../src/services/ContractsService"; const txSender: TxSender = { async send(..._) { @@ -18,6 +19,25 @@ const txSender: TxSender = { } as TxSender; const providersFake = { + signersProvider: { + async getDefaultSigner() { + return { + async sendTransaction(_: {}) { + return { + hash: "", + blockHash: "", + blockNumber: 0, + nonce: 0, + gasLimit: 100, + confirmations: 0, + chainId: 0, + data: "", + from: "", + } as unknown as ethers.providers.TransactionResponse; + }, + }; + }, + }, web3Provider: { n: 0, async getBlockNumber() { @@ -34,15 +54,15 @@ const providersFake = { }, }, transactionsProvider: { - async isConfirmed(_) { + async isConfirmed(_: {}) { return false; }, - async isMined(_) { + async isMined(_: {}) { return false; }, }, gasProvider: { - async estimateGasLimit(_) { + async estimateGasLimit(_: {}) { return ethers.BigNumber.from(0); }, async estimateGasPrice() { diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index cfde369576..166856834e 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -1,14 +1,15 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import { isCall, isHardhatContract } from "utils/guards"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; +import { ethers } from "ethers"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { isCall, isHardhatContract } from "../../src/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -45,7 +46,10 @@ describe("deployment builder - accounts", () => { it("should default to the first account if not given a from parameter", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - assert.isDefined(depNode); + if (depNode === undefined) { + return assert.fail("depNode not retrieved"); + } + if (!isHardhatContract(depNode)) { return assert.fail("unknown error"); } @@ -56,7 +60,10 @@ describe("deployment builder - accounts", () => { it("should deploy with a given from address", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - assert.isDefined(depNode); + if (depNode === undefined) { + return assert.fail("depNode not retrieved"); + } + if (!isHardhatContract(depNode)) { return assert.fail("unknown error"); } @@ -70,7 +77,10 @@ describe("deployment builder - accounts", () => { "Exchange/addToken" ); - assert.isDefined(depNode); + if (depNode === undefined) { + return assert.fail("depNode not retrieved"); + } + if (!isCall(depNode)) { return assert.fail("unknown error"); } diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index efc422503b..50ffba960f 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -1,9 +1,9 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IgnitionError } from "utils/errors"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { IgnitionError } from "../../src/utils/errors"; describe("deployment builder - buildModule", () => { it("should throw if build module is given an async callback", () => { diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index f1f4cf48d4..f76976605c 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -1,10 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; -import { isCall, isHardhatContract } from "utils/guards"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { + IDeploymentBuilder, + IDeploymentGraph, +} from "../../src/types/deploymentGraph"; +import { isCall, isHardhatContract } from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index d0634f8330..ed00d9686a 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -1,18 +1,19 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import { Artifact } from "types/hardhat"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { Artifact } from "../../src/types/hardhat"; import { isArtifactContract, isDeployedContract, isHardhatContract, -} from "utils/guards"; +} from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index f20d0ceec3..78fe004b7a 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -1,11 +1,18 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; -import { ArtifactContract } from "types/future"; -import { isAwaitedEvent, isCall, isArtifactContract } from "utils/guards"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { + IDeploymentBuilder, + IDeploymentGraph, +} from "../../src/types/deploymentGraph"; +import { ArtifactContract } from "../../src/types/future"; +import { + isAwaitedEvent, + isCall, + isArtifactContract, +} from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts index 2589c763ee..311bda63a4 100644 --- a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts +++ b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts @@ -1,10 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; -import { isCall, isHardhatContract } from "utils/guards"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { + IDeploymentBuilder, + IDeploymentGraph, +} from "../../src/types/deploymentGraph"; +import { isCall, isHardhatContract } from "../../src/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/deploymentBuilder/helpers.ts b/packages/core/test/deploymentBuilder/helpers.ts index 0fc73c9030..2a56948c63 100644 --- a/packages/core/test/deploymentBuilder/helpers.ts +++ b/packages/core/test/deploymentBuilder/helpers.ts @@ -1,7 +1,7 @@ -import { DeploymentGraph } from "dsl/DeploymentGraph"; -import { getDependenciesFor } from "graph/adjacencyList"; -import { DeploymentGraphVertex } from "types/deploymentGraph"; -import { VertexDescriptor } from "types/graph"; +import { DeploymentGraph } from "../../src/dsl/DeploymentGraph"; +import { getDependenciesFor } from "../../src/graph/adjacencyList"; +import { DeploymentGraphVertex } from "../../src/types/deploymentGraph"; +import { VertexDescriptor } from "../../src/types/graph"; export function getDeploymentVertexByLabel( deploymentGraph: DeploymentGraph, diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index a3469e89f1..11a015fd02 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -1,13 +1,14 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import { isHardhatContract, isHardhatLibrary } from "utils/guards"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { isHardhatContract, isHardhatLibrary } from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts index b956de2ce1..8e93b3720e 100644 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -1,9 +1,9 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder } from "types/deploymentGraph"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder } from "../../src/types/deploymentGraph"; describe("deployment builder - metadata", () => { it("should inject the chainId via the builder", () => { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 70f7374b33..6866b4d332 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -1,15 +1,16 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { buildSubgraph } from "dsl/buildSubgraph"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import { IgnitionError } from "utils/errors"; -import { isCallable } from "utils/guards"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { buildSubgraph } from "../../src/dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { IgnitionError } from "../../src/utils/errors"; +import { isCallable } from "../../src/utils/guards"; describe("deployment builder - parameters", function () { let deploymentGraph: IDeploymentGraph; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index f800645ca4..34be51d055 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -2,10 +2,13 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder, IDeploymentGraph } from "types/deploymentGraph"; -import { isHardhatContract } from "utils/guards"; +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { + IDeploymentBuilder, + IDeploymentGraph, +} from "../../src/types/deploymentGraph"; +import { isHardhatContract } from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index d246f66d63..88cccc826f 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -1,12 +1,13 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; import { ArtifactContract, CallableFuture, @@ -14,8 +15,8 @@ import { HardhatContract, ProxyFuture, Virtual, -} from "types/future"; -import { Module } from "types/module"; +} from "../../src/types/future"; +import { Module } from "../../src/types/module"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts index 38f85c9b28..c3d23a2b15 100644 --- a/packages/core/test/deploymentBuilder/useSubgraph.ts +++ b/packages/core/test/deploymentBuilder/useSubgraph.ts @@ -1,15 +1,16 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "dsl/buildModule"; -import { buildSubgraph } from "dsl/buildSubgraph"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import { IgnitionError } from "utils/errors"; -import { isCallable } from "utils/guards"; +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { buildSubgraph } from "../../src/dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { IgnitionError } from "../../src/utils/errors"; +import { isCallable } from "../../src/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 1c657578a3..5ab5c5e049 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -1,15 +1,20 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "dsl/buildModule"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; import type { IDeploymentGraph, IDeploymentBuilder, -} from "types/deploymentGraph"; -import type { Artifact } from "types/hardhat"; -import { isArtifactContract, isHardhatContract, isCall } from "utils/guards"; +} from "../../src/types/deploymentGraph"; +import type { Artifact } from "../../src/types/hardhat"; + +import { assert } from "chai"; +import { ethers } from "ethers"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { + isArtifactContract, + isHardhatContract, + isCall, +} from "../../src/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -49,7 +54,10 @@ describe("deployment builder - value", () => { it("should default to zero value if not given a value parameter", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - assert.isDefined(depNode); + if (depNode === undefined) { + assert.fail("depNode not returned"); + } + if (!isHardhatContract(depNode)) { return assert.fail("unknown error"); } @@ -64,7 +72,10 @@ describe("deployment builder - value", () => { it("should deploy with a given value", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - assert.isDefined(depNode); + if (depNode === undefined) { + assert.fail("depNode not returned"); + } + if (!isHardhatContract(depNode)) { return assert.fail("unknown error"); } @@ -83,7 +94,10 @@ describe("deployment builder - value", () => { "Exchange/addToken" ); - assert.isDefined(depNode); + if (depNode === undefined) { + assert.fail("depNode not returned"); + } + if (!isCall(depNode)) { return assert.fail("unknown error"); } @@ -99,7 +113,10 @@ describe("deployment builder - value", () => { it("should deploy with a given value", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - assert.isDefined(depNode); + if (depNode === undefined) { + assert.fail("depNode not returned"); + } + if (!isArtifactContract(depNode)) { return assert.fail("unknown error"); } diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index 5a4ff9e212..035c90fb25 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -1,18 +1,18 @@ /* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { BigNumber } from "ethers"; - -import { Deployment } from "deployment/Deployment"; -import { ExecutionGraph } from "execution/ExecutionGraph"; -import { executeInBatches } from "execution/execute"; import type { ContractDeploy, ExecutionVertex, ExecutionVertexVisitResult, -} from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; -import { ICommandJournal } from "types/journal"; +} from "../../src/types/executionGraph"; + +import { assert } from "chai"; +import { BigNumber } from "ethers"; +import { Deployment } from "../../src/deployment/Deployment"; +import { ExecutionGraph } from "../../src/execution/ExecutionGraph"; +import { executeInBatches } from "../../src/execution/execute"; +import { VertexResultEnum } from "../../src/types/graph"; +import { ICommandJournal } from "../../src/types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; describe("Execution - batching", () => { @@ -38,7 +38,7 @@ describe("Execution - batching", () => { const mockServices = {} as any; const mockJournal: ICommandJournal = { record: async () => {}, - read: () => null, + async *read() {}, }; const mockUpdateUiAction = () => {}; diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index e97ed8d377..18d3080c00 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -3,15 +3,14 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import { Deployment } from "deployment/Deployment"; -import { ExecutionGraph } from "execution/ExecutionGraph"; -import { execute } from "execution/execute"; -import { Services, TransactionOptions } from "services/types"; -import { ExecutionVertex } from "types/executionGraph"; -import { VertexResultEnum } from "types/graph"; -import { Artifact } from "types/hardhat"; -import { ICommandJournal } from "types/journal"; - +import { Deployment } from "../../src/deployment/Deployment"; +import { ExecutionGraph } from "../../src/execution/ExecutionGraph"; +import { execute } from "../../src/execution/execute"; +import { Services, TransactionOptions } from "../../src/services/types"; +import { ExecutionVertex } from "../../src/types/executionGraph"; +import { VertexResultEnum } from "../../src/types/graph"; +import { Artifact } from "../../src/types/hardhat"; +import { ICommandJournal } from "../../src/types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; import { getMockServices } from "../helpers"; @@ -463,7 +462,7 @@ async function runExecuteOnSingleVertex( const mockUpdateUiAction = () => {}; const mockJournal: ICommandJournal = { record: async () => {}, - read: () => null, + async *read() {}, }; const deployment = new Deployment( @@ -482,7 +481,7 @@ async function runExecuteOnDependentVertex( vertexes: ExecutionVertex[], mockServices: Services ) { - const obj = {}; + const obj: { [key: number]: number[] } = {}; const len = vertexes.length; for (let i = 0; i < len; i++) { obj[i] = i === len - 1 ? [] : [i + 1]; @@ -498,7 +497,7 @@ async function runExecuteOnDependentVertex( const mockUpdateUiAction = () => {}; const mockJournal: ICommandJournal = { record: async () => {}, - read: () => null, + async *read() {}, }; const deployment = new Deployment( diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index fa9f83776a..c70d8cdc3b 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -3,12 +3,11 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "dsl/buildModule"; -import { TransactionsService } from "services/TransactionsService"; -import { Artifact } from "types/hardhat"; -import { Providers } from "types/providers"; - import { Ignition } from "../../src/Ignition"; +import { buildModule } from "../../src/dsl/buildModule"; +import { TransactionsService } from "../../src/services/TransactionsService"; +import { Artifact } from "../../src/types/hardhat"; +import { Providers } from "../../src/types/providers"; import { getMockServices } from "../helpers"; import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; @@ -71,7 +70,7 @@ describe("Rerunning execution", () => { getArtifact: () => tokenArtifact, }, transactions: { - wait: (tx) => { + wait: (tx: string) => { sentTransactionCount++; if (tx === "0x00001") { @@ -143,10 +142,6 @@ describe("Rerunning execution", () => { return assert.fail("Not a successful deploy"); } - if (!redeployResult.result.token.address) { - return assert.fail("Unable to retrieve the token contract result"); - } - assert.equal( redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" @@ -205,7 +200,7 @@ describe("Rerunning execution", () => { getArtifact: () => tokenArtifact, }, transactions: { - wait: (tx) => { + wait: (tx: string) => { sentTransactionCount++; if (tx === "0x00001") { @@ -281,10 +276,6 @@ describe("Rerunning execution", () => { return assert.fail("Not a successful deploy"); } - if (!redeployResult.result.token.address) { - return assert.fail("Unable to retrieve the token contract result"); - } - assert.equal( redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" @@ -325,7 +316,7 @@ describe("Rerunning execution", () => { }); describe("when a deployment fails", () => { - let sentTransactionCount; + let sentTransactionCount: number; let ignition: Ignition; let myModule: any; @@ -358,11 +349,11 @@ describe("Rerunning execution", () => { configureCallErroredBefore = true; throw new Error("Revert: All the apes have gone!"); } else { - return `0x0000${this.contractCount}`; + return `0x0000${this.transactionCount}`; } } - return `0x0000${this.contractCount}`; + return `0x0000${this.transactionCount}`; }, }, transactions: { @@ -426,10 +417,6 @@ describe("Rerunning execution", () => { return assert.fail("Not a successful deploy"); } - if (!redeployResult.result.token.address) { - return assert.fail("Unable to retrieve the token contract result"); - } - assert.equal( redeployResult.result.token.address, "0x1F98431c8aD98523631AE4a59f267346ea31F984" diff --git a/packages/core/test/graph/adjacencyList.ts b/packages/core/test/graph/adjacencyList.ts index e74d68a581..bc6a2ce847 100644 --- a/packages/core/test/graph/adjacencyList.ts +++ b/packages/core/test/graph/adjacencyList.ts @@ -9,7 +9,7 @@ import { topologicalSort, eliminate, ensureVertex, -} from "graph/adjacencyList"; +} from "../../src/graph/adjacencyList"; import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; diff --git a/packages/core/test/graph/helpers.ts b/packages/core/test/graph/helpers.ts index 2530816de6..0854185dc4 100644 --- a/packages/core/test/graph/helpers.ts +++ b/packages/core/test/graph/helpers.ts @@ -2,7 +2,7 @@ import { addEdge, ensureVertex, constructEmptyAdjacencyList, -} from "graph/adjacencyList"; +} from "../../src/graph/adjacencyList"; export function constructAdjacencyList( edges: Array<{ from: number; to: number }> diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 52975aee27..4377d0bf9a 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,15 +1,15 @@ import { ethers } from "ethers"; -import { IAccountsService } from "services/AccountsService"; -import { IArtifactsService } from "services/ArtifactsService"; -import { IConfigService } from "services/ConfigService"; -import { IContractsService } from "services/ContractsService"; -import { INetworkService } from "services/NetworkService"; -import { ITransactionsService } from "services/TransactionsService"; -import { Services, TransactionOptions } from "services/types"; -import { Artifact } from "types/hardhat"; -import { HasParamResult } from "types/providers"; -import { IgnitionError } from "utils/errors"; +import { IAccountsService } from "../src/services/AccountsService"; +import { IArtifactsService } from "../src/services/ArtifactsService"; +import { IConfigService } from "../src/services/ConfigService"; +import { IContractsService } from "../src/services/ContractsService"; +import { INetworkService } from "../src/services/NetworkService"; +import { ITransactionsService } from "../src/services/TransactionsService"; +import { Services, TransactionOptions } from "../src/services/types"; +import { Artifact } from "../src/types/hardhat"; +import { HasParamResult } from "../src/types/providers"; +import { IgnitionError } from "../src/utils/errors"; export function getMockServices() { const mockServices: Services = { diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index 58af1eea1c..df178c2ce4 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -4,10 +4,10 @@ import { assert } from "chai"; import { deployStateReducer, initializeDeployState, -} from "deployment/deployStateReducer"; -import { buildModule } from "dsl/buildModule"; -import { DeployState } from "types/deployment"; -import { VertexResultEnum } from "types/graph"; +} from "../../src/deployment/deployStateReducer"; +import { buildModule } from "../../src/dsl/buildModule"; +import { DeployState } from "../../src/types/deployment"; +import { VertexResultEnum } from "../../src/types/graph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; @@ -67,19 +67,19 @@ describe("deployment state reducer", () => { assert.deepStrictEqual(state.execution.vertexes, { "0": { status: "UNSTARTED", - result: null, + result: undefined, }, "1": { status: "UNSTARTED", - result: null, + result: undefined, }, "2": { status: "UNSTARTED", - result: null, + result: undefined, }, "3": { status: "UNSTARTED", - result: null, + result: undefined, }, }); }); @@ -240,7 +240,7 @@ describe("deployment state reducer", () => { assert.equal( Object.values(state.execution.vertexes).every( - (v) => v.status === "COMPLETED" && Boolean(v.result) + (v) => v.status === "COMPLETED" && v.result !== undefined ), true ); @@ -291,7 +291,7 @@ describe("deployment state reducer", () => { assert.deepStrictEqual(state.execution.vertexes[1], { status: "HOLD", - result: null, + result: undefined, }); }); }); diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts index 6e021abfa9..3ea0365c4d 100644 --- a/packages/core/test/state-reducer/preparation-steps.ts +++ b/packages/core/test/state-reducer/preparation-steps.ts @@ -4,10 +4,10 @@ import { assert } from "chai"; import { deployStateReducer, initializeDeployState, -} from "deployment/deployStateReducer"; -import { buildModule } from "dsl/buildModule"; -import { DeployState } from "types/deployment"; -import { IExecutionGraph } from "types/executionGraph"; +} from "../../src/deployment/deployStateReducer"; +import { buildModule } from "../../src/dsl/buildModule"; +import { DeployState } from "../../src/types/deployment"; +import { IExecutionGraph } from "../../src/types/executionGraph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; @@ -123,7 +123,10 @@ describe("deployment state reducer", () => { }); it("should set the execution graph", () => { - assert.isDefined(state.transform.executionGraph); + if (state.transform.executionGraph === null) { + assert.fail(); + } + assert.equal(state.transform.executionGraph.vertexes.size, 1); }); }); diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 4d3f3eb3c8..434acebd5e 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -1,12 +1,11 @@ import { ethers } from "ethers"; -import { deployStateReducer } from "deployment/deployStateReducer"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "process/transformDeploymentGraphToExecutionGraph"; -import { DeployState, DeployStateCommand } from "types/deployment"; -import { Module } from "types/module"; -import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; - +import { deployStateReducer } from "../../src/deployment/deployStateReducer"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "../../src/process/transformDeploymentGraphToExecutionGraph"; +import { DeployState, DeployStateCommand } from "../../src/types/deployment"; +import { Module } from "../../src/types/module"; +import { validateDeploymentGraph } from "../../src/validation/validateDeploymentGraph"; import { getMockServices } from "../helpers"; export function applyActions( diff --git a/packages/core/test/tsconfig.json b/packages/core/test/tsconfig.json deleted file mode 100644 index 310f30464f..0000000000 --- a/packages/core/test/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "references": [{ "path": ".." }], - "compilerOptions": { - "target": "es2021", - "lib": ["es2021"], - "types": ["mocha"], - "baseUrl": "../src", - "noEmit": true, - "paths": {}, - "esModuleInterop": true, - "moduleResolution": "node" - }, - "include": ["."] -} diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index 6488ce382c..b3cd085e2e 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -3,8 +3,8 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import { GasProvider } from "types/providers"; -import { TxSender } from "utils/tx-sender"; +import { GasProvider } from "../src/types/providers"; +import { TxSender } from "../src/utils/tx-sender"; class SignerSpy { private _index = -1; diff --git a/packages/core/test/util/MemoryCommandJournal.ts b/packages/core/test/util/MemoryCommandJournal.ts index 867ea93c89..dfec635ba7 100644 --- a/packages/core/test/util/MemoryCommandJournal.ts +++ b/packages/core/test/util/MemoryCommandJournal.ts @@ -1,5 +1,5 @@ -import { DeployStateExecutionCommand } from "types/deployment"; -import { ICommandJournal } from "types/journal"; +import { DeployStateExecutionCommand } from "../../src/types/deployment"; +import { ICommandJournal } from "../../src/types/journal"; export class MemoryCommandJournal implements ICommandJournal { private entries: string[]; diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index db40800bfb..60dd5b2157 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,19 +1,20 @@ /* eslint-disable import/no-unused-modules */ +import type { IDeploymentBuilder } from "../src/types/deploymentGraph"; + import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import { buildModule } from "dsl/buildModule"; -import { buildSubgraph } from "dsl/buildSubgraph"; -import { generateDeploymentGraphFrom } from "process/generateDeploymentGraphFrom"; -import { Services } from "services/types"; -import type { IDeploymentBuilder } from "types/deploymentGraph"; -import { ArtifactContract } from "types/future"; -import { Artifact } from "types/hardhat"; -import { Module, ModuleDict } from "types/module"; -import { ValidationVisitResult } from "types/validation"; -import { IgnitionValidationError } from "utils/errors"; -import { validateDeploymentGraph } from "validation/validateDeploymentGraph"; +import { buildModule } from "../src/dsl/buildModule"; +import { buildSubgraph } from "../src/dsl/buildSubgraph"; +import { generateDeploymentGraphFrom } from "../src/process/generateDeploymentGraphFrom"; +import { Services } from "../src/services/types"; +import { ArtifactContract } from "../src/types/future"; +import { Artifact } from "../src/types/hardhat"; +import { Module, ModuleDict } from "../src/types/module"; +import { ValidationVisitResult } from "../src/types/validation"; +import { IgnitionValidationError } from "../src/utils/errors"; +import { validateDeploymentGraph } from "../src/validation/validateDeploymentGraph"; import { getMockServices } from "./helpers"; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index a83723e6f0..1002920a8c 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,11 +1,9 @@ { - "extends": "../tsconfig.settings.json", - "references": [], + "extends": "../../config/typescript/tsconfig.json", "compilerOptions": { - "composite": true, "outDir": "dist", - "rootDir": "src", - "baseUrl": "src" + "composite": true, + "incremental": true }, - "include": ["src"] + "references": [] } diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-plugin/.eslintrc.js index b0c279f1a3..4285f9e252 100644 --- a/packages/hardhat-plugin/.eslintrc.js +++ b/packages/hardhat-plugin/.eslintrc.js @@ -1,11 +1,8 @@ -const { resolve } = require("path"); - module.exports = { - extends: [resolve(__dirname, "../../config/eslint/.eslintrc.js")], + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], parserOptions: { project: `${__dirname}/tsconfig.json`, sourceType: "module", - createDefaultProgram: true, }, - ignorePatterns: ["**/assets/bundle.ts", "**/.eslintrc.js", "esbuild.js"], + ignorePatterns: [".eslintrc.js"], }; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f93934e476..f4017051b9 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -18,14 +18,14 @@ "engines": { "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", "scripts": { "build": "tsc --build && node ./esbuild.js", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", - "prettier": "prettier \"**/*.{js,md,json}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", "test:coverage": "nyc mocha \"test/**/*.ts\"", @@ -67,7 +67,7 @@ "purecss": "^2.1.0", "rimraf": "3.0.2", "sinon": "^14.0.0", - "ts-node": "10.8.1", + "ts-node": "10.9.1", "typescript": "^4.7.4" }, "peerDependencies": { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 6680f611f5..8782ccdf77 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,3 +1,5 @@ +import type { Contract } from "ethers"; + import { Ignition, IgnitionDeployOptions, @@ -10,7 +12,6 @@ import { IgnitionError, SerializedDeploymentResult, } from "@ignored/ignition-core"; -import type { Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; @@ -48,16 +49,18 @@ export class IgnitionWrapper { const services = createServices(this._providers); const chainId = await services.network.getChainId(); + const journal = + deployParams?.journal ?? + (deployParams?.journalPath !== undefined + ? new CommandJournal(chainId, deployParams?.journalPath) + : undefined); + const ignition = new Ignition({ services, uiRenderer: showUi ? renderToCli(initializeRenderState(), deployParams?.parameters) : undefined, - journal: deployParams?.journal - ? deployParams?.journal - : deployParams?.journalPath !== undefined - ? new CommandJournal(chainId, deployParams?.journalPath) - : undefined, + journal, }); if (deployParams?.parameters !== undefined) { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 4e18a88859..373c54f0b6 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -22,7 +22,7 @@ export interface IgnitionConfig { eventDuration: number; } -const DISPLAY_UI = !Boolean(process.env.DEBUG); +const DISPLAY_UI = process.env.DEBUG === undefined; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -109,7 +109,7 @@ task("deploy") initial: false, }); - if (!prompt.networkConfirmation) { + if (prompt.networkConfirmation !== true) { console.log("Deploy cancelled"); return; } diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 3ed26c16eb..530d904fde 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -78,7 +78,6 @@ function isInModuleDirectory(modulesDirectory: string, modulePath: string) { ); return ( - Boolean(moduleRelativeToModuleDir) && !moduleRelativeToModuleDir.startsWith("..") && !path.isAbsolute(moduleRelativeToModuleDir) ); diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts index c9edec8d32..fe02d1ebac 100644 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/no-extraneous-dependencies import mermaid from "mermaid"; /* setup mermaid */ diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index b920d2de2c..89624344df 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -1,4 +1,5 @@ import type { IgnitionPlan } from "@ignored/ignition-core"; + import { exec } from "child_process"; import { ethers } from "ethers"; import fs from "fs-extra"; diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 6640af3883..76156ab38a 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -143,20 +143,29 @@ export function getActions(graph: VertexGraph): string { } export function getParams(vertex: VertexDescriptor): string { - if (!vertex?.args || vertex.args.length === 0) { + if (vertex?.args === undefined || vertex.args.length === 0) { return "None"; } const items = vertex.args - .map((a: any) => { - return `
  • ${ - a.defaultValue ?? a._future - ? `Future < ${a.label} > ${ - a.type === "contract" ? "address" : a.type - } parameter` - : a - }
  • `; - }) + .map( + (a: { + defaultValue: string; + _future: boolean; + label: string; + type: string; + toString: () => string; + }) => { + return `
  • ${ + a.defaultValue ?? + (a._future + ? `Future < ${a.label} > ${ + a.type === "contract" ? "address" : a.type + } parameter` + : a.toString()) + }
  • `; + } + ) .join("\n"); return ` diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index eb8ba6b6a0..511a69c405 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -3,7 +3,6 @@ import "hardhat/types/config"; import "hardhat/types/runtime"; import type { IgnitionWrapper } from "./ignition-wrapper"; - import type { IgnitionConfig } from "./index"; declare module "hardhat/types/config" { diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index a4c9bf54e7..23d3ece033 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,7 +1,7 @@ import { DeployState, viewExecutionResults } from "@ignored/ignition-core"; import { Box, Spacer, Text } from "ink"; -import { AddressMap } from "ui/types"; +import { AddressMap } from "../../types"; import { NetworkInfo } from "./NetworkInfo"; @@ -39,7 +39,7 @@ const resolveDeployAddresses = (deployState: DeployState) => { for (const value of viewExecutionResults(deployState).values()) { if ( - value !== null && + value !== undefined && value._kind === "success" && "name" in value.result && "address" in value.result diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index dc23516db4..4ed0c1f40e 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -87,8 +87,6 @@ const StatusBadge = ({ vertex }: { vertex: UiVertex }) => { case "RUNNING": badge = ; break; - default: - return assertNeverVertexStatus(vertex.status); } return ( @@ -150,8 +148,6 @@ function resolveVertexColors(vertex: UiVertex): { borderStyle: "bold", textColor: "white", }; - default: - return assertNeverVertexStatus(vertex.status); } } @@ -213,7 +209,3 @@ const determineStatusOf = ( throw new IgnitionError(`Unable to determine vertex status for ${vertexId}`); }; - -function assertNeverVertexStatus(status: never): any { - throw new IgnitionError(`Unexpected vertex status ${status}`); -} diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 1b93b6852a..66ab7380ec 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -1,4 +1,5 @@ import type { DeployState, ModuleParams } from "@ignored/ignition-core"; + import { Box } from "ink"; import { BatchExecution } from "./BatchExecution"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 1c4639e2e1..3e907d7ea8 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -2,11 +2,10 @@ import { DeployState, ExecutionVertex, viewExecutionResults, - IgnitionError, } from "@ignored/ignition-core"; import { Box, Text } from "ink"; -import { DeploymentError, DeploymentHold } from "ui/types"; +import { DeploymentError, DeploymentHold } from "../../types"; import { AddressResults } from "./AddressResults"; import { Divider } from "./Divider"; @@ -190,15 +189,9 @@ const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { return "Failed awaited event"; case "SentETH": return "Failed to send ETH"; - default: - return assertNeverUiVertexType(vertex); } }; -function assertNeverUiVertexType(vertex: never): string { - throw new IgnitionError(`Unexpected ui vertex type ${vertex}`); -} - const DepError = ({ deploymentError, }: { diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx index 1365d38221..83dc398c4a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx @@ -1,4 +1,5 @@ import type { ModuleParams } from "@ignored/ignition-core"; + import { Text, Newline } from "ink"; export const ModuleParameters = ({ @@ -6,7 +7,7 @@ export const ModuleParameters = ({ }: { moduleParams?: ModuleParams; }) => { - if (!moduleParams) { + if (moduleParams === undefined) { return null; } diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index c431fa69a0..565a2c24fb 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,8 +1,4 @@ -import { - DeployState, - IgnitionError, - ModuleParams, -} from "@ignored/ignition-core"; +import { DeployState, ModuleParams } from "@ignored/ignition-core"; import { ReconciliationFailedPanel } from "./ReconciliationFailedPanel"; import { StartingPanel } from "./StartingPanel"; @@ -17,39 +13,22 @@ export const IgnitionUi = ({ deployState: DeployState; moduleParams?: ModuleParams; }) => { - if ( - deployState.phase === "uninitialized" || - deployState.phase === "validating" - ) { - return ; + switch (deployState.phase) { + case "uninitialized": + case "validating": + return ; + case "validation-failed": + return ; + case "failed-unexpectedly": + return ; + case "reconciliation-failed": + return ; + case "execution": + case "complete": + case "failed": + case "hold": + return ( + + ); } - - if (deployState.phase === "validation-failed") { - return ; - } - - if (deployState.phase === "failed-unexpectedly") { - return ; - } - - if (deployState.phase === "reconciliation-failed") { - return ; - } - - if ( - deployState.phase === "execution" || - deployState.phase === "complete" || - deployState.phase === "failed" || - deployState.phase === "hold" - ) { - return ( - - ); - } - - return assertNeverPhase(deployState.phase); }; - -function assertNeverPhase(deployStatePhase: never): null { - throw new IgnitionError(`Unknown deploy state phase ${deployStatePhase}`); -} diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 1c339f675d..fbad9e874f 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -3,7 +3,6 @@ import { ExecutionVertex, ExecutionVertexType, VertexVisitResultFailure, - IgnitionError, } from "@ignored/ignition-core"; interface VertexSuccess { @@ -183,8 +182,6 @@ export class DeploymentState { return "Failed awaited event"; case "SentETH": return "Failed to send ETH"; - default: - return assertNeverUiVertexType(vertex.type); } } } @@ -192,7 +189,3 @@ export class DeploymentState { export interface AddressMap { [label: string]: string; } - -function assertNeverUiVertexType(type: never): string { - throw new IgnitionError(`Unexpected ui vertex type ${type}`); -} diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index e278f01004..2c55f33f5b 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -72,20 +72,23 @@ export async function assertDeploymentState( for (const [futureId, futureResult] of Object.entries(moduleResult)) { const expectedFutureResult = expectedModule[futureId]; - if (expectedFutureResult.kind === "contract") { - const contract = await assertContract(hre, futureResult); - - await expectedFutureResult.predicate(contract); - } else if (expectedFutureResult.kind === "transaction") { - if (futureResult._kind !== "tx") { - assert.fail( - `Expected future result to be a transaction, but got ${futureResult._kind}` - ); - } - assert.isDefined(futureResult.value.hash); - await assertTxMined(hre, futureResult.value.hash); - } else { - assertNeverFutureResult(expectedFutureResult); + switch (expectedFutureResult.kind) { + case "contract": + const contract = await assertContract(hre, futureResult); + + await expectedFutureResult.predicate(contract); + break; + case "transaction": + if (futureResult._kind !== "tx") { + assert.fail( + `Expected future result to be a transaction, but got ${futureResult._kind}` + ); + } + + assert.isDefined(futureResult.value.hash); + await assertTxMined(hre, futureResult.value.hash); + + break; } } } @@ -216,7 +219,3 @@ export async function deployModule( return result; } - -function assertNeverFutureResult(expectedFutureResult: never) { - throw new Error(`Unexpected future result ${expectedFutureResult}`); -} diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index 9641e95fcb..10ec50d3cd 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -11,14 +11,20 @@ describe("loadModule", function () { it("should return the module given the module name", () => { const module = loadModule("ignition", "TestModule"); - assert.isDefined(module); + if (module === undefined) { + assert.fail("Module was not loaded"); + } + assert.equal(module.name, "testing123"); }); it("should return the module given the module name and extension", () => { const module = loadModule("ignition", "TestModule.js"); - assert.isDefined(module); + if (module === undefined) { + assert.fail("Module was not loaded"); + } + assert.equal(module.name, "testing123"); }); diff --git a/packages/hardhat-plugin/test/tsconfig.json b/packages/hardhat-plugin/test/tsconfig.json deleted file mode 100644 index 310f30464f..0000000000 --- a/packages/hardhat-plugin/test/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "references": [{ "path": ".." }], - "compilerOptions": { - "target": "es2021", - "lib": ["es2021"], - "types": ["mocha"], - "baseUrl": "../src", - "noEmit": true, - "paths": {}, - "esModuleInterop": true, - "moduleResolution": "node" - }, - "include": ["."] -} diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-plugin/tsconfig.json index 9e320a8d23..f3632c8b51 100644 --- a/packages/hardhat-plugin/tsconfig.json +++ b/packages/hardhat-plugin/tsconfig.json @@ -1,14 +1,9 @@ { - "extends": "../tsconfig.settings.json", - "references": [{ "path": "../core" }], + "extends": "../../config/typescript/tsconfig.json", "compilerOptions": { - "composite": true, "outDir": "dist", - "rootDir": "src", - "baseUrl": "src", - "jsx": "react-jsx", - "lib": ["es2021", "DOM", "DOM.Iterable"], - "skipLibCheck": true + "composite": true, + "jsx": "react-jsx" }, - "include": ["src"] + "references": [{ "path": "../core" }] } diff --git a/packages/tsconfig.json b/packages/tsconfig.json deleted file mode 100644 index 06ba4a32fc..0000000000 --- a/packages/tsconfig.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "files": [], - "references": [{ "path": "core" }, { "path": "hardhat-plugin" }] -} diff --git a/packages/tsconfig.settings.json b/packages/tsconfig.settings.json deleted file mode 100644 index 3bfe96ac4d..0000000000 --- a/packages/tsconfig.settings.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "composite": true, - "lib": ["es2021"], - "target": "es2021", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "esModuleInterop": true, - "moduleResolution": "node", - "declaration": true, - "declarationMap": true, - "types": [], - "sourceMap": true - } -} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index eeadf526de..0000000000 --- a/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "composite": true, - "lib": ["es2021"], - "target": "es2021", - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, - "esModuleInterop": true, - "moduleResolution": "node", - "declaration": true - }, - "exclude": ["**/node_modules/**"] -} From aae345e4747b381aa661b019e56b2d6e757e8aee Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 16 Mar 2023 16:54:03 +0000 Subject: [PATCH 0253/1302] fix: support lib vertexes in plan (#169) * fix: support lib vertexes in plan Enforce the vertex types support through the type system. Include the library vertexes as a type of deploy. Change the templating to include the new type strings. Fixes #131. * fix: asset build The tsconfig changes altered the structure of `dist`, but didn't update the esbuild file for the plan assets to refect this. The esbuild file has now been updated. --- packages/core/src/index.ts | 2 +- packages/hardhat-plugin/esbuild.js | 25 +++++--- .../hardhat-plugin/src/plan/assets/bundle.ts | 4 +- .../src/plan/assets/templates/vertex.html | 2 +- packages/hardhat-plugin/src/plan/index.ts | 11 +++- packages/hardhat-plugin/src/plan/utils.ts | 57 +++++++++++++------ 6 files changed, 70 insertions(+), 31 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index fe64e8e1d0..c8959399b8 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -8,7 +8,6 @@ export { IgnitionError, IgnitionValidationError } from "./utils/errors"; export { TransactionsService } from "./services/TransactionsService"; export { ContractsService } from "./services/ContractsService"; export { VertexResultEnum } from "./types/graph"; - export type { SerializedDeploymentResult, ContractInfo, @@ -34,6 +33,7 @@ export type { export type { ExternalParamValue, IDeploymentBuilder, + DeploymentGraphVertex, } from "./types/deploymentGraph"; export type { FutureDict } from "./types/future"; export type { IgnitionPlan } from "./types/plan"; diff --git a/packages/hardhat-plugin/esbuild.js b/packages/hardhat-plugin/esbuild.js index 233c8a66e3..63db0aa736 100644 --- a/packages/hardhat-plugin/esbuild.js +++ b/packages/hardhat-plugin/esbuild.js @@ -2,7 +2,7 @@ const esbuild = require("esbuild"); const fs = require("fs-extra"); const path = require("path"); -const outdir = path.resolve(__dirname, "dist/plan/assets"); +const outdir = path.resolve(__dirname, "dist/src/plan/assets"); const srcdir = path.resolve(__dirname, "src/plan/assets"); const entryPoints = fs.readdirSync(srcdir).flatMap((f) => { @@ -15,12 +15,19 @@ const entryPoints = fs.readdirSync(srcdir).flatMap((f) => { return fs.readdirSync(p).map((v) => `${p}/${v}`); }); -esbuild.build({ - outdir, - entryPoints, - bundle: true, - loader: { - ".html": "copy", - ".png": "copy", - }, +const main = async () => { + await esbuild.build({ + outdir, + entryPoints, + bundle: true, + loader: { + ".html": "copy", + ".png": "copy", + }, + }); +}; + +main().catch((err) => { + console.error(err); + process.exit(1); }); diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts index fe02d1ebac..f4c40b8f7c 100644 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ b/packages/hardhat-plugin/src/plan/assets/bundle.ts @@ -12,7 +12,9 @@ window.onload = () => { const classList = [...vertexElement.classList.values()]; for (const className of classList) { - if (/^(deploy|call|transfer|event)/.test(className)) { + if ( + /^(deploy-contract|deploy-library|call|transfer|event)/.test(className) + ) { const actionElement = document.getElementById(`action-${className}`); const vertexClassString = [...classList, "hovering"].join(" "); diff --git a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html index a4697205ba..c6f36d6a77 100644 --- a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html +++ b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html @@ -6,7 +6,7 @@
    -

    Contract %type% - %label%

    +

    %typeText% - %label%

    diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 89624344df..71c19756f5 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -88,6 +88,7 @@ export class Renderer { for (const vertex of this.plan.deploymentGraph.vertexes.values()) { const type = utils.parseType(vertex); + const typeText = utils.toTypeText(type); const label = vertex.label; const params = utils.getParams(vertex); @@ -103,7 +104,15 @@ export class Renderer { const vertexOutput = this._templates.vertex.replace( regex, - utils.replacer({ type, label, networkName, networkId, params, value }) + utils.replacer({ + type, + typeText, + label, + networkName, + networkId, + params, + value, + }) ); this._writeModuleHTML(vertex.id, vertexOutput); diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index 76156ab38a..b6f37af801 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,30 +1,35 @@ -import { +import type { VertexGraph, VertexDescriptor, - IgnitionError, + DeploymentGraphVertex, } from "@ignored/ignition-core"; -export function parseType(v: VertexDescriptor): string { - let type: string; - switch (v.type) { +type DisplayType = + | "deploy-contract" + | "deploy-library" + | "call" + | "transfer" + | "event"; + +export function parseType(v: VertexDescriptor): DisplayType { + const depVertex = v as DeploymentGraphVertex; + switch (depVertex.type) { case "HardhatContract": case "ArtifactContract": - type = "deploy"; - break; + case "DeployedContract": + return "deploy-contract"; + case "HardhatLibrary": + case "ArtifactLibrary": + return "deploy-library"; case "Call": - type = "call"; - break; + return "call"; case "SendETH": - type = "transfer"; - break; + return "transfer"; case "Event": - type = "event"; - break; - default: - throw new IgnitionError(`Unknown vertex type: ${v.type}`); + return "event"; + case "Virtual": + throw new Error("Virtual vertex unexpected in plan"); } - - return type; } function getVertexes(graph: VertexGraph): VertexDescriptor[] { @@ -119,18 +124,34 @@ export function wrapInMermaidDiv(text: string): string { `; } +export function toTypeText(type: DisplayType) { + switch (type) { + case "deploy-contract": + return "Contract deploy"; + case "deploy-library": + return "Library deploy"; + case "call": + return "Contract call"; + case "transfer": + return "Transfer"; + case "event": + return "Contract event"; + } +} + export function getActions(graph: VertexGraph): string { const vertexes = getVertexes(graph); const items = vertexes.map((v) => { const type = parseType(v); + const typeText = toTypeText(type); return `
  • - Contract ${type} ${v.label} + ${typeText} ${v.label}
  • `; }); From b6eab16b4273eee4140ff0f3ca43a9a6ea3d7d7d Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 21 Mar 2023 15:21:40 +0000 Subject: [PATCH 0254/1302] feat: remove subgraph from the api (#173) The inclusion of subgraphs only serves to confuse (they were intended as a more general version of modules) as we have not needed them in the examples we have encountered so far. Resolves #129. --- examples/ens/ignition/ENS.js | 10 +- packages/core/src/dsl/DeploymentBuilder.ts | 32 ++-- packages/core/src/dsl/buildSubgraph.ts | 14 -- packages/core/src/index.ts | 8 +- ...oymentGraphByEliminatingVirtualVertexes.ts | 2 +- packages/core/src/types/deploymentGraph.ts | 14 +- packages/core/src/types/module.ts | 5 +- .../core/test/deploymentBuilder/parameters.ts | 5 +- .../test/deploymentBuilder/useSubgraph.ts | 168 ------------------ packages/core/test/validation.ts | 5 +- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- packages/hardhat-plugin/src/index.ts | 2 +- packages/hardhat-plugin/test/use-module.ts | 144 +-------------- 13 files changed, 36 insertions(+), 375 deletions(-) delete mode 100644 packages/core/src/dsl/buildSubgraph.ts delete mode 100644 packages/core/test/deploymentBuilder/useSubgraph.ts diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 3d64b731a8..29fb56a96f 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { buildSubgraph, buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; @@ -16,7 +16,7 @@ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; const ZERO_HASH = "0x0000000000000000000000000000000000000000000000000000000000000000"; -const setupResolver = buildSubgraph("RESOLVER", (m) => { +const setupResolver = buildModule("RESOLVER", (m) => { const ens = m.getParam("ENS"); const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); @@ -41,7 +41,7 @@ const setupResolver = buildSubgraph("RESOLVER", (m) => { return { resolver }; }); -const setupReverseRegistrar = buildSubgraph("REVERSEREGISTRAR", (m) => { +const setupReverseRegistrar = buildModule("REVERSEREGISTRAR", (m) => { const ens = m.getParam("ENS"); const resolver = m.getParam("RESOLVER"); const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); @@ -69,14 +69,14 @@ module.exports = buildModule("ENS", (m) => { const ens = m.contract("ENSRegistry"); - const { resolver } = m.useSubgraph(setupResolver, { + const { resolver } = m.useModule(setupResolver, { parameters: { ENS: ens, ACCOUNT: owner, }, }); - const { reverseRegistrar } = m.useSubgraph(setupReverseRegistrar, { + const { reverseRegistrar } = m.useModule(setupReverseRegistrar, { parameters: { ENS: ens, RESOLVER: resolver, diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 57744fb547..28e5789448 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -9,7 +9,6 @@ import type { RequiredParameter, OptionalParameter, ParameterValue, - FutureDict, CallableFuture, Virtual, DependableFuture, @@ -24,7 +23,7 @@ import type { AddressResolvable, } from "../types/future"; import type { Artifact } from "../types/hardhat"; -import type { ModuleCache, ModuleDict, Subgraph } from "../types/module"; +import type { ModuleCache, ModuleDict, Module } from "../types/module"; import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; @@ -38,7 +37,7 @@ import { IDeploymentBuilder, DeploymentBuilderOptions, DeploymentGraphVertex, - UseSubgraphOptions, + UseModuleOptions, ScopeData, AwaitOptions, SendOptions, @@ -111,7 +110,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { private idCounter: number = 0; private moduleCache: ModuleCache = {}; - private useSubgraphInvocationCounter: number = 0; + private useModuleInvocationCounter: number = 0; private scopes: ScopeStack = new ScopeStack(); constructor(options: DeploymentBuilderOptions) { @@ -486,18 +485,9 @@ export class DeploymentBuilder implements IDeploymentBuilder { return bytesFuture; } - public useSubgraph( - subgraph: Subgraph, - options?: UseSubgraphOptions - ): Virtual & T { - const { result, after } = this._useSubscope(subgraph, options); - - return { ...result, ...after }; - } - public useModule( - module: Subgraph, - options?: UseSubgraphOptions + module: Module, + options?: UseModuleOptions ): Virtual & T { const moduleKey = `module:${module.name}`; @@ -832,12 +822,12 @@ export class DeploymentBuilder implements IDeploymentBuilder { return scopeValue; } - private _useSubscope( - subgraphOrModule: Subgraph, - options?: UseSubgraphOptions + private _useSubscope( + module: Module, + options?: UseModuleOptions ) { - const useModuleInvocationId = this.useSubgraphInvocationCounter++; - const label = `${subgraphOrModule.name}:${useModuleInvocationId}`; + const useModuleInvocationId = this.useModuleInvocationCounter++; + const label = `${module.name}:${useModuleInvocationId}`; this.scopes.push(label); const scopeLabel = this.scopes.getScopedLabel(); @@ -854,7 +844,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { this.graph.scopeData[scopeLabel] = scopeData; - const result = subgraphOrModule.action(this); + const result = module.action(this); const addedVertexes = [...this.graph.vertexes.values()] .filter((v) => v.scopeAdded === scopeLabel) diff --git a/packages/core/src/dsl/buildSubgraph.ts b/packages/core/src/dsl/buildSubgraph.ts deleted file mode 100644 index 31c2ca86cd..0000000000 --- a/packages/core/src/dsl/buildSubgraph.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { IDeploymentBuilder } from "../types/deploymentGraph"; -import type { FutureDict } from "../types/future"; - -import { Subgraph } from "../types/module"; - -export function buildSubgraph( - subgraphName: string, - subgraphAction: (m: IDeploymentBuilder) => T -): Subgraph { - return { - name: subgraphName, - action: subgraphAction, - }; -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c8959399b8..5e9e51755a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,5 @@ export { Ignition, IgnitionDeployOptions } from "./Ignition"; export { buildModule } from "./dsl/buildModule"; -export { buildSubgraph } from "./dsl/buildSubgraph"; export { viewExecutionResults } from "./deployment/utils"; export { createServices } from "./services/createServices"; export { serializeReplacer } from "./utils/serialize"; @@ -24,12 +23,7 @@ export type { DeploymentResult, UpdateUiAction, } from "./types/deployment"; -export type { - Module, - ModuleDict, - ModuleParams, - Subgraph, -} from "./types/module"; +export type { Module, ModuleDict, ModuleParams } from "./types/module"; export type { ExternalParamValue, IDeploymentBuilder, diff --git a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts index 3995cb4640..57ecfbe3aa 100644 --- a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -4,7 +4,7 @@ import { DeploymentGraphVertex } from "../../types/deploymentGraph"; /** * Deployment graphs can have virtual vertex that represent the - * execution of all vertex in a module/subgraph. + * execution of all vertexes in a module/subgraph. * * We reduce the graph to remove the virtual nodes, by adding * edges from any dependents to the virtual nodes dependents: diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/types/deploymentGraph.ts index d61d83b31c..cc3b212b6b 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/types/deploymentGraph.ts @@ -7,7 +7,6 @@ import { ContractCall, DeployedContract, DeploymentGraphFuture, - FutureDict, HardhatContract, HardhatLibrary, OptionalParameter, @@ -24,7 +23,7 @@ import { } from "./future"; import { AdjacencyList, VertexDescriptor } from "./graph"; import { Artifact } from "./hardhat"; -import { ModuleDict, Subgraph } from "./module"; +import { ModuleDict, Module } from "./module"; export interface ScopeData { before: Virtual; @@ -175,7 +174,7 @@ export interface SendOptions { from?: string; } -export interface UseSubgraphOptions { +export interface UseModuleOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; after?: DeploymentGraphFuture[]; } @@ -229,14 +228,9 @@ export interface IDeploymentBuilder { getBytesForArtifact(artifactName: string): BytesFuture; - useSubgraph( - subgraph: Subgraph, - options?: UseSubgraphOptions - ): Virtual & T; - useModule( - module: Subgraph, - options?: UseSubgraphOptions + module: Module, + options?: UseModuleOptions ): Virtual & T; } diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index b74190a958..26782de77e 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,7 +1,6 @@ import type { ExternalParamValue, IDeploymentBuilder } from "./deploymentGraph"; import type { ContractFuture, - FutureDict, LibraryFuture, ProxyFuture, Virtual, @@ -17,9 +16,7 @@ export interface ModuleDict { [key: string]: ModuleReturnValue; } -export type Module = Subgraph; - -export interface Subgraph { +export interface Module { name: string; action: (builder: IDeploymentBuilder) => T; } diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 6866b4d332..aaa00ad8b2 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -7,7 +7,6 @@ import type { import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { buildSubgraph } from "../../src/dsl/buildSubgraph"; import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; import { IgnitionError } from "../../src/utils/errors"; import { isCallable } from "../../src/utils/guards"; @@ -16,7 +15,7 @@ describe("deployment builder - parameters", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const librariesSubgraph = buildSubgraph( + const librariesSubmodule = buildModule( "libraries", (m: IDeploymentBuilder) => { const symbol = m.getOptionalParam("tokenSymbol", "TKN"); @@ -30,7 +29,7 @@ describe("deployment builder - parameters", function () { ); const WrapModule = buildModule("Wrap", (m) => { - const { token } = m.useSubgraph(librariesSubgraph, { + const { token } = m.useModule(librariesSubmodule, { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); diff --git a/packages/core/test/deploymentBuilder/useSubgraph.ts b/packages/core/test/deploymentBuilder/useSubgraph.ts deleted file mode 100644 index c3d23a2b15..0000000000 --- a/packages/core/test/deploymentBuilder/useSubgraph.ts +++ /dev/null @@ -1,168 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/dsl/buildModule"; -import { buildSubgraph } from "../../src/dsl/buildSubgraph"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { IgnitionError } from "../../src/utils/errors"; -import { isCallable } from "../../src/utils/guards"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - useSubgraph", () => { - let deploymentGraph: IDeploymentGraph; - const options = { - chainId: 31, - accounts: [], - }; - - describe("use subgraph from within a module", () => { - before(() => { - const BarSubgraph = buildSubgraph( - "BarSubgraph", - (m: IDeploymentBuilder) => { - const bar = m.contract("Bar"); - - return { bar }; - } - ); - - const WrapModule = buildModule("Wrap", (m) => { - const foo = m.contract("Foo"); - - const { bar } = m.useSubgraph(BarSubgraph, { - after: [foo], - }); - - if (!isCallable(bar)) { - throw new IgnitionError("Not callable"); - } - - return { foo, bar }; - }); - - const { graph } = generateDeploymentGraphFrom(WrapModule, options); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should have the Bar node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Bar"); - }); - - it("should show bar depending on the subgraph before node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 1, label: "BarSubgraph:0::before", type: "" }, - ]); - }); - - it("should show the subgraph before node dependent on Foo", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "BarSubgraph:0::before" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); - }); - }); - - describe("depened on a subgraph", () => { - before(() => { - const FooSubgraph = buildSubgraph("BarSubgraph", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const WrapModule = buildModule("Wrap", (m) => { - const fooSubgraph = m.useSubgraph(FooSubgraph); - - const bar = m.contract("Bar", { - after: [fooSubgraph], - }); - - return { foo: fooSubgraph.foo, bar }; - }); - - const { graph } = generateDeploymentGraphFrom(WrapModule, options); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should have the Bar node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Bar"); - }); - - it("should show bar depending on the subgraph after node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 2, label: "BarSubgraph:0::after", type: "" }, - ]); - }); - }); -}); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 60dd5b2157..6242185ff6 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -6,7 +6,6 @@ import { ethers } from "ethers"; import sinon from "sinon"; import { buildModule } from "../src/dsl/buildModule"; -import { buildSubgraph } from "../src/dsl/buildSubgraph"; import { generateDeploymentGraphFrom } from "../src/process/generateDeploymentGraphFrom"; import { Services } from "../src/services/types"; import { ArtifactContract } from "../src/types/future"; @@ -964,14 +963,14 @@ describe("Validation", () => { describe("virtual", () => { it("should validate", async () => { - const subgraph = buildSubgraph("sub", (m) => { + const submodule = buildModule("sub", (m) => { const example = m.contract("Example"); return { example }; }); const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - m.useSubgraph(subgraph); + m.useModule(submodule); return {}; }); diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 3c49474de2..00dce98798 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -20,7 +20,7 @@ export class ConfigWrapper implements ConfigProvider { public async getParam(paramName: string): Promise { if (this.parameters === undefined) { throw new IgnitionError( - `No parameters object provided to deploy options, but module/subgraph requires parameter "${paramName}"` + `No parameters object provided to deploy options, but module requires parameter "${paramName}"` ); } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 373c54f0b6..56ba1fc34a 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -13,7 +13,7 @@ import { loadModule } from "./load-module"; import { Renderer } from "./plan"; import "./type-extensions"; -export { buildSubgraph, buildModule } from "@ignored/ignition-core"; +export { buildModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index d5de81b36d..fa472a6ea4 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,9 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { - buildModule, - buildSubgraph, - IDeploymentBuilder, -} from "@ignored/ignition-core"; +import { buildModule, IDeploymentBuilder } from "@ignored/ignition-core"; import { isCallable } from "@ignored/ignition-core/src/utils/guards"; import { assert } from "chai"; @@ -18,7 +14,7 @@ describe("useModule", function () { await this.hre.run("compile", { quiet: true }); const thirdPartyModule = buildModule( - "ThirdPartySubgraph", + "ThirdPartySubmodule", (m: IDeploymentBuilder) => { const foo = m.contract("Foo"); @@ -57,24 +53,24 @@ describe("useModule", function () { }); }); - describe("passing futures into subgraphs", () => { - it("using useSubgraph", async function () { + describe("passing futures into submodules", () => { + it("using useModule", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartySubgraph = buildSubgraph("ThirdPartySubgraph", (m) => { + const thirdPartySubmodule = buildModule("ThirdPartySubmodule", (m) => { const foo = m.getParam("Foo"); m.call(foo, "inc", { args: [], }); - return { foo }; + return {}; }); const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { const foo = m.contract("Foo"); - m.useSubgraph(thirdPartySubgraph, { + m.useModule(thirdPartySubmodule, { parameters: { Foo: foo, }, @@ -100,132 +96,6 @@ describe("useModule", function () { }); }); - describe("passing futures into and out of subgraphs", () => { - it("should allow ordering using returned futures", async function () { - await this.hre.run("compile", { quiet: true }); - - const addSecondAndThirdEntrySubgraph = buildSubgraph( - "ThirdPartySubgraph", - (m: IDeploymentBuilder) => { - const trace = m.getParam("Trace"); - - const secondCall = m.call(trace, "addEntry", { - args: ["second"], - }); - - const thirdCall = m.call(trace, "addEntry", { - args: ["third"], - after: [secondCall], - }); - - return { thirdCall }; - } - ); - - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); - - const { thirdCall } = m.useSubgraph(addSecondAndThirdEntrySubgraph, { - parameters: { - Trace: trace, - }, - }); - - m.call(trace, "addEntry", { - args: ["fourth"], - after: [thirdCall], - }); - - return { trace }; - }); - - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); - - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); - const entry4 = await result.trace.entries(3); - - assert.deepStrictEqual( - [entry1, entry2, entry3, entry4], - ["first", "second", "third", "fourth"] - ); - }); - - it("should allow ordering based on the module overall", async function () { - await this.hre.run("compile", { quiet: true }); - - const addSecondAndThirdEntrySubgraph = buildSubgraph( - "ThirdPartySubgraph", - (m: IDeploymentBuilder) => { - const trace = m.getParam("Trace"); - - const secondCall = m.call(trace, "addEntry", { - args: ["second"], - }); - - m.call(trace, "addEntry", { - args: ["third"], - after: [secondCall], - }); - - return {}; - } - ); - - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); - - const subgraph = m.useSubgraph(addSecondAndThirdEntrySubgraph, { - parameters: { - Trace: trace, - }, - }); - - m.call(trace, "addEntry", { - args: ["fourth"], - after: [subgraph], - }); - - return { trace }; - }); - - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); - - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); - const entry4 = await result.trace.entries(3); - - assert.deepStrictEqual( - [entry1, entry2, entry3, entry4], - ["first", "second", "third", "fourth"] - ); - }); - }); - describe("modules depending on modules", () => { it("should allow ordering using returned futures", async function () { await this.hre.run("compile", { quiet: true }); From 48716f1cc3d28a5bd49a1ab5491fe00f136ec012 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 21 Mar 2023 15:22:35 +0000 Subject: [PATCH 0255/1302] refactor: rationalise types locations (#175) * refactor: move params function within the class * refactor: move deployment options under types * refactor: move service types under types * refactor: remove unneeded export of type --- packages/core/src/Ignition.ts | 19 ++---- packages/core/src/deployment/Deployment.ts | 2 +- packages/core/src/dsl/DeploymentBuilder.ts | 54 ++++++++------- .../dispatch/executeDeployedContract.ts | 2 +- packages/core/src/execution/execute.ts | 2 +- packages/core/src/index.ts | 11 ++- ...onvertDeploymentVertexToExecutionVertex.ts | 2 +- ...ransformDeploymentGraphToExecutionGraph.ts | 2 +- packages/core/src/services/AccountsService.ts | 6 +- .../core/src/services/ArtifactsService.ts | 9 +-- packages/core/src/services/ConfigService.ts | 10 +-- .../core/src/services/ContractsService.ts | 20 ++---- packages/core/src/services/NetworkService.ts | 5 +- .../core/src/services/TransactionsService.ts | 13 +--- packages/core/src/services/createServices.ts | 2 +- packages/core/src/services/types.ts | 26 ------- packages/core/src/types/deployment.ts | 12 +++- packages/core/src/types/services.ts | 68 +++++++++++++++++++ packages/core/src/types/validation.ts | 3 +- .../core/src/utils/collectLibrariesAndLink.ts | 2 +- .../core/src/validation/dispatch/helpers.ts | 2 +- .../src/validation/validateDeploymentGraph.ts | 2 +- packages/core/test/contractsService.ts | 6 +- packages/core/test/execution/dispatch.ts | 2 +- packages/core/test/helpers.ts | 17 +++-- packages/core/test/validation.ts | 2 +- 26 files changed, 158 insertions(+), 143 deletions(-) delete mode 100644 packages/core/src/services/types.ts create mode 100644 packages/core/src/types/services.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 410da22518..00d3628c05 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,4 +1,8 @@ -import type { DeploymentResult, UpdateUiAction } from "./types/deployment"; +import type { + DeploymentResult, + IgnitionDeployOptions, + UpdateUiAction, +} from "./types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVisitResult, @@ -12,7 +16,6 @@ import type { } from "./types/serialization"; import setupDebug from "debug"; -import { BigNumber } from "ethers"; import { Deployment } from "./deployment/Deployment"; import { execute } from "./execution/execute"; @@ -21,23 +24,13 @@ import { hashExecutionGraph } from "./execution/utils"; import { NoopCommandJournal } from "./journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; -import { Services } from "./services/types"; +import { Services } from "./types/services"; import { IgnitionError } from "./utils/errors"; import { resolveProxyValue } from "./utils/proxy"; import { validateDeploymentGraph } from "./validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); -export interface IgnitionDeployOptions { - txPollingInterval: number; - networkName: string; - maxRetries: number; - gasPriceIncrementPerRetry: BigNumber | null; - pollingInterval: number; - eventDuration: number; - force: boolean; -} - export class Ignition { private _services: Services; private _uiRenderer: UpdateUiAction; diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/deployment/Deployment.ts index 3c74417132..9f1bfe94fb 100644 --- a/packages/core/src/deployment/Deployment.ts +++ b/packages/core/src/deployment/Deployment.ts @@ -1,4 +1,3 @@ -import type { Services } from "../services/types"; import type { DeployState, UpdateUiAction, @@ -12,6 +11,7 @@ import type { VertexVisitResultFailure, } from "../types/graph"; import type { ICommandJournal } from "../types/journal"; +import type { Services } from "../types/services"; import setupDebug from "debug"; diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 28e5789448..9bfe5c5176 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -77,31 +77,6 @@ type DeploymentApiPublicFunctions = const DEFAULT_VALUE = ethers.utils.parseUnits("0"); -function parseEventParams( - abi: Array<{ type: string; name: string; inputs: any[] }>, - event: EventFuture -): EventParams { - const [_, eventName] = event.label.split("/"); - - const abiEvent = abi.find((v) => v.type === "event" && v.name === eventName); - - if (abiEvent === undefined) { - return {}; - } - - return abiEvent.inputs.reduce((acc, { name, type }) => { - acc[name] = { - vertexId: event.vertexId, - label: name, - type: "eventParam", - subtype: type, - _future: true, - }; - - return acc; - }, {}); -} - export class DeploymentBuilder implements IDeploymentBuilder { public chainId: number; public accounts: string[]; @@ -377,7 +352,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { address = artifactFuture.address; } - eventFuture.params = parseEventParams(abi, eventFuture); + eventFuture.params = this._parseEventParams(abi, eventFuture); DeploymentBuilder._addVertex(this.graph, this.callPoints, this.event, { id: eventFuture.vertexId, @@ -876,4 +851,31 @@ export class DeploymentBuilder implements IDeploymentBuilder { return { before: beforeVirtualVertex, result, after: afterVirtualVertex }; } + + private _parseEventParams( + abi: Array<{ type: string; name: string; inputs: any[] }>, + event: EventFuture + ): EventParams { + const [_, eventName] = event.label.split("/"); + + const abiEvent = abi.find( + (v) => v.type === "event" && v.name === eventName + ); + + if (abiEvent === undefined) { + return {}; + } + + return abiEvent.inputs.reduce((acc, { name, type }) => { + acc[name] = { + vertexId: event.vertexId, + label: name, + type: "eventParam", + subtype: type, + _future: true, + }; + + return acc; + }, {}); + } } diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/execution/dispatch/executeDeployedContract.ts index fa4292eb2e..89822286b4 100644 --- a/packages/core/src/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/execution/dispatch/executeDeployedContract.ts @@ -1,9 +1,9 @@ -import type { Services } from "../../services/types"; import type { DeployedContract, ExecutionResultsAccumulator, ExecutionVertexVisitResult, } from "../../types/executionGraph"; +import type { Services } from "../../types/services"; import { VertexResultEnum } from "../../types/graph"; diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/execution/execute.ts index 186ea25d37..3b723fc8ed 100644 --- a/packages/core/src/execution/execute.ts +++ b/packages/core/src/execution/execute.ts @@ -1,5 +1,4 @@ import type { Deployment } from "../deployment/Deployment"; -import type { Services } from "../services/types"; import type { ExecutionOptions, ExecutionState } from "../types/deployment"; import type { ExecutionVertexDispatcher } from "../types/execution"; import type { @@ -8,6 +7,7 @@ import type { ExecutionVisitResult, ExecutionVertex, } from "../types/executionGraph"; +import type { Services } from "../types/services"; import { viewExecutionResults } from "../deployment/utils"; import { IgnitionError } from "../utils/errors"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 5e9e51755a..e13e916ef6 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,4 +1,4 @@ -export { Ignition, IgnitionDeployOptions } from "./Ignition"; +export { Ignition } from "./Ignition"; export { buildModule } from "./dsl/buildModule"; export { viewExecutionResults } from "./deployment/utils"; export { createServices } from "./services/createServices"; @@ -7,11 +7,9 @@ export { IgnitionError, IgnitionValidationError } from "./utils/errors"; export { TransactionsService } from "./services/TransactionsService"; export { ContractsService } from "./services/ContractsService"; export { VertexResultEnum } from "./types/graph"; -export type { - SerializedDeploymentResult, - ContractInfo, -} from "./types/serialization"; -export type { Services } from "./services/types"; +export type { Services } from "./types/services"; + +export type { SerializedDeploymentResult } from "./types/serialization"; export type { Providers, ConfigProvider, @@ -22,6 +20,7 @@ export type { DeployPhase, DeploymentResult, UpdateUiAction, + IgnitionDeployOptions, } from "./types/deployment"; export type { Module, ModuleDict, ModuleParams } from "./types/module"; export type { diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts index 96cccdd23a..91e3f94f7e 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,6 +1,5 @@ import { BigNumber, ethers } from "ethers"; -import { Services } from "../../services/types"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, @@ -29,6 +28,7 @@ import { EventParamFuture, } from "../../types/future"; import { Artifact } from "../../types/hardhat"; +import { Services } from "../../types/services"; import { IgnitionError } from "../../utils/errors"; import { isBytesArg, isFuture } from "../../utils/guards"; diff --git a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts index 9e93424860..e2df920180 100644 --- a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts +++ b/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts @@ -1,12 +1,12 @@ import { ExecutionGraph } from "../execution/ExecutionGraph"; import { clone } from "../graph/adjacencyList"; -import { Services } from "../services/types"; import { IDeploymentGraph, DeploymentGraphVertex, } from "../types/deploymentGraph"; import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; import { TransformResult } from "../types/process"; +import { Services } from "../types/services"; import { convertDeploymentVertexToExecutionVertex as convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; import { reduceDeploymentGraphByEliminatingVirtualVertexes } from "./transform/reduceDeploymentGraphByEliminatingVirtualVertexes"; diff --git a/packages/core/src/services/AccountsService.ts b/packages/core/src/services/AccountsService.ts index d6a38d8b90..6a20e8005c 100644 --- a/packages/core/src/services/AccountsService.ts +++ b/packages/core/src/services/AccountsService.ts @@ -1,11 +1,7 @@ import type { Providers } from "../types/providers"; +import type { IAccountsService } from "../types/services"; import type { ethers } from "ethers"; -export interface IAccountsService { - getAccounts(): Promise; - getSigner(address: string): Promise; -} - export class AccountsService implements IAccountsService { private _accounts: string[] = []; private _signers: { [address: string]: ethers.Signer } = {}; diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/services/ArtifactsService.ts index b11b47f48f..fb5b768d9d 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/services/ArtifactsService.ts @@ -1,10 +1,7 @@ -import { Artifact } from "../types/hardhat"; -import { Providers } from "../types/providers"; +import type { Artifact } from "../types/hardhat"; +import type { Providers } from "../types/providers"; -export interface IArtifactsService { - getArtifact(name: string): Promise; - hasArtifact(name: string): Promise; -} +import { IArtifactsService } from "../types/services"; export class ArtifactsService implements IArtifactsService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/services/ConfigService.ts index b6b35911b3..57171415e8 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/services/ConfigService.ts @@ -1,11 +1,7 @@ -import { ExternalParamValue } from "../types/deploymentGraph"; -import { HasParamResult, Providers } from "../types/providers"; +import type { ExternalParamValue } from "../types/deploymentGraph"; +import type { HasParamResult, Providers } from "../types/providers"; -export interface IConfigService { - getParam(paramName: string): Promise; - - hasParam(paramName: string): Promise; -} +import { IConfigService } from "../types/services"; export class ConfigService implements IConfigService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/services/ContractsService.ts index 8f65ef6a97..bdc6fefa16 100644 --- a/packages/core/src/services/ContractsService.ts +++ b/packages/core/src/services/ContractsService.ts @@ -1,26 +1,16 @@ -import type { TransactionOptions } from "./types"; +import type { + ContractsServiceProviders, + IContractsService, + TransactionOptions, +} from "../types/services"; import setupDebug from "debug"; import { ethers } from "ethers"; -import { GasProvider, TransactionsProvider } from "../types/providers"; import { IgnitionError } from "../utils/errors"; import { sleep } from "../utils/sleep"; import { TxSender } from "../utils/tx-sender"; -export interface IContractsService { - sendTx( - deployTransaction: ethers.providers.TransactionRequest, - txOptions?: TransactionOptions - ): Promise; -} - -export interface ContractsServiceProviders { - web3Provider: ethers.providers.Web3Provider; - transactionsProvider: TransactionsProvider; - gasProvider: GasProvider; -} - export class ContractsService implements IContractsService { private _debug = setupDebug("ignition:services:contracts-service"); diff --git a/packages/core/src/services/NetworkService.ts b/packages/core/src/services/NetworkService.ts index 09796919d0..9c9488b3b8 100644 --- a/packages/core/src/services/NetworkService.ts +++ b/packages/core/src/services/NetworkService.ts @@ -1,8 +1,5 @@ import { Providers } from "../types/providers"; - -export interface INetworkService { - getChainId(): Promise; -} +import { INetworkService } from "../types/services"; export class NetworkService implements INetworkService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/services/TransactionsService.ts index c8e21b9855..ec1e442ae5 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/services/TransactionsService.ts @@ -1,14 +1,7 @@ -import { ethers } from "ethers"; - -import { Providers } from "../types/providers"; +import type { Providers } from "../types/providers"; +import type { ITransactionsService } from "../types/services"; -export interface ITransactionsService { - wait(txHash: string): Promise; - waitForEvent( - filter: ethers.EventFilter, - durationMs: number - ): Promise; -} +import { ethers } from "ethers"; export class TransactionsService implements ITransactionsService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/services/createServices.ts index f1cf481a1e..b549354e49 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/services/createServices.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import { Providers } from "../types/providers"; +import { Services } from "../types/services"; import { TxSender } from "../utils/tx-sender"; import { AccountsService } from "./AccountsService"; @@ -9,7 +10,6 @@ import { ConfigService } from "./ConfigService"; import { ContractsService } from "./ContractsService"; import { NetworkService } from "./NetworkService"; import { TransactionsService } from "./TransactionsService"; -import { Services } from "./types"; export function createServices(providers: Providers): Services { const txSender = new TxSender(providers.gasProvider); diff --git a/packages/core/src/services/types.ts b/packages/core/src/services/types.ts deleted file mode 100644 index 2042435faa..0000000000 --- a/packages/core/src/services/types.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ethers } from "ethers"; - -import { IAccountsService } from "./AccountsService"; -import { IArtifactsService } from "./ArtifactsService"; -import { IConfigService } from "./ConfigService"; -import { IContractsService } from "./ContractsService"; -import { INetworkService } from "./NetworkService"; -import { ITransactionsService } from "./TransactionsService"; - -export interface TransactionOptions { - gasLimit?: ethers.BigNumberish; - gasPrice?: ethers.BigNumberish; - maxRetries: number; - gasPriceIncrementPerRetry: ethers.BigNumber | null; - pollingInterval: number; - signer: ethers.Signer; -} - -export interface Services { - network: INetworkService; - contracts: IContractsService; - artifacts: IArtifactsService; - transactions: ITransactionsService; - config: IConfigService; - accounts: IAccountsService; -} diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/types/deployment.ts index 64ae0ec1cf..56ae996f5b 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/types/deployment.ts @@ -1,4 +1,3 @@ -import type { Services } from "../services/types"; import type { ExecutionVertex, ExecutionVertexVisitResult, @@ -12,11 +11,22 @@ import type { } from "./graph"; import type { ModuleDict, ModuleParams } from "./module"; import type { SerializedDeploymentResult } from "./serialization"; +import type { Services } from "./services"; import type { BigNumber } from "ethers"; export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; +export interface IgnitionDeployOptions { + txPollingInterval: number; + networkName: string; + maxRetries: number; + gasPriceIncrementPerRetry: BigNumber | null; + pollingInterval: number; + eventDuration: number; + force: boolean; +} + export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } | { _kind: "hold"; holds: VertexDescriptor[] } diff --git a/packages/core/src/types/services.ts b/packages/core/src/types/services.ts new file mode 100644 index 0000000000..a1e3881ba3 --- /dev/null +++ b/packages/core/src/types/services.ts @@ -0,0 +1,68 @@ +import type { ExternalParamValue } from "./deploymentGraph"; +import type { Artifact } from "./hardhat"; +import type { + GasProvider, + HasParamResult, + TransactionsProvider, +} from "./providers"; + +import { ethers } from "ethers"; + +export interface IAccountsService { + getAccounts(): Promise; + getSigner(address: string): Promise; +} + +export interface IArtifactsService { + getArtifact(name: string): Promise; + hasArtifact(name: string): Promise; +} + +export interface IConfigService { + getParam(paramName: string): Promise; + + hasParam(paramName: string): Promise; +} + +export interface IContractsService { + sendTx( + deployTransaction: ethers.providers.TransactionRequest, + txOptions?: TransactionOptions + ): Promise; +} + +export interface INetworkService { + getChainId(): Promise; +} + +export interface ITransactionsService { + wait(txHash: string): Promise; + waitForEvent( + filter: ethers.EventFilter, + durationMs: number + ): Promise; +} + +export interface TransactionOptions { + gasLimit?: ethers.BigNumberish; + gasPrice?: ethers.BigNumberish; + maxRetries: number; + gasPriceIncrementPerRetry: ethers.BigNumber | null; + pollingInterval: number; + signer: ethers.Signer; +} + +export interface ContractsServiceProviders { + web3Provider: ethers.providers.Web3Provider; + transactionsProvider: TransactionsProvider; + gasProvider: GasProvider; +} + +export interface Services { + network: INetworkService; + contracts: IContractsService; + artifacts: IArtifactsService; + transactions: ITransactionsService; + config: IConfigService; + accounts: IAccountsService; +} diff --git a/packages/core/src/types/validation.ts b/packages/core/src/types/validation.ts index 8ea965c205..8eef0574fd 100644 --- a/packages/core/src/types/validation.ts +++ b/packages/core/src/types/validation.ts @@ -1,7 +1,6 @@ -import { Services } from "../services/types"; - import { CallPoints } from "./deploymentGraph"; import { ResultsAccumulator, VertexVisitResult, VisitResult } from "./graph"; +import { Services } from "./services"; export type ValidationVisitResult = VisitResult; diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/utils/collectLibrariesAndLink.ts index c955fda47a..c6716a964a 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/utils/collectLibrariesAndLink.ts @@ -8,7 +8,7 @@ interface Link { address: string; } -export interface Libraries { +interface Libraries { [libraryName: string]: string; } diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/validation/dispatch/helpers.ts index 5cf41fd281..89b12005a4 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/validation/dispatch/helpers.ts @@ -1,5 +1,5 @@ -import type { Services } from "../../services/types"; import type { CallableFuture } from "../../types/future"; +import type { Services } from "../../types/services"; import { CallPoints, diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/validation/validateDeploymentGraph.ts index a579a44c6d..70b8053ea8 100644 --- a/packages/core/src/validation/validateDeploymentGraph.ts +++ b/packages/core/src/validation/validateDeploymentGraph.ts @@ -1,7 +1,7 @@ import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; -import { Services } from "../services/types"; import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; +import { Services } from "../types/services"; import { ValidationVisitResult } from "../types/validation"; import { IgnitionError } from "../utils/errors"; diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index e5cf573176..db7796661c 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -1,13 +1,11 @@ /* eslint-disable import/no-unused-modules */ +import type { ContractsServiceProviders } from "../src/types/services"; import type { TxSender } from "../src/utils/tx-sender"; import { assert } from "chai"; import { ethers } from "ethers"; -import { - ContractsService, - ContractsServiceProviders, -} from "../src/services/ContractsService"; +import { ContractsService } from "../src/services/ContractsService"; const txSender: TxSender = { async send(..._) { diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 18d3080c00..12a20d50a7 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -6,11 +6,11 @@ import sinon from "sinon"; import { Deployment } from "../../src/deployment/Deployment"; import { ExecutionGraph } from "../../src/execution/ExecutionGraph"; import { execute } from "../../src/execution/execute"; -import { Services, TransactionOptions } from "../../src/services/types"; import { ExecutionVertex } from "../../src/types/executionGraph"; import { VertexResultEnum } from "../../src/types/graph"; import { Artifact } from "../../src/types/hardhat"; import { ICommandJournal } from "../../src/types/journal"; +import { Services, TransactionOptions } from "../../src/types/services"; import { buildAdjacencyListFrom } from "../graph/helpers"; import { getMockServices } from "../helpers"; diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 4377d0bf9a..0328d61873 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,14 +1,17 @@ import { ethers } from "ethers"; -import { IAccountsService } from "../src/services/AccountsService"; -import { IArtifactsService } from "../src/services/ArtifactsService"; -import { IConfigService } from "../src/services/ConfigService"; -import { IContractsService } from "../src/services/ContractsService"; -import { INetworkService } from "../src/services/NetworkService"; -import { ITransactionsService } from "../src/services/TransactionsService"; -import { Services, TransactionOptions } from "../src/services/types"; import { Artifact } from "../src/types/hardhat"; import { HasParamResult } from "../src/types/providers"; +import { + Services, + TransactionOptions, + ITransactionsService, + INetworkService, + IContractsService, + IConfigService, + IArtifactsService, + IAccountsService, +} from "../src/types/services"; import { IgnitionError } from "../src/utils/errors"; export function getMockServices() { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 6242185ff6..f8b27e6d92 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -7,10 +7,10 @@ import sinon from "sinon"; import { buildModule } from "../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../src/process/generateDeploymentGraphFrom"; -import { Services } from "../src/services/types"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; +import { Services } from "../src/types/services"; import { ValidationVisitResult } from "../src/types/validation"; import { IgnitionValidationError } from "../src/utils/errors"; import { validateDeploymentGraph } from "../src/validation/validateDeploymentGraph"; From 70882dc1c3a21136a230d66deccb4c2e4cc0b3d5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 21 Mar 2023 16:01:06 +0000 Subject: [PATCH 0256/1302] refactor: limit exports from npm package (#174) Block third party importing of files nested deeply in the package using package.json exports on core. Only imports of @ignored/ignition-core and @ignored/ignition-core/helpers are allowed. Any other import will lead to a runtime error in node. To support an core/helpers division we have split the existing index.ts file into two, with helper functions used mainly in hardhat-ignition moved out to helpers.ts. These functions can then be examined later to see if they justify their place. Some cleanup has also been done to remove obviously unused exports. --- packages/core/package.json | 15 +- packages/core/src/helpers.ts | 7 + packages/core/src/index.ts | 9 -- packages/hardhat-plugin/src/CommandJournal.ts | 2 +- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 3 +- packages/hardhat-plugin/src/load-module.ts | 3 +- .../ui/components/ValidationFailedPanel.tsx | 3 +- .../components/execution/AddressResults.tsx | 3 +- .../components/execution/BatchExecution.tsx | 3 +- .../ui/components/execution/FinalStatus.tsx | 7 +- .../hardhat-plugin/src/ui/renderToCli.tsx | 2 +- .../hardhat-plugin/test/CommandJournal.ts | 6 +- packages/hardhat-plugin/test/config.ts | 5 +- packages/hardhat-plugin/test/helpers.ts | 132 +----------------- packages/hardhat-plugin/test/use-module.ts | 5 - 16 files changed, 41 insertions(+), 166 deletions(-) create mode 100644 packages/core/src/helpers.ts diff --git a/packages/core/package.json b/packages/core/package.json index 3e02920bc1..9efee17140 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -18,8 +18,19 @@ "engines": { "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, - "main": "dist/src/index.js", - "types": "dist/src/index.d.ts", + "main": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "exports": { + ".": "./dist/src/index.js", + "./helpers": "./dist/src/helpers.js" + }, + "typesVersions": { + "*": { + "helpers": [ + "./dist/src/helpers" + ] + } + }, "scripts": { "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts new file mode 100644 index 0000000000..d61a2d6a43 --- /dev/null +++ b/packages/core/src/helpers.ts @@ -0,0 +1,7 @@ +export { viewExecutionResults } from "./deployment/utils"; +export { createServices } from "./services/createServices"; +export { serializeReplacer } from "./utils/serialize"; +export { IgnitionError, IgnitionValidationError } from "./utils/errors"; +export { TransactionsService } from "./services/TransactionsService"; +export { ContractsService } from "./services/ContractsService"; +export { VertexResultEnum } from "./types/graph"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e13e916ef6..6ffdfd10ed 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,13 +1,5 @@ export { Ignition } from "./Ignition"; export { buildModule } from "./dsl/buildModule"; -export { viewExecutionResults } from "./deployment/utils"; -export { createServices } from "./services/createServices"; -export { serializeReplacer } from "./utils/serialize"; -export { IgnitionError, IgnitionValidationError } from "./utils/errors"; -export { TransactionsService } from "./services/TransactionsService"; -export { ContractsService } from "./services/ContractsService"; -export { VertexResultEnum } from "./types/graph"; -export type { Services } from "./types/services"; export type { SerializedDeploymentResult } from "./types/serialization"; export type { @@ -28,7 +20,6 @@ export type { IDeploymentBuilder, DeploymentGraphVertex, } from "./types/deploymentGraph"; -export type { FutureDict } from "./types/future"; export type { IgnitionPlan } from "./types/plan"; export type { VertexGraph, diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts index 3b9ecbbc7c..831a404ec8 100644 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -1,8 +1,8 @@ import { DeployStateExecutionCommand, ICommandJournal, - serializeReplacer, } from "@ignored/ignition-core"; +import { serializeReplacer } from "@ignored/ignition-core/helpers"; import { BigNumber } from "ethers"; import fs from "fs"; import ndjson from "ndjson"; diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 00dce98798..90f668c0fd 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -3,8 +3,8 @@ import { ExternalParamValue, HasParamResult, ModuleParams, - IgnitionError, } from "@ignored/ignition-core"; +import { IgnitionError } from "@ignored/ignition-core/helpers"; export class ConfigWrapper implements ConfigProvider { public parameters: ModuleParams | undefined; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 8782ccdf77..e297314645 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -7,11 +7,10 @@ import { Module, ModuleDict, ModuleParams, - createServices, ICommandJournal, - IgnitionError, SerializedDeploymentResult, } from "@ignored/ignition-core"; +import { IgnitionError, createServices } from "@ignored/ignition-core/helpers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 530d904fde..ab28e5068a 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,4 +1,5 @@ -import { IgnitionError, Module, ModuleDict } from "@ignored/ignition-core"; +import { Module, ModuleDict } from "@ignored/ignition-core"; +import { IgnitionError } from "@ignored/ignition-core/helpers"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index b73421249c..e1cf8c8c43 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -1,4 +1,5 @@ -import { DeployState, IgnitionValidationError } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; +import { IgnitionValidationError } from "@ignored/ignition-core/helpers"; import { Box, Text } from "ink"; import { relative } from "path"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 23d3ece033..7115f3ef0d 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,4 +1,5 @@ -import { DeployState, viewExecutionResults } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; +import { viewExecutionResults } from "@ignored/ignition-core/helpers"; import { Box, Spacer, Text } from "ink"; import { AddressMap } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index 4ed0c1f40e..fbc5ff36f5 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -1,4 +1,5 @@ -import { DeployState, IgnitionError } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core"; +import { IgnitionError } from "@ignored/ignition-core/helpers"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 3e907d7ea8..1353568246 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,8 +1,5 @@ -import { - DeployState, - ExecutionVertex, - viewExecutionResults, -} from "@ignored/ignition-core"; +import { DeployState, ExecutionVertex } from "@ignored/ignition-core"; +import { viewExecutionResults } from "@ignored/ignition-core/helpers"; import { Box, Text } from "ink"; import { DeploymentError, DeploymentHold } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index bbd35caf5a..4626cacc23 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -2,8 +2,8 @@ import { DeployState, ModuleParams, UpdateUiAction, - IgnitionError, } from "@ignored/ignition-core"; +import { IgnitionError } from "@ignored/ignition-core/helpers"; import { render } from "ink"; import { IgnitionUi } from "./components"; diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 6528d4b9e1..7cbab24e56 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -1,8 +1,6 @@ /* eslint-disable import/no-unused-modules */ -import { - DeployStateExecutionCommand, - VertexResultEnum, -} from "@ignored/ignition-core"; +import { DeployStateExecutionCommand } from "@ignored/ignition-core"; +import { VertexResultEnum } from "@ignored/ignition-core/helpers"; import { assert } from "chai"; import { BigNumber } from "ethers"; import fs from "fs"; diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 1661ba7a0b..92adbee1f0 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,5 +1,8 @@ /* eslint-disable import/no-unused-modules */ -import { ContractsService, TransactionsService } from "@ignored/ignition-core"; +import { + ContractsService, + TransactionsService, +} from "@ignored/ignition-core/helpers"; import { assert } from "chai"; import { BigNumber } from "ethers"; import sinon from "sinon"; diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 2c55f33f5b..f09cb9c0f8 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,12 +1,5 @@ -import { - SerializedDeploymentResult, - DeploymentResult, - Module, - buildModule, - IDeploymentBuilder, -} from "@ignored/ignition-core"; +import { buildModule, IDeploymentBuilder } from "@ignored/ignition-core"; import { ModuleDict } from "@ignored/ignition-core/src/types/module"; -import { assert } from "chai"; export const resultAssertions = { contract: (predicate?: ContractResultPredicate): ExpectedFutureResult => { @@ -31,112 +24,6 @@ type ExpectedFutureResult = | { kind: "transaction"; }; -type ExpectedModuleResult = Record; -type ExpectedDeploymentState = Record; - -/** - * Check that the given deployment result matches some conditions. - * - * `expectedResult` is an object with expected modules results, which have - * expected futures results. These futures results assert that that the - * result of each future is of the correct type, and it can also run - * some custom predicate logic on the result to further verify it. - */ -export async function assertDeploymentState( - hre: any, - result: SerializedDeploymentResult, - expectedResult: ExpectedDeploymentState -) { - const modulesResults = Object.entries(result); - const expectedModules = Object.entries(expectedResult); - - assert.equal( - modulesResults.length, - expectedModules.length, - "Expected result and actual result have a different number of modules" - ); - - for (const [moduleId, moduleResult] of modulesResults) { - const expectedModule = expectedResult[moduleId]; - - assert.isDefined( - expectedModule, - `Module ${moduleId} is not part of the expected result` - ); - - assert.equal( - Object.entries(moduleResult).length, - Object.entries(expectedModule).length - ); - - for (const [futureId, futureResult] of Object.entries(moduleResult)) { - const expectedFutureResult = expectedModule[futureId]; - - switch (expectedFutureResult.kind) { - case "contract": - const contract = await assertContract(hre, futureResult); - - await expectedFutureResult.predicate(contract); - break; - case "transaction": - if (futureResult._kind !== "tx") { - assert.fail( - `Expected future result to be a transaction, but got ${futureResult._kind}` - ); - } - - assert.isDefined(futureResult.value.hash); - await assertTxMined(hre, futureResult.value.hash); - - break; - } - } - } -} - -async function assertHasCode(hre: any, address: string) { - const code = await hre.network.provider.send("eth_getCode", [address]); - assert.notEqual(code, "0x"); -} - -async function assertTxMined(hre: any, hash: string) { - const receipt = await hre.network.provider.send("eth_getTransactionReceipt", [ - hash, - ]); - assert.isNotNull(receipt); -} - -/** - * Deploy all the modules in `userModuless`. - * - * Assert that `expectedBlocks.length` blocks are mined, and that - * each mined block has `expectedBlocks[i]` transactions. - */ -export async function deployModules( - hre: any, - userModules: Array>, - expectedBlocks: number[] -): Promise> { - await hre.run("compile", { quiet: true }); - - const deploymentResultPromise: Promise> = hre.run( - "deploy:deploy-modules", - { - userModules, - } - ); - - // eslint-disable-next-line @typescript-eslint/no-floating-promises - mineBlocks(hre, expectedBlocks, deploymentResultPromise); - - const deploymentResult = await deploymentResultPromise; - - if (deploymentResult._kind !== "success") { - assert.fail("Expected deployment result to be successful"); - } - - return deploymentResult.result; -} export async function mineBlocks( hre: any, @@ -182,23 +69,6 @@ async function waitForPendingTxs( } } -async function assertContract(hre: any, futureResult: any) { - if (futureResult._kind !== "contract") { - assert.fail( - `Expected future result to be a contract, but got ${futureResult._kind}` - ); - } - - await assertHasCode(hre, futureResult.value.address); - - const contract = await hre.ethers.getContractAt( - futureResult.value.abi, - futureResult.value.address - ); - - return contract; -} - export async function deployModule( hre: any, moduleDefinition: (m: IDeploymentBuilder) => ModuleDict, diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index fa472a6ea4..ace06ee553 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,6 +1,5 @@ /* eslint-disable import/no-unused-modules */ import { buildModule, IDeploymentBuilder } from "@ignored/ignition-core"; -import { isCallable } from "@ignored/ignition-core/src/utils/guards"; import { assert } from "chai"; import { mineBlocks } from "./helpers"; @@ -29,10 +28,6 @@ describe("useModule", function () { args: [], }); - if (!isCallable(foo)) { - throw new Error("Not callable"); - } - return { foo }; }); From 15011dab1e0d7c516515efb616a675cca4417e83 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Mar 2023 09:20:08 +0000 Subject: [PATCH 0257/1302] refactor: fs level public/internal distinction (#176) To support more clearly understanding which code is internal and which is externally facing we are adding in a filesystem level distinction. This will ease code review and devs comprehension when scanning the codebase. Mistakes like exporting internal types will be easily detected due to having to export a path that includes the `internal` folder. The new file structure: ``` packages/core/src/ index.ts types/ internal/ types/ ``` This is a low sophistication move of everything other than `./dsl`, `Ignition.ts`, `helpers.ts` into internal. There are several packages that we might consider moving back out again (like journal). If a subfolder was moved to internal, its matching types where moved from `./types` to `./internal/types`. Part of #171 --- packages/core/src/Ignition.ts | 28 +++++++++---------- packages/core/src/dsl/DeploymentBuilder.ts | 13 +++++---- packages/core/src/dsl/DeploymentGraph.ts | 4 +-- packages/core/src/dsl/buildModule.ts | 7 +++-- packages/core/src/helpers.ts | 17 ++++++----- packages/core/src/index.ts | 12 ++++---- .../{ => internal}/deployment/Deployment.ts | 0 .../deployment/deployExecutionStateReducer.ts | 0 .../deployment/deployStateReducer.ts | 0 .../src/{ => internal}/deployment/utils.ts | 0 .../execution/ExecutionGraph.ts | 0 .../execution/dispatch/executeAwaitedEvent.ts | 0 .../execution/dispatch/executeContractCall.ts | 0 .../dispatch/executeContractDeploy.ts | 0 .../dispatch/executeDeployedContract.ts | 0 .../dispatch/executeLibraryDeploy.ts | 0 .../execution/dispatch/executeSendETH.ts | 0 .../execution/dispatch/executionDispatch.ts | 0 .../execution/dispatch/utils.ts | 0 .../src/{ => internal}/execution/execute.ts | 0 .../execution/loadJournalInto.ts | 0 .../src/{ => internal}/execution/utils.ts | 0 .../core/src/{ => internal}/graph/Graph.ts | 0 .../src/{ => internal}/graph/adjacencyList.ts | 0 .../core/src/{ => internal}/graph/utils.ts | 0 .../core/src/{ => internal}/graph/visit.ts | 0 .../journal/NoopCommandJournal.ts | 0 .../process/generateDeploymentGraphFrom.ts | 4 +-- ...onvertDeploymentVertexToExecutionVertex.ts | 12 ++++---- ...oymentGraphByEliminatingVirtualVertexes.ts | 2 +- ...ransformDeploymentGraphToExecutionGraph.ts | 0 .../services/AccountsService.ts | 2 +- .../services/ArtifactsService.ts | 7 ++--- .../{ => internal}/services/ConfigService.ts | 2 +- .../services/ContractsService.ts | 0 .../{ => internal}/services/NetworkService.ts | 2 +- .../services/TransactionsService.ts | 2 +- .../{ => internal}/services/createServices.ts | 2 +- .../src/{ => internal}/types/deployment.ts | 4 +-- .../{ => internal}/types/deploymentGraph.ts | 7 +++-- .../src/{ => internal}/types/execution.ts | 0 .../{ => internal}/types/executionGraph.ts | 7 +++-- .../core/src/{ => internal}/types/graph.ts | 0 .../core/src/{ => internal}/types/journal.ts | 2 +- .../core/src/{ => internal}/types/process.ts | 0 .../core/src/{ => internal}/types/services.ts | 6 ++-- .../src/{ => internal}/types/validation.ts | 0 .../utils/collectLibrariesAndLink.ts | 5 ++-- .../core/src/{ => internal}/utils/errors.ts | 0 .../core/src/{ => internal}/utils/guards.ts | 28 +++++++++---------- .../core/src/{ => internal}/utils/proxy.ts | 2 +- .../src/{ => internal}/utils/serialize.ts | 0 .../core/src/{ => internal}/utils/sets.ts | 0 .../core/src/{ => internal}/utils/sleep.ts | 0 .../src/{ => internal}/utils/tx-sender.ts | 2 +- .../validation/dispatch/helpers.ts | 2 +- .../dispatch/validateArtifactContract.ts | 0 .../dispatch/validateArtifactLibrary.ts | 0 .../validation/dispatch/validateCall.ts | 0 .../dispatch/validateDeployedContract.ts | 0 .../validation/dispatch/validateEvent.ts | 0 .../dispatch/validateHardhatContract.ts | 0 .../dispatch/validateHardhatLibrary.ts | 0 .../validation/dispatch/validateSendETH.ts | 0 .../validation/dispatch/validateVirtual.ts | 0 .../validation/dispatch/validationDispatch.ts | 0 .../validation/validateDeploymentGraph.ts | 0 packages/core/src/types/module.ts | 5 +++- packages/core/src/types/plan.ts | 4 +-- packages/core/src/types/providers.ts | 2 +- packages/core/test/collectLibrariesAndLink.ts | 2 +- packages/core/test/contractsService.ts | 6 ++-- .../core/test/deploymentBuilder/accounts.ts | 6 ++-- .../test/deploymentBuilder/buildModule.ts | 4 +-- packages/core/test/deploymentBuilder/calls.ts | 6 ++-- .../core/test/deploymentBuilder/deploy.ts | 8 +++--- packages/core/test/deploymentBuilder/event.ts | 8 +++--- .../deploymentBuilder/getBytesForArtifact.ts | 6 ++-- .../core/test/deploymentBuilder/helpers.ts | 6 ++-- .../core/test/deploymentBuilder/libraries.ts | 9 ++++-- .../core/test/deploymentBuilder/metadata.ts | 4 +-- .../core/test/deploymentBuilder/parameters.ts | 8 +++--- .../core/test/deploymentBuilder/sendETH.ts | 6 ++-- .../core/test/deploymentBuilder/useModule.ts | 4 +-- packages/core/test/deploymentBuilder/value.ts | 6 ++-- packages/core/test/execution/batching.ts | 12 ++++---- packages/core/test/execution/dispatch.ts | 17 ++++++----- packages/core/test/execution/rerun.ts | 2 +- packages/core/test/graph/adjacencyList.ts | 2 +- packages/core/test/graph/helpers.ts | 2 +- packages/core/test/helpers.ts | 8 +++--- packages/core/test/state-reducer/execution.ts | 8 +++--- .../test/state-reducer/preparation-steps.ts | 8 +++--- packages/core/test/state-reducer/utils.ts | 13 +++++---- packages/core/test/tx-sender.ts | 2 +- .../core/test/util/MemoryCommandJournal.ts | 4 +-- packages/core/test/validation.ts | 12 ++++---- 97 files changed, 197 insertions(+), 174 deletions(-) rename packages/core/src/{ => internal}/deployment/Deployment.ts (100%) rename packages/core/src/{ => internal}/deployment/deployExecutionStateReducer.ts (100%) rename packages/core/src/{ => internal}/deployment/deployStateReducer.ts (100%) rename packages/core/src/{ => internal}/deployment/utils.ts (100%) rename packages/core/src/{ => internal}/execution/ExecutionGraph.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeAwaitedEvent.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeContractCall.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeContractDeploy.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeDeployedContract.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeLibraryDeploy.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executeSendETH.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/executionDispatch.ts (100%) rename packages/core/src/{ => internal}/execution/dispatch/utils.ts (100%) rename packages/core/src/{ => internal}/execution/execute.ts (100%) rename packages/core/src/{ => internal}/execution/loadJournalInto.ts (100%) rename packages/core/src/{ => internal}/execution/utils.ts (100%) rename packages/core/src/{ => internal}/graph/Graph.ts (100%) rename packages/core/src/{ => internal}/graph/adjacencyList.ts (100%) rename packages/core/src/{ => internal}/graph/utils.ts (100%) rename packages/core/src/{ => internal}/graph/visit.ts (100%) rename packages/core/src/{ => internal}/journal/NoopCommandJournal.ts (100%) rename packages/core/src/{ => internal}/process/generateDeploymentGraphFrom.ts (88%) rename packages/core/src/{ => internal}/process/transform/convertDeploymentVertexToExecutionVertex.ts (98%) rename packages/core/src/{ => internal}/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts (95%) rename packages/core/src/{ => internal}/process/transformDeploymentGraphToExecutionGraph.ts (100%) rename packages/core/src/{ => internal}/services/AccountsService.ts (93%) rename packages/core/src/{ => internal}/services/ArtifactsService.ts (67%) rename packages/core/src/{ => internal}/services/ConfigService.ts (87%) rename packages/core/src/{ => internal}/services/ContractsService.ts (100%) rename packages/core/src/{ => internal}/services/NetworkService.ts (87%) rename packages/core/src/{ => internal}/services/TransactionsService.ts (94%) rename packages/core/src/{ => internal}/services/createServices.ts (95%) rename packages/core/src/{ => internal}/types/deployment.ts (96%) rename packages/core/src/{ => internal}/types/deploymentGraph.ts (97%) rename packages/core/src/{ => internal}/types/execution.ts (100%) rename packages/core/src/{ => internal}/types/executionGraph.ts (97%) rename packages/core/src/{ => internal}/types/graph.ts (100%) rename packages/core/src/{ => internal}/types/journal.ts (92%) rename packages/core/src/{ => internal}/types/process.ts (100%) rename packages/core/src/{ => internal}/types/services.ts (95%) rename packages/core/src/{ => internal}/types/validation.ts (100%) rename packages/core/src/{ => internal}/utils/collectLibrariesAndLink.ts (97%) rename packages/core/src/{ => internal}/utils/errors.ts (100%) rename packages/core/src/{ => internal}/utils/guards.ts (96%) rename packages/core/src/{ => internal}/utils/proxy.ts (95%) rename packages/core/src/{ => internal}/utils/serialize.ts (100%) rename packages/core/src/{ => internal}/utils/sets.ts (100%) rename packages/core/src/{ => internal}/utils/sleep.ts (100%) rename packages/core/src/{ => internal}/utils/tx-sender.ts (96%) rename packages/core/src/{ => internal}/validation/dispatch/helpers.ts (97%) rename packages/core/src/{ => internal}/validation/dispatch/validateArtifactContract.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateArtifactLibrary.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateCall.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateDeployedContract.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateEvent.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateHardhatContract.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateHardhatLibrary.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateSendETH.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validateVirtual.ts (100%) rename packages/core/src/{ => internal}/validation/dispatch/validationDispatch.ts (100%) rename packages/core/src/{ => internal}/validation/validateDeploymentGraph.ts (100%) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 00d3628c05..87f8f91598 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -2,12 +2,12 @@ import type { DeploymentResult, IgnitionDeployOptions, UpdateUiAction, -} from "./types/deployment"; +} from "./internal/types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVisitResult, -} from "./types/executionGraph"; -import type { ICommandJournal } from "./types/journal"; +} from "./internal/types/executionGraph"; +import type { ICommandJournal } from "./internal/types/journal"; import type { Module, ModuleDict } from "./types/module"; import type { IgnitionPlan } from "./types/plan"; import type { @@ -17,17 +17,17 @@ import type { import setupDebug from "debug"; -import { Deployment } from "./deployment/Deployment"; -import { execute } from "./execution/execute"; -import { loadJournalInto } from "./execution/loadJournalInto"; -import { hashExecutionGraph } from "./execution/utils"; -import { NoopCommandJournal } from "./journal/NoopCommandJournal"; -import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; -import { Services } from "./types/services"; -import { IgnitionError } from "./utils/errors"; -import { resolveProxyValue } from "./utils/proxy"; -import { validateDeploymentGraph } from "./validation/validateDeploymentGraph"; +import { Deployment } from "./internal/deployment/Deployment"; +import { execute } from "./internal/execution/execute"; +import { loadJournalInto } from "./internal/execution/loadJournalInto"; +import { hashExecutionGraph } from "./internal/execution/utils"; +import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; +import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; +import { Services } from "./internal/types/services"; +import { IgnitionError } from "./internal/utils/errors"; +import { resolveProxyValue } from "./internal/utils/proxy"; +import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 9bfe5c5176..2dbc64b72e 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -28,7 +28,7 @@ import type { ModuleCache, ModuleDict, Module } from "../types/module"; import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; -import { addEdge, ensureVertex } from "../graph/adjacencyList"; +import { addEdge, ensureVertex } from "../internal/graph/adjacencyList"; import { CallOptions, ContractOptions, @@ -51,8 +51,11 @@ import { EventVertex, SendVertex, VirtualVertex, -} from "../types/deploymentGraph"; -import { IgnitionError, IgnitionValidationError } from "../utils/errors"; +} from "../internal/types/deploymentGraph"; +import { + IgnitionError, + IgnitionValidationError, +} from "../internal/utils/errors"; import { assertModuleReturnTypes, isArtifact, @@ -60,8 +63,8 @@ import { isContract, isDependable, isParameter, -} from "../utils/guards"; -import { resolveProxyDependency } from "../utils/proxy"; +} from "../internal/utils/guards"; +import { resolveProxyDependency } from "../internal/utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; diff --git a/packages/core/src/dsl/DeploymentGraph.ts b/packages/core/src/dsl/DeploymentGraph.ts index 6c53e17154..d1d04c4a57 100644 --- a/packages/core/src/dsl/DeploymentGraph.ts +++ b/packages/core/src/dsl/DeploymentGraph.ts @@ -1,8 +1,8 @@ -import { Graph } from "../graph/Graph"; +import { Graph } from "../internal/graph/Graph"; import { DeploymentGraphVertex as DeploymentGraphVertex, ScopeData, -} from "../types/deploymentGraph"; +} from "../internal/types/deploymentGraph"; export class DeploymentGraph extends Graph { public scopeData: { diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index 25883db322..be15d4274b 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,7 +1,10 @@ -import type { IDeploymentBuilder } from "../types/deploymentGraph"; +import type { IDeploymentBuilder } from "../internal/types/deploymentGraph"; import type { Module, ModuleDict } from "../types/module"; -import { assertStringParam, assertFunctionParam } from "../utils/errors"; +import { + assertStringParam, + assertFunctionParam, +} from "../internal/utils/errors"; export function buildModule( moduleName: string, diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts index d61a2d6a43..7d2443a9a0 100644 --- a/packages/core/src/helpers.ts +++ b/packages/core/src/helpers.ts @@ -1,7 +1,10 @@ -export { viewExecutionResults } from "./deployment/utils"; -export { createServices } from "./services/createServices"; -export { serializeReplacer } from "./utils/serialize"; -export { IgnitionError, IgnitionValidationError } from "./utils/errors"; -export { TransactionsService } from "./services/TransactionsService"; -export { ContractsService } from "./services/ContractsService"; -export { VertexResultEnum } from "./types/graph"; +export { viewExecutionResults } from "./internal/deployment/utils"; +export { createServices } from "./internal/services/createServices"; +export { serializeReplacer } from "./internal/utils/serialize"; +export { + IgnitionError, + IgnitionValidationError, +} from "./internal/utils/errors"; +export { TransactionsService } from "./internal/services/TransactionsService"; +export { ContractsService } from "./internal/services/ContractsService"; +export { VertexResultEnum } from "./internal/types/graph"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6ffdfd10ed..74e9d7ada8 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -13,22 +13,22 @@ export type { DeploymentResult, UpdateUiAction, IgnitionDeployOptions, -} from "./types/deployment"; +} from "./internal/types/deployment"; export type { Module, ModuleDict, ModuleParams } from "./types/module"; export type { ExternalParamValue, IDeploymentBuilder, DeploymentGraphVertex, -} from "./types/deploymentGraph"; +} from "./internal/types/deploymentGraph"; export type { IgnitionPlan } from "./types/plan"; export type { VertexGraph, VertexDescriptor, VertexVisitResultFailure, -} from "./types/graph"; +} from "./internal/types/graph"; export type { ExecutionVertex, ExecutionVertexType, -} from "./types/executionGraph"; -export type { ICommandJournal } from "./types/journal"; -export type { DeployStateExecutionCommand } from "./types/deployment"; +} from "./internal/types/executionGraph"; +export type { ICommandJournal } from "./internal/types/journal"; +export type { DeployStateExecutionCommand } from "./internal/types/deployment"; diff --git a/packages/core/src/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts similarity index 100% rename from packages/core/src/deployment/Deployment.ts rename to packages/core/src/internal/deployment/Deployment.ts diff --git a/packages/core/src/deployment/deployExecutionStateReducer.ts b/packages/core/src/internal/deployment/deployExecutionStateReducer.ts similarity index 100% rename from packages/core/src/deployment/deployExecutionStateReducer.ts rename to packages/core/src/internal/deployment/deployExecutionStateReducer.ts diff --git a/packages/core/src/deployment/deployStateReducer.ts b/packages/core/src/internal/deployment/deployStateReducer.ts similarity index 100% rename from packages/core/src/deployment/deployStateReducer.ts rename to packages/core/src/internal/deployment/deployStateReducer.ts diff --git a/packages/core/src/deployment/utils.ts b/packages/core/src/internal/deployment/utils.ts similarity index 100% rename from packages/core/src/deployment/utils.ts rename to packages/core/src/internal/deployment/utils.ts diff --git a/packages/core/src/execution/ExecutionGraph.ts b/packages/core/src/internal/execution/ExecutionGraph.ts similarity index 100% rename from packages/core/src/execution/ExecutionGraph.ts rename to packages/core/src/internal/execution/ExecutionGraph.ts diff --git a/packages/core/src/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeAwaitedEvent.ts rename to packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts diff --git a/packages/core/src/execution/dispatch/executeContractCall.ts b/packages/core/src/internal/execution/dispatch/executeContractCall.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeContractCall.ts rename to packages/core/src/internal/execution/dispatch/executeContractCall.ts diff --git a/packages/core/src/execution/dispatch/executeContractDeploy.ts b/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeContractDeploy.ts rename to packages/core/src/internal/execution/dispatch/executeContractDeploy.ts diff --git a/packages/core/src/execution/dispatch/executeDeployedContract.ts b/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeDeployedContract.ts rename to packages/core/src/internal/execution/dispatch/executeDeployedContract.ts diff --git a/packages/core/src/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeLibraryDeploy.ts rename to packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts diff --git a/packages/core/src/execution/dispatch/executeSendETH.ts b/packages/core/src/internal/execution/dispatch/executeSendETH.ts similarity index 100% rename from packages/core/src/execution/dispatch/executeSendETH.ts rename to packages/core/src/internal/execution/dispatch/executeSendETH.ts diff --git a/packages/core/src/execution/dispatch/executionDispatch.ts b/packages/core/src/internal/execution/dispatch/executionDispatch.ts similarity index 100% rename from packages/core/src/execution/dispatch/executionDispatch.ts rename to packages/core/src/internal/execution/dispatch/executionDispatch.ts diff --git a/packages/core/src/execution/dispatch/utils.ts b/packages/core/src/internal/execution/dispatch/utils.ts similarity index 100% rename from packages/core/src/execution/dispatch/utils.ts rename to packages/core/src/internal/execution/dispatch/utils.ts diff --git a/packages/core/src/execution/execute.ts b/packages/core/src/internal/execution/execute.ts similarity index 100% rename from packages/core/src/execution/execute.ts rename to packages/core/src/internal/execution/execute.ts diff --git a/packages/core/src/execution/loadJournalInto.ts b/packages/core/src/internal/execution/loadJournalInto.ts similarity index 100% rename from packages/core/src/execution/loadJournalInto.ts rename to packages/core/src/internal/execution/loadJournalInto.ts diff --git a/packages/core/src/execution/utils.ts b/packages/core/src/internal/execution/utils.ts similarity index 100% rename from packages/core/src/execution/utils.ts rename to packages/core/src/internal/execution/utils.ts diff --git a/packages/core/src/graph/Graph.ts b/packages/core/src/internal/graph/Graph.ts similarity index 100% rename from packages/core/src/graph/Graph.ts rename to packages/core/src/internal/graph/Graph.ts diff --git a/packages/core/src/graph/adjacencyList.ts b/packages/core/src/internal/graph/adjacencyList.ts similarity index 100% rename from packages/core/src/graph/adjacencyList.ts rename to packages/core/src/internal/graph/adjacencyList.ts diff --git a/packages/core/src/graph/utils.ts b/packages/core/src/internal/graph/utils.ts similarity index 100% rename from packages/core/src/graph/utils.ts rename to packages/core/src/internal/graph/utils.ts diff --git a/packages/core/src/graph/visit.ts b/packages/core/src/internal/graph/visit.ts similarity index 100% rename from packages/core/src/graph/visit.ts rename to packages/core/src/internal/graph/visit.ts diff --git a/packages/core/src/journal/NoopCommandJournal.ts b/packages/core/src/internal/journal/NoopCommandJournal.ts similarity index 100% rename from packages/core/src/journal/NoopCommandJournal.ts rename to packages/core/src/internal/journal/NoopCommandJournal.ts diff --git a/packages/core/src/process/generateDeploymentGraphFrom.ts b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts similarity index 88% rename from packages/core/src/process/generateDeploymentGraphFrom.ts rename to packages/core/src/internal/process/generateDeploymentGraphFrom.ts index bb77b9a57b..5f841d5614 100644 --- a/packages/core/src/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts @@ -4,8 +4,8 @@ import type { IDeploymentGraph, } from "../types/deploymentGraph"; -import { DeploymentBuilder } from "../dsl/DeploymentBuilder"; -import { Module, ModuleDict } from "../types/module"; +import { DeploymentBuilder } from "../../dsl/DeploymentBuilder"; +import { Module, ModuleDict } from "../../types/module"; import { IgnitionError } from "../utils/errors"; import { assertModuleReturnTypes } from "../utils/guards"; diff --git a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts similarity index 98% rename from packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts rename to packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index 91e3f94f7e..a06d59181e 100644 --- a/packages/core/src/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,5 +1,11 @@ import { BigNumber, ethers } from "ethers"; +import { + BytesFuture, + DeploymentGraphFuture, + EventParamFuture, +} from "../../../types/future"; +import { Artifact } from "../../../types/hardhat"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, @@ -22,12 +28,6 @@ import { LibraryDeploy, SentETH, } from "../../types/executionGraph"; -import { - BytesFuture, - DeploymentGraphFuture, - EventParamFuture, -} from "../../types/future"; -import { Artifact } from "../../types/hardhat"; import { Services } from "../../types/services"; import { IgnitionError } from "../../utils/errors"; import { isBytesArg, isFuture } from "../../utils/guards"; diff --git a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts similarity index 95% rename from packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts rename to packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts index 57ecfbe3aa..08fbeff67f 100644 --- a/packages/core/src/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -1,4 +1,4 @@ -import { DeploymentGraph } from "../../dsl/DeploymentGraph"; +import { DeploymentGraph } from "../../../dsl/DeploymentGraph"; import { eliminate } from "../../graph/adjacencyList"; import { DeploymentGraphVertex } from "../../types/deploymentGraph"; diff --git a/packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts similarity index 100% rename from packages/core/src/process/transformDeploymentGraphToExecutionGraph.ts rename to packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts diff --git a/packages/core/src/services/AccountsService.ts b/packages/core/src/internal/services/AccountsService.ts similarity index 93% rename from packages/core/src/services/AccountsService.ts rename to packages/core/src/internal/services/AccountsService.ts index 6a20e8005c..d3ed84c68c 100644 --- a/packages/core/src/services/AccountsService.ts +++ b/packages/core/src/internal/services/AccountsService.ts @@ -1,4 +1,4 @@ -import type { Providers } from "../types/providers"; +import type { Providers } from "../../types/providers"; import type { IAccountsService } from "../types/services"; import type { ethers } from "ethers"; diff --git a/packages/core/src/services/ArtifactsService.ts b/packages/core/src/internal/services/ArtifactsService.ts similarity index 67% rename from packages/core/src/services/ArtifactsService.ts rename to packages/core/src/internal/services/ArtifactsService.ts index fb5b768d9d..7913d197a5 100644 --- a/packages/core/src/services/ArtifactsService.ts +++ b/packages/core/src/internal/services/ArtifactsService.ts @@ -1,7 +1,6 @@ -import type { Artifact } from "../types/hardhat"; -import type { Providers } from "../types/providers"; - -import { IArtifactsService } from "../types/services"; +import type { Artifact } from "../../types/hardhat"; +import type { Providers } from "../../types/providers"; +import type { IArtifactsService } from "../types/services"; export class ArtifactsService implements IArtifactsService { constructor(private readonly _providers: Providers) {} diff --git a/packages/core/src/services/ConfigService.ts b/packages/core/src/internal/services/ConfigService.ts similarity index 87% rename from packages/core/src/services/ConfigService.ts rename to packages/core/src/internal/services/ConfigService.ts index 57171415e8..03102c29a7 100644 --- a/packages/core/src/services/ConfigService.ts +++ b/packages/core/src/internal/services/ConfigService.ts @@ -1,5 +1,5 @@ +import type { HasParamResult, Providers } from "../../types/providers"; import type { ExternalParamValue } from "../types/deploymentGraph"; -import type { HasParamResult, Providers } from "../types/providers"; import { IConfigService } from "../types/services"; diff --git a/packages/core/src/services/ContractsService.ts b/packages/core/src/internal/services/ContractsService.ts similarity index 100% rename from packages/core/src/services/ContractsService.ts rename to packages/core/src/internal/services/ContractsService.ts diff --git a/packages/core/src/services/NetworkService.ts b/packages/core/src/internal/services/NetworkService.ts similarity index 87% rename from packages/core/src/services/NetworkService.ts rename to packages/core/src/internal/services/NetworkService.ts index 9c9488b3b8..67c6e2696e 100644 --- a/packages/core/src/services/NetworkService.ts +++ b/packages/core/src/internal/services/NetworkService.ts @@ -1,4 +1,4 @@ -import { Providers } from "../types/providers"; +import { Providers } from "../../types/providers"; import { INetworkService } from "../types/services"; export class NetworkService implements INetworkService { diff --git a/packages/core/src/services/TransactionsService.ts b/packages/core/src/internal/services/TransactionsService.ts similarity index 94% rename from packages/core/src/services/TransactionsService.ts rename to packages/core/src/internal/services/TransactionsService.ts index ec1e442ae5..c7b824ccd2 100644 --- a/packages/core/src/services/TransactionsService.ts +++ b/packages/core/src/internal/services/TransactionsService.ts @@ -1,4 +1,4 @@ -import type { Providers } from "../types/providers"; +import type { Providers } from "../../types/providers"; import type { ITransactionsService } from "../types/services"; import { ethers } from "ethers"; diff --git a/packages/core/src/services/createServices.ts b/packages/core/src/internal/services/createServices.ts similarity index 95% rename from packages/core/src/services/createServices.ts rename to packages/core/src/internal/services/createServices.ts index b549354e49..eaee22570a 100644 --- a/packages/core/src/services/createServices.ts +++ b/packages/core/src/internal/services/createServices.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { Providers } from "../types/providers"; +import { Providers } from "../../types/providers"; import { Services } from "../types/services"; import { TxSender } from "../utils/tx-sender"; diff --git a/packages/core/src/types/deployment.ts b/packages/core/src/internal/types/deployment.ts similarity index 96% rename from packages/core/src/types/deployment.ts rename to packages/core/src/internal/types/deployment.ts index 56ae996f5b..fe50e220ec 100644 --- a/packages/core/src/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -1,3 +1,5 @@ +import type { ModuleDict, ModuleParams } from "../../types/module"; +import type { SerializedDeploymentResult } from "../../types/serialization"; import type { ExecutionVertex, ExecutionVertexVisitResult, @@ -9,8 +11,6 @@ import type { VertexVisitResultFailure, VertexVisitResultSuccess, } from "./graph"; -import type { ModuleDict, ModuleParams } from "./module"; -import type { SerializedDeploymentResult } from "./serialization"; import type { Services } from "./services"; import type { BigNumber } from "ethers"; diff --git a/packages/core/src/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts similarity index 97% rename from packages/core/src/types/deploymentGraph.ts rename to packages/core/src/internal/types/deploymentGraph.ts index cc3b212b6b..a2db90c3a2 100644 --- a/packages/core/src/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -20,10 +20,11 @@ import { EventParamFuture, SendFuture, AddressResolvable, -} from "./future"; +} from "../../types/future"; +import { Artifact } from "../../types/hardhat"; +import { ModuleDict, Module } from "../../types/module"; + import { AdjacencyList, VertexDescriptor } from "./graph"; -import { Artifact } from "./hardhat"; -import { ModuleDict, Module } from "./module"; export interface ScopeData { before: Virtual; diff --git a/packages/core/src/types/execution.ts b/packages/core/src/internal/types/execution.ts similarity index 100% rename from packages/core/src/types/execution.ts rename to packages/core/src/internal/types/execution.ts diff --git a/packages/core/src/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts similarity index 97% rename from packages/core/src/types/executionGraph.ts rename to packages/core/src/internal/types/executionGraph.ts index 4d1ff1da19..71dbecd064 100644 --- a/packages/core/src/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -1,12 +1,14 @@ import type { BigNumber, ethers } from "ethers"; -import { LibraryMap } from "./deploymentGraph"; import { AddressResolvable, ArtifactContract, DeploymentGraphFuture, EventParamFuture, -} from "./future"; +} from "../../types/future"; +import { Artifact } from "../../types/hardhat"; + +import { LibraryMap } from "./deploymentGraph"; import { AdjacencyList, ResultsAccumulator, @@ -14,7 +16,6 @@ import { VertexVisitResult, VisitResult, } from "./graph"; -import { Artifact } from "./hardhat"; export interface IExecutionGraph { adjacencyList: AdjacencyList; diff --git a/packages/core/src/types/graph.ts b/packages/core/src/internal/types/graph.ts similarity index 100% rename from packages/core/src/types/graph.ts rename to packages/core/src/internal/types/graph.ts diff --git a/packages/core/src/types/journal.ts b/packages/core/src/internal/types/journal.ts similarity index 92% rename from packages/core/src/types/journal.ts rename to packages/core/src/internal/types/journal.ts index 530127b627..ab9b8470bb 100644 --- a/packages/core/src/types/journal.ts +++ b/packages/core/src/internal/types/journal.ts @@ -1,4 +1,4 @@ -import type { DeployStateExecutionCommand } from "../types/deployment"; +import type { DeployStateExecutionCommand } from "./deployment"; export interface JournalEntry { txHash: string; diff --git a/packages/core/src/types/process.ts b/packages/core/src/internal/types/process.ts similarity index 100% rename from packages/core/src/types/process.ts rename to packages/core/src/internal/types/process.ts diff --git a/packages/core/src/types/services.ts b/packages/core/src/internal/types/services.ts similarity index 95% rename from packages/core/src/types/services.ts rename to packages/core/src/internal/types/services.ts index a1e3881ba3..0b6f64efea 100644 --- a/packages/core/src/types/services.ts +++ b/packages/core/src/internal/types/services.ts @@ -1,10 +1,10 @@ -import type { ExternalParamValue } from "./deploymentGraph"; -import type { Artifact } from "./hardhat"; +import type { Artifact } from "../../types/hardhat"; import type { GasProvider, HasParamResult, TransactionsProvider, -} from "./providers"; +} from "../../types/providers"; +import type { ExternalParamValue } from "./deploymentGraph"; import { ethers } from "ethers"; diff --git a/packages/core/src/types/validation.ts b/packages/core/src/internal/types/validation.ts similarity index 100% rename from packages/core/src/types/validation.ts rename to packages/core/src/internal/types/validation.ts diff --git a/packages/core/src/utils/collectLibrariesAndLink.ts b/packages/core/src/internal/utils/collectLibrariesAndLink.ts similarity index 97% rename from packages/core/src/utils/collectLibrariesAndLink.ts rename to packages/core/src/internal/utils/collectLibrariesAndLink.ts index c6716a964a..2e32602318 100644 --- a/packages/core/src/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/internal/utils/collectLibrariesAndLink.ts @@ -1,6 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies -import { Artifact } from "../types/hardhat"; -import { IgnitionError } from "../utils/errors"; +import { Artifact } from "../../types/hardhat"; + +import { IgnitionError } from "./errors"; interface Link { sourceName: string; diff --git a/packages/core/src/utils/errors.ts b/packages/core/src/internal/utils/errors.ts similarity index 100% rename from packages/core/src/utils/errors.ts rename to packages/core/src/internal/utils/errors.ts diff --git a/packages/core/src/utils/guards.ts b/packages/core/src/internal/utils/guards.ts similarity index 96% rename from packages/core/src/utils/guards.ts rename to packages/core/src/internal/utils/guards.ts index f62debc5cd..4fa84a4e02 100644 --- a/packages/core/src/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -1,14 +1,3 @@ -import type { - DeploymentGraphVertex, - HardhatContractDeploymentVertex, - ArtifactContractDeploymentVertex, - DeployedContractDeploymentVertex, - CallDeploymentVertex, - HardhatLibraryDeploymentVertex, - ArtifactLibraryDeploymentVertex, - EventVertex, - InternalParamValue, -} from "../types/deploymentGraph"; import type { CallableFuture, DependableFuture, @@ -20,12 +9,23 @@ import type { BytesFuture, EventParamFuture, ContractFuture, -} from "../types/future"; +} from "../../types/future"; +import type { + DeploymentGraphVertex, + HardhatContractDeploymentVertex, + ArtifactContractDeploymentVertex, + DeployedContractDeploymentVertex, + CallDeploymentVertex, + HardhatLibraryDeploymentVertex, + ArtifactLibraryDeploymentVertex, + EventVertex, + InternalParamValue, +} from "../types/deploymentGraph"; import { BigNumber } from "ethers"; -import { Artifact } from "../types/hardhat"; -import { ModuleDict } from "../types/module"; +import { Artifact } from "../../types/hardhat"; +import { ModuleDict } from "../../types/module"; import { IgnitionError } from "./errors"; diff --git a/packages/core/src/utils/proxy.ts b/packages/core/src/internal/utils/proxy.ts similarity index 95% rename from packages/core/src/utils/proxy.ts rename to packages/core/src/internal/utils/proxy.ts index 1a37c3b8eb..efa58713e6 100644 --- a/packages/core/src/utils/proxy.ts +++ b/packages/core/src/internal/utils/proxy.ts @@ -5,7 +5,7 @@ import { Virtual, EventFuture, SendFuture, -} from "../types/future"; +} from "../../types/future"; import { isProxy } from "./guards"; diff --git a/packages/core/src/utils/serialize.ts b/packages/core/src/internal/utils/serialize.ts similarity index 100% rename from packages/core/src/utils/serialize.ts rename to packages/core/src/internal/utils/serialize.ts diff --git a/packages/core/src/utils/sets.ts b/packages/core/src/internal/utils/sets.ts similarity index 100% rename from packages/core/src/utils/sets.ts rename to packages/core/src/internal/utils/sets.ts diff --git a/packages/core/src/utils/sleep.ts b/packages/core/src/internal/utils/sleep.ts similarity index 100% rename from packages/core/src/utils/sleep.ts rename to packages/core/src/internal/utils/sleep.ts diff --git a/packages/core/src/utils/tx-sender.ts b/packages/core/src/internal/utils/tx-sender.ts similarity index 96% rename from packages/core/src/utils/tx-sender.ts rename to packages/core/src/internal/utils/tx-sender.ts index 7d77c50285..910a94f8ba 100644 --- a/packages/core/src/utils/tx-sender.ts +++ b/packages/core/src/internal/utils/tx-sender.ts @@ -1,7 +1,7 @@ import setupDebug, { IDebugger } from "debug"; import { ethers } from "ethers"; -import { GasProvider } from "../types/providers"; +import { GasProvider } from "../../types/providers"; /** * Sends, replaces and keeps track of transactions. diff --git a/packages/core/src/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts similarity index 97% rename from packages/core/src/validation/dispatch/helpers.ts rename to packages/core/src/internal/validation/dispatch/helpers.ts index 89b12005a4..ab174abc18 100644 --- a/packages/core/src/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -1,4 +1,4 @@ -import type { CallableFuture } from "../../types/future"; +import type { CallableFuture } from "../../../types/future"; import type { Services } from "../../types/services"; import { diff --git a/packages/core/src/validation/dispatch/validateArtifactContract.ts b/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateArtifactContract.ts rename to packages/core/src/internal/validation/dispatch/validateArtifactContract.ts diff --git a/packages/core/src/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateArtifactLibrary.ts rename to packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts diff --git a/packages/core/src/validation/dispatch/validateCall.ts b/packages/core/src/internal/validation/dispatch/validateCall.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateCall.ts rename to packages/core/src/internal/validation/dispatch/validateCall.ts diff --git a/packages/core/src/validation/dispatch/validateDeployedContract.ts b/packages/core/src/internal/validation/dispatch/validateDeployedContract.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateDeployedContract.ts rename to packages/core/src/internal/validation/dispatch/validateDeployedContract.ts diff --git a/packages/core/src/validation/dispatch/validateEvent.ts b/packages/core/src/internal/validation/dispatch/validateEvent.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateEvent.ts rename to packages/core/src/internal/validation/dispatch/validateEvent.ts diff --git a/packages/core/src/validation/dispatch/validateHardhatContract.ts b/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateHardhatContract.ts rename to packages/core/src/internal/validation/dispatch/validateHardhatContract.ts diff --git a/packages/core/src/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateHardhatLibrary.ts rename to packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts diff --git a/packages/core/src/validation/dispatch/validateSendETH.ts b/packages/core/src/internal/validation/dispatch/validateSendETH.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateSendETH.ts rename to packages/core/src/internal/validation/dispatch/validateSendETH.ts diff --git a/packages/core/src/validation/dispatch/validateVirtual.ts b/packages/core/src/internal/validation/dispatch/validateVirtual.ts similarity index 100% rename from packages/core/src/validation/dispatch/validateVirtual.ts rename to packages/core/src/internal/validation/dispatch/validateVirtual.ts diff --git a/packages/core/src/validation/dispatch/validationDispatch.ts b/packages/core/src/internal/validation/dispatch/validationDispatch.ts similarity index 100% rename from packages/core/src/validation/dispatch/validationDispatch.ts rename to packages/core/src/internal/validation/dispatch/validationDispatch.ts diff --git a/packages/core/src/validation/validateDeploymentGraph.ts b/packages/core/src/internal/validation/validateDeploymentGraph.ts similarity index 100% rename from packages/core/src/validation/validateDeploymentGraph.ts rename to packages/core/src/internal/validation/validateDeploymentGraph.ts diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 26782de77e..f3fe8a108e 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,4 +1,7 @@ -import type { ExternalParamValue, IDeploymentBuilder } from "./deploymentGraph"; +import type { + ExternalParamValue, + IDeploymentBuilder, +} from "../internal/types/deploymentGraph"; import type { ContractFuture, LibraryFuture, diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts index c5d6011822..17ef5c46d1 100644 --- a/packages/core/src/types/plan.ts +++ b/packages/core/src/types/plan.ts @@ -1,5 +1,5 @@ -import { IDeploymentGraph } from "./deploymentGraph"; -import { IExecutionGraph } from "./executionGraph"; +import { IDeploymentGraph } from "../internal/types/deploymentGraph"; +import { IExecutionGraph } from "../internal/types/executionGraph"; export interface IgnitionPlan { deploymentGraph: IDeploymentGraph; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index d355751ea4..5ad2c9e4e9 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,4 +1,4 @@ -import type { ExternalParamValue } from "./deploymentGraph"; +import type { ExternalParamValue } from "../internal/types/deploymentGraph"; import type { Artifact } from "./hardhat"; import type { ethers } from "ethers"; diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts index 973c0dfc04..9614024e14 100644 --- a/packages/core/test/collectLibrariesAndLink.ts +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { expect } from "chai"; -import { collectLibrariesAndLink } from "../src/utils/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "../src/internal/utils/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts index db7796661c..62358441d1 100644 --- a/packages/core/test/contractsService.ts +++ b/packages/core/test/contractsService.ts @@ -1,11 +1,11 @@ /* eslint-disable import/no-unused-modules */ -import type { ContractsServiceProviders } from "../src/types/services"; -import type { TxSender } from "../src/utils/tx-sender"; +import type { ContractsServiceProviders } from "../src/internal/types/services"; +import type { TxSender } from "../src/internal/utils/tx-sender"; import { assert } from "chai"; import { ethers } from "ethers"; -import { ContractsService } from "../src/services/ContractsService"; +import { ContractsService } from "../src/internal/services/ContractsService"; const txSender: TxSender = { async send(..._) { diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index 166856834e..8687faa4dc 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -2,14 +2,14 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { isCall, isHardhatContract } from "../../src/utils/guards"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index 50ffba960f..91fe92f99a 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -2,8 +2,8 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { IgnitionError } from "../../src/utils/errors"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IgnitionError } from "../../src/internal/utils/errors"; describe("deployment builder - buildModule", () => { it("should throw if build module is given an async callback", () => { diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index f76976605c..fdad3f965e 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -2,12 +2,12 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentBuilder, IDeploymentGraph, -} from "../../src/types/deploymentGraph"; -import { isCall, isHardhatContract } from "../../src/utils/guards"; +} from "../../src/internal/types/deploymentGraph"; +import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index ed00d9686a..933f307cb6 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -2,18 +2,18 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { Artifact } from "../../src/types/hardhat"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract, isDeployedContract, isHardhatContract, -} from "../../src/utils/guards"; +} from "../../src/internal/utils/guards"; +import { Artifact } from "../../src/types/hardhat"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 78fe004b7a..188b76e6df 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -2,17 +2,17 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentBuilder, IDeploymentGraph, -} from "../../src/types/deploymentGraph"; -import { ArtifactContract } from "../../src/types/future"; +} from "../../src/internal/types/deploymentGraph"; import { isAwaitedEvent, isCall, isArtifactContract, -} from "../../src/utils/guards"; +} from "../../src/internal/utils/guards"; +import { ArtifactContract } from "../../src/types/future"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts index 311bda63a4..eb0dd162b3 100644 --- a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts +++ b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts @@ -2,12 +2,12 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentBuilder, IDeploymentGraph, -} from "../../src/types/deploymentGraph"; -import { isCall, isHardhatContract } from "../../src/utils/guards"; +} from "../../src/internal/types/deploymentGraph"; +import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/deploymentBuilder/helpers.ts b/packages/core/test/deploymentBuilder/helpers.ts index 2a56948c63..10dcc06405 100644 --- a/packages/core/test/deploymentBuilder/helpers.ts +++ b/packages/core/test/deploymentBuilder/helpers.ts @@ -1,7 +1,7 @@ import { DeploymentGraph } from "../../src/dsl/DeploymentGraph"; -import { getDependenciesFor } from "../../src/graph/adjacencyList"; -import { DeploymentGraphVertex } from "../../src/types/deploymentGraph"; -import { VertexDescriptor } from "../../src/types/graph"; +import { getDependenciesFor } from "../../src/internal/graph/adjacencyList"; +import { DeploymentGraphVertex } from "../../src/internal/types/deploymentGraph"; +import { VertexDescriptor } from "../../src/internal/types/graph"; export function getDeploymentVertexByLabel( deploymentGraph: DeploymentGraph, diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index 11a015fd02..d71c178953 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -2,13 +2,16 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { isHardhatContract, isHardhatLibrary } from "../../src/utils/guards"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { + isHardhatContract, + isHardhatLibrary, +} from "../../src/internal/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts index 8e93b3720e..41d45626dd 100644 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -2,8 +2,8 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder } from "../../src/types/deploymentGraph"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder } from "../../src/internal/types/deploymentGraph"; describe("deployment builder - metadata", () => { it("should inject the chainId via the builder", () => { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index aaa00ad8b2..b9ed7fe386 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -2,14 +2,14 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { IgnitionError } from "../../src/utils/errors"; -import { isCallable } from "../../src/utils/guards"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IgnitionError } from "../../src/internal/utils/errors"; +import { isCallable } from "../../src/internal/utils/guards"; describe("deployment builder - parameters", function () { let deploymentGraph: IDeploymentGraph; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index 34be51d055..bc9f1c5baa 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -3,12 +3,12 @@ import { assert } from "chai"; import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentBuilder, IDeploymentGraph, -} from "../../src/types/deploymentGraph"; -import { isHardhatContract } from "../../src/utils/guards"; +} from "../../src/internal/types/deploymentGraph"; +import { isHardhatContract } from "../../src/internal/utils/guards"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 88cccc826f..c3e1c26265 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -2,12 +2,12 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { ArtifactContract, CallableFuture, diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 5ab5c5e049..7c1a17664f 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -2,19 +2,19 @@ import type { IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; +} from "../../src/internal/types/deploymentGraph"; import type { Artifact } from "../../src/types/hardhat"; import { assert } from "chai"; import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract, isHardhatContract, isCall, -} from "../../src/utils/guards"; +} from "../../src/internal/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index 035c90fb25..0851e87343 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -3,16 +3,16 @@ import type { ContractDeploy, ExecutionVertex, ExecutionVertexVisitResult, -} from "../../src/types/executionGraph"; +} from "../../src/internal/types/executionGraph"; import { assert } from "chai"; import { BigNumber } from "ethers"; -import { Deployment } from "../../src/deployment/Deployment"; -import { ExecutionGraph } from "../../src/execution/ExecutionGraph"; -import { executeInBatches } from "../../src/execution/execute"; -import { VertexResultEnum } from "../../src/types/graph"; -import { ICommandJournal } from "../../src/types/journal"; +import { Deployment } from "../../src/internal/deployment/Deployment"; +import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; +import { executeInBatches } from "../../src/internal/execution/execute"; +import { VertexResultEnum } from "../../src/internal/types/graph"; +import { ICommandJournal } from "../../src/internal/types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; describe("Execution - batching", () => { diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 12a20d50a7..f52e4a22bb 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -3,14 +3,17 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; -import { Deployment } from "../../src/deployment/Deployment"; -import { ExecutionGraph } from "../../src/execution/ExecutionGraph"; -import { execute } from "../../src/execution/execute"; -import { ExecutionVertex } from "../../src/types/executionGraph"; -import { VertexResultEnum } from "../../src/types/graph"; +import { Deployment } from "../../src/internal/deployment/Deployment"; +import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; +import { execute } from "../../src/internal/execution/execute"; +import { ExecutionVertex } from "../../src/internal/types/executionGraph"; +import { VertexResultEnum } from "../../src/internal/types/graph"; +import { ICommandJournal } from "../../src/internal/types/journal"; +import { + Services, + TransactionOptions, +} from "../../src/internal/types/services"; import { Artifact } from "../../src/types/hardhat"; -import { ICommandJournal } from "../../src/types/journal"; -import { Services, TransactionOptions } from "../../src/types/services"; import { buildAdjacencyListFrom } from "../graph/helpers"; import { getMockServices } from "../helpers"; diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index c70d8cdc3b..5470e285c1 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -5,7 +5,7 @@ import { ethers } from "ethers"; import { Ignition } from "../../src/Ignition"; import { buildModule } from "../../src/dsl/buildModule"; -import { TransactionsService } from "../../src/services/TransactionsService"; +import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { Artifact } from "../../src/types/hardhat"; import { Providers } from "../../src/types/providers"; import { getMockServices } from "../helpers"; diff --git a/packages/core/test/graph/adjacencyList.ts b/packages/core/test/graph/adjacencyList.ts index bc6a2ce847..e97361886f 100644 --- a/packages/core/test/graph/adjacencyList.ts +++ b/packages/core/test/graph/adjacencyList.ts @@ -9,7 +9,7 @@ import { topologicalSort, eliminate, ensureVertex, -} from "../../src/graph/adjacencyList"; +} from "../../src/internal/graph/adjacencyList"; import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; diff --git a/packages/core/test/graph/helpers.ts b/packages/core/test/graph/helpers.ts index 0854185dc4..2252e05efd 100644 --- a/packages/core/test/graph/helpers.ts +++ b/packages/core/test/graph/helpers.ts @@ -2,7 +2,7 @@ import { addEdge, ensureVertex, constructEmptyAdjacencyList, -} from "../../src/graph/adjacencyList"; +} from "../../src/internal/graph/adjacencyList"; export function constructAdjacencyList( edges: Array<{ from: number; to: number }> diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 0328d61873..b3c008811d 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,7 +1,5 @@ import { ethers } from "ethers"; -import { Artifact } from "../src/types/hardhat"; -import { HasParamResult } from "../src/types/providers"; import { Services, TransactionOptions, @@ -11,8 +9,10 @@ import { IConfigService, IArtifactsService, IAccountsService, -} from "../src/types/services"; -import { IgnitionError } from "../src/utils/errors"; +} from "../src/internal/types/services"; +import { IgnitionError } from "../src/internal/utils/errors"; +import { Artifact } from "../src/types/hardhat"; +import { HasParamResult } from "../src/types/providers"; export function getMockServices() { const mockServices: Services = { diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index df178c2ce4..ba31a09c8b 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -1,13 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { buildModule } from "../../src/dsl/buildModule"; import { deployStateReducer, initializeDeployState, -} from "../../src/deployment/deployStateReducer"; -import { buildModule } from "../../src/dsl/buildModule"; -import { DeployState } from "../../src/types/deployment"; -import { VertexResultEnum } from "../../src/types/graph"; +} from "../../src/internal/deployment/deployStateReducer"; +import { DeployState } from "../../src/internal/types/deployment"; +import { VertexResultEnum } from "../../src/internal/types/graph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts index 3ea0365c4d..0aa4591574 100644 --- a/packages/core/test/state-reducer/preparation-steps.ts +++ b/packages/core/test/state-reducer/preparation-steps.ts @@ -1,13 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; +import { buildModule } from "../../src/dsl/buildModule"; import { deployStateReducer, initializeDeployState, -} from "../../src/deployment/deployStateReducer"; -import { buildModule } from "../../src/dsl/buildModule"; -import { DeployState } from "../../src/types/deployment"; -import { IExecutionGraph } from "../../src/types/executionGraph"; +} from "../../src/internal/deployment/deployStateReducer"; +import { DeployState } from "../../src/internal/types/deployment"; +import { IExecutionGraph } from "../../src/internal/types/executionGraph"; import { applyActions, resolveExecutionGraphFor } from "./utils"; diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 434acebd5e..409a3b37c9 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -1,11 +1,14 @@ import { ethers } from "ethers"; -import { deployStateReducer } from "../../src/deployment/deployStateReducer"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "../../src/process/transformDeploymentGraphToExecutionGraph"; -import { DeployState, DeployStateCommand } from "../../src/types/deployment"; +import { deployStateReducer } from "../../src/internal/deployment/deployStateReducer"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "../../src/internal/process/transformDeploymentGraphToExecutionGraph"; +import { + DeployState, + DeployStateCommand, +} from "../../src/internal/types/deployment"; +import { validateDeploymentGraph } from "../../src/internal/validation/validateDeploymentGraph"; import { Module } from "../../src/types/module"; -import { validateDeploymentGraph } from "../../src/validation/validateDeploymentGraph"; import { getMockServices } from "../helpers"; export function applyActions( diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts index b3cd085e2e..726ba4b3ef 100644 --- a/packages/core/test/tx-sender.ts +++ b/packages/core/test/tx-sender.ts @@ -3,8 +3,8 @@ import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; +import { TxSender } from "../src/internal/utils/tx-sender"; import { GasProvider } from "../src/types/providers"; -import { TxSender } from "../src/utils/tx-sender"; class SignerSpy { private _index = -1; diff --git a/packages/core/test/util/MemoryCommandJournal.ts b/packages/core/test/util/MemoryCommandJournal.ts index dfec635ba7..c84f68e82e 100644 --- a/packages/core/test/util/MemoryCommandJournal.ts +++ b/packages/core/test/util/MemoryCommandJournal.ts @@ -1,5 +1,5 @@ -import { DeployStateExecutionCommand } from "../../src/types/deployment"; -import { ICommandJournal } from "../../src/types/journal"; +import { DeployStateExecutionCommand } from "../../src/internal/types/deployment"; +import { ICommandJournal } from "../../src/internal/types/journal"; export class MemoryCommandJournal implements ICommandJournal { private entries: string[]; diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index f8b27e6d92..48ad20ce15 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,19 +1,19 @@ /* eslint-disable import/no-unused-modules */ -import type { IDeploymentBuilder } from "../src/types/deploymentGraph"; +import type { IDeploymentBuilder } from "../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { ethers } from "ethers"; import sinon from "sinon"; import { buildModule } from "../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../src/process/generateDeploymentGraphFrom"; +import { generateDeploymentGraphFrom } from "../src/internal/process/generateDeploymentGraphFrom"; +import { Services } from "../src/internal/types/services"; +import { ValidationVisitResult } from "../src/internal/types/validation"; +import { IgnitionValidationError } from "../src/internal/utils/errors"; +import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; -import { Services } from "../src/types/services"; -import { ValidationVisitResult } from "../src/types/validation"; -import { IgnitionValidationError } from "../src/utils/errors"; -import { validateDeploymentGraph } from "../src/validation/validateDeploymentGraph"; import { getMockServices } from "./helpers"; From d6bbee5bbbbaa9a388eb5c5b40add79c25497790 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 Mar 2023 09:46:43 +0000 Subject: [PATCH 0258/1302] refactor: export ignition errors on their own entry point (#179) The two Ignition errors are now defined at the root under `./errors.ts`. The supporting utility functions remain under the `./internal/utils/paramAssertions.ts` file. The file containing the Ignition errors is exported as a valid entry point. A third party can access them by: ```js import { IgnitionError } from "@ignored/ignition-core/errors" ``` Part of #171. --- packages/core/package.json | 6 +++- packages/core/src/Ignition.ts | 2 +- packages/core/src/dsl/DeploymentBuilder.ts | 5 +-- packages/core/src/dsl/buildModule.ts | 4 +-- .../core/src/{internal/utils => }/errors.ts | 32 ++++++------------- packages/core/src/helpers.ts | 4 --- .../src/internal/deployment/Deployment.ts | 2 +- .../src/internal/execution/dispatch/utils.ts | 2 +- .../core/src/internal/execution/execute.ts | 2 +- .../core/src/internal/graph/adjacencyList.ts | 2 +- packages/core/src/internal/graph/visit.ts | 2 +- .../process/generateDeploymentGraphFrom.ts | 2 +- ...onvertDeploymentVertexToExecutionVertex.ts | 2 +- .../src/internal/services/ContractsService.ts | 2 +- .../internal/utils/collectLibrariesAndLink.ts | 3 +- packages/core/src/internal/utils/guards.ts | 3 +- .../src/internal/utils/paramAssertions.ts | 23 +++++++++++++ .../internal/validation/dispatch/helpers.ts | 2 +- .../validation/validateDeploymentGraph.ts | 2 +- .../test/deploymentBuilder/buildModule.ts | 2 +- .../core/test/deploymentBuilder/parameters.ts | 2 +- packages/core/test/helpers.ts | 2 +- packages/core/test/validation.ts | 2 +- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 3 +- packages/hardhat-plugin/src/load-module.ts | 2 +- .../ui/components/ValidationFailedPanel.tsx | 2 +- .../components/execution/BatchExecution.tsx | 2 +- .../hardhat-plugin/src/ui/renderToCli.tsx | 2 +- 29 files changed, 65 insertions(+), 58 deletions(-) rename packages/core/src/{internal/utils => }/errors.ts (58%) create mode 100644 packages/core/src/internal/utils/paramAssertions.ts diff --git a/packages/core/package.json b/packages/core/package.json index 9efee17140..77564b7abb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,12 +22,16 @@ "types": "./dist/src/index.d.ts", "exports": { ".": "./dist/src/index.js", - "./helpers": "./dist/src/helpers.js" + "./helpers": "./dist/src/helpers.js", + "./errors": "./dist/src/errors.js" }, "typesVersions": { "*": { "helpers": [ "./dist/src/helpers" + ], + "errors": [ + "./dist/src/errors" ] } }, diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 87f8f91598..016cb8917b 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -17,6 +17,7 @@ import type { import setupDebug from "debug"; +import { IgnitionError } from "./errors"; import { Deployment } from "./internal/deployment/Deployment"; import { execute } from "./internal/execution/execute"; import { loadJournalInto } from "./internal/execution/loadJournalInto"; @@ -25,7 +26,6 @@ import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; import { Services } from "./internal/types/services"; -import { IgnitionError } from "./internal/utils/errors"; import { resolveProxyValue } from "./internal/utils/proxy"; import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 2dbc64b72e..60f5cc5b51 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -28,6 +28,7 @@ import type { ModuleCache, ModuleDict, Module } from "../types/module"; import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; +import { IgnitionError, IgnitionValidationError } from "../errors"; import { addEdge, ensureVertex } from "../internal/graph/adjacencyList"; import { CallOptions, @@ -52,10 +53,6 @@ import { SendVertex, VirtualVertex, } from "../internal/types/deploymentGraph"; -import { - IgnitionError, - IgnitionValidationError, -} from "../internal/utils/errors"; import { assertModuleReturnTypes, isArtifact, diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index be15d4274b..008c461d85 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -2,9 +2,9 @@ import type { IDeploymentBuilder } from "../internal/types/deploymentGraph"; import type { Module, ModuleDict } from "../types/module"; import { - assertStringParam, assertFunctionParam, -} from "../internal/utils/errors"; + assertStringParam, +} from "../internal/utils/paramAssertions"; export function buildModule( moduleName: string, diff --git a/packages/core/src/internal/utils/errors.ts b/packages/core/src/errors.ts similarity index 58% rename from packages/core/src/internal/utils/errors.ts rename to packages/core/src/errors.ts index 5e0612de64..1107a92e2f 100644 --- a/packages/core/src/internal/utils/errors.ts +++ b/packages/core/src/errors.ts @@ -1,5 +1,7 @@ -import { BigNumber } from "ethers"; - +/** + * All exceptions intenionally thrown with Ignition-core + * extend this class. + */ export class IgnitionError extends Error { constructor(message: string) { super(message); @@ -8,6 +10,12 @@ export class IgnitionError extends Error { } } +/** + * This error class represents issue detected by Ignition-cores + * validation phase on the user inputed module. Validation errors + * capture the stack to the action within the offending module, + * to enhance the locality of the validation error message. + */ export class IgnitionValidationError extends IgnitionError { constructor(message: string) { super(message); @@ -30,23 +38,3 @@ export class IgnitionValidationError extends IgnitionError { Error.captureStackTrace(this, f); } } - -export function assertStringParam(param: any, paramName: string) { - if (typeof param !== "string") { - throw new IgnitionError(`\`${paramName}\` must be a string`); - } -} - -export function assertFunctionParam(param: any, paramName: string) { - if (typeof param !== "function") { - throw new IgnitionError(`\`${paramName}\` must be a function`); - } -} - -export function assertBigNumberParam(param: any, paramName: string) { - if (param !== undefined) { - if (!BigNumber.isBigNumber(param)) { - throw new IgnitionError(`\`${paramName}\` must be a BigNumber`); - } - } -} diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts index 7d2443a9a0..a588bc6265 100644 --- a/packages/core/src/helpers.ts +++ b/packages/core/src/helpers.ts @@ -1,10 +1,6 @@ export { viewExecutionResults } from "./internal/deployment/utils"; export { createServices } from "./internal/services/createServices"; export { serializeReplacer } from "./internal/utils/serialize"; -export { - IgnitionError, - IgnitionValidationError, -} from "./internal/utils/errors"; export { TransactionsService } from "./internal/services/TransactionsService"; export { ContractsService } from "./internal/services/ContractsService"; export { VertexResultEnum } from "./internal/types/graph"; diff --git a/packages/core/src/internal/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts index 9f1bfe94fb..b2bdf7bcc2 100644 --- a/packages/core/src/internal/deployment/Deployment.ts +++ b/packages/core/src/internal/deployment/Deployment.ts @@ -15,8 +15,8 @@ import type { Services } from "../types/services"; import setupDebug from "debug"; +import { IgnitionError } from "../../errors"; import { ExecutionGraph } from "../execution/ExecutionGraph"; -import { IgnitionError } from "../utils/errors"; import { initializeDeployState, diff --git a/packages/core/src/internal/execution/dispatch/utils.ts b/packages/core/src/internal/execution/dispatch/utils.ts index 3d52bf10f6..7b80c252ee 100644 --- a/packages/core/src/internal/execution/dispatch/utils.ts +++ b/packages/core/src/internal/execution/dispatch/utils.ts @@ -3,7 +3,7 @@ import type { ExecutionResultsAccumulator, } from "../../types/executionGraph"; -import { IgnitionError } from "../../utils/errors"; +import { IgnitionError } from "../../../errors"; import { isDependable, isEventParam, isProxy } from "../../utils/guards"; export function toAddress(v: any) { diff --git a/packages/core/src/internal/execution/execute.ts b/packages/core/src/internal/execution/execute.ts index 3b723fc8ed..7933eddac9 100644 --- a/packages/core/src/internal/execution/execute.ts +++ b/packages/core/src/internal/execution/execute.ts @@ -9,8 +9,8 @@ import type { } from "../types/executionGraph"; import type { Services } from "../types/services"; +import { IgnitionError } from "../../errors"; import { viewExecutionResults } from "../deployment/utils"; -import { IgnitionError } from "../utils/errors"; import { ExecutionGraph } from "./ExecutionGraph"; import { executionDispatch } from "./dispatch/executionDispatch"; diff --git a/packages/core/src/internal/graph/adjacencyList.ts b/packages/core/src/internal/graph/adjacencyList.ts index d2b836dd4b..f66b253899 100644 --- a/packages/core/src/internal/graph/adjacencyList.ts +++ b/packages/core/src/internal/graph/adjacencyList.ts @@ -1,7 +1,7 @@ import { DiGraph, TopologicalSort } from "js-graph-algorithms"; +import { IgnitionError } from "../../errors"; import { AdjacencyList } from "../types/graph"; -import { IgnitionError } from "../utils/errors"; export function constructEmptyAdjacencyList(): AdjacencyList { return new Map>(); diff --git a/packages/core/src/internal/graph/visit.ts b/packages/core/src/internal/graph/visit.ts index b126d3f16c..b2cf2d6e18 100644 --- a/packages/core/src/internal/graph/visit.ts +++ b/packages/core/src/internal/graph/visit.ts @@ -1,10 +1,10 @@ +import { IgnitionError } from "../../errors"; import { IGraph, VertexVisitResult, ResultsAccumulator, VisitResult, } from "../types/graph"; -import { IgnitionError } from "../utils/errors"; export async function visit( phase: "Execution" | "Validation", diff --git a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts index 5f841d5614..0548bcc80a 100644 --- a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts @@ -5,8 +5,8 @@ import type { } from "../types/deploymentGraph"; import { DeploymentBuilder } from "../../dsl/DeploymentBuilder"; +import { IgnitionError } from "../../errors"; import { Module, ModuleDict } from "../../types/module"; -import { IgnitionError } from "../utils/errors"; import { assertModuleReturnTypes } from "../utils/guards"; export function generateDeploymentGraphFrom( diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index a06d59181e..2797d3142f 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,5 +1,6 @@ import { BigNumber, ethers } from "ethers"; +import { IgnitionError } from "../../../errors"; import { BytesFuture, DeploymentGraphFuture, @@ -29,7 +30,6 @@ import { SentETH, } from "../../types/executionGraph"; import { Services } from "../../types/services"; -import { IgnitionError } from "../../utils/errors"; import { isBytesArg, isFuture } from "../../utils/guards"; interface TransformContext { diff --git a/packages/core/src/internal/services/ContractsService.ts b/packages/core/src/internal/services/ContractsService.ts index bdc6fefa16..e26795a1c2 100644 --- a/packages/core/src/internal/services/ContractsService.ts +++ b/packages/core/src/internal/services/ContractsService.ts @@ -7,7 +7,7 @@ import type { import setupDebug from "debug"; import { ethers } from "ethers"; -import { IgnitionError } from "../utils/errors"; +import { IgnitionError } from "../../errors"; import { sleep } from "../utils/sleep"; import { TxSender } from "../utils/tx-sender"; diff --git a/packages/core/src/internal/utils/collectLibrariesAndLink.ts b/packages/core/src/internal/utils/collectLibrariesAndLink.ts index 2e32602318..1991ca27f6 100644 --- a/packages/core/src/internal/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/internal/utils/collectLibrariesAndLink.ts @@ -1,8 +1,7 @@ // eslint-disable-next-line import/no-extraneous-dependencies +import { IgnitionError } from "../../errors"; import { Artifact } from "../../types/hardhat"; -import { IgnitionError } from "./errors"; - interface Link { sourceName: string; libraryName: string; diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 4fa84a4e02..2c5344dec1 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -24,11 +24,10 @@ import type { import { BigNumber } from "ethers"; +import { IgnitionError } from "../../errors"; import { Artifact } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; -import { IgnitionError } from "./errors"; - export function isArtifact(artifact: any): artifact is Artifact { return ( artifact !== null && diff --git a/packages/core/src/internal/utils/paramAssertions.ts b/packages/core/src/internal/utils/paramAssertions.ts new file mode 100644 index 0000000000..c11a8bc3b9 --- /dev/null +++ b/packages/core/src/internal/utils/paramAssertions.ts @@ -0,0 +1,23 @@ +import { BigNumber } from "ethers"; + +import { IgnitionError } from "../../errors"; + +export function assertStringParam(param: any, paramName: string) { + if (typeof param !== "string") { + throw new IgnitionError(`\`${paramName}\` must be a string`); + } +} + +export function assertFunctionParam(param: any, paramName: string) { + if (typeof param !== "function") { + throw new IgnitionError(`\`${paramName}\` must be a function`); + } +} + +export function assertBigNumberParam(param: any, paramName: string) { + if (param !== undefined) { + if (!BigNumber.isBigNumber(param)) { + throw new IgnitionError(`\`${paramName}\` must be a BigNumber`); + } + } +} diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts index ab174abc18..789dc11132 100644 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -1,13 +1,13 @@ import type { CallableFuture } from "../../../types/future"; import type { Services } from "../../types/services"; +import { IgnitionError } from "../../../errors"; import { CallPoints, DeploymentGraphVertex, InternalParamValue, } from "../../types/deploymentGraph"; import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; -import { IgnitionError } from "../../utils/errors"; import { isBytesArg } from "../../utils/guards"; import { resolveProxyValue } from "../../utils/proxy"; diff --git a/packages/core/src/internal/validation/validateDeploymentGraph.ts b/packages/core/src/internal/validation/validateDeploymentGraph.ts index 70b8053ea8..dc2499b18b 100644 --- a/packages/core/src/internal/validation/validateDeploymentGraph.ts +++ b/packages/core/src/internal/validation/validateDeploymentGraph.ts @@ -1,9 +1,9 @@ +import { IgnitionError } from "../../errors"; import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; import { Services } from "../types/services"; import { ValidationVisitResult } from "../types/validation"; -import { IgnitionError } from "../utils/errors"; import { validationDispatch } from "./dispatch/validationDispatch"; diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index 91fe92f99a..f5ef40867b 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -2,8 +2,8 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; +import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IgnitionError } from "../../src/internal/utils/errors"; describe("deployment builder - buildModule", () => { it("should throw if build module is given an async callback", () => { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index b9ed7fe386..ad0dcbc380 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -7,8 +7,8 @@ import type { import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; +import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IgnitionError } from "../../src/internal/utils/errors"; import { isCallable } from "../../src/internal/utils/guards"; describe("deployment builder - parameters", function () { diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index b3c008811d..55167a49df 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -1,5 +1,6 @@ import { ethers } from "ethers"; +import { IgnitionError } from "../src/errors"; import { Services, TransactionOptions, @@ -10,7 +11,6 @@ import { IArtifactsService, IAccountsService, } from "../src/internal/types/services"; -import { IgnitionError } from "../src/internal/utils/errors"; import { Artifact } from "../src/types/hardhat"; import { HasParamResult } from "../src/types/providers"; diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 48ad20ce15..9546bdc153 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -6,10 +6,10 @@ import { ethers } from "ethers"; import sinon from "sinon"; import { buildModule } from "../src/dsl/buildModule"; +import { IgnitionValidationError } from "../src/errors"; import { generateDeploymentGraphFrom } from "../src/internal/process/generateDeploymentGraphFrom"; import { Services } from "../src/internal/types/services"; import { ValidationVisitResult } from "../src/internal/types/validation"; -import { IgnitionValidationError } from "../src/internal/utils/errors"; import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index 90f668c0fd..dd65135e31 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -4,7 +4,7 @@ import { HasParamResult, ModuleParams, } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/helpers"; +import { IgnitionError } from "@ignored/ignition-core/errors"; export class ConfigWrapper implements ConfigProvider { public parameters: ModuleParams | undefined; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index e297314645..38ff5044e4 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -10,7 +10,8 @@ import { ICommandJournal, SerializedDeploymentResult, } from "@ignored/ignition-core"; -import { IgnitionError, createServices } from "@ignored/ignition-core/helpers"; +import { IgnitionError } from "@ignored/ignition-core/errors"; +import { createServices } from "@ignored/ignition-core/helpers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index ab28e5068a..c94c26b081 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,5 +1,5 @@ import { Module, ModuleDict } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/helpers"; +import { IgnitionError } from "@ignored/ignition-core/errors"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index e1cf8c8c43..da0e4cbcb7 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -1,5 +1,5 @@ import { DeployState } from "@ignored/ignition-core"; -import { IgnitionValidationError } from "@ignored/ignition-core/helpers"; +import { IgnitionValidationError } from "@ignored/ignition-core/errors"; import { Box, Text } from "ink"; import { relative } from "path"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index fbc5ff36f5..044c363e53 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -1,5 +1,5 @@ import { DeployState } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/helpers"; +import { IgnitionError } from "@ignored/ignition-core/errors"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index 4626cacc23..d558633f0c 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -3,7 +3,7 @@ import { ModuleParams, UpdateUiAction, } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/helpers"; +import { IgnitionError } from "@ignored/ignition-core/errors"; import { render } from "ink"; import { IgnitionUi } from "./components"; From 6d135d893a06fc691eb57b2ef9dede68a69f51c5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 22 Mar 2023 00:29:52 -0400 Subject: [PATCH 0259/1302] implemented getArtifact and deprecate getBytesForArtifact --- docs/creating-modules-for-deployment.md | 4 +- .../create2/ignition/Create2FactoryModule.js | 12 +- examples/multisig/ignition/MultisigModule.js | 4 +- packages/core/src/Ignition.ts | 9 +- packages/core/src/dsl/DeploymentBuilder.ts | 24 ++-- .../internal/deployment/deployStateReducer.ts | 1 + ...onvertDeploymentVertexToExecutionVertex.ts | 27 +---- .../src/internal/services/ArtifactsService.ts | 4 + .../core/src/internal/types/deployment.ts | 6 +- .../src/internal/types/deploymentGraph.ts | 4 +- packages/core/src/internal/types/services.ts | 1 + packages/core/src/internal/utils/guards.ts | 30 ++--- .../internal/validation/dispatch/helpers.ts | 35 +----- .../dispatch/validateArtifactContract.ts | 14 +-- .../dispatch/validateArtifactLibrary.ts | 12 +- .../validation/dispatch/validateCall.ts | 11 -- .../validation/dispatch/validateEvent.ts | 11 -- .../dispatch/validateHardhatContract.ts | 12 +- .../dispatch/validateHardhatLibrary.ts | 12 +- packages/core/src/types/future.ts | 7 -- packages/core/src/types/providers.ts | 1 + .../core/test/deploymentBuilder/accounts.ts | 1 + .../test/deploymentBuilder/buildModule.ts | 2 + packages/core/test/deploymentBuilder/calls.ts | 1 + .../core/test/deploymentBuilder/deploy.ts | 1 + packages/core/test/deploymentBuilder/event.ts | 1 + .../deploymentBuilder/getBytesForArtifact.ts | 93 --------------- .../core/test/deploymentBuilder/libraries.ts | 1 + .../core/test/deploymentBuilder/metadata.ts | 7 +- .../core/test/deploymentBuilder/parameters.ts | 1 + .../core/test/deploymentBuilder/sendETH.ts | 1 + .../core/test/deploymentBuilder/useModule.ts | 2 + packages/core/test/deploymentBuilder/value.ts | 1 + packages/core/test/execution/rerun.ts | 4 + packages/core/test/helpers.ts | 4 + packages/core/test/state-reducer/utils.ts | 2 + packages/core/test/validation.ts | 109 +----------------- .../src/buildIgnitionProvidersFrom.ts | 9 ++ 38 files changed, 107 insertions(+), 374 deletions(-) delete mode 100644 packages/core/test/deploymentBuilder/getBytesForArtifact.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 2a48f7f6bf..88d02821d0 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -171,11 +171,13 @@ Given the `create2` factory, you can deploy a contract via the factory by: module.exports = buildModule("Create2Example", (m) => { const create2 = m.contract("Create2Factory"); + const fooArtifact = m.getArtifact("Foo"); + const fooAddress = m.call(create2, "deploy", { args: [ 0, // amount toBytes32(1), // salt - m.getBytesForArtifact("Foo"), // contract bytecode + fooArtifact.bytecode, // contract bytecode ], }); diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js index 217fd05745..945e966836 100644 --- a/examples/create2/ignition/Create2FactoryModule.js +++ b/examples/create2/ignition/Create2FactoryModule.js @@ -1,14 +1,14 @@ const { buildModule } = require("@ignored/hardhat-ignition"); -const Create2Artifact = require("../artifacts/contracts/Create2Factory.sol/Create2Factory.json"); -const BarArtifact = require("../artifacts/contracts/Bar.sol/Bar.json"); -const FooArtifact = require("../artifacts/contracts/Foo.sol/Foo.json"); - module.exports = buildModule("Create2Factory", (m) => { + const Create2Artifact = m.getArtifact("Create2Factory"); + const BarArtifact = m.getArtifact("Bar"); + const FooArtifact = m.getArtifact("Foo"); + const create2 = m.contract("Create2Factory", Create2Artifact, { args: [] }); const fooCall = m.call(create2, "deploy", { - args: [0, toBytes32(1), m.getBytesForArtifact("Foo")], + args: [0, toBytes32(1), FooArtifact.bytecode], }); const fooEvent = m.event(create2, "Deployed", { @@ -17,7 +17,7 @@ module.exports = buildModule("Create2Factory", (m) => { }); const barCall = m.call(create2, "deploy", { - args: [0, toBytes32(2), m.getBytesForArtifact("Bar")], + args: [0, toBytes32(2), BarArtifact.bytecode], after: [fooEvent], }); diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js index d9e6ef55f9..e04ee882ba 100644 --- a/examples/multisig/ignition/MultisigModule.js +++ b/examples/multisig/ignition/MultisigModule.js @@ -1,9 +1,9 @@ const { ethers } = require("ethers"); const { buildModule } = require("@ignored/hardhat-ignition"); -const MultisigArtifact = require("../artifacts/contracts/Multisig.sol/Multisig.json"); - module.exports = buildModule("MultisigModule", (m) => { + const MultisigArtifact = m.getArtifact("Multisig"); + const [ACCOUNT_0, ACCOUNT_1] = m.accounts; const owners = [ACCOUNT_0, ACCOUNT_1]; diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 016cb8917b..0abf768928 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -64,14 +64,16 @@ export class Ignition { ); try { - const [chainId, accounts] = await Promise.all([ + const [chainId, accounts, artifacts] = await Promise.all([ this._services.network.getChainId(), this._services.accounts.getAccounts(), + this._services.artifacts.getAllArtifacts(), ]); await deployment.setDeploymentDetails({ accounts, chainId, + artifacts, networkName: options.networkName, force: options.force, }); @@ -135,9 +137,10 @@ export class Ignition { ): Promise { log(`Start plan`); - const [chainId, accounts] = await Promise.all([ + const [chainId, accounts, artifacts] = await Promise.all([ this._services.network.getChainId(), this._services.accounts.getAccounts(), + this._services.artifacts.getAllArtifacts(), ]); const { graph: deploymentGraph, callPoints } = generateDeploymentGraphFrom( @@ -145,6 +148,7 @@ export class Ignition { { chainId, accounts, + artifacts, } ); @@ -184,6 +188,7 @@ export class Ignition { } = generateDeploymentGraphFrom(ignitionModule, { chainId: deployment.state.details.chainId, accounts: deployment.state.details.accounts, + artifacts: deployment.state.details.artifacts, }); await deployment.startValidation(); diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 60f5cc5b51..5ea5271f05 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -14,7 +14,6 @@ import type { DependableFuture, ProxyFuture, EventFuture, - BytesFuture, EventParams, ArtifactFuture, EventParamFuture, @@ -66,6 +65,10 @@ import { resolveProxyDependency } from "../internal/utils/proxy"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; +interface ArtifactMap { + [contractName: string]: Artifact; +} + type DeploymentApiPublicFunctions = | InstanceType["contract"] | InstanceType["library"] @@ -87,12 +90,17 @@ export class DeploymentBuilder implements IDeploymentBuilder { private moduleCache: ModuleCache = {}; private useModuleInvocationCounter: number = 0; private scopes: ScopeStack = new ScopeStack(); + private artifactMap: ArtifactMap = {}; constructor(options: DeploymentBuilderOptions) { this.chainId = options.chainId; this.accounts = options.accounts; this.graph = new DeploymentGraph(); this.callPoints = {}; + + for (const artifact of options.artifacts) { + this.artifactMap[artifact.contractName] = artifact; + } } public library( @@ -450,14 +458,14 @@ export class DeploymentBuilder implements IDeploymentBuilder { return paramFuture; } - public getBytesForArtifact(artifactName: string): BytesFuture { - const bytesFuture: BytesFuture = { - label: artifactName, - type: "bytes", - _future: true, - }; + public getArtifact(contractName: string): Artifact { + const artifact = this.artifactMap[contractName]; + + if (artifact === undefined) { + throw new IgnitionError(`Artifact ${contractName} does not exist`); + } - return bytesFuture; + return artifact; } public useModule( diff --git a/packages/core/src/internal/deployment/deployStateReducer.ts b/packages/core/src/internal/deployment/deployStateReducer.ts index 6cac8e1618..bb47f8bd7d 100644 --- a/packages/core/src/internal/deployment/deployStateReducer.ts +++ b/packages/core/src/internal/deployment/deployStateReducer.ts @@ -18,6 +18,7 @@ export function initializeDeployState(moduleName: string): DeployState { chainId: 0, networkName: "", accounts: [], + artifacts: [], force: false, }, validation: { diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index 2797d3142f..b12836a20a 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,23 +1,19 @@ import { BigNumber, ethers } from "ethers"; import { IgnitionError } from "../../../errors"; -import { - BytesFuture, - DeploymentGraphFuture, - EventParamFuture, -} from "../../../types/future"; +import { DeploymentGraphFuture, EventParamFuture } from "../../../types/future"; import { Artifact } from "../../../types/hardhat"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, CallDeploymentVertex, DeployedContractDeploymentVertex, + DeploymentGraphVertex, + EventVertex, + ExternalParamValue, HardhatContractDeploymentVertex, HardhatLibraryDeploymentVertex, IDeploymentGraph, - DeploymentGraphVertex, - ExternalParamValue, - EventVertex, SendVertex, } from "../../types/deploymentGraph"; import { @@ -30,7 +26,7 @@ import { SentETH, } from "../../types/executionGraph"; import { Services } from "../../types/services"; -import { isBytesArg, isFuture } from "../../utils/guards"; +import { isFuture } from "../../utils/guards"; interface TransformContext { services: Services; @@ -245,9 +241,7 @@ async function convertArgs( const resolvedArgs = []; for (const arg of args) { - const resolvedArg = isBytesArg(arg) - ? await resolveBytesForArtifact(arg, transformContext.services) - : await resolveParameter(arg, transformContext); + const resolvedArg = await resolveParameter(arg, transformContext); resolvedArgs.push(resolvedArg); } @@ -299,12 +293,3 @@ async function resolveParameter( return services.config.getParam(arg.label); } - -async function resolveBytesForArtifact( - arg: BytesFuture, - services: Services -): Promise { - const artifact = await services.artifacts.getArtifact(arg.label); - - return artifact.bytecode; -} diff --git a/packages/core/src/internal/services/ArtifactsService.ts b/packages/core/src/internal/services/ArtifactsService.ts index 7913d197a5..86d3403d34 100644 --- a/packages/core/src/internal/services/ArtifactsService.ts +++ b/packages/core/src/internal/services/ArtifactsService.ts @@ -12,4 +12,8 @@ export class ArtifactsService implements IArtifactsService { public hasArtifact(name: string): Promise { return this._providers.artifacts.hasArtifact(name); } + + public getAllArtifacts(): Promise { + return this._providers.artifacts.getAllArtifacts(); + } } diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts index fe50e220ec..9df2fae407 100644 --- a/packages/core/src/internal/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -12,7 +12,10 @@ import type { VertexVisitResultSuccess, } from "./graph"; import type { Services } from "./services"; -import type { BigNumber } from "ethers"; + +import { BigNumber } from "ethers"; + +import { Artifact } from "../../types/hardhat"; export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; @@ -146,6 +149,7 @@ export interface DeployNetworkConfig { chainId: number; networkName: string; accounts: string[]; + artifacts: Artifact[]; force: boolean; } diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index a2db90c3a2..52d659f62e 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -15,7 +15,6 @@ import { CallableFuture, Virtual, ParameterFuture, - BytesFuture, ArtifactFuture, EventParamFuture, SendFuture, @@ -227,7 +226,7 @@ export interface IDeploymentBuilder { defaultValue: ParameterValue ): OptionalParameter; - getBytesForArtifact(artifactName: string): BytesFuture; + getArtifact(contractName: string): Artifact; useModule( module: Module, @@ -238,6 +237,7 @@ export interface IDeploymentBuilder { export interface DeploymentBuilderOptions { chainId: number; accounts: string[]; + artifacts: Artifact[]; } export interface CallPoints { diff --git a/packages/core/src/internal/types/services.ts b/packages/core/src/internal/types/services.ts index 0b6f64efea..159cda774a 100644 --- a/packages/core/src/internal/types/services.ts +++ b/packages/core/src/internal/types/services.ts @@ -16,6 +16,7 @@ export interface IAccountsService { export interface IArtifactsService { getArtifact(name: string): Promise; hasArtifact(name: string): Promise; + getAllArtifacts(): Promise; } export interface IConfigService { diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 2c5344dec1..954ba4297e 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -1,29 +1,25 @@ import type { CallableFuture, + ContractFuture, DependableFuture, - OptionalParameter, DeploymentGraphFuture, + EventParamFuture, + OptionalParameter, + ProxyFuture, RequiredParameter, Virtual, - ProxyFuture, - BytesFuture, - EventParamFuture, - ContractFuture, } from "../../types/future"; import type { - DeploymentGraphVertex, - HardhatContractDeploymentVertex, ArtifactContractDeploymentVertex, - DeployedContractDeploymentVertex, - CallDeploymentVertex, - HardhatLibraryDeploymentVertex, ArtifactLibraryDeploymentVertex, + CallDeploymentVertex, + DeployedContractDeploymentVertex, + DeploymentGraphVertex, EventVertex, - InternalParamValue, + HardhatContractDeploymentVertex, + HardhatLibraryDeploymentVertex, } from "../types/deploymentGraph"; -import { BigNumber } from "ethers"; - import { IgnitionError } from "../../errors"; import { Artifact } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; @@ -119,14 +115,6 @@ export function isParameter( return future.type === "parameter"; } -export function isBytesArg(arg: InternalParamValue): arg is BytesFuture { - return ( - typeof arg === "object" && - !BigNumber.isBigNumber(arg) && - arg.type === "bytes" - ); -} - export function isCallable( future: DeploymentGraphFuture ): future is CallableFuture { diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts index 789dc11132..30b3cc66e4 100644 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -2,13 +2,8 @@ import type { CallableFuture } from "../../../types/future"; import type { Services } from "../../types/services"; import { IgnitionError } from "../../../errors"; -import { - CallPoints, - DeploymentGraphVertex, - InternalParamValue, -} from "../../types/deploymentGraph"; +import { CallPoints, DeploymentGraphVertex } from "../../types/deploymentGraph"; import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; -import { isBytesArg } from "../../utils/guards"; import { resolveProxyValue } from "../../utils/proxy"; export async function resolveArtifactForCallableFuture( @@ -51,34 +46,6 @@ export async function resolveArtifactForCallableFuture( } } -export async function validateBytesForArtifact({ - vertex, - callPoints, - services, -}: { - vertex: DeploymentGraphVertex & { args: InternalParamValue[] }; - callPoints: CallPoints; - services: Services; -}): Promise { - const bytesArgs = vertex.args.filter(isBytesArg); - - const bytesExists = await Promise.all( - bytesArgs.map((v) => services.artifacts.hasArtifact(v.label)) - ); - - const bytesDoesNotExistIndex = bytesExists.findIndex((v) => !v); - - if (bytesDoesNotExistIndex === -1) { - return null; - } - - return buildValidationError( - vertex, - `Artifact with name '${bytesArgs[bytesDoesNotExistIndex].label}' doesn't exist`, - callPoints - ); -} - export function buildValidationError( vertex: DeploymentGraphVertex, message: string, diff --git a/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts b/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts index 4e212faf18..fb01b620a3 100644 --- a/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts +++ b/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts @@ -9,12 +9,12 @@ import { } from "../../types/validation"; import { isArtifact, isParameter } from "../../utils/guards"; -import { buildValidationError, validateBytesForArtifact } from "./helpers"; +import { buildValidationError } from "./helpers"; export async function validateArtifactContract( vertex: ArtifactContractDeploymentVertex, _resultAccumulator: ValidationResultsAccumulator, - { callPoints, services }: ValidationDispatchContext + { callPoints }: ValidationDispatchContext ): Promise { if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { return buildValidationError( @@ -32,16 +32,6 @@ export async function validateArtifactContract( ); } - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints, - services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { diff --git a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts index f8223f5892..9f7207eaca 100644 --- a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts @@ -9,7 +9,7 @@ import { } from "../../types/validation"; import { isArtifact } from "../../utils/guards"; -import { buildValidationError, validateBytesForArtifact } from "./helpers"; +import { buildValidationError } from "./helpers"; export async function validateArtifactLibrary( vertex: ArtifactLibraryDeploymentVertex, @@ -24,16 +24,6 @@ export async function validateArtifactLibrary( ); } - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints: context.callPoints, - services: context.services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - const artifactExists = isArtifact(vertex.artifact); if (!artifactExists) { diff --git a/packages/core/src/internal/validation/dispatch/validateCall.ts b/packages/core/src/internal/validation/dispatch/validateCall.ts index 56fcd37383..b1567afb75 100644 --- a/packages/core/src/internal/validation/dispatch/validateCall.ts +++ b/packages/core/src/internal/validation/dispatch/validateCall.ts @@ -12,7 +12,6 @@ import { isParameter } from "../../utils/guards"; import { buildValidationError, resolveArtifactForCallableFuture, - validateBytesForArtifact, } from "./helpers"; export async function validateCall( @@ -36,16 +35,6 @@ export async function validateCall( ); } - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints: context.callPoints, - services: context.services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - const contractName = vertex.contract.label; const artifactAbi = await resolveArtifactForCallableFuture( diff --git a/packages/core/src/internal/validation/dispatch/validateEvent.ts b/packages/core/src/internal/validation/dispatch/validateEvent.ts index 16dab41889..9c8d476e6a 100644 --- a/packages/core/src/internal/validation/dispatch/validateEvent.ts +++ b/packages/core/src/internal/validation/dispatch/validateEvent.ts @@ -11,7 +11,6 @@ import { import { buildValidationError, resolveArtifactForCallableFuture, - validateBytesForArtifact, } from "./helpers"; export async function validateEvent( @@ -19,16 +18,6 @@ export async function validateEvent( _resultAccumulator: ValidationResultsAccumulator, { callPoints, services }: ValidationDispatchContext ): Promise { - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints, - services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - let artifactAbi: any[] | undefined; if (typeof vertex.address === "string") { if (!ethers.utils.isAddress(vertex.address)) { diff --git a/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts b/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts index 8f87a6b6a8..1f573778cb 100644 --- a/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts +++ b/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts @@ -9,7 +9,7 @@ import { } from "../../types/validation"; import { isParameter } from "../../utils/guards"; -import { buildValidationError, validateBytesForArtifact } from "./helpers"; +import { buildValidationError } from "./helpers"; export async function validateHardhatContract( vertex: HardhatContractDeploymentVertex, @@ -32,16 +32,6 @@ export async function validateHardhatContract( ); } - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints, - services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - const artifactExists = await services.artifacts.hasArtifact( vertex.contractName ); diff --git a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts index d7faf71bcf..7c7e4269d7 100644 --- a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts @@ -8,7 +8,7 @@ import { ValidationVertexVisitResult, } from "../../types/validation"; -import { buildValidationError, validateBytesForArtifact } from "./helpers"; +import { buildValidationError } from "./helpers"; export async function validateHardhatLibrary( vertex: HardhatLibraryDeploymentVertex, @@ -23,16 +23,6 @@ export async function validateHardhatLibrary( ); } - const invalidBytes = await validateBytesForArtifact({ - vertex, - callPoints, - services, - }); - - if (invalidBytes !== null) { - return invalidBytes; - } - const artifactExists = await services.artifacts.hasArtifact( vertex.libraryName ); diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 772eaee4bb..21c5eb85db 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -101,12 +101,6 @@ export interface OptionalParameter { _future: true; } -export interface BytesFuture { - label: string; - type: "bytes"; - _future: true; -} - export interface Virtual { vertexId: number; label: string; @@ -152,7 +146,6 @@ export type ParameterFuture = RequiredParameter | OptionalParameter; export type DeploymentGraphFuture = | DependableFuture | ParameterFuture - | BytesFuture | EventParamFuture; export interface FutureDict { diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 5ad2c9e4e9..5734f2bfb3 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -16,6 +16,7 @@ export interface Providers { export interface ArtifactsProvider { getArtifact: (name: string) => Promise; hasArtifact: (name: string) => Promise; + getAllArtifacts: () => Promise; } export interface EIP1193Provider { diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index 8687faa4dc..754d2cb6d6 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -38,6 +38,7 @@ describe("deployment builder - accounts", () => { "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", ], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index f5ef40867b..2f38509c11 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -15,6 +15,7 @@ describe("deployment builder - buildModule", () => { return generateDeploymentGraphFrom(badAsyncModule, { chainId: 31337, accounts: [], + artifacts: [], }); }, /The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./); }); @@ -28,6 +29,7 @@ describe("deployment builder - buildModule", () => { return generateDeploymentGraphFrom(badAsyncModule, { chainId: 31337, accounts: [], + artifacts: [], }); }, /User thrown error/); }); diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index fdad3f965e..32820318d7 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -35,6 +35,7 @@ describe("deployment builder - chainId", () => { const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 933f307cb6..51dc415ec0 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -24,6 +24,7 @@ describe("deployment builder - deploy", function () { const options = { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }; describe("single contract", () => { diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 188b76e6df..edf4c749fd 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -91,6 +91,7 @@ describe("deployment builder - await event", () => { const { graph } = generateDeploymentGraphFrom(eventModule, { chainId: 31337, accounts: [], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts b/packages/core/test/deploymentBuilder/getBytesForArtifact.ts deleted file mode 100644 index eb0dd162b3..0000000000 --- a/packages/core/test/deploymentBuilder/getBytesForArtifact.ts +++ /dev/null @@ -1,93 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - IDeploymentBuilder, - IDeploymentGraph, -} from "../../src/internal/types/deploymentGraph"; -import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; - -import { getDeploymentVertexByLabel } from "./helpers"; - -describe("deployment builder - getBytesForArtifact", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const exchange = m.contract("Exchange"); - const another = m.contract("Another"); - - m.call(exchange, "addToken", { - args: [m.getBytesForArtifact("Token")], - after: [another], - }); - - return {}; - }); - - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - accounts: [], - }); - - deploymentGraph = graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); - }); - - it("should have the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange/addToken"); - assert(isCall(depNode)); - }); - - it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - label: "Token", - type: "bytes", - _future: true, - }, - ]); - }); -}); diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index d71c178953..0f61a97100 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -47,6 +47,7 @@ describe("deployment builder - libraries", () => { const { graph } = generateDeploymentGraphFrom(librariesModule, { chainId: 31, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts index 41d45626dd..4fec41cf11 100644 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -15,7 +15,11 @@ describe("deployment builder - metadata", () => { assert.fail("Chain id was not injected"); }); - generateDeploymentGraphFrom(chainIdModule, { chainId: 42, accounts: [] }); + generateDeploymentGraphFrom(chainIdModule, { + chainId: 42, + accounts: [], + artifacts: [], + }); }); it("should inject the accounts via the builder", () => { @@ -30,6 +34,7 @@ describe("deployment builder - metadata", () => { generateDeploymentGraphFrom(accountsModule, { chainId: 42, accounts: ["0x1", "0x2"], + artifacts: [], }); }); }); diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index ad0dcbc380..f889a4b268 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -43,6 +43,7 @@ describe("deployment builder - parameters", function () { const { graph } = generateDeploymentGraphFrom(WrapModule, { chainId: 31, accounts: [], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index bc9f1c5baa..9b1e81b077 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -31,6 +31,7 @@ describe("deployment builder - send ETH", () => { const { graph } = generateDeploymentGraphFrom(sendModule, { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index c3e1c26265..f3b36a2d70 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -28,6 +28,7 @@ describe("deployment builder - useModule", () => { const options = { chainId: 31, accounts: [], + artifacts: [], }; describe("use one module from another", () => { @@ -521,6 +522,7 @@ describe("deployment builder - useModule", () => { generateDeploymentGraphFrom(returnsWrongFutureTypeModule, { chainId: 31, accounts: [], + artifacts: [], }), /Cannot return Future of type "parameter" from a module/ ); diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 7c1a17664f..557d640a93 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -46,6 +46,7 @@ describe("deployment builder - value", () => { const { graph } = generateDeploymentGraphFrom(callModule, { chainId: 31337, accounts: [], + artifacts: [], }); deploymentGraph = graph; diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 5470e285c1..b5224b492b 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -68,6 +68,7 @@ describe("Rerunning execution", () => { artifacts: { hasArtifact: () => true, getArtifact: () => tokenArtifact, + getAllArtifacts: () => [tokenArtifact], }, transactions: { wait: (tx: string) => { @@ -198,6 +199,7 @@ describe("Rerunning execution", () => { artifacts: { hasArtifact: () => true, getArtifact: () => tokenArtifact, + getAllArtifacts: () => [tokenArtifact], }, transactions: { wait: (tx: string) => { @@ -295,6 +297,7 @@ describe("Rerunning execution", () => { artifacts: { hasArtifact: () => true, getArtifact: () => tokenArtifact, + getAllArtifacts: () => [tokenArtifact], }, transactions: new TransactionsService({} as Providers), accounts: { @@ -338,6 +341,7 @@ describe("Rerunning execution", () => { artifacts: { hasArtifact: () => true, getArtifact: () => tokenArtifact, + getAllArtifacts: () => [tokenArtifact], }, contracts: { transactionCount: 0, diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 55167a49df..06db494eae 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -58,6 +58,10 @@ class MockArtifactsService implements IArtifactsService { public getArtifact(_name: string): Promise { throw new IgnitionError("Method not implemented."); } + + public getAllArtifacts(): Promise { + throw new IgnitionError("Method not implemented"); + } } class MockTransactionService implements ITransactionsService { diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 409a3b37c9..1989a33207 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -22,6 +22,7 @@ export async function resolveExecutionGraphFor(module: Module) { const { graph: deploymentGraph } = generateDeploymentGraphFrom(module, { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }); const mockServices = { @@ -38,6 +39,7 @@ export async function resolveExecutionGraphFor(module: Module) { linkReferences: {}, deployedLinkReferences: {}, }), + getAllArtifacts: () => [], }, accounts: { getAccounts: () => { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 9546bdc153..0844202846 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -3,7 +3,6 @@ import type { IDeploymentBuilder } from "../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { ethers } from "ethers"; -import sinon from "sinon"; import { buildModule } from "../src/dsl/buildModule"; import { IgnitionValidationError } from "../src/errors"; @@ -91,32 +90,6 @@ describe("Validation", () => { "For contract 'from' must be a valid address string" ); }); - - it("should not validate a artifact contract deploy with a non-existent bytes artifact arg", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", exampleArtifact, { - args: [1, 2, m.getBytesForArtifact("Nonexistant")], - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact(_name: string) { - return false; - }, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Artifact with name 'Nonexistant' doesn't exist" - ); - }); }); describe("artifact library deploy", () => { @@ -166,32 +139,6 @@ describe("Validation", () => { "For library 'from' must be a valid address string" ); }); - - it("should not validate a artifact library deploy with a non-existent bytes artifact arg", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", exampleArtifact, { - args: [1, 2, m.getBytesForArtifact("Nonexistant")], - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact(_name: string) { - return false; - }, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Artifact with name 'Nonexistant' doesn't exist" - ); - }); }); describe("call", () => { @@ -449,37 +396,6 @@ describe("Validation", () => { "For call 'from' must be a valid address string" ); }); - - it("should fail a call with a non-existent bytes artifact arg", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "nonexistant", { - args: [m.getBytesForArtifact("Bar")], - }); - - return { example }; - }); - - const fakeHasArtifact = sinon.stub(); - fakeHasArtifact.onFirstCall().resolves(true); - fakeHasArtifact.onSecondCall().resolves(false); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: fakeHasArtifact, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Artifact with name 'Bar' doesn't exist" - ); - }); }); describe("sendETH", () => { @@ -845,30 +761,6 @@ describe("Validation", () => { "For contract 'from' must be a valid address string" ); }); - - it("should not validate a contract with non-existing bytes artifact arg", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const nonexistant = m.contract("Nonexistant", { - args: [m.getBytesForArtifact("Nonexistant")], - }); - - return { nonexistant }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => false, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Artifact with name 'Nonexistant' doesn't exist" - ); - }); }); describe("hardhat library deploy", () => { @@ -1003,6 +895,7 @@ async function runValidation( const { graph, callPoints } = generateDeploymentGraphFrom(ignitionModule, { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], }); const validationResult = await validateDeploymentGraph( diff --git a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts index b47cea42d7..8dc30a3d73 100644 --- a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts +++ b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts @@ -14,6 +14,15 @@ export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { return false; } }, + getAllArtifacts: async () => { + const names = await hre.artifacts.getAllFullyQualifiedNames(); + + const artifacts = await Promise.all( + names.map((n) => hre.artifacts.readArtifact(n)) + ); + + return artifacts; + }, }, gasProvider: { estimateGasLimit: async (tx: any) => { From ea16639bf63fefb2200ba4ca5a980f362f31a7ae Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 22 Mar 2023 00:51:29 -0400 Subject: [PATCH 0260/1302] added docs and tests --- docs/creating-modules-for-deployment.md | 24 +++++-- .../core/test/deploymentBuilder/artifacts.ts | 62 +++++++++++++++++++ 2 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 packages/core/test/deploymentBuilder/artifacts.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 88d02821d0..610e33e145 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -9,6 +9,7 @@ - [Constructor arguments](./creating-modules-for-deployment.md#constructor-arguments) - [Adding an endowment of _Eth_](./creating-modules-for-deployment.md#adding-an-endowment-of-eth) - [Dependencies between contracts](./creating-modules-for-deployment.md#dependencies-between-contracts) + - [Retrieving an artifact](./creating-modules-for-deployment.md#retrieving-an-artifact) - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) - [Deploying from an artifact](./creating-modules-for-deployment.md#deploying-from-an-artifact) - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) @@ -95,31 +96,41 @@ const b = m.contract("B", { }); ``` +### Retrieving an artifact + +You can use the module system itself to retrieve any of your locally compiled contract artifacts. This allows you to access and use the artifact ABI and bytecode wherever you'd like: + +```tsx +const artifact = m.getArtifact("Foo"); +``` + ### Using an existing contract A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and abi: ```tsx -const abi = [{...}] -const uniswap = m.contractAt("UniswapRouter", "0x123...", abi) +const artifact = m.getArtifact("UniswapRouter"); +const uniswap = m.contractAt("UniswapRouter", "0x123...", artifact.abi) m.call(uniswap, "swap", { ... }) ``` ### Deploying from an artifact -To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as an optional second parameter: +Additionally, `contract` supports passing an `Artifact` as an optional second parameter: ```javascript -const artifact = hre.artifacts.readArtifactSync("Foo"); - const userModule = buildModule("MyModule", (m) => { + const artifact = m.getArtifact("Foo"); + m.contract("Foo", artifact, { args: [0], }); }); ``` +This can be helpful when listening for [contract events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) + ### Linking libraries A library can be deployed and linked to a contract by passing the libraries contract future as a named entry under the libraries option: @@ -246,7 +257,8 @@ Because `totalSupply` is not a number, it is a future. A deployment can be put `on-hold` until an on-chain event has been emitted (for instance a timelock or multisig approval): ```tsx -const multisig = m.deploy("Multisig"); +const artifact = m.getArtifact("Multisig"); +const multisig = m.contract("Multisig", artifact, { args: [] }); const call = m.call(multisig, "authorize"); diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts new file mode 100644 index 0000000000..9f21b1a9b6 --- /dev/null +++ b/packages/core/test/deploymentBuilder/artifacts.ts @@ -0,0 +1,62 @@ +/* eslint-disable import/no-unused-modules */ +import type { + IDeploymentGraph, + IDeploymentBuilder, +} from "../../src/types/deploymentGraph"; + +import { assert } from "chai"; + +import { buildModule } from "../../src/dsl/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; +import { isArtifactContract } from "../../src/utils/guards"; + +import { getDeploymentVertexByLabel } from "./helpers"; + +describe("deployment builder - artifacts", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const artifactsModule = buildModule( + "artifacts", + (m: IDeploymentBuilder) => { + const artifact = m.getArtifact("Token"); + + const token = m.contract("Token", artifact); + + return { token }; + } + ); + + const { graph } = generateDeploymentGraphFrom(artifactsModule, { + chainId: 31337, + accounts: [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ], + artifacts: [ + { + contractName: "Token", + bytecode: "test", + abi: [], + linkReferences: {}, + }, + ], + }); + + deploymentGraph = graph; + }); + + it("should retrieve the stored artifact", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.fail("depNode not retrieved"); + } + + if (!isArtifactContract(depNode)) { + return assert.fail("unknown error"); + } + + assert.equal(depNode.artifact.bytecode, "test"); + }); +}); From 04bc5181cd570ca8aa9476b10b1383366cd2a07e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 22 Mar 2023 00:59:56 -0400 Subject: [PATCH 0261/1302] added another test --- .../core/test/deploymentBuilder/artifacts.ts | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts index 9f21b1a9b6..8195fa7801 100644 --- a/packages/core/test/deploymentBuilder/artifacts.ts +++ b/packages/core/test/deploymentBuilder/artifacts.ts @@ -1,14 +1,14 @@ /* eslint-disable import/no-unused-modules */ import type { - IDeploymentGraph, IDeploymentBuilder, -} from "../../src/types/deploymentGraph"; + IDeploymentGraph, +} from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/process/generateDeploymentGraphFrom"; -import { isArtifactContract } from "../../src/utils/guards"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { isArtifactContract } from "../../src/internal/utils/guards"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -59,4 +59,37 @@ describe("deployment builder - artifacts", () => { assert.equal(depNode.artifact.bytecode, "test"); }); + + it("should throw when trying to retrieve an invalid artifact", () => { + const artifactsModule = buildModule( + "artifacts", + (m: IDeploymentBuilder) => { + const artifact = m.getArtifact("None"); + + const token = m.contract("Token", artifact); + + return { token }; + } + ); + + assert.throws( + () => + generateDeploymentGraphFrom(artifactsModule, { + chainId: 31337, + accounts: [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ], + artifacts: [ + { + contractName: "Token", + bytecode: "test", + abi: [], + linkReferences: {}, + }, + ], + }), + /Artifact None does not exist/ + ); + }); }); From 2ae36a07b58a1a73733606c806206e90aacbcf55 Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 27 Mar 2023 19:37:53 -0400 Subject: [PATCH 0262/1302] Revert doc change --- docs/creating-modules-for-deployment.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 610e33e145..1e14791107 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -117,20 +117,18 @@ m.call(uniswap, "swap", { ... }) ### Deploying from an artifact -Additionally, `contract` supports passing an `Artifact` as an optional second parameter: +To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as an optional second parameter: ```javascript -const userModule = buildModule("MyModule", (m) => { - const artifact = m.getArtifact("Foo"); +const artifact = hre.artifacts.readArtifactSync("Foo"); +const userModule = buildModule("MyModule", (m) => { m.contract("Foo", artifact, { args: [0], }); }); ``` -This can be helpful when listening for [contract events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - ### Linking libraries A library can be deployed and linked to a contract by passing the libraries contract future as a named entry under the libraries option: From 0b3a5cb050e4c5f5dab3b0bb6e208a5a1f275ddc Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 28 Mar 2023 15:26:56 +0100 Subject: [PATCH 0263/1302] refactor: remove export of individual services (#180) The ContractServices and TransactionServices exports were only for test use. The existing test of config has been split, the integration tests have been reduced to very simple checks that we load options for Ignition properly. The config tests proper have been shifted to core but now only test from the `Ignition` object being initialized to the config options use. Combined these give _close_ to equivalent coverage. Part of #171. --- packages/core/src/helpers.ts | 4 +- packages/core/test/options.ts | 127 ++++++++++++++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 12 +- packages/hardhat-plugin/test/config.ts | 90 +++---------- 4 files changed, 155 insertions(+), 78 deletions(-) create mode 100644 packages/core/test/options.ts diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts index a588bc6265..1326da3947 100644 --- a/packages/core/src/helpers.ts +++ b/packages/core/src/helpers.ts @@ -1,6 +1,4 @@ export { viewExecutionResults } from "./internal/deployment/utils"; export { createServices } from "./internal/services/createServices"; -export { serializeReplacer } from "./internal/utils/serialize"; -export { TransactionsService } from "./internal/services/TransactionsService"; -export { ContractsService } from "./internal/services/ContractsService"; export { VertexResultEnum } from "./internal/types/graph"; +export { serializeReplacer } from "./internal/utils/serialize"; diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts new file mode 100644 index 0000000000..03868c2a76 --- /dev/null +++ b/packages/core/test/options.ts @@ -0,0 +1,127 @@ +/* eslint-disable import/no-unused-modules */ + +import { assert } from "chai"; +import { BigNumber, ethers } from "ethers"; + +import { buildModule, Ignition } from "../src"; +import { Artifact } from "../src/types/hardhat"; + +import { getMockServices } from "./helpers"; + +describe("deploy options", () => { + const tokenArtifact: Artifact = { + contractName: "Token", + abi: [ + { + name: "ConfigComplete", + type: "event", + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "name", + type: "address", + }, + ], + }, + { + inputs: [ + { + internalType: "uint256", + name: "supply", + type: "uint256", + }, + ], + name: "configure", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + bytecode: "0x0000000001", + linkReferences: {}, + }; + + let ignition: Ignition; + let capturedTxOptions: any = null; + + before(async function () { + const services = getMockServices(); + + ignition = new Ignition({ + services: { + ...services, + accounts: { + ...services.accounts, + getAccounts: async () => { + return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; + }, + getSigner: async (_address: string) => { + return new ethers.VoidSigner(_address); + }, + }, + artifacts: { + hasArtifact: async () => true, + getArtifact: async () => tokenArtifact, + getAllArtifacts: async () => [tokenArtifact], + }, + transactions: { + ...services.transactions, + wait: async () => ({ + blockHash: "", + blockNumber: 0, + confirmations: 0, + from: "", + byzantium: true, + contractAddress: "", + cumulativeGasUsed: BigNumber.from(0), + effectiveGasPrice: BigNumber.from(0), + gasUsed: BigNumber.from(0), + logs: [], + logsBloom: "", + to: "", + transactionHash: "", + transactionIndex: 0, + type: 0, + }), + }, + contracts: { + ...services.contracts, + sendTx: async (_tran, txOptions) => { + capturedTxOptions = txOptions; + return "0xb75381e904154b34814d387c29e1927449edd98d30f5e310f25e9b1f19b0b077"; + }, + }, + }, + }); + + const module = buildModule("Example", (m) => { + m.contract("Token"); + + return {}; + }); + + const result = await ignition.deploy(module, { + maxRetries: 1, + gasPriceIncrementPerRetry: BigNumber.from(1000), + pollingInterval: 4, + eventDuration: 10000, + networkName: "test-network", + force: false, + txPollingInterval: 4, + }); + + assert.equal(result._kind, "success"); + }); + + it("should pass the options through to the transaction service", async function () { + assert.equal(capturedTxOptions.maxRetries, 1); + assert(BigNumber.isBigNumber(capturedTxOptions.gasPriceIncrementPerRetry)); + assert( + BigNumber.from(capturedTxOptions.gasPriceIncrementPerRetry).eq(1000) + ); + assert.equal(capturedTxOptions.pollingInterval, 4); + assert.equal(capturedTxOptions.eventDuration, 10000); + }); +}); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 38ff5044e4..b830a4c5b0 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -23,14 +23,16 @@ type DeployResult = { [K in keyof T]: Contract; }; +export type IgnitionWrapperOptions = Omit< + IgnitionDeployOptions, + keyof { force?: boolean } +>; + export class IgnitionWrapper { constructor( private _providers: Providers, private _ethers: HardhatEthers, - private _deployOptions: Omit< - IgnitionDeployOptions, - keyof { force?: boolean } - > + public options: IgnitionWrapperOptions ) {} public async deploy( @@ -68,7 +70,7 @@ export class IgnitionWrapper { } const deploymentResult = await ignition.deploy(ignitionModule, { - ...this._deployOptions, + ...this.options, force, }); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 92adbee1f0..3d24da1773 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,95 +1,45 @@ /* eslint-disable import/no-unused-modules */ -import { - ContractsService, - TransactionsService, -} from "@ignored/ignition-core/helpers"; +import type { IgnitionWrapperOptions } from "../src/ignition-wrapper"; + import { assert } from "chai"; import { BigNumber } from "ethers"; -import sinon from "sinon"; -import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; describe("config", () => { useEnvironment("with-config"); - let sendTxStub: sinon.SinonStub; - - before(async function () { - sinon.stub(TransactionsService.prototype, "wait").resolves({ - blockHash: "", - blockNumber: 0, - confirmations: 0, - from: "", - byzantium: true, - contractAddress: "", - cumulativeGasUsed: BigNumber.from(0), - effectiveGasPrice: BigNumber.from(0), - gasUsed: BigNumber.from(0), - logs: [], - logsBloom: "", - to: "", - transactionHash: "", - transactionIndex: 0, - type: 0, - }); - sendTxStub = sinon - .stub(ContractsService.prototype, "sendTx") - .resolves( - "0xb75381e904154b34814d387c29e1927449edd98d30f5e310f25e9b1f19b0b077" - ); - }); + let loadedOptions: IgnitionWrapperOptions; - afterEach(() => { - sinon.restore(); + beforeEach(function () { + loadedOptions = this.hre.ignition.options; }); it("should apply maxRetries", async function () { - await deployModule(this.hre, (m) => { - m.contract("Bar"); - - return {}; - }); - - const sendTxOptions = sendTxStub.getCalls()[0].lastArg; - - assert.equal(sendTxOptions.maxRetries, 1); + assert.equal(loadedOptions.maxRetries, 1); }); it("should apply gasPriceIncrementPerRetry", async function () { - await deployModule(this.hre, (m) => { - m.contract("Bar"); - - return {}; - }); - - const sendTxOptions = sendTxStub.getCalls()[0].lastArg; - - assert(BigNumber.isBigNumber(sendTxOptions.gasPriceIncrementPerRetry)); - assert(BigNumber.from(sendTxOptions.gasPriceIncrementPerRetry).eq(1000)); + assert(BigNumber.isBigNumber(loadedOptions.gasPriceIncrementPerRetry)); + assert(BigNumber.from(loadedOptions.gasPriceIncrementPerRetry).eq(1000)); }); it("should apply pollingInterval", async function () { - await deployModule(this.hre, (m) => { - m.contract("Bar"); - - return {}; - }); - - const sendTxOptions = sendTxStub.getCalls()[0].lastArg; - - assert.equal(sendTxOptions.pollingInterval, 4); + assert.equal(loadedOptions.pollingInterval, 4); }); it("should apply eventDuration", async function () { - await deployModule(this.hre, (m) => { - m.contract("Bar"); - - return {}; - }); - - const sendTxOptions = sendTxStub.getCalls()[0].lastArg; + assert.equal(loadedOptions.eventDuration, 10000); + }); - assert.equal(sendTxOptions.eventDuration, 10000); + it("should only have known config", () => { + assert.deepStrictEqual(Object.keys(loadedOptions).sort(), [ + "eventDuration", + "gasPriceIncrementPerRetry", + "maxRetries", + "networkName", + "pollingInterval", + "txPollingInterval", + ]); }); }); From 4d172740d6a9f87aae7c39db4964122459fac0cf Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 29 Mar 2023 13:21:33 +0100 Subject: [PATCH 0264/1302] chore: bump version to v0.0.11 Update the packages versions and changelogs for the `0.0.11 - 2023-03-29` release. --- examples/create2/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/multisig/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/uniswap/package.json | 4 ++-- package-lock.json | 32 ++++++++++++++-------------- packages/core/CHANGELOG.md | 12 ++++++++++- packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 12 ++++++++++- packages/hardhat-plugin/package.json | 6 +++--- 11 files changed, 54 insertions(+), 34 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index f61569ddce..307ec30726 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-create2-example", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/ens/package.json b/examples/ens/package.json index 98a13997ed..c8ba59995f 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 98338db862..671df3b923 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-example-multisig", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/sample/package.json b/examples/sample/package.json index e513d7711d..f52f98ceea 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 863165a65c..7c91daf378 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index c2a1f4ebb6..5cbf0e0aab 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.10", + "version": "0.0.11", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/package-lock.json b/package-lock.json index c87b1fdad0..8a860a5690 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,12 +27,12 @@ }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.10", + "version": "0.0.11", "dependencies": { "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } @@ -43,49 +43,49 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.10", + "version": "0.0.11", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/multisig": { "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.10", + "version": "0.0.11", "dependencies": { "@openzeppelin/contracts": "^4.3.2" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.10", + "version": "0.0.11", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.10", + "version": "0.0.11", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.10", + "version": "0.0.11", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -97,7 +97,7 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.10", + "@ignored/hardhat-ignition": "^0.0.11", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } @@ -18157,7 +18157,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.10", + "version": "0.0.11", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -18220,7 +18220,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.10", + "version": "0.0.11", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -18234,7 +18234,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.10", + "@ignored/ignition-core": "^0.0.11", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -18275,7 +18275,7 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.10", + "@ignored/ignition-core": "^0.0.11", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b1fa9e4dda..bcf70b61dd 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,7 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## 0.0.10 - 2023-04-14 +## 0.0.11 - 2023-03-29 + +### Changed + +- Replace `m.getBytesForArtifact("Foo")` with `m.getArtifact("Foo")` in the module api ([#155](https://github.com/NomicFoundation/ignition/issues/155)) + +### Fixed + +- Fix libraries in plan ([#131](https://github.com/NomicFoundation/ignition/issues/131)) + +## 0.0.10 - 2023-03-14 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 77564b7abb..eb8da1105a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.10", + "version": "0.0.11", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 3e2d2288e5..b38a7ef6ae 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,7 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## 0.0.10 - 2023-04-14 +## 0.0.11 - 2023-03-29 + +### Changed + +- Replace `m.getBytesForArtifact("Foo")` with `m.getArtifact("Foo")` in the module api ([#155](https://github.com/NomicFoundation/ignition/issues/155)) + +### Fixed + +- Fix libraries in plan ([#131](https://github.com/NomicFoundation/ignition/issues/131)) + +## 0.0.10 - 2023-03-14 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f4017051b9..67e3345ad4 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.10", + "version": "0.0.11", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.10", + "@ignored/ignition-core": "^0.0.11", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -71,7 +71,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.10", + "@ignored/ignition-core": "^0.0.11", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From b6bf36a1589d92f256786f06d54575841a991a00 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 30 Mar 2023 15:48:11 +0100 Subject: [PATCH 0265/1302] refactor: pass providers to Ignition constructor (#181) In place of services, pass providers then immediately convert them. This has the advantage of only exporting one set of concepts (i.e. low level providers) rather than two (providers and higher level services), particularly as one leverages the other. The consequence of this approach though is that the providers are too low level for clean mocking in our core tests. The services are the more appropriate seam. By switching to providers in the `Ignition` constructor we lose that injection seam. This has been worked around by having Ignition within core expose a public factory method that accepts providers, but delegates onto a protected constructor that deals in Services. Our tests use a `TestIgnition` that extends the `Ignition` object with a public constructor that takes `Services`. Combined this gives us easy mocking in tests but only expose providers in the public api. Part of #171. --- packages/core/src/Ignition.ts | 28 ++++- packages/core/src/helpers.ts | 1 - packages/core/test/execution/rerun.ts | 9 +- .../core/test/helpers/getMockProviders.ts | 100 ++++++++++++++++++ packages/core/test/helpers/getMockServices.ts | 98 +++++++++++++++++ .../core/test/helpers/setupIgnitionWith.ts | 26 +++++ packages/core/test/options.ts | 3 +- .../hardhat-plugin/src/ignition-wrapper.ts | 24 +++-- 8 files changed, 269 insertions(+), 20 deletions(-) create mode 100644 packages/core/test/helpers/getMockProviders.ts create mode 100644 packages/core/test/helpers/getMockServices.ts create mode 100644 packages/core/test/helpers/setupIgnitionWith.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 0abf768928..b4654598f6 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -25,9 +25,11 @@ import { hashExecutionGraph } from "./internal/execution/utils"; import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; +import { createServices } from "./internal/services/createServices"; import { Services } from "./internal/types/services"; import { resolveProxyValue } from "./internal/utils/proxy"; import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; +import { Providers } from "./types/providers"; const log = setupDebug("ignition:main"); @@ -36,18 +38,34 @@ export class Ignition { private _uiRenderer: UpdateUiAction; private _journal: ICommandJournal; - constructor({ + public static create({ + providers, + uiRenderer = () => {}, + journal = new NoopCommandJournal(), + }: { + providers: Providers; + uiRenderer?: UpdateUiAction; + journal?: ICommandJournal; + }) { + return new Ignition({ + services: createServices(providers), + uiRenderer, + journal, + }); + } + + protected constructor({ services, uiRenderer, journal, }: { services: Services; - uiRenderer?: UpdateUiAction; - journal?: ICommandJournal; + uiRenderer: UpdateUiAction; + journal: ICommandJournal; }) { this._services = services; - this._uiRenderer = uiRenderer ?? (() => {}); - this._journal = journal ?? new NoopCommandJournal(); + this._uiRenderer = uiRenderer; + this._journal = journal; } public async deploy( diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts index 1326da3947..27ab63a0fd 100644 --- a/packages/core/src/helpers.ts +++ b/packages/core/src/helpers.ts @@ -1,4 +1,3 @@ export { viewExecutionResults } from "./internal/deployment/utils"; -export { createServices } from "./internal/services/createServices"; export { VertexResultEnum } from "./internal/types/graph"; export { serializeReplacer } from "./internal/utils/serialize"; diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index b5224b492b..980a4c054b 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -9,6 +9,7 @@ import { TransactionsService } from "../../src/internal/services/TransactionsSer import { Artifact } from "../../src/types/hardhat"; import { Providers } from "../../src/types/providers"; import { getMockServices } from "../helpers"; +import { setupIgnitionWith } from "../helpers/setupIgnitionWith"; import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; describe("Rerunning execution", () => { @@ -62,7 +63,7 @@ describe("Rerunning execution", () => { return { token }; }); - ignition = new Ignition({ + ignition = setupIgnitionWith({ services: { ...getMockServices(), artifacts: { @@ -193,7 +194,7 @@ describe("Rerunning execution", () => { ["0x0000000000000000000000000000000000000003"] ); - ignition = new Ignition({ + ignition = setupIgnitionWith({ services: { ...getMockServices(), artifacts: { @@ -291,7 +292,7 @@ describe("Rerunning execution", () => { return { token }; }); - ignition = new Ignition({ + ignition = setupIgnitionWith({ services: { ...getMockServices(), artifacts: { @@ -335,7 +336,7 @@ describe("Rerunning execution", () => { return { token }; }); - ignition = new Ignition({ + ignition = setupIgnitionWith({ services: { ...getMockServices(), artifacts: { diff --git a/packages/core/test/helpers/getMockProviders.ts b/packages/core/test/helpers/getMockProviders.ts new file mode 100644 index 0000000000..bce5f66978 --- /dev/null +++ b/packages/core/test/helpers/getMockProviders.ts @@ -0,0 +1,100 @@ +import { ethers } from "ethers"; + +import { IgnitionError } from "../../src/errors"; +import { ExternalParamValue } from "../../src/internal/types/deploymentGraph"; +import { Artifact } from "../../src/types/hardhat"; +import { ModuleParams } from "../../src/types/module"; +import { + AccountsProvider, + ArtifactsProvider, + ConfigProvider, + EIP1193Provider, + GasProvider, + HasParamResult, + Providers, + TransactionsProvider, +} from "../../src/types/providers"; + +export function getMockProviders(): Providers { + const mockProviders: Providers = { + artifacts: new MockArtifactsProvider(), + ethereumProvider: new MockEthereumProvider(), + gasProvider: new MockGasProvider(), + transactions: new MockTransactionsProvider(), + config: new MockConfigProvider(), + accounts: new MockAccountsProvider(), + }; + + return mockProviders; +} + +class MockArtifactsProvider implements ArtifactsProvider { + public async getArtifact(_name: string): Promise { + throw new IgnitionError("Method not implemented."); + } + public async getAllArtifacts(): Promise { + throw new IgnitionError("Method not implemented."); + } + public async hasArtifact(_name: string): Promise { + return false; + } +} + +class MockEthereumProvider implements EIP1193Provider { + public async request(_args: { + method: string; + params?: unknown[] | undefined; + }): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockGasProvider implements GasProvider { + public estimateGasLimit( + _tx: ethers.providers.TransactionRequest + ): Promise { + throw new IgnitionError("Method not implemented."); + } + + public estimateGasPrice(): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockTransactionsProvider implements TransactionsProvider { + public isConfirmed(_txHash: string): Promise { + throw new IgnitionError("Method not implemented."); + } + + public isMined(_txHash: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockConfigProvider implements ConfigProvider { + public parameters: ModuleParams | undefined; + + public setParams(_parameters: { + [key: string]: ExternalParamValue; + }): Promise { + throw new IgnitionError("Method not implemented."); + } + + public getParam(_paramName: string): Promise { + throw new IgnitionError("Method not implemented."); + } + + public hasParam(_paramName: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockAccountsProvider implements AccountsProvider { + public getAccounts(): Promise { + throw new Error("Method not implemented."); + } + + public getSigner(_address: string): Promise { + throw new Error("Method not implemented."); + } +} diff --git a/packages/core/test/helpers/getMockServices.ts b/packages/core/test/helpers/getMockServices.ts new file mode 100644 index 0000000000..38a423ed90 --- /dev/null +++ b/packages/core/test/helpers/getMockServices.ts @@ -0,0 +1,98 @@ +import { ethers } from "ethers"; + +import { IgnitionError } from "../../src/errors"; +import { + IAccountsService, + IArtifactsService, + IConfigService, + IContractsService, + INetworkService, + ITransactionsService, + Services, + TransactionOptions, +} from "../../src/internal/types/services"; +import { Artifact } from "../../src/types/hardhat"; +import { HasParamResult } from "../../src/types/providers"; + +export function getMockServices() { + const mockServices: Services = { + network: new MockNetworkService(), + contracts: new MockContractsService(), + artifacts: new MockArtifactsService(), + transactions: new MockTransactionService(), + config: new MockConfigService(), + accounts: new MockAccountsService(), + }; + + return mockServices; +} + +class MockNetworkService implements INetworkService { + public async getChainId(): Promise { + return 31337; + } +} + +class MockContractsService implements IContractsService { + private contractCount: number; + + constructor() { + this.contractCount = 0; + } + + public async sendTx( + _deployTransaction: ethers.providers.TransactionRequest, + _txOptions?: TransactionOptions | undefined + ): Promise { + this.contractCount++; + + return `0x0000${this.contractCount}`; + } +} + +class MockArtifactsService implements IArtifactsService { + public getAllArtifacts(): Promise { + throw new Error("Method not implemented."); + } + + public async hasArtifact(_name: string): Promise { + return true; + } + + public getArtifact(_name: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockTransactionService implements ITransactionsService { + public wait(_txHash: string): Promise { + return {} as any; + } + + public waitForEvent( + _filter: ethers.EventFilter, + _durationMs: number + ): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockConfigService implements IConfigService { + public getParam(_paramName: string): Promise { + throw new IgnitionError("Method not implemented."); + } + + public hasParam(_paramName: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} + +class MockAccountsService implements IAccountsService { + public getAccounts(): Promise { + throw new IgnitionError("Method not implemented."); + } + + public getSigner(_address: string): Promise { + throw new IgnitionError("Method not implemented."); + } +} diff --git a/packages/core/test/helpers/setupIgnitionWith.ts b/packages/core/test/helpers/setupIgnitionWith.ts new file mode 100644 index 0000000000..1512b38a07 --- /dev/null +++ b/packages/core/test/helpers/setupIgnitionWith.ts @@ -0,0 +1,26 @@ +import { ICommandJournal } from "../../src"; +import { Ignition } from "../../src/Ignition"; +import { NoopCommandJournal } from "../../src/internal/journal/NoopCommandJournal"; +import { Services } from "../../src/internal/types/services"; + +class TestIgnition extends Ignition { + constructor({ + services, + journal = new NoopCommandJournal(), + }: { + services: Services; + journal?: ICommandJournal; + }) { + super({ services, uiRenderer: () => {}, journal }); + } +} + +export function setupIgnitionWith({ + services, + journal, +}: { + services: Services; + journal?: ICommandJournal; +}) { + return new TestIgnition({ services, journal }); +} diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts index 03868c2a76..a738039cb4 100644 --- a/packages/core/test/options.ts +++ b/packages/core/test/options.ts @@ -7,6 +7,7 @@ import { buildModule, Ignition } from "../src"; import { Artifact } from "../src/types/hardhat"; import { getMockServices } from "./helpers"; +import { setupIgnitionWith } from "./helpers/setupIgnitionWith"; describe("deploy options", () => { const tokenArtifact: Artifact = { @@ -49,7 +50,7 @@ describe("deploy options", () => { before(async function () { const services = getMockServices(); - ignition = new Ignition({ + ignition = setupIgnitionWith({ services: { ...services, accounts: { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index b830a4c5b0..f50652fc7e 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,17 +1,16 @@ import type { Contract } from "ethers"; import { + ICommandJournal, Ignition, IgnitionDeployOptions, - Providers, Module, ModuleDict, ModuleParams, - ICommandJournal, + Providers, SerializedDeploymentResult, } from "@ignored/ignition-core"; import { IgnitionError } from "@ignored/ignition-core/errors"; -import { createServices } from "@ignored/ignition-core/helpers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; @@ -48,8 +47,7 @@ export class IgnitionWrapper { const showUi = deployParams?.ui ?? false; const force = deployParams?.force ?? false; - const services = createServices(this._providers); - const chainId = await services.network.getChainId(); + const chainId = await this._getChainId(this._providers); const journal = deployParams?.journal ?? @@ -57,8 +55,8 @@ export class IgnitionWrapper { ? new CommandJournal(chainId, deployParams?.journalPath) : undefined); - const ignition = new Ignition({ - services, + const ignition = Ignition.create({ + providers: this._providers, uiRenderer: showUi ? renderToCli(initializeRenderState(), deployParams?.parameters) : undefined, @@ -108,8 +106,8 @@ export class IgnitionWrapper { } public async plan(ignitionModule: Module) { - const ignition = new Ignition({ - services: createServices(this._providers), + const ignition = Ignition.create({ + providers: this._providers, }); return ignition.plan(ignitionModule); @@ -128,4 +126,12 @@ export class IgnitionWrapper { return resolvedOutput as DeployResult; } + + private async _getChainId(providers: Providers) { + const result = await providers.ethereumProvider.request({ + method: "eth_chainId", + }); + + return Number(result); + } } From fa71b0584158c281dc90d1d36d7c80e2960e5e6f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 23 Mar 2023 11:30:34 +0000 Subject: [PATCH 0266/1302] chore: add `typedocs` command Support running typedocs to create a docs website under `./typedocs`. --- .gitignore | 3 + package-lock.json | 1165 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 + 3 files changed, 1166 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b5328776b2..88af4e11ec 100644 --- a/.gitignore +++ b/.gitignore @@ -92,6 +92,9 @@ out .nuxt dist +# Typedocs documentation files +typedocs/ + # Gatsby files .cache/ # Comment in the public line in if your project uses Gatsby and not Next.js diff --git a/package-lock.json b/package-lock.json index 8a860a5690..b42d400680 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,9 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", + "open-cli": "7.2.0", "prettier": "2.4.1", + "typedoc": "0.23.28", "typescript": "^4.7.4" }, "workspaces": { @@ -2937,6 +2939,12 @@ "node": ">=14.16" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, "node_modules/@truffle/abi-utils": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.9.tgz", @@ -3762,6 +3770,12 @@ "dev": true, "peer": true }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, "node_modules/@types/mocha": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", @@ -3790,6 +3804,12 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, "node_modules/@types/object-hash": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.2.1.tgz", @@ -4485,6 +4505,12 @@ "node": ">=8" } }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -4655,6 +4681,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -4956,6 +4991,27 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/bplist-parser/node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5106,6 +5162,21 @@ "node": ">=6.14.2" } }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -5225,6 +5296,60 @@ "node": ">=4" } }, + "node_modules/camelcase-keys": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", + "dev": true, + "dependencies": { + "camelcase": "^7.0.0", + "map-obj": "^4.3.0", + "quick-lru": "^6.1.1", + "type-fest": "^2.13.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001466", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", @@ -6073,6 +6198,45 @@ "node": ">= 8" } }, + "node_modules/cross-spawn-async": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", + "integrity": "sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ==", + "deprecated": "cross-spawn no longer requires a build toolchain, use it instead", + "dev": true, + "dependencies": { + "lru-cache": "^4.0.0", + "which": "^1.2.8" + } + }, + "node_modules/cross-spawn-async/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/cross-spawn-async/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/cross-spawn-async/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -6097,6 +6261,33 @@ "sha3": "^2.1.1" } }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -6649,6 +6840,31 @@ "node": ">=0.10.0" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decimal.js-light": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", @@ -6714,6 +6930,40 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/default-browser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-3.1.0.tgz", + "integrity": "sha512-SOHecvSoairSAWxEHP/0qcsld/KtI3DargfEuELQDyHIYmS2EMgdGhHOTC1GxaYr+NLUV6kDroeiSBfnNHnn8w==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^5.0.0", + "xdg-default-browser": "^2.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", @@ -9100,6 +9350,29 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9329,6 +9602,23 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", + "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", + "dev": true, + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -9685,6 +9975,18 @@ "node": ">=4" } }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10066,6 +10368,15 @@ "node": ">=6" } }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/hardhat": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", @@ -10868,6 +11179,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -11357,6 +11677,39 @@ "npm": ">=3" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", @@ -11754,6 +12107,12 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -11787,6 +12146,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -11861,7 +12226,6 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "peer": true, "engines": { "node": ">=0.10.0" } @@ -11971,6 +12335,12 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", @@ -12118,6 +12488,12 @@ "node": ">=10" } }, + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -12148,6 +12524,18 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "devOptional": true }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/markdown-table": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", @@ -12155,6 +12543,18 @@ "dev": true, "peer": true }, + "node_modules/marked": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "dev": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/mcl-wasm": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", @@ -12202,10 +12602,309 @@ "node": ">= 0.10.0" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "node_modules/meow": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", + "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^8.0.2", + "decamelize": "^6.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^4.0.1", + "read-pkg-up": "^9.1.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^3.1.0", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/decamelize": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/meow/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.7.0.tgz", + "integrity": "sha512-A2qUJ/j8vkKIT+UorxayZjFJoEdNkIPZkjOJSWezoAbRQd7QEhnz2iJlfVy4Or0GuEnCXts5cNorQNUvdLkaSQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/meow/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", @@ -12324,6 +13023,15 @@ "dom-walk": "^0.1.0" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -12353,6 +13061,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -12951,6 +13682,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", @@ -13339,6 +14082,58 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/open-cli": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", + "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", + "dev": true, + "dependencies": { + "file-type": "^18.2.1", + "get-stdin": "^9.0.0", + "meow": "^11.0.0", + "open": "^9.0.0", + "tempy": "^3.0.0" + }, + "bin": { + "open-cli": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-cli/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open-cli/node_modules/open": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.0.0.tgz", + "integrity": "sha512-yerrN5WPzgwuE3T6rxAkT1UuMLDzs4Szpug7hy9s4gru3iOTnaU0yKc1AYOVYrBzvykce5gUdr9RPNB4R+Zc/A==", + "dev": true, + "dependencies": { + "default-browser": "^3.1.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -13626,6 +14421,19 @@ "node": ">=0.12" } }, + "node_modules/peek-readable": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -13873,6 +14681,12 @@ "node": ">= 0.10" } }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14110,6 +14924,22 @@ "node": ">= 6" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -14147,6 +14977,49 @@ "node": ">=6.0.0" } }, + "node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", @@ -14464,6 +15337,21 @@ "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", "dev": true }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -14928,6 +15816,18 @@ "node": ">=4" } }, + "node_modules/shiki": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", + "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -16271,6 +17171,24 @@ "node": ">=4" } }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/strip-hex-prefix": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", @@ -16302,6 +17220,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -16600,6 +17535,57 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", + "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "dev": true, + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16701,6 +17687,15 @@ "upper-case": "^1.0.3" } }, + "node_modules/titleize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.1.tgz", + "integrity": "sha512-rUwGDruKq1gX+FFHbTl5qjI7teVO7eOe+C8IcQ7QT+1BK3eEUXJqbZcBOeaRP4FwSC/C1A5jDoIVta0nIQ9yew==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/tmp": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", @@ -16746,6 +17741,23 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "dev": true, + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -16763,6 +17775,18 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ts-command-line-args": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", @@ -17099,6 +18123,51 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typedoc": { + "version": "0.23.28", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", + "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", + "dev": true, + "dependencies": { + "lunr": "^2.3.9", + "marked": "^4.2.12", + "minimatch": "^7.1.3", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" + }, + "engines": { + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" + } + }, + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typedoc/node_modules/minimatch": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", + "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/typescript": { "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", @@ -17172,6 +18241,21 @@ "node": ">=12.18" } }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", @@ -17188,6 +18272,15 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", @@ -17359,6 +18452,18 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, "node_modules/web-worker": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", @@ -17993,6 +19098,56 @@ } } }, + "node_modules/xdg-default-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xdg-default-browser/-/xdg-default-browser-2.1.0.tgz", + "integrity": "sha512-HY4G725+IDQr16N8XOjAms5qJGArdJaWIuC7Q7A8UXIwj2mifqnPXephazyL7sIkQPvmEoPX3E0v2yFv6hQUNg==", + "dev": true, + "dependencies": { + "execa": "^0.2.2", + "titleize": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/xdg-default-browser/node_modules/execa": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.2.2.tgz", + "integrity": "sha512-zmBGzLd3nhA/NB9P7VLoceAO6vyYPftvl809Vjwe5U2fYI9tYWbeKqP3wZlAw9WS+znnkogf/bhSU+Gcn2NbkQ==", + "dev": true, + "dependencies": { + "cross-spawn-async": "^2.1.1", + "npm-run-path": "^1.0.0", + "object-assign": "^4.0.1", + "path-key": "^1.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/xdg-default-browser/node_modules/npm-run-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "integrity": "sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA==", + "dev": true, + "dependencies": { + "path-key": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xdg-default-browser/node_modules/path-key": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", diff --git a/package.json b/package.json index 98ecf2178f..1121984b43 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "test:examples": "npm run test -w examples --if-present", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", "fullcheck": "npm run build && npm run lint && npm run test:coverage && npm run test:examples", + "typedocs": "typedoc --entryPointStrategy packages --out ./typedocs ./packages/core && open-cli ./typedocs/index.html", "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { @@ -31,7 +32,9 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", + "open-cli": "7.2.0", "prettier": "2.4.1", + "typedoc": "0.23.28", "typescript": "^4.7.4" } } From b371da4059f1a9b0aac636808c28e2484db5ea13 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 28 Mar 2023 18:28:55 +0100 Subject: [PATCH 0267/1302] docs: document the ignition-wrapper public methods --- .../hardhat-plugin/src/ignition-wrapper.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index f50652fc7e..422ba567c3 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -27,6 +27,11 @@ export type IgnitionWrapperOptions = Omit< keyof { force?: boolean } >; +/** + * Hardhat entry into Ignition. + * + * @alpha + */ export class IgnitionWrapper { constructor( private _providers: Providers, @@ -34,6 +39,13 @@ export class IgnitionWrapper { public options: IgnitionWrapperOptions ) {} + /** + * Run a deployment of the given Ignition module. + * @param ignitionModule - the Ignition module to deploy + * @param deployParams - the configuration parameters to control the + * deployment run. + * @returns the deployed contracts as Ethers contract objects + */ public async deploy( ignitionModule: Module, deployParams?: { @@ -105,6 +117,14 @@ export class IgnitionWrapper { return this._toDeploymentResult(deploymentResult.result); } + /** + * Construct a plan (or dry run) describing how a deployment will be executed + * for the given module. + * + * @param ignitionModule - the Ignition module to plan out + * @returns the a description of the modules deployment, including the + * execution dependency graph. + */ public async plan(ignitionModule: Module) { const ignition = Ignition.create({ providers: this._providers, From cd97c376e3bc710ccb089ef665436010afb3f06b Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 23 Mar 2023 12:21:19 +0000 Subject: [PATCH 0268/1302] chore: add api-extractor to core The devtool `api-extractor` provides linting errors on our tsdocs including warning on types that are accessible through the public api but not exported. A command `npm run api-extractor` has been added to core, and this check has been included under core's lint command. --- .vscode/tasks.json | 36 +++ package-lock.json | 258 ++++++++++++++++++ package.json | 1 + packages/core/.gitignore | 2 + packages/core/.prettierignore | 1 + packages/core/api-extractor.json | 70 +++++ packages/core/package.json | 4 +- packages/core/src/Ignition.ts | 58 +++- packages/core/src/dsl/DeploymentBuilder.ts | 88 ++++-- packages/core/src/dsl/buildModule.ts | 18 +- packages/core/src/index.ts | 147 ++++++++-- .../execution/dispatch/executeAwaitedEvent.ts | 4 +- .../execution/dispatch/executeContractCall.ts | 4 +- .../dispatch/executeContractDeploy.ts | 4 +- .../dispatch/executeDeployedContract.ts | 4 +- .../dispatch/executeLibraryDeploy.ts | 4 +- .../execution/dispatch/executeSendETH.ts | 4 +- ...onvertDeploymentVertexToExecutionVertex.ts | 28 +- .../core/src/internal/types/deployment.ts | 127 +++++++++ .../src/internal/types/deploymentGraph.ts | 130 ++++++++- .../core/src/internal/types/executionGraph.ts | 117 +++++++- packages/core/src/internal/types/graph.ts | 63 ++++- packages/core/src/internal/types/journal.ts | 15 + packages/core/src/internal/types/services.ts | 45 +++ packages/core/src/types/future.ts | 131 +++++++++ packages/core/src/types/hardhat.ts | 5 + packages/core/src/types/ignition.ts | 55 ++++ packages/core/src/types/module.ts | 20 ++ packages/core/src/types/plan.ts | 5 + packages/core/src/types/providers.ts | 50 +++- packages/core/src/types/serialization.ts | 11 + packages/core/test/execution/batching.ts | 4 +- 32 files changed, 1393 insertions(+), 120 deletions(-) create mode 100644 packages/core/api-extractor.json create mode 100644 packages/core/src/types/ignition.ts diff --git a/.vscode/tasks.json b/.vscode/tasks.json index a344a015b5..641515c078 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -29,6 +29,42 @@ "showReuseMessage": true, "clear": false } + }, + { + "type": "npm", + "script": "api-extractor", + "group": { + "kind": "none", + "isDefault": false + }, + "label": "api-extractor", + "detail": "Run api-extractor to check API", + "presentation": { + "echo": true, + "reveal": "silent", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + }, + "options": { + "cwd": "${workspaceFolder}/packages/core" + }, + "problemMatcher": { + "owner": "api-extractor", + "source": "api-extractor", + "fileLocation": ["relative", "${workspaceFolder}/packages/core"], + "pattern": [ + { + "regexp": "^(Warning|Error): ([\\w/.]+):(\\d+):(\\d+) - \\((.*)\\) (.*)$", + "file": 2, + "line": 3, + "column": 4, + "code": 5, + "message": 6 + } + ] + } } ] } diff --git a/package-lock.json b/package-lock.json index b42d400680..46eb195865 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "name": "root", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "devDependencies": { + "@microsoft/api-extractor": "7.34.4", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "eslint": "^7.32.0", @@ -1847,6 +1848,93 @@ "rlp": "^2.2.3" } }, + "node_modules/@microsoft/api-extractor": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.26.4", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2", + "@rushstack/rig-package": "0.3.18", + "@rushstack/ts-command-line": "4.13.2", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@morgan-stanley/ts-mocking-bird": { "version": "0.6.4", "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", @@ -2705,6 +2793,101 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@rushstack/node-core-library": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@rushstack/ts-command-line/node_modules/colors": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@scure/base": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", @@ -3352,6 +3535,12 @@ "node": ">=10" } }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, "node_modules/@types/async-eventemitter": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", @@ -11268,6 +11457,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12043,6 +12241,12 @@ "node": ">=8" } }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true + }, "node_modules/js-graph-algorithms": { "version": "1.0.18", "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", @@ -12403,6 +12607,12 @@ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", "dev": true }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -17086,6 +17296,15 @@ "safe-buffer": "~5.2.0" } }, + "node_modules/string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true, + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", @@ -18426,6 +18645,15 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validator": { + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/varint": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", @@ -19310,6 +19538,36 @@ "node": ">=8" } }, + "node_modules/z-schema": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "dev": true, + "dependencies": { + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" + } + }, + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "packages/core": { "name": "@ignored/ignition-core", "version": "0.0.11", diff --git a/package.json b/package.json index 1121984b43..9dcb3c8f09 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { + "@microsoft/api-extractor": "7.34.4", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "eslint": "^7.32.0", diff --git a/packages/core/.gitignore b/packages/core/.gitignore index 849ddff3b7..fa13833bf3 100644 --- a/packages/core/.gitignore +++ b/packages/core/.gitignore @@ -1 +1,3 @@ dist/ +etc/ +temp/ diff --git a/packages/core/.prettierignore b/packages/core/.prettierignore index 2f72331452..b2cfd0dd62 100644 --- a/packages/core/.prettierignore +++ b/packages/core/.prettierignore @@ -2,3 +2,4 @@ /dist /coverage /.nyc_output +/temp diff --git a/packages/core/api-extractor.json b/packages/core/api-extractor.json new file mode 100644 index 0000000000..4346b3249b --- /dev/null +++ b/packages/core/api-extractor.json @@ -0,0 +1,70 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "/dist/src/index.d.ts", + "bundledPackages": [], + "compiler": {}, + + "apiReport": { + "enabled": false, + "reportFileName": ".api.md", + "reportFolder": "/etc/", + "reportTempFolder": "/temp/" + }, + + "docModel": { + "enabled": true + }, + + "dtsRollup": { + "enabled": true + }, + + "tsdocMetadata": {}, + + "messages": { + "compilerMessageReporting": { + "default": { + "logLevel": "error" + } + }, + "extractorMessageReporting": { + "default": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-forgotten-export": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-incompatible-release-tags": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-internal-missing-underscore": { + "logLevel": "none", + "addToApiReportFile": false + }, + "ae-internal-mixed-release-tag": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-unresolved-inheritdoc-reference": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-unresolved-inheritdoc-base": { + "logLevel": "error", + "addToApiReportFile": true + }, + "ae-wrong-input-file-type": { + "logLevel": "error", + "addToApiReportFile": true + } + }, + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + } + } + } +} diff --git a/packages/core/package.json b/packages/core/package.json index eb8da1105a..1d0da8e01a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -37,10 +37,12 @@ }, "scripts": { "build": "tsc --build", - "lint": "npm run prettier -- --check && npm run eslint", + "lint": "npm run prettier -- --check && npm run eslint && npm run api-extractor", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,ts,md,json}\"", + "preapi-extractor": "npm run build", + "api-extractor": "api-extractor run --local --verbose", "test": "mocha --recursive \"test/**/*.ts\"", "test:debug": "DEBUG='ignition:*' npm run test", "test:build": "tsc --project ./test/", diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index b4654598f6..dfd744f296 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -29,24 +29,35 @@ import { createServices } from "./internal/services/createServices"; import { Services } from "./internal/types/services"; import { resolveProxyValue } from "./internal/utils/proxy"; import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; -import { Providers } from "./types/providers"; +import { + IgnitionConstructorArgs, + IgnitionCreationArgs, +} from "./types/ignition"; const log = setupDebug("ignition:main"); +/** + * The entry point for deploying using _Ignition_. + * + * @internal + */ export class Ignition { private _services: Services; private _uiRenderer: UpdateUiAction; private _journal: ICommandJournal; + /** + * A factory function to create a new Ignition instance based on the + * given providers. + * + * @param options - The setup options for Ignition. + * @returns The setup Ignition instance + */ public static create({ providers, uiRenderer = () => {}, journal = new NoopCommandJournal(), - }: { - providers: Providers; - uiRenderer?: UpdateUiAction; - journal?: ICommandJournal; - }) { + }: IgnitionCreationArgs) { return new Ignition({ services: createServices(providers), uiRenderer, @@ -54,20 +65,36 @@ export class Ignition { }); } + /** + * Creates a new Ignition instance that will manage and orchestrate a + * deployment. + * + * @param options - The service-based setup options for Ignition. + * + * @internal + */ protected constructor({ services, uiRenderer, journal, - }: { - services: Services; - uiRenderer: UpdateUiAction; - journal: ICommandJournal; - }) { + }: IgnitionConstructorArgs) { this._services = services; this._uiRenderer = uiRenderer; this._journal = journal; } + /** + * Run a deployment based on a given Ignition module on-chain, + * leveraging any configured journal to record. + * + * @param ignitionModule - An Ignition module + * @param options - Configuration options + * @returns A struct indicating whether the deployment was + * a success, failure or hold. A successful result will + * include the addresses of the deployed contracts. + * + * @internal + */ public async deploy( ignitionModule: Module, options: IgnitionDeployOptions @@ -150,6 +177,15 @@ export class Ignition { } } + /** + * Construct a plan (or dry run) describing how a deployment will be executed + * for the given module. + * + * @param deploymentModule - The Ignition module to be deployed + * @returns The deployment details as a plan + * + * @internal + */ public async plan( deploymentModule: Module ): Promise { diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 5ea5271f05..116c2b61cb 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -1,28 +1,28 @@ import type { + AddressResolvable, + ArtifactContract, + ArtifactFuture, + ArtifactLibrary, + CallableFuture, + ContractCall, + ContractFuture, + DependableFuture, + DeployedContract, DeploymentGraphFuture, + EventFuture, + EventParamFuture, + EventParams, HardhatContract, - ArtifactLibrary, HardhatLibrary, - ArtifactContract, - DeployedContract, - ContractCall, - RequiredParameter, OptionalParameter, ParameterValue, - CallableFuture, - Virtual, - DependableFuture, ProxyFuture, - EventFuture, - EventParams, - ArtifactFuture, - EventParamFuture, + RequiredParameter, SendFuture, - ContractFuture, - AddressResolvable, + Virtual, } from "../types/future"; import type { Artifact } from "../types/hardhat"; -import type { ModuleCache, ModuleDict, Module } from "../types/module"; +import type { Module, ModuleCache, ModuleDict } from "../types/module"; import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; @@ -30,26 +30,26 @@ import hash from "object-hash"; import { IgnitionError, IgnitionValidationError } from "../errors"; import { addEdge, ensureVertex } from "../internal/graph/adjacencyList"; import { + ArtifactContractDeploymentVertex, + ArtifactLibraryDeploymentVertex, + AwaitOptions, + CallDeploymentVertex, CallOptions, + CallPoints, ContractOptions, - InternalParamValue, - IDeploymentGraph, - IDeploymentBuilder, + DeployedContractDeploymentVertex, DeploymentBuilderOptions, DeploymentGraphVertex, - UseModuleOptions, - ScopeData, - AwaitOptions, - SendOptions, - CallPoints, + EventVertex, HardhatContractDeploymentVertex, - ArtifactContractDeploymentVertex, - DeployedContractDeploymentVertex, HardhatLibraryDeploymentVertex, - ArtifactLibraryDeploymentVertex, - CallDeploymentVertex, - EventVertex, + IDeploymentBuilder, + IDeploymentGraph, + InternalParamValue, + ScopeData, + SendOptions, SendVertex, + UseModuleOptions, VirtualVertex, } from "../internal/types/deploymentGraph"; import { @@ -80,10 +80,37 @@ type DeploymentApiPublicFunctions = const DEFAULT_VALUE = ethers.utils.parseUnits("0"); +/** + * A builder object for specifying the different parts and + * dependencies of your deployment. + */ export class DeploymentBuilder implements IDeploymentBuilder { + /** + * The `chainId` of the network being deployed to. + */ public chainId: number; + + /** + * The Hardhat accounts as defined in the `Hardhat.config.{js,ts}` file, + * deployment actions can leverage these accounts to specify which + * account the on-chain transaction that underlies the action will + * execute under. + */ public accounts: string[]; + + /** + * The deployment graph built from the configuration actions. + * @internal + */ public graph: IDeploymentGraph; + + /** + * A mapping of deployment graph vertexes to the source code + * position of the DeploymentBuilder action that created + * them. Used during validation to provide better error + * messages. + * @internal + */ public callPoints: CallPoints; private idCounter: number = 0; @@ -103,6 +130,11 @@ export class DeploymentBuilder implements IDeploymentBuilder { } } + /** + * Deploy a + * @param libraryName + * @param options + */ public library( libraryName: string, options?: ContractOptions diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index 008c461d85..f08bf4c43c 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -6,15 +6,27 @@ import { assertStringParam, } from "../internal/utils/paramAssertions"; +/** + * A factory that builds a deployment module given configuration function that + * manipulates an injected deployment builder. + * + * @param moduleName - The name that will be used for the module internally and in + * logging and the UI. + * @param moduleConfigurationAction - A non-async function that configures the + * deployment. + * @returns An Ignition module that can be deployed. + * + * @internal + */ export function buildModule( moduleName: string, - moduleAction: (m: IDeploymentBuilder) => T + moduleConfigurationAction: (m: IDeploymentBuilder) => T ): Module { assertStringParam(moduleName, "moduleName"); - assertFunctionParam(moduleAction, "moduleAction"); + assertFunctionParam(moduleConfigurationAction, "moduleAction"); return { name: moduleName, - action: moduleAction, + action: moduleConfigurationAction, }; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 74e9d7ada8..40c518f8e9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,34 +1,141 @@ -export { Ignition } from "./Ignition"; export { buildModule } from "./dsl/buildModule"; - -export type { SerializedDeploymentResult } from "./types/serialization"; -export type { - Providers, - ConfigProvider, - HasParamResult, -} from "./types/providers"; +export { Ignition } from "./Ignition"; export type { - DeployState, - DeployPhase, DeploymentResult, - UpdateUiAction, + DeployNetworkConfig, + DeployPhase, + DeployState, + DeployStateExecutionCommand, + ExecutionState, IgnitionDeployOptions, + UpdateUiAction, + ValidationState, + VertexExecutionState, + VertexExecutionStateCompleted, + VertexExecutionStateFailed, + VertexExecutionStateHold, + VertexExecutionStateRunning, + VertexExecutionStateUnstarted, + VertexExecutionStatusCompleted, + VertexExecutionStatusFailed, + VertexExecutionStatusHold, + VertexExecutionStatusRunning, + VertexExecutionStatusUnstarted, } from "./internal/types/deployment"; -export type { Module, ModuleDict, ModuleParams } from "./types/module"; export type { + ArtifactContractDeploymentVertex, + ArtifactLibraryDeploymentVertex, + AwaitOptions, + CallDeploymentVertex, + CallOptions, + ContractOptions, + DeployedContractDeploymentVertex, + DeploymentGraphVertex, + EventVertex, ExternalParamValue, + HardhatContractDeploymentVertex, + HardhatLibraryDeploymentVertex, IDeploymentBuilder, - DeploymentGraphVertex, + IDeploymentGraph, + InternalParamValue, + LibraryMap, + ScopeData, + SendOptions, + SendVertex, + UseModuleOptions, + VirtualVertex, } from "./internal/types/deploymentGraph"; -export type { IgnitionPlan } from "./types/plan"; -export type { - VertexGraph, - VertexDescriptor, - VertexVisitResultFailure, -} from "./internal/types/graph"; export type { + ArgValue, + AwaitedEventExecutionVertex, + AwaitedEventSuccess, + ContractCallExecutionVertex, + ContractCallSuccess, + ContractDeployExecutionVertex, + ContractDeploySuccess, + DeployedContractExecutionVertex, + DeployedContractSuccess, ExecutionVertex, ExecutionVertexType, + ExecutionVertexVisitResult, + IExecutionGraph, + LibraryDeployExecutionVertex, + LibraryDeploySuccess, + SendETHSuccess, + SentETHExecutionVertex, + VertexVisitResultSuccessResult, } from "./internal/types/executionGraph"; +export type { + AdjacencyList, + IGraph, + VertexDescriptor, + VertexGraph, + VertexResultEnum, + VertexVisitResult, + VertexVisitResultFailure, + VertexVisitResultHold, + VertexVisitResultSuccess, +} from "./internal/types/graph"; export type { ICommandJournal } from "./internal/types/journal"; -export type { DeployStateExecutionCommand } from "./internal/types/deployment"; +export type { + IAccountsService, + IArtifactsService, + IConfigService, + IContractsService, + INetworkService, + ITransactionsService, + Services, + TransactionOptions, +} from "./internal/types/services"; +export type { + AddressResolvable, + ArtifactContract, + ArtifactFuture, + ArtifactLibrary, + CallableFuture, + ContractCall, + ContractFuture, + DependableFuture, + DeployedContract, + DeploymentGraphFuture, + EventFuture, + EventParamFuture, + EventParams, + HardhatContract, + HardhatLibrary, + LibraryFuture, + OptionalParameter, + ParameterFuture, + ParameterValue, + ProxyFuture, + RequiredParameter, + SendFuture, + Virtual, +} from "./types/future"; +export type { Artifact } from "./types/hardhat"; +export type { + IgnitionConstructorArgs, + IgnitionCreationArgs, +} from "./types/ignition"; +export type { + Module, + ModuleDict, + ModuleParams, + ModuleReturnValue, +} from "./types/module"; +export type { IgnitionPlan } from "./types/plan"; +export type { + AccountsProvider, + ArtifactsProvider, + ConfigProvider, + EIP1193Provider, + GasProvider, + HasParamErrorCode, + HasParamResult, + Providers, + TransactionsProvider, +} from "./types/providers"; +export type { + ContractInfo, + SerializedDeploymentResult, +} from "./types/serialization"; diff --git a/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts index 6567a8c247..6d1636642e 100644 --- a/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts +++ b/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts @@ -1,6 +1,6 @@ import type { ExecutionContext } from "../../types/deployment"; import type { - AwaitedEvent, + AwaitedEventExecutionVertex, ExecutionVertexVisitResult, } from "../../types/executionGraph"; @@ -11,7 +11,7 @@ import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeAwaitedEvent( - { event, address, abi, args }: AwaitedEvent, + { event, address, abi, args }: AwaitedEventExecutionVertex, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { diff --git a/packages/core/src/internal/execution/dispatch/executeContractCall.ts b/packages/core/src/internal/execution/dispatch/executeContractCall.ts index e7723b2600..e726a4114b 100644 --- a/packages/core/src/internal/execution/dispatch/executeContractCall.ts +++ b/packages/core/src/internal/execution/dispatch/executeContractCall.ts @@ -1,6 +1,6 @@ import type { ExecutionContext } from "../../types/deployment"; import type { - ContractCall, + ContractCallExecutionVertex, ExecutionVertexVisitResult, } from "../../types/executionGraph"; @@ -11,7 +11,7 @@ import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractCall( - { method, contract, args, value, signer }: ContractCall, + { method, contract, args, value, signer }: ContractCallExecutionVertex, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { diff --git a/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts b/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts index 4566d5e85a..c7b40659f1 100644 --- a/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts +++ b/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts @@ -1,6 +1,6 @@ import type { ExecutionContext } from "../../types/deployment"; import type { - ContractDeploy, + ContractDeployExecutionVertex, ExecutionResultsAccumulator, ExecutionVertexVisitResult, } from "../../types/executionGraph"; @@ -13,7 +13,7 @@ import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeContractDeploy( - { artifact, args, libraries, value, signer }: ContractDeploy, + { artifact, args, libraries, value, signer }: ContractDeployExecutionVertex, resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext ): Promise { diff --git a/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts b/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts index 89822286b4..9ec4edc183 100644 --- a/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts +++ b/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts @@ -1,5 +1,5 @@ import type { - DeployedContract, + DeployedContractExecutionVertex, ExecutionResultsAccumulator, ExecutionVertexVisitResult, } from "../../types/executionGraph"; @@ -10,7 +10,7 @@ import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeDeployedContract( - { label, address, abi }: DeployedContract, + { label, address, abi }: DeployedContractExecutionVertex, _resultAccumulator: ExecutionResultsAccumulator, _: { services: Services } ): Promise { diff --git a/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts index 8e309ad1f8..ea9f81dd6c 100644 --- a/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts +++ b/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts @@ -2,7 +2,7 @@ import type { ExecutionContext } from "../../types/deployment"; import type { ExecutionResultsAccumulator, ExecutionVertexVisitResult, - LibraryDeploy, + LibraryDeployExecutionVertex, } from "../../types/executionGraph"; import { ContractFactory, ethers } from "ethers"; @@ -13,7 +13,7 @@ import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { resolveFrom, toAddress } from "./utils"; export async function executeLibraryDeploy( - { artifact, args, signer }: LibraryDeploy, + { artifact, args, signer }: LibraryDeployExecutionVertex, resultAccumulator: ExecutionResultsAccumulator, { services, options }: ExecutionContext ): Promise { diff --git a/packages/core/src/internal/execution/dispatch/executeSendETH.ts b/packages/core/src/internal/execution/dispatch/executeSendETH.ts index bbd8e772f2..25a83f60a6 100644 --- a/packages/core/src/internal/execution/dispatch/executeSendETH.ts +++ b/packages/core/src/internal/execution/dispatch/executeSendETH.ts @@ -1,7 +1,7 @@ import type { ExecutionContext } from "../../types/deployment"; import type { ExecutionVertexVisitResult, - SentETH, + SentETHExecutionVertex, } from "../../types/executionGraph"; import type { PopulatedTransaction } from "ethers"; @@ -10,7 +10,7 @@ import { VertexResultEnum } from "../../types/graph"; import { resolveFrom, toAddress } from "./utils"; export async function executeSendETH( - { address, value, signer }: SentETH, + { address, value, signer }: SentETHExecutionVertex, resultAccumulator: Map, { services, options }: ExecutionContext ): Promise { diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index b12836a20a..e2df148cee 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -17,13 +17,13 @@ import { SendVertex, } from "../../types/deploymentGraph"; import { - AwaitedEvent, - ContractCall, - ContractDeploy, - DeployedContract, + AwaitedEventExecutionVertex, + ContractCallExecutionVertex, + ContractDeployExecutionVertex, + DeployedContractExecutionVertex, ExecutionVertex, - LibraryDeploy, - SentETH, + LibraryDeployExecutionVertex, + SentETHExecutionVertex, } from "../../types/executionGraph"; import { Services } from "../../types/services"; import { isFuture } from "../../utils/guards"; @@ -76,7 +76,7 @@ export function convertDeploymentVertexToExecutionVertex( async function convertHardhatContractToContractDeploy( vertex: HardhatContractDeploymentVertex, transformContext: TransformContext -): Promise { +): Promise { const artifact: Artifact = await transformContext.services.artifacts.getArtifact(vertex.contractName); const signer: ethers.Signer = @@ -100,7 +100,7 @@ async function convertHardhatContractToContractDeploy( async function convertArtifactContractToContractDeploy( vertex: ArtifactContractDeploymentVertex, transformContext: TransformContext -): Promise { +): Promise { const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); @@ -122,7 +122,7 @@ async function convertArtifactContractToContractDeploy( async function convertDeployedContractToDeployedDeploy( vertex: DeployedContractDeploymentVertex, _transformContext: TransformContext -): Promise { +): Promise { return { type: "DeployedContract", id: vertex.id, @@ -135,7 +135,7 @@ async function convertDeployedContractToDeployedDeploy( async function convertCallToContractCall( vertex: CallDeploymentVertex, transformContext: TransformContext -): Promise { +): Promise { const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); @@ -157,7 +157,7 @@ async function convertCallToContractCall( async function convertHardhatLibraryToLibraryDeploy( vertex: HardhatLibraryDeploymentVertex, transformContext: TransformContext -): Promise { +): Promise { const artifact: Artifact = await transformContext.services.artifacts.getArtifact(vertex.libraryName); const signer: ethers.Signer = @@ -176,7 +176,7 @@ async function convertHardhatLibraryToLibraryDeploy( async function convertArtifactLibraryToLibraryDeploy( vertex: ArtifactLibraryDeploymentVertex, transformContext: TransformContext -): Promise { +): Promise { const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); @@ -193,7 +193,7 @@ async function convertArtifactLibraryToLibraryDeploy( async function convertAwaitToAwaitedEvent( vertex: EventVertex, transformContext: TransformContext -): Promise { +): Promise { return { type: "AwaitedEvent", id: vertex.id, @@ -208,7 +208,7 @@ async function convertAwaitToAwaitedEvent( async function convertSendToSentETH( vertex: SendVertex, transformContext: TransformContext -): Promise { +): Promise { const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts index 9df2fae407..97726ba2a6 100644 --- a/packages/core/src/internal/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -17,9 +17,21 @@ import { BigNumber } from "ethers"; import { Artifact } from "../../types/hardhat"; +/** + * An UI update function that will be invoked on each internal change with the + * latest version of the state. + * + * @internal + */ export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; +/** + * The configuration options that control how on-chain execution will happen + * during the deploy. + * + * @internal + */ export interface IgnitionDeployOptions { txPollingInterval: number; networkName: string; @@ -30,11 +42,32 @@ export interface IgnitionDeployOptions { force: boolean; } +/** + * The outcome of a deployment run. A deployment can either: + * - `success` with a set of deployed contract information as the result + * - `failure` with a list of errors + * - `hold` indicating that the deployment is part way through but either + * blocked or timed out. + * + * @internal + */ export type DeploymentResult = | { _kind: "failure"; failures: [string, Error[]] } | { _kind: "hold"; holds: VertexDescriptor[] } | { _kind: "success"; result: SerializedDeploymentResult }; +/** + * The different phases a deployment will move through: + * + * uninitialized -\> validating -\> execution -\> complete + * | |--------\> hold + * | |--------\> failed + * | + * |----------------------\> validation-failed + * |----------------------\> reconciliation-failed + * + * @internal + */ export type DeployPhase = | "uninitialized" | "validating" @@ -46,6 +79,13 @@ export type DeployPhase = | "reconciliation-failed" | "failed-unexpectedly"; +/** + * Commands for updating Ignitions execution state; external interactions + * with the blockchain are integrated into the Ignition execution state + * through these commands. + * + * @internal + */ export type DeployStateExecutionCommand = | { type: "EXECUTION::START"; @@ -87,14 +127,51 @@ export type DeployStateCommand = } | DeployStateExecutionCommand; +/** + * The subsection of the deployment state used during the validation phase + * of a deployment, where the user's given Module is analysed for potential + * problems. + * + * @internal + */ export interface ValidationState { errors: Error[]; } +/** + * The vertex has not yet been executed for this deployment run. + * + * @internal + */ export type VertexExecutionStatusUnstarted = "UNSTARTED"; + +/** + * The vertex is currently being executed, but the result has come back yet. + * + * @internal + */ export type VertexExecutionStatusRunning = "RUNNING"; + +/** + * The action the vertex represented has completed successfully. + * + * @internal + */ export type VertexExecutionStatusCompleted = "COMPLETED"; + +/** + * The action the vertex represented has failed with an error. + * + * @internal + */ export type VertexExecutionStatusFailed = "FAILED"; + +/** + * The action the vertex represented either timed out or its condition + * has not been met withint the time out. + * + * @internal + */ export type VertexExecutionStatusHold = "HOLD"; export type VertexExecutionStatus = @@ -104,31 +181,62 @@ export type VertexExecutionStatus = | VertexExecutionStatusFailed | VertexExecutionStatusHold; +/** + * The state associated with a currently running vertex execution. + * + * @internal + */ export interface VertexExecutionStateRunning { status: VertexExecutionStatusUnstarted; result: undefined; } +/** + * The state associated with an unstarted vertex execution. + * + * @internal + */ export interface VertexExecutionStateUnstarted { status: VertexExecutionStatusRunning; result: undefined; } +/** + * The state associated with a successfully completed execution of a vertex. + * + * @internal + */ export interface VertexExecutionStateCompleted { status: VertexExecutionStatusCompleted; result: VertexVisitResultSuccess; } +/** + * The state associated with a failed execution of a vertex. + * + * @internal + */ export interface VertexExecutionStateFailed { status: VertexExecutionStatusFailed; result: VertexVisitResultFailure; } +/** + * The state associated with a held execution of a vertex, either + * due to a time out or a condition not met. + * + * @internal + */ export interface VertexExecutionStateHold { status: VertexExecutionStatusHold; result: undefined; } +/** + * The states a vertex can go through during execution. + * + * @internal + */ export type VertexExecutionState = | VertexExecutionStateUnstarted | VertexExecutionStateRunning @@ -136,6 +244,13 @@ export type VertexExecutionState = | VertexExecutionStateFailed | VertexExecutionStateHold; +/** + * The part of the deployment state used during the execution phase where + * the dependency graph of on-chain actions are batched then executed with + * their results recorded. + * + * @internal + */ export interface ExecutionState { run: number; vertexes: { [key: number]: VertexExecutionState }; @@ -144,6 +259,12 @@ export interface ExecutionState { executionGraphHash: string; } +/** + * The key details and configuration used to interact with or understand + * the Ethereum chain being interacted with. + * + * @internal + */ export interface DeployNetworkConfig { moduleName: string; chainId: number; @@ -153,6 +274,12 @@ export interface DeployNetworkConfig { force: boolean; } +/** + * The core state of an Ignition deploy. Ignitions control flow is based on + * this state, and updates to it are controlled through update commands. + * + * @internal + */ export interface DeployState { phase: DeployPhase; details: DeployNetworkConfig; diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 52d659f62e..7f98e02c98 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -1,36 +1,46 @@ import type { BigNumber } from "ethers"; import { + AddressResolvable, ArtifactContract, + ArtifactFuture, ArtifactLibrary, - EventFuture, + CallableFuture, ContractCall, DeployedContract, DeploymentGraphFuture, + EventFuture, + EventParamFuture, HardhatContract, HardhatLibrary, OptionalParameter, + ParameterFuture, ParameterValue, RequiredParameter, - CallableFuture, - Virtual, - ParameterFuture, - ArtifactFuture, - EventParamFuture, SendFuture, - AddressResolvable, + Virtual, } from "../../types/future"; import { Artifact } from "../../types/hardhat"; -import { ModuleDict, Module } from "../../types/module"; +import { Module, ModuleDict } from "../../types/module"; import { AdjacencyList, VertexDescriptor } from "./graph"; +/** + * Scope data to manage internal nested calls to submodules. + * + * @internal + */ export interface ScopeData { before: Virtual; after?: Virtual; parameters?: { [key: string]: string | number | DeploymentGraphFuture }; } +/** + * A dependency graph that matches the deployment decribed by a Module. + * + * @internal + */ export interface IDeploymentGraph { vertexes: Map; adjacencyList: AdjacencyList; @@ -40,17 +50,38 @@ export interface IDeploymentGraph { getEdges(): Array<{ from: number; to: number }>; } +/** + * A mapping of library names to the future address + * of the deployed library. + * + * @internal + */ export interface LibraryMap { [key: string]: DeploymentGraphFuture; } +/** + * Allowed parameters that can be passed into a module. + * + * @internal + */ export type ExternalParamValue = boolean | string | number | BigNumber; +/** + * Allowed parameters across internal `useModule` boundaries. + * + * @internal + */ export type InternalParamValue = | ExternalParamValue | DeploymentGraphFuture | EventParamFuture; +/** + * A vertex representing an action specified in the Deployment api. + * + * @internal + */ export type DeploymentGraphVertex = | HardhatContractDeploymentVertex | ArtifactContractDeploymentVertex @@ -62,6 +93,12 @@ export type DeploymentGraphVertex = | EventVertex | SendVertex; +/** + * Deploy a contract, where the contract will be retrieved by name + * from Hardhat's Artifact store. + * + * @internal + */ export interface HardhatContractDeploymentVertex extends VertexDescriptor { type: "HardhatContract"; scopeAdded: string; @@ -73,6 +110,11 @@ export interface HardhatContractDeploymentVertex extends VertexDescriptor { from: string; } +/** + * Deploy a contract based on a given Artifact. + * + * @internal + */ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { type: "ArtifactContract"; scopeAdded: string; @@ -84,6 +126,11 @@ export interface ArtifactContractDeploymentVertex extends VertexDescriptor { from: string; } +/** + * Refer to an existing deployed contract, for later use in the Module. + * + * @internal + */ export interface DeployedContractDeploymentVertex extends VertexDescriptor { type: "DeployedContract"; scopeAdded: string; @@ -92,6 +139,12 @@ export interface DeployedContractDeploymentVertex extends VertexDescriptor { after: DeploymentGraphFuture[]; } +/** + * Deploy a library, where the library will be retrieved by name + * from Hardhat's Artifact store. + * + * @internal + */ export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { type: "HardhatLibrary"; libraryName: string; @@ -101,6 +154,11 @@ export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { from: string; } +/** + * Deploy a library based on a given artifact. + * + * @internal + */ export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { type: "ArtifactLibrary"; scopeAdded: string; @@ -110,6 +168,11 @@ export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { from: string; } +/** + * Invoke a smart contract method. + * + * @internal + */ export interface CallDeploymentVertex extends VertexDescriptor { type: "Call"; scopeAdded: string; @@ -121,12 +184,27 @@ export interface CallDeploymentVertex extends VertexDescriptor { from: string; } +/** + * A non-action vertex used to represent group relationships. The virtual + * vertex can depend on many other vertexes, so a dependency on the virtual + * vertex will mean depending on all its dependents. + * + * The virtual vertex is removed during translation to a simplified + * execution graph. + * + * @internal + */ export interface VirtualVertex extends VertexDescriptor { type: "Virtual"; scopeAdded: string; after: DeploymentGraphFuture[]; } +/** + * Await on an on-chain Ethereum event. + * + * @internal + */ export interface EventVertex extends VertexDescriptor { type: "Event"; scopeAdded: string; @@ -137,6 +215,11 @@ export interface EventVertex extends VertexDescriptor { after: DeploymentGraphFuture[]; } +/** + * Send ETH to a contract/address. + * + * @internal + */ export interface SendVertex extends VertexDescriptor { type: "SendETH"; scopeAdded: string; @@ -146,6 +229,11 @@ export interface SendVertex extends VertexDescriptor { from: string; } +/** + * The options for a Contract deploy. + * + * @internal + */ export interface ContractOptions { args?: InternalParamValue[]; libraries?: { @@ -156,6 +244,11 @@ export interface ContractOptions { from?: string; } +/** + * The options for a smart contract method call. + * + * @internal + */ export interface CallOptions { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; @@ -163,22 +256,43 @@ export interface CallOptions { from?: string; } +/** + * The options for an await action. + * + * @internal + */ export interface AwaitOptions { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; } +/** + * The options for sending ETH to an address/contract. + * + * @internal + */ export interface SendOptions { value: BigNumber | ParameterFuture; after?: DeploymentGraphFuture[]; from?: string; } +/** + * The options when using a module within another module. + * + * @internal + */ export interface UseModuleOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; after?: DeploymentGraphFuture[]; } +/** + * A builder object for specifying the different parts and + * dependencies of your deployment. + * + * @internal + */ export interface IDeploymentBuilder { chainId: number; accounts: string[]; diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts index 71dbecd064..e55838e179 100644 --- a/packages/core/src/internal/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -17,12 +17,22 @@ import { VisitResult, } from "./graph"; +/** + * A dependency graph for on-chain execution. + * + * @internal + */ export interface IExecutionGraph { adjacencyList: AdjacencyList; vertexes: Map; getEdges(): Array<{ from: number; to: number }>; } +/** + * The allowed values when passing an argument to a smart contract method call. + * + * @internal + */ export type ArgValue = | boolean | string @@ -30,6 +40,11 @@ export type ArgValue = | BigNumber | DeploymentGraphFuture; +/** + * The different types of the vertexes of the execution graph. + * + * @internal + */ export type ExecutionVertexType = | "ContractDeploy" | "DeployedContract" @@ -38,15 +53,25 @@ export type ExecutionVertexType = | "AwaitedEvent" | "SentETH"; +/** + * The vertexes of the execution graph. + * + * @internal + */ export type ExecutionVertex = - | ContractDeploy - | DeployedContract - | LibraryDeploy - | ContractCall - | AwaitedEvent - | SentETH; - -export interface ContractDeploy extends VertexDescriptor { + | ContractDeployExecutionVertex + | DeployedContractExecutionVertex + | LibraryDeployExecutionVertex + | ContractCallExecutionVertex + | AwaitedEventExecutionVertex + | SentETHExecutionVertex; + +/** + * Deploy a contract based on the given artifact. + * + * @internal + */ +export interface ContractDeployExecutionVertex extends VertexDescriptor { type: "ContractDeploy"; artifact: Artifact; args: ArgValue[]; @@ -55,20 +80,36 @@ export interface ContractDeploy extends VertexDescriptor { signer: ethers.Signer; } -export interface DeployedContract extends VertexDescriptor { +/** + * Make no on-chain action but substitute an already known + * address and abi. + * + * @internal + */ +export interface DeployedContractExecutionVertex extends VertexDescriptor { type: "DeployedContract"; address: string | EventParamFuture; abi: any[]; } -export interface LibraryDeploy extends VertexDescriptor { +/** + * Deploy a library based on the given artifact. + * + * @internal + */ +export interface LibraryDeployExecutionVertex extends VertexDescriptor { type: "LibraryDeploy"; artifact: Artifact; args: ArgValue[]; signer: ethers.Signer; } -export interface ContractCall extends VertexDescriptor { +/** + * Make a method call to a smart chain contract. + * + * @internal + */ +export interface ContractCallExecutionVertex extends VertexDescriptor { type: "ContractCall"; contract: any; method: string; @@ -77,7 +118,12 @@ export interface ContractCall extends VertexDescriptor { signer: ethers.Signer; } -export interface AwaitedEvent extends VertexDescriptor { +/** + * Wait for the an Ethereum event to execute. + * + * @internal + */ +export interface AwaitedEventExecutionVertex extends VertexDescriptor { type: "AwaitedEvent"; abi: any[]; address: string | ArtifactContract | EventParamFuture; @@ -85,13 +131,23 @@ export interface AwaitedEvent extends VertexDescriptor { args: ArgValue[]; } -export interface SentETH extends VertexDescriptor { +/** + * Transfer ETH to a contract/address. + * + * @internal + */ +export interface SentETHExecutionVertex extends VertexDescriptor { type: "SentETH"; address: AddressResolvable; value: BigNumber; signer: ethers.Signer; } +/** + * The result of a successful contract deployment. + * + * @internal + */ export interface ContractDeploySuccess { name: string; abi: any[]; @@ -100,12 +156,22 @@ export interface ContractDeploySuccess { value: ethers.BigNumber; } +/** + * The result of a successful existing contract. + * + * @internal + */ export interface DeployedContractSuccess { name: string; abi: any[]; address: string; } +/** + * The result of a successful library deployment. + * + * @internal + */ export interface LibraryDeploySuccess { name: string; abi: any[]; @@ -113,19 +179,39 @@ export interface LibraryDeploySuccess { address: string; } +/** + * The result of a successful wait on an Ethereum event. + * + * @internal + */ export interface AwaitedEventSuccess { topics: ethers.utils.Result; } +/** + * The result of a successful smart contract method invocation. + * + * @internal + */ export interface ContractCallSuccess { hash: string; } +/** + * The result of a successful transfer of ETH to a contract/address. + * + * @internal + */ export interface SendETHSuccess { hash: string; value: ethers.BigNumber; } +/** + * The result of a successful vertex execution. + * + * @internal + */ export type VertexVisitResultSuccessResult = | ContractDeploySuccess | DeployedContractSuccess @@ -134,6 +220,11 @@ export type VertexVisitResultSuccessResult = | ContractCallSuccess | SendETHSuccess; +/** + * The result of a processing a vertex of the execution graph. + * + * @internal + */ export type ExecutionVertexVisitResult = VertexVisitResult; diff --git a/packages/core/src/internal/types/graph.ts b/packages/core/src/internal/types/graph.ts index abdfcae9f8..4ca15380b0 100644 --- a/packages/core/src/internal/types/graph.ts +++ b/packages/core/src/internal/types/graph.ts @@ -1,40 +1,89 @@ -export interface VertexDescriptor { - id: number; - label: string; - type: string; - args?: any[]; -} - +/** + * An abstraction for representing the edges of a graph, + * where a from vertex id is matched to a set of linked + * to vertexes. + * + * @internal + */ export type AdjacencyList = Map>; +/** + * An adjacency list based graph. + * + * @internal + */ export interface IGraph { adjacencyList: AdjacencyList; vertexes: Map; getEdges(): Array<{ from: number; to: number }>; } +/** + * An Ignition on-chain action as part of a depedency graph. + * + * @internal + */ +export interface VertexDescriptor { + id: number; + label: string; + type: string; + args?: any[]; +} + +/** + * A graph of Ignition on-chain actions. + * + * @internal + */ export type VertexGraph = IGraph; +/** + * The different possibilities of processing a dependency graph vertex. + * + * @internal + */ export enum VertexResultEnum { SUCCESS = "success", FAILURE = "failure", HOLD = "hold", } +/** + * The result of performing the vertex actioni succeeded with the result. + * + * @internal + */ export interface VertexVisitResultSuccess { _kind: VertexResultEnum.SUCCESS; result: T; } +/** + * The result of performing the vertex action failed with the given error. + * + * @internal + */ export interface VertexVisitResultFailure { _kind: VertexResultEnum.FAILURE; failure: Error; } +/** + * The result of performing the vertex action either timed out or did not + * meet the test condition. + * + * @internal + */ export interface VertexVisitResultHold { _kind: VertexResultEnum.HOLD; } +/** + * The result of processing a vertex in the dependency graph, either a + * success, failure or on hold. + * + * @internal + */ export type VertexVisitResult = | VertexVisitResultSuccess | VertexVisitResultFailure diff --git a/packages/core/src/internal/types/journal.ts b/packages/core/src/internal/types/journal.ts index ab9b8470bb..83fd548e00 100644 --- a/packages/core/src/internal/types/journal.ts +++ b/packages/core/src/internal/types/journal.ts @@ -30,8 +30,23 @@ export interface Journal { delete(moduleId: string): Promise; } +/** + * An adapter to record and retrieve a transaction log of deployment state + * changes. + * + * @internal + */ export interface ICommandJournal { + /** + * Store a record of the given command + * @param command - The deployment update command to record + * + * @internal + */ record(command: DeployStateExecutionCommand): Promise; + /** + * Read out the stored deployment update commands. + */ read(): AsyncGenerator; } diff --git a/packages/core/src/internal/types/services.ts b/packages/core/src/internal/types/services.ts index 159cda774a..0aeee178ed 100644 --- a/packages/core/src/internal/types/services.ts +++ b/packages/core/src/internal/types/services.ts @@ -8,23 +8,44 @@ import type { ExternalParamValue } from "./deploymentGraph"; import { ethers } from "ethers"; +/** + * Access a set of predefined ethereum accounts and their equivalent signers. + * + * @internal + */ export interface IAccountsService { getAccounts(): Promise; getSigner(address: string): Promise; } +/** + * Provide access to contract artifacts (i.e. the container for a contract's + * abi, bytecode and other key metadata). + * + * @internal + */ export interface IArtifactsService { getArtifact(name: string): Promise; hasArtifact(name: string): Promise; getAllArtifacts(): Promise; } +/** + * Provide access to underlying configuration options. + * + * @internal + */ export interface IConfigService { getParam(paramName: string): Promise; hasParam(paramName: string): Promise; } +/** + * Allow the sending of transactions to smart contracts on-chain. + * + * @internal + */ export interface IContractsService { sendTx( deployTransaction: ethers.providers.TransactionRequest, @@ -32,10 +53,21 @@ export interface IContractsService { ): Promise; } +/** + * Provide access to details of the chain being deployed against. + * + * @internal + */ export interface INetworkService { getChainId(): Promise; } +/** + * Provide general access to the target chains transaction and event + * processing. + * + * @internal + */ export interface ITransactionsService { wait(txHash: string): Promise; waitForEvent( @@ -44,6 +76,12 @@ export interface ITransactionsService { ): Promise; } +/** + * Configuration options to be sent to the target chain with the transaction + * to be processed. + * + * @internal + */ export interface TransactionOptions { gasLimit?: ethers.BigNumberish; gasPrice?: ethers.BigNumberish; @@ -59,6 +97,13 @@ export interface ContractsServiceProviders { gasProvider: GasProvider; } +/** + * Adapter implementations for the underlying services that represent + * Ignitions interactions with external systems (i.e. the target blockchain, + * the filesystem etc). + * + * @internal + */ export interface Services { network: INetworkService; contracts: IContractsService; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 21c5eb85db..c2f488101e 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -1,5 +1,11 @@ import type { Artifact } from "./hardhat"; +/** + * A future representing the address of a contract deployed using the + * Hardhat Artifact system. + * + * @internal + */ export interface HardhatContract { vertexId: number; label: string; @@ -9,6 +15,12 @@ export interface HardhatContract { _future: true; } +/** + * A future representing the value of a contract deployed using a given + * artifact. + * + * @internal + */ export interface ArtifactContract { vertexId: number; label: string; @@ -18,6 +30,11 @@ export interface ArtifactContract { _future: true; } +/** + * A future representing the address of an already deployed contract. + * + * @internal + */ export interface DeployedContract { vertexId: number; label: string; @@ -28,6 +45,12 @@ export interface DeployedContract { _future: true; } +/** + * A future representing the address of a library deployed using Hardhat's + * artifact system. + * + * @internal + */ export interface HardhatLibrary { vertexId: number; label: string; @@ -37,6 +60,12 @@ export interface HardhatLibrary { _future: true; } +/** + * A future representing the address of a library deployed using a given + * artifact. + * + * @internal + */ export interface ArtifactLibrary { vertexId: number; label: string; @@ -46,6 +75,11 @@ export interface ArtifactLibrary { _future: true; } +/** + * A future representing an on-chain smart contract method invocation. + * + * @internal + */ export interface ContractCall { vertexId: number; label: string; @@ -53,6 +87,11 @@ export interface ContractCall { _future: true; } +/** + * A future representing an on-chain Ethereum event. + * + * @internal + */ export interface EventFuture { vertexId: number; label: string; @@ -62,6 +101,11 @@ export interface EventFuture { params: EventParams; } +/** + * A future representing the sending of Eth to a contract/address. + * + * @internal + */ export interface SendFuture { vertexId: number; label: string; @@ -70,10 +114,20 @@ export interface SendFuture { _future: true; } +/** + * A mapping of named parameter labels to future parameter values. + * + * @internal + */ export interface EventParams { [eventParam: string]: EventParamFuture; } +/** + * A future representing a parameter of an on-chain Ethereum event. + * + * @internal + */ export interface EventParamFuture { vertexId: number; label: string; @@ -82,8 +136,19 @@ export interface EventParamFuture { _future: true; } +/** + * A value that can be used as a Module parameter. + * + * @internal + */ export type ParameterValue = string | number | DeploymentGraphFuture; +/** + * A future representing a parameter value that _must_ be provided to the module + * for it to execute. + * + * @internal + */ export interface RequiredParameter { label: string; type: "parameter"; @@ -92,6 +157,12 @@ export interface RequiredParameter { _future: true; } +/** + * A future representing a parameter value that _may_ be provided to the module + * for it to execute. In its absence the `defaultValue` will be used. + * + * @internal + */ export interface OptionalParameter { label: string; type: "parameter"; @@ -101,6 +172,11 @@ export interface OptionalParameter { _future: true; } +/** + * A future representing a virtual node used for grouping other actions. + * + * @internal + */ export interface Virtual { vertexId: number; label: string; @@ -108,6 +184,17 @@ export interface Virtual { _future: true; } +/** + * A future that allows the splitting of dependency from value resolution. + * A proxy can stand for the value of another future, but point its + * dependency (the proxy) on a different. + * + * This allows the wrapping of a returned Contract future so that a + * dependency on it can be made to depend on the Virtual vertex that + * represents the entire submodule. + * + * @internal + */ export interface ProxyFuture { label: string; type: "proxy"; @@ -116,17 +203,46 @@ export interface ProxyFuture { _future: true; } +/** + * A future representing an artifact deployment or an already existing deployed + * contract. + * + * @privateRemarks + * TODO: is this needed? + * + * @internal + */ export type ArtifactFuture = ArtifactContract | DeployedContract; +/** + * A future representing the address of a deployed Contract. + * + * @internal + */ export type ContractFuture = | HardhatContract | ArtifactContract | DeployedContract; +/** + * The future representing the address of a deployed library. + * + * @internal + */ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; +/** + * The future representing the value of calling a smart contract method. + * + * @internal + */ export type CallableFuture = ContractFuture | LibraryFuture; +/** + * A future value from an on-chain action that. + * + * @internal + */ export type DependableFuture = | CallableFuture | ContractCall @@ -135,14 +251,29 @@ export type DependableFuture = | EventFuture | SendFuture; +/** + * A future value representing an Ethereum address. + * + * @internal + */ export type AddressResolvable = | string | ParameterFuture | EventParamFuture | ContractFuture; +/** + * The future value of a passed parameter to a Module. + * + * @internal + */ export type ParameterFuture = RequiredParameter | OptionalParameter; +/** + * The future values usable within the Module api. + * + * @internal + */ export type DeploymentGraphFuture = | DependableFuture | ParameterFuture diff --git a/packages/core/src/types/hardhat.ts b/packages/core/src/types/hardhat.ts index 403f55260b..6ee01301e0 100644 --- a/packages/core/src/types/hardhat.ts +++ b/packages/core/src/types/hardhat.ts @@ -1,3 +1,8 @@ +/** + * The key data for interacting with an Ethereum smart contract on-chain. + * + * @internal + */ export interface Artifact { contractName: string; bytecode: string; diff --git a/packages/core/src/types/ignition.ts b/packages/core/src/types/ignition.ts new file mode 100644 index 0000000000..884588630b --- /dev/null +++ b/packages/core/src/types/ignition.ts @@ -0,0 +1,55 @@ +import { UpdateUiAction } from "../internal/types/deployment"; +import { ICommandJournal } from "../internal/types/journal"; +import { Services } from "../internal/types/services"; + +import { Providers } from "./providers"; + +/** + * The setup options for the Ignition. + * + * @internal + */ +export interface IgnitionCreationArgs { + /** + * The adapters that allows Ignition to communicate with external systems + * like the target blockchain or local filesystem. + */ + providers: Providers; + + /** + * An optional UI update function that will be invoked with the current + * Ignition state on each major state change. + */ + uiRenderer?: UpdateUiAction; + + /** + * An optional journal that will be used to store a record of the current + * run and to access the history of previous runs. + */ + journal?: ICommandJournal; +} + +/** + * The setup options for Ignition + * + * @internal + */ +export interface IgnitionConstructorArgs { + /** + * An adapter that allows Ignition to communicate with external services + * like the target blockchain or local filesystem. + */ + services: Services; + + /** + * A UI update function that will be invoked with the current + * Ignition state on each major state change. + */ + uiRenderer: UpdateUiAction; + + /** + * A journal that will be used to store a record of the current + * run and to access the history of previous runs. + */ + journal: ICommandJournal; +} diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index f3fe8a108e..bc6188e1af 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -9,16 +9,31 @@ import type { Virtual, } from "./future"; +/** + * The potential return results of deploying a module. + * + * @internal + */ export type ModuleReturnValue = | ContractFuture | LibraryFuture | Virtual | ProxyFuture; +/** + * The results of deploying a module. + * + * @internal + */ export interface ModuleDict { [key: string]: ModuleReturnValue; } +/** + * An Ignition module that can be deployed. + * + * @internal + */ export interface Module { name: string; action: (builder: IDeploymentBuilder) => T; @@ -33,6 +48,11 @@ export interface ModuleCache { [label: string]: ModuleData; } +/** + * A mapping of parameter labels to allowed values or futures. + * + * @internal + */ export interface ModuleParams { [key: string]: ExternalParamValue; } diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts index 17ef5c46d1..93bbc1c21e 100644 --- a/packages/core/src/types/plan.ts +++ b/packages/core/src/types/plan.ts @@ -1,6 +1,11 @@ import { IDeploymentGraph } from "../internal/types/deploymentGraph"; import { IExecutionGraph } from "../internal/types/executionGraph"; +/** + * The planned deployment. + * + * @internal + */ export interface IgnitionPlan { deploymentGraph: IDeploymentGraph; executionGraph: IExecutionGraph; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 5734f2bfb3..fe902c6124 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,9 +1,16 @@ import type { ExternalParamValue } from "../internal/types/deploymentGraph"; import type { Artifact } from "./hardhat"; -import type { ethers } from "ethers"; + +import { ethers } from "ethers"; import { ModuleParams } from "./module"; +/** + * The low level adapters that allow Ignition to interact with external services + * like the target chain or the local filesystem. + * + * @internal + */ export interface Providers { artifacts: ArtifactsProvider; ethereumProvider: EIP1193Provider; @@ -13,16 +20,31 @@ export interface Providers { accounts: AccountsProvider; } +/** + * Provide access to contract artifacts based on a label. + * + * @internal + */ export interface ArtifactsProvider { getArtifact: (name: string) => Promise; hasArtifact: (name: string) => Promise; getAllArtifacts: () => Promise; } +/** + * Provide access to the target Ethereum chain via requests. + * + * @internal + */ export interface EIP1193Provider { request: (args: { method: string; params?: unknown[] }) => Promise; } +/** + * Provide access to Ethereum gas information for the target chain. + * + * @internal + */ export interface GasProvider { estimateGasLimit: ( tx: ethers.providers.TransactionRequest @@ -30,13 +52,28 @@ export interface GasProvider { estimateGasPrice: () => Promise; } +/** + * Provide access to transaction information for the target chain. + * + * @internal + */ export interface TransactionsProvider { isConfirmed(txHash: string): Promise; isMined(txHash: string): Promise; } +/** + * Allowed error codes for a parameter lookup. + * + * @internal + */ export type HasParamErrorCode = "no-params" | "param-missing"; +/** + * The results of a parameter look up. + * + * @internal + */ export type HasParamResult = | { found: false; @@ -44,6 +81,11 @@ export type HasParamResult = } | { found: true }; +/** + * Provide access to configuration options for Ignition execution. + * + * @internal + */ export interface ConfigProvider { parameters: ModuleParams | undefined; @@ -54,6 +96,12 @@ export interface ConfigProvider { hasParam(paramName: string): Promise; } +/** + * Provide a set of usable Ethereum accounts that can be made available within + * the Module api. + * + * @internal + */ export interface AccountsProvider { getAccounts(): Promise; getSigner(address: string): Promise; diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 06e1e6b3b3..7002dacca5 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -1,11 +1,22 @@ import type { ModuleDict } from "./module"; +/** + * The details of a deployed contract. The combination of address and abi + * should allow a consumer to call the contract. + * + * @internal + */ export interface ContractInfo { name: string; address: string; abi: any[]; } +/** + * The contract details from a successful deployment. + * + * @internal + */ export type SerializedDeploymentResult = { [K in keyof T]: ContractInfo; }; diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index 0851e87343..5c64c027d3 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ import type { - ContractDeploy, + ContractDeployExecutionVertex, ExecutionVertex, ExecutionVertexVisitResult, } from "../../src/internal/types/executionGraph"; @@ -66,7 +66,7 @@ describe("Execution - batching", () => { function createFakeContractDeployVertex( vertexId: number, label: string -): ContractDeploy { +): ContractDeployExecutionVertex { return { type: "ContractDeploy", id: vertexId, From c242c1e562b78a7943a87a2fb971bbdc5fb9e718 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 28 Mar 2023 18:16:19 +0100 Subject: [PATCH 0269/1302] refactor: open build module as alpha --- packages/core/src/dsl/buildModule.ts | 2 +- .../src/internal/types/deploymentGraph.ts | 17 ++++--- packages/core/src/types/future.ts | 46 +++++++++---------- packages/core/src/types/hardhat.ts | 2 +- packages/core/src/types/module.ts | 6 +-- 5 files changed, 36 insertions(+), 37 deletions(-) diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index f08bf4c43c..5d5a33f251 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -16,7 +16,7 @@ import { * deployment. * @returns An Ignition module that can be deployed. * - * @internal + * @alpha */ export function buildModule( moduleName: string, diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 7f98e02c98..08508ff1e6 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -63,14 +63,14 @@ export interface LibraryMap { /** * Allowed parameters that can be passed into a module. * - * @internal + * @alpha */ export type ExternalParamValue = boolean | string | number | BigNumber; /** * Allowed parameters across internal `useModule` boundaries. * - * @internal + * @alpha */ export type InternalParamValue = | ExternalParamValue @@ -232,7 +232,7 @@ export interface SendVertex extends VertexDescriptor { /** * The options for a Contract deploy. * - * @internal + * @alpha */ export interface ContractOptions { args?: InternalParamValue[]; @@ -247,7 +247,7 @@ export interface ContractOptions { /** * The options for a smart contract method call. * - * @internal + * @alpha */ export interface CallOptions { args: InternalParamValue[]; @@ -259,7 +259,7 @@ export interface CallOptions { /** * The options for an await action. * - * @internal + * @alpha */ export interface AwaitOptions { args: InternalParamValue[]; @@ -269,7 +269,7 @@ export interface AwaitOptions { /** * The options for sending ETH to an address/contract. * - * @internal + * @alpha */ export interface SendOptions { value: BigNumber | ParameterFuture; @@ -280,7 +280,7 @@ export interface SendOptions { /** * The options when using a module within another module. * - * @internal + * @alpha */ export interface UseModuleOptions { parameters?: { [key: string]: number | string | DeploymentGraphFuture }; @@ -291,12 +291,11 @@ export interface UseModuleOptions { * A builder object for specifying the different parts and * dependencies of your deployment. * - * @internal + * @alpha */ export interface IDeploymentBuilder { chainId: number; accounts: string[]; - graph: IDeploymentGraph; contract(contractName: string, options?: ContractOptions): HardhatContract; contract( diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index c2f488101e..aece6bc243 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -4,7 +4,7 @@ import type { Artifact } from "./hardhat"; * A future representing the address of a contract deployed using the * Hardhat Artifact system. * - * @internal + * @alpha */ export interface HardhatContract { vertexId: number; @@ -19,7 +19,7 @@ export interface HardhatContract { * A future representing the value of a contract deployed using a given * artifact. * - * @internal + * @alpha */ export interface ArtifactContract { vertexId: number; @@ -33,7 +33,7 @@ export interface ArtifactContract { /** * A future representing the address of an already deployed contract. * - * @internal + * @alpha */ export interface DeployedContract { vertexId: number; @@ -49,7 +49,7 @@ export interface DeployedContract { * A future representing the address of a library deployed using Hardhat's * artifact system. * - * @internal + * @alpha */ export interface HardhatLibrary { vertexId: number; @@ -64,7 +64,7 @@ export interface HardhatLibrary { * A future representing the address of a library deployed using a given * artifact. * - * @internal + * @alpha */ export interface ArtifactLibrary { vertexId: number; @@ -78,7 +78,7 @@ export interface ArtifactLibrary { /** * A future representing an on-chain smart contract method invocation. * - * @internal + * @alpha */ export interface ContractCall { vertexId: number; @@ -90,7 +90,7 @@ export interface ContractCall { /** * A future representing an on-chain Ethereum event. * - * @internal + * @alpha */ export interface EventFuture { vertexId: number; @@ -104,7 +104,7 @@ export interface EventFuture { /** * A future representing the sending of Eth to a contract/address. * - * @internal + * @alpha */ export interface SendFuture { vertexId: number; @@ -117,7 +117,7 @@ export interface SendFuture { /** * A mapping of named parameter labels to future parameter values. * - * @internal + * @alpha */ export interface EventParams { [eventParam: string]: EventParamFuture; @@ -126,7 +126,7 @@ export interface EventParams { /** * A future representing a parameter of an on-chain Ethereum event. * - * @internal + * @alpha */ export interface EventParamFuture { vertexId: number; @@ -139,7 +139,7 @@ export interface EventParamFuture { /** * A value that can be used as a Module parameter. * - * @internal + * @alpha */ export type ParameterValue = string | number | DeploymentGraphFuture; @@ -147,7 +147,7 @@ export type ParameterValue = string | number | DeploymentGraphFuture; * A future representing a parameter value that _must_ be provided to the module * for it to execute. * - * @internal + * @alpha */ export interface RequiredParameter { label: string; @@ -161,7 +161,7 @@ export interface RequiredParameter { * A future representing a parameter value that _may_ be provided to the module * for it to execute. In its absence the `defaultValue` will be used. * - * @internal + * @alpha */ export interface OptionalParameter { label: string; @@ -175,7 +175,7 @@ export interface OptionalParameter { /** * A future representing a virtual node used for grouping other actions. * - * @internal + * @alpha */ export interface Virtual { vertexId: number; @@ -193,7 +193,7 @@ export interface Virtual { * dependency on it can be made to depend on the Virtual vertex that * represents the entire submodule. * - * @internal + * @alpha */ export interface ProxyFuture { label: string; @@ -210,14 +210,14 @@ export interface ProxyFuture { * @privateRemarks * TODO: is this needed? * - * @internal + * @alpha */ export type ArtifactFuture = ArtifactContract | DeployedContract; /** * A future representing the address of a deployed Contract. * - * @internal + * @alpha */ export type ContractFuture = | HardhatContract @@ -227,21 +227,21 @@ export type ContractFuture = /** * The future representing the address of a deployed library. * - * @internal + * @alpha */ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; /** * The future representing the value of calling a smart contract method. * - * @internal + * @alpha */ export type CallableFuture = ContractFuture | LibraryFuture; /** * A future value from an on-chain action that. * - * @internal + * @alpha */ export type DependableFuture = | CallableFuture @@ -254,7 +254,7 @@ export type DependableFuture = /** * A future value representing an Ethereum address. * - * @internal + * @alpha */ export type AddressResolvable = | string @@ -265,14 +265,14 @@ export type AddressResolvable = /** * The future value of a passed parameter to a Module. * - * @internal + * @alpha */ export type ParameterFuture = RequiredParameter | OptionalParameter; /** * The future values usable within the Module api. * - * @internal + * @alpha */ export type DeploymentGraphFuture = | DependableFuture diff --git a/packages/core/src/types/hardhat.ts b/packages/core/src/types/hardhat.ts index 6ee01301e0..0629007b64 100644 --- a/packages/core/src/types/hardhat.ts +++ b/packages/core/src/types/hardhat.ts @@ -1,7 +1,7 @@ /** * The key data for interacting with an Ethereum smart contract on-chain. * - * @internal + * @alpha */ export interface Artifact { contractName: string; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index bc6188e1af..9a41329fce 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -12,7 +12,7 @@ import type { /** * The potential return results of deploying a module. * - * @internal + * @alpha */ export type ModuleReturnValue = | ContractFuture @@ -23,7 +23,7 @@ export type ModuleReturnValue = /** * The results of deploying a module. * - * @internal + * @alpha */ export interface ModuleDict { [key: string]: ModuleReturnValue; @@ -32,7 +32,7 @@ export interface ModuleDict { /** * An Ignition module that can be deployed. * - * @internal + * @alpha */ export interface Module { name: string; From a06b50ba87b0ad35b1f2d06bc30d34669b8ca6f2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 28 Mar 2023 18:33:40 +0100 Subject: [PATCH 0270/1302] docs: document the deployment builder interface Move the interface out of internal and under `./types/dsl.ts`. Add typedocs for each function on the interface to better support intellisense. All parts of this api are intended for public use - hence the @alpha tag. --- packages/core/src/dsl/DeploymentBuilder.ts | 38 +-- packages/core/src/dsl/buildModule.ts | 2 +- packages/core/src/index.ts | 18 +- ...onvertDeploymentVertexToExecutionVertex.ts | 2 +- .../src/internal/services/ConfigService.ts | 2 +- .../src/internal/types/deploymentGraph.ts | 148 +-------- packages/core/src/internal/types/services.ts | 2 +- packages/core/src/types/dsl.ts | 284 ++++++++++++++++++ packages/core/src/types/module.ts | 7 +- packages/core/src/types/providers.ts | 2 +- .../core/test/deploymentBuilder/accounts.ts | 6 +- .../core/test/deploymentBuilder/artifacts.ts | 6 +- packages/core/test/deploymentBuilder/calls.ts | 6 +- .../core/test/deploymentBuilder/deploy.ts | 6 +- packages/core/test/deploymentBuilder/event.ts | 8 +- .../core/test/deploymentBuilder/libraries.ts | 6 +- .../core/test/deploymentBuilder/metadata.ts | 2 +- .../core/test/deploymentBuilder/parameters.ts | 6 +- .../core/test/deploymentBuilder/sendETH.ts | 6 +- .../core/test/deploymentBuilder/useModule.ts | 6 +- packages/core/test/deploymentBuilder/value.ts | 8 +- .../core/test/helpers/getMockProviders.ts | 2 +- packages/core/test/validation.ts | 2 +- 23 files changed, 343 insertions(+), 232 deletions(-) create mode 100644 packages/core/src/types/dsl.ts diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index 116c2b61cb..f24b25754c 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -32,24 +32,17 @@ import { addEdge, ensureVertex } from "../internal/graph/adjacencyList"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, - AwaitOptions, CallDeploymentVertex, - CallOptions, CallPoints, - ContractOptions, DeployedContractDeploymentVertex, DeploymentBuilderOptions, DeploymentGraphVertex, EventVertex, HardhatContractDeploymentVertex, HardhatLibraryDeploymentVertex, - IDeploymentBuilder, IDeploymentGraph, - InternalParamValue, ScopeData, - SendOptions, SendVertex, - UseModuleOptions, VirtualVertex, } from "../internal/types/deploymentGraph"; import { @@ -61,6 +54,15 @@ import { isParameter, } from "../internal/utils/guards"; import { resolveProxyDependency } from "../internal/utils/proxy"; +import { + AwaitOptions, + CallOptions, + ContractOptions, + IDeploymentBuilder, + InternalParamValue, + SendOptions, + UseModuleOptions, +} from "../types/dsl"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; @@ -81,25 +83,19 @@ type DeploymentApiPublicFunctions = const DEFAULT_VALUE = ethers.utils.parseUnits("0"); /** - * A builder object for specifying the different parts and - * dependencies of your deployment. + * A builder object for specifying the different parts of your deployment + * and their interdependencies. */ export class DeploymentBuilder implements IDeploymentBuilder { - /** - * The `chainId` of the network being deployed to. - */ + /** {@inheritDoc IDeploymentBuilder.chainId} */ public chainId: number; - /** - * The Hardhat accounts as defined in the `Hardhat.config.{js,ts}` file, - * deployment actions can leverage these accounts to specify which - * account the on-chain transaction that underlies the action will - * execute under. - */ + /** {@inheritDoc IDeploymentBuilder.accounts} */ public accounts: string[]; /** * The deployment graph built from the configuration actions. + * * @internal */ public graph: IDeploymentGraph; @@ -109,6 +105,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { * position of the DeploymentBuilder action that created * them. Used during validation to provide better error * messages. + * * @internal */ public callPoints: CallPoints; @@ -130,11 +127,6 @@ export class DeploymentBuilder implements IDeploymentBuilder { } } - /** - * Deploy a - * @param libraryName - * @param options - */ public library( libraryName: string, options?: ContractOptions diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/dsl/buildModule.ts index 5d5a33f251..6f37cd8ba6 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/dsl/buildModule.ts @@ -1,10 +1,10 @@ -import type { IDeploymentBuilder } from "../internal/types/deploymentGraph"; import type { Module, ModuleDict } from "../types/module"; import { assertFunctionParam, assertStringParam, } from "../internal/utils/paramAssertions"; +import { IDeploymentBuilder } from "../types/dsl"; /** * A factory that builds a deployment module given configuration function that diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 40c518f8e9..940d8dce54 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -25,24 +25,16 @@ export type { export type { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, - AwaitOptions, CallDeploymentVertex, - CallOptions, - ContractOptions, DeployedContractDeploymentVertex, DeploymentGraphVertex, EventVertex, - ExternalParamValue, HardhatContractDeploymentVertex, HardhatLibraryDeploymentVertex, - IDeploymentBuilder, IDeploymentGraph, - InternalParamValue, LibraryMap, ScopeData, - SendOptions, SendVertex, - UseModuleOptions, VirtualVertex, } from "./internal/types/deploymentGraph"; export type { @@ -87,6 +79,16 @@ export type { Services, TransactionOptions, } from "./internal/types/services"; +export { + AwaitOptions, + CallOptions, + ContractOptions, + ExternalParamValue, + IDeploymentBuilder, + InternalParamValue, + SendOptions, + UseModuleOptions, +} from "./types/dsl"; export type { AddressResolvable, ArtifactContract, diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index e2df148cee..2709ca41b2 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,6 +1,7 @@ import { BigNumber, ethers } from "ethers"; import { IgnitionError } from "../../../errors"; +import { ExternalParamValue } from "../../../types/dsl"; import { DeploymentGraphFuture, EventParamFuture } from "../../../types/future"; import { Artifact } from "../../../types/hardhat"; import { @@ -10,7 +11,6 @@ import { DeployedContractDeploymentVertex, DeploymentGraphVertex, EventVertex, - ExternalParamValue, HardhatContractDeploymentVertex, HardhatLibraryDeploymentVertex, IDeploymentGraph, diff --git a/packages/core/src/internal/services/ConfigService.ts b/packages/core/src/internal/services/ConfigService.ts index 03102c29a7..70072bfc82 100644 --- a/packages/core/src/internal/services/ConfigService.ts +++ b/packages/core/src/internal/services/ConfigService.ts @@ -1,6 +1,6 @@ import type { HasParamResult, Providers } from "../../types/providers"; -import type { ExternalParamValue } from "../types/deploymentGraph"; +import { ExternalParamValue } from "../../types/dsl"; import { IConfigService } from "../types/services"; export class ConfigService implements IConfigService { diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 08508ff1e6..3467daaf18 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -1,27 +1,16 @@ import type { BigNumber } from "ethers"; +import { InternalParamValue } from "../../types/dsl"; import { AddressResolvable, ArtifactContract, - ArtifactFuture, - ArtifactLibrary, CallableFuture, - ContractCall, - DeployedContract, DeploymentGraphFuture, - EventFuture, EventParamFuture, - HardhatContract, - HardhatLibrary, - OptionalParameter, ParameterFuture, - ParameterValue, - RequiredParameter, - SendFuture, Virtual, } from "../../types/future"; import { Artifact } from "../../types/hardhat"; -import { Module, ModuleDict } from "../../types/module"; import { AdjacencyList, VertexDescriptor } from "./graph"; @@ -60,23 +49,6 @@ export interface LibraryMap { [key: string]: DeploymentGraphFuture; } -/** - * Allowed parameters that can be passed into a module. - * - * @alpha - */ -export type ExternalParamValue = boolean | string | number | BigNumber; - -/** - * Allowed parameters across internal `useModule` boundaries. - * - * @alpha - */ -export type InternalParamValue = - | ExternalParamValue - | DeploymentGraphFuture - | EventParamFuture; - /** * A vertex representing an action specified in the Deployment api. * @@ -229,124 +201,6 @@ export interface SendVertex extends VertexDescriptor { from: string; } -/** - * The options for a Contract deploy. - * - * @alpha - */ -export interface ContractOptions { - args?: InternalParamValue[]; - libraries?: { - [key: string]: DeploymentGraphFuture; - }; - after?: DeploymentGraphFuture[]; - value?: BigNumber | ParameterFuture; - from?: string; -} - -/** - * The options for a smart contract method call. - * - * @alpha - */ -export interface CallOptions { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; - value?: BigNumber | ParameterFuture; - from?: string; -} - -/** - * The options for an await action. - * - * @alpha - */ -export interface AwaitOptions { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; -} - -/** - * The options for sending ETH to an address/contract. - * - * @alpha - */ -export interface SendOptions { - value: BigNumber | ParameterFuture; - after?: DeploymentGraphFuture[]; - from?: string; -} - -/** - * The options when using a module within another module. - * - * @alpha - */ -export interface UseModuleOptions { - parameters?: { [key: string]: number | string | DeploymentGraphFuture }; - after?: DeploymentGraphFuture[]; -} - -/** - * A builder object for specifying the different parts and - * dependencies of your deployment. - * - * @alpha - */ -export interface IDeploymentBuilder { - chainId: number; - accounts: string[]; - - contract(contractName: string, options?: ContractOptions): HardhatContract; - contract( - contractName: string, - artifact: Artifact, - options?: ContractOptions - ): ArtifactContract; - - contractAt( - contractName: string, - address: string | EventParamFuture, - abi: any[], - options?: { after?: DeploymentGraphFuture[] } - ): DeployedContract; - - library(contractName: string, options?: ContractOptions): HardhatLibrary; - library( - contractName: string, - artifact: Artifact, - options?: ContractOptions - ): ArtifactLibrary; - - call( - contractFuture: DeploymentGraphFuture, - functionName: string, - options: CallOptions - ): ContractCall; - - event( - contractFuture: ArtifactFuture, - eventName: string, - options: AwaitOptions - ): EventFuture; - - sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture; - - getParam(paramName: string): RequiredParameter; - - getOptionalParam( - paramName: string, - defaultValue: ParameterValue - ): OptionalParameter; - - getArtifact(contractName: string): Artifact; - - useModule( - module: Module, - options?: UseModuleOptions - ): Virtual & T; -} - export interface DeploymentBuilderOptions { chainId: number; accounts: string[]; diff --git a/packages/core/src/internal/types/services.ts b/packages/core/src/internal/types/services.ts index 0aeee178ed..71ba9464df 100644 --- a/packages/core/src/internal/types/services.ts +++ b/packages/core/src/internal/types/services.ts @@ -4,7 +4,7 @@ import type { HasParamResult, TransactionsProvider, } from "../../types/providers"; -import type { ExternalParamValue } from "./deploymentGraph"; +import type { ExternalParamValue } from "./../../types/dsl"; import { ethers } from "ethers"; diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts new file mode 100644 index 0000000000..6c604860e7 --- /dev/null +++ b/packages/core/src/types/dsl.ts @@ -0,0 +1,284 @@ +import { BigNumber } from "ethers"; + +import { + AddressResolvable, + ArtifactContract, + ArtifactFuture, + ArtifactLibrary, + ContractCall, + DeployedContract, + DeploymentGraphFuture, + EventFuture, + EventParamFuture, + HardhatContract, + HardhatLibrary, + OptionalParameter, + ParameterFuture, + ParameterValue, + RequiredParameter, + SendFuture, + Virtual, +} from "./future"; +import { Artifact } from "./hardhat"; +import { Module, ModuleDict } from "./module"; + +/** + * A builder object for specifying the different parts and + * dependencies of your deployment. + * + * @alpha + */ + +export interface IDeploymentBuilder { + /** + * The `chainId` of the network being deployed to. + */ + chainId: number; + + /** + * The Hardhat accounts as defined in the `Hardhat.config.{js,ts}` file, + * deployment actions can leverage these accounts to specify which + * account the on-chain transaction that underlies the action will + * execute under. + */ + accounts: string[]; + + /** + * Call a contract method. + * + * @param contractFuture - A contract future + * @param functionName - the name of the method to be invoked + * @param options - The options to control the method invocation. + * + * @alpha + */ + call( + contractFuture: DeploymentGraphFuture, + functionName: string, + options: CallOptions + ): ContractCall; + + /** + * Deploy a named contract from Hardhat's contracts folder. + * + * @param contractName - The name of the contract to deploy + * @param options - The options for controlling the deployment of the contract + * + * @alpha + */ + contract(contractName: string, options?: ContractOptions): HardhatContract; + + /** + * Deploy a contract based on an artifact. + * + * @param contractName - The label to use for the given contract in logs, + * errors and UI + * @param artifact - The artifact containing the contract data (i.e. bytecode, + * abi etc) + * @param options - The options for controlling the deployment of the contract + * + * @alpha + */ + contract( + contractName: string, + artifact: Artifact, + options?: ContractOptions + ): ArtifactContract; + + /** + * Refer to an existing deployed smart contract, the reference can be passed + * to subsequent actions. + * + * @param contractName - The label to use for the given contract in logs, + * errors and UI + * @param address - the Ethereum address of the contract + * @param abi - The contract's Application Binary Interface (ABI) + * @param options - The options for controlling the use of the deployed + * contract + * + * @alpha + */ + contractAt( + contractName: string, + address: string | EventParamFuture, + abi: any[], + options?: { after?: DeploymentGraphFuture[] } + ): DeployedContract; + + /** + * Wait for a contract to emit an event, then continue with the deployment + * passing any returned arguments onto subsequent actions. + * + * @param contractFuture - The contract future where the event will originate + * @param eventName - The name of the event to wait on + * @param options - The options to control the wait for the event + * + * @alpha + */ + event( + contractFuture: ArtifactFuture, + eventName: string, + options: AwaitOptions + ): EventFuture; + + /** + * Retreive an artifact for the named contract or library within Hardhat's + * contracts folder. + * + * @param contractName - The name of the contract or library to retrieve + * the artifact for + * @returns The artifact for the contract or library + */ + getArtifact(contractName: string): Artifact; + + /** + * Get the value of a named parameter that _can_ be passed into the currently + * scoped Module. If the Module does not receive the parameter then the + * default value will be used instead. + * + * @param paramName - The parameter name + * @param defaultValue - The default value to use if no parameter with the + * given name is provided to the module currently in scops. + * + * @alpha + */ + getOptionalParam( + paramName: string, + defaultValue: ParameterValue + ): OptionalParameter; + + /** + * Get the value of a named parameter that _must_ be passed into the currently + * scoped Module. + * + * @param paramName - The parameter name + * + * @alpha + */ + getParam(paramName: string): RequiredParameter; + + /** + * Deploy a named library from Hardhat's contracts folder. + * + * @param libraryName - The name of the library to deploy + * @param options - The options to control the deployment of the library + * + * @alpha + */ + library(libraryName: string, options?: ContractOptions): HardhatLibrary; + /** + * Deploy a library based on an artifact. + * + * @param libraryName - The label to use for the given library in logs, + * errors and UI + * @param artifact - The artifact containing the library;s data (i.e. + * bytecode, abi etc) + * @param options - The options to control the deployment of the library + */ + library( + libraryName: string, + artifact: Artifact, + options?: ContractOptions + ): ArtifactLibrary; + + /** + * Transfer ETH to an externally owned account or contract based on address. + * + * @param sendTo - The Ethereum address to send the ETH to + * @param options - The options to control the send + * + * @alpha + */ + sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture; + + /** + * Deploy a module from within the current module. + * + * @param module - The Ignition module to be deployed + * @param options - The options that control the running of the submodule + * @returns A results object that is both a future that can be depended on, + * representing the completion of everything within the submodule, + * and contains the contract futures of any contracts or libraries deployed. + * + * @alpha + */ + useModule( + module: Module, + options?: UseModuleOptions + ): Virtual & T; +} + +/** + * The options for an await action. + * + * @alpha + */ +export interface AwaitOptions { + args: InternalParamValue[]; + after?: DeploymentGraphFuture[]; +} + +/** + * The options for a smart contract method call. + * + * @alpha + */ +export interface CallOptions { + args: InternalParamValue[]; + after?: DeploymentGraphFuture[]; + value?: BigNumber | ParameterFuture; + from?: string; +} + +/** + * The options for a Contract deploy. + * + * @alpha + */ +export interface ContractOptions { + args?: InternalParamValue[]; + libraries?: { + [key: string]: DeploymentGraphFuture; + }; + after?: DeploymentGraphFuture[]; + value?: BigNumber | ParameterFuture; + from?: string; +} + +/** + * The options for sending ETH to an address/contract. + * + * @alpha + */ +export interface SendOptions { + value: BigNumber | ParameterFuture; + after?: DeploymentGraphFuture[]; + from?: string; +} + +/** + * The options when using a module within another module. + * + * @alpha + */ +export interface UseModuleOptions { + parameters?: { [key: string]: number | string | DeploymentGraphFuture }; + after?: DeploymentGraphFuture[]; +} + +/** + * Allowed parameters that can be passed into a module. + * + * @alpha + */ +export type ExternalParamValue = boolean | string | number | BigNumber; + +/** + * Allowed parameters across internal `useModule` boundaries. + * + * @alpha + */ +export type InternalParamValue = + | ExternalParamValue + | DeploymentGraphFuture + | EventParamFuture; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 9a41329fce..43d96e84a6 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,7 +1,4 @@ -import type { - ExternalParamValue, - IDeploymentBuilder, -} from "../internal/types/deploymentGraph"; +import type { ExternalParamValue } from "../types/dsl"; import type { ContractFuture, LibraryFuture, @@ -9,6 +6,8 @@ import type { Virtual, } from "./future"; +import { IDeploymentBuilder } from "./dsl"; + /** * The potential return results of deploying a module. * diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index fe902c6124..262af66970 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,4 +1,4 @@ -import type { ExternalParamValue } from "../internal/types/deploymentGraph"; +import type { ExternalParamValue } from "../types/dsl"; import type { Artifact } from "./hardhat"; import { ethers } from "ethers"; diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index 754d2cb6d6..70c69454bc 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { ethers } from "ethers"; @@ -10,6 +7,7 @@ import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts index 8195fa7801..daea59dc63 100644 --- a/packages/core/test/deploymentBuilder/artifacts.ts +++ b/packages/core/test/deploymentBuilder/artifacts.ts @@ -1,14 +1,12 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentBuilder, - IDeploymentGraph, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index 32820318d7..f0500058bf 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -3,11 +3,9 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - IDeploymentBuilder, - IDeploymentGraph, -} from "../../src/internal/types/deploymentGraph"; +import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 51dc415ec0..0a6e70257c 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; @@ -13,6 +10,7 @@ import { isDeployedContract, isHardhatContract, } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { Artifact } from "../../src/types/hardhat"; import { diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index edf4c749fd..221a045d56 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -3,15 +3,13 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { - IDeploymentBuilder, - IDeploymentGraph, -} from "../../src/internal/types/deploymentGraph"; -import { + isArtifactContract, isAwaitedEvent, isCall, - isArtifactContract, } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract } from "../../src/types/future"; import { diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index 0f61a97100..6b0c964b6d 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; @@ -12,6 +9,7 @@ import { isHardhatContract, isHardhatLibrary, } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts index 4fec41cf11..8ef70feab3 100644 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder } from "../../src/internal/types/deploymentGraph"; +import { IDeploymentBuilder } from "../../src/types/dsl"; describe("deployment builder - metadata", () => { it("should inject the chainId via the builder", () => { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index f889a4b268..686a4a600f 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; @@ -10,6 +7,7 @@ import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCallable } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; describe("deployment builder - parameters", function () { let deploymentGraph: IDeploymentGraph; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index 9b1e81b077..18b50ec012 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -4,11 +4,9 @@ import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - IDeploymentBuilder, - IDeploymentGraph, -} from "../../src/internal/types/deploymentGraph"; +import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isHardhatContract } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDependenciesForVertex, diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index f3b36a2d70..49d652361a 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -1,13 +1,11 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract, CallableFuture, diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 557d640a93..ab6eb203d4 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import type { - IDeploymentGraph, - IDeploymentBuilder, -} from "../../src/internal/types/deploymentGraph"; +import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import type { Artifact } from "../../src/types/hardhat"; import { assert } from "chai"; @@ -12,9 +9,10 @@ import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract, - isHardhatContract, isCall, + isHardhatContract, } from "../../src/internal/utils/guards"; +import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDeploymentVertexByLabel } from "./helpers"; diff --git a/packages/core/test/helpers/getMockProviders.ts b/packages/core/test/helpers/getMockProviders.ts index bce5f66978..f7b0bca5a7 100644 --- a/packages/core/test/helpers/getMockProviders.ts +++ b/packages/core/test/helpers/getMockProviders.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { IgnitionError } from "../../src/errors"; -import { ExternalParamValue } from "../../src/internal/types/deploymentGraph"; +import { ExternalParamValue } from "../../src/types/dsl"; import { Artifact } from "../../src/types/hardhat"; import { ModuleParams } from "../../src/types/module"; import { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 0844202846..dc0b45dd77 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -1,5 +1,4 @@ /* eslint-disable import/no-unused-modules */ -import type { IDeploymentBuilder } from "../src/internal/types/deploymentGraph"; import { assert } from "chai"; import { ethers } from "ethers"; @@ -10,6 +9,7 @@ import { generateDeploymentGraphFrom } from "../src/internal/process/generateDep import { Services } from "../src/internal/types/services"; import { ValidationVisitResult } from "../src/internal/types/validation"; import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; +import { IDeploymentBuilder } from "../src/types/dsl"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; From 9b91126329c97f90ac109301fdfbe93a601cefd4 Mon Sep 17 00:00:00 2001 From: dinesh <67892133+dinesh11515@users.noreply.github.com> Date: Mon, 3 Apr 2023 23:47:05 +0530 Subject: [PATCH 0271/1302] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 4a4b1dfcdc..81586ed74d 100644 --- a/README.md +++ b/README.md @@ -51,10 +51,10 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex This repo contains example projects that show **Ignition** features in context (under `./examples`): -- [Sample](./examples/sample/README.md) - the **Hardhat** starter project enhanced with Ignition -- [ENS](./examples/ens/README.md) - deploy ENS and its registry for local testing -- [Create2](./examples/create2/README.md) - deploy contracts using a `create2` factory -- [Uniswap](./examples/uniswap/README.md) - deploy Uniswap and test swaps +- [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Ignition +- [ENS](./examples/ens) - deploy ENS and its registry for local testing +- [Create2](./examples/create2) - deploy contracts using a `create2` factory +- [Uniswap](./examples/uniswap) - deploy Uniswap and test swaps ## Contributing From d74c138c940bece2a1634d4047186976f55662ae Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Apr 2023 20:38:33 +0100 Subject: [PATCH 0272/1302] fix: support complex types as arg option on call (#189) Support recursive structures in `m.call` args including arrays, objects, nested objects, nested arrays or any recursive combination. Fixes #186. --- packages/core/src/dsl/DeploymentBuilder.ts | 4 +- packages/core/src/index.ts | 3 + ...onvertDeploymentVertexToExecutionVertex.ts | 20 +- .../core/src/internal/types/executionGraph.ts | 24 +- packages/core/src/types/dsl.ts | 12 +- packages/core/test/deploymentBuilder/calls.ts | 452 ++++++++++++------ packages/hardhat-plugin/test/calls.ts | 49 ++ .../minimal/contracts/Contracts.sol | 85 ++++ 8 files changed, 482 insertions(+), 167 deletions(-) diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/dsl/DeploymentBuilder.ts index f24b25754c..e2172e978d 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/dsl/DeploymentBuilder.ts @@ -51,6 +51,7 @@ import { isCallable, isContract, isDependable, + isFuture, isParameter, } from "../internal/utils/guards"; import { resolveProxyDependency } from "../internal/utils/proxy"; @@ -765,7 +766,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { typeof arg === "string" || typeof arg === "number" || typeof arg === "boolean" || - BigNumber.isBigNumber(arg) + BigNumber.isBigNumber(arg) || + !isFuture(arg) ) { return; } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 940d8dce54..5ac67d71cd 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -56,6 +56,8 @@ export type { SendETHSuccess, SentETHExecutionVertex, VertexVisitResultSuccessResult, + BaseArgValue, + StructuredArgValue, } from "./internal/types/executionGraph"; export type { AdjacencyList, @@ -81,6 +83,7 @@ export type { } from "./internal/types/services"; export { AwaitOptions, + BaseArgumentType, CallOptions, ContractOptions, ExternalParamValue, diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index 2709ca41b2..7ae80d1b0a 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -1,8 +1,8 @@ import { BigNumber, ethers } from "ethers"; import { IgnitionError } from "../../../errors"; -import { ExternalParamValue } from "../../../types/dsl"; -import { DeploymentGraphFuture, EventParamFuture } from "../../../types/future"; +import { ExternalParamValue, InternalParamValue } from "../../../types/dsl"; +import { DeploymentGraphFuture } from "../../../types/future"; import { Artifact } from "../../../types/hardhat"; import { ArtifactContractDeploymentVertex, @@ -17,6 +17,7 @@ import { SendVertex, } from "../../types/deploymentGraph"; import { + ArgValue, AwaitedEventExecutionVertex, ContractCallExecutionVertex, ContractDeployExecutionVertex, @@ -226,18 +227,9 @@ async function convertSendToSentETH( } async function convertArgs( - args: Array< - | boolean - | string - | number - | BigNumber - | DeploymentGraphFuture - | EventParamFuture - >, + args: InternalParamValue[], transformContext: TransformContext -): Promise< - Array -> { +): Promise { const resolvedArgs = []; for (const arg of args) { @@ -252,7 +244,7 @@ async function convertArgs( async function resolveParameter( arg: ExternalParamValue | T, { services, graph }: TransformContext -): Promise { +): Promise { if (!isFuture(arg)) { return arg; } diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts index e55838e179..0febcd6fef 100644 --- a/packages/core/src/internal/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -28,16 +28,32 @@ export interface IExecutionGraph { getEdges(): Array<{ from: number; to: number }>; } +/** + * The base value that Ethereum ABIs accept. + * + * @internal + */ +export type BaseArgValue = number | BigNumber | string | boolean; + +/** + * A composite (i.e. arrays and nested objects) of base value that Ethereum + * ABIs accept. + * + * @internal + */ +export type StructuredArgValue = + | BaseArgValue + | StructuredArgValue[] + | { [field: string]: StructuredArgValue }; + /** * The allowed values when passing an argument to a smart contract method call. * * @internal */ export type ArgValue = - | boolean - | string - | number - | BigNumber + | BaseArgValue + | StructuredArgValue | DeploymentGraphFuture; /** diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index 6c604860e7..21c5ddca5c 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -266,12 +266,22 @@ export interface UseModuleOptions { after?: DeploymentGraphFuture[]; } +/** + * Paramater value types + * + * @alpha + */ +export type BaseArgumentType = number | BigNumber | string | boolean; + /** * Allowed parameters that can be passed into a module. * * @alpha */ -export type ExternalParamValue = boolean | string | number | BigNumber; +export type ExternalParamValue = + | BaseArgumentType + | ExternalParamValue[] + | { [field: string]: ExternalParamValue }; /** * Allowed parameters across internal `useModule` boundaries. diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index f0500058bf..89262b779c 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -12,191 +12,349 @@ import { getDeploymentVertexByLabel, } from "./helpers"; -describe("deployment builder - chainId", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); - const another = m.contract("Another"); - - m.call(exchange, "addToken", { - args: [token], - after: [another], - from: m.accounts[0], +describe("deployment builder - calls", () => { + describe("with basic value args", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + const exchange = m.contract("Exchange"); + const another = m.contract("Another"); + + m.call(exchange, "addToken", { + args: [token], + after: [another], + from: m.accounts[0], + }); + + return {}; }); - return {}; + const { graph } = generateDeploymentGraphFrom(callModule, { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + }); + + deploymentGraph = graph; }); - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], + it("should create a graph", () => { + assert.isDefined(deploymentGraph); }); - deploymentGraph = graph; - }); + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 4); + }); - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + it("should have the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); - if (depNode === undefined) { - return assert.isDefined(depNode); - } + it("should have the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should have the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); + assert.equal(depNode?.label, "Exchange/addToken"); + assert(isCall(depNode)); + }); - if (depNode === undefined) { - return assert.isDefined(depNode); - } + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - assert.equal(depNode?.label, "Exchange/addToken"); - assert(isCall(depNode)); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + const deps = getDependenciesForVertex(deploymentGraph, depNode); - if (depNode === undefined) { - return assert.isDefined(depNode); - } + assert.deepStrictEqual(deps, []); + }); - const deps = getDependenciesForVertex(deploymentGraph, depNode); + it("should show no dependencies for the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - assert.deepStrictEqual(deps, []); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should show no dependencies for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + const deps = getDependenciesForVertex(deploymentGraph, depNode); - if (depNode === undefined) { - return assert.isDefined(depNode); - } + assert.deepStrictEqual(deps, []); + }); - const deps = getDependenciesForVertex(deploymentGraph, depNode); + it("should show three dependencies for the call node Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + { id: 1, label: "Exchange", type: "" }, + { id: 2, label: "Another", type: "" }, + ]); + }); - assert.deepStrictEqual(deps, []); - }); + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - it("should show three dependencies for the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Token", - type: "", - }, - { id: 1, label: "Exchange", type: "" }, - { id: 2, label: "Another", type: "" }, - ]); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } - if (depNode === undefined) { - return assert.isDefined(depNode); - } + assert.deepStrictEqual(depNode.args, []); + }); - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } + it("should record the argument list for the contract node Exchange as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - assert.deepStrictEqual(depNode.args, []); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } - if (depNode === undefined) { - return assert.isDefined(depNode); - } + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 0, + label: "Token", + type: "contract", + subtype: "hardhat", + contractName: "Token", + _future: true, + }, + ]); + }); - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } + it("should record the address to send from for the call node Exchange at Exchange/addToken", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Exchange/addToken" + ); - assert.deepStrictEqual(depNode.args, []); - }); + if (depNode === undefined) { + return assert.isDefined(depNode); + } - it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 0, - label: "Token", - type: "contract", - subtype: "hardhat", - contractName: "Token", - _future: true, - }, - ]); + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); - it("should record the address to send from for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); + describe("with array args", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const captureArraysContracts = m.contract("CaptureArraysContract"); + + m.call(captureArraysContracts, "recordArrays", { + args: [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ], + from: m.accounts[0], + }); + + return {}; + }); + + const { graph } = generateDeploymentGraphFrom(callModule, { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + }); + + deploymentGraph = graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have four nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have the contract node CaptureArraysContract", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "CaptureArraysContract"); + assert(isHardhatContract(depNode)); + }); + + it("should have the call node CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "CaptureArraysContract/recordArrays"); + assert(isCall(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); - if (depNode === undefined) { - return assert.isDefined(depNode); - } + if (depNode === undefined) { + return assert.isDefined(depNode); + } - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } + const deps = getDependenciesForVertex(deploymentGraph, depNode); - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + assert.deepStrictEqual(deps, []); + }); + + it("should show one dependencies for the call node CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "CaptureArraysContract", + type: "", + }, + ]); + }); + + it("should record the argument list for the contract node CaptureArraysContract as empty", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ]); + }); + + it("should record the address to send from for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isCall(depNode)) { + return assert.fail("Not a call dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); }); }); diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index c0ed898503..7cc910cac3 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -30,6 +30,55 @@ describe("calls", () => { assert.equal(usedAddress, result.bar.address); }); + it("should be able to call contracts with array args", async function () { + const result = await deployModule(this.hre, (m) => { + const captureArraysContract = m.contract("CaptureArraysContract"); + + m.call(captureArraysContract, "recordArrays", { + args: [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ], + }); + + return { captureArraysContract }; + }); + + assert.isDefined(result.captureArraysContract); + + const captureSuceeded = await result.captureArraysContract.arraysCaptured(); + + assert(captureSuceeded); + }); + + it("should be able to call contracts with arrays nested in objects args", async function () { + const result = await deployModule(this.hre, (m) => { + const captureComplexObjectContract = m.contract( + "CaptureComplexObjectContract" + ); + + m.call(captureComplexObjectContract, "testComplexObject", { + args: [ + { + firstBool: true, + secondArray: [1, 2, 3], + thirdSubcomplex: { sub: "sub" }, + }, + ], + }); + + return { captureComplexObjectContract }; + }); + + assert.isDefined(result.captureComplexObjectContract); + + const captureSuceeded = + await result.captureComplexObjectContract.complexArgCaptured(); + + assert(captureSuceeded); + }); + it("should be able to make calls in order", async function () { const result = await deployModule(this.hre, (m) => { const trace = m.contract("Trace", { diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index c6d6336bf4..03e094119f 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -1,5 +1,6 @@ // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; contract Foo { bool public isFoo = true; @@ -53,3 +54,87 @@ contract PassingValue { function deposit() public payable {} } + +contract CaptureArraysContract { + bool public arraysCaptured; + + constructor() { + arraysCaptured = false; + } + + function recordArrays( + uint256[] memory first, + string[] memory second, + bool[] memory third + ) public returns (uint256 output) { + arraysCaptured = true; + + require(first.length == 3, "Wrong number of args on first arg"); + require(first[0] == 1, "First value is wrong"); + require(first[1] == 2, "Second value is wrong"); + require(first[2] == 3, "Third value is wrong"); + + require(second.length == 3, "Wrong number of args on second arg"); + require( + keccak256(abi.encodePacked(second[0])) == + keccak256(abi.encodePacked("a")), + "First value is wrong" + ); + require( + keccak256(abi.encodePacked(second[1])) == + keccak256(abi.encodePacked("b")), + "Second value is wrong" + ); + require( + keccak256(abi.encodePacked(second[2])) == + keccak256(abi.encodePacked("c")), + "Third value is wrong" + ); + + require(third.length == 3, "Wrong number of args on third arg"); + require(third[0] == true, "First value is wrong"); + require(third[1] == false, "Second value is wrong"); + require(third[2] == true, "Third value is wrong"); + + return 1; + } +} + +contract CaptureComplexObjectContract { + bool public complexArgCaptured; + + constructor() { + complexArgCaptured = false; + } + + struct SubComplex { + string sub; + } + + struct Complex { + bool firstBool; + uint256[] secondArray; + SubComplex thirdSubcomplex; + } + + function testComplexObject( + Complex memory complexArg + ) public returns (uint256 output) { + complexArgCaptured = true; + + require(complexArg.firstBool, "bad first bool"); + + require(complexArg.secondArray.length == 3, "bad second array"); + require(complexArg.secondArray[0] == 1, "First value is wrong"); + require(complexArg.secondArray[1] == 2, "Second value is wrong"); + require(complexArg.secondArray[2] == 3, "Third value is wrong"); + + require( + keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == + keccak256(abi.encodePacked("sub")), + "The complex sub object property is wrong" + ); + + return 1; + } +} From c3bd54b815f47f0907fa38c9c1f9f0292df51bb6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Apr 2023 09:58:46 +0100 Subject: [PATCH 0273/1302] chore: bump version to v0.0.12 Update the packages versions and changelogs for the `0.0.12 - 2023-04-04` release. --- examples/create2/package.json | 4 +- examples/ens/package.json | 4 +- examples/multisig/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/uniswap/package.json | 4 +- package-lock.json | 6152 ++++++++++++++------------ packages/core/CHANGELOG.md | 6 + packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 6 + packages/hardhat-plugin/package.json | 6 +- 11 files changed, 3467 insertions(+), 2729 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index 307ec30726..55930be3bf 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-create2-example", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/ens/package.json b/examples/ens/package.json index c8ba59995f..74f9f11243 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 671df3b923..f6975fce6d 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-example-multisig", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/sample/package.json b/examples/sample/package.json index f52f98ceea..1d1b1231e3 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 7c91daf378..611939fbb1 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 5cbf0e0aab..868f6c9365 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.11", + "version": "0.0.12", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/package-lock.json b/package-lock.json index 46eb195865..053988a642 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,65 +30,61 @@ }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.11", + "version": "0.0.12", "dependencies": { "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, - "examples/create2/node_modules/@openzeppelin/contracts": { - "version": "4.7.3", - "license": "MIT" - }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.11", + "version": "0.0.12", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/multisig": { "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.11", + "version": "0.0.12", "dependencies": { "@openzeppelin/contracts": "^4.3.2" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.11", + "version": "0.0.12", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.11", + "version": "0.0.12", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.11", + "version": "0.0.12", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -100,14 +96,15 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.11", + "@ignored/hardhat-ignition": "^0.0.12", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, "examples/uniswap/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" }, "node_modules/@ampproject/remapping": { "version": "2.2.0", @@ -132,30 +129,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", "@babel/helper-module-transforms": "^7.21.2", "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", + "@babel/parser": "^7.21.4", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -171,9 +168,9 @@ } }, "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -182,18 +179,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/core/node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -204,12 +189,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.3", + "@babel/types": "^7.21.4", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -233,13 +218,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -251,15 +236,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -269,12 +245,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", @@ -310,12 +280,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" @@ -491,9 +461,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -528,9 +498,9 @@ } }, "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -540,19 +510,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -561,9 +531,9 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { "@babel/highlight": "^7.18.6" @@ -582,9 +552,9 @@ } }, "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.19.4", @@ -674,367 +644,490 @@ "dns-packet": "^5.3.0" } }, - "node_modules/@ensdomains/ensjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts" + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/@ensdomains/solsha1": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", - "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dependencies": { - "hash-test-vectors": "^1.3.2" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/@ensdomains/ens/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@ensdomains/ens/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ensdomains/ens/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=0.10.0" } }, - "node_modules/@ethereumjs/common": { + "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "node_modules/@ensdomains/ens/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" + "node_modules/@ensdomains/ens/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/address": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dependencies": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/rlp": "^5.6.1" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/@ensdomains/ens/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" + }, + "bin": { + "solcjs": "solcjs" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "@ethersproject/logger": "^5.7.0" + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dependencies": { - "@ethersproject/bignumber": "^5.7.0" + "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@ensdomains/ens/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + }, + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "dependencies": { + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" + } + }, + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "dependencies": { + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" + } + }, + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" + } + }, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" + }, + "node_modules/@ensdomains/solsha1": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", + "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", + "dependencies": { + "hash-test-vectors": "^1.3.2" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@ethersproject/hash": { + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ethersproject/abi": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -1046,18 +1139,18 @@ } ], "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { + "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", @@ -1079,10 +1172,10 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/hdnode": { + "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -1094,24 +1187,19 @@ } ], "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/web": "^5.7.0" } }, - "node_modules/@ethersproject/json-wallets": { + "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -1123,25 +1211,17 @@ } ], "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", "funding": [ { "type": "individual", @@ -1153,17 +1233,17 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" } }, - "node_modules/@ethersproject/keccak256": { + "node_modules/@ethersproject/base64": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -1175,14 +1255,13 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@ethersproject/logger": { + "node_modules/@ethersproject/basex": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -1192,12 +1271,16 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "funding": [ { "type": "individual", @@ -1209,13 +1292,15 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@ethersproject/pbkdf2": { + "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -1227,14 +1312,13 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/properties": { + "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -1246,13 +1330,13 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.7.0" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -1264,29 +1348,19 @@ } ], "dependencies": { + "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", @@ -1308,10 +1382,10 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/random": { + "node_modules/@ethersproject/hash": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -1323,14 +1397,21 @@ } ], "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/rlp": { + "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1342,14 +1423,17 @@ } ], "dependencies": { + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/sha2": { + "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -1361,15 +1445,24 @@ } ], "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@ethersproject/signing-key": { + "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "funding": [ { "type": "individual", @@ -1381,18 +1474,25 @@ } ], "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@ethersproject/solidity": { + "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1408,14 +1508,13 @@ "@ethersproject/bytes": "^5.7.0", "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/strings": { + "node_modules/@ethersproject/keccak256": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -1428,14 +1527,28 @@ ], "dependencies": { "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" + "js-sha3": "0.8.0" } }, - "node_modules/@ethersproject/transactions": { + "node_modules/@ethersproject/logger": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] + }, + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -1447,21 +1560,13 @@ } ], "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { + "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -1473,17 +1578,14 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@ethersproject/units": { + "node_modules/@ethersproject/properties": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -1495,15 +1597,13 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -1518,21 +1618,26 @@ "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", "@ethersproject/properties": "^5.7.0", "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" } }, - "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { + "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", @@ -1554,11 +1659,257 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" + } + }, + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/strings": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ { "type": "individual", "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" @@ -1642,15 +1993,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1821,33 +2163,6 @@ "node": ">=12.0.0" } }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, "node_modules/@microsoft/api-extractor": { "version": "7.34.4", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", @@ -1882,15 +2197,6 @@ "@rushstack/node-core-library": "3.55.2" } }, - "node_modules/@microsoft/api-extractor/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "4.8.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", @@ -2027,32 +2333,54 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.0.0.tgz", - "integrity": "sha512-bk8uP8VuexLgyIZAHExH1QEovqx0Lzhc9Ntm63nCRKLHXIZkobaFaeCVwTESV7YkPKUk7NiK11s8ryed4CS9yA==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", + "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-trie": "5.0.5", + "@nomicfoundation/ethereumjs-tx": "4.1.2", + "@nomicfoundation/ethereumjs-util": "8.0.6", "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.0.0.tgz", - "integrity": "sha512-pLFEoea6MWd81QQYSReLlLfH7N9v7lH66JC/NMPN848ySPPQA5renWnE7wPByfQFzNrPBuDDRFFULMDmj1C0xw==", + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-ethash": "^2.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", + "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "4.2.2", + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-ethash": "2.0.5", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-trie": "5.0.5", + "@nomicfoundation/ethereumjs-util": "8.0.6", "abstract-level": "^1.0.3", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", @@ -2064,36 +2392,45 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "yallist": "^3.0.2" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.0.0.tgz", - "integrity": "sha512-WS7qSshQfxoZOpHG/XqlHEGRG1zmyjYrvmATvc4c62+gZXgre1ymYP8ZNgx/3FyZY0TWe9OjFlKOfLqmgOeYwA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", + "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", "dependencies": { - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-util": "8.0.6", "crc-32": "^1.2.0" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.0.tgz", - "integrity": "sha512-WpDvnRncfDUuXdsAXlI4lXbqUDOA+adYRQaEezIkxqDkc+LDyYDbd/xairmY98GnQzo1zIqsIL6GB5MoMSJDew==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", + "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-block": "4.2.2", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-util": "8.0.6", "abstract-level": "^1.0.3", "bigint-crypto-utils": "^3.0.23", "ethereum-cryptography": "0.1.3" @@ -2102,13 +2439,35 @@ "node": ">=14" } }, + "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.0.0.tgz", - "integrity": "sha512-hVS6qRo3V1PLKCO210UfcEQHvlG7GqR8iFzp0yyjTg2TmJQizcChKgWo8KFsdMw6AyoLgLhHGHw4HdlP8a4i+Q==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", + "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-util": "8.0.6", "@types/async-eventemitter": "^0.2.1", "async-eventemitter": "^0.2.4", "debug": "^4.3.3", @@ -2120,10 +2479,32 @@ "node": ">=14" } }, + "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.0.tgz", - "integrity": "sha512-GaSOGk5QbUk4eBP5qFbpXoZoZUj/NrW7MRa0tKY4Ew4c2HAS0GXArEMAamtFrkazp0BO4K5p2ZCG3b2FmbShmw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", + "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", "bin": { "rlp": "bin/rlp" }, @@ -2132,26 +2513,48 @@ } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.0.tgz", - "integrity": "sha512-jCtqFjcd2QejtuAMjQzbil/4NHf5aAWxUc+CvS0JclQpl+7M0bxMofR2AJdtz+P3u0ke2euhYREDiE7iSO31vQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", + "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-trie": "5.0.5", + "@nomicfoundation/ethereumjs-util": "8.0.6", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "functional-red-black-tree": "^1.0.1" } }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.0.tgz", - "integrity": "sha512-LIj5XdE+s+t6WSuq/ttegJzZ1vliwg6wlb+Y9f4RlBpuK35B9K02bO7xU+E6Rgg9RGptkWd6TVLdedTI4eNc2A==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", + "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-util": "8.0.6", "ethereum-cryptography": "0.1.3", "readable-stream": "^3.6.0" }, @@ -2159,61 +2562,149 @@ "node": ">=14" } }, + "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.0.0.tgz", - "integrity": "sha512-Gg3Lir2lNUck43Kp/3x6TfBNwcWC9Z1wYue9Nz3v4xjdcv6oDW9QSMJxqsKw9QEGoBBZ+gqwpW7+F05/rs/g1w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", + "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", "dependencies": { - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-util": "8.0.6", "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.0.tgz", - "integrity": "sha512-2emi0NJ/HmTG+CGY58fa+DQuAoroFeSH9gKu9O6JnwTtlzJtgfTixuoOqLEgyyzZVvwfIpRueuePb8TonL1y+A==", + "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "^4.0.0-beta.2", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.0.0.tgz", - "integrity": "sha512-JMPxvPQ3fzD063Sg3Tp+UdwUkVxMoo1uML6KSzFhMH3hoQi/LMuXBoEHAoW83/vyNS9BxEe6jm6LmT5xdeEJ6w==", + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", + "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=14" } }, - "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", + "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "4.2.2", + "@nomicfoundation/ethereumjs-blockchain": "6.2.2", + "@nomicfoundation/ethereumjs-common": "3.1.2", + "@nomicfoundation/ethereumjs-evm": "1.3.2", + "@nomicfoundation/ethereumjs-rlp": "4.0.3", + "@nomicfoundation/ethereumjs-statemanager": "1.0.5", + "@nomicfoundation/ethereumjs-trie": "5.0.5", + "@nomicfoundation/ethereumjs-tx": "4.1.2", + "@nomicfoundation/ethereumjs-util": "8.0.6", + "@types/async-eventemitter": "^0.2.1", + "async-eventemitter": "^0.2.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "functional-red-black-tree": "^1.0.1", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", "dev": true, "peer": true, @@ -2244,6 +2735,47 @@ "hardhat": "^2.9.5" } }, + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@nomicfoundation/hardhat-toolbox": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", @@ -2499,866 +3031,1338 @@ "table": "^6.8.0", "undici": "^5.14.0" }, - "peerDependencies": { - "hardhat": "^2.0.4" + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "peer": true, + "dependencies": { + "@types/bignumber.js": "^5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "engines": { + "node": "*" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", + "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" + }, + "node_modules/@pkgr/utils": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", + "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "is-glob": "^4.0.3", + "open": "^8.4.0", + "picocolors": "^1.0.0", + "tiny-glob": "^0.2.9", + "tslib": "^2.4.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@pkgr/utils/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/@rushstack/node-core-library": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "dev": true, + "dependencies": { + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "dev": true, + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "dev": true, + "dependencies": { + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@scure/base": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dependencies": { - "color-convert": "^1.9.0" + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dependencies": { - "color-name": "1.1.3" + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "peer": true, + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=6" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "dependencies": { + "type-detect": "4.0.8" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", "dev": true, - "peer": true, "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", - "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dependencies": { - "@nomiclabs/truffle-contract": "^4.2.23", - "@types/chai": "^4.2.0", - "chai": "^4.2.0", - "ethereumjs-util": "^7.1.4", - "fs-extra": "^7.0.1" - }, - "peerDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "hardhat": "^2.6.4", - "web3": "^1.0.0-beta.36" + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "defer-to-connect": "^2.0.1" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.16" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@truffle/abi-utils": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.9.tgz", + "integrity": "sha512-G5dqgwRHx5zwlXjz3QT8OJVfB2cOqWwD6DwKso0KttUt/zejhCjnkKq72rSgyeLMkz7wBB9ERLOsupLBILM8MA==", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.8.2" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node_modules/@truffle/abi-utils/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", - "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", - "peer": true, + "node_modules/@truffle/abi-utils/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@types/bignumber.js": "^5.0.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, - "peerDependencies": { - "hardhat": "^2.0.0", - "web3": "^1.0.0-beta.36" + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@nomiclabs/truffle-contract": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", - "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "node_modules/@truffle/abi-utils/node_modules/web3-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", "dependencies": { - "@ensdomains/ensjs": "^2.0.1", - "@truffle/blockchain-utils": "^0.1.3", - "@truffle/contract-schema": "^3.4.7", - "@truffle/debug-utils": "^6.0.22", - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.16", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19" + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, - "peerDependencies": { - "web3": "^1.2.1", - "web3-core-helpers": "^1.2.1", - "web3-core-promievent": "^1.2.1", - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" - } - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.7.tgz", + "integrity": "sha512-1nibqGjEHC7KAyDThEFvbm2+EO8zAHee/VjCtxkYBE3ySwP50joh0QCEBjy7K/9z+icpMoDucfxmgaKToBFUgQ==" }, - "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "node_modules/@truffle/codec": { + "version": "0.14.16", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.16.tgz", + "integrity": "sha512-a9UY3n/FnkKN3Q4zOuMFOOcLWb80mdknj+voim4vvXYtJm1aAZQZE5sG9aLnMBTl4TiGLzUtfNDVYY7WgWgDag==", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "@truffle/abi-utils": "^0.3.9", + "@truffle/compile-common": "^0.9.4", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.8.2" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.8.2.tgz", - "integrity": "sha512-kEUOgPQszC0fSYWpbh2kT94ltOJwj1qfT2DWo+zVttmGmf97JZ99LspePNaeeaLhCImaHVeBbjaQFZQn7+Zc5g==" + "node_modules/@truffle/codec/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } }, - "node_modules/@pkgr/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", - "dev": true, + "node_modules/@truffle/codec/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "cross-spawn": "^7.0.3", - "is-glob": "^4.0.3", - "open": "^8.4.0", - "picocolors": "^1.0.0", - "tiny-glob": "^0.2.9", - "tslib": "^2.4.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": ">=10.0.0" } }, - "node_modules/@rushstack/node-core-library": { - "version": "3.55.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", - "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", - "dev": true, + "node_modules/@truffle/codec/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.3.0", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" + "yallist": "^4.0.0" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "engines": { + "node": ">=10" } }, - "node_modules/@rushstack/node-core-library/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", "engines": { - "node": ">=0.1.90" + "node": ">=8" } }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node": ">=10" } }, - "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, + "node_modules/@truffle/codec/node_modules/web3-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=8.0.0" } }, - "node_modules/@rushstack/rig-package": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", - "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", - "dev": true, - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } + "node_modules/@truffle/codec/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", - "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", - "dev": true, + "node_modules/@truffle/compile-common": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", + "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" + "@truffle/error": "^0.2.0", + "colors": "1.4.0" } }, - "node_modules/@rushstack/ts-command-line/node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", + "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" + }, + "node_modules/@truffle/compile-common/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "engines": { "node": ">=0.1.90" } }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@truffle/contract-schema": { + "version": "3.4.13", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", + "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "ajv": "^6.10.0", + "debug": "^4.3.1" } }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "node_modules/@truffle/debug-utils": { + "version": "6.0.47", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.47.tgz", + "integrity": "sha512-bUjdzLPdEKtoUCDzaXkrOoi+PbyAJlMBzGequBK8tirT7xL9bCP2Pd/WxvnmRd7AnfroxGNvXwVXWTItW5SMWQ==", "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" + "@truffle/codec": "^0.14.16", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" } }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "node_modules/@truffle/debug-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "node_modules/@truffle/debug-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, + "color-name": "1.1.3" + } + }, + "node_modules/@truffle/debug-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { - "node": ">=6" + "node": ">=0.8.0" } }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@truffle/debug-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "node_modules/@truffle/debug-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "node_modules/@truffle/interface-adapter": { + "version": "0.5.31", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.31.tgz", + "integrity": "sha512-f5mOqbptQUUgHhBrBvWie4EUAUqHLN/wCBjFoP2N/QNcyvwGfdC3TSck9kjwIIFIgYgQQyAxQDGBQcjHryvxzg==", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.8.2" } }, - "node_modules/@sentry/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "engines": { - "node": ">=6" + "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=6" + "node": ">=10.0.0" } }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { - "type-detect": "4.0.8" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", - "dev": true, + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@truffle/interface-adapter/node_modules/web3": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", + "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", + "hasInstallScript": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "web3-bzz": "1.8.2", + "web3-core": "1.8.2", + "web3-eth": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-shh": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", - "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", - "dev": true, + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", + "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", + "hasInstallScript": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "peer": true, + "node_modules/@truffle/interface-adapter/node_modules/web3-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", + "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" + "@types/bn.js": "^5.1.0", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-requestmanager": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", + "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", "dependencies": { - "defer-to-connect": "^2.0.1" + "web3-eth-iban": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { - "node": ">=14.16" + "node": ">=8.0.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "node_modules/@truffle/abi-utils": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.9.tgz", - "integrity": "sha512-G5dqgwRHx5zwlXjz3QT8OJVfB2cOqWwD6DwKso0KttUt/zejhCjnkKq72rSgyeLMkz7wBB9ERLOsupLBILM8MA==", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", + "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.6.tgz", - "integrity": "sha512-SldoNRIFSm3+HMBnSc2jFsu5TWDkCN4X6vL3wrd0t6DIeF7nD6EoPPjxwbFSoqCnkkRxMuZeL6sUx7UMJS/wSA==" + "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", + "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", + "dependencies": { + "eventemitter3": "4.0.4" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/@truffle/codec": { - "version": "0.14.16", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.16.tgz", - "integrity": "sha512-a9UY3n/FnkKN3Q4zOuMFOOcLWb80mdknj+voim4vvXYtJm1aAZQZE5sG9aLnMBTl4TiGLzUtfNDVYY7WgWgDag==", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", + "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", "dependencies": { - "@truffle/abi-utils": "^0.3.9", - "@truffle/compile-common": "^0.9.4", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.8.2" + "util": "^0.12.5", + "web3-core-helpers": "1.8.2", + "web3-providers-http": "1.8.2", + "web3-providers-ipc": "1.8.2", + "web3-providers-ws": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", + "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", + "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", + "dependencies": { + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-accounts": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-eth-ens": "1.8.2", + "web3-eth-iban": "1.8.2", + "web3-eth-personal": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", + "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.8.2" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/@truffle/compile-common": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", - "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", + "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", "dependencies": { - "@truffle/error": "^0.2.0", - "colors": "1.4.0" + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", - "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", - "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.47", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.47.tgz", - "integrity": "sha512-bUjdzLPdEKtoUCDzaXkrOoi+PbyAJlMBzGequBK8tirT7xL9bCP2Pd/WxvnmRd7AnfroxGNvXwVXWTItW5SMWQ==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", + "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", "dependencies": { - "@truffle/codec": "^0.14.16", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" + "@types/bn.js": "^5.1.0", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-utils": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", + "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", "dependencies": { - "color-convert": "^1.9.0" + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-promievent": "1.8.2", + "web3-eth-abi": "1.8.2", + "web3-eth-contract": "1.8.2", + "web3-utils": "1.8.2" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", + "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "bn.js": "^5.2.1", + "web3-utils": "1.8.2" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", + "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "@types/node": "^12.12.6", + "web3-core": "1.8.2", + "web3-core-helpers": "1.8.2", + "web3-core-method": "1.8.2", + "web3-net": "1.8.2", + "web3-utils": "1.8.2" + }, "engines": { - "node": ">=0.8.0" + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "node_modules/@truffle/interface-adapter/node_modules/web3-net": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", + "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", + "dependencies": { + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-utils": "1.8.2" + }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", + "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", "dependencies": { - "has-flag": "^3.0.0" + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.8.2" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@truffle/error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.30", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.30.tgz", - "integrity": "sha512-wyCcESeZJBkAfuSGU8GHCusIWDUDyQjJZMcyShv59ZTSAwQR7xx0+a0Q1LlS532G/pGFLYe2VzKSY1pRHRwgug==", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", + "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.8.2" + "oboe": "2.1.5", + "web3-core-helpers": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", + "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.2", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", + "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", + "hasInstallScript": true, "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-net": "1.8.2" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", @@ -3394,6 +4398,14 @@ "node": ">=4" } }, + "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, "node_modules/@trufflesuite/chromafi/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -3447,6 +4459,14 @@ "node": ">=4" } }, + "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3535,6 +4555,29 @@ "node": ">=10" } }, + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -3801,9 +4844,9 @@ "dev": true }, "node_modules/@types/d3-selection": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.4.tgz", - "integrity": "sha512-ZeykX7286BCyMg9sH5fIAORyCB6hcATPSRQpN47jwBA2bMbAT0s+EvtDP5r1FZYJ95R8QoEE1CKJX+n0/M5Vhg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", "dev": true }, "node_modules/@types/d3-shape": { @@ -3966,11 +5009,10 @@ "dev": true }, "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true, - "peer": true + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.31", @@ -3989,9 +5031,9 @@ } }, "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + "version": "12.20.25", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -4021,9 +5063,9 @@ "peer": true }, "node_modules/@types/prompts": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.3.tgz", - "integrity": "sha512-qpzXlxoPv67TCtTCS+SwYmz1M+G5ARTrE5YVlrZPy/xBD36dzLqiJLDzOzsMXkcJYq6+6UkWqFwtLAOjsfec5Q==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.4.tgz", + "integrity": "sha512-p5N9uoTH76lLvSAaYSZtBCdEXzpOOufsRjnhjVSrZGXikVGHX9+cc9ERtHRV4hvBKHyZb1bg4K+56Bd2TqUn4A==", "dev": true, "dependencies": { "@types/node": "*", @@ -4044,9 +5086,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "17.0.53", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.53.tgz", - "integrity": "sha512-1yIpQR2zdYu1Z/dc1OxC+MA6GR240u3gcnP4l6mvj/PJiVaqHsQPmWttsvHsfnhfPbU2FuGmo0wSITPygjBmsw==", + "version": "17.0.56", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.56.tgz", + "integrity": "sha512-Z13f9Qz7Hg8f2g2NsBjiJSVWmON2b3K8RIqFK8mMKCIgvD0CD0ZChTukz87H3lI28X3ukXoNFGzo3ZW1ICTtPA==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -4063,9 +5105,9 @@ } }, "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", "devOptional": true }, "node_modules/@types/secp256k1": { @@ -4516,29 +5558,6 @@ "node": ">=12" } }, - "node_modules/abstract-level/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5045,9 +6064,10 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, "engines": { "node": ">=0.6" } @@ -5192,15 +6212,6 @@ "node": ">= 5.10.0" } }, - "node_modules/bplist-parser/node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -5302,9 +6313,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5321,7 +6332,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-from": { @@ -5478,11 +6489,12 @@ } }, "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/camelcase-keys": { @@ -5515,18 +6527,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/camelcase-keys/node_modules/quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", @@ -5540,9 +6540,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001466", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz", - "integrity": "sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w==", + "version": "1.0.30001474", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", + "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", "dev": true, "funding": [ { @@ -5552,6 +6552,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -5757,6 +6761,29 @@ "npm": ">=3.0.0" } }, + "node_modules/cids/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", @@ -5917,19 +6944,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -6003,9 +7017,10 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", + "dev": true, "engines": { "node": ">=0.1.90" } @@ -6387,45 +7402,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn-async": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", - "integrity": "sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ==", - "deprecated": "cross-spawn no longer requires a build toolchain, use it instead", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.0", - "which": "^1.2.8" - } - }, - "node_modules/cross-spawn-async/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/cross-spawn-async/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/cross-spawn-async/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, "node_modules/crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -6450,6 +7426,14 @@ "sha3": "^2.1.1" } }, + "node_modules/crypto-addr-codec/node_modules/big-integer": { + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -6504,9 +7488,9 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", "devOptional": true }, "node_modules/cytoscape": { @@ -6571,9 +7555,9 @@ } }, "node_modules/d3": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.2.tgz", - "integrity": "sha512-WXty7qOGSHb7HR7CfOzwN1Gw04MUOzN8qh9ZUsvwycIMb4DYMpY9xczZ6jUorGtO6bR9BPMPaueIKwiDxu9uiQ==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", + "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", "dev": true, "dependencies": { "d3-array": "3", @@ -6612,9 +7596,9 @@ } }, "node_modules/d3-array": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.2.tgz", - "integrity": "sha512-yEEyEAbDrF8C6Ob2myOBLjwBLck1Z89jMGFee0oPsn95GqjerpaOA4ch+vc2l0FNFFwMD5N7OCSEN5eAlsUbgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", + "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", "dev": true, "dependencies": { "internmap": "1 - 2" @@ -6682,9 +7666,9 @@ } }, "node_modules/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dev": true, "dependencies": { "delaunator": "5" @@ -7120,18 +8104,18 @@ "dev": true }, "node_modules/default-browser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-3.1.0.tgz", - "integrity": "sha512-SOHecvSoairSAWxEHP/0qcsld/KtI3DargfEuELQDyHIYmS2EMgdGhHOTC1GxaYr+NLUV6kDroeiSBfnNHnn8w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", - "execa": "^5.0.0", - "xdg-default-browser": "^2.1.0" + "execa": "^7.1.1", + "titleize": "^3.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7168,15 +8152,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/default-require-extensions/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/defer-to-connect": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", @@ -7186,12 +8161,15 @@ } }, "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { @@ -7301,9 +8279,9 @@ } }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz", + "integrity": "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7416,9 +8394,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.330", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.330.tgz", - "integrity": "sha512-PqyefhybrVdjAJ45HaPLtuVaehiSw7C3ya0aad+rvmV53IVyXmYRk3pwIOb2TxTDTnmgQdn46NjMMaysx79/6Q==", + "version": "1.4.350", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.350.tgz", + "integrity": "sha512-XnXcWpVnOfHZ4C3NPiL+SubeoGV8zc/pg8GEubRtc1dPA/9jKS2vsOPmtClJHhWxUb2RSGC1OBLCbgNUJMtZPw==", "dev": true }, "node_modules/elkjs": { @@ -8244,18 +9222,18 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.3.tgz", - "integrity": "sha512-njRcKYBc3isE42LaTcJNVANR3R99H9bAxBDMNDr2W7yq5gYPxbU3MkdhsQukxZ/Xg9C2vcyLlDsbKfRDg0QvCQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz", + "integrity": "sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A==", "dev": true, "dependencies": { "debug": "^4.3.4", - "enhanced-resolve": "^5.10.0", - "get-tsconfig": "^4.2.0", - "globby": "^13.1.2", - "is-core-module": "^2.10.0", + "enhanced-resolve": "^5.12.0", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", "is-glob": "^4.0.3", - "synckit": "^0.8.4" + "synckit": "^0.8.5" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -8690,16 +9668,6 @@ "dev": true, "peer": true }, - "node_modules/eth-gas-reporter/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eth-gas-reporter/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -8779,6 +9747,16 @@ "dev": true, "peer": true }, + "node_modules/eth-gas-reporter/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -8813,21 +9791,8 @@ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, - "peer": true, - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "engines": { + "node": ">=0.8.0" } }, "node_modules/eth-gas-reporter/node_modules/ethers": { @@ -9327,25 +10292,14 @@ } }, "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, "node_modules/ethereum-ens": { @@ -9375,20 +10329,12 @@ "ethereumjs-util": "^6.0.0" } }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { + "node_modules/ethereumjs-util": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", @@ -9402,19 +10348,39 @@ "rlp": "^2.2.3" } }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/ethereumjs-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" + "@types/node": "*" + } + }, + "node_modules/ethereumjs-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, "node_modules/ethers": { @@ -9540,28 +10506,40 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, "dependencies": { "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -10025,16 +11003,16 @@ ] }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { @@ -10204,9 +11182,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.4.0.tgz", - "integrity": "sha512-0Gdjo/9+FzsYhXCEFueo2aY1z1tpXrxWZzP7k8ul9qt1U5o8rYJwTJYmaeHdrVosYIVYkOy2iwCJ9FdpocJhPQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", + "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", "dev": true, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" @@ -10313,14 +11291,14 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.1.1", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, @@ -10501,9 +11479,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/growl": { "version": "1.10.5", @@ -10733,54 +11711,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/hardhat/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/hardhat/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/hardhat/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/hardhat/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -10792,14 +11722,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/hardhat/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -10814,6 +11736,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hardhat/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -10868,17 +11801,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10956,73 +11878,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/hardhat/node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/hardhat/node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { - "semver": "bin/semver" + "semver": "bin/semver.js" } }, "node_modules/hardhat/node_modules/supports-color": { @@ -11044,30 +11905,22 @@ "node": ">=4" } }, - "node_modules/hardhat/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/hardhat/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/hardhat/node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, + "node_modules/hardhat/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -11244,9 +12097,25 @@ } }, "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "dev": true, + "dependencies": { + "lru-cache": "^7.5.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } }, "node_modules/html-escaper": { "version": "2.0.2", @@ -11255,9 +12124,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -11267,9 +12136,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" + "entities": "^4.4.0" } }, "node_modules/http-basic": { @@ -11356,6 +12225,17 @@ "node": ">=10.19.0" } }, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", @@ -11369,12 +12249,12 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=14.18.0" } }, "node_modules/iconv-lite": { @@ -11561,19 +12441,6 @@ "react": ">=16.8.2" } }, - "node_modules/ink/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ink/node_modules/type-fest": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", @@ -11806,15 +12673,15 @@ } }, "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "bin": { "is-docker": "cli.js" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11893,21 +12760,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-inside-container/node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-lower-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", @@ -11952,11 +12804,12 @@ } }, "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-regex": { @@ -12109,6 +12962,21 @@ "node": ">=8" } }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -12339,15 +13207,15 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, "bin": { "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" } }, "node_modules/jsonc-parser": { @@ -12357,12 +13225,9 @@ "dev": true }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -12503,29 +13368,6 @@ "node": ">=12" } }, - "node_modules/level-transcoder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -12560,6 +13402,15 @@ "node": ">=4" } }, + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -12688,14 +13539,11 @@ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/lunr": { @@ -12867,15 +13715,15 @@ } }, "node_modules/meow/node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, "dependencies": { - "lru-cache": "^7.5.1" + "lru-cache": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/meow/node_modules/locate-path": { @@ -12894,27 +13742,15 @@ } }, "node_modules/meow/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/meow/node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "yallist": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/meow/node_modules/p-limit": { @@ -13021,30 +13857,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", @@ -13073,9 +13885,9 @@ } }, "node_modules/meow/node_modules/type-fest": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.7.0.tgz", - "integrity": "sha512-A2qUJ/j8vkKIT+UorxayZjFJoEdNkIPZkjOJSWezoAbRQd7QEhnz2iJlfVy4Or0GuEnCXts5cNorQNUvdLkaSQ==", + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.7.2.tgz", + "integrity": "sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA==", "dev": true, "engines": { "node": ">=14.16" @@ -13084,25 +13896,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/meow/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=12" - } - }, - "node_modules/meow/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, "node_modules/merge-descriptors": { @@ -13210,11 +14016,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -13285,15 +14095,6 @@ "node": ">= 6" } }, - "node_modules/minimist-options/node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/minipass": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", @@ -13303,11 +14104,6 @@ "yallist": "^3.0.0" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -13444,38 +14240,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -13575,6 +14339,18 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mock-fs": { "version": "4.14.0", "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", @@ -13603,6 +14379,29 @@ "buffer": "^5.5.0" } }, + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/multicodec": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", @@ -13622,6 +14421,29 @@ "varint": "^5.0.0" } }, + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", @@ -13855,22 +14677,18 @@ } }, "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/normalize-path": { @@ -13893,15 +14711,30 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/nth-check": { @@ -13982,15 +14815,6 @@ "node": ">=8.9" } }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -14262,31 +15086,33 @@ } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", "is-wsl": "^2.2.0" }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14314,36 +15140,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open-cli/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open-cli/node_modules/open": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.0.0.tgz", - "integrity": "sha512-yerrN5WPzgwuE3T6rxAkT1UuMLDzs4Szpug7hy9s4gru3iOTnaU0yKc1AYOVYrBzvykce5gUdr9RPNB4R+Zc/A==", - "dev": true, - "dependencies": { - "default-browser": "^3.1.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -14891,12 +15687,6 @@ "node": ">= 0.10" } }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -14987,11 +15777,12 @@ ] }, "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -15058,9 +15849,9 @@ } }, "node_modules/react-devtools-core": { - "version": "4.27.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.2.tgz", - "integrity": "sha512-8SzmIkpO87alD7Xr6gWIEa1jHkMjawOZ+6egjazlnjB4UUcbnzGDf/vBJ4BzGuWWEM+pzrxuzsPpcMqlQkYK2g==", + "version": "4.27.4", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz", + "integrity": "sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg==", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -15109,6 +15900,24 @@ "node": ">=4" } }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -15121,6 +15930,15 @@ "node": ">=4" } }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -15204,25 +16022,10 @@ } }, "node_modules/redent/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redent/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, "engines": { "node": ">=12" }, @@ -15488,6 +16291,28 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -15562,6 +16387,83 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -15806,6 +16708,24 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -15956,29 +16876,6 @@ "buffer": "6.0.3" } }, - "node_modules/sha3/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16125,219 +17022,77 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" - } - }, - "node_modules/solc/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/solc/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/solc/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/solc/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solc/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/solc/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dependencies": { - "error-ex": "^1.2.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/solc/node_modules/path-exists": { + "node_modules/snake-case": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "no-case": "^2.2.0" } }, - "node_modules/solc/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "node_modules/solc": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "bin": { + "solcjs": "solcjs" }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/solc/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/solc/node_modules/commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/solc/node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "engines": { - "node": ">=0.10.0" + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/solc/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" - }, "node_modules/solc/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -16357,91 +17112,15 @@ "semver": "bin/semver" } }, - "node_modules/solc/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" - }, - "node_modules/solc/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "node_modules/solc/node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/solc/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/solc/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/solc/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" + "node": ">=0.6.0" } }, "node_modules/solidity-coverage": { @@ -16512,16 +17191,6 @@ "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/solidity-coverage/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -16765,16 +17434,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/solidity-coverage/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/solidity-coverage/node_modules/locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", @@ -17021,16 +17680,6 @@ "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/solidity-coverage/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -17382,30 +18031,24 @@ } }, "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-hex-prefix": { @@ -17421,11 +18064,18 @@ } }, "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -17516,10 +18166,33 @@ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/swarm-js/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, "node_modules/swarm-js/node_modules/cacheable-lookup": { @@ -17576,14 +18249,6 @@ "node": ">=10.19.0" } }, - "node_modules/swarm-js/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -17600,12 +18265,15 @@ "node": ">=8" } }, - "node_modules/swarm-js/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "node_modules/swarm-js/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { - "node": ">= 4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/sync-request": { @@ -17649,6 +18317,12 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/synckit/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -17723,6 +18397,23 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -17749,11 +18440,6 @@ "node": ">=4.5" } }, - "node_modules/tar/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -17907,12 +18593,15 @@ } }, "node_modules/titleize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-1.0.1.tgz", - "integrity": "sha512-rUwGDruKq1gX+FFHbTl5qjI7teVO7eOe+C8IcQ7QT+1BK3eEUXJqbZcBOeaRP4FwSC/C1A5jDoIVta0nIQ9yew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tmp": { @@ -18118,11 +18807,31 @@ "strip-bom": "^3.0.0" } }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsort": { "version": "0.0.1", @@ -18144,12 +18853,6 @@ "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" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -18244,21 +18947,6 @@ "typescript": ">=4.3.0" } }, - "node_modules/typechain/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -18280,16 +18968,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typechain/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -18303,16 +18981,6 @@ "node": ">=10" } }, - "node_modules/typechain/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -18373,9 +19041,9 @@ } }, "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.3.tgz", - "integrity": "sha512-5UB4yYusDtkRPbRiy1cqZ1IpGNcJCGlEMG17RKzPddpyiPKoCdwohbED8g4QXT0ewCt8LTkQXuljsUfQ3FKM4A==", + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", + "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -18476,11 +19144,11 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { @@ -18699,27 +19367,27 @@ "dev": true }, "node_modules/web3": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", - "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.9.0.tgz", + "integrity": "sha512-E9IvVy/d2ozfQQsCiV+zh/LmlZGv9fQxI0UedDVjm87yOKf4AYbBNEn1iWtHveiGzAk2CEMZMUzAZzaQNSSYog==", "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.8.2", - "web3-core": "1.8.2", - "web3-eth": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-shh": "1.8.2", - "web3-utils": "1.8.2" + "web3-bzz": "1.9.0", + "web3-core": "1.9.0", + "web3-eth": "1.9.0", + "web3-eth-personal": "1.9.0", + "web3-net": "1.9.0", + "web3-shh": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", - "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.9.0.tgz", + "integrity": "sha512-9Zli9dikX8GdHwBb5/WPzpSVuy3EWMKY3P4EokCQra31fD7DLizqAAaTUsFwnK7xYkw5ogpHgelw9uKHHzNajg==", "hasInstallScript": true, "dependencies": { "@types/node": "^12.12.6", @@ -18730,59 +19398,54 @@ "node": ">=8.0.0" } }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, "node_modules/web3-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", - "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.9.0.tgz", + "integrity": "sha512-DZ+TPmq/ZLlx4LSVzFgrHCP/QFpKDbGWO4HoquZSdu24cjk5SZ+FEU1SZB2OaK3/bgBh+25mRbmv8y56ysUu1w==", "dependencies": { - "@types/bn.js": "^5.1.0", + "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-requestmanager": "1.8.2", - "web3-utils": "1.8.2" + "web3-core-helpers": "1.9.0", + "web3-core-method": "1.9.0", + "web3-core-requestmanager": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", - "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.9.0.tgz", + "integrity": "sha512-NeJzylAp9Yj9xAt2uTT+kyug3X0DLnfBdnAcGZuY6HhoNPDIfQRA9CkJjLngVRlGTLZGjNp9x9eR+RyZQgUlXg==", "dependencies": { - "web3-eth-iban": "1.8.2", - "web3-utils": "1.8.2" + "web3-eth-iban": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", - "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.9.0.tgz", + "integrity": "sha512-sswbNsY2xRBBhGeaLt9c/eDc+0yDDhi6keUBAkgIRa9ueSx/VKzUY9HMqiV6bXDcGT2fJyejq74FfEB4lc/+/w==", "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-utils": "1.8.2" + "web3-core-helpers": "1.9.0", + "web3-core-promievent": "1.9.0", + "web3-core-subscriptions": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", - "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.9.0.tgz", + "integrity": "sha512-PHG1Mn23IGwMZhnPDN8dETKypqsFbHfiyRqP+XsVMPmTHkVfzDQTCBU/c2r6hUktBDoGKut5xZQpGfhFk71KbQ==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -18791,75 +19454,70 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", - "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.9.0.tgz", + "integrity": "sha512-hcJ5PCtTIJpj+8qWxoseqlCovDo94JJjTX7dZOLXgwp8ah7E3WRYozhGyZocerx+KebKyg1mCQIhkDpMwjfo9Q==", "dependencies": { "util": "^0.12.5", - "web3-core-helpers": "1.8.2", - "web3-providers-http": "1.8.2", - "web3-providers-ipc": "1.8.2", - "web3-providers-ws": "1.8.2" + "web3-core-helpers": "1.9.0", + "web3-providers-http": "1.9.0", + "web3-providers-ipc": "1.9.0", + "web3-providers-ws": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", - "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.9.0.tgz", + "integrity": "sha512-MaIo29yz7hTV8X8bioclPDbHFOVuHmnbMv+D3PDH12ceJFJAXGyW8GL5KU1DYyWIj4TD1HM4WknyVA/YWBiiLA==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, "node_modules/web3-eth": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", - "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", - "dependencies": { - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-accounts": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-eth-ens": "1.8.2", - "web3-eth-iban": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.9.0.tgz", + "integrity": "sha512-c5gSWk9bLNr6VPATHmZ1n7LTIefIZQnJMzfnvkoBcIFGKJbGmsuRhv6lEXsKdAO/FlqYnSbaw3fOq1fVFiIOFQ==", + "dependencies": { + "web3-core": "1.9.0", + "web3-core-helpers": "1.9.0", + "web3-core-method": "1.9.0", + "web3-core-subscriptions": "1.9.0", + "web3-eth-abi": "1.9.0", + "web3-eth-accounts": "1.9.0", + "web3-eth-contract": "1.9.0", + "web3-eth-ens": "1.9.0", + "web3-eth-iban": "1.9.0", + "web3-eth-personal": "1.9.0", + "web3-net": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", - "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.9.0.tgz", + "integrity": "sha512-0BLQ3FKMrzJkA930jOX3fMaybAyubk06HChclLpiR0NWmgWXm1tmBrJdkyRy2ZTZpmfuZc9xTFRfl0yZID1voA==", "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.2" + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", - "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.9.0.tgz", + "integrity": "sha512-VeIZVevmnSll0AC1k5F/y398ZE89d1SRuYk8IewLUhL/tVAsFEsjl2SGgm0+aDcHmgPrkW+qsCJ+C7rWg/N4ZA==", "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", @@ -18867,28 +19525,65 @@ "ethereumjs-util": "^7.1.5", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.9.0", + "web3-core-helpers": "1.9.0", + "web3-core-method": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "dependencies": { + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" + } + }, + "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/web3-eth-accounts/node_modules/uuid": { @@ -18900,120 +19595,115 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", - "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.9.0.tgz", + "integrity": "sha512-+j26hpSaEtAdUed0TN5rnc+YZOcjPxMjFX4ZBKatvFkImdbVv/tzTvcHlltubSpgb2ZLyZ89lSL6phKYwd2zNQ==", "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-utils": "1.8.2" + "@types/bn.js": "^5.1.1", + "web3-core": "1.9.0", + "web3-core-helpers": "1.9.0", + "web3-core-method": "1.9.0", + "web3-core-promievent": "1.9.0", + "web3-core-subscriptions": "1.9.0", + "web3-eth-abi": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", - "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.9.0.tgz", + "integrity": "sha512-LOJZeN+AGe9arhuExnrPPFYQr4WSxXEkpvYIlst/joOEUNLDwfndHnJIK6PI5mXaYSROBtTx6erv+HupzGo7vA==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.9.0", + "web3-core-helpers": "1.9.0", + "web3-core-promievent": "1.9.0", + "web3-eth-abi": "1.9.0", + "web3-eth-contract": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", - "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.9.0.tgz", + "integrity": "sha512-jPAm77PuEs1kE/UrrBFJdPD2PN42pwfXA0gFuuw35bZezhskYML9W4QCxcqnUtceyEA4FUn7K2qTMuCk+23fog==", "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.8.2" + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-personal": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", - "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.9.0.tgz", + "integrity": "sha512-r9Ldo/luBqJlv1vCUEQnUS+C3a3ZdbYxVHyfDkj6RWMyCqqo8JE41HWE+pfa0RmB1xnGL2g8TbYcHcqItck/qg==", "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.9.0", + "web3-core-helpers": "1.9.0", + "web3-core-method": "1.9.0", + "web3-net": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, "node_modules/web3-net": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", - "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.9.0.tgz", + "integrity": "sha512-L+fDZFgrLM5Y15aonl2q6L+RvfaImAngmC0Jv45hV2FJ5IfRT0/2ob9etxZmvEBWvOpbqSvghfOhJIT3XZ37Pg==", "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" + "web3-core": "1.9.0", + "web3-core-method": "1.9.0", + "web3-utils": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", - "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.9.0.tgz", + "integrity": "sha512-5+dMNDAE0rRFz6SJpfnBqlVi2J5bB/Ivr2SanMt2YUrkxW5t8betZbzVwRkTbwtUvkqgj3xeUQzqpOttiv+IqQ==", "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", - "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.9.0.tgz", + "integrity": "sha512-cPXU93Du40HCylvjaa5x62DbnGqH+86HpK/+kMcFIzF6sDUBhKpag2tSbYhGbj7GMpfkmDTUiiMLdWnFV6+uBA==", "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.8.2" + "web3-core-helpers": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", - "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.9.0.tgz", + "integrity": "sha512-JRVsnQZ7j2k1a2yzBNHe39xqk1ijOv01dfIBFw52VeEkSRzvrOcsPIM/ttSyBuJqt70ntMxXY0ekCrqfleKH/w==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2", + "web3-core-helpers": "1.9.0", "websocket": "^1.0.32" }, "engines": { @@ -19021,24 +19711,24 @@ } }, "node_modules/web3-shh": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", - "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.9.0.tgz", + "integrity": "sha512-bIBZlralgz4ICCrwkefB2nPPJWfx28NuHIpjB7d9ADKynElubQuqudYhKtSEkKXACuME/BJm0pIFJcJs/gDnMg==", "hasInstallScript": true, "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-net": "1.8.2" + "web3-core": "1.9.0", + "web3-core-method": "1.9.0", + "web3-core-subscriptions": "1.9.0", + "web3-net": "1.9.0" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", + "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -19052,6 +19742,43 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/web3-utils/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -19326,56 +20053,6 @@ } } }, - "node_modules/xdg-default-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/xdg-default-browser/-/xdg-default-browser-2.1.0.tgz", - "integrity": "sha512-HY4G725+IDQr16N8XOjAms5qJGArdJaWIuC7Q7A8UXIwj2mifqnPXephazyL7sIkQPvmEoPX3E0v2yFv6hQUNg==", - "dev": true, - "dependencies": { - "execa": "^0.2.2", - "titleize": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/xdg-default-browser/node_modules/execa": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.2.2.tgz", - "integrity": "sha512-zmBGzLd3nhA/NB9P7VLoceAO6vyYPftvl809Vjwe5U2fYI9tYWbeKqP3wZlAw9WS+znnkogf/bhSU+Gcn2NbkQ==", - "dev": true, - "dependencies": { - "cross-spawn-async": "^2.1.1", - "npm-run-path": "^1.0.0", - "object-assign": "^4.0.1", - "path-key": "^1.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/xdg-default-browser/node_modules/npm-run-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", - "integrity": "sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA==", - "dev": true, - "dependencies": { - "path-key": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/xdg-default-browser/node_modules/path-key": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", - "integrity": "sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/xhr": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", @@ -19442,9 +20119,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "16.2.0", @@ -19507,6 +20184,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -19517,11 +20202,12 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19570,7 +20256,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.11", + "version": "0.0.12", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -19619,21 +20305,41 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" } }, - "packages/core/node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "packages/core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "packages/core/node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", - "dev": true + "packages/core/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "packages/core/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.11", + "version": "0.0.12", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -19647,7 +20353,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.11", + "@ignored/ignition-core": "^0.0.12", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -19688,7 +20394,7 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.11", + "@ignored/ignition-core": "^0.0.12", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" } @@ -19731,17 +20437,29 @@ "type-detect": "^4.0.8" } }, - "packages/hardhat-plugin/node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "packages/hardhat-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } }, - "packages/hardhat-plugin/node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", - "dev": true + "packages/hardhat-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, "packages/hardhat-plugin/node_modules/react": { "version": "18.2.0", @@ -19771,6 +20489,14 @@ "type": "opencollective", "url": "https://opencollective.com/sinon" } + }, + "packages/hardhat-plugin/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } } } } diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index bcf70b61dd..6588093f21 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.12 - 2023-04-04 + +### Fixed + +- Support recursive types in `m.call` args ([#186](https://github.com/NomicFoundation/ignition/issues/186)) + ## 0.0.11 - 2023-03-29 ### Changed diff --git a/packages/core/package.json b/packages/core/package.json index 1d0da8e01a..6546f80380 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.11", + "version": "0.0.12", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index b38a7ef6ae..8aef03e139 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.12 - 2023-04-04 + +### Fixed + +- Support recursive types in `m.call` args ([#186](https://github.com/NomicFoundation/ignition/issues/186)) + ## 0.0.11 - 2023-03-29 ### Changed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 67e3345ad4..739a91d771 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.11", + "version": "0.0.12", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.11", + "@ignored/ignition-core": "^0.0.12", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -71,7 +71,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.11", + "@ignored/ignition-core": "^0.0.12", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 6664e78bece5dc4a3cd96e0735ec08fbeeb5e539 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 12:33:17 +0100 Subject: [PATCH 0274/1302] refactor: use one result type for all process steps Simplify validation and transform and other steps return results into a process result type. --- packages/core/src/Ignition.ts | 145 +++++++++++------- .../src/internal/deployment/Deployment.ts | 6 +- .../process/generateDeploymentGraphFrom.ts | 41 +++-- ...ransformDeploymentGraphToExecutionGraph.ts | 43 ++++-- .../src/internal/utils/process-results.ts | 38 +++++ .../validation/validateDeploymentGraph.ts | 36 +++-- packages/core/src/types/process.ts | 17 ++ .../core/test/deploymentBuilder/accounts.ts | 9 +- .../core/test/deploymentBuilder/artifacts.ts | 84 +++++----- .../test/deploymentBuilder/buildModule.ts | 57 ++++--- packages/core/test/deploymentBuilder/calls.ts | 39 +++-- .../core/test/deploymentBuilder/deploy.ts | 55 +++++-- packages/core/test/deploymentBuilder/event.ts | 20 ++- .../core/test/deploymentBuilder/libraries.ts | 20 ++- .../core/test/deploymentBuilder/parameters.ts | 20 ++- .../core/test/deploymentBuilder/sendETH.ts | 20 ++- .../core/test/deploymentBuilder/useModule.ts | 116 ++++++++++---- packages/core/test/deploymentBuilder/value.ts | 20 ++- packages/core/test/execution/rerun.ts | 7 +- packages/core/test/state-reducer/utils.ts | 14 +- packages/core/test/validation.ts | 33 ++-- 21 files changed, 578 insertions(+), 262 deletions(-) create mode 100644 packages/core/src/internal/utils/process-results.ts create mode 100644 packages/core/src/types/process.ts diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index dfd744f296..a399ccde95 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -3,10 +3,6 @@ import type { IgnitionDeployOptions, UpdateUiAction, } from "./internal/types/deployment"; -import type { - ExecutionResultsAccumulator, - ExecutionVisitResult, -} from "./internal/types/executionGraph"; import type { ICommandJournal } from "./internal/types/journal"; import type { Module, ModuleDict } from "./types/module"; import type { IgnitionPlan } from "./types/plan"; @@ -26,13 +22,24 @@ import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; import { createServices } from "./internal/services/createServices"; +import { + ExecutionResultsAccumulator, + ExecutionVisitResult, + IExecutionGraph, +} from "./internal/types/executionGraph"; import { Services } from "./internal/types/services"; +import { + isFailure, + processStepFailed, + processStepSucceeded, +} from "./internal/utils/process-results"; import { resolveProxyValue } from "./internal/utils/proxy"; import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; import { IgnitionConstructorArgs, IgnitionCreationArgs, } from "./types/ignition"; +import { ProcessStepResult } from "./types/process"; const log = setupDebug("ignition:main"); @@ -123,16 +130,26 @@ export class Ignition { force: options.force, }); - const { result: constructResult, moduleOutputs } = + const constructExecutionGraphResult = await this._constructExecutionGraphFrom(deployment, ignitionModule); - if (constructResult._kind === "failure") { + if (isFailure(constructExecutionGraphResult)) { log("Failed to construct execution graph"); - return constructResult; + + return { + _kind: "failure", + failures: [ + constructExecutionGraphResult.message, + constructExecutionGraphResult.failures, + ], + }; } + const { executionGraph, moduleOutputs } = + constructExecutionGraphResult.result; + log("Execution graph constructed"); - await deployment.transformComplete(constructResult.executionGraph); + await deployment.transformComplete(executionGraph); // rebuild previous execution state based on journal log("Load journal entries for network"); @@ -142,11 +159,14 @@ export class Ignition { log("Reconciling previous runs with current module"); const moduleChangeResult = this._checkSafeDeployment(deployment); - if (moduleChangeResult?._kind === "failure") { + if (isFailure(moduleChangeResult)) { log("Failed to reconcile"); await deployment.failReconciliation(); - return moduleChangeResult; + return { + _kind: "failure", + failures: [moduleChangeResult.message, moduleChangeResult.failures], + }; } log("Execute based on execution graph"); @@ -197,14 +217,17 @@ export class Ignition { this._services.artifacts.getAllArtifacts(), ]); - const { graph: deploymentGraph, callPoints } = generateDeploymentGraphFrom( - deploymentModule, - { - chainId, - accounts, - artifacts, - } - ); + const constructionResult = generateDeploymentGraphFrom(deploymentModule, { + chainId, + accounts, + artifacts, + }); + + if (isFailure(constructionResult)) { + throw new IgnitionError(constructionResult.message); + } + + const { graph: deploymentGraph, callPoints } = constructionResult.result; const validationResult = await validateDeploymentGraph( deploymentGraph, @@ -212,8 +235,8 @@ export class Ignition { this._services ); - if (validationResult._kind === "failure") { - throw new IgnitionError(validationResult.failures[0]); + if (isFailure(validationResult)) { + throw new IgnitionError(validationResult.message); } const transformResult = await transformDeploymentGraphToExecutionGraph( @@ -221,11 +244,11 @@ export class Ignition { this._services ); - if (transformResult._kind === "failure") { - throw new IgnitionError(transformResult.failures[0]); + if (isFailure(transformResult)) { + throw new IgnitionError(transformResult.message); } - const { executionGraph } = transformResult; + const { executionGraph } = transformResult.result; return { deploymentGraph, executionGraph }; } @@ -233,17 +256,32 @@ export class Ignition { private async _constructExecutionGraphFrom( deployment: Deployment, ignitionModule: Module - ): Promise<{ result: any; moduleOutputs: T }> { + ): Promise< + ProcessStepResult<{ executionGraph: IExecutionGraph; moduleOutputs: T }> + > { log("Generate deployment graph from module"); + const deploymentGraphConstructionResult = generateDeploymentGraphFrom( + ignitionModule, + { + chainId: deployment.state.details.chainId, + accounts: deployment.state.details.accounts, + artifacts: deployment.state.details.artifacts, + } + ); + + if (isFailure(deploymentGraphConstructionResult)) { + await deployment.failUnexpected( + deploymentGraphConstructionResult.failures + ); + + return deploymentGraphConstructionResult; + } + const { graph: deploymentGraph, callPoints, moduleOutputs, - } = generateDeploymentGraphFrom(ignitionModule, { - chainId: deployment.state.details.chainId, - accounts: deployment.state.details.accounts, - artifacts: deployment.state.details.artifacts, - }); + } = deploymentGraphConstructionResult.result; await deployment.startValidation(); const validationResult = await validateDeploymentGraph( @@ -252,10 +290,10 @@ export class Ignition { deployment.services ); - if (validationResult._kind === "failure") { - await deployment.failValidation(validationResult.failures[1]); + if (isFailure(validationResult)) { + await deployment.failValidation(validationResult.failures); - return { result: validationResult, moduleOutputs }; + return validationResult; } log("Transform deployment graph to execution graph"); @@ -264,13 +302,16 @@ export class Ignition { deployment.services ); - if (transformResult._kind === "failure") { - await deployment.failUnexpected(transformResult.failures[1]); + if (isFailure(transformResult)) { + await deployment.failUnexpected(transformResult.failures); - return { result: transformResult, moduleOutputs }; + return transformResult; } - return { result: transformResult, moduleOutputs }; + return processStepSucceeded({ + executionGraph: transformResult.result.executionGraph, + moduleOutputs, + }); } private _buildOutputFrom( @@ -323,22 +364,24 @@ export class Ignition { private _checkSafeDeployment( deployment: Deployment - ): DeploymentResult | { _kind: "success" } { + ): ProcessStepResult { if (deployment.state.details.force) { - return { _kind: "success" }; + return processStepSucceeded(true); } if (deployment.state.transform.executionGraph === null) { - throw new IgnitionError( - "Execution graph must be set to check safe deployment" - ); + return processStepFailed("Module reconciliation failed", [ + new IgnitionError( + "Execution graph must be set to check safe deployment" + ), + ]); } const previousExecutionGraphHash = deployment.state.execution.executionGraphHash; if (previousExecutionGraphHash === "") { - return { _kind: "success" }; + return processStepSucceeded(true); } const currentExecutionGraphHash = hashExecutionGraph( @@ -346,19 +389,13 @@ export class Ignition { ); if (previousExecutionGraphHash === currentExecutionGraphHash) { - return { _kind: "success" }; + return processStepSucceeded(true); } - return { - _kind: "failure", - failures: [ - "module change failure", - [ - new Error( - "The module has been modified since the last run. Delete the journal file to start again." - ), - ], - ], - }; + return processStepFailed("Module reconciliation failed", [ + new IgnitionError( + "The module has been modified since the last run. You can ignore the previous runs with the '--force' flag." + ), + ]); } } diff --git a/packages/core/src/internal/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts index b2bdf7bcc2..53dca450af 100644 --- a/packages/core/src/internal/deployment/Deployment.ts +++ b/packages/core/src/internal/deployment/Deployment.ts @@ -1,9 +1,9 @@ import type { + DeployNetworkConfig, DeployState, - UpdateUiAction, DeployStateCommand, DeployStateExecutionCommand, - DeployNetworkConfig, + UpdateUiAction, } from "../types/deployment"; import type { ExecutionVertexVisitResult } from "../types/executionGraph"; import type { @@ -19,8 +19,8 @@ import { IgnitionError } from "../../errors"; import { ExecutionGraph } from "../execution/ExecutionGraph"; import { - initializeDeployState, deployStateReducer, + initializeDeployState, } from "./deployStateReducer"; import { isDeployStateExecutionCommand } from "./utils"; diff --git a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts index 0548bcc80a..525defe4a8 100644 --- a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts @@ -7,27 +7,40 @@ import type { import { DeploymentBuilder } from "../../dsl/DeploymentBuilder"; import { IgnitionError } from "../../errors"; import { Module, ModuleDict } from "../../types/module"; +import { ProcessStepResult } from "../../types/process"; import { assertModuleReturnTypes } from "../utils/guards"; +import { + processStepErrored, + processStepSucceeded, +} from "../utils/process-results"; export function generateDeploymentGraphFrom( ignitionModule: Module, builderOptions: DeploymentBuilderOptions -): { graph: IDeploymentGraph; callPoints: CallPoints; moduleOutputs: T } { - const graphBuilder = new DeploymentBuilder(builderOptions); +): ProcessStepResult<{ + graph: IDeploymentGraph; + callPoints: CallPoints; + moduleOutputs: T; +}> { + try { + const graphBuilder = new DeploymentBuilder(builderOptions); - const moduleOutputs = ignitionModule.action(graphBuilder); + const moduleOutputs = ignitionModule.action(graphBuilder); - if (moduleOutputs instanceof Promise) { - throw new IgnitionError( - `The callback passed to 'buildModule' for ${ignitionModule.name} returns a Promise; async callbacks are not allowed in 'buildModule'.` - ); - } + if (moduleOutputs instanceof Promise) { + throw new IgnitionError( + `The callback passed to 'buildModule' for ${ignitionModule.name} returns a Promise; async callbacks are not allowed in 'buildModule'.` + ); + } - assertModuleReturnTypes(moduleOutputs); + assertModuleReturnTypes(moduleOutputs); - return { - graph: graphBuilder.graph, - callPoints: graphBuilder.callPoints, - moduleOutputs, - }; + return processStepSucceeded({ + graph: graphBuilder.graph, + callPoints: graphBuilder.callPoints, + moduleOutputs, + }); + } catch (error) { + return processStepErrored(error, "Deployment graph construction failed"); + } } diff --git a/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts index e2df920180..a37c8896b5 100644 --- a/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts +++ b/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts @@ -1,32 +1,43 @@ +import { ProcessStepResult } from "../../types/process"; import { ExecutionGraph } from "../execution/ExecutionGraph"; import { clone } from "../graph/adjacencyList"; import { - IDeploymentGraph, DeploymentGraphVertex, + IDeploymentGraph, } from "../types/deploymentGraph"; import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; -import { TransformResult } from "../types/process"; import { Services } from "../types/services"; +import { + processStepErrored, + processStepSucceeded, +} from "../utils/process-results"; -import { convertDeploymentVertexToExecutionVertex as convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; +import { convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; import { reduceDeploymentGraphByEliminatingVirtualVertexes } from "./transform/reduceDeploymentGraphByEliminatingVirtualVertexes"; export async function transformDeploymentGraphToExecutionGraph( deploymentGraph: IDeploymentGraph, services: Services -): Promise { - const reducedDeploymentGraph = - reduceDeploymentGraphByEliminatingVirtualVertexes(deploymentGraph); - - const executionGraph: IExecutionGraph = await convertDeploymentToExecution( - reducedDeploymentGraph, - convertDeploymentVertexToExecutionVertex({ - services, - graph: reducedDeploymentGraph, - }) - ); - - return { _kind: "success", executionGraph }; +): Promise> { + try { + const reducedDeploymentGraph = + reduceDeploymentGraphByEliminatingVirtualVertexes(deploymentGraph); + + const executionGraph: IExecutionGraph = await convertDeploymentToExecution( + reducedDeploymentGraph, + convertDeploymentVertexToExecutionVertex({ + services, + graph: reducedDeploymentGraph, + }) + ); + + return processStepSucceeded({ executionGraph }); + } catch (err) { + return processStepErrored( + err, + "Graph transformation and simplification failed" + ); + } } async function convertDeploymentToExecution( diff --git a/packages/core/src/internal/utils/process-results.ts b/packages/core/src/internal/utils/process-results.ts new file mode 100644 index 0000000000..c9af3f1419 --- /dev/null +++ b/packages/core/src/internal/utils/process-results.ts @@ -0,0 +1,38 @@ +import { + ProcessResultKind, + ProcessStepFailure, + ProcessStepResult, + ProcessStepSuccess, +} from "../../types/process"; + +export const processStepSucceeded = (result: T): ProcessStepSuccess => ({ + _kind: ProcessResultKind.SUCCESS, + result, +}); + +export const processStepFailed = ( + message: string, + failures: Error[] +): ProcessStepFailure => ({ + _kind: ProcessResultKind.FAILURE, + message, + failures, +}); + +export const processStepErrored = ( + error: unknown, + message: string +): ProcessStepFailure => { + const resolvedError = + error instanceof Error + ? error + : new Error(`Failed with unknown error ${error as any}`); + + return processStepFailed(message, [resolvedError]); +}; + +export const isFailure = ( + result: ProcessStepResult +): result is ProcessStepFailure => { + return result._kind === ProcessResultKind.FAILURE; +}; diff --git a/packages/core/src/internal/validation/validateDeploymentGraph.ts b/packages/core/src/internal/validation/validateDeploymentGraph.ts index dc2499b18b..f55f4f3589 100644 --- a/packages/core/src/internal/validation/validateDeploymentGraph.ts +++ b/packages/core/src/internal/validation/validateDeploymentGraph.ts @@ -1,9 +1,15 @@ import { IgnitionError } from "../../errors"; +import { ProcessStepResult } from "../../types/process"; import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; +import { ResultsAccumulator } from "../types/graph"; import { Services } from "../types/services"; -import { ValidationVisitResult } from "../types/validation"; +import { + processStepErrored, + processStepFailed, + processStepSucceeded, +} from "../utils/process-results"; import { validationDispatch } from "./dispatch/validationDispatch"; @@ -11,11 +17,11 @@ export async function validateDeploymentGraph( deploymentGraph: IDeploymentGraph, callPoints: CallPoints, services: Services -): Promise { +): Promise>> { try { const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); - return await visit( + const visitResult = await visit( "Validation", orderedVertexIds, deploymentGraph, @@ -23,20 +29,16 @@ export async function validateDeploymentGraph( new Map(), validationDispatch ); - } catch (err) { - if (!(err instanceof Error)) { - return { - _kind: "failure", - failures: [ - "Unsuccessful module validation", - [new IgnitionError("Unknown validation error")], - ], - }; - } - return { - _kind: "failure", - failures: ["Unsuccessful module validation", [err]], - }; + switch (visitResult._kind) { + case "success": + return processStepSucceeded(visitResult.result); + case "failure": + return processStepFailed("Validation failed", visitResult.failures[1]); + case "hold": + throw new IgnitionError("Holds not exepected in validation"); + } + } catch (err) { + return processStepErrored(err, "Validation failed"); } } diff --git a/packages/core/src/types/process.ts b/packages/core/src/types/process.ts new file mode 100644 index 0000000000..7a4bda16ec --- /dev/null +++ b/packages/core/src/types/process.ts @@ -0,0 +1,17 @@ +export enum ProcessResultKind { + SUCCESS = "success", + FAILURE = "failure", +} + +export interface ProcessStepSuccess { + _kind: ProcessResultKind.SUCCESS; + result: T; +} + +export interface ProcessStepFailure { + _kind: ProcessResultKind.FAILURE; + message: string; + failures: Error[]; +} + +export type ProcessStepResult = ProcessStepSuccess | ProcessStepFailure; diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index 70c69454bc..9be226351b 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -7,6 +7,7 @@ import { ethers } from "ethers"; import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -30,7 +31,7 @@ describe("deployment builder - accounts", () => { return { token, exchange }; }); - const { graph } = generateDeploymentGraphFrom(accountsModule, { + const constructionResult = generateDeploymentGraphFrom(accountsModule, { chainId: 31337, accounts: [ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", @@ -39,7 +40,11 @@ describe("deployment builder - accounts", () => { artifacts: [], }); - deploymentGraph = graph; + if (isFailure(constructionResult)) { + assert.fail("Failure to construct deployment garph"); + } + + deploymentGraph = constructionResult.result.graph; }); it("should default to the first account if not given a from parameter", () => { diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts index daea59dc63..33f6a9073f 100644 --- a/packages/core/test/deploymentBuilder/artifacts.ts +++ b/packages/core/test/deploymentBuilder/artifacts.ts @@ -4,9 +4,12 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; +import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; +import { ProcessResultKind } from "../../src/types/process"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -25,23 +28,30 @@ describe("deployment builder - artifacts", () => { } ); - const { graph } = generateDeploymentGraphFrom(artifactsModule, { - chainId: 31337, - accounts: [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - ], - artifacts: [ - { - contractName: "Token", - bytecode: "test", - abi: [], - linkReferences: {}, - }, - ], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + artifactsModule, + { + chainId: 31337, + accounts: [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ], + artifacts: [ + { + contractName: "Token", + bytecode: "test", + abi: [], + linkReferences: {}, + }, + ], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should retrieve the stored artifact", () => { @@ -58,7 +68,7 @@ describe("deployment builder - artifacts", () => { assert.equal(depNode.artifact.bytecode, "test"); }); - it("should throw when trying to retrieve an invalid artifact", () => { + it("should return an error when trying to retrieve an invalid artifact", () => { const artifactsModule = buildModule( "artifacts", (m: IDeploymentBuilder) => { @@ -70,24 +80,26 @@ describe("deployment builder - artifacts", () => { } ); - assert.throws( - () => - generateDeploymentGraphFrom(artifactsModule, { - chainId: 31337, - accounts: [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - ], - artifacts: [ - { - contractName: "Token", - bytecode: "test", - abi: [], - linkReferences: {}, - }, - ], - }), - /Artifact None does not exist/ - ); + const result = generateDeploymentGraphFrom(artifactsModule, { + chainId: 31337, + accounts: [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + ], + artifacts: [ + { + contractName: "Token", + bytecode: "test", + abi: [], + linkReferences: {}, + }, + ], + }); + + assert.deepStrictEqual(result, { + _kind: ProcessResultKind.FAILURE, + message: "Deployment graph construction failed", + failures: [new IgnitionError("Artifact None does not exist")], + }); }); }); diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index 2f38509c11..5d3485839e 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -4,33 +4,46 @@ import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { ProcessResultKind } from "../../src/types/process"; describe("deployment builder - buildModule", () => { - it("should throw if build module is given an async callback", () => { - assert.throws(() => { - const badAsyncModule = buildModule("BadAsyncModule", (async () => { - return {}; - }) as any); + it("should return an error if build module is given an async callback", () => { + const badAsyncModule = buildModule("BadAsyncModule", (async () => { + return {}; + }) as any); - return generateDeploymentGraphFrom(badAsyncModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); - }, /The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./); + const result = generateDeploymentGraphFrom(badAsyncModule, { + chainId: 31337, + accounts: [], + artifacts: [], + }); + + assert.deepStrictEqual(result, { + _kind: ProcessResultKind.FAILURE, + message: "Deployment graph construction failed", + failures: [ + new IgnitionError( + "The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'." + ), + ], + }); }); - it("should throw if build module throws an exception", () => { - assert.throws(() => { - const badAsyncModule = buildModule("BadAsyncModule", () => { - throw new IgnitionError("User thrown error"); - }); + it("should return error if build module throws an exception", () => { + const badAsyncModule = buildModule("BadAsyncModule", () => { + throw new IgnitionError("User thrown error"); + }); + + const result = generateDeploymentGraphFrom(badAsyncModule, { + chainId: 31337, + accounts: [], + artifacts: [], + }); - return generateDeploymentGraphFrom(badAsyncModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); - }, /User thrown error/); + assert.deepStrictEqual(result, { + _kind: ProcessResultKind.FAILURE, + message: "Deployment graph construction failed", + failures: [new IgnitionError("User thrown error")], + }); }); }); diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index 89262b779c..a947e257ac 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -5,6 +5,7 @@ import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { @@ -31,13 +32,20 @@ describe("deployment builder - calls", () => { return {}; }); - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + callModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -221,13 +229,20 @@ describe("deployment builder - calls", () => { return {}; }); - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + callModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 0a6e70257c..181804474c 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -10,6 +10,7 @@ import { isDeployedContract, isHardhatContract, } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { Artifact } from "../../src/types/hardhat"; @@ -35,9 +36,16 @@ describe("deployment builder - deploy", function () { return { example }; }); - const { graph } = generateDeploymentGraphFrom(singleModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + singleModule, + options + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -110,12 +118,16 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom( + const constructDeploymentGraphResult = generateDeploymentGraphFrom( twoContractsModule, options ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -176,12 +188,16 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom( + const constructDeploymentGraphResult = generateDeploymentGraphFrom( withConstructorArgsModule, options ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -245,12 +261,16 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom( + const constructDeploymentGraphResult = generateDeploymentGraphFrom( depsBetweenContractsModule, options ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -339,9 +359,16 @@ describe("deployment builder - deploy", function () { return { uniswap }; }); - const { graph } = generateDeploymentGraphFrom(uniswapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + uniswapModule, + options + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -402,12 +429,16 @@ describe("deployment builder - deploy", function () { } ); - const { graph } = generateDeploymentGraphFrom( + const constructDeploymentGraphResult = generateDeploymentGraphFrom( fromArtifactModule, options ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure to construct deployment graph"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 221a045d56..17181eab33 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -9,6 +9,7 @@ import { isAwaitedEvent, isCall, } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract } from "../../src/types/future"; @@ -86,13 +87,20 @@ describe("deployment builder - await event", () => { return {}; }); - const { graph } = generateDeploymentGraphFrom(eventModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + eventModule, + { + chainId: 31337, + accounts: [], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index 6b0c964b6d..e5b5cc4b80 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -9,6 +9,7 @@ import { isHardhatContract, isHardhatLibrary, } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { @@ -42,13 +43,20 @@ describe("deployment builder - libraries", () => { } ); - const { graph } = generateDeploymentGraphFrom(librariesModule, { - chainId: 31, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + librariesModule, + { + chainId: 31, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 686a4a600f..63d3468ba6 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -7,6 +7,7 @@ import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCallable } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; describe("deployment builder - parameters", function () { @@ -38,13 +39,20 @@ describe("deployment builder - parameters", function () { return { token }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, { - chainId: 31, - accounts: [], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + { + chainId: 31, + accounts: [], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index 18b50ec012..7c4b1f2bae 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -6,6 +6,7 @@ import { buildModule } from "../../src/dsl/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isHardhatContract } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { @@ -26,13 +27,20 @@ describe("deployment builder - send ETH", () => { return {}; }); - const { graph } = generateDeploymentGraphFrom(sendModule, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + sendModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 49d652361a..dcc80a6763 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -4,7 +4,9 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; import { buildModule } from "../../src/dsl/buildModule"; +import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract, @@ -15,6 +17,7 @@ import { Virtual, } from "../../src/types/future"; import { Module } from "../../src/types/module"; +import { ProcessResultKind } from "../../src/types/process"; import { getDependenciesForVertex, @@ -56,9 +59,16 @@ describe("deployment builder - useModule", () => { return { token, token2 }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + options + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -89,9 +99,16 @@ describe("deployment builder - useModule", () => { return { foo }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + options + ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -168,9 +185,16 @@ describe("deployment builder - useModule", () => { return { foo }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + options + ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -216,9 +240,16 @@ describe("deployment builder - useModule", () => { return { foo, bar, baz }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + options + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -315,9 +346,16 @@ describe("deployment builder - useModule", () => { return { foo: fooModule.foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(WrapModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + WrapModule, + options + ); - deploymentGraph = graph; + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -396,9 +434,16 @@ describe("deployment builder - useModule", () => { return { foo, bar }; }); - const { graph } = generateDeploymentGraphFrom(TopModule, options); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + TopModule, + options + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should create a graph", () => { @@ -471,11 +516,21 @@ describe("deployment builder - useModule", () => { }); }); - it("should throw", () => { - assert.throws( - () => generateDeploymentGraphFrom(differentParamsModule, options), - /`useModule` cannot be invoked on the same module using different parameters/ + it("should fail with an error", () => { + const result = generateDeploymentGraphFrom( + differentParamsModule, + options ); + + assert.deepStrictEqual(result, { + _kind: ProcessResultKind.FAILURE, + message: "Deployment graph construction failed", + failures: [ + new IgnitionError( + "`useModule` cannot be invoked on the same module using different parameters" + ), + ], + }); }); }); @@ -513,17 +568,26 @@ describe("deployment builder - useModule", () => { ); }); - it("should throw", () => { - assert.throws( - () => - // @ts-ignore - generateDeploymentGraphFrom(returnsWrongFutureTypeModule, { - chainId: 31, - accounts: [], - artifacts: [], - }), - /Cannot return Future of type "parameter" from a module/ + it("should fail with an error", () => { + const result = generateDeploymentGraphFrom( + // @ts-ignore + returnsWrongFutureTypeModule, + { + chainId: 31, + accounts: [], + artifacts: [], + } ); + + assert.deepStrictEqual(result, { + _kind: ProcessResultKind.FAILURE, + message: "Deployment graph construction failed", + failures: [ + new IgnitionError( + 'Cannot return Future of type "parameter" from a module' + ), + ], + }); }); }); }); diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index ab6eb203d4..4ba8b539b7 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -12,6 +12,7 @@ import { isCall, isHardhatContract, } from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { getDeploymentVertexByLabel } from "./helpers"; @@ -41,13 +42,20 @@ describe("deployment builder - value", () => { return { foo }; }); - const { graph } = generateDeploymentGraphFrom(callModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + callModule, + { + chainId: 31337, + accounts: [], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } - deploymentGraph = graph; + deploymentGraph = constructDeploymentGraphResult.result.graph; }); it("should default to zero value if not given a value parameter", () => { diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 980a4c054b..f955662d76 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -5,6 +5,7 @@ import { ethers } from "ethers"; import { Ignition } from "../../src/Ignition"; import { buildModule } from "../../src/dsl/buildModule"; +import { IgnitionError } from "../../src/errors"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { Artifact } from "../../src/types/hardhat"; import { Providers } from "../../src/types/providers"; @@ -458,10 +459,10 @@ describe("Rerunning execution", () => { assert.deepStrictEqual(modifiedResult, { _kind: "failure", failures: [ - "module change failure", + "Module reconciliation failed", [ - new Error( - "The module has been modified since the last run. Delete the journal file to start again." + new IgnitionError( + "The module has been modified since the last run. You can ignore the previous runs with the '--force' flag." ), ], ], diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 1989a33207..0e392878c3 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -1,3 +1,4 @@ +import { assert } from "chai"; import { ethers } from "ethers"; import { deployStateReducer } from "../../src/internal/deployment/deployStateReducer"; @@ -7,6 +8,7 @@ import { DeployState, DeployStateCommand, } from "../../src/internal/types/deployment"; +import { isFailure } from "../../src/internal/utils/process-results"; import { validateDeploymentGraph } from "../../src/internal/validation/validateDeploymentGraph"; import { Module } from "../../src/types/module"; import { getMockServices } from "../helpers"; @@ -19,12 +21,18 @@ export function applyActions( } export async function resolveExecutionGraphFor(module: Module) { - const { graph: deploymentGraph } = generateDeploymentGraphFrom(module, { + const constructDeploymentGraphResult = generateDeploymentGraphFrom(module, { chainId: 31337, accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], artifacts: [], }); + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure constructing deployment graph"); + } + + const { graph: deploymentGraph } = constructDeploymentGraphResult.result; + const mockServices = { ...getMockServices(), artifacts: { @@ -66,9 +74,9 @@ export async function resolveExecutionGraphFor(module: Module) { mockServices ); - if (transformResult._kind === "failure") { + if (isFailure(transformResult)) { throw new Error("Cannot resolve graph, failed transform"); } - return transformResult.executionGraph; + return transformResult.result.executionGraph; } diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index dc0b45dd77..768d6e0cfe 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -6,13 +6,15 @@ import { ethers } from "ethers"; import { buildModule } from "../src/dsl/buildModule"; import { IgnitionValidationError } from "../src/errors"; import { generateDeploymentGraphFrom } from "../src/internal/process/generateDeploymentGraphFrom"; +import { ResultsAccumulator } from "../src/internal/types/graph"; import { Services } from "../src/internal/types/services"; -import { ValidationVisitResult } from "../src/internal/types/validation"; +import { isFailure } from "../src/internal/utils/process-results"; import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; import { IDeploymentBuilder } from "../src/types/dsl"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; +import { ProcessStepResult } from "../src/types/process"; import { getMockServices } from "./helpers"; @@ -892,11 +894,20 @@ async function runValidation( ...getMockServices(), } as any); - const { graph, callPoints } = generateDeploymentGraphFrom(ignitionModule, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + ignitionModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Failure while constructing deployment graph"); + } + + const { graph, callPoints } = constructDeploymentGraphResult.result; const validationResult = await validateDeploymentGraph( graph, @@ -908,18 +919,16 @@ async function runValidation( } function assertValidationError( - validationResult: ValidationVisitResult, + validationResult: ProcessStepResult>, expectedMessage: string ) { - if (validationResult._kind !== "failure") { + if (!isFailure(validationResult)) { return assert.fail("validation should have failed"); } - const { - failures: [text, [error]], - } = validationResult; + assert.equal(validationResult.message, "Validation failed"); - assert.equal(text, "Validation failed"); + const error = validationResult.failures[0]; assert.equal(error.message, expectedMessage); assert.isTrue(error instanceof IgnitionValidationError); } From 25be43c4fc32d4b9ec89db761751e1c5bddc64bb Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 13:40:31 +0100 Subject: [PATCH 0275/1302] refactor: use enum in deployment result --- packages/core/src/Ignition.ts | 34 ++++++++++++------- packages/core/src/index.ts | 1 + .../core/src/internal/types/deployment.ts | 20 +++++++++-- packages/core/test/execution/rerun.ts | 5 +-- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index a399ccde95..103e96429d 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -1,8 +1,3 @@ -import type { - DeploymentResult, - IgnitionDeployOptions, - UpdateUiAction, -} from "./internal/types/deployment"; import type { ICommandJournal } from "./internal/types/journal"; import type { Module, ModuleDict } from "./types/module"; import type { IgnitionPlan } from "./types/plan"; @@ -22,6 +17,12 @@ import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; import { createServices } from "./internal/services/createServices"; +import { + DeploymentResult, + DeploymentResultState, + IgnitionDeployOptions, + UpdateUiAction, +} from "./internal/types/deployment"; import { ExecutionResultsAccumulator, ExecutionVisitResult, @@ -137,7 +138,7 @@ export class Ignition { log("Failed to construct execution graph"); return { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: [ constructExecutionGraphResult.message, constructExecutionGraphResult.failures, @@ -164,7 +165,7 @@ export class Ignition { await deployment.failReconciliation(); return { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: [moduleChangeResult.message, moduleChangeResult.failures], }; } @@ -184,14 +185,14 @@ export class Ignition { await deployment.failUnexpected([unexpectedError]); return { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: ["Unexpected error", [unexpectedError]], }; } await deployment.failUnexpected([err]); return { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: ["Unexpected error", [err]], }; } @@ -319,11 +320,17 @@ export class Ignition { moduleOutputs: T ): DeploymentResult { if (executionResult._kind === "failure") { - return executionResult; + return { + _kind: DeploymentResultState.FAILURE, + failures: executionResult.failures, + }; } if (executionResult._kind === "hold") { - return executionResult; + return { + _kind: DeploymentResultState.HOLD, + holds: executionResult.holds, + }; } const serializedDeploymentResult = this._serialize( @@ -331,7 +338,10 @@ export class Ignition { executionResult.result ); - return { _kind: "success", result: serializedDeploymentResult }; + return { + _kind: DeploymentResultState.SUCCESS, + result: serializedDeploymentResult, + }; } private _serialize( diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 5ac67d71cd..da3f59b6c3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,6 +2,7 @@ export { buildModule } from "./dsl/buildModule"; export { Ignition } from "./Ignition"; export type { DeploymentResult, + DeploymentResultState, DeployNetworkConfig, DeployPhase, DeployState, diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts index 97726ba2a6..8824442233 100644 --- a/packages/core/src/internal/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -42,6 +42,17 @@ export interface IgnitionDeployOptions { force: boolean; } +/** + * The possible deployment states. + * + * @internal + */ +export enum DeploymentResultState { + SUCCESS = "success", + FAILURE = "failure", + HOLD = "hold", +} + /** * The outcome of a deployment run. A deployment can either: * - `success` with a set of deployed contract information as the result @@ -52,9 +63,12 @@ export interface IgnitionDeployOptions { * @internal */ export type DeploymentResult = - | { _kind: "failure"; failures: [string, Error[]] } - | { _kind: "hold"; holds: VertexDescriptor[] } - | { _kind: "success"; result: SerializedDeploymentResult }; + | { _kind: DeploymentResultState.FAILURE; failures: [string, Error[]] } + | { _kind: DeploymentResultState.HOLD; holds: VertexDescriptor[] } + | { + _kind: DeploymentResultState.SUCCESS; + result: SerializedDeploymentResult; + }; /** * The different phases a deployment will move through: diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index f955662d76..7b0c50bdb3 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -7,6 +7,7 @@ import { Ignition } from "../../src/Ignition"; import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; +import { DeploymentResultState } from "../../src/internal/types/deployment"; import { Artifact } from "../../src/types/hardhat"; import { Providers } from "../../src/types/providers"; import { getMockServices } from "../helpers"; @@ -399,7 +400,7 @@ describe("Rerunning execution", () => { ); assert.deepStrictEqual(result, { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: [ "execution failed", [new Error("Revert: All the apes have gone!")], @@ -457,7 +458,7 @@ describe("Rerunning execution", () => { assert.equal(sentTransactionCount, 1, "postconditition after rerun"); assert.deepStrictEqual(modifiedResult, { - _kind: "failure", + _kind: DeploymentResultState.FAILURE, failures: [ "Module reconciliation failed", [ From dbcf4ab069709b852e196e8e473e1d1a35504d9d Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 13:56:44 +0100 Subject: [PATCH 0276/1302] refactor: move to visit result state enum --- packages/core/src/internal/execution/execute.ts | 9 +++++---- packages/core/src/internal/graph/visit.ts | 9 +++++---- packages/core/src/internal/types/graph.ts | 17 ++++++++++++++--- .../validation/validateDeploymentGraph.ts | 8 ++++---- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/packages/core/src/internal/execution/execute.ts b/packages/core/src/internal/execution/execute.ts index 7933eddac9..6a059269f6 100644 --- a/packages/core/src/internal/execution/execute.ts +++ b/packages/core/src/internal/execution/execute.ts @@ -3,14 +3,15 @@ import type { ExecutionOptions, ExecutionState } from "../types/deployment"; import type { ExecutionVertexDispatcher } from "../types/execution"; import type { ExecutionResultsAccumulator, + ExecutionVertex, ExecutionVertexVisitResult, ExecutionVisitResult, - ExecutionVertex, } from "../types/executionGraph"; import type { Services } from "../types/services"; import { IgnitionError } from "../../errors"; import { viewExecutionResults } from "../deployment/utils"; +import { VisitResultState } from "../types/graph"; import { ExecutionGraph } from "./ExecutionGraph"; import { executionDispatch } from "./dispatch/executionDispatch"; @@ -64,7 +65,7 @@ export async function executeInBatches( const errors = deployment.readExecutionErrors(); return { - _kind: "failure", + _kind: VisitResultState.FAILURE, failures: [ "execution failed", Object.values(errors).map((err) => err.failure), @@ -76,14 +77,14 @@ export async function executeInBatches( const holds = deployment.readExecutionHolds(); return { - _kind: "hold", + _kind: VisitResultState.HOLD, holds, }; } } return { - _kind: "success", + _kind: VisitResultState.SUCCESS, result: viewExecutionResults(deployment.state), }; } diff --git a/packages/core/src/internal/graph/visit.ts b/packages/core/src/internal/graph/visit.ts index b2cf2d6e18..3597282a57 100644 --- a/packages/core/src/internal/graph/visit.ts +++ b/packages/core/src/internal/graph/visit.ts @@ -1,9 +1,10 @@ import { IgnitionError } from "../../errors"; import { IGraph, - VertexVisitResult, ResultsAccumulator, + VertexVisitResult, VisitResult, + VisitResultState, } from "../types/graph"; export async function visit( @@ -38,14 +39,14 @@ export async function visit( } return { - _kind: "failure", + _kind: VisitResultState.FAILURE, failures: [`${phase} failed`, [vertexVisitResult.failure]], }; } if (vertexVisitResult._kind === "hold") { return { - _kind: "hold", + _kind: VisitResultState.HOLD, holds: [vertex as any], }; } @@ -57,5 +58,5 @@ export async function visit( } } - return { _kind: "success", result: resultAccumulator }; + return { _kind: VisitResultState.SUCCESS, result: resultAccumulator }; } diff --git a/packages/core/src/internal/types/graph.ts b/packages/core/src/internal/types/graph.ts index 4ca15380b0..1af04dab89 100644 --- a/packages/core/src/internal/types/graph.ts +++ b/packages/core/src/internal/types/graph.ts @@ -89,17 +89,28 @@ export type VertexVisitResult = | VertexVisitResultFailure | VertexVisitResultHold; +/** + * The possible state of processing a visit pass. + * + * @internal + */ +export enum VisitResultState { + SUCCESS = "success", + FAILURE = "failure", + HOLD = "hold", +} + export type VisitResult = | { - _kind: "success"; + _kind: VisitResultState.SUCCESS; result: ResultsAccumulator; } | { - _kind: "failure"; + _kind: VisitResultState.FAILURE; failures: [string, Error[]]; } | { - _kind: "hold"; + _kind: VisitResultState.HOLD; holds: VertexDescriptor[]; }; diff --git a/packages/core/src/internal/validation/validateDeploymentGraph.ts b/packages/core/src/internal/validation/validateDeploymentGraph.ts index f55f4f3589..4323363b3e 100644 --- a/packages/core/src/internal/validation/validateDeploymentGraph.ts +++ b/packages/core/src/internal/validation/validateDeploymentGraph.ts @@ -3,7 +3,7 @@ import { ProcessStepResult } from "../../types/process"; import { getSortedVertexIdsFrom } from "../graph/utils"; import { visit } from "../graph/visit"; import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; -import { ResultsAccumulator } from "../types/graph"; +import { ResultsAccumulator, VisitResultState } from "../types/graph"; import { Services } from "../types/services"; import { processStepErrored, @@ -31,11 +31,11 @@ export async function validateDeploymentGraph( ); switch (visitResult._kind) { - case "success": + case VisitResultState.SUCCESS: return processStepSucceeded(visitResult.result); - case "failure": + case VisitResultState.FAILURE: return processStepFailed("Validation failed", visitResult.failures[1]); - case "hold": + case VisitResultState.HOLD: throw new IgnitionError("Holds not exepected in validation"); } } catch (err) { From 42499048c86dd5252f8b7f52ae71c4b4417e052e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:02:28 +0100 Subject: [PATCH 0277/1302] refactor: use enum in tests --- packages/core/test/validation.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 768d6e0cfe..b31e9d85d6 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -14,7 +14,7 @@ import { IDeploymentBuilder } from "../src/types/dsl"; import { ArtifactContract } from "../src/types/future"; import { Artifact } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; -import { ProcessStepResult } from "../src/types/process"; +import { ProcessResultKind, ProcessStepResult } from "../src/types/process"; import { getMockServices } from "./helpers"; @@ -36,7 +36,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should not validate a artifact contract deploy with the wrong number of args", async () => { @@ -104,7 +104,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should not validate a artifact library deploy with the wrong number of args", async () => { @@ -245,7 +245,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should validate an overriden call", async () => { @@ -267,7 +267,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should fail a call on a nonexistant function", async () => { @@ -438,7 +438,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should fail a send with an invalid address", async () => { @@ -580,7 +580,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should fail awaiting a nonexistant event", async () => { @@ -658,7 +658,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should not validate a deployed contract with an invalid address", async () => { @@ -695,7 +695,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should not validate a contract deploy on a non-existant hardhat contract", async () => { @@ -783,7 +783,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); it("should not validate a library deploy on a non-existant hardhat library", async () => { @@ -879,7 +879,7 @@ describe("Validation", () => { const validationResult = await runValidation(singleModule, mockServices); - assert.equal(validationResult._kind, "success"); + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); }); }); From 339d5918338025a774b70bf16fc7ee3e02f50d81 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:12:43 +0100 Subject: [PATCH 0278/1302] refactor: leverage enums in tests --- packages/core/src/index.ts | 4 ++-- packages/core/test/execution/batching.ts | 7 +++++-- packages/core/test/execution/dispatch.ts | 15 +++++++++------ packages/core/test/execution/rerun.ts | 11 +++++------ .../src/ui/components/execution/FinalStatus.tsx | 10 +++++++--- 5 files changed, 28 insertions(+), 19 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index da3f59b6c3..d0eb0bff0f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,8 +1,8 @@ export { buildModule } from "./dsl/buildModule"; export { Ignition } from "./Ignition"; +export { DeploymentResultState } from "./internal/types/deployment"; export type { DeploymentResult, - DeploymentResultState, DeployNetworkConfig, DeployPhase, DeployState, @@ -60,12 +60,12 @@ export type { BaseArgValue, StructuredArgValue, } from "./internal/types/executionGraph"; +export { VertexResultEnum } from "./internal/types/graph"; export type { AdjacencyList, IGraph, VertexDescriptor, VertexGraph, - VertexResultEnum, VertexVisitResult, VertexVisitResultFailure, VertexVisitResultHold, diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index 5c64c027d3..f2de98d4d1 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -11,7 +11,10 @@ import { BigNumber } from "ethers"; import { Deployment } from "../../src/internal/deployment/Deployment"; import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; import { executeInBatches } from "../../src/internal/execution/execute"; -import { VertexResultEnum } from "../../src/internal/types/graph"; +import { + VertexResultEnum, + VisitResultState, +} from "../../src/internal/types/graph"; import { ICommandJournal } from "../../src/internal/types/journal"; import { buildAdjacencyListFrom } from "../graph/helpers"; @@ -59,7 +62,7 @@ describe("Execution - batching", () => { ); assert.isDefined(result); - assert.equal(result._kind, "success"); + assert.equal(result._kind, VisitResultState.SUCCESS); }); }); diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index f52e4a22bb..2a7d925b4d 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -7,7 +7,10 @@ import { Deployment } from "../../src/internal/deployment/Deployment"; import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; import { execute } from "../../src/internal/execution/execute"; import { ExecutionVertex } from "../../src/internal/types/executionGraph"; -import { VertexResultEnum } from "../../src/internal/types/graph"; +import { + VertexResultEnum, + VisitResultState, +} from "../../src/internal/types/graph"; import { ICommandJournal } from "../../src/internal/types/journal"; import { Services, @@ -74,7 +77,7 @@ describe("Execution - dispatch", () => { assert.isDefined(response); - if (response._kind !== "success") { + if (response._kind !== VisitResultState.SUCCESS) { return assert.fail("deploy failed"); } @@ -137,7 +140,7 @@ describe("Execution - dispatch", () => { ); assert.isDefined(response); - if (response._kind !== "success") { + if (response._kind !== VisitResultState.SUCCESS) { return assert.fail("deploy failed"); } @@ -244,7 +247,7 @@ describe("Execution - dispatch", () => { ); assert.isDefined(response); - if (response._kind !== "success") { + if (response._kind !== VisitResultState.SUCCESS) { return assert.fail("deploy failed"); } @@ -382,7 +385,7 @@ describe("Execution - dispatch", () => { mockServices ); - if (response._kind !== "success") { + if (response._kind !== VisitResultState.SUCCESS) { return assert.fail("deploy failed"); } @@ -437,7 +440,7 @@ describe("Execution - dispatch", () => { ); assert.isDefined(response); - if (response._kind !== "success") { + if (response._kind !== VisitResultState.SUCCESS) { return assert.fail("deploy failed"); } diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 7b0c50bdb3..827bcbbcbe 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -118,7 +118,7 @@ describe("Rerunning execution", () => { const result = await ignition.deploy(myModule, {} as any); // Assert - assert.equal(result._kind, "success"); + assert.equal(result._kind, DeploymentResultState.SUCCESS); // two transactions have been sent assert.equal(sentTransactionCount, 2, "precondition before rerun"); @@ -132,7 +132,7 @@ describe("Rerunning execution", () => { const redeployResult = await ignition.deploy(myModule, {} as any); // Assert - assert.equal(redeployResult._kind, "success"); + assert.equal(redeployResult._kind, DeploymentResultState.SUCCESS); // only two on-chain transactions happen, none from the rerun assert.equal( @@ -141,8 +141,7 @@ describe("Rerunning execution", () => { "postcondition on-chain transactions" ); - assert.equal(redeployResult._kind, "success"); - if (redeployResult._kind !== "success") { + if (redeployResult._kind !== DeploymentResultState.SUCCESS) { return assert.fail("Not a successful deploy"); } @@ -162,7 +161,7 @@ describe("Rerunning execution", () => { } as any); // Assert - assert.equal(redeployResult._kind, "success"); + assert.equal(redeployResult._kind, DeploymentResultState.SUCCESS); }); }); @@ -277,7 +276,7 @@ describe("Rerunning execution", () => { // additional query call on second run assert.equal(eventQueryCount, 2, "Wrong number of on-chain queries"); - if (redeployResult._kind !== "success") { + if (redeployResult._kind !== DeploymentResultState.SUCCESS) { return assert.fail("Not a successful deploy"); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 1353568246..12a37dbb78 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,4 +1,8 @@ -import { DeployState, ExecutionVertex } from "@ignored/ignition-core"; +import { + DeployState, + ExecutionVertex, + VertexResultEnum, +} from "@ignored/ignition-core"; import { viewExecutionResults } from "@ignored/ignition-core/helpers"; import { Box, Text } from "ink"; @@ -111,8 +115,8 @@ const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { if ( vertexResult === undefined || vertexResult === null || - vertexResult._kind === "success" || - vertexResult._kind === "hold" + vertexResult._kind === VertexResultEnum.SUCCESS || + vertexResult._kind === VertexResultEnum.HOLD ) { return null; } From bba90e8e9836c7c8e16fafc4f16fda04065e39b5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:19:57 +0100 Subject: [PATCH 0279/1302] refactor: remove uneeded type --- packages/core/src/internal/types/execution.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/core/src/internal/types/execution.ts b/packages/core/src/internal/types/execution.ts index dc48c93ec8..b467926a2f 100644 --- a/packages/core/src/internal/types/execution.ts +++ b/packages/core/src/internal/types/execution.ts @@ -5,16 +5,6 @@ import type { ExecutionVertexVisitResult, } from "./executionGraph"; -export type BatcherResult = - | { - _kind: "success"; - context: Map; - } - | { - _kind: "failure"; - errors: any[]; - }; - export type ExecutionVertexDispatcher = ( vertex: ExecutionVertex, resultAccumulator: ExecutionResultsAccumulator, From 8670a14ee9c799665ffacab04a570bc0bea16d6c Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:25:09 +0100 Subject: [PATCH 0280/1302] refactor: use enum in ui for vertexes --- packages/core/test/execution/rerun.ts | 5 ++--- packages/hardhat-plugin/src/ui/types.ts | 13 +++++++++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 827bcbbcbe..a31f2dfa01 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -3,9 +3,9 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { Ignition } from "../../src/Ignition"; import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; +import { Ignition } from "../../src/Ignition"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { DeploymentResultState } from "../../src/internal/types/deployment"; import { Artifact } from "../../src/types/hardhat"; @@ -418,8 +418,7 @@ describe("Rerunning execution", () => { // the second transaction is successfully sent assert.equal(sentTransactionCount, 2, "postconditition after rerun"); - assert.equal(redeployResult._kind, "success"); - if (redeployResult._kind !== "success") { + if (redeployResult._kind !== DeploymentResultState.SUCCESS) { return assert.fail("Not a successful deploy"); } diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index fbad9e874f..63a71d5163 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -5,13 +5,18 @@ import { VertexVisitResultFailure, } from "@ignored/ignition-core"; +enum VertexStatusState { + SUCCESS = "success", + FAILURE = "failure", +} + interface VertexSuccess { - status: "success"; + status: VertexStatusState.SUCCESS; vertex: ExecutionVertex; } interface VertexFailure { - status: "failure"; + status: VertexStatusState.FAILURE; vertex: ExecutionVertex; error: unknown; } @@ -100,14 +105,14 @@ export class DeploymentState { public setExeuctionVertexAsSuccess(vertex: ExecutionVertex) { this.executionVertexes[vertex.id] = { vertex, - status: "success", + status: VertexStatusState.SUCCESS, }; } public setExecutionVertexAsFailure(vertex: ExecutionVertex, err: unknown) { this.executionVertexes[vertex.id] = { vertex, - status: "failure", + status: VertexStatusState.FAILURE, error: err, }; } From 3578f9984b9cf6cf4626ccf03bedda9cfd97892f Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:25:27 +0100 Subject: [PATCH 0281/1302] refactor: remove unneeded type --- packages/core/src/internal/types/process.ts | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 packages/core/src/internal/types/process.ts diff --git a/packages/core/src/internal/types/process.ts b/packages/core/src/internal/types/process.ts deleted file mode 100644 index ae192e045f..0000000000 --- a/packages/core/src/internal/types/process.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { IExecutionGraph } from "./executionGraph"; - -export type TransformResult = - | { - _kind: "success"; - executionGraph: IExecutionGraph; - } - | { - _kind: "failure"; - failures: [string, Error[]]; - }; From 91a6536e7ca678dea627bc3cdfe03cfd4323ce4a Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:29:22 +0100 Subject: [PATCH 0282/1302] refactor: remove afterAction --- packages/core/src/Ignition.ts | 9 +++++---- .../src/internal/execution/dispatch/utils.ts | 5 +++-- packages/core/src/internal/graph/visit.ts | 16 ++++------------ packages/core/test/execution/dispatch.ts | 2 +- packages/core/test/execution/rerun.ts | 6 +++--- packages/core/test/options.ts | 3 ++- packages/hardhat-plugin/src/ignition-wrapper.ts | 3 ++- 7 files changed, 20 insertions(+), 24 deletions(-) diff --git a/packages/core/src/Ignition.ts b/packages/core/src/Ignition.ts index 103e96429d..f81870c3ad 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/Ignition.ts @@ -28,6 +28,7 @@ import { ExecutionVisitResult, IExecutionGraph, } from "./internal/types/executionGraph"; +import { VertexResultEnum, VisitResultState } from "./internal/types/graph"; import { Services } from "./internal/types/services"; import { isFailure, @@ -319,14 +320,14 @@ export class Ignition { executionResult: ExecutionVisitResult, moduleOutputs: T ): DeploymentResult { - if (executionResult._kind === "failure") { + if (executionResult._kind === VisitResultState.FAILURE) { return { _kind: DeploymentResultState.FAILURE, failures: executionResult.failures, }; } - if (executionResult._kind === "hold") { + if (executionResult._kind === VisitResultState.HOLD) { return { _kind: DeploymentResultState.HOLD, holds: executionResult.holds, @@ -359,8 +360,8 @@ export class Ignition { if ( executionResultValue === undefined || executionResultValue === null || - executionResultValue._kind === "failure" || - executionResultValue._kind === "hold" || + executionResultValue._kind === VertexResultEnum.FAILURE || + executionResultValue._kind === VertexResultEnum.HOLD || future.type !== "contract" ) { continue; diff --git a/packages/core/src/internal/execution/dispatch/utils.ts b/packages/core/src/internal/execution/dispatch/utils.ts index 7b80c252ee..e39c42f6b5 100644 --- a/packages/core/src/internal/execution/dispatch/utils.ts +++ b/packages/core/src/internal/execution/dispatch/utils.ts @@ -4,6 +4,7 @@ import type { } from "../../types/executionGraph"; import { IgnitionError } from "../../../errors"; +import { VertexResultEnum } from "../../types/graph"; import { isDependable, isEventParam, isProxy } from "../../utils/guards"; export function toAddress(v: any) { @@ -38,13 +39,13 @@ function resolveFromContext( ); } - if (entry._kind === "failure") { + if (entry._kind === VertexResultEnum.FAILURE) { throw new IgnitionError( `Looking up context on a failed vertex - violation of constraint` ); } - if (entry._kind === "hold") { + if (entry._kind === VertexResultEnum.HOLD) { throw new IgnitionError( `Looking up context on a on hold - violation of constraint` ); diff --git a/packages/core/src/internal/graph/visit.ts b/packages/core/src/internal/graph/visit.ts index 3597282a57..e8a510ef02 100644 --- a/packages/core/src/internal/graph/visit.ts +++ b/packages/core/src/internal/graph/visit.ts @@ -2,6 +2,7 @@ import { IgnitionError } from "../../errors"; import { IGraph, ResultsAccumulator, + VertexResultEnum, VertexVisitResult, VisitResult, VisitResultState, @@ -17,8 +18,7 @@ export async function visit( vertex: T, resultAccumulator: ResultsAccumulator, context: C - ) => Promise>, - afterAction?: (vertex: T, kind: "success" | "failure", err?: unknown) => void + ) => Promise> ): Promise> { for (const vertexId of orderedVertexIds) { const vertex = graph.vertexes.get(vertexId); @@ -33,18 +33,14 @@ export async function visit( context ); - if (vertexVisitResult._kind === "failure") { - if (afterAction !== undefined) { - afterAction(vertex, "failure", vertexVisitResult.failure); - } - + if (vertexVisitResult._kind === VertexResultEnum.FAILURE) { return { _kind: VisitResultState.FAILURE, failures: [`${phase} failed`, [vertexVisitResult.failure]], }; } - if (vertexVisitResult._kind === "hold") { + if (vertexVisitResult._kind === VertexResultEnum.HOLD) { return { _kind: VisitResultState.HOLD, holds: [vertex as any], @@ -52,10 +48,6 @@ export async function visit( } resultAccumulator.set(vertexId, vertexVisitResult); - - if (afterAction !== undefined) { - afterAction(vertex, "success"); - } } return { _kind: VisitResultState.SUCCESS, result: resultAccumulator }; diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index 2a7d925b4d..a394f2875b 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -410,7 +410,7 @@ describe("Execution - dispatch", () => { ); assert( - response._kind === "hold", + response._kind === VisitResultState.HOLD, `response should be hold, not: ${response._kind}` ); }); diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index a31f2dfa01..68760ece0f 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -3,9 +3,9 @@ import { assert } from "chai"; import { ethers } from "ethers"; +import { Ignition } from "../../src/Ignition"; import { buildModule } from "../../src/dsl/buildModule"; import { IgnitionError } from "../../src/errors"; -import { Ignition } from "../../src/Ignition"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { DeploymentResultState } from "../../src/internal/types/deployment"; import { Artifact } from "../../src/types/hardhat"; @@ -249,7 +249,7 @@ describe("Rerunning execution", () => { const result = await ignition.deploy(myModule, {} as any); // Assert - assert.equal(result._kind, "hold"); + assert.equal(result._kind, DeploymentResultState.HOLD); // two calls sent assert.equal( @@ -316,7 +316,7 @@ describe("Rerunning execution", () => { const result = await ignition.deploy(myModule, {} as any); - assert.equal(result._kind, "hold"); + assert.equal(result._kind, DeploymentResultState.HOLD); }); }); diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts index a738039cb4..4162c05f41 100644 --- a/packages/core/test/options.ts +++ b/packages/core/test/options.ts @@ -4,6 +4,7 @@ import { assert } from "chai"; import { BigNumber, ethers } from "ethers"; import { buildModule, Ignition } from "../src"; +import { DeploymentResultState } from "../src/internal/types/deployment"; import { Artifact } from "../src/types/hardhat"; import { getMockServices } from "./helpers"; @@ -113,7 +114,7 @@ describe("deploy options", () => { txPollingInterval: 4, }); - assert.equal(result._kind, "success"); + assert.equal(result._kind, DeploymentResultState.SUCCESS); }); it("should pass the options through to the transaction service", async function () { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 422ba567c3..b2ac5fc5f7 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,6 +1,7 @@ import type { Contract } from "ethers"; import { + DeploymentResultState, ICommandJournal, Ignition, IgnitionDeployOptions, @@ -84,7 +85,7 @@ export class IgnitionWrapper { force, }); - if (deploymentResult._kind === "hold") { + if (deploymentResult._kind === DeploymentResultState.HOLD) { const heldVertexes = deploymentResult.holds; let heldMessage = ""; From 0ed0b7d95d4db121aab35a263d7c9d26b5d1ce25 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 31 Mar 2023 14:42:35 +0100 Subject: [PATCH 0283/1302] refactor: use failure enums --- packages/core/src/internal/deployment/Deployment.ts | 11 ++++++----- packages/core/test/execution/rerun.ts | 2 +- packages/core/test/state-reducer/utils.ts | 3 ++- packages/hardhat-plugin/src/ignition-wrapper.ts | 2 +- .../src/ui/components/execution/AddressResults.tsx | 4 ++-- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/packages/core/src/internal/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts index 53dca450af..eaa5207ba4 100644 --- a/packages/core/src/internal/deployment/Deployment.ts +++ b/packages/core/src/internal/deployment/Deployment.ts @@ -6,10 +6,6 @@ import type { UpdateUiAction, } from "../types/deployment"; import type { ExecutionVertexVisitResult } from "../types/executionGraph"; -import type { - VertexDescriptor, - VertexVisitResultFailure, -} from "../types/graph"; import type { ICommandJournal } from "../types/journal"; import type { Services } from "../types/services"; @@ -17,6 +13,11 @@ import setupDebug from "debug"; import { IgnitionError } from "../../errors"; import { ExecutionGraph } from "../execution/ExecutionGraph"; +import { + VertexDescriptor, + VertexResultEnum, + VertexVisitResultFailure, +} from "../types/graph"; import { deployStateReducer, @@ -179,7 +180,7 @@ export class Deployment { if ( result === undefined || result === null || - result._kind !== "failure" + result._kind !== VertexResultEnum.FAILURE ) { return acc; } diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 68760ece0f..4db006c327 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -389,7 +389,7 @@ describe("Rerunning execution", () => { const result = await ignition.deploy(myModule, {} as any); // Assert - assert.equal(result._kind, "failure"); + assert.equal(result._kind, DeploymentResultState.FAILURE); // one calls sent assert.equal( diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts index 0e392878c3..ee0a6a6730 100644 --- a/packages/core/test/state-reducer/utils.ts +++ b/packages/core/test/state-reducer/utils.ts @@ -11,6 +11,7 @@ import { import { isFailure } from "../../src/internal/utils/process-results"; import { validateDeploymentGraph } from "../../src/internal/validation/validateDeploymentGraph"; import { Module } from "../../src/types/module"; +import { ProcessResultKind } from "../../src/types/process"; import { getMockServices } from "../helpers"; export function applyActions( @@ -65,7 +66,7 @@ export async function resolveExecutionGraphFor(module: Module) { mockServices ); - if (validationKind === "failure") { + if (validationKind === ProcessResultKind.FAILURE) { throw new Error("Cannot resolve graph, failed validation"); } diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index b2ac5fc5f7..ce6cc220f0 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -98,7 +98,7 @@ export class IgnitionWrapper { ); } - if (deploymentResult._kind === "failure") { + if (deploymentResult._kind === DeploymentResultState.FAILURE) { const [failureType, failures] = deploymentResult.failures; if (failures.length === 1) { diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 7115f3ef0d..571af0ba6d 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState, VertexResultEnum } from "@ignored/ignition-core"; import { viewExecutionResults } from "@ignored/ignition-core/helpers"; import { Box, Spacer, Text } from "ink"; @@ -41,7 +41,7 @@ const resolveDeployAddresses = (deployState: DeployState) => { for (const value of viewExecutionResults(deployState).values()) { if ( value !== undefined && - value._kind === "success" && + value._kind === VertexResultEnum.SUCCESS && "name" in value.result && "address" in value.result ) { From 9eaef5ba98b79c087040aef43489a68017674a00 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:08:02 +0200 Subject: [PATCH 0284/1302] Fix: typos --- docs/creating-modules-for-deployment.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 1e14791107..b621175e68 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -15,8 +15,8 @@ - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) - [Create2](./creating-modules-for-deployment.md#create2) - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - - [Transfering _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) - - [Transfering _Eth_ outside of a call](./creating-modules-for-deployment.md#transfering-eth-outside-of-a-call) + - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) + - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transfering-eth-outside-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) @@ -207,7 +207,7 @@ m.call(exchange, "addToken", { }); ``` -### Transfering _Eth_ as part of a call +### Transferring _Eth_ as part of a call Similar to `ethers`, a call can transfer `Eth` by passing a `value` under the options: From ffb215c0b3deb7ca12aee78fb8f775d9cbf2ce97 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:10:03 +0200 Subject: [PATCH 0285/1302] Fix: typos --- docs/creating-modules-for-deployment.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index b621175e68..c6a6de15c0 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -15,8 +15,8 @@ - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) - [Create2](./creating-modules-for-deployment.md#create2) - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transfering-eth-as-part-of-a-call) - - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transfering-eth-outside-of-a-call) + - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transferring-eth-as-part-of-a-call) + - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transferring-eth-outside-of-a-call) - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) From 5b7d76fe2b1c31dafc5eb322bd634de405ad5cef Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:13:07 +0200 Subject: [PATCH 0286/1302] Fix: typos --- docs/design.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/design.md b/docs/design.md index 2d395cb140..3eac54b942 100644 --- a/docs/design.md +++ b/docs/design.md @@ -21,9 +21,9 @@ flowchart LR Ignition expresses a deployment as a dependency graph of on-chain transactions, that is, contract deployments and contract calls. Deployments and calls can be dependent on each other. A call to a contract requires that that contract first be deployed; the call should not be invoked until the contract deploy has completed entirely and successfully. -Ignition provides the **deployment api** (a js based dsl) so users can succintly describe a dependency graph of contract deploys and calls. +Ignition provides the **deployment api** (a js based dsl) so users can succinctly describe a dependency graph of contract deploys and calls. -To deploy on-chain Ignition takes a `Module` specified via the **deployment api** and constructs the `ExecutionGraph` (the depenency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). +To deploy on-chain Ignition takes a `Module` specified via the **deployment api** and constructs the `ExecutionGraph` (the dependency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). The `ExecutionGraph` is passed to the execution engine which submits the transactions on-chain, ordering them and batching them based on the dependency constraints of the `ExecutionGraph`. @@ -157,7 +157,7 @@ Validated, simplified and converted to the agnostic `ExecutionGraph` representat The execution engine is responsible for submitting transactions to the blockchain. It takes the `ExecutionGraph` as input and uses the vertexes to determine which transactions should be sent, and uses the edges to determine how the transactions are ordered and batched. -More than one transaction can be submitted to the Ethereum chain at once. A **depenency** in this context means that the previous transaction must have completed successfully on chain before the dependent transaction can be submitted. +More than one transaction can be submitted to the Ethereum chain at once. A **dependency** in this context means that the previous transaction must have completed successfully on chain before the dependent transaction can be submitted. To simplify user reasoning about the order of execution, the execution engine groups into batches. A batch is the next set of transactions to submit. Batches are submitted until there is an error or all transactions are complete. @@ -192,11 +192,11 @@ while (unstarted.length > 0) { } ``` -A batch is constructed by looking at all unstarted or on-hold vertexes and using the `ExecutionGraph` to determine if all there dependencies have been met (executed successfully). +A batch is constructed by looking at all unstarted or on-hold vertexes and using the `ExecutionGraph` to determine if all their dependencies have been met (executed successfully). -The execution engine will wait until all the transactions in a batch have completed or failed or been designated on-hold or timed out. Once the batch is complete, either the deployment finishes as complete because because all transactions are complete, as error because there was an error, as on-hold because there was an on-hold result but no errors or timeouts. +The execution engine will wait until all the transactions in a batch have completed or failed or been designated on-hold or timed out. Once the batch is complete, either the deployment finishes as complete because all transactions are complete, as error because there was an error, as on-hold because there was an on-hold result but no errors or timeouts. -A policy governs how to deal with timed-out transactions. By default if an timed-out transaction fails to complete `x` times (once per batch) it becomes a failure. +A policy governs how to deal with timed-out transactions. By default if a timed-out transaction fails to complete `x` times (once per batch) it becomes a failure. Either the entire graph of transactions will eventually succeed, in which case the deployment was a success. Or a transaction will fail or be stopped from completing, leading to a failed deployment. From 7964d1ebda275b2560125ee0f041b3b242035937 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:13:54 +0200 Subject: [PATCH 0287/1302] Fix: typo --- docs/distributable-deployments.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/distributable-deployments.md b/docs/distributable-deployments.md index a1d1870f23..d1577235b2 100644 --- a/docs/distributable-deployments.md +++ b/docs/distributable-deployments.md @@ -127,6 +127,6 @@ We may look at other distribution mechanisms but we want to support distribution - run the deployment on each chain you are deploying to - rerun on failures - recreate the deployment artifact if needed. - - commit your successful deployed contract list and the deployment artifact to the repo + - commit your successfully deployed contract list and the deployment artifact to the repo - Distribute your contracts - push the repo to npm including the deployment artifact and the deployment result's deployed contract list From d3a0f21259d23171fe522922f3bbb2a89aa86dd8 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Fri, 7 Apr 2023 11:14:29 +0200 Subject: [PATCH 0288/1302] Fix: typo --- docs/getting-started-guide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 0b0ecd6654..e90786cafc 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -147,7 +147,7 @@ const LockModule = require("../ignition/LockModule"); } ``` -The **Hardhat** test command will automtically include the `ignition` object within the scope of test files when running tests: +The **Hardhat** test command will automatically include the `ignition` object within the scope of test files when running tests: ```sh npx hardhat test From 0f104a911b6b95fdb7084718b6d4ba0c911f3ee0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 30 Mar 2023 15:39:54 -0300 Subject: [PATCH 0289/1302] Refactor core's public API. Please read on. This commit introduces a list of changes: 1. It removes every internal type from the public api, using `unknown` where we don't yet have a clear idea of what to return without exposing internals. 2. It defines an Ignition interface. Its implementation has been renamed. 3. Removes some unused types. 4. Moves as many types as possible to internal/ 5. Creates an `initialization` module with a factory of Ignition, which doesn't expose any internal type. 6. Only export the init factory, buildModule, errors and types from the index. 7. Moved the Ignition implementation to internal/ 8. Moved the dsl implementation to internal/ 9. Adapt core's tests so that they still work, but not the plugin --- packages/core/src/{dsl => }/buildModule.ts | 6 +- packages/core/src/errors.ts | 8 +- packages/core/src/index.ts | 159 ++---------------- packages/core/src/initialization.ts | 50 ++++++ packages/core/src/{ => internal}/Ignition.ts | 108 ++++++++---- .../{ => internal}/dsl/DeploymentBuilder.ts | 37 +++- .../src/{ => internal}/dsl/DeploymentGraph.ts | 4 +- .../core/src/{ => internal}/dsl/ScopeStack.ts | 0 .../process/generateDeploymentGraphFrom.ts | 2 +- ...oymentGraphByEliminatingVirtualVertexes.ts | 2 +- .../core/src/internal/types/deployment.ts | 16 -- packages/core/src/types/future.ts | 4 - packages/core/src/types/ignition.ts | 96 +++++++---- packages/core/src/types/module.ts | 11 +- packages/core/src/types/plan.ts | 12 +- packages/core/src/types/providers.ts | 18 +- packages/core/test/buildModule.ts | 2 +- .../core/test/deploymentBuilder/accounts.ts | 2 +- .../core/test/deploymentBuilder/artifacts.ts | 2 +- .../test/deploymentBuilder/buildModule.ts | 2 +- packages/core/test/deploymentBuilder/calls.ts | 2 +- .../core/test/deploymentBuilder/deploy.ts | 2 +- packages/core/test/deploymentBuilder/event.ts | 2 +- .../core/test/deploymentBuilder/helpers.ts | 2 +- .../core/test/deploymentBuilder/libraries.ts | 2 +- .../core/test/deploymentBuilder/metadata.ts | 2 +- .../core/test/deploymentBuilder/parameters.ts | 2 +- .../core/test/deploymentBuilder/sendETH.ts | 2 +- .../core/test/deploymentBuilder/useModule.ts | 2 +- packages/core/test/deploymentBuilder/value.ts | 2 +- packages/core/test/execution/rerun.ts | 10 +- .../core/test/helpers/setupIgnitionWith.ts | 6 +- packages/core/test/options.ts | 9 +- packages/core/test/state-reducer/execution.ts | 2 +- .../test/state-reducer/preparation-steps.ts | 2 +- packages/core/test/validation.ts | 2 +- 36 files changed, 286 insertions(+), 306 deletions(-) rename packages/core/src/{dsl => }/buildModule.ts (83%) create mode 100644 packages/core/src/initialization.ts rename packages/core/src/{ => internal}/Ignition.ts (79%) rename packages/core/src/{ => internal}/dsl/DeploymentBuilder.ts (97%) rename packages/core/src/{ => internal}/dsl/DeploymentGraph.ts (73%) rename packages/core/src/{ => internal}/dsl/ScopeStack.ts (100%) diff --git a/packages/core/src/dsl/buildModule.ts b/packages/core/src/buildModule.ts similarity index 83% rename from packages/core/src/dsl/buildModule.ts rename to packages/core/src/buildModule.ts index 6f37cd8ba6..31254b034c 100644 --- a/packages/core/src/dsl/buildModule.ts +++ b/packages/core/src/buildModule.ts @@ -1,10 +1,10 @@ -import type { Module, ModuleDict } from "../types/module"; +import type { Module, ModuleDict } from "./types/module"; import { assertFunctionParam, assertStringParam, -} from "../internal/utils/paramAssertions"; -import { IDeploymentBuilder } from "../types/dsl"; +} from "./internal/utils/paramAssertions"; +import { IDeploymentBuilder } from "./types/dsl"; /** * A factory that builds a deployment module given configuration function that diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 1107a92e2f..29435dd044 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,6 +1,8 @@ /** * All exceptions intenionally thrown with Ignition-core * extend this class. + * + * @alpha */ export class IgnitionError extends Error { constructor(message: string) { @@ -15,6 +17,8 @@ export class IgnitionError extends Error { * validation phase on the user inputed module. Validation errors * capture the stack to the action within the offending module, * to enhance the locality of the validation error message. + * + * * @alpha */ export class IgnitionValidationError extends IgnitionError { constructor(message: string) { @@ -32,7 +36,9 @@ export class IgnitionValidationError extends IgnitionError { * api, so that the stack leads directly to the line in the module * the user called (i.e. `m.contract(...)`) * - * @param f the function to hide all of the stacktrace above + * @param f - the function to hide all of the stacktrace above + * + * @internal */ public resetStackFrom(f: () => any) { Error.captureStackTrace(this, f); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index d0eb0bff0f..e221db4cdd 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,147 +1,12 @@ -export { buildModule } from "./dsl/buildModule"; -export { Ignition } from "./Ignition"; -export { DeploymentResultState } from "./internal/types/deployment"; -export type { - DeploymentResult, - DeployNetworkConfig, - DeployPhase, - DeployState, - DeployStateExecutionCommand, - ExecutionState, - IgnitionDeployOptions, - UpdateUiAction, - ValidationState, - VertexExecutionState, - VertexExecutionStateCompleted, - VertexExecutionStateFailed, - VertexExecutionStateHold, - VertexExecutionStateRunning, - VertexExecutionStateUnstarted, - VertexExecutionStatusCompleted, - VertexExecutionStatusFailed, - VertexExecutionStatusHold, - VertexExecutionStatusRunning, - VertexExecutionStatusUnstarted, -} from "./internal/types/deployment"; -export type { - ArtifactContractDeploymentVertex, - ArtifactLibraryDeploymentVertex, - CallDeploymentVertex, - DeployedContractDeploymentVertex, - DeploymentGraphVertex, - EventVertex, - HardhatContractDeploymentVertex, - HardhatLibraryDeploymentVertex, - IDeploymentGraph, - LibraryMap, - ScopeData, - SendVertex, - VirtualVertex, -} from "./internal/types/deploymentGraph"; -export type { - ArgValue, - AwaitedEventExecutionVertex, - AwaitedEventSuccess, - ContractCallExecutionVertex, - ContractCallSuccess, - ContractDeployExecutionVertex, - ContractDeploySuccess, - DeployedContractExecutionVertex, - DeployedContractSuccess, - ExecutionVertex, - ExecutionVertexType, - ExecutionVertexVisitResult, - IExecutionGraph, - LibraryDeployExecutionVertex, - LibraryDeploySuccess, - SendETHSuccess, - SentETHExecutionVertex, - VertexVisitResultSuccessResult, - BaseArgValue, - StructuredArgValue, -} from "./internal/types/executionGraph"; -export { VertexResultEnum } from "./internal/types/graph"; -export type { - AdjacencyList, - IGraph, - VertexDescriptor, - VertexGraph, - VertexVisitResult, - VertexVisitResultFailure, - VertexVisitResultHold, - VertexVisitResultSuccess, -} from "./internal/types/graph"; -export type { ICommandJournal } from "./internal/types/journal"; -export type { - IAccountsService, - IArtifactsService, - IConfigService, - IContractsService, - INetworkService, - ITransactionsService, - Services, - TransactionOptions, -} from "./internal/types/services"; -export { - AwaitOptions, - BaseArgumentType, - CallOptions, - ContractOptions, - ExternalParamValue, - IDeploymentBuilder, - InternalParamValue, - SendOptions, - UseModuleOptions, -} from "./types/dsl"; -export type { - AddressResolvable, - ArtifactContract, - ArtifactFuture, - ArtifactLibrary, - CallableFuture, - ContractCall, - ContractFuture, - DependableFuture, - DeployedContract, - DeploymentGraphFuture, - EventFuture, - EventParamFuture, - EventParams, - HardhatContract, - HardhatLibrary, - LibraryFuture, - OptionalParameter, - ParameterFuture, - ParameterValue, - ProxyFuture, - RequiredParameter, - SendFuture, - Virtual, -} from "./types/future"; -export type { Artifact } from "./types/hardhat"; -export type { - IgnitionConstructorArgs, - IgnitionCreationArgs, -} from "./types/ignition"; -export type { - Module, - ModuleDict, - ModuleParams, - ModuleReturnValue, -} from "./types/module"; -export type { IgnitionPlan } from "./types/plan"; -export type { - AccountsProvider, - ArtifactsProvider, - ConfigProvider, - EIP1193Provider, - GasProvider, - HasParamErrorCode, - HasParamResult, - Providers, - TransactionsProvider, -} from "./types/providers"; -export type { - ContractInfo, - SerializedDeploymentResult, -} from "./types/serialization"; +export { buildModule } from "./buildModule"; +export * from "./initialization"; +export * from "./errors"; +export * from "./types/dsl"; +export * from "./types/future"; +export * from "./types/future"; +export * from "./types/hardhat"; +export * from "./types/ignition"; +export * from "./types/module"; +export * from "./types/plan"; +export * from "./types/providers"; +export * from "./types/serialization"; diff --git a/packages/core/src/initialization.ts b/packages/core/src/initialization.ts new file mode 100644 index 0000000000..ac0770b021 --- /dev/null +++ b/packages/core/src/initialization.ts @@ -0,0 +1,50 @@ +import type { UpdateUiAction } from "./internal/types/deployment"; +import type { ICommandJournal } from "./internal/types/journal"; +import type { + ICommandJournalT, + Ignition, + UpdateUiActionT, +} from "./types/ignition"; +import type { Providers } from "./types/providers"; + +import { IgnitionImplementation } from "./internal/Ignition"; + +/** + * The setup options for the Ignition. + * + * @alpha + */ +export interface IgnitionInitializationArguments { + /** + * The adapters that allows Ignition to communicate with external systems + * like the target blockchain or local filesystem. + */ + providers: Providers; + + /** + * An optional UI update function that will be invoked with the current + * Ignition state on each major state change. + */ + uiRenderer?: UpdateUiActionT; + + /** + * An optional journal that will be used to store a record of the current + * run and to access the history of previous runs. + */ + journal?: ICommandJournalT; +} + +/** + * Creates a new instances of Ignition + * + * @alpha + */ +export function initializeIgnition( + args: IgnitionInitializationArguments +): Ignition { + return IgnitionImplementation.create({ + providers: args.providers, + journal: args.journal as ICommandJournal | undefined, + uiRenderer: args.uiRenderer as UpdateUiAction | undefined, + }); +} diff --git a/packages/core/src/Ignition.ts b/packages/core/src/internal/Ignition.ts similarity index 79% rename from packages/core/src/Ignition.ts rename to packages/core/src/internal/Ignition.ts index f81870c3ad..a8f6b0013c 100644 --- a/packages/core/src/Ignition.ts +++ b/packages/core/src/internal/Ignition.ts @@ -1,56 +1,104 @@ -import type { ICommandJournal } from "./internal/types/journal"; -import type { Module, ModuleDict } from "./types/module"; -import type { IgnitionPlan } from "./types/plan"; +import type { Module, ModuleDict } from "../types/module"; +import type { IgnitionPlan } from "../types/plan"; import type { ContractInfo, SerializedDeploymentResult, -} from "./types/serialization"; +} from "../types/serialization"; +import type { ICommandJournal } from "./types/journal"; import setupDebug from "debug"; -import { IgnitionError } from "./errors"; -import { Deployment } from "./internal/deployment/Deployment"; -import { execute } from "./internal/execution/execute"; -import { loadJournalInto } from "./internal/execution/loadJournalInto"; -import { hashExecutionGraph } from "./internal/execution/utils"; -import { NoopCommandJournal } from "./internal/journal/NoopCommandJournal"; -import { generateDeploymentGraphFrom } from "./internal/process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "./internal/process/transformDeploymentGraphToExecutionGraph"; -import { createServices } from "./internal/services/createServices"; +import { IgnitionError } from "../errors"; +import { Ignition, IgnitionDeployOptions } from "../types/ignition"; +import { ProcessStepResult } from "../types/process"; +import { Providers } from "../types/providers"; + +import { Deployment } from "./deployment/Deployment"; +import { execute } from "./execution/execute"; +import { loadJournalInto } from "./execution/loadJournalInto"; +import { hashExecutionGraph } from "./execution/utils"; +import { NoopCommandJournal } from "./journal/NoopCommandJournal"; +import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFrom"; +import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; +import { createServices } from "./services/createServices"; import { DeploymentResult, DeploymentResultState, - IgnitionDeployOptions, UpdateUiAction, -} from "./internal/types/deployment"; +} from "./types/deployment"; import { ExecutionResultsAccumulator, ExecutionVisitResult, IExecutionGraph, -} from "./internal/types/executionGraph"; -import { VertexResultEnum, VisitResultState } from "./internal/types/graph"; -import { Services } from "./internal/types/services"; +} from "./types/executionGraph"; +import { VertexResultEnum, VisitResultState } from "./types/graph"; +import { Services } from "./types/services"; import { isFailure, processStepFailed, processStepSucceeded, -} from "./internal/utils/process-results"; -import { resolveProxyValue } from "./internal/utils/proxy"; -import { validateDeploymentGraph } from "./internal/validation/validateDeploymentGraph"; -import { - IgnitionConstructorArgs, - IgnitionCreationArgs, -} from "./types/ignition"; -import { ProcessStepResult } from "./types/process"; +} from "./utils/process-results"; +import { resolveProxyValue } from "./utils/proxy"; +import { validateDeploymentGraph } from "./validation/validateDeploymentGraph"; const log = setupDebug("ignition:main"); +/** + * The setup options for the Ignition. + * + * @internal + */ +export interface IgnitionCreationArgs { + /** + * The adapters that allows Ignition to communicate with external systems + * like the target blockchain or local filesystem. + */ + providers: Providers; + + /** + * An optional UI update function that will be invoked with the current + * Ignition state on each major state change. + */ + uiRenderer?: UpdateUiAction; + + /** + * An optional journal that will be used to store a record of the current + * run and to access the history of previous runs. + */ + journal?: ICommandJournal; +} + +/** + * The setup options for Ignition + * + * @internal + */ +export interface IgnitionConstructorArgs { + /** + * An adapter that allows Ignition to communicate with external services + * like the target blockchain or local filesystem. + */ + services: Services; + + /** + * A UI update function that will be invoked with the current + * Ignition state on each major state change. + */ + uiRenderer: UpdateUiAction; + + /** + * A journal that will be used to store a record of the current + * run and to access the history of previous runs. + */ + journal: ICommandJournal; +} + /** * The entry point for deploying using _Ignition_. * * @internal */ -export class Ignition { +export class IgnitionImplementation implements Ignition { private _services: Services; private _uiRenderer: UpdateUiAction; private _journal: ICommandJournal; @@ -67,10 +115,10 @@ export class Ignition { uiRenderer = () => {}, journal = new NoopCommandJournal(), }: IgnitionCreationArgs) { - return new Ignition({ + return new IgnitionImplementation({ services: createServices(providers), - uiRenderer, - journal, + uiRenderer: uiRenderer as UpdateUiAction, + journal: journal as ICommandJournal, }); } diff --git a/packages/core/src/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts similarity index 97% rename from packages/core/src/dsl/DeploymentBuilder.ts rename to packages/core/src/internal/dsl/DeploymentBuilder.ts index e2172e978d..209ea7b1ca 100644 --- a/packages/core/src/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -20,15 +20,14 @@ import type { RequiredParameter, SendFuture, Virtual, -} from "../types/future"; -import type { Artifact } from "../types/hardhat"; -import type { Module, ModuleCache, ModuleDict } from "../types/module"; +} from "../../types/future"; +import type { Artifact } from "../../types/hardhat"; +import type { Module, ModuleDict } from "../../types/module"; import { BigNumber, ethers } from "ethers"; import hash from "object-hash"; -import { IgnitionError, IgnitionValidationError } from "../errors"; -import { addEdge, ensureVertex } from "../internal/graph/adjacencyList"; +import { IgnitionError, IgnitionValidationError } from "../../errors"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, @@ -44,7 +43,7 @@ import { ScopeData, SendVertex, VirtualVertex, -} from "../internal/types/deploymentGraph"; +} from "../../internal/types/deploymentGraph"; import { assertModuleReturnTypes, isArtifact, @@ -53,8 +52,8 @@ import { isDependable, isFuture, isParameter, -} from "../internal/utils/guards"; -import { resolveProxyDependency } from "../internal/utils/proxy"; +} from "../../internal/utils/guards"; +import { resolveProxyDependency } from "../../internal/utils/proxy"; import { AwaitOptions, CallOptions, @@ -63,7 +62,8 @@ import { InternalParamValue, SendOptions, UseModuleOptions, -} from "../types/dsl"; +} from "../../types/dsl"; +import { addEdge, ensureVertex } from "../graph/adjacencyList"; import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; @@ -72,6 +72,25 @@ interface ArtifactMap { [contractName: string]: Artifact; } +/** + * A module's data. + * + * @internal + */ +export interface ModuleData { + result: Virtual & ModuleDict; + optionsHash: string; +} + +/** + * A cache of modules. + * + * @internal + */ +export interface ModuleCache { + [label: string]: ModuleData; +} + type DeploymentApiPublicFunctions = | InstanceType["contract"] | InstanceType["library"] diff --git a/packages/core/src/dsl/DeploymentGraph.ts b/packages/core/src/internal/dsl/DeploymentGraph.ts similarity index 73% rename from packages/core/src/dsl/DeploymentGraph.ts rename to packages/core/src/internal/dsl/DeploymentGraph.ts index d1d04c4a57..6c53e17154 100644 --- a/packages/core/src/dsl/DeploymentGraph.ts +++ b/packages/core/src/internal/dsl/DeploymentGraph.ts @@ -1,8 +1,8 @@ -import { Graph } from "../internal/graph/Graph"; +import { Graph } from "../graph/Graph"; import { DeploymentGraphVertex as DeploymentGraphVertex, ScopeData, -} from "../internal/types/deploymentGraph"; +} from "../types/deploymentGraph"; export class DeploymentGraph extends Graph { public scopeData: { diff --git a/packages/core/src/dsl/ScopeStack.ts b/packages/core/src/internal/dsl/ScopeStack.ts similarity index 100% rename from packages/core/src/dsl/ScopeStack.ts rename to packages/core/src/internal/dsl/ScopeStack.ts diff --git a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts index 525defe4a8..ca5e878851 100644 --- a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts +++ b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts @@ -4,10 +4,10 @@ import type { IDeploymentGraph, } from "../types/deploymentGraph"; -import { DeploymentBuilder } from "../../dsl/DeploymentBuilder"; import { IgnitionError } from "../../errors"; import { Module, ModuleDict } from "../../types/module"; import { ProcessStepResult } from "../../types/process"; +import { DeploymentBuilder } from "../dsl/DeploymentBuilder"; import { assertModuleReturnTypes } from "../utils/guards"; import { processStepErrored, diff --git a/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts index 08fbeff67f..57ecfbe3aa 100644 --- a/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ b/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts @@ -1,4 +1,4 @@ -import { DeploymentGraph } from "../../../dsl/DeploymentGraph"; +import { DeploymentGraph } from "../../dsl/DeploymentGraph"; import { eliminate } from "../../graph/adjacencyList"; import { DeploymentGraphVertex } from "../../types/deploymentGraph"; diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts index 8824442233..6b89cfab73 100644 --- a/packages/core/src/internal/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -26,22 +26,6 @@ import { Artifact } from "../../types/hardhat"; export type UpdateUiAction = (deployState: DeployState) => void; export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; -/** - * The configuration options that control how on-chain execution will happen - * during the deploy. - * - * @internal - */ -export interface IgnitionDeployOptions { - txPollingInterval: number; - networkName: string; - maxRetries: number; - gasPriceIncrementPerRetry: BigNumber | null; - pollingInterval: number; - eventDuration: number; - force: boolean; -} - /** * The possible deployment states. * diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index aece6bc243..f86c4f9047 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -278,7 +278,3 @@ export type DeploymentGraphFuture = | DependableFuture | ParameterFuture | EventParamFuture; - -export interface FutureDict { - [key: string]: DeploymentGraphFuture; -} diff --git a/packages/core/src/types/ignition.ts b/packages/core/src/types/ignition.ts index 884588630b..3d80940c7a 100644 --- a/packages/core/src/types/ignition.ts +++ b/packages/core/src/types/ignition.ts @@ -1,55 +1,79 @@ -import { UpdateUiAction } from "../internal/types/deployment"; -import { ICommandJournal } from "../internal/types/journal"; -import { Services } from "../internal/types/services"; +import { BigNumber } from "ethers"; -import { Providers } from "./providers"; +import { Module, ModuleDict } from "./module"; +import { IgnitionPlan } from "./plan"; /** - * The setup options for the Ignition. + * The type of the CommandJournal that Ignition uses. * - * @internal + * @alpha */ -export interface IgnitionCreationArgs { - /** - * The adapters that allows Ignition to communicate with external systems - * like the target blockchain or local filesystem. - */ - providers: Providers; +export type ICommandJournalT = unknown; - /** - * An optional UI update function that will be invoked with the current - * Ignition state on each major state change. - */ - uiRenderer?: UpdateUiAction; +/** + * The type of a callback to update the UI. + * + * @alpha + */ +export type UpdateUiActionT = unknown; - /** - * An optional journal that will be used to store a record of the current - * run and to access the history of previous runs. - */ - journal?: ICommandJournal; +/** + * The configuration options that control how on-chain execution will happen + * during the deploy. + * + * @alpha + */ +export interface IgnitionDeployOptions { + txPollingInterval: number; + networkName: string; + maxRetries: number; + gasPriceIncrementPerRetry: BigNumber | null; + pollingInterval: number; + eventDuration: number; + force: boolean; } /** - * The setup options for Ignition + * The result of a deployment operation. * - * @internal + * @alpha */ -export interface IgnitionConstructorArgs { - /** - * An adapter that allows Ignition to communicate with external services - * like the target blockchain or local filesystem. - */ - services: Services; +export type DeploymentResultT = // eslint-disable-line @typescript-eslint/no-unused-vars + unknown; +/** + * Ignition's main interface. + * + * @alpha + */ +export interface Ignition { /** - * A UI update function that will be invoked with the current - * Ignition state on each major state change. + * Run a deployment based on a given Ignition module on-chain, + * leveraging any configured journal to record. + * + * @param ignitionModule - An Ignition module + * @param options - Configuration options + * @returns A struct indicating whether the deployment was + * a success, failure or hold. A successful result will + * include the addresses of the deployed contracts. + * + * @alpha */ - uiRenderer: UpdateUiAction; + deploy( + ignitionModule: Module, + options: IgnitionDeployOptions + ): Promise>; /** - * A journal that will be used to store a record of the current - * run and to access the history of previous runs. + * Construct a plan (or dry run) describing how a deployment will be executed + * for the given module. + * + * @param deploymentModule - The Ignition module to be deployed + * @returns The deployment details as a plan + * + * @alpha */ - journal: ICommandJournal; + plan( + deploymentModule: Module + ): Promise; } diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 43d96e84a6..dd92985522 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -38,19 +38,10 @@ export interface Module { action: (builder: IDeploymentBuilder) => T; } -export interface ModuleData { - result: Virtual & ModuleDict; - optionsHash: string; -} - -export interface ModuleCache { - [label: string]: ModuleData; -} - /** * A mapping of parameter labels to allowed values or futures. * - * @internal + * @alpha */ export interface ModuleParams { [key: string]: ExternalParamValue; diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts index 93bbc1c21e..e1a5612f15 100644 --- a/packages/core/src/types/plan.ts +++ b/packages/core/src/types/plan.ts @@ -1,12 +1,6 @@ -import { IDeploymentGraph } from "../internal/types/deploymentGraph"; -import { IExecutionGraph } from "../internal/types/executionGraph"; - /** - * The planned deployment. + * The planned deployment, including a summary of its current status. * - * @internal + * @alpha */ -export interface IgnitionPlan { - deploymentGraph: IDeploymentGraph; - executionGraph: IExecutionGraph; -} +export type IgnitionPlan = unknown; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 262af66970..56be5bd63e 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -9,7 +9,7 @@ import { ModuleParams } from "./module"; * The low level adapters that allow Ignition to interact with external services * like the target chain or the local filesystem. * - * @internal + * @alpha */ export interface Providers { artifacts: ArtifactsProvider; @@ -23,7 +23,7 @@ export interface Providers { /** * Provide access to contract artifacts based on a label. * - * @internal + * @alpha */ export interface ArtifactsProvider { getArtifact: (name: string) => Promise; @@ -34,7 +34,7 @@ export interface ArtifactsProvider { /** * Provide access to the target Ethereum chain via requests. * - * @internal + * @alpha */ export interface EIP1193Provider { request: (args: { method: string; params?: unknown[] }) => Promise; @@ -43,7 +43,7 @@ export interface EIP1193Provider { /** * Provide access to Ethereum gas information for the target chain. * - * @internal + * @alpha */ export interface GasProvider { estimateGasLimit: ( @@ -55,7 +55,7 @@ export interface GasProvider { /** * Provide access to transaction information for the target chain. * - * @internal + * @alpha */ export interface TransactionsProvider { isConfirmed(txHash: string): Promise; @@ -65,14 +65,14 @@ export interface TransactionsProvider { /** * Allowed error codes for a parameter lookup. * - * @internal + * @alpha */ export type HasParamErrorCode = "no-params" | "param-missing"; /** * The results of a parameter look up. * - * @internal + * @alpha */ export type HasParamResult = | { @@ -84,7 +84,7 @@ export type HasParamResult = /** * Provide access to configuration options for Ignition execution. * - * @internal + * @alpha */ export interface ConfigProvider { parameters: ModuleParams | undefined; @@ -100,7 +100,7 @@ export interface ConfigProvider { * Provide a set of usable Ethereum accounts that can be made available within * the Module api. * - * @internal + * @alpha */ export interface AccountsProvider { getAccounts(): Promise; diff --git a/packages/core/test/buildModule.ts b/packages/core/test/buildModule.ts index 930154d34c..26b7b6362c 100644 --- a/packages/core/test/buildModule.ts +++ b/packages/core/test/buildModule.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../src/dsl/buildModule"; +import { buildModule } from "../src/buildModule"; describe("buildModule", () => { const values = [ diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts index 9be226351b..a633bd6083 100644 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ b/packages/core/test/deploymentBuilder/accounts.ts @@ -4,7 +4,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; import { isFailure } from "../../src/internal/utils/process-results"; diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts index 33f6a9073f..06ff63fd85 100644 --- a/packages/core/test/deploymentBuilder/artifacts.ts +++ b/packages/core/test/deploymentBuilder/artifacts.ts @@ -3,7 +3,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract } from "../../src/internal/utils/guards"; diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts index 5d3485839e..7170de2634 100644 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ b/packages/core/test/deploymentBuilder/buildModule.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { ProcessResultKind } from "../../src/types/process"; diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index a947e257ac..6d4a50b78b 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 181804474c..7a3cd04a32 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -3,7 +3,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract, diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 17181eab33..1bfe6bed10 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { diff --git a/packages/core/test/deploymentBuilder/helpers.ts b/packages/core/test/deploymentBuilder/helpers.ts index 10dcc06405..5ff2c7f0a2 100644 --- a/packages/core/test/deploymentBuilder/helpers.ts +++ b/packages/core/test/deploymentBuilder/helpers.ts @@ -1,4 +1,4 @@ -import { DeploymentGraph } from "../../src/dsl/DeploymentGraph"; +import { DeploymentGraph } from "../../src/internal/dsl/DeploymentGraph"; import { getDependenciesFor } from "../../src/internal/graph/adjacencyList"; import { DeploymentGraphVertex } from "../../src/internal/types/deploymentGraph"; import { VertexDescriptor } from "../../src/internal/types/graph"; diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts index e5b5cc4b80..bf0f81fb41 100644 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ b/packages/core/test/deploymentBuilder/libraries.ts @@ -3,7 +3,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isHardhatContract, diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts index 8ef70feab3..943e05e194 100644 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ b/packages/core/test/deploymentBuilder/metadata.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentBuilder } from "../../src/types/dsl"; diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 63d3468ba6..9aa95b31ae 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -3,7 +3,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isCallable } from "../../src/internal/utils/guards"; diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts index 7c4b1f2bae..8ef9b958d3 100644 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ b/packages/core/test/deploymentBuilder/sendETH.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; import { isHardhatContract } from "../../src/internal/utils/guards"; diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index dcc80a6763..31ef3ac011 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -3,7 +3,7 @@ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph" import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isFailure } from "../../src/internal/utils/process-results"; diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index 4ba8b539b7..e504244971 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -5,7 +5,7 @@ import type { Artifact } from "../../src/types/hardhat"; import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; import { isArtifactContract, diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index 4db006c327..c43b3cd049 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -3,9 +3,9 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { Ignition } from "../../src/Ignition"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; +import { IgnitionImplementation } from "../../src/internal/Ignition"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { DeploymentResultState } from "../../src/internal/types/deployment"; import { Artifact } from "../../src/types/hardhat"; @@ -51,7 +51,7 @@ describe("Rerunning execution", () => { describe("when a deployment is already complete", () => { let sentTransactionCount: number; - let ignition: Ignition; + let ignition: IgnitionImplementation; let myModule: any; beforeEach(() => { @@ -168,7 +168,7 @@ describe("Rerunning execution", () => { describe("when a deployment is on hold", () => { let sentTransactionCount: number; let eventQueryCount: number; - let ignition: Ignition; + let ignition: IgnitionImplementation; let myModule: any; beforeEach(() => { @@ -322,7 +322,7 @@ describe("Rerunning execution", () => { describe("when a deployment fails", () => { let sentTransactionCount: number; - let ignition: Ignition; + let ignition: IgnitionImplementation; let myModule: any; beforeEach(() => { diff --git a/packages/core/test/helpers/setupIgnitionWith.ts b/packages/core/test/helpers/setupIgnitionWith.ts index 1512b38a07..4b7161a323 100644 --- a/packages/core/test/helpers/setupIgnitionWith.ts +++ b/packages/core/test/helpers/setupIgnitionWith.ts @@ -1,9 +1,9 @@ -import { ICommandJournal } from "../../src"; -import { Ignition } from "../../src/Ignition"; +import { IgnitionImplementation } from "../../src/internal/Ignition"; import { NoopCommandJournal } from "../../src/internal/journal/NoopCommandJournal"; +import { ICommandJournal } from "../../src/internal/types/journal"; import { Services } from "../../src/internal/types/services"; -class TestIgnition extends Ignition { +class TestIgnition extends IgnitionImplementation { constructor({ services, journal = new NoopCommandJournal(), diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts index 4162c05f41..3ff715440c 100644 --- a/packages/core/test/options.ts +++ b/packages/core/test/options.ts @@ -4,7 +4,10 @@ import { assert } from "chai"; import { BigNumber, ethers } from "ethers"; import { buildModule, Ignition } from "../src"; -import { DeploymentResultState } from "../src/internal/types/deployment"; +import { + DeploymentResult, + DeploymentResultState, +} from "../src/internal/types/deployment"; import { Artifact } from "../src/types/hardhat"; import { getMockServices } from "./helpers"; @@ -104,7 +107,7 @@ describe("deploy options", () => { return {}; }); - const result = await ignition.deploy(module, { + const result = (await ignition.deploy(module, { maxRetries: 1, gasPriceIncrementPerRetry: BigNumber.from(1000), pollingInterval: 4, @@ -112,7 +115,7 @@ describe("deploy options", () => { networkName: "test-network", force: false, txPollingInterval: 4, - }); + })) as DeploymentResult; assert.equal(result._kind, DeploymentResultState.SUCCESS); }); diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts index ba31a09c8b..768743a2c1 100644 --- a/packages/core/test/state-reducer/execution.ts +++ b/packages/core/test/state-reducer/execution.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { deployStateReducer, initializeDeployState, diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts index 0aa4591574..4b432f83e7 100644 --- a/packages/core/test/state-reducer/preparation-steps.ts +++ b/packages/core/test/state-reducer/preparation-steps.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { buildModule } from "../../src/dsl/buildModule"; +import { buildModule } from "../../src/buildModule"; import { deployStateReducer, initializeDeployState, diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index b31e9d85d6..0e0a36f78a 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { ethers } from "ethers"; -import { buildModule } from "../src/dsl/buildModule"; +import { buildModule } from "../src/buildModule"; import { IgnitionValidationError } from "../src/errors"; import { generateDeploymentGraphFrom } from "../src/internal/process/generateDeploymentGraphFrom"; import { ResultsAccumulator } from "../src/internal/types/graph"; From 7eaa408ad743a120416a6f2fede8411f5ce49d09 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 7 Apr 2023 18:10:25 -0300 Subject: [PATCH 0290/1302] Test that IgnitionImplementation exactly implements Ignition --- packages/core/test/helpers/exact-interface.ts | 15 +++++++++++++++ packages/core/test/internal/Ignition.ts | 11 +++++++++++ 2 files changed, 26 insertions(+) create mode 100644 packages/core/test/helpers/exact-interface.ts create mode 100644 packages/core/test/internal/Ignition.ts diff --git a/packages/core/test/helpers/exact-interface.ts b/packages/core/test/helpers/exact-interface.ts new file mode 100644 index 0000000000..a7381f264e --- /dev/null +++ b/packages/core/test/helpers/exact-interface.ts @@ -0,0 +1,15 @@ +export type ForbiddenExcessProperties = { + [P in K]: never; +}; + +// This is a helper that can be used to test that a class implements an interface +// and doesn't expose any extra public property. +// It's used like this: +// const implementation: ExactInterface = new Implementation(); +// If the interface is not implemented, or extra properties are exposed, it will result in a +// type error. +export type ExactInterface< + InterfaceT, + ImplementationT extends InterfaceT +> = ImplementationT & + ForbiddenExcessProperties>; diff --git a/packages/core/test/internal/Ignition.ts b/packages/core/test/internal/Ignition.ts new file mode 100644 index 0000000000..32d31cd2e9 --- /dev/null +++ b/packages/core/test/internal/Ignition.ts @@ -0,0 +1,11 @@ +import { Ignition } from "../../src"; +import { IgnitionImplementation } from "../../src/internal/Ignition"; +import { ExactInterface } from "../helpers/exact-interface"; +import { getMockProviders } from "../helpers/getMockProviders"; + +describe("IgnitionImplementation", function () { + it("Shouldn't have any property apart from the ones defined in the Ignition interface", function () { + const _implementation: ExactInterface = + IgnitionImplementation.create({ providers: getMockProviders() }); + }); +}); From bfa6371693403bcd24eafe00510d521ac435eb07 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 7 Apr 2023 18:10:54 -0300 Subject: [PATCH 0291/1302] Remove `/errors` from the package.json#exports --- packages/core/package.json | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 6546f80380..1a0dacbefe 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,16 +22,12 @@ "types": "./dist/src/index.d.ts", "exports": { ".": "./dist/src/index.js", - "./helpers": "./dist/src/helpers.js", - "./errors": "./dist/src/errors.js" + "./helpers": "./dist/src/helpers.js" }, "typesVersions": { "*": { "helpers": [ "./dist/src/helpers" - ], - "errors": [ - "./dist/src/errors" ] } }, From dcc9d0f63eb21fd9426ee2b22da63803c1041af6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 7 Apr 2023 18:48:06 -0300 Subject: [PATCH 0292/1302] Adapt the plugin by temporarily exposing some internal types --- packages/core/package.json | 6 +++- packages/core/src/soon-to-be-removed.ts | 36 +++++++++++++++++++ packages/hardhat-plugin/src/CommandJournal.ts | 4 +-- packages/hardhat-plugin/src/ConfigWrapper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 23 +++++++----- packages/hardhat-plugin/src/load-module.ts | 3 +- packages/hardhat-plugin/src/plan/index.ts | 15 ++++---- packages/hardhat-plugin/src/plan/utils.ts | 8 ++--- .../components/ReconciliationFailedPanel.tsx | 2 +- .../ui/components/UnexpectedErrorPanel.tsx | 2 +- .../ui/components/ValidationFailedPanel.tsx | 4 +-- .../components/execution/AddressResults.tsx | 5 ++- .../components/execution/BatchExecution.tsx | 4 +-- .../components/execution/ExecutionPanel.tsx | 3 +- .../ui/components/execution/FinalStatus.tsx | 4 +-- .../components/execution/SummarySection.tsx | 3 +- .../src/ui/components/execution/views.ts | 2 +- .../src/ui/components/index.tsx | 3 +- .../hardhat-plugin/src/ui/renderToCli.tsx | 5 ++- packages/hardhat-plugin/src/ui/types.ts | 2 +- .../hardhat-plugin/test/CommandJournal.ts | 2 +- 21 files changed, 95 insertions(+), 43 deletions(-) create mode 100644 packages/core/src/soon-to-be-removed.ts diff --git a/packages/core/package.json b/packages/core/package.json index 1a0dacbefe..047a39a12a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,12 +22,16 @@ "types": "./dist/src/index.d.ts", "exports": { ".": "./dist/src/index.js", - "./helpers": "./dist/src/helpers.js" + "./helpers": "./dist/src/helpers.js", + "./soon-to-be-removed": "./dist/src/soon-to-be-removed.js" }, "typesVersions": { "*": { "helpers": [ "./dist/src/helpers" + ], + "soon-to-be-removed": [ + "./dist/src/soon-to-be-removed" ] } }, diff --git a/packages/core/src/soon-to-be-removed.ts b/packages/core/src/soon-to-be-removed.ts new file mode 100644 index 0000000000..a2b5a5bdaf --- /dev/null +++ b/packages/core/src/soon-to-be-removed.ts @@ -0,0 +1,36 @@ +// WARNING: Do not import anything from here. These things are meant to be +// internal or replaced soon, and will be removed from the public API ASAP. +// Consider yourself warned. + +import { IDeploymentGraph } from "./internal/types/deploymentGraph"; +import { IExecutionGraph } from "./internal/types/executionGraph"; + +export { + DeploymentResultState, + DeploymentResult, + DeployStateExecutionCommand, + DeployState, + DeployPhase, + UpdateUiAction, +} from "./internal/types/deployment"; +export { + DeploymentGraphVertex, + IDeploymentGraph, +} from "./internal/types/deploymentGraph"; +export { + ExecutionVertex, + ExecutionVertexType, + IExecutionGraph, +} from "./internal/types/executionGraph"; +export { + VertexResultEnum, + VertexVisitResultFailure, + VertexDescriptor, + VertexGraph, +} from "./internal/types/graph"; +export { ICommandJournal } from "./internal/types/journal"; + +export interface LegacyIgnitionPlan { + deploymentGraph: IDeploymentGraph; + executionGraph: IExecutionGraph; +} diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts index 831a404ec8..69fef6e241 100644 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -1,8 +1,8 @@ +import { serializeReplacer } from "@ignored/ignition-core/helpers"; import { DeployStateExecutionCommand, ICommandJournal, -} from "@ignored/ignition-core"; -import { serializeReplacer } from "@ignored/ignition-core/helpers"; +} from "@ignored/ignition-core/soon-to-be-removed"; import { BigNumber } from "ethers"; import fs from "fs"; import ndjson from "ndjson"; diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts index dd65135e31..00dce98798 100644 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ b/packages/hardhat-plugin/src/ConfigWrapper.ts @@ -3,8 +3,8 @@ import { ExternalParamValue, HasParamResult, ModuleParams, + IgnitionError, } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/errors"; export class ConfigWrapper implements ConfigProvider { public parameters: ModuleParams | undefined; diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index ce6cc220f0..4be7af8cb3 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -1,17 +1,20 @@ import type { Contract } from "ethers"; import { - DeploymentResultState, - ICommandJournal, - Ignition, IgnitionDeployOptions, + IgnitionError, + initializeIgnition, Module, ModuleDict, ModuleParams, Providers, SerializedDeploymentResult, } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/errors"; +import { + ICommandJournal, + DeploymentResult, + DeploymentResultState, +} from "@ignored/ignition-core/soon-to-be-removed"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { CommandJournal } from "./CommandJournal"; @@ -68,7 +71,7 @@ export class IgnitionWrapper { ? new CommandJournal(chainId, deployParams?.journalPath) : undefined); - const ignition = Ignition.create({ + const ignition = initializeIgnition({ providers: this._providers, uiRenderer: showUi ? renderToCli(initializeRenderState(), deployParams?.parameters) @@ -80,10 +83,10 @@ export class IgnitionWrapper { await this._providers.config.setParams(deployParams.parameters); } - const deploymentResult = await ignition.deploy(ignitionModule, { + const deploymentResult = (await ignition.deploy(ignitionModule, { ...this.options, force, - }); + })) as DeploymentResult; if (deploymentResult._kind === DeploymentResultState.HOLD) { const heldVertexes = deploymentResult.holds; @@ -115,7 +118,9 @@ export class IgnitionWrapper { ); } - return this._toDeploymentResult(deploymentResult.result); + return this._toDeploymentResult( + deploymentResult.result as any // TODO: This `as any` should be removed once we have a proper type for the result of deploy + ); } /** @@ -127,7 +132,7 @@ export class IgnitionWrapper { * execution dependency graph. */ public async plan(ignitionModule: Module) { - const ignition = Ignition.create({ + const ignition = initializeIgnition({ providers: this._providers, }); diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index c94c26b081..f2823e5c3c 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,5 +1,4 @@ -import { Module, ModuleDict } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/errors"; +import { Module, ModuleDict, IgnitionError } from "@ignored/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts index 71c19756f5..95549192ef 100644 --- a/packages/hardhat-plugin/src/plan/index.ts +++ b/packages/hardhat-plugin/src/plan/index.ts @@ -1,5 +1,6 @@ import type { IgnitionPlan } from "@ignored/ignition-core"; +import { LegacyIgnitionPlan } from "@ignored/ignition-core/soon-to-be-removed"; import { exec } from "child_process"; import { ethers } from "ethers"; import fs from "fs-extra"; @@ -38,12 +39,14 @@ const regex = /%(\w+)%/g; export class Renderer { private _templates: LoadedTemplates = {}; + private _plan: LegacyIgnitionPlan; constructor( public moduleName: string, - public plan: IgnitionPlan, + plan: IgnitionPlan, public config: RendererConfig ) { + this._plan = plan as LegacyIgnitionPlan; // ensure `plan` file structure once on construction // so we don't have to before every write function later this._ensureDirectoryStructure(); @@ -61,8 +64,8 @@ export class Renderer { // summary const networkName = this.config.network.name; const networkId = this.config.network.id as string; - const txTotal = utils.getTxTotal(this.plan.deploymentGraph); - const summaryLists = utils.getSummaryLists(this.plan.deploymentGraph); + const txTotal = utils.getTxTotal(this._plan.deploymentGraph); + const summaryLists = utils.getSummaryLists(this._plan.deploymentGraph); const summary = this._templates.summary.replace( regex, utils.replacer({ networkName, networkId, txTotal, summaryLists }) @@ -70,9 +73,9 @@ export class Renderer { // plan const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid(this.plan.deploymentGraph) + utils.graphToMermaid(this._plan.deploymentGraph) ); - const actions = utils.getActions(this.plan.deploymentGraph); + const actions = utils.getActions(this._plan.deploymentGraph); const plan = this._templates.plan.replace( regex, utils.replacer({ mermaid, actions }) @@ -86,7 +89,7 @@ export class Renderer { this._writeMainHTML(mainOutput); - for (const vertex of this.plan.deploymentGraph.vertexes.values()) { + for (const vertex of this._plan.deploymentGraph.vertexes.values()) { const type = utils.parseType(vertex); const typeText = utils.toTypeText(type); const label = vertex.label; diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index b6f37af801..b6962ec13e 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -1,8 +1,8 @@ -import type { - VertexGraph, - VertexDescriptor, +import { DeploymentGraphVertex, -} from "@ignored/ignition-core"; + VertexDescriptor, + VertexGraph, +} from "@ignored/ignition-core/soon-to-be-removed"; type DisplayType = | "deploy-contract" diff --git a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx index 1135722752..52d75665f0 100644 --- a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text } from "ink"; export const ReconciliationFailedPanel = ({ diff --git a/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx b/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx index fb7fcb7abb..841466986a 100644 --- a/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text } from "ink"; export const UnexpectedErrorPanel = ({ diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx index da0e4cbcb7..30d7b19527 100644 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx @@ -1,5 +1,5 @@ -import { DeployState } from "@ignored/ignition-core"; -import { IgnitionValidationError } from "@ignored/ignition-core/errors"; +import { IgnitionValidationError } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text } from "ink"; import { relative } from "path"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 571af0ba6d..e98bd9692a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,5 +1,8 @@ -import { DeployState, VertexResultEnum } from "@ignored/ignition-core"; import { viewExecutionResults } from "@ignored/ignition-core/helpers"; +import { + DeployState, + VertexResultEnum, +} from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Spacer, Text } from "ink"; import { AddressMap } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx index 044c363e53..261201f3df 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx @@ -1,5 +1,5 @@ -import { DeployState } from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/errors"; +import { IgnitionError } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text } from "ink"; import Spinner from "ink-spinner"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 66ab7380ec..177f7609d9 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -1,5 +1,6 @@ -import type { DeployState, ModuleParams } from "@ignored/ignition-core"; +import type { ModuleParams } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box } from "ink"; import { BatchExecution } from "./BatchExecution"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index 12a37dbb78..bdddb04b62 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,9 +1,9 @@ +import { viewExecutionResults } from "@ignored/ignition-core/helpers"; import { DeployState, ExecutionVertex, VertexResultEnum, -} from "@ignored/ignition-core"; -import { viewExecutionResults } from "@ignored/ignition-core/helpers"; +} from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text } from "ink"; import { DeploymentError, DeploymentHold } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 24e8818333..d6e7214b2c 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,4 +1,5 @@ -import { DeployState, ModuleParams } from "@ignored/ignition-core"; +import { ModuleParams } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { Box, Text, Spacer } from "ink"; import { ModuleParameters } from "./ModuleParameters"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/views.ts b/packages/hardhat-plugin/src/ui/components/execution/views.ts index 164c3a1beb..f1b6dca174 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/views.ts +++ b/packages/hardhat-plugin/src/ui/components/execution/views.ts @@ -1,4 +1,4 @@ -import { DeployState } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; /** * Determine whether any on-chain executions happened in this diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index 565a2c24fb..b2487c9a91 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,4 +1,5 @@ -import { DeployState, ModuleParams } from "@ignored/ignition-core"; +import { ModuleParams } from "@ignored/ignition-core"; +import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; import { ReconciliationFailedPanel } from "./ReconciliationFailedPanel"; import { StartingPanel } from "./StartingPanel"; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx index d558633f0c..69abfdbdf0 100644 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ b/packages/hardhat-plugin/src/ui/renderToCli.tsx @@ -1,9 +1,8 @@ +import { ModuleParams, IgnitionError } from "@ignored/ignition-core"; import { DeployState, - ModuleParams, UpdateUiAction, -} from "@ignored/ignition-core"; -import { IgnitionError } from "@ignored/ignition-core/errors"; +} from "@ignored/ignition-core/soon-to-be-removed"; import { render } from "ink"; import { IgnitionUi } from "./components"; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 63a71d5163..04c9336789 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -3,7 +3,7 @@ import { ExecutionVertex, ExecutionVertexType, VertexVisitResultFailure, -} from "@ignored/ignition-core"; +} from "@ignored/ignition-core/soon-to-be-removed"; enum VertexStatusState { SUCCESS = "success", diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 7cbab24e56..67befce41c 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ -import { DeployStateExecutionCommand } from "@ignored/ignition-core"; import { VertexResultEnum } from "@ignored/ignition-core/helpers"; +import { DeployStateExecutionCommand } from "@ignored/ignition-core/soon-to-be-removed"; import { assert } from "chai"; import { BigNumber } from "ethers"; import fs from "fs"; From 68b0f644f5af0cbebb08303b11501393e9b47ded Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 17 Apr 2023 06:20:23 -0400 Subject: [PATCH 0293/1302] hardhat task for listing ignition deployments (#183) * ink layout for dummy data * updated ui for new design * implementation for `ignition-info` task * use chainId to networkName mapping everywhere * fix for protected ignition constructor * restructured `journalData` * narrow core public api * add docs for `ignition-info` command * add doc tags for info types * updating new features to comply with changes to types API --- docs/getting-started-guide.md | 22 +++- packages/core/src/index.ts | 1 + packages/core/src/internal/Ignition.ts | 101 +++++++++++++++++- .../src/internal/deployment/Deployment.ts | 4 +- .../internal/journal/NoopCommandJournal.ts | 8 ++ packages/core/src/internal/types/journal.ts | 5 + .../core/src/internal/utils/networkNames.ts | 36 +++++++ packages/core/src/types/ignition.ts | 11 ++ packages/core/src/types/info.ts | 31 ++++++ packages/core/test/execution/batching.ts | 1 + packages/core/test/execution/dispatch.ts | 2 + .../core/test/util/MemoryCommandJournal.ts | 13 +++ packages/hardhat-plugin/src/CommandJournal.ts | 34 ++++++ .../hardhat-plugin/src/ignition-wrapper.ts | 11 ++ packages/hardhat-plugin/src/index.ts | 29 ++++- .../ui/components/info/ModuleInfoPanel.tsx | 82 ++++++++++++++ .../src/ui/components/info/index.tsx | 21 ++++ 17 files changed, 406 insertions(+), 6 deletions(-) create mode 100644 packages/core/src/internal/utils/networkNames.ts create mode 100644 packages/core/src/types/info.ts create mode 100644 packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx create mode 100644 packages/hardhat-plugin/src/ui/components/info/index.tsx diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index e90786cafc..261a01c18a 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -5,8 +5,9 @@ ### Table of Contents - [Setup](./getting-started-guide.md#setup) -- [Writing Your First Deployment Module](./getting-started-guide.md#writing-your-first-deployment-module) +- [Writing your first deployment module](./getting-started-guide.md#writing-your-first-deployment-module) - [Deploying the module](./getting-started-guide.md#deploying-the-module) +- [Getting info about previous deployments](./getting-started-guide.md#getting-info-about-previous-deployments) - [Using the module within **Hardhat** tests](./getting-started-guide.md#using-the-module-within-hardhat-tests) --- @@ -115,7 +116,24 @@ npx hardhat node npx hardhat deploy --network localhost LockModule ``` -### Using the Module within Hardhat Tests +### Getting Info About Previous Deployments + +Run the `ignition-info` task to display info about your successfully deployed contracts (non-ephemeral nodes only): + +```bash +npx hardhat ignition-info LockModule + +# example output: + LockModule + ___________ + + hardhat (31337) + ------- + + Lock   deployed   0x5FbDB2315678afecb367f032d93F642f64180aa3 +``` + +### Using the Module Within Hardhat Tests Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide the `./test/Lock.js` test file can be leverage **Ignition** by updating the `deployOneYearLockFixture` fixture: diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e221db4cdd..9f37c2fc8d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -6,6 +6,7 @@ export * from "./types/future"; export * from "./types/future"; export * from "./types/hardhat"; export * from "./types/ignition"; +export * from "./types/info"; export * from "./types/module"; export * from "./types/plan"; export * from "./types/providers"; diff --git a/packages/core/src/internal/Ignition.ts b/packages/core/src/internal/Ignition.ts index a8f6b0013c..ae4c3899a8 100644 --- a/packages/core/src/internal/Ignition.ts +++ b/packages/core/src/internal/Ignition.ts @@ -1,3 +1,8 @@ +import type { + ModuleInfoData, + NetworkInfoData, + ContractInfoData, +} from "../types/info"; import type { Module, ModuleDict } from "../types/module"; import type { IgnitionPlan } from "../types/plan"; import type { @@ -22,6 +27,7 @@ import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFr import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; import { createServices } from "./services/createServices"; import { + DeployStateExecutionCommand, DeploymentResult, DeploymentResultState, UpdateUiAction, @@ -33,6 +39,7 @@ import { } from "./types/executionGraph"; import { VertexResultEnum, VisitResultState } from "./types/graph"; import { Services } from "./types/services"; +import { networkNameByChainId } from "./utils/networkNames"; import { isFailure, processStepFailed, @@ -176,7 +183,7 @@ export class IgnitionImplementation implements Ignition { accounts, chainId, artifacts, - networkName: options.networkName, + networkName: networkNameByChainId[chainId] ?? "unknown", force: options.force, }); @@ -300,7 +307,97 @@ export class IgnitionImplementation implements Ignition { const { executionGraph } = transformResult.result; - return { deploymentGraph, executionGraph }; + return { + deploymentGraph, + executionGraph, + networkName: networkNameByChainId[chainId] ?? "unknown", + }; + } + + /** + * Retrieve information about the given deployed module + * + * @param moduleName - The name of the Ignition module to retrieve data about + * @returns The addresses of the deployed contracts across any relevant networks + * + * @internal + */ + public async info(moduleName: string): Promise { + log(`Start info`); + + const journalData: { + [networkTag: string]: Array< + DeployStateExecutionCommand & { chainId: number } + >; + } = {}; + for await (const command of this._journal.readAll()) { + const network = networkNameByChainId[command.chainId] ?? "unknown"; + const networkTag = `${network}:${command.chainId}`; + + if (journalData[networkTag] === undefined) { + journalData[networkTag] = []; + } + + journalData[networkTag].push(command); + } + + const deployments: Deployment[] = []; + for (const [networkTag, commands] of Object.entries(journalData)) { + const deployment = new Deployment( + moduleName, + this._services, + this._journal + ); + + const [networkName, chainId] = networkTag.split(":"); + await deployment.setDeploymentDetails({ + networkName, + chainId: +chainId, + }); + + await deployment.load(commands); + + deployments.push(deployment); + } + + const moduleInfoData: { [moduleName: string]: ModuleInfoData } = {}; + for (const deployment of deployments) { + const { + networkName, + chainId, + moduleName: deploymentName, + } = deployment.state.details; + + const contracts: ContractInfoData[] = []; + for (const vertex of Object.values(deployment.state.execution.vertexes)) { + if ( + vertex.status === "COMPLETED" && + "bytecode" in vertex.result.result && + "value" in vertex.result.result + ) { + contracts.push({ + contractName: vertex.result.result.name, + status: "deployed", + address: vertex.result.result.address, + }); + } + } + + if (contracts.length > 0) { + const networkInfo: NetworkInfoData = { + networkName, + chainId, + contracts, + }; + moduleInfoData[deploymentName] ??= { + moduleName: deploymentName, + networks: [], + }; + moduleInfoData[deploymentName].networks.push(networkInfo); + } + } + + return Object.values(moduleInfoData); } private async _constructExecutionGraphFrom( diff --git a/packages/core/src/internal/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts index eaa5207ba4..eeed724330 100644 --- a/packages/core/src/internal/deployment/Deployment.ts +++ b/packages/core/src/internal/deployment/Deployment.ts @@ -46,7 +46,9 @@ export class Deployment { } public async load( - commandStream: AsyncGenerator + commandStream: + | AsyncGenerator + | DeployStateExecutionCommand[] ) { log("Loading from journal"); diff --git a/packages/core/src/internal/journal/NoopCommandJournal.ts b/packages/core/src/internal/journal/NoopCommandJournal.ts index 420361d768..e59182a060 100644 --- a/packages/core/src/internal/journal/NoopCommandJournal.ts +++ b/packages/core/src/internal/journal/NoopCommandJournal.ts @@ -9,6 +9,14 @@ export class NoopCommandJournal implements ICommandJournal { public read(): AsyncGenerator { return fakeRead(); } + + public readAll(): AsyncGenerator< + DeployStateExecutionCommand & { chainId: number }, + void, + unknown + > { + return fakeRead(); + } } async function* fakeRead() { diff --git a/packages/core/src/internal/types/journal.ts b/packages/core/src/internal/types/journal.ts index 83fd548e00..b050cec752 100644 --- a/packages/core/src/internal/types/journal.ts +++ b/packages/core/src/internal/types/journal.ts @@ -49,4 +49,9 @@ export interface ICommandJournal { * Read out the stored deployment update commands. */ read(): AsyncGenerator; + readAll(): AsyncGenerator< + DeployStateExecutionCommand & { chainId: number }, + void, + unknown + >; } diff --git a/packages/core/src/internal/utils/networkNames.ts b/packages/core/src/internal/utils/networkNames.ts new file mode 100644 index 0000000000..74d6e7a174 --- /dev/null +++ b/packages/core/src/internal/utils/networkNames.ts @@ -0,0 +1,36 @@ +type NetworkNamesMap = Record; + +export const networkNameByChainId: NetworkNamesMap = { + 1: "mainnet", + 3: "ropsten", + 4: "rinkeby", + 5: "goerli", + 42: "kovan", + 11155111: "sepolia", + 56: "bsc", + 97: "bscTestnet", + 128: "heco", + 256: "hecoTestnet", + 250: "opera", + 4002: "ftmTestnet", + 10: "optimisticEthereum", + 420: "optimisticGoerli", + 137: "polygon", + 80001: "polygonMumbai", + 42161: "arbitrumOne", + 421613: "arbitrumGoerli", + 421611: "arbitrumTestnet", + 43114: "avalanche", + 43113: "avalancheFujiTestnet", + 1284: "moonbeam", + 1285: "moonriver", + 1287: "moonbaseAlpha", + 100: "gnosis", + 10200: "chiado", + 77: "sokol", + 1313161554: "aurora", + 1313161555: "auroraTestnet", + 1666600000: "harmony", + 1666700000: "harmonyTest", + 31337: "hardhat", +}; diff --git a/packages/core/src/types/ignition.ts b/packages/core/src/types/ignition.ts index 3d80940c7a..d11eea3cee 100644 --- a/packages/core/src/types/ignition.ts +++ b/packages/core/src/types/ignition.ts @@ -1,5 +1,6 @@ import { BigNumber } from "ethers"; +import { ModuleInfoData } from "./info"; import { Module, ModuleDict } from "./module"; import { IgnitionPlan } from "./plan"; @@ -76,4 +77,14 @@ export interface Ignition { plan( deploymentModule: Module ): Promise; + + /** + * Retrieve information about the given deployed module + * + * @param moduleName - The name of the Ignition module to retrieve data about + * @returns The addresses of the deployed contracts across any relevant networks + * + * @alpha + */ + info(moduleName: string): Promise; } diff --git a/packages/core/src/types/info.ts b/packages/core/src/types/info.ts new file mode 100644 index 0000000000..c82264a752 --- /dev/null +++ b/packages/core/src/types/info.ts @@ -0,0 +1,31 @@ +/** + * A data structure describing a deployed Module + * + * @alpha + */ +export interface ModuleInfoData { + moduleName: string; + networks: NetworkInfoData[]; +} + +/** + * A data structure describing network info for a deployed Module + * + * @alpha + */ +export interface NetworkInfoData { + networkName: string; + chainId: number; + contracts: ContractInfoData[]; +} + +/** + * A data structure describing a deployed Contract + * + * @alpha + */ +export interface ContractInfoData { + contractName: string; + status: string; + address: string; +} diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts index f2de98d4d1..2683a43836 100644 --- a/packages/core/test/execution/batching.ts +++ b/packages/core/test/execution/batching.ts @@ -42,6 +42,7 @@ describe("Execution - batching", () => { const mockJournal: ICommandJournal = { record: async () => {}, async *read() {}, + async *readAll() {}, }; const mockUpdateUiAction = () => {}; diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index a394f2875b..fa0d576e76 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -469,6 +469,7 @@ async function runExecuteOnSingleVertex( const mockJournal: ICommandJournal = { record: async () => {}, async *read() {}, + async *readAll() {}, }; const deployment = new Deployment( @@ -504,6 +505,7 @@ async function runExecuteOnDependentVertex( const mockJournal: ICommandJournal = { record: async () => {}, async *read() {}, + async *readAll() {}, }; const deployment = new Deployment( diff --git a/packages/core/test/util/MemoryCommandJournal.ts b/packages/core/test/util/MemoryCommandJournal.ts index c84f68e82e..479355f3ea 100644 --- a/packages/core/test/util/MemoryCommandJournal.ts +++ b/packages/core/test/util/MemoryCommandJournal.ts @@ -24,6 +24,19 @@ export class MemoryCommandJournal implements ICommandJournal { } } + public async *readAll(): AsyncGenerator< + DeployStateExecutionCommand & { chainId: number }, + void, + unknown + > { + for (const entry of this.entries) { + const command: DeployStateExecutionCommand & { chainId: number } = + JSON.parse(entry); + + yield command; + } + } + public clear() { this.entries = []; } diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts index 69fef6e241..6d8e45b158 100644 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ b/packages/hardhat-plugin/src/CommandJournal.ts @@ -25,6 +25,14 @@ export class CommandJournal implements ICommandJournal { return this._readFromNdjsonFile(this._path); } + public readAll(): AsyncGenerator< + DeployStateExecutionCommand & { chainId: number }, + void, + unknown + > { + return this._readAllFromNdjsonFile(this._path); + } + private async *_readFromNdjsonFile(ndjsonFilePath: string) { if (!fs.existsSync(ndjsonFilePath)) { return; @@ -54,6 +62,32 @@ export class CommandJournal implements ICommandJournal { } } + private async *_readAllFromNdjsonFile(ndjsonFilePath: string) { + if (!fs.existsSync(ndjsonFilePath)) { + return; + } + + const stream = fs.createReadStream(ndjsonFilePath).pipe(ndjson.parse()); + + for await (const chunk of stream) { + // TODO: we need to pull out ndjson, and come up with a different + // line level deserializer to avoid this serialize/deserialize step + const json = JSON.stringify(chunk); + const deserializedChunk = JSON.parse( + json, + this._deserializeReplace.bind(this) + ); + + if (!("chainId" in deserializedChunk)) { + continue; + } + + yield deserializedChunk as DeployStateExecutionCommand & { + chainId: number; + }; + } + } + private _deserializeReplace(_key: string, value: unknown) { if (typeof value === "string" && /^\d+n$/.test(value)) { return BigInt(value.substr(0, value.length - 1)); diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts index 4be7af8cb3..06a1917487 100644 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ b/packages/hardhat-plugin/src/ignition-wrapper.ts @@ -139,6 +139,17 @@ export class IgnitionWrapper { return ignition.plan(ignitionModule); } + public async info(moduleName: string, journalPath: string) { + const journal = new CommandJournal(0, journalPath); + + const ignition = initializeIgnition({ + providers: this._providers, + journal, + }); + + return ignition.info(moduleName); + } + private async _toDeploymentResult( serializedDeploymentResult: SerializedDeploymentResult ): Promise> { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 56ba1fc34a..90de4e2ef6 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -12,6 +12,7 @@ import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; import { Renderer } from "./plan"; import "./type-extensions"; +import { renderInfo } from "./ui/components/info"; export { buildModule } from "@ignored/ignition-core"; @@ -192,7 +193,7 @@ task("plan") const renderer = new Renderer(userModule.name, plan, { cachePath: hre.config.paths.cache, network: { - name: hre.network.name, + name: (plan as { networkName: string }).networkName, id: hre.network.config.chainId ?? "unknown", }, }); @@ -206,6 +207,32 @@ task("plan") } ); +task("ignition-info") + .addPositionalParam("moduleNameOrPath") + .setDescription("Lists the status of all deployments") + .setAction( + async ({ moduleNameOrPath }: { moduleNameOrPath: string }, hre) => { + const userModule: Module | undefined = loadModule( + hre.config.paths.ignition, + moduleNameOrPath + ); + + if (userModule === undefined) { + console.warn("No Ignition modules found"); + process.exit(0); + } + + const journalPath = resolveJournalPath( + userModule?.name, + hre.config.paths.ignition + ); + + const moduleInfo = await hre.ignition.info(userModule.name, journalPath); + + renderInfo(Object.values(moduleInfo)); + } + ); + function resolveParametersFromModuleName( moduleName: string, ignitionPath: string diff --git a/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx b/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx new file mode 100644 index 0000000000..88bbaf9a75 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx @@ -0,0 +1,82 @@ +import type { + ModuleInfoData, + NetworkInfoData, + ContractInfoData, +} from "@ignored/ignition-core"; + +import { Box, Text, Spacer } from "ink"; + +export const ModuleInfoPanel = ({ data }: { data: ModuleInfoData }) => { + return ( + + + {data.moduleName} + + {divider(data.moduleName, "_", data.moduleName.length + 1)} + + + {...data.networks.map((networkData) => ( + + ))} + + ); +}; + +const StatusPanel = ({ data }: { data: NetworkInfoData }) => { + const nameWidth = getMaxStringLength( + data.contracts.map(({ contractName }) => contractName) + ); + + const statusWidth = getMaxStringLength( + data.contracts.map(({ status }) => status) + ); + + return ( + + + + {data.networkName} ({data.chainId}) + + + {divider(data.networkName)} + + + {...data.contracts.map((contract) => ( + + ))} + + ); +}; + +const StatusRow = ({ + nameWidth, + statusWidth, + data, +}: { + nameWidth: number; + statusWidth: number; + data: ContractInfoData; +}) => { + const name = data.contractName.padEnd(nameWidth); + const status = data.status.padEnd(statusWidth); + + return ( + + + {name}   {status}   {data.address} + + + ); +}; + +function divider(name: string, fill: string = "-", length?: number): string { + return new Array(length ?? name.length).fill(fill).join(""); +} + +function getMaxStringLength(strings: string[]): number { + return Math.max(...strings.map((str) => str.length)); +} diff --git a/packages/hardhat-plugin/src/ui/components/info/index.tsx b/packages/hardhat-plugin/src/ui/components/info/index.tsx new file mode 100644 index 0000000000..a54efdf879 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/info/index.tsx @@ -0,0 +1,21 @@ +import type { ModuleInfoData } from "@ignored/ignition-core"; + +import { Box, render } from "ink"; + +import { ModuleInfoPanel } from "./ModuleInfoPanel"; + +export function renderInfo(data: ModuleInfoData[]) { + render(); +} + +const InfoView = ({ data }: { data: ModuleInfoData[] }) => { + return ( + + {...data.map((panelData) => ( + + + + ))} + + ); +}; From e581d20985eeab36e1cdb7af5418e40e71f5552f Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 17 Apr 2023 08:55:24 -0400 Subject: [PATCH 0294/1302] Implementing static calls (#197) * implementation for `m.staticCall` * add docs and tests --------- Co-authored-by: John Kane --- docs/creating-modules-for-deployment.md | 6 +- .../src/internal/dsl/DeploymentBuilder.ts | 78 ++++ .../dispatch/executeStaticContractCall.ts | 43 ++ .../execution/dispatch/executionDispatch.ts | 3 + .../src/internal/execution/dispatch/utils.ts | 11 +- ...onvertDeploymentVertexToExecutionVertex.ts | 22 + .../src/internal/types/deploymentGraph.ts | 16 + .../core/src/internal/types/executionGraph.ts | 25 ++ packages/core/src/internal/utils/guards.ts | 15 + packages/core/src/internal/utils/proxy.ts | 13 +- .../internal/validation/dispatch/helpers.ts | 2 + .../validation/dispatch/validateStaticCall.ts | 99 +++++ .../validation/dispatch/validationDispatch.ts | 3 + packages/core/src/types/dsl.ts | 32 +- packages/core/src/types/future.ts | 16 +- packages/core/test/deploymentBuilder/calls.ts | 2 +- .../test/deploymentBuilder/staticCalls.ts | 384 ++++++++++++++++++ packages/core/test/validation.ts | 209 ++++++++++ packages/hardhat-plugin/src/plan/utils.ts | 5 + .../ui/components/execution/FinalStatus.tsx | 2 + packages/hardhat-plugin/src/ui/types.ts | 2 + 21 files changed, 968 insertions(+), 20 deletions(-) create mode 100644 packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts create mode 100644 packages/core/src/internal/validation/dispatch/validateStaticCall.ts create mode 100644 packages/core/test/deploymentBuilder/staticCalls.ts diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index c6a6de15c0..96c0d55690 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -17,7 +17,7 @@ - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transferring-eth-as-part-of-a-call) - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transferring-eth-outside-of-a-call) - - [Using the results of a call with a deferred value (TBD)](./creating-modules-for-deployment.md#using-the-results-of-a-call-with-a-deferred-value-tbd) + - [Using the results of statically calling a contract method](./creating-modules-for-deployment.md#using-the-results-of-statically-calling-a-contract-method) - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) - [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) - [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) @@ -227,13 +227,13 @@ m.sendETH(exchange, { }); ``` -### Using the results of a call with a deferred value (TBD) +### Using the results of statically calling a contract method A contract might need the result of some other contract method as an input: ```tsx const token = m.contract("Token"); -const totalSupply = m.call(token, "totalSupply"); +const totalSupply = m.staticCall(token, "totalSupply"); const someContract = m.contract("ContractName", { args: [totalSupply], diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts index 209ea7b1ca..09cd6e3477 100644 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -19,6 +19,7 @@ import type { ProxyFuture, RequiredParameter, SendFuture, + StaticContractCall, Virtual, } from "../../types/future"; import type { Artifact } from "../../types/hardhat"; @@ -42,6 +43,7 @@ import { IDeploymentGraph, ScopeData, SendVertex, + StaticCallDeploymentVertex, VirtualVertex, } from "../../internal/types/deploymentGraph"; import { @@ -61,6 +63,7 @@ import { IDeploymentBuilder, InternalParamValue, SendOptions, + StaticCallOptions, UseModuleOptions, } from "../../types/dsl"; import { addEdge, ensureVertex } from "../graph/adjacencyList"; @@ -96,6 +99,7 @@ type DeploymentApiPublicFunctions = | InstanceType["library"] | InstanceType["contractAt"] | InstanceType["call"] + | InstanceType["staticCall"] | InstanceType["event"] | InstanceType["sendETH"] | InstanceType["useModule"]; @@ -367,6 +371,60 @@ export class DeploymentBuilder implements IDeploymentBuilder { return callFuture; } + public staticCall( + contractFuture: DeploymentGraphFuture, + functionName: string, + { args, after, from }: StaticCallOptions + ): StaticContractCall { + const staticCallFuture: StaticContractCall = { + vertexId: this._resolveNextId(), + label: `${contractFuture.label}/${functionName}`, + type: "static-call", + _future: true, + }; + + let contract: CallableFuture; + if (isParameter(contractFuture)) { + const parameter = contractFuture; + const scope = parameter.scope; + + const scopeData = this.graph.scopeData[scope]; + + if ( + scopeData === undefined || + scopeData.parameters === undefined || + !(parameter.label in scopeData.parameters) + ) { + throw new IgnitionError("Could not resolve contract from parameter"); + } + + contract = scopeData.parameters[parameter.label] as + | HardhatContract + | ArtifactContract + | DeployedContract; + } else if (isCallable(contractFuture)) { + contract = contractFuture; + } else { + throw new IgnitionError( + `Not a callable future ${contractFuture.label} (${contractFuture.type})` + ); + } + + DeploymentBuilder._addVertex(this.graph, this.callPoints, this.call, { + id: staticCallFuture.vertexId, + label: staticCallFuture.label, + type: "StaticCall", + contract, + method: functionName, + args: args ?? [], + after: after ?? [], + scopeAdded: this.scopes.getScopedLabel(), + from: from ?? this.accounts[0], + }); + + return staticCallFuture; + } + public event( artifactFuture: ArtifactFuture, eventName: string, @@ -651,6 +709,8 @@ export class DeploymentBuilder implements IDeploymentBuilder { return DeploymentBuilder._addArtifactLibraryVertex(depNode, graph); case "Call": return DeploymentBuilder._addCallVertex(depNode, graph); + case "StaticCall": + return DeploymentBuilder._addStaticCallVertex(depNode, graph); case "Event": return DeploymentBuilder._addEventVertex(depNode, graph); case "SendETH": @@ -717,6 +777,24 @@ export class DeploymentBuilder implements IDeploymentBuilder { ); } + private static _addStaticCallVertex( + depNode: StaticCallDeploymentVertex, + graph: DeploymentGraph + ) { + DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); + + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.args), + graph, + depNode + ); + DeploymentBuilder._addEdgesBasedOn( + Object.values(depNode.after), + graph, + depNode + ); + } + private static _addArtifactLibraryVertex( depNode: ArtifactLibraryDeploymentVertex, graph: DeploymentGraph diff --git a/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts b/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts new file mode 100644 index 0000000000..54c8731120 --- /dev/null +++ b/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts @@ -0,0 +1,43 @@ +import type { + BaseArgValue, + ExecutionVertexVisitResult, + StaticContractCallExecutionVertex, +} from "../../types/executionGraph"; + +import { Contract, ethers } from "ethers"; + +import { VertexResultEnum } from "../../types/graph"; + +import { resolveFrom, toAddress } from "./utils"; + +export async function executeStaticContractCall( + { method, contract, args, signer }: StaticContractCallExecutionVertex, + resultAccumulator: Map +): Promise { + const resolve = resolveFrom(resultAccumulator); + + const resolvedArgs = args.map(resolve).map(toAddress); + + const { address, abi } = resolve(contract); + + let result: BaseArgValue | ethers.utils.Result; + try { + const contractInstance = new Contract(address, abi, signer); + + result = await contractInstance[method](...resolvedArgs, { + from: await signer.getAddress(), + }); + } catch (err) { + return { + _kind: VertexResultEnum.FAILURE, + failure: err as any, + }; + } + + return { + _kind: VertexResultEnum.SUCCESS, + result: { + data: result, + }, + }; +} diff --git a/packages/core/src/internal/execution/dispatch/executionDispatch.ts b/packages/core/src/internal/execution/dispatch/executionDispatch.ts index 98b59a1718..be276022d5 100644 --- a/packages/core/src/internal/execution/dispatch/executionDispatch.ts +++ b/packages/core/src/internal/execution/dispatch/executionDispatch.ts @@ -11,6 +11,7 @@ import { executeContractDeploy } from "./executeContractDeploy"; import { executeDeployedContract } from "./executeDeployedContract"; import { executeLibraryDeploy } from "./executeLibraryDeploy"; import { executeSendETH } from "./executeSendETH"; +import { executeStaticContractCall } from "./executeStaticContractCall"; export function executionDispatch( executionVertex: ExecutionVertex, @@ -28,6 +29,8 @@ export function executionDispatch( ); case "ContractCall": return executeContractCall(executionVertex, resultAccumulator, context); + case "StaticContractCall": + return executeStaticContractCall(executionVertex, resultAccumulator); case "LibraryDeploy": return executeLibraryDeploy(executionVertex, resultAccumulator, context); case "AwaitedEvent": diff --git a/packages/core/src/internal/execution/dispatch/utils.ts b/packages/core/src/internal/execution/dispatch/utils.ts index e39c42f6b5..afb9443cf9 100644 --- a/packages/core/src/internal/execution/dispatch/utils.ts +++ b/packages/core/src/internal/execution/dispatch/utils.ts @@ -5,7 +5,12 @@ import type { import { IgnitionError } from "../../../errors"; import { VertexResultEnum } from "../../types/graph"; -import { isDependable, isEventParam, isProxy } from "../../utils/guards"; +import { + isDependable, + isEventParam, + isProxy, + isStaticCallFuture, +} from "../../utils/guards"; export function toAddress(v: any) { if (typeof v === "object" && "address" in v) { @@ -55,5 +60,9 @@ function resolveFromContext( return entry.result.topics[arg.label]; } + if (isStaticCallFuture(arg) && "data" in entry.result) { + return entry.result.data; + } + return entry.result; } diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index 7ae80d1b0a..4228b2174e 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -15,6 +15,7 @@ import { HardhatLibraryDeploymentVertex, IDeploymentGraph, SendVertex, + StaticCallDeploymentVertex, } from "../../types/deploymentGraph"; import { ArgValue, @@ -25,6 +26,7 @@ import { ExecutionVertex, LibraryDeployExecutionVertex, SentETHExecutionVertex, + StaticContractCallExecutionVertex, } from "../../types/executionGraph"; import { Services } from "../../types/services"; import { isFuture } from "../../utils/guards"; @@ -58,6 +60,8 @@ export function convertDeploymentVertexToExecutionVertex( ); case "Call": return convertCallToContractCall(deploymentVertex, context); + case "StaticCall": + return convertStaticCallToStaticContractCall(deploymentVertex, context); case "HardhatLibrary": return convertHardhatLibraryToLibraryDeploy(deploymentVertex, context); case "ArtifactLibrary": @@ -155,6 +159,24 @@ async function convertCallToContractCall( }; } +async function convertStaticCallToStaticContractCall( + vertex: StaticCallDeploymentVertex, + transformContext: TransformContext +): Promise { + const signer: ethers.Signer = + await transformContext.services.accounts.getSigner(vertex.from); + + return { + type: "StaticContractCall", + id: vertex.id, + label: vertex.label, + contract: await resolveParameter(vertex.contract, transformContext), + method: vertex.method, + args: await convertArgs(vertex.args, transformContext), + signer, + }; +} + async function convertHardhatLibraryToLibraryDeploy( vertex: HardhatLibraryDeploymentVertex, transformContext: TransformContext diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 3467daaf18..d7cf2fb8ae 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -61,6 +61,7 @@ export type DeploymentGraphVertex = | HardhatLibraryDeploymentVertex | ArtifactLibraryDeploymentVertex | CallDeploymentVertex + | StaticCallDeploymentVertex | VirtualVertex | EventVertex | SendVertex; @@ -156,6 +157,21 @@ export interface CallDeploymentVertex extends VertexDescriptor { from: string; } +/** + * Read from a smart contract method. + * + * @internal + */ +export interface StaticCallDeploymentVertex extends VertexDescriptor { + type: "StaticCall"; + scopeAdded: string; + contract: CallableFuture; + method: string; + args: InternalParamValue[]; + after: DeploymentGraphFuture[]; + from: string; +} + /** * A non-action vertex used to represent group relationships. The virtual * vertex can depend on many other vertexes, so a dependency on the virtual diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts index 0febcd6fef..8e70126bc2 100644 --- a/packages/core/src/internal/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -66,6 +66,7 @@ export type ExecutionVertexType = | "DeployedContract" | "LibraryDeploy" | "ContractCall" + | "StaticContractCall" | "AwaitedEvent" | "SentETH"; @@ -79,6 +80,7 @@ export type ExecutionVertex = | DeployedContractExecutionVertex | LibraryDeployExecutionVertex | ContractCallExecutionVertex + | StaticContractCallExecutionVertex | AwaitedEventExecutionVertex | SentETHExecutionVertex; @@ -134,6 +136,19 @@ export interface ContractCallExecutionVertex extends VertexDescriptor { signer: ethers.Signer; } +/** + * Make a static call to a read-only method of a smart chain contract. + * + * @internal + */ +export interface StaticContractCallExecutionVertex extends VertexDescriptor { + type: "StaticContractCall"; + contract: any; + method: string; + args: ArgValue[]; + signer: ethers.Signer; +} + /** * Wait for the an Ethereum event to execute. * @@ -213,6 +228,15 @@ export interface ContractCallSuccess { hash: string; } +/** + * The result of a successful smart contract static call. + * + * @internal + */ +export interface StaticContractCallSuccess { + data: BaseArgValue | ethers.utils.Result; +} + /** * The result of a successful transfer of ETH to a contract/address. * @@ -234,6 +258,7 @@ export type VertexVisitResultSuccessResult = | LibraryDeploySuccess | AwaitedEventSuccess | ContractCallSuccess + | StaticContractCallSuccess | SendETHSuccess; /** diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 954ba4297e..829cbbcfbb 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -7,6 +7,7 @@ import type { OptionalParameter, ProxyFuture, RequiredParameter, + StaticContractCall, Virtual, } from "../../types/future"; import type { @@ -18,6 +19,7 @@ import type { EventVertex, HardhatContractDeploymentVertex, HardhatLibraryDeploymentVertex, + StaticCallDeploymentVertex, } from "../types/deploymentGraph"; import { IgnitionError } from "../../errors"; @@ -57,6 +59,12 @@ export function isCall( return node.type === "Call"; } +export function isStaticCall( + node: DeploymentGraphVertex +): node is StaticCallDeploymentVertex { + return node.type === "StaticCall"; +} + export function isAwaitedEvent( node: DeploymentGraphVertex ): node is EventVertex { @@ -88,6 +96,7 @@ export function isDependable(possible: any): possible is DependableFuture { return ( isFuture(possible) && (possible.type === "call" || + possible.type === "static-call" || possible.type === "contract" || possible.type === "library" || possible.type === "virtual" || @@ -109,6 +118,12 @@ export function isEventParam(possible: any): possible is EventParamFuture { return isFuture(possible) && possible.type === "eventParam"; } +export function isStaticCallFuture( + possible: any +): possible is StaticContractCall { + return isFuture(possible) && possible.type === "static-call"; +} + export function isParameter( future: DeploymentGraphFuture ): future is RequiredParameter | OptionalParameter { diff --git a/packages/core/src/internal/utils/proxy.ts b/packages/core/src/internal/utils/proxy.ts index efa58713e6..79c31b9265 100644 --- a/packages/core/src/internal/utils/proxy.ts +++ b/packages/core/src/internal/utils/proxy.ts @@ -1,17 +1,10 @@ -import { - CallableFuture, - ContractCall, - DependableFuture, - Virtual, - EventFuture, - SendFuture, -} from "../../types/future"; +import { DependableFuture, ProxyFuture } from "../../types/future"; import { isProxy } from "./guards"; export function resolveProxyDependency( future: DependableFuture -): CallableFuture | ContractCall | Virtual | EventFuture | SendFuture { +): Exclude { if (isProxy(future)) { return resolveProxyDependency(future.proxy); } @@ -21,7 +14,7 @@ export function resolveProxyDependency( export function resolveProxyValue( future: DependableFuture -): CallableFuture | ContractCall | Virtual | EventFuture | SendFuture { +): Exclude { if (isProxy(future)) { return resolveProxyValue(future.value); } diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts index 30b3cc66e4..ee1c996120 100644 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -39,6 +39,8 @@ export async function resolveArtifactForCallableFuture( throw new IgnitionError(`Cannot call virtual future`); case "call": throw new IgnitionError(`Cannot call call future`); + case "static-call": + throw new IgnitionError(`Cannot call static-call future`); case "await": throw new IgnitionError(`Cannot call await future`); case "send": diff --git a/packages/core/src/internal/validation/dispatch/validateStaticCall.ts b/packages/core/src/internal/validation/dispatch/validateStaticCall.ts new file mode 100644 index 0000000000..5e9ecb1d03 --- /dev/null +++ b/packages/core/src/internal/validation/dispatch/validateStaticCall.ts @@ -0,0 +1,99 @@ +import { ethers } from "ethers"; + +import { StaticCallDeploymentVertex } from "../../types/deploymentGraph"; +import { VertexResultEnum } from "../../types/graph"; +import { + ValidationDispatchContext, + ValidationResultsAccumulator, + ValidationVertexVisitResult, +} from "../../types/validation"; + +import { + buildValidationError, + resolveArtifactForCallableFuture, +} from "./helpers"; + +export async function validateStaticCall( + vertex: StaticCallDeploymentVertex, + _resultAccumulator: ValidationResultsAccumulator, + context: ValidationDispatchContext +): Promise { + if (!ethers.utils.isAddress(vertex.from)) { + return buildValidationError( + vertex, + `For static call 'from' must be a valid address string`, + context.callPoints + ); + } + + const contractName = vertex.contract.label; + + const artifactAbi = await resolveArtifactForCallableFuture( + vertex.contract, + context + ); + + if (artifactAbi === undefined) { + return buildValidationError( + vertex, + `Artifact with name '${contractName}' doesn't exist`, + context.callPoints + ); + } + + const argsLength = vertex.args.length; + + const iface = new ethers.utils.Interface(artifactAbi); + + const funcs = Object.entries(iface.functions) + .filter(([fname]) => fname === vertex.method) + .map(([, fragment]) => fragment); + + const functionFragments = iface.fragments + .filter((frag) => frag.name === vertex.method) + .concat(funcs); + + if (functionFragments.length === 0) { + return buildValidationError( + vertex, + `Contract '${contractName}' doesn't have a function ${vertex.method}`, + context.callPoints + ); + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + return buildValidationError( + vertex, + `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, + context.callPoints + ); + } else { + return buildValidationError( + vertex, + `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, + context.callPoints + ); + } + } + + const funcFrag = + matchingFunctionFragments[0] as ethers.utils.FunctionFragment; + + if (!funcFrag.constant) { + return buildValidationError( + vertex, + `Function ${vertex.method} in contract ${contractName} is not 'pure' or 'view' and cannot be statically called`, + context.callPoints + ); + } + + return { + _kind: VertexResultEnum.SUCCESS, + result: undefined, + }; +} diff --git a/packages/core/src/internal/validation/dispatch/validationDispatch.ts b/packages/core/src/internal/validation/dispatch/validationDispatch.ts index 9edba39639..15e963aaeb 100644 --- a/packages/core/src/internal/validation/dispatch/validationDispatch.ts +++ b/packages/core/src/internal/validation/dispatch/validationDispatch.ts @@ -13,6 +13,7 @@ import { validateEvent } from "./validateEvent"; import { validateHardhatContract } from "./validateHardhatContract"; import { validateHardhatLibrary } from "./validateHardhatLibrary"; import { validateSendETH } from "./validateSendETH"; +import { validateStaticCall } from "./validateStaticCall"; import { validateVirtual } from "./validateVirtual"; export function validationDispatch( @@ -41,6 +42,8 @@ export function validationDispatch( ); case "Call": return validateCall(deploymentVertex, resultAccumulator, context); + case "StaticCall": + return validateStaticCall(deploymentVertex, resultAccumulator, context); case "HardhatLibrary": return validateHardhatLibrary( deploymentVertex, diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index 21c5ddca5c..bc51b1cffa 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -17,6 +17,7 @@ import { ParameterValue, RequiredParameter, SendFuture, + StaticContractCall, Virtual, } from "./future"; import { Artifact } from "./hardhat"; @@ -58,6 +59,21 @@ export interface IDeploymentBuilder { options: CallOptions ): ContractCall; + /** + * Statically call a contract method. + * + * @param contractFuture - A contract future + * @param functionName - the name of the read-only method to be called + * @param options - The options to control the method invocation. + * + * @alpha + */ + staticCall( + contractFuture: DeploymentGraphFuture, + functionName: string, + options: StaticCallOptions + ): StaticContractCall; + /** * Deploy a named contract from Hardhat's contracts folder. * @@ -230,6 +246,17 @@ export interface CallOptions { from?: string; } +/** + * The options for a smart contract stati call. + * + * @alpha + */ +export interface StaticCallOptions { + args: InternalParamValue[]; + after?: DeploymentGraphFuture[]; + from?: string; +} + /** * The options for a Contract deploy. * @@ -288,7 +315,4 @@ export type ExternalParamValue = * * @alpha */ -export type InternalParamValue = - | ExternalParamValue - | DeploymentGraphFuture - | EventParamFuture; +export type InternalParamValue = ExternalParamValue | DeploymentGraphFuture; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index f86c4f9047..345c60a83f 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -87,6 +87,18 @@ export interface ContractCall { _future: true; } +/** + * A future representing a retrieval of data from statically calling an on-chain smart contract method. + * + * @alpha + */ +export interface StaticContractCall { + vertexId: number; + label: string; + type: "static-call"; + _future: true; +} + /** * A future representing an on-chain Ethereum event. * @@ -246,6 +258,7 @@ export type CallableFuture = ContractFuture | LibraryFuture; export type DependableFuture = | CallableFuture | ContractCall + | StaticContractCall | Virtual | ProxyFuture | EventFuture @@ -277,4 +290,5 @@ export type ParameterFuture = RequiredParameter | OptionalParameter; export type DeploymentGraphFuture = | DependableFuture | ParameterFuture - | EventParamFuture; + | EventParamFuture + | StaticContractCall; diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts index 6d4a50b78b..2c7bda1d63 100644 --- a/packages/core/test/deploymentBuilder/calls.ts +++ b/packages/core/test/deploymentBuilder/calls.ts @@ -249,7 +249,7 @@ describe("deployment builder - calls", () => { assert.isDefined(deploymentGraph); }); - it("should have four nodes", () => { + it("should have two nodes", () => { assert.equal(deploymentGraph.vertexes.size, 2); }); diff --git a/packages/core/test/deploymentBuilder/staticCalls.ts b/packages/core/test/deploymentBuilder/staticCalls.ts new file mode 100644 index 0000000000..a9704780cd --- /dev/null +++ b/packages/core/test/deploymentBuilder/staticCalls.ts @@ -0,0 +1,384 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/buildModule"; +import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; +import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; +import { + isStaticCall, + isHardhatContract, +} from "../../src/internal/utils/guards"; +import { isFailure } from "../../src/internal/utils/process-results"; +import { IDeploymentBuilder } from "../../src/types/dsl"; + +import { + getDependenciesForVertex, + getDeploymentVertexByLabel, +} from "./helpers"; + +describe("deployment builder - static calls", () => { + describe("with basic value args", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const token = m.contract("Token"); + + const totalSupply = m.staticCall(token, "totalSupply", { + args: [token], + from: m.accounts[0], + }); + + const exchange = m.contract("Exchange", { args: [totalSupply] }); + + return { token, exchange }; + }); + + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + callModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have three nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 3); + }); + + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + + it("should have the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Exchange"); + assert(isHardhatContract(depNode)); + }); + + it("should have the static call node Token/totalSupply", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/totalSupply" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Token/totalSupply"); + assert(isStaticCall(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show one dependency for the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { id: 1, label: "Token/totalSupply", type: "" }, + ]); + }); + + it("should show one dependency for the static call node Token/totalSupply", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/totalSupply" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "Token", + type: "", + }, + ]); + }); + + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the contract node Exchange", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 1, + label: "Token/totalSupply", + type: "static-call", + _future: true, + }, + ]); + }); + + it("should record the argument list for the call node Token at Token/totalSupply", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/totalSupply" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isStaticCall(depNode)) { + return assert.fail("Not a static call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 0, + label: "Token", + type: "contract", + subtype: "hardhat", + contractName: "Token", + _future: true, + }, + ]); + }); + + it("should record the address to send from for the static call node Token at Token/totalSupply", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/totalSupply" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isStaticCall(depNode)) { + return assert.fail("Not a static call dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); + }); + + describe("with array args", () => { + let deploymentGraph: IDeploymentGraph; + + before(() => { + const callModule = buildModule("call", (m: IDeploymentBuilder) => { + const captureArraysContracts = m.contract("CaptureArraysContract"); + + m.staticCall(captureArraysContracts, "recordArrays", { + args: [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ], + from: m.accounts[0], + }); + + return {}; + }); + + const constructDeploymentGraphResult = generateDeploymentGraphFrom( + callModule, + { + chainId: 31337, + accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], + artifacts: [], + } + ); + + if (isFailure(constructDeploymentGraphResult)) { + assert.fail("Construction of deployment graph failed"); + } + + deploymentGraph = constructDeploymentGraphResult.result.graph; + }); + + it("should create a graph", () => { + assert.isDefined(deploymentGraph); + }); + + it("should have two nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 2); + }); + + it("should have the contract node CaptureArraysContract", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "CaptureArraysContract"); + assert(isHardhatContract(depNode)); + }); + + it("should have the static call node CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "CaptureArraysContract/recordArrays"); + assert(isStaticCall(depNode)); + }); + + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + + it("should show one dependencies for the call node CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ + { + id: 0, + label: "CaptureArraysContract", + type: "", + }, + ]); + }); + + it("should record the argument list for the contract node CaptureArraysContract as empty", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + + it("should record the argument list for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isStaticCall(depNode)) { + return assert.fail("Not a static call dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ]); + }); + + it("should record the address to send from for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "CaptureArraysContract/recordArrays" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isStaticCall(depNode)) { + return assert.fail("Not a static call dependency node"); + } + + assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + }); + }); +}); diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 0e0a36f78a..341b3973b1 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -400,6 +400,215 @@ describe("Validation", () => { }); }); + describe("static call", () => { + const exampleCallArtifact = { + _format: "hh-sol-artifact-1", + contractName: "Foo", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "sub", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: "0x0", + deployedBytecode: "0x0", + linkReferences: {}, + deployedLinkReferences: {}, + }; + + it("should validate a correct static call", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.staticCall(example, "x", { args: [] }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); + }); + + it("should fail a static call on a nonexistant function", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.staticCall(example, "nonexistant", { args: [] }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "Contract 'Foo' doesn't have a function nonexistant" + ); + }); + + it("should fail a static call with wrong number of arguments", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.staticCall(example, "x", { args: [1] }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "Function x in contract Foo expects 0 arguments but 1 were given" + ); + }); + + it("should fail a call sent from an invalid address", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.staticCall(example, "nonexistant", { + args: [], + from: 1 as any, + }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "For static call 'from' must be a valid address string" + ); + }); + + it("should fail a static call on a non-readonly function", async () => { + const singleModule = buildModule("single", (m: IDeploymentBuilder) => { + const example = m.contract("Foo"); + + m.staticCall(example, "sub", { args: [1] }); + + return { example }; + }); + + const mockServices = { + ...getMockServices(), + artifacts: { + hasArtifact: () => true, + getArtifact: () => exampleCallArtifact, + }, + } as any; + + const validationResult = await runValidation(singleModule, mockServices); + + assertValidationError( + validationResult, + "Function sub in contract Foo is not 'pure' or 'view' and cannot be statically called" + ); + }); + }); + describe("sendETH", () => { const exampleCallArtifact = { _format: "hh-sol-artifact-1", diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts index b6962ec13e..8871049d50 100644 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ b/packages/hardhat-plugin/src/plan/utils.ts @@ -8,6 +8,7 @@ type DisplayType = | "deploy-contract" | "deploy-library" | "call" + | "static-call" | "transfer" | "event"; @@ -23,6 +24,8 @@ export function parseType(v: VertexDescriptor): DisplayType { return "deploy-library"; case "Call": return "call"; + case "StaticCall": + return "static-call"; case "SendETH": return "transfer"; case "Event": @@ -132,6 +135,8 @@ export function toTypeText(type: DisplayType) { return "Library deploy"; case "call": return "Contract call"; + case "static-call": + return "Static contract call"; case "transfer": return "Transfer"; case "event": diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index bdddb04b62..dcb811703d 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -180,6 +180,8 @@ const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { switch (vertex.type) { case "ContractCall": return "Failed contract call"; + case "StaticContractCall": + return "Failed static contract call"; case "ContractDeploy": return "Failed contract deploy"; case "DeployedContract": diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 04c9336789..a7651be611 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -177,6 +177,8 @@ export class DeploymentState { switch (vertex.type) { case "ContractCall": return "Failed contract call"; + case "StaticContractCall": + return "Failed static contract call"; case "ContractDeploy": return "Failed contract deploy"; case "DeployedContract": From a29f7b5d4567253dadde2116e86ac69dd748fe23 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Apr 2023 11:54:26 +0100 Subject: [PATCH 0295/1302] chore: bump version to v0.0.13 Update the packages versions and changelogs for the `0.0.13 - 2023-04-18` release. --- examples/create2/package.json | 4 +- examples/ens/package.json | 4 +- examples/multisig/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/uniswap/package.json | 4 +- package-lock.json | 4674 ++++++++++++++++++-------- packages/core/CHANGELOG.md | 7 + packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 7 + packages/hardhat-plugin/package.json | 6 +- 11 files changed, 3349 insertions(+), 1371 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index 55930be3bf..c8ac04fe81 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-create2-example", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/ens/package.json b/examples/ens/package.json index 74f9f11243..68c3d7264e 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/multisig/package.json b/examples/multisig/package.json index f6975fce6d..cc055bb386 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-example-multisig", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/examples/sample/package.json b/examples/sample/package.json index 1d1b1231e3..7f0e3b02e6 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 611939fbb1..a2d9532e7f 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 868f6c9365..b780956c63 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.12", + "version": "0.0.13", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" }, diff --git a/package-lock.json b/package-lock.json index 053988a642..ddbbd28656 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,89 +30,1331 @@ }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.12", + "version": "0.0.13", "dependencies": { "@openzeppelin/contracts": "4.7.3" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, - "examples/ens": { - "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.12", + "examples/create2/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, "dependencies": { - "@ensdomains/ens-contracts": "0.0.11" + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } } }, - "examples/multisig": { - "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.12", + "examples/create2/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { - "@openzeppelin/contracts": "^4.3.2" + "p-locate": "^5.0.0" }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "examples/sample": { - "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.12", - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "examples/create2/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "examples/ts-sample": { - "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.12", + "examples/create2/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/create2/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/create2/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/create2/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/create2/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "examples/create2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/ens": { + "name": "@nomicfoundation/ignition-ens-example", + "version": "0.0.13", + "dependencies": { + "@ensdomains/ens-contracts": "0.0.11" + }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", + "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "2.13.0" } }, - "examples/uniswap": { - "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.12", + "examples/ens/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "examples/ens/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ens/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "examples/ens/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ens/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ens/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ens/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/ens/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "examples/ens/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/multisig": { + "name": "@nomicfoundation/ignition-example-multisig", + "version": "0.0.13", + "dependencies": { + "@openzeppelin/contracts": "^4.3.2" + }, + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" + } + }, + "examples/multisig/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "examples/multisig/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/multisig/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "examples/multisig/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/multisig/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/multisig/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/multisig/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/multisig/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "examples/multisig/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/sample": { + "name": "@nomicfoundation/ignition-sample-example", + "version": "0.0.13", + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" + } + }, + "examples/sample/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "examples/sample/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/sample/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "examples/sample/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/sample/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/sample/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/sample/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/sample/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "examples/sample/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/ts-sample": { + "name": "@nomicfoundation/ignition-ts-sample-example", + "version": "0.0.13", + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" + } + }, + "examples/ts-sample/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "examples/ts-sample/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ts-sample/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "examples/ts-sample/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ts-sample/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ts-sample/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/ts-sample/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/ts-sample/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "dependencies": { + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "examples/ts-sample/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "examples/uniswap": { + "name": "@nomicfoundation/ignition-uniswap-example", + "version": "0.0.13", + "dependencies": { + "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", + "@uniswap/swap-router-contracts": "1.1.0", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.1.1", + "@uniswap/v3-sdk": "3.9.0", + "@uniswap/v3-staker": "1.0.2", + "bignumber.js": "9.1.0", + "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" + }, + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "2.13.0" + } + }, + "examples/uniswap/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + }, + "examples/uniswap/node_modules/hardhat": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", + "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "dev": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "^4.0.0", + "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", + "@nomicfoundation/ethereumjs-common": "^3.0.0", + "@nomicfoundation/ethereumjs-evm": "^1.0.0", + "@nomicfoundation/ethereumjs-rlp": "^4.0.0", + "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", + "@nomicfoundation/ethereumjs-trie": "^5.0.0", + "@nomicfoundation/ethereumjs-tx": "^4.0.0", + "@nomicfoundation/ethereumjs-util": "^8.0.0", + "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "examples/uniswap/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/uniswap/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "examples/uniswap/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/uniswap/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/uniswap/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "examples/uniswap/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "examples/uniswap/node_modules/resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, "dependencies": { - "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", - "@uniswap/swap-router-contracts": "1.1.0", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.1.1", - "@uniswap/v3-sdk": "3.9.0", - "@uniswap/v3-staker": "1.0.2", - "bignumber.js": "9.1.0", - "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" + "path-parse": "^1.0.6" }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.12", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "examples/uniswap/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + "examples/uniswap/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -203,20 +1445,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-compilation-targets": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", @@ -389,77 +1617,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { "version": "7.21.4", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", @@ -571,6 +1728,29 @@ "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", "dev": true }, + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + }, + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -825,11 +2005,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" - }, "node_modules/@ensdomains/ens/node_modules/rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -899,11 +2074,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" - }, "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -1032,6 +2202,54 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@ethereumjs/common": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", @@ -1659,6 +2877,26 @@ "@ethersproject/rlp": "^5.7.0" } }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@ethersproject/random": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", @@ -1963,6 +3201,28 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", @@ -1993,6 +3253,28 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2006,6 +3288,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2097,13 +3392,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" @@ -2128,21 +3424,27 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -2336,6 +3638,7 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -2352,6 +3655,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2374,6 +3678,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-common": "3.1.2", @@ -2396,6 +3701,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2418,6 +3724,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-util": "8.0.6", "crc-32": "^1.2.0" @@ -2427,6 +3734,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -2443,6 +3751,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2465,6 +3774,7 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -2483,6 +3793,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2505,6 +3816,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", + "dev": true, "bin": { "rlp": "bin/rlp" }, @@ -2516,6 +3828,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -2530,6 +3843,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2552,6 +3866,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "@nomicfoundation/ethereumjs-util": "8.0.6", @@ -2566,6 +3881,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2588,6 +3904,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-common": "3.1.2", "@nomicfoundation/ethereumjs-rlp": "4.0.3", @@ -2602,6 +3919,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2624,6 +3942,7 @@ "version": "8.0.6", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-rlp": "4.0.3", "ethereum-cryptography": "0.1.3" @@ -2636,6 +3955,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2658,6 +3978,7 @@ "version": "6.4.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", + "dev": true, "dependencies": { "@nomicfoundation/ethereumjs-block": "4.2.2", "@nomicfoundation/ethereumjs-blockchain": "6.2.2", @@ -2684,6 +4005,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dev": true, "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3004,9 +4326,9 @@ "dev": true }, "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.2.tgz", - "integrity": "sha512-NLDlDFL2us07C0jB/9wzvR0kuLivChJWCXTKcj3yqjZqMoYp7g7wwS157F70VHx/+9gHIBGzak5pKDwG8gEefA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, "peerDependencies": { "ethers": "^5.0.0", @@ -3035,71 +4357,6 @@ "hardhat": "^2.0.4" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -3110,19 +4367,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@nomiclabs/hardhat-truffle5": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", @@ -3670,9 +4914,9 @@ "integrity": "sha512-1nibqGjEHC7KAyDThEFvbm2+EO8zAHee/VjCtxkYBE3ySwP50joh0QCEBjy7K/9z+icpMoDucfxmgaKToBFUgQ==" }, "node_modules/@truffle/codec": { - "version": "0.14.16", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.16.tgz", - "integrity": "sha512-a9UY3n/FnkKN3Q4zOuMFOOcLWb80mdknj+voim4vvXYtJm1aAZQZE5sG9aLnMBTl4TiGLzUtfNDVYY7WgWgDag==", + "version": "0.14.17", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.17.tgz", + "integrity": "sha512-kD4dD86huLeaBEq5R8D1zleJEu6NsXbyYLdXl1V1TKdiO8odw5CBC6Y/+wdu5d3t1dyEYrTbhn1dqknZa52pmw==", "dependencies": { "@truffle/abi-utils": "^0.3.9", "@truffle/compile-common": "^0.9.4", @@ -3822,11 +5066,11 @@ } }, "node_modules/@truffle/debug-utils": { - "version": "6.0.47", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.47.tgz", - "integrity": "sha512-bUjdzLPdEKtoUCDzaXkrOoi+PbyAJlMBzGequBK8tirT7xL9bCP2Pd/WxvnmRd7AnfroxGNvXwVXWTItW5SMWQ==", + "version": "6.0.48", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.48.tgz", + "integrity": "sha512-HdK/7eH5EFrcTPeZVEgKaKkkzuZ4xsrH8yw+EoLEsScLsOEuQeKynY61NctjuU93voATWrYmV99Sfb/MRq2i2g==", "dependencies": { - "@truffle/codec": "^0.14.16", + "@truffle/codec": "^0.14.17", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -3834,70 +5078,6 @@ "highlightjs-solidity": "^2.0.6" } }, - "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@truffle/debug-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@truffle/error": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", @@ -4322,160 +5502,61 @@ "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", - "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", - "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-net": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@trufflesuite/chromafi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", - "dependencies": { - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "highlight.js": "^10.4.1", - "lodash.merge": "^4.6.2", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.8.2", + "websocket": "^1.0.32" + }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", + "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", + "hasInstallScript": true, "dependencies": { - "ansi-regex": "^3.0.0" + "web3-core": "1.8.2", + "web3-core-method": "1.8.2", + "web3-core-subscriptions": "1.8.2", + "web3-net": "1.8.2" }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", + "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8.0.0" } }, - "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "camelcase": "^4.1.0", + "chalk": "^2.3.2", + "cheerio": "^1.0.0-rc.2", + "detect-indent": "^5.0.0", + "highlight.js": "^10.4.1", + "lodash.merge": "^4.6.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0" } }, "node_modules/@tsconfig/node10": { @@ -4587,7 +5668,8 @@ "node_modules/@types/async-eventemitter": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==" + "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", + "dev": true }, "node_modules/@types/bignumber.js": { "version": "5.0.0", @@ -5086,9 +6168,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "17.0.56", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.56.tgz", - "integrity": "sha512-Z13f9Qz7Hg8f2g2NsBjiJSVWmON2b3K8RIqFK8mMKCIgvD0CD0ZChTukz87H3lI28X3ukXoNFGzo3ZW1ICTtPA==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "devOptional": true, "dependencies": { "@types/prop-types": "*", @@ -5096,6 +6178,20 @@ "csstype": "^3.0.2" } }, + "node_modules/@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "dependencies": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -5119,9 +6215,9 @@ } }, "node_modules/@types/sinon": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.13.tgz", - "integrity": "sha512-UVjDqJblVNQYvVNUsj0PuYYw0ELRmgt1Nt5Vk0pT5f16ROGfcKJY8o1HVuMOJOpD727RrGB9EGvoaTQE5tgxZQ==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", + "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" @@ -5673,9 +6769,9 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "engines": { "node": ">=6" } @@ -5694,23 +6790,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/ansi-sequence-parser": { @@ -5720,17 +6805,14 @@ "dev": true }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/antlr4ts": { @@ -5941,6 +7023,7 @@ "version": "2.6.4", "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, "dependencies": { "lodash": "^4.17.14" } @@ -5949,6 +7032,7 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", + "dev": true, "dependencies": { "async": "^2.4.0" } @@ -6064,10 +7148,9 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, + "version": "1.6.36", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", "engines": { "node": ">=0.6" } @@ -6085,22 +7168,11 @@ } }, "node_modules/bigint-crypto-utils": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.1.8.tgz", - "integrity": "sha512-+VMV9Laq8pXLBKKKK49nOoq9bfR3j7NNQAtbA617a4nw9bVLo8rsqkKMBgM2AJWlNX9fEIyYaYX+d0laqYV4tw==", - "dependencies": { - "bigint-mod-arith": "^3.1.0" - }, - "engines": { - "node": ">=10.4.0" - } - }, - "node_modules/bigint-mod-arith": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bigint-mod-arith/-/bigint-mod-arith-3.1.2.tgz", - "integrity": "sha512-nx8J8bBeiRR+NlsROFH9jHswW5HO8mgfOSqW0AmjicMMvaONDa8AO+5ViKDUUNytBPWiwfvZP4/Bj4Y3lUfvgQ==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", + "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", "engines": { - "node": ">=10.4.0" + "node": ">=14.0.0" } }, "node_modules/bignumber.js": { @@ -6212,13 +7284,21 @@ "node": ">= 5.10.0" } }, + "node_modules/bplist-parser/node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -6489,12 +7569,11 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/camelcase-keys": { @@ -6540,9 +7619,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001474", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001474.tgz", - "integrity": "sha512-iaIZ8gVrWfemh5DG3T9/YqarVZoYf0r188IjaGwx68j4Pf0SGY6CQkmJUIE+NZHkkecQGohzXmBGEwWDr9aM3Q==", + "version": "1.0.30001480", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz", + "integrity": "sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==", "dev": true, "funding": [ { @@ -6559,6 +7638,14 @@ } ] }, + "node_modules/case": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -6615,18 +7702,43 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "engines": { + "node": ">=4" } }, "node_modules/change-case": { @@ -6809,15 +7921,15 @@ "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "node_modules/classic-level": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.2.0.tgz", - "integrity": "sha512-qw5B31ANxSluWz9xBzklRWTUAJ1SXIdaVKTVS7HcTGKOAmExx65Wo5BUICW+YGORe2FOUaDghoI9ZDxj82QcFg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "hasInstallScript": true, "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", "module-error": "^1.0.1", - "napi-macros": "~2.0.0", + "napi-macros": "^2.2.2", "node-gyp-build": "^4.3.0" }, "engines": { @@ -6855,9 +7967,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", + "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", "engines": { "node": ">=6" }, @@ -6882,76 +7994,123 @@ "colors": "^1.1.2" } }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "ansi-regex": "^3.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/cliui/node_modules/wrap-ansi": { @@ -7001,20 +8160,17 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colors": { "version": "1.2.5", @@ -7073,19 +8229,6 @@ "node": ">=8.0.0" } }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", @@ -7096,71 +8239,6 @@ "node": ">=8" } }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", @@ -7426,14 +8504,6 @@ "sha3": "^2.1.1" } }, - "node_modules/crypto-addr-codec/node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "engines": { - "node": ">=0.6" - } - }, "node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -8005,6 +9075,11 @@ } } }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -8279,9 +9354,9 @@ } }, "node_modules/dns-packet": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.5.0.tgz", - "integrity": "sha512-USawdAUzRkV6xrqTjiAEp6M9YagZEzWcSUaZTcIFAiyQWW1SoI6KyId8y2+/71wbgHKQAKd+iupLv4YvEwYWvA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -8394,9 +9469,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.350", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.350.tgz", - "integrity": "sha512-XnXcWpVnOfHZ4C3NPiL+SubeoGV8zc/pg8GEubRtc1dPA/9jKS2vsOPmtClJHhWxUb2RSGC1OBLCbgNUJMtZPw==", + "version": "1.4.367", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.367.tgz", + "integrity": "sha512-mNuDxb+HpLhPGUKrg0hSxbTjHWw8EziwkwlJNkFUj3W60ypigLDRVz04vU+VRsJPi8Gub+FDhYUpuTm9xiEwRQ==", "dev": true }, "node_modules/elkjs": { @@ -8470,9 +9545,9 @@ } }, "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -9039,20 +10114,6 @@ "source-map": "~0.2.0" } }, - "node_modules/escodegen/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/escodegen/node_modules/estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -9222,13 +10283,14 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.4.tgz", - "integrity": "sha512-9xUpnedEmSfG57sN1UvWPiEhfJ8bPt0Wg2XysA7Mlc79iFGhmJtRUg9LxtkK81FhMUui0YuR2E8iUsVhePkh4A==", + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", "get-tsconfig": "^4.5.0", "globby": "^13.1.3", "is-core-module": "^2.11.0", @@ -9247,9 +10309,9 @@ } }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.3.tgz", - "integrity": "sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, "dependencies": { "dir-glob": "^3.0.1", @@ -9287,9 +10349,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -9341,6 +10403,16 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9362,6 +10434,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9420,40 +10504,108 @@ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=10" + "node": ">=7.0.0" } }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", @@ -9478,6 +10630,68 @@ "node": ">=4" } }, + "node_modules/eslint/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/espree": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", @@ -9502,16 +10716,17 @@ } }, "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "peer": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/esquery": { @@ -9648,19 +10863,6 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", @@ -9668,32 +10870,25 @@ "dev": true, "peer": true }, - "node_modules/eth-gas-reporter/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/eth-gas-reporter/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "peer": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/eth-gas-reporter/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/eth-gas-reporter/node_modules/chokidar": { @@ -9730,23 +10925,6 @@ "wrap-ansi": "^5.1.0" } }, - "node_modules/eth-gas-reporter/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/eth-gas-reporter/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, "node_modules/eth-gas-reporter/node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -9795,6 +10973,20 @@ "node": ">=0.8.0" } }, + "node_modules/eth-gas-reporter/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/eth-gas-reporter/node_modules/ethers": { "version": "4.0.49", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", @@ -10097,6 +11289,13 @@ "node": ">= 8" } }, + "node_modules/eth-gas-reporter/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "peer": true + }, "node_modules/eth-gas-reporter/node_modules/scrypt-js": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", @@ -10183,6 +11382,13 @@ "which": "bin/which" } }, + "node_modules/eth-gas-reporter/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true, + "peer": true + }, "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -11205,89 +12411,11 @@ "dev": true, "peer": true, "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/ghost-testrpc/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ghost-testrpc/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ghost-testrpc/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" }, - "engines": { - "node": ">=4" + "bin": { + "testrpc-sc": "index.js" } }, "node_modules/glob": { @@ -11320,6 +12448,26 @@ "node": ">= 6" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/global": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", @@ -11385,6 +12533,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globals/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globalthis": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", @@ -11545,22 +12705,22 @@ } }, "node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", + "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -11634,92 +12794,404 @@ "hardhat": "^2.0.2" } }, - "node_modules/hardhat-watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", - "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", - "dependencies": { - "chokidar": "^3.5.3" + "node_modules/hardhat-watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", + "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", + "dependencies": { + "chokidar": "^3.5.3" + }, + "peerDependencies": { + "hardhat": "^2.0.0" + } + }, + "node_modules/hardhat/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "dependencies": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "dependencies": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" }, - "peerDependencies": { - "hardhat": "^2.0.0" + "engines": { + "node": ">=14" } }, - "node_modules/hardhat/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/hardhat/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", "dependencies": { - "color-convert": "^1.9.0" + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=4" + "node": ">=14" } }, - "node_modules/hardhat/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/hardhat/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", "dependencies": { - "balanced-match": "^1.0.0" + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" } }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/hardhat/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/hardhat/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" + "node": ">=14" } }, - "node_modules/hardhat/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/hardhat/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, "node_modules/hardhat/node_modules/locate-path": { @@ -11736,17 +13208,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", @@ -11801,36 +13262,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/hardhat/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/hardhat/node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/hardhat/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -11886,41 +13317,6 @@ "semver": "bin/semver.js" } }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "node_modules/hardhat/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", @@ -12280,14 +13676,6 @@ "node": ">=4.0.0" } }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "engines": { - "node": ">=6" - } - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -12416,29 +13804,117 @@ "engines": { "node": ">=10" }, - "peerDependencies": { - "@types/react": ">=16.8.0", - "react": ">=16.8.0" + "peerDependencies": { + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/ink-spinner": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", + "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", + "dependencies": { + "cli-spinners": "^2.3.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ink": ">=3.0.5", + "react": ">=16.8.2" + } + }, + "node_modules/ink/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ink/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ink/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ink/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ink-spinner": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", - "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", + "node_modules/ink/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/ink/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "cli-spinners": "^2.3.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/ink/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" }, - "peerDependencies": { - "ink": ">=3.0.5", - "react": ">=16.8.2" + "engines": { + "node": ">=8" + } + }, + "node_modules/ink/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/ink/node_modules/type-fest": { @@ -12452,26 +13928,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ink/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -12647,9 +14103,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", "dependencies": { "has": "^1.0.3" }, @@ -13082,6 +14538,18 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -13123,6 +14591,15 @@ "js-graphs": "src/jsgraphs.js" } }, + "node_modules/js-sdsl": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", + "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -13134,18 +14611,21 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/jsbi": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", @@ -13490,6 +14970,62 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -13885,9 +15421,9 @@ } }, "node_modules/meow/node_modules/type-fest": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.7.2.tgz", - "integrity": "sha512-f9BHrLjRJ4MYkfOsnC/53PNDzZJcVo14MqLp2+hXE39p5bgwqohxR5hDZztwxlbxmIVuvC2EFAKrAkokq23PLA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", + "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", "dev": true, "engines": { "node": ">=14.16" @@ -13911,6 +15447,18 @@ "node": ">=12" } }, + "node_modules/meow/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -14063,14 +15611,14 @@ "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=10" } }, "node_modules/minimist": { @@ -14186,21 +15734,16 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "node_modules/mocha/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -14240,18 +15783,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -14279,11 +15810,17 @@ "node": ">=10" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "node_modules/mocha/node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", @@ -14324,32 +15861,11 @@ "node": ">=8" } }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mocha/node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/mocha/node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true }, "node_modules/mock-fs": { "version": "4.14.0", @@ -14365,9 +15881,9 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/multibase": { "version": "0.6.1", @@ -14465,10 +15981,9 @@ "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14477,9 +15992,9 @@ } }, "node_modules/napi-macros": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", - "integrity": "sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -14815,6 +16330,24 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -14908,6 +16441,12 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -14917,6 +16456,38 @@ "node": ">=8" } }, + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", @@ -15702,9 +17273,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", "engines": { "node": ">=6" } @@ -15849,9 +17420,9 @@ } }, "node_modules/react-devtools-core": { - "version": "4.27.4", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.4.tgz", - "integrity": "sha512-dvZjrAJjahd6NNl7dDwEk5TyHsWJxDpYL7VnD9jdEr98EEEsVhw9G8JDX54Nrb3XIIOBlJDpjo3AuBuychX9zg==", + "version": "4.27.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.5.tgz", + "integrity": "sha512-QJTriF1V4oyIenViCvM6qQuvcevQsp0sbKkHBZIQOij+AwY9DdOBY+dOeuymUqO5zV61CbmGxWsAIjeWlFS++w==", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -16005,6 +17576,30 @@ "node": ">=6.0.0" } }, + "node_modules/recursive-readdir/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/recursive-readdir/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/redent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", @@ -16033,6 +17628,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/redent/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/reduce-flatten": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", @@ -16225,17 +17835,16 @@ } }, "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -16591,18 +18200,15 @@ "dev": true, "peer": true }, - "node_modules/sc-istanbul/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "node_modules/sc-istanbul/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/sc-istanbul/node_modules/glob": { @@ -16632,6 +18238,47 @@ "node": ">=0.10.0" } }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sc-istanbul/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -16762,11 +18409,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, "node_modules/sentence-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", @@ -16790,6 +18432,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", @@ -16898,9 +18551,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.0.tgz", - "integrity": "sha512-QHsz8GgQIGKlRi24yFc6a6lN69Idnx634w49ay6+jA5yFh7a1UY+4Rp6HPx/L/1zcEDPEij8cIsiqR6bQsE5VQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -17011,6 +18664,18 @@ "url": "https://opencollective.com/sinon" } }, + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", @@ -17038,6 +18703,36 @@ "node": ">=8" } }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -17178,32 +18873,25 @@ "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "node_modules/solidity-coverage/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "peer": true, "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/solidity-coverage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "node_modules/solidity-coverage/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/solidity-coverage/node_modules/chokidar": { @@ -17233,29 +18921,12 @@ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/solidity-coverage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/solidity-coverage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } }, "node_modules/solidity-coverage/node_modules/debug": { "version": "3.2.6", @@ -17295,6 +18966,20 @@ "node": ">=0.8.0" } }, + "node_modules/solidity-coverage/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/solidity-coverage/node_modules/find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -17531,19 +19216,6 @@ "url": "https://opencollective.com/mochajs" } }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/solidity-coverage/node_modules/ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", @@ -17629,6 +19301,13 @@ "node": ">= 8" } }, + "node_modules/solidity-coverage/node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "peer": true + }, "node_modules/solidity-coverage/node_modules/string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", @@ -17668,16 +19347,16 @@ } }, "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "peer": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/solidity-coverage/node_modules/which": { @@ -17693,6 +19372,13 @@ "which": "bin/which" } }, + "node_modules/solidity-coverage/node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true, + "peer": true + }, "node_modules/solidity-coverage/node_modules/wrap-ansi": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", @@ -17962,16 +19648,27 @@ "peer": true }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" } }, "node_modules/string.prototype.trim": { @@ -18020,14 +19717,14 @@ } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/strip-bom": { @@ -18064,18 +19761,11 @@ } }, "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/strip-json-comments": { @@ -18113,14 +19803,17 @@ "dev": true }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -18391,6 +20084,48 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/table/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", @@ -18414,6 +20149,32 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -18505,6 +20266,28 @@ "node": ">=8" } }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/testrpc": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", @@ -18678,6 +20461,14 @@ "node": ">=0.8" } }, + "node_modules/tough-cookie/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -18691,25 +20482,91 @@ "engines": { "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ts-command-line-args": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.0.tgz", + "integrity": "sha512-Ff7Xt04WWCjj/cmPO9eWTJX3qpBZWuPWyQYG1vnxJao+alWWYjwJBc5aYz3h5p5dE08A6AnpkgiCtP/0KXXBYw==", + "dev": true, + "peer": true, + "dependencies": { + "@morgan-stanley/ts-mocking-bird": "^0.6.2", + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" + }, + "bin": { + "write-markdown": "dist/write-markdown.js" + } + }, + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/ts-command-line-args": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.4.2.tgz", - "integrity": "sha512-mJLQQBOdyD4XI/ZWQY44PIdYde47JhV2xl380O7twPkTQ+Y5vFDHsk8LOeXKuz7dVY5aDCfAzRarNfSqtKOkQQ==", + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "peer": true + }, + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "peer": true, "dependencies": { - "@morgan-stanley/ts-mocking-bird": "^0.6.2", - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" + "has-flag": "^4.0.0" }, - "bin": { - "write-markdown": "dist/write-markdown.js" + "engines": { + "node": ">=8" } }, "node_modules/ts-dedent": { @@ -18900,9 +20757,9 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, @@ -18947,6 +20804,17 @@ "typescript": ">=4.3.0" } }, + "node_modules/typechain/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "peer": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -18968,6 +20836,19 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/typechain/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "peer": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -19031,19 +20912,10 @@ "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" } }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.5.tgz", - "integrity": "sha512-OzOamaOmNBJZUv2qqY1OSWa+++4YPpOkLgkc0w30Oov5ufKlWWXnFUl0l4dgmSv5Shq/zRVkEOXAe2NaqO4l5Q==", + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -19118,9 +20990,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.0.tgz", - "integrity": "sha512-HOjK8l6a57b2ZGXOcUsI5NLfoTrfmbOl90ixJDl0AEFG4wgHNDQxtZy15/ZQp7HhjkpaGlp/eneMgtsu1dIlUA==", + "version": "5.21.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", + "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==", "dependencies": { "busboy": "^1.6.0" }, @@ -19169,9 +21041,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -19181,6 +21053,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { @@ -19188,7 +21064,7 @@ "picocolors": "^1.0.0" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -19854,10 +21730,9 @@ } }, "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" }, "node_modules/which-typed-array": { "version": "1.1.9", @@ -19888,59 +21763,44 @@ "string-width": "^1.0.2 || 2" } }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, + "node_modules/widest-line/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { - "ansi-regex": "^3.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { - "string-width": "^4.0.0" + "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" @@ -19998,10 +21858,9 @@ } }, "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -20016,6 +21875,68 @@ "node": ">=8" } }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -20034,9 +21955,9 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -20192,6 +22113,38 @@ "node": ">=8" } }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -20202,12 +22155,11 @@ } }, "node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -20256,7 +22208,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.12", + "version": "0.0.13", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -20339,7 +22291,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.12", + "version": "0.0.13", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -20353,7 +22305,7 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.12", + "@ignored/ignition-core": "^0.0.13", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -20394,7 +22346,7 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.12", + "@ignored/ignition-core": "^0.0.13", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" } @@ -20490,6 +22442,18 @@ "url": "https://opencollective.com/sinon" } }, + "packages/hardhat-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "packages/hardhat-plugin/node_modules/universalify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6588093f21..92c15157f0 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.13 - 2023-04-18 + +### Added + +- Support static calls in the Module API ([#85](https://github.com/NomicFoundation/ignition/issues/85)) +- Add command, `ignition-info`, to list previously deployed contracts ([#111](https://github.com/NomicFoundation/ignition/issues/111)) + ## 0.0.12 - 2023-04-04 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 047a39a12a..127379d8ea 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.12", + "version": "0.0.13", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 8aef03e139..5c3d98dae4 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.0.13 - 2023-04-18 + +### Added + +- Support static calls in the Module API ([#85](https://github.com/NomicFoundation/ignition/issues/85)) +- Add command, `ignition-info`, to list previously deployed contracts ([#111](https://github.com/NomicFoundation/ignition/issues/111)) + ## 0.0.12 - 2023-04-04 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 739a91d771..61d003bcab 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.12", + "version": "0.0.13", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -33,7 +33,7 @@ "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.12", + "@ignored/ignition-core": "^0.0.13", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -71,7 +71,7 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.12", + "@ignored/ignition-core": "^0.0.13", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.12.0" }, From 61a30587527ec5883da6500002354925999f928d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 27 Apr 2023 19:29:42 -0400 Subject: [PATCH 0296/1302] allow HardhatContracts for events --- .../src/internal/dsl/DeploymentBuilder.ts | 51 +++++-- .../src/internal/types/deploymentGraph.ts | 3 +- .../core/src/internal/types/executionGraph.ts | 3 +- packages/core/src/types/dsl.ts | 3 +- packages/core/src/types/future.ts | 11 -- packages/core/test/deploymentBuilder/event.ts | 139 ++++++++++++++++-- 6 files changed, 171 insertions(+), 39 deletions(-) diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts index 09cd6e3477..29308f65eb 100644 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -1,7 +1,6 @@ import type { AddressResolvable, ArtifactContract, - ArtifactFuture, ArtifactLibrary, CallableFuture, ContractCall, @@ -426,7 +425,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { } public event( - artifactFuture: ArtifactFuture, + contractFuture: DeploymentGraphFuture, eventName: string, { args, after }: AwaitOptions ): EventFuture { @@ -434,32 +433,54 @@ export class DeploymentBuilder implements IDeploymentBuilder { const eventFuture: EventFuture = { vertexId, - label: `${artifactFuture.label}/${eventName}`, + label: `${contractFuture.label}/${eventName}`, type: "await", subtype: "event", _future: true, params: {}, }; - if ( - artifactFuture.subtype !== "artifact" && - artifactFuture.subtype !== "deployed" - ) { - const future = artifactFuture as any; + let contract: CallableFuture; + if (isParameter(contractFuture)) { + const parameter = contractFuture; + const scope = parameter.scope; + const scopeData = this.graph.scopeData[scope]; + + if ( + scopeData === undefined || + scopeData.parameters === undefined || + !(parameter.label in scopeData.parameters) + ) { + throw new IgnitionError("Could not resolve contract from parameter"); + } + + contract = scopeData.parameters[parameter.label] as + | HardhatContract + | ArtifactContract + | DeployedContract; + } else if ( + isCallable(contractFuture) && + contractFuture.type === "contract" + ) { + contract = contractFuture; + } else { throw new IgnitionError( - `Not an artifact future ${future.label} (${future.type})` + `Not a callable future ${contractFuture.label} (${contractFuture.type})` ); } let abi: any[]; - let address: string | ArtifactContract | EventParamFuture; - if (artifactFuture.subtype === "artifact") { - abi = artifactFuture.artifact.abi; - address = artifactFuture; + let address: string | ArtifactContract | HardhatContract | EventParamFuture; + if (contract.subtype === "artifact") { + abi = contract.artifact.abi; + address = contract; + } else if (contract.subtype === "deployed") { + abi = contract.abi; + address = contract.address; } else { - abi = artifactFuture.abi; - address = artifactFuture.address; + abi = this.artifactMap[contract.contractName].abi; + address = contract; } eventFuture.params = this._parseEventParams(abi, eventFuture); diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index d7cf2fb8ae..9d620b4a9b 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -7,6 +7,7 @@ import { CallableFuture, DeploymentGraphFuture, EventParamFuture, + HardhatContract, ParameterFuture, Virtual, } from "../../types/future"; @@ -197,7 +198,7 @@ export interface EventVertex extends VertexDescriptor { type: "Event"; scopeAdded: string; abi: any[]; - address: string | ArtifactContract | EventParamFuture; + address: string | ArtifactContract | HardhatContract | EventParamFuture; event: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts index 8e70126bc2..b1a1de1bb6 100644 --- a/packages/core/src/internal/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -5,6 +5,7 @@ import { ArtifactContract, DeploymentGraphFuture, EventParamFuture, + HardhatContract, } from "../../types/future"; import { Artifact } from "../../types/hardhat"; @@ -157,7 +158,7 @@ export interface StaticContractCallExecutionVertex extends VertexDescriptor { export interface AwaitedEventExecutionVertex extends VertexDescriptor { type: "AwaitedEvent"; abi: any[]; - address: string | ArtifactContract | EventParamFuture; + address: string | ArtifactContract | HardhatContract | EventParamFuture; event: string; args: ArgValue[]; } diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index bc51b1cffa..04645dc017 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -3,7 +3,6 @@ import { BigNumber } from "ethers"; import { AddressResolvable, ArtifactContract, - ArtifactFuture, ArtifactLibrary, ContractCall, DeployedContract, @@ -132,7 +131,7 @@ export interface IDeploymentBuilder { * @alpha */ event( - contractFuture: ArtifactFuture, + contractFuture: DeploymentGraphFuture, eventName: string, options: AwaitOptions ): EventFuture; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 345c60a83f..2c0bae9c63 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -215,17 +215,6 @@ export interface ProxyFuture { _future: true; } -/** - * A future representing an artifact deployment or an already existing deployed - * contract. - * - * @privateRemarks - * TODO: is this needed? - * - * @alpha - */ -export type ArtifactFuture = ArtifactContract | DeployedContract; - /** * A future representing the address of a deployed Contract. * diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts index 1bfe6bed10..84921b1a89 100644 --- a/packages/core/test/deploymentBuilder/event.ts +++ b/packages/core/test/deploymentBuilder/event.ts @@ -8,10 +8,10 @@ import { isArtifactContract, isAwaitedEvent, isCall, + isHardhatContract, } from "../../src/internal/utils/guards"; import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; -import { ArtifactContract } from "../../src/types/future"; import { getDependenciesForVertex, @@ -72,16 +72,22 @@ describe("deployment builder - await event", () => { before(() => { const eventModule = buildModule("event", (m: IDeploymentBuilder) => { const testContract = m.contract("Test", artifact); + const testContract2 = m.contract("Token"); const call = m.call(testContract, "test", { args: [] }); - const event = m.event(testContract as ArtifactContract, "SomeEvent", { + const event = m.event(testContract, "SomeEvent", { args: [testContract], after: [call], }); + const event2 = m.event(testContract2, "SomeEvent", { + args: [testContract2], + after: [call], + }); + m.call(testContract, "verify", { - args: [event.params.value], + args: [event.params.value, event2.params.value], }); return {}; @@ -92,7 +98,7 @@ describe("deployment builder - await event", () => { { chainId: 31337, accounts: [], - artifacts: [], + artifacts: [artifact], } ); @@ -107,8 +113,8 @@ describe("deployment builder - await event", () => { assert.isDefined(deploymentGraph); }); - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); + it("should have six nodes", () => { + assert.equal(deploymentGraph.vertexes.size, 6); }); it("should have the contract node Test", () => { @@ -122,6 +128,17 @@ describe("deployment builder - await event", () => { assert(isArtifactContract(depNode)); }); + it("should have the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Token"); + assert(isHardhatContract(depNode)); + }); + it("should have the call node Test/test", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); @@ -147,6 +164,20 @@ describe("deployment builder - await event", () => { assert(isAwaitedEvent(depNode)); }); + it("should have the await event node Token/SomeEvent", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/SomeEvent" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + assert.equal(depNode?.label, "Token/SomeEvent"); + assert(isAwaitedEvent(depNode)); + }); + it("should have the call node Test/verify", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); @@ -170,6 +201,18 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(deps, []); }); + it("should show no dependencies for the contract node Token", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, []); + }); + it("should show one dependency for the call node Test/test", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); @@ -206,15 +249,41 @@ describe("deployment builder - await event", () => { label: "Test", type: "", }, + { + id: 2, + label: "Test/test", + type: "", + }, + ]); + }); + + it("should show two dependencies for the event node Token/SomeEvent", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/SomeEvent" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + const deps = getDependenciesForVertex(deploymentGraph, depNode); + + assert.deepStrictEqual(deps, [ { id: 1, + label: "Token", + type: "", + }, + { + id: 2, label: "Test/test", type: "", }, ]); }); - it("should show two dependencies for the call node Test/verify", () => { + it("should show three dependencies for the call node Test/verify", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); if (depNode === undefined) { @@ -230,10 +299,15 @@ describe("deployment builder - await event", () => { type: "", }, { - id: 2, + id: 3, label: "Test/SomeEvent", type: "", }, + { + id: 4, + label: "Token/SomeEvent", + type: "", + }, ]); }); @@ -251,6 +325,20 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(depNode.args, []); }); + it("should record the argument list for the contract node Token as empty", () => { + const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isHardhatContract(depNode)) { + return assert.fail("Not a hardhat contract dependency node"); + } + + assert.deepStrictEqual(depNode.args, []); + }); + it("should record the argument list for the call node Test/test as empty", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); @@ -291,6 +379,32 @@ describe("deployment builder - await event", () => { ]); }); + it("should record the argument list for the event node Token/SomeEvent", () => { + const depNode = getDeploymentVertexByLabel( + deploymentGraph, + "Token/SomeEvent" + ); + + if (depNode === undefined) { + return assert.isDefined(depNode); + } + + if (!isAwaitedEvent(depNode)) { + return assert.fail("Not an awaited event dependency node"); + } + + assert.deepStrictEqual(depNode.args, [ + { + vertexId: 1, + contractName: "Token", + label: "Token", + type: "contract", + subtype: "hardhat", + _future: true, + }, + ]); + }); + it("should record the argument list for the call node Test/verify", () => { const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); @@ -304,7 +418,14 @@ describe("deployment builder - await event", () => { assert.deepStrictEqual(depNode.args, [ { - vertexId: 2, + vertexId: 3, + label: "value", + type: "eventParam", + subtype: "uint256", + _future: true, + }, + { + vertexId: 4, label: "value", type: "eventParam", subtype: "uint256", From 5de4b0339186077152f359ebfc7f2fb7662ad06a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 27 Apr 2023 20:14:59 -0400 Subject: [PATCH 0297/1302] remove library arg validation and remove library from callable future --- docs/creating-modules-for-deployment.md | 2 +- .../src/internal/dsl/DeploymentBuilder.ts | 20 +++++----- .../src/internal/types/deploymentGraph.ts | 6 +-- packages/core/src/internal/utils/guards.ts | 11 ----- .../internal/validation/dispatch/helpers.ts | 6 +-- .../dispatch/validateArtifactLibrary.ts | 13 ------ .../validation/dispatch/validateCall.ts | 4 +- .../validation/dispatch/validateEvent.ts | 4 +- .../dispatch/validateHardhatLibrary.ts | 14 ------- .../validation/dispatch/validateStaticCall.ts | 4 +- packages/core/src/types/future.ts | 10 +---- .../core/test/deploymentBuilder/parameters.ts | 6 +-- .../core/test/deploymentBuilder/useModule.ts | 10 ++++- packages/core/test/validation.ts | 40 ------------------- 14 files changed, 35 insertions(+), 115 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 96c0d55690..e6c8a46022 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -325,7 +325,7 @@ module.exports = buildModule("`TEST` registrar", (m) => { Calls to `useModule` memoize the results object, assuming the same parameters are passed. Multiple calls to the same module with different parameters are banned. -Only `CallableFuture` types can be returned when building a module, so contracts or libraries (not calls). +Only contract or library types can be returned when building a module. ## Module parameters diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts index 29308f65eb..94f0072a1d 100644 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -2,7 +2,6 @@ import type { AddressResolvable, ArtifactContract, ArtifactLibrary, - CallableFuture, ContractCall, ContractFuture, DependableFuture, @@ -48,7 +47,6 @@ import { import { assertModuleReturnTypes, isArtifact, - isCallable, isContract, isDependable, isFuture, @@ -327,7 +325,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - let contract: CallableFuture; + let contract: ContractFuture; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -346,11 +344,11 @@ export class DeploymentBuilder implements IDeploymentBuilder { | HardhatContract | ArtifactContract | DeployedContract; - } else if (isCallable(contractFuture)) { + } else if (isContract(contractFuture)) { contract = contractFuture; } else { throw new IgnitionError( - `Not a callable future ${contractFuture.label} (${contractFuture.type})` + `Not a contract future ${contractFuture.label} (${contractFuture.type})` ); } @@ -382,7 +380,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - let contract: CallableFuture; + let contract: ContractFuture; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -401,11 +399,11 @@ export class DeploymentBuilder implements IDeploymentBuilder { | HardhatContract | ArtifactContract | DeployedContract; - } else if (isCallable(contractFuture)) { + } else if (isContract(contractFuture)) { contract = contractFuture; } else { throw new IgnitionError( - `Not a callable future ${contractFuture.label} (${contractFuture.type})` + `Not a contract future ${contractFuture.label} (${contractFuture.type})` ); } @@ -440,7 +438,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { params: {}, }; - let contract: CallableFuture; + let contract: ContractFuture; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -460,13 +458,13 @@ export class DeploymentBuilder implements IDeploymentBuilder { | ArtifactContract | DeployedContract; } else if ( - isCallable(contractFuture) && + isContract(contractFuture) && contractFuture.type === "contract" ) { contract = contractFuture; } else { throw new IgnitionError( - `Not a callable future ${contractFuture.label} (${contractFuture.type})` + `Not a contract future ${contractFuture.label} (${contractFuture.type})` ); } diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 9d620b4a9b..390590bedb 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -4,7 +4,7 @@ import { InternalParamValue } from "../../types/dsl"; import { AddressResolvable, ArtifactContract, - CallableFuture, + ContractFuture, DeploymentGraphFuture, EventParamFuture, HardhatContract, @@ -150,7 +150,7 @@ export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { export interface CallDeploymentVertex extends VertexDescriptor { type: "Call"; scopeAdded: string; - contract: CallableFuture; + contract: ContractFuture; method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; @@ -166,7 +166,7 @@ export interface CallDeploymentVertex extends VertexDescriptor { export interface StaticCallDeploymentVertex extends VertexDescriptor { type: "StaticCall"; scopeAdded: string; - contract: CallableFuture; + contract: ContractFuture; method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 829cbbcfbb..41992d23df 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -1,5 +1,4 @@ import type { - CallableFuture, ContractFuture, DependableFuture, DeploymentGraphFuture, @@ -130,16 +129,6 @@ export function isParameter( return future.type === "parameter"; } -export function isCallable( - future: DeploymentGraphFuture -): future is CallableFuture { - if (isProxy(future)) { - return isCallable(future.value); - } - - return future.type === "contract" || future.type === "library"; -} - export function isContract( future: DeploymentGraphFuture ): future is ContractFuture { diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts index ee1c996120..ce2b9b9fed 100644 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -1,4 +1,4 @@ -import type { CallableFuture } from "../../../types/future"; +import type { ContractFuture } from "../../../types/future"; import type { Services } from "../../types/services"; import { IgnitionError } from "../../../errors"; @@ -6,8 +6,8 @@ import { CallPoints, DeploymentGraphVertex } from "../../types/deploymentGraph"; import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; import { resolveProxyValue } from "../../utils/proxy"; -export async function resolveArtifactForCallableFuture( - givenFuture: CallableFuture, +export async function resolveArtifactForContractFuture( + givenFuture: ContractFuture, { services }: { services: Services } ): Promise { const future = resolveProxyValue(givenFuture); diff --git a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts index 9f7207eaca..7a28b6cea5 100644 --- a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts +++ b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts @@ -34,19 +34,6 @@ export async function validateArtifactLibrary( ); } - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(vertex.artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return buildValidationError( - vertex, - `The constructor of the library '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - context.callPoints - ); - } - return { _kind: VertexResultEnum.SUCCESS, result: undefined, diff --git a/packages/core/src/internal/validation/dispatch/validateCall.ts b/packages/core/src/internal/validation/dispatch/validateCall.ts index b1567afb75..0211383f88 100644 --- a/packages/core/src/internal/validation/dispatch/validateCall.ts +++ b/packages/core/src/internal/validation/dispatch/validateCall.ts @@ -11,7 +11,7 @@ import { isParameter } from "../../utils/guards"; import { buildValidationError, - resolveArtifactForCallableFuture, + resolveArtifactForContractFuture, } from "./helpers"; export async function validateCall( @@ -37,7 +37,7 @@ export async function validateCall( const contractName = vertex.contract.label; - const artifactAbi = await resolveArtifactForCallableFuture( + const artifactAbi = await resolveArtifactForContractFuture( vertex.contract, context ); diff --git a/packages/core/src/internal/validation/dispatch/validateEvent.ts b/packages/core/src/internal/validation/dispatch/validateEvent.ts index 9c8d476e6a..9d8e73f9fa 100644 --- a/packages/core/src/internal/validation/dispatch/validateEvent.ts +++ b/packages/core/src/internal/validation/dispatch/validateEvent.ts @@ -10,7 +10,7 @@ import { import { buildValidationError, - resolveArtifactForCallableFuture, + resolveArtifactForContractFuture, } from "./helpers"; export async function validateEvent( @@ -30,7 +30,7 @@ export async function validateEvent( artifactAbi = vertex.abi; } else if (vertex.address.type === "contract") { - artifactAbi = await resolveArtifactForCallableFuture(vertex.address, { + artifactAbi = await resolveArtifactForContractFuture(vertex.address, { services, }); diff --git a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts index 7c7e4269d7..939b7d5b2b 100644 --- a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts +++ b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts @@ -35,20 +35,6 @@ export async function validateHardhatLibrary( ); } - const artifact = await services.artifacts.getArtifact(vertex.libraryName); - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return buildValidationError( - vertex, - `The constructor of the library '${vertex.libraryName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - callPoints - ); - } - return { _kind: VertexResultEnum.SUCCESS, result: undefined, diff --git a/packages/core/src/internal/validation/dispatch/validateStaticCall.ts b/packages/core/src/internal/validation/dispatch/validateStaticCall.ts index 5e9ecb1d03..179f3f8174 100644 --- a/packages/core/src/internal/validation/dispatch/validateStaticCall.ts +++ b/packages/core/src/internal/validation/dispatch/validateStaticCall.ts @@ -10,7 +10,7 @@ import { import { buildValidationError, - resolveArtifactForCallableFuture, + resolveArtifactForContractFuture, } from "./helpers"; export async function validateStaticCall( @@ -28,7 +28,7 @@ export async function validateStaticCall( const contractName = vertex.contract.label; - const artifactAbi = await resolveArtifactForCallableFuture( + const artifactAbi = await resolveArtifactForContractFuture( vertex.contract, context ); diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 2c0bae9c63..1c52f881be 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -232,20 +232,14 @@ export type ContractFuture = */ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; -/** - * The future representing the value of calling a smart contract method. - * - * @alpha - */ -export type CallableFuture = ContractFuture | LibraryFuture; - /** * A future value from an on-chain action that. * * @alpha */ export type DependableFuture = - | CallableFuture + | ContractFuture + | LibraryFuture | ContractCall | StaticContractCall | Virtual diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts index 9aa95b31ae..3dea57e5bd 100644 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ b/packages/core/test/deploymentBuilder/parameters.ts @@ -6,7 +6,7 @@ import { assert } from "chai"; import { buildModule } from "../../src/buildModule"; import { IgnitionError } from "../../src/errors"; import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { isCallable } from "../../src/internal/utils/guards"; +import { isContract } from "../../src/internal/utils/guards"; import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; @@ -32,8 +32,8 @@ describe("deployment builder - parameters", function () { parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, }); - if (!isCallable(token)) { - throw new IgnitionError("Not callable"); + if (!isContract(token)) { + throw new IgnitionError("Not contract"); } return { token }; diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 31ef3ac011..58cfebbb3a 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -10,9 +10,10 @@ import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract, - CallableFuture, + ContractFuture, EventFuture, HardhatContract, + LibraryFuture, ProxyFuture, Virtual, } from "../../src/types/future"; @@ -537,7 +538,12 @@ describe("deployment builder - useModule", () => { describe("returning non contract futures from within a module", () => { // @ts-ignore let returnsWrongFutureTypeModule: Module<{ - token: CallableFuture | Virtual | ProxyFuture | EventFuture; + token: + | ContractFuture + | LibraryFuture + | Virtual + | ProxyFuture + | EventFuture; }>; before(() => { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index 341b3973b1..b5eee20e35 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -107,23 +107,6 @@ describe("Validation", () => { assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); }); - it("should not validate a artifact library deploy with the wrong number of args", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", exampleArtifact, { - args: [1, 2, 3], - }); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "The constructor of the library 'Example' expects 0 arguments but 3 were given" - ); - }); - it("should not validate a artifact library deploy with a non-address `from`", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", exampleArtifact, { @@ -1017,29 +1000,6 @@ describe("Validation", () => { ); }); - it("should not validate a library deployed with the wrong number of args", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", { args: [1, 2] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "The constructor of the library 'Example' expects 0 arguments but 2 were given" - ); - }); - it("should not validate a library deployed from an invalid address", async () => { const singleModule = buildModule("single", (m: IDeploymentBuilder) => { const example = m.library("Example", { args: [], from: 1 as any }); From 107940dc0fc2056914ff41c23dd262f5de92a990 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 May 2023 10:07:12 +0100 Subject: [PATCH 0298/1302] fix: enforce same hardhat version To avoid the examples moving out of sync with plugin use "^2.14.0" everywhere. --- examples/create2/package.json | 2 +- examples/ens/package.json | 2 +- examples/multisig/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/package.json | 2 +- examples/uniswap/package.json | 2 +- package-lock.json | 5090 +++++++++----------------- packages/hardhat-plugin/package.json | 4 +- 8 files changed, 1725 insertions(+), 3381 deletions(-) diff --git a/examples/create2/package.json b/examples/create2/package.json index c8ac04fe81..18f0be179f 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 68c3d7264e..adfaee5c81 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/multisig/package.json b/examples/multisig/package.json index cc055bb386..8aed6268a3 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" }, "dependencies": { "@openzeppelin/contracts": "^4.3.2" diff --git a/examples/sample/package.json b/examples/sample/package.json index 7f0e3b02e6..b1b0f170d8 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" } } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index a2d9532e7f..461b4f0ddb 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -12,6 +12,6 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" } } diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index b780956c63..e9dcc770fd 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" }, "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", diff --git a/package-lock.json b/package-lock.json index ddbbd28656..1b2b6dcd59 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,208 +37,149 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "hardhat": "^2.14.0" } }, - "examples/create2/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, + "examples/ens": { + "name": "@nomicfoundation/ignition-ens-example", + "version": "0.0.13", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" + "@ensdomains/ens-contracts": "0.0.11" }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" } }, - "examples/create2/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "examples/multisig": { + "name": "@nomicfoundation/ignition-example-multisig", + "version": "0.0.13", "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" + "@openzeppelin/contracts": "^4.3.2" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" } }, - "examples/create2/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, + "examples/sample": { + "name": "@nomicfoundation/ignition-sample-example", + "version": "0.0.13", + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" + } + }, + "examples/ts-sample": { + "name": "@nomicfoundation/ignition-ts-sample-example", + "version": "0.0.13", + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" + } + }, + "examples/uniswap": { + "name": "@nomicfoundation/ignition-uniswap-example", + "version": "0.0.13", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" + "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", + "@uniswap/swap-router-contracts": "1.1.0", + "@uniswap/v3-core": "1.0.0", + "@uniswap/v3-periphery": "1.1.1", + "@uniswap/v3-sdk": "3.9.0", + "@uniswap/v3-staker": "1.0.2", + "bignumber.js": "9.1.0", + "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" } }, - "examples/create2/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "examples/uniswap/node_modules/@openzeppelin/contracts": { + "version": "3.4.2-solc-0.7", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.0.0" } }, - "examples/create2/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" - }, + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/create2/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@babel/core": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", + "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-compilation-targets": "^7.21.4", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.4", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.4", + "@babel/types": "^7.21.4", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "examples/create2/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "examples/create2/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/@babel/core/node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { - "path-parse": "^1.0.6" + "@babel/highlight": "^7.18.6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "examples/create2/node_modules/semver": { + "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", @@ -247,2758 +188,1575 @@ "semver": "bin/semver.js" } }, - "examples/ens": { - "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.13", - "dependencies": { - "@ensdomains/ens-contracts": "0.0.11" - }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" - } - }, - "examples/ens/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "node_modules/@babel/generator": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", + "semver": "^6.3.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "@babel/core": "^7.0.0" } }, - "examples/ens/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dev": true, "dependencies": { - "p-locate": "^5.0.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "@babel/types": "^7.18.6" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@babel/helper-module-imports": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@babel/types": "^7.21.4" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "@babel/types": "^7.20.2" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "examples/ens/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "dev": true, - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "examples/ens/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": ">=6.9.0" } }, - "examples/multisig": { - "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.13", + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, "dependencies": { - "@openzeppelin/contracts": "^4.3.2" + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dev": true, "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "dev": true, "bin": { - "hardhat": "internal/cli/bootstrap.js" + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "node": ">=6.0.0" } }, - "examples/multisig/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", + "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", "dependencies": { - "p-locate": "^5.0.0" + "regenerator-runtime": "^0.13.11" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dev": true, "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/@babel/template/node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "@babel/highlight": "^7.18.6" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/@babel/traverse": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", "dev": true, "dependencies": { - "yocto-queue": "^0.1.0" + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/@babel/traverse/node_modules/@babel/code-frame": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dev": true, "dependencies": { - "p-limit": "^3.0.2" + "@babel/highlight": "^7.18.6" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "examples/multisig/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "node_modules/@babel/types": { + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dev": true, "dependencies": { - "path-parse": "^1.0.6" + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=6.9.0" } }, - "examples/multisig/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "dev": true + }, + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + }, + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" } }, - "examples/sample": { - "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.13", - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" } }, - "examples/sample/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "node": ">=12" } }, - "examples/sample/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "examples/sample/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" } }, - "examples/sample/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@ensdomains/buffer": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@nomiclabs/hardhat-truffle5": "^2.0.0" } }, - "examples/sample/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" } }, - "examples/sample/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/@ensdomains/ens-contracts": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", "dependencies": { - "p-limit": "^3.0.2" - }, + "@ensdomains/buffer": "^0.0.13", + "@ensdomains/solsha1": "0.0.3", + "@openzeppelin/contracts": "^4.1.0", + "dns-packet": "^5.3.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/sample/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "examples/sample/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "examples/sample/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@ensdomains/ens/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dependencies": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "examples/ts-sample": { - "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.13", - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "node_modules/@ensdomains/ens/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "examples/ts-sample/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "number-is-nan": "^1.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ensdomains/ens/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dependencies": { - "p-locate": "^5.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/@ensdomains/ens/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dependencies": { - "yocto-queue": "^0.1.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dependencies": { - "p-limit": "^3.0.2" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dependencies": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "examples/ts-sample/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { - "path-parse": "^1.0.6" + "glob": "^7.1.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "rimraf": "bin.js" } }, - "examples/ts-sample/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { - "semver": "bin/semver.js" + "semver": "bin/semver" } }, - "examples/uniswap": { - "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.13", + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "dependencies": { - "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", - "@uniswap/swap-router-contracts": "1.1.0", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.1.1", - "@uniswap/v3-sdk": "3.9.0", - "@uniswap/v3-staker": "1.0.2", - "bignumber.js": "9.1.0", - "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "2.13.0" + "bin": { + "solcjs": "solcjs" } }, - "examples/uniswap/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" - }, - "examples/uniswap/node_modules/hardhat": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.13.0.tgz", - "integrity": "sha512-ZlzBOLML1QGlm6JWyVAG8lVTEAoOaVm1in/RU2zoGAnYEoD1Rp4T+ZMvrLNhHaaeS9hfjJ1gJUBfiDr4cx+htQ==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "^4.0.0", - "@nomicfoundation/ethereumjs-blockchain": "^6.0.0", - "@nomicfoundation/ethereumjs-common": "^3.0.0", - "@nomicfoundation/ethereumjs-evm": "^1.0.0", - "@nomicfoundation/ethereumjs-rlp": "^4.0.0", - "@nomicfoundation/ethereumjs-statemanager": "^1.0.0", - "@nomicfoundation/ethereumjs-trie": "^5.0.0", - "@nomicfoundation/ethereumjs-tx": "^4.0.0", - "@nomicfoundation/ethereumjs-util": "^8.0.0", - "@nomicfoundation/ethereumjs-vm": "^6.0.0", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } + "node": ">=0.10.0" } }, - "examples/uniswap/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "p-locate": "^5.0.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/uniswap/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "is-utf8": "^0.2.0" }, "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=0.10.0" } }, - "examples/uniswap/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "examples/uniswap/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, - "examples/uniswap/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } }, - "examples/uniswap/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "dependencies": { + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" } }, - "examples/uniswap/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dev": true, + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" + }, + "node_modules/@ensdomains/solsha1": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", + "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "hash-test-vectors": "^1.3.2" } }, - "examples/uniswap/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], "dev": true, - "bin": { - "semver": "bin/semver.js" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/@eslint/eslintrc/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=6.9.0" + "node": ">=4" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6.9.0" + "node": "*" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, + "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@babel/types": "^7.21.4" - }, - "engines": { - "node": ">=6.9.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, + "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", "dependencies": { - "@babel/types": "^7.20.2" - }, - "engines": { - "node": ">=6.9.0" + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, + "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, + "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" }, "engines": { - "node": ">=6.9.0" + "node": ">=10.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" + "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "node_modules/@ethersproject/abstract-provider": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, + "node_modules/@ethersproject/abstract-signer": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, + "node_modules/@ethersproject/address": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bignumber": "^5.6.2", + "@ethersproject/bytes": "^5.6.1", + "@ethersproject/keccak256": "^5.6.1", + "@ethersproject/logger": "^5.6.0", + "@ethersproject/rlp": "^5.6.1" } }, - "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, + "node_modules/@ethersproject/base64": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", - "dev": true - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, + "node_modules/@ethersproject/bytes": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, + "node_modules/@ethersproject/constants": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@ensdomains/address-encoder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@ensdomains/buffer": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", - "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@nomiclabs/hardhat-truffle5": "^2.0.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", + "node_modules/@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ensdomains/ens-contracts": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", - "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@ensdomains/buffer": "^0.0.13", - "@ensdomains/solsha1": "0.0.3", - "@openzeppelin/contracts": "^4.1.0", - "dns-packet": "^5.3.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "node_modules/@ethersproject/keccak256": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" } }, - "node_modules/@ensdomains/ens/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } + "node_modules/@ethersproject/logger": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ] }, - "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/@ethersproject/networks": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "node_modules/@ethersproject/properties": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" } }, - "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" + "node": ">=8.3.0" }, - "bin": { - "rimraf": "bin.js" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "node_modules/@ethersproject/rlp": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "node_modules/@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", + "elliptic": "6.5.4", + "hash.js": "1.1.7" } }, - "node_modules/@ensdomains/ens/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/@ensdomains/ensjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts" - }, - "node_modules/@ensdomains/solsha1": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", - "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", - "dependencies": { - "hash-test-vectors": "^1.3.2" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/rlp": "^5.6.1" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/strings": { @@ -3090,85 +1848,9 @@ } }, "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -3180,848 +1862,534 @@ } ], "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", "@ethersproject/logger": "^5.7.0", "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@ignored/hardhat-ignition": { - "resolved": "packages/hardhat-plugin", - "link": true - }, - "node_modules/@ignored/ignition-core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "nyc": ">=15" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "devOptional": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, + "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "node_modules/@ethersproject/web": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.34.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", - "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.26.4", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2", - "@rushstack/rig-package": "0.3.18", - "@rushstack/ts-command-line": "4.13.2", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.22.1", - "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.8.4" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" }, - "bin": { - "api-extractor": "bin/api-extractor" + "engines": { + "node": ">=10.10.0" } }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", - "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4.2.0" + "node": "*" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } + "node_modules/@ignored/hardhat-ignition": { + "resolved": "packages/hardhat-plugin", + "link": true }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/@ignored/ignition-core": { + "resolved": "packages/core", + "link": true }, - "node_modules/@morgan-stanley/ts-mocking-bird": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", - "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "peer": true, "dependencies": { - "lodash": "^4.17.16", - "uuid": "^7.0.3" - }, - "peerDependencies": { - "jasmine": "2.x || 3.x || 4.x", - "jest": "26.x || 27.x || 28.x", - "typescript": ">=4.2" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, - "peerDependenciesMeta": { - "jasmine": { - "optional": true - }, - "jest": { - "optional": true - } + "engines": { + "node": ">=8" } }, - "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=6" } }, - "node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">= 8" + "node": ">=4" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">= 8" + "node": ">=8" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">= 8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-4.2.2.tgz", - "integrity": "sha512-atjpt4gc6ZGZUPHBAQaUJsm1l/VCo7FmyQ780tMGO8QStjLdhz09dXynmhwVTy5YbRr0FOh/uX3QaEM0yIB2Zg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-6.2.2.tgz", - "integrity": "sha512-6AIB2MoTEPZJLl6IRKcbd8mUmaBAQ/NMe3O7OsAOIiDjMNPPH5KaUQiLfbVlegT4wKIg/GOsFH7XlH2KDVoJNg==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-ethash": "2.0.5", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "engines": { + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-3.1.2.tgz", - "integrity": "sha512-JAEBpIua62dyObHM9KI2b4wHZcRQYYge9gxiygTWa3lNCr2zo+K0TbypDpgiNij5MCGNWP1eboNfNfx1a3vkvA==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-util": "8.0.6", - "crc-32": "^1.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-2.0.5.tgz", - "integrity": "sha512-xlLdcICGgAYyYmnI3r1t0R5fKGBJNDQSOQxXNjVO99JmxJIdXR5MgPo5CSJO1RpyzKOgzi3uIFn8agv564dZEQ==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" + "@istanbuljs/schema": "^0.1.2" }, "engines": { - "node": ">=14" + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { + "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "engines": { + "node": ">=8" } }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-1.3.2.tgz", - "integrity": "sha512-I00d4MwXuobyoqdPe/12dxUQxTYzX8OckSaWsMcWAfQhgVDvBx6ffPyP/w1aL0NW7MjyerySPcSVfDJAMHjilw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { - "node": ">=14" + "node": ">=6.0.0" } }, - "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-4.0.3.tgz", - "integrity": "sha512-DZMzB/lqPK78T6MluyXqtlRmOMcsZbTTbbEyAjo0ncaff2mqu/k8a79PBcyvpgAhWD/R59Fjq/x3ro5Lof0AtA==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, - "bin": { - "rlp": "bin/rlp" + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" }, "engines": { - "node": ">=14" + "node": ">=12.0.0" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-1.0.5.tgz", - "integrity": "sha512-CAhzpzTR5toh/qOJIZUUOnWekUXuRqkkzaGAQrVcF457VhtCmr+ddZjjK50KNZ524c1XP8cISguEVNqJ6ij1sA==", + "node_modules/@microsoft/api-extractor": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1" + "@microsoft/api-extractor-model": "7.26.4", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2", + "@rushstack/rig-package": "0.3.18", + "@rushstack/ts-command-line": "4.13.2", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@microsoft/api-extractor-model": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2" } }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-5.0.5.tgz", - "integrity": "sha512-+8sNZrXkzvA1NH5F4kz5RSYl1I6iaRz7mAZRsyxOm0IVY4UaP43Ofvfp/TwOalFunurQrYB5pRO40+8FBcxFMA==", + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=14" + "node": ">=4.2.0" } }, - "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" } }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-4.1.2.tgz", - "integrity": "sha512-emJBJZpmTdUa09cqxQqHaysbBI9Od353ZazeH7WgPb35miMgNY6mb7/3vBA98N5lUW/rgkiItjX0KZfIzihSoQ==", + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "ethereum-cryptography": "0.1.3" + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" }, - "engines": { - "node": ">=14" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@morgan-stanley/ts-mocking-bird": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", + "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", "dev": true, + "peer": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "lodash": "^4.17.16", + "uuid": "^7.0.3" + }, + "peerDependencies": { + "jasmine": "2.x || 3.x || 4.x", + "jest": "26.x || 27.x || 28.x", + "typescript": ">=4.2" + }, + "peerDependenciesMeta": { + "jasmine": { + "optional": true + }, + "jest": { + "optional": true + } } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-8.0.6.tgz", - "integrity": "sha512-jOQfF44laa7xRfbfLXojdlcpkvxeHrE2Xu7tSeITsWFgoII163MzjOwFEzSNozHYieFysyoEMhCdP+NY5ikstw==", + "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", + "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=14" + "peer": true, + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-6.4.2.tgz", - "integrity": "sha512-PRTyxZMP6kx+OdAzBhuH1LD2Yw+hrSpaytftvaK//thDy2OI07S0nrTdbrdk7b8ZVPAc9H9oTwFBl3/wJ3w15g==", + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "dependencies": { - "@nomicfoundation/ethereumjs-block": "4.2.2", - "@nomicfoundation/ethereumjs-blockchain": "6.2.2", - "@nomicfoundation/ethereumjs-common": "3.1.2", - "@nomicfoundation/ethereumjs-evm": "1.3.2", - "@nomicfoundation/ethereumjs-rlp": "4.0.3", - "@nomicfoundation/ethereumjs-statemanager": "1.0.5", - "@nomicfoundation/ethereumjs-trie": "5.0.5", - "@nomicfoundation/ethereumjs-tx": "4.1.2", - "@nomicfoundation/ethereumjs-util": "8.0.6", - "@types/async-eventemitter": "^0.2.1", - "async-eventemitter": "^0.2.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "functional-red-black-tree": "^1.0.1", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, "engines": { - "node": ">=14" + "node": ">= 8" } }, - "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { @@ -5665,12 +4033,6 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, - "node_modules/@types/async-eventemitter": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@types/async-eventemitter/-/async-eventemitter-0.2.1.tgz", - "integrity": "sha512-M2P4Ng26QbAeITiH7w1d7OxtldgfAe0wobpyJzVK/XOb0cUGKU2R4pfAhqcJBXAe2ife5ZOhSv4wk7p+ffURtg==", - "dev": true - }, "node_modules/@types/bignumber.js": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", @@ -7019,24 +5381,6 @@ "node": ">=8" } }, - "node_modules/async": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", - "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/async-eventemitter": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/async-eventemitter/-/async-eventemitter-0.2.4.tgz", - "integrity": "sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw==", - "dev": true, - "dependencies": { - "async": "^2.4.0" - } - }, "node_modules/async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -22331,7 +20675,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.12.0", + "hardhat": "^2.14.0", "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", @@ -22348,7 +20692,7 @@ "peerDependencies": { "@ignored/ignition-core": "^0.0.13", "@nomiclabs/hardhat-ethers": "^2.0.2", - "hardhat": "^2.12.0" + "hardhat": "^2.14.0" } }, "packages/hardhat-plugin/node_modules/@sinonjs/commons": { diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 61d003bcab..98f35efa35 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -59,7 +59,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.12.0", + "hardhat": "^2.14.0", "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", @@ -73,7 +73,7 @@ "peerDependencies": { "@ignored/ignition-core": "^0.0.13", "@nomiclabs/hardhat-ethers": "^2.0.2", - "hardhat": "^2.12.0" + "hardhat": "^2.14.0" }, "dependencies": { "debug": "^4.3.2", From 1b9743e17c7fc8c0b010329cb91813c1c4f6df04 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 26 Apr 2023 18:40:43 -0300 Subject: [PATCH 0299/1302] New api first sketch --- packages/core/src/new-api/build-module.ts | 33 ++++++ packages/core/src/new-api/examples.ts | 51 +++++++++ .../src/new-api/internal/module-builder.ts | 100 ++++++++++++++++++ packages/core/src/new-api/internal/module.ts | 98 +++++++++++++++++ packages/core/src/new-api/stubs.ts | 2 + .../core/src/new-api/types/module-builder.ts | 33 ++++++ packages/core/src/new-api/types/module.ts | 59 +++++++++++ 7 files changed, 376 insertions(+) create mode 100644 packages/core/src/new-api/build-module.ts create mode 100644 packages/core/src/new-api/examples.ts create mode 100644 packages/core/src/new-api/internal/module-builder.ts create mode 100644 packages/core/src/new-api/internal/module.ts create mode 100644 packages/core/src/new-api/stubs.ts create mode 100644 packages/core/src/new-api/types/module-builder.ts create mode 100644 packages/core/src/new-api/types/module.ts diff --git a/packages/core/src/new-api/build-module.ts b/packages/core/src/new-api/build-module.ts new file mode 100644 index 0000000000..9bd50a6388 --- /dev/null +++ b/packages/core/src/new-api/build-module.ts @@ -0,0 +1,33 @@ +import { inspect } from "util"; + +import { IgnitionModuleImplementation } from "./internal/module"; +import { IgnitionModuleBuilderImplementation } from "./internal/module-builder"; +import { IgnitionModule, IgnitionModuleResult } from "./types/module"; +import { IgnitionModuleBuilder } from "./types/module-builder"; + +const STUB_MODULE_RESULTS = { + [inspect.custom]() { + return ""; + }, +}; + +export function buildModule< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +>( + moduleId: ModuleIdT, + factory: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT +): IgnitionModule { + // TODO: validate that moduleId is unique. How do we do it?? Maybe later? Is there a global context? + + const mod = new IgnitionModuleImplementation< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >(moduleId, STUB_MODULE_RESULTS as any); + + (mod as any).results = factory(new IgnitionModuleBuilderImplementation(mod)); + + return mod; +} diff --git a/packages/core/src/new-api/examples.ts b/packages/core/src/new-api/examples.ts new file mode 100644 index 0000000000..234362e536 --- /dev/null +++ b/packages/core/src/new-api/examples.ts @@ -0,0 +1,51 @@ +// Some definitions +// Future: representation of a future value, which may require on-chain interaction (e.g. deploy a contract, an already existing contract) +// FutureFactory: Methods exposed by IgnitionModuleBuidler which create factories + +import { buildModule } from "./build-module"; + +// Examples + +const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1", []); + + return { contract1 }; +}); + +const moduleWithUnexportedContract = buildModule("Module2", (m) => { + const contract1 = m.contract("Contract1", [1, 2, 3]); + + // We don't export this, but we still need to run every future, + // so it's included in module.futures + const _contract2 = m.contract("Contract2", []); + + return { contract1 }; +}); + +const moduleWithSubmodule = buildModule("Module3", (m) => { + const { contract1 } = m.useModule(moduleWithASingleContract); + // ^ This is typed 😎 + + const contract3 = m.contract("Contract3", []); + + return { contract1, contract3 }; +}); + +// We pring these modules + +console.log(moduleWithASingleContract); + +console.log(); +console.log(); + +console.log(moduleWithUnexportedContract); + +console.log(); +console.log(); + +console.log(moduleWithSubmodule); + +// Major todos: +// - Validation: I think both per-future and global validations can be run using this same representation, as it still is a graph and also uses adjacency lists. +// +// - Batching: I think each batch can be Set, and we can batch with this representation, including the malaga rule, as explained above. diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts new file mode 100644 index 0000000000..11b05bb866 --- /dev/null +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -0,0 +1,100 @@ +import assert from "assert"; + +import { ArtifactType, SolidityParamsType } from "../stubs"; +import { + ArtifactContractDeploymentFuture, + IgnitionModule, + IgnitionModuleResult, + NamedContractDeploymentFuture, +} from "../types/module"; +import { IgnitionModuleBuilder } from "../types/module-builder"; + +import { + ArtifactContractDeploymentFutureImplementation, + IgnitionModuleImplementation, + NamedContractDeploymentFutureImplementation, +} from "./module"; + +export class IgnitionModuleBuilderImplementation< + ModuleIdT extends string, + ResultsContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> implements IgnitionModuleBuilder +{ + constructor( + private readonly _module: IgnitionModuleImplementation< + ModuleIdT, + ResultsContractNameT, + IgnitionModuleResultsT + > + ) {} + + public contract( + contractName: ContractNameT, + args: SolidityParamsType, + id = contractName + ): NamedContractDeploymentFuture { + // Some things that should be done here: + // - create the future. + // - add it to the set of futures of the module + // - add any dependency (e.g. futures in `args` or `after`) + // - validate that the id is not repeated + const futureId = `${this._module.id}:${id}`; + const future = new NamedContractDeploymentFutureImplementation( + futureId, + this._module, + contractName, + args + ); + + this._module.futures.add(future); + + return future; + } + + public contractFromArtifact( + contractName: string, + artifact: ArtifactType, + args: SolidityParamsType, + id = contractName + ): ArtifactContractDeploymentFuture { + // See `contract` + const futureId = `${this._module.id}:${id}`; + const future = new ArtifactContractDeploymentFutureImplementation( + futureId, + this._module, + contractName, + args, + artifact + ); + + this._module.futures.add(future); + + return future; + } + + public useModule< + SubmoduleModuleIdT extends string, + SubmoduleContractNameT extends string, + SubmoduleIgnitionModuleResultsT extends IgnitionModuleResult + >( + ignitionModule: IgnitionModule< + SubmoduleModuleIdT, + SubmoduleContractNameT, + SubmoduleIgnitionModuleResultsT + > + ): SubmoduleIgnitionModuleResultsT { + assert( + ignitionModule !== undefined, + "Trying to use `undefined` as submodule. Make sure you don't have a circular dependency of modules." + ); + + // Some things that should be done here: + // - Keep track of the submodule + // - return the submodule's results + // + this._module.submodules.add(ignitionModule); + + return ignitionModule.results; + } +} diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts new file mode 100644 index 0000000000..467b5626af --- /dev/null +++ b/packages/core/src/new-api/internal/module.ts @@ -0,0 +1,98 @@ +import { inspect } from "util"; + +import { ArtifactType, SolidityParamsType } from "../stubs"; +import { + Future, + FutureType, + IgnitionModule, + NamedContractDeploymentFuture, + ArtifactContractDeploymentFuture, + IgnitionModuleResult, +} from "../types/module"; + +export abstract class BaseFuture< + FutureTypeT extends FutureType, + ResultT = unknown +> implements Future +{ + public readonly dependencies: Set = new Set(); + + constructor( + public readonly id: string, + public readonly type: FutureTypeT, + public readonly module: IgnitionModuleImplementation + ) {} + + public [inspect.custom]() { + const padding = " ".repeat(2); + + return `Future ${this.id} { + Type: ${FutureType[this.type]} + Module: ${this.module.id} + Dependencies: ${inspect( + Array.from(this.dependencies).map((f) => f.id) + ).replace(/\n/g, `\n${padding}`)} +}`; + } +} + +export class NamedContractDeploymentFutureImplementation< + ContractNameT extends string + > + extends BaseFuture + implements NamedContractDeploymentFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly contractName: ContractNameT, + public readonly constructorArgs: SolidityParamsType + ) { + super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); + } +} + +export class ArtifactContractDeploymentFutureImplementation< + ContractNameT extends string + > + extends BaseFuture + implements ArtifactContractDeploymentFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly contractName: ContractNameT, + public readonly constructorArgs: SolidityParamsType, + public readonly artifact: ArtifactType + ) { + super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); + } +} + +export class IgnitionModuleImplementation< + ModuleIdT extends string = string, + ContractNameT extends string = string, + IgnitionModuleResultsT extends IgnitionModuleResult = IgnitionModuleResult +> implements IgnitionModule +{ + public readonly futures: Set = new Set(); + public readonly submodules: Set = new Set(); + + constructor( + public readonly id: ModuleIdT, + public readonly results: IgnitionModuleResultsT + ) {} + + public [inspect.custom]() { + const padding = " ".repeat(2); + + return `IgnitionModule ${this.id} { + Futures: ${inspect(this.futures).replace(/\n/g, `\n${padding}`)} + Results: ${inspect(this.results).replace(/\n/g, `\n${padding}`)} + Submodules: ${inspect(Array.from(this.submodules).map((m) => m.id)).replace( + /\n/g, + `\n${padding}` + )} +}`; + } +} diff --git a/packages/core/src/new-api/stubs.ts b/packages/core/src/new-api/stubs.ts new file mode 100644 index 0000000000..1746b88b02 --- /dev/null +++ b/packages/core/src/new-api/stubs.ts @@ -0,0 +1,2 @@ +export type SolidityParamsType = any[]; +export type ArtifactType = any[]; diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts new file mode 100644 index 0000000000..11dda950c6 --- /dev/null +++ b/packages/core/src/new-api/types/module-builder.ts @@ -0,0 +1,33 @@ +import { ArtifactType, SolidityParamsType } from "../stubs"; + +import { + ArtifactContractDeploymentFuture, + IgnitionModule, + IgnitionModuleResult, + NamedContractDeploymentFuture, +} from "./module"; + +export interface IgnitionModuleBuilder { + contract( + contractName: ContractNameT, + args: SolidityParamsType + ): NamedContractDeploymentFuture; + + contractFromArtifact( + contractName: string, + artifact: ArtifactType, + args: SolidityParamsType + ): ArtifactContractDeploymentFuture; + + useModule< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + > + ): IgnitionModuleResultsT; +} diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts new file mode 100644 index 0000000000..8c9de0e1cd --- /dev/null +++ b/packages/core/src/new-api/types/module.ts @@ -0,0 +1,59 @@ +import { ArtifactType, SolidityParamsType } from "../stubs"; + +export enum FutureType { + NAMED_CONTRACT_DEPLOYMENT, + ARTIFACT_CONTRACT_DEPLOYMENT, +} + +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export interface Future { + id: string; // Unique identifier of a future. My current proposal ":" + + type: FutureType; + + // The following fields define the deployment graph + + // TODO: Not convinced about this circular dependency between module and future. + module: IgnitionModule; + + // Any future that needs to be executed before this one + dependencies: Set; +} + +// A future representing a contract. Either an existing one or one that will be deployed +export interface ContractFuture + extends Future { + contractName: ContractNameT; +} + +// A future representing the deployment of a contract that belongs to this project +export interface NamedContractDeploymentFuture + extends ContractFuture { + type: FutureType.NAMED_CONTRACT_DEPLOYMENT; + constructorArgs: SolidityParamsType; +} + +// A future representing the deployment of a contract that we only know its artifact. +// It may not belong to this project, and we may struggle to type. +export interface ArtifactContractDeploymentFuture + extends ContractFuture { + type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + artifact: ArtifactType; + constructorArgs: SolidityParamsType; +} + +// The results of deploying a module must be a dictionary of contract futures +export interface IgnitionModuleResult { + [contract: string]: ContractFuture; +} + +export interface IgnitionModule< + ModuleIdT extends string = string, + ContractNameT extends string = string, + IgnitionModuleResultsT extends IgnitionModuleResult = IgnitionModuleResult +> { + id: ModuleIdT; // Unique id + futures: Set; // Future created in this module — All of them have to be deployed before returning the results. Note that not all of them are in results + submodules: Set; // Modules used by this module — Note that there's only one instance of each module + results: IgnitionModuleResultsT; // The futures returned by the callback passed to buildModule +} From f5947b1b75445dfede8cbc1d73319e1e2f47f570 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Apr 2023 16:38:15 +0100 Subject: [PATCH 0300/1302] feat(new-api): add arg depedency tracking on `contract` --- .../src/new-api/internal/module-builder.ts | 12 +++- packages/core/src/new-api/internal/utils.ts | 6 ++ .../core/src/new-api/types/module-builder.ts | 2 +- packages/core/test/new-api/api.ts | 65 +++++++++++++++++++ 4 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils.ts create mode 100644 packages/core/test/new-api/api.ts diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 11b05bb866..54788c61eb 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -14,6 +14,7 @@ import { IgnitionModuleImplementation, NamedContractDeploymentFutureImplementation, } from "./module"; +import { isFuture } from "./utils"; export class IgnitionModuleBuilderImplementation< ModuleIdT extends string, @@ -31,15 +32,16 @@ export class IgnitionModuleBuilderImplementation< public contract( contractName: ContractNameT, - args: SolidityParamsType, + args: SolidityParamsType = [], id = contractName ): NamedContractDeploymentFuture { // Some things that should be done here: - // - create the future. - // - add it to the set of futures of the module + // - create the future. - done + // - add it to the set of futures of the module - done // - add any dependency (e.g. futures in `args` or `after`) // - validate that the id is not repeated const futureId = `${this._module.id}:${id}`; + const future = new NamedContractDeploymentFutureImplementation( futureId, this._module, @@ -47,6 +49,10 @@ export class IgnitionModuleBuilderImplementation< args ); + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + this._module.futures.add(future); return future; diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts new file mode 100644 index 0000000000..74be455754 --- /dev/null +++ b/packages/core/src/new-api/internal/utils.ts @@ -0,0 +1,6 @@ +import { BaseFuture } from "./module"; + +// TODO: convert this to type guard, but how do we type that? +export function isFuture(potential: unknown): boolean { + return potential instanceof BaseFuture; +} diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 11dda950c6..cb9747a6b4 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -10,7 +10,7 @@ import { export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, - args: SolidityParamsType + args?: SolidityParamsType ): NamedContractDeploymentFuture; contractFromArtifact( diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts new file mode 100644 index 0000000000..e08bf2e3c9 --- /dev/null +++ b/packages/core/test/new-api/api.ts @@ -0,0 +1,65 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; +import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { FutureType } from "../../src/new-api/types/module"; + +describe("new api", () => { + describe("contract", () => { + it("should be able to setup a deploy contract call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // Sets ids based on module id and contract name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.contract1.id, + "Module1:Contract1" + ); + + // 1 contract future + assert.equal(moduleWithASingleContract.futures.size, 1); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + it("should be able to pass one contract as an arg dependency to another", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another", [example]); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + }); +}); From e848efe45d3574831d3a657988867a687c7bf025 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Apr 2023 16:44:49 +0100 Subject: [PATCH 0301/1302] test(new-api): add todo tests to cover `after` and id throw --- packages/core/test/new-api/api.ts | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index e08bf2e3c9..072d0c387f 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -61,5 +61,80 @@ describe("new api", () => { assert.equal(anotherFuture.dependencies.size, 1); assert(anotherFuture.dependencies.has(exampleFuture!)); }); + + // TODO: confirm after syntax + it.skip("should be able to pass one contract as an after dependency of another", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract( + "Another", + [] + // proposed after syntax + // { after: [example] } + ); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + // TODO: determine whether this should throw due to id duplication + // on the contract calls or whether we should auto-infer + // the id as something like: + // Module1:SameContract:1 + // Module1:SameContract:2 + it.skip("should be able to deploy the same contract twice", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + const sameContract2 = m.contract("SameContract"); + + return { sameContract1, sameContract2 }; + }); + + assert.isDefined(moduleWithSameContractTwice); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:SameContract" // TODO: what should the id be here? + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:SameContract" + ); + + // 2 contract futures + assert.equal(moduleWithSameContractTwice.futures.size, 2); + assert.equal( + [...moduleWithSameContractTwice.futures][0].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + assert.equal( + [...moduleWithSameContractTwice.futures][1].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + + // No submodules + assert.equal(moduleWithSameContractTwice.submodules.size, 0); + }); }); }); From 80c7c9a1fcec3f0415c3cb0f199234d0f3c2b86c Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 13:51:06 +0100 Subject: [PATCH 0302/1302] refactor(new-api): improve typing on `isFuture` guard --- packages/core/src/new-api/internal/utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 74be455754..d19951f5a4 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,6 +1,7 @@ +import { Future } from "../types/module"; + import { BaseFuture } from "./module"; -// TODO: convert this to type guard, but how do we type that? -export function isFuture(potential: unknown): boolean { +export function isFuture(potential: unknown): potential is Future { return potential instanceof BaseFuture; } From 425dc7e217fa1ac2fe81ba8b7fc0292ca3b6980c Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 14:05:28 +0100 Subject: [PATCH 0303/1302] refactor(new-api): add `after` to contract in options object --- packages/core/src/new-api/internal/module-builder.ts | 10 +++++++++- packages/core/src/new-api/types/module-builder.ts | 8 +++++++- packages/core/test/new-api/api.ts | 10 ++-------- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 54788c61eb..b79a517bb2 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -7,7 +7,10 @@ import { IgnitionModuleResult, NamedContractDeploymentFuture, } from "../types/module"; -import { IgnitionModuleBuilder } from "../types/module-builder"; +import { + ContractOptions, + IgnitionModuleBuilder, +} from "../types/module-builder"; import { ArtifactContractDeploymentFutureImplementation, @@ -33,6 +36,7 @@ export class IgnitionModuleBuilderImplementation< public contract( contractName: ContractNameT, args: SolidityParamsType = [], + options: ContractOptions = {}, id = contractName ): NamedContractDeploymentFuture { // Some things that should be done here: @@ -53,6 +57,10 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(arg); } + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + this._module.futures.add(future); return future; diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index cb9747a6b4..1f6b2012d7 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -2,15 +2,21 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, + Future, IgnitionModule, IgnitionModuleResult, NamedContractDeploymentFuture, } from "./module"; +export interface ContractOptions { + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, - args?: SolidityParamsType + args?: SolidityParamsType, + options?: ContractOptions ): NamedContractDeploymentFuture; contractFromArtifact( diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index 072d0c387f..ddf5e96d3a 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -62,16 +62,10 @@ describe("new api", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); - // TODO: confirm after syntax - it.skip("should be able to pass one contract as an after dependency of another", () => { + it("should be able to pass one contract as an after dependency of another", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contract( - "Another", - [] - // proposed after syntax - // { after: [example] } - ); + const another = m.contract("Another", [], { after: [example] }); return { example, another }; }); From fed88bec653d1affef4599551679a923a7c2678e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 14:57:42 +0100 Subject: [PATCH 0304/1302] refactor(new-api): throw on contract id duplication --- .../src/new-api/internal/module-builder.ts | 33 ++++++-- .../core/src/new-api/types/module-builder.ts | 1 + packages/core/test/new-api/api.ts | 79 +++++++++++-------- 3 files changed, 70 insertions(+), 43 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index b79a517bb2..033a486cbb 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -1,5 +1,6 @@ import assert from "assert"; +import { IgnitionValidationError } from "../../errors"; import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, @@ -25,27 +26,28 @@ export class IgnitionModuleBuilderImplementation< IgnitionModuleResultsT extends IgnitionModuleResult > implements IgnitionModuleBuilder { + private _futureIds: Set; + constructor( private readonly _module: IgnitionModuleImplementation< ModuleIdT, ResultsContractNameT, IgnitionModuleResultsT > - ) {} + ) { + this._futureIds = new Set(); + } public contract( contractName: ContractNameT, args: SolidityParamsType = [], - options: ContractOptions = {}, - id = contractName + options: ContractOptions = {} ): NamedContractDeploymentFuture { - // Some things that should be done here: - // - create the future. - done - // - add it to the set of futures of the module - done - // - add any dependency (e.g. futures in `args` or `after`) - // - validate that the id is not repeated + const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + this._assertUniqueContractId(futureId); + const future = new NamedContractDeploymentFutureImplementation( futureId, this._module, @@ -111,4 +113,19 @@ export class IgnitionModuleBuilderImplementation< return ignitionModule.results; } + + private _assertUniqueContractId(futureId: string) { + if (this._futureIds.has(futureId)) { + const validationError = new IgnitionValidationError( + `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\`` + ); + + // Improve the stack trace to stop on module api level + Error.captureStackTrace(validationError, this.contract); + + throw validationError; + } + + this._futureIds.add(futureId); + } } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 1f6b2012d7..8b3da7b33f 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -9,6 +9,7 @@ import { } from "./module"; export interface ContractOptions { + id?: string; after?: Future[]; } diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index ddf5e96d3a..969ef7b02c 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -90,45 +90,54 @@ describe("new api", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); - // TODO: determine whether this should throw due to id duplication - // on the contract calls or whether we should auto-infer - // the id as something like: - // Module1:SameContract:1 - // Module1:SameContract:2 - it.skip("should be able to deploy the same contract twice", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - const sameContract2 = m.contract("SameContract"); - - return { sameContract1, sameContract2 }; + describe("passing id", () => { + it("should be able to deploy the same contract twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract", [], { id: "first" }); + const sameContract2 = m.contract("SameContract", [], { + id: "second", + }); + + return { sameContract1, sameContract2 }; + }); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" // TODO: what should the id be here? + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); }); - assert.isDefined(moduleWithSameContractTwice); + it("should throw if the same contract is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + const sameContract2 = m.contract("SameContract"); - // Sets ids based on module id and contract name - assert.equal(moduleWithSameContractTwice.id, "Module1"); - assert.equal( - moduleWithSameContractTwice.results.sameContract1.id, - "Module1:SameContract" // TODO: what should the id be here? - ); - assert.equal( - moduleWithSameContractTwice.results.sameContract2.id, - "Module1:SameContract" - ); - - // 2 contract futures - assert.equal(moduleWithSameContractTwice.futures.size, 2); - assert.equal( - [...moduleWithSameContractTwice.futures][0].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT - ); - assert.equal( - [...moduleWithSameContractTwice.futures][1].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT - ); + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); - // No submodules - assert.equal(moduleWithSameContractTwice.submodules.size, 0); + it("should throw if a contract tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract", [], { + id: "same", + }); + const sameContract2 = m.contract("SameContract", [], { + id: "same", + }); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); }); }); }); From 8465d6c3b514fcd27632963e5ced7ff7420fae19 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 15:49:55 +0100 Subject: [PATCH 0305/1302] tests(new-api): add `useModule` tests --- packages/core/test/new-api/api.ts | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index 969ef7b02c..0b56f8dfed 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -140,4 +140,47 @@ describe("new api", () => { }); }); }); + + describe("useModule", () => { + it("should be able to use a submodule", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submodule); + + return { contract1 }; + }); + + // the submodule is linked + assert.equal(moduleWithSubmodule.submodules.size, 1); + assert(moduleWithSubmodule.submodules.has(submodule)); + }); + + it("should return cached version on second run", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1: first } = m.useModule(submodule); + const { contract1: second } = m.useModule(submodule); + + return { first, second }; + }); + + assert.equal( + moduleWithSubmodule.results.first, + moduleWithSubmodule.results.second + ); + + assert.equal(moduleWithSubmodule.submodules.size, 1); + assert(moduleWithSubmodule.submodules.has(submodule)); + }); + }); }); From 72a64c56c199d9c4f38346caacd3470120c413ef Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 16:46:41 +0100 Subject: [PATCH 0306/1302] test(new-api): add submodule dep test --- packages/core/test/new-api/api.ts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index 0b56f8dfed..64203dd8fe 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -160,7 +160,7 @@ describe("new api", () => { assert(moduleWithSubmodule.submodules.has(submodule)); }); - it("should return cached version on second run", () => { + it("returns the same result set (object equal) for each usage", () => { const submodule = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); @@ -182,5 +182,27 @@ describe("new api", () => { assert.equal(moduleWithSubmodule.submodules.size, 1); assert(moduleWithSubmodule.submodules.has(submodule)); }); + + it("supports dependending on returned results", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submodule); + + const contract2 = m.contract("Contract2", [contract1]); + + return { contract2 }; + }); + + assert( + moduleWithSubmodule.results.contract2.dependencies.has( + submodule.results.contract1 + ) + ); + }); }); }); From 5ee6a05e8a47fe496972062f54b9014e40fd27f1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Apr 2023 17:25:36 +0100 Subject: [PATCH 0307/1302] refactor(new-api): add deps and id handling for `contractFromArtifact` --- .../src/new-api/internal/module-builder.ts | 18 +- .../core/src/new-api/types/module-builder.ts | 8 +- packages/core/test/new-api/api.ts | 154 +++++++++++++++++- 3 files changed, 174 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 033a486cbb..fe66d43adb 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -9,6 +9,7 @@ import { NamedContractDeploymentFuture, } from "../types/module"; import { + ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, } from "../types/module-builder"; @@ -71,11 +72,14 @@ export class IgnitionModuleBuilderImplementation< public contractFromArtifact( contractName: string, artifact: ArtifactType, - args: SolidityParamsType, - id = contractName + args: SolidityParamsType = [], + options: ContractFromArtifactOptions = {} ): ArtifactContractDeploymentFuture { - // See `contract` + const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + + this._assertUniqueContractId(futureId); + const future = new ArtifactContractDeploymentFutureImplementation( futureId, this._module, @@ -86,6 +90,14 @@ export class IgnitionModuleBuilderImplementation< this._module.futures.add(future); + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + return future; } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 8b3da7b33f..a4f2266a70 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -13,6 +13,11 @@ export interface ContractOptions { after?: Future[]; } +export interface ContractFromArtifactOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, @@ -23,7 +28,8 @@ export interface IgnitionModuleBuilder { contractFromArtifact( contractName: string, artifact: ArtifactType, - args: SolidityParamsType + args?: SolidityParamsType, + options?: ContractFromArtifactOptions ): ArtifactContractDeploymentFuture; useModule< diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts index 64203dd8fe..aaf227e4a3 100644 --- a/packages/core/test/new-api/api.ts +++ b/packages/core/test/new-api/api.ts @@ -101,11 +101,10 @@ describe("new api", () => { return { sameContract1, sameContract2 }; }); - // Sets ids based on module id and contract name assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" // TODO: what should the id be here? + "Module1:first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, @@ -141,6 +140,157 @@ describe("new api", () => { }); }); + describe("contractFromArtifact", () => { + const fakeArtifact: any = {}; + + it("should be able to deploy with a contract based on an artifact", () => { + const moduleWithContractFromArtifact = buildModule("Module1", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + 1, + "a", + BigInt("9007199254740991"), + ]); + + return { contract1 }; + }); + + assert.isDefined(moduleWithContractFromArtifact); + + // Sets ids based on module id and contract name + assert.equal(moduleWithContractFromArtifact.id, "Module1"); + assert.equal( + moduleWithContractFromArtifact.results.contract1.id, + "Module1:Contract1" + ); + + // Stores the arguments + assert.deepStrictEqual( + moduleWithContractFromArtifact.results.contract1.constructorArgs, + [1, "a", BigInt("9007199254740991")] + ); + + // 1 contract future + assert.equal(moduleWithContractFromArtifact.futures.size, 1); + + // No submodules + assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + it("should be able to pass an arg dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [ + example, + ]); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass an after dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + after: [example], + }); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + describe("passing id", () => { + it("should use contract from artifact twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { id: "first" } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + }); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same contract is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a contract tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); + }); + describe("useModule", () => { it("should be able to use a submodule", () => { const submodule = buildModule("Submodule1", (m) => { From d49538e45824ce14be25ca84c5ce6a33c6202669 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 3 May 2023 16:21:09 +0100 Subject: [PATCH 0308/1302] refact(new-api): split out api tests per action --- packages/core/test/new-api/api.ts | 358 ------------------ packages/core/test/new-api/contract.ts | 140 +++++++ .../core/test/new-api/contractFromArtifact.ts | 155 ++++++++ packages/core/test/new-api/useModule.ts | 69 ++++ 4 files changed, 364 insertions(+), 358 deletions(-) delete mode 100644 packages/core/test/new-api/api.ts create mode 100644 packages/core/test/new-api/contract.ts create mode 100644 packages/core/test/new-api/contractFromArtifact.ts create mode 100644 packages/core/test/new-api/useModule.ts diff --git a/packages/core/test/new-api/api.ts b/packages/core/test/new-api/api.ts deleted file mode 100644 index aaf227e4a3..0000000000 --- a/packages/core/test/new-api/api.ts +++ /dev/null @@ -1,358 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/new-api/build-module"; -import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; -import { FutureType } from "../../src/new-api/types/module"; - -describe("new api", () => { - describe("contract", () => { - it("should be able to setup a deploy contract call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - assert.isDefined(moduleWithASingleContract); - - // Sets ids based on module id and contract name - assert.equal(moduleWithASingleContract.id, "Module1"); - assert.equal( - moduleWithASingleContract.results.contract1.id, - "Module1:Contract1" - ); - - // 1 contract future - assert.equal(moduleWithASingleContract.futures.size, 1); - assert.equal( - [...moduleWithASingleContract.futures][0].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT - ); - - // No submodules - assert.equal(moduleWithASingleContract.submodules.size, 0); - }); - - it("should be able to pass one contract as an arg dependency to another", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another", [example]); - - return { example, another }; - }); - - assert.isDefined(moduleWithDependentContracts); - - const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" - ); - - const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" - ); - - if ( - !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) - ) { - assert.fail("Not a named contract deployment"); - } - - assert.equal(anotherFuture.dependencies.size, 1); - assert(anotherFuture.dependencies.has(exampleFuture!)); - }); - - it("should be able to pass one contract as an after dependency of another", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another", [], { after: [example] }); - - return { example, another }; - }); - - assert.isDefined(moduleWithDependentContracts); - - const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" - ); - - const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" - ); - - if ( - !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) - ) { - assert.fail("Not a named contract deployment"); - } - - assert.equal(anotherFuture.dependencies.size, 1); - assert(anotherFuture.dependencies.has(exampleFuture!)); - }); - - describe("passing id", () => { - it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract", [], { id: "first" }); - const sameContract2 = m.contract("SameContract", [], { - id: "second", - }); - - return { sameContract1, sameContract2 }; - }); - - assert.equal(moduleWithSameContractTwice.id, "Module1"); - assert.equal( - moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" - ); - assert.equal( - moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" - ); - }); - - it("should throw if the same contract is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - const sameContract2 = m.contract("SameContract"); - - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); - }); - - it("should throw if a contract tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract", [], { - id: "same", - }); - const sameContract2 = m.contract("SameContract", [], { - id: "same", - }); - - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:same has already been used/); - }); - }); - }); - - describe("contractFromArtifact", () => { - const fakeArtifact: any = {}; - - it("should be able to deploy with a contract based on an artifact", () => { - const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - 1, - "a", - BigInt("9007199254740991"), - ]); - - return { contract1 }; - }); - - assert.isDefined(moduleWithContractFromArtifact); - - // Sets ids based on module id and contract name - assert.equal(moduleWithContractFromArtifact.id, "Module1"); - assert.equal( - moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1" - ); - - // Stores the arguments - assert.deepStrictEqual( - moduleWithContractFromArtifact.results.contract1.constructorArgs, - [1, "a", BigInt("9007199254740991")] - ); - - // 1 contract future - assert.equal(moduleWithContractFromArtifact.futures.size, 1); - - // No submodules - assert.equal(moduleWithContractFromArtifact.submodules.size, 0); - }); - - it("should be able to pass an arg dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [ - example, - ]); - - return { example, another }; - }); - - assert.equal(moduleWithDependentContracts.futures.size, 2); - - const exampleFuture = moduleWithDependentContracts.results.example; - const anotherFuture = moduleWithDependentContracts.results.another; - - assert.equal(anotherFuture.dependencies.size, 1); - assert(anotherFuture.dependencies.has(exampleFuture!)); - }); - - it("should be able to pass an after dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [], { - after: [example], - }); - - return { example, another }; - }); - - assert.equal(moduleWithDependentContracts.futures.size, 2); - - const exampleFuture = moduleWithDependentContracts.results.example; - const anotherFuture = moduleWithDependentContracts.results.another; - - assert.equal(anotherFuture.dependencies.size, 1); - assert(anotherFuture.dependencies.has(exampleFuture!)); - }); - - describe("passing id", () => { - it("should use contract from artifact twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { id: "first" } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "second", - } - ); - - return { sameContract1, sameContract2 }; - }); - - // Sets ids based on module id and contract name - assert.equal(moduleWithSameContractTwice.id, "Module1"); - assert.equal( - moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" - ); - assert.equal( - moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" - ); - }); - - it("should throw if the same contract is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); - - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); - }); - - it("should throw if a contract tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); - - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:same has already been used/); - }); - }); - }); - - describe("useModule", () => { - it("should be able to use a submodule", () => { - const submodule = buildModule("Submodule1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1 } = m.useModule(submodule); - - return { contract1 }; - }); - - // the submodule is linked - assert.equal(moduleWithSubmodule.submodules.size, 1); - assert(moduleWithSubmodule.submodules.has(submodule)); - }); - - it("returns the same result set (object equal) for each usage", () => { - const submodule = buildModule("Submodule1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1: first } = m.useModule(submodule); - const { contract1: second } = m.useModule(submodule); - - return { first, second }; - }); - - assert.equal( - moduleWithSubmodule.results.first, - moduleWithSubmodule.results.second - ); - - assert.equal(moduleWithSubmodule.submodules.size, 1); - assert(moduleWithSubmodule.submodules.has(submodule)); - }); - - it("supports dependending on returned results", () => { - const submodule = buildModule("Submodule1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1 } = m.useModule(submodule); - - const contract2 = m.contract("Contract2", [contract1]); - - return { contract2 }; - }); - - assert( - moduleWithSubmodule.results.contract2.dependencies.has( - submodule.results.contract1 - ) - ); - }); - }); -}); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts new file mode 100644 index 0000000000..4e55735359 --- /dev/null +++ b/packages/core/test/new-api/contract.ts @@ -0,0 +1,140 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; +import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { FutureType } from "../../src/new-api/types/module"; + +describe("contract", () => { + it("should be able to setup a deploy contract call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // Sets ids based on module id and contract name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.contract1.id, + "Module1:Contract1" + ); + + // 1 contract future + assert.equal(moduleWithASingleContract.futures.size, 1); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + it("should be able to pass one contract as an arg dependency to another", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another", [example]); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass one contract as an after dependency of another", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another", [], { after: [example] }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + describe("passing id", () => { + it("should be able to deploy the same contract twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract", [], { id: "first" }); + const sameContract2 = m.contract("SameContract", [], { + id: "second", + }); + + return { sameContract1, sameContract2 }; + }); + + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same contract is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + const sameContract2 = m.contract("SameContract"); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a contract tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract", [], { + id: "same", + }); + const sameContract2 = m.contract("SameContract", [], { + id: "same", + }); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); +}); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts new file mode 100644 index 0000000000..2e485a65e6 --- /dev/null +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -0,0 +1,155 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; + +describe("contractFromArtifact", () => { + const fakeArtifact: any = {}; + + it("should be able to deploy with a contract based on an artifact", () => { + const moduleWithContractFromArtifact = buildModule("Module1", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + 1, + "a", + BigInt("9007199254740991"), + ]); + + return { contract1 }; + }); + + assert.isDefined(moduleWithContractFromArtifact); + + // Sets ids based on module id and contract name + assert.equal(moduleWithContractFromArtifact.id, "Module1"); + assert.equal( + moduleWithContractFromArtifact.results.contract1.id, + "Module1:Contract1" + ); + + // Stores the arguments + assert.deepStrictEqual( + moduleWithContractFromArtifact.results.contract1.constructorArgs, + [1, "a", BigInt("9007199254740991")] + ); + + // 1 contract future + assert.equal(moduleWithContractFromArtifact.futures.size, 1); + + // No submodules + assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + it("should be able to pass an arg dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [ + example, + ]); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass an after dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + after: [example], + }); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + describe("passing id", () => { + it("should use contract from artifact twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { id: "first" } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + }); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same contract is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a contract tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); +}); diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts new file mode 100644 index 0000000000..a28bcf5c24 --- /dev/null +++ b/packages/core/test/new-api/useModule.ts @@ -0,0 +1,69 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; + +describe("useModule", () => { + it("should be able to use a submodule", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submodule); + + return { contract1 }; + }); + + // the submodule is linked + assert.equal(moduleWithSubmodule.submodules.size, 1); + assert(moduleWithSubmodule.submodules.has(submodule)); + }); + + it("returns the same result set (object equal) for each usage", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1: first } = m.useModule(submodule); + const { contract1: second } = m.useModule(submodule); + + return { first, second }; + }); + + assert.equal( + moduleWithSubmodule.results.first, + moduleWithSubmodule.results.second + ); + + assert.equal(moduleWithSubmodule.submodules.size, 1); + assert(moduleWithSubmodule.submodules.has(submodule)); + }); + + it("supports dependending on returned results", () => { + const submodule = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleWithSubmodule = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submodule); + + const contract2 = m.contract("Contract2", [contract1]); + + return { contract2 }; + }); + + assert( + moduleWithSubmodule.results.contract2.dependencies.has( + submodule.results.contract1 + ) + ); + }); +}); From 4ead6b0345cdbd8eb61359186e3be0c6dd9ba202 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 3 May 2023 16:35:32 +0100 Subject: [PATCH 0309/1302] refactor(new-api): add stub tests for library --- packages/core/test/new-api/library.ts | 138 ++++++++++++++++ .../core/test/new-api/libraryFromArtifact.ts | 155 ++++++++++++++++++ 2 files changed, 293 insertions(+) create mode 100644 packages/core/test/new-api/library.ts create mode 100644 packages/core/test/new-api/libraryFromArtifact.ts diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts new file mode 100644 index 0000000000..d8cc38ac2f --- /dev/null +++ b/packages/core/test/new-api/library.ts @@ -0,0 +1,138 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; + +describe("library", () => { + it.skip("should be able to setup a deploy library call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const library1 = (m as any).library("Library1"); + + return { library1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // // Sets ids based on module id and contract name + // assert.equal(moduleWithASingleContract.id, "Module1"); + // assert.equal( + // moduleWithASingleContract.results.contract1.id, + // "Module1:Contract1" + // ); + + // // 1 contract future + // assert.equal(moduleWithASingleContract.futures.size, 1); + // assert.equal( + // [...moduleWithASingleContract.futures][0].type, + // FutureType.NAMED_CONTRACT_DEPLOYMENT + // ); + + // // No submodules + // assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + // it("should be able to pass one library as an arg dependency to another", () => { + // const moduleWithDependentContracts = buildModule("Module1", (m) => { + // const example = m.contract("Example"); + // const another = m.contract("Another", [example]); + + // return { example, another }; + // }); + + // assert.isDefined(moduleWithDependentContracts); + + // const exampleFuture = [...moduleWithDependentContracts.futures].find( + // ({ id }) => id === "Module1:Example" + // ); + + // const anotherFuture = [...moduleWithDependentContracts.futures].find( + // ({ id }) => id === "Module1:Another" + // ); + + // if ( + // !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + // ) { + // assert.fail("Not a named contract deployment"); + // } + + // assert.equal(anotherFuture.dependencies.size, 1); + // assert(anotherFuture.dependencies.has(exampleFuture!)); + // }); + + // it("should be able to pass one library as an after dependency of another", () => { + // const moduleWithDependentContracts = buildModule("Module1", (m) => { + // const example = m.contract("Example"); + // const another = m.contract("Another", [], { after: [example] }); + + // return { example, another }; + // }); + + // assert.isDefined(moduleWithDependentContracts); + + // const exampleFuture = [...moduleWithDependentContracts.futures].find( + // ({ id }) => id === "Module1:Example" + // ); + + // const anotherFuture = [...moduleWithDependentContracts.futures].find( + // ({ id }) => id === "Module1:Another" + // ); + + // if ( + // !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + // ) { + // assert.fail("Not a named contract deployment"); + // } + + // assert.equal(anotherFuture.dependencies.size, 1); + // assert(anotherFuture.dependencies.has(exampleFuture!)); + // }); + + // describe("passing id", () => { + // it("should be able to deploy the same library twice by passing an id", () => { + // const moduleWithSameContractTwice = buildModule("Module1", (m) => { + // const sameContract1 = m.contract("SameContract", [], { id: "first" }); + // const sameContract2 = m.contract("SameContract", [], { + // id: "second", + // }); + + // return { sameContract1, sameContract2 }; + // }); + + // assert.equal(moduleWithSameContractTwice.id, "Module1"); + // assert.equal( + // moduleWithSameContractTwice.results.sameContract1.id, + // "Module1:first" + // ); + // assert.equal( + // moduleWithSameContractTwice.results.sameContract2.id, + // "Module1:second" + // ); + // }); + + // it("should throw if the same library is deployed twice without differentiating ids", () => { + // assert.throws(() => { + // buildModule("Module1", (m) => { + // const sameContract1 = m.contract("SameContract"); + // const sameContract2 = m.contract("SameContract"); + + // return { sameContract1, sameContract2 }; + // }); + // }, /Contracts must have unique ids, Module1:SameContract has already been used/); + // }); + + // it("should throw if a library tries to pass the same id twice", () => { + // assert.throws(() => { + // buildModule("Module1", (m) => { + // const sameContract1 = m.contract("SameContract", [], { + // id: "same", + // }); + // const sameContract2 = m.contract("SameContract", [], { + // id: "same", + // }); + + // return { sameContract1, sameContract2 }; + // }); + // }, /Contracts must have unique ids, Module1:same has already been used/); + // }); + // }); +}); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts new file mode 100644 index 0000000000..11c40f4209 --- /dev/null +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -0,0 +1,155 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; + +describe("libraryFromArtifact", () => { + const fakeArtifact: any = {}; + + it("should be able to deploy with a library based on an artifact", () => { + const moduleWithContractFromArtifact = buildModule("Module1", (m) => { + const library1 = m.contractFromArtifact("Library1", fakeArtifact, [ + 1, + "a", + BigInt("9007199254740991"), + ]); + + return { contract1: library1 }; + }); + + assert.isDefined(moduleWithContractFromArtifact); + + // // Sets ids based on module id and contract name + // assert.equal(moduleWithContractFromArtifact.id, "Module1"); + // assert.equal( + // moduleWithContractFromArtifact.results.contract1.id, + // "Module1:Contract1" + // ); + + // // Stores the arguments + // assert.deepStrictEqual( + // moduleWithContractFromArtifact.results.contract1.constructorArgs, + // [1, "a", BigInt("9007199254740991")] + // ); + + // // 1 contract future + // assert.equal(moduleWithContractFromArtifact.futures.size, 1); + + // // No submodules + // assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + // it("should be able to pass an arg dependency", () => { + // const moduleWithDependentContracts = buildModule("Module1", (m) => { + // const example = m.contract("Example"); + // const another = m.contractFromArtifact("Another", fakeArtifact, [ + // example, + // ]); + + // return { example, another }; + // }); + + // assert.equal(moduleWithDependentContracts.futures.size, 2); + + // const exampleFuture = moduleWithDependentContracts.results.example; + // const anotherFuture = moduleWithDependentContracts.results.another; + + // assert.equal(anotherFuture.dependencies.size, 1); + // assert(anotherFuture.dependencies.has(exampleFuture!)); + // }); + + // it("should be able to pass an after dependency", () => { + // const moduleWithDependentContracts = buildModule("Module1", (m) => { + // const example = m.contract("Example"); + // const another = m.contractFromArtifact("Another", fakeArtifact, [], { + // after: [example], + // }); + + // return { example, another }; + // }); + + // assert.equal(moduleWithDependentContracts.futures.size, 2); + + // const exampleFuture = moduleWithDependentContracts.results.example; + // const anotherFuture = moduleWithDependentContracts.results.another; + + // assert.equal(anotherFuture.dependencies.size, 1); + // assert(anotherFuture.dependencies.has(exampleFuture!)); + // }); + + // describe("passing id", () => { + // it("should use library from artifact twice by passing an id", () => { + // const moduleWithSameContractTwice = buildModule("Module1", (m) => { + // const sameContract1 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact, + // [], + // { id: "first" } + // ); + // const sameContract2 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact, + // [], + // { + // id: "second", + // } + // ); + + // return { sameContract1, sameContract2 }; + // }); + + // // Sets ids based on module id and contract name + // assert.equal(moduleWithSameContractTwice.id, "Module1"); + // assert.equal( + // moduleWithSameContractTwice.results.sameContract1.id, + // "Module1:first" + // ); + // assert.equal( + // moduleWithSameContractTwice.results.sameContract2.id, + // "Module1:second" + // ); + // }); + + // it("should throw if the same library is deployed twice without differentiating ids", () => { + // assert.throws(() => { + // buildModule("Module1", (m) => { + // const sameContract1 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact + // ); + // const sameContract2 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact + // ); + + // return { sameContract1, sameContract2 }; + // }); + // }, /Contracts must have unique ids, Module1:SameContract has already been used/); + // }); + + // it("should throw if a library tries to pass the same id twice", () => { + // assert.throws(() => { + // buildModule("Module1", (m) => { + // const sameContract1 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact, + // [], + // { + // id: "same", + // } + // ); + // const sameContract2 = m.contractFromArtifact( + // "SameContract", + // fakeArtifact, + // [], + // { + // id: "same", + // } + // ); + + // return { sameContract1, sameContract2 }; + // }); + // }, /Contracts must have unique ids, Module1:same has already been used/); + // }); + // }); +}); From cff306cadb38292bb7adf912b6c272a7f3c27552 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 15:46:55 -0300 Subject: [PATCH 0310/1302] Add IgnitionModuleDefinition and use it in useModule --- packages/core/src/new-api/types/module-builder.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index a4f2266a70..a335e562b8 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -3,11 +3,19 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, Future, - IgnitionModule, IgnitionModuleResult, NamedContractDeploymentFuture, } from "./module"; +export interface IgnitionModuleDefinition< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> { + id: ModuleIdT; + moduleDefintionFunction: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT; +} + export interface ContractOptions { id?: string; after?: Future[]; @@ -37,7 +45,7 @@ export interface IgnitionModuleBuilder { ContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult >( - ignitionModule: IgnitionModule< + submoduleDefinition: IgnitionModuleDefinition< ModuleIdT, ContractNameT, IgnitionModuleResultsT From f381a98d4bf9aa13c8e8b23d16e7e60ce1c215b4 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 15:47:37 -0300 Subject: [PATCH 0311/1302] Make buildModule return an IgnitionModuleDefinition --- packages/core/src/new-api/build-module.ts | 33 ++++++----------------- 1 file changed, 8 insertions(+), 25 deletions(-) diff --git a/packages/core/src/new-api/build-module.ts b/packages/core/src/new-api/build-module.ts index 9bd50a6388..5a5d020d8b 100644 --- a/packages/core/src/new-api/build-module.ts +++ b/packages/core/src/new-api/build-module.ts @@ -1,15 +1,8 @@ -import { inspect } from "util"; - -import { IgnitionModuleImplementation } from "./internal/module"; -import { IgnitionModuleBuilderImplementation } from "./internal/module-builder"; -import { IgnitionModule, IgnitionModuleResult } from "./types/module"; -import { IgnitionModuleBuilder } from "./types/module-builder"; - -const STUB_MODULE_RESULTS = { - [inspect.custom]() { - return ""; - }, -}; +import { IgnitionModuleResult } from "./types/module"; +import { + IgnitionModuleDefinition, + IgnitionModuleBuilder, +} from "./types/module-builder"; export function buildModule< ModuleIdT extends string, @@ -17,17 +10,7 @@ export function buildModule< IgnitionModuleResultsT extends IgnitionModuleResult >( moduleId: ModuleIdT, - factory: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT -): IgnitionModule { - // TODO: validate that moduleId is unique. How do we do it?? Maybe later? Is there a global context? - - const mod = new IgnitionModuleImplementation< - ModuleIdT, - ContractNameT, - IgnitionModuleResultsT - >(moduleId, STUB_MODULE_RESULTS as any); - - (mod as any).results = factory(new IgnitionModuleBuilderImplementation(mod)); - - return mod; + moduleDefintionFunction: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT +): IgnitionModuleDefinition { + return { id: moduleId, moduleDefintionFunction }; } From 41b8374e62ced6c002138835a2b61c04760717d4 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 15:58:21 -0300 Subject: [PATCH 0312/1302] Introduce ModuleConstructor class. --- .../src/new-api/internal/module-builder.ts | 67 +++++++++++++++++-- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index fe66d43adb..7a4e09a036 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -1,4 +1,5 @@ import assert from "assert"; +import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; import { ArtifactType, SolidityParamsType } from "../stubs"; @@ -12,6 +13,7 @@ import { ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, + IgnitionModuleDefinition, } from "../types/module-builder"; import { @@ -21,6 +23,60 @@ import { } from "./module"; import { isFuture } from "./utils"; +const STUB_MODULE_RESULTS = { + [inspect.custom](): string { + return ""; + }, +}; + +/** + * This class is in charge of turning `IgnitionModuleDefinition`s into + * `IgnitionModule`s. + * + * Part of this class' responsibility is handling any concrete + * value that's only present during deployment (e.g. chain id, accounts, and + * module params). + * + * TODO: Add support for concrete values. + */ +export class ModuleConstructor { + private _modules: Map = new Map(); + + public construct< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + moduleDefintion: IgnitionModuleDefinition< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + > + ): IgnitionModule { + const cachedModule = this._modules.get(moduleDefintion.id); + if (cachedModule !== undefined) { + // NOTE: This is actually unsafe, but we accept the risk. + // A different module could have been cached with this id, and that would lead + // to this method returning a module with a different type than that of its signature. + return cachedModule as any; + } + + const mod = new IgnitionModuleImplementation< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >(moduleDefintion.id, STUB_MODULE_RESULTS as any); + + (mod as any).results = moduleDefintion.moduleDefintionFunction( + new IgnitionModuleBuilderImplementation(this, mod) + ); + + this._modules.set(moduleDefintion.id, mod); + + return mod; + } +} + export class IgnitionModuleBuilderImplementation< ModuleIdT extends string, ResultsContractNameT extends string, @@ -30,6 +86,7 @@ export class IgnitionModuleBuilderImplementation< private _futureIds: Set; constructor( + private readonly _constructor: ModuleConstructor, private readonly _module: IgnitionModuleImplementation< ModuleIdT, ResultsContractNameT, @@ -106,24 +163,26 @@ export class IgnitionModuleBuilderImplementation< SubmoduleContractNameT extends string, SubmoduleIgnitionModuleResultsT extends IgnitionModuleResult >( - ignitionModule: IgnitionModule< + submoduleDefinition: IgnitionModuleDefinition< SubmoduleModuleIdT, SubmoduleContractNameT, SubmoduleIgnitionModuleResultsT > ): SubmoduleIgnitionModuleResultsT { assert( - ignitionModule !== undefined, + submoduleDefinition !== undefined, "Trying to use `undefined` as submodule. Make sure you don't have a circular dependency of modules." ); + const submodule = this._constructor.construct(submoduleDefinition); + // Some things that should be done here: // - Keep track of the submodule // - return the submodule's results // - this._module.submodules.add(ignitionModule); + this._module.submodules.add(submodule); - return ignitionModule.results; + return submodule.results; } private _assertUniqueContractId(futureId: string) { From 836dc94fe3806fa6c9efb59c352ea7c242040ab8 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 16:08:25 -0300 Subject: [PATCH 0313/1302] Update tests --- packages/core/test/new-api/contract.ts | 67 +++++++--- .../core/test/new-api/contractFromArtifact.ts | 116 +++++++++++------- packages/core/test/new-api/library.ts | 1 - .../core/test/new-api/libraryFromArtifact.ts | 1 - packages/core/test/new-api/useModule.ts | 40 ++++-- 5 files changed, 151 insertions(+), 74 deletions(-) diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 4e55735359..bffcea1c6a 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -1,18 +1,23 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + assert.isDefined(moduleWithASingleContract); // Sets ids based on module id and contract name @@ -34,12 +39,20 @@ describe("contract", () => { }); it("should be able to pass one contract as an arg dependency to another", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another", [example]); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another", [example]); + + return { example, another }; + } + ); - return { example, another }; - }); + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -62,12 +75,20 @@ describe("contract", () => { }); it("should be able to pass one contract as an after dependency of another", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another", [], { after: [example] }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another", [], { after: [example] }); + + return { example, another }; + } + ); - return { example, another }; - }); + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -91,14 +112,22 @@ describe("contract", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract", [], { id: "first" }); - const sameContract2 = m.contract("SameContract", [], { - id: "second", - }); + const moduleWithSameContractTwiceDefinition = buildModule( + "Module1", + (m) => { + const sameContract1 = m.contract("SameContract", [], { id: "first" }); + const sameContract2 = m.contract("SameContract", [], { + id: "second", + }); - return { sameContract1, sameContract2 }; - }); + return { sameContract1, sameContract2 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 2e485a65e6..267252b007 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,21 +1,29 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("contractFromArtifact", () => { const fakeArtifact: any = {}; it("should be able to deploy with a contract based on an artifact", () => { - const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - 1, - "a", - BigInt("9007199254740991"), - ]); - - return { contract1 }; - }); + const moduleWithContractFromArtifactDefinition = buildModule( + "Module1", + (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + 1, + "a", + BigInt("9007199254740991"), + ]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithContractFromArtifact = constructor.construct( + moduleWithContractFromArtifactDefinition + ); assert.isDefined(moduleWithContractFromArtifact); @@ -40,14 +48,22 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an arg dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [ - example, - ]); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [ + example, + ]); + + return { example, another }; + } + ); - return { example, another }; - }); + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.equal(moduleWithDependentContracts.futures.size, 2); @@ -59,14 +75,22 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [], { - after: [example], - }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + after: [example], + }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.equal(moduleWithDependentContracts.futures.size, 2); @@ -79,24 +103,32 @@ describe("contractFromArtifact", () => { describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { id: "first" } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "second", - } - ); - - return { sameContract1, sameContract2 }; - }); + const moduleWithSameContractTwiceDefinition = buildModule( + "Module1", + (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { id: "first" } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); // Sets ids based on module id and contract name assert.equal(moduleWithSameContractTwice.id, "Module1"); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index d8cc38ac2f..217229b533 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 11c40f4209..b7a00e6fff 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index a28bcf5c24..6024ff2db2 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -1,41 +1,53 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("useModule", () => { it("should be able to use a submodule", () => { - const submodule = buildModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1 } = m.useModule(submodule); + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; }); + const constructor = new ModuleConstructor(); + const submodule = constructor.construct(submoduleDefinition); + const moduleWithSubmodule = constructor.construct( + moduleWithSubmoduleDefinition + ); + // the submodule is linked assert.equal(moduleWithSubmodule.submodules.size, 1); assert(moduleWithSubmodule.submodules.has(submodule)); }); it("returns the same result set (object equal) for each usage", () => { - const submodule = buildModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1: first } = m.useModule(submodule); - const { contract1: second } = m.useModule(submodule); + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const { contract1: first } = m.useModule(submoduleDefinition); + const { contract1: second } = m.useModule(submoduleDefinition); return { first, second }; }); + const constructor = new ModuleConstructor(); + const submodule = constructor.construct(submoduleDefinition); + const moduleWithSubmodule = constructor.construct( + moduleWithSubmoduleDefinition + ); + assert.equal( moduleWithSubmodule.results.first, moduleWithSubmodule.results.second @@ -46,20 +58,26 @@ describe("useModule", () => { }); it("supports dependending on returned results", () => { - const submodule = buildModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmodule = buildModule("Module1", (m) => { - const { contract1 } = m.useModule(submodule); + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); const contract2 = m.contract("Contract2", [contract1]); return { contract2 }; }); + const constructor = new ModuleConstructor(); + const submodule = constructor.construct(submoduleDefinition); + const moduleWithSubmodule = constructor.construct( + moduleWithSubmoduleDefinition + ); + assert( moduleWithSubmodule.results.contract2.dependencies.has( submodule.results.contract1 From d34db47e9daf809b411b7b64b2cf09dfef3639af Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 16:40:07 -0300 Subject: [PATCH 0314/1302] Adapt more tests --- packages/core/test/new-api/contract.ts | 46 ++++++----- .../core/test/new-api/contractFromArtifact.ts | 76 ++++++++++--------- 2 files changed, 70 insertions(+), 52 deletions(-) diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index bffcea1c6a..8ff65e36b0 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -141,29 +141,39 @@ describe("contract", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - const sameContract2 = m.contract("SameContract"); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + const sameContract2 = m.contract("SameContract"); - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:SameContract has already been used/ + ); }); it("should throw if a contract tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract", [], { - id: "same", - }); - const sameContract2 = m.contract("SameContract", [], { - id: "same", - }); - - return { sameContract1, sameContract2 }; + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract", [], { + id: "same", }); - }, /Contracts must have unique ids, Module1:same has already been used/); + const sameContract2 = m.contract("SameContract", [], { + id: "same", + }); + + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:same has already been used/ + ); }); }); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 267252b007..c54b59c66a 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -143,45 +143,53 @@ describe("contractFromArtifact", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:SameContract has already been used/ + ); }); it("should throw if a contract tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + const sameContract2 = m.contractFromArtifact( + "SameContract", + fakeArtifact, + [], + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:same has already been used/); + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:same has already been used/ + ); }); }); }); From e4b1d04c22c3a148f9f22265b4b51648da622ecb Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 4 May 2023 00:53:50 -0400 Subject: [PATCH 0315/1302] added library and libraryFromArtifact to new api --- .../src/new-api/internal/module-builder.ts | 62 +++++++++++++++++++ packages/core/src/new-api/internal/module.ts | 33 ++++++++++ .../core/src/new-api/types/module-builder.ts | 27 ++++++++ packages/core/src/new-api/types/module.ts | 21 +++++++ 4 files changed, 143 insertions(+) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 7a4e09a036..2789c164c1 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -5,21 +5,27 @@ import { IgnitionValidationError } from "../../errors"; import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, + ArtifactLibraryDeploymentFuture, IgnitionModule, IgnitionModuleResult, NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, } from "../types/module"; import { ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, IgnitionModuleDefinition, + LibraryFromArtifactOptions, + LibraryOptions, } from "../types/module-builder"; import { ArtifactContractDeploymentFutureImplementation, + ArtifactLibraryDeploymentFutureImplementation, IgnitionModuleImplementation, NamedContractDeploymentFutureImplementation, + NamedLibraryDeploymentFutureImplementation, } from "./module"; import { isFuture } from "./utils"; @@ -121,6 +127,12 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } + for (const libraryFuture of Object.values(options.libraries ?? {}).filter( + isFuture + )) { + future.dependencies.add(libraryFuture); + } + this._module.futures.add(future); return future; @@ -158,6 +170,56 @@ export class IgnitionModuleBuilderImplementation< return future; } + public library( + libraryName: LibraryNameT, + options: LibraryOptions = {} + ): NamedLibraryDeploymentFuture { + const id = options.id ?? libraryName; + const futureId = `${this._module.id}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new NamedLibraryDeploymentFutureImplementation( + futureId, + this._module, + libraryName + ); + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + + public libraryFromArtifact( + libraryName: string, + artifact: ArtifactType, + options: LibraryFromArtifactOptions = {} + ): ArtifactLibraryDeploymentFuture { + const id = options.id ?? libraryName; + const futureId = `${this._module.id}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new ArtifactLibraryDeploymentFutureImplementation( + futureId, + this._module, + libraryName, + artifact + ); + + this._module.futures.add(future); + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 467b5626af..4f11da4293 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -8,6 +8,8 @@ import { NamedContractDeploymentFuture, ArtifactContractDeploymentFuture, IgnitionModuleResult, + NamedLibraryDeploymentFuture, + ArtifactLibraryDeploymentFuture, } from "../types/module"; export abstract class BaseFuture< @@ -69,6 +71,37 @@ export class ArtifactContractDeploymentFutureImplementation< } } +export class NamedLibraryDeploymentFutureImplementation< + LibraryNameT extends string + > + extends BaseFuture + implements NamedLibraryDeploymentFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly libraryName: LibraryNameT + ) { + super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); + } +} + +export class ArtifactLibraryDeploymentFutureImplementation< + LibraryNameT extends string + > + extends BaseFuture + implements ArtifactLibraryDeploymentFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly libraryName: LibraryNameT, + public readonly artifact: ArtifactType + ) { + super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); + } +} + export class IgnitionModuleImplementation< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index a335e562b8..e74c90c7c5 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -2,9 +2,12 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, + ArtifactLibraryDeploymentFuture, Future, IgnitionModuleResult, + LibraryFuture, NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, } from "./module"; export interface IgnitionModuleDefinition< @@ -19,6 +22,9 @@ export interface IgnitionModuleDefinition< export interface ContractOptions { id?: string; after?: Future[]; + libraries?: { + [libraryName: string]: LibraryFuture; + }; } export interface ContractFromArtifactOptions { @@ -26,6 +32,16 @@ export interface ContractFromArtifactOptions { after?: Future[]; } +export interface LibraryOptions { + id?: string; + after?: Future[]; +} + +export interface LibraryFromArtifactOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, @@ -40,6 +56,17 @@ export interface IgnitionModuleBuilder { options?: ContractFromArtifactOptions ): ArtifactContractDeploymentFuture; + library( + libraryName: LibraryNameT, + options?: LibraryOptions + ): NamedLibraryDeploymentFuture; + + libraryFromArtifact( + libraryName: string, + artifact: ArtifactType, + options?: LibraryFromArtifactOptions + ): ArtifactLibraryDeploymentFuture; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 8c9de0e1cd..6711cb3a09 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -3,6 +3,8 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; export enum FutureType { NAMED_CONTRACT_DEPLOYMENT, ARTIFACT_CONTRACT_DEPLOYMENT, + NAMED_LIBRARY_DEPLOYMENT, + ARTIFACT_LIBRARY_DEPLOYMENT, } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -26,6 +28,12 @@ export interface ContractFuture contractName: ContractNameT; } +// A future representing a library. Either an existing one or one that will be deployed +export interface LibraryFuture + extends Future { + libraryName: LibraryNameT; +} + // A future representing the deployment of a contract that belongs to this project export interface NamedContractDeploymentFuture extends ContractFuture { @@ -42,6 +50,19 @@ export interface ArtifactContractDeploymentFuture constructorArgs: SolidityParamsType; } +// A future representing the deployment of a library that belongs to this project +export interface NamedLibraryDeploymentFuture + extends LibraryFuture { + type: FutureType.NAMED_LIBRARY_DEPLOYMENT; +} + +// A future representing the deployment of a library that we only know its artifact. +// It may not belong to this project, and we may struggle to type. +export interface ArtifactLibraryDeploymentFuture extends LibraryFuture { + type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + artifact: ArtifactType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [contract: string]: ContractFuture; From 94b6cce727e74690458d0a62406eaff8d4608e1d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 4 May 2023 01:07:23 -0400 Subject: [PATCH 0316/1302] add tests for library --- packages/core/src/new-api/types/module.ts | 2 +- packages/core/test/new-api/library.ts | 220 ++++++++++------------ 2 files changed, 98 insertions(+), 124 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 6711cb3a09..45654c47a5 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -65,7 +65,7 @@ export interface ArtifactLibraryDeploymentFuture extends LibraryFuture { // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { - [contract: string]: ContractFuture; + [name: string]: ContractFuture | LibraryFuture; } export interface IgnitionModule< diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 217229b533..5c45f24c7c 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,137 +1,111 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; +import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { FutureType } from "../../src/new-api/types/module"; -describe("library", () => { - it.skip("should be able to setup a deploy library call", () => { +describe.only("library", () => { + it("should be able to setup a deploy library call", () => { const moduleWithASingleContract = buildModule("Module1", (m) => { - const library1 = (m as any).library("Library1"); + const library1 = m.library("Library1"); return { library1 }; }); assert.isDefined(moduleWithASingleContract); - // // Sets ids based on module id and contract name - // assert.equal(moduleWithASingleContract.id, "Module1"); - // assert.equal( - // moduleWithASingleContract.results.contract1.id, - // "Module1:Contract1" - // ); - - // // 1 contract future - // assert.equal(moduleWithASingleContract.futures.size, 1); - // assert.equal( - // [...moduleWithASingleContract.futures][0].type, - // FutureType.NAMED_CONTRACT_DEPLOYMENT - // ); - - // // No submodules - // assert.equal(moduleWithASingleContract.submodules.size, 0); + // Sets ids based on module id and library name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.library1.id, + "Module1:Library1" + ); + + // 1 contract future + assert.equal(moduleWithASingleContract.futures.size, 1); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_LIBRARY_DEPLOYMENT + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); }); - // it("should be able to pass one library as an arg dependency to another", () => { - // const moduleWithDependentContracts = buildModule("Module1", (m) => { - // const example = m.contract("Example"); - // const another = m.contract("Another", [example]); - - // return { example, another }; - // }); - - // assert.isDefined(moduleWithDependentContracts); - - // const exampleFuture = [...moduleWithDependentContracts.futures].find( - // ({ id }) => id === "Module1:Example" - // ); - - // const anotherFuture = [...moduleWithDependentContracts.futures].find( - // ({ id }) => id === "Module1:Another" - // ); - - // if ( - // !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) - // ) { - // assert.fail("Not a named contract deployment"); - // } - - // assert.equal(anotherFuture.dependencies.size, 1); - // assert(anotherFuture.dependencies.has(exampleFuture!)); - // }); - - // it("should be able to pass one library as an after dependency of another", () => { - // const moduleWithDependentContracts = buildModule("Module1", (m) => { - // const example = m.contract("Example"); - // const another = m.contract("Another", [], { after: [example] }); - - // return { example, another }; - // }); - - // assert.isDefined(moduleWithDependentContracts); - - // const exampleFuture = [...moduleWithDependentContracts.futures].find( - // ({ id }) => id === "Module1:Example" - // ); - - // const anotherFuture = [...moduleWithDependentContracts.futures].find( - // ({ id }) => id === "Module1:Another" - // ); - - // if ( - // !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) - // ) { - // assert.fail("Not a named contract deployment"); - // } - - // assert.equal(anotherFuture.dependencies.size, 1); - // assert(anotherFuture.dependencies.has(exampleFuture!)); - // }); - - // describe("passing id", () => { - // it("should be able to deploy the same library twice by passing an id", () => { - // const moduleWithSameContractTwice = buildModule("Module1", (m) => { - // const sameContract1 = m.contract("SameContract", [], { id: "first" }); - // const sameContract2 = m.contract("SameContract", [], { - // id: "second", - // }); - - // return { sameContract1, sameContract2 }; - // }); - - // assert.equal(moduleWithSameContractTwice.id, "Module1"); - // assert.equal( - // moduleWithSameContractTwice.results.sameContract1.id, - // "Module1:first" - // ); - // assert.equal( - // moduleWithSameContractTwice.results.sameContract2.id, - // "Module1:second" - // ); - // }); - - // it("should throw if the same library is deployed twice without differentiating ids", () => { - // assert.throws(() => { - // buildModule("Module1", (m) => { - // const sameContract1 = m.contract("SameContract"); - // const sameContract2 = m.contract("SameContract"); - - // return { sameContract1, sameContract2 }; - // }); - // }, /Contracts must have unique ids, Module1:SameContract has already been used/); - // }); - - // it("should throw if a library tries to pass the same id twice", () => { - // assert.throws(() => { - // buildModule("Module1", (m) => { - // const sameContract1 = m.contract("SameContract", [], { - // id: "same", - // }); - // const sameContract2 = m.contract("SameContract", [], { - // id: "same", - // }); - - // return { sameContract1, sameContract2 }; - // }); - // }, /Contracts must have unique ids, Module1:same has already been used/); - // }); - // }); + it("should be able to pass one library as an after dependency of another", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.library("Example"); + const another = m.library("Another", { after: [example] }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not a named library deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + describe("passing id", () => { + it("should be able to deploy the same library twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.library("SameContract", { id: "first" }); + const sameContract2 = m.library("SameContract", { + id: "second", + }); + + return { sameContract1, sameContract2 }; + }); + + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same library is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.library("SameContract"); + const sameContract2 = m.library("SameContract"); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a library tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.library("SameContract", { + id: "same", + }); + const sameContract2 = m.library("SameContract", { + id: "same", + }); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); }); From 2675cac41eec37cfaea7f60f9756c041192da130 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 4 May 2023 01:10:58 -0400 Subject: [PATCH 0317/1302] add tests for libraryFromArtifact --- packages/core/test/new-api/library.ts | 2 +- .../core/test/new-api/libraryFromArtifact.ts | 235 ++++++++---------- 2 files changed, 102 insertions(+), 135 deletions(-) diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 5c45f24c7c..4960c20376 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -4,7 +4,7 @@ import { buildModule } from "../../src/new-api/build-module"; import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { FutureType } from "../../src/new-api/types/module"; -describe.only("library", () => { +describe("library", () => { it("should be able to setup a deploy library call", () => { const moduleWithASingleContract = buildModule("Module1", (m) => { const library1 = m.library("Library1"); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index b7a00e6fff..1219f86e04 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -7,148 +7,115 @@ describe("libraryFromArtifact", () => { it("should be able to deploy with a library based on an artifact", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const library1 = m.contractFromArtifact("Library1", fakeArtifact, [ - 1, - "a", - BigInt("9007199254740991"), - ]); + const library1 = m.libraryFromArtifact("Library1", fakeArtifact); - return { contract1: library1 }; + return { library1 }; }); assert.isDefined(moduleWithContractFromArtifact); - // // Sets ids based on module id and contract name - // assert.equal(moduleWithContractFromArtifact.id, "Module1"); - // assert.equal( - // moduleWithContractFromArtifact.results.contract1.id, - // "Module1:Contract1" - // ); + // Sets ids based on module id and contract name + assert.equal(moduleWithContractFromArtifact.id, "Module1"); + assert.equal( + moduleWithContractFromArtifact.results.library1.id, + "Module1:Library1" + ); - // // Stores the arguments - // assert.deepStrictEqual( - // moduleWithContractFromArtifact.results.contract1.constructorArgs, - // [1, "a", BigInt("9007199254740991")] - // ); + // 1 contract future + assert.equal(moduleWithContractFromArtifact.futures.size, 1); - // // 1 contract future - // assert.equal(moduleWithContractFromArtifact.futures.size, 1); + // No submodules + assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + it("should be able to pass an after dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.library("Example"); + const another = m.libraryFromArtifact("Another", fakeArtifact, { + after: [example], + }); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; - // // No submodules - // assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); }); - // it("should be able to pass an arg dependency", () => { - // const moduleWithDependentContracts = buildModule("Module1", (m) => { - // const example = m.contract("Example"); - // const another = m.contractFromArtifact("Another", fakeArtifact, [ - // example, - // ]); - - // return { example, another }; - // }); - - // assert.equal(moduleWithDependentContracts.futures.size, 2); - - // const exampleFuture = moduleWithDependentContracts.results.example; - // const anotherFuture = moduleWithDependentContracts.results.another; - - // assert.equal(anotherFuture.dependencies.size, 1); - // assert(anotherFuture.dependencies.has(exampleFuture!)); - // }); - - // it("should be able to pass an after dependency", () => { - // const moduleWithDependentContracts = buildModule("Module1", (m) => { - // const example = m.contract("Example"); - // const another = m.contractFromArtifact("Another", fakeArtifact, [], { - // after: [example], - // }); - - // return { example, another }; - // }); - - // assert.equal(moduleWithDependentContracts.futures.size, 2); - - // const exampleFuture = moduleWithDependentContracts.results.example; - // const anotherFuture = moduleWithDependentContracts.results.another; - - // assert.equal(anotherFuture.dependencies.size, 1); - // assert(anotherFuture.dependencies.has(exampleFuture!)); - // }); - - // describe("passing id", () => { - // it("should use library from artifact twice by passing an id", () => { - // const moduleWithSameContractTwice = buildModule("Module1", (m) => { - // const sameContract1 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact, - // [], - // { id: "first" } - // ); - // const sameContract2 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact, - // [], - // { - // id: "second", - // } - // ); - - // return { sameContract1, sameContract2 }; - // }); - - // // Sets ids based on module id and contract name - // assert.equal(moduleWithSameContractTwice.id, "Module1"); - // assert.equal( - // moduleWithSameContractTwice.results.sameContract1.id, - // "Module1:first" - // ); - // assert.equal( - // moduleWithSameContractTwice.results.sameContract2.id, - // "Module1:second" - // ); - // }); - - // it("should throw if the same library is deployed twice without differentiating ids", () => { - // assert.throws(() => { - // buildModule("Module1", (m) => { - // const sameContract1 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact - // ); - // const sameContract2 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact - // ); - - // return { sameContract1, sameContract2 }; - // }); - // }, /Contracts must have unique ids, Module1:SameContract has already been used/); - // }); - - // it("should throw if a library tries to pass the same id twice", () => { - // assert.throws(() => { - // buildModule("Module1", (m) => { - // const sameContract1 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact, - // [], - // { - // id: "same", - // } - // ); - // const sameContract2 = m.contractFromArtifact( - // "SameContract", - // fakeArtifact, - // [], - // { - // id: "same", - // } - // ); - - // return { sameContract1, sameContract2 }; - // }); - // }, /Contracts must have unique ids, Module1:same has already been used/); - // }); - // }); + describe("passing id", () => { + it("should use library from artifact twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { id: "first" } + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + }); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same library is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a library tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "same", + } + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); }); From c6c045cc7d9bb43c0cfc5f8f8a45126ef42697cb Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 4 May 2023 01:16:26 -0400 Subject: [PATCH 0318/1302] added test for libraries as contract option --- packages/core/test/new-api/contract.ts | 30 ++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 8ff65e36b0..f99cffa001 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -110,6 +110,36 @@ describe("contract", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass a library as a dependency of a contract", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.library("Example"); + const another = m.contract("Another", [], { + libraries: { Example: example }, + }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = buildModule( From 3e841c76389fe128cdd1b704d5be4c4549030c56 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 11 May 2023 23:55:52 -0400 Subject: [PATCH 0319/1302] update error function --- .../src/new-api/internal/module-builder.ts | 50 ++++++++++++++++--- packages/core/test/new-api/library.ts | 4 +- .../core/test/new-api/libraryFromArtifact.ts | 4 +- 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 2789c164c1..9706145593 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -147,7 +147,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueArtifactContractId(futureId); const future = new ArtifactContractDeploymentFutureImplementation( futureId, @@ -177,7 +177,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueLibraryId(futureId); const future = new NamedLibraryDeploymentFutureImplementation( futureId, @@ -202,7 +202,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueArtifactLibraryId(futureId); const future = new ArtifactLibraryDeploymentFutureImplementation( futureId, @@ -247,18 +247,52 @@ export class IgnitionModuleBuilderImplementation< return submodule.results; } - private _assertUniqueContractId(futureId: string) { + private _assertUniqueFutureId( + futureId: string, + message: string, + func: (...[]: any[]) => any + ) { if (this._futureIds.has(futureId)) { - const validationError = new IgnitionValidationError( - `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\`` - ); + const validationError = new IgnitionValidationError(message); // Improve the stack trace to stop on module api level - Error.captureStackTrace(validationError, this.contract); + Error.captureStackTrace(validationError, func); throw validationError; } this._futureIds.add(futureId); } + + private _assertUniqueContractId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\``, + this.contract + ); + } + + private _assertUniqueArtifactContractId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contractFromArtifact("MyContract", artifact, [], { id: "MyId"})\``, + this.contractFromArtifact + ); + } + + private _assertUniqueLibraryId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Libraries must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.library("MyLibrary", { id: "MyId"})\``, + this.library + ); + } + + private _assertUniqueArtifactLibraryId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Libraries must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.libraryFromArtifact("MyLibrary", artifact, { id: "MyId"})\``, + this.libraryFromArtifact + ); + } } diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 4960c20376..6c2affb796 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -90,7 +90,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }, /Libraries must have unique ids, Module1:SameContract has already been used/); }); it("should throw if a library tries to pass the same id twice", () => { @@ -105,7 +105,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:same has already been used/); + }, /Libraries must have unique ids, Module1:same has already been used/); }); }); }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 1219f86e04..646962d980 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -92,7 +92,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }, /Libraries must have unique ids, Module1:SameContract has already been used/); }); it("should throw if a library tries to pass the same id twice", () => { @@ -115,7 +115,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:same has already been used/); + }, /Libraries must have unique ids, Module1:same has already been used/); }); }); }); From 4c5a995d30776fe1682a2641531b112fd0f382bd Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 16:29:05 -0300 Subject: [PATCH 0320/1302] Update tests --- packages/core/test/new-api/contract.ts | 22 ++++-- packages/core/test/new-api/library.ts | 48 ++++++++--- .../core/test/new-api/libraryFromArtifact.ts | 79 ++++++++++++------- 3 files changed, 102 insertions(+), 47 deletions(-) diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index f99cffa001..4693387140 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -111,14 +111,22 @@ describe("contract", () => { }); it("should be able to pass a library as a dependency of a contract", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.library("Example"); - const another = m.contract("Another", [], { - libraries: { Example: example }, - }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.contract("Another", [], { + libraries: { Example: example }, + }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 6c2affb796..80e39da228 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -2,16 +2,22 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("library", () => { it("should be able to setup a deploy library call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1"); return { library1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + assert.isDefined(moduleWithASingleContract); // Sets ids based on module id and library name @@ -33,12 +39,20 @@ describe("library", () => { }); it("should be able to pass one library as an after dependency of another", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.library("Example"); - const another = m.library("Another", { after: [example] }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.library("Another", { after: [example] }); + + return { example, another }; + } + ); - return { example, another }; - }); + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -62,14 +76,22 @@ describe("library", () => { describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.library("SameContract", { id: "first" }); - const sameContract2 = m.library("SameContract", { - id: "second", - }); + const moduleWithSameContractTwiceDefinition = buildModule( + "Module1", + (m) => { + const sameContract1 = m.library("SameContract", { id: "first" }); + const sameContract2 = m.library("SameContract", { + id: "second", + }); + + return { sameContract1, sameContract2 }; + } + ); - return { sameContract1, sameContract2 }; - }); + const constructor = new ModuleConstructor(); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 646962d980..719f101c2e 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,16 +1,25 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("libraryFromArtifact", () => { const fakeArtifact: any = {}; it("should be able to deploy with a library based on an artifact", () => { - const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const library1 = m.libraryFromArtifact("Library1", fakeArtifact); + const moduleWithContractFromArtifactDefinition = buildModule( + "Module1", + (m) => { + const library1 = m.libraryFromArtifact("Library1", fakeArtifact); - return { library1 }; - }); + return { library1 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithContractFromArtifact = constructor.construct( + moduleWithContractFromArtifactDefinition + ); assert.isDefined(moduleWithContractFromArtifact); @@ -29,14 +38,22 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.library("Example"); - const another = m.libraryFromArtifact("Another", fakeArtifact, { - after: [example], - }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.libraryFromArtifact("Another", fakeArtifact, { + after: [example], + }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.equal(moduleWithDependentContracts.futures.size, 2); @@ -49,22 +66,30 @@ describe("libraryFromArtifact", () => { describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { id: "first" } - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "second", - } - ); - - return { sameContract1, sameContract2 }; - }); + const moduleWithSameContractTwiceDefinition = buildModule( + "Module1", + (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { id: "first" } + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); // Sets ids based on module id and contract name assert.equal(moduleWithSameContractTwice.id, "Module1"); From c9016dfc1bed84c6c1f8fbfea0501660ff24d4ff Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 16:42:57 -0300 Subject: [PATCH 0321/1302] Adapt more tests --- packages/core/test/new-api/library.ts | 44 +++++++----- .../core/test/new-api/libraryFromArtifact.ts | 72 ++++++++++--------- 2 files changed, 66 insertions(+), 50 deletions(-) diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 80e39da228..2b39e84ff1 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -105,29 +105,37 @@ describe("library", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.library("SameContract"); - const sameContract2 = m.library("SameContract"); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.library("SameContract"); + const sameContract2 = m.library("SameContract"); - return { sameContract1, sameContract2 }; - }); - }, /Libraries must have unique ids, Module1:SameContract has already been used/); + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Libraries must have unique ids, Module1:SameContract has already been used/ + ); }); it("should throw if a library tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.library("SameContract", { - id: "same", - }); - const sameContract2 = m.library("SameContract", { - id: "same", - }); - - return { sameContract1, sameContract2 }; + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.library("SameContract", { + id: "same", }); - }, /Libraries must have unique ids, Module1:same has already been used/); + const sameContract2 = m.library("SameContract", { + id: "same", + }); + + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Libraries must have unique ids, Module1:same has already been used/ + ); }); }); }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 719f101c2e..eea9e69653 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -104,43 +104,51 @@ describe("libraryFromArtifact", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); - return { sameContract1, sameContract2 }; - }); - }, /Libraries must have unique ids, Module1:SameContract has already been used/); + assert.throws( + () => constructor.construct(moduleDefinition), + /Libraries must have unique ids, Module1:SameContract has already been used/ + ); }); it("should throw if a library tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "same", - } - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "same", - } - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "same", + } + ); + const sameContract2 = m.libraryFromArtifact( + "SameContract", + fakeArtifact, + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + const constructor = new ModuleConstructor(); - return { sameContract1, sameContract2 }; - }); - }, /Libraries must have unique ids, Module1:same has already been used/); + assert.throws( + () => constructor.construct(moduleDefinition), + /Libraries must have unique ids, Module1:same has already been used/ + ); }); }); }); From 61e579e29784d88b370854e99fb2cd693250ec80 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 May 2023 22:56:10 -0400 Subject: [PATCH 0322/1302] addressed comments and added tests --- .../src/new-api/internal/module-builder.ts | 48 ++++++++++++++----- packages/core/src/new-api/internal/module.ts | 15 ++++-- .../core/src/new-api/types/module-builder.ts | 9 ++-- packages/core/src/new-api/types/module.ts | 17 ++++--- packages/core/test/new-api/contract.ts | 5 +- .../core/test/new-api/contractFromArtifact.ts | 44 ++++++++++++++++- packages/core/test/new-api/library.ts | 43 ++++++++++++++++- .../core/test/new-api/libraryFromArtifact.ts | 44 ++++++++++++++++- 8 files changed, 188 insertions(+), 37 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 9706145593..c3b997bb14 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -109,6 +109,7 @@ export class IgnitionModuleBuilderImplementation< ): NamedContractDeploymentFuture { const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + options.libraries ??= {}; this._assertUniqueContractId(futureId); @@ -116,7 +117,8 @@ export class IgnitionModuleBuilderImplementation< futureId, this._module, contractName, - args + args, + options.libraries ); for (const arg of args.filter(isFuture)) { @@ -127,7 +129,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } - for (const libraryFuture of Object.values(options.libraries ?? {}).filter( + for (const libraryFuture of Object.values(options.libraries).filter( isFuture )) { future.dependencies.add(libraryFuture); @@ -146,6 +148,7 @@ export class IgnitionModuleBuilderImplementation< ): ArtifactContractDeploymentFuture { const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + options.libraries ??= {}; this._assertUniqueArtifactContractId(futureId); @@ -154,7 +157,8 @@ export class IgnitionModuleBuilderImplementation< this._module, contractName, args, - artifact + artifact, + options.libraries ); this._module.futures.add(future); @@ -167,6 +171,12 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } + for (const libraryFuture of Object.values(options.libraries).filter( + isFuture + )) { + future.dependencies.add(libraryFuture); + } + return future; } @@ -176,19 +186,27 @@ export class IgnitionModuleBuilderImplementation< ): NamedLibraryDeploymentFuture { const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; + options.libraries ??= {}; this._assertUniqueLibraryId(futureId); const future = new NamedLibraryDeploymentFutureImplementation( futureId, this._module, - libraryName + libraryName, + options.libraries ); for (const afterFuture of (options.after ?? []).filter(isFuture)) { future.dependencies.add(afterFuture); } + for (const libraryFuture of Object.values(options.libraries).filter( + isFuture + )) { + future.dependencies.add(libraryFuture); + } + this._module.futures.add(future); return future; @@ -201,6 +219,7 @@ export class IgnitionModuleBuilderImplementation< ): ArtifactLibraryDeploymentFuture { const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; + options.libraries ??= {}; this._assertUniqueArtifactLibraryId(futureId); @@ -208,15 +227,22 @@ export class IgnitionModuleBuilderImplementation< futureId, this._module, libraryName, - artifact + artifact, + options.libraries ); - this._module.futures.add(future); - for (const afterFuture of (options.after ?? []).filter(isFuture)) { future.dependencies.add(afterFuture); } + for (const libraryFuture of Object.values(options.libraries).filter( + isFuture + )) { + future.dependencies.add(libraryFuture); + } + + this._module.futures.add(future); + return future; } @@ -267,7 +293,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueContractId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\``, this.contract ); } @@ -275,7 +301,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactContractId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contractFromArtifact("MyContract", artifact, [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractFromArtifact("MyContract", artifact, [], { id: "MyId"})\``, this.contractFromArtifact ); } @@ -283,7 +309,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueLibraryId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Libraries must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.library("MyLibrary", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.library("MyLibrary", { id: "MyId"})\``, this.library ); } @@ -291,7 +317,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactLibraryId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Libraries must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.libraryFromArtifact("MyLibrary", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.libraryFromArtifact("MyLibrary", artifact, { id: "MyId"})\``, this.libraryFromArtifact ); } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 4f11da4293..19ad8db50a 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -10,6 +10,7 @@ import { IgnitionModuleResult, NamedLibraryDeploymentFuture, ArtifactLibraryDeploymentFuture, + ContractFuture, } from "../types/module"; export abstract class BaseFuture< @@ -48,7 +49,8 @@ export class NamedContractDeploymentFutureImplementation< public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly constructorArgs: SolidityParamsType + public readonly constructorArgs: SolidityParamsType, + public readonly libraries: Record> ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); } @@ -65,7 +67,8 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, public readonly constructorArgs: SolidityParamsType, - public readonly artifact: ArtifactType + public readonly artifact: ArtifactType, + public readonly libraries: Record> ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); } @@ -80,7 +83,8 @@ export class NamedLibraryDeploymentFutureImplementation< constructor( public readonly id: string, public readonly module: IgnitionModuleImplementation, - public readonly libraryName: LibraryNameT + public readonly contractName: LibraryNameT, + public readonly libraries: Record> ) { super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); } @@ -95,8 +99,9 @@ export class ArtifactLibraryDeploymentFutureImplementation< constructor( public readonly id: string, public readonly module: IgnitionModuleImplementation, - public readonly libraryName: LibraryNameT, - public readonly artifact: ArtifactType + public readonly contractName: LibraryNameT, + public readonly artifact: ArtifactType, + public readonly libraries: Record> ) { super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index e74c90c7c5..9d07629d68 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -3,9 +3,9 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, + ContractFuture, Future, IgnitionModuleResult, - LibraryFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "./module"; @@ -22,24 +22,25 @@ export interface IgnitionModuleDefinition< export interface ContractOptions { id?: string; after?: Future[]; - libraries?: { - [libraryName: string]: LibraryFuture; - }; + libraries?: Record>; } export interface ContractFromArtifactOptions { id?: string; after?: Future[]; + libraries?: Record>; } export interface LibraryOptions { id?: string; after?: Future[]; + libraries?: Record>; } export interface LibraryFromArtifactOptions { id?: string; after?: Future[]; + libraries?: Record>; } export interface IgnitionModuleBuilder { diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 45654c47a5..0bbe09d5e5 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -28,17 +28,12 @@ export interface ContractFuture contractName: ContractNameT; } -// A future representing a library. Either an existing one or one that will be deployed -export interface LibraryFuture - extends Future { - libraryName: LibraryNameT; -} - // A future representing the deployment of a contract that belongs to this project export interface NamedContractDeploymentFuture extends ContractFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; constructorArgs: SolidityParamsType; + libraries: Record>; } // A future representing the deployment of a contract that we only know its artifact. @@ -48,24 +43,28 @@ export interface ArtifactContractDeploymentFuture type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; artifact: ArtifactType; constructorArgs: SolidityParamsType; + libraries: Record>; } // A future representing the deployment of a library that belongs to this project export interface NamedLibraryDeploymentFuture - extends LibraryFuture { + extends ContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; + libraries: Record>; } // A future representing the deployment of a library that we only know its artifact. // It may not belong to this project, and we may struggle to type. -export interface ArtifactLibraryDeploymentFuture extends LibraryFuture { +export interface ArtifactLibraryDeploymentFuture + extends ContractFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; artifact: ArtifactType; + libraries: Record>; } // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { - [name: string]: ContractFuture | LibraryFuture; + [name: string]: ContractFuture; } export interface IgnitionModule< diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 4693387140..8445f5ebe8 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -145,6 +145,7 @@ describe("contract", () => { } assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.libraries.Example.id, exampleFuture?.id); assert(anotherFuture.dependencies.has(exampleFuture!)); }); @@ -190,7 +191,7 @@ describe("contract", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:SameContract has already been used/ + /Duplicated id Module1:SameContract found in module Module1/ ); }); @@ -210,7 +211,7 @@ describe("contract", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:same has already been used/ + /Duplicated id Module1:same found in module Module1/ ); }); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index c54b59c66a..599cc94744 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -2,6 +2,7 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { ArtifactContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; describe("contractFromArtifact", () => { const fakeArtifact: any = {}; @@ -101,6 +102,45 @@ describe("contractFromArtifact", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass a library as a dependency of a contract", () => { + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + libraries: { Example: example }, + }); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactContractDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact contract deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.libraries.Example.id, exampleFuture?.id); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = buildModule( @@ -159,7 +199,7 @@ describe("contractFromArtifact", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:SameContract has already been used/ + /Duplicated id Module1:SameContract found in module Module1/ ); }); @@ -188,7 +228,7 @@ describe("contractFromArtifact", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:same has already been used/ + /Duplicated id Module1:same found in module Module1/ ); }); }); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 2b39e84ff1..177fba2c7d 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -74,6 +74,45 @@ describe("library", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass a library as a dependency of a library", () => { + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.library("Another", { + libraries: { Example: example }, + }); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not a named library deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.libraries.Example.id, exampleFuture?.id); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = buildModule( @@ -115,7 +154,7 @@ describe("library", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Libraries must have unique ids, Module1:SameContract has already been used/ + /Duplicated id Module1:SameContract found in module Module1/ ); }); @@ -134,7 +173,7 @@ describe("library", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Libraries must have unique ids, Module1:same has already been used/ + /Duplicated id Module1:same found in module Module1/ ); }); }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index eea9e69653..a71543da98 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -2,6 +2,7 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { ArtifactLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; describe("libraryFromArtifact", () => { const fakeArtifact: any = {}; @@ -64,6 +65,45 @@ describe("libraryFromArtifact", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass a library as a dependency of a library", () => { + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.library("Example"); + const another = m.libraryFromArtifact("Another", fakeArtifact, { + libraries: { Example: example }, + }); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact library deployment"); + } + + assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.libraries.Example.id, exampleFuture?.id); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = buildModule( @@ -120,7 +160,7 @@ describe("libraryFromArtifact", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Libraries must have unique ids, Module1:SameContract has already been used/ + /Duplicated id Module1:SameContract found in module Module1/ ); }); @@ -147,7 +187,7 @@ describe("libraryFromArtifact", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Libraries must have unique ids, Module1:same has already been used/ + /Duplicated id Module1:same found in module Module1/ ); }); }); From c814e66b2278f659a5c7621424a4c25cd15d7bfe Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 May 2023 23:13:38 -0400 Subject: [PATCH 0323/1302] fix lint --- packages/core/test/new-api/contractFromArtifact.ts | 2 +- packages/core/test/new-api/libraryFromArtifact.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 599cc94744..430de1da9b 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,8 +1,8 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; -import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { ArtifactContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("contractFromArtifact", () => { const fakeArtifact: any = {}; diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index a71543da98..aac4913eb3 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,8 +1,8 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; -import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { ArtifactLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("libraryFromArtifact", () => { const fakeArtifact: any = {}; From 64cb632f400eced4990c208cce85edb5f3b5aeaa Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 19:57:12 -0400 Subject: [PATCH 0324/1302] call and static call implementation --- .../src/new-api/internal/module-builder.ts | 74 +++++++++++++++++++ packages/core/src/new-api/internal/module.ts | 38 ++++++++++ .../core/src/new-api/types/module-builder.ts | 21 ++++++ packages/core/src/new-api/types/module.ts | 28 +++++++ 4 files changed, 161 insertions(+) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index c3b997bb14..eaaea0620d 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -6,12 +6,16 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, + ContractFuture, IgnitionModule, IgnitionModuleResult, + NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, + NamedStaticCallFuture, } from "../types/module"; import { + CallOptions, ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, @@ -24,8 +28,10 @@ import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, IgnitionModuleImplementation, + NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, + NamedStaticCallFutureImplementation, } from "./module"; import { isFuture } from "./utils"; @@ -246,6 +252,74 @@ export class IgnitionModuleBuilderImplementation< return future; } + public call( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args: SolidityParamsType = [], + options: CallOptions = {} + ): NamedContractCallFuture { + const id = options.id ?? functionName; + const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new NamedContractCallFutureImplementation( + futureId, + this._module, + functionName, + contractFuture, + args + ); + + future.dependencies.add(contractFuture); + + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + + public staticCall( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args: SolidityParamsType = [], + options: CallOptions = {} + ): NamedStaticCallFuture { + const id = options.id ?? functionName; + const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new NamedStaticCallFutureImplementation( + futureId, + this._module, + functionName, + contractFuture, + args + ); + + future.dependencies.add(contractFuture); + + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 19ad8db50a..2584ada7df 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -10,7 +10,9 @@ import { IgnitionModuleResult, NamedLibraryDeploymentFuture, ArtifactLibraryDeploymentFuture, + NamedContractCallFuture, ContractFuture, + NamedStaticCallFuture, } from "../types/module"; export abstract class BaseFuture< @@ -107,6 +109,42 @@ export class ArtifactLibraryDeploymentFutureImplementation< } } +export class NamedContractCallFutureImplementation< + ContractNameT extends string, + FunctionNameT extends string + > + extends BaseFuture + implements NamedContractCallFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly functionName: FunctionNameT, + public readonly contract: ContractFuture, + public readonly args: SolidityParamsType + ) { + super(id, FutureType.NAMED_CONTRACT_CALL, module); + } +} + +export class NamedStaticCallFutureImplementation< + ContractNameT extends string, + FunctionNameT extends string + > + extends BaseFuture + implements NamedStaticCallFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly functionName: FunctionNameT, + public readonly contract: ContractFuture, + public readonly args: SolidityParamsType + ) { + super(id, FutureType.NAMED_STATIC_CALL, module); + } +} + export class IgnitionModuleImplementation< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 9d07629d68..3aea9d241f 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -6,8 +6,10 @@ import { ContractFuture, Future, IgnitionModuleResult, + NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, + NamedStaticCallFuture, } from "./module"; export interface IgnitionModuleDefinition< @@ -43,6 +45,11 @@ export interface LibraryFromArtifactOptions { libraries?: Record>; } +export interface CallOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, @@ -68,6 +75,20 @@ export interface IgnitionModuleBuilder { options?: LibraryFromArtifactOptions ): ArtifactLibraryDeploymentFuture; + call( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args?: SolidityParamsType, + options?: CallOptions + ): NamedContractCallFuture; + + staticCall( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args?: SolidityParamsType, + options?: CallOptions + ): NamedStaticCallFuture; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0bbe09d5e5..cf1f2eb754 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -5,6 +5,8 @@ export enum FutureType { ARTIFACT_CONTRACT_DEPLOYMENT, NAMED_LIBRARY_DEPLOYMENT, ARTIFACT_LIBRARY_DEPLOYMENT, + NAMED_CONTRACT_CALL, + NAMED_STATIC_CALL, } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -28,6 +30,12 @@ export interface ContractFuture contractName: ContractNameT; } +// A future representing a call. Either a static one or one that modifies contract state +export interface FunctionCallFuture + extends Future { + functionName: FunctionNameT; +} + // A future representing the deployment of a contract that belongs to this project export interface NamedContractDeploymentFuture extends ContractFuture { @@ -62,6 +70,26 @@ export interface ArtifactLibraryDeploymentFuture libraries: Record>; } +// A future representing the calling of a contract function that modifies on-chain state +export interface NamedContractCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_CONTRACT_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + +// A future representing the static calling of a contract function that does not modify state +export interface NamedStaticCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_STATIC_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [name: string]: ContractFuture; From a8c9d773886e008cea50709079697c11ce3b50e7 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 20:46:09 -0400 Subject: [PATCH 0325/1302] added tests for call and static call --- packages/core/test/new-api/call.ts | 156 +++++++++++++++++++++++ packages/core/test/new-api/staticCall.ts | 156 +++++++++++++++++++++++ 2 files changed, 312 insertions(+) create mode 100644 packages/core/test/new-api/call.ts create mode 100644 packages/core/test/new-api/staticCall.ts diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts new file mode 100644 index 0000000000..23c3749640 --- /dev/null +++ b/packages/core/test/new-api/call.ts @@ -0,0 +1,156 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; +import { NamedContractCallFutureImplementation } from "../../src/new-api/internal/module"; +import { FutureType } from "../../src/new-api/types/module"; + +describe("call", () => { + it("should be able to setup a contract call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "test"); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // Sets ids based on module id and contract name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.contract1.id, + "Module1:Contract1" + ); + + // 1 contract future & 1 call future + assert.equal(moduleWithASingleContract.futures.size, 2); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + assert.equal( + [...moduleWithASingleContract.futures][1].type, + FutureType.NAMED_CONTRACT_CALL + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + it("should be able to pass one contract as an arg dependency to a call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.call(example, "test", [another]); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example:test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract call future"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + it("should be able to pass one contract as an after dependency of a call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.call(example, "test", [], { after: [another] }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example:test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + describe("passing id", () => { + it("should be able to call the same function twice by passing an id", () => { + const moduleWithSameCallTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("Example"); + + m.call(sameContract1, "test", [], { id: "first" }); + m.call(sameContract1, "test", [], { id: "second" }); + + return { sameContract1 }; + }); + + assert.equal(moduleWithSameCallTwice.id, "Module1"); + + const callFuture = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:Example:first" + ); + + const callFuture2 = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:Example:second" + ); + + assert.isDefined(callFuture); + assert.isDefined(callFuture2); + }); + + it("should throw if the same function is called twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.call(sameContract1, "test"); + m.call(sameContract1, "test"); + + return { sameContract1 }; + }); + }, /Contracts must have unique ids, Module1:SameContract:test has already been used/); + }); + + it("should throw if a call tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.call(sameContract1, "test", [], { id: "first" }); + m.call(sameContract1, "test", [], { id: "first" }); + return { sameContract1 }; + }); + }, /Contracts must have unique ids, Module1:SameContract:first has already been used/); + }); + }); +}); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts new file mode 100644 index 0000000000..a506730504 --- /dev/null +++ b/packages/core/test/new-api/staticCall.ts @@ -0,0 +1,156 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; +import { NamedStaticCallFutureImplementation } from "../../src/new-api/internal/module"; +import { FutureType } from "../../src/new-api/types/module"; + +describe("static call", () => { + it("should be able to setup a static call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "test"); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // Sets ids based on module id and contract name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.contract1.id, + "Module1:Contract1" + ); + + // 1 contract future & 1 call future + assert.equal(moduleWithASingleContract.futures.size, 2); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_CONTRACT_DEPLOYMENT + ); + assert.equal( + [...moduleWithASingleContract.futures][1].type, + FutureType.NAMED_STATIC_CALL + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + it("should be able to pass one contract as an arg dependency to a static call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.staticCall(example, "test", [another]); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example:test" + ); + + if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { + assert.fail("Not a named contract call future"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + it("should be able to pass one contract as an after dependency of a static call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.staticCall(example, "test", [], { after: [another] }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example:test" + ); + + if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + describe("passing id", () => { + it("should be able to statically call the same function twice by passing an id", () => { + const moduleWithSameCallTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("Example"); + + m.staticCall(sameContract1, "test", [], { id: "first" }); + m.staticCall(sameContract1, "test", [], { id: "second" }); + + return { sameContract1 }; + }); + + assert.equal(moduleWithSameCallTwice.id, "Module1"); + + const callFuture = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:Example:first" + ); + + const callFuture2 = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:Example:second" + ); + + assert.isDefined(callFuture); + assert.isDefined(callFuture2); + }); + + it("should throw if the same function is statically called twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.staticCall(sameContract1, "test"); + m.staticCall(sameContract1, "test"); + + return { sameContract1 }; + }); + }, /Contracts must have unique ids, Module1:SameContract:test has already been used/); + }); + + it("should throw if a static call tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.staticCall(sameContract1, "test", [], { id: "first" }); + m.staticCall(sameContract1, "test", [], { id: "first" }); + return { sameContract1 }; + }); + }, /Contracts must have unique ids, Module1:SameContract:first has already been used/); + }); + }); +}); From 3f8e9b84a030c0deeaba7a02970e4c5b0e52ab26 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 21:04:22 -0400 Subject: [PATCH 0326/1302] add missed static call options type --- packages/core/src/new-api/types/module-builder.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 3aea9d241f..223e16380c 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -50,6 +50,11 @@ export interface CallOptions { after?: Future[]; } +export interface StaticCallOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, @@ -86,7 +91,7 @@ export interface IgnitionModuleBuilder { contractFuture: ContractFuture, functionName: FunctionNameT, args?: SolidityParamsType, - options?: CallOptions + options?: StaticCallOptions ): NamedStaticCallFuture; useModule< From ee6f168cf0f5184d13eaa67277b1c6395dfdff0e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 12 May 2023 00:07:55 -0400 Subject: [PATCH 0327/1302] update error func and added a test --- .../src/new-api/internal/module-builder.ts | 20 +++++++++- packages/core/test/new-api/call.ts | 4 +- packages/core/test/new-api/staticCall.ts | 38 +++++++++++++++++-- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index eaaea0620d..1ff98a2d71 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -261,7 +261,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueCallId(futureId); const future = new NamedContractCallFutureImplementation( futureId, @@ -295,7 +295,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueStaticCallId(futureId); const future = new NamedStaticCallFutureImplementation( futureId, @@ -395,4 +395,20 @@ export class IgnitionModuleBuilderImplementation< this.libraryFromArtifact ); } + + private _assertUniqueCallId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Calls must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.call(myContract, "myFunction", [], { id: "MyId"})\``, + this.call + ); + } + + private _assertUniqueStaticCallId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Static calls must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.staticCall(myContract, "myFunction", [], { id: "MyId"})\``, + this.staticCall + ); + } } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 23c3749640..f8c61eec95 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -139,7 +139,7 @@ describe("call", () => { return { sameContract1 }; }); - }, /Contracts must have unique ids, Module1:SameContract:test has already been used/); + }, /Calls must have unique ids, Module1:SameContract:test has already been used/); }); it("should throw if a call tries to pass the same id twice", () => { @@ -150,7 +150,7 @@ describe("call", () => { m.call(sameContract1, "test", [], { id: "first" }); return { sameContract1 }; }); - }, /Contracts must have unique ids, Module1:SameContract:first has already been used/); + }, /Calls must have unique ids, Module1:SameContract:first has already been used/); }); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index a506730504..c192554a0a 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -2,7 +2,10 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; -import { NamedStaticCallFutureImplementation } from "../../src/new-api/internal/module"; +import { + NamedContractCallFutureImplementation, + NamedStaticCallFutureImplementation, +} from "../../src/new-api/internal/module"; import { FutureType } from "../../src/new-api/types/module"; describe("static call", () => { @@ -105,6 +108,35 @@ describe("static call", () => { assert(callFuture.dependencies.has(anotherFuture!)); }); + it("should be able to pass its result into another call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + const data = m.staticCall(contract1, "test"); + + m.call(contract1, "test2", [data]); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + const staticCallFuture = [...moduleWithASingleContract.futures].find( + ({ id }) => id === "Module1:Contract1:test" + ); + + const callFuture = [...moduleWithASingleContract.futures].find( + ({ id }) => id === "Module1:Contract1:test2" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(staticCallFuture!)); + }); + describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { const moduleWithSameCallTwice = buildModule("Module1", (m) => { @@ -139,7 +171,7 @@ describe("static call", () => { return { sameContract1 }; }); - }, /Contracts must have unique ids, Module1:SameContract:test has already been used/); + }, /Static calls must have unique ids, Module1:SameContract:test has already been used/); }); it("should throw if a static call tries to pass the same id twice", () => { @@ -150,7 +182,7 @@ describe("static call", () => { m.staticCall(sameContract1, "test", [], { id: "first" }); return { sameContract1 }; }); - }, /Contracts must have unique ids, Module1:SameContract:first has already been used/); + }, /Static calls must have unique ids, Module1:SameContract:first has already been used/); }); }); }); From 4ea6459735f80aa74c743064cdf8ef4fa0ea5e67 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 17:15:03 -0300 Subject: [PATCH 0328/1302] Adapat tests --- packages/core/test/new-api/call.ts | 99 ++++++++++++++------- packages/core/test/new-api/staticCall.ts | 106 ++++++++++++++++------- 2 files changed, 142 insertions(+), 63 deletions(-) diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index f8c61eec95..be30b5b7b4 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -3,11 +3,12 @@ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; import { NamedContractCallFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("call", () => { it("should be able to setup a contract call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "test"); @@ -15,6 +16,11 @@ describe("call", () => { return { contract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + assert.isDefined(moduleWithASingleContract); // Sets ids based on module id and contract name @@ -40,14 +46,22 @@ describe("call", () => { }); it("should be able to pass one contract as an arg dependency to a call", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another"); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); - m.call(example, "test", [another]); + m.call(example, "test", [another]); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -73,14 +87,22 @@ describe("call", () => { }); it("should be able to pass one contract as an after dependency of a call", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another"); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); - m.call(example, "test", [], { after: [another] }); + m.call(example, "test", [], { after: [another] }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -107,7 +129,7 @@ describe("call", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { - const moduleWithSameCallTwice = buildModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.call(sameContract1, "test", [], { id: "first" }); @@ -116,6 +138,11 @@ describe("call", () => { return { sameContract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithSameCallTwice = constructor.construct( + moduleWithSameCallTwiceDefinition + ); + assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( @@ -131,26 +158,36 @@ describe("call", () => { }); it("should throw if the same function is called twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - m.call(sameContract1, "test"); - m.call(sameContract1, "test"); - - return { sameContract1 }; - }); - }, /Calls must have unique ids, Module1:SameContract:test has already been used/); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.call(sameContract1, "test"); + m.call(sameContract1, "test"); + + return { sameContract1 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Calls must have unique ids, Module1:SameContract:test has already been used/ + ); }); it("should throw if a call tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - m.call(sameContract1, "test", [], { id: "first" }); - m.call(sameContract1, "test", [], { id: "first" }); - return { sameContract1 }; - }); - }, /Calls must have unique ids, Module1:SameContract:first has already been used/); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.call(sameContract1, "test", [], { id: "first" }); + m.call(sameContract1, "test", [], { id: "first" }); + return { sameContract1 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Calls must have unique ids, Module1:SameContract:first has already been used/ + ); }); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index c192554a0a..4a55f0d567 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -6,11 +6,12 @@ import { NamedContractCallFutureImplementation, NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("static call", () => { it("should be able to setup a static call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "test"); @@ -18,6 +19,11 @@ describe("static call", () => { return { contract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + assert.isDefined(moduleWithASingleContract); // Sets ids based on module id and contract name @@ -43,14 +49,22 @@ describe("static call", () => { }); it("should be able to pass one contract as an arg dependency to a static call", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another"); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); - m.staticCall(example, "test", [another]); + m.staticCall(example, "test", [another]); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -76,14 +90,22 @@ describe("static call", () => { }); it("should be able to pass one contract as an after dependency of a static call", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contract("Another"); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); - m.staticCall(example, "test", [], { after: [another] }); + m.staticCall(example, "test", [], { after: [another] }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.isDefined(moduleWithDependentContracts); @@ -109,7 +131,7 @@ describe("static call", () => { }); it("should be able to pass its result into another call", () => { - const moduleWithASingleContract = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const data = m.staticCall(contract1, "test"); @@ -119,6 +141,11 @@ describe("static call", () => { return { contract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + assert.isDefined(moduleWithASingleContract); const staticCallFuture = [...moduleWithASingleContract.futures].find( @@ -139,7 +166,7 @@ describe("static call", () => { describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { - const moduleWithSameCallTwice = buildModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.staticCall(sameContract1, "test", [], { id: "first" }); @@ -148,6 +175,11 @@ describe("static call", () => { return { sameContract1 }; }); + const constructor = new ModuleConstructor(); + const moduleWithSameCallTwice = constructor.construct( + moduleWithSameCallTwiceDefinition + ); + assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( @@ -163,26 +195,36 @@ describe("static call", () => { }); it("should throw if the same function is statically called twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - m.staticCall(sameContract1, "test"); - m.staticCall(sameContract1, "test"); - - return { sameContract1 }; - }); - }, /Static calls must have unique ids, Module1:SameContract:test has already been used/); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.staticCall(sameContract1, "test"); + m.staticCall(sameContract1, "test"); + + return { sameContract1 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Static calls must have unique ids, Module1:SameContract:test has already been used/ + ); }); it("should throw if a static call tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contract("SameContract"); - m.staticCall(sameContract1, "test", [], { id: "first" }); - m.staticCall(sameContract1, "test", [], { id: "first" }); - return { sameContract1 }; - }); - }, /Static calls must have unique ids, Module1:SameContract:first has already been used/); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.staticCall(sameContract1, "test", [], { id: "first" }); + m.staticCall(sameContract1, "test", [], { id: "first" }); + return { sameContract1 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Static calls must have unique ids, Module1:SameContract:first has already been used/ + ); }); }); }); From f92b918f5ea9061592fbde68207c243fce468a85 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 17:27:40 -0300 Subject: [PATCH 0329/1302] Remove eslint directives --- packages/core/test/new-api/call.ts | 1 - packages/core/test/new-api/staticCall.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index be30b5b7b4..f63dcdc7c9 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 4a55f0d567..8faf42c213 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -1,4 +1,3 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; From aca2ee4bf1cff0e40b50fd9a2c2148f888c13b77 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 May 2023 23:11:16 -0400 Subject: [PATCH 0330/1302] addressing comments --- .../core/src/new-api/internal/module-builder.ts | 8 ++++---- packages/core/test/new-api/call.ts | 12 ++++++------ packages/core/test/new-api/staticCall.ts | 16 ++++++++-------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 1ff98a2d71..c36c9c4812 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -259,7 +259,7 @@ export class IgnitionModuleBuilderImplementation< options: CallOptions = {} ): NamedContractCallFuture { const id = options.id ?? functionName; - const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; this._assertUniqueCallId(futureId); @@ -293,7 +293,7 @@ export class IgnitionModuleBuilderImplementation< options: CallOptions = {} ): NamedStaticCallFuture { const id = options.id ?? functionName; - const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; this._assertUniqueStaticCallId(futureId); @@ -399,7 +399,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueCallId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Calls must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.call(myContract, "myFunction", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.call(myContract, "myFunction", [], { id: "MyId"})\``, this.call ); } @@ -407,7 +407,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueStaticCallId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Static calls must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.staticCall(myContract, "myFunction", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.staticCall(myContract, "myFunction", [], { id: "MyId"})\``, this.staticCall ); } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index f63dcdc7c9..3ca22910ff 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -73,7 +73,7 @@ describe("call", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example:test" + ({ id }) => id === "Module1:Example#test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -114,7 +114,7 @@ describe("call", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example:test" + ({ id }) => id === "Module1:Example#test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -145,11 +145,11 @@ describe("call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example:first" + ({ id }) => id === "Module1:Example#first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example:second" + ({ id }) => id === "Module1:Example#second" ); assert.isDefined(callFuture); @@ -169,7 +169,7 @@ describe("call", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Calls must have unique ids, Module1:SameContract:test has already been used/ + /Duplicated id Module1:SameContract#test found in module Module1/ ); }); @@ -185,7 +185,7 @@ describe("call", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Calls must have unique ids, Module1:SameContract:first has already been used/ + /Duplicated id Module1:SameContract#first found in module Module1/ ); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 8faf42c213..11584fca0d 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -76,7 +76,7 @@ describe("static call", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example:test" + ({ id }) => id === "Module1:Example#test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -117,7 +117,7 @@ describe("static call", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example:test" + ({ id }) => id === "Module1:Example#test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -148,11 +148,11 @@ describe("static call", () => { assert.isDefined(moduleWithASingleContract); const staticCallFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1:test" + ({ id }) => id === "Module1:Contract1#test" ); const callFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1:test2" + ({ id }) => id === "Module1:Contract1#test2" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -182,11 +182,11 @@ describe("static call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example:first" + ({ id }) => id === "Module1:Example#first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example:second" + ({ id }) => id === "Module1:Example#second" ); assert.isDefined(callFuture); @@ -206,7 +206,7 @@ describe("static call", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Static calls must have unique ids, Module1:SameContract:test has already been used/ + /Duplicated id Module1:SameContract#test found in module Module1/ ); }); @@ -222,7 +222,7 @@ describe("static call", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Static calls must have unique ids, Module1:SameContract:first has already been used/ + /Duplicated id Module1:SameContract#first found in module Module1/ ); }); }); From bc10e66103e31cb3a7803c02e1dd99afaf7113a3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 19:57:12 -0400 Subject: [PATCH 0331/1302] call and static call implementation --- .../src/new-api/internal/module-builder.ts | 68 +++++++++++++++++++ .../core/src/new-api/types/module-builder.ts | 5 ++ packages/core/src/new-api/types/module.ts | 26 +++++++ 3 files changed, 99 insertions(+) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index c36c9c4812..8dc3510b66 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -320,6 +320,74 @@ export class IgnitionModuleBuilderImplementation< return future; } + public call( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args: SolidityParamsType = [], + options: CallOptions = {} + ): NamedContractCallFuture { + const id = options.id ?? functionName; + const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new NamedContractCallFutureImplementation( + futureId, + this._module, + functionName, + contractFuture, + args + ); + + future.dependencies.add(contractFuture); + + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + + public staticCall( + contractFuture: ContractFuture, + functionName: FunctionNameT, + args: SolidityParamsType = [], + options: CallOptions = {} + ): NamedStaticCallFuture { + const id = options.id ?? functionName; + const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new NamedStaticCallFutureImplementation( + futureId, + this._module, + functionName, + contractFuture, + args + ); + + future.dependencies.add(contractFuture); + + for (const arg of args.filter(isFuture)) { + future.dependencies.add(arg); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 223e16380c..3e1b7c1163 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -55,6 +55,11 @@ export interface StaticCallOptions { after?: Future[]; } +export interface CallOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index cf1f2eb754..ae31a2d6e1 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -36,6 +36,12 @@ export interface FunctionCallFuture functionName: FunctionNameT; } +// A future representing a call. Either a static one or one that modifies contract state +export interface FunctionCallFuture + extends Future { + functionName: FunctionNameT; +} + // A future representing the deployment of a contract that belongs to this project export interface NamedContractDeploymentFuture extends ContractFuture { @@ -90,6 +96,26 @@ export interface NamedStaticCallFuture< args: SolidityParamsType; } +// A future representing the calling of a contract function that modifies on-chain state +export interface NamedContractCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_CONTRACT_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + +// A future representing the static calling of a contract function that does not modify state +export interface NamedStaticCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_STATIC_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [name: string]: ContractFuture; From a622bd70fdd0c2cff3a95968e484c0117592ca05 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 21:20:06 -0400 Subject: [PATCH 0332/1302] added contract at implementation --- .../src/new-api/internal/module-builder.ts | 31 +++++++++++++++++++ packages/core/src/new-api/internal/module.ts | 16 ++++++++++ .../core/src/new-api/types/module-builder.ts | 10 +++++- packages/core/src/new-api/types/module.ts | 9 ++++++ 4 files changed, 65 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 8dc3510b66..0c4f77bada 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -6,6 +6,7 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, + ContractAtFuture, ContractFuture, IgnitionModule, IgnitionModuleResult, @@ -16,6 +17,7 @@ import { } from "../types/module"; import { CallOptions, + ContractAtOptions, ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, @@ -27,6 +29,7 @@ import { import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, + ContractAtFutureImplementation, IgnitionModuleImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, @@ -388,6 +391,34 @@ export class IgnitionModuleBuilderImplementation< return future; } + public contractAt( + contractName: string, + address: string, + artifact: ArtifactType, + options: ContractAtOptions = {} + ): ContractAtFuture { + const id = options.id ?? contractName; + const futureId = `${this._module.id}:${id}`; + + this._assertUniqueContractId(futureId); + + const future = new ContractAtFutureImplementation( + futureId, + this._module, + contractName, + address, + artifact + ); + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 2584ada7df..b0c5b09b03 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -13,6 +13,7 @@ import { NamedContractCallFuture, ContractFuture, NamedStaticCallFuture, + ContractAtFuture, } from "../types/module"; export abstract class BaseFuture< @@ -145,6 +146,21 @@ export class NamedStaticCallFutureImplementation< } } +export class ContractAtFutureImplementation + extends BaseFuture + implements ContractAtFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly contractName: ContractNameT, + public readonly address: string, + public readonly artifact: ArtifactType + ) { + super(id, FutureType.CONTRACT_AT, module); + } +} + export class IgnitionModuleImplementation< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 3e1b7c1163..86dee12b19 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -3,6 +3,7 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, + ContractAtFuture, ContractFuture, Future, IgnitionModuleResult, @@ -55,7 +56,7 @@ export interface StaticCallOptions { after?: Future[]; } -export interface CallOptions { +export interface ContractAtOptions { id?: string; after?: Future[]; } @@ -99,6 +100,13 @@ export interface IgnitionModuleBuilder { options?: StaticCallOptions ): NamedStaticCallFuture; + contractAt( + contractName: string, + address: string, + artifact: ArtifactType, + options?: ContractAtOptions + ): ContractAtFuture; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index ae31a2d6e1..bb90c87b40 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -7,6 +7,7 @@ export enum FutureType { ARTIFACT_LIBRARY_DEPLOYMENT, NAMED_CONTRACT_CALL, NAMED_STATIC_CALL, + CONTRACT_AT, } // eslint-disable-next-line @typescript-eslint/no-unused-vars @@ -116,6 +117,14 @@ export interface NamedStaticCallFuture< args: SolidityParamsType; } +// A future representing a previously deployed contract at a known address. +// It may not belong to this project, and we may struggle to type. +export interface ContractAtFuture extends ContractFuture { + type: FutureType.CONTRACT_AT; + address: string; + artifact: ArtifactType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [name: string]: ContractFuture; From fdee7750f713f5f972514eaf3a6eddaa7c34fd00 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 21:29:09 -0400 Subject: [PATCH 0333/1302] added tests for contract at --- packages/core/test/new-api/contractAt.ts | 136 +++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 packages/core/test/new-api/contractAt.ts diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts new file mode 100644 index 0000000000..63bb827e8c --- /dev/null +++ b/packages/core/test/new-api/contractAt.ts @@ -0,0 +1,136 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../src/new-api/build-module"; + +describe("contractAt", () => { + const fakeArtifact: any = {}; + + it("should be able to setup a contract at a given address", () => { + const moduleWithContractFromArtifact = buildModule("Module1", (m) => { + const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); + + return { contract1 }; + }); + + assert.isDefined(moduleWithContractFromArtifact); + + // Sets ids based on module id and contract name + assert.equal(moduleWithContractFromArtifact.id, "Module1"); + assert.equal( + moduleWithContractFromArtifact.results.contract1.id, + "Module1:Contract1" + ); + + // Stores the address + assert.deepStrictEqual( + moduleWithContractFromArtifact.results.contract1.address, + "0xtest" + ); + + // 1 contract future + assert.equal(moduleWithContractFromArtifact.futures.size, 1); + + // No submodules + assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + it("should be able to pass an after dependency", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contractAt("Another", "0xtest", fakeArtifact, { + after: [example], + }); + + return { example, another }; + }); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + describe("passing id", () => { + it("should use contract at twice by passing an id", () => { + const moduleWithSameContractTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "first", + } + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + }); + + // Sets ids based on module id and contract name + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same contract is deployed twice without differentiating ids", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }); + + it("should throw if a contract tries to pass the same id twice", () => { + assert.throws(() => { + buildModule("Module1", (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "same", + } + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + }, /Contracts must have unique ids, Module1:same has already been used/); + }); + }); +}); From 90c98962812438e83107e2f005af426765338ab7 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 12 May 2023 00:15:55 -0400 Subject: [PATCH 0334/1302] update error function and refactor futureId --- .../core/src/new-api/internal/module-builder.ts | 14 +++++++++++--- packages/core/test/new-api/contractAt.ts | 10 +++++----- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 0c4f77bada..8771f98970 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -397,10 +397,10 @@ export class IgnitionModuleBuilderImplementation< artifact: ArtifactType, options: ContractAtOptions = {} ): ContractAtFuture { - const id = options.id ?? contractName; - const futureId = `${this._module.id}:${id}`; + const id = options.id ?? address; + const futureId = `${this._module.id}:${contractName}:${id}`; - this._assertUniqueContractId(futureId); + this._assertUniqueContractAtId(futureId); const future = new ContractAtFutureImplementation( futureId, @@ -510,4 +510,12 @@ export class IgnitionModuleBuilderImplementation< this.staticCall ); } + + private _assertUniqueContractAtId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", artifact, { id: "MyId"})\``, + this.contractAt + ); + } } diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 63bb827e8c..e540b68c91 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -19,7 +19,7 @@ describe("contractAt", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1" + "Module1:Contract1:0xtest" ); // Stores the address @@ -81,11 +81,11 @@ describe("contractAt", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1:SameContract:first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1:SameContract:second" ); }); @@ -105,7 +105,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:SameContract has already been used/); + }, /Contracts must have unique ids, Module1:SameContract:0xtest has already been used/); }); it("should throw if a contract tries to pass the same id twice", () => { @@ -130,7 +130,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - }, /Contracts must have unique ids, Module1:same has already been used/); + }, /Contracts must have unique ids, Module1:SameContract:same has already been used/); }); }); }); From 44b9758b4668764a07f7af09a5320440b7b033c3 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 17:26:20 -0300 Subject: [PATCH 0335/1302] Adapt tests --- .../src/new-api/internal/module-builder.ts | 68 ------- packages/core/test/new-api/contractAt.ts | 168 +++++++++++------- 2 files changed, 101 insertions(+), 135 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 8771f98970..0752ed85a7 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -323,74 +323,6 @@ export class IgnitionModuleBuilderImplementation< return future; } - public call( - contractFuture: ContractFuture, - functionName: FunctionNameT, - args: SolidityParamsType = [], - options: CallOptions = {} - ): NamedContractCallFuture { - const id = options.id ?? functionName; - const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; - - this._assertUniqueContractId(futureId); - - const future = new NamedContractCallFutureImplementation( - futureId, - this._module, - functionName, - contractFuture, - args - ); - - future.dependencies.add(contractFuture); - - for (const arg of args.filter(isFuture)) { - future.dependencies.add(arg); - } - - for (const afterFuture of (options.after ?? []).filter(isFuture)) { - future.dependencies.add(afterFuture); - } - - this._module.futures.add(future); - - return future; - } - - public staticCall( - contractFuture: ContractFuture, - functionName: FunctionNameT, - args: SolidityParamsType = [], - options: CallOptions = {} - ): NamedStaticCallFuture { - const id = options.id ?? functionName; - const futureId = `${this._module.id}:${contractFuture.contractName}:${id}`; - - this._assertUniqueContractId(futureId); - - const future = new NamedStaticCallFutureImplementation( - futureId, - this._module, - functionName, - contractFuture, - args - ); - - future.dependencies.add(contractFuture); - - for (const arg of args.filter(isFuture)) { - future.dependencies.add(arg); - } - - for (const afterFuture of (options.after ?? []).filter(isFuture)) { - future.dependencies.add(afterFuture); - } - - this._module.futures.add(future); - - return future; - } - public contractAt( contractName: string, address: string, diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index e540b68c91..fcaeb32c50 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -1,17 +1,25 @@ -/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { buildModule } from "../../src/new-api/build-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("contractAt", () => { const fakeArtifact: any = {}; it("should be able to setup a contract at a given address", () => { - const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); + const moduleWithContractFromArtifactDefinition = buildModule( + "Module1", + (m) => { + const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); - return { contract1 }; - }); + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithContractFromArtifact = constructor.construct( + moduleWithContractFromArtifactDefinition + ); assert.isDefined(moduleWithContractFromArtifact); @@ -36,14 +44,22 @@ describe("contractAt", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContracts = buildModule("Module1", (m) => { - const example = m.contract("Example"); - const another = m.contractAt("Another", "0xtest", fakeArtifact, { - after: [example], - }); + const moduleWithDependentContractsDefinition = buildModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contractAt("Another", "0xtest", fakeArtifact, { + after: [example], + }); - return { example, another }; - }); + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); assert.equal(moduleWithDependentContracts.futures.size, 2); @@ -56,26 +72,34 @@ describe("contractAt", () => { describe("passing id", () => { it("should use contract at twice by passing an id", () => { - const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact, - { - id: "first", - } - ); - const sameContract2 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact, - { - id: "second", - } - ); + const moduleWithSameContractTwiceDefinition = buildModule( + "Module1", + (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "first", + } + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "second", + } + ); - return { sameContract1, sameContract2 }; - }); + return { sameContract1, sameContract2 }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); // Sets ids based on module id and contract name assert.equal(moduleWithSameContractTwice.id, "Module1"); @@ -90,47 +114,57 @@ describe("contractAt", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact - ); - const sameContract2 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact + ); - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract:0xtest has already been used/); + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:SameContract:0xtest has already been used/ + ); }); it("should throw if a contract tries to pass the same id twice", () => { - assert.throws(() => { - buildModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact, - { - id: "same", - } - ); - const sameContract2 = m.contractAt( - "SameContract", - "0xtest", - fakeArtifact, - { - id: "same", - } - ); + const moduleDefinition = buildModule("Module1", (m) => { + const sameContract1 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "same", + } + ); + const sameContract2 = m.contractAt( + "SameContract", + "0xtest", + fakeArtifact, + { + id: "same", + } + ); - return { sameContract1, sameContract2 }; - }); - }, /Contracts must have unique ids, Module1:SameContract:same has already been used/); + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Contracts must have unique ids, Module1:SameContract:same has already been used/ + ); }); }); }); From 682af754d76afedf4df85138ffd050b6bc2a8a70 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 19:57:12 -0400 Subject: [PATCH 0336/1302] call and static call implementation --- .../core/src/new-api/types/module-builder.ts | 5 ++++ packages/core/src/new-api/types/module.ts | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 86dee12b19..8b7a360d62 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -61,6 +61,11 @@ export interface ContractAtOptions { after?: Future[]; } +export interface CallOptions { + id?: string; + after?: Future[]; +} + export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index bb90c87b40..81242c7969 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -43,6 +43,12 @@ export interface FunctionCallFuture functionName: FunctionNameT; } +// A future representing a call. Either a static one or one that modifies contract state +export interface FunctionCallFuture + extends Future { + functionName: FunctionNameT; +} + // A future representing the deployment of a contract that belongs to this project export interface NamedContractDeploymentFuture extends ContractFuture { @@ -125,6 +131,26 @@ export interface ContractAtFuture extends ContractFuture { artifact: ArtifactType; } +// A future representing the calling of a contract function that modifies on-chain state +export interface NamedContractCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_CONTRACT_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + +// A future representing the static calling of a contract function that does not modify state +export interface NamedStaticCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> extends FunctionCallFuture { + type: FutureType.NAMED_STATIC_CALL; + contract: ContractFuture; + args: SolidityParamsType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [name: string]: ContractFuture; From 4fc9439379fb6c09844aa332a98a3548ea2c9ed2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 21:20:06 -0400 Subject: [PATCH 0337/1302] added contract at implementation --- packages/core/src/new-api/types/module-builder.ts | 5 ----- packages/core/src/new-api/types/module.ts | 8 ++++++++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 8b7a360d62..86dee12b19 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -61,11 +61,6 @@ export interface ContractAtOptions { after?: Future[]; } -export interface CallOptions { - id?: string; - after?: Future[]; -} - export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 81242c7969..055044c935 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -151,6 +151,14 @@ export interface NamedStaticCallFuture< args: SolidityParamsType; } +// A future representing a previously deployed contract at a known address. +// It may not belong to this project, and we may struggle to type. +export interface ContractAtFuture extends ContractFuture { + type: FutureType.CONTRACT_AT; + address: string; + artifact: ArtifactType; +} + // The results of deploying a module must be a dictionary of contract futures export interface IgnitionModuleResult { [name: string]: ContractFuture; From 704b52872adba6278ee712570de809540576b002 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 9 May 2023 21:37:45 -0400 Subject: [PATCH 0338/1302] example implementation for chainId --- packages/core/src/new-api/internal/module-builder.ts | 3 ++- packages/core/src/new-api/types/module-builder.ts | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 0752ed85a7..048597858f 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -106,7 +106,8 @@ export class IgnitionModuleBuilderImplementation< ModuleIdT, ResultsContractNameT, IgnitionModuleResultsT - > + >, + public readonly chainId: number ) { this._futureIds = new Set(); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 86dee12b19..c56f725288 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -62,6 +62,8 @@ export interface ContractAtOptions { } export interface IgnitionModuleBuilder { + chainId: number; + contract( contractName: ContractNameT, args?: SolidityParamsType, From 0bc50a7ec976cf4d3f7d587fcaa29e3112148879 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 14 May 2023 17:33:35 -0300 Subject: [PATCH 0339/1302] Move placeholder chainId --- packages/core/src/new-api/internal/module-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 048597858f..0280963940 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -83,7 +83,7 @@ export class ModuleConstructor { >(moduleDefintion.id, STUB_MODULE_RESULTS as any); (mod as any).results = moduleDefintion.moduleDefintionFunction( - new IgnitionModuleBuilderImplementation(this, mod) + new IgnitionModuleBuilderImplementation(this, mod, 0) // todo: fix placeholder chainId ); this._modules.set(moduleDefintion.id, mod); From 33a35cd96ce22a8ccaf77b6c4b37b13ff43d6f53 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 May 2023 23:43:07 -0400 Subject: [PATCH 0340/1302] add support for chainId --- .../core/src/new-api/internal/module-builder.ts | 4 +++- packages/core/test/new-api/call.ts | 12 ++++++------ packages/core/test/new-api/contract.ts | 14 +++++++------- packages/core/test/new-api/contractAt.ts | 10 +++++----- packages/core/test/new-api/contractFromArtifact.ts | 14 +++++++------- packages/core/test/new-api/library.ts | 12 ++++++------ packages/core/test/new-api/libraryFromArtifact.ts | 12 ++++++------ packages/core/test/new-api/staticCall.ts | 14 +++++++------- packages/core/test/new-api/useModule.ts | 6 +++--- 9 files changed, 50 insertions(+), 48 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 0280963940..a7b4b1439b 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -57,6 +57,8 @@ const STUB_MODULE_RESULTS = { export class ModuleConstructor { private _modules: Map = new Map(); + constructor(public readonly chainId: number) {} + public construct< ModuleIdT extends string, ContractNameT extends string, @@ -83,7 +85,7 @@ export class ModuleConstructor { >(moduleDefintion.id, STUB_MODULE_RESULTS as any); (mod as any).results = moduleDefintion.moduleDefintionFunction( - new IgnitionModuleBuilderImplementation(this, mod, 0) // todo: fix placeholder chainId + new IgnitionModuleBuilderImplementation(this, mod, this.chainId) ); this._modules.set(moduleDefintion.id, mod); diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 3ca22910ff..c1d949f2bb 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -15,7 +15,7 @@ describe("call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -57,7 +57,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -98,7 +98,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -137,7 +137,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -165,7 +165,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -181,7 +181,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 8445f5ebe8..e1964d0196 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -13,7 +13,7 @@ describe("contract", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -85,7 +85,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -123,7 +123,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -163,7 +163,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -187,7 +187,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -207,7 +207,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index fcaeb32c50..60f1000d31 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -16,7 +16,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -56,7 +56,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -96,7 +96,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -129,7 +129,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -159,7 +159,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 430de1da9b..4ebbdd8fd1 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -21,7 +21,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -61,7 +61,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -88,7 +88,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -115,7 +115,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -165,7 +165,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -195,7 +195,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -224,7 +224,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 177fba2c7d..d54b81e587 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -13,7 +13,7 @@ describe("library", () => { return { library1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -87,7 +87,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -127,7 +127,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -150,7 +150,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -169,7 +169,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index aac4913eb3..7f743053c1 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -17,7 +17,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -51,7 +51,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -78,7 +78,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -126,7 +126,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -156,7 +156,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -183,7 +183,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 11584fca0d..d5869f8517 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -18,7 +18,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -60,7 +60,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -101,7 +101,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -140,7 +140,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -174,7 +174,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -202,7 +202,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), @@ -218,7 +218,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 6024ff2db2..a18c203568 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -17,7 +17,7 @@ describe("useModule", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -42,7 +42,7 @@ describe("useModule", () => { return { first, second }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -72,7 +72,7 @@ describe("useModule", () => { return { contract2 }; }); - const constructor = new ModuleConstructor(); + const constructor = new ModuleConstructor(0); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition From 85a4e876fd10b3c6523f03e60d5f4959d7712b38 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 May 2023 23:48:22 -0400 Subject: [PATCH 0341/1302] add support for accounts --- .../core/src/new-api/internal/module-builder.ts | 15 ++++++++++++--- packages/core/src/new-api/types/module-builder.ts | 1 + packages/core/test/new-api/call.ts | 12 ++++++------ packages/core/test/new-api/contract.ts | 14 +++++++------- packages/core/test/new-api/contractAt.ts | 10 +++++----- .../core/test/new-api/contractFromArtifact.ts | 14 +++++++------- packages/core/test/new-api/library.ts | 12 ++++++------ packages/core/test/new-api/libraryFromArtifact.ts | 12 ++++++------ packages/core/test/new-api/staticCall.ts | 14 +++++++------- packages/core/test/new-api/useModule.ts | 6 +++--- 10 files changed, 60 insertions(+), 50 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index a7b4b1439b..06a38478f2 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -57,7 +57,10 @@ const STUB_MODULE_RESULTS = { export class ModuleConstructor { private _modules: Map = new Map(); - constructor(public readonly chainId: number) {} + constructor( + public readonly chainId: number, + public readonly accounts: string[] + ) {} public construct< ModuleIdT extends string, @@ -85,7 +88,12 @@ export class ModuleConstructor { >(moduleDefintion.id, STUB_MODULE_RESULTS as any); (mod as any).results = moduleDefintion.moduleDefintionFunction( - new IgnitionModuleBuilderImplementation(this, mod, this.chainId) + new IgnitionModuleBuilderImplementation( + this, + mod, + this.chainId, + this.accounts + ) ); this._modules.set(moduleDefintion.id, mod); @@ -109,7 +117,8 @@ export class IgnitionModuleBuilderImplementation< ResultsContractNameT, IgnitionModuleResultsT >, - public readonly chainId: number + public readonly chainId: number, + public readonly accounts: string[] ) { this._futureIds = new Set(); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index c56f725288..9fff202df8 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -63,6 +63,7 @@ export interface ContractAtOptions { export interface IgnitionModuleBuilder { chainId: number; + accounts: string[]; contract( contractName: ContractNameT, diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index c1d949f2bb..d8b417831a 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -15,7 +15,7 @@ describe("call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -57,7 +57,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -98,7 +98,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -137,7 +137,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -165,7 +165,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -181,7 +181,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index e1964d0196..30cb2a9704 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -13,7 +13,7 @@ describe("contract", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -85,7 +85,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -123,7 +123,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -163,7 +163,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -187,7 +187,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -207,7 +207,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 60f1000d31..01bcbee5a8 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -16,7 +16,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -56,7 +56,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -96,7 +96,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -129,7 +129,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -159,7 +159,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 4ebbdd8fd1..312f989550 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -21,7 +21,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -61,7 +61,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -88,7 +88,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -115,7 +115,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -165,7 +165,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -195,7 +195,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -224,7 +224,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index d54b81e587..8ed06986d0 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -13,7 +13,7 @@ describe("library", () => { return { library1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -87,7 +87,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -127,7 +127,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -150,7 +150,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -169,7 +169,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 7f743053c1..5695eae052 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -17,7 +17,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -51,7 +51,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -78,7 +78,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -126,7 +126,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -156,7 +156,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -183,7 +183,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index d5869f8517..e1cf96d1ed 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -18,7 +18,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -60,7 +60,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -101,7 +101,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -140,7 +140,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -174,7 +174,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -202,7 +202,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), @@ -218,7 +218,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index a18c203568..7664b6b499 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -17,7 +17,7 @@ describe("useModule", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -42,7 +42,7 @@ describe("useModule", () => { return { first, second }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -72,7 +72,7 @@ describe("useModule", () => { return { contract2 }; }); - const constructor = new ModuleConstructor(0); + const constructor = new ModuleConstructor(0, []); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition From 0d99b50cd8ea2b01d184af4a672e985c8124c3ca Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 16 May 2023 15:41:52 +0100 Subject: [PATCH 0342/1302] refactor: rename buildModule to defineModule This is for the new-api version. Which has the advantage of not clashing on export. --- .../{build-module.ts => define-module.ts} | 4 ++-- packages/core/src/new-api/examples.ts | 8 ++++---- packages/core/test/new-api/call.ts | 14 +++++++------- packages/core/test/new-api/contract.ts | 16 ++++++++-------- packages/core/test/new-api/contractAt.ts | 12 ++++++------ .../core/test/new-api/contractFromArtifact.ts | 16 ++++++++-------- packages/core/test/new-api/library.ts | 14 +++++++------- .../core/test/new-api/libraryFromArtifact.ts | 14 +++++++------- packages/core/test/new-api/staticCall.ts | 16 ++++++++-------- packages/core/test/new-api/useModule.ts | 14 +++++++------- 10 files changed, 64 insertions(+), 64 deletions(-) rename packages/core/src/new-api/{build-module.ts => define-module.ts} (94%) diff --git a/packages/core/src/new-api/build-module.ts b/packages/core/src/new-api/define-module.ts similarity index 94% rename from packages/core/src/new-api/build-module.ts rename to packages/core/src/new-api/define-module.ts index 5a5d020d8b..ab5ff7474f 100644 --- a/packages/core/src/new-api/build-module.ts +++ b/packages/core/src/new-api/define-module.ts @@ -1,10 +1,10 @@ import { IgnitionModuleResult } from "./types/module"; import { - IgnitionModuleDefinition, IgnitionModuleBuilder, + IgnitionModuleDefinition, } from "./types/module-builder"; -export function buildModule< +export function defineModule< ModuleIdT extends string, ContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult diff --git a/packages/core/src/new-api/examples.ts b/packages/core/src/new-api/examples.ts index 234362e536..501be9a2b5 100644 --- a/packages/core/src/new-api/examples.ts +++ b/packages/core/src/new-api/examples.ts @@ -2,17 +2,17 @@ // Future: representation of a future value, which may require on-chain interaction (e.g. deploy a contract, an already existing contract) // FutureFactory: Methods exposed by IgnitionModuleBuidler which create factories -import { buildModule } from "./build-module"; +import { defineModule } from "./define-module"; // Examples -const moduleWithASingleContract = buildModule("Module1", (m) => { +const moduleWithASingleContract = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1", []); return { contract1 }; }); -const moduleWithUnexportedContract = buildModule("Module2", (m) => { +const moduleWithUnexportedContract = defineModule("Module2", (m) => { const contract1 = m.contract("Contract1", [1, 2, 3]); // We don't export this, but we still need to run every future, @@ -22,7 +22,7 @@ const moduleWithUnexportedContract = buildModule("Module2", (m) => { return { contract1 }; }); -const moduleWithSubmodule = buildModule("Module3", (m) => { +const moduleWithSubmodule = defineModule("Module3", (m) => { const { contract1 } = m.useModule(moduleWithASingleContract); // ^ This is typed 😎 diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index d8b417831a..64a187952e 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -1,13 +1,13 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { NamedContractCallFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("call", () => { it("should be able to setup a contract call", () => { - const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "test"); @@ -45,7 +45,7 @@ describe("call", () => { }); it("should be able to pass one contract as an arg dependency to a call", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -86,7 +86,7 @@ describe("call", () => { }); it("should be able to pass one contract as an after dependency of a call", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -128,7 +128,7 @@ describe("call", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { - const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.call(sameContract1, "test", [], { id: "first" }); @@ -157,7 +157,7 @@ describe("call", () => { }); it("should throw if the same function is called twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.call(sameContract1, "test"); m.call(sameContract1, "test"); @@ -174,7 +174,7 @@ describe("call", () => { }); it("should throw if a call tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.call(sameContract1, "test", [], { id: "first" }); m.call(sameContract1, "test", [], { id: "first" }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 30cb2a9704..c32344d35b 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -1,13 +1,13 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { - const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -39,7 +39,7 @@ describe("contract", () => { }); it("should be able to pass one contract as an arg dependency to another", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -75,7 +75,7 @@ describe("contract", () => { }); it("should be able to pass one contract as an after dependency of another", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -111,7 +111,7 @@ describe("contract", () => { }); it("should be able to pass a library as a dependency of a contract", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -151,7 +151,7 @@ describe("contract", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = buildModule( + const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.contract("SameContract", [], { id: "first" }); @@ -180,7 +180,7 @@ describe("contract", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); const sameContract2 = m.contract("SameContract"); @@ -196,7 +196,7 @@ describe("contract", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract", [], { id: "same", }); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 01bcbee5a8..16a58924b4 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -1,13 +1,13 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("contractAt", () => { const fakeArtifact: any = {}; it("should be able to setup a contract at a given address", () => { - const moduleWithContractFromArtifactDefinition = buildModule( + const moduleWithContractFromArtifactDefinition = defineModule( "Module1", (m) => { const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); @@ -44,7 +44,7 @@ describe("contractAt", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -72,7 +72,7 @@ describe("contractAt", () => { describe("passing id", () => { it("should use contract at twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = buildModule( + const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.contractAt( @@ -114,7 +114,7 @@ describe("contractAt", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", "0xtest", @@ -138,7 +138,7 @@ describe("contractAt", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", "0xtest", diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 312f989550..74b24eef3f 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { ArtifactContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -8,7 +8,7 @@ describe("contractFromArtifact", () => { const fakeArtifact: any = {}; it("should be able to deploy with a contract based on an artifact", () => { - const moduleWithContractFromArtifactDefinition = buildModule( + const moduleWithContractFromArtifactDefinition = defineModule( "Module1", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ @@ -49,7 +49,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an arg dependency", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -76,7 +76,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -103,7 +103,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass a library as a dependency of a contract", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -143,7 +143,7 @@ describe("contractFromArtifact", () => { describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = buildModule( + const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.contractFromArtifact( @@ -183,7 +183,7 @@ describe("contractFromArtifact", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractFromArtifact( "SameContract", fakeArtifact @@ -204,7 +204,7 @@ describe("contractFromArtifact", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractFromArtifact( "SameContract", fakeArtifact, diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 8ed06986d0..9c775ed76a 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,13 +1,13 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType } from "../../src/new-api/types/module"; describe("library", () => { it("should be able to setup a deploy library call", () => { - const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { const library1 = m.library("Library1"); return { library1 }; @@ -39,7 +39,7 @@ describe("library", () => { }); it("should be able to pass one library as an after dependency of another", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -75,7 +75,7 @@ describe("library", () => { }); it("should be able to pass a library as a dependency of a library", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -115,7 +115,7 @@ describe("library", () => { describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = buildModule( + const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.library("SameContract", { id: "first" }); @@ -144,7 +144,7 @@ describe("library", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.library("SameContract"); const sameContract2 = m.library("SameContract"); @@ -159,7 +159,7 @@ describe("library", () => { }); it("should throw if a library tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.library("SameContract", { id: "same", }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 5695eae052..47e5fac772 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { ArtifactLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -8,7 +8,7 @@ describe("libraryFromArtifact", () => { const fakeArtifact: any = {}; it("should be able to deploy with a library based on an artifact", () => { - const moduleWithContractFromArtifactDefinition = buildModule( + const moduleWithContractFromArtifactDefinition = defineModule( "Module1", (m) => { const library1 = m.libraryFromArtifact("Library1", fakeArtifact); @@ -39,7 +39,7 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -66,7 +66,7 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass a library as a dependency of a library", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.library("Example"); @@ -106,7 +106,7 @@ describe("libraryFromArtifact", () => { describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = buildModule( + const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.libraryFromArtifact( @@ -144,7 +144,7 @@ describe("libraryFromArtifact", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.libraryFromArtifact( "SameContract", fakeArtifact @@ -165,7 +165,7 @@ describe("libraryFromArtifact", () => { }); it("should throw if a library tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.libraryFromArtifact( "SameContract", fakeArtifact, diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index e1cf96d1ed..4b60a195e7 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { NamedContractCallFutureImplementation, NamedStaticCallFutureImplementation, @@ -10,7 +10,7 @@ import { FutureType } from "../../src/new-api/types/module"; describe("static call", () => { it("should be able to setup a static call", () => { - const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "test"); @@ -48,7 +48,7 @@ describe("static call", () => { }); it("should be able to pass one contract as an arg dependency to a static call", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -89,7 +89,7 @@ describe("static call", () => { }); it("should be able to pass one contract as an after dependency of a static call", () => { - const moduleWithDependentContractsDefinition = buildModule( + const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); @@ -130,7 +130,7 @@ describe("static call", () => { }); it("should be able to pass its result into another call", () => { - const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const data = m.staticCall(contract1, "test"); @@ -165,7 +165,7 @@ describe("static call", () => { describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { - const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.staticCall(sameContract1, "test", [], { id: "first" }); @@ -194,7 +194,7 @@ describe("static call", () => { }); it("should throw if the same function is statically called twice without differentiating ids", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.staticCall(sameContract1, "test"); m.staticCall(sameContract1, "test"); @@ -211,7 +211,7 @@ describe("static call", () => { }); it("should throw if a static call tries to pass the same id twice", () => { - const moduleDefinition = buildModule("Module1", (m) => { + const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.staticCall(sameContract1, "test", [], { id: "first" }); m.staticCall(sameContract1, "test", [], { id: "first" }); diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 7664b6b499..2f27f83eac 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -1,17 +1,17 @@ import { assert } from "chai"; -import { buildModule } from "../../src/new-api/build-module"; +import { defineModule } from "../../src/new-api/define-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("useModule", () => { it("should be able to use a submodule", () => { - const submoduleDefinition = buildModule("Submodule1", (m) => { + const submoduleDefinition = defineModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -29,13 +29,13 @@ describe("useModule", () => { }); it("returns the same result set (object equal) for each usage", () => { - const submoduleDefinition = buildModule("Submodule1", (m) => { + const submoduleDefinition = defineModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { const { contract1: first } = m.useModule(submoduleDefinition); const { contract1: second } = m.useModule(submoduleDefinition); @@ -58,13 +58,13 @@ describe("useModule", () => { }); it("supports dependending on returned results", () => { - const submoduleDefinition = buildModule("Submodule1", (m) => { + const submoduleDefinition = defineModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { const { contract1 } = m.useModule(submoduleDefinition); const contract2 = m.contract("Contract2", [contract1]); From f604e0dc29e513d17ccc9c9a2c75b05798525c1c Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 16 May 2023 15:55:41 +0100 Subject: [PATCH 0343/1302] fix: remove build error on value for cli ui I suspect a new version of typescript or a lib has tightened a definition and now BigInt needs converted to a string before printing. --- .../src/ui/components/execution/ModuleParameters.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx index 83dc398c4a..c945c3e54a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx @@ -1,6 +1,6 @@ import type { ModuleParams } from "@ignored/ignition-core"; -import { Text, Newline } from "ink"; +import { Newline, Text } from "ink"; export const ModuleParameters = ({ moduleParams, @@ -20,7 +20,7 @@ export const ModuleParameters = ({ const params = entries.map(([key, value]) => ( - {key}: {value} + {key}: {value.toString()} From 9e5a78dc52ecd1a0e01160a9f7d10ad495b4de98 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 May 2023 09:52:40 +0100 Subject: [PATCH 0344/1302] support plan (New API PR 9) (#212) To support plan against the new api we have: 1. Added a new plan website based on vite under `./packages/ui` 2. Add IgnitionModule serialization/deserialization 3. Added new mermiad rendering based on IgnitionModule --- examples/sample/ignition/LockModule.js | 13 +- examples/sample/test/Lock.js | 3 +- package-lock.json | 21065 +++++++--------- packages/core/package.json | 5 +- packages/core/src/index.ts | 12 +- .../src/internal/dsl/DeploymentBuilder.ts | 44 +- .../src/internal/types/deploymentGraph.ts | 6 +- packages/core/src/internal/utils/guards.ts | 6 +- .../internal/validation/dispatch/helpers.ts | 4 +- packages/core/src/new-api/define-module.ts | 10 + .../src/new-api/internal/module-builder.ts | 1 + packages/core/src/new-api/internal/module.ts | 54 +- .../new-api/stored-deployment-serializer.ts | 659 + packages/core/src/new-api/stubs.ts | 11 + .../core/src/new-api/types/module-builder.ts | 45 + packages/core/src/new-api/types/module.ts | 142 +- .../new-api/types/serialized-deployment.ts | 234 + packages/core/src/types/dsl.ts | 18 +- packages/core/src/types/future.ts | 13 +- packages/core/src/types/module.ts | 4 +- packages/core/src/ui-helpers.ts | 3 + .../core/test/deploymentBuilder/useModule.ts | 4 +- .../new-api/stored-deployment-serializer.ts | 573 + packages/hardhat-plugin/esbuild.js | 33 - packages/hardhat-plugin/package.json | 4 +- packages/hardhat-plugin/src/index.ts | 56 +- .../hardhat-plugin/src/plan/assets/bundle.ts | 39 - .../hardhat-plugin/src/plan/assets/main.css | 85 - .../src/plan/assets/templates/index.html | 12 - .../src/plan/assets/templates/plan.html | 13 - .../src/plan/assets/templates/summary.html | 18 - .../src/plan/assets/templates/title.html | 5 - .../src/plan/assets/templates/vertex.html | 31 - packages/hardhat-plugin/src/plan/index.ts | 208 - packages/hardhat-plugin/src/plan/utils.ts | 206 - .../hardhat-plugin/src/plan/write-plan.ts | 37 + packages/hardhat-plugin/src/utils/open.ts | 18 + .../minimal-new-api/contracts/Contracts.sol | 140 + .../minimal-new-api/contracts/Trace.sol | 14 + .../minimal-new-api/contracts/WithLibrary.sol | 18 + .../minimal-new-api/hardhat.config.js | 11 + .../minimal-new-api/ignition/MyModule.js | 13 + packages/hardhat-plugin/test/plan/index.ts | 5 +- packages/ui/.eslintrc.cjs | 14 + packages/ui/.gitignore | 26 + packages/ui/README.md | 20 + packages/ui/examples/ComplexModule.js | 51 + packages/ui/index.html | 15 + packages/ui/package.json | 39 + packages/ui/public/.gitkeep | 2 + .../generate-example-deployment-json.js | 42 + packages/ui/src/components/mermaid.tsx | 26 + packages/ui/src/components/shared.tsx | 16 + packages/ui/src/components/summary-header.tsx | 34 + packages/ui/src/main.tsx | 70 + .../components/future-summary.tsx | 130 + .../pages/future-details/future-details.tsx | 31 + .../pages/plan-overview/components/action.tsx | 78 + .../plan-overview/components/plan-details.tsx | 37 + .../plan-overview/components/plan-summary.tsx | 78 + .../src/pages/plan-overview/plan-overview.tsx | 25 + packages/ui/src/queries/futures.ts | 60 + packages/ui/src/types.ts | 21 + packages/ui/src/utils/guards.ts | 26 + packages/ui/src/utils/to-mermaid.ts | 74 + packages/ui/src/vite-env.d.ts | 1 + packages/ui/tsconfig.json | 24 + packages/ui/tsconfig.node.json | 10 + packages/ui/vite.config.ts | 16 + 69 files changed, 12708 insertions(+), 12153 deletions(-) create mode 100644 packages/core/src/new-api/stored-deployment-serializer.ts create mode 100644 packages/core/src/new-api/types/serialized-deployment.ts create mode 100644 packages/core/src/ui-helpers.ts create mode 100644 packages/core/test/new-api/stored-deployment-serializer.ts delete mode 100644 packages/hardhat-plugin/esbuild.js delete mode 100644 packages/hardhat-plugin/src/plan/assets/bundle.ts delete mode 100644 packages/hardhat-plugin/src/plan/assets/main.css delete mode 100644 packages/hardhat-plugin/src/plan/assets/templates/index.html delete mode 100644 packages/hardhat-plugin/src/plan/assets/templates/plan.html delete mode 100644 packages/hardhat-plugin/src/plan/assets/templates/summary.html delete mode 100644 packages/hardhat-plugin/src/plan/assets/templates/title.html delete mode 100644 packages/hardhat-plugin/src/plan/assets/templates/vertex.html delete mode 100644 packages/hardhat-plugin/src/plan/index.ts delete mode 100644 packages/hardhat-plugin/src/plan/utils.ts create mode 100644 packages/hardhat-plugin/src/plan/write-plan.ts create mode 100644 packages/hardhat-plugin/src/utils/open.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Trace.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js create mode 100644 packages/ui/.eslintrc.cjs create mode 100644 packages/ui/.gitignore create mode 100644 packages/ui/README.md create mode 100644 packages/ui/examples/ComplexModule.js create mode 100644 packages/ui/index.html create mode 100644 packages/ui/package.json create mode 100644 packages/ui/public/.gitkeep create mode 100644 packages/ui/scripts/generate-example-deployment-json.js create mode 100644 packages/ui/src/components/mermaid.tsx create mode 100644 packages/ui/src/components/shared.tsx create mode 100644 packages/ui/src/components/summary-header.tsx create mode 100644 packages/ui/src/main.tsx create mode 100644 packages/ui/src/pages/future-details/components/future-summary.tsx create mode 100644 packages/ui/src/pages/future-details/future-details.tsx create mode 100644 packages/ui/src/pages/plan-overview/components/action.tsx create mode 100644 packages/ui/src/pages/plan-overview/components/plan-details.tsx create mode 100644 packages/ui/src/pages/plan-overview/components/plan-summary.tsx create mode 100644 packages/ui/src/pages/plan-overview/plan-overview.tsx create mode 100644 packages/ui/src/queries/futures.ts create mode 100644 packages/ui/src/types.ts create mode 100644 packages/ui/src/utils/guards.ts create mode 100644 packages/ui/src/utils/to-mermaid.ts create mode 100644 packages/ui/src/vite-env.d.ts create mode 100644 packages/ui/tsconfig.json create mode 100644 packages/ui/tsconfig.node.json create mode 100644 packages/ui/vite.config.ts diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index eea5a4ad6e..f16ab9de97 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -1,5 +1,5 @@ // ./ignition/LockModule.js -const { buildModule } = require("@ignored/hardhat-ignition"); +const { defineModule } = require("@ignored/hardhat-ignition"); const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; @@ -7,11 +7,14 @@ const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); -module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); +module.exports = defineModule("LockModule", (m) => { + // const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); + // const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); - const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); + const lock = m.contract("Lock", [TEN_YEARS_IN_FUTURE], { + // args: [unlockTime], + // value: lockedAmount + }); return { lock }; }); diff --git a/examples/sample/test/Lock.js b/examples/sample/test/Lock.js index 74320dd98d..ccb1a29d51 100644 --- a/examples/sample/test/Lock.js +++ b/examples/sample/test/Lock.js @@ -6,7 +6,8 @@ const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); const { expect } = require("chai"); const LockModule = require("../ignition/LockModule"); -describe("Lock", function () { +// TODO: bring back tests once execution is on new-api +describe.skip("Lock", function () { // We define a fixture to reuse the same setup in every test. // We use loadFixture to run this setup once, snapshot that state, // and reset Hardhat Network to that snapshot in every test. diff --git a/package-lock.json b/package-lock.json index 1b2b6dcd59..17f7c7c737 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,14 +103,12 @@ }, "examples/uniswap/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -120,39 +118,38 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, + "version": "7.21.4", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.10.4" + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", + "version": "7.22.3", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", + "version": "7.22.1", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/generator": "^7.22.0", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helpers": "^7.22.0", + "@babel/parser": "^7.22.0", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -167,34 +164,19 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, + "version": "7.22.3", + "license": "MIT", "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -203,13 +185,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "version": "7.22.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.21.4", + "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -224,27 +215,22 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true, + "version": "7.22.1", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.20.7", "@babel/types": "^7.21.0" @@ -255,9 +241,7 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -267,9 +251,7 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.21.4" }, @@ -278,31 +260,37 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.22.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.21.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -310,9 +298,7 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.18.6" }, @@ -321,41 +307,35 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true, + "version": "7.21.5", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "version": "7.22.3", "dev": true, + "license": "MIT", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -363,9 +343,7 @@ }, "node_modules/@babel/highlight": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", @@ -376,10 +354,8 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true, + "version": "7.22.4", + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -387,92 +363,80 @@ "node": ">=6.0.0" } }, - "node_modules/@babel/runtime": { + "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "dev": true, + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/helper-plugin-utils": "^7.20.2" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.19.6", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/helper-plugin-utils": "^7.19.0" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.22.3", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, + "node_modules/@babel/template": { + "version": "7.21.9", + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, + "node_modules/@babel/traverse": { + "version": "7.22.4", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", - "dev": true, + "version": "7.22.4", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -482,27 +446,22 @@ }, "node_modules/@braintree/sanitize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", - "dev": true + "license": "MIT" }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + "license": "Apache-2.0" }, "node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } }, "node_modules/@chainsafe/ssz": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.4.2", @@ -511,9 +470,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -523,18 +481,35 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "license": "MIT" + }, + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "license": "MIT" + }, "node_modules/@ensdomains/address-encoder": { "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "license": "BSD", "dependencies": { "bech32": "^1.1.3", "blakejs": "^1.1.0", @@ -547,22 +522,17 @@ }, "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/@ensdomains/buffer": { "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", - "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", "dependencies": { "@nomiclabs/hardhat-truffle5": "^2.0.0" } }, "node_modules/@ensdomains/ens": { "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", + "license": "CC0-1.0", "dependencies": { "bluebird": "^3.5.2", "eth-ens-namehash": "^2.0.8", @@ -573,8 +543,7 @@ }, "node_modules/@ensdomains/ens-contracts": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", - "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "license": "MIT", "dependencies": { "@ensdomains/buffer": "^0.0.13", "@ensdomains/solsha1": "0.0.3", @@ -584,24 +553,21 @@ }, "node_modules/@ensdomains/ens/node_modules/ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/cliui": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "license": "ISC", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -610,8 +576,7 @@ }, "node_modules/@ensdomains/ens/node_modules/find-up": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "license": "MIT", "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -622,8 +587,7 @@ }, "node_modules/@ensdomains/ens/node_modules/fs-extra": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -634,18 +598,15 @@ }, "node_modules/@ensdomains/ens/node_modules/get-caller-file": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -655,16 +616,14 @@ }, "node_modules/@ensdomains/ens/node_modules/jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@ensdomains/ens/node_modules/load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -678,8 +637,7 @@ }, "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -689,8 +647,7 @@ }, "node_modules/@ensdomains/ens/node_modules/parse-json": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "license": "MIT", "dependencies": { "error-ex": "^1.2.0" }, @@ -700,8 +657,7 @@ }, "node_modules/@ensdomains/ens/node_modules/path-exists": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "license": "MIT", "dependencies": { "pinkie-promise": "^2.0.0" }, @@ -711,8 +667,7 @@ }, "node_modules/@ensdomains/ens/node_modules/path-type": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -724,16 +679,14 @@ }, "node_modules/@ensdomains/ens/node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/read-pkg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "license": "MIT", "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -745,8 +698,7 @@ }, "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "license": "MIT", "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -757,16 +709,18 @@ }, "node_modules/@ensdomains/ens/node_modules/require-from-string": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/@ensdomains/ens/node_modules/require-main-filename": { + "version": "1.0.1", + "license": "ISC" + }, "node_modules/@ensdomains/ens/node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -776,16 +730,14 @@ }, "node_modules/@ensdomains/ens/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/@ensdomains/ens/node_modules/solc": { "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "license": "MIT", "dependencies": { "fs-extra": "^0.30.0", "memorystream": "^0.3.1", @@ -799,8 +751,7 @@ }, "node_modules/@ensdomains/ens/node_modules/string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -812,8 +763,7 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -823,8 +773,7 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-bom": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "license": "MIT", "dependencies": { "is-utf8": "^0.2.0" }, @@ -832,10 +781,13 @@ "node": ">=0.10.0" } }, + "node_modules/@ensdomains/ens/node_modules/which-module": { + "version": "1.0.0", + "license": "ISC" + }, "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "license": "MIT", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -846,13 +798,11 @@ }, "node_modules/@ensdomains/ens/node_modules/y18n": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/yargs": { "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "license": "MIT", "dependencies": { "cliui": "^3.2.0", "decamelize": "^1.1.1", @@ -872,8 +822,7 @@ }, "node_modules/@ensdomains/ens/node_modules/yargs-parser": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "license": "ISC", "dependencies": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" @@ -881,8 +830,7 @@ }, "node_modules/@ensdomains/ensjs": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "license": "ISC", "dependencies": { "@babel/runtime": "^7.4.4", "@ensdomains/address-encoder": "^0.1.7", @@ -895,56 +843,66 @@ } }, "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts" + "version": "0.2.4" }, "node_modules/@ensdomains/solsha1": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", - "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", "dependencies": { "hash-test-vectors": "^1.3.2" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", "cpu": [ - "arm" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -960,58 +918,42 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", "dev": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@eslint/js": { + "version": "8.41.0", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ethereumjs/common": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "license": "MIT", "dependencies": { "crc-32": "^1.2.0", "ethereumjs-util": "^7.1.1" @@ -1019,8 +961,7 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1041,8 +982,7 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -1056,8 +996,7 @@ }, "node_modules/@ethereumjs/tx": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "license": "MPL-2.0", "dependencies": { "@ethereumjs/common": "^2.5.0", "ethereumjs-util": "^7.1.2" @@ -1065,8 +1004,7 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1087,8 +1025,7 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -1102,8 +1039,6 @@ }, "node_modules/@ethersproject/abi": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -1114,6 +1049,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1128,8 +1064,6 @@ }, "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1140,6 +1074,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1150,8 +1085,6 @@ }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -1162,6 +1095,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1174,8 +1108,6 @@ }, "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -1186,6 +1118,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1196,8 +1129,6 @@ }, "node_modules/@ethersproject/address": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", "funding": [ { "type": "individual", @@ -1208,6 +1139,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.6.2", "@ethersproject/bytes": "^5.6.1", @@ -1218,8 +1150,6 @@ }, "node_modules/@ethersproject/base64": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -1230,14 +1160,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -1248,6 +1177,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -1255,8 +1185,6 @@ }, "node_modules/@ethersproject/bignumber": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "funding": [ { "type": "individual", @@ -1267,6 +1195,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1275,8 +1204,6 @@ }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -1287,14 +1214,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -1305,14 +1231,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -1323,6 +1248,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -1338,8 +1264,6 @@ }, "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1350,6 +1274,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1360,8 +1285,6 @@ }, "node_modules/@ethersproject/hash": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -1372,6 +1295,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -1386,8 +1310,6 @@ }, "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1398,6 +1320,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1408,8 +1331,6 @@ }, "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -1420,6 +1341,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -1437,8 +1359,6 @@ }, "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "funding": [ { "type": "individual", @@ -1449,6 +1369,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -1467,8 +1388,6 @@ }, "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1479,6 +1398,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1489,8 +1409,6 @@ }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -1501,6 +1419,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -1508,8 +1427,6 @@ }, "node_modules/@ethersproject/logger": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -1519,12 +1436,11 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -1535,14 +1451,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -1553,6 +1468,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -1560,8 +1476,6 @@ }, "node_modules/@ethersproject/properties": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -1572,14 +1486,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -1590,6 +1503,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -1615,8 +1529,6 @@ }, "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1627,6 +1539,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1635,30 +1548,8 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@ethersproject/random": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -1669,6 +1560,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -1676,8 +1568,6 @@ }, "node_modules/@ethersproject/rlp": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "funding": [ { "type": "individual", @@ -1688,6 +1578,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -1695,8 +1586,6 @@ }, "node_modules/@ethersproject/sha2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -1707,6 +1596,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1715,8 +1605,6 @@ }, "node_modules/@ethersproject/signing-key": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "funding": [ { "type": "individual", @@ -1727,6 +1615,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1738,8 +1627,6 @@ }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "funding": [ { "type": "individual", @@ -1750,6 +1637,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1761,8 +1649,6 @@ }, "node_modules/@ethersproject/strings": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "funding": [ { "type": "individual", @@ -1773,6 +1659,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -1781,8 +1668,6 @@ }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "funding": [ { "type": "individual", @@ -1793,6 +1678,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1807,8 +1693,6 @@ }, "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1819,6 +1703,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1829,8 +1714,6 @@ }, "node_modules/@ethersproject/units": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "funding": [ { "type": "individual", @@ -1841,6 +1724,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -1849,8 +1733,6 @@ }, "node_modules/@ethersproject/wallet": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -1861,6 +1743,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -1881,8 +1764,6 @@ }, "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1893,6 +1774,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1903,8 +1785,6 @@ }, "node_modules/@ethersproject/web": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "funding": [ { "type": "individual", @@ -1915,6 +1795,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1925,8 +1806,6 @@ }, "node_modules/@ethersproject/wordlists": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "funding": [ { "type": "individual", @@ -1937,6 +1816,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -1947,9 +1827,8 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -1959,33 +1838,22 @@ "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "Apache-2.0", "engines": { - "node": "*" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@ignored/hardhat-ignition": { "resolved": "packages/hardhat-plugin", @@ -1995,11 +1863,14 @@ "resolved": "packages/core", "link": true }, + "node_modules/@ignored/ignition-ui": { + "resolved": "packages/ui", + "link": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -2011,33 +1882,10 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -2046,24 +1894,10 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -2073,9 +1907,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -2088,9 +1921,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -2100,36 +1932,32 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/nyc-config-typescript": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2" }, @@ -2142,18 +1970,15 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2165,33 +1990,25 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "devOptional": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2199,19 +2016,15 @@ }, "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "license": "MIT" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "license": "MIT" }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "license": "ISC", "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -2225,9 +2038,8 @@ }, "node_modules/@microsoft/api-extractor": { "version": "7.34.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", - "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/api-extractor-model": "7.26.4", "@microsoft/tsdoc": "0.14.2", @@ -2248,9 +2060,8 @@ }, "node_modules/@microsoft/api-extractor-model": { "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", - "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", @@ -2259,9 +2070,8 @@ }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2272,15 +2082,13 @@ }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", @@ -2290,9 +2098,8 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" @@ -2303,9 +2110,8 @@ }, "node_modules/@morgan-stanley/ts-mocking-bird": { "version": "0.6.4", - "resolved": "https://registry.npmjs.org/@morgan-stanley/ts-mocking-bird/-/ts-mocking-bird-0.6.4.tgz", - "integrity": "sha512-57VJIflP8eR2xXa9cD1LUawh+Gh+BVQfVu0n6GALyg/AqV/Nz25kDRvws3i9kIe1PTrbsZZOYpsYp6bXPd6nVA==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "lodash": "^4.17.16", @@ -2327,9 +2133,8 @@ }, "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-7.0.3.tgz", - "integrity": "sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==", "dev": true, + "license": "MIT", "peer": true, "bin": { "uuid": "dist/bin/uuid" @@ -2337,31 +2142,28 @@ }, "node_modules/@noble/hashes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@noble/secp256k1": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2372,18 +2174,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2392,45 +2192,68 @@ "node": ">= 8" } }, - "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", - "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", - "dev": true, - "peer": true, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.1", + "license": "MPL-2.0", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" }, - "peerDependencies": { - "@nomiclabs/hardhat-ethers": "^2.0.0", - "chai": "^4.2.0", - "ethers": "^5.0.0", - "hardhat": "^2.9.4" + "engines": { + "node": ">=14" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", - "dev": true, - "peer": true, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", "dependencies": { - "ethereumjs-util": "^7.1.4" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.1", + "license": "MPL-2.0", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-ethash": "3.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" }, - "peerDependencies": { - "hardhat": "^2.9.5" + "engines": { + "node": ">=14" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { + "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "peer": true, + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2449,313 +2272,148 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "peer": true, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.1", + "license": "MIT", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@nomicfoundation/ethereumjs-util": "9.0.1", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.1", + "license": "MPL-2.0", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=10.0.0" + "node": ">=14" } }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", - "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", - "dev": true, - "peerDependencies": { - "@ethersproject/abi": "^5.4.7", - "@ethersproject/providers": "^5.4.7", - "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomiclabs/hardhat-ethers": "^2.0.0", - "@nomiclabs/hardhat-etherscan": "^3.0.0", - "@typechain/ethers-v5": "^10.1.0", - "@typechain/hardhat": "^6.1.2", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^5.4.7", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.1.0", - "typescript": ">=4.5.0" + "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/ignition-create2-example": { - "resolved": "examples/create2", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ens-example": { - "resolved": "examples/ens", - "link": true - }, - "node_modules/@nomicfoundation/ignition-example-multisig": { - "resolved": "examples/multisig", - "link": true + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.1", + "license": "MPL-2.0", + "dependencies": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } }, - "node_modules/@nomicfoundation/ignition-sample-example": { - "resolved": "examples/sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ts-sample-example": { - "resolved": "examples/ts-sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-uniswap-example": { - "resolved": "examples/uniswap", - "link": true - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" + "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.1", + "license": "MPL-2.0", + "bin": { + "rlp": "bin/rlp" + }, "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", - "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", - "dev": true - }, - "node_modules/@nomiclabs/hardhat-ethers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", - "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", - "dev": true, - "peerDependencies": { - "ethers": "^5.0.0", - "hardhat": "^2.0.0" + "node": ">=14" } }, - "node_modules/@nomiclabs/hardhat-etherscan": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", - "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", - "dev": true, - "peer": true, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.1", + "license": "MPL-2.0", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.11", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" } }, - "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", - "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.1", + "license": "MPL-2.0", "dependencies": { - "@nomiclabs/truffle-contract": "^4.2.23", - "@types/chai": "^4.2.0", - "chai": "^4.2.0", - "ethereumjs-util": "^7.1.4", - "fs-extra": "^7.0.1" + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" }, - "peerDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "hardhat": "^2.6.4", - "web3": "^1.0.0-beta.36" + "engines": { + "node": ">=14" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { + "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2774,546 +2432,381 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.1", + "license": "MPL-2.0", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=10.0.0" + "node": ">=14" } }, - "node_modules/@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", - "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", - "peer": true, + "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", "dependencies": { - "@types/bignumber.js": "^5.0.0" - }, - "peerDependencies": { - "hardhat": "^2.0.0", - "web3": "^1.0.0-beta.36" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@nomiclabs/truffle-contract": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", - "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.1", + "license": "MPL-2.0", "dependencies": { - "@ensdomains/ensjs": "^2.0.1", - "@truffle/blockchain-utils": "^0.1.3", - "@truffle/contract-schema": "^3.4.7", - "@truffle/debug-utils": "^6.0.22", - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.16", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19" + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "ethereum-cryptography": "0.1.3" }, - "peerDependencies": { - "web3": "^1.2.1", - "web3-core-helpers": "^1.2.1", - "web3-core-promievent": "^1.2.1", - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" - } - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "engines": { - "node": "*" + "node": ">=14" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "license": "Apache-2.0", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "@chainsafe/as-sha256": "^0.3.1" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "license": "Apache-2.0", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" - }, - "node_modules/@pkgr/utils": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.3.1.tgz", - "integrity": "sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw==", - "dev": true, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "is-glob": "^4.0.3", - "open": "^8.4.0", - "picocolors": "^1.0.0", - "tiny-glob": "^0.2.9", - "tslib": "^2.4.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.1", + "license": "MPL-2.0", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/@pkgr/utils/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@pkgr/utils/node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "1.0.6", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" + "@ethersproject/abi": "^5.1.2", + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@nomiclabs/hardhat-ethers": "^2.0.0", + "chai": "^4.2.0", + "ethers": "^5.0.0", + "hardhat": "^2.9.4" } }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/@rushstack/node-core-library": { - "version": "3.55.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", - "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.8", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.3.0", - "z-schema": "~5.0.2" + "ethereumjs-util": "^7.1.4" }, "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "hardhat": "^2.9.5" } }, - "node_modules/@rushstack/rig-package": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", - "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { + "version": "0.1.3", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", - "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { + "version": "7.1.5", "dev": true, + "license": "MPL-2.0", + "peer": true, "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/@scure/base": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@ethersproject/abi": "^5.4.7", + "@ethersproject/providers": "^5.4.7", + "@nomicfoundation/hardhat-chai-matchers": "^1.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomiclabs/hardhat-ethers": "^2.0.0", + "@nomiclabs/hardhat-etherscan": "^3.0.0", + "@typechain/ethers-v5": "^10.1.0", + "@typechain/hardhat": "^6.1.2", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^5.4.7", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.1.0", + "typescript": ">=4.5.0" } }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } + "node_modules/@nomicfoundation/ignition-create2-example": { + "resolved": "examples/create2", + "link": true }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@nomicfoundation/ignition-ens-example": { + "resolved": "examples/ens", + "link": true }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@nomicfoundation/ignition-example-multisig": { + "resolved": "examples/multisig", + "link": true }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@nomicfoundation/ignition-sample-example": { + "resolved": "examples/sample", + "link": true }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@nomicfoundation/ignition-ts-sample-example": { + "resolved": "examples/ts-sample", + "link": true }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "node_modules/@nomicfoundation/ignition-uniswap-example": { + "resolved": "examples/uniswap", + "link": true }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "license": "MIT", "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "node": ">= 12" }, - "engines": { - "node": ">=6" + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "node": ">= 10" } }, - "node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { + "version": "1.0.2", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "license": "MIT" + }, + "node_modules/@nomiclabs/hardhat-ethers": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ethers": "^5.0.0", + "hardhat": "^2.0.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", - "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "node_modules/@nomiclabs/hardhat-etherscan": { + "version": "3.1.7", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@sinonjs/commons": "^1.7.0" + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.11", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" } }, - "node_modules/@sinonjs/samsam": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", - "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { + "version": "7.0.1", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { + "version": "6.3.0", "dev": true, + "license": "ISC", "peer": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, + "node_modules/@nomiclabs/hardhat-etherscan/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=14.16" + "node": ">= 4.0.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "node_modules/@truffle/abi-utils": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-0.3.9.tgz", - "integrity": "sha512-G5dqgwRHx5zwlXjz3QT8OJVfB2cOqWwD6DwKso0KttUt/zejhCjnkKq72rSgyeLMkz7wBB9ERLOsupLBILM8MA==", + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "license": "MIT", "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.8.2" - } - }, - "node_modules/@truffle/abi-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/abi-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/abi-utils/node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.7.tgz", - "integrity": "sha512-1nibqGjEHC7KAyDThEFvbm2+EO8zAHee/VjCtxkYBE3ySwP50joh0QCEBjy7K/9z+icpMoDucfxmgaKToBFUgQ==" - }, - "node_modules/@truffle/codec": { - "version": "0.14.17", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.14.17.tgz", - "integrity": "sha512-kD4dD86huLeaBEq5R8D1zleJEu6NsXbyYLdXl1V1TKdiO8odw5CBC6Y/+wdu5d3t1dyEYrTbhn1dqknZa52pmw==", - "dependencies": { - "@truffle/abi-utils": "^0.3.9", - "@truffle/compile-common": "^0.9.4", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.8.2" - } - }, - "node_modules/@truffle/codec/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" }, - "engines": { - "node": ">=6.0.0" + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" } }, - "node_modules/@truffle/codec/node_modules/ethereum-cryptography": { + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3332,10 +2825,9 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@truffle/codec/node_modules/ethereumjs-util": { + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -3347,195 +2839,81 @@ "node": ">=10.0.0" } }, - "node_modules/@truffle/codec/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { + "version": "7.0.1", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=10" + "node": ">=6 <7 || >=8" } }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "engines": { - "node": ">=8" + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 4.0.0" } }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "license": "MIT", + "peer": true, "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" + "@types/bignumber.js": "^5.0.0" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" } }, - "node_modules/@truffle/codec/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/@truffle/compile-common": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.4.tgz", - "integrity": "sha512-mnqJB/hLiPHNf+WKwt/2MH6lv34xSG/SFCib7+ckAklutUqVLeFo8EwQxinuHNkU7LY0C+YgZXhK1WTCO5YRJQ==", + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "license": "MIT", "dependencies": { - "@truffle/error": "^0.2.0", - "colors": "1.4.0" + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" } }, - "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.0.tgz", - "integrity": "sha512-Fe0/z4WWb7IP2gBnv3l6zqP87Y0kSMs7oiSLakKJq17q3GUunrHSdioKuNspdggxkXIBhEQLhi8C+LJdwmHKWQ==" - }, - "node_modules/@truffle/compile-common/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { + "version": "7.2.1", + "license": "MIT", "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.13.tgz", - "integrity": "sha512-emG7upuryYFrsPDbHqeASPWXL824M1tinhQwSPG0phSoa3g+RX9fUNNN/VPmF3tSkXLWUMhRnb7ehxnaCuRbZg==", - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - } - }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.48", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.48.tgz", - "integrity": "sha512-HdK/7eH5EFrcTPeZVEgKaKkkzuZ4xsrH8yw+EoLEsScLsOEuQeKynY61NctjuU93voATWrYmV99Sfb/MRq2i2g==", - "dependencies": { - "@truffle/codec": "^0.14.17", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" - } - }, - "node_modules/@truffle/error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.31", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.31.tgz", - "integrity": "sha512-f5mOqbptQUUgHhBrBvWie4EUAUqHLN/wCBjFoP2N/QNcyvwGfdC3TSck9kjwIIFIgYgQQyAxQDGBQcjHryvxzg==", - "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.8.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" + "node": "*" } }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "license": "MIT", "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -3548,375 +2926,499 @@ "xmlhttprequest": "1.8.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.8.2.tgz", - "integrity": "sha512-92h0GdEHW9wqDICQQKyG4foZBYi0OQkyg4CRml2F7XBl/NG+fu9o6J19kzfFXzSBoA4DnJXbyRgj/RHZv5LRiw==", - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.8.2", - "web3-core": "1.8.2", - "web3-eth": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-shh": "1.8.2", - "web3-utils": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" - } + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1" }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.8.2.tgz", - "integrity": "sha512-1EEnxjPnFnvNWw3XeeKuTR8PBxYd0+XWzvaLK7OJC/Go9O8llLGxrxICbKV+8cgIE0sDRBxiYx02X+6OhoAQ9w==", - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } + "node_modules/@openzeppelin/contracts": { + "version": "4.7.3", + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.8.2.tgz", - "integrity": "sha512-DJTVEAYcNqxkqruJE+Rxp3CIv0y5AZMwPHQmOkz/cz+MM75SIzMTc0AUdXzGyTS8xMF8h3YWMQGgGEy8SBf1PQ==", + "node_modules/@pkgr/utils": { + "version": "2.4.1", + "dev": true, + "license": "MIT", "dependencies": { - "@types/bn.js": "^5.1.0", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-requestmanager": "1.8.2", - "web3-utils": "1.8.2" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.2.12", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.5.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.8.2.tgz", - "integrity": "sha512-6B1eLlq9JFrfealZBomd1fmlq1o4A09vrCVQSa51ANoib/jllT3atZrRDr0zt1rfI7TSZTZBXdN/aTdeN99DWw==", - "dependencies": { - "web3-eth-iban": "1.8.2", - "web3-utils": "1.8.2" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.8.2.tgz", - "integrity": "sha512-1qnr5mw5wVyULzLOrk4B+ryO3gfGjGd/fx8NR+J2xCGLf1e6OSjxT9vbfuQ3fErk/NjSTWWreieYWLMhaogcRA==", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-utils": "1.8.2" - }, + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.5.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/@remix-run/router": { + "version": "1.6.0", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=14" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.8.2.tgz", - "integrity": "sha512-nvkJWDVgoOSsolJldN33tKW6bKKRJX3MCPDYMwP5SUFOA/mCzDEoI88N0JFofDTXkh1k7gOqp1pvwi9heuaxGg==", + "node_modules/@rushstack/node-core-library": { + "version": "3.55.2", + "dev": true, + "license": "MIT", "dependencies": { - "eventemitter3": "4.0.4" + "colors": "~1.2.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "z-schema": "~5.0.2" }, - "engines": { - "node": ">=8.0.0" + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.8.2.tgz", - "integrity": "sha512-p1d090RYs5Mu7DK1yyc3GCBVZB/03rBtFhYFoS2EruGzOWs/5Q0grgtpwS/DScdRAm8wB8mYEBhY/RKJWF6B2g==", + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.8.2", - "web3-providers-http": "1.8.2", - "web3-providers-ipc": "1.8.2", - "web3-providers-ws": "1.8.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6 <7 || >=8" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.8.2.tgz", - "integrity": "sha512-vXQogHDmAIQcKpXvGiMddBUeP9lnKgYF64+yQJhPNE5PnWr1sAibXuIPV7mIPihpFr/n/DORRj6Wh1pUv9zaTw==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.8.2.tgz", - "integrity": "sha512-JoTiWWc4F4TInpbvDUGb0WgDYJsFhuIjJlinc5ByjWD88Gvh+GKLsRjjFdbqe5YtwIGT4NymwoC5LQd1K6u/QQ==", - "dependencies": { - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-accounts": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-eth-ens": "1.8.2", - "web3-eth-iban": "1.8.2", - "web3-eth-personal": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" - }, + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">= 4.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.8.2.tgz", - "integrity": "sha512-Om9g3kaRNjqiNPAgKwGT16y+ZwtBzRe4ZJFGjLiSs6v5I7TPNF+rRMWuKnR6jq0azQZDj6rblvKFMA49/k48Og==", + "node_modules/@rushstack/rig-package": { + "version": "0.3.18", + "dev": true, + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.8.2.tgz", - "integrity": "sha512-c367Ij63VCz9YdyjiHHWLFtN85l6QghgwMQH2B1eM/p9Y5lTlTX7t/Eg/8+f1yoIStXbk2w/PYM2lk+IkbqdLA==", + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.2", + "dev": true, + "license": "MIT", "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "node_modules/@scure/base": { + "version": "1.1.1", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/@scure/bip32": { + "version": "1.1.5", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.8.2.tgz", - "integrity": "sha512-ID5A25tHTSBNwOPjiXSVzxruz006ULRIDbzWTYIFTp7NJ7vXu/kynKK2ag/ObuTqBpMbobP8nXcA9b5EDkIdQA==", + "node_modules/@scure/bip39": { + "version": "1.1.1", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT", "dependencies": { - "@types/bn.js": "^5.1.0", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-utils": "1.8.2" - }, - "engines": { - "node": ">=8.0.0" + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.8.2.tgz", - "integrity": "sha512-PWph7C/CnqdWuu1+SH4U4zdrK4t2HNt0I4XzPYFdv9ugE8EuojselioPQXsVGvjql+Nt3jDLvQvggPqlMbvwRw==", + "node_modules/@sentry/core": { + "version": "5.30.0", + "license": "BSD-3-Clause", "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-promievent": "1.8.2", - "web3-eth-abi": "1.8.2", - "web3-eth-contract": "1.8.2", - "web3-utils": "1.8.2" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.8.2.tgz", - "integrity": "sha512-h3vNblDWkWMuYx93Q27TAJz6lhzpP93EiC3+45D6xoz983p6si773vntoQ+H+5aZhwglBtoiBzdh7PSSOnP/xQ==", + "node_modules/@sentry/hub": { + "version": "5.30.0", + "license": "BSD-3-Clause", "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.8.2" + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.8.2.tgz", - "integrity": "sha512-Vg4HfwCr7doiUF/RC+Jz0wT4+cYaXcOWMAW2AHIjHX6Z7Xwa8nrURIeQgeEE62qcEHAzajyAdB1u6bJyTfuCXw==", + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "license": "BSD-3-Clause", "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.8.2", - "web3-core-helpers": "1.8.2", - "web3-core-method": "1.8.2", - "web3-net": "1.8.2", - "web3-utils": "1.8.2" + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.8.2.tgz", - "integrity": "sha512-1itkDMGmbgb83Dg9nporFes9/fxsU7smJ3oRXlFkg4ZHn8YJyP1MSQFPJWWwSc+GrcCFt4O5IrUTvEkHqE3xag==", + "node_modules/@sentry/node": { + "version": "5.30.0", + "license": "BSD-3-Clause", "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-utils": "1.8.2" + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.8.2.tgz", - "integrity": "sha512-2xY94IIEQd16+b+vIBF4IC1p7GVaz9q4EUFscvMUjtEq4ru4Atdzjs9GP+jmcoo49p70II0UV3bqQcz0TQfVyQ==", + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "license": "MIT", "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.8.2" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.8.2.tgz", - "integrity": "sha512-p6fqKVGFg+WiXGHWnB1hu43PbvPkDHTz4RgoEzbXugv5rtv5zfYLqm8Ba6lrJOS5ks9kGKR21a0y3NzE3u7V4w==", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.8.2" - }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "license": "BSD-3-Clause", "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.8.2.tgz", - "integrity": "sha512-3s/4K+wHgbiN+Zrp9YjMq2eqAF6QGABw7wFftPdx+m5hWImV27/MoIx57c6HffNRqZXmCHnfWWFCNHHsi7wXnA==", + "node_modules/@sentry/utils": { + "version": "5.30.0", + "license": "BSD-3-Clause", "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.8.2", - "websocket": "^1.0.32" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.8.2.tgz", - "integrity": "sha512-uZ+3MAoNcaJsXXNCDnizKJ5viBNeHOFYsCbFhV755Uu52FswzTOw6DtE7yK9nYXMtIhiSgi7nwl1RYzP8pystw==", - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.8.2", - "web3-core-method": "1.8.2", - "web3-core-subscriptions": "1.8.2", - "web3-net": "1.8.2" - }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.8.2.tgz", - "integrity": "sha512-v7j6xhfLQfY7xQDrUP0BKbaNrmZ2/+egbqP9q3KYmOiPpnvAfol+32slgL0WX/5n8VPvKCK5EZ1HGrAVICSToA==", + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" + "type-detect": "4.0.8" } }, - "node_modules/@trufflesuite/chromafi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", - "dependencies": { + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "6.1.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@truffle/abi-utils": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.10.0" + } + }, + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/@truffle/codec": { + "version": "0.15.1", + "license": "MIT", + "dependencies": { + "@truffle/abi-utils": "^1.0.0", + "@truffle/compile-common": "^0.9.5", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "7.3.7", + "utf8": "^3.0.0", + "web3-utils": "1.10.0" + } + }, + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@truffle/codec/node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.3.7", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/@truffle/compile-common": { + "version": "0.9.5", + "license": "MIT", + "dependencies": { + "@truffle/error": "^0.2.0", + "colors": "1.4.0" + } + }, + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/@truffle/compile-common/node_modules/colors": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@truffle/contract-schema": { + "version": "3.4.14", + "license": "MIT", + "dependencies": { + "ajv": "^6.10.0", + "debug": "^4.3.1" + } + }, + "node_modules/@truffle/debug-utils": { + "version": "6.0.50", + "license": "MIT", + "dependencies": { + "@truffle/codec": "^0.15.1", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" + } + }, + "node_modules/@truffle/error": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter": { + "version": "0.5.33", + "license": "MIT", + "dependencies": { + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.10.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "license": "MIT", + "dependencies": { + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "license": "MIT" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1" + }, + "node_modules/@trufflesuite/chromafi": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { "camelcase": "^4.1.0", "chalk": "^2.3.2", "cheerio": "^1.0.0-rc.2", @@ -3927,35 +3429,61 @@ "strip-indent": "^2.0.0" } }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "devOptional": true + "version": "1.0.4", + "devOptional": true, + "license": "MIT" }, "node_modules/@typechain/ethers-v5": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.0.tgz", - "integrity": "sha512-ikaq0N/w9fABM+G01OFmU3U3dNnyRwEahkdvi9mqy1a3XwKiPZaF/lu54OcNaEWnpvEYyhhS0N7buCtLQqC92w==", + "version": "10.2.1", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -3963,7 +3491,6 @@ }, "peerDependencies": { "@ethersproject/abi": "^5.0.0", - "@ethersproject/bytes": "^5.0.0", "@ethersproject/providers": "^5.0.0", "ethers": "^5.1.3", "typechain": "^8.1.1", @@ -3971,10 +3498,9 @@ } }, "node_modules/@typechain/hardhat": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.5.tgz", - "integrity": "sha512-lg7LW4qDZpxFMknp3Xool61Fg6Lays8F8TXdFGBG+MxyYcYU5795P1U2XdStuzGq9S2Dzdgh+1jGww9wvZ6r4Q==", + "version": "6.1.6", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -3982,7 +3508,7 @@ "peerDependencies": { "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", - "@typechain/ethers-v5": "^10.2.0", + "@typechain/ethers-v5": "^10.2.1", "ethers": "^5.4.7", "hardhat": "^2.9.9", "typechain": "^8.1.1" @@ -3990,9 +3516,8 @@ }, "node_modules/@typechain/hardhat/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -4004,40 +3529,14 @@ "node": ">=10" } }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/bignumber.js": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", + "license": "MIT", "peer": true, "dependencies": { "bignumber.js": "*" @@ -4045,16 +3544,14 @@ }, "node_modules/@types/bn.js": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -4063,24 +3560,21 @@ } }, "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==" + "version": "4.3.5", + "license": "MIT" }, "node_modules/@types/chai-as-promised": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "*" } }, "node_modules/@types/concat-stream": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -4088,9 +3582,8 @@ }, "node_modules/@types/d3": { "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -4125,46 +3618,40 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.4.tgz", - "integrity": "sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ==", - "dev": true + "version": "3.0.5", + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -4172,196 +3659,169 @@ }, "node_modules/@types/d3-delaunay": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.2.tgz", - "integrity": "sha512-t09DDJVBI6AkM7N8kuPsnq/3d/ehtRKBN1xSiYjjMCgbiw6HM6Ged5VhvswmhprfKyGvzeTEL/4WBaK9llWvlA==", + "version": "3.0.3", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/dompurify": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", "dev": true, + "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/form-data": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -4369,148 +3829,136 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/geojson": { "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/minimatch": "*", "@types/node": "*" } }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "license": "MIT" }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.12", + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/lodash": { "version": "4.14.189", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", - "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + "license": "MIT" }, "node_modules/@types/mermaid": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", - "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", "dev": true, + "license": "MIT", "dependencies": { "mermaid": "*" } }, "node_modules/@types/minimatch": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/minimist": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ndjson": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", - "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/through": "*" } }, "node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==" + "version": "20.2.5", + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/object-hash": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.2.1.tgz", - "integrity": "sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/prompts": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.4.tgz", - "integrity": "sha512-p5N9uoTH76lLvSAaYSZtBCdEXzpOOufsRjnhjVSrZGXikVGHX9+cc9ERtHRV4hvBKHyZb1bg4K+56Bd2TqUn4A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "kleur": "^3.0.3" @@ -4518,110 +3966,111 @@ }, "node_modules/@types/prop-types": { "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "devOptional": true + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/react": { - "version": "17.0.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", - "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", - "devOptional": true, + "version": "18.2.7", + "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-dom": { + "version": "18.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/readable-stream": { "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" } }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/@types/responselike": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "devOptional": true + "license": "MIT" }, "node_modules/@types/secp256k1": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, + "node_modules/@types/semver": { + "version": "7.5.0", + "dev": true, + "license": "MIT" + }, "node_modules/@types/sinon": { - "version": "10.0.14", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.14.tgz", - "integrity": "sha512-mn72up6cjaMyMuaPaa/AwKf6WtsSRysQC7wxFkCm1XcOKXPM1z+5Y4H5wjIVBz4gdAkjvZxVVfjA6ba1nHr5WQ==", + "version": "10.0.15", "dev": true, + "license": "MIT", "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/@types/styled-components": { + "version": "5.1.26", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } }, "node_modules/@types/through": { "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/tmp": { "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/trusted-types": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/yoga-layout": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", - "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/scope-manager": "4.31.2", @@ -4650,9 +4099,8 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.31.2", @@ -4674,9 +4122,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", - "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/types": "4.31.2", @@ -4701,9 +4148,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2" @@ -4716,11 +4162,101 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/utils": "5.59.7", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@typescript-eslint/types": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -4731,9 +4267,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2", @@ -4756,11 +4291,116 @@ } } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.7", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", - "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" @@ -4775,22 +4415,19 @@ }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@uniswap/lib": { "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/@uniswap/sdk-core": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.2.2.tgz", - "integrity": "sha512-dPA34T8EVfFzKtw1NC1Mr7M0aXpY1UN+lUpdBv757JxKKMlGQTg96XTIfjYCflqEshxlBdz2+IVQgk6H+dMu5g==", + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.0.2", "big.js": "^5.2.2", @@ -4805,16 +4442,14 @@ }, "node_modules/@uniswap/sdk-core/node_modules/big.js": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/@uniswap/swap-router-contracts": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz", - "integrity": "sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v2-core": "1.0.1", @@ -4828,13 +4463,11 @@ }, "node_modules/@uniswap/swap-router-contracts/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + "license": "MIT" }, "node_modules/@uniswap/swap-router-contracts/node_modules/@uniswap/v3-periphery": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", - "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/lib": "^4.0.1-alpha", @@ -4849,24 +4482,21 @@ }, "node_modules/@uniswap/v2-core": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", + "license": "GPL-3.0-or-later", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-core": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", - "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", + "license": "BUSL-1.1", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-periphery": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz", - "integrity": "sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/lib": "^4.0.1-alpha", @@ -4881,13 +4511,11 @@ }, "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + "license": "MIT" }, "node_modules/@uniswap/v3-sdk": { "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz", - "integrity": "sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ==", + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.0.12", "@ethersproject/solidity": "^5.0.9", @@ -4904,13 +4532,11 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" + "license": "MIT" }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/swap-router-contracts": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz", - "integrity": "sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7", "@uniswap/v2-core": "1.0.1", @@ -4925,8 +4551,7 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-periphery": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz", - "integrity": "sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg==", + "license": "GPL-2.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7", "@uniswap/lib": "^4.0.1-alpha", @@ -4941,9 +4566,7 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz", - "integrity": "sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw==", - "deprecated": "Please upgrade to 1.0.1", + "license": "GPL-3.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v3-core": "1.0.0", @@ -4955,13 +4578,11 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + "license": "MIT" }, "node_modules/@uniswap/v3-staker": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz", - "integrity": "sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ==", + "license": "GPL-3.0-or-later", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v3-core": "1.0.0", @@ -4973,20 +4594,34 @@ }, "node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.4", + "@babel/plugin-transform-react-jsx-self": "^7.21.0", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } }, "node_modules/abbrev": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/abort-controller": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "license": "MIT", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -4996,13 +4631,11 @@ }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + "license": "MIT" }, "node_modules/abstract-level": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -5018,8 +4651,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5030,9 +4662,8 @@ }, "node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5042,27 +4673,24 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -5070,21 +4698,18 @@ }, "node_modules/adm-zip": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "license": "MIT", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -5094,8 +4719,7 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5106,8 +4730,7 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5121,9 +4744,8 @@ }, "node_modules/amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, + "license": "BSD-3-Clause OR MIT", "optional": true, "peer": true, "engines": { @@ -5131,17 +4753,15 @@ } }, "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "version": "4.1.3", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -5153,23 +4773,20 @@ } }, "node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "version": "5.0.1", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/ansi-sequence-parser": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -5179,15 +4796,13 @@ }, "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", "dev": true, + "license": "BSD-3-Clause", "peer": true }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5198,9 +4813,8 @@ }, "node_modules/append-transform": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, + "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -5210,30 +4824,26 @@ }, "node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-back": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -5241,9 +4851,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -5254,14 +4863,12 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5278,18 +4885,16 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -5297,9 +4902,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -5315,9 +4919,8 @@ }, "node_modules/array.prototype.reduce": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -5335,67 +4938,64 @@ }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/async": { + "version": "1.5.2", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "peer": true, "engines": { "node": ">= 4.0.0" @@ -5403,8 +5003,7 @@ }, "node_modules/auto-bind": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -5414,8 +5013,7 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -5425,34 +5023,46 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "license": "MIT" + }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-module-imports": "^7.21.4", + "babel-plugin-syntax-jsx": "^6.18.0", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, + "node_modules/babel-plugin-syntax-jsx": { + "version": "6.18.0", + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -5466,43 +5076,39 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/base64-sol": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "license": "Unlicense" }, "node_modules/bech32": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "license": "MIT" }, "node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "version": "1.6.51", + "dev": true, + "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "license": "MIT", "engines": { "node": "*" }, @@ -5513,47 +5119,40 @@ }, "node_modules/bigint-crypto-utils": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/bignumber.js": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/blakejs": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "license": "MIT" }, "node_modules/bluebird": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5575,16 +5174,14 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5594,13 +5191,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -5613,14 +5208,12 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "license": "ISC" }, "node_modules/bplist-parser": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, + "license": "MIT", "dependencies": { "big-integer": "^1.6.44" }, @@ -5628,27 +5221,17 @@ "node": ">= 5.10.0" } }, - "node_modules/bplist-parser/node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "1.1.11", + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -5658,13 +5241,11 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "license": "MIT" }, "node_modules/browser-level": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -5674,13 +5255,11 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "license": "ISC" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5691,9 +5270,7 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", "dev": true, "funding": [ { @@ -5703,13 +5280,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -5720,16 +5302,14 @@ }, "node_modules/bs58": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -5738,8 +5318,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5754,6 +5332,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5761,24 +5340,20 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/buffer-to-arraybuffer": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "license": "MIT" }, "node_modules/bufferutil": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -5788,9 +5363,8 @@ }, "node_modules/bundle-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -5803,8 +5377,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -5814,24 +5386,21 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -5847,8 +5416,7 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -5861,17 +5429,15 @@ }, "node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/caching-transform": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, + "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -5884,8 +5450,7 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5896,35 +5461,32 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.1" } }, "node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "version": "5.3.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", - "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^7.0.0", "map-obj": "^4.3.0", @@ -5940,9 +5502,8 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5952,9 +5513,8 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -5962,10 +5522,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelize": { + "version": "1.0.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { - "version": "1.0.30001480", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001480.tgz", - "integrity": "sha512-q7cpoPPvZYgtyC4VaBSN0Bt+PJ4c4EYRf0DrduInOz2SkFpHD5p3LnvEpqBp7UnJn+8x1Ogl1s38saUxe+ihQQ==", + "version": "1.0.30001489", "dev": true, "funding": [ { @@ -5980,34 +5545,31 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "license": "(MIT OR GPL-3.0-or-later)", "engines": { "node": ">= 0.8.0" } }, "node_modules/caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "license": "Apache-2.0" }, "node_modules/catering": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cbor": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "nofilter": "^3.1.0" @@ -6018,8 +5580,7 @@ }, "node_modules/chai": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -6035,9 +5596,8 @@ }, "node_modules/chai-as-promised": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, + "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -6047,8 +5607,7 @@ }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -6058,37 +5617,9 @@ "node": ">=4" } }, - "node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/change-case": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "license": "MIT", "dependencies": { "camel-case": "^3.0.0", "constant-case": "^2.0.0", @@ -6112,9 +5643,8 @@ }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -6122,16 +5652,14 @@ }, "node_modules/check-error": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -6150,8 +5678,7 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -6166,14 +5693,13 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6192,19 +5718,15 @@ }, "node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "license": "ISC" }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "license": "MIT" }, "node_modules/cids": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -6219,8 +5741,6 @@ }, "node_modules/cids/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -6235,6 +5755,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6242,9 +5763,7 @@ }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -6252,8 +5771,7 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -6261,14 +5779,12 @@ }, "node_modules/class-is": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "license": "MIT" }, "node_modules/classic-level": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -6282,16 +5798,14 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-boxes": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "license": "MIT", "engines": { "node": ">=6" }, @@ -6301,8 +5815,7 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -6311,9 +5824,8 @@ } }, "node_modules/cli-spinners": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.8.0.tgz", - "integrity": "sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ==", + "version": "2.9.0", + "license": "MIT", "engines": { "node": ">=6" }, @@ -6323,9 +5835,8 @@ }, "node_modules/cli-table3": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "object-assign": "^4.1.0", @@ -6338,75 +5849,75 @@ "colors": "^1.1.2" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, + "node_modules/cli-table3/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/cli-truncate/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cli-truncate/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/cli-table3/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/cli-table3/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -6419,8 +5930,7 @@ }, "node_modules/cliui/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -6430,37 +5940,11 @@ }, "node_modules/cliui/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6475,8 +5959,7 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -6486,8 +5969,7 @@ }, "node_modules/code-excerpt": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", - "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "license": "MIT", "dependencies": { "convert-to-spaces": "^1.0.1" }, @@ -6497,38 +5979,33 @@ }, "node_modules/code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "license": "MIT" }, "node_modules/colors": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6538,14 +6015,12 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + "license": "MIT" }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.1.0", @@ -6559,9 +6034,8 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.2", @@ -6575,9 +6049,8 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -6585,9 +6058,8 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -6595,32 +6067,27 @@ }, "node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" ], + "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -6631,16 +6098,14 @@ }, "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "core-util-is": "~1.0.0", @@ -6652,18 +6117,10 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -6671,8 +6128,7 @@ }, "node_modules/constant-case": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "license": "MIT", "dependencies": { "snake-case": "^2.1.0", "upper-case": "^1.1.1" @@ -6680,8 +6136,7 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6689,60 +6144,70 @@ "node": ">= 0.6" } }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, + "node_modules/content-disposition/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/content-hash": { + "version": "2.5.2", + "license": "ISC", + "dependencies": { + "cids": "^0.7.1", + "multicodec": "^0.5.5", + "multihashes": "^0.4.15" + } + }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/convert-to-spaces": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/cookie": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -6753,17 +6218,14 @@ }, "node_modules/cose-base": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dev": true, + "license": "MIT", "dependencies": { "layout-base": "^1.0.0" } }, "node_modules/crc-32": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -6773,8 +6235,7 @@ }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6785,8 +6246,7 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6798,23 +6258,20 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "version": "3.1.6", + "license": "MIT", "dependencies": { - "node-fetch": "2.6.7" + "node-fetch": "^2.6.11" } }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6826,9 +6283,8 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -6836,8 +6292,7 @@ }, "node_modules/crypto-addr-codec": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", - "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "license": "MIT", "dependencies": { "base-x": "^3.0.8", "big-integer": "1.6.36", @@ -6848,11 +6303,35 @@ "sha3": "^2.1.1" } }, + "node_modules/crypto-addr-codec/node_modules/big-integer": { + "version": "1.6.36", + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/crypto-addr-codec/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -6865,9 +6344,8 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6875,10 +6353,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, "node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6890,10 +6374,18 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -6903,15 +6395,11 @@ }, "node_modules/csstype": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "devOptional": true + "license": "MIT" }, "node_modules/cytoscape": { - "version": "3.23.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.23.0.tgz", - "integrity": "sha512-gRZqJj/1kiAVPkrVFvz/GccxsXhF3Qwpptl32gKKypO4IlqnKBjTOu+HbXtEggSGzC5KCaHp3/F7GgENrtsFkA==", - "dev": true, + "version": "3.25.0", + "license": "MIT", "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -6922,9 +6410,7 @@ }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dev": true, + "license": "MIT", "dependencies": { "cose-base": "^1.0.0" }, @@ -6934,9 +6420,7 @@ }, "node_modules/cytoscape-fcose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "dev": true, + "license": "MIT", "dependencies": { "cose-base": "^2.2.0" }, @@ -6946,23 +6430,18 @@ }, "node_modules/cytoscape-fcose/node_modules/cose-base": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "dev": true, + "license": "MIT", "dependencies": { "layout-base": "^2.0.0" } }, "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true + "license": "MIT" }, "node_modules/d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "license": "ISC", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -6970,9 +6449,7 @@ }, "node_modules/d3": { "version": "7.8.4", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.4.tgz", - "integrity": "sha512-q2WHStdhiBtD8DMmhDPyJmXUxr6VWRngKyiJ5EfXMxPw+tqT6BhNjhJZ4w3BHsNm3QoVfZLY8Orq/qPFczwKRA==", - "dev": true, + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -7011,9 +6488,7 @@ }, "node_modules/d3-array": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.3.tgz", - "integrity": "sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ==", - "dev": true, + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -7023,18 +6498,14 @@ }, "node_modules/d3-axis": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-brush": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7048,9 +6519,7 @@ }, "node_modules/d3-chord": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -7060,18 +6529,14 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-contour": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -7081,9 +6546,7 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -7093,18 +6556,14 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -7115,9 +6574,7 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -7140,18 +6597,14 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-fetch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -7161,9 +6614,7 @@ }, "node_modules/d3-force": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -7175,18 +6626,14 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -7196,18 +6643,14 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -7217,45 +6660,35 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-polygon": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -7269,9 +6702,7 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", - "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -7282,18 +6713,14 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -7303,9 +6730,7 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -7315,9 +6740,7 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -7327,18 +6750,14 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -7355,9 +6774,7 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7370,10 +6787,8 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", - "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", - "dev": true, + "version": "7.0.10", + "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -7381,8 +6796,7 @@ }, "node_modules/dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -7392,21 +6806,16 @@ }, "node_modules/dayjs": { "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "dev": true + "license": "MIT" }, "node_modules/death": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, "peer": true }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -7419,24 +6828,17 @@ } } }, - "node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -7450,30 +6852,26 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js-light": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + "license": "MIT" }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -7486,8 +6884,7 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -7497,8 +6894,7 @@ }, "node_modules/deep-eql": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -7508,9 +6904,8 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -7518,15 +6913,13 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/default-browser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -7542,9 +6935,8 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, + "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -7558,9 +6950,8 @@ }, "node_modules/default-require-extensions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, + "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -7573,17 +6964,15 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -7593,9 +6982,8 @@ }, "node_modules/define-properties": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, + "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -7609,33 +6997,28 @@ }, "node_modules/delaunator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dev": true, + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7643,17 +7026,15 @@ }, "node_modules/detect-indent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/detect-port": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "address": "^1.0.1", @@ -7666,30 +7047,23 @@ }, "node_modules/diff": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/difflib": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "peer": true, "dependencies": { "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7699,8 +7073,7 @@ }, "node_modules/dns-packet": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7710,9 +7083,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7722,8 +7094,7 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -7734,25 +7105,21 @@ } }, "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + "version": "0.1.2" }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -7764,19 +7131,16 @@ } }, "node_modules/dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", - "dev": true + "version": "2.4.5", + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", + "version": "3.1.0", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -7784,24 +7148,21 @@ }, "node_modules/dot-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/dotenv": { "version": "14.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", - "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", + "license": "BSD-2-Clause", "engines": { "node": ">=12" } }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -7809,25 +7170,20 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.367", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.367.tgz", - "integrity": "sha512-mNuDxb+HpLhPGUKrg0hSxbTjHWw8EziwkwlJNkFUj3W60ypigLDRVz04vU+VRsJPi8Gub+FDhYUpuTm9xiEwRQ==", - "dev": true + "version": "1.4.411", + "dev": true, + "license": "ISC" }, "node_modules/elkjs": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", - "dev": true + "license": "EPL-2.0" }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7840,35 +7196,30 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.14.1", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7879,8 +7230,7 @@ }, "node_modules/enquirer": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -7890,8 +7240,7 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -7901,25 +7250,22 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", @@ -7965,16 +7311,14 @@ }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/es-set-tostringtag": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -7986,18 +7330,16 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, + "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, + "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -8012,9 +7354,8 @@ }, "node_modules/es5-ext": { "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "hasInstallScript": true, + "license": "ISC", "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -8026,14 +7367,12 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/es6-iterator": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "license": "MIT", "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -8042,13 +7381,11 @@ }, "node_modules/es6-promise": { "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "license": "MIT" }, "node_modules/es6-symbol": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "license": "ISC", "dependencies": { "d": "^1.0.1", "ext": "^1.1.2" @@ -8056,10 +7393,9 @@ }, "node_modules/esbuild": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -8091,388 +7427,86 @@ "esbuild-windows-arm64": "0.15.18" } }, - "node_modules/esbuild-android-64": { + "node_modules/esbuild-darwin-64": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", "cpu": [ "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">=12" } }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "node_modules/escalade": { + "version": "3.1.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=6" } }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.8.0" } }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], + "node_modules/escodegen": { + "version": "1.8.1", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, "engines": { - "node": ">=12" + "node": ">=0.12.0" + }, + "optionalDependencies": { + "source-map": "~0.2.0" } }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], + "node_modules/escodegen/node_modules/esprima": { + "version": "2.7.3", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "BSD-2-Clause", + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, "engines": { - "node": ">=12" + "node": ">=0.10.0" } }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], + "node_modules/escodegen/node_modules/estraverse": { + "version": "1.9.3", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "peer": true, "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0" } }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -8484,9 +7518,8 @@ }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "deep-is": "~0.1.3", @@ -8502,8 +7535,6 @@ }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "peer": true, "engines": { @@ -8512,8 +7543,6 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "peer": true, @@ -8526,9 +7555,8 @@ }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -8539,9 +7567,8 @@ }, "node_modules/eslint": { "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -8596,9 +7623,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -8608,9 +7634,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", @@ -8619,18 +7644,16 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -8654,9 +7677,8 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -8673,18 +7695,16 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/eslint-import-resolver-typescript/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8694,9 +7714,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -8711,18 +7730,16 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", @@ -8747,30 +7764,18 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8778,29 +7783,15 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-utils": "^3.0.0", "ramda": "^0.27.1" @@ -8814,18 +7805,16 @@ }, "node_modules/eslint-plugin-no-only-tests": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", - "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, + "license": "MIT", "engines": { "node": ">=5.0.0" } }, "node_modules/eslint-plugin-prettier": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -8842,11 +7831,29 @@ } } }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=7" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -8857,9 +7864,8 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -8875,27 +7881,24 @@ }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, - "node_modules/eslint/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/eslint/node_modules/@babel/code-frame": { + "version": "7.12.11", "dev": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.10.4" + } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8906,21 +7909,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8934,9 +7926,8 @@ }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8946,15 +7937,24 @@ }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -8967,68 +7967,38 @@ }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, - "node_modules/eslint/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "type-fest": "^0.20.2" }, "engines": { - "node": "*" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9036,11 +8006,21 @@ "node": ">=8" } }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/espree": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -9052,32 +8032,28 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "version": "4.0.1", "dev": true, - "peer": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -9087,18 +8063,16 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -9108,43 +8082,38 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eth-ens-namehash": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "license": "ISC", "dependencies": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -9152,14 +8121,12 @@ }, "node_modules/eth-ens-namehash/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/eth-gas-reporter": { "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.0-beta.146", @@ -9189,9 +8156,8 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-colors": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -9199,9 +8165,8 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -9209,37 +8174,14 @@ }, "node_modules/eth-gas-reporter/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/eth-gas-reporter/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/eth-gas-reporter/node_modules/chokidar": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "anymatch": "~3.1.1", @@ -9259,9 +8201,8 @@ }, "node_modules/eth-gas-reporter/node_modules/cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "string-width": "^3.1.0", @@ -9271,9 +8212,8 @@ }, "node_modules/eth-gas-reporter/node_modules/colors": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.1.90" @@ -9281,10 +8221,8 @@ }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -9292,9 +8230,8 @@ }, "node_modules/eth-gas-reporter/node_modules/diff": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -9302,40 +8239,14 @@ }, "node_modules/eth-gas-reporter/node_modules/emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/eth-gas-reporter/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/ethers": { "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "aes-js": "3.0.0", @@ -9351,9 +8262,8 @@ }, "node_modules/eth-gas-reporter/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^3.0.0" @@ -9364,9 +8274,8 @@ }, "node_modules/eth-gas-reporter/node_modules/flat": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "is-buffer": "~2.0.3" @@ -9377,11 +8286,8 @@ }, "node_modules/eth-gas-reporter/node_modules/fsevents": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -9393,9 +8299,8 @@ }, "node_modules/eth-gas-reporter/node_modules/glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -9409,21 +8314,10 @@ "node": "*" } }, - "node_modules/eth-gas-reporter/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eth-gas-reporter/node_modules/hash.js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -9432,9 +8326,8 @@ }, "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -9442,16 +8335,14 @@ }, "node_modules/eth-gas-reporter/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/js-yaml": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -9463,9 +8354,8 @@ }, "node_modules/eth-gas-reporter/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^3.0.0", @@ -9477,9 +8367,8 @@ }, "node_modules/eth-gas-reporter/node_modules/log-symbols": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2" @@ -9490,9 +8379,8 @@ }, "node_modules/eth-gas-reporter/node_modules/minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -9503,9 +8391,8 @@ }, "node_modules/eth-gas-reporter/node_modules/mkdirp": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5" @@ -9516,9 +8403,8 @@ }, "node_modules/eth-gas-reporter/node_modules/mocha": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-colors": "3.2.3", @@ -9560,16 +8446,14 @@ }, "node_modules/eth-gas-reporter/node_modules/ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/object.assign": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.1.2", @@ -9583,9 +8467,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -9599,9 +8482,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.0.0" @@ -9612,9 +8494,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -9622,9 +8503,8 @@ }, "node_modules/eth-gas-reporter/node_modules/readdirp": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "picomatch": "^2.0.4" @@ -9633,32 +8513,22 @@ "node": ">= 8" } }, - "node_modules/eth-gas-reporter/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "peer": true - }, "node_modules/eth-gas-reporter/node_modules/scrypt-js": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/setimmediate": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "emoji-regex": "^7.0.1", @@ -9671,9 +8541,8 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -9684,9 +8553,8 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -9694,9 +8562,8 @@ }, "node_modules/eth-gas-reporter/node_modules/supports-color": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -9707,17 +8574,13 @@ }, "node_modules/eth-gas-reporter/node_modules/uuid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "peer": true }, "node_modules/eth-gas-reporter/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -9726,18 +8589,10 @@ "which": "bin/which" } }, - "node_modules/eth-gas-reporter/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "peer": true - }, "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -9750,16 +8605,14 @@ }, "node_modules/eth-gas-reporter/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/eth-gas-reporter/node_modules/yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cliui": "^5.0.0", @@ -9776,9 +8629,8 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -9787,9 +8639,8 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "flat": "^4.1.0", @@ -9802,8 +8653,7 @@ }, "node_modules/eth-lib": { "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -9815,18 +8665,11 @@ }, "node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/eth-lib/node_modules/ws": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "license": "MIT", "dependencies": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -9835,16 +8678,14 @@ }, "node_modules/ethereum-bloom-filters": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "license": "MIT", "dependencies": { "js-sha3": "^0.8.0" } }, "node_modules/ethereum-cryptography": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -9854,8 +8695,7 @@ }, "node_modules/ethereum-ens": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", - "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "license": "LGPL-3.0", "dependencies": { "bluebird": "^3.4.7", "eth-ens-namehash": "^2.0.0", @@ -9867,13 +8707,11 @@ }, "node_modules/ethereum-ens/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/ethereumjs-abi": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -9881,13 +8719,11 @@ }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/ethereumjs-util": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -9900,21 +8736,18 @@ }, "node_modules/ethereumjs-util/node_modules/@types/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/ethereumjs-util/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -9935,8 +8768,6 @@ }, "node_modules/ethers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "funding": [ { "type": "individual", @@ -9947,6 +8778,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -9980,749 +8812,1349 @@ "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/ethers/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "node_modules/ethers/node_modules/@ethersproject/address": { + "version": "5.7.0", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "license": "MIT", + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/ethjs-unit": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "bn.js": "4.11.6", + "number-to-bn": "1.7.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/ethjs-unit/node_modules/bn.js": { + "version": "4.11.6", + "license": "MIT" + }, + "node_modules/ethjs-util": { + "version": "0.1.6", + "license": "MIT", + "dependencies": { + "is-hex-prefixed": "1.0.0", + "strip-hex-prefix": "1.0.0" + }, + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "license": "MIT", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/express": { + "version": "4.18.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/body-parser": { + "version": "1.20.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/express/node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/express/node_modules/raw-body": { + "version": "2.5.1", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/ext": { + "version": "1.7.0", + "license": "ISC", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "license": "ISC" + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT" + }, + "node_modules/fast-check": { + "version": "3.1.1", + "license": "MIT", + "dependencies": { + "pure-rand": "^5.0.1" + }, + "engines": { + "node": ">=8.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.15.0", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-type": { + "version": "18.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0", + "token-types": "^5.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-replace": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "license": "Apache-2.0", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/form-data-encoder": { + "version": "1.7.1", + "license": "MIT" + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fp-ts": { + "version": "1.19.3", + "license": "MIT" + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "1.2.7", + "license": "ISC", + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/fs-readdir-recursive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" } }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "node_modules/get-func-name": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": "*" + } }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "license": "MIT", "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">=8.0.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/get-port": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "node_modules/get-stdin": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "node_modules/get-symbol-description": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" }, "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "node_modules/get-tsconfig": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "license": "MIT", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/ghost-testrpc": { + "version": "0.0.2", "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "chalk": "^2.4.2", + "node-emoji": "^1.10.0" + }, + "bin": { + "testrpc-sc": "index.js" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "*" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" + "is-glob": "^4.0.1" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 6" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "node_modules/global": { + "version": "4.4.0", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" + "bin": { + "which": "bin/which" } }, - "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=4" } }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/globalthis": { + "version": "1.0.3", + "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "node_modules/globby/node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "node_modules/got": { + "version": "12.1.0", + "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "@sindresorhus/is": "^4.6.0", + "@szmarczak/http-timer": "^5.0.1", + "@types/cacheable-request": "^6.0.2", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^6.0.4", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "form-data-encoder": "1.7.1", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "dev": true, + "license": "MIT" }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] + "node_modules/growl": { + "version": "1.10.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.x" + } }, - "node_modules/fast-check": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", - "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "node_modules/handlebars": { + "version": "4.7.7", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "pure-rand": "^5.0.1" + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" }, "engines": { - "node": ">=8.0.0" + "node": ">=0.4.7" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true + "node_modules/har-schema": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=4" + } }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, + "node_modules/har-validator": { + "version": "5.1.5", + "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "ajv": "^6.12.3", + "har-schema": "^2.0.0" }, "engines": { - "node": ">=8.6.0" + "node": ">=6" } }, - "node_modules/fast-json-stable-stringify": { + "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "node_modules/hardhat": { + "version": "2.14.0", + "license": "MIT", + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@metamask/eth-sig-util": "^4.0.0", + "@nomicfoundation/ethereumjs-block": "5.0.1", + "@nomicfoundation/ethereumjs-blockchain": "7.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.1", + "@nomicfoundation/ethereumjs-evm": "2.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-statemanager": "2.0.1", + "@nomicfoundation/ethereumjs-trie": "6.0.1", + "@nomicfoundation/ethereumjs-tx": "5.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/solidity-analyzer": "^0.1.0", + "@sentry/node": "^5.18.1", + "@types/bn.js": "^5.1.0", + "@types/lru-cache": "^5.1.0", + "abort-controller": "^3.0.0", + "adm-zip": "^0.4.16", + "aggregate-error": "^3.0.0", + "ansi-escapes": "^4.3.0", + "chalk": "^2.4.2", + "chokidar": "^3.4.0", + "ci-info": "^2.0.0", + "debug": "^4.1.1", + "enquirer": "^2.3.0", + "env-paths": "^2.2.0", + "ethereum-cryptography": "^1.0.3", + "ethereumjs-abi": "^0.6.8", + "find-up": "^2.1.0", + "fp-ts": "1.19.3", + "fs-extra": "^7.0.1", + "glob": "7.2.0", + "immutable": "^4.0.0-rc.12", + "io-ts": "1.10.4", + "keccak": "^3.0.2", + "lodash": "^4.17.11", + "mnemonist": "^0.38.0", + "mocha": "^10.0.0", + "p-map": "^4.0.0", + "qs": "^6.7.0", + "raw-body": "^2.4.1", + "resolve": "1.17.0", + "semver": "^6.3.0", + "solc": "0.7.3", + "source-map-support": "^0.5.13", + "stacktrace-parser": "^0.1.10", + "tsort": "0.0.1", + "undici": "^5.14.0", + "uuid": "^8.3.2", + "ws": "^7.4.6" + }, + "bin": { + "hardhat": "internal/cli/bootstrap.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "ts-node": "*", + "typescript": "*" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + }, + "typescript": { + "optional": true + } + } }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "node_modules/hardhat-gas-reporter": { + "version": "1.0.9", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "reusify": "^1.0.4" + "array-uniq": "1.0.3", + "eth-gas-reporter": "^0.2.25", + "sha1": "^1.1.1" + }, + "peerDependencies": { + "hardhat": "^2.0.2" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, + "node_modules/hardhat-watcher": { + "version": "2.5.0", + "license": "MIT", "dependencies": { - "flat-cache": "^3.0.4" + "chokidar": "^3.5.3" }, + "peerDependencies": { + "hardhat": "^2.0.0" + } + }, + "node_modules/hardhat/node_modules/ansi-colors": { + "version": "4.1.1", + "license": "MIT", "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=6" } }, - "node_modules/file-type": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.2.1.tgz", - "integrity": "sha512-Yw5MtnMv7vgD2/6Bjmmuegc8bQEVA9GmAyaR18bMYWKqsWDG9wgYZ1j4I6gNMF5Y5JBDcUcjRQqNQx7Y8uotcg==", - "dev": true, + "node_modules/hardhat/node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/hardhat/node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, + "balanced-match": "^1.0.0" + } + }, + "node_modules/hardhat/node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fill-range": { + "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=8" + "node": ">=6 <7 || >=8" } }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, + "node_modules/hardhat/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "node_modules/hardhat/node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "ms": "2.0.0" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "node_modules/hardhat/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, + "node_modules/hardhat/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "peer": true, + "node_modules/hardhat/node_modules/minimatch": { + "version": "5.0.1", + "license": "ISC", "dependencies": { - "array-back": "^3.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=4.0.0" + "node": ">=10" } }, - "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "node_modules/hardhat/node_modules/mocha": { + "version": "10.2.0", + "license": "MIT", "dependencies": { - "locate-path": "^2.0.0" + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" + "node": ">= 14.0.0" }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, + "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "node": ">=10" }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "node_modules/hardhat/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/hardhat/node_modules/nanoid": { + "version": "3.3.3", + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=6 <7 || >=8" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "node_modules/hardhat/node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true, - "peer": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], + "yocto-queue": "^0.1.0" + }, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, + "node_modules/hardhat/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "p-limit": "^3.0.2" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "node_modules/hardhat/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, + "node_modules/hardhat/node_modules/resolve": { + "version": "1.17.0", + "license": "MIT", + "dependencies": { + "path-parse": "^1.0.6" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" + "node_modules/hardhat/node_modules/semver": { + "version": "6.3.0", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/hardhat/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "node_modules/hardhat/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": "*" + "node": ">= 4.0.0" } }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/hardhat/node_modules/workerpool": { + "version": "6.2.1", + "license": "Apache-2.0" + }, + "node_modules/has": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4.0" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "node_modules/has-bigints": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">=8.0.0" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true, - "peer": true, + "node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "node_modules/has-property-descriptors": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=12" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-symbol-description": { + "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -10731,157 +10163,241 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-tsconfig": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.5.0.tgz", - "integrity": "sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + "node_modules/hash-base": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/hash-test-vectors": { + "version": "1.3.2", + "license": "MIT" + }, + "node_modules/hash.js": { + "version": "1.1.7", + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", + "node_modules/hasha": { + "version": "5.2.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", "bin": { - "testrpc-sc": "index.js" + "he": "bin/he" } }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "node_modules/header-case": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, + "no-case": "^2.2.0", + "upper-case": "^1.1.3" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "license": "BSD-3-Clause", "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/highlightjs-solidity": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "react-is": "^16.7.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "5.2.1", + "dev": true, + "license": "ISC", "dependencies": { - "brace-expansion": "^1.1.7" + "lru-cache": "^7.5.1" }, "engines": { - "node": "*" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" } }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "node_modules/http-basic": { + "version": "8.1.3", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "global-prefix": "^3.0.0" + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "peer": true, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=6" + "node": ">= 0.8" } }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/http-https": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/http-response-object": { + "version": "3.0.2", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "@types/node": "^10.0.3" } }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/http-response-object/node_modules/@types/node": { + "version": "10.17.60", "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "license": "MIT", "dependencies": { - "type-fest": "^0.20.2" + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" }, "engines": { - "node": ">=8" + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=10.19.0" } }, - "node_modules/globals/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, + "node_modules/http2-wrapper/node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", "engines": { "node": ">=10" }, @@ -10889,834 +10405,641 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "license": "MIT", "dependencies": { - "define-properties": "^1.1.3" + "agent-base": "6", + "debug": "4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/globalyzer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", - "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", - "dev": true - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "node_modules/human-signals": { + "version": "4.3.1", "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "license": "MIT", "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { - "node": ">=10" + "node": ">=0.10.0" + } + }, + "node_modules/idna-uts46-hx": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "punycode": "2.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4.0.0" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, + "node_modules/idna-uts46-hx/node_modules/punycode": { + "version": "2.1.0", + "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=6" } }, - "node_modules/globrex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", - "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", - "dev": true + "node_modules/ieee754": { + "version": "1.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node_modules/ignore": { + "version": "4.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "node_modules/immutable": { + "version": "4.3.0", + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" }, "engines": { - "node": ">=14.16" + "node": ">=6" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "node_modules/import-lazy": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=4.x" + "node": ">=8" } }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, + "license": "MIT", "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" + "node": ">=0.8.19" } }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", "dev": true, - "engines": { - "node": ">=6" - } + "license": "ISC", + "peer": true }, - "node_modules/hardhat": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.14.0.tgz", - "integrity": "sha512-73jsInY4zZahMSVFurSK+5TNCJTXMv+vemvGia0Ac34Mm19fYp6vEPVGF3sucbumszsYxiTT2TbS8Ii2dsDSoQ==", + "node_modules/ink": { + "version": "3.2.0", + "license": "MIT", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "abort-controller": "^3.0.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "qs": "^6.7.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" + "ansi-escapes": "^4.2.1", + "auto-bind": "4.0.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "indent-string": "^4.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.20", + "patch-console": "^1.0.0", + "react-devtools-core": "^4.19.1", + "react-reconciler": "^0.26.2", + "scheduler": "^0.20.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "stack-utils": "^2.0.2", + "string-width": "^4.2.2", + "type-fest": "^0.12.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "ws": "^7.5.5", + "yoga-layout-prebuilt": "^1.9.6" }, "engines": { - "node": ">=14.0.0" + "node": ">=10" }, "peerDependencies": { - "ts-node": "*", - "typescript": "*" + "@types/react": ">=16.8.0", + "react": ">=16.8.0" }, "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { + "@types/react": { "optional": true } } }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", - "dev": true, - "peer": true, + "node_modules/ink-spinner": { + "version": "4.0.3", + "license": "MIT", "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" + "cli-spinners": "^2.3.0" }, - "peerDependencies": { - "hardhat": "^2.0.2" - } - }, - "node_modules/hardhat-watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", - "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", - "dependencies": { - "chokidar": "^3.5.3" + "engines": { + "node": ">=10" }, "peerDependencies": { - "hardhat": "^2.0.0" - } - }, - "node_modules/hardhat/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "ink": ">=3.0.5", + "react": ">=16.8.2" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", + "node_modules/ink/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=14" - } - }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", + "node_modules/ink/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=14" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/ink/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", - "crc-32": "^1.2.0" + "node_modules/ink/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/ink/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "node_modules/ink/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">=8" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/ink/node_modules/type-fest": { + "version": "0.12.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "node_modules/ink/node_modules/ws": { + "version": "7.5.9", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" }, "engines": { - "node": ">=14" + "node": ">= 0.4" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/internmap": { + "version": "2.0.3", + "license": "ISC", + "engines": { + "node": ">=12" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", - "bin": { - "rlp": "bin/rlp" - }, + "node_modules/interpret": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=14" + "node": ">= 0.10" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" + "node_modules/invert-kv": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/io-ts": { + "version": "1.10.4", + "license": "MIT", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "fp-ts": "^1.0.0" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/is-array-buffer": { + "version": "3.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "dev": true, + "license": "MIT", "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "ethereum-cryptography": "0.1.3" + "has-bigints": "^1.0.1" }, - "engines": { - "node": ">=14" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", - "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "ethereum-cryptography": "0.1.3" + "node_modules/is-boolean-object": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=14" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "node_modules/is-buffer": { + "version": "2.0.5", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/is-callable": { + "version": "1.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", + "node_modules/is-ci": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "ci-info": "^2.0.0" }, - "engines": { - "node": ">=14" + "bin": { + "is-ci": "bin.js" } }, - "node_modules/hardhat/node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/is-core-module": { + "version": "2.12.1", + "license": "MIT", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "node_modules/is-date-object": { + "version": "1.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^5.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, + "node_modules/is-docker": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "is-docker": "cli.js" }, "engines": { - "node": ">= 14.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-function": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "license": "MIT", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "is-extglob": "^2.1.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/is-hex-prefixed": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=6.5.0", + "npm": ">=3" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "p-limit": "^3.0.2" + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" + "node_modules/is-lower-case": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.0" } }, - "node_modules/hardhat/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" + "node_modules/is-negative-zero": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "node_modules/is-number-object": { + "version": "1.0.7", + "dev": true, + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4.0" + "node": ">=8" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "node_modules/is-plain-obj": { + "version": "1.1.0", "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/is-regex": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "node_modules/is-stream": { + "version": "2.0.1", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "node_modules/is-string": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -11724,10 +11047,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "node_modules/is-symbol": { + "version": "1.0.4", + "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -11738,820 +11061,796 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "node_modules/is-typed-array": { + "version": "1.1.10", + "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" }, "engines": { - "node": ">=4" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hash-test-vectors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", - "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/is-upper-case": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.0" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } + "node_modules/is-utf8": { + "version": "0.2.1", + "license": "MIT" }, - "node_modules/header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "node_modules/is-weakref": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "node_modules/is-windows": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "engines": { - "node": "*" - } - }, - "node_modules/highlightjs-solidity": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", - "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "node": ">=0.10.0" } }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "node_modules/is-wsl": { + "version": "2.2.0", "dev": true, + "license": "MIT", "dependencies": { - "lru-cache": "^7.5.1" + "is-docker": "^2.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=8" } }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "node_modules/isarray": { + "version": "0.0.1", + "dev": true, + "license": "MIT" }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isstream": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" } }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" + "append-transform": "^2.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" }, "engines": { - "node": ">= 0.8" + "node": ">=8" } }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", "dev": true, - "peer": true, + "license": "ISC", "dependencies": { - "@types/node": "^10.0.3" + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", "dev": true, - "peer": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" + "node": ">=8" } }, - "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10.19.0" + "node": ">=8" } }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/istanbul-lib-report/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "6", - "debug": "4" + "has-flag": "^4.0.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" + "node": ">=8" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "node_modules/istanbul-reports": { + "version": "3.1.5", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "punycode": "2.1.0" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=4.0.0" + "node": ">=8" } }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "node_modules/jju": { + "version": "1.4.0", "dev": true, - "engines": { - "node": ">= 4" + "license": "MIT" + }, + "node_modules/js-graph-algorithms": { + "version": "1.0.18", + "license": "MIT", + "bin": { + "js-graphs": "src/jsgraphs.js" } }, - "node_modules/immutable": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "node_modules/js-sdsl": { + "version": "4.4.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "node_modules/js-sha3": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", "dev": true, + "license": "MIT", "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, + "node_modules/jsbi": { + "version": "3.2.5", + "license": "Apache-2.0" + }, + "node_modules/jsbn": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", "dev": true, - "engines": { - "node": ">=0.8.19" - } + "license": "MIT" }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } + "node_modules/json-schema": { + "version": "0.4.0", + "license": "(AFL-2.1 OR BSD-3-Clause)" }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/ink": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", - "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "auto-bind": "4.0.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.20", - "patch-console": "^1.0.0", - "react-devtools-core": "^4.19.1", - "react-reconciler": "^0.26.2", - "scheduler": "^0.20.2", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "stack-utils": "^2.0.2", - "string-width": "^4.2.2", - "type-fest": "^0.12.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "ws": "^7.5.5", - "yoga-layout-prebuilt": "^1.9.6" + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": ">=16.8.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } + "node": ">=6" } }, - "node_modules/ink-spinner": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", - "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", + "node_modules/jsonc-parser": { + "version": "3.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", "dependencies": { - "cli-spinners": "^2.3.0" - }, - "engines": { - "node": ">=10" + "universalify": "^2.0.0" }, - "peerDependencies": { - "ink": ">=3.0.5", - "react": ">=16.8.2" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/ink/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/jsonschema": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/ink/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/jsprim": { + "version": "1.4.2", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.6.0" } }, - "node_modules/ink/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/just-extend": { + "version": "4.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/keccak": { + "version": "3.0.3", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0", + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=10.0.0" } }, - "node_modules/ink/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/keyv": { + "version": "4.5.2", + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "json-buffer": "3.0.1" } }, - "node_modules/ink/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/khroma": { + "version": "2.0.0" }, - "node_modules/ink/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ink/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "node_modules/klaw": { + "version": "1.3.1", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.9" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/ink/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/layout-base": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/lcid": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "invert-kv": "^1.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/ink/node_modules/type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "node_modules/level": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "browser-level": "^1.0.1", + "classic-level": "^1.2.0" + }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/level" } }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, + "node_modules/level-supports": { + "version": "4.0.1", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, + "node_modules/level-transcoder": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "module-error": "^1.0.1" + }, "engines": { "node": ">=12" } }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "node_modules/levn": { + "version": "0.4.1", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, "engines": { - "node": ">= 0.10" + "node": ">= 0.8.0" } }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "node_modules/load-json-file": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "fp-ts": "^1.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "node_modules/load-json-file/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "node_modules/locate-path": { + "version": "2.0.0", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=4" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.assign": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "license": "MIT", + "peer": true }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "dev": true, + "license": "MIT" }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "node_modules/lodash.get": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "license": "MIT", "dependencies": { - "has-bigints": "^1.0.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=4" + "node": ">=7.0.0" } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", "dependencies": { - "ci-info": "^2.0.0" + "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { - "is-ci": "bin.js" + "loose-envify": "cli.js" } }, - "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "node_modules/loupe": { + "version": "2.3.6", + "license": "MIT", "dependencies": { - "has": "^1.0.3" + "get-func-name": "^2.0.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "lower-case": "^1.1.2" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "node_modules/lru_map": { + "version": "0.3.3", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lunr": { + "version": "2.3.9", + "dev": true, + "license": "MIT" + }, + "node_modules/make-dir": { + "version": "3.1.0", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "semver": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", "dev": true, + "license": "ISC", "bin": { - "is-docker": "cli.js" - }, + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "devOptional": true, + "license": "ISC" + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "node_modules/markdown-table": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/marked": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "bin": { + "marked": "bin/marked.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 12" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/mcl-wasm": { + "version": "0.7.9", + "license": "BSD-3-Clause", "engines": { - "node": ">=8" + "node": ">=8.9.0" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "node_modules/md5.js": { + "version": "1.3.5", + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.6" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/memory-level": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" + "abstract-level": "^1.0.0", + "functional-red-black-tree": "^1.0.1", + "module-error": "^1.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "node_modules/memorystream": { + "version": "0.3.1", "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "node": ">= 0.10.0" } }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "node_modules/meow": { + "version": "11.0.0", "dev": true, + "license": "MIT", "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" + "@types/minimist": "^1.2.2", + "camelcase-keys": "^8.0.2", + "decamelize": "^6.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^4.0.1", + "read-pkg-up": "^9.1.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^3.1.0", + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=14.16" @@ -12560,91 +11859,106 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "dependencies": { - "lower-case": "^1.1.0" + "node_modules/meow/node_modules/decamelize": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "node_modules/meow/node_modules/find-up": { + "version": "6.3.0", "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "engines": { - "node": ">=0.12.0" + "node": ">=10" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "node_modules/meow/node_modules/locate-path": { + "version": "7.2.0", "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "node_modules/meow/node_modules/p-limit": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "node_modules/meow/node_modules/p-locate": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/meow/node_modules/parse-json": { + "version": "5.2.0", "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, "engines": { "node": ">=8" }, @@ -12652,660 +11966,541 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "node_modules/meow/node_modules/path-exists": { + "version": "5.0.0", "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "node_modules/meow/node_modules/read-pkg": { + "version": "7.1.0", "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" }, "engines": { - "node": ">= 0.4" + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "node_modules/meow/node_modules/read-pkg-up": { + "version": "9.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" }, "engines": { - "node": ">= 0.4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "upper-case": "^1.1.0" + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" } }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "2.19.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "node_modules/meow/node_modules/type-fest": { + "version": "3.11.0", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=0.10.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, + "license": "ISC" + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "node_modules/meow/node_modules/yocto-queue": { + "version": "1.0.0", "dev": true, - "bin": { - "is-docker": "cli.js" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" }, - "node_modules/isexe": { + "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "dev": true, + "license": "MIT" }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "node_modules/merge2": { + "version": "1.4.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 8" } }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, + "node_modules/mermaid": { + "version": "10.1.0", + "license": "MIT", "dependencies": { - "append-transform": "^2.0.0" + "@braintree/sanitize-url": "^6.0.0", + "@khanacademy/simple-markdown": "^0.8.6", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "2.4.5", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { + "version": "0.8.6", + "license": "MIT", + "dependencies": { + "@types/react": ">=16.0.0" }, - "engines": { - "node": ">=8" + "peerDependencies": { + "react": "16.14.0", + "react-dom": "16.14.0" } }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, + "node_modules/mermaid/node_modules/react": { + "version": "16.14.0", + "license": "MIT", + "peer": true, "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/mermaid/node_modules/react-dom": { + "version": "16.14.0", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" + }, + "peerDependencies": { + "react": "^16.14.0" } }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, + "node_modules/mermaid/node_modules/scheduler": { + "version": "0.19.1", + "license": "MIT", + "peer": true, "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "node_modules/micromatch": { + "version": "4.0.5", "dev": true, + "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "mime-db": "1.52.0" }, "engines": { - "node": ">=10" + "node": ">= 0.6" } }, - "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "node_modules/mimic-fn": { + "version": "4.0.0", "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-graph-algorithms": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", - "integrity": "sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==", - "bin": { - "js-graphs": "src/jsgraphs.js" - } - }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", + "node": ">=12" + }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "node_modules/mimic-response": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/min-document": { + "version": "2.19.0", "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "dom-walk": "^0.1.0" } }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/jsbi": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", - "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "node_modules/min-indent": { + "version": "1.0.1", "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { + "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "license": "ISC" }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "license": "MIT" }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=6" + "node": "*" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "node_modules/minimist-options": { + "version": "4.1.0", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, "engines": { - "node": "*" + "node": ">= 6" } }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "node_modules/minipass": { + "version": "2.9.0", + "license": "ISC", "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, - "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "node_modules/minizlib": { + "version": "1.3.3", + "license": "MIT", + "dependencies": { + "minipass": "^2.9.0" + } }, - "node_modules/keccak": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", - "hasInstallScript": true, + "node_modules/mkdirp": { + "version": "0.5.6", + "license": "MIT", "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkdirp-promise": { + "version": "5.0.1", + "license": "ISC", + "dependencies": { + "mkdirp": "*" }, "engines": { - "node": ">=10.0.0" + "node": ">=4" } }, - "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "node_modules/mnemonist": { + "version": "0.38.5", + "license": "MIT", "dependencies": { - "json-buffer": "3.0.1" + "obliterator": "^2.0.0" + } + }, + "node_modules/mocha": { + "version": "9.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "node_modules/mocha/node_modules/debug": { + "version": "4.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true + "node_modules/mocha/node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "dev": true, + "license": "MIT" }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dependencies": { - "invert-kv": "^1.0.0" - }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=12" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", "dev": true, + "license": "ISC", "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", "dev": true, - "peer": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "p-limit": "^3.0.2" }, "engines": { "node": ">=10" @@ -13314,3169 +12509,2562 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/mock-fs": { + "version": "4.14.0", + "license": "MIT" + }, + "node_modules/module-error": { + "version": "1.0.2", + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">=10" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/multibase": { + "version": "0.6.1", + "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/multibase/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "node_modules/multicodec": { + "version": "0.5.7", + "license": "MIT", "dependencies": { - "get-func-name": "^2.0.0" + "varint": "^5.0.0" } }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "node_modules/multihashes": { + "version": "0.4.21", + "license": "MIT", "dependencies": { - "lower-case": "^1.1.2" + "buffer": "^5.5.0", + "multibase": "^0.7.0", + "varint": "^5.0.0" } }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/multihashes/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "node_modules/multihashes/node_modules/multibase": { + "version": "0.7.0", + "license": "MIT", "dependencies": { - "yallist": "^3.0.2" + "base-x": "^3.0.8", + "buffer": "^5.5.0" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "node_modules/nano-base32": { + "version": "1.0.1", + "license": "MIT" }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/nano-json-stream-parser": { + "version": "0.1.2", + "license": "MIT" }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "node_modules/nanoid": { + "version": "3.3.1", "dev": true, + "license": "MIT", "bin": { - "semver": "bin/semver.js" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "node_modules/napi-macros": { + "version": "2.2.2", + "license": "MIT" }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "node_modules/natural-compare": { + "version": "1.4.0", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", + "node_modules/natural-compare-lite": { + "version": "1.4.0", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, + "node_modules/ndjson": { + "version": "2.0.0", + "license": "BSD-3-Clause", + "dependencies": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.5", + "readable-stream": "^3.6.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, "bin": { - "marked": "bin/marked.js" + "ndjson": "cli.js" }, "engines": { - "node": ">= 12" + "node": ">=10" } }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", "engines": { - "node": ">=8.9.0" + "node": ">= 0.6" } }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT", + "peer": true }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } + "node_modules/next-tick": { + "version": "1.1.0", + "license": "ISC" }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "node_modules/nise": { + "version": "5.1.4", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" } }, - "node_modules/meow": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", - "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^8.0.2", - "decamelize": "^6.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^4.0.1", - "read-pkg-up": "^9.1.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^3.1.0", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type-detect": "4.0.8" } }, - "node_modules/meow/node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "10.2.0", "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/meow/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "3.0.0", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type-detect": "4.0.8" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, + "node_modules/no-case": { + "version": "2.3.2", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" + "lower-case": "^1.1.1" } }, - "node_modules/meow/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/node-addon-api": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/node-emoji": { + "version": "1.11.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "lodash": "^4.17.21" } }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/node-environment-flags": { + "version": "1.0.6", "dev": true, + "license": "Apache-2.0", + "peer": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" } }, - "node_modules/meow/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/node-environment-flags/node_modules/semver": { + "version": "5.7.1", "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "ISC", + "peer": true, + "bin": { + "semver": "bin/semver" } }, - "node_modules/meow/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, + "node_modules/node-fetch": { + "version": "2.6.11", + "license": "MIT", "dependencies": { - "p-limit": "^4.0.0" + "whatwg-url": "^5.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "4.x || >=6.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } } }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/node-gyp-build": { + "version": "4.6.0", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" + "process-on-spawn": "^1.0.0" }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "node_modules/node-releases": { + "version": "2.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/nofilter": { + "version": "3.1.0", "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=12.19" } }, - "node_modules/meow/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/nopt": { + "version": "3.0.6", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" + "abbrev": "1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "nopt": "bin/nopt.js" } }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", + "node_modules/normalize-package-data": { + "version": "4.0.1", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" + "hosted-git-info": "^5.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, + "node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", "engines": { "node": ">=10" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.8.0.tgz", - "integrity": "sha512-FVNSzGQz9Th+/9R6Lvv7WIAkstylfHN2/JYxkyhhmKFYh9At2DST8t6L6Lref9eYO8PXFTfG9Sg1Agg0K3vq3Q==", + "node_modules/npm-run-path": { + "version": "5.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, "engines": { - "node": ">=14.16" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/yallist": { + "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" - } - }, - "node_modules/meow/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", - "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", - "dev": true, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.9", - "dayjs": "^1.11.7", - "dompurify": "2.4.3", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "node_modules/number-is-nan": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">=0.10.0" } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, + "node_modules/number-to-bn": { + "version": "1.7.0", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" + "bn.js": "4.11.6", + "strip-hex-prefix": "1.0.0" }, "engines": { - "node": ">=4" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } + "node_modules/number-to-bn/node_modules/bn.js": { + "version": "4.11.6", + "license": "MIT" }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "node_modules/nyc": { + "version": "15.1.0", + "dev": true, + "license": "ISC", "dependencies": { - "mime-db": "1.52.0" + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" + "bin": { + "nyc": "bin/nyc.js" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { - "node": ">=4" + "node": ">=8.9" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "dev": true, + "license": "ISC", "dependencies": { - "dom-walk": "^0.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" } }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/minimist-options": { + "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "p-limit": "^2.2.0" }, "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dependencies": { - "minipass": "^2.9.0" + "node": ">=8" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "aggregate-error": "^3.0.0" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=8" } }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dependencies": { - "mkdirp": "*" - }, + "node_modules/nyc/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dependencies": { - "obliterator": "^2.0.0" + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, + "license": "MIT", "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=8" } }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "ISC" }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=8" } }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", "dev": true, + "license": "ISC", "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "license": "Apache-2.0", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "*" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/mocha/node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "node_modules/object-hash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">= 0.4" } }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "node_modules/object.assign": { + "version": "4.1.4", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^0.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "p-limit": "^3.0.2" + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/object.values": { + "version": "1.1.6", "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, "engines": { - "node": ">=8" - } - }, - "node_modules/mocha/node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" - }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } + "node_modules/obliterator": { + "version": "2.0.4", + "license": "MIT" }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/oboe": { + "version": "2.1.5", + "license": "BSD", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "http-https": "^1.0.0" } }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", "dependencies": { - "varint": "^5.0.0" + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" + "wrappy": "1" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "node_modules/open": { + "version": "9.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/nano-base32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", - "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" }, "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/ndjson": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "node_modules/open-cli": { + "version": "7.2.0", + "dev": true, + "license": "MIT", "dependencies": { - "json-stringify-safe": "^5.0.1", - "minimist": "^1.2.5", - "readable-stream": "^3.6.0", - "split2": "^3.0.0", - "through2": "^4.0.0" + "file-type": "^18.2.1", + "get-stdin": "^9.0.0", + "meow": "^11.0.0", + "open": "^9.0.0", + "tempy": "^3.0.0" }, "bin": { - "ndjson": "cli.js" + "open-cli": "cli.js" }, "engines": { - "node": ">=10" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "node_modules/optionator": { + "version": "0.9.1", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", - "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "node_modules/ordinal": { + "version": "1.0.3", "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0" - } - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "license": "MIT", + "peer": true }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, + "node_modules/os-locale": { + "version": "1.4.0", + "license": "MIT", "dependencies": { - "lodash": "^4.17.21" + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "peer": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" + "node_modules/os-tmpdir": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" } }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "peer": true, - "bin": { - "semver": "bin/semver" + "node_modules/p-cancelable": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12.20" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "node_modules/p-limit": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "whatwg-url": "^5.0.0" + "p-try": "^1.0.0" }, "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "node": ">=4" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" + "node_modules/p-locate": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", "dependencies": { - "process-on-spawn": "^1.0.0" + "aggregate-error": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "node_modules/p-try": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "node_modules/package-hash": { + "version": "4.0.0", "dev": true, - "peer": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, "engines": { - "node": ">=12.19" + "node": ">=8" } }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", - "dev": true + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "peer": true, + "node_modules/param-case": { + "version": "2.1.1", + "license": "MIT", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "no-case": "^2.2.0" } }, - "node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "node_modules/parent-module": { + "version": "1.0.1", "dev": true, + "license": "MIT", "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "callsites": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=6" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } + "node_modules/parse-cache-control": { + "version": "1.0.1", + "dev": true, + "peer": true }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/parse-headers": { + "version": "2.0.5", + "license": "MIT" }, - "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "node_modules/parse-json": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^4.0.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" + "node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "domhandler": "^5.0.2", + "parse5": "^7.0.0" }, "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "node_modules/pascal-case": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" + "camel-case": "^3.0.0", + "upper-case-first": "^1.1.0" } }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "node_modules/patch-console": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + } }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, + "node_modules/path-case": { + "version": "2.1.1", + "license": "MIT", "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, + "no-case": "^2.2.0" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", "engines": { - "node": ">=8.9" + "node": ">=4" } }, - "node_modules/nyc/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/path-key": { + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", "dev": true, + "license": "MIT", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "isarray": "0.0.1" } }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/path-type": { + "version": "4.0.0", "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, + "node_modules/pathval": { + "version": "1.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, + "node_modules/pbkdf2": { + "version": "3.1.2", + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" }, "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.12" } }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "node_modules/peek-readable": { + "version": "5.0.0", "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "node_modules/performance-now": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.0", "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/nyc/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/pify": { + "version": "3.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, + "node_modules/pinkie": { + "version": "2.0.4", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/nyc/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/pkg-dir": { + "version": "4.2.0", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "p-try": "^2.0.0" }, "engines": { "node": ">=6" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, "engines": { - "node": ">= 0.4" + "node": ">=8" } }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "node_modules/pkg-dir/node_modules/p-try": { + "version": "2.2.0", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.5.tgz", - "integrity": "sha512-yDNzckpM6ntyQiGTik1fKV1DcVDRS+w8bvpWNCBanvH5LfRX9O8WTHqQzG4RZwRAM4I0oU7TV11Lj5v0g20ibw==", + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", "dev": true, - "peer": true, - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, + "license": "MIT", "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=8" } }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "node_modules/pkg-up": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "find-up": "^2.1.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dependencies": { - "http-https": "^1.0.0" + "node": ">=4" } }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/postcss": { + "version": "8.4.24", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "dependencies": { - "ee-first": "1.1.1" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { - "node": ">= 0.8" + "node": "^10 || ^12 || >=14" } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "node_modules/prelude-ls": { + "version": "1.2.1", "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, + "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/open-cli": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", - "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", + "node_modules/prettier": { + "version": "2.4.1", "dev": true, - "dependencies": { - "file-type": "^18.2.1", - "get-stdin": "^9.0.0", - "meow": "^11.0.0", - "open": "^9.0.0", - "tempy": "^3.0.0" - }, + "license": "MIT", "bin": { - "open-cli": "cli.js" + "prettier": "bin-prettier.js" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=10.13.0" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", "dev": true, + "license": "MIT", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "fast-diff": "^1.1.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">=6.0.0" } }, - "node_modules/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", + "node_modules/process": { + "version": "0.11.10", + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", "dev": true, + "license": "MIT", "peer": true }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "node_modules/process-on-spawn": { + "version": "1.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "lcid": "^1.0.0" + "fromentries": "^1.2.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.4.0" } }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" + "node_modules/promise": { + "version": "8.3.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "asap": "~2.0.6" } }, - "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", "dependencies": { - "p-try": "^1.0.0" + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" }, "engines": { - "node": ">=4" + "node": ">= 6" } }, - "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "peer": true, "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" } }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "license": "MIT", + "peer": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", "dependencies": { - "aggregate-error": "^3.0.0" + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.10" } }, - "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } + "node_modules/psl": { + "version": "1.9.0", + "license": "MIT" }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, + "node_modules/pump": { + "version": "3.0.0", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "node_modules/pure-rand": { + "version": "5.0.5", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "node_modules/purecss": { + "version": "2.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/qs": { + "version": "6.11.2", + "license": "BSD-3-Clause", "dependencies": { - "no-case": "^2.2.0" + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, + "node_modules/query-string": { + "version": "5.1.1", + "license": "MIT", "dependencies": { - "callsites": "^3.0.0" + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" }, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true, - "peer": true - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" }, - "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "node_modules/quick-lru": { + "version": "6.1.1", "dev": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">=4" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" + "node": ">=12" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "node_modules/ramda": { + "version": "0.27.2", + "dev": true, + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "safe-buffer": "^5.1.0" } }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 0.6" } }, - "node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/patch-console": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", - "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=10" + "node": ">= 0.8" } }, - "node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "safer-buffer": ">= 2.1.2 < 3" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/react": { + "version": "17.0.2", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, "engines": { "node": ">=0.10.0" } }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/react-devtools-core": { + "version": "4.27.8", + "license": "MIT", + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, + "node_modules/react-dom": { + "version": "18.2.0", + "license": "MIT", "dependencies": { - "isarray": "0.0.1" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" } }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.0", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" } }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } + "node_modules/react-is": { + "version": "18.2.0", + "license": "MIT", + "peer": true }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "node_modules/react-reconciler": { + "version": "0.26.2", + "license": "MIT", "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" }, "engines": { - "node": ">=0.12" + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^17.0.2" } }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", + "node_modules/react-refresh": { + "version": "0.14.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">=0.10.0" } }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "node_modules/react-router": { + "version": "6.11.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.6.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/react-router-dom": { + "version": "6.11.0", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.6.0", + "react-router": "6.11.0" + }, "engines": { - "node": ">=8.6" + "node": ">=14" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" } }, - "node_modules/pify": { + "node_modules/read-pkg": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, "engines": { "node": ">=4" } }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "node_modules/read-pkg-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "pinkie": "^2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", "dev": true, + "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "pify": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.1", "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 6" } }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "readable-stream": "^3.6.0" }, "engines": { - "node": ">=6" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=8" + "node": ">=8.10.0" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "node_modules/rechoir": { + "version": "0.6.2", "dev": true, + "peer": true, + "dependencies": { + "resolve": "^1.1.6" + }, "engines": { - "node": ">=6" + "node": ">= 0.10" } }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "node_modules/recursive-readdir": { + "version": "2.2.3", "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", + "node_modules/redent": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "find-up": "^2.1.0" + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "node_modules/redent/node_modules/indent-string": { + "version": "5.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "node_modules/reduce-flatten": { + "version": "2.0.0", "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, + "license": "MIT", + "peer": true, "engines": { - "node": ">=10.13.0" + "node": ">=6" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "license": "MIT" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", "dev": true, + "license": "MIT", "dependencies": { - "fast-diff": "^1.1.2" + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { - "node": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "node_modules/regexpp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.6.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "node_modules/process-on-spawn": { + "node_modules/release-zalgo": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, + "license": "ISC", "dependencies": { - "fromentries": "^1.2.0" + "es6-error": "^4.0.1" }, "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" + "node": ">=4" } }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "node_modules/req-cwd": { + "version": "2.0.0", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" + "req-from": "^2.0.0" }, "engines": { - "node": ">= 6" + "node": ">=4" } }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "node_modules/req-from": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" + "resolve-from": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=4" } }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { + "node_modules/req-from/node_modules/resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/purecss": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", - "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", - "dev": true - }, - "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "node_modules/request": { + "version": "2.88.2", + "license": "Apache-2.0", "dependencies": { - "side-channel": "^1.0.4" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "node_modules/request-promise-core": { + "version": "1.1.4", + "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "lodash": "^4.17.19" }, "engines": { "node": ">=0.10.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", - "dev": true, - "engines": { - "node": ">=12" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "request": "^2.34" } }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/request-promise-native": { + "version": "1.0.9", + "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "node": ">=0.12.0" }, + "peerDependencies": { + "request": "^2.34" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "license": "BSD-3-Clause", "engines": { - "node": ">= 0.8" + "node": ">=0.6" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "license": "MIT", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/react": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/react-devtools-core": { - "version": "4.27.5", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.5.tgz", - "integrity": "sha512-QJTriF1V4oyIenViCvM6qQuvcevQsp0sbKkHBZIQOij+AwY9DdOBY+dOeuymUqO5zV61CbmGxWsAIjeWlFS++w==", - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } + "node_modules/require-main-filename": { + "version": "2.0.0", + "dev": true, + "license": "ISC" }, - "node_modules/react-reconciler": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", - "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", + "node_modules/resolve": { + "version": "1.22.2", + "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" }, - "engines": { - "node": ">=0.10.0" + "bin": { + "resolve": "bin/resolve" }, - "peerDependencies": { - "react": "^17.0.2" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", "dev": true, - "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - }, + "license": "MIT", "engines": { "node": ">=4" } }, - "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "lowercase-keys": "^2.0.0" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node_modules/responselike/node_modules/lowercase-keys": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, + "node_modules/restore-cursor": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "pify": "^3.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">= 6" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-web-to-node-stream": { + "node_modules/reusify": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, + "license": "ISC", "dependencies": { - "readable-stream": "^3.6.0" + "glob": "^7.1.3" }, - "engines": { - "node": ">=8" + "bin": { + "rimraf": "bin.js" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/ripemd160": { + "version": "2.0.2", + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "peer": true, - "dependencies": { - "resolve": "^1.1.6" - }, + "node_modules/ripemd160-min": { + "version": "0.0.6", "engines": { - "node": ">= 0.10" + "node": ">=8" } }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, + "node_modules/rlp": { + "version": "2.2.7", + "license": "MPL-2.0", "dependencies": { - "minimatch": "^3.0.5" + "bn.js": "^5.2.0" }, - "engines": { - "node": ">=6.0.0" + "bin": { + "rlp": "bin/rlp" } }, - "node_modules/recursive-readdir/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/robust-predicates": { + "version": "3.0.2", + "license": "Unlicense" + }, + "node_modules/rollup": { + "version": "3.23.0", "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, - "node_modules/recursive-readdir/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/run-applescript": { + "version": "5.0.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "execa": "^5.0.0" }, "engines": { - "node": "*" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", "dev": true, + "license": "MIT", "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/redent/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=8" } }, - "node_modules/redent/node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", "dev": true, + "license": "MIT", "dependencies": { - "min-indent": "^1.0.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reduce-flatten": { + "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "peer": true, + "license": "MIT", "engines": { "node": ">=6" } }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "node_modules/run-parallel-limit": { + "version": "1.1.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rustbn.js": { + "version": "0.2.0", + "license": "(MIT OR Apache-2.0)" + }, + "node_modules/rw": { + "version": "1.3.3", + "license": "BSD-3-Clause" + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" }, "engines": { - "node": ">= 0.4" + "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } + "license": "MIT", + "peer": true }, - "node_modules/release-zalgo": { + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex-test": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, + "license": "MIT", "dependencies": { - "es6-error": "^4.0.1" + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sc-istanbul": { + "version": "0.4.6", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { - "req-from": "^2.0.0" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, - "engines": { - "node": ">=4" + "bin": { + "istanbul": "lib/cli.js" } }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", + "node_modules/sc-istanbul/node_modules/esprima": { + "version": "2.7.3", "dev": true, + "license": "BSD-2-Clause", "peer": true, - "dependencies": { - "resolve-from": "^3.0.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", + "node_modules/sc-istanbul/node_modules/glob": { + "version": "5.0.15", "dev": true, + "license": "ISC", "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "*" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "node_modules/sc-istanbul/node_modules/has-flag": { + "version": "1.0.0", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "lodash": "^4.17.19" - }, "engines": { "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" } }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", + "node_modules/sc-istanbul/node_modules/resolve": { + "version": "1.1.7", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/sc-istanbul/node_modules/supports-color": { + "version": "3.2.3", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - }, - "engines": { - "node": ">=0.12.0" + "has-flag": "^1.0.0" }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { - "node": ">=0.6" + "node": ">=0.8.0" } }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "node_modules/sc-istanbul/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, "bin": { - "uuid": "bin/uuid" + "which": "bin/which" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" + "node_modules/scheduler": { + "version": "0.20.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "node_modules/scrypt-js": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/secp256k1": { + "version": "4.0.3", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=10.0.0" } }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "node_modules/semver": { + "version": "7.3.8", + "dev": true, + "license": "ISC", "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "lru-cache": "^6.0.0" }, "bin": { - "resolve": "bin/resolve" + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=10" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/send": { + "version": "0.18.0", + "license": "MIT", "dependencies": { - "lowercase-keys": "^2.0.0" + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" + "ms": "2.0.0" } }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "no-case": "^2.2.0", + "upper-case-first": "^1.1.2" } }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/serialize-error": { + "version": "8.1.0", + "license": "MIT", "dependencies": { - "mimic-fn": "^2.1.0" + "type-fest": "^0.20.2" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, + "node_modules/serialize-error/node_modules/type-fest": { + "version": "0.20.2", + "license": "(MIT OR CC0-1.0)", "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "node_modules/serialize-javascript": { + "version": "6.0.0", + "license": "BSD-3-Clause", "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "randombytes": "^2.1.0" } }, - "node_modules/ripemd160-min": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", - "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", + "node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, "engines": { - "node": ">=8" + "node": ">= 0.8.0" } }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "node_modules/servify": { + "version": "0.1.12", + "license": "MIT", "dependencies": { - "bn.js": "^5.2.0" + "body-parser": "^1.16.0", + "cors": "^2.8.1", + "express": "^4.14.0", + "request": "^2.79.0", + "xhr": "^2.3.3" }, - "bin": { - "rlp": "bin/rlp" + "engines": { + "node": ">=6" } }, - "node_modules/robust-predicates": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", - "dev": true + "node_modules/set-blocking": { + "version": "2.0.0", + "license": "ISC" }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "sha.js": "bin.js" } }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "node_modules/sha1": { + "version": "1.1.1", "dev": true, + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "charenc": ">= 0.0.1", + "crypt": ">= 0.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": "*" } }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" + "node_modules/sha3": { + "version": "2.1.4", + "license": "MIT", + "dependencies": { + "buffer": "6.0.3" } }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "node_modules/shebang-command": { + "version": "2.0.0", "dev": true, + "license": "MIT", "dependencies": { - "path-key": "^3.0.0" + "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "node_modules/shebang-regex": { + "version": "3.0.0", "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, + "license": "MIT", "engines": { - "node": ">=6" - }, + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/shelljs": { + "version": "0.8.5", "dev": true, + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "node_modules/shiki": { + "version": "0.14.2", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], + "node_modules/side-channel": { + "version": "1.0.4", + "license": "MIT", "dependencies": { - "queue-microtask": "^1.2.2" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/rustbn.js": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "node_modules/simple-concat": { + "version": "1.0.1", "funding": [ { "type": "github", @@ -16490,4018 +15078,3858 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, + "node_modules/simple-get": { + "version": "2.8.2", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "decompress-response": "^3.3.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "peer": true, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "3.3.0", + "license": "MIT", "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" + "mimic-response": "^1.0.0" }, - "bin": { - "istanbul": "lib/cli.js" + "engines": { + "node": ">=4" } }, - "node_modules/sc-istanbul/node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "node_modules/sinon": { + "version": "12.0.1", "dev": true, - "peer": true + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.8.3", + "@sinonjs/fake-timers": "^8.1.0", + "@sinonjs/samsam": "^6.0.2", + "diff": "^5.0.0", + "nise": "^5.1.0", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } }, - "node_modules/sc-istanbul/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/sinon/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", + "node_modules/sinon/node_modules/supports-color": { + "version": "7.2.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "*" + "node": ">=8" } }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, + "node_modules/slice-ansi": { + "version": "3.0.0", + "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=8" } }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/sc-istanbul/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "color-name": "~1.1.4" }, "engines": { - "node": "*" + "node": ">=7.0.0" } }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true, - "peer": true + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "peer": true, + "node_modules/snake-case": { + "version": "2.1.0", + "license": "MIT", "dependencies": { - "has-flag": "^1.0.0" + "no-case": "^2.2.0" + } + }, + "node_modules/solc": { + "version": "0.7.3", + "license": "MIT", + "dependencies": { + "command-exists": "^1.2.8", + "commander": "3.0.2", + "follow-redirects": "^1.12.1", + "fs-extra": "^0.30.0", + "js-sha3": "0.8.0", + "memorystream": "^0.3.1", + "require-from-string": "^2.0.0", + "semver": "^5.5.0", + "tmp": "0.0.33" + }, + "bin": { + "solcjs": "solcjs" }, "engines": { - "node": ">=0.8.0" + "node": ">=8.0.0" } }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, + "node_modules/solc/node_modules/commander": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/solc/node_modules/fs-extra": { + "version": "0.30.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + } + }, + "node_modules/solc/node_modules/jsonfile": { + "version": "2.4.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/solc/node_modules/rimraf": { + "version": "2.7.1", + "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "glob": "^7.1.3" }, "bin": { - "which": "bin/which" + "rimraf": "bin.js" } }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "node_modules/solc/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" } }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, + "node_modules/solc/node_modules/tmp": { + "version": "0.0.33", + "license": "MIT", "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" + "os-tmpdir": "~1.0.2" }, "engines": { - "node": ">=10.0.0" + "node": ">=0.6.0" } }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/solidity-coverage": { + "version": "0.8.2", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "lru-cache": "^6.0.0" + "@ethersproject/abi": "^5.0.9", + "@solidity-parser/parser": "^0.14.1", + "chalk": "^2.4.2", + "death": "^1.1.0", + "detect-port": "^1.3.0", + "difflib": "^0.2.4", + "fs-extra": "^8.1.0", + "ghost-testrpc": "^0.0.2", + "global-modules": "^2.0.0", + "globby": "^10.0.1", + "jsonschema": "^1.2.4", + "lodash": "^4.17.15", + "mocha": "7.1.2", + "node-emoji": "^1.10.0", + "pify": "^4.0.1", + "recursive-readdir": "^2.2.2", + "sc-istanbul": "^0.4.5", + "semver": "^7.3.4", + "shelljs": "^0.8.3", + "web3-utils": "^1.3.6" }, "bin": { - "semver": "bin/semver.js" + "solidity-coverage": "plugins/bin.js" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "hardhat": "^2.11.0" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/solidity-coverage/node_modules/ansi-colors": { + "version": "3.2.3", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", + "peer": true, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, + "node_modules/solidity-coverage/node_modules/ansi-regex": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" + "node": ">=6" } }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "type-fest": "^0.20.2" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.2.0" }, "engines": { - "node": ">=10" + "node": ">= 8.10.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "optionalDependencies": { + "fsevents": "~2.1.1" } }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node_modules/solidity-coverage/node_modules/cliui": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "node_modules/solidity-coverage/node_modules/debug": { + "version": "3.2.6", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "randombytes": "^2.1.0" + "ms": "^2.1.1" } }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, + "node_modules/solidity-coverage/node_modules/diff": { + "version": "3.5.0", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, "engines": { - "node": ">= 0.8.0" + "node": ">=0.3.1" } }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "node_modules/solidity-coverage/node_modules/emoji-regex": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/find-up": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" + "locate-path": "^3.0.0" }, "engines": { "node": ">=6" } }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "node_modules/solidity-coverage/node_modules/flat": { + "version": "4.1.1", + "dev": true, + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "is-buffer": "~2.0.3" }, "bin": { - "sha.js": "bin.js" + "flat": "cli.js" } }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", + "node_modules/solidity-coverage/node_modules/fs-extra": { + "version": "8.1.0", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "*" + "node": ">=6 <7 || >=8" } }, - "node_modules/sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "node_modules/solidity-coverage/node_modules/fsevents": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/glob": { + "version": "7.1.3", + "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "buffer": "6.0.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "node_modules/solidity-coverage/node_modules/globby": { + "version": "10.0.2", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "shebang-regex": "^3.0.0" + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" }, "engines": { "node": ">=8" } }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "node_modules/solidity-coverage/node_modules/ignore": { + "version": "5.2.4", "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 4" } }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, "engines": { "node": ">=4" } }, - "node_modules/shiki": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", - "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", + "node_modules/solidity-coverage/node_modules/js-yaml": { + "version": "3.13.1", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" + "node_modules/solidity-coverage/node_modules/jsonfile": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "node_modules/solidity-coverage/node_modules/locate-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "mimic-response": "^1.0.0" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=4" + "node": ">=6" } }, - "node_modules/sinon": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", - "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", + "node_modules/solidity-coverage/node_modules/log-symbols": { + "version": "3.0.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@sinonjs/commons": "^1.8.3", - "@sinonjs/fake-timers": "^8.1.0", - "@sinonjs/samsam": "^6.0.2", - "diff": "^5.0.0", - "nise": "^5.1.0", - "supports-color": "^7.2.0" + "chalk": "^2.4.2" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "engines": { + "node": ">=8" } }, - "node_modules/sinon/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "3.0.4", "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=8" + "node": "*" } }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "node_modules/solidity-coverage/node_modules/mkdirp": { + "version": "0.5.5", "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "license": "MIT", + "peer": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "minimist": "^1.2.5" }, - "engines": { - "node": ">=8" + "bin": { + "mkdirp": "bin/cmd.js" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "color-convert": "^2.0.1" + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "chokidar": "3.3.0", + "debug": "3.2.6", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "3.0.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.5", + "ms": "2.1.1", + "node-environment-flags": "1.0.6", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" }, "engines": { - "node": ">=8" + "node": ">= 8.10.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/solidity-coverage/node_modules/ms": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/object.assign": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "color-name": "~1.1.4" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" }, "engines": { - "node": ">=7.0.0" + "node": ">= 0.4" } }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "no-case": "^2.2.0" + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" + "node_modules/solidity-coverage/node_modules/p-locate": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "p-limit": "^2.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=6" } }, - "node_modules/solc/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "node_modules/solidity-coverage/node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/solidity-coverage/node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6" } }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "node_modules/solidity-coverage/node_modules/readdirp": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "glob": "^7.1.3" + "picomatch": "^2.0.4" }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">= 8" } }, - "node_modules/solc/node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "node_modules/solidity-coverage/node_modules/string-width": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "os-tmpdir": "~1.0.2" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "engines": { - "node": ">=0.6.0" + "node": ">=6" } }, - "node_modules/solidity-coverage": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", - "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", + "node_modules/solidity-coverage/node_modules/strip-ansi": { + "version": "5.2.0", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", - "chalk": "^2.4.2", - "death": "^1.1.0", - "detect-port": "^1.3.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "7.1.2", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" + "ansi-regex": "^4.1.0" }, - "peerDependencies": { - "hardhat": "^2.11.0" + "engines": { + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", + "node_modules/solidity-coverage/node_modules/strip-json-comments": { + "version": "2.0.1", "dev": true, + "license": "MIT", "peer": true, "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "6.0.0", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", "dev": true, + "license": "MIT", "peer": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/solidity-coverage/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/solidity-coverage/node_modules/which": { + "version": "1.3.1", "dev": true, + "license": "ISC", "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" } }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", + "node_modules/solidity-coverage/node_modules/wrap-ansi": { + "version": "5.1.0", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "node_modules/solidity-coverage/node_modules/y18n": { + "version": "4.0.3", + "dev": true, + "license": "ISC", + "peer": true + }, + "node_modules/solidity-coverage/node_modules/yargs": { + "version": "13.3.2", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "node_modules/solidity-coverage/node_modules/yargs-parser": { + "version": "13.1.2", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "ms": "^2.1.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "node_modules/solidity-coverage/node_modules/yargs-unparser": { + "version": "1.6.0", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, "engines": { - "node": ">=0.3.1" + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true, - "peer": true + "node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } }, - "node_modules/solidity-coverage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "node_modules/source-map-js": { + "version": "1.0.2", "dev": true, - "peer": true, + "license": "BSD-3-Clause", "engines": { - "node": ">=0.8.0" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "peer": true, + "node_modules/spdx-correct": { + "version": "3.2.0", + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "license": "CC0-1.0" + }, + "node_modules/split2": { + "version": "3.2.2", + "license": "ISC", "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" + "readable-stream": "^3.0.0" } }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", + "node_modules/sprintf-js": { + "version": "1.0.3", "dev": true, - "peer": true, + "license": "BSD-3-Clause" + }, + "node_modules/sshpk": { + "version": "1.17.0", + "license": "MIT", "dependencies": { - "is-buffer": "~2.0.3" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" }, "bin": { - "flat": "cli.js" + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, + "node_modules/sshpk/node_modules/tweetnacl": { + "version": "0.14.5", + "license": "Unlicense" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "escape-string-regexp": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "peer": true, + "node_modules/stacktrace-parser": { + "version": "0.1.10", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "type-fest": "^0.7.1" }, "engines": { - "node": "*" + "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.8" } }, - "node_modules/solidity-coverage/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "node_modules/stealthy-require": { + "version": "1.1.1", "dev": true, + "license": "ISC", "peer": true, "engines": { - "node": ">= 4" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, + "node_modules/streamsearch": { + "version": "1.1.0", "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": ">=10.0.0" } }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=0.10.0" } }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "peer": true, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", "dependencies": { - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.2.0" } }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">=0.6.19" } }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "node_modules/string-format": { + "version": "2.0.0", "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } + "license": "WTFPL OR MIT", + "peer": true }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", - "dev": true, - "peer": true, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "node_modules/string.prototype.trim": { + "version": "1.2.7", "dev": true, - "peer": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "node_modules/string.prototype.trimend": { + "version": "1.0.6", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "p-limit": "^2.0.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/solidity-coverage/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "peer": true, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "node_modules/strip-bom": { + "version": "4.0.0", "dev": true, - "peer": true, + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", + "node_modules/strip-final-newline": { + "version": "3.0.0", "dev": true, - "peer": true, - "dependencies": { - "picomatch": "^2.0.4" - }, + "license": "MIT", "engines": { - "node": ">= 8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "peer": true, + "node_modules/strip-hex-prefix": { + "version": "1.0.0", + "license": "MIT", "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "is-hex-prefixed": "1.0.0" }, "engines": { - "node": ">=6" + "node": ">=6.5.0", + "npm": ">=3" } }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "node_modules/strip-indent": { + "version": "4.0.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "min-indent": "^1.0.1" }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "dev": true, - "peer": true, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "node_modules/strtok3": { + "version": "7.0.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" + "node": ">=14.16" }, - "bin": { - "which": "bin/which" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/solidity-coverage/node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "peer": true, + "node_modules/styled-components": { + "version": "5.3.10", + "license": "MIT", "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "@babel/helper-module-imports": "^7.0.0", + "@babel/traverse": "^7.4.5", + "@emotion/is-prop-valid": "^1.1.0", + "@emotion/stylis": "^0.8.4", + "@emotion/unitless": "^0.7.4", + "babel-plugin-styled-components": ">= 1.12.0", + "css-to-react-native": "^3.0.0", + "hoist-non-react-statics": "^3.0.0", + "shallowequal": "^1.1.0", + "supports-color": "^5.5.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "peer": true, - "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0", + "react-is": ">= 16.8.0" } }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } + "node_modules/stylis": { + "version": "4.2.0", + "license": "MIT" }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "peer": true, + "node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=6" + "node": ">=4" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "node_modules/swap-case": { + "version": "1.1.2", + "license": "MIT", "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "lower-case": "^1.1.1", + "upper-case": "^1.1.1" } }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, + "node_modules/swarm-js": { + "version": "0.1.42", + "license": "MIT", "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" + "bluebird": "^3.5.0", + "buffer": "^5.0.5", + "eth-lib": "^0.1.26", + "fs-extra": "^4.0.2", + "got": "^11.8.5", + "mime-types": "^2.1.16", + "mkdirp-promise": "^5.0.1", + "mock-fs": "^4.1.0", + "setimmediate": "^1.0.5", + "tar": "^4.0.2", + "xhr-request": "^1.0.1" } }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "license": "MIT", "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "node_modules/swarm-js/node_modules/buffer": { + "version": "5.7.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "node_modules/swarm-js/node_modules/cacheable-lookup": { + "version": "5.0.4", + "license": "MIT", + "engines": { + "node": ">=10.6.0" + } }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "node_modules/swarm-js/node_modules/fs-extra": { + "version": "4.0.3", + "license": "MIT", "dependencies": { - "readable-stream": "^3.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "node_modules/swarm-js/node_modules/got": { + "version": "11.8.6", + "license": "MIT", "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" } }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/swarm-js/node_modules/http2-wrapper": { + "version": "1.0.3", + "license": "MIT", "dependencies": { - "escape-string-regexp": "^2.0.0" + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=10.19.0" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { + "node_modules/swarm-js/node_modules/jsonfile": { + "version": "4.0.0", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dependencies": { - "type-fest": "^0.7.1" - }, + "node_modules/swarm-js/node_modules/p-cancelable": { + "version": "2.1.1", + "license": "MIT", "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "node_modules/swarm-js/node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/swarm-js/node_modules/universalify": { + "version": "0.1.2", + "license": "MIT", "engines": { - "node": ">= 0.8" + "node": ">= 4.0.0" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", + "node_modules/sync-request": { + "version": "6.1.0", "dev": true, + "license": "MIT", "peer": true, + "dependencies": { + "http-response-object": "^3.0.1", + "sync-rpc": "^1.2.1", + "then-request": "^6.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" + "node_modules/sync-rpc": { + "version": "1.3.6", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "get-port": "^3.1.0" } }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "node_modules/synckit": { + "version": "0.8.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "node_modules/synckit/node_modules/tslib": { + "version": "2.5.2", + "dev": true, + "license": "0BSD" + }, + "node_modules/table": { + "version": "6.8.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "safe-buffer": "~5.2.0" + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" } }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "node_modules/table-layout": { + "version": "1.0.2", "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "array-back": "^4.0.1", + "deep-extend": "~0.6.0", + "typical": "^5.2.0", + "wordwrapjs": "^4.0.0" + }, "engines": { - "node": ">=0.6.19" + "node": ">=8.0.0" } }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", + "node_modules/table-layout/node_modules/array-back": { + "version": "4.0.2", "dev": true, - "peer": true + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } }, - "node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "node_modules/table-layout/node_modules/typical": { + "version": "5.2.0", "dev": true, + "license": "MIT", "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "dev": true, + "license": "MIT", "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=4" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/string-width/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "node_modules/table/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, - "peer": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "node_modules/table/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "color-name": "~1.1.4" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=7.0.0" } }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "node_modules/table/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "node_modules/tapable": { + "version": "2.2.1", "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "license": "MIT", + "engines": { + "node": ">=6" } }, - "node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "node_modules/tar": { + "version": "4.4.19", + "license": "ISC", "dependencies": { - "ansi-regex": "^3.0.0" + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" }, "engines": { - "node": ">=4" + "node": ">=4.5" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "node_modules/tar/node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/temp-dir": { + "version": "2.0.0", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/strip-final-newline": { + "node_modules/tempy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^3.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^2.12.2", + "unique-string": "^3.0.0" + }, "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "node_modules/tempy/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "node_modules/tempy/node_modules/type-fest": { + "version": "2.19.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", + "node_modules/test-exclude": { + "version": "6.0.0", "dev": true, + "license": "ISC", "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">=8" } }, - "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", - "dev": true + "node_modules/testrpc": { + "version": "0.0.1" }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/then-request": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "@types/concat-stream": "^1.6.0", + "@types/form-data": "0.0.33", + "@types/node": "^8.0.0", + "@types/qs": "^6.2.31", + "caseless": "~0.12.0", + "concat-stream": "^1.6.0", + "form-data": "^2.2.0", + "http-basic": "^8.1.1", + "http-response-object": "^3.0.1", + "promise": "^8.0.0", + "qs": "^6.4.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=6.0.0" } }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "node_modules/then-request/node_modules/@types/node": { + "version": "8.10.66", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/through2": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/timed-out": { + "version": "4.0.1", + "license": "MIT", "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=0.10.0" } }, - "node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "node_modules/tiny-invariant": { + "version": "1.3.1", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/title-case": { + "version": "2.1.1", + "license": "MIT", "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" + "no-case": "^2.2.0", + "upper-case": "^1.0.3" } }, - "node_modules/swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" + "node_modules/titleize": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/tmp": { + "version": "0.2.1", + "dev": true, + "license": "MIT", "dependencies": { - "defer-to-connect": "^2.0.0" + "rimraf": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=8.17.0" } }, - "node_modules/swarm-js/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" } }, - "node_modules/swarm-js/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, "engines": { - "node": ">=10.6.0" + "node": ">=8.0" } }, - "node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "node_modules/toformat": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" } }, - "node_modules/swarm-js/node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "node_modules/token-types": { + "version": "5.0.1", + "dev": true, + "license": "MIT", "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" }, "engines": { - "node": ">=10.19.0" + "node": ">=14.16" }, "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/swarm-js/node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "node_modules/tough-cookie": { + "version": "2.5.0", + "license": "BSD-3-Clause", "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" + "node": ">=0.8" } }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } + "node_modules/tr46": { + "version": "0.0.3", + "license": "MIT" }, - "node_modules/swarm-js/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "node_modules/trim-newlines": { + "version": "4.1.1", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", + "node_modules/ts-command-line-args": { + "version": "2.5.0", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" + "@morgan-stanley/ts-mocking-bird": "^0.6.2", + "chalk": "^4.1.0", + "command-line-args": "^5.1.1", + "command-line-usage": "^6.1.0", + "string-format": "^2.0.0" }, - "engines": { - "node": ">=8.0.0" + "bin": { + "write-markdown": "dist/write-markdown.js" } }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", + "node_modules/ts-command-line-args/node_modules/ansi-styles": { + "version": "4.3.0", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "color-convert": "^2.0.1" }, "engines": { - "node": "^14.18.0 || >=16.0.0" + "node": ">=8" }, "funding": { - "url": "https://opencollective.com/unts" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "node_modules/ts-command-line-args/node_modules/chalk": { + "version": "4.1.2", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", + "node_modules/ts-command-line-args/node_modules/color-convert": { + "version": "2.0.1", "dev": true, + "license": "MIT", "peer": true, "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=7.0.0" } }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", + "node_modules/ts-command-line-args/node_modules/color-name": { + "version": "1.1.4", "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } + "license": "MIT", + "peer": true }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", + "node_modules/ts-command-line-args/node_modules/has-flag": { + "version": "4.0.0", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "node_modules/ts-command-line-args/node_modules/supports-color": { + "version": "7.2.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "has-flag": "^4.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "engines": { + "node": ">=8" } }, - "node_modules/table/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, + "node_modules/ts-dedent": { + "version": "2.2.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6.10" } }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ts-essentials": { + "version": "7.0.3", "dev": true, + "license": "MIT", + "peer": true, + "peerDependencies": { + "typescript": ">=3.7.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "devOptional": true, + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" }, - "engines": { - "node": ">=8" + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } } }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.2", + "devOptional": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" }, "engines": { - "node": ">=7.0.0" + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" } }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/tsconfig-paths": { + "version": "3.14.2", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/table/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "minimist": "^1.2.0" }, - "engines": { - "node": ">=8" + "bin": { + "json5": "lib/cli.js" } }, - "node_modules/table/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "node_modules/tslib": { + "version": "1.14.1", + "license": "0BSD" + }, + "node_modules/tsort": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/tsutils": { + "version": "3.21.0", "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, "engines": { - "node": ">=6" + "node": ">= 6" + }, + "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" } }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "node_modules/tunnel-agent": { + "version": "0.6.0", + "license": "Apache-2.0", "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" + "safe-buffer": "^5.0.1" }, "engines": { - "node": ">=4.5" + "node": "*" } }, - "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", - "dev": true, - "engines": { - "node": ">=8" - } + "node_modules/tweetnacl": { + "version": "1.0.3", + "license": "Unlicense" }, - "node_modules/tempy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", + "node_modules/tweetnacl-util": { + "version": "0.15.1", + "license": "Unlicense" + }, + "node_modules/type": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/type-check": { + "version": "0.4.0", "dev": true, + "license": "MIT", "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" + "prelude-ls": "^1.2.1" }, "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8.0" } }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, + "node_modules/type-detect": { + "version": "4.0.8", + "license": "MIT", "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, + "node_modules/type-fest": { + "version": "0.21.3", + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12.20" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "media-typer": "0.3.0", + "mime-types": "~2.1.24" }, "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/typechain": { + "version": "8.2.0", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@types/prettier": "^2.1.1", + "debug": "^4.3.1", + "fs-extra": "^7.0.0", + "glob": "7.1.7", + "js-sha3": "^0.8.0", + "lodash": "^4.17.15", + "mkdirp": "^1.0.4", + "prettier": "^2.3.1", + "ts-command-line-args": "^2.2.0", + "ts-essentials": "^7.0.1" + }, + "bin": { + "typechain": "dist/cli/cli.js" + }, + "peerDependencies": { + "typescript": ">=4.3.0" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/typechain/node_modules/fs-extra": { + "version": "7.0.1", "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": "*" + "node": ">=6 <7 || >=8" } }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", + "node_modules/typechain/node_modules/glob": { + "version": "7.1.7", "dev": true, + "license": "ISC", "peer": true, "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", + "node_modules/typechain/node_modules/jsonfile": { + "version": "4.0.0", "dev": true, - "peer": true - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/tiny-glob": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", - "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "node_modules/typechain/node_modules/mkdirp": { + "version": "1.0.4", "dev": true, - "dependencies": { - "globalyzer": "0.1.0", - "globrex": "^0.1.2" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, - "node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" + "license": "MIT", + "peer": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" } }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "node_modules/typechain/node_modules/universalify": { + "version": "0.1.2", "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 4.0.0" } }, - "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "node_modules/typed-array-length": { + "version": "1.0.4", "dev": true, + "license": "MIT", "dependencies": { - "rimraf": "^3.0.0" + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" }, - "engines": { - "node": ">=8.17.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/typedarray": { + "version": "0.0.6", "dev": true, - "engines": { - "node": ">=4" + "license": "MIT", + "peer": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/typedoc": { + "version": "0.23.28", + "dev": true, + "license": "Apache-2.0", "dependencies": { - "is-number": "^7.0.0" + "lunr": "^2.3.9", + "marked": "^4.2.12", + "minimatch": "^7.1.3", + "shiki": "^0.14.1" + }, + "bin": { + "typedoc": "bin/typedoc" }, "engines": { - "node": ">=8.0" + "node": ">= 14.14" + }, + "peerDependencies": { + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" } }, - "node_modules/toformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", - "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" + "node_modules/typedoc/node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", + "node_modules/typedoc/node_modules/minimatch": { + "version": "7.4.6", "dev": true, + "license": "ISC", "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=14.16" + "node": ">=10" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" + "node_modules/typescript": { + "version": "4.9.5", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">=0.8" + "node": ">=4.2.0" } }, - "node_modules/tough-cookie/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/typical": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "node_modules/uglify-js": { + "version": "3.17.4", "dev": true, - "engines": { - "node": ">=12" + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "bin": { + "uglifyjs": "bin/uglifyjs" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.8.0" } }, - "node_modules/ts-command-line-args": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.0.tgz", - "integrity": "sha512-Ff7Xt04WWCjj/cmPO9eWTJX3qpBZWuPWyQYG1vnxJao+alWWYjwJBc5aYz3h5p5dE08A6AnpkgiCtP/0KXXBYw==", + "node_modules/ultron": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@morgan-stanley/ts-mocking-bird": "^0.6.2", - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" }, - "bin": { - "write-markdown": "dist/write-markdown.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "peer": true, + "node_modules/underscore": { + "version": "1.13.6", + "license": "MIT" + }, + "node_modules/undici": { + "version": "5.22.1", + "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "busboy": "^1.6.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=14.0" } }, - "node_modules/ts-command-line-args/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/unique-string": { + "version": "3.0.0", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "crypto-random-string": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "node_modules/universalify": { + "version": "2.0.0", + "license": "MIT", "engines": { - "node": ">=7.0.0" + "node": ">= 10.0.0" } }, - "node_modules/ts-command-line-args/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "node_modules/untildify": { + "version": "4.0.0", "dev": true, + "license": "MIT", "engines": { - "node": ">=6.10" + "node": ">=8" } }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", + "node_modules/update-browserslist-db": { + "version": "1.0.11", "dev": true, - "peer": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "devOptional": true, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, "bin": { - "acorn": "bin/acorn" + "update-browserslist-db": "cli.js" }, - "engines": { - "node": ">=0.4.0" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "engines": { - "node": ">=0.3.1" + "node_modules/upper-case": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "license": "MIT", + "dependencies": { + "upper-case": "^1.1.1" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "punycode": "^2.1.0" } }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, + "node_modules/url-set-query": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "hasInstallScript": true, + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "node-gyp-build": "^4.3.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=6.14.2" } }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { + "node_modules/utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "node_modules/util": { + "version": "0.12.5", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", "engines": { - "node": ">= 6" - }, - "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" + "node": ">= 0.4.0" } }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v3-periphery-1_3_0": { + "name": "@uniswap/v3-periphery", + "version": "1.3.0", + "license": "GPL-2.0-or-later", "dependencies": { - "safe-buffer": "^5.0.1" + "@openzeppelin/contracts": "3.4.1-solc-0.7-2", + "@uniswap/lib": "^4.0.1-alpha", + "@uniswap/v2-core": "1.0.1", + "@uniswap/v3-core": "1.0.0", + "base64-sol": "1.0.1", + "hardhat-watcher": "^2.1.1" }, "engines": { - "node": "*" + "node": ">=10" } }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "node_modules/v3-periphery-1_3_0/node_modules/@openzeppelin/contracts": { + "version": "3.4.1-solc-0.7-2", + "license": "MIT" }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "devOptional": true, + "license": "MIT" }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "license": "Apache-2.0", "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "node_modules/validator": { + "version": "13.9.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.10" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/varint": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "node_modules/verror": { + "version": "1.10.0", + "engines": [ + "node >=0.6.0" + ], + "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" } }, - "node_modules/typechain": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.1.1.tgz", - "integrity": "sha512-uF/sUvnXTOVF2FHKhQYnxHk4su4JjZR8vr4mA2mBaRwHTbwh0jIlqARz9XJr1tA0l7afJGvEa1dTSi4zt039LQ==", + "node_modules/vite": { + "version": "4.3.9", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" + "esbuild": "^0.17.5", + "postcss": "^8.4.23", + "rollup": "^3.21.0" }, "bin": { - "typechain": "dist/cli/cli.js" + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" }, "peerDependencies": { - "typescript": ">=4.3.0" + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } } }, - "node_modules/typechain/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/vite-plugin-singlefile": { + "version": "0.13.5", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "micromatch": "^4.0.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "rollup": ">=2.79.0", + "vite": ">=3.2.0" } }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "node_modules/vite/node_modules/esbuild": { + "version": "0.17.19", "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.17.19", + "@esbuild/android-arm64": "0.17.19", + "@esbuild/android-x64": "0.17.19", + "@esbuild/darwin-arm64": "0.17.19", + "@esbuild/darwin-x64": "0.17.19", + "@esbuild/freebsd-arm64": "0.17.19", + "@esbuild/freebsd-x64": "0.17.19", + "@esbuild/linux-arm": "0.17.19", + "@esbuild/linux-arm64": "0.17.19", + "@esbuild/linux-ia32": "0.17.19", + "@esbuild/linux-loong64": "0.17.19", + "@esbuild/linux-mips64el": "0.17.19", + "@esbuild/linux-ppc64": "0.17.19", + "@esbuild/linux-riscv64": "0.17.19", + "@esbuild/linux-s390x": "0.17.19", + "@esbuild/linux-x64": "0.17.19", + "@esbuild/netbsd-x64": "0.17.19", + "@esbuild/openbsd-x64": "0.17.19", + "@esbuild/sunos-x64": "0.17.19", + "@esbuild/win32-arm64": "0.17.19", + "@esbuild/win32-ia32": "0.17.19", + "@esbuild/win32-x64": "0.17.19" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/web-worker": { + "version": "1.2.0", + "license": "Apache-2.0" + }, + "node_modules/web3": { + "version": "1.10.0", + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.0.0" } }, - "node_modules/typechain/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "peer": true, + "node_modules/web3-bzz": { + "version": "1.10.0", + "hasInstallScript": true, + "license": "LGPL-3.0", "dependencies": { - "brace-expansion": "^1.1.7" + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" }, "engines": { - "node": "*" + "node": ">=8.0.0" } }, - "node_modules/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" + "node_modules/web3-bzz/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" + }, + "node_modules/web3-core": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, + "node_modules/web3-core-helpers": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "peer": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "node_modules/web3-core-method": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "is-typedarray": "^1.0.0" + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, + "node_modules/web3-core-promievent": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, - "bin": { - "typedoc": "bin/typedoc" + "eventemitter3": "4.0.4" }, "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" + "node": ">=8.0.0" } }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, + "node_modules/web3-core-requestmanager": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "brace-expansion": "^2.0.1" + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8.0.0" } }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/web3-core-subscriptions": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" }, "engines": { - "node": ">=4.2.0" + "node": ">=8.0.0" } }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } + "node_modules/web3-core/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" + "node_modules/web3-eth": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=0.8.0" + "node": ">=8.0.0" } }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, + "node_modules/web3-eth-abi": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "node_modules/undici": { - "version": "5.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.21.2.tgz", - "integrity": "sha512-f6pTQ9RF4DQtwoWSaC42P/NKlUjvezVvd9r155ohqkwFNRyBKM3f3pcty3ouusefNRyM25XhIQEbeQ46sZDJfQ==", + "node_modules/web3-eth-accounts": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "busboy": "^1.6.0" + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=12.18" + "node": ">=8.0.0" } }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, + "node_modules/web3-eth-accounts/node_modules/eth-lib": { + "version": "0.2.8", + "license": "MIT", "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" + "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "license": "MIT" + }, + "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { + "version": "7.1.5", + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, "engines": { - "node": ">= 0.8" + "node": ">=10.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" + "node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.0", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/web3-eth-contract": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "node_modules/web3-eth-ens": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "upper-case": "^1.1.1" + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/web3-eth-iban": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "punycode": "^2.1.0" + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, + "node_modules/web3-eth-personal": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "node-gyp-build": "^4.3.0" + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6.14.2" + "node": ">=8.0.0" } }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + "node_modules/web3-eth-personal/node_modules/@types/node": { + "version": "12.20.55", + "license": "MIT" }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "node_modules/web3-net": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "node_modules/web3-providers-http": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" + }, "engines": { - "node": ">= 0.4.0" + "node": ">=8.0.0" } }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" + "node_modules/web3-providers-ipc": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/v3-periphery-1_3_0": { - "name": "@uniswap/v3-periphery", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", - "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", + "node_modules/web3-providers-ws": { + "version": "1.10.0", + "license": "LGPL-3.0", "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1", - "hardhat-watcher": "^2.1.1" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/v3-periphery-1_3_0/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "node_modules/web3-shh": { + "version": "1.10.0", + "hasInstallScript": true, + "license": "LGPL-3.0", + "dependencies": { + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "node_modules/web3-utils": { + "version": "1.10.0", + "license": "LGPL-3.0", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "license": "MIT", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/validator": { - "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", - "dev": true, + "node_modules/web3-utils/node_modules/ethereumjs-util": { + "version": "7.1.5", + "license": "MPL-2.0", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, "engines": { - "node": ">= 0.10" + "node": ">=10.0.0" } }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + "node_modules/webidl-conversions": { + "version": "3.0.1", + "license": "BSD-2-Clause" }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "node_modules/websocket": { + "version": "1.0.34", + "license": "Apache-2.0", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, "engines": { - "node": ">= 0.8" + "node": ">=4.0.0" } }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "ms": "2.0.0" } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" }, - "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "dev": true + "node_modules/whatwg-url": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } }, - "node_modules/web3": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.9.0.tgz", - "integrity": "sha512-E9IvVy/d2ozfQQsCiV+zh/LmlZGv9fQxI0UedDVjm87yOKf4AYbBNEn1iWtHveiGzAk2CEMZMUzAZzaQNSSYog==", - "hasInstallScript": true, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "web3-bzz": "1.9.0", - "web3-core": "1.9.0", - "web3-eth": "1.9.0", - "web3-eth-personal": "1.9.0", - "web3-net": "1.9.0", - "web3-shh": "1.9.0", - "web3-utils": "1.9.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" }, "engines": { - "node": ">=8.0.0" + "node": ">= 8" } }, - "node_modules/web3-bzz": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.9.0.tgz", - "integrity": "sha512-9Zli9dikX8GdHwBb5/WPzpSVuy3EWMKY3P4EokCQra31fD7DLizqAAaTUsFwnK7xYkw5ogpHgelw9uKHHzNajg==", - "hasInstallScript": true, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.9.0.tgz", - "integrity": "sha512-DZ+TPmq/ZLlx4LSVzFgrHCP/QFpKDbGWO4HoquZSdu24cjk5SZ+FEU1SZB2OaK3/bgBh+25mRbmv8y56ysUu1w==", + "node_modules/which-module": { + "version": "2.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "license": "MIT", "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.9.0", - "web3-core-method": "1.9.0", - "web3-core-requestmanager": "1.9.0", - "web3-utils": "1.9.0" + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/web3-core-helpers": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.9.0.tgz", - "integrity": "sha512-NeJzylAp9Yj9xAt2uTT+kyug3X0DLnfBdnAcGZuY6HhoNPDIfQRA9CkJjLngVRlGTLZGjNp9x9eR+RyZQgUlXg==", + "node_modules/wide-align": { + "version": "1.1.3", + "dev": true, + "license": "ISC", + "peer": true, "dependencies": { - "web3-eth-iban": "1.9.0", - "web3-utils": "1.9.0" - }, + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-core-method": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.9.0.tgz", - "integrity": "sha512-sswbNsY2xRBBhGeaLt9c/eDc+0yDDhi6keUBAkgIRa9ueSx/VKzUY9HMqiV6bXDcGT2fJyejq74FfEB4lc/+/w==", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.9.0", - "web3-core-promievent": "1.9.0", - "web3-core-subscriptions": "1.9.0", - "web3-utils": "1.9.0" - }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-core-promievent": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.9.0.tgz", - "integrity": "sha512-PHG1Mn23IGwMZhnPDN8dETKypqsFbHfiyRqP+XsVMPmTHkVfzDQTCBU/c2r6hUktBDoGKut5xZQpGfhFk71KbQ==", + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "eventemitter3": "4.0.4" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-core-requestmanager": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.9.0.tgz", - "integrity": "sha512-hcJ5PCtTIJpj+8qWxoseqlCovDo94JJjTX7dZOLXgwp8ah7E3WRYozhGyZocerx+KebKyg1mCQIhkDpMwjfo9Q==", + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.9.0", - "web3-providers-http": "1.9.0", - "web3-providers-ipc": "1.9.0", - "web3-providers-ws": "1.9.0" + "ansi-regex": "^3.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=4" } }, - "node_modules/web3-core-subscriptions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.9.0.tgz", - "integrity": "sha512-MaIo29yz7hTV8X8bioclPDbHFOVuHmnbMv+D3PDH12ceJFJAXGyW8GL5KU1DYyWIj4TD1HM4WknyVA/YWBiiLA==", + "node_modules/widest-line": { + "version": "3.1.0", + "license": "MIT", "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.9.0" + "string-width": "^4.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.9.0.tgz", - "integrity": "sha512-c5gSWk9bLNr6VPATHmZ1n7LTIefIZQnJMzfnvkoBcIFGKJbGmsuRhv6lEXsKdAO/FlqYnSbaw3fOq1fVFiIOFQ==", - "dependencies": { - "web3-core": "1.9.0", - "web3-core-helpers": "1.9.0", - "web3-core-method": "1.9.0", - "web3-core-subscriptions": "1.9.0", - "web3-eth-abi": "1.9.0", - "web3-eth-accounts": "1.9.0", - "web3-eth-contract": "1.9.0", - "web3-eth-ens": "1.9.0", - "web3-eth-iban": "1.9.0", - "web3-eth-personal": "1.9.0", - "web3-net": "1.9.0", - "web3-utils": "1.9.0" + "node_modules/window-size": { + "version": "0.2.0", + "license": "MIT", + "bin": { + "window-size": "cli.js" }, "engines": { - "node": ">=8.0.0" + "node": ">= 0.10.0" } }, - "node_modules/web3-eth-abi": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.9.0.tgz", - "integrity": "sha512-0BLQ3FKMrzJkA930jOX3fMaybAyubk06HChclLpiR0NWmgWXm1tmBrJdkyRy2ZTZpmfuZc9xTFRfl0yZID1voA==", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.9.0" - }, + "node_modules/word-wrap": { + "version": "1.2.3", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.10.0" } }, - "node_modules/web3-eth-accounts": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.9.0.tgz", - "integrity": "sha512-VeIZVevmnSll0AC1k5F/y398ZE89d1SRuYk8IewLUhL/tVAsFEsjl2SGgm0+aDcHmgPrkW+qsCJ+C7rWg/N4ZA==", + "node_modules/wordwrap": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/wordwrapjs": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "peer": true, "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.9.0", - "web3-core-helpers": "1.9.0", - "web3-core-method": "1.9.0", - "web3-utils": "1.9.0" + "reduce-flatten": "^2.0.0", + "typical": "^5.2.0" }, "engines": { "node": ">=8.0.0" } }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, + "node_modules/wordwrapjs/node_modules/typical": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "peer": true, "engines": { - "node": ">=10.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "bin": { - "uuid": "dist/bin/uuid" - } + "node_modules/workerpool": { + "version": "6.2.0", + "dev": true, + "license": "Apache-2.0" }, - "node_modules/web3-eth-contract": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.9.0.tgz", - "integrity": "sha512-+j26hpSaEtAdUed0TN5rnc+YZOcjPxMjFX4ZBKatvFkImdbVv/tzTvcHlltubSpgb2ZLyZ89lSL6phKYwd2zNQ==", + "node_modules/wrap-ansi": { + "version": "6.2.0", + "license": "MIT", "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.9.0", - "web3-core-helpers": "1.9.0", - "web3-core-method": "1.9.0", - "web3-core-promievent": "1.9.0", - "web3-core-subscriptions": "1.9.0", - "web3-eth-abi": "1.9.0", - "web3-utils": "1.9.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8.0.0" + "node": ">=8" } }, - "node_modules/web3-eth-ens": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.9.0.tgz", - "integrity": "sha512-LOJZeN+AGe9arhuExnrPPFYQr4WSxXEkpvYIlst/joOEUNLDwfndHnJIK6PI5mXaYSROBtTx6erv+HupzGo7vA==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.9.0", - "web3-core-helpers": "1.9.0", - "web3-core-promievent": "1.9.0", - "web3-eth-abi": "1.9.0", - "web3-eth-contract": "1.9.0", - "web3-utils": "1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.9.0.tgz", - "integrity": "sha512-jPAm77PuEs1kE/UrrBFJdPD2PN42pwfXA0gFuuw35bZezhskYML9W4QCxcqnUtceyEA4FUn7K2qTMuCk+23fog==", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.9.0" + "node": ">=8" }, - "engines": { - "node": ">=8.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/web3-eth-personal": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.9.0.tgz", - "integrity": "sha512-r9Ldo/luBqJlv1vCUEQnUS+C3a3ZdbYxVHyfDkj6RWMyCqqo8JE41HWE+pfa0RmB1xnGL2g8TbYcHcqItck/qg==", + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.9.0", - "web3-core-helpers": "1.9.0", - "web3-core-method": "1.9.0", - "web3-net": "1.9.0", - "web3-utils": "1.9.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=8.0.0" + "node": ">=7.0.0" } }, - "node_modules/web3-net": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.9.0.tgz", - "integrity": "sha512-L+fDZFgrLM5Y15aonl2q6L+RvfaImAngmC0Jv45hV2FJ5IfRT0/2ob9etxZmvEBWvOpbqSvghfOhJIT3XZ37Pg==", + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", "dependencies": { - "web3-core": "1.9.0", - "web3-core-method": "1.9.0", - "web3-utils": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, - "node_modules/web3-providers-http": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.9.0.tgz", - "integrity": "sha512-5+dMNDAE0rRFz6SJpfnBqlVi2J5bB/Ivr2SanMt2YUrkxW5t8betZbzVwRkTbwtUvkqgj3xeUQzqpOttiv+IqQ==", - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.9.0" - }, + "node_modules/ws": { + "version": "7.4.6", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/web3-providers-ipc": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.9.0.tgz", - "integrity": "sha512-cPXU93Du40HCylvjaa5x62DbnGqH+86HpK/+kMcFIzF6sDUBhKpag2tSbYhGbj7GMpfkmDTUiiMLdWnFV6+uBA==", + "node_modules/xhr": { + "version": "2.6.0", + "license": "MIT", "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.9.0" - }, - "engines": { - "node": ">=8.0.0" + "global": "~4.4.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" } }, - "node_modules/web3-providers-ws": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.9.0.tgz", - "integrity": "sha512-JRVsnQZ7j2k1a2yzBNHe39xqk1ijOv01dfIBFw52VeEkSRzvrOcsPIM/ttSyBuJqt70ntMxXY0ekCrqfleKH/w==", + "node_modules/xhr-request": { + "version": "1.1.0", + "license": "MIT", "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.9.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" + "buffer-to-arraybuffer": "^0.0.5", + "object-assign": "^4.1.1", + "query-string": "^5.0.1", + "simple-get": "^2.7.0", + "timed-out": "^4.0.1", + "url-set-query": "^1.0.0", + "xhr": "^2.0.4" } }, - "node_modules/web3-shh": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.9.0.tgz", - "integrity": "sha512-bIBZlralgz4ICCrwkefB2nPPJWfx28NuHIpjB7d9ADKynElubQuqudYhKtSEkKXACuME/BJm0pIFJcJs/gDnMg==", - "hasInstallScript": true, + "node_modules/xhr-request-promise": { + "version": "0.1.3", + "license": "MIT", "dependencies": { - "web3-core": "1.9.0", - "web3-core-method": "1.9.0", - "web3-core-subscriptions": "1.9.0", - "web3-net": "1.9.0" - }, + "xhr-request": "^1.1.0" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.4.0" } }, - "node_modules/web3-utils": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.9.0.tgz", - "integrity": "sha512-p++69rCNNfu2jM9n5+VD/g26l+qkEOQ1m6cfRQCbH8ZRrtquTmrirJMgTmyOoax5a5XRYOuws14aypCOs51pdQ==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, + "node_modules/xtend": { + "version": "4.0.2", + "license": "MIT", "engines": { - "node": ">=8.0.0" + "node": ">=0.4" } }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/web3-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, + "node_modules/yaeti": { + "version": "0.0.6", + "license": "MIT", "engines": { - "node": ">=10.0.0" + "node": ">=0.10.32" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "node_modules/yargs": { + "version": "16.2.0", + "license": "MIT", "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=4.0.0" + "node": ">=10" } }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" + "node_modules/yargs-parser": { + "version": "20.2.4", + "license": "ISC", + "engines": { + "node": ">=10" } }, - "node_modules/websocket/node_modules/ms": { + "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "engines": { - "node": ">= 8" + "node": ">=10" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, + "node_modules/yn": { + "version": "3.1.1", + "devOptional": true, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/widest-line/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@types/yoga-layout": "1.9.2" }, "engines": { "node": ">=8" } }, - "node_modules/widest-line/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/z-schema": { + "version": "5.0.5", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "lodash.get": "^4.4.2", + "lodash.isequal": "^4.5.0", + "validator": "^13.7.0" + }, + "bin": { + "z-schema": "bin/z-schema" }, "engines": { - "node": ">=8" + "node": ">=8.0.0" + }, + "optionalDependencies": { + "commander": "^9.4.1" } }, - "node_modules/window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "bin": { - "window-size": "cli.js" + "node_modules/z-schema/node_modules/commander": { + "version": "9.5.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "packages/core": { + "name": "@ignored/ignition-core", + "version": "0.0.13", + "license": "MIT", + "dependencies": { + "@ethersproject/address": "5.6.1", + "debug": "^4.3.2", + "ethers": "^5.4.7", + "js-graph-algorithms": "1.0.18", + "object-hash": "^3.0.0", + "serialize-error": "8.1.0" + }, + "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/mocha": "9.1.1", + "@types/node": "12.20.25", + "@types/object-hash": "^2.2.1", + "@types/react": "^17.0.35", + "@types/sinon": "^10.0.6", + "@types/tmp": "^0.2.2", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.1", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "fast-glob": "^3.2.12", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.4.1", + "rimraf": "3.0.2", + "sinon": "^12.0.1", + "tmp": "^0.2.1", + "ts-node": "10.9.1", + "typescript": "^4.7.4" }, "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" } }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "packages/core/node_modules/@types/node": { + "version": "12.20.25", "dev": true, - "peer": true + "license": "MIT" }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", + "packages/core/node_modules/@types/react": { + "version": "17.0.60", "dev": true, - "peer": true, + "license": "MIT", "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "packages/hardhat-plugin": { + "name": "@ignored/hardhat-ignition", + "version": "0.0.13", + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "debug": "^4.3.2", + "ethers": "^5.4.7", + "fs-extra": "^10.0.0", + "ink": "3.2.0", + "ink-spinner": "4.0.3", + "ndjson": "2.0.0", + "prompts": "^2.4.2", + "react": "18.2.0", + "serialize-error": "8.1.0" }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" + "devDependencies": { + "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-ui": "^0.0.13", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/hardhat-ethers": "^2.0.2", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/d3": "7.4.0", + "@types/debug": "^4.1.7", + "@types/dompurify": "2.4.0", + "@types/fs-extra": "^9.0.13", + "@types/lodash": "4.14.189", + "@types/mermaid": "^9.1.0", + "@types/mocha": "^9.0.0", + "@types/ndjson": "2.0.1", + "@types/node": "12.20.25", + "@types/prompts": "^2.4.2", + "@types/sinon": "^10.0.13", + "@typescript-eslint/eslint-plugin": "4.31.2", + "@typescript-eslint/parser": "4.31.2", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "esbuild": "^0.15.9", + "eslint": "^7.32.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-import": "2.24.2", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "^2.14.0", + "mermaid": "^9.1.7", + "mocha": "^9.1.1", + "nyc": "15.1.0", + "prettier": "2.4.1", + "purecss": "^2.1.0", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^4.7.4" }, "engines": { - "node": ">=8" + "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "peerDependencies": { + "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-ui": "^0.0.13", + "@nomiclabs/hardhat-ethers": "^2.0.2", + "hardhat": "^2.14.0" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "packages/hardhat-plugin/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "type-detect": "4.0.8" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" + "type-detect": "4.0.8" } }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "packages/hardhat-plugin/node_modules/@types/node": { + "version": "12.20.25", + "dev": true, + "license": "MIT" }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "packages/hardhat-plugin/node_modules/dagre-d3-es": { + "version": "7.0.9", "dev": true, + "license": "MIT", "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" + "d3": "^7.8.2", + "lodash-es": "^4.17.21" } }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "packages/hardhat-plugin/node_modules/dompurify": { + "version": "2.4.3", + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)" + }, + "packages/hardhat-plugin/node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=8" } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "packages/hardhat-plugin/node_modules/mermaid": { + "version": "9.4.3", + "dev": true, + "license": "MIT", "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" + "@braintree/sanitize-url": "^6.0.0", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.9", + "dayjs": "^1.11.7", + "dompurify": "2.4.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "packages/hardhat-plugin/node_modules/react": { + "version": "18.2.0", + "license": "MIT", "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "packages/hardhat-plugin/node_modules/sinon": { + "version": "14.0.2", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "xhr-request": "^1.1.0" + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" } }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "packages/hardhat-plugin/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=0.4.0" + "node": ">=8" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" + "packages/hardhat-plugin/node_modules/uuid": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" + "packages/ui": { + "name": "@ignored/ignition-ui", + "version": "0.0.13", + "dependencies": { + "@ignored/ignition-core": "^0.0.13", + "mermaid": "10.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "6.11.0", + "styled-components": "5.3.10" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/styled-components": "5.1.26", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "rimraf": "3.0.2", + "typescript": "^5.0.2", + "vite": "^4.3.2", + "vite-plugin-singlefile": "0.13.5" } }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "packages/ui/node_modules/@eslint/eslintrc": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.5.2", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=0.10.32" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "packages/ui/node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.59.7", + "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/type-utils": "5.59.7", + "@typescript-eslint/utils": "5.59.7", + "debug": "^4.3.4", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "packages/ui/node_modules/@typescript-eslint/parser": { + "version": "5.59.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.59.7", + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.7", + "debug": "^4.3.4" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "packages/ui/node_modules/@typescript-eslint/scope-manager": { + "version": "5.59.7", + "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "packages/ui/node_modules/@typescript-eslint/types": { + "version": "5.59.7", + "dev": true, + "license": "MIT", "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "packages/ui/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.59.7", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/visitor-keys": "5.59.7", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "packages/ui/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.59.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.59.7", + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "packages/ui/node_modules/acorn": { + "version": "8.8.2", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": ">=8" + "node": ">=0.4.0" } }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "packages/ui/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "color-convert": "^2.0.1" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "packages/ui/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "packages/ui/node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, + "packages/ui/node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, "engines": { - "node": ">=6" + "node": ">=7.0.0" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "packages/ui/node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "packages/ui/node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -20509,258 +18937,231 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoga-layout-prebuilt": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", - "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", + "packages/ui/node_modules/eslint": { + "version": "8.41.0", + "dev": true, + "license": "MIT", "dependencies": { - "@types/yoga-layout": "1.9.2" + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", + "packages/ui/node_modules/eslint-scope": { + "version": "7.2.0", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, - "bin": { - "z-schema": "bin/z-schema" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/ui/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "packages/ui/node_modules/espree": { + "version": "9.5.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": ">=8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "optionalDependencies": { - "commander": "^9.4.1" + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "packages/ui/node_modules/estraverse": { + "version": "5.3.0", "dev": true, - "optional": true, + "license": "BSD-2-Clause", "engines": { - "node": "^12.20.0 || >=14" + "node": ">=4.0" } }, - "packages/core": { - "name": "@ignored/ignition-core", - "version": "0.0.13", + "packages/ui/node_modules/find-up": { + "version": "5.0.0", + "dev": true, "license": "MIT", "dependencies": { - "@ethersproject/address": "5.6.1", - "debug": "^4.3.2", - "ethers": "^5.4.7", - "fs-extra": "^10.0.0", - "js-graph-algorithms": "1.0.18", - "object-hash": "^3.0.0", - "serialize-error": "8.1.0" - }, - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.5", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.13", - "@types/mocha": "9.1.1", - "@types/node": "12.20.25", - "@types/object-hash": "^2.2.1", - "@types/react": "^17.0.35", - "@types/sinon": "^10.0.6", - "@types/tmp": "^0.2.2", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-prettier": "4.0.0", - "fast-glob": "^3.2.12", - "mocha": "^9.1.3", - "nyc": "15.1.0", - "prettier": "2.4.1", - "rimraf": "3.0.2", - "sinon": "^12.0.1", - "tmp": "^0.2.1", - "ts-node": "10.9.1", - "typescript": "^4.7.4" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - } - }, - "packages/core/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "node": ">=10" }, - "engines": { - "node": ">=12" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/core/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "packages/ui/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", "dependencies": { - "universalify": "^2.0.0" + "is-glob": "^4.0.3" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/core/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { - "node": ">= 10.0.0" + "node": ">=10.13.0" } }, - "packages/hardhat-plugin": { - "name": "@ignored/hardhat-ignition", - "version": "0.0.13", + "packages/ui/node_modules/globals": { + "version": "13.20.0", + "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.2", - "ethers": "^5.4.7", - "fs-extra": "^10.0.0", - "ink": "3.2.0", - "ink-spinner": "4.0.3", - "ndjson": "2.0.0", - "prompts": "^2.4.2", - "react": "18.2.0", - "serialize-error": "8.1.0" - }, - "devDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/hardhat-ethers": "^2.0.2", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.4", - "@types/d3": "7.4.0", - "@types/debug": "^4.1.7", - "@types/dompurify": "2.4.0", - "@types/fs-extra": "^9.0.13", - "@types/lodash": "4.14.189", - "@types/mermaid": "^9.1.0", - "@types/mocha": "^9.0.0", - "@types/ndjson": "2.0.1", - "@types/node": "12.20.25", - "@types/prompts": "^2.4.2", - "@types/sinon": "^10.0.13", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "esbuild": "^0.15.9", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.14.0", - "mermaid": "^9.1.7", - "mocha": "^9.1.1", - "nyc": "15.1.0", - "prettier": "2.4.1", - "purecss": "^2.1.0", - "rimraf": "3.0.2", - "sinon": "^14.0.0", - "ts-node": "10.9.1", - "typescript": "^4.7.4" + "type-fest": "^0.20.2" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" + "node": ">=8" }, - "peerDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@nomiclabs/hardhat-ethers": "^2.0.2", - "hardhat": "^2.14.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/hardhat-plugin/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "packages/ui/node_modules/has-flag": { + "version": "4.0.0", "dev": true, - "dependencies": { - "type-detect": "4.0.8" + "license": "MIT", + "engines": { + "node": ">=8" } }, - "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "packages/ui/node_modules/ignore": { + "version": "5.2.4", "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" + "license": "MIT", + "engines": { + "node": ">= 4" } }, - "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "packages/ui/node_modules/js-yaml": { + "version": "4.1.0", "dev": true, + "license": "MIT", "dependencies": { - "type-detect": "4.0.8" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "packages/ui/node_modules/locate-path": { + "version": "6.0.0", "dev": true, + "license": "MIT", "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/hardhat-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "packages/ui/node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/hardhat-plugin/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "packages/ui/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "universalify": "^2.0.0" + "p-limit": "^3.0.2" }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/hardhat-plugin/node_modules/react": { + "packages/ui/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/ui/node_modules/react": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -20768,29 +19169,10 @@ "node": ">=0.10.0" } }, - "packages/hardhat-plugin/node_modules/sinon": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", - "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "packages/hardhat-plugin/node_modules/supports-color": { + "packages/ui/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -20798,12 +19180,27 @@ "node": ">=8" } }, - "packages/hardhat-plugin/node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "packages/ui/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">= 10.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/ui/node_modules/typescript": { + "version": "5.0.4", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" } } } diff --git a/packages/core/package.json b/packages/core/package.json index 127379d8ea..a6a4ddea32 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -23,6 +23,7 @@ "exports": { ".": "./dist/src/index.js", "./helpers": "./dist/src/helpers.js", + "./ui-helpers": "./dist/src/ui-helpers.js", "./soon-to-be-removed": "./dist/src/soon-to-be-removed.js" }, "typesVersions": { @@ -30,6 +31,9 @@ "helpers": [ "./dist/src/helpers" ], + "ui-helpers": [ + "./dist/src/ui-helpers" + ], "soon-to-be-removed": [ "./dist/src/soon-to-be-removed" ] @@ -87,7 +91,6 @@ "@ethersproject/address": "5.6.1", "debug": "^4.3.2", "ethers": "^5.4.7", - "fs-extra": "^10.0.0", "js-graph-algorithms": "1.0.18", "object-hash": "^3.0.0", "serialize-error": "8.1.0" diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 9f37c2fc8d..b1558744d3 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,9 +1,17 @@ export { buildModule } from "./buildModule"; -export * from "./initialization"; export * from "./errors"; +export * from "./initialization"; +export { defineModule } from "./new-api/define-module"; +/* TODO: how is module constructor getting exposed? */ +export { ModuleConstructor } from "./new-api/internal/module-builder"; +export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; +/* TODO: move out and concretize these stubs */ +export { ArtifactType, SolidityParamsType } from "./new-api/stubs"; +export * from "./new-api/types/module"; +export * from "./new-api/types/module-builder"; +export * from "./new-api/types/serialized-deployment"; export * from "./types/dsl"; export * from "./types/future"; -export * from "./types/future"; export * from "./types/hardhat"; export * from "./types/ignition"; export * from "./types/info"; diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts index 94f0072a1d..e231990733 100644 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -3,7 +3,7 @@ import type { ArtifactContract, ArtifactLibrary, ContractCall, - ContractFuture, + ContractFutureOld, DependableFuture, DeployedContract, DeploymentGraphFuture, @@ -55,12 +55,12 @@ import { import { resolveProxyDependency } from "../../internal/utils/proxy"; import { AwaitOptions, - CallOptions, - ContractOptions, + CallOptionsOld, + ContractOptionsOld, IDeploymentBuilder, InternalParamValue, SendOptions, - StaticCallOptions, + StaticCallOptionsOld, UseModuleOptions, } from "../../types/dsl"; import { addEdge, ensureVertex } from "../graph/adjacencyList"; @@ -150,21 +150,21 @@ export class DeploymentBuilder implements IDeploymentBuilder { public library( libraryName: string, - options?: ContractOptions + options?: ContractOptionsOld ): HardhatLibrary; public library( libraryName: string, artifact: Artifact, - options?: ContractOptions + options?: ContractOptionsOld ): ArtifactLibrary; public library( libraryName: string, - artifactOrOptions?: ContractOptions | Artifact, - givenOptions?: ContractOptions + artifactOrOptions?: ContractOptionsOld | Artifact, + givenOptions?: ContractOptionsOld ): HardhatLibrary | ArtifactLibrary { if (isArtifact(artifactOrOptions)) { const artifact = artifactOrOptions; - const options: ContractOptions | undefined = givenOptions; + const options: ContractOptionsOld | undefined = givenOptions; const artifactContractFuture: ArtifactLibrary = { vertexId: this._resolveNextId(), @@ -188,7 +188,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return artifactContractFuture; } else { - const options: ContractOptions | undefined = artifactOrOptions; + const options: ContractOptionsOld | undefined = artifactOrOptions; const libraryFuture: HardhatLibrary = { vertexId: this._resolveNextId(), @@ -216,21 +216,21 @@ export class DeploymentBuilder implements IDeploymentBuilder { public contract( contractName: string, - options?: ContractOptions + options?: ContractOptionsOld ): HardhatContract; public contract( contractName: string, artifact: Artifact, - options?: ContractOptions + options?: ContractOptionsOld ): ArtifactContract; public contract( contractName: string, - artifactOrOptions?: Artifact | ContractOptions, - givenOptions?: ContractOptions + artifactOrOptions?: Artifact | ContractOptionsOld, + givenOptions?: ContractOptionsOld ): HardhatContract | ArtifactContract { if (isArtifact(artifactOrOptions)) { const artifact = artifactOrOptions; - const options: ContractOptions | undefined = givenOptions; + const options: ContractOptionsOld | undefined = givenOptions; const artifactContractFuture: ArtifactContract = { vertexId: this._resolveNextId(), @@ -256,7 +256,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return artifactContractFuture; } else { - const options: ContractOptions | undefined = artifactOrOptions; + const options: ContractOptionsOld | undefined = artifactOrOptions; const contractFuture: HardhatContract = { vertexId: this._resolveNextId(), @@ -316,7 +316,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public call( contractFuture: DeploymentGraphFuture, functionName: string, - { args, after, value, from }: CallOptions + { args, after, value, from }: CallOptionsOld ): ContractCall { const callFuture: ContractCall = { vertexId: this._resolveNextId(), @@ -325,7 +325,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - let contract: ContractFuture; + let contract: ContractFutureOld; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -371,7 +371,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { public staticCall( contractFuture: DeploymentGraphFuture, functionName: string, - { args, after, from }: StaticCallOptions + { args, after, from }: StaticCallOptionsOld ): StaticContractCall { const staticCallFuture: StaticContractCall = { vertexId: this._resolveNextId(), @@ -380,7 +380,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { _future: true, }; - let contract: ContractFuture; + let contract: ContractFutureOld; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -438,7 +438,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { params: {}, }; - let contract: ContractFuture; + let contract: ContractFutureOld; if (isParameter(contractFuture)) { const parameter = contractFuture; const scope = parameter.scope; @@ -526,7 +526,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { throw new IgnitionError("Could not resolve contract from parameter"); } - address = scopeData.parameters[parameter.label] as ContractFuture; + address = scopeData.parameters[parameter.label] as ContractFutureOld; } else { if (sendTo.subtype !== "address") { throw new IgnitionError( diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 390590bedb..0a36835fbc 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -4,7 +4,7 @@ import { InternalParamValue } from "../../types/dsl"; import { AddressResolvable, ArtifactContract, - ContractFuture, + ContractFutureOld, DeploymentGraphFuture, EventParamFuture, HardhatContract, @@ -150,7 +150,7 @@ export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { export interface CallDeploymentVertex extends VertexDescriptor { type: "Call"; scopeAdded: string; - contract: ContractFuture; + contract: ContractFutureOld; method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; @@ -166,7 +166,7 @@ export interface CallDeploymentVertex extends VertexDescriptor { export interface StaticCallDeploymentVertex extends VertexDescriptor { type: "StaticCall"; scopeAdded: string; - contract: ContractFuture; + contract: ContractFutureOld; method: string; args: InternalParamValue[]; after: DeploymentGraphFuture[]; diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 41992d23df..2f19b55e99 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -1,5 +1,5 @@ import type { - ContractFuture, + ContractFutureOld, DependableFuture, DeploymentGraphFuture, EventParamFuture, @@ -131,7 +131,7 @@ export function isParameter( export function isContract( future: DeploymentGraphFuture -): future is ContractFuture { +): future is ContractFutureOld { if (isProxy(future)) { return isContract(future.value); } @@ -141,7 +141,7 @@ export function isContract( export function isLibrary( future: DeploymentGraphFuture -): future is ContractFuture { +): future is ContractFutureOld { if (isProxy(future)) { return isLibrary(future.value); } diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts index ce2b9b9fed..9bd12b015c 100644 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ b/packages/core/src/internal/validation/dispatch/helpers.ts @@ -1,13 +1,13 @@ -import type { ContractFuture } from "../../../types/future"; import type { Services } from "../../types/services"; import { IgnitionError } from "../../../errors"; +import { ContractFutureOld } from "../../../types/future"; import { CallPoints, DeploymentGraphVertex } from "../../types/deploymentGraph"; import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; import { resolveProxyValue } from "../../utils/proxy"; export async function resolveArtifactForContractFuture( - givenFuture: ContractFuture, + givenFuture: ContractFutureOld, { services }: { services: Services } ): Promise { const future = resolveProxyValue(givenFuture); diff --git a/packages/core/src/new-api/define-module.ts b/packages/core/src/new-api/define-module.ts index ab5ff7474f..1345e01bea 100644 --- a/packages/core/src/new-api/define-module.ts +++ b/packages/core/src/new-api/define-module.ts @@ -4,6 +4,16 @@ import { IgnitionModuleDefinition, } from "./types/module-builder"; +/** + * Construct a module definition that can be deployed through Ignition. + * + * @param moduleId - the id of the module + * @param moduleDefintionFunction - a function accepting the + * IgnitionModuleBuilder to configure the deployment + * @returns a module definition + * + * @beta + */ export function defineModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 06a38478f2..8fc6970064 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -53,6 +53,7 @@ const STUB_MODULE_RESULTS = { * module params). * * TODO: Add support for concrete values. + * @beta */ export class ModuleConstructor { private _modules: Map = new Map(); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index b0c5b09b03..6908300d84 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,21 +1,21 @@ -import { inspect } from "util"; - import { ArtifactType, SolidityParamsType } from "../stubs"; import { + ArtifactContractDeploymentFuture, + ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractFuture, Future, FutureType, IgnitionModule, - NamedContractDeploymentFuture, - ArtifactContractDeploymentFuture, IgnitionModuleResult, - NamedLibraryDeploymentFuture, - ArtifactLibraryDeploymentFuture, NamedContractCallFuture, - ContractFuture, + NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, NamedStaticCallFuture, - ContractAtFuture, } from "../types/module"; +const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); + export abstract class BaseFuture< FutureTypeT extends FutureType, ResultT = unknown @@ -29,16 +29,20 @@ export abstract class BaseFuture< public readonly module: IgnitionModuleImplementation ) {} - public [inspect.custom]() { + public [customInspectSymbol]( + _depth: number, + _inspectOptions: {}, + inspect: (arg: {}) => string + ) { const padding = " ".repeat(2); return `Future ${this.id} { - Type: ${FutureType[this.type]} - Module: ${this.module.id} - Dependencies: ${inspect( - Array.from(this.dependencies).map((f) => f.id) - ).replace(/\n/g, `\n${padding}`)} -}`; + Type: ${FutureType[this.type]} + Module: ${this.module.id} + Dependencies: ${inspect( + Array.from(this.dependencies).map((f) => f.id) + ).replace(/\n/g, `\n${padding}`)} + }`; } } @@ -175,16 +179,20 @@ export class IgnitionModuleImplementation< public readonly results: IgnitionModuleResultsT ) {} - public [inspect.custom]() { + public [customInspectSymbol]( + _depth: number, + _inspectOptions: {}, + inspect: (arg: {}) => string + ) { const padding = " ".repeat(2); return `IgnitionModule ${this.id} { - Futures: ${inspect(this.futures).replace(/\n/g, `\n${padding}`)} - Results: ${inspect(this.results).replace(/\n/g, `\n${padding}`)} - Submodules: ${inspect(Array.from(this.submodules).map((m) => m.id)).replace( - /\n/g, - `\n${padding}` - )} -}`; + Futures: ${inspect(this.futures).replace(/\n/g, `\n${padding}`)} + Results: ${inspect(this.results).replace(/\n/g, `\n${padding}`)} + Submodules: ${inspect(Array.from(this.submodules).map((m) => m.id)).replace( + /\n/g, + `\n${padding}` + )} + }`; } } diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts new file mode 100644 index 0000000000..9daf8b99a7 --- /dev/null +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -0,0 +1,659 @@ +import { IgnitionError } from "../errors"; + +import { + ArtifactContractDeploymentFutureImplementation, + ArtifactLibraryDeploymentFutureImplementation, + ContractAtFutureImplementation, + IgnitionModuleImplementation, + NamedContractCallFutureImplementation, + NamedContractDeploymentFutureImplementation, + NamedLibraryDeploymentFutureImplementation, + NamedStaticCallFutureImplementation, +} from "./internal/module"; +import { isFuture } from "./internal/utils"; +import { + ContractFuture, + Future, + FutureType, + IgnitionModule, + IgnitionModuleResult, +} from "./types/module"; +import { + BaseSerializedFuture, + FutureToken, + ModuleToken, + SerializedArtifactContractDeploymentFuture, + SerializedArtifactLibraryDeploymentFuture, + SerializedContractAtFuture, + SerializedFuture, + SerializedLibraries, + SerializedNamedContractCallFuture, + SerializedNamedContractDeploymentFuture, + SerializedNamedLibraryDeploymentFuture, + SerializedNamedStaticCallFuture, + SerializedSolidityParamType, + SerializedStoredDeployment, + SerializedStoredModule, + SerializedStoredResults, + StoredDeployment, +} from "./types/serialized-deployment"; + +export type PartialSerializedFuture = BaseSerializedFuture & { + module?: IgnitionModule>; + dependencies: FutureToken[]; + constructorArgs?: Array; +}; + +/** + * Serialize/Deserialize a deployment to json. + * + * @beta + */ +export class StoredDeploymentSerializer { + public static serialize( + deployment: StoredDeployment + ): SerializedStoredDeployment { + const allModules = this._getModulesAndSubmoduleFor(deployment.module); + + return { + details: { + ...deployment.details, + }, + startModule: deployment.module.id, + modules: Object.fromEntries( + allModules.map((m) => [m.id, this._serializeModule(m)]) + ), + }; + } + + public static deserialize( + serializedDeployment: SerializedStoredDeployment + ): StoredDeployment { + const partialFutures = + this._partialDeserializeAllFuturesFor(serializedDeployment); + + const partialModules = Object.values(serializedDeployment.modules).map( + (sm) => this._deserializePartialModule(sm, partialFutures) + ); + + this._rewireSubmoduleTokensToModulesFor( + partialModules, + serializedDeployment + ); + + this._recursivelyRewireFuturesToParentModule(partialModules); + + const startModule = partialModules.find( + (m) => m.id === serializedDeployment.startModule + ); + + if (startModule === undefined) { + throw new Error( + "Failure during deserialization, could not find startModule" + ); + } + + return { + details: { + ...serializedDeployment.details, + }, + module: startModule, + }; + } + + private static _rewireSubmoduleTokensToModulesFor( + partialModules: Array< + IgnitionModule> + >, + serializedDeployment: SerializedStoredDeployment + ): void { + for (const partialModule of partialModules) { + const serializedModule = serializedDeployment.modules[partialModule.id]; + + const submodules = serializedModule.submodules.map((moduleToken) => { + const mod = partialModules.find((pm) => pm.id === moduleToken.moduleId); + + if (mod === undefined) { + throw new Error("Deserialization error while looking up module"); + } + + return mod; + }); + + this._overwriteReadonly(partialModule, "submodules", new Set(submodules)); + } + } + + /** + * Create a partial future object for every future token in every + * serialized module and submodule. + * + * By partial we mean that the future object will have a placeholder + * module that will be switched for the correct module object in + * a later phase. + * + * @param serializedFutures - the serialized version of the futures + * @returns partial futures, that will need further edits to + * become valid + */ + private static _partialDeserializeAllFuturesFor( + deployment: SerializedStoredDeployment + ): { [key: string]: Future } { + const allSerializedFutures = this._getAllFuturesFor(deployment); + + const partialFutures = allSerializedFutures.map( + this._deserializePartialFuture + ); + + const serializedFutureLookup = Object.fromEntries( + allSerializedFutures.map((f) => [f.id, f]) + ); + + const partialFutureLookup = Object.fromEntries( + partialFutures.map((f) => [f.id, f]) + ); + + // update dependencies to be other future objects + for (const future of partialFutures) { + const serializedFuture = serializedFutureLookup[future.id]; + + const dependencies = serializedFuture.dependencies + .map((sf) => partialFutureLookup[sf.futureId]) + .filter((x): x is Future => Boolean(x)); + + dependencies.forEach((dep) => future.dependencies.add(dep)); + } + + // per future type, rewire other properties that could include references + for (const future of partialFutures) { + const serializedFuture = serializedFutureLookup[future.id]; + + if (future instanceof NamedContractDeploymentFutureImplementation) { + this._overwriteReadonly( + future, + "constructorArgs", + future.constructorArgs.map((arg) => + this._deserializeArg(arg, partialFutureLookup) + ) + ); + + this._overwriteReadonly( + future, + "libraries", + this._deserializeLibraries( + (serializedFuture as SerializedNamedContractDeploymentFuture) + .libraries, + partialFutureLookup + ) + ); + } else if ( + future instanceof ArtifactContractDeploymentFutureImplementation + ) { + this._overwriteReadonly( + future, + "constructorArgs", + future.constructorArgs.map((arg) => + this._deserializeArg(arg, partialFutureLookup) + ) + ); + + this._overwriteReadonly( + future, + "libraries", + this._deserializeLibraries( + (serializedFuture as SerializedArtifactContractDeploymentFuture) + .libraries, + partialFutureLookup + ) + ); + } else if (future instanceof NamedLibraryDeploymentFutureImplementation) { + this._overwriteReadonly( + future, + "libraries", + this._deserializeLibraries( + (serializedFuture as SerializedNamedLibraryDeploymentFuture) + .libraries, + partialFutureLookup + ) + ); + } else if ( + future instanceof ArtifactLibraryDeploymentFutureImplementation + ) { + this._overwriteReadonly( + future, + "libraries", + this._deserializeLibraries( + (serializedFuture as SerializedArtifactLibraryDeploymentFuture) + .libraries, + partialFutureLookup + ) + ); + } else if (future instanceof NamedContractCallFutureImplementation) { + this._overwriteReadonly( + future, + "args", + future.args.map((arg) => + this._deserializeArg(arg, partialFutureLookup) + ) + ); + + this._overwriteReadonly( + future, + "contract", + partialFutureLookup[ + (serializedFuture as SerializedNamedContractCallFuture).contract + .futureId + ] as ContractFuture + ); + } else if (future instanceof NamedStaticCallFutureImplementation) { + this._overwriteReadonly( + future, + "args", + future.args.map((arg) => + this._deserializeArg(arg, partialFutureLookup) + ) + ); + + this._overwriteReadonly( + future, + "contract", + partialFutureLookup[ + (serializedFuture as SerializedNamedContractCallFuture).contract + .futureId + ] as ContractFuture + ); + } else if (future instanceof ContractAtFutureImplementation) { + // no future specific tokens to resolve + } else { + throw new IgnitionError( + `unknown future type: ${FutureType[future.type]}` + ); + } + } + + return partialFutureLookup; + } + + private static _deserializePartialModule( + serializedModule: SerializedStoredModule, + allPartialFutures: { + [key: string]: Future; + } + ): IgnitionModule> { + const results = this._deserializeResultsFrom( + serializedModule.results, + allPartialFutures + ); + + const module = new IgnitionModuleImplementation( + serializedModule.id, + results as IgnitionModuleResult<""> + ); + + const futures = [ + ...new Set(Object.values(serializedModule.futures).map(({ id }) => id)), + ].map((id) => allPartialFutures[id]); + + this._overwriteReadonly(module, "futures", new Set(futures)); + + return module; + } + + private static _recursivelyRewireFuturesToParentModule( + partialModules: Array< + IgnitionModule> + > + ): void { + for (const partialModule of partialModules) { + for (const future of partialModule.futures) { + future.module = partialModule; + } + } + } + + private static _deserializeLibraries( + libraries: SerializedLibraries, + partialFutureLookup: { + [k: string]: Future; + } + ): Record> { + return Object.fromEntries( + Object.entries(libraries).map(([key, token]) => [ + key, + partialFutureLookup[token.futureId] as ContractFuture, + ]) + ); + } + + /** + * Oh you think you can defeat me typesystem. I don't acknowledge + * your _readonly_. + */ + private static _overwriteReadonly( + obj: O, + property: P, + value: V + ) { + obj[property] = value; + } + + private static _serializeModule( + userModule: IgnitionModule> + ): SerializedStoredModule { + return { + id: userModule.id, + futures: Object.fromEntries( + Array.from(userModule.futures).map((future) => [ + future.id, + this._serializeFuture(future), + ]) + ), + submodules: Array.from(userModule.submodules).map( + this._convertModuleToModuleToken + ), + results: Object.fromEntries( + Object.entries(userModule.results).map(([key, future]) => [ + key, + this._convertFutureToFutureToken(future), + ]) + ), + }; + } + + private static _serializeFuture(future: Future): SerializedFuture { + const serialized: PartialSerializedFuture = { + ...future, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + }; + + delete serialized.module; + + if (future instanceof NamedContractDeploymentFutureImplementation) { + const serializedNamedContract: SerializedNamedContractDeploymentFuture = { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + constructorArgs: future.constructorArgs.map((arg) => + StoredDeploymentSerializer._convertArgToFutureToken(arg) + ), + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + }; + + return serializedNamedContract; + } else if ( + future instanceof ArtifactContractDeploymentFutureImplementation + ) { + const serializedArtifactContractDeploy: SerializedArtifactContractDeploymentFuture = + { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + constructorArgs: future.constructorArgs.map((arg) => + this._convertArgToFutureToken(arg) + ), + artifact: future.artifact, + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + }; + + return serializedArtifactContractDeploy; + } else if (future instanceof NamedLibraryDeploymentFutureImplementation) { + const serializedNamedLibraryDeploy: SerializedNamedLibraryDeploymentFuture = + { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + libraries: + StoredDeploymentSerializer._convertLibrariesToLibraryTokens( + future.libraries + ), + }; + + return serializedNamedLibraryDeploy; + } else if ( + future instanceof ArtifactLibraryDeploymentFutureImplementation + ) { + const serializedArtifactLibraryDeploy: SerializedArtifactLibraryDeploymentFuture = + { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + artifact: future.artifact, + libraries: + StoredDeploymentSerializer._convertLibrariesToLibraryTokens( + future.libraries + ), + }; + + return serializedArtifactLibraryDeploy; + } else if (future instanceof NamedContractCallFutureImplementation) { + const serializedNamedContractCall: SerializedNamedContractCallFuture = { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contract: this._convertFutureToFutureToken(future.contract), + functionName: future.functionName, + args: Array.from(future.args).map( + StoredDeploymentSerializer._convertArgToFutureToken + ), + }; + + return serializedNamedContractCall; + } else if (future instanceof NamedStaticCallFutureImplementation) { + const serializedNamedStaticCallFuture: SerializedNamedStaticCallFuture = { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contract: this._convertFutureToFutureToken(future.contract), + functionName: future.functionName, + args: Array.from(future.args).map( + StoredDeploymentSerializer._convertArgToFutureToken + ), + }; + + return serializedNamedStaticCallFuture; + } else if (future instanceof ContractAtFutureImplementation) { + const serializedContractAtFuture: SerializedContractAtFuture = { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + address: future.address, + artifact: future.artifact, + }; + + return serializedContractAtFuture; + } else { + throw new IgnitionError( + `Unknown future type while serializing: ${FutureType[future.type]}` + ); + } + } + + private static _convertLibrariesToLibraryTokens( + libraries: Record> + ): SerializedLibraries { + return Object.fromEntries( + Object.entries(libraries).map(([key, lib]) => [ + key, + this._convertFutureToFutureToken(lib), + ]) + ); + } + + private static _deserializeResultsFrom( + serializedResults: SerializedStoredResults, + futures: { [key: string]: Future } + ): IgnitionModuleResult<""> { + const results = Object.fromEntries( + Object.entries(serializedResults).map(([key, futureToken]) => [ + key, + futures[futureToken.futureId], + ]) + ); + + return results as IgnitionModuleResult<"">; + } + + private static _deserializePartialFuture( + serializedFuture: SerializedFuture + ): Future { + const placeholderModule = new IgnitionModuleImplementation( + "PLACEHOLDER", + {} + ); + + switch (serializedFuture.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return new NamedContractDeploymentFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + serializedFuture.constructorArgs, + {} + ); + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return new ArtifactContractDeploymentFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + serializedFuture.constructorArgs, + serializedFuture.artifact, + {} + ); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return new NamedLibraryDeploymentFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + {} + ); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return new ArtifactLibraryDeploymentFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + serializedFuture.artifact, + {} + ); + case FutureType.NAMED_CONTRACT_CALL: + return new NamedContractCallFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.functionName, + serializedFuture.contract as any, + serializedFuture.args + ); + case FutureType.NAMED_STATIC_CALL: + return new NamedStaticCallFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.functionName, + serializedFuture.contract as any, + serializedFuture.args + ); + case FutureType.CONTRACT_AT: + return new ContractAtFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + serializedFuture.address, + serializedFuture.artifact + ); + } + } + + private static _convertArgToFutureToken( + arg: number | string | Future + ): number | string | FutureToken { + if (!isFuture(arg)) { + return arg; + } + + return StoredDeploymentSerializer._convertFutureToFutureToken(arg); + } + + private static _convertFutureToFutureToken(future: Future): FutureToken { + return { + futureId: future.id, + _kind: "FutureToken", + }; + } + + private static _convertModuleToModuleToken( + m: IgnitionModule> + ): ModuleToken { + return { + moduleId: m.id, + _kind: "ModuleToken", + }; + } + + private static _deserializeArg( + arg: number | string | FutureToken, + futureLookup: { + [key: string]: Future; + } + ) { + if (!StoredDeploymentSerializer._isSerializedFutureToken(arg)) { + return arg; + } + + const swappedFuture = futureLookup[arg.futureId]; + + if (swappedFuture === undefined) { + throw new IgnitionError( + `Unable to lookup future during deserialization: ${arg.futureId}` + ); + } + + return swappedFuture; + } + + private static _isSerializedFutureToken( + arg: SerializedSolidityParamType + ): arg is FutureToken { + if (!Boolean(arg) || typeof arg === "string" || typeof arg === "number") { + return false; + } + + return arg._kind === "FutureToken"; + } + + private static _getModulesAndSubmoduleFor( + module: IgnitionModule> + ): Array>> { + return [module].concat( + Array.from(module.submodules).flatMap((sm) => + this._getModulesAndSubmoduleFor(sm) + ) + ); + } + + private static _getAllFuturesFor( + deployment: SerializedStoredDeployment + ): SerializedFuture[] { + return Object.values(deployment.modules).flatMap((m) => + Object.values(m.futures) + ); + } +} diff --git a/packages/core/src/new-api/stubs.ts b/packages/core/src/new-api/stubs.ts index 1746b88b02..65ad836e91 100644 --- a/packages/core/src/new-api/stubs.ts +++ b/packages/core/src/new-api/stubs.ts @@ -1,2 +1,13 @@ +/** + * The composite type of a solidity methods parameters. + * + * @beta + */ export type SolidityParamsType = any[]; + +/** + * The artifact of a contract compilation. + * + * @beta + */ export type ArtifactType = any[]; diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 9fff202df8..cd8f6d487f 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -13,6 +13,11 @@ import { NamedStaticCallFuture, } from "./module"; +/** + * The definition used to construct an Ignition module. + * + * @beta + */ export interface IgnitionModuleDefinition< ModuleIdT extends string, ContractNameT extends string, @@ -22,45 +27,85 @@ export interface IgnitionModuleDefinition< moduleDefintionFunction: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT; } +/** + * The options for a `ContractOptions` call. + * + * @beta + */ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; } +/** + * The options for a `contractFromArtifact` call. + * + * @beta + */ export interface ContractFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; } +/** + * The options for a `library` call. + * + * @beta + */ export interface LibraryOptions { id?: string; after?: Future[]; libraries?: Record>; } +/** + * The options for a `libraryFromArtifact` call. + * + * @beta + */ export interface LibraryFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; } +/** + * The options for a `call` call. + * + * @beta + */ export interface CallOptions { id?: string; after?: Future[]; } +/** + * The options for a `staticCall` call. + * + * @beta + */ export interface StaticCallOptions { id?: string; after?: Future[]; } +/** + * The options for a `contractAt` call. + * + * @beta + */ export interface ContractAtOptions { id?: string; after?: Future[]; } +/** + * The build api for configuring a deployment within a module. + * + * @beta + */ export interface IgnitionModuleBuilder { chainId: number; accounts: string[]; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 055044c935..55b50b62ea 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,5 +1,10 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; +/** + * The different future types supported by Ignition. + * + * @beta + */ export enum FutureType { NAMED_CONTRACT_DEPLOYMENT, ARTIFACT_CONTRACT_DEPLOYMENT, @@ -10,6 +15,11 @@ export enum FutureType { CONTRACT_AT, } +/** + * The unit of execution in an Ignition deploy. + * + * @beta + */ // eslint-disable-next-line @typescript-eslint/no-unused-vars export interface Future { id: string; // Unique identifier of a future. My current proposal ":" @@ -25,31 +35,32 @@ export interface Future { dependencies: Set; } -// A future representing a contract. Either an existing one or one that will be deployed +/** + * A future representing a contract. Either an existing one or one + * that will be deployed. + * + * @beta + */ export interface ContractFuture extends Future { contractName: ContractNameT; } -// A future representing a call. Either a static one or one that modifies contract state +/** + * A future representing a call. Either a static one or one that modifies contract state + * + * @beta + */ export interface FunctionCallFuture extends Future { functionName: FunctionNameT; } -// A future representing a call. Either a static one or one that modifies contract state -export interface FunctionCallFuture - extends Future { - functionName: FunctionNameT; -} - -// A future representing a call. Either a static one or one that modifies contract state -export interface FunctionCallFuture - extends Future { - functionName: FunctionNameT; -} - -// A future representing the deployment of a contract that belongs to this project +/** + * A future representing the deployment of a contract that belongs to this project. + * + * @beta + */ export interface NamedContractDeploymentFuture extends ContractFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; @@ -57,8 +68,12 @@ export interface NamedContractDeploymentFuture libraries: Record>; } -// A future representing the deployment of a contract that we only know its artifact. -// It may not belong to this project, and we may struggle to type. +/** + * A future representing the deployment of a contract that we only know its artifact. + * It may not belong to this project, and we may struggle to type. + * + * @beta + */ export interface ArtifactContractDeploymentFuture extends ContractFuture { type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; @@ -67,15 +82,23 @@ export interface ArtifactContractDeploymentFuture libraries: Record>; } -// A future representing the deployment of a library that belongs to this project +/** + * A future representing the deployment of a library that belongs to this project + * + * @beta + */ export interface NamedLibraryDeploymentFuture extends ContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; libraries: Record>; } -// A future representing the deployment of a library that we only know its artifact. -// It may not belong to this project, and we may struggle to type. +/** + * A future representing the deployment of a library that we only know its artifact. + * It may not belong to this project, and we may struggle to type. + * + * @beta + */ export interface ArtifactLibraryDeploymentFuture extends ContractFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; @@ -83,55 +106,11 @@ export interface ArtifactLibraryDeploymentFuture libraries: Record>; } -// A future representing the calling of a contract function that modifies on-chain state -export interface NamedContractCallFuture< - ContractNameT extends string, - FunctionNameT extends string -> extends FunctionCallFuture { - type: FutureType.NAMED_CONTRACT_CALL; - contract: ContractFuture; - args: SolidityParamsType; -} - -// A future representing the static calling of a contract function that does not modify state -export interface NamedStaticCallFuture< - ContractNameT extends string, - FunctionNameT extends string -> extends FunctionCallFuture { - type: FutureType.NAMED_STATIC_CALL; - contract: ContractFuture; - args: SolidityParamsType; -} - -// A future representing the calling of a contract function that modifies on-chain state -export interface NamedContractCallFuture< - ContractNameT extends string, - FunctionNameT extends string -> extends FunctionCallFuture { - type: FutureType.NAMED_CONTRACT_CALL; - contract: ContractFuture; - args: SolidityParamsType; -} - -// A future representing the static calling of a contract function that does not modify state -export interface NamedStaticCallFuture< - ContractNameT extends string, - FunctionNameT extends string -> extends FunctionCallFuture { - type: FutureType.NAMED_STATIC_CALL; - contract: ContractFuture; - args: SolidityParamsType; -} - -// A future representing a previously deployed contract at a known address. -// It may not belong to this project, and we may struggle to type. -export interface ContractAtFuture extends ContractFuture { - type: FutureType.CONTRACT_AT; - address: string; - artifact: ArtifactType; -} - -// A future representing the calling of a contract function that modifies on-chain state +/** + * A future representing the calling of a contract function that modifies on-chain state + * + * @beta + */ export interface NamedContractCallFuture< ContractNameT extends string, FunctionNameT extends string @@ -141,7 +120,11 @@ export interface NamedContractCallFuture< args: SolidityParamsType; } -// A future representing the static calling of a contract function that does not modify state +/** + * A future representing the static calling of a contract function that does not modify state + * + * @beta + */ export interface NamedStaticCallFuture< ContractNameT extends string, FunctionNameT extends string @@ -151,19 +134,32 @@ export interface NamedStaticCallFuture< args: SolidityParamsType; } -// A future representing a previously deployed contract at a known address. -// It may not belong to this project, and we may struggle to type. +/** + * A future representing a previously deployed contract at a known address. + * It may not belong to this project, and we may struggle to type. + * + * @beta + */ export interface ContractAtFuture extends ContractFuture { type: FutureType.CONTRACT_AT; address: string; artifact: ArtifactType; } -// The results of deploying a module must be a dictionary of contract futures +/** + * The results of deploying a module must be a dictionary of contract futures + * + * @beta + */ export interface IgnitionModuleResult { [name: string]: ContractFuture; } +/** + * A recipe for deploying and configuring contracts. + * + * @beta + */ export interface IgnitionModule< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts new file mode 100644 index 0000000000..704091c2fc --- /dev/null +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -0,0 +1,234 @@ +import { ArtifactType } from "../stubs"; + +import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; + +/** + * The serialized version of a Solidity method parameter. + * + * @beta + */ +export type SerializedSolidityParamType = number | string | FutureToken; + +/** + * An array of serialized params. + * + * @beta + */ +export type SerializedSolidityParamsType = SerializedSolidityParamType[]; + +/** + * In serialized form a pointer to a future stored at the top level + * within the module. + * + * @beta + */ +export interface FutureToken { + futureId: string; + _kind: "FutureToken"; +} + +/** + * In serialized form a pointer to a module stored at the top level + * within the deployment. + * + * @beta + */ +export interface ModuleToken { + moduleId: string; + _kind: "ModuleToken"; +} + +/** + * The base of the different serialized futures. + * + * @beta + */ +export interface BaseSerializedFuture { + id: string; + type: FutureType; + dependencies: FutureToken[]; +} + +/** + * The serialized version of the NamedContractDeploymentFuture. + * + * @beta + */ +export interface SerializedNamedContractDeploymentFuture + extends BaseSerializedFuture { + type: FutureType.NAMED_CONTRACT_DEPLOYMENT; + contractName: string; + constructorArgs: SerializedSolidityParamsType; + libraries: SerializedLibraries; +} + +/** + * The serialized version of the ArtifactContractDeploymentFuture. + * + * @beta + */ +export interface SerializedArtifactContractDeploymentFuture + extends BaseSerializedFuture { + type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + contractName: string; + constructorArgs: SerializedSolidityParamsType; + artifact: ArtifactType; + libraries: SerializedLibraries; +} + +/** + * The serialized version of the NamedLibraryDeploymentFuture. + * + * @beta + */ +export interface SerializedNamedLibraryDeploymentFuture + extends BaseSerializedFuture { + type: FutureType.NAMED_LIBRARY_DEPLOYMENT; + contractName: string; + libraries: SerializedLibraries; +} + +/** + * The serialized version of the ArtifactLibraryDeploymentFuture. + * + * @beta + */ +export interface SerializedArtifactLibraryDeploymentFuture + extends BaseSerializedFuture { + type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + contractName: string; + artifact: ArtifactType; + libraries: SerializedLibraries; +} + +/** + * The serialized version of NamedContractCallFuture. + * + * @beta + */ +export interface SerializedNamedContractCallFuture + extends BaseSerializedFuture { + type: FutureType.NAMED_CONTRACT_CALL; + functionName: string; + contract: FutureToken; + args: SerializedSolidityParamsType; +} + +/** + * The serialized version of NamedStaticCallFuture. + * + * @beta + */ +export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { + type: FutureType.NAMED_STATIC_CALL; + functionName: string; + contract: FutureToken; + args: SerializedSolidityParamsType; +} + +/** + * The serialized version of ContractAtFuture. + * + * @beta + */ +export interface SerializedContractAtFuture extends BaseSerializedFuture { + type: FutureType.CONTRACT_AT; + contractName: string; + address: string; + artifact: ArtifactType; +} + +/** + * The details of a deployment that will be used in the UI. + * + * @beta + */ +export interface StoredDeployment { + details: { + networkName: string; + chainId: number; + }; + module: IgnitionModule>; +} + +// Serialized Deployments + +/** + * The serialized version of a complete deployment, combining the + * chain details with the module to be deployed. + * + * @beta + */ +export interface SerializedStoredDeployment { + details: { + networkName: string; + chainId: number; + }; + startModule: string; + modules: { + [key: string]: SerializedStoredModule; + }; +} + +/** + * The serialized version of an Ignition module. + * + * @beta + */ +export interface SerializedStoredModule { + id: string; + submodules: ModuleToken[]; + futures: SerializedStoredFutures; + results: SerializedStoredResults; +} + +/** + * Serialized versions of a modules used submodules. + * + * @beta + */ +export interface SerializedStoredSubmodules { + [key: string]: SerializedStoredModule; +} + +/** + * The serialized futures that are executed in deploying a module. + * + * @beta + */ +export interface SerializedStoredFutures { + [key: string]: SerializedFuture; +} + +/** + * The serialized results of a module. + * + * @beta + */ +export interface SerializedStoredResults { + [key: string]: FutureToken; +} + +/** + * The serialized libraries, where each library + * has been replaced by a token. + * + * @beta + */ +export interface SerializedLibraries { + [key: string]: FutureToken; +} + +/** + * The set of serialized future types + * + * @beta + */ +export type SerializedFuture = + | SerializedNamedContractDeploymentFuture + | SerializedArtifactContractDeploymentFuture + | SerializedNamedLibraryDeploymentFuture + | SerializedArtifactLibraryDeploymentFuture + | SerializedNamedContractCallFuture + | SerializedNamedStaticCallFuture + | SerializedContractAtFuture; diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index 04645dc017..bca8d3ad1d 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -55,7 +55,7 @@ export interface IDeploymentBuilder { call( contractFuture: DeploymentGraphFuture, functionName: string, - options: CallOptions + options: CallOptionsOld ): ContractCall; /** @@ -70,7 +70,7 @@ export interface IDeploymentBuilder { staticCall( contractFuture: DeploymentGraphFuture, functionName: string, - options: StaticCallOptions + options: StaticCallOptionsOld ): StaticContractCall; /** @@ -81,7 +81,7 @@ export interface IDeploymentBuilder { * * @alpha */ - contract(contractName: string, options?: ContractOptions): HardhatContract; + contract(contractName: string, options?: ContractOptionsOld): HardhatContract; /** * Deploy a contract based on an artifact. @@ -97,7 +97,7 @@ export interface IDeploymentBuilder { contract( contractName: string, artifact: Artifact, - options?: ContractOptions + options?: ContractOptionsOld ): ArtifactContract; /** @@ -180,7 +180,7 @@ export interface IDeploymentBuilder { * * @alpha */ - library(libraryName: string, options?: ContractOptions): HardhatLibrary; + library(libraryName: string, options?: ContractOptionsOld): HardhatLibrary; /** * Deploy a library based on an artifact. * @@ -193,7 +193,7 @@ export interface IDeploymentBuilder { library( libraryName: string, artifact: Artifact, - options?: ContractOptions + options?: ContractOptionsOld ): ArtifactLibrary; /** @@ -238,7 +238,7 @@ export interface AwaitOptions { * * @alpha */ -export interface CallOptions { +export interface CallOptionsOld { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; value?: BigNumber | ParameterFuture; @@ -250,7 +250,7 @@ export interface CallOptions { * * @alpha */ -export interface StaticCallOptions { +export interface StaticCallOptionsOld { args: InternalParamValue[]; after?: DeploymentGraphFuture[]; from?: string; @@ -261,7 +261,7 @@ export interface StaticCallOptions { * * @alpha */ -export interface ContractOptions { +export interface ContractOptionsOld { args?: InternalParamValue[]; libraries?: { [key: string]: DeploymentGraphFuture; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 1c52f881be..92d8a5d645 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -220,7 +220,7 @@ export interface ProxyFuture { * * @alpha */ -export type ContractFuture = +export type ContractFutureOld = | HardhatContract | ArtifactContract | DeployedContract; @@ -232,13 +232,20 @@ export type ContractFuture = */ export type LibraryFuture = HardhatLibrary | ArtifactLibrary; +/** + * The future representing the value of calling a smart contract method. + * + * @alpha + */ +export type CallableFuture = ContractFutureOld | LibraryFuture; + /** * A future value from an on-chain action that. * * @alpha */ export type DependableFuture = - | ContractFuture + | ContractFutureOld | LibraryFuture | ContractCall | StaticContractCall @@ -256,7 +263,7 @@ export type AddressResolvable = | string | ParameterFuture | EventParamFuture - | ContractFuture; + | ContractFutureOld; /** * The future value of a passed parameter to a Module. diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index dd92985522..50e7abfcc2 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,6 +1,6 @@ import type { ExternalParamValue } from "../types/dsl"; import type { - ContractFuture, + ContractFutureOld, LibraryFuture, ProxyFuture, Virtual, @@ -14,7 +14,7 @@ import { IDeploymentBuilder } from "./dsl"; * @alpha */ export type ModuleReturnValue = - | ContractFuture + | ContractFutureOld | LibraryFuture | Virtual | ProxyFuture; diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts new file mode 100644 index 0000000000..ee88d2d89b --- /dev/null +++ b/packages/core/src/ui-helpers.ts @@ -0,0 +1,3 @@ +export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; +export * from "./new-api/types/module"; +export * from "./new-api/types/serialized-deployment"; diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts index 58cfebbb3a..c52d40a957 100644 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ b/packages/core/test/deploymentBuilder/useModule.ts @@ -10,7 +10,7 @@ import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; import { ArtifactContract, - ContractFuture, + ContractFutureOld, EventFuture, HardhatContract, LibraryFuture, @@ -539,7 +539,7 @@ describe("deployment builder - useModule", () => { // @ts-ignore let returnsWrongFutureTypeModule: Module<{ token: - | ContractFuture + | ContractFutureOld | LibraryFuture | Virtual | ProxyFuture diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts new file mode 100644 index 0000000000..018ab98205 --- /dev/null +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -0,0 +1,573 @@ +import { assert } from "chai"; + +import { StoredDeployment, StoredDeploymentSerializer } from "../../src/index"; +import { defineModule } from "../../src/new-api/define-module"; +import { + ArtifactContractDeploymentFutureImplementation, + ArtifactLibraryDeploymentFutureImplementation, + NamedContractDeploymentFutureImplementation, + NamedLibraryDeploymentFutureImplementation, +} from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { + ContractFuture, + IgnitionModule, + IgnitionModuleResult, +} from "../../src/new-api/types/module"; + +describe("stored deployment serializer", () => { + const details = { + networkName: "hardhat", + chainId: 31117, + }; + + describe("contract", () => { + it("should serialize a contract deployment", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a contract deployments with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [contract1]); + const contract3 = m.contract("Contract3", [], { after: [contract2] }); + + return { contract1, contract2, contract3 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("contractFromArtifact", () => { + const fakeArtifact = ["FAKE ARTIFACT"]; + + it("should serialize a contractFromArtifact deployment", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a contractFromArtifact deployment with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); + + const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ + contract1, + ]); + + const contract3 = m.contractFromArtifact( + "Contract3", + fakeArtifact, + [], + { after: [contract2] } + ); + + return { contract1, contract2, contract3 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("contractAt", () => { + const fakeArtifact = ["FAKE ARTIFACT"]; + + it("should serialize a contractAt", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a contractAt with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + const contract2 = m.contractAt("Contract2", "0x0", fakeArtifact, { + after: [contract1], + }); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("library", () => { + const fakeArtifact = ["FAKE ARTIFACT"]; + + it("should serialize a library deployment", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1"); + + return { library1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a library deployment with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1"); + const library2 = m.library("Library2", { after: [library1] }); + + return { + library1, + library2, + }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a libraries passed in as libraries", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1"); + + const contract2 = m.contract("Contract2", [], { + libraries: { + Lib1: library1, + }, + }); + + const contract3 = m.contractFromArtifact( + "Contract3", + fakeArtifact, + [], + { + libraries: { + Lib1: library1, + }, + } + ); + + const library4 = m.library("Library4", { + libraries: { Lib1: library1 }, + }); + + const library5 = m.libraryFromArtifact("Library5", fakeArtifact, { + libraries: { Lib1: library1 }, + }); + + return { + library1, + contract2, + contract3, + library4, + library5, + }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("libraryFromArtifact", () => { + const fakeArtifact = ["FAKE ARTIFACT"]; + + it("should serialize a libraryFromArtifact deployment", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.libraryFromArtifact("Contract1", fakeArtifact); + + return { library1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a libraryFromArtifact deployment with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.libraryFromArtifact("Library1", fakeArtifact); + + const library2 = m.libraryFromArtifact("Library2", fakeArtifact, { + after: [library1], + }); + + return { library1, library2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("call", () => { + it("should serialize a call", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "lock", [1, "a", false]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a call with dependencies", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + m.call(contract2, "lock", [contract1]); + m.call(contract2, "unlock", [], { after: [contract1] }); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("static call", () => { + it("should serialize a call", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "lock", [1, "a", false]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a static call with dependencies", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + m.staticCall(contract2, "lock", [contract1]); + m.staticCall(contract2, "unlock", [], { after: [contract1] }); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + + describe("useModule", () => { + it("should serialize a deployment leveraging useModule", () => { + const submodule = defineModule("Submodule", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submodule); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize contract dependencies over the useModule barrier", () => { + const submodule = defineModule("Submodule", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submodule); + + const contract2 = m.contract("Contract2", [contract1]); + const contract3 = m.contract("Contract3", [], { after: [contract1] }); + + return { contract1, contract2, contract3 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a diamond useModule", () => { + const bottomModuleDefinition = defineModule("BottomModule", (m) => { + const bottomContract = m.contract("Contract1"); + + return { bottomContract }; + }); + + const leftModuleDefinition = defineModule("LeftModule", (m) => { + const { bottomContract } = m.useModule(bottomModuleDefinition); + + return { leftContract: bottomContract }; + }); + + const rightModuleDefinition = defineModule("RightModule", (m) => { + const { bottomContract } = m.useModule(bottomModuleDefinition); + + return { rightContract: bottomContract }; + }); + + const moduleDefinition = defineModule("TopModule", (m) => { + const { leftContract } = m.useModule(leftModuleDefinition); + const { rightContract } = m.useModule(rightModuleDefinition); + + return { leftContract, rightContract }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + const deployment = { + details, + module, + }; + + assertSerializableModuleIn(deployment); + + const reserialized = StoredDeploymentSerializer.deserialize( + JSON.parse( + JSON.stringify(StoredDeploymentSerializer.serialize(deployment)) + ) + ); + + const lc = reserialized.module.results.leftContract; + const rc = reserialized.module.results.rightContract; + + assert.equal(lc, rc); + }); + }); +}); + +function assertSerializableModuleIn(deployment: StoredDeployment) { + const serialized = JSON.stringify( + StoredDeploymentSerializer.serialize(deployment) + ); + + const reserialized = JSON.stringify( + StoredDeploymentSerializer.serialize( + StoredDeploymentSerializer.deserialize(JSON.parse(serialized)) + ) + ); + + assert.equal( + serialized, + reserialized, + "Module not the same across serialization/deserialization" + ); + + // Invariants + + const ignitionModule = StoredDeploymentSerializer.deserialize( + JSON.parse(reserialized) + ).module; + + assert( + Object.values(ignitionModule.results).every((result) => + hasFutureInModuleOrSubmoduleOf(ignitionModule, result) + ), + "All results should be futures of the module or one of its submodules" + ); + + assert( + allFuturesHaveModuleIn(ignitionModule), + "All of the modules futures should have their parent module as the linked module" + ); + + // All constructor args have been swapped out + assert( + Array.from(ignitionModule.futures).every((future) => { + if (future instanceof NamedContractDeploymentFutureImplementation) { + return noFutureTokensIn(future.constructorArgs); + } + + if (future instanceof ArtifactContractDeploymentFutureImplementation) { + return noFutureTokensIn(future.constructorArgs); + } + + return true; + }), + "All constructor args should have had their token futures swapped out for actual futures" + ); + + // All libraries have been swapped out + assert( + Array.from(ignitionModule.futures).every((future) => { + if (future instanceof NamedContractDeploymentFutureImplementation) { + return noFutureTokensInLibraries(future.libraries); + } + + if (future instanceof ArtifactContractDeploymentFutureImplementation) { + return noFutureTokensInLibraries(future.libraries); + } + + if (future instanceof NamedLibraryDeploymentFutureImplementation) { + return noFutureTokensInLibraries(future.libraries); + } + + if (future instanceof ArtifactLibraryDeploymentFutureImplementation) { + return noFutureTokensInLibraries(future.libraries); + } + + return true; + }), + "All libraries should have had their token futures swapped out for actual futures" + ); + + // All dependencies have been swapped out + assert( + Array.from(ignitionModule.futures).every((future) => { + return noFutureTokensIn(Array.from(future.dependencies)); + }), + "All future dependencies should have had their token futures swapped out for actual futures" + ); +} + +function noFutureTokensIn(list: any[]): boolean { + return list.every((arg) => Boolean(arg) && arg._kind !== "FutureToken"); +} + +function noFutureTokensInLibraries(libs: { [key: string]: any }): boolean { + return Object.values(libs).every( + (arg) => Boolean(arg) && arg._kind !== "FutureToken" + ); +} + +function hasFutureInModuleOrSubmoduleOf( + ignitionModule: IgnitionModule>, + future: ContractFuture +): unknown { + if (ignitionModule.futures.has(future)) { + return true; + } + + return Array.from(ignitionModule.submodules).some((submodule) => + hasFutureInModuleOrSubmoduleOf(submodule, future) + ); +} + +function allFuturesHaveModuleIn( + ignitionModule: IgnitionModule> +): boolean { + if ( + Array.from(ignitionModule.futures).some( + (future) => + future.module.id === "PLACEHOLDER" && future.module !== ignitionModule + ) + ) { + return false; + } + + return Array.from(ignitionModule.submodules).every((submodule) => + allFuturesHaveModuleIn(submodule) + ); +} diff --git a/packages/hardhat-plugin/esbuild.js b/packages/hardhat-plugin/esbuild.js deleted file mode 100644 index 63db0aa736..0000000000 --- a/packages/hardhat-plugin/esbuild.js +++ /dev/null @@ -1,33 +0,0 @@ -const esbuild = require("esbuild"); -const fs = require("fs-extra"); -const path = require("path"); - -const outdir = path.resolve(__dirname, "dist/src/plan/assets"); -const srcdir = path.resolve(__dirname, "src/plan/assets"); - -const entryPoints = fs.readdirSync(srcdir).flatMap((f) => { - const p = `${srcdir}/${f}`; - - if (/\./.test(f)) { - return p; - } - - return fs.readdirSync(p).map((v) => `${p}/${v}`); -}); - -const main = async () => { - await esbuild.build({ - outdir, - entryPoints, - bundle: true, - loader: { - ".html": "copy", - ".png": "copy", - }, - }); -}; - -main().catch((err) => { - console.error(err); - process.exit(1); -}); diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 98f35efa35..5a7a273968 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -21,7 +21,7 @@ "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "scripts": { - "build": "tsc --build && node ./esbuild.js", + "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", @@ -34,6 +34,7 @@ }, "devDependencies": { "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-ui": "^0.0.13", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -72,6 +73,7 @@ }, "peerDependencies": { "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-ui": "^0.0.13", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" }, diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 90de4e2ef6..421ace1abd 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,10 @@ +import { + Module, + ModuleConstructor, + ModuleDict, + ModuleParams, +} from "@ignored/ignition-core"; import "@nomiclabs/hardhat-ethers"; -import { Module, ModuleDict, ModuleParams } from "@ignored/ignition-core"; import { BigNumber } from "ethers"; import fs from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; @@ -10,11 +15,12 @@ import prompts from "prompts"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; -import { Renderer } from "./plan"; +import { writePlan } from "./plan/write-plan"; import "./type-extensions"; import { renderInfo } from "./ui/components/info"; +import { open } from "./utils/open"; -export { buildModule } from "@ignored/ignition-core"; +export { buildModule, defineModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; @@ -178,7 +184,8 @@ task("plan") ) => { await hre.run("compile", { quiet: true }); - const userModule: Module | undefined = loadModule( + // TODO: alter loadModule to return new-api modules at type level + const userModule: any = loadModule( hre.config.paths.ignition, moduleNameOrPath ); @@ -188,21 +195,40 @@ task("plan") process.exit(0); } - const plan = await hre.ignition.plan(userModule); + const chainId = Number( + await hre.network.provider.request({ + method: "eth_chainId", + }) + ); - const renderer = new Renderer(userModule.name, plan, { - cachePath: hre.config.paths.cache, - network: { - name: (plan as { networkName: string }).networkName, - id: hre.network.config.chainId ?? "unknown", - }, - }); + const accounts = (await hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; - renderer.write(); + const constructor = new ModuleConstructor(chainId, accounts); + const module = constructor.construct(userModule); + + await writePlan( + { + details: { + networkName: hre.network.name, + chainId, + }, + module, + }, + { cacheDir: hre.config.paths.cache } + ); if (!quiet) { - console.log(`Plan written to ${renderer.planPath}/index.html`); - renderer.open(); + const indexFile = path.join( + hre.config.paths.cache, + "plan", + "index.html" + ); + + console.log(`Plan written to ${indexFile}`); + + open(indexFile); } } ); diff --git a/packages/hardhat-plugin/src/plan/assets/bundle.ts b/packages/hardhat-plugin/src/plan/assets/bundle.ts deleted file mode 100644 index f4c40b8f7c..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/bundle.ts +++ /dev/null @@ -1,39 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import mermaid from "mermaid"; - -/* setup mermaid */ -mermaid.initialize({ startOnLoad: true, securityLevel: "loose" }); - -window.onload = () => { - /* setup event listeners */ - const nodes = document.getElementsByClassName("node"); - - for (const vertexElement of nodes) { - const classList = [...vertexElement.classList.values()]; - - for (const className of classList) { - if ( - /^(deploy-contract|deploy-library|call|transfer|event)/.test(className) - ) { - const actionElement = document.getElementById(`action-${className}`); - const vertexClassString = [...classList, "hovering"].join(" "); - - function addHover() { - vertexElement.setAttribute("class", vertexClassString); - actionElement!.setAttribute("class", "hovering"); - } - - function removeHover() { - vertexElement.setAttribute("class", classList.join(" ")); - actionElement!.removeAttribute("class"); - } - - vertexElement.addEventListener("mouseover", addHover); - actionElement!.addEventListener("mouseover", addHover); - - vertexElement.addEventListener("mouseleave", removeHover); - actionElement!.addEventListener("mouseleave", removeHover); - } - } - } -}; diff --git a/packages/hardhat-plugin/src/plan/assets/main.css b/packages/hardhat-plugin/src/plan/assets/main.css deleted file mode 100644 index 4b0cbd3845..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/main.css +++ /dev/null @@ -1,85 +0,0 @@ -@import url("../../../../../node_modules/purecss/build/pure-min.css"); - -.title-bar, -.summary, -.plan { - margin: 1rem; -} - -.summary, -.plan { - border: 1px solid black; - padding: 1rem; -} - -.summary-lists { - font-size: 90%; -} - -.summary-lists ul { - list-style-type: none; - padding-inline-start: 1em; -} - -.mermaid { - text-align: center; -} - -.network-info { - text-align: right; -} - -ul.actions { - list-style-type: none; - margin: 0; - padding: 0; -} - -ul.actions > li { - padding: 1rem 0.5rem; - margin: 0.5rem auto; - border: 1px solid black; - cursor: pointer; -} - -/* default deploy & call styles for nodes and actions */ -[id^="action-deploy"] { - background-color: green; -} - -[id^="action-call"] { - background-color: yellow; -} - -[id^="action-transfer"] { - background-color: orange; -} - -[id^="action-event"] { - background-color: cyan; -} - -[class*="deploy-"] > rect { - fill: green !important; -} - -[class*="call-"] > rect { - fill: yellow !important; -} - -[class*="transfer-"] > rect { - fill: orange !important; -} - -[class*="event-"] > rect { - fill: cyan !important; -} - -/* style for nodes & actions when hovered */ -.hovering > rect { - fill: blue !important; -} - -li.hovering { - background-color: blue; -} diff --git a/packages/hardhat-plugin/src/plan/assets/templates/index.html b/packages/hardhat-plugin/src/plan/assets/templates/index.html deleted file mode 100644 index afc8dfae03..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/templates/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - -
    %title%
    -
    %summary%
    -
    %plan%
    - - - diff --git a/packages/hardhat-plugin/src/plan/assets/templates/plan.html b/packages/hardhat-plugin/src/plan/assets/templates/plan.html deleted file mode 100644 index 59d02950d4..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/templates/plan.html +++ /dev/null @@ -1,13 +0,0 @@ -
    -
    -

    Plan

    -
    - -
    %mermaid%
    - -
    -

    Actions

    - - %actions% -
    -
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/summary.html b/packages/hardhat-plugin/src/plan/assets/templates/summary.html deleted file mode 100644 index 2b30d4f9c3..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/templates/summary.html +++ /dev/null @@ -1,18 +0,0 @@ -
    -
    -

    Summary

    -
    -
    -

    Network: %networkName% (%networkId%)

    -
    - -
    -

    The successful completion of the plan will send %txTotal%:

    -
    - -
    -
    %summaryLists%
    -
    - -
    -
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/title.html b/packages/hardhat-plugin/src/plan/assets/templates/title.html deleted file mode 100644 index 9dda31cc2e..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/templates/title.html +++ /dev/null @@ -1,5 +0,0 @@ -
    -
    -

    Ignition - %moduleName%

    -
    -
    diff --git a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html b/packages/hardhat-plugin/src/plan/assets/templates/vertex.html deleted file mode 100644 index c6f36d6a77..0000000000 --- a/packages/hardhat-plugin/src/plan/assets/templates/vertex.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - -
    -
    -

    %typeText% - %label%

    -
    -
    -
    -
    -
    -

    Summary

    -
    -
    -

    Network: %networkName% (%networkId%)

    -
    - -
    -

    Transaction data

    -
    - -
    Params: %params%
    - -
    Value: %value%
    -
    -
    - - diff --git a/packages/hardhat-plugin/src/plan/index.ts b/packages/hardhat-plugin/src/plan/index.ts deleted file mode 100644 index 95549192ef..0000000000 --- a/packages/hardhat-plugin/src/plan/index.ts +++ /dev/null @@ -1,208 +0,0 @@ -import type { IgnitionPlan } from "@ignored/ignition-core"; - -import { LegacyIgnitionPlan } from "@ignored/ignition-core/soon-to-be-removed"; -import { exec } from "child_process"; -import { ethers } from "ethers"; -import fs from "fs-extra"; -import os from "os"; -import path from "path"; - -import * as utils from "./utils"; - -/** - * file structure output: - * - * cache/ - * plan/ - * execution/ - * .html - * module/ - * .html - * index.html - */ - -interface RendererConfig { - cachePath: string; - network: NetworkSettings; -} - -interface NetworkSettings { - name: string; - id: number | string; -} - -interface LoadedTemplates { - [name: string]: string; -} - -const regex = /%(\w+)%/g; - -export class Renderer { - private _templates: LoadedTemplates = {}; - private _plan: LegacyIgnitionPlan; - - constructor( - public moduleName: string, - plan: IgnitionPlan, - public config: RendererConfig - ) { - this._plan = plan as LegacyIgnitionPlan; - // ensure `plan` file structure once on construction - // so we don't have to before every write function later - this._ensureDirectoryStructure(); - } - - public write(): void { - this._loadHTMLAssets(); - - // title bar - const title = this._templates.title.replace( - regex, - utils.replacer({ moduleName: this.moduleName }) - ); - - // summary - const networkName = this.config.network.name; - const networkId = this.config.network.id as string; - const txTotal = utils.getTxTotal(this._plan.deploymentGraph); - const summaryLists = utils.getSummaryLists(this._plan.deploymentGraph); - const summary = this._templates.summary.replace( - regex, - utils.replacer({ networkName, networkId, txTotal, summaryLists }) - ); - - // plan - const mermaid = utils.wrapInMermaidDiv( - utils.graphToMermaid(this._plan.deploymentGraph) - ); - const actions = utils.getActions(this._plan.deploymentGraph); - const plan = this._templates.plan.replace( - regex, - utils.replacer({ mermaid, actions }) - ); - - // index.html - const mainOutput = this._templates.index.replace( - regex, - utils.replacer({ title, summary, plan }) - ); - - this._writeMainHTML(mainOutput); - - for (const vertex of this._plan.deploymentGraph.vertexes.values()) { - const type = utils.parseType(vertex); - const typeText = utils.toTypeText(type); - const label = vertex.label; - - const params = utils.getParams(vertex); - - let value: string = "None"; - if ("value" in vertex) { - if ("type" in vertex.value) { - value = `Future < ${vertex.value.label} > value parameter`; - } else { - value = ethers.utils.formatEther(vertex.value); - } - } - - const vertexOutput = this._templates.vertex.replace( - regex, - utils.replacer({ - type, - typeText, - label, - networkName, - networkId, - params, - value, - }) - ); - - this._writeModuleHTML(vertex.id, vertexOutput); - this._writeDebugJSON(vertex.id, JSON.stringify(vertex, null, 2)); - } - } - - /** - * opens the main `plan` file in the user's default browser - * - * assumes Renderer.write() was called before this - */ - public open(): void { - let command: string; - switch (os.platform()) { - case "win32": - command = "start"; - break; - case "darwin": - command = "open"; - break; - default: - command = "xdg-open"; - } - - exec(`${command} ${path.resolve(this.planPath, "index.html")}`); - } - - public get planPath(): string { - return path.resolve(this.config.cachePath, "plan"); - } - - public get modulePath(): string { - return path.resolve(this.planPath, "module"); - } - - public get executionPath(): string { - return path.resolve(this.planPath, "execution"); - } - - private get _assetsPath(): string { - return path.resolve(__dirname, "assets"); - } - - private get _templatesPath(): string { - return path.resolve(this._assetsPath, "templates"); - } - - private _writeModuleHTML(id: number, text: string): void { - fs.writeFileSync(`${this.modulePath}/${id}.html`, text, "utf8"); - } - - private _writeMainHTML(text: string): void { - fs.writeFileSync(`${this.planPath}/index.html`, text, "utf8"); - } - - private _writeDebugJSON(id: number, text: string): void { - fs.writeFileSync(`${this.modulePath}/${id}.json`, text, "utf8"); - } - - private _loadHTMLAssets(): void { - const templateFiles = fs.readdirSync(this._templatesPath); - - for (const file of templateFiles) { - this._templates[file.split(".")[0]] = fs.readFileSync( - `${this._templatesPath}/${file}`, - "utf8" - ); - } - } - - private _copyUserAssets(): void { - const filenames = fs.readdirSync(this._assetsPath); - for (const file of filenames) { - // the .ts logic is only so that `bundle.ts` isn't copied during end-to-end tests - if (file !== "templates" && !file.endsWith(".ts")) { - fs.copyFileSync( - `${this._assetsPath}/${file}`, - `${this.planPath}/${file}` - ); - } - } - } - - private _ensureDirectoryStructure(): void { - fs.ensureDirSync(this.modulePath); - fs.ensureDirSync(this.executionPath); - this._copyUserAssets(); - } -} diff --git a/packages/hardhat-plugin/src/plan/utils.ts b/packages/hardhat-plugin/src/plan/utils.ts deleted file mode 100644 index 8871049d50..0000000000 --- a/packages/hardhat-plugin/src/plan/utils.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { - DeploymentGraphVertex, - VertexDescriptor, - VertexGraph, -} from "@ignored/ignition-core/soon-to-be-removed"; - -type DisplayType = - | "deploy-contract" - | "deploy-library" - | "call" - | "static-call" - | "transfer" - | "event"; - -export function parseType(v: VertexDescriptor): DisplayType { - const depVertex = v as DeploymentGraphVertex; - switch (depVertex.type) { - case "HardhatContract": - case "ArtifactContract": - case "DeployedContract": - return "deploy-contract"; - case "HardhatLibrary": - case "ArtifactLibrary": - return "deploy-library"; - case "Call": - return "call"; - case "StaticCall": - return "static-call"; - case "SendETH": - return "transfer"; - case "Event": - return "event"; - case "Virtual": - throw new Error("Virtual vertex unexpected in plan"); - } -} - -function getVertexes(graph: VertexGraph): VertexDescriptor[] { - return [...graph.vertexes.values()]; -} - -function plural(s: string, n: number): string { - return `${s}${n === 1 ? "" : "s"}`; -} - -function li(s: string): string { - return `
  • ${s}
  • `; -} - -function ul(a: string[]): string { - return ` -
      - ${a.join("\n")} -
    `; -} - -export function getTxTotal(graph: VertexGraph): string { - const vertexes = getVertexes(graph); - - const length = vertexes.length; - - return `${length} ${plural("transaction", length)}`; -} - -export function getSummaryLists(graph: VertexGraph): string { - const vertexes = getVertexes(graph); - - const obj: { [k: string]: string[] } = {}; - - let cols = 0; - for (const vertex of vertexes) { - const type = parseType(vertex); - - if (obj[type] === undefined) { - cols++; - obj[type] = []; - } - - obj[type].push(li(vertex.label)); - } - - const output = []; - for (const [type, value] of Object.entries(obj)) { - const item = ` -
    - ${value.length} contract ${plural(type, value.length)} - ${ul(value)} -
    -`; - output.push(item); - } - - return output.join("\n"); -} - -function wrapNode(v: VertexDescriptor): string { - return `${v.id}[${v.label}]:::${parseType(v)}-${v.id}`; -} - -export function graphToMermaid(graph: VertexGraph): string { - const vertexes = getVertexes(graph); - - const nodeDefinitions = vertexes.map(wrapNode).join("\n"); - - const connectionDefinitions = graph - .getEdges() - .map(({ from, to }) => `${from} --> ${to}`) - .join("\n"); - - const linkDefinitions = vertexes - .map((v) => `click ${v.id} "module/${v.id}.html" _self`) - .join("\n"); - - return ` -flowchart -${nodeDefinitions} -${connectionDefinitions} -${linkDefinitions} -`; -} - -export function wrapInMermaidDiv(text: string): string { - return ` -
    - ${text} -
    -`; -} - -export function toTypeText(type: DisplayType) { - switch (type) { - case "deploy-contract": - return "Contract deploy"; - case "deploy-library": - return "Library deploy"; - case "call": - return "Contract call"; - case "static-call": - return "Static contract call"; - case "transfer": - return "Transfer"; - case "event": - return "Contract event"; - } -} - -export function getActions(graph: VertexGraph): string { - const vertexes = getVertexes(graph); - - const items = vertexes.map((v) => { - const type = parseType(v); - const typeText = toTypeText(type); - - return ` -
  • - ${typeText} ${v.label} -
  • -`; - }); - - return ` -
      - ${items.join("\n")} -
    -`; -} - -export function getParams(vertex: VertexDescriptor): string { - if (vertex?.args === undefined || vertex.args.length === 0) { - return "None"; - } - - const items = vertex.args - .map( - (a: { - defaultValue: string; - _future: boolean; - label: string; - type: string; - toString: () => string; - }) => { - return `
  • ${ - a.defaultValue ?? - (a._future - ? `Future < ${a.label} > ${ - a.type === "contract" ? "address" : a.type - } parameter` - : a.toString()) - }
  • `; - } - ) - .join("\n"); - - return ` -
      - ${items} -
    -`; -} - -export function replacer(obj: { [k: string]: string }) { - return (_: string, key: string) => obj[key]; -} diff --git a/packages/hardhat-plugin/src/plan/write-plan.ts b/packages/hardhat-plugin/src/plan/write-plan.ts new file mode 100644 index 0000000000..0d6a7b908f --- /dev/null +++ b/packages/hardhat-plugin/src/plan/write-plan.ts @@ -0,0 +1,37 @@ +import { + StoredDeployment, + StoredDeploymentSerializer, +} from "@ignored/ignition-core"; +import fs from "fs-extra"; +import path from "path"; + +export async function writePlan( + storedDeployment: StoredDeployment, + { cacheDir }: { cacheDir: string } +) { + const serializedStoredDeployment = + StoredDeploymentSerializer.serialize(storedDeployment); + + const templateDir = path.join( + require.resolve("@ignored/ignition-ui/package.json"), + "../dist" + ); + + const templateDirExists = await fs.pathExists(templateDir); + + if (!templateDirExists) { + console.warn(`Unable to find template directory: ${templateDir}`); + process.exit(1); + } + + const planDir = path.join(cacheDir, "plan"); + + await fs.ensureDir(planDir); + + const indexHtml = await fs.readFile(path.join(templateDir, "index.html")); + const updatedHtml = indexHtml + .toString() + .replace('{"unloaded":true}', JSON.stringify(serializedStoredDeployment)); + + await fs.writeFile(path.join(planDir, "index.html"), updatedHtml); +} diff --git a/packages/hardhat-plugin/src/utils/open.ts b/packages/hardhat-plugin/src/utils/open.ts new file mode 100644 index 0000000000..8bfcd228d4 --- /dev/null +++ b/packages/hardhat-plugin/src/utils/open.ts @@ -0,0 +1,18 @@ +import { execSync } from "child_process"; +import os from "os"; + +export function open(filePath: string): void { + let command: string; + switch (os.platform()) { + case "win32": + command = "start"; + break; + case "darwin": + command = "open"; + break; + default: + command = "xdg-open"; + } + + execSync(`${command} ${filePath}`); +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Contracts.sol new file mode 100644 index 0000000000..03e094119f --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Contracts.sol @@ -0,0 +1,140 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} + +contract PassingValue { + constructor() payable {} + + function deposit() public payable {} +} + +contract CaptureArraysContract { + bool public arraysCaptured; + + constructor() { + arraysCaptured = false; + } + + function recordArrays( + uint256[] memory first, + string[] memory second, + bool[] memory third + ) public returns (uint256 output) { + arraysCaptured = true; + + require(first.length == 3, "Wrong number of args on first arg"); + require(first[0] == 1, "First value is wrong"); + require(first[1] == 2, "Second value is wrong"); + require(first[2] == 3, "Third value is wrong"); + + require(second.length == 3, "Wrong number of args on second arg"); + require( + keccak256(abi.encodePacked(second[0])) == + keccak256(abi.encodePacked("a")), + "First value is wrong" + ); + require( + keccak256(abi.encodePacked(second[1])) == + keccak256(abi.encodePacked("b")), + "Second value is wrong" + ); + require( + keccak256(abi.encodePacked(second[2])) == + keccak256(abi.encodePacked("c")), + "Third value is wrong" + ); + + require(third.length == 3, "Wrong number of args on third arg"); + require(third[0] == true, "First value is wrong"); + require(third[1] == false, "Second value is wrong"); + require(third[2] == true, "Third value is wrong"); + + return 1; + } +} + +contract CaptureComplexObjectContract { + bool public complexArgCaptured; + + constructor() { + complexArgCaptured = false; + } + + struct SubComplex { + string sub; + } + + struct Complex { + bool firstBool; + uint256[] secondArray; + SubComplex thirdSubcomplex; + } + + function testComplexObject( + Complex memory complexArg + ) public returns (uint256 output) { + complexArgCaptured = true; + + require(complexArg.firstBool, "bad first bool"); + + require(complexArg.secondArray.length == 3, "bad second array"); + require(complexArg.secondArray[0] == 1, "First value is wrong"); + require(complexArg.secondArray[1] == 2, "Second value is wrong"); + require(complexArg.secondArray[2] == 3, "Third value is wrong"); + + require( + keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == + keccak256(abi.encodePacked("sub")), + "The complex sub object property is wrong" + ); + + return 1; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Trace.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Trace.sol new file mode 100644 index 0000000000..1687a1d485 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Trace.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Trace { + string[] public entries; + + constructor(string memory firstEntry) { + entries = [firstEntry]; + } + + function addEntry(string memory entry) public { + entries.push(entry); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol new file mode 100644 index 0000000000..903f589c6c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +library RubbishMath { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } +} + +contract DependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/hardhat.config.js new file mode 100644 index 0000000000..39a079daef --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/hardhat.config.js @@ -0,0 +1,11 @@ +require("../../../src/index"); + +module.exports = { + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js new file mode 100644 index 0000000000..b272036d4a --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unused-modules +const { defineModule } = require("@ignored/ignition-core"); + +module.exports = defineModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 90c9b302e8..6f566913d5 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -6,10 +6,11 @@ import path from "path"; import { useEnvironment } from "../useEnvironment"; describe("plan", () => { - useEnvironment("minimal"); + // TODO: rename back to minimal api once execution switched over + useEnvironment("minimal-new-api"); it("should create a plan", async function () { - const planPath = path.resolve("../minimal/cache/plan"); + const planPath = path.resolve("../minimal-new-api/cache/plan"); fs.emptyDirSync(planPath); await this.hre.run("compile", { quiet: true }); diff --git a/packages/ui/.eslintrc.cjs b/packages/ui/.eslintrc.cjs new file mode 100644 index 0000000000..4020bcbf40 --- /dev/null +++ b/packages/ui/.eslintrc.cjs @@ -0,0 +1,14 @@ +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:react-hooks/recommended', + ], + parser: '@typescript-eslint/parser', + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': 'warn', + }, +} diff --git a/packages/ui/.gitignore b/packages/ui/.gitignore new file mode 100644 index 0000000000..01edb73388 --- /dev/null +++ b/packages/ui/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +public/deployment.json diff --git a/packages/ui/README.md b/packages/ui/README.md new file mode 100644 index 0000000000..109f5a7c22 --- /dev/null +++ b/packages/ui/README.md @@ -0,0 +1,20 @@ +# Ignition Plan UI + +The website used in Ignitions plan task for visualising a deployment. + +## Development + +A development server can be run from the root of this package with: + +```sh +npm run dev +``` + +By default in development the deployment in `./public/deployment.json` is used, +to overwrite this example deployment, update the module in +`./examples/ComplexModule.js` and run the regenerate command: + +```sh +npm run regenerate-deployment-example +``` + diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js new file mode 100644 index 0000000000..485bfc3065 --- /dev/null +++ b/packages/ui/examples/ComplexModule.js @@ -0,0 +1,51 @@ +import { defineModule } from "@ignored/ignition-core"; + +const fakeArtifact = ["fake artifact"]; + +const uniswap = defineModule("Uniswap", (m) => { + const router = m.contract("UniswapRouter", [1, 2, 3]); + + m.call(router, "configure", [3, 4, 5]); + + return { router }; +}); + +const balancerDefinition = defineModule("Balancer", (m) => { + const safeMath = m.library("SafeMath"); + + const balancer = m.contract("BalancerCore", [], { + libraries: { + SafeMath: safeMath, + }, + }); + + const { router } = m.useModule(uniswap); + + m.call(balancer, "setUniswap", [router]); + + return { balancer }; +}); + +const synthetixDefinition = defineModule("Synthetix", (m) => { + const synthetixCore = m.contractAt("SynthetixCore", "0x0123", fakeArtifact); + + const { router } = m.useModule(uniswap); + + m.call(synthetixCore, "setUniswap", [router]); + + return { synthetix: synthetixCore }; +}); + +const moduleDefinition = defineModule("MyModule", (m) => { + const { synthetix } = m.useModule(synthetixDefinition); + const { balancer } = m.useModule(balancerDefinition); + + const testHelper = m.contract("TestHelper"); + const myDefi = m.contract("MyDefi", [], { after: [synthetix, balancer] }); + + const { router } = m.useModule(uniswap); + + return { myDefi, router, synthetix, balancer, testHelper }; +}); + +export default moduleDefinition; diff --git a/packages/ui/index.html b/packages/ui/index.html new file mode 100644 index 0000000000..69895eb221 --- /dev/null +++ b/packages/ui/index.html @@ -0,0 +1,15 @@ + + + + + + Ignition + + +
    +

    Ignition deployment loading...

    +
    + + + + diff --git a/packages/ui/package.json b/packages/ui/package.json new file mode 100644 index 0000000000..51f0cb51a0 --- /dev/null +++ b/packages/ui/package.json @@ -0,0 +1,39 @@ +{ + "name": "@ignored/ignition-ui", + "private": true, + "version": "0.0.13", + "type": "module", + "scripts": { + "predev": "npm run regenerate-deployment-example", + "dev": "vite --force", + "build": "tsc && vite build", + "test": "exit 0", + "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js", + "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview", + "clean": "rimraf dist tsconfig.tsbuildinfo" + }, + "dependencies": { + "@ignored/ignition-core": "^0.0.13", + "mermaid": "10.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "6.11.0", + "styled-components": "5.3.10" + }, + "devDependencies": { + "@types/react": "^18.0.28", + "@types/react-dom": "^18.0.11", + "@types/styled-components": "5.1.26", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/parser": "^5.57.1", + "@vitejs/plugin-react": "^4.0.0", + "eslint": "^8.38.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.3.4", + "rimraf": "3.0.2", + "typescript": "^5.0.2", + "vite": "^4.3.2", + "vite-plugin-singlefile": "0.13.5" + } +} diff --git a/packages/ui/public/.gitkeep b/packages/ui/public/.gitkeep new file mode 100644 index 0000000000..ad88fa0b0f --- /dev/null +++ b/packages/ui/public/.gitkeep @@ -0,0 +1,2 @@ +# To keep the public folder that is used in vite +# Our development server dumps a `deployment.json` here. diff --git a/packages/ui/scripts/generate-example-deployment-json.js b/packages/ui/scripts/generate-example-deployment-json.js new file mode 100644 index 0000000000..22964c8eb9 --- /dev/null +++ b/packages/ui/scripts/generate-example-deployment-json.js @@ -0,0 +1,42 @@ +import { + ModuleConstructor, + StoredDeploymentSerializer, +} from "@ignored/ignition-core"; +import { writeFile } from "node:fs/promises"; + +import moduleDefinition from "../examples/ComplexModule.js"; + +const main = async () => { + await writeDeploymentJsonFor({ + details: { + chainId: 999, + networkName: "Hardhat", + }, + moduleDefinition: moduleDefinition, + }); +}; + +async function writeDeploymentJsonFor(deployment) { + const serializedDeployment = serializeDeployment(deployment); + + console.log("Deployment written to ./public/deployment.json"); + + await writeFile( + "./public/deployment.json", + JSON.stringify(serializedDeployment, undefined, 2) + ); +} + +function serializeDeployment(deployment) { + const constructor = new ModuleConstructor(deployment.details.chainId, []); + const module = constructor.construct(deployment.moduleDefinition); + + const serializedModule = StoredDeploymentSerializer.serialize({ + details: deployment.details, + module, + }); + + return serializedModule; +} + +main(); diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx new file mode 100644 index 0000000000..18138b052e --- /dev/null +++ b/packages/ui/src/components/mermaid.tsx @@ -0,0 +1,26 @@ +import React, { useEffect, useMemo } from "react"; +import styled from "styled-components"; + +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import mermaid from "mermaid"; +import { toMermaid } from "../utils/to-mermaid"; + +export const Mermaid: React.FC<{ + deployment: StoredDeployment; +}> = ({ deployment }) => { + const diagram = useMemo(() => toMermaid(deployment), [deployment]); + + useEffect(() => { + mermaid.initialize({}); + + mermaid.contentLoaded(); + }); + + return ( + +
    {diagram}
    +
    + ); +}; + +const Wrap = styled.div``; diff --git a/packages/ui/src/components/shared.tsx b/packages/ui/src/components/shared.tsx new file mode 100644 index 0000000000..1210b0ccf8 --- /dev/null +++ b/packages/ui/src/components/shared.tsx @@ -0,0 +1,16 @@ +import styled from "styled-components"; + +export const Page = styled.div` + padding: 1rem; + display: grid; + row-gap: 1rem; +`; + +export const PageTitle = styled.h1` + fontsize: 3rem; +`; + +export const Panel = styled.div` + border: 1px solid black; + padding: 1rem; +`; diff --git a/packages/ui/src/components/summary-header.tsx b/packages/ui/src/components/summary-header.tsx new file mode 100644 index 0000000000..914237601c --- /dev/null +++ b/packages/ui/src/components/summary-header.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import styled from "styled-components"; + +export const SummaryHeader: React.FC<{ + networkName: string; + chainId: number; +}> = ({ networkName, chainId }) => { + return ( +
    + Summary +
    + + Network: {networkName} ({chainId}) + +
    + ); +}; + +const Header = styled.div` + display: grid; + grid-template-columns: auto 1fr auto; + + p { + font-weight: bold; + } +`; + +const Title = styled.h2` + place-self: center; +`; + +const NetworkText = styled.p` + place-self: center; +`; diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx new file mode 100644 index 0000000000..9346946fcd --- /dev/null +++ b/packages/ui/src/main.tsx @@ -0,0 +1,70 @@ +import React from "react"; + +import type { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { StoredDeploymentSerializer } from "@ignored/ignition-core/ui-helpers"; +import ReactDOM from "react-dom/client"; +import { RouterProvider, createHashRouter } from "react-router-dom"; +import { FutureDetails } from "./pages/future-details/future-details"; +import { PlanOverview } from "./pages/plan-overview/plan-overview"; + +const loadDeploymentFromEmbeddedDiv = (): StoredDeployment | null => { + const scriptTag = document.getElementById("deployment"); + + if (scriptTag === null || scriptTag.textContent === null) { + return null; + } + + const data = JSON.parse(scriptTag.textContent); + + if (data.unloaded) { + return null; + } + + return StoredDeploymentSerializer.deserialize(data); +}; + +const loadDeploymentFromDevFile = async () => { + const response = await fetch("./deployment.json"); + const data = await response.json(); + return StoredDeploymentSerializer.deserialize(data); +}; + +const loadDeploymentData = () => { + return loadDeploymentFromEmbeddedDiv() ?? loadDeploymentFromDevFile(); +}; + +const main = async () => { + try { + const deployment = await loadDeploymentData(); + + const router = createHashRouter([ + { + path: "/", + element: , + }, + { + path: "/future/:futureId", + element: , + }, + ]); + + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( + + + + ); + } catch (error) { + console.error(error); + const message = error instanceof Error ? error.message : "unknown error"; + + ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( +
    +

    + Error during deployment loading: {message} +

    +
    + ); + } +}; + +main(); diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx new file mode 100644 index 0000000000..2ba0ee0907 --- /dev/null +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -0,0 +1,130 @@ +import { + FutureType, + StoredDeployment, +} from "@ignored/ignition-core/ui-helpers"; +import { PageTitle, Panel } from "../../../components/shared"; +import { SummaryHeader } from "../../../components/summary-header"; +import { UiFuture } from "../../../types"; + +export const FutureSummary: React.FC<{ + deployment: StoredDeployment; + future: UiFuture; +}> = ({ deployment, future }) => { + const title = resolveTitleFor(future); + + return ( +
    +
    + {title} +
    + + + + +
    + +
    +
    +
    + ); +}; + +function resolveTitleFor(future: UiFuture): string { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return `Contract deploy - ${future.contractName}`; + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return `Contract deploy from Artifact - ${future.contractName}`; + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return `Library deploy - ${future.contractName}`; + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return `Library deploy from Artifact - ${future.contractName}`; + case FutureType.NAMED_CONTRACT_CALL: + return `Call - ${future.contract.contractName}/${future.functionName}`; + case FutureType.NAMED_STATIC_CALL: + return `Static call - ${future.contract.contractName}/${future.functionName}`; + case FutureType.CONTRACT_AT: + return `Existing contract - ${future.contractName} (${future.address})`; + } +} + +const FutureDetailsSection: React.FC<{ future: UiFuture }> = ({ future }) => { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return ( +
    +

    Contract - {future.contractName}

    +

    Constructor Args

    +
      + {Object.entries(future.constructorArgs).map(([key, value]) => ( +
    • + {key} - {value} +
    • + ))} +
    +
    + ); + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return ( +
    +

    Contract - {future.contractName}

    +

    Constructor Args

    +
      + {Object.entries(future.constructorArgs).map(([key, value]) => ( +
    • + {key} - {value} +
    • + ))} +
    +
    + ); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return ( +
    +

    Library - {future.contractName}

    +
    + ); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return ( +
    +

    Library - {future.contractName}

    +
    + ); + case FutureType.NAMED_CONTRACT_CALL: + return ( +
    +

    Contract - {future.contract.contractName}

    +

    function - {future.functionName}

    +

    Args

    +
      + {Object.entries(future.args).map(([, value]) => ( +
    • {value}
    • + ))} +
    +
    + ); + case FutureType.NAMED_STATIC_CALL: + return ( +
    +

    Contract - {future.contract.contractName}

    +

    function - {future.functionName}

    +

    Args

    +
      + {Object.entries(future.args).map(([, value]) => ( +
    • {value}
    • + ))} +
    +
    + ); + case FutureType.CONTRACT_AT: + return ( +
    +

    Contract - {future.contractName}

    +

    Address - {future.address}

    +
    + ); + } +}; diff --git a/packages/ui/src/pages/future-details/future-details.tsx b/packages/ui/src/pages/future-details/future-details.tsx new file mode 100644 index 0000000000..78ccd86e63 --- /dev/null +++ b/packages/ui/src/pages/future-details/future-details.tsx @@ -0,0 +1,31 @@ +import { StoredDeployment } from "@ignored/ignition-core"; +import React, { useMemo } from "react"; +import { useParams } from "react-router-dom"; +import { Page } from "../../components/shared"; +import { getFutureById } from "../../queries/futures"; +import { FutureSummary } from "./components/future-summary"; + +export const FutureDetails: React.FC<{ deployment: StoredDeployment }> = ({ + deployment, +}) => { + const { futureId } = useParams(); + + const future = useMemo( + () => getFutureById(deployment, futureId), + [deployment, futureId] + ); + + if (future === undefined) { + return ( + +

    Future not found

    +
    + ); + } + + return ( + + + + ); +}; diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx new file mode 100644 index 0000000000..11f13a0e4f --- /dev/null +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -0,0 +1,78 @@ +import { FutureType } from "@ignored/ignition-core/ui-helpers"; +import React, { useCallback } from "react"; +import { useNavigate } from "react-router-dom"; +import styled, { css } from "styled-components"; +import { UiFuture } from "../../../types"; + +export const Action: React.FC<{ + future: UiFuture; +}> = ({ future }) => { + const navigate = useNavigate(); + + const displayText = toDisplayText(future); + + const navigateToFuture = useCallback(() => { + return navigate(`/future/${future.id}`); + }, [future.id, navigate]); + + return ( + + {displayText} + + ); +}; + +function toDisplayText(future: UiFuture): string { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return `Contract deploy ${future.contractName}`; + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return `Deploy contract ${future.contractName} from artifact`; + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return `Library deploy ${future.contractName}`; + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return `Library deploy ${future.contractName} from artifact`; + case FutureType.NAMED_CONTRACT_CALL: + return `Call ${future.contract.contractName}/${future.functionName}`; + case FutureType.NAMED_STATIC_CALL: + return `Static call ${future.contract.contractName}/${future.functionName}`; + case FutureType.CONTRACT_AT: + return `Existing contract ${future.contractName} (${future.address})`; + } +} + +const Text = styled.p` + margin: 0; +`; + +const ActionBtn = styled.div<{ futureType: number }>` + border: 1px solid black; + padding: 1rem; + font-weight: bold; + + &:hover { + background: blue; + cursor: pointer; + } + + ${(props) => + [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ].includes(props.futureType) && + css` + background: green; + color: white; + `} + + ${(props) => + [FutureType.NAMED_CONTRACT_CALL, FutureType.NAMED_STATIC_CALL].includes( + props.futureType + ) && + css` + background: yellow; + color: black; + `} +`; diff --git a/packages/ui/src/pages/plan-overview/components/plan-details.tsx b/packages/ui/src/pages/plan-overview/components/plan-details.tsx new file mode 100644 index 0000000000..64117d9ff6 --- /dev/null +++ b/packages/ui/src/pages/plan-overview/components/plan-details.tsx @@ -0,0 +1,37 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { useMemo } from "react"; +import styled from "styled-components"; +import { Mermaid } from "../../../components/mermaid"; +import { getAllFuturesForModule } from "../../../queries/futures"; +import { Action } from "./action"; + +export const PlanDetails: React.FC<{ deployment: StoredDeployment }> = ({ + deployment, +}) => { + const futures = useMemo( + () => getAllFuturesForModule(deployment.module), + [deployment] + ); + + return ( +
    +

    Plan

    + +
    + +
    + +

    Actions

    + + {futures.map((future) => ( + + ))} + +
    + ); +}; + +const Actions = styled.div` + display: grid; + row-gap: 0.5rem; +`; diff --git a/packages/ui/src/pages/plan-overview/components/plan-summary.tsx b/packages/ui/src/pages/plan-overview/components/plan-summary.tsx new file mode 100644 index 0000000000..721ad50f82 --- /dev/null +++ b/packages/ui/src/pages/plan-overview/components/plan-summary.tsx @@ -0,0 +1,78 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import React, { useMemo } from "react"; +import styled from "styled-components"; +import { SummaryHeader } from "../../../components/summary-header"; +import { + getAllCallFuturesFor, + getAllDeployFuturesFor, +} from "../../../queries/futures"; + +export const PlanSummary: React.FC<{ deployment: StoredDeployment }> = ({ + deployment, +}) => { + const { details } = deployment; + const deployFutures = useMemo( + () => getAllDeployFuturesFor(deployment), + [deployment] + ); + const callFutures = useMemo( + () => getAllCallFuturesFor(deployment), + [deployment] + ); + + return ( +
    + + +

    + The successful completion of the plan will send{" "} + {deployFutures.length + callFutures.length} + transactions: +

    + + + {deployFutures.length === 0 ? null : ( + +

    {deployFutures.length} deploys

    +
      + {deployFutures.map((deploy) => ( +
    • + {deploy.contractName} ({deploy.module.id}) +
    • + ))} +
    +
    + )} + + {callFutures.length === 0 ? null : ( + +

    {callFutures.length} calls

    +
      + {callFutures.map((call) => ( +
    • {call.id}
    • + ))} +
    +
    + )} +
    +
    + ); +}; + +const SummaryColumns = styled.div` + display: grid; + grid-template-columns: 1fr 1fr 1fr; +`; + +const SummaryColumn = styled.div` + h4 { + text-decoration: underline; + } + + ul { + list-style-type: none; + } +`; diff --git a/packages/ui/src/pages/plan-overview/plan-overview.tsx b/packages/ui/src/pages/plan-overview/plan-overview.tsx new file mode 100644 index 0000000000..16a6c7acc7 --- /dev/null +++ b/packages/ui/src/pages/plan-overview/plan-overview.tsx @@ -0,0 +1,25 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import React from "react"; +import { Page, PageTitle, Panel } from "../../components/shared"; +import { PlanDetails } from "./components/plan-details"; +import { PlanSummary } from "./components/plan-summary"; + +export const PlanOverview: React.FC<{ deployment: StoredDeployment }> = ({ + deployment, +}) => { + return ( + +
    + Ignition - {deployment.module.id} +
    + + + + + + + + +
    + ); +}; diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts new file mode 100644 index 0000000000..d9eb0a8d89 --- /dev/null +++ b/packages/ui/src/queries/futures.ts @@ -0,0 +1,60 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { UiContractFuture, UiFuture } from "../types"; +import { isCallFuture, isContractFuture, isUiFuture } from "../utils/guards"; + +export function getFutureById( + deployment: StoredDeployment, + futureId: string | undefined +): UiFuture | undefined { + if (futureId === undefined) { + return undefined; + } + + const f = getAllFuturesForModule(deployment.module).find( + (f) => f.id === futureId + ); + + if (f === undefined) { + return undefined; + } + + if (!isUiFuture(f)) { + throw new Error("Not a future"); + } + + return f; +} + +/* Get all futures in a module and its submodules */ +export function getAllFuturesForModule({ + futures, + submodules, +}: StoredDeployment["module"]): UiFuture[] { + return Array.from(futures) + .filter(isUiFuture) + .concat( + Array.from(submodules.values()).flatMap((submodule) => + getAllFuturesForModule(submodule) + ) + ); +} + +/** + * Get all deploy futures in a module and its submodules, including: + * - hardhat contract deploys + * - artifact contract deploys + * - library deploys + * - artifact library deploys + */ +export function getAllDeployFuturesFor( + deployment: StoredDeployment +): UiContractFuture[] { + return getAllFuturesForModule(deployment.module).filter(isContractFuture); +} + +/** + * Get all calls in a module and its submodules + */ +export function getAllCallFuturesFor(deployment: StoredDeployment): UiFuture[] { + return getAllFuturesForModule(deployment.module).filter(isCallFuture); +} diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts new file mode 100644 index 0000000000..50de7d92b0 --- /dev/null +++ b/packages/ui/src/types.ts @@ -0,0 +1,21 @@ +import { + ArtifactContractDeploymentFuture, + ArtifactLibraryDeploymentFuture, + ContractAtFuture, + NamedContractCallFuture, + NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, + NamedStaticCallFuture, +} from "@ignored/ignition-core/ui-helpers"; + +export type UiContractFuture = + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedLibraryDeploymentFuture + | ArtifactLibraryDeploymentFuture; + +export type UiCallFuture = + | NamedContractCallFuture + | NamedStaticCallFuture; + +export type UiFuture = UiContractFuture | UiCallFuture | ContractAtFuture; diff --git a/packages/ui/src/utils/guards.ts b/packages/ui/src/utils/guards.ts new file mode 100644 index 0000000000..9fae17f41b --- /dev/null +++ b/packages/ui/src/utils/guards.ts @@ -0,0 +1,26 @@ +import { Future, FutureType } from "@ignored/ignition-core/ui-helpers"; +import { UiCallFuture, UiContractFuture, UiFuture } from "../types"; + +export function isUiFuture(f: Future): f is UiFuture { + return FutureType[f.type] !== undefined; +} + +export function isContractFuture(f: Future): f is UiContractFuture { + const deployFutureTypeIds = [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ]; + + return deployFutureTypeIds.includes(f.type); +} + +export function isCallFuture(f: Future): f is UiCallFuture { + const callFutureIds = [ + FutureType.NAMED_CONTRACT_CALL, + FutureType.NAMED_STATIC_CALL, + ]; + + return callFutureIds.includes(f.type); +} diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts new file mode 100644 index 0000000000..4b5b96502b --- /dev/null +++ b/packages/ui/src/utils/to-mermaid.ts @@ -0,0 +1,74 @@ +import { + FutureType, + IgnitionModule, + IgnitionModuleResult, + StoredDeployment, +} from "@ignored/ignition-core/ui-helpers"; +import { getAllFuturesForModule } from "../queries/futures"; +import { UiFuture } from "../types"; + +export function toMermaid(deployment: StoredDeployment) { + const modules = recursivelyListModulesAndSubmodulesFor(deployment.module); + + const subgraphSections = modules + .map((m) => prettyPrintModule(m, " ")) + .join("\n"); + + const futureDependencies = [ + ...new Set( + getAllFuturesForModule(deployment.module) + .flatMap((f) => Array.from(f.dependencies).map((d) => [f.id, d.id])) + .map(([from, to]) => `${from} --> ${to}`) + ), + ].join("\n"); + + const moduleDependencies = [ + ...new Set( + modules + .flatMap((f) => Array.from(f.submodules).map((d) => [f.id, d.id])) + .map(([from, to]) => `${from} -.-> ${to}`) + ), + ].join("\n"); + + return `flowchart BT\n\n${deployment.module.id}:::startModule\n\n${subgraphSections}\n\n${futureDependencies}\n\n${moduleDependencies}\n\nclassDef startModule stroke-width:4px`; +} + +function prettyPrintModule( + module: IgnitionModule>, + lineIndent = "" +): string { + const futureList = Array.from(module.futures) + .map((f) => `${lineIndent}${f.id}["${toLabel(f as UiFuture)}"]`) + .join(`\n${lineIndent}`); + + return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction BT\n\n${lineIndent}${lineIndent}${futureList}\n${lineIndent}end`; +} + +function recursivelyListModulesAndSubmodulesFor( + module: IgnitionModule> +): Array>> { + return [module].concat( + Array.from(module.submodules).flatMap( + recursivelyListModulesAndSubmodulesFor + ) + ); +} + +function toLabel(f: UiFuture): string { + switch (f.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return `Deploy ${f.contractName}`; + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return `Deploy from artifact ${f.contractName}`; + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return `Deploy library ${f.contractName}`; + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return `Deploy library from artifact ${f.contractName}`; + case FutureType.NAMED_CONTRACT_CALL: + return `Call ${f.contract.contractName}/${f.functionName}`; + case FutureType.NAMED_STATIC_CALL: + return `Static call ${f.contract.contractName}/${f.functionName}`; + case FutureType.CONTRACT_AT: + return `Existing contract ${f.contractName} (${f.address})`; + } +} diff --git a/packages/ui/src/vite-env.d.ts b/packages/ui/src/vite-env.d.ts new file mode 100644 index 0000000000..11f02fe2a0 --- /dev/null +++ b/packages/ui/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json new file mode 100644 index 0000000000..c81ef9f382 --- /dev/null +++ b/packages/ui/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/packages/ui/tsconfig.node.json b/packages/ui/tsconfig.node.json new file mode 100644 index 0000000000..42872c59f5 --- /dev/null +++ b/packages/ui/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts new file mode 100644 index 0000000000..31e35cae03 --- /dev/null +++ b/packages/ui/vite.config.ts @@ -0,0 +1,16 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; +import { viteSingleFile } from "vite-plugin-singlefile"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), viteSingleFile()], + optimizeDeps: { + include: ["@ignored/ignition-core/ui-helpers"], + }, + build: { + commonjsOptions: { + include: [/core/, /node_modules/], + }, + }, +}); From 5edcc7fc4bf9ca204ad79ecda29779c006ece9a2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 18 May 2023 13:39:27 +0100 Subject: [PATCH 0345/1302] refactor(new-api): add an IgnitionModule based batcher Add a batcher that operates over an IgnitionModule and mocked out execution-state. --- packages/core/src/new-api/internal/batcher.ts | 262 ++++++++++++++++++ .../core/src/new-api/types/execution-state.ts | 148 ++++++++++ packages/core/test/new-api/batcher.ts | 198 +++++++++++++ 3 files changed, 608 insertions(+) create mode 100644 packages/core/src/new-api/internal/batcher.ts create mode 100644 packages/core/src/new-api/types/execution-state.ts create mode 100644 packages/core/test/new-api/batcher.ts diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts new file mode 100644 index 0000000000..8c7bca7ec2 --- /dev/null +++ b/packages/core/src/new-api/internal/batcher.ts @@ -0,0 +1,262 @@ +import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; +import { Future, IgnitionModule } from "../types/module"; + +enum VisitStatus { + UNVISITED, + VISITED, +} + +interface VisitStatusMap { + [key: string]: VisitStatus; +} + +interface BatchState { + adjacencyList: AdjacencyList; + visitState: VisitStatusMap; +} + +export class Batcher { + public static batch( + module: IgnitionModule, + executionStateMap: ExecutionStateMap + ): string[][] { + const batchState = this._initializeBatchStateFrom( + module, + executionStateMap + ); + + const batches: string[][] = []; + + while (!this._allVisited(batchState)) { + const nextBatch = this._resolveNextBatch(batchState); + + batches.push(nextBatch); + + this._markAsVisited(batchState, nextBatch); + } + + return batches; + } + + private static _initializeBatchStateFrom( + module: IgnitionModule, + executionStateMap: ExecutionStateMap + ): BatchState { + const allFutures = this._recursiveGetFuturesFor(module); + + const visitState = this._intializeVisitStateFrom( + allFutures, + executionStateMap + ); + + const adjacencyList = this._buildAdjacencyListFor(allFutures); + + this._eleminateAlreadyVisitedFutures({ adjacencyList, visitState }); + + return { adjacencyList, visitState }; + } + + private static _recursiveGetFuturesFor( + module: IgnitionModule + ): Array> { + return [...module.futures].concat( + Array.from(module.submodules).flatMap((sub) => + this._recursiveGetFuturesFor(sub) + ) + ); + } + + private static _intializeVisitStateFrom( + futures: Array>, + executionStateMap: ExecutionStateMap + ): VisitStatusMap { + return Object.fromEntries( + futures.map((f) => { + const executionState = executionStateMap[f.id]; + + if (executionState === undefined) { + return [f.id, VisitStatus.UNVISITED]; + } + + switch (executionState.status) { + case ExecutionStatus.FAILED: + case ExecutionStatus.HOLD: + case ExecutionStatus.STARTED: + return [f.id, VisitStatus.UNVISITED]; + case ExecutionStatus.SUCCESS: + return [f.id, VisitStatus.VISITED]; + } + }) + ); + } + + private static _buildAdjacencyListFor( + futures: Array> + ): AdjacencyList { + const dependencyGraph = new AdjacencyList(); + + for (const future of futures) { + for (const dependency of future.dependencies) { + dependencyGraph.addDependency({ from: future.id, to: dependency.id }); + + this._optionallyAddDependenciesSubmoduleSiblings( + dependencyGraph, + future, + dependency + ); + } + } + + return dependencyGraph; + } + + /** + * The famed Malaga rule, if a future's dependency is in a submodule, + * then that future should not be executed until all futures in the + * submodule have been run. + */ + private static _optionallyAddDependenciesSubmoduleSiblings( + dependencyGraph: AdjacencyList, + future: Future, + dependency: Future + ): void { + if (future.module === dependency.module) { + return; + } + + for (const moduleDep of dependency.module.futures) { + dependencyGraph.addDependency({ + from: future.id, + to: moduleDep.id, + }); + } + } + + public static _eleminateAlreadyVisitedFutures({ + adjacencyList, + visitState, + }: { + adjacencyList: AdjacencyList; + visitState: VisitStatusMap; + }) { + const visitedFutures = Object.entries(visitState) + .filter(([, vs]) => vs === VisitStatus.VISITED) + .map(([futureId]) => futureId); + + for (const visitedFuture of visitedFutures) { + adjacencyList.eliminate(visitedFuture); + } + } + + private static _allVisited(batchState: BatchState): boolean { + return Object.values(batchState.visitState).every( + (s) => s === VisitStatus.VISITED + ); + } + + private static _markAsVisited(batchState: BatchState, nextBatch: string[]) { + for (const futureId of nextBatch) { + batchState.visitState[futureId] = VisitStatus.VISITED; + } + } + + private static _resolveNextBatch(batchState: BatchState): string[] { + const allUnvisited = Object.entries(batchState.visitState) + .filter(([, state]) => state === VisitStatus.UNVISITED) + .map(([id]) => id); + + const allUnvisitedWhereDepsVisited = allUnvisited.filter((futureId) => + this._allDependenciesVisited(futureId, batchState) + ); + + return allUnvisitedWhereDepsVisited.sort(); + } + + private static _allDependenciesVisited( + futureId: string, + batchState: BatchState + ): boolean { + const dependencies = batchState.adjacencyList.getDependenciesFor(futureId); + + return [...dependencies].every( + (depId) => batchState.visitState[depId] === VisitStatus.VISITED + ); + } +} + +export class AdjacencyList { + /** + * A mapping from futures to each futures dependencies. + * + * Example: + * A + * ^ ^ + * | | + * B C + * Gives a mapping of {A: [], B: [A], C:[A]} + * + */ + private _list: Map> = new Map>(); + + /** + * Add a dependency from `from` to `to`. If A depends on B + * then {`from`: A, `to`: B} should be passed. + */ + public addDependency({ from, to }: { from: string; to: string }) { + const toSet = this._list.get(from) ?? new Set(); + + toSet.add(to); + + this._list.set(from, toSet); + } + + /** + * Get the dependencies, if A depends on B, A's dependencies includes B + * @param from - the future to get the list of dependencies for + * @returns - the dependencies + */ + public getDependenciesFor(from: string): Set { + return this._list.get(from) ?? new Set(); + } + + /** + * Get the dependents, if A depends on B, B's dependents includes A + * @param from - the future to get the list of dependents for + * @returns - the dependents + */ + public getDependentsFor(to: string) { + return [...this._list.entries()] + .filter(([_from, toSet]) => toSet.has(to)) + .map(([from]) => from); + } + + /** + * Remove a future, transfering its dependencies to its dependents. + * @param futureId - The future to eliminate + */ + public eliminate(futureId: string): void { + const dependents = this.getDependentsFor(futureId); + const dependencies = this.getDependenciesFor(futureId); + + this._list.delete(futureId); + + for (const dependent of dependents) { + const toSet = this._list.get(dependent); + + if (toSet === undefined) { + throw new Error("Dependency sets should be defined"); + } + + const setWithoutFuture = new Set( + [...toSet].filter((n) => n !== futureId) + ); + + const updatedSet = new Set([ + ...setWithoutFuture, + ...dependencies, + ]); + + this._list.set(dependent, updatedSet); + } + } +} diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/types/execution-state.ts new file mode 100644 index 0000000000..72efdb40b7 --- /dev/null +++ b/packages/core/src/new-api/types/execution-state.ts @@ -0,0 +1,148 @@ +import { SolidityParamsType } from "../stubs"; + +import { FutureType } from "./module"; + +/** + * This interface represents a transaction that was sent to the network. + * + * We keep enough information to track its progress, including detecting if it + * was dropped or replaced by a different one. + */ +interface Transaction { + sender: string; + nonce: number; + txId: string; + // TODO: Should we record something else? Maybe to do fewer requests? +} + +/** + * We define the possible onchain interactions that execution strategies can request. + */ +enum OnchainInteractionType { + DEPLOYMENT, + FUNCTION_CALL, + SEND, +} + +/** + * Each onchain interaction is recorded associated to an id, provided by the execution + * strategy. With the entire ExecutionHistory, using these ids, the strategy must be + * able to regenerate its internal state and resume an execution. + * + * We also associate a sequence of transactions with each onchain interactions. These + * are the different transactions that Ignition tried to send to execute this onchain + * interaction. Ideally it should be a single one, but we may need to replace it due + * to errors or gas price changes, so we store all of them, in order. + */ +interface BaseOnchainInteraction< + OnchainInteractionTypeT extends OnchainInteractionType +> { + id: string; + type: OnchainInteractionTypeT; + transactions: Transaction[]; +} + +/** + * A request to deploy a contract using by sending a transaction to the null address. + */ +interface DeploymentOnchainInteraction + extends BaseOnchainInteraction { + deploymentBytecode: string; // Maybe we want to optimize this out of the journal? In some cases it can be read from the artifact. + constructorArgs: SolidityParamsType; + value: bigint; +} + +/** + * A request to call a function of an existing contract. + */ +interface FunctionCallOnchainInteraction + extends BaseOnchainInteraction { + contractAddress: string; + signature: string; // TODO: Maybe ABI fragment? + arguments: SolidityParamsType; + value: bigint; +} + +/** + * A request to send an arbitrary EVM message to an account. + */ +interface SendOnchainInteraction + extends BaseOnchainInteraction { + to: string; + data: string; + value: bigint; + transactions: Transaction[]; +} + +type OnchainInteraction = + | DeploymentOnchainInteraction + | FunctionCallOnchainInteraction + | SendOnchainInteraction; + +/** + * The execution history of a future is a sequence of onchain interactions. + */ +type ExecutionHistory = OnchainInteraction[]; + +/** + * The different status that the execution can be at. + * + * NOTE: This should probably be state instead of status, right? I'm repeating names. Maybe there's some simplification that can be made. + */ +export enum ExecutionStatus { + STARTED, + HOLD, + SUCCESS, + FAILED, +} + +/** + * Each execution state has an id, which must be the same of the future that lead to its creation. + */ +interface BaseExecutionState { + id: string; + futureType: FutureTypeT; + strategy: string; // For example, "basic" | "create2". This needs to be string if we want custom ones. + status: ExecutionStatus; + dependencies: Set; // The ids of the futures it depended on + history: ExecutionHistory; + // TODO: We need a message in case of failure or hold? Do we need to store them? +} + +/** + * Each deployment execution state is created when the a deployment future gets to be executed. By that + * time every required value should be concrete, and we can record them. + */ +export interface DeploymentExecutionState + extends BaseExecutionState< + | FutureType.NAMED_CONTRACT_DEPLOYMENT + | FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + | FutureType.NAMED_LIBRARY_DEPLOYMENT + | FutureType.ARTIFACT_LIBRARY_DEPLOYMENT + > { + storedArtifactPath: string; // As stored in the deployment directory. + storedBuildInfoPath?: string; // As stored in the deployment directory. Optional as it's not always present + constructorArgs: SolidityParamsType; + libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? + value: bigint; + contractAddress?: string; // The result + + // from: string; -- Will we support this in the beta? I'll ignore it for now, but we should decide it asap +} + +type CallExecutionState = BaseExecutionState; + +type StaticCallExecutionState = + BaseExecutionState; + +type ContractAtExecutionState = BaseExecutionState; + +export type ExecutionState = + | DeploymentExecutionState + | CallExecutionState + | StaticCallExecutionState + | ContractAtExecutionState; + +export interface ExecutionStateMap { + [key: string]: ExecutionState; +} diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts new file mode 100644 index 0000000000..6639041cb9 --- /dev/null +++ b/packages/core/test/new-api/batcher.ts @@ -0,0 +1,198 @@ +import { assert } from "chai"; + +import { defineModule } from "../../src/new-api/define-module"; +import { Batcher } from "../../src/new-api/internal/batcher"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { + DeploymentExecutionState, + ExecutionStateMap, + ExecutionStatus, +} from "../../src/new-api/types/execution-state"; +import { + FutureType, + IgnitionModuleResult, +} from "../../src/new-api/types/module"; +import { IgnitionModuleDefinition } from "../../src/new-api/types/module-builder"; + +describe("batcher", () => { + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + }; + + it("should batch a contract deploy module", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + assertBatching({ moduleDefinition }, [["Module1:Contract1"]]); + }); + + it("should batch through dependencies", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + const contract3 = m.contract("Contract3", [contract1, contract2]); + + const contract4 = m.contract("Contract4", [], { + after: [contract3], + }); + + const contract5 = m.contract("Contract5", [], { + after: [contract3], + }); + + return { contract1, contract2, contract3, contract4, contract5 }; + }); + + assertBatching({ moduleDefinition }, [ + ["Module1:Contract1", "Module1:Contract2"], + ["Module1:Contract3"], + ["Module1:Contract4", "Module1:Contract5"], + ]); + }); + + it("should batch submodules such that everything in a submodule is executed if just one future in the submodule is depended on", () => { + const submoduleLeft = defineModule("SubmoduleLeft", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "configure"); + + return { contract1 }; + }); + + const submoduleRight = defineModule("SubmoduleRight", (m) => { + const contract2 = m.contract("Contract2"); + m.call(contract2, "configure"); + + return { contract2 }; + }); + + const submoduleMiddle = defineModule("SubmoduleMiddle", (m) => { + const { contract1 } = m.useModule(submoduleLeft); + const { contract2 } = m.useModule(submoduleRight); + + const contract3 = m.contract("Contract3", [contract1, contract2]); + m.call(contract3, "configure"); + + return { contract3 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract3 } = m.useModule(submoduleMiddle); + + const contract4 = m.contract("Contract4", [contract3]); + m.call(contract4, "configure"); + + return { contract4 }; + }); + + assertBatching({ moduleDefinition }, [ + ["SubmoduleLeft:Contract1", "SubmoduleRight:Contract2"], + [ + "SubmoduleLeft:Contract1#configure", + "SubmoduleRight:Contract2#configure", + ], + ["SubmoduleMiddle:Contract3"], + ["SubmoduleMiddle:Contract3#configure"], + ["Module:Contract4"], + ["Module:Contract4#configure"], + ]); + }); + + it("should deploy submodules even when no direct connection", () => { + const submoduleLeft = defineModule("Left", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const submoduleRight = defineModule("Right", (m) => { + const contract2 = m.contract("Contract2"); + + return { contract2 }; + }); + + const submoduleMiddle = defineModule("Middle", (m) => { + m.useModule(submoduleLeft); + m.useModule(submoduleRight); + + const contract3 = m.contract("Contract3", []); + + return { contract3 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract3 } = m.useModule(submoduleMiddle); + + const contract4 = m.contract("Contract4", [contract3]); + + return { contract4 }; + }); + + assertBatching({ moduleDefinition }, [ + ["Left:Contract1", "Middle:Contract3", "Right:Contract2"], + ["Module:Contract4"], + ]); + }); + + it("should bypass intermediary successful nodes", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [contract1]); + + const contract3 = m.contract("Contract3", [contract2]); + + return { contract1, contract2, contract3 }; + }); + + assertBatching( + { + moduleDefinition, + executionStates: { + "Module1:Contract2": { + ...exampleDeploymentState, + id: "Module1:Contract2", + status: ExecutionStatus.SUCCESS, + }, + }, + }, + [["Module1:Contract1"], ["Module1:Contract3"]] + ); + }); +}); + +function assertBatching( + { + moduleDefinition, + executionStates = {}, + }: { + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >; + executionStates?: ExecutionStateMap; + }, + expectedBatches: string[][] +) { + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assert.isDefined(module); + + const actualBatches = Batcher.batch(module, executionStates); + + assert.deepStrictEqual(actualBatches, expectedBatches); +} From 7dcc4839cea19f2a695428548e368d69cfad39d6 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 17 May 2023 18:57:30 -0400 Subject: [PATCH 0346/1302] added value option to new api with tests --- .../src/new-api/internal/module-builder.ts | 12 +++++-- packages/core/src/new-api/internal/module.ts | 9 ++++-- .../core/src/new-api/types/module-builder.ts | 3 ++ packages/core/src/new-api/types/module.ts | 3 ++ packages/core/test/new-api/call.ts | 30 +++++++++++++++++ packages/core/test/new-api/contract.ts | 30 +++++++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 32 +++++++++++++++++++ 7 files changed, 113 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 8fc6970064..b309508851 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -132,6 +132,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + options.value ??= BigInt(0); this._assertUniqueContractId(futureId); @@ -140,7 +141,8 @@ export class IgnitionModuleBuilderImplementation< this._module, contractName, args, - options.libraries + options.libraries, + options.value ); for (const arg of args.filter(isFuture)) { @@ -171,6 +173,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + options.value ??= BigInt(0); this._assertUniqueArtifactContractId(futureId); @@ -180,7 +183,8 @@ export class IgnitionModuleBuilderImplementation< contractName, args, artifact, - options.libraries + options.libraries, + options.value ); this._module.futures.add(future); @@ -276,6 +280,7 @@ export class IgnitionModuleBuilderImplementation< ): NamedContractCallFuture { const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; + options.value ??= BigInt(0); this._assertUniqueCallId(futureId); @@ -284,7 +289,8 @@ export class IgnitionModuleBuilderImplementation< this._module, functionName, contractFuture, - args + args, + options.value ); future.dependencies.add(contractFuture); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 6908300d84..8f0b744b5f 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -57,7 +57,8 @@ export class NamedContractDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, public readonly constructorArgs: SolidityParamsType, - public readonly libraries: Record> + public readonly libraries: Record>, + public readonly value: BigInt ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); } @@ -75,7 +76,8 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: SolidityParamsType, public readonly artifact: ArtifactType, - public readonly libraries: Record> + public readonly libraries: Record>, + public readonly value: BigInt ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); } @@ -126,7 +128,8 @@ export class NamedContractCallFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, - public readonly args: SolidityParamsType + public readonly args: SolidityParamsType, + public readonly value: BigInt ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index cd8f6d487f..b2bd48ea8a 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -36,6 +36,7 @@ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; + value?: BigInt; } /** @@ -47,6 +48,7 @@ export interface ContractFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; + value?: BigInt; } /** @@ -79,6 +81,7 @@ export interface LibraryFromArtifactOptions { export interface CallOptions { id?: string; after?: Future[]; + value?: BigInt; } /** diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 55b50b62ea..b43e56bbea 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -66,6 +66,7 @@ export interface NamedContractDeploymentFuture type: FutureType.NAMED_CONTRACT_DEPLOYMENT; constructorArgs: SolidityParamsType; libraries: Record>; + value: BigInt; } /** @@ -80,6 +81,7 @@ export interface ArtifactContractDeploymentFuture artifact: ArtifactType; constructorArgs: SolidityParamsType; libraries: Record>; + value: BigInt; } /** @@ -118,6 +120,7 @@ export interface NamedContractCallFuture< type: FutureType.NAMED_CONTRACT_CALL; contract: ContractFuture; args: SolidityParamsType; + value: BigInt; } /** diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 64a187952e..48ccaa7ef9 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -126,6 +126,36 @@ describe("call", () => { assert(callFuture.dependencies.has(anotherFuture!)); }); + it("should be able to pass value as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.call(example, "test", [], { value: BigInt(42) }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.value, BigInt(42)); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index c32344d35b..625b05538a 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -149,6 +149,36 @@ describe("contract", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass value as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { value: BigInt(42) }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.value, BigInt(42)); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 74b24eef3f..5bf505b97f 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -141,6 +141,38 @@ describe("contractFromArtifact", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass value as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + value: BigInt(42), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactContractDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact contract deployment"); + } + + assert.equal(anotherFuture.value, BigInt(42)); + }); + describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( From a8a8bd65092e42acd55c459fef78885080ab535a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 17 May 2023 19:27:09 -0400 Subject: [PATCH 0347/1302] added from option to new api with tests --- .../src/new-api/internal/module-builder.ts | 24 ++++++++++---- packages/core/src/new-api/internal/module.ts | 18 +++++++---- .../core/src/new-api/types/module-builder.ts | 6 ++++ packages/core/src/new-api/types/module.ts | 6 ++++ packages/core/test/new-api/call.ts | 30 +++++++++++++++++ packages/core/test/new-api/contract.ts | 30 +++++++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 32 +++++++++++++++++++ packages/core/test/new-api/library.ts | 32 +++++++++++++++++++ .../core/test/new-api/libraryFromArtifact.ts | 32 +++++++++++++++++++ packages/core/test/new-api/staticCall.ts | 30 +++++++++++++++++ 10 files changed, 228 insertions(+), 12 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index b309508851..756793b60f 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -133,6 +133,7 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; options.value ??= BigInt(0); + options.from ??= this.accounts[0]; this._assertUniqueContractId(futureId); @@ -142,7 +143,8 @@ export class IgnitionModuleBuilderImplementation< contractName, args, options.libraries, - options.value + options.value, + options.from ); for (const arg of args.filter(isFuture)) { @@ -174,6 +176,7 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; options.value ??= BigInt(0); + options.from ??= this.accounts[0]; this._assertUniqueArtifactContractId(futureId); @@ -184,7 +187,8 @@ export class IgnitionModuleBuilderImplementation< args, artifact, options.libraries, - options.value + options.value, + options.from ); this._module.futures.add(future); @@ -213,6 +217,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + options.from ??= this.accounts[0]; this._assertUniqueLibraryId(futureId); @@ -220,7 +225,8 @@ export class IgnitionModuleBuilderImplementation< futureId, this._module, libraryName, - options.libraries + options.libraries, + options.from ); for (const afterFuture of (options.after ?? []).filter(isFuture)) { @@ -246,6 +252,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + options.from ??= this.accounts[0]; this._assertUniqueArtifactLibraryId(futureId); @@ -254,7 +261,8 @@ export class IgnitionModuleBuilderImplementation< this._module, libraryName, artifact, - options.libraries + options.libraries, + options.from ); for (const afterFuture of (options.after ?? []).filter(isFuture)) { @@ -281,6 +289,7 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; options.value ??= BigInt(0); + options.from ??= this.accounts[0]; this._assertUniqueCallId(futureId); @@ -290,7 +299,8 @@ export class IgnitionModuleBuilderImplementation< functionName, contractFuture, args, - options.value + options.value, + options.from ); future.dependencies.add(contractFuture); @@ -316,6 +326,7 @@ export class IgnitionModuleBuilderImplementation< ): NamedStaticCallFuture { const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; + options.from ??= this.accounts[0]; this._assertUniqueStaticCallId(futureId); @@ -324,7 +335,8 @@ export class IgnitionModuleBuilderImplementation< this._module, functionName, contractFuture, - args + args, + options.from ); future.dependencies.add(contractFuture); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 8f0b744b5f..05aaaf96c4 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -58,7 +58,8 @@ export class NamedContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: SolidityParamsType, public readonly libraries: Record>, - public readonly value: BigInt + public readonly value: BigInt, + public readonly from: string ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); } @@ -77,7 +78,8 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly constructorArgs: SolidityParamsType, public readonly artifact: ArtifactType, public readonly libraries: Record>, - public readonly value: BigInt + public readonly value: BigInt, + public readonly from: string ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); } @@ -93,7 +95,8 @@ export class NamedLibraryDeploymentFutureImplementation< public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: LibraryNameT, - public readonly libraries: Record> + public readonly libraries: Record>, + public readonly from: string ) { super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); } @@ -110,7 +113,8 @@ export class ArtifactLibraryDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: LibraryNameT, public readonly artifact: ArtifactType, - public readonly libraries: Record> + public readonly libraries: Record>, + public readonly from: string ) { super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); } @@ -129,7 +133,8 @@ export class NamedContractCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: SolidityParamsType, - public readonly value: BigInt + public readonly value: BigInt, + public readonly from: string ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); } @@ -147,7 +152,8 @@ export class NamedStaticCallFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, - public readonly args: SolidityParamsType + public readonly args: SolidityParamsType, + public readonly from: string ) { super(id, FutureType.NAMED_STATIC_CALL, module); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index b2bd48ea8a..051f588075 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -37,6 +37,7 @@ export interface ContractOptions { after?: Future[]; libraries?: Record>; value?: BigInt; + from?: string; } /** @@ -49,6 +50,7 @@ export interface ContractFromArtifactOptions { after?: Future[]; libraries?: Record>; value?: BigInt; + from?: string; } /** @@ -60,6 +62,7 @@ export interface LibraryOptions { id?: string; after?: Future[]; libraries?: Record>; + from?: string; } /** @@ -71,6 +74,7 @@ export interface LibraryFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; + from?: string; } /** @@ -82,6 +86,7 @@ export interface CallOptions { id?: string; after?: Future[]; value?: BigInt; + from?: string; } /** @@ -92,6 +97,7 @@ export interface CallOptions { export interface StaticCallOptions { id?: string; after?: Future[]; + from?: string; } /** diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index b43e56bbea..2ebe607258 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -67,6 +67,7 @@ export interface NamedContractDeploymentFuture constructorArgs: SolidityParamsType; libraries: Record>; value: BigInt; + from: string; } /** @@ -82,6 +83,7 @@ export interface ArtifactContractDeploymentFuture constructorArgs: SolidityParamsType; libraries: Record>; value: BigInt; + from: string; } /** @@ -93,6 +95,7 @@ export interface NamedLibraryDeploymentFuture extends ContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; libraries: Record>; + from: string; } /** @@ -106,6 +109,7 @@ export interface ArtifactLibraryDeploymentFuture type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; artifact: ArtifactType; libraries: Record>; + from: string; } /** @@ -121,6 +125,7 @@ export interface NamedContractCallFuture< contract: ContractFuture; args: SolidityParamsType; value: BigInt; + from: string; } /** @@ -135,6 +140,7 @@ export interface NamedStaticCallFuture< type: FutureType.NAMED_STATIC_CALL; contract: ContractFuture; args: SolidityParamsType; + from: string; } /** diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 48ccaa7ef9..65908d9b61 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -156,6 +156,36 @@ describe("call", () => { assert.equal(callFuture.value, BigInt(42)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.call(example, "test", [], { from: m.accounts[1] }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.from, "0x2"); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 625b05538a..89c1f5b558 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -179,6 +179,36 @@ describe("contract", () => { assert.equal(anotherFuture.value, BigInt(42)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { from: m.accounts[1] }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.from, "0x2"); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 5bf505b97f..d878d3a882 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -173,6 +173,38 @@ describe("contractFromArtifact", () => { assert.equal(anotherFuture.value, BigInt(42)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + from: m.accounts[1], + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactContractDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact contract deployment"); + } + + assert.equal(anotherFuture.from, "0x2"); + }); + describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 9c775ed76a..bc0a1d2b51 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -113,6 +113,38 @@ describe("library", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.library("Another", { + from: m.accounts[1], + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not a named library deployment"); + } + + assert.equal(anotherFuture.from, "0x2"); + }); + describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 47e5fac772..2174c05d84 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -104,6 +104,38 @@ describe("libraryFromArtifact", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.libraryFromArtifact("Another", fakeArtifact, { + from: m.accounts[1], + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact library deployment"); + } + + assert.equal(anotherFuture.from, "0x2"); + }); + describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 4b60a195e7..c40cd1de49 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -163,6 +163,36 @@ describe("static call", () => { assert(callFuture.dependencies.has(staticCallFuture!)); }); + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.staticCall(example, "test", [], { from: m.accounts[1] }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.from, "0x2"); + }); + describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { From 614e3dfbb5e3edd37eb17b27974f33cbf04d9c8e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 18 May 2023 20:14:28 -0400 Subject: [PATCH 0348/1302] change BigInt type to bigint --- packages/core/src/new-api/internal/module.ts | 6 +++--- packages/core/src/new-api/types/module-builder.ts | 6 +++--- packages/core/src/new-api/types/module.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 05aaaf96c4..eae2082dbc 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -58,7 +58,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: SolidityParamsType, public readonly libraries: Record>, - public readonly value: BigInt, + public readonly value: bigint, public readonly from: string ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); @@ -78,7 +78,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly constructorArgs: SolidityParamsType, public readonly artifact: ArtifactType, public readonly libraries: Record>, - public readonly value: BigInt, + public readonly value: bigint, public readonly from: string ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); @@ -133,7 +133,7 @@ export class NamedContractCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: SolidityParamsType, - public readonly value: BigInt, + public readonly value: bigint, public readonly from: string ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 051f588075..e7ab5c4532 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -36,7 +36,7 @@ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: BigInt; + value?: bigint; from?: string; } @@ -49,7 +49,7 @@ export interface ContractFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: BigInt; + value?: bigint; from?: string; } @@ -85,7 +85,7 @@ export interface LibraryFromArtifactOptions { export interface CallOptions { id?: string; after?: Future[]; - value?: BigInt; + value?: bigint; from?: string; } diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 2ebe607258..447534cb8c 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -66,7 +66,7 @@ export interface NamedContractDeploymentFuture type: FutureType.NAMED_CONTRACT_DEPLOYMENT; constructorArgs: SolidityParamsType; libraries: Record>; - value: BigInt; + value: bigint; from: string; } @@ -82,7 +82,7 @@ export interface ArtifactContractDeploymentFuture artifact: ArtifactType; constructorArgs: SolidityParamsType; libraries: Record>; - value: BigInt; + value: bigint; from: string; } @@ -124,7 +124,7 @@ export interface NamedContractCallFuture< type: FutureType.NAMED_CONTRACT_CALL; contract: ContractFuture; args: SolidityParamsType; - value: BigInt; + value: bigint; from: string; } From f2e0cf6f0dc4f602fec2e0ec1528914defa32550 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 21 May 2023 23:13:10 -0400 Subject: [PATCH 0349/1302] made `from` default to undefined if not set --- packages/core/src/new-api/internal/module-builder.ts | 6 ------ packages/core/src/new-api/internal/module.ts | 12 ++++++------ packages/core/src/new-api/types/module.ts | 12 ++++++------ 3 files changed, 12 insertions(+), 18 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 756793b60f..3d8f1776e5 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -133,7 +133,6 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; options.value ??= BigInt(0); - options.from ??= this.accounts[0]; this._assertUniqueContractId(futureId); @@ -176,7 +175,6 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; options.value ??= BigInt(0); - options.from ??= this.accounts[0]; this._assertUniqueArtifactContractId(futureId); @@ -217,7 +215,6 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; - options.from ??= this.accounts[0]; this._assertUniqueLibraryId(futureId); @@ -252,7 +249,6 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? libraryName; const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; - options.from ??= this.accounts[0]; this._assertUniqueArtifactLibraryId(futureId); @@ -289,7 +285,6 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; options.value ??= BigInt(0); - options.from ??= this.accounts[0]; this._assertUniqueCallId(futureId); @@ -326,7 +321,6 @@ export class IgnitionModuleBuilderImplementation< ): NamedStaticCallFuture { const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; - options.from ??= this.accounts[0]; this._assertUniqueStaticCallId(futureId); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index eae2082dbc..872d716952 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -59,7 +59,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly constructorArgs: SolidityParamsType, public readonly libraries: Record>, public readonly value: bigint, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); } @@ -79,7 +79,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly artifact: ArtifactType, public readonly libraries: Record>, public readonly value: bigint, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); } @@ -96,7 +96,7 @@ export class NamedLibraryDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: LibraryNameT, public readonly libraries: Record>, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); } @@ -114,7 +114,7 @@ export class ArtifactLibraryDeploymentFutureImplementation< public readonly contractName: LibraryNameT, public readonly artifact: ArtifactType, public readonly libraries: Record>, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); } @@ -134,7 +134,7 @@ export class NamedContractCallFutureImplementation< public readonly contract: ContractFuture, public readonly args: SolidityParamsType, public readonly value: bigint, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); } @@ -153,7 +153,7 @@ export class NamedStaticCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: SolidityParamsType, - public readonly from: string + public readonly from: string | undefined ) { super(id, FutureType.NAMED_STATIC_CALL, module); } diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 447534cb8c..b853ab8a1a 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -67,7 +67,7 @@ export interface NamedContractDeploymentFuture constructorArgs: SolidityParamsType; libraries: Record>; value: bigint; - from: string; + from: string | undefined; } /** @@ -83,7 +83,7 @@ export interface ArtifactContractDeploymentFuture constructorArgs: SolidityParamsType; libraries: Record>; value: bigint; - from: string; + from: string | undefined; } /** @@ -95,7 +95,7 @@ export interface NamedLibraryDeploymentFuture extends ContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; libraries: Record>; - from: string; + from: string | undefined; } /** @@ -109,7 +109,7 @@ export interface ArtifactLibraryDeploymentFuture type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; artifact: ArtifactType; libraries: Record>; - from: string; + from: string | undefined; } /** @@ -125,7 +125,7 @@ export interface NamedContractCallFuture< contract: ContractFuture; args: SolidityParamsType; value: bigint; - from: string; + from: string | undefined; } /** @@ -140,7 +140,7 @@ export interface NamedStaticCallFuture< type: FutureType.NAMED_STATIC_CALL; contract: ContractFuture; args: SolidityParamsType; - from: string; + from: string | undefined; } /** From a895429dc01c9a540ba2b282d9caf3957647447a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 May 2023 00:38:20 -0400 Subject: [PATCH 0350/1302] fix serialization of new fields --- .../new-api/stored-deployment-serializer.ts | 30 +++++++++++++++---- .../new-api/types/serialized-deployment.ts | 9 ++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 9daf8b99a7..32950ed1dd 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -382,6 +382,8 @@ export class StoredDeploymentSerializer { StoredDeploymentSerializer._convertArgToFutureToken(arg) ), libraries: this._convertLibrariesToLibraryTokens(future.libraries), + value: future.value.toString(), + from: future.from, }; return serializedNamedContract; @@ -401,6 +403,8 @@ export class StoredDeploymentSerializer { ), artifact: future.artifact, libraries: this._convertLibrariesToLibraryTokens(future.libraries), + value: future.value.toString(), + from: future.from, }; return serializedArtifactContractDeploy; @@ -417,6 +421,7 @@ export class StoredDeploymentSerializer { StoredDeploymentSerializer._convertLibrariesToLibraryTokens( future.libraries ), + from: future.from, }; return serializedNamedLibraryDeploy; @@ -436,6 +441,7 @@ export class StoredDeploymentSerializer { StoredDeploymentSerializer._convertLibrariesToLibraryTokens( future.libraries ), + from: future.from, }; return serializedArtifactLibraryDeploy; @@ -451,6 +457,8 @@ export class StoredDeploymentSerializer { args: Array.from(future.args).map( StoredDeploymentSerializer._convertArgToFutureToken ), + value: future.value.toString(), + from: future.from, }; return serializedNamedContractCall; @@ -466,6 +474,7 @@ export class StoredDeploymentSerializer { args: Array.from(future.args).map( StoredDeploymentSerializer._convertArgToFutureToken ), + from: future.from, }; return serializedNamedStaticCallFuture; @@ -529,7 +538,9 @@ export class StoredDeploymentSerializer { placeholderModule, serializedFuture.contractName, serializedFuture.constructorArgs, - {} + {}, + BigInt(serializedFuture.value), + serializedFuture.from ); case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: return new ArtifactContractDeploymentFutureImplementation( @@ -538,14 +549,17 @@ export class StoredDeploymentSerializer { serializedFuture.contractName, serializedFuture.constructorArgs, serializedFuture.artifact, - {} + {}, + BigInt(serializedFuture.value), + serializedFuture.from ); case FutureType.NAMED_LIBRARY_DEPLOYMENT: return new NamedLibraryDeploymentFutureImplementation( serializedFuture.id, placeholderModule, serializedFuture.contractName, - {} + {}, + serializedFuture.from ); case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: return new ArtifactLibraryDeploymentFutureImplementation( @@ -553,7 +567,8 @@ export class StoredDeploymentSerializer { placeholderModule, serializedFuture.contractName, serializedFuture.artifact, - {} + {}, + serializedFuture.from ); case FutureType.NAMED_CONTRACT_CALL: return new NamedContractCallFutureImplementation( @@ -561,7 +576,9 @@ export class StoredDeploymentSerializer { placeholderModule, serializedFuture.functionName, serializedFuture.contract as any, - serializedFuture.args + serializedFuture.args, + BigInt(serializedFuture.value), + serializedFuture.from ); case FutureType.NAMED_STATIC_CALL: return new NamedStaticCallFutureImplementation( @@ -569,7 +586,8 @@ export class StoredDeploymentSerializer { placeholderModule, serializedFuture.functionName, serializedFuture.contract as any, - serializedFuture.args + serializedFuture.args, + serializedFuture.from ); case FutureType.CONTRACT_AT: return new ContractAtFutureImplementation( diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 704091c2fc..6c0bf41c30 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -60,6 +60,8 @@ export interface SerializedNamedContractDeploymentFuture contractName: string; constructorArgs: SerializedSolidityParamsType; libraries: SerializedLibraries; + value: string; + from: string | undefined; } /** @@ -74,6 +76,8 @@ export interface SerializedArtifactContractDeploymentFuture constructorArgs: SerializedSolidityParamsType; artifact: ArtifactType; libraries: SerializedLibraries; + value: string; + from: string | undefined; } /** @@ -86,6 +90,7 @@ export interface SerializedNamedLibraryDeploymentFuture type: FutureType.NAMED_LIBRARY_DEPLOYMENT; contractName: string; libraries: SerializedLibraries; + from: string | undefined; } /** @@ -99,6 +104,7 @@ export interface SerializedArtifactLibraryDeploymentFuture contractName: string; artifact: ArtifactType; libraries: SerializedLibraries; + from: string | undefined; } /** @@ -112,6 +118,8 @@ export interface SerializedNamedContractCallFuture functionName: string; contract: FutureToken; args: SerializedSolidityParamsType; + value: string; + from: string | undefined; } /** @@ -124,6 +132,7 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { functionName: string; contract: FutureToken; args: SerializedSolidityParamsType; + from: string | undefined; } /** From f4fd0d27f795561d83e3b093982f1fbf674d0722 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 18 May 2023 22:19:52 -0400 Subject: [PATCH 0351/1302] added getParameter to new API --- .../src/new-api/internal/module-builder.ts | 47 +++++++--- packages/core/src/new-api/stubs.ts | 9 +- .../core/src/new-api/types/module-builder.ts | 7 +- packages/core/src/new-api/types/module.ts | 11 ++- packages/core/test/new-api/getParameter.ts | 87 +++++++++++++++++++ 5 files changed, 148 insertions(+), 13 deletions(-) create mode 100644 packages/core/test/new-api/getParameter.ts diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 3d8f1776e5..8ec4081aa4 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -2,7 +2,7 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; -import { ArtifactType, SolidityParamsType } from "../stubs"; +import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, @@ -10,6 +10,7 @@ import { ContractFuture, IgnitionModule, IgnitionModuleResult, + ModuleParameters, NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -60,7 +61,8 @@ export class ModuleConstructor { constructor( public readonly chainId: number, - public readonly accounts: string[] + public readonly accounts: string[], + public readonly parameters: ModuleParameters = {} ) {} public construct< @@ -93,7 +95,8 @@ export class ModuleConstructor { this, mod, this.chainId, - this.accounts + this.accounts, + this.parameters ) ); @@ -119,7 +122,8 @@ export class IgnitionModuleBuilderImplementation< IgnitionModuleResultsT >, public readonly chainId: number, - public readonly accounts: string[] + public readonly accounts: string[], + public readonly parameters: ModuleParameters = {} ) { this._futureIds = new Set(); } @@ -376,6 +380,22 @@ export class IgnitionModuleBuilderImplementation< return future; } + public getParameter( + parameterName: string, + defaultValue?: ParamType + ): ParamType { + const param = this.parameters[parameterName] ?? defaultValue; + + if (param === undefined) { + this._throwErrorWithStackTrace( + `Module parameter '${parameterName}' is required, but none was given`, + this.getParameter + ); + } + + return param as ParamType; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, @@ -403,18 +423,25 @@ export class IgnitionModuleBuilderImplementation< return submodule.results; } + private _throwErrorWithStackTrace( + message: string, + func: (...[]: any[]) => any + ): never { + const validationError = new IgnitionValidationError(message); + + // Improve the stack trace to stop on module api level + Error.captureStackTrace(validationError, func); + + throw validationError; + } + private _assertUniqueFutureId( futureId: string, message: string, func: (...[]: any[]) => any ) { if (this._futureIds.has(futureId)) { - const validationError = new IgnitionValidationError(message); - - // Improve the stack trace to stop on module api level - Error.captureStackTrace(validationError, func); - - throw validationError; + this._throwErrorWithStackTrace(message, func); } this._futureIds.add(futureId); diff --git a/packages/core/src/new-api/stubs.ts b/packages/core/src/new-api/stubs.ts index 65ad836e91..819883f9de 100644 --- a/packages/core/src/new-api/stubs.ts +++ b/packages/core/src/new-api/stubs.ts @@ -1,9 +1,16 @@ +/** + * The type representing all valid types for solidity parameters. + * + * @beta + */ +export type SolidityParamType = any; + /** * The composite type of a solidity methods parameters. * * @beta */ -export type SolidityParamsType = any[]; +export type SolidityParamsType = SolidityParamType[]; /** * The artifact of a contract compilation. diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index e7ab5c4532..1b21bbed33 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,4 +1,4 @@ -import { ArtifactType, SolidityParamsType } from "../stubs"; +import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { ArtifactContractDeploymentFuture, @@ -164,6 +164,11 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): ContractAtFuture; + getParameter( + parameterName: string, + defaultValue?: ParamType + ): ParamType; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index b853ab8a1a..698c5c1809 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,4 +1,4 @@ -import { ArtifactType, SolidityParamsType } from "../stubs"; +import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; /** * The different future types supported by Ignition. @@ -155,6 +155,15 @@ export interface ContractAtFuture extends ContractFuture { artifact: ArtifactType; } +/** + * An object containing the parameters passed into the module. + * + * @beta + */ +export interface ModuleParameters { + [parameterName: string]: SolidityParamType; +} + /** * The results of deploying a module must be a dictionary of contract futures * diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts new file mode 100644 index 0000000000..d0b1023224 --- /dev/null +++ b/packages/core/test/new-api/getParameter.ts @@ -0,0 +1,87 @@ +import { assert } from "chai"; + +import { defineModule } from "../../src/new-api/define-module"; +import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + +describe("getParameter", () => { + it("should record given parameters", () => { + const constructor = new ModuleConstructor(0, [], { param1: 42 }); + + assert.equal(constructor.parameters.param1, 42); + }); + + it("should allow a parameter to be passed as an arg", () => { + const moduleWithParamsDefinition = defineModule("Module1", (m) => { + const arg1 = m.getParameter("param1"); + const contract1 = m.contract("Contract1", [arg1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, [], { param1: "arg1" }); + const moduleWithParams = constructor.construct(moduleWithParamsDefinition); + + assert.isDefined(moduleWithParams); + + const contractFuture = [...moduleWithParams.futures].find( + ({ id }) => id === "Module1:Contract1" + ); + + if ( + !(contractFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(contractFuture.constructorArgs.length, 1); + assert.equal(contractFuture.constructorArgs[0], "arg1"); + }); + + it("should allow a parameter to have a default value", () => { + const moduleWithParamsDefinition = defineModule("Module1", (m) => { + const arg1 = m.getParameter("param1", "arg1"); + const arg2 = m.getParameter("param2", 42); + const contract1 = m.contract("Contract1", [arg1, arg2]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, [], { + param1: "overriddenParam", + }); + const moduleWithParams = constructor.construct(moduleWithParamsDefinition); + + assert.isDefined(moduleWithParams); + + const contractFuture = [...moduleWithParams.futures].find( + ({ id }) => id === "Module1:Contract1" + ); + + if ( + !(contractFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(contractFuture.constructorArgs.length, 2); + assert.equal(contractFuture.constructorArgs[0], "overriddenParam"); + assert.equal(contractFuture.constructorArgs[1], 42); + }); + + it("should throw if a parameter has no value", () => { + const moduleWithParamsDefinition = defineModule("Module1", (m) => { + const arg1 = m.getParameter("param1"); + const contract1 = m.contract("Contract1", [arg1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + + assert.throws( + () => constructor.construct(moduleWithParamsDefinition), + /Module parameter 'param1' is required, but none was given/ + ); + }); +}); From f3966207b84adeca538588d5bb965651f3a646e2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 21 May 2023 23:27:01 -0400 Subject: [PATCH 0352/1302] adding default any type --- packages/core/src/index.ts | 6 +++++- packages/core/src/new-api/internal/module-builder.ts | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b1558744d3..f3c3806b4a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -6,7 +6,11 @@ export { defineModule } from "./new-api/define-module"; export { ModuleConstructor } from "./new-api/internal/module-builder"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; /* TODO: move out and concretize these stubs */ -export { ArtifactType, SolidityParamsType } from "./new-api/stubs"; +export { + ArtifactType, + SolidityParamsType, + SolidityParamType, +} from "./new-api/stubs"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 8ec4081aa4..3b61f7f0dd 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -380,7 +380,7 @@ export class IgnitionModuleBuilderImplementation< return future; } - public getParameter( + public getParameter( parameterName: string, defaultValue?: ParamType ): ParamType { From c165e0ef64fa372f9dc5de1bd85562f12abac96e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 21 May 2023 23:45:36 -0400 Subject: [PATCH 0353/1302] moving params to allow for multiple modules --- .../src/new-api/internal/module-builder.ts | 4 ++-- packages/core/test/new-api/getParameter.ts | 20 ++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 3b61f7f0dd..be65bdcce6 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -62,7 +62,7 @@ export class ModuleConstructor { constructor( public readonly chainId: number, public readonly accounts: string[], - public readonly parameters: ModuleParameters = {} + public readonly parameters: { [moduleId: string]: ModuleParameters } = {} ) {} public construct< @@ -96,7 +96,7 @@ export class ModuleConstructor { mod, this.chainId, this.accounts, - this.parameters + this.parameters[moduleDefintion.id] ) ); diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index d0b1023224..08512446b5 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -6,20 +6,24 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("getParameter", () => { it("should record given parameters", () => { - const constructor = new ModuleConstructor(0, [], { param1: 42 }); + const constructor = new ModuleConstructor(0, [], { + TestModule: { param1: 42 }, + }); - assert.equal(constructor.parameters.param1, 42); + assert.equal(constructor.parameters.TestModule.param1, 42); }); it("should allow a parameter to be passed as an arg", () => { const moduleWithParamsDefinition = defineModule("Module1", (m) => { - const arg1 = m.getParameter("param1"); + const arg1 = m.getParameter("param1"); const contract1 = m.contract("Contract1", [arg1]); return { contract1 }; }); - const constructor = new ModuleConstructor(0, [], { param1: "arg1" }); + const constructor = new ModuleConstructor(0, [], { + Module1: { param1: "arg1" }, + }); const moduleWithParams = constructor.construct(moduleWithParamsDefinition); assert.isDefined(moduleWithParams); @@ -40,15 +44,17 @@ describe("getParameter", () => { it("should allow a parameter to have a default value", () => { const moduleWithParamsDefinition = defineModule("Module1", (m) => { - const arg1 = m.getParameter("param1", "arg1"); - const arg2 = m.getParameter("param2", 42); + const arg1 = m.getParameter("param1", "arg1"); + const arg2 = m.getParameter("param2", 42); const contract1 = m.contract("Contract1", [arg1, arg2]); return { contract1 }; }); const constructor = new ModuleConstructor(0, [], { - param1: "overriddenParam", + Module1: { + param1: "overriddenParam", + }, }); const moduleWithParams = constructor.construct(moduleWithParamsDefinition); From d65c8e0aab613af55779088863148f2651db2e8d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 May 2023 18:30:10 -0400 Subject: [PATCH 0354/1302] add futures support to contractAt --- .../src/new-api/internal/module-builder.ts | 12 ++-- packages/core/src/new-api/internal/module.ts | 2 +- .../core/src/new-api/types/module-builder.ts | 2 +- packages/core/src/new-api/types/module.ts | 2 +- packages/core/test/new-api/contractAt.ts | 59 ++++++++++++++----- 5 files changed, 54 insertions(+), 23 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index be65bdcce6..3669ef6225 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -354,12 +354,12 @@ export class IgnitionModuleBuilderImplementation< public contractAt( contractName: string, - address: string, + address: string | NamedStaticCallFuture, artifact: ArtifactType, options: ContractAtOptions = {} ): ContractAtFuture { - const id = options.id ?? address; - const futureId = `${this._module.id}:${contractName}:${id}`; + const id = options.id ?? contractName; + const futureId = `${this._module.id}:${id}`; this._assertUniqueContractAtId(futureId); @@ -375,6 +375,10 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } + if (typeof address !== "string") { + future.dependencies.add(address); + } + this._module.futures.add(future); return future; @@ -498,7 +502,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueContractAtId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Contracts must have unique ids, ${futureId} has already been used, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", artifact, { id: "MyId"})\``, this.contractAt ); } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 872d716952..31cd78af19 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -167,7 +167,7 @@ export class ContractAtFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly address: string, + public readonly address: string | NamedStaticCallFuture, public readonly artifact: ArtifactType ) { super(id, FutureType.CONTRACT_AT, module); diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 1b21bbed33..f976bcd7be 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -159,7 +159,7 @@ export interface IgnitionModuleBuilder { contractAt( contractName: string, - address: string, + address: string | NamedStaticCallFuture, artifact: ArtifactType, options?: ContractAtOptions ): ContractAtFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 698c5c1809..bf1aea9473 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -151,7 +151,7 @@ export interface NamedStaticCallFuture< */ export interface ContractAtFuture extends ContractFuture { type: FutureType.CONTRACT_AT; - address: string; + address: string | NamedStaticCallFuture; artifact: ArtifactType; } diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 16a58924b4..82e6fa26fb 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -27,7 +27,7 @@ describe("contractAt", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1:0xtest" + "Module1:Contract1" ); // Stores the address @@ -70,22 +70,50 @@ describe("contractAt", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); + it("should be able to pass a static call future as the address", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const call = m.staticCall(example, "getAddress"); + + const another = m.contractAt("Another", call, fakeArtifact); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.equal(moduleWithDependentContracts.futures.size, 3); + + const anotherFuture = moduleWithDependentContracts.results.another; + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#getAddress" + ); + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(callFuture!)); + }); + describe("passing id", () => { - it("should use contract at twice by passing an id", () => { + it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( "Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact, - { - id: "first", - } + { id: "first" } ); const sameContract2 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact, { id: "second", @@ -101,15 +129,14 @@ describe("contractAt", () => { moduleWithSameContractTwiceDefinition ); - // Sets ids based on module id and contract name assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:SameContract:first" + "Module1:first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:SameContract:second" + "Module1:second" ); }); @@ -117,12 +144,12 @@ describe("contractAt", () => { const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact ); const sameContract2 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact ); @@ -133,7 +160,7 @@ describe("contractAt", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:SameContract:0xtest has already been used/ + /Duplicated id Module1:SameContract found in module Module1/ ); }); @@ -141,7 +168,7 @@ describe("contractAt", () => { const moduleDefinition = defineModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact, { id: "same", @@ -149,7 +176,7 @@ describe("contractAt", () => { ); const sameContract2 = m.contractAt( "SameContract", - "0xtest", + "0x123", fakeArtifact, { id: "same", @@ -163,7 +190,7 @@ describe("contractAt", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Contracts must have unique ids, Module1:SameContract:same has already been used/ + /Duplicated id Module1:same found in module Module1/ ); }); }); From 25b4c2b1dc635e3135955fc5a14d3928f6954d87 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 May 2023 19:48:19 -0400 Subject: [PATCH 0355/1302] add named and artifact variants for contractAt --- .../src/new-api/internal/module-builder.ts | 52 ++++- packages/core/src/new-api/internal/module.ts | 25 ++- .../new-api/stored-deployment-serializer.ts | 77 ++++++- .../core/src/new-api/types/module-builder.ts | 13 +- packages/core/src/new-api/types/module.ts | 20 +- .../new-api/types/serialized-deployment.ts | 23 +- packages/core/test/new-api/contractAt.ts | 14 +- .../test/new-api/contractAtFromArtifact.ts | 206 ++++++++++++++++++ 8 files changed, 388 insertions(+), 42 deletions(-) create mode 100644 packages/core/test/new-api/contractAtFromArtifact.ts diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 3669ef6225..2c8f3a15f5 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -4,13 +4,14 @@ import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { + ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, - ContractAtFuture, ContractFuture, IgnitionModule, IgnitionModuleResult, ModuleParameters, + NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -28,10 +29,11 @@ import { } from "../types/module-builder"; import { + ArtifactContractAtFutureImplementation, ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, - ContractAtFutureImplementation, IgnitionModuleImplementation, + NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, @@ -352,18 +354,48 @@ export class IgnitionModuleBuilderImplementation< return future; } - public contractAt( + public contractAt( + contractName: ContractNameT, + address: string | NamedStaticCallFuture, + options: ContractAtOptions = {} + ): NamedContractAtFuture { + const id = options.id ?? contractName; + const futureId = `${this._module.id}:${id}`; + + this._assertUniqueContractAtId(futureId); + + const future = new NamedContractAtFutureImplementation( + futureId, + this._module, + contractName, + address + ); + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + if (typeof address !== "string") { + future.dependencies.add(address); + } + + this._module.futures.add(future); + + return future; + } + + public contractAtFromArtifact( contractName: string, address: string | NamedStaticCallFuture, artifact: ArtifactType, options: ContractAtOptions = {} - ): ContractAtFuture { + ): ArtifactContractAtFuture { const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; - this._assertUniqueContractAtId(futureId); + this._assertUniqueContractAtFromArtifactId(futureId); - const future = new ContractAtFutureImplementation( + const future = new ArtifactContractAtFutureImplementation( futureId, this._module, contractName, @@ -506,4 +538,12 @@ export class IgnitionModuleBuilderImplementation< this.contractAt ); } + + private _assertUniqueContractAtFromArtifactId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAtFromArtifact("MyContract", "0x123...", { id: "MyId"})\``, + this.contractAtFromArtifact + ); + } } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 31cd78af19..a4e38dbe51 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,13 +1,14 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { + ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, - ContractAtFuture, ContractFuture, Future, FutureType, IgnitionModule, IgnitionModuleResult, + NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -159,18 +160,32 @@ export class NamedStaticCallFutureImplementation< } } -export class ContractAtFutureImplementation - extends BaseFuture - implements ContractAtFuture +export class NamedContractAtFutureImplementation + extends BaseFuture + implements NamedContractAtFuture { constructor( public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, + public readonly address: string | NamedStaticCallFuture + ) { + super(id, FutureType.NAMED_CONTRACT_AT, module); + } +} + +export class ArtifactContractAtFutureImplementation + extends BaseFuture + implements ArtifactContractAtFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly contractName: string, public readonly address: string | NamedStaticCallFuture, public readonly artifact: ArtifactType ) { - super(id, FutureType.CONTRACT_AT, module); + super(id, FutureType.ARTIFACT_CONTRACT_AT, module); } } diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 32950ed1dd..c07ff52176 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -1,10 +1,11 @@ import { IgnitionError } from "../errors"; import { + ArtifactContractAtFutureImplementation, ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, - ContractAtFutureImplementation, IgnitionModuleImplementation, + NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, @@ -17,16 +18,18 @@ import { FutureType, IgnitionModule, IgnitionModuleResult, + NamedStaticCallFuture, } from "./types/module"; import { BaseSerializedFuture, FutureToken, ModuleToken, + SerializedArtifactContractAtFuture, SerializedArtifactContractDeploymentFuture, SerializedArtifactLibraryDeploymentFuture, - SerializedContractAtFuture, SerializedFuture, SerializedLibraries, + SerializedNamedContractAtFuture, SerializedNamedContractCallFuture, SerializedNamedContractDeploymentFuture, SerializedNamedLibraryDeploymentFuture, @@ -262,8 +265,32 @@ export class StoredDeploymentSerializer { .futureId ] as ContractFuture ); - } else if (future instanceof ContractAtFutureImplementation) { - // no future specific tokens to resolve + } else if (future instanceof NamedContractAtFutureImplementation) { + if (typeof future.address !== "string") { + this._overwriteReadonly( + future, + "address", + partialFutureLookup[ + ( + (serializedFuture as SerializedNamedContractAtFuture) + .address as unknown as NamedStaticCallFuture + ).id + ] as NamedStaticCallFuture + ); + } + } else if (future instanceof ArtifactContractAtFutureImplementation) { + if (typeof future.address !== "string") { + this._overwriteReadonly( + future, + "address", + partialFutureLookup[ + ( + (serializedFuture as SerializedArtifactContractAtFuture) + .address as unknown as NamedStaticCallFuture + ).id + ] as NamedStaticCallFuture + ); + } } else { throw new IgnitionError( `unknown future type: ${FutureType[future.type]}` @@ -478,19 +505,38 @@ export class StoredDeploymentSerializer { }; return serializedNamedStaticCallFuture; - } else if (future instanceof ContractAtFutureImplementation) { - const serializedContractAtFuture: SerializedContractAtFuture = { + } else if (future instanceof NamedContractAtFutureImplementation) { + const serializedNamedContractAtFuture: SerializedNamedContractAtFuture = { id: future.id, type: future.type, dependencies: Array.from(future.dependencies).map( StoredDeploymentSerializer._convertFutureToFutureToken ), contractName: future.contractName, - address: future.address, - artifact: future.artifact, + address: + typeof future.address === "string" + ? future.address + : this._convertFutureToFutureToken(future.address), }; - return serializedContractAtFuture; + return serializedNamedContractAtFuture; + } else if (future instanceof ArtifactContractAtFutureImplementation) { + const serializedArtifactContractAtFuture: SerializedArtifactContractAtFuture = + { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + contractName: future.contractName, + address: + typeof future.address === "string" + ? future.address + : this._convertFutureToFutureToken(future.address), + artifact: future.artifact, + }; + + return serializedArtifactContractAtFuture; } else { throw new IgnitionError( `Unknown future type while serializing: ${FutureType[future.type]}` @@ -589,12 +635,19 @@ export class StoredDeploymentSerializer { serializedFuture.args, serializedFuture.from ); - case FutureType.CONTRACT_AT: - return new ContractAtFutureImplementation( + case FutureType.NAMED_CONTRACT_AT: + return new NamedContractAtFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.contractName, + serializedFuture.address as any + ); + case FutureType.ARTIFACT_CONTRACT_AT: + return new ArtifactContractAtFutureImplementation( serializedFuture.id, placeholderModule, serializedFuture.contractName, - serializedFuture.address, + serializedFuture.address as any, serializedFuture.artifact ); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index f976bcd7be..a6915cf553 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,12 +1,13 @@ import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { + ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, - ContractAtFuture, ContractFuture, Future, IgnitionModuleResult, + NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -157,12 +158,18 @@ export interface IgnitionModuleBuilder { options?: StaticCallOptions ): NamedStaticCallFuture; - contractAt( + contractAt( + contractName: ContractNameT, + address: string | NamedStaticCallFuture, + options?: ContractAtOptions + ): NamedContractAtFuture; + + contractAtFromArtifact( contractName: string, address: string | NamedStaticCallFuture, artifact: ArtifactType, options?: ContractAtOptions - ): ContractAtFuture; + ): ArtifactContractAtFuture; getParameter( parameterName: string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index bf1aea9473..0d8a00fcb4 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -12,7 +12,8 @@ export enum FutureType { ARTIFACT_LIBRARY_DEPLOYMENT, NAMED_CONTRACT_CALL, NAMED_STATIC_CALL, - CONTRACT_AT, + NAMED_CONTRACT_AT, + ARTIFACT_CONTRACT_AT, } /** @@ -144,13 +145,24 @@ export interface NamedStaticCallFuture< } /** - * A future representing a previously deployed contract at a known address. + * A future representing a previously deployed contract at a known address that belongs to this project. + * + * @beta + */ +export interface NamedContractAtFuture + extends ContractFuture { + type: FutureType.NAMED_CONTRACT_AT; + address: string | NamedStaticCallFuture; +} + +/** + * A future representing a previously deployed contract at a known address with a given artifact. * It may not belong to this project, and we may struggle to type. * * @beta */ -export interface ContractAtFuture extends ContractFuture { - type: FutureType.CONTRACT_AT; +export interface ArtifactContractAtFuture extends ContractFuture { + type: FutureType.ARTIFACT_CONTRACT_AT; address: string | NamedStaticCallFuture; artifact: ArtifactType; } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 6c0bf41c30..649e050422 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -136,14 +136,26 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { } /** - * The serialized version of ContractAtFuture. + * The serialized version of NamedContractAtFuture. * * @beta */ -export interface SerializedContractAtFuture extends BaseSerializedFuture { - type: FutureType.CONTRACT_AT; +export interface SerializedNamedContractAtFuture extends BaseSerializedFuture { + type: FutureType.NAMED_CONTRACT_AT; contractName: string; - address: string; + address: string | FutureToken; +} + +/** + * The serialized version of ArtifactContractAtFuture. + * + * @beta + */ +export interface SerializedArtifactContractAtFuture + extends BaseSerializedFuture { + type: FutureType.ARTIFACT_CONTRACT_AT; + contractName: string; + address: string | FutureToken; artifact: ArtifactType; } @@ -240,4 +252,5 @@ export type SerializedFuture = | SerializedArtifactLibraryDeploymentFuture | SerializedNamedContractCallFuture | SerializedNamedStaticCallFuture - | SerializedContractAtFuture; + | SerializedNamedContractAtFuture + | SerializedArtifactContractAtFuture; diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 82e6fa26fb..6df991fba1 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -10,7 +10,7 @@ describe("contractAt", () => { const moduleWithContractFromArtifactDefinition = defineModule( "Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); + const contract1 = m.contractAt("Contract1", "0xtest"); return { contract1 }; } @@ -48,7 +48,7 @@ describe("contractAt", () => { "Module1", (m) => { const example = m.contract("Example"); - const another = m.contractAt("Another", "0xtest", fakeArtifact, { + const another = m.contractAt("Another", "0xtest", { after: [example], }); @@ -77,7 +77,7 @@ describe("contractAt", () => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); - const another = m.contractAt("Another", call, fakeArtifact); + const another = m.contractAt("Another", call); return { example, another }; } @@ -108,13 +108,13 @@ describe("contractAt", () => { const sameContract1 = m.contractAt( "SameContract", "0x123", - fakeArtifact, + { id: "first" } ); const sameContract2 = m.contractAt( "SameContract", "0x123", - fakeArtifact, + { id: "second", } @@ -169,7 +169,7 @@ describe("contractAt", () => { const sameContract1 = m.contractAt( "SameContract", "0x123", - fakeArtifact, + { id: "same", } @@ -177,7 +177,7 @@ describe("contractAt", () => { const sameContract2 = m.contractAt( "SameContract", "0x123", - fakeArtifact, + { id: "same", } diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts new file mode 100644 index 0000000000..0720244da4 --- /dev/null +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -0,0 +1,206 @@ +import { assert } from "chai"; + +import { defineModule } from "../../src/new-api/define-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + +describe("contractAtFromArtifactFromArtifact", () => { + const fakeArtifact: any = {}; + + it("should be able to setup a contract at a given address", () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + "0xtest", + fakeArtifact + ); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithContractFromArtifact = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + + assert.isDefined(moduleWithContractFromArtifact); + + // Sets ids based on module id and contract name + assert.equal(moduleWithContractFromArtifact.id, "Module1"); + assert.equal( + moduleWithContractFromArtifact.results.contract1.id, + "Module1:Contract1" + ); + + // Stores the address + assert.deepStrictEqual( + moduleWithContractFromArtifact.results.contract1.address, + "0xtest" + ); + + // 1 contract future + assert.equal(moduleWithContractFromArtifact.futures.size, 1); + + // No submodules + assert.equal(moduleWithContractFromArtifact.submodules.size, 0); + }); + + it("should be able to pass an after dependency", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const another = m.contractAtFromArtifact( + "Another", + "0xtest", + fakeArtifact, + { + after: [example], + } + ); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.equal(moduleWithDependentContracts.futures.size, 2); + + const exampleFuture = moduleWithDependentContracts.results.example; + const anotherFuture = moduleWithDependentContracts.results.another; + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass a static call future as the address", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + const call = m.staticCall(example, "getAddress"); + + const another = m.contractAtFromArtifact("Another", call, fakeArtifact); + + return { example, another }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.equal(moduleWithDependentContracts.futures.size, 3); + + const anotherFuture = moduleWithDependentContracts.results.another; + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#getAddress" + ); + + assert.equal(anotherFuture.dependencies.size, 1); + assert(anotherFuture.dependencies.has(callFuture!)); + }); + + describe("passing id", () => { + it("should be able to deploy the same contract twice by passing an id", () => { + const moduleWithSameContractTwiceDefinition = defineModule( + "Module1", + (m) => { + const sameContract1 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact, + { id: "first" } + ); + const sameContract2 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact, + { + id: "second", + } + ); + + return { sameContract1, sameContract2 }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithSameContractTwice = constructor.construct( + moduleWithSameContractTwiceDefinition + ); + + assert.equal(moduleWithSameContractTwice.id, "Module1"); + assert.equal( + moduleWithSameContractTwice.results.sameContract1.id, + "Module1:first" + ); + assert.equal( + moduleWithSameContractTwice.results.sameContract2.id, + "Module1:second" + ); + }); + + it("should throw if the same contract is deployed twice without differentiating ids", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const sameContract1 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact + ); + const sameContract2 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact + ); + + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Duplicated id Module1:SameContract found in module Module1/ + ); + }); + + it("should throw if a contract tries to pass the same id twice", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const sameContract1 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact, + { + id: "same", + } + ); + const sameContract2 = m.contractAtFromArtifact( + "SameContract", + "0x123", + fakeArtifact, + { + id: "same", + } + ); + + return { sameContract1, sameContract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Duplicated id Module1:same found in module Module1/ + ); + }); + }); +}); From 00650d756c1ab662d51e9ebd771d2ca054a14e5e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 May 2023 20:14:04 -0400 Subject: [PATCH 0356/1302] fix serializer test --- .../new-api/stored-deployment-serializer.ts | 104 +++++++++++++++++- 1 file changed, 99 insertions(+), 5 deletions(-) diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 018ab98205..9a9ed9c5ad 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -105,11 +105,9 @@ describe("stored deployment serializer", () => { }); describe("contractAt", () => { - const fakeArtifact = ["FAKE ARTIFACT"]; - it("should serialize a contractAt", () => { const moduleDefinition = defineModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + const contract1 = m.contractAt("Contract1", "0x0"); return { contract1 }; }); @@ -123,10 +121,28 @@ describe("stored deployment serializer", () => { }); }); + it("should serialize a contractAt with a future address", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAt("Contract1", "0x0"); + const call = m.staticCall(contract1, "getAddress"); + const contract2 = m.contractAt("Contract2", call); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + it("should serialize a contractAt with dependency", () => { const moduleDefinition = defineModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); - const contract2 = m.contractAt("Contract2", "0x0", fakeArtifact, { + const contract1 = m.contractAt("Contract1", "0x0"); + const contract2 = m.contractAt("Contract2", "0x0", { after: [contract1], }); @@ -143,6 +159,84 @@ describe("stored deployment serializer", () => { }); }); + describe("contractAtFromArtifact", () => { + const fakeArtifact = ["FAKE ARTIFACT"]; + + it("should serialize a contractAt", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + "0x0", + fakeArtifact + ); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a contractAt with a future address", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + "0x0", + fakeArtifact + ); + const call = m.staticCall(contract1, "getAddress"); + const contract2 = m.contractAtFromArtifact( + "Contract2", + call, + fakeArtifact + ); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should serialize a contractAt with dependency", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + "0x0", + fakeArtifact + ); + const contract2 = m.contractAtFromArtifact( + "Contract2", + "0x0", + fakeArtifact, + { + after: [contract1], + } + ); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); + describe("library", () => { const fakeArtifact = ["FAKE ARTIFACT"]; From d52f2e48d28405a87d02a573dc4b4dc65cc1325e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 May 2023 20:50:41 -0400 Subject: [PATCH 0357/1302] add contract at futures to plan ui --- .../new-api/stored-deployment-serializer.ts | 8 ++--- .../core/src/new-api/types/execution-state.ts | 4 ++- .../components/future-summary.tsx | 32 ++++++++++++++++--- .../pages/plan-overview/components/action.tsx | 10 ++++-- packages/ui/src/types.ts | 9 ++++-- packages/ui/src/utils/to-mermaid.ts | 10 ++++-- 6 files changed, 58 insertions(+), 15 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index c07ff52176..084d69f50d 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -273,8 +273,8 @@ export class StoredDeploymentSerializer { partialFutureLookup[ ( (serializedFuture as SerializedNamedContractAtFuture) - .address as unknown as NamedStaticCallFuture - ).id + .address as unknown as FutureToken + ).futureId ] as NamedStaticCallFuture ); } @@ -286,8 +286,8 @@ export class StoredDeploymentSerializer { partialFutureLookup[ ( (serializedFuture as SerializedArtifactContractAtFuture) - .address as unknown as NamedStaticCallFuture - ).id + .address as unknown as FutureToken + ).futureId ] as NamedStaticCallFuture ); } diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/types/execution-state.ts index 72efdb40b7..8c889b7e38 100644 --- a/packages/core/src/new-api/types/execution-state.ts +++ b/packages/core/src/new-api/types/execution-state.ts @@ -135,7 +135,9 @@ type CallExecutionState = BaseExecutionState; type StaticCallExecutionState = BaseExecutionState; -type ContractAtExecutionState = BaseExecutionState; +type ContractAtExecutionState = BaseExecutionState< + FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT +>; export type ExecutionState = | DeploymentExecutionState diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index 2ba0ee0907..e775195058 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -46,8 +46,14 @@ function resolveTitleFor(future: UiFuture): string { return `Call - ${future.contract.contractName}/${future.functionName}`; case FutureType.NAMED_STATIC_CALL: return `Static call - ${future.contract.contractName}/${future.functionName}`; - case FutureType.CONTRACT_AT: - return `Existing contract - ${future.contractName} (${future.address})`; + case FutureType.NAMED_CONTRACT_AT: + return `Existing contract - ${future.contractName} (${ + typeof future.address === "string" ? future.address : future.address.id + })`; + case FutureType.ARTIFACT_CONTRACT_AT: + return `Existing contract from Artifact - ${future.contractName} (${ + typeof future.address === "string" ? future.address : future.address.id + })`; } } @@ -119,11 +125,29 @@ const FutureDetailsSection: React.FC<{ future: UiFuture }> = ({ future }) => {
    ); - case FutureType.CONTRACT_AT: + case FutureType.NAMED_CONTRACT_AT: return (

    Contract - {future.contractName}

    -

    Address - {future.address}

    +

    + Address -{" "} + {typeof future.address === "string" + ? future.address + : future.address.id} +

    +
    + ); + + case FutureType.ARTIFACT_CONTRACT_AT: + return ( +
    +

    Contract - {future.contractName}

    +

    + Address -{" "} + {typeof future.address === "string" + ? future.address + : future.address.id} +

    ); } diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 11f13a0e4f..46a10c9475 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -36,8 +36,14 @@ function toDisplayText(future: UiFuture): string { return `Call ${future.contract.contractName}/${future.functionName}`; case FutureType.NAMED_STATIC_CALL: return `Static call ${future.contract.contractName}/${future.functionName}`; - case FutureType.CONTRACT_AT: - return `Existing contract ${future.contractName} (${future.address})`; + case FutureType.NAMED_CONTRACT_AT: + return `Existing contract ${future.contractName} (${ + typeof future.address === "string" ? future.address : future.address.id + })`; + case FutureType.ARTIFACT_CONTRACT_AT: + return `Existing contract ${future.contractName} from artifact (${ + typeof future.address === "string" ? future.address : future.address.id + })`; } } diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index 50de7d92b0..3621e118ce 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -1,7 +1,8 @@ import { + ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, - ContractAtFuture, + NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -18,4 +19,8 @@ export type UiCallFuture = | NamedContractCallFuture | NamedStaticCallFuture; -export type UiFuture = UiContractFuture | UiCallFuture | ContractAtFuture; +export type UiContractAtFuture = + | NamedContractAtFuture + | ArtifactContractAtFuture; + +export type UiFuture = UiContractFuture | UiCallFuture | UiContractAtFuture; diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 4b5b96502b..ab3f4ed0ff 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -68,7 +68,13 @@ function toLabel(f: UiFuture): string { return `Call ${f.contract.contractName}/${f.functionName}`; case FutureType.NAMED_STATIC_CALL: return `Static call ${f.contract.contractName}/${f.functionName}`; - case FutureType.CONTRACT_AT: - return `Existing contract ${f.contractName} (${f.address})`; + case FutureType.NAMED_CONTRACT_AT: + return `Existing contract ${f.contractName} (${ + typeof f.address === "string" ? f.address : f.address.id + })`; + case FutureType.ARTIFACT_CONTRACT_AT: + return `Existing contract from artifact ${f.contractName} (${ + typeof f.address === "string" ? f.address : f.address.id + })`; } } From 1b5472fd41f2c46c159a2aac145e47abf42e1a25 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 19 May 2023 19:02:28 -0300 Subject: [PATCH 0358/1302] Add readEventArgument action --- .../src/new-api/internal/module-builder.ts | 57 +++++ packages/core/src/new-api/internal/module.ts | 18 ++ .../core/src/new-api/types/module-builder.ts | 35 +++ packages/core/src/new-api/types/module.ts | 16 ++ .../core/test/new-api/readEventArgument.ts | 211 ++++++++++++++++++ 5 files changed, 337 insertions(+) create mode 100644 packages/core/test/new-api/readEventArgument.ts diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 2c8f3a15f5..33e27f38e4 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -16,6 +16,7 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, NamedStaticCallFuture, + ReadEventArgumentFuture, } from "../types/module"; import { CallOptions, @@ -26,6 +27,7 @@ import { IgnitionModuleDefinition, LibraryFromArtifactOptions, LibraryOptions, + ReadEventArgumentOptions, } from "../types/module-builder"; import { @@ -38,6 +40,7 @@ import { NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, + ReadEventArgumentFutureImplementation, } from "./module"; import { isFuture } from "./utils"; @@ -432,6 +435,52 @@ export class IgnitionModuleBuilderImplementation< return param as ParamType; } + public readEventArgument( + futureToReadFrom: + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedContractCallFuture, + eventName: string, + argumentName: string, + options: ReadEventArgumentOptions = {} + ): ReadEventArgumentFuture { + const eventIndex = options.eventIndex ?? 0; + + const futureToReadFromsContract = + "contract" in futureToReadFrom + ? futureToReadFrom.contract + : futureToReadFrom; + + const emitter = options.emitter ?? futureToReadFromsContract; + + const id = + options.id ?? + `${emitter.contractName}#${eventName}#${argumentName}#${eventIndex}`; + + const futureId = `${this._module.id}:${id}`; + + this._assertUniqueReadEventArgumentId(futureId); + + const future = new ReadEventArgumentFutureImplementation( + futureId, + this._module, + futureToReadFrom, + eventName, + argumentName, + emitter, + eventIndex + ); + + future.dependencies.add(futureToReadFrom); + if (options.emitter !== undefined) { + future.dependencies.add(options.emitter); + } + + this._module.futures.add(future); + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, @@ -546,4 +595,12 @@ export class IgnitionModuleBuilderImplementation< this.contractAtFromArtifact ); } + + private _assertUniqueReadEventArgumentId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.readEventArgument("MyContract", "0x123...", artifact, { id: "MyId"})\``, + this.contractAt + ); + } } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index a4e38dbe51..77ef1041e8 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -13,6 +13,7 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, NamedStaticCallFuture, + ReadEventArgumentFuture, } from "../types/module"; const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); @@ -189,6 +190,23 @@ export class ArtifactContractAtFutureImplementation } } +export class ReadEventArgumentFutureImplementation + extends BaseFuture + implements ReadEventArgumentFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly futureToReadFrom: Future, + public readonly eventName: string, + public readonly argumentName: string, + public readonly emitter: ContractFuture, + public readonly eventIndex: number + ) { + super(id, FutureType.READ_EVENT_ARGUMENT, module); + } +} + export class IgnitionModuleImplementation< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index a6915cf553..0ea75e1d47 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -12,6 +12,7 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, NamedStaticCallFuture, + ReadEventArgumentFuture, } from "./module"; /** @@ -111,6 +112,30 @@ export interface ContractAtOptions { after?: Future[]; } +/** + * The options for a `readEventArgument` call. + * + * @beta + */ +export interface ReadEventArgumentOptions { + /** + * The future id. + */ + id?: string; + + /** + * The contract that emitted the event. If omitted the contract associated with + * the future you are reading the event from will be used. + */ + emitter?: ContractFuture; + + /** + * If multiple events with the same name were emitted by the contract, you can + * choose which of those to read from by specifying its index (0-indexed). + */ + eventIndex?: number; +} + /** * The build api for configuring a deployment within a module. * @@ -176,6 +201,16 @@ export interface IgnitionModuleBuilder { defaultValue?: ParamType ): ParamType; + readEventArgument( + futureToReadFrom: + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedContractCallFuture, + eventName: string, + argumentName: string, + options?: ReadEventArgumentOptions + ): ReadEventArgumentFuture; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0d8a00fcb4..aaf72a8c0b 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -14,6 +14,7 @@ export enum FutureType { NAMED_STATIC_CALL, NAMED_CONTRACT_AT, ARTIFACT_CONTRACT_AT, + READ_EVENT_ARGUMENT, } /** @@ -167,6 +168,21 @@ export interface ArtifactContractAtFuture extends ContractFuture { artifact: ArtifactType; } +/** + * A future that represents reading an argument of an event emitted by the + * transaction that executed another future. + * + * @beta + */ +export interface ReadEventArgumentFuture extends Future { + type: FutureType.READ_EVENT_ARGUMENT; + futureToReadFrom: Future; + eventName: string; + argumentName: string; + emitter: ContractFuture; + eventIndex: number; +} + /** * An object containing the parameters passed into the module. * diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts new file mode 100644 index 0000000000..7f88dd9f48 --- /dev/null +++ b/packages/core/test/new-api/readEventArgument.ts @@ -0,0 +1,211 @@ +import { assert } from "chai"; + +import { FutureType, ReadEventArgumentFuture } from "../../src"; +import { defineModule } from "../../src/new-api/define-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + +describe("Read event argument", () => { + describe("creating modules with it", () => { + it("Should support reading arguments from all the futures that can emit them", () => { + const fakeArtifact = {} as any; + + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + const contractFromArtifact = m.contractFromArtifact( + "ContractFromArtifact", + fakeArtifact + ); + const call = m.call(contract, "fuc"); + + m.readEventArgument(contract, "EventName1", "arg1"); + m.readEventArgument(contractFromArtifact, "EventName2", "arg2"); + m.readEventArgument(call, "EventName3", "arg3"); + + return { contract, contractFromArtifact }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const callFuture = Array.from(mod.futures).find( + (f) => f.type === FutureType.NAMED_CONTRACT_CALL + ); + + const [read1, read2, read3] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.futureToReadFrom, mod.results.contract); + assert.equal(read2.futureToReadFrom, mod.results.contractFromArtifact); + assert.equal(read3.futureToReadFrom, callFuture); + }); + + it("Should infer the emitter from the future correctly", () => { + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + const call = m.call(contract, "fuc"); + + m.readEventArgument(contract, "EventName1", "arg1"); + m.readEventArgument(call, "EventName2", "arg2"); + + return { contract }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const [read1, read2] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.emitter, mod.results.contract); + assert.equal(read2.emitter, mod.results.contract); + }); + + it("Should accept an explicit emitter", () => { + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + const call = m.call(contract, "fuc"); + + const contract2 = m.contract("Contract2"); + + m.readEventArgument(contract, "EventName1", "arg1"); + m.readEventArgument(call, "EventName2", "arg2", { emitter: contract2 }); + + return { contract, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const [read1, read2] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.emitter, mod.results.contract); + assert.equal(read2.emitter, mod.results.contract2); + }); + + it("Should set the right eventName and argumentName", () => { + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + const call = m.call(contract, "fuc"); + + m.readEventArgument(contract, "EventName1", "arg1"); + m.readEventArgument(call, "EventName2", "arg2"); + + return { contract }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const [read1, read2] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.eventName, "EventName1"); + assert.equal(read1.argumentName, "arg1"); + + assert.equal(read2.eventName, "EventName2"); + assert.equal(read2.argumentName, "arg2"); + }); + + it("Should default the eventIndex to 0", () => { + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "EventName1", "arg1"); + + return { contract }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const [read1] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.eventIndex, 0); + }); + + it("Should accept an explicit eventIndex", () => { + const defintion = defineModule("Module1", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "EventName1", "arg1", { eventIndex: 1 }); + + return { contract }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + const [read1] = Array.from(mod.futures).filter( + (f) => f.type === FutureType.READ_EVENT_ARGUMENT + ) as ReadEventArgumentFuture[]; + + assert.equal(read1.eventIndex, 1); + }); + }); + + describe("using the values", () => { + // TODO + }); + + describe("passing ids", () => { + it("Should have a default id based on the emitter's contract name, the event name, argument and index", () => { + const defintion = defineModule("Module1", (m) => { + const main = m.contract("Main"); + const emitter = m.contract("Emitter"); + + m.readEventArgument(main, "EventName", "arg1"); + m.readEventArgument(main, "EventName2", "arg2", { + emitter, + eventIndex: 1, + }); + + return { main, emitter }; + }); + + const constructor = new ModuleConstructor(0, []); + const mod = constructor.construct(defintion); + + assert.equal(mod.id, "Module1"); + const futuresIds = Array.from(mod.futures).map((f) => f.id); + + assert.include(futuresIds, "Module1:Main#EventName#arg1#0"); + assert.include(futuresIds, "Module1:Emitter#EventName2#arg2#1"); + }); + + it("Should be able to read the same argument twice by passing a explicit id", () => { + const moduleWithSameReadEventArgumentTwiceDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.readEventArgument(example, "EventName", "arg1"); + m.readEventArgument(example, "EventName", "arg1", { + id: "second", + }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithSameReadEventArgumentTwice = constructor.construct( + moduleWithSameReadEventArgumentTwiceDefinition + ); + + assert.equal(moduleWithSameReadEventArgumentTwice.id, "Module1"); + const futuresIds = Array.from( + moduleWithSameReadEventArgumentTwice.futures + ).map((f) => f.id); + + assert.include(futuresIds, "Module1:Example#EventName#arg1#0"); + assert.include(futuresIds, "Module1:second"); + }); + }); +}); From 239aa5437e1a191ff899019a92c63864ff63bee5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 22 May 2023 12:18:38 -0300 Subject: [PATCH 0359/1302] Change Should to should --- packages/core/test/new-api/readEventArgument.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 7f88dd9f48..11ee2fa49b 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -6,7 +6,7 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("Read event argument", () => { describe("creating modules with it", () => { - it("Should support reading arguments from all the futures that can emit them", () => { + it("should support reading arguments from all the futures that can emit them", () => { const fakeArtifact = {} as any; const defintion = defineModule("Module1", (m) => { @@ -40,7 +40,7 @@ describe("Read event argument", () => { assert.equal(read3.futureToReadFrom, callFuture); }); - it("Should infer the emitter from the future correctly", () => { + it("should infer the emitter from the future correctly", () => { const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); const call = m.call(contract, "fuc"); @@ -62,7 +62,7 @@ describe("Read event argument", () => { assert.equal(read2.emitter, mod.results.contract); }); - it("Should accept an explicit emitter", () => { + it("should accept an explicit emitter", () => { const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); const call = m.call(contract, "fuc"); @@ -86,7 +86,7 @@ describe("Read event argument", () => { assert.equal(read2.emitter, mod.results.contract2); }); - it("Should set the right eventName and argumentName", () => { + it("should set the right eventName and argumentName", () => { const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); const call = m.call(contract, "fuc"); @@ -111,7 +111,7 @@ describe("Read event argument", () => { assert.equal(read2.argumentName, "arg2"); }); - it("Should default the eventIndex to 0", () => { + it("should default the eventIndex to 0", () => { const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); @@ -130,7 +130,7 @@ describe("Read event argument", () => { assert.equal(read1.eventIndex, 0); }); - it("Should accept an explicit eventIndex", () => { + it("should accept an explicit eventIndex", () => { const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); @@ -155,7 +155,7 @@ describe("Read event argument", () => { }); describe("passing ids", () => { - it("Should have a default id based on the emitter's contract name, the event name, argument and index", () => { + it("should have a default id based on the emitter's contract name, the event name, argument and index", () => { const defintion = defineModule("Module1", (m) => { const main = m.contract("Main"); const emitter = m.contract("Emitter"); @@ -179,7 +179,7 @@ describe("Read event argument", () => { assert.include(futuresIds, "Module1:Emitter#EventName2#arg2#1"); }); - it("Should be able to read the same argument twice by passing a explicit id", () => { + it("should be able to read the same argument twice by passing a explicit id", () => { const moduleWithSameReadEventArgumentTwiceDefinition = defineModule( "Module1", (m) => { From 4268e0fc7a0a5aa5f26abd49f66d6aa56246bbdf Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 13:33:31 -0300 Subject: [PATCH 0360/1302] Update packages/core/src/new-api/internal/module-builder.ts Co-authored-by: Zoey --- packages/core/src/new-api/internal/module-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 33e27f38e4..e9a29c0286 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -599,7 +599,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueReadEventArgumentId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.readEventArgument("MyContract", "0x123...", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.readEventArgument(myContract, "MyEvent", "eventArg", { id: "MyId"})\``, this.contractAt ); } From c76a7eaf8c287b7d9a557b08349ca1b3105c53c2 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 13:32:34 -0300 Subject: [PATCH 0361/1302] Improve test case names --- packages/core/test/new-api/readEventArgument.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 11ee2fa49b..455d52a12a 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -64,15 +64,14 @@ describe("Read event argument", () => { it("should accept an explicit emitter", () => { const defintion = defineModule("Module1", (m) => { - const contract = m.contract("Contract"); - const call = m.call(contract, "fuc"); + const contract = m.contract("ContractThatCallsEmitter"); + const emitter = m.contract("ContractThatEmittsEvent2"); + const call = m.call(contract, "doSomethingAndCallThEmitter", [emitter]); - const contract2 = m.contract("Contract2"); - - m.readEventArgument(contract, "EventName1", "arg1"); - m.readEventArgument(call, "EventName2", "arg2", { emitter: contract2 }); + m.readEventArgument(contract, "EventEmittedDuringConstruction", "arg1"); + m.readEventArgument(call, "Event2", "arg2", { emitter }); - return { contract, contract2 }; + return { contract, emitter }; }); const constructor = new ModuleConstructor(0, []); @@ -83,7 +82,7 @@ describe("Read event argument", () => { ) as ReadEventArgumentFuture[]; assert.equal(read1.emitter, mod.results.contract); - assert.equal(read2.emitter, mod.results.contract2); + assert.equal(read2.emitter, mod.results.emitter); }); it("should set the right eventName and argumentName", () => { From 44e22b21d297672470a50acb1d6df8d863c03a1e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 13:33:18 -0300 Subject: [PATCH 0362/1302] Better variable name --- packages/core/src/new-api/internal/module-builder.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index e9a29c0286..2d9ab8a55d 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -446,12 +446,12 @@ export class IgnitionModuleBuilderImplementation< ): ReadEventArgumentFuture { const eventIndex = options.eventIndex ?? 0; - const futureToReadFromsContract = + const contractToReadFrom = "contract" in futureToReadFrom ? futureToReadFrom.contract : futureToReadFrom; - const emitter = options.emitter ?? futureToReadFromsContract; + const emitter = options.emitter ?? contractToReadFrom; const id = options.id ?? From 906e4ead7938a0c6a890ba44277b7ec9f46d61f3 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 13:43:56 -0300 Subject: [PATCH 0363/1302] Update execution state --- packages/core/src/new-api/types/execution-state.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/types/execution-state.ts index 8c889b7e38..4a25da4600 100644 --- a/packages/core/src/new-api/types/execution-state.ts +++ b/packages/core/src/new-api/types/execution-state.ts @@ -139,11 +139,15 @@ type ContractAtExecutionState = BaseExecutionState< FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT >; +type ReadEventArgumentExecutionState = + BaseExecutionState; + export type ExecutionState = | DeploymentExecutionState | CallExecutionState | StaticCallExecutionState - | ContractAtExecutionState; + | ContractAtExecutionState + | ReadEventArgumentExecutionState; export interface ExecutionStateMap { [key: string]: ExecutionState; From cd8f45132504ea69f7baa7ed4a0648b3d224fe31 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 14:08:26 -0300 Subject: [PATCH 0364/1302] Update serialization --- .../new-api/stored-deployment-serializer.ts | 46 +++++++++++++++++++ .../new-api/types/serialized-deployment.ts | 17 ++++++- .../new-api/stored-deployment-serializer.ts | 23 ++++++++++ 3 files changed, 85 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 084d69f50d..99f8ae0760 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -10,6 +10,7 @@ import { NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, + ReadEventArgumentFutureImplementation, } from "./internal/module"; import { isFuture } from "./internal/utils"; import { @@ -34,6 +35,7 @@ import { SerializedNamedContractDeploymentFuture, SerializedNamedLibraryDeploymentFuture, SerializedNamedStaticCallFuture, + SerializedReadEventAgument, SerializedSolidityParamType, SerializedStoredDeployment, SerializedStoredModule, @@ -291,6 +293,23 @@ export class StoredDeploymentSerializer { ] as NamedStaticCallFuture ); } + } else if (future instanceof ReadEventArgumentFutureImplementation) { + this._overwriteReadonly( + future, + "futureToReadFrom", + partialFutureLookup[ + (serializedFuture as SerializedReadEventAgument).futureToReadFrom + .futureId + ] as Future + ); + + this._overwriteReadonly( + future, + "emitter", + partialFutureLookup[ + (serializedFuture as SerializedReadEventAgument).emitter.futureId + ] as ContractFuture + ); } else { throw new IgnitionError( `unknown future type: ${FutureType[future.type]}` @@ -537,6 +556,23 @@ export class StoredDeploymentSerializer { }; return serializedArtifactContractAtFuture; + } else if (future instanceof ReadEventArgumentFutureImplementation) { + const serializedReadEventArrgumentFuture: SerializedReadEventAgument = { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + futureToReadFrom: this._convertFutureToFutureToken( + future.futureToReadFrom + ), + eventName: future.eventName, + argumentName: future.argumentName, + emitter: this._convertFutureToFutureToken(future.emitter), + eventIndex: future.eventIndex, + }; + + return serializedReadEventArrgumentFuture; } else { throw new IgnitionError( `Unknown future type while serializing: ${FutureType[future.type]}` @@ -650,6 +686,16 @@ export class StoredDeploymentSerializer { serializedFuture.address as any, serializedFuture.artifact ); + case FutureType.READ_EVENT_ARGUMENT: + return new ReadEventArgumentFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.futureToReadFrom as any, + serializedFuture.eventName, + serializedFuture.argumentName, + serializedFuture.emitter as any, + serializedFuture.eventIndex + ); } } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 649e050422..d967fb9a48 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -159,6 +159,20 @@ export interface SerializedArtifactContractAtFuture artifact: ArtifactType; } +/** + * The serialized version of ReadEventArgumentFuture. + * + * @beta + */ +export interface SerializedReadEventAgument extends BaseSerializedFuture { + type: FutureType.READ_EVENT_ARGUMENT; + futureToReadFrom: FutureToken; + eventName: string; + argumentName: string; + emitter: FutureToken; + eventIndex: number; +} + /** * The details of a deployment that will be used in the UI. * @@ -253,4 +267,5 @@ export type SerializedFuture = | SerializedNamedContractCallFuture | SerializedNamedStaticCallFuture | SerializedNamedContractAtFuture - | SerializedArtifactContractAtFuture; + | SerializedArtifactContractAtFuture + | SerializedReadEventAgument; diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 9a9ed9c5ad..c86764cc5e 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -442,6 +442,29 @@ describe("stored deployment serializer", () => { module, }); }); + + it("Should serialize readEventArgument", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const emitter = m.contract("Emitter"); + + m.readEventArgument(contract1, "EventName", "argumentName", { + id: "customId", + emitter, + eventIndex: 123, + }); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); }); describe("useModule", () => { From 7ce97d414ce8525a6b413619d70d3e4b7b3be867 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 14:16:51 -0300 Subject: [PATCH 0365/1302] Update UI --- .../future-details/components/future-summary.tsx | 14 ++++++++++++++ .../src/pages/plan-overview/components/action.tsx | 4 ++++ packages/ui/src/types.ts | 7 ++++++- packages/ui/src/utils/to-mermaid.ts | 2 ++ 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index e775195058..e6463e7b47 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -54,6 +54,8 @@ function resolveTitleFor(future: UiFuture): string { return `Existing contract from Artifact - ${future.contractName} (${ typeof future.address === "string" ? future.address : future.address.id })`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event argument from future - ${future.id}`; } } @@ -150,5 +152,17 @@ const FutureDetailsSection: React.FC<{ future: UiFuture }> = ({ future }) => {

    ); + case FutureType.READ_EVENT_ARGUMENT: + return ( +
    +

    Future - {future.futureToReadFrom.id}

    + {future.futureToReadFrom !== future.emitter ? ( +

    Emitter - {future.emitter.id}

    + ) : null} +

    Event - {future.eventName}

    +

    Event index - {future.eventIndex}

    +

    Argument - {future.argumentName}

    +
    + ); } }; diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 46a10c9475..5b24b188ad 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -44,6 +44,10 @@ function toDisplayText(future: UiFuture): string { return `Existing contract ${future.contractName} from artifact (${ typeof future.address === "string" ? future.address : future.address.id })`; + case FutureType.CONTRACT_AT: + return `Existing contract ${future.contractName} (${future.address})`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.argumentName})`; } } diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts index 3621e118ce..24c356d9ba 100644 --- a/packages/ui/src/types.ts +++ b/packages/ui/src/types.ts @@ -7,6 +7,7 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, NamedStaticCallFuture, + ReadEventArgumentFuture, } from "@ignored/ignition-core/ui-helpers"; export type UiContractFuture = @@ -23,4 +24,8 @@ export type UiContractAtFuture = | NamedContractAtFuture | ArtifactContractAtFuture; -export type UiFuture = UiContractFuture | UiCallFuture | UiContractAtFuture; +export type UiFuture = + | UiContractFuture + | UiCallFuture + | UiContractAtFuture + | ReadEventArgumentFuture; diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index ab3f4ed0ff..bc27485b24 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -76,5 +76,7 @@ function toLabel(f: UiFuture): string { return `Existing contract from artifact ${f.contractName} (${ typeof f.address === "string" ? f.address : f.address.id })`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event from future ${f.futureToReadFrom.id} (event ${f.eventName} argument ${f.argumentName})`; } } From 08bdbaf70a059cf1b7c0586359b48dfaf8a814b5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 17:37:42 -0300 Subject: [PATCH 0366/1302] Fix broken rebase --- packages/ui/src/pages/plan-overview/components/action.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 5b24b188ad..fc24fe07e3 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -44,8 +44,6 @@ function toDisplayText(future: UiFuture): string { return `Existing contract ${future.contractName} from artifact (${ typeof future.address === "string" ? future.address : future.address.id })`; - case FutureType.CONTRACT_AT: - return `Existing contract ${future.contractName} (${future.address})`; case FutureType.READ_EVENT_ARGUMENT: return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.argumentName})`; } From 834b0c2c3947cdb5a7f3f2f9aa8048d87dc4f621 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 17:59:47 -0300 Subject: [PATCH 0367/1302] Remove ResultT from Future --- packages/core/src/new-api/internal/batcher.ts | 14 ++++------ packages/core/src/new-api/internal/module.ts | 26 +++++++++---------- .../new-api/stored-deployment-serializer.ts | 12 ++++----- packages/core/src/new-api/types/module.ts | 12 ++++----- packages/ui/src/utils/guards.ts | 6 ++--- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts index 8c7bca7ec2..8b87bc91a7 100644 --- a/packages/core/src/new-api/internal/batcher.ts +++ b/packages/core/src/new-api/internal/batcher.ts @@ -56,9 +56,7 @@ export class Batcher { return { adjacencyList, visitState }; } - private static _recursiveGetFuturesFor( - module: IgnitionModule - ): Array> { + private static _recursiveGetFuturesFor(module: IgnitionModule): Future[] { return [...module.futures].concat( Array.from(module.submodules).flatMap((sub) => this._recursiveGetFuturesFor(sub) @@ -67,7 +65,7 @@ export class Batcher { } private static _intializeVisitStateFrom( - futures: Array>, + futures: Future[], executionStateMap: ExecutionStateMap ): VisitStatusMap { return Object.fromEntries( @@ -90,9 +88,7 @@ export class Batcher { ); } - private static _buildAdjacencyListFor( - futures: Array> - ): AdjacencyList { + private static _buildAdjacencyListFor(futures: Future[]): AdjacencyList { const dependencyGraph = new AdjacencyList(); for (const future of futures) { @@ -117,8 +113,8 @@ export class Batcher { */ private static _optionallyAddDependenciesSubmoduleSiblings( dependencyGraph: AdjacencyList, - future: Future, - dependency: Future + future: Future, + dependency: Future ): void { if (future.module === dependency.module) { return; diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 77ef1041e8..d6c73d4fdd 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -18,10 +18,8 @@ import { const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); -export abstract class BaseFuture< - FutureTypeT extends FutureType, - ResultT = unknown -> implements Future +export abstract class BaseFuture + implements Future { public readonly dependencies: Set = new Set(); @@ -51,7 +49,7 @@ export abstract class BaseFuture< export class NamedContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFuture + extends BaseFuture implements NamedContractDeploymentFuture { constructor( @@ -70,7 +68,7 @@ export class NamedContractDeploymentFutureImplementation< export class ArtifactContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFuture + extends BaseFuture implements ArtifactContractDeploymentFuture { constructor( @@ -90,7 +88,7 @@ export class ArtifactContractDeploymentFutureImplementation< export class NamedLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFuture + extends BaseFuture implements NamedLibraryDeploymentFuture { constructor( @@ -107,7 +105,7 @@ export class NamedLibraryDeploymentFutureImplementation< export class ArtifactLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFuture + extends BaseFuture implements ArtifactLibraryDeploymentFuture { constructor( @@ -126,7 +124,7 @@ export class NamedContractCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFuture + extends BaseFuture implements NamedContractCallFuture { constructor( @@ -146,7 +144,7 @@ export class NamedStaticCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFuture + extends BaseFuture implements NamedStaticCallFuture { constructor( @@ -162,7 +160,7 @@ export class NamedStaticCallFutureImplementation< } export class NamedContractAtFutureImplementation - extends BaseFuture + extends BaseFuture implements NamedContractAtFuture { constructor( @@ -176,7 +174,7 @@ export class NamedContractAtFutureImplementation } export class ArtifactContractAtFutureImplementation - extends BaseFuture + extends BaseFuture implements ArtifactContractAtFuture { constructor( @@ -191,13 +189,13 @@ export class ArtifactContractAtFutureImplementation } export class ReadEventArgumentFutureImplementation - extends BaseFuture + extends BaseFuture implements ReadEventArgumentFuture { constructor( public readonly id: string, public readonly module: IgnitionModuleImplementation, - public readonly futureToReadFrom: Future, + public readonly futureToReadFrom: Future, public readonly eventName: string, public readonly argumentName: string, public readonly emitter: ContractFuture, diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 99f8ae0760..a0638106f2 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -143,7 +143,7 @@ export class StoredDeploymentSerializer { */ private static _partialDeserializeAllFuturesFor( deployment: SerializedStoredDeployment - ): { [key: string]: Future } { + ): { [key: string]: Future } { const allSerializedFutures = this._getAllFuturesFor(deployment); const partialFutures = allSerializedFutures.map( @@ -300,7 +300,7 @@ export class StoredDeploymentSerializer { partialFutureLookup[ (serializedFuture as SerializedReadEventAgument).futureToReadFrom .futureId - ] as Future + ] as Future ); this._overwriteReadonly( @@ -323,7 +323,7 @@ export class StoredDeploymentSerializer { private static _deserializePartialModule( serializedModule: SerializedStoredModule, allPartialFutures: { - [key: string]: Future; + [key: string]: Future; } ): IgnitionModule> { const results = this._deserializeResultsFrom( @@ -360,7 +360,7 @@ export class StoredDeploymentSerializer { private static _deserializeLibraries( libraries: SerializedLibraries, partialFutureLookup: { - [k: string]: Future; + [k: string]: Future; } ): Record> { return Object.fromEntries( @@ -593,7 +593,7 @@ export class StoredDeploymentSerializer { private static _deserializeResultsFrom( serializedResults: SerializedStoredResults, - futures: { [key: string]: Future } + futures: { [key: string]: Future } ): IgnitionModuleResult<""> { const results = Object.fromEntries( Object.entries(serializedResults).map(([key, futureToken]) => [ @@ -728,7 +728,7 @@ export class StoredDeploymentSerializer { private static _deserializeArg( arg: number | string | FutureToken, futureLookup: { - [key: string]: Future; + [key: string]: Future; } ) { if (!StoredDeploymentSerializer._isSerializedFutureToken(arg)) { diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index aaf72a8c0b..984601f5c0 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -22,8 +22,7 @@ export enum FutureType { * * @beta */ -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export interface Future { +export interface Future { id: string; // Unique identifier of a future. My current proposal ":" type: FutureType; @@ -43,8 +42,7 @@ export interface Future { * * @beta */ -export interface ContractFuture - extends Future { +export interface ContractFuture extends Future { contractName: ContractNameT; } @@ -54,7 +52,7 @@ export interface ContractFuture * @beta */ export interface FunctionCallFuture - extends Future { + extends Future { functionName: FunctionNameT; } @@ -174,9 +172,9 @@ export interface ArtifactContractAtFuture extends ContractFuture { * * @beta */ -export interface ReadEventArgumentFuture extends Future { +export interface ReadEventArgumentFuture extends Future { type: FutureType.READ_EVENT_ARGUMENT; - futureToReadFrom: Future; + futureToReadFrom: Future; eventName: string; argumentName: string; emitter: ContractFuture; diff --git a/packages/ui/src/utils/guards.ts b/packages/ui/src/utils/guards.ts index 9fae17f41b..fdf5d6ed46 100644 --- a/packages/ui/src/utils/guards.ts +++ b/packages/ui/src/utils/guards.ts @@ -1,11 +1,11 @@ import { Future, FutureType } from "@ignored/ignition-core/ui-helpers"; import { UiCallFuture, UiContractFuture, UiFuture } from "../types"; -export function isUiFuture(f: Future): f is UiFuture { +export function isUiFuture(f: Future): f is UiFuture { return FutureType[f.type] !== undefined; } -export function isContractFuture(f: Future): f is UiContractFuture { +export function isContractFuture(f: Future): f is UiContractFuture { const deployFutureTypeIds = [ FutureType.NAMED_CONTRACT_DEPLOYMENT, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, @@ -16,7 +16,7 @@ export function isContractFuture(f: Future): f is UiContractFuture { return deployFutureTypeIds.includes(f.type); } -export function isCallFuture(f: Future): f is UiCallFuture { +export function isCallFuture(f: Future): f is UiCallFuture { const callFutureIds = [ FutureType.NAMED_CONTRACT_CALL, FutureType.NAMED_STATIC_CALL, From 41981d14fdd7aec8818d446dbdde550028e71704 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 18:01:34 -0300 Subject: [PATCH 0368/1302] Rename BaseFuture to BaseFutureImplementation --- packages/core/src/new-api/internal/module.ts | 20 ++++++++++---------- packages/core/src/new-api/internal/utils.ts | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index d6c73d4fdd..7e3b44bfc2 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -18,7 +18,7 @@ import { const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); -export abstract class BaseFuture +export abstract class BaseFutureImplementation implements Future { public readonly dependencies: Set = new Set(); @@ -49,7 +49,7 @@ export abstract class BaseFuture export class NamedContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements NamedContractDeploymentFuture { constructor( @@ -68,7 +68,7 @@ export class NamedContractDeploymentFutureImplementation< export class ArtifactContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements ArtifactContractDeploymentFuture { constructor( @@ -88,7 +88,7 @@ export class ArtifactContractDeploymentFutureImplementation< export class NamedLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements NamedLibraryDeploymentFuture { constructor( @@ -105,7 +105,7 @@ export class NamedLibraryDeploymentFutureImplementation< export class ArtifactLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements ArtifactLibraryDeploymentFuture { constructor( @@ -124,7 +124,7 @@ export class NamedContractCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements NamedContractCallFuture { constructor( @@ -144,7 +144,7 @@ export class NamedStaticCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFuture + extends BaseFutureImplementation implements NamedStaticCallFuture { constructor( @@ -160,7 +160,7 @@ export class NamedStaticCallFutureImplementation< } export class NamedContractAtFutureImplementation - extends BaseFuture + extends BaseFutureImplementation implements NamedContractAtFuture { constructor( @@ -174,7 +174,7 @@ export class NamedContractAtFutureImplementation } export class ArtifactContractAtFutureImplementation - extends BaseFuture + extends BaseFutureImplementation implements ArtifactContractAtFuture { constructor( @@ -189,7 +189,7 @@ export class ArtifactContractAtFutureImplementation } export class ReadEventArgumentFutureImplementation - extends BaseFuture + extends BaseFutureImplementation implements ReadEventArgumentFuture { constructor( diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index d19951f5a4..dee18a2fe7 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,7 +1,7 @@ import { Future } from "../types/module"; -import { BaseFuture } from "./module"; +import { BaseFutureImplementation } from "./module"; export function isFuture(potential: unknown): potential is Future { - return potential instanceof BaseFuture; + return potential instanceof BaseFutureImplementation; } From 3ea61cbfcfa6b428b386ff79d269111e163731a9 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 18:31:55 -0300 Subject: [PATCH 0369/1302] Don't export BaseFutureImplementation --- packages/core/src/new-api/internal/module.ts | 4 +--- packages/core/src/new-api/internal/utils.ts | 12 ++++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 7e3b44bfc2..40756f6f82 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -18,9 +18,7 @@ import { const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); -export abstract class BaseFutureImplementation - implements Future -{ +abstract class BaseFutureImplementation { public readonly dependencies: Set = new Set(); constructor( diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index dee18a2fe7..edf8b9e5bf 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,7 +1,11 @@ -import { Future } from "../types/module"; - -import { BaseFutureImplementation } from "./module"; +import { Future, FutureType } from "../types/module"; export function isFuture(potential: unknown): potential is Future { - return potential instanceof BaseFutureImplementation; + return ( + typeof potential === "object" && + potential !== null && + "type" in potential && + typeof potential.type === "number" && + FutureType[potential.type] !== undefined + ); } From 62501d691ffc731272f59dd3873afb47281a27b7 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 18:33:24 -0300 Subject: [PATCH 0370/1302] Rename Future to BaseFuture, ContractFuture to BaseContractFuture and reintroduce them as union types of their possible values. --- packages/core/src/new-api/types/module.ts | 59 +++++++++++++++++------ 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 984601f5c0..f0a17749d7 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -22,7 +22,32 @@ export enum FutureType { * * @beta */ -export interface Future { +export type Future = + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedLibraryDeploymentFuture + | ArtifactLibraryDeploymentFuture + | NamedContractCallFuture + | NamedStaticCallFuture + | NamedContractAtFuture + | ArtifactContractAtFuture + | ReadEventArgumentFuture; + +/** + * A future representing a contract. Either an existing one or one + * that will be deployed. + * + * @beta + */ +export type ContractFuture = + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedLibraryDeploymentFuture + | ArtifactLibraryDeploymentFuture + | NamedContractAtFuture + | ArtifactContractAtFuture; + +interface BaseFuture { id: string; // Unique identifier of a future. My current proposal ":" type: FutureType; @@ -36,13 +61,7 @@ export interface Future { dependencies: Set; } -/** - * A future representing a contract. Either an existing one or one - * that will be deployed. - * - * @beta - */ -export interface ContractFuture extends Future { +interface BaseContractFuture { contractName: ContractNameT; } @@ -52,7 +71,7 @@ export interface ContractFuture extends Future { * @beta */ export interface FunctionCallFuture - extends Future { + extends BaseFuture { functionName: FunctionNameT; } @@ -62,7 +81,8 @@ export interface FunctionCallFuture * @beta */ export interface NamedContractDeploymentFuture - extends ContractFuture { + extends BaseFuture, + BaseContractFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; constructorArgs: SolidityParamsType; libraries: Record>; @@ -77,7 +97,8 @@ export interface NamedContractDeploymentFuture * @beta */ export interface ArtifactContractDeploymentFuture - extends ContractFuture { + extends BaseFuture, + BaseContractFuture { type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; artifact: ArtifactType; constructorArgs: SolidityParamsType; @@ -92,7 +113,8 @@ export interface ArtifactContractDeploymentFuture * @beta */ export interface NamedLibraryDeploymentFuture - extends ContractFuture { + extends BaseFuture, + BaseContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; libraries: Record>; from: string | undefined; @@ -105,7 +127,8 @@ export interface NamedLibraryDeploymentFuture * @beta */ export interface ArtifactLibraryDeploymentFuture - extends ContractFuture { + extends BaseFuture, + BaseContractFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; artifact: ArtifactType; libraries: Record>; @@ -149,8 +172,10 @@ export interface NamedStaticCallFuture< * @beta */ export interface NamedContractAtFuture - extends ContractFuture { + extends BaseFuture, + BaseContractFuture { type: FutureType.NAMED_CONTRACT_AT; + address: string | NamedStaticCallFuture; } @@ -160,7 +185,9 @@ export interface NamedContractAtFuture * * @beta */ -export interface ArtifactContractAtFuture extends ContractFuture { +export interface ArtifactContractAtFuture + extends BaseFuture, + BaseContractFuture { type: FutureType.ARTIFACT_CONTRACT_AT; address: string | NamedStaticCallFuture; artifact: ArtifactType; @@ -172,7 +199,7 @@ export interface ArtifactContractAtFuture extends ContractFuture { * * @beta */ -export interface ReadEventArgumentFuture extends Future { +export interface ReadEventArgumentFuture extends BaseFuture { type: FutureType.READ_EVENT_ARGUMENT; futureToReadFrom: Future; eventName: string; From 95cb5ea2f42d3b0ce08857d3671b2838b04b193e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 18:40:46 -0300 Subject: [PATCH 0371/1302] Introduce DeploymentFuture and FunctionCallFuture --- packages/core/src/new-api/types/module.ts | 55 ++++++++++++++--------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index f0a17749d7..8dec6bc8f0 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -47,6 +47,29 @@ export type ContractFuture = | NamedContractAtFuture | ArtifactContractAtFuture; +/** + * A future representing a deployment. + * + * @beta + */ +export type DeploymentFuture = + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedLibraryDeploymentFuture + | ArtifactLibraryDeploymentFuture; + +/** + * A future representing a call. Either a static one or one that modifies contract state + * + * @beta + */ +export type FunctionCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> = + | NamedContractCallFuture + | NamedStaticCallFuture; + interface BaseFuture { id: string; // Unique identifier of a future. My current proposal ":" @@ -61,16 +84,11 @@ interface BaseFuture { dependencies: Set; } -interface BaseContractFuture { +interface BaseContractFuture extends BaseFuture { contractName: ContractNameT; } -/** - * A future representing a call. Either a static one or one that modifies contract state - * - * @beta - */ -export interface FunctionCallFuture +interface BaseFunctionCallFuture extends BaseFuture { functionName: FunctionNameT; } @@ -81,8 +99,7 @@ export interface FunctionCallFuture * @beta */ export interface NamedContractDeploymentFuture - extends BaseFuture, - BaseContractFuture { + extends BaseContractFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; constructorArgs: SolidityParamsType; libraries: Record>; @@ -97,8 +114,7 @@ export interface NamedContractDeploymentFuture * @beta */ export interface ArtifactContractDeploymentFuture - extends BaseFuture, - BaseContractFuture { + extends BaseContractFuture { type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; artifact: ArtifactType; constructorArgs: SolidityParamsType; @@ -113,8 +129,7 @@ export interface ArtifactContractDeploymentFuture * @beta */ export interface NamedLibraryDeploymentFuture - extends BaseFuture, - BaseContractFuture { + extends BaseContractFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; libraries: Record>; from: string | undefined; @@ -127,8 +142,7 @@ export interface NamedLibraryDeploymentFuture * @beta */ export interface ArtifactLibraryDeploymentFuture - extends BaseFuture, - BaseContractFuture { + extends BaseContractFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; artifact: ArtifactType; libraries: Record>; @@ -143,7 +157,7 @@ export interface ArtifactLibraryDeploymentFuture export interface NamedContractCallFuture< ContractNameT extends string, FunctionNameT extends string -> extends FunctionCallFuture { +> extends BaseFunctionCallFuture { type: FutureType.NAMED_CONTRACT_CALL; contract: ContractFuture; args: SolidityParamsType; @@ -159,7 +173,7 @@ export interface NamedContractCallFuture< export interface NamedStaticCallFuture< ContractNameT extends string, FunctionNameT extends string -> extends FunctionCallFuture { +> extends BaseFunctionCallFuture { type: FutureType.NAMED_STATIC_CALL; contract: ContractFuture; args: SolidityParamsType; @@ -172,8 +186,7 @@ export interface NamedStaticCallFuture< * @beta */ export interface NamedContractAtFuture - extends BaseFuture, - BaseContractFuture { + extends BaseContractFuture { type: FutureType.NAMED_CONTRACT_AT; address: string | NamedStaticCallFuture; @@ -185,9 +198,7 @@ export interface NamedContractAtFuture * * @beta */ -export interface ArtifactContractAtFuture - extends BaseFuture, - BaseContractFuture { +export interface ArtifactContractAtFuture extends BaseContractFuture { type: FutureType.ARTIFACT_CONTRACT_AT; address: string | NamedStaticCallFuture; artifact: ArtifactType; From a99400168a819e4019ee5c9c920bf27c787d5cf9 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 18:49:46 -0300 Subject: [PATCH 0372/1302] Update UI deleting unneeded types and guards --- .../components/future-summary.tsx | 8 ++-- .../pages/plan-overview/components/action.tsx | 7 ++-- packages/ui/src/queries/futures.ts | 40 +++++++++---------- packages/ui/src/types.ts | 31 -------------- packages/ui/src/utils/guards.ts | 18 +++++---- packages/ui/src/utils/to-mermaid.ts | 6 +-- 6 files changed, 40 insertions(+), 70 deletions(-) delete mode 100644 packages/ui/src/types.ts diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index e6463e7b47..986a4b5781 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -1,14 +1,14 @@ import { + Future, FutureType, StoredDeployment, } from "@ignored/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; import { SummaryHeader } from "../../../components/summary-header"; -import { UiFuture } from "../../../types"; export const FutureSummary: React.FC<{ deployment: StoredDeployment; - future: UiFuture; + future: Future; }> = ({ deployment, future }) => { const title = resolveTitleFor(future); @@ -32,7 +32,7 @@ export const FutureSummary: React.FC<{ ); }; -function resolveTitleFor(future: UiFuture): string { +function resolveTitleFor(future: Future): string { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: return `Contract deploy - ${future.contractName}`; @@ -59,7 +59,7 @@ function resolveTitleFor(future: UiFuture): string { } } -const FutureDetailsSection: React.FC<{ future: UiFuture }> = ({ future }) => { +const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: return ( diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index fc24fe07e3..3e64906e58 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -1,11 +1,10 @@ -import { FutureType } from "@ignored/ignition-core/ui-helpers"; +import { Future, FutureType } from "@ignored/ignition-core/ui-helpers"; import React, { useCallback } from "react"; import { useNavigate } from "react-router-dom"; import styled, { css } from "styled-components"; -import { UiFuture } from "../../../types"; export const Action: React.FC<{ - future: UiFuture; + future: Future; }> = ({ future }) => { const navigate = useNavigate(); @@ -22,7 +21,7 @@ export const Action: React.FC<{ ); }; -function toDisplayText(future: UiFuture): string { +function toDisplayText(future: Future): string { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: return `Contract deploy ${future.contractName}`; diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index d9eb0a8d89..b6cab7fbe5 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -1,11 +1,15 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import { UiContractFuture, UiFuture } from "../types"; -import { isCallFuture, isContractFuture, isUiFuture } from "../utils/guards"; +import { + DeploymentFuture, + FunctionCallFuture, + Future, + StoredDeployment, +} from "@ignored/ignition-core/ui-helpers"; +import { isFunctionCallFuture, isDeploymentFuture } from "../utils/guards"; export function getFutureById( deployment: StoredDeployment, futureId: string | undefined -): UiFuture | undefined { +): Future | undefined { if (futureId === undefined) { return undefined; } @@ -18,10 +22,6 @@ export function getFutureById( return undefined; } - if (!isUiFuture(f)) { - throw new Error("Not a future"); - } - return f; } @@ -29,14 +29,12 @@ export function getFutureById( export function getAllFuturesForModule({ futures, submodules, -}: StoredDeployment["module"]): UiFuture[] { - return Array.from(futures) - .filter(isUiFuture) - .concat( - Array.from(submodules.values()).flatMap((submodule) => - getAllFuturesForModule(submodule) - ) - ); +}: StoredDeployment["module"]): Future[] { + return Array.from(futures).concat( + Array.from(submodules.values()).flatMap((submodule) => + getAllFuturesForModule(submodule) + ) + ); } /** @@ -48,13 +46,15 @@ export function getAllFuturesForModule({ */ export function getAllDeployFuturesFor( deployment: StoredDeployment -): UiContractFuture[] { - return getAllFuturesForModule(deployment.module).filter(isContractFuture); +): DeploymentFuture[] { + return getAllFuturesForModule(deployment.module).filter(isDeploymentFuture); } /** * Get all calls in a module and its submodules */ -export function getAllCallFuturesFor(deployment: StoredDeployment): UiFuture[] { - return getAllFuturesForModule(deployment.module).filter(isCallFuture); +export function getAllCallFuturesFor( + deployment: StoredDeployment +): FunctionCallFuture[] { + return getAllFuturesForModule(deployment.module).filter(isFunctionCallFuture); } diff --git a/packages/ui/src/types.ts b/packages/ui/src/types.ts deleted file mode 100644 index 24c356d9ba..0000000000 --- a/packages/ui/src/types.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, - NamedContractAtFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, - ReadEventArgumentFuture, -} from "@ignored/ignition-core/ui-helpers"; - -export type UiContractFuture = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture; - -export type UiCallFuture = - | NamedContractCallFuture - | NamedStaticCallFuture; - -export type UiContractAtFuture = - | NamedContractAtFuture - | ArtifactContractAtFuture; - -export type UiFuture = - | UiContractFuture - | UiCallFuture - | UiContractAtFuture - | ReadEventArgumentFuture; diff --git a/packages/ui/src/utils/guards.ts b/packages/ui/src/utils/guards.ts index fdf5d6ed46..68ab03e899 100644 --- a/packages/ui/src/utils/guards.ts +++ b/packages/ui/src/utils/guards.ts @@ -1,11 +1,11 @@ -import { Future, FutureType } from "@ignored/ignition-core/ui-helpers"; -import { UiCallFuture, UiContractFuture, UiFuture } from "../types"; +import { + Future, + FutureType, + DeploymentFuture, + FunctionCallFuture, +} from "@ignored/ignition-core/ui-helpers"; -export function isUiFuture(f: Future): f is UiFuture { - return FutureType[f.type] !== undefined; -} - -export function isContractFuture(f: Future): f is UiContractFuture { +export function isDeploymentFuture(f: Future): f is DeploymentFuture { const deployFutureTypeIds = [ FutureType.NAMED_CONTRACT_DEPLOYMENT, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, @@ -16,7 +16,9 @@ export function isContractFuture(f: Future): f is UiContractFuture { return deployFutureTypeIds.includes(f.type); } -export function isCallFuture(f: Future): f is UiCallFuture { +export function isFunctionCallFuture( + f: Future +): f is FunctionCallFuture { const callFutureIds = [ FutureType.NAMED_CONTRACT_CALL, FutureType.NAMED_STATIC_CALL, diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index bc27485b24..6884d80d0d 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -1,11 +1,11 @@ import { + Future, FutureType, IgnitionModule, IgnitionModuleResult, StoredDeployment, } from "@ignored/ignition-core/ui-helpers"; import { getAllFuturesForModule } from "../queries/futures"; -import { UiFuture } from "../types"; export function toMermaid(deployment: StoredDeployment) { const modules = recursivelyListModulesAndSubmodulesFor(deployment.module); @@ -38,7 +38,7 @@ function prettyPrintModule( lineIndent = "" ): string { const futureList = Array.from(module.futures) - .map((f) => `${lineIndent}${f.id}["${toLabel(f as UiFuture)}"]`) + .map((f) => `${lineIndent}${f.id}["${toLabel(f)}"]`) .join(`\n${lineIndent}`); return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction BT\n\n${lineIndent}${lineIndent}${futureList}\n${lineIndent}end`; @@ -54,7 +54,7 @@ function recursivelyListModulesAndSubmodulesFor( ); } -function toLabel(f: UiFuture): string { +function toLabel(f: Future): string { switch (f.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: return `Deploy ${f.contractName}`; From 9d816f6a9f0c7df0a8218e68e5be2075e403fb59 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 20:05:00 -0300 Subject: [PATCH 0373/1302] Don't use Base interfaces in public types --- packages/core/src/new-api/types/module.ts | 82 ++++++++++++----------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 8dec6bc8f0..99180743ec 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -70,37 +70,17 @@ export type FunctionCallFuture< | NamedContractCallFuture | NamedStaticCallFuture; -interface BaseFuture { - id: string; // Unique identifier of a future. My current proposal ":" - - type: FutureType; - - // The following fields define the deployment graph - - // TODO: Not convinced about this circular dependency between module and future. - module: IgnitionModule; - - // Any future that needs to be executed before this one - dependencies: Set; -} - -interface BaseContractFuture extends BaseFuture { - contractName: ContractNameT; -} - -interface BaseFunctionCallFuture - extends BaseFuture { - functionName: FunctionNameT; -} - /** * A future representing the deployment of a contract that belongs to this project. * * @beta */ -export interface NamedContractDeploymentFuture - extends BaseContractFuture { +export interface NamedContractDeploymentFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: ContractNameT; constructorArgs: SolidityParamsType; libraries: Record>; value: bigint; @@ -113,9 +93,12 @@ export interface NamedContractDeploymentFuture * * @beta */ -export interface ArtifactContractDeploymentFuture - extends BaseContractFuture { +export interface ArtifactContractDeploymentFuture { type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: string; artifact: ArtifactType; constructorArgs: SolidityParamsType; libraries: Record>; @@ -128,9 +111,12 @@ export interface ArtifactContractDeploymentFuture * * @beta */ -export interface NamedLibraryDeploymentFuture - extends BaseContractFuture { +export interface NamedLibraryDeploymentFuture { type: FutureType.NAMED_LIBRARY_DEPLOYMENT; + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: LibraryNameT; libraries: Record>; from: string | undefined; } @@ -141,9 +127,12 @@ export interface NamedLibraryDeploymentFuture * * @beta */ -export interface ArtifactLibraryDeploymentFuture - extends BaseContractFuture { +export interface ArtifactLibraryDeploymentFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: string; artifact: ArtifactType; libraries: Record>; from: string | undefined; @@ -157,9 +146,13 @@ export interface ArtifactLibraryDeploymentFuture export interface NamedContractCallFuture< ContractNameT extends string, FunctionNameT extends string -> extends BaseFunctionCallFuture { +> { type: FutureType.NAMED_CONTRACT_CALL; + id: string; + module: IgnitionModule; + dependencies: Set; contract: ContractFuture; + functionName: FunctionNameT; args: SolidityParamsType; value: bigint; from: string | undefined; @@ -173,9 +166,13 @@ export interface NamedContractCallFuture< export interface NamedStaticCallFuture< ContractNameT extends string, FunctionNameT extends string -> extends BaseFunctionCallFuture { +> { type: FutureType.NAMED_STATIC_CALL; + id: string; + module: IgnitionModule; + dependencies: Set; contract: ContractFuture; + functionName: FunctionNameT; args: SolidityParamsType; from: string | undefined; } @@ -185,10 +182,12 @@ export interface NamedStaticCallFuture< * * @beta */ -export interface NamedContractAtFuture - extends BaseContractFuture { +export interface NamedContractAtFuture { type: FutureType.NAMED_CONTRACT_AT; - + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: ContractNameT; address: string | NamedStaticCallFuture; } @@ -198,8 +197,12 @@ export interface NamedContractAtFuture * * @beta */ -export interface ArtifactContractAtFuture extends BaseContractFuture { +export interface ArtifactContractAtFuture { type: FutureType.ARTIFACT_CONTRACT_AT; + id: string; + module: IgnitionModule; + dependencies: Set; + contractName: string; address: string | NamedStaticCallFuture; artifact: ArtifactType; } @@ -210,8 +213,11 @@ export interface ArtifactContractAtFuture extends BaseContractFuture { * * @beta */ -export interface ReadEventArgumentFuture extends BaseFuture { +export interface ReadEventArgumentFuture { type: FutureType.READ_EVENT_ARGUMENT; + id: string; + module: IgnitionModule; + dependencies: Set; futureToReadFrom: Future; eventName: string; argumentName: string; From b1c0378df985d81089fbd5e9d420a16c1d159f77 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 23 May 2023 20:05:15 -0300 Subject: [PATCH 0374/1302] Test that every Future is a BaseFuture --- packages/core/test/new-api/types/module.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/core/test/new-api/types/module.ts diff --git a/packages/core/test/new-api/types/module.ts b/packages/core/test/new-api/types/module.ts new file mode 100644 index 0000000000..ae72541e48 --- /dev/null +++ b/packages/core/test/new-api/types/module.ts @@ -0,0 +1,16 @@ +import { + Future, + FutureType, + IgnitionModule, +} from "../../../src/new-api/types/module"; + +interface BaseFuture { + id: string; + type: FutureType; + module: IgnitionModule; + dependencies: Set; +} + +const _testThatEveryFutureIsBaseFuture: Future extends BaseFuture + ? true + : never = true; From 347ef53d5dfa233f47e334178ebfcb159067c8ed Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 24 May 2023 00:18:00 -0400 Subject: [PATCH 0375/1302] add send to new API --- .../src/new-api/internal/module-builder.ts | 47 +++++++++++++++- packages/core/src/new-api/internal/module.ts | 18 ++++++ .../new-api/stored-deployment-serializer.ts | 56 ++++++++++++++----- .../core/src/new-api/types/module-builder.ts | 20 +++++++ packages/core/src/new-api/types/module.ts | 32 ++++++++++- .../new-api/types/serialized-deployment.ts | 19 ++++++- .../components/future-summary.tsx | 9 +++ .../pages/plan-overview/components/action.tsx | 4 ++ packages/ui/src/utils/to-mermaid.ts | 2 + 9 files changed, 190 insertions(+), 17 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 2d9ab8a55d..bf983c064d 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -4,6 +4,7 @@ import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { + AddressResolvableFuture, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, @@ -17,6 +18,7 @@ import { NamedLibraryDeploymentFuture, NamedStaticCallFuture, ReadEventArgumentFuture, + SendDataFuture, } from "../types/module"; import { CallOptions, @@ -28,6 +30,7 @@ import { LibraryFromArtifactOptions, LibraryOptions, ReadEventArgumentOptions, + SendDataOptions, } from "../types/module-builder"; import { @@ -41,6 +44,7 @@ import { NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, ReadEventArgumentFutureImplementation, + SendDataFutureImplementation, } from "./module"; import { isFuture } from "./utils"; @@ -481,6 +485,39 @@ export class IgnitionModuleBuilderImplementation< return future; } + public send( + to: string | AddressResolvableFuture, + data: string, + options: SendDataOptions = {} + ): SendDataFuture { + const id = options.id ?? (typeof to === "string" ? to : to.id); + const futureId = `${this._module.id}:${id}`; + options.value ??= BigInt(0); + + this._assertUniqueSendId(futureId); + + const future = new SendDataFutureImplementation( + futureId, + this._module, + to, + data, + options.value, + options.from + ); + + if (typeof to !== "string") { + future.dependencies.add(to); + } + + for (const afterFuture of (options.after ?? []).filter(isFuture)) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + + return future; + } + public useModule< SubmoduleModuleIdT extends string, SubmoduleContractNameT extends string, @@ -600,7 +637,15 @@ export class IgnitionModuleBuilderImplementation< return this._assertUniqueFutureId( futureId, `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.readEventArgument(myContract, "MyEvent", "eventArg", { id: "MyId"})\``, - this.contractAt + this.readEventArgument + ); + } + + private _assertUniqueSendId(futureId: string) { + return this._assertUniqueFutureId( + futureId, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.send(myContract, "0xabcd", { id: "MyId"})\``, + this.send ); } } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 40756f6f82..a63408d9a0 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,5 +1,6 @@ import { ArtifactType, SolidityParamsType } from "../stubs"; import { + AddressResolvableFuture, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, @@ -14,6 +15,7 @@ import { NamedLibraryDeploymentFuture, NamedStaticCallFuture, ReadEventArgumentFuture, + SendDataFuture, } from "../types/module"; const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); @@ -203,6 +205,22 @@ export class ReadEventArgumentFutureImplementation } } +export class SendDataFutureImplementation + extends BaseFutureImplementation + implements SendDataFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly to: string | AddressResolvableFuture, + public readonly data: string, + public readonly value: bigint, + public readonly from: string | undefined + ) { + super(id, FutureType.SEND_DATA, module); + } +} + export class IgnitionModuleImplementation< ModuleIdT extends string = string, ContractNameT extends string = string, diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index a0638106f2..7b11dc2769 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -11,6 +11,7 @@ import { NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, ReadEventArgumentFutureImplementation, + SendDataFutureImplementation, } from "./internal/module"; import { isFuture } from "./internal/utils"; import { @@ -35,7 +36,8 @@ import { SerializedNamedContractDeploymentFuture, SerializedNamedLibraryDeploymentFuture, SerializedNamedStaticCallFuture, - SerializedReadEventAgument, + SerializedReadEventArgumentFuture, + SerializedSendDataFuture, SerializedSolidityParamType, SerializedStoredDeployment, SerializedStoredModule, @@ -298,8 +300,8 @@ export class StoredDeploymentSerializer { future, "futureToReadFrom", partialFutureLookup[ - (serializedFuture as SerializedReadEventAgument).futureToReadFrom - .futureId + (serializedFuture as SerializedReadEventArgumentFuture) + .futureToReadFrom.futureId ] as Future ); @@ -307,7 +309,8 @@ export class StoredDeploymentSerializer { future, "emitter", partialFutureLookup[ - (serializedFuture as SerializedReadEventAgument).emitter.futureId + (serializedFuture as SerializedReadEventArgumentFuture).emitter + .futureId ] as ContractFuture ); } else { @@ -557,22 +560,40 @@ export class StoredDeploymentSerializer { return serializedArtifactContractAtFuture; } else if (future instanceof ReadEventArgumentFutureImplementation) { - const serializedReadEventArrgumentFuture: SerializedReadEventAgument = { + const serializedReadEventArgumentFuture: SerializedReadEventArgumentFuture = + { + id: future.id, + type: future.type, + dependencies: Array.from(future.dependencies).map( + StoredDeploymentSerializer._convertFutureToFutureToken + ), + futureToReadFrom: this._convertFutureToFutureToken( + future.futureToReadFrom + ), + eventName: future.eventName, + argumentName: future.argumentName, + emitter: this._convertFutureToFutureToken(future.emitter), + eventIndex: future.eventIndex, + }; + + return serializedReadEventArgumentFuture; + } else if (future instanceof SendDataFutureImplementation) { + const serializedSendDataFuture: SerializedSendDataFuture = { id: future.id, type: future.type, dependencies: Array.from(future.dependencies).map( StoredDeploymentSerializer._convertFutureToFutureToken ), - futureToReadFrom: this._convertFutureToFutureToken( - future.futureToReadFrom - ), - eventName: future.eventName, - argumentName: future.argumentName, - emitter: this._convertFutureToFutureToken(future.emitter), - eventIndex: future.eventIndex, + to: + typeof future.to === "string" + ? future.to + : this._convertFutureToFutureToken(future.to), + data: future.data, + value: future.value.toString(), + from: future.from, }; - return serializedReadEventArrgumentFuture; + return serializedSendDataFuture; } else { throw new IgnitionError( `Unknown future type while serializing: ${FutureType[future.type]}` @@ -696,6 +717,15 @@ export class StoredDeploymentSerializer { serializedFuture.emitter as any, serializedFuture.eventIndex ); + case FutureType.SEND_DATA: + return new SendDataFutureImplementation( + serializedFuture.id, + placeholderModule, + serializedFuture.to as any, + serializedFuture.data, + BigInt(serializedFuture.value), + serializedFuture.from + ); } } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 0ea75e1d47..de1940b5f0 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,6 +1,7 @@ import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; import { + AddressResolvableFuture, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, @@ -13,6 +14,7 @@ import { NamedLibraryDeploymentFuture, NamedStaticCallFuture, ReadEventArgumentFuture, + SendDataFuture, } from "./module"; /** @@ -136,6 +138,18 @@ export interface ReadEventArgumentOptions { eventIndex?: number; } +/** + * The options for a `send` call. + * + * @beta + */ +export interface SendDataOptions { + id?: string; + after?: Future[]; + value?: bigint; + from?: string; +} + /** * The build api for configuring a deployment within a module. * @@ -211,6 +225,12 @@ export interface IgnitionModuleBuilder { options?: ReadEventArgumentOptions ): ReadEventArgumentFuture; + send( + to: string | AddressResolvableFuture, + data: string, + options?: SendDataOptions + ): SendDataFuture; + useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 99180743ec..0af79b9bcf 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -15,6 +15,7 @@ export enum FutureType { NAMED_CONTRACT_AT, ARTIFACT_CONTRACT_AT, READ_EVENT_ARGUMENT, + SEND_DATA, } /** @@ -31,7 +32,8 @@ export type Future = | NamedStaticCallFuture | NamedContractAtFuture | ArtifactContractAtFuture - | ReadEventArgumentFuture; + | ReadEventArgumentFuture + | SendDataFuture; /** * A future representing a contract. Either an existing one or one @@ -70,6 +72,18 @@ export type FunctionCallFuture< | NamedContractCallFuture | NamedStaticCallFuture; +/** + * A future that can be resolved to a standard Ethereum address. + * + * @beta + */ +export type AddressResolvableFuture = + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture + | NamedContractAtFuture + | ArtifactContractAtFuture + | NamedStaticCallFuture; + /** * A future representing the deployment of a contract that belongs to this project. * @@ -225,6 +239,22 @@ export interface ReadEventArgumentFuture { eventIndex: number; } +/** + * A future that represents sending arbitrary data to the EVM. + * + * @beta + */ +export interface SendDataFuture { + type: FutureType.SEND_DATA; + id: string; + module: IgnitionModule; + dependencies: Set; + to: string | AddressResolvableFuture; + data: string; + value: bigint; + from: string | undefined; +} + /** * An object containing the parameters passed into the module. * diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index d967fb9a48..fb0589b763 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -164,7 +164,8 @@ export interface SerializedArtifactContractAtFuture * * @beta */ -export interface SerializedReadEventAgument extends BaseSerializedFuture { +export interface SerializedReadEventArgumentFuture + extends BaseSerializedFuture { type: FutureType.READ_EVENT_ARGUMENT; futureToReadFrom: FutureToken; eventName: string; @@ -173,6 +174,19 @@ export interface SerializedReadEventAgument extends BaseSerializedFuture { eventIndex: number; } +/** + * The serialized version of ReadEventArgumentFuture. + * + * @beta + */ +export interface SerializedSendDataFuture extends BaseSerializedFuture { + type: FutureType.SEND_DATA; + to: string | FutureToken; + data: string; + value: string; + from: string | undefined; +} + /** * The details of a deployment that will be used in the UI. * @@ -268,4 +282,5 @@ export type SerializedFuture = | SerializedNamedStaticCallFuture | SerializedNamedContractAtFuture | SerializedArtifactContractAtFuture - | SerializedReadEventAgument; + | SerializedReadEventArgumentFuture + | SerializedSendDataFuture; diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index 986a4b5781..8881c3c881 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -56,6 +56,8 @@ function resolveTitleFor(future: Future): string { })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event argument from future - ${future.id}`; + case FutureType.SEND_DATA: + return `Send data - ${future.id}`; } } @@ -164,5 +166,12 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {

    Argument - {future.argumentName}

    ); + case FutureType.SEND_DATA: + return ( +
    +

    To - {typeof future.to === "string" ? future.to : future.to.id}

    +

    Data - {future.data}

    +
    + ); } }; diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 3e64906e58..8c7e04f7df 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -45,6 +45,10 @@ function toDisplayText(future: Future): string { })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.argumentName})`; + case FutureType.SEND_DATA: + return `Send data to ${ + typeof future.to === "string" ? future.to : future.to.id + }`; } } diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 6884d80d0d..a7d1981b1b 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -78,5 +78,7 @@ function toLabel(f: Future): string { })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event from future ${f.futureToReadFrom.id} (event ${f.eventName} argument ${f.argumentName})`; + case FutureType.SEND_DATA: + return `Send data to ${typeof f.to === "string" ? f.to : f.to.id}`; } } From d2868ba0150b73d9b155383ee065a2ad54a8ba68 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 24 May 2023 00:38:59 -0400 Subject: [PATCH 0376/1302] add tests for send --- packages/core/test/new-api/send.ts | 227 +++++++++++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 packages/core/test/new-api/send.ts diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts new file mode 100644 index 0000000000..e414d2f503 --- /dev/null +++ b/packages/core/test/new-api/send.ts @@ -0,0 +1,227 @@ +import { assert } from "chai"; + +import { defineModule } from "../../src/new-api/define-module"; +import { SendDataFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { FutureType } from "../../src/new-api/types/module"; + +describe("send", () => { + it("should be able to setup a send", () => { + const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + m.send("0xtest", "test-data"); + + return {}; + }); + + const constructor = new ModuleConstructor(0, []); + const moduleWithASingleContract = constructor.construct( + moduleWithASingleContractDefinition + ); + + assert.isDefined(moduleWithASingleContract); + + // 1 contract future & 1 call future + assert.equal(moduleWithASingleContract.futures.size, 1); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.SEND_DATA + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + + const sendFuture = [...moduleWithASingleContract.futures].find( + ({ id }) => id === "Module1:0xtest" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.data, "test-data"); + }); + + it("should be able to pass one contract as the 'to' arg for a send", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + m.send(example, ""); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Module1:Example" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.dependencies.size, 1); + assert(sendFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass one contract as an after dependency of a send", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + m.send("0xtest", "", { after: [example] }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example" + ); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:0xtest" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.dependencies.size, 1); + assert(sendFuture.dependencies.has(exampleFuture!)); + }); + + it("should be able to pass value as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + m.send("0xtest", "", { value: BigInt(42) }); + + return {}; + } + ); + + const constructor = new ModuleConstructor(0, []); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:0xtest" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.value, BigInt(42)); + }); + + it("should be able to pass from as an option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + m.send("0xtest", "", { from: m.accounts[1] }); + + return {}; + } + ); + + const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:0xtest" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.from, "0x2"); + }); + + describe("passing id", () => { + it("should be able to call the same function twice by passing an id", () => { + const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { + m.send("0xtest", "test", { id: "first" }); + m.send("0xtest", "test", { id: "second" }); + + return {}; + }); + + const constructor = new ModuleConstructor(0, []); + const moduleWithSameCallTwice = constructor.construct( + moduleWithSameCallTwiceDefinition + ); + + assert.equal(moduleWithSameCallTwice.id, "Module1"); + + const sendFuture = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:first" + ); + + const sendFuture2 = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1:second" + ); + + assert.isDefined(sendFuture); + assert.isDefined(sendFuture2); + }); + + it("should throw if the same function is called twice without differentiating ids", () => { + const moduleDefinition = defineModule("Module1", (m) => { + m.send("0xtest", "test"); + m.send("0xtest", "test"); + + return {}; + }); + + const constructor = new ModuleConstructor(0, []); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Duplicated id Module1:0xtest found in module Module1/ + ); + }); + + it("should throw if a call tries to pass the same id twice", () => { + const moduleDefinition = defineModule("Module1", (m) => { + m.send("0xtest", "test", { id: "first" }); + m.send("0xtest", "test", { id: "first" }); + return {}; + }); + + const constructor = new ModuleConstructor(0, []); + + assert.throws( + () => constructor.construct(moduleDefinition), + /Duplicated id Module1:first found in module Module1/ + ); + }); + }); +}); From d1147ab415cf4cda7f63dcb7ed5de76f4fe405bf Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 24 May 2023 11:53:12 -0300 Subject: [PATCH 0377/1302] Improve type-level tests of Future --- packages/core/test/new-api/types/module.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/core/test/new-api/types/module.ts b/packages/core/test/new-api/types/module.ts index ae72541e48..08d70317b8 100644 --- a/packages/core/test/new-api/types/module.ts +++ b/packages/core/test/new-api/types/module.ts @@ -4,6 +4,12 @@ import { IgnitionModule, } from "../../../src/new-api/types/module"; +type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( + k: infer I +) => void + ? I + : never; + interface BaseFuture { id: string; type: FutureType; @@ -11,6 +17,16 @@ interface BaseFuture { dependencies: Set; } -const _testThatEveryFutureIsBaseFuture: Future extends BaseFuture - ? true - : never = true; +function _testThatEveryFutureIsBaseFuture(f: Future): BaseFuture { + return f; +} + +function _testThatBaseFutureIncludesAllSharedFieldsExceptType( + f: Omit +): UnionToIntersection> { + return f; +} + +function _testThatEveryFutureTypeIsUsed(type: FutureType): Future["type"] { + return type; +} From fe70be12f3b1fff1fcaeb306f5c306ef8255e6c3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 24 May 2023 21:10:50 -0400 Subject: [PATCH 0378/1302] adjust send api --- .../src/new-api/internal/module-builder.ts | 10 +++--- packages/core/src/new-api/internal/module.ts | 2 +- .../new-api/stored-deployment-serializer.ts | 4 +-- .../core/src/new-api/types/module-builder.ts | 5 +-- packages/core/src/new-api/types/module.ts | 2 +- .../new-api/types/serialized-deployment.ts | 2 +- packages/core/test/new-api/send.ts | 36 +++++++++---------- 7 files changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index bf983c064d..5bcb9af2c5 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -486,13 +486,13 @@ export class IgnitionModuleBuilderImplementation< } public send( + id: string, to: string | AddressResolvableFuture, - data: string, + value?: bigint, + data?: string, options: SendDataOptions = {} ): SendDataFuture { - const id = options.id ?? (typeof to === "string" ? to : to.id); - const futureId = `${this._module.id}:${id}`; - options.value ??= BigInt(0); + const futureId = `${this._module.id}:${options.id ?? id}`; this._assertUniqueSendId(futureId); @@ -500,8 +500,8 @@ export class IgnitionModuleBuilderImplementation< futureId, this._module, to, + value ?? BigInt(0), data, - options.value, options.from ); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index a63408d9a0..7496ec3421 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -213,8 +213,8 @@ export class SendDataFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly to: string | AddressResolvableFuture, - public readonly data: string, public readonly value: bigint, + public readonly data: string | undefined, public readonly from: string | undefined ) { super(id, FutureType.SEND_DATA, module); diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 7b11dc2769..dc3350e68d 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -588,8 +588,8 @@ export class StoredDeploymentSerializer { typeof future.to === "string" ? future.to : this._convertFutureToFutureToken(future.to), - data: future.data, value: future.value.toString(), + data: future.data, from: future.from, }; @@ -722,8 +722,8 @@ export class StoredDeploymentSerializer { serializedFuture.id, placeholderModule, serializedFuture.to as any, - serializedFuture.data, BigInt(serializedFuture.value), + serializedFuture.data, serializedFuture.from ); } diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index de1940b5f0..242c808b64 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -146,7 +146,6 @@ export interface ReadEventArgumentOptions { export interface SendDataOptions { id?: string; after?: Future[]; - value?: bigint; from?: string; } @@ -226,8 +225,10 @@ export interface IgnitionModuleBuilder { ): ReadEventArgumentFuture; send( + id: string, to: string | AddressResolvableFuture, - data: string, + value?: bigint, + data?: string, options?: SendDataOptions ): SendDataFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0af79b9bcf..7684f05016 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -250,8 +250,8 @@ export interface SendDataFuture { module: IgnitionModule; dependencies: Set; to: string | AddressResolvableFuture; - data: string; value: bigint; + data: string | undefined; from: string | undefined; } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index fb0589b763..1b8a95da7a 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -182,8 +182,8 @@ export interface SerializedReadEventArgumentFuture export interface SerializedSendDataFuture extends BaseSerializedFuture { type: FutureType.SEND_DATA; to: string | FutureToken; - data: string; value: string; + data: string | undefined; from: string | undefined; } diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index e414d2f503..ef41fc6b8b 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -8,7 +8,7 @@ import { FutureType } from "../../src/new-api/types/module"; describe("send", () => { it("should be able to setup a send", () => { const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { - m.send("0xtest", "test-data"); + m.send("test send", "0xtest", 0n, "test-data"); return {}; }); @@ -31,7 +31,7 @@ describe("send", () => { assert.equal(moduleWithASingleContract.submodules.size, 0); const sendFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:0xtest" + ({ id }) => id === "Module1:test send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -46,7 +46,7 @@ describe("send", () => { "Module1", (m) => { const example = m.contract("Example"); - m.send(example, ""); + m.send("test send", example, 0n, ""); return { example }; } @@ -64,7 +64,7 @@ describe("send", () => { ); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Module1:Example" + ({ id }) => id === "Module1:test send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -80,7 +80,7 @@ describe("send", () => { "Module1", (m) => { const example = m.contract("Example"); - m.send("0xtest", "", { after: [example] }); + m.send("test send", "0xtest", 0n, "", { after: [example] }); return { example }; } @@ -98,7 +98,7 @@ describe("send", () => { ); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:0xtest" + ({ id }) => id === "Module1:test send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -109,11 +109,11 @@ describe("send", () => { assert(sendFuture.dependencies.has(exampleFuture!)); }); - it("should be able to pass value as an option", () => { + it("should be able to pass a value", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { - m.send("0xtest", "", { value: BigInt(42) }); + m.send("test send", "0xtest", 42n, ""); return {}; } @@ -127,7 +127,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:0xtest" + ({ id }) => id === "Module1:test send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -141,7 +141,7 @@ describe("send", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { - m.send("0xtest", "", { from: m.accounts[1] }); + m.send("test send", "0xtest", 0n, "", { from: m.accounts[1] }); return {}; } @@ -155,7 +155,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:0xtest" + ({ id }) => id === "Module1:test send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -168,8 +168,8 @@ describe("send", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { - m.send("0xtest", "test", { id: "first" }); - m.send("0xtest", "test", { id: "second" }); + m.send("test send", "0xtest", 0n, "test", { id: "first" }); + m.send("test send", "0xtest", 0n, "test", { id: "second" }); return {}; }); @@ -195,8 +195,8 @@ describe("send", () => { it("should throw if the same function is called twice without differentiating ids", () => { const moduleDefinition = defineModule("Module1", (m) => { - m.send("0xtest", "test"); - m.send("0xtest", "test"); + m.send("test send", "0xtest", 0n, "test"); + m.send("test send", "0xtest", 0n, "test"); return {}; }); @@ -205,14 +205,14 @@ describe("send", () => { assert.throws( () => constructor.construct(moduleDefinition), - /Duplicated id Module1:0xtest found in module Module1/ + /Duplicated id Module1:test send found in module Module1/ ); }); it("should throw if a call tries to pass the same id twice", () => { const moduleDefinition = defineModule("Module1", (m) => { - m.send("0xtest", "test", { id: "first" }); - m.send("0xtest", "test", { id: "first" }); + m.send("test send", "0xtest", 0n, "test", { id: "first" }); + m.send("test send", "0xtest", 0n, "test", { id: "first" }); return {}; }); From b868cb05190226cf932af08720a71e40b1dc524d Mon Sep 17 00:00:00 2001 From: Zoey Date: Thu, 25 May 2023 11:07:15 -0400 Subject: [PATCH 0379/1302] Update packages/core/src/new-api/internal/module-builder.ts Co-authored-by: Patricio Palladino --- packages/core/src/new-api/internal/module-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 5bcb9af2c5..b50eaa2242 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -644,7 +644,7 @@ export class IgnitionModuleBuilderImplementation< private _assertUniqueSendId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.send(myContract, "0xabcd", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.send("MyId", "0xabcd")\``, this.send ); } From e8459790f83e83e53572c031ce72cbb005df4765 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:46:54 -0300 Subject: [PATCH 0380/1302] Rename old type --- packages/core/src/types/dsl.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index bca8d3ad1d..d3e9083201 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -297,7 +297,7 @@ export interface UseModuleOptions { * * @alpha */ -export type BaseArgumentType = number | BigNumber | string | boolean; +export type BaseArgumentTypeOld = number | BigNumber | string | boolean; /** * Allowed parameters that can be passed into a module. @@ -305,7 +305,7 @@ export type BaseArgumentType = number | BigNumber | string | boolean; * @alpha */ export type ExternalParamValue = - | BaseArgumentType + | BaseArgumentTypeOld | ExternalParamValue[] | { [field: string]: ExternalParamValue }; From 400238f6aa2b706ff56c55bcddf37b99b3da3fe5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:47:53 -0300 Subject: [PATCH 0381/1302] Define ArgumentType --- packages/core/src/new-api/types/module.ts | 24 ++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 7684f05016..1b32599a21 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,4 +1,18 @@ -import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; +import { ArtifactType } from "../stubs"; + +export type BaseArgumentType = + | number + | bigint + | string + | boolean + | ContractFuture + | NamedStaticCallFuture + | ReadEventArgumentFuture; + +export type ArgumentType = + | BaseArgumentType + | ArgumentType[] + | { [field: string]: ArgumentType }; /** * The different future types supported by Ignition. @@ -95,7 +109,7 @@ export interface NamedContractDeploymentFuture { module: IgnitionModule; dependencies: Set; contractName: ContractNameT; - constructorArgs: SolidityParamsType; + constructorArgs: ArgumentType[]; libraries: Record>; value: bigint; from: string | undefined; @@ -114,7 +128,7 @@ export interface ArtifactContractDeploymentFuture { dependencies: Set; contractName: string; artifact: ArtifactType; - constructorArgs: SolidityParamsType; + constructorArgs: ArgumentType[]; libraries: Record>; value: bigint; from: string | undefined; @@ -167,7 +181,7 @@ export interface NamedContractCallFuture< dependencies: Set; contract: ContractFuture; functionName: FunctionNameT; - args: SolidityParamsType; + args: ArgumentType[]; value: bigint; from: string | undefined; } @@ -187,7 +201,7 @@ export interface NamedStaticCallFuture< dependencies: Set; contract: ContractFuture; functionName: FunctionNameT; - args: SolidityParamsType; + args: ArgumentType[]; from: string | undefined; } From 644ffd542484efcecbba07a61caa4a8433725911 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:48:05 -0300 Subject: [PATCH 0382/1302] Define ModuleParameterType --- packages/core/src/new-api/types/module.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 1b32599a21..83159d7a6e 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -269,13 +269,20 @@ export interface SendDataFuture { from: string | undefined; } +export type BaseModuleParameterType = number | bigint | string | boolean; + +export type ModuleParameterType = + | BaseModuleParameterType + | ModuleParameterType[] + | { [field: string]: ModuleParameterType }; + /** * An object containing the parameters passed into the module. * * @beta */ export interface ModuleParameters { - [parameterName: string]: SolidityParamType; + [parameterName: string]: ModuleParameterType; } /** From 6eabc69efeef6d44a26055da267c6d3990646ead Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:50:06 -0300 Subject: [PATCH 0383/1302] Add their docs --- packages/core/src/new-api/types/module.ts | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 83159d7a6e..9269caf8c1 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,5 +1,11 @@ import { ArtifactType } from "../stubs"; +/** + * Base argument type that smart contracts can receive in their constructors + * and functions. + * + * @beta + */ export type BaseArgumentType = | number | bigint @@ -9,6 +15,11 @@ export type BaseArgumentType = | NamedStaticCallFuture | ReadEventArgumentFuture; +/** + * Argument type that smart contracts can receive in their constructors and functions. + * + * @beta + */ export type ArgumentType = | BaseArgumentType | ArgumentType[] @@ -269,8 +280,18 @@ export interface SendDataFuture { from: string | undefined; } +/** + * Base type of module parameters's values. + * + * @beta + */ export type BaseModuleParameterType = number | bigint | string | boolean; +/** + * Type of module parameters's values. + * + * @beta + */ export type ModuleParameterType = | BaseModuleParameterType | ModuleParameterType[] From 1704e4f886d647403ada53186af06d9493c1aa53 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:50:28 -0300 Subject: [PATCH 0384/1302] Use the new types in the module implementation --- packages/core/src/new-api/internal/module.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 7496ec3421..bbedb09174 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,6 +1,7 @@ -import { ArtifactType, SolidityParamsType } from "../stubs"; +import { ArtifactType } from "../stubs"; import { AddressResolvableFuture, + ArgumentType, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, @@ -56,7 +57,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly constructorArgs: SolidityParamsType, + public readonly constructorArgs: ArgumentType[], public readonly libraries: Record>, public readonly value: bigint, public readonly from: string | undefined @@ -75,7 +76,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly constructorArgs: SolidityParamsType, + public readonly constructorArgs: ArgumentType[], public readonly artifact: ArtifactType, public readonly libraries: Record>, public readonly value: bigint, @@ -132,7 +133,7 @@ export class NamedContractCallFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, - public readonly args: SolidityParamsType, + public readonly args: ArgumentType[], public readonly value: bigint, public readonly from: string | undefined ) { @@ -152,7 +153,7 @@ export class NamedStaticCallFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, - public readonly args: SolidityParamsType, + public readonly args: ArgumentType[], public readonly from: string | undefined ) { super(id, FutureType.NAMED_STATIC_CALL, module); From 273538f88a7da8160775ca7c260cec2fff7d4373 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:50:44 -0300 Subject: [PATCH 0385/1302] Define function to get all the futures in an array of arguments --- packages/core/src/new-api/internal/utils.ts | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index edf8b9e5bf..914d33b3fe 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,4 +1,4 @@ -import { Future, FutureType } from "../types/module"; +import { ArgumentType, Future, FutureType } from "../types/module"; export function isFuture(potential: unknown): potential is Future { return ( @@ -9,3 +9,23 @@ export function isFuture(potential: unknown): potential is Future { FutureType[potential.type] !== undefined ); } + +export function getFutures(args: ArgumentType[]): Future[] { + return args.flatMap(_getFutures); +} + +function _getFutures(argument: ArgumentType): Future[] { + if (isFuture(argument)) { + return [argument]; + } + + if (Array.isArray(argument)) { + return getFutures(argument); + } + + if (typeof argument === "object" && argument !== null) { + return getFutures(Object.values(argument)); + } + + return []; +} From 65f987e55bab6fcdffd6b7c60226440a4d5f5731 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:51:15 -0300 Subject: [PATCH 0386/1302] Update the module-builder types --- packages/core/src/new-api/types/module-builder.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 242c808b64..b7309a8723 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,13 +1,15 @@ -import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; +import { ArtifactType } from "../stubs"; import { AddressResolvableFuture, + ArgumentType, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, ContractFuture, Future, IgnitionModuleResult, + ModuleParameterType, NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, @@ -160,14 +162,14 @@ export interface IgnitionModuleBuilder { contract( contractName: ContractNameT, - args?: SolidityParamsType, + args?: ArgumentType[], options?: ContractOptions ): NamedContractDeploymentFuture; contractFromArtifact( contractName: string, artifact: ArtifactType, - args?: SolidityParamsType, + args?: ArgumentType[], options?: ContractFromArtifactOptions ): ArtifactContractDeploymentFuture; @@ -185,14 +187,14 @@ export interface IgnitionModuleBuilder { call( contractFuture: ContractFuture, functionName: FunctionNameT, - args?: SolidityParamsType, + args?: ArgumentType[], options?: CallOptions ): NamedContractCallFuture; staticCall( contractFuture: ContractFuture, functionName: FunctionNameT, - args?: SolidityParamsType, + args?: ArgumentType[], options?: StaticCallOptions ): NamedStaticCallFuture; @@ -209,7 +211,7 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): ArtifactContractAtFuture; - getParameter( + getParameter( parameterName: string, defaultValue?: ParamType ): ParamType; From e03930f98a0570ffd8b9917e0cdaa5812410da96 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:51:27 -0300 Subject: [PATCH 0387/1302] Update module builder implementation --- .../src/new-api/internal/module-builder.ts | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index b50eaa2242..1123e45d7c 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -2,15 +2,17 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; -import { ArtifactType, SolidityParamType, SolidityParamsType } from "../stubs"; +import { ArtifactType } from "../stubs"; import { AddressResolvableFuture, + ArgumentType, ArtifactContractAtFuture, ArtifactContractDeploymentFuture, ArtifactLibraryDeploymentFuture, ContractFuture, IgnitionModule, IgnitionModuleResult, + ModuleParameterType, ModuleParameters, NamedContractAtFuture, NamedContractCallFuture, @@ -46,7 +48,7 @@ import { ReadEventArgumentFutureImplementation, SendDataFutureImplementation, } from "./module"; -import { isFuture } from "./utils"; +import { getFutures, isFuture } from "./utils"; const STUB_MODULE_RESULTS = { [inspect.custom](): string { @@ -139,7 +141,7 @@ export class IgnitionModuleBuilderImplementation< public contract( contractName: ContractNameT, - args: SolidityParamsType = [], + args: ArgumentType[] = [], options: ContractOptions = {} ): NamedContractDeploymentFuture { const id = options.id ?? contractName; @@ -159,7 +161,7 @@ export class IgnitionModuleBuilderImplementation< options.from ); - for (const arg of args.filter(isFuture)) { + for (const arg of getFutures(args)) { future.dependencies.add(arg); } @@ -181,7 +183,7 @@ export class IgnitionModuleBuilderImplementation< public contractFromArtifact( contractName: string, artifact: ArtifactType, - args: SolidityParamsType = [], + args: ArgumentType[] = [], options: ContractFromArtifactOptions = {} ): ArtifactContractDeploymentFuture { const id = options.id ?? contractName; @@ -204,7 +206,7 @@ export class IgnitionModuleBuilderImplementation< this._module.futures.add(future); - for (const arg of args.filter(isFuture)) { + for (const arg of getFutures(args)) { future.dependencies.add(arg); } @@ -292,7 +294,7 @@ export class IgnitionModuleBuilderImplementation< public call( contractFuture: ContractFuture, functionName: FunctionNameT, - args: SolidityParamsType = [], + args: ArgumentType[] = [], options: CallOptions = {} ): NamedContractCallFuture { const id = options.id ?? functionName; @@ -313,7 +315,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(contractFuture); - for (const arg of args.filter(isFuture)) { + for (const arg of getFutures(args)) { future.dependencies.add(arg); } @@ -329,7 +331,7 @@ export class IgnitionModuleBuilderImplementation< public staticCall( contractFuture: ContractFuture, functionName: FunctionNameT, - args: SolidityParamsType = [], + args: ArgumentType[] = [], options: CallOptions = {} ): NamedStaticCallFuture { const id = options.id ?? functionName; @@ -348,7 +350,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(contractFuture); - for (const arg of args.filter(isFuture)) { + for (const arg of getFutures(args)) { future.dependencies.add(arg); } @@ -423,7 +425,7 @@ export class IgnitionModuleBuilderImplementation< return future; } - public getParameter( + public getParameter( parameterName: string, defaultValue?: ParamType ): ParamType { From e1264cdd4e25943c5e7bb6bbf3a22173c0cb5ad6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:51:55 -0300 Subject: [PATCH 0388/1302] Use the new types in the execution state module --- packages/core/src/new-api/types/execution-state.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/types/execution-state.ts index 4a25da4600..d815b8048f 100644 --- a/packages/core/src/new-api/types/execution-state.ts +++ b/packages/core/src/new-api/types/execution-state.ts @@ -1,6 +1,4 @@ -import { SolidityParamsType } from "../stubs"; - -import { FutureType } from "./module"; +import { ArgumentType, FutureType } from "./module"; /** * This interface represents a transaction that was sent to the network. @@ -48,7 +46,7 @@ interface BaseOnchainInteraction< interface DeploymentOnchainInteraction extends BaseOnchainInteraction { deploymentBytecode: string; // Maybe we want to optimize this out of the journal? In some cases it can be read from the artifact. - constructorArgs: SolidityParamsType; + constructorArgs: ArgumentType[]; value: bigint; } @@ -59,7 +57,7 @@ interface FunctionCallOnchainInteraction extends BaseOnchainInteraction { contractAddress: string; signature: string; // TODO: Maybe ABI fragment? - arguments: SolidityParamsType; + arguments: ArgumentType[]; value: bigint; } @@ -122,7 +120,7 @@ export interface DeploymentExecutionState > { storedArtifactPath: string; // As stored in the deployment directory. storedBuildInfoPath?: string; // As stored in the deployment directory. Optional as it's not always present - constructorArgs: SolidityParamsType; + constructorArgs: ArgumentType[]; libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? value: bigint; contractAddress?: string; // The result From 7760642f63add41b0fbe00e5a5c0485554113f69 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:52:08 -0300 Subject: [PATCH 0389/1302] Remove the old stub types --- packages/core/src/index.ts | 6 +----- packages/core/src/new-api/stubs.ts | 14 -------------- 2 files changed, 1 insertion(+), 19 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f3c3806b4a..cdc20869ec 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -6,11 +6,7 @@ export { defineModule } from "./new-api/define-module"; export { ModuleConstructor } from "./new-api/internal/module-builder"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; /* TODO: move out and concretize these stubs */ -export { - ArtifactType, - SolidityParamsType, - SolidityParamType, -} from "./new-api/stubs"; +export { ArtifactType } from "./new-api/stubs"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; diff --git a/packages/core/src/new-api/stubs.ts b/packages/core/src/new-api/stubs.ts index 819883f9de..a5efeecc51 100644 --- a/packages/core/src/new-api/stubs.ts +++ b/packages/core/src/new-api/stubs.ts @@ -1,17 +1,3 @@ -/** - * The type representing all valid types for solidity parameters. - * - * @beta - */ -export type SolidityParamType = any; - -/** - * The composite type of a solidity methods parameters. - * - * @beta - */ -export type SolidityParamsType = SolidityParamType[]; - /** * The artifact of a contract compilation. * From d91b36c71c34c24fcb4e1183372c3e4dc62adf94 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 14:54:34 -0300 Subject: [PATCH 0390/1302] [UNRELATED] Remove some calls to .filter(isFuture) --- .../src/new-api/internal/module-builder.ts | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 1123e45d7c..8f570b49fc 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -48,7 +48,7 @@ import { ReadEventArgumentFutureImplementation, SendDataFutureImplementation, } from "./module"; -import { getFutures, isFuture } from "./utils"; +import { getFutures } from "./utils"; const STUB_MODULE_RESULTS = { [inspect.custom](): string { @@ -165,13 +165,11 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(arg); } - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } - for (const libraryFuture of Object.values(options.libraries).filter( - isFuture - )) { + for (const libraryFuture of Object.values(options.libraries)) { future.dependencies.add(libraryFuture); } @@ -210,13 +208,11 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(arg); } - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } - for (const libraryFuture of Object.values(options.libraries).filter( - isFuture - )) { + for (const libraryFuture of Object.values(options.libraries)) { future.dependencies.add(libraryFuture); } @@ -241,13 +237,11 @@ export class IgnitionModuleBuilderImplementation< options.from ); - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } - for (const libraryFuture of Object.values(options.libraries).filter( - isFuture - )) { + for (const libraryFuture of Object.values(options.libraries)) { future.dependencies.add(libraryFuture); } @@ -276,13 +270,11 @@ export class IgnitionModuleBuilderImplementation< options.from ); - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } - for (const libraryFuture of Object.values(options.libraries).filter( - isFuture - )) { + for (const libraryFuture of Object.values(options.libraries)) { future.dependencies.add(libraryFuture); } @@ -319,7 +311,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(arg); } - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -354,7 +346,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(arg); } - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -380,7 +372,7 @@ export class IgnitionModuleBuilderImplementation< address ); - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -412,7 +404,7 @@ export class IgnitionModuleBuilderImplementation< artifact ); - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -511,7 +503,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(to); } - for (const afterFuture of (options.after ?? []).filter(isFuture)) { + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } From fc27e944a8cc87b9be48b2f55c9b386bcb1440b0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:28:03 -0300 Subject: [PATCH 0391/1302] Use AddressResolvableFuture for all addresses --- packages/core/src/new-api/internal/module.ts | 4 ++-- packages/core/src/new-api/types/module.ts | 12 +++++------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index bbedb09174..7d734fc53e 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -168,7 +168,7 @@ export class NamedContractAtFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly address: string | NamedStaticCallFuture + public readonly address: string | AddressResolvableFuture ) { super(id, FutureType.NAMED_CONTRACT_AT, module); } @@ -182,7 +182,7 @@ export class ArtifactContractAtFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: string, - public readonly address: string | NamedStaticCallFuture, + public readonly address: string | AddressResolvableFuture, public readonly artifact: ArtifactType ) { super(id, FutureType.ARTIFACT_CONTRACT_AT, module); diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 9269caf8c1..9e44dcc86b 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -103,11 +103,9 @@ export type FunctionCallFuture< * @beta */ export type AddressResolvableFuture = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedContractAtFuture - | ArtifactContractAtFuture - | NamedStaticCallFuture; + | ContractFuture + | NamedStaticCallFuture + | ReadEventArgumentFuture; /** * A future representing the deployment of a contract that belongs to this project. @@ -227,7 +225,7 @@ export interface NamedContractAtFuture { module: IgnitionModule; dependencies: Set; contractName: ContractNameT; - address: string | NamedStaticCallFuture; + address: string | AddressResolvableFuture; } /** @@ -242,7 +240,7 @@ export interface ArtifactContractAtFuture { module: IgnitionModule; dependencies: Set; contractName: string; - address: string | NamedStaticCallFuture; + address: string | AddressResolvableFuture; artifact: ArtifactType; } From fb83a01a6ced76e2a15efabe704efe1ff4584cea Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:28:58 -0300 Subject: [PATCH 0392/1302] Rework the serialization and make it type-safe --- .../src/new-api/internal/topological-order.ts | 26 + packages/core/src/new-api/internal/utils.ts | 35 +- .../new-api/stored-deployment-serializer.ts | 1112 ++++++++--------- .../new-api/types/serialized-deployment.ts | 35 +- packages/core/src/ui-helpers.ts | 5 +- 5 files changed, 595 insertions(+), 618 deletions(-) create mode 100644 packages/core/src/new-api/internal/topological-order.ts diff --git a/packages/core/src/new-api/internal/topological-order.ts b/packages/core/src/new-api/internal/topological-order.ts new file mode 100644 index 0000000000..067b4b7154 --- /dev/null +++ b/packages/core/src/new-api/internal/topological-order.ts @@ -0,0 +1,26 @@ +export type Graph = Map>; + +export function getNodesInTopologicalOrder(graph: Graph): T[] { + const visited = new Set(); + const sorted: T[] = []; + + for (const node of graph.keys()) { + if (!visited.has(node)) { + visit(graph, node, visited, sorted); + } + } + + return sorted.reverse(); +} + +function visit(graph: Graph, node: T, visited: Set, sorted: T[]) { + visited.add(node); + + for (const to of graph.get(node)!) { + if (!visited.has(to)) { + visit(graph, to, visited, sorted); + } + } + + sorted.push(node); +} diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 914d33b3fe..da5c674741 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,4 +1,10 @@ -import { ArgumentType, Future, FutureType } from "../types/module"; +import { + AddressResolvableFuture, + ArgumentType, + ContractFuture, + Future, + FutureType, +} from "../types/module"; export function isFuture(potential: unknown): potential is Future { return ( @@ -10,6 +16,33 @@ export function isFuture(potential: unknown): potential is Future { ); } +export function isContractFuture( + future: Future +): future is ContractFuture { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_CONTRACT_AT: + case FutureType.ARTIFACT_CONTRACT_AT: + return true; + + default: + return false; + } +} + +export function isAddressResolvableFuture( + future: Future +): future is AddressResolvableFuture { + return ( + isContractFuture(future) || + future.type === FutureType.NAMED_STATIC_CALL || + future.type === FutureType.READ_EVENT_ARGUMENT + ); +} + export function getFutures(args: ArgumentType[]): Future[] { return args.flatMap(_getFutures); } diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index dc3350e68d..663ee879fc 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -13,22 +13,32 @@ import { ReadEventArgumentFutureImplementation, SendDataFutureImplementation, } from "./internal/module"; -import { isFuture } from "./internal/utils"; import { + Graph, + getNodesInTopologicalOrder, +} from "./internal/topological-order"; +import { + isAddressResolvableFuture, + isContractFuture, + isFuture, +} from "./internal/utils"; +import { + AddressResolvableFuture, + ArgumentType, ContractFuture, Future, FutureType, IgnitionModule, IgnitionModuleResult, - NamedStaticCallFuture, } from "./types/module"; import { - BaseSerializedFuture, FutureToken, ModuleToken, + SerializedArgumentType, SerializedArtifactContractAtFuture, SerializedArtifactContractDeploymentFuture, SerializedArtifactLibraryDeploymentFuture, + SerializedBigInt, SerializedFuture, SerializedLibraries, SerializedNamedContractAtFuture, @@ -38,21 +48,13 @@ import { SerializedNamedStaticCallFuture, SerializedReadEventArgumentFuture, SerializedSendDataFuture, - SerializedSolidityParamType, SerializedStoredDeployment, SerializedStoredModule, - SerializedStoredResults, StoredDeployment, } from "./types/serialized-deployment"; -export type PartialSerializedFuture = BaseSerializedFuture & { - module?: IgnitionModule>; - dependencies: FutureToken[]; - constructorArgs?: Array; -}; - /** - * Serialize/Deserialize a deployment to json. + * Serialize a deployment. * * @beta */ @@ -73,734 +75,628 @@ export class StoredDeploymentSerializer { }; } - public static deserialize( - serializedDeployment: SerializedStoredDeployment - ): StoredDeployment { - const partialFutures = - this._partialDeserializeAllFuturesFor(serializedDeployment); + private static _serializeModule( + userModule: IgnitionModule> + ): SerializedStoredModule { + return { + id: userModule.id, + futures: Object.fromEntries( + Array.from(userModule.futures).map((future) => [ + future.id, + this._serializeFuture(future), + ]) + ), + submodules: Array.from(userModule.submodules).map( + this._convertModuleToModuleToken + ), + results: Object.fromEntries( + Object.entries(userModule.results).map(([key, future]) => [ + key, + this._convertFutureToFutureToken(future), + ]) + ), + }; + } - const partialModules = Object.values(serializedDeployment.modules).map( - (sm) => this._deserializePartialModule(sm, partialFutures) - ); + private static _serializeFuture(future: Future): SerializedFuture { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + const serializedNamedContractDeploymentFuture: SerializedNamedContractDeploymentFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + constructorArgs: future.constructorArgs.map((arg) => + this._serializeArgument(arg) + ), + from: future.from, + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + value: future.value.toString(10), + }; + return serializedNamedContractDeploymentFuture; - this._rewireSubmoduleTokensToModulesFor( - partialModules, - serializedDeployment - ); + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + const serializedArtifactContractDeploymentFuture: SerializedArtifactContractDeploymentFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + artifact: future.artifact, + constructorArgs: future.constructorArgs.map((arg) => + this._serializeArgument(arg) + ), + from: future.from, + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + value: future.value.toString(10), + }; + return serializedArtifactContractDeploymentFuture; - this._recursivelyRewireFuturesToParentModule(partialModules); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + const serializedNamedLibraryDeploymentFuture: SerializedNamedLibraryDeploymentFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + from: future.from, + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + }; + return serializedNamedLibraryDeploymentFuture; - const startModule = partialModules.find( - (m) => m.id === serializedDeployment.startModule - ); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + const serializedArtifactLibraryDeploymentFuture: SerializedArtifactLibraryDeploymentFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + artifact: future.artifact, + from: future.from, + libraries: this._convertLibrariesToLibraryTokens(future.libraries), + }; + return serializedArtifactLibraryDeploymentFuture; - if (startModule === undefined) { - throw new Error( - "Failure during deserialization, could not find startModule" - ); + case FutureType.NAMED_CONTRACT_CALL: + const serializedNamedContractCallFuture: SerializedNamedContractCallFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contract: this._convertFutureToFutureToken(future.contract), + functionName: future.functionName, + args: future.args.map((arg) => this._serializeArgument(arg)), + value: future.value.toString(10), + from: future.from, + }; + return serializedNamedContractCallFuture; + + case FutureType.NAMED_STATIC_CALL: + const serializedNamedStaticCallFuture: SerializedNamedStaticCallFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contract: this._convertFutureToFutureToken(future.contract), + functionName: future.functionName, + args: future.args.map((arg) => this._serializeArgument(arg)), + from: future.from, + }; + return serializedNamedStaticCallFuture; + + case FutureType.NAMED_CONTRACT_AT: + const serializedNamedContractAtFuture: SerializedNamedContractAtFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + address: isFuture(future.address) + ? this._convertFutureToFutureToken(future.address) + : future.address, + }; + return serializedNamedContractAtFuture; + + case FutureType.ARTIFACT_CONTRACT_AT: + const serializedArtifactContractAtFuture: SerializedArtifactContractAtFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contractName: future.contractName, + artifact: future.artifact, + address: isFuture(future.address) + ? this._convertFutureToFutureToken(future.address) + : future.address, + }; + return serializedArtifactContractAtFuture; + + case FutureType.READ_EVENT_ARGUMENT: + const serializedReadEventArgumentFuture: SerializedReadEventArgumentFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + futureToReadFrom: this._convertFutureToFutureToken( + future.futureToReadFrom + ), + emitter: this._convertFutureToFutureToken(future.emitter), + eventName: future.eventName, + argumentName: future.argumentName, + eventIndex: future.eventIndex, + }; + return serializedReadEventArgumentFuture; + + case FutureType.SEND_DATA: + const serializedSendDataFuture: SerializedSendDataFuture = { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + to: isFuture(future.to) + ? this._convertFutureToFutureToken(future.to) + : future.to, + value: future.value.toString(10), + data: future.data, + from: future.from, + }; + return serializedSendDataFuture; } - return { - details: { - ...serializedDeployment.details, - }, - module: startModule, - }; + throw new IgnitionError( + // @ts-ignore At compile type this should be impossible + `Unknown future type while serializing: ${FutureType[future.type]}` + ); } - private static _rewireSubmoduleTokensToModulesFor( - partialModules: Array< - IgnitionModule> - >, - serializedDeployment: SerializedStoredDeployment - ): void { - for (const partialModule of partialModules) { - const serializedModule = serializedDeployment.modules[partialModule.id]; + private static _convertLibrariesToLibraryTokens( + libraries: Record> + ): SerializedLibraries { + return Object.fromEntries( + Object.entries(libraries).map(([key, lib]) => [ + key, + this._convertFutureToFutureToken(lib), + ]) + ); + } - const submodules = serializedModule.submodules.map((moduleToken) => { - const mod = partialModules.find((pm) => pm.id === moduleToken.moduleId); + private static _serializeArgument(arg: ArgumentType): SerializedArgumentType { + if (typeof arg === "bigint") { + return this._serializeBigint(arg); + } - if (mod === undefined) { - throw new Error("Deserialization error while looking up module"); - } + if (isFuture(arg)) { + return this._convertFutureToFutureToken(arg); + } - return mod; - }); + if (Array.isArray(arg)) { + return arg.map((a) => this._serializeArgument(a)); + } - this._overwriteReadonly(partialModule, "submodules", new Set(submodules)); + if (typeof arg === "object" && arg !== null) { + return Object.fromEntries( + Object.entries(arg).map(([k, v]) => [k, this._serializeArgument(v)]) + ); } + + return arg; } - /** - * Create a partial future object for every future token in every - * serialized module and submodule. - * - * By partial we mean that the future object will have a placeholder - * module that will be switched for the correct module object in - * a later phase. - * - * @param serializedFutures - the serialized version of the futures - * @returns partial futures, that will need further edits to - * become valid - */ - private static _partialDeserializeAllFuturesFor( - deployment: SerializedStoredDeployment - ): { [key: string]: Future } { - const allSerializedFutures = this._getAllFuturesFor(deployment); + private static _serializeBigint(n: bigint): SerializedBigInt { + return { _kind: "bigint", value: n.toString(10) }; + } - const partialFutures = allSerializedFutures.map( - this._deserializePartialFuture - ); + private static _convertFutureToFutureToken(future: Future): FutureToken { + return { + futureId: future.id, + _kind: "FutureToken", + }; + } - const serializedFutureLookup = Object.fromEntries( - allSerializedFutures.map((f) => [f.id, f]) - ); + private static _convertModuleToModuleToken( + m: IgnitionModule> + ): ModuleToken { + return { + moduleId: m.id, + _kind: "ModuleToken", + }; + } - const partialFutureLookup = Object.fromEntries( - partialFutures.map((f) => [f.id, f]) + private static _getModulesAndSubmoduleFor( + module: IgnitionModule> + ): Array>> { + return [module].concat( + Array.from(module.submodules).flatMap((sm) => + this._getModulesAndSubmoduleFor(sm) + ) ); + } +} - // update dependencies to be other future objects - for (const future of partialFutures) { - const serializedFuture = serializedFutureLookup[future.id]; +function lookup(lookupTable: Map, key: string): T { + const value = lookupTable.get(key); + + if (value === undefined) { + throw new Error(`Lookahead value ${key} missing`); + } - const dependencies = serializedFuture.dependencies - .map((sf) => partialFutureLookup[sf.futureId]) - .filter((x): x is Future => Boolean(x)); + return value; +} - dependencies.forEach((dep) => future.dependencies.add(dep)); +/** + * Deserialize a deployment that was previously serialized using StoredDeploymentSerialized. + * + * @beta + */ +export class StoredDeploymentDeserializer { + public static deserialize( + serializedDeployment: SerializedStoredDeployment + ): StoredDeployment { + const sortedModules = + this._getSerializedModulesInReverseTopologicalOrder(serializedDeployment); + + const modulesLookup: Map = new Map(); + for (const serializedModule of sortedModules) { + const mod = new IgnitionModuleImplementation(serializedModule.id, {}); + modulesLookup.set(mod.id, mod); + + for (const submoduleToken of serializedModule.submodules) { + const submodule = lookup(modulesLookup, submoduleToken.moduleId); + mod.submodules.add(submodule); + } } - // per future type, rewire other properties that could include references - for (const future of partialFutures) { - const serializedFuture = serializedFutureLookup[future.id]; - - if (future instanceof NamedContractDeploymentFutureImplementation) { - this._overwriteReadonly( - future, - "constructorArgs", - future.constructorArgs.map((arg) => - this._deserializeArg(arg, partialFutureLookup) - ) - ); + const sortedFutures = + this._getSerializedFuturesInReverseTopologicalOrder(serializedDeployment); + + const futuresLookup: Map = new Map(); + const contractFuturesLookup: Map< + string, + ContractFuture + > = new Map(); + const addressResolvableFutureLookup: Map = + new Map(); + + for (const serializedFuture of sortedFutures) { + const future = this._deserializeFuture( + serializedFuture, + modulesLookup, + futuresLookup, + contractFuturesLookup, + addressResolvableFutureLookup + ); - this._overwriteReadonly( - future, - "libraries", - this._deserializeLibraries( - (serializedFuture as SerializedNamedContractDeploymentFuture) - .libraries, - partialFutureLookup - ) - ); - } else if ( - future instanceof ArtifactContractDeploymentFutureImplementation - ) { - this._overwriteReadonly( - future, - "constructorArgs", - future.constructorArgs.map((arg) => - this._deserializeArg(arg, partialFutureLookup) - ) - ); + for (const dependencyId of serializedFuture.dependencies) { + const dependency = lookup(futuresLookup, dependencyId.futureId); + future.dependencies.add(dependency); + } - this._overwriteReadonly( - future, - "libraries", - this._deserializeLibraries( - (serializedFuture as SerializedArtifactContractDeploymentFuture) - .libraries, - partialFutureLookup - ) - ); - } else if (future instanceof NamedLibraryDeploymentFutureImplementation) { - this._overwriteReadonly( - future, - "libraries", - this._deserializeLibraries( - (serializedFuture as SerializedNamedLibraryDeploymentFuture) - .libraries, - partialFutureLookup - ) - ); - } else if ( - future instanceof ArtifactLibraryDeploymentFutureImplementation - ) { - this._overwriteReadonly( - future, - "libraries", - this._deserializeLibraries( - (serializedFuture as SerializedArtifactLibraryDeploymentFuture) - .libraries, - partialFutureLookup - ) - ); - } else if (future instanceof NamedContractCallFutureImplementation) { - this._overwriteReadonly( - future, - "args", - future.args.map((arg) => - this._deserializeArg(arg, partialFutureLookup) - ) - ); + future.module.futures.add(future); - this._overwriteReadonly( - future, - "contract", - partialFutureLookup[ - (serializedFuture as SerializedNamedContractCallFuture).contract - .futureId - ] as ContractFuture - ); - } else if (future instanceof NamedStaticCallFutureImplementation) { - this._overwriteReadonly( - future, - "args", - future.args.map((arg) => - this._deserializeArg(arg, partialFutureLookup) - ) - ); + futuresLookup.set(future.id, future); - this._overwriteReadonly( - future, - "contract", - partialFutureLookup[ - (serializedFuture as SerializedNamedContractCallFuture).contract - .futureId - ] as ContractFuture - ); - } else if (future instanceof NamedContractAtFutureImplementation) { - if (typeof future.address !== "string") { - this._overwriteReadonly( - future, - "address", - partialFutureLookup[ - ( - (serializedFuture as SerializedNamedContractAtFuture) - .address as unknown as FutureToken - ).futureId - ] as NamedStaticCallFuture - ); - } - } else if (future instanceof ArtifactContractAtFutureImplementation) { - if (typeof future.address !== "string") { - this._overwriteReadonly( - future, - "address", - partialFutureLookup[ - ( - (serializedFuture as SerializedArtifactContractAtFuture) - .address as unknown as FutureToken - ).futureId - ] as NamedStaticCallFuture - ); - } - } else if (future instanceof ReadEventArgumentFutureImplementation) { - this._overwriteReadonly( - future, - "futureToReadFrom", - partialFutureLookup[ - (serializedFuture as SerializedReadEventArgumentFuture) - .futureToReadFrom.futureId - ] as Future - ); + if (isContractFuture(future)) { + contractFuturesLookup.set(future.id, future); + } - this._overwriteReadonly( - future, - "emitter", - partialFutureLookup[ - (serializedFuture as SerializedReadEventArgumentFuture).emitter - .futureId - ] as ContractFuture - ); - } else { - throw new IgnitionError( - `unknown future type: ${FutureType[future.type]}` - ); + if (isAddressResolvableFuture(future)) { + addressResolvableFutureLookup.set(future.id, future); } } - return partialFutureLookup; - } - - private static _deserializePartialModule( - serializedModule: SerializedStoredModule, - allPartialFutures: { - [key: string]: Future; + for (const serializedModule of Object.values( + serializedDeployment.modules + )) { + for (const [name, futureToken] of Object.entries( + serializedModule.results + )) { + const mod = lookup(modulesLookup, serializedModule.id); + const contract = lookup(contractFuturesLookup, futureToken.futureId); + mod.results[name] = contract; + } } - ): IgnitionModule> { - const results = this._deserializeResultsFrom( - serializedModule.results, - allPartialFutures - ); - - const module = new IgnitionModuleImplementation( - serializedModule.id, - results as IgnitionModuleResult<""> - ); - const futures = [ - ...new Set(Object.values(serializedModule.futures).map(({ id }) => id)), - ].map((id) => allPartialFutures[id]); + return { + details: { + ...serializedDeployment.details, + }, + module: lookup(modulesLookup, serializedDeployment.startModule), + }; + } - this._overwriteReadonly(module, "futures", new Set(futures)); + private static _getSerializedModulesInReverseTopologicalOrder( + serializedDeployment: SerializedStoredDeployment + ): SerializedStoredModule[] { + const graph: Graph = new Map(); - return module; - } + for (const mod of Object.values(serializedDeployment.modules)) { + graph.set(mod, new Set()); + } - private static _recursivelyRewireFuturesToParentModule( - partialModules: Array< - IgnitionModule> - > - ): void { - for (const partialModule of partialModules) { - for (const future of partialModule.futures) { - future.module = partialModule; + for (const mod of Object.values(serializedDeployment.modules)) { + for (const submodToken of mod.submodules) { + const submod = serializedDeployment.modules[submodToken.moduleId]; + graph.get(submod)!.add(mod); } } + + return getNodesInTopologicalOrder(graph); } - private static _deserializeLibraries( - libraries: SerializedLibraries, - partialFutureLookup: { - [k: string]: Future; - } - ): Record> { - return Object.fromEntries( - Object.entries(libraries).map(([key, token]) => [ - key, - partialFutureLookup[token.futureId] as ContractFuture, - ]) + private static _getSerializedFuturesInReverseTopologicalOrder( + serializedDeployment: SerializedStoredDeployment + ): SerializedFuture[] { + const serializedFutures = this._getAllFuturesFor(serializedDeployment); + const serializedFuturesMap = Object.fromEntries( + serializedFutures.map((f) => [f.id, f]) ); - } - /** - * Oh you think you can defeat me typesystem. I don't acknowledge - * your _readonly_. - */ - private static _overwriteReadonly( - obj: O, - property: P, - value: V - ) { - obj[property] = value; - } + const graph: Graph = new Map(); - private static _serializeModule( - userModule: IgnitionModule> - ): SerializedStoredModule { - return { - id: userModule.id, - futures: Object.fromEntries( - Array.from(userModule.futures).map((future) => [ - future.id, - this._serializeFuture(future), - ]) - ), - submodules: Array.from(userModule.submodules).map( - this._convertModuleToModuleToken - ), - results: Object.fromEntries( - Object.entries(userModule.results).map(([key, future]) => [ - key, - this._convertFutureToFutureToken(future), - ]) - ), - }; + for (const serializedFuture of serializedFutures) { + graph.set(serializedFuture, new Set()); + } + + for (const serializedFuture of serializedFutures) { + for (const dependencyToken of serializedFuture.dependencies) { + const dependency = serializedFuturesMap[dependencyToken.futureId]; + graph.get(dependency)!.add(serializedFuture); + } + } + + return getNodesInTopologicalOrder(graph); } - private static _serializeFuture(future: Future): SerializedFuture { - const serialized: PartialSerializedFuture = { - ...future, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - }; + private static _deserializeArgument( + arg: SerializedArgumentType, + futureLookup: Map + ): ArgumentType { + if (this._isSerializedFutureToken(arg)) { + const swappedFuture = lookup(futureLookup, arg.futureId); - delete serialized.module; - - if (future instanceof NamedContractDeploymentFutureImplementation) { - const serializedNamedContract: SerializedNamedContractDeploymentFuture = { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - constructorArgs: future.constructorArgs.map((arg) => - StoredDeploymentSerializer._convertArgToFutureToken(arg) - ), - libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: future.value.toString(), - from: future.from, - }; - - return serializedNamedContract; - } else if ( - future instanceof ArtifactContractDeploymentFutureImplementation - ) { - const serializedArtifactContractDeploy: SerializedArtifactContractDeploymentFuture = - { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - constructorArgs: future.constructorArgs.map((arg) => - this._convertArgToFutureToken(arg) - ), - artifact: future.artifact, - libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: future.value.toString(), - from: future.from, - }; + if (swappedFuture === undefined) { + throw new IgnitionError( + `Unable to lookup future during deserialization: ${arg.futureId}` + ); + } - return serializedArtifactContractDeploy; - } else if (future instanceof NamedLibraryDeploymentFutureImplementation) { - const serializedNamedLibraryDeploy: SerializedNamedLibraryDeploymentFuture = - { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - libraries: - StoredDeploymentSerializer._convertLibrariesToLibraryTokens( - future.libraries - ), - from: future.from, - }; + if ( + swappedFuture.type === FutureType.NAMED_CONTRACT_CALL || + swappedFuture.type === FutureType.SEND_DATA + ) { + throw new IgnitionError( + `Invalid FutureType ${ + FutureType[swappedFuture.type] + } as serialized argument` + ); + } - return serializedNamedLibraryDeploy; - } else if ( - future instanceof ArtifactLibraryDeploymentFutureImplementation - ) { - const serializedArtifactLibraryDeploy: SerializedArtifactLibraryDeploymentFuture = - { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - artifact: future.artifact, - libraries: - StoredDeploymentSerializer._convertLibrariesToLibraryTokens( - future.libraries - ), - from: future.from, - }; + return swappedFuture; + } - return serializedArtifactLibraryDeploy; - } else if (future instanceof NamedContractCallFutureImplementation) { - const serializedNamedContractCall: SerializedNamedContractCallFuture = { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contract: this._convertFutureToFutureToken(future.contract), - functionName: future.functionName, - args: Array.from(future.args).map( - StoredDeploymentSerializer._convertArgToFutureToken - ), - value: future.value.toString(), - from: future.from, - }; - - return serializedNamedContractCall; - } else if (future instanceof NamedStaticCallFutureImplementation) { - const serializedNamedStaticCallFuture: SerializedNamedStaticCallFuture = { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contract: this._convertFutureToFutureToken(future.contract), - functionName: future.functionName, - args: Array.from(future.args).map( - StoredDeploymentSerializer._convertArgToFutureToken - ), - from: future.from, - }; - - return serializedNamedStaticCallFuture; - } else if (future instanceof NamedContractAtFutureImplementation) { - const serializedNamedContractAtFuture: SerializedNamedContractAtFuture = { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - address: - typeof future.address === "string" - ? future.address - : this._convertFutureToFutureToken(future.address), - }; - - return serializedNamedContractAtFuture; - } else if (future instanceof ArtifactContractAtFutureImplementation) { - const serializedArtifactContractAtFuture: SerializedArtifactContractAtFuture = - { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - contractName: future.contractName, - address: - typeof future.address === "string" - ? future.address - : this._convertFutureToFutureToken(future.address), - artifact: future.artifact, - }; + if (this._isSerializedBigInt(arg)) { + return this._deserializedBigint(arg); + } - return serializedArtifactContractAtFuture; - } else if (future instanceof ReadEventArgumentFutureImplementation) { - const serializedReadEventArgumentFuture: SerializedReadEventArgumentFuture = - { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - futureToReadFrom: this._convertFutureToFutureToken( - future.futureToReadFrom - ), - eventName: future.eventName, - argumentName: future.argumentName, - emitter: this._convertFutureToFutureToken(future.emitter), - eventIndex: future.eventIndex, - }; + if (Array.isArray(arg)) { + return arg.map((a) => this._deserializeArgument(a, futureLookup)); + } - return serializedReadEventArgumentFuture; - } else if (future instanceof SendDataFutureImplementation) { - const serializedSendDataFuture: SerializedSendDataFuture = { - id: future.id, - type: future.type, - dependencies: Array.from(future.dependencies).map( - StoredDeploymentSerializer._convertFutureToFutureToken - ), - to: - typeof future.to === "string" - ? future.to - : this._convertFutureToFutureToken(future.to), - value: future.value.toString(), - data: future.data, - from: future.from, - }; - - return serializedSendDataFuture; - } else { - throw new IgnitionError( - `Unknown future type while serializing: ${FutureType[future.type]}` + if (typeof arg === "object" && arg !== null) { + return Object.fromEntries( + Object.entries(arg).map(([k, v]) => [ + k, + this._deserializeArgument(v, futureLookup), + ]) ); } + + return arg; } - private static _convertLibrariesToLibraryTokens( - libraries: Record> - ): SerializedLibraries { - return Object.fromEntries( - Object.entries(libraries).map(([key, lib]) => [ - key, - this._convertFutureToFutureToken(lib), - ]) - ); + private static _deserializedBigint(n: SerializedBigInt): bigint { + return BigInt(n.value); } - private static _deserializeResultsFrom( - serializedResults: SerializedStoredResults, - futures: { [key: string]: Future } - ): IgnitionModuleResult<""> { - const results = Object.fromEntries( - Object.entries(serializedResults).map(([key, futureToken]) => [ - key, - futures[futureToken.futureId], - ]) + private static _isSerializedFutureToken( + arg: SerializedArgumentType + ): arg is FutureToken { + return ( + typeof arg === "object" && "_kind" in arg && arg._kind === "FutureToken" ); + } - return results as IgnitionModuleResult<"">; + private static _isSerializedBigInt( + arg: SerializedArgumentType + ): arg is SerializedBigInt { + return typeof arg === "object" && "_kind" in arg && arg._kind === "bigint"; } - private static _deserializePartialFuture( - serializedFuture: SerializedFuture - ): Future { - const placeholderModule = new IgnitionModuleImplementation( - "PLACEHOLDER", - {} + private static _getAllFuturesFor( + deployment: SerializedStoredDeployment + ): SerializedFuture[] { + return Object.values(deployment.modules).flatMap((m) => + Object.values(m.futures) ); + } + + private static _deserializeFuture( + serializedFuture: SerializedFuture, + modulesLookup: Map< + string, + IgnitionModuleImplementation> + >, + futuresLookup: Map, + contractFuturesLookup: Map>, + addressResolvableFutureLookup: Map + ): Future { + const mod = lookup(modulesLookup, serializedFuture.moduleId); switch (serializedFuture.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: return new NamedContractDeploymentFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, - serializedFuture.constructorArgs, - {}, + serializedFuture.constructorArgs.map((arg) => + this._deserializeArgument(arg, futuresLookup) + ), + Object.fromEntries( + Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + name, + lookup(contractFuturesLookup, lib.futureId), + ]) + ), BigInt(serializedFuture.value), serializedFuture.from ); case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: return new ArtifactContractDeploymentFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, - serializedFuture.constructorArgs, + serializedFuture.constructorArgs.map((arg) => + this._deserializeArgument(arg, futuresLookup) + ), serializedFuture.artifact, - {}, + Object.fromEntries( + Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + name, + lookup(contractFuturesLookup, lib.futureId), + ]) + ), BigInt(serializedFuture.value), serializedFuture.from ); case FutureType.NAMED_LIBRARY_DEPLOYMENT: return new NamedLibraryDeploymentFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, - {}, + Object.fromEntries( + Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + name, + lookup(contractFuturesLookup, lib.futureId), + ]) + ), serializedFuture.from ); case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: return new ArtifactLibraryDeploymentFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, serializedFuture.artifact, - {}, + Object.fromEntries( + Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + name, + lookup(contractFuturesLookup, lib.futureId), + ]) + ), serializedFuture.from ); case FutureType.NAMED_CONTRACT_CALL: return new NamedContractCallFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.functionName, - serializedFuture.contract as any, - serializedFuture.args, + lookup(contractFuturesLookup, serializedFuture.contract.futureId), + serializedFuture.args.map((arg) => + this._deserializeArgument(arg, futuresLookup) + ), BigInt(serializedFuture.value), serializedFuture.from ); case FutureType.NAMED_STATIC_CALL: return new NamedStaticCallFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.functionName, - serializedFuture.contract as any, - serializedFuture.args, + lookup(contractFuturesLookup, serializedFuture.contract.futureId), + serializedFuture.args.map((arg) => + this._deserializeArgument(arg, futuresLookup) + ), serializedFuture.from ); case FutureType.NAMED_CONTRACT_AT: return new NamedContractAtFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, - serializedFuture.address as any + this._isSerializedFutureToken(serializedFuture.address) + ? lookup( + addressResolvableFutureLookup, + serializedFuture.address.futureId + ) + : serializedFuture.address ); case FutureType.ARTIFACT_CONTRACT_AT: return new ArtifactContractAtFutureImplementation( serializedFuture.id, - placeholderModule, + mod, serializedFuture.contractName, - serializedFuture.address as any, + this._isSerializedFutureToken(serializedFuture.address) + ? lookup( + addressResolvableFutureLookup, + serializedFuture.address.futureId + ) + : serializedFuture.address, serializedFuture.artifact ); case FutureType.READ_EVENT_ARGUMENT: return new ReadEventArgumentFutureImplementation( serializedFuture.id, - placeholderModule, - serializedFuture.futureToReadFrom as any, + mod, + lookup(futuresLookup, serializedFuture.futureToReadFrom.futureId), serializedFuture.eventName, serializedFuture.argumentName, - serializedFuture.emitter as any, + lookup(contractFuturesLookup, serializedFuture.emitter.futureId), serializedFuture.eventIndex ); case FutureType.SEND_DATA: return new SendDataFutureImplementation( serializedFuture.id, - placeholderModule, - serializedFuture.to as any, + mod, + this._isSerializedFutureToken(serializedFuture.to) + ? lookup( + addressResolvableFutureLookup, + serializedFuture.to.futureId + ) + : serializedFuture.to, BigInt(serializedFuture.value), serializedFuture.data, serializedFuture.from ); } } - - private static _convertArgToFutureToken( - arg: number | string | Future - ): number | string | FutureToken { - if (!isFuture(arg)) { - return arg; - } - - return StoredDeploymentSerializer._convertFutureToFutureToken(arg); - } - - private static _convertFutureToFutureToken(future: Future): FutureToken { - return { - futureId: future.id, - _kind: "FutureToken", - }; - } - - private static _convertModuleToModuleToken( - m: IgnitionModule> - ): ModuleToken { - return { - moduleId: m.id, - _kind: "ModuleToken", - }; - } - - private static _deserializeArg( - arg: number | string | FutureToken, - futureLookup: { - [key: string]: Future; - } - ) { - if (!StoredDeploymentSerializer._isSerializedFutureToken(arg)) { - return arg; - } - - const swappedFuture = futureLookup[arg.futureId]; - - if (swappedFuture === undefined) { - throw new IgnitionError( - `Unable to lookup future during deserialization: ${arg.futureId}` - ); - } - - return swappedFuture; - } - - private static _isSerializedFutureToken( - arg: SerializedSolidityParamType - ): arg is FutureToken { - if (!Boolean(arg) || typeof arg === "string" || typeof arg === "number") { - return false; - } - - return arg._kind === "FutureToken"; - } - - private static _getModulesAndSubmoduleFor( - module: IgnitionModule> - ): Array>> { - return [module].concat( - Array.from(module.submodules).flatMap((sm) => - this._getModulesAndSubmoduleFor(sm) - ) - ); - } - - private static _getAllFuturesFor( - deployment: SerializedStoredDeployment - ): SerializedFuture[] { - return Object.values(deployment.modules).flatMap((m) => - Object.values(m.futures) - ); - } } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 1b8a95da7a..47bbe82faa 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -3,18 +3,36 @@ import { ArtifactType } from "../stubs"; import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; /** - * The serialized version of a Solidity method parameter. + * A serialized bigint. * * @beta */ -export type SerializedSolidityParamType = number | string | FutureToken; +export interface SerializedBigInt { + _kind: "bigint"; + value: string; +} + +/** + * The serialized version of BaseArgumentType + * + * @beta + */ +export type SerializedBaseArgumentType = + | number + | SerializedBigInt + | string + | boolean + | FutureToken; /** - * An array of serialized params. + * The serialized version of ArgumentType * * @beta */ -export type SerializedSolidityParamsType = SerializedSolidityParamType[]; +export type SerializedArgumentType = + | SerializedBaseArgumentType + | SerializedArgumentType[] + | { [field: string]: SerializedArgumentType }; /** * In serialized form a pointer to a future stored at the top level @@ -47,6 +65,7 @@ export interface BaseSerializedFuture { id: string; type: FutureType; dependencies: FutureToken[]; + moduleId: string; } /** @@ -58,7 +77,7 @@ export interface SerializedNamedContractDeploymentFuture extends BaseSerializedFuture { type: FutureType.NAMED_CONTRACT_DEPLOYMENT; contractName: string; - constructorArgs: SerializedSolidityParamsType; + constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; value: string; from: string | undefined; @@ -73,7 +92,7 @@ export interface SerializedArtifactContractDeploymentFuture extends BaseSerializedFuture { type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; contractName: string; - constructorArgs: SerializedSolidityParamsType; + constructorArgs: SerializedArgumentType[]; artifact: ArtifactType; libraries: SerializedLibraries; value: string; @@ -117,7 +136,7 @@ export interface SerializedNamedContractCallFuture type: FutureType.NAMED_CONTRACT_CALL; functionName: string; contract: FutureToken; - args: SerializedSolidityParamsType; + args: SerializedArgumentType[]; value: string; from: string | undefined; } @@ -131,7 +150,7 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { type: FutureType.NAMED_STATIC_CALL; functionName: string; contract: FutureToken; - args: SerializedSolidityParamsType; + args: SerializedArgumentType[]; from: string | undefined; } diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts index ee88d2d89b..a81da584d9 100644 --- a/packages/core/src/ui-helpers.ts +++ b/packages/core/src/ui-helpers.ts @@ -1,3 +1,6 @@ -export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; +export { + StoredDeploymentSerializer, + StoredDeploymentDeserializer, +} from "./new-api/stored-deployment-serializer"; export * from "./new-api/types/module"; export * from "./new-api/types/serialized-deployment"; From 4c349c8654c68815aa6b4416799a7eb6260ddfe5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:29:16 -0300 Subject: [PATCH 0393/1302] JSON.stringify serialized values in orders in our tests, as we compare the strings --- .../new-api/stored-deployment-serializer.ts | 37 +++++++++++++++---- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index c86764cc5e..1a803cb50f 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -1,6 +1,5 @@ import { assert } from "chai"; -import { StoredDeployment, StoredDeploymentSerializer } from "../../src/index"; import { defineModule } from "../../src/new-api/define-module"; import { ArtifactContractDeploymentFutureImplementation, @@ -9,11 +8,16 @@ import { NamedLibraryDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { + StoredDeploymentDeserializer, + StoredDeploymentSerializer, +} from "../../src/new-api/stored-deployment-serializer"; import { ContractFuture, IgnitionModule, IgnitionModuleResult, } from "../../src/new-api/types/module"; +import { StoredDeployment } from "../../src/new-api/types/serialized-deployment"; describe("stored deployment serializer", () => { const details = { @@ -551,9 +555,12 @@ describe("stored deployment serializer", () => { assertSerializableModuleIn(deployment); - const reserialized = StoredDeploymentSerializer.deserialize( + const reserialized = StoredDeploymentDeserializer.deserialize( JSON.parse( - JSON.stringify(StoredDeploymentSerializer.serialize(deployment)) + JSON.stringify( + StoredDeploymentSerializer.serialize(deployment), + sortedKeysJsonStringifyReplacer + ) ) ); @@ -567,13 +574,17 @@ describe("stored deployment serializer", () => { function assertSerializableModuleIn(deployment: StoredDeployment) { const serialized = JSON.stringify( - StoredDeploymentSerializer.serialize(deployment) + StoredDeploymentSerializer.serialize(deployment), + sortedKeysJsonStringifyReplacer, + 2 ); const reserialized = JSON.stringify( StoredDeploymentSerializer.serialize( - StoredDeploymentSerializer.deserialize(JSON.parse(serialized)) - ) + StoredDeploymentDeserializer.deserialize(JSON.parse(serialized)) + ), + sortedKeysJsonStringifyReplacer, + 2 ); assert.equal( @@ -584,7 +595,7 @@ function assertSerializableModuleIn(deployment: StoredDeployment) { // Invariants - const ignitionModule = StoredDeploymentSerializer.deserialize( + const ignitionModule = StoredDeploymentDeserializer.deserialize( JSON.parse(reserialized) ).module; @@ -688,3 +699,15 @@ function allFuturesHaveModuleIn( allFuturesHaveModuleIn(submodule) ); } + +function sortedKeysJsonStringifyReplacer(_key: string, value: any) { + if (!(value instanceof Object) || Array.isArray(value)) { + return value; + } + const sorted = {} as any; + for (const key of Object.keys(value).sort()) { + sorted[key] = value[key]; + } + + return sorted; +} From 376c543790ba27d0ab13d3c002140c3f1eb73356 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:29:43 -0300 Subject: [PATCH 0394/1302] Update UI --- packages/ui/src/main.tsx | 6 ++-- .../components/future-summary.tsx | 28 ++++++++++++++++--- packages/ui/src/utils/guards.ts | 9 ++++++ 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index 9346946fcd..96668463cd 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -1,7 +1,7 @@ import React from "react"; import type { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import { StoredDeploymentSerializer } from "@ignored/ignition-core/ui-helpers"; +import { StoredDeploymentDeserializer } from "@ignored/ignition-core/ui-helpers"; import ReactDOM from "react-dom/client"; import { RouterProvider, createHashRouter } from "react-router-dom"; import { FutureDetails } from "./pages/future-details/future-details"; @@ -20,13 +20,13 @@ const loadDeploymentFromEmbeddedDiv = (): StoredDeployment | null => { return null; } - return StoredDeploymentSerializer.deserialize(data); + return StoredDeploymentDeserializer.deserialize(data); }; const loadDeploymentFromDevFile = async () => { const response = await fetch("./deployment.json"); const data = await response.json(); - return StoredDeploymentSerializer.deserialize(data); + return StoredDeploymentDeserializer.deserialize(data); }; const loadDeploymentData = () => { diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index 8881c3c881..a26cfb1b19 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -1,10 +1,12 @@ import { + ArgumentType, Future, FutureType, StoredDeployment, } from "@ignored/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; import { SummaryHeader } from "../../../components/summary-header"; +import { isFuture } from "../../../utils/guards"; export const FutureSummary: React.FC<{ deployment: StoredDeployment; @@ -61,6 +63,24 @@ function resolveTitleFor(future: Future): string { } } +function argumentTypeToString(argument: ArgumentType): string { + return JSON.stringify( + argument, + (_key, value) => { + if (typeof value === "bigint") { + return ``; + } + + if (isFuture(value)) { + return ``; + } + + return value; + }, + 2 + ); +} + const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: @@ -71,7 +91,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
      {Object.entries(future.constructorArgs).map(([key, value]) => (
    • - {key} - {value} + {key} - {argumentTypeToString(value)}
    • ))}
    @@ -85,7 +105,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
      {Object.entries(future.constructorArgs).map(([key, value]) => (
    • - {key} - {value} + {key} - {argumentTypeToString(value)}
    • ))}
    @@ -111,7 +131,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {

    Args

      {Object.entries(future.args).map(([, value]) => ( -
    • {value}
    • +
    • {argumentTypeToString(value)}
    • ))}
    @@ -124,7 +144,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {

    Args

      {Object.entries(future.args).map(([, value]) => ( -
    • {value}
    • +
    • {argumentTypeToString(value)}
    • ))}
    diff --git a/packages/ui/src/utils/guards.ts b/packages/ui/src/utils/guards.ts index 68ab03e899..340c0b6f5b 100644 --- a/packages/ui/src/utils/guards.ts +++ b/packages/ui/src/utils/guards.ts @@ -5,6 +5,15 @@ import { FunctionCallFuture, } from "@ignored/ignition-core/ui-helpers"; +export function isFuture(potential: unknown): potential is Future { + return ( + potential instanceof Object && + "type" in potential && + typeof potential.type === "number" && + FutureType[potential.type] !== undefined + ); +} + export function isDeploymentFuture(f: Future): f is DeploymentFuture { const deployFutureTypeIds = [ FutureType.NAMED_CONTRACT_DEPLOYMENT, From bd09b0d52c27ab6ea69748fa77e49caa22f96161 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:40:53 -0300 Subject: [PATCH 0395/1302] Rename the old Artifact to ArtifactOld --- .../core/src/internal/dsl/DeploymentBuilder.ts | 14 +++++++------- .../convertDeploymentVertexToExecutionVertex.ts | 6 +++--- .../core/src/internal/services/ArtifactsService.ts | 6 +++--- packages/core/src/internal/types/deployment.ts | 4 ++-- .../core/src/internal/types/deploymentGraph.ts | 8 ++++---- packages/core/src/internal/types/executionGraph.ts | 6 +++--- packages/core/src/internal/types/services.ts | 6 +++--- .../src/internal/utils/collectLibrariesAndLink.ts | 6 +++--- packages/core/src/internal/utils/guards.ts | 4 ++-- packages/core/src/types/dsl.ts | 8 ++++---- packages/core/src/types/future.ts | 6 +++--- packages/core/src/types/hardhat.ts | 4 ++-- packages/core/src/types/providers.ts | 6 +++--- packages/core/test/deploymentBuilder/deploy.ts | 4 ++-- packages/core/test/deploymentBuilder/value.ts | 4 ++-- packages/core/test/execution/dispatch.ts | 8 ++++---- packages/core/test/execution/rerun.ts | 4 ++-- packages/core/test/helpers.ts | 6 +++--- packages/core/test/helpers/getMockProviders.ts | 6 +++--- packages/core/test/helpers/getMockServices.ts | 6 +++--- packages/core/test/options.ts | 4 ++-- packages/core/test/validation.ts | 4 ++-- 22 files changed, 65 insertions(+), 65 deletions(-) diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts index e231990733..4d632e3bdf 100644 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ b/packages/core/src/internal/dsl/DeploymentBuilder.ts @@ -20,7 +20,7 @@ import type { StaticContractCall, Virtual, } from "../../types/future"; -import type { Artifact } from "../../types/hardhat"; +import type { ArtifactOld } from "../../types/hardhat"; import type { Module, ModuleDict } from "../../types/module"; import { BigNumber, ethers } from "ethers"; @@ -69,7 +69,7 @@ import { DeploymentGraph } from "./DeploymentGraph"; import { ScopeStack } from "./ScopeStack"; interface ArtifactMap { - [contractName: string]: Artifact; + [contractName: string]: ArtifactOld; } /** @@ -154,12 +154,12 @@ export class DeploymentBuilder implements IDeploymentBuilder { ): HardhatLibrary; public library( libraryName: string, - artifact: Artifact, + artifact: ArtifactOld, options?: ContractOptionsOld ): ArtifactLibrary; public library( libraryName: string, - artifactOrOptions?: ContractOptionsOld | Artifact, + artifactOrOptions?: ContractOptionsOld | ArtifactOld, givenOptions?: ContractOptionsOld ): HardhatLibrary | ArtifactLibrary { if (isArtifact(artifactOrOptions)) { @@ -220,12 +220,12 @@ export class DeploymentBuilder implements IDeploymentBuilder { ): HardhatContract; public contract( contractName: string, - artifact: Artifact, + artifact: ArtifactOld, options?: ContractOptionsOld ): ArtifactContract; public contract( contractName: string, - artifactOrOptions?: Artifact | ContractOptionsOld, + artifactOrOptions?: ArtifactOld | ContractOptionsOld, givenOptions?: ContractOptionsOld ): HardhatContract | ArtifactContract { if (isArtifact(artifactOrOptions)) { @@ -579,7 +579,7 @@ export class DeploymentBuilder implements IDeploymentBuilder { return paramFuture; } - public getArtifact(contractName: string): Artifact { + public getArtifact(contractName: string): ArtifactOld { const artifact = this.artifactMap[contractName]; if (artifact === undefined) { diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts index 4228b2174e..b2b59e7aab 100644 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts @@ -3,7 +3,7 @@ import { BigNumber, ethers } from "ethers"; import { IgnitionError } from "../../../errors"; import { ExternalParamValue, InternalParamValue } from "../../../types/dsl"; import { DeploymentGraphFuture } from "../../../types/future"; -import { Artifact } from "../../../types/hardhat"; +import { ArtifactOld } from "../../../types/hardhat"; import { ArtifactContractDeploymentVertex, ArtifactLibraryDeploymentVertex, @@ -82,7 +82,7 @@ async function convertHardhatContractToContractDeploy( vertex: HardhatContractDeploymentVertex, transformContext: TransformContext ): Promise { - const artifact: Artifact = + const artifact: ArtifactOld = await transformContext.services.artifacts.getArtifact(vertex.contractName); const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); @@ -181,7 +181,7 @@ async function convertHardhatLibraryToLibraryDeploy( vertex: HardhatLibraryDeploymentVertex, transformContext: TransformContext ): Promise { - const artifact: Artifact = + const artifact: ArtifactOld = await transformContext.services.artifacts.getArtifact(vertex.libraryName); const signer: ethers.Signer = await transformContext.services.accounts.getSigner(vertex.from); diff --git a/packages/core/src/internal/services/ArtifactsService.ts b/packages/core/src/internal/services/ArtifactsService.ts index 86d3403d34..e72c6e92d0 100644 --- a/packages/core/src/internal/services/ArtifactsService.ts +++ b/packages/core/src/internal/services/ArtifactsService.ts @@ -1,11 +1,11 @@ -import type { Artifact } from "../../types/hardhat"; +import type { ArtifactOld } from "../../types/hardhat"; import type { Providers } from "../../types/providers"; import type { IArtifactsService } from "../types/services"; export class ArtifactsService implements IArtifactsService { constructor(private readonly _providers: Providers) {} - public getArtifact(name: string): Promise { + public getArtifact(name: string): Promise { return this._providers.artifacts.getArtifact(name); } @@ -13,7 +13,7 @@ export class ArtifactsService implements IArtifactsService { return this._providers.artifacts.hasArtifact(name); } - public getAllArtifacts(): Promise { + public getAllArtifacts(): Promise { return this._providers.artifacts.getAllArtifacts(); } } diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts index 6b89cfab73..c7ea3135fb 100644 --- a/packages/core/src/internal/types/deployment.ts +++ b/packages/core/src/internal/types/deployment.ts @@ -15,7 +15,7 @@ import type { Services } from "./services"; import { BigNumber } from "ethers"; -import { Artifact } from "../../types/hardhat"; +import { ArtifactOld } from "../../types/hardhat"; /** * An UI update function that will be invoked on each internal change with the @@ -268,7 +268,7 @@ export interface DeployNetworkConfig { chainId: number; networkName: string; accounts: string[]; - artifacts: Artifact[]; + artifacts: ArtifactOld[]; force: boolean; } diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts index 0a36835fbc..5fe005fbd6 100644 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ b/packages/core/src/internal/types/deploymentGraph.ts @@ -11,7 +11,7 @@ import { ParameterFuture, Virtual, } from "../../types/future"; -import { Artifact } from "../../types/hardhat"; +import { ArtifactOld } from "../../types/hardhat"; import { AdjacencyList, VertexDescriptor } from "./graph"; @@ -92,7 +92,7 @@ export interface HardhatContractDeploymentVertex extends VertexDescriptor { export interface ArtifactContractDeploymentVertex extends VertexDescriptor { type: "ArtifactContract"; scopeAdded: string; - artifact: Artifact; + artifact: ArtifactOld; args: InternalParamValue[]; libraries: LibraryMap; after: DeploymentGraphFuture[]; @@ -136,7 +136,7 @@ export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { type: "ArtifactLibrary"; scopeAdded: string; - artifact: Artifact; + artifact: ArtifactOld; args: InternalParamValue[]; after: DeploymentGraphFuture[]; from: string; @@ -221,7 +221,7 @@ export interface SendVertex extends VertexDescriptor { export interface DeploymentBuilderOptions { chainId: number; accounts: string[]; - artifacts: Artifact[]; + artifacts: ArtifactOld[]; } export interface CallPoints { diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts index b1a1de1bb6..02eb836975 100644 --- a/packages/core/src/internal/types/executionGraph.ts +++ b/packages/core/src/internal/types/executionGraph.ts @@ -7,7 +7,7 @@ import { EventParamFuture, HardhatContract, } from "../../types/future"; -import { Artifact } from "../../types/hardhat"; +import { ArtifactOld } from "../../types/hardhat"; import { LibraryMap } from "./deploymentGraph"; import { @@ -92,7 +92,7 @@ export type ExecutionVertex = */ export interface ContractDeployExecutionVertex extends VertexDescriptor { type: "ContractDeploy"; - artifact: Artifact; + artifact: ArtifactOld; args: ArgValue[]; libraries: LibraryMap; value: BigNumber; @@ -118,7 +118,7 @@ export interface DeployedContractExecutionVertex extends VertexDescriptor { */ export interface LibraryDeployExecutionVertex extends VertexDescriptor { type: "LibraryDeploy"; - artifact: Artifact; + artifact: ArtifactOld; args: ArgValue[]; signer: ethers.Signer; } diff --git a/packages/core/src/internal/types/services.ts b/packages/core/src/internal/types/services.ts index 71ba9464df..36c614ce67 100644 --- a/packages/core/src/internal/types/services.ts +++ b/packages/core/src/internal/types/services.ts @@ -1,4 +1,4 @@ -import type { Artifact } from "../../types/hardhat"; +import type { ArtifactOld } from "../../types/hardhat"; import type { GasProvider, HasParamResult, @@ -25,9 +25,9 @@ export interface IAccountsService { * @internal */ export interface IArtifactsService { - getArtifact(name: string): Promise; + getArtifact(name: string): Promise; hasArtifact(name: string): Promise; - getAllArtifacts(): Promise; + getAllArtifacts(): Promise; } /** diff --git a/packages/core/src/internal/utils/collectLibrariesAndLink.ts b/packages/core/src/internal/utils/collectLibrariesAndLink.ts index 1991ca27f6..e902a3d394 100644 --- a/packages/core/src/internal/utils/collectLibrariesAndLink.ts +++ b/packages/core/src/internal/utils/collectLibrariesAndLink.ts @@ -1,6 +1,6 @@ // eslint-disable-next-line import/no-extraneous-dependencies import { IgnitionError } from "../../errors"; -import { Artifact } from "../../types/hardhat"; +import { ArtifactOld } from "../../types/hardhat"; interface Link { sourceName: string; @@ -13,7 +13,7 @@ interface Libraries { } export async function collectLibrariesAndLink( - artifact: Artifact, + artifact: ArtifactOld, libraries: Libraries ) { const { utils } = await import("ethers"); @@ -117,7 +117,7 @@ Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hard return linkBytecode(artifact, [...linksToApply.values()]); } -function linkBytecode(artifact: Artifact, libraries: Link[]): string { +function linkBytecode(artifact: ArtifactOld, libraries: Link[]): string { let bytecode = artifact.bytecode; for (const { sourceName, libraryName, address } of libraries) { diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 2f19b55e99..56df474d6f 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -22,10 +22,10 @@ import type { } from "../types/deploymentGraph"; import { IgnitionError } from "../../errors"; -import { Artifact } from "../../types/hardhat"; +import { ArtifactOld } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; -export function isArtifact(artifact: any): artifact is Artifact { +export function isArtifact(artifact: any): artifact is ArtifactOld { return ( artifact !== null && artifact !== undefined && diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts index d3e9083201..3a287f7ce7 100644 --- a/packages/core/src/types/dsl.ts +++ b/packages/core/src/types/dsl.ts @@ -19,7 +19,7 @@ import { StaticContractCall, Virtual, } from "./future"; -import { Artifact } from "./hardhat"; +import { ArtifactOld } from "./hardhat"; import { Module, ModuleDict } from "./module"; /** @@ -96,7 +96,7 @@ export interface IDeploymentBuilder { */ contract( contractName: string, - artifact: Artifact, + artifact: ArtifactOld, options?: ContractOptionsOld ): ArtifactContract; @@ -144,7 +144,7 @@ export interface IDeploymentBuilder { * the artifact for * @returns The artifact for the contract or library */ - getArtifact(contractName: string): Artifact; + getArtifact(contractName: string): ArtifactOld; /** * Get the value of a named parameter that _can_ be passed into the currently @@ -192,7 +192,7 @@ export interface IDeploymentBuilder { */ library( libraryName: string, - artifact: Artifact, + artifact: ArtifactOld, options?: ContractOptionsOld ): ArtifactLibrary; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts index 92d8a5d645..ae855d47b7 100644 --- a/packages/core/src/types/future.ts +++ b/packages/core/src/types/future.ts @@ -1,4 +1,4 @@ -import type { Artifact } from "./hardhat"; +import type { ArtifactOld } from "./hardhat"; /** * A future representing the address of a contract deployed using the @@ -26,7 +26,7 @@ export interface ArtifactContract { label: string; type: "contract"; subtype: "artifact"; - artifact: Artifact; + artifact: ArtifactOld; _future: true; } @@ -71,7 +71,7 @@ export interface ArtifactLibrary { label: string; type: "library"; subtype: "artifact"; - artifact: Artifact; + artifact: ArtifactOld; _future: true; } diff --git a/packages/core/src/types/hardhat.ts b/packages/core/src/types/hardhat.ts index 0629007b64..0d6aae468c 100644 --- a/packages/core/src/types/hardhat.ts +++ b/packages/core/src/types/hardhat.ts @@ -1,9 +1,9 @@ /** - * The key data for interacting with an Ethereum smart contract on-chain. + * An compilation artifact representing a smart contract. * * @alpha */ -export interface Artifact { +export interface ArtifactOld { contractName: string; bytecode: string; abi: any[]; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts index 56be5bd63e..33d0df40ac 100644 --- a/packages/core/src/types/providers.ts +++ b/packages/core/src/types/providers.ts @@ -1,5 +1,5 @@ import type { ExternalParamValue } from "../types/dsl"; -import type { Artifact } from "./hardhat"; +import type { ArtifactOld } from "./hardhat"; import { ethers } from "ethers"; @@ -26,9 +26,9 @@ export interface Providers { * @alpha */ export interface ArtifactsProvider { - getArtifact: (name: string) => Promise; + getArtifact: (name: string) => Promise; hasArtifact: (name: string) => Promise; - getAllArtifacts: () => Promise; + getAllArtifacts: () => Promise; } /** diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts index 7a3cd04a32..1ce0f30581 100644 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ b/packages/core/test/deploymentBuilder/deploy.ts @@ -12,7 +12,7 @@ import { } from "../../src/internal/utils/guards"; import { isFailure } from "../../src/internal/utils/process-results"; import { IDeploymentBuilder } from "../../src/types/dsl"; -import { Artifact } from "../../src/types/hardhat"; +import { ArtifactOld } from "../../src/types/hardhat"; import { getDependenciesForVertex, @@ -413,7 +413,7 @@ describe("deployment builder - deploy", function () { let deploymentGraph: IDeploymentGraph; before(() => { - const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + const artifact = { abi: [], bytecode: "xxx" } as any as ArtifactOld; const fromArtifactModule = buildModule( "FromArtifact", diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts index e504244971..b835840917 100644 --- a/packages/core/test/deploymentBuilder/value.ts +++ b/packages/core/test/deploymentBuilder/value.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import type { Artifact } from "../../src/types/hardhat"; +import type { ArtifactOld } from "../../src/types/hardhat"; import { assert } from "chai"; import { ethers } from "ethers"; @@ -21,7 +21,7 @@ describe("deployment builder - value", () => { let deploymentGraph: IDeploymentGraph; before(() => { - const artifact = { abi: [], bytecode: "xxx" } as any as Artifact; + const artifact = { abi: [], bytecode: "xxx" } as any as ArtifactOld; const callModule = buildModule("call", (m: IDeploymentBuilder) => { const token = m.contract("Token"); diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts index fa0d576e76..fa417625c5 100644 --- a/packages/core/test/execution/dispatch.ts +++ b/packages/core/test/execution/dispatch.ts @@ -16,7 +16,7 @@ import { Services, TransactionOptions, } from "../../src/internal/types/services"; -import { Artifact } from "../../src/types/hardhat"; +import { ArtifactOld } from "../../src/types/hardhat"; import { buildAdjacencyListFrom } from "../graph/helpers"; import { getMockServices } from "../helpers"; @@ -28,7 +28,7 @@ describe("Execution - dispatch", () => { }); it("should execute a contract deploy", async () => { - const fakeArtifact: Artifact = { + const fakeArtifact: ArtifactOld = { contractName: "Foo", abi: [], bytecode: @@ -94,7 +94,7 @@ describe("Execution - dispatch", () => { }); it("should execute a library deploy", async () => { - const fakeArtifact: Artifact = { + const fakeArtifact: ArtifactOld = { contractName: "Foo", abi: [], bytecode: @@ -156,7 +156,7 @@ describe("Execution - dispatch", () => { }); it("should execute a contract call", async () => { - const fakeArtifact: Artifact = { + const fakeArtifact: ArtifactOld = { contractName: "Foo", abi: [ { diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts index c43b3cd049..56e845e3cf 100644 --- a/packages/core/test/execution/rerun.ts +++ b/packages/core/test/execution/rerun.ts @@ -8,14 +8,14 @@ import { IgnitionError } from "../../src/errors"; import { IgnitionImplementation } from "../../src/internal/Ignition"; import { TransactionsService } from "../../src/internal/services/TransactionsService"; import { DeploymentResultState } from "../../src/internal/types/deployment"; -import { Artifact } from "../../src/types/hardhat"; +import { ArtifactOld } from "../../src/types/hardhat"; import { Providers } from "../../src/types/providers"; import { getMockServices } from "../helpers"; import { setupIgnitionWith } from "../helpers/setupIgnitionWith"; import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; describe("Rerunning execution", () => { - const tokenArtifact: Artifact = { + const tokenArtifact: ArtifactOld = { contractName: "Token", abi: [ { diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 06db494eae..5d8758c28d 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -11,7 +11,7 @@ import { IArtifactsService, IAccountsService, } from "../src/internal/types/services"; -import { Artifact } from "../src/types/hardhat"; +import { ArtifactOld } from "../src/types/hardhat"; import { HasParamResult } from "../src/types/providers"; export function getMockServices() { @@ -55,11 +55,11 @@ class MockArtifactsService implements IArtifactsService { return true; } - public getArtifact(_name: string): Promise { + public getArtifact(_name: string): Promise { throw new IgnitionError("Method not implemented."); } - public getAllArtifacts(): Promise { + public getAllArtifacts(): Promise { throw new IgnitionError("Method not implemented"); } } diff --git a/packages/core/test/helpers/getMockProviders.ts b/packages/core/test/helpers/getMockProviders.ts index f7b0bca5a7..5777e1017f 100644 --- a/packages/core/test/helpers/getMockProviders.ts +++ b/packages/core/test/helpers/getMockProviders.ts @@ -2,7 +2,7 @@ import { ethers } from "ethers"; import { IgnitionError } from "../../src/errors"; import { ExternalParamValue } from "../../src/types/dsl"; -import { Artifact } from "../../src/types/hardhat"; +import { ArtifactOld } from "../../src/types/hardhat"; import { ModuleParams } from "../../src/types/module"; import { AccountsProvider, @@ -29,10 +29,10 @@ export function getMockProviders(): Providers { } class MockArtifactsProvider implements ArtifactsProvider { - public async getArtifact(_name: string): Promise { + public async getArtifact(_name: string): Promise { throw new IgnitionError("Method not implemented."); } - public async getAllArtifacts(): Promise { + public async getAllArtifacts(): Promise { throw new IgnitionError("Method not implemented."); } public async hasArtifact(_name: string): Promise { diff --git a/packages/core/test/helpers/getMockServices.ts b/packages/core/test/helpers/getMockServices.ts index 38a423ed90..e34e0fdf00 100644 --- a/packages/core/test/helpers/getMockServices.ts +++ b/packages/core/test/helpers/getMockServices.ts @@ -11,7 +11,7 @@ import { Services, TransactionOptions, } from "../../src/internal/types/services"; -import { Artifact } from "../../src/types/hardhat"; +import { ArtifactOld } from "../../src/types/hardhat"; import { HasParamResult } from "../../src/types/providers"; export function getMockServices() { @@ -51,7 +51,7 @@ class MockContractsService implements IContractsService { } class MockArtifactsService implements IArtifactsService { - public getAllArtifacts(): Promise { + public getAllArtifacts(): Promise { throw new Error("Method not implemented."); } @@ -59,7 +59,7 @@ class MockArtifactsService implements IArtifactsService { return true; } - public getArtifact(_name: string): Promise { + public getArtifact(_name: string): Promise { throw new IgnitionError("Method not implemented."); } } diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts index 3ff715440c..947d7e5518 100644 --- a/packages/core/test/options.ts +++ b/packages/core/test/options.ts @@ -8,13 +8,13 @@ import { DeploymentResult, DeploymentResultState, } from "../src/internal/types/deployment"; -import { Artifact } from "../src/types/hardhat"; +import { ArtifactOld } from "../src/types/hardhat"; import { getMockServices } from "./helpers"; import { setupIgnitionWith } from "./helpers/setupIgnitionWith"; describe("deploy options", () => { - const tokenArtifact: Artifact = { + const tokenArtifact: ArtifactOld = { contractName: "Token", abi: [ { diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts index b5eee20e35..56f12ab010 100644 --- a/packages/core/test/validation.ts +++ b/packages/core/test/validation.ts @@ -12,14 +12,14 @@ import { isFailure } from "../src/internal/utils/process-results"; import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; import { IDeploymentBuilder } from "../src/types/dsl"; import { ArtifactContract } from "../src/types/future"; -import { Artifact } from "../src/types/hardhat"; +import { ArtifactOld } from "../src/types/hardhat"; import { Module, ModuleDict } from "../src/types/module"; import { ProcessResultKind, ProcessStepResult } from "../src/types/process"; import { getMockServices } from "./helpers"; describe("Validation", () => { - const exampleArtifact: Artifact = { + const exampleArtifact: ArtifactOld = { contractName: "Example", abi: [], bytecode: "0x0", From 038c3177651dc0c95129368a0a1a95c6fa86bec5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:41:03 -0300 Subject: [PATCH 0396/1302] Remove the ArtifactType stub --- packages/core/src/index.ts | 3 +-- .../core/src/new-api/internal/module-builder.ts | 8 ++++---- packages/core/src/new-api/internal/module.ts | 8 ++++---- packages/core/src/new-api/stubs.ts | 6 ------ packages/core/src/new-api/types/artifact.ts | 14 ++++++++++++++ packages/core/src/new-api/types/module-builder.ts | 9 ++++----- packages/core/src/new-api/types/module.ts | 8 ++++---- .../src/new-api/types/serialized-deployment.ts | 9 ++++----- .../test/new-api/stored-deployment-serializer.ts | 8 ++++---- 9 files changed, 39 insertions(+), 34 deletions(-) delete mode 100644 packages/core/src/new-api/stubs.ts create mode 100644 packages/core/src/new-api/types/artifact.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index cdc20869ec..8b5c55f5f6 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,8 +5,7 @@ export { defineModule } from "./new-api/define-module"; /* TODO: how is module constructor getting exposed? */ export { ModuleConstructor } from "./new-api/internal/module-builder"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; -/* TODO: move out and concretize these stubs */ -export { ArtifactType } from "./new-api/stubs"; +export * from "./new-api/types/artifact"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 8f570b49fc..31fa08e2e9 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -2,7 +2,7 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; -import { ArtifactType } from "../stubs"; +import { Artifact } from "../types/artifact"; import { AddressResolvableFuture, ArgumentType, @@ -180,7 +180,7 @@ export class IgnitionModuleBuilderImplementation< public contractFromArtifact( contractName: string, - artifact: ArtifactType, + artifact: Artifact, args: ArgumentType[] = [], options: ContractFromArtifactOptions = {} ): ArtifactContractDeploymentFuture { @@ -252,7 +252,7 @@ export class IgnitionModuleBuilderImplementation< public libraryFromArtifact( libraryName: string, - artifact: ArtifactType, + artifact: Artifact, options: LibraryFromArtifactOptions = {} ): ArtifactLibraryDeploymentFuture { const id = options.id ?? libraryName; @@ -388,7 +388,7 @@ export class IgnitionModuleBuilderImplementation< public contractAtFromArtifact( contractName: string, address: string | NamedStaticCallFuture, - artifact: ArtifactType, + artifact: Artifact, options: ContractAtOptions = {} ): ArtifactContractAtFuture { const id = options.id ?? contractName; diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 7d734fc53e..9d56a5e101 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,4 +1,4 @@ -import { ArtifactType } from "../stubs"; +import { Artifact } from "../types/artifact"; import { AddressResolvableFuture, ArgumentType, @@ -77,7 +77,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, public readonly constructorArgs: ArgumentType[], - public readonly artifact: ArtifactType, + public readonly artifact: Artifact, public readonly libraries: Record>, public readonly value: bigint, public readonly from: string | undefined @@ -113,7 +113,7 @@ export class ArtifactLibraryDeploymentFutureImplementation< public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: LibraryNameT, - public readonly artifact: ArtifactType, + public readonly artifact: Artifact, public readonly libraries: Record>, public readonly from: string | undefined ) { @@ -183,7 +183,7 @@ export class ArtifactContractAtFutureImplementation public readonly module: IgnitionModuleImplementation, public readonly contractName: string, public readonly address: string | AddressResolvableFuture, - public readonly artifact: ArtifactType + public readonly artifact: Artifact ) { super(id, FutureType.ARTIFACT_CONTRACT_AT, module); } diff --git a/packages/core/src/new-api/stubs.ts b/packages/core/src/new-api/stubs.ts deleted file mode 100644 index a5efeecc51..0000000000 --- a/packages/core/src/new-api/stubs.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * The artifact of a contract compilation. - * - * @beta - */ -export type ArtifactType = any[]; diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts new file mode 100644 index 0000000000..2b5287ec7b --- /dev/null +++ b/packages/core/src/new-api/types/artifact.ts @@ -0,0 +1,14 @@ +/** + * An compilation artifact representing a smart contract. + * + * @beta + */ +export interface Artifact { + contractName: string; + bytecode: string; + abi: any[]; + linkReferences: Record< + string, + Record> + >; +} diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index b7309a8723..16aed30efb 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,5 +1,4 @@ -import { ArtifactType } from "../stubs"; - +import { Artifact } from "./artifact"; import { AddressResolvableFuture, ArgumentType, @@ -168,7 +167,7 @@ export interface IgnitionModuleBuilder { contractFromArtifact( contractName: string, - artifact: ArtifactType, + artifact: Artifact, args?: ArgumentType[], options?: ContractFromArtifactOptions ): ArtifactContractDeploymentFuture; @@ -180,7 +179,7 @@ export interface IgnitionModuleBuilder { libraryFromArtifact( libraryName: string, - artifact: ArtifactType, + artifact: Artifact, options?: LibraryFromArtifactOptions ): ArtifactLibraryDeploymentFuture; @@ -207,7 +206,7 @@ export interface IgnitionModuleBuilder { contractAtFromArtifact( contractName: string, address: string | NamedStaticCallFuture, - artifact: ArtifactType, + artifact: Artifact, options?: ContractAtOptions ): ArtifactContractAtFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 9e44dcc86b..1319b39de5 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,4 +1,4 @@ -import { ArtifactType } from "../stubs"; +import { Artifact } from "./artifact"; /** * Base argument type that smart contracts can receive in their constructors @@ -136,7 +136,7 @@ export interface ArtifactContractDeploymentFuture { module: IgnitionModule; dependencies: Set; contractName: string; - artifact: ArtifactType; + artifact: Artifact; constructorArgs: ArgumentType[]; libraries: Record>; value: bigint; @@ -170,7 +170,7 @@ export interface ArtifactLibraryDeploymentFuture { module: IgnitionModule; dependencies: Set; contractName: string; - artifact: ArtifactType; + artifact: Artifact; libraries: Record>; from: string | undefined; } @@ -241,7 +241,7 @@ export interface ArtifactContractAtFuture { dependencies: Set; contractName: string; address: string | AddressResolvableFuture; - artifact: ArtifactType; + artifact: Artifact; } /** diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 47bbe82faa..e7ccf1a831 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -1,5 +1,4 @@ -import { ArtifactType } from "../stubs"; - +import { Artifact } from "./artifact"; import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; /** @@ -93,7 +92,7 @@ export interface SerializedArtifactContractDeploymentFuture type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; contractName: string; constructorArgs: SerializedArgumentType[]; - artifact: ArtifactType; + artifact: Artifact; libraries: SerializedLibraries; value: string; from: string | undefined; @@ -121,7 +120,7 @@ export interface SerializedArtifactLibraryDeploymentFuture extends BaseSerializedFuture { type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; contractName: string; - artifact: ArtifactType; + artifact: Artifact; libraries: SerializedLibraries; from: string | undefined; } @@ -175,7 +174,7 @@ export interface SerializedArtifactContractAtFuture type: FutureType.ARTIFACT_CONTRACT_AT; contractName: string; address: string | FutureToken; - artifact: ArtifactType; + artifact: Artifact; } /** diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 1a803cb50f..cdab13527b 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -62,7 +62,7 @@ describe("stored deployment serializer", () => { }); describe("contractFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"]; + const fakeArtifact = ["FAKE ARTIFACT"] as any; it("should serialize a contractFromArtifact deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -164,7 +164,7 @@ describe("stored deployment serializer", () => { }); describe("contractAtFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"]; + const fakeArtifact = ["FAKE ARTIFACT"] as any; it("should serialize a contractAt", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -242,7 +242,7 @@ describe("stored deployment serializer", () => { }); describe("library", () => { - const fakeArtifact = ["FAKE ARTIFACT"]; + const fakeArtifact = ["FAKE ARTIFACT"] as any; it("should serialize a library deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -329,7 +329,7 @@ describe("stored deployment serializer", () => { }); describe("libraryFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"]; + const fakeArtifact = ["FAKE ARTIFACT"] as any; it("should serialize a libraryFromArtifact deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { From 1ac57c104134e88d4fe704b0133305a447754e1a Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 20:43:32 -0300 Subject: [PATCH 0397/1302] Always use the same serialization for bigint --- .../src/new-api/stored-deployment-serializer.ts | 16 ++++++++-------- .../src/new-api/types/serialized-deployment.ts | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 663ee879fc..4714f1ab47 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -115,7 +115,7 @@ export class StoredDeploymentSerializer { ), from: future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: future.value.toString(10), + value: this._serializeBigint(future.value), }; return serializedNamedContractDeploymentFuture; @@ -135,7 +135,7 @@ export class StoredDeploymentSerializer { ), from: future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: future.value.toString(10), + value: this._serializeBigint(future.value), }; return serializedArtifactContractDeploymentFuture; @@ -182,7 +182,7 @@ export class StoredDeploymentSerializer { contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, args: future.args.map((arg) => this._serializeArgument(arg)), - value: future.value.toString(10), + value: this._serializeBigint(future.value), from: future.from, }; return serializedNamedContractCallFuture; @@ -266,7 +266,7 @@ export class StoredDeploymentSerializer { to: isFuture(future.to) ? this._convertFutureToFutureToken(future.to) : future.to, - value: future.value.toString(10), + value: this._serializeBigint(future.value), data: future.data, from: future.from, }; @@ -577,7 +577,7 @@ export class StoredDeploymentDeserializer { lookup(contractFuturesLookup, lib.futureId), ]) ), - BigInt(serializedFuture.value), + this._deserializedBigint(serializedFuture.value), serializedFuture.from ); case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: @@ -595,7 +595,7 @@ export class StoredDeploymentDeserializer { lookup(contractFuturesLookup, lib.futureId), ]) ), - BigInt(serializedFuture.value), + this._deserializedBigint(serializedFuture.value), serializedFuture.from ); case FutureType.NAMED_LIBRARY_DEPLOYMENT: @@ -634,7 +634,7 @@ export class StoredDeploymentDeserializer { serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), - BigInt(serializedFuture.value), + this._deserializedBigint(serializedFuture.value), serializedFuture.from ); case FutureType.NAMED_STATIC_CALL: @@ -693,7 +693,7 @@ export class StoredDeploymentDeserializer { serializedFuture.to.futureId ) : serializedFuture.to, - BigInt(serializedFuture.value), + this._deserializedBigint(serializedFuture.value), serializedFuture.data, serializedFuture.from ); diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index e7ccf1a831..b90c050676 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -78,7 +78,7 @@ export interface SerializedNamedContractDeploymentFuture contractName: string; constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; - value: string; + value: SerializedBigInt; from: string | undefined; } @@ -94,7 +94,7 @@ export interface SerializedArtifactContractDeploymentFuture constructorArgs: SerializedArgumentType[]; artifact: Artifact; libraries: SerializedLibraries; - value: string; + value: SerializedBigInt; from: string | undefined; } @@ -136,7 +136,7 @@ export interface SerializedNamedContractCallFuture functionName: string; contract: FutureToken; args: SerializedArgumentType[]; - value: string; + value: SerializedBigInt; from: string | undefined; } @@ -200,7 +200,7 @@ export interface SerializedReadEventArgumentFuture export interface SerializedSendDataFuture extends BaseSerializedFuture { type: FutureType.SEND_DATA; to: string | FutureToken; - value: string; + value: SerializedBigInt; data: string | undefined; from: string | undefined; } From 9956b125126ee1587d6d6cce6c06f6087b8a1e39 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 13:57:23 -0300 Subject: [PATCH 0398/1302] Add tests for complex argument types --- .../new-api/stored-deployment-serializer.ts | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index cdab13527b..5f3e61a8ce 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -570,6 +570,63 @@ describe("stored deployment serializer", () => { assert.equal(lc, rc); }); }); + + describe("Complex arguments serialization", () => { + it("Should support futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [contract1]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("Should support bigint as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [1n]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("Should support complex arguments as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [ + 1n, + [1, 1n, "asd", { a: ["asd", false] }], + ]); + const contract2 = m.contract("Contract2", [ + { a: ["asd", false, { b: 1n, contract: contract1 }] }, + ]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(0, []); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + }); }); function assertSerializableModuleIn(deployment: StoredDeployment) { From e08e25c8713c0f709fb8533f7c83101278a96e58 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:01:11 -0300 Subject: [PATCH 0399/1302] [UNRELATED] Increase mocha's timeout setting in the plugin --- packages/hardhat-plugin/.mocharc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json index 6928268738..f6734126cb 100644 --- a/packages/hardhat-plugin/.mocharc.json +++ b/packages/hardhat-plugin/.mocharc.json @@ -1,5 +1,5 @@ { "require": "ts-node/register/transpile-only", "file": "./test/setup.ts", - "timeout": 10000 + "timeout": 20000 } From 357d77744bbd634c84f683dd3084f7f218d2bbd9 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:05:21 -0300 Subject: [PATCH 0400/1302] Improve lookup function --- .../new-api/stored-deployment-serializer.ts | 71 +++++++++++-------- 1 file changed, 43 insertions(+), 28 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 4714f1ab47..7f07d5141e 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -343,16 +343,6 @@ export class StoredDeploymentSerializer { } } -function lookup(lookupTable: Map, key: string): T { - const value = lookupTable.get(key); - - if (value === undefined) { - throw new Error(`Lookahead value ${key} missing`); - } - - return value; -} - /** * Deserialize a deployment that was previously serialized using StoredDeploymentSerialized. * @@ -371,7 +361,7 @@ export class StoredDeploymentDeserializer { modulesLookup.set(mod.id, mod); for (const submoduleToken of serializedModule.submodules) { - const submodule = lookup(modulesLookup, submoduleToken.moduleId); + const submodule = this._lookup(modulesLookup, submoduleToken.moduleId); mod.submodules.add(submodule); } } @@ -397,7 +387,7 @@ export class StoredDeploymentDeserializer { ); for (const dependencyId of serializedFuture.dependencies) { - const dependency = lookup(futuresLookup, dependencyId.futureId); + const dependency = this._lookup(futuresLookup, dependencyId.futureId); future.dependencies.add(dependency); } @@ -420,8 +410,11 @@ export class StoredDeploymentDeserializer { for (const [name, futureToken] of Object.entries( serializedModule.results )) { - const mod = lookup(modulesLookup, serializedModule.id); - const contract = lookup(contractFuturesLookup, futureToken.futureId); + const mod = this._lookup(modulesLookup, serializedModule.id); + const contract = this._lookup( + contractFuturesLookup, + futureToken.futureId + ); mod.results[name] = contract; } } @@ -430,7 +423,7 @@ export class StoredDeploymentDeserializer { details: { ...serializedDeployment.details, }, - module: lookup(modulesLookup, serializedDeployment.startModule), + module: this._lookup(modulesLookup, serializedDeployment.startModule), }; } @@ -482,7 +475,7 @@ export class StoredDeploymentDeserializer { futureLookup: Map ): ArgumentType { if (this._isSerializedFutureToken(arg)) { - const swappedFuture = lookup(futureLookup, arg.futureId); + const swappedFuture = this._lookup(futureLookup, arg.futureId); if (swappedFuture === undefined) { throw new IgnitionError( @@ -560,7 +553,7 @@ export class StoredDeploymentDeserializer { contractFuturesLookup: Map>, addressResolvableFutureLookup: Map ): Future { - const mod = lookup(modulesLookup, serializedFuture.moduleId); + const mod = this._lookup(modulesLookup, serializedFuture.moduleId); switch (serializedFuture.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: @@ -574,7 +567,7 @@ export class StoredDeploymentDeserializer { Object.fromEntries( Object.entries(serializedFuture.libraries).map(([name, lib]) => [ name, - lookup(contractFuturesLookup, lib.futureId), + this._lookup(contractFuturesLookup, lib.futureId), ]) ), this._deserializedBigint(serializedFuture.value), @@ -592,7 +585,7 @@ export class StoredDeploymentDeserializer { Object.fromEntries( Object.entries(serializedFuture.libraries).map(([name, lib]) => [ name, - lookup(contractFuturesLookup, lib.futureId), + this._lookup(contractFuturesLookup, lib.futureId), ]) ), this._deserializedBigint(serializedFuture.value), @@ -606,7 +599,7 @@ export class StoredDeploymentDeserializer { Object.fromEntries( Object.entries(serializedFuture.libraries).map(([name, lib]) => [ name, - lookup(contractFuturesLookup, lib.futureId), + this._lookup(contractFuturesLookup, lib.futureId), ]) ), serializedFuture.from @@ -620,7 +613,7 @@ export class StoredDeploymentDeserializer { Object.fromEntries( Object.entries(serializedFuture.libraries).map(([name, lib]) => [ name, - lookup(contractFuturesLookup, lib.futureId), + this._lookup(contractFuturesLookup, lib.futureId), ]) ), serializedFuture.from @@ -630,7 +623,10 @@ export class StoredDeploymentDeserializer { serializedFuture.id, mod, serializedFuture.functionName, - lookup(contractFuturesLookup, serializedFuture.contract.futureId), + this._lookup( + contractFuturesLookup, + serializedFuture.contract.futureId + ), serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), @@ -642,7 +638,10 @@ export class StoredDeploymentDeserializer { serializedFuture.id, mod, serializedFuture.functionName, - lookup(contractFuturesLookup, serializedFuture.contract.futureId), + this._lookup( + contractFuturesLookup, + serializedFuture.contract.futureId + ), serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), @@ -654,7 +653,7 @@ export class StoredDeploymentDeserializer { mod, serializedFuture.contractName, this._isSerializedFutureToken(serializedFuture.address) - ? lookup( + ? this._lookup( addressResolvableFutureLookup, serializedFuture.address.futureId ) @@ -666,7 +665,7 @@ export class StoredDeploymentDeserializer { mod, serializedFuture.contractName, this._isSerializedFutureToken(serializedFuture.address) - ? lookup( + ? this._lookup( addressResolvableFutureLookup, serializedFuture.address.futureId ) @@ -677,10 +676,16 @@ export class StoredDeploymentDeserializer { return new ReadEventArgumentFutureImplementation( serializedFuture.id, mod, - lookup(futuresLookup, serializedFuture.futureToReadFrom.futureId), + this._lookup( + futuresLookup, + serializedFuture.futureToReadFrom.futureId + ), serializedFuture.eventName, serializedFuture.argumentName, - lookup(contractFuturesLookup, serializedFuture.emitter.futureId), + this._lookup( + contractFuturesLookup, + serializedFuture.emitter.futureId + ), serializedFuture.eventIndex ); case FutureType.SEND_DATA: @@ -688,7 +693,7 @@ export class StoredDeploymentDeserializer { serializedFuture.id, mod, this._isSerializedFutureToken(serializedFuture.to) - ? lookup( + ? this._lookup( addressResolvableFutureLookup, serializedFuture.to.futureId ) @@ -699,4 +704,14 @@ export class StoredDeploymentDeserializer { ); } } + + private static _lookup(lookupTable: Map, key: string): T { + const value = lookupTable.get(key); + + if (value === undefined) { + throw new IgnitionError(`Lookahead value ${key} missing`); + } + + return value; + } } From 999e3c035c1041a5c56a18e2d4fb816b85dec220 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 24 May 2023 12:23:21 -0300 Subject: [PATCH 0401/1302] Define RuntimeValue types --- packages/core/src/new-api/types/module.ts | 42 ++++++++++++++++++++++ packages/core/test/new-api/types/module.ts | 24 +++++++++++++ 2 files changed, 66 insertions(+) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 1319b39de5..b1192f8834 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -295,6 +295,48 @@ export type ModuleParameterType = | ModuleParameterType[] | { [field: string]: ModuleParameterType }; +/** + * The different runtime values supported by Ignition. + * + * @beta + */ +export enum RuntimeValueType { + ACCOUNT, + MODULE_PARAMETER, +} + +/** + * A value that's only available during deployment. + * + * @beta + */ +export type RuntimeValue = + | AccountRuntimeValue + | ModuleParameterRuntimeValue; + +/** + * A local account. + * + * @beta + */ +export interface AccountRuntimeValue { + type: RuntimeValueType.ACCOUNT; + accountIndex: number; +} + +/** + * A module parameter. + * + * @beta + */ +export interface ModuleParameterRuntimeValue< + ParamTypeT extends ModuleParameterType +> { + type: RuntimeValueType.MODULE_PARAMETER; + name: string; + defaultValue?: ParamTypeT; +} + /** * An object containing the parameters passed into the module. * diff --git a/packages/core/test/new-api/types/module.ts b/packages/core/test/new-api/types/module.ts index 08d70317b8..37b5cd084b 100644 --- a/packages/core/test/new-api/types/module.ts +++ b/packages/core/test/new-api/types/module.ts @@ -2,6 +2,8 @@ import { Future, FutureType, IgnitionModule, + RuntimeValue, + RuntimeValueType, } from "../../../src/new-api/types/module"; type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ( @@ -17,6 +19,10 @@ interface BaseFuture { dependencies: Set; } +interface BaseRuntimeValue { + type: RuntimeValueType; +} + function _testThatEveryFutureIsBaseFuture(f: Future): BaseFuture { return f; } @@ -30,3 +36,21 @@ function _testThatBaseFutureIncludesAllSharedFieldsExceptType( function _testThatEveryFutureTypeIsUsed(type: FutureType): Future["type"] { return type; } + +function _testThatEveryRuntimeValueIsBaseRuntimeValue( + r: RuntimeValue +): BaseRuntimeValue { + return r; +} + +function _testThatBaseRuntimeValueIncludesAllSharedFieldsExceptType( + r: Omit +): UnionToIntersection> { + return r; +} + +function _testThatEveryRuntimeValueTypeIsUsed( + type: RuntimeValueType +): RuntimeValue["type"] { + return type; +} From 194d7d99736e875a8a80521f645da6120f6393c8 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 24 May 2023 12:35:00 -0300 Subject: [PATCH 0402/1302] Remove chainId from the moduleBuilder --- .../src/new-api/internal/module-builder.ts | 3 -- .../core/src/new-api/types/module-builder.ts | 1 - packages/core/test/new-api/batcher.ts | 2 +- packages/core/test/new-api/call.ts | 16 +++---- packages/core/test/new-api/contract.ts | 18 ++++---- packages/core/test/new-api/contractAt.ts | 12 ++--- .../test/new-api/contractAtFromArtifact.ts | 12 ++--- .../core/test/new-api/contractFromArtifact.ts | 18 ++++---- packages/core/test/new-api/getParameter.ts | 8 ++-- packages/core/test/new-api/library.ts | 14 +++--- .../core/test/new-api/libraryFromArtifact.ts | 14 +++--- .../core/test/new-api/readEventArgument.ts | 16 +++---- packages/core/test/new-api/send.ts | 16 +++---- packages/core/test/new-api/staticCall.ts | 16 +++---- .../new-api/stored-deployment-serializer.ts | 46 +++++++++---------- packages/core/test/new-api/useModule.ts | 6 +-- 16 files changed, 107 insertions(+), 111 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 31fa08e2e9..2690936533 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -71,7 +71,6 @@ export class ModuleConstructor { private _modules: Map = new Map(); constructor( - public readonly chainId: number, public readonly accounts: string[], public readonly parameters: { [moduleId: string]: ModuleParameters } = {} ) {} @@ -105,7 +104,6 @@ export class ModuleConstructor { new IgnitionModuleBuilderImplementation( this, mod, - this.chainId, this.accounts, this.parameters[moduleDefintion.id] ) @@ -132,7 +130,6 @@ export class IgnitionModuleBuilderImplementation< ResultsContractNameT, IgnitionModuleResultsT >, - public readonly chainId: number, public readonly accounts: string[], public readonly parameters: ModuleParameters = {} ) { diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 16aed30efb..298b5ceebb 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -156,7 +156,6 @@ export interface SendDataOptions { * @beta */ export interface IgnitionModuleBuilder { - chainId: number; accounts: string[]; contract( diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index 6639041cb9..d9877c53d4 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -187,7 +187,7 @@ function assertBatching( }, expectedBatches: string[][] ) { - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assert.isDefined(module); diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 65908d9b61..ed8d6502d9 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -15,7 +15,7 @@ describe("call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -57,7 +57,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -98,7 +98,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -138,7 +138,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -168,7 +168,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -197,7 +197,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -225,7 +225,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -241,7 +241,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 89c1f5b558..4692510b21 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -13,7 +13,7 @@ describe("contract", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -85,7 +85,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -123,7 +123,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -159,7 +159,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -189,7 +189,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -223,7 +223,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -247,7 +247,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -267,7 +267,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 6df991fba1..167b9dcf98 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -16,7 +16,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -56,7 +56,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -83,7 +83,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -124,7 +124,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -156,7 +156,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -186,7 +186,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index 0720244da4..f3f4a633cb 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -20,7 +20,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -65,7 +65,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -92,7 +92,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -133,7 +133,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -165,7 +165,7 @@ describe("contractAtFromArtifactFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -195,7 +195,7 @@ describe("contractAtFromArtifactFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index d878d3a882..197835e76a 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -21,7 +21,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -61,7 +61,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -88,7 +88,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -115,7 +115,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -153,7 +153,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -185,7 +185,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -229,7 +229,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -259,7 +259,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -288,7 +288,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index 08512446b5..bc5096d89c 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -6,7 +6,7 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("getParameter", () => { it("should record given parameters", () => { - const constructor = new ModuleConstructor(0, [], { + const constructor = new ModuleConstructor([], { TestModule: { param1: 42 }, }); @@ -21,7 +21,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, [], { + const constructor = new ModuleConstructor([], { Module1: { param1: "arg1" }, }); const moduleWithParams = constructor.construct(moduleWithParamsDefinition); @@ -51,7 +51,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, [], { + const constructor = new ModuleConstructor([], { Module1: { param1: "overriddenParam", }, @@ -83,7 +83,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleWithParamsDefinition), diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index bc0a1d2b51..1c959c0dd9 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -13,7 +13,7 @@ describe("library", () => { return { library1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -87,7 +87,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -125,7 +125,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -159,7 +159,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -182,7 +182,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -201,7 +201,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 2174c05d84..bed1f7043d 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -17,7 +17,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -51,7 +51,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -78,7 +78,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -116,7 +116,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -158,7 +158,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -188,7 +188,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -215,7 +215,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 455d52a12a..2e2f2aae8e 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -24,7 +24,7 @@ describe("Read event argument", () => { return { contract, contractFromArtifact }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const callFuture = Array.from(mod.futures).find( @@ -51,7 +51,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -74,7 +74,7 @@ describe("Read event argument", () => { return { contract, emitter }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -96,7 +96,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -119,7 +119,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const [read1] = Array.from(mod.futures).filter( @@ -138,7 +138,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); const [read1] = Array.from(mod.futures).filter( @@ -168,7 +168,7 @@ describe("Read event argument", () => { return { main, emitter }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const mod = constructor.construct(defintion); assert.equal(mod.id, "Module1"); @@ -193,7 +193,7 @@ describe("Read event argument", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameReadEventArgumentTwice = constructor.construct( moduleWithSameReadEventArgumentTwiceDefinition ); diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index ef41fc6b8b..fe075ac9b0 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -13,7 +13,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -52,7 +52,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -86,7 +86,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -119,7 +119,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -147,7 +147,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -174,7 +174,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -201,7 +201,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -216,7 +216,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index c40cd1de49..c410c528f5 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -18,7 +18,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -60,7 +60,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -101,7 +101,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -140,7 +140,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -175,7 +175,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor(0, ["0x1", "0x2"]); + const constructor = new ModuleConstructor(["0x1", "0x2"]); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -204,7 +204,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -232,7 +232,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), @@ -248,7 +248,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 5f3e61a8ce..3af0e2c4a0 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -33,7 +33,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -51,7 +51,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -71,7 +71,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -98,7 +98,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -116,7 +116,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -134,7 +134,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -153,7 +153,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -177,7 +177,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -203,7 +203,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -231,7 +231,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -251,7 +251,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -271,7 +271,7 @@ describe("stored deployment serializer", () => { }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -318,7 +318,7 @@ describe("stored deployment serializer", () => { }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -338,7 +338,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -358,7 +358,7 @@ describe("stored deployment serializer", () => { return { library1, library2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -378,7 +378,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -398,7 +398,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -418,7 +418,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -438,7 +438,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -461,7 +461,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -485,7 +485,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -510,7 +510,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -545,7 +545,7 @@ describe("stored deployment serializer", () => { return { leftContract, rightContract }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const module = constructor.construct(moduleDefinition); const deployment = { diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 2f27f83eac..987f40bcca 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -17,7 +17,7 @@ describe("useModule", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -42,7 +42,7 @@ describe("useModule", () => { return { first, second }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -72,7 +72,7 @@ describe("useModule", () => { return { contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor([]); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition From 6992f2a71a70a2a400836b102db367db10009e80 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 25 May 2023 12:03:51 -0300 Subject: [PATCH 0403/1302] Replace m.accounts with m.getAccount(n). Note: (de)serializing these values is not included in this commit --- .../src/new-api/internal/module-builder.ts | 9 ++- packages/core/src/new-api/internal/module.ts | 32 +++++++--- packages/core/src/new-api/internal/utils.ts | 12 ++++ .../core/src/new-api/types/module-builder.ts | 17 +++--- packages/core/src/new-api/types/module.ts | 14 ++--- .../new-api/types/serialized-deployment.ts | 12 +++- packages/core/test/new-api/batcher.ts | 2 +- packages/core/test/new-api/call.ts | 55 ++++++++++++++---- packages/core/test/new-api/contract.ts | 57 ++++++++++++++---- packages/core/test/new-api/contractAt.ts | 12 ++-- .../test/new-api/contractAtFromArtifact.ts | 12 ++-- .../core/test/new-api/contractFromArtifact.ts | 58 +++++++++++++++---- packages/core/test/new-api/getAccount.ts | 31 ++++++++++ packages/core/test/new-api/getParameter.ts | 8 +-- packages/core/test/new-api/library.ts | 55 ++++++++++++++---- .../core/test/new-api/libraryFromArtifact.ts | 54 ++++++++++++++--- .../core/test/new-api/readEventArgument.ts | 16 ++--- packages/core/test/new-api/send.ts | 53 +++++++++++++---- packages/core/test/new-api/staticCall.ts | 55 ++++++++++++++---- .../new-api/stored-deployment-serializer.ts | 46 +++++++-------- packages/core/test/new-api/useModule.ts | 6 +- 21 files changed, 464 insertions(+), 152 deletions(-) create mode 100644 packages/core/test/new-api/getAccount.ts diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 2690936533..b3c6221642 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -4,6 +4,7 @@ import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; import { Artifact } from "../types/artifact"; import { + AccountRuntimeValue, AddressResolvableFuture, ArgumentType, ArtifactContractAtFuture, @@ -36,6 +37,7 @@ import { } from "../types/module-builder"; import { + AccountRuntimeValueImplementation, ArtifactContractAtFutureImplementation, ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, @@ -71,7 +73,6 @@ export class ModuleConstructor { private _modules: Map = new Map(); constructor( - public readonly accounts: string[], public readonly parameters: { [moduleId: string]: ModuleParameters } = {} ) {} @@ -104,7 +105,6 @@ export class ModuleConstructor { new IgnitionModuleBuilderImplementation( this, mod, - this.accounts, this.parameters[moduleDefintion.id] ) ); @@ -130,12 +130,15 @@ export class IgnitionModuleBuilderImplementation< ResultsContractNameT, IgnitionModuleResultsT >, - public readonly accounts: string[], public readonly parameters: ModuleParameters = {} ) { this._futureIds = new Set(); } + public getAccount(accountIndex: number): AccountRuntimeValue { + return new AccountRuntimeValueImplementation(accountIndex); + } + public contract( contractName: ContractNameT, args: ArgumentType[] = [], diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 9d56a5e101..f366f8d513 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -1,5 +1,6 @@ import { Artifact } from "../types/artifact"; import { + AccountRuntimeValue, AddressResolvableFuture, ArgumentType, ArtifactContractAtFuture, @@ -16,6 +17,7 @@ import { NamedLibraryDeploymentFuture, NamedStaticCallFuture, ReadEventArgumentFuture, + RuntimeValueType, SendDataFuture, } from "../types/module"; @@ -60,7 +62,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly constructorArgs: ArgumentType[], public readonly libraries: Record>, public readonly value: bigint, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); } @@ -80,7 +82,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly artifact: Artifact, public readonly libraries: Record>, public readonly value: bigint, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); } @@ -97,7 +99,7 @@ export class NamedLibraryDeploymentFutureImplementation< public readonly module: IgnitionModuleImplementation, public readonly contractName: LibraryNameT, public readonly libraries: Record>, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); } @@ -115,7 +117,7 @@ export class ArtifactLibraryDeploymentFutureImplementation< public readonly contractName: LibraryNameT, public readonly artifact: Artifact, public readonly libraries: Record>, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); } @@ -135,7 +137,7 @@ export class NamedContractCallFutureImplementation< public readonly contract: ContractFuture, public readonly args: ArgumentType[], public readonly value: bigint, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); } @@ -154,7 +156,7 @@ export class NamedStaticCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: ArgumentType[], - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_STATIC_CALL, module); } @@ -216,7 +218,7 @@ export class SendDataFutureImplementation public readonly to: string | AddressResolvableFuture, public readonly value: bigint, public readonly data: string | undefined, - public readonly from: string | undefined + public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.SEND_DATA, module); } @@ -253,3 +255,19 @@ export class IgnitionModuleImplementation< }`; } } + +export class AccountRuntimeValueImplementation implements AccountRuntimeValue { + public readonly type = RuntimeValueType.ACCOUNT; + + constructor(public readonly accountIndex: number) {} + + public [customInspectSymbol]( + _depth: number, + _inspectOptions: {}, + _inspect: (arg: {}) => string + ) { + return `Account RuntimeValue { + accountIndex: ${this.accountIndex} +}`; + } +} diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index da5c674741..79984ff476 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -4,6 +4,8 @@ import { ContractFuture, Future, FutureType, + RuntimeValue, + RuntimeValueType, } from "../types/module"; export function isFuture(potential: unknown): potential is Future { @@ -62,3 +64,13 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } + +export function isRuntimeValue(potential: unknown): potential is RuntimeValue { + return ( + typeof potential === "object" && + potential !== null && + "type" in potential && + typeof potential.type === "number" && + RuntimeValueType[potential.type] !== undefined + ); +} diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 298b5ceebb..f1d218f1f9 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -1,5 +1,6 @@ import { Artifact } from "./artifact"; import { + AccountRuntimeValue, AddressResolvableFuture, ArgumentType, ArtifactContractAtFuture, @@ -42,7 +43,7 @@ export interface ContractOptions { after?: Future[]; libraries?: Record>; value?: bigint; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -55,7 +56,7 @@ export interface ContractFromArtifactOptions { after?: Future[]; libraries?: Record>; value?: bigint; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -67,7 +68,7 @@ export interface LibraryOptions { id?: string; after?: Future[]; libraries?: Record>; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -79,7 +80,7 @@ export interface LibraryFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -91,7 +92,7 @@ export interface CallOptions { id?: string; after?: Future[]; value?: bigint; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -102,7 +103,7 @@ export interface CallOptions { export interface StaticCallOptions { id?: string; after?: Future[]; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -147,7 +148,7 @@ export interface ReadEventArgumentOptions { export interface SendDataOptions { id?: string; after?: Future[]; - from?: string; + from?: string | AccountRuntimeValue; } /** @@ -156,7 +157,7 @@ export interface SendDataOptions { * @beta */ export interface IgnitionModuleBuilder { - accounts: string[]; + getAccount(accountIndex: number): AccountRuntimeValue; contract( contractName: ContractNameT, diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index b1192f8834..5fbf429683 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -121,7 +121,7 @@ export interface NamedContractDeploymentFuture { constructorArgs: ArgumentType[]; libraries: Record>; value: bigint; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -140,7 +140,7 @@ export interface ArtifactContractDeploymentFuture { constructorArgs: ArgumentType[]; libraries: Record>; value: bigint; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -155,7 +155,7 @@ export interface NamedLibraryDeploymentFuture { dependencies: Set; contractName: LibraryNameT; libraries: Record>; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -172,7 +172,7 @@ export interface ArtifactLibraryDeploymentFuture { contractName: string; artifact: Artifact; libraries: Record>; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -192,7 +192,7 @@ export interface NamedContractCallFuture< functionName: FunctionNameT; args: ArgumentType[]; value: bigint; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -211,7 +211,7 @@ export interface NamedStaticCallFuture< contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** @@ -275,7 +275,7 @@ export interface SendDataFuture { to: string | AddressResolvableFuture; value: bigint; data: string | undefined; - from: string | undefined; + from: string | AccountRuntimeValue | undefined; } /** diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index b90c050676..b1446c0ea3 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -1,5 +1,10 @@ import { Artifact } from "./artifact"; -import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; +import { + FutureType, + IgnitionModule, + IgnitionModuleResult, + RuntimeValueType, +} from "./module"; /** * A serialized bigint. @@ -205,6 +210,11 @@ export interface SerializedSendDataFuture extends BaseSerializedFuture { from: string | undefined; } +export interface SerializedAccountRuntimeValue { + type: RuntimeValueType.ACCOUNT; + accountIndex: number; +} + /** * The details of a deployment that will be used in the UI. * diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index d9877c53d4..8952c23001 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -187,7 +187,7 @@ function assertBatching( }, expectedBatches: string[][] ) { - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assert.isDefined(module); diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index ed8d6502d9..915e665ce2 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { NamedContractCallFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType } from "../../src/new-api/types/module"; +import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; describe("call", () => { it("should be able to setup a contract call", () => { @@ -15,7 +15,7 @@ describe("call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -57,7 +57,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -98,7 +98,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -138,7 +138,7 @@ describe("call", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -156,19 +156,19 @@ describe("call", () => { assert.equal(callFuture.value, BigInt(42)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); - m.call(example, "test", [], { from: m.accounts[1] }); + m.call(example, "test", [], { from: "0x2" }); return { example }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -186,6 +186,39 @@ describe("call", () => { assert.equal(callFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.call(example, "test", [], { from: m.getAccount(1) }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { @@ -197,7 +230,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -225,7 +258,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -241,7 +274,7 @@ describe("call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 4692510b21..995ea5c7b5 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType } from "../../src/new-api/types/module"; +import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { @@ -13,7 +13,7 @@ describe("contract", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -85,7 +85,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -123,7 +123,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -159,7 +159,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -179,17 +179,17 @@ describe("contract", () => { assert.equal(anotherFuture.value, BigInt(42)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { - const another = m.contract("Another", [], { from: m.accounts[1] }); + const another = m.contract("Another", [], { from: "0x2" }); return { another }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -209,6 +209,39 @@ describe("contract", () => { assert.equal(anotherFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { from: m.getAccount(1) }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(anotherFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( @@ -223,7 +256,7 @@ describe("contract", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -247,7 +280,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -267,7 +300,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 167b9dcf98..a490ec4c50 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -16,7 +16,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -56,7 +56,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -83,7 +83,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -124,7 +124,7 @@ describe("contractAt", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -156,7 +156,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -186,7 +186,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index f3f4a633cb..edc4c0bd7a 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -20,7 +20,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -65,7 +65,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -92,7 +92,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -133,7 +133,7 @@ describe("contractAtFromArtifactFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -165,7 +165,7 @@ describe("contractAtFromArtifactFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -195,7 +195,7 @@ describe("contractAtFromArtifactFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 197835e76a..c20a04d8a4 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ArtifactContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -21,7 +22,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -61,7 +62,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -88,7 +89,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -115,7 +116,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -153,7 +154,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -173,19 +174,19 @@ describe("contractFromArtifact", () => { assert.equal(anotherFuture.value, BigInt(42)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { - from: m.accounts[1], + from: "0x2", }); return { another }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -205,6 +206,41 @@ describe("contractFromArtifact", () => { assert.equal(anotherFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + from: m.getAccount(1), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactContractDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact contract deployment"); + } + + assert.equal(anotherFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( @@ -229,7 +265,7 @@ describe("contractFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -259,7 +295,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -288,7 +324,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/getAccount.ts b/packages/core/test/new-api/getAccount.ts new file mode 100644 index 0000000000..05acab7fce --- /dev/null +++ b/packages/core/test/new-api/getAccount.ts @@ -0,0 +1,31 @@ +import { assert } from "chai"; + +import { RuntimeValueType } from "../../src"; +import { defineModule } from "../../src/new-api/define-module"; +import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + +describe("getAccount", () => { + it("should return the correct RuntimeValue", () => { + const defintion = defineModule("MyModule", (m) => { + const account1 = m.getAccount(1); + const account2 = m.getAccount(2); + + const contract = m.contract("Contract", [account1], { from: account2 }); + + return { contract }; + }); + + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); + + assert.deepEqual(mod.results.contract.constructorArgs[0], { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + + assert.deepEqual(mod.results.contract.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 2, + }); + }); +}); diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index bc5096d89c..82161c41dc 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -6,7 +6,7 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; describe("getParameter", () => { it("should record given parameters", () => { - const constructor = new ModuleConstructor([], { + const constructor = new ModuleConstructor({ TestModule: { param1: 42 }, }); @@ -21,7 +21,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([], { + const constructor = new ModuleConstructor({ Module1: { param1: "arg1" }, }); const moduleWithParams = constructor.construct(moduleWithParamsDefinition); @@ -51,7 +51,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([], { + const constructor = new ModuleConstructor({ Module1: { param1: "overriddenParam", }, @@ -83,7 +83,7 @@ describe("getParameter", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleWithParamsDefinition), diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 1c959c0dd9..26db92901e 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType } from "../../src/new-api/types/module"; +import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; describe("library", () => { it("should be able to setup a deploy library call", () => { @@ -13,7 +13,7 @@ describe("library", () => { return { library1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -49,7 +49,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -87,7 +87,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -113,19 +113,19 @@ describe("library", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const another = m.library("Another", { - from: m.accounts[1], + from: "0x2", }); return { another }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -145,6 +145,41 @@ describe("library", () => { assert.equal(anotherFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.library("Another", { + from: m.getAccount(1), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not a named library deployment"); + } + + assert.equal(anotherFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( @@ -159,7 +194,7 @@ describe("library", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -182,7 +217,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -201,7 +236,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index bed1f7043d..de92f6051e 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ArtifactLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -17,7 +18,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithContractFromArtifact = constructor.construct( moduleWithContractFromArtifactDefinition ); @@ -51,7 +52,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -78,7 +79,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -104,19 +105,19 @@ describe("libraryFromArtifact", () => { assert(anotherFuture.dependencies.has(exampleFuture!)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const another = m.libraryFromArtifact("Another", fakeArtifact, { - from: m.accounts[1], + from: "0x2", }); return { another }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -136,6 +137,41 @@ describe("libraryFromArtifact", () => { assert.equal(anotherFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.libraryFromArtifact("Another", fakeArtifact, { + from: m.getAccount(1), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactLibraryDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact library deployment"); + } + + assert.equal(anotherFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( @@ -158,7 +194,7 @@ describe("libraryFromArtifact", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameContractTwice = constructor.construct( moduleWithSameContractTwiceDefinition ); @@ -188,7 +224,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -215,7 +251,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 2e2f2aae8e..73ffd58a9e 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -24,7 +24,7 @@ describe("Read event argument", () => { return { contract, contractFromArtifact }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const callFuture = Array.from(mod.futures).find( @@ -51,7 +51,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -74,7 +74,7 @@ describe("Read event argument", () => { return { contract, emitter }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -96,7 +96,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const [read1, read2] = Array.from(mod.futures).filter( @@ -119,7 +119,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const [read1] = Array.from(mod.futures).filter( @@ -138,7 +138,7 @@ describe("Read event argument", () => { return { contract }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); const [read1] = Array.from(mod.futures).filter( @@ -168,7 +168,7 @@ describe("Read event argument", () => { return { main, emitter }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); assert.equal(mod.id, "Module1"); @@ -193,7 +193,7 @@ describe("Read event argument", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameReadEventArgumentTwice = constructor.construct( moduleWithSameReadEventArgumentTwiceDefinition ); diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index fe075ac9b0..cd530003b2 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { SendDataFutureImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType } from "../../src/new-api/types/module"; +import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; describe("send", () => { it("should be able to setup a send", () => { @@ -13,7 +13,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -52,7 +52,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -86,7 +86,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -119,7 +119,7 @@ describe("send", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -137,17 +137,17 @@ describe("send", () => { assert.equal(sendFuture.value, BigInt(42)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { - m.send("test send", "0xtest", 0n, "", { from: m.accounts[1] }); + m.send("test send", "0xtest", 0n, "", { from: "0x2" }); return {}; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -165,6 +165,37 @@ describe("send", () => { assert.equal(sendFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + m.send("test send", "0xtest", 0n, "", { from: m.getAccount(1) }); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:test send" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { @@ -174,7 +205,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -201,7 +232,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -216,7 +247,7 @@ describe("send", () => { return {}; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index c410c528f5..c820139510 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -6,7 +6,7 @@ import { NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType } from "../../src/new-api/types/module"; +import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; describe("static call", () => { it("should be able to setup a static call", () => { @@ -18,7 +18,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -60,7 +60,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -101,7 +101,7 @@ describe("static call", () => { } ); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -140,7 +140,7 @@ describe("static call", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithASingleContract = constructor.construct( moduleWithASingleContractDefinition ); @@ -163,19 +163,19 @@ describe("static call", () => { assert(callFuture.dependencies.has(staticCallFuture!)); }); - it("should be able to pass from as an option", () => { + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", (m) => { const example = m.contract("Example"); - m.staticCall(example, "test", [], { from: m.accounts[1] }); + m.staticCall(example, "test", [], { from: "0x2" }); return { example }; } ); - const constructor = new ModuleConstructor(["0x1", "0x2"]); + const constructor = new ModuleConstructor(); const moduleWithDependentContracts = constructor.construct( moduleWithDependentContractsDefinition ); @@ -193,6 +193,39 @@ describe("static call", () => { assert.equal(callFuture.from, "0x2"); }); + it("Should be able to pass an AccountRuntimeValue as from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.staticCall(example, "test", [], { from: m.getAccount(1) }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assert.equal(callFuture.from, { + type: RuntimeValueType.ACCOUNT, + accountIndex: 1, + }); + }); + describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { @@ -204,7 +237,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const moduleWithSameCallTwice = constructor.construct( moduleWithSameCallTwiceDefinition ); @@ -232,7 +265,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), @@ -248,7 +281,7 @@ describe("static call", () => { return { sameContract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); assert.throws( () => constructor.construct(moduleDefinition), diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 3af0e2c4a0..fb710b4520 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -33,7 +33,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -51,7 +51,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -71,7 +71,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -98,7 +98,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -116,7 +116,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -134,7 +134,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -153,7 +153,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -177,7 +177,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -203,7 +203,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -231,7 +231,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -251,7 +251,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -271,7 +271,7 @@ describe("stored deployment serializer", () => { }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -318,7 +318,7 @@ describe("stored deployment serializer", () => { }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -338,7 +338,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -358,7 +358,7 @@ describe("stored deployment serializer", () => { return { library1, library2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -378,7 +378,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -398,7 +398,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -418,7 +418,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -438,7 +438,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -461,7 +461,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -485,7 +485,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -510,7 +510,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -545,7 +545,7 @@ describe("stored deployment serializer", () => { return { leftContract, rightContract }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); const deployment = { diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 987f40bcca..8ee469c8bd 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -17,7 +17,7 @@ describe("useModule", () => { return { contract1 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -42,7 +42,7 @@ describe("useModule", () => { return { first, second }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition @@ -72,7 +72,7 @@ describe("useModule", () => { return { contract2 }; }); - const constructor = new ModuleConstructor([]); + const constructor = new ModuleConstructor(); const submodule = constructor.construct(submoduleDefinition); const moduleWithSubmodule = constructor.construct( moduleWithSubmoduleDefinition From 9a522f384973be4e0e596444df24a1020b2941e6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:36:40 -0300 Subject: [PATCH 0404/1302] Define Type enums with strings to make their guards safe --- packages/core/src/new-api/internal/utils.ts | 22 +++++++++++++++---- packages/core/src/new-api/types/module.ts | 24 ++++++++++----------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 79984ff476..d44f6c0cc1 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -8,13 +8,19 @@ import { RuntimeValueType, } from "../types/module"; +export function isFutureType(potential: unknown): potential is FutureType { + return ( + typeof potential === "string" && + (FutureType as any)[potential] !== undefined + ); +} + export function isFuture(potential: unknown): potential is Future { return ( typeof potential === "object" && potential !== null && "type" in potential && - typeof potential.type === "number" && - FutureType[potential.type] !== undefined + isFutureType(potential.type) ); } @@ -65,12 +71,20 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } +export function isRuntimeValueType( + potential: unknown +): potential is RuntimeValueType { + return ( + typeof potential === "string" && + (RuntimeValueType as any)[potential] !== undefined + ); +} + export function isRuntimeValue(potential: unknown): potential is RuntimeValue { return ( typeof potential === "object" && potential !== null && "type" in potential && - typeof potential.type === "number" && - RuntimeValueType[potential.type] !== undefined + isRuntimeValueType(potential.type) ); } diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 5fbf429683..0d4b38fc6f 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -31,16 +31,16 @@ export type ArgumentType = * @beta */ export enum FutureType { - NAMED_CONTRACT_DEPLOYMENT, - ARTIFACT_CONTRACT_DEPLOYMENT, - NAMED_LIBRARY_DEPLOYMENT, - ARTIFACT_LIBRARY_DEPLOYMENT, - NAMED_CONTRACT_CALL, - NAMED_STATIC_CALL, - NAMED_CONTRACT_AT, - ARTIFACT_CONTRACT_AT, - READ_EVENT_ARGUMENT, - SEND_DATA, + NAMED_CONTRACT_DEPLOYMENT = "NAMED_CONTRACT_DEPLOYMENT", + ARTIFACT_CONTRACT_DEPLOYMENT = "ARTIFACT_CONTRACT_DEPLOYMENT", + NAMED_LIBRARY_DEPLOYMENT = "NAMED_LIBRARY_DEPLOYMENT", + ARTIFACT_LIBRARY_DEPLOYMENT = "ARTIFACT_LIBRARY_DEPLOYMENT", + NAMED_CONTRACT_CALL = "NAMED_CONTRACT_CALL", + NAMED_STATIC_CALL = "NAMED_STATIC_CALL", + NAMED_CONTRACT_AT = "NAMED_CONTRACT_AT", + ARTIFACT_CONTRACT_AT = "ARTIFACT_CONTRACT_AT", + READ_EVENT_ARGUMENT = "READ_EVENT_ARGUMENT", + SEND_DATA = "SEND_DATA", } /** @@ -301,8 +301,8 @@ export type ModuleParameterType = * @beta */ export enum RuntimeValueType { - ACCOUNT, - MODULE_PARAMETER, + ACCOUNT = "ACCOUNT", + MODULE_PARAMETER = "MODULE_PARAMETER", } /** From ba04732194e95525dccdb8a2ff53c205094912e5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:39:02 -0300 Subject: [PATCH 0405/1302] Fix .from tests --- packages/core/test/new-api/call.ts | 12 +++++++----- packages/core/test/new-api/contract.ts | 12 +++++++----- packages/core/test/new-api/contractFromArtifact.ts | 12 +++++++----- packages/core/test/new-api/helpers.ts | 8 ++++++++ packages/core/test/new-api/library.ts | 12 +++++++----- packages/core/test/new-api/libraryFromArtifact.ts | 12 +++++++----- packages/core/test/new-api/send.ts | 12 +++++++----- packages/core/test/new-api/staticCall.ts | 8 ++++---- 8 files changed, 54 insertions(+), 34 deletions(-) create mode 100644 packages/core/test/new-api/helpers.ts diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 915e665ce2..3765d1e12b 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -1,9 +1,13 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; -import { NamedContractCallFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + NamedContractCallFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { assertInstanceOf } from "./helpers"; describe("call", () => { it("should be able to setup a contract call", () => { @@ -213,10 +217,8 @@ describe("call", () => { assert.fail("Not a named contract deployment"); } - assert.equal(callFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(callFuture.from, AccountRuntimeValueImplementation); + assert.equal(callFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 995ea5c7b5..dbab3d90ff 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -1,9 +1,13 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; -import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + NamedContractDeploymentFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { assertInstanceOf } from "./helpers"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { @@ -236,10 +240,8 @@ describe("contract", () => { assert.fail("Not a named contract deployment"); } - assert.equal(anotherFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(anotherFuture.from, AccountRuntimeValueImplementation); + assert.equal(anotherFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index c20a04d8a4..c553786cb4 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -2,8 +2,12 @@ import { assert } from "chai"; import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; -import { ArtifactContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + ArtifactContractDeploymentFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { assertInstanceOf } from "./helpers"; describe("contractFromArtifact", () => { const fakeArtifact: any = {}; @@ -235,10 +239,8 @@ describe("contractFromArtifact", () => { assert.fail("Not an artifact contract deployment"); } - assert.equal(anotherFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(anotherFuture.from, AccountRuntimeValueImplementation); + assert.equal(anotherFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts new file mode 100644 index 0000000000..f49292d17d --- /dev/null +++ b/packages/core/test/new-api/helpers.ts @@ -0,0 +1,8 @@ +import { assert } from "chai"; + +export function assertInstanceOf( + obj: unknown, + klass: { new (...args: any[]): ObjectT } +): asserts obj is ObjectT { + assert.instanceOf(obj, klass, `Not a valid instace of ${klass.name}`); +} diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 26db92901e..ce529afb72 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,9 +1,13 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; -import { NamedLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + NamedLibraryDeploymentFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { assertInstanceOf } from "./helpers"; describe("library", () => { it("should be able to setup a deploy library call", () => { @@ -174,10 +178,8 @@ describe("library", () => { assert.fail("Not a named library deployment"); } - assert.equal(anotherFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(anotherFuture.from, AccountRuntimeValueImplementation); + assert.equal(anotherFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index de92f6051e..1cff3a645b 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -2,8 +2,12 @@ import { assert } from "chai"; import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; -import { ArtifactLibraryDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + ArtifactLibraryDeploymentFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { assertInstanceOf } from "./helpers"; describe("libraryFromArtifact", () => { const fakeArtifact: any = {}; @@ -166,10 +170,8 @@ describe("libraryFromArtifact", () => { assert.fail("Not an artifact library deployment"); } - assert.equal(anotherFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(anotherFuture.from, AccountRuntimeValueImplementation); + assert.equal(anotherFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index cd530003b2..99ee73bba2 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -1,9 +1,13 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; -import { SendDataFutureImplementation } from "../../src/new-api/internal/module"; +import { + AccountRuntimeValueImplementation, + SendDataFutureImplementation, +} from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { assertInstanceOf } from "./helpers"; describe("send", () => { it("should be able to setup a send", () => { @@ -190,10 +194,8 @@ describe("send", () => { assert.fail("Not a send data future"); } - assert.equal(sendFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(sendFuture.from, AccountRuntimeValueImplementation); + assert.equal(sendFuture.from.accountIndex, 1); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index c820139510..f7482390a2 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -2,11 +2,13 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { + AccountRuntimeValueImplementation, NamedContractCallFutureImplementation, NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { assertInstanceOf } from "./helpers"; describe("static call", () => { it("should be able to setup a static call", () => { @@ -220,10 +222,8 @@ describe("static call", () => { assert.fail("Not a named contract deployment"); } - assert.equal(callFuture.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); + assertInstanceOf(callFuture.from, AccountRuntimeValueImplementation); + assert.equal(callFuture.from.accountIndex, 1); }); describe("passing id", () => { From fc422e8f2e4246e6e252fb7c159776f1688386c2 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:49:17 -0300 Subject: [PATCH 0406/1302] Add support for AccountRuntimeValue as from --- .../new-api/stored-deployment-serializer.ts | 79 +++++++++++++++---- .../new-api/types/serialized-deployment.ts | 35 ++++---- packages/core/test/new-api/call.ts | 3 +- packages/core/test/new-api/contract.ts | 3 +- .../core/test/new-api/contractFromArtifact.ts | 2 +- packages/core/test/new-api/getAccount.ts | 21 +++-- packages/core/test/new-api/helpers.ts | 2 +- packages/core/test/new-api/library.ts | 3 +- .../core/test/new-api/libraryFromArtifact.ts | 2 +- packages/core/test/new-api/send.ts | 3 +- packages/core/test/new-api/staticCall.ts | 3 +- .../new-api/stored-deployment-serializer.ts | 28 ++++++- 12 files changed, 132 insertions(+), 52 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 7f07d5141e..1c7006c3c6 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -1,6 +1,7 @@ import { IgnitionError } from "../errors"; import { + AccountRuntimeValueImplementation, ArtifactContractAtFutureImplementation, ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, @@ -21,8 +22,10 @@ import { isAddressResolvableFuture, isContractFuture, isFuture, + isRuntimeValue, } from "./internal/utils"; import { + AccountRuntimeValue, AddressResolvableFuture, ArgumentType, ContractFuture, @@ -34,6 +37,7 @@ import { import { FutureToken, ModuleToken, + SerializedAccountRuntimeValue, SerializedArgumentType, SerializedArtifactContractAtFuture, SerializedArtifactContractDeploymentFuture, @@ -113,7 +117,9 @@ export class StoredDeploymentSerializer { constructorArgs: future.constructorArgs.map((arg) => this._serializeArgument(arg) ), - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), value: this._serializeBigint(future.value), }; @@ -133,7 +139,9 @@ export class StoredDeploymentSerializer { constructorArgs: future.constructorArgs.map((arg) => this._serializeArgument(arg) ), - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), value: this._serializeBigint(future.value), }; @@ -149,7 +157,9 @@ export class StoredDeploymentSerializer { this._convertFutureToFutureToken(d) ), contractName: future.contractName, - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), }; return serializedNamedLibraryDeploymentFuture; @@ -165,7 +175,9 @@ export class StoredDeploymentSerializer { ), contractName: future.contractName, artifact: future.artifact, - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), }; return serializedArtifactLibraryDeploymentFuture; @@ -183,7 +195,9 @@ export class StoredDeploymentSerializer { functionName: future.functionName, args: future.args.map((arg) => this._serializeArgument(arg)), value: this._serializeBigint(future.value), - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, }; return serializedNamedContractCallFuture; @@ -199,7 +213,9 @@ export class StoredDeploymentSerializer { contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, args: future.args.map((arg) => this._serializeArgument(arg)), - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, }; return serializedNamedStaticCallFuture; @@ -268,7 +284,9 @@ export class StoredDeploymentSerializer { : future.to, value: this._serializeBigint(future.value), data: future.data, - from: future.from, + from: isRuntimeValue(future.from) + ? this._serializeAccountRuntimeValue(future.from) + : future.from, }; return serializedSendDataFuture; } @@ -311,6 +329,11 @@ export class StoredDeploymentSerializer { return arg; } + private static _serializeAccountRuntimeValue( + arg: AccountRuntimeValue + ): SerializedAccountRuntimeValue { + return { _kind: "AccountRuntimeValue", accountIndex: arg.accountIndex }; + } private static _serializeBigint(n: bigint): SerializedBigInt { return { _kind: "bigint", value: n.toString(10) }; @@ -571,7 +594,9 @@ export class StoredDeploymentDeserializer { ]) ), this._deserializedBigint(serializedFuture.value), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: return new ArtifactContractDeploymentFutureImplementation( @@ -589,7 +614,9 @@ export class StoredDeploymentDeserializer { ]) ), this._deserializedBigint(serializedFuture.value), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.NAMED_LIBRARY_DEPLOYMENT: return new NamedLibraryDeploymentFutureImplementation( @@ -602,7 +629,9 @@ export class StoredDeploymentDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: return new ArtifactLibraryDeploymentFutureImplementation( @@ -616,7 +645,9 @@ export class StoredDeploymentDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.NAMED_CONTRACT_CALL: return new NamedContractCallFutureImplementation( @@ -631,7 +662,9 @@ export class StoredDeploymentDeserializer { this._deserializeArgument(arg, futuresLookup) ), this._deserializedBigint(serializedFuture.value), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.NAMED_STATIC_CALL: return new NamedStaticCallFutureImplementation( @@ -645,7 +678,9 @@ export class StoredDeploymentDeserializer { serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); case FutureType.NAMED_CONTRACT_AT: return new NamedContractAtFutureImplementation( @@ -700,7 +735,9 @@ export class StoredDeploymentDeserializer { : serializedFuture.to, this._deserializedBigint(serializedFuture.value), serializedFuture.data, - serializedFuture.from + this._isSerializedAccountRuntimeValue(serializedFuture.from) + ? this._deserializeAccountRuntimeValue(serializedFuture.from) + : serializedFuture.from ); } } @@ -714,4 +751,18 @@ export class StoredDeploymentDeserializer { return value; } + + private static _deserializeAccountRuntimeValue( + serialized: SerializedAccountRuntimeValue + ): AccountRuntimeValue { + return new AccountRuntimeValueImplementation(serialized.accountIndex); + } + + private static _isSerializedAccountRuntimeValue( + v: unknown + ): v is SerializedAccountRuntimeValue { + return ( + v instanceof Object && "_kind" in v && v._kind === "AccountRuntimeValue" + ); + } } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index b1446c0ea3..855bedba11 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -1,10 +1,5 @@ import { Artifact } from "./artifact"; -import { - FutureType, - IgnitionModule, - IgnitionModuleResult, - RuntimeValueType, -} from "./module"; +import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; /** * A serialized bigint. @@ -84,7 +79,7 @@ export interface SerializedNamedContractDeploymentFuture constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; value: SerializedBigInt; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -100,7 +95,7 @@ export interface SerializedArtifactContractDeploymentFuture artifact: Artifact; libraries: SerializedLibraries; value: SerializedBigInt; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -113,7 +108,7 @@ export interface SerializedNamedLibraryDeploymentFuture type: FutureType.NAMED_LIBRARY_DEPLOYMENT; contractName: string; libraries: SerializedLibraries; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -127,7 +122,7 @@ export interface SerializedArtifactLibraryDeploymentFuture contractName: string; artifact: Artifact; libraries: SerializedLibraries; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -142,7 +137,7 @@ export interface SerializedNamedContractCallFuture contract: FutureToken; args: SerializedArgumentType[]; value: SerializedBigInt; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -155,7 +150,7 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { functionName: string; contract: FutureToken; args: SerializedArgumentType[]; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } /** @@ -207,11 +202,23 @@ export interface SerializedSendDataFuture extends BaseSerializedFuture { to: string | FutureToken; value: SerializedBigInt; data: string | undefined; - from: string | undefined; + from: string | SerializedAccountRuntimeValue | undefined; } +/** + * The srialized version of RuntimeValue. + * + * @beta + */ +export type SerializedRuntimeValue = SerializedAccountRuntimeValue; + +/** + * The serialized version of AccountRuntimeValue. + * + * @beta + */ export interface SerializedAccountRuntimeValue { - type: RuntimeValueType.ACCOUNT; + _kind: "AccountRuntimeValue"; accountIndex: number; } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 3765d1e12b..ab122f72f3 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -6,7 +6,8 @@ import { NamedContractCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { FutureType } from "../../src/new-api/types/module"; + import { assertInstanceOf } from "./helpers"; describe("call", () => { diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index dbab3d90ff..d69a13ec4b 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -6,7 +6,8 @@ import { NamedContractDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { FutureType } from "../../src/new-api/types/module"; + import { assertInstanceOf } from "./helpers"; describe("contract", () => { diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index c553786cb4..955bc544fe 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,12 +1,12 @@ import { assert } from "chai"; -import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, ArtifactContractDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + import { assertInstanceOf } from "./helpers"; describe("contractFromArtifact", () => { diff --git a/packages/core/test/new-api/getAccount.ts b/packages/core/test/new-api/getAccount.ts index 05acab7fce..09f181efce 100644 --- a/packages/core/test/new-api/getAccount.ts +++ b/packages/core/test/new-api/getAccount.ts @@ -1,16 +1,17 @@ import { assert } from "chai"; -import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; +import { AccountRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { assertInstanceOf } from "./helpers"; + describe("getAccount", () => { it("should return the correct RuntimeValue", () => { const defintion = defineModule("MyModule", (m) => { - const account1 = m.getAccount(1); const account2 = m.getAccount(2); - const contract = m.contract("Contract", [account1], { from: account2 }); + const contract = m.contract("Contract", [], { from: account2 }); return { contract }; }); @@ -18,14 +19,10 @@ describe("getAccount", () => { const constructor = new ModuleConstructor(); const mod = constructor.construct(defintion); - assert.deepEqual(mod.results.contract.constructorArgs[0], { - type: RuntimeValueType.ACCOUNT, - accountIndex: 1, - }); - - assert.deepEqual(mod.results.contract.from, { - type: RuntimeValueType.ACCOUNT, - accountIndex: 2, - }); + assertInstanceOf( + mod.results.contract.from, + AccountRuntimeValueImplementation + ); + assert.equal(mod.results.contract.from.accountIndex, 2); }); }); diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index f49292d17d..b66946fe00 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; export function assertInstanceOf( obj: unknown, - klass: { new (...args: any[]): ObjectT } + klass: new (...args: any[]) => ObjectT ): asserts obj is ObjectT { assert.instanceOf(obj, klass, `Not a valid instace of ${klass.name}`); } diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index ce529afb72..2c5ad1dc0f 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -6,7 +6,8 @@ import { NamedLibraryDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { FutureType } from "../../src/new-api/types/module"; + import { assertInstanceOf } from "./helpers"; describe("library", () => { diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 1cff3a645b..353df81df9 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,12 +1,12 @@ import { assert } from "chai"; -import { RuntimeValueType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, ArtifactLibraryDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; + import { assertInstanceOf } from "./helpers"; describe("libraryFromArtifact", () => { diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 99ee73bba2..e4edd044f1 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -6,7 +6,8 @@ import { SendDataFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { FutureType } from "../../src/new-api/types/module"; + import { assertInstanceOf } from "./helpers"; describe("send", () => { diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index f7482390a2..1f61669449 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -7,7 +7,8 @@ import { NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; -import { FutureType, RuntimeValueType } from "../../src/new-api/types/module"; +import { FutureType } from "../../src/new-api/types/module"; + import { assertInstanceOf } from "./helpers"; describe("static call", () => { diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index fb710b4520..f7349acf97 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -580,7 +580,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -596,7 +596,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ @@ -611,14 +611,34 @@ describe("stored deployment serializer", () => { 1n, [1, 1n, "asd", { a: ["asd", false] }], ]); + const contract2 = m.contract("Contract2", [ - { a: ["asd", false, { b: 1n, contract: contract1 }] }, + { + a: ["asd", false, { b: 1n, contract: contract1 }], + }, ]); return { contract1, contract2 }; }); - const constructor = new ModuleConstructor(0, []); + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("Should support AccountRuntimeValues as from", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [], { from: account1 }); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); assertSerializableModuleIn({ From 6ecc0dafae2e85c887478fe98829e442ace182f6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:53:35 -0300 Subject: [PATCH 0407/1302] Fix `address` argument of m.ContractAt actions --- packages/core/src/new-api/internal/module-builder.ts | 4 ++-- packages/core/src/new-api/types/module-builder.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index b3c6221642..2898b4ea3a 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -357,7 +357,7 @@ export class IgnitionModuleBuilderImplementation< public contractAt( contractName: ContractNameT, - address: string | NamedStaticCallFuture, + address: string | AddressResolvableFuture, options: ContractAtOptions = {} ): NamedContractAtFuture { const id = options.id ?? contractName; @@ -387,7 +387,7 @@ export class IgnitionModuleBuilderImplementation< public contractAtFromArtifact( contractName: string, - address: string | NamedStaticCallFuture, + address: string | AddressResolvableFuture, artifact: Artifact, options: ContractAtOptions = {} ): ArtifactContractAtFuture { diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index f1d218f1f9..5a986317f7 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -199,13 +199,13 @@ export interface IgnitionModuleBuilder { contractAt( contractName: ContractNameT, - address: string | NamedStaticCallFuture, + address: string | AddressResolvableFuture, options?: ContractAtOptions ): NamedContractAtFuture; contractAtFromArtifact( contractName: string, - address: string | NamedStaticCallFuture, + address: string | AddressResolvableFuture, artifact: Artifact, options?: ContractAtOptions ): ArtifactContractAtFuture; From 97b4f9a8a24869e3440ca0e37b76f0a5d82402d6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 14:57:43 -0300 Subject: [PATCH 0408/1302] Add type tests for the values of the Type enums --- packages/core/test/new-api/types/module.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/packages/core/test/new-api/types/module.ts b/packages/core/test/new-api/types/module.ts index 37b5cd084b..2705fd9917 100644 --- a/packages/core/test/new-api/types/module.ts +++ b/packages/core/test/new-api/types/module.ts @@ -23,6 +23,12 @@ interface BaseRuntimeValue { type: RuntimeValueType; } +function _testThatTheValuesOfFutureTypeMatchTheKeys( + type: ValueT +): FutureType { + return FutureType[type]; +} + function _testThatEveryFutureIsBaseFuture(f: Future): BaseFuture { return f; } @@ -54,3 +60,9 @@ function _testThatEveryRuntimeValueTypeIsUsed( ): RuntimeValue["type"] { return type; } + +function _testThatTheValuesOfRuntimeValueTypeMatchTheKeys< + ValueT extends RuntimeValueType +>(type: ValueT): RuntimeValueType { + return RuntimeValueType[type]; +} From 586bb886f72094ae2738306d45b8e32ce1f1bf44 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 15:40:53 -0300 Subject: [PATCH 0409/1302] Add constructorArgs tests for NamedContractDeploymentFuture --- packages/core/src/new-api/types/module.ts | 7 +- packages/core/test/new-api/contract.ts | 120 ++++++++++++++++++++++ 2 files changed, 123 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0d4b38fc6f..99ff38b17e 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -13,7 +13,8 @@ export type BaseArgumentType = | boolean | ContractFuture | NamedStaticCallFuture - | ReadEventArgumentFuture; + | ReadEventArgumentFuture + | RuntimeValue; /** * Argument type that smart contracts can receive in their constructors and functions. @@ -310,9 +311,7 @@ export enum RuntimeValueType { * * @beta */ -export type RuntimeValue = - | AccountRuntimeValue - | ModuleParameterRuntimeValue; +export type RuntimeValue = AccountRuntimeValue; /** * A local account. diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index d69a13ec4b..502297c6d0 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -245,6 +245,126 @@ describe("contract", () => { assert.equal(anotherFuture.from.accountIndex, 1); }); + describe("Arguments", () => { + it("Should support base values as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [1, true, "string", 4n]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs, [ + 1, + true, + "string", + 4n, + ]); + }); + + it("Should support arrays as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [[1, 2, 3n]]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs[0], [1, 2, 3n]); + }); + + it("Should support objects as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [{ a: 1, b: [1, 2] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs[0], { + a: 1, + b: [1, 2], + }); + }); + + it("Should support futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [contract1]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.equal( + module.results.contract2.constructorArgs[0], + module.results.contract1 + ); + }); + + it("should support nested futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [{ arr: [contract1] }]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.equal( + (module.results.contract2.constructorArgs[0] as any).arr[0], + module.results.contract1 + ); + }); + + it("should support AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [account1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.contract1.constructorArgs[0], + AccountRuntimeValueImplementation + ); + assert.equal(module.results.contract1.constructorArgs[0].accountIndex, 1); + }); + + it("should support nested AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [{ arr: [account1] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const account = (module.results.contract1.constructorArgs[0] as any) + .arr[0]; + + assertInstanceOf(account, AccountRuntimeValueImplementation); + + assert.equal(account.accountIndex, 1); + }); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( From 9cf1e20e95c507e7a02f96c271077cd97b454fa9 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 15:43:42 -0300 Subject: [PATCH 0410/1302] Add constructorArgs tests for ArtifactContractDeployment --- .../core/test/new-api/contractFromArtifact.ts | 137 ++++++++++++++++++ 1 file changed, 137 insertions(+) diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 955bc544fe..f0f7f1ed5f 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -243,6 +243,143 @@ describe("contractFromArtifact", () => { assert.equal(anotherFuture.from.accountIndex, 1); }); + describe("Arguments", () => { + it("Should support base values as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + 1, + true, + "string", + 4n, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs, [ + 1, + true, + "string", + 4n, + ]); + }); + + it("Should support arrays as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + [1, 2, 3n], + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs[0], [1, 2, 3n]); + }); + + it("Should support objects as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + { a: 1, b: [1, 2] }, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.deepEqual(module.results.contract1.constructorArgs[0], { + a: 1, + b: [1, 2], + }); + }); + + it("Should support futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ + contract1, + ]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.equal( + module.results.contract2.constructorArgs[0], + module.results.contract1 + ); + }); + + it("should support nested futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ + { arr: [contract1] }, + ]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.equal( + (module.results.contract2.constructorArgs[0] as any).arr[0], + module.results.contract1 + ); + }); + + it("should support AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + account1, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.contract1.constructorArgs[0], + AccountRuntimeValueImplementation + ); + assert.equal(module.results.contract1.constructorArgs[0].accountIndex, 1); + }); + + it("should support nested AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + { arr: [account1] }, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const account = (module.results.contract1.constructorArgs[0] as any) + .arr[0]; + + assertInstanceOf(account, AccountRuntimeValueImplementation); + + assert.equal(account.accountIndex, 1); + }); + }); + describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( From 8bd769f0495885c29db75ad0bc03885e9a019ed0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 15:54:12 -0300 Subject: [PATCH 0411/1302] Add tests for NamedContractCallFutureImplementation's args --- packages/core/test/new-api/call.ts | 142 +++++++++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index ab122f72f3..4c54f39e08 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -222,6 +222,148 @@ describe("call", () => { assert.equal(callFuture.from.accountIndex, 1); }); + describe("Arguments", () => { + it("Should support base values as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [1, true, "string", 4n]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assert.deepEqual(future.args, [1, true, "string", 4n]); + }); + + it("Should support arrays as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [[1, 2, 3n]]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assert.deepEqual(future.args, [[1, 2, 3n]]); + }); + + it("Should support objects as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [{ a: 1, b: [1, 2] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assert.deepEqual(future.args, [{ a: 1, b: [1, 2] }]); + }); + + it("Should support futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [contract1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assert.equal(future.args[0], module.results.contract1); + }); + + it("should support nested futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [{ arr: [contract1] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assert.equal((future.args[0] as any).arr[0], module.results.contract1); + }); + + it("should support AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [account1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assertInstanceOf(future.args[0], AccountRuntimeValueImplementation); + assert.equal(future.args[0].accountIndex, 1); + }); + + it("should support nested AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [{ arr: [account1] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + const account = (future.args[0] as any).arr[0]; + + assertInstanceOf(account, AccountRuntimeValueImplementation); + + assert.equal(account.accountIndex, 1); + }); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { From 3751613534cf97f4ccabe7184492877605f0fabe Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 15:57:17 -0300 Subject: [PATCH 0412/1302] Add tests for NamedStaticCallFutureImplementation's args --- packages/core/test/new-api/staticCall.ts | 142 +++++++++++++++++++++++ 1 file changed, 142 insertions(+) diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 1f61669449..e1bd333df6 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -227,6 +227,148 @@ describe("static call", () => { assert.equal(callFuture.from.accountIndex, 1); }); + describe("Arguments", () => { + it("Should support base values as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [1, true, "string", 4n]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assert.deepEqual(future.args, [1, true, "string", 4n]); + }); + + it("Should support arrays as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [[1, 2, 3n]]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assert.deepEqual(future.args, [[1, 2, 3n]]); + }); + + it("Should support objects as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [{ a: 1, b: [1, 2] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assert.deepEqual(future.args, [{ a: 1, b: [1, 2] }]); + }); + + it("Should support futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [contract1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assert.equal(future.args[0], module.results.contract1); + }); + + it("should support nested futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [{ arr: [contract1] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assert.equal((future.args[0] as any).arr[0], module.results.contract1); + }); + + it("should support AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [account1]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assertInstanceOf(future.args[0], AccountRuntimeValueImplementation); + assert.equal(future.args[0].accountIndex, 1); + }); + + it("should support nested AccountRuntimeValues as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [{ arr: [account1] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + const account = (future.args[0] as any).arr[0]; + + assertInstanceOf(account, AccountRuntimeValueImplementation); + + assert.equal(account.accountIndex, 1); + }); + }); + describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { From 459756501b51296fe4a279080c7730f447600752 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 15:59:34 -0300 Subject: [PATCH 0413/1302] Improve argument serialization tests --- .../new-api/stored-deployment-serializer.ts | 90 +++++++++++++++---- 1 file changed, 74 insertions(+), 16 deletions(-) diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index f7349acf97..8f89e16fd1 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -572,6 +572,54 @@ describe("stored deployment serializer", () => { }); describe("Complex arguments serialization", () => { + it("Should support base values as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [1, true, "string", 4n]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("Should support arrays as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [[1, 2, 3n]]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("Should support objects as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", [{ a: 1, b: [1, 2] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + it("Should support futures as arguments", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contract("Contract1"); @@ -589,9 +637,27 @@ describe("stored deployment serializer", () => { }); }); - it("Should support bigint as arguments", () => { + it("should support nested futures as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [{ arr: [contract1] }]); + + return { contract1, contract2 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.equal( + (module.results.contract2.constructorArgs[0] as any).arr[0], + module.results.contract1 + ); + }); + + it("should support AccountRuntimeValues as arguments", () => { const moduleDefinition = defineModule("Module", (m) => { - const contract1 = m.contract("Contract1", [1n]); + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [account1]); return { contract1 }; }); @@ -605,20 +671,12 @@ describe("stored deployment serializer", () => { }); }); - it("Should support complex arguments as arguments", () => { + it("should support AccountRuntimeValues as from", () => { const moduleDefinition = defineModule("Module", (m) => { - const contract1 = m.contract("Contract1", [ - 1n, - [1, 1n, "asd", { a: ["asd", false] }], - ]); - - const contract2 = m.contract("Contract2", [ - { - a: ["asd", false, { b: 1n, contract: contract1 }], - }, - ]); + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [], { from: account1 }); - return { contract1, contract2 }; + return { contract1 }; }); const constructor = new ModuleConstructor(); @@ -630,10 +688,10 @@ describe("stored deployment serializer", () => { }); }); - it("Should support AccountRuntimeValues as from", () => { + it("should support nested AccountRuntimeValues as arguments", () => { const moduleDefinition = defineModule("Module", (m) => { const account1 = m.getAccount(1); - const contract1 = m.contract("Contract1", [], { from: account1 }); + const contract1 = m.contract("Contract1", [{ arr: [account1] }]); return { contract1 }; }); From 1c9464ac2813c067d2ca9592c4523d4bde110206 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 16:09:47 -0300 Subject: [PATCH 0414/1302] Create type-guards module and expose it --- packages/core/src/index.ts | 1 + .../core/src/new-api/internal/isFutureType.ts | 8 ++ packages/core/src/new-api/internal/utils.ts | 72 +--------- .../new-api/stored-deployment-serializer.ts | 2 +- packages/core/src/new-api/type-guards.ts | 131 ++++++++++++++++++ packages/core/src/ui-helpers.ts | 1 + 6 files changed, 144 insertions(+), 71 deletions(-) create mode 100644 packages/core/src/new-api/internal/isFutureType.ts create mode 100644 packages/core/src/new-api/type-guards.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 8b5c55f5f6..e0886a184b 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -9,6 +9,7 @@ export * from "./new-api/types/artifact"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; +export * from "./new-api/type-guards"; export * from "./types/dsl"; export * from "./types/future"; export * from "./types/hardhat"; diff --git a/packages/core/src/new-api/internal/isFutureType.ts b/packages/core/src/new-api/internal/isFutureType.ts new file mode 100644 index 0000000000..441f722029 --- /dev/null +++ b/packages/core/src/new-api/internal/isFutureType.ts @@ -0,0 +1,8 @@ +import { FutureType } from "../types/module"; + +export function isFutureType(potential: unknown): potential is FutureType { + return ( + typeof potential === "string" && + (FutureType as any)[potential] !== undefined + ); +} diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index d44f6c0cc1..3a9b97defc 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,55 +1,5 @@ -import { - AddressResolvableFuture, - ArgumentType, - ContractFuture, - Future, - FutureType, - RuntimeValue, - RuntimeValueType, -} from "../types/module"; - -export function isFutureType(potential: unknown): potential is FutureType { - return ( - typeof potential === "string" && - (FutureType as any)[potential] !== undefined - ); -} - -export function isFuture(potential: unknown): potential is Future { - return ( - typeof potential === "object" && - potential !== null && - "type" in potential && - isFutureType(potential.type) - ); -} - -export function isContractFuture( - future: Future -): future is ContractFuture { - switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - case FutureType.NAMED_LIBRARY_DEPLOYMENT: - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - case FutureType.NAMED_CONTRACT_AT: - case FutureType.ARTIFACT_CONTRACT_AT: - return true; - - default: - return false; - } -} - -export function isAddressResolvableFuture( - future: Future -): future is AddressResolvableFuture { - return ( - isContractFuture(future) || - future.type === FutureType.NAMED_STATIC_CALL || - future.type === FutureType.READ_EVENT_ARGUMENT - ); -} +import { isFuture } from "../type-guards"; +import { ArgumentType, Future } from "../types/module"; export function getFutures(args: ArgumentType[]): Future[] { return args.flatMap(_getFutures); @@ -70,21 +20,3 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } - -export function isRuntimeValueType( - potential: unknown -): potential is RuntimeValueType { - return ( - typeof potential === "string" && - (RuntimeValueType as any)[potential] !== undefined - ); -} - -export function isRuntimeValue(potential: unknown): potential is RuntimeValue { - return ( - typeof potential === "object" && - potential !== null && - "type" in potential && - isRuntimeValueType(potential.type) - ); -} diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 1c7006c3c6..871933e71b 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -23,7 +23,7 @@ import { isContractFuture, isFuture, isRuntimeValue, -} from "./internal/utils"; +} from "./type-guards"; import { AccountRuntimeValue, AddressResolvableFuture, diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts new file mode 100644 index 0000000000..916d7bb151 --- /dev/null +++ b/packages/core/src/new-api/type-guards.ts @@ -0,0 +1,131 @@ +import { + AddressResolvableFuture, + ContractFuture, + DeploymentFuture, + FunctionCallFuture, + Future, + FutureType, + RuntimeValue, + RuntimeValueType, +} from "./types/module"; + +/** + * Returns true if potential is of type FutureType. + * + * @beta + */ +export function isFutureType(potential: unknown): potential is FutureType { + return ( + typeof potential === "string" && + (FutureType as any)[potential] !== undefined + ); +} + +/** + * Returns true if potential is of type Future. + * + * @beta + */ +export function isFuture(potential: unknown): potential is Future { + return ( + typeof potential === "object" && + potential !== null && + "type" in potential && + isFutureType(potential.type) + ); +} + +/** + * Returns true if future is of type ContractFuture. + * + * @beta + */ +export function isContractFuture( + future: Future +): future is ContractFuture { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_CONTRACT_AT: + case FutureType.ARTIFACT_CONTRACT_AT: + return true; + + default: + return false; + } +} + +/** + * Returns true if future is of type AddressResolvable. + * + * @beta + */ +export function isAddressResolvableFuture( + future: Future +): future is AddressResolvableFuture { + return ( + isContractFuture(future) || + future.type === FutureType.NAMED_STATIC_CALL || + future.type === FutureType.READ_EVENT_ARGUMENT + ); +} + +/** + * Returns true if future is of type FunctionCallFuture. + * + * @beta + */ +export function isFunctionCallFuture( + future: Future +): future is FunctionCallFuture { + return ( + future.type === FutureType.NAMED_CONTRACT_CALL || + future.type === FutureType.NAMED_STATIC_CALL + ); +} + +/** + * Returns true if future is of type DeploymentFuture. + * + * @beta + */ +export function isDeploymentFuture( + future: Future +): future is DeploymentFuture { + return ( + future.type === FutureType.NAMED_CONTRACT_DEPLOYMENT || + future.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT || + future.type === FutureType.NAMED_LIBRARY_DEPLOYMENT || + future.type === FutureType.ARTIFACT_LIBRARY_DEPLOYMENT + ); +} + +/** + * Returns true if potential is of type RuntimeValueType. + * + * @beta + */ +export function isRuntimeValueType( + potential: unknown +): potential is RuntimeValueType { + return ( + typeof potential === "string" && + (RuntimeValueType as any)[potential] !== undefined + ); +} + +/** + * Returns true if potential is of type RuntimeValue. + * + * @beta + */ +export function isRuntimeValue(potential: unknown): potential is RuntimeValue { + return ( + typeof potential === "object" && + potential !== null && + "type" in potential && + isRuntimeValueType(potential.type) + ); +} diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts index a81da584d9..befa804525 100644 --- a/packages/core/src/ui-helpers.ts +++ b/packages/core/src/ui-helpers.ts @@ -4,3 +4,4 @@ export { } from "./new-api/stored-deployment-serializer"; export * from "./new-api/types/module"; export * from "./new-api/types/serialized-deployment"; +export * from "./new-api/type-guards"; From 4194477c502137694e3798f1a32a84893031c003 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 16:16:28 -0300 Subject: [PATCH 0415/1302] Update the UI to support AccountRuntimeValue --- .../components/future-summary.tsx | 7 +++- packages/ui/src/queries/futures.ts | 2 +- packages/ui/src/utils/guards.ts | 37 ------------------- 3 files changed, 7 insertions(+), 39 deletions(-) delete mode 100644 packages/ui/src/utils/guards.ts diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index a26cfb1b19..73b519506b 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -3,10 +3,11 @@ import { Future, FutureType, StoredDeployment, + isFuture, + isRuntimeValue, } from "@ignored/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; import { SummaryHeader } from "../../../components/summary-header"; -import { isFuture } from "../../../utils/guards"; export const FutureSummary: React.FC<{ deployment: StoredDeployment; @@ -75,6 +76,10 @@ function argumentTypeToString(argument: ArgumentType): string { return ``; } + if (isRuntimeValue(value)) { + return ``; + } + return value; }, 2 diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index b6cab7fbe5..a7ff57da3b 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -3,8 +3,8 @@ import { FunctionCallFuture, Future, StoredDeployment, + isDeploymentFuture, } from "@ignored/ignition-core/ui-helpers"; -import { isFunctionCallFuture, isDeploymentFuture } from "../utils/guards"; export function getFutureById( deployment: StoredDeployment, diff --git a/packages/ui/src/utils/guards.ts b/packages/ui/src/utils/guards.ts deleted file mode 100644 index 340c0b6f5b..0000000000 --- a/packages/ui/src/utils/guards.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - Future, - FutureType, - DeploymentFuture, - FunctionCallFuture, -} from "@ignored/ignition-core/ui-helpers"; - -export function isFuture(potential: unknown): potential is Future { - return ( - potential instanceof Object && - "type" in potential && - typeof potential.type === "number" && - FutureType[potential.type] !== undefined - ); -} - -export function isDeploymentFuture(f: Future): f is DeploymentFuture { - const deployFutureTypeIds = [ - FutureType.NAMED_CONTRACT_DEPLOYMENT, - FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.NAMED_LIBRARY_DEPLOYMENT, - FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, - ]; - - return deployFutureTypeIds.includes(f.type); -} - -export function isFunctionCallFuture( - f: Future -): f is FunctionCallFuture { - const callFutureIds = [ - FutureType.NAMED_CONTRACT_CALL, - FutureType.NAMED_STATIC_CALL, - ]; - - return callFutureIds.includes(f.type); -} From 02636f527e5df96091fafc10dab5dec2e67e77d6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 17:00:52 -0300 Subject: [PATCH 0416/1302] Use ModuleParameterRuntimeValue in getParamter --- .../src/new-api/internal/module-builder.ts | 28 ++- packages/core/src/new-api/internal/module.ts | 31 ++++ packages/core/src/new-api/internal/utils.ts | 9 + .../core/src/new-api/types/module-builder.ts | 11 +- packages/core/src/new-api/types/module.ts | 6 +- packages/core/test/new-api/getParameter.ts | 161 +++++++++++------- 6 files changed, 160 insertions(+), 86 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 2898b4ea3a..7cf8fa4ce7 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -13,6 +13,7 @@ import { ContractFuture, IgnitionModule, IgnitionModuleResult, + ModuleParameterRuntimeValue, ModuleParameterType, ModuleParameters, NamedContractAtFuture, @@ -42,6 +43,7 @@ import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, IgnitionModuleImplementation, + ModuleParameterRuntimeValueImplementation, NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, @@ -139,6 +141,16 @@ export class IgnitionModuleBuilderImplementation< return new AccountRuntimeValueImplementation(accountIndex); } + public getParameter( + parameterName: string, + defaultValue?: ParamTypeT + ): ModuleParameterRuntimeValue { + return new ModuleParameterRuntimeValueImplementation( + parameterName, + defaultValue + ); + } + public contract( contractName: ContractNameT, args: ArgumentType[] = [], @@ -417,22 +429,6 @@ export class IgnitionModuleBuilderImplementation< return future; } - public getParameter( - parameterName: string, - defaultValue?: ParamType - ): ParamType { - const param = this.parameters[parameterName] ?? defaultValue; - - if (param === undefined) { - this._throwErrorWithStackTrace( - `Module parameter '${parameterName}' is required, but none was given`, - this.getParameter - ); - } - - return param as ParamType; - } - public readEventArgument( futureToReadFrom: | NamedContractDeploymentFuture diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index f366f8d513..d8c8241463 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -11,6 +11,8 @@ import { FutureType, IgnitionModule, IgnitionModuleResult, + ModuleParameterRuntimeValue, + ModuleParameterType, NamedContractAtFuture, NamedContractCallFuture, NamedContractDeploymentFuture, @@ -21,6 +23,8 @@ import { SendDataFuture, } from "../types/module"; +import { jsonStringifyWithBigint } from "./utils"; + const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); abstract class BaseFutureImplementation { @@ -271,3 +275,30 @@ export class AccountRuntimeValueImplementation implements AccountRuntimeValue { }`; } } + +export class ModuleParameterRuntimeValueImplementation< + ParamTypeT extends ModuleParameterType +> implements ModuleParameterRuntimeValue +{ + public readonly type = RuntimeValueType.MODULE_PARAMETER; + + constructor( + public readonly name: string, + public readonly defaultValue: ParamTypeT | undefined + ) {} + + public [customInspectSymbol]( + _depth: number, + _inspectOptions: {}, + _inspect: (arg: {}) => string + ) { + return `Module Parameter RuntimeValue { + name: ${this.name}${ + this.defaultValue !== undefined + ? ` + default value: ${jsonStringifyWithBigint(this.defaultValue)}` + : "" + } +}`; + } +} diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 3a9b97defc..482e01f1b9 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -20,3 +20,12 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } + +export function jsonStringifyWithBigint(value: unknown, prettyPrint = true) { + return JSON.stringify( + value, + (_: string, v: any) => + typeof v === "bigint" ? { $bigint: v.toString(10) } : v, + prettyPrint ? 2 : undefined + ); +} diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 5a986317f7..95379ee98e 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -9,6 +9,7 @@ import { ContractFuture, Future, IgnitionModuleResult, + ModuleParameterRuntimeValue, ModuleParameterType, NamedContractAtFuture, NamedContractCallFuture, @@ -159,6 +160,11 @@ export interface SendDataOptions { export interface IgnitionModuleBuilder { getAccount(accountIndex: number): AccountRuntimeValue; + getParameter( + parameterName: string, + defaultValue?: ParamTypeT + ): ModuleParameterRuntimeValue; + contract( contractName: ContractNameT, args?: ArgumentType[], @@ -210,11 +216,6 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): ArtifactContractAtFuture; - getParameter( - parameterName: string, - defaultValue?: ParamType - ): ParamType; - readEventArgument( futureToReadFrom: | NamedContractDeploymentFuture diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 99ff38b17e..6a7d0c0a69 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -311,7 +311,9 @@ export enum RuntimeValueType { * * @beta */ -export type RuntimeValue = AccountRuntimeValue; +export type RuntimeValue = + | AccountRuntimeValue + | ModuleParameterRuntimeValue; /** * A local account. @@ -333,7 +335,7 @@ export interface ModuleParameterRuntimeValue< > { type: RuntimeValueType.MODULE_PARAMETER; name: string; - defaultValue?: ParamTypeT; + defaultValue: ParamTypeT | undefined; } /** diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index 82161c41dc..08f57303b7 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -1,93 +1,128 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; -import { NamedContractDeploymentFutureImplementation } from "../../src/new-api/internal/module"; +import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { ModuleParameterType } from "../../src/new-api/types/module"; + +import { assertInstanceOf } from "./helpers"; describe("getParameter", () => { - it("should record given parameters", () => { - const constructor = new ModuleConstructor({ - TestModule: { param1: 42 }, - }); + describe("Without default value", function () { + it("should return the correct RuntimeValue", () => { + const defintion = defineModule("MyModule", (m) => { + const p = m.getParameter("p"); - assert.equal(constructor.parameters.TestModule.param1, 42); - }); + const contract = m.contract("Contract", [p]); - it("should allow a parameter to be passed as an arg", () => { - const moduleWithParamsDefinition = defineModule("Module1", (m) => { - const arg1 = m.getParameter("param1"); - const contract1 = m.contract("Contract1", [arg1]); + return { contract }; + }); - return { contract1 }; - }); + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); - const constructor = new ModuleConstructor({ - Module1: { param1: "arg1" }, + const param = mod.results.contract.constructorArgs[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, undefined); }); - const moduleWithParams = constructor.construct(moduleWithParamsDefinition); + }); - assert.isDefined(moduleWithParams); + describe("With default value", function () { + it("should accept base values as default", () => { + const defintion = defineModule("MyModule", (m) => { + const s = m.getParameter("string", "default"); + const n = m.getParameter("number", 1); + const bi = m.getParameter("bigint", 1n); + const b = m.getParameter("boolean", true); - const contractFuture = [...moduleWithParams.futures].find( - ({ id }) => id === "Module1:Contract1" - ); + const contract = m.contract("Contract", [s, n, bi, b]); - if ( - !(contractFuture instanceof NamedContractDeploymentFutureImplementation) - ) { - assert.fail("Not a named contract deployment"); - } + return { contract }; + }); - assert.equal(contractFuture.constructorArgs.length, 1); - assert.equal(contractFuture.constructorArgs[0], "arg1"); - }); + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); - it("should allow a parameter to have a default value", () => { - const moduleWithParamsDefinition = defineModule("Module1", (m) => { - const arg1 = m.getParameter("param1", "arg1"); - const arg2 = m.getParameter("param2", 42); - const contract1 = m.contract("Contract1", [arg1, arg2]); + const isS = mod.results.contract.constructorArgs[0]; + const isN = mod.results.contract.constructorArgs[1]; + const isBi = mod.results.contract.constructorArgs[2]; + const isB = mod.results.contract.constructorArgs[3]; - return { contract1 }; - }); + assertInstanceOf(isS, ModuleParameterRuntimeValueImplementation); + assert.equal(isS.name, "string"); + assert.equal(isS.defaultValue, "default"); + + assertInstanceOf(isN, ModuleParameterRuntimeValueImplementation); + assert.equal(isN.name, "number"); + assert.equal(isN.defaultValue, 1); - const constructor = new ModuleConstructor({ - Module1: { - param1: "overriddenParam", - }, + assertInstanceOf(isBi, ModuleParameterRuntimeValueImplementation); + assert.equal(isBi.name, "bigint"); + assert.equal(isBi.defaultValue, 1n); + + assertInstanceOf(isB, ModuleParameterRuntimeValueImplementation); + assert.equal(isB.name, "boolean"); + assert.equal(isB.defaultValue, true); }); - const moduleWithParams = constructor.construct(moduleWithParamsDefinition); - assert.isDefined(moduleWithParams); + it("Should accept arrays as deafult", () => { + const defaultValue: ModuleParameterType = [1, "dos", 3n, false]; + const defintion = defineModule("MyModule", (m) => { + const p = m.getParameter("p", defaultValue); - const contractFuture = [...moduleWithParams.futures].find( - ({ id }) => id === "Module1:Contract1" - ); + const contract = m.contract("Contract", [p]); - if ( - !(contractFuture instanceof NamedContractDeploymentFutureImplementation) - ) { - assert.fail("Not a named contract deployment"); - } + return { contract }; + }); - assert.equal(contractFuture.constructorArgs.length, 2); - assert.equal(contractFuture.constructorArgs[0], "overriddenParam"); - assert.equal(contractFuture.constructorArgs[1], 42); - }); + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); - it("should throw if a parameter has no value", () => { - const moduleWithParamsDefinition = defineModule("Module1", (m) => { - const arg1 = m.getParameter("param1"); - const contract1 = m.contract("Contract1", [arg1]); + const param = mod.results.contract.constructorArgs[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.deepEqual(param.defaultValue, defaultValue); + }); + + it("Should accept objects as deafult", () => { + const defaultValue: ModuleParameterType = { a: 1, b: "dos", c: 3n }; + const defintion = defineModule("MyModule", (m) => { + const p = m.getParameter("p", defaultValue); + + const contract = m.contract("Contract", [p]); + + return { contract }; + }); + + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); - return { contract1 }; + const param = mod.results.contract.constructorArgs[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.deepEqual(param.defaultValue, defaultValue); }); - const constructor = new ModuleConstructor(); + it("Should accept complex combinations as deafult", () => { + const defaultValue: ModuleParameterType = { + arr: [123, { a: [{ o: true }] }], + }; + const defintion = defineModule("MyModule", (m) => { + const p = m.getParameter("p", defaultValue); - assert.throws( - () => constructor.construct(moduleWithParamsDefinition), - /Module parameter 'param1' is required, but none was given/ - ); + const contract = m.contract("Contract", [p]); + + return { contract }; + }); + + const constructor = new ModuleConstructor(); + const mod = constructor.construct(defintion); + + const param = mod.results.contract.constructorArgs[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.deepEqual(param.defaultValue, defaultValue); + }); }); }); From 04b315d10f4b7104141fe8e32eb81ded334298e4 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 17:06:39 -0300 Subject: [PATCH 0417/1302] Misc fixes in UI and plugin --- packages/hardhat-plugin/src/index.ts | 6 +----- .../future-details/components/future-summary.tsx | 13 ++++++++++++- .../src/pages/plan-overview/components/action.tsx | 2 +- packages/ui/src/queries/futures.ts | 1 + 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 421ace1abd..a9159e24fb 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -201,11 +201,7 @@ task("plan") }) ); - const accounts = (await hre.network.provider.request({ - method: "eth_accounts", - })) as string[]; - - const constructor = new ModuleConstructor(chainId, accounts); + const constructor = new ModuleConstructor(); const module = constructor.construct(userModule); await writePlan( diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index 73b519506b..e9fa3d84ac 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -2,6 +2,7 @@ import { ArgumentType, Future, FutureType, + RuntimeValueType, StoredDeployment, isFuture, isRuntimeValue, @@ -77,7 +78,17 @@ function argumentTypeToString(argument: ArgumentType): string { } if (isRuntimeValue(value)) { - return ``; + if (value.type === RuntimeValueType.ACCOUNT) { + return ``; + } + + return ``; } return value; diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 8c7e04f7df..2534c64bdf 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -56,7 +56,7 @@ const Text = styled.p` margin: 0; `; -const ActionBtn = styled.div<{ futureType: number }>` +const ActionBtn = styled.div<{ futureType: FutureType }>` border: 1px solid black; padding: 1rem; font-weight: bold; diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index a7ff57da3b..e1fb165e79 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -4,6 +4,7 @@ import { Future, StoredDeployment, isDeploymentFuture, + isFunctionCallFuture, } from "@ignored/ignition-core/ui-helpers"; export function getFutureById( From 641d70dbfe83fdec8712bc5fd7287a79a0dc78d5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 17:14:52 -0300 Subject: [PATCH 0418/1302] Test ModuleParameterRuntimeValue as arguments --- packages/core/test/new-api/call.ts | 50 +++++++++++++++++++ packages/core/test/new-api/contract.ts | 40 +++++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 44 ++++++++++++++++ packages/core/test/new-api/staticCall.ts | 50 +++++++++++++++++++ 4 files changed, 184 insertions(+) diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 4c54f39e08..4fb05301fd 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, NamedContractCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -362,6 +363,55 @@ describe("call", () => { assert.equal(account.accountIndex, 1); }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [p]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + assertInstanceOf( + future.args[0], + ModuleParameterRuntimeValueImplementation + ); + assert.equal(future.args[0].name, "p"); + assert.equal(future.args[0].defaultValue, 123); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.call(contract1, "foo", [{ arr: [p] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ); + + assertInstanceOf(future, NamedContractCallFutureImplementation); + const param = (future.args[0] as any).arr[0]; + + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, 123); + }); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 502297c6d0..f7191c2e24 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, NamedContractDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -363,6 +364,45 @@ describe("contract", () => { assert.equal(account.accountIndex, 1); }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [p]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.contract1.constructorArgs[0], + ModuleParameterRuntimeValueImplementation + ); + assert.equal(module.results.contract1.constructorArgs[0].name, "p"); + assert.equal( + module.results.contract1.constructorArgs[0].defaultValue, + 123 + ); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const param = (module.results.contract1.constructorArgs[0] as any).arr[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, 123); + }); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index f0f7f1ed5f..a5ea9f6613 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -4,6 +4,7 @@ import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, ArtifactContractDeploymentFutureImplementation, + ModuleParameterRuntimeValueImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -378,6 +379,49 @@ describe("contractFromArtifact", () => { assert.equal(account.accountIndex, 1); }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + p, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.contract1.constructorArgs[0], + ModuleParameterRuntimeValueImplementation + ); + assert.equal(module.results.contract1.constructorArgs[0].name, "p"); + assert.equal( + module.results.contract1.constructorArgs[0].defaultValue, + 123 + ); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + { arr: [p] }, + ]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const param = (module.results.contract1.constructorArgs[0] as any).arr[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, 123); + }); }); describe("passing id", () => { diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index e1bd333df6..fdc116f51b 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, NamedContractCallFutureImplementation, NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; @@ -367,6 +368,55 @@ describe("static call", () => { assert.equal(account.accountIndex, 1); }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [p]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + assertInstanceOf( + future.args[0], + ModuleParameterRuntimeValueImplementation + ); + assert.equal(future.args[0].name, "p"); + assert.equal(future.args[0].defaultValue, 123); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.staticCall(contract1, "foo", [{ arr: [p] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.NAMED_STATIC_CALL + ); + + assertInstanceOf(future, NamedStaticCallFutureImplementation); + const param = (future.args[0] as any).arr[0]; + + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, 123); + }); }); describe("passing id", () => { From 2ccb395518f54e34d665ab18c1ee73cfb1b5a0ba Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:37:35 -0300 Subject: [PATCH 0419/1302] Simplify a custom inspect --- packages/core/src/new-api/internal/module.ts | 6 ++---- packages/core/src/new-api/internal/utils.ts | 9 --------- 2 files changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index d8c8241463..56cb3f096b 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -23,8 +23,6 @@ import { SendDataFuture, } from "../types/module"; -import { jsonStringifyWithBigint } from "./utils"; - const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); abstract class BaseFutureImplementation { @@ -290,13 +288,13 @@ export class ModuleParameterRuntimeValueImplementation< public [customInspectSymbol]( _depth: number, _inspectOptions: {}, - _inspect: (arg: {}) => string + inspect: (arg: {}) => string ) { return `Module Parameter RuntimeValue { name: ${this.name}${ this.defaultValue !== undefined ? ` - default value: ${jsonStringifyWithBigint(this.defaultValue)}` + default value: ${inspect(this.defaultValue)}` : "" } }`; diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 482e01f1b9..3a9b97defc 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -20,12 +20,3 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } - -export function jsonStringifyWithBigint(value: unknown, prettyPrint = true) { - return JSON.stringify( - value, - (_: string, v: any) => - typeof v === "bigint" ? { $bigint: v.toString(10) } : v, - prettyPrint ? 2 : undefined - ); -} From 22f58f2e8dcc0070b0c30a8f120e0b95dcb882b6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:41:26 -0300 Subject: [PATCH 0420/1302] Make serialization test more strict --- .../test/new-api/stored-deployment-serializer.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 8f89e16fd1..7304224d88 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -710,14 +710,18 @@ describe("stored deployment serializer", () => { function assertSerializableModuleIn(deployment: StoredDeployment) { const serialized = JSON.stringify( StoredDeploymentSerializer.serialize(deployment), + // This is not actually needed, but we use it to be able to compare the + // serialized string, which can be easier to debug. sortedKeysJsonStringifyReplacer, 2 ); + const deserialized = StoredDeploymentDeserializer.deserialize( + JSON.parse(serialized) + ); + const reserialized = JSON.stringify( - StoredDeploymentSerializer.serialize( - StoredDeploymentDeserializer.deserialize(JSON.parse(serialized)) - ), + StoredDeploymentSerializer.serialize(deserialized), sortedKeysJsonStringifyReplacer, 2 ); @@ -725,6 +729,12 @@ function assertSerializableModuleIn(deployment: StoredDeployment) { assert.equal( serialized, reserialized, + "Module serialization not the same across serialization/deserialization" + ); + + assert.deepEqual( + deployment, + deserialized, "Module not the same across serialization/deserialization" ); From e0f4403291fd1420503d604a582f5adfdb2bbb82 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:46:21 -0300 Subject: [PATCH 0421/1302] Preserve order of futures, submodules, results and libraries when serializing --- .../new-api/stored-deployment-serializer.ts | 47 +++++++++---------- .../new-api/types/serialized-deployment.ts | 16 ++----- 2 files changed, 25 insertions(+), 38 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 871933e71b..80abe54257 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -84,21 +84,16 @@ export class StoredDeploymentSerializer { ): SerializedStoredModule { return { id: userModule.id, - futures: Object.fromEntries( - Array.from(userModule.futures).map((future) => [ - future.id, - this._serializeFuture(future), - ]) + futures: Array.from(userModule.futures).map((future) => + this._serializeFuture(future) ), submodules: Array.from(userModule.submodules).map( this._convertModuleToModuleToken ), - results: Object.fromEntries( - Object.entries(userModule.results).map(([key, future]) => [ - key, - this._convertFutureToFutureToken(future), - ]) - ), + results: Object.entries(userModule.results).map(([key, future]) => [ + key, + this._convertFutureToFutureToken(future), + ]), }; } @@ -300,12 +295,10 @@ export class StoredDeploymentSerializer { private static _convertLibrariesToLibraryTokens( libraries: Record> ): SerializedLibraries { - return Object.fromEntries( - Object.entries(libraries).map(([key, lib]) => [ - key, - this._convertFutureToFutureToken(lib), - ]) - ); + return Object.entries(libraries).map(([key, lib]) => [ + key, + this._convertFutureToFutureToken(lib), + ]); } private static _serializeArgument(arg: ArgumentType): SerializedArgumentType { @@ -414,8 +407,6 @@ export class StoredDeploymentDeserializer { future.dependencies.add(dependency); } - future.module.futures.add(future); - futuresLookup.set(future.id, future); if (isContractFuture(future)) { @@ -430,15 +421,19 @@ export class StoredDeploymentDeserializer { for (const serializedModule of Object.values( serializedDeployment.modules )) { - for (const [name, futureToken] of Object.entries( - serializedModule.results - )) { + for (const [name, futureToken] of serializedModule.results) { const mod = this._lookup(modulesLookup, serializedModule.id); const contract = this._lookup( contractFuturesLookup, futureToken.futureId ); + mod.results[name] = contract; + + // Add futures to the module in the original order + for (const futureToken of serializedModule.futures) { + mod.futures.add(this._lookup(futuresLookup, futureToken.id)); + } } } @@ -588,7 +583,7 @@ export class StoredDeploymentDeserializer { this._deserializeArgument(arg, futuresLookup) ), Object.fromEntries( - Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + serializedFuture.libraries.map(([name, lib]) => [ name, this._lookup(contractFuturesLookup, lib.futureId), ]) @@ -608,7 +603,7 @@ export class StoredDeploymentDeserializer { ), serializedFuture.artifact, Object.fromEntries( - Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + serializedFuture.libraries.map(([name, lib]) => [ name, this._lookup(contractFuturesLookup, lib.futureId), ]) @@ -624,7 +619,7 @@ export class StoredDeploymentDeserializer { mod, serializedFuture.contractName, Object.fromEntries( - Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + serializedFuture.libraries.map(([name, lib]) => [ name, this._lookup(contractFuturesLookup, lib.futureId), ]) @@ -640,7 +635,7 @@ export class StoredDeploymentDeserializer { serializedFuture.contractName, serializedFuture.artifact, Object.fromEntries( - Object.entries(serializedFuture.libraries).map(([name, lib]) => [ + serializedFuture.libraries.map(([name, lib]) => [ name, this._lookup(contractFuturesLookup, lib.futureId), ]) diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 855bedba11..cc0ce32d7a 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -271,27 +271,21 @@ export interface SerializedStoredModule { * * @beta */ -export interface SerializedStoredSubmodules { - [key: string]: SerializedStoredModule; -} +export type SerializedStoredSubmodules = SerializedStoredModule[]; /** * The serialized futures that are executed in deploying a module. * * @beta */ -export interface SerializedStoredFutures { - [key: string]: SerializedFuture; -} +export type SerializedStoredFutures = SerializedFuture[]; /** * The serialized results of a module. * * @beta */ -export interface SerializedStoredResults { - [key: string]: FutureToken; -} +export type SerializedStoredResults = Array<[name: string, token: FutureToken]>; /** * The serialized libraries, where each library @@ -299,9 +293,7 @@ export interface SerializedStoredResults { * * @beta */ -export interface SerializedLibraries { - [key: string]: FutureToken; -} +export type SerializedLibraries = Array<[name: string, token: FutureToken]>; /** * The set of serialized future types From eb0f4185fe15e995550b03ca8ba45011d3ed0fd8 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:46:56 -0300 Subject: [PATCH 0422/1302] Add serialization support and tests for ModuleParameterRuntimeValue --- .../new-api/stored-deployment-serializer.ts | 92 ++++++++++++++++++- .../new-api/types/serialized-deployment.ts | 18 +++- .../new-api/stored-deployment-serializer.ts | 34 +++++++ 3 files changed, 139 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 80abe54257..3e5d2420da 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -6,6 +6,7 @@ import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, IgnitionModuleImplementation, + ModuleParameterRuntimeValueImplementation, NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, @@ -18,6 +19,7 @@ import { Graph, getNodesInTopologicalOrder, } from "./internal/topological-order"; + import { isAddressResolvableFuture, isContractFuture, @@ -33,6 +35,10 @@ import { FutureType, IgnitionModule, IgnitionModuleResult, + ModuleParameterRuntimeValue, + ModuleParameterType, + RuntimeValue, + RuntimeValueType, } from "./types/module"; import { FutureToken, @@ -45,12 +51,14 @@ import { SerializedBigInt, SerializedFuture, SerializedLibraries, + SerializedModuleParameterRuntimeValue, SerializedNamedContractAtFuture, SerializedNamedContractCallFuture, SerializedNamedContractDeploymentFuture, SerializedNamedLibraryDeploymentFuture, SerializedNamedStaticCallFuture, SerializedReadEventArgumentFuture, + SerializedRuntimeValue, SerializedSendDataFuture, SerializedStoredDeployment, SerializedStoredModule, @@ -310,6 +318,10 @@ export class StoredDeploymentSerializer { return this._convertFutureToFutureToken(arg); } + if (isRuntimeValue(arg)) { + return this._serializeRuntimeValue(arg); + } + if (Array.isArray(arg)) { return arg.map((a) => this._serializeArgument(a)); } @@ -322,16 +334,49 @@ export class StoredDeploymentSerializer { return arg; } + + private static _serializeRuntimeValue( + arg: RuntimeValue + ): SerializedRuntimeValue { + if (arg.type === RuntimeValueType.ACCOUNT) { + return this._serializeAccountRuntimeValue(arg); + } + + return this._serializeModuleParamterRuntimeValue(arg); + } + private static _serializeAccountRuntimeValue( arg: AccountRuntimeValue ): SerializedAccountRuntimeValue { return { _kind: "AccountRuntimeValue", accountIndex: arg.accountIndex }; } + private static _serializeModuleParamterRuntimeValue( + arg: ModuleParameterRuntimeValue + ): SerializedModuleParameterRuntimeValue { + return { + _kind: "ModuleParameterRuntimeValue", + name: arg.name, + defaultValue: + arg.defaultValue === undefined + ? undefined + : this._jsonStringifyWithBigint(arg.defaultValue), + }; + } + private static _serializeBigint(n: bigint): SerializedBigInt { return { _kind: "bigint", value: n.toString(10) }; } + private static _jsonStringifyWithBigint(value: unknown, prettyPrint = true) { + return JSON.stringify( + value, + (_: string, v: any) => + typeof v === "bigint" ? this._serializeBigint(v) : v, + prettyPrint ? 2 : undefined + ); + } + private static _convertFutureToFutureToken(future: Future): FutureToken { return { futureId: future.id, @@ -515,6 +560,14 @@ export class StoredDeploymentDeserializer { return swappedFuture; } + if (this._isSerializedAccountRuntimeValue(arg)) { + return this._deserializeAccountRuntimeValue(arg); + } + + if (this._isSerializedModuleParameterRuntimeValue(arg)) { + return this._deserializeModuleParameterRuntimeValue(arg); + } + if (this._isSerializedBigInt(arg)) { return this._deserializedBigint(arg); } @@ -539,6 +592,16 @@ export class StoredDeploymentDeserializer { return BigInt(n.value); } + private static _jsonParseWithBigint(jsonString: string): unknown { + return JSON.parse(jsonString, (k, v) => { + if (this._isSerializedBigInt(v)) { + return this._deserializedBigint(v); + } + + return v; + }); + } + private static _isSerializedFutureToken( arg: SerializedArgumentType ): arg is FutureToken { @@ -747,17 +810,40 @@ export class StoredDeploymentDeserializer { return value; } + private static _isSerializedAccountRuntimeValue( + v: unknown + ): v is SerializedAccountRuntimeValue { + return ( + v instanceof Object && "_kind" in v && v._kind === "AccountRuntimeValue" + ); + } + private static _deserializeAccountRuntimeValue( serialized: SerializedAccountRuntimeValue ): AccountRuntimeValue { return new AccountRuntimeValueImplementation(serialized.accountIndex); } - private static _isSerializedAccountRuntimeValue( + private static _isSerializedModuleParameterRuntimeValue( v: unknown - ): v is SerializedAccountRuntimeValue { + ): v is SerializedModuleParameterRuntimeValue { return ( - v instanceof Object && "_kind" in v && v._kind === "AccountRuntimeValue" + v instanceof Object && + "_kind" in v && + v._kind === "ModuleParameterRuntimeValue" + ); + } + + private static _deserializeModuleParameterRuntimeValue( + serialized: SerializedModuleParameterRuntimeValue + ): ModuleParameterRuntimeValue { + return new ModuleParameterRuntimeValueImplementation( + serialized.name, + serialized.defaultValue === undefined + ? undefined + : (this._jsonParseWithBigint( + serialized.defaultValue + ) as ModuleParameterType) ); } } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index cc0ce32d7a..27795a3924 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -21,7 +21,8 @@ export type SerializedBaseArgumentType = | SerializedBigInt | string | boolean - | FutureToken; + | FutureToken + | SerializedRuntimeValue; /** * The serialized version of ArgumentType @@ -210,7 +211,9 @@ export interface SerializedSendDataFuture extends BaseSerializedFuture { * * @beta */ -export type SerializedRuntimeValue = SerializedAccountRuntimeValue; +export type SerializedRuntimeValue = + | SerializedAccountRuntimeValue + | SerializedModuleParameterRuntimeValue; /** * The serialized version of AccountRuntimeValue. @@ -222,6 +225,17 @@ export interface SerializedAccountRuntimeValue { accountIndex: number; } +/** + * The serialized version of ModuleParameterRuntimeValue. + * + * @beta + */ +export interface SerializedModuleParameterRuntimeValue { + _kind: "ModuleParameterRuntimeValue"; + name: string; + defaultValue: string | undefined; +} + /** * The details of a deployment that will be used in the UI. * diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 7304224d88..2fd9d7b368 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -704,6 +704,40 @@ describe("stored deployment serializer", () => { module, }); }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [p]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const moduleDefinition = defineModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); }); }); From 4c7ae8840464f9abd6c6caa4df008d871b3b652e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:51:07 -0300 Subject: [PATCH 0423/1302] Fix deserialization algorithm --- .../core/src/new-api/stored-deployment-serializer.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 3e5d2420da..8b4ea8fedb 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -19,7 +19,6 @@ import { Graph, getNodesInTopologicalOrder, } from "./internal/topological-order"; - import { isAddressResolvableFuture, isContractFuture, @@ -466,19 +465,20 @@ export class StoredDeploymentDeserializer { for (const serializedModule of Object.values( serializedDeployment.modules )) { + const mod = this._lookup(modulesLookup, serializedModule.id); + for (const [name, futureToken] of serializedModule.results) { - const mod = this._lookup(modulesLookup, serializedModule.id); const contract = this._lookup( contractFuturesLookup, futureToken.futureId ); mod.results[name] = contract; + } - // Add futures to the module in the original order - for (const futureToken of serializedModule.futures) { - mod.futures.add(this._lookup(futuresLookup, futureToken.id)); - } + // Add futures to the module in the original order + for (const futureToken of serializedModule.futures) { + mod.futures.add(this._lookup(futuresLookup, futureToken.id)); } } From 95040ee107d7259b890d60cf04b01f5a63782705 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 18:52:25 -0300 Subject: [PATCH 0424/1302] Delete unused files --- packages/core/src/new-api/examples.ts | 51 ------------------- .../core/src/new-api/internal/isFutureType.ts | 8 --- 2 files changed, 59 deletions(-) delete mode 100644 packages/core/src/new-api/examples.ts delete mode 100644 packages/core/src/new-api/internal/isFutureType.ts diff --git a/packages/core/src/new-api/examples.ts b/packages/core/src/new-api/examples.ts deleted file mode 100644 index 501be9a2b5..0000000000 --- a/packages/core/src/new-api/examples.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Some definitions -// Future: representation of a future value, which may require on-chain interaction (e.g. deploy a contract, an already existing contract) -// FutureFactory: Methods exposed by IgnitionModuleBuidler which create factories - -import { defineModule } from "./define-module"; - -// Examples - -const moduleWithASingleContract = defineModule("Module1", (m) => { - const contract1 = m.contract("Contract1", []); - - return { contract1 }; -}); - -const moduleWithUnexportedContract = defineModule("Module2", (m) => { - const contract1 = m.contract("Contract1", [1, 2, 3]); - - // We don't export this, but we still need to run every future, - // so it's included in module.futures - const _contract2 = m.contract("Contract2", []); - - return { contract1 }; -}); - -const moduleWithSubmodule = defineModule("Module3", (m) => { - const { contract1 } = m.useModule(moduleWithASingleContract); - // ^ This is typed 😎 - - const contract3 = m.contract("Contract3", []); - - return { contract1, contract3 }; -}); - -// We pring these modules - -console.log(moduleWithASingleContract); - -console.log(); -console.log(); - -console.log(moduleWithUnexportedContract); - -console.log(); -console.log(); - -console.log(moduleWithSubmodule); - -// Major todos: -// - Validation: I think both per-future and global validations can be run using this same representation, as it still is a graph and also uses adjacency lists. -// -// - Batching: I think each batch can be Set, and we can batch with this representation, including the malaga rule, as explained above. diff --git a/packages/core/src/new-api/internal/isFutureType.ts b/packages/core/src/new-api/internal/isFutureType.ts deleted file mode 100644 index 441f722029..0000000000 --- a/packages/core/src/new-api/internal/isFutureType.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { FutureType } from "../types/module"; - -export function isFutureType(potential: unknown): potential is FutureType { - return ( - typeof potential === "string" && - (FutureType as any)[potential] !== undefined - ); -} From 537ba065aaf7a1cf4b234963f8a5841d7a3d3c35 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 19:25:55 -0300 Subject: [PATCH 0425/1302] Document a cast --- .../src/new-api/stored-deployment-serializer.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 8b4ea8fedb..758e50dad0 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -837,13 +837,17 @@ export class StoredDeploymentDeserializer { private static _deserializeModuleParameterRuntimeValue( serialized: SerializedModuleParameterRuntimeValue ): ModuleParameterRuntimeValue { + let defaultValue: ModuleParameterType | undefined = undefined; + if (serialized.defaultValue !== undefined) { + // We cast here because we receive an `unknow`, but we known it came from serializing a ModuleParameterType + defaultValue = this._jsonParseWithBigint( + serialized.defaultValue + ) as ModuleParameterType; + } + return new ModuleParameterRuntimeValueImplementation( serialized.name, - serialized.defaultValue === undefined - ? undefined - : (this._jsonParseWithBigint( - serialized.defaultValue - ) as ModuleParameterType) + defaultValue ); } } From fada39f42bfd66e41d59a35541a8322825daa7b2 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 19:26:07 -0300 Subject: [PATCH 0426/1302] Improve typeguard --- packages/core/src/new-api/type-guards.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 916d7bb151..1ee5f63422 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -9,6 +9,21 @@ import { RuntimeValueType, } from "./types/module"; +function isValidEnumValue( + theEnum: Record, + value: string +): boolean { + // Enums are objects that have entries that map: + // 1) keys to values + // 2) values to keys + const key = theEnum[value]; + if (key === undefined) { + return false; + } + + return theEnum[key] === value; +} + /** * Returns true if potential is of type FutureType. * @@ -16,8 +31,7 @@ import { */ export function isFutureType(potential: unknown): potential is FutureType { return ( - typeof potential === "string" && - (FutureType as any)[potential] !== undefined + typeof potential === "string" && isValidEnumValue(FutureType, potential) ); } @@ -112,7 +126,7 @@ export function isRuntimeValueType( ): potential is RuntimeValueType { return ( typeof potential === "string" && - (RuntimeValueType as any)[potential] !== undefined + isValidEnumValue(RuntimeValueType, potential) ); } From 7445b94135227932c219696afa7e6df48788b04e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 19:30:00 -0300 Subject: [PATCH 0427/1302] Fix linter error --- packages/core/src/new-api/stored-deployment-serializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 758e50dad0..2096cc9bc0 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -837,7 +837,7 @@ export class StoredDeploymentDeserializer { private static _deserializeModuleParameterRuntimeValue( serialized: SerializedModuleParameterRuntimeValue ): ModuleParameterRuntimeValue { - let defaultValue: ModuleParameterType | undefined = undefined; + let defaultValue: ModuleParameterType | undefined; if (serialized.defaultValue !== undefined) { // We cast here because we receive an `unknow`, but we known it came from serializing a ModuleParameterType defaultValue = this._jsonParseWithBigint( From f0b59137eb17b62dd2333370bf17a634f96d5cba Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 19:56:29 -0300 Subject: [PATCH 0428/1302] Support module params in contractAt's address --- .../src/new-api/internal/module-builder.ts | 21 ++++++--- packages/core/src/new-api/internal/module.ts | 10 ++++- .../new-api/stored-deployment-serializer.ts | 18 ++++++++ .../core/src/new-api/types/module-builder.ts | 12 ++++-- packages/core/src/new-api/types/module.ts | 10 ++++- .../new-api/types/serialized-deployment.ts | 4 +- packages/core/test/new-api/contractAt.ts | 35 +++++++++++++++ .../test/new-api/contractAtFromArtifact.ts | 43 +++++++++++++++++++ 8 files changed, 139 insertions(+), 14 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 7cf8fa4ce7..70c95a8f8d 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -2,6 +2,7 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; +import { isFuture } from "../type-guards"; import { Artifact } from "../types/artifact"; import { AccountRuntimeValue, @@ -141,7 +142,7 @@ export class IgnitionModuleBuilderImplementation< return new AccountRuntimeValueImplementation(accountIndex); } - public getParameter( + public getParameter( parameterName: string, defaultValue?: ParamTypeT ): ModuleParameterRuntimeValue { @@ -369,7 +370,10 @@ export class IgnitionModuleBuilderImplementation< public contractAt( contractName: ContractNameT, - address: string | AddressResolvableFuture, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, options: ContractAtOptions = {} ): NamedContractAtFuture { const id = options.id ?? contractName; @@ -388,10 +392,12 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } - if (typeof address !== "string") { + if (isFuture(address)) { future.dependencies.add(address); } + // TODO: Validate the the runtime value's default type is string + this._module.futures.add(future); return future; @@ -399,7 +405,10 @@ export class IgnitionModuleBuilderImplementation< public contractAtFromArtifact( contractName: string, - address: string | AddressResolvableFuture, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, artifact: Artifact, options: ContractAtOptions = {} ): ArtifactContractAtFuture { @@ -420,10 +429,12 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(afterFuture); } - if (typeof address !== "string") { + if (isFuture(address)) { future.dependencies.add(address); } + // TODO: Validate the the runtime value's default type is string + this._module.futures.add(future); return future; diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 56cb3f096b..d96061abf6 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -172,7 +172,10 @@ export class NamedContractAtFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: ContractNameT, - public readonly address: string | AddressResolvableFuture + public readonly address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue ) { super(id, FutureType.NAMED_CONTRACT_AT, module); } @@ -186,7 +189,10 @@ export class ArtifactContractAtFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly contractName: string, - public readonly address: string | AddressResolvableFuture, + public readonly address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, public readonly artifact: Artifact ) { super(id, FutureType.ARTIFACT_CONTRACT_AT, module); diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 2096cc9bc0..98559cdf47 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -233,6 +233,9 @@ export class StoredDeploymentSerializer { contractName: future.contractName, address: isFuture(future.address) ? this._convertFutureToFutureToken(future.address) + : isRuntimeValue(future.address) && + future.address.type === RuntimeValueType.MODULE_PARAMETER + ? this._serializeModuleParamterRuntimeValue(future.address) : future.address, }; return serializedNamedContractAtFuture; @@ -250,6 +253,9 @@ export class StoredDeploymentSerializer { artifact: future.artifact, address: isFuture(future.address) ? this._convertFutureToFutureToken(future.address) + : isRuntimeValue(future.address) && + future.address.type === RuntimeValueType.MODULE_PARAMETER + ? this._serializeModuleParamterRuntimeValue(future.address) : future.address, }; return serializedArtifactContractAtFuture; @@ -750,6 +756,12 @@ export class StoredDeploymentDeserializer { addressResolvableFutureLookup, serializedFuture.address.futureId ) + : this._isSerializedModuleParameterRuntimeValue( + serializedFuture.address + ) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.address + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus : serializedFuture.address ); case FutureType.ARTIFACT_CONTRACT_AT: @@ -762,6 +774,12 @@ export class StoredDeploymentDeserializer { addressResolvableFutureLookup, serializedFuture.address.futureId ) + : this._isSerializedModuleParameterRuntimeValue( + serializedFuture.address + ) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.address + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus : serializedFuture.address, serializedFuture.artifact ); diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 95379ee98e..f904b51210 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -160,7 +160,7 @@ export interface SendDataOptions { export interface IgnitionModuleBuilder { getAccount(accountIndex: number): AccountRuntimeValue; - getParameter( + getParameter( parameterName: string, defaultValue?: ParamTypeT ): ModuleParameterRuntimeValue; @@ -205,13 +205,19 @@ export interface IgnitionModuleBuilder { contractAt( contractName: ContractNameT, - address: string | AddressResolvableFuture, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, options?: ContractAtOptions ): NamedContractAtFuture; contractAtFromArtifact( contractName: string, - address: string | AddressResolvableFuture, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, artifact: Artifact, options?: ContractAtOptions ): ArtifactContractAtFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 6a7d0c0a69..159772c05a 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -226,7 +226,10 @@ export interface NamedContractAtFuture { module: IgnitionModule; dependencies: Set; contractName: ContractNameT; - address: string | AddressResolvableFuture; + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue; } /** @@ -241,7 +244,10 @@ export interface ArtifactContractAtFuture { module: IgnitionModule; dependencies: Set; contractName: string; - address: string | AddressResolvableFuture; + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue; artifact: Artifact; } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 27795a3924..a1b58e945d 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -162,7 +162,7 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { export interface SerializedNamedContractAtFuture extends BaseSerializedFuture { type: FutureType.NAMED_CONTRACT_AT; contractName: string; - address: string | FutureToken; + address: string | FutureToken | SerializedModuleParameterRuntimeValue; } /** @@ -174,7 +174,7 @@ export interface SerializedArtifactContractAtFuture extends BaseSerializedFuture { type: FutureType.ARTIFACT_CONTRACT_AT; contractName: string; - address: string | FutureToken; + address: string | FutureToken | SerializedModuleParameterRuntimeValue; artifact: Artifact; } diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index a490ec4c50..fb3c46f0e3 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -1,8 +1,11 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; +import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { assertInstanceOf } from "./helpers"; + describe("contractAt", () => { const fakeArtifact: any = {}; @@ -100,6 +103,38 @@ describe("contractAt", () => { assert(anotherFuture.dependencies.has(callFuture!)); }); + it("Should be able to pass a module param as address", () => { + const moduleDefinition = defineModule("Module", (m) => { + const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); + const paramWithoutDefault = m.getParameter("addressWithoutDefault"); + + const withDefault = m.contractAt("C", paramWithDefault); + const withoutDefault = m.contractAt("C2", paramWithoutDefault); + + return { withDefault, withoutDefault }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.withDefault.address, + ModuleParameterRuntimeValueImplementation + ); + assert.equal(module.results.withDefault.address.name, "addressWithDefault"); + assert.equal(module.results.withDefault.address.defaultValue, "0x000000"); + + assertInstanceOf( + module.results.withoutDefault.address, + ModuleParameterRuntimeValueImplementation + ); + assert.equal( + module.results.withoutDefault.address.name, + "addressWithoutDefault" + ); + assert.equal(module.results.withoutDefault.address.defaultValue, undefined); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index edc4c0bd7a..27382d8b14 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -1,8 +1,11 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; +import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { assertInstanceOf } from "./helpers"; + describe("contractAtFromArtifactFromArtifact", () => { const fakeArtifact: any = {}; @@ -109,6 +112,46 @@ describe("contractAtFromArtifactFromArtifact", () => { assert(anotherFuture.dependencies.has(callFuture!)); }); + it("Should be able to pass a module param as address", () => { + const moduleDefinition = defineModule("Module", (m) => { + const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); + const paramWithoutDefault = m.getParameter("addressWithoutDefault"); + + const withDefault = m.contractAtFromArtifact( + "C", + paramWithDefault, + fakeArtifact + ); + const withoutDefault = m.contractAtFromArtifact( + "C2", + paramWithoutDefault, + fakeArtifact + ); + + return { withDefault, withoutDefault }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertInstanceOf( + module.results.withDefault.address, + ModuleParameterRuntimeValueImplementation + ); + assert.equal(module.results.withDefault.address.name, "addressWithDefault"); + assert.equal(module.results.withDefault.address.defaultValue, "0x000000"); + + assertInstanceOf( + module.results.withoutDefault.address, + ModuleParameterRuntimeValueImplementation + ); + assert.equal( + module.results.withoutDefault.address.name, + "addressWithoutDefault" + ); + assert.equal(module.results.withoutDefault.address.defaultValue, undefined); + }); + describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwiceDefinition = defineModule( From ed66f17f002347786de370826eb6318a23911529 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 20:07:27 -0300 Subject: [PATCH 0429/1302] Add support for module params to send's to --- .../src/new-api/internal/module-builder.ts | 6 ++-- packages/core/src/new-api/internal/module.ts | 5 ++- .../new-api/stored-deployment-serializer.ts | 6 ++++ .../core/src/new-api/types/module-builder.ts | 2 +- packages/core/src/new-api/types/module.ts | 2 +- .../new-api/types/serialized-deployment.ts | 2 +- packages/core/test/new-api/send.ts | 32 +++++++++++++++++++ 7 files changed, 49 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 70c95a8f8d..a0237e75eb 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -488,7 +488,7 @@ export class IgnitionModuleBuilderImplementation< public send( id: string, - to: string | AddressResolvableFuture, + to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, value?: bigint, data?: string, options: SendDataOptions = {} @@ -506,10 +506,12 @@ export class IgnitionModuleBuilderImplementation< options.from ); - if (typeof to !== "string") { + if (isFuture(to)) { future.dependencies.add(to); } + // TODO: Validate the the runtime value's default type is string + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index d96061abf6..fc7fc44dca 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -223,7 +223,10 @@ export class SendDataFutureImplementation constructor( public readonly id: string, public readonly module: IgnitionModuleImplementation, - public readonly to: string | AddressResolvableFuture, + public readonly to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, public readonly value: bigint, public readonly data: string | undefined, public readonly from: string | AccountRuntimeValue | undefined diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 98559cdf47..358cb1127c 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -289,6 +289,8 @@ export class StoredDeploymentSerializer { ), to: isFuture(future.to) ? this._convertFutureToFutureToken(future.to) + : isRuntimeValue(future.to) + ? this._serializeModuleParamterRuntimeValue(future.to) : future.to, value: this._serializeBigint(future.value), data: future.data, @@ -808,6 +810,10 @@ export class StoredDeploymentDeserializer { addressResolvableFutureLookup, serializedFuture.to.futureId ) + : this._isSerializedModuleParameterRuntimeValue(serializedFuture.to) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.to + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus : serializedFuture.to, this._deserializedBigint(serializedFuture.value), serializedFuture.data, diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index f904b51210..3a2752daba 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -234,7 +234,7 @@ export interface IgnitionModuleBuilder { send( id: string, - to: string | AddressResolvableFuture, + to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, value?: bigint, data?: string, options?: SendDataOptions diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 159772c05a..c961f14a9e 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -279,7 +279,7 @@ export interface SendDataFuture { id: string; module: IgnitionModule; dependencies: Set; - to: string | AddressResolvableFuture; + to: string | AddressResolvableFuture | ModuleParameterRuntimeValue; value: bigint; data: string | undefined; from: string | AccountRuntimeValue | undefined; diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index a1b58e945d..8d1b243cf7 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -200,7 +200,7 @@ export interface SerializedReadEventArgumentFuture */ export interface SerializedSendDataFuture extends BaseSerializedFuture { type: FutureType.SEND_DATA; - to: string | FutureToken; + to: string | FutureToken | SerializedModuleParameterRuntimeValue; value: SerializedBigInt; data: string | undefined; from: string | SerializedAccountRuntimeValue | undefined; diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index e4edd044f1..79cfc7065b 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, SendDataFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -199,6 +200,37 @@ describe("send", () => { assert.equal(sendFuture.from.accountIndex, 1); }); + it("Should be able to pass a module param as address", () => { + const moduleDefinition = defineModule("Module", (m) => { + const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); + const paramWithoutDefault = m.getParameter("addressWithoutDefault"); + + m.send("C", paramWithDefault); + m.send("C2", paramWithoutDefault); + + return {}; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const futureC = Array.from(module.futures).find((f) => f.id === "Module:C"); + assertInstanceOf(futureC, SendDataFutureImplementation); + + const futureC2 = Array.from(module.futures).find( + (f) => f.id === "Module:C2" + ); + assertInstanceOf(futureC2, SendDataFutureImplementation); + + assertInstanceOf(futureC.to, ModuleParameterRuntimeValueImplementation); + assert.equal(futureC.to.name, "addressWithDefault"); + assert.equal(futureC.to.defaultValue, "0x000000"); + + assertInstanceOf(futureC2.to, ModuleParameterRuntimeValueImplementation); + assert.equal(futureC2.to.name, "addressWithoutDefault"); + assert.equal(futureC2.to.defaultValue, undefined); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { From c5ef5d1be5e0f87e3102ce989c6592a833ffc1db Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 26 May 2023 20:19:10 -0300 Subject: [PATCH 0430/1302] Update UI --- .../components/future-summary.tsx | 65 +++++++------------ .../pages/plan-overview/components/action.tsx | 25 +++++-- .../ui/src/utils/argumentTypeToString.tsx | 38 +++++++++++ packages/ui/src/utils/to-mermaid.ts | 22 ++++++- 4 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 packages/ui/src/utils/argumentTypeToString.tsx diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index e9fa3d84ac..d5d525a8ae 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -1,14 +1,12 @@ import { - ArgumentType, Future, FutureType, - RuntimeValueType, StoredDeployment, isFuture, - isRuntimeValue, } from "@ignored/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; import { SummaryHeader } from "../../../components/summary-header"; +import { argumentTypeToString } from "../../../utils/argumentTypeToString"; export const FutureSummary: React.FC<{ deployment: StoredDeployment; @@ -52,11 +50,19 @@ function resolveTitleFor(future: Future): string { return `Static call - ${future.contract.contractName}/${future.functionName}`; case FutureType.NAMED_CONTRACT_AT: return `Existing contract - ${future.contractName} (${ - typeof future.address === "string" ? future.address : future.address.id + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) })`; case FutureType.ARTIFACT_CONTRACT_AT: return `Existing contract from Artifact - ${future.contractName} (${ - typeof future.address === "string" ? future.address : future.address.id + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event argument from future - ${future.id}`; @@ -65,38 +71,6 @@ function resolveTitleFor(future: Future): string { } } -function argumentTypeToString(argument: ArgumentType): string { - return JSON.stringify( - argument, - (_key, value) => { - if (typeof value === "bigint") { - return ``; - } - - if (isFuture(value)) { - return ``; - } - - if (isRuntimeValue(value)) { - if (value.type === RuntimeValueType.ACCOUNT) { - return ``; - } - - return ``; - } - - return value; - }, - 2 - ); -} - const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: @@ -173,7 +147,9 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { Address -{" "} {typeof future.address === "string" ? future.address - : future.address.id} + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address)}

    ); @@ -186,7 +162,9 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { Address -{" "} {typeof future.address === "string" ? future.address - : future.address.id} + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address)}

    ); @@ -205,7 +183,14 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { case FutureType.SEND_DATA: return (
    -

    To - {typeof future.to === "string" ? future.to : future.to.id}

    +

    + To -{" "} + {typeof future.to === "string" + ? future.to + : isFuture(future.to) + ? future.to.id + : argumentTypeToString(future.to)} +

    Data - {future.data}

    ); diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 2534c64bdf..9e932ae43c 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -1,7 +1,12 @@ -import { Future, FutureType } from "@ignored/ignition-core/ui-helpers"; +import { + Future, + FutureType, + isFuture, +} from "@ignored/ignition-core/ui-helpers"; import React, { useCallback } from "react"; import { useNavigate } from "react-router-dom"; import styled, { css } from "styled-components"; +import { argumentTypeToString } from "../../../utils/argumentTypeToString"; export const Action: React.FC<{ future: Future; @@ -37,17 +42,29 @@ function toDisplayText(future: Future): string { return `Static call ${future.contract.contractName}/${future.functionName}`; case FutureType.NAMED_CONTRACT_AT: return `Existing contract ${future.contractName} (${ - typeof future.address === "string" ? future.address : future.address.id + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) })`; case FutureType.ARTIFACT_CONTRACT_AT: return `Existing contract ${future.contractName} from artifact (${ - typeof future.address === "string" ? future.address : future.address.id + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.argumentName})`; case FutureType.SEND_DATA: return `Send data to ${ - typeof future.to === "string" ? future.to : future.to.id + typeof future.to === "string" + ? future.to + : isFuture(future.to) + ? future.to.id + : argumentTypeToString(future.to) }`; } } diff --git a/packages/ui/src/utils/argumentTypeToString.tsx b/packages/ui/src/utils/argumentTypeToString.tsx new file mode 100644 index 0000000000..3a4a3334dd --- /dev/null +++ b/packages/ui/src/utils/argumentTypeToString.tsx @@ -0,0 +1,38 @@ +import { + ArgumentType, + RuntimeValueType, + isFuture, + isRuntimeValue, +} from "@ignored/ignition-core/ui-helpers"; + +export function argumentTypeToString(argument: ArgumentType): string { + return JSON.stringify( + argument, + (_key, value) => { + if (typeof value === "bigint") { + return ``; + } + + if (isFuture(value)) { + return ``; + } + + if (isRuntimeValue(value)) { + if (value.type === RuntimeValueType.ACCOUNT) { + return ``; + } + + return ``; + } + + return value; + }, + 2 + ); +} diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index a7d1981b1b..3ff7a57c00 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -4,8 +4,10 @@ import { IgnitionModule, IgnitionModuleResult, StoredDeployment, + isFuture, } from "@ignored/ignition-core/ui-helpers"; import { getAllFuturesForModule } from "../queries/futures"; +import { argumentTypeToString } from "./argumentTypeToString"; export function toMermaid(deployment: StoredDeployment) { const modules = recursivelyListModulesAndSubmodulesFor(deployment.module); @@ -70,15 +72,29 @@ function toLabel(f: Future): string { return `Static call ${f.contract.contractName}/${f.functionName}`; case FutureType.NAMED_CONTRACT_AT: return `Existing contract ${f.contractName} (${ - typeof f.address === "string" ? f.address : f.address.id + typeof f.address === "string" + ? f.address + : isFuture(f.address) + ? f.address.id + : argumentTypeToString(f.address) })`; case FutureType.ARTIFACT_CONTRACT_AT: return `Existing contract from artifact ${f.contractName} (${ - typeof f.address === "string" ? f.address : f.address.id + typeof f.address === "string" + ? f.address + : isFuture(f.address) + ? f.address.id + : argumentTypeToString(f.address) })`; case FutureType.READ_EVENT_ARGUMENT: return `Read event from future ${f.futureToReadFrom.id} (event ${f.eventName} argument ${f.argumentName})`; case FutureType.SEND_DATA: - return `Send data to ${typeof f.to === "string" ? f.to : f.to.id}`; + return `Send data to ${ + typeof f.to === "string" + ? f.to + : isFuture(f.to) + ? f.to.id + : argumentTypeToString(f.to) + }`; } } From 31b524a20359347b5dadca617fdb253ea8cc97f1 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 9 Jun 2023 12:47:54 -0300 Subject: [PATCH 0431/1302] Update packages/core/test/new-api/getParameter.ts Co-authored-by: John Kane --- packages/core/test/new-api/getParameter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index 08f57303b7..065cac91e7 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -104,7 +104,7 @@ describe("getParameter", () => { assert.deepEqual(param.defaultValue, defaultValue); }); - it("Should accept complex combinations as deafult", () => { + it("Should accept complex combinations as default", () => { const defaultValue: ModuleParameterType = { arr: [123, { a: [{ o: true }] }], }; From 44ef842ccbd967fdffe1eb761c2ba365400eb672 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 9 Jun 2023 13:01:02 -0300 Subject: [PATCH 0432/1302] Regenerate package-lock.json --- package-lock.json | 6924 +++++++++++++++++++++++++++++++-------------- 1 file changed, 4762 insertions(+), 2162 deletions(-) diff --git a/package-lock.json b/package-lock.json index 17f7c7c737..6431aeba4d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -103,12 +103,14 @@ }, "examples/uniswap/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -118,38 +120,41 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.22.3", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", + "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", + "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, - "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -166,17 +171,19 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.3", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dependencies": { - "@babel/types": "^7.22.3", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -186,22 +193,24 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", + "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", + "@babel/compat-data": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", "semver": "^6.3.0" @@ -215,137 +224,151 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.3", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -354,8 +377,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.4", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -364,11 +388,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.21.0", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -378,11 +403,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.19.6", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -392,8 +418,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.22.3", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", + "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -402,29 +429,31 @@ } }, "node_modules/@babel/template": { - "version": "7.21.9", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.4", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -433,11 +462,12 @@ } }, "node_modules/@babel/types": { - "version": "7.22.4", - "license": "MIT", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -446,22 +476,26 @@ }, "node_modules/@braintree/sanitize-url": { "version": "6.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" }, "node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.4.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } }, "node_modules/@chainsafe/ssz": { "version": "0.9.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.4.2", @@ -470,8 +504,9 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, - "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -481,8 +516,9 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -490,26 +526,31 @@ }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dependencies": { "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { "version": "0.8.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/stylis": { "version": "0.8.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, "node_modules/@ensdomains/address-encoder": { "version": "0.1.9", - "license": "BSD", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", "dependencies": { "bech32": "^1.1.3", "blakejs": "^1.1.0", @@ -522,17 +563,22 @@ }, "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/@ensdomains/buffer": { "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", "dependencies": { "@nomiclabs/hardhat-truffle5": "^2.0.0" } }, "node_modules/@ensdomains/ens": { "version": "0.4.5", - "license": "CC0-1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", "dependencies": { "bluebird": "^3.5.2", "eth-ens-namehash": "^2.0.8", @@ -543,7 +589,8 @@ }, "node_modules/@ensdomains/ens-contracts": { "version": "0.0.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", "dependencies": { "@ensdomains/buffer": "^0.0.13", "@ensdomains/solsha1": "0.0.3", @@ -553,21 +600,24 @@ }, "node_modules/@ensdomains/ens/node_modules/ansi-regex": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/camelcase": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/cliui": { "version": "3.2.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -576,7 +626,8 @@ }, "node_modules/@ensdomains/ens/node_modules/find-up": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -587,7 +638,8 @@ }, "node_modules/@ensdomains/ens/node_modules/fs-extra": { "version": "0.30.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -598,15 +650,18 @@ }, "node_modules/@ensdomains/ens/node_modules/get-caller-file": { "version": "1.0.3", - "license": "ISC" + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { "version": "2.8.9", - "license": "ISC" + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" }, "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -616,14 +671,16 @@ }, "node_modules/@ensdomains/ens/node_modules/jsonfile": { "version": "2.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@ensdomains/ens/node_modules/load-json-file": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -637,7 +694,8 @@ }, "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { "version": "2.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -647,7 +705,8 @@ }, "node_modules/@ensdomains/ens/node_modules/parse-json": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dependencies": { "error-ex": "^1.2.0" }, @@ -657,7 +716,8 @@ }, "node_modules/@ensdomains/ens/node_modules/path-exists": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dependencies": { "pinkie-promise": "^2.0.0" }, @@ -667,7 +727,8 @@ }, "node_modules/@ensdomains/ens/node_modules/path-type": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -679,14 +740,16 @@ }, "node_modules/@ensdomains/ens/node_modules/pify": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/read-pkg": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -698,7 +761,8 @@ }, "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -709,18 +773,21 @@ }, "node_modules/@ensdomains/ens/node_modules/require-from-string": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/require-main-filename": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" }, "node_modules/@ensdomains/ens/node_modules/rimraf": { "version": "2.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, @@ -730,14 +797,16 @@ }, "node_modules/@ensdomains/ens/node_modules/semver": { "version": "5.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/@ensdomains/ens/node_modules/solc": { "version": "0.4.26", - "license": "MIT", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "dependencies": { "fs-extra": "^0.30.0", "memorystream": "^0.3.1", @@ -751,7 +820,8 @@ }, "node_modules/@ensdomains/ens/node_modules/string-width": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -763,7 +833,8 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-ansi": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -773,7 +844,8 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-bom": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dependencies": { "is-utf8": "^0.2.0" }, @@ -783,11 +855,13 @@ }, "node_modules/@ensdomains/ens/node_modules/which-module": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" }, "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -798,11 +872,13 @@ }, "node_modules/@ensdomains/ens/node_modules/y18n": { "version": "3.2.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" }, "node_modules/@ensdomains/ens/node_modules/yargs": { "version": "4.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", "dependencies": { "cliui": "^3.2.0", "decamelize": "^1.1.1", @@ -822,7 +898,8 @@ }, "node_modules/@ensdomains/ens/node_modules/yargs-parser": { "version": "2.4.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", "dependencies": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" @@ -830,7 +907,8 @@ }, "node_modules/@ensdomains/ensjs": { "version": "2.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", "dependencies": { "@babel/runtime": "^7.4.4", "@ensdomains/address-encoder": "^0.1.7", @@ -843,169 +921,523 @@ } }, "node_modules/@ensdomains/resolver": { - "version": "0.2.4" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" }, "node_modules/@ensdomains/solsha1": { "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", + "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", "dependencies": { "hash-test-vectors": "^1.3.2" } }, - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", + "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ - "x64" + "arm64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "android" ], "engines": { "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@esbuild/android-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", + "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", + "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", + "node_modules/@esbuild/darwin-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", + "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", + "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", + "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", + "node_modules/@esbuild/linux-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", + "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "(MIT OR CC0-1.0)", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "8.41.0", + "node_modules/@esbuild/linux-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", + "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@ethereumjs/common": { - "version": "2.5.0", - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" + "node_modules/@esbuild/linux-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", + "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", + "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10.0.0" + "node": ">=12" } }, - "node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "license": "MPL-2.0", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" + "node_modules/@esbuild/linux-ppc64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", + "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { + "node_modules/@esbuild/linux-riscv64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", + "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", + "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", + "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", + "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", + "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", + "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", + "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", + "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", + "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, + "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", "blakejs": "^1.1.0", @@ -1025,7 +1457,8 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -1039,6 +1472,8 @@ }, "node_modules/@ethersproject/abi": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -1049,7 +1484,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1064,6 +1498,8 @@ }, "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1074,7 +1510,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1085,6 +1520,8 @@ }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -1095,7 +1532,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1108,6 +1544,8 @@ }, "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -1118,7 +1556,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1129,6 +1566,8 @@ }, "node_modules/@ethersproject/address": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", "funding": [ { "type": "individual", @@ -1139,7 +1578,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.6.2", "@ethersproject/bytes": "^5.6.1", @@ -1150,6 +1588,8 @@ }, "node_modules/@ethersproject/base64": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -1160,13 +1600,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -1177,7 +1618,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -1185,6 +1625,8 @@ }, "node_modules/@ethersproject/bignumber": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "funding": [ { "type": "individual", @@ -1195,7 +1637,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1204,6 +1645,8 @@ }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -1214,13 +1657,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -1231,13 +1675,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -1248,7 +1693,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -1264,6 +1708,8 @@ }, "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1274,7 +1720,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1285,6 +1730,8 @@ }, "node_modules/@ethersproject/hash": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -1295,7 +1742,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -1310,6 +1756,8 @@ }, "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1320,7 +1768,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1331,6 +1778,8 @@ }, "node_modules/@ethersproject/hdnode": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -1341,7 +1790,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -1359,6 +1807,8 @@ }, "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "funding": [ { "type": "individual", @@ -1369,7 +1819,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -1388,6 +1837,8 @@ }, "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1398,7 +1849,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1409,6 +1859,8 @@ }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -1419,7 +1871,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -1427,6 +1878,8 @@ }, "node_modules/@ethersproject/logger": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -1436,11 +1889,12 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ], - "license": "MIT" + ] }, "node_modules/@ethersproject/networks": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -1451,13 +1905,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -1468,7 +1923,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -1476,6 +1930,8 @@ }, "node_modules/@ethersproject/properties": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -1486,13 +1942,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -1503,7 +1960,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -1529,6 +1985,8 @@ }, "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1539,7 +1997,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1550,6 +2007,8 @@ }, "node_modules/@ethersproject/random": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -1560,7 +2019,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -1568,6 +2026,8 @@ }, "node_modules/@ethersproject/rlp": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "funding": [ { "type": "individual", @@ -1578,7 +2038,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -1586,6 +2045,8 @@ }, "node_modules/@ethersproject/sha2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -1596,7 +2057,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1605,6 +2065,8 @@ }, "node_modules/@ethersproject/signing-key": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "funding": [ { "type": "individual", @@ -1615,7 +2077,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1627,6 +2088,8 @@ }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "funding": [ { "type": "individual", @@ -1637,7 +2100,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1649,6 +2111,8 @@ }, "node_modules/@ethersproject/strings": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "funding": [ { "type": "individual", @@ -1659,7 +2123,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -1668,6 +2131,8 @@ }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "funding": [ { "type": "individual", @@ -1678,7 +2143,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1693,6 +2157,8 @@ }, "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1703,7 +2169,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1714,6 +2179,8 @@ }, "node_modules/@ethersproject/units": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "funding": [ { "type": "individual", @@ -1724,7 +2191,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -1733,6 +2199,8 @@ }, "node_modules/@ethersproject/wallet": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -1743,7 +2211,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -1764,6 +2231,8 @@ }, "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1774,7 +2243,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1785,6 +2253,8 @@ }, "node_modules/@ethersproject/web": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "funding": [ { "type": "individual", @@ -1795,7 +2265,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1806,6 +2275,8 @@ }, "node_modules/@ethersproject/wordlists": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "funding": [ { "type": "individual", @@ -1816,7 +2287,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -1827,8 +2297,9 @@ }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -1840,8 +2311,9 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -1852,8 +2324,9 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true }, "node_modules/@ignored/hardhat-ignition": { "resolved": "packages/hardhat-plugin", @@ -1869,8 +2342,9 @@ }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -1884,8 +2358,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -1896,8 +2371,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -1907,8 +2383,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -1921,8 +2398,9 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -1932,32 +2410,36 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/nyc-config-typescript": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2" }, @@ -1970,15 +2452,17 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -1990,25 +2474,29 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2016,15 +2504,18 @@ }, "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -2038,8 +2529,9 @@ }, "node_modules/@microsoft/api-extractor": { "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", "dev": true, - "license": "MIT", "dependencies": { "@microsoft/api-extractor-model": "7.26.4", "@microsoft/tsdoc": "0.14.2", @@ -2060,8 +2552,9 @@ }, "node_modules/@microsoft/api-extractor-model": { "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", "dev": true, - "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", @@ -2070,8 +2563,9 @@ }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2082,13 +2576,15 @@ }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true }, "node_modules/@microsoft/tsdoc-config": { "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, - "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", @@ -2098,8 +2594,9 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, - "license": "MIT", "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" @@ -2108,62 +2605,33 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/@morgan-stanley/ts-mocking-bird": { - "version": "0.6.4", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "lodash": "^4.17.16", - "uuid": "^7.0.3" - }, - "peerDependencies": { - "jasmine": "2.x || 3.x || 4.x", - "jest": "26.x || 27.x || 28.x", - "typescript": ">=4.2" - }, - "peerDependenciesMeta": { - "jasmine": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, - "node_modules/@morgan-stanley/ts-mocking-bird/node_modules/uuid": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@noble/hashes": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" + ] }, "node_modules/@noble/secp256k1": { "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" + ] }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2174,16 +2642,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2194,7 +2664,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-block": { "version": "5.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", + "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.1", "@nomicfoundation/ethereumjs-rlp": "5.0.1", @@ -2210,7 +2681,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2231,7 +2703,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { "version": "7.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", + "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.1", "@nomicfoundation/ethereumjs-common": "4.0.1", @@ -2253,7 +2726,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2274,7 +2748,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-common": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", + "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", "dependencies": { "@nomicfoundation/ethereumjs-util": "9.0.1", "crc-32": "^1.2.0" @@ -2282,7 +2757,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-ethash": { "version": "3.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", + "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.1", "@nomicfoundation/ethereumjs-rlp": "5.0.1", @@ -2297,7 +2773,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2318,7 +2795,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-evm": { "version": "2.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", + "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", "dependencies": { "@ethersproject/providers": "^5.7.1", "@nomicfoundation/ethereumjs-common": "4.0.1", @@ -2335,7 +2813,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2356,7 +2835,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-rlp": { "version": "5.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", + "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", "bin": { "rlp": "bin/rlp" }, @@ -2366,7 +2846,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { "version": "2.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", + "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.1", "@nomicfoundation/ethereumjs-rlp": "5.0.1", @@ -2378,7 +2859,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2399,7 +2881,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-trie": { "version": "6.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", + "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.1", "@nomicfoundation/ethereumjs-util": "9.0.1", @@ -2413,7 +2896,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2434,7 +2918,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-tx": { "version": "5.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", + "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", "dependencies": { "@chainsafe/ssz": "^0.9.2", "@ethersproject/providers": "^5.7.2", @@ -2449,7 +2934,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2470,7 +2956,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-util": { "version": "9.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", + "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", "dependencies": { "@chainsafe/ssz": "^0.10.0", "@nomicfoundation/ethereumjs-rlp": "5.0.1", @@ -2482,14 +2969,16 @@ }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.5.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { "version": "0.10.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.5.0" @@ -2497,7 +2986,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2518,7 +3008,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-vm": { "version": "7.0.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", + "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.1", "@nomicfoundation/ethereumjs-blockchain": "7.0.1", @@ -2540,7 +3031,8 @@ }, "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2561,8 +3053,9 @@ }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-1.0.6.tgz", + "integrity": "sha512-f5ZMNmabZeZegEfuxn/0kW+mm7+yV7VNDxLpMOMGXWFJ2l/Ct3QShujzDRF9cOkK9Ui/hbDeOWGZqyQALDXVCQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -2580,8 +3073,9 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", + "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -2592,8 +3086,9 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -2615,8 +3110,9 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, - "license": "MPL-2.0", "peer": true, "dependencies": { "@types/bn.js": "^5.1.0", @@ -2631,8 +3127,9 @@ }, "node_modules/@nomicfoundation/hardhat-toolbox": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-2.0.2.tgz", + "integrity": "sha512-vnN1AzxbvpSx9pfdRHbUzTRIXpMLPXnUlkW855VaDk6N1pwRaQ2gNzEmFAABk4lWf11E00PKwFd/q27HuwYrYg==", "dev": true, - "license": "MIT", "peerDependencies": { "@ethersproject/abi": "^5.4.7", "@ethersproject/providers": "^5.4.7", @@ -2681,7 +3178,8 @@ }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", "engines": { "node": ">= 12" }, @@ -2698,12 +3196,28 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" } }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", "cpu": [ "x64" ], - "license": "MIT", "optional": true, "os": [ "darwin" @@ -2712,15 +3226,137 @@ "node": ">= 10" } }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", + "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", + "dev": true }, "node_modules/@nomiclabs/hardhat-ethers": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.2.3.tgz", + "integrity": "sha512-YhzPdzb612X591FOe68q+qXVXGG2ANZRvDo0RRUtimev85rCrAlv/TLMEZw5c+kq9AbzocLTVX/h2jVIFPL9Xg==", "dev": true, - "license": "MIT", "peerDependencies": { "ethers": "^5.0.0", "hardhat": "^2.0.0" @@ -2728,8 +3364,9 @@ }, "node_modules/@nomiclabs/hardhat-etherscan": { "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.1.7.tgz", + "integrity": "sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -2749,8 +3386,9 @@ }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/fs-extra": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -2763,8 +3401,9 @@ }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -2772,8 +3411,9 @@ }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" @@ -2781,8 +3421,9 @@ }, "node_modules/@nomiclabs/hardhat-etherscan/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -2790,7 +3431,8 @@ }, "node_modules/@nomiclabs/hardhat-truffle5": { "version": "2.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", "dependencies": { "@nomiclabs/truffle-contract": "^4.2.23", "@types/chai": "^4.2.0", @@ -2806,7 +3448,8 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2827,7 +3470,8 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -2841,7 +3485,8 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -2853,21 +3498,24 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/@nomiclabs/hardhat-web3": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", "peer": true, "dependencies": { "@types/bignumber.js": "^5.0.0" @@ -2879,7 +3527,8 @@ }, "node_modules/@nomiclabs/truffle-contract": { "version": "4.5.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", "dependencies": { "@ensdomains/ensjs": "^2.0.1", "@truffle/blockchain-utils": "^0.1.3", @@ -2902,18 +3551,21 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { "version": "7.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "engines": { "node": "*" } }, "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { "version": "4.0.49", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -2928,7 +3580,8 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -2936,27 +3589,35 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { "version": "0.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" }, "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { "version": "1.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" }, "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/@openzeppelin/contracts": { "version": "4.7.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", + "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" }, "node_modules/@pkgr/utils": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", + "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.2.12", @@ -2973,21 +3634,24 @@ } }, "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.5.2", - "dev": true, - "license": "0BSD" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true }, "node_modules/@remix-run/router": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", + "integrity": "sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==", "engines": { "node": ">=14" } }, "node_modules/@rushstack/node-core-library": { "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", "dev": true, - "license": "MIT", "dependencies": { "colors": "~1.2.1", "fs-extra": "~7.0.1", @@ -3008,8 +3672,9 @@ }, "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -3021,24 +3686,27 @@ }, "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@rushstack/node-core-library/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@rushstack/rig-package": { "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", "dev": true, - "license": "MIT", "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" @@ -3046,8 +3714,9 @@ }, "node_modules/@rushstack/ts-command-line": { "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", "dev": true, - "license": "MIT", "dependencies": { "@types/argparse": "1.0.38", "argparse": "~1.0.9", @@ -3057,23 +3726,25 @@ }, "node_modules/@scure/base": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", + "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" + ] }, "node_modules/@scure/bip32": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -3082,13 +3753,14 @@ }, "node_modules/@scure/bip39": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -3096,7 +3768,8 @@ }, "node_modules/@sentry/core": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -3110,7 +3783,8 @@ }, "node_modules/@sentry/hub": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -3122,7 +3796,8 @@ }, "node_modules/@sentry/minimal": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -3134,7 +3809,8 @@ }, "node_modules/@sentry/node": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -3152,7 +3828,8 @@ }, "node_modules/@sentry/tracing": { "version": "5.30.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -3166,14 +3843,16 @@ }, "node_modules/@sentry/types": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", "engines": { "node": ">=6" } }, "node_modules/@sentry/utils": { "version": "5.30.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -3184,7 +3863,8 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", "engines": { "node": ">=10" }, @@ -3194,24 +3874,27 @@ }, "node_modules/@sinonjs/commons": { "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "node_modules/@sinonjs/samsam": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.1.3.tgz", + "integrity": "sha512-nhOb2dWPeb1sd3IQXL/dVPnKHDOAFfvichtBf4xV00/rU1QbPCQqKMbvIheIjqwVjh7qIgf2AHTHi391yMOMpQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.6.0", "lodash.get": "^4.4.2", @@ -3220,13 +3903,15 @@ }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true }, "node_modules/@solidity-parser/parser": { "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" @@ -3234,7 +3919,8 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -3244,12 +3930,14 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true }, "node_modules/@truffle/abi-utils": { - "version": "1.0.0", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.1.tgz", + "integrity": "sha512-ZQUY3XUxEPdqxNaoXsOqF0spTtb6f5RNlnN4MUrVsJ64sOh0FJsY7rxZiUI3khfePmNh4i2qcJrQlKT36YcWUA==", "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", @@ -3257,15 +3945,17 @@ } }, "node_modules/@truffle/blockchain-utils": { - "version": "0.1.7", - "license": "MIT" + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.8.tgz", + "integrity": "sha512-ZskpYDNHkXD3ota4iU3pZz6kLth87RC+wDn66Rp2Or+DqqJCKdnmS9GDctBi1EcMPDEi0BqpkdrfBuzA9uIkGg==" }, "node_modules/@truffle/codec": { - "version": "0.15.1", - "license": "MIT", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.15.2.tgz", + "integrity": "sha512-rLLy1RmDq3stE1Bd6cnPO9kGpoB5QE4caY665ghmAURqlqD0ik1Bhbfi4MIRwM7YVx2sYw485qsxfPzlewnT4g==", "dependencies": { - "@truffle/abi-utils": "^1.0.0", - "@truffle/compile-common": "^0.9.5", + "@truffle/abi-utils": "^1.0.1", + "@truffle/compile-common": "^0.9.6", "big.js": "^6.0.3", "bn.js": "^5.1.3", "cbor": "^5.2.0", @@ -3278,7 +3968,8 @@ }, "node_modules/@truffle/codec/node_modules/cbor": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dependencies": { "bignumber.js": "^9.0.1", "nofilter": "^1.0.4" @@ -3289,7 +3980,8 @@ }, "node_modules/@truffle/codec/node_modules/lru-cache": { "version": "6.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dependencies": { "yallist": "^4.0.0" }, @@ -3299,14 +3991,16 @@ }, "node_modules/@truffle/codec/node_modules/nofilter": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", "engines": { "node": ">=8" } }, "node_modules/@truffle/codec/node_modules/semver": { "version": "7.3.7", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -3319,40 +4013,46 @@ }, "node_modules/@truffle/codec/node_modules/yallist": { "version": "4.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/@truffle/compile-common": { - "version": "0.9.5", - "license": "MIT", + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.6.tgz", + "integrity": "sha512-TCcmr1E0GqMZJ2tOaCRNEllxTBJ/g7TuD6jDJpw5Gt9Bw0YO3Cmp6yPQRynRSO4xMJbHUgiEsSfRgIhswut5UA==", "dependencies": { - "@truffle/error": "^0.2.0", + "@truffle/error": "^0.2.1", "colors": "1.4.0" } }, "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.2.0", - "license": "MIT" + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.1.tgz", + "integrity": "sha512-5Qy+z9dg9hP37WNdLnXH4b9MzemWrjTufRq7/DTKqimjyxCP/1zlL8gQEMdiSx1BBtAZz0xypkID/jb7AF/Osg==" }, "node_modules/@truffle/compile-common/node_modules/colors": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "engines": { "node": ">=0.1.90" } }, "node_modules/@truffle/contract-schema": { "version": "3.4.14", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.14.tgz", + "integrity": "sha512-IwVQZG9RVNwTdn321+jbFIcky3/kZLkCtq8tqil4jZwivvmZQg8rIVC8GJ7Lkrmixl9/yTyQNL6GtIUUvkZxyA==", "dependencies": { "ajv": "^6.10.0", "debug": "^4.3.1" } }, "node_modules/@truffle/debug-utils": { - "version": "6.0.50", - "license": "MIT", + "version": "6.0.51", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.51.tgz", + "integrity": "sha512-lpsmkOnNDZq/zMWqWRXP1j2q3IcL6sM6GRLxSSwaWrubLK1s4aVunY3HNzYHeBswTwo/cYwxQD8PawMeNqe8GA==", "dependencies": { - "@truffle/codec": "^0.15.1", + "@truffle/codec": "^0.15.2", "@trufflesuite/chromafi": "^3.0.0", "bn.js": "^5.1.3", "chalk": "^2.4.2", @@ -3362,11 +4062,13 @@ }, "node_modules/@truffle/error": { "version": "0.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" }, "node_modules/@truffle/interface-adapter": { - "version": "0.5.33", - "license": "MIT", + "version": "0.5.34", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.34.tgz", + "integrity": "sha512-gPxabfMi2TueE4VxnNuyeudOfvGJQ1ofVC02PFw14cnRQhzH327JikjjQbZ1bT6S7kWl9H6P3hQPFeYFMHdm1g==", "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", @@ -3375,7 +4077,8 @@ }, "node_modules/@truffle/interface-adapter/node_modules/ethers": { "version": "4.0.49", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -3390,11 +4093,13 @@ }, "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/@truffle/interface-adapter/node_modules/hash.js": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -3402,22 +4107,29 @@ }, "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { "version": "0.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" }, "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { "version": "1.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" }, "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", "dependencies": { "camelcase": "^4.1.0", "chalk": "^2.3.2", @@ -3431,21 +4143,24 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -3455,35 +4170,41 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", "engines": { "node": ">=4" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true }, "node_modules/@typechain/ethers-v5": { "version": "10.2.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-10.2.1.tgz", + "integrity": "sha512-n3tQmCZjRE6IU4h6lqUGiQ1j866n5MTCBJreNEHHVWXa2u9GJTaeYyU1/k+1qLutkyw+sS6VAN+AbeiTqsxd/A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -3499,8 +4220,9 @@ }, "node_modules/@typechain/hardhat": { "version": "6.1.6", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-6.1.6.tgz", + "integrity": "sha512-BiVnegSs+ZHVymyidtK472syodx1sXYlYJJixZfRstHVGYTi8V1O7QG4nsjyb0PC/LORcq7sfBUcHto1y6UgJA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -3516,8 +4238,9 @@ }, "node_modules/@typechain/hardhat/node_modules/fs-extra": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -3531,12 +4254,15 @@ }, "node_modules/@types/argparse": { "version": "1.0.38", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true }, "node_modules/@types/bignumber.js": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", "peer": true, "dependencies": { "bignumber.js": "*" @@ -3544,14 +4270,16 @@ }, "node_modules/@types/bn.js": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", + "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -3561,20 +4289,23 @@ }, "node_modules/@types/chai": { "version": "4.3.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==" }, "node_modules/@types/chai-as-promised": { "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", + "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/chai": "*" } }, "node_modules/@types/concat-stream": { "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -3582,8 +4313,9 @@ }, "node_modules/@types/d3": { "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -3619,39 +4351,45 @@ }, "node_modules/@types/d3-array": { "version": "3.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", + "dev": true }, "node_modules/@types/d3-axis": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", + "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", + "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { "version": "3.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", + "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", + "dev": true }, "node_modules/@types/d3-color": { "version": "3.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", + "dev": true }, "node_modules/@types/d3-contour": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", + "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -3659,144 +4397,168 @@ }, "node_modules/@types/d3-delaunay": { "version": "6.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", + "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", + "dev": true }, "node_modules/@types/d3-dispatch": { "version": "3.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", + "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", + "dev": true }, "node_modules/@types/d3-drag": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", + "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", + "dev": true }, "node_modules/@types/d3-ease": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true }, "node_modules/@types/d3-fetch": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", + "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { "version": "3.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", + "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", + "dev": true }, "node_modules/@types/d3-format": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", + "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", + "dev": true }, "node_modules/@types/d3-geo": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", + "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", "dev": true, - "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { "version": "3.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", + "dev": true }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true }, "node_modules/@types/d3-polygon": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true }, "node_modules/@types/d3-quadtree": { "version": "3.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", + "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", + "dev": true }, "node_modules/@types/d3-random": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true }, "node_modules/@types/d3-scale": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true }, "node_modules/@types/d3-selection": { "version": "3.0.5", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", + "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", + "dev": true }, "node_modules/@types/d3-shape": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", + "dev": true }, "node_modules/@types/d3-time-format": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", + "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", + "dev": true }, "node_modules/@types/d3-timer": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true }, "node_modules/@types/d3-transition": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", + "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", + "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -3804,24 +4566,27 @@ }, "node_modules/@types/debug": { "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/dompurify": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", "dev": true, - "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/form-data": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -3829,21 +4594,24 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/geojson": { "version": "7946.0.10", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", + "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", + "dev": true }, "node_modules/@types/glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/minimatch": "*", @@ -3852,8 +4620,9 @@ }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -3861,68 +4630,80 @@ }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" }, "node_modules/@types/json-schema": { "version": "7.0.12", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/lodash": { "version": "4.14.189", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", + "dev": true }, "node_modules/@types/lru-cache": { "version": "5.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, "node_modules/@types/mermaid": { "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", + "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", "dev": true, - "license": "MIT", "dependencies": { "mermaid": "*" } }, "node_modules/@types/minimatch": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/minimist": { "version": "1.2.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true }, "node_modules/@types/mocha": { "version": "9.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, "node_modules/@types/ms": { "version": "0.7.31", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", + "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", + "dev": true }, "node_modules/@types/ndjson": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", + "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/through": "*" @@ -3930,35 +4711,41 @@ }, "node_modules/@types/node": { "version": "20.2.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true }, "node_modules/@types/object-hash": { "version": "2.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-2.2.1.tgz", + "integrity": "sha512-i/rtaJFCsPljrZvP/akBqEwUP2y5cZLOmvO+JaYnz01aPknrQ+hB5MRcO7iqCUsFaYfTG8kGfKUyboA07xeDHQ==", + "dev": true }, "node_modules/@types/pbkdf2": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { - "version": "2.7.2", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/prompts": { "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.4.tgz", + "integrity": "sha512-p5N9uoTH76lLvSAaYSZtBCdEXzpOOufsRjnhjVSrZGXikVGHX9+cc9ERtHRV4hvBKHyZb1bg4K+56Bd2TqUn4A==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "kleur": "^3.0.3" @@ -3966,17 +4753,20 @@ }, "node_modules/@types/prop-types": { "version": "15.7.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/react": { - "version": "18.2.7", - "license": "MIT", + "version": "18.2.9", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.9.tgz", + "integrity": "sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -3985,15 +4775,17 @@ }, "node_modules/@types/react-dom": { "version": "18.2.4", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", + "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/readable-stream": { "version": "2.3.15", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -4001,44 +4793,51 @@ }, "node_modules/@types/responselike": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { "version": "0.16.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/secp256k1": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { "version": "7.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "dev": true }, "node_modules/@types/sinon": { "version": "10.0.15", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", + "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", + "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "dev": true }, "node_modules/@types/styled-components": { "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", "dev": true, - "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -4047,30 +4846,35 @@ }, "node_modules/@types/through": { "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", + "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/tmp": { "version": "0.2.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-dDZH/tXzwjutnuk4UacGgFRwV+JSLaXL1ikvidfJprkb7L9Nx1njcRHHmi3Dsvt7pgqqTEeucQuOrWHPFgzVHA==", + "dev": true }, "node_modules/@types/trusted-types": { "version": "2.0.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", + "dev": true }, "node_modules/@types/yoga-layout": { "version": "1.9.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/scope-manager": "4.31.2", @@ -4099,8 +4903,9 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.31.2", @@ -4122,8 +4927,9 @@ }, "node_modules/@typescript-eslint/parser": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/types": "4.31.2", @@ -4148,8 +4954,9 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2" @@ -4163,12 +4970,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", + "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4189,9 +4997,10 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4201,12 +5010,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4227,11 +5037,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4244,8 +5055,9 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4255,8 +5067,9 @@ }, "node_modules/@typescript-eslint/types": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true, - "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -4267,8 +5080,9 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2", @@ -4292,16 +5106,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", + "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -4317,12 +5132,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4333,9 +5149,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4345,12 +5162,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4371,11 +5189,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4388,8 +5207,9 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4399,8 +5219,9 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" @@ -4415,19 +5236,22 @@ }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true }, "node_modules/@uniswap/lib": { "version": "4.0.1-alpha", - "license": "GPL-3.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", + "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", "engines": { "node": ">=10" } }, "node_modules/@uniswap/sdk-core": { - "version": "3.2.2", - "license": "MIT", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.2.3.tgz", + "integrity": "sha512-ERVYKa5ENPwDA6/UZ45H1D5xIqTFcvDYpLxcncOzX8vRXuCAupMUoFFH5s/xx8IMcstONsAOPR1h4vRCzUkSsA==", "dependencies": { "@ethersproject/address": "^5.0.2", "big.js": "^5.2.2", @@ -4442,14 +5266,16 @@ }, "node_modules/@uniswap/sdk-core/node_modules/big.js": { "version": "5.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "engines": { "node": "*" } }, "node_modules/@uniswap/swap-router-contracts": { "version": "1.1.0", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz", + "integrity": "sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA==", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v2-core": "1.0.1", @@ -4463,11 +5289,13 @@ }, "node_modules/@uniswap/swap-router-contracts/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" }, "node_modules/@uniswap/swap-router-contracts/node_modules/@uniswap/v3-periphery": { "version": "1.3.0", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", + "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/lib": "^4.0.1-alpha", @@ -4482,21 +5310,24 @@ }, "node_modules/@uniswap/v2-core": { "version": "1.0.1", - "license": "GPL-3.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", + "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-core": { "version": "1.0.0", - "license": "BUSL-1.1", + "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", + "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", "engines": { "node": ">=10" } }, "node_modules/@uniswap/v3-periphery": { "version": "1.1.1", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz", + "integrity": "sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg==", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/lib": "^4.0.1-alpha", @@ -4511,11 +5342,13 @@ }, "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" }, "node_modules/@uniswap/v3-sdk": { "version": "3.9.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz", + "integrity": "sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ==", "dependencies": { "@ethersproject/abi": "^5.0.12", "@ethersproject/solidity": "^5.0.9", @@ -4532,11 +5365,13 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@openzeppelin/contracts": { "version": "3.4.2-solc-0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", + "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/swap-router-contracts": { "version": "1.3.0", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz", + "integrity": "sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A==", "dependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7", "@uniswap/v2-core": "1.0.1", @@ -4551,7 +5386,8 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-periphery": { "version": "1.4.1", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz", + "integrity": "sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg==", "dependencies": { "@openzeppelin/contracts": "3.4.2-solc-0.7", "@uniswap/lib": "^4.0.1-alpha", @@ -4566,7 +5402,9 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker": { "version": "1.0.0", - "license": "GPL-3.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz", + "integrity": "sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw==", + "deprecated": "Please upgrade to 1.0.1", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v3-core": "1.0.0", @@ -4578,11 +5416,13 @@ }, "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" }, "node_modules/@uniswap/v3-staker": { "version": "1.0.2", - "license": "GPL-3.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz", + "integrity": "sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ==", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/v3-core": "1.0.0", @@ -4594,12 +5434,14 @@ }, "node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" }, "node_modules/@vitejs/plugin-react": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", + "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.21.4", "@babel/plugin-transform-react-jsx-self": "^7.21.0", @@ -4615,13 +5457,15 @@ }, "node_modules/abbrev": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/abort-controller": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dependencies": { "event-target-shim": "^5.0.0" }, @@ -4631,11 +5475,13 @@ }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, "node_modules/abstract-level": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -4651,7 +5497,8 @@ }, "node_modules/accepts": { "version": "1.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -4662,8 +5509,9 @@ }, "node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4673,24 +5521,27 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -4698,18 +5549,21 @@ }, "node_modules/adm-zip": { "version": "0.4.16", - "license": "MIT", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { "version": "3.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, "node_modules/agent-base": { "version": "6.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { "debug": "4" }, @@ -4719,7 +5573,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -4730,7 +5585,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4744,8 +5600,9 @@ }, "node_modules/amdefine": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, - "license": "BSD-3-Clause OR MIT", "optional": true, "peer": true, "engines": { @@ -4754,14 +5611,16 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { "type-fest": "^0.21.3" }, @@ -4774,19 +5633,22 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-sequence-parser": { "version": "1.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", + "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", + "dev": true }, "node_modules/ansi-styles": { "version": "3.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { "color-convert": "^1.9.0" }, @@ -4796,13 +5658,15 @@ }, "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", "dev": true, - "license": "BSD-3-Clause", "peer": true }, "node_modules/anymatch": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4813,8 +5677,9 @@ }, "node_modules/append-transform": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -4824,26 +5689,30 @@ }, "node_modules/archy": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/arg": { "version": "4.1.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-back": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -4851,8 +5720,9 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -4863,12 +5733,14 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4885,16 +5757,18 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-uniq": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -4902,8 +5776,9 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -4919,8 +5794,9 @@ }, "node_modules/array.prototype.reduce": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -4938,64 +5814,74 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asap": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/asn1": { "version": "0.2.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { "node": ">=0.8" } }, "node_modules/assertion-error": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/async-limiter": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/asynckit": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "peer": true, "engines": { "node": ">= 4.0.0" @@ -5003,7 +5889,8 @@ }, "node_modules/auto-bind": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", "engines": { "node": ">=8" }, @@ -5013,7 +5900,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { "node": ">= 0.4" }, @@ -5023,18 +5911,21 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/babel-plugin-styled-components": { "version": "2.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", + "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.21.4", @@ -5048,21 +5939,26 @@ }, "node_modules/babel-plugin-syntax-jsx": { "version": "6.18.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" }, "node_modules/balanced-match": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "3.0.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -5076,39 +5972,44 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/base64-sol": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", + "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { "version": "0.14.5", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/bech32": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, - "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "6.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", "engines": { "node": "*" }, @@ -5119,40 +6020,47 @@ }, "node_modules/bigint-crypto-utils": { "version": "3.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", + "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", "engines": { "node": ">=14.0.0" } }, "node_modules/bignumber.js": { "version": "9.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/blakejs": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, "node_modules/bluebird": { "version": "3.7.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/bn.js": { "version": "5.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { "version": "1.20.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5174,14 +6082,16 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5191,11 +6101,13 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -5208,12 +6120,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bplist-parser": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, - "license": "MIT", "dependencies": { "big-integer": "^1.6.44" }, @@ -5223,7 +6137,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5231,7 +6146,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -5241,11 +6157,13 @@ }, "node_modules/brorand": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browser-level": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -5255,11 +6173,13 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify-aes": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5271,6 +6191,8 @@ }, "node_modules/browserslist": { "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "funding": [ { @@ -5286,7 +6208,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001489", "electron-to-chromium": "^1.4.411", @@ -5302,14 +6223,16 @@ }, "node_modules/bs58": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -5318,6 +6241,8 @@ }, "node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5332,7 +6257,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5340,20 +6264,24 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-to-arraybuffer": { "version": "0.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "node_modules/buffer-xor": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/bufferutil": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -5363,8 +6291,9 @@ }, "node_modules/bundle-name": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, - "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -5377,6 +6306,8 @@ }, "node_modules/busboy": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -5386,21 +6317,24 @@ }, "node_modules/bytes": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "license": "MIT", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -5416,7 +6350,8 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, @@ -5429,15 +6364,17 @@ }, "node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/caching-transform": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -5450,7 +6387,8 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5461,15 +6399,17 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.1" @@ -5477,16 +6417,18 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", "dev": true, - "license": "MIT", "dependencies": { "camelcase": "^7.0.0", "map-obj": "^4.3.0", @@ -5502,8 +6444,9 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5513,8 +6456,9 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -5524,13 +6468,16 @@ }, "node_modules/camelize": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", + "version": "1.0.30001497", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz", + "integrity": "sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==", "dev": true, "funding": [ { @@ -5545,31 +6492,34 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/case": { "version": "1.6.3", - "license": "(MIT OR GPL-3.0-or-later)", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", "engines": { "node": ">= 0.8.0" } }, "node_modules/caseless": { "version": "0.12.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/catering": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "engines": { "node": ">=6" } }, "node_modules/cbor": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "nofilter": "^3.1.0" @@ -5580,7 +6530,8 @@ }, "node_modules/chai": { "version": "4.3.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -5596,8 +6547,9 @@ }, "node_modules/chai-as-promised": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, - "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -5607,7 +6559,8 @@ }, "node_modules/chalk": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -5619,7 +6572,8 @@ }, "node_modules/change-case": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", "dependencies": { "camel-case": "^3.0.0", "constant-case": "^2.0.0", @@ -5643,8 +6597,9 @@ }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -5652,14 +6607,16 @@ }, "node_modules/check-error": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "engines": { "node": "*" } }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -5678,7 +6635,8 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -5693,13 +6651,14 @@ }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -5718,15 +6677,19 @@ }, "node_modules/chownr": { "version": "1.1.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/ci-info": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/cids": { "version": "0.7.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -5741,6 +6704,8 @@ }, "node_modules/cids/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -5755,7 +6720,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -5763,7 +6727,9 @@ }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -5771,7 +6737,8 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -5779,12 +6746,14 @@ }, "node_modules/class-is": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "node_modules/classic-level": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -5798,14 +6767,16 @@ }, "node_modules/clean-stack": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "engines": { "node": ">=6" } }, "node_modules/cli-boxes": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", "engines": { "node": ">=6" }, @@ -5815,7 +6786,8 @@ }, "node_modules/cli-cursor": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dependencies": { "restore-cursor": "^3.1.0" }, @@ -5825,7 +6797,8 @@ }, "node_modules/cli-spinners": { "version": "2.9.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "engines": { "node": ">=6" }, @@ -5835,8 +6808,9 @@ }, "node_modules/cli-table3": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "object-assign": "^4.1.0", @@ -5851,8 +6825,9 @@ }, "node_modules/cli-table3/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -5860,8 +6835,9 @@ }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -5869,8 +6845,9 @@ }, "node_modules/cli-table3/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -5882,8 +6859,9 @@ }, "node_modules/cli-table3/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -5894,7 +6872,8 @@ }, "node_modules/cli-truncate": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dependencies": { "slice-ansi": "^3.0.0", "string-width": "^4.2.0" @@ -5908,7 +6887,8 @@ }, "node_modules/cliui": { "version": "7.0.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -5917,7 +6897,8 @@ }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -5930,7 +6911,8 @@ }, "node_modules/cliui/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -5940,11 +6922,13 @@ }, "node_modules/cliui/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -5959,7 +6943,8 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -5969,7 +6954,8 @@ }, "node_modules/code-excerpt": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", "dependencies": { "convert-to-spaces": "^1.0.1" }, @@ -5979,33 +6965,38 @@ }, "node_modules/code-point-at": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "engines": { "node": ">=0.10.0" } }, "node_modules/color-convert": { "version": "1.9.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/colors": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6015,12 +7006,14 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "node_modules/command-line-args": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.1.0", @@ -6034,8 +7027,9 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.2", @@ -6049,8 +7043,9 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -6058,8 +7053,9 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -6067,27 +7063,31 @@ }, "node_modules/commander": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "engines": { "node": ">= 10" } }, "node_modules/commondir": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" ], - "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -6098,14 +7098,16 @@ }, "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "core-util-is": "~1.0.0", @@ -6119,8 +7121,9 @@ }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -6128,7 +7131,8 @@ }, "node_modules/constant-case": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", "dependencies": { "snake-case": "^2.1.0", "upper-case": "^1.1.1" @@ -6136,7 +7140,8 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6146,6 +7151,8 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -6159,12 +7166,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/content-hash": { "version": "2.5.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dependencies": { "cids": "^0.7.1", "multicodec": "^0.5.5", @@ -6173,41 +7180,48 @@ }, "node_modules/content-type": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/convert-to-spaces": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", "engines": { "node": ">= 4" } }, "node_modules/cookie": { "version": "0.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-util-is": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cors": { "version": "2.8.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -6218,14 +7232,16 @@ }, "node_modules/cose-base": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", "dependencies": { "layout-base": "^1.0.0" } }, "node_modules/crc-32": { "version": "1.2.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "bin": { "crc32": "bin/crc32.njs" }, @@ -6235,7 +7251,8 @@ }, "node_modules/create-hash": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6246,7 +7263,8 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6258,20 +7276,23 @@ }, "node_modules/create-require": { "version": "1.1.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true }, "node_modules/cross-fetch": { "version": "3.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", + "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", "dependencies": { "node-fetch": "^2.6.11" } }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6283,8 +7304,9 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -6292,7 +7314,8 @@ }, "node_modules/crypto-addr-codec": { "version": "0.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", + "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", "dependencies": { "base-x": "^3.0.8", "big-integer": "1.6.36", @@ -6305,13 +7328,16 @@ }, "node_modules/crypto-addr-codec/node_modules/big-integer": { "version": "1.6.36", - "license": "Unlicense", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", "engines": { "node": ">=0.6" } }, "node_modules/crypto-addr-codec/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -6325,13 +7351,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/crypto-random-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -6344,8 +7370,9 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6355,14 +7382,16 @@ }, "node_modules/css-color-keywords": { "version": "1.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", "engines": { "node": ">=4" } }, "node_modules/css-select": { "version": "5.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6376,7 +7405,8 @@ }, "node_modules/css-to-react-native": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -6385,7 +7415,8 @@ }, "node_modules/css-what": { "version": "6.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { "node": ">= 6" }, @@ -6395,11 +7426,13 @@ }, "node_modules/csstype": { "version": "3.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/cytoscape": { "version": "3.25.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -6410,7 +7443,8 @@ }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", "dependencies": { "cose-base": "^1.0.0" }, @@ -6420,7 +7454,8 @@ }, "node_modules/cytoscape-fcose": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", "dependencies": { "cose-base": "^2.2.0" }, @@ -6430,26 +7465,30 @@ }, "node_modules/cytoscape-fcose/node_modules/cose-base": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "dependencies": { "layout-base": "^2.0.0" } }, "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" }, "node_modules/d": { "version": "1.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" } }, "node_modules/d3": { - "version": "7.8.4", - "license": "ISC", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -6487,8 +7526,9 @@ } }, "node_modules/d3-array": { - "version": "3.2.3", - "license": "ISC", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { "internmap": "1 - 2" }, @@ -6498,14 +7538,16 @@ }, "node_modules/d3-axis": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "engines": { "node": ">=12" } }, "node_modules/d3-brush": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6519,7 +7561,8 @@ }, "node_modules/d3-chord": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dependencies": { "d3-path": "1 - 3" }, @@ -6529,14 +7572,16 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "engines": { "node": ">=12" } }, "node_modules/d3-contour": { "version": "4.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "dependencies": { "d3-array": "^3.2.0" }, @@ -6546,7 +7591,8 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dependencies": { "delaunator": "5" }, @@ -6556,14 +7602,16 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -6574,7 +7622,8 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -6597,14 +7646,16 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "engines": { "node": ">=12" } }, "node_modules/d3-fetch": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dependencies": { "d3-dsv": "1 - 3" }, @@ -6614,7 +7665,8 @@ }, "node_modules/d3-force": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -6626,14 +7678,16 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -6643,14 +7697,16 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { "d3-color": "1 - 3" }, @@ -6660,35 +7716,40 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "engines": { "node": ">=12" } }, "node_modules/d3-polygon": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "engines": { "node": ">=12" } }, "node_modules/d3-quadtree": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "engines": { "node": ">=12" } }, "node_modules/d3-random": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "engines": { "node": ">=12" } }, "node_modules/d3-scale": { "version": "4.0.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -6702,7 +7763,8 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -6713,14 +7775,16 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "engines": { "node": ">=12" } }, "node_modules/d3-shape": { "version": "3.2.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dependencies": { "d3-path": "^3.1.0" }, @@ -6730,7 +7794,8 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { "d3-array": "2 - 3" }, @@ -6740,7 +7805,8 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { "d3-time": "1 - 3" }, @@ -6750,14 +7816,16 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -6774,7 +7842,8 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6788,7 +7857,8 @@ }, "node_modules/dagre-d3-es": { "version": "7.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -6796,7 +7866,8 @@ }, "node_modules/dashdash": { "version": "1.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -6805,17 +7876,21 @@ } }, "node_modules/dayjs": { - "version": "1.11.7", - "license": "MIT" + "version": "1.11.8", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", + "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" }, "node_modules/death": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, "peer": true }, "node_modules/debug": { "version": "4.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -6830,15 +7905,17 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -6852,26 +7929,30 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decimal.js-light": { "version": "2.5.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" }, "node_modules/decode-uri-component": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { "mimic-response": "^3.1.0" }, @@ -6884,7 +7965,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { "node": ">=10" }, @@ -6894,7 +7976,8 @@ }, "node_modules/deep-eql": { "version": "4.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { "type-detect": "^4.0.0" }, @@ -6904,8 +7987,9 @@ }, "node_modules/deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -6913,13 +7997,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/default-browser": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, - "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -6935,8 +8021,9 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, - "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -6950,8 +8037,9 @@ }, "node_modules/default-require-extensions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -6964,15 +8052,17 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -6982,8 +8072,9 @@ }, "node_modules/define-properties": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, - "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -6997,28 +8088,32 @@ }, "node_modules/delaunator": { "version": "5.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "dependencies": { "robust-predicates": "^3.0.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7026,15 +8121,17 @@ }, "node_modules/detect-indent": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "engines": { "node": ">=4" } }, "node_modules/detect-port": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "address": "^1.0.1", @@ -7047,23 +8144,30 @@ }, "node_modules/diff": { "version": "5.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "engines": { "node": ">=0.3.1" } }, "node_modules/difflib": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "peer": true, "dependencies": { "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" } }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7073,7 +8177,8 @@ }, "node_modules/dns-packet": { "version": "5.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7083,8 +8188,9 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7094,7 +8200,8 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -7105,21 +8212,25 @@ } }, "node_modules/dom-walk": { - "version": "0.1.2" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { "domelementtype": "^2.3.0" }, @@ -7132,11 +8243,13 @@ }, "node_modules/dompurify": { "version": "2.4.5", - "license": "(MPL-2.0 OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" }, "node_modules/domutils": { "version": "3.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -7148,21 +8261,24 @@ }, "node_modules/dot-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/dotenv": { "version": "14.3.2", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", + "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", "engines": { "node": ">=12" } }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -7170,20 +8286,24 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.411", - "dev": true, - "license": "ISC" + "version": "1.4.425", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz", + "integrity": "sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==", + "dev": true }, "node_modules/elkjs": { "version": "0.8.2", - "license": "EPL-2.0" + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" }, "node_modules/elliptic": { "version": "6.5.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7196,30 +8316,35 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7230,7 +8355,8 @@ }, "node_modules/enquirer": { "version": "2.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -7240,7 +8366,8 @@ }, "node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -7250,22 +8377,25 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", @@ -7311,14 +8441,16 @@ }, "node_modules/es-array-method-boxes-properly": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/es-set-tostringtag": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3", "has": "^1.0.3", @@ -7330,16 +8462,18 @@ }, "node_modules/es-shim-unscopables": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", "dev": true, - "license": "MIT", "dependencies": { "has": "^1.0.3" } }, "node_modules/es-to-primitive": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", "dev": true, - "license": "MIT", "dependencies": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", @@ -7354,8 +8488,9 @@ }, "node_modules/es5-ext": { "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", "hasInstallScript": true, - "license": "ISC", "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", @@ -7367,12 +8502,14 @@ }, "node_modules/es6-error": { "version": "4.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true }, "node_modules/es6-iterator": { "version": "2.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", "dependencies": { "d": "1", "es5-ext": "^0.10.35", @@ -7381,11 +8518,13 @@ }, "node_modules/es6-promise": { "version": "4.2.8", - "license": "MIT" + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/es6-symbol": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "dependencies": { "d": "^1.0.1", "ext": "^1.1.2" @@ -7393,9 +8532,10 @@ }, "node_modules/esbuild": { "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -7427,13 +8567,46 @@ "esbuild-windows-arm64": "0.15.18" } }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/esbuild-darwin-64": { "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -7442,28 +8615,304 @@ "node": ">=12" } }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/escalade": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "dependencies": { "esprima": "^2.7.1", @@ -7484,8 +8933,9 @@ }, "node_modules/escodegen/node_modules/esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -7497,6 +8947,8 @@ }, "node_modules/escodegen/node_modules/estraverse": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, "peer": true, "engines": { @@ -7505,8 +8957,9 @@ }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -7518,8 +8971,9 @@ }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "deep-is": "~0.1.3", @@ -7535,6 +8989,8 @@ }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "peer": true, "engines": { @@ -7543,6 +8999,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "peer": true, @@ -7555,8 +9013,9 @@ }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -7567,8 +9026,9 @@ }, "node_modules/eslint": { "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7623,8 +9083,9 @@ }, "node_modules/eslint-config-prettier": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7634,8 +9095,9 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", @@ -7644,16 +9106,18 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -7677,8 +9141,9 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, - "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -7695,16 +9160,18 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/eslint-import-resolver-typescript/node_modules/slash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7714,8 +9181,9 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -7730,16 +9198,18 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", @@ -7766,16 +9236,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7785,13 +9257,15 @@ }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", + "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-utils": "^3.0.0", "ramda": "^0.27.1" @@ -7805,16 +9279,18 @@ }, "node_modules/eslint-plugin-no-only-tests": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, - "license": "MIT", "engines": { "node": ">=5.0.0" } }, "node_modules/eslint-plugin-prettier": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -7833,8 +9309,9 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7844,16 +9321,18 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=7" } }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -7864,8 +9343,9 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -7881,24 +9361,27 @@ }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7911,8 +9394,9 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -7926,8 +9410,9 @@ }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7937,13 +9422,15 @@ }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -7953,8 +9440,9 @@ }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -7967,16 +9455,18 @@ }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/globals": { "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -7989,16 +9479,18 @@ }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -8008,8 +9500,9 @@ }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8019,8 +9512,9 @@ }, "node_modules/espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -8032,16 +9526,18 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/esprima": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -8052,8 +9548,9 @@ }, "node_modules/esquery": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -8063,16 +9560,18 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -8082,38 +9581,43 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { "node": ">= 0.6" } }, "node_modules/eth-ens-namehash": { "version": "2.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", "dependencies": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -8121,12 +9625,14 @@ }, "node_modules/eth-ens-namehash/node_modules/js-sha3": { "version": "0.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, "node_modules/eth-gas-reporter": { "version": "0.2.25", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", + "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.0-beta.146", @@ -8156,8 +9662,9 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-colors": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8165,8 +9672,9 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8174,14 +9682,16 @@ }, "node_modules/eth-gas-reporter/node_modules/bn.js": { "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/chokidar": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "anymatch": "~3.1.1", @@ -8201,8 +9711,9 @@ }, "node_modules/eth-gas-reporter/node_modules/cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "string-width": "^3.1.0", @@ -8212,8 +9723,9 @@ }, "node_modules/eth-gas-reporter/node_modules/colors": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.1.90" @@ -8221,8 +9733,10 @@ }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -8230,8 +9744,9 @@ }, "node_modules/eth-gas-reporter/node_modules/diff": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -8239,14 +9754,16 @@ }, "node_modules/eth-gas-reporter/node_modules/emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/ethers": { "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "aes-js": "3.0.0", @@ -8262,8 +9779,9 @@ }, "node_modules/eth-gas-reporter/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "locate-path": "^3.0.0" @@ -8274,8 +9792,9 @@ }, "node_modules/eth-gas-reporter/node_modules/flat": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "is-buffer": "~2.0.3" @@ -8286,8 +9805,11 @@ }, "node_modules/eth-gas-reporter/node_modules/fsevents": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "license": "MIT", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -8299,8 +9821,9 @@ }, "node_modules/eth-gas-reporter/node_modules/glob": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -8316,8 +9839,9 @@ }, "node_modules/eth-gas-reporter/node_modules/hash.js": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -8326,8 +9850,9 @@ }, "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -8335,14 +9860,16 @@ }, "node_modules/eth-gas-reporter/node_modules/js-sha3": { "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/js-yaml": { "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -8354,8 +9881,9 @@ }, "node_modules/eth-gas-reporter/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-locate": "^3.0.0", @@ -8367,8 +9895,9 @@ }, "node_modules/eth-gas-reporter/node_modules/log-symbols": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2" @@ -8379,8 +9908,9 @@ }, "node_modules/eth-gas-reporter/node_modules/minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -8391,8 +9921,9 @@ }, "node_modules/eth-gas-reporter/node_modules/mkdirp": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5" @@ -8403,8 +9934,9 @@ }, "node_modules/eth-gas-reporter/node_modules/mocha": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", + "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-colors": "3.2.3", @@ -8446,14 +9978,16 @@ }, "node_modules/eth-gas-reporter/node_modules/ms": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/object.assign": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.1.2", @@ -8467,8 +10001,9 @@ }, "node_modules/eth-gas-reporter/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -8482,8 +10017,9 @@ }, "node_modules/eth-gas-reporter/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.0.0" @@ -8494,8 +10030,9 @@ }, "node_modules/eth-gas-reporter/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -8503,8 +10040,9 @@ }, "node_modules/eth-gas-reporter/node_modules/readdirp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "picomatch": "^2.0.4" @@ -8515,20 +10053,23 @@ }, "node_modules/eth-gas-reporter/node_modules/scrypt-js": { "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/setimmediate": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "emoji-regex": "^7.0.1", @@ -8541,8 +10082,9 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -8553,8 +10095,9 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -8562,8 +10105,9 @@ }, "node_modules/eth-gas-reporter/node_modules/supports-color": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -8574,13 +10118,17 @@ }, "node_modules/eth-gas-reporter/node_modules/uuid": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "peer": true }, "node_modules/eth-gas-reporter/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -8591,8 +10139,9 @@ }, "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -8605,14 +10154,16 @@ }, "node_modules/eth-gas-reporter/node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/eth-gas-reporter/node_modules/yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "cliui": "^5.0.0", @@ -8629,8 +10180,9 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -8639,8 +10191,9 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "flat": "^4.1.0", @@ -8653,7 +10206,8 @@ }, "node_modules/eth-lib": { "version": "0.1.29", - "license": "MIT", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -8665,11 +10219,13 @@ }, "node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/eth-lib/node_modules/ws": { "version": "3.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -8678,14 +10234,16 @@ }, "node_modules/ethereum-bloom-filters": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dependencies": { "js-sha3": "^0.8.0" } }, "node_modules/ethereum-cryptography": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -8695,7 +10253,8 @@ }, "node_modules/ethereum-ens": { "version": "0.8.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", "dependencies": { "bluebird": "^3.4.7", "eth-ens-namehash": "^2.0.0", @@ -8707,11 +10266,13 @@ }, "node_modules/ethereum-ens/node_modules/js-sha3": { "version": "0.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, "node_modules/ethereumjs-abi": { "version": "0.6.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -8719,11 +10280,13 @@ }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util": { "version": "6.2.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -8736,18 +10299,21 @@ }, "node_modules/ethereumjs-util/node_modules/@types/bn.js": { "version": "4.11.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dependencies": { "@types/node": "*" } }, "node_modules/ethereumjs-util/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -8768,6 +10334,8 @@ }, "node_modules/ethers": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "funding": [ { "type": "individual", @@ -8778,7 +10346,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -8814,6 +10381,8 @@ }, "node_modules/ethers/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -8824,7 +10393,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -8835,7 +10403,8 @@ }, "node_modules/ethjs-unit": { "version": "0.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -8847,11 +10416,13 @@ }, "node_modules/ethjs-unit/node_modules/bn.js": { "version": "4.11.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/ethjs-util": { "version": "0.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -8863,18 +10434,21 @@ }, "node_modules/event-target-shim": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "engines": { "node": ">=6" } }, "node_modules/eventemitter3": { "version": "4.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -8882,8 +10456,9 @@ }, "node_modules/execa": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -8904,8 +10479,9 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -8915,7 +10491,8 @@ }, "node_modules/express": { "version": "4.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -8955,7 +10532,8 @@ }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -8977,21 +10555,24 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9001,15 +10582,18 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -9022,7 +10606,8 @@ }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -9035,6 +10620,8 @@ }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -9048,34 +10635,38 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/ext": { "version": "1.7.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { "version": "2.7.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/extend": { "version": "3.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/fast-check": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", "dependencies": { "pure-rand": "^5.0.1" }, @@ -9089,17 +10680,20 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true }, "node_modules/fast-glob": { "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9113,25 +10707,29 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -9140,9 +10738,10 @@ } }, "node_modules/file-type": { - "version": "18.4.0", + "version": "18.5.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz", + "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", "dev": true, - "license": "MIT", "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -9157,7 +10756,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9167,7 +10767,8 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -9183,19 +10784,22 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -9210,8 +10814,9 @@ }, "node_modules/find-replace": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.0.1" @@ -9222,7 +10827,8 @@ }, "node_modules/find-up": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dependencies": { "locate-path": "^2.0.0" }, @@ -9232,15 +10838,17 @@ }, "node_modules/flat": { "version": "5.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -9251,18 +10859,20 @@ }, "node_modules/flatted": { "version": "3.2.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9274,15 +10884,17 @@ }, "node_modules/for-each": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -9293,14 +10905,16 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } }, "node_modules/form-data": { "version": "2.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -9312,28 +10926,34 @@ }, "node_modules/form-data-encoder": { "version": "1.7.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, "node_modules/forwarded": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, "node_modules/fp-ts": { "version": "1.19.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" }, "node_modules/fresh": { "version": "0.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -9348,12 +10968,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs-extra": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -9365,24 +10985,29 @@ }, "node_modules/fs-minipass": { "version": "1.2.7", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dependencies": { "minipass": "^2.6.0" } }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -9393,12 +11018,14 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -9414,41 +11041,47 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -9461,16 +11094,18 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-port": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -9478,8 +11113,9 @@ }, "node_modules/get-stdin": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9489,7 +11125,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { "node": ">=10" }, @@ -9499,8 +11136,9 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -9514,8 +11152,9 @@ }, "node_modules/get-tsconfig": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz", + "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -9525,15 +11164,17 @@ }, "node_modules/getpass": { "version": "0.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/ghost-testrpc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -9545,7 +11186,8 @@ }, "node_modules/glob": { "version": "7.2.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9563,7 +11205,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -9573,7 +11216,8 @@ }, "node_modules/global": { "version": "4.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -9581,8 +11225,9 @@ }, "node_modules/global-modules": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "global-prefix": "^3.0.0" @@ -9593,8 +11238,9 @@ }, "node_modules/global-prefix": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ini": "^1.3.5", @@ -9607,8 +11253,9 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -9619,15 +11266,17 @@ }, "node_modules/globals": { "version": "11.12.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -9640,8 +11289,9 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9659,15 +11309,17 @@ }, "node_modules/globby/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/gopd": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -9677,7 +11329,8 @@ }, "node_modules/got": { "version": "12.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", "dependencies": { "@sindresorhus/is": "^4.6.0", "@szmarczak/http-timer": "^5.0.1", @@ -9702,30 +11355,35 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "license": "ISC" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/growl": { "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.x" } }, "node_modules/handlebars": { "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5", @@ -9745,14 +11403,17 @@ }, "node_modules/har-schema": { "version": "2.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -9763,15 +11424,17 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/hardhat": { - "version": "2.14.0", - "license": "MIT", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.15.0.tgz", + "integrity": "sha512-cC9tM/N10YaES04zPOp7yR13iX3YibqaNmi0//Ep40Nt9ELIJx3kFpQmucur0PAIfXYpGnw5RuXHNLkxpnVHEw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -9845,8 +11508,9 @@ }, "node_modules/hardhat-gas-reporter": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-uniq": "1.0.3", @@ -9859,7 +11523,8 @@ }, "node_modules/hardhat-watcher": { "version": "2.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", + "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", "dependencies": { "chokidar": "^3.5.3" }, @@ -9869,25 +11534,29 @@ }, "node_modules/hardhat/node_modules/ansi-colors": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "engines": { "node": ">=6" } }, "node_modules/hardhat/node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/hardhat/node_modules/brace-expansion": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/hardhat/node_modules/escape-string-regexp": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { "node": ">=10" }, @@ -9897,7 +11566,8 @@ }, "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -9909,14 +11579,16 @@ }, "node_modules/hardhat/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/hardhat/node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -9926,14 +11598,16 @@ }, "node_modules/hardhat/node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/hardhat/node_modules/locate-path": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { "p-locate": "^5.0.0" }, @@ -9946,7 +11620,8 @@ }, "node_modules/hardhat/node_modules/minimatch": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9956,7 +11631,8 @@ }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -9994,7 +11670,8 @@ }, "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -10008,11 +11685,13 @@ }, "node_modules/hardhat/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/hardhat/node_modules/nanoid": { "version": "3.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10022,7 +11701,8 @@ }, "node_modules/hardhat/node_modules/p-limit": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10035,7 +11715,8 @@ }, "node_modules/hardhat/node_modules/p-locate": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { "p-limit": "^3.0.2" }, @@ -10048,14 +11729,16 @@ }, "node_modules/hardhat/node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/hardhat/node_modules/resolve": { "version": "1.17.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dependencies": { "path-parse": "^1.0.6" }, @@ -10065,14 +11748,16 @@ }, "node_modules/hardhat/node_modules/semver": { "version": "6.3.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/hardhat/node_modules/supports-color": { "version": "8.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dependencies": { "has-flag": "^4.0.0" }, @@ -10085,18 +11770,21 @@ }, "node_modules/hardhat/node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/hardhat/node_modules/workerpool": { "version": "6.2.1", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" }, "node_modules/has": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dependencies": { "function-bind": "^1.1.1" }, @@ -10106,23 +11794,26 @@ }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -10132,7 +11823,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -10142,7 +11834,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -10152,7 +11845,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { "has-symbols": "^1.0.2" }, @@ -10165,7 +11859,8 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -10177,6 +11872,8 @@ }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -10190,16 +11887,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/hash-test-vectors": { "version": "1.3.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", + "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" }, "node_modules/hash.js": { "version": "1.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -10207,8 +11905,9 @@ }, "node_modules/hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -10222,22 +11921,25 @@ }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/he": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.3" @@ -10245,22 +11947,26 @@ }, "node_modules/heap": { "version": "0.2.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" }, "node_modules/highlight.js": { "version": "10.7.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "engines": { "node": "*" } }, "node_modules/highlightjs-solidity": { "version": "2.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -10269,19 +11975,22 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -10291,19 +12000,23 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10311,7 +12024,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -10321,8 +12033,9 @@ }, "node_modules/http-basic": { "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "caseless": "^0.12.0", @@ -10336,11 +12049,13 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10354,12 +12069,14 @@ }, "node_modules/http-https": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, "node_modules/http-response-object": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "^10.0.3" @@ -10367,13 +12084,15 @@ }, "node_modules/http-response-object/node_modules/@types/node": { "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/http-signature": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -10386,7 +12105,8 @@ }, "node_modules/http2-wrapper": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -10397,7 +12117,8 @@ }, "node_modules/http2-wrapper/node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -10407,7 +12128,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -10418,15 +12140,17 @@ }, "node_modules/human-signals": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10436,7 +12160,8 @@ }, "node_modules/idna-uts46-hx": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dependencies": { "punycode": "2.1.0" }, @@ -10446,13 +12171,16 @@ }, "node_modules/idna-uts46-hx/node_modules/punycode": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", "engines": { "node": ">=6" } }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -10466,25 +12194,27 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immutable": { "version": "4.3.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", + "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10498,30 +12228,34 @@ }, "node_modules/import-lazy": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10529,17 +12263,20 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/ink": { "version": "3.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", + "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", "dependencies": { "ansi-escapes": "^4.2.1", "auto-bind": "4.0.0", @@ -10580,7 +12317,8 @@ }, "node_modules/ink-spinner": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", + "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", "dependencies": { "cli-spinners": "^2.3.0" }, @@ -10594,7 +12332,8 @@ }, "node_modules/ink/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -10607,7 +12346,8 @@ }, "node_modules/ink/node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -10621,7 +12361,8 @@ }, "node_modules/ink/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -10631,18 +12372,21 @@ }, "node_modules/ink/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/ink/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/ink/node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -10652,7 +12396,8 @@ }, "node_modules/ink/node_modules/type-fest": { "version": "0.12.0", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", "engines": { "node": ">=10" }, @@ -10662,7 +12407,8 @@ }, "node_modules/ink/node_modules/ws": { "version": "7.5.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, @@ -10681,8 +12427,9 @@ }, "node_modules/internal-slot": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -10694,15 +12441,17 @@ }, "node_modules/internmap": { "version": "2.0.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "engines": { "node": ">=12" } }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 0.10" @@ -10710,28 +12459,32 @@ }, "node_modules/invert-kv": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/io-ts": { "version": "1.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dependencies": { "fp-ts": "^1.0.0" } }, "node_modules/ipaddr.js": { "version": "1.9.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { "node": ">= 0.10" } }, "node_modules/is-arguments": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10745,8 +12498,9 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -10758,12 +12512,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -10773,7 +12529,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10783,8 +12540,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10798,6 +12556,8 @@ }, "node_modules/is-buffer": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "funding": [ { "type": "github", @@ -10812,14 +12572,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/is-callable": { "version": "1.2.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -10829,7 +12589,8 @@ }, "node_modules/is-ci": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "dependencies": { "ci-info": "^2.0.0" }, @@ -10839,7 +12600,8 @@ }, "node_modules/is-core-module": { "version": "2.12.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dependencies": { "has": "^1.0.3" }, @@ -10849,8 +12611,9 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10863,8 +12626,9 @@ }, "node_modules/is-docker": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -10877,25 +12641,29 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-function": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "node_modules/is-generator-function": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10908,7 +12676,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -10918,7 +12687,8 @@ }, "node_modules/is-hex-prefixed": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -10926,8 +12696,9 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -10943,15 +12714,17 @@ }, "node_modules/is-lower-case": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", "dependencies": { "lower-case": "^1.1.0" } }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10961,15 +12734,17 @@ }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -10982,24 +12757,27 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11013,8 +12791,9 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -11024,8 +12803,9 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11035,8 +12815,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11049,8 +12830,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -11063,7 +12845,8 @@ }, "node_modules/is-typed-array": { "version": "1.1.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -11080,11 +12863,13 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { "node": ">=10" }, @@ -11094,19 +12879,22 @@ }, "node_modules/is-upper-case": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", "dependencies": { "upper-case": "^1.1.0" } }, "node_modules/is-utf8": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -11116,16 +12904,18 @@ }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -11135,8 +12925,9 @@ }, "node_modules/is-wsl/node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -11149,30 +12940,35 @@ }, "node_modules/isarray": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isstream": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -11182,8 +12978,9 @@ }, "node_modules/istanbul-lib-instrument": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -11196,16 +12993,18 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -11220,8 +13019,9 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11231,8 +13031,9 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -11244,16 +13045,18 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11263,8 +13066,9 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -11276,8 +13080,9 @@ }, "node_modules/istanbul-reports": { "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -11288,19 +13093,22 @@ }, "node_modules/jju": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true }, "node_modules/js-graph-algorithms": { "version": "1.0.18", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-graph-algorithms/-/js-graph-algorithms-1.0.18.tgz", + "integrity": "sha512-Gu1wtWzXBzGeye/j9BuyplGHscwqKRZodp/0M1vyBc19RJpblSwKGu099KwwaTx9cRIV+Qupk8xUMfEiGfFqSA==", "bin": { "js-graphs": "src/jsgraphs.js" } }, "node_modules/js-sdsl": { - "version": "4.4.0", - "license": "MIT", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz", + "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -11308,16 +13116,19 @@ }, "node_modules/js-sha3": { "version": "0.8.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/js-tokens": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11328,15 +13139,18 @@ }, "node_modules/jsbi": { "version": "3.2.5", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", + "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" }, "node_modules/jsbn": { "version": "0.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, @@ -11346,39 +13160,47 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -11388,12 +13210,14 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -11403,8 +13227,9 @@ }, "node_modules/jsonschema": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": "*" @@ -11412,7 +13237,8 @@ }, "node_modules/jsprim": { "version": "1.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -11425,13 +13251,15 @@ }, "node_modules/just-extend": { "version": "4.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, "node_modules/keccak": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", + "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -11443,43 +13271,51 @@ }, "node_modules/keyv": { "version": "4.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/khroma": { - "version": "2.0.0" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klaw": { "version": "1.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "optionalDependencies": { "graceful-fs": "^4.1.9" } }, "node_modules/kleur": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { "node": ">=6" } }, "node_modules/layout-base": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" }, "node_modules/lcid": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dependencies": { "invert-kv": "^1.0.0" }, @@ -11489,7 +13325,8 @@ }, "node_modules/level": { "version": "8.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dependencies": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -11504,14 +13341,16 @@ }, "node_modules/level-supports": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "engines": { "node": ">=12" } }, "node_modules/level-transcoder": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -11522,8 +13361,9 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -11534,13 +13374,15 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -11553,15 +13395,17 @@ }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/locate-path": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -11572,49 +13416,59 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" }, "node_modules/lodash.assign": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true }, "node_modules/lodash.isequal": { "version": "4.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -11628,7 +13482,8 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -11641,7 +13496,8 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11655,7 +13511,8 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -11665,18 +13522,21 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { "node": ">=8" } }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dependencies": { "has-flag": "^4.0.0" }, @@ -11686,7 +13546,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -11696,25 +13557,29 @@ }, "node_modules/loupe": { "version": "2.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dependencies": { "get-func-name": "^2.0.0" } }, "node_modules/lower-case": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "node_modules/lower-case-first": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", "dependencies": { "lower-case": "^1.1.2" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -11724,24 +13589,28 @@ }, "node_modules/lru_map": { "version": "0.3.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { "version": "5.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lunr": { "version": "2.3.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true }, "node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -11754,21 +13623,24 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11778,14 +13650,16 @@ }, "node_modules/markdown-table": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/marked": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, - "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -11795,14 +13669,16 @@ }, "node_modules/mcl-wasm": { "version": "0.7.9", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "engines": { "node": ">=8.9.0" } }, "node_modules/md5.js": { "version": "1.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -11811,14 +13687,16 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, "node_modules/memory-level": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -11830,14 +13708,17 @@ }, "node_modules/memorystream": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "engines": { "node": ">= 0.10.0" } }, "node_modules/meow": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", + "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^8.0.2", @@ -11861,8 +13742,9 @@ }, "node_modules/meow/node_modules/decamelize": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -11872,8 +13754,9 @@ }, "node_modules/meow/node_modules/find-up": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -11887,8 +13770,9 @@ }, "node_modules/meow/node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -11898,8 +13782,9 @@ }, "node_modules/meow/node_modules/locate-path": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -11912,8 +13797,9 @@ }, "node_modules/meow/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -11923,8 +13809,9 @@ }, "node_modules/meow/node_modules/p-limit": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -11937,8 +13824,9 @@ }, "node_modules/meow/node_modules/p-locate": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -11951,8 +13839,9 @@ }, "node_modules/meow/node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -11968,16 +13857,18 @@ }, "node_modules/meow/node_modules/path-exists": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/meow/node_modules/read-pkg": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -11993,8 +13884,9 @@ }, "node_modules/meow/node_modules/read-pkg-up": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", @@ -12009,8 +13901,9 @@ }, "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -12020,8 +13913,9 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -12034,8 +13928,9 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -12044,9 +13939,10 @@ } }, "node_modules/meow/node_modules/type-fest": { - "version": "3.11.0", + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.11.1.tgz", + "integrity": "sha512-aCuRNRERRVh33lgQaJRlUxZqzfhzwTrsE98Mc3o3VXqmiaQdHacgUtJ0esp+7MvZ92qhtzKPeusaX6vIEcoreA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, @@ -12056,21 +13952,24 @@ }, "node_modules/meow/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/meow/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/meow/node_modules/yocto-queue": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.20" }, @@ -12080,24 +13979,28 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/mermaid": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", + "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", "dependencies": { "@braintree/sanitize-url": "^6.0.0", "@khanacademy/simple-markdown": "^0.8.6", @@ -12120,7 +14023,8 @@ }, "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { "version": "0.8.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", + "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", "dependencies": { "@types/react": ">=16.0.0" }, @@ -12131,7 +14035,8 @@ }, "node_modules/mermaid/node_modules/react": { "version": "16.14.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -12144,7 +14049,8 @@ }, "node_modules/mermaid/node_modules/react-dom": { "version": "16.14.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -12158,7 +14064,8 @@ }, "node_modules/mermaid/node_modules/scheduler": { "version": "0.19.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -12167,22 +14074,25 @@ }, "node_modules/mermaid/node_modules/uuid": { "version": "9.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/methods": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -12193,7 +14103,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, @@ -12203,14 +14114,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -12220,8 +14133,9 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12231,36 +14145,43 @@ }, "node_modules/mimic-response": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { "node": ">=4" } }, "node_modules/min-document": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { "dom-walk": "^0.1.0" } }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12270,15 +14191,17 @@ }, "node_modules/minimist": { "version": "1.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -12290,7 +14213,8 @@ }, "node_modules/minipass": { "version": "2.9.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -12298,14 +14222,16 @@ }, "node_modules/minizlib": { "version": "1.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { "minipass": "^2.9.0" } }, "node_modules/mkdirp": { "version": "0.5.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -12315,7 +14241,9 @@ }, "node_modules/mkdirp-promise": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", "dependencies": { "mkdirp": "*" }, @@ -12325,15 +14253,17 @@ }, "node_modules/mnemonist": { "version": "0.38.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dependencies": { "obliterator": "^2.0.0" } }, "node_modules/mocha": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, - "license": "MIT", "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -12374,21 +14304,24 @@ }, "node_modules/mocha/node_modules/ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -12403,13 +14336,15 @@ }, "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -12419,8 +14354,9 @@ }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12434,16 +14370,18 @@ }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -12453,8 +14391,9 @@ }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -12467,8 +14406,9 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12478,13 +14418,15 @@ }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -12497,8 +14439,9 @@ }, "node_modules/mocha/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -12511,16 +14454,18 @@ }, "node_modules/mocha/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12533,22 +14478,27 @@ }, "node_modules/mock-fs": { "version": "4.14.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, "node_modules/module-error": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multibase": { "version": "0.6.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -12556,6 +14506,8 @@ }, "node_modules/multibase/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -12570,7 +14522,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12578,14 +14529,17 @@ }, "node_modules/multicodec": { "version": "0.5.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "varint": "^5.0.0" } }, "node_modules/multihashes": { "version": "0.4.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", "dependencies": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -12594,6 +14548,8 @@ }, "node_modules/multihashes/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -12608,7 +14564,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12616,7 +14571,9 @@ }, "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -12624,16 +14581,19 @@ }, "node_modules/nano-base32": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" }, "node_modules/nano-json-stream-parser": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/nanoid": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12643,21 +14603,25 @@ }, "node_modules/napi-macros": { "version": "2.2.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "node_modules/ndjson": { "version": "2.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", "dependencies": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.5", @@ -12674,25 +14638,29 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/next-tick": { "version": "1.1.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nise": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", @@ -12703,43 +14671,49 @@ }, "node_modules/nise/node_modules/@sinonjs/commons": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", + "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/no-case": { "version": "2.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dependencies": { "lower-case": "^1.1.1" } }, "node_modules/node-addon-api": { "version": "2.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-emoji": { "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.21" @@ -12747,8 +14721,9 @@ }, "node_modules/node-environment-flags": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", + "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, - "license": "Apache-2.0", "peer": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3", @@ -12757,8 +14732,9 @@ }, "node_modules/node-environment-flags/node_modules/semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "license": "ISC", "peer": true, "bin": { "semver": "bin/semver" @@ -12766,7 +14742,8 @@ }, "node_modules/node-fetch": { "version": "2.6.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12784,7 +14761,8 @@ }, "node_modules/node-gyp-build": { "version": "4.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -12793,8 +14771,9 @@ }, "node_modules/node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -12804,13 +14783,15 @@ }, "node_modules/node-releases": { "version": "2.0.12", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "dev": true }, "node_modules/nofilter": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=12.19" @@ -12818,12 +14799,14 @@ }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" }, "node_modules/nopt": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "abbrev": "1" @@ -12834,8 +14817,9 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -12848,14 +14832,16 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { "node": ">=10" }, @@ -12865,8 +14851,9 @@ }, "node_modules/npm-run-path": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -12879,8 +14866,9 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12890,7 +14878,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -12900,14 +14889,16 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/number-to-bn": { "version": "1.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -12919,12 +14910,14 @@ }, "node_modules/number-to-bn/node_modules/bn.js": { "version": "4.11.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/nyc": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -12963,8 +14956,9 @@ }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -12973,8 +14967,9 @@ }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -12985,8 +14980,9 @@ }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -12996,8 +14992,9 @@ }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13010,8 +15007,9 @@ }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13021,8 +15019,9 @@ }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13032,37 +15031,42 @@ }, "node_modules/nyc/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/nyc/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -13082,8 +15086,9 @@ }, "node_modules/nyc/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -13094,44 +15099,50 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "engines": { "node": "*" } }, "node_modules/object-assign": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-hash": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", "engines": { "node": ">= 6" } }, "node_modules/object-inspect": { "version": "1.12.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -13147,8 +15158,9 @@ }, "node_modules/object.getownpropertydescriptors": { "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array.prototype.reduce": "^1.0.5", @@ -13166,8 +15178,9 @@ }, "node_modules/object.values": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -13182,18 +15195,21 @@ }, "node_modules/obliterator": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" }, "node_modules/oboe": { "version": "2.1.5", - "license": "BSD", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dependencies": { "http-https": "^1.0.0" } }, "node_modules/on-finished": { "version": "2.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -13203,15 +15219,17 @@ }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -13224,8 +15242,9 @@ }, "node_modules/open": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "license": "MIT", "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -13241,8 +15260,9 @@ }, "node_modules/open-cli": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", + "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", "dev": true, - "license": "MIT", "dependencies": { "file-type": "^18.2.1", "get-stdin": "^9.0.0", @@ -13262,8 +15282,9 @@ }, "node_modules/optionator": { "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -13278,13 +15299,15 @@ }, "node_modules/ordinal": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/os-locale": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dependencies": { "lcid": "^1.0.0" }, @@ -13294,21 +15317,24 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } }, "node_modules/p-cancelable": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { "p-try": "^1.0.0" }, @@ -13318,7 +15344,8 @@ }, "node_modules/p-locate": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dependencies": { "p-limit": "^1.1.0" }, @@ -13328,7 +15355,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13341,15 +15369,17 @@ }, "node_modules/p-try": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "engines": { "node": ">=4" } }, "node_modules/package-hash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -13362,19 +15392,22 @@ }, "node_modules/pako": { "version": "1.0.11", - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/param-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13384,17 +15417,21 @@ }, "node_modules/parse-cache-control": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", "dev": true, "peer": true }, "node_modules/parse-headers": { "version": "2.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -13405,7 +15442,8 @@ }, "node_modules/parse5": { "version": "7.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -13415,7 +15453,8 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -13426,14 +15465,16 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", "dependencies": { "camel-case": "^3.0.0", "upper-case-first": "^1.1.0" @@ -13441,70 +15482,80 @@ }, "node_modules/patch-console": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", + "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", "engines": { "node": ">=10" } }, "node_modules/path-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/path-exists": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "engines": { "node": "*" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13518,8 +15569,9 @@ }, "node_modules/peek-readable": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -13530,16 +15582,19 @@ }, "node_modules/performance-now": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -13549,22 +15604,25 @@ }, "node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pinkie": { "version": "2.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { "pinkie": "^2.0.0" }, @@ -13574,8 +15632,9 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -13585,8 +15644,9 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13597,8 +15657,9 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13608,8 +15669,9 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13622,8 +15684,9 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13633,24 +15696,27 @@ }, "node_modules/pkg-dir/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pkg-up": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -13660,6 +15726,8 @@ }, "node_modules/postcss": { "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -13675,7 +15743,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -13687,10 +15754,13 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "funding": [ { @@ -13698,7 +15768,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13708,16 +15777,18 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -13727,8 +15798,9 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -13738,21 +15810,24 @@ }, "node_modules/process": { "version": "0.11.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/process-on-spawn": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -13762,16 +15837,18 @@ }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "asap": "~2.0.6" @@ -13779,7 +15856,8 @@ }, "node_modules/prompts": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -13790,7 +15868,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "peer": true, "dependencies": { "loose-envify": "^1.4.0", @@ -13800,12 +15879,14 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "peer": true }, "node_modules/proxy-addr": { "version": "2.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -13816,11 +15897,13 @@ }, "node_modules/psl": { "version": "1.9.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pump": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -13828,13 +15911,16 @@ }, "node_modules/punycode": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", "funding": [ { "type": "individual", @@ -13844,17 +15930,18 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/purecss": { "version": "2.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", + "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", + "dev": true }, "node_modules/qs": { "version": "6.11.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dependencies": { "side-channel": "^1.0.4" }, @@ -13867,7 +15954,8 @@ }, "node_modules/query-string": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -13879,6 +15967,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -13892,13 +15982,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { "version": "6.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", + "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -13908,26 +15998,30 @@ }, "node_modules/ramda": { "version": "0.27.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true }, "node_modules/randombytes": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -13940,7 +16034,8 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -13950,7 +16045,8 @@ }, "node_modules/react": { "version": "17.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -13962,7 +16058,8 @@ }, "node_modules/react-devtools-core": { "version": "4.27.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.8.tgz", + "integrity": "sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw==", "dependencies": { "shell-quote": "^1.6.1", "ws": "^7" @@ -13970,7 +16067,8 @@ }, "node_modules/react-dom": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -13981,19 +16079,22 @@ }, "node_modules/react-dom/node_modules/scheduler": { "version": "0.23.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/react-is": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "peer": true }, "node_modules/react-reconciler": { "version": "0.26.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", + "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -14008,15 +16109,17 @@ }, "node_modules/react-refresh": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { "version": "6.11.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.0.tgz", + "integrity": "sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==", "dependencies": { "@remix-run/router": "1.6.0" }, @@ -14029,7 +16132,8 @@ }, "node_modules/react-router-dom": { "version": "6.11.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.0.tgz", + "integrity": "sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==", "dependencies": { "@remix-run/router": "1.6.0", "react-router": "6.11.0" @@ -14044,8 +16148,9 @@ }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -14057,8 +16162,9 @@ }, "node_modules/read-pkg-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" @@ -14069,13 +16175,15 @@ }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14085,8 +16193,9 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -14096,15 +16205,17 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14116,8 +16227,9 @@ }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "^3.6.0" }, @@ -14131,7 +16243,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -14141,6 +16254,8 @@ }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "peer": true, "dependencies": { @@ -14152,8 +16267,9 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimatch": "^3.0.5" @@ -14164,8 +16280,9 @@ }, "node_modules/redent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, - "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -14179,8 +16296,9 @@ }, "node_modules/redent/node_modules/indent-string": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14190,8 +16308,9 @@ }, "node_modules/reduce-flatten": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -14199,12 +16318,14 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "license": "MIT" + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -14219,8 +16340,9 @@ }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -14230,8 +16352,9 @@ }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -14241,8 +16364,9 @@ }, "node_modules/req-cwd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "req-from": "^2.0.0" @@ -14253,8 +16377,9 @@ }, "node_modules/req-from": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "resolve-from": "^3.0.0" @@ -14265,8 +16390,9 @@ }, "node_modules/req-from/node_modules/resolve-from": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -14274,7 +16400,9 @@ }, "node_modules/request": { "version": "2.88.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -14303,8 +16431,9 @@ }, "node_modules/request-promise-core": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "lodash": "^4.17.19" @@ -14318,8 +16447,10 @@ }, "node_modules/request-promise-native": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "request-promise-core": "1.1.4", @@ -14335,40 +16466,47 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/resolve": { "version": "1.22.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -14383,27 +16521,31 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -14413,14 +16555,16 @@ }, "node_modules/responselike/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/restore-cursor": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" @@ -14431,14 +16575,16 @@ }, "node_modules/restore-cursor/node_modules/mimic-fn": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "engines": { "node": ">=6" } }, "node_modules/restore-cursor/node_modules/onetime": { "version": "5.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14451,8 +16597,9 @@ }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14460,8 +16607,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14474,7 +16622,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -14482,13 +16631,16 @@ }, "node_modules/ripemd160-min": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", "engines": { "node": ">=8" } }, "node_modules/rlp": { "version": "2.2.7", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dependencies": { "bn.js": "^5.2.0" }, @@ -14498,12 +16650,14 @@ }, "node_modules/robust-predicates": { "version": "3.0.2", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "3.23.0", + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.24.0.tgz", + "integrity": "sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ==", "dev": true, - "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -14517,8 +16671,9 @@ }, "node_modules/run-applescript": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0" }, @@ -14531,8 +16686,9 @@ }, "node_modules/run-applescript/node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14553,24 +16709,27 @@ }, "node_modules/run-applescript/node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/run-applescript/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-applescript/node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -14580,8 +16739,9 @@ }, "node_modules/run-applescript/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14594,14 +16754,17 @@ }, "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -14617,13 +16780,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/run-parallel-limit": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "funding": [ { "type": "github", @@ -14638,23 +16802,25 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rustbn.js": { "version": "0.2.0", - "license": "(MIT OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "node_modules/rw": { "version": "1.3.3", - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" }, "node_modules/safe-array-concat": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -14671,18 +16837,21 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex-test": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -14694,12 +16863,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sc-istanbul": { "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "abbrev": "1.0.x", @@ -14723,8 +16894,9 @@ }, "node_modules/sc-istanbul/node_modules/esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -14736,8 +16908,9 @@ }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "inflight": "^1.0.4", @@ -14752,8 +16925,9 @@ }, "node_modules/sc-istanbul/node_modules/has-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -14761,14 +16935,16 @@ }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^1.0.0" @@ -14779,8 +16955,9 @@ }, "node_modules/sc-istanbul/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -14791,7 +16968,8 @@ }, "node_modules/scheduler": { "version": "0.20.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", "dependencies": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -14799,12 +16977,14 @@ }, "node_modules/scrypt-js": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/secp256k1": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -14816,8 +16996,9 @@ }, "node_modules/semver": { "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14830,8 +17011,9 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -14841,12 +17023,14 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/send": { "version": "0.18.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -14868,22 +17052,26 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sentence-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", "dependencies": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -14891,7 +17079,8 @@ }, "node_modules/serialize-error": { "version": "8.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", + "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", "dependencies": { "type-fest": "^0.20.2" }, @@ -14904,7 +17093,8 @@ }, "node_modules/serialize-error/node_modules/type-fest": { "version": "0.20.2", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "engines": { "node": ">=10" }, @@ -14914,14 +17104,16 @@ }, "node_modules/serialize-javascript": { "version": "6.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -14934,7 +17126,8 @@ }, "node_modules/servify": { "version": "0.1.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dependencies": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -14948,19 +17141,23 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/setimmediate": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -14971,8 +17168,9 @@ }, "node_modules/sha1": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "charenc": ">= 0.0.1", @@ -14984,19 +17182,22 @@ }, "node_modules/sha3": { "version": "2.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", "dependencies": { "buffer": "6.0.3" } }, "node_modules/shallowequal": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15006,23 +17207,26 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "glob": "^7.0.0", @@ -15038,8 +17242,9 @@ }, "node_modules/shiki": { "version": "0.14.2", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", + "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", @@ -15049,7 +17254,8 @@ }, "node_modules/side-channel": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -15061,10 +17267,13 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-concat": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -15078,12 +17287,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/simple-get": { "version": "2.8.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -15092,7 +17301,8 @@ }, "node_modules/simple-get/node_modules/decompress-response": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -15102,8 +17312,9 @@ }, "node_modules/sinon": { "version": "12.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz", + "integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.8.3", "@sinonjs/fake-timers": "^8.1.0", @@ -15119,16 +17330,18 @@ }, "node_modules/sinon/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/sinon/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -15138,19 +17351,22 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/slice-ansi": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -15162,7 +17378,8 @@ }, "node_modules/slice-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -15175,7 +17392,8 @@ }, "node_modules/slice-ansi/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -15185,18 +17403,21 @@ }, "node_modules/slice-ansi/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/snake-case": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/solc": { "version": "0.7.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dependencies": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -15217,11 +17438,13 @@ }, "node_modules/solc/node_modules/commander": { "version": "3.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/solc/node_modules/fs-extra": { "version": "0.30.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -15232,14 +17455,16 @@ }, "node_modules/solc/node_modules/jsonfile": { "version": "2.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/solc/node_modules/rimraf": { "version": "2.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, @@ -15249,14 +17474,16 @@ }, "node_modules/solc/node_modules/semver": { "version": "5.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "bin": { "semver": "bin/semver" } }, "node_modules/solc/node_modules/tmp": { "version": "0.0.33", - "license": "MIT", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -15266,8 +17493,9 @@ }, "node_modules/solidity-coverage": { "version": "0.8.2", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", + "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", @@ -15300,8 +17528,9 @@ }, "node_modules/solidity-coverage/node_modules/ansi-colors": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -15309,8 +17538,9 @@ }, "node_modules/solidity-coverage/node_modules/ansi-regex": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -15318,8 +17548,9 @@ }, "node_modules/solidity-coverage/node_modules/chokidar": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", + "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "anymatch": "~3.1.1", @@ -15339,8 +17570,9 @@ }, "node_modules/solidity-coverage/node_modules/cliui": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "string-width": "^3.1.0", @@ -15350,8 +17582,10 @@ }, "node_modules/solidity-coverage/node_modules/debug": { "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -15359,8 +17593,9 @@ }, "node_modules/solidity-coverage/node_modules/diff": { "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -15368,14 +17603,16 @@ }, "node_modules/solidity-coverage/node_modules/emoji-regex": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/solidity-coverage/node_modules/find-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "locate-path": "^3.0.0" @@ -15386,8 +17623,9 @@ }, "node_modules/solidity-coverage/node_modules/flat": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", + "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "is-buffer": "~2.0.3" @@ -15398,8 +17636,9 @@ }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -15412,8 +17651,11 @@ }, "node_modules/solidity-coverage/node_modules/fsevents": { "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "license": "MIT", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -15425,8 +17667,9 @@ }, "node_modules/solidity-coverage/node_modules/glob": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15442,8 +17685,9 @@ }, "node_modules/solidity-coverage/node_modules/globby": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/glob": "^7.1.1", @@ -15461,8 +17705,9 @@ }, "node_modules/solidity-coverage/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4" @@ -15470,8 +17715,9 @@ }, "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -15479,8 +17725,9 @@ }, "node_modules/solidity-coverage/node_modules/js-yaml": { "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -15492,8 +17739,9 @@ }, "node_modules/solidity-coverage/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -15501,8 +17749,9 @@ }, "node_modules/solidity-coverage/node_modules/locate-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-locate": "^3.0.0", @@ -15514,8 +17763,9 @@ }, "node_modules/solidity-coverage/node_modules/log-symbols": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2" @@ -15526,8 +17776,9 @@ }, "node_modules/solidity-coverage/node_modules/minimatch": { "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -15538,8 +17789,9 @@ }, "node_modules/solidity-coverage/node_modules/mkdirp": { "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5" @@ -15550,8 +17802,9 @@ }, "node_modules/solidity-coverage/node_modules/mocha": { "version": "7.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", + "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-colors": "3.2.3", @@ -15593,14 +17846,16 @@ }, "node_modules/solidity-coverage/node_modules/ms": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/solidity-coverage/node_modules/object.assign": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.1.2", @@ -15614,8 +17869,9 @@ }, "node_modules/solidity-coverage/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -15629,8 +17885,9 @@ }, "node_modules/solidity-coverage/node_modules/p-locate": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.0.0" @@ -15641,8 +17898,9 @@ }, "node_modules/solidity-coverage/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -15650,8 +17908,9 @@ }, "node_modules/solidity-coverage/node_modules/pify": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -15659,8 +17918,9 @@ }, "node_modules/solidity-coverage/node_modules/readdirp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", + "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "picomatch": "^2.0.4" @@ -15671,8 +17931,9 @@ }, "node_modules/solidity-coverage/node_modules/string-width": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "emoji-regex": "^7.0.1", @@ -15685,8 +17946,9 @@ }, "node_modules/solidity-coverage/node_modules/strip-ansi": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -15697,8 +17959,9 @@ }, "node_modules/solidity-coverage/node_modules/strip-json-comments": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -15706,8 +17969,9 @@ }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -15718,8 +17982,9 @@ }, "node_modules/solidity-coverage/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -15727,8 +17992,9 @@ }, "node_modules/solidity-coverage/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -15739,8 +18005,9 @@ }, "node_modules/solidity-coverage/node_modules/wrap-ansi": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -15753,14 +18020,16 @@ }, "node_modules/solidity-coverage/node_modules/y18n": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/solidity-coverage/node_modules/yargs": { "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "cliui": "^5.0.0", @@ -15777,8 +18046,9 @@ }, "node_modules/solidity-coverage/node_modules/yargs-parser": { "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -15787,8 +18057,9 @@ }, "node_modules/solidity-coverage/node_modules/yargs-unparser": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "flat": "^4.1.0", @@ -15801,22 +18072,25 @@ }, "node_modules/source-map": { "version": "0.6.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15824,8 +18098,9 @@ }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -15840,7 +18115,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15848,11 +18124,13 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -15860,23 +18138,27 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.13", - "license": "CC0-1.0" + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" }, "node_modules/split2": { "version": "3.2.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/sshpk": { "version": "1.17.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15899,11 +18181,13 @@ }, "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/stack-utils": { "version": "2.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dependencies": { "escape-string-regexp": "^2.0.0" }, @@ -15913,14 +18197,16 @@ }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "engines": { "node": ">=8" } }, "node_modules/stacktrace-parser": { "version": "0.1.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dependencies": { "type-fest": "^0.7.1" }, @@ -15930,22 +18216,25 @@ }, "node_modules/stacktrace-parser/node_modules/type-fest": { "version": "0.7.1", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, "node_modules/stealthy-require": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true, - "license": "ISC", "peer": true, "engines": { "node": ">=0.10.0" @@ -15953,26 +18242,32 @@ }, "node_modules/streamsearch": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/strict-uri-encode": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -15986,26 +18281,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/string-argv": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-format": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true, - "license": "WTFPL OR MIT", "peer": true }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16017,8 +18314,9 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -16033,8 +18331,9 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -16046,8 +18345,9 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -16059,7 +18359,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16069,16 +18370,18 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16088,7 +18391,8 @@ }, "node_modules/strip-hex-prefix": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -16099,8 +18403,9 @@ }, "node_modules/strip-indent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, - "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -16113,7 +18418,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "engines": { "node": ">=8" }, @@ -16123,8 +18429,9 @@ }, "node_modules/strtok3": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", "dev": true, - "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0" @@ -16139,7 +18446,8 @@ }, "node_modules/styled-components": { "version": "5.3.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", + "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -16167,11 +18475,13 @@ }, "node_modules/stylis": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { "has-flag": "^3.0.0" }, @@ -16181,7 +18491,8 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -16191,7 +18502,8 @@ }, "node_modules/swap-case": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", "dependencies": { "lower-case": "^1.1.1", "upper-case": "^1.1.1" @@ -16199,7 +18511,8 @@ }, "node_modules/swarm-js": { "version": "0.1.42", - "license": "MIT", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -16216,7 +18529,8 @@ }, "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -16226,6 +18540,8 @@ }, "node_modules/swarm-js/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -16240,7 +18556,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -16248,14 +18563,16 @@ }, "node_modules/swarm-js/node_modules/cacheable-lookup": { "version": "5.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { "node": ">=10.6.0" } }, "node_modules/swarm-js/node_modules/fs-extra": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -16264,7 +18581,8 @@ }, "node_modules/swarm-js/node_modules/got": { "version": "11.8.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -16287,7 +18605,8 @@ }, "node_modules/swarm-js/node_modules/http2-wrapper": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -16298,28 +18617,32 @@ }, "node_modules/swarm-js/node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/p-cancelable": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -16329,15 +18652,17 @@ }, "node_modules/swarm-js/node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/sync-request": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "http-response-object": "^3.0.1", @@ -16350,8 +18675,9 @@ }, "node_modules/sync-rpc": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "get-port": "^3.1.0" @@ -16359,8 +18685,9 @@ }, "node_modules/synckit": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, - "license": "MIT", "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -16373,14 +18700,16 @@ } }, "node_modules/synckit/node_modules/tslib": { - "version": "2.5.2", - "dev": true, - "license": "0BSD" + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", + "dev": true }, "node_modules/table": { "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -16394,8 +18723,9 @@ }, "node_modules/table-layout": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.1", @@ -16409,8 +18739,9 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -16418,8 +18749,9 @@ }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -16427,8 +18759,9 @@ }, "node_modules/table/node_modules/ajv": { "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16442,8 +18775,9 @@ }, "node_modules/table/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -16456,8 +18790,9 @@ }, "node_modules/table/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -16467,18 +18802,21 @@ }, "node_modules/table/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -16493,15 +18831,17 @@ }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "4.4.19", - "license": "ISC", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dependencies": { "chownr": "^1.1.4", "fs-minipass": "^1.2.7", @@ -16517,6 +18857,8 @@ }, "node_modules/tar/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -16530,21 +18872,22 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/temp-dir": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tempy": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", + "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^2.0.0", @@ -16560,8 +18903,9 @@ }, "node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -16571,8 +18915,9 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -16582,8 +18927,9 @@ }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -16594,17 +18940,22 @@ } }, "node_modules/testrpc": { - "version": "0.0.1" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/then-request": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", @@ -16625,35 +18976,41 @@ }, "node_modules/then-request/node_modules/@types/node": { "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/through2": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dependencies": { "readable-stream": "3" } }, "node_modules/timed-out": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "engines": { "node": ">=0.10.0" } }, "node_modules/tiny-invariant": { "version": "1.3.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" }, "node_modules/tiny-warning": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, "node_modules/title-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.0.3" @@ -16661,8 +19018,9 @@ }, "node_modules/titleize": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16672,8 +19030,9 @@ }, "node_modules/tmp": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", "dev": true, - "license": "MIT", "dependencies": { "rimraf": "^3.0.0" }, @@ -16683,14 +19042,16 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -16700,19 +19061,22 @@ }, "node_modules/toformat": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", + "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" }, "node_modules/toidentifier": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } }, "node_modules/token-types": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", "dev": true, - "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -16727,7 +19091,8 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -16738,12 +19103,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-newlines": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16752,12 +19119,12 @@ } }, "node_modules/ts-command-line-args": { - "version": "2.5.0", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { - "@morgan-stanley/ts-mocking-bird": "^0.6.2", "chalk": "^4.1.0", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.0", @@ -16769,8 +19136,9 @@ }, "node_modules/ts-command-line-args/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -16784,8 +19152,9 @@ }, "node_modules/ts-command-line-args/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -16800,8 +19169,9 @@ }, "node_modules/ts-command-line-args/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -16812,14 +19182,16 @@ }, "node_modules/ts-command-line-args/node_modules/color-name": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/ts-command-line-args/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -16827,8 +19199,9 @@ }, "node_modules/ts-command-line-args/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -16839,15 +19212,17 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "engines": { "node": ">=6.10" } }, "node_modules/ts-essentials": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "license": "MIT", "peer": true, "peerDependencies": { "typescript": ">=3.7.0" @@ -16855,8 +19230,9 @@ }, "node_modules/ts-node": { "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, - "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -16897,8 +19273,9 @@ }, "node_modules/ts-node/node_modules/acorn": { "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "devOptional": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -16908,16 +19285,18 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "devOptional": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -16927,8 +19306,9 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -16938,24 +19318,28 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "1.14.1", - "license": "0BSD" + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/tsort": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -16968,7 +19352,8 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -16978,20 +19363,24 @@ }, "node_modules/tweetnacl": { "version": "1.0.3", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/tweetnacl-util": { "version": "0.15.1", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "node_modules/type": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -17001,14 +19390,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, @@ -17018,7 +19409,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17029,8 +19421,9 @@ }, "node_modules/typechain": { "version": "8.2.0", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.2.0.tgz", + "integrity": "sha512-tZqhqjxJ9xAS/Lh32jccTjMkpx7sTdUVVHAy5Bf0TIer5QFNYXotiX74oCvoVYjyxUKDK3MXHtMFzMyD3kE+jg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -17053,8 +19446,9 @@ }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -17067,8 +19461,9 @@ }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -17087,8 +19482,9 @@ }, "node_modules/typechain/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -17096,8 +19492,9 @@ }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -17108,8 +19505,9 @@ }, "node_modules/typechain/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -17117,8 +19515,9 @@ }, "node_modules/typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -17130,21 +19529,24 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typedoc": { "version": "0.23.28", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", + "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "marked": "^4.2.12", @@ -17163,16 +19565,18 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -17185,8 +19589,9 @@ }, "node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17197,8 +19602,9 @@ }, "node_modules/typical": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -17206,8 +19612,9 @@ }, "node_modules/uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "bin": { @@ -17219,12 +19626,14 @@ }, "node_modules/ultron": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -17237,11 +19646,13 @@ }, "node_modules/underscore": { "version": "1.13.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { "version": "5.22.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", + "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", "dependencies": { "busboy": "^1.6.0" }, @@ -17251,8 +19662,9 @@ }, "node_modules/unique-string": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, - "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -17265,28 +19677,33 @@ }, "node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -17302,7 +19719,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -17316,30 +19732,35 @@ }, "node_modules/upper-case": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, "node_modules/upper-case-first": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", "dependencies": { "upper-case": "^1.1.1" } }, "node_modules/uri-js": { "version": "4.4.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-set-query": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" }, "node_modules/utf-8-validate": { "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -17349,11 +19770,13 @@ }, "node_modules/utf8": { "version": "3.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, "node_modules/util": { "version": "0.12.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -17364,18 +19787,21 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } @@ -17383,7 +19809,8 @@ "node_modules/v3-periphery-1_3_0": { "name": "@uniswap/v3-periphery", "version": "1.3.0", - "license": "GPL-2.0-or-later", + "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", + "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", "dependencies": { "@openzeppelin/contracts": "3.4.1-solc-0.7-2", "@uniswap/lib": "^4.0.1-alpha", @@ -17398,21 +19825,25 @@ }, "node_modules/v3-periphery-1_3_0/node_modules/@openzeppelin/contracts": { "version": "3.4.1-solc-0.7-2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", + "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" }, "node_modules/v8-compile-cache": { "version": "2.3.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -17420,29 +19851,33 @@ }, "node_modules/validator": { "version": "13.9.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", + "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/varint": { "version": "5.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, "node_modules/vary": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -17451,8 +19886,9 @@ }, "node_modules/vite": { "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, - "license": "MIT", "dependencies": { "esbuild": "^0.17.5", "postcss": "^8.4.23", @@ -17498,8 +19934,9 @@ }, "node_modules/vite-plugin-singlefile": { "version": "0.13.5", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz", + "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==", "dev": true, - "license": "MIT", "dependencies": { "micromatch": "^4.0.5" }, @@ -17511,11 +19948,44 @@ "vite": ">=3.2.0" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", + "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.17.19", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", + "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/esbuild": { "version": "0.17.19", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", + "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -17549,22 +20019,26 @@ }, "node_modules/vscode-oniguruma": { "version": "1.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true }, "node_modules/vscode-textmate": { "version": "8.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true }, "node_modules/web-worker": { "version": "1.2.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" }, "node_modules/web3": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { "web3-bzz": "1.10.0", "web3-core": "1.10.0", @@ -17580,8 +20054,9 @@ }, "node_modules/web3-bzz": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { "@types/node": "^12.12.6", "got": "12.1.0", @@ -17593,11 +20068,13 @@ }, "node_modules/web3-bzz/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-core": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", "dependencies": { "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", @@ -17613,7 +20090,8 @@ }, "node_modules/web3-core-helpers": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", "dependencies": { "web3-eth-iban": "1.10.0", "web3-utils": "1.10.0" @@ -17624,7 +20102,8 @@ }, "node_modules/web3-core-method": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", "dependencies": { "@ethersproject/transactions": "^5.6.2", "web3-core-helpers": "1.10.0", @@ -17638,7 +20117,8 @@ }, "node_modules/web3-core-promievent": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -17648,7 +20128,8 @@ }, "node_modules/web3-core-requestmanager": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", "dependencies": { "util": "^0.12.5", "web3-core-helpers": "1.10.0", @@ -17662,7 +20143,8 @@ }, "node_modules/web3-core-subscriptions": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", "dependencies": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.10.0" @@ -17673,11 +20155,13 @@ }, "node_modules/web3-core/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-eth": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", "dependencies": { "web3-core": "1.10.0", "web3-core-helpers": "1.10.0", @@ -17698,7 +20182,8 @@ }, "node_modules/web3-eth-abi": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", "dependencies": { "@ethersproject/abi": "^5.6.3", "web3-utils": "1.10.0" @@ -17709,7 +20194,8 @@ }, "node_modules/web3-eth-accounts": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", @@ -17728,7 +20214,8 @@ }, "node_modules/web3-eth-accounts/node_modules/eth-lib": { "version": "0.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -17737,11 +20224,13 @@ }, "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -17762,7 +20251,8 @@ }, "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -17776,14 +20266,16 @@ }, "node_modules/web3-eth-accounts/node_modules/uuid": { "version": "9.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/web3-eth-contract": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", "dependencies": { "@types/bn.js": "^5.1.1", "web3-core": "1.10.0", @@ -17800,7 +20292,8 @@ }, "node_modules/web3-eth-ens": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", @@ -17817,7 +20310,8 @@ }, "node_modules/web3-eth-iban": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", "dependencies": { "bn.js": "^5.2.1", "web3-utils": "1.10.0" @@ -17828,7 +20322,8 @@ }, "node_modules/web3-eth-personal": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", "dependencies": { "@types/node": "^12.12.6", "web3-core": "1.10.0", @@ -17843,11 +20338,13 @@ }, "node_modules/web3-eth-personal/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-net": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", "dependencies": { "web3-core": "1.10.0", "web3-core-method": "1.10.0", @@ -17859,7 +20356,8 @@ }, "node_modules/web3-providers-http": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", @@ -17872,7 +20370,8 @@ }, "node_modules/web3-providers-ipc": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", "dependencies": { "oboe": "2.1.5", "web3-core-helpers": "1.10.0" @@ -17883,7 +20382,8 @@ }, "node_modules/web3-providers-ws": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", "dependencies": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.10.0", @@ -17895,8 +20395,9 @@ }, "node_modules/web3-shh": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { "web3-core": "1.10.0", "web3-core-method": "1.10.0", @@ -17909,7 +20410,8 @@ }, "node_modules/web3-utils": { "version": "1.10.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -17925,7 +20427,8 @@ }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -17946,7 +20449,8 @@ }, "node_modules/web3-utils/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -17960,11 +20464,13 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/websocket": { "version": "1.0.34", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "dependencies": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -17979,18 +20485,21 @@ }, "node_modules/websocket/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/websocket/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -17998,8 +20507,9 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -18012,8 +20522,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -18027,12 +20538,14 @@ }, "node_modules/which-module": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true }, "node_modules/which-typed-array": { "version": "1.1.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -18050,8 +20563,9 @@ }, "node_modules/wide-align": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "string-width": "^1.0.2 || 2" @@ -18059,8 +20573,9 @@ }, "node_modules/wide-align/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -18068,8 +20583,9 @@ }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -18077,8 +20593,9 @@ }, "node_modules/wide-align/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -18090,8 +20607,9 @@ }, "node_modules/wide-align/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -18102,7 +20620,8 @@ }, "node_modules/widest-line": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "dependencies": { "string-width": "^4.0.0" }, @@ -18112,7 +20631,8 @@ }, "node_modules/window-size": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", "bin": { "window-size": "cli.js" }, @@ -18122,22 +20642,25 @@ }, "node_modules/word-wrap": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/wordwrapjs": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", @@ -18149,8 +20672,9 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -18158,12 +20682,14 @@ }, "node_modules/workerpool": { "version": "6.2.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true }, "node_modules/wrap-ansi": { "version": "6.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -18175,7 +20701,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { "color-convert": "^2.0.1" }, @@ -18188,7 +20715,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" }, @@ -18198,16 +20726,19 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -18217,7 +20748,8 @@ }, "node_modules/ws": { "version": "7.4.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { "node": ">=8.3.0" }, @@ -18236,7 +20768,8 @@ }, "node_modules/xhr": { "version": "2.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", "dependencies": { "global": "~4.4.0", "is-function": "^1.0.1", @@ -18246,7 +20779,8 @@ }, "node_modules/xhr-request": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "dependencies": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -18259,46 +20793,53 @@ }, "node_modules/xhr-request-promise": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", "dependencies": { "xhr-request": "^1.1.0" } }, "node_modules/xmlhttprequest": { "version": "1.8.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", "engines": { "node": ">=0.4.0" } }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yaeti": { "version": "0.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", "engines": { "node": ">=0.10.32" } }, "node_modules/yallist": { "version": "3.1.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "16.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -18314,14 +20855,16 @@ }, "node_modules/yargs-parser": { "version": "20.2.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -18334,7 +20877,8 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, @@ -18344,7 +20888,8 @@ }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "engines": { "node": ">=10" }, @@ -18354,22 +20899,25 @@ }, "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { "node": ">=8" } }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { "node": ">=10" }, @@ -18379,7 +20927,8 @@ }, "node_modules/yoga-layout-prebuilt": { "version": "1.10.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", + "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", "dependencies": { "@types/yoga-layout": "1.9.2" }, @@ -18389,8 +20938,9 @@ }, "node_modules/z-schema": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", "dev": true, - "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", @@ -18408,8 +20958,9 @@ }, "node_modules/z-schema/node_modules/commander": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": "^12.20.0 || >=14" @@ -18467,13 +21018,15 @@ }, "packages/core/node_modules/@types/node": { "version": "12.20.25", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", + "dev": true }, "packages/core/node_modules/@types/react": { "version": "17.0.60", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", + "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -18546,32 +21099,36 @@ }, "packages/hardhat-plugin/node_modules/@sinonjs/commons": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", @@ -18580,13 +21137,15 @@ }, "packages/hardhat-plugin/node_modules/@types/node": { "version": "12.20.25", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", + "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", + "dev": true }, "packages/hardhat-plugin/node_modules/dagre-d3-es": { "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "dev": true, - "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -18594,21 +21153,24 @@ }, "packages/hardhat-plugin/node_modules/dompurify": { "version": "2.4.3", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", + "dev": true }, "packages/hardhat-plugin/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "packages/hardhat-plugin/node_modules/mermaid": { "version": "9.4.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", + "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", "dev": true, - "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^6.0.0", "cytoscape": "^3.23.0", @@ -18630,7 +21192,8 @@ }, "packages/hardhat-plugin/node_modules/react": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -18640,8 +21203,9 @@ }, "packages/hardhat-plugin/node_modules/sinon": { "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^9.1.2", @@ -18657,8 +21221,9 @@ }, "packages/hardhat-plugin/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -18668,8 +21233,9 @@ }, "packages/hardhat-plugin/node_modules/uuid": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true, - "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } @@ -18703,8 +21269,9 @@ }, "packages/ui/node_modules/@eslint/eslintrc": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -18724,9 +21291,10 @@ } }, "packages/ui/node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -18737,14 +21305,15 @@ } }, "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", + "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/type-utils": "5.59.9", + "@typescript-eslint/utils": "5.59.9", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -18770,13 +21339,14 @@ } }, "packages/ui/node_modules/@typescript-eslint/parser": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", + "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.59.9", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/typescript-estree": "5.59.9", "debug": "^4.3.4" }, "engines": { @@ -18796,12 +21366,13 @@ } }, "packages/ui/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", + "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -18812,9 +21383,10 @@ } }, "packages/ui/node_modules/@typescript-eslint/types": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", + "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -18824,12 +21396,13 @@ } }, "packages/ui/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", + "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/visitor-keys": "5.59.9", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -18850,11 +21423,12 @@ } }, "packages/ui/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", + "version": "5.59.9", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", + "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -18867,8 +21441,9 @@ }, "packages/ui/node_modules/acorn": { "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -18878,8 +21453,9 @@ }, "packages/ui/node_modules/ansi-styles": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, - "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18892,13 +21468,15 @@ }, "packages/ui/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "packages/ui/node_modules/chalk": { "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, - "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -18912,8 +21490,9 @@ }, "packages/ui/node_modules/color-convert": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -18923,13 +21502,15 @@ }, "packages/ui/node_modules/color-name": { "version": "1.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "packages/ui/node_modules/escape-string-regexp": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -18938,15 +21519,16 @@ } }, "packages/ui/node_modules/eslint": { - "version": "8.41.0", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -18994,8 +21576,9 @@ }, "packages/ui/node_modules/eslint-scope": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -19009,8 +21592,9 @@ }, "packages/ui/node_modules/eslint-visitor-keys": { "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -19020,8 +21604,9 @@ }, "packages/ui/node_modules/espree": { "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", @@ -19036,16 +21621,18 @@ }, "packages/ui/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "packages/ui/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -19059,8 +21646,9 @@ }, "packages/ui/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -19070,8 +21658,9 @@ }, "packages/ui/node_modules/globals": { "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -19084,24 +21673,27 @@ }, "packages/ui/node_modules/has-flag": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "packages/ui/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "packages/ui/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -19111,8 +21703,9 @@ }, "packages/ui/node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -19125,8 +21718,9 @@ }, "packages/ui/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -19139,8 +21733,9 @@ }, "packages/ui/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -19153,15 +21748,17 @@ }, "packages/ui/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "packages/ui/node_modules/react": { "version": "18.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -19171,8 +21768,9 @@ }, "packages/ui/node_modules/supports-color": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -19182,8 +21780,9 @@ }, "packages/ui/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19192,15 +21791,16 @@ } }, "packages/ui/node_modules/typescript": { - "version": "5.0.4", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } } } From 6552b139f083231003dbb33b7d4cc0534a426949 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 19 May 2023 16:51:26 +0100 Subject: [PATCH 0433/1302] refactor(new-api): add reconciliation stage Add a reconcilier that ensures an Ignition module can be executed give the state of previous runs. --- package-lock.json | 1 + packages/core/package.json | 1 + packages/core/src/internal/utils/guards.ts | 23 ++ packages/core/src/new-api/deployer.ts | 60 +++++ packages/core/src/new-api/internal/batcher.ts | 133 +--------- .../src/new-api/internal/execution-engine.ts | 7 + packages/core/src/new-api/internal/module.ts | 6 + .../execution-state-resolver.ts | 161 ++++++++++++ .../futures/reconcileArtifactContractAt.ts | 32 +++ .../reconcileArtifactContractDeployment.ts | 55 ++++ .../reconcileArtifactLibraryDeployment.ts | 42 +++ .../futures/reconcileNamedContractAt.ts | 32 +++ .../futures/reconcileNamedContractCall.ts | 53 ++++ .../reconcileNamedContractDeployment.ts | 55 ++++ .../reconcileNamedLibraryDeployment.ts | 42 +++ .../futures/reconcileNamedStaticCall.ts | 46 ++++ .../futures/reconcileReadEventArgument.ts | 44 ++++ .../futures/reconcileSendData.ts | 53 ++++ .../reconcileCurrentAndPreviousTypeMatch.ts | 22 ++ .../reconcileDependencyRules.ts | 44 ++++ .../reconcileFutureSpecificReconciliations.ts | 94 +++++++ .../internal/reconciliation/reconcilier.ts | 115 +++++++++ .../new-api/internal/reconciliation/types.ts | 37 +++ .../new-api/internal/reconciliation/utils.ts | 81 ++++++ packages/core/src/new-api/internal/utils.ts | 6 + .../utils/adjacency-list-converter.ts | 47 ++++ .../new-api/internal/utils/adjacency-list.ts | 134 ++++++++++ .../src/new-api/types/execution-engine.ts | 8 + .../core/src/new-api/types/execution-state.ts | 51 +++- packages/core/src/new-api/types/module.ts | 1 + packages/core/test/new-api/batcher.ts | 2 + .../futures/reconcileArtifactContractAt.ts | 190 ++++++++++++++ .../reconcileArtifactContractDeployment.ts | 222 ++++++++++++++++ .../reconcileArtifactLibraryDeployment.ts | 161 ++++++++++++ .../futures/reconcileNamedContractAt.ts | 174 +++++++++++++ .../futures/reconcileNamedContractCall.ts | 233 +++++++++++++++++ .../reconcileNamedContractDeployment.ts | 206 +++++++++++++++ .../reconcileNamedLibraryDeployment.ts | 154 +++++++++++ .../futures/reconcileNamedStaticCall.ts | 207 +++++++++++++++ .../futures/reconcileReadEventArgument.ts | 225 ++++++++++++++++ .../futures/reconcileSendData.ts | 143 ++++++++++ .../test/new-api/reconciliation/helpers.ts | 89 +++++++ .../test/new-api/reconciliation/reconciler.ts | 244 ++++++++++++++++++ .../core/test/new-api/utils/adjacency-list.ts | 39 +++ 44 files changed, 3638 insertions(+), 137 deletions(-) create mode 100644 packages/core/src/new-api/deployer.ts create mode 100644 packages/core/src/new-api/internal/execution-engine.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/reconcilier.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/types.ts create mode 100644 packages/core/src/new-api/internal/reconciliation/utils.ts create mode 100644 packages/core/src/new-api/internal/utils/adjacency-list-converter.ts create mode 100644 packages/core/src/new-api/internal/utils/adjacency-list.ts create mode 100644 packages/core/src/new-api/types/execution-engine.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts create mode 100644 packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts create mode 100644 packages/core/test/new-api/reconciliation/helpers.ts create mode 100644 packages/core/test/new-api/reconciliation/reconciler.ts create mode 100644 packages/core/test/new-api/utils/adjacency-list.ts diff --git a/package-lock.json b/package-lock.json index 6431aeba4d..9c82663e30 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20975,6 +20975,7 @@ "debug": "^4.3.2", "ethers": "^5.4.7", "js-graph-algorithms": "1.0.18", + "lodash": "4.17.21", "object-hash": "^3.0.0", "serialize-error": "8.1.0" }, diff --git a/packages/core/package.json b/packages/core/package.json index a6a4ddea32..63317cea10 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -92,6 +92,7 @@ "debug": "^4.3.2", "ethers": "^5.4.7", "js-graph-algorithms": "1.0.18", + "lodash": "4.17.21", "object-hash": "^3.0.0", "serialize-error": "8.1.0" } diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 56df474d6f..23369bff8e 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -22,6 +22,12 @@ import type { } from "../types/deploymentGraph"; import { IgnitionError } from "../../errors"; +import { + DeploymentExecutionState, + ExecutionState, + StaticCallExecutionState, +} from "../../new-api/types/execution-state"; +import { FutureType } from "../../new-api/types/module"; import { ArtifactOld } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; @@ -149,6 +155,23 @@ export function isLibrary( return future.type === "library"; } +export function isDeploymentExecutionState( + executionState: ExecutionState +): executionState is DeploymentExecutionState { + return [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ].includes(executionState.futureType); +} + +export function isStaticCallExecutionState( + executionState: ExecutionState +): executionState is StaticCallExecutionState { + return [FutureType.NAMED_STATIC_CALL].includes(executionState.futureType); +} + export function assertModuleReturnTypes(moduleResult: T) { for (const future of Object.values(moduleResult)) { if (isContract(future) || isLibrary(future)) { diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts new file mode 100644 index 0000000000..2398d85a99 --- /dev/null +++ b/packages/core/src/new-api/deployer.ts @@ -0,0 +1,60 @@ +import type { IgnitionModuleResult, ModuleParameters } from "./types/module"; +import type { IgnitionModuleDefinition } from "./types/module-builder"; + +import { Batcher } from "./internal/batcher"; +import { ExecutionEngine } from "./internal/execution-engine"; +import { ModuleConstructor } from "./internal/module-builder"; +import { Reconcilier } from "./internal/reconciliation/reconcilier"; +import { ExecutionStateMap } from "./types/execution-state"; + +export class Deployer { + private _moduleConstructor: ModuleConstructor; + private _executionEngine: ExecutionEngine; + + constructor() { + this._moduleConstructor = new ModuleConstructor(); + this._executionEngine = new ExecutionEngine(); + } + + public async deploy( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + moduleParameters: ModuleParameters, + accounts: string[] + ) { + const module = this._moduleConstructor.construct(moduleDefinition); + + const previousStateMap = await this._loadExecutionStateFromJournal(); + + const reconciliationResult = Reconcilier.reconcile( + module, + previousStateMap, + moduleParameters, + accounts + ); + + if (reconciliationResult.reconciliationFailures.length > 0) { + throw new Error("Reconciliation failed"); + } + + if (reconciliationResult.missingExecutedFutures.length > 0) { + // TODO: indicate to UI that warnings should be shown + } + + const batches = Batcher.batch(module, previousStateMap); + + return this._executionEngine.execute({ + batches, + module, + executionStateMap: previousStateMap, + }); + } + + private async _loadExecutionStateFromJournal(): Promise { + // TODO: load an actual journal + return {}; + } +} diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts index 8b87bc91a7..8c70a245ab 100644 --- a/packages/core/src/new-api/internal/batcher.ts +++ b/packages/core/src/new-api/internal/batcher.ts @@ -1,6 +1,9 @@ import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { Future, IgnitionModule } from "../types/module"; +import { AdjacencyList } from "./utils/adjacency-list"; +import { AdjacencyListConverter } from "./utils/adjacency-list-converter"; + enum VisitStatus { UNVISITED, VISITED, @@ -42,28 +45,21 @@ export class Batcher { module: IgnitionModule, executionStateMap: ExecutionStateMap ): BatchState { - const allFutures = this._recursiveGetFuturesFor(module); + const allFutures = module.getFutures(); const visitState = this._intializeVisitStateFrom( allFutures, executionStateMap ); - const adjacencyList = this._buildAdjacencyListFor(allFutures); + const adjacencyList = + AdjacencyListConverter.buildAdjacencyListFromFutures(allFutures); this._eleminateAlreadyVisitedFutures({ adjacencyList, visitState }); return { adjacencyList, visitState }; } - private static _recursiveGetFuturesFor(module: IgnitionModule): Future[] { - return [...module.futures].concat( - Array.from(module.submodules).flatMap((sub) => - this._recursiveGetFuturesFor(sub) - ) - ); - } - private static _intializeVisitStateFrom( futures: Future[], executionStateMap: ExecutionStateMap @@ -88,46 +84,6 @@ export class Batcher { ); } - private static _buildAdjacencyListFor(futures: Future[]): AdjacencyList { - const dependencyGraph = new AdjacencyList(); - - for (const future of futures) { - for (const dependency of future.dependencies) { - dependencyGraph.addDependency({ from: future.id, to: dependency.id }); - - this._optionallyAddDependenciesSubmoduleSiblings( - dependencyGraph, - future, - dependency - ); - } - } - - return dependencyGraph; - } - - /** - * The famed Malaga rule, if a future's dependency is in a submodule, - * then that future should not be executed until all futures in the - * submodule have been run. - */ - private static _optionallyAddDependenciesSubmoduleSiblings( - dependencyGraph: AdjacencyList, - future: Future, - dependency: Future - ): void { - if (future.module === dependency.module) { - return; - } - - for (const moduleDep of dependency.module.futures) { - dependencyGraph.addDependency({ - from: future.id, - to: moduleDep.id, - }); - } - } - public static _eleminateAlreadyVisitedFutures({ adjacencyList, visitState, @@ -179,80 +135,3 @@ export class Batcher { ); } } - -export class AdjacencyList { - /** - * A mapping from futures to each futures dependencies. - * - * Example: - * A - * ^ ^ - * | | - * B C - * Gives a mapping of {A: [], B: [A], C:[A]} - * - */ - private _list: Map> = new Map>(); - - /** - * Add a dependency from `from` to `to`. If A depends on B - * then {`from`: A, `to`: B} should be passed. - */ - public addDependency({ from, to }: { from: string; to: string }) { - const toSet = this._list.get(from) ?? new Set(); - - toSet.add(to); - - this._list.set(from, toSet); - } - - /** - * Get the dependencies, if A depends on B, A's dependencies includes B - * @param from - the future to get the list of dependencies for - * @returns - the dependencies - */ - public getDependenciesFor(from: string): Set { - return this._list.get(from) ?? new Set(); - } - - /** - * Get the dependents, if A depends on B, B's dependents includes A - * @param from - the future to get the list of dependents for - * @returns - the dependents - */ - public getDependentsFor(to: string) { - return [...this._list.entries()] - .filter(([_from, toSet]) => toSet.has(to)) - .map(([from]) => from); - } - - /** - * Remove a future, transfering its dependencies to its dependents. - * @param futureId - The future to eliminate - */ - public eliminate(futureId: string): void { - const dependents = this.getDependentsFor(futureId); - const dependencies = this.getDependenciesFor(futureId); - - this._list.delete(futureId); - - for (const dependent of dependents) { - const toSet = this._list.get(dependent); - - if (toSet === undefined) { - throw new Error("Dependency sets should be defined"); - } - - const setWithoutFuture = new Set( - [...toSet].filter((n) => n !== futureId) - ); - - const updatedSet = new Set([ - ...setWithoutFuture, - ...dependencies, - ]); - - this._list.set(dependent, updatedSet); - } - } -} diff --git a/packages/core/src/new-api/internal/execution-engine.ts b/packages/core/src/new-api/internal/execution-engine.ts new file mode 100644 index 0000000000..01fbbb9064 --- /dev/null +++ b/packages/core/src/new-api/internal/execution-engine.ts @@ -0,0 +1,7 @@ +import { ExecutionEngineState } from "../types/execution-engine"; + +export class ExecutionEngine { + public execute(_preparedExecution: ExecutionEngineState) { + throw new Error("Method not implemented."); + } +} diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index fc7fc44dca..8de07b586e 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -265,6 +265,12 @@ export class IgnitionModuleImplementation< )} }`; } + + public getFutures(): Future[] { + return [...this.futures].concat( + Array.from(this.submodules).flatMap((sub) => sub.getFutures()) + ); + } } export class AccountRuntimeValueImplementation implements AccountRuntimeValue { diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts new file mode 100644 index 0000000000..2394dc7462 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -0,0 +1,161 @@ +import { IgnitionError } from "../../../errors"; +import { isRuntimeValue } from "../../type-guards"; +import { + DeploymentExecutionState, + ExecutionState, + ExecutionStateMap, + SendDataExecutionState, + StaticCallExecutionState, +} from "../../types/execution-state"; +import { + AddressResolvableFuture, + ContractFuture, + Future, + ModuleParameterRuntimeValue, +} from "../../types/module"; +import { isAddress } from "../utils"; + +import { ReconciliationContext } from "./types"; +import { resolveModuleParameter, safeToString } from "./utils"; + +// TODO: consider merging this into the execution state map +export class ExecutionStateResolver { + // Library addresses are resolved from previous execution states + public static resolveLibrariesFromExecutionState( + libraries: Record>, + { executionStateMap }: ReconciliationContext + ): Record { + return Object.fromEntries( + Object.entries(libraries).map(([key, libFuture]) => { + const executionStateEntry = executionStateMap[ + libFuture.id + ] as DeploymentExecutionState; + + return [key, executionStateEntry?.contractAddress]; + }) + ); + } + + public static resolveContractToAddress( + address: string | ContractFuture, + { executionStateMap }: ReconciliationContext + ): string { + if (typeof address === "string") { + return address; + } + + const contractAddress = this.resolveFromExecutionState( + address, + executionStateMap, + (exState: DeploymentExecutionState) => exState.contractAddress + ); + + if (contractAddress === undefined) { + throw new IgnitionError("Previous deployment without contractAddress"); + } + + if (!isAddress(contractAddress)) { + throw new IgnitionError("contractAddress is not a usable address"); + } + + return contractAddress; + } + + public static resolveStaticCallToAddress( + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + context: ReconciliationContext + ): string { + if (typeof address === "string") { + return address; + } + + if (isRuntimeValue(address)) { + const runtimeValue = resolveModuleParameter(address, context); + + if (typeof runtimeValue !== "string" || !isAddress(runtimeValue)) { + throw new IgnitionError( + `Address runtime value is not a usable address ${safeToString( + runtimeValue + )}` + ); + } + + return runtimeValue; + } + + const result = this.resolveFromExecutionState( + address, + context.executionStateMap, + (executionState: StaticCallExecutionState) => executionState.result + ); + + if (typeof result !== "string" || !isAddress(result)) { + throw new IgnitionError("Result is not a usable address"); + } + + return result; + } + + public static resolveSendDataToAddress( + toAddress: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + context: ReconciliationContext + ): string { + if (typeof toAddress === "string") { + return toAddress; + } + + if (isRuntimeValue(toAddress)) { + const runtimeValue = resolveModuleParameter(toAddress, context); + + if (typeof runtimeValue !== "string" || !isAddress(runtimeValue)) { + throw new IgnitionError( + `To runtime value is not a usable address ${safeToString( + runtimeValue + )}` + ); + } + + return runtimeValue; + } + + const to = this.resolveFromExecutionState( + toAddress, + context.executionStateMap, + (executionState: SendDataExecutionState) => executionState.to + ); + + if (typeof to !== "string" || !isAddress(to)) { + throw new IgnitionError("To is not a usable address"); + } + + return to; + } + + public static resolveFromExecutionState< + TFuture extends Future, + TExState extends ExecutionState, + TResult extends TExState[keyof TExState] + >( + future: TFuture, + executionStateMap: ExecutionStateMap, + func: (exe: TExState) => TResult + ): TResult { + const executionState = executionStateMap[future.id] as TExState; + + if (executionState === undefined) { + throw new IgnitionError("Failure looking up execution state"); + } + + if (future.type !== executionState.futureType) { + throw new IgnitionError("Execution state type does not match future"); + } + + return func(executionState); + } +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts new file mode 100644 index 0000000000..2cb983c4cb --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -0,0 +1,32 @@ +import { isEqual } from "lodash"; + +import { ContractAtExecutionState } from "../../../types/execution-state"; +import { ArtifactContractAtFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail } from "../utils"; + +export function reconcileArtifactContractAt( + future: ArtifactContractAtFuture, + executionState: ContractAtExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Contract name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + const resolvedAddress: string = + ExecutionStateResolver.resolveStaticCallToAddress(future.address, context); + + if (!isEqual(resolvedAddress, executionState.address)) { + return fail( + future, + `Address has been changed from ${executionState.address} to ${resolvedAddress}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts new file mode 100644 index 0000000000..3b44fa28c2 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -0,0 +1,55 @@ +import { isEqual } from "lodash"; + +import { DeploymentExecutionState } from "../../../types/execution-state"; +import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileArtifactContractDeployment( + future: ArtifactContractDeploymentFuture, + executionState: DeploymentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Contract name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + if (!isEqual(future.constructorArgs, executionState.constructorArgs)) { + return fail(future, "Constructor args have been changed"); + } + + const resolvedLibraries = + ExecutionStateResolver.resolveLibrariesFromExecutionState( + future.libraries, + context + ); + + if (!isEqual(resolvedLibraries, executionState.libraries)) { + return fail(future, "Libraries have been changed"); + } + + if (!isEqual(future.value, executionState.value)) { + return fail( + future, + `Value has been changed from ${executionState.value} to ${future.value}` + ); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { + success: true, + }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts new file mode 100644 index 0000000000..38106dcdb4 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -0,0 +1,42 @@ +import { isEqual } from "lodash"; + +import { DeploymentExecutionState } from "../../../types/execution-state"; +import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileArtifactLibraryDeployment( + future: ArtifactLibraryDeploymentFuture, + executionState: DeploymentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Library name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + const resolvedLibraries = + ExecutionStateResolver.resolveLibrariesFromExecutionState( + future.libraries, + context + ); + + if (!isEqual(resolvedLibraries, executionState.libraries)) { + return fail(future, "Libraries have been changed"); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts new file mode 100644 index 0000000000..562dd539a8 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -0,0 +1,32 @@ +import { isEqual } from "lodash"; + +import { ContractAtExecutionState } from "../../../types/execution-state"; +import { NamedContractAtFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail } from "../utils"; + +export function reconcileNamedContractAt( + future: NamedContractAtFuture, + executionState: ContractAtExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Contract name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + const resolvedAddress: string = + ExecutionStateResolver.resolveStaticCallToAddress(future.address, context); + + if (!isEqual(resolvedAddress, executionState.address)) { + return fail( + future, + `Address has been changed from ${executionState.address} to ${resolvedAddress}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts new file mode 100644 index 0000000000..877bf851e7 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -0,0 +1,53 @@ +import { isEqual } from "lodash"; + +import { CallExecutionState } from "../../../types/execution-state"; +import { NamedContractCallFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileNamedContractCall( + future: NamedContractCallFuture, + executionState: CallExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + const contractAddress: string = + ExecutionStateResolver.resolveContractToAddress(future.contract, context); + + if (!isEqual(contractAddress, executionState.contractAddress)) { + return fail( + future, + `Contract address has been changed from ${executionState.contractAddress} to ${contractAddress}` + ); + } + + if (!isEqual(future.functionName, executionState.functionName)) { + return fail( + future, + `Function name has been changed from ${executionState.functionName} to ${future.functionName}` + ); + } + + if (!isEqual(future.args, executionState.args)) { + return fail(future, "Function args have been changed"); + } + + if (!isEqual(future.value, executionState.value)) { + return fail( + future, + `Value has been changed from ${executionState.value} to ${future.value}` + ); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts new file mode 100644 index 0000000000..93d22d3d34 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -0,0 +1,55 @@ +import { isEqual } from "lodash"; + +import { DeploymentExecutionState } from "../../../types/execution-state"; +import { NamedContractDeploymentFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileNamedContractDeployment( + future: NamedContractDeploymentFuture, + executionState: DeploymentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Contract name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + if (!isEqual(future.constructorArgs, executionState.constructorArgs)) { + return fail(future, "Constructor args have been changed"); + } + + const resolvedLibraries = + ExecutionStateResolver.resolveLibrariesFromExecutionState( + future.libraries, + context + ); + + if (!isEqual(resolvedLibraries, executionState.libraries)) { + return fail(future, "Libraries have been changed"); + } + + if (!isEqual(future.value, executionState.value)) { + return fail( + future, + `Value has been changed from ${executionState.value} to ${future.value}` + ); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { + success: true, + }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts new file mode 100644 index 0000000000..9d0583e756 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -0,0 +1,42 @@ +import { isEqual } from "lodash"; + +import { DeploymentExecutionState } from "../../../types/execution-state"; +import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileNamedLibraryDeployment( + future: NamedLibraryDeploymentFuture, + executionState: DeploymentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (!isEqual(future.contractName, executionState.contractName)) { + return fail( + future, + `Library name has been changed from ${executionState.contractName} to ${future.contractName}` + ); + } + + const resolvedLibraries = + ExecutionStateResolver.resolveLibrariesFromExecutionState( + future.libraries, + context + ); + + if (!isEqual(resolvedLibraries, executionState.libraries)) { + return fail(future, "Libraries have been changed"); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts new file mode 100644 index 0000000000..9f8db961a1 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -0,0 +1,46 @@ +import { isEqual } from "lodash"; + +import { StaticCallExecutionState } from "../../../types/execution-state"; +import { NamedStaticCallFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileNamedStaticCall( + future: NamedStaticCallFuture, + executionState: StaticCallExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + const contractAddress: string = + ExecutionStateResolver.resolveContractToAddress(future.contract, context); + + if (!isEqual(contractAddress, executionState.contractAddress)) { + return fail( + future, + `Contract address has been changed from ${executionState.contractAddress} to ${contractAddress}` + ); + } + + if (!isEqual(future.functionName, executionState.functionName)) { + return fail( + future, + `Function name has been changed from ${executionState.functionName} to ${future.functionName}` + ); + } + + if (!isEqual(future.args, executionState.args)) { + return fail(future, "Function args have been changed"); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${safeToString( + executionState.from + )} to ${safeToString(fromAddress)}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts new file mode 100644 index 0000000000..68241583b7 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts @@ -0,0 +1,44 @@ +import { ReadEventArgumentExecutionState } from "../../../types/execution-state"; +import { ReadEventArgumentFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail } from "../utils"; + +export function reconcileReadEventArgument( + future: ReadEventArgumentFuture, + executionState: ReadEventArgumentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + if (future.eventName !== executionState.eventName) { + return fail( + future, + `Event name has been changed from ${executionState.eventName} to ${future.eventName}` + ); + } + + if (future.argumentName !== executionState.argumentName) { + return fail( + future, + `Argument name has been changed from ${executionState.argumentName} to ${future.argumentName}` + ); + } + + if (future.eventIndex !== executionState.eventIndex) { + return fail( + future, + `Event index has been changed from ${executionState.eventIndex} to ${future.eventIndex}` + ); + } + + const resolvedEmitterAddress: string = + ExecutionStateResolver.resolveContractToAddress(future.emitter, context); + + if (resolvedEmitterAddress !== executionState.emitter) { + return fail( + future, + `Emitter has been changed from ${executionState.emitter} to ${resolvedEmitterAddress}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts new file mode 100644 index 0000000000..2f5b79fd61 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -0,0 +1,53 @@ +import { isEqual } from "lodash"; + +import { SendDataExecutionState } from "../../../types/execution-state"; +import { SendDataFuture } from "../../../types/module"; +import { ExecutionStateResolver } from "../execution-state-resolver"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; +import { fail, resolveFromAddress, safeToString } from "../utils"; + +export function reconcileSendData( + future: SendDataFuture, + executionState: SendDataExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + const toAddress: string = ExecutionStateResolver.resolveSendDataToAddress( + future.to, + context + ); + + if (!isEqual(toAddress, executionState.to)) { + return fail( + future, + `To address has been changed from ${executionState.to} to ${toAddress}` + ); + } + + if (!isEqual(future.data, executionState.data)) { + return fail( + future, + `Data has been changed from ${executionState.data ?? "undefined"} to ${ + future.data ?? "undefined" + }` + ); + } + + if (!isEqual(future.value, executionState.value)) { + return fail( + future, + `Value has been changed from ${executionState.value} to ${future.value}` + ); + } + + const fromAddress = resolveFromAddress(future.from, context); + if (!isEqual(fromAddress, executionState.from)) { + return fail( + future, + `From account has been changed from ${ + executionState.from ?? "undefined" + } to ${safeToString(fromAddress)}` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts b/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts new file mode 100644 index 0000000000..78f1e24294 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts @@ -0,0 +1,22 @@ +import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; +import { Future, FutureType } from "../../types/module"; + +import { ReconciliationFutureResult } from "./types"; +import { fail } from "./utils"; + +export function reconcileCurrentAndPreviousTypeMatch( + future: Future, + executionState: ExecutionState, + _context: { executionStateMap: ExecutionStateMap } +): ReconciliationFutureResult { + if (executionState.futureType === future.type) { + return { success: true }; + } + + return fail( + future, + `Future with id ${future.id} has changed from ${ + FutureType[executionState.futureType] + } to ${FutureType[future.type]}` + ); +} diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts new file mode 100644 index 0000000000..f79e6c4165 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -0,0 +1,44 @@ +import { difference } from "lodash"; + +import { + ExecutionState, + ExecutionStateMap, + ExecutionStatus, +} from "../../types/execution-state"; +import { Future } from "../../types/module"; + +import { ReconciliationFutureResult } from "./types"; +import { fail } from "./utils"; + +export function reconcileDependencyRules( + future: Future, + executionState: ExecutionState, + context: { executionStateMap: ExecutionStateMap } +): ReconciliationFutureResult { + const previousDeps: string[] = [...executionState.dependencies]; + const currentDeps: string[] = [...future.dependencies].map((f) => f.id); + + const additionalDeps = difference(currentDeps, previousDeps); + + for (const additionalDep of additionalDeps) { + const additionalExecutionState = context.executionStateMap[additionalDep]; + + if (additionalExecutionState === undefined) { + return fail( + future, + `A dependency from ${future.id} to the a new future ${additionalDep} has been added` + ); + } + + if (additionalExecutionState.status === ExecutionStatus.SUCCESS) { + continue; + } + + return fail( + future, + `A dependency from ${future.id} to the already started future ${additionalDep} has been added` + ); + } + + return { success: true }; +} diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts new file mode 100644 index 0000000000..dca7fad6f8 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts @@ -0,0 +1,94 @@ +import { + CallExecutionState, + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionState, + ReadEventArgumentExecutionState, + SendDataExecutionState, + StaticCallExecutionState, +} from "../../types/execution-state"; +import { Future, FutureType } from "../../types/module"; + +import { reconcileArtifactContractAt } from "./futures/reconcileArtifactContractAt"; +import { reconcileArtifactContractDeployment } from "./futures/reconcileArtifactContractDeployment"; +import { reconcileArtifactLibraryDeployment } from "./futures/reconcileArtifactLibraryDeployment"; +import { reconcileNamedContractAt } from "./futures/reconcileNamedContractAt"; +import { reconcileNamedContractCall } from "./futures/reconcileNamedContractCall"; +import { reconcileNamedContractDeployment } from "./futures/reconcileNamedContractDeployment"; +import { reconcileNamedLibraryDeployment } from "./futures/reconcileNamedLibraryDeployment"; +import { reconcileNamedStaticCall } from "./futures/reconcileNamedStaticCall"; +import { reconcileReadEventArgument } from "./futures/reconcileReadEventArgument"; +import { reconcileSendData } from "./futures/reconcileSendData"; +import { ReconciliationContext, ReconciliationFutureResult } from "./types"; + +export function reconcileFutureSpecificReconciliations( + future: Future, + executionState: ExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return reconcileNamedContractDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return reconcileArtifactContractDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return reconcileNamedLibraryDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return reconcileArtifactLibraryDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.NAMED_CONTRACT_CALL: + return reconcileNamedContractCall( + future, + executionState as CallExecutionState, + context + ); + case FutureType.NAMED_STATIC_CALL: + return reconcileNamedStaticCall( + future, + executionState as StaticCallExecutionState, + context + ); + case FutureType.NAMED_CONTRACT_AT: + return reconcileNamedContractAt( + future, + executionState as ContractAtExecutionState, + context + ); + case FutureType.ARTIFACT_CONTRACT_AT: { + return reconcileArtifactContractAt( + future, + executionState as ContractAtExecutionState, + context + ); + } + case FutureType.READ_EVENT_ARGUMENT: { + return reconcileReadEventArgument( + future, + executionState as ReadEventArgumentExecutionState, + context + ); + } + case FutureType.SEND_DATA: { + return reconcileSendData( + future, + executionState as SendDataExecutionState, + context + ); + } + } +} diff --git a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts new file mode 100644 index 0000000000..07e8be16c6 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts @@ -0,0 +1,115 @@ +import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; +import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; +import { AdjacencyList } from "../utils/adjacency-list"; +import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; + +import { reconcileCurrentAndPreviousTypeMatch } from "./reconcileCurrentAndPreviousTypeMatch"; +import { reconcileDependencyRules } from "./reconcileDependencyRules"; +import { reconcileFutureSpecificReconciliations } from "./reconcileFutureSpecificReconciliations"; +import { + ReconciliationCheck, + ReconciliationContext, + ReconciliationFailure, + ReconciliationFutureResult, + ReconciliationFutureResultFailure, + ReconciliationResult, +} from "./types"; + +export class Reconcilier { + public static reconcile( + module: IgnitionModule, + executionStateMap: ExecutionStateMap, + moduleParameters: ModuleParameters, + accounts: string[] + ): ReconciliationResult { + const reconciliationFailures = this._reconcileEachFutureInModule( + module, + { executionStateMap, moduleParameters, accounts }, + [ + reconcileCurrentAndPreviousTypeMatch, + reconcileDependencyRules, + reconcileFutureSpecificReconciliations, + ] + ); + + const missingExecutedFutures = this._missingPreviouslyExecutedFutures( + module, + executionStateMap + ); + + return { reconciliationFailures, missingExecutedFutures }; + } + + private static _reconcileEachFutureInModule( + module: IgnitionModule, + + context: ReconciliationContext, + checks: ReconciliationCheck[] + ): ReconciliationFailure[] { + // TODO: swap this out for linearization of execution state + // once execution is fleshed out. + const futures = this._getFuturesInReverseTopoligicalOrder(module); + + const failures = futures + .map<[Future, ExecutionState]>((f) => [ + f, + context.executionStateMap[f.id], + ]) + .filter(([, exState]) => exState !== undefined) + .map(([f, exState]) => this._check(f, exState, context, checks)) + .filter((r): r is ReconciliationFutureResultFailure => !r.success) + .map((r) => r.failure); + + return failures; + } + + private static _missingPreviouslyExecutedFutures( + module: IgnitionModule, + executionStateMap: ExecutionStateMap + ) { + const moduleFutures = new Set(module.getFutures().map((f) => f.id)); + + const previouslyStarted = Object.values(executionStateMap).map( + (es) => es.id + ); + + const missing = previouslyStarted.filter((sf) => !moduleFutures.has(sf)); + + return missing; + } + + private static _getFuturesInReverseTopoligicalOrder( + module: IgnitionModule + ): Future[] { + const futures = module.getFutures(); + + const adjacencyList = + AdjacencyListConverter.buildAdjacencyListFromFutures(futures); + + const sortedFutureIds = + AdjacencyList.topologicalSort(adjacencyList).reverse(); + + return sortedFutureIds + .map((id) => futures.find((f) => f.id === id)) + .filter((x): x is Future => x !== undefined); + } + + private static _check( + future: Future, + executionState: ExecutionState, + context: ReconciliationContext, + checks: ReconciliationCheck[] + ): ReconciliationFutureResult { + for (const check of checks) { + const result = check(future, executionState, context); + + if (result.success) { + continue; + } + + return result; + } + + return { success: true }; + } +} diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts new file mode 100644 index 0000000000..51f4b5e0bf --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -0,0 +1,37 @@ +import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; +import { Future, ModuleParameters } from "../../types/module"; + +export interface ReconciliationFailure { + futureId: string; + failure: string; +} + +export interface ReconciliationFutureResultSuccess { + success: true; +} + +export interface ReconciliationFutureResultFailure { + success: false; + failure: ReconciliationFailure; +} + +export type ReconciliationFutureResult = + | ReconciliationFutureResultSuccess + | ReconciliationFutureResultFailure; + +export interface ReconciliationResult { + reconciliationFailures: ReconciliationFailure[]; + missingExecutedFutures: string[]; +} + +export interface ReconciliationContext { + executionStateMap: ExecutionStateMap; + moduleParameters: ModuleParameters; + accounts: string[]; +} + +export type ReconciliationCheck = ( + future: Future, + executionState: ExecutionState, + context: ReconciliationContext +) => ReconciliationFutureResult; diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts new file mode 100644 index 0000000000..579896e3a9 --- /dev/null +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -0,0 +1,81 @@ +import { IgnitionError } from "../../../errors"; +import { isRuntimeValue } from "../../type-guards"; +import { + AccountRuntimeValue, + Future, + ModuleParameterRuntimeValue, + ModuleParameterType, +} from "../../types/module"; +import { isAddress } from "../utils"; + +import { ReconciliationContext, ReconciliationFutureResult } from "./types"; + +export function fail( + future: Future, + failure: string +): ReconciliationFutureResult { + return { + success: false, + failure: { + futureId: future.id, + failure, + }, + }; +} + +export function resolveFromAddress( + from: string | AccountRuntimeValue | undefined, + context: ReconciliationContext +): string | undefined { + if (from === undefined || typeof from === "string") { + return from; + } + + if (typeof from === "string") { + if (!isAddress(from)) { + throw new IgnitionError("From is not a usable address"); + } + + return from; + } + + if (!isRuntimeValue(from)) { + throw new IgnitionError(`Could not resolve from address: ${from as any}`); + } + + const runtimeAddress = context.accounts[from.accountIndex]; + + if (!isAddress(runtimeAddress)) { + throw new IgnitionError( + `From runtime value is not a usable address: ${runtimeAddress}` + ); + } + + return runtimeAddress; +} + +export function resolveModuleParameter( + moduleParamRuntimeValue: ModuleParameterRuntimeValue, + context: ReconciliationContext +) { + const moduleParamValue = + context.moduleParameters[moduleParamRuntimeValue.name]; + + if (moduleParamValue === undefined) { + return moduleParamRuntimeValue.defaultValue; + } + + return moduleParamValue; +} + +export function safeToString(potential: ModuleParameterType | undefined) { + if (potential === undefined) { + return "undefined"; + } + + if (typeof potential === "string") { + return potential; + } + + return JSON.stringify(potential); +} diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 3a9b97defc..0c8b2b21f3 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -1,3 +1,5 @@ +import { ethers } from "ethers"; + import { isFuture } from "../type-guards"; import { ArgumentType, Future } from "../types/module"; @@ -20,3 +22,7 @@ function _getFutures(argument: ArgumentType): Future[] { return []; } + +export function isAddress(address: string): boolean { + return ethers.utils.isAddress(address); +} diff --git a/packages/core/src/new-api/internal/utils/adjacency-list-converter.ts b/packages/core/src/new-api/internal/utils/adjacency-list-converter.ts new file mode 100644 index 0000000000..e2993f4412 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/adjacency-list-converter.ts @@ -0,0 +1,47 @@ +import { Future } from "../../types/module"; + +import { AdjacencyList } from "./adjacency-list"; + +export class AdjacencyListConverter { + public static buildAdjacencyListFromFutures( + futures: Future[] + ): AdjacencyList { + const dependencyGraph = new AdjacencyList(futures.map((f) => f.id)); + + for (const future of futures) { + for (const dependency of future.dependencies) { + dependencyGraph.addDependency({ from: future.id, to: dependency.id }); + + this._optionallyAddDependenciesSubmoduleSiblings( + dependencyGraph, + future, + dependency + ); + } + } + + return dependencyGraph; + } + + /** + * The famed Malaga rule, if a future's dependency is in a submodule, + * then that future should not be executed until all futures in the + * submodule have been run. + */ + private static _optionallyAddDependenciesSubmoduleSiblings( + dependencyGraph: AdjacencyList, + future: Future, + dependency: Future + ): void { + if (future.module === dependency.module) { + return; + } + + for (const moduleDep of dependency.module.futures) { + dependencyGraph.addDependency({ + from: future.id, + to: moduleDep.id, + }); + } + } +} diff --git a/packages/core/src/new-api/internal/utils/adjacency-list.ts b/packages/core/src/new-api/internal/utils/adjacency-list.ts new file mode 100644 index 0000000000..b8fa6b1ae4 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/adjacency-list.ts @@ -0,0 +1,134 @@ +export class AdjacencyList { + /** + * A mapping from futures to each futures dependencies. + * + * Example: + * A + * ^ ^ + * | | + * B C + * Gives a mapping of {A: [], B: [A], C:[A]} + * + */ + private _list: Map> = new Map>(); + + constructor(futureIds: string[]) { + for (const futureId of futureIds) { + this._list.set(futureId, new Set()); + } + } + + /** + * Add a dependency from `from` to `to`. If A depends on B + * then {`from`: A, `to`: B} should be passed. + */ + public addDependency({ from, to }: { from: string; to: string }) { + const toSet = this._list.get(from) ?? new Set(); + + toSet.add(to); + + this._list.set(from, toSet); + } + + public deleteDependency({ from, to }: { from: string; to: string }) { + const toSet = this._list.get(from) ?? new Set(); + + toSet.delete(to); + + this._list.set(from, toSet); + } + + /** + * Get the dependencies, if A depends on B, A's dependencies includes B + * @param from - the future to get the list of dependencies for + * @returns - the dependencies + */ + public getDependenciesFor(from: string): Set { + return this._list.get(from) ?? new Set(); + } + + /** + * Get the dependents, if A depends on B, B's dependents includes A + * @param from - the future to get the list of dependents for + * @returns - the dependents + */ + public getDependentsFor(to: string) { + return [...this._list.entries()] + .filter(([_from, toSet]) => toSet.has(to)) + .map(([from]) => from); + } + + /** + * Remove a future, transfering its dependencies to its dependents. + * @param futureId - The future to eliminate + */ + public eliminate(futureId: string): void { + const dependents = this.getDependentsFor(futureId); + const dependencies = this.getDependenciesFor(futureId); + + this._list.delete(futureId); + + for (const dependent of dependents) { + const toSet = this._list.get(dependent); + + if (toSet === undefined) { + throw new Error("Dependency sets should be defined"); + } + + const setWithoutFuture = new Set( + [...toSet].filter((n) => n !== futureId) + ); + + const updatedSet = new Set([ + ...setWithoutFuture, + ...dependencies, + ]); + + this._list.set(dependent, updatedSet); + } + } + + public static topologicalSort(original: AdjacencyList): string[] { + const newList = this.clone(original); + + if (newList._list.size === 0) { + return []; + } + + // Empty list that will contain the sorted elements + let l: string[] = []; + // set of all nodes with no dependents + const s = new Set( + [...newList._list.keys()].filter( + (fid) => newList.getDependentsFor(fid).length === 0 + ) + ); + + while (s.size !== 0) { + const n = [...s].pop(); + s.delete(n!); + l = [...l, n!]; + for (const m of newList.getDependenciesFor(n!)) { + newList.deleteDependency({ from: n!, to: m }); + + if (newList.getDependentsFor(m).length === 0) { + s.add(m); + } + } + } + + return l; + } + + public static clone(original: AdjacencyList): AdjacencyList { + const newList: AdjacencyList = new AdjacencyList([ + ...original._list.keys(), + ]); + + for (const [from, toSet] of original._list.entries()) { + newList._list.set(from, new Set(toSet)); + } + + return newList; + } +} diff --git a/packages/core/src/new-api/types/execution-engine.ts b/packages/core/src/new-api/types/execution-engine.ts new file mode 100644 index 0000000000..21890f3589 --- /dev/null +++ b/packages/core/src/new-api/types/execution-engine.ts @@ -0,0 +1,8 @@ +import { ExecutionStateMap } from "./execution-state"; +import { IgnitionModule, IgnitionModuleResult } from "./module"; + +export interface ExecutionEngineState { + batches: string[][]; + module: IgnitionModule>; + executionStateMap: ExecutionStateMap; +} diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/types/execution-state.ts index d815b8048f..cfa4069676 100644 --- a/packages/core/src/new-api/types/execution-state.ts +++ b/packages/core/src/new-api/types/execution-state.ts @@ -120,32 +120,63 @@ export interface DeploymentExecutionState > { storedArtifactPath: string; // As stored in the deployment directory. storedBuildInfoPath?: string; // As stored in the deployment directory. Optional as it's not always present + contractName: string; constructorArgs: ArgumentType[]; libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? value: bigint; + from: string | undefined; contractAddress?: string; // The result +} - // from: string; -- Will we support this in the beta? I'll ignore it for now, but we should decide it asap +export interface CallExecutionState + extends BaseExecutionState { + contractAddress: string; + functionName: string; + args: ArgumentType[]; + value: bigint; + from: string | undefined; } -type CallExecutionState = BaseExecutionState; +export interface StaticCallExecutionState + extends BaseExecutionState { + contractAddress: string; + functionName: string; + args: ArgumentType[]; + result?: ArgumentType; + from: string | undefined; +} -type StaticCallExecutionState = - BaseExecutionState; +export interface ContractAtExecutionState + extends BaseExecutionState< + FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT + > { + contractName: string; + address: string; +} -type ContractAtExecutionState = BaseExecutionState< - FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT ->; +export interface ReadEventArgumentExecutionState + extends BaseExecutionState { + eventName: string; + argumentName: string; + eventIndex: number; + emitter: string; +} -type ReadEventArgumentExecutionState = - BaseExecutionState; +export interface SendDataExecutionState + extends BaseExecutionState { + to: string; + data: string | undefined; + value: bigint; + from: string | undefined; +} export type ExecutionState = | DeploymentExecutionState | CallExecutionState | StaticCallExecutionState | ContractAtExecutionState - | ReadEventArgumentExecutionState; + | ReadEventArgumentExecutionState + | SendDataExecutionState; export interface ExecutionStateMap { [key: string]: ExecutionState; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index c961f14a9e..28b91387cc 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -376,4 +376,5 @@ export interface IgnitionModule< futures: Set; // Future created in this module — All of them have to be deployed before returning the results. Note that not all of them are in results submodules: Set; // Modules used by this module — Note that there's only one instance of each module results: IgnitionModuleResultsT; // The futures returned by the callback passed to buildModule + getFutures(): Future[]; } diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index 8952c23001..2c518861e5 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -24,9 +24,11 @@ describe("batcher", () => { history: [], storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", value: BigInt("0"), constructorArgs: [], libraries: {}, + from: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", }; it("should batch a contract deploy module", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts new file mode 100644 index 0000000000..80d349385c --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -0,0 +1,190 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionStateMap, + ExecutionStatus, + StaticCallExecutionState, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - artifact contract at", () => { + const fakeArtifact = ["Fake artifact"] as any; + + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleContractAtState: ContractAtExecutionState = { + id: "Example", + futureType: FutureType.ARTIFACT_CONTRACT_AT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractName: "Contract1", + address: exampleAddress, + }; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + const exampleStaticCallState: StaticCallExecutionState = { + id: "Example", + futureType: FutureType.NAMED_STATIC_CALL, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractAddress: exampleAddress, + functionName: "function", + args: [], + from: undefined, + }; + + it("should reconcile when using an address string", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + exampleAddress, + fakeArtifact + ); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + const previousExecutionState: ExecutionStateMap = { + [`Submodule:Contract1`]: { + ...exampleContractAtState, + futureType: FutureType.ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + address: exampleAddress, + }, + }; + + assertSuccessReconciliation(moduleDefinition, previousExecutionState); + }); + + it("should reconcile when using a static call", () => { + const moduleDefinition = defineModule("Module", (m) => { + const example = m.contract("Example"); + const call = m.staticCall(example, "getAddress"); + + const another = m.contractAtFromArtifact("Another", call, fakeArtifact); + + return { another }; + }); + + const previousExecutionState: ExecutionStateMap = { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Example", + contractAddress: exampleAddress, + }, + "Module:Example#getAddress": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.SUCCESS, + functionName: "getAddress", + result: differentAddress, + }, + "Module:Another": { + ...exampleContractAtState, + futureType: FutureType.ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + contractName: "Another", + address: differentAddress, + }, + }; + + assertSuccessReconciliation(moduleDefinition, previousExecutionState); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractAtFromArtifact( + "ContractChanged", + exampleAddress, + fakeArtifact, + { + id: "Factory", + } + ); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Factory": { + ...exampleContractAtState, + futureType: FutureType.ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + contractName: "ContractUnchanged", + address: differentAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Factory", + failure: + "Contract name has been changed from ContractUnchanged to ContractChanged", + }, + ]); + }); + + it("should find changes to contract address as a literal unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractAtFromArtifact( + "Contract1", + exampleAddress, + fakeArtifact, + { + id: "Factory", + } + ); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Factory": { + ...exampleContractAtState, + futureType: FutureType.ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + address: differentAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Factory", + failure: + "Address has been changed from 0xBA12222222228d8Ba445958a75a0704d566BF2C8 to 0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts new file mode 100644 index 0000000000..3a3748d65a --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -0,0 +1,222 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - artifact contract", () => { + const fakeArtifact = ["Fake artifact"] as any; + + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const safeMath = m.library("SafeMath"); + + const contract1 = m.contractFromArtifact( + "Contract1", + fakeArtifact, + ["unchanged"], + { + libraries: { + SafeMath: safeMath, + }, + } + ); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Submodule:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: ["unchanged"], + libraries: { + SafeMath: exampleAddress, + }, + }, + }); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact( + "ContractChanged", + fakeArtifact, + [], + { id: "Example" } + ); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "ContractUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: + "Contract name has been changed from ContractUnchanged to ContractChanged", + }, + ]); + }); + + it("should find changes to constructors unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + "changed", + ]); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: ["unchanged"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1", + failure: "Constructor args have been changed", + }, + ]); + }); + + it("should find changes to libraries unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const safeMath = m.library("SafeMath"); + + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { + libraries: { + SafeMath: safeMath, + }, + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.HOLD, + libraries: {}, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1", + failure: "Libraries have been changed", + }, + ]); + }); + + it("should find changes to value unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { + id: "Example", + value: BigInt(4), + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + value: BigInt(3), + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: "Value has been changed from 3 to 4", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { + id: "Example", + from: "0x222", + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts new file mode 100644 index 0000000000..1bcfa0668b --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -0,0 +1,161 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - artifact library", () => { + const fakeArtifact = ["Fake artifact"] as any; + + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const safeMath = m.library("SafeMath"); + + const mainLib = m.libraryFromArtifact("MainLibrary", fakeArtifact, { + libraries: { SafeMath: safeMath }, + }); + + return { safeMath, mainLib }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { mainLib } = m.useModule(submoduleDefinition); + + return { mainLib }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Submodule:MainLibrary": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "MainLibrary", + libraries: { + SafeMath: exampleAddress, + }, + }, + }); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const library1 = m.libraryFromArtifact("LibraryChanged", fakeArtifact, { + id: "Example", + }); + + return { contract1: library1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "LibraryUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: + "Library name has been changed from LibraryUnchanged to LibraryChanged", + }, + ]); + }); + + it("should find changes to libraries unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const safeMath = m.library("SafeMath"); + + const mainLib = m.libraryFromArtifact("MainLibrary", fakeArtifact, { + libraries: { Changed: safeMath }, + }); + + return { safeMath, mainLib }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Module:MainLibrary": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.HOLD, + contractName: "MainLibrary", + libraries: { + Unchanged: exampleAddress, + }, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:MainLibrary", + failure: "Libraries have been changed", + }, + ]); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const library1 = m.libraryFromArtifact("Library1", fakeArtifact, { + id: "Example", + from: "0x222", + }); + + return { contract1: library1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library1", + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts new file mode 100644 index 0000000000..e59b9de775 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -0,0 +1,174 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionStateMap, + ExecutionStatus, + StaticCallExecutionState, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - named contract at", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleContractAtState: ContractAtExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_AT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractName: "Contract1", + address: exampleAddress, + }; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + const exampleStaticCallState: StaticCallExecutionState = { + id: "Example", + futureType: FutureType.NAMED_STATIC_CALL, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractAddress: exampleAddress, + functionName: "function", + args: [], + from: undefined, + }; + + it("should reconcile unchanged when using an address string", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const contract1 = m.contractAt("Contract1", exampleAddress); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + const previousExecutionState: ExecutionStateMap = { + [`Submodule:Contract1`]: { + ...exampleContractAtState, + futureType: FutureType.NAMED_CONTRACT_AT, + status: ExecutionStatus.STARTED, + address: exampleAddress, + }, + }; + + assertSuccessReconciliation(moduleDefinition, previousExecutionState); + }); + + it("should reconcile unchanged when using an static call", () => { + const moduleDefinition = defineModule("Module", (m) => { + const example = m.contract("Example"); + const call = m.staticCall(example, "getAddress"); + + const another = m.contractAt("Another", call); + + return { another }; + }); + + const previousExecutionState: ExecutionStateMap = { + "Module:Example": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + contractName: "Example", + }, + "Module:Example#getAddress": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.SUCCESS, + functionName: "getAddress", + result: differentAddress, + }, + "Module:Another": { + ...exampleContractAtState, + futureType: FutureType.NAMED_CONTRACT_AT, + status: ExecutionStatus.STARTED, + address: differentAddress, + contractName: "Another", + }, + }; + + assertSuccessReconciliation(moduleDefinition, previousExecutionState); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractAt("ContractChanged", exampleAddress, { + id: "Factory", + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Factory": { + ...exampleContractAtState, + futureType: FutureType.NAMED_CONTRACT_AT, + status: ExecutionStatus.STARTED, + contractName: "ContractUnchanged", + address: exampleAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Factory", + failure: + "Contract name has been changed from ContractUnchanged to ContractChanged", + }, + ]); + }); + + it("should find changes to contract address as a literal unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contractAt("Contract1", exampleAddress, { + id: "Factory", + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Factory": { + ...exampleContractAtState, + futureType: FutureType.NAMED_CONTRACT_AT, + status: ExecutionStatus.STARTED, + address: differentAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Factory", + failure: + "Address has been changed from 0xBA12222222228d8Ba445958a75a0704d566BF2C8 to 0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts new file mode 100644 index 0000000000..4607d56447 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -0,0 +1,233 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + CallExecutionState, + DeploymentExecutionState, + ExecutionStatus, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - named contract call", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + contractAddress: "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + }; + + const exampleContractCallState: CallExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_CALL, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractAddress: "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + functionName: "function", + args: [], + value: BigInt("0"), + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [1, "a"], {}); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + }, + "Submodule:Contract1#function1": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.SUCCESS, + functionName: "function1", + args: [1, "a"], + }, + }); + }); + + it("should find changes to contract unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: differentAddress, + }, + "Module:Contract1#config": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + contractAddress: exampleAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: + "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8", + }, + ]); + }); + + it("should find changes to function name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "functionChanged", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + }, + "Module:Contract1#config": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "functionUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: + "Function name has been changed from functionUnchanged to functionChanged", + }, + ]); + }); + + it("should find changes to function args unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", ["changed"], {}); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + }, + "Module:Contract1#function1": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["unchanged"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#function1", + failure: "Function args have been changed", + }, + ]); + }); + + it("should find changes to value unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [], { id: "config", value: BigInt(3) }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + }, + "Module:Contract1#config": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + value: BigInt(2), + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: "Value has been changed from 2 to 3", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [], { id: "config", from: "0x222" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + }, + "Module:Contract1#config": { + ...exampleContractCallState, + futureType: FutureType.NAMED_CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts new file mode 100644 index 0000000000..af1807796a --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -0,0 +1,206 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - named contract", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const safeMath = m.library("SafeMath"); + + const contract1 = m.contract("Contract1", ["unchanged"], { + libraries: { + SafeMath: safeMath, + }, + }); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Submodule:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + constructorArgs: ["unchanged"], + libraries: { + SafeMath: exampleAddress, + }, + }, + }); + }); + + it("should find changes to contract name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("ContractChanged", [], { + id: "Example", + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + contractName: "ContractUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: + "Contract name has been changed from ContractUnchanged to ContractChanged", + }, + ]); + }); + + it("should find changes to constructors unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1", ["changed"]); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + constructorArgs: ["unchanged"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1", + failure: "Constructor args have been changed", + }, + ]); + }); + + it("should find changes to libraries unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const safeMath = m.library("SafeMath"); + + const contract1 = m.contract("Contract1", [], { + libraries: { + SafeMath: safeMath, + }, + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.HOLD, + libraries: {}, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1", + failure: "Libraries have been changed", + }, + ]); + }); + + it("should find changes to value unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + value: BigInt(3), + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + contractName: "Contract", + value: BigInt(2), + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: "Value has been changed from 2 to 3", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + from: "0x222", + }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Example": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + contractName: "Contract", + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Example", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts new file mode 100644 index 0000000000..c0399f6e46 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -0,0 +1,154 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - named library", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const safeMath = m.library("SafeMath"); + + const mainLib = m.library("MainLibrary", { + libraries: { SafeMath: safeMath }, + }); + + return { safeMath, mainLib }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { mainLib } = m.useModule(submoduleDefinition); + + return { mainLib }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Submodule:MainLibrary": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "MainLibrary", + libraries: { + SafeMath: exampleAddress, + }, + }, + }); + }); + + it("should find changes to library name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const library = m.library("LibraryChanged", { id: "Library" }); + + return { library }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Library": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "LibraryUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Library", + failure: + "Library name has been changed from LibraryUnchanged to LibraryChanged", + }, + ]); + }); + + it("should find changes to libraries unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const safeMath = m.library("SafeMath"); + + const mainLib = m.library("MainLibrary", { + libraries: { Changed: safeMath }, + }); + + return { safeMath, mainLib }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:SafeMath": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "SafeMath", + contractAddress: exampleAddress, + }, + "Module:MainLibrary": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.HOLD, + contractName: "MainLibrary", + libraries: { + Unchanged: exampleAddress, + }, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:MainLibrary", + failure: "Libraries have been changed", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const library = m.library("Library", { id: "Library", from: "0x222" }); + + return { library }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Library": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library", + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Library", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts new file mode 100644 index 0000000000..d25544338e --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -0,0 +1,207 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, + StaticCallExecutionState, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - named static call", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + const exampleStaticCallState: StaticCallExecutionState = { + id: "Example", + futureType: FutureType.NAMED_STATIC_CALL, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + contractAddress: exampleAddress, + functionName: "function", + args: [], + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [1, "a"]); + + return { contract1 }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Submodule:Contract1#function1": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + functionName: "function1", + args: [1, "a"], + }, + }); + }); + + it("should find changes to contract unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: differentAddress, + }, + "Module:Contract1#config": { + ...exampleStaticCallState, + status: ExecutionStatus.STARTED, + functionName: "function1", + contractAddress: exampleAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: + "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8", + }, + ]); + }); + + it("should find changes to function name unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "functionChanged", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Module:Contract1#config": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + functionName: "functionUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: + "Function name has been changed from functionUnchanged to functionChanged", + }, + ]); + }); + + it("should find changes to function args unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", ["changed"], {}); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Module:Contract1#function1": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + functionName: "function1", + args: ["unchanged"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#function1", + failure: "Function args have been changed", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [], { id: "config", from: "0x222" }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Module:Contract1#config": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + functionName: "function1", + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1#config", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts new file mode 100644 index 0000000000..e0ec8bf2c5 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -0,0 +1,225 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, + ReadEventArgumentExecutionState, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - read event argument", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleReadArgState: ReadEventArgumentExecutionState = { + id: "Example", + futureType: FutureType.READ_EVENT_ARGUMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + eventName: "event1", + argumentName: "argument1", + eventIndex: 0, + emitter: exampleAddress, + }; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "EventName1", "arg1"); + + return { contract }; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const { contract } = m.useModule(submoduleDefinition); + + return { contract }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:Contract": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + contractAddress: exampleAddress, + }, + "Submodule:Contract#EventName1#arg1#0": { + ...exampleReadArgState, + status: ExecutionStatus.STARTED, + eventName: "EventName1", + argumentName: "arg1", + }, + }); + }); + + it("should find changes to the event unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "EventChanged", "arg1", { + id: "ReadEvent", + }); + + return { contract }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + contractAddress: exampleAddress, + }, + "Module:ReadEvent": { + ...exampleReadArgState, + status: ExecutionStatus.STARTED, + eventName: "eventUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:ReadEvent", + failure: + "Event name has been changed from eventUnchanged to EventChanged", + }, + ]); + }); + + it("should find changes to the argument unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "event1", "argChanged", { + id: "ReadEvent", + }); + + return { contract }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + contractName: "Contract", + }, + "Module:ReadEvent": { + ...exampleReadArgState, + status: ExecutionStatus.STARTED, + argumentName: "argUnchanged", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:ReadEvent", + failure: + "Argument name has been changed from argUnchanged to argChanged", + }, + ]); + }); + + it("should find changes to the event index unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "event1", "argument1", { + id: "ReadEvent", + eventIndex: 3, + }); + + return { contract }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + contractName: "Contract", + }, + "Module:ReadEvent": { + ...exampleReadArgState, + status: ExecutionStatus.STARTED, + eventIndex: 1, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:ReadEvent", + failure: "Event index has been changed from 1 to 3", + }, + ]); + }); + + it("should find changes to the emitter unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + m.readEventArgument(contract1, "event1", "argument1", { + id: "ReadEvent", + emitter: contract2, + }); + + return { contract1, contract2 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract1", + contractAddress: exampleAddress, + }, + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract2", + contractAddress: differentAddress, + }, + "Module:ReadEvent": { + ...exampleReadArgState, + status: ExecutionStatus.STARTED, + emitter: exampleAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:ReadEvent", + failure: + "Emitter has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts new file mode 100644 index 0000000000..c09c06c805 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -0,0 +1,143 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../../src/new-api/define-module"; +import { + ExecutionStatus, + SendDataExecutionState, +} from "../../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../../src/new-api/types/module"; +import { assertSuccessReconciliation, reconcile } from "../helpers"; + +describe("Reconciliation - send data", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleSendState: SendDataExecutionState = { + id: "Example", + futureType: FutureType.SEND_DATA, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + to: exampleAddress, + data: "example_data", + value: BigInt("0"), + from: undefined, + }; + + it("should reconcile unchanged", () => { + const submoduleDefinition = defineModule("Submodule", (m) => { + m.send("test_send", exampleAddress, 0n, "example_data"); + + return {}; + }); + + const moduleDefinition = defineModule("Module", (m) => { + const {} = m.useModule(submoduleDefinition); + + return {}; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Submodule:test_send": { + ...exampleSendState, + status: ExecutionStatus.STARTED, + }, + }); + }); + + it("should find changes to the to address unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + m.send("test_send", differentAddress, 0n, "example_data"); + + return {}; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:test_send": { + ...exampleSendState, + status: ExecutionStatus.STARTED, + to: exampleAddress, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:test_send", + failure: + "To address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8", + }, + ]); + }); + + it("should find changes to the to data unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + m.send("test_send", exampleAddress, 0n, "changed_data"); + + return {}; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:test_send": { + ...exampleSendState, + status: ExecutionStatus.STARTED, + data: "unchanged_data", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:test_send", + failure: "Data has been changed from unchanged_data to changed_data", + }, + ]); + }); + + it("should find changes to the value unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + m.send("test_send", exampleAddress, 3n, "example_data"); + + return {}; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:test_send": { + ...exampleSendState, + status: ExecutionStatus.STARTED, + value: 2n, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:test_send", + failure: "Value has been changed from 2 to 3", + }, + ]); + }); + + it("should find changes to from unreconciliable", () => { + const moduleDefinition = defineModule("Module", (m) => { + m.send("test_send", exampleAddress, 0n, "example_data", { + from: "0x222", + }); + + return {}; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:test_send": { + ...exampleSendState, + status: ExecutionStatus.STARTED, + from: "0x111", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:test_send", + failure: "From account has been changed from 0x111 to 0x222", + }, + ]); + }); +}); diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts new file mode 100644 index 0000000000..5f5ff91776 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -0,0 +1,89 @@ +import { assert } from "chai"; + +import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; +import { Reconcilier } from "../../../src/new-api/internal/reconciliation/reconcilier"; +import { ReconciliationResult } from "../../../src/new-api/internal/reconciliation/types"; +import { ExecutionStateMap } from "../../../src/new-api/types/execution-state"; +import { + IgnitionModuleResult, + ModuleParameters, +} from "../../../src/new-api/types/module"; +import { IgnitionModuleDefinition } from "../../../src/new-api/types/module-builder"; + +export function reconcile( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + executionStateMap: ExecutionStateMap, + moduleParameters: ModuleParameters = {} +): ReconciliationResult { + const accounts: string[] = [ + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", + ]; + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + // overwrite the id with the execution state map, makes writing tests + // less error prone + const updatedExecutionStateMap = Object.fromEntries( + Object.entries(executionStateMap).map(([key, exState]) => [ + key, + { ...exState, id: key }, + ]) + ); + + const reconiliationResult = Reconcilier.reconcile( + module, + updatedExecutionStateMap, + moduleParameters, + accounts + ); + + return reconiliationResult; +} + +export function assertNoWarningsOrErrors( + reconciliationResult: ReconciliationResult +) { + assert.equal( + reconciliationResult.reconciliationFailures.length, + 0, + `Unreconcilied futures found: \n${JSON.stringify( + reconciliationResult.reconciliationFailures, + undefined, + 2 + )}` + ); + assert.equal( + reconciliationResult.missingExecutedFutures.length, + 0, + `Missing futures found: \n${JSON.stringify( + reconciliationResult.missingExecutedFutures, + undefined, + 2 + )}` + ); +} + +export function assertSuccessReconciliation( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + previousExecutionState: ExecutionStateMap +): void { + const reconciliationResult = reconcile( + moduleDefinition, + previousExecutionState + ); + + assertNoWarningsOrErrors(reconciliationResult); +} diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts new file mode 100644 index 0000000000..c5825548f6 --- /dev/null +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -0,0 +1,244 @@ +import { assert } from "chai"; + +import { defineModule } from "../../../src/new-api/define-module"; +import { + DeploymentExecutionState, + ExecutionStatus, +} from "../../../src/new-api/types/execution-state"; +import { FutureType } from "../../../src/new-api/types/module"; + +import { assertSuccessReconciliation, reconcile } from "./helpers"; + +describe("Reconciliation", () => { + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: undefined, + }; + + it("should successfully reconcile on an empty execution state", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + assertSuccessReconciliation(moduleDefinition, {}); + }); + + it("should find previous executed futures that have been left out of the current module", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module1:ContractMissed": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + }, + }); + + assert.deepStrictEqual( + reconiliationResult.missingExecutedFutures, + ["Module1:ContractMissed"], + "Exected one missing previous executed future" + ); + }); + + it("should flag as unreconsiliable a future that has changed type", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1", { id: "Example" }); + + return { library1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module1:Example": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module1:Example", + failure: + "Future with id Module1:Example has changed from NAMED_CONTRACT_DEPLOYMENT to NAMED_LIBRARY_DEPLOYMENT", + }, + ]); + }); + + describe("dependencies", () => { + it("should reconcile unchanged dependencies", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + const contract3 = m.contract("Contract3", [], { + after: [contract1, contract2], + }); + + return { contract1, contract2, contract3 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract1", + }, + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract2", + }, + "Module:Contract3": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + dependencies: new Set(["Module:Contract2", "Module:Contract2"]), + contractName: "Contract3", + }, + }); + }); + + it("should reconcile the reduction of dependencies", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + const contract3 = m.contract("Contract3", [], { + after: [contract2], // one less dep than execution state + }); + + return { contract1, contract2, contract3 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract1", + }, + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract2", + }, + "Module:Contract3": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(["Module:Contract1", "Module:Contract2"]), + contractName: "Contract3", + }, + }); + }); + + it("should reconcile the addition of a dependency to a completed future", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [], { + after: [contract1], + }); + + return { contract1, contract2 }; + }); + + assertSuccessReconciliation(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract1", + }, + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Contract2", + dependencies: new Set(), // no deps on last run + }, + }); + }); + + it("should not reconcile the addition of a dependency that is not a success", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2", [], { + after: [contract1], + }); + + return { contract1, contract2 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, // Could still be in flight + contractName: "Contract1", + }, + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(), // no deps on last run + contractName: "Contract2", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract2", + failure: + "A dependency from Module:Contract2 to the already started future Module:Contract1 has been added", + }, + ]); + }); + + it("should not reconcile the addition of a dependency that was not previously started", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contractNew = m.contract("ContractNew"); + const contract2 = m.contract("Contract2", [], { + after: [contractNew], + }); + + return { contractNew, contract2 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract2": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + dependencies: new Set(), // no deps on last run + contractName: "Contract2", + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract2", + failure: + "A dependency from Module:Contract2 to the a new future Module:ContractNew has been added", + }, + ]); + }); + }); +}); diff --git a/packages/core/test/new-api/utils/adjacency-list.ts b/packages/core/test/new-api/utils/adjacency-list.ts new file mode 100644 index 0000000000..5669641b65 --- /dev/null +++ b/packages/core/test/new-api/utils/adjacency-list.ts @@ -0,0 +1,39 @@ +import { assert } from "chai"; + +import { AdjacencyList } from "../../../src/new-api/internal/utils/adjacency-list"; + +describe("adjacency list", () => { + it("should provide a topological sort", () => { + const adjacencyList = new AdjacencyList([ + "5", + "7", + "3", + "11", + "8", + "2", + "9", + "10", + ]); + + adjacencyList.addDependency({ from: "5", to: "11" }); + adjacencyList.addDependency({ from: "7", to: "11" }); + adjacencyList.addDependency({ from: "7", to: "8" }); + adjacencyList.addDependency({ from: "3", to: "8" }); + adjacencyList.addDependency({ from: "3", to: "10" }); + adjacencyList.addDependency({ from: "11", to: "2" }); + adjacencyList.addDependency({ from: "11", to: "9" }); + adjacencyList.addDependency({ from: "11", to: "10" }); + adjacencyList.addDependency({ from: "8", to: "9" }); + + assert.deepStrictEqual(AdjacencyList.topologicalSort(adjacencyList), [ + "3", + "7", + "8", + "5", + "11", + "10", + "9", + "2", + ]); + }); +}); From ce8180eda58681d707eb30eb073ddb1ca61ec29f Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 11:53:59 +0100 Subject: [PATCH 0434/1302] refactor: remove `getFutures` from module Replace the module function `getFutures` with `getFuturesFromModule` which is not under `./internal/utils`. There is also a rename of the `getFutures` function to `resolveArgsToFutures`, to make its context more specific and to avoid doubt as to which to use when getting futures from modules. --- packages/core/src/new-api/internal/batcher.ts | 3 ++- packages/core/src/new-api/internal/module-builder.ts | 10 +++++----- packages/core/src/new-api/internal/module.ts | 6 ------ .../new-api/internal/reconciliation/reconcilier.ts | 7 +++++-- packages/core/src/new-api/internal/utils.ts | 10 +++++----- .../new-api/internal/utils/get-futures-from-module.ts | 11 +++++++++++ packages/core/src/new-api/types/module.ts | 1 - 7 files changed, 28 insertions(+), 20 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/get-futures-from-module.ts diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts index 8c70a245ab..86acb7183a 100644 --- a/packages/core/src/new-api/internal/batcher.ts +++ b/packages/core/src/new-api/internal/batcher.ts @@ -3,6 +3,7 @@ import { Future, IgnitionModule } from "../types/module"; import { AdjacencyList } from "./utils/adjacency-list"; import { AdjacencyListConverter } from "./utils/adjacency-list-converter"; +import { getFuturesFromModule } from "./utils/get-futures-from-module"; enum VisitStatus { UNVISITED, @@ -45,7 +46,7 @@ export class Batcher { module: IgnitionModule, executionStateMap: ExecutionStateMap ): BatchState { - const allFutures = module.getFutures(); + const allFutures = getFuturesFromModule(module); const visitState = this._intializeVisitStateFrom( allFutures, diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index a0237e75eb..f6f10638ff 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -53,7 +53,7 @@ import { ReadEventArgumentFutureImplementation, SendDataFutureImplementation, } from "./module"; -import { getFutures } from "./utils"; +import { resolveArgsToFutures } from "./utils"; const STUB_MODULE_RESULTS = { [inspect.custom](): string { @@ -174,7 +174,7 @@ export class IgnitionModuleBuilderImplementation< options.from ); - for (const arg of getFutures(args)) { + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } @@ -217,7 +217,7 @@ export class IgnitionModuleBuilderImplementation< this._module.futures.add(future); - for (const arg of getFutures(args)) { + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } @@ -320,7 +320,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(contractFuture); - for (const arg of getFutures(args)) { + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } @@ -355,7 +355,7 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(contractFuture); - for (const arg of getFutures(args)) { + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 8de07b586e..fc7fc44dca 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -265,12 +265,6 @@ export class IgnitionModuleImplementation< )} }`; } - - public getFutures(): Future[] { - return [...this.futures].concat( - Array.from(this.submodules).flatMap((sub) => sub.getFutures()) - ); - } } export class AccountRuntimeValueImplementation implements AccountRuntimeValue { diff --git a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts index 07e8be16c6..c52850704c 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts @@ -2,6 +2,7 @@ import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; +import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { reconcileCurrentAndPreviousTypeMatch } from "./reconcileCurrentAndPreviousTypeMatch"; import { reconcileDependencyRules } from "./reconcileDependencyRules"; @@ -67,7 +68,9 @@ export class Reconcilier { module: IgnitionModule, executionStateMap: ExecutionStateMap ) { - const moduleFutures = new Set(module.getFutures().map((f) => f.id)); + const moduleFutures = new Set( + getFuturesFromModule(module).map((f) => f.id) + ); const previouslyStarted = Object.values(executionStateMap).map( (es) => es.id @@ -81,7 +84,7 @@ export class Reconcilier { private static _getFuturesInReverseTopoligicalOrder( module: IgnitionModule ): Future[] { - const futures = module.getFutures(); + const futures = getFuturesFromModule(module); const adjacencyList = AdjacencyListConverter.buildAdjacencyListFromFutures(futures); diff --git a/packages/core/src/new-api/internal/utils.ts b/packages/core/src/new-api/internal/utils.ts index 0c8b2b21f3..cd99455fc0 100644 --- a/packages/core/src/new-api/internal/utils.ts +++ b/packages/core/src/new-api/internal/utils.ts @@ -3,21 +3,21 @@ import { ethers } from "ethers"; import { isFuture } from "../type-guards"; import { ArgumentType, Future } from "../types/module"; -export function getFutures(args: ArgumentType[]): Future[] { - return args.flatMap(_getFutures); +export function resolveArgsToFutures(args: ArgumentType[]): Future[] { + return args.flatMap(_resolveArgToFutures); } -function _getFutures(argument: ArgumentType): Future[] { +function _resolveArgToFutures(argument: ArgumentType): Future[] { if (isFuture(argument)) { return [argument]; } if (Array.isArray(argument)) { - return getFutures(argument); + return resolveArgsToFutures(argument); } if (typeof argument === "object" && argument !== null) { - return getFutures(Object.values(argument)); + return resolveArgsToFutures(Object.values(argument)); } return []; diff --git a/packages/core/src/new-api/internal/utils/get-futures-from-module.ts b/packages/core/src/new-api/internal/utils/get-futures-from-module.ts new file mode 100644 index 0000000000..fcc1fb40d1 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/get-futures-from-module.ts @@ -0,0 +1,11 @@ +import { Future, IgnitionModule } from "../../types/module"; + +/** + * Get the futures from a module, including its submodules. + * No ordering is enforced. + */ +export function getFuturesFromModule(module: IgnitionModule): Future[] { + return [...module.futures].concat( + Array.from(module.submodules).flatMap((sub) => getFuturesFromModule(sub)) + ); +} diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 28b91387cc..c961f14a9e 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -376,5 +376,4 @@ export interface IgnitionModule< futures: Set; // Future created in this module — All of them have to be deployed before returning the results. Note that not all of them are in results submodules: Set; // Modules used by this module — Note that there's only one instance of each module results: IgnitionModuleResultsT; // The futures returned by the callback passed to buildModule - getFutures(): Future[]; } From 2c30fd0167fddb827460887a3427c0bf30305f66 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 11:58:53 +0100 Subject: [PATCH 0435/1302] refactor: move execution engine state to internal types --- packages/core/src/new-api/internal/execution-engine.ts | 2 +- .../core/src/new-api/{ => internal}/types/execution-engine.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename packages/core/src/new-api/{ => internal}/types/execution-engine.ts (56%) diff --git a/packages/core/src/new-api/internal/execution-engine.ts b/packages/core/src/new-api/internal/execution-engine.ts index 01fbbb9064..18929bc532 100644 --- a/packages/core/src/new-api/internal/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution-engine.ts @@ -1,4 +1,4 @@ -import { ExecutionEngineState } from "../types/execution-engine"; +import { ExecutionEngineState } from "./types/execution-engine"; export class ExecutionEngine { public execute(_preparedExecution: ExecutionEngineState) { diff --git a/packages/core/src/new-api/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts similarity index 56% rename from packages/core/src/new-api/types/execution-engine.ts rename to packages/core/src/new-api/internal/types/execution-engine.ts index 21890f3589..68987b190a 100644 --- a/packages/core/src/new-api/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,5 +1,5 @@ -import { ExecutionStateMap } from "./execution-state"; -import { IgnitionModule, IgnitionModuleResult } from "./module"; +import { ExecutionStateMap } from "../../types/execution-state"; +import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; export interface ExecutionEngineState { batches: string[][]; From 3dd8abc7fce7b0a4f803b2235c0a428959fa61c0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:04:28 +0100 Subject: [PATCH 0436/1302] refactor: move execution-state to internal type --- packages/core/src/internal/utils/guards.ts | 2 +- packages/core/src/new-api/deployer.ts | 2 +- packages/core/src/new-api/internal/batcher.ts | 2 +- .../reconciliation/execution-state-resolver.ts | 14 +++++++------- .../futures/reconcileArtifactContractAt.ts | 2 +- .../futures/reconcileArtifactContractDeployment.ts | 2 +- .../futures/reconcileArtifactLibraryDeployment.ts | 2 +- .../futures/reconcileNamedContractAt.ts | 2 +- .../futures/reconcileNamedContractCall.ts | 2 +- .../futures/reconcileNamedContractDeployment.ts | 2 +- .../futures/reconcileNamedLibraryDeployment.ts | 2 +- .../futures/reconcileNamedStaticCall.ts | 2 +- .../futures/reconcileReadEventArgument.ts | 2 +- .../reconciliation/futures/reconcileSendData.ts | 2 +- .../reconcileCurrentAndPreviousTypeMatch.ts | 2 +- .../reconciliation/reconcileDependencyRules.ts | 4 ++-- .../reconcileFutureSpecificReconciliations.ts | 4 ++-- .../new-api/internal/reconciliation/reconcilier.ts | 2 +- .../src/new-api/internal/reconciliation/types.ts | 2 +- .../src/new-api/internal/types/execution-engine.ts | 3 ++- .../{ => internal}/types/execution-state.ts | 2 +- packages/core/test/new-api/batcher.ts | 2 +- .../futures/reconcileArtifactContractAt.ts | 2 +- .../futures/reconcileArtifactContractDeployment.ts | 2 +- .../futures/reconcileArtifactLibraryDeployment.ts | 2 +- .../futures/reconcileNamedContractAt.ts | 2 +- .../futures/reconcileNamedContractCall.ts | 2 +- .../futures/reconcileNamedContractDeployment.ts | 2 +- .../futures/reconcileNamedLibraryDeployment.ts | 2 +- .../futures/reconcileNamedStaticCall.ts | 2 +- .../futures/reconcileReadEventArgument.ts | 2 +- .../reconciliation/futures/reconcileSendData.ts | 2 +- .../core/test/new-api/reconciliation/helpers.ts | 2 +- .../core/test/new-api/reconciliation/reconciler.ts | 2 +- 34 files changed, 43 insertions(+), 42 deletions(-) rename packages/core/src/new-api/{ => internal}/types/execution-state.ts (98%) diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 23369bff8e..5aced17681 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -26,7 +26,7 @@ import { DeploymentExecutionState, ExecutionState, StaticCallExecutionState, -} from "../../new-api/types/execution-state"; +} from "../../new-api/internal/types/execution-state"; import { FutureType } from "../../new-api/types/module"; import { ArtifactOld } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 2398d85a99..9b37285503 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -5,7 +5,7 @@ import { Batcher } from "./internal/batcher"; import { ExecutionEngine } from "./internal/execution-engine"; import { ModuleConstructor } from "./internal/module-builder"; import { Reconcilier } from "./internal/reconciliation/reconcilier"; -import { ExecutionStateMap } from "./types/execution-state"; +import { ExecutionStateMap } from "./internal/types/execution-state"; export class Deployer { private _moduleConstructor: ModuleConstructor; diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts index 86acb7183a..7fe1a79c8c 100644 --- a/packages/core/src/new-api/internal/batcher.ts +++ b/packages/core/src/new-api/internal/batcher.ts @@ -1,6 +1,6 @@ -import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { Future, IgnitionModule } from "../types/module"; +import { ExecutionStateMap, ExecutionStatus } from "./types/execution-state"; import { AdjacencyList } from "./utils/adjacency-list"; import { AdjacencyListConverter } from "./utils/adjacency-list-converter"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 2394dc7462..5c63f1922e 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -1,18 +1,18 @@ import { IgnitionError } from "../../../errors"; import { isRuntimeValue } from "../../type-guards"; -import { - DeploymentExecutionState, - ExecutionState, - ExecutionStateMap, - SendDataExecutionState, - StaticCallExecutionState, -} from "../../types/execution-state"; import { AddressResolvableFuture, ContractFuture, Future, ModuleParameterRuntimeValue, } from "../../types/module"; +import { + DeploymentExecutionState, + ExecutionState, + ExecutionStateMap, + SendDataExecutionState, + StaticCallExecutionState, +} from "../types/execution-state"; import { isAddress } from "../utils"; import { ReconciliationContext } from "./types"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts index 2cb983c4cb..fef55f1c3c 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { ContractAtExecutionState } from "../../../types/execution-state"; import { ArtifactContractAtFuture } from "../../../types/module"; +import { ContractAtExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 3b44fa28c2..a471d02922 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { DeploymentExecutionState } from "../../../types/execution-state"; import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 38106dcdb4..4474c11f0d 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { DeploymentExecutionState } from "../../../types/execution-state"; import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts index 562dd539a8..af4fd8ba48 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { ContractAtExecutionState } from "../../../types/execution-state"; import { NamedContractAtFuture } from "../../../types/module"; +import { ContractAtExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 877bf851e7..0baeda98e2 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { CallExecutionState } from "../../../types/execution-state"; import { NamedContractCallFuture } from "../../../types/module"; +import { CallExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 93d22d3d34..a376e202c5 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { DeploymentExecutionState } from "../../../types/execution-state"; import { NamedContractDeploymentFuture } from "../../../types/module"; +import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 9d0583e756..965b0e6fa6 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { DeploymentExecutionState } from "../../../types/execution-state"; import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index 9f8db961a1..cbe6ec27f2 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { StaticCallExecutionState } from "../../../types/execution-state"; import { NamedStaticCallFuture } from "../../../types/module"; +import { StaticCallExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts index 68241583b7..401bcfda62 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts @@ -1,5 +1,5 @@ -import { ReadEventArgumentExecutionState } from "../../../types/execution-state"; import { ReadEventArgumentFuture } from "../../../types/module"; +import { ReadEventArgumentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index 2f5b79fd61..40db7baa73 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -1,7 +1,7 @@ import { isEqual } from "lodash"; -import { SendDataExecutionState } from "../../../types/execution-state"; import { SendDataFuture } from "../../../types/module"; +import { SendDataExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { fail, resolveFromAddress, safeToString } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts b/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts index 78f1e24294..9d1fc025c9 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts @@ -1,5 +1,5 @@ -import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; import { Future, FutureType } from "../../types/module"; +import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { ReconciliationFutureResult } from "./types"; import { fail } from "./utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts index f79e6c4165..1e0a1b2dc5 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -1,11 +1,11 @@ import { difference } from "lodash"; +import { Future } from "../../types/module"; import { ExecutionState, ExecutionStateMap, ExecutionStatus, -} from "../../types/execution-state"; -import { Future } from "../../types/module"; +} from "../types/execution-state"; import { ReconciliationFutureResult } from "./types"; import { fail } from "./utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts index dca7fad6f8..b07dc23f6c 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts @@ -1,3 +1,4 @@ +import { Future, FutureType } from "../../types/module"; import { CallExecutionState, ContractAtExecutionState, @@ -6,8 +7,7 @@ import { ReadEventArgumentExecutionState, SendDataExecutionState, StaticCallExecutionState, -} from "../../types/execution-state"; -import { Future, FutureType } from "../../types/module"; +} from "../types/execution-state"; import { reconcileArtifactContractAt } from "./futures/reconcileArtifactContractAt"; import { reconcileArtifactContractDeployment } from "./futures/reconcileArtifactContractDeployment"; diff --git a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts index c52850704c..eb5170f506 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcilier.ts @@ -1,5 +1,5 @@ -import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; +import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index 51f4b5e0bf..db1b922575 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -1,5 +1,5 @@ -import { ExecutionState, ExecutionStateMap } from "../../types/execution-state"; import { Future, ModuleParameters } from "../../types/module"; +import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; export interface ReconciliationFailure { futureId: string; diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 68987b190a..e0c68e641a 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,6 +1,7 @@ -import { ExecutionStateMap } from "../../types/execution-state"; import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; +import { ExecutionStateMap } from "./execution-state"; + export interface ExecutionEngineState { batches: string[][]; module: IgnitionModule>; diff --git a/packages/core/src/new-api/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts similarity index 98% rename from packages/core/src/new-api/types/execution-state.ts rename to packages/core/src/new-api/internal/types/execution-state.ts index cfa4069676..9419ad7168 100644 --- a/packages/core/src/new-api/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -1,4 +1,4 @@ -import { ArgumentType, FutureType } from "./module"; +import { ArgumentType, FutureType } from "../../types/module"; /** * This interface represents a transaction that was sent to the network. diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index 2c518861e5..b24732c4ac 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -7,7 +7,7 @@ import { DeploymentExecutionState, ExecutionStateMap, ExecutionStatus, -} from "../../src/new-api/types/execution-state"; +} from "../../src/new-api/internal/types/execution-state"; import { FutureType, IgnitionModuleResult, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index 80d349385c..6722deb565 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -7,7 +7,7 @@ import { ExecutionStateMap, ExecutionStatus, StaticCallExecutionState, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index 3a3748d65a..c189270c37 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, ExecutionStatus, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 1bcfa0668b..0af67f56fa 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, ExecutionStatus, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index e59b9de775..a62c4126b7 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -7,7 +7,7 @@ import { ExecutionStateMap, ExecutionStatus, StaticCallExecutionState, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index 4607d56447..be6c39436f 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -5,7 +5,7 @@ import { CallExecutionState, DeploymentExecutionState, ExecutionStatus, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index af1807796a..4240daacae 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, ExecutionStatus, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index c0399f6e46..7921a4cced 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, ExecutionStatus, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index d25544338e..03ca38b8a1 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -5,7 +5,7 @@ import { DeploymentExecutionState, ExecutionStatus, StaticCallExecutionState, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index e0ec8bf2c5..94c6668dfe 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -5,7 +5,7 @@ import { DeploymentExecutionState, ExecutionStatus, ReadEventArgumentExecutionState, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index c09c06c805..07daa7870e 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../../src/new-api/define-module"; import { ExecutionStatus, SendDataExecutionState, -} from "../../../../src/new-api/types/execution-state"; +} from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index 5f5ff91776..6df058e892 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; import { Reconcilier } from "../../../src/new-api/internal/reconciliation/reconcilier"; import { ReconciliationResult } from "../../../src/new-api/internal/reconciliation/types"; -import { ExecutionStateMap } from "../../../src/new-api/types/execution-state"; +import { ExecutionStateMap } from "../../../src/new-api/internal/types/execution-state"; import { IgnitionModuleResult, ModuleParameters, diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index c5825548f6..44fbe6cb1d 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -4,7 +4,7 @@ import { defineModule } from "../../../src/new-api/define-module"; import { DeploymentExecutionState, ExecutionStatus, -} from "../../../src/new-api/types/execution-state"; +} from "../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "./helpers"; From ddfa816362e83ea11d17750c3cd81316960e5171 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:30:08 +0100 Subject: [PATCH 0437/1302] refactor: explicit lodash function importing --- .../new-api/internal/reconciliation/reconcileDependencyRules.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts index 1e0a1b2dc5..5eb2e4e70b 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -1,4 +1,4 @@ -import { difference } from "lodash"; +import difference from "lodash/difference"; import { Future } from "../../types/module"; import { From 2a9675b71a14b3a1fd0f496e78f0d6b7014d104b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:40:59 +0100 Subject: [PATCH 0438/1302] Update packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts Co-authored-by: Patricio Palladino --- .../new-api/internal/reconciliation/reconcileDependencyRules.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts index 5eb2e4e70b..645abf3be3 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -30,6 +30,7 @@ export function reconcileDependencyRules( ); } + // TODO: Check that is was successfully executed before `executionState` was created. if (additionalExecutionState.status === ExecutionStatus.SUCCESS) { continue; } From 952a3c85b9e753057609d121963f763ad0b49694 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:42:20 +0100 Subject: [PATCH 0439/1302] Update packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts Co-authored-by: Patricio Palladino --- .../new-api/internal/reconciliation/reconcileDependencyRules.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts index 645abf3be3..68a65ca50a 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -37,7 +37,7 @@ export function reconcileDependencyRules( return fail( future, - `A dependency from ${future.id} to the already started future ${additionalDep} has been added` + `A dependency from ${future.id} to ${additionalDep} has been added, and both futures had already started executing, so this change is incompatible` ); } From 608edeb2526154e2c0a8404dc5fc1d696ccf1ffb Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:43:04 +0100 Subject: [PATCH 0440/1302] Update packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts Co-authored-by: Patricio Palladino --- .../new-api/internal/reconciliation/reconcileDependencyRules.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts index 68a65ca50a..4e6f5acc6b 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts @@ -26,7 +26,7 @@ export function reconcileDependencyRules( if (additionalExecutionState === undefined) { return fail( future, - `A dependency from ${future.id} to the a new future ${additionalDep} has been added` + `A dependency from ${future.id} to ${additionalDep} has been added. The former has started executing before the latter started executing, so this change is incompatible.` ); } From 9db2b84d9d3932d104c40a84865264fc1c6ca93f Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 12:45:07 +0100 Subject: [PATCH 0441/1302] tests: fix tests after error message changes --- packages/core/test/new-api/reconciliation/reconciler.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 44fbe6cb1d..4ef7c13b56 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -207,7 +207,7 @@ describe("Reconciliation", () => { { futureId: "Module:Contract2", failure: - "A dependency from Module:Contract2 to the already started future Module:Contract1 has been added", + "A dependency from Module:Contract2 to Module:Contract1 has been added, and both futures had already started executing, so this change is incompatible", }, ]); }); @@ -236,7 +236,7 @@ describe("Reconciliation", () => { { futureId: "Module:Contract2", failure: - "A dependency from Module:Contract2 to the a new future Module:ContractNew has been added", + "A dependency from Module:Contract2 to Module:ContractNew has been added. The former has started executing before the latter started executing, so this change is incompatible.", }, ]); }); From 20e8a8dc55ff309c40b09097336187137627c995 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 14:41:06 +0100 Subject: [PATCH 0442/1302] refactor: rename more generate static call address resolution --- .../internal/reconciliation/execution-state-resolver.ts | 2 +- .../reconciliation/futures/reconcileArtifactContractAt.ts | 6 ++++-- .../reconciliation/futures/reconcileNamedContractAt.ts | 6 ++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 5c63f1922e..8169d5d372 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -61,7 +61,7 @@ export class ExecutionStateResolver { return contractAddress; } - public static resolveStaticCallToAddress( + public static resolveToAddress( address: | string | AddressResolvableFuture diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts index fef55f1c3c..64bf5a6ad9 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -18,8 +18,10 @@ export function reconcileArtifactContractAt( ); } - const resolvedAddress: string = - ExecutionStateResolver.resolveStaticCallToAddress(future.address, context); + const resolvedAddress: string = ExecutionStateResolver.resolveToAddress( + future.address, + context + ); if (!isEqual(resolvedAddress, executionState.address)) { return fail( diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts index af4fd8ba48..8769130002 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -18,8 +18,10 @@ export function reconcileNamedContractAt( ); } - const resolvedAddress: string = - ExecutionStateResolver.resolveStaticCallToAddress(future.address, context); + const resolvedAddress: string = ExecutionStateResolver.resolveToAddress( + future.address, + context + ); if (!isEqual(resolvedAddress, executionState.address)) { return fail( From 95bb201cbac6a8df6a8fb218495519eb5200848a Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 14:45:33 +0100 Subject: [PATCH 0443/1302] test: fix spelling mistake --- packages/core/test/new-api/reconciliation/reconciler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 4ef7c13b56..8864fbaf20 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -53,7 +53,7 @@ describe("Reconciliation", () => { assert.deepStrictEqual( reconiliationResult.missingExecutedFutures, ["Module1:ContractMissed"], - "Exected one missing previous executed future" + "Expected one missing previous executed future" ); }); From a10431eaee13beab9b7d1ca8ba13aac35c3ccea9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 15:07:19 +0100 Subject: [PATCH 0444/1302] fix: check correct address in resolution --- .../src/new-api/internal/reconciliation/utils.ts | 2 +- .../reconcileArtifactContractDeployment.ts | 13 +++++++++---- .../reconcileArtifactLibraryDeployment.ts | 13 +++++++++---- .../futures/reconcileNamedContractCall.ts | 13 +++++++++---- .../futures/reconcileNamedContractDeployment.ts | 13 +++++++++---- .../futures/reconcileNamedLibraryDeployment.ts | 13 +++++++++---- .../futures/reconcileNamedStaticCall.ts | 16 ++++++++++++---- .../reconciliation/futures/reconcileSendData.ts | 6 +++--- .../core/test/new-api/reconciliation/helpers.ts | 3 +++ 9 files changed, 64 insertions(+), 28 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 579896e3a9..04bf2ee6cb 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -27,7 +27,7 @@ export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, context: ReconciliationContext ): string | undefined { - if (from === undefined || typeof from === "string") { + if (from === undefined) { return from; } diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index c189270c37..7eebec3064 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -6,7 +6,12 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - artifact contract", () => { const fakeArtifact = ["Fake artifact"] as any; @@ -197,7 +202,7 @@ describe("Reconciliation - artifact contract", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { id: "Example", - from: "0x222", + from: twoAddress, }); return { contract1 }; @@ -208,14 +213,14 @@ describe("Reconciliation - artifact contract", () => { ...exampleDeploymentState, futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Example", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 0af67f56fa..76f18d821f 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -6,7 +6,12 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - artifact library", () => { const fakeArtifact = ["Fake artifact"] as any; @@ -135,7 +140,7 @@ describe("Reconciliation - artifact library", () => { const moduleDefinition = defineModule("Module", (m) => { const library1 = m.libraryFromArtifact("Library1", fakeArtifact, { id: "Example", - from: "0x222", + from: twoAddress, }); return { contract1: library1 }; @@ -147,14 +152,14 @@ describe("Reconciliation - artifact library", () => { futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library1", - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Example", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index be6c39436f..c60b0f2295 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -7,7 +7,12 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - named contract call", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; @@ -204,7 +209,7 @@ describe("Reconciliation - named contract call", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contract("Contract1"); - m.call(contract1, "function1", [], { id: "config", from: "0x222" }); + m.call(contract1, "function1", [], { id: "config", from: twoAddress }); return { contract1 }; }); @@ -219,14 +224,14 @@ describe("Reconciliation - named contract call", () => { futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Contract1#config", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 4240daacae..50b1f4a2ed 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -6,7 +6,12 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - named contract", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; @@ -181,7 +186,7 @@ describe("Reconciliation - named contract", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contract("Contract", [], { id: "Example", - from: "0x222", + from: twoAddress, }); return { contract1 }; @@ -192,14 +197,14 @@ describe("Reconciliation - named contract", () => { ...exampleDeploymentState, status: ExecutionStatus.STARTED, contractName: "Contract", - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Example", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 7921a4cced..55f3b3dc2d 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -6,7 +6,12 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - named library", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; @@ -129,7 +134,7 @@ describe("Reconciliation - named library", () => { it("should find changes to from unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { - const library = m.library("Library", { id: "Library", from: "0x222" }); + const library = m.library("Library", { id: "Library", from: twoAddress }); return { library }; }); @@ -140,14 +145,14 @@ describe("Reconciliation - named library", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library", - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Library", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 03ca38b8a1..c9314cc8b1 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -7,7 +7,12 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { assertSuccessReconciliation, reconcile } from "../helpers"; +import { + assertSuccessReconciliation, + oneAddress, + reconcile, + twoAddress, +} from "../helpers"; describe("Reconciliation - named static call", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; @@ -176,7 +181,10 @@ describe("Reconciliation - named static call", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contract("Contract1"); - m.staticCall(contract1, "function1", [], { id: "config", from: "0x222" }); + m.staticCall(contract1, "function1", [], { + id: "config", + from: twoAddress, + }); return { contract1 }; }); @@ -193,14 +201,14 @@ describe("Reconciliation - named static call", () => { status: ExecutionStatus.STARTED, contractAddress: exampleAddress, functionName: "function1", - from: "0x111", + from: oneAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:Contract1#config", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index 07daa7870e..b8312889a6 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -119,7 +119,7 @@ describe("Reconciliation - send data", () => { it("should find changes to from unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { m.send("test_send", exampleAddress, 0n, "example_data", { - from: "0x222", + from: differentAddress, }); return {}; @@ -129,14 +129,14 @@ describe("Reconciliation - send data", () => { "Module:test_send": { ...exampleSendState, status: ExecutionStatus.STARTED, - from: "0x111", + from: exampleAddress, }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { futureId: "Module:test_send", - failure: "From account has been changed from 0x111 to 0x222", + failure: `From account has been changed from ${exampleAddress} to ${differentAddress}`, }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index 6df058e892..b9222d74d9 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -10,6 +10,9 @@ import { } from "../../../src/new-api/types/module"; import { IgnitionModuleDefinition } from "../../../src/new-api/types/module-builder"; +export const oneAddress = "0x1111111111111111111111111111111111111111"; +export const twoAddress = "0x2222222222222222222222222222222222222222"; + export function reconcile( moduleDefinition: IgnitionModuleDefinition< string, From 7ad377b543a31d219f429ae185daa8c975720248 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 15:27:11 +0100 Subject: [PATCH 0445/1302] refactor: rename file to reconciler --- packages/core/src/new-api/deployer.ts | 4 ++-- .../internal/reconciliation/{reconcilier.ts => reconciler.ts} | 2 +- packages/core/test/new-api/reconciliation/helpers.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename packages/core/src/new-api/internal/reconciliation/{reconcilier.ts => reconciler.ts} (99%) diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 9b37285503..8758c394a8 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -4,7 +4,7 @@ import type { IgnitionModuleDefinition } from "./types/module-builder"; import { Batcher } from "./internal/batcher"; import { ExecutionEngine } from "./internal/execution-engine"; import { ModuleConstructor } from "./internal/module-builder"; -import { Reconcilier } from "./internal/reconciliation/reconcilier"; +import { Reconciler } from "./internal/reconciliation/reconciler"; import { ExecutionStateMap } from "./internal/types/execution-state"; export class Deployer { @@ -29,7 +29,7 @@ export class Deployer { const previousStateMap = await this._loadExecutionStateFromJournal(); - const reconciliationResult = Reconcilier.reconcile( + const reconciliationResult = Reconciler.reconcile( module, previousStateMap, moduleParameters, diff --git a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts similarity index 99% rename from packages/core/src/new-api/internal/reconciliation/reconcilier.ts rename to packages/core/src/new-api/internal/reconciliation/reconciler.ts index eb5170f506..d9814c8bf7 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcilier.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -16,7 +16,7 @@ import { ReconciliationResult, } from "./types"; -export class Reconcilier { +export class Reconciler { public static reconcile( module: IgnitionModule, executionStateMap: ExecutionStateMap, diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index b9222d74d9..f7756c2e40 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -1,7 +1,7 @@ import { assert } from "chai"; import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; -import { Reconcilier } from "../../../src/new-api/internal/reconciliation/reconcilier"; +import { Reconciler } from "../../../src/new-api/internal/reconciliation/reconciler"; import { ReconciliationResult } from "../../../src/new-api/internal/reconciliation/types"; import { ExecutionStateMap } from "../../../src/new-api/internal/types/execution-state"; import { @@ -42,7 +42,7 @@ export function reconcile( ]) ); - const reconiliationResult = Reconcilier.reconcile( + const reconiliationResult = Reconciler.reconcile( module, updatedExecutionStateMap, moduleParameters, From af0bf79652445ccae2afd798259fce601cf36b26 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 14 Jun 2023 17:54:04 +0100 Subject: [PATCH 0446/1302] refactor: change reconcile to take moduleId to parameters map --- packages/core/src/new-api/deployer.ts | 4 ++-- packages/core/src/new-api/internal/module-builder.ts | 1 + packages/core/src/new-api/internal/module.ts | 1 + .../src/new-api/internal/reconciliation/reconciler.ts | 5 ++--- .../core/src/new-api/internal/reconciliation/types.ts | 2 +- .../core/src/new-api/internal/reconciliation/utils.ts | 10 ++++++++-- .../core/src/new-api/stored-deployment-serializer.ts | 7 ++----- packages/core/src/new-api/types/module.ts | 1 + .../core/src/new-api/types/serialized-deployment.ts | 1 + packages/core/test/new-api/reconciliation/helpers.ts | 2 +- 10 files changed, 20 insertions(+), 14 deletions(-) diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 8758c394a8..c564c6d12e 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -22,7 +22,7 @@ export class Deployer { string, IgnitionModuleResult >, - moduleParameters: ModuleParameters, + deploymentParameters: { [key: string]: ModuleParameters }, accounts: string[] ) { const module = this._moduleConstructor.construct(moduleDefinition); @@ -32,7 +32,7 @@ export class Deployer { const reconciliationResult = Reconciler.reconcile( module, previousStateMap, - moduleParameters, + deploymentParameters, accounts ); diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index f6f10638ff..0b8e9af61e 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -147,6 +147,7 @@ export class IgnitionModuleBuilderImplementation< defaultValue?: ParamTypeT ): ModuleParameterRuntimeValue { return new ModuleParameterRuntimeValueImplementation( + this._module.id, parameterName, defaultValue ); diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index fc7fc44dca..3f577dba40 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -290,6 +290,7 @@ export class ModuleParameterRuntimeValueImplementation< public readonly type = RuntimeValueType.MODULE_PARAMETER; constructor( + public readonly moduleId: string, public readonly name: string, public readonly defaultValue: ParamTypeT | undefined ) {} diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index d9814c8bf7..3a55043a9b 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -20,12 +20,12 @@ export class Reconciler { public static reconcile( module: IgnitionModule, executionStateMap: ExecutionStateMap, - moduleParameters: ModuleParameters, + deploymentParameters: { [key: string]: ModuleParameters }, accounts: string[] ): ReconciliationResult { const reconciliationFailures = this._reconcileEachFutureInModule( module, - { executionStateMap, moduleParameters, accounts }, + { executionStateMap, deploymentParameters, accounts }, [ reconcileCurrentAndPreviousTypeMatch, reconcileDependencyRules, @@ -43,7 +43,6 @@ export class Reconciler { private static _reconcileEachFutureInModule( module: IgnitionModule, - context: ReconciliationContext, checks: ReconciliationCheck[] ): ReconciliationFailure[] { diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index db1b922575..ff09360c43 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -26,7 +26,7 @@ export interface ReconciliationResult { export interface ReconciliationContext { executionStateMap: ExecutionStateMap; - moduleParameters: ModuleParameters; + deploymentParameters: { [key: string]: ModuleParameters }; accounts: string[]; } diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 04bf2ee6cb..606ee259cc 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -58,8 +58,14 @@ export function resolveModuleParameter( moduleParamRuntimeValue: ModuleParameterRuntimeValue, context: ReconciliationContext ) { - const moduleParamValue = - context.moduleParameters[moduleParamRuntimeValue.name]; + const moduleParameters = + context.deploymentParameters[moduleParamRuntimeValue.moduleId]; + + if (moduleParameters === undefined) { + return moduleParamRuntimeValue.defaultValue; + } + + const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; if (moduleParamValue === undefined) { return moduleParamRuntimeValue.defaultValue; diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 358cb1127c..5f94bce5de 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -300,11 +300,6 @@ export class StoredDeploymentSerializer { }; return serializedSendDataFuture; } - - throw new IgnitionError( - // @ts-ignore At compile type this should be impossible - `Unknown future type while serializing: ${FutureType[future.type]}` - ); } private static _convertLibrariesToLibraryTokens( @@ -363,6 +358,7 @@ export class StoredDeploymentSerializer { ): SerializedModuleParameterRuntimeValue { return { _kind: "ModuleParameterRuntimeValue", + moduleId: arg.moduleId, name: arg.name, defaultValue: arg.defaultValue === undefined @@ -870,6 +866,7 @@ export class StoredDeploymentDeserializer { } return new ModuleParameterRuntimeValueImplementation( + serialized.moduleId, serialized.name, defaultValue ); diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index c961f14a9e..a63b58d75b 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -340,6 +340,7 @@ export interface ModuleParameterRuntimeValue< ParamTypeT extends ModuleParameterType > { type: RuntimeValueType.MODULE_PARAMETER; + moduleId: string; name: string; defaultValue: ParamTypeT | undefined; } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index 8d1b243cf7..bc33432349 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -232,6 +232,7 @@ export interface SerializedAccountRuntimeValue { */ export interface SerializedModuleParameterRuntimeValue { _kind: "ModuleParameterRuntimeValue"; + moduleId: string; name: string; defaultValue: string | undefined; } diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index f7756c2e40..bc7d699017 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -20,7 +20,7 @@ export function reconcile( IgnitionModuleResult >, executionStateMap: ExecutionStateMap, - moduleParameters: ModuleParameters = {} + moduleParameters: { [key: string]: ModuleParameters } = {} ): ReconciliationResult { const accounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", From 88d9c7773954d0ffb06afe2f0bcc3a7a865928bf Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 15 Jun 2023 11:29:14 +0100 Subject: [PATCH 0447/1302] fix: recursive argument resolution --- packages/core/src/new-api/internal/module.ts | 12 +- .../execution-state-resolver.ts | 50 ++- .../reconcileArtifactContractDeployment.ts | 6 +- .../futures/reconcileNamedContractCall.ts | 6 +- .../reconcileNamedContractDeployment.ts | 6 +- .../futures/reconcileNamedStaticCall.ts | 6 +- .../internal/utils/replace-within-arg.ts | 63 ++++ .../new-api/stored-deployment-serializer.ts | 72 ++-- .../reconcileArtifactContractDeployment.ts | 19 +- .../futures/reconcileNamedContractCall.ts | 6 +- .../reconcileNamedContractDeployment.ts | 48 ++- .../futures/reconcileNamedStaticCall.ts | 6 +- .../core/test/new-api/utils/arg-resolution.ts | 310 ++++++++++++++++++ 13 files changed, 531 insertions(+), 79 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/replace-within-arg.ts create mode 100644 packages/core/test/new-api/utils/arg-resolution.ts diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 3f577dba40..6563270f1b 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -36,8 +36,7 @@ abstract class BaseFutureImplementation { public [customInspectSymbol]( _depth: number, - _inspectOptions: {}, - inspect: (arg: {}) => string + { inspect }: { inspect: (arg: {}) => string } ) { const padding = " ".repeat(2); @@ -251,8 +250,7 @@ export class IgnitionModuleImplementation< public [customInspectSymbol]( _depth: number, - _inspectOptions: {}, - inspect: (arg: {}) => string + { inspect }: { inspect: (arg: {}) => string } ) { const padding = " ".repeat(2); @@ -274,8 +272,7 @@ export class AccountRuntimeValueImplementation implements AccountRuntimeValue { public [customInspectSymbol]( _depth: number, - _inspectOptions: {}, - _inspect: (arg: {}) => string + _inspectOptions: { inspect: (arg: {}) => string } ) { return `Account RuntimeValue { accountIndex: ${this.accountIndex} @@ -297,8 +294,7 @@ export class ModuleParameterRuntimeValueImplementation< public [customInspectSymbol]( _depth: number, - _inspectOptions: {}, - inspect: (arg: {}) => string + { inspect }: { inspect: (arg: {}) => string } ) { return `Module Parameter RuntimeValue { name: ${this.name}${ diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 8169d5d372..f1745e1ee6 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -1,7 +1,8 @@ import { IgnitionError } from "../../../errors"; -import { isRuntimeValue } from "../../type-guards"; +import { isContractFuture, isRuntimeValue } from "../../type-guards"; import { AddressResolvableFuture, + ArgumentType, ContractFuture, Future, ModuleParameterRuntimeValue, @@ -14,12 +15,59 @@ import { StaticCallExecutionState, } from "../types/execution-state"; import { isAddress } from "../utils"; +import { replaceWithinArg } from "../utils/replace-within-arg"; import { ReconciliationContext } from "./types"; import { resolveModuleParameter, safeToString } from "./utils"; // TODO: consider merging this into the execution state map export class ExecutionStateResolver { + public static resolveArgsFromExectuionState( + constructorArgs: ArgumentType[], + context: ReconciliationContext + ): ArgumentType[] { + return replaceWithinArg(constructorArgs, { + bigint: (bi) => bi.toString(), + future: (f) => { + if (!isContractFuture(f)) { + throw new IgnitionError( + `Cannot replace future in args, for non-deployable futures ${f.id}` + ); + } + + return ExecutionStateResolver.resolveContractToAddress(f, context); + }, + accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], + moduleParameterRuntimeValue: (mprv) => { + const moduleParameters = context.deploymentParameters[mprv.moduleId]; + + if (moduleParameters === undefined) { + if (mprv.defaultValue === undefined) { + throw new IgnitionError( + `No default value provided for module parameter ${mprv.moduleId}/${mprv.name}` + ); + } + + return mprv.defaultValue; + } + + const parameter = moduleParameters[mprv.name]; + + if (parameter === undefined) { + if (mprv.defaultValue === undefined) { + throw new IgnitionError( + `No default value provided for module parameter ${mprv.moduleId}/${mprv.name}` + ); + } + + return mprv.defaultValue; + } + + return parameter; + }, + }) as ArgumentType[]; + } + // Library addresses are resolved from previous execution states public static resolveLibrariesFromExecutionState( libraries: Record>, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index a471d02922..a4e56ac6b4 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -18,7 +18,11 @@ export function reconcileArtifactContractDeployment( ); } - if (!isEqual(future.constructorArgs, executionState.constructorArgs)) { + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( + future.constructorArgs, + context + ); + if (!isEqual(resolvedArgs, executionState.constructorArgs)) { return fail(future, "Constructor args have been changed"); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 0baeda98e2..94944b2415 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -28,7 +28,11 @@ export function reconcileNamedContractCall( ); } - if (!isEqual(future.args, executionState.args)) { + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( + future.args, + context + ); + if (!isEqual(resolvedArgs, executionState.args)) { return fail(future, "Function args have been changed"); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index a376e202c5..4bd6e350ca 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -18,7 +18,11 @@ export function reconcileNamedContractDeployment( ); } - if (!isEqual(future.constructorArgs, executionState.constructorArgs)) { + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( + future.constructorArgs, + context + ); + if (!isEqual(resolvedArgs, executionState.constructorArgs)) { return fail(future, "Constructor args have been changed"); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index cbe6ec27f2..496316bdd7 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -28,7 +28,11 @@ export function reconcileNamedStaticCall( ); } - if (!isEqual(future.args, executionState.args)) { + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( + future.args, + context + ); + if (!isEqual(resolvedArgs, executionState.args)) { return fail(future, "Function args have been changed"); } diff --git a/packages/core/src/new-api/internal/utils/replace-within-arg.ts b/packages/core/src/new-api/internal/utils/replace-within-arg.ts new file mode 100644 index 0000000000..ab03421732 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/replace-within-arg.ts @@ -0,0 +1,63 @@ +import { isFuture, isRuntimeValue } from "../../type-guards"; +import { + AccountRuntimeValue, + ArgumentType, + Future, + ModuleParameterRuntimeValue, + ModuleParameterType, + RuntimeValueType, +} from "../../types/module"; + +type Composable = + | T + | Array> + | { [field: string]: Composable }; + +interface Replacers { + accountRuntimeValue: (arg: AccountRuntimeValue) => Composable; + moduleParameterRuntimeValue: ( + arg: ModuleParameterRuntimeValue + ) => Composable; + bigint: (arg: bigint) => Composable; + future: (arg: Future) => Composable; +} + +/** + * Replace runtime values in an argument. + * + * @param arg - the argument to be replaced + * @param replacers - substituters for each special value found in the args + * @returns the args with any special subvalue replaced + */ +export function replaceWithinArg( + arg: ArgumentType, + replacers: Replacers +): Composable { + if (typeof arg === "bigint") { + return replacers.bigint(arg); + } + + if (isFuture(arg)) { + return replacers.future(arg); + } + + if (isRuntimeValue(arg)) { + if (arg.type === RuntimeValueType.ACCOUNT) { + return replacers.accountRuntimeValue(arg); + } + + return replacers.moduleParameterRuntimeValue(arg); + } + + if (Array.isArray(arg)) { + return arg.map((a) => replaceWithinArg(a, replacers)); + } + + if (typeof arg === "object" && arg !== null) { + return Object.fromEntries( + Object.entries(arg).map(([k, v]) => [k, replaceWithinArg(v, replacers)]) + ); + } + + return arg as any; +} diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 5f94bce5de..a06bb186b8 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -19,6 +19,7 @@ import { Graph, getNodesInTopologicalOrder, } from "./internal/topological-order"; +import { replaceWithinArg } from "./internal/utils/replace-within-arg"; import { isAddressResolvableFuture, isContractFuture, @@ -36,7 +37,6 @@ import { IgnitionModuleResult, ModuleParameterRuntimeValue, ModuleParameterType, - RuntimeValue, RuntimeValueType, } from "./types/module"; import { @@ -57,13 +57,16 @@ import { SerializedNamedLibraryDeploymentFuture, SerializedNamedStaticCallFuture, SerializedReadEventArgumentFuture, - SerializedRuntimeValue, SerializedSendDataFuture, SerializedStoredDeployment, SerializedStoredModule, StoredDeployment, } from "./types/serialized-deployment"; +interface SerializeContext { + argReplacer: (arg: ArgumentType) => SerializedArgumentType; +} + /** * Serialize a deployment. * @@ -73,6 +76,15 @@ export class StoredDeploymentSerializer { public static serialize( deployment: StoredDeployment ): SerializedStoredDeployment { + const argReplacer = (arg: ArgumentType) => + replaceWithinArg(arg, { + accountRuntimeValue: this._serializeAccountRuntimeValue, + moduleParameterRuntimeValue: (mprv) => + this._serializeModuleParamterRuntimeValue(mprv), + bigint: this._serializeBigint, + future: this._convertFutureToFutureToken, + }); + const allModules = this._getModulesAndSubmoduleFor(deployment.module); return { @@ -81,18 +93,19 @@ export class StoredDeploymentSerializer { }, startModule: deployment.module.id, modules: Object.fromEntries( - allModules.map((m) => [m.id, this._serializeModule(m)]) + allModules.map((m) => [m.id, this._serializeModule(m, { argReplacer })]) ), }; } private static _serializeModule( - userModule: IgnitionModule> + userModule: IgnitionModule>, + context: SerializeContext ): SerializedStoredModule { return { id: userModule.id, futures: Array.from(userModule.futures).map((future) => - this._serializeFuture(future) + this._serializeFuture(future, context) ), submodules: Array.from(userModule.submodules).map( this._convertModuleToModuleToken @@ -104,7 +117,10 @@ export class StoredDeploymentSerializer { }; } - private static _serializeFuture(future: Future): SerializedFuture { + private static _serializeFuture( + future: Future, + context: SerializeContext + ): SerializedFuture { switch (future.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: const serializedNamedContractDeploymentFuture: SerializedNamedContractDeploymentFuture = @@ -117,7 +133,7 @@ export class StoredDeploymentSerializer { ), contractName: future.contractName, constructorArgs: future.constructorArgs.map((arg) => - this._serializeArgument(arg) + context.argReplacer(arg) ), from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) @@ -139,7 +155,7 @@ export class StoredDeploymentSerializer { contractName: future.contractName, artifact: future.artifact, constructorArgs: future.constructorArgs.map((arg) => - this._serializeArgument(arg) + context.argReplacer(arg) ), from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) @@ -195,7 +211,7 @@ export class StoredDeploymentSerializer { ), contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, - args: future.args.map((arg) => this._serializeArgument(arg)), + args: future.args.map((arg) => context.argReplacer(arg)), value: this._serializeBigint(future.value), from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) @@ -214,7 +230,7 @@ export class StoredDeploymentSerializer { ), contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, - args: future.args.map((arg) => this._serializeArgument(arg)), + args: future.args.map((arg) => context.argReplacer(arg)), from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) : future.from, @@ -311,42 +327,6 @@ export class StoredDeploymentSerializer { ]); } - private static _serializeArgument(arg: ArgumentType): SerializedArgumentType { - if (typeof arg === "bigint") { - return this._serializeBigint(arg); - } - - if (isFuture(arg)) { - return this._convertFutureToFutureToken(arg); - } - - if (isRuntimeValue(arg)) { - return this._serializeRuntimeValue(arg); - } - - if (Array.isArray(arg)) { - return arg.map((a) => this._serializeArgument(a)); - } - - if (typeof arg === "object" && arg !== null) { - return Object.fromEntries( - Object.entries(arg).map(([k, v]) => [k, this._serializeArgument(v)]) - ); - } - - return arg; - } - - private static _serializeRuntimeValue( - arg: RuntimeValue - ): SerializedRuntimeValue { - if (arg.type === RuntimeValueType.ACCOUNT) { - return this._serializeAccountRuntimeValue(arg); - } - - return this._serializeModuleParamterRuntimeValue(arg); - } - private static _serializeAccountRuntimeValue( arg: AccountRuntimeValue ): SerializedAccountRuntimeValue { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index 7eebec3064..e5f3ad5fcf 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -36,12 +36,13 @@ describe("Reconciliation - artifact contract", () => { it("should reconcile unchanged", () => { const submoduleDefinition = defineModule("Submodule", (m) => { + const supply = m.getParameter("supply", BigInt(1000)); const safeMath = m.library("SafeMath"); const contract1 = m.contractFromArtifact( "Contract1", fakeArtifact, - ["unchanged"], + [{ supply }], { libraries: { SafeMath: safeMath, @@ -70,7 +71,7 @@ describe("Reconciliation - artifact contract", () => { ...exampleDeploymentState, futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - constructorArgs: ["unchanged"], + constructorArgs: [{ supply: BigInt(1000) }], libraries: { SafeMath: exampleAddress, }, @@ -110,8 +111,14 @@ describe("Reconciliation - artifact contract", () => { it("should find changes to constructors unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { + const owner = m.getAccount(3); + const supply = m.getParameter("supply", BigInt(500)); + const ticker = m.getParameter("ticker", "CodeCoin"); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - "changed", + owner, + { nested: { supply } }, + [1, ticker, 3], ]); return { contract1 }; @@ -122,7 +129,11 @@ describe("Reconciliation - artifact contract", () => { ...exampleDeploymentState, futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - constructorArgs: ["unchanged"], + constructorArgs: [ + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + { nested: { supply: BigInt(500) } }, + [1, "NotCodeCoin", 3], + ], }, }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index c60b0f2295..c54932fb27 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -145,9 +145,11 @@ describe("Reconciliation - named contract call", () => { it("should find changes to function args unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { + const ticker = m.getParameter("ticker", "CHANGED"); + const contract1 = m.contract("Contract1"); - m.call(contract1, "function1", ["changed"], {}); + m.call(contract1, "function1", [[ticker]], {}); return { contract1 }; }); @@ -162,7 +164,7 @@ describe("Reconciliation - named contract call", () => { futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", - args: ["unchanged"], + args: [["UNCHANGED"]], }, }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 50b1f4a2ed..559b04fd70 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -34,13 +34,21 @@ describe("Reconciliation - named contract", () => { it("should reconcile unchanged", () => { const submoduleDefinition = defineModule("Submodule", (m) => { + const owner = m.getAccount(3); + const supply = m.getParameter("supply", BigInt(500)); + const ticker = m.getParameter("ticker", "CodeCoin"); + const safeMath = m.library("SafeMath"); - const contract1 = m.contract("Contract1", ["unchanged"], { - libraries: { - SafeMath: safeMath, - }, - }); + const contract1 = m.contract( + "Contract1", + [owner, { nested: { supply } }, [1, ticker, 3]], + { + libraries: { + SafeMath: safeMath, + }, + } + ); return { contract1 }; }); @@ -62,7 +70,11 @@ describe("Reconciliation - named contract", () => { "Submodule:Contract1": { ...exampleDeploymentState, status: ExecutionStatus.STARTED, - constructorArgs: ["unchanged"], + constructorArgs: [ + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + { nested: { supply: BigInt(500) } }, + [1, "CodeCoin", 3], + ], libraries: { SafeMath: exampleAddress, }, @@ -96,25 +108,37 @@ describe("Reconciliation - named contract", () => { ]); }); - it("should find changes to constructors unreconciliable", () => { + it("should find changes to constructor args unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { - const contract1 = m.contract("Contract1", ["changed"]); + const owner = m.getAccount(3); + const supply = m.getParameter("supply", BigInt(500)); + const ticker = m.getParameter("ticker", "CodeCoin"); + + const contract1 = m.contract( + "ContractChanged", + [owner, { nested: { supply } }, [1, ticker, 3]], + { + id: "Example", + } + ); return { contract1 }; }); const reconiliationResult = reconcile(moduleDefinition, { - "Module:Contract1": { + "Module:Example": { ...exampleDeploymentState, status: ExecutionStatus.STARTED, - constructorArgs: ["unchanged"], + contractName: "ContractUnchanged", + constructorArgs: [1, 2, 3], }, }); assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1", - failure: "Constructor args have been changed", + futureId: "Module:Example", + failure: + "Contract name has been changed from ContractUnchanged to ContractChanged", }, ]); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index c9314cc8b1..de9d2b378a 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -146,9 +146,11 @@ describe("Reconciliation - named static call", () => { it("should find changes to function args unreconciliable", () => { const moduleDefinition = defineModule("Module", (m) => { + const ticker = m.getParameter("ticker", "CHANGED"); + const contract1 = m.contract("Contract1"); - m.staticCall(contract1, "function1", ["changed"], {}); + m.staticCall(contract1, "function1", [{ ticker }], {}); return { contract1 }; }); @@ -165,7 +167,7 @@ describe("Reconciliation - named static call", () => { status: ExecutionStatus.STARTED, contractAddress: exampleAddress, functionName: "function1", - args: ["unchanged"], + args: [{ ticker: "UNCHANGED" }], }, }); diff --git a/packages/core/test/new-api/utils/arg-resolution.ts b/packages/core/test/new-api/utils/arg-resolution.ts new file mode 100644 index 0000000000..904fa94ca1 --- /dev/null +++ b/packages/core/test/new-api/utils/arg-resolution.ts @@ -0,0 +1,310 @@ +import { assert } from "chai"; + +import { ArgumentType, ModuleParameterType } from "../../../src"; +import { + AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, + NamedContractAtFutureImplementation, +} from "../../../src/new-api/internal/module"; +import { replaceWithinArg } from "../../../src/new-api/internal/utils/replace-within-arg"; + +describe("Arg resolution", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + let resolve: (arg: ArgumentType) => ModuleParameterType; + + beforeEach(() => { + resolve = (arg: ArgumentType) => + replaceWithinArg(arg, { + accountRuntimeValue: (arv) => ({ + _kind: "AccountRuntimeValue", + accountIndex: arv.accountIndex, + }), + moduleParameterRuntimeValue: (mprv) => ({ + _kind: "ModuleParameterRuntimeValue", + moduleId: mprv.moduleId, + name: mprv.name, + defaultValue: mprv.defaultValue ?? "na", + }), + bigint: (bi) => `${bi.toString()}n`, + future: (f) => ({ _kind: "FutureToken", futureId: f.id }), + }); + }); + + it("should create a duplicate of value arg types", () => { + assertEqualBeforeAndAfterResolution(resolve, 1); + assertEqualBeforeAndAfterResolution(resolve, "abc"); + assertEqualBeforeAndAfterResolution(resolve, false); + assertEqualBeforeAndAfterResolution(resolve, [1, "abc", false]); + + assertEqualBeforeAndAfterResolution(resolve, { + num: 1, + string: "abc", + bool: true, + array: [1, "abc", false], + nested: { + bool: false, + string: "another", + }, + }); + }); + + describe("account runtime values", () => { + it("should substitue a singleton", () => { + const actual = resolve(new AccountRuntimeValueImplementation(3)); + + assert.deepStrictEqual(actual, { + _kind: "AccountRuntimeValue", + accountIndex: 3, + }); + }); + + it("should substitue in an array", () => { + const actual = resolve([ + 1, + new AccountRuntimeValueImplementation(2), + "c", + ]); + + assert.deepStrictEqual(actual, [ + 1, + { + _kind: "AccountRuntimeValue", + accountIndex: 2, + }, + "c", + ]); + }); + + it("should substitue in an object", () => { + const actual = resolve({ + num: 1, + account: new AccountRuntimeValueImplementation(2), + string: "c", + nested: { + subaccount: new AccountRuntimeValueImplementation(4), + }, + }); + + assert.deepStrictEqual(actual, { + num: 1, + account: { + _kind: "AccountRuntimeValue", + accountIndex: 2, + }, + string: "c", + nested: { + subaccount: { + _kind: "AccountRuntimeValue", + accountIndex: 4, + }, + }, + }); + }); + }); + + describe("module parameter runtime values", () => { + it("should substitue a singleton", () => { + const actual = resolve( + new ModuleParameterRuntimeValueImplementation( + "MyModule", + "supply", + BigInt(12) + ) + ); + + assert.deepStrictEqual(actual, { + _kind: "ModuleParameterRuntimeValue", + moduleId: "MyModule", + name: "supply", + defaultValue: BigInt(12), + }); + }); + + it("should substitue in an array", () => { + const actual = resolve([ + 1, + new ModuleParameterRuntimeValueImplementation( + "MyModule", + "supply", + BigInt(12) + ), + "c", + ]); + + assert.deepStrictEqual(actual, [ + 1, + { + _kind: "ModuleParameterRuntimeValue", + moduleId: "MyModule", + name: "supply", + defaultValue: BigInt(12), + }, + "c", + ]); + }); + + it("should substitue in an object", () => { + const actual = resolve({ + num: 1, + account: new ModuleParameterRuntimeValueImplementation( + "MyModule", + "supply", + BigInt(2) + ), + string: "c", + nested: { + subaccount: new ModuleParameterRuntimeValueImplementation( + "MyModule", + "ticker", + "CodeCoin" + ), + }, + }); + + assert.deepStrictEqual(actual, { + num: 1, + account: { + _kind: "ModuleParameterRuntimeValue", + moduleId: "MyModule", + name: "supply", + defaultValue: BigInt(2), + }, + string: "c", + nested: { + subaccount: { + _kind: "ModuleParameterRuntimeValue", + moduleId: "MyModule", + name: "ticker", + defaultValue: "CodeCoin", + }, + }, + }); + }); + }); + + describe("BigInt", () => { + it("should substitue a singleton", () => { + const actual = resolve(BigInt(12)); + + assert.deepStrictEqual(actual, "12n"); + }); + + it("should substitue in an array", () => { + const actual = resolve([1, BigInt(12), "c"]); + + assert.deepStrictEqual(actual, [1, "12n", "c"]); + }); + + it("should substitue in an object", () => { + const actual = resolve({ + num: 1, + bigint: BigInt(2), + string: "c", + nested: { + bigint: BigInt(4), + }, + }); + + assert.deepStrictEqual(actual, { + num: 1, + bigint: "2n", + string: "c", + nested: { + bigint: "4n", + }, + }); + }); + }); + + describe("future", () => { + it("should substitue a singleton", () => { + const actual = resolve( + new NamedContractAtFutureImplementation( + "MyModule:MyContract", + {} as any, + "MyContract", + exampleAddress + ) + ); + + assert.deepStrictEqual(actual, { + _kind: "FutureToken", + futureId: "MyModule:MyContract", + }); + }); + + it("should substitue in an array", () => { + const actual = resolve([ + 1, + new NamedContractAtFutureImplementation( + "MyModule:MyContract", + {} as any, + "MyContract", + exampleAddress + ), + "c", + ]); + + assert.deepStrictEqual(actual, [ + 1, + { + _kind: "FutureToken", + futureId: "MyModule:MyContract", + }, + "c", + ]); + }); + + it("should substitue in an object", () => { + const actual = resolve({ + num: 1, + future: new NamedContractAtFutureImplementation( + "MyModule:MyContract1", + {} as any, + "MyContract1", + exampleAddress + ), + string: "c", + nested: { + future: new NamedContractAtFutureImplementation( + "MyModule:MyContract2", + {} as any, + "MyContract2", + exampleAddress + ), + }, + }); + + assert.deepStrictEqual(actual, { + num: 1, + future: { + _kind: "FutureToken", + futureId: "MyModule:MyContract1", + }, + string: "c", + nested: { + future: { + _kind: "FutureToken", + futureId: "MyModule:MyContract2", + }, + }, + }); + }); + }); +}); + +function assertEqualBeforeAndAfterResolution( + resolve: (arg: ArgumentType) => ModuleParameterType, + arg: ArgumentType +) { + const before = arg; + + const after = resolve(before); + + assert.deepStrictEqual( + after, + before, + "After should be a structural clone of before" + ); +} From c6e7fd6da02cba5a8c5165253b09606125070320 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 15 Jun 2023 17:59:36 +0100 Subject: [PATCH 0448/1302] test: addition future based arg resolution tests --- .../reconciliation/futures/reconcileNamedContractCall.ts | 8 ++++---- .../futures/reconcileNamedContractDeployment.ts | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index c54932fb27..e646a039aa 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -32,7 +32,7 @@ describe("Reconciliation - named contract call", () => { constructorArgs: [], libraries: {}, from: undefined, - contractAddress: "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + contractAddress: differentAddress, }; const exampleContractCallState: CallExecutionState = { @@ -42,7 +42,7 @@ describe("Reconciliation - named contract call", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], - contractAddress: "0xBA12222222228d8Ba445958a75a0704d566BF2C8", + contractAddress: differentAddress, functionName: "function", args: [], value: BigInt("0"), @@ -53,7 +53,7 @@ describe("Reconciliation - named contract call", () => { const submoduleDefinition = defineModule("Submodule", (m) => { const contract1 = m.contract("Contract1"); - m.call(contract1, "function1", [1, "a"], {}); + m.call(contract1, "function1", [1, "a", contract1], {}); return { contract1 }; }); @@ -74,7 +74,7 @@ describe("Reconciliation - named contract call", () => { futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.SUCCESS, functionName: "function1", - args: [1, "a"], + args: [1, "a", differentAddress], }, }); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 559b04fd70..89efa5c2f1 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -42,7 +42,7 @@ describe("Reconciliation - named contract", () => { const contract1 = m.contract( "Contract1", - [owner, { nested: { supply } }, [1, ticker, 3]], + [owner, { nested: { supply } }, [1, ticker, 3], safeMath], { libraries: { SafeMath: safeMath, @@ -74,6 +74,7 @@ describe("Reconciliation - named contract", () => { "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", { nested: { supply: BigInt(500) } }, [1, "CodeCoin", 3], + exampleAddress, ], libraries: { SafeMath: exampleAddress, From 2beda8a07b74d84a10c56d88ba33b06f9c4a046c Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 15 Jun 2023 18:32:17 +0100 Subject: [PATCH 0449/1302] refactor: add assertions --- .../execution-state-resolver.ts | 28 ++----------------- .../new-api/internal/reconciliation/utils.ts | 28 +++++++++++++------ .../src/new-api/internal/utils/assertions.ts | 12 ++++++++ 3 files changed, 33 insertions(+), 35 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/assertions.ts diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index f1745e1ee6..06a31a0d91 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -31,7 +31,7 @@ export class ExecutionStateResolver { future: (f) => { if (!isContractFuture(f)) { throw new IgnitionError( - `Cannot replace future in args, for non-deployable futures ${f.id}` + `Only deployable contract and library futures can be used in args, ${f.id} is not a contract or library future` ); } @@ -39,31 +39,7 @@ export class ExecutionStateResolver { }, accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], moduleParameterRuntimeValue: (mprv) => { - const moduleParameters = context.deploymentParameters[mprv.moduleId]; - - if (moduleParameters === undefined) { - if (mprv.defaultValue === undefined) { - throw new IgnitionError( - `No default value provided for module parameter ${mprv.moduleId}/${mprv.name}` - ); - } - - return mprv.defaultValue; - } - - const parameter = moduleParameters[mprv.name]; - - if (parameter === undefined) { - if (mprv.defaultValue === undefined) { - throw new IgnitionError( - `No default value provided for module parameter ${mprv.moduleId}/${mprv.name}` - ); - } - - return mprv.defaultValue; - } - - return parameter; + return resolveModuleParameter(mprv, context); }, }) as ArgumentType[]; } diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 606ee259cc..491715eb34 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -7,6 +7,7 @@ import { ModuleParameterType, } from "../../types/module"; import { isAddress } from "../utils"; +import { assertIgnitionInvariant } from "../utils/assertions"; import { ReconciliationContext, ReconciliationFutureResult } from "./types"; @@ -25,7 +26,7 @@ export function fail( export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, - context: ReconciliationContext + { accounts }: ReconciliationContext ): string | undefined { if (from === undefined) { return from; @@ -43,31 +44,40 @@ export function resolveFromAddress( throw new IgnitionError(`Could not resolve from address: ${from as any}`); } - const runtimeAddress = context.accounts[from.accountIndex]; + const runtimeAddress = accounts[from.accountIndex]; - if (!isAddress(runtimeAddress)) { - throw new IgnitionError( - `From runtime value is not a usable address: ${runtimeAddress}` - ); - } + assertIgnitionInvariant( + !isAddress(runtimeAddress), + `From runtime account is not a usable address: ${runtimeAddress}` + ); return runtimeAddress; } export function resolveModuleParameter( - moduleParamRuntimeValue: ModuleParameterRuntimeValue, + moduleParamRuntimeValue: ModuleParameterRuntimeValue, context: ReconciliationContext -) { +): ModuleParameterType { const moduleParameters = context.deploymentParameters[moduleParamRuntimeValue.moduleId]; if (moduleParameters === undefined) { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + return moduleParamRuntimeValue.defaultValue; } const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; if (moduleParamValue === undefined) { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + return moduleParamRuntimeValue.defaultValue; } diff --git a/packages/core/src/new-api/internal/utils/assertions.ts b/packages/core/src/new-api/internal/utils/assertions.ts new file mode 100644 index 0000000000..cbf1d89b10 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/assertions.ts @@ -0,0 +1,12 @@ +import { IgnitionError } from "../../../errors"; + +export function assertIgnitionInvariant( + invariant: boolean, + description: string +): asserts invariant { + if (!invariant) { + throw new IgnitionError( + `Internal Ignition invariant was violated: ${description}` + ); + } +} From a8edc15b2f43ef7ee0483e65b3355caa66adaee4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 15 Jun 2023 20:01:51 +0100 Subject: [PATCH 0450/1302] refactor: add more context to exception in reconciliation helpers --- .../execution-state-resolver.ts | 59 ++++---- .../reconcileFutureSpecificReconciliations.ts | 131 +++++++++--------- .../new-api/internal/reconciliation/utils.ts | 25 +++- 3 files changed, 121 insertions(+), 94 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 06a31a0d91..42b54a82bc 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -15,6 +15,7 @@ import { StaticCallExecutionState, } from "../types/execution-state"; import { isAddress } from "../utils"; +import { assertIgnitionInvariant } from "../utils/assertions"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { ReconciliationContext } from "./types"; @@ -26,22 +27,25 @@ export class ExecutionStateResolver { constructorArgs: ArgumentType[], context: ReconciliationContext ): ArgumentType[] { - return replaceWithinArg(constructorArgs, { - bigint: (bi) => bi.toString(), - future: (f) => { - if (!isContractFuture(f)) { - throw new IgnitionError( - `Only deployable contract and library futures can be used in args, ${f.id} is not a contract or library future` - ); - } - - return ExecutionStateResolver.resolveContractToAddress(f, context); - }, - accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], - moduleParameterRuntimeValue: (mprv) => { - return resolveModuleParameter(mprv, context); - }, - }) as ArgumentType[]; + const replace = (arg: ArgumentType) => + replaceWithinArg(arg, { + bigint: (bi) => bi.toString(), + future: (f) => { + if (!isContractFuture(f)) { + throw new IgnitionError( + `Only deployable contract and library futures can be used in args, ${f.id} is not a contract or library future` + ); + } + + return ExecutionStateResolver.resolveContractToAddress(f, context); + }, + accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], + moduleParameterRuntimeValue: (mprv) => { + return resolveModuleParameter(mprv, context); + }, + }); + + return constructorArgs.map(replace); } // Library addresses are resolved from previous execution states @@ -74,13 +78,14 @@ export class ExecutionStateResolver { (exState: DeploymentExecutionState) => exState.contractAddress ); - if (contractAddress === undefined) { - throw new IgnitionError("Previous deployment without contractAddress"); - } - - if (!isAddress(contractAddress)) { - throw new IgnitionError("contractAddress is not a usable address"); - } + assertIgnitionInvariant( + contractAddress !== undefined, + "Previous deployment without contractAddress" + ); + assertIgnitionInvariant( + isAddress(contractAddress), + "contractAddress is not a usable address" + ); return contractAddress; } @@ -101,9 +106,9 @@ export class ExecutionStateResolver { if (typeof runtimeValue !== "string" || !isAddress(runtimeValue)) { throw new IgnitionError( - `Address runtime value is not a usable address ${safeToString( - runtimeValue - )}` + `Module parameter ${address.moduleId}/${ + address.name + } is not a usable address ${safeToString(runtimeValue)}` ); } @@ -117,7 +122,7 @@ export class ExecutionStateResolver { ); if (typeof result !== "string" || !isAddress(result)) { - throw new IgnitionError("Result is not a usable address"); + throw new IgnitionError("Static call result is not a usable address"); } return result; diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts index b07dc23f6c..8e77228bda 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts @@ -20,75 +20,80 @@ import { reconcileNamedStaticCall } from "./futures/reconcileNamedStaticCall"; import { reconcileReadEventArgument } from "./futures/reconcileReadEventArgument"; import { reconcileSendData } from "./futures/reconcileSendData"; import { ReconciliationContext, ReconciliationFutureResult } from "./types"; +import { failWithError } from "./utils"; export function reconcileFutureSpecificReconciliations( future: Future, executionState: ExecutionState, context: ReconciliationContext ): ReconciliationFutureResult { - switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - return reconcileNamedContractDeployment( - future, - executionState as DeploymentExecutionState, - context - ); - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - return reconcileArtifactContractDeployment( - future, - executionState as DeploymentExecutionState, - context - ); - case FutureType.NAMED_LIBRARY_DEPLOYMENT: - return reconcileNamedLibraryDeployment( - future, - executionState as DeploymentExecutionState, - context - ); - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - return reconcileArtifactLibraryDeployment( - future, - executionState as DeploymentExecutionState, - context - ); - case FutureType.NAMED_CONTRACT_CALL: - return reconcileNamedContractCall( - future, - executionState as CallExecutionState, - context - ); - case FutureType.NAMED_STATIC_CALL: - return reconcileNamedStaticCall( - future, - executionState as StaticCallExecutionState, - context - ); - case FutureType.NAMED_CONTRACT_AT: - return reconcileNamedContractAt( - future, - executionState as ContractAtExecutionState, - context - ); - case FutureType.ARTIFACT_CONTRACT_AT: { - return reconcileArtifactContractAt( - future, - executionState as ContractAtExecutionState, - context - ); - } - case FutureType.READ_EVENT_ARGUMENT: { - return reconcileReadEventArgument( - future, - executionState as ReadEventArgumentExecutionState, - context - ); - } - case FutureType.SEND_DATA: { - return reconcileSendData( - future, - executionState as SendDataExecutionState, - context - ); + try { + switch (future.type) { + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return reconcileNamedContractDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return reconcileArtifactContractDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return reconcileNamedLibraryDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return reconcileArtifactLibraryDeployment( + future, + executionState as DeploymentExecutionState, + context + ); + case FutureType.NAMED_CONTRACT_CALL: + return reconcileNamedContractCall( + future, + executionState as CallExecutionState, + context + ); + case FutureType.NAMED_STATIC_CALL: + return reconcileNamedStaticCall( + future, + executionState as StaticCallExecutionState, + context + ); + case FutureType.NAMED_CONTRACT_AT: + return reconcileNamedContractAt( + future, + executionState as ContractAtExecutionState, + context + ); + case FutureType.ARTIFACT_CONTRACT_AT: { + return reconcileArtifactContractAt( + future, + executionState as ContractAtExecutionState, + context + ); + } + case FutureType.READ_EVENT_ARGUMENT: { + return reconcileReadEventArgument( + future, + executionState as ReadEventArgumentExecutionState, + context + ); + } + case FutureType.SEND_DATA: { + return reconcileSendData( + future, + executionState as SendDataExecutionState, + context + ); + } } + } catch (error) { + return failWithError(future, error); } } diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 491715eb34..685f5e2262 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -24,6 +24,22 @@ export function fail( }; } +export function failWithError( + future: Future, + error: unknown +): ReconciliationFutureResult { + return { + success: false, + failure: { + futureId: future.id, + failure: + error instanceof Error + ? error.message + : "unknown failure during reconciliation", + }, + }; +} + export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, { accounts }: ReconciliationContext @@ -40,14 +56,15 @@ export function resolveFromAddress( return from; } - if (!isRuntimeValue(from)) { - throw new IgnitionError(`Could not resolve from address: ${from as any}`); - } + assertIgnitionInvariant( + isRuntimeValue(from), + `Could not resolve from address: ${JSON.stringify(from)}` + ); const runtimeAddress = accounts[from.accountIndex]; assertIgnitionInvariant( - !isAddress(runtimeAddress), + isAddress(runtimeAddress), `From runtime account is not a usable address: ${runtimeAddress}` ); From bc1a5d6155e876f7e979336e0d24a033bca0e013 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 10:40:38 +0100 Subject: [PATCH 0451/1302] refactor: remove `any` return in replaceWithinArg --- .../core/src/new-api/internal/utils/replace-within-arg.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/utils/replace-within-arg.ts b/packages/core/src/new-api/internal/utils/replace-within-arg.ts index ab03421732..59503942e7 100644 --- a/packages/core/src/new-api/internal/utils/replace-within-arg.ts +++ b/packages/core/src/new-api/internal/utils/replace-within-arg.ts @@ -32,7 +32,7 @@ interface Replacers { export function replaceWithinArg( arg: ArgumentType, replacers: Replacers -): Composable { +): Composable { if (typeof arg === "bigint") { return replacers.bigint(arg); } @@ -59,5 +59,5 @@ export function replaceWithinArg( ); } - return arg as any; + return arg; } From bc837ae57b49d4302fc44b61cf4da622f372fe63 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 11:32:31 +0100 Subject: [PATCH 0452/1302] docs: document the replace-within-arg function --- .../reconciliation/execution-state-resolver.ts | 4 +++- .../internal/utils/replace-within-arg.ts | 18 +++++++++++++++++- ...arg-resolution.ts => replace-within-arg.ts} | 0 3 files changed, 20 insertions(+), 2 deletions(-) rename packages/core/test/new-api/utils/{arg-resolution.ts => replace-within-arg.ts} (100%) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 42b54a82bc..612d960172 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -1,3 +1,5 @@ +import identity from "lodash/identity"; + import { IgnitionError } from "../../../errors"; import { isContractFuture, isRuntimeValue } from "../../type-guards"; import { @@ -29,7 +31,7 @@ export class ExecutionStateResolver { ): ArgumentType[] { const replace = (arg: ArgumentType) => replaceWithinArg(arg, { - bigint: (bi) => bi.toString(), + bigint: identity, future: (f) => { if (!isContractFuture(f)) { throw new IgnitionError( diff --git a/packages/core/src/new-api/internal/utils/replace-within-arg.ts b/packages/core/src/new-api/internal/utils/replace-within-arg.ts index 59503942e7..a4ca2c1f52 100644 --- a/packages/core/src/new-api/internal/utils/replace-within-arg.ts +++ b/packages/core/src/new-api/internal/utils/replace-within-arg.ts @@ -23,7 +23,23 @@ interface Replacers { } /** - * Replace runtime values in an argument. + * Recursively replace values with an argument based on given replacer + * functions. This is useful for substituting for futures and runtime + * arguments within the constructor or call args of a future. + * + * @example + * const args = [1, { nested: { insideArray: [1, new Future(1), 3] }}, "abc"] + * + * const updated = replaceWithinArg(args, { + * ..., + * future: (f) => ({_kind: "Future", id: f.id }) + * }) + * + * assert.equal(updated, [ + * 1, + * { nested: { insideArray: [1, {_kind: "Future", id: 1 }, 3] }}, + * "abc"] + * ) * * @param arg - the argument to be replaced * @param replacers - substituters for each special value found in the args diff --git a/packages/core/test/new-api/utils/arg-resolution.ts b/packages/core/test/new-api/utils/replace-within-arg.ts similarity index 100% rename from packages/core/test/new-api/utils/arg-resolution.ts rename to packages/core/test/new-api/utils/replace-within-arg.ts From c6a11b3551b068513102e957c75dd4e25e640097 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 12:06:07 +0100 Subject: [PATCH 0453/1302] refactor: rename files to match kebab case --- ...atch.ts => reconcile-current-and-previous-type-match.ts} | 0 ...cileDependencyRules.ts => reconcile-dependency-rules.ts} | 0 ...ions.ts => reconcile-future-specific-reconciliations.ts} | 0 .../core/src/new-api/internal/reconciliation/reconciler.ts | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename packages/core/src/new-api/internal/reconciliation/{reconcileCurrentAndPreviousTypeMatch.ts => reconcile-current-and-previous-type-match.ts} (100%) rename packages/core/src/new-api/internal/reconciliation/{reconcileDependencyRules.ts => reconcile-dependency-rules.ts} (100%) rename packages/core/src/new-api/internal/reconciliation/{reconcileFutureSpecificReconciliations.ts => reconcile-future-specific-reconciliations.ts} (100%) diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts b/packages/core/src/new-api/internal/reconciliation/reconcile-current-and-previous-type-match.ts similarity index 100% rename from packages/core/src/new-api/internal/reconciliation/reconcileCurrentAndPreviousTypeMatch.ts rename to packages/core/src/new-api/internal/reconciliation/reconcile-current-and-previous-type-match.ts diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts b/packages/core/src/new-api/internal/reconciliation/reconcile-dependency-rules.ts similarity index 100% rename from packages/core/src/new-api/internal/reconciliation/reconcileDependencyRules.ts rename to packages/core/src/new-api/internal/reconciliation/reconcile-dependency-rules.ts diff --git a/packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts b/packages/core/src/new-api/internal/reconciliation/reconcile-future-specific-reconciliations.ts similarity index 100% rename from packages/core/src/new-api/internal/reconciliation/reconcileFutureSpecificReconciliations.ts rename to packages/core/src/new-api/internal/reconciliation/reconcile-future-specific-reconciliations.ts diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index 3a55043a9b..7ef776de5a 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -4,9 +4,9 @@ import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; -import { reconcileCurrentAndPreviousTypeMatch } from "./reconcileCurrentAndPreviousTypeMatch"; -import { reconcileDependencyRules } from "./reconcileDependencyRules"; -import { reconcileFutureSpecificReconciliations } from "./reconcileFutureSpecificReconciliations"; +import { reconcileCurrentAndPreviousTypeMatch } from "./reconcile-current-and-previous-type-match"; +import { reconcileDependencyRules } from "./reconcile-dependency-rules"; +import { reconcileFutureSpecificReconciliations } from "./reconcile-future-specific-reconciliations"; import { ReconciliationCheck, ReconciliationContext, From fe5e489b90c5100b1576ea9458ef5bcbab136380 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 12:34:57 +0100 Subject: [PATCH 0454/1302] test: ensure dep check before arg resolutions in tests --- .../execution-state-resolver.ts | 8 ++++-- .../test/new-api/reconciliation/reconciler.ts | 25 +++++++++++++++---- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 612d960172..7d36654838 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -180,11 +180,15 @@ export class ExecutionStateResolver { const executionState = executionStateMap[future.id] as TExState; if (executionState === undefined) { - throw new IgnitionError("Failure looking up execution state"); + throw new IgnitionError( + `Failure looking up execution state for future ${future.id}, there is no history of previous execution of this future` + ); } if (future.type !== executionState.futureType) { - throw new IgnitionError("Execution state type does not match future"); + throw new IgnitionError( + `Execution state type does not match future for future ${future.id}` + ); } return func(executionState); diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 8864fbaf20..b1f93eee94 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -82,6 +82,8 @@ describe("Reconciliation", () => { }); describe("dependencies", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + it("should reconcile unchanged dependencies", () => { const moduleDefinition = defineModule("Module", (m) => { const contract1 = m.contract("Contract1"); @@ -212,23 +214,36 @@ describe("Reconciliation", () => { ]); }); - it("should not reconcile the addition of a dependency that was not previously started", () => { + it("should not reconcile the addition of a dependency where the dependent has alread started", () => { + const addr1 = exampleAddress; + const moduleDefinition = defineModule("Module", (m) => { + const contractOriginal = m.contract("ContractOriginal"); + const contractNew = m.contract("ContractNew"); - const contract2 = m.contract("Contract2", [], { - after: [contractNew], + const contract2 = m.contract("Contract2", [contractNew], { + after: [contractOriginal], }); - return { contractNew, contract2 }; + return { contractOriginal, contractNew, contract2 }; }); const reconiliationResult = reconcile(moduleDefinition, { + "Module:ContractOriginal": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(), // no deps on last run + contractName: "ContractOriginal", + contractAddress: addr1, + }, "Module:Contract2": { ...exampleDeploymentState, futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - dependencies: new Set(), // no deps on last run + dependencies: new Set("Module:ContractOriginal"), // no deps on last run contractName: "Contract2", + constructorArgs: [exampleAddress], }, }); From 5a57dc64402da1e85542ff7c6fba077ba9df2a48 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 13:08:45 +0100 Subject: [PATCH 0455/1302] refactor: make resolveFromExectionState private --- .../internal/reconciliation/execution-state-resolver.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 7d36654838..82a406ad43 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -74,7 +74,7 @@ export class ExecutionStateResolver { return address; } - const contractAddress = this.resolveFromExecutionState( + const contractAddress = this._resolveFromExecutionState( address, executionStateMap, (exState: DeploymentExecutionState) => exState.contractAddress @@ -117,7 +117,7 @@ export class ExecutionStateResolver { return runtimeValue; } - const result = this.resolveFromExecutionState( + const result = this._resolveFromExecutionState( address, context.executionStateMap, (executionState: StaticCallExecutionState) => executionState.result @@ -155,7 +155,7 @@ export class ExecutionStateResolver { return runtimeValue; } - const to = this.resolveFromExecutionState( + const to = this._resolveFromExecutionState( toAddress, context.executionStateMap, (executionState: SendDataExecutionState) => executionState.to @@ -168,7 +168,7 @@ export class ExecutionStateResolver { return to; } - public static resolveFromExecutionState< + private static _resolveFromExecutionState< TFuture extends Future, TExState extends ExecutionState, TResult extends TExState[keyof TExState] From 9ab86ca8f3028250116681c3c522142ee70c5299 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 13:22:36 +0100 Subject: [PATCH 0456/1302] refactor: swap in more assertions --- .../execution-state-resolver.ts | 43 +++++++++---------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 82a406ad43..24eb5461d9 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -95,8 +95,8 @@ export class ExecutionStateResolver { public static resolveToAddress( address: | string - | AddressResolvableFuture - | ModuleParameterRuntimeValue, + | ModuleParameterRuntimeValue + | AddressResolvableFuture, context: ReconciliationContext ): string { if (typeof address === "string") { @@ -106,13 +106,12 @@ export class ExecutionStateResolver { if (isRuntimeValue(address)) { const runtimeValue = resolveModuleParameter(address, context); - if (typeof runtimeValue !== "string" || !isAddress(runtimeValue)) { - throw new IgnitionError( - `Module parameter ${address.moduleId}/${ - address.name - } is not a usable address ${safeToString(runtimeValue)}` - ); - } + assertIgnitionInvariant( + typeof runtimeValue === "string" && isAddress(runtimeValue), + `Module parameter ${address.moduleId}/${ + address.name + } is not a usable address ${safeToString(runtimeValue)}` + ); return runtimeValue; } @@ -123,9 +122,10 @@ export class ExecutionStateResolver { (executionState: StaticCallExecutionState) => executionState.result ); - if (typeof result !== "string" || !isAddress(result)) { - throw new IgnitionError("Static call result is not a usable address"); - } + assertIgnitionInvariant( + typeof result === "string" && isAddress(result), + "Static call result is not a usable address" + ); return result; } @@ -179,17 +179,14 @@ export class ExecutionStateResolver { ): TResult { const executionState = executionStateMap[future.id] as TExState; - if (executionState === undefined) { - throw new IgnitionError( - `Failure looking up execution state for future ${future.id}, there is no history of previous execution of this future` - ); - } - - if (future.type !== executionState.futureType) { - throw new IgnitionError( - `Execution state type does not match future for future ${future.id}` - ); - } + assertIgnitionInvariant( + executionState !== undefined, + `Failure looking up execution state for future ${future.id}, there is no history of previous execution of this future` + ); + assertIgnitionInvariant( + future.type === executionState.futureType, + `Execution state type does not match future for future ${future.id}` + ); return func(executionState); } From b9f580cefdd7b637b5c7e7058251137a69aa8610 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 14:47:09 +0100 Subject: [PATCH 0457/1302] refactor: clarify names in resolver --- .../execution-state-resolver.ts | 19 ++++++++++++------- .../futures/reconcileArtifactContractAt.ts | 9 +++++---- .../futures/reconcileNamedContractAt.ts | 9 +++++---- .../futures/reconcileNamedContractCall.ts | 5 ++++- .../futures/reconcileNamedStaticCall.ts | 5 ++++- .../futures/reconcileReadEventArgument.ts | 5 ++++- 6 files changed, 34 insertions(+), 18 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 24eb5461d9..265770d5f5 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -39,7 +39,10 @@ export class ExecutionStateResolver { ); } - return ExecutionStateResolver.resolveContractToAddress(f, context); + return ExecutionStateResolver.resolveContractAddressToAddress( + f, + context + ); }, accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], moduleParameterRuntimeValue: (mprv) => { @@ -57,16 +60,18 @@ export class ExecutionStateResolver { ): Record { return Object.fromEntries( Object.entries(libraries).map(([key, libFuture]) => { - const executionStateEntry = executionStateMap[ - libFuture.id - ] as DeploymentExecutionState; + const contractAddress = this._resolveFromExecutionState( + libFuture, + executionStateMap, + (exState: DeploymentExecutionState) => exState.contractAddress + ); - return [key, executionStateEntry?.contractAddress]; + return [key, contractAddress]; }) ); } - public static resolveContractToAddress( + public static resolveContractAddressToAddress( address: string | ContractFuture, { executionStateMap }: ReconciliationContext ): string { @@ -92,7 +97,7 @@ export class ExecutionStateResolver { return contractAddress; } - public static resolveToAddress( + public static resolveStaticCallResultToAddress( address: | string | ModuleParameterRuntimeValue diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts index 64bf5a6ad9..7b7d53db63 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -18,10 +18,11 @@ export function reconcileArtifactContractAt( ); } - const resolvedAddress: string = ExecutionStateResolver.resolveToAddress( - future.address, - context - ); + const resolvedAddress: string = + ExecutionStateResolver.resolveStaticCallResultToAddress( + future.address, + context + ); if (!isEqual(resolvedAddress, executionState.address)) { return fail( diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts index 8769130002..497106fcc0 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -18,10 +18,11 @@ export function reconcileNamedContractAt( ); } - const resolvedAddress: string = ExecutionStateResolver.resolveToAddress( - future.address, - context - ); + const resolvedAddress: string = + ExecutionStateResolver.resolveStaticCallResultToAddress( + future.address, + context + ); if (!isEqual(resolvedAddress, executionState.address)) { return fail( diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 94944b2415..0520b64cdc 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -12,7 +12,10 @@ export function reconcileNamedContractCall( context: ReconciliationContext ): ReconciliationFutureResult { const contractAddress: string = - ExecutionStateResolver.resolveContractToAddress(future.contract, context); + ExecutionStateResolver.resolveContractAddressToAddress( + future.contract, + context + ); if (!isEqual(contractAddress, executionState.contractAddress)) { return fail( diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index 496316bdd7..2f4caf3ce2 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -12,7 +12,10 @@ export function reconcileNamedStaticCall( context: ReconciliationContext ): ReconciliationFutureResult { const contractAddress: string = - ExecutionStateResolver.resolveContractToAddress(future.contract, context); + ExecutionStateResolver.resolveContractAddressToAddress( + future.contract, + context + ); if (!isEqual(contractAddress, executionState.contractAddress)) { return fail( diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts index 401bcfda62..c5a0e79ae9 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts @@ -31,7 +31,10 @@ export function reconcileReadEventArgument( } const resolvedEmitterAddress: string = - ExecutionStateResolver.resolveContractToAddress(future.emitter, context); + ExecutionStateResolver.resolveContractAddressToAddress( + future.emitter, + context + ); if (resolvedEmitterAddress !== executionState.emitter) { return fail( From 44edfa340db767050883c1285bf3aab8e4593e03 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 15:50:54 +0100 Subject: [PATCH 0458/1302] test: add coverage for named static call resolution --- .../execution-state-resolver.ts | 32 +++++++-- packages/core/src/new-api/type-guards.ts | 12 ++++ .../futures/reconcileNamedStaticCall.ts | 72 +++++++++++++++++++ .../test/new-api/reconciliation/reconciler.ts | 26 +++++++ 4 files changed, 135 insertions(+), 7 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 265770d5f5..766384dac3 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -1,7 +1,11 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; -import { isContractFuture, isRuntimeValue } from "../../type-guards"; +import { + isContractFuture, + isNamedStaticCallFuture, + isRuntimeValue, +} from "../../type-guards"; import { AddressResolvableFuture, ArgumentType, @@ -33,15 +37,29 @@ export class ExecutionStateResolver { replaceWithinArg(arg, { bigint: identity, future: (f) => { - if (!isContractFuture(f)) { - throw new IgnitionError( - `Only deployable contract and library futures can be used in args, ${f.id} is not a contract or library future` + if (isContractFuture(f)) { + return this.resolveContractAddressToAddress(f, context); + } + + if (isNamedStaticCallFuture(f)) { + const result = this._resolveFromExecutionState( + f, + context.executionStateMap, + (exe: StaticCallExecutionState) => exe.result ); + + assertIgnitionInvariant( + result !== undefined, + "Static call result cannot be undefined" + ); + + return result; } - return ExecutionStateResolver.resolveContractAddressToAddress( - f, - context + throw new IgnitionError( + `Only futures that resolve to a value can be used in args,` + + ` ${f.id} is not a contract, library,` + + ` static call or event argument future` ); }, accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 1ee5f63422..52307f343c 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -5,6 +5,7 @@ import { FunctionCallFuture, Future, FutureType, + NamedStaticCallFuture, RuntimeValue, RuntimeValueType, } from "./types/module"; @@ -100,6 +101,17 @@ export function isFunctionCallFuture( ); } +/** + * Returns true if future is of type FunctionCallFuture. + * + * @beta + */ +export function isNamedStaticCallFuture( + future: Future +): future is NamedStaticCallFuture { + return future.type === FutureType.NAMED_STATIC_CALL; +} + /** * Returns true if future is of type DeploymentFuture. * diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index de9d2b378a..647d273fd8 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -214,4 +214,76 @@ describe("Reconciliation - named static call", () => { }, ]); }); + + it("should not reconcile the use of the result of a static call that has changed", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + const resultArg1 = m.staticCall(contract1, "function1", ["first"], { + id: "first-call", + }); + const resultArg2 = m.staticCall(contract1, "function1", ["second"], { + id: "second-call", + after: [resultArg1], + }); + + const contract2 = m.contract("Contract2", [resultArg2], { + after: [resultArg1, resultArg2], + }); + + return { contract1, contract2 }; + }); + + // This state is the equivalent to above, but contract2's + // constructor arg points at the result of the first call + // rather than the second + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Module:first-call": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(["Module:Contract1"]), + contractAddress: exampleAddress, + functionName: "function1", + args: ["first"], + result: "first", + }, + "Module:Contract1#second-call": { + ...exampleStaticCallState, + futureType: FutureType.NAMED_STATIC_CALL, + status: ExecutionStatus.SUCCESS, + dependencies: new Set([ + "Module:Contract1", + "Module:Contract1#first-call", + ]), + contractAddress: exampleAddress, + functionName: "function1", + args: ["second"], + result: "second", + }, + "Module:Contract2": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + dependencies: new Set([ + "Module:Contract1#first-call", + "Module:Contract1#second-call", + ]), + contractName: "Contract2", + contractAddress: differentAddress, + constructorArgs: ["first"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract2", + failure: "Constructor args have been changed", + }, + ]); + }); }); diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index b1f93eee94..8da8811679 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -36,6 +36,32 @@ describe("Reconciliation", () => { assertSuccessReconciliation(moduleDefinition, {}); }); + it("should successfully reconcile even in with complex arguments", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const safeMath = m.library("SafeMath"); + + const contract1 = m.contract("Contract1", [], { + libraries: { + SafeMath: safeMath, + }, + }); + + const call = m.call(contract1, "test", []); + + const addressEventArg = m.readEventArgument(call, "Created", "address"); + const staticCallArg = m.staticCall(contract1, "readAddress", []); + + const contract2 = m.contract("Contract2", [ + addressEventArg, + staticCallArg, + ]); + + return { safeMath, contract1, contract2 }; + }); + + assertSuccessReconciliation(moduleDefinition, {}); + }); + it("should find previous executed futures that have been left out of the current module", () => { const moduleDefinition = defineModule("Module1", (m) => { const contract1 = m.contract("Contract1"); From 21c8efae3a6209cb8f2fc5ca5d55c470b2e22dcd Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 17 Jun 2023 16:25:16 +0100 Subject: [PATCH 0459/1302] feat: add read event check This involved two refactorings: 1. Add a SolidityParameterType (identical to ModuleParameterType) 2. Add a result to read event state with type SolidityParameterType This allowed the adding of a check during argument resolution for readEventArg futures. --- .../execution-state-resolver.ts | 17 +++++ .../new-api/internal/reconciliation/utils.ts | 3 +- .../new-api/internal/types/execution-state.ts | 9 ++- packages/core/src/new-api/type-guards.ts | 13 +++- packages/core/src/new-api/types/module.ts | 17 +++-- .../futures/reconcileReadEventArgument.ts | 64 +++++++++++++++++++ .../test/new-api/utils/replace-within-arg.ts | 8 +-- 7 files changed, 118 insertions(+), 13 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 766384dac3..903fcf4bb5 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -4,6 +4,7 @@ import { IgnitionError } from "../../../errors"; import { isContractFuture, isNamedStaticCallFuture, + isReadEventArgumentFuture, isRuntimeValue, } from "../../type-guards"; import { @@ -17,6 +18,7 @@ import { DeploymentExecutionState, ExecutionState, ExecutionStateMap, + ReadEventArgumentExecutionState, SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; @@ -56,6 +58,21 @@ export class ExecutionStateResolver { return result; } + if (isReadEventArgumentFuture(f)) { + const result = this._resolveFromExecutionState( + f, + context.executionStateMap, + (exe: ReadEventArgumentExecutionState) => exe.result + ); + + assertIgnitionInvariant( + result !== undefined, + "Read event argument result cannot be undefined" + ); + + return result; + } + throw new IgnitionError( `Only futures that resolve to a value can be used in args,` + ` ${f.id} is not a contract, library,` + diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 685f5e2262..e9d9a85bc7 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -5,6 +5,7 @@ import { Future, ModuleParameterRuntimeValue, ModuleParameterType, + SolidityParameterType, } from "../../types/module"; import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -101,7 +102,7 @@ export function resolveModuleParameter( return moduleParamValue; } -export function safeToString(potential: ModuleParameterType | undefined) { +export function safeToString(potential: SolidityParameterType | undefined) { if (potential === undefined) { return "undefined"; } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 9419ad7168..a2f667095d 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -1,4 +1,8 @@ -import { ArgumentType, FutureType } from "../../types/module"; +import { + ArgumentType, + FutureType, + SolidityParameterType, +} from "../../types/module"; /** * This interface represents a transaction that was sent to the network. @@ -142,8 +146,8 @@ export interface StaticCallExecutionState contractAddress: string; functionName: string; args: ArgumentType[]; - result?: ArgumentType; from: string | undefined; + result?: SolidityParameterType; } export interface ContractAtExecutionState @@ -160,6 +164,7 @@ export interface ReadEventArgumentExecutionState argumentName: string; eventIndex: number; emitter: string; + result?: SolidityParameterType; } export interface SendDataExecutionState diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 52307f343c..76ee22276c 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -102,7 +102,7 @@ export function isFunctionCallFuture( } /** - * Returns true if future is of type FunctionCallFuture. + * Returns true if future is of type NamedStaticCallFuture. * * @beta */ @@ -112,6 +112,17 @@ export function isNamedStaticCallFuture( return future.type === FutureType.NAMED_STATIC_CALL; } +/** + * Returns true if future is of type ReadEventArgumentFuture. + * + * @beta + */ +export function isReadEventArgumentFuture( + future: Future +): future is NamedStaticCallFuture { + return future.type === FutureType.READ_EVENT_ARGUMENT; +} + /** * Returns true if future is of type DeploymentFuture. * diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index a63b58d75b..0b4308cd27 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -290,17 +290,24 @@ export interface SendDataFuture { * * @beta */ -export type BaseModuleParameterType = number | bigint | string | boolean; +export type BaseSolidityParameterType = number | bigint | string | boolean; + +/** + * Types that can be passed across the Solidity ABI boundary. + * + * @beta + */ +export type SolidityParameterType = + | BaseSolidityParameterType + | SolidityParameterType[] + | { [field: string]: SolidityParameterType }; /** * Type of module parameters's values. * * @beta */ -export type ModuleParameterType = - | BaseModuleParameterType - | ModuleParameterType[] - | { [field: string]: ModuleParameterType }; +export type ModuleParameterType = SolidityParameterType; /** * The different runtime values supported by Ignition. diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 94c6668dfe..6b56aefc13 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -222,4 +222,68 @@ describe("Reconciliation - read event argument", () => { }, ]); }); + + it("should not reconcile the use of an event argument that has changed", () => { + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + const readEvent1 = m.readEventArgument(contract1, "event1", "argument1", { + id: "ReadEvent1", + }); + + const readEvent2 = m.readEventArgument(contract1, "event2", "argument2", { + id: "ReadEvent2", + }); + + const contract2 = m.contract("Contract2", [readEvent2], { + after: [readEvent1, readEvent2], + }); + + return { contract1, contract2 }; + }); + + // This state is the equivalent to above, but contract2's + // constructor arg points at the result of the first call + // rather than the second + const reconiliationResult = reconcile(moduleDefinition, { + "Module:Contract1": { + ...exampleDeploymentState, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + }, + "Module:ReadEvent1": { + ...exampleReadArgState, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(["Module:Contract1"]), + eventName: "event1", + argumentName: "argument1", + emitter: exampleAddress, + result: "first", + }, + "Module:ReadEvent2": { + ...exampleReadArgState, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(["Module:Contract1"]), + eventName: "event2", + argumentName: "argument2", + emitter: exampleAddress, + result: "second", + }, + "Module:Contract2": { + ...exampleDeploymentState, + status: ExecutionStatus.STARTED, + dependencies: new Set(["Module:ReadEvent1", "Module:ReadEvent2"]), + contractName: "Contract2", + contractAddress: differentAddress, + constructorArgs: ["first"], + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract2", + failure: "Constructor args have been changed", + }, + ]); + }); }); diff --git a/packages/core/test/new-api/utils/replace-within-arg.ts b/packages/core/test/new-api/utils/replace-within-arg.ts index 904fa94ca1..94f5cef099 100644 --- a/packages/core/test/new-api/utils/replace-within-arg.ts +++ b/packages/core/test/new-api/utils/replace-within-arg.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { ArgumentType, ModuleParameterType } from "../../../src"; +import { ArgumentType, SolidityParameterType } from "../../../src"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -11,11 +11,11 @@ import { replaceWithinArg } from "../../../src/new-api/internal/utils/replace-wi describe("Arg resolution", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; - let resolve: (arg: ArgumentType) => ModuleParameterType; + let resolve: (arg: ArgumentType) => SolidityParameterType; beforeEach(() => { resolve = (arg: ArgumentType) => - replaceWithinArg(arg, { + replaceWithinArg(arg, { accountRuntimeValue: (arv) => ({ _kind: "AccountRuntimeValue", accountIndex: arv.accountIndex, @@ -295,7 +295,7 @@ describe("Arg resolution", () => { }); function assertEqualBeforeAndAfterResolution( - resolve: (arg: ArgumentType) => ModuleParameterType, + resolve: (arg: ArgumentType) => SolidityParameterType, arg: ArgumentType ) { const before = arg; From 7a93bfc28e07b10b4807414f077820afae90642e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 26 May 2023 16:23:04 +0100 Subject: [PATCH 0460/1302] refactor(new-api): add basic execution engine Sketch out the components of the execution engine: * execution engine - orchetrator * journal - record and recover transaction log * execution strategy - an extension point for turning futures into multiple on-chain interactions * transaction service - manages on-chain interactions * chain-dispatcher - low-level calls to the blockchain Resolves #256 --- packages/core/src/index.ts | 8 +- packages/core/src/new-api/deployer.ts | 77 ++++++- .../internal/execution/execution-engine.ts | 217 ++++++++++++++++++ .../internal/execution/execution-strategy.ts | 71 ++++++ .../execution/executionStateReducer.ts | 59 +++++ .../src/new-api/internal/execution/guards.ts | 48 ++++ .../transactions/chain-dispatcher.ts | 88 +++++++ .../transactions/transaction-service.ts | 69 ++++++ .../new-api/internal/reconciliation/utils.ts | 3 +- .../internal/types/execution-engine.ts | 25 +- packages/core/src/new-api/journal.ts | 45 ++++ packages/core/src/new-api/type-guards.ts | 47 +++- packages/core/src/new-api/types/adapters.ts | 42 ++++ packages/core/src/new-api/types/artifact.ts | 9 + packages/core/src/new-api/types/deployer.ts | 16 ++ packages/core/src/new-api/types/journal.ts | 197 ++++++++++++++++ .../src/new-api/types/transaction-service.ts | 10 + .../new-api/execution/execution-engine.ts | 113 +++++++++ packages/core/test/new-api/helpers.ts | 8 + .../test/new-api/reconciliation/helpers.ts | 11 +- .../hardhat-plugin/src/buildAdaptersFrom.ts | 38 +++ packages/hardhat-plugin/src/index.ts | 120 ++++++++++ 22 files changed, 1294 insertions(+), 27 deletions(-) create mode 100644 packages/core/src/new-api/internal/execution/execution-engine.ts create mode 100644 packages/core/src/new-api/internal/execution/execution-strategy.ts create mode 100644 packages/core/src/new-api/internal/execution/executionStateReducer.ts create mode 100644 packages/core/src/new-api/internal/execution/guards.ts create mode 100644 packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts create mode 100644 packages/core/src/new-api/internal/execution/transactions/transaction-service.ts create mode 100644 packages/core/src/new-api/journal.ts create mode 100644 packages/core/src/new-api/types/adapters.ts create mode 100644 packages/core/src/new-api/types/deployer.ts create mode 100644 packages/core/src/new-api/types/journal.ts create mode 100644 packages/core/src/new-api/types/transaction-service.ts create mode 100644 packages/core/test/new-api/execution/execution-engine.ts create mode 100644 packages/hardhat-plugin/src/buildAdaptersFrom.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index e0886a184b..3396680b8f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,14 +2,20 @@ export { buildModule } from "./buildModule"; export * from "./errors"; export * from "./initialization"; export { defineModule } from "./new-api/define-module"; +export { Deployer } from "./new-api/deployer"; /* TODO: how is module constructor getting exposed? */ export { ModuleConstructor } from "./new-api/internal/module-builder"; +export { FileJournal, MemoryJournal } from "./new-api/journal"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; +export * from "./new-api/type-guards"; +export * from "./new-api/types/adapters"; export * from "./new-api/types/artifact"; +export * from "./new-api/types/deployer"; +export * from "./new-api/types/journal"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; -export * from "./new-api/type-guards"; +export * from "./new-api/types/transaction-service"; export * from "./types/dsl"; export * from "./types/future"; export * from "./types/hardhat"; diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index c564c6d12e..275c10bfa6 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -1,17 +1,69 @@ import type { IgnitionModuleResult, ModuleParameters } from "./types/module"; import type { IgnitionModuleDefinition } from "./types/module-builder"; +import { IgnitionError } from "../errors"; + import { Batcher } from "./internal/batcher"; -import { ExecutionEngine } from "./internal/execution-engine"; +import { ExecutionEngine } from "./internal/execution/execution-engine"; +import { BasicExecutionStrategy } from "./internal/execution/execution-strategy"; +import { executionStateReducer } from "./internal/execution/executionStateReducer"; +import { EthersChainDispatcher } from "./internal/execution/transactions/chain-dispatcher"; +import { TransactionServiceImplementation } from "./internal/execution/transactions/transaction-service"; import { ModuleConstructor } from "./internal/module-builder"; import { Reconciler } from "./internal/reconciliation/reconciler"; +import { ExecutionStrategy } from "./internal/types/execution-engine"; import { ExecutionStateMap } from "./internal/types/execution-state"; +import { isAdapters } from "./type-guards"; +import { Adapters } from "./types/adapters"; +import { ArtifactResolver } from "./types/artifact"; +import { DeploymentResult } from "./types/deployer"; +import { Journal } from "./types/journal"; +import { TransactionService } from "./types/transaction-service"; +/** + * Run an Igntition deployment. + * + * @beta + */ export class Deployer { + private _journal: Journal; private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; + private _transactionService: TransactionService; + private _strategy: ExecutionStrategy; + + constructor( + options: + | { journal: Journal; transactionService: TransactionService } + | { + journal: Journal; + adapters: Adapters; + artifactLoader: ArtifactResolver; + } + ) { + this._journal = options.journal; + this._strategy = new BasicExecutionStrategy(); + + if ("adapters" in options && isAdapters(options.adapters)) { + if (options.artifactLoader === undefined) { + throw new IgnitionError("Artifact loader must be provided"); + } + + const adapters: Adapters = options.adapters; + this._transactionService = new TransactionServiceImplementation( + options.artifactLoader, + new EthersChainDispatcher( + adapters.signer, + adapters.gas, + adapters.transactions + ) + ); + } else if ("transactionService" in options) { + this._transactionService = options.transactionService; + } else { + throw new IgnitionError("Bad arguments passed to deployer"); + } - constructor() { this._moduleConstructor = new ModuleConstructor(); this._executionEngine = new ExecutionEngine(); } @@ -24,10 +76,10 @@ export class Deployer { >, deploymentParameters: { [key: string]: ModuleParameters }, accounts: string[] - ) { + ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); - const previousStateMap = await this._loadExecutionStateFromJournal(); + const previousStateMap = await this._loadExecutionStateFrom(this._journal); const reconciliationResult = Reconciler.reconcile( module, @@ -50,11 +102,22 @@ export class Deployer { batches, module, executionStateMap: previousStateMap, + accounts, + strategy: this._strategy, + journal: this._journal, + transactionService: this._transactionService, }); } - private async _loadExecutionStateFromJournal(): Promise { - // TODO: load an actual journal - return {}; + private async _loadExecutionStateFrom( + journal: Journal + ): Promise { + let state: ExecutionStateMap = {}; + + for await (const message of journal.read()) { + state = executionStateReducer(state, message); + } + + return state; } } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts new file mode 100644 index 0000000000..957f442c18 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -0,0 +1,217 @@ +import { IgnitionError } from "../../../errors"; +import { isDeploymentExecutionState } from "../../../internal/utils/guards"; +import { isRuntimeValue } from "../../type-guards"; +import { DeploymentResult } from "../../types/deployer"; +import { + ExecutionResult, + FutureRestart, + FutureStart, + JournalableMessage, +} from "../../types/journal"; +import { + AccountRuntimeValue, + Future, + FutureType, + RuntimeValueType, +} from "../../types/module"; +import { safeToString } from "../reconciliation/utils"; +import { ExecutionEngineState } from "../types/execution-engine"; +import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; +import { getFuturesFromModule } from "../utils/get-futures-from-module"; + +import { executionStateReducer } from "./executionStateReducer"; +import { isExecutionResult, isOnChainAction, isOnchainResult } from "./guards"; + +type ExecutionBatch = Future[]; + +export class ExecutionEngine { + public async execute(state: ExecutionEngineState): Promise { + const { batches, module } = state; + + const futures = getFuturesFromModule(module); + + for (const batch of batches) { + // TODO: consider changing batcher to return futures rather than ids + const executionBatch = batch.map((futureId) => + this._lookupFuture(futures, futureId) + ); + + const batchResult = await this._executeBatch(executionBatch, state); + + if (batchResult.some((b) => b.type === "execution-failure")) { + return { status: "failed" }; + } + + if (batchResult.some((b) => b.type === "execution-hold")) { + return { status: "hold" }; + } + + if (batchResult.every((b) => b.type !== "execution-success")) { + throw new IgnitionError("Unexpected state"); + } + } + + return { + status: "success", + contracts: this._resolveDeployedContractsFrom(state), + }; + } + + private async _executeBatch( + batch: ExecutionBatch, + state: ExecutionEngineState + ) { + return Promise.all( + batch.map((entry) => this._executeBatchEntry(entry, state)) + ); + } + + private async _executeBatchEntry( + future: Future, + state: ExecutionEngineState + ): Promise { + let current: JournalableMessage = this._startOrRestartFor(future, state); + await this._apply(state, current); + + const context = { + executionState: state.executionStateMap[future.id], + }; + + const exectionStrategy = state.strategy.executeStrategy(context); + + while (!isExecutionResult(current)) { + context.executionState = state.executionStateMap[future.id]; + + if (isOnChainAction(current)) { + current = await state.transactionService.onchain(current); + } else if (isOnchainResult(current)) { + current = (await exectionStrategy.next(current)).value; + } else { + current = (await exectionStrategy.next(null)).value; + } + + await this._apply(state, current); + } + + return current; + } + + private _startOrRestartFor( + future: Future, + state: ExecutionEngineState + ): FutureStart | FutureRestart { + const executionState = state.executionStateMap[future.id]; + + if (executionState === undefined) { + return this._initCommandFor(future, state); + } + + return { type: "execution-restart", futureId: future.id }; + } + + private async _apply( + state: ExecutionEngineState, + message: JournalableMessage + ): Promise { + await state.journal.record(message); + state.executionStateMap = executionStateReducer( + state.executionStateMap, + message + ); + } + + private _resolveAddress( + potential: string | AccountRuntimeValue | undefined, + { accounts }: { accounts: string[] } + ) { + if (typeof potential === "string") { + return potential; + } + + if ( + isRuntimeValue(potential) && + potential.type === RuntimeValueType.ACCOUNT + ) { + return accounts[potential.accountIndex]; + } + + if (potential === undefined) { + return accounts[0]; + } + + throw new IgnitionError( + `Unable to resolve address: ${safeToString(potential)} ` + ); + } + + private _initCommandFor( + future: Future, + { accounts }: { executionStateMap: ExecutionStateMap; accounts: string[] } + ): FutureStart { + const strategy = "basic"; + + switch (future.type) { + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + const state: FutureStart = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: future.contractName, + value: future.value.toString(), + constructorArgs: future.constructorArgs, + libraries: Object.fromEntries( + Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) + ), + from: this._resolveAddress(future.from, { accounts }), + }; + return state; + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_CONTRACT_CALL: + case FutureType.NAMED_STATIC_CALL: + case FutureType.NAMED_CONTRACT_AT: + case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.READ_EVENT_ARGUMENT: + case FutureType.SEND_DATA: { + throw new Error(`Not implemented yet: FutureType ${future.type}`); + } + } + } + + private _lookupFuture(futures: Future[], futureId: string): Future { + const future = futures.find((f) => f.id === futureId); + + if (future === undefined) { + throw new IgnitionError("Could not locate future id from batching"); + } + + return future; + } + + private _resolveDeployedContractsFrom({ + executionStateMap, + }: ExecutionEngineState): Record< + string, + { contractName: string; contractAddress: string } + > { + return Object.fromEntries( + Object.values(executionStateMap) + .filter(isDeploymentExecutionState) + .filter((des) => des.status === ExecutionStatus.SUCCESS) + .map((des) => [ + des.id, + { + contractName: des.contractName, + contractAddress: des.contractAddress!, + }, + ]) + ); + } +} diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts new file mode 100644 index 0000000000..35e01832ed --- /dev/null +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -0,0 +1,71 @@ +import { IgnitionError } from "../../../errors"; +import { isDeploymentExecutionState } from "../../../internal/utils/guards"; +import { + DeployedContractExecutionSuccess, + JournalableMessage, + OnchainInteraction, + OnchainResult, +} from "../../types/journal"; +import { ExecutionStrategy } from "../types/execution-engine"; +import { + DeploymentExecutionState, + ExecutionState, +} from "../types/execution-state"; + +export abstract class ExecutionStrategyBase {} + +export class BasicExecutionStrategy + extends ExecutionStrategyBase + implements ExecutionStrategy +{ + public executeStrategy({ + executionState, + }: { + executionState: ExecutionState; + }): AsyncGenerator< + OnchainInteraction, + JournalableMessage, + OnchainResult | null + > { + if (!isDeploymentExecutionState(executionState)) { + throw new IgnitionError( + "Basic strategy not implemented that execution state yet" + ); + } + + return this._executeDeployment({ executionState }); + } + + public async *_executeDeployment({ + executionState: deploymentExecutionState, + }: { + executionState: DeploymentExecutionState; + }): AsyncGenerator< + OnchainInteraction, + JournalableMessage, + OnchainResult | null + > { + const result = yield { + type: "onchain-action", + subtype: "deploy-contract", + contractName: deploymentExecutionState.contractName, + value: deploymentExecutionState.value.toString(), + args: deploymentExecutionState.constructorArgs, + from: deploymentExecutionState.from ?? "n/a", + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + const success: DeployedContractExecutionSuccess = { + type: "execution-success", + subtype: "deploy-contract", + futureId: deploymentExecutionState.id, + contractName: deploymentExecutionState.contractName, + contractAddress: result.contractAddress, + }; + + return success; + } +} diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts new file mode 100644 index 0000000000..6bfacdc326 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -0,0 +1,59 @@ +import { isDeploymentType } from "../../type-guards"; +import { FutureStart, JournalableMessage } from "../../types/journal"; +import { + DeploymentExecutionState, + ExecutionState, + ExecutionStateMap, + ExecutionStatus, +} from "../types/execution-state"; + +export function executionStateReducer( + executionStateMap: ExecutionStateMap, + action: JournalableMessage +) { + if (action.type === "execution-start") { + return { + ...executionStateMap, + [action.futureId]: initialiseExecutionStateFor(action), + }; + } + + if (action.type === "execution-success") { + const updatedExecutionState: DeploymentExecutionState = { + ...(executionStateMap[action.futureId] as DeploymentExecutionState), + status: ExecutionStatus.SUCCESS, + contractAddress: action.contractAddress, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + + return executionStateMap; +} + +function initialiseExecutionStateFor(futureStart: FutureStart): ExecutionState { + if (!isDeploymentType(futureStart.futureType)) { + throw new Error("Not implemented yet in the reducer"); + } + + const deploymentExecutionState: DeploymentExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + storedArtifactPath: futureStart.storedArtifactPath, + storedBuildInfoPath: futureStart.storedBuildInfoPath, + contractName: futureStart.contractName, + value: BigInt(futureStart.value), + constructorArgs: futureStart.constructorArgs, + libraries: futureStart.libraries, + from: futureStart.from, + }; + + return deploymentExecutionState; +} diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts new file mode 100644 index 0000000000..e0ae77ad49 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -0,0 +1,48 @@ +import { + DeployContractInteraction, + ExecutionResult, + ExecutionResultTypes, + JournalableMessage, + OnchainInteraction, + OnchainResult, +} from "../../types/journal"; + +export function isExecutionResult( + potential: JournalableMessage +): potential is ExecutionResult { + const resultTypes: ExecutionResultTypes = [ + "execution-success", + "execution-failure", + "execution-hold", + ]; + + return (resultTypes as string[]).includes(potential.type); +} + +export function isExecutionMessage( + potential: JournalableMessage +): potential is ExecutionResult { + return isExecutionResult(potential); +} + +export function isOnChainAction( + potential: JournalableMessage +): potential is OnchainInteraction { + const resultTypes = ["onchain-action"]; + + return resultTypes.includes(potential.type); +} + +export function isOnchainResult( + potential: JournalableMessage +): potential is OnchainResult { + const resultTypes = ["onchain-result"]; + + return resultTypes.includes(potential.type); +} + +export function isDeployContractInteraction( + potential: JournalableMessage +): potential is DeployContractInteraction { + return isOnChainAction(potential) && potential.subtype === "deploy-contract"; +} diff --git a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts new file mode 100644 index 0000000000..1ea0de5787 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts @@ -0,0 +1,88 @@ +import { ContractFactory, ethers } from "ethers"; + +import { + GasAdapter, + SignerAdapter, + TransactionsAdapter, +} from "../../../types/adapters"; + +interface HighLevelTransaction { + abi: any[]; + bytecode: string; + args: any; + value: bigint; + from: string; +} + +interface TransactionReceipt { + contractAddress?: string; +} + +export interface ChainDispatcher { + sendTx({ + abi, + bytecode, + args, + value, + from, + }: HighLevelTransaction): Promise; +} + +/** + * Dispatch and interact with the blockchain. + * + * @beta + */ +export class EthersChainDispatcher implements ChainDispatcher { + constructor( + private _signerLoader: SignerAdapter, + private _gasProvider: GasAdapter, + private _transactionProvider: TransactionsAdapter + ) {} + + public async sendTx({ + abi, + bytecode, + args, + value, + from, + }: HighLevelTransaction): Promise { + const signer: ethers.Signer = await this._signerLoader.getSigner(from); + + const Factory = new ContractFactory(abi, bytecode, signer); + + const tx = Factory.getDeployTransaction(...args, { + value, + }); + + // if (txOptions?.gasLimit !== undefined) { + // tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); + // } + + // if (txOptions?.gasPrice !== undefined) { + // tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); + // } + + if (tx.gasLimit === undefined) { + const gasLimit = await this._gasProvider.estimateGasLimit(tx); + + tx.gasLimit = gasLimit; + } + + if (tx.gasPrice === undefined) { + const gasPrice = await this._gasProvider.estimateGasPrice(); + + tx.gasPrice = gasPrice; + } + + const response = await signer.sendTransaction(tx); + + const txHash = response.hash; + + const receipt = await this._transactionProvider.wait(txHash); + + return { + contractAddress: receipt.contractAddress, + }; + } +} diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts new file mode 100644 index 0000000000..a10879ba41 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -0,0 +1,69 @@ +import { IgnitionError } from "../../../../errors"; +import { ArtifactResolver } from "../../../types/artifact"; +import { + DeployContractInteraction, + DeployContractResult, + OnchainInteraction, + OnchainResult, +} from "../../../types/journal"; +import { TransactionService } from "../../../types/transaction-service"; +import { isDeployContractInteraction } from "../guards"; + +import { ChainDispatcher } from "./chain-dispatcher"; + +/** + * A service for managing on-chain interactions during the deployment. + * + * @beta + */ +export class TransactionServiceImplementation implements TransactionService { + constructor( + private _artifactLoader: ArtifactResolver, + private _chainDispatcher: ChainDispatcher + ) {} + + public async onchain( + interaction: OnchainInteraction + ): Promise { + if (!isDeployContractInteraction(interaction)) { + throw new IgnitionError( + "Transaction service not implemented for this interaction" + ); + } + + return this._dispatchDeployContract(interaction); + } + + private async _dispatchDeployContract( + deployContractInteraction: DeployContractInteraction + ): Promise { + // TODO: consider replacing this with a registry of artifacts + const artifact = await this._artifactLoader.load( + deployContractInteraction.contractName + ); + const from = deployContractInteraction.from; + const args = deployContractInteraction.args; + const value = BigInt(deployContractInteraction.value); + + // TODO: add library linking + const linkedByteCode = artifact.bytecode; + + const { contractAddress } = await this._chainDispatcher.sendTx({ + abi: artifact.abi, + bytecode: linkedByteCode, + args, + value, + from, + }); + + if (contractAddress === undefined) { + throw new IgnitionError("Contract address not available on receipt"); + } + + return { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress, + }; + } +} diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index e9d9a85bc7..728a58c200 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -5,7 +5,6 @@ import { Future, ModuleParameterRuntimeValue, ModuleParameterType, - SolidityParameterType, } from "../../types/module"; import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -102,7 +101,7 @@ export function resolveModuleParameter( return moduleParamValue; } -export function safeToString(potential: SolidityParameterType | undefined) { +export function safeToString(potential: unknown) { if (potential === undefined) { return "undefined"; } diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index e0c68e641a..16a6e9bdfe 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,9 +1,32 @@ +import { + Journal, + JournalableMessage, + OnchainInteraction, + OnchainResult, +} from "../../types/journal"; import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; +import { TransactionService } from "../../types/transaction-service"; -import { ExecutionStateMap } from "./execution-state"; +import { ExecutionState, ExecutionStateMap } from "./execution-state"; export interface ExecutionEngineState { batches: string[][]; module: IgnitionModule>; executionStateMap: ExecutionStateMap; + accounts: string[]; + strategy: ExecutionStrategy; + journal: Journal; + transactionService: TransactionService; +} + +export interface ExecutionStrategy { + executeStrategy: ({ + executionState, + }: { + executionState: ExecutionState; + }) => AsyncGenerator< + OnchainInteraction, + JournalableMessage, + OnchainResult | null + >; } diff --git a/packages/core/src/new-api/journal.ts b/packages/core/src/new-api/journal.ts new file mode 100644 index 0000000000..adac6aebda --- /dev/null +++ b/packages/core/src/new-api/journal.ts @@ -0,0 +1,45 @@ +import { IgnitionError } from "../errors"; + +import { Journal, JournalableMessage } from "./types/journal"; + +/** + * An in-memory journal. + * + * @beta + */ +export class MemoryJournal implements Journal { + private messages: string[] = []; + + public async record(message: JournalableMessage): Promise { + try { + this.messages.push(JSON.stringify(message)); + } catch (err) { + console.error(err, message); + } + } + + public async *read(): AsyncGenerator { + for (const entry of this.messages) { + const message: JournalableMessage = JSON.parse(entry); + + yield message; + } + } +} + +/** + * An file-based journal. + * + * @beta + */ +export class FileJournal implements Journal { + constructor(private _filePath: string) {} + + public async record(_message: JournalableMessage): Promise { + throw new IgnitionError("Not implemented"); + } + + public async *read(): AsyncGenerator { + throw new IgnitionError("Not implemented"); + } +} diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 76ee22276c..5584561366 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -1,3 +1,4 @@ +import { Adapters } from "./types/adapters"; import { AddressResolvableFuture, ContractFuture, @@ -88,7 +89,7 @@ export function isAddressResolvableFuture( } /** - * Returns true if future is of type FunctionCallFuture. + * Returns true if future is of type FunctionCallFuture\. * * @beta */ @@ -123,6 +124,27 @@ export function isReadEventArgumentFuture( return future.type === FutureType.READ_EVENT_ARGUMENT; } +/** + * Returns true if the type is of type DeploymentFuture. + * + * @beta + */ +export function isDeploymentType( + potential: unknown +): potential is DeploymentFuture["type"] { + const deploymentTypes = [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ]; + + return ( + typeof potential === "string" && + deploymentTypes.includes(potential as FutureType) + ); +} + /** * Returns true if future is of type DeploymentFuture. * @@ -131,12 +153,7 @@ export function isReadEventArgumentFuture( export function isDeploymentFuture( future: Future ): future is DeploymentFuture { - return ( - future.type === FutureType.NAMED_CONTRACT_DEPLOYMENT || - future.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT || - future.type === FutureType.NAMED_LIBRARY_DEPLOYMENT || - future.type === FutureType.ARTIFACT_LIBRARY_DEPLOYMENT - ); + return isDeploymentType(future.type); } /** @@ -166,3 +183,19 @@ export function isRuntimeValue(potential: unknown): potential is RuntimeValue { isRuntimeValueType(potential.type) ); } + +/** + * Returns true if potential is a set of adapters + * + * @beta + */ +export function isAdapters(potential: unknown): potential is Adapters { + return ( + typeof potential === "object" && + potential !== null && + /* TODO: make this type safe */ + "signer" in potential && + "gas" in potential && + "transactions" in potential + ); +} diff --git a/packages/core/src/new-api/types/adapters.ts b/packages/core/src/new-api/types/adapters.ts new file mode 100644 index 0000000000..e59de3893a --- /dev/null +++ b/packages/core/src/new-api/types/adapters.ts @@ -0,0 +1,42 @@ +import { ethers } from "ethers"; + +/** + * Provide adapters for on-chain interactions. + * + * @beta + */ +export interface Adapters { + signer: SignerAdapter; + gas: GasAdapter; + transactions: TransactionsAdapter; +} + +/** + * Provide a transaction signer. + * + * @beta + */ +export interface SignerAdapter { + getSigner(address: string): Promise; +} + +/** + * Provide access to Ethereum gas information for the target chain. + * + * @beta + */ +export interface GasAdapter { + estimateGasLimit: ( + tx: ethers.providers.TransactionRequest + ) => Promise; + estimateGasPrice: () => Promise; +} + +/** + * Provide access to Ethereum transactions. + * + * @beta + */ +export interface TransactionsAdapter { + wait(txHash: string): Promise; +} diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 2b5287ec7b..8705eddb0a 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -12,3 +12,12 @@ export interface Artifact { Record> >; } + +/** + * Retrieve artifacts based on contract name. + * + * @beta + */ +export interface ArtifactResolver { + load(contractName: string): Promise; +} diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts new file mode 100644 index 0000000000..dc9c7ae81f --- /dev/null +++ b/packages/core/src/new-api/types/deployer.ts @@ -0,0 +1,16 @@ +/** + * The result of a deployment run. + * + * @beta + */ +export type DeploymentResult = + | { + status: "success"; + contracts: Record< + string, + { contractName: string; contractAddress: string } + >; + } + | { + status: "failed" | "hold"; + }; diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts new file mode 100644 index 0000000000..8362d69c85 --- /dev/null +++ b/packages/core/src/new-api/types/journal.ts @@ -0,0 +1,197 @@ +import { ArgumentType, FutureType } from "./module"; + +/** + * Store a deployments execution state as a transaction log. + * + * @beta + */ +export interface Journal { + record(message: JournalableMessage): Promise; + + read(): AsyncGenerator; +} + +/** + * A message recordable in the journal's transaction log. + * + * @beta + */ +export type JournalableMessage = TransactionMessage | ExecutionMessage; + +// #region "TransactionMessage" + +/** + * The journal message relating to transaction service state. + * + * @beta + */ +export type TransactionMessage = OnchainInteraction | OnchainResult; + +// #region "OnchainInteraction" + +/** + * A on-chain interaction request for the transaction service. + * + * @beta + */ +export type OnchainInteraction = DeployContractInteraction; + +/** + * A on-chain interaction request to deploy a contract/library. + * + * @beta + */ +export interface DeployContractInteraction { + value: string; + args: ArgumentType[]; + from: string; + contractName: string; + type: "onchain-action"; + subtype: "deploy-contract"; +} + +// #endregion + +// #region "OnchainResult" + +/** + * A journal message indicating a transaction service transaction result. + * + * @beta + */ +export type OnchainResult = DeployContractResult; + +/** + * A successful deploy contract transaction result. + * + * @beta + */ +export interface DeployContractResult { + type: "onchain-result"; + subtype: "deploy-contract"; + contractAddress: string; +} + +// #endregion + +// #endregion + +// #region "ExecutionMessage" + +/** + * Journal messages at the future execution level. + * + * @beta + */ +export type ExecutionMessage = FutureExecutionUpdate | ExecutionResult; + +// #region "FutureExecutionUpdate" + +/** + * Journal messages that update the future level state. + * + * @beta + */ +export type FutureExecutionUpdate = FutureStart | FutureRestart; + +/** + * A journal message to initialise the execution state for a future. + * + * @beta + */ +export interface FutureStart { + type: "execution-start"; + futureId: string; + futureType: FutureType; + strategy: string; + dependencies: string[]; + storedArtifactPath: string; + storedBuildInfoPath: string; + contractName: string; + constructorArgs: ArgumentType[]; + libraries: { [key: string]: string }; + value: string; + from: string; +} + +/** + * A journal message to indicate a future is being restarted. + * + * @beta + */ +export interface FutureRestart { + type: "execution-restart"; + futureId: string; +} + +// #endregion + +// #region "ExecutionResult" + +/** + * A journal message indicating the result of executing a future. + * + * @beta + */ +export type ExecutionResult = + | ExecutionSuccess + | ExecutionFailure + | ExecutionHold; + +/** + * The types of execution result. + * + * @beta + */ +export type ExecutionResultTypes = [ + "execution-success", + "execution-failure", + "execution-hold" +]; + +// #region "ExecutionSuccess" + +/** + * A journal message indicating a future executed successfully. + * + * @beta + */ +export type ExecutionSuccess = DeployedContractExecutionSuccess; + +/** + * A journal message indicating a contract/library deployed successfully. + * + * @beta + */ +export interface DeployedContractExecutionSuccess { + type: "execution-success"; + subtype: "deploy-contract"; + futureId: string; + contractName: string; + contractAddress: string; +} + +// #endregion + +/** + * A journal message indicating a future failed execution. + * + * @beta + */ +export interface ExecutionFailure { + type: "execution-failure"; +} + +/** + * A journal message indicating a future's execution was not completed within + * the timeout. + * + * @beta + */ +export interface ExecutionHold { + type: "execution-hold"; +} + +// #endregion + +// #endregion diff --git a/packages/core/src/new-api/types/transaction-service.ts b/packages/core/src/new-api/types/transaction-service.ts new file mode 100644 index 0000000000..f82239533a --- /dev/null +++ b/packages/core/src/new-api/types/transaction-service.ts @@ -0,0 +1,10 @@ +import { OnchainInteraction, OnchainResult } from "./journal"; + +/** + * A service for managing on-chain interactions as part of the deployment. + * + * @beta + */ +export interface TransactionService { + onchain(interaction: OnchainInteraction): Promise; +} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts new file mode 100644 index 0000000000..48095c6840 --- /dev/null +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -0,0 +1,113 @@ +import { assert } from "chai"; + +import { FutureType } from "../../../src"; +import { defineModule } from "../../../src/new-api/define-module"; +import { Batcher } from "../../../src/new-api/internal/batcher"; +import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; +import { BasicExecutionStrategy } from "../../../src/new-api/internal/execution/execution-strategy"; +import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; +import { MemoryJournal } from "../../../src/new-api/journal"; +import { + Journal, + JournalableMessage, +} from "../../../src/new-api/types/journal"; +import { TransactionService } from "../../../src/new-api/types/transaction-service"; +import { exampleAccounts } from "../helpers"; + +describe("execution engine", () => { + it("should execute a contract deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.isDefined(module); + + const executionStateMap = {}; + + const batches = Batcher.batch(module, {}); + + const executionEngine = new ExecutionEngine(); + const journal = new MemoryJournal(); + const accounts: string[] = exampleAccounts; + const mockTransactionService = setupMockTransactionService(); + + const result = await executionEngine.execute({ + batches, + module, + executionStateMap, + accounts, + strategy: new BasicExecutionStrategy(), + journal, + transactionService: mockTransactionService, + }); + + assert.isDefined(result); + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: exampleAccounts[0], + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); +}); + +function setupMockTransactionService(): TransactionService { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + return { + onchain: async () => ({ + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: exampleAddress, + }), + } as TransactionService; +} + +async function accumulateMessages( + journal: Journal +): Promise { + const messages: JournalableMessage[] = []; + + for await (const message of journal.read()) { + messages.push(message); + } + + return messages; +} diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index b66946fe00..5399ca3829 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,5 +1,13 @@ import { assert } from "chai"; +export const exampleAccounts: string[] = [ + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", + "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", +]; + export function assertInstanceOf( obj: unknown, klass: new (...args: any[]) => ObjectT diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index bc7d699017..3bb15de55a 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -9,6 +9,7 @@ import { ModuleParameters, } from "../../../src/new-api/types/module"; import { IgnitionModuleDefinition } from "../../../src/new-api/types/module-builder"; +import { exampleAccounts } from "../helpers"; export const oneAddress = "0x1111111111111111111111111111111111111111"; export const twoAddress = "0x2222222222222222222222222222222222222222"; @@ -22,14 +23,6 @@ export function reconcile( executionStateMap: ExecutionStateMap, moduleParameters: { [key: string]: ModuleParameters } = {} ): ReconciliationResult { - const accounts: string[] = [ - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - "0x90F79bf6EB2c4f870365E785982E1f101E93b906", - "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", - "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", - ]; - const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); @@ -46,7 +39,7 @@ export function reconcile( module, updatedExecutionStateMap, moduleParameters, - accounts + exampleAccounts ); return reconiliationResult; diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/buildAdaptersFrom.ts new file mode 100644 index 0000000000..34f7b672d1 --- /dev/null +++ b/packages/hardhat-plugin/src/buildAdaptersFrom.ts @@ -0,0 +1,38 @@ +import { Adapters } from "@ignored/ignition-core"; +import { ethers } from "ethers"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { + const signerAdapter = { + getSigner: (address: string): Promise => + hre.ethers.getSigner(address), + }; + + const gasAdapter = { + estimateGasLimit: async ( + tx: ethers.providers.TransactionRequest + ): Promise => { + const gasLimit = await hre.ethers.provider.estimateGas(tx); + + // return 1.5x estimated gas + return gasLimit.mul(15).div(10); + }, + estimateGasPrice: (): Promise => { + return hre.ethers.provider.getGasPrice(); + }, + }; + + const transactionsAdapter = { + async wait(txHash: string): Promise { + return hre.ethers.provider.waitForTransaction(txHash); + }, + }; + + const adapters: Adapters = { + transactions: transactionsAdapter, + gas: gasAdapter, + signer: signerAdapter, + }; + + return adapters; +} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index a9159e24fb..ce024765f1 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,4 +1,8 @@ import { + Artifact, + Deployer, + FileJournal, + MemoryJournal, Module, ModuleConstructor, ModuleDict, @@ -12,6 +16,7 @@ import { lazyObject } from "hardhat/plugins"; import path from "path"; import prompts from "prompts"; +import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; @@ -171,6 +176,121 @@ task("deploy") } ); +task("deploy2") + .addPositionalParam("moduleNameOrPath") + .addOptionalParam( + "parameters", + "A JSON object as a string, of the module parameters, or a relative path to a JSON file" + ) + .addFlag("force", "restart the deployment ignoring previous history") + .setAction( + async ( + { + moduleNameOrPath, + parameters: parametersInput, + }: { moduleNameOrPath: string; parameters?: string; force: boolean }, + hre + ) => { + const chainId = Number( + await hre.network.provider.request({ + method: "eth_chainId", + }) + ); + + if (chainId !== 31337) { + const prompt = await prompts({ + type: "confirm", + name: "networkConfirmation", + message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, + initial: false, + }); + + if (prompt.networkConfirmation !== true) { + console.log("Deploy cancelled"); + return; + } + } + + await hre.run("compile", { quiet: true }); + + const userModule: Module | undefined = loadModule( + hre.config.paths.ignition, + moduleNameOrPath + ); + + if (userModule === undefined) { + console.warn("No Ignition modules found"); + process.exit(0); + } + + let parameters: ModuleParams | undefined; + if (parametersInput === undefined) { + parameters = resolveParametersFromModuleName( + userModule.name, + hre.config.paths.ignition + ); + } else if (parametersInput.endsWith(".json")) { + parameters = resolveParametersFromFileName(parametersInput); + } else { + parameters = resolveParametersString(parametersInput); + } + + const isHardhatNetwork = hre.network.name === "hardhat"; + + const journal = isHardhatNetwork + ? new MemoryJournal() + : new FileJournal( + resolveJournalPath(userModule.name, hre.config.paths.ignition) + ); + + const accounts = (await hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + try { + const artifactLoader = { + load: async (contractName: string): Promise => + hre.artifacts.readArtifact(contractName), + }; + + const adapters = buildAdaptersFrom(hre); + + const deployer = new Deployer({ journal, adapters, artifactLoader }); + + const result = await deployer.deploy( + userModule as any, + parameters as any, + accounts + ); + + if (result.status === "success") { + console.log("Deployment complete"); + console.log(""); + + for (const [ + futureId, + { contractName, contractAddress }, + ] of Object.entries(result.contracts)) { + console.log(`${contractName} (${futureId}) - ${contractAddress}`); + } + } else if (result.status === "failed") { + console.log("Deployment failed"); + } else if (result.status === "hold") { + console.log("Deployment held"); + } + } catch (err) { + if (DISPLAY_UI) { + // display of error or on hold is done + // based on state, thrown error display + // can be ignored + process.exit(1); + } else { + throw err; + } + } + } + ); + task("plan") .addFlag("quiet", "Disables logging output path to terminal") .addPositionalParam("moduleNameOrPath") From 7e116d544128e6ad2126b882d8154f6d150358c2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 30 May 2023 03:17:49 -0400 Subject: [PATCH 0461/1302] refactor(new-api): add modulebuilder and context free validations Ports the previous validation phase, moving parts into module-builder and others into a module level validation phase. Validations that can be done based only on the input arguments are done by the module builder. Those that require more information, like the artifacts on disk, are done in the validation phase. Resolves #246 --- packages/core/src/new-api/deployer.ts | 23 +- .../src/new-api/internal/module-builder.ts | 149 ++++++++++- .../futures/validateArtifactContractAt.ts | 9 + .../validateArtifactContractDeployment.ts | 23 ++ .../validateArtifactLibraryDeployment.ts | 9 + .../futures/validateNamedContractAt.ts | 17 ++ .../futures/validateNamedContractCall.ts | 56 ++++ .../validateNamedContractDeployment.ts | 30 +++ .../futures/validateNamedLibraryDeployment.ts | 17 ++ .../futures/validateNamedStaticCall.ts | 65 +++++ .../futures/validateReadEventArgument.ts | 38 +++ .../validation/futures/validateSendData.ts | 9 + .../new-api/internal/validation/validate.ts | 46 ++++ packages/core/src/new-api/type-guards.ts | 50 ++++ packages/core/test/new-api/call.ts | 219 ++++++++++++++++ packages/core/test/new-api/contract.ts | 119 +++++++++ packages/core/test/new-api/contractAt.ts | 46 ++++ .../test/new-api/contractAtFromArtifact.ts | 56 +++- .../core/test/new-api/contractFromArtifact.ts | 121 ++++++++- packages/core/test/new-api/library.ts | 69 +++++ .../core/test/new-api/libraryFromArtifact.ts | 71 ++++- .../core/test/new-api/readEventArgument.ts | 64 ++++- .../futures/reconcileArtifactContractAt.ts | 8 +- .../reconcileArtifactContractDeployment.ts | 8 +- .../reconcileArtifactLibraryDeployment.ts | 8 +- packages/core/test/new-api/send.ts | 80 ++++++ packages/core/test/new-api/staticCall.ts | 243 ++++++++++++++++++ .../new-api/stored-deployment-serializer.ts | 29 ++- 28 files changed, 1652 insertions(+), 30 deletions(-) create mode 100644 packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts create mode 100644 packages/core/src/new-api/internal/validation/futures/validateSendData.ts create mode 100644 packages/core/src/new-api/internal/validation/validate.ts diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 275c10bfa6..fbc91e646d 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -13,6 +13,7 @@ import { ModuleConstructor } from "./internal/module-builder"; import { Reconciler } from "./internal/reconciliation/reconciler"; import { ExecutionStrategy } from "./internal/types/execution-engine"; import { ExecutionStateMap } from "./internal/types/execution-state"; +import { validate } from "./internal/validation/validate"; import { isAdapters } from "./type-guards"; import { Adapters } from "./types/adapters"; import { ArtifactResolver } from "./types/artifact"; @@ -30,25 +31,29 @@ export class Deployer { private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; private _transactionService: TransactionService; + private _artifactLoader: ArtifactResolver; private _strategy: ExecutionStrategy; constructor( - options: - | { journal: Journal; transactionService: TransactionService } + options: { journal: Journal; artifactLoader: ArtifactResolver } & ( + | { + transactionService: TransactionService; + } | { - journal: Journal; adapters: Adapters; - artifactLoader: ArtifactResolver; } + ) ) { this._journal = options.journal; this._strategy = new BasicExecutionStrategy(); - if ("adapters" in options && isAdapters(options.adapters)) { - if (options.artifactLoader === undefined) { - throw new IgnitionError("Artifact loader must be provided"); - } + if (options.artifactLoader === undefined) { + throw new IgnitionError("Artifact loader must be provided"); + } + this._artifactLoader = options.artifactLoader; + + if ("adapters" in options && isAdapters(options.adapters)) { const adapters: Adapters = options.adapters; this._transactionService = new TransactionServiceImplementation( options.artifactLoader, @@ -79,6 +84,8 @@ export class Deployer { ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); + await validate(module, this._artifactLoader); + const previousStateMap = await this._loadExecutionStateFrom(this._journal); const reconciliationResult = Reconciler.reconcile( diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 0b8e9af61e..95d6a097b3 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -2,7 +2,14 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionValidationError } from "../../errors"; -import { isFuture } from "../type-guards"; +import { + isAccountRuntimeValue, + isAddressResolvableFuture, + isArtifactType, + isContractFuture, + isFuture, + isModuleParameterRuntimeValue, +} from "../type-guards"; import { Artifact } from "../types/artifact"; import { AccountRuntimeValue, @@ -36,6 +43,7 @@ import { LibraryOptions, ReadEventArgumentOptions, SendDataOptions, + StaticCallOptions, } from "../types/module-builder"; import { @@ -163,7 +171,12 @@ export class IgnitionModuleBuilderImplementation< options.libraries ??= {}; options.value ??= BigInt(0); + /* validation start */ this._assertUniqueContractId(futureId); + this._assertValidLibraries(options.libraries, this.contract); + this._assertValidValue(options.value, this.contract); + this._assertValidFrom(options.from, this.contract); + /* validation end */ const future = new NamedContractDeploymentFutureImplementation( futureId, @@ -203,7 +216,13 @@ export class IgnitionModuleBuilderImplementation< options.libraries ??= {}; options.value ??= BigInt(0); + /* validation start */ this._assertUniqueArtifactContractId(futureId); + this._assertValidLibraries(options.libraries, this.contractFromArtifact); + this._assertValidValue(options.value, this.contractFromArtifact); + this._assertValidFrom(options.from, this.contractFromArtifact); + this._assertValidArtifact(artifact, this.contractFromArtifact); + /* validation end */ const future = new ArtifactContractDeploymentFutureImplementation( futureId, @@ -230,6 +249,8 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(libraryFuture); } + this._module.futures.add(future); + return future; } @@ -241,7 +262,11 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + /* validation start */ this._assertUniqueLibraryId(futureId); + this._assertValidLibraries(options.libraries, this.library); + this._assertValidFrom(options.from, this.library); + /* validation end */ const future = new NamedLibraryDeploymentFutureImplementation( futureId, @@ -273,7 +298,12 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; options.libraries ??= {}; + /* validation start */ this._assertUniqueArtifactLibraryId(futureId); + this._assertValidLibraries(options.libraries, this.libraryFromArtifact); + this._assertValidFrom(options.from, this.libraryFromArtifact); + this._assertValidArtifact(artifact, this.libraryFromArtifact); + /* validation end */ const future = new ArtifactLibraryDeploymentFutureImplementation( futureId, @@ -307,7 +337,12 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; options.value ??= BigInt(0); + /* validation start */ this._assertUniqueCallId(futureId); + this._assertValidValue(options.value, this.call); + this._assertValidFrom(options.from, this.call); + this._assertValidContract(contractFuture, this.call); + /* validation end */ const future = new NamedContractCallFutureImplementation( futureId, @@ -338,12 +373,16 @@ export class IgnitionModuleBuilderImplementation< contractFuture: ContractFuture, functionName: FunctionNameT, args: ArgumentType[] = [], - options: CallOptions = {} + options: StaticCallOptions = {} ): NamedStaticCallFuture { const id = options.id ?? functionName; const futureId = `${this._module.id}:${contractFuture.contractName}#${id}`; + /* validation start */ this._assertUniqueStaticCallId(futureId); + this._assertValidFrom(options.from, this.staticCall); + this._assertValidContract(contractFuture, this.staticCall); + /* validation end */ const future = new NamedStaticCallFutureImplementation( futureId, @@ -380,7 +419,10 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + /* validation start */ this._assertUniqueContractAtId(futureId); + this._assertValidAddress(address, this.contractAt); + /* validation end */ const future = new NamedContractAtFutureImplementation( futureId, @@ -397,8 +439,6 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(address); } - // TODO: Validate the the runtime value's default type is string - this._module.futures.add(future); return future; @@ -416,7 +456,11 @@ export class IgnitionModuleBuilderImplementation< const id = options.id ?? contractName; const futureId = `${this._module.id}:${id}`; + /* validation start */ this._assertUniqueContractAtFromArtifactId(futureId); + this._assertValidAddress(address, this.contractAtFromArtifact); + this._assertValidArtifact(artifact, this.contractAtFromArtifact); + /* validation end */ const future = new ArtifactContractAtFutureImplementation( futureId, @@ -434,8 +478,6 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(address); } - // TODO: Validate the the runtime value's default type is string - this._module.futures.add(future); return future; @@ -465,7 +507,9 @@ export class IgnitionModuleBuilderImplementation< const futureId = `${this._module.id}:${id}`; + /* validation start */ this._assertUniqueReadEventArgumentId(futureId); + /* validation end */ const future = new ReadEventArgumentFutureImplementation( futureId, @@ -495,14 +539,21 @@ export class IgnitionModuleBuilderImplementation< options: SendDataOptions = {} ): SendDataFuture { const futureId = `${this._module.id}:${options.id ?? id}`; + const val = value ?? BigInt(0); + /* validation start */ this._assertUniqueSendId(futureId); + this._assertValidAddress(to, this.send); + this._assertValidValue(val, this.send); + this._assertValidData(data, this.send); + this._assertValidFrom(options.from, this.send); + /* validation end */ const future = new SendDataFutureImplementation( futureId, this._module, to, - value ?? BigInt(0), + val, data, options.from ); @@ -511,8 +562,6 @@ export class IgnitionModuleBuilderImplementation< future.dependencies.add(to); } - // TODO: Validate the the runtime value's default type is string - for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -652,4 +701,86 @@ export class IgnitionModuleBuilderImplementation< this.send ); } + + private _assertValidLibraries( + libraries: Record>, + func: (...[]: any[]) => any + ) { + for (const [libraryName, libraryFuture] of Object.entries(libraries)) { + if (!isContractFuture(libraryFuture)) { + this._throwErrorWithStackTrace( + `Given library '${libraryName}' is not a valid Future`, + func + ); + } + } + } + + private _assertValidValue(value: bigint | any, func: (...[]: any[]) => any) { + if (typeof value !== "bigint") { + this._throwErrorWithStackTrace( + `Given value option '${value}' is not a \`bigint\``, + func + ); + } + } + + private _assertValidFrom( + from: string | AccountRuntimeValue | undefined, + func: (...[]: any[]) => any + ) { + if ( + !isAccountRuntimeValue(from) && + typeof from !== "string" && + from !== undefined + ) { + this._throwErrorWithStackTrace( + `Invalid type for given option "from": ${typeof from}`, + func + ); + } + } + + private _assertValidArtifact( + artifact: Artifact, + func: (...[]: any[]) => any + ) { + if (!isArtifactType(artifact)) { + this._throwErrorWithStackTrace(`Invalid artifact given`, func); + } + } + + private _assertValidContract( + contract: ContractFuture, + func: (...[]: any[]) => any + ) { + if (!isContractFuture(contract)) { + this._throwErrorWithStackTrace(`Invalid contract given`, func); + } + } + + private _assertValidAddress( + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + func: (...[]: any[]) => any + ) { + if ( + typeof address !== "string" && + !isModuleParameterRuntimeValue(address) && + !isAddressResolvableFuture(address) + ) { + this._throwErrorWithStackTrace(`Invalid address given`, func); + } + } + + private _assertValidData( + data: string | undefined, + func: (...[]: any[]) => any + ) { + if (typeof data !== "string" && data !== undefined) { + this._throwErrorWithStackTrace(`Invalid data given`, func); + } + } } diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts new file mode 100644 index 0000000000..a70282c69d --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts @@ -0,0 +1,9 @@ +import { ArtifactResolver } from "../../../types/artifact"; +import { ArtifactContractAtFuture } from "../../../types/module"; + +export async function validateArtifactContractAt( + _future: ArtifactContractAtFuture, + _artifactLoader: ArtifactResolver +) { + return; /* noop - nothing to validate here */ +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts new file mode 100644 index 0000000000..2dcb34383f --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -0,0 +1,23 @@ +import { ethers } from "ethers"; + +import { IgnitionValidationError } from "../../../../errors"; +import { ArtifactResolver } from "../../../types/artifact"; +import { ArtifactContractDeploymentFuture } from "../../../types/module"; + +export async function validateArtifactContractDeployment( + future: ArtifactContractDeploymentFuture, + artifactLoader: ArtifactResolver +) { + const artifact = await artifactLoader.load(future.contractName); + + const argsLength = future.constructorArgs.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + throw new IgnitionValidationError( + `The constructor of the contract '${future.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts new file mode 100644 index 0000000000..1916480bd0 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts @@ -0,0 +1,9 @@ +import { ArtifactResolver } from "../../../types/artifact"; +import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; + +export async function validateArtifactLibraryDeployment( + _future: ArtifactLibraryDeploymentFuture, + _artifactLoader: ArtifactResolver +) { + return; /* noop - nothing to validate here */ +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts new file mode 100644 index 0000000000..e051ca0562 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -0,0 +1,17 @@ +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { NamedContractAtFuture } from "../../../types/module"; + +export async function validateNamedContractAt( + future: NamedContractAtFuture, + artifactLoader: ArtifactResolver +) { + const artifact = await artifactLoader.load(future.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.contractName}' is invalid` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts new file mode 100644 index 0000000000..86cd43f44c --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -0,0 +1,56 @@ +import { ethers } from "ethers"; + +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { NamedContractCallFuture } from "../../../types/module"; + +export async function validateNamedContractCall( + future: NamedContractCallFuture, + artifactLoader: ArtifactResolver +) { + const artifact = + "artifact" in future.contract + ? future.contract.artifact + : await artifactLoader.load(future.contract.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.contract.contractName}' is invalid` + ); + } + + const argsLength = future.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + + const funcs = Object.entries(iface.functions) + .filter(([fname]) => fname === future.functionName) + .map(([, fragment]) => fragment); + + const functionFragments = iface.fragments + .filter((frag) => frag.name === future.functionName) + .concat(funcs); + + if (functionFragments.length === 0) { + throw new IgnitionValidationError( + `Contract '${future.contract.contractName}' doesn't have a function ${future.functionName}` + ); + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + throw new IgnitionValidationError( + `Function ${future.functionName} in contract ${future.contract.contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given` + ); + } else { + throw new IgnitionValidationError( + `Function ${future.functionName} in contract ${future.contract.contractName} is overloaded, but no overload expects ${argsLength} arguments` + ); + } + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts new file mode 100644 index 0000000000..c442e49020 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -0,0 +1,30 @@ +import { ethers } from "ethers"; + +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { NamedContractDeploymentFuture } from "../../../types/module"; + +export async function validateNamedContractDeployment( + future: NamedContractDeploymentFuture, + artifactLoader: ArtifactResolver +) { + const artifact = await artifactLoader.load(future.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.contractName}' is invalid` + ); + } + + const argsLength = future.constructorArgs.length; + + const iface = new ethers.utils.Interface(artifact.abi); + const expectedArgsLength = iface.deploy.inputs.length; + + if (argsLength !== expectedArgsLength) { + throw new IgnitionValidationError( + `The constructor of the contract '${future.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts new file mode 100644 index 0000000000..dfbe831836 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -0,0 +1,17 @@ +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { NamedLibraryDeploymentFuture } from "../../../types/module"; + +export async function validateNamedLibraryDeployment( + future: NamedLibraryDeploymentFuture, + artifactLoader: ArtifactResolver +) { + const artifact = await artifactLoader.load(future.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.contractName}' is invalid` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts new file mode 100644 index 0000000000..b455ecfc53 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -0,0 +1,65 @@ +import { ethers } from "ethers"; + +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { NamedStaticCallFuture } from "../../../types/module"; + +export async function validateNamedStaticCall( + future: NamedStaticCallFuture, + artifactLoader: ArtifactResolver +) { + const artifact = + "artifact" in future.contract + ? future.contract.artifact + : await artifactLoader.load(future.contract.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.contract.contractName}' is invalid` + ); + } + + const argsLength = future.args.length; + + const iface = new ethers.utils.Interface(artifact.abi); + + const funcs = Object.entries(iface.functions) + .filter(([fname]) => fname === future.functionName) + .map(([, fragment]) => fragment); + + const functionFragments = iface.fragments + .filter((frag) => frag.name === future.functionName) + .concat(funcs); + + if (functionFragments.length === 0) { + throw new IgnitionValidationError( + `Contract '${future.contract.contractName}' doesn't have a function ${future.functionName}` + ); + } + + const matchingFunctionFragments = functionFragments.filter( + (f) => f.inputs.length === argsLength + ); + + if (matchingFunctionFragments.length === 0) { + if (functionFragments.length === 1) { + throw new IgnitionValidationError( + `Function ${future.functionName} in contract ${future.contract.contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given` + ); + } else { + throw new IgnitionValidationError( + `Function ${future.functionName} in contract ${future.contract.contractName} is overloaded, but no overload expects ${argsLength} arguments` + ); + } + } + + const funcFrag = + matchingFunctionFragments[0] as ethers.utils.FunctionFragment; + + if (!funcFrag.constant) { + throw new IgnitionValidationError( + `Function ${future.functionName} in contract ${future.contract.contractName} is not 'pure' or 'view' and cannot be statically called` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts new file mode 100644 index 0000000000..abab1fccd8 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts @@ -0,0 +1,38 @@ +import { ethers } from "ethers"; + +import { IgnitionValidationError } from "../../../../errors"; +import { isArtifactType } from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { ReadEventArgumentFuture } from "../../../types/module"; + +export async function validateReadEventArgument( + future: ReadEventArgumentFuture, + artifactLoader: ArtifactResolver +) { + const artifact = + "artifact" in future.emitter + ? future.emitter.artifact + : await artifactLoader.load(future.emitter.contractName); + + if (!isArtifactType(artifact)) { + throw new IgnitionValidationError( + `Artifact for contract '${future.emitter.contractName}' is invalid` + ); + } + + const iface = new ethers.utils.Interface(artifact.abi); + + const events = Object.entries(iface.events) + .filter(([fname]) => fname === future.eventName) + .map(([, fragment]) => fragment); + + const eventFragments = iface.fragments + .filter((frag) => frag.name === future.eventName) + .concat(events); + + if (eventFragments.length === 0) { + throw new IgnitionValidationError( + `Contract '${future.emitter.contractName}' doesn't have an event ${future.eventName}` + ); + } +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts new file mode 100644 index 0000000000..49157815d8 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts @@ -0,0 +1,9 @@ +import { ArtifactResolver } from "../../../types/artifact"; +import { SendDataFuture } from "../../../types/module"; + +export async function validateSendData( + _future: SendDataFuture, + _artifactLoader: ArtifactResolver +) { + return; /* noop - nothing to validate here */ +} diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts new file mode 100644 index 0000000000..41fd20076e --- /dev/null +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -0,0 +1,46 @@ +import { ArtifactResolver } from "../../types/artifact"; +import { FutureType, IgnitionModule } from "../../types/module"; +import { getFuturesFromModule } from "../utils/get-futures-from-module"; + +import { validateArtifactContractAt } from "./futures/validateArtifactContractAt"; +import { validateArtifactContractDeployment } from "./futures/validateArtifactContractDeployment"; +import { validateArtifactLibraryDeployment } from "./futures/validateArtifactLibraryDeployment"; +import { validateNamedContractAt } from "./futures/validateNamedContractAt"; +import { validateNamedContractCall } from "./futures/validateNamedContractCall"; +import { validateNamedContractDeployment } from "./futures/validateNamedContractDeployment"; +import { validateNamedLibraryDeployment } from "./futures/validateNamedLibraryDeployment"; +import { validateNamedStaticCall } from "./futures/validateNamedStaticCall"; +import { validateReadEventArgument } from "./futures/validateReadEventArgument"; +import { validateSendData } from "./futures/validateSendData"; + +export async function validate( + module: IgnitionModule, + artifactLoader: ArtifactResolver +): Promise { + const futures = getFuturesFromModule(module); + + for (const future of futures) { + switch (future.type) { + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + return validateArtifactContractDeployment(future, artifactLoader); + case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + return validateArtifactLibraryDeployment(future, artifactLoader); + case FutureType.ARTIFACT_CONTRACT_AT: + return validateArtifactContractAt(future, artifactLoader); + case FutureType.NAMED_CONTRACT_DEPLOYMENT: + return validateNamedContractDeployment(future, artifactLoader); + case FutureType.NAMED_LIBRARY_DEPLOYMENT: + return validateNamedLibraryDeployment(future, artifactLoader); + case FutureType.NAMED_CONTRACT_AT: + return validateNamedContractAt(future, artifactLoader); + case FutureType.NAMED_CONTRACT_CALL: + return validateNamedContractCall(future, artifactLoader); + case FutureType.NAMED_STATIC_CALL: + return validateNamedStaticCall(future, artifactLoader); + case FutureType.READ_EVENT_ARGUMENT: + return validateReadEventArgument(future, artifactLoader); + case FutureType.SEND_DATA: + return validateSendData(future, artifactLoader); + } + } +} diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 5584561366..3ed726a7aa 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -1,11 +1,14 @@ import { Adapters } from "./types/adapters"; +import { Artifact } from "./types/artifact"; import { + AccountRuntimeValue, AddressResolvableFuture, ContractFuture, DeploymentFuture, FunctionCallFuture, Future, FutureType, + ModuleParameterRuntimeValue, NamedStaticCallFuture, RuntimeValue, RuntimeValueType, @@ -26,6 +29,26 @@ function isValidEnumValue( return theEnum[key] === value; } +/** + * Returns true if potential is of type Artifact. + * + * @beta + */ +export function isArtifactType(potential: unknown): potential is Artifact { + return ( + typeof potential === "object" && + potential !== null && + "contractName" in potential && + "bytecode" in potential && + "abi" in potential && + "linkReferences" in potential && + typeof potential.contractName === "string" && + typeof potential.bytecode === "string" && + Array.isArray(potential.abi) && + typeof potential.linkReferences === "object" + ); +} + /** * Returns true if potential is of type FutureType. * @@ -199,3 +222,30 @@ export function isAdapters(potential: unknown): potential is Adapters { "transactions" in potential ); } + +/** + * Returns true if potential is of type AccountRuntimeValue. + * + * @beta + */ +export function isAccountRuntimeValue( + potential: unknown +): potential is AccountRuntimeValue { + return ( + isRuntimeValue(potential) && potential.type === RuntimeValueType.ACCOUNT + ); +} + +/** + * Returns true if potential is of type ModuleParameterRuntimeValue. + * + * @beta + */ +export function isModuleParameterRuntimeValue( + potential: unknown +): potential is ModuleParameterRuntimeValue { + return ( + isRuntimeValue(potential) && + potential.type === RuntimeValueType.MODULE_PARAMETER + ); +} diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 4fb05301fd..63347fd9de 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -7,6 +8,8 @@ import { NamedContractCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateNamedContractCall } from "../../src/new-api/internal/validation/futures/validateNamedContractCall"; import { FutureType } from "../../src/new-api/types/module"; import { assertInstanceOf } from "./helpers"; @@ -477,4 +480,220 @@ describe("call", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-bignumber value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.call(another, "test", [], { value: 42 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given value option '42' is not a `bigint`/ + ); + }); + + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.call(another, "test", [], { from: 1 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + m.call(call as any, "test"); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid contract given/ + ); + }); + + it("should not validate a non-existant hardhat contract", async () => { + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + m.call(another, "test"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall(future as any, { + load: async () => ({} as any), + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + + it("should not validate a non-existant function", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall(future as any, { + load: async () => fakeArtifact, + }), + /Contract 'Another' doesn't have a function test/ + ); + }); + + it("should not validate a call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "inc", [1, 2]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall(future as any, { + load: async () => fakeArtifact, + }), + /Function inc in contract Another expects 1 arguments but 2 were given/ + ); + }); + + it("should not validate an overloaded call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "inc", [1, 2, 3]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall(future as any, { + load: async () => fakeArtifact, + }), + /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index f7191c2e24..c0b8a527c2 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -7,6 +8,8 @@ import { NamedContractDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateNamedContractDeployment } from "../../src/new-api/internal/validation/futures/validateNamedContractDeployment"; import { FutureType } from "../../src/new-api/types/module"; import { assertInstanceOf } from "./helpers"; @@ -471,4 +474,120 @@ describe("contract", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-bignumber value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { value: 42 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given value option '42' is not a `bigint`/ + ); + }); + + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { from: 1 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract library", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + const test = m.contract("Test", [], { + libraries: { Call: call as any }, + }); + + return { another, test }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given library 'Call' is not a valid Future/ + ); + }); + + it("should not validate an invalid artifact", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another"); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment(future as any, { + load: async () => ({} as any), + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + + it("should not validate an incorrect number of constructor args", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const contract1 = m.contract("Test", [1, 2, 3]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment(future as any, { + load: async () => fakeArtifact, + }), + /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index fb3c46f0e3..738776617e 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -3,6 +3,8 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateNamedContractAt } from "../../src/new-api/internal/validation/futures/validateNamedContractAt"; import { assertInstanceOf } from "./helpers"; @@ -229,4 +231,48 @@ describe("contractAt", () => { ); }); }); + + describe("validation", () => { + it("should not validate an invalid address", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractAt("Another", 42 as any); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid address given/ + ); + }); + + it("should not validate an invalid artifact", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractAt("Another", ""); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractAt(future as any, { + load: async () => fakeArtifact, + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index 27382d8b14..b59728ea6e 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -1,13 +1,19 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { assertInstanceOf } from "./helpers"; -describe("contractAtFromArtifactFromArtifact", () => { - const fakeArtifact: any = {}; +describe("contractAtFromArtifact", () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifactDefinition = defineModule( @@ -246,4 +252,50 @@ describe("contractAtFromArtifactFromArtifact", () => { ); }); }); + + describe("validation", () => { + it("should not validate an invalid address", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractAtFromArtifact( + "Another", + 42 as any, + fakeArtifact + ); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid address given/ + ); + }); + + it("should not validate an invalid artifact", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractAtFromArtifact( + "Another", + "", + {} as Artifact + ); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid artifact given/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index a5ea9f6613..dbd00ad772 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -7,11 +8,18 @@ import { ModuleParameterRuntimeValueImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateArtifactContractDeployment } from "../../src/new-api/internal/validation/futures/validateArtifactContractDeployment"; import { assertInstanceOf } from "./helpers"; describe("contractFromArtifact", () => { - const fakeArtifact: any = {}; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should be able to deploy with a contract based on an artifact", () => { const moduleWithContractFromArtifactDefinition = defineModule( @@ -515,4 +523,115 @@ describe("contractFromArtifact", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-bignumber value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + value: 42 as any, + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given value option '42' is not a `bigint`/ + ); + }); + + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + from: 1 as any, + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract library", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + const test = m.contractFromArtifact("Test", fakeArtifact, [], { + libraries: { Call: call as any }, + }); + + return { another, test }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given library 'Call' is not a valid Future/ + ); + }); + + it("should not validate an invalid artifact", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", {} as Artifact, []); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid artifact given/ + ); + }); + + it("should not validate an incorrect number of constructor args", async () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const contract1 = m.contractFromArtifact( + "Test", + fakeArtifact, + [1, 2, 3] + ); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateArtifactContractDeployment(future as any, { + load: async () => fakeArtifact, + }), + /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 2c5ad1dc0f..4e148cca90 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -6,6 +6,8 @@ import { NamedLibraryDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateNamedLibraryDeployment } from "../../src/new-api/internal/validation/futures/validateNamedLibraryDeployment"; import { FutureType } from "../../src/new-api/types/module"; import { assertInstanceOf } from "./helpers"; @@ -247,4 +249,71 @@ describe("library", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { from: 1 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract library", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + const test = m.library("Test", { + libraries: { Call: call as any }, + }); + + return { another, test }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given library 'Call' is not a valid Future/ + ); + }); + + it("should not validate an invalid artifact", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.library("Another"); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedLibraryDeployment(future as any, { + load: async () => ({} as any), + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 353df81df9..0dd8bd9a26 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -10,7 +11,12 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { assertInstanceOf } from "./helpers"; describe("libraryFromArtifact", () => { - const fakeArtifact: any = {}; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should be able to deploy with a library based on an artifact", () => { const moduleWithContractFromArtifactDefinition = defineModule( @@ -261,4 +267,67 @@ describe("libraryFromArtifact", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.libraryFromArtifact("Another", fakeArtifact, { + from: 1 as any, + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract library", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + const test = m.libraryFromArtifact("Test", fakeArtifact, { + libraries: { Call: call as any }, + }); + + return { another, test }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given library 'Call' is not a valid Future/ + ); + }); + + it("should not validate an invalid artifact", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.libraryFromArtifact("Another", {} as Artifact); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid artifact given/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 73ffd58a9e..fa42199674 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -1,13 +1,20 @@ import { assert } from "chai"; -import { FutureType, ReadEventArgumentFuture } from "../../src"; +import { Artifact, FutureType, ReadEventArgumentFuture } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateReadEventArgument } from "../../src/new-api/internal/validation/futures/validateReadEventArgument"; describe("Read event argument", () => { describe("creating modules with it", () => { it("should support reading arguments from all the futures that can emit them", () => { - const fakeArtifact = {} as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; const defintion = defineModule("Module1", (m) => { const contract = m.contract("Contract"); @@ -207,4 +214,57 @@ describe("Read event argument", () => { assert.include(futuresIds, "Module1:second"); }); }); + + describe("validation", () => { + it("should not validate a non-existant hardhat contract", async () => { + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + m.readEventArgument(another, "test", "arg"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.READ_EVENT_ARGUMENT + ); + + await assert.isRejected( + validateReadEventArgument(future as any, { + load: async () => ({} as any), + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + + it("should not validate a non-existant event", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.readEventArgument(another, "test", "arg"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.READ_EVENT_ARGUMENT + ); + + await assert.isRejected( + validateReadEventArgument(future as any, { + load: async () => fakeArtifact, + }), + /Contract 'Another' doesn't have an event test/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index 6722deb565..813b0b395b 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../../../src"; import { defineModule } from "../../../../src/new-api/define-module"; import { ContractAtExecutionState, @@ -12,7 +13,12 @@ import { FutureType } from "../../../../src/new-api/types/module"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - artifact contract at", () => { - const fakeArtifact = ["Fake artifact"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index e5f3ad5fcf..a4230daa47 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../../../src"; import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, @@ -14,7 +15,12 @@ import { } from "../helpers"; describe("Reconciliation - artifact contract", () => { - const fakeArtifact = ["Fake artifact"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 76f18d821f..1d98613e40 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../../../src"; import { defineModule } from "../../../../src/new-api/define-module"; import { DeploymentExecutionState, @@ -14,7 +15,12 @@ import { } from "../helpers"; describe("Reconciliation - artifact library", () => { - const fakeArtifact = ["Fake artifact"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 79cfc7065b..e8ba6a647b 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -290,4 +290,84 @@ describe("send", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-bignumber value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.send("id", "test", 42 as any); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Given value option '42' is not a `bigint`/ + ); + }); + + it("should not validate a non-string data option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.send("id", "test", 0n, 42 as any); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid data given/ + ); + }); + + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.send("id", another, 0n, "", { from: 1 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate an invalid address", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + m.send("id", call as any, 0n, ""); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid address given/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index fdc116f51b..ec2ace830b 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -8,6 +9,8 @@ import { NamedStaticCallFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateNamedStaticCall } from "../../src/new-api/internal/validation/futures/validateNamedStaticCall"; import { FutureType } from "../../src/new-api/types/module"; import { assertInstanceOf } from "./helpers"; @@ -482,4 +485,244 @@ describe("static call", () => { ); }); }); + + describe("validation", () => { + it("should not validate a non-address from option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + m.staticCall(another, "test", [], { from: 1 as any }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid type for given option "from": number/ + ); + }); + + it("should not validate a non-contract", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + m.staticCall(call as any, "test"); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + + assert.throws( + () => constructor.construct(moduleWithDependentContractsDefinition), + /Invalid contract given/ + ); + }); + + it("should not validate a non-existant hardhat contract", async () => { + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + m.staticCall(another, "test"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall(future as any, { + load: async () => ({} as any), + }), + /Artifact for contract 'Another' is invalid/ + ); + }); + + it("should not validate a non-existant function", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.staticCall(another, "test"); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall(future as any, { + load: async () => fakeArtifact, + }), + /Contract 'Another' doesn't have a function test/ + ); + }); + + it("should not validate a static call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.staticCall(another, "inc", [1, 2]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall(future as any, { + load: async () => fakeArtifact, + }), + /Function inc in contract Another expects 1 arguments but 2 were given/ + ); + }); + + it("should not validate an overloaded call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.staticCall(another, "inc", [1, 2, 3]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall(future as any, { + load: async () => fakeArtifact, + }), + /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ + ); + }); + + it("should not validate a non-readonly function", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.staticCall(another, "inc", [1]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall(future as any, { + load: async () => fakeArtifact, + }), + /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ + ); + }); + }); }); diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 2fd9d7b368..8b3e44a58d 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ArtifactContractDeploymentFutureImplementation, @@ -62,7 +63,12 @@ describe("stored deployment serializer", () => { }); describe("contractFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should serialize a contractFromArtifact deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -164,7 +170,12 @@ describe("stored deployment serializer", () => { }); describe("contractAtFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should serialize a contractAt", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -242,7 +253,12 @@ describe("stored deployment serializer", () => { }); describe("library", () => { - const fakeArtifact = ["FAKE ARTIFACT"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should serialize a library deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { @@ -329,7 +345,12 @@ describe("stored deployment serializer", () => { }); describe("libraryFromArtifact", () => { - const fakeArtifact = ["FAKE ARTIFACT"] as any; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should serialize a libraryFromArtifact deployment", () => { const moduleDefinition = defineModule("Module1", (m) => { From 36587bb46c135c4b8cc2a15362d7094b9393f2a1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 19 Jun 2023 12:02:55 +0100 Subject: [PATCH 0462/1302] refactor: split safeToString Replace `safeToString` with specific functions for converting values to strings usable in error descriptions. --- .../internal/execution/execution-engine.ts | 6 ++++-- .../reconciliation/execution-state-resolver.ts | 6 +++--- .../reconcileArtifactContractDeployment.ts | 6 +++--- .../reconcileArtifactLibraryDeployment.ts | 6 +++--- .../futures/reconcileNamedContractCall.ts | 6 +++--- .../reconcileNamedContractDeployment.ts | 6 +++--- .../futures/reconcileNamedLibraryDeployment.ts | 6 +++--- .../futures/reconcileNamedStaticCall.ts | 6 +++--- .../futures/reconcileSendData.ts | 4 ++-- .../new-api/internal/reconciliation/utils.ts | 18 ++++++++++++------ 10 files changed, 39 insertions(+), 31 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 957f442c18..66b8c726a0 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -14,7 +14,7 @@ import { FutureType, RuntimeValueType, } from "../../types/module"; -import { safeToString } from "../reconciliation/utils"; +import { accountRuntimeValueToErrorString } from "../reconciliation/utils"; import { ExecutionEngineState } from "../types/execution-engine"; import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; @@ -140,7 +140,9 @@ export class ExecutionEngine { } throw new IgnitionError( - `Unable to resolve address: ${safeToString(potential)} ` + `Unable to resolve address: ${accountRuntimeValueToErrorString( + potential + )} ` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 903fcf4bb5..d7ce845a0c 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -27,7 +27,7 @@ import { assertIgnitionInvariant } from "../utils/assertions"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { ReconciliationContext } from "./types"; -import { resolveModuleParameter, safeToString } from "./utils"; +import { moduleParameterToErrorString, resolveModuleParameter } from "./utils"; // TODO: consider merging this into the execution state map export class ExecutionStateResolver { @@ -150,7 +150,7 @@ export class ExecutionStateResolver { typeof runtimeValue === "string" && isAddress(runtimeValue), `Module parameter ${address.moduleId}/${ address.name - } is not a usable address ${safeToString(runtimeValue)}` + } is not a usable address ${moduleParameterToErrorString(runtimeValue)}` ); return runtimeValue; @@ -186,7 +186,7 @@ export class ExecutionStateResolver { if (typeof runtimeValue !== "string" || !isAddress(runtimeValue)) { throw new IgnitionError( - `To runtime value is not a usable address ${safeToString( + `To runtime value is not a usable address ${moduleParameterToErrorString( runtimeValue )}` ); diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index a4e56ac6b4..f3e1bb29d3 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -4,7 +4,7 @@ import { ArtifactContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileArtifactContractDeployment( future: ArtifactContractDeploymentFuture, @@ -47,9 +47,9 @@ export function reconcileArtifactContractDeployment( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 4474c11f0d..6274ba1480 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -4,7 +4,7 @@ import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileArtifactLibraryDeployment( future: ArtifactLibraryDeploymentFuture, @@ -32,9 +32,9 @@ export function reconcileArtifactLibraryDeployment( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 0520b64cdc..b40ebee89a 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -4,7 +4,7 @@ import { NamedContractCallFuture } from "../../../types/module"; import { CallExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileNamedContractCall( future: NamedContractCallFuture, @@ -50,9 +50,9 @@ export function reconcileNamedContractCall( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 4bd6e350ca..49e11e1e3f 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -4,7 +4,7 @@ import { NamedContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileNamedContractDeployment( future: NamedContractDeploymentFuture, @@ -47,9 +47,9 @@ export function reconcileNamedContractDeployment( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 965b0e6fa6..4e94cd6b3b 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -4,7 +4,7 @@ import { NamedLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, @@ -32,9 +32,9 @@ export function reconcileNamedLibraryDeployment( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index 2f4caf3ce2..1df65af2fb 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -4,7 +4,7 @@ import { NamedStaticCallFuture } from "../../../types/module"; import { StaticCallExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileNamedStaticCall( future: NamedStaticCallFuture, @@ -43,9 +43,9 @@ export function reconcileNamedStaticCall( if (!isEqual(fromAddress, executionState.from)) { return fail( future, - `From account has been changed from ${safeToString( + `From account has been changed from ${addressToErrorString( executionState.from - )} to ${safeToString(fromAddress)}` + )} to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index 40db7baa73..8c16fd4140 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -4,7 +4,7 @@ import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail, resolveFromAddress, safeToString } from "../utils"; +import { addressToErrorString, fail, resolveFromAddress } from "../utils"; export function reconcileSendData( future: SendDataFuture, @@ -45,7 +45,7 @@ export function reconcileSendData( future, `From account has been changed from ${ executionState.from ?? "undefined" - } to ${safeToString(fromAddress)}` + } to ${addressToErrorString(fromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 728a58c200..f9e05b93a0 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -101,14 +101,20 @@ export function resolveModuleParameter( return moduleParamValue; } -export function safeToString(potential: unknown) { +export function accountRuntimeValueToErrorString( + potential: AccountRuntimeValue +) { + return JSON.stringify(potential); +} + +export function moduleParameterToErrorString(potential: ModuleParameterType) { + return JSON.stringify(potential); +} + +export function addressToErrorString(potential: string | undefined) { if (potential === undefined) { return "undefined"; } - if (typeof potential === "string") { - return potential; - } - - return JSON.stringify(potential); + return potential; } From 0a80ed9c32fef5675e96cb3320a85a8512948fbd Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 19 Jun 2023 12:31:03 +0100 Subject: [PATCH 0463/1302] refactor: add invariant on execution-status Add a check to enforce deployment status is returned. --- .../internal/execution/executionStateReducer.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 6bfacdc326..f33cd31478 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,3 +1,4 @@ +import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isDeploymentType } from "../../type-guards"; import { FutureStart, JournalableMessage } from "../../types/journal"; import { @@ -6,6 +7,7 @@ import { ExecutionStateMap, ExecutionStatus, } from "../types/execution-state"; +import { assertIgnitionInvariant } from "../utils/assertions"; export function executionStateReducer( executionStateMap: ExecutionStateMap, @@ -19,8 +21,16 @@ export function executionStateReducer( } if (action.type === "execution-success") { - const updatedExecutionState: DeploymentExecutionState = { - ...(executionStateMap[action.futureId] as DeploymentExecutionState), + const previousDeploymentExecutionState = executionStateMap[action.futureId]; + + assertIgnitionInvariant( + previousDeploymentExecutionState !== undefined && + isDeploymentExecutionState(previousDeploymentExecutionState), + "TBD - only deployment state is currently implemented for execution success" + ); + + const updatedExecutionState: ExecutionState = { + ...previousDeploymentExecutionState, status: ExecutionStatus.SUCCESS, contractAddress: action.contractAddress, }; From 52e93378f1c8d81b6755e1febe5830d9292086a3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 19 Jun 2023 12:41:43 +0100 Subject: [PATCH 0464/1302] refactor: ensure all journal messages names end in 'Message' --- .../internal/execution/execution-engine.ts | 14 ++++++------ .../internal/execution/execution-strategy.ts | 12 +++++----- .../execution/executionStateReducer.ts | 6 +++-- .../src/new-api/internal/execution/guards.ts | 18 +++++++-------- .../transactions/transaction-service.ts | 16 +++++++------- .../internal/types/execution-engine.ts | 8 +++---- packages/core/src/new-api/types/journal.ts | 22 ++++++++++--------- .../src/new-api/types/transaction-service.ts | 6 +++-- 8 files changed, 54 insertions(+), 48 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 66b8c726a0..cd1b3efb72 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -3,9 +3,9 @@ import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isRuntimeValue } from "../../type-guards"; import { DeploymentResult } from "../../types/deployer"; import { - ExecutionResult, - FutureRestart, - FutureStart, + ExecutionResultMessage, + FutureRestartMessage, + FutureStartMessage, JournalableMessage, } from "../../types/journal"; import { @@ -69,7 +69,7 @@ export class ExecutionEngine { private async _executeBatchEntry( future: Future, state: ExecutionEngineState - ): Promise { + ): Promise { let current: JournalableMessage = this._startOrRestartFor(future, state); await this._apply(state, current); @@ -99,7 +99,7 @@ export class ExecutionEngine { private _startOrRestartFor( future: Future, state: ExecutionEngineState - ): FutureStart | FutureRestart { + ): FutureStartMessage | FutureRestartMessage { const executionState = state.executionStateMap[future.id]; if (executionState === undefined) { @@ -149,13 +149,13 @@ export class ExecutionEngine { private _initCommandFor( future: Future, { accounts }: { executionStateMap: ExecutionStateMap; accounts: string[] } - ): FutureStart { + ): FutureStartMessage { const strategy = "basic"; switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: case FutureType.NAMED_CONTRACT_DEPLOYMENT: - const state: FutureStart = { + const state: FutureStartMessage = { type: "execution-start", futureId: future.id, futureType: future.type, diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 35e01832ed..249db7e492 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -3,8 +3,8 @@ import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { DeployedContractExecutionSuccess, JournalableMessage, - OnchainInteraction, - OnchainResult, + OnchainInteractionMessage, + OnchainResultMessage, } from "../../types/journal"; import { ExecutionStrategy } from "../types/execution-engine"; import { @@ -23,9 +23,9 @@ export class BasicExecutionStrategy }: { executionState: ExecutionState; }): AsyncGenerator< - OnchainInteraction, + OnchainInteractionMessage, JournalableMessage, - OnchainResult | null + OnchainResultMessage | null > { if (!isDeploymentExecutionState(executionState)) { throw new IgnitionError( @@ -41,9 +41,9 @@ export class BasicExecutionStrategy }: { executionState: DeploymentExecutionState; }): AsyncGenerator< - OnchainInteraction, + OnchainInteractionMessage, JournalableMessage, - OnchainResult | null + OnchainResultMessage | null > { const result = yield { type: "onchain-action", diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index f33cd31478..2308119e3c 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,6 +1,6 @@ import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isDeploymentType } from "../../type-guards"; -import { FutureStart, JournalableMessage } from "../../types/journal"; +import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { DeploymentExecutionState, ExecutionState, @@ -44,7 +44,9 @@ export function executionStateReducer( return executionStateMap; } -function initialiseExecutionStateFor(futureStart: FutureStart): ExecutionState { +function initialiseExecutionStateFor( + futureStart: FutureStartMessage +): ExecutionState { if (!isDeploymentType(futureStart.futureType)) { throw new Error("Not implemented yet in the reducer"); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index e0ae77ad49..0cd61fb892 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -1,15 +1,15 @@ import { - DeployContractInteraction, - ExecutionResult, + DeployContractInteractionMessage, + ExecutionResultMessage, ExecutionResultTypes, JournalableMessage, - OnchainInteraction, - OnchainResult, + OnchainInteractionMessage, + OnchainResultMessage, } from "../../types/journal"; export function isExecutionResult( potential: JournalableMessage -): potential is ExecutionResult { +): potential is ExecutionResultMessage { const resultTypes: ExecutionResultTypes = [ "execution-success", "execution-failure", @@ -21,13 +21,13 @@ export function isExecutionResult( export function isExecutionMessage( potential: JournalableMessage -): potential is ExecutionResult { +): potential is ExecutionResultMessage { return isExecutionResult(potential); } export function isOnChainAction( potential: JournalableMessage -): potential is OnchainInteraction { +): potential is OnchainInteractionMessage { const resultTypes = ["onchain-action"]; return resultTypes.includes(potential.type); @@ -35,7 +35,7 @@ export function isOnChainAction( export function isOnchainResult( potential: JournalableMessage -): potential is OnchainResult { +): potential is OnchainResultMessage { const resultTypes = ["onchain-result"]; return resultTypes.includes(potential.type); @@ -43,6 +43,6 @@ export function isOnchainResult( export function isDeployContractInteraction( potential: JournalableMessage -): potential is DeployContractInteraction { +): potential is DeployContractInteractionMessage { return isOnChainAction(potential) && potential.subtype === "deploy-contract"; } diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index a10879ba41..a8c9b57153 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -1,10 +1,10 @@ import { IgnitionError } from "../../../../errors"; import { ArtifactResolver } from "../../../types/artifact"; import { - DeployContractInteraction, - DeployContractResult, - OnchainInteraction, - OnchainResult, + DeployContractInteractionMessage, + DeployContractResultMessage, + OnchainInteractionMessage, + OnchainResultMessage, } from "../../../types/journal"; import { TransactionService } from "../../../types/transaction-service"; import { isDeployContractInteraction } from "../guards"; @@ -23,8 +23,8 @@ export class TransactionServiceImplementation implements TransactionService { ) {} public async onchain( - interaction: OnchainInteraction - ): Promise { + interaction: OnchainInteractionMessage + ): Promise { if (!isDeployContractInteraction(interaction)) { throw new IgnitionError( "Transaction service not implemented for this interaction" @@ -35,8 +35,8 @@ export class TransactionServiceImplementation implements TransactionService { } private async _dispatchDeployContract( - deployContractInteraction: DeployContractInteraction - ): Promise { + deployContractInteraction: DeployContractInteractionMessage + ): Promise { // TODO: consider replacing this with a registry of artifacts const artifact = await this._artifactLoader.load( deployContractInteraction.contractName diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 16a6e9bdfe..dd5c0d5b45 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,8 +1,8 @@ import { Journal, JournalableMessage, - OnchainInteraction, - OnchainResult, + OnchainInteractionMessage, + OnchainResultMessage, } from "../../types/journal"; import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; import { TransactionService } from "../../types/transaction-service"; @@ -25,8 +25,8 @@ export interface ExecutionStrategy { }: { executionState: ExecutionState; }) => AsyncGenerator< - OnchainInteraction, + OnchainInteractionMessage, JournalableMessage, - OnchainResult | null + OnchainResultMessage | null >; } diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 8362d69c85..0c7eb3b1d9 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -25,7 +25,9 @@ export type JournalableMessage = TransactionMessage | ExecutionMessage; * * @beta */ -export type TransactionMessage = OnchainInteraction | OnchainResult; +export type TransactionMessage = + | OnchainInteractionMessage + | OnchainResultMessage; // #region "OnchainInteraction" @@ -34,14 +36,14 @@ export type TransactionMessage = OnchainInteraction | OnchainResult; * * @beta */ -export type OnchainInteraction = DeployContractInteraction; +export type OnchainInteractionMessage = DeployContractInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. * * @beta */ -export interface DeployContractInteraction { +export interface DeployContractInteractionMessage { value: string; args: ArgumentType[]; from: string; @@ -59,14 +61,14 @@ export interface DeployContractInteraction { * * @beta */ -export type OnchainResult = DeployContractResult; +export type OnchainResultMessage = DeployContractResultMessage; /** * A successful deploy contract transaction result. * * @beta */ -export interface DeployContractResult { +export interface DeployContractResultMessage { type: "onchain-result"; subtype: "deploy-contract"; contractAddress: string; @@ -83,7 +85,7 @@ export interface DeployContractResult { * * @beta */ -export type ExecutionMessage = FutureExecutionUpdate | ExecutionResult; +export type ExecutionMessage = ExecutionUpdateMessage | ExecutionResultMessage; // #region "FutureExecutionUpdate" @@ -92,14 +94,14 @@ export type ExecutionMessage = FutureExecutionUpdate | ExecutionResult; * * @beta */ -export type FutureExecutionUpdate = FutureStart | FutureRestart; +export type ExecutionUpdateMessage = FutureStartMessage | FutureRestartMessage; /** * A journal message to initialise the execution state for a future. * * @beta */ -export interface FutureStart { +export interface FutureStartMessage { type: "execution-start"; futureId: string; futureType: FutureType; @@ -119,7 +121,7 @@ export interface FutureStart { * * @beta */ -export interface FutureRestart { +export interface FutureRestartMessage { type: "execution-restart"; futureId: string; } @@ -133,7 +135,7 @@ export interface FutureRestart { * * @beta */ -export type ExecutionResult = +export type ExecutionResultMessage = | ExecutionSuccess | ExecutionFailure | ExecutionHold; diff --git a/packages/core/src/new-api/types/transaction-service.ts b/packages/core/src/new-api/types/transaction-service.ts index f82239533a..53c16125cb 100644 --- a/packages/core/src/new-api/types/transaction-service.ts +++ b/packages/core/src/new-api/types/transaction-service.ts @@ -1,4 +1,4 @@ -import { OnchainInteraction, OnchainResult } from "./journal"; +import { OnchainInteractionMessage, OnchainResultMessage } from "./journal"; /** * A service for managing on-chain interactions as part of the deployment. @@ -6,5 +6,7 @@ import { OnchainInteraction, OnchainResult } from "./journal"; * @beta */ export interface TransactionService { - onchain(interaction: OnchainInteraction): Promise; + onchain( + interaction: OnchainInteractionMessage + ): Promise; } From f9face72d40fa15758c24bf75f70ce3ec1cd7e42 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 19 Jun 2023 12:57:01 +0100 Subject: [PATCH 0465/1302] refactor: remove old execution-engine file --- packages/core/src/new-api/internal/execution-engine.ts | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 packages/core/src/new-api/internal/execution-engine.ts diff --git a/packages/core/src/new-api/internal/execution-engine.ts b/packages/core/src/new-api/internal/execution-engine.ts deleted file mode 100644 index 18929bc532..0000000000 --- a/packages/core/src/new-api/internal/execution-engine.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { ExecutionEngineState } from "./types/execution-engine"; - -export class ExecutionEngine { - public execute(_preparedExecution: ExecutionEngineState) { - throw new Error("Method not implemented."); - } -} From 3b80cf73f65e21e1d4a243dc6ca26f0a2d18e4f5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 19 Jun 2023 13:18:13 +0100 Subject: [PATCH 0466/1302] refactor: remove debugging try/catch --- packages/core/src/new-api/journal.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/core/src/new-api/journal.ts b/packages/core/src/new-api/journal.ts index adac6aebda..8b7329c489 100644 --- a/packages/core/src/new-api/journal.ts +++ b/packages/core/src/new-api/journal.ts @@ -11,11 +11,7 @@ export class MemoryJournal implements Journal { private messages: string[] = []; public async record(message: JournalableMessage): Promise { - try { - this.messages.push(JSON.stringify(message)); - } catch (err) { - console.error(err, message); - } + this.messages.push(JSON.stringify(message)); } public async *read(): AsyncGenerator { From 545cb23f2205430d32c6db3b65b3260c0807e26b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 15 Jun 2023 22:53:41 -0400 Subject: [PATCH 0467/1302] added a new example to test execution --- examples/complete/.eslintrc.js | 14 ++ examples/complete/.gitignore | 11 ++ examples/complete/.prettierignore | 5 + examples/complete/README.md | 19 +++ examples/complete/contracts/BasicContract.sol | 18 +++ examples/complete/contracts/BasicLibrary.sol | 8 ++ .../contracts/ContractWithLibrary.sol | 12 ++ examples/complete/hardhat.config.js | 7 + examples/complete/ignition/CompleteModule.js | 41 ++++++ .../complete/libArtifacts/BasicLibrary.json | 30 ++++ .../libArtifacts/ContractWithLibrary.json | 48 +++++++ examples/complete/package.json | 17 +++ examples/complete/test/Complete.js | 132 ++++++++++++++++++ package-lock.json | 12 ++ 14 files changed, 374 insertions(+) create mode 100644 examples/complete/.eslintrc.js create mode 100644 examples/complete/.gitignore create mode 100644 examples/complete/.prettierignore create mode 100644 examples/complete/README.md create mode 100644 examples/complete/contracts/BasicContract.sol create mode 100644 examples/complete/contracts/BasicLibrary.sol create mode 100644 examples/complete/contracts/ContractWithLibrary.sol create mode 100644 examples/complete/hardhat.config.js create mode 100644 examples/complete/ignition/CompleteModule.js create mode 100644 examples/complete/libArtifacts/BasicLibrary.json create mode 100644 examples/complete/libArtifacts/ContractWithLibrary.json create mode 100644 examples/complete/package.json create mode 100644 examples/complete/test/Complete.js diff --git a/examples/complete/.eslintrc.js b/examples/complete/.eslintrc.js new file mode 100644 index 0000000000..8457c86dfe --- /dev/null +++ b/examples/complete/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/complete/.gitignore b/examples/complete/.gitignore new file mode 100644 index 0000000000..71f6a160fc --- /dev/null +++ b/examples/complete/.gitignore @@ -0,0 +1,11 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + diff --git a/examples/complete/.prettierignore b/examples/complete/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/complete/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/complete/README.md b/examples/complete/README.md new file mode 100644 index 0000000000..c5ea3d4cdd --- /dev/null +++ b/examples/complete/README.md @@ -0,0 +1,19 @@ +# Complete Example for Ignition + +This is a bit of a contrived example project, intended mostly to ensure working end-to-end functionality across the API. + +## Deploying + +To run the ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat deploy CompleteModule.js +``` + +## Test + +To run the hardhat tests using ignition: + +```shell +npm run test +``` diff --git a/examples/complete/contracts/BasicContract.sol b/examples/complete/contracts/BasicContract.sol new file mode 100644 index 0000000000..078708c25e --- /dev/null +++ b/examples/complete/contracts/BasicContract.sol @@ -0,0 +1,18 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract BasicContract { + event BasicEvent(uint eventArg); + + receive () external payable {} + + function basicFunction(uint funcArg) public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + emit BasicEvent(funcArg); + } +} diff --git a/examples/complete/contracts/BasicLibrary.sol b/examples/complete/contracts/BasicLibrary.sol new file mode 100644 index 0000000000..04a69a8d95 --- /dev/null +++ b/examples/complete/contracts/BasicLibrary.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +library BasicLibrary { + function addTwo(uint self) public pure returns (uint) { + return self + 2; + } +} diff --git a/examples/complete/contracts/ContractWithLibrary.sol b/examples/complete/contracts/ContractWithLibrary.sol new file mode 100644 index 0000000000..4709663489 --- /dev/null +++ b/examples/complete/contracts/ContractWithLibrary.sol @@ -0,0 +1,12 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +import './BasicLibrary.sol'; + +using BasicLibrary for uint; + +contract ContractWithLibrary { + function readonlyFunction(uint num) public pure returns (uint) { + return num.addTwo(); + } +} diff --git a/examples/complete/hardhat.config.js b/examples/complete/hardhat.config.js new file mode 100644 index 0000000000..25f05d06a5 --- /dev/null +++ b/examples/complete/hardhat.config.js @@ -0,0 +1,7 @@ +require("@nomicfoundation/hardhat-toolbox"); +require("@ignored/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.17", +}; diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js new file mode 100644 index 0000000000..3dd057af7c --- /dev/null +++ b/examples/complete/ignition/CompleteModule.js @@ -0,0 +1,41 @@ +// ./ignition/CompleteModule.js +const { defineModule } = require("@ignored/hardhat-ignition"); + +const withLibArtifact = require("../libArtifacts/ContractWithLibrary.json"); +const libArtifact = require("../libArtifacts/BasicLibrary.json"); + +module.exports = defineModule("CompleteModule", (m) => { + const basic = m.contract("BasicContract"); + // const library = m.library("BasicLibrary"); + // const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact); + // const withLib = m.contractFromArtifact( + // "ContractWithLibrary", + // withLibArtifact, + // [], + // { + // libraries: { BasicLibrary: library }, + // } + // ); + + // const call = m.call(basic, "basicFunction", [40]); + // const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); + // m.staticCall(withLib, "readonlyFunction", [eventArg]); + + // const duplicate = m.contractAt("BasicContract", basic); + // const duplicateWithLib = m.contractAtFromArtifact( + // "ContractWithLibrary", + // withLib, + // withLibArtifact + // ); + + // m.send("test-send", duplicate, 123n); + + return { + basic, + // library, + // libFromArtifact, + // withLib, + // duplicate, + // duplicateWithLib, + }; +}); diff --git a/examples/complete/libArtifacts/BasicLibrary.json b/examples/complete/libArtifacts/BasicLibrary.json new file mode 100644 index 0000000000..e03b61fee7 --- /dev/null +++ b/examples/complete/libArtifacts/BasicLibrary.json @@ -0,0 +1,30 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BasicLibrary", + "sourceName": "contracts/BasicLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "self", + "type": "uint256" + } + ], + "name": "addTwo", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea26469706673582212206a544cfc8f986be3fb0a207e85759e54cc759f3023d890241105de48c3f5db1d64736f6c63430008110033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea26469706673582212206a544cfc8f986be3fb0a207e85759e54cc759f3023d890241105de48c3f5db1d64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/examples/complete/libArtifacts/ContractWithLibrary.json b/examples/complete/libArtifacts/ContractWithLibrary.json new file mode 100644 index 0000000000..3fa1b90b5c --- /dev/null +++ b/examples/complete/libArtifacts/ContractWithLibrary.json @@ -0,0 +1,48 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ContractWithLibrary", + "sourceName": "contracts/ContractWithLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "num", + "type": "uint256" + } + ], + "name": "readonlyFunction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610217806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "linkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 133 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 101 + } + ] + } + } +} diff --git a/examples/complete/package.json b/examples/complete/package.json new file mode 100644 index 0000000000..3e93efb4d5 --- /dev/null +++ b/examples/complete/package.json @@ -0,0 +1,17 @@ +{ + "name": "@nomicfoundation/ignition-complete-example", + "private": true, + "version": "0.0.13", + "scripts": { + "test": "hardhat test", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + }, + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" + } +} diff --git a/examples/complete/test/Complete.js b/examples/complete/test/Complete.js new file mode 100644 index 0000000000..4f37b636f1 --- /dev/null +++ b/examples/complete/test/Complete.js @@ -0,0 +1,132 @@ +const { + time, + loadFixture, +} = require("@nomicfoundation/hardhat-network-helpers"); +const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); +const { expect } = require("chai"); +const LockModule = require("../ignition/LockModule"); + +// TODO: bring back tests once execution is on new-api +describe.skip("Complete", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = ONE_GWEI; + const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await ethers.getSigners(); + + const { lock } = await ignition.deploy(LockModule, { + parameters: { + unlockTime, + lockedAmount, + }, + }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.unlockTime()).to.equal(unlockTime); + }); + + it("Should set the right owner", async function () { + const { lock, owner } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.owner()).to.equal(owner.address); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + expect(await ethers.provider.getBalance(lock.address)).to.equal( + lockedAmount + ); + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const latestTime = await time.latest(); + const Lock = await ethers.getContractFactory("Lock"); + await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( + "Unlock time should be in the future" + ); + }); + }); + + describe("Withdrawals", function () { + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + const { lock } = await loadFixture(deployOneYearLockFixture); + + await expect(lock.withdraw()).to.be.revertedWith( + "You can't withdraw yet" + ); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime, otherAccount } = await loadFixture( + deployOneYearLockFixture + ); + + // We can increase the time in Hardhat Network + await time.increaseTo(unlockTime); + + // We use lock.connect() to send a transaction from another account + await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( + "You aren't the owner" + ); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + const { lock, unlockTime } = await loadFixture( + deployOneYearLockFixture + ); + + // Transactions are sent using the first signer by default + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).not.to.be.reverted; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()) + .to.emit(lock, "Withdrawal") + .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg + }); + }); + + describe("Transfers", function () { + it.skip("Should transfer the funds to the owner", async function () { + const { lock, unlockTime, lockedAmount, owner } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + await expect(lock.withdraw()).to.changeEtherBalances( + [owner, lock], + [lockedAmount, -lockedAmount] + ); + }); + }); + }); +}); diff --git a/package-lock.json b/package-lock.json index 9c82663e30..0509272dbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,14 @@ ] } }, + "examples/complete": { + "version": "0.0.13", + "devDependencies": { + "@ignored/hardhat-ignition": "^0.0.13", + "@nomicfoundation/hardhat-toolbox": "2.0.2", + "hardhat": "^2.14.0" + } + }, "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", "version": "0.0.13", @@ -3152,6 +3160,10 @@ "typescript": ">=4.5.0" } }, + "node_modules/@nomicfoundation/ignition-complete-example": { + "resolved": "examples/complete", + "link": true + }, "node_modules/@nomicfoundation/ignition-create2-example": { "resolved": "examples/create2", "link": true From dbda16df31556111e186b4b47ac3001e4564737a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 15 Jun 2023 23:31:15 -0400 Subject: [PATCH 0468/1302] enable m.library in complete example --- examples/complete/ignition/CompleteModule.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 3dd057af7c..9700a7e9a4 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -6,7 +6,7 @@ const libArtifact = require("../libArtifacts/BasicLibrary.json"); module.exports = defineModule("CompleteModule", (m) => { const basic = m.contract("BasicContract"); - // const library = m.library("BasicLibrary"); + const library = m.library("BasicLibrary"); // const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact); // const withLib = m.contractFromArtifact( // "ContractWithLibrary", @@ -32,7 +32,7 @@ module.exports = defineModule("CompleteModule", (m) => { return { basic, - // library, + library, // libFromArtifact, // withLib, // duplicate, From 1f03ea857b8b7de13529d4cfb4d1f707c3ed3646 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 15 Jun 2023 23:31:49 -0400 Subject: [PATCH 0469/1302] added named library execution state --- .../internal/execution/execution-engine.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index cd1b3efb72..4b195c1d40 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -151,11 +151,12 @@ export class ExecutionEngine { { accounts }: { executionStateMap: ExecutionStateMap; accounts: string[] } ): FutureStartMessage { const strategy = "basic"; + let state: FutureStartMessage; switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: case FutureType.NAMED_CONTRACT_DEPLOYMENT: - const state: FutureStartMessage = { + state = { type: "execution-start", futureId: future.id, futureType: future.type, @@ -175,6 +176,25 @@ export class ExecutionEngine { }; return state; case FutureType.NAMED_LIBRARY_DEPLOYMENT: + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: future.contractName, + value: "0", + constructorArgs: [], + libraries: Object.fromEntries( + Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) + ), + from: this._resolveAddress(future.from, { accounts }), + }; + return state; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: case FutureType.NAMED_CONTRACT_CALL: case FutureType.NAMED_STATIC_CALL: From 60d57ee5f003545a7b1eaea2512e0dbe07ccf746 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 18 Jun 2023 21:14:19 -0400 Subject: [PATCH 0470/1302] add test for named library execution --- .../new-api/execution/execution-engine.ts | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 48095c6840..b91df8d748 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -86,6 +86,78 @@ describe("execution engine", () => { }, ]); }); + + it("should execute a library deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1"); + + return { library1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.isDefined(module); + + const executionStateMap = {}; + + const batches = Batcher.batch(module, {}); + + const executionEngine = new ExecutionEngine(); + const journal = new MemoryJournal(); + const accounts: string[] = exampleAccounts; + const mockTransactionService = setupMockTransactionService(); + + const result = await executionEngine.execute({ + batches, + module, + executionStateMap, + accounts, + strategy: new BasicExecutionStrategy(), + journal, + transactionService: mockTransactionService, + }); + + assert.isDefined(result); + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + from: exampleAccounts[0], + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Library1", + contractName: "Library1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); }); function setupMockTransactionService(): TransactionService { From d04966e5b5baaddfacf3f4f7c387237c85dc3401 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 19 Jun 2023 20:23:30 -0400 Subject: [PATCH 0471/1302] small fix --- examples/complete/test/Complete.js | 2 +- package-lock.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/complete/test/Complete.js b/examples/complete/test/Complete.js index 4f37b636f1..f1d9007e3c 100644 --- a/examples/complete/test/Complete.js +++ b/examples/complete/test/Complete.js @@ -4,7 +4,7 @@ const { } = require("@nomicfoundation/hardhat-network-helpers"); const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); const { expect } = require("chai"); -const LockModule = require("../ignition/LockModule"); +const LockModule = require("../ignition/CompleteModule"); // TODO: bring back tests once execution is on new-api describe.skip("Complete", function () { diff --git a/package-lock.json b/package-lock.json index 0509272dbb..d3450e1a7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,6 +29,7 @@ } }, "examples/complete": { + "name": "@nomicfoundation/ignition-complete-example", "version": "0.0.13", "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", From 7b3e991a220d332b01fb061c4604c99e6df80b0c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 19 Jun 2023 23:26:55 -0400 Subject: [PATCH 0472/1302] enable executing contract deploy from artifact --- examples/complete/ignition/CompleteModule.js | 18 +-- .../internal/execution/execution-engine.ts | 37 ++++- .../transactions/transaction-service.ts | 17 ++- .../internal/utils/collectLibrariesAndLink.ts | 133 ++++++++++++++++++ .../src/new-api/types/transaction-service.ts | 14 +- .../new-api/execution/execution-engine.ts | 81 ++++++++++- 6 files changed, 282 insertions(+), 18 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/collectLibrariesAndLink.ts diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 9700a7e9a4..bfa71d5eac 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -8,14 +8,14 @@ module.exports = defineModule("CompleteModule", (m) => { const basic = m.contract("BasicContract"); const library = m.library("BasicLibrary"); // const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact); - // const withLib = m.contractFromArtifact( - // "ContractWithLibrary", - // withLibArtifact, - // [], - // { - // libraries: { BasicLibrary: library }, - // } - // ); + const withLib = m.contractFromArtifact( + "ContractWithLibrary", + withLibArtifact, + [], + { + libraries: { BasicLibrary: library }, + } + ); // const call = m.call(basic, "basicFunction", [40]); // const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); @@ -34,7 +34,7 @@ module.exports = defineModule("CompleteModule", (m) => { basic, library, // libFromArtifact, - // withLib, + withLib, // duplicate, // duplicateWithLib, }; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 4b195c1d40..34e3ee7587 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -79,11 +79,27 @@ export class ExecutionEngine { const exectionStrategy = state.strategy.executeStrategy(context); + const dependencies = Array.from(context.executionState.dependencies); + const deployedContracts = this._resolveDeployedContractsFrom(state); + + const libraries = Object.fromEntries( + dependencies.map((id) => { + const lib = deployedContracts[id]; + return [lib.contractName, lib.contractAddress]; + }) + ); + while (!isExecutionResult(current)) { context.executionState = state.executionStateMap[future.id]; + if (dependencies.length > 0) { + console.log(state.executionStateMap[dependencies[0]]); + } + if (isOnChainAction(current)) { - current = await state.transactionService.onchain(current); + current = await state.transactionService.onchain(current, { + libraries, + }); } else if (isOnchainResult(current)) { current = (await exectionStrategy.next(current)).value; } else { @@ -155,6 +171,25 @@ export class ExecutionEngine { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: future.contractName, + value: future.value.toString(), + constructorArgs: future.constructorArgs, + libraries: Object.fromEntries( + Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) + ), + from: this._resolveAddress(future.from, { accounts }), + }; + return state; case FutureType.NAMED_CONTRACT_DEPLOYMENT: state = { type: "execution-start", diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index a8c9b57153..7f625e668b 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -6,7 +6,11 @@ import { OnchainInteractionMessage, OnchainResultMessage, } from "../../../types/journal"; -import { TransactionService } from "../../../types/transaction-service"; +import { + TransactionService, + TransactionServiceOptions, +} from "../../../types/transaction-service"; +import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { isDeployContractInteraction } from "../guards"; import { ChainDispatcher } from "./chain-dispatcher"; @@ -23,7 +27,8 @@ export class TransactionServiceImplementation implements TransactionService { ) {} public async onchain( - interaction: OnchainInteractionMessage + interaction: OnchainInteractionMessage, + options?: TransactionServiceOptions ): Promise { if (!isDeployContractInteraction(interaction)) { throw new IgnitionError( @@ -31,11 +36,12 @@ export class TransactionServiceImplementation implements TransactionService { ); } - return this._dispatchDeployContract(interaction); + return this._dispatchDeployContract(interaction, options?.libraries); } private async _dispatchDeployContract( - deployContractInteraction: DeployContractInteractionMessage + deployContractInteraction: DeployContractInteractionMessage, + libraries: { [libraryName: string]: string } = {} ): Promise { // TODO: consider replacing this with a registry of artifacts const artifact = await this._artifactLoader.load( @@ -45,8 +51,7 @@ export class TransactionServiceImplementation implements TransactionService { const args = deployContractInteraction.args; const value = BigInt(deployContractInteraction.value); - // TODO: add library linking - const linkedByteCode = artifact.bytecode; + const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); const { contractAddress } = await this._chainDispatcher.sendTx({ abi: artifact.abi, diff --git a/packages/core/src/new-api/internal/utils/collectLibrariesAndLink.ts b/packages/core/src/new-api/internal/utils/collectLibrariesAndLink.ts new file mode 100644 index 0000000000..621fa4ddeb --- /dev/null +++ b/packages/core/src/new-api/internal/utils/collectLibrariesAndLink.ts @@ -0,0 +1,133 @@ +import { IgnitionValidationError } from "../../../errors"; +import { Artifact } from "../../types/artifact"; + +interface Link { + sourceName: string; + libraryName: string; + address: string; +} + +interface Libraries { + [libraryName: string]: string; +} + +export async function collectLibrariesAndLink( + artifact: Artifact, + libraries: Libraries +) { + const { utils } = await import("ethers"); + + const neededLibraries: Array<{ + sourceName: string; + libName: string; + }> = []; + for (const [sourceName, sourceLibraries] of Object.entries( + artifact.linkReferences + )) { + for (const libName of Object.keys(sourceLibraries)) { + neededLibraries.push({ sourceName, libName }); + } + } + + const linksToApply: Map = new Map(); + for (const [linkedLibraryName, linkedLibraryAddress] of Object.entries( + libraries + )) { + if (!utils.isAddress(linkedLibraryAddress)) { + throw new IgnitionValidationError( + `You tried to link the contract ${artifact.contractName} with the library ${linkedLibraryName}, but provided this invalid address: ${linkedLibraryAddress}` + ); + } + + const matchingNeededLibraries = neededLibraries.filter((lib) => { + return ( + lib.libName === linkedLibraryName || + `${lib.sourceName}:${lib.libName}` === linkedLibraryName + ); + }); + + if (matchingNeededLibraries.length === 0) { + let detailedMessage: string; + if (neededLibraries.length > 0) { + const libraryFQNames = neededLibraries + .map((lib) => `${lib.sourceName}:${lib.libName}`) + .map((x) => `* ${x}`) + .join("\n"); + detailedMessage = `The libraries needed are: +${libraryFQNames}`; + } else { + detailedMessage = "This contract doesn't need linking any libraries."; + } + throw new IgnitionValidationError( + `You tried to link the contract ${artifact.contractName} with ${linkedLibraryName}, which is not one of its libraries. +${detailedMessage}` + ); + } + + if (matchingNeededLibraries.length > 1) { + const matchingNeededLibrariesFQNs = matchingNeededLibraries + .map(({ sourceName, libName }) => `${sourceName}:${libName}`) + .map((x) => `* ${x}`) + .join("\n"); + throw new IgnitionValidationError( + `The library name ${linkedLibraryName} is ambiguous for the contract ${artifact.contractName}. +It may resolve to one of the following libraries: +${matchingNeededLibrariesFQNs} +To fix this, choose one of these fully qualified library names and replace where appropriate.` + ); + } + + const [neededLibrary] = matchingNeededLibraries; + + const neededLibraryFQN = `${neededLibrary.sourceName}:${neededLibrary.libName}`; + + // The only way for this library to be already mapped is + // for it to be given twice in the libraries user input: + // once as a library name and another as a fully qualified library name. + if (linksToApply.has(neededLibraryFQN)) { + throw new IgnitionValidationError( + `The library names ${neededLibrary.libName} and ${neededLibraryFQN} refer to the same library and were given as two separate library links. +Remove one of them and review your library links before proceeding.` + ); + } + + linksToApply.set(neededLibraryFQN, { + sourceName: neededLibrary.sourceName, + libraryName: neededLibrary.libName, + address: linkedLibraryAddress, + }); + } + + if (linksToApply.size < neededLibraries.length) { + const missingLibraries = neededLibraries + .map((lib) => `${lib.sourceName}:${lib.libName}`) + .filter((libFQName) => !linksToApply.has(libFQName)) + .map((x) => `* ${x}`) + .join("\n"); + + throw new IgnitionValidationError( + `The contract ${artifact.contractName} is missing links for the following libraries: +${missingLibraries} +Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html#library-linking +` + ); + } + + return linkBytecode(artifact, [...linksToApply.values()]); +} + +function linkBytecode(artifact: Artifact, libraries: Link[]): string { + let bytecode = artifact.bytecode; + + for (const { sourceName, libraryName, address } of libraries) { + const linkReferences = artifact.linkReferences[sourceName][libraryName]; + for (const { start, length } of linkReferences) { + bytecode = + bytecode.substr(0, 2 + start * 2) + + address.substr(2) + + bytecode.substr(2 + (start + length) * 2); + } + } + + return bytecode; +} diff --git a/packages/core/src/new-api/types/transaction-service.ts b/packages/core/src/new-api/types/transaction-service.ts index 53c16125cb..b4e51e14d8 100644 --- a/packages/core/src/new-api/types/transaction-service.ts +++ b/packages/core/src/new-api/types/transaction-service.ts @@ -7,6 +7,18 @@ import { OnchainInteractionMessage, OnchainResultMessage } from "./journal"; */ export interface TransactionService { onchain( - interaction: OnchainInteractionMessage + interaction: OnchainInteractionMessage, + options?: TransactionServiceOptions ): Promise; } + +/** + * Additional data needed to support various transaction types. + * + * @beta + */ +export interface TransactionServiceOptions { + libraries?: { + [libraryName: string]: string; + }; +} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index b91df8d748..2fdc1d1b79 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { FutureType } from "../../../src"; +import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { Batcher } from "../../../src/new-api/internal/batcher"; import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; @@ -158,6 +158,85 @@ describe("execution engine", () => { }, ]); }); + + it("should execute an artifact contract deploy", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.isDefined(module); + + const executionStateMap = {}; + + const batches = Batcher.batch(module, {}); + + const executionEngine = new ExecutionEngine(); + const journal = new MemoryJournal(); + const accounts: string[] = exampleAccounts; + const mockTransactionService = setupMockTransactionService(); + + const result = await executionEngine.execute({ + batches, + module, + executionStateMap, + accounts, + strategy: new BasicExecutionStrategy(), + journal, + transactionService: mockTransactionService, + }); + + assert.isDefined(result); + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: exampleAccounts[0], + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); }); function setupMockTransactionService(): TransactionService { From e3bc13e8ac6a0ba28ab2c671e23e3ae5e637347b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 19 Jun 2023 23:57:51 -0400 Subject: [PATCH 0473/1302] enable execution for artifact libraries --- examples/complete/ignition/CompleteModule.js | 6 +++-- .../internal/execution/execution-engine.ts | 23 +++++++++++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index bfa71d5eac..b4fea58e20 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -7,7 +7,9 @@ const libArtifact = require("../libArtifacts/BasicLibrary.json"); module.exports = defineModule("CompleteModule", (m) => { const basic = m.contract("BasicContract"); const library = m.library("BasicLibrary"); - // const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact); + const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact, { + id: "BasicLibrary2", + }); const withLib = m.contractFromArtifact( "ContractWithLibrary", withLibArtifact, @@ -33,7 +35,7 @@ module.exports = defineModule("CompleteModule", (m) => { return { basic, library, - // libFromArtifact, + libFromArtifact, withLib, // duplicate, // duplicateWithLib, diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 34e3ee7587..d81a2a58d6 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -92,10 +92,6 @@ export class ExecutionEngine { while (!isExecutionResult(current)) { context.executionState = state.executionStateMap[future.id]; - if (dependencies.length > 0) { - console.log(state.executionStateMap[dependencies[0]]); - } - if (isOnChainAction(current)) { current = await state.transactionService.onchain(current, { libraries, @@ -231,6 +227,25 @@ export class ExecutionEngine { }; return state; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + storedArtifactPath: "./artifact.json", + storedBuildInfoPath: "./build-info.json", + contractName: future.contractName, + value: "0", + constructorArgs: [], + libraries: Object.fromEntries( + Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) + ), + from: this._resolveAddress(future.from, { accounts }), + }; + return state; case FutureType.NAMED_CONTRACT_CALL: case FutureType.NAMED_STATIC_CALL: case FutureType.NAMED_CONTRACT_AT: From 15c4a3d879fe66b998d804fdcdc7151e611286a9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 2 Jun 2023 18:28:08 +0100 Subject: [PATCH 0474/1302] refactor(new-api): allow running from tests Add a second ignition object to hre that is a test helper with one method deploy. The return from deploy are transformed into ethers contracts for use in tests. Resolves #257. --- examples/sample/ignition/LockModule.js | 12 +-- examples/sample/test/Lock.js | 11 +-- packages/core/src/new-api/deployer.ts | 23 +++-- .../internal/execution/execution-engine.ts | 83 ++++++++++++++--- .../internal/execution/execution-strategy.ts | 3 + .../execution-state-resolver.ts | 3 +- .../reconcileArtifactContractDeployment.ts | 3 +- .../reconcileArtifactLibraryDeployment.ts | 3 +- .../futures/reconcileNamedContractCall.ts | 3 +- .../reconcileNamedContractDeployment.ts | 3 +- .../reconcileNamedLibraryDeployment.ts | 3 +- .../futures/reconcileNamedStaticCall.ts | 3 +- .../futures/reconcileSendData.ts | 3 +- .../new-api/internal/reconciliation/utils.ts | 68 +------------- .../internal/types/execution-engine.ts | 9 +- .../internal/utils/resolveFromAddress.ts | 37 ++++++++ .../internal/utils/resolveModuleParameter.ts | 37 ++++++++ packages/core/src/new-api/type-guards.ts | 34 +++---- packages/core/src/new-api/types/artifact.ts | 1 + packages/core/src/new-api/types/deployer.ts | 31 +++++-- packages/core/src/new-api/types/journal.ts | 9 +- packages/core/test/new-api/call.ts | 30 ++++--- packages/core/test/new-api/contract.ts | 16 ++-- packages/core/test/new-api/contractAt.ts | 9 +- .../core/test/new-api/contractFromArtifact.ts | 9 +- .../new-api/execution/execution-engine.ts | 29 ++++-- packages/core/test/new-api/helpers.ts | 18 ++++ packages/core/test/new-api/library.ts | 9 +- .../core/test/new-api/readEventArgument.ts | 16 ++-- packages/core/test/new-api/staticCall.ts | 37 ++++---- .../src/buildArtifactResolverFrom.ts | 29 ++++++ .../src/ignition-test-helper.ts | 89 +++++++++++++++++++ packages/hardhat-plugin/src/index.ts | 23 +++-- .../hardhat-plugin/src/type-extensions.ts | 6 ++ 34 files changed, 493 insertions(+), 209 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/resolveFromAddress.ts create mode 100644 packages/core/src/new-api/internal/utils/resolveModuleParameter.ts create mode 100644 packages/hardhat-plugin/src/buildArtifactResolverFrom.ts create mode 100644 packages/hardhat-plugin/src/ignition-test-helper.ts diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index f16ab9de97..940d9ffd90 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -1,19 +1,19 @@ // ./ignition/LockModule.js const { defineModule } = require("@ignored/hardhat-ignition"); -const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); +const currentTimestampInSeconds = Math.round(new Date(2023, 1, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); module.exports = defineModule("LockModule", (m) => { - // const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); - // const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); + const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); + // TODO: do we intend to support runtime values for value? + // const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); - const lock = m.contract("Lock", [TEN_YEARS_IN_FUTURE], { - // args: [unlockTime], - // value: lockedAmount + const lock = m.contract("Lock", [unlockTime], { + value: BigInt(ONE_GWEI), }); return { lock }; diff --git a/examples/sample/test/Lock.js b/examples/sample/test/Lock.js index ccb1a29d51..d9ec652d7c 100644 --- a/examples/sample/test/Lock.js +++ b/examples/sample/test/Lock.js @@ -6,8 +6,7 @@ const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); const { expect } = require("chai"); const LockModule = require("../ignition/LockModule"); -// TODO: bring back tests once execution is on new-api -describe.skip("Lock", function () { +describe("Lock", function () { // We define a fixture to reuse the same setup in every test. // We use loadFixture to run this setup once, snapshot that state, // and reset Hardhat Network to that snapshot in every test. @@ -21,10 +20,12 @@ describe.skip("Lock", function () { // Contracts are deployed using the first signer/account by default const [owner, otherAccount] = await ethers.getSigners(); - const { lock } = await ignition.deploy(LockModule, { + const { lock } = await ignition2.deploy(LockModule, { parameters: { - unlockTime, - lockedAmount, + LockModule: { + unlockTime, + lockedAmount, + }, }, }); diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index fbc91e646d..45d440cda2 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -31,11 +31,11 @@ export class Deployer { private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; private _transactionService: TransactionService; - private _artifactLoader: ArtifactResolver; private _strategy: ExecutionStrategy; + private _artifactResolver: ArtifactResolver; constructor( - options: { journal: Journal; artifactLoader: ArtifactResolver } & ( + options: { journal: Journal; artifactResolver: ArtifactResolver } & ( | { transactionService: TransactionService; } @@ -46,17 +46,12 @@ export class Deployer { ) { this._journal = options.journal; this._strategy = new BasicExecutionStrategy(); - - if (options.artifactLoader === undefined) { - throw new IgnitionError("Artifact loader must be provided"); - } - - this._artifactLoader = options.artifactLoader; + this._artifactResolver = options.artifactResolver; if ("adapters" in options && isAdapters(options.adapters)) { const adapters: Adapters = options.adapters; this._transactionService = new TransactionServiceImplementation( - options.artifactLoader, + options.artifactResolver, new EthersChainDispatcher( adapters.signer, adapters.gas, @@ -84,7 +79,7 @@ export class Deployer { ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); - await validate(module, this._artifactLoader); + await validate(module, this._artifactResolver); const previousStateMap = await this._loadExecutionStateFrom(this._journal); @@ -106,13 +101,15 @@ export class Deployer { const batches = Batcher.batch(module, previousStateMap); return this._executionEngine.execute({ + strategy: this._strategy, + journal: this._journal, + transactionService: this._transactionService, + artifactResolver: this._artifactResolver, batches, module, executionStateMap: previousStateMap, accounts, - strategy: this._strategy, - journal: this._journal, - transactionService: this._transactionService, + deploymentParameters, }); } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index d81a2a58d6..bfc4a86b8e 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,6 +1,9 @@ +import identity from "lodash/identity"; + import { IgnitionError } from "../../../errors"; import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isRuntimeValue } from "../../type-guards"; +import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { ExecutionResultMessage, @@ -10,14 +13,18 @@ import { } from "../../types/journal"; import { AccountRuntimeValue, + ArgumentType, Future, FutureType, + ModuleParameters, RuntimeValueType, } from "../../types/module"; import { accountRuntimeValueToErrorString } from "../reconciliation/utils"; import { ExecutionEngineState } from "../types/execution-engine"; import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; +import { replaceWithinArg } from "../utils/replace-within-arg"; +import { resolveModuleParameter } from "../utils/resolveModuleParameter"; import { executionStateReducer } from "./executionStateReducer"; import { isExecutionResult, isOnChainAction, isOnchainResult } from "./guards"; @@ -54,6 +61,7 @@ export class ExecutionEngine { return { status: "success", contracts: this._resolveDeployedContractsFrom(state), + module: state.module, }; } @@ -70,7 +78,11 @@ export class ExecutionEngine { future: Future, state: ExecutionEngineState ): Promise { - let current: JournalableMessage = this._startOrRestartFor(future, state); + let current: JournalableMessage = await this._startOrRestartFor( + future, + state + ); + await this._apply(state, current); const context = { @@ -108,10 +120,10 @@ export class ExecutionEngine { return current; } - private _startOrRestartFor( + private async _startOrRestartFor( future: Future, state: ExecutionEngineState - ): FutureStartMessage | FutureRestartMessage { + ): Promise { const executionState = state.executionStateMap[future.id]; if (executionState === undefined) { @@ -158,10 +170,19 @@ export class ExecutionEngine { ); } - private _initCommandFor( + private async _initCommandFor( future: Future, - { accounts }: { executionStateMap: ExecutionStateMap; accounts: string[] } - ): FutureStartMessage { + { + accounts, + artifactResolver, + deploymentParameters, + }: { + executionStateMap: ExecutionStateMap; + accounts: string[]; + artifactResolver: ArtifactResolver; + deploymentParameters: { [key: string]: ModuleParameters }; + } + ): Promise { const strategy = "basic"; let state: FutureStartMessage; @@ -175,7 +196,9 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: await artifactResolver.resolvePath( + future.contractName + ), storedBuildInfoPath: "./build-info.json", contractName: future.contractName, value: future.value.toString(), @@ -195,11 +218,16 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: await artifactResolver.resolvePath( + future.contractName + ), storedBuildInfoPath: "./build-info.json", contractName: future.contractName, value: future.value.toString(), - constructorArgs: future.constructorArgs, + constructorArgs: this._resolveArgs(future.constructorArgs, { + accounts, + deploymentParameters, + }), libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), @@ -215,7 +243,9 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: await artifactResolver.resolvePath( + future.contractName + ), storedBuildInfoPath: "./build-info.json", contractName: future.contractName, value: "0", @@ -235,7 +265,9 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: await artifactResolver.resolvePath( + future.contractName + ), storedBuildInfoPath: "./build-info.json", contractName: future.contractName, value: "0", @@ -257,6 +289,28 @@ export class ExecutionEngine { } } + private _resolveArgs( + args: ArgumentType[], + context: { + deploymentParameters: { [key: string]: ModuleParameters }; + accounts: string[]; + } + ) { + const replace = (arg: ArgumentType) => + replaceWithinArg(arg, { + bigint: identity, + future: (_f) => { + return null as any; + }, + accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], + moduleParameterRuntimeValue: (mprv) => { + return resolveModuleParameter(mprv, context); + }, + }); + + return args.map(replace); + } + private _lookupFuture(futures: Future[], futureId: string): Future { const future = futures.find((f) => f.id === futureId); @@ -271,7 +325,11 @@ export class ExecutionEngine { executionStateMap, }: ExecutionEngineState): Record< string, - { contractName: string; contractAddress: string } + { + contractName: string; + contractAddress: string; + storedArtifactPath: string; + } > { return Object.fromEntries( Object.values(executionStateMap) @@ -282,6 +340,7 @@ export class ExecutionEngine { { contractName: des.contractName, contractAddress: des.contractAddress!, + storedArtifactPath: des.storedArtifactPath, }, ]) ); diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 249db7e492..b9f1c963c2 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -51,7 +51,10 @@ export class BasicExecutionStrategy contractName: deploymentExecutionState.contractName, value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, + // TODO: the possibily of undefined for `from` needs + // a working resolution from: deploymentExecutionState.from ?? "n/a", + storedArtifactPath: deploymentExecutionState.storedArtifactPath, }; if (result === null) { diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index d7ce845a0c..36e95ead09 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -25,9 +25,10 @@ import { import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; import { replaceWithinArg } from "../utils/replace-within-arg"; +import { resolveModuleParameter } from "../utils/resolveModuleParameter"; import { ReconciliationContext } from "./types"; -import { moduleParameterToErrorString, resolveModuleParameter } from "./utils"; +import { moduleParameterToErrorString } from "./utils"; // TODO: consider merging this into the execution state map export class ExecutionStateResolver { diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index f3e1bb29d3..5dcc53a885 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { ArtifactContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileArtifactContractDeployment( future: ArtifactContractDeploymentFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 6274ba1480..83da8dd4a9 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileArtifactLibraryDeployment( future: ArtifactLibraryDeploymentFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index b40ebee89a..6573e76e9f 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { NamedContractCallFuture } from "../../../types/module"; import { CallExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileNamedContractCall( future: NamedContractCallFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 49e11e1e3f..3f0a8a9807 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { NamedContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileNamedContractDeployment( future: NamedContractDeploymentFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 4e94cd6b3b..53a1a695b0 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { NamedLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index 1df65af2fb..b6762323b8 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { NamedStaticCallFuture } from "../../../types/module"; import { StaticCallExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileNamedStaticCall( future: NamedStaticCallFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index 8c16fd4140..4c616f18a5 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -2,9 +2,10 @@ import { isEqual } from "lodash"; import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../types/execution-state"; +import { resolveFromAddress } from "../../utils/resolveFromAddress"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail, resolveFromAddress } from "../utils"; +import { addressToErrorString, fail } from "../utils"; export function reconcileSendData( future: SendDataFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index f9e05b93a0..22cfd48d7b 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -1,15 +1,10 @@ -import { IgnitionError } from "../../../errors"; -import { isRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue, Future, - ModuleParameterRuntimeValue, ModuleParameterType, } from "../../types/module"; -import { isAddress } from "../utils"; -import { assertIgnitionInvariant } from "../utils/assertions"; -import { ReconciliationContext, ReconciliationFutureResult } from "./types"; +import { ReconciliationFutureResult } from "./types"; export function fail( future: Future, @@ -40,67 +35,6 @@ export function failWithError( }; } -export function resolveFromAddress( - from: string | AccountRuntimeValue | undefined, - { accounts }: ReconciliationContext -): string | undefined { - if (from === undefined) { - return from; - } - - if (typeof from === "string") { - if (!isAddress(from)) { - throw new IgnitionError("From is not a usable address"); - } - - return from; - } - - assertIgnitionInvariant( - isRuntimeValue(from), - `Could not resolve from address: ${JSON.stringify(from)}` - ); - - const runtimeAddress = accounts[from.accountIndex]; - - assertIgnitionInvariant( - isAddress(runtimeAddress), - `From runtime account is not a usable address: ${runtimeAddress}` - ); - - return runtimeAddress; -} - -export function resolveModuleParameter( - moduleParamRuntimeValue: ModuleParameterRuntimeValue, - context: ReconciliationContext -): ModuleParameterType { - const moduleParameters = - context.deploymentParameters[moduleParamRuntimeValue.moduleId]; - - if (moduleParameters === undefined) { - assertIgnitionInvariant( - moduleParamRuntimeValue.defaultValue !== undefined, - `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` - ); - - return moduleParamRuntimeValue.defaultValue; - } - - const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; - - if (moduleParamValue === undefined) { - assertIgnitionInvariant( - moduleParamRuntimeValue.defaultValue !== undefined, - `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` - ); - - return moduleParamRuntimeValue.defaultValue; - } - - return moduleParamValue; -} - export function accountRuntimeValueToErrorString( potential: AccountRuntimeValue ) { diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index dd5c0d5b45..5f721c61e7 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,10 +1,15 @@ +import { ArtifactResolver } from "../../types/artifact"; import { Journal, JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, } from "../../types/journal"; -import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; +import { + IgnitionModule, + IgnitionModuleResult, + ModuleParameters, +} from "../../types/module"; import { TransactionService } from "../../types/transaction-service"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; @@ -14,9 +19,11 @@ export interface ExecutionEngineState { module: IgnitionModule>; executionStateMap: ExecutionStateMap; accounts: string[]; + deploymentParameters: { [key: string]: ModuleParameters }; strategy: ExecutionStrategy; journal: Journal; transactionService: TransactionService; + artifactResolver: ArtifactResolver; } export interface ExecutionStrategy { diff --git a/packages/core/src/new-api/internal/utils/resolveFromAddress.ts b/packages/core/src/new-api/internal/utils/resolveFromAddress.ts new file mode 100644 index 0000000000..0b7a279deb --- /dev/null +++ b/packages/core/src/new-api/internal/utils/resolveFromAddress.ts @@ -0,0 +1,37 @@ +import { IgnitionError } from "../../../errors"; +import { isRuntimeValue } from "../../type-guards"; +import { AccountRuntimeValue } from "../../types/module"; +import { isAddress } from "../utils"; + +import { assertIgnitionInvariant } from "./assertions"; + +export function resolveFromAddress( + from: string | AccountRuntimeValue | undefined, + { accounts }: { accounts: string[] } +): string | undefined { + if (from === undefined) { + return from; + } + + if (typeof from === "string") { + if (!isAddress(from)) { + throw new IgnitionError("From is not a usable address"); + } + + return from; + } + + assertIgnitionInvariant( + isRuntimeValue(from), + `Could not resolve from address: ${JSON.stringify(from)}` + ); + + const runtimeAddress = accounts[from.accountIndex]; + + assertIgnitionInvariant( + isAddress(runtimeAddress), + `From runtime account is not a usable address: ${runtimeAddress}` + ); + + return runtimeAddress; +} diff --git a/packages/core/src/new-api/internal/utils/resolveModuleParameter.ts b/packages/core/src/new-api/internal/utils/resolveModuleParameter.ts new file mode 100644 index 0000000000..0ccc31da94 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/resolveModuleParameter.ts @@ -0,0 +1,37 @@ +import { + ModuleParameterRuntimeValue, + ModuleParameterType, + ModuleParameters, +} from "../../types/module"; + +import { assertIgnitionInvariant } from "./assertions"; + +export function resolveModuleParameter( + moduleParamRuntimeValue: ModuleParameterRuntimeValue, + context: { deploymentParameters: { [key: string]: ModuleParameters } } +): ModuleParameterType { + const moduleParameters = + context.deploymentParameters[moduleParamRuntimeValue.moduleId]; + + if (moduleParameters === undefined) { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + + return moduleParamRuntimeValue.defaultValue; + } + + const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; + + if (moduleParamValue === undefined) { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + + return moduleParamRuntimeValue.defaultValue; + } + + return moduleParamValue; +} diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 3ed726a7aa..80630756c4 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -208,23 +208,7 @@ export function isRuntimeValue(potential: unknown): potential is RuntimeValue { } /** - * Returns true if potential is a set of adapters - * - * @beta - */ -export function isAdapters(potential: unknown): potential is Adapters { - return ( - typeof potential === "object" && - potential !== null && - /* TODO: make this type safe */ - "signer" in potential && - "gas" in potential && - "transactions" in potential - ); -} - -/** - * Returns true if potential is of type AccountRuntimeValue. + * Return true if potential is an account runtime value. * * @beta */ @@ -249,3 +233,19 @@ export function isModuleParameterRuntimeValue( potential.type === RuntimeValueType.MODULE_PARAMETER ); } + +/** + * Returns true if potential is a set of adapters. + * + * @beta + */ +export function isAdapters(potential: unknown): potential is Adapters { + return ( + typeof potential === "object" && + potential !== null && + /* TODO: make this type safe */ + "signer" in potential && + "gas" in potential && + "transactions" in potential + ); +} diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 8705eddb0a..1cb9d66555 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -20,4 +20,5 @@ export interface Artifact { */ export interface ArtifactResolver { load(contractName: string): Promise; + resolvePath(contractName: string): Promise; } diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts index dc9c7ae81f..5a0b2766f3 100644 --- a/packages/core/src/new-api/types/deployer.ts +++ b/packages/core/src/new-api/types/deployer.ts @@ -1,16 +1,33 @@ +import { IgnitionModule, IgnitionModuleResult } from "./module"; + /** * The result of a deployment run. * * @beta */ export type DeploymentResult = - | { - status: "success"; - contracts: Record< - string, - { contractName: string; contractAddress: string } - >; - } + | DeploymentResultSuccess | { status: "failed" | "hold"; }; + +/** + * The result of a successful deployment run. + * + * @beta + */ +export interface DeploymentResultSuccess { + status: "success"; + contracts: DeploymentResultContracts; + module: IgnitionModule>; +} + +/** + * The successfully deployed contract from the deployment run. + * + * @beta + */ +export type DeploymentResultContracts = Record< + string, + { contractName: string; contractAddress: string; storedArtifactPath: string } +>; diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 0c7eb3b1d9..c52daef7dc 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -44,12 +44,13 @@ export type OnchainInteractionMessage = DeployContractInteractionMessage; * @beta */ export interface DeployContractInteractionMessage { - value: string; - args: ArgumentType[]; - from: string; - contractName: string; type: "onchain-action"; subtype: "deploy-contract"; + args: ArgumentType[]; + contractName: string; + storedArtifactPath: string; + value: string; + from: string; } // #endregion diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 63347fd9de..29abc31369 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -12,7 +12,7 @@ import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futur import { validateNamedContractCall } from "../../src/new-api/internal/validation/futures/validateNamedContractCall"; import { FutureType } from "../../src/new-api/types/module"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("call", () => { it("should be able to setup a contract call", () => { @@ -556,9 +556,10 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, { - load: async () => ({} as any), - }), + validateNamedContractCall( + future as any, + setupMockArtifactResolver({} as any) + ), /Artifact for contract 'Another' is invalid/ ); }); @@ -585,9 +586,10 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Contract 'Another' doesn't have a function test/ ); }); @@ -628,9 +630,10 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -689,9 +692,10 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index c0b8a527c2..e9658e9db4 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -12,7 +12,7 @@ import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futur import { validateNamedContractDeployment } from "../../src/new-api/internal/validation/futures/validateNamedContractDeployment"; import { FutureType } from "../../src/new-api/types/module"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { @@ -552,9 +552,10 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); await assert.isRejected( - validateNamedContractDeployment(future as any, { - load: async () => ({} as any), - }), + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({} as any) + ), /Artifact for contract 'Another' is invalid/ ); }); @@ -583,9 +584,10 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); await assert.isRejected( - validateNamedContractDeployment(future as any, { - load: async () => fakeArtifact, - }), + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); }); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 738776617e..6144eeb524 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -6,7 +6,7 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; import { validateNamedContractAt } from "../../src/new-api/internal/validation/futures/validateNamedContractAt"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contractAt", () => { const fakeArtifact: any = {}; @@ -268,9 +268,10 @@ describe("contractAt", () => { const [future] = getFuturesFromModule(module); await assert.isRejected( - validateNamedContractAt(future as any, { - load: async () => fakeArtifact, - }), + validateNamedContractAt( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Artifact for contract 'Another' is invalid/ ); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index dbd00ad772..40b4850bdb 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -11,7 +11,7 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; import { validateArtifactContractDeployment } from "../../src/new-api/internal/validation/futures/validateArtifactContractDeployment"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contractFromArtifact", () => { const fakeArtifact: Artifact = { @@ -627,9 +627,10 @@ describe("contractFromArtifact", () => { const [future] = getFuturesFromModule(module); await assert.isRejected( - validateArtifactContractDeployment(future as any, { - load: async () => fakeArtifact, - }), + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); }); diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 2fdc1d1b79..58f9b7aff6 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -12,12 +12,15 @@ import { JournalableMessage, } from "../../../src/new-api/types/journal"; import { TransactionService } from "../../../src/new-api/types/transaction-service"; -import { exampleAccounts } from "../helpers"; +import { exampleAccounts, setupMockArtifactResolver } from "../helpers"; describe("execution engine", () => { it("should execute a contract deploy", async () => { const moduleDefinition = defineModule("Module1", (m) => { - const contract1 = m.contract("Contract1"); + const account1 = m.getAccount(1); + const supply = m.getParameter("supply", 1000); + + const contract1 = m.contract("Contract1", [account1, supply]); return { contract1 }; }); @@ -35,6 +38,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); + const mockArtifactResolver = setupMockArtifactResolver(); const result = await executionEngine.execute({ batches, @@ -44,6 +48,8 @@ describe("execution engine", () => { strategy: new BasicExecutionStrategy(), journal, transactionService: mockTransactionService, + artifactResolver: mockArtifactResolver, + deploymentParameters: {}, }); assert.isDefined(result); @@ -56,11 +62,11 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: "/user/path/Contract1.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", value: BigInt(0).toString(), - constructorArgs: [], + constructorArgs: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], libraries: {}, from: accounts[0], }, @@ -68,9 +74,10 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", contractName: "Contract1", - args: [], + args: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], value: BigInt(0).toString(), from: exampleAccounts[0], + storedArtifactPath: "/user/path/Contract1.json", }, { type: "onchain-result", @@ -107,6 +114,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); + const mockArtifactResolver = setupMockArtifactResolver(); const result = await executionEngine.execute({ batches, @@ -116,6 +124,8 @@ describe("execution engine", () => { strategy: new BasicExecutionStrategy(), journal, transactionService: mockTransactionService, + artifactResolver: mockArtifactResolver, + deploymentParameters: {}, }); assert.isDefined(result); @@ -128,7 +138,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: "/user/path/Library1.json", storedBuildInfoPath: "./build-info.json", contractName: "Library1", value: BigInt(0).toString(), @@ -143,6 +153,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: exampleAccounts[0], + storedArtifactPath: "/user/path/Library1.json", }, { type: "onchain-result", @@ -186,6 +197,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); + const mockArtifactResolver = setupMockArtifactResolver(); const result = await executionEngine.execute({ batches, @@ -195,6 +207,8 @@ describe("execution engine", () => { strategy: new BasicExecutionStrategy(), journal, transactionService: mockTransactionService, + artifactResolver: mockArtifactResolver, + deploymentParameters: {}, }); assert.isDefined(result); @@ -207,7 +221,7 @@ describe("execution engine", () => { futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "./artifact.json", + storedArtifactPath: "/user/path/Contract1.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", value: BigInt(0).toString(), @@ -222,6 +236,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: exampleAccounts[0], + storedArtifactPath: "/user/path/Contract1.json", }, { type: "onchain-result", diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 5399ca3829..4372813446 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,5 +1,7 @@ import { assert } from "chai"; +import { Artifact, ArtifactResolver, IgnitionError } from "../../src"; + export const exampleAccounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", @@ -14,3 +16,19 @@ export function assertInstanceOf( ): asserts obj is ObjectT { assert.instanceOf(obj, klass, `Not a valid instace of ${klass.name}`); } + +export function setupMockArtifactResolver( + artifact?: Artifact +): ArtifactResolver { + return { + load: async () => { + if (artifact === undefined) { + throw new IgnitionError("Not implemented"); + } + + return artifact; + }, + resolvePath: async (contractName: string) => + `/user/path/${contractName}.json`, + }; +} diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 4e148cca90..26529361ba 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -10,7 +10,7 @@ import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futur import { validateNamedLibraryDeployment } from "../../src/new-api/internal/validation/futures/validateNamedLibraryDeployment"; import { FutureType } from "../../src/new-api/types/module"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("library", () => { it("should be able to setup a deploy library call", () => { @@ -309,9 +309,10 @@ describe("library", () => { const [future] = getFuturesFromModule(module); await assert.isRejected( - validateNamedLibraryDeployment(future as any, { - load: async () => ({} as any), - }), + validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({} as any) + ), /Artifact for contract 'Another' is invalid/ ); }); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index fa42199674..7df54b0d3f 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -6,6 +6,8 @@ import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; import { validateReadEventArgument } from "../../src/new-api/internal/validation/futures/validateReadEventArgument"; +import { setupMockArtifactResolver } from "./helpers"; + describe("Read event argument", () => { describe("creating modules with it", () => { it("should support reading arguments from all the futures that can emit them", () => { @@ -231,9 +233,10 @@ describe("Read event argument", () => { ); await assert.isRejected( - validateReadEventArgument(future as any, { - load: async () => ({} as any), - }), + validateReadEventArgument( + future as any, + setupMockArtifactResolver({} as any) + ), /Artifact for contract 'Another' is invalid/ ); }); @@ -260,9 +263,10 @@ describe("Read event argument", () => { ); await assert.isRejected( - validateReadEventArgument(future as any, { - load: async () => fakeArtifact, - }), + validateReadEventArgument( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Contract 'Another' doesn't have an event test/ ); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index ec2ace830b..7bc3272dc6 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -13,7 +13,7 @@ import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futur import { validateNamedStaticCall } from "../../src/new-api/internal/validation/futures/validateNamedStaticCall"; import { FutureType } from "../../src/new-api/types/module"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("static call", () => { it("should be able to setup a static call", () => { @@ -542,9 +542,10 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, { - load: async () => ({} as any), - }), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({} as any) + ), /Artifact for contract 'Another' is invalid/ ); }); @@ -571,9 +572,10 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Contract 'Another' doesn't have a function test/ ); }); @@ -614,9 +616,10 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -675,9 +678,10 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); @@ -718,9 +722,10 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, { - load: async () => fakeArtifact, - }), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(fakeArtifact) + ), /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ ); }); diff --git a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts new file mode 100644 index 0000000000..b92792bd10 --- /dev/null +++ b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts @@ -0,0 +1,29 @@ +import { + Artifact, + ArtifactResolver, + IgnitionError, +} from "@ignored/ignition-core"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +export function buildArtifactResolverFrom( + hre: HardhatRuntimeEnvironment +): ArtifactResolver { + return { + load: async (contractName: string): Promise => + hre.artifacts.readArtifact(contractName), + resolvePath: async (contractName: string): Promise => { + const artifactPaths = await hre.artifacts.getArtifactPaths(); + + const artifactPath = artifactPaths.find( + (p) => path.parse(p).name === contractName + ); + + if (artifactPath === undefined) { + throw new IgnitionError(`Artifact path not found for ${contractName}`); + } + + return artifactPath; + }, + }; +} diff --git a/packages/hardhat-plugin/src/ignition-test-helper.ts b/packages/hardhat-plugin/src/ignition-test-helper.ts new file mode 100644 index 0000000000..d2ccdfc36f --- /dev/null +++ b/packages/hardhat-plugin/src/ignition-test-helper.ts @@ -0,0 +1,89 @@ +import { + Deployer, + DeploymentResultSuccess, + IgnitionError, + IgnitionModuleDefinition, + IgnitionModuleResult, + MemoryJournal, + ModuleParameters, +} from "@ignored/ignition-core"; +import { Contract } from "ethers"; +import fs from "fs-extra"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { buildAdaptersFrom } from "./buildAdaptersFrom"; +import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; + +export class IgnitionTestHelper { + constructor(private _hre: HardhatRuntimeEnvironment) {} + + public async deploy( + ignitionModuleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + { parameters = {} }: { parameters: { [key: string]: ModuleParameters } } + ): Promise { + const accounts = (await this._hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const deployer = new Deployer({ + journal: new MemoryJournal(), + adapters: buildAdaptersFrom(this._hre), + artifactResolver: buildArtifactResolverFrom(this._hre), + }); + + const result = await deployer.deploy( + ignitionModuleDefinition, + parameters, + accounts + ); + + if (result.status !== "success") { + throw new IgnitionError("Failed deployment"); + } + + return this._toEthersContracts(result); + } + + private async _toEthersContracts( + result: DeploymentResultSuccess + ): Promise> { + const resolvedOutput: { [k: string]: Contract } = {}; + + for (const [key, future] of Object.entries(result.module.results)) { + const deployedContract = result.contracts[future.id]; + + if (deployedContract === undefined) { + throw new IgnitionError( + `Contract not among deployed results ${future.id}` + ); + } + + const { storedArtifactPath, contractAddress } = deployedContract; + + const abi: any[] = await this._resolveAbiFromArtifactPath( + storedArtifactPath + ); + + resolvedOutput[key] = await this._hre.ethers.getContractAt( + abi, + contractAddress + ); + } + + return resolvedOutput; + } + + private async _resolveAbiFromArtifactPath( + storedArtifactPath: any + ): Promise { + const artifact = JSON.parse( + (await fs.readFile(storedArtifactPath)).toString() + ); + + return artifact.abi; + } +} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ce024765f1..d4b7d79e25 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,4 @@ import { - Artifact, Deployer, FileJournal, MemoryJournal, @@ -17,7 +16,9 @@ import path from "path"; import prompts from "prompts"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; +import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; +import { IgnitionTestHelper } from "./ignition-test-helper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; import { writePlan } from "./plan/write-plan"; @@ -89,6 +90,15 @@ extendEnvironment((hre) => { networkName: hre.network.name, }); }); + + hre.ignition2 = lazyObject(() => { + // const isHardhatNetwork = hre.network.name === "hardhat"; + + // TODO: rewire txPollingInterval + // const txPollingInterval = isHardhatNetwork ? 100 : 5000; + + return new IgnitionTestHelper(hre); + }); }); task("deploy") @@ -235,7 +245,8 @@ task("deploy2") parameters = resolveParametersString(parametersInput); } - const isHardhatNetwork = hre.network.name === "hardhat"; + // TODO: bring back check with file journaling proper + const isHardhatNetwork = true; // hre.network.name === "hardhat"; const journal = isHardhatNetwork ? new MemoryJournal() @@ -248,14 +259,10 @@ task("deploy2") })) as string[]; try { - const artifactLoader = { - load: async (contractName: string): Promise => - hre.artifacts.readArtifact(contractName), - }; - + const artifactResolver = buildArtifactResolverFrom(hre); const adapters = buildAdaptersFrom(hre); - const deployer = new Deployer({ journal, adapters, artifactLoader }); + const deployer = new Deployer({ journal, adapters, artifactResolver }); const result = await deployer.deploy( userModule as any, diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 511a69c405..b267645273 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -5,6 +5,8 @@ import "hardhat/types/runtime"; import type { IgnitionWrapper } from "./ignition-wrapper"; import type { IgnitionConfig } from "./index"; +import { IgnitionTestHelper } from "./ignition-test-helper"; + declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { ignition?: string; @@ -29,4 +31,8 @@ declare module "hardhat/types/runtime" { export interface HardhatRuntimeEnvironment { ignition: IgnitionWrapper; } + + export interface HardhatRuntimeEnvironment { + ignition2: IgnitionTestHelper; + } } From b311eec90d8f9389b084df73a2c1a9c910c1ece9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 20 Jun 2023 12:13:18 +0100 Subject: [PATCH 0475/1302] refactor: add execution resolution of futures Encapsulate the logic in `resolveFutureToValue`, also refactor to move execution state type guards into the internal type-guards. --- packages/core/src/internal/utils/guards.ts | 23 --- .../internal/execution/execution-engine.ts | 12 +- .../internal/execution/execution-strategy.ts | 2 +- .../execution/executionStateReducer.ts | 2 +- .../execution-state-resolver.ts | 2 +- .../reconcileArtifactContractDeployment.ts | 2 +- .../reconcileArtifactLibraryDeployment.ts | 2 +- .../futures/reconcileNamedContractCall.ts | 2 +- .../reconcileNamedContractDeployment.ts | 2 +- .../reconcileNamedLibraryDeployment.ts | 2 +- .../futures/reconcileNamedStaticCall.ts | 2 +- .../futures/reconcileSendData.ts | 2 +- .../core/src/new-api/internal/type-guards.ts | 52 ++++++ ...FromAddress.ts => resolve-from-address.ts} | 0 .../internal/utils/resolve-future-to-value.ts | 95 +++++++++++ ...rameter.ts => resolve-module-parameter.ts} | 2 + .../new-api/execution/execution-engine.ts | 160 +++++++++++++++++- 17 files changed, 323 insertions(+), 41 deletions(-) create mode 100644 packages/core/src/new-api/internal/type-guards.ts rename packages/core/src/new-api/internal/utils/{resolveFromAddress.ts => resolve-from-address.ts} (100%) create mode 100644 packages/core/src/new-api/internal/utils/resolve-future-to-value.ts rename packages/core/src/new-api/internal/utils/{resolveModuleParameter.ts => resolve-module-parameter.ts} (97%) diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts index 5aced17681..56df474d6f 100644 --- a/packages/core/src/internal/utils/guards.ts +++ b/packages/core/src/internal/utils/guards.ts @@ -22,12 +22,6 @@ import type { } from "../types/deploymentGraph"; import { IgnitionError } from "../../errors"; -import { - DeploymentExecutionState, - ExecutionState, - StaticCallExecutionState, -} from "../../new-api/internal/types/execution-state"; -import { FutureType } from "../../new-api/types/module"; import { ArtifactOld } from "../../types/hardhat"; import { ModuleDict } from "../../types/module"; @@ -155,23 +149,6 @@ export function isLibrary( return future.type === "library"; } -export function isDeploymentExecutionState( - executionState: ExecutionState -): executionState is DeploymentExecutionState { - return [ - FutureType.NAMED_CONTRACT_DEPLOYMENT, - FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.NAMED_LIBRARY_DEPLOYMENT, - FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, - ].includes(executionState.futureType); -} - -export function isStaticCallExecutionState( - executionState: ExecutionState -): executionState is StaticCallExecutionState { - return [FutureType.NAMED_STATIC_CALL].includes(executionState.futureType); -} - export function assertModuleReturnTypes(moduleResult: T) { for (const future of Object.values(moduleResult)) { if (isContract(future) || isLibrary(future)) { diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index bfc4a86b8e..25d034beaa 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,7 +1,6 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; -import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isRuntimeValue } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; @@ -20,11 +19,13 @@ import { RuntimeValueType, } from "../../types/module"; import { accountRuntimeValueToErrorString } from "../reconciliation/utils"; +import { isDeploymentExecutionState } from "../type-guards"; import { ExecutionEngineState } from "../types/execution-engine"; import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; -import { resolveModuleParameter } from "../utils/resolveModuleParameter"; +import { resolveFutureToValue } from "../utils/resolve-future-to-value"; +import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { executionStateReducer } from "./executionStateReducer"; import { isExecutionResult, isOnChainAction, isOnchainResult } from "./guards"; @@ -173,6 +174,7 @@ export class ExecutionEngine { private async _initCommandFor( future: Future, { + executionStateMap, accounts, artifactResolver, deploymentParameters, @@ -227,6 +229,7 @@ export class ExecutionEngine { constructorArgs: this._resolveArgs(future.constructorArgs, { accounts, deploymentParameters, + executionStateMap, }), libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) @@ -294,13 +297,14 @@ export class ExecutionEngine { context: { deploymentParameters: { [key: string]: ModuleParameters }; accounts: string[]; + executionStateMap: ExecutionStateMap; } ) { const replace = (arg: ArgumentType) => replaceWithinArg(arg, { bigint: identity, - future: (_f) => { - return null as any; + future: (f) => { + return resolveFutureToValue(f, context); }, accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], moduleParameterRuntimeValue: (mprv) => { diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index b9f1c963c2..27c9b86872 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -1,11 +1,11 @@ import { IgnitionError } from "../../../errors"; -import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { DeployedContractExecutionSuccess, JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, } from "../../types/journal"; +import { isDeploymentExecutionState } from "../type-guards"; import { ExecutionStrategy } from "../types/execution-engine"; import { DeploymentExecutionState, diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 2308119e3c..778ab87932 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,6 +1,6 @@ -import { isDeploymentExecutionState } from "../../../internal/utils/guards"; import { isDeploymentType } from "../../type-guards"; import { FutureStartMessage, JournalableMessage } from "../../types/journal"; +import { isDeploymentExecutionState } from "../type-guards"; import { DeploymentExecutionState, ExecutionState, diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 36e95ead09..36a5c04a43 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -25,7 +25,7 @@ import { import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; import { replaceWithinArg } from "../utils/replace-within-arg"; -import { resolveModuleParameter } from "../utils/resolveModuleParameter"; +import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { ReconciliationContext } from "./types"; import { moduleParameterToErrorString } from "./utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 5dcc53a885..1c5c55938a 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { ArtifactContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 83da8dd4a9..833448d7f8 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 6573e76e9f..61de9b2d91 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { NamedContractCallFuture } from "../../../types/module"; import { CallExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 3f0a8a9807..19f196b811 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { NamedContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 53a1a695b0..60b1848979 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { NamedLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index b6762323b8..998268935f 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { NamedStaticCallFuture } from "../../../types/module"; import { StaticCallExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index 4c616f18a5..5280ced06b 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -2,7 +2,7 @@ import { isEqual } from "lodash"; import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../types/execution-state"; -import { resolveFromAddress } from "../../utils/resolveFromAddress"; +import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; diff --git a/packages/core/src/new-api/internal/type-guards.ts b/packages/core/src/new-api/internal/type-guards.ts new file mode 100644 index 0000000000..5f5cb9f827 --- /dev/null +++ b/packages/core/src/new-api/internal/type-guards.ts @@ -0,0 +1,52 @@ +import { FutureType } from "../types/module"; + +import { + CallExecutionState, + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionState, + ReadEventArgumentExecutionState, + SendDataExecutionState, + StaticCallExecutionState, +} from "./types/execution-state"; + +export function isDeploymentExecutionState( + executionState: ExecutionState +): executionState is DeploymentExecutionState { + return [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ].includes(executionState.futureType); +} + +export function isCallExecutionState( + executionState: ExecutionState +): executionState is CallExecutionState { + return [FutureType.NAMED_CONTRACT_CALL].includes(executionState.futureType); +} + +export function isStaticCallExecutionState( + executionState: ExecutionState +): executionState is StaticCallExecutionState { + return [FutureType.NAMED_STATIC_CALL].includes(executionState.futureType); +} + +export function isReadEventArgumentExecutionState( + executionState: ExecutionState +): executionState is ReadEventArgumentExecutionState { + return [FutureType.READ_EVENT_ARGUMENT].includes(executionState.futureType); +} + +export function isContractAtExecutionState( + executionState: ExecutionState +): executionState is ContractAtExecutionState { + return [FutureType.NAMED_CONTRACT_AT].includes(executionState.futureType); +} + +export function isSendDataExecutionState( + executionState: ExecutionState +): executionState is SendDataExecutionState { + return [FutureType.SEND_DATA].includes(executionState.futureType); +} diff --git a/packages/core/src/new-api/internal/utils/resolveFromAddress.ts b/packages/core/src/new-api/internal/utils/resolve-from-address.ts similarity index 100% rename from packages/core/src/new-api/internal/utils/resolveFromAddress.ts rename to packages/core/src/new-api/internal/utils/resolve-from-address.ts diff --git a/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts b/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts new file mode 100644 index 0000000000..ee4846edbf --- /dev/null +++ b/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts @@ -0,0 +1,95 @@ +import { IgnitionError } from "../../../errors"; +import { Future, SolidityParameterType } from "../../types/module"; +import { + isCallExecutionState, + isContractAtExecutionState, + isDeploymentExecutionState, + isReadEventArgumentExecutionState, + isSendDataExecutionState, + isStaticCallExecutionState, +} from "../type-guards"; +import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; + +import { assertIgnitionInvariant } from "./assertions"; + +/** + * Resolve a future to its value for execution. This will depend on the future + * type, so a contract deploy will resolve to its address. + * + * @param future + * @param context + */ +export function resolveFutureToValue( + future: Future, + context: { executionStateMap: ExecutionStateMap } +): SolidityParameterType { + const executionState = _resolveFromExecutionState( + future, + context.executionStateMap + ); + + assertIgnitionInvariant( + !isCallExecutionState(executionState), + `Calls cannot be resolved to values` + ); + + assertIgnitionInvariant( + !isSendDataExecutionState(executionState), + `Calls cannot be resolved to values` + ); + + if (isContractAtExecutionState(executionState)) { + return executionState.address; + } + + if (isDeploymentExecutionState(executionState)) { + assertIgnitionInvariant( + executionState.contractAddress !== undefined, + `Future ${future.id} does not have a contract address` + ); + + return executionState.contractAddress; + } + + if (isStaticCallExecutionState(executionState)) { + assertIgnitionInvariant( + executionState.result !== undefined, + `Future ${future.id} does not have a result` + ); + + return executionState.result; + } + + if (isReadEventArgumentExecutionState(executionState)) { + assertIgnitionInvariant( + executionState.result !== undefined, + `Future ${future.id} does not have a result` + ); + + return executionState.result; + } + + return _assertNeverExecutionState(executionState); +} + +function _resolveFromExecutionState< + TFuture extends Future, + TExState extends ExecutionState +>(future: TFuture, executionStateMap: ExecutionStateMap): TExState { + const executionState = executionStateMap[future.id] as TExState; + + assertIgnitionInvariant( + executionState !== undefined, + `Failure looking up execution state for future ${future.id}, there is no history of previous execution of this future` + ); + assertIgnitionInvariant( + future.type === executionState.futureType, + `Execution state type does not match future for future ${future.id}` + ); + + return executionState; +} + +function _assertNeverExecutionState(_state: never): SolidityParameterType { + throw new IgnitionError("Unknown execution state"); +} diff --git a/packages/core/src/new-api/internal/utils/resolveModuleParameter.ts b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts similarity index 97% rename from packages/core/src/new-api/internal/utils/resolveModuleParameter.ts rename to packages/core/src/new-api/internal/utils/resolve-module-parameter.ts index 0ccc31da94..48fb87ddb1 100644 --- a/packages/core/src/new-api/internal/utils/resolveModuleParameter.ts +++ b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts @@ -35,3 +35,5 @@ export function resolveModuleParameter( return moduleParamValue; } + +export function resolveFuture() {} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 58f9b7aff6..4fdaacc117 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -20,7 +20,11 @@ describe("execution engine", () => { const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); - const contract1 = m.contract("Contract1", [account1, supply]); + const contract1 = m.contract("Contract1", [ + account1, + supply, + { nested: supply }, + ]); return { contract1 }; }); @@ -49,7 +53,9 @@ describe("execution engine", () => { journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, - deploymentParameters: {}, + deploymentParameters: { + Module1: { supply: 2000 }, + }, }); assert.isDefined(result); @@ -66,7 +72,11 @@ describe("execution engine", () => { storedBuildInfoPath: "./build-info.json", contractName: "Contract1", value: BigInt(0).toString(), - constructorArgs: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + constructorArgs: [ + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + 2000, + { nested: 2000 }, + ], libraries: {}, from: accounts[0], }, @@ -74,7 +84,11 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", contractName: "Contract1", - args: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + args: [ + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + 2000, + { nested: 2000 }, + ], value: BigInt(0).toString(), from: exampleAccounts[0], storedArtifactPath: "/user/path/Contract1.json", @@ -252,6 +266,144 @@ describe("execution engine", () => { }, ]); }); + + describe("with complex arguments", () => { + it("should execute deploy when futures are passed as nested arguments", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const library1 = m.library("Library1"); + + const account1 = m.getAccount(1); + const supply = m.getParameter("supply", 1000); + + const contract1 = m.contract( + "Contract1", + [{ nested: library1, arr: [account1, supply] }], + { + libraries: { + Library1: library1, + }, + } + ); + + return { library1, contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assert.isDefined(module); + + const executionStateMap = {}; + + const batches = Batcher.batch(module, {}); + + const executionEngine = new ExecutionEngine(); + const journal = new MemoryJournal(); + const accounts: string[] = exampleAccounts; + const mockTransactionService = setupMockTransactionService(); + const mockArtifactResolver = setupMockArtifactResolver(); + + const result = await executionEngine.execute({ + batches, + module, + executionStateMap, + accounts, + strategy: new BasicExecutionStrategy(), + journal, + transactionService: mockTransactionService, + artifactResolver: mockArtifactResolver, + deploymentParameters: {}, + }); + + assert.isDefined(result); + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "/user/path/Library1.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + from: exampleAccounts[0], + storedArtifactPath: "/user/path/Library1.json", + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Library1", + contractName: "Library1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: ["Module1:Library1"], + storedArtifactPath: "/user/path/Contract1.json", + storedBuildInfoPath: "./build-info.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [ + { + arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + nested: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ], + libraries: { + Library1: "Module1:Library1", + }, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Contract1", + args: [ + { + nested: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + }, + ], + value: BigInt(0).toString(), + from: exampleAccounts[0], + storedArtifactPath: "/user/path/Contract1.json", + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]); + }); + }); }); function setupMockTransactionService(): TransactionService { From 91428716e1492541ef6769a23b9659e4032169fd Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 09:59:56 +0100 Subject: [PATCH 0476/1302] refactor: remove unused function --- .../core/src/new-api/internal/utils/resolve-module-parameter.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts index 48fb87ddb1..0ccc31da94 100644 --- a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts @@ -35,5 +35,3 @@ export function resolveModuleParameter( return moduleParamValue; } - -export function resolveFuture() {} From c49f058f563a2f48e6b2689052293cf2cedb4dfc Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 10:37:43 +0100 Subject: [PATCH 0477/1302] refactor: add todo to improve error display in tests --- packages/hardhat-plugin/src/ignition-test-helper.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hardhat-plugin/src/ignition-test-helper.ts b/packages/hardhat-plugin/src/ignition-test-helper.ts index d2ccdfc36f..1079e9b7cd 100644 --- a/packages/hardhat-plugin/src/ignition-test-helper.ts +++ b/packages/hardhat-plugin/src/ignition-test-helper.ts @@ -42,6 +42,7 @@ export class IgnitionTestHelper { ); if (result.status !== "success") { + // TODO: Show more information about why it failed throw new IgnitionError("Failed deployment"); } From 5f401566072a9608e3f34092614a0c0cafbeeb69 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 11:00:11 +0100 Subject: [PATCH 0478/1302] refactor: rename to IgnitionHelper --- .../src/{ignition-test-helper.ts => ignition-helper.ts} | 2 +- packages/hardhat-plugin/src/index.ts | 4 ++-- packages/hardhat-plugin/src/type-extensions.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename packages/hardhat-plugin/src/{ignition-test-helper.ts => ignition-helper.ts} (98%) diff --git a/packages/hardhat-plugin/src/ignition-test-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts similarity index 98% rename from packages/hardhat-plugin/src/ignition-test-helper.ts rename to packages/hardhat-plugin/src/ignition-helper.ts index 1079e9b7cd..f4d15483bb 100644 --- a/packages/hardhat-plugin/src/ignition-test-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -14,7 +14,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; -export class IgnitionTestHelper { +export class IgnitionHelper { constructor(private _hre: HardhatRuntimeEnvironment) {} public async deploy( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d4b7d79e25..1b8844f0e8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -18,7 +18,7 @@ import prompts from "prompts"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; -import { IgnitionTestHelper } from "./ignition-test-helper"; +import { IgnitionHelper } from "./ignition-helper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; import { writePlan } from "./plan/write-plan"; @@ -97,7 +97,7 @@ extendEnvironment((hre) => { // TODO: rewire txPollingInterval // const txPollingInterval = isHardhatNetwork ? 100 : 5000; - return new IgnitionTestHelper(hre); + return new IgnitionHelper(hre); }); }); diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index b267645273..ca376869eb 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -5,7 +5,7 @@ import "hardhat/types/runtime"; import type { IgnitionWrapper } from "./ignition-wrapper"; import type { IgnitionConfig } from "./index"; -import { IgnitionTestHelper } from "./ignition-test-helper"; +import { IgnitionHelper } from "./ignition-helper"; declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { @@ -33,6 +33,6 @@ declare module "hardhat/types/runtime" { } export interface HardhatRuntimeEnvironment { - ignition2: IgnitionTestHelper; + ignition2: IgnitionHelper; } } From 99447a157237c3e058f01fe8373443e38e6124b0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 16 Jun 2023 11:07:57 +0100 Subject: [PATCH 0479/1302] feat: add deployment loader Save a deployment to disk as it progresses. --- examples/sample/.gitignore | 2 + packages/core/src/new-api/deployer.ts | 14 ++- .../internal/execution/execution-engine.ts | 15 +++- .../src/new-api/internal/execution/guards.ts | 16 ++++ .../internal/types/execution-engine.ts | 3 +- packages/core/src/new-api/types/artifact.ts | 16 ++++ .../new-api/execution/execution-engine.ts | 20 ++++- .../src/buildDeploymentLoader.ts | 86 +++++++++++++++++++ .../hardhat-plugin/src/ignition-helper.ts | 3 + packages/hardhat-plugin/src/index.ts | 41 ++++++--- 10 files changed, 199 insertions(+), 17 deletions(-) create mode 100644 packages/hardhat-plugin/src/buildDeploymentLoader.ts diff --git a/examples/sample/.gitignore b/examples/sample/.gitignore index 71f6a160fc..2b8069dd92 100644 --- a/examples/sample/.gitignore +++ b/examples/sample/.gitignore @@ -9,3 +9,5 @@ typechain-types cache artifacts +ignition/deployments + diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 45d440cda2..84e09033ce 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -16,7 +16,7 @@ import { ExecutionStateMap } from "./internal/types/execution-state"; import { validate } from "./internal/validation/validate"; import { isAdapters } from "./type-guards"; import { Adapters } from "./types/adapters"; -import { ArtifactResolver } from "./types/artifact"; +import { ArtifactResolver, DeploymentLoader } from "./types/artifact"; import { DeploymentResult } from "./types/deployer"; import { Journal } from "./types/journal"; import { TransactionService } from "./types/transaction-service"; @@ -33,9 +33,14 @@ export class Deployer { private _transactionService: TransactionService; private _strategy: ExecutionStrategy; private _artifactResolver: ArtifactResolver; + private _deploymentLoader: DeploymentLoader; constructor( - options: { journal: Journal; artifactResolver: ArtifactResolver } & ( + options: { + journal: Journal; + artifactResolver: ArtifactResolver; + deploymentLoader: DeploymentLoader; + } & ( | { transactionService: TransactionService; } @@ -47,6 +52,7 @@ export class Deployer { this._journal = options.journal; this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; + this._deploymentLoader = options.deploymentLoader; if ("adapters" in options && isAdapters(options.adapters)) { const adapters: Adapters = options.adapters; @@ -69,6 +75,7 @@ export class Deployer { } public async deploy( + deployId: string, moduleDefinition: IgnitionModuleDefinition< string, string, @@ -81,6 +88,8 @@ export class Deployer { await validate(module, this._artifactResolver); + await this._deploymentLoader.initialize(deployId); + const previousStateMap = await this._loadExecutionStateFrom(this._journal); const reconciliationResult = Reconciler.reconcile( @@ -110,6 +119,7 @@ export class Deployer { executionStateMap: previousStateMap, accounts, deploymentParameters, + deploymentLoader: this._deploymentLoader, }); } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 25d034beaa..f72b7567d1 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -28,7 +28,12 @@ import { resolveFutureToValue } from "../utils/resolve-future-to-value"; import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { executionStateReducer } from "./executionStateReducer"; -import { isExecutionResult, isOnChainAction, isOnchainResult } from "./guards"; +import { + isDeployedContractExecutionSuccess, + isExecutionResult, + isOnChainAction, + isOnchainResult, +} from "./guards"; type ExecutionBatch = Future[]; @@ -139,6 +144,14 @@ export class ExecutionEngine { message: JournalableMessage ): Promise { await state.journal.record(message); + + if (isDeployedContractExecutionSuccess(message)) { + await state.deploymentLoader.recordDeployedAddress( + message.futureId, + message.contractAddress + ); + } + state.executionStateMap = executionStateReducer( state.executionStateMap, message diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 0cd61fb892..7b3ef1b21e 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -1,7 +1,9 @@ import { DeployContractInteractionMessage, + DeployedContractExecutionSuccess, ExecutionResultMessage, ExecutionResultTypes, + ExecutionSuccess, JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, @@ -19,6 +21,12 @@ export function isExecutionResult( return (resultTypes as string[]).includes(potential.type); } +export function isExecutionSuccess( + potential: JournalableMessage +): potential is ExecutionSuccess { + return potential.type === "execution-success"; +} + export function isExecutionMessage( potential: JournalableMessage ): potential is ExecutionResultMessage { @@ -46,3 +54,11 @@ export function isDeployContractInteraction( ): potential is DeployContractInteractionMessage { return isOnChainAction(potential) && potential.subtype === "deploy-contract"; } + +export function isDeployedContractExecutionSuccess( + potential: JournalableMessage +): potential is DeployedContractExecutionSuccess { + return ( + isExecutionSuccess(potential) && potential.subtype === "deploy-contract" + ); +} diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 5f721c61e7..29382f3eb6 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,4 +1,4 @@ -import { ArtifactResolver } from "../../types/artifact"; +import { ArtifactResolver, DeploymentLoader } from "../../types/artifact"; import { Journal, JournalableMessage, @@ -24,6 +24,7 @@ export interface ExecutionEngineState { journal: Journal; transactionService: TransactionService; artifactResolver: ArtifactResolver; + deploymentLoader: DeploymentLoader; } export interface ExecutionStrategy { diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 1cb9d66555..27133b29fc 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -1,3 +1,5 @@ +import { Journal } from "./journal"; + /** * An compilation artifact representing a smart contract. * @@ -22,3 +24,17 @@ export interface ArtifactResolver { load(contractName: string): Promise; resolvePath(contractName: string): Promise; } + +/** + * Read and write to the deployment storage. + * + * @beta + */ +export interface DeploymentLoader { + journal: Journal; + initialize(deploymentId: string): Promise; + recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise; +} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 4fdaacc117..de26985f69 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { Artifact, FutureType } from "../../../src"; +import { Artifact, DeploymentLoader, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { Batcher } from "../../../src/new-api/internal/batcher"; import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; @@ -43,6 +43,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); + const mockDeploymentLoader = setupMockDeploymentLoader(); const result = await executionEngine.execute({ batches, @@ -53,6 +54,7 @@ describe("execution engine", () => { journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, + deploymentLoader: mockDeploymentLoader, deploymentParameters: { Module1: { supply: 2000 }, }, @@ -129,6 +131,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); + const mockDeploymentLoader = setupMockDeploymentLoader(); const result = await executionEngine.execute({ batches, @@ -139,6 +142,7 @@ describe("execution engine", () => { journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, + deploymentLoader: mockDeploymentLoader, deploymentParameters: {}, }); @@ -212,6 +216,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); + const mockDeploymentLoader = setupMockDeploymentLoader(); const result = await executionEngine.execute({ batches, @@ -222,6 +227,7 @@ describe("execution engine", () => { journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, + deploymentLoader: mockDeploymentLoader, deploymentParameters: {}, }); @@ -302,6 +308,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); + const mockDeploymentLoader = setupMockDeploymentLoader(); const result = await executionEngine.execute({ batches, @@ -312,6 +319,7 @@ describe("execution engine", () => { journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, + deploymentLoader: mockDeploymentLoader, deploymentParameters: {}, }); @@ -418,6 +426,16 @@ function setupMockTransactionService(): TransactionService { } as TransactionService; } +function setupMockDeploymentLoader(): DeploymentLoader { + return { + journal: new MemoryJournal(), + initialize: () => { + throw new Error("Not implemented"); + }, + recordDeployedAddress: async () => {}, + }; +} + async function accumulateMessages( journal: Journal ): Promise { diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts new file mode 100644 index 0000000000..cf39455260 --- /dev/null +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -0,0 +1,86 @@ +import { + DeploymentLoader, + Journal, + MemoryJournal, +} from "@ignored/ignition-core"; +import fs from "fs-extra"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; +import { errorMonitor } from "stream"; + +class IgnitionDeploymentLoader implements DeploymentLoader { + public journal: Journal; + private _paths: { + deploymentDir: string; + artifactsDir: string; + journalPath: string; + deployedAddressesPath: string; + } | null = null; + + constructor(private readonly _ignitionDir: string) { + this.journal = new MemoryJournal(); + } + + public async initialize(deploymentId: string): Promise { + // TODO: validate the deployment id + const deploymentDir = path.join( + this._ignitionDir, + "deployments", + deploymentId + ); + const artifactsDir = path.join(deploymentDir, "artifacts"); + const journalPath = path.join(deploymentDir, "journal.jsonl"); + const deployedAddressesPath = path.join( + deploymentDir, + "deployed_addresses.json" + ); + + this._paths = { + deploymentDir, + artifactsDir, + journalPath, + deployedAddressesPath, + }; + + await fs.ensureDir(this._paths.deploymentDir); + await fs.ensureDir(this._paths.artifactsDir); + await fs.ensureFile(this._paths.journalPath); + await fs.ensureFile(this._paths.deployedAddressesPath); + } + + public async recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise { + if (this._paths === null) { + // TODO: change this to assertion with move to core + throw new Error("Cannot record deploy address until initialize"); + } + + try { + // TODO: should this be made async to be closer to a single fs transaction? + const json = ( + await fs.readFile(this._paths.deployedAddressesPath) + ).toString(); + + const deployedAddresses: { [key: string]: string } = JSON.parse( + json === "" ? "{}" : json + ); + + deployedAddresses[futureId] = contractAddress; + + await fs.writeFile( + this._paths.deployedAddressesPath, + `${JSON.stringify(deployedAddresses, undefined, 2)}\n` + ); + } catch (error) { + console.error(errorMonitor); + } + } +} + +export function buildDeploymentLoader( + hre: HardhatRuntimeEnvironment +): DeploymentLoader { + return new IgnitionDeploymentLoader(hre.config.paths.ignition); +} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index f4d15483bb..004caf68d0 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -13,6 +13,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; +import { buildDeploymentLoader } from "./buildDeploymentLoader"; export class IgnitionHelper { constructor(private _hre: HardhatRuntimeEnvironment) {} @@ -33,9 +34,11 @@ export class IgnitionHelper { journal: new MemoryJournal(), adapters: buildAdaptersFrom(this._hre), artifactResolver: buildArtifactResolverFrom(this._hre), + deploymentLoader: buildDeploymentLoader(this._hre), }); const result = await deployer.deploy( + "deploy-01", ignitionModuleDefinition, parameters, accounts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1b8844f0e8..a7a918d31a 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -17,6 +17,7 @@ import prompts from "prompts"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; +import { buildDeploymentLoader } from "./buildDeploymentLoader"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; import { IgnitionHelper } from "./ignition-helper"; import { IgnitionWrapper } from "./ignition-wrapper"; @@ -192,13 +193,20 @@ task("deploy2") "parameters", "A JSON object as a string, of the module parameters, or a relative path to a JSON file" ) + .addOptionalParam("id", "set the deployment id") .addFlag("force", "restart the deployment ignoring previous history") .setAction( async ( { moduleNameOrPath, parameters: parametersInput, - }: { moduleNameOrPath: string; parameters?: string; force: boolean }, + id: givenDeploymentId, + }: { + moduleNameOrPath: string; + parameters?: string; + force: boolean; + id: string; + }, hre ) => { const chainId = Number( @@ -245,26 +253,35 @@ task("deploy2") parameters = resolveParametersString(parametersInput); } - // TODO: bring back check with file journaling proper - const isHardhatNetwork = true; // hre.network.name === "hardhat"; - - const journal = isHardhatNetwork - ? new MemoryJournal() - : new FileJournal( - resolveJournalPath(userModule.name, hre.config.paths.ignition) - ); - const accounts = (await hre.network.provider.request({ method: "eth_accounts", })) as string[]; try { + const deploymentId = givenDeploymentId ?? `network-${chainId}`; + const artifactResolver = buildArtifactResolverFrom(hre); const adapters = buildAdaptersFrom(hre); - - const deployer = new Deployer({ journal, adapters, artifactResolver }); + // TODO: bring back check with file journaling proper + const isHardhatNetwork = true; // hre.network.name === "hardhat"; + + const journal = isHardhatNetwork + ? new MemoryJournal() + : new FileJournal( + resolveJournalPath(userModule.name, hre.config.paths.ignition) + ); + + const deploymentLoader = buildDeploymentLoader(hre); + + const deployer = new Deployer({ + journal, + adapters, + artifactResolver, + deploymentLoader, + }); const result = await deployer.deploy( + deploymentId, userModule as any, parameters as any, accounts From 7c3609ab2670f01c6e7ba31a84ae4455b8948c9e Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 20 Jun 2023 16:35:51 +0100 Subject: [PATCH 0480/1302] refactor: move journal under deployment loader --- packages/core/src/new-api/deployer.ts | 8 +++----- .../internal/execution/execution-engine.ts | 2 +- .../new-api/internal/types/execution-engine.ts | 2 -- .../test/new-api/execution/execution-engine.ts | 16 ++++++---------- .../hardhat-plugin/src/buildDeploymentLoader.ts | 12 +++++++----- packages/hardhat-plugin/src/ignition-helper.ts | 2 -- packages/hardhat-plugin/src/index.ts | 11 ----------- 7 files changed, 17 insertions(+), 36 deletions(-) diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 84e09033ce..4580d1a232 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -27,7 +27,6 @@ import { TransactionService } from "./types/transaction-service"; * @beta */ export class Deployer { - private _journal: Journal; private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; private _transactionService: TransactionService; @@ -37,7 +36,6 @@ export class Deployer { constructor( options: { - journal: Journal; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; } & ( @@ -49,7 +47,6 @@ export class Deployer { } ) ) { - this._journal = options.journal; this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; this._deploymentLoader = options.deploymentLoader; @@ -90,7 +87,9 @@ export class Deployer { await this._deploymentLoader.initialize(deployId); - const previousStateMap = await this._loadExecutionStateFrom(this._journal); + const previousStateMap = await this._loadExecutionStateFrom( + this._deploymentLoader.journal + ); const reconciliationResult = Reconciler.reconcile( module, @@ -111,7 +110,6 @@ export class Deployer { return this._executionEngine.execute({ strategy: this._strategy, - journal: this._journal, transactionService: this._transactionService, artifactResolver: this._artifactResolver, batches, diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index f72b7567d1..deea9a62a3 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -143,7 +143,7 @@ export class ExecutionEngine { state: ExecutionEngineState, message: JournalableMessage ): Promise { - await state.journal.record(message); + await state.deploymentLoader.journal.record(message); if (isDeployedContractExecutionSuccess(message)) { await state.deploymentLoader.recordDeployedAddress( diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 29382f3eb6..c8cfafea6f 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,6 +1,5 @@ import { ArtifactResolver, DeploymentLoader } from "../../types/artifact"; import { - Journal, JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, @@ -21,7 +20,6 @@ export interface ExecutionEngineState { accounts: string[]; deploymentParameters: { [key: string]: ModuleParameters }; strategy: ExecutionStrategy; - journal: Journal; transactionService: TransactionService; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index de26985f69..a693e02828 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -43,7 +43,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); - const mockDeploymentLoader = setupMockDeploymentLoader(); + const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ batches, @@ -51,7 +51,6 @@ describe("execution engine", () => { executionStateMap, accounts, strategy: new BasicExecutionStrategy(), - journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, deploymentLoader: mockDeploymentLoader, @@ -131,7 +130,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); - const mockDeploymentLoader = setupMockDeploymentLoader(); + const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ batches, @@ -139,7 +138,6 @@ describe("execution engine", () => { executionStateMap, accounts, strategy: new BasicExecutionStrategy(), - journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, deploymentLoader: mockDeploymentLoader, @@ -216,7 +214,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); - const mockDeploymentLoader = setupMockDeploymentLoader(); + const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ batches, @@ -224,7 +222,6 @@ describe("execution engine", () => { executionStateMap, accounts, strategy: new BasicExecutionStrategy(), - journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, deploymentLoader: mockDeploymentLoader, @@ -308,7 +305,7 @@ describe("execution engine", () => { const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); const mockArtifactResolver = setupMockArtifactResolver(); - const mockDeploymentLoader = setupMockDeploymentLoader(); + const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ batches, @@ -316,7 +313,6 @@ describe("execution engine", () => { executionStateMap, accounts, strategy: new BasicExecutionStrategy(), - journal, transactionService: mockTransactionService, artifactResolver: mockArtifactResolver, deploymentLoader: mockDeploymentLoader, @@ -426,9 +422,9 @@ function setupMockTransactionService(): TransactionService { } as TransactionService; } -function setupMockDeploymentLoader(): DeploymentLoader { +function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { return { - journal: new MemoryJournal(), + journal, initialize: () => { throw new Error("Not implemented"); }, diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index cf39455260..ef054e4c52 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -9,7 +9,6 @@ import path from "path"; import { errorMonitor } from "stream"; class IgnitionDeploymentLoader implements DeploymentLoader { - public journal: Journal; private _paths: { deploymentDir: string; artifactsDir: string; @@ -17,9 +16,7 @@ class IgnitionDeploymentLoader implements DeploymentLoader { deployedAddressesPath: string; } | null = null; - constructor(private readonly _ignitionDir: string) { - this.journal = new MemoryJournal(); - } + constructor(private readonly _ignitionDir: string, public journal: Journal) {} public async initialize(deploymentId: string): Promise { // TODO: validate the deployment id @@ -82,5 +79,10 @@ class IgnitionDeploymentLoader implements DeploymentLoader { export function buildDeploymentLoader( hre: HardhatRuntimeEnvironment ): DeploymentLoader { - return new IgnitionDeploymentLoader(hre.config.paths.ignition); + // TODO: bring back check with file journaling proper + const isHardhatNetwork = true; // hre.network.name === "hardhat"; + + const journal = isHardhatNetwork ? new MemoryJournal() : new MemoryJournal(); + + return new IgnitionDeploymentLoader(hre.config.paths.ignition, journal); } diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index 004caf68d0..904d2524b7 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -4,7 +4,6 @@ import { IgnitionError, IgnitionModuleDefinition, IgnitionModuleResult, - MemoryJournal, ModuleParameters, } from "@ignored/ignition-core"; import { Contract } from "ethers"; @@ -31,7 +30,6 @@ export class IgnitionHelper { })) as string[]; const deployer = new Deployer({ - journal: new MemoryJournal(), adapters: buildAdaptersFrom(this._hre), artifactResolver: buildArtifactResolverFrom(this._hre), deploymentLoader: buildDeploymentLoader(this._hre), diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index a7a918d31a..c7aac76c4e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,7 +1,5 @@ import { Deployer, - FileJournal, - MemoryJournal, Module, ModuleConstructor, ModuleDict, @@ -262,19 +260,10 @@ task("deploy2") const artifactResolver = buildArtifactResolverFrom(hre); const adapters = buildAdaptersFrom(hre); - // TODO: bring back check with file journaling proper - const isHardhatNetwork = true; // hre.network.name === "hardhat"; - - const journal = isHardhatNetwork - ? new MemoryJournal() - : new FileJournal( - resolveJournalPath(userModule.name, hre.config.paths.ignition) - ); const deploymentLoader = buildDeploymentLoader(hre); const deployer = new Deployer({ - journal, adapters, artifactResolver, deploymentLoader, From 640375fa5c90bed329abcf1734eae549db96c963 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Jun 2023 09:29:46 +0100 Subject: [PATCH 0481/1302] fix: use default param is no parameters provided --- .../new-api/internal/utils/resolve-module-parameter.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts index 0ccc31da94..bac2ae1418 100644 --- a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts @@ -10,6 +10,15 @@ export function resolveModuleParameter( moduleParamRuntimeValue: ModuleParameterRuntimeValue, context: { deploymentParameters: { [key: string]: ModuleParameters } } ): ModuleParameterType { + if (context.deploymentParameters === undefined) { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + + return moduleParamRuntimeValue.defaultValue; + } + const moduleParameters = context.deploymentParameters[moduleParamRuntimeValue.moduleId]; From a9e636b8d398d8e7a9c53958e8f74f5d1a038dc1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Jun 2023 10:32:47 +0100 Subject: [PATCH 0482/1302] refactor: distinguish between file and memory deployment loader Vary depending on whether it is an ephemeral Hardhat network. --- .../src/buildDeploymentLoader.ts | 60 +++++++++++++++---- 1 file changed, 49 insertions(+), 11 deletions(-) diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index ef054e4c52..8df8cec957 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -1,14 +1,41 @@ import { DeploymentLoader, + FileJournal, Journal, MemoryJournal, } from "@ignored/ignition-core"; +import { assertIgnitionInvariant } from "@ignored/ignition-core/src/new-api/internal/utils/assertions"; import fs from "fs-extra"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; import { errorMonitor } from "stream"; -class IgnitionDeploymentLoader implements DeploymentLoader { +class MemoryDeploymentLoader implements DeploymentLoader { + public journal: Journal; + + private _deploymentId: string | null = null; + private _deployedAddresses: { [key: string]: string }; + + constructor() { + this.journal = new MemoryJournal(); + this._deployedAddresses = {}; + } + + public async initialize(deploymentId: string): Promise { + this._deploymentId = deploymentId; + } + + public async recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise { + this._deployedAddresses[futureId] = contractAddress; + } +} + +class FileDeploymentLoader implements DeploymentLoader { + public journal: Journal; + private _paths: { deploymentDir: string; artifactsDir: string; @@ -16,7 +43,9 @@ class IgnitionDeploymentLoader implements DeploymentLoader { deployedAddressesPath: string; } | null = null; - constructor(private readonly _ignitionDir: string, public journal: Journal) {} + constructor(private readonly _ignitionDir: string) { + this.journal = new FileJournal(path.join(_ignitionDir, "journal.jsonl")); + } public async initialize(deploymentId: string): Promise { // TODO: validate the deployment id @@ -49,10 +78,10 @@ class IgnitionDeploymentLoader implements DeploymentLoader { futureId: string, contractAddress: string ): Promise { - if (this._paths === null) { - // TODO: change this to assertion with move to core - throw new Error("Cannot record deploy address until initialize"); - } + assertIgnitionInvariant( + this._paths !== null, + "Cannot record deploy address until initialized" + ); try { // TODO: should this be made async to be closer to a single fs transaction? @@ -79,10 +108,19 @@ class IgnitionDeploymentLoader implements DeploymentLoader { export function buildDeploymentLoader( hre: HardhatRuntimeEnvironment ): DeploymentLoader { - // TODO: bring back check with file journaling proper - const isHardhatNetwork = true; // hre.network.name === "hardhat"; - - const journal = isHardhatNetwork ? new MemoryJournal() : new MemoryJournal(); + return _isEphemeral(hre) + ? new MemoryDeploymentLoader() + : new FileDeploymentLoader(hre.config.paths.ignition); +} - return new IgnitionDeploymentLoader(hre.config.paths.ignition, journal); +/** + * Determine whether to use a disk based deployment loader or memory based + * deployment loader. + * + * The test is whether Hardhat reports the network name as hardhat which + * is the network name in tests and if the `--network` flag is not set. + * Running against a local node will not count as ephemeral. + */ +function _isEphemeral(hre: HardhatRuntimeEnvironment) { + return hre.network.name === "hardhat"; } From dd3b23f81cd2bd169c99269af79a2e96c3c7f4e1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Jun 2023 10:36:36 +0100 Subject: [PATCH 0483/1302] refactor: move journals into own files --- packages/core/src/index.ts | 3 +- .../new-api/internal/journal/file-journal.ts | 20 +++++++++ .../internal/journal/memory-journal.ts | 23 +++++++++++ packages/core/src/new-api/journal.ts | 41 ------------------- .../new-api/execution/execution-engine.ts | 2 +- 5 files changed, 46 insertions(+), 43 deletions(-) create mode 100644 packages/core/src/new-api/internal/journal/file-journal.ts create mode 100644 packages/core/src/new-api/internal/journal/memory-journal.ts delete mode 100644 packages/core/src/new-api/journal.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3396680b8f..888d45e423 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,8 +4,9 @@ export * from "./initialization"; export { defineModule } from "./new-api/define-module"; export { Deployer } from "./new-api/deployer"; /* TODO: how is module constructor getting exposed? */ +export { FileJournal } from "./new-api/internal/journal/file-journal"; +export { MemoryJournal } from "./new-api/internal/journal/memory-journal"; export { ModuleConstructor } from "./new-api/internal/module-builder"; -export { FileJournal, MemoryJournal } from "./new-api/journal"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; export * from "./new-api/type-guards"; export * from "./new-api/types/adapters"; diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts new file mode 100644 index 0000000000..df8cde8117 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -0,0 +1,20 @@ +import { IgnitionError } from "../../../errors"; +import { Journal, JournalableMessage } from "../../types/journal"; + +/** + * An file-based journal. + * + * @beta + */ + +export class FileJournal implements Journal { + constructor(private _filePath: string) {} + + public async record(_message: JournalableMessage): Promise { + throw new IgnitionError("Not implemented"); + } + + public async *read(): AsyncGenerator { + throw new IgnitionError("Not implemented"); + } +} diff --git a/packages/core/src/new-api/internal/journal/memory-journal.ts b/packages/core/src/new-api/internal/journal/memory-journal.ts new file mode 100644 index 0000000000..4384828fc6 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/memory-journal.ts @@ -0,0 +1,23 @@ +import { Journal, JournalableMessage } from "../../types/journal"; + +/** + * An in-memory journal. + * + * @beta + */ + +export class MemoryJournal implements Journal { + private messages: string[] = []; + + public async record(message: JournalableMessage): Promise { + this.messages.push(JSON.stringify(message)); + } + + public async *read(): AsyncGenerator { + for (const entry of this.messages) { + const message: JournalableMessage = JSON.parse(entry); + + yield message; + } + } +} diff --git a/packages/core/src/new-api/journal.ts b/packages/core/src/new-api/journal.ts deleted file mode 100644 index 8b7329c489..0000000000 --- a/packages/core/src/new-api/journal.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { IgnitionError } from "../errors"; - -import { Journal, JournalableMessage } from "./types/journal"; - -/** - * An in-memory journal. - * - * @beta - */ -export class MemoryJournal implements Journal { - private messages: string[] = []; - - public async record(message: JournalableMessage): Promise { - this.messages.push(JSON.stringify(message)); - } - - public async *read(): AsyncGenerator { - for (const entry of this.messages) { - const message: JournalableMessage = JSON.parse(entry); - - yield message; - } - } -} - -/** - * An file-based journal. - * - * @beta - */ -export class FileJournal implements Journal { - constructor(private _filePath: string) {} - - public async record(_message: JournalableMessage): Promise { - throw new IgnitionError("Not implemented"); - } - - public async *read(): AsyncGenerator { - throw new IgnitionError("Not implemented"); - } -} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index a693e02828..d3d8b42a4c 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -5,8 +5,8 @@ import { defineModule } from "../../../src/new-api/define-module"; import { Batcher } from "../../../src/new-api/internal/batcher"; import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; import { BasicExecutionStrategy } from "../../../src/new-api/internal/execution/execution-strategy"; +import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; -import { MemoryJournal } from "../../../src/new-api/journal"; import { Journal, JournalableMessage, From 4e98c5755cd551ba3731af60de640fc34b1b7794 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Jun 2023 11:12:56 +0100 Subject: [PATCH 0484/1302] refactor: pull in serialization/deserialization to file journal --- package-lock.json | 2 ++ packages/core/package.json | 2 ++ .../new-api/internal/journal/file-journal.ts | 32 ++++++++++++++--- .../journal/utils/deserialize-replacer.ts | 24 +++++++++++++ .../journal/utils/serialize-replacer.ts | 34 +++++++++++++++++++ .../src/buildDeploymentLoader.ts | 13 +++---- 6 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts create mode 100644 packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts diff --git a/package-lock.json b/package-lock.json index d3450e1a7c..147269c512 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20989,6 +20989,7 @@ "ethers": "^5.4.7", "js-graph-algorithms": "1.0.18", "lodash": "4.17.21", + "ndjson": "2.0.0", "object-hash": "^3.0.0", "serialize-error": "8.1.0" }, @@ -21000,6 +21001,7 @@ "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "9.1.1", + "@types/ndjson": "2.0.1", "@types/node": "12.20.25", "@types/object-hash": "^2.2.1", "@types/react": "^17.0.35", diff --git a/packages/core/package.json b/packages/core/package.json index 63317cea10..74357b688d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -61,6 +61,7 @@ "@types/debug": "^4.1.7", "@types/fs-extra": "^9.0.13", "@types/mocha": "9.1.1", + "@types/ndjson": "2.0.1", "@types/node": "12.20.25", "@types/object-hash": "^2.2.1", "@types/react": "^17.0.35", @@ -93,6 +94,7 @@ "ethers": "^5.4.7", "js-graph-algorithms": "1.0.18", "lodash": "4.17.21", + "ndjson": "2.0.0", "object-hash": "^3.0.0", "serialize-error": "8.1.0" } diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index df8cde8117..1d18752a06 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -1,20 +1,42 @@ -import { IgnitionError } from "../../../errors"; +import fs from "fs"; +import ndjson from "ndjson"; + import { Journal, JournalableMessage } from "../../types/journal"; +import { deserializeReplacer } from "./utils/deserialize-replacer"; +import { serializeReplacer } from "./utils/serialize-replacer"; + /** * An file-based journal. * * @beta */ - export class FileJournal implements Journal { constructor(private _filePath: string) {} - public async record(_message: JournalableMessage): Promise { - throw new IgnitionError("Not implemented"); + public async record(message: JournalableMessage): Promise { + return fs.promises.appendFile( + this._filePath, + `${JSON.stringify(message, serializeReplacer.bind(this))}\n` + ); } public async *read(): AsyncGenerator { - throw new IgnitionError("Not implemented"); + if (!fs.existsSync(this._filePath)) { + return; + } + + const stream = fs.createReadStream(this._filePath).pipe(ndjson.parse()); + + for await (const chunk of stream) { + const json = JSON.stringify(chunk); + + const deserializedChunk = JSON.parse( + json, + deserializeReplacer.bind(this) + ); + + yield deserializedChunk as JournalableMessage; + } } } diff --git a/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts b/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts new file mode 100644 index 0000000000..c651b06a59 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts @@ -0,0 +1,24 @@ +import { deserializeError } from "serialize-error"; + +/** + * When JSON.parsing journal messages deserialize, this defines the replacer. + */ +export function deserializeReplacer(_key: string, value: unknown) { + if (typeof value === "string" && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)); + } + + if (_isSerializedBigInt(value)) { + return BigInt(value.substring(0, value.length - 1)); + } + + if (typeof value === "object" && value !== null && "message" in value) { + return deserializeError(value); + } + + return value; +} + +function _isSerializedBigInt(value: unknown): value is string { + return typeof value === "string" && /d+n/.test(value); +} diff --git a/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts b/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts new file mode 100644 index 0000000000..cab9f096a5 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts @@ -0,0 +1,34 @@ +import { serializeError } from "serialize-error"; + +/** + * When stringifying messages to the journal, this defines the replacer. + */ +export function serializeReplacer(_key: string, value: unknown) { + if (value instanceof Set) { + return Array.from(value).sort(); + } + + if (value instanceof Map) { + return Object.fromEntries(value); + } + + if (typeof value === "bigint") { + return `${value.toString(10)}n`; + } + + if (value instanceof Error) { + return serializeError(new Error(value.message)); + } + + if (value instanceof Object && !(value instanceof Array)) { + const obj: any = value; + return Object.keys(obj) + .sort() + .reduce((sorted: any, key) => { + sorted[key] = obj[key]; + return sorted; + }, {}); + } + + return value; +} diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index 8df8cec957..81489e9603 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -4,7 +4,6 @@ import { Journal, MemoryJournal, } from "@ignored/ignition-core"; -import { assertIgnitionInvariant } from "@ignored/ignition-core/src/new-api/internal/utils/assertions"; import fs from "fs-extra"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; @@ -44,7 +43,7 @@ class FileDeploymentLoader implements DeploymentLoader { } | null = null; constructor(private readonly _ignitionDir: string) { - this.journal = new FileJournal(path.join(_ignitionDir, "journal.jsonl")); + this.journal = new MemoryJournal(); } public async initialize(deploymentId: string): Promise { @@ -72,16 +71,18 @@ class FileDeploymentLoader implements DeploymentLoader { await fs.ensureDir(this._paths.artifactsDir); await fs.ensureFile(this._paths.journalPath); await fs.ensureFile(this._paths.deployedAddressesPath); + + this.journal = new FileJournal(journalPath); } public async recordDeployedAddress( futureId: string, contractAddress: string ): Promise { - assertIgnitionInvariant( - this._paths !== null, - "Cannot record deploy address until initialized" - ); + // TODO: switch to ignition invariant on move to core! + if (this._paths === null) { + throw new Error("Cannot record deploy address until initialized"); + } try { // TODO: should this be made async to be closer to a single fs transaction? From 75397a26f8e34ae104c8d206fd2f3c90c1976dd3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Jun 2023 14:57:05 +0100 Subject: [PATCH 0485/1302] refactor: store artifacts during execution --- packages/core/src/new-api/deployer.ts | 2 +- .../internal/execution/execution-engine.ts | 20 +++++-- .../transactions/transaction-service.ts | 10 ++-- packages/core/src/new-api/types/artifact.ts | 2 + .../new-api/execution/execution-engine.ts | 18 ++++-- .../src/buildDeploymentLoader.ts | 59 +++++++++++++++++-- 6 files changed, 87 insertions(+), 24 deletions(-) diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 4580d1a232..6c28c9d624 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -54,7 +54,7 @@ export class Deployer { if ("adapters" in options && isAdapters(options.adapters)) { const adapters: Adapters = options.adapters; this._transactionService = new TransactionServiceImplementation( - options.artifactResolver, + options.deploymentLoader, new EthersChainDispatcher( adapters.signer, adapters.gas, diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index deea9a62a3..611cc100d1 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -2,7 +2,7 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; import { isRuntimeValue } from "../../type-guards"; -import { ArtifactResolver } from "../../types/artifact"; +import { ArtifactResolver, DeploymentLoader } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { ExecutionResultMessage, @@ -190,11 +190,13 @@ export class ExecutionEngine { executionStateMap, accounts, artifactResolver, + deploymentLoader, deploymentParameters, }: { executionStateMap: ExecutionStateMap; accounts: string[]; artifactResolver: ArtifactResolver; + deploymentLoader: DeploymentLoader; deploymentParameters: { [key: string]: ModuleParameters }; } ): Promise { @@ -223,19 +225,22 @@ export class ExecutionEngine { ), from: this._resolveAddress(future.from, { accounts }), }; + return state; case FutureType.NAMED_CONTRACT_DEPLOYMENT: + const artifact = await artifactResolver.load(future.contractName); + const storedArtifactPath = await deploymentLoader.store( + future.id, + artifact + ); + state = { type: "execution-start", futureId: future.id, futureType: future.type, strategy, - // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), - // history: [], - storedArtifactPath: await artifactResolver.resolvePath( - future.contractName - ), + storedArtifactPath, storedBuildInfoPath: "./build-info.json", contractName: future.contractName, value: future.value.toString(), @@ -249,6 +254,7 @@ export class ExecutionEngine { ), from: this._resolveAddress(future.from, { accounts }), }; + return state; case FutureType.NAMED_LIBRARY_DEPLOYMENT: state = { @@ -271,6 +277,7 @@ export class ExecutionEngine { ), from: this._resolveAddress(future.from, { accounts }), }; + return state; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: state = { @@ -293,6 +300,7 @@ export class ExecutionEngine { ), from: this._resolveAddress(future.from, { accounts }), }; + return state; case FutureType.NAMED_CONTRACT_CALL: case FutureType.NAMED_STATIC_CALL: diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 7f625e668b..ff1e8609df 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "../../../../errors"; -import { ArtifactResolver } from "../../../types/artifact"; +import { DeploymentLoader } from "../../../types/artifact"; import { DeployContractInteractionMessage, DeployContractResultMessage, @@ -22,7 +22,7 @@ import { ChainDispatcher } from "./chain-dispatcher"; */ export class TransactionServiceImplementation implements TransactionService { constructor( - private _artifactLoader: ArtifactResolver, + private _deploymentLoader: DeploymentLoader, private _chainDispatcher: ChainDispatcher ) {} @@ -43,10 +43,10 @@ export class TransactionServiceImplementation implements TransactionService { deployContractInteraction: DeployContractInteractionMessage, libraries: { [libraryName: string]: string } = {} ): Promise { - // TODO: consider replacing this with a registry of artifacts - const artifact = await this._artifactLoader.load( - deployContractInteraction.contractName + const artifact = await this._deploymentLoader.loadArtifact( + deployContractInteraction.storedArtifactPath ); + const from = deployContractInteraction.from; const args = deployContractInteraction.args; const value = BigInt(deployContractInteraction.value); diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 27133b29fc..c6969256b0 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -33,6 +33,8 @@ export interface ArtifactResolver { export interface DeploymentLoader { journal: Journal; initialize(deploymentId: string): Promise; + store(futureId: string, artifact: Artifact): Promise; + loadArtifact(storedArtifactPath: string): Promise; recordDeployedAddress( futureId: string, contractAddress: string diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index d3d8b42a4c..8d305a1d7c 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -42,7 +42,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver(); + const mockArtifactResolver = setupMockArtifactResolver({} as any); const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ @@ -69,7 +69,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "/user/path/Contract1.json", + storedArtifactPath: "Module1:Contract1.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", value: BigInt(0).toString(), @@ -92,7 +92,7 @@ describe("execution engine", () => { ], value: BigInt(0).toString(), from: exampleAccounts[0], - storedArtifactPath: "/user/path/Contract1.json", + storedArtifactPath: "Module1:Contract1.json", }, { type: "onchain-result", @@ -304,7 +304,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver(); + const mockArtifactResolver = setupMockArtifactResolver({} as any); const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ @@ -364,7 +364,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: ["Module1:Library1"], - storedArtifactPath: "/user/path/Contract1.json", + storedArtifactPath: "Module1:Contract1.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", value: BigInt(0).toString(), @@ -391,7 +391,7 @@ describe("execution engine", () => { ], value: BigInt(0).toString(), from: exampleAccounts[0], - storedArtifactPath: "/user/path/Contract1.json", + storedArtifactPath: "Module1:Contract1.json", }, { type: "onchain-result", @@ -429,6 +429,12 @@ function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { throw new Error("Not implemented"); }, recordDeployedAddress: async () => {}, + store: async (futureId, _artifact) => { + return `${futureId}.json`; + }, + loadArtifact: async (_storedArtifactPath) => { + throw new Error("Not implemented"); + }, }; } diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index 81489e9603..f09defd51b 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -1,4 +1,5 @@ import { + Artifact, DeploymentLoader, FileJournal, Journal, @@ -15,11 +16,19 @@ class MemoryDeploymentLoader implements DeploymentLoader { private _deploymentId: string | null = null; private _deployedAddresses: { [key: string]: string }; - constructor() { + constructor(private _hre: HardhatRuntimeEnvironment) { this.journal = new MemoryJournal(); this._deployedAddresses = {}; } + public async loadArtifact(storedArtifactPath: string): Promise { + const json = await fs.readFile(storedArtifactPath); + + const artifact = JSON.parse(json.toString()); + + return artifact; + } + public async initialize(deploymentId: string): Promise { this._deploymentId = deploymentId; } @@ -30,6 +39,20 @@ class MemoryDeploymentLoader implements DeploymentLoader { ): Promise { this._deployedAddresses[futureId] = contractAddress; } + + public async store(_futureId: string, artifact: Artifact): Promise { + const artifactPaths = await this._hre.artifacts.getArtifactPaths(); + + const artifactPath = artifactPaths.find( + (p) => path.parse(p).name === artifact.contractName + ); + + if (artifactPath === undefined) { + throw new Error(`Artifact path not found for ${artifact.contractName}`); + } + + return artifactPath; + } } class FileDeploymentLoader implements DeploymentLoader { @@ -42,14 +65,22 @@ class FileDeploymentLoader implements DeploymentLoader { deployedAddressesPath: string; } | null = null; - constructor(private readonly _ignitionDir: string) { + constructor(private readonly _hre: HardhatRuntimeEnvironment) { this.journal = new MemoryJournal(); } + public async loadArtifact(storedArtifactPath: string): Promise { + const json = await fs.readFile(storedArtifactPath); + + const artifact = JSON.parse(json.toString()); + + return artifact; + } + public async initialize(deploymentId: string): Promise { // TODO: validate the deployment id const deploymentDir = path.join( - this._ignitionDir, + this._hre.config.paths.ignition, "deployments", deploymentId ); @@ -75,11 +106,27 @@ class FileDeploymentLoader implements DeploymentLoader { this.journal = new FileJournal(journalPath); } + public async store(futureId: string, artifact: Artifact): Promise { + if (this._paths === null) { + throw new Error("Cannot record deploy address until initialized"); + } + + const artifactFilePath = path.join( + this._paths.artifactsDir, + `${futureId}.json` + ); + await fs.writeFile( + artifactFilePath, + JSON.stringify(artifact, undefined, 2) + ); + + return artifactFilePath; + } + public async recordDeployedAddress( futureId: string, contractAddress: string ): Promise { - // TODO: switch to ignition invariant on move to core! if (this._paths === null) { throw new Error("Cannot record deploy address until initialized"); } @@ -110,8 +157,8 @@ export function buildDeploymentLoader( hre: HardhatRuntimeEnvironment ): DeploymentLoader { return _isEphemeral(hre) - ? new MemoryDeploymentLoader() - : new FileDeploymentLoader(hre.config.paths.ignition); + ? new MemoryDeploymentLoader(hre) + : new FileDeploymentLoader(hre); } /** From 0165487e469f0fb34cdb9c01027087c08066f687 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 10:30:08 +0100 Subject: [PATCH 0486/1302] refactor: record artifact path relative to deployment dir --- .../src/buildDeploymentLoader.ts | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index f09defd51b..94e07629aa 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -69,14 +69,6 @@ class FileDeploymentLoader implements DeploymentLoader { this.journal = new MemoryJournal(); } - public async loadArtifact(storedArtifactPath: string): Promise { - const json = await fs.readFile(storedArtifactPath); - - const artifact = JSON.parse(json.toString()); - - return artifact; - } - public async initialize(deploymentId: string): Promise { // TODO: validate the deployment id const deploymentDir = path.join( @@ -120,7 +112,21 @@ class FileDeploymentLoader implements DeploymentLoader { JSON.stringify(artifact, undefined, 2) ); - return artifactFilePath; + return path.relative(this._paths.deploymentDir, artifactFilePath); + } + + public async loadArtifact(storedArtifactPath: string): Promise { + if (this._paths === null) { + throw new Error("Cannot load artifact until initialized"); + } + + const json = await fs.readFile( + path.join(this._paths?.deploymentDir, storedArtifactPath) + ); + + const artifact = JSON.parse(json.toString()); + + return artifact; } public async recordDeployedAddress( From 6e7e25fd42641d3aa9898d9d9db17ed91500aae2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 11:58:58 +0100 Subject: [PATCH 0487/1302] refactor: rename deploymnent loader func to storeArtifact --- .../src/new-api/internal/execution/execution-engine.ts | 2 +- packages/core/src/new-api/types/artifact.ts | 2 +- .../core/test/new-api/execution/execution-engine.ts | 2 +- packages/hardhat-plugin/src/buildDeploymentLoader.ts | 10 ++++++++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 611cc100d1..9c17709dd6 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -229,7 +229,7 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_DEPLOYMENT: const artifact = await artifactResolver.load(future.contractName); - const storedArtifactPath = await deploymentLoader.store( + const storedArtifactPath = await deploymentLoader.storeArtifact( future.id, artifact ); diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index c6969256b0..e491060763 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -33,7 +33,7 @@ export interface ArtifactResolver { export interface DeploymentLoader { journal: Journal; initialize(deploymentId: string): Promise; - store(futureId: string, artifact: Artifact): Promise; + storeArtifact(futureId: string, artifact: Artifact): Promise; loadArtifact(storedArtifactPath: string): Promise; recordDeployedAddress( futureId: string, diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 8d305a1d7c..495c2e0c31 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -429,7 +429,7 @@ function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { throw new Error("Not implemented"); }, recordDeployedAddress: async () => {}, - store: async (futureId, _artifact) => { + storeArtifact: async (futureId, _artifact) => { return `${futureId}.json`; }, loadArtifact: async (_storedArtifactPath) => { diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index 94e07629aa..38c95c3262 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -40,7 +40,10 @@ class MemoryDeploymentLoader implements DeploymentLoader { this._deployedAddresses[futureId] = contractAddress; } - public async store(_futureId: string, artifact: Artifact): Promise { + public async storeArtifact( + _futureId: string, + artifact: Artifact + ): Promise { const artifactPaths = await this._hre.artifacts.getArtifactPaths(); const artifactPath = artifactPaths.find( @@ -98,7 +101,10 @@ class FileDeploymentLoader implements DeploymentLoader { this.journal = new FileJournal(journalPath); } - public async store(futureId: string, artifact: Artifact): Promise { + public async storeArtifact( + futureId: string, + artifact: Artifact + ): Promise { if (this._paths === null) { throw new Error("Cannot record deploy address until initialized"); } From c2dd7b1c286f5a9cf4a6e6dc57b3db2ecb0c52d7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 13:17:57 +0100 Subject: [PATCH 0488/1302] refactor: store build-info --- .../internal/execution/execution-engine.ts | 84 ++++++++---- .../validateArtifactContractDeployment.ts | 2 +- .../futures/validateNamedContractAt.ts | 2 +- .../futures/validateNamedContractCall.ts | 2 +- .../validateNamedContractDeployment.ts | 2 +- .../futures/validateNamedLibraryDeployment.ts | 2 +- .../futures/validateNamedStaticCall.ts | 2 +- .../futures/validateReadEventArgument.ts | 2 +- packages/core/src/new-api/types/artifact.ts | 126 +++++++++++++++++- packages/core/src/new-api/types/journal.ts | 2 +- .../new-api/execution/execution-engine.ts | 100 +++++++------- packages/core/test/new-api/helpers.ts | 7 +- .../src/buildArtifactResolverFrom.ts | 38 ++++-- .../src/buildDeploymentLoader.ts | 28 ++++ 14 files changed, 305 insertions(+), 94 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 9c17709dd6..eb3392f417 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -16,6 +16,8 @@ import { Future, FutureType, ModuleParameters, + NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, RuntimeValueType, } from "../../types/module"; import { accountRuntimeValueToErrorString } from "../reconciliation/utils"; @@ -205,6 +207,11 @@ export class ExecutionEngine { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + const artifactContractPath = await deploymentLoader.storeArtifact( + future.id, + future.artifact + ); + state = { type: "execution-start", futureId: future.id, @@ -213,10 +220,8 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: await artifactResolver.resolvePath( - future.contractName - ), - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: artifactContractPath, + storedBuildInfoPath: undefined, contractName: future.contractName, value: future.value.toString(), constructorArgs: future.constructorArgs, @@ -228,11 +233,13 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_DEPLOYMENT: - const artifact = await artifactResolver.load(future.contractName); - const storedArtifactPath = await deploymentLoader.storeArtifact( - future.id, - artifact - ); + const { + storedArtifactPath: namedContractArtifactPath, + storedBuildInfoPath: namedContractBuildInfoPath, + } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + artifactResolver, + deploymentLoader, + }); state = { type: "execution-start", @@ -240,8 +247,8 @@ export class ExecutionEngine { futureType: future.type, strategy, dependencies: [...future.dependencies].map((f) => f.id), - storedArtifactPath, - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: namedContractArtifactPath, + storedBuildInfoPath: namedContractBuildInfoPath, contractName: future.contractName, value: future.value.toString(), constructorArgs: this._resolveArgs(future.constructorArgs, { @@ -257,18 +264,22 @@ export class ExecutionEngine { return state; case FutureType.NAMED_LIBRARY_DEPLOYMENT: + const { + storedArtifactPath: namedLibArtifactPath, + storedBuildInfoPath: namedLibBuildInfoPath, + } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + artifactResolver, + deploymentLoader, + }); + state = { type: "execution-start", futureId: future.id, futureType: future.type, strategy, - // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), - // history: [], - storedArtifactPath: await artifactResolver.resolvePath( - future.contractName - ), - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: namedLibArtifactPath, + storedBuildInfoPath: namedLibBuildInfoPath, contractName: future.contractName, value: "0", constructorArgs: [], @@ -280,18 +291,19 @@ export class ExecutionEngine { return state; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + const artifactLibraryPath = await deploymentLoader.storeArtifact( + future.id, + future.artifact + ); + state = { type: "execution-start", futureId: future.id, futureType: future.type, strategy, - // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), - // history: [], - storedArtifactPath: await artifactResolver.resolvePath( - future.contractName - ), - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: artifactLibraryPath, + storedBuildInfoPath: undefined, contractName: future.contractName, value: "0", constructorArgs: [], @@ -313,6 +325,32 @@ export class ExecutionEngine { } } + private async _storeArtifactAndBuildInfoAgainstDeployment( + future: + | NamedLibraryDeploymentFuture + | NamedContractDeploymentFuture, + { + deploymentLoader, + artifactResolver, + }: { + deploymentLoader: DeploymentLoader; + artifactResolver: ArtifactResolver; + } + ) { + const artifact = await artifactResolver.loadArtifact(future.contractName); + const storedArtifactPath = await deploymentLoader.storeArtifact( + future.id, + artifact + ); + const buildInfo = await artifactResolver.getBuildInfo(future.contractName); + const storedBuildInfoPath = + buildInfo === undefined + ? undefined + : await deploymentLoader.storeBuildInfo(buildInfo); + + return { storedArtifactPath, storedBuildInfoPath }; + } + private _resolveArgs( args: ArgumentType[], context: { diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index 2dcb34383f..5110321312 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -8,7 +8,7 @@ export async function validateArtifactContractDeployment( future: ArtifactContractDeploymentFuture, artifactLoader: ArtifactResolver ) { - const artifact = await artifactLoader.load(future.contractName); + const artifact = await artifactLoader.loadArtifact(future.contractName); const argsLength = future.constructorArgs.length; diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts index e051ca0562..6c6c89f1fd 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -7,7 +7,7 @@ export async function validateNamedContractAt( future: NamedContractAtFuture, artifactLoader: ArtifactResolver ) { - const artifact = await artifactLoader.load(future.contractName); + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index 86cd43f44c..8b6775b2f1 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -12,7 +12,7 @@ export async function validateNamedContractCall( const artifact = "artifact" in future.contract ? future.contract.artifact - : await artifactLoader.load(future.contract.contractName); + : await artifactLoader.loadArtifact(future.contract.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index c442e49020..bf5bbfe2ce 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -9,7 +9,7 @@ export async function validateNamedContractDeployment( future: NamedContractDeploymentFuture, artifactLoader: ArtifactResolver ) { - const artifact = await artifactLoader.load(future.contractName); + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts index dfbe831836..b92558cb38 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -7,7 +7,7 @@ export async function validateNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, artifactLoader: ArtifactResolver ) { - const artifact = await artifactLoader.load(future.contractName); + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts index b455ecfc53..acb12e102c 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -12,7 +12,7 @@ export async function validateNamedStaticCall( const artifact = "artifact" in future.contract ? future.contract.artifact - : await artifactLoader.load(future.contract.contractName); + : await artifactLoader.loadArtifact(future.contract.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts index abab1fccd8..880cc92849 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts @@ -12,7 +12,7 @@ export async function validateReadEventArgument( const artifact = "artifact" in future.emitter ? future.emitter.artifact - : await artifactLoader.load(future.emitter.contractName); + : await artifactLoader.loadArtifact(future.emitter.contractName); if (!isArtifactType(artifact)) { throw new IgnitionValidationError( diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index e491060763..98646da487 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -21,8 +21,8 @@ export interface Artifact { * @beta */ export interface ArtifactResolver { - load(contractName: string): Promise; - resolvePath(contractName: string): Promise; + loadArtifact(contractName: string): Promise; + getBuildInfo(contractName: string): Promise; } /** @@ -33,10 +33,130 @@ export interface ArtifactResolver { export interface DeploymentLoader { journal: Journal; initialize(deploymentId: string): Promise; - storeArtifact(futureId: string, artifact: Artifact): Promise; loadArtifact(storedArtifactPath: string): Promise; + storeArtifact(futureId: string, artifact: Artifact): Promise; + storeBuildInfo(buildInfo: BuildInfo): Promise; recordDeployedAddress( futureId: string, contractAddress: string ): Promise; } + +/** + * A BuildInfo is a file that contains all the information of a solc run. It + * includes all the necessary information to recreate that exact same run, and + * all of its output. + * + * @beta + */ +export interface BuildInfo { + _format: string; + id: string; + solcVersion: string; + solcLongVersion: string; + input: CompilerInput; + output: CompilerOutput; +} + +/** + * The solc input for running the compilation. + * + * @beta + */ +export interface CompilerInput { + language: string; + sources: { [sourceName: string]: { content: string } }; + settings: { + viaIR?: boolean; + optimizer: { + runs?: number; + enabled?: boolean; + details?: { + yulDetails: { + optimizerSteps: string; + }; + }; + }; + metadata?: { useLiteralContent: boolean }; + outputSelection: { + [sourceName: string]: { + [contractName: string]: string[]; + }; + }; + evmVersion?: string; + libraries?: { + [libraryFileName: string]: { + [libraryName: string]: string; + }; + }; + remappings?: string[]; + }; +} + +/** + * The output of a compiled contract from solc. + * + * @beta + */ +export interface CompilerOutputContract { + abi: any; + evm: { + bytecode: CompilerOutputBytecode; + deployedBytecode: CompilerOutputBytecode; + methodIdentifiers: { + [methodSignature: string]: string; + }; + }; +} + +/** + * The compilation output from solc. + * + * @beta + */ +export interface CompilerOutput { + sources: CompilerOutputSources; + contracts: { + [sourceName: string]: { + [contractName: string]: CompilerOutputContract; + }; + }; +} + +/** + * The ast for a compiled contract. + * + * @beta + */ +export interface CompilerOutputSource { + id: number; + ast: any; +} + +/** + * The asts for the compiled contracts. + * + * @beta + */ +export interface CompilerOutputSources { + [sourceName: string]: CompilerOutputSource; +} + +/** + * The solc bytecode output. + * + * @beta + */ +export interface CompilerOutputBytecode { + object: string; + opcodes: string; + sourceMap: string; + linkReferences: { + [sourceName: string]: { + [libraryName: string]: Array<{ start: number; length: 20 }>; + }; + }; + immutableReferences?: { + [key: string]: Array<{ start: number; length: number }>; + }; +} diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index c52daef7dc..14774d57ca 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -109,7 +109,7 @@ export interface FutureStartMessage { strategy: string; dependencies: string[]; storedArtifactPath: string; - storedBuildInfoPath: string; + storedBuildInfoPath: string | undefined; contractName: string; constructorArgs: ArgumentType[]; libraries: { [key: string]: string }; diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 495c2e0c31..5c792ad64e 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -70,7 +70,7 @@ describe("execution engine", () => { strategy: "basic", dependencies: [], storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "./build-info.json", + storedBuildInfoPath: "build-info-12345.json", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [ @@ -129,7 +129,7 @@ describe("execution engine", () => { const journal = new MemoryJournal(); const accounts: string[] = exampleAccounts; const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver(); + const mockArtifactResolver = setupMockArtifactResolver({} as any); const mockDeploymentLoader = setupMockDeploymentLoader(journal); const result = await executionEngine.execute({ @@ -154,8 +154,8 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "/user/path/Library1.json", - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: "Module1:Library1.json", + storedBuildInfoPath: "build-info-12345.json", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], @@ -169,7 +169,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: exampleAccounts[0], - storedArtifactPath: "/user/path/Library1.json", + storedArtifactPath: "Module1:Library1.json", }, { type: "onchain-result", @@ -231,43 +231,48 @@ describe("execution engine", () => { assert.isDefined(result); const journalMessages = await accumulateMessages(journal); - assert.deepStrictEqual(journalMessages, [ - { - futureId: "Module1:Contract1", - type: "execution-start", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "/user/path/Contract1.json", - storedBuildInfoPath: "./build-info.json", - contractName: "Contract1", - value: BigInt(0).toString(), - constructorArgs: [], - libraries: {}, - from: accounts[0], - }, - { - type: "onchain-action", - subtype: "deploy-contract", - contractName: "Contract1", - args: [], - value: BigInt(0).toString(), - from: exampleAccounts[0], - storedArtifactPath: "/user/path/Contract1.json", - }, - { - type: "onchain-result", - subtype: "deploy-contract", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }, - { - type: "execution-success", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - contractName: "Contract1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }, - ]); + assert.deepStrictEqual( + journalMessages, + JSON.parse( + JSON.stringify([ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: undefined, + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[0], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: exampleAccounts[0], + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-result", + subtype: "deploy-contract", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + }, + ]) + ) + ); }); describe("with complex arguments", () => { @@ -329,8 +334,8 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "/user/path/Library1.json", - storedBuildInfoPath: "./build-info.json", + storedArtifactPath: "Module1:Library1.json", + storedBuildInfoPath: "build-info-12345.json", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], @@ -344,7 +349,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: exampleAccounts[0], - storedArtifactPath: "/user/path/Library1.json", + storedArtifactPath: "Module1:Library1.json", }, { type: "onchain-result", @@ -365,7 +370,7 @@ describe("execution engine", () => { strategy: "basic", dependencies: ["Module1:Library1"], storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "./build-info.json", + storedBuildInfoPath: "build-info-12345.json", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [ @@ -432,6 +437,9 @@ function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { storeArtifact: async (futureId, _artifact) => { return `${futureId}.json`; }, + storeBuildInfo: async (buildInfo) => { + return `build-info-${buildInfo.id}.json`; + }, loadArtifact: async (_storedArtifactPath) => { throw new Error("Not implemented"); }, diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 4372813446..552df5c4b2 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -21,14 +21,15 @@ export function setupMockArtifactResolver( artifact?: Artifact ): ArtifactResolver { return { - load: async () => { + loadArtifact: async () => { if (artifact === undefined) { throw new IgnitionError("Not implemented"); } return artifact; }, - resolvePath: async (contractName: string) => - `/user/path/${contractName}.json`, + getBuildInfo: async (_contractName: string) => { + return { id: 12345 } as any; + }, }; } diff --git a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts index b92792bd10..5c3b5654e9 100644 --- a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts +++ b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts @@ -1,8 +1,10 @@ import { Artifact, ArtifactResolver, + BuildInfo, IgnitionError, } from "@ignored/ignition-core"; +import fs from "fs"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; @@ -10,20 +12,34 @@ export function buildArtifactResolverFrom( hre: HardhatRuntimeEnvironment ): ArtifactResolver { return { - load: async (contractName: string): Promise => + loadArtifact: async (contractName: string): Promise => hre.artifacts.readArtifact(contractName), - resolvePath: async (contractName: string): Promise => { - const artifactPaths = await hre.artifacts.getArtifactPaths(); + getBuildInfo: async ( + contractName: string + ): Promise => { + const artifactPath = await _resolvePath(hre, contractName); - const artifactPath = artifactPaths.find( - (p) => path.parse(p).name === contractName - ); + const debugPath = artifactPath.replace(".json", ".dbg.json"); + const debugJson = await fs.promises.readFile(debugPath); - if (artifactPath === undefined) { - throw new IgnitionError(`Artifact path not found for ${contractName}`); - } - - return artifactPath; + return JSON.parse(debugJson.toString()); }, }; } + +async function _resolvePath( + hre: HardhatRuntimeEnvironment, + contractName: string +): Promise { + const artifactPaths = await hre.artifacts.getArtifactPaths(); + + const artifactPath = artifactPaths.find( + (p) => path.parse(p).name === contractName + ); + + if (artifactPath === undefined) { + throw new IgnitionError(`Artifact path not found for ${contractName}`); + } + + return artifactPath; +} diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts index 38c95c3262..3e6ee59fdf 100644 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ b/packages/hardhat-plugin/src/buildDeploymentLoader.ts @@ -1,5 +1,6 @@ import { Artifact, + BuildInfo, DeploymentLoader, FileJournal, Journal, @@ -56,6 +57,12 @@ class MemoryDeploymentLoader implements DeploymentLoader { return artifactPath; } + + public async storeBuildInfo(buildInfo: BuildInfo): Promise { + const id = buildInfo.id; + + return `${id}.json`; + } } class FileDeploymentLoader implements DeploymentLoader { @@ -64,6 +71,7 @@ class FileDeploymentLoader implements DeploymentLoader { private _paths: { deploymentDir: string; artifactsDir: string; + buildInfoDir: string; journalPath: string; deployedAddressesPath: string; } | null = null; @@ -80,6 +88,7 @@ class FileDeploymentLoader implements DeploymentLoader { deploymentId ); const artifactsDir = path.join(deploymentDir, "artifacts"); + const buildInfoDir = path.join(deploymentDir, "build-info"); const journalPath = path.join(deploymentDir, "journal.jsonl"); const deployedAddressesPath = path.join( deploymentDir, @@ -89,12 +98,14 @@ class FileDeploymentLoader implements DeploymentLoader { this._paths = { deploymentDir, artifactsDir, + buildInfoDir, journalPath, deployedAddressesPath, }; await fs.ensureDir(this._paths.deploymentDir); await fs.ensureDir(this._paths.artifactsDir); + await fs.ensureDir(this._paths.buildInfoDir); await fs.ensureFile(this._paths.journalPath); await fs.ensureFile(this._paths.deployedAddressesPath); @@ -121,6 +132,23 @@ class FileDeploymentLoader implements DeploymentLoader { return path.relative(this._paths.deploymentDir, artifactFilePath); } + public async storeBuildInfo(buildInfo: BuildInfo): Promise { + if (this._paths === null) { + throw new Error("Cannot record build info address until initialized"); + } + + const buildInfoFilePath = path.join( + this._paths?.buildInfoDir, + `${buildInfo.id}.json` + ); + await fs.writeFile( + buildInfoFilePath, + JSON.stringify(buildInfo, undefined, 2) + ); + + return path.relative(this._paths.deploymentDir, buildInfoFilePath); + } + public async loadArtifact(storedArtifactPath: string): Promise { if (this._paths === null) { throw new Error("Cannot load artifact until initialized"); From dde6249624fab2b4c53a030432bc9ac3ee677173 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 14:02:45 +0100 Subject: [PATCH 0489/1302] fix: read buildinfo not debug --- packages/hardhat-plugin/src/buildArtifactResolverFrom.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts index 5c3b5654e9..9a8e660950 100644 --- a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts +++ b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts @@ -22,7 +22,14 @@ export function buildArtifactResolverFrom( const debugPath = artifactPath.replace(".json", ".dbg.json"); const debugJson = await fs.promises.readFile(debugPath); - return JSON.parse(debugJson.toString()); + const buildInfoPath = path.join( + path.parse(debugPath).dir, + JSON.parse(debugJson.toString()).buildInfo + ); + + const buildInfoJson = await fs.promises.readFile(buildInfoPath); + + return JSON.parse(buildInfoJson.toString()); }, }; } From dc2f3627c932a81130e455b3cae2048fcae59912 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 14:16:32 +0100 Subject: [PATCH 0490/1302] feat: add cli command for printing deployed addresses --- packages/hardhat-plugin/src/index.ts | 50 ++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index c7aac76c4e..c166c03243 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -388,6 +388,56 @@ task("ignition-info") } ); +task("ignition-info2") + .addParam("deploymentId") + .addFlag("json", "format as json") + .setDescription("Lists the deployed contract addresses of a deployment") + .setAction( + async ( + { + deploymentId, + json: formatAsJson, + }: { deploymentId: string; json: boolean }, + hre + ) => { + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + const deployedAddressesPath = path.join( + deploymentDir, + "deployed_addresses.json" + ); + + if (!fs.existsSync(deploymentDir)) { + console.error(`No deployment found with id ${deploymentDir}`); + process.exit(1); + } + + if (!fs.existsSync(deployedAddressesPath)) { + console.log(`No contracts deployed`); + process.exit(0); + } + + const deployedAddresses = fs.readJSONSync(deployedAddressesPath); + + if (formatAsJson) { + console.log(JSON.stringify(deployedAddresses, undefined, 2)); + } else { + console.log("Deployed Addresses"); + console.log("=================="); + console.log(""); + + for (const [futureId, address] of Object.entries(deployedAddresses)) { + console.log(`${futureId}\t${address as string}`); + } + + console.log(""); + } + } + ); + function resolveParametersFromModuleName( moduleName: string, ignitionPath: string From 9da81bb306b7465abee616d9995d2147cced2bae Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 16:57:40 +0100 Subject: [PATCH 0491/1302] refactor: move out deployment-loader to own type file --- packages/core/src/index.ts | 1 + packages/core/src/new-api/deployer.ts | 3 ++- .../internal/execution/execution-engine.ts | 3 ++- .../transactions/transaction-service.ts | 2 +- .../new-api/internal/journal/file-journal.ts | 2 +- .../internal/types/execution-engine.ts | 3 ++- packages/core/src/new-api/types/artifact.ts | 19 ------------------- .../src/new-api/types/deployment-loader.ts | 19 +++++++++++++++++++ .../new-api/execution/execution-engine.ts | 3 ++- 9 files changed, 30 insertions(+), 25 deletions(-) create mode 100644 packages/core/src/new-api/types/deployment-loader.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 888d45e423..4f142c67e1 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -12,6 +12,7 @@ export * from "./new-api/type-guards"; export * from "./new-api/types/adapters"; export * from "./new-api/types/artifact"; export * from "./new-api/types/deployer"; +export * from "./new-api/types/deployment-loader"; export * from "./new-api/types/journal"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 6c28c9d624..98849730a5 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -16,8 +16,9 @@ import { ExecutionStateMap } from "./internal/types/execution-state"; import { validate } from "./internal/validation/validate"; import { isAdapters } from "./type-guards"; import { Adapters } from "./types/adapters"; -import { ArtifactResolver, DeploymentLoader } from "./types/artifact"; +import { ArtifactResolver } from "./types/artifact"; import { DeploymentResult } from "./types/deployer"; +import { DeploymentLoader } from "./types/deployment-loader"; import { Journal } from "./types/journal"; import { TransactionService } from "./types/transaction-service"; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index eb3392f417..e736da6ced 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -2,8 +2,9 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; import { isRuntimeValue } from "../../type-guards"; -import { ArtifactResolver, DeploymentLoader } from "../../types/artifact"; +import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; +import { DeploymentLoader } from "../../types/deployment-loader"; import { ExecutionResultMessage, FutureRestartMessage, diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index ff1e8609df..a480d4baa0 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "../../../../errors"; -import { DeploymentLoader } from "../../../types/artifact"; +import { DeploymentLoader } from "../../../types/deployment-loader"; import { DeployContractInteractionMessage, DeployContractResultMessage, diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index 1d18752a06..be1e896b22 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -7,7 +7,7 @@ import { deserializeReplacer } from "./utils/deserialize-replacer"; import { serializeReplacer } from "./utils/serialize-replacer"; /** - * An file-based journal. + * A file-based journal. * * @beta */ diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index c8cfafea6f..ad48ff2fd0 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,4 +1,5 @@ -import { ArtifactResolver, DeploymentLoader } from "../../types/artifact"; +import { ArtifactResolver } from "../../types/artifact"; +import { DeploymentLoader } from "../../types/deployment-loader"; import { JournalableMessage, OnchainInteractionMessage, diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 98646da487..b5f6246526 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -1,5 +1,3 @@ -import { Journal } from "./journal"; - /** * An compilation artifact representing a smart contract. * @@ -25,23 +23,6 @@ export interface ArtifactResolver { getBuildInfo(contractName: string): Promise; } -/** - * Read and write to the deployment storage. - * - * @beta - */ -export interface DeploymentLoader { - journal: Journal; - initialize(deploymentId: string): Promise; - loadArtifact(storedArtifactPath: string): Promise; - storeArtifact(futureId: string, artifact: Artifact): Promise; - storeBuildInfo(buildInfo: BuildInfo): Promise; - recordDeployedAddress( - futureId: string, - contractAddress: string - ): Promise; -} - /** * A BuildInfo is a file that contains all the information of a solc run. It * includes all the necessary information to recreate that exact same run, and diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/types/deployment-loader.ts new file mode 100644 index 0000000000..4378eb6081 --- /dev/null +++ b/packages/core/src/new-api/types/deployment-loader.ts @@ -0,0 +1,19 @@ +import { Artifact, BuildInfo } from "./artifact"; +import { Journal } from "./journal"; + +/** + * Read and write to the deployment storage. + * + * @beta + */ +export interface DeploymentLoader { + journal: Journal; + initialize(deploymentId: string): Promise; + loadArtifact(storedArtifactPath: string): Promise; + storeArtifact(futureId: string, artifact: Artifact): Promise; + storeBuildInfo(buildInfo: BuildInfo): Promise; + recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise; +} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 5c792ad64e..56ee27f166 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -1,12 +1,13 @@ import { assert } from "chai"; -import { Artifact, DeploymentLoader, FutureType } from "../../../src"; +import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { Batcher } from "../../../src/new-api/internal/batcher"; import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; import { BasicExecutionStrategy } from "../../../src/new-api/internal/execution/execution-strategy"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; +import { DeploymentLoader } from "../../../src/new-api/types/deployment-loader"; import { Journal, JournalableMessage, From 0586c7e23d2df7fa73f540c9e3fd53d1015aa78d Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 17:53:41 +0100 Subject: [PATCH 0492/1302] refactor: don't export unneeded transaction service --- packages/core/src/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 4f142c67e1..71fc5cfb3d 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -17,7 +17,6 @@ export * from "./new-api/types/journal"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; -export * from "./new-api/types/transaction-service"; export * from "./types/dsl"; export * from "./types/future"; export * from "./types/hardhat"; From fbe0082b9bfa765e129af741cd20d683b8874d2f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 18:08:00 +0100 Subject: [PATCH 0493/1302] refactor: move deployment loader impls to core --- packages/core/package.json | 1 + packages/core/src/new-api/deployer.ts | 13 +- .../file-deployment-loader.ts | 126 +++++++++++ .../memory-deployment-loader.ts | 55 +++++ packages/core/src/new-api/types/artifact.ts | 1 + .../src/new-api/types/deployment-loader.ts | 2 +- packages/core/test/new-api/helpers.ts | 3 + .../src/buildArtifactResolverFrom.ts | 52 ----- .../src/buildDeploymentLoader.ts | 214 ------------------ .../src/hardhat-artifact-resolver.ts.ts | 44 ++++ .../hardhat-plugin/src/ignition-helper.ts | 8 +- packages/hardhat-plugin/src/index.ts | 14 +- 12 files changed, 252 insertions(+), 281 deletions(-) create mode 100644 packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts create mode 100644 packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts delete mode 100644 packages/hardhat-plugin/src/buildArtifactResolverFrom.ts delete mode 100644 packages/hardhat-plugin/src/buildDeploymentLoader.ts create mode 100644 packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts diff --git a/packages/core/package.json b/packages/core/package.json index 74357b688d..23fc34928d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -92,6 +92,7 @@ "@ethersproject/address": "5.6.1", "debug": "^4.3.2", "ethers": "^5.4.7", + "fs-extra": "^10.0.0", "js-graph-algorithms": "1.0.18", "lodash": "4.17.21", "ndjson": "2.0.0", diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts index 98849730a5..25d055f98d 100644 --- a/packages/core/src/new-api/deployer.ts +++ b/packages/core/src/new-api/deployer.ts @@ -4,6 +4,8 @@ import type { IgnitionModuleDefinition } from "./types/module-builder"; import { IgnitionError } from "../errors"; import { Batcher } from "./internal/batcher"; +import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { MemoryDeploymentLoader } from "./internal/deployment-loader/memory-deployment-loader"; import { ExecutionEngine } from "./internal/execution/execution-engine"; import { BasicExecutionStrategy } from "./internal/execution/execution-strategy"; import { executionStateReducer } from "./internal/execution/executionStateReducer"; @@ -38,7 +40,7 @@ export class Deployer { constructor( options: { artifactResolver: ArtifactResolver; - deploymentLoader: DeploymentLoader; + deploymentDir?: string; } & ( | { transactionService: TransactionService; @@ -50,12 +52,15 @@ export class Deployer { ) { this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; - this._deploymentLoader = options.deploymentLoader; + this._deploymentLoader = + options.deploymentDir === undefined + ? new MemoryDeploymentLoader(options.artifactResolver) + : new FileDeploymentLoader(options.deploymentDir); if ("adapters" in options && isAdapters(options.adapters)) { const adapters: Adapters = options.adapters; this._transactionService = new TransactionServiceImplementation( - options.deploymentLoader, + this._deploymentLoader, new EthersChainDispatcher( adapters.signer, adapters.gas, @@ -86,7 +91,7 @@ export class Deployer { await validate(module, this._artifactResolver); - await this._deploymentLoader.initialize(deployId); + await this._deploymentLoader.initialize(); const previousStateMap = await this._loadExecutionStateFrom( this._deploymentLoader.journal diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts new file mode 100644 index 0000000000..c6ad3c8d98 --- /dev/null +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -0,0 +1,126 @@ +import fs from "fs-extra"; +import path from "path"; + +import { Artifact, BuildInfo } from "../../types/artifact"; +import { DeploymentLoader } from "../../types/deployment-loader"; +import { Journal } from "../../types/journal"; +import { FileJournal } from "../journal/file-journal"; +import { MemoryJournal } from "../journal/memory-journal"; + +export class FileDeploymentLoader implements DeploymentLoader { + public journal: Journal; + + private _paths: { + deploymentDir: string; + artifactsDir: string; + buildInfoDir: string; + journalPath: string; + deployedAddressesPath: string; + } | null = null; + + constructor(private readonly _deploymentDirPath: string) { + this.journal = new MemoryJournal(); + } + + public async initialize(): Promise { + const artifactsDir = path.join(this._deploymentDirPath, "artifacts"); + const buildInfoDir = path.join(this._deploymentDirPath, "build-info"); + const journalPath = path.join(this._deploymentDirPath, "journal.jsonl"); + const deployedAddressesPath = path.join( + this._deploymentDirPath, + "deployed_addresses.json" + ); + + this._paths = { + deploymentDir: this._deploymentDirPath, + artifactsDir, + buildInfoDir, + journalPath, + deployedAddressesPath, + }; + + await fs.ensureDir(this._paths.deploymentDir); + await fs.ensureDir(this._paths.artifactsDir); + await fs.ensureDir(this._paths.buildInfoDir); + await fs.ensureFile(this._paths.journalPath); + await fs.ensureFile(this._paths.deployedAddressesPath); + + this.journal = new FileJournal(journalPath); + } + + public async storeArtifact( + futureId: string, + artifact: Artifact + ): Promise { + if (this._paths === null) { + throw new Error("Cannot record deploy address until initialized"); + } + + const artifactFilePath = path.join( + this._paths.artifactsDir, + `${futureId}.json` + ); + await fs.writeFile( + artifactFilePath, + JSON.stringify(artifact, undefined, 2) + ); + + return path.relative(this._paths.deploymentDir, artifactFilePath); + } + + public async storeBuildInfo(buildInfo: BuildInfo): Promise { + if (this._paths === null) { + throw new Error("Cannot record build info address until initialized"); + } + + const buildInfoFilePath = path.join( + this._paths?.buildInfoDir, + `${buildInfo.id}.json` + ); + await fs.writeFile( + buildInfoFilePath, + JSON.stringify(buildInfo, undefined, 2) + ); + + return path.relative(this._paths.deploymentDir, buildInfoFilePath); + } + + public async loadArtifact(storedArtifactPath: string): Promise { + if (this._paths === null) { + throw new Error("Cannot load artifact until initialized"); + } + + const json = await fs.readFile( + path.join(this._paths?.deploymentDir, storedArtifactPath) + ); + + const artifact = JSON.parse(json.toString()); + + return artifact; + } + + public async recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise { + if (this._paths === null) { + throw new Error("Cannot record deploy address until initialized"); + } + + // TODO: should this be made async to be closer to a single fs transaction? + const json = ( + await fs.readFile(this._paths.deployedAddressesPath) + ).toString(); + + const deployedAddresses: { [key: string]: string } = JSON.parse( + json === "" ? "{}" : json + ); + + deployedAddresses[futureId] = contractAddress; + + await fs.writeFile( + this._paths.deployedAddressesPath, + `${JSON.stringify(deployedAddresses, undefined, 2)}\n` + ); + } +} diff --git a/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts new file mode 100644 index 0000000000..80c9ead59a --- /dev/null +++ b/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts @@ -0,0 +1,55 @@ +import fs from "fs"; + +import { Artifact, ArtifactResolver, BuildInfo } from "../../types/artifact"; +import { DeploymentLoader } from "../../types/deployment-loader"; +import { Journal } from "../../types/journal"; +import { MemoryJournal } from "../journal/memory-journal"; + +export class MemoryDeploymentLoader implements DeploymentLoader { + public journal: Journal; + + private _deployedAddresses: { [key: string]: string }; + + constructor(private _artifactResolver: ArtifactResolver) { + this.journal = new MemoryJournal(); + this._deployedAddresses = {}; + } + + public async loadArtifact(storedArtifactPath: string): Promise { + const json = await fs.promises.readFile(storedArtifactPath); + + const artifact = JSON.parse(json.toString()); + + return artifact; + } + + public async initialize(): Promise {} + + public async recordDeployedAddress( + futureId: string, + contractAddress: string + ): Promise { + this._deployedAddresses[futureId] = contractAddress; + } + + public async storeArtifact( + _futureId: string, + artifact: Artifact + ): Promise { + const artifactPath = await this._artifactResolver.resolvePath( + artifact.contractName + ); + + if (artifactPath === undefined) { + throw new Error(`Artifact path not found for ${artifact.contractName}`); + } + + return artifactPath; + } + + public async storeBuildInfo(buildInfo: BuildInfo): Promise { + const id = buildInfo.id; + + return `${id}.json`; + } +} diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index b5f6246526..33f3b24df3 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -21,6 +21,7 @@ export interface Artifact { export interface ArtifactResolver { loadArtifact(contractName: string): Promise; getBuildInfo(contractName: string): Promise; + resolvePath(contractName: string): Promise; } /** diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/types/deployment-loader.ts index 4378eb6081..54592d7cac 100644 --- a/packages/core/src/new-api/types/deployment-loader.ts +++ b/packages/core/src/new-api/types/deployment-loader.ts @@ -8,7 +8,7 @@ import { Journal } from "./journal"; */ export interface DeploymentLoader { journal: Journal; - initialize(deploymentId: string): Promise; + initialize(): Promise; loadArtifact(storedArtifactPath: string): Promise; storeArtifact(futureId: string, artifact: Artifact): Promise; storeBuildInfo(buildInfo: BuildInfo): Promise; diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 552df5c4b2..4664e8ea7f 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -31,5 +31,8 @@ export function setupMockArtifactResolver( getBuildInfo: async (_contractName: string) => { return { id: 12345 } as any; }, + resolvePath: async (contractName: string) => { + return `${contractName}.json`; + }, }; } diff --git a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts b/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts deleted file mode 100644 index 9a8e660950..0000000000 --- a/packages/hardhat-plugin/src/buildArtifactResolverFrom.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { - Artifact, - ArtifactResolver, - BuildInfo, - IgnitionError, -} from "@ignored/ignition-core"; -import fs from "fs"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; - -export function buildArtifactResolverFrom( - hre: HardhatRuntimeEnvironment -): ArtifactResolver { - return { - loadArtifact: async (contractName: string): Promise => - hre.artifacts.readArtifact(contractName), - getBuildInfo: async ( - contractName: string - ): Promise => { - const artifactPath = await _resolvePath(hre, contractName); - - const debugPath = artifactPath.replace(".json", ".dbg.json"); - const debugJson = await fs.promises.readFile(debugPath); - - const buildInfoPath = path.join( - path.parse(debugPath).dir, - JSON.parse(debugJson.toString()).buildInfo - ); - - const buildInfoJson = await fs.promises.readFile(buildInfoPath); - - return JSON.parse(buildInfoJson.toString()); - }, - }; -} - -async function _resolvePath( - hre: HardhatRuntimeEnvironment, - contractName: string -): Promise { - const artifactPaths = await hre.artifacts.getArtifactPaths(); - - const artifactPath = artifactPaths.find( - (p) => path.parse(p).name === contractName - ); - - if (artifactPath === undefined) { - throw new IgnitionError(`Artifact path not found for ${contractName}`); - } - - return artifactPath; -} diff --git a/packages/hardhat-plugin/src/buildDeploymentLoader.ts b/packages/hardhat-plugin/src/buildDeploymentLoader.ts deleted file mode 100644 index 3e6ee59fdf..0000000000 --- a/packages/hardhat-plugin/src/buildDeploymentLoader.ts +++ /dev/null @@ -1,214 +0,0 @@ -import { - Artifact, - BuildInfo, - DeploymentLoader, - FileJournal, - Journal, - MemoryJournal, -} from "@ignored/ignition-core"; -import fs from "fs-extra"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; -import { errorMonitor } from "stream"; - -class MemoryDeploymentLoader implements DeploymentLoader { - public journal: Journal; - - private _deploymentId: string | null = null; - private _deployedAddresses: { [key: string]: string }; - - constructor(private _hre: HardhatRuntimeEnvironment) { - this.journal = new MemoryJournal(); - this._deployedAddresses = {}; - } - - public async loadArtifact(storedArtifactPath: string): Promise { - const json = await fs.readFile(storedArtifactPath); - - const artifact = JSON.parse(json.toString()); - - return artifact; - } - - public async initialize(deploymentId: string): Promise { - this._deploymentId = deploymentId; - } - - public async recordDeployedAddress( - futureId: string, - contractAddress: string - ): Promise { - this._deployedAddresses[futureId] = contractAddress; - } - - public async storeArtifact( - _futureId: string, - artifact: Artifact - ): Promise { - const artifactPaths = await this._hre.artifacts.getArtifactPaths(); - - const artifactPath = artifactPaths.find( - (p) => path.parse(p).name === artifact.contractName - ); - - if (artifactPath === undefined) { - throw new Error(`Artifact path not found for ${artifact.contractName}`); - } - - return artifactPath; - } - - public async storeBuildInfo(buildInfo: BuildInfo): Promise { - const id = buildInfo.id; - - return `${id}.json`; - } -} - -class FileDeploymentLoader implements DeploymentLoader { - public journal: Journal; - - private _paths: { - deploymentDir: string; - artifactsDir: string; - buildInfoDir: string; - journalPath: string; - deployedAddressesPath: string; - } | null = null; - - constructor(private readonly _hre: HardhatRuntimeEnvironment) { - this.journal = new MemoryJournal(); - } - - public async initialize(deploymentId: string): Promise { - // TODO: validate the deployment id - const deploymentDir = path.join( - this._hre.config.paths.ignition, - "deployments", - deploymentId - ); - const artifactsDir = path.join(deploymentDir, "artifacts"); - const buildInfoDir = path.join(deploymentDir, "build-info"); - const journalPath = path.join(deploymentDir, "journal.jsonl"); - const deployedAddressesPath = path.join( - deploymentDir, - "deployed_addresses.json" - ); - - this._paths = { - deploymentDir, - artifactsDir, - buildInfoDir, - journalPath, - deployedAddressesPath, - }; - - await fs.ensureDir(this._paths.deploymentDir); - await fs.ensureDir(this._paths.artifactsDir); - await fs.ensureDir(this._paths.buildInfoDir); - await fs.ensureFile(this._paths.journalPath); - await fs.ensureFile(this._paths.deployedAddressesPath); - - this.journal = new FileJournal(journalPath); - } - - public async storeArtifact( - futureId: string, - artifact: Artifact - ): Promise { - if (this._paths === null) { - throw new Error("Cannot record deploy address until initialized"); - } - - const artifactFilePath = path.join( - this._paths.artifactsDir, - `${futureId}.json` - ); - await fs.writeFile( - artifactFilePath, - JSON.stringify(artifact, undefined, 2) - ); - - return path.relative(this._paths.deploymentDir, artifactFilePath); - } - - public async storeBuildInfo(buildInfo: BuildInfo): Promise { - if (this._paths === null) { - throw new Error("Cannot record build info address until initialized"); - } - - const buildInfoFilePath = path.join( - this._paths?.buildInfoDir, - `${buildInfo.id}.json` - ); - await fs.writeFile( - buildInfoFilePath, - JSON.stringify(buildInfo, undefined, 2) - ); - - return path.relative(this._paths.deploymentDir, buildInfoFilePath); - } - - public async loadArtifact(storedArtifactPath: string): Promise { - if (this._paths === null) { - throw new Error("Cannot load artifact until initialized"); - } - - const json = await fs.readFile( - path.join(this._paths?.deploymentDir, storedArtifactPath) - ); - - const artifact = JSON.parse(json.toString()); - - return artifact; - } - - public async recordDeployedAddress( - futureId: string, - contractAddress: string - ): Promise { - if (this._paths === null) { - throw new Error("Cannot record deploy address until initialized"); - } - - try { - // TODO: should this be made async to be closer to a single fs transaction? - const json = ( - await fs.readFile(this._paths.deployedAddressesPath) - ).toString(); - - const deployedAddresses: { [key: string]: string } = JSON.parse( - json === "" ? "{}" : json - ); - - deployedAddresses[futureId] = contractAddress; - - await fs.writeFile( - this._paths.deployedAddressesPath, - `${JSON.stringify(deployedAddresses, undefined, 2)}\n` - ); - } catch (error) { - console.error(errorMonitor); - } - } -} - -export function buildDeploymentLoader( - hre: HardhatRuntimeEnvironment -): DeploymentLoader { - return _isEphemeral(hre) - ? new MemoryDeploymentLoader(hre) - : new FileDeploymentLoader(hre); -} - -/** - * Determine whether to use a disk based deployment loader or memory based - * deployment loader. - * - * The test is whether Hardhat reports the network name as hardhat which - * is the network name in tests and if the `--network` flag is not set. - * Running against a local node will not count as ephemeral. - */ -function _isEphemeral(hre: HardhatRuntimeEnvironment) { - return hre.network.name === "hardhat"; -} diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts new file mode 100644 index 0000000000..9fa1ab127e --- /dev/null +++ b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts @@ -0,0 +1,44 @@ +import { Artifact, ArtifactResolver, BuildInfo } from "@ignored/ignition-core"; +import fs from "fs"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +export class HardhatArtifactResolver implements ArtifactResolver { + constructor(private _hre: HardhatRuntimeEnvironment) {} + + public async getBuildInfo( + contractName: string + ): Promise { + const artifactPath = await this.resolvePath(contractName); + + if (artifactPath === undefined) { + throw new Error(`Artifact path not found for ${contractName}`); + } + + const debugPath = artifactPath.replace(".json", ".dbg.json"); + const debugJson = await fs.promises.readFile(debugPath); + + const buildInfoPath = path.join( + path.parse(debugPath).dir, + JSON.parse(debugJson.toString()).buildInfo + ); + + const buildInfoJson = await fs.promises.readFile(buildInfoPath); + + return JSON.parse(buildInfoJson.toString()); + } + + public async resolvePath(contractName: string): Promise { + const artifactPaths = await this._hre.artifacts.getArtifactPaths(); + + const artifactPath = artifactPaths.find( + (p) => path.parse(p).name === contractName + ); + + return artifactPath; + } + + public loadArtifact(contractName: string): Promise { + return this._hre.artifacts.readArtifact(contractName); + } +} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index 904d2524b7..b98d5ea12a 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -11,8 +11,7 @@ import fs from "fs-extra"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; -import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; -import { buildDeploymentLoader } from "./buildDeploymentLoader"; +import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; export class IgnitionHelper { constructor(private _hre: HardhatRuntimeEnvironment) {} @@ -29,10 +28,11 @@ export class IgnitionHelper { method: "eth_accounts", })) as string[]; + const artifactResolver = new HardhatArtifactResolver(this._hre); + const deployer = new Deployer({ adapters: buildAdaptersFrom(this._hre), - artifactResolver: buildArtifactResolverFrom(this._hre), - deploymentLoader: buildDeploymentLoader(this._hre), + artifactResolver, }); const result = await deployer.deploy( diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index c166c03243..b5fa0e4336 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -14,9 +14,8 @@ import path from "path"; import prompts from "prompts"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; -import { buildArtifactResolverFrom } from "./buildArtifactResolverFrom"; -import { buildDeploymentLoader } from "./buildDeploymentLoader"; import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; +import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; import { IgnitionHelper } from "./ignition-helper"; import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; @@ -258,15 +257,18 @@ task("deploy2") try { const deploymentId = givenDeploymentId ?? `network-${chainId}`; - const artifactResolver = buildArtifactResolverFrom(hre); - const adapters = buildAdaptersFrom(hre); + const deploymentDir = + hre.network.name === "hardhat" + ? undefined + : path.join(hre.config.paths.ignition, "deployments", deploymentId); - const deploymentLoader = buildDeploymentLoader(hre); + const artifactResolver = new HardhatArtifactResolver(hre); + const adapters = buildAdaptersFrom(hre); const deployer = new Deployer({ adapters, artifactResolver, - deploymentLoader, + deploymentDir, }); const result = await deployer.deploy( From 67d923830ed2e2da7cd8dadc0f617df5c0a73eb3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 19:51:19 +0100 Subject: [PATCH 0494/1302] refactor: expose deploy function --- packages/core/src/index.ts | 4 +- packages/core/src/new-api/deploy.ts | 57 +++++++ packages/core/src/new-api/deployer.ts | 141 ------------------ .../core/src/new-api/internal/deployer.ts | 108 ++++++++++++++ .../hardhat-plugin/src/ignition-helper.ts | 14 +- packages/hardhat-plugin/src/index.ts | 14 +- 6 files changed, 176 insertions(+), 162 deletions(-) create mode 100644 packages/core/src/new-api/deploy.ts delete mode 100644 packages/core/src/new-api/deployer.ts create mode 100644 packages/core/src/new-api/internal/deployer.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 71fc5cfb3d..3999077d35 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,10 +2,8 @@ export { buildModule } from "./buildModule"; export * from "./errors"; export * from "./initialization"; export { defineModule } from "./new-api/define-module"; -export { Deployer } from "./new-api/deployer"; +export { deploy } from "./new-api/deploy"; /* TODO: how is module constructor getting exposed? */ -export { FileJournal } from "./new-api/internal/journal/file-journal"; -export { MemoryJournal } from "./new-api/internal/journal/memory-journal"; export { ModuleConstructor } from "./new-api/internal/module-builder"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; export * from "./new-api/type-guards"; diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts new file mode 100644 index 0000000000..ddcbdaee3a --- /dev/null +++ b/packages/core/src/new-api/deploy.ts @@ -0,0 +1,57 @@ +import { Deployer } from "./internal/deployer"; +import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { MemoryDeploymentLoader } from "./internal/deployment-loader/memory-deployment-loader"; +import { EthersChainDispatcher } from "./internal/execution/transactions/chain-dispatcher"; +import { TransactionServiceImplementation } from "./internal/execution/transactions/transaction-service"; +import { Adapters } from "./types/adapters"; +import { ArtifactResolver } from "./types/artifact"; +import { DeploymentResult } from "./types/deployer"; +import { IgnitionModuleResult, ModuleParameters } from "./types/module"; +import { IgnitionModuleDefinition } from "./types/module-builder"; + +/** + * Deploy an IgnitionModule to the chain + * + * @beta + */ +export function deploy({ + artifactResolver, + adapters, + deploymentDir, + moduleDefinition, + deploymentParameters, + accounts, +}: { + artifactResolver: ArtifactResolver; + adapters: Adapters; + deploymentDir?: string; + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >; + deploymentParameters: { [key: string]: ModuleParameters }; + accounts: string[]; +}): Promise { + const deploymentLoader = + deploymentDir === undefined + ? new MemoryDeploymentLoader(artifactResolver) + : new FileDeploymentLoader(deploymentDir); + + const transactionService = new TransactionServiceImplementation( + deploymentLoader, + new EthersChainDispatcher( + adapters.signer, + adapters.gas, + adapters.transactions + ) + ); + + const deployer = new Deployer({ + artifactResolver, + transactionService, + deploymentLoader, + }); + + return deployer.deploy(moduleDefinition, deploymentParameters, accounts); +} diff --git a/packages/core/src/new-api/deployer.ts b/packages/core/src/new-api/deployer.ts deleted file mode 100644 index 25d055f98d..0000000000 --- a/packages/core/src/new-api/deployer.ts +++ /dev/null @@ -1,141 +0,0 @@ -import type { IgnitionModuleResult, ModuleParameters } from "./types/module"; -import type { IgnitionModuleDefinition } from "./types/module-builder"; - -import { IgnitionError } from "../errors"; - -import { Batcher } from "./internal/batcher"; -import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; -import { MemoryDeploymentLoader } from "./internal/deployment-loader/memory-deployment-loader"; -import { ExecutionEngine } from "./internal/execution/execution-engine"; -import { BasicExecutionStrategy } from "./internal/execution/execution-strategy"; -import { executionStateReducer } from "./internal/execution/executionStateReducer"; -import { EthersChainDispatcher } from "./internal/execution/transactions/chain-dispatcher"; -import { TransactionServiceImplementation } from "./internal/execution/transactions/transaction-service"; -import { ModuleConstructor } from "./internal/module-builder"; -import { Reconciler } from "./internal/reconciliation/reconciler"; -import { ExecutionStrategy } from "./internal/types/execution-engine"; -import { ExecutionStateMap } from "./internal/types/execution-state"; -import { validate } from "./internal/validation/validate"; -import { isAdapters } from "./type-guards"; -import { Adapters } from "./types/adapters"; -import { ArtifactResolver } from "./types/artifact"; -import { DeploymentResult } from "./types/deployer"; -import { DeploymentLoader } from "./types/deployment-loader"; -import { Journal } from "./types/journal"; -import { TransactionService } from "./types/transaction-service"; - -/** - * Run an Igntition deployment. - * - * @beta - */ -export class Deployer { - private _moduleConstructor: ModuleConstructor; - private _executionEngine: ExecutionEngine; - private _transactionService: TransactionService; - private _strategy: ExecutionStrategy; - private _artifactResolver: ArtifactResolver; - private _deploymentLoader: DeploymentLoader; - - constructor( - options: { - artifactResolver: ArtifactResolver; - deploymentDir?: string; - } & ( - | { - transactionService: TransactionService; - } - | { - adapters: Adapters; - } - ) - ) { - this._strategy = new BasicExecutionStrategy(); - this._artifactResolver = options.artifactResolver; - this._deploymentLoader = - options.deploymentDir === undefined - ? new MemoryDeploymentLoader(options.artifactResolver) - : new FileDeploymentLoader(options.deploymentDir); - - if ("adapters" in options && isAdapters(options.adapters)) { - const adapters: Adapters = options.adapters; - this._transactionService = new TransactionServiceImplementation( - this._deploymentLoader, - new EthersChainDispatcher( - adapters.signer, - adapters.gas, - adapters.transactions - ) - ); - } else if ("transactionService" in options) { - this._transactionService = options.transactionService; - } else { - throw new IgnitionError("Bad arguments passed to deployer"); - } - - this._moduleConstructor = new ModuleConstructor(); - this._executionEngine = new ExecutionEngine(); - } - - public async deploy( - deployId: string, - moduleDefinition: IgnitionModuleDefinition< - string, - string, - IgnitionModuleResult - >, - deploymentParameters: { [key: string]: ModuleParameters }, - accounts: string[] - ): Promise { - const module = this._moduleConstructor.construct(moduleDefinition); - - await validate(module, this._artifactResolver); - - await this._deploymentLoader.initialize(); - - const previousStateMap = await this._loadExecutionStateFrom( - this._deploymentLoader.journal - ); - - const reconciliationResult = Reconciler.reconcile( - module, - previousStateMap, - deploymentParameters, - accounts - ); - - if (reconciliationResult.reconciliationFailures.length > 0) { - throw new Error("Reconciliation failed"); - } - - if (reconciliationResult.missingExecutedFutures.length > 0) { - // TODO: indicate to UI that warnings should be shown - } - - const batches = Batcher.batch(module, previousStateMap); - - return this._executionEngine.execute({ - strategy: this._strategy, - transactionService: this._transactionService, - artifactResolver: this._artifactResolver, - batches, - module, - executionStateMap: previousStateMap, - accounts, - deploymentParameters, - deploymentLoader: this._deploymentLoader, - }); - } - - private async _loadExecutionStateFrom( - journal: Journal - ): Promise { - let state: ExecutionStateMap = {}; - - for await (const message of journal.read()) { - state = executionStateReducer(state, message); - } - - return state; - } -} diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts new file mode 100644 index 0000000000..93666f0d4b --- /dev/null +++ b/packages/core/src/new-api/internal/deployer.ts @@ -0,0 +1,108 @@ +import type { IgnitionModuleResult, ModuleParameters } from "../types/module"; +import type { IgnitionModuleDefinition } from "../types/module-builder"; + +import { ArtifactResolver } from "../types/artifact"; +import { DeploymentResult } from "../types/deployer"; +import { DeploymentLoader } from "../types/deployment-loader"; +import { Journal } from "../types/journal"; +import { TransactionService } from "../types/transaction-service"; + +import { Batcher } from "./batcher"; +import { ExecutionEngine } from "./execution/execution-engine"; +import { BasicExecutionStrategy } from "./execution/execution-strategy"; +import { executionStateReducer } from "./execution/executionStateReducer"; +import { ModuleConstructor } from "./module-builder"; +import { Reconciler } from "./reconciliation/reconciler"; +import { ExecutionStrategy } from "./types/execution-engine"; +import { ExecutionStateMap } from "./types/execution-state"; +import { validate } from "./validation/validate"; + +/** + * Run an Igntition deployment. + * + * @beta + */ +export class Deployer { + private _moduleConstructor: ModuleConstructor; + private _executionEngine: ExecutionEngine; + private _transactionService: TransactionService; + private _strategy: ExecutionStrategy; + private _artifactResolver: ArtifactResolver; + private _deploymentLoader: DeploymentLoader; + + constructor(options: { + artifactResolver: ArtifactResolver; + transactionService: TransactionService; + deploymentLoader: DeploymentLoader; + }) { + this._strategy = new BasicExecutionStrategy(); + this._artifactResolver = options.artifactResolver; + this._deploymentLoader = options.deploymentLoader; + + this._transactionService = options.transactionService; + + this._moduleConstructor = new ModuleConstructor(); + this._executionEngine = new ExecutionEngine(); + } + + public async deploy( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + deploymentParameters: { [key: string]: ModuleParameters }, + accounts: string[] + ): Promise { + const module = this._moduleConstructor.construct(moduleDefinition); + + await validate(module, this._artifactResolver); + + await this._deploymentLoader.initialize(); + + const previousStateMap = await this._loadExecutionStateFrom( + this._deploymentLoader.journal + ); + + const reconciliationResult = Reconciler.reconcile( + module, + previousStateMap, + deploymentParameters, + accounts + ); + + if (reconciliationResult.reconciliationFailures.length > 0) { + throw new Error("Reconciliation failed"); + } + + if (reconciliationResult.missingExecutedFutures.length > 0) { + // TODO: indicate to UI that warnings should be shown + } + + const batches = Batcher.batch(module, previousStateMap); + + return this._executionEngine.execute({ + strategy: this._strategy, + transactionService: this._transactionService, + artifactResolver: this._artifactResolver, + batches, + module, + executionStateMap: previousStateMap, + accounts, + deploymentParameters, + deploymentLoader: this._deploymentLoader, + }); + } + + private async _loadExecutionStateFrom( + journal: Journal + ): Promise { + let state: ExecutionStateMap = {}; + + for await (const message of journal.read()) { + state = executionStateReducer(state, message); + } + + return state; + } +} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index b98d5ea12a..32b5c7f70c 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -1,5 +1,5 @@ import { - Deployer, + deploy, DeploymentResultSuccess, IgnitionError, IgnitionModuleDefinition, @@ -30,18 +30,14 @@ export class IgnitionHelper { const artifactResolver = new HardhatArtifactResolver(this._hre); - const deployer = new Deployer({ + const result = await deploy({ adapters: buildAdaptersFrom(this._hre), artifactResolver, + moduleDefinition: ignitionModuleDefinition, + deploymentParameters: parameters, + accounts, }); - const result = await deployer.deploy( - "deploy-01", - ignitionModuleDefinition, - parameters, - accounts - ); - if (result.status !== "success") { // TODO: Show more information about why it failed throw new IgnitionError("Failed deployment"); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index b5fa0e4336..cbb25dd80b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,5 +1,5 @@ import { - Deployer, + deploy, Module, ModuleConstructor, ModuleDict, @@ -265,19 +265,15 @@ task("deploy2") const artifactResolver = new HardhatArtifactResolver(hre); const adapters = buildAdaptersFrom(hre); - const deployer = new Deployer({ + const result = await deploy({ adapters, artifactResolver, deploymentDir, + moduleDefinition: userModule as any, + deploymentParameters: parameters as any, + accounts, }); - const result = await deployer.deploy( - deploymentId, - userModule as any, - parameters as any, - accounts - ); - if (result.status === "success") { console.log("Deployment complete"); console.log(""); From 75c5120acc0192bf626c84a7ea46af575feb2b39 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 20:12:52 +0100 Subject: [PATCH 0495/1302] refactor: remove unneeded exports --- packages/core/src/index.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 3999077d35..6e60ae6532 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -10,8 +10,6 @@ export * from "./new-api/type-guards"; export * from "./new-api/types/adapters"; export * from "./new-api/types/artifact"; export * from "./new-api/types/deployer"; -export * from "./new-api/types/deployment-loader"; -export * from "./new-api/types/journal"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; From ba18be55ba0d07105e9b8b434e0ad272c2bd7935 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 22 Jun 2023 20:23:14 +0100 Subject: [PATCH 0496/1302] refactor: swap to assertions --- .../file-deployment-loader.ts | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index c6ad3c8d98..f338bd0686 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -6,6 +6,7 @@ import { DeploymentLoader } from "../../types/deployment-loader"; import { Journal } from "../../types/journal"; import { FileJournal } from "../journal/file-journal"; import { MemoryJournal } from "../journal/memory-journal"; +import { assertIgnitionInvariant } from "../utils/assertions"; export class FileDeploymentLoader implements DeploymentLoader { public journal: Journal; @@ -52,9 +53,10 @@ export class FileDeploymentLoader implements DeploymentLoader { futureId: string, artifact: Artifact ): Promise { - if (this._paths === null) { - throw new Error("Cannot record deploy address until initialized"); - } + assertIgnitionInvariant( + this._paths !== null, + "Cannot record deploy address until initialized" + ); const artifactFilePath = path.join( this._paths.artifactsDir, @@ -69,9 +71,10 @@ export class FileDeploymentLoader implements DeploymentLoader { } public async storeBuildInfo(buildInfo: BuildInfo): Promise { - if (this._paths === null) { - throw new Error("Cannot record build info address until initialized"); - } + assertIgnitionInvariant( + this._paths !== null, + "Cannot record build info address until initialized" + ); const buildInfoFilePath = path.join( this._paths?.buildInfoDir, @@ -86,9 +89,10 @@ export class FileDeploymentLoader implements DeploymentLoader { } public async loadArtifact(storedArtifactPath: string): Promise { - if (this._paths === null) { - throw new Error("Cannot load artifact until initialized"); - } + assertIgnitionInvariant( + this._paths !== null, + "Cannot load artifact until initialized" + ); const json = await fs.readFile( path.join(this._paths?.deploymentDir, storedArtifactPath) @@ -103,9 +107,10 @@ export class FileDeploymentLoader implements DeploymentLoader { futureId: string, contractAddress: string ): Promise { - if (this._paths === null) { - throw new Error("Cannot record deploy address until initialized"); - } + assertIgnitionInvariant( + this._paths !== null, + "Cannot record deploy address until initialized" + ); // TODO: should this be made async to be closer to a single fs transaction? const json = ( From 46a4edf8b6d4bf949392523efa1d976e8df260df Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 12:07:36 +0100 Subject: [PATCH 0497/1302] refactor: include reconciliation failed todo --- packages/core/src/new-api/internal/deployer.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 93666f0d4b..acbac22e18 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -72,6 +72,7 @@ export class Deployer { ); if (reconciliationResult.reconciliationFailures.length > 0) { + // TODO: Provide more information throw new Error("Reconciliation failed"); } From f36c95baf76763a42352ecec3c169e4eaa4cd625 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 12:19:00 +0100 Subject: [PATCH 0498/1302] refactor: remove unneeded ensure file --- .../file-deployment-loader.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index f338bd0686..0e1b14f7c3 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -43,8 +43,6 @@ export class FileDeploymentLoader implements DeploymentLoader { await fs.ensureDir(this._paths.deploymentDir); await fs.ensureDir(this._paths.artifactsDir); await fs.ensureDir(this._paths.buildInfoDir); - await fs.ensureFile(this._paths.journalPath); - await fs.ensureFile(this._paths.deployedAddressesPath); this.journal = new FileJournal(journalPath); } @@ -112,14 +110,16 @@ export class FileDeploymentLoader implements DeploymentLoader { "Cannot record deploy address until initialized" ); - // TODO: should this be made async to be closer to a single fs transaction? - const json = ( - await fs.readFile(this._paths.deployedAddressesPath) - ).toString(); + let deployedAddresses: { [key: string]: string }; + if (await fs.pathExists(this._paths.deployedAddressesPath)) { + const json = ( + await fs.readFile(this._paths.deployedAddressesPath) + ).toString(); - const deployedAddresses: { [key: string]: string } = JSON.parse( - json === "" ? "{}" : json - ); + deployedAddresses = JSON.parse(json); + } else { + deployedAddresses = {}; + } deployedAddresses[futureId] = contractAddress; From b45608ec674124f306912e9061d5e15294aae40a Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 12:42:55 +0100 Subject: [PATCH 0499/1302] refactor: use sync file write for journal --- .../internal/execution/execution-engine.ts | 3 +- .../new-api/internal/journal/file-journal.ts | 28 +++++++++++++++---- .../internal/journal/memory-journal.ts | 2 +- packages/core/src/new-api/types/journal.ts | 2 +- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index e736da6ced..a6068bb8e1 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -146,7 +146,8 @@ export class ExecutionEngine { state: ExecutionEngineState, message: JournalableMessage ): Promise { - await state.deploymentLoader.journal.record(message); + // NOTE: recording to the journal is a sync operation + state.deploymentLoader.journal.record(message); if (isDeployedContractExecutionSuccess(message)) { await state.deploymentLoader.recordDeployedAddress( diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index be1e896b22..608ff22052 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -1,4 +1,5 @@ -import fs from "fs"; +/* eslint-disable no-bitwise */ +import fs, { closeSync, constants, openSync, writeFileSync } from "fs"; import ndjson from "ndjson"; import { Journal, JournalableMessage } from "../../types/journal"; @@ -14,11 +15,8 @@ import { serializeReplacer } from "./utils/serialize-replacer"; export class FileJournal implements Journal { constructor(private _filePath: string) {} - public async record(message: JournalableMessage): Promise { - return fs.promises.appendFile( - this._filePath, - `${JSON.stringify(message, serializeReplacer.bind(this))}\n` - ); + public record(message: JournalableMessage): void { + this._appendJsonLine(this._filePath, message); } public async *read(): AsyncGenerator { @@ -39,4 +37,22 @@ export class FileJournal implements Journal { yield deserializedChunk as JournalableMessage; } } + + private _appendJsonLine(path: string, value: unknown) { + const flags = + constants.O_CREAT | + constants.O_WRONLY | // Write only + constants.O_APPEND | // Append + constants.O_DSYNC | // Synchronous I/O waiting for writes of content and metadata + constants.O_DIRECT; // Minimize caching + + const fd = openSync(path, flags); + + writeFileSync( + fd, + `\n${JSON.stringify(value, serializeReplacer.bind(this))}`, + "utf-8" + ); + closeSync(fd); + } } diff --git a/packages/core/src/new-api/internal/journal/memory-journal.ts b/packages/core/src/new-api/internal/journal/memory-journal.ts index 4384828fc6..9063634a1c 100644 --- a/packages/core/src/new-api/internal/journal/memory-journal.ts +++ b/packages/core/src/new-api/internal/journal/memory-journal.ts @@ -9,7 +9,7 @@ import { Journal, JournalableMessage } from "../../types/journal"; export class MemoryJournal implements Journal { private messages: string[] = []; - public async record(message: JournalableMessage): Promise { + public record(message: JournalableMessage): void { this.messages.push(JSON.stringify(message)); } diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 14774d57ca..888dfe15db 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -6,7 +6,7 @@ import { ArgumentType, FutureType } from "./module"; * @beta */ export interface Journal { - record(message: JournalableMessage): Promise; + record(message: JournalableMessage): void; read(): AsyncGenerator; } From f0d515ef52c6e2090b7630e23d4a13ed69f2ba89 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 14:05:42 +0100 Subject: [PATCH 0500/1302] refactor: make deployment loader init idempotent --- .../core/src/new-api/internal/deployer.ts | 2 - .../file-deployment-loader.ts | 41 ++++++++----------- .../memory-deployment-loader.ts | 2 - .../src/new-api/types/deployment-loader.ts | 1 - .../new-api/execution/execution-engine.ts | 3 -- 5 files changed, 17 insertions(+), 32 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index acbac22e18..a0edcd7e9a 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -58,8 +58,6 @@ export class Deployer { await validate(module, this._artifactResolver); - await this._deploymentLoader.initialize(); - const previousStateMap = await this._loadExecutionStateFrom( this._deploymentLoader.journal ); diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 0e1b14f7c3..796d086821 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -5,11 +5,10 @@ import { Artifact, BuildInfo } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; import { Journal } from "../../types/journal"; import { FileJournal } from "../journal/file-journal"; -import { MemoryJournal } from "../journal/memory-journal"; -import { assertIgnitionInvariant } from "../utils/assertions"; export class FileDeploymentLoader implements DeploymentLoader { public journal: Journal; + private _deploymentDirsEnsured: boolean; private _paths: { deploymentDir: string; @@ -17,13 +16,9 @@ export class FileDeploymentLoader implements DeploymentLoader { buildInfoDir: string; journalPath: string; deployedAddressesPath: string; - } | null = null; + }; constructor(private readonly _deploymentDirPath: string) { - this.journal = new MemoryJournal(); - } - - public async initialize(): Promise { const artifactsDir = path.join(this._deploymentDirPath, "artifacts"); const buildInfoDir = path.join(this._deploymentDirPath, "build-info"); const journalPath = path.join(this._deploymentDirPath, "journal.jsonl"); @@ -32,6 +27,8 @@ export class FileDeploymentLoader implements DeploymentLoader { "deployed_addresses.json" ); + this.journal = new FileJournal(journalPath); + this._paths = { deploymentDir: this._deploymentDirPath, artifactsDir, @@ -40,21 +37,26 @@ export class FileDeploymentLoader implements DeploymentLoader { deployedAddressesPath, }; + this._deploymentDirsEnsured = false; + } + + private async _initialize(): Promise { + if (this._deploymentDirsEnsured) { + return; + } + await fs.ensureDir(this._paths.deploymentDir); await fs.ensureDir(this._paths.artifactsDir); await fs.ensureDir(this._paths.buildInfoDir); - this.journal = new FileJournal(journalPath); + this._deploymentDirsEnsured = true; } public async storeArtifact( futureId: string, artifact: Artifact ): Promise { - assertIgnitionInvariant( - this._paths !== null, - "Cannot record deploy address until initialized" - ); + await this._initialize(); const artifactFilePath = path.join( this._paths.artifactsDir, @@ -69,10 +71,7 @@ export class FileDeploymentLoader implements DeploymentLoader { } public async storeBuildInfo(buildInfo: BuildInfo): Promise { - assertIgnitionInvariant( - this._paths !== null, - "Cannot record build info address until initialized" - ); + await this._initialize(); const buildInfoFilePath = path.join( this._paths?.buildInfoDir, @@ -87,10 +86,7 @@ export class FileDeploymentLoader implements DeploymentLoader { } public async loadArtifact(storedArtifactPath: string): Promise { - assertIgnitionInvariant( - this._paths !== null, - "Cannot load artifact until initialized" - ); + await this._initialize(); const json = await fs.readFile( path.join(this._paths?.deploymentDir, storedArtifactPath) @@ -105,10 +101,7 @@ export class FileDeploymentLoader implements DeploymentLoader { futureId: string, contractAddress: string ): Promise { - assertIgnitionInvariant( - this._paths !== null, - "Cannot record deploy address until initialized" - ); + await this._initialize(); let deployedAddresses: { [key: string]: string }; if (await fs.pathExists(this._paths.deployedAddressesPath)) { diff --git a/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts index 80c9ead59a..7afb508887 100644 --- a/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts @@ -23,8 +23,6 @@ export class MemoryDeploymentLoader implements DeploymentLoader { return artifact; } - public async initialize(): Promise {} - public async recordDeployedAddress( futureId: string, contractAddress: string diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/types/deployment-loader.ts index 54592d7cac..31a602b49f 100644 --- a/packages/core/src/new-api/types/deployment-loader.ts +++ b/packages/core/src/new-api/types/deployment-loader.ts @@ -8,7 +8,6 @@ import { Journal } from "./journal"; */ export interface DeploymentLoader { journal: Journal; - initialize(): Promise; loadArtifact(storedArtifactPath: string): Promise; storeArtifact(futureId: string, artifact: Artifact): Promise; storeBuildInfo(buildInfo: BuildInfo): Promise; diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 56ee27f166..a69cb13f07 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -431,9 +431,6 @@ function setupMockTransactionService(): TransactionService { function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { return { journal, - initialize: () => { - throw new Error("Not implemented"); - }, recordDeployedAddress: async () => {}, storeArtifact: async (futureId, _artifact) => { return `${futureId}.json`; From f493ccf9363822f31bb4729c3b56d5c9e705e0af Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 14:17:10 +0100 Subject: [PATCH 0501/1302] refactor: safer bigint serialization --- .../internal/journal/utils/deserialize-replacer.ts | 13 ++++++++++--- .../internal/journal/utils/serialize-replacer.ts | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts b/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts index c651b06a59..8d553ace78 100644 --- a/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts +++ b/packages/core/src/new-api/internal/journal/utils/deserialize-replacer.ts @@ -9,7 +9,7 @@ export function deserializeReplacer(_key: string, value: unknown) { } if (_isSerializedBigInt(value)) { - return BigInt(value.substring(0, value.length - 1)); + return BigInt(value.value); } if (typeof value === "object" && value !== null && "message" in value) { @@ -19,6 +19,13 @@ export function deserializeReplacer(_key: string, value: unknown) { return value; } -function _isSerializedBigInt(value: unknown): value is string { - return typeof value === "string" && /d+n/.test(value); +function _isSerializedBigInt( + arg: unknown +): arg is { _kind: "bigint"; value: string } { + return ( + arg !== null && + typeof arg === "object" && + "_kind" in arg && + arg._kind === "bigint" + ); } diff --git a/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts b/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts index cab9f096a5..125d50c2ce 100644 --- a/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts +++ b/packages/core/src/new-api/internal/journal/utils/serialize-replacer.ts @@ -13,7 +13,7 @@ export function serializeReplacer(_key: string, value: unknown) { } if (typeof value === "bigint") { - return `${value.toString(10)}n`; + return { _kind: "bigint", value: value.toString(10) }; } if (value instanceof Error) { From 551a80458ed2718c83fd2a096f17087858743cb9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 18:15:05 +0100 Subject: [PATCH 0502/1302] refactor: rename to ephemeral-deployment-loader --- packages/core/src/new-api/deploy.ts | 4 ++-- ...deployment-loader.ts => ephemeral-deployment-loader.ts} | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) rename packages/core/src/new-api/internal/deployment-loader/{memory-deployment-loader.ts => ephemeral-deployment-loader.ts} (82%) diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index ddcbdaee3a..780b5ca9a6 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -1,6 +1,6 @@ import { Deployer } from "./internal/deployer"; +import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemeral-deployment-loader"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; -import { MemoryDeploymentLoader } from "./internal/deployment-loader/memory-deployment-loader"; import { EthersChainDispatcher } from "./internal/execution/transactions/chain-dispatcher"; import { TransactionServiceImplementation } from "./internal/execution/transactions/transaction-service"; import { Adapters } from "./types/adapters"; @@ -35,7 +35,7 @@ export function deploy({ }): Promise { const deploymentLoader = deploymentDir === undefined - ? new MemoryDeploymentLoader(artifactResolver) + ? new EphemeralDeploymentLoader(artifactResolver) : new FileDeploymentLoader(deploymentDir); const transactionService = new TransactionServiceImplementation( diff --git a/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts similarity index 82% rename from packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts rename to packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index 7afb508887..5e127512ac 100644 --- a/packages/core/src/new-api/internal/deployment-loader/memory-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -5,7 +5,12 @@ import { DeploymentLoader } from "../../types/deployment-loader"; import { Journal } from "../../types/journal"; import { MemoryJournal } from "../journal/memory-journal"; -export class MemoryDeploymentLoader implements DeploymentLoader { +/** + * Stores and loads deployment related information without making changes + * on disk, by either storing in memory or loading already existing files. + * Used when running in environments like Hardhat tests. + */ +export class EphemeralDeploymentLoader implements DeploymentLoader { public journal: Journal; private _deployedAddresses: { [key: string]: string }; From 8fe5548c69014ba295571cec1b2a37165d86242f Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 23 Jun 2023 09:45:16 +0100 Subject: [PATCH 0503/1302] fix: execution state should always be set In execution state the `from` address should always be set. If the future specifies undefined, this should be reconcilied as `account[0]` the same way it is during execution. Fixes #281 --- .../internal/execution/execution-engine.ts | 39 +++---------------- .../new-api/internal/types/execution-state.ts | 8 ++-- .../internal/utils/resolve-from-address.ts | 17 ++++---- .../futures/reconcileArtifactContractAt.ts | 5 ++- .../reconcileArtifactContractDeployment.ts | 3 +- .../reconcileArtifactLibraryDeployment.ts | 3 +- .../futures/reconcileNamedContractAt.ts | 5 ++- .../futures/reconcileNamedContractCall.ts | 5 ++- .../reconcileNamedContractDeployment.ts | 3 +- .../reconcileNamedLibraryDeployment.ts | 3 +- .../futures/reconcileNamedStaticCall.ts | 5 ++- .../futures/reconcileReadEventArgument.ts | 3 +- .../futures/reconcileSendData.ts | 3 +- .../test/new-api/reconciliation/reconciler.ts | 3 +- 14 files changed, 44 insertions(+), 61 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index a6068bb8e1..da4ab91c77 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,7 +1,6 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; -import { isRuntimeValue } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; @@ -12,21 +11,19 @@ import { JournalableMessage, } from "../../types/journal"; import { - AccountRuntimeValue, ArgumentType, Future, FutureType, ModuleParameters, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, - RuntimeValueType, } from "../../types/module"; -import { accountRuntimeValueToErrorString } from "../reconciliation/utils"; import { isDeploymentExecutionState } from "../type-guards"; import { ExecutionEngineState } from "../types/execution-engine"; import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; +import { resolveFromAddress } from "../utils/resolve-from-address"; import { resolveFutureToValue } from "../utils/resolve-future-to-value"; import { resolveModuleParameter } from "../utils/resolve-module-parameter"; @@ -162,32 +159,6 @@ export class ExecutionEngine { ); } - private _resolveAddress( - potential: string | AccountRuntimeValue | undefined, - { accounts }: { accounts: string[] } - ) { - if (typeof potential === "string") { - return potential; - } - - if ( - isRuntimeValue(potential) && - potential.type === RuntimeValueType.ACCOUNT - ) { - return accounts[potential.accountIndex]; - } - - if (potential === undefined) { - return accounts[0]; - } - - throw new IgnitionError( - `Unable to resolve address: ${accountRuntimeValueToErrorString( - potential - )} ` - ); - } - private async _initCommandFor( future: Future, { @@ -230,7 +201,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: this._resolveAddress(future.from, { accounts }), + from: resolveFromAddress(future.from, { accounts }), }; return state; @@ -261,7 +232,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: this._resolveAddress(future.from, { accounts }), + from: resolveFromAddress(future.from, { accounts }), }; return state; @@ -288,7 +259,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: this._resolveAddress(future.from, { accounts }), + from: resolveFromAddress(future.from, { accounts }), }; return state; @@ -312,7 +283,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: this._resolveAddress(future.from, { accounts }), + from: resolveFromAddress(future.from, { accounts }), }; return state; diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index a2f667095d..32ddfacec4 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -128,7 +128,7 @@ export interface DeploymentExecutionState constructorArgs: ArgumentType[]; libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? value: bigint; - from: string | undefined; + from: string; contractAddress?: string; // The result } @@ -138,7 +138,7 @@ export interface CallExecutionState functionName: string; args: ArgumentType[]; value: bigint; - from: string | undefined; + from: string; } export interface StaticCallExecutionState @@ -146,7 +146,7 @@ export interface StaticCallExecutionState contractAddress: string; functionName: string; args: ArgumentType[]; - from: string | undefined; + from: string; result?: SolidityParameterType; } @@ -172,7 +172,7 @@ export interface SendDataExecutionState to: string; data: string | undefined; value: bigint; - from: string | undefined; + from: string; } export type ExecutionState = diff --git a/packages/core/src/new-api/internal/utils/resolve-from-address.ts b/packages/core/src/new-api/internal/utils/resolve-from-address.ts index 0b7a279deb..8f67df9323 100644 --- a/packages/core/src/new-api/internal/utils/resolve-from-address.ts +++ b/packages/core/src/new-api/internal/utils/resolve-from-address.ts @@ -1,5 +1,4 @@ -import { IgnitionError } from "../../../errors"; -import { isRuntimeValue } from "../../type-guards"; +import { isAccountRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue } from "../../types/module"; import { isAddress } from "../utils"; @@ -8,21 +7,23 @@ import { assertIgnitionInvariant } from "./assertions"; export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, { accounts }: { accounts: string[] } -): string | undefined { +): string { if (from === undefined) { - return from; + const address = accounts[0]; + + assertIgnitionInvariant(isAddress(address), `Account[0] is not an address`); + + return address; } if (typeof from === "string") { - if (!isAddress(from)) { - throw new IgnitionError("From is not a usable address"); - } + assertIgnitionInvariant(isAddress(from), `from is not an address`); return from; } assertIgnitionInvariant( - isRuntimeValue(from), + isAccountRuntimeValue(from), `Could not resolve from address: ${JSON.stringify(from)}` ); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index 813b0b395b..d9e34f85c1 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -10,6 +10,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - artifact contract at", () => { @@ -47,7 +48,7 @@ describe("Reconciliation - artifact contract at", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; const exampleStaticCallState: StaticCallExecutionState = { @@ -60,7 +61,7 @@ describe("Reconciliation - artifact contract at", () => { contractAddress: exampleAddress, functionName: "function", args: [], - from: undefined, + from: exampleAccounts[0], }; it("should reconcile when using an address string", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index a4230daa47..a3bf5757ff 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -7,6 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -37,7 +38,7 @@ describe("Reconciliation - artifact contract", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 1d98613e40..139161bd27 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -7,6 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -37,7 +38,7 @@ describe("Reconciliation - artifact library", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index a62c4126b7..a0b0ee74db 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -9,6 +9,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - named contract at", () => { @@ -39,7 +40,7 @@ describe("Reconciliation - named contract at", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; const exampleStaticCallState: StaticCallExecutionState = { @@ -52,7 +53,7 @@ describe("Reconciliation - named contract at", () => { contractAddress: exampleAddress, functionName: "function", args: [], - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged when using an address string", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index e646a039aa..faaabf5ea4 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -7,6 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -31,7 +32,7 @@ describe("Reconciliation - named contract call", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], contractAddress: differentAddress, }; @@ -46,7 +47,7 @@ describe("Reconciliation - named contract call", () => { functionName: "function", args: [], value: BigInt("0"), - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 89efa5c2f1..8c274bf5cc 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -6,6 +6,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -29,7 +30,7 @@ describe("Reconciliation - named contract", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 55f3b3dc2d..773bb83dba 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -6,6 +6,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -29,7 +30,7 @@ describe("Reconciliation - named library", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 647d273fd8..1128e6648e 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -7,6 +7,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -31,7 +32,7 @@ describe("Reconciliation - named static call", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; const exampleStaticCallState: StaticCallExecutionState = { @@ -44,7 +45,7 @@ describe("Reconciliation - named static call", () => { contractAddress: exampleAddress, functionName: "function", args: [], - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 6b56aefc13..0c341f7e44 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -7,6 +7,7 @@ import { ReadEventArgumentExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - read event argument", () => { @@ -39,7 +40,7 @@ describe("Reconciliation - read event argument", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index b8312889a6..b829726e8a 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -6,6 +6,7 @@ import { SendDataExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; +import { exampleAccounts } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - send data", () => { @@ -22,7 +23,7 @@ describe("Reconciliation - send data", () => { to: exampleAddress, data: "example_data", value: BigInt("0"), - from: undefined, + from: exampleAccounts[0], }; it("should reconcile unchanged", () => { diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 8da8811679..e1a68c3551 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -6,6 +6,7 @@ import { ExecutionStatus, } from "../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../src/new-api/types/module"; +import { exampleAccounts } from "../helpers"; import { assertSuccessReconciliation, reconcile } from "./helpers"; @@ -23,7 +24,7 @@ describe("Reconciliation", () => { value: BigInt("0"), constructorArgs: [], libraries: {}, - from: undefined, + from: exampleAccounts[0], }; it("should successfully reconcile on an empty execution state", () => { From dcd7c9557febbd13b549113a5c0cf720cfd78088 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 20:25:02 +0100 Subject: [PATCH 0504/1302] feat: record onchain transactions to history This involved pulling forward the futureId/transactionId against each on-chain interaction message (request and result). The onchain messages are recorded against each future execution state based on these ids. --- .../internal/execution/execution-strategy.ts | 2 ++ .../execution/executionStateReducer.ts | 21 +++++++++++++++- .../transactions/transaction-service.ts | 2 ++ .../new-api/internal/types/execution-state.ts | 5 ++-- packages/core/src/new-api/types/journal.ts | 4 ++++ .../new-api/execution/execution-engine.ts | 24 ++++++++++++++++++- 6 files changed, 54 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 27c9b86872..8bb98e157c 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -48,6 +48,8 @@ export class BasicExecutionStrategy const result = yield { type: "onchain-action", subtype: "deploy-contract", + futureId: deploymentExecutionState.id, + transactionId: 1, contractName: deploymentExecutionState.contractName, value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 778ab87932..7b9ae1be79 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -12,7 +12,7 @@ import { assertIgnitionInvariant } from "../utils/assertions"; export function executionStateReducer( executionStateMap: ExecutionStateMap, action: JournalableMessage -) { +): ExecutionStateMap { if (action.type === "execution-start") { return { ...executionStateMap, @@ -41,6 +41,25 @@ export function executionStateReducer( }; } + if (action.type === "onchain-action" || action.type === "onchain-result") { + const previousExState = executionStateMap[action.futureId]; + + assertIgnitionInvariant( + previousExState !== undefined, + "On chain message for nonexistant future" + ); + + const updateWithOnchainAction: ExecutionState = { + ...previousExState, + history: [...previousExState.history, action], + }; + + return { + ...executionStateMap, + [action.futureId]: updateWithOnchainAction, + }; + } + return executionStateMap; } diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index a480d4baa0..866ea1ed9b 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -68,6 +68,8 @@ export class TransactionServiceImplementation implements TransactionService { return { type: "onchain-result", subtype: "deploy-contract", + futureId: deployContractInteraction.futureId, + transactionId: deployContractInteraction.transactionId, contractAddress, }; } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 32ddfacec4..b63711a4f6 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -1,3 +1,4 @@ +import { TransactionMessage } from "../../types/journal"; import { ArgumentType, FutureType, @@ -76,7 +77,7 @@ interface SendOnchainInteraction transactions: Transaction[]; } -type OnchainInteraction = +export type OnchainInteraction = | DeploymentOnchainInteraction | FunctionCallOnchainInteraction | SendOnchainInteraction; @@ -84,7 +85,7 @@ type OnchainInteraction = /** * The execution history of a future is a sequence of onchain interactions. */ -type ExecutionHistory = OnchainInteraction[]; +type ExecutionHistory = TransactionMessage[]; /** * The different status that the execution can be at. diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 888dfe15db..18274855dd 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -46,6 +46,8 @@ export type OnchainInteractionMessage = DeployContractInteractionMessage; export interface DeployContractInteractionMessage { type: "onchain-action"; subtype: "deploy-contract"; + futureId: string; + transactionId: number; args: ArgumentType[]; contractName: string; storedArtifactPath: string; @@ -72,6 +74,8 @@ export type OnchainResultMessage = DeployContractResultMessage; export interface DeployContractResultMessage { type: "onchain-result"; subtype: "deploy-contract"; + futureId: string; + transactionId: number; contractAddress: string; } diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index a69cb13f07..064984a6a3 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -85,6 +85,8 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractName: "Contract1", args: [ "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", @@ -98,6 +100,8 @@ describe("execution engine", () => { { type: "onchain-result", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", }, { @@ -166,6 +170,8 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", + futureId: "Module1:Library1", + transactionId: 1, contractName: "Library1", args: [], value: BigInt(0).toString(), @@ -175,6 +181,8 @@ describe("execution engine", () => { { type: "onchain-result", subtype: "deploy-contract", + futureId: "Module1:Library1", + transactionId: 1, contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", }, { @@ -253,6 +261,8 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractName: "Contract1", args: [], value: BigInt(0).toString(), @@ -262,6 +272,8 @@ describe("execution engine", () => { { type: "onchain-result", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", }, { @@ -346,6 +358,8 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", + futureId: "Module1:Library1", + transactionId: 1, contractName: "Library1", args: [], value: BigInt(0).toString(), @@ -355,6 +369,8 @@ describe("execution engine", () => { { type: "onchain-result", subtype: "deploy-contract", + futureId: "Module1:Library1", + transactionId: 1, contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", }, { @@ -388,6 +404,8 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractName: "Contract1", args: [ { @@ -402,6 +420,8 @@ describe("execution engine", () => { { type: "onchain-result", subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", }, { @@ -420,9 +440,11 @@ function setupMockTransactionService(): TransactionService { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; return { - onchain: async () => ({ + onchain: async (message) => ({ type: "onchain-result", subtype: "deploy-contract", + futureId: message.futureId, + transactionId: message.transactionId, contractAddress: exampleAddress, }), } as TransactionService; From af90223dcbdc2dffd00497125b6d066972f62773 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 21:37:17 +0100 Subject: [PATCH 0505/1302] refactor: move `from` resolution to execution strategy Allow execution state to specify an `undefined` from, but insist that the execution strategy resolves the from address before yielding an onchain result. This involves exposing the accounts to the execution strategy. --- .../internal/execution/execution-engine.ts | 25 +++++++++-- .../internal/execution/execution-strategy.ts | 8 +++- .../internal/types/execution-engine.ts | 2 + .../new-api/internal/types/execution-state.ts | 8 ++-- packages/core/src/new-api/types/journal.ts | 2 +- .../new-api/execution/execution-engine.ts | 43 +++++++++++-------- 6 files changed, 58 insertions(+), 30 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index da4ab91c77..de5252fe1b 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -11,6 +11,7 @@ import { JournalableMessage, } from "../../types/journal"; import { + AccountRuntimeValue, ArgumentType, Future, FutureType, @@ -93,6 +94,7 @@ export class ExecutionEngine { const context = { executionState: state.executionStateMap[future.id], + accounts: state.accounts, }; const exectionStrategy = state.strategy.executeStrategy(context); @@ -201,7 +203,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: resolveFromAddress(future.from, { accounts }), + from: this._resolveAddress(future.from, { accounts }), }; return state; @@ -232,7 +234,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: resolveFromAddress(future.from, { accounts }), + from: this._resolveAddress(future.from, { accounts }), }; return state; @@ -259,7 +261,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: resolveFromAddress(future.from, { accounts }), + from: this._resolveAddress(future.from, { accounts }), }; return state; @@ -283,7 +285,7 @@ export class ExecutionEngine { libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), - from: resolveFromAddress(future.from, { accounts }), + from: this._resolveAddress(future.from, { accounts }), }; return state; @@ -298,6 +300,21 @@ export class ExecutionEngine { } } + /** + * Resolve the address like from to either undefined - which passes the + * user intent to the execution strategy, or to a usable string address. + */ + private _resolveAddress( + from: string | AccountRuntimeValue | undefined, + { accounts }: { accounts: string[] } + ): string | undefined { + if (from === undefined) { + return undefined; + } + + return resolveFromAddress(from, { accounts }); + } + private async _storeArtifactAndBuildInfoAgainstDeployment( future: | NamedLibraryDeploymentFuture diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 8bb98e157c..bc3852a71a 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -20,8 +20,10 @@ export class BasicExecutionStrategy { public executeStrategy({ executionState, + accounts, }: { executionState: ExecutionState; + accounts: string[]; }): AsyncGenerator< OnchainInteractionMessage, JournalableMessage, @@ -33,13 +35,15 @@ export class BasicExecutionStrategy ); } - return this._executeDeployment({ executionState }); + return this._executeDeployment({ executionState, accounts }); } public async *_executeDeployment({ executionState: deploymentExecutionState, + accounts, }: { executionState: DeploymentExecutionState; + accounts: string[]; }): AsyncGenerator< OnchainInteractionMessage, JournalableMessage, @@ -55,7 +59,7 @@ export class BasicExecutionStrategy args: deploymentExecutionState.constructorArgs, // TODO: the possibily of undefined for `from` needs // a working resolution - from: deploymentExecutionState.from ?? "n/a", + from: deploymentExecutionState.from ?? accounts[0], storedArtifactPath: deploymentExecutionState.storedArtifactPath, }; diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index ad48ff2fd0..0803d05014 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -29,8 +29,10 @@ export interface ExecutionEngineState { export interface ExecutionStrategy { executeStrategy: ({ executionState, + accounts, }: { executionState: ExecutionState; + accounts: string[]; }) => AsyncGenerator< OnchainInteractionMessage, JournalableMessage, diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index b63711a4f6..11f9ff91b0 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -129,7 +129,7 @@ export interface DeploymentExecutionState constructorArgs: ArgumentType[]; libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? value: bigint; - from: string; + from: string | undefined; contractAddress?: string; // The result } @@ -139,7 +139,7 @@ export interface CallExecutionState functionName: string; args: ArgumentType[]; value: bigint; - from: string; + from: string | undefined; } export interface StaticCallExecutionState @@ -147,7 +147,7 @@ export interface StaticCallExecutionState contractAddress: string; functionName: string; args: ArgumentType[]; - from: string; + from: string | undefined; result?: SolidityParameterType; } @@ -173,7 +173,7 @@ export interface SendDataExecutionState to: string; data: string | undefined; value: bigint; - from: string; + from: string | undefined; } export type ExecutionState = diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 18274855dd..1e2a77430c 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -118,7 +118,7 @@ export interface FutureStartMessage { constructorArgs: ArgumentType[]; libraries: { [key: string]: string }; value: string; - from: string; + from: string | undefined; } /** diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 064984a6a3..efc838615f 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -21,11 +21,11 @@ describe("execution engine", () => { const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); - const contract1 = m.contract("Contract1", [ - account1, - supply, - { nested: supply }, - ]); + const contract1 = m.contract( + "Contract1", + [account1, supply, { nested: supply }], + { from: account1 } + ); return { contract1 }; }); @@ -80,7 +80,7 @@ describe("execution engine", () => { { nested: 2000 }, ], libraries: {}, - from: accounts[0], + from: accounts[1], }, { type: "onchain-action", @@ -94,7 +94,7 @@ describe("execution engine", () => { { nested: 2000 }, ], value: BigInt(0).toString(), - from: exampleAccounts[0], + from: accounts[1], storedArtifactPath: "Module1:Contract1.json", }, { @@ -116,7 +116,8 @@ describe("execution engine", () => { it("should execute a library deploy", async () => { const moduleDefinition = defineModule("Module1", (m) => { - const library1 = m.library("Library1"); + const account2 = m.getAccount(2); + const library1 = m.library("Library1", { from: account2 }); return { library1 }; }); @@ -165,7 +166,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), constructorArgs: [], libraries: {}, - from: accounts[0], + from: accounts[2], }, { type: "onchain-action", @@ -175,7 +176,7 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - from: exampleAccounts[0], + from: accounts[2], storedArtifactPath: "Module1:Library1.json", }, { @@ -204,7 +205,10 @@ describe("execution engine", () => { }; const moduleDefinition = defineModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact); + const account2 = m.getAccount(2); + const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { + from: account2, + }); return { contract1 }; }); @@ -256,7 +260,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), constructorArgs: [], libraries: {}, - from: accounts[0], + from: accounts[2], }, { type: "onchain-action", @@ -266,7 +270,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - from: exampleAccounts[0], + from: accounts[2], storedArtifactPath: "Module1:Contract1.json", }, { @@ -291,11 +295,11 @@ describe("execution engine", () => { describe("with complex arguments", () => { it("should execute deploy when futures are passed as nested arguments", async () => { const moduleDefinition = defineModule("Module1", (m) => { - const library1 = m.library("Library1"); - const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); + const library1 = m.library("Library1", { from: account1 }); + const contract1 = m.contract( "Contract1", [{ nested: library1, arr: [account1, supply] }], @@ -303,6 +307,7 @@ describe("execution engine", () => { libraries: { Library1: library1, }, + from: account1, } ); @@ -353,7 +358,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), constructorArgs: [], libraries: {}, - from: accounts[0], + from: accounts[1], }, { type: "onchain-action", @@ -363,7 +368,7 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - from: exampleAccounts[0], + from: accounts[1], storedArtifactPath: "Module1:Library1.json", }, { @@ -399,7 +404,7 @@ describe("execution engine", () => { libraries: { Library1: "Module1:Library1", }, - from: accounts[0], + from: accounts[1], }, { type: "onchain-action", @@ -414,7 +419,7 @@ describe("execution engine", () => { }, ], value: BigInt(0).toString(), - from: exampleAccounts[0], + from: exampleAccounts[1], storedArtifactPath: "Module1:Contract1.json", }, { From b1a577559dcc2ebe72db8d61fd14480661915848 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 28 Jun 2023 22:18:38 +0100 Subject: [PATCH 0506/1302] feat: reconcile from based on history --- .../src/new-api/internal/execution/guards.ts | 10 +- .../execution-state-resolver.ts | 28 ++++++ .../reconcileArtifactContractDeployment.ts | 14 ++- .../reconcileArtifactLibraryDeployment.ts | 13 ++- .../futures/reconcileNamedContractCall.ts | 13 ++- .../reconcileNamedContractDeployment.ts | 13 ++- .../reconcileNamedLibraryDeployment.ts | 13 ++- .../futures/reconcileNamedStaticCall.ts | 13 ++- .../futures/reconcileSendData.ts | 15 ++- .../test/new-api/reconciliation/reconciler.ts | 96 +++++++++++++++++++ 10 files changed, 195 insertions(+), 33 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 7b3ef1b21e..b53022e35d 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -36,9 +36,7 @@ export function isExecutionMessage( export function isOnChainAction( potential: JournalableMessage ): potential is OnchainInteractionMessage { - const resultTypes = ["onchain-action"]; - - return resultTypes.includes(potential.type); + return potential.type === "onchain-action"; } export function isOnchainResult( @@ -49,6 +47,12 @@ export function isOnchainResult( return resultTypes.includes(potential.type); } +export function isOnchainInteractionMessage( + potential: JournalableMessage +): potential is OnchainInteractionMessage { + return isDeployContractInteraction(potential); +} + export function isDeployContractInteraction( potential: JournalableMessage ): potential is DeployContractInteractionMessage { diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 36a5c04a43..318cdbf66e 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -14,7 +14,9 @@ import { Future, ModuleParameterRuntimeValue, } from "../../types/module"; +import { isOnchainInteractionMessage } from "../execution/guards"; import { + CallExecutionState, DeploymentExecutionState, ExecutionState, ExecutionStateMap, @@ -209,6 +211,32 @@ export class ExecutionStateResolver { return to; } + /** + * Return the from, or if from is undefined return the first from based + * on the onchain interactions, if there are no interactions return undefined. + */ + public static resolveFromAddress( + executionState: + | DeploymentExecutionState + | SendDataExecutionState + | StaticCallExecutionState + | CallExecutionState + ): string | undefined { + if (executionState.from !== undefined) { + return executionState.from; + } + + const froms = executionState.history + .filter(isOnchainInteractionMessage) + .map((m) => m.from); + + if (froms.length > 0) { + return froms[0]; + } + + return undefined; + } + private static _resolveFromExecutionState< TFuture extends Future, TExState extends ExecutionState, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 1c5c55938a..2b4f3197d2 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -32,7 +32,6 @@ export function reconcileArtifactContractDeployment( future.libraries, context ); - if (!isEqual(resolvedLibraries, executionState.libraries)) { return fail(future, "Libraries have been changed"); } @@ -44,13 +43,18 @@ export function reconcileArtifactContractDeployment( ); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 833448d7f8..a0d810e4db 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -29,13 +29,18 @@ export function reconcileArtifactLibraryDeployment( return fail(future, "Libraries have been changed"); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index 61de9b2d91..eb535aabc1 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -47,13 +47,18 @@ export function reconcileNamedContractCall( ); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 19f196b811..270bac44ac 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -44,13 +44,18 @@ export function reconcileNamedContractDeployment( ); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 60b1848979..6fcbd44182 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -29,13 +29,18 @@ export function reconcileNamedLibraryDeployment( return fail(future, "Libraries have been changed"); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts index 998268935f..d705679eb9 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -40,13 +40,18 @@ export function reconcileNamedStaticCall( return fail(future, "Function args have been changed"); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, `From account has been changed from ${addressToErrorString( - executionState.from - )} to ${addressToErrorString(fromAddress)}` + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index 5280ced06b..e2ba0d031a 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -40,13 +40,18 @@ export function reconcileSendData( ); } - const fromAddress = resolveFromAddress(future.from, context); - if (!isEqual(fromAddress, executionState.from)) { + const resolvedFutureFromAddress = resolveFromAddress(future.from, context); + const executionStateFrom = + ExecutionStateResolver.resolveFromAddress(executionState); + if ( + executionStateFrom !== undefined && + !isEqual(resolvedFutureFromAddress, executionStateFrom) + ) { return fail( future, - `From account has been changed from ${ - executionState.from ?? "undefined" - } to ${addressToErrorString(fromAddress)}` + `From account has been changed from ${addressToErrorString( + executionStateFrom + )} to ${addressToErrorString(resolvedFutureFromAddress)}` ); } diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index e1a68c3551..86d63dfc3d 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -108,6 +108,102 @@ describe("Reconciliation", () => { ]); }); + describe("from and accounts interactions", () => { + it("should reconcile from where both future and execution state are undefined but there is history", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1", [], { from: undefined }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module1:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + history: [ + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, + args: [], + contractName: "Contract1", + storedArtifactPath: "./Module1:Contract1.json", + value: BigInt(0).toString(), + // history indicates from was accounts[3] + from: exampleAccounts[0], + }, + ], + from: undefined, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, []); + }); + + it("should reconcile any from if the execution state from is not set and there were no messages", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [], { from: account1 }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module1:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + history: [], + from: undefined, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, []); + }); + + it("should flag as unreconsiliable a changed from where the history indicates a different from", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account2 = m.getAccount(2); + // from is accounts[2] + const contract1 = m.contract("Contract1", [], { from: account2 }); + + return { contract1 }; + }); + + const reconiliationResult = reconcile(moduleDefinition, { + "Module1:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + history: [ + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, + args: [], + contractName: "Contract1", + storedArtifactPath: "./Module1:Contract1.json", + value: BigInt(0).toString(), + // history indicates from was accounts[3] + from: exampleAccounts[3], + }, + ], + from: undefined, + }, + }); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module1:Contract1", + failure: `From account has been changed from ${exampleAccounts[3]} to ${exampleAccounts[2]}`, + }, + ]); + }); + }); + describe("dependencies", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; From aaba6fedef2d227ef87f4eede6d89fc35423e032 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 29 Jun 2023 16:27:46 +0100 Subject: [PATCH 0507/1302] fix: replace accounts with sender in execution strategy --- .../internal/execution/execution-engine.ts | 29 +++++++++++++++---- .../internal/execution/execution-strategy.ts | 20 ++++++++----- .../execution-state-resolver.ts | 6 ++-- .../internal/types/execution-engine.ts | 12 ++++---- .../new-api/execution/execution-engine.ts | 8 ++--- 5 files changed, 49 insertions(+), 26 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index de5252fe1b..8a495c5bbb 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -20,7 +20,10 @@ import { NamedLibraryDeploymentFuture, } from "../../types/module"; import { isDeploymentExecutionState } from "../type-guards"; -import { ExecutionEngineState } from "../types/execution-engine"; +import { + ExecutionEngineState, + ExecutionStrategyContext, +} from "../types/execution-engine"; import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; @@ -92,11 +95,7 @@ export class ExecutionEngine { await this._apply(state, current); - const context = { - executionState: state.executionStateMap[future.id], - accounts: state.accounts, - }; - + const context = this._setupExecutionStrategyContext(future, state); const exectionStrategy = state.strategy.executeStrategy(context); const dependencies = Array.from(context.executionState.dependencies); @@ -398,4 +397,22 @@ export class ExecutionEngine { ]) ); } + + private _setupExecutionStrategyContext( + future: Future, + state: ExecutionEngineState + ): ExecutionStrategyContext { + const exState = state.executionStateMap[future.id]; + + const sender = isDeploymentExecutionState(exState) + ? exState.from ?? state.accounts[0] + : undefined; + + const context = { + executionState: exState, + sender, + }; + + return context; + } } diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index bc3852a71a..d5e9a38ad2 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -11,6 +11,7 @@ import { DeploymentExecutionState, ExecutionState, } from "../types/execution-state"; +import { assertIgnitionInvariant } from "../utils/assertions"; export abstract class ExecutionStrategyBase {} @@ -20,10 +21,10 @@ export class BasicExecutionStrategy { public executeStrategy({ executionState, - accounts, + sender, }: { executionState: ExecutionState; - accounts: string[]; + sender?: string; }): AsyncGenerator< OnchainInteractionMessage, JournalableMessage, @@ -35,20 +36,25 @@ export class BasicExecutionStrategy ); } - return this._executeDeployment({ executionState, accounts }); + return this._executeDeployment({ executionState, sender }); } public async *_executeDeployment({ executionState: deploymentExecutionState, - accounts, + sender, }: { executionState: DeploymentExecutionState; - accounts: string[]; + sender?: string; }): AsyncGenerator< OnchainInteractionMessage, JournalableMessage, OnchainResultMessage | null > { + assertIgnitionInvariant( + sender !== undefined, + "Sender must be defined for deployment execution" + ); + const result = yield { type: "onchain-action", subtype: "deploy-contract", @@ -57,10 +63,8 @@ export class BasicExecutionStrategy contractName: deploymentExecutionState.contractName, value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, - // TODO: the possibily of undefined for `from` needs - // a working resolution - from: deploymentExecutionState.from ?? accounts[0], storedArtifactPath: deploymentExecutionState.storedArtifactPath, + from: sender, }; if (result === null) { diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index 318cdbf66e..a91fa83ef9 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -226,12 +226,12 @@ export class ExecutionStateResolver { return executionState.from; } - const froms = executionState.history + const senders = executionState.history .filter(isOnchainInteractionMessage) .map((m) => m.from); - if (froms.length > 0) { - return froms[0]; + if (senders.length > 0) { + return senders[0]; } return undefined; diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 0803d05014..dcf7c3ce88 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -26,14 +26,16 @@ export interface ExecutionEngineState { deploymentLoader: DeploymentLoader; } +export interface ExecutionStrategyContext { + executionState: ExecutionState; + sender?: string; +} + export interface ExecutionStrategy { executeStrategy: ({ executionState, - accounts, - }: { - executionState: ExecutionState; - accounts: string[]; - }) => AsyncGenerator< + sender, + }: ExecutionStrategyContext) => AsyncGenerator< OnchainInteractionMessage, JournalableMessage, OnchainResultMessage | null diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index efc838615f..bf5a1bb2c6 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -94,8 +94,8 @@ describe("execution engine", () => { { nested: 2000 }, ], value: BigInt(0).toString(), - from: accounts[1], storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], }, { type: "onchain-result", @@ -176,8 +176,8 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - from: accounts[2], storedArtifactPath: "Module1:Library1.json", + from: accounts[2], }, { type: "onchain-result", @@ -368,8 +368,8 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - from: accounts[1], storedArtifactPath: "Module1:Library1.json", + from: accounts[1], }, { type: "onchain-result", @@ -419,8 +419,8 @@ describe("execution engine", () => { }, ], value: BigInt(0).toString(), - from: exampleAccounts[1], storedArtifactPath: "Module1:Contract1.json", + from: exampleAccounts[1], }, { type: "onchain-result", From 84d8d4bf680486fe44c2b168e76cb0d89f6facdd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 23 Jun 2023 02:21:26 -0400 Subject: [PATCH 0508/1302] add execution flow for call --- examples/complete/ignition/CompleteModule.js | 2 +- .../internal/execution/execution-engine.ts | 31 +++++- .../internal/execution/execution-strategy.ts | 77 +++++++++++-- .../execution/executionStateReducer.ts | 104 ++++++++++++------ .../src/new-api/internal/execution/guards.ts | 12 +- .../transactions/transaction-service.ts | 36 +++++- .../new-api/internal/types/execution-state.ts | 1 + packages/core/src/new-api/type-guards.ts | 34 ++++++ packages/core/src/new-api/types/journal.ts | 91 ++++++++++++++- 9 files changed, 329 insertions(+), 59 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index b4fea58e20..fd5659df12 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -19,7 +19,7 @@ module.exports = defineModule("CompleteModule", (m) => { } ); - // const call = m.call(basic, "basicFunction", [40]); + m.call(basic, "basicFunction", [40]); // const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); // m.staticCall(withLib, "readonlyFunction", [eventArg]); diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 8a495c5bbb..fe1cbc3755 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -24,7 +24,12 @@ import { ExecutionEngineState, ExecutionStrategyContext, } from "../types/execution-engine"; -import { ExecutionStateMap, ExecutionStatus } from "../types/execution-state"; +import { + DeploymentExecutionState, + ExecutionStateMap, + ExecutionStatus, +} from "../types/execution-state"; +import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { resolveFromAddress } from "../utils/resolve-from-address"; @@ -289,6 +294,30 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_CALL: + const contractAddress = ( + executionStateMap[future.contract.id] as DeploymentExecutionState + ).contractAddress; + + assertIgnitionInvariant( + contractAddress !== undefined, + "internal error - call executed before contract dependency" + ); + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + args: future.args, + functionName: future.functionName, + contractAddress, + value: future.value.toString(), + from: this._resolveAddress(future.from, { accounts }), + }; + return state; case FutureType.NAMED_STATIC_CALL: case FutureType.NAMED_CONTRACT_AT: case FutureType.ARTIFACT_CONTRACT_AT: diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index d5e9a38ad2..fd84cffb1a 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -1,13 +1,22 @@ import { IgnitionError } from "../../../errors"; import { + CallFunctionInteractionMessage, + CallFunctionResultMessage, + CalledFunctionExecutionSuccess, + DeployContractInteractionMessage, + DeployContractResultMessage, DeployedContractExecutionSuccess, JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, } from "../../types/journal"; -import { isDeploymentExecutionState } from "../type-guards"; +import { + isCallExecutionState, + isDeploymentExecutionState, +} from "../type-guards"; import { ExecutionStrategy } from "../types/execution-engine"; import { + CallExecutionState, DeploymentExecutionState, ExecutionState, } from "../types/execution-state"; @@ -30,25 +39,29 @@ export class BasicExecutionStrategy JournalableMessage, OnchainResultMessage | null > { - if (!isDeploymentExecutionState(executionState)) { - throw new IgnitionError( - "Basic strategy not implemented that execution state yet" - ); + if (isDeploymentExecutionState(executionState)) { + return this._executeDeployment({ executionState, sender }); + } + + if (isCallExecutionState(executionState)) { + return this._executeCall({ executionState, sender }); } - return this._executeDeployment({ executionState, sender }); + throw new IgnitionError( + "Basic strategy not implemented that execution state yet" + ); } - public async *_executeDeployment({ + private async *_executeDeployment({ executionState: deploymentExecutionState, sender, }: { executionState: DeploymentExecutionState; sender?: string; }): AsyncGenerator< - OnchainInteractionMessage, - JournalableMessage, - OnchainResultMessage | null + DeployContractInteractionMessage, + DeployedContractExecutionSuccess, + DeployContractResultMessage | null > { assertIgnitionInvariant( sender !== undefined, @@ -81,4 +94,48 @@ export class BasicExecutionStrategy return success; } + + private async *_executeCall({ + executionState: callExecutionState, + sender, + }: { + executionState: CallExecutionState; + sender?: string; + }): AsyncGenerator< + CallFunctionInteractionMessage, + CalledFunctionExecutionSuccess, + CallFunctionResultMessage | null + > { + assertIgnitionInvariant( + sender !== undefined, + "Sender must be defined for call execution" + ); + + const result = yield { + type: "onchain-action", + subtype: "call-function", + futureId: callExecutionState.id, + transactionId: 1, + contractAddress: callExecutionState.contractAddress, + value: callExecutionState.value.toString(), + args: callExecutionState.args, + functionName: callExecutionState.functionName, + from: sender, + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + const success: CalledFunctionExecutionSuccess = { + type: "execution-success", + subtype: "call-function", + futureId: callExecutionState.id, + contractAddress: callExecutionState.contractAddress, + functionName: callExecutionState.functionName, + txId: result.txId, + }; + + return success; + } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 7b9ae1be79..eff8a41719 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,7 +1,10 @@ -import { isDeploymentType } from "../../type-guards"; +import { + isCallFunctionStartMessage, + isDeployContractStartMessage, +} from "../../type-guards"; import { FutureStartMessage, JournalableMessage } from "../../types/journal"; -import { isDeploymentExecutionState } from "../type-guards"; import { + CallExecutionState, DeploymentExecutionState, ExecutionState, ExecutionStateMap, @@ -23,22 +26,35 @@ export function executionStateReducer( if (action.type === "execution-success") { const previousDeploymentExecutionState = executionStateMap[action.futureId]; - assertIgnitionInvariant( - previousDeploymentExecutionState !== undefined && - isDeploymentExecutionState(previousDeploymentExecutionState), - "TBD - only deployment state is currently implemented for execution success" - ); + if (action.subtype === "deploy-contract") { + const updatedExecutionState: DeploymentExecutionState = { + ...(previousDeploymentExecutionState as DeploymentExecutionState), + status: ExecutionStatus.SUCCESS, + contractAddress: action.contractAddress, + }; - const updatedExecutionState: ExecutionState = { - ...previousDeploymentExecutionState, - status: ExecutionStatus.SUCCESS, - contractAddress: action.contractAddress, - }; + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } - return { - ...executionStateMap, - [action.futureId]: updatedExecutionState, - }; + if (action.subtype === "call-function") { + const updatedExecutionState: CallExecutionState = { + ...(previousDeploymentExecutionState as CallExecutionState), + status: ExecutionStatus.SUCCESS, + txId: action.txId, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + + throw new Error( + "TBD - only deployment and call states are currently implemented for execution success" + ); } if (action.type === "onchain-action" || action.type === "onchain-result") { @@ -66,25 +82,43 @@ export function executionStateReducer( function initialiseExecutionStateFor( futureStart: FutureStartMessage ): ExecutionState { - if (!isDeploymentType(futureStart.futureType)) { - throw new Error("Not implemented yet in the reducer"); + if (isDeployContractStartMessage(futureStart)) { + const deploymentExecutionState: DeploymentExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + storedArtifactPath: futureStart.storedArtifactPath, + storedBuildInfoPath: futureStart.storedBuildInfoPath, + contractName: futureStart.contractName, + value: BigInt(futureStart.value), + constructorArgs: futureStart.constructorArgs, + libraries: futureStart.libraries, + from: futureStart.from, + }; + + return deploymentExecutionState; + } + + if (isCallFunctionStartMessage(futureStart)) { + const callExecutionState: CallExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + contractAddress: futureStart.contractAddress, + args: futureStart.args, + from: futureStart.from, + functionName: futureStart.functionName, + value: BigInt(futureStart.value), + }; + + return callExecutionState; } - const deploymentExecutionState: DeploymentExecutionState = { - id: futureStart.futureId, - futureType: futureStart.futureType, - strategy: futureStart.strategy, - status: ExecutionStatus.STARTED, - dependencies: new Set(futureStart.dependencies), - history: [], - storedArtifactPath: futureStart.storedArtifactPath, - storedBuildInfoPath: futureStart.storedBuildInfoPath, - contractName: futureStart.contractName, - value: BigInt(futureStart.value), - constructorArgs: futureStart.constructorArgs, - libraries: futureStart.libraries, - from: futureStart.from, - }; - - return deploymentExecutionState; + throw new Error("Not implemented yet in the reducer"); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index b53022e35d..e949f86791 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -1,4 +1,5 @@ import { + CallFunctionInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, ExecutionResultMessage, @@ -50,7 +51,10 @@ export function isOnchainResult( export function isOnchainInteractionMessage( potential: JournalableMessage ): potential is OnchainInteractionMessage { - return isDeployContractInteraction(potential); + return ( + isDeployContractInteraction(potential) || + isCallFunctionInteraction(potential) + ); } export function isDeployContractInteraction( @@ -59,6 +63,12 @@ export function isDeployContractInteraction( return isOnChainAction(potential) && potential.subtype === "deploy-contract"; } +export function isCallFunctionInteraction( + potential: JournalableMessage +): potential is CallFunctionInteractionMessage { + return isOnChainAction(potential) && potential.subtype === "call-function"; +} + export function isDeployedContractExecutionSuccess( potential: JournalableMessage ): potential is DeployedContractExecutionSuccess { diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 866ea1ed9b..7b17cdfb41 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -1,6 +1,8 @@ import { IgnitionError } from "../../../../errors"; import { DeploymentLoader } from "../../../types/deployment-loader"; import { + CallFunctionInteractionMessage, + CallFunctionResultMessage, DeployContractInteractionMessage, DeployContractResultMessage, OnchainInteractionMessage, @@ -11,7 +13,10 @@ import { TransactionServiceOptions, } from "../../../types/transaction-service"; import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; -import { isDeployContractInteraction } from "../guards"; +import { + isCallFunctionInteraction, + isDeployContractInteraction, +} from "../guards"; import { ChainDispatcher } from "./chain-dispatcher"; @@ -30,13 +35,17 @@ export class TransactionServiceImplementation implements TransactionService { interaction: OnchainInteractionMessage, options?: TransactionServiceOptions ): Promise { - if (!isDeployContractInteraction(interaction)) { - throw new IgnitionError( - "Transaction service not implemented for this interaction" - ); + if (isDeployContractInteraction(interaction)) { + return this._dispatchDeployContract(interaction, options?.libraries); + } + + if (isCallFunctionInteraction(interaction)) { + return this._dispatchCallFunction(interaction); } - return this._dispatchDeployContract(interaction, options?.libraries); + throw new IgnitionError( + "Transaction service not implemented for this interaction" + ); } private async _dispatchDeployContract( @@ -53,6 +62,8 @@ export class TransactionServiceImplementation implements TransactionService { const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); + // todo: i think chain dispatcher should only be passed a raw tx, and everything needed for that. + // any process necessary to generating that transaction should happen here in transaction service const { contractAddress } = await this._chainDispatcher.sendTx({ abi: artifact.abi, bytecode: linkedByteCode, @@ -73,4 +84,17 @@ export class TransactionServiceImplementation implements TransactionService { contractAddress, }; } + + private async _dispatchCallFunction( + callFunctionInteraction: CallFunctionInteractionMessage + ): Promise { + const from = callFunctionInteraction.from; + const args = callFunctionInteraction.args; + const value = BigInt(callFunctionInteraction.value); + const functionName = callFunctionInteraction.functionName; + + throw new Error( + `not implemented yet${from}${args as any}${value}${functionName}` + ); + } } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 11f9ff91b0..86f0b28c2a 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -140,6 +140,7 @@ export interface CallExecutionState args: ArgumentType[]; value: bigint; from: string | undefined; + txId?: string; } export interface StaticCallExecutionState diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 80630756c4..385f1afe34 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -1,5 +1,10 @@ import { Adapters } from "./types/adapters"; import { Artifact } from "./types/artifact"; +import { + CallFunctionStartMessage, + DeployContractStartMessage, + FutureStartMessage, +} from "./types/journal"; import { AccountRuntimeValue, AddressResolvableFuture, @@ -249,3 +254,32 @@ export function isAdapters(potential: unknown): potential is Adapters { "transactions" in potential ); } + +/** + * Returns true if potential is a contract deployment start message + * + * @beta + */ +export function isDeployContractStartMessage( + potential: FutureStartMessage +): potential is DeployContractStartMessage { + const deploymentTypes = [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ]; + + return deploymentTypes.includes(potential.futureType); +} + +/** + * Returns true if potential is a call function start message + * + * @beta + */ +export function isCallFunctionStartMessage( + potential: FutureStartMessage +): potential is CallFunctionStartMessage { + return potential.futureType === FutureType.NAMED_CONTRACT_CALL; +} diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 1e2a77430c..29c814b24b 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -36,7 +36,9 @@ export type TransactionMessage = * * @beta */ -export type OnchainInteractionMessage = DeployContractInteractionMessage; +export type OnchainInteractionMessage = + | DeployContractInteractionMessage + | CallFunctionInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. @@ -55,6 +57,23 @@ export interface DeployContractInteractionMessage { from: string; } +/** + * A on-chain interaction request to call a function. + * + * @beta + */ +export interface CallFunctionInteractionMessage { + type: "onchain-action"; + subtype: "call-function"; + futureId: string; + transactionId: number; + args: ArgumentType[]; + functionName: string; + value: string; + contractAddress: string; + from: string; +} + // #endregion // #region "OnchainResult" @@ -64,7 +83,9 @@ export interface DeployContractInteractionMessage { * * @beta */ -export type OnchainResultMessage = DeployContractResultMessage; +export type OnchainResultMessage = + | DeployContractResultMessage + | CallFunctionResultMessage; /** * A successful deploy contract transaction result. @@ -79,6 +100,19 @@ export interface DeployContractResultMessage { contractAddress: string; } +/** + * A successful call function transaction result. + * + * @beta + */ +export interface CallFunctionResultMessage { + type: "onchain-result"; + subtype: "call-function"; + futureId: string; + transactionId: number; + txId: string; +} + // #endregion // #endregion @@ -106,10 +140,23 @@ export type ExecutionUpdateMessage = FutureStartMessage | FutureRestartMessage; * * @beta */ -export interface FutureStartMessage { +export type FutureStartMessage = + | DeployContractStartMessage + | CallFunctionStartMessage; + +/** + * A journal message to initialise the execution state for a contract deployment. + * + * @beta + */ +export interface DeployContractStartMessage { type: "execution-start"; futureId: string; - futureType: FutureType; + futureType: + | FutureType.NAMED_CONTRACT_DEPLOYMENT + | FutureType.NAMED_LIBRARY_DEPLOYMENT + | FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + | FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; strategy: string; dependencies: string[]; storedArtifactPath: string; @@ -121,6 +168,24 @@ export interface FutureStartMessage { from: string | undefined; } +/** + * A journal message to initialise the execution state for a function call. + * + * @beta + */ +export interface CallFunctionStartMessage { + type: "execution-start"; + futureId: string; + futureType: FutureType.NAMED_CONTRACT_CALL; + strategy: string; + dependencies: string[]; + args: ArgumentType[]; + functionName: string; + value: string; + contractAddress: string; + from: string | undefined; +} + /** * A journal message to indicate a future is being restarted. * @@ -163,7 +228,9 @@ export type ExecutionResultTypes = [ * * @beta */ -export type ExecutionSuccess = DeployedContractExecutionSuccess; +export type ExecutionSuccess = + | DeployedContractExecutionSuccess + | CalledFunctionExecutionSuccess; /** * A journal message indicating a contract/library deployed successfully. @@ -178,6 +245,20 @@ export interface DeployedContractExecutionSuccess { contractAddress: string; } +/** + * A journal message indicating a contract function was called successfully. + * + * @beta + */ +export interface CalledFunctionExecutionSuccess { + type: "execution-success"; + subtype: "call-function"; + futureId: string; + functionName: string; + txId: string; + contractAddress: string; +} + // #endregion /** From 44a82fbd268a4fcb840b658d3683a340d4da9256 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 26 Jun 2023 01:50:39 -0400 Subject: [PATCH 0509/1302] fully implement call execution --- package-lock.json | 1 + packages/core/src/new-api/deploy.ts | 7 +- .../internal/execution/execution-engine.ts | 9 +-- .../internal/execution/execution-strategy.ts | 1 + .../execution/executionStateReducer.ts | 1 + .../transactions/chain-dispatcher.ts | 49 ++++---------- .../transactions/transaction-service.ts | 65 ++++++++++++++----- .../new-api/internal/types/execution-state.ts | 1 + packages/core/src/new-api/types/journal.ts | 2 + .../futures/reconcileNamedContractCall.ts | 1 + 10 files changed, 75 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index 147269c512..79f41fc450 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20987,6 +20987,7 @@ "@ethersproject/address": "5.6.1", "debug": "^4.3.2", "ethers": "^5.4.7", + "fs-extra": "^10.0.0", "js-graph-algorithms": "1.0.18", "lodash": "4.17.21", "ndjson": "2.0.0", diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 780b5ca9a6..24fcca1168 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -40,11 +40,8 @@ export function deploy({ const transactionService = new TransactionServiceImplementation( deploymentLoader, - new EthersChainDispatcher( - adapters.signer, - adapters.gas, - adapters.transactions - ) + adapters.signer, + new EthersChainDispatcher(adapters.gas, adapters.transactions) ); const deployer = new Deployer({ diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index fe1cbc3755..ce359af808 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -294,9 +294,9 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_CALL: - const contractAddress = ( - executionStateMap[future.contract.id] as DeploymentExecutionState - ).contractAddress; + const { contractAddress, storedArtifactPath } = executionStateMap[ + future.contract.id + ] as DeploymentExecutionState; assertIgnitionInvariant( contractAddress !== undefined, @@ -314,8 +314,9 @@ export class ExecutionEngine { args: future.args, functionName: future.functionName, contractAddress, + storedArtifactPath, value: future.value.toString(), - from: this._resolveAddress(future.from, { accounts }), + from: resolveFromAddress(future.from, { accounts }), }; return state; case FutureType.NAMED_STATIC_CALL: diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index fd84cffb1a..c17d1ddd29 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -117,6 +117,7 @@ export class BasicExecutionStrategy futureId: callExecutionState.id, transactionId: 1, contractAddress: callExecutionState.contractAddress, + storedArtifactPath: callExecutionState.storedArtifactPath, value: callExecutionState.value.toString(), args: callExecutionState.args, functionName: callExecutionState.functionName, diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index eff8a41719..48f81aa1f8 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -111,6 +111,7 @@ function initialiseExecutionStateFor( dependencies: new Set(futureStart.dependencies), history: [], contractAddress: futureStart.contractAddress, + storedArtifactPath: futureStart.storedArtifactPath, args: futureStart.args, from: futureStart.from, functionName: futureStart.functionName, diff --git a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts index 1ea0de5787..9ccd83931c 100644 --- a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts @@ -1,31 +1,17 @@ -import { ContractFactory, ethers } from "ethers"; +import { ethers } from "ethers"; -import { - GasAdapter, - SignerAdapter, - TransactionsAdapter, -} from "../../../types/adapters"; - -interface HighLevelTransaction { - abi: any[]; - bytecode: string; - args: any; - value: bigint; - from: string; -} +import { GasAdapter, TransactionsAdapter } from "../../../types/adapters"; interface TransactionReceipt { contractAddress?: string; + txId?: string; } export interface ChainDispatcher { - sendTx({ - abi, - bytecode, - args, - value, - from, - }: HighLevelTransaction): Promise; + sendTx( + tx: ethers.providers.TransactionRequest, + signer: ethers.Signer + ): Promise; } /** @@ -35,26 +21,14 @@ export interface ChainDispatcher { */ export class EthersChainDispatcher implements ChainDispatcher { constructor( - private _signerLoader: SignerAdapter, private _gasProvider: GasAdapter, private _transactionProvider: TransactionsAdapter ) {} - public async sendTx({ - abi, - bytecode, - args, - value, - from, - }: HighLevelTransaction): Promise { - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const Factory = new ContractFactory(abi, bytecode, signer); - - const tx = Factory.getDeployTransaction(...args, { - value, - }); - + public async sendTx( + tx: ethers.providers.TransactionRequest, + signer: ethers.Signer + ): Promise { // if (txOptions?.gasLimit !== undefined) { // tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); // } @@ -83,6 +57,7 @@ export class EthersChainDispatcher implements ChainDispatcher { return { contractAddress: receipt.contractAddress, + txId: txHash, }; } } diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 7b17cdfb41..d994c952b7 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -1,4 +1,7 @@ +import { Contract, ContractFactory, ethers } from "ethers"; + import { IgnitionError } from "../../../../errors"; +import { SignerAdapter } from "../../../types/adapters"; import { DeploymentLoader } from "../../../types/deployment-loader"; import { CallFunctionInteractionMessage, @@ -28,6 +31,7 @@ import { ChainDispatcher } from "./chain-dispatcher"; export class TransactionServiceImplementation implements TransactionService { constructor( private _deploymentLoader: DeploymentLoader, + private _signerLoader: SignerAdapter, private _chainDispatcher: ChainDispatcher ) {} @@ -62,16 +66,16 @@ export class TransactionServiceImplementation implements TransactionService { const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); - // todo: i think chain dispatcher should only be passed a raw tx, and everything needed for that. - // any process necessary to generating that transaction should happen here in transaction service - const { contractAddress } = await this._chainDispatcher.sendTx({ - abi: artifact.abi, - bytecode: linkedByteCode, - args, + const signer: ethers.Signer = await this._signerLoader.getSigner(from); + + const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); + + const tx = Factory.getDeployTransaction(...args, { value, - from, }); + const { contractAddress } = await this._chainDispatcher.sendTx(tx, signer); + if (contractAddress === undefined) { throw new IgnitionError("Contract address not available on receipt"); } @@ -85,16 +89,45 @@ export class TransactionServiceImplementation implements TransactionService { }; } - private async _dispatchCallFunction( - callFunctionInteraction: CallFunctionInteractionMessage - ): Promise { - const from = callFunctionInteraction.from; - const args = callFunctionInteraction.args; - const value = BigInt(callFunctionInteraction.value); - const functionName = callFunctionInteraction.functionName; + private async _dispatchCallFunction({ + futureId, + transactionId, + from, + args, + functionName, + contractAddress, + value, + storedArtifactPath, + }: CallFunctionInteractionMessage): Promise { + const artifact = await this._deploymentLoader.loadArtifact( + storedArtifactPath + ); + + const signer: ethers.Signer = await this._signerLoader.getSigner(from); - throw new Error( - `not implemented yet${from}${args as any}${value}${functionName}` + const contractInstance = new Contract( + contractAddress, + artifact.abi, + signer ); + + const unsignedTx = await contractInstance.populateTransaction[functionName]( + ...args, + { value: BigInt(value), from: await signer.getAddress() } + ); + + const { txId } = await this._chainDispatcher.sendTx(unsignedTx, signer); + + if (txId === undefined) { + throw new IgnitionError("Transaction hash not available on receipt"); + } + + return { + type: "onchain-result", + subtype: "call-function", + futureId, + transactionId, + txId, + }; } } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 86f0b28c2a..e60b2698e7 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -135,6 +135,7 @@ export interface DeploymentExecutionState export interface CallExecutionState extends BaseExecutionState { + storedArtifactPath: string; // As stored in the deployment directory. contractAddress: string; functionName: string; args: ArgumentType[]; diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 29c814b24b..9cc76127b6 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -71,6 +71,7 @@ export interface CallFunctionInteractionMessage { functionName: string; value: string; contractAddress: string; + storedArtifactPath: string; from: string; } @@ -184,6 +185,7 @@ export interface CallFunctionStartMessage { value: string; contractAddress: string; from: string | undefined; + storedArtifactPath: string; } /** diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index faaabf5ea4..57f986d9e3 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -44,6 +44,7 @@ describe("Reconciliation - named contract call", () => { dependencies: new Set(), history: [], contractAddress: differentAddress, + storedArtifactPath: "./artifact.json", functionName: "function", args: [], value: BigInt("0"), From 36c71aa35cb49079c79c6b8d0fba30222af82b83 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 26 Jun 2023 02:34:17 -0400 Subject: [PATCH 0510/1302] add support for static call execution --- examples/complete/ignition/CompleteModule.js | 2 +- .../internal/execution/execution-engine.ts | 31 +++++++- .../internal/execution/execution-strategy.ts | 48 ++++++++++++ .../execution/executionStateReducer.ts | 37 ++++++++- .../src/new-api/internal/execution/guards.ts | 7 ++ .../transactions/transaction-service.ts | 45 +++++++++++ .../new-api/internal/journal/type-guards.ts | 47 ++++++++++++ .../new-api/internal/types/execution-state.ts | 1 + packages/core/src/new-api/type-guards.ts | 34 --------- packages/core/src/new-api/types/journal.ts | 76 +++++++++++++++++-- packages/core/src/new-api/types/module.ts | 12 ++- .../futures/reconcileArtifactContractAt.ts | 1 + .../futures/reconcileNamedContractAt.ts | 1 + .../futures/reconcileNamedStaticCall.ts | 1 + 14 files changed, 295 insertions(+), 48 deletions(-) create mode 100644 packages/core/src/new-api/internal/journal/type-guards.ts diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index fd5659df12..c009bdf8ef 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -21,7 +21,7 @@ module.exports = defineModule("CompleteModule", (m) => { m.call(basic, "basicFunction", [40]); // const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); - // m.staticCall(withLib, "readonlyFunction", [eventArg]); + m.staticCall(withLib, "readonlyFunction", [42]); // const duplicate = m.contractAt("BasicContract", basic); // const duplicateWithLib = m.contractAtFromArtifact( diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index ce359af808..781adf1fcd 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -293,7 +293,7 @@ export class ExecutionEngine { }; return state; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.NAMED_CONTRACT_CALL: { const { contractAddress, storedArtifactPath } = executionStateMap[ future.contract.id ] as DeploymentExecutionState; @@ -319,7 +319,34 @@ export class ExecutionEngine { from: resolveFromAddress(future.from, { accounts }), }; return state; - case FutureType.NAMED_STATIC_CALL: + } + case FutureType.NAMED_STATIC_CALL: { + const { contractAddress, storedArtifactPath } = executionStateMap[ + future.contract.id + ] as DeploymentExecutionState; + + if (contractAddress === undefined) { + throw new Error( + "internal error - call executed before contract dependency" + ); + } + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + args: future.args, + functionName: future.functionName, + contractAddress, + storedArtifactPath, + from: resolveFromAddress(future.from, { accounts }), + }; + return state; + } case FutureType.NAMED_CONTRACT_AT: case FutureType.ARTIFACT_CONTRACT_AT: case FutureType.READ_EVENT_ARGUMENT: diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index c17d1ddd29..b4cd1ee407 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -9,16 +9,21 @@ import { JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, + StaticCallExecutionSuccess, + StaticCallInteractionMessage, + StaticCallResultMessage, } from "../../types/journal"; import { isCallExecutionState, isDeploymentExecutionState, + isStaticCallExecutionState, } from "../type-guards"; import { ExecutionStrategy } from "../types/execution-engine"; import { CallExecutionState, DeploymentExecutionState, ExecutionState, + StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -47,6 +52,10 @@ export class BasicExecutionStrategy return this._executeCall({ executionState, sender }); } + if (isStaticCallExecutionState(executionState)) { + return this._executeStaticCall({ executionState, accounts }); + } + throw new IgnitionError( "Basic strategy not implemented that execution state yet" ); @@ -139,4 +148,43 @@ export class BasicExecutionStrategy return success; } + + private async *_executeStaticCall({ + executionState: staticCallExecutionState, + accounts, + }: { + executionState: StaticCallExecutionState; + accounts: string[]; + }): AsyncGenerator< + StaticCallInteractionMessage, + StaticCallExecutionSuccess, + StaticCallResultMessage | null + > { + const result = yield { + type: "onchain-action", + subtype: "static-call", + futureId: staticCallExecutionState.id, + transactionId: 1, + contractAddress: staticCallExecutionState.contractAddress, + storedArtifactPath: staticCallExecutionState.storedArtifactPath, + args: staticCallExecutionState.args, + from: staticCallExecutionState.from ?? accounts[0], + functionName: staticCallExecutionState.functionName, + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + const success: StaticCallExecutionSuccess = { + type: "execution-success", + subtype: "static-call", + futureId: staticCallExecutionState.id, + contractAddress: staticCallExecutionState.contractAddress, + functionName: staticCallExecutionState.functionName, + result: result.result, + }; + + return success; + } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 48f81aa1f8..ba23f920ed 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,14 +1,16 @@ +import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, isDeployContractStartMessage, -} from "../../type-guards"; -import { FutureStartMessage, JournalableMessage } from "../../types/journal"; + isStaticCallStartMessage, +} from "../journal/type-guards"; import { CallExecutionState, DeploymentExecutionState, ExecutionState, ExecutionStateMap, ExecutionStatus, + StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -52,6 +54,19 @@ export function executionStateReducer( }; } + if (action.subtype === "static-call") { + const updatedExecutionState: StaticCallExecutionState = { + ...(previousDeploymentExecutionState as StaticCallExecutionState), + status: ExecutionStatus.SUCCESS, + result: action.result, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + throw new Error( "TBD - only deployment and call states are currently implemented for execution success" ); @@ -121,5 +136,23 @@ function initialiseExecutionStateFor( return callExecutionState; } + if (isStaticCallStartMessage(futureStart)) { + const callExecutionState: StaticCallExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + contractAddress: futureStart.contractAddress, + storedArtifactPath: futureStart.storedArtifactPath, + args: futureStart.args, + from: futureStart.from, + functionName: futureStart.functionName, + }; + + return callExecutionState; + } + throw new Error("Not implemented yet in the reducer"); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index e949f86791..572a486cac 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -8,6 +8,7 @@ import { JournalableMessage, OnchainInteractionMessage, OnchainResultMessage, + StaticCallInteractionMessage, } from "../../types/journal"; export function isExecutionResult( @@ -69,6 +70,12 @@ export function isCallFunctionInteraction( return isOnChainAction(potential) && potential.subtype === "call-function"; } +export function isStaticCallInteraction( + potential: JournalableMessage +): potential is StaticCallInteractionMessage { + return isOnChainAction(potential) && potential.subtype === "static-call"; +} + export function isDeployedContractExecutionSuccess( potential: JournalableMessage ): potential is DeployedContractExecutionSuccess { diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index d994c952b7..fe91d380be 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -10,6 +10,8 @@ import { DeployContractResultMessage, OnchainInteractionMessage, OnchainResultMessage, + StaticCallInteractionMessage, + StaticCallResultMessage, } from "../../../types/journal"; import { TransactionService, @@ -19,6 +21,7 @@ import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { isCallFunctionInteraction, isDeployContractInteraction, + isStaticCallInteraction, } from "../guards"; import { ChainDispatcher } from "./chain-dispatcher"; @@ -47,6 +50,10 @@ export class TransactionServiceImplementation implements TransactionService { return this._dispatchCallFunction(interaction); } + if (isStaticCallInteraction(interaction)) { + return this._dispatchStaticCall(interaction); + } + throw new IgnitionError( "Transaction service not implemented for this interaction" ); @@ -130,4 +137,42 @@ export class TransactionServiceImplementation implements TransactionService { txId, }; } + + private async _dispatchStaticCall({ + futureId, + transactionId, + from, + args, + functionName, + contractAddress, + storedArtifactPath, + }: StaticCallInteractionMessage): Promise { + const artifact = await this._deploymentLoader.loadArtifact( + storedArtifactPath + ); + + const signer: ethers.Signer = await this._signerLoader.getSigner(from); + + const contractInstance = new Contract( + contractAddress, + artifact.abi, + signer + ); + + const result = await contractInstance[functionName](...args, { + from: await signer.getAddress(), + }); + + if (result === undefined) { + throw new IgnitionError("Static call result not available"); + } + + return { + type: "onchain-result", + subtype: "static-call", + futureId, + transactionId, + result, + }; + } } diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts new file mode 100644 index 0000000000..5dc50fcbd8 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -0,0 +1,47 @@ +import { + CallFunctionStartMessage, + DeployContractStartMessage, + FutureStartMessage, + StaticCallStartMessage, +} from "../../types/journal"; +import { FutureType } from "../../types/module"; + +/** + * Returns true if potential is a contract deployment start message + * + * @beta + */ +export function isDeployContractStartMessage( + potential: FutureStartMessage +): potential is DeployContractStartMessage { + const deploymentTypes = [ + FutureType.NAMED_CONTRACT_DEPLOYMENT, + FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.NAMED_LIBRARY_DEPLOYMENT, + FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + ]; + + return deploymentTypes.includes(potential.futureType); +} + +/** + * Returns true if potential is a call function start message + * + * @beta + */ +export function isCallFunctionStartMessage( + potential: FutureStartMessage +): potential is CallFunctionStartMessage { + return potential.futureType === FutureType.NAMED_CONTRACT_CALL; +} + +/** + * Returns true if potential is a call function start message + * + * @beta + */ +export function isStaticCallStartMessage( + potential: FutureStartMessage +): potential is StaticCallStartMessage { + return potential.futureType === FutureType.NAMED_STATIC_CALL; +} diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index e60b2698e7..3c7507e132 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -146,6 +146,7 @@ export interface CallExecutionState export interface StaticCallExecutionState extends BaseExecutionState { + storedArtifactPath: string; // As stored in the deployment directory. contractAddress: string; functionName: string; args: ArgumentType[]; diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 385f1afe34..80630756c4 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -1,10 +1,5 @@ import { Adapters } from "./types/adapters"; import { Artifact } from "./types/artifact"; -import { - CallFunctionStartMessage, - DeployContractStartMessage, - FutureStartMessage, -} from "./types/journal"; import { AccountRuntimeValue, AddressResolvableFuture, @@ -254,32 +249,3 @@ export function isAdapters(potential: unknown): potential is Adapters { "transactions" in potential ); } - -/** - * Returns true if potential is a contract deployment start message - * - * @beta - */ -export function isDeployContractStartMessage( - potential: FutureStartMessage -): potential is DeployContractStartMessage { - const deploymentTypes = [ - FutureType.NAMED_CONTRACT_DEPLOYMENT, - FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.NAMED_LIBRARY_DEPLOYMENT, - FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, - ]; - - return deploymentTypes.includes(potential.futureType); -} - -/** - * Returns true if potential is a call function start message - * - * @beta - */ -export function isCallFunctionStartMessage( - potential: FutureStartMessage -): potential is CallFunctionStartMessage { - return potential.futureType === FutureType.NAMED_CONTRACT_CALL; -} diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 9cc76127b6..624b808e9c 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -1,4 +1,4 @@ -import { ArgumentType, FutureType } from "./module"; +import { ArgumentType, FutureType, PrimitiveArgType } from "./module"; /** * Store a deployments execution state as a transaction log. @@ -38,7 +38,8 @@ export type TransactionMessage = */ export type OnchainInteractionMessage = | DeployContractInteractionMessage - | CallFunctionInteractionMessage; + | CallFunctionInteractionMessage + | StaticCallInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. @@ -75,6 +76,23 @@ export interface CallFunctionInteractionMessage { from: string; } +/** + * A on-chain interaction request to statically call a function. + * + * @beta + */ +export interface StaticCallInteractionMessage { + type: "onchain-action"; + subtype: "static-call"; + futureId: string; + transactionId: number; + args: ArgumentType[]; + functionName: string; + contractAddress: string; + storedArtifactPath: string; + from: string; +} + // #endregion // #region "OnchainResult" @@ -86,7 +104,8 @@ export interface CallFunctionInteractionMessage { */ export type OnchainResultMessage = | DeployContractResultMessage - | CallFunctionResultMessage; + | CallFunctionResultMessage + | StaticCallResultMessage; /** * A successful deploy contract transaction result. @@ -114,6 +133,19 @@ export interface CallFunctionResultMessage { txId: string; } +/** + * A successful static function call transaction result. + * + * @beta + */ +export interface StaticCallResultMessage { + type: "onchain-result"; + subtype: "static-call"; + futureId: string; + transactionId: number; + result: PrimitiveArgType | PrimitiveArgType[]; +} + // #endregion // #endregion @@ -143,7 +175,8 @@ export type ExecutionUpdateMessage = FutureStartMessage | FutureRestartMessage; */ export type FutureStartMessage = | DeployContractStartMessage - | CallFunctionStartMessage; + | CallFunctionStartMessage + | StaticCallStartMessage; /** * A journal message to initialise the execution state for a contract deployment. @@ -188,6 +221,24 @@ export interface CallFunctionStartMessage { storedArtifactPath: string; } +/** + * A journal message to initialise the execution state for a static call. + * + * @beta + */ +export interface StaticCallStartMessage { + type: "execution-start"; + futureId: string; + futureType: FutureType.NAMED_STATIC_CALL; + strategy: string; + dependencies: string[]; + args: ArgumentType[]; + functionName: string; + contractAddress: string; + storedArtifactPath: string; + from: string; +} + /** * A journal message to indicate a future is being restarted. * @@ -232,7 +283,8 @@ export type ExecutionResultTypes = [ */ export type ExecutionSuccess = | DeployedContractExecutionSuccess - | CalledFunctionExecutionSuccess; + | CalledFunctionExecutionSuccess + | StaticCallExecutionSuccess; /** * A journal message indicating a contract/library deployed successfully. @@ -261,6 +313,20 @@ export interface CalledFunctionExecutionSuccess { contractAddress: string; } +/** + * A journal message indicating a static function was called successfully. + * + * @beta + */ +export interface StaticCallExecutionSuccess { + type: "execution-success"; + subtype: "static-call"; + futureId: string; + functionName: string; + result: PrimitiveArgType | PrimitiveArgType[]; + contractAddress: string; +} + // #endregion /** diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0b4308cd27..364d612087 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,5 +1,12 @@ import { Artifact } from "./artifact"; +/** + * Argument type representing primitive values expressed in smart contracts. + * + * @beta + */ +export type PrimitiveArgType = number | bigint | string | boolean; + /** * Base argument type that smart contracts can receive in their constructors * and functions. @@ -7,10 +14,7 @@ import { Artifact } from "./artifact"; * @beta */ export type BaseArgumentType = - | number - | bigint - | string - | boolean + | PrimitiveArgType | ContractFuture | NamedStaticCallFuture | ReadEventArgumentFuture diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index d9e34f85c1..6d50e8f2b9 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -59,6 +59,7 @@ describe("Reconciliation - artifact contract at", () => { dependencies: new Set(), history: [], contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index a0b0ee74db..7832438db5 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -51,6 +51,7 @@ describe("Reconciliation - named contract at", () => { dependencies: new Set(), history: [], contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 1128e6648e..01f36e0ef8 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -43,6 +43,7 @@ describe("Reconciliation - named static call", () => { dependencies: new Set(), history: [], contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], From f957004c486870942a59dd4c23e1a785b92340e1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 29 Jun 2023 11:22:49 +0100 Subject: [PATCH 0511/1302] fix: include static call in isOnchainInteraction --- .../internal/execution/execution-strategy.ts | 13 +++++++++---- .../core/src/new-api/internal/execution/guards.ts | 3 ++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index b4cd1ee407..0fe7b40bf4 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -53,7 +53,7 @@ export class BasicExecutionStrategy } if (isStaticCallExecutionState(executionState)) { - return this._executeStaticCall({ executionState, accounts }); + return this._executeStaticCall({ executionState, sender }); } throw new IgnitionError( @@ -151,15 +151,20 @@ export class BasicExecutionStrategy private async *_executeStaticCall({ executionState: staticCallExecutionState, - accounts, + sender, }: { executionState: StaticCallExecutionState; - accounts: string[]; + sender?: string; }): AsyncGenerator< StaticCallInteractionMessage, StaticCallExecutionSuccess, StaticCallResultMessage | null > { + assertIgnitionInvariant( + sender !== undefined, + "Sender must be defined for static call execution" + ); + const result = yield { type: "onchain-action", subtype: "static-call", @@ -168,8 +173,8 @@ export class BasicExecutionStrategy contractAddress: staticCallExecutionState.contractAddress, storedArtifactPath: staticCallExecutionState.storedArtifactPath, args: staticCallExecutionState.args, - from: staticCallExecutionState.from ?? accounts[0], functionName: staticCallExecutionState.functionName, + from: sender, }; if (result === null) { diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 572a486cac..670f306778 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -54,7 +54,8 @@ export function isOnchainInteractionMessage( ): potential is OnchainInteractionMessage { return ( isDeployContractInteraction(potential) || - isCallFunctionInteraction(potential) + isCallFunctionInteraction(potential) || + isStaticCallInteraction(potential) ); } From 8439e8a034d02af25a8d882537d9f83227b16991 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 29 Jun 2023 19:55:15 +0100 Subject: [PATCH 0512/1302] fix: pass sender into call/static call --- .../internal/execution/execution-engine.ts | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 781adf1fcd..4438dfdbdd 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -19,7 +19,11 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "../../types/module"; -import { isDeploymentExecutionState } from "../type-guards"; +import { + isCallExecutionState, + isDeploymentExecutionState, + isStaticCallExecutionState, +} from "../type-guards"; import { ExecutionEngineState, ExecutionStrategyContext, @@ -461,9 +465,12 @@ export class ExecutionEngine { ): ExecutionStrategyContext { const exState = state.executionStateMap[future.id]; - const sender = isDeploymentExecutionState(exState) - ? exState.from ?? state.accounts[0] - : undefined; + const sender = + isDeploymentExecutionState(exState) || + isCallExecutionState(exState) || + isStaticCallExecutionState(exState) + ? exState.from ?? state.accounts[0] + : undefined; const context = { executionState: exState, From 11d8b9290bfd76eb0aec003fdadbea489b1a69f8 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Jul 2023 17:13:45 +0100 Subject: [PATCH 0513/1302] lint: fix doc formatting --- docs/creating-modules-for-deployment.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index e6c8a46022..b969543985 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -157,20 +157,20 @@ pragma solidity ^0.8.5; import "@openzeppelin/contracts/utils/Create2.sol"; contract Create2Factory { - event Deployed(bytes32 indexed salt, address deployed); + event Deployed(bytes32 indexed salt, address deployed); - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) public returns (address) { - address deployedAddress; + function deploy( + uint256 amount, + bytes32 salt, + bytes memory bytecode + ) public returns (address) { + address deployedAddress; - deployedAddress = Create2.deploy(amount, salt, bytecode); - emit Deployed(salt, deployedAddress); + deployedAddress = Create2.deploy(amount, salt, bytecode); + emit Deployed(salt, deployedAddress); - return deployedAddress; - } + return deployedAddress; + } } ``` From f9626df9523b322f01209e332a3ff3395d224ad3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 23 Jun 2023 16:58:16 +0100 Subject: [PATCH 0514/1302] refactor(new-api): support deploy failures Support futures having revert and other errors from on-chain transactions during execution. To support this failure transaction results are now included and recorded to the journal. A `wipe` cli command has been added to allow reruns on error by clearing the state against a future. Resolves #274. --- examples/sample/contracts/Lock.sol | 38 +- packages/core/src/index.ts | 1 + .../core/src/new-api/internal/deployer.ts | 2 +- .../internal/execution/execution-engine.ts | 39 +- .../internal/execution/execution-strategy.ts | 12 +- .../execution/executionStateReducer.ts | 15 +- .../src/new-api/internal/execution/guards.ts | 38 +- .../transactions/chain-dispatcher.ts | 35 +- .../transactions/transaction-service.ts | 140 +++--- .../internal/journal/memory-journal.ts | 11 +- .../new-api/internal/journal/type-guards.ts | 66 +++ packages/core/src/new-api/internal/wiper.ts | 52 +++ packages/core/src/new-api/types/deployer.ts | 14 +- packages/core/src/new-api/types/journal.ts | 59 ++- packages/core/src/new-api/wipe.ts | 20 + packages/core/test/new-api/call.ts | 17 +- packages/core/test/new-api/contract.ts | 6 +- packages/core/test/new-api/contractAt.ts | 4 +- .../core/test/new-api/contractFromArtifact.ts | 2 +- .../new-api/execution/execution-engine.ts | 420 +++++++++++------- .../core/test/new-api/execution/restart.ts | 118 +++++ packages/core/test/new-api/helpers.ts | 154 ++++++- packages/core/test/new-api/library.ts | 2 +- .../core/test/new-api/readEventArgument.ts | 7 +- packages/core/test/new-api/staticCall.ts | 22 +- packages/core/test/new-api/wipe.ts | 89 ++++ packages/hardhat-plugin/src/index.ts | 52 ++- 27 files changed, 1082 insertions(+), 353 deletions(-) create mode 100644 packages/core/src/new-api/internal/wiper.ts create mode 100644 packages/core/src/new-api/wipe.ts create mode 100644 packages/core/test/new-api/execution/restart.ts create mode 100644 packages/core/test/new-api/wipe.ts diff --git a/examples/sample/contracts/Lock.sol b/examples/sample/contracts/Lock.sol index 50935f61fd..9e0e189d9e 100644 --- a/examples/sample/contracts/Lock.sol +++ b/examples/sample/contracts/Lock.sol @@ -5,30 +5,30 @@ pragma solidity ^0.8.9; // import "hardhat/console.sol"; contract Lock { - uint public unlockTime; - address payable public owner; + uint public unlockTime; + address payable public owner; - event Withdrawal(uint amount, uint when); + event Withdrawal(uint amount, uint when); - constructor(uint _unlockTime) payable { - require( - block.timestamp < _unlockTime, - "Unlock time should be in the future" - ); + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); - unlockTime = _unlockTime; - owner = payable(msg.sender); - } + unlockTime = _unlockTime; + owner = payable(msg.sender); + } - function withdraw() public { - // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal - // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); - require(block.timestamp >= unlockTime, "You can't withdraw yet"); - require(msg.sender == owner, "You aren't the owner"); + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); - emit Withdrawal(address(this).balance, block.timestamp); + emit Withdrawal(address(this).balance, block.timestamp); - owner.transfer(address(this).balance); - } + owner.transfer(address(this).balance); + } } diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6e60ae6532..a3a2afc2be 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -3,6 +3,7 @@ export * from "./errors"; export * from "./initialization"; export { defineModule } from "./new-api/define-module"; export { deploy } from "./new-api/deploy"; +export { wipe } from "./new-api/wipe"; /* TODO: how is module constructor getting exposed? */ export { ModuleConstructor } from "./new-api/internal/module-builder"; export { StoredDeploymentSerializer } from "./new-api/stored-deployment-serializer"; diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index a0edcd7e9a..9da209e76d 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -32,8 +32,8 @@ export class Deployer { constructor(options: { artifactResolver: ArtifactResolver; - transactionService: TransactionService; deploymentLoader: DeploymentLoader; + transactionService: TransactionService; }) { this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 4438dfdbdd..e5e32fe7de 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -5,10 +5,12 @@ import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; import { + ExecutionFailure, ExecutionResultMessage, FutureRestartMessage, FutureStartMessage, JournalableMessage, + OnchainResultFailureMessage, } from "../../types/journal"; import { AccountRuntimeValue, @@ -19,6 +21,10 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "../../types/module"; +import { + isOnChainFailureMessage, + isOnChainSuccessMessage, +} from "../journal/type-guards"; import { isCallExecutionState, isDeploymentExecutionState, @@ -43,9 +49,9 @@ import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { executionStateReducer } from "./executionStateReducer"; import { isDeployedContractExecutionSuccess, - isExecutionResult, + isExecutionFailure, + isExecutionResultMessage, isOnChainAction, - isOnchainResult, } from "./guards"; type ExecutionBatch = Future[]; @@ -64,8 +70,15 @@ export class ExecutionEngine { const batchResult = await this._executeBatch(executionBatch, state); - if (batchResult.some((b) => b.type === "execution-failure")) { - return { status: "failed" }; + if (batchResult.some(isExecutionFailure)) { + return { + status: "failure", + errors: Object.fromEntries( + batchResult + .filter(isExecutionFailure) + .map((r) => [r.futureId, r.error]) + ), + }; } if (batchResult.some((b) => b.type === "execution-hold")) { @@ -117,25 +130,39 @@ export class ExecutionEngine { }) ); - while (!isExecutionResult(current)) { + while (!isExecutionResultMessage(current)) { context.executionState = state.executionStateMap[future.id]; if (isOnChainAction(current)) { current = await state.transactionService.onchain(current, { libraries, }); - } else if (isOnchainResult(current)) { + } else if (isOnChainSuccessMessage(current)) { current = (await exectionStrategy.next(current)).value; + } else if (isOnChainFailureMessage(current)) { + current = this._convertToExecutionFailure(current); } else { current = (await exectionStrategy.next(null)).value; } + // TODO: add never type check? + await this._apply(state, current); } return current; } + private _convertToExecutionFailure( + current: OnchainResultFailureMessage + ): ExecutionFailure { + return { + type: "execution-failure", + futureId: current.futureId, + error: current.error, + }; + } + private async _startOrRestartFor( future: Future, state: ExecutionEngineState diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 0fe7b40bf4..be73b19bff 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -1,17 +1,17 @@ import { IgnitionError } from "../../../errors"; import { CallFunctionInteractionMessage, - CallFunctionResultMessage, CalledFunctionExecutionSuccess, DeployContractInteractionMessage, - DeployContractResultMessage, DeployedContractExecutionSuccess, JournalableMessage, + OnchainCallFunctionSuccessMessage, + OnchainDeployContractSuccessMessage, OnchainInteractionMessage, OnchainResultMessage, + OnchainStaticCallSuccessMessage, StaticCallExecutionSuccess, StaticCallInteractionMessage, - StaticCallResultMessage, } from "../../types/journal"; import { isCallExecutionState, @@ -70,7 +70,7 @@ export class BasicExecutionStrategy }): AsyncGenerator< DeployContractInteractionMessage, DeployedContractExecutionSuccess, - DeployContractResultMessage | null + OnchainDeployContractSuccessMessage | null > { assertIgnitionInvariant( sender !== undefined, @@ -113,7 +113,7 @@ export class BasicExecutionStrategy }): AsyncGenerator< CallFunctionInteractionMessage, CalledFunctionExecutionSuccess, - CallFunctionResultMessage | null + OnchainCallFunctionSuccessMessage | null > { assertIgnitionInvariant( sender !== undefined, @@ -158,7 +158,7 @@ export class BasicExecutionStrategy }): AsyncGenerator< StaticCallInteractionMessage, StaticCallExecutionSuccess, - StaticCallResultMessage | null + OnchainStaticCallSuccessMessage | null > { assertIgnitionInvariant( sender !== undefined, diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index ba23f920ed..c48e3327e7 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -2,6 +2,7 @@ import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, isDeployContractStartMessage, + isExecutionStartMessage, isStaticCallStartMessage, } from "../journal/type-guards"; import { @@ -17,8 +18,8 @@ import { assertIgnitionInvariant } from "../utils/assertions"; export function executionStateReducer( executionStateMap: ExecutionStateMap, action: JournalableMessage -): ExecutionStateMap { - if (action.type === "execution-start") { +) { + if (isExecutionStartMessage(action)) { return { ...executionStateMap, [action.futureId]: initialiseExecutionStateFor(action), @@ -91,6 +92,16 @@ export function executionStateReducer( }; } + if (action.type === "wipe") { + const updated = { + ...executionStateMap, + }; + + delete updated[action.futureId]; + + return updated; + } + return executionStateMap; } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 670f306778..a84a5dc762 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -2,25 +2,23 @@ import { CallFunctionInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, + ExecutionFailure, + ExecutionHold, ExecutionResultMessage, - ExecutionResultTypes, ExecutionSuccess, JournalableMessage, OnchainInteractionMessage, - OnchainResultMessage, StaticCallInteractionMessage, } from "../../types/journal"; -export function isExecutionResult( +export function isExecutionResultMessage( potential: JournalableMessage ): potential is ExecutionResultMessage { - const resultTypes: ExecutionResultTypes = [ - "execution-success", - "execution-failure", - "execution-hold", - ]; - - return (resultTypes as string[]).includes(potential.type); + return ( + isExecutionSuccess(potential) || + isExecutionFailure(potential) || + isExecutionHold(potential) + ); } export function isExecutionSuccess( @@ -29,24 +27,22 @@ export function isExecutionSuccess( return potential.type === "execution-success"; } -export function isExecutionMessage( +export function isExecutionFailure( potential: JournalableMessage -): potential is ExecutionResultMessage { - return isExecutionResult(potential); +): potential is ExecutionFailure { + return potential.type === "execution-failure"; } -export function isOnChainAction( +export function isExecutionHold( potential: JournalableMessage -): potential is OnchainInteractionMessage { - return potential.type === "onchain-action"; +): potential is ExecutionHold { + return potential.type === "execution-hold"; } -export function isOnchainResult( +export function isOnChainAction( potential: JournalableMessage -): potential is OnchainResultMessage { - const resultTypes = ["onchain-result"]; - - return resultTypes.includes(potential.type); +): potential is OnchainInteractionMessage { + return potential.type === "onchain-action"; } export function isOnchainInteractionMessage( diff --git a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts index 9ccd83931c..2edb03e996 100644 --- a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts @@ -2,11 +2,19 @@ import { ethers } from "ethers"; import { GasAdapter, TransactionsAdapter } from "../../../types/adapters"; -interface TransactionReceipt { +interface TransactionSuccess { + type: "transaction-success"; contractAddress?: string; txId?: string; } +interface TransactionFailure { + type: "transaction-failure"; + error: Error; +} + +type TransactionReceipt = TransactionSuccess | TransactionFailure; + export interface ChainDispatcher { sendTx( tx: ethers.providers.TransactionRequest, @@ -48,16 +56,25 @@ export class EthersChainDispatcher implements ChainDispatcher { tx.gasPrice = gasPrice; } + try { + const response = await signer.sendTransaction(tx); - const response = await signer.sendTransaction(tx); + const txHash = response.hash; - const txHash = response.hash; + const receipt = await this._transactionProvider.wait(txHash); - const receipt = await this._transactionProvider.wait(txHash); - - return { - contractAddress: receipt.contractAddress, - txId: txHash, - }; + return { + type: "transaction-success", + contractAddress: receipt.contractAddress, + }; + } catch (error) { + return { + type: "transaction-failure", + error: + error instanceof Error + ? error + : new Error("Unknown issue during `sendTx`"), + }; + } } } diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index fe91d380be..122cea33fe 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -5,18 +5,18 @@ import { SignerAdapter } from "../../../types/adapters"; import { DeploymentLoader } from "../../../types/deployment-loader"; import { CallFunctionInteractionMessage, - CallFunctionResultMessage, DeployContractInteractionMessage, - DeployContractResultMessage, + OnchainDeployContractSuccessMessage, + OnchainFailureMessage, OnchainInteractionMessage, OnchainResultMessage, StaticCallInteractionMessage, - StaticCallResultMessage, } from "../../../types/journal"; import { TransactionService, TransactionServiceOptions, } from "../../../types/transaction-service"; +import { assertIgnitionInvariant } from "../../utils/assertions"; import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { isCallFunctionInteraction, @@ -62,7 +62,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchDeployContract( deployContractInteraction: DeployContractInteractionMessage, libraries: { [libraryName: string]: string } = {} - ): Promise { + ): Promise { const artifact = await this._deploymentLoader.loadArtifact( deployContractInteraction.storedArtifactPath ); @@ -81,19 +81,30 @@ export class TransactionServiceImplementation implements TransactionService { value, }); - const { contractAddress } = await this._chainDispatcher.sendTx(tx, signer); - - if (contractAddress === undefined) { - throw new IgnitionError("Contract address not available on receipt"); + const result = await this._chainDispatcher.sendTx(tx, signer); + + if (result.type === "transaction-success") { + assertIgnitionInvariant( + result.contractAddress !== undefined, + "Contract address not available on receipt" + ); + + return { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: deployContractInteraction.futureId, + transactionId: deployContractInteraction.transactionId, + contractAddress: result.contractAddress, + }; + } else { + return { + type: "onchain-result", + subtype: "failure", + futureId: deployContractInteraction.futureId, + transactionId: deployContractInteraction.transactionId, + error: result.error, + }; } - - return { - type: "onchain-result", - subtype: "deploy-contract", - futureId: deployContractInteraction.futureId, - transactionId: deployContractInteraction.transactionId, - contractAddress, - }; } private async _dispatchCallFunction({ @@ -105,7 +116,7 @@ export class TransactionServiceImplementation implements TransactionService { contractAddress, value, storedArtifactPath, - }: CallFunctionInteractionMessage): Promise { + }: CallFunctionInteractionMessage): Promise { const artifact = await this._deploymentLoader.loadArtifact( storedArtifactPath ); @@ -123,19 +134,30 @@ export class TransactionServiceImplementation implements TransactionService { { value: BigInt(value), from: await signer.getAddress() } ); - const { txId } = await this._chainDispatcher.sendTx(unsignedTx, signer); - - if (txId === undefined) { - throw new IgnitionError("Transaction hash not available on receipt"); + const result = await this._chainDispatcher.sendTx(unsignedTx, signer); + + if (result.type === "transaction-success") { + assertIgnitionInvariant( + result.txId !== undefined, + "Transaction hash not available on receipt" + ); + + return { + type: "onchain-result", + subtype: "call-function-success", + futureId, + transactionId, + txId: result.txId, + }; + } else { + return { + type: "onchain-result", + subtype: "failure", + futureId, + transactionId, + error: result.error, + }; } - - return { - type: "onchain-result", - subtype: "call-function", - futureId, - transactionId, - txId, - }; } private async _dispatchStaticCall({ @@ -146,33 +168,47 @@ export class TransactionServiceImplementation implements TransactionService { functionName, contractAddress, storedArtifactPath, - }: StaticCallInteractionMessage): Promise { + }: StaticCallInteractionMessage): Promise { const artifact = await this._deploymentLoader.loadArtifact( storedArtifactPath ); - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const contractInstance = new Contract( - contractAddress, - artifact.abi, - signer - ); - - const result = await contractInstance[functionName](...args, { - from: await signer.getAddress(), - }); - - if (result === undefined) { - throw new IgnitionError("Static call result not available"); + try { + const signer: ethers.Signer = await this._signerLoader.getSigner(from); + + const contractInstance = new Contract( + contractAddress, + artifact.abi, + signer + ); + + const result = await contractInstance[functionName](...args, { + from: await signer.getAddress(), + }); + + assertIgnitionInvariant( + result !== undefined, + "Static call result not available" + ); + + return { + type: "onchain-result", + subtype: "static-call-success", + futureId, + transactionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId, + transactionId, + error: + error instanceof Error + ? error + : new Error("Unknown static call error"), + }; } - - return { - type: "onchain-result", - subtype: "static-call", - futureId, - transactionId, - result, - }; } } diff --git a/packages/core/src/new-api/internal/journal/memory-journal.ts b/packages/core/src/new-api/internal/journal/memory-journal.ts index 9063634a1c..e6ec61f4b7 100644 --- a/packages/core/src/new-api/internal/journal/memory-journal.ts +++ b/packages/core/src/new-api/internal/journal/memory-journal.ts @@ -1,21 +1,26 @@ import { Journal, JournalableMessage } from "../../types/journal"; +import { deserializeReplacer } from "./utils/deserialize-replacer"; +import { serializeReplacer } from "./utils/serialize-replacer"; + /** * An in-memory journal. * * @beta */ - export class MemoryJournal implements Journal { private messages: string[] = []; public record(message: JournalableMessage): void { - this.messages.push(JSON.stringify(message)); + this.messages.push(JSON.stringify(message, serializeReplacer.bind(this))); } public async *read(): AsyncGenerator { for (const entry of this.messages) { - const message: JournalableMessage = JSON.parse(entry); + const message: JournalableMessage = JSON.parse( + entry, + deserializeReplacer.bind(this) + ); yield message; } diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 5dc50fcbd8..b497a1f1e8 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -2,10 +2,28 @@ import { CallFunctionStartMessage, DeployContractStartMessage, FutureStartMessage, + JournalableMessage, + OnchainCallFunctionSuccessMessage, + OnchainDeployContractSuccessMessage, + OnchainResultFailureMessage, + OnchainResultMessage, + OnchainResultSuccessMessage, + OnchainStaticCallSuccessMessage, StaticCallStartMessage, } from "../../types/journal"; import { FutureType } from "../../types/module"; +/** + * Returns true if potential is ane execution start message. + * + * @beta + */ +export function isExecutionStartMessage( + potential: JournalableMessage +): potential is FutureStartMessage { + return potential.type === "execution-start"; +} + /** * Returns true if potential is a contract deployment start message * @@ -45,3 +63,51 @@ export function isStaticCallStartMessage( ): potential is StaticCallStartMessage { return potential.futureType === FutureType.NAMED_STATIC_CALL; } + +export function isOnChainResultMessage( + message: JournalableMessage +): message is OnchainResultMessage { + return message.type === "onchain-result"; +} + +export function isOnChainSuccessMessage( + message: JournalableMessage +): message is OnchainResultSuccessMessage { + return ( + isOnchainDeployContractSuccessMessage(message) || + isOnchainCallFunctionSuccessMessage(message) || + isOnchainStaticCallSuccessMessage(message) + ); +} + +export function isOnChainFailureMessage( + message: JournalableMessage +): message is OnchainResultFailureMessage { + return isOnChainResultMessage(message) && message.subtype === "failure"; +} + +export function isOnchainDeployContractSuccessMessage( + message: JournalableMessage +): message is OnchainDeployContractSuccessMessage { + return ( + isOnChainResultMessage(message) && + message.subtype === "deploy-contract-success" + ); +} + +export function isOnchainCallFunctionSuccessMessage( + message: JournalableMessage +): message is OnchainCallFunctionSuccessMessage { + return ( + isOnChainResultMessage(message) && + message.subtype === "call-function-success" + ); +} + +export function isOnchainStaticCallSuccessMessage( + message: JournalableMessage +): message is OnchainStaticCallSuccessMessage { + return ( + isOnChainResultMessage(message) && message.subtype === "static-call-success" + ); +} diff --git a/packages/core/src/new-api/internal/wiper.ts b/packages/core/src/new-api/internal/wiper.ts new file mode 100644 index 0000000000..40dacf93bd --- /dev/null +++ b/packages/core/src/new-api/internal/wiper.ts @@ -0,0 +1,52 @@ +import { IgnitionError } from "../../errors"; +import { Journal, WipeMessage } from "../types/journal"; + +import { executionStateReducer } from "./execution/executionStateReducer"; +import { ExecutionStateMap } from "./types/execution-state"; + +export class Wiper { + constructor(private _journal: Journal) {} + + public async wipe(futureId: string) { + const previousStateMap = await this._loadExecutionStateFrom(this._journal); + + const executionState = previousStateMap[futureId]; + + if (executionState === undefined) { + throw new IgnitionError( + `Cannot wipe ${futureId} as no state recorded against it` + ); + } + + const dependents = Object.values(previousStateMap).filter((psm) => + psm.dependencies.has(futureId) + ); + + if (dependents.length > 0) { + throw new IgnitionError( + `Cannot wipe ${futureId} as there are dependent futures that have already started:\n${dependents + .map((state) => ` ${state.id}\n`) + .join()}` + ); + } + + const wipeMessage: WipeMessage = { + type: "wipe", + futureId, + }; + + return this._journal.record(wipeMessage); + } + + private async _loadExecutionStateFrom( + journal: Journal + ): Promise { + let state: ExecutionStateMap = {}; + + for await (const message of journal.read()) { + state = executionStateReducer(state, message); + } + + return state; + } +} diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts index 5a0b2766f3..29bf705643 100644 --- a/packages/core/src/new-api/types/deployer.ts +++ b/packages/core/src/new-api/types/deployer.ts @@ -7,8 +7,9 @@ import { IgnitionModule, IgnitionModuleResult } from "./module"; */ export type DeploymentResult = | DeploymentResultSuccess + | DeploymentResultFailure | { - status: "failed" | "hold"; + status: "hold"; }; /** @@ -22,6 +23,17 @@ export interface DeploymentResultSuccess { module: IgnitionModule>; } +/** + * The result of a failed deployment run (at least one future had an + * failed transaction). + * + * @beta + */ +export interface DeploymentResultFailure { + status: "failure"; + errors: { [key: string]: Error }; +} + /** * The successfully deployed contract from the deployment run. * diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 624b808e9c..58f0e4fd9b 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -16,7 +16,10 @@ export interface Journal { * * @beta */ -export type JournalableMessage = TransactionMessage | ExecutionMessage; +export type JournalableMessage = + | TransactionMessage + | ExecutionMessage + | WipeMessage; // #region "TransactionMessage" @@ -103,18 +106,24 @@ export interface StaticCallInteractionMessage { * @beta */ export type OnchainResultMessage = - | DeployContractResultMessage - | CallFunctionResultMessage - | StaticCallResultMessage; + | OnchainResultSuccessMessage + | OnchainResultFailureMessage; + +export type OnchainResultSuccessMessage = + | OnchainDeployContractSuccessMessage + | OnchainCallFunctionSuccessMessage + | OnchainStaticCallSuccessMessage; + +export type OnchainResultFailureMessage = OnchainFailureMessage; /** * A successful deploy contract transaction result. * * @beta */ -export interface DeployContractResultMessage { +export interface OnchainDeployContractSuccessMessage { type: "onchain-result"; - subtype: "deploy-contract"; + subtype: "deploy-contract-success"; futureId: string; transactionId: number; contractAddress: string; @@ -125,9 +134,9 @@ export interface DeployContractResultMessage { * * @beta */ -export interface CallFunctionResultMessage { +export interface OnchainCallFunctionSuccessMessage { type: "onchain-result"; - subtype: "call-function"; + subtype: "call-function-success"; futureId: string; transactionId: number; txId: string; @@ -138,14 +147,27 @@ export interface CallFunctionResultMessage { * * @beta */ -export interface StaticCallResultMessage { +export interface OnchainStaticCallSuccessMessage { type: "onchain-result"; - subtype: "static-call"; + subtype: "static-call-success"; futureId: string; transactionId: number; result: PrimitiveArgType | PrimitiveArgType[]; } +/** + * A failed on-chain transaction result. + * + * @beta + */ +export interface OnchainFailureMessage { + type: "onchain-result"; + subtype: "failure"; + futureId: string; + transactionId: number; + error: Error; +} + // #endregion // #endregion @@ -336,6 +358,8 @@ export interface StaticCallExecutionSuccess { */ export interface ExecutionFailure { type: "execution-failure"; + futureId: string; + error: Error; } /** @@ -351,3 +375,18 @@ export interface ExecutionHold { // #endregion // #endregion + +// #region "WipeMessage" + +/** + * A journal message indicating the user has instructed Ignition to clear + * the futures state so it can be rerun. + * + * @beta + */ +export interface WipeMessage { + type: "wipe"; + futureId: string; +} + +// #endregion diff --git a/packages/core/src/new-api/wipe.ts b/packages/core/src/new-api/wipe.ts new file mode 100644 index 0000000000..6a2c48e97d --- /dev/null +++ b/packages/core/src/new-api/wipe.ts @@ -0,0 +1,20 @@ +import path from "path"; + +import { FileJournal } from "./internal/journal/file-journal"; +import { Wiper } from "./internal/wiper"; + +/** + * Clear the state against a future within a deployment + * + * @param deploymentDir - the file directory of the deployment + * @param futureId - the future to be cleared + * + * @beta + */ +export async function wipe(deploymentDir: string, futureId: string) { + const fileJournalPath = path.join(deploymentDir, "journal.jsonl"); + + const wiper = new Wiper(new FileJournal(fileJournalPath)); + + return wiper.wipe(futureId); +} diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 29abc31369..5ebc00d179 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -558,7 +558,7 @@ describe("call", () => { await assert.isRejected( validateNamedContractCall( future as any, - setupMockArtifactResolver({} as any) + setupMockArtifactResolver({ Another: {} as any }) ), /Artifact for contract 'Another' is invalid/ ); @@ -586,10 +586,7 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedContractCall(future as any, setupMockArtifactResolver()), /Contract 'Another' doesn't have a function test/ ); }); @@ -630,10 +627,7 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedContractCall(future as any, setupMockArtifactResolver()), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -692,10 +686,7 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedContractCall(future as any, setupMockArtifactResolver()), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index e9658e9db4..4d6439fab8 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -554,7 +554,9 @@ describe("contract", () => { await assert.isRejected( validateNamedContractDeployment( future as any, - setupMockArtifactResolver({} as any) + setupMockArtifactResolver({ + Another: {} as any, + }) ), /Artifact for contract 'Another' is invalid/ ); @@ -586,7 +588,7 @@ describe("contract", () => { await assert.isRejected( validateNamedContractDeployment( future as any, - setupMockArtifactResolver(fakeArtifact) + setupMockArtifactResolver({ Test: fakeArtifact }) ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 6144eeb524..d8cccf8424 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -270,7 +270,9 @@ describe("contractAt", () => { await assert.isRejected( validateNamedContractAt( future as any, - setupMockArtifactResolver(fakeArtifact) + setupMockArtifactResolver({ + Another: fakeArtifact, + }) ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 40b4850bdb..2529e7bcec 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -629,7 +629,7 @@ describe("contractFromArtifact", () => { await assert.isRejected( validateArtifactContractDeployment( future as any, - setupMockArtifactResolver(fakeArtifact) + setupMockArtifactResolver() ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index bf5a1bb2c6..37cefd7231 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2,21 +2,52 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; -import { Batcher } from "../../../src/new-api/internal/batcher"; -import { ExecutionEngine } from "../../../src/new-api/internal/execution/execution-engine"; -import { BasicExecutionStrategy } from "../../../src/new-api/internal/execution/execution-strategy"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; -import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; -import { DeploymentLoader } from "../../../src/new-api/types/deployment-loader"; import { - Journal, - JournalableMessage, -} from "../../../src/new-api/types/journal"; -import { TransactionService } from "../../../src/new-api/types/transaction-service"; -import { exampleAccounts, setupMockArtifactResolver } from "../helpers"; + accumulateMessages, + assertDeploymentFailure, + assertDeploymentSuccess, + exampleAccounts, + setupDeployerWithMocks, +} from "../helpers"; describe("execution engine", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + const accounts = exampleAccounts; + + const contractWithThreeArgConstructorArtifact = { + abi: [ + { + type: "constructor", + stateMutability: "payable", + inputs: [ + { + name: "_first", + type: "string", + internalType: "string", + }, + { + name: "_second", + type: "string", + internalType: "string", + }, + { + name: "_third", + type: "string", + internalType: "string", + }, + ], + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + it("should execute a contract deploy", async () => { + const journal = new MemoryJournal(); + const moduleDefinition = defineModule("Module1", (m) => { const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); @@ -30,37 +61,40 @@ describe("execution engine", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); - const module = constructor.construct(moduleDefinition); - - assert.isDefined(module); - - const executionStateMap = {}; - - const batches = Batcher.batch(module, {}); + const deployer = setupDeployerWithMocks({ + journal, + artifacts: { + Contract1: contractWithThreeArgConstructorArtifact, + }, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + }, + }); - const executionEngine = new ExecutionEngine(); - const journal = new MemoryJournal(); - const accounts: string[] = exampleAccounts; - const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver({} as any); - const mockDeploymentLoader = setupMockDeploymentLoader(journal); - - const result = await executionEngine.execute({ - batches, - module, - executionStateMap, - accounts, - strategy: new BasicExecutionStrategy(), - transactionService: mockTransactionService, - artifactResolver: mockArtifactResolver, - deploymentLoader: mockDeploymentLoader, - deploymentParameters: { + const result = await deployer.deploy( + moduleDefinition, + { Module1: { supply: 2000 }, }, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, }); - assert.isDefined(result); const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ @@ -99,17 +133,99 @@ describe("execution engine", () => { }, { type: "onchain-result", - subtype: "deploy-contract", + subtype: "deploy-contract-success", futureId: "Module1:Contract1", transactionId: 1, - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, { type: "execution-success", subtype: "deploy-contract", futureId: "Module1:Contract1", contractName: "Contract1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, + }, + ]); + }); + + it("should record a reverted contract deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [], { from: account1 }); + + return { contract1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "failure", + futureId: "Module1:Contract1", + transactionId: 1, + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }, + }, + }, + }); + + const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); + + assertDeploymentFailure(result, { + "Module1:Contract1": new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + transactionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: accounts[1], + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-result", + subtype: "failure", + futureId: "Module1:Contract1", + transactionId: 1, + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }, + { + type: "execution-failure", + futureId: "Module1:Contract1", + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), }, ]); }); @@ -122,35 +238,33 @@ describe("execution engine", () => { return { library1 }; }); - const constructor = new ModuleConstructor(); - const module = constructor.construct(moduleDefinition); - - assert.isDefined(module); + const journal = new MemoryJournal(); - const executionStateMap = {}; + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + "Module1:Library1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Library1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + }, + }); - const batches = Batcher.batch(module, {}); + const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); - const executionEngine = new ExecutionEngine(); - const journal = new MemoryJournal(); - const accounts: string[] = exampleAccounts; - const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver({} as any); - const mockDeploymentLoader = setupMockDeploymentLoader(journal); - - const result = await executionEngine.execute({ - batches, - module, - executionStateMap, - accounts, - strategy: new BasicExecutionStrategy(), - transactionService: mockTransactionService, - artifactResolver: mockArtifactResolver, - deploymentLoader: mockDeploymentLoader, - deploymentParameters: {}, + assertDeploymentSuccess(result, { + "Module1:Library1": { + contractName: "Library1", + storedArtifactPath: "Module1:Library1.json", + contractAddress: exampleAddress, + }, }); - assert.isDefined(result); const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ @@ -181,17 +295,17 @@ describe("execution engine", () => { }, { type: "onchain-result", - subtype: "deploy-contract", + subtype: "deploy-contract-success", futureId: "Module1:Library1", transactionId: 1, - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, { type: "execution-success", subtype: "deploy-contract", futureId: "Module1:Library1", contractName: "Library1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, ]); }); @@ -213,35 +327,33 @@ describe("execution engine", () => { return { contract1 }; }); - const constructor = new ModuleConstructor(); - const module = constructor.construct(moduleDefinition); - - assert.isDefined(module); + const journal = new MemoryJournal(); - const executionStateMap = {}; + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + }, + }); - const batches = Batcher.batch(module, {}); + const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); - const executionEngine = new ExecutionEngine(); - const journal = new MemoryJournal(); - const accounts: string[] = exampleAccounts; - const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver(); - const mockDeploymentLoader = setupMockDeploymentLoader(journal); - - const result = await executionEngine.execute({ - batches, - module, - executionStateMap, - accounts, - strategy: new BasicExecutionStrategy(), - transactionService: mockTransactionService, - artifactResolver: mockArtifactResolver, - deploymentLoader: mockDeploymentLoader, - deploymentParameters: {}, + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + contractAddress: exampleAddress, + }, }); - assert.isDefined(result); const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual( @@ -275,17 +387,17 @@ describe("execution engine", () => { }, { type: "onchain-result", - subtype: "deploy-contract", + subtype: "deploy-contract-success", futureId: "Module1:Contract1", transactionId: 1, - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, { type: "execution-success", subtype: "deploy-contract", futureId: "Module1:Contract1", contractName: "Contract1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, ]) ) @@ -314,35 +426,51 @@ describe("execution engine", () => { return { library1, contract1 }; }); - const constructor = new ModuleConstructor(); - const module = constructor.construct(moduleDefinition); - - assert.isDefined(module); + const journal = new MemoryJournal(); - const executionStateMap = {}; + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + "Module1:Library1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Library1", + transactionId: 1, + contractAddress: differentAddress, + }, + }, + }, + }); - const batches = Batcher.batch(module, {}); + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); - const executionEngine = new ExecutionEngine(); - const journal = new MemoryJournal(); - const accounts: string[] = exampleAccounts; - const mockTransactionService = setupMockTransactionService(); - const mockArtifactResolver = setupMockArtifactResolver({} as any); - const mockDeploymentLoader = setupMockDeploymentLoader(journal); - - const result = await executionEngine.execute({ - batches, - module, - executionStateMap, - accounts, - strategy: new BasicExecutionStrategy(), - transactionService: mockTransactionService, - artifactResolver: mockArtifactResolver, - deploymentLoader: mockDeploymentLoader, - deploymentParameters: {}, + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + contractAddress: exampleAddress, + }, + "Module1:Library1": { + contractName: "Library1", + storedArtifactPath: "Module1:Library1.json", + contractAddress: differentAddress, + }, }); - assert.isDefined(result); const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ @@ -373,17 +501,17 @@ describe("execution engine", () => { }, { type: "onchain-result", - subtype: "deploy-contract", + subtype: "deploy-contract-success", futureId: "Module1:Library1", transactionId: 1, - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: differentAddress, }, { type: "execution-success", subtype: "deploy-contract", futureId: "Module1:Library1", contractName: "Library1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: differentAddress, }, { futureId: "Module1:Contract1", @@ -398,7 +526,7 @@ describe("execution engine", () => { constructorArgs: [ { arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], - nested: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + nested: differentAddress, }, ], libraries: { @@ -414,7 +542,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [ { - nested: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + nested: differentAddress, arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], }, ], @@ -424,61 +552,19 @@ describe("execution engine", () => { }, { type: "onchain-result", - subtype: "deploy-contract", + subtype: "deploy-contract-success", futureId: "Module1:Contract1", transactionId: 1, - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, { type: "execution-success", subtype: "deploy-contract", futureId: "Module1:Contract1", contractName: "Contract1", - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", + contractAddress: exampleAddress, }, ]); }); }); }); - -function setupMockTransactionService(): TransactionService { - const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; - - return { - onchain: async (message) => ({ - type: "onchain-result", - subtype: "deploy-contract", - futureId: message.futureId, - transactionId: message.transactionId, - contractAddress: exampleAddress, - }), - } as TransactionService; -} - -function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { - return { - journal, - recordDeployedAddress: async () => {}, - storeArtifact: async (futureId, _artifact) => { - return `${futureId}.json`; - }, - storeBuildInfo: async (buildInfo) => { - return `build-info-${buildInfo.id}.json`; - }, - loadArtifact: async (_storedArtifactPath) => { - throw new Error("Not implemented"); - }, - }; -} - -async function accumulateMessages( - journal: Journal -): Promise { - const messages: JournalableMessage[] = []; - - for await (const message of journal.read()) { - messages.push(message); - } - - return messages; -} diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts new file mode 100644 index 0000000000..3d05c4f792 --- /dev/null +++ b/packages/core/test/new-api/execution/restart.ts @@ -0,0 +1,118 @@ +import { defineModule } from "../../../src/new-api/define-module"; +import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; +import { Wiper } from "../../../src/new-api/internal/wiper"; +import { + assertDeploymentFailure, + assertDeploymentSuccess, + exampleAccounts, + setupDeployerWithMocks, +} from "../helpers"; + +describe("execution engine", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + describe("restart - error", () => { + const contractWithOneArgConstructorArtifact = { + abi: [ + { + type: "constructor", + stateMutability: "payable", + inputs: [ + { + name: "_first", + type: "uint256", + internalType: "uint256", + }, + ], + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + + it("should allow restart", async () => { + const firstRunModDef = defineModule("Module1", (m) => { + // Invalid constructor arg - causes revert + const contract1 = m.contract("Contract1", [0]); + + return { contract1 }; + }); + + const secondRunModDef = defineModule("Module1", (m) => { + // Valid constructor arg + const contract1 = m.contract("Contract1", [1]); + + return { contract1 }; + }); + + const journal = new MemoryJournal(); + + // Act - first run with revert on contract deploy + + const initialDeployer = setupDeployerWithMocks({ + journal, + artifacts: { + Contract1: contractWithOneArgConstructorArtifact, + }, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "failure", + futureId: "Module1:Contract1", + transactionId: 1, + error: new Error("EVM revert"), + }, + }, + }, + }); + + const firstRunResult = await initialDeployer.deploy( + firstRunModDef, + {}, + exampleAccounts + ); + + assertDeploymentFailure(firstRunResult, { + "Module1:Contract1": new Error("EVM revert"), + }); + + // Act - wipe the state for the failed future + await new Wiper(journal).wipe("Module1:Contract1"); + + // Act - rerun the deployment to success + const rerunDeployer = setupDeployerWithMocks({ + journal, + artifacts: { + Contract1: contractWithOneArgConstructorArtifact, + }, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + }, + }); + + const secondRunResult = await rerunDeployer.deploy( + secondRunModDef, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(secondRunResult, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + }); + }); +}); diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 4664e8ea7f..4e1f1da5eb 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,6 +1,20 @@ import { assert } from "chai"; -import { Artifact, ArtifactResolver, IgnitionError } from "../../src"; +import { + Artifact, + ArtifactResolver, + DeploymentResultContracts, +} from "../../src"; +import { Deployer } from "../../src/new-api/internal/deployer"; +import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; +import { DeploymentResult } from "../../src/new-api/types/deployer"; +import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; +import { + Journal, + JournalableMessage, + OnchainResultMessage, +} from "../../src/new-api/types/journal"; +import { TransactionService } from "../../src/new-api/types/transaction-service"; export const exampleAccounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", @@ -17,16 +31,34 @@ export function assertInstanceOf( assert.instanceOf(obj, klass, `Not a valid instace of ${klass.name}`); } -export function setupMockArtifactResolver( - artifact?: Artifact -): ArtifactResolver { +export function setupMockArtifactResolver(artifacts?: { + [key: string]: Artifact; +}): ArtifactResolver { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + return { - loadArtifact: async () => { + loadArtifact: async (contractName: string) => { + if (artifacts === undefined) { + return { + ...fakeArtifact, + contractName, + }; + } + + const artifact = artifacts[contractName]; + if (artifact === undefined) { - throw new IgnitionError("Not implemented"); + throw new Error( + `No artifact set in test for that contractName ${contractName}` + ); } - return artifact; + return artifacts[contractName]; }, getBuildInfo: async (_contractName: string) => { return { id: 12345 } as any; @@ -36,3 +68,111 @@ export function setupMockArtifactResolver( }, }; } + +export function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { + return { + journal, + recordDeployedAddress: async () => {}, + storeArtifact: async (futureId, _artifact) => { + return `${futureId}.json`; + }, + storeBuildInfo: async (buildInfo) => { + return `build-info-${buildInfo.id}.json`; + }, + loadArtifact: async (_storedArtifactPath) => { + throw new Error("Not implemented"); + }, + }; +} + +export function setupMockTransactionService({ + responses, +}: { + responses: { [key: string]: { [key: number]: OnchainResultMessage } }; +}): TransactionService { + return { + onchain: async (request) => { + const futureResults = responses[request.futureId]; + + if (futureResults === undefined) { + throw new Error( + `Mock transaction service has no results recorded for future ${request.futureId}` + ); + } + + const transactionResult = futureResults[request.transactionId]; + + if (transactionResult === undefined) { + throw new Error( + `Mock transaction service has no results recorded for transaction ${request.futureId}/${request.transactionId}` + ); + } + + return transactionResult; + }, + }; +} + +export function setupDeployerWithMocks({ + journal = new MemoryJournal(), + artifacts, + transactionResponses, +}: { + journal?: Journal; + artifacts?: { [key: string]: Artifact }; + transactionResponses?: { + [key: string]: { [key: number]: OnchainResultMessage }; + }; +}): Deployer { + const mockArtifactResolver = setupMockArtifactResolver(artifacts); + const mockDeploymentLoader = setupMockDeploymentLoader(journal); + const mockTransactionService = setupMockTransactionService({ + responses: transactionResponses ?? {}, + }); + + return new Deployer({ + artifactResolver: mockArtifactResolver, + deploymentLoader: mockDeploymentLoader, + transactionService: mockTransactionService, + }); +} + +export async function accumulateMessages( + journal: Journal +): Promise { + const messages: JournalableMessage[] = []; + + for await (const message of journal.read()) { + messages.push(message); + } + + return messages; +} + +export function assertDeploymentFailure( + result: DeploymentResult, + expectedErrors: { + [key: string]: Error; + } +) { + assert.isDefined(result); + + if (result.status !== "failure") { + assert.fail("result expected to be failure"); + } + + assert.deepStrictEqual(result.errors, expectedErrors); +} + +export function assertDeploymentSuccess( + result: DeploymentResult, + expectedContracts: DeploymentResultContracts +) { + assert.isDefined(result); + + if (result.status !== "success") { + assert.fail("result expected to be success"); + } + + assert.deepStrictEqual(result.contracts, expectedContracts); +} diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 26529361ba..3278770f01 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -311,7 +311,7 @@ describe("library", () => { await assert.isRejected( validateNamedLibraryDeployment( future as any, - setupMockArtifactResolver({} as any) + setupMockArtifactResolver({ Another: {} as any }) ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 7df54b0d3f..9222625227 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -235,7 +235,7 @@ describe("Read event argument", () => { await assert.isRejected( validateReadEventArgument( future as any, - setupMockArtifactResolver({} as any) + setupMockArtifactResolver({ Another: {} as any }) ), /Artifact for contract 'Another' is invalid/ ); @@ -263,10 +263,7 @@ describe("Read event argument", () => { ); await assert.isRejected( - validateReadEventArgument( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateReadEventArgument(future as any, setupMockArtifactResolver()), /Contract 'Another' doesn't have an event test/ ); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 7bc3272dc6..7c72ac4184 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -544,7 +544,7 @@ describe("static call", () => { await assert.isRejected( validateNamedStaticCall( future as any, - setupMockArtifactResolver({} as any) + setupMockArtifactResolver({ Another: {} as any }) ), /Artifact for contract 'Another' is invalid/ ); @@ -572,10 +572,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedStaticCall(future as any, setupMockArtifactResolver()), /Contract 'Another' doesn't have a function test/ ); }); @@ -616,10 +613,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedStaticCall(future as any, setupMockArtifactResolver()), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -678,10 +672,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedStaticCall(future as any, setupMockArtifactResolver()), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); @@ -722,10 +713,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver(fakeArtifact) - ), + validateNamedStaticCall(future as any, setupMockArtifactResolver()), /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ ); }); diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts new file mode 100644 index 0000000000..70bf3b0e74 --- /dev/null +++ b/packages/core/test/new-api/wipe.ts @@ -0,0 +1,89 @@ +import { assert } from "chai"; + +import { defineModule } from "../../src/new-api/define-module"; +import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; +import { Wiper } from "../../src/new-api/internal/wiper"; +import { Journal } from "../../src/new-api/types/journal"; +import { IgnitionModuleResult } from "../../src/new-api/types/module"; +import { IgnitionModuleDefinition } from "../../src/new-api/types/module-builder"; + +import { + accumulateMessages, + exampleAccounts, + setupDeployerWithMocks, +} from "./helpers"; + +describe("wipe", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + let journal: Journal; + let moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >; + let wiper: Wiper; + + beforeEach(async () => { + journal = new MemoryJournal(); + wiper = new Wiper(journal); + + moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contract("Contract1", [], { after: [] }); + const contract2 = m.contract("Contract2", [], { after: [contract1] }); + const contract3 = m.contract("Contract3", [], { after: [contract2] }); + + return { contract1, contract2, contract3 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + "Module1:Contract1": { + 1: { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + transactionId: 1, + contractAddress: exampleAddress, + }, + }, + "Module1:Contract2": { + 1: { + type: "onchain-result", + subtype: "failure", + futureId: "Module1:Contract1", + transactionId: 1, + error: new Error("EVM revert"), + }, + }, + }, + }); + + await deployer.deploy(moduleDefinition, {}, exampleAccounts); + }); + + it("should allow wiping of future", async () => { + await wiper.wipe("Module1:Contract2"); + + const messages = await accumulateMessages(journal); + + assert.deepStrictEqual(messages[messages.length - 1], { + futureId: "Module1:Contract2", + type: "wipe", + }); + }); + + it("should error if the future id doesn't exist", async () => { + await assert.isRejected( + wiper.wipe("Module1:Nonexistant"), + "Cannot wipe Module1:Nonexistant as no state recorded against it" + ); + }); + + it("should error if other futures are depenent on the future being wiped", async () => { + await assert.isRejected( + wiper.wipe("Module1:Contract1"), + "Cannot wipe Module1:Contract1 as there are dependent futures that have already started:\n Module1:Contract2" + ); + }); +}); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index cbb25dd80b..160deb9d83 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -4,6 +4,7 @@ import { ModuleConstructor, ModuleDict, ModuleParams, + wipe, } from "@ignored/ignition-core"; import "@nomiclabs/hardhat-ethers"; import { BigNumber } from "ethers"; @@ -284,20 +285,29 @@ task("deploy2") ] of Object.entries(result.contracts)) { console.log(`${contractName} (${futureId}) - ${contractAddress}`); } - } else if (result.status === "failed") { + } else if (result.status === "failure") { console.log("Deployment failed"); + console.log(""); + + for (const [futureId, error] of Object.entries(result.errors)) { + const errorMessage = + "reason" in error ? (error.reason as string) : error.message; + + console.log(`Future ${futureId} failed: ${errorMessage}`); + } } else if (result.status === "hold") { console.log("Deployment held"); } } catch (err) { - if (DISPLAY_UI) { - // display of error or on hold is done - // based on state, thrown error display - // can be ignored - process.exit(1); - } else { - throw err; - } + // TODO: bring back cli ui + // if (DISPLAY_UI) { + // // display of error or on hold is done + // // based on state, thrown error display + // // can be ignored + // process.exit(1); + // } else { + throw err; + // } } } ); @@ -436,6 +446,30 @@ task("ignition-info2") } ); +task("wipe") + .addParam("deployment") + .addParam("future") + .setDescription("Reset a deployments future to allow rerunning") + .setAction( + async ( + { + deployment: deploymentId, + future: futureId, + }: { deployment: string; future: string }, + hre + ) => { + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + await wipe(deploymentDir, futureId); + + console.log(`${futureId} state has been cleared`); + } + ); + function resolveParametersFromModuleName( moduleName: string, ignitionPath: string From c5876e7c0635925f475b79ec625f6e6e7ad479ad Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 28 Jun 2023 19:12:46 -0400 Subject: [PATCH 0515/1302] add execution logic for readEventArgument --- .../internal/execution/execution-engine.ts | 48 ++++++++-- .../internal/execution/execution-strategy.ts | 56 +++++++++-- .../execution/executionStateReducer.ts | 47 ++++++++-- .../src/new-api/internal/execution/guards.ts | 7 ++ .../transactions/chain-dispatcher.ts | 8 ++ .../transactions/transaction-service.ts | 92 ++++++++++++++++++- .../new-api/internal/journal/type-guards.ts | 14 ++- .../futures/reconcileReadEventArgument.ts | 4 +- .../new-api/internal/types/execution-state.ts | 5 +- packages/core/src/new-api/types/adapters.ts | 3 + packages/core/src/new-api/types/journal.ts | 84 +++++++++++++++-- packages/core/src/new-api/types/module.ts | 12 +-- .../hardhat-plugin/src/buildAdaptersFrom.ts | 5 + 13 files changed, 343 insertions(+), 42 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index e5e32fe7de..7e2bb72047 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -331,7 +331,7 @@ export class ExecutionEngine { assertIgnitionInvariant( contractAddress !== undefined, - "internal error - call executed before contract dependency" + `Internal error - dependency ${future.contract.id} used before it's resolved` ); state = { @@ -356,11 +356,10 @@ export class ExecutionEngine { future.contract.id ] as DeploymentExecutionState; - if (contractAddress === undefined) { - throw new Error( - "internal error - call executed before contract dependency" - ); - } + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.contract.id} used before it's resolved` + ); state = { type: "execution-start", @@ -378,9 +377,44 @@ export class ExecutionEngine { }; return state; } + case FutureType.READ_EVENT_ARGUMENT: { + const { contractAddress, storedArtifactPath } = executionStateMap[ + future.emitter.id + ] as DeploymentExecutionState; + + const { txId } = executionStateMap[ + future.futureToReadFrom.id + ] as DeploymentExecutionState; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.emitter.id} used before it's resolved` + ); + + assertIgnitionInvariant( + txId !== undefined, + `Internal error - dependency ${future.futureToReadFrom.id} used before it's resolved` + ); + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + storedArtifactPath, + eventName: future.eventName, + argumentName: future.argumentName, + txToReadFrom: txId, + emitterAddress: contractAddress, + eventIndex: future.eventIndex, + }; + return state; + } case FutureType.NAMED_CONTRACT_AT: case FutureType.ARTIFACT_CONTRACT_AT: - case FutureType.READ_EVENT_ARGUMENT: case FutureType.SEND_DATA: { throw new Error(`Not implemented yet: FutureType ${future.type}`); } diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index be73b19bff..600d8f4c98 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -8,14 +8,18 @@ import { OnchainCallFunctionSuccessMessage, OnchainDeployContractSuccessMessage, OnchainInteractionMessage, + OnchainReadEventArgumentSuccessMessage, OnchainResultMessage, OnchainStaticCallSuccessMessage, + ReadEventArgumentExecutionSuccess, + ReadEventArgumentInteractionMessage, StaticCallExecutionSuccess, StaticCallInteractionMessage, } from "../../types/journal"; import { isCallExecutionState, isDeploymentExecutionState, + isReadEventArgumentExecutionState, isStaticCallExecutionState, } from "../type-guards"; import { ExecutionStrategy } from "../types/execution-engine"; @@ -23,6 +27,7 @@ import { CallExecutionState, DeploymentExecutionState, ExecutionState, + ReadEventArgumentExecutionState, StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -56,6 +61,10 @@ export class BasicExecutionStrategy return this._executeStaticCall({ executionState, sender }); } + if (isReadEventArgumentExecutionState(executionState)) { + return this._executeReadEventArgument({ executionState }); + } + throw new IgnitionError( "Basic strategy not implemented that execution state yet" ); @@ -93,15 +102,14 @@ export class BasicExecutionStrategy throw new IgnitionError("No result yielded"); } - const success: DeployedContractExecutionSuccess = { + return { type: "execution-success", subtype: "deploy-contract", futureId: deploymentExecutionState.id, contractName: deploymentExecutionState.contractName, contractAddress: result.contractAddress, + txId: result.txId, }; - - return success; } private async *_executeCall({ @@ -137,7 +145,7 @@ export class BasicExecutionStrategy throw new IgnitionError("No result yielded"); } - const success: CalledFunctionExecutionSuccess = { + return { type: "execution-success", subtype: "call-function", futureId: callExecutionState.id, @@ -145,8 +153,6 @@ export class BasicExecutionStrategy functionName: callExecutionState.functionName, txId: result.txId, }; - - return success; } private async *_executeStaticCall({ @@ -181,7 +187,7 @@ export class BasicExecutionStrategy throw new IgnitionError("No result yielded"); } - const success: StaticCallExecutionSuccess = { + return { type: "execution-success", subtype: "static-call", futureId: staticCallExecutionState.id, @@ -189,7 +195,41 @@ export class BasicExecutionStrategy functionName: staticCallExecutionState.functionName, result: result.result, }; + } - return success; + private async *_executeReadEventArgument({ + executionState: readEventArgExecutionState, + }: { + executionState: ReadEventArgumentExecutionState; + }): AsyncGenerator< + ReadEventArgumentInteractionMessage, + ReadEventArgumentExecutionSuccess, + OnchainReadEventArgumentSuccessMessage | null + > { + const result = yield { + type: "onchain-action", + subtype: "read-event-arg", + futureId: readEventArgExecutionState.id, + transactionId: 1, + storedArtifactPath: readEventArgExecutionState.storedArtifactPath, + eventName: readEventArgExecutionState.eventName, + argumentName: readEventArgExecutionState.argumentName, + txToReadFrom: readEventArgExecutionState.txToReadFrom, + emitterAddress: readEventArgExecutionState.emitterAddress, + eventIndex: readEventArgExecutionState.eventIndex, + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + return { + type: "execution-success", + subtype: "read-event-arg", + futureId: readEventArgExecutionState.id, + eventName: readEventArgExecutionState.eventName, + argumentName: readEventArgExecutionState.argumentName, + result: result.result, + }; } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index c48e3327e7..485692bad6 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -3,6 +3,7 @@ import { isCallFunctionStartMessage, isDeployContractStartMessage, isExecutionStartMessage, + isReadEventArgumentStartMessage, isStaticCallStartMessage, } from "../journal/type-guards"; import { @@ -11,6 +12,7 @@ import { ExecutionState, ExecutionStateMap, ExecutionStatus, + ReadEventArgumentExecutionState, StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -34,6 +36,7 @@ export function executionStateReducer( ...(previousDeploymentExecutionState as DeploymentExecutionState), status: ExecutionStatus.SUCCESS, contractAddress: action.contractAddress, + txId: action.txId, }; return { @@ -68,6 +71,19 @@ export function executionStateReducer( }; } + if (action.subtype === "read-event-arg") { + const updatedExecutionState: ReadEventArgumentExecutionState = { + ...(previousDeploymentExecutionState as ReadEventArgumentExecutionState), + status: ExecutionStatus.SUCCESS, + result: action.result, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + throw new Error( "TBD - only deployment and call states are currently implemented for execution success" ); @@ -109,7 +125,7 @@ function initialiseExecutionStateFor( futureStart: FutureStartMessage ): ExecutionState { if (isDeployContractStartMessage(futureStart)) { - const deploymentExecutionState: DeploymentExecutionState = { + const executionState: DeploymentExecutionState = { id: futureStart.futureId, futureType: futureStart.futureType, strategy: futureStart.strategy, @@ -125,11 +141,11 @@ function initialiseExecutionStateFor( from: futureStart.from, }; - return deploymentExecutionState; + return executionState; } if (isCallFunctionStartMessage(futureStart)) { - const callExecutionState: CallExecutionState = { + const executionState: CallExecutionState = { id: futureStart.futureId, futureType: futureStart.futureType, strategy: futureStart.strategy, @@ -144,11 +160,11 @@ function initialiseExecutionStateFor( value: BigInt(futureStart.value), }; - return callExecutionState; + return executionState; } if (isStaticCallStartMessage(futureStart)) { - const callExecutionState: StaticCallExecutionState = { + const executionState: StaticCallExecutionState = { id: futureStart.futureId, futureType: futureStart.futureType, strategy: futureStart.strategy, @@ -162,7 +178,26 @@ function initialiseExecutionStateFor( functionName: futureStart.functionName, }; - return callExecutionState; + return executionState; + } + + if (isReadEventArgumentStartMessage(futureStart)) { + const executionState: ReadEventArgumentExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + storedArtifactPath: futureStart.storedArtifactPath, + eventName: futureStart.eventName, + argumentName: futureStart.argumentName, + txToReadFrom: futureStart.txToReadFrom, + emitterAddress: futureStart.emitterAddress, + eventIndex: futureStart.eventIndex, + }; + + return executionState; } throw new Error("Not implemented yet in the reducer"); diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index a84a5dc762..e67c2ff822 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -8,6 +8,7 @@ import { ExecutionSuccess, JournalableMessage, OnchainInteractionMessage, + ReadEventArgumentInteractionMessage, StaticCallInteractionMessage, } from "../../types/journal"; @@ -73,6 +74,12 @@ export function isStaticCallInteraction( return isOnChainAction(potential) && potential.subtype === "static-call"; } +export function isReadEventArgumentInteraction( + potential: JournalableMessage +): potential is ReadEventArgumentInteractionMessage { + return isOnChainAction(potential) && potential.subtype === "read-event-arg"; +} + export function isDeployedContractExecutionSuccess( potential: JournalableMessage ): potential is DeployedContractExecutionSuccess { diff --git a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts index 2edb03e996..6679541ccb 100644 --- a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts @@ -20,6 +20,7 @@ export interface ChainDispatcher { tx: ethers.providers.TransactionRequest, signer: ethers.Signer ): Promise; + getTxReceipt(txHash: string): Promise; } /** @@ -66,6 +67,7 @@ export class EthersChainDispatcher implements ChainDispatcher { return { type: "transaction-success", contractAddress: receipt.contractAddress, + txId: receipt.transactionHash, }; } catch (error) { return { @@ -77,4 +79,10 @@ export class EthersChainDispatcher implements ChainDispatcher { }; } } + + public async getTxReceipt( + txHash: string + ): Promise { + return this._transactionProvider.getTransactionReceipt(txHash); + } } diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 122cea33fe..7b5faaf774 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -6,10 +6,14 @@ import { DeploymentLoader } from "../../../types/deployment-loader"; import { CallFunctionInteractionMessage, DeployContractInteractionMessage, + OnchainCallFunctionSuccessMessage, OnchainDeployContractSuccessMessage, OnchainFailureMessage, OnchainInteractionMessage, + OnchainReadEventArgumentSuccessMessage, OnchainResultMessage, + OnchainStaticCallSuccessMessage, + ReadEventArgumentInteractionMessage, StaticCallInteractionMessage, } from "../../../types/journal"; import { @@ -21,6 +25,7 @@ import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { isCallFunctionInteraction, isDeployContractInteraction, + isReadEventArgumentInteraction, isStaticCallInteraction, } from "../guards"; @@ -54,6 +59,10 @@ export class TransactionServiceImplementation implements TransactionService { return this._dispatchStaticCall(interaction); } + if (isReadEventArgumentInteraction(interaction)) { + return this._dispatchReadEventArgument(interaction); + } + throw new IgnitionError( "Transaction service not implemented for this interaction" ); @@ -89,12 +98,18 @@ export class TransactionServiceImplementation implements TransactionService { "Contract address not available on receipt" ); + assertIgnitionInvariant( + result.txId !== undefined, + "Transaction hash not available on receipt" + ); + return { type: "onchain-result", subtype: "deploy-contract-success", futureId: deployContractInteraction.futureId, transactionId: deployContractInteraction.transactionId, contractAddress: result.contractAddress, + txId: result.txId, }; } else { return { @@ -116,7 +131,9 @@ export class TransactionServiceImplementation implements TransactionService { contractAddress, value, storedArtifactPath, - }: CallFunctionInteractionMessage): Promise { + }: CallFunctionInteractionMessage): Promise< + OnchainCallFunctionSuccessMessage | OnchainFailureMessage + > { const artifact = await this._deploymentLoader.loadArtifact( storedArtifactPath ); @@ -168,7 +185,9 @@ export class TransactionServiceImplementation implements TransactionService { functionName, contractAddress, storedArtifactPath, - }: StaticCallInteractionMessage): Promise { + }: StaticCallInteractionMessage): Promise< + OnchainStaticCallSuccessMessage | OnchainFailureMessage + > { const artifact = await this._deploymentLoader.loadArtifact( storedArtifactPath ); @@ -211,4 +230,73 @@ export class TransactionServiceImplementation implements TransactionService { }; } } + + private async _dispatchReadEventArgument({ + futureId, + transactionId, + storedArtifactPath, + eventName, + argumentName, + txToReadFrom, + emitterAddress, + eventIndex, + }: ReadEventArgumentInteractionMessage): Promise< + OnchainReadEventArgumentSuccessMessage | OnchainFailureMessage + > { + const artifact = await this._deploymentLoader.loadArtifact( + storedArtifactPath + ); + + try { + const contract = new Contract(emitterAddress, artifact.abi); + const filter = contract.filters[eventName](); + const eventNameTopic = filter.topics?.[0]; + + assertIgnitionInvariant( + eventNameTopic !== undefined, + "Unknown event name" + ); + + const { logs } = await this._chainDispatcher.getTxReceipt(txToReadFrom); + + // only keep the requested eventName and ensure they're from the emitter + const events = logs.filter( + (log) => + log.address === filter.address && log.topics[0] === eventNameTopic + ); + + // sanity check to ensure the eventIndex isn't out of range + if (events.length > 1 && eventIndex >= events.length) { + throw new Error( + `Given eventIndex '${eventIndex}' exceeds number of events emitted '${events.length}'` + ); + } + + // this works in combination with the check above + // because we default eventIndex to 0 if not set by user + const eventLog = events[eventIndex]; + + // parse the event through the emitter ABI and return the requested arg + const result = contract.interface.parseLog(eventLog).args[argumentName]; + + return { + type: "onchain-result", + subtype: "read-event-arg-success", + futureId, + transactionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId, + transactionId, + error: + error instanceof Error + ? error + : new Error("Unknown read event arg error"), + }; + } + } } diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index b497a1f1e8..fd766e4577 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -9,6 +9,7 @@ import { OnchainResultMessage, OnchainResultSuccessMessage, OnchainStaticCallSuccessMessage, + ReadEventArgumentStartMessage, StaticCallStartMessage, } from "../../types/journal"; import { FutureType } from "../../types/module"; @@ -54,7 +55,7 @@ export function isCallFunctionStartMessage( } /** - * Returns true if potential is a call function start message + * Returns true if potential is a call static function start message * * @beta */ @@ -64,6 +65,17 @@ export function isStaticCallStartMessage( return potential.futureType === FutureType.NAMED_STATIC_CALL; } +/** + * Returns true if potential is a read event argument start message + * + * @beta + */ +export function isReadEventArgumentStartMessage( + potential: FutureStartMessage +): potential is ReadEventArgumentStartMessage { + return potential.futureType === FutureType.READ_EVENT_ARGUMENT; +} + export function isOnChainResultMessage( message: JournalableMessage ): message is OnchainResultMessage { diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts index c5a0e79ae9..a0d9108cd5 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileReadEventArgument.ts @@ -36,10 +36,10 @@ export function reconcileReadEventArgument( context ); - if (resolvedEmitterAddress !== executionState.emitter) { + if (resolvedEmitterAddress !== executionState.emitterAddress) { return fail( future, - `Emitter has been changed from ${executionState.emitter} to ${resolvedEmitterAddress}` + `Emitter has been changed from ${executionState.emitterAddress} to ${resolvedEmitterAddress}` ); } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 3c7507e132..75676809c7 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -131,6 +131,7 @@ export interface DeploymentExecutionState value: bigint; from: string | undefined; contractAddress?: string; // The result + txId?: string; // also stored after success for use when reading events } export interface CallExecutionState @@ -164,10 +165,12 @@ export interface ContractAtExecutionState export interface ReadEventArgumentExecutionState extends BaseExecutionState { + storedArtifactPath: string; // As stored in the deployment directory. eventName: string; argumentName: string; + txToReadFrom: string; + emitterAddress: string; eventIndex: number; - emitter: string; result?: SolidityParameterType; } diff --git a/packages/core/src/new-api/types/adapters.ts b/packages/core/src/new-api/types/adapters.ts index e59de3893a..47cbc921e0 100644 --- a/packages/core/src/new-api/types/adapters.ts +++ b/packages/core/src/new-api/types/adapters.ts @@ -39,4 +39,7 @@ export interface GasAdapter { */ export interface TransactionsAdapter { wait(txHash: string): Promise; + getTransactionReceipt( + txHash: string + ): Promise; } diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 58f0e4fd9b..8b10163f35 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -1,4 +1,4 @@ -import { ArgumentType, FutureType, PrimitiveArgType } from "./module"; +import { ArgumentType, FutureType, SolidityParameterType } from "./module"; /** * Store a deployments execution state as a transaction log. @@ -42,7 +42,8 @@ export type TransactionMessage = export type OnchainInteractionMessage = | DeployContractInteractionMessage | CallFunctionInteractionMessage - | StaticCallInteractionMessage; + | StaticCallInteractionMessage + | ReadEventArgumentInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. @@ -96,6 +97,24 @@ export interface StaticCallInteractionMessage { from: string; } +/** + * A on-chain interaction request to read an event argument. + * + * @beta + */ +export interface ReadEventArgumentInteractionMessage { + type: "onchain-action"; + subtype: "read-event-arg"; + futureId: string; + transactionId: number; + storedArtifactPath: string; + eventName: string; + argumentName: string; + txToReadFrom: string; + emitterAddress: string; + eventIndex: number; +} + // #endregion // #region "OnchainResult" @@ -112,7 +131,8 @@ export type OnchainResultMessage = export type OnchainResultSuccessMessage = | OnchainDeployContractSuccessMessage | OnchainCallFunctionSuccessMessage - | OnchainStaticCallSuccessMessage; + | OnchainStaticCallSuccessMessage + | OnchainReadEventArgumentSuccessMessage; export type OnchainResultFailureMessage = OnchainFailureMessage; @@ -127,6 +147,7 @@ export interface OnchainDeployContractSuccessMessage { futureId: string; transactionId: number; contractAddress: string; + txId: string; } /** @@ -152,7 +173,20 @@ export interface OnchainStaticCallSuccessMessage { subtype: "static-call-success"; futureId: string; transactionId: number; - result: PrimitiveArgType | PrimitiveArgType[]; + result: SolidityParameterType; +} + +/** + * A successful read event argument result. + * + * @beta + */ +export interface OnchainReadEventArgumentSuccessMessage { + type: "onchain-result"; + subtype: "read-event-arg-success"; + futureId: string; + transactionId: number; + result: SolidityParameterType; } /** @@ -198,7 +232,8 @@ export type ExecutionUpdateMessage = FutureStartMessage | FutureRestartMessage; export type FutureStartMessage = | DeployContractStartMessage | CallFunctionStartMessage - | StaticCallStartMessage; + | StaticCallStartMessage + | ReadEventArgumentStartMessage; /** * A journal message to initialise the execution state for a contract deployment. @@ -261,6 +296,25 @@ export interface StaticCallStartMessage { from: string; } +/** + * A journal message to initialise the execution state for reading an event argument. + * + * @beta + */ +export interface ReadEventArgumentStartMessage { + type: "execution-start"; + futureId: string; + futureType: FutureType.READ_EVENT_ARGUMENT; + strategy: string; + dependencies: string[]; + storedArtifactPath: string; + eventName: string; + argumentName: string; + txToReadFrom: string; + emitterAddress: string; + eventIndex: number; +} + /** * A journal message to indicate a future is being restarted. * @@ -306,7 +360,8 @@ export type ExecutionResultTypes = [ export type ExecutionSuccess = | DeployedContractExecutionSuccess | CalledFunctionExecutionSuccess - | StaticCallExecutionSuccess; + | StaticCallExecutionSuccess + | ReadEventArgumentExecutionSuccess; /** * A journal message indicating a contract/library deployed successfully. @@ -319,6 +374,7 @@ export interface DeployedContractExecutionSuccess { futureId: string; contractName: string; contractAddress: string; + txId: string; } /** @@ -345,10 +401,24 @@ export interface StaticCallExecutionSuccess { subtype: "static-call"; futureId: string; functionName: string; - result: PrimitiveArgType | PrimitiveArgType[]; + result: SolidityParameterType; contractAddress: string; } +/** + * A journal message indicating an event argument was read successfully. + * + * @beta + */ +export interface ReadEventArgumentExecutionSuccess { + type: "execution-success"; + subtype: "read-event-arg"; + futureId: string; + eventName: string; + argumentName: string; + result: SolidityParameterType; +} + // #endregion /** diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 364d612087..0b4308cd27 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -1,12 +1,5 @@ import { Artifact } from "./artifact"; -/** - * Argument type representing primitive values expressed in smart contracts. - * - * @beta - */ -export type PrimitiveArgType = number | bigint | string | boolean; - /** * Base argument type that smart contracts can receive in their constructors * and functions. @@ -14,7 +7,10 @@ export type PrimitiveArgType = number | bigint | string | boolean; * @beta */ export type BaseArgumentType = - | PrimitiveArgType + | number + | bigint + | string + | boolean | ContractFuture | NamedStaticCallFuture | ReadEventArgumentFuture diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/buildAdaptersFrom.ts index 34f7b672d1..36d9a64ab4 100644 --- a/packages/hardhat-plugin/src/buildAdaptersFrom.ts +++ b/packages/hardhat-plugin/src/buildAdaptersFrom.ts @@ -26,6 +26,11 @@ export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { async wait(txHash: string): Promise { return hre.ethers.provider.waitForTransaction(txHash); }, + async getTransactionReceipt( + txHash: string + ): Promise { + return hre.ethers.provider.getTransactionReceipt(txHash); + }, }; const adapters: Adapters = { From 522320eb99dc298b9f81c3d3d4a4cc8b68c58529 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 28 Jun 2023 19:25:49 -0400 Subject: [PATCH 0516/1302] fix existing tests --- .../test/new-api/execution/execution-engine.ts | 16 ++++++++++++++++ packages/core/test/new-api/execution/restart.ts | 2 ++ .../futures/reconcileReadEventArgument.ts | 12 ++++++++---- packages/core/test/new-api/wipe.ts | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 37cefd7231..e5f5e8c9dc 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -15,6 +15,7 @@ describe("execution engine", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; const accounts = exampleAccounts; + const txId = "0x123"; const contractWithThreeArgConstructorArtifact = { abi: [ @@ -74,6 +75,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, }, @@ -137,6 +139,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, { type: "execution-success", @@ -144,6 +147,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", contractName: "Contract1", contractAddress: exampleAddress, + txId, }, ]); }); @@ -250,6 +254,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, }, @@ -299,6 +304,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", transactionId: 1, contractAddress: exampleAddress, + txId, }, { type: "execution-success", @@ -306,6 +312,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", contractName: "Library1", contractAddress: exampleAddress, + txId, }, ]); }); @@ -339,6 +346,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, }, @@ -391,6 +399,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, { type: "execution-success", @@ -398,6 +407,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", contractName: "Contract1", contractAddress: exampleAddress, + txId, }, ]) ) @@ -438,6 +448,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, "Module1:Library1": { @@ -447,6 +458,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", transactionId: 1, contractAddress: differentAddress, + txId, }, }, }, @@ -505,6 +517,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", transactionId: 1, contractAddress: differentAddress, + txId, }, { type: "execution-success", @@ -512,6 +525,7 @@ describe("execution engine", () => { futureId: "Module1:Library1", contractName: "Library1", contractAddress: differentAddress, + txId, }, { futureId: "Module1:Contract1", @@ -556,6 +570,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, { type: "execution-success", @@ -563,6 +578,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", contractName: "Contract1", contractAddress: exampleAddress, + txId, }, ]); }); diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index 3d05c4f792..862c88405b 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -10,6 +10,7 @@ import { describe("execution engine", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const txId = "0x123"; describe("restart - error", () => { const contractWithOneArgConstructorArtifact = { @@ -95,6 +96,7 @@ describe("execution engine", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, }, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 0c341f7e44..9db1ca7660 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -13,6 +13,7 @@ import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - read event argument", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + const txId = "0x123"; const exampleReadArgState: ReadEventArgumentExecutionState = { id: "Example", @@ -21,10 +22,12 @@ describe("Reconciliation - read event argument", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + storedArtifactPath: "./artifact.json", eventName: "event1", argumentName: "argument1", eventIndex: 0, - emitter: exampleAddress, + emitterAddress: exampleAddress, + txToReadFrom: txId, }; const exampleDeploymentState: DeploymentExecutionState = { @@ -41,6 +44,7 @@ describe("Reconciliation - read event argument", () => { constructorArgs: [], libraries: {}, from: exampleAccounts[0], + txId, }; it("should reconcile unchanged", () => { @@ -211,7 +215,7 @@ describe("Reconciliation - read event argument", () => { "Module:ReadEvent": { ...exampleReadArgState, status: ExecutionStatus.STARTED, - emitter: exampleAddress, + emitterAddress: exampleAddress, }, }); @@ -258,7 +262,7 @@ describe("Reconciliation - read event argument", () => { dependencies: new Set(["Module:Contract1"]), eventName: "event1", argumentName: "argument1", - emitter: exampleAddress, + emitterAddress: exampleAddress, result: "first", }, "Module:ReadEvent2": { @@ -267,7 +271,7 @@ describe("Reconciliation - read event argument", () => { dependencies: new Set(["Module:Contract1"]), eventName: "event2", argumentName: "argument2", - emitter: exampleAddress, + emitterAddress: exampleAddress, result: "second", }, "Module:Contract2": { diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index 70bf3b0e74..946f1921cd 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -15,6 +15,7 @@ import { describe("wipe", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const txId = "0x123"; let journal: Journal; let moduleDefinition: IgnitionModuleDefinition< string, @@ -45,6 +46,7 @@ describe("wipe", () => { futureId: "Module1:Contract1", transactionId: 1, contractAddress: exampleAddress, + txId, }, }, "Module1:Contract2": { From cb47cd96bc101297d3d2ad8615eb355c533df5fd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 28 Jun 2023 20:21:31 -0400 Subject: [PATCH 0517/1302] correctly resolve args --- examples/complete/ignition/CompleteModule.js | 6 ++-- .../internal/execution/execution-engine.ts | 28 ++++++++++++++----- .../transactions/transaction-service.ts | 4 ++- .../new-api/internal/journal/type-guards.ts | 13 ++++++++- 4 files changed, 39 insertions(+), 12 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index c009bdf8ef..3e92ea5647 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -19,9 +19,9 @@ module.exports = defineModule("CompleteModule", (m) => { } ); - m.call(basic, "basicFunction", [40]); - // const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); - m.staticCall(withLib, "readonlyFunction", [42]); + const call = m.call(basic, "basicFunction", [40]); + const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); + m.staticCall(withLib, "readonlyFunction", [eventArg]); // const duplicate = m.contractAt("BasicContract", basic); // const duplicateWithLib = m.contractAtFromArtifact( diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 7e2bb72047..6162228c9c 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -124,10 +124,12 @@ export class ExecutionEngine { const deployedContracts = this._resolveDeployedContractsFrom(state); const libraries = Object.fromEntries( - dependencies.map((id) => { - const lib = deployedContracts[id]; - return [lib.contractName, lib.contractAddress]; - }) + dependencies + .filter((id) => deployedContracts[id] !== undefined) + .map((id) => { + const lib = deployedContracts[id]; + return [lib.contractName, lib.contractAddress]; + }) ); while (!isExecutionResultMessage(current)) { @@ -234,7 +236,11 @@ export class ExecutionEngine { storedBuildInfoPath: undefined, contractName: future.contractName, value: future.value.toString(), - constructorArgs: future.constructorArgs, + constructorArgs: this._resolveArgs(future.constructorArgs, { + accounts, + deploymentParameters, + executionStateMap, + }), libraries: Object.fromEntries( Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) ), @@ -342,7 +348,11 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - args: future.args, + args: this._resolveArgs(future.args, { + accounts, + deploymentParameters, + executionStateMap, + }), functionName: future.functionName, contractAddress, storedArtifactPath, @@ -369,7 +379,11 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - args: future.args, + args: this._resolveArgs(future.args, { + accounts, + deploymentParameters, + executionStateMap, + }), functionName: future.functionName, contractAddress, storedArtifactPath, diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 7b5faaf774..91abf1971f 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -284,7 +284,9 @@ export class TransactionServiceImplementation implements TransactionService { subtype: "read-event-arg-success", futureId, transactionId, - result, + result: ethers.BigNumber.isBigNumber(result) + ? result.toString() + : result, }; } catch (error) { return { diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index fd766e4577..5c868ea40f 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -5,6 +5,7 @@ import { JournalableMessage, OnchainCallFunctionSuccessMessage, OnchainDeployContractSuccessMessage, + OnchainReadEventArgumentSuccessMessage, OnchainResultFailureMessage, OnchainResultMessage, OnchainResultSuccessMessage, @@ -88,7 +89,8 @@ export function isOnChainSuccessMessage( return ( isOnchainDeployContractSuccessMessage(message) || isOnchainCallFunctionSuccessMessage(message) || - isOnchainStaticCallSuccessMessage(message) + isOnchainStaticCallSuccessMessage(message) || + isOnchainReadEventArgumentSuccessMessage(message) ); } @@ -123,3 +125,12 @@ export function isOnchainStaticCallSuccessMessage( isOnChainResultMessage(message) && message.subtype === "static-call-success" ); } + +export function isOnchainReadEventArgumentSuccessMessage( + message: JournalableMessage +): message is OnchainReadEventArgumentSuccessMessage { + return ( + isOnChainResultMessage(message) && + message.subtype === "read-event-arg-success" + ); +} From e4e43c4f1b11c0cfbac27e56a9c4323077612896 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 29 Jun 2023 11:58:26 -0400 Subject: [PATCH 0518/1302] adjust address resolution for event interactions --- .../new-api/internal/reconciliation/execution-state-resolver.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts index a91fa83ef9..5b5f77ac5c 100644 --- a/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts +++ b/packages/core/src/new-api/internal/reconciliation/execution-state-resolver.ts @@ -228,7 +228,7 @@ export class ExecutionStateResolver { const senders = executionState.history .filter(isOnchainInteractionMessage) - .map((m) => m.from); + .map((m) => ("from" in m ? m.from : undefined)); if (senders.length > 0) { return senders[0]; From fb4f146d0edf65c57ef40ce948121332fdcc2941 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Jul 2023 21:10:45 +0100 Subject: [PATCH 0519/1302] chore: adding todos to capture further enhancements --- .../core/src/new-api/internal/execution/execution-engine.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 6162228c9c..a19141f4b6 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -392,10 +392,12 @@ export class ExecutionEngine { return state; } case FutureType.READ_EVENT_ARGUMENT: { + // TODO: This should also support contractAt const { contractAddress, storedArtifactPath } = executionStateMap[ future.emitter.id ] as DeploymentExecutionState; + // TODO: This should support multiple transactions const { txId } = executionStateMap[ future.futureToReadFrom.id ] as DeploymentExecutionState; From 142ba5f9a592a91d524fa663bdc118077db5490f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 28 Jun 2023 21:09:42 -0400 Subject: [PATCH 0520/1302] add support for generic send in execution --- examples/complete/ignition/CompleteModule.js | 2 +- .../internal/execution/execution-engine.ts | 40 ++++++++++- .../internal/execution/execution-strategy.ts | 49 +++++++++++++ .../execution/executionStateReducer.ts | 32 +++++++++ .../src/new-api/internal/execution/guards.ts | 7 ++ .../transactions/transaction-service.ts | 52 ++++++++++++++ .../new-api/internal/journal/type-guards.ts | 24 ++++++- .../new-api/internal/types/execution-state.ts | 3 +- packages/core/src/new-api/types/journal.ts | 70 +++++++++++++++++-- 9 files changed, 270 insertions(+), 9 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 3e92ea5647..b4e62d8177 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -30,7 +30,7 @@ module.exports = defineModule("CompleteModule", (m) => { // withLibArtifact // ); - // m.send("test-send", duplicate, 123n); + m.send("test-send", basic, 123n); return { basic, diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index a19141f4b6..5c26b0b92b 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,6 +1,7 @@ import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; +import { isModuleParameterRuntimeValue } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; @@ -429,9 +430,44 @@ export class ExecutionEngine { }; return state; } - case FutureType.NAMED_CONTRACT_AT: - case FutureType.ARTIFACT_CONTRACT_AT: case FutureType.SEND_DATA: { + let to: string; + if (typeof future.to === "string") { + to = future.to; + } else if (isModuleParameterRuntimeValue(future.to)) { + to = resolveModuleParameter(future.to, { + deploymentParameters, + }) as string; + } else { + const { contractAddress } = executionStateMap[ + future.to.id + ] as DeploymentExecutionState; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.to.id} used before it's resolved` + ); + + to = contractAddress; + } + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + value: future.value.toString(), + data: future.data ?? "0x", + to, + from: resolveFromAddress(future.from, { accounts }), + }; + return state; + } + case FutureType.NAMED_CONTRACT_AT: + case FutureType.ARTIFACT_CONTRACT_AT: { throw new Error(`Not implemented yet: FutureType ${future.type}`); } } diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 600d8f4c98..784ea3076e 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -10,9 +10,12 @@ import { OnchainInteractionMessage, OnchainReadEventArgumentSuccessMessage, OnchainResultMessage, + OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, ReadEventArgumentExecutionSuccess, ReadEventArgumentInteractionMessage, + SendDataExecutionSuccess, + SendDataInteractionMessage, StaticCallExecutionSuccess, StaticCallInteractionMessage, } from "../../types/journal"; @@ -20,6 +23,7 @@ import { isCallExecutionState, isDeploymentExecutionState, isReadEventArgumentExecutionState, + isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; import { ExecutionStrategy } from "../types/execution-engine"; @@ -28,6 +32,7 @@ import { DeploymentExecutionState, ExecutionState, ReadEventArgumentExecutionState, + SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -65,6 +70,11 @@ export class BasicExecutionStrategy return this._executeReadEventArgument({ executionState }); } + if (isSendDataExecutionState(executionState)) { + return this._executeSendData({ executionState, sender }); + } + + // TODO: add type check throw new IgnitionError( "Basic strategy not implemented that execution state yet" ); @@ -232,4 +242,43 @@ export class BasicExecutionStrategy result: result.result, }; } + + private async *_executeSendData({ + executionState: sendDataExecutionState, + sender, + }: { + executionState: SendDataExecutionState; + sender?: string; + }): AsyncGenerator< + SendDataInteractionMessage, + SendDataExecutionSuccess, + OnchainSendDataSuccessMessage | null + > { + assertIgnitionInvariant( + sender !== undefined, + "Sender must be defined for send execution" + ); + + const result = yield { + type: "onchain-action", + subtype: "send-data", + futureId: sendDataExecutionState.id, + transactionId: 1, + value: sendDataExecutionState.value.toString(), + data: sendDataExecutionState.data, + to: sendDataExecutionState.to, + from: sender, + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + return { + type: "execution-success", + subtype: "send-data", + futureId: sendDataExecutionState.id, + txId: result.txId, + }; + } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 485692bad6..a46bbb4e6b 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -4,6 +4,7 @@ import { isDeployContractStartMessage, isExecutionStartMessage, isReadEventArgumentStartMessage, + isSendDataStartMessage, isStaticCallStartMessage, } from "../journal/type-guards"; import { @@ -13,6 +14,7 @@ import { ExecutionStateMap, ExecutionStatus, ReadEventArgumentExecutionState, + SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -84,6 +86,19 @@ export function executionStateReducer( }; } + if (action.subtype === "send-data") { + const updatedExecutionState: SendDataExecutionState = { + ...(previousDeploymentExecutionState as SendDataExecutionState), + status: ExecutionStatus.SUCCESS, + txId: action.txId, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + throw new Error( "TBD - only deployment and call states are currently implemented for execution success" ); @@ -200,5 +215,22 @@ function initialiseExecutionStateFor( return executionState; } + if (isSendDataStartMessage(futureStart)) { + const executionState: SendDataExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + value: BigInt(futureStart.value), + data: futureStart.data, + to: futureStart.to, + from: futureStart.from, + }; + + return executionState; + } + throw new Error("Not implemented yet in the reducer"); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index e67c2ff822..846a065c49 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -9,6 +9,7 @@ import { JournalableMessage, OnchainInteractionMessage, ReadEventArgumentInteractionMessage, + SendDataInteractionMessage, StaticCallInteractionMessage, } from "../../types/journal"; @@ -80,6 +81,12 @@ export function isReadEventArgumentInteraction( return isOnChainAction(potential) && potential.subtype === "read-event-arg"; } +export function isSendDataInteraction( + potential: JournalableMessage +): potential is SendDataInteractionMessage { + return isOnChainAction(potential) && potential.subtype === "send-data"; +} + export function isDeployedContractExecutionSuccess( potential: JournalableMessage ): potential is DeployedContractExecutionSuccess { diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 91abf1971f..1fc6b4aa4b 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -12,8 +12,10 @@ import { OnchainInteractionMessage, OnchainReadEventArgumentSuccessMessage, OnchainResultMessage, + OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, ReadEventArgumentInteractionMessage, + SendDataInteractionMessage, StaticCallInteractionMessage, } from "../../../types/journal"; import { @@ -26,6 +28,7 @@ import { isCallFunctionInteraction, isDeployContractInteraction, isReadEventArgumentInteraction, + isSendDataInteraction, isStaticCallInteraction, } from "../guards"; @@ -63,6 +66,10 @@ export class TransactionServiceImplementation implements TransactionService { return this._dispatchReadEventArgument(interaction); } + if (isSendDataInteraction(interaction)) { + return this._dispatchSendData(interaction); + } + throw new IgnitionError( "Transaction service not implemented for this interaction" ); @@ -301,4 +308,49 @@ export class TransactionServiceImplementation implements TransactionService { }; } } + + private async _dispatchSendData({ + futureId, + transactionId, + from, + value, + data, + to, + }: SendDataInteractionMessage): Promise< + OnchainSendDataSuccessMessage | OnchainFailureMessage + > { + const signer: ethers.Signer = await this._signerLoader.getSigner(from); + + const unsignedTx: ethers.providers.TransactionRequest = { + from, + to, + value: BigInt(value), + data, + }; + + const result = await this._chainDispatcher.sendTx(unsignedTx, signer); + + if (result.type === "transaction-success") { + assertIgnitionInvariant( + result.txId !== undefined, + "Transaction hash not available on receipt" + ); + + return { + type: "onchain-result", + subtype: "send-data-success", + futureId, + transactionId, + txId: result.txId, + }; + } else { + return { + type: "onchain-result", + subtype: "failure", + futureId, + transactionId, + error: result.error, + }; + } + } } diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 5c868ea40f..63dfb92d44 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -9,8 +9,10 @@ import { OnchainResultFailureMessage, OnchainResultMessage, OnchainResultSuccessMessage, + OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, ReadEventArgumentStartMessage, + SendDataStartMessage, StaticCallStartMessage, } from "../../types/journal"; import { FutureType } from "../../types/module"; @@ -77,6 +79,17 @@ export function isReadEventArgumentStartMessage( return potential.futureType === FutureType.READ_EVENT_ARGUMENT; } +/** + * Returns true if potential is a send data start message + * + * @beta + */ +export function isSendDataStartMessage( + potential: FutureStartMessage +): potential is SendDataStartMessage { + return potential.futureType === FutureType.SEND_DATA; +} + export function isOnChainResultMessage( message: JournalableMessage ): message is OnchainResultMessage { @@ -90,7 +103,8 @@ export function isOnChainSuccessMessage( isOnchainDeployContractSuccessMessage(message) || isOnchainCallFunctionSuccessMessage(message) || isOnchainStaticCallSuccessMessage(message) || - isOnchainReadEventArgumentSuccessMessage(message) + isOnchainReadEventArgumentSuccessMessage(message) || + isOnchainSendDataSuccessMessage(message) ); } @@ -134,3 +148,11 @@ export function isOnchainReadEventArgumentSuccessMessage( message.subtype === "read-event-arg-success" ); } + +export function isOnchainSendDataSuccessMessage( + message: JournalableMessage +): message is OnchainSendDataSuccessMessage { + return ( + isOnChainResultMessage(message) && message.subtype === "send-data-success" + ); +} diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 75676809c7..754dbef58b 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -177,9 +177,10 @@ export interface ReadEventArgumentExecutionState export interface SendDataExecutionState extends BaseExecutionState { to: string; - data: string | undefined; + data: string; value: bigint; from: string | undefined; + txId?: string; } export type ExecutionState = diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 8b10163f35..d69ef4e026 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -43,7 +43,8 @@ export type OnchainInteractionMessage = | DeployContractInteractionMessage | CallFunctionInteractionMessage | StaticCallInteractionMessage - | ReadEventArgumentInteractionMessage; + | ReadEventArgumentInteractionMessage + | SendDataInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. @@ -115,6 +116,22 @@ export interface ReadEventArgumentInteractionMessage { eventIndex: number; } +/** + * A on-chain interaction request to send a generic transaction. + * + * @beta + */ +export interface SendDataInteractionMessage { + type: "onchain-action"; + subtype: "send-data"; + futureId: string; + transactionId: number; + value: string; + data: string; + to: string; + from: string; +} + // #endregion // #region "OnchainResult" @@ -132,7 +149,8 @@ export type OnchainResultSuccessMessage = | OnchainDeployContractSuccessMessage | OnchainCallFunctionSuccessMessage | OnchainStaticCallSuccessMessage - | OnchainReadEventArgumentSuccessMessage; + | OnchainReadEventArgumentSuccessMessage + | OnchainSendDataSuccessMessage; export type OnchainResultFailureMessage = OnchainFailureMessage; @@ -189,6 +207,19 @@ export interface OnchainReadEventArgumentSuccessMessage { result: SolidityParameterType; } +/** + * A successful send transaction result. + * + * @beta + */ +export interface OnchainSendDataSuccessMessage { + type: "onchain-result"; + subtype: "send-data-success"; + futureId: string; + transactionId: number; + txId: string; +} + /** * A failed on-chain transaction result. * @@ -233,7 +264,8 @@ export type FutureStartMessage = | DeployContractStartMessage | CallFunctionStartMessage | StaticCallStartMessage - | ReadEventArgumentStartMessage; + | ReadEventArgumentStartMessage + | SendDataStartMessage; /** * A journal message to initialise the execution state for a contract deployment. @@ -315,6 +347,23 @@ export interface ReadEventArgumentStartMessage { eventIndex: number; } +/** + * A journal message to initialise the execution state for a generic send. + * + * @beta + */ +export interface SendDataStartMessage { + type: "execution-start"; + futureId: string; + futureType: FutureType.SEND_DATA; + strategy: string; + dependencies: string[]; + value: string; + data: string; + to: string; + from: string; +} + /** * A journal message to indicate a future is being restarted. * @@ -361,7 +410,8 @@ export type ExecutionSuccess = | DeployedContractExecutionSuccess | CalledFunctionExecutionSuccess | StaticCallExecutionSuccess - | ReadEventArgumentExecutionSuccess; + | ReadEventArgumentExecutionSuccess + | SendDataExecutionSuccess; /** * A journal message indicating a contract/library deployed successfully. @@ -419,6 +469,18 @@ export interface ReadEventArgumentExecutionSuccess { result: SolidityParameterType; } +/** + * A journal message indicating a generic transaction was sent successfully. + * + * @beta + */ +export interface SendDataExecutionSuccess { + type: "execution-success"; + subtype: "send-data"; + futureId: string; + txId: string; +} + // #endregion /** From 2b86ee854076a08c70efbfb1be3a8a1e9637338b Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 4 Jul 2023 21:37:46 +0100 Subject: [PATCH 0521/1302] chore: add todo to recondier with contractAt --- packages/core/src/new-api/internal/execution/execution-engine.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 5c26b0b92b..07f31e0c51 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -439,6 +439,7 @@ export class ExecutionEngine { deploymentParameters, }) as string; } else { + // TODO: reconsider this with contractAt const { contractAddress } = executionStateMap[ future.to.id ] as DeploymentExecutionState; From d2fe6be412c88f89a046a3669f4f1a93763ef23b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 29 Jun 2023 20:46:11 -0400 Subject: [PATCH 0522/1302] add support for contractAt in execution flow --- examples/complete/ignition/CompleteModule.js | 8 +- .../internal/execution/execution-engine.ts | 92 +++++++++++++++---- .../internal/execution/execution-strategy.ts | 41 +++++++++ .../execution/executionStateReducer.ts | 32 +++++++ .../src/new-api/internal/execution/guards.ts | 7 ++ .../transactions/transaction-service.ts | 25 +++++ .../new-api/internal/journal/type-guards.ts | 29 +++++- .../futures/reconcileArtifactContractAt.ts | 4 +- .../futures/reconcileNamedContractAt.ts | 4 +- .../core/src/new-api/internal/type-guards.ts | 5 +- .../new-api/internal/types/execution-state.ts | 3 +- .../internal/utils/resolve-future-to-value.ts | 2 +- packages/core/src/new-api/types/journal.ts | 71 +++++++++++++- .../futures/reconcileArtifactContractAt.ts | 14 ++- .../futures/reconcileNamedContractAt.ts | 11 ++- 15 files changed, 307 insertions(+), 41 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index b4e62d8177..8f21a48bfe 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -23,21 +23,23 @@ module.exports = defineModule("CompleteModule", (m) => { const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); m.staticCall(withLib, "readonlyFunction", [eventArg]); - // const duplicate = m.contractAt("BasicContract", basic); + const duplicate = m.contractAt("BasicContract", basic, { + id: "BasicContract2", + }); // const duplicateWithLib = m.contractAtFromArtifact( // "ContractWithLibrary", // withLib, // withLibArtifact // ); - m.send("test-send", basic, 123n); + m.send("test-send", duplicate, 123n); return { basic, library, libFromArtifact, withLib, - // duplicate, + duplicate, // duplicateWithLib, }; }); diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 07f31e0c51..bc8a3d65f3 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -19,6 +19,7 @@ import { Future, FutureType, ModuleParameters, + NamedContractAtFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "../../types/module"; @@ -28,7 +29,9 @@ import { } from "../journal/type-guards"; import { isCallExecutionState, + isContractAtExecutionState, isDeploymentExecutionState, + isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; import { @@ -467,7 +470,50 @@ export class ExecutionEngine { }; return state; } - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_CONTRACT_AT: { + let address: string; + if (typeof future.address === "string") { + address = future.address; + } else if (isModuleParameterRuntimeValue(future.address)) { + address = resolveModuleParameter(future.address, { + deploymentParameters, + }) as string; + } else { + const { contractAddress } = executionStateMap[ + future.address.id + ] as DeploymentExecutionState; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.address.id} used before it's resolved` + ); + + address = contractAddress; + } + + const { + storedArtifactPath: namedContractAtArtifactPath, + storedBuildInfoPath: namedContractAtBuildInfoPath, + } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + artifactResolver, + deploymentLoader, + }); + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + contractName: future.contractName, + contractAddress: address, + storedArtifactPath: namedContractAtArtifactPath, + storedBuildInfoPath: namedContractAtBuildInfoPath, + }; + return state; + } case FutureType.ARTIFACT_CONTRACT_AT: { throw new Error(`Not implemented yet: FutureType ${future.type}`); } @@ -492,7 +538,8 @@ export class ExecutionEngine { private async _storeArtifactAndBuildInfoAgainstDeployment( future: | NamedLibraryDeploymentFuture - | NamedContractDeploymentFuture, + | NamedContractDeploymentFuture + | NamedContractAtFuture, { deploymentLoader, artifactResolver, @@ -558,19 +605,31 @@ export class ExecutionEngine { storedArtifactPath: string; } > { - return Object.fromEntries( - Object.values(executionStateMap) - .filter(isDeploymentExecutionState) - .filter((des) => des.status === ExecutionStatus.SUCCESS) - .map((des) => [ - des.id, - { - contractName: des.contractName, - contractAddress: des.contractAddress!, - storedArtifactPath: des.storedArtifactPath, - }, - ]) - ); + const deployments = Object.values(executionStateMap) + .filter(isDeploymentExecutionState) + .filter((des) => des.status === ExecutionStatus.SUCCESS) + .map((des) => [ + des.id, + { + contractName: des.contractName, + contractAddress: des.contractAddress!, + storedArtifactPath: des.storedArtifactPath, + }, + ]); + + const contractAts = Object.values(executionStateMap) + .filter(isContractAtExecutionState) + .filter((des) => des.status === ExecutionStatus.SUCCESS) + .map((des) => [ + des.id, + { + contractName: des.contractName, + contractAddress: des.contractAddress!, + storedArtifactPath: des.storedArtifactPath, + }, + ]); + + return Object.fromEntries([...deployments, ...contractAts]); } private _setupExecutionStrategyContext( @@ -582,7 +641,8 @@ export class ExecutionEngine { const sender = isDeploymentExecutionState(exState) || isCallExecutionState(exState) || - isStaticCallExecutionState(exState) + isStaticCallExecutionState(exState) || + isSendDataExecutionState(exState) ? exState.from ?? state.accounts[0] : undefined; diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 784ea3076e..bd36655d22 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -2,10 +2,13 @@ import { IgnitionError } from "../../../errors"; import { CallFunctionInteractionMessage, CalledFunctionExecutionSuccess, + ContractAtExecutionSuccess, + ContractAtInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, JournalableMessage, OnchainCallFunctionSuccessMessage, + OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, OnchainInteractionMessage, OnchainReadEventArgumentSuccessMessage, @@ -21,6 +24,7 @@ import { } from "../../types/journal"; import { isCallExecutionState, + isContractAtExecutionState, isDeploymentExecutionState, isReadEventArgumentExecutionState, isSendDataExecutionState, @@ -29,6 +33,7 @@ import { import { ExecutionStrategy } from "../types/execution-engine"; import { CallExecutionState, + ContractAtExecutionState, DeploymentExecutionState, ExecutionState, ReadEventArgumentExecutionState, @@ -74,6 +79,10 @@ export class BasicExecutionStrategy return this._executeSendData({ executionState, sender }); } + if (isContractAtExecutionState(executionState)) { + return this._executeContractAt({ executionState }); + } + // TODO: add type check throw new IgnitionError( "Basic strategy not implemented that execution state yet" @@ -281,4 +290,36 @@ export class BasicExecutionStrategy txId: result.txId, }; } + + private async *_executeContractAt({ + executionState: contractAtExecutionState, + }: { + executionState: ContractAtExecutionState; + }): AsyncGenerator< + ContractAtInteractionMessage, + ContractAtExecutionSuccess, + OnchainContractAtSuccessMessage | null + > { + const result = yield { + type: "onchain-action", + subtype: "contract-at", + futureId: contractAtExecutionState.id, + transactionId: 1, + storedArtifactPath: contractAtExecutionState.storedArtifactPath, + contractAddress: contractAtExecutionState.contractAddress, + contractName: contractAtExecutionState.contractName, + }; + + if (result === null) { + throw new IgnitionError("No result yielded"); + } + + return { + type: "execution-success", + subtype: "contract-at", + futureId: contractAtExecutionState.id, + contractAddress: contractAtExecutionState.contractAddress, + contractName: contractAtExecutionState.contractName, + }; + } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index a46bbb4e6b..f56b63e513 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -1,6 +1,7 @@ import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, + isContractAtStartMessage, isDeployContractStartMessage, isExecutionStartMessage, isReadEventArgumentStartMessage, @@ -9,6 +10,7 @@ import { } from "../journal/type-guards"; import { CallExecutionState, + ContractAtExecutionState, DeploymentExecutionState, ExecutionState, ExecutionStateMap, @@ -99,6 +101,20 @@ export function executionStateReducer( }; } + if (action.subtype === "contract-at") { + const updatedExecutionState: ContractAtExecutionState = { + ...(previousDeploymentExecutionState as ContractAtExecutionState), + status: ExecutionStatus.SUCCESS, + contractAddress: action.contractAddress, + contractName: action.contractName, + }; + + return { + ...executionStateMap, + [action.futureId]: updatedExecutionState, + }; + } + throw new Error( "TBD - only deployment and call states are currently implemented for execution success" ); @@ -232,5 +248,21 @@ function initialiseExecutionStateFor( return executionState; } + if (isContractAtStartMessage(futureStart)) { + const executionState: ContractAtExecutionState = { + id: futureStart.futureId, + futureType: futureStart.futureType, + strategy: futureStart.strategy, + status: ExecutionStatus.STARTED, + dependencies: new Set(futureStart.dependencies), + history: [], + storedArtifactPath: futureStart.storedArtifactPath, + contractAddress: futureStart.contractAddress, + contractName: futureStart.contractName, + }; + + return executionState; + } + throw new Error("Not implemented yet in the reducer"); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 846a065c49..bf2668dc61 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -1,5 +1,6 @@ import { CallFunctionInteractionMessage, + ContractAtInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, ExecutionFailure, @@ -87,6 +88,12 @@ export function isSendDataInteraction( return isOnChainAction(potential) && potential.subtype === "send-data"; } +export function isContractAtInteraction( + potential: JournalableMessage +): potential is ContractAtInteractionMessage { + return isOnChainAction(potential) && potential.subtype === "contract-at"; +} + export function isDeployedContractExecutionSuccess( potential: JournalableMessage ): potential is DeployedContractExecutionSuccess { diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index 1fc6b4aa4b..fc2486633c 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -5,8 +5,10 @@ import { SignerAdapter } from "../../../types/adapters"; import { DeploymentLoader } from "../../../types/deployment-loader"; import { CallFunctionInteractionMessage, + ContractAtInteractionMessage, DeployContractInteractionMessage, OnchainCallFunctionSuccessMessage, + OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, OnchainFailureMessage, OnchainInteractionMessage, @@ -26,6 +28,7 @@ import { assertIgnitionInvariant } from "../../utils/assertions"; import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; import { isCallFunctionInteraction, + isContractAtInteraction, isDeployContractInteraction, isReadEventArgumentInteraction, isSendDataInteraction, @@ -70,6 +73,10 @@ export class TransactionServiceImplementation implements TransactionService { return this._dispatchSendData(interaction); } + if (isContractAtInteraction(interaction)) { + return this._dispatchContractAt(interaction); + } + throw new IgnitionError( "Transaction service not implemented for this interaction" ); @@ -353,4 +360,22 @@ export class TransactionServiceImplementation implements TransactionService { }; } } + + private async _dispatchContractAt({ + futureId, + transactionId, + contractAddress, + contractName, + }: ContractAtInteractionMessage): Promise< + OnchainContractAtSuccessMessage | OnchainFailureMessage + > { + return { + type: "onchain-result", + subtype: "contract-at-success", + futureId, + transactionId, + contractAddress, + contractName, + }; + } } diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 63dfb92d44..979626d694 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -1,9 +1,11 @@ import { CallFunctionStartMessage, + ContractAtStartMessage, DeployContractStartMessage, FutureStartMessage, JournalableMessage, OnchainCallFunctionSuccessMessage, + OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, OnchainReadEventArgumentSuccessMessage, OnchainResultFailureMessage, @@ -90,6 +92,22 @@ export function isSendDataStartMessage( return potential.futureType === FutureType.SEND_DATA; } +/** + * Returns true if potential is a contract at start message + * + * @beta + */ +export function isContractAtStartMessage( + potential: FutureStartMessage +): potential is ContractAtStartMessage { + const deploymentTypes = [ + FutureType.NAMED_CONTRACT_AT, + FutureType.ARTIFACT_CONTRACT_AT, + ]; + + return deploymentTypes.includes(potential.futureType); +} + export function isOnChainResultMessage( message: JournalableMessage ): message is OnchainResultMessage { @@ -104,7 +122,8 @@ export function isOnChainSuccessMessage( isOnchainCallFunctionSuccessMessage(message) || isOnchainStaticCallSuccessMessage(message) || isOnchainReadEventArgumentSuccessMessage(message) || - isOnchainSendDataSuccessMessage(message) + isOnchainSendDataSuccessMessage(message) || + isOnchainContractAtSuccessMessage(message) ); } @@ -156,3 +175,11 @@ export function isOnchainSendDataSuccessMessage( isOnChainResultMessage(message) && message.subtype === "send-data-success" ); } + +export function isOnchainContractAtSuccessMessage( + message: JournalableMessage +): message is OnchainContractAtSuccessMessage { + return ( + isOnChainResultMessage(message) && message.subtype === "contract-at-success" + ); +} diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts index 7b7d53db63..eaefb9e587 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -24,10 +24,10 @@ export function reconcileArtifactContractAt( context ); - if (!isEqual(resolvedAddress, executionState.address)) { + if (!isEqual(resolvedAddress, executionState.contractAddress)) { return fail( future, - `Address has been changed from ${executionState.address} to ${resolvedAddress}` + `Address has been changed from ${executionState.contractAddress} to ${resolvedAddress}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts index 497106fcc0..2e582211ea 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -24,10 +24,10 @@ export function reconcileNamedContractAt( context ); - if (!isEqual(resolvedAddress, executionState.address)) { + if (!isEqual(resolvedAddress, executionState.contractAddress)) { return fail( future, - `Address has been changed from ${executionState.address} to ${resolvedAddress}` + `Address has been changed from ${executionState.contractAddress} to ${resolvedAddress}` ); } diff --git a/packages/core/src/new-api/internal/type-guards.ts b/packages/core/src/new-api/internal/type-guards.ts index 5f5cb9f827..4df42e8a39 100644 --- a/packages/core/src/new-api/internal/type-guards.ts +++ b/packages/core/src/new-api/internal/type-guards.ts @@ -42,7 +42,10 @@ export function isReadEventArgumentExecutionState( export function isContractAtExecutionState( executionState: ExecutionState ): executionState is ContractAtExecutionState { - return [FutureType.NAMED_CONTRACT_AT].includes(executionState.futureType); + return [ + FutureType.NAMED_CONTRACT_AT, + FutureType.ARTIFACT_CONTRACT_AT, + ].includes(executionState.futureType); } export function isSendDataExecutionState( diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 754dbef58b..9b79fb16d9 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -159,8 +159,9 @@ export interface ContractAtExecutionState extends BaseExecutionState< FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT > { + storedArtifactPath: string; // As stored in the deployment directory. contractName: string; - address: string; + contractAddress: string; } export interface ReadEventArgumentExecutionState diff --git a/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts b/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts index ee4846edbf..e132bb1432 100644 --- a/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts +++ b/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts @@ -39,7 +39,7 @@ export function resolveFutureToValue( ); if (isContractAtExecutionState(executionState)) { - return executionState.address; + return executionState.contractAddress; } if (isDeploymentExecutionState(executionState)) { diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index d69ef4e026..f05bf588c0 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -44,7 +44,8 @@ export type OnchainInteractionMessage = | CallFunctionInteractionMessage | StaticCallInteractionMessage | ReadEventArgumentInteractionMessage - | SendDataInteractionMessage; + | SendDataInteractionMessage + | ContractAtInteractionMessage; /** * A on-chain interaction request to deploy a contract/library. @@ -132,6 +133,21 @@ export interface SendDataInteractionMessage { from: string; } +/** + * A on-chain interaction request to get a contract at a given address. + * + * @beta + */ +export interface ContractAtInteractionMessage { + type: "onchain-action"; + subtype: "contract-at"; + futureId: string; + transactionId: number; + contractName: string; + contractAddress: string; + storedArtifactPath: string; +} + // #endregion // #region "OnchainResult" @@ -150,7 +166,8 @@ export type OnchainResultSuccessMessage = | OnchainCallFunctionSuccessMessage | OnchainStaticCallSuccessMessage | OnchainReadEventArgumentSuccessMessage - | OnchainSendDataSuccessMessage; + | OnchainSendDataSuccessMessage + | OnchainContractAtSuccessMessage; export type OnchainResultFailureMessage = OnchainFailureMessage; @@ -220,6 +237,20 @@ export interface OnchainSendDataSuccessMessage { txId: string; } +/** + * A successful contract at result. + * + * @beta + */ +export interface OnchainContractAtSuccessMessage { + type: "onchain-result"; + subtype: "contract-at-success"; + futureId: string; + transactionId: number; + contractName: string; + contractAddress: string; +} + /** * A failed on-chain transaction result. * @@ -265,7 +296,8 @@ export type FutureStartMessage = | CallFunctionStartMessage | StaticCallStartMessage | ReadEventArgumentStartMessage - | SendDataStartMessage; + | SendDataStartMessage + | ContractAtStartMessage; /** * A journal message to initialise the execution state for a contract deployment. @@ -364,6 +396,23 @@ export interface SendDataStartMessage { from: string; } +/** + * A journal message to initialise the execution state for a contract at. + * + * @beta + */ +export interface ContractAtStartMessage { + type: "execution-start"; + futureId: string; + futureType: FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT; + strategy: string; + dependencies: string[]; + storedArtifactPath: string; + storedBuildInfoPath: string | undefined; + contractName: string; + contractAddress: string; +} + /** * A journal message to indicate a future is being restarted. * @@ -411,7 +460,8 @@ export type ExecutionSuccess = | CalledFunctionExecutionSuccess | StaticCallExecutionSuccess | ReadEventArgumentExecutionSuccess - | SendDataExecutionSuccess; + | SendDataExecutionSuccess + | ContractAtExecutionSuccess; /** * A journal message indicating a contract/library deployed successfully. @@ -481,6 +531,19 @@ export interface SendDataExecutionSuccess { txId: string; } +/** + * A journal message indicating a contract at the given address was wrapped successfully. + * + * @beta + */ +export interface ContractAtExecutionSuccess { + type: "execution-success"; + subtype: "contract-at"; + futureId: string; + contractName: string; + contractAddress: string; +} + // #endregion /** diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index 6d50e8f2b9..da94e6439b 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -32,7 +32,8 @@ describe("Reconciliation - artifact contract at", () => { dependencies: new Set(), history: [], contractName: "Contract1", - address: exampleAddress, + contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", }; const exampleDeploymentState: DeploymentExecutionState = { @@ -87,7 +88,8 @@ describe("Reconciliation - artifact contract at", () => { ...exampleContractAtState, futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, - address: exampleAddress, + contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", }, }; @@ -124,7 +126,8 @@ describe("Reconciliation - artifact contract at", () => { futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "Another", - address: differentAddress, + contractAddress: differentAddress, + storedArtifactPath: "./artifact.json", }, }; @@ -151,7 +154,8 @@ describe("Reconciliation - artifact contract at", () => { futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", - address: differentAddress, + contractAddress: differentAddress, + storedArtifactPath: "./artifact.json", }, }); @@ -183,7 +187,7 @@ describe("Reconciliation - artifact contract at", () => { ...exampleContractAtState, futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, - address: differentAddress, + contractAddress: differentAddress, }, }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index 7832438db5..7f8ceb9a39 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -24,7 +24,8 @@ describe("Reconciliation - named contract at", () => { dependencies: new Set(), history: [], contractName: "Contract1", - address: exampleAddress, + contractAddress: exampleAddress, + storedArtifactPath: "./artifact.json", }; const exampleDeploymentState: DeploymentExecutionState = { @@ -75,7 +76,7 @@ describe("Reconciliation - named contract at", () => { ...exampleContractAtState, futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, - address: exampleAddress, + contractAddress: exampleAddress, }, }; @@ -111,7 +112,7 @@ describe("Reconciliation - named contract at", () => { ...exampleContractAtState, futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, - address: differentAddress, + contractAddress: differentAddress, contractName: "Another", }, }; @@ -134,7 +135,7 @@ describe("Reconciliation - named contract at", () => { futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", - address: exampleAddress, + contractAddress: exampleAddress, }, }); @@ -161,7 +162,7 @@ describe("Reconciliation - named contract at", () => { ...exampleContractAtState, futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, - address: differentAddress, + contractAddress: differentAddress, }, }); From be5d67451a1ce6be1f9d0ca283b062061b46aac3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 29 Jun 2023 20:51:23 -0400 Subject: [PATCH 0523/1302] add support for artifact contract-at in execution flow --- examples/complete/ignition/CompleteModule.js | 13 +++--- .../internal/execution/execution-engine.ts | 42 ++++++++++++++++++- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 8f21a48bfe..075fe2d58b 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -26,11 +26,12 @@ module.exports = defineModule("CompleteModule", (m) => { const duplicate = m.contractAt("BasicContract", basic, { id: "BasicContract2", }); - // const duplicateWithLib = m.contractAtFromArtifact( - // "ContractWithLibrary", - // withLib, - // withLibArtifact - // ); + const duplicateWithLib = m.contractAtFromArtifact( + "ContractWithLibrary", + withLib, + withLibArtifact, + { id: "ContractWithLibrary2" } + ); m.send("test-send", duplicate, 123n); @@ -40,6 +41,6 @@ module.exports = defineModule("CompleteModule", (m) => { libFromArtifact, withLib, duplicate, - // duplicateWithLib, + duplicateWithLib, }; }); diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index bc8a3d65f3..a74e3c4adb 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -515,8 +515,48 @@ export class ExecutionEngine { return state; } case FutureType.ARTIFACT_CONTRACT_AT: { - throw new Error(`Not implemented yet: FutureType ${future.type}`); + let address: string; + if (typeof future.address === "string") { + address = future.address; + } else if (isModuleParameterRuntimeValue(future.address)) { + address = resolveModuleParameter(future.address, { + deploymentParameters, + }) as string; + } else { + const { contractAddress } = executionStateMap[ + future.address.id + ] as DeploymentExecutionState; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.address.id} used before it's resolved` + ); + + address = contractAddress; + } + + const artifactContractAtPath = await deploymentLoader.storeArtifact( + future.id, + future.artifact + ); + + state = { + type: "execution-start", + futureId: future.id, + futureType: future.type, + strategy, + // status: ExecutionStatus.STARTED, + dependencies: [...future.dependencies].map((f) => f.id), + // history: [], + contractName: future.contractName, + contractAddress: address, + storedArtifactPath: artifactContractAtPath, + storedBuildInfoPath: undefined, + }; + return state; } + default: + throw new Error(`Unknown future`); } } From 0d854175404eab8b8d68533ff4f955f9e0c3cd1e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 29 Jun 2023 13:58:55 +0100 Subject: [PATCH 0524/1302] refactor: add typecheck on execution engine inner loop --- .../internal/execution/execution-engine.ts | 34 +++++++----------- .../execution/executionStateReducer.ts | 4 +-- .../new-api/internal/journal/type-guards.ts | 36 ++++++++++++++----- packages/core/src/new-api/types/journal.ts | 2 +- 4 files changed, 44 insertions(+), 32 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index a74e3c4adb..630526755b 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -8,7 +8,6 @@ import { DeploymentLoader } from "../../types/deployment-loader"; import { ExecutionFailure, ExecutionResultMessage, - FutureRestartMessage, FutureStartMessage, JournalableMessage, OnchainResultFailureMessage, @@ -24,8 +23,10 @@ import { NamedLibraryDeploymentFuture, } from "../../types/module"; import { + isFutureStartMessage, isOnChainFailureMessage, isOnChainSuccessMessage, + isWipeMessage, } from "../journal/type-guards"; import { isCallExecutionState, @@ -114,10 +115,7 @@ export class ExecutionEngine { future: Future, state: ExecutionEngineState ): Promise { - let current: JournalableMessage = await this._startOrRestartFor( - future, - state - ); + let current: JournalableMessage = await this._initCommandFor(future, state); await this._apply(state, current); @@ -147,18 +145,25 @@ export class ExecutionEngine { current = (await exectionStrategy.next(current)).value; } else if (isOnChainFailureMessage(current)) { current = this._convertToExecutionFailure(current); - } else { + } else if (isFutureStartMessage(current)) { current = (await exectionStrategy.next(null)).value; + } else if (isWipeMessage(current)) { + // ignore - we should never get wipe messages + continue; + } else { + this._assertNeverJournalableMessage(current); } - // TODO: add never type check? - await this._apply(state, current); } return current; } + private _assertNeverJournalableMessage(message: never) { + throw new IgnitionError(`Unrecognized message ${JSON.stringify(message)}`); + } + private _convertToExecutionFailure( current: OnchainResultFailureMessage ): ExecutionFailure { @@ -169,19 +174,6 @@ export class ExecutionEngine { }; } - private async _startOrRestartFor( - future: Future, - state: ExecutionEngineState - ): Promise { - const executionState = state.executionStateMap[future.id]; - - if (executionState === undefined) { - return this._initCommandFor(future, state); - } - - return { type: "execution-restart", futureId: future.id }; - } - private async _apply( state: ExecutionEngineState, message: JournalableMessage diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index f56b63e513..387a94e6a0 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -3,7 +3,7 @@ import { isCallFunctionStartMessage, isContractAtStartMessage, isDeployContractStartMessage, - isExecutionStartMessage, + isFutureStartMessage, isReadEventArgumentStartMessage, isSendDataStartMessage, isStaticCallStartMessage, @@ -25,7 +25,7 @@ export function executionStateReducer( executionStateMap: ExecutionStateMap, action: JournalableMessage ) { - if (isExecutionStartMessage(action)) { + if (isFutureStartMessage(action)) { return { ...executionStateMap, [action.futureId]: initialiseExecutionStateFor(action), diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 979626d694..c24740f363 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -16,6 +16,7 @@ import { ReadEventArgumentStartMessage, SendDataStartMessage, StaticCallStartMessage, + WipeMessage, } from "../../types/journal"; import { FutureType } from "../../types/module"; @@ -24,10 +25,14 @@ import { FutureType } from "../../types/module"; * * @beta */ -export function isExecutionStartMessage( +export function isFutureStartMessage( potential: JournalableMessage ): potential is FutureStartMessage { - return potential.type === "execution-start"; + return ( + isDeployContractStartMessage(potential) || + isCallFunctionStartMessage(potential) || + isStaticCallStartMessage(potential) + ); } /** @@ -36,7 +41,7 @@ export function isExecutionStartMessage( * @beta */ export function isDeployContractStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is DeployContractStartMessage { const deploymentTypes = [ FutureType.NAMED_CONTRACT_DEPLOYMENT, @@ -45,7 +50,10 @@ export function isDeployContractStartMessage( FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, ]; - return deploymentTypes.includes(potential.futureType); + return ( + potential.type === "execution-start" && + deploymentTypes.includes(potential.futureType) + ); } /** @@ -54,9 +62,12 @@ export function isDeployContractStartMessage( * @beta */ export function isCallFunctionStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is CallFunctionStartMessage { - return potential.futureType === FutureType.NAMED_CONTRACT_CALL; + return ( + potential.type === "execution-start" && + potential.futureType === FutureType.NAMED_CONTRACT_CALL + ); } /** @@ -65,9 +76,12 @@ export function isCallFunctionStartMessage( * @beta */ export function isStaticCallStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is StaticCallStartMessage { - return potential.futureType === FutureType.NAMED_STATIC_CALL; + return ( + potential.type === "execution-start" && + potential.futureType === FutureType.NAMED_STATIC_CALL + ); } /** @@ -183,3 +197,9 @@ export function isOnchainContractAtSuccessMessage( isOnChainResultMessage(message) && message.subtype === "contract-at-success" ); } + +export function isWipeMessage( + potential: JournalableMessage +): potential is WipeMessage { + return potential.type === "wipe"; +} diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index f05bf588c0..4b5e861c38 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -284,7 +284,7 @@ export type ExecutionMessage = ExecutionUpdateMessage | ExecutionResultMessage; * * @beta */ -export type ExecutionUpdateMessage = FutureStartMessage | FutureRestartMessage; +export type ExecutionUpdateMessage = FutureStartMessage; /** * A journal message to initialise the execution state for a future. From 276dc70c2dbd7c3378ad60ce74c76c7e212e8576 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 30 Jun 2023 16:20:55 +0100 Subject: [PATCH 0525/1302] chore: add prettier-solidity for examples --- examples/complete/contracts/BasicContract.sol | 14 +- examples/complete/contracts/BasicLibrary.sol | 4 +- .../contracts/ContractWithLibrary.sol | 2 +- examples/complete/package.json | 5 +- examples/create2/contracts/Bar.sol | 2 +- examples/create2/contracts/Create2Factory.sol | 22 +- examples/create2/contracts/Foo.sol | 2 +- examples/create2/package.json | 5 +- examples/ens/package.json | 5 +- examples/multisig/contracts/Multisig.sol | 600 +++++++++--------- examples/multisig/package.json | 5 +- examples/sample/package.json | 5 +- examples/ts-sample/contracts/Lock.sol | 44 +- examples/ts-sample/package.json | 5 +- examples/uniswap/contracts/Florin.sol | 8 +- examples/uniswap/contracts/Solidus.sol | 8 +- examples/uniswap/contracts/WETH9.sol | 114 ++-- examples/uniswap/package.json | 5 +- package-lock.json | 56 +- 19 files changed, 475 insertions(+), 436 deletions(-) diff --git a/examples/complete/contracts/BasicContract.sol b/examples/complete/contracts/BasicContract.sol index 078708c25e..60ae041399 100644 --- a/examples/complete/contracts/BasicContract.sol +++ b/examples/complete/contracts/BasicContract.sol @@ -5,14 +5,14 @@ pragma solidity ^0.8.9; // import "hardhat/console.sol"; contract BasicContract { - event BasicEvent(uint eventArg); + event BasicEvent(uint eventArg); - receive () external payable {} + receive() external payable {} - function basicFunction(uint funcArg) public { - // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal - // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + function basicFunction(uint funcArg) public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); - emit BasicEvent(funcArg); - } + emit BasicEvent(funcArg); + } } diff --git a/examples/complete/contracts/BasicLibrary.sol b/examples/complete/contracts/BasicLibrary.sol index 04a69a8d95..08fe8134af 100644 --- a/examples/complete/contracts/BasicLibrary.sol +++ b/examples/complete/contracts/BasicLibrary.sol @@ -3,6 +3,6 @@ pragma solidity ^0.8.9; library BasicLibrary { function addTwo(uint self) public pure returns (uint) { - return self + 2; - } + return self + 2; + } } diff --git a/examples/complete/contracts/ContractWithLibrary.sol b/examples/complete/contracts/ContractWithLibrary.sol index 4709663489..eaa6b57eba 100644 --- a/examples/complete/contracts/ContractWithLibrary.sol +++ b/examples/complete/contracts/ContractWithLibrary.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; -import './BasicLibrary.sol'; +import "./BasicLibrary.sol"; using BasicLibrary for uint; diff --git a/examples/complete/package.json b/examples/complete/package.json index 3e93efb4d5..3725820c67 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -7,11 +7,12 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/create2/contracts/Bar.sol b/examples/create2/contracts/Bar.sol index a96f102f60..6c4c63e33d 100644 --- a/examples/create2/contracts/Bar.sol +++ b/examples/create2/contracts/Bar.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.5; contract Bar { - string public name = "Bar"; + string public name = "Bar"; } diff --git a/examples/create2/contracts/Create2Factory.sol b/examples/create2/contracts/Create2Factory.sol index f50e9e8933..4038a68651 100644 --- a/examples/create2/contracts/Create2Factory.sol +++ b/examples/create2/contracts/Create2Factory.sol @@ -4,18 +4,18 @@ pragma solidity ^0.8.5; import "@openzeppelin/contracts/utils/Create2.sol"; contract Create2Factory { - event Deployed(bytes32 indexed salt, address deployed); + event Deployed(bytes32 indexed salt, address deployed); - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) public returns (address) { - address deployedAddress; + function deploy( + uint256 amount, + bytes32 salt, + bytes memory bytecode + ) public returns (address) { + address deployedAddress; - deployedAddress = Create2.deploy(amount, salt, bytecode); - emit Deployed(salt, deployedAddress); + deployedAddress = Create2.deploy(amount, salt, bytecode); + emit Deployed(salt, deployedAddress); - return deployedAddress; - } + return deployedAddress; + } } diff --git a/examples/create2/contracts/Foo.sol b/examples/create2/contracts/Foo.sol index 8c401da3e6..0c13497f8f 100644 --- a/examples/create2/contracts/Foo.sol +++ b/examples/create2/contracts/Foo.sol @@ -2,5 +2,5 @@ pragma solidity ^0.8.5; contract Foo { - string public name = "Foo"; + string public name = "Foo"; } diff --git a/examples/create2/package.json b/examples/create2/package.json index 18f0be179f..9cf31f3b44 100644 --- a/examples/create2/package.json +++ b/examples/create2/package.json @@ -7,12 +7,13 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" }, "dependencies": { "@openzeppelin/contracts": "4.7.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index adfaee5c81..363bb485cd 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -7,12 +7,13 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" }, "dependencies": { "@ensdomains/ens-contracts": "0.0.11" diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol index 7790ddc325..d784e9b3a9 100644 --- a/examples/multisig/contracts/Multisig.sol +++ b/examples/multisig/contracts/Multisig.sol @@ -2,312 +2,306 @@ pragma solidity ^0.8.0; contract Multisig { - event Confirmation(address indexed sender, uint indexed transactionId); - event Revocation(address indexed sender, uint indexed transactionId); - event Submission(uint indexed transactionId); - event Execution(uint indexed transactionId); - event ExecutionFailure(uint indexed transactionId); - event Deposit(address indexed sender, uint value); - event OwnerAddition(address indexed owner); - event OwnerRemoval(address indexed owner); - event RequirementChange(uint required); - - uint public constant MAX_OWNER_COUNT = 50; - - mapping(uint => Transaction) public transactions; - mapping(uint => mapping(address => bool)) public confirmations; - mapping(address => bool) public isOwner; - address[] public owners; - uint public required; - uint public transactionCount; - - struct Transaction { - address destination; - uint value; - bytes data; - bool executed; + event Confirmation(address indexed sender, uint indexed transactionId); + event Revocation(address indexed sender, uint indexed transactionId); + event Submission(uint indexed transactionId); + event Execution(uint indexed transactionId); + event ExecutionFailure(uint indexed transactionId); + event Deposit(address indexed sender, uint value); + event OwnerAddition(address indexed owner); + event OwnerRemoval(address indexed owner); + event RequirementChange(uint required); + + uint public constant MAX_OWNER_COUNT = 50; + + mapping(uint => Transaction) public transactions; + mapping(uint => mapping(address => bool)) public confirmations; + mapping(address => bool) public isOwner; + address[] public owners; + uint public required; + uint public transactionCount; + + struct Transaction { + address destination; + uint value; + bytes data; + bool executed; + } + + modifier onlyWallet() { + require(msg.sender == address(this)); + _; + } + + modifier ownerDoesNotExist(address owner) { + require(!isOwner[owner]); + _; + } + + modifier ownerExists(address owner) { + require(isOwner[owner]); + _; + } + + modifier transactionExists(uint transactionId) { + require(transactions[transactionId].destination != address(0)); + _; + } + + modifier confirmed(uint transactionId, address owner) { + require(confirmations[transactionId][owner]); + _; + } + + modifier notConfirmed(uint transactionId, address owner) { + require(!confirmations[transactionId][owner]); + _; + } + + modifier notExecuted(uint transactionId) { + require(!transactions[transactionId].executed); + _; + } + + modifier notNull(address _address) { + require(_address != address(0)); + _; + } + + modifier validRequirement(uint ownerCount, uint _required) { + require( + ownerCount <= MAX_OWNER_COUNT && + _required <= ownerCount && + _required != 0 && + ownerCount != 0 + ); + _; + } + + receive() external payable { + if (msg.value > 0) emit Deposit(msg.sender, msg.value); + } + + constructor( + address[] memory _owners, + uint _required + ) payable validRequirement(_owners.length, _required) { + for (uint i = 0; i < _owners.length; i++) { + require(!isOwner[_owners[i]] && _owners[i] != address(0)); + isOwner[_owners[i]] = true; } - - modifier onlyWallet() { - require(msg.sender == address(this)); - _; - } - - modifier ownerDoesNotExist(address owner) { - require(!isOwner[owner]); - _; - } - - modifier ownerExists(address owner) { - require(isOwner[owner]); - _; - } - - modifier transactionExists(uint transactionId) { - require(transactions[transactionId].destination != address(0)); - _; - } - - modifier confirmed(uint transactionId, address owner) { - require(confirmations[transactionId][owner]); - _; - } - - modifier notConfirmed(uint transactionId, address owner) { - require(!confirmations[transactionId][owner]); - _; - } - - modifier notExecuted(uint transactionId) { - require(!transactions[transactionId].executed); - _; + owners = _owners; + required = _required; + } + + function addOwner( + address owner + ) + public + onlyWallet + ownerDoesNotExist(owner) + notNull(owner) + validRequirement(owners.length + 1, required) + { + isOwner[owner] = true; + owners.push(owner); + emit OwnerAddition(owner); + } + + function removeOwner(address owner) public onlyWallet ownerExists(owner) { + isOwner[owner] = false; + for (uint i = 0; i < owners.length - 1; i++) + if (owners[i] == owner) { + owners[i] = owners[owners.length - 1]; + break; + } + owners.pop(); + if (required > owners.length) changeRequirement(owners.length); + emit OwnerRemoval(owner); + } + + function replaceOwner( + address owner, + address newOwner + ) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { + for (uint i = 0; i < owners.length; i++) + if (owners[i] == owner) { + owners[i] = newOwner; + break; + } + isOwner[owner] = false; + isOwner[newOwner] = true; + emit OwnerRemoval(owner); + emit OwnerAddition(newOwner); + } + + function changeRequirement( + uint _required + ) public onlyWallet validRequirement(owners.length, _required) { + required = _required; + emit RequirementChange(_required); + } + + function submitTransaction( + address destination, + uint value, + bytes memory data + ) public returns (uint transactionId) { + transactionId = addTransaction(destination, value, data); + confirmTransaction(transactionId); + } + + function confirmTransaction( + uint transactionId + ) + public + ownerExists(msg.sender) + transactionExists(transactionId) + notConfirmed(transactionId, msg.sender) + { + confirmations[transactionId][msg.sender] = true; + emit Confirmation(msg.sender, transactionId); + } + + function revokeConfirmation( + uint transactionId + ) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + confirmations[transactionId][msg.sender] = false; + emit Revocation(msg.sender, transactionId); + } + + function executeTransaction( + uint transactionId + ) + public + ownerExists(msg.sender) + confirmed(transactionId, msg.sender) + notExecuted(transactionId) + { + if (isConfirmed(transactionId)) { + Transaction storage txn = transactions[transactionId]; + txn.executed = true; + if (external_call(txn.destination, txn.value, txn.data.length, txn.data)) + emit Execution(transactionId); + else { + emit ExecutionFailure(transactionId); + txn.executed = false; + } } - - modifier notNull(address _address) { - require(_address != address(0)); - _; - } - - modifier validRequirement(uint ownerCount, uint _required) { - require( - ownerCount <= MAX_OWNER_COUNT && - _required <= ownerCount && - _required != 0 && - ownerCount != 0 - ); - _; + } + + function external_call( + address destination, + uint value, + uint dataLength, + bytes memory data + ) internal returns (bool) { + bool result; + assembly { + let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) + let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that + result := call( + sub(gas(), 34710), // 34710 is the value that solidity is currently emitting + // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + + // callNewAccountGas (25000, in case the destination address does not exist and needs creating) + destination, + value, + d, + dataLength, // Size of the input (in bytes) - this is what fixes the padding problem + x, + 0 // Output is ignored, therefore the output size is zero + ) } - - receive() external payable { - if (msg.value > 0) emit Deposit(msg.sender, msg.value); + return result; + } + + function isConfirmed(uint transactionId) public view returns (bool) { + uint count = 0; + for (uint i = 0; i < owners.length; i++) { + if (confirmations[transactionId][owners[i]]) count += 1; + if (count == required) return true; } - constructor( - address[] memory _owners, - uint _required - ) payable validRequirement(_owners.length, _required) { - for (uint i = 0; i < _owners.length; i++) { - require(!isOwner[_owners[i]] && _owners[i] != address(0)); - isOwner[_owners[i]] = true; - } - owners = _owners; - required = _required; - } - - function addOwner( - address owner - ) - public - onlyWallet - ownerDoesNotExist(owner) - notNull(owner) - validRequirement(owners.length + 1, required) - { - isOwner[owner] = true; - owners.push(owner); - emit OwnerAddition(owner); - } - - function removeOwner(address owner) public onlyWallet ownerExists(owner) { - isOwner[owner] = false; - for (uint i = 0; i < owners.length - 1; i++) - if (owners[i] == owner) { - owners[i] = owners[owners.length - 1]; - break; - } - owners.pop(); - if (required > owners.length) changeRequirement(owners.length); - emit OwnerRemoval(owner); - } - - function replaceOwner( - address owner, - address newOwner - ) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { - for (uint i = 0; i < owners.length; i++) - if (owners[i] == owner) { - owners[i] = newOwner; - break; - } - isOwner[owner] = false; - isOwner[newOwner] = true; - emit OwnerRemoval(owner); - emit OwnerAddition(newOwner); - } - - function changeRequirement( - uint _required - ) public onlyWallet validRequirement(owners.length, _required) { - required = _required; - emit RequirementChange(_required); - } - - function submitTransaction( - address destination, - uint value, - bytes memory data - ) public returns (uint transactionId) { - transactionId = addTransaction(destination, value, data); - confirmTransaction(transactionId); - } - - function confirmTransaction( - uint transactionId - ) - public - ownerExists(msg.sender) - transactionExists(transactionId) - notConfirmed(transactionId, msg.sender) - { - confirmations[transactionId][msg.sender] = true; - emit Confirmation(msg.sender, transactionId); - } - - function revokeConfirmation( - uint transactionId - ) - public - ownerExists(msg.sender) - confirmed(transactionId, msg.sender) - notExecuted(transactionId) - { - confirmations[transactionId][msg.sender] = false; - emit Revocation(msg.sender, transactionId); - } - - function executeTransaction( - uint transactionId - ) - public - ownerExists(msg.sender) - confirmed(transactionId, msg.sender) - notExecuted(transactionId) - { - if (isConfirmed(transactionId)) { - Transaction storage txn = transactions[transactionId]; - txn.executed = true; - if ( - external_call( - txn.destination, - txn.value, - txn.data.length, - txn.data - ) - ) emit Execution(transactionId); - else { - emit ExecutionFailure(transactionId); - txn.executed = false; - } - } - } - - function external_call( - address destination, - uint value, - uint dataLength, - bytes memory data - ) internal returns (bool) { - bool result; - assembly { - let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) - let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that - result := call( - sub(gas(), 34710), // 34710 is the value that solidity is currently emitting - // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + - // callNewAccountGas (25000, in case the destination address does not exist and needs creating) - destination, - value, - d, - dataLength, // Size of the input (in bytes) - this is what fixes the padding problem - x, - 0 // Output is ignored, therefore the output size is zero - ) - } - return result; - } - - function isConfirmed(uint transactionId) public view returns (bool) { - uint count = 0; - for (uint i = 0; i < owners.length; i++) { - if (confirmations[transactionId][owners[i]]) count += 1; - if (count == required) return true; - } - - return false; - } - - function addTransaction( - address destination, - uint value, - bytes memory data - ) internal notNull(destination) returns (uint transactionId) { - transactionId = transactionCount; - transactions[transactionId] = Transaction({ - destination: destination, - value: value, - data: data, - executed: false - }); - transactionCount += 1; - emit Submission(transactionId); - } - - function getConfirmationCount( - uint transactionId - ) public view returns (uint count) { - for (uint i = 0; i < owners.length; i++) - if (confirmations[transactionId][owners[i]]) count += 1; - } - - function getTransactionCount( - bool pending, - bool executed - ) public view returns (uint count) { - for (uint i = 0; i < transactionCount; i++) - if ( - (pending && !transactions[i].executed) || - (executed && transactions[i].executed) - ) count += 1; - } - - function getOwners() public view returns (address[] memory) { - return owners; - } - - function getConfirmations( - uint transactionId - ) public view returns (address[] memory _confirmations) { - address[] memory confirmationsTemp = new address[](owners.length); - uint count = 0; - uint i; - for (i = 0; i < owners.length; i++) - if (confirmations[transactionId][owners[i]]) { - confirmationsTemp[count] = owners[i]; - count += 1; - } - _confirmations = new address[](count); - for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; - } - - function getTransactionIds( - uint from, - uint to, - bool pending, - bool executed - ) public view returns (uint[] memory _transactionIds) { - uint[] memory transactionIdsTemp = new uint[](transactionCount); - uint count = 0; - uint i; - for (i = 0; i < transactionCount; i++) - if ( - (pending && !transactions[i].executed) || - (executed && transactions[i].executed) - ) { - transactionIdsTemp[count] = i; - count += 1; - } - _transactionIds = new uint[](to - from); - for (i = from; i < to; i++) - _transactionIds[i - from] = transactionIdsTemp[i]; - } + return false; + } + + function addTransaction( + address destination, + uint value, + bytes memory data + ) internal notNull(destination) returns (uint transactionId) { + transactionId = transactionCount; + transactions[transactionId] = Transaction({ + destination: destination, + value: value, + data: data, + executed: false + }); + transactionCount += 1; + emit Submission(transactionId); + } + + function getConfirmationCount( + uint transactionId + ) public view returns (uint count) { + for (uint i = 0; i < owners.length; i++) + if (confirmations[transactionId][owners[i]]) count += 1; + } + + function getTransactionCount( + bool pending, + bool executed + ) public view returns (uint count) { + for (uint i = 0; i < transactionCount; i++) + if ( + (pending && !transactions[i].executed) || + (executed && transactions[i].executed) + ) count += 1; + } + + function getOwners() public view returns (address[] memory) { + return owners; + } + + function getConfirmations( + uint transactionId + ) public view returns (address[] memory _confirmations) { + address[] memory confirmationsTemp = new address[](owners.length); + uint count = 0; + uint i; + for (i = 0; i < owners.length; i++) + if (confirmations[transactionId][owners[i]]) { + confirmationsTemp[count] = owners[i]; + count += 1; + } + _confirmations = new address[](count); + for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; + } + + function getTransactionIds( + uint from, + uint to, + bool pending, + bool executed + ) public view returns (uint[] memory _transactionIds) { + uint[] memory transactionIdsTemp = new uint[](transactionCount); + uint count = 0; + uint i; + for (i = 0; i < transactionCount; i++) + if ( + (pending && !transactions[i].executed) || + (executed && transactions[i].executed) + ) { + transactionIdsTemp[count] = i; + count += 1; + } + _transactionIds = new uint[](to - from); + for (i = from; i < to; i++) + _transactionIds[i - from] = transactionIdsTemp[i]; + } } diff --git a/examples/multisig/package.json b/examples/multisig/package.json index 8aed6268a3..4444e523f3 100644 --- a/examples/multisig/package.json +++ b/examples/multisig/package.json @@ -7,12 +7,13 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" }, "dependencies": { "@openzeppelin/contracts": "^4.3.2" diff --git a/examples/sample/package.json b/examples/sample/package.json index b1b0f170d8..642a83fef8 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -7,11 +7,12 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ts-sample/contracts/Lock.sol b/examples/ts-sample/contracts/Lock.sol index 072855038a..122a274464 100644 --- a/examples/ts-sample/contracts/Lock.sol +++ b/examples/ts-sample/contracts/Lock.sol @@ -5,34 +5,34 @@ pragma solidity ^0.8.9; // import "hardhat/console.sol"; contract Lock { - uint public unlockTime; - address payable public owner; + uint public unlockTime; + address payable public owner; - event Withdrawal(uint amount, uint when); + event Withdrawal(uint amount, uint when); - constructor(uint _unlockTime) payable { - require( - block.timestamp < _unlockTime, - "Unlock time should be in the future" - ); + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); - unlockTime = _unlockTime; - owner = payable(msg.sender); - } + unlockTime = _unlockTime; + owner = payable(msg.sender); + } - function test() public { - emit Withdrawal(address(this).balance, block.timestamp); - } + function test() public { + emit Withdrawal(address(this).balance, block.timestamp); + } - function withdraw() public { - // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal - // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); - require(block.timestamp >= unlockTime, "You can't withdraw yet"); - require(msg.sender == owner, "You aren't the owner"); + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); - emit Withdrawal(address(this).balance, block.timestamp); + emit Withdrawal(address(this).balance, block.timestamp); - owner.transfer(address(this).balance); - } + owner.transfer(address(this).balance); + } } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 461b4f0ddb..000a2ba2bd 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -7,11 +7,12 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx,ts,tsx}\" \"test/**/*.{js,jsx,ts,tsx}\"", - "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\"" + "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/uniswap/contracts/Florin.sol b/examples/uniswap/contracts/Florin.sol index a23ca454f2..c842b8cc17 100644 --- a/examples/uniswap/contracts/Florin.sol +++ b/examples/uniswap/contracts/Florin.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract Florin is ERC20, Ownable { - constructor() ERC20("Florin", "FN") {} + constructor() ERC20("Florin", "FN") {} - function mint(address to, uint256 amount) public onlyOwner { - _mint(to, amount); - } + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } } diff --git a/examples/uniswap/contracts/Solidus.sol b/examples/uniswap/contracts/Solidus.sol index 4a8e725e12..345902f4b7 100644 --- a/examples/uniswap/contracts/Solidus.sol +++ b/examples/uniswap/contracts/Solidus.sol @@ -5,9 +5,9 @@ import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract Solidus is ERC20, Ownable { - constructor() ERC20("Solidus", "SO") {} + constructor() ERC20("Solidus", "SO") {} - function mint(address to, uint256 amount) public onlyOwner { - _mint(to, amount); - } + function mint(address to, uint256 amount) public onlyOwner { + _mint(to, amount); + } } diff --git a/examples/uniswap/contracts/WETH9.sol b/examples/uniswap/contracts/WETH9.sol index 363c81cd35..5a9a2d4570 100644 --- a/examples/uniswap/contracts/WETH9.sol +++ b/examples/uniswap/contracts/WETH9.sol @@ -16,67 +16,67 @@ pragma solidity >=0.4.22 <0.6; contract WETH9 { - string public name = "Wrapped Ether"; - string public symbol = "WETH"; - uint8 public decimals = 18; - - event Approval(address indexed src, address indexed guy, uint256 wad); - event Transfer(address indexed src, address indexed dst, uint256 wad); - event Deposit(address indexed dst, uint256 wad); - event Withdrawal(address indexed src, uint256 wad); - - mapping(address => uint256) public balanceOf; - mapping(address => mapping(address => uint256)) public allowance; - - function() external payable { - deposit(); - } - - function deposit() public payable { - balanceOf[msg.sender] += msg.value; - emit Deposit(msg.sender, msg.value); - } - - function withdraw(uint256 wad) public { - require(balanceOf[msg.sender] >= wad); - balanceOf[msg.sender] -= wad; - msg.sender.transfer(wad); - emit Withdrawal(msg.sender, wad); - } - - function totalSupply() public view returns (uint256) { - return address(this).balance; - } - - function approve(address guy, uint256 wad) public returns (bool) { - allowance[msg.sender][guy] = wad; - emit Approval(msg.sender, guy, wad); - return true; - } - - function transfer(address dst, uint256 wad) public returns (bool) { - return transferFrom(msg.sender, dst, wad); + string public name = "Wrapped Ether"; + string public symbol = "WETH"; + uint8 public decimals = 18; + + event Approval(address indexed src, address indexed guy, uint256 wad); + event Transfer(address indexed src, address indexed dst, uint256 wad); + event Deposit(address indexed dst, uint256 wad); + event Withdrawal(address indexed src, uint256 wad); + + mapping(address => uint256) public balanceOf; + mapping(address => mapping(address => uint256)) public allowance; + + function() external payable { + deposit(); + } + + function deposit() public payable { + balanceOf[msg.sender] += msg.value; + emit Deposit(msg.sender, msg.value); + } + + function withdraw(uint256 wad) public { + require(balanceOf[msg.sender] >= wad); + balanceOf[msg.sender] -= wad; + msg.sender.transfer(wad); + emit Withdrawal(msg.sender, wad); + } + + function totalSupply() public view returns (uint256) { + return address(this).balance; + } + + function approve(address guy, uint256 wad) public returns (bool) { + allowance[msg.sender][guy] = wad; + emit Approval(msg.sender, guy, wad); + return true; + } + + function transfer(address dst, uint256 wad) public returns (bool) { + return transferFrom(msg.sender, dst, wad); + } + + function transferFrom( + address src, + address dst, + uint256 wad + ) public returns (bool) { + require(balanceOf[src] >= wad); + + if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { + require(allowance[src][msg.sender] >= wad); + allowance[src][msg.sender] -= wad; } - function transferFrom( - address src, - address dst, - uint256 wad - ) public returns (bool) { - require(balanceOf[src] >= wad); - - if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { - require(allowance[src][msg.sender] >= wad); - allowance[src][msg.sender] -= wad; - } + balanceOf[src] -= wad; + balanceOf[dst] += wad; - balanceOf[src] -= wad; - balanceOf[dst] += wad; + emit Transfer(src, dst, wad); - emit Transfer(src, dst, wad); - - return true; - } + return true; + } } /* diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index e9dcc770fd..157612546a 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -7,12 +7,13 @@ "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\"" + "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" }, "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", diff --git a/package-lock.json b/package-lock.json index 79f41fc450..ec178a6627 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/create2": { @@ -46,7 +47,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/ens": { @@ -58,7 +60,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/multisig": { @@ -70,7 +73,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/sample": { @@ -79,7 +83,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/ts-sample": { @@ -88,7 +93,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/uniswap": { @@ -107,7 +113,8 @@ "devDependencies": { "@ignored/hardhat-ignition": "^0.0.13", "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0" + "hardhat": "^2.14.0", + "prettier-plugin-solidity": "1.1.3" } }, "examples/uniswap/node_modules/@openzeppelin/contracts": { @@ -5673,8 +5680,7 @@ "version": "0.5.0-alpha.4", "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", @@ -15821,6 +15827,32 @@ "node": ">=6.0.0" } }, + "node_modules/prettier-plugin-solidity": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", + "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", + "dev": true, + "dependencies": { + "@solidity-parser/parser": "^0.16.0", + "semver": "^7.3.8", + "solidity-comments-extractor": "^0.0.7" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "prettier": ">=2.3.0 || >=3.0.0-alpha.0" + } + }, + "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", + "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", + "dev": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -17504,6 +17536,12 @@ "node": ">=0.6.0" } }, + "node_modules/solidity-comments-extractor": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true + }, "node_modules/solidity-coverage": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", From 79b19ba287837ead9f9827652c94ea40001f1ec0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 30 Jun 2023 16:42:50 +0100 Subject: [PATCH 0526/1302] refactor: rename transactionId to executionId --- .../internal/execution/execution-strategy.ts | 12 +- .../transactions/transaction-service.ts | 32 ++--- packages/core/src/new-api/types/journal.ts | 26 ++-- .../new-api/execution/execution-engine.ts | 123 +++++++++--------- .../core/test/new-api/execution/restart.ts | 4 +- packages/core/test/new-api/helpers.ts | 4 +- .../test/new-api/reconciliation/reconciler.ts | 4 +- packages/core/test/new-api/wipe.ts | 4 +- 8 files changed, 102 insertions(+), 107 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index bd36655d22..e7931f92a2 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -109,7 +109,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "deploy-contract", futureId: deploymentExecutionState.id, - transactionId: 1, + executionId: 1, contractName: deploymentExecutionState.contractName, value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, @@ -151,7 +151,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "call-function", futureId: callExecutionState.id, - transactionId: 1, + executionId: 1, contractAddress: callExecutionState.contractAddress, storedArtifactPath: callExecutionState.storedArtifactPath, value: callExecutionState.value.toString(), @@ -194,7 +194,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "static-call", futureId: staticCallExecutionState.id, - transactionId: 1, + executionId: 1, contractAddress: staticCallExecutionState.contractAddress, storedArtifactPath: staticCallExecutionState.storedArtifactPath, args: staticCallExecutionState.args, @@ -229,7 +229,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "read-event-arg", futureId: readEventArgExecutionState.id, - transactionId: 1, + executionId: 1, storedArtifactPath: readEventArgExecutionState.storedArtifactPath, eventName: readEventArgExecutionState.eventName, argumentName: readEventArgExecutionState.argumentName, @@ -272,7 +272,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "send-data", futureId: sendDataExecutionState.id, - transactionId: 1, + executionId: 1, value: sendDataExecutionState.value.toString(), data: sendDataExecutionState.data, to: sendDataExecutionState.to, @@ -304,7 +304,7 @@ export class BasicExecutionStrategy type: "onchain-action", subtype: "contract-at", futureId: contractAtExecutionState.id, - transactionId: 1, + executionId: 1, storedArtifactPath: contractAtExecutionState.storedArtifactPath, contractAddress: contractAtExecutionState.contractAddress, contractName: contractAtExecutionState.contractName, diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts index fc2486633c..c34de5c3ad 100644 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts @@ -121,7 +121,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "deploy-contract-success", futureId: deployContractInteraction.futureId, - transactionId: deployContractInteraction.transactionId, + executionId: deployContractInteraction.executionId, contractAddress: result.contractAddress, txId: result.txId, }; @@ -130,7 +130,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "failure", futureId: deployContractInteraction.futureId, - transactionId: deployContractInteraction.transactionId, + executionId: deployContractInteraction.executionId, error: result.error, }; } @@ -138,7 +138,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchCallFunction({ futureId, - transactionId, + executionId, from, args, functionName, @@ -177,7 +177,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "call-function-success", futureId, - transactionId, + executionId, txId: result.txId, }; } else { @@ -185,7 +185,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "failure", futureId, - transactionId, + executionId, error: result.error, }; } @@ -193,7 +193,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchStaticCall({ futureId, - transactionId, + executionId, from, args, functionName, @@ -228,7 +228,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "static-call-success", futureId, - transactionId, + executionId, result, }; } catch (error) { @@ -236,7 +236,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "failure", futureId, - transactionId, + executionId, error: error instanceof Error ? error @@ -247,7 +247,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchReadEventArgument({ futureId, - transactionId, + executionId, storedArtifactPath, eventName, argumentName, @@ -297,7 +297,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "read-event-arg-success", futureId, - transactionId, + executionId, result: ethers.BigNumber.isBigNumber(result) ? result.toString() : result, @@ -307,7 +307,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "failure", futureId, - transactionId, + executionId, error: error instanceof Error ? error @@ -318,7 +318,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchSendData({ futureId, - transactionId, + executionId, from, value, data, @@ -347,7 +347,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "send-data-success", futureId, - transactionId, + executionId, txId: result.txId, }; } else { @@ -355,7 +355,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "failure", futureId, - transactionId, + executionId, error: result.error, }; } @@ -363,7 +363,7 @@ export class TransactionServiceImplementation implements TransactionService { private async _dispatchContractAt({ futureId, - transactionId, + executionId, contractAddress, contractName, }: ContractAtInteractionMessage): Promise< @@ -373,7 +373,7 @@ export class TransactionServiceImplementation implements TransactionService { type: "onchain-result", subtype: "contract-at-success", futureId, - transactionId, + executionId, contractAddress, contractName, }; diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 4b5e861c38..c49e35fc08 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -56,7 +56,7 @@ export interface DeployContractInteractionMessage { type: "onchain-action"; subtype: "deploy-contract"; futureId: string; - transactionId: number; + executionId: number; args: ArgumentType[]; contractName: string; storedArtifactPath: string; @@ -73,7 +73,7 @@ export interface CallFunctionInteractionMessage { type: "onchain-action"; subtype: "call-function"; futureId: string; - transactionId: number; + executionId: number; args: ArgumentType[]; functionName: string; value: string; @@ -91,7 +91,7 @@ export interface StaticCallInteractionMessage { type: "onchain-action"; subtype: "static-call"; futureId: string; - transactionId: number; + executionId: number; args: ArgumentType[]; functionName: string; contractAddress: string; @@ -108,7 +108,7 @@ export interface ReadEventArgumentInteractionMessage { type: "onchain-action"; subtype: "read-event-arg"; futureId: string; - transactionId: number; + executionId: number; storedArtifactPath: string; eventName: string; argumentName: string; @@ -126,7 +126,7 @@ export interface SendDataInteractionMessage { type: "onchain-action"; subtype: "send-data"; futureId: string; - transactionId: number; + executionId: number; value: string; data: string; to: string; @@ -142,7 +142,7 @@ export interface ContractAtInteractionMessage { type: "onchain-action"; subtype: "contract-at"; futureId: string; - transactionId: number; + executionId: number; contractName: string; contractAddress: string; storedArtifactPath: string; @@ -180,7 +180,7 @@ export interface OnchainDeployContractSuccessMessage { type: "onchain-result"; subtype: "deploy-contract-success"; futureId: string; - transactionId: number; + executionId: number; contractAddress: string; txId: string; } @@ -194,7 +194,7 @@ export interface OnchainCallFunctionSuccessMessage { type: "onchain-result"; subtype: "call-function-success"; futureId: string; - transactionId: number; + executionId: number; txId: string; } @@ -207,7 +207,7 @@ export interface OnchainStaticCallSuccessMessage { type: "onchain-result"; subtype: "static-call-success"; futureId: string; - transactionId: number; + executionId: number; result: SolidityParameterType; } @@ -220,7 +220,7 @@ export interface OnchainReadEventArgumentSuccessMessage { type: "onchain-result"; subtype: "read-event-arg-success"; futureId: string; - transactionId: number; + executionId: number; result: SolidityParameterType; } @@ -233,7 +233,7 @@ export interface OnchainSendDataSuccessMessage { type: "onchain-result"; subtype: "send-data-success"; futureId: string; - transactionId: number; + executionId: number; txId: string; } @@ -246,7 +246,7 @@ export interface OnchainContractAtSuccessMessage { type: "onchain-result"; subtype: "contract-at-success"; futureId: string; - transactionId: number; + executionId: number; contractName: string; contractAddress: string; } @@ -260,7 +260,7 @@ export interface OnchainFailureMessage { type: "onchain-result"; subtype: "failure"; futureId: string; - transactionId: number; + executionId: number; error: Error; } diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index e5f5e8c9dc..cf3248201a 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -3,6 +3,7 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; +import { DeployContractStartMessage } from "../../../src/new-api/types/journal"; import { accumulateMessages, assertDeploymentFailure, @@ -73,7 +74,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -122,7 +123,7 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractName: "Contract1", args: [ "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", @@ -137,7 +138,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -170,7 +171,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "failure", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, error: new Error( "Cannot estimate gas; transaction may fail or may require manual gas limit" ), @@ -208,7 +209,7 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractName: "Contract1", args: [], value: BigInt(0).toString(), @@ -219,7 +220,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "failure", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, error: new Error( "Cannot estimate gas; transaction may fail or may require manual gas limit" ), @@ -252,7 +253,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -291,7 +292,7 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractName: "Library1", args: [], value: BigInt(0).toString(), @@ -302,7 +303,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -344,7 +345,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -364,54 +365,48 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); - assert.deepStrictEqual( - journalMessages, - JSON.parse( - JSON.stringify([ - { - futureId: "Module1:Contract1", - type: "execution-start", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: undefined, - contractName: "Contract1", - value: BigInt(0).toString(), - constructorArgs: [], - libraries: {}, - from: accounts[2], - }, - { - type: "onchain-action", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - transactionId: 1, - contractName: "Contract1", - args: [], - value: BigInt(0).toString(), - from: accounts[2], - storedArtifactPath: "Module1:Contract1.json", - }, - { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - transactionId: 1, - contractAddress: exampleAddress, - txId, - }, - { - type: "execution-success", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - contractName: "Contract1", - contractAddress: exampleAddress, - txId, - }, - ]) - ) - ); + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[2], + } as Omit as any, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: accounts[2], + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + ]); }); describe("with complex arguments", () => { @@ -446,7 +441,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -456,7 +451,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractAddress: differentAddress, txId, }, @@ -504,7 +499,7 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractName: "Library1", args: [], value: BigInt(0).toString(), @@ -515,7 +510,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Library1", - transactionId: 1, + executionId: 1, contractAddress: differentAddress, txId, }, @@ -552,7 +547,7 @@ describe("execution engine", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractName: "Contract1", args: [ { @@ -568,7 +563,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index 862c88405b..4744ff311b 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -62,7 +62,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "failure", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, error: new Error("EVM revert"), }, }, @@ -94,7 +94,7 @@ describe("execution engine", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 4e1f1da5eb..d391a72e9b 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -100,11 +100,11 @@ export function setupMockTransactionService({ ); } - const transactionResult = futureResults[request.transactionId]; + const transactionResult = futureResults[request.executionId]; if (transactionResult === undefined) { throw new Error( - `Mock transaction service has no results recorded for transaction ${request.futureId}/${request.transactionId}` + `Mock transaction service has no results recorded for transaction ${request.futureId}/${request.executionId}` ); } diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 86d63dfc3d..6891f6794c 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -126,7 +126,7 @@ describe("Reconciliation", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, args: [], contractName: "Contract1", storedArtifactPath: "./Module1:Contract1.json", @@ -182,7 +182,7 @@ describe("Reconciliation", () => { type: "onchain-action", subtype: "deploy-contract", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, args: [], contractName: "Contract1", storedArtifactPath: "./Module1:Contract1.json", diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index 946f1921cd..5d878c73c3 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -44,7 +44,7 @@ describe("wipe", () => { type: "onchain-result", subtype: "deploy-contract-success", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, contractAddress: exampleAddress, txId, }, @@ -54,7 +54,7 @@ describe("wipe", () => { type: "onchain-result", subtype: "failure", futureId: "Module1:Contract1", - transactionId: 1, + executionId: 1, error: new Error("EVM revert"), }, }, From 792ba48b1ffd416ae495737201d37a5b8fe27d05 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 3 Jul 2023 00:49:48 -0400 Subject: [PATCH 0527/1302] add artifact maps to reconciliation context --- .../core/src/new-api/internal/deployer.ts | 69 +++++++++++++++++-- .../internal/reconciliation/reconciler.ts | 13 +++- .../new-api/internal/reconciliation/types.ts | 3 + .../core/src/new-api/internal/type-guards.ts | 14 ++++ packages/core/src/new-api/types/artifact.ts | 10 +++ 5 files changed, 103 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 9da209e76d..f54eaca96c 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -1,7 +1,12 @@ -import type { IgnitionModuleResult, ModuleParameters } from "../types/module"; +import type { + ContractFuture, + IgnitionModuleResult, + ModuleParameters, +} from "../types/module"; import type { IgnitionModuleDefinition } from "../types/module-builder"; -import { ArtifactResolver } from "../types/artifact"; +import { isContractFuture } from "../type-guards"; +import { Artifact, ArtifactMap, ArtifactResolver } from "../types/artifact"; import { DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; @@ -13,8 +18,15 @@ import { BasicExecutionStrategy } from "./execution/execution-strategy"; import { executionStateReducer } from "./execution/executionStateReducer"; import { ModuleConstructor } from "./module-builder"; import { Reconciler } from "./reconciliation/reconciler"; +import { isContractExecutionStateArray } from "./type-guards"; import { ExecutionStrategy } from "./types/execution-engine"; -import { ExecutionStateMap } from "./types/execution-state"; +import { + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionStateMap, +} from "./types/execution-state"; +import { assertIgnitionInvariant } from "./utils/assertions"; +import { getFuturesFromModule } from "./utils/get-futures-from-module"; import { validate } from "./validation/validate"; /** @@ -62,11 +74,28 @@ export class Deployer { this._deploymentLoader.journal ); + const contracts = getFuturesFromModule(module).filter(isContractFuture); + const contractStates = contracts.map( + (contract) => previousStateMap[contract.id] + ); + + // realistically this should be impossible to fail. + // just need it here for the type inference + assertIgnitionInvariant( + isContractExecutionStateArray(contractStates), + "Invalid state map" + ); + + const moduleArtifactMap = await this._loadModuleArtifactMap(contracts); + const storedArtifactMap = await this._loadStoredArtifactMap(contractStates); + const reconciliationResult = Reconciler.reconcile( module, previousStateMap, deploymentParameters, - accounts + accounts, + moduleArtifactMap, + storedArtifactMap ); if (reconciliationResult.reconciliationFailures.length > 0) { @@ -104,4 +133,36 @@ export class Deployer { return state; } + + private async _loadModuleArtifactMap( + contracts: Array> + ): Promise { + const entries: Array<[string, Artifact]> = []; + + for (const contract of contracts) { + const artifact = await this._artifactResolver.loadArtifact( + contract.contractName + ); + + entries.push([contract.id, artifact]); + } + + return Object.fromEntries(entries); + } + + private async _loadStoredArtifactMap( + contractStates: Array + ): Promise { + const entries: Array<[string, Artifact]> = []; + + for (const contract of contractStates) { + const artifact = await this._deploymentLoader.loadArtifact( + contract.storedArtifactPath + ); + + entries.push([contract.id, artifact]); + } + + return Object.fromEntries(entries); + } } diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index 7ef776de5a..53a6e0919f 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -1,3 +1,4 @@ +import { ArtifactMap } from "../../types/artifact"; import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; @@ -21,11 +22,19 @@ export class Reconciler { module: IgnitionModule, executionStateMap: ExecutionStateMap, deploymentParameters: { [key: string]: ModuleParameters }, - accounts: string[] + accounts: string[], + moduleArtifactMap: ArtifactMap, + storedArtifactMap: ArtifactMap ): ReconciliationResult { const reconciliationFailures = this._reconcileEachFutureInModule( module, - { executionStateMap, deploymentParameters, accounts }, + { + executionStateMap, + deploymentParameters, + accounts, + moduleArtifactMap, + storedArtifactMap, + }, [ reconcileCurrentAndPreviousTypeMatch, reconcileDependencyRules, diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index ff09360c43..d304c8c8aa 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -1,3 +1,4 @@ +import { ArtifactMap } from "../../types/artifact"; import { Future, ModuleParameters } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; @@ -28,6 +29,8 @@ export interface ReconciliationContext { executionStateMap: ExecutionStateMap; deploymentParameters: { [key: string]: ModuleParameters }; accounts: string[]; + moduleArtifactMap: ArtifactMap; + storedArtifactMap: ArtifactMap; } export type ReconciliationCheck = ( diff --git a/packages/core/src/new-api/internal/type-guards.ts b/packages/core/src/new-api/internal/type-guards.ts index 4df42e8a39..7d0f96acdf 100644 --- a/packages/core/src/new-api/internal/type-guards.ts +++ b/packages/core/src/new-api/internal/type-guards.ts @@ -1,3 +1,5 @@ +import { every } from "lodash"; + import { FutureType } from "../types/module"; import { @@ -53,3 +55,15 @@ export function isSendDataExecutionState( ): executionState is SendDataExecutionState { return [FutureType.SEND_DATA].includes(executionState.futureType); } + +export function isContractExecutionStateArray( + executionStateArray: ExecutionState[] +): executionStateArray is Array< + DeploymentExecutionState | ContractAtExecutionState +> { + return every( + executionStateArray, + (state) => + isDeploymentExecutionState(state) || isContractAtExecutionState(state) + ); +} diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 33f3b24df3..505cda8bed 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -13,6 +13,16 @@ export interface Artifact { >; } +/** + * A map of (contract) future id's to their respective artifact. + * Used in reconciliation. + * + * @beta + */ +export interface ArtifactMap { + [futureId: string]: Artifact; +} + /** * Retrieve artifacts based on contract name. * From 992d3b7b6f557f3aa2c056d22769ad1415073ac4 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 3 Jul 2023 01:21:20 -0400 Subject: [PATCH 0528/1302] compare stored vs module bytecodes to reconcile --- .../futures/reconcileArtifactContractAt.ts | 16 ++++++++++++++- .../reconcileArtifactContractDeployment.ts | 20 ++++++++++++++++++- .../reconcileArtifactLibraryDeployment.ts | 20 ++++++++++++++++++- .../futures/reconcileNamedContractAt.ts | 16 ++++++++++++++- .../reconcileNamedContractDeployment.ts | 20 ++++++++++++++++++- .../reconcileNamedLibraryDeployment.ts | 20 ++++++++++++++++++- .../new-api/internal/reconciliation/utils.ts | 12 +++++++++++ 7 files changed, 118 insertions(+), 6 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts index eaefb9e587..89581408a8 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -4,7 +4,7 @@ import { ArtifactContractAtFuture } from "../../../types/module"; import { ContractAtExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail } from "../utils"; +import { fail, getBytecodeWithoutMetadata } from "../utils"; export function reconcileArtifactContractAt( future: ArtifactContractAtFuture, @@ -18,6 +18,20 @@ export function reconcileArtifactContractAt( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedAddress: string = ExecutionStateResolver.resolveStaticCallResultToAddress( future.address, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 2b4f3197d2..287326046b 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -5,7 +5,11 @@ import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail } from "../utils"; +import { + addressToErrorString, + fail, + getBytecodeWithoutMetadata, +} from "../utils"; export function reconcileArtifactContractDeployment( future: ArtifactContractDeploymentFuture, @@ -19,6 +23,20 @@ export function reconcileArtifactContractDeployment( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( future.constructorArgs, context diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index a0d810e4db..a017470fd4 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -5,7 +5,11 @@ import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail } from "../utils"; +import { + addressToErrorString, + fail, + getBytecodeWithoutMetadata, +} from "../utils"; export function reconcileArtifactLibraryDeployment( future: ArtifactLibraryDeploymentFuture, @@ -19,6 +23,20 @@ export function reconcileArtifactLibraryDeployment( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedLibraries = ExecutionStateResolver.resolveLibrariesFromExecutionState( future.libraries, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts index 2e582211ea..04f012d012 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -4,7 +4,7 @@ import { NamedContractAtFuture } from "../../../types/module"; import { ContractAtExecutionState } from "../../types/execution-state"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { fail } from "../utils"; +import { fail, getBytecodeWithoutMetadata } from "../utils"; export function reconcileNamedContractAt( future: NamedContractAtFuture, @@ -18,6 +18,20 @@ export function reconcileNamedContractAt( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedAddress: string = ExecutionStateResolver.resolveStaticCallResultToAddress( future.address, diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 270bac44ac..703d5d8ce5 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -5,7 +5,11 @@ import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail } from "../utils"; +import { + addressToErrorString, + fail, + getBytecodeWithoutMetadata, +} from "../utils"; export function reconcileNamedContractDeployment( future: NamedContractDeploymentFuture, @@ -19,6 +23,20 @@ export function reconcileNamedContractDeployment( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedArgs = ExecutionStateResolver.resolveArgsFromExectuionState( future.constructorArgs, context diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 6fcbd44182..ea7d79cad1 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -5,7 +5,11 @@ import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; -import { addressToErrorString, fail } from "../utils"; +import { + addressToErrorString, + fail, + getBytecodeWithoutMetadata, +} from "../utils"; export function reconcileNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, @@ -19,6 +23,20 @@ export function reconcileNamedLibraryDeployment( ); } + const moduleArtifact = context.moduleArtifactMap[future.id]; + const storedArtifact = context.storedArtifactMap[future.id]; + + const moduleArtifactBytecode = getBytecodeWithoutMetadata( + moduleArtifact.bytecode + ); + const storedArtifactBytecode = getBytecodeWithoutMetadata( + storedArtifact.bytecode + ); + + if (!isEqual(moduleArtifactBytecode, storedArtifactBytecode)) { + return fail(future, "Artifact bytecodes have been changed"); + } + const resolvedLibraries = ExecutionStateResolver.resolveLibrariesFromExecutionState( future.libraries, diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 22cfd48d7b..90c2e25e84 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -52,3 +52,15 @@ export function addressToErrorString(potential: string | undefined) { return potential; } + +const METADATA_LENGTH = 2; +export function getMetadataSectionLength(bytecode: Buffer): number { + return bytecode.slice(-METADATA_LENGTH).readUInt16BE(0) + METADATA_LENGTH; +} + +export function getBytecodeWithoutMetadata(bytecode: string): string { + const bytecodeBuffer = Buffer.from(bytecode); + return bytecodeBuffer + .slice(0, getMetadataSectionLength(bytecodeBuffer)) + .toString(); +} From 7feeeb1771c81f0117c182c36e9e6af261b7d82a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 4 Jul 2023 20:35:18 -0400 Subject: [PATCH 0529/1302] add comment regarding sync/async and make ArtifactMap internal --- packages/core/src/new-api/internal/deployer.ts | 5 ++++- .../src/new-api/internal/reconciliation/reconciler.ts | 2 +- .../core/src/new-api/internal/reconciliation/types.ts | 6 +++++- packages/core/src/new-api/types/artifact.ts | 10 ---------- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index f54eaca96c..471d9df19c 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -6,7 +6,7 @@ import type { import type { IgnitionModuleDefinition } from "../types/module-builder"; import { isContractFuture } from "../type-guards"; -import { Artifact, ArtifactMap, ArtifactResolver } from "../types/artifact"; +import { Artifact, ArtifactResolver } from "../types/artifact"; import { DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; @@ -18,6 +18,7 @@ import { BasicExecutionStrategy } from "./execution/execution-strategy"; import { executionStateReducer } from "./execution/executionStateReducer"; import { ModuleConstructor } from "./module-builder"; import { Reconciler } from "./reconciliation/reconciler"; +import { ArtifactMap } from "./reconciliation/types"; import { isContractExecutionStateArray } from "./type-guards"; import { ExecutionStrategy } from "./types/execution-engine"; import { @@ -86,6 +87,8 @@ export class Deployer { "Invalid state map" ); + // since the reconciler is purely synchronous, we load all of the artifacts at once here. + // if reconciler was async, we could pass it the artifact loaders and load them JIT instead. const moduleArtifactMap = await this._loadModuleArtifactMap(contracts); const storedArtifactMap = await this._loadStoredArtifactMap(contractStates); diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index 53a6e0919f..0f051ecad8 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -1,4 +1,3 @@ -import { ArtifactMap } from "../../types/artifact"; import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; @@ -15,6 +14,7 @@ import { ReconciliationFutureResult, ReconciliationFutureResultFailure, ReconciliationResult, + ArtifactMap, } from "./types"; export class Reconciler { diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index d304c8c8aa..59ed26d95c 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -1,4 +1,4 @@ -import { ArtifactMap } from "../../types/artifact"; +import { Artifact } from "../../types/artifact"; import { Future, ModuleParameters } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; @@ -38,3 +38,7 @@ export type ReconciliationCheck = ( executionState: ExecutionState, context: ReconciliationContext ) => ReconciliationFutureResult; + +export interface ArtifactMap { + [futureId: string]: Artifact; +} diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 505cda8bed..33f3b24df3 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -13,16 +13,6 @@ export interface Artifact { >; } -/** - * A map of (contract) future id's to their respective artifact. - * Used in reconciliation. - * - * @beta - */ -export interface ArtifactMap { - [futureId: string]: Artifact; -} - /** * Retrieve artifacts based on contract name. * From 8c6ff7964ce6581c0976e93824dda64006521780 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 4 Jul 2023 21:27:01 -0400 Subject: [PATCH 0530/1302] fix inspect symbol bug --- packages/core/src/new-api/internal/module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 6563270f1b..aec272d0ca 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -23,7 +23,7 @@ import { SendDataFuture, } from "../types/module"; -const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom"); +const customInspectSymbol = Symbol.for("util.inspect.custom"); abstract class BaseFutureImplementation { public readonly dependencies: Set = new Set(); From 3148e2a0336b219b2467a082eb389c56756d6641 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 5 Jul 2023 19:07:56 -0400 Subject: [PATCH 0531/1302] fix existing tests --- .../core/src/new-api/internal/deployer.ts | 6 ++-- .../test/new-api/reconciliation/helpers.ts | 28 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 471d9df19c..b57541071a 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -76,9 +76,9 @@ export class Deployer { ); const contracts = getFuturesFromModule(module).filter(isContractFuture); - const contractStates = contracts.map( - (contract) => previousStateMap[contract.id] - ); + const contractStates = contracts + .map((contract) => previousStateMap[contract.id]) + .filter((v) => v !== undefined); // realistically this should be impossible to fail. // just need it here for the type inference diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index 3bb15de55a..2ecb3d2fb4 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -1,9 +1,14 @@ import { assert } from "chai"; +import { isContractFuture } from "../../../src"; import { ModuleConstructor } from "../../../src/new-api/internal/module-builder"; import { Reconciler } from "../../../src/new-api/internal/reconciliation/reconciler"; -import { ReconciliationResult } from "../../../src/new-api/internal/reconciliation/types"; +import { + ArtifactMap, + ReconciliationResult, +} from "../../../src/new-api/internal/reconciliation/types"; import { ExecutionStateMap } from "../../../src/new-api/internal/types/execution-state"; +import { getFuturesFromModule } from "../../../src/new-api/internal/utils/get-futures-from-module"; import { IgnitionModuleResult, ModuleParameters, @@ -35,11 +40,30 @@ export function reconcile( ]) ); + const contracts = getFuturesFromModule(module).filter(isContractFuture); + + const moduleArtifactMap: ArtifactMap = Object.fromEntries( + contracts.map((contract) => [ + contract.id, + { + contractName: contract.contractName, + abi: [], + bytecode: "0xaaaaaaaaaaa", + linkReferences: {}, + }, + ]) + ); + + // todo: make testable + const storedArtifactMap = moduleArtifactMap; + const reconiliationResult = Reconciler.reconcile( module, updatedExecutionStateMap, moduleParameters, - exampleAccounts + exampleAccounts, + moduleArtifactMap, + storedArtifactMap ); return reconiliationResult; From a5f7c9ee418aa328350fa6bef2b7bd4051ba72e4 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 11 Jul 2023 23:49:31 -0400 Subject: [PATCH 0532/1302] added some simple tests for artifact reconciliation --- .../test/new-api/reconciliation/helpers.ts | 9 +- .../test/new-api/reconciliation/reconciler.ts | 103 +++++++++++++++++- 2 files changed, 107 insertions(+), 5 deletions(-) diff --git a/packages/core/test/new-api/reconciliation/helpers.ts b/packages/core/test/new-api/reconciliation/helpers.ts index 2ecb3d2fb4..444e828409 100644 --- a/packages/core/test/new-api/reconciliation/helpers.ts +++ b/packages/core/test/new-api/reconciliation/helpers.ts @@ -26,7 +26,9 @@ export function reconcile( IgnitionModuleResult >, executionStateMap: ExecutionStateMap, - moduleParameters: { [key: string]: ModuleParameters } = {} + moduleParameters: { [key: string]: ModuleParameters } = {}, + moduleArtifactMap?: ArtifactMap, + storedArtifactMap?: ArtifactMap ): ReconciliationResult { const constructor = new ModuleConstructor(); const module = constructor.construct(moduleDefinition); @@ -42,7 +44,7 @@ export function reconcile( const contracts = getFuturesFromModule(module).filter(isContractFuture); - const moduleArtifactMap: ArtifactMap = Object.fromEntries( + moduleArtifactMap ??= Object.fromEntries( contracts.map((contract) => [ contract.id, { @@ -54,8 +56,7 @@ export function reconcile( ]) ); - // todo: make testable - const storedArtifactMap = moduleArtifactMap; + storedArtifactMap ??= moduleArtifactMap; const reconiliationResult = Reconciler.reconcile( module, diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 6891f6794c..3ea2449a17 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -1,6 +1,7 @@ import { assert } from "chai"; import { defineModule } from "../../../src/new-api/define-module"; +import { ArtifactMap } from "../../../src/new-api/internal/reconciliation/types"; import { DeploymentExecutionState, ExecutionStatus, @@ -8,7 +9,11 @@ import { import { FutureType } from "../../../src/new-api/types/module"; import { exampleAccounts } from "../helpers"; -import { assertSuccessReconciliation, reconcile } from "./helpers"; +import { + assertNoWarningsOrErrors, + assertSuccessReconciliation, + reconcile, +} from "./helpers"; describe("Reconciliation", () => { const exampleDeploymentState: DeploymentExecutionState = { @@ -379,4 +384,100 @@ describe("Reconciliation", () => { ]); }); }); + + describe("artifacts", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + + it("should reconcile unchanged bytecodes", () => { + const addr1 = exampleAddress; + + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleArtifactMap: ArtifactMap = { + "Module:Contract1": { + abi: [], + bytecode: "0xaaaaaa", + contractName: "Contract1", + linkReferences: {}, + }, + }; + + const storedArtifactMap: ArtifactMap = moduleArtifactMap; + + const reconciliationResult = reconcile( + moduleDefinition, + { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(), // no deps on last run + contractName: "Contract1", + contractAddress: addr1, + }, + }, + undefined, + moduleArtifactMap, + storedArtifactMap + ); + + assertNoWarningsOrErrors(reconciliationResult); + }); + + it("should not reconcile changed bytecodes", () => { + const addr1 = exampleAddress; + + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const moduleArtifactMap: ArtifactMap = { + "Module:Contract1": { + abi: [], + bytecode: "0xaaaaaa", + contractName: "Contract1", + linkReferences: {}, + }, + }; + + const storedArtifactMap: ArtifactMap = { + "Module:Contract1": { + abi: [], + bytecode: "0xbbbbbb", + contractName: "Contract1", + linkReferences: {}, + }, + }; + + const reconciliationResult = reconcile( + moduleDefinition, + { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(), // no deps on last run + contractName: "Contract1", + contractAddress: addr1, + }, + }, + undefined, + moduleArtifactMap, + storedArtifactMap + ); + + assert.deepStrictEqual(reconciliationResult.reconciliationFailures, [ + { + futureId: "Module:Contract1", + failure: "Artifact bytecodes have been changed", + }, + ]); + }); + }); }); From 0f526b62f73b8a7ed4e33050677998beb4f18d76 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 13 Jul 2023 18:57:13 -0300 Subject: [PATCH 0533/1302] Test artifact reconciliation with changed metadata --- .../test/new-api/reconciliation/reconciler.ts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 3ea2449a17..0eacc30f48 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -479,5 +479,65 @@ describe("Reconciliation", () => { }, ]); }); + + it("should reconcile bytecodes if only the metadata changed", () => { + const METADATA_LENGTH_SIZE_IN_HEX = 4; + const mainnetWethBytecode = + "0x6060604052600436106100af576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146100b9578063095ea7b31461014757806318160ddd146101a157806323b872dd146101ca5780632e1a7d4d14610243578063313ce5671461026657806370a082311461029557806395d89b41146102e2578063a9059cbb14610370578063d0e30db0146103ca578063dd62ed3e146103d4575b6100b7610440565b005b34156100c457600080fd5b6100cc6104dd565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561010c5780820151818401526020810190506100f1565b50505050905090810190601f1680156101395780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015257600080fd5b610187600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061057b565b604051808215151515815260200191505060405180910390f35b34156101ac57600080fd5b6101b461066d565b6040518082815260200191505060405180910390f35b34156101d557600080fd5b610229600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061068c565b604051808215151515815260200191505060405180910390f35b341561024e57600080fd5b61026460048080359060200190919050506109d9565b005b341561027157600080fd5b610279610b05565b604051808260ff1660ff16815260200191505060405180910390f35b34156102a057600080fd5b6102cc600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610b18565b6040518082815260200191505060405180910390f35b34156102ed57600080fd5b6102f5610b30565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561033557808201518184015260208101905061031a565b50505050905090810190601f1680156103625780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561037b57600080fd5b6103b0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bce565b604051808215151515815260200191505060405180910390f35b6103d2610440565b005b34156103df57600080fd5b61042a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610be3565b6040518082815260200191505060405180910390f35b34600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040518082815260200191505060405180910390a2565b60008054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156105735780601f1061054857610100808354040283529160200191610573565b820191906000526020600020905b81548152906001019060200180831161055657829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b60003073ffffffffffffffffffffffffffffffffffffffff1631905090565b600081600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101515156106dc57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580156107b457507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156108cf5781600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015151561084457600080fd5b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190509392505050565b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410151515610a2757600080fd5b80600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501515610ab457600080fd5b3373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b65826040518082815260200191505060405180910390a250565b600260009054906101000a900460ff1681565b60036020528060005260406000206000915090505481565b60018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b6000610bdb33848461068c565b905092915050565b60046020528160005260406000206020528060005260406000206000915091505054815600a165627a7a72305820deb4c2ccab3c2fdca32ab3f46728389c2fe2c165d5fafa07661e4e004f6c344a0029"; + // We modify the last two bytes before the metadata length + const mainnetWethWithModifiedMetadata = `${mainnetWethBytecode.substring( + 0, + mainnetWethBytecode.length - METADATA_LENGTH_SIZE_IN_HEX - 2 + )}00${mainnetWethBytecode.substring( + mainnetWethBytecode.length - METADATA_LENGTH_SIZE_IN_HEX + )}`; + + assert.notEqual(mainnetWethBytecode, mainnetWethWithModifiedMetadata); + + const addr1 = exampleAddress; + + const moduleDefinition = defineModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + return { contract1 }; + }); + + const storedArtifactMap: ArtifactMap = { + "Module:Contract1": { + abi: [], + bytecode: mainnetWethBytecode, + contractName: "Contract1", + linkReferences: {}, + }, + }; + + const moduleArtifactMap: ArtifactMap = { + "Module:Contract1": { + abi: [], + bytecode: mainnetWethWithModifiedMetadata, + contractName: "Contract1", + linkReferences: {}, + }, + }; + + const reconciliationResult = reconcile( + moduleDefinition, + { + "Module:Contract1": { + ...exampleDeploymentState, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(), // no deps on last run + contractName: "Contract1", + contractAddress: addr1, + }, + }, + undefined, + moduleArtifactMap, + storedArtifactMap + ); + + assertNoWarningsOrErrors(reconciliationResult); + }); }); }); From ff4509d9cc254ba9984edfba145a225f2d5b00f8 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 13 Jul 2023 18:57:27 -0300 Subject: [PATCH 0534/1302] Fix artifact reconciliation --- packages/core/src/new-api/internal/reconciliation/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 90c2e25e84..445dd9e533 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -61,6 +61,6 @@ export function getMetadataSectionLength(bytecode: Buffer): number { export function getBytecodeWithoutMetadata(bytecode: string): string { const bytecodeBuffer = Buffer.from(bytecode); return bytecodeBuffer - .slice(0, getMetadataSectionLength(bytecodeBuffer)) + .slice(0, bytecode.length - getMetadataSectionLength(bytecodeBuffer)) .toString(); } From 31d4a524916fd98a041f8f724fc59ca0bd8141b0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 14 Jul 2023 16:42:47 -0300 Subject: [PATCH 0535/1302] Parse the metadata cbor to ensure its valid --- package-lock.json | 14 ++++++-- packages/core/package.json | 1 + .../new-api/internal/reconciliation/utils.ts | 32 ++++++++++++++++--- 3 files changed, 40 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index ec178a6627..8a279aebbc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14810,8 +14810,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "dev": true, - "peer": true, "engines": { "node": ">=12.19" } @@ -21023,6 +21021,7 @@ "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", + "cbor": "^9.0.0", "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", @@ -21088,6 +21087,17 @@ "csstype": "^3.0.2" } }, + "packages/core/node_modules/cbor": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.0.tgz", + "integrity": "sha512-87cFgOKxjUOnGpNeQMBVER4Mc/rZAk9xC+Ygfx5FLCAUt/tpVHphuZC5fJmp/KSDsEsBEDIPtEt0YbD/GFQw8Q==", + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", "version": "0.0.13", diff --git a/packages/core/package.json b/packages/core/package.json index 23fc34928d..e32074256d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -90,6 +90,7 @@ }, "dependencies": { "@ethersproject/address": "5.6.1", + "cbor": "^9.0.0", "debug": "^4.3.2", "ethers": "^5.4.7", "fs-extra": "^10.0.0", diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 445dd9e533..df1e6545c5 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -1,3 +1,5 @@ +import type CborT from "cbor"; + import { AccountRuntimeValue, Future, @@ -54,13 +56,33 @@ export function addressToErrorString(potential: string | undefined) { } const METADATA_LENGTH = 2; -export function getMetadataSectionLength(bytecode: Buffer): number { +function getMetadataSectionLength(bytecode: Buffer): number { return bytecode.slice(-METADATA_LENGTH).readUInt16BE(0) + METADATA_LENGTH; } +function isValidMetadata(data: Buffer): boolean { + const { decode } = require("cbor") as typeof CborT; + try { + decode(data); + return true; + } catch (e) { + console.log(e); + return false; + } +} + export function getBytecodeWithoutMetadata(bytecode: string): string { - const bytecodeBuffer = Buffer.from(bytecode); - return bytecodeBuffer - .slice(0, bytecode.length - getMetadataSectionLength(bytecodeBuffer)) - .toString(); + const bytecodeBuffer = Buffer.from(bytecode.slice(2), "hex"); + const metadataSectionLength = getMetadataSectionLength(bytecodeBuffer); + + const metadataPayload = bytecodeBuffer.slice( + -metadataSectionLength, + -METADATA_LENGTH + ); + + if (isValidMetadata(metadataPayload)) { + return bytecodeBuffer.slice(0, -metadataSectionLength).toString("hex"); + } + + return bytecode; } From a20eb1f3135319af18b42ef2a3c659ebf3aa5580 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 17 Jul 2023 16:53:50 +0100 Subject: [PATCH 0536/1302] Update packages/core/src/new-api/internal/reconciliation/utils.ts --- packages/core/src/new-api/internal/reconciliation/utils.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index df1e6545c5..a3b0e3850d 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -66,7 +66,6 @@ function isValidMetadata(data: Buffer): boolean { decode(data); return true; } catch (e) { - console.log(e); return false; } } From f2bb27be103e59fdd4997f63ec3f77b1d2120821 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Jul 2023 12:24:51 +0100 Subject: [PATCH 0537/1302] refactor: switch to cross batch based execution Replace the inner-loop with a batch conscious execution. This involves splitting out each of the action executions into a construct tx and then send and monitor stage (for those actions that are transaction based). --- packages/core/src/new-api/deploy.ts | 13 +- .../core/src/new-api/internal/deployer.ts | 10 +- .../internal/execution/chain-dispatcher.ts | 160 +++ .../internal/execution/execution-engine.ts | 569 +++++++++-- .../internal/execution/execution-strategy.ts | 8 +- .../execution/executionStateReducer.ts | 16 +- .../src/new-api/internal/execution/guards.ts | 5 +- .../transactions/chain-dispatcher.ts | 88 -- .../transactions/transaction-service.ts | 381 ------- .../new-api/internal/journal/type-guards.ts | 40 +- .../internal/types/chain-dispatcher.ts | 50 + .../internal/types/execution-engine.ts | 8 +- packages/core/src/new-api/types/adapters.ts | 4 +- packages/core/src/new-api/types/journal.ts | 30 +- .../src/new-api/types/transaction-service.ts | 24 - .../new-api/execution/execution-engine.ts | 947 ++++++++++++++++-- .../core/test/new-api/execution/restart.ts | 28 +- packages/core/test/new-api/helpers.ts | 286 +++++- packages/core/test/new-api/wipe.ts | 28 +- .../hardhat-plugin/src/buildAdaptersFrom.ts | 12 +- 20 files changed, 1926 insertions(+), 781 deletions(-) create mode 100644 packages/core/src/new-api/internal/execution/chain-dispatcher.ts delete mode 100644 packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts delete mode 100644 packages/core/src/new-api/internal/execution/transactions/transaction-service.ts create mode 100644 packages/core/src/new-api/internal/types/chain-dispatcher.ts delete mode 100644 packages/core/src/new-api/types/transaction-service.ts diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 24fcca1168..31ece49536 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -1,8 +1,7 @@ import { Deployer } from "./internal/deployer"; import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemeral-deployment-loader"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; -import { EthersChainDispatcher } from "./internal/execution/transactions/chain-dispatcher"; -import { TransactionServiceImplementation } from "./internal/execution/transactions/transaction-service"; +import { ChainDispatcherImpl } from "./internal/execution/chain-dispatcher"; import { Adapters } from "./types/adapters"; import { ArtifactResolver } from "./types/artifact"; import { DeploymentResult } from "./types/deployer"; @@ -14,7 +13,7 @@ import { IgnitionModuleDefinition } from "./types/module-builder"; * * @beta */ -export function deploy({ +export async function deploy({ artifactResolver, adapters, deploymentDir, @@ -38,16 +37,12 @@ export function deploy({ ? new EphemeralDeploymentLoader(artifactResolver) : new FileDeploymentLoader(deploymentDir); - const transactionService = new TransactionServiceImplementation( - deploymentLoader, - adapters.signer, - new EthersChainDispatcher(adapters.gas, adapters.transactions) - ); + const chainDispatcher = new ChainDispatcherImpl(adapters); const deployer = new Deployer({ artifactResolver, - transactionService, deploymentLoader, + chainDispatcher, }); return deployer.deploy(moduleDefinition, deploymentParameters, accounts); diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index b57541071a..89ea5782d0 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -10,7 +10,6 @@ import { Artifact, ArtifactResolver } from "../types/artifact"; import { DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; -import { TransactionService } from "../types/transaction-service"; import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; @@ -20,6 +19,7 @@ import { ModuleConstructor } from "./module-builder"; import { Reconciler } from "./reconciliation/reconciler"; import { ArtifactMap } from "./reconciliation/types"; import { isContractExecutionStateArray } from "./type-guards"; +import { ChainDispatcher } from "./types/chain-dispatcher"; import { ExecutionStrategy } from "./types/execution-engine"; import { ContractAtExecutionState, @@ -38,21 +38,21 @@ import { validate } from "./validation/validate"; export class Deployer { private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; - private _transactionService: TransactionService; private _strategy: ExecutionStrategy; private _artifactResolver: ArtifactResolver; private _deploymentLoader: DeploymentLoader; + private _chainDispatcher: ChainDispatcher; constructor(options: { artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; - transactionService: TransactionService; + chainDispatcher: ChainDispatcher; }) { this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; this._deploymentLoader = options.deploymentLoader; - this._transactionService = options.transactionService; + this._chainDispatcher = options.chainDispatcher; this._moduleConstructor = new ModuleConstructor(); this._executionEngine = new ExecutionEngine(); @@ -114,7 +114,6 @@ export class Deployer { return this._executionEngine.execute({ strategy: this._strategy, - transactionService: this._transactionService, artifactResolver: this._artifactResolver, batches, module, @@ -122,6 +121,7 @@ export class Deployer { accounts, deploymentParameters, deploymentLoader: this._deploymentLoader, + chainDispatcher: this._chainDispatcher, }); } diff --git a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts new file mode 100644 index 0000000000..63363b7c8c --- /dev/null +++ b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts @@ -0,0 +1,160 @@ +import { Contract, ContractFactory, ethers } from "ethers"; + +import { Adapters } from "../../types/adapters"; +import { ArgumentType } from "../../types/module"; +import { ChainDispatcher } from "../types/chain-dispatcher"; +import { assertIgnitionInvariant } from "../utils/assertions"; + +import { AccountsState } from "./execution-engine"; + +export class ChainDispatcherImpl implements ChainDispatcher { + private _accountsState: AccountsState; + + constructor(private _adapters: Adapters) { + this._accountsState = {}; + } + + // TODO: should nonce management be separated out into its own + // class? + public async allocateNextNonceForAccount(address: string): Promise { + if (address in this._accountsState) { + const nextNonce = this._accountsState[address] + 1; + this._accountsState[address] = nextNonce; + return nextNonce; + } + + const onchainNonce = await this._getTransactionCount(address); + this._accountsState[address] = onchainNonce; + + return onchainNonce; + } + + public async constructDeployTransaction( + byteCode: string, + abi: any[], + args: ArgumentType[], + value: bigint, + from: string + ): Promise { + const signer: ethers.Signer = await this._adapters.signer.getSigner(from); + + const Factory = new ContractFactory(abi, byteCode, signer); + + const tx = Factory.getDeployTransaction(...args, { + value, + }); + + return tx; + } + + public async constructCallTransaction( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + value: bigint, + from: string + ): Promise { + const signer: ethers.Signer = await this._adapters.signer.getSigner(from); + + const contractInstance = new Contract(contractAddress, abi, signer); + + const unsignedTx: ethers.providers.TransactionRequest = + await contractInstance.populateTransaction[functionName](...args, { + value: BigInt(value), + from, + }); + + return unsignedTx; + } + + public async sendTx( + tx: ethers.providers.TransactionRequest, + from: string + ): Promise { + const signer = await this._adapters.signer.getSigner(from); + const response = await signer.sendTransaction(tx); + const txHash = response.hash; + + return txHash; + } + + public async getEventArgument( + eventName: string, + argumentName: string, + txToReadFrom: string, + eventIndex: number, + emitterAddress: string, + abi: any[] + ): Promise { + const contract = new Contract(emitterAddress, abi); + const filter = contract.filters[eventName](); + const eventNameTopic = filter.topics?.[0]; + + assertIgnitionInvariant(eventNameTopic !== undefined, "Unknown event name"); + + const receipt = await this._adapters.transactions.getTransactionReceipt( + txToReadFrom + ); + + // TODO: should this really return an error result + assertIgnitionInvariant( + receipt !== undefined && receipt !== null, + `Receipt must be available: ${txToReadFrom}` + ); + + const { logs } = receipt; + + // only keep the requested eventName and ensure they're from the emitter + const events = logs.filter( + (log) => + log.address === filter.address && log.topics[0] === eventNameTopic + ); + + // sanity check to ensure the eventIndex isn't out of range + if (events.length > 1 && eventIndex >= events.length) { + throw new Error( + `Given eventIndex '${eventIndex}' exceeds number of events emitted '${events.length}'` + ); + } + + // this works in combination with the check above + // because we default eventIndex to 0 if not set by user + const eventLog = events[eventIndex]; + + // parse the event through the emitter ABI and return the requested arg + const result = contract.interface.parseLog(eventLog).args[argumentName]; + + return ethers.BigNumber.isBigNumber(result) + ? BigInt(result.toString()) + : result; + } + + public async staticCallQuery( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ): Promise { + const signer: ethers.Signer = await this._adapters.signer.getSigner(from); + + const contractInstance = new Contract(contractAddress, abi, signer); + + const result = await contractInstance[functionName](...args, { + from, + }); + + return result; + } + + public async getTransactionReceipt( + txHash: string + ): Promise { + return this._adapters.transactions.getTransactionReceipt(txHash); + } + + private async _getTransactionCount(address: string): Promise { + return this._adapters.transactions.getTransactionCount(address); + } +} diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 630526755b..5088af343f 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,3 +1,4 @@ +import { ethers } from "ethers"; import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; @@ -6,11 +7,26 @@ import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; import { + CallFunctionInteractionMessage, + DeployContractInteractionMessage, ExecutionFailure, ExecutionResultMessage, + ExecutionSuccess, FutureStartMessage, JournalableMessage, - OnchainResultFailureMessage, + OnchainCallFunctionSuccessMessage, + OnchainContractAtSuccessMessage, + OnchainDeployContractSuccessMessage, + OnchainFailureMessage, + OnchainInteractionMessage, + OnchainReadEventArgumentSuccessMessage, + OnchainResultMessage, + OnchainSendDataSuccessMessage, + OnchainStaticCallSuccessMessage, + OnchainTransaction, + ReadEventArgumentInteractionMessage, + SendDataInteractionMessage, + StaticCallInteractionMessage, } from "../../types/journal"; import { AccountRuntimeValue, @@ -22,12 +38,7 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "../../types/module"; -import { - isFutureStartMessage, - isOnChainFailureMessage, - isOnChainSuccessMessage, - isWipeMessage, -} from "../journal/type-guards"; +import { isOnchainFailureMessage } from "../journal/type-guards"; import { isCallExecutionState, isContractAtExecutionState, @@ -35,16 +46,19 @@ import { isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; +import { ChainDispatcher } from "../types/chain-dispatcher"; import { ExecutionEngineState, ExecutionStrategyContext, } from "../types/execution-engine"; import { DeploymentExecutionState, + ExecutionState, ExecutionStateMap, ExecutionStatus, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; +import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { resolveFromAddress } from "../utils/resolve-from-address"; @@ -53,14 +67,26 @@ import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { executionStateReducer } from "./executionStateReducer"; import { + isCallFunctionInteraction, + isContractAtInteraction, + isDeployContractInteraction, isDeployedContractExecutionSuccess, isExecutionFailure, isExecutionResultMessage, - isOnChainAction, + isOnchainInteractionMessage, + isReadEventArgumentInteraction, + isSendDataInteraction, + isStaticCallInteraction, } from "./guards"; type ExecutionBatch = Future[]; +export interface AccountsState { + [key: string]: number; +} + +const DEFAULT_CONFIRMATIONS = 0; + export class ExecutionEngine { public async execute(state: ExecutionEngineState): Promise { const { batches, module } = state; @@ -105,73 +131,487 @@ export class ExecutionEngine { private async _executeBatch( batch: ExecutionBatch, state: ExecutionEngineState - ) { - return Promise.all( - batch.map((entry) => this._executeBatchEntry(entry, state)) - ); + ): Promise { + let batchResults: ExecutionResultMessage[] = []; + + // initialize all futures + // TODO: reconsider if this can be delayed until the first on-chain + // submission, to reduce restart state + // TODO: nonce check on initialization? + for (const future of batch) { + if (state.executionStateMap[future.id] !== undefined) { + continue; + } + + const initMessage: JournalableMessage = await this._initCommandFor( + future, + state + ); + + await this._apply(state, initMessage); + } + + while (!this._isBatchComplete(batch, state.executionStateMap)) { + const sortedFutures: Future[] = this._sortFuturesByExistingNonces(batch); + + const results = await this._submitOrCheckFutures( + sortedFutures, + state, + state.chainDispatcher + ); + + batchResults = [...batchResults, ...results]; + + if (this._isBatchComplete(sortedFutures, state.executionStateMap)) { + break; + } + + await this._newBlock(); + } + + return batchResults; } - private async _executeBatchEntry( - future: Future, - state: ExecutionEngineState - ): Promise { - let current: JournalableMessage = await this._initCommandFor(future, state); + private async _submitOrCheckFutures( + futures: Future[], + state: ExecutionEngineState, + chainDispatcher: ChainDispatcher + ): Promise { + const accumulatedResults: ExecutionResultMessage[] = []; + + for (const future of futures) { + const exState = state.executionStateMap[future.id]; + assertIgnitionInvariant( + exState !== undefined, + "Execution state should be defined" + ); + + if (this._isFutureComplete(future, state.executionStateMap)) { + continue; + } + + const result = await this._processFutureTick( + future, + exState, + state, + chainDispatcher + ); + + // if the current future has a pending transaction, + // continue with the batch + if (result === null) { + continue; + } + + accumulatedResults.push(result); + } - await this._apply(state, current); + return accumulatedResults; + } + + /** + * Wait for the next block to be processed on-chain + */ + private async _newBlock(): Promise { + // TODO: add in block check and deal with test vs real chains + return; + } + private async _processFutureTick( + future: Future, + exState: ExecutionState, + state: ExecutionEngineState, + chainDispatcher: ChainDispatcher + ): Promise { const context = this._setupExecutionStrategyContext(future, state); - const exectionStrategy = state.strategy.executeStrategy(context); - - const dependencies = Array.from(context.executionState.dependencies); - const deployedContracts = this._resolveDeployedContractsFrom(state); - - const libraries = Object.fromEntries( - dependencies - .filter((id) => deployedContracts[id] !== undefined) - .map((id) => { - const lib = deployedContracts[id]; - return [lib.contractName, lib.contractAddress]; - }) - ); + const strategy = state.strategy.executeStrategy(context); - while (!isExecutionResultMessage(current)) { - context.executionState = state.executionStateMap[future.id]; + let nextInput: OnchainResultMessage | null = null; + while (true) { + const onchainRequest: OnchainInteractionMessage | ExecutionSuccess = ( + await strategy.next(nextInput) + ).value; + await this._apply(state, onchainRequest); - if (isOnChainAction(current)) { - current = await state.transactionService.onchain(current, { - libraries, - }); - } else if (isOnChainSuccessMessage(current)) { - current = (await exectionStrategy.next(current)).value; - } else if (isOnChainFailureMessage(current)) { - current = this._convertToExecutionFailure(current); - } else if (isFutureStartMessage(current)) { - current = (await exectionStrategy.next(null)).value; - } else if (isWipeMessage(current)) { - // ignore - we should never get wipe messages - continue; - } else { - this._assertNeverJournalableMessage(current); + if (isExecutionResultMessage(onchainRequest)) { + return onchainRequest; } - await this._apply(state, current); + assertIgnitionInvariant( + isOnchainInteractionMessage(onchainRequest), + "Only onchain interaction requests expected" + ); + + if (isReadEventArgumentInteraction(onchainRequest)) { + const readEventArgResult: + | OnchainReadEventArgumentSuccessMessage + | OnchainFailureMessage = await this._readEventArg( + onchainRequest, + state + ); + + await this._apply(state, readEventArgResult); + + if (isOnchainFailureMessage(readEventArgResult)) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: future.id, + error: readEventArgResult.error, + }; + await this._apply(state, executionFailure); + + return executionFailure; + } + + nextInput = readEventArgResult; + } else if (isContractAtInteraction(onchainRequest)) { + const contractAtSuccess: OnchainContractAtSuccessMessage = { + type: "onchain-result", + subtype: "contract-at-success", + futureId: onchainRequest.futureId, + executionId: onchainRequest.executionId, + contractAddress: onchainRequest.contractAddress, + contractName: onchainRequest.contractName, + }; + + nextInput = contractAtSuccess; + } else if (isStaticCallInteraction(onchainRequest)) { + const staticCallResult: + | OnchainStaticCallSuccessMessage + | OnchainFailureMessage = await this._queryStaticCall( + onchainRequest, + state + ); + + await this._apply(state, staticCallResult); + + if (isOnchainFailureMessage(staticCallResult)) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: future.id, + error: staticCallResult.error, + }; + await this._apply(state, executionFailure); + + return executionFailure; + } + + nextInput = staticCallResult; + } else if ( + isDeployContractInteraction(onchainRequest) || + isSendDataInteraction(onchainRequest) || + isCallFunctionInteraction(onchainRequest) + ) { + const nonce = await chainDispatcher.allocateNextNonceForAccount( + onchainRequest.from + ); + + const tx = await this._convertRequestToTransaction( + onchainRequest, + state + ); + tx.nonce = nonce; + + let txHash: string; + try { + txHash = await chainDispatcher.sendTx(tx, onchainRequest.from); + } catch (error) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: future.id, + error: new Error( + error instanceof Error + ? "reason" in error + ? (error.reason as string) + : error.message + : "unknown error" + ), + }; + + await this._apply(state, executionFailure); + return executionFailure; + } + + // TODO: should this go before submission? Can we precalculate the hash? + const onchainTransaction: OnchainTransaction = { + type: "onchain-transaction", + futureId: future.id, + executionId: onchainRequest.executionId, + txHash, + nonce, + from: onchainRequest.from, + tx, + }; + await this._apply(state, onchainTransaction); + + const currentTransaction = await chainDispatcher.getTransactionReceipt( + txHash + ); + + if (currentTransaction === null || currentTransaction === undefined) { + // TODO: deal with dropped transactions + throw new IgnitionError("TBD: deal with dropped transaction"); + } + + if ( + currentTransaction.blockNumber === undefined || + // TODO: make default confirmations config + currentTransaction.confirmations < DEFAULT_CONFIRMATIONS + ) { + // transaction pending, move on with batch + return null; + } + + if (isDeployContractInteraction(onchainRequest)) { + const deployResult: OnchainDeployContractSuccessMessage = { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: future.id, + executionId: onchainRequest.executionId, + contractAddress: currentTransaction.contractAddress, + txId: currentTransaction.transactionHash, + }; + + await this._apply(state, deployResult); + nextInput = deployResult; + } else if (isSendDataInteraction(onchainRequest)) { + const sendDataResult: OnchainSendDataSuccessMessage = { + type: "onchain-result", + subtype: "send-data-success", + futureId: future.id, + executionId: onchainRequest.executionId, + txId: currentTransaction.transactionHash, + }; + + await this._apply(state, sendDataResult); + nextInput = sendDataResult; + } else if (isCallFunctionInteraction(onchainRequest)) { + const callFunctionResult: OnchainCallFunctionSuccessMessage = { + type: "onchain-result", + subtype: "call-function-success", + futureId: future.id, + executionId: onchainRequest.executionId, + txId: currentTransaction.transactionHash, + }; + + await this._apply(state, callFunctionResult); + nextInput = callFunctionResult; + } else { + this._assertNeverInteractionMessage(onchainRequest); + } + } else { + this._assertNeverInteractionMessage(onchainRequest); + } } + } - return current; + private _isBatchComplete( + sortedFutures: Future[], + executionStateMap: ExecutionStateMap + ): boolean { + return sortedFutures.every((f) => { + return this._isFutureComplete(f, executionStateMap); + }); } - private _assertNeverJournalableMessage(message: never) { - throw new IgnitionError(`Unrecognized message ${JSON.stringify(message)}`); + private _isFutureComplete( + future: Future, + executionStateMap: ExecutionStateMap + ) { + const state = executionStateMap[future.id]; + + return ( + state !== undefined && + (state.status === ExecutionStatus.HOLD || + state.status === ExecutionStatus.SUCCESS || + state.status === ExecutionStatus.FAILED) + ); } - private _convertToExecutionFailure( - current: OnchainResultFailureMessage - ): ExecutionFailure { - return { - type: "execution-failure", - futureId: current.futureId, - error: current.error, + private _sortFuturesByExistingNonces(futures: Future[]): Future[] { + // TODO: actually sort based on history against each execution state. + return futures; + } + + private async _convertRequestToTransaction( + request: OnchainInteractionMessage, + state: ExecutionEngineState + ) { + switch (request.subtype) { + case "contract-at": { + throw new IgnitionError( + "No transaction involved in contractAt request" + ); + } + case "read-event-arg": { + throw new IgnitionError( + "No transaction involved in readEventArg request" + ); + } + case "static-call": { + throw new IgnitionError( + "No transaction involved in staticCall request" + ); + } + case "call-function": { + return this._convertRequestToCallFunctionTransaction(request, state); + } + case "send-data": { + return this._convertRequestToSendDataTransaction(request, state); + } + case "deploy-contract": + return this._convertRequestToDeployTransaction(request, state); + } + } + + private async _convertRequestToCallFunctionTransaction( + request: CallFunctionInteractionMessage, + state: ExecutionEngineState + ): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + const contractAddress: string = request.contractAddress; + const abi = artifact.abi; + const functionName: string = request.functionName; + const args: ArgumentType[] = request.args; + const value: bigint = BigInt(request.value); + const from: string = request.from; + + const unsignedTx = state.chainDispatcher.constructCallTransaction( + contractAddress, + abi, + functionName, + args, + value, + from + ); + + return unsignedTx; + } + + private async _convertRequestToSendDataTransaction( + request: SendDataInteractionMessage, + _state: ExecutionEngineState + ): Promise { + const unsignedTx: ethers.providers.TransactionRequest = { + from: request.from, + to: request.to, + value: BigInt(request.value), + data: request.data, }; + + return unsignedTx; + } + + private async _convertRequestToDeployTransaction( + request: DeployContractInteractionMessage, + state: ExecutionEngineState + ): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + const abi = artifact.abi; + const args = request.args; + const value = BigInt(request.value); + const from = request.from; + + // TODO: fix libraries + const linkedByteCode = await collectLibrariesAndLink(artifact, {}); + + const tx = state.chainDispatcher.constructDeployTransaction( + linkedByteCode, + abi, + args, + value, + from + ); + + return tx; + } + + private async _readEventArg( + request: ReadEventArgumentInteractionMessage, + state: ExecutionEngineState + ): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + try { + const result = await state.chainDispatcher.getEventArgument( + request.eventName, + request.argumentName, + request.txToReadFrom, + request.eventIndex, + request.emitterAddress, + artifact.abi + ); + + return { + type: "onchain-result", + subtype: "read-event-arg-success", + futureId: request.futureId, + executionId: request.executionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId: request.futureId, + executionId: request.executionId, + error: + error instanceof Error + ? error + : new Error("Unknown read event arg error"), + }; + } + } + + private async _queryStaticCall( + request: StaticCallInteractionMessage, + state: ExecutionEngineState + ): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + try { + const result = await state.chainDispatcher.staticCallQuery( + request.contractAddress, + artifact.abi, + request.functionName, + request.args, + request.from + ); + + assertIgnitionInvariant( + result !== undefined, + "Static call result not available" + ); + + return { + type: "onchain-result", + subtype: "static-call-success", + futureId: request.futureId, + executionId: request.executionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId: request.futureId, + executionId: request.executionId, + error: + error instanceof Error + ? error + : new Error("Unknown static call error"), + }; + } } private async _apply( @@ -460,6 +900,7 @@ export class ExecutionEngine { to, from: resolveFromAddress(future.from, { accounts }), }; + return state; } case FutureType.NAMED_CONTRACT_AT: { @@ -678,11 +1119,17 @@ export class ExecutionEngine { ? exState.from ?? state.accounts[0] : undefined; - const context = { + const futureContext = { executionState: exState, sender, }; - return context; + return futureContext; + } + + private _assertNeverInteractionMessage(message: never) { + throw new IgnitionError( + `Unknown interaction message ${JSON.stringify(message)}` + ); } } diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index e7931f92a2..29b7e8ba2c 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -6,7 +6,7 @@ import { ContractAtInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, - JournalableMessage, + ExecutionSuccess, OnchainCallFunctionSuccessMessage, OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, @@ -56,7 +56,7 @@ export class BasicExecutionStrategy sender?: string; }): AsyncGenerator< OnchainInteractionMessage, - JournalableMessage, + OnchainInteractionMessage | ExecutionSuccess, OnchainResultMessage | null > { if (isDeploymentExecutionState(executionState)) { @@ -105,7 +105,7 @@ export class BasicExecutionStrategy "Sender must be defined for deployment execution" ); - const result = yield { + const deployContract: DeployContractInteractionMessage = { type: "onchain-action", subtype: "deploy-contract", futureId: deploymentExecutionState.id, @@ -117,6 +117,8 @@ export class BasicExecutionStrategy from: sender, }; + const result = yield deployContract; + if (result === null) { throw new IgnitionError("No result yielded"); } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/executionStateReducer.ts index 387a94e6a0..7367128165 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/executionStateReducer.ts @@ -21,10 +21,12 @@ import { } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; +import { isExecutionFailure } from "./guards"; + export function executionStateReducer( executionStateMap: ExecutionStateMap, action: JournalableMessage -) { +): ExecutionStateMap { if (isFutureStartMessage(action)) { return { ...executionStateMap, @@ -120,6 +122,18 @@ export function executionStateReducer( ); } + if (isExecutionFailure(action)) { + const failedExState = executionStateMap[action.futureId]; + + return { + ...executionStateMap, + [action.futureId]: { + ...failedExState, + status: ExecutionStatus.FAILED, + }, + }; + } + if (action.type === "onchain-action" || action.type === "onchain-result") { const previousExState = executionStateMap[action.futureId]; diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index bf2668dc61..1f66b60653 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -54,7 +54,10 @@ export function isOnchainInteractionMessage( return ( isDeployContractInteraction(potential) || isCallFunctionInteraction(potential) || - isStaticCallInteraction(potential) + isStaticCallInteraction(potential) || + isReadEventArgumentInteraction(potential) || + isSendDataInteraction(potential) || + isContractAtInteraction(potential) ); } diff --git a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts deleted file mode 100644 index 6679541ccb..0000000000 --- a/packages/core/src/new-api/internal/execution/transactions/chain-dispatcher.ts +++ /dev/null @@ -1,88 +0,0 @@ -import { ethers } from "ethers"; - -import { GasAdapter, TransactionsAdapter } from "../../../types/adapters"; - -interface TransactionSuccess { - type: "transaction-success"; - contractAddress?: string; - txId?: string; -} - -interface TransactionFailure { - type: "transaction-failure"; - error: Error; -} - -type TransactionReceipt = TransactionSuccess | TransactionFailure; - -export interface ChainDispatcher { - sendTx( - tx: ethers.providers.TransactionRequest, - signer: ethers.Signer - ): Promise; - getTxReceipt(txHash: string): Promise; -} - -/** - * Dispatch and interact with the blockchain. - * - * @beta - */ -export class EthersChainDispatcher implements ChainDispatcher { - constructor( - private _gasProvider: GasAdapter, - private _transactionProvider: TransactionsAdapter - ) {} - - public async sendTx( - tx: ethers.providers.TransactionRequest, - signer: ethers.Signer - ): Promise { - // if (txOptions?.gasLimit !== undefined) { - // tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); - // } - - // if (txOptions?.gasPrice !== undefined) { - // tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); - // } - - if (tx.gasLimit === undefined) { - const gasLimit = await this._gasProvider.estimateGasLimit(tx); - - tx.gasLimit = gasLimit; - } - - if (tx.gasPrice === undefined) { - const gasPrice = await this._gasProvider.estimateGasPrice(); - - tx.gasPrice = gasPrice; - } - try { - const response = await signer.sendTransaction(tx); - - const txHash = response.hash; - - const receipt = await this._transactionProvider.wait(txHash); - - return { - type: "transaction-success", - contractAddress: receipt.contractAddress, - txId: receipt.transactionHash, - }; - } catch (error) { - return { - type: "transaction-failure", - error: - error instanceof Error - ? error - : new Error("Unknown issue during `sendTx`"), - }; - } - } - - public async getTxReceipt( - txHash: string - ): Promise { - return this._transactionProvider.getTransactionReceipt(txHash); - } -} diff --git a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts b/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts deleted file mode 100644 index c34de5c3ad..0000000000 --- a/packages/core/src/new-api/internal/execution/transactions/transaction-service.ts +++ /dev/null @@ -1,381 +0,0 @@ -import { Contract, ContractFactory, ethers } from "ethers"; - -import { IgnitionError } from "../../../../errors"; -import { SignerAdapter } from "../../../types/adapters"; -import { DeploymentLoader } from "../../../types/deployment-loader"; -import { - CallFunctionInteractionMessage, - ContractAtInteractionMessage, - DeployContractInteractionMessage, - OnchainCallFunctionSuccessMessage, - OnchainContractAtSuccessMessage, - OnchainDeployContractSuccessMessage, - OnchainFailureMessage, - OnchainInteractionMessage, - OnchainReadEventArgumentSuccessMessage, - OnchainResultMessage, - OnchainSendDataSuccessMessage, - OnchainStaticCallSuccessMessage, - ReadEventArgumentInteractionMessage, - SendDataInteractionMessage, - StaticCallInteractionMessage, -} from "../../../types/journal"; -import { - TransactionService, - TransactionServiceOptions, -} from "../../../types/transaction-service"; -import { assertIgnitionInvariant } from "../../utils/assertions"; -import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; -import { - isCallFunctionInteraction, - isContractAtInteraction, - isDeployContractInteraction, - isReadEventArgumentInteraction, - isSendDataInteraction, - isStaticCallInteraction, -} from "../guards"; - -import { ChainDispatcher } from "./chain-dispatcher"; - -/** - * A service for managing on-chain interactions during the deployment. - * - * @beta - */ -export class TransactionServiceImplementation implements TransactionService { - constructor( - private _deploymentLoader: DeploymentLoader, - private _signerLoader: SignerAdapter, - private _chainDispatcher: ChainDispatcher - ) {} - - public async onchain( - interaction: OnchainInteractionMessage, - options?: TransactionServiceOptions - ): Promise { - if (isDeployContractInteraction(interaction)) { - return this._dispatchDeployContract(interaction, options?.libraries); - } - - if (isCallFunctionInteraction(interaction)) { - return this._dispatchCallFunction(interaction); - } - - if (isStaticCallInteraction(interaction)) { - return this._dispatchStaticCall(interaction); - } - - if (isReadEventArgumentInteraction(interaction)) { - return this._dispatchReadEventArgument(interaction); - } - - if (isSendDataInteraction(interaction)) { - return this._dispatchSendData(interaction); - } - - if (isContractAtInteraction(interaction)) { - return this._dispatchContractAt(interaction); - } - - throw new IgnitionError( - "Transaction service not implemented for this interaction" - ); - } - - private async _dispatchDeployContract( - deployContractInteraction: DeployContractInteractionMessage, - libraries: { [libraryName: string]: string } = {} - ): Promise { - const artifact = await this._deploymentLoader.loadArtifact( - deployContractInteraction.storedArtifactPath - ); - - const from = deployContractInteraction.from; - const args = deployContractInteraction.args; - const value = BigInt(deployContractInteraction.value); - - const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); - - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); - - const tx = Factory.getDeployTransaction(...args, { - value, - }); - - const result = await this._chainDispatcher.sendTx(tx, signer); - - if (result.type === "transaction-success") { - assertIgnitionInvariant( - result.contractAddress !== undefined, - "Contract address not available on receipt" - ); - - assertIgnitionInvariant( - result.txId !== undefined, - "Transaction hash not available on receipt" - ); - - return { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: deployContractInteraction.futureId, - executionId: deployContractInteraction.executionId, - contractAddress: result.contractAddress, - txId: result.txId, - }; - } else { - return { - type: "onchain-result", - subtype: "failure", - futureId: deployContractInteraction.futureId, - executionId: deployContractInteraction.executionId, - error: result.error, - }; - } - } - - private async _dispatchCallFunction({ - futureId, - executionId, - from, - args, - functionName, - contractAddress, - value, - storedArtifactPath, - }: CallFunctionInteractionMessage): Promise< - OnchainCallFunctionSuccessMessage | OnchainFailureMessage - > { - const artifact = await this._deploymentLoader.loadArtifact( - storedArtifactPath - ); - - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const contractInstance = new Contract( - contractAddress, - artifact.abi, - signer - ); - - const unsignedTx = await contractInstance.populateTransaction[functionName]( - ...args, - { value: BigInt(value), from: await signer.getAddress() } - ); - - const result = await this._chainDispatcher.sendTx(unsignedTx, signer); - - if (result.type === "transaction-success") { - assertIgnitionInvariant( - result.txId !== undefined, - "Transaction hash not available on receipt" - ); - - return { - type: "onchain-result", - subtype: "call-function-success", - futureId, - executionId, - txId: result.txId, - }; - } else { - return { - type: "onchain-result", - subtype: "failure", - futureId, - executionId, - error: result.error, - }; - } - } - - private async _dispatchStaticCall({ - futureId, - executionId, - from, - args, - functionName, - contractAddress, - storedArtifactPath, - }: StaticCallInteractionMessage): Promise< - OnchainStaticCallSuccessMessage | OnchainFailureMessage - > { - const artifact = await this._deploymentLoader.loadArtifact( - storedArtifactPath - ); - - try { - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const contractInstance = new Contract( - contractAddress, - artifact.abi, - signer - ); - - const result = await contractInstance[functionName](...args, { - from: await signer.getAddress(), - }); - - assertIgnitionInvariant( - result !== undefined, - "Static call result not available" - ); - - return { - type: "onchain-result", - subtype: "static-call-success", - futureId, - executionId, - result, - }; - } catch (error) { - return { - type: "onchain-result", - subtype: "failure", - futureId, - executionId, - error: - error instanceof Error - ? error - : new Error("Unknown static call error"), - }; - } - } - - private async _dispatchReadEventArgument({ - futureId, - executionId, - storedArtifactPath, - eventName, - argumentName, - txToReadFrom, - emitterAddress, - eventIndex, - }: ReadEventArgumentInteractionMessage): Promise< - OnchainReadEventArgumentSuccessMessage | OnchainFailureMessage - > { - const artifact = await this._deploymentLoader.loadArtifact( - storedArtifactPath - ); - - try { - const contract = new Contract(emitterAddress, artifact.abi); - const filter = contract.filters[eventName](); - const eventNameTopic = filter.topics?.[0]; - - assertIgnitionInvariant( - eventNameTopic !== undefined, - "Unknown event name" - ); - - const { logs } = await this._chainDispatcher.getTxReceipt(txToReadFrom); - - // only keep the requested eventName and ensure they're from the emitter - const events = logs.filter( - (log) => - log.address === filter.address && log.topics[0] === eventNameTopic - ); - - // sanity check to ensure the eventIndex isn't out of range - if (events.length > 1 && eventIndex >= events.length) { - throw new Error( - `Given eventIndex '${eventIndex}' exceeds number of events emitted '${events.length}'` - ); - } - - // this works in combination with the check above - // because we default eventIndex to 0 if not set by user - const eventLog = events[eventIndex]; - - // parse the event through the emitter ABI and return the requested arg - const result = contract.interface.parseLog(eventLog).args[argumentName]; - - return { - type: "onchain-result", - subtype: "read-event-arg-success", - futureId, - executionId, - result: ethers.BigNumber.isBigNumber(result) - ? result.toString() - : result, - }; - } catch (error) { - return { - type: "onchain-result", - subtype: "failure", - futureId, - executionId, - error: - error instanceof Error - ? error - : new Error("Unknown read event arg error"), - }; - } - } - - private async _dispatchSendData({ - futureId, - executionId, - from, - value, - data, - to, - }: SendDataInteractionMessage): Promise< - OnchainSendDataSuccessMessage | OnchainFailureMessage - > { - const signer: ethers.Signer = await this._signerLoader.getSigner(from); - - const unsignedTx: ethers.providers.TransactionRequest = { - from, - to, - value: BigInt(value), - data, - }; - - const result = await this._chainDispatcher.sendTx(unsignedTx, signer); - - if (result.type === "transaction-success") { - assertIgnitionInvariant( - result.txId !== undefined, - "Transaction hash not available on receipt" - ); - - return { - type: "onchain-result", - subtype: "send-data-success", - futureId, - executionId, - txId: result.txId, - }; - } else { - return { - type: "onchain-result", - subtype: "failure", - futureId, - executionId, - error: result.error, - }; - } - } - - private async _dispatchContractAt({ - futureId, - executionId, - contractAddress, - contractName, - }: ContractAtInteractionMessage): Promise< - OnchainContractAtSuccessMessage | OnchainFailureMessage - > { - return { - type: "onchain-result", - subtype: "contract-at-success", - futureId, - executionId, - contractAddress, - contractName, - }; - } -} diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index c24740f363..b3ca7ff169 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -7,12 +7,14 @@ import { OnchainCallFunctionSuccessMessage, OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, + OnchainFailureMessage, OnchainReadEventArgumentSuccessMessage, OnchainResultFailureMessage, OnchainResultMessage, OnchainResultSuccessMessage, OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, + OnchainTransaction, ReadEventArgumentStartMessage, SendDataStartMessage, StaticCallStartMessage, @@ -31,7 +33,10 @@ export function isFutureStartMessage( return ( isDeployContractStartMessage(potential) || isCallFunctionStartMessage(potential) || - isStaticCallStartMessage(potential) + isStaticCallStartMessage(potential) || + isReadEventArgumentStartMessage(potential) || + isSendDataStartMessage(potential) || + isContractAtStartMessage(potential) ); } @@ -90,9 +95,12 @@ export function isStaticCallStartMessage( * @beta */ export function isReadEventArgumentStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is ReadEventArgumentStartMessage { - return potential.futureType === FutureType.READ_EVENT_ARGUMENT; + return ( + potential.type === "execution-start" && + potential.futureType === FutureType.READ_EVENT_ARGUMENT + ); } /** @@ -101,9 +109,12 @@ export function isReadEventArgumentStartMessage( * @beta */ export function isSendDataStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is SendDataStartMessage { - return potential.futureType === FutureType.SEND_DATA; + return ( + potential.type === "execution-start" && + potential.futureType === FutureType.SEND_DATA + ); } /** @@ -112,14 +123,23 @@ export function isSendDataStartMessage( * @beta */ export function isContractAtStartMessage( - potential: FutureStartMessage + potential: JournalableMessage ): potential is ContractAtStartMessage { const deploymentTypes = [ FutureType.NAMED_CONTRACT_AT, FutureType.ARTIFACT_CONTRACT_AT, ]; - return deploymentTypes.includes(potential.futureType); + return ( + potential.type === "execution-start" && + deploymentTypes.includes(potential.futureType) + ); +} + +export function isOnchainTransaction( + message: JournalableMessage +): message is OnchainTransaction { + return message.type === "onchain-transaction"; } export function isOnChainResultMessage( @@ -198,6 +218,12 @@ export function isOnchainContractAtSuccessMessage( ); } +export function isOnchainFailureMessage( + message: JournalableMessage +): message is OnchainFailureMessage { + return isOnChainResultMessage(message) && message.subtype === "failure"; +} + export function isWipeMessage( potential: JournalableMessage ): potential is WipeMessage { diff --git a/packages/core/src/new-api/internal/types/chain-dispatcher.ts b/packages/core/src/new-api/internal/types/chain-dispatcher.ts new file mode 100644 index 0000000000..cbdf62ac53 --- /dev/null +++ b/packages/core/src/new-api/internal/types/chain-dispatcher.ts @@ -0,0 +1,50 @@ +import { ethers } from "ethers"; + +import { ArgumentType } from "../../types/module"; + +export interface ChainDispatcher { + allocateNextNonceForAccount(address: string): Promise; + + constructDeployTransaction( + byteCode: string, + abi: any[], + args: ArgumentType[], + value: bigint, + from: string + ): Promise; + + constructCallTransaction( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + value: bigint, + from: string + ): Promise; + + sendTx( + tx: ethers.providers.TransactionRequest, + from: string + ): Promise; + + staticCallQuery( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ): Promise; + + getTransactionReceipt( + txHash: string + ): Promise; + + getEventArgument( + eventName: string, + argumentName: string, + txToReadFrom: string, + eventIndex: number, + emitterAddress: string, + abi: any[] + ): Promise; +} diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index dcf7c3ce88..6e6f908f65 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,7 +1,7 @@ import { ArtifactResolver } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; import { - JournalableMessage, + ExecutionSuccess, OnchainInteractionMessage, OnchainResultMessage, } from "../../types/journal"; @@ -10,8 +10,8 @@ import { IgnitionModuleResult, ModuleParameters, } from "../../types/module"; -import { TransactionService } from "../../types/transaction-service"; +import { ChainDispatcher } from "./chain-dispatcher"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; export interface ExecutionEngineState { @@ -21,9 +21,9 @@ export interface ExecutionEngineState { accounts: string[]; deploymentParameters: { [key: string]: ModuleParameters }; strategy: ExecutionStrategy; - transactionService: TransactionService; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; + chainDispatcher: ChainDispatcher; } export interface ExecutionStrategyContext { @@ -37,7 +37,7 @@ export interface ExecutionStrategy { sender, }: ExecutionStrategyContext) => AsyncGenerator< OnchainInteractionMessage, - JournalableMessage, + OnchainInteractionMessage | ExecutionSuccess, OnchainResultMessage | null >; } diff --git a/packages/core/src/new-api/types/adapters.ts b/packages/core/src/new-api/types/adapters.ts index 47cbc921e0..5f29c36d0c 100644 --- a/packages/core/src/new-api/types/adapters.ts +++ b/packages/core/src/new-api/types/adapters.ts @@ -38,8 +38,8 @@ export interface GasAdapter { * @beta */ export interface TransactionsAdapter { - wait(txHash: string): Promise; + getTransactionCount(address: string): Promise; getTransactionReceipt( txHash: string - ): Promise; + ): Promise; } diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index c49e35fc08..85e89e0794 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -30,6 +30,7 @@ export type JournalableMessage = */ export type TransactionMessage = | OnchainInteractionMessage + | OnchainTransaction | OnchainResultMessage; // #region "OnchainInteraction" @@ -150,6 +151,25 @@ export interface ContractAtInteractionMessage { // #endregion +// #region "OnchainTransaction" + +/** + * Records a transaction submission to the chain. + * + * @beta + */ +export interface OnchainTransaction { + type: "onchain-transaction"; + futureId: string; + executionId: number; + txHash: string; + from: string; + nonce: number; + tx: any; +} + +// #endregion + // #region "OnchainResult" /** @@ -413,16 +433,6 @@ export interface ContractAtStartMessage { contractAddress: string; } -/** - * A journal message to indicate a future is being restarted. - * - * @beta - */ -export interface FutureRestartMessage { - type: "execution-restart"; - futureId: string; -} - // #endregion // #region "ExecutionResult" diff --git a/packages/core/src/new-api/types/transaction-service.ts b/packages/core/src/new-api/types/transaction-service.ts deleted file mode 100644 index b4e51e14d8..0000000000 --- a/packages/core/src/new-api/types/transaction-service.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { OnchainInteractionMessage, OnchainResultMessage } from "./journal"; - -/** - * A service for managing on-chain interactions as part of the deployment. - * - * @beta - */ -export interface TransactionService { - onchain( - interaction: OnchainInteractionMessage, - options?: TransactionServiceOptions - ): Promise; -} - -/** - * Additional data needed to support various transaction types. - * - * @beta - */ -export interface TransactionServiceOptions { - libraries?: { - [libraryName: string]: string; - }; -} diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index cf3248201a..fc51d19a7b 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -3,7 +3,10 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; -import { DeployContractStartMessage } from "../../../src/new-api/types/journal"; +import { + DeployContractStartMessage, + JournalableMessage, +} from "../../../src/new-api/types/journal"; import { accumulateMessages, assertDeploymentFailure, @@ -17,6 +20,7 @@ describe("execution engine", () => { const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; const accounts = exampleAccounts; const txId = "0x123"; + const diffTxId = "0x456"; const contractWithThreeArgConstructorArtifact = { abi: [ @@ -69,14 +73,12 @@ describe("execution engine", () => { Contract1: contractWithThreeArgConstructorArtifact, }, transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, + transactionHash: txId, }, }, }, @@ -134,6 +136,18 @@ describe("execution engine", () => { storedArtifactPath: "Module1:Contract1.json", from: accounts[1], }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, { type: "onchain-result", subtype: "deploy-contract-success", @@ -165,16 +179,13 @@ describe("execution engine", () => { const deployer = setupDeployerWithMocks({ journal, - transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "failure", - futureId: "Module1:Contract1", - executionId: 1, - error: new Error( - "Cannot estimate gas; transaction may fail or may require manual gas limit" - ), + sendErrors: { + [accounts[1]]: { + 0: () => { + const error = new Error(""); + (error as any).reason = + "Cannot estimate gas; transaction may fail or may require manual gas limit"; + throw error; }, }, }, @@ -216,15 +227,6 @@ describe("execution engine", () => { from: accounts[1], storedArtifactPath: "Module1:Contract1.json", }, - { - type: "onchain-result", - subtype: "failure", - futureId: "Module1:Contract1", - executionId: 1, - error: new Error( - "Cannot estimate gas; transaction may fail or may require manual gas limit" - ), - }, { type: "execution-failure", futureId: "Module1:Contract1", @@ -248,14 +250,12 @@ describe("execution engine", () => { const deployer = setupDeployerWithMocks({ journal, transactionResponses: { - "Module1:Library1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Library1", - executionId: 1, + [accounts[2]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, + transactionHash: txId, }, }, }, @@ -299,6 +299,18 @@ describe("execution engine", () => { storedArtifactPath: "Module1:Library1.json", from: accounts[2], }, + { + type: "onchain-transaction", + futureId: "Module1:Library1", + executionId: 1, + from: accounts[2], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", + }, { type: "onchain-result", subtype: "deploy-contract-success", @@ -340,14 +352,12 @@ describe("execution engine", () => { const deployer = setupDeployerWithMocks({ journal, transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, + [accounts[2]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, + transactionHash: txId, }, }, }, @@ -378,7 +388,10 @@ describe("execution engine", () => { constructorArgs: [], libraries: {}, from: accounts[2], - } as Omit as any, + } as Omit< + DeployContractStartMessage, + "storedBuildInfoPath" + > as any as JournalableMessage, { type: "onchain-action", subtype: "deploy-contract", @@ -390,6 +403,18 @@ describe("execution engine", () => { from: accounts[2], storedArtifactPath: "Module1:Contract1.json", }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[2], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", + }, { type: "onchain-result", subtype: "deploy-contract-success", @@ -409,51 +434,34 @@ describe("execution engine", () => { ]); }); - describe("with complex arguments", () => { - it("should execute deploy when futures are passed as nested arguments", async () => { + describe("send data", () => { + it("should execute a send data", async () => { + const journal = new MemoryJournal(); + const moduleDefinition = defineModule("Module1", (m) => { const account1 = m.getAccount(1); - const supply = m.getParameter("supply", 1000); - const library1 = m.library("Library1", { from: account1 }); + const contract1 = m.contract("Contract1", [], { from: account1 }); - const contract1 = m.contract( - "Contract1", - [{ nested: library1, arr: [account1, supply] }], - { - libraries: { - Library1: library1, - }, - from: account1, - } - ); + m.send("test-send", contract1, 123n, undefined, { from: account1 }); - return { library1, contract1 }; + return { contract1 }; }); - const journal = new MemoryJournal(); - const deployer = setupDeployerWithMocks({ journal, transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, + transactionHash: txId, }, - }, - "Module1:Library1": { 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Library1", - executionId: 1, - contractAddress: differentAddress, - txId, + blockNumber: 1, + confirmations: 1, + transactionHash: diffTxId, }, }, }, @@ -468,13 +476,8 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Contract1": { contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", contractAddress: exampleAddress, - }, - "Module1:Library1": { - contractName: "Library1", - storedArtifactPath: "Module1:Library1.json", - contractAddress: differentAddress, + storedArtifactPath: "Module1:Contract1.json", }, }); @@ -482,14 +485,14 @@ describe("execution engine", () => { assert.deepStrictEqual(journalMessages, [ { - futureId: "Module1:Library1", + futureId: "Module1:Contract1", type: "execution-start", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Library1.json", + storedArtifactPath: "Module1:Contract1.json", storedBuildInfoPath: "build-info-12345.json", - contractName: "Library1", + contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], libraries: {}, @@ -498,49 +501,159 @@ describe("execution engine", () => { { type: "onchain-action", subtype: "deploy-contract", - futureId: "Module1:Library1", + futureId: "Module1:Contract1", executionId: 1, - contractName: "Library1", + contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Library1.json", + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { type: "onchain-result", subtype: "deploy-contract-success", - futureId: "Module1:Library1", + futureId: "Module1:Contract1", executionId: 1, - contractAddress: differentAddress, + contractAddress: exampleAddress, txId, }, { type: "execution-success", subtype: "deploy-contract", - futureId: "Module1:Library1", - contractName: "Library1", - contractAddress: differentAddress, + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, txId, }, + { + type: "execution-start", + futureType: FutureType.SEND_DATA, + futureId: "Module1:test-send", + strategy: "basic", + dependencies: ["Module1:Contract1"], + data: "0x", + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-action", + subtype: "send-data", + futureId: "Module1:test-send", + data: "0x", + executionId: 1, + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-transaction", + futureId: "Module1:test-send", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + from: accounts[1], + nonce: 1, + to: exampleAddress, + data: "0x", + value: BigInt(123), + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", + }, + { + type: "onchain-result", + subtype: "send-data-success", + futureId: "Module1:test-send", + executionId: 1, + txId: diffTxId, + }, + { + type: "execution-success", + subtype: "send-data", + futureId: "Module1:test-send", + txId: diffTxId, + }, + ]); + }); + + it.skip("should record a revert of send data"); + }); + + describe("call function", () => { + it("should execute a call", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.call(contract1, "configure", [1, "b", false], { from: account1 }); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + 1: { + blockNumber: 1, + confirmations: 1, + transactionHash: diffTxId, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ { futureId: "Module1:Contract1", type: "execution-start", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", - dependencies: ["Module1:Library1"], + dependencies: [], storedArtifactPath: "Module1:Contract1.json", storedBuildInfoPath: "build-info-12345.json", contractName: "Contract1", value: BigInt(0).toString(), - constructorArgs: [ - { - arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], - nested: differentAddress, - }, - ], - libraries: { - Library1: "Module1:Library1", - }, + constructorArgs: [], + libraries: {}, from: accounts[1], }, { @@ -549,15 +662,22 @@ describe("execution engine", () => { futureId: "Module1:Contract1", executionId: 1, contractName: "Contract1", - args: [ - { - nested: differentAddress, - arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], - }, - ], + args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", - from: exampleAccounts[1], + from: accounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { type: "onchain-result", @@ -575,6 +695,615 @@ describe("execution engine", () => { contractAddress: exampleAddress, txId, }, + { + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_CALL, + futureId: "Module1:Contract1#configure", + strategy: "basic", + dependencies: ["Module1:Contract1"], + args: [1, "b", false], + contractAddress: exampleAddress, + from: accounts[1], + functionName: "configure", + storedArtifactPath: "Module1:Contract1.json", + value: "0", + }, + { + type: "onchain-action", + subtype: "call-function", + args: [1, "b", false], + contractAddress: exampleAddress, + executionId: 1, + functionName: "configure", + futureId: "Module1:Contract1#configure", + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + value: "0", + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1#configure", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + _kind: "TEST-CALL-TRANSACTION", + nonce: 1, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", + }, + { + type: "onchain-result", + subtype: "call-function-success", + futureId: "Module1:Contract1#configure", + executionId: 1, + txId: diffTxId, + }, + { + type: "execution-success", + subtype: "call-function", + futureId: "Module1:Contract1#configure", + contractAddress: exampleAddress, + functionName: "configure", + txId: diffTxId, + }, + ]); + }); + + it.skip("should record a revert of call function"); + }); + + describe("static call", () => { + it("should execute a static call", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.staticCall(contract1, "test", [1, "b", false], { from: account1 }); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + }, + }, + staticCall: async (contractAddress, _abi, functionName) => { + assert.equal(contractAddress, exampleAddress); + assert.equal(functionName, "test"); + + return "example_static_call_result"; + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-start", + futureType: FutureType.NAMED_STATIC_CALL, + futureId: "Module1:Contract1#test", + strategy: "basic", + dependencies: ["Module1:Contract1"], + args: [1, "b", false], + contractAddress: exampleAddress, + from: accounts[1], + functionName: "test", + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-action", + subtype: "static-call", + args: [1, "b", false], + contractAddress: exampleAddress, + executionId: 1, + functionName: "test", + futureId: "Module1:Contract1#test", + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-result", + subtype: "static-call-success", + futureId: "Module1:Contract1#test", + executionId: 1, + result: "example_static_call_result", + }, + { + type: "execution-success", + subtype: "static-call", + futureId: "Module1:Contract1#test", + contractAddress: exampleAddress, + functionName: "test", + result: "example_static_call_result", + }, + ]); + }); + + it.skip("should record a revert of call function"); + }); + + describe("contract at", () => { + it("should execute a contract at", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const contract1 = m.contractAt("Contract1", exampleAddress); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_AT, + futureId: "Module1:Contract1", + strategy: "basic", + contractAddress: exampleAddress, + contractName: "Contract1", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + }, + { + type: "onchain-action", + subtype: "contract-at", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "execution-success", + subtype: "contract-at", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + }, + ]); + }); + }); + + describe("read event arg", () => { + it("should execute a read event arg", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.readEventArgument(contract1, "EventName1", "arg1"); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + logs: { here: "example" }, + }, + }, + }, + getEventArgument: async ( + eventName: string, + argumentName: string, + txToReadFrom: string + ) => { + assert.equal(eventName, "EventName1"); + assert.equal(argumentName, "arg1"); + assert.equal(txToReadFrom, txId); + + return "event-arg-value"; + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + + { + type: "execution-start", + futureType: FutureType.READ_EVENT_ARGUMENT, + strategy: "basic", + dependencies: ["Module1:Contract1"], + futureId: "Module1:Contract1#EventName1#arg1#0", + eventName: "EventName1", + argumentName: "arg1", + eventIndex: 0, + emitterAddress: exampleAddress, + txToReadFrom: txId, + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-action", + subtype: "read-event-arg", + futureId: "Module1:Contract1#EventName1#arg1#0", + executionId: 1, + eventName: "EventName1", + argumentName: "arg1", + eventIndex: 0, + emitterAddress: exampleAddress, + txToReadFrom: txId, + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-result", + subtype: "read-event-arg-success", + futureId: "Module1:Contract1#EventName1#arg1#0", + executionId: 1, + result: "event-arg-value", + }, + { + type: "execution-success", + subtype: "read-event-arg", + futureId: "Module1:Contract1#EventName1#arg1#0", + eventName: "EventName1", + argumentName: "arg1", + result: "event-arg-value", + }, + ]); + }); + + it.skip("should record a revert of a read event arg"); + }); + + describe("with complex arguments", () => { + it("should execute deploy when futures are passed as nested arguments", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const supply = m.getParameter("supply", 1000); + + const library1 = m.library("Library1", { from: account1 }); + + const contract1 = m.contract( + "Contract1", + [{ nested: library1, arr: [account1, supply] }], + { + libraries: { + Library1: library1, + }, + from: account1, + } + ); + + return { library1, contract1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: differentAddress, + transactionHash: txId, + }, + 1: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: diffTxId, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + contractAddress: exampleAddress, + }, + "Module1:Library1": { + contractName: "Library1", + storedArtifactPath: "Module1:Library1.json", + contractAddress: differentAddress, + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Library1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Library1", + executionId: 1, + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Library1.json", + from: accounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Library1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Library1", + executionId: 1, + contractAddress: differentAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Library1", + contractName: "Library1", + contractAddress: differentAddress, + txId, + }, + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: ["Module1:Library1"], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [ + { + arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + nested: differentAddress, + }, + ], + libraries: { + Library1: "Module1:Library1", + }, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [ + { + nested: differentAddress, + arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + }, + ], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: exampleAccounts[1], + }, + { + type: "onchain-transaction", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 1, + }, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId: diffTxId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId: diffTxId, + }, ]); }); }); diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index 4744ff311b..045963b1bc 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -56,14 +56,12 @@ describe("execution engine", () => { artifacts: { Contract1: contractWithOneArgConstructorArtifact, }, - transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "failure", - futureId: "Module1:Contract1", - executionId: 1, - error: new Error("EVM revert"), + sendErrors: { + [exampleAccounts[0]]: { + 0: () => { + const error = new Error("EVM revert"); + (error as any).reason = "EVM revert"; + throw error; }, }, }, @@ -89,15 +87,13 @@ describe("execution engine", () => { Contract1: contractWithOneArgConstructorArtifact, }, transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, + [exampleAccounts[0]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, - }, + transactionHash: txId, + } as any, }, }, }); diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index d391a72e9b..4868eff36a 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,20 +1,19 @@ import { assert } from "chai"; +import ethers from "ethers"; import { + ArgumentType, Artifact, ArtifactResolver, DeploymentResultContracts, } from "../../src"; import { Deployer } from "../../src/new-api/internal/deployer"; +import { AccountsState } from "../../src/new-api/internal/execution/execution-engine"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; +import { ChainDispatcher } from "../../src/new-api/internal/types/chain-dispatcher"; import { DeploymentResult } from "../../src/new-api/types/deployer"; import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; -import { - Journal, - JournalableMessage, - OnchainResultMessage, -} from "../../src/new-api/types/journal"; -import { TransactionService } from "../../src/new-api/types/transaction-service"; +import { Journal, JournalableMessage } from "../../src/new-api/types/journal"; export const exampleAccounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", @@ -70,45 +69,29 @@ export function setupMockArtifactResolver(artifacts?: { } export function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { + const storedArtifacts: { [key: string]: Artifact } = {}; + return { journal, recordDeployedAddress: async () => {}, - storeArtifact: async (futureId, _artifact) => { - return `${futureId}.json`; + storeArtifact: async (futureId, artifact) => { + const storedArtifactPath = `${futureId}.json`; + + storedArtifacts[storedArtifactPath] = artifact; + + return storedArtifactPath; }, storeBuildInfo: async (buildInfo) => { return `build-info-${buildInfo.id}.json`; }, - loadArtifact: async (_storedArtifactPath) => { - throw new Error("Not implemented"); - }, - }; -} - -export function setupMockTransactionService({ - responses, -}: { - responses: { [key: string]: { [key: number]: OnchainResultMessage } }; -}): TransactionService { - return { - onchain: async (request) => { - const futureResults = responses[request.futureId]; - - if (futureResults === undefined) { - throw new Error( - `Mock transaction service has no results recorded for future ${request.futureId}` - ); - } + loadArtifact: async (storedArtifactPath) => { + const artifact = storedArtifacts[storedArtifactPath]; - const transactionResult = futureResults[request.executionId]; - - if (transactionResult === undefined) { - throw new Error( - `Mock transaction service has no results recorded for transaction ${request.futureId}/${request.executionId}` - ); + if (artifact === undefined) { + throw new Error(`Artifact not stored for ${storedArtifactPath}`); } - return transactionResult; + return artifact; }, }; } @@ -117,23 +100,53 @@ export function setupDeployerWithMocks({ journal = new MemoryJournal(), artifacts, transactionResponses, + sendErrors, + staticCall, + getEventArgument, }: { journal?: Journal; artifacts?: { [key: string]: Artifact }; transactionResponses?: { - [key: string]: { [key: number]: OnchainResultMessage }; + [key: string]: { + [key: number]: { + blockNumber: number; + confirmations: number; + contractAddress?: string; + transactionHash: string; + logs?: {}; + }; + }; }; + sendErrors?: { [key: string]: { [key: number]: () => void } }; + staticCall?: ( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ) => Promise; + getEventArgument?: ( + eventName: string, + argumentName: string, + txToReadFrom: string, + eventIndex: number, + emitterAddress: string, + abi: any[] + ) => Promise; }): Deployer { const mockArtifactResolver = setupMockArtifactResolver(artifacts); const mockDeploymentLoader = setupMockDeploymentLoader(journal); - const mockTransactionService = setupMockTransactionService({ - responses: transactionResponses ?? {}, + const mockChainDispatcher = setupMockChainDispatcher({ + responses: transactionResponses, + sendErrors, + staticCall, + getEventArgument, }); return new Deployer({ artifactResolver: mockArtifactResolver, deploymentLoader: mockDeploymentLoader, - transactionService: mockTransactionService, + chainDispatcher: mockChainDispatcher, }); } @@ -176,3 +189,198 @@ export function assertDeploymentSuccess( assert.deepStrictEqual(result.contracts, expectedContracts); } + +export function setupMockChainDispatcher({ + responses = {}, + sendErrors = {}, + staticCall, + getEventArgument, +}: { + responses?: { + [key: string]: { + [key: number]: { + blockNumber: number; + confirmations: number; + contractAddress?: string; + transactionHash: string; + logs?: {}; + }; + }; + }; + sendErrors?: { [key: string]: { [key: number]: () => void } }; + staticCall?: ( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ) => Promise; + getEventArgument?: ( + _eventName: string, + _argumentName: string, + _txToReadFrom: string, + _eventIndex: number, + _emitterAddress: string, + _abi: any[] + ) => Promise; +}): ChainDispatcher { + return new MockChainDispatcher( + responses, + sendErrors, + staticCall, + getEventArgument + ); +} + +export class MockChainDispatcher implements ChainDispatcher { + private _accountsState: AccountsState; + private _sentTxs: { [key: string]: ethers.providers.TransactionRequest }; + + constructor( + private _responses: { + [key: string]: { + [key: number]: { + blockNumber: number; + confirmations: number; + contractAddress?: string; + transactionHash: string; + logs?: {}; + }; + }; + }, + private _sendErrors: { [key: string]: { [key: number]: () => void } }, + private _staticCall?: ( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ) => Promise, + private _getEventArgument?: ( + _eventName: string, + _argumentName: string, + _txToReadFrom: string, + _eventIndex: number, + _emitterAddress: string, + _abi: any[] + ) => Promise + ) { + this._accountsState = {}; + this._sentTxs = {}; + } + + public getEventArgument( + eventName: string, + argumentName: string, + txToReadFrom: string, + eventIndex: number, + emitterAddress: string, + abi: any[] + ): Promise { + if (this._getEventArgument === undefined) { + throw new Error( + "getEventArgument called but no `getEventArgument` mock provided" + ); + } + + return this._getEventArgument( + eventName, + argumentName, + txToReadFrom, + eventIndex, + emitterAddress, + abi + ); + } + + public async staticCallQuery( + contractAddress: string, + abi: any[], + functionName: string, + args: ArgumentType[], + from: string + ): Promise { + if (this._staticCall === undefined) { + return "default-test-static-call-result"; + } + + return this._staticCall(contractAddress, abi, functionName, args, from); + } + + public constructDeployTransaction( + _byteCode: string, + _abi: any[], + _args: ArgumentType[], + _value: bigint, + _from: string + ): Promise { + const fakeTransaction = { _kind: "TEST-TRANSACTION" } as any; + + return fakeTransaction; + } + + public constructCallTransaction( + _contractAddress: string, + _abi: any[], + _functionName: string, + _args: ArgumentType[], + _value: bigint, + _from: string + ): Promise { + const fakeTransaction = { _kind: "TEST-CALL-TRANSACTION" } as any; + + return fakeTransaction; + } + + public async allocateNextNonceForAccount(address: string): Promise { + if (address in this._accountsState) { + const nextNonce = this._accountsState[address] + 1; + this._accountsState[address] = nextNonce; + return nextNonce; + } + + const onchainNonce = 0; + this._accountsState[address] = onchainNonce; + + return onchainNonce; + } + + public async sendTx( + tx: ethers.providers.TransactionRequest, + from: string + ): Promise { + if ( + from in this._sendErrors && + Number(tx.nonce) in this._sendErrors[from] + ) { + this._sendErrors[from][Number(tx.nonce)](); + } + + const hash = `${from}--${tx.nonce?.toString() ?? "no-nonce"}`; + this._sentTxs[hash] = tx; + + return hash; + } + + public async getTransactionReceipt( + txHash: string + ): Promise { + const [from, nonce] = txHash.split("--"); + + const addressEntries = this._responses[from]; + + if (addressEntries === undefined) { + throw new Error(`No transaction responses recorded for address ${from}`); + } + + const response = addressEntries[parseInt(nonce, 10)]; + + if (response === undefined) { + throw new Error( + `No transaction responses recorded for nonce ${from}/${nonce}` + ); + } + + return response as any; + } +} diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index 5d878c73c3..bb1ffee495 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -39,23 +39,21 @@ describe("wipe", () => { const deployer = setupDeployerWithMocks({ journal, transactionResponses: { - "Module1:Contract1": { - 1: { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, + [exampleAccounts[0]]: { + 0: { + blockNumber: 0, + confirmations: 1, contractAddress: exampleAddress, - txId, - }, + transactionHash: txId, + } as any, }, - "Module1:Contract2": { - 1: { - type: "onchain-result", - subtype: "failure", - futureId: "Module1:Contract1", - executionId: 1, - error: new Error("EVM revert"), + }, + sendErrors: { + [exampleAccounts[0]]: { + 1: () => { + const error = new Error(""); + (error as any).reason = "EVM revert"; + throw error; }, }, }, diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/buildAdaptersFrom.ts index 36d9a64ab4..94151253ac 100644 --- a/packages/hardhat-plugin/src/buildAdaptersFrom.ts +++ b/packages/hardhat-plugin/src/buildAdaptersFrom.ts @@ -1,4 +1,4 @@ -import { Adapters } from "@ignored/ignition-core"; +import { Adapters, TransactionsAdapter } from "@ignored/ignition-core"; import { ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -22,15 +22,15 @@ export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { }, }; - const transactionsAdapter = { - async wait(txHash: string): Promise { - return hre.ethers.provider.waitForTransaction(txHash); - }, + const transactionsAdapter: TransactionsAdapter = { async getTransactionReceipt( txHash: string - ): Promise { + ): Promise { return hre.ethers.provider.getTransactionReceipt(txHash); }, + async getTransactionCount(address: string): Promise { + return hre.ethers.provider.getTransactionCount(address); + }, }; const adapters: Adapters = { From b03d567d2d48926ea5f47b5b1b76df7bd209bcaf Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 7 Jul 2023 10:09:04 +0100 Subject: [PATCH 0538/1302] chore: disable existing integration tests --- .../hardhat-plugin/test/CommandJournal.ts | 2 +- packages/hardhat-plugin/test/calls.ts | 2 +- packages/hardhat-plugin/test/chainId.ts | 2 +- packages/hardhat-plugin/test/config.ts | 2 +- packages/hardhat-plugin/test/contracts.ts | 2 +- .../hardhat-plugin/test/error-handling.ts | 2 +- .../test/execution/minimal-contract-deploy.ts | 40 +++++++++++++++++++ .../hardhat-plugin/test/existing-contract.ts | 2 +- packages/hardhat-plugin/test/libraries.ts | 2 +- packages/hardhat-plugin/test/load-module.ts | 2 +- packages/hardhat-plugin/test/params.ts | 2 +- packages/hardhat-plugin/test/use-module.ts | 2 +- 12 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts index 67befce41c..ba56c7476a 100644 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ b/packages/hardhat-plugin/test/CommandJournal.ts @@ -9,7 +9,7 @@ import { CommandJournal } from "../src/CommandJournal"; const tempCommandFilePath = "./tmp-test-journal.journal.ndjson"; -describe("File based command journal", () => { +describe.skip("File based command journal", () => { afterEach(() => { if (fs.existsSync(tempCommandFilePath)) { fs.unlinkSync(tempCommandFilePath); diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index 7cc910cac3..49e93d0678 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("calls", () => { +describe.skip("calls", () => { useEnvironment("minimal"); it("should be able to call contracts", async function () { diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts index 5b97aa9afe..2123c186bf 100644 --- a/packages/hardhat-plugin/test/chainId.ts +++ b/packages/hardhat-plugin/test/chainId.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("chain id", () => { +describe.skip("chain id", () => { useEnvironment("minimal"); it("should have a chain id", async function () { diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 3d24da1773..3c16997d88 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -6,7 +6,7 @@ import { BigNumber } from "ethers"; import { useEnvironment } from "./useEnvironment"; -describe("config", () => { +describe.skip("config", () => { useEnvironment("with-config"); let loadedOptions: IgnitionWrapperOptions; diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 1d83cd5ad3..75f78d0201 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("contract deploys", () => { +describe.skip("contract deploys", () => { useEnvironment("minimal"); it("should be able to deploy a contract", async function () { diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts index 5f5dd581c3..d1a978022c 100644 --- a/packages/hardhat-plugin/test/error-handling.ts +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("module error handling", () => { +describe.skip("module error handling", () => { useEnvironment("minimal"); it("should error on passing async callback", async function () { diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts new file mode 100644 index 0000000000..29bfe7f3a5 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -0,0 +1,40 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { useEnvironment } from "../useEnvironment"; + +/** + * This is the simplest contract deploy case. + * + * Deploy a single contract with non-problematic network + */ +describe("execution - minimal contract deploy", () => { + // TODO: rename back to minimal api once execution switched over + useEnvironment("minimal-new-api"); + + it.skip("should create a plan", async function () { + await this.hre.network.provider.request({ + method: "evm_setAutomine", + params: [false], + }); + + const moduleDefinition = defineModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition2.deploy(moduleDefinition, { + parameters: {}, + }); + + assert.isDefined(result); + + await this.hre.network.provider.send("evm_mine"); + + const x = await result.foo.x(); + + assert.equal(x, Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index e878a00b27..54a3e5225d 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("existing contract", () => { +describe.skip("existing contract", () => { useEnvironment("minimal"); it("should be able to use an existing contract", async function () { diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 52a8de5a6b..04c1593f81 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -4,7 +4,7 @@ import { assert } from "chai"; import { deployModule } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("libraries", () => { +describe.skip("libraries", () => { useEnvironment("minimal"); it("should be able to deploy a contract that depends on a hardhat library", async function () { diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index 10ec50d3cd..3a47373293 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -5,7 +5,7 @@ import { loadModule } from "../src/load-module"; import { useEnvironment } from "./useEnvironment"; -describe("loadModule", function () { +describe.skip("loadModule", function () { useEnvironment("user-modules"); it("should return the module given the module name", () => { diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index efae843c8a..d11e958544 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { deployModule, mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("module parameters", () => { +describe.skip("module parameters", () => { useEnvironment("minimal"); describe("required", () => { diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index ace06ee553..0dea11444f 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { mineBlocks } from "./helpers"; import { useEnvironment } from "./useEnvironment"; -describe("useModule", function () { +describe.skip("useModule", function () { useEnvironment("minimal"); describe("returning futures from module usage", () => { From 5d66cd7581780d1e76c92c4e8475e1c3fe766e04 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 7 Jul 2023 11:33:34 +0100 Subject: [PATCH 0539/1302] fix: return on no receipt --- .../core/src/new-api/internal/execution/execution-engine.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 5088af343f..1f67e4b7af 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -349,8 +349,8 @@ export class ExecutionEngine { ); if (currentTransaction === null || currentTransaction === undefined) { - // TODO: deal with dropped transactions - throw new IgnitionError("TBD: deal with dropped transaction"); + // No receipt means it hasn't been included in a block yet + return null; } if ( From a922978fd4be5d28373a05ad428c7ca3b5c9acf6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 7 Jul 2023 11:38:37 +0100 Subject: [PATCH 0540/1302] refactor: split apart txHash messages --- .../internal/execution/execution-engine.ts | 23 +++-- .../new-api/internal/journal/type-guards.ts | 15 +++- packages/core/src/new-api/types/journal.ts | 20 ++++- .../new-api/execution/execution-engine.ts | 88 ++++++++++++++++--- 4 files changed, 119 insertions(+), 27 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 1f67e4b7af..4e06136465 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -23,7 +23,8 @@ import { OnchainResultMessage, OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, - OnchainTransaction, + OnchainTransactionAccept, + OnchainTransactionRequest, ReadEventArgumentInteractionMessage, SendDataInteractionMessage, StaticCallInteractionMessage, @@ -312,6 +313,16 @@ export class ExecutionEngine { ); tx.nonce = nonce; + const onchainTransaction: OnchainTransactionRequest = { + type: "onchain-transaction-request", + futureId: future.id, + executionId: onchainRequest.executionId, + nonce, + from: onchainRequest.from, + tx, + }; + await this._apply(state, onchainTransaction); + let txHash: string; try { txHash = await chainDispatcher.sendTx(tx, onchainRequest.from); @@ -332,17 +343,13 @@ export class ExecutionEngine { return executionFailure; } - // TODO: should this go before submission? Can we precalculate the hash? - const onchainTransaction: OnchainTransaction = { - type: "onchain-transaction", + const onchainTransactionAccept: OnchainTransactionAccept = { + type: "onchain-transaction-accept", futureId: future.id, executionId: onchainRequest.executionId, txHash, - nonce, - from: onchainRequest.from, - tx, }; - await this._apply(state, onchainTransaction); + await this._apply(state, onchainTransactionAccept); const currentTransaction = await chainDispatcher.getTransactionReceipt( txHash diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index b3ca7ff169..d729d8a1ad 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -14,7 +14,8 @@ import { OnchainResultSuccessMessage, OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, - OnchainTransaction, + OnchainTransactionAccept, + OnchainTransactionRequest, ReadEventArgumentStartMessage, SendDataStartMessage, StaticCallStartMessage, @@ -136,10 +137,16 @@ export function isContractAtStartMessage( ); } -export function isOnchainTransaction( +export function isOnchainTransactionRequest( message: JournalableMessage -): message is OnchainTransaction { - return message.type === "onchain-transaction"; +): message is OnchainTransactionRequest { + return message.type === "onchain-transaction-request"; +} + +export function isOnchainTransactionAccept( + message: JournalableMessage +): message is OnchainTransactionAccept { + return message.type === "onchain-transaction-accept"; } export function isOnChainResultMessage( diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 85e89e0794..3a2fd22bf1 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -30,7 +30,8 @@ export type JournalableMessage = */ export type TransactionMessage = | OnchainInteractionMessage - | OnchainTransaction + | OnchainTransactionRequest + | OnchainTransactionAccept | OnchainResultMessage; // #region "OnchainInteraction" @@ -158,16 +159,27 @@ export interface ContractAtInteractionMessage { * * @beta */ -export interface OnchainTransaction { - type: "onchain-transaction"; +export interface OnchainTransactionRequest { + type: "onchain-transaction-request"; futureId: string; executionId: number; - txHash: string; from: string; nonce: number; tx: any; } +/** + * Records a transaction submission being accepted in the mempool. + * + * @beta + */ +export interface OnchainTransactionAccept { + type: "onchain-transaction-accept"; + futureId: string; + executionId: number; + txHash: string; +} + // #endregion // #region "OnchainResult" diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index fc51d19a7b..1f536525e5 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -137,7 +137,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -146,6 +146,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -227,6 +232,17 @@ describe("execution engine", () => { from: accounts[1], storedArtifactPath: "Module1:Contract1.json", }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, { type: "execution-failure", futureId: "Module1:Contract1", @@ -300,7 +316,7 @@ describe("execution engine", () => { from: accounts[2], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Library1", executionId: 1, from: accounts[2], @@ -309,6 +325,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Library1", + executionId: 1, txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", }, { @@ -404,7 +425,7 @@ describe("execution engine", () => { storedArtifactPath: "Module1:Contract1.json", }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[2], @@ -413,6 +434,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", }, { @@ -510,7 +536,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -519,6 +545,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -559,7 +590,7 @@ describe("execution engine", () => { value: "123", }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:test-send", executionId: 1, from: accounts[1], @@ -571,6 +602,11 @@ describe("execution engine", () => { data: "0x", value: BigInt(123), }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:test-send", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", }, { @@ -668,7 +704,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -677,6 +713,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -721,7 +762,7 @@ describe("execution engine", () => { value: "0", }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1#configure", executionId: 1, from: accounts[1], @@ -730,6 +771,11 @@ describe("execution engine", () => { _kind: "TEST-CALL-TRANSACTION", nonce: 1, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1#configure", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", }, { @@ -830,7 +876,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -839,6 +885,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -1046,7 +1097,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -1055,6 +1106,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -1212,7 +1268,7 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Library1", executionId: 1, from: accounts[1], @@ -1221,6 +1277,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 0, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Library1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", }, { @@ -1277,7 +1338,7 @@ describe("execution engine", () => { from: exampleAccounts[1], }, { - type: "onchain-transaction", + type: "onchain-transaction-request", futureId: "Module1:Contract1", executionId: 1, from: accounts[1], @@ -1286,6 +1347,11 @@ describe("execution engine", () => { _kind: "TEST-TRANSACTION", nonce: 1, }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", }, { From 147864336e777ac057a9acefa2518dee2623c1e9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 7 Jul 2023 12:05:39 +0100 Subject: [PATCH 0541/1302] refactor: switch to onchain state machine In the execution engine use a state machine to track each on-chain interaction. --- .vscode/launch.json | 2 +- .../core/src/new-api/internal/deployer.ts | 2 +- .../internal/execution/execution-engine.ts | 467 +---- ...eReducer.ts => execution-state-reducer.ts} | 36 +- .../execution/execution-strategy-cycler.ts | 51 + .../execution/onchain-action-reducer.ts | 361 ++++ .../execution/onchain-state-transitions.ts | 621 ++++++ .../new-api/internal/journal/type-guards.ts | 13 + .../new-api/internal/types/execution-state.ts | 42 + packages/core/src/new-api/internal/wiper.ts | 2 +- packages/core/test/new-api/batcher.ts | 3 + .../new-api/execution/execution-engine.ts | 1766 ++++++++++++----- packages/core/test/new-api/helpers.ts | 10 + .../futures/reconcileArtifactContractAt.ts | 5 +- .../reconcileArtifactContractDeployment.ts | 3 +- .../reconcileArtifactLibraryDeployment.ts | 3 +- .../futures/reconcileNamedContractAt.ts | 5 +- .../futures/reconcileNamedContractCall.ts | 4 +- .../reconcileNamedContractDeployment.ts | 3 +- .../reconcileNamedLibraryDeployment.ts | 3 +- .../futures/reconcileNamedStaticCall.ts | 4 +- .../futures/reconcileReadEventArgument.ts | 4 +- .../futures/reconcileSendData.ts | 3 +- .../test/new-api/reconciliation/reconciler.ts | 3 +- .../test/execution/minimal-contract-deploy.ts | 12 +- 25 files changed, 2511 insertions(+), 917 deletions(-) rename packages/core/src/new-api/internal/execution/{executionStateReducer.ts => execution-state-reducer.ts} (89%) create mode 100644 packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts create mode 100644 packages/core/src/new-api/internal/execution/onchain-action-reducer.ts create mode 100644 packages/core/src/new-api/internal/execution/onchain-state-transitions.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index e38abcc635..699209ed53 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -40,7 +40,7 @@ { "name": "Debug integration tests", "internalConsoleOptions": "openOnSessionStart", - "program": "${workspaceFolder}/packages/hardhat-plugin/node_modules/mocha/bin/_mocha", + "program": "${workspaceFolder}/node_modules/mocha/bin/_mocha", "request": "launch", "skipFiles": ["/**"], "type": "node", diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 89ea5782d0..5154f1c5eb 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -13,8 +13,8 @@ import { Journal } from "../types/journal"; import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; +import { executionStateReducer } from "./execution/execution-state-reducer"; import { BasicExecutionStrategy } from "./execution/execution-strategy"; -import { executionStateReducer } from "./execution/executionStateReducer"; import { ModuleConstructor } from "./module-builder"; import { Reconciler } from "./reconciliation/reconciler"; import { ArtifactMap } from "./reconciliation/types"; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 4e06136465..f91108fb46 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,33 +1,16 @@ -import { ethers } from "ethers"; import identity from "lodash/identity"; import { IgnitionError } from "../../../errors"; +import { sleep } from "../../../internal/utils/sleep"; import { isModuleParameterRuntimeValue } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; import { - CallFunctionInteractionMessage, - DeployContractInteractionMessage, - ExecutionFailure, ExecutionResultMessage, - ExecutionSuccess, FutureStartMessage, JournalableMessage, - OnchainCallFunctionSuccessMessage, - OnchainContractAtSuccessMessage, - OnchainDeployContractSuccessMessage, - OnchainFailureMessage, - OnchainInteractionMessage, - OnchainReadEventArgumentSuccessMessage, - OnchainResultMessage, - OnchainSendDataSuccessMessage, - OnchainStaticCallSuccessMessage, - OnchainTransactionAccept, - OnchainTransactionRequest, - ReadEventArgumentInteractionMessage, - SendDataInteractionMessage, - StaticCallInteractionMessage, + TransactionMessage, } from "../../types/journal"; import { AccountRuntimeValue, @@ -39,7 +22,6 @@ import { NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, } from "../../types/module"; -import { isOnchainFailureMessage } from "../journal/type-guards"; import { isCallExecutionState, isContractAtExecutionState, @@ -47,38 +29,30 @@ import { isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; -import { ChainDispatcher } from "../types/chain-dispatcher"; import { ExecutionEngineState, ExecutionStrategyContext, } from "../types/execution-engine"; import { DeploymentExecutionState, - ExecutionState, ExecutionStateMap, ExecutionStatus, } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; -import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { resolveFromAddress } from "../utils/resolve-from-address"; import { resolveFutureToValue } from "../utils/resolve-future-to-value"; import { resolveModuleParameter } from "../utils/resolve-module-parameter"; -import { executionStateReducer } from "./executionStateReducer"; +import { executionStateReducer } from "./execution-state-reducer"; +import { ExecutionStategyCycler } from "./execution-strategy-cycler"; import { - isCallFunctionInteraction, - isContractAtInteraction, - isDeployContractInteraction, isDeployedContractExecutionSuccess, isExecutionFailure, isExecutionResultMessage, - isOnchainInteractionMessage, - isReadEventArgumentInteraction, - isSendDataInteraction, - isStaticCallInteraction, } from "./guards"; +import { onchainStateTransitions } from "./onchain-state-transitions"; type ExecutionBatch = Future[]; @@ -86,8 +60,6 @@ export interface AccountsState { [key: string]: number; } -const DEFAULT_CONFIRMATIONS = 0; - export class ExecutionEngine { public async execute(state: ExecutionEngineState): Promise { const { batches, module } = state; @@ -155,11 +127,7 @@ export class ExecutionEngine { while (!this._isBatchComplete(batch, state.executionStateMap)) { const sortedFutures: Future[] = this._sortFuturesByExistingNonces(batch); - const results = await this._submitOrCheckFutures( - sortedFutures, - state, - state.chainDispatcher - ); + const results = await this._submitOrCheckFutures(sortedFutures, state); batchResults = [...batchResults, ...results]; @@ -175,28 +143,16 @@ export class ExecutionEngine { private async _submitOrCheckFutures( futures: Future[], - state: ExecutionEngineState, - chainDispatcher: ChainDispatcher + state: ExecutionEngineState ): Promise { const accumulatedResults: ExecutionResultMessage[] = []; for (const future of futures) { - const exState = state.executionStateMap[future.id]; - assertIgnitionInvariant( - exState !== undefined, - "Execution state should be defined" - ); - if (this._isFutureComplete(future, state.executionStateMap)) { continue; } - const result = await this._processFutureTick( - future, - exState, - state, - chainDispatcher - ); + const result = await this._processFutureTick(future, state); // if the current future has a pending transaction, // continue with the batch @@ -214,202 +170,66 @@ export class ExecutionEngine { * Wait for the next block to be processed on-chain */ private async _newBlock(): Promise { - // TODO: add in block check and deal with test vs real chains - return; + await sleep(200); } private async _processFutureTick( future: Future, - exState: ExecutionState, - state: ExecutionEngineState, - chainDispatcher: ChainDispatcher + state: ExecutionEngineState ): Promise { - const context = this._setupExecutionStrategyContext(future, state); - const strategy = state.strategy.executeStrategy(context); + const { lastMessage, strategyInst } = await this._fastForwardToLastMessage( + future, + state + ); - let nextInput: OnchainResultMessage | null = null; - while (true) { - const onchainRequest: OnchainInteractionMessage | ExecutionSuccess = ( - await strategy.next(nextInput) - ).value; - await this._apply(state, onchainRequest); + if (lastMessage !== null && isExecutionResultMessage(lastMessage)) { + return lastMessage; + } - if (isExecutionResultMessage(onchainRequest)) { - return onchainRequest; - } + let next: TransactionMessage | null = lastMessage; + + while (true) { + const onchainState = state.executionStateMap[future.id].onchain; assertIgnitionInvariant( - isOnchainInteractionMessage(onchainRequest), - "Only onchain interaction requests expected" + onchainState !== undefined, + "onchain state needed for each tick" ); - if (isReadEventArgumentInteraction(onchainRequest)) { - const readEventArgResult: - | OnchainReadEventArgumentSuccessMessage - | OnchainFailureMessage = await this._readEventArg( - onchainRequest, - state - ); - - await this._apply(state, readEventArgResult); - - if (isOnchainFailureMessage(readEventArgResult)) { - const executionFailure: ExecutionFailure = { - type: "execution-failure", - futureId: future.id, - error: readEventArgResult.error, - }; - await this._apply(state, executionFailure); - - return executionFailure; - } - - nextInput = readEventArgResult; - } else if (isContractAtInteraction(onchainRequest)) { - const contractAtSuccess: OnchainContractAtSuccessMessage = { - type: "onchain-result", - subtype: "contract-at-success", - futureId: onchainRequest.futureId, - executionId: onchainRequest.executionId, - contractAddress: onchainRequest.contractAddress, - contractName: onchainRequest.contractName, - }; - - nextInput = contractAtSuccess; - } else if (isStaticCallInteraction(onchainRequest)) { - const staticCallResult: - | OnchainStaticCallSuccessMessage - | OnchainFailureMessage = await this._queryStaticCall( - onchainRequest, - state - ); - - await this._apply(state, staticCallResult); - - if (isOnchainFailureMessage(staticCallResult)) { - const executionFailure: ExecutionFailure = { - type: "execution-failure", - futureId: future.id, - error: staticCallResult.error, - }; - await this._apply(state, executionFailure); - - return executionFailure; - } - - nextInput = staticCallResult; - } else if ( - isDeployContractInteraction(onchainRequest) || - isSendDataInteraction(onchainRequest) || - isCallFunctionInteraction(onchainRequest) - ) { - const nonce = await chainDispatcher.allocateNextNonceForAccount( - onchainRequest.from - ); + const response = await onchainStateTransitions[onchainState.status]( + state, + next, + strategyInst + ); - const tx = await this._convertRequestToTransaction( - onchainRequest, - state - ); - tx.nonce = nonce; + if (response.status === "pause") { + return null; + } - const onchainTransaction: OnchainTransactionRequest = { - type: "onchain-transaction-request", - futureId: future.id, - executionId: onchainRequest.executionId, - nonce, - from: onchainRequest.from, - tx, - }; - await this._apply(state, onchainTransaction); - - let txHash: string; - try { - txHash = await chainDispatcher.sendTx(tx, onchainRequest.from); - } catch (error) { - const executionFailure: ExecutionFailure = { - type: "execution-failure", - futureId: future.id, - error: new Error( - error instanceof Error - ? "reason" in error - ? (error.reason as string) - : error.message - : "unknown error" - ), - }; - - await this._apply(state, executionFailure); - return executionFailure; - } + await this._apply(state, response.next); - const onchainTransactionAccept: OnchainTransactionAccept = { - type: "onchain-transaction-accept", - futureId: future.id, - executionId: onchainRequest.executionId, - txHash, - }; - await this._apply(state, onchainTransactionAccept); + if (isExecutionResultMessage(response.next)) { + return response.next; + } - const currentTransaction = await chainDispatcher.getTransactionReceipt( - txHash - ); + next = response.next; + } + } - if (currentTransaction === null || currentTransaction === undefined) { - // No receipt means it hasn't been included in a block yet - return null; - } + private async _fastForwardToLastMessage( + future: Future, + state: ExecutionEngineState + ) { + const exState = state.executionStateMap[future.id]; + assertIgnitionInvariant( + exState !== undefined, + "Execution state should be defined" + ); - if ( - currentTransaction.blockNumber === undefined || - // TODO: make default confirmations config - currentTransaction.confirmations < DEFAULT_CONFIRMATIONS - ) { - // transaction pending, move on with batch - return null; - } + const context = this._setupExecutionStrategyContext(future, state); + const strategy = state.strategy.executeStrategy(context); - if (isDeployContractInteraction(onchainRequest)) { - const deployResult: OnchainDeployContractSuccessMessage = { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: future.id, - executionId: onchainRequest.executionId, - contractAddress: currentTransaction.contractAddress, - txId: currentTransaction.transactionHash, - }; - - await this._apply(state, deployResult); - nextInput = deployResult; - } else if (isSendDataInteraction(onchainRequest)) { - const sendDataResult: OnchainSendDataSuccessMessage = { - type: "onchain-result", - subtype: "send-data-success", - futureId: future.id, - executionId: onchainRequest.executionId, - txId: currentTransaction.transactionHash, - }; - - await this._apply(state, sendDataResult); - nextInput = sendDataResult; - } else if (isCallFunctionInteraction(onchainRequest)) { - const callFunctionResult: OnchainCallFunctionSuccessMessage = { - type: "onchain-result", - subtype: "call-function-success", - futureId: future.id, - executionId: onchainRequest.executionId, - txId: currentTransaction.transactionHash, - }; - - await this._apply(state, callFunctionResult); - nextInput = callFunctionResult; - } else { - this._assertNeverInteractionMessage(onchainRequest); - } - } else { - this._assertNeverInteractionMessage(onchainRequest); - } - } + return ExecutionStategyCycler.fastForward(exState, strategy); } private _isBatchComplete( @@ -440,187 +260,6 @@ export class ExecutionEngine { return futures; } - private async _convertRequestToTransaction( - request: OnchainInteractionMessage, - state: ExecutionEngineState - ) { - switch (request.subtype) { - case "contract-at": { - throw new IgnitionError( - "No transaction involved in contractAt request" - ); - } - case "read-event-arg": { - throw new IgnitionError( - "No transaction involved in readEventArg request" - ); - } - case "static-call": { - throw new IgnitionError( - "No transaction involved in staticCall request" - ); - } - case "call-function": { - return this._convertRequestToCallFunctionTransaction(request, state); - } - case "send-data": { - return this._convertRequestToSendDataTransaction(request, state); - } - case "deploy-contract": - return this._convertRequestToDeployTransaction(request, state); - } - } - - private async _convertRequestToCallFunctionTransaction( - request: CallFunctionInteractionMessage, - state: ExecutionEngineState - ): Promise { - const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath - ); - - const contractAddress: string = request.contractAddress; - const abi = artifact.abi; - const functionName: string = request.functionName; - const args: ArgumentType[] = request.args; - const value: bigint = BigInt(request.value); - const from: string = request.from; - - const unsignedTx = state.chainDispatcher.constructCallTransaction( - contractAddress, - abi, - functionName, - args, - value, - from - ); - - return unsignedTx; - } - - private async _convertRequestToSendDataTransaction( - request: SendDataInteractionMessage, - _state: ExecutionEngineState - ): Promise { - const unsignedTx: ethers.providers.TransactionRequest = { - from: request.from, - to: request.to, - value: BigInt(request.value), - data: request.data, - }; - - return unsignedTx; - } - - private async _convertRequestToDeployTransaction( - request: DeployContractInteractionMessage, - state: ExecutionEngineState - ): Promise { - const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath - ); - - const abi = artifact.abi; - const args = request.args; - const value = BigInt(request.value); - const from = request.from; - - // TODO: fix libraries - const linkedByteCode = await collectLibrariesAndLink(artifact, {}); - - const tx = state.chainDispatcher.constructDeployTransaction( - linkedByteCode, - abi, - args, - value, - from - ); - - return tx; - } - - private async _readEventArg( - request: ReadEventArgumentInteractionMessage, - state: ExecutionEngineState - ): Promise { - const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath - ); - - try { - const result = await state.chainDispatcher.getEventArgument( - request.eventName, - request.argumentName, - request.txToReadFrom, - request.eventIndex, - request.emitterAddress, - artifact.abi - ); - - return { - type: "onchain-result", - subtype: "read-event-arg-success", - futureId: request.futureId, - executionId: request.executionId, - result, - }; - } catch (error) { - return { - type: "onchain-result", - subtype: "failure", - futureId: request.futureId, - executionId: request.executionId, - error: - error instanceof Error - ? error - : new Error("Unknown read event arg error"), - }; - } - } - - private async _queryStaticCall( - request: StaticCallInteractionMessage, - state: ExecutionEngineState - ): Promise { - const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath - ); - - try { - const result = await state.chainDispatcher.staticCallQuery( - request.contractAddress, - artifact.abi, - request.functionName, - request.args, - request.from - ); - - assertIgnitionInvariant( - result !== undefined, - "Static call result not available" - ); - - return { - type: "onchain-result", - subtype: "static-call-success", - futureId: request.futureId, - executionId: request.executionId, - result, - }; - } catch (error) { - return { - type: "onchain-result", - subtype: "failure", - futureId: request.futureId, - executionId: request.executionId, - error: - error instanceof Error - ? error - : new Error("Unknown static call error"), - }; - } - } - private async _apply( state: ExecutionEngineState, message: JournalableMessage @@ -1133,10 +772,4 @@ export class ExecutionEngine { return futureContext; } - - private _assertNeverInteractionMessage(message: never) { - throw new IgnitionError( - `Unknown interaction message ${JSON.stringify(message)}` - ); - } } diff --git a/packages/core/src/new-api/internal/execution/executionStateReducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts similarity index 89% rename from packages/core/src/new-api/internal/execution/executionStateReducer.ts rename to packages/core/src/new-api/internal/execution/execution-state-reducer.ts index 7367128165..adf7cd1a70 100644 --- a/packages/core/src/new-api/internal/execution/executionStateReducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -7,6 +7,7 @@ import { isReadEventArgumentStartMessage, isSendDataStartMessage, isStaticCallStartMessage, + isTransactionMessage, } from "../journal/type-guards"; import { CallExecutionState, @@ -15,6 +16,7 @@ import { ExecutionState, ExecutionStateMap, ExecutionStatus, + OnchainStatuses, ReadEventArgumentExecutionState, SendDataExecutionState, StaticCallExecutionState, @@ -22,6 +24,7 @@ import { import { assertIgnitionInvariant } from "../utils/assertions"; import { isExecutionFailure } from "./guards"; +import { onchainActionReducer } from "./onchain-action-reducer"; export function executionStateReducer( executionStateMap: ExecutionStateMap, @@ -134,7 +137,7 @@ export function executionStateReducer( }; } - if (action.type === "onchain-action" || action.type === "onchain-result") { + if (isTransactionMessage(action)) { const previousExState = executionStateMap[action.futureId]; assertIgnitionInvariant( @@ -145,6 +148,7 @@ export function executionStateReducer( const updateWithOnchainAction: ExecutionState = { ...previousExState, history: [...previousExState.history, action], + onchain: onchainActionReducer(previousExState.onchain, action), }; return { @@ -177,6 +181,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, storedArtifactPath: futureStart.storedArtifactPath, storedBuildInfoPath: futureStart.storedBuildInfoPath, contractName: futureStart.contractName, @@ -197,6 +206,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, args: futureStart.args, @@ -216,6 +230,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, args: futureStart.args, @@ -234,6 +253,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, storedArtifactPath: futureStart.storedArtifactPath, eventName: futureStart.eventName, argumentName: futureStart.argumentName, @@ -253,6 +277,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, value: BigInt(futureStart.value), data: futureStart.data, to: futureStart.to, @@ -270,6 +299,11 @@ function initialiseExecutionStateFor( status: ExecutionStatus.STARTED, dependencies: new Set(futureStart.dependencies), history: [], + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + }, storedArtifactPath: futureStart.storedArtifactPath, contractAddress: futureStart.contractAddress, contractName: futureStart.contractName, diff --git a/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts b/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts new file mode 100644 index 0000000000..4aa3e4feba --- /dev/null +++ b/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts @@ -0,0 +1,51 @@ +import { + ExecutionSuccess, + OnchainInteractionMessage, + OnchainResultMessage, + TransactionMessage, +} from "../../types/journal"; +import { isOnChainResultMessage } from "../journal/type-guards"; +import { ExecutionState } from "../types/execution-state"; + +export class ExecutionStategyCycler { + /** + * Given a execution strategy and history of on chain transactions + * bring the execution strategy up to the latest + */ + public static async fastForward( + exState: ExecutionState, + strategyInst: AsyncGenerator< + OnchainInteractionMessage, + ExecutionSuccess | OnchainInteractionMessage, + OnchainResultMessage | null + > + ): Promise<{ + strategyInst: AsyncGenerator< + OnchainInteractionMessage, + ExecutionSuccess | OnchainInteractionMessage, + OnchainResultMessage | null + >; + lastMessage: TransactionMessage | ExecutionSuccess | null; + }> { + // On the first run the responsibilite for initializing the + // execution strategy is the state machine + if (exState.history.length === 0) { + return { strategyInst, lastMessage: null }; + } + + // As there are messages, do an initialization first + let lastMessage: TransactionMessage | ExecutionSuccess = ( + await strategyInst.next(null) + ).value; + + for (const transactionMessage of exState.history) { + lastMessage = transactionMessage; + + if (isOnChainResultMessage(transactionMessage)) { + lastMessage = (await strategyInst.next(transactionMessage)).value; + } + } + + return { strategyInst, lastMessage }; + } +} diff --git a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts new file mode 100644 index 0000000000..32af49f96b --- /dev/null +++ b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts @@ -0,0 +1,361 @@ +import { IgnitionError } from "../../../errors"; +import { TransactionMessage } from "../../types/journal"; +import { + isOnchainCallFunctionSuccessMessage, + isOnchainContractAtSuccessMessage, + isOnchainDeployContractSuccessMessage, + isOnchainFailureMessage, + isOnchainReadEventArgumentSuccessMessage, + isOnchainSendDataSuccessMessage, + isOnchainStaticCallSuccessMessage, + isOnchainTransactionAccept, + isOnchainTransactionRequest, +} from "../journal/type-guards"; +import { serializeReplacer } from "../journal/utils/serialize-replacer"; +import { OnchainState, OnchainStatuses } from "../types/execution-state"; +import { assertIgnitionInvariant } from "../utils/assertions"; + +import { + isCallFunctionInteraction, + isContractAtInteraction, + isDeployContractInteraction, + isReadEventArgumentInteraction, + isSendDataInteraction, + isStaticCallInteraction, +} from "./guards"; + +export function onchainActionReducer( + state: OnchainState, + action: TransactionMessage +): OnchainState { + // #region "contractAt" + if (isContractAtInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.CONTRACT_AT_START, + currentExecution: action.executionId, + actions: { + [action.executionId]: { contractAt: null }, + }, + }; + } + + if (isOnchainContractAtSuccessMessage(action)) { + assertCurrentStatus([OnchainStatuses.CONTRACT_AT_START], state, action); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + currentExecution: action.executionId, + actions: { + [action.executionId]: { contractAt: action }, + }, + }; + } + + // #endregion + + // #region "deploy contract" + + if (isDeployContractInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.DEPLOY_CONTRACT_START, + currentExecution: action.executionId, + actions: { + [action.executionId]: { request: null, txHash: null, receipt: null }, + }, + }; + } + + if (isOnchainTransactionRequest(action)) { + assertCurrentStatus( + [ + OnchainStatuses.DEPLOY_CONTRACT_START, + OnchainStatuses.CALL_FUNCTION_START, + OnchainStatuses.SEND_DATA_START, + ], + state, + action + ); + + if (state.status === OnchainStatuses.DEPLOY_CONTRACT_START) { + return { + ...state, + status: OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST, + actions: { + [action.executionId]: { + request: action, + txHash: null, + receipt: null, + }, + }, + }; + } else if (state.status === OnchainStatuses.CALL_FUNCTION_START) { + return { + ...state, + status: OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST, + actions: { + [action.executionId]: { + request: action, + txHash: null, + receipt: null, + }, + }, + }; + } else if (state.status === OnchainStatuses.SEND_DATA_START) { + return { + ...state, + status: OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST, + actions: { + [action.executionId]: { + request: action, + txHash: null, + receipt: null, + }, + }, + }; + } else { + throw new IgnitionError( + `Unexpected status for transaction request ${state?.status as any}` + ); + } + } + + if (isOnchainTransactionAccept(action)) { + assertCurrentStatus( + [ + OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST, + OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST, + OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST, + ], + state, + action + ); + + if (state.status === OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST) { + return { + ...state, + status: OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + txHash: action, + receipt: null, + }, + }, + }; + } else if ( + state.status === OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST + ) { + return { + ...state, + status: OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + txHash: action, + receipt: null, + }, + }, + }; + } else if (state.status === OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST) { + return { + ...state, + status: OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + txHash: action, + receipt: null, + }, + }, + }; + } else { + throw new IgnitionError( + `Unexpected status for transaction accept ${state?.status as any}` + ); + } + } + + if (isOnchainDeployContractSuccessMessage(action)) { + assertCurrentStatus( + [OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT], + state, + action + ); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + receipt: action, + }, + }, + }; + } + + // #endregion + + // #region "call-function" + + if (isCallFunctionInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.CALL_FUNCTION_START, + currentExecution: action.executionId, + actions: { + [action.executionId]: { request: null, txHash: null, receipt: null }, + }, + }; + } + + if (isOnchainCallFunctionSuccessMessage(action)) { + assertCurrentStatus( + [OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT], + state, + action + ); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + receipt: action, + }, + }, + }; + } + + // #endregion + + // #region "send data" + + if (isSendDataInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.SEND_DATA_START, + currentExecution: null, + actions: { + [action.executionId]: { + ...state.actions[action.executionId], + receipt: action, + }, + }, + }; + } + + if (isOnchainSendDataSuccessMessage(action)) { + assertCurrentStatus( + [OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT], + state, + action + ); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + currentExecution: action.executionId, + actions: { + [action.executionId]: { request: null, txHash: null, receipt: null }, + }, + }; + } + + // #endregion + + // #region "static-call" + + if (isStaticCallInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.STATIC_CALL_START, + actions: { + [action.executionId]: { result: null }, + }, + }; + } + + if (isOnchainStaticCallSuccessMessage(action)) { + assertCurrentStatus([OnchainStatuses.STATIC_CALL_START], state, action); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + actions: { + [action.executionId]: { result: action }, + }, + }; + } + + // #endregion + + // #region "read event arg" + + if (isReadEventArgumentInteraction(action)) { + assertCurrentStatus([OnchainStatuses.EXECUTE], state, action); + + return { + ...state, + status: OnchainStatuses.READ_EVENT_ARG_START, + actions: { + [action.executionId]: { result: null }, + }, + }; + } + + if (isOnchainReadEventArgumentSuccessMessage(action)) { + assertCurrentStatus([OnchainStatuses.READ_EVENT_ARG_START], state, action); + + return { + ...state, + status: OnchainStatuses.EXECUTE, + actions: { + [action.executionId]: { result: action }, + }, + }; + } + + // #endregion + + if (isOnchainFailureMessage(action)) { + // currently we ignore and let direct translation + // into a ExecutionFailure take over + return state; + } + + return assertNeverActionType(action); +} + +function assertCurrentStatus( + statuses: OnchainStatuses[], + state: OnchainState, + action: TransactionMessage +) { + assertIgnitionInvariant( + statuses.includes(state.status), + `Can only move from ${statuses.join(" or ")} but found ${ + state.status + } when processing: ${JSON.stringify(action, serializeReplacer)}` + ); +} + +function assertNeverActionType(action: never): OnchainState { + throw new Error(`Unknown action type ${JSON.stringify(action)}`); +} diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts new file mode 100644 index 0000000000..f1b12604b1 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -0,0 +1,621 @@ +import { ethers } from "ethers"; + +import { serializeReplacer } from "../../../helpers"; +import { + CallFunctionInteractionMessage, + DeployContractInteractionMessage, + ExecutionFailure, + ExecutionSuccess, + OnchainCallFunctionSuccessMessage, + OnchainContractAtSuccessMessage, + OnchainDeployContractSuccessMessage, + OnchainFailureMessage, + OnchainInteractionMessage, + OnchainReadEventArgumentSuccessMessage, + OnchainResultMessage, + OnchainSendDataSuccessMessage, + OnchainStaticCallSuccessMessage, + OnchainTransactionAccept, + OnchainTransactionRequest, + ReadEventArgumentInteractionMessage, + SendDataInteractionMessage, + StaticCallInteractionMessage, + TransactionMessage, +} from "../../types/journal"; +import { ArgumentType } from "../../types/module"; +import { + isOnChainResultMessage, + isOnchainFailureMessage, + isOnchainTransactionAccept, + isOnchainTransactionRequest, +} from "../journal/type-guards"; +import { ExecutionEngineState } from "../types/execution-engine"; +import { OnchainStatuses } from "../types/execution-state"; +import { assertIgnitionInvariant } from "../utils/assertions"; +import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; + +import { + isCallFunctionInteraction, + isContractAtInteraction, + isDeployContractInteraction, + isReadEventArgumentInteraction, + isSendDataInteraction, + isStaticCallInteraction, +} from "./guards"; + +export interface OnchainStateTransitionContinue { + status: "continue"; + next: ExecutionSuccess | ExecutionFailure | TransactionMessage; +} + +export interface OnchainStateTransitionPause { + status: "pause"; +} + +export type OnchainStateTransition = ( + state: ExecutionEngineState, + next: TransactionMessage | null, + strategyInst: AsyncGenerator< + OnchainInteractionMessage, + ExecutionSuccess | OnchainInteractionMessage, + OnchainResultMessage | null + > +) => Promise; + +export type OnchainStateTransitions = Record< + OnchainStatuses, + OnchainStateTransition +>; + +const DEFAULT_CONFIRMATIONS = 0; + +export const onchainStateTransitions: OnchainStateTransitions = { + [OnchainStatuses.EXECUTE]: async (_state, next, strategyInst) => { + assertIgnitionInvariant( + next === null || isOnChainResultMessage(next), + `Message not in sync with onchain state - EXECUTE: ${JSON.stringify( + next + )}` + ); + + const onchainRequest: OnchainInteractionMessage | ExecutionSuccess = ( + await strategyInst.next(next) + ).value; + + return { status: "continue", next: onchainRequest }; + }, + [OnchainStatuses.DEPLOY_CONTRACT_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isDeployContractInteraction(next), + `Message not in sync with onchain state - DEPLOY_CONTRACT_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const nonce = await state.chainDispatcher.allocateNextNonceForAccount( + next.from + ); + + const tx = await _convertRequestToDeployTransaction(next, state); + tx.nonce = nonce; + + const onchainTransaction: OnchainTransactionRequest = { + type: "onchain-transaction-request", + futureId: next.futureId, + executionId: next.executionId, + nonce, + from: next.from, + tx, + }; + + return { status: "continue", next: onchainTransaction }; + }, + [OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST]: async ( + state, + next + ) => { + assertIgnitionInvariant( + next !== null && isOnchainTransactionRequest(next), + `Message not in sync with onchain state - DEPLOY_CONTRACT_TRANSACTION_REQUEST: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + // TODO: check if transaction already sent? Or is that not possible? + // Can we do some nonce check here with the nonce of the recorded + // request? + let txHash: string; + try { + txHash = await state.chainDispatcher.sendTx(next.tx, next.from); + } catch (error) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: next.futureId, + error: new Error( + error instanceof Error + ? "reason" in error + ? (error.reason as string) + : error.message + : "unknown error" + ), + }; + + return { status: "continue", next: executionFailure }; + } + + const onchainTransactionAccept: OnchainTransactionAccept = { + type: "onchain-transaction-accept", + futureId: next.futureId, + executionId: next.executionId, + txHash, + }; + + return { status: "continue", next: onchainTransactionAccept }; + }, + async [OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT]( + state, + next + ): Promise { + assertIgnitionInvariant( + next !== null && isOnchainTransactionAccept(next), + `Message not in sync with onchain state - DEPLOY_CONTRACT_TRANSACTION_ACCEPT: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const currentTransaction = + await state.chainDispatcher.getTransactionReceipt(next.txHash); + + if (currentTransaction === null || currentTransaction === undefined) { + // No receipt means it hasn't been included in a block yet + return { status: "pause" }; + } + + if ( + currentTransaction.blockNumber === undefined || + // TODO: make default confirmations config + currentTransaction.confirmations < DEFAULT_CONFIRMATIONS + ) { + // transaction pending, move on with batch + return { status: "pause" }; + } + + const deployResult: OnchainDeployContractSuccessMessage = { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: next.futureId, + executionId: next.executionId, + contractAddress: currentTransaction.contractAddress, + txId: currentTransaction.transactionHash, + }; + + return { status: "continue", next: deployResult }; + }, + [OnchainStatuses.CALL_FUNCTION_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isCallFunctionInteraction(next), + `Message not in sync with onchain state - CALL_FUNCTION_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const nonce = await state.chainDispatcher.allocateNextNonceForAccount( + next.from + ); + + const tx = await _convertRequestToCallFunctionTransaction(next, state); + tx.nonce = nonce; + + const onchainTransaction: OnchainTransactionRequest = { + type: "onchain-transaction-request", + futureId: next.futureId, + executionId: next.executionId, + nonce, + from: next.from, + tx, + }; + + return { status: "continue", next: onchainTransaction }; + }, + [OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isOnchainTransactionRequest(next), + `Message not in sync with onchain state - CALL_FUNCTION_TRANSACTION_REQUEST: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + // TODO: check if transaction already sent? Or is that not possible? + // Can we do some nonce check here with the nonce of the recorded + // request? + let txHash: string; + try { + txHash = await state.chainDispatcher.sendTx(next.tx, next.from); + } catch (error) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: next.futureId, + error: new Error( + error instanceof Error + ? "reason" in error + ? (error.reason as string) + : error.message + : "unknown error" + ), + }; + + return { status: "continue", next: executionFailure }; + } + + const onchainTransactionAccept: OnchainTransactionAccept = { + type: "onchain-transaction-accept", + futureId: next.futureId, + executionId: next.executionId, + txHash, + }; + + return { status: "continue", next: onchainTransactionAccept }; + }, + [OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isOnchainTransactionAccept(next), + `Message not in sync with onchain state - CALL_FUNCTION_TRANSACTION_ACCEPT: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const currentTransaction = + await state.chainDispatcher.getTransactionReceipt(next.txHash); + + if (currentTransaction === null || currentTransaction === undefined) { + // No receipt means it hasn't been included in a block yet + return { status: "pause" }; + } + + if ( + currentTransaction.blockNumber === undefined || + // TODO: make default confirmations config + currentTransaction.confirmations < DEFAULT_CONFIRMATIONS + ) { + // transaction pending, move on with batch + return { status: "pause" }; + } + + const deployResult: OnchainCallFunctionSuccessMessage = { + type: "onchain-result", + subtype: "call-function-success", + futureId: next.futureId, + executionId: next.executionId, + txId: currentTransaction.transactionHash, + }; + + return { status: "continue", next: deployResult }; + }, + [OnchainStatuses.SEND_DATA_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isSendDataInteraction(next), + `Message not in sync with onchain state - SEND_DATA_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const nonce = await state.chainDispatcher.allocateNextNonceForAccount( + next.from + ); + + const tx = await _convertRequestToSendDataTransaction(next, state); + tx.nonce = nonce; + + const onchainTransaction: OnchainTransactionRequest = { + type: "onchain-transaction-request", + futureId: next.futureId, + executionId: next.executionId, + nonce, + from: next.from, + tx, + }; + + return { status: "continue", next: onchainTransaction }; + }, + [OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isOnchainTransactionRequest(next), + `Message not in sync with onchain state - SEND_DATA_TRANSACTION_REQUEST: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + // TODO: check if transaction already sent? Or is that not possible? + // Can we do some nonce check here with the nonce of the recorded + // request? + let txHash: string; + try { + txHash = await state.chainDispatcher.sendTx(next.tx, next.from); + } catch (error) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: next.futureId, + error: new Error( + error instanceof Error + ? "reason" in error + ? (error.reason as string) + : error.message + : "unknown error" + ), + }; + + return { status: "continue", next: executionFailure }; + } + + const onchainTransactionAccept: OnchainTransactionAccept = { + type: "onchain-transaction-accept", + futureId: next.futureId, + executionId: next.executionId, + txHash, + }; + + return { status: "continue", next: onchainTransactionAccept }; + }, + [OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isOnchainTransactionAccept(next), + `Message not in sync with onchain state - SEND_DATA_TRANSACTION_ACCEPT: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const currentTransaction = + await state.chainDispatcher.getTransactionReceipt(next.txHash); + + if (currentTransaction === null || currentTransaction === undefined) { + // No receipt means it hasn't been included in a block yet + return { status: "pause" }; + } + + if ( + currentTransaction.blockNumber === undefined || + // TODO: make default confirmations config + currentTransaction.confirmations < DEFAULT_CONFIRMATIONS + ) { + // transaction pending, move on with batch + return { status: "pause" }; + } + + const deployResult: OnchainSendDataSuccessMessage = { + type: "onchain-result", + subtype: "send-data-success", + futureId: next.futureId, + executionId: next.executionId, + txId: currentTransaction.transactionHash, + }; + + return { status: "continue", next: deployResult }; + }, + [OnchainStatuses.CONTRACT_AT_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isContractAtInteraction(next), + `Message not in sync with onchain state - CONTRACT_AT_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const contractAtSuccess: OnchainContractAtSuccessMessage = { + type: "onchain-result", + subtype: "contract-at-success", + futureId: next.futureId, + executionId: next.executionId, + contractAddress: next.contractAddress, + contractName: next.contractName, + }; + + return { status: "continue", next: contractAtSuccess }; + }, + [OnchainStatuses.STATIC_CALL_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isStaticCallInteraction(next), + `Message not in sync with onchain state - STATIC_CALL_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const staticCallResult: + | OnchainStaticCallSuccessMessage + | OnchainFailureMessage = await _queryStaticCall(next, state); + + if (isOnchainFailureMessage(staticCallResult)) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: next.futureId, + error: staticCallResult.error, + }; + + return { status: "continue", next: executionFailure }; + } + + return { status: "continue", next: staticCallResult }; + }, + [OnchainStatuses.READ_EVENT_ARG_START]: async (state, next) => { + assertIgnitionInvariant( + next !== null && isReadEventArgumentInteraction(next), + `Message not in sync with onchain state - READ_EVENT_ARG_START: ${JSON.stringify( + next, + serializeReplacer + )}` + ); + + const readEventArgResult: + | OnchainReadEventArgumentSuccessMessage + | OnchainFailureMessage = await _readEventArg(next, state); + + if (isOnchainFailureMessage(readEventArgResult)) { + const executionFailure: ExecutionFailure = { + type: "execution-failure", + futureId: next.futureId, + error: readEventArgResult.error, + }; + + return { status: "continue", next: executionFailure }; + } + + return { status: "continue", next: readEventArgResult }; + }, +}; + +async function _convertRequestToDeployTransaction( + request: DeployContractInteractionMessage, + state: ExecutionEngineState +): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + const abi = artifact.abi; + const args = request.args; + const value = BigInt(request.value); + const from = request.from; + + // TODO: fix libraries + const linkedByteCode = await collectLibrariesAndLink(artifact, {}); + + const tx = state.chainDispatcher.constructDeployTransaction( + linkedByteCode, + abi, + args, + value, + from + ); + + return tx; +} + +async function _convertRequestToCallFunctionTransaction( + request: CallFunctionInteractionMessage, + state: ExecutionEngineState +): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + const contractAddress: string = request.contractAddress; + const abi = artifact.abi; + const functionName: string = request.functionName; + const args: ArgumentType[] = request.args; + const value: bigint = BigInt(request.value); + const from: string = request.from; + + const unsignedTx = state.chainDispatcher.constructCallTransaction( + contractAddress, + abi, + functionName, + args, + value, + from + ); + + return unsignedTx; +} + +async function _convertRequestToSendDataTransaction( + request: SendDataInteractionMessage, + _state: ExecutionEngineState +): Promise { + const unsignedTx: ethers.providers.TransactionRequest = { + from: request.from, + to: request.to, + value: BigInt(request.value), + data: request.data, + }; + + return unsignedTx; +} + +async function _queryStaticCall( + request: StaticCallInteractionMessage, + state: ExecutionEngineState +): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + try { + const result = await state.chainDispatcher.staticCallQuery( + request.contractAddress, + artifact.abi, + request.functionName, + request.args, + request.from + ); + + assertIgnitionInvariant( + result !== undefined, + "Static call result not available" + ); + + return { + type: "onchain-result", + subtype: "static-call-success", + futureId: request.futureId, + executionId: request.executionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId: request.futureId, + executionId: request.executionId, + error: + error instanceof Error ? error : new Error("Unknown static call error"), + }; + } +} + +async function _readEventArg( + request: ReadEventArgumentInteractionMessage, + state: ExecutionEngineState +): Promise { + const artifact = await state.deploymentLoader.loadArtifact( + request.storedArtifactPath + ); + + try { + const result = await state.chainDispatcher.getEventArgument( + request.eventName, + request.argumentName, + request.txToReadFrom, + request.eventIndex, + request.emitterAddress, + artifact.abi + ); + + return { + type: "onchain-result", + subtype: "read-event-arg-success", + futureId: request.futureId, + executionId: request.executionId, + result, + }; + } catch (error) { + return { + type: "onchain-result", + subtype: "failure", + futureId: request.futureId, + executionId: request.executionId, + error: + error instanceof Error + ? error + : new Error("Unknown read event arg error"), + }; + } +} diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index d729d8a1ad..6f6cbb71a5 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -19,9 +19,11 @@ import { ReadEventArgumentStartMessage, SendDataStartMessage, StaticCallStartMessage, + TransactionMessage, WipeMessage, } from "../../types/journal"; import { FutureType } from "../../types/module"; +import { isOnchainInteractionMessage } from "../execution/guards"; /** * Returns true if potential is ane execution start message. @@ -137,6 +139,17 @@ export function isContractAtStartMessage( ); } +export function isTransactionMessage( + message: JournalableMessage +): message is TransactionMessage { + return ( + isOnchainInteractionMessage(message) || + isOnchainTransactionRequest(message) || + isOnchainTransactionAccept(message) || + isOnChainResultMessage(message) + ); +} + export function isOnchainTransactionRequest( message: JournalableMessage ): message is OnchainTransactionRequest { diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 9b79fb16d9..fdb00719fc 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -109,6 +109,7 @@ interface BaseExecutionState { status: ExecutionStatus; dependencies: Set; // The ids of the futures it depended on history: ExecutionHistory; + onchain: OnchainState; // TODO: We need a message in case of failure or hold? Do we need to store them? } @@ -195,3 +196,44 @@ export type ExecutionState = export interface ExecutionStateMap { [key: string]: ExecutionState; } + +export enum OnchainStatuses { + EXECUTE = "EXECUTE", + + DEPLOY_CONTRACT_START = "DEPLOY_CONTRACT_START", + DEPLOY_CONTRACT_TRANSACTION_REQUEST = "DEPLOY_CONTRACT_TRANSACTION_REQUEST", + DEPLOY_CONTRACT_TRANSACTION_ACCEPT = "DEPLOY_CONTRACT_TRANSACTION_ACCEPT", + + CALL_FUNCTION_START = "CALL_FUNCTION_START", + CALL_FUNCTION_TRANSACTION_REQUEST = "CALL_FUNCTION_TRANSACTION_REQUEST", + CALL_FUNCTION_TRANSACTION_ACCEPT = "CALL_FUNCTION_TRANSACTION_ACCEPT", + + SEND_DATA_START = "SEND_DATA_START", + SEND_DATA_TRANSACTION_REQUEST = "SEND_DATA_TRANSACTION_REQUEST", + SEND_DATA_TRANSACTION_ACCEPT = "SEND_DATA_TRANSACTION_ACCEPT", + + CONTRACT_AT_START = "CONTRACT_AT_START", + + STATIC_CALL_START = "STATIC_CALL_START", + + READ_EVENT_ARG_START = "READ_EVENT_ARG_START", +} + +export interface OnchainState { + status: + | OnchainStatuses.EXECUTE + | OnchainStatuses.DEPLOY_CONTRACT_START + | OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST + | OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT + | OnchainStatuses.CALL_FUNCTION_START + | OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST + | OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT + | OnchainStatuses.SEND_DATA_START + | OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST + | OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT + | OnchainStatuses.CONTRACT_AT_START + | OnchainStatuses.STATIC_CALL_START + | OnchainStatuses.READ_EVENT_ARG_START; + currentExecution: null | number; + actions: { [key: number]: {} }; +} diff --git a/packages/core/src/new-api/internal/wiper.ts b/packages/core/src/new-api/internal/wiper.ts index 40dacf93bd..0ea02270cb 100644 --- a/packages/core/src/new-api/internal/wiper.ts +++ b/packages/core/src/new-api/internal/wiper.ts @@ -1,7 +1,7 @@ import { IgnitionError } from "../../errors"; import { Journal, WipeMessage } from "../types/journal"; -import { executionStateReducer } from "./execution/executionStateReducer"; +import { executionStateReducer } from "./execution/execution-state-reducer"; import { ExecutionStateMap } from "./types/execution-state"; export class Wiper { diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index b24732c4ac..3ef7f4e148 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -14,6 +14,8 @@ import { } from "../../src/new-api/types/module"; import { IgnitionModuleDefinition } from "../../src/new-api/types/module-builder"; +import { initOnchainState } from "./helpers"; + describe("batcher", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", @@ -22,6 +24,7 @@ describe("batcher", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 1f536525e5..bb7a035ff4 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -51,417 +51,1124 @@ describe("execution engine", () => { linkReferences: {}, }; - it("should execute a contract deploy", async () => { - const journal = new MemoryJournal(); + describe("contract deploy", () => { + it("should execute a contract deploy", async () => { + const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { - const account1 = m.getAccount(1); - const supply = m.getParameter("supply", 1000); + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const supply = m.getParameter("supply", 1000); - const contract1 = m.contract( - "Contract1", - [account1, supply, { nested: supply }], - { from: account1 } - ); + const contract1 = m.contract( + "Contract1", + [account1, supply, { nested: supply }], + { from: account1 } + ); - return { contract1 }; - }); + return { contract1 }; + }); - const deployer = setupDeployerWithMocks({ - journal, - artifacts: { - Contract1: contractWithThreeArgConstructorArtifact, - }, - transactionResponses: { - [accounts[1]]: { - 0: { - blockNumber: 0, - confirmations: 1, - contractAddress: exampleAddress, - transactionHash: txId, + const deployer = setupDeployerWithMocks({ + journal, + artifacts: { + Contract1: contractWithThreeArgConstructorArtifact, + }, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, }, }, - }, - }); + }); - const result = await deployer.deploy( - moduleDefinition, - { - Module1: { supply: 2000 }, - }, - exampleAccounts - ); + const result = await deployer.deploy( + moduleDefinition, + { + Module1: { supply: 2000 }, + }, + exampleAccounts + ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", - }, - }); + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); - const journalMessages = await accumulateMessages(journal); + const journalMessages = await accumulateMessages(journal); - assert.deepStrictEqual(journalMessages, [ - { - futureId: "Module1:Contract1", - type: "execution-start", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", - contractName: "Contract1", - value: BigInt(0).toString(), - constructorArgs: [ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - 2000, - { nested: 2000 }, - ], - libraries: {}, - from: accounts[1], - }, - { - type: "onchain-action", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - executionId: 1, - contractName: "Contract1", - args: [ - "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", - 2000, - { nested: 2000 }, - ], - value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", - from: accounts[1], - }, - { - type: "onchain-transaction-request", - futureId: "Module1:Contract1", - executionId: 1, - from: accounts[1], - nonce: 0, - tx: { - _kind: "TEST-TRANSACTION", + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [ + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + 2000, + { nested: 2000 }, + ], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [ + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + 2000, + { nested: 2000 }, + ], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, }, - }, - { - type: "onchain-transaction-accept", - futureId: "Module1:Contract1", - executionId: 1, - txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", - }, - { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, - contractAddress: exampleAddress, - txId, - }, - { - type: "execution-success", - subtype: "deploy-contract", - futureId: "Module1:Contract1", + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + ]); + }); + + it("should execute an artifact contract deploy", async () => { + const fakeArtifact: Artifact = { + abi: [], contractName: "Contract1", - contractAddress: exampleAddress, - txId, - }, - ]); - }); + bytecode: "", + linkReferences: {}, + }; + + const moduleDefinition = defineModule("Module1", (m) => { + const account2 = m.getAccount(2); + const contract1 = m.contractFromArtifact( + "Contract1", + fakeArtifact, + [], + { + from: account2, + } + ); - it("should record a reverted contract deploy", async () => { - const moduleDefinition = defineModule("Module1", (m) => { - const account1 = m.getAccount(1); - const contract1 = m.contract("Contract1", [], { from: account1 }); + return { contract1 }; + }); - return { contract1 }; - }); + const journal = new MemoryJournal(); - const journal = new MemoryJournal(); - - const deployer = setupDeployerWithMocks({ - journal, - sendErrors: { - [accounts[1]]: { - 0: () => { - const error = new Error(""); - (error as any).reason = - "Cannot estimate gas; transaction may fail or may require manual gas limit"; - throw error; + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[2]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, }, }, - }, - }); + }); - const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); - assertDeploymentFailure(result, { - "Module1:Contract1": new Error( - "Cannot estimate gas; transaction may fail or may require manual gas limit" - ), - }); + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + contractAddress: exampleAddress, + }, + }); - const journalMessages = await accumulateMessages(journal); + const journalMessages = await accumulateMessages(journal); - assert.deepStrictEqual(journalMessages, [ - { - futureId: "Module1:Contract1", - type: "execution-start", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", - contractName: "Contract1", - value: BigInt(0).toString(), - constructorArgs: [], - libraries: {}, - from: accounts[1], - }, - { - type: "onchain-action", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - executionId: 1, - contractName: "Contract1", - args: [], - value: BigInt(0).toString(), - from: accounts[1], - storedArtifactPath: "Module1:Contract1.json", - }, - { - type: "onchain-transaction-request", - futureId: "Module1:Contract1", - executionId: 1, - from: accounts[1], - nonce: 0, - tx: { - _kind: "TEST-TRANSACTION", + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[2], + } as Omit< + DeployContractStartMessage, + "storedBuildInfoPath" + > as any as JournalableMessage, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: accounts[2], + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[2], nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, }, - }, - { - type: "execution-failure", - futureId: "Module1:Contract1", - error: new Error( + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + ]); + }); + + it("should record a reverted contract deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1", [], { from: account1 }); + + return { contract1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + sendErrors: { + [accounts[1]]: { + 0: () => { + const error = new Error(""); + (error as any).reason = + "Cannot estimate gas; transaction may fail or may require manual gas limit"; + throw error; + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentFailure(result, { + "Module1:Contract1": new Error( "Cannot estimate gas; transaction may fail or may require manual gas limit" ), - }, - ]); - }); - - it("should execute a library deploy", async () => { - const moduleDefinition = defineModule("Module1", (m) => { - const account2 = m.getAccount(2); - const library1 = m.library("Library1", { from: account2 }); + }); - return { library1 }; - }); + const journalMessages = await accumulateMessages(journal); - const journal = new MemoryJournal(); - - const deployer = setupDeployerWithMocks({ - journal, - transactionResponses: { - [accounts[2]]: { - 0: { - blockNumber: 0, - confirmations: 1, - contractAddress: exampleAddress, - transactionHash: txId, + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + from: accounts[1], + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "execution-failure", + futureId: "Module1:Contract1", + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }, + ]); + }); + }); + + describe("library deploy", () => { + it("should execute a library deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account2 = m.getAccount(2); + const library1 = m.library("Library1", { from: account2 }); + + return { library1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[2]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Library1": { + contractName: "Library1", + storedArtifactPath: "Module1:Library1.json", + contractAddress: exampleAddress, + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Library1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[2], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Library1", + executionId: 1, + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Library1.json", + from: accounts[2], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Library1", + executionId: 1, + from: accounts[2], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Library1", + executionId: 1, + txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Library1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Library1", + contractName: "Library1", + contractAddress: exampleAddress, + txId, + }, + ]); + }); + + it("should execute an artifact library deploy", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + + const moduleDefinition = defineModule("Module1", (m) => { + const account2 = m.getAccount(2); + const library1 = m.libraryFromArtifact("Library1", fakeArtifact, { + from: account2, + }); + + return { library1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[2]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Library1": { + contractName: "Library1", + storedArtifactPath: "Module1:Library1.json", + contractAddress: exampleAddress, + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Library1.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[2], + } as Omit< + DeployContractStartMessage, + "storedBuildInfoPath" + > as any as JournalableMessage, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Library1", + executionId: 1, + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + from: accounts[2], + storedArtifactPath: "Module1:Library1.json", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Library1", + executionId: 1, + from: accounts[2], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Library1", + executionId: 1, + txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Library1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Library1", + contractName: "Library1", + contractAddress: exampleAddress, + txId, + }, + ]); + }); + + it("should record a revert of library deploy", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.library("Library1", { from: account1 }); + + return { contract1 }; + }); + + const journal = new MemoryJournal(); + + const deployer = setupDeployerWithMocks({ + journal, + sendErrors: { + [accounts[1]]: { + 0: () => { + const error = new Error(""); + (error as any).reason = + "Cannot estimate gas; transaction may fail or may require manual gas limit"; + throw error; + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentFailure(result, { + "Module1:Library1": new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Library1", + type: "execution-start", + futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Library1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Library1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Library1", + executionId: 1, + contractName: "Library1", + args: [], + value: BigInt(0).toString(), + from: accounts[1], + storedArtifactPath: "Module1:Library1.json", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Library1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "execution-failure", + futureId: "Module1:Library1", + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }, + ]); + }); + }); + + describe("send data", () => { + it("should execute a send data", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.send("test-send", contract1, 123n, undefined, { from: account1 }); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + 1: { + blockNumber: 1, + confirmations: 1, + transactionHash: diffTxId, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-start", + futureType: FutureType.SEND_DATA, + futureId: "Module1:test-send", + strategy: "basic", + dependencies: ["Module1:Contract1"], + data: "0x", + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-action", + subtype: "send-data", + futureId: "Module1:test-send", + data: "0x", + executionId: 1, + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:test-send", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + from: accounts[1], + nonce: 1, + to: exampleAddress, + data: "0x", + value: BigInt(123), + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:test-send", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", + }, + { + type: "onchain-result", + subtype: "send-data-success", + futureId: "Module1:test-send", + executionId: 1, + txId: diffTxId, + }, + { + type: "execution-success", + subtype: "send-data", + futureId: "Module1:test-send", + txId: diffTxId, + }, + ]); + }); + + it("should record a revert of send data", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.send("test-send", contract1, 123n, undefined, { from: account1 }); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + }, + }, + sendErrors: { + [accounts[1]]: { + 1: () => { + const error = new Error(""); + (error as any).reason = + "Cannot estimate gas; transaction may fail or may require manual gas limit"; + throw error; + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentFailure(result, { + "Module1:test-send": new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-start", + futureType: FutureType.SEND_DATA, + futureId: "Module1:test-send", + strategy: "basic", + dependencies: ["Module1:Contract1"], + data: "0x", + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-action", + subtype: "send-data", + futureId: "Module1:test-send", + data: "0x", + executionId: 1, + from: accounts[1], + to: exampleAddress, + value: "123", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:test-send", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + from: accounts[1], + nonce: 1, + to: exampleAddress, + data: "0x", + value: BigInt(123), }, }, - }, + { + type: "execution-failure", + futureId: "Module1:test-send", + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), + }, + ]); }); + }); - const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); + describe("call function", () => { + it("should execute a call", async () => { + const journal = new MemoryJournal(); - assertDeploymentSuccess(result, { - "Module1:Library1": { - contractName: "Library1", - storedArtifactPath: "Module1:Library1.json", - contractAddress: exampleAddress, - }, - }); + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); - const journalMessages = await accumulateMessages(journal); + const contract1 = m.contract("Contract1", [], { from: account1 }); - assert.deepStrictEqual(journalMessages, [ - { - futureId: "Module1:Library1", - type: "execution-start", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "Module1:Library1.json", - storedBuildInfoPath: "build-info-12345.json", - contractName: "Library1", - value: BigInt(0).toString(), - constructorArgs: [], - libraries: {}, - from: accounts[2], - }, - { - type: "onchain-action", - subtype: "deploy-contract", - futureId: "Module1:Library1", - executionId: 1, - contractName: "Library1", - args: [], - value: BigInt(0).toString(), - storedArtifactPath: "Module1:Library1.json", - from: accounts[2], - }, - { - type: "onchain-transaction-request", - futureId: "Module1:Library1", - executionId: 1, - from: accounts[2], - nonce: 0, - tx: { - _kind: "TEST-TRANSACTION", - nonce: 0, - }, - }, - { - type: "onchain-transaction-accept", - futureId: "Module1:Library1", - executionId: 1, - txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", - }, - { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Library1", - executionId: 1, - contractAddress: exampleAddress, - txId, - }, - { - type: "execution-success", - subtype: "deploy-contract", - futureId: "Module1:Library1", - contractName: "Library1", - contractAddress: exampleAddress, - txId, - }, - ]); - }); + m.call(contract1, "configure", [1, "b", false], { from: account1 }); - it("should execute an artifact contract deploy", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "Contract1", - bytecode: "", - linkReferences: {}, - }; - - const moduleDefinition = defineModule("Module1", (m) => { - const account2 = m.getAccount(2); - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { - from: account2, + return { contract1 }; }); - return { contract1 }; - }); - - const journal = new MemoryJournal(); - - const deployer = setupDeployerWithMocks({ - journal, - transactionResponses: { - [accounts[2]]: { - 0: { - blockNumber: 0, - confirmations: 1, - contractAddress: exampleAddress, - transactionHash: txId, + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + }, + 1: { + blockNumber: 1, + confirmations: 1, + transactionHash: diffTxId, + }, }, }, - }, - }); + }); - const result = await deployer.deploy(moduleDefinition, {}, exampleAccounts); + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", - contractAddress: exampleAddress, - }, - }); + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + storedArtifactPath: "Module1:Contract1.json", + }, + }); - const journalMessages = await accumulateMessages(journal); + const journalMessages = await accumulateMessages(journal); - assert.deepStrictEqual(journalMessages, [ - { - futureId: "Module1:Contract1", - type: "execution-start", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - strategy: "basic", - dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - contractName: "Contract1", - value: BigInt(0).toString(), - constructorArgs: [], - libraries: {}, - from: accounts[2], - } as Omit< - DeployContractStartMessage, - "storedBuildInfoPath" - > as any as JournalableMessage, - { - type: "onchain-action", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - executionId: 1, - contractName: "Contract1", - args: [], - value: BigInt(0).toString(), - from: accounts[2], - storedArtifactPath: "Module1:Contract1.json", - }, - { - type: "onchain-transaction-request", - futureId: "Module1:Contract1", - executionId: 1, - from: accounts[2], - nonce: 0, - tx: { - _kind: "TEST-TRANSACTION", + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, }, - }, - { - type: "onchain-transaction-accept", - futureId: "Module1:Contract1", - executionId: 1, - txHash: "0x90F79bf6EB2c4f870365E785982E1f101E93b906--0", - }, - { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: "Module1:Contract1", - executionId: 1, - contractAddress: exampleAddress, - txId, - }, - { - type: "execution-success", - subtype: "deploy-contract", - futureId: "Module1:Contract1", - contractName: "Contract1", - contractAddress: exampleAddress, - txId, - }, - ]); - }); + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_CALL, + futureId: "Module1:Contract1#configure", + strategy: "basic", + dependencies: ["Module1:Contract1"], + args: [1, "b", false], + contractAddress: exampleAddress, + from: accounts[1], + functionName: "configure", + storedArtifactPath: "Module1:Contract1.json", + value: "0", + }, + { + type: "onchain-action", + subtype: "call-function", + args: [1, "b", false], + contractAddress: exampleAddress, + executionId: 1, + functionName: "configure", + futureId: "Module1:Contract1#configure", + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + value: "0", + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1#configure", + executionId: 1, + from: accounts[1], + nonce: 1, + tx: { + _kind: "TEST-CALL-TRANSACTION", + nonce: 1, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1#configure", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", + }, + { + type: "onchain-result", + subtype: "call-function-success", + futureId: "Module1:Contract1#configure", + executionId: 1, + txId: diffTxId, + }, + { + type: "execution-success", + subtype: "call-function", + futureId: "Module1:Contract1#configure", + contractAddress: exampleAddress, + functionName: "configure", + txId: diffTxId, + }, + ]); + }); - describe("send data", () => { - it("should execute a send data", async () => { + it("should record a revert of call function", async () => { const journal = new MemoryJournal(); const moduleDefinition = defineModule("Module1", (m) => { @@ -469,7 +1176,7 @@ describe("execution engine", () => { const contract1 = m.contract("Contract1", [], { from: account1 }); - m.send("test-send", contract1, 123n, undefined, { from: account1 }); + m.call(contract1, "configure", [1, "b", false], { from: account1 }); return { contract1 }; }); @@ -484,10 +1191,15 @@ describe("execution engine", () => { contractAddress: exampleAddress, transactionHash: txId, }, - 1: { - blockNumber: 1, - confirmations: 1, - transactionHash: diffTxId, + }, + }, + sendErrors: { + [accounts[1]]: { + 1: () => { + const error = new Error(""); + (error as any).reason = + "Cannot estimate gas; transaction may fail or may require manual gas limit"; + throw error; }, }, }, @@ -499,12 +1211,10 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", - }, + assertDeploymentFailure(result, { + "Module1:Contract1#configure": new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), }); const journalMessages = await accumulateMessages(journal); @@ -570,66 +1280,53 @@ describe("execution engine", () => { }, { type: "execution-start", - futureType: FutureType.SEND_DATA, - futureId: "Module1:test-send", + futureType: FutureType.NAMED_CONTRACT_CALL, + futureId: "Module1:Contract1#configure", strategy: "basic", dependencies: ["Module1:Contract1"], - data: "0x", + args: [1, "b", false], + contractAddress: exampleAddress, from: accounts[1], - to: exampleAddress, - value: "123", + functionName: "configure", + storedArtifactPath: "Module1:Contract1.json", + value: "0", }, { type: "onchain-action", - subtype: "send-data", - futureId: "Module1:test-send", - data: "0x", + subtype: "call-function", + args: [1, "b", false], + contractAddress: exampleAddress, executionId: 1, - from: accounts[1], - to: exampleAddress, - value: "123", + functionName: "configure", + futureId: "Module1:Contract1#configure", + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + value: "0", }, { type: "onchain-transaction-request", - futureId: "Module1:test-send", + futureId: "Module1:Contract1#configure", executionId: 1, from: accounts[1], nonce: 1, tx: { - from: accounts[1], + _kind: "TEST-CALL-TRANSACTION", nonce: 1, - to: exampleAddress, - data: "0x", - value: BigInt(123), }, }, { - type: "onchain-transaction-accept", - futureId: "Module1:test-send", - executionId: 1, - txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", - }, - { - type: "onchain-result", - subtype: "send-data-success", - futureId: "Module1:test-send", - executionId: 1, - txId: diffTxId, - }, - { - type: "execution-success", - subtype: "send-data", - futureId: "Module1:test-send", - txId: diffTxId, + type: "execution-failure", + futureId: "Module1:Contract1#configure", + error: new Error( + "Cannot estimate gas; transaction may fail or may require manual gas limit" + ), }, ]); }); - - it.skip("should record a revert of send data"); }); - describe("call function", () => { - it("should execute a call", async () => { + describe("static call", () => { + it("should execute a static call", async () => { const journal = new MemoryJournal(); const moduleDefinition = defineModule("Module1", (m) => { @@ -637,7 +1334,7 @@ describe("execution engine", () => { const contract1 = m.contract("Contract1", [], { from: account1 }); - m.call(contract1, "configure", [1, "b", false], { from: account1 }); + m.staticCall(contract1, "test", [1, "b", false], { from: account1 }); return { contract1 }; }); @@ -652,13 +1349,14 @@ describe("execution engine", () => { contractAddress: exampleAddress, transactionHash: txId, }, - 1: { - blockNumber: 1, - confirmations: 1, - transactionHash: diffTxId, - }, }, }, + staticCall: async (contractAddress, _abi, functionName) => { + assert.equal(contractAddress, exampleAddress); + assert.equal(functionName, "test"); + + return "example_static_call_result"; + }, }); const result = await deployer.deploy( @@ -738,69 +1436,46 @@ describe("execution engine", () => { }, { type: "execution-start", - futureType: FutureType.NAMED_CONTRACT_CALL, - futureId: "Module1:Contract1#configure", + futureType: FutureType.NAMED_STATIC_CALL, + futureId: "Module1:Contract1#test", strategy: "basic", dependencies: ["Module1:Contract1"], args: [1, "b", false], contractAddress: exampleAddress, from: accounts[1], - functionName: "configure", + functionName: "test", storedArtifactPath: "Module1:Contract1.json", - value: "0", }, { type: "onchain-action", - subtype: "call-function", + subtype: "static-call", args: [1, "b", false], contractAddress: exampleAddress, executionId: 1, - functionName: "configure", - futureId: "Module1:Contract1#configure", + functionName: "test", + futureId: "Module1:Contract1#test", storedArtifactPath: "Module1:Contract1.json", from: accounts[1], - value: "0", - }, - { - type: "onchain-transaction-request", - futureId: "Module1:Contract1#configure", - executionId: 1, - from: accounts[1], - nonce: 1, - tx: { - _kind: "TEST-CALL-TRANSACTION", - nonce: 1, - }, - }, - { - type: "onchain-transaction-accept", - futureId: "Module1:Contract1#configure", - executionId: 1, - txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--1", }, { type: "onchain-result", - subtype: "call-function-success", - futureId: "Module1:Contract1#configure", + subtype: "static-call-success", + futureId: "Module1:Contract1#test", executionId: 1, - txId: diffTxId, + result: "example_static_call_result", }, { type: "execution-success", - subtype: "call-function", - futureId: "Module1:Contract1#configure", + subtype: "static-call", + futureId: "Module1:Contract1#test", contractAddress: exampleAddress, - functionName: "configure", - txId: diffTxId, + functionName: "test", + result: "example_static_call_result", }, ]); }); - it.skip("should record a revert of call function"); - }); - - describe("static call", () => { - it("should execute a static call", async () => { + it("should record a revert of static call function", async () => { const journal = new MemoryJournal(); const moduleDefinition = defineModule("Module1", (m) => { @@ -825,11 +1500,8 @@ describe("execution engine", () => { }, }, }, - staticCall: async (contractAddress, _abi, functionName) => { - assert.equal(contractAddress, exampleAddress); - assert.equal(functionName, "test"); - - return "example_static_call_result"; + staticCall: async (_contractAddress, _abi, _functionName) => { + throw new Error("Query reverted"); }, }); @@ -839,12 +1511,8 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", - }, + assertDeploymentFailure(result, { + "Module1:Contract1#test": new Error("Query reverted"), }); const journalMessages = await accumulateMessages(journal); @@ -932,24 +1600,12 @@ describe("execution engine", () => { from: accounts[1], }, { - type: "onchain-result", - subtype: "static-call-success", - futureId: "Module1:Contract1#test", - executionId: 1, - result: "example_static_call_result", - }, - { - type: "execution-success", - subtype: "static-call", + type: "execution-failure", futureId: "Module1:Contract1#test", - contractAddress: exampleAddress, - functionName: "test", - result: "example_static_call_result", + error: new Error("Query reverted"), }, ]); }); - - it.skip("should record a revert of call function"); }); describe("contract at", () => { @@ -1003,6 +1659,14 @@ describe("execution engine", () => { contractName: "Contract1", storedArtifactPath: "Module1:Contract1.json", }, + { + type: "onchain-result", + subtype: "contract-at-success", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + contractAddress: exampleAddress, + }, { type: "execution-success", subtype: "contract-at", @@ -1173,7 +1837,147 @@ describe("execution engine", () => { ]); }); - it.skip("should record a revert of a read event arg"); + it("should record a revert of a read event arg", async () => { + const journal = new MemoryJournal(); + + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + + const contract1 = m.contract("Contract1", [], { from: account1 }); + + m.readEventArgument(contract1, "EventName1", "arg1"); + + return { contract1 }; + }); + + const deployer = setupDeployerWithMocks({ + journal, + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: exampleAddress, + transactionHash: txId, + logs: { here: "example" }, + }, + }, + }, + getEventArgument: async ( + _eventName: string, + _argumentName: string, + _txToReadFrom: string + ) => { + throw new Error("Unable to read event"); + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentFailure(result, { + "Module1:Contract1#EventName1#arg1#0": new Error( + "Unable to read event" + ), + }); + + const journalMessages = await accumulateMessages(journal); + + assert.deepStrictEqual(journalMessages, [ + { + futureId: "Module1:Contract1", + type: "execution-start", + futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + strategy: "basic", + dependencies: [], + storedArtifactPath: "Module1:Contract1.json", + storedBuildInfoPath: "build-info-12345.json", + contractName: "Contract1", + value: BigInt(0).toString(), + constructorArgs: [], + libraries: {}, + from: accounts[1], + }, + { + type: "onchain-action", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + executionId: 1, + contractName: "Contract1", + args: [], + value: BigInt(0).toString(), + storedArtifactPath: "Module1:Contract1.json", + from: accounts[1], + }, + { + type: "onchain-transaction-request", + futureId: "Module1:Contract1", + executionId: 1, + from: accounts[1], + nonce: 0, + tx: { + _kind: "TEST-TRANSACTION", + nonce: 0, + }, + }, + { + type: "onchain-transaction-accept", + futureId: "Module1:Contract1", + executionId: 1, + txHash: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC--0", + }, + { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: "Module1:Contract1", + executionId: 1, + contractAddress: exampleAddress, + txId, + }, + { + type: "execution-success", + subtype: "deploy-contract", + futureId: "Module1:Contract1", + contractName: "Contract1", + contractAddress: exampleAddress, + txId, + }, + + { + type: "execution-start", + futureType: FutureType.READ_EVENT_ARGUMENT, + strategy: "basic", + dependencies: ["Module1:Contract1"], + futureId: "Module1:Contract1#EventName1#arg1#0", + eventName: "EventName1", + argumentName: "arg1", + eventIndex: 0, + emitterAddress: exampleAddress, + txToReadFrom: txId, + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "onchain-action", + subtype: "read-event-arg", + futureId: "Module1:Contract1#EventName1#arg1#0", + executionId: 1, + eventName: "EventName1", + argumentName: "arg1", + eventIndex: 0, + emitterAddress: exampleAddress, + txToReadFrom: txId, + storedArtifactPath: "Module1:Contract1.json", + }, + { + type: "execution-failure", + futureId: "Module1:Contract1#EventName1#arg1#0", + error: new Error("Unable to read event"), + }, + ]); + }); }); describe("with complex arguments", () => { diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 4868eff36a..8fa084f200 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -11,6 +11,10 @@ import { Deployer } from "../../src/new-api/internal/deployer"; import { AccountsState } from "../../src/new-api/internal/execution/execution-engine"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; import { ChainDispatcher } from "../../src/new-api/internal/types/chain-dispatcher"; +import { + OnchainState, + OnchainStatuses, +} from "../../src/new-api/internal/types/execution-state"; import { DeploymentResult } from "../../src/new-api/types/deployer"; import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; import { Journal, JournalableMessage } from "../../src/new-api/types/journal"; @@ -23,6 +27,12 @@ export const exampleAccounts: string[] = [ "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc", ]; +export const initOnchainState: OnchainState = { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, +}; + export function assertInstanceOf( obj: unknown, klass: new (...args: any[]) => ObjectT diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index da94e6439b..a9deff7b17 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -10,7 +10,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - artifact contract at", () => { @@ -31,6 +31,7 @@ describe("Reconciliation - artifact contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractName: "Contract1", contractAddress: exampleAddress, storedArtifactPath: "./artifact.json", @@ -43,6 +44,7 @@ describe("Reconciliation - artifact contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", @@ -59,6 +61,7 @@ describe("Reconciliation - artifact contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractAddress: exampleAddress, storedArtifactPath: "./artifact.json", functionName: "function", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index a3bf5757ff..7ebf950ce3 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -7,7 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -32,6 +32,7 @@ describe("Reconciliation - artifact contract", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 139161bd27..4534bce7d5 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -7,7 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -32,6 +32,7 @@ describe("Reconciliation - artifact library", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index 7f8ceb9a39..137fb30e35 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -9,7 +9,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - named contract at", () => { @@ -23,6 +23,7 @@ describe("Reconciliation - named contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractName: "Contract1", contractAddress: exampleAddress, storedArtifactPath: "./artifact.json", @@ -35,6 +36,7 @@ describe("Reconciliation - named contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", @@ -51,6 +53,7 @@ describe("Reconciliation - named contract at", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractAddress: exampleAddress, storedArtifactPath: "./artifact.json", functionName: "function", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index 57f986d9e3..2940197a73 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -7,7 +7,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -26,6 +26,7 @@ describe("Reconciliation - named contract call", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", @@ -43,6 +44,7 @@ describe("Reconciliation - named contract call", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractAddress: differentAddress, storedArtifactPath: "./artifact.json", functionName: "function", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 8c274bf5cc..79d67fc0d9 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -6,7 +6,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -24,6 +24,7 @@ describe("Reconciliation - named contract", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 773bb83dba..163b5fcb93 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -6,7 +6,7 @@ import { ExecutionStatus, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -24,6 +24,7 @@ describe("Reconciliation - named library", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 01f36e0ef8..9fd7df01a2 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -7,7 +7,7 @@ import { StaticCallExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, oneAddress, @@ -26,6 +26,7 @@ describe("Reconciliation - named static call", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", @@ -42,6 +43,7 @@ describe("Reconciliation - named static call", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, contractAddress: exampleAddress, storedArtifactPath: "./artifact.json", functionName: "function", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 9db1ca7660..30716158e0 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -7,7 +7,7 @@ import { ReadEventArgumentExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - read event argument", () => { @@ -22,6 +22,7 @@ describe("Reconciliation - read event argument", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", eventName: "event1", argumentName: "argument1", @@ -37,6 +38,7 @@ describe("Reconciliation - read event argument", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index b829726e8a..f621de94f7 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -6,7 +6,7 @@ import { SendDataExecutionState, } from "../../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../../src/new-api/types/module"; -import { exampleAccounts } from "../../helpers"; +import { exampleAccounts, initOnchainState } from "../../helpers"; import { assertSuccessReconciliation, reconcile } from "../helpers"; describe("Reconciliation - send data", () => { @@ -20,6 +20,7 @@ describe("Reconciliation - send data", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, to: exampleAddress, data: "example_data", value: BigInt("0"), diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 0eacc30f48..6b77c40a36 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -7,7 +7,7 @@ import { ExecutionStatus, } from "../../../src/new-api/internal/types/execution-state"; import { FutureType } from "../../../src/new-api/types/module"; -import { exampleAccounts } from "../helpers"; +import { exampleAccounts, initOnchainState } from "../helpers"; import { assertNoWarningsOrErrors, @@ -23,6 +23,7 @@ describe("Reconciliation", () => { status: ExecutionStatus.STARTED, dependencies: new Set(), history: [], + onchain: initOnchainState, storedArtifactPath: "./artifact.json", storedBuildInfoPath: "./build-info.json", contractName: "Contract1", diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts index 29bfe7f3a5..d380a5a49d 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -13,7 +13,7 @@ describe("execution - minimal contract deploy", () => { // TODO: rename back to minimal api once execution switched over useEnvironment("minimal-new-api"); - it.skip("should create a plan", async function () { + it("should create a plan", async function () { await this.hre.network.provider.request({ method: "evm_setAutomine", params: [false], @@ -25,16 +25,20 @@ describe("execution - minimal contract deploy", () => { return { foo }; }); - const result = await this.hre.ignition2.deploy(moduleDefinition, { + const deployPromise = this.hre.ignition2.deploy(moduleDefinition, { parameters: {}, }); - assert.isDefined(result); - + await sleep(100); await this.hre.network.provider.send("evm_mine"); + const result = await deployPromise; + const x = await result.foo.x(); assert.equal(x, Number(1)); }); }); + +const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); From f2363f1b8016183a09b6f8fa1baca098e8d1dfe5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 19 Jul 2023 18:20:57 +0100 Subject: [PATCH 0542/1302] test: add compile statement for minimal deploy test --- .../hardhat-plugin/test/execution/minimal-contract-deploy.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts index d380a5a49d..6f77622835 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -13,7 +13,9 @@ describe("execution - minimal contract deploy", () => { // TODO: rename back to minimal api once execution switched over useEnvironment("minimal-new-api"); - it("should create a plan", async function () { + it.skip("should deploy the contract", async function () { + await this.hre.run("compile", { quiet: true }); + await this.hre.network.provider.request({ method: "evm_setAutomine", params: [false], From 2a141bd069bb99da5d793e9a579553747f462f98 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 11 Jul 2023 10:47:56 +0100 Subject: [PATCH 0543/1302] refactor: order by nonce on each batch --- .../internal/execution/execution-engine.ts | 16 +- .../execution/execution-state-reducer.ts | 12 ++ .../execution/onchain-action-reducer.ts | 24 ++- .../execution/sort-futures-by-nonces.ts | 39 +++++ .../new-api/internal/types/execution-state.ts | 4 +- .../new-api/execution/execution-engine.ts | 144 ++++++++++++++++++ .../execution/sort-futures-by-nonce.ts | 120 +++++++++++++++ packages/core/test/new-api/helpers.ts | 2 + .../hardhat-plugin/test/execution/helpers.ts | 2 + .../test/execution/minimal-contract-deploy.ts | 11 +- .../multiple-batch-contract-deploy.ts | 87 +++++++++++ 11 files changed, 443 insertions(+), 18 deletions(-) create mode 100644 packages/core/src/new-api/internal/execution/sort-futures-by-nonces.ts create mode 100644 packages/core/test/new-api/execution/sort-futures-by-nonce.ts create mode 100644 packages/hardhat-plugin/test/execution/helpers.ts create mode 100644 packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index f91108fb46..7633b8d890 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -53,6 +53,7 @@ import { isExecutionResultMessage, } from "./guards"; import { onchainStateTransitions } from "./onchain-state-transitions"; +import { sortFuturesByNonces } from "./sort-futures-by-nonces"; type ExecutionBatch = Future[]; @@ -124,14 +125,14 @@ export class ExecutionEngine { await this._apply(state, initMessage); } - while (!this._isBatchComplete(batch, state.executionStateMap)) { - const sortedFutures: Future[] = this._sortFuturesByExistingNonces(batch); + while (!this._isBatchComplete(batch, state)) { + const sortedFutures: Future[] = sortFuturesByNonces(batch, state); const results = await this._submitOrCheckFutures(sortedFutures, state); batchResults = [...batchResults, ...results]; - if (this._isBatchComplete(sortedFutures, state.executionStateMap)) { + if (this._isBatchComplete(sortedFutures, state)) { break; } @@ -234,10 +235,10 @@ export class ExecutionEngine { private _isBatchComplete( sortedFutures: Future[], - executionStateMap: ExecutionStateMap + state: ExecutionEngineState ): boolean { return sortedFutures.every((f) => { - return this._isFutureComplete(f, executionStateMap); + return this._isFutureComplete(f, state.executionStateMap); }); } @@ -255,11 +256,6 @@ export class ExecutionEngine { ); } - private _sortFuturesByExistingNonces(futures: Future[]): Future[] { - // TODO: actually sort based on history against each execution state. - return futures; - } - private async _apply( state: ExecutionEngineState, message: JournalableMessage diff --git a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts index adf7cd1a70..307bf006ec 100644 --- a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -185,6 +185,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, storedArtifactPath: futureStart.storedArtifactPath, storedBuildInfoPath: futureStart.storedBuildInfoPath, @@ -210,6 +212,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, @@ -234,6 +238,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, @@ -257,6 +263,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, storedArtifactPath: futureStart.storedArtifactPath, eventName: futureStart.eventName, @@ -281,6 +289,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, value: BigInt(futureStart.value), data: futureStart.data, @@ -303,6 +313,8 @@ function initialiseExecutionStateFor( status: OnchainStatuses.EXECUTE, currentExecution: null, actions: {}, + from: null, + nonce: null, }, storedArtifactPath: futureStart.storedArtifactPath, contractAddress: futureStart.contractAddress, diff --git a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts index 32af49f96b..1e6b177ca8 100644 --- a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts +++ b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts @@ -87,6 +87,8 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_REQUEST, + from: action.from, + nonce: action.nonce, actions: { [action.executionId]: { request: action, @@ -99,6 +101,8 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.CALL_FUNCTION_TRANSACTION_REQUEST, + from: action.from, + nonce: action.nonce, actions: { [action.executionId]: { request: action, @@ -111,6 +115,8 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.SEND_DATA_TRANSACTION_REQUEST, + from: action.from, + nonce: action.nonce, actions: { [action.executionId]: { request: action, @@ -193,6 +199,8 @@ export function onchainActionReducer( ...state, status: OnchainStatuses.EXECUTE, currentExecution: null, + from: null, + nonce: null, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -230,6 +238,8 @@ export function onchainActionReducer( ...state, status: OnchainStatuses.EXECUTE, currentExecution: null, + from: null, + nonce: null, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -249,7 +259,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.SEND_DATA_START, - currentExecution: null, + currentExecution: action.executionId, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -269,7 +279,9 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.EXECUTE, - currentExecution: action.executionId, + currentExecution: null, + from: null, + nonce: null, actions: { [action.executionId]: { request: null, txHash: null, receipt: null }, }, @@ -286,6 +298,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.STATIC_CALL_START, + currentExecution: action.executionId, actions: { [action.executionId]: { result: null }, }, @@ -298,6 +311,9 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.EXECUTE, + currentExecution: null, + from: null, + nonce: null, actions: { [action.executionId]: { result: action }, }, @@ -314,6 +330,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.READ_EVENT_ARG_START, + currentExecution: action.executionId, actions: { [action.executionId]: { result: null }, }, @@ -326,6 +343,9 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.EXECUTE, + currentExecution: null, + from: null, + nonce: null, actions: { [action.executionId]: { result: action }, }, diff --git a/packages/core/src/new-api/internal/execution/sort-futures-by-nonces.ts b/packages/core/src/new-api/internal/execution/sort-futures-by-nonces.ts new file mode 100644 index 0000000000..9d5bb95d6d --- /dev/null +++ b/packages/core/src/new-api/internal/execution/sort-futures-by-nonces.ts @@ -0,0 +1,39 @@ +import sortBy from "lodash/sortBy"; + +import { Future } from "../../types/module"; +import { ExecutionEngineState } from "../types/execution-engine"; +import { assertIgnitionInvariant } from "../utils/assertions"; + +/** + * Sort futures based on exeuction state, particularly the from/nonce + * against the current on chain action. Accounts are sorted alphabetically, + * nonces are sorted in increasing order with undefined + * coming last (ties broken by future id). + * + * @param futures - the futures of the batch + * @param state - the execution engine state + * @returns sorted futures + */ +export function sortFuturesByNonces( + futures: Future[], + state: ExecutionEngineState +): Future[] { + const details = futures.map((f) => { + const exState = state.executionStateMap[f.id]; + + assertIgnitionInvariant( + exState !== undefined, + `Execution state needed for sorting for ${f.id}` + ); + + return { + future: f, + from: exState.onchain.from, + nonce: exState.onchain.nonce, + }; + }); + + const sortedDetails = sortBy(details, ["from", "nonce", "future.id"]); + + return sortedDetails.map((sd) => sd.future); +} diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index fdb00719fc..0efc3245ad 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -234,6 +234,8 @@ export interface OnchainState { | OnchainStatuses.CONTRACT_AT_START | OnchainStatuses.STATIC_CALL_START | OnchainStatuses.READ_EVENT_ARG_START; - currentExecution: null | number; + currentExecution: number | null; actions: { [key: number]: {} }; + from: string | null; + nonce: number | null; } diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index bb7a035ff4..7e2e7eea0f 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2177,4 +2177,148 @@ describe("execution engine", () => { ]); }); }); + + describe("with multiple froms", () => { + const addr1 = "0x1F98431c8aD98523631AE4a59f267346ea31F981"; + const addr2 = "0x1F98431c8aD98523631AE4a59f267346ea31F982"; + const addr3 = "0x1F98431c8aD98523631AE4a59f267346ea31F983"; + const addr4 = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const addr5 = "0x1F98431c8aD98523631AE4a59f267346ea31F985"; + const addr6 = "0x1F98431c8aD98523631AE4a59f267346ea31F986"; + + const tx1 = "0x111"; + const tx2 = "0x222"; + const tx3 = "0x333"; + const tx4 = "0x444"; + const tx5 = "0x555"; + const tx6 = "0x666"; + + it("should execute a deploy over multiple batches with different from accounts", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const account1 = m.getAccount(1); + const account2 = m.getAccount(2); + + // batch 1 + const contract1 = m.contract("Contract1", [], { + from: account1, + }); + const contractA = m.contract("ContractA", [], { + from: account1, + }); + + // batch 2 + const contract2 = m.contract("Contract2", [], { + from: account1, + after: [contract1], + }); + const contractB = m.contract("ContractB", [], { + from: account2, + after: [contractA], + }); + + // batch 3 + const contract3 = m.contract("Contract3", [], { + from: account2, + after: [contract2], + }); + const contractC = m.contract("ContractC", [], { + from: account2, + after: [contractB], + }); + + return { + contract1, + contract2, + contract3, + contractA, + contractB, + contractC, + }; + }); + + const deployer = setupDeployerWithMocks({ + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr1, + transactionHash: tx1, + }, + 1: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr2, + transactionHash: tx2, + }, + 2: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr3, + transactionHash: tx3, + }, + }, + [accounts[2]]: { + 0: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr4, + transactionHash: tx4, + }, + 1: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr5, + transactionHash: tx5, + }, + 2: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr6, + transactionHash: tx6, + }, + }, + }, + }); + + const result = await deployer.deploy( + moduleDefinition, + {}, + exampleAccounts + ); + + assertDeploymentSuccess(result, { + "Module1:Contract1": { + contractName: "Contract1", + storedArtifactPath: "Module1:Contract1.json", + contractAddress: addr1, + }, + "Module1:ContractA": { + contractName: "ContractA", + storedArtifactPath: "Module1:ContractA.json", + contractAddress: addr2, + }, + "Module1:Contract2": { + contractName: "Contract2", + storedArtifactPath: "Module1:Contract2.json", + contractAddress: addr3, + }, + "Module1:ContractB": { + contractName: "ContractB", + storedArtifactPath: "Module1:ContractB.json", + contractAddress: addr4, + }, + "Module1:Contract3": { + contractName: "Contract3", + storedArtifactPath: "Module1:Contract3.json", + contractAddress: addr5, + }, + "Module1:ContractC": { + contractName: "ContractC", + storedArtifactPath: "Module1:ContractC.json", + contractAddress: addr6, + }, + }); + }); + }); }); diff --git a/packages/core/test/new-api/execution/sort-futures-by-nonce.ts b/packages/core/test/new-api/execution/sort-futures-by-nonce.ts new file mode 100644 index 0000000000..c839752647 --- /dev/null +++ b/packages/core/test/new-api/execution/sort-futures-by-nonce.ts @@ -0,0 +1,120 @@ +import { assert } from "chai"; + +import { sortFuturesByNonces } from "../../../src/new-api/internal/execution/sort-futures-by-nonces"; +import { + ExecutionStateMap, + OnchainState, + OnchainStatuses, +} from "../../../src/new-api/internal/types/execution-state"; +import { Future } from "../../../src/new-api/types/module"; + +describe("execution engine - batch sorting", () => { + const addr1 = "0x9fD9B0c5A3fA1cE8Fe2f6425d0D93e0e242256bA"; + const addr2 = "0x458aA12c73D5bEbE3dF6e7a86dFd435b94f96dE9"; + + it("sort a by accounts/nonce and future id", () => { + const futures: Future[] = [ + { id: "Contract1" }, + { id: "Contract2" }, + { id: "Contract3" }, + { id: "Contract4" }, + { id: "Contract5" }, + { id: "Contract6" }, + { id: "Contract7" }, + ] as any; + + const exstateMap: ExecutionStateMap = { + Contract1: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: null, + nonce: null, + } as OnchainState, + } as any, + Contract2: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr1, + nonce: 0, + } as OnchainState, + } as any, + Contract3: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr1, + nonce: 1, + } as OnchainState, + } as any, + Contract4: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr1, + nonce: 2, + } as OnchainState, + } as any, + Contract5: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: null, + nonce: null, + } as OnchainState, + } as any, + Contract6: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr2, + nonce: 0, + } as OnchainState, + } as any, + Contract7: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr2, + nonce: 1, + } as OnchainState, + } as any, + Contract8: { + onchain: { + status: OnchainStatuses.EXECUTE, + currentExecution: null, + actions: {}, + from: addr2, + nonce: 2, + } as OnchainState, + } as any, + }; + + const sortedFutures = sortFuturesByNonces(futures, { + executionStateMap: exstateMap, + } as any); + + assert.deepStrictEqual( + sortedFutures.map((f) => f.id), + [ + "Contract6", + "Contract7", + + "Contract2", + "Contract3", + "Contract4", + + "Contract1", + "Contract5", + ] + ); + }); +}); diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 8fa084f200..8e90ff5954 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -30,6 +30,8 @@ export const exampleAccounts: string[] = [ export const initOnchainState: OnchainState = { status: OnchainStatuses.EXECUTE, currentExecution: null, + from: null, + nonce: null, actions: {}, }; diff --git a/packages/hardhat-plugin/test/execution/helpers.ts b/packages/hardhat-plugin/test/execution/helpers.ts new file mode 100644 index 0000000000..d95e4b68e4 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/helpers.ts @@ -0,0 +1,2 @@ +export const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts index 6f77622835..aa9c8764a7 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -4,16 +4,20 @@ import { assert } from "chai"; import { useEnvironment } from "../useEnvironment"; +import { sleep } from "./helpers"; + /** * This is the simplest contract deploy case. * * Deploy a single contract with non-problematic network */ -describe("execution - minimal contract deploy", () => { +describe.skip("execution - minimal contract deploy", function () { + this.timeout(60000); + // TODO: rename back to minimal api once execution switched over useEnvironment("minimal-new-api"); - it.skip("should deploy the contract", async function () { + it("should deploy a contract that is callable", async function () { await this.hre.run("compile", { quiet: true }); await this.hre.network.provider.request({ @@ -41,6 +45,3 @@ describe("execution - minimal contract deploy", () => { assert.equal(x, Number(1)); }); }); - -const sleep = (timeout: number) => - new Promise((res) => setTimeout(res, timeout)); diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts new file mode 100644 index 0000000000..e5283b80af --- /dev/null +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -0,0 +1,87 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { useEnvironment } from "../useEnvironment"; + +import { sleep } from "./helpers"; + +/** + * Deploy a multiple contracts over several batches. + * + * The intent here is to test batching. + */ +describe.skip("execution - multiple batch contract deploy", function () { + this.timeout(60000); + + // TODO: rename back to minimal api once execution switched over + useEnvironment("minimal-new-api"); + + it("should deploy over multiple batches", async function () { + await this.hre.network.provider.request({ + method: "evm_setAutomine", + params: [false], + }); + + const moduleDefinition = defineModule("FooModule", (m) => { + const contract1 = m.contract("Foo", [], { id: "Contract1" }); + const contractA = m.contract("Foo", [], { id: "ContractA" }); + + const contract2 = m.contract("Foo", [], { + id: "Contract2", + after: [contract1], + }); + const contractB = m.contract("Foo", [], { + id: "ContractB", + after: [contractA], + }); + + const contract3 = m.contract("Foo", [], { + id: "Contract3", + after: [contract2], + }); + const contractC = m.contract("Foo", [], { + id: "ContractC", + after: [contractB], + }); + + return { + contract1, + contractA, + contract2, + contractB, + contract3, + contractC, + }; + }); + + const deployPromise = this.hre.ignition2.deploy(moduleDefinition, { + parameters: {}, + }); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + await sleep(300); + await this.hre.network.provider.send("evm_mine"); + + const result = await deployPromise; + + const x1 = await result.contract1.x(); + const xA = await result.contractA.x(); + const x2 = await result.contract2.x(); + const xB = await result.contractB.x(); + const x3 = await result.contract3.x(); + const xC = await result.contractC.x(); + + assert.equal(x1, Number(1)); + assert.equal(xA, Number(1)); + assert.equal(x2, Number(1)); + assert.equal(xB, Number(1)); + assert.equal(x3, Number(1)); + assert.equal(xC, Number(1)); + }); +}); From d69d434cf7337e87962b11c5ec5bfb88b154f305 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 11 Jul 2023 13:34:44 +0100 Subject: [PATCH 0544/1302] feat: improve new block check Check the block number on the chain, don't return from the batch loop until it has at least increased by one. Resolves #299. --- .../core/src/new-api/internal/deployer.ts | 6 +++++ .../internal/execution/chain-dispatcher.ts | 4 ++++ .../internal/execution/execution-engine.ts | 22 ++++++++++++++++--- .../internal/types/chain-dispatcher.ts | 2 ++ .../internal/types/execution-engine.ts | 7 ++++++ packages/core/src/new-api/types/adapters.ts | 10 +++++++++ packages/core/test/new-api/helpers.ts | 9 ++++++++ .../hardhat-plugin/src/buildAdaptersFrom.ts | 17 +++++++++++++- 8 files changed, 73 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 5154f1c5eb..b2781f2d22 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -30,6 +30,8 @@ import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; import { validate } from "./validation/validate"; +const BLOCK_POLLING_INTERVAL = 200; + /** * Run an Igntition deployment. * @@ -113,6 +115,10 @@ export class Deployer { const batches = Batcher.batch(module, previousStateMap); return this._executionEngine.execute({ + block: { number: -1, hash: "-" }, + config: { + blockPollingInterval: BLOCK_POLLING_INTERVAL, + }, strategy: this._strategy, artifactResolver: this._artifactResolver, batches, diff --git a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts index 63363b7c8c..29ae04b8c1 100644 --- a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts @@ -14,6 +14,10 @@ export class ChainDispatcherImpl implements ChainDispatcher { this._accountsState = {}; } + public async getCurrentBlock(): Promise<{ number: number; hash: string }> { + return this._adapters.blocks.getBlock(); + } + // TODO: should nonce management be separated out into its own // class? public async allocateNextNonceForAccount(address: string): Promise { diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 7633b8d890..7e1507805f 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -65,6 +65,9 @@ export class ExecutionEngine { public async execute(state: ExecutionEngineState): Promise { const { batches, module } = state; + // Initialise the current block number/hash + state.block = await state.chainDispatcher.getCurrentBlock(); + const futures = getFuturesFromModule(module); for (const batch of batches) { @@ -136,7 +139,7 @@ export class ExecutionEngine { break; } - await this._newBlock(); + await this._newBlock(state); } return batchResults; @@ -170,8 +173,21 @@ export class ExecutionEngine { /** * Wait for the next block to be processed on-chain */ - private async _newBlock(): Promise { - await sleep(200); + private async _newBlock(state: ExecutionEngineState): Promise { + while (true) { + const currentBlock = await state.chainDispatcher.getCurrentBlock(); + + if ( + currentBlock.number > state.block.number || + currentBlock.hash !== state.block.hash + ) { + state.block = currentBlock; + + return; + } + + await sleep(state.config.blockPollingInterval); + } } private async _processFutureTick( diff --git a/packages/core/src/new-api/internal/types/chain-dispatcher.ts b/packages/core/src/new-api/internal/types/chain-dispatcher.ts index cbdf62ac53..323d2177f5 100644 --- a/packages/core/src/new-api/internal/types/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/types/chain-dispatcher.ts @@ -3,6 +3,8 @@ import { ethers } from "ethers"; import { ArgumentType } from "../../types/module"; export interface ChainDispatcher { + getCurrentBlock(): Promise<{ number: number; hash: string }>; + allocateNextNonceForAccount(address: string): Promise; constructDeployTransaction( diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 6e6f908f65..07bacd10ed 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -15,6 +15,13 @@ import { ChainDispatcher } from "./chain-dispatcher"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; export interface ExecutionEngineState { + block: { + number: number; + hash: string; + }; + config: { + blockPollingInterval: number; + }; batches: string[][]; module: IgnitionModule>; executionStateMap: ExecutionStateMap; diff --git a/packages/core/src/new-api/types/adapters.ts b/packages/core/src/new-api/types/adapters.ts index 5f29c36d0c..7eebc449eb 100644 --- a/packages/core/src/new-api/types/adapters.ts +++ b/packages/core/src/new-api/types/adapters.ts @@ -9,6 +9,7 @@ export interface Adapters { signer: SignerAdapter; gas: GasAdapter; transactions: TransactionsAdapter; + blocks: BlocksAdapter; } /** @@ -43,3 +44,12 @@ export interface TransactionsAdapter { txHash: string ): Promise; } + +/** + * Provide accto to Ethereum blocks + * + * @beta + */ +export interface BlocksAdapter { + getBlock(): Promise<{ number: number; hash: string }>; +} diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 8e90ff5954..6808957a8a 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -247,6 +247,7 @@ export function setupMockChainDispatcher({ export class MockChainDispatcher implements ChainDispatcher { private _accountsState: AccountsState; private _sentTxs: { [key: string]: ethers.providers.TransactionRequest }; + private _currentBlock: number; constructor( private _responses: { @@ -279,6 +280,8 @@ export class MockChainDispatcher implements ChainDispatcher { ) { this._accountsState = {}; this._sentTxs = {}; + + this._currentBlock = 1; } public getEventArgument( @@ -395,4 +398,10 @@ export class MockChainDispatcher implements ChainDispatcher { return response as any; } + + public async getCurrentBlock(): Promise<{ number: number; hash: string }> { + const number = this._currentBlock++; + + return { number, hash: `test-hash-${number}` }; + } } diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/buildAdaptersFrom.ts index 94151253ac..2d0cbb19e7 100644 --- a/packages/hardhat-plugin/src/buildAdaptersFrom.ts +++ b/packages/hardhat-plugin/src/buildAdaptersFrom.ts @@ -1,4 +1,8 @@ -import { Adapters, TransactionsAdapter } from "@ignored/ignition-core"; +import { + Adapters, + BlocksAdapter, + TransactionsAdapter, +} from "@ignored/ignition-core"; import { ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -33,10 +37,21 @@ export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { }, }; + const blockAdapter: BlocksAdapter = { + async getBlock(): Promise<{ number: number; hash: string }> { + const blockNumber = await hre.ethers.provider.getBlockNumber(); + + const block = await hre.ethers.provider.getBlock(blockNumber); + + return { number: block.number, hash: block.hash }; + }, + }; + const adapters: Adapters = { transactions: transactionsAdapter, gas: gasAdapter, signer: signerAdapter, + blocks: blockAdapter, }; return adapters; From 2798bc64d66b34f8e9dbd93395f6a0d474e16bb9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 11 Jul 2023 16:20:05 +0100 Subject: [PATCH 0545/1302] feat: add nonce checks on init and during processing At the beginning of the execution run check run a check on the nonces of any accounts going to be used in the deployment. If there are pending user started transactions warn. If there are Ignition transactions from a previous run continue During batch processing check transactions for user interference or dropping from the memory pool. Resolves #300 feat: add check for pending ignition transactions On initialization, check if the nonces match for in-flight transactions from a previous run. --- .../internal/execution/chain-dispatcher.ts | 41 ++++- .../internal/execution/execution-engine.ts | 136 +++++++++++++- .../execution/execution-state-reducer.ts | 6 + .../execution/onchain-action-reducer.ts | 114 +++++++++++- .../execution/onchain-state-transitions.ts | 170 +++++++++--------- .../new-api/internal/journal/type-guards.ts | 8 + .../internal/types/chain-dispatcher.ts | 8 + .../new-api/internal/types/execution-state.ts | 15 +- packages/core/src/new-api/type-guards.ts | 50 ++++++ packages/core/src/new-api/types/adapters.ts | 9 +- packages/core/src/new-api/types/journal.ts | 16 ++ packages/core/test/new-api/helpers.ts | 31 ++++ packages/hardhat-plugin/package.json | 2 +- .../hardhat-plugin/src/buildAdaptersFrom.ts | 12 +- .../hardhat-plugin/src/ignition-helper.ts | 27 ++- .../hardhat-plugin/test/execution/helpers.ts | 38 ++++ .../error-on-pending-user-transactions.ts | 50 ++++++ ...-with-replaced-pending-user-transaction.ts | 69 +++++++ .../error-on-transaction-dropped.ts | 55 ++++++ .../error-on-user-transaction-sent.ts | 63 +++++++ ...rerun-with-dropped-ignition-transaction.ts | 59 ++++++ ...with-now-complete-ignition-transactions.ts | 103 +++++++++++ ...erun-with-pending-ignition-transactions.ts | 102 +++++++++++ ...ith-replaced-confirmed-user-transaction.ts | 83 +++++++++ .../nonce-checks/useDeploymentDirectory.ts | 167 +++++++++++++++++ .../test/fixture-projects/.gitignore | 1 + packages/hardhat-plugin/test/helpers.ts | 2 +- 27 files changed, 1332 insertions(+), 105 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts create mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts diff --git a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts index 29ae04b8c1..f9cb645921 100644 --- a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts @@ -1,5 +1,6 @@ import { Contract, ContractFactory, ethers } from "ethers"; +import { IgnitionError } from "../../../errors"; import { Adapters } from "../../types/adapters"; import { ArgumentType } from "../../types/module"; import { ChainDispatcher } from "../types/chain-dispatcher"; @@ -14,6 +15,14 @@ export class ChainDispatcherImpl implements ChainDispatcher { this._accountsState = {}; } + public async getPendingTransactionCount(address: string): Promise { + return this._adapters.transactions.getPendingTransactionCount(address); + } + + public async getLatestTransactionCount(address: string): Promise { + return this._adapters.transactions.getLatestTransactionCount(address); + } + public async getCurrentBlock(): Promise<{ number: number; hash: string }> { return this._adapters.blocks.getBlock(); } @@ -21,16 +30,30 @@ export class ChainDispatcherImpl implements ChainDispatcher { // TODO: should nonce management be separated out into its own // class? public async allocateNextNonceForAccount(address: string): Promise { + const pendingNonce = await this.getPendingTransactionCount(address); + if (address in this._accountsState) { - const nextNonce = this._accountsState[address] + 1; - this._accountsState[address] = nextNonce; - return nextNonce; + const expectedNextNonce = this._accountsState[address] + 1; + + if (pendingNonce < expectedNextNonce) { + throw new IgnitionError( + `The current transaction has been dropped for account ${address}` + ); + } + + if (pendingNonce > expectedNextNonce) { + throw new IgnitionError( + `A transaction has been submitted on the account ${address} outside of the deployment` + ); + } + + this._accountsState[address] = expectedNextNonce; + return expectedNextNonce; } - const onchainNonce = await this._getTransactionCount(address); - this._accountsState[address] = onchainNonce; + this._accountsState[address] = pendingNonce; - return onchainNonce; + return pendingNonce; } public async constructDeployTransaction( @@ -158,7 +181,9 @@ export class ChainDispatcherImpl implements ChainDispatcher { return this._adapters.transactions.getTransactionReceipt(txHash); } - private async _getTransactionCount(address: string): Promise { - return this._adapters.transactions.getTransactionCount(address); + public async getTransaction( + txHash: string + ): Promise { + return this._adapters.transactions.getTransaction(txHash); } } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 7e1507805f..d8176d92ca 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -1,8 +1,15 @@ +import groupBy from "lodash/groupBy"; import identity from "lodash/identity"; +import maxBy from "lodash/maxBy"; +import sortBy from "lodash/sortBy"; +import uniq from "lodash/uniq"; import { IgnitionError } from "../../../errors"; import { sleep } from "../../../internal/utils/sleep"; -import { isModuleParameterRuntimeValue } from "../../type-guards"; +import { + isFutureThatSubmitsOnchainTransaction, + isModuleParameterRuntimeValue, +} from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; @@ -10,6 +17,7 @@ import { ExecutionResultMessage, FutureStartMessage, JournalableMessage, + OnchainTransactionReset, TransactionMessage, } from "../../types/journal"; import { @@ -70,6 +78,8 @@ export class ExecutionEngine { const futures = getFuturesFromModule(module); + await this._checkNonces(state, futures); + for (const batch of batches) { // TODO: consider changing batcher to return futures rather than ids const executionBatch = batch.map((futureId) => @@ -105,6 +115,130 @@ export class ExecutionEngine { }; } + private async _checkNonces(state: ExecutionEngineState, futures: Future[]) { + const transactionSubmittingFutures = futures.filter( + isFutureThatSubmitsOnchainTransaction + ); + + const usedAccounts = uniq( + transactionSubmittingFutures.map((f) => resolveFromAddress(f.from, state)) + ); + + const pendingIgnitionTransactions = transactionSubmittingFutures + .map((f) => { + const exState = state.executionStateMap[f.id]; + + if ( + exState === undefined || + exState.onchain.currentExecution === null || + exState.onchain.nonce === null || + exState.onchain.txHash === null + ) { + return null; + } + + return { + futureId: f.id, + executionId: exState.onchain.currentExecution, + from: resolveFromAddress(f.from, state), + nonce: exState.onchain.nonce, + hash: exState.onchain.txHash, + }; + }) + .filter((x: T | null): x is T => x !== null); + + const inflightByAccount = groupBy(pendingIgnitionTransactions, "from"); + + for (const usedAccount of usedAccounts) { + const pending = await state.chainDispatcher.getPendingTransactionCount( + usedAccount + ); + const latest = await state.chainDispatcher.getLatestTransactionCount( + usedAccount + ); + + const inflight = inflightByAccount[usedAccount]; + + // no inflight transactions + if (inflight === undefined) { + if (pending !== latest) { + throw new IgnitionError( + `Pending transactions for account: ${usedAccount}, please wait for transactions to complete before running a deploy` + ); + } + + // no pending transactions + return; + } + + const maxNonceTran = maxBy(inflight, "nonce"); + + assertIgnitionInvariant( + maxNonceTran !== undefined, + "Always at least one entry going into maxBy" + ); + + // The pending transactions do not match the expected list + // given the inflight transactions from the previous run + if (maxNonceTran.nonce + 1 < pending) { + // TODO: is this error message correct? + throw new IgnitionError( + `Pending transactions for account: ${usedAccount}, please wait for transactions to complete before running a deploy` + ); + } + + for (const intran of sortBy(inflight, "nonce")) { + const result = await state.chainDispatcher.getTransaction(intran.hash); + + // transaction is confirmed or pending as expected + if (result !== null && result !== undefined) { + continue; + } + + // There is a confirmed user sent transaction that + // has replaced the expected transaction + if (latest >= intran.nonce + 1) { + // Try sending the request again, using a new nonce + const revert: OnchainTransactionReset = { + type: "onchain-transaction-reset", + futureId: intran.futureId, + executionId: intran.executionId, + }; + + await this._apply(state, revert); + } + + // there is a pending transaction sent by the user + // with the same nonce + if (latest < intran.nonce + 1 && pending >= intran.nonce + 1) { + throw new IgnitionError("Pending transaction from user"); + } + + // the transaction has been dropped without any user interference + if (latest < intran.nonce + 1 && pending < intran.nonce + 1) { + // try sending again potentially using the same nonce + const revert: OnchainTransactionReset = { + type: "onchain-transaction-reset", + futureId: intran.futureId, + executionId: intran.executionId, + }; + + await this._apply(state, revert); + } + + assertIgnitionInvariant( + true, + `Unexpected nonce check state for account ${usedAccount}` + ); + } + + // There are pending transactions but they are accounted for + // by the inflight transactions from the previous run, + // including those that confirmed between runs + return; + } + } + private async _executeBatch( batch: ExecutionBatch, state: ExecutionEngineState diff --git a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts index 307bf006ec..c90af7d8f6 100644 --- a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -187,6 +187,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, storedArtifactPath: futureStart.storedArtifactPath, storedBuildInfoPath: futureStart.storedBuildInfoPath, @@ -214,6 +215,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, @@ -240,6 +242,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, contractAddress: futureStart.contractAddress, storedArtifactPath: futureStart.storedArtifactPath, @@ -265,6 +268,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, storedArtifactPath: futureStart.storedArtifactPath, eventName: futureStart.eventName, @@ -291,6 +295,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, value: BigInt(futureStart.value), data: futureStart.data, @@ -315,6 +320,7 @@ function initialiseExecutionStateFor( actions: {}, from: null, nonce: null, + txHash: null, }, storedArtifactPath: futureStart.storedArtifactPath, contractAddress: futureStart.contractAddress, diff --git a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts index 1e6b177ca8..927a3f6dd3 100644 --- a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts +++ b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts @@ -10,6 +10,7 @@ import { isOnchainStaticCallSuccessMessage, isOnchainTransactionAccept, isOnchainTransactionRequest, + isOnchainTransactionReset, } from "../journal/type-guards"; import { serializeReplacer } from "../journal/utils/serialize-replacer"; import { OnchainState, OnchainStatuses } from "../types/execution-state"; @@ -67,7 +68,12 @@ export function onchainActionReducer( status: OnchainStatuses.DEPLOY_CONTRACT_START, currentExecution: action.executionId, actions: { - [action.executionId]: { request: null, txHash: null, receipt: null }, + [action.executionId]: { + start: action, + request: null, + txHash: null, + receipt: null, + }, }, }; } @@ -91,6 +97,7 @@ export function onchainActionReducer( nonce: action.nonce, actions: { [action.executionId]: { + ...state.actions[action.executionId], request: action, txHash: null, receipt: null, @@ -105,6 +112,7 @@ export function onchainActionReducer( nonce: action.nonce, actions: { [action.executionId]: { + ...state.actions[action.executionId], request: action, txHash: null, receipt: null, @@ -119,6 +127,7 @@ export function onchainActionReducer( nonce: action.nonce, actions: { [action.executionId]: { + ...state.actions[action.executionId], request: action, txHash: null, receipt: null, @@ -147,6 +156,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT, + txHash: action.txHash, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -161,6 +171,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT, + txHash: action.txHash, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -173,6 +184,7 @@ export function onchainActionReducer( return { ...state, status: OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT, + txHash: action.txHash, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -188,6 +200,83 @@ export function onchainActionReducer( } } + if (isOnchainTransactionReset(action)) { + assertCurrentStatus( + [ + OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT, + OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT, + OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT, + ], + state, + action + ); + + if (state.status === OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT) { + const previousStart = (state.actions[action.executionId] as any).start; + + return { + ...state, + status: OnchainStatuses.DEPLOY_CONTRACT_START, + currentExecution: state.currentExecution, + from: null, + nonce: null, + txHash: null, + actions: { + [action.executionId]: { + start: previousStart, + request: null, + txHash: null, + receipt: null, + }, + }, + }; + } else if ( + state.status === OnchainStatuses.CALL_FUNCTION_TRANSACTION_ACCEPT + ) { + const previousStart = (state.actions[action.executionId] as any).start; + + return { + ...state, + status: OnchainStatuses.CALL_FUNCTION_START, + currentExecution: state.currentExecution, + from: null, + nonce: null, + txHash: null, + actions: { + [action.executionId]: { + start: previousStart, + request: null, + txHash: null, + receipt: null, + }, + }, + }; + } else if (state.status === OnchainStatuses.SEND_DATA_TRANSACTION_ACCEPT) { + const previousStart = (state.actions[action.executionId] as any).start; + + return { + ...state, + status: OnchainStatuses.SEND_DATA_START, + currentExecution: state.currentExecution, + from: null, + nonce: null, + txHash: null, + actions: { + [action.executionId]: { + start: previousStart, + request: null, + txHash: null, + receipt: null, + }, + }, + }; + } else { + throw new IgnitionError( + `Unexpected status for transaction accept ${state?.status as any}` + ); + } + } + if (isOnchainDeployContractSuccessMessage(action)) { assertCurrentStatus( [OnchainStatuses.DEPLOY_CONTRACT_TRANSACTION_ACCEPT], @@ -201,6 +290,7 @@ export function onchainActionReducer( currentExecution: null, from: null, nonce: null, + txHash: null, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -222,7 +312,12 @@ export function onchainActionReducer( status: OnchainStatuses.CALL_FUNCTION_START, currentExecution: action.executionId, actions: { - [action.executionId]: { request: null, txHash: null, receipt: null }, + [action.executionId]: { + start: action, + request: null, + txHash: null, + receipt: null, + }, }, }; } @@ -240,6 +335,7 @@ export function onchainActionReducer( currentExecution: null, from: null, nonce: null, + txHash: null, actions: { [action.executionId]: { ...state.actions[action.executionId], @@ -262,8 +358,10 @@ export function onchainActionReducer( currentExecution: action.executionId, actions: { [action.executionId]: { - ...state.actions[action.executionId], - receipt: action, + start: action, + request: null, + txHash: null, + receipt: null, }, }, }; @@ -282,8 +380,12 @@ export function onchainActionReducer( currentExecution: null, from: null, nonce: null, + txHash: null, actions: { - [action.executionId]: { request: null, txHash: null, receipt: null }, + [action.executionId]: { + ...state.actions[action.executionId], + receipt: action, + }, }, }; } @@ -314,6 +416,7 @@ export function onchainActionReducer( currentExecution: null, from: null, nonce: null, + txHash: null, actions: { [action.executionId]: { result: action }, }, @@ -346,6 +449,7 @@ export function onchainActionReducer( currentExecution: null, from: null, nonce: null, + txHash: null, actions: { [action.executionId]: { result: action }, }, diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index f1b12604b1..2b835534c3 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -1,5 +1,6 @@ import { ethers } from "ethers"; +import { IgnitionError } from "../../../errors"; import { serializeReplacer } from "../../../helpers"; import { CallFunctionInteractionMessage, @@ -28,9 +29,13 @@ import { isOnchainFailureMessage, isOnchainTransactionAccept, isOnchainTransactionRequest, + isOnchainTransactionReset, } from "../journal/type-guards"; import { ExecutionEngineState } from "../types/execution-engine"; -import { OnchainStatuses } from "../types/execution-state"; +import { + DeploymentExecutionState, + OnchainStatuses, +} from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; @@ -86,18 +91,26 @@ export const onchainStateTransitions: OnchainStateTransitions = { }, [OnchainStatuses.DEPLOY_CONTRACT_START]: async (state, next) => { assertIgnitionInvariant( - next !== null && isDeployContractInteraction(next), + next !== null && + (isDeployContractInteraction(next) || isOnchainTransactionReset(next)), `Message not in sync with onchain state - DEPLOY_CONTRACT_START: ${JSON.stringify( next, serializeReplacer )}` ); + const exState = state.executionStateMap[ + next.futureId + ] as DeploymentExecutionState; + + const start = (exState.onchain.actions[next.executionId] as any) + .start as DeployContractInteractionMessage; + const nonce = await state.chainDispatcher.allocateNextNonceForAccount( - next.from + start.from ); - const tx = await _convertRequestToDeployTransaction(next, state); + const tx = await _convertRequestToDeployTransaction(start, state); tx.nonce = nonce; const onchainTransaction: OnchainTransactionRequest = { @@ -105,7 +118,7 @@ export const onchainStateTransitions: OnchainStateTransitions = { futureId: next.futureId, executionId: next.executionId, nonce, - from: next.from, + from: start.from, tx, }; @@ -166,33 +179,18 @@ export const onchainStateTransitions: OnchainStateTransitions = { )}` ); - const currentTransaction = - await state.chainDispatcher.getTransactionReceipt(next.txHash); - - if (currentTransaction === null || currentTransaction === undefined) { - // No receipt means it hasn't been included in a block yet - return { status: "pause" }; - } - - if ( - currentTransaction.blockNumber === undefined || - // TODO: make default confirmations config - currentTransaction.confirmations < DEFAULT_CONFIRMATIONS - ) { - // transaction pending, move on with batch - return { status: "pause" }; - } - - const deployResult: OnchainDeployContractSuccessMessage = { - type: "onchain-result", - subtype: "deploy-contract-success", - futureId: next.futureId, - executionId: next.executionId, - contractAddress: currentTransaction.contractAddress, - txId: currentTransaction.transactionHash, - }; + return checkTransactionComplete(state, next, (receipt) => { + const deployResult: OnchainDeployContractSuccessMessage = { + type: "onchain-result", + subtype: "deploy-contract-success", + futureId: next.futureId, + executionId: next.executionId, + contractAddress: receipt.contractAddress, + txId: receipt.transactionHash, + }; - return { status: "continue", next: deployResult }; + return deployResult; + }); }, [OnchainStatuses.CALL_FUNCTION_START]: async (state, next) => { assertIgnitionInvariant( @@ -270,32 +268,17 @@ export const onchainStateTransitions: OnchainStateTransitions = { )}` ); - const currentTransaction = - await state.chainDispatcher.getTransactionReceipt(next.txHash); - - if (currentTransaction === null || currentTransaction === undefined) { - // No receipt means it hasn't been included in a block yet - return { status: "pause" }; - } - - if ( - currentTransaction.blockNumber === undefined || - // TODO: make default confirmations config - currentTransaction.confirmations < DEFAULT_CONFIRMATIONS - ) { - // transaction pending, move on with batch - return { status: "pause" }; - } - - const deployResult: OnchainCallFunctionSuccessMessage = { - type: "onchain-result", - subtype: "call-function-success", - futureId: next.futureId, - executionId: next.executionId, - txId: currentTransaction.transactionHash, - }; + return checkTransactionComplete(state, next, (receipt) => { + const callResult: OnchainCallFunctionSuccessMessage = { + type: "onchain-result", + subtype: "call-function-success", + futureId: next.futureId, + executionId: next.executionId, + txId: receipt.transactionHash, + }; - return { status: "continue", next: deployResult }; + return callResult; + }); }, [OnchainStatuses.SEND_DATA_START]: async (state, next) => { assertIgnitionInvariant( @@ -373,32 +356,17 @@ export const onchainStateTransitions: OnchainStateTransitions = { )}` ); - const currentTransaction = - await state.chainDispatcher.getTransactionReceipt(next.txHash); - - if (currentTransaction === null || currentTransaction === undefined) { - // No receipt means it hasn't been included in a block yet - return { status: "pause" }; - } - - if ( - currentTransaction.blockNumber === undefined || - // TODO: make default confirmations config - currentTransaction.confirmations < DEFAULT_CONFIRMATIONS - ) { - // transaction pending, move on with batch - return { status: "pause" }; - } - - const deployResult: OnchainSendDataSuccessMessage = { - type: "onchain-result", - subtype: "send-data-success", - futureId: next.futureId, - executionId: next.executionId, - txId: currentTransaction.transactionHash, - }; + return checkTransactionComplete(state, next, (receipt) => { + const sendResult: OnchainSendDataSuccessMessage = { + type: "onchain-result", + subtype: "send-data-success", + futureId: next.futureId, + executionId: next.executionId, + txId: receipt.transactionHash, + }; - return { status: "continue", next: deployResult }; + return sendResult; + }); }, [OnchainStatuses.CONTRACT_AT_START]: async (state, next) => { assertIgnitionInvariant( @@ -619,3 +587,43 @@ async function _readEventArg( }; } } + +async function checkTransactionComplete( + state: ExecutionEngineState, + next: { txHash: string; futureId: string; executionId: number }, + successConstructor: ( + receipt: ethers.providers.TransactionReceipt + ) => ExecutionSuccess | ExecutionFailure | TransactionMessage +): Promise { + const currentTransaction = await state.chainDispatcher.getTransaction( + next.txHash + ); + + if (currentTransaction === null || currentTransaction === undefined) { + throw new IgnitionError( + `Transaction ${next.txHash} (${next.futureId}/${next.executionId}) has dropped from mempool` + ); + } + + const receipt = await state.chainDispatcher.getTransactionReceipt( + next.txHash + ); + + if (receipt === null || receipt === undefined) { + // No receipt means it hasn't been included in a block yet + return { status: "pause" }; + } + + if ( + receipt.blockNumber === undefined || + // TODO: make default confirmations config + receipt.confirmations < DEFAULT_CONFIRMATIONS + ) { + // transaction pending, move on with batch + return { status: "pause" }; + } + + const successMessage = successConstructor(receipt); + + return { status: "continue", next: successMessage }; +} diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 6f6cbb71a5..e94fd47c90 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -16,6 +16,7 @@ import { OnchainStaticCallSuccessMessage, OnchainTransactionAccept, OnchainTransactionRequest, + OnchainTransactionReset, ReadEventArgumentStartMessage, SendDataStartMessage, StaticCallStartMessage, @@ -146,6 +147,7 @@ export function isTransactionMessage( isOnchainInteractionMessage(message) || isOnchainTransactionRequest(message) || isOnchainTransactionAccept(message) || + isOnchainTransactionReset(message) || isOnChainResultMessage(message) ); } @@ -162,6 +164,12 @@ export function isOnchainTransactionAccept( return message.type === "onchain-transaction-accept"; } +export function isOnchainTransactionReset( + message: JournalableMessage +): message is OnchainTransactionReset { + return message.type === "onchain-transaction-reset"; +} + export function isOnChainResultMessage( message: JournalableMessage ): message is OnchainResultMessage { diff --git a/packages/core/src/new-api/internal/types/chain-dispatcher.ts b/packages/core/src/new-api/internal/types/chain-dispatcher.ts index 323d2177f5..e03aff86e9 100644 --- a/packages/core/src/new-api/internal/types/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/types/chain-dispatcher.ts @@ -3,6 +3,10 @@ import { ethers } from "ethers"; import { ArgumentType } from "../../types/module"; export interface ChainDispatcher { + getPendingTransactionCount(address: string): Promise; + + getLatestTransactionCount(address: string): Promise; + getCurrentBlock(): Promise<{ number: number; hash: string }>; allocateNextNonceForAccount(address: string): Promise; @@ -37,6 +41,10 @@ export interface ChainDispatcher { from: string ): Promise; + getTransaction( + txHash: string + ): Promise; + getTransactionReceipt( txHash: string ): Promise; diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 0efc3245ad..b4c4ae0604 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -235,7 +235,20 @@ export interface OnchainState { | OnchainStatuses.STATIC_CALL_START | OnchainStatuses.READ_EVENT_ARG_START; currentExecution: number | null; - actions: { [key: number]: {} }; + actions: { + [key: number]: + | { + start: {}; + request: {} | null; + txHash: {} | null; + receipt: {} | null; + } + | { + result: {} | null; + } + | { contractAt: {} | null }; + }; from: string | null; nonce: number | null; + txHash: string | null; } diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 80630756c4..cae571dcf6 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -3,13 +3,16 @@ import { Artifact } from "./types/artifact"; import { AccountRuntimeValue, AddressResolvableFuture, + ArtifactContractAtFuture, ContractFuture, DeploymentFuture, FunctionCallFuture, Future, FutureType, ModuleParameterRuntimeValue, + NamedContractAtFuture, NamedStaticCallFuture, + ReadEventArgumentFuture, RuntimeValue, RuntimeValueType, } from "./types/module"; @@ -147,6 +150,28 @@ export function isReadEventArgumentFuture( return future.type === FutureType.READ_EVENT_ARGUMENT; } +/** + * Returns true if future is of type NamedContractAtFuture. + * + * @beta + */ +export function isNamedContractAtFuture( + future: Future +): future is NamedContractAtFuture { + return future.type === FutureType.NAMED_CONTRACT_AT; +} + +/** + * Returns true if future is of type ArtifactContractAtFuture. + * + * @beta + */ +export function isArtifactContractAtFuture( + future: Future +): future is ArtifactContractAtFuture { + return future.type === FutureType.ARTIFACT_CONTRACT_AT; +} + /** * Returns true if the type is of type DeploymentFuture. * @@ -179,6 +204,31 @@ export function isDeploymentFuture( return isDeploymentType(future.type); } +/** + * Returns true if the future requires submitting a transaction on-chain + * + * @beta + */ +export function isFutureThatSubmitsOnchainTransaction( + f: Future +): f is Exclude< + Exclude< + Exclude< + Exclude>, + ReadEventArgumentFuture + >, + NamedContractAtFuture + >, + ArtifactContractAtFuture +> { + return ( + !isNamedStaticCallFuture(f) && + !isReadEventArgumentFuture(f) && + !isNamedContractAtFuture(f) && + !isArtifactContractAtFuture(f) + ); +} + /** * Returns true if potential is of type RuntimeValueType. * diff --git a/packages/core/src/new-api/types/adapters.ts b/packages/core/src/new-api/types/adapters.ts index 7eebc449eb..6623a88031 100644 --- a/packages/core/src/new-api/types/adapters.ts +++ b/packages/core/src/new-api/types/adapters.ts @@ -39,10 +39,17 @@ export interface GasAdapter { * @beta */ export interface TransactionsAdapter { - getTransactionCount(address: string): Promise; + getTransaction( + txHash: string + ): Promise; + getTransactionReceipt( txHash: string ): Promise; + + getPendingTransactionCount(address: string): Promise; + + getLatestTransactionCount(address: string): Promise; } /** diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 3a2fd22bf1..dd0d928476 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -32,6 +32,7 @@ export type TransactionMessage = | OnchainInteractionMessage | OnchainTransactionRequest | OnchainTransactionAccept + | OnchainTransactionReset | OnchainResultMessage; // #region "OnchainInteraction" @@ -182,6 +183,21 @@ export interface OnchainTransactionAccept { // #endregion +// #region "OnchainTransactionReset" + +/** + * Records a transaction submission being reset, so it can be resent. + * + * @beta + */ +export interface OnchainTransactionReset { + type: "onchain-transaction-reset"; + futureId: string; + executionId: number; +} + +// #endregion + // #region "OnchainResult" /** diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 6808957a8a..e993d270ce 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -32,6 +32,7 @@ export const initOnchainState: OnchainState = { currentExecution: null, from: null, nonce: null, + txHash: null, actions: {}, }; @@ -399,9 +400,39 @@ export class MockChainDispatcher implements ChainDispatcher { return response as any; } + public async getTransaction( + txHash: string + ): Promise { + const [from, nonce] = txHash.split("--"); + + const addressEntries = this._responses[from]; + + if (addressEntries === undefined) { + throw new Error(`No transaction responses recorded for address ${from}`); + } + + const response = addressEntries[parseInt(nonce, 10)]; + + if (response === undefined) { + throw new Error( + `No transaction responses recorded for nonce ${from}/${nonce}` + ); + } + + return { _kind: "fake-transaction" } as any; + } + public async getCurrentBlock(): Promise<{ number: number; hash: string }> { const number = this._currentBlock++; return { number, hash: `test-hash-${number}` }; } + + public async getPendingTransactionCount(_address: string): Promise { + return 0; + } + + public async getLatestTransactionCount(_address: string): Promise { + return 0; + } } diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 5a7a273968..ba456c4904 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -30,7 +30,7 @@ "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", - "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments" }, "devDependencies": { "@ignored/ignition-core": "^0.0.13", diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/buildAdaptersFrom.ts index 2d0cbb19e7..63ed827d1f 100644 --- a/packages/hardhat-plugin/src/buildAdaptersFrom.ts +++ b/packages/hardhat-plugin/src/buildAdaptersFrom.ts @@ -32,8 +32,16 @@ export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { ): Promise { return hre.ethers.provider.getTransactionReceipt(txHash); }, - async getTransactionCount(address: string): Promise { - return hre.ethers.provider.getTransactionCount(address); + async getTransaction( + txHash: string + ): Promise { + return hre.ethers.provider.getTransaction(txHash); + }, + async getPendingTransactionCount(address: string): Promise { + return hre.ethers.provider.getTransactionCount(address, "pending"); + }, + async getLatestTransactionCount(address: string): Promise { + return hre.ethers.provider.getTransactionCount(address, "latest"); }, }; diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index 32b5c7f70c..382e999ecc 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -1,4 +1,5 @@ import { + Adapters, deploy, DeploymentResultSuccess, IgnitionError, @@ -9,12 +10,23 @@ import { import { Contract } from "ethers"; import fs from "fs-extra"; import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; export class IgnitionHelper { - constructor(private _hre: HardhatRuntimeEnvironment) {} + private _adapters: Adapters; + private _deploymentDir: string | undefined; + + constructor( + private _hre: HardhatRuntimeEnvironment, + adapters?: Adapters, + deploymentDir?: string + ) { + this._adapters = adapters ?? buildAdaptersFrom(this._hre); + this._deploymentDir = deploymentDir; + } public async deploy( ignitionModuleDefinition: IgnitionModuleDefinition< @@ -23,7 +35,7 @@ export class IgnitionHelper { IgnitionModuleResult >, { parameters = {} }: { parameters: { [key: string]: ModuleParameters } } - ): Promise { + ): Promise> { const accounts = (await this._hre.network.provider.request({ method: "eth_accounts", })) as string[]; @@ -31,7 +43,8 @@ export class IgnitionHelper { const artifactResolver = new HardhatArtifactResolver(this._hre); const result = await deploy({ - adapters: buildAdaptersFrom(this._hre), + adapters: this._adapters, + deploymentDir: this._deploymentDir, artifactResolver, moduleDefinition: ignitionModuleDefinition, deploymentParameters: parameters, @@ -79,7 +92,13 @@ export class IgnitionHelper { storedArtifactPath: any ): Promise { const artifact = JSON.parse( - (await fs.readFile(storedArtifactPath)).toString() + ( + await fs.readFile( + this._deploymentDir !== undefined + ? path.join(this._deploymentDir, storedArtifactPath) + : storedArtifactPath + ) + ).toString() ); return artifact.abi; diff --git a/packages/hardhat-plugin/test/execution/helpers.ts b/packages/hardhat-plugin/test/execution/helpers.ts index d95e4b68e4..af2e1215aa 100644 --- a/packages/hardhat-plugin/test/execution/helpers.ts +++ b/packages/hardhat-plugin/test/execution/helpers.ts @@ -1,2 +1,40 @@ +import { assert } from "chai"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + export const sleep = (timeout: number) => new Promise((res) => setTimeout(res, timeout)); + +export function mineBlock(hre: HardhatRuntimeEnvironment): Promise { + return hre.network.provider.send("evm_mine"); +} + +export async function clearPendingTransactionsFromMemoryPool( + hre: HardhatRuntimeEnvironment +): Promise { + const pendingBlockBefore = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + assert( + pendingBlockBefore.transactions.length > 0, + "Clearing an empty mempool" + ); + + for (const hash of pendingBlockBefore.transactions) { + await hre.network.provider.request({ + method: "hardhat_dropTransaction", + params: [hash], + }); + } + + const pendingBlockAfter = await hre.network.provider.send( + "eth_getBlockByNumber", + ["pending", false] + ); + + assert( + pendingBlockAfter.transactions.length === 0, + "All blocks should be cleared" + ); +} diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts new file mode 100644 index 0000000000..39bb29ba3c --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts @@ -0,0 +1,50 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * For all accounts that will be used during the deployment we check + * to see if there are pending transactions (not from previous runs) + * and error if there are any. + */ +describe("execution - error on pending user transactions", () => { + useDeploymentDirectory( + "minimal-new-api", + "error-on-rerun-with-replaced-pending-user-transaction" + ); + + it("should error if a transaction is in flight for an account used in the deploy", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Before deploy, put a valid transaction into the mempool for accounts[2] + const [, , signer2] = await this.hre.ethers.getSigners(); + const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + const outsideFooPromise = FooFactory.connect(signer2).deploy(); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.deploy(moduleDefinition, async (c: TestChainHelper) => { + await c.mineBlock(1); + }), + "Pending transactions for account: 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc, please wait for transactions to complete before running a deploy" + ); + + // The users interfering transaction completes normally + const outsideFoo = await outsideFooPromise; + assert.equal(await outsideFoo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts new file mode 100644 index 0000000000..5b11434b8b --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -0,0 +1,69 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. The user then replaces a transaction by + * reusing a nonce with a higher gas value. On the rerun we should + * error that there is a pending non-ignition transaction. + */ +describe("execution - error on rerun with replaced pending user transaction", () => { + useDeploymentDirectory( + "minimal-new-api", + "error-on-rerun-with-replaced-pending-user-transaction" + ); + + it("should error on the second run", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + const foo3 = m.contract("Foo", [], { id: "Foo3", from: account2 }); + + return { + foo1, + foo2, + foo3, + }; + }); + + // Start the deployment, but exit before processing a block, + // so transactions are in memory pool but not confirmed + await this.deploy( + moduleDefinition, + + async (c: TestChainHelper) => { + // Wait for the submission of foo1 foo2 and foo3 to mempool + await c.waitForPendingTxs(3); + + // Then kill before any blocks + c.exitDeploy(); + } + ); + + // Send user interefering deploy transaction, between runs + // so it is in mempool, overriding the existing nonce 2 + // transaction + const [, , signer2] = await this.hre.ethers.getSigners(); + const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + FooFactory.connect(signer2).deploy({ + gasPrice: this.hre.ethers.utils.parseUnits("500", "gwei"), + nonce: 2, // same nonce as foo3 + }); + + // On the second run, we should detect the user interference + // and error + await assert.isRejected( + this.deploy(moduleDefinition), + "Pending transaction from user" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts new file mode 100644 index 0000000000..d671e1f18a --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts @@ -0,0 +1,55 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * On running a deploy, if a transaction is dropped from the mempool + * before it is confirmed, then we halt and display an error. + */ +describe("execution - error on transaction dropped", () => { + useDeploymentDirectory("minimal-new-api", "error-on-transaction-dropped"); + + it("should error on the drop being detected", async function () { + // Setup a module with two contract deploys (foo1 and foo2) over 2 batches + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + + // batch 2 + const foo2 = m.contract("Foo", [], { + id: "Foo2", + from: account2, + after: [foo1], + }); + + return { + foo1, + foo2, + }; + }); + + // The deploy should exception once the dropped transaction for foo2 + // is detected + + await assert.isRejected( + this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // Process block 1 confirming foo1 + await c.mineBlock(1); + + // Wait for foo2 to be pending, then wipe it from memory pool + await c.clearMempool(1); + + // Mine further block allowing foo2 to be checked again + await c.mineBlock(); + }), + "Transaction 0x94508af7099a6684f0a431cabd18015ee38ebf0992daa12bfb8830fae96cd93a (FooModule:Foo2/1) has dropped from mempool" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts new file mode 100644 index 0000000000..2b6cc4e964 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts @@ -0,0 +1,63 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * On running a deploy, if a transaction is pending and the user + * sends a new transaction outside Ignition on the same account + * we should error and halt immediately + */ +describe("execution - error on user transaction sent", () => { + useDeploymentDirectory("minimal-new-api", "error-on-user-transaction-sent"); + + it("should error on the drop being detected", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + + // batch 2 + const foo2 = m.contract("Foo", [], { + id: "Foo2", + from: account2, + after: [foo1], + }); + + return { + foo1, + foo2, + }; + }); + + // The deploy should exception when the additional user interfering + // transaction is detected + await assert.isRejected( + this.deploy( + moduleDefinition, + + async (c: TestChainHelper) => { + // wait for foo1 to be submitted + await c.waitForPendingTxs(1); + + // Submit user interference transaction to mempool (note a fresh + // nonce is used, so no replacement) + const [, , signer2] = await this.hre.ethers.getSigners(); + const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + FooFactory.connect(signer2).deploy({ + gasPrice: this.hre.ethers.utils.parseUnits("500", "gwei"), + }); + + // Process block 1 with foo1 + await c.mineBlock(2); + } + ), + "A transaction has been submitted on the account 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc outside of the deployment" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts new file mode 100644 index 0000000000..12077e3f94 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -0,0 +1,59 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { clearPendingTransactionsFromMemoryPool, mineBlock } from "../helpers"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * Run an initial deploy, that starts but does not finish an on-chain + * transaction. The transaction is dropped from the memory pool. On rerun + * the transaction should be resubmitted. + */ +describe("execution - rerun with dropped ignition transactions", () => { + useDeploymentDirectory( + "minimal-new-api", + "rerun-with-dropped-ignition-transactions" + ); + + it("should deploy successfully on second run", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const foo = m.contract("Foo", []); + + return { + foo, + }; + }); + + // Start the deploy + await this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // Wait for the submission of foo to mempool + await c.waitForPendingTxs(1); + + // kill the deployment before confirming foo + c.exitDeploy(); + }); + + // remove the submitted foo deploy from mempool + await clearPendingTransactionsFromMemoryPool(this.hre); + + // Further blocks with no pending transactions + await mineBlock(this.hre); + await mineBlock(this.hre); + + // Rerun the deployment + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo via resend + await c.mineBlock(1); + } + ); + + assert.equal(await result.foo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts new file mode 100644 index 0000000000..bd05145a05 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -0,0 +1,103 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../helpers"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * Run an initial deploy, that sumbit but does not confirm several on-chain + * transactions via Ignition. Those ignition transactions now confirm before + * a second run completes the deploy. + */ +describe("execution - rerun with now complete ignition transactions", () => { + useDeploymentDirectory( + "minimal-new-api", + "rerun-with-now-complete-ignition-transactions" + ); + + it("should complete the run on the second attempt", async function () { + // Setup a module with 6 foo contracts deployed in pairs of 2 over 3 batches + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + + // batch 2 + const foo3 = m.contract("Foo", [], { + id: "Foo3", + from: account2, + after: [foo1], + }); + const foo4 = m.contract("Foo", [], { + id: "Foo4", + from: account2, + after: [foo2], + }); + + // batch 3 + const foo5 = m.contract("Foo", [], { + id: "Foo5", + from: account2, + after: [foo3], + }); + const foo6 = m.contract("Foo", [], { + id: "Foo6", + from: account2, + after: [foo4], + }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + foo6, + }; + }); + + await this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // Process the first block, include foo1 and foo2 + await c.mineBlock(2); + + // Kill the deployment, after foo3 and foo4 are submitted to mempool + await c.waitForPendingTxs(2); + c.exitDeploy(); + }); + + // Further blocks are processed confirming foo3 and foo4 + await mineBlock(this.hre); + await mineBlock(this.hre); + + // Rerun the deployment, with foo3 and foo3 now confirmed + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(2); + } + ); + + assert.isDefined(result); + + const x1 = await result.foo1.x(); + const x2 = await result.foo2.x(); + const x3 = await result.foo3.x(); + const x4 = await result.foo4.x(); + const x5 = await result.foo5.x(); + const x6 = await result.foo6.x(); + + assert.equal(x1, Number(1)); + assert.equal(x2, Number(1)); + assert.equal(x3, Number(1)); + assert.equal(x4, Number(1)); + assert.equal(x5, Number(1)); + assert.equal(x6, Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts new file mode 100644 index 0000000000..008c2c6ffb --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -0,0 +1,102 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. Perform another run picking the deployment + * up where the first run left off and without any other user transactions. + */ +describe("execution - rerun with pending ignition transactions", () => { + useDeploymentDirectory( + "minimal-new-api", + "rerun-with-pending-ignition-transactions" + ); + + it("should complete the run on the second attempt", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + + // batch 2 + const foo3 = m.contract("Foo", [], { + id: "Foo3", + from: account2, + after: [foo1], + }); + const foo4 = m.contract("Foo", [], { + id: "Foo4", + from: account2, + after: [foo2], + }); + + // batch 3 + const foo5 = m.contract("Foo", [], { + id: "Foo5", + from: account2, + after: [foo3], + }); + const foo6 = m.contract("Foo", [], { + id: "Foo6", + from: account2, + after: [foo4], + }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + foo6, + }; + }); + + await this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // Process the first block, include foo1 and foo2 + await c.mineBlock(2); + + // Kill the deployment, with foo3 and foo4 submitted to mempool + await c.waitForPendingTxs(2); + c.exitDeploy(); + }); + + // NOTE: no blocks mined between previous run and this run + // there should two deploy contract transactions for foo3 and foo4 + // in the mempool + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block should confirm foo3 and foo4 + await c.mineBlock(2); + + // this block shound include foo5 and foo6 + await c.mineBlock(2); + } + ); + + assert.isDefined(result); + + const x1 = await result.foo1.x(); + const x2 = await result.foo2.x(); + const x3 = await result.foo3.x(); + const x4 = await result.foo4.x(); + const x5 = await result.foo5.x(); + const x6 = await result.foo6.x(); + + assert.equal(x1, Number(1)); + assert.equal(x2, Number(1)); + assert.equal(x3, Number(1)); + assert.equal(x4, Number(1)); + assert.equal(x5, Number(1)); + assert.equal(x6, Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts new file mode 100644 index 0000000000..0e2a37984b --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -0,0 +1,83 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { mineBlock, sleep } from "../helpers"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "./useDeploymentDirectory"; + +/** + * Run an initial deploy, that starts but does not finish several on-chain + * transactions via Ignition. The user then replaces a transaction by + * reusing a nonce with a higher gas value. The user submitted transaction + * confirms between runs. On the rerun we should we should resubmit + * the original transaction with a new nonce. + */ +describe("execution - rerun with replaced confirmed user transaction", () => { + useDeploymentDirectory( + "minimal-new-api", + "rerun-with-replaced-confirmed-user-transaction" + ); + + it("should deploy user interfered transaction on second run", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + // batch 1 + const foo1 = m.contract("Foo", [], { id: "Foo1", from: account2 }); + const foo2 = m.contract("Foo", [], { id: "Foo2", from: account2 }); + const foo3 = m.contract("Foo", [], { id: "Foo3", from: account2 }); + + return { + foo1, + foo2, + foo3, + }; + }); + + // First run fo the deploy + await this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // Wait for the submission of foo1 foo2 and foo3 to mempool, + // then kill the deploy process + await c.waitForPendingTxs(3); + c.exitDeploy(); + }); + + // Submit a user interfering deploy transaction + // to the mempool reusing nonce 2 + const [, , signer2] = await this.hre.ethers.getSigners(); + const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + const userDeployedContractPromise = FooFactory.connect(signer2).deploy({ + gasPrice: this.hre.ethers.utils.parseUnits("500", "gwei"), + nonce: 2, + }); + + // mine a block confirming foo1, foo2, and the user provided transaction + // foo3 is no longer in the mempool + await sleep(300); + await mineBlock(this.hre); + + // Rerun the deployment with foo3 replaced, causing it to + // be resubmitted + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block should confirm foo3 + await c.mineBlock(1); + } + ); + + assert.isDefined(result); + + assert.equal(await result.foo1.x(), Number(1)); + assert.equal(await result.foo2.x(), Number(1)); + assert.equal(await result.foo3.x(), Number(1)); + + // the user deployed contract is working as well + const userDeployed = await userDeployedContractPromise; + assert.equal(await userDeployed.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts new file mode 100644 index 0000000000..20aa6693fb --- /dev/null +++ b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts @@ -0,0 +1,167 @@ +import { + IgnitionModuleDefinition, + IgnitionModuleResult, +} from "@ignored/ignition-core"; +import { Contract } from "ethers"; +import fs from "fs-extra"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +import { buildAdaptersFrom } from "../../../src/buildAdaptersFrom"; +import { IgnitionHelper } from "../../../src/ignition-helper"; +import { waitForPendingTxs } from "../../helpers"; +import { clearPendingTransactionsFromMemoryPool } from "../helpers"; + +export function useDeploymentDirectory( + fixtureProjectName: string, + deploymentId: string +) { + beforeEach("Load environment", function () { + process.chdir( + path.join(__dirname, "../../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + const deploymentDir = path.join( + path.resolve(__dirname, "../../fixture-projects/minimal-new-api/"), + "deployments", + deploymentId + ); + + this.hre = hre; + this.deploymentDir = deploymentDir; + + fs.ensureDirSync(deploymentDir); + + this.deploy = ( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + chainUpdates: (c: TestChainHelper) => Promise = async () => {} + ) => { + return runDeploy(deploymentDir, moduleDefinition, { hre }, chainUpdates); + }; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + + fs.removeSync(this.deploymentDir); + }); +} + +async function runDeploy( + deploymentDir: string, + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + { hre }: { hre: HardhatRuntimeEnvironment }, + chainUpdates: (c: TestChainHelper) => Promise = async () => {} +): Promise> { + const { ignitionHelper: ignitionHelper, kill: killFn } = + setupIgnitionHelperRiggedToThrow(hre, deploymentDir); + + try { + const deployPromise = ignitionHelper.deploy(moduleDefinition, { + parameters: {}, + }); + + const chainHelper = new TestChainHelper(hre, deployPromise, killFn); + + const [result] = await Promise.all([ + deployPromise, + chainUpdates(chainHelper), + ]); + + return result; + } catch (error) { + if (error instanceof Error && error.message === "Killing deploy process") { + return {}; + } + + throw error; + } +} + +function setupIgnitionHelperRiggedToThrow( + hre: HardhatRuntimeEnvironment, + deploymentDir: string +): { + ignitionHelper: IgnitionHelper; + kill: () => void; +} { + const adapters = buildAdaptersFrom(hre); + + let trigger: boolean = false; + + const kill = () => { + trigger = true; + }; + + const originalGetBlock = adapters.blocks.getBlock; + + adapters.blocks = { + ...adapters.blocks, + getBlock: async (): Promise<{ number: number; hash: string }> => { + if (trigger) { + trigger = false; + throw new Error("Killing deploy process"); + } + + const block = await originalGetBlock(); + + return block; + }, + }; + + const ignitionHelper = new IgnitionHelper(hre, adapters, deploymentDir); + + return { ignitionHelper, kill }; +} + +export class TestChainHelper { + constructor( + private _hre: HardhatRuntimeEnvironment, + private _deployPromise: Promise, + private _exitFn: () => void + ) {} + + public async waitForPendingTxs(expectedCount: number) { + await waitForPendingTxs(this._hre, expectedCount, this._deployPromise); + } + + /** + * Mine the next block, optionally waiting for pending transactions to + * build up before mining. + * + * @param pendingTxToAwait - the number of pending tx that should be in + * the block before mining + */ + public async mineBlock(pendingTxToAwait: number = 0) { + if (pendingTxToAwait > 0) { + await waitForPendingTxs(this._hre, pendingTxToAwait, this._deployPromise); + } + + return this._hre.network.provider.send("evm_mine"); + } + + public async clearMempool(pendingTxToAwait: number = 0) { + if (pendingTxToAwait > 0) { + await waitForPendingTxs(this._hre, pendingTxToAwait, this._deployPromise); + } + + return clearPendingTransactionsFromMemoryPool(this._hre); + } + + /** + * Exit from the deploy on the next block tick. + */ + public exitDeploy() { + this._exitFn(); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/.gitignore b/packages/hardhat-plugin/test/fixture-projects/.gitignore index e7f801166c..f1462f7a56 100644 --- a/packages/hardhat-plugin/test/fixture-projects/.gitignore +++ b/packages/hardhat-plugin/test/fixture-projects/.gitignore @@ -1,2 +1,3 @@ artifacts/ cache/ +deployments/ diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index f09cb9c0f8..5c7f426db4 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -42,7 +42,7 @@ const sleep = (timeout: number) => /** * Wait until there are at least `expectedCount` transactions in the mempool */ -async function waitForPendingTxs( +export async function waitForPendingTxs( hre: any, expectedCount: number, finished: Promise From 9332db4dc171a4ca6611d2a2734125ca0360e5db Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 20 Jul 2023 11:26:12 +0100 Subject: [PATCH 0546/1302] fix: remove `O_DIRECT` on write It can lead to EINVAL errors on write on certain linuxes. --- packages/core/src/new-api/internal/journal/file-journal.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index 608ff22052..6aff81992e 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -43,8 +43,7 @@ export class FileJournal implements Journal { constants.O_CREAT | constants.O_WRONLY | // Write only constants.O_APPEND | // Append - constants.O_DSYNC | // Synchronous I/O waiting for writes of content and metadata - constants.O_DIRECT; // Minimize caching + constants.O_DSYNC; // Synchronous I/O waiting for writes of content and metadata const fd = openSync(path, flags); From e7bb140d4772da2c4d01acd3cca92770ec2957b5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 20 Jul 2023 12:08:52 +0100 Subject: [PATCH 0547/1302] test: improve reliability of the pending transactions test --- packages/hardhat-plugin/.mocharc.json | 3 ++- .../error-on-pending-user-transactions.ts | 11 ++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-plugin/.mocharc.json index f6734126cb..3c924036ae 100644 --- a/packages/hardhat-plugin/.mocharc.json +++ b/packages/hardhat-plugin/.mocharc.json @@ -1,5 +1,6 @@ { "require": "ts-node/register/transpile-only", "file": "./test/setup.ts", - "timeout": 20000 + "timeout": 20000, + "exit": true } diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts index 39bb29ba3c..32a08b5d86 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts @@ -2,6 +2,9 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; +import { waitForPendingTxs } from "../../helpers"; +import { mineBlock } from "../helpers"; + import { TestChainHelper, useDeploymentDirectory, @@ -34,15 +37,17 @@ describe("execution - error on pending user transactions", () => { const [, , signer2] = await this.hre.ethers.getSigners(); const FooFactory = await this.hre.ethers.getContractFactory("Foo"); const outsideFooPromise = FooFactory.connect(signer2).deploy(); + await waitForPendingTxs(this.hre, 1, outsideFooPromise); // Deploying the module that uses accounts[2] throws with a warning await assert.isRejected( - this.deploy(moduleDefinition, async (c: TestChainHelper) => { - await c.mineBlock(1); - }), + this.deploy(moduleDefinition, async (_c: TestChainHelper) => {}), "Pending transactions for account: 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc, please wait for transactions to complete before running a deploy" ); + // Now mine the user interference transaction + await mineBlock(this.hre); + // The users interfering transaction completes normally const outsideFoo = await outsideFooPromise; assert.equal(await outsideFoo.x(), Number(1)); From 08b6183cefefde91394dd33deaa38a7e9065ff8b Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 20 Jul 2023 11:07:22 +0100 Subject: [PATCH 0548/1302] test: add compile to nonce-check tests --- .../test/execution/nonce-checks/useDeploymentDirectory.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts index 20aa6693fb..eccf67069b 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts @@ -17,12 +17,13 @@ export function useDeploymentDirectory( fixtureProjectName: string, deploymentId: string ) { - beforeEach("Load environment", function () { + beforeEach("Load environment", async function () { process.chdir( path.join(__dirname, "../../fixture-projects", fixtureProjectName) ); const hre = require("hardhat"); + const deploymentDir = path.join( path.resolve(__dirname, "../../fixture-projects/minimal-new-api/"), "deployments", @@ -32,6 +33,8 @@ export function useDeploymentDirectory( this.hre = hre; this.deploymentDir = deploymentDir; + await hre.run("compile", { quiet: true }); + fs.ensureDirSync(deploymentDir); this.deploy = ( From f9f984cbc9db2c247dd9fb8ef68e60fc3a55806f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 20 Jul 2023 13:01:46 +0100 Subject: [PATCH 0549/1302] refactor: pull out condition to better explain --- .../internal/execution/execution-engine.ts | 136 +++++++++++++----- 1 file changed, 97 insertions(+), 39 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index d8176d92ca..add8de5207 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -69,6 +69,14 @@ export interface AccountsState { [key: string]: number; } +interface InflightTransaction { + futureId: string; + executionId: number; + from: string; + nonce: number; + hash: string; +} + export class ExecutionEngine { public async execute(state: ExecutionEngineState): Promise { const { batches, module } = state; @@ -124,28 +132,29 @@ export class ExecutionEngine { transactionSubmittingFutures.map((f) => resolveFromAddress(f.from, state)) ); - const pendingIgnitionTransactions = transactionSubmittingFutures - .map((f) => { - const exState = state.executionStateMap[f.id]; - - if ( - exState === undefined || - exState.onchain.currentExecution === null || - exState.onchain.nonce === null || - exState.onchain.txHash === null - ) { - return null; - } - - return { - futureId: f.id, - executionId: exState.onchain.currentExecution, - from: resolveFromAddress(f.from, state), - nonce: exState.onchain.nonce, - hash: exState.onchain.txHash, - }; - }) - .filter((x: T | null): x is T => x !== null); + const pendingIgnitionTransactions: InflightTransaction[] = + transactionSubmittingFutures + .map((f) => { + const exState = state.executionStateMap[f.id]; + + if ( + exState === undefined || + exState.onchain.currentExecution === null || + exState.onchain.nonce === null || + exState.onchain.txHash === null + ) { + return null; + } + + return { + futureId: f.id, + executionId: exState.onchain.currentExecution, + from: resolveFromAddress(f.from, state), + nonce: exState.onchain.nonce, + hash: exState.onchain.txHash, + }; + }) + .filter((x: T | null): x is T => x !== null); const inflightByAccount = groupBy(pendingIgnitionTransactions, "from"); @@ -171,24 +180,19 @@ export class ExecutionEngine { return; } - const maxNonceTran = maxBy(inflight, "nonce"); - - assertIgnitionInvariant( - maxNonceTran !== undefined, - "Always at least one entry going into maxBy" - ); - // The pending transactions do not match the expected list // given the inflight transactions from the previous run - if (maxNonceTran.nonce + 1 < pending) { + if (this._isMorePendingThanPreviousRunIndicates(pending, inflight)) { // TODO: is this error message correct? throw new IgnitionError( `Pending transactions for account: ${usedAccount}, please wait for transactions to complete before running a deploy` ); } - for (const intran of sortBy(inflight, "nonce")) { - const result = await state.chainDispatcher.getTransaction(intran.hash); + for (const inflightTran of sortBy(inflight, "nonce")) { + const result = await state.chainDispatcher.getTransaction( + inflightTran.hash + ); // transaction is confirmed or pending as expected if (result !== null && result !== undefined) { @@ -197,12 +201,17 @@ export class ExecutionEngine { // There is a confirmed user sent transaction that // has replaced the expected transaction - if (latest >= intran.nonce + 1) { + if ( + this._isIgnitionTranReplacedByConfirmedInterferingTran( + inflightTran, + latest + ) + ) { // Try sending the request again, using a new nonce const revert: OnchainTransactionReset = { type: "onchain-transaction-reset", - futureId: intran.futureId, - executionId: intran.executionId, + futureId: inflightTran.futureId, + executionId: inflightTran.executionId, }; await this._apply(state, revert); @@ -210,17 +219,29 @@ export class ExecutionEngine { // there is a pending transaction sent by the user // with the same nonce - if (latest < intran.nonce + 1 && pending >= intran.nonce + 1) { + if ( + this._isIgnitionTranReplacedByPendingInterferingTran( + inflightTran, + latest, + pending + ) + ) { throw new IgnitionError("Pending transaction from user"); } // the transaction has been dropped without any user interference - if (latest < intran.nonce + 1 && pending < intran.nonce + 1) { + if ( + this._inflightTranDroppedWithoutInterference( + inflightTran, + latest, + pending + ) + ) { // try sending again potentially using the same nonce const revert: OnchainTransactionReset = { type: "onchain-transaction-reset", - futureId: intran.futureId, - executionId: intran.executionId, + futureId: inflightTran.futureId, + executionId: inflightTran.executionId, }; await this._apply(state, revert); @@ -918,4 +939,41 @@ export class ExecutionEngine { return futureContext; } + + private _isMorePendingThanPreviousRunIndicates( + pending: number, + inflight: InflightTransaction[] + ): boolean { + const maxNonceTran = maxBy(inflight, "nonce"); + + assertIgnitionInvariant( + maxNonceTran !== undefined, + "Always at least one entry going into maxBy" + ); + + return maxNonceTran.nonce + 1 < pending; + } + + private _isIgnitionTranReplacedByConfirmedInterferingTran( + inflightTran: InflightTransaction, + latest: number + ): boolean { + return latest >= inflightTran.nonce + 1; + } + + private _isIgnitionTranReplacedByPendingInterferingTran( + inflightTran: InflightTransaction, + latest: number, + pending: number + ) { + return latest < inflightTran.nonce + 1 && pending >= inflightTran.nonce + 1; + } + + private _inflightTranDroppedWithoutInterference( + inflightTran: InflightTransaction, + latest: number, + pending: number + ) { + return latest < inflightTran.nonce + 1 && pending < inflightTran.nonce + 1; + } } From 5027561da9b539479774cd76cab83412c232aa15 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 20 Jul 2023 15:18:21 +0100 Subject: [PATCH 0550/1302] feat: improve pending check to exit early Avoid the `getTransactionReceipt` lookup by using the information from the `getTransaction` call. --- .../execution/onchain-state-transitions.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index 2b835534c3..8980c7cb69 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -605,24 +605,24 @@ async function checkTransactionComplete( ); } - const receipt = await state.chainDispatcher.getTransactionReceipt( - next.txHash - ); - - if (receipt === null || receipt === undefined) { - // No receipt means it hasn't been included in a block yet - return { status: "pause" }; - } - if ( - receipt.blockNumber === undefined || + currentTransaction.blockNumber === null || // TODO: make default confirmations config - receipt.confirmations < DEFAULT_CONFIRMATIONS + currentTransaction.confirmations < DEFAULT_CONFIRMATIONS ) { // transaction pending, move on with batch return { status: "pause" }; } + const receipt = await state.chainDispatcher.getTransactionReceipt( + next.txHash + ); + + assertIgnitionInvariant( + receipt !== null && receipt !== undefined, + "A confirmed transaction should have a receipt" + ); + const successMessage = successConstructor(receipt); return { status: "continue", next: successMessage }; From 1e3478da40e2d2bd9ac0bc75b5d28544e4f27f2e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 18 Jul 2023 00:33:13 -0400 Subject: [PATCH 0551/1302] added --logs flag to enable journal logging to cli --- packages/core/src/new-api/deploy.ts | 6 +- .../ephemeral-deployment-loader.ts | 7 +- .../file-deployment-loader.ts | 7 +- .../src/new-api/internal/execution/guards.ts | 37 ++++ .../new-api/internal/journal/file-journal.ts | 13 +- .../internal/journal/memory-journal.ts | 11 + .../src/new-api/internal/journal/utils/log.ts | 191 ++++++++++++++++++ .../hardhat-plugin/src/ignition-helper.ts | 1 + packages/hardhat-plugin/src/index.ts | 4 + 9 files changed, 269 insertions(+), 8 deletions(-) create mode 100644 packages/core/src/new-api/internal/journal/utils/log.ts diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 31ece49536..0a5450dfec 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -20,6 +20,7 @@ export async function deploy({ moduleDefinition, deploymentParameters, accounts, + verbose, }: { artifactResolver: ArtifactResolver; adapters: Adapters; @@ -31,11 +32,12 @@ export async function deploy({ >; deploymentParameters: { [key: string]: ModuleParameters }; accounts: string[]; + verbose: boolean; }): Promise { const deploymentLoader = deploymentDir === undefined - ? new EphemeralDeploymentLoader(artifactResolver) - : new FileDeploymentLoader(deploymentDir); + ? new EphemeralDeploymentLoader(artifactResolver, verbose) + : new FileDeploymentLoader(deploymentDir, verbose); const chainDispatcher = new ChainDispatcherImpl(adapters); diff --git a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index 5e127512ac..3747e79051 100644 --- a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -15,8 +15,11 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { private _deployedAddresses: { [key: string]: string }; - constructor(private _artifactResolver: ArtifactResolver) { - this.journal = new MemoryJournal(); + constructor( + private _artifactResolver: ArtifactResolver, + private _verbose: boolean + ) { + this.journal = new MemoryJournal(this._verbose); this._deployedAddresses = {}; } diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 796d086821..110dfcb381 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -18,7 +18,10 @@ export class FileDeploymentLoader implements DeploymentLoader { deployedAddressesPath: string; }; - constructor(private readonly _deploymentDirPath: string) { + constructor( + private readonly _deploymentDirPath: string, + private readonly _verbose: boolean + ) { const artifactsDir = path.join(this._deploymentDirPath, "artifacts"); const buildInfoDir = path.join(this._deploymentDirPath, "build-info"); const journalPath = path.join(this._deploymentDirPath, "journal.jsonl"); @@ -27,7 +30,7 @@ export class FileDeploymentLoader implements DeploymentLoader { "deployed_addresses.json" ); - this.journal = new FileJournal(journalPath); + this.journal = new FileJournal(journalPath, this._verbose); this._paths = { deploymentDir: this._deploymentDirPath, diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 1f66b60653..e54ae34d9b 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -1,5 +1,7 @@ import { CallFunctionInteractionMessage, + CalledFunctionExecutionSuccess, + ContractAtExecutionSuccess, ContractAtInteractionMessage, DeployContractInteractionMessage, DeployedContractExecutionSuccess, @@ -9,8 +11,11 @@ import { ExecutionSuccess, JournalableMessage, OnchainInteractionMessage, + ReadEventArgumentExecutionSuccess, ReadEventArgumentInteractionMessage, + SendDataExecutionSuccess, SendDataInteractionMessage, + StaticCallExecutionSuccess, StaticCallInteractionMessage, } from "../../types/journal"; @@ -104,3 +109,35 @@ export function isDeployedContractExecutionSuccess( isExecutionSuccess(potential) && potential.subtype === "deploy-contract" ); } + +export function isCalledFunctionExecutionSuccess( + potential: JournalableMessage +): potential is CalledFunctionExecutionSuccess { + return isExecutionSuccess(potential) && potential.subtype === "call-function"; +} + +export function isStaticCallExecutionSuccess( + potential: JournalableMessage +): potential is StaticCallExecutionSuccess { + return isExecutionSuccess(potential) && potential.subtype === "static-call"; +} + +export function isReadEventArgumentExecutionSuccess( + potential: JournalableMessage +): potential is ReadEventArgumentExecutionSuccess { + return ( + isExecutionSuccess(potential) && potential.subtype === "read-event-arg" + ); +} + +export function isSendDataExecutionSuccess( + potential: JournalableMessage +): potential is SendDataExecutionSuccess { + return isExecutionSuccess(potential) && potential.subtype === "send-data"; +} + +export function isContractAtExecutionSuccess( + potential: JournalableMessage +): potential is ContractAtExecutionSuccess { + return isExecutionSuccess(potential) && potential.subtype === "contract-at"; +} diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index 6aff81992e..525f054dd4 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -5,6 +5,7 @@ import ndjson from "ndjson"; import { Journal, JournalableMessage } from "../../types/journal"; import { deserializeReplacer } from "./utils/deserialize-replacer"; +import { logJournalableMessage } from "./utils/log"; import { serializeReplacer } from "./utils/serialize-replacer"; /** @@ -13,9 +14,11 @@ import { serializeReplacer } from "./utils/serialize-replacer"; * @beta */ export class FileJournal implements Journal { - constructor(private _filePath: string) {} + constructor(private _filePath: string, private _verbose: boolean = false) {} public record(message: JournalableMessage): void { + this._log(message); + this._appendJsonLine(this._filePath, message); } @@ -38,7 +41,7 @@ export class FileJournal implements Journal { } } - private _appendJsonLine(path: string, value: unknown) { + private _appendJsonLine(path: string, value: JournalableMessage) { const flags = constants.O_CREAT | constants.O_WRONLY | // Write only @@ -54,4 +57,10 @@ export class FileJournal implements Journal { ); closeSync(fd); } + + private _log(message: JournalableMessage): void { + if (this._verbose) { + return logJournalableMessage(message); + } + } } diff --git a/packages/core/src/new-api/internal/journal/memory-journal.ts b/packages/core/src/new-api/internal/journal/memory-journal.ts index e6ec61f4b7..fcd711f814 100644 --- a/packages/core/src/new-api/internal/journal/memory-journal.ts +++ b/packages/core/src/new-api/internal/journal/memory-journal.ts @@ -1,6 +1,7 @@ import { Journal, JournalableMessage } from "../../types/journal"; import { deserializeReplacer } from "./utils/deserialize-replacer"; +import { logJournalableMessage } from "./utils/log"; import { serializeReplacer } from "./utils/serialize-replacer"; /** @@ -11,7 +12,11 @@ import { serializeReplacer } from "./utils/serialize-replacer"; export class MemoryJournal implements Journal { private messages: string[] = []; + constructor(private _verbose: boolean = false) {} + public record(message: JournalableMessage): void { + this._log(message); + this.messages.push(JSON.stringify(message, serializeReplacer.bind(this))); } @@ -25,4 +30,10 @@ export class MemoryJournal implements Journal { yield message; } } + + private _log(message: JournalableMessage): void { + if (this._verbose) { + return logJournalableMessage(message); + } + } } diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts new file mode 100644 index 0000000000..465b982c23 --- /dev/null +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -0,0 +1,191 @@ +import { JournalableMessage } from "../../../types/journal"; +import { + isCallFunctionInteraction, + isCalledFunctionExecutionSuccess, + isContractAtExecutionSuccess, + isContractAtInteraction, + isDeployContractInteraction, + isDeployedContractExecutionSuccess, + isExecutionFailure, + isExecutionHold, + isReadEventArgumentExecutionSuccess, + isReadEventArgumentInteraction, + isSendDataExecutionSuccess, + isSendDataInteraction, + isStaticCallExecutionSuccess, + isStaticCallInteraction, +} from "../../execution/guards"; +import { + isCallFunctionStartMessage, + isContractAtStartMessage, + isDeployContractStartMessage, + isOnChainFailureMessage, + isOnchainCallFunctionSuccessMessage, + isOnchainContractAtSuccessMessage, + isOnchainDeployContractSuccessMessage, + isOnchainReadEventArgumentSuccessMessage, + isOnchainSendDataSuccessMessage, + isOnchainStaticCallSuccessMessage, + isReadEventArgumentStartMessage, + isSendDataStartMessage, + isStaticCallStartMessage, + isWipeMessage, +} from "../type-guards"; + +export function logJournalableMessage(message: JournalableMessage): void { + /* start messages */ + + if (isDeployContractStartMessage(message)) { + return console.log(`deploy contract start - id: '${message.futureId}'`); + } + + if (isCallFunctionStartMessage(message)) { + return console.log(`call function start - id: '${message.futureId}'`); + } + + if (isStaticCallStartMessage(message)) { + return console.log(`static call start - id: '${message.futureId}'`); + } + + if (isReadEventArgumentStartMessage(message)) { + return console.log(`read event argument start - id: '${message.futureId}'`); + } + + if (isSendDataStartMessage(message)) { + return console.log(`send data start - id: '${message.futureId}'`); + } + + if (isContractAtStartMessage(message)) { + return console.log(`contract at start - id: '${message.futureId}'`); + } + + /* interaction messages */ + + if (isDeployContractInteraction(message)) { + return console.log( + `deploy contract interaction - id: '${message.futureId}'` + ); + } + + if (isCallFunctionInteraction(message)) { + return console.log(`call function interaction - id: '${message.futureId}'`); + } + + if (isStaticCallInteraction(message)) { + return console.log(`static call interaction - id: '${message.futureId}'`); + } + + if (isReadEventArgumentInteraction(message)) { + return console.log( + `read event argument interaction - id: '${message.futureId}'` + ); + } + + if (isSendDataInteraction(message)) { + return console.log(`send data interaction - id: '${message.futureId}'`); + } + + if (isContractAtInteraction(message)) { + return console.log(`contract at interaction - id: '${message.futureId}'`); + } + + /* onchain success messages */ + + if (isOnchainDeployContractSuccessMessage(message)) { + return console.log( + `on-chain deploy contract success - id: '${message.futureId}'` + ); + } + + if (isOnchainCallFunctionSuccessMessage(message)) { + return console.log( + `on-chain call function success - id: '${message.futureId}'` + ); + } + + if (isOnchainStaticCallSuccessMessage(message)) { + return console.log( + `on-chain static call success - id: '${message.futureId}'` + ); + } + + if (isOnchainReadEventArgumentSuccessMessage(message)) { + return console.log( + `on-chain read event argument success - id: '${message.futureId}'` + ); + } + + if (isOnchainSendDataSuccessMessage(message)) { + return console.log( + `on-chain send data success - id: '${message.futureId}'` + ); + } + + if (isOnchainContractAtSuccessMessage(message)) { + return console.log( + `on-chain contract at success - id: '${message.futureId}'` + ); + } + + /* execution success messages */ + + if (isDeployedContractExecutionSuccess(message)) { + return console.log( + `deploy contract execution success - id: '${message.futureId}'` + ); + } + + if (isCalledFunctionExecutionSuccess(message)) { + return console.log( + `call function execution success - id: '${message.futureId}'` + ); + } + + if (isStaticCallExecutionSuccess(message)) { + return console.log( + `static call execution success - id: '${message.futureId}'` + ); + } + + if (isReadEventArgumentExecutionSuccess(message)) { + return console.log( + `read event argument execution success - id: '${message.futureId}'` + ); + } + + if (isSendDataExecutionSuccess(message)) { + return console.log( + `send data execution success - id: '${message.futureId}'` + ); + } + + if (isContractAtExecutionSuccess(message)) { + return console.log( + `contract at execution success - id: '${message.futureId}'` + ); + } + + /* hold & failure messages */ + + if (isExecutionHold(message)) { + return console.log(`Execution on hold`); + } + + if (isOnChainFailureMessage(message)) { + return console.log( + `on chain failure - futureId: '${message.futureId}' error: '${message.error.message}'` + ); + } + + if (isExecutionFailure(message)) { + return console.log( + `execution failure - futureId: '${message.futureId}' error: '${message.error.message}'` + ); + } + + if (isWipeMessage(message)) { + return console.log(`wiping journal`); + } + + throw new Error("Unknown journal message"); +} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index 382e999ecc..b9f186dddc 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -49,6 +49,7 @@ export class IgnitionHelper { moduleDefinition: ignitionModuleDefinition, deploymentParameters: parameters, accounts, + verbose: false, }); if (result.status !== "success") { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 160deb9d83..995071f48b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -193,16 +193,19 @@ task("deploy2") ) .addOptionalParam("id", "set the deployment id") .addFlag("force", "restart the deployment ignoring previous history") + .addFlag("logs", "output journal logs to the terminal") .setAction( async ( { moduleNameOrPath, parameters: parametersInput, + logs, id: givenDeploymentId, }: { moduleNameOrPath: string; parameters?: string; force: boolean; + logs: boolean; id: string; }, hre @@ -273,6 +276,7 @@ task("deploy2") moduleDefinition: userModule as any, deploymentParameters: parameters as any, accounts, + verbose: logs, }); if (result.status === "success") { From 7085c86eeb78a02f0a193964aa06d311c834a4b7 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 19 Jul 2023 23:20:27 -0400 Subject: [PATCH 0552/1302] add results output where needed --- .../src/new-api/internal/journal/utils/log.ts | 41 ++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index 465b982c23..e2ff32e7d5 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -1,4 +1,5 @@ import { JournalableMessage } from "../../../types/journal"; +import { SolidityParameterType } from "../../../types/module"; import { isCallFunctionInteraction, isCalledFunctionExecutionSuccess, @@ -93,31 +94,35 @@ export function logJournalableMessage(message: JournalableMessage): void { if (isOnchainDeployContractSuccessMessage(message)) { return console.log( - `on-chain deploy contract success - id: '${message.futureId}'` + `on-chain deploy contract success - id: '${message.futureId}' - txId: '${message.txId}'` ); } if (isOnchainCallFunctionSuccessMessage(message)) { return console.log( - `on-chain call function success - id: '${message.futureId}'` + `on-chain call function success - id: '${message.futureId}' - txId: '${message.txId}'` ); } if (isOnchainStaticCallSuccessMessage(message)) { return console.log( - `on-chain static call success - id: '${message.futureId}'` + `on-chain static call success - id: '${ + message.futureId + }' - result: '${solidityParamToString(message.result)}'` ); } if (isOnchainReadEventArgumentSuccessMessage(message)) { return console.log( - `on-chain read event argument success - id: '${message.futureId}'` + `on-chain read event argument success - id: '${ + message.futureId + }' - result: '${solidityParamToString(message.result)}'` ); } if (isOnchainSendDataSuccessMessage(message)) { return console.log( - `on-chain send data success - id: '${message.futureId}'` + `on-chain send data success - id: '${message.futureId}' - txId: '${message.txId}'` ); } @@ -131,31 +136,35 @@ export function logJournalableMessage(message: JournalableMessage): void { if (isDeployedContractExecutionSuccess(message)) { return console.log( - `deploy contract execution success - id: '${message.futureId}'` + `deploy contract execution success - id: '${message.futureId}' - txId: '${message.txId}'` ); } if (isCalledFunctionExecutionSuccess(message)) { return console.log( - `call function execution success - id: '${message.futureId}'` + `call function execution success - id: '${message.futureId}' - txId: '${message.txId}'` ); } if (isStaticCallExecutionSuccess(message)) { return console.log( - `static call execution success - id: '${message.futureId}'` + `static call execution success - id: '${ + message.futureId + }' - result: '${solidityParamToString(message.result)}'` ); } if (isReadEventArgumentExecutionSuccess(message)) { return console.log( - `read event argument execution success - id: '${message.futureId}'` + `read event argument execution success - id: '${ + message.futureId + }' - result: '${solidityParamToString(message.result)}'` ); } if (isSendDataExecutionSuccess(message)) { return console.log( - `send data execution success - id: '${message.futureId}'` + `send data execution success - id: '${message.futureId}' - txId: '${message.txId}'` ); } @@ -189,3 +198,15 @@ export function logJournalableMessage(message: JournalableMessage): void { throw new Error("Unknown journal message"); } + +function solidityParamToString(param: SolidityParameterType): string { + if (typeof param === "object") { + return JSON.stringify(param); + } + + if (typeof param === "string") { + return param; + } + + return param.toString(); +} From ad7a99a2c351da6b599f76a7d6878b81c1c2fa54 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 23 Jul 2023 23:40:15 -0400 Subject: [PATCH 0553/1302] add assertNever function and handle new journalable types introduced during rebase --- .../src/new-api/internal/journal/utils/log.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index e2ff32e7d5..4f57a1d54d 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -27,6 +27,8 @@ import { isOnchainReadEventArgumentSuccessMessage, isOnchainSendDataSuccessMessage, isOnchainStaticCallSuccessMessage, + isOnchainTransactionAccept, + isOnchainTransactionRequest, isReadEventArgumentStartMessage, isSendDataStartMessage, isStaticCallStartMessage, @@ -90,6 +92,20 @@ export function logJournalableMessage(message: JournalableMessage): void { return console.log(`contract at interaction - id: '${message.futureId}'`); } + /* onchain transaction messages */ + + if (isOnchainTransactionRequest(message)) { + return console.log( + `on-chain transaction requested - id: ${message.futureId} - from: ${message.from} - nonce: ${message.nonce}` + ); + } + + if (isOnchainTransactionAccept(message)) { + return console.log( + `on-chain transaction accepted - id: ${message.futureId} - txId: ${message.txHash}` + ); + } + /* onchain success messages */ if (isOnchainDeployContractSuccessMessage(message)) { @@ -196,7 +212,7 @@ export function logJournalableMessage(message: JournalableMessage): void { return console.log(`wiping journal`); } - throw new Error("Unknown journal message"); + assertNeverJournalableMessag(message); } function solidityParamToString(param: SolidityParameterType): string { @@ -210,3 +226,7 @@ function solidityParamToString(param: SolidityParameterType): string { return param.toString(); } + +function assertNeverJournalableMessag(message: never): never { + throw new Error(`Unknown journal message: ${JSON.stringify(message)}`); +} From d873d298aa0ed55aa97ba2906ffa1be5634d84d1 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 23 Jul 2023 23:43:53 -0400 Subject: [PATCH 0554/1302] include executionId in log output --- .../src/new-api/internal/journal/utils/log.ts | 44 ++++++++++++------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index 4f57a1d54d..732206ee87 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -66,43 +66,51 @@ export function logJournalableMessage(message: JournalableMessage): void { if (isDeployContractInteraction(message)) { return console.log( - `deploy contract interaction - id: '${message.futureId}'` + `deploy contract interaction - id: '${message.futureId}' - executionId: ${message.executionId}` ); } if (isCallFunctionInteraction(message)) { - return console.log(`call function interaction - id: '${message.futureId}'`); + return console.log( + `call function interaction - id: '${message.futureId}' - executionId: ${message.executionId}` + ); } if (isStaticCallInteraction(message)) { - return console.log(`static call interaction - id: '${message.futureId}'`); + return console.log( + `static call interaction - id: '${message.futureId}' - executionId: ${message.executionId}` + ); } if (isReadEventArgumentInteraction(message)) { return console.log( - `read event argument interaction - id: '${message.futureId}'` + `read event argument interaction - id: '${message.futureId}' - executionId: ${message.executionId}` ); } if (isSendDataInteraction(message)) { - return console.log(`send data interaction - id: '${message.futureId}'`); + return console.log( + `send data interaction - id: '${message.futureId}' - executionId: ${message.executionId}` + ); } if (isContractAtInteraction(message)) { - return console.log(`contract at interaction - id: '${message.futureId}'`); + return console.log( + `contract at interaction - id: '${message.futureId}' - executionId: ${message.executionId}` + ); } /* onchain transaction messages */ if (isOnchainTransactionRequest(message)) { return console.log( - `on-chain transaction requested - id: ${message.futureId} - from: ${message.from} - nonce: ${message.nonce}` + `on-chain transaction requested - id: ${message.futureId} - executionId: ${message.executionId} - from: ${message.from} - nonce: ${message.nonce}` ); } if (isOnchainTransactionAccept(message)) { return console.log( - `on-chain transaction accepted - id: ${message.futureId} - txId: ${message.txHash}` + `on-chain transaction accepted - id: ${message.futureId} - executionId: ${message.executionId} - txId: ${message.txHash}` ); } @@ -110,13 +118,13 @@ export function logJournalableMessage(message: JournalableMessage): void { if (isOnchainDeployContractSuccessMessage(message)) { return console.log( - `on-chain deploy contract success - id: '${message.futureId}' - txId: '${message.txId}'` + `on-chain deploy contract success - id: '${message.futureId}' - executionId: ${message.executionId} - txId: '${message.txId}'` ); } if (isOnchainCallFunctionSuccessMessage(message)) { return console.log( - `on-chain call function success - id: '${message.futureId}' - txId: '${message.txId}'` + `on-chain call function success - id: '${message.futureId}' - executionId: ${message.executionId} - txId: '${message.txId}'` ); } @@ -124,7 +132,9 @@ export function logJournalableMessage(message: JournalableMessage): void { return console.log( `on-chain static call success - id: '${ message.futureId - }' - result: '${solidityParamToString(message.result)}'` + }' - executionId: ${ + message.executionId + } - result: '${solidityParamToString(message.result)}'` ); } @@ -132,19 +142,21 @@ export function logJournalableMessage(message: JournalableMessage): void { return console.log( `on-chain read event argument success - id: '${ message.futureId - }' - result: '${solidityParamToString(message.result)}'` + }' - executionId: ${ + message.executionId + } - result: '${solidityParamToString(message.result)}'` ); } if (isOnchainSendDataSuccessMessage(message)) { return console.log( - `on-chain send data success - id: '${message.futureId}' - txId: '${message.txId}'` + `on-chain send data success - id: '${message.futureId}' - executionId: ${message.executionId} - txId: '${message.txId}'` ); } if (isOnchainContractAtSuccessMessage(message)) { return console.log( - `on-chain contract at success - id: '${message.futureId}'` + `on-chain contract at success - id: '${message.futureId}' - executionId: ${message.executionId}` ); } @@ -198,13 +210,13 @@ export function logJournalableMessage(message: JournalableMessage): void { if (isOnChainFailureMessage(message)) { return console.log( - `on chain failure - futureId: '${message.futureId}' error: '${message.error.message}'` + `on chain failure - futureId: '${message.futureId}' - executionId: ${message.executionId} - error: '${message.error.message}'` ); } if (isExecutionFailure(message)) { return console.log( - `execution failure - futureId: '${message.futureId}' error: '${message.error.message}'` + `execution failure - futureId: '${message.futureId}' - error: '${message.error.message}'` ); } From d00e0caec25e202f17a2330919a7d441e62230fc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 23 Jul 2023 23:48:45 -0400 Subject: [PATCH 0555/1302] rebase and support new type --- packages/core/src/new-api/internal/journal/utils/log.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index 732206ee87..2e4d9e7a6f 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -29,6 +29,7 @@ import { isOnchainStaticCallSuccessMessage, isOnchainTransactionAccept, isOnchainTransactionRequest, + isOnchainTransactionReset, isReadEventArgumentStartMessage, isSendDataStartMessage, isStaticCallStartMessage, @@ -114,6 +115,12 @@ export function logJournalableMessage(message: JournalableMessage): void { ); } + if (isOnchainTransactionReset(message)) { + return console.log( + `on-chain transaction reset - id: ${message.futureId} - executionId: ${message.executionId}` + ); + } + /* onchain success messages */ if (isOnchainDeployContractSuccessMessage(message)) { From 257cad11845b4bc1a7d6be2c90b8e9facb9f4c43 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 17 Jul 2023 12:41:40 +0100 Subject: [PATCH 0556/1302] feat: add timeouts to execution The timeout is checked on lookup of a pending transaction. If the configured timeout is passed then the future is moved to the `timeout` state via a message. The future is moved the TIMEOUT status, and a timeout result is returned from the deploy overall. The timeout result becomes an exception within tests and is displayed when run from the cli. To enable rerunning a timed out deployment, a new `run-start` message now occurs after reconciliation and nonce checks. This message notes the start of a run but also sets all timed out futures to `STARTING` so that they are picked up in a batch in the same state as before the timeout on the previous run. Resolves #293. --- packages/core/src/new-api/deploy.ts | 5 +- packages/core/src/new-api/internal/batcher.ts | 1 + .../core/src/new-api/internal/deployer.ts | 28 +++++-- .../internal/execution/execution-engine.ts | 84 ++++++++++++++++--- .../execution/execution-state-reducer.ts | 72 ++++++++++++++-- .../src/new-api/internal/execution/guards.ts | 8 ++ .../execution/onchain-state-transitions.ts | 38 ++++++++- .../execution/transaction-lookup-timer.ts | 57 +++++++++++++ .../new-api/internal/journal/type-guards.ts | 27 ++++-- .../src/new-api/internal/journal/utils/log.ts | 14 ++++ .../internal/types/execution-engine.ts | 11 ++- .../new-api/internal/types/execution-state.ts | 1 + .../internal/types/transaction-timer.ts | 32 +++++++ packages/core/src/new-api/types/deployer.ts | 26 +++++- packages/core/src/new-api/types/journal.ts | 31 +++++++ .../new-api/execution/execution-engine.ts | 16 ++++ packages/core/test/new-api/helpers.ts | 2 +- .../hardhat-plugin/src/ignition-helper.ts | 11 +++ packages/hardhat-plugin/src/index.ts | 13 +++ .../nonce-checks/useDeploymentDirectory.ts | 35 ++++++-- .../timeouts/deploy-run-times-out.ts | 40 +++++++++ .../timeouts/rerun-a-deploy-that-timed-out.ts | 51 +++++++++++ 22 files changed, 556 insertions(+), 47 deletions(-) create mode 100644 packages/core/src/new-api/internal/execution/transaction-lookup-timer.ts create mode 100644 packages/core/src/new-api/internal/types/transaction-timer.ts create mode 100644 packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts create mode 100644 packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 0a5450dfec..31f0688f17 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -4,7 +4,7 @@ import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployme import { ChainDispatcherImpl } from "./internal/execution/chain-dispatcher"; import { Adapters } from "./types/adapters"; import { ArtifactResolver } from "./types/artifact"; -import { DeploymentResult } from "./types/deployer"; +import { DeployConfig, DeploymentResult } from "./types/deployer"; import { IgnitionModuleResult, ModuleParameters } from "./types/module"; import { IgnitionModuleDefinition } from "./types/module-builder"; @@ -14,6 +14,7 @@ import { IgnitionModuleDefinition } from "./types/module-builder"; * @beta */ export async function deploy({ + config, artifactResolver, adapters, deploymentDir, @@ -22,6 +23,7 @@ export async function deploy({ accounts, verbose, }: { + config?: Partial; artifactResolver: ArtifactResolver; adapters: Adapters; deploymentDir?: string; @@ -42,6 +44,7 @@ export async function deploy({ const chainDispatcher = new ChainDispatcherImpl(adapters); const deployer = new Deployer({ + config: config ?? {}, artifactResolver, deploymentLoader, chainDispatcher, diff --git a/packages/core/src/new-api/internal/batcher.ts b/packages/core/src/new-api/internal/batcher.ts index 7fe1a79c8c..c92d8ee8a7 100644 --- a/packages/core/src/new-api/internal/batcher.ts +++ b/packages/core/src/new-api/internal/batcher.ts @@ -76,6 +76,7 @@ export class Batcher { switch (executionState.status) { case ExecutionStatus.FAILED: case ExecutionStatus.HOLD: + case ExecutionStatus.TIMEOUT: case ExecutionStatus.STARTED: return [f.id, VisitStatus.UNVISITED]; case ExecutionStatus.SUCCESS: diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index b2781f2d22..684b635313 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -7,7 +7,7 @@ import type { IgnitionModuleDefinition } from "../types/module-builder"; import { isContractFuture } from "../type-guards"; import { Artifact, ArtifactResolver } from "../types/artifact"; -import { DeploymentResult } from "../types/deployer"; +import { DeployConfig, DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; @@ -15,6 +15,7 @@ import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; import { executionStateReducer } from "./execution/execution-state-reducer"; import { BasicExecutionStrategy } from "./execution/execution-strategy"; +import { TranactionLookupTimerImpl } from "./execution/transaction-lookup-timer"; import { ModuleConstructor } from "./module-builder"; import { Reconciler } from "./reconciliation/reconciler"; import { ArtifactMap } from "./reconciliation/types"; @@ -26,11 +27,17 @@ import { DeploymentExecutionState, ExecutionStateMap, } from "./types/execution-state"; +import { TransactionLookupTimer } from "./types/transaction-timer"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; import { validate } from "./validation/validate"; -const BLOCK_POLLING_INTERVAL = 200; +// The interval between checks to see if a new block has been created +const DEFAULT_BLOCK_POLLING_INTERVAL = 200; + +// In milliseconds the amount of time to wait on a transaction to +// confirm before timing out +const DEFAULT_TRANSACTION_TIMEOUT_INTERVAL = 3 * 60 * 1000; /** * Run an Igntition deployment. @@ -38,18 +45,27 @@ const BLOCK_POLLING_INTERVAL = 200; * @beta */ export class Deployer { + private _config: DeployConfig; private _moduleConstructor: ModuleConstructor; private _executionEngine: ExecutionEngine; private _strategy: ExecutionStrategy; private _artifactResolver: ArtifactResolver; private _deploymentLoader: DeploymentLoader; private _chainDispatcher: ChainDispatcher; + private _transactionLookupTimer: TransactionLookupTimer; constructor(options: { + config?: Partial; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; chainDispatcher: ChainDispatcher; }) { + this._config = { + blockPollingInterval: DEFAULT_BLOCK_POLLING_INTERVAL, + transactionTimeoutInterval: DEFAULT_TRANSACTION_TIMEOUT_INTERVAL, + ...options.config, + }; + this._strategy = new BasicExecutionStrategy(); this._artifactResolver = options.artifactResolver; this._deploymentLoader = options.deploymentLoader; @@ -58,6 +74,9 @@ export class Deployer { this._moduleConstructor = new ModuleConstructor(); this._executionEngine = new ExecutionEngine(); + this._transactionLookupTimer = new TranactionLookupTimerImpl( + this._config.transactionTimeoutInterval + ); } public async deploy( @@ -115,10 +134,8 @@ export class Deployer { const batches = Batcher.batch(module, previousStateMap); return this._executionEngine.execute({ + config: this._config, block: { number: -1, hash: "-" }, - config: { - blockPollingInterval: BLOCK_POLLING_INTERVAL, - }, strategy: this._strategy, artifactResolver: this._artifactResolver, batches, @@ -128,6 +145,7 @@ export class Deployer { deploymentParameters, deploymentLoader: this._deploymentLoader, chainDispatcher: this._chainDispatcher, + transactionLookupTimer: this._transactionLookupTimer, }); } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index add8de5207..2caf365453 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -15,9 +15,11 @@ import { DeploymentResult } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; import { ExecutionResultMessage, + ExecutionTimeout, FutureStartMessage, JournalableMessage, OnchainTransactionReset, + StartRunMessage, TransactionMessage, } from "../../types/journal"; import { @@ -58,7 +60,10 @@ import { ExecutionStategyCycler } from "./execution-strategy-cycler"; import { isDeployedContractExecutionSuccess, isExecutionFailure, + isExecutionHold, isExecutionResultMessage, + isExecutionSuccess, + isExecutionTimeout, } from "./guards"; import { onchainStateTransitions } from "./onchain-state-transitions"; import { sortFuturesByNonces } from "./sort-futures-by-nonces"; @@ -88,6 +93,13 @@ export class ExecutionEngine { await this._checkNonces(state, futures); + // Record start of the run (which resets timeout to started) + const startRun: StartRunMessage = { + type: "run-start", + }; + + await this._apply(state, startRun); + for (const batch of batches) { // TODO: consider changing batcher to return futures rather than ids const executionBatch = batch.map((futureId) => @@ -96,6 +108,11 @@ export class ExecutionEngine { const batchResult = await this._executeBatch(executionBatch, state); + assertIgnitionInvariant( + batchResult.length === batch.length, + "All futures should have reached a completion state" + ); + if (batchResult.some(isExecutionFailure)) { return { status: "failure", @@ -107,11 +124,22 @@ export class ExecutionEngine { }; } - if (batchResult.some((b) => b.type === "execution-hold")) { + if (batchResult.some(isExecutionTimeout)) { + return { + status: "timeout", + timeouts: batchResult.filter(isExecutionTimeout).map((r) => ({ + futureId: r.futureId, + executionId: r.executionId, + txHash: r.txHash, + })), + }; + } + + if (batchResult.some(isExecutionHold)) { return { status: "hold" }; } - if (batchResult.every((b) => b.type !== "execution-success")) { + if (batchResult.every((b) => !isExecutionSuccess(b))) { throw new IgnitionError("Unexpected state"); } } @@ -264,12 +292,13 @@ export class ExecutionEngine { batch: ExecutionBatch, state: ExecutionEngineState ): Promise { + // TODO: replace this with deriving the batch results from the + // execution state at the end. let batchResults: ExecutionResultMessage[] = []; // initialize all futures // TODO: reconsider if this can be delayed until the first on-chain // submission, to reduce restart state - // TODO: nonce check on initialization? for (const future of batch) { if (state.executionStateMap[future.id] !== undefined) { continue; @@ -283,18 +312,23 @@ export class ExecutionEngine { await this._apply(state, initMessage); } - while (!this._isBatchComplete(batch, state)) { + while (!this._isBatchComplete(state, batch)) { const sortedFutures: Future[] = sortFuturesByNonces(batch, state); const results = await this._submitOrCheckFutures(sortedFutures, state); batchResults = [...batchResults, ...results]; - if (this._isBatchComplete(sortedFutures, state)) { + if (this._isBatchComplete(state, sortedFutures)) { break; } - await this._newBlock(state); + const timeoutResults = await this._newBlockOrTimeout( + state, + sortedFutures + ); + + batchResults = [...timeoutResults, ...results]; } return batchResults; @@ -326,9 +360,16 @@ export class ExecutionEngine { } /** - * Wait for the next block to be processed on-chain + * Wait for the next block to be processed on-chain, monitoring transactions + * for timeout at the same time. If timing out transactions complete + * the batch we return before the next block. */ - private async _newBlock(state: ExecutionEngineState): Promise { + private async _newBlockOrTimeout( + state: ExecutionEngineState, + futures: Future[] + ): Promise { + const timeoutResults: ExecutionTimeout[] = []; + while (true) { const currentBlock = await state.chainDispatcher.getCurrentBlock(); @@ -338,7 +379,27 @@ export class ExecutionEngine { ) { state.block = currentBlock; - return; + return timeoutResults; + } + + const timedOutTransactions = + state.transactionLookupTimer.getTimedOutTransactions(); + + for (const { futureId, executionId, txHash } of timedOutTransactions) { + const timedOut: ExecutionTimeout = { + type: "execution-timeout", + futureId, + executionId, + txHash, + }; + + timeoutResults.push(timedOut); + + await this._apply(state, timedOut); + } + + if (this._isBatchComplete(state, futures)) { + return timeoutResults; } await sleep(state.config.blockPollingInterval); @@ -405,8 +466,8 @@ export class ExecutionEngine { } private _isBatchComplete( - sortedFutures: Future[], - state: ExecutionEngineState + state: ExecutionEngineState, + sortedFutures: Future[] ): boolean { return sortedFutures.every((f) => { return this._isFutureComplete(f, state.executionStateMap); @@ -422,6 +483,7 @@ export class ExecutionEngine { return ( state !== undefined && (state.status === ExecutionStatus.HOLD || + state.status === ExecutionStatus.TIMEOUT || state.status === ExecutionStatus.SUCCESS || state.status === ExecutionStatus.FAILED) ); diff --git a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts index c90af7d8f6..924cb09c79 100644 --- a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -1,3 +1,4 @@ +import { IgnitionError } from "../../../errors"; import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, @@ -6,8 +7,10 @@ import { isFutureStartMessage, isReadEventArgumentStartMessage, isSendDataStartMessage, + isStartRunMessage, isStaticCallStartMessage, isTransactionMessage, + isWipeMessage, } from "../journal/type-guards"; import { CallExecutionState, @@ -23,13 +26,22 @@ import { } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; -import { isExecutionFailure } from "./guards"; +import { + isExecutionFailure, + isExecutionHold, + isExecutionSuccess, + isExecutionTimeout, +} from "./guards"; import { onchainActionReducer } from "./onchain-action-reducer"; export function executionStateReducer( executionStateMap: ExecutionStateMap, action: JournalableMessage ): ExecutionStateMap { + if (isStartRunMessage(action)) { + return setTimeoutFuturesToStarted(executionStateMap); + } + if (isFutureStartMessage(action)) { return { ...executionStateMap, @@ -37,7 +49,7 @@ export function executionStateReducer( }; } - if (action.type === "execution-success") { + if (isExecutionSuccess(action)) { const previousDeploymentExecutionState = executionStateMap[action.futureId]; if (action.subtype === "deploy-contract") { @@ -120,9 +132,31 @@ export function executionStateReducer( }; } - throw new Error( - "TBD - only deployment and call states are currently implemented for execution success" - ); + return assertUnknownMessageType(action); + } + + if (isExecutionTimeout(action)) { + const failedExState = executionStateMap[action.futureId]; + + return { + ...executionStateMap, + [action.futureId]: { + ...failedExState, + status: ExecutionStatus.TIMEOUT, + }, + }; + } + + if (isExecutionHold(action)) { + const failedExState = executionStateMap[action.futureId]; + + return { + ...executionStateMap, + [action.futureId]: { + ...failedExState, + status: ExecutionStatus.HOLD, + }, + }; } if (isExecutionFailure(action)) { @@ -157,7 +191,7 @@ export function executionStateReducer( }; } - if (action.type === "wipe") { + if (isWipeMessage(action)) { const updated = { ...executionStateMap, }; @@ -167,7 +201,7 @@ export function executionStateReducer( return updated; } - return executionStateMap; + return assertUnknownMessageType(action); } function initialiseExecutionStateFor( @@ -330,5 +364,27 @@ function initialiseExecutionStateFor( return executionState; } - throw new Error("Not implemented yet in the reducer"); + return assertUnknownMessageType(futureStart); +} + +/** + * Update the timed out futures to be started so they can be rerun + * @param executionStateMap - the execution states of all seen futures + * @returns the execution states with timed out futures moved back to started + */ +function setTimeoutFuturesToStarted( + executionStateMap: ExecutionStateMap +): ExecutionStateMap { + return Object.fromEntries( + Object.entries(executionStateMap).map(([futureId, exState]) => [ + futureId, + exState.status === ExecutionStatus.TIMEOUT + ? { ...exState, status: ExecutionStatus.STARTED } + : exState, + ]) + ); +} + +function assertUnknownMessageType(message: never): any { + throw new IgnitionError(`Unknown message type${JSON.stringify(message)}`); } diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index e54ae34d9b..b5dfd1a184 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -9,6 +9,7 @@ import { ExecutionHold, ExecutionResultMessage, ExecutionSuccess, + ExecutionTimeout, JournalableMessage, OnchainInteractionMessage, ReadEventArgumentExecutionSuccess, @@ -24,6 +25,7 @@ export function isExecutionResultMessage( ): potential is ExecutionResultMessage { return ( isExecutionSuccess(potential) || + isExecutionTimeout(potential) || isExecutionFailure(potential) || isExecutionHold(potential) ); @@ -41,6 +43,12 @@ export function isExecutionFailure( return potential.type === "execution-failure"; } +export function isExecutionTimeout( + potential: JournalableMessage +): potential is ExecutionTimeout { + return potential.type === "execution-timeout"; +} + export function isExecutionHold( potential: JournalableMessage ): potential is ExecutionHold { diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index 8980c7cb69..d7ae4ea300 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -7,6 +7,7 @@ import { DeployContractInteractionMessage, ExecutionFailure, ExecutionSuccess, + ExecutionTimeout, OnchainCallFunctionSuccessMessage, OnchainContractAtSuccessMessage, OnchainDeployContractSuccessMessage, @@ -50,7 +51,11 @@ import { export interface OnchainStateTransitionContinue { status: "continue"; - next: ExecutionSuccess | ExecutionFailure | TransactionMessage; + next: + | ExecutionSuccess + | ExecutionTimeout + | ExecutionFailure + | TransactionMessage; } export interface OnchainStateTransitionPause { @@ -595,6 +600,12 @@ async function checkTransactionComplete( receipt: ethers.providers.TransactionReceipt ) => ExecutionSuccess | ExecutionFailure | TransactionMessage ): Promise { + state.transactionLookupTimer.registerStartTimeIfNeeded({ + futureId: next.futureId, + executionId: next.executionId, + txHash: next.txHash, + }); + const currentTransaction = await state.chainDispatcher.getTransaction( next.txHash ); @@ -605,12 +616,31 @@ async function checkTransactionComplete( ); } + // No blocknumber means it hasn't been included in a block yet if ( currentTransaction.blockNumber === null || - // TODO: make default confirmations config - currentTransaction.confirmations < DEFAULT_CONFIRMATIONS + currentTransaction.blockNumber === undefined ) { - // transaction pending, move on with batch + // Check whether timed out + if (state.transactionLookupTimer.isTimedOut(next.txHash)) { + const timeout: ExecutionTimeout = { + type: "execution-timeout", + futureId: next.futureId, + executionId: next.executionId, + txHash: next.txHash, + }; + + return { status: "continue", next: timeout }; + } + + // otherwise transaction pending, move on with batch + return { status: "pause" }; + } + + // if the transaction is confirmed but we haven't passed the + // required number of confirmations, then pause and continue the + // batch + if (currentTransaction.confirmations < DEFAULT_CONFIRMATIONS) { return { status: "pause" }; } diff --git a/packages/core/src/new-api/internal/execution/transaction-lookup-timer.ts b/packages/core/src/new-api/internal/execution/transaction-lookup-timer.ts new file mode 100644 index 0000000000..c1795a0461 --- /dev/null +++ b/packages/core/src/new-api/internal/execution/transaction-lookup-timer.ts @@ -0,0 +1,57 @@ +import { + TransactionLookup, + TransactionLookupTimer, +} from "../types/transaction-timer"; +import { assertIgnitionInvariant } from "../utils/assertions"; + +type TransactionLookupEntry = TransactionLookup & { + start: Date; +}; + +export class TranactionLookupTimerImpl implements TransactionLookupTimer { + private _startTimes: { [key: string]: TransactionLookupEntry }; + + constructor(private _timeoutInMilliseconds: number) { + this._startTimes = {}; + } + + public registerStartTimeIfNeeded({ + txHash, + futureId, + executionId, + }: TransactionLookup): void { + if (txHash in this._startTimes) { + return; + } + + this._startTimes[txHash] = { + txHash, + futureId, + executionId, + start: new Date(), + }; + } + + public isTimedOut(txHash: string): boolean { + assertIgnitionInvariant( + txHash in this._startTimes, + "Cannot calculate timeout if start time not set" + ); + + const startTime = this._startTimes[txHash].start.getTime(); + const currentTime = new Date().getTime(); + + return currentTime - startTime > this._timeoutInMilliseconds; + } + + public getTimedOutTransactions(): TransactionLookup[] { + return Object.keys(this._startTimes) + .filter((txHash) => this.isTimedOut(txHash)) + .map((txHash) => this._startTimes[txHash]) + .map(({ futureId, executionId, txHash }) => ({ + futureId, + executionId, + txHash, + })); + } +} diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index e94fd47c90..42c6510c65 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -19,6 +19,7 @@ import { OnchainTransactionReset, ReadEventArgumentStartMessage, SendDataStartMessage, + StartRunMessage, StaticCallStartMessage, TransactionMessage, WipeMessage, @@ -26,6 +27,26 @@ import { import { FutureType } from "../../types/module"; import { isOnchainInteractionMessage } from "../execution/guards"; +/** + * Determines if potential is a StartRunMessage. + * + * @beta + */ +export function isStartRunMessage( + potential: JournalableMessage +): potential is StartRunMessage { + return potential.type === "run-start"; +} + +/** + * Determines if potential is a Wipe message + */ +export function isWipeMessage( + potential: JournalableMessage +): potential is WipeMessage { + return potential.type === "wipe"; +} + /** * Returns true if potential is ane execution start message. * @@ -251,9 +272,3 @@ export function isOnchainFailureMessage( ): message is OnchainFailureMessage { return isOnChainResultMessage(message) && message.subtype === "failure"; } - -export function isWipeMessage( - potential: JournalableMessage -): potential is WipeMessage { - return potential.type === "wipe"; -} diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index 2e4d9e7a6f..7bef1d6e25 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -9,6 +9,7 @@ import { isDeployedContractExecutionSuccess, isExecutionFailure, isExecutionHold, + isExecutionTimeout, isReadEventArgumentExecutionSuccess, isReadEventArgumentInteraction, isSendDataExecutionSuccess, @@ -32,11 +33,18 @@ import { isOnchainTransactionReset, isReadEventArgumentStartMessage, isSendDataStartMessage, + isStartRunMessage, isStaticCallStartMessage, isWipeMessage, } from "../type-guards"; export function logJournalableMessage(message: JournalableMessage): void { + /* run messages */ + + if (isStartRunMessage(message)) { + return console.log(`deployment run starting`); + } + /* start messages */ if (isDeployContractStartMessage(message)) { @@ -221,6 +229,12 @@ export function logJournalableMessage(message: JournalableMessage): void { ); } + if (isExecutionTimeout(message)) { + return console.log( + `execution timeout - futureId: '${message.futureId}' - executionId: ${message.executionId}'` + ); + } + if (isExecutionFailure(message)) { return console.log( `execution failure - futureId: '${message.futureId}' - error: '${message.error.message}'` diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 07bacd10ed..f22aac935d 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -13,15 +13,19 @@ import { import { ChainDispatcher } from "./chain-dispatcher"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; +import { TransactionLookupTimer } from "./transaction-timer"; + +export interface ExecutionConfig { + blockPollingInterval: number; + transactionTimeoutInterval: number; +} export interface ExecutionEngineState { block: { number: number; hash: string; }; - config: { - blockPollingInterval: number; - }; + config: ExecutionConfig; batches: string[][]; module: IgnitionModule>; executionStateMap: ExecutionStateMap; @@ -31,6 +35,7 @@ export interface ExecutionEngineState { artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; chainDispatcher: ChainDispatcher; + transactionLookupTimer: TransactionLookupTimer; } export interface ExecutionStrategyContext { diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index b4c4ae0604..b761758dd6 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -95,6 +95,7 @@ type ExecutionHistory = TransactionMessage[]; export enum ExecutionStatus { STARTED, HOLD, + TIMEOUT, SUCCESS, FAILED, } diff --git a/packages/core/src/new-api/internal/types/transaction-timer.ts b/packages/core/src/new-api/internal/types/transaction-timer.ts new file mode 100644 index 0000000000..60905b9377 --- /dev/null +++ b/packages/core/src/new-api/internal/types/transaction-timer.ts @@ -0,0 +1,32 @@ +export interface TransactionLookup { + futureId: string; + executionId: number; + txHash: string; +} + +export interface TransactionLookupTimer { + /** + * Register the start time of a transaction lookup. + * + * The registration is idempotent. + * + * @param txHash - the transaction hash being looked up. + */ + registerStartTimeIfNeeded(transactionLookup: TransactionLookup): void; + + /** + * Based on the registered start time of the transaction lookup, determine + * whether it has timed out. + * + * @param txHash - the transaction hash being looked up. + * @result whether the transaction lookup has timed out. + */ + isTimedOut(txHash: string): boolean; + + /** + * Get all the currently timed out transactions. + * + * @result the currently timed out transactions. + */ + getTimedOutTransactions(): TransactionLookup[]; +} diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts index 29bf705643..e28ed2fe67 100644 --- a/packages/core/src/new-api/types/deployer.ts +++ b/packages/core/src/new-api/types/deployer.ts @@ -1,5 +1,15 @@ import { IgnitionModule, IgnitionModuleResult } from "./module"; +/** + * Configuration options for the deployment. + * + * @beta + */ +export interface DeployConfig { + blockPollingInterval: number; + transactionTimeoutInterval: number; +} + /** * The result of a deployment run. * @@ -8,6 +18,7 @@ import { IgnitionModule, IgnitionModuleResult } from "./module"; export type DeploymentResult = | DeploymentResultSuccess | DeploymentResultFailure + | DeploymentResultTimeout | { status: "hold"; }; @@ -24,8 +35,8 @@ export interface DeploymentResultSuccess { } /** - * The result of a failed deployment run (at least one future had an - * failed transaction). + * The result of a failed deployment run where at least one future had a + * failed transaction. * * @beta */ @@ -34,6 +45,17 @@ export interface DeploymentResultFailure { errors: { [key: string]: Error }; } +/** + * The result a deployment run where at least one transaction has timed + * out and is still pending. + * + * @beta + */ +export interface DeploymentResultTimeout { + status: "timeout"; + timeouts: Array<{ futureId: string; executionId: number; txHash: string }>; +} + /** * The successfully deployed contract from the deployment run. * diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index dd0d928476..b7580038c3 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -17,10 +17,25 @@ export interface Journal { * @beta */ export type JournalableMessage = + | StartRunMessage | TransactionMessage | ExecutionMessage | WipeMessage; +// #region "StartRunMessage" + +/** + * A message indicating the start of a new run. + * + * @beta + */ +export interface StartRunMessage { + // TODO: we should add chain id, so we can reconcile on previous chain id + type: "run-start"; +} + +// #endregion + // #region "TransactionMessage" /** @@ -473,6 +488,7 @@ export interface ContractAtStartMessage { export type ExecutionResultMessage = | ExecutionSuccess | ExecutionFailure + | ExecutionTimeout | ExecutionHold; /** @@ -483,6 +499,7 @@ export type ExecutionResultMessage = export type ExecutionResultTypes = [ "execution-success", "execution-failure", + "execution-timeout", "execution-hold" ]; @@ -595,6 +612,18 @@ export interface ExecutionFailure { error: Error; } +/** + * A journal message indicating a future execution timed out. + * + * @beta + */ +export interface ExecutionTimeout { + type: "execution-timeout"; + futureId: string; + executionId: number; + txHash: string; +} + /** * A journal message indicating a future's execution was not completed within * the timeout. @@ -603,6 +632,8 @@ export interface ExecutionFailure { */ export interface ExecutionHold { type: "execution-hold"; + futureId: string; + executionId: number; } // #endregion diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 7e2e7eea0f..cd3c5158d3 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -104,6 +104,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -228,6 +229,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -330,6 +332,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -419,6 +422,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Library1", type: "execution-start", @@ -530,6 +534,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Library1", type: "execution-start", @@ -632,6 +637,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Library1", type: "execution-start", @@ -729,6 +735,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -896,6 +903,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1050,6 +1058,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1220,6 +1229,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1376,6 +1386,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1518,6 +1529,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1639,6 +1651,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { type: "execution-start", futureType: FutureType.NAMED_CONTRACT_AT, @@ -1735,6 +1748,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -1887,6 +1901,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Contract1", type: "execution-start", @@ -2046,6 +2061,7 @@ describe("execution engine", () => { const journalMessages = await accumulateMessages(journal); assert.deepStrictEqual(journalMessages, [ + { type: "run-start" }, { futureId: "Module1:Library1", type: "execution-start", diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index e993d270ce..b27ebd7a3a 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -419,7 +419,7 @@ export class MockChainDispatcher implements ChainDispatcher { ); } - return { _kind: "fake-transaction" } as any; + return { _kind: "fake-transaction", ...response } as any; } public async getCurrentBlock(): Promise<{ number: number; hash: string }> { diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index b9f186dddc..f9cd3fb5c1 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -1,6 +1,7 @@ import { Adapters, deploy, + DeployConfig, DeploymentResultSuccess, IgnitionError, IgnitionModuleDefinition, @@ -21,6 +22,7 @@ export class IgnitionHelper { constructor( private _hre: HardhatRuntimeEnvironment, + private _config?: Partial, adapters?: Adapters, deploymentDir?: string ) { @@ -43,6 +45,7 @@ export class IgnitionHelper { const artifactResolver = new HardhatArtifactResolver(this._hre); const result = await deploy({ + config: this._config, adapters: this._adapters, deploymentDir: this._deploymentDir, artifactResolver, @@ -52,6 +55,14 @@ export class IgnitionHelper { verbose: false, }); + if (result.status === "timeout") { + throw new IgnitionError( + `The deployment has been halted due to transaction timeouts:\n ${result.timeouts + .map((t) => `${t.txHash} (${t.futureId}/${t.executionId})`) + .join("\n ")}` + ); + } + if (result.status !== "success") { // TODO: Show more information about why it failed throw new IgnitionError("Failed deployment"); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 995071f48b..0a0880d10c 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -299,8 +299,17 @@ task("deploy2") console.log(`Future ${futureId} failed: ${errorMessage}`); } + } else if (result.status === "timeout") { + console.log("Deployment halted due to timeout"); + console.log(""); + + for (const { futureId, executionId, txHash } of result.timeouts) { + console.log(` ${txHash} (${futureId}/${executionId})`); + } } else if (result.status === "hold") { console.log("Deployment held"); + } else { + assertNeverResult(result); } } catch (err) { // TODO: bring back cli ui @@ -515,3 +524,7 @@ function resolveParametersString(paramString: string): ModuleParams { process.exit(0); } } + +function assertNeverResult(result: never) { + throw new Error(`Unknown result from deploy: ${JSON.stringify(result)}`); +} diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts index eccf67069b..b450bd8307 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts @@ -1,4 +1,5 @@ import { + DeployConfig, IgnitionModuleDefinition, IgnitionModuleResult, } from "@ignored/ignition-core"; @@ -15,7 +16,8 @@ import { clearPendingTransactionsFromMemoryPool } from "../helpers"; export function useDeploymentDirectory( fixtureProjectName: string, - deploymentId: string + deploymentId: string, + config?: Partial ) { beforeEach("Load environment", async function () { process.chdir( @@ -35,6 +37,13 @@ export function useDeploymentDirectory( await hre.run("compile", { quiet: true }); + const testConfig: Partial = { + transactionTimeoutInterval: 1000, + ...config, + }; + + this.config = testConfig; + fs.ensureDirSync(deploymentDir); this.deploy = ( @@ -45,7 +54,12 @@ export function useDeploymentDirectory( >, chainUpdates: (c: TestChainHelper) => Promise = async () => {} ) => { - return runDeploy(deploymentDir, moduleDefinition, { hre }, chainUpdates); + return runDeploy( + deploymentDir, + moduleDefinition, + { hre, config: testConfig }, + chainUpdates + ); }; }); @@ -63,11 +77,14 @@ async function runDeploy( string, IgnitionModuleResult >, - { hre }: { hre: HardhatRuntimeEnvironment }, + { + hre, + config, + }: { hre: HardhatRuntimeEnvironment; config?: Partial }, chainUpdates: (c: TestChainHelper) => Promise = async () => {} ): Promise> { const { ignitionHelper: ignitionHelper, kill: killFn } = - setupIgnitionHelperRiggedToThrow(hre, deploymentDir); + setupIgnitionHelperRiggedToThrow(hre, deploymentDir, config); try { const deployPromise = ignitionHelper.deploy(moduleDefinition, { @@ -93,7 +110,8 @@ async function runDeploy( function setupIgnitionHelperRiggedToThrow( hre: HardhatRuntimeEnvironment, - deploymentDir: string + deploymentDir: string, + config: Partial = {} ): { ignitionHelper: IgnitionHelper; kill: () => void; @@ -122,7 +140,12 @@ function setupIgnitionHelperRiggedToThrow( }, }; - const ignitionHelper = new IgnitionHelper(hre, adapters, deploymentDir); + const ignitionHelper = new IgnitionHelper( + hre, + config, + adapters, + deploymentDir + ); return { ignitionHelper, kill }; } diff --git a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts new file mode 100644 index 0000000000..f0d82be004 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts @@ -0,0 +1,40 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "../nonce-checks/useDeploymentDirectory"; + +/** + * A run that deploys a contract times out + */ +describe("execution - deploy run times out", () => { + useDeploymentDirectory("minimal-new-api", "deploy-run-times-out", { + transactionTimeoutInterval: 400, + }); + + it("should error naming timed out transactions", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + }), + "The deployment has been halted due to transaction timeouts:\n 0xc5ed278cdc282e8cf6ffa96234e680592c22a2c0afbdac114616ea02b132091b (FooModule:Foo/1)" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts new file mode 100644 index 0000000000..683f5046d0 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts @@ -0,0 +1,51 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useDeploymentDirectory, +} from "../nonce-checks/useDeploymentDirectory"; + +/** + * A run that deploys a contract times out + */ +describe("execution - rerun a deploy that timed out", () => { + useDeploymentDirectory("minimal-new-api", "rerun-a-deploy-that-timed-out", { + transactionTimeoutInterval: 400, + }); + + it("should error naming timed out transactions", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = defineModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2], but force timeout, + // by not processing any blocks + await assert.isRejected( + this.deploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + }) + ); + + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Mine the block, confirming foo + await c.mineBlock(1); + } + ); + + assert.isDefined(result); + assert.equal(await result.foo.x(), Number(1)); + }); +}); From 9fe69a287629ecea9e57a0f609d3f370af3dbf3f Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jul 2023 19:32:11 +0100 Subject: [PATCH 0557/1302] test: re-enable skipped integration tests Port the skipped tests to the new-api, and update the supporting helpers to allow clean testing. This involved adding some extra checks for async module definition functions, to satisfy the integration tests. Resolves #308. --- packages/core/src/new-api/define-module.ts | 10 + .../src/new-api/internal/module-builder.ts | 8 +- .../hardhat-plugin/test/CommandJournal.ts | 127 ---------- packages/hardhat-plugin/test/calls.ts | 108 ++++---- packages/hardhat-plugin/test/chainId.ts | 19 -- packages/hardhat-plugin/test/config.ts | 5 +- packages/hardhat-plugin/test/contracts.ts | 81 +++--- .../hardhat-plugin/test/error-handling.ts | 35 +-- .../test/execution/minimal-contract-deploy.ts | 6 +- .../multiple-batch-contract-deploy.ts | 6 +- .../error-on-pending-user-transactions.ts | 9 +- ...-with-replaced-pending-user-transaction.ts | 6 +- .../error-on-transaction-dropped.ts | 6 +- .../error-on-user-transaction-sent.ts | 6 +- ...rerun-with-dropped-ignition-transaction.ts | 9 +- ...with-now-complete-ignition-transactions.ts | 9 +- ...erun-with-pending-ignition-transactions.ts | 6 +- ...ith-replaced-confirmed-user-transaction.ts | 9 +- .../timeouts/deploy-run-times-out.ts | 6 +- .../timeouts/rerun-a-deploy-that-timed-out.ts | 6 +- .../hardhat-plugin/test/existing-contract.ts | 34 +-- packages/hardhat-plugin/test/libraries.ts | 36 +-- packages/hardhat-plugin/test/load-module.ts | 5 +- packages/hardhat-plugin/test/params.ts | 238 ++++++------------ packages/hardhat-plugin/test/plan/index.ts | 4 +- ...ntDirectory.ts => use-ignition-project.ts} | 60 ++++- packages/hardhat-plugin/test/use-module.ts | 193 ++------------ .../hardhat-plugin/test/useEnvironment.ts | 13 - 28 files changed, 368 insertions(+), 692 deletions(-) delete mode 100644 packages/hardhat-plugin/test/CommandJournal.ts delete mode 100644 packages/hardhat-plugin/test/chainId.ts rename packages/hardhat-plugin/test/{execution/nonce-checks/useDeploymentDirectory.ts => use-ignition-project.ts} (74%) delete mode 100644 packages/hardhat-plugin/test/useEnvironment.ts diff --git a/packages/core/src/new-api/define-module.ts b/packages/core/src/new-api/define-module.ts index 1345e01bea..f66ec43a0c 100644 --- a/packages/core/src/new-api/define-module.ts +++ b/packages/core/src/new-api/define-module.ts @@ -1,3 +1,5 @@ +import { IgnitionError } from "../errors"; + import { IgnitionModuleResult } from "./types/module"; import { IgnitionModuleBuilder, @@ -22,5 +24,13 @@ export function defineModule< moduleId: ModuleIdT, moduleDefintionFunction: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT ): IgnitionModuleDefinition { + if (typeof moduleId !== "string") { + throw new IgnitionError(`\`moduleId\` must be a string`); + } + + if (typeof moduleDefintionFunction !== "function") { + throw new IgnitionError(`\`moduleDefintionFunction\` must be a function`); + } + return { id: moduleId, moduleDefintionFunction }; } diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 95d6a097b3..e5fc5a62ea 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -1,7 +1,7 @@ import assert from "assert"; import { inspect } from "util"; -import { IgnitionValidationError } from "../../errors"; +import { IgnitionError, IgnitionValidationError } from "../../errors"; import { isAccountRuntimeValue, isAddressResolvableFuture, @@ -120,6 +120,12 @@ export class ModuleConstructor { ) ); + if ((mod as any).results instanceof Promise) { + throw new IgnitionError( + `The callback passed to 'defineModule' for ${moduleDefintion.id} returns a Promise; async callbacks are not allowed in 'defineModule'.` + ); + } + this._modules.set(moduleDefintion.id, mod); return mod; diff --git a/packages/hardhat-plugin/test/CommandJournal.ts b/packages/hardhat-plugin/test/CommandJournal.ts deleted file mode 100644 index ba56c7476a..0000000000 --- a/packages/hardhat-plugin/test/CommandJournal.ts +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { VertexResultEnum } from "@ignored/ignition-core/helpers"; -import { DeployStateExecutionCommand } from "@ignored/ignition-core/soon-to-be-removed"; -import { assert } from "chai"; -import { BigNumber } from "ethers"; -import fs from "fs"; - -import { CommandJournal } from "../src/CommandJournal"; - -const tempCommandFilePath = "./tmp-test-journal.journal.ndjson"; - -describe.skip("File based command journal", () => { - afterEach(() => { - if (fs.existsSync(tempCommandFilePath)) { - fs.unlinkSync(tempCommandFilePath); - } - }); - - it("should write and read commands", async () => { - const journal = new CommandJournal(31337, tempCommandFilePath); - - const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX" }, - { type: "EXECUTION::SET_BATCH", batch: [0, 1, 2, 3] }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { - name: "Example", - abi: [ - { - inputs: [ - { internalType: "uint256", name: "n", type: "uint256" }, - ], - name: "readExample", - outputs: [{ internalType: "string", name: "", type: "string" }], - stateMutability: "pure", - type: "function", - }, - ], - bytecode: - "0x608060405234801561001057600080fd5b5061022f806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063820fc73b14610030575b600080fd5b61004a600480360381019061004591906100eb565b610060565b60405161005791906101a8565b60405180910390f35b606060008203610073576100726101ca565b5b6040518060400160405280600781526020017f6578616d706c65000000000000000000000000000000000000000000000000008152509050919050565b600080fd5b6000819050919050565b6100c8816100b5565b81146100d357600080fd5b50565b6000813590506100e5816100bf565b92915050565b600060208284031215610101576101006100b0565b5b600061010f848285016100d6565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610152578082015181840152602081019050610137565b60008484015250505050565b6000601f19601f8301169050919050565b600061017a82610118565b6101848185610123565b9350610194818560208601610134565b61019d8161015e565b840191505092915050565b600060208201905081810360008301526101c2818461016f565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fdfea26469706673582212202d2263b386bafd8054b95874b748ed34129acf3f6521259fcc745499f85fd30064736f6c63430008110033", - address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - value: BigNumber.from(0), - }, - }, - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 1, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { - hash: "0x7058ee5c5c027de2480a3d559695d0a1311763c5dcb3d301ee1203cc44a9031d", - }, - }, - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 2, - result: { - _kind: VertexResultEnum.FAILURE, - failure: {} as any, // new Error("Example Error"), - }, - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 3, - result: { - _kind: VertexResultEnum.HOLD, - }, - }, - ]; - - for (const command of commands) { - await journal.record(command); - } - - const readCommands: DeployStateExecutionCommand[] = []; - - for await (const readCommand of journal.read()) { - readCommands.push(readCommand); - } - - assert.deepStrictEqual(readCommands, commands); - }); - - it("should scope runs by chainId", async () => { - const hardhatNetworkJournal = new CommandJournal( - 31337, - tempCommandFilePath - ); - - const commands: DeployStateExecutionCommand[] = [ - { type: "EXECUTION::START", executionGraphHash: "XXX" }, - ]; - - for (const command of commands) { - await hardhatNetworkJournal.record(command); - } - - const otherNetworkJournal = new CommandJournal(99999, tempCommandFilePath); - - const otherNetworkCommands: DeployStateExecutionCommand[] = []; - - for await (const readCommand of otherNetworkJournal.read()) { - otherNetworkCommands.push(readCommand); - } - - assert.deepStrictEqual(otherNetworkCommands, []); - - const laterHardhatNetworkJournal = new CommandJournal( - 31337, - tempCommandFilePath - ); - - const laterHardhatNetworkCommands: DeployStateExecutionCommand[] = []; - - for await (const readCommand of laterHardhatNetworkJournal.read()) { - laterHardhatNetworkCommands.push(readCommand); - } - - assert.deepStrictEqual(laterHardhatNetworkCommands, commands); - }); -}); diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index 49e93d0678..abdb112025 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,27 +1,26 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("calls", () => { - useEnvironment("minimal"); +describe("calls", () => { + useEphemeralIgnitionProject("minimal-new-api"); it("should be able to call contracts", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("SetAddressModule", (m) => { const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); - m.call(usesContract, "setAddress", { - args: [bar], - }); + m.call(usesContract, "setAddress", [bar]); return { bar, usesContract }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.bar); assert.isDefined(result.usesContract); @@ -31,20 +30,20 @@ describe.skip("calls", () => { }); it("should be able to call contracts with array args", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("ArrayArgModule", (m) => { const captureArraysContract = m.contract("CaptureArraysContract"); - m.call(captureArraysContract, "recordArrays", { - args: [ - [1, 2, 3], - ["a", "b", "c"], - [true, false, true], - ], - }); + m.call(captureArraysContract, "recordArrays", [ + [1, 2, 3], + ["a", "b", "c"], + [true, false, true], + ]); return { captureArraysContract }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.captureArraysContract); const captureSuceeded = await result.captureArraysContract.arraysCaptured(); @@ -53,24 +52,24 @@ describe.skip("calls", () => { }); it("should be able to call contracts with arrays nested in objects args", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("ArrayNestedModule", (m) => { const captureComplexObjectContract = m.contract( "CaptureComplexObjectContract" ); - m.call(captureComplexObjectContract, "testComplexObject", { - args: [ - { - firstBool: true, - secondArray: [1, 2, 3], - thirdSubcomplex: { sub: "sub" }, - }, - ], - }); + m.call(captureComplexObjectContract, "testComplexObject", [ + { + firstBool: true, + secondArray: [1, 2, 3], + thirdSubcomplex: { sub: "sub" }, + }, + ]); return { captureComplexObjectContract }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.captureComplexObjectContract); const captureSuceeded = @@ -80,23 +79,21 @@ describe.skip("calls", () => { }); it("should be able to make calls in order", async function () { - const result = await deployModule(this.hre, (m) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const moduleDefinition = defineModule("OrderedModule", (m) => { + const trace = m.contract("Trace", ["first"]); - const second = m.call(trace, "addEntry", { - args: ["second"], - }); + const second = m.call(trace, "addEntry", ["second"], { id: "AddEntry1" }); - m.call(trace, "addEntry", { - args: ["third"], + m.call(trace, "addEntry", ["third"], { + id: "AddEntry2", after: [second], }); return { trace }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.trace); const entry1 = await result.trace.entries(0); @@ -111,17 +108,18 @@ describe.skip("calls", () => { describe("passing value", () => { it("should be able to call a contract passing a value", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("PassingValue", (m) => { const passingValue = m.contract("PassingValue"); - m.call(passingValue, "deposit", { - args: [], - value: this.hre.ethers.utils.parseEther("1"), + m.call(passingValue, "deposit", [], { + value: BigInt(this.hre.ethers.utils.parseEther("1").toString()), }); return { passingValue }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.passingValue); const actualInstanceBalance = await this.hre.ethers.provider.getBalance( @@ -135,29 +133,31 @@ describe.skip("calls", () => { }); it("should be able to call a contract passing a value via a parameter", async function () { - const submodule = buildModule("submodule", (m) => { - const depositValue = m.getParam("depositValue"); + const submoduleDefinition = defineModule("Submodule", (m) => { + // const depositValue = m.getParameter("depositValue", 1000); const passingValue = m.contract("PassingValue"); - m.call(passingValue, "deposit", { - args: [], - value: depositValue, + m.call(passingValue, "deposit", [], { + // TODO: bring back passing this by parameter + value: BigInt(this.hre.ethers.utils.parseEther("1")), }); return { passingValue }; }); - const result = await deployModule(this.hre, (m) => { - const { passingValue } = m.useModule(submodule, { - parameters: { - depositValue: this.hre.ethers.utils.parseEther("1"), - }, - }); + const moduleDefinition = defineModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); return { passingValue }; }); + const result = await this.deploy(moduleDefinition, { + Module: { + depositValue: BigInt(this.hre.ethers.utils.parseEther("1")), + }, + }); + assert.isDefined(result.passingValue); const actualInstanceBalance = await this.hre.ethers.provider.getBalance( diff --git a/packages/hardhat-plugin/test/chainId.ts b/packages/hardhat-plugin/test/chainId.ts deleted file mode 100644 index 2123c186bf..0000000000 --- a/packages/hardhat-plugin/test/chainId.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; - -describe.skip("chain id", () => { - useEnvironment("minimal"); - - it("should have a chain id", async function () { - await deployModule(this.hre, (m) => { - const chainId = m.chainId; - - assert.equal(chainId, 31337); - - return {}; - }); - }); -}); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 3c16997d88..cc33a43a69 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -4,11 +4,8 @@ import type { IgnitionWrapperOptions } from "../src/ignition-wrapper"; import { assert } from "chai"; import { BigNumber } from "ethers"; -import { useEnvironment } from "./useEnvironment"; - +// TODO: convert these tests over once Ignition config has been updated describe.skip("config", () => { - useEnvironment("with-config"); - let loadedOptions: IgnitionWrapperOptions; beforeEach(function () { diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 75f78d0201..715b1b0441 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,53 +1,47 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("contract deploys", () => { - useEnvironment("minimal"); +describe("contract deploys", () => { + useEphemeralIgnitionProject("minimal-new-api"); it("should be able to deploy a contract", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; }); - assert.isDefined(result); + const result = await this.deploy(moduleDefinition); - const x = await result.foo.x(); - - assert.equal(x, Number(1)); + assert.equal(await result.foo.x(), Number(1)); }); it("should be able to deploy a contract with arguments", async function () { - const result = await deployModule(this.hre, (m) => { - const greeter = m.contract("Greeter", { - args: ["Hello World"], - }); + const moduleDefinition = defineModule("GreeterModule", (m) => { + const greeter = m.contract("Greeter", ["Hello World"]); return { greeter }; }); - assert.isDefined(result); + const result = await this.deploy(moduleDefinition); const greeting = await result.greeter.getGreeting(); - assert.equal(greeting, "Hello World"); }); it("should be able to deploy contracts with dependencies", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("DependentModule", (m) => { const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: [bar], - }); + const usesContract = m.contract("UsesContract", [bar]); return { bar, usesContract }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.bar); assert.isDefined(result.usesContract); @@ -57,14 +51,14 @@ describe.skip("contract deploys", () => { }); it("should be able to deploy contracts without dependencies", async function () { - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("WithoutDepModule", (m) => { const foo = m.contract("Foo"); const bar = m.contract("Bar"); return { foo, bar }; }); - assert.isDefined(result); + const result = await this.deploy(moduleDefinition); const x = await result.foo.x(); const isBar = await result.bar.isBar(); @@ -78,31 +72,32 @@ describe.skip("contract deploys", () => { const artifact = await this.hre.artifacts.readArtifact("Greeter"); - const result = await deployModule(this.hre, (m) => { - const greeter = m.contract("Greeter", artifact, { - args: ["Hello World"], - }); + const moduleDefinition = defineModule("ArtifactModule", (m) => { + const greeter = m.contractFromArtifact("Greeter", artifact, [ + "Hello World", + ]); return { greeter }; }); - assert.isDefined(result); + const result = await this.deploy(moduleDefinition); const greeting = await result.greeter.getGreeting(); - assert.equal(greeting, "Hello World"); }); describe("with endowment", () => { it("should be able to deploy a contract with an endowment", async function () { - const result = await deployModule(this.hre, (m) => { - const passingValue = m.contract("PassingValue", { - value: this.hre.ethers.utils.parseEther("1"), + const moduleDefinition = defineModule("EndowmentModule", (m) => { + const passingValue = m.contract("PassingValue", [], { + value: BigInt(this.hre.ethers.utils.parseEther("1").toString()), }); return { passingValue }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.passingValue); const actualInstanceBalance = await this.hre.ethers.provider.getBalance( @@ -115,27 +110,29 @@ describe.skip("contract deploys", () => { ); }); - it("should be able to deploy a contract with an endowment via a parameter", async function () { - const submodule = buildModule("submodule", (m) => { - const endowment = m.getParam("endowment"); + // TODO: bring this back once parameters for value enabled + it.skip("should be able to deploy a contract with an endowment via a parameter", async function () { + const submoduleDefinition = defineModule("submodule", (m) => { + const endowment = m.getParameter( + "endowment", + BigInt(this.hre.ethers.utils.parseEther("2").toString()) + ); - const passingValue = m.contract("PassingValue", { - value: endowment, + const passingValue = m.contract("PassingValue", [], { + value: endowment as any, }); return { passingValue }; }); - const result = await deployModule(this.hre, (m) => { - const { passingValue } = m.useModule(submodule, { - parameters: { - endowment: this.hre.ethers.utils.parseEther("1"), - }, - }); + const moduleDefinition = defineModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); return { passingValue }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result.passingValue); const actualInstanceBalance = await this.hre.ethers.provider.getBalance( diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts index d1a978022c..cac95b00fc 100644 --- a/packages/hardhat-plugin/test/error-handling.ts +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -1,28 +1,31 @@ /* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("module error handling", () => { - useEnvironment("minimal"); +describe("module error handling", () => { + useEphemeralIgnitionProject("minimal-new-api"); it("should error on passing async callback", async function () { - const promise = deployModule(this.hre, (async () => { - return {}; - }) as any); - - return assert.isRejected( - promise, - /The callback passed to 'buildModule' for MyModule returns a Promise; async callbacks are not allowed in 'buildModule'./ + await assert.isRejected( + this.deploy( + defineModule("AsyncModule", (async () => { + return {}; + }) as any) + ), + /The callback passed to 'defineModule' for AsyncModule returns a Promise; async callbacks are not allowed in 'defineModule'./ ); }); it("should error on module throwing an exception", async function () { - const promise = deployModule(this.hre, () => { - throw new Error("User thrown error"); - }); - - return assert.isRejected(promise, /User thrown error/); + await assert.isRejected( + this.deploy( + defineModule("AsyncModule", () => { + throw new Error("User thrown error"); + }) + ), + /User thrown error/ + ); }); }); diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts index aa9c8764a7..27333c6e23 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -2,7 +2,7 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { useEnvironment } from "../useEnvironment"; +import { useEphemeralIgnitionProject } from "../use-ignition-project"; import { sleep } from "./helpers"; @@ -11,11 +11,11 @@ import { sleep } from "./helpers"; * * Deploy a single contract with non-problematic network */ -describe.skip("execution - minimal contract deploy", function () { +describe("execution - minimal contract deploy", function () { this.timeout(60000); // TODO: rename back to minimal api once execution switched over - useEnvironment("minimal-new-api"); + useEphemeralIgnitionProject("minimal-new-api"); it("should deploy a contract that is callable", async function () { await this.hre.run("compile", { quiet: true }); diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts index e5283b80af..a6fc6d8556 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -2,7 +2,7 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { useEnvironment } from "../useEnvironment"; +import { useEphemeralIgnitionProject } from "../use-ignition-project"; import { sleep } from "./helpers"; @@ -11,11 +11,11 @@ import { sleep } from "./helpers"; * * The intent here is to test batching. */ -describe.skip("execution - multiple batch contract deploy", function () { +describe("execution - multiple batch contract deploy", function () { this.timeout(60000); // TODO: rename back to minimal api once execution switched over - useEnvironment("minimal-new-api"); + useEphemeralIgnitionProject("minimal-new-api"); it("should deploy over multiple batches", async function () { await this.hre.network.provider.request({ diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts index 32a08b5d86..2aca4c257d 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts @@ -3,12 +3,11 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { waitForPendingTxs } from "../../helpers"; -import { mineBlock } from "../helpers"; - import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; +import { mineBlock } from "../helpers"; /** * For all accounts that will be used during the deployment we check @@ -16,7 +15,7 @@ import { * and error if there are any. */ describe("execution - error on pending user transactions", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "error-on-rerun-with-replaced-pending-user-transaction" ); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts index 5b11434b8b..5f6780ec2e 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -4,8 +4,8 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -14,7 +14,7 @@ import { * error that there is a pending non-ignition transaction. */ describe("execution - error on rerun with replaced pending user transaction", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "error-on-rerun-with-replaced-pending-user-transaction" ); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts index d671e1f18a..577146d560 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts @@ -4,15 +4,15 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * On running a deploy, if a transaction is dropped from the mempool * before it is confirmed, then we halt and display an error. */ describe("execution - error on transaction dropped", () => { - useDeploymentDirectory("minimal-new-api", "error-on-transaction-dropped"); + useFileIgnitionProject("minimal-new-api", "error-on-transaction-dropped"); it("should error on the drop being detected", async function () { // Setup a module with two contract deploys (foo1 and foo2) over 2 batches diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts index 2b6cc4e964..e31a3e8a9d 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts @@ -4,8 +4,8 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * On running a deploy, if a transaction is pending and the user @@ -13,7 +13,7 @@ import { * we should error and halt immediately */ describe("execution - error on user transaction sent", () => { - useDeploymentDirectory("minimal-new-api", "error-on-user-transaction-sent"); + useFileIgnitionProject("minimal-new-api", "error-on-user-transaction-sent"); it("should error on the drop being detected", async function () { const moduleDefinition = defineModule("FooModule", (m) => { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts index 12077e3f94..fb7cc0e6b4 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -2,12 +2,11 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { clearPendingTransactionsFromMemoryPool, mineBlock } from "../helpers"; - import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; +import { clearPendingTransactionsFromMemoryPool, mineBlock } from "../helpers"; /** * Run an initial deploy, that starts but does not finish an on-chain @@ -15,7 +14,7 @@ import { * the transaction should be resubmitted. */ describe("execution - rerun with dropped ignition transactions", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "rerun-with-dropped-ignition-transactions" ); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts index bd05145a05..e5d6678c7e 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -2,12 +2,11 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { mineBlock } from "../helpers"; - import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; +import { mineBlock } from "../helpers"; /** * Run an initial deploy, that sumbit but does not confirm several on-chain @@ -15,7 +14,7 @@ import { * a second run completes the deploy. */ describe("execution - rerun with now complete ignition transactions", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "rerun-with-now-complete-ignition-transactions" ); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts index 008c2c6ffb..81b2851623 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -4,8 +4,8 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -13,7 +13,7 @@ import { * up where the first run left off and without any other user transactions. */ describe("execution - rerun with pending ignition transactions", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "rerun-with-pending-ignition-transactions" ); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts index 0e2a37984b..56d0e6c865 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -2,12 +2,11 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { mineBlock, sleep } from "../helpers"; - import { TestChainHelper, - useDeploymentDirectory, -} from "./useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; +import { mineBlock, sleep } from "../helpers"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -17,7 +16,7 @@ import { * the original transaction with a new nonce. */ describe("execution - rerun with replaced confirmed user transaction", () => { - useDeploymentDirectory( + useFileIgnitionProject( "minimal-new-api", "rerun-with-replaced-confirmed-user-transaction" ); diff --git a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts index f0d82be004..0040c512eb 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts @@ -4,14 +4,14 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "../nonce-checks/useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * A run that deploys a contract times out */ describe("execution - deploy run times out", () => { - useDeploymentDirectory("minimal-new-api", "deploy-run-times-out", { + useFileIgnitionProject("minimal-new-api", "deploy-run-times-out", { transactionTimeoutInterval: 400, }); diff --git a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts index 683f5046d0..c0eeabea17 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts @@ -4,14 +4,14 @@ import { assert } from "chai"; import { TestChainHelper, - useDeploymentDirectory, -} from "../nonce-checks/useDeploymentDirectory"; + useFileIgnitionProject, +} from "../../use-ignition-project"; /** * A run that deploys a contract times out */ describe("execution - rerun a deploy that timed out", () => { - useDeploymentDirectory("minimal-new-api", "rerun-a-deploy-that-timed-out", { + useFileIgnitionProject("minimal-new-api", "rerun-a-deploy-that-timed-out", { transactionTimeoutInterval: 400, }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index 54a3e5225d..6f4973c13c 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -1,49 +1,51 @@ /* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("existing contract", () => { - useEnvironment("minimal"); +describe("existing contract", () => { + useEphemeralIgnitionProject("minimal-new-api"); it("should be able to use an existing contract", async function () { await this.hre.run("compile", { quiet: true }); - const { abi: barAbi } = await this.hre.artifacts.readArtifact("Bar"); - const { abi: usesContractAbi } = await this.hre.artifacts.readArtifact( + const barArtifact = await this.hre.artifacts.readArtifact("Bar"); + const usesContractArtifact = await this.hre.artifacts.readArtifact( "UsesContract" ); - const firstResult = await deployModule(this.hre, (m) => { + const firstModuleDefinition = defineModule("FirstModule", (m) => { const bar = m.contract("Bar"); - const usesContract = m.contract("UsesContract", { - args: ["0x0000000000000000000000000000000000000000"], - }); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); return { bar, usesContract }; }); + const firstResult = await this.deploy(firstModuleDefinition); + assert.isDefined(firstResult.bar.address); assert.isDefined(firstResult.usesContract.address); const barAddress: string = firstResult.bar.address; const usesContractAddress: string = firstResult.usesContract.address; - const result = await deployModule(this.hre, (m) => { - const bar = m.contractAt("Bar", barAddress, barAbi); + const secondModuleDefinition = defineModule("SecondModule", (m) => { + const bar = m.contractAt("Bar", barAddress, barArtifact); const usesContract = m.contractAt( "UsesContract", usesContractAddress, - usesContractAbi + usesContractArtifact ); - m.call(usesContract, "setAddress", { - args: [bar], - }); + m.call(usesContract, "setAddress", [bar]); return { bar, usesContract }; }); + const result = await this.deploy(secondModuleDefinition); + assert.isDefined(result.bar); assert.isDefined(result.usesContract); diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 04c1593f81..9f4217ddf4 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -1,18 +1,17 @@ /* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; +// TODO: fix libraries in execution describe.skip("libraries", () => { - useEnvironment("minimal"); + useEphemeralIgnitionProject("minimal-new-api"); it("should be able to deploy a contract that depends on a hardhat library", async function () { - await this.hre.run("compile", { quiet: true }); - - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("WithLibModule", (m) => { const rubbishMath = m.library("RubbishMath"); - const dependsOnLib = m.contract("DependsOnLib", { + const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { RubbishMath: rubbishMath, }, @@ -21,6 +20,8 @@ describe.skip("libraries", () => { return { rubbishMath, dependsOnLib }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result); const contractThatDependsOnLib = result.dependsOnLib; @@ -40,9 +41,9 @@ describe.skip("libraries", () => { "RubbishMath" ); - const result = await deployModule(this.hre, (m) => { - const rubbishMath = m.library("RubbishMath", libraryArtifact); - const dependsOnLib = m.contract("DependsOnLib", { + const moduleDefinition = defineModule("ArtifactLibraryModule", (m) => { + const rubbishMath = m.libraryFromArtifact("RubbishMath", libraryArtifact); + const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { RubbishMath: rubbishMath, }, @@ -51,6 +52,8 @@ describe.skip("libraries", () => { return { rubbishMath, dependsOnLib }; }); + const result = await this.deploy(moduleDefinition); + assert.isDefined(result); const contractThatDependsOnLib = result.dependsOnLib; @@ -64,20 +67,21 @@ describe.skip("libraries", () => { }); it("should deploy a contract with an existing library", async function () { - // given - const libDeployResult = await deployModule(this.hre, (m) => { - const rubbishMath = m.contract("RubbishMath"); + const libraryModuleDefinition = defineModule("LibraryModule", (m) => { + const rubbishMath = m.library("RubbishMath"); return { rubbishMath }; }); + const libDeployResult = await this.deploy(libraryModuleDefinition); + const libAddress = libDeployResult.rubbishMath.address; const libAbi = libDeployResult.rubbishMath.abi; - const result = await deployModule(this.hre, (m) => { + const moduleDefinition = defineModule("ConsumingLibModule", (m) => { const rubbishMath = m.contractAt("RubbishMath", libAddress, libAbi); - const dependsOnLib = m.contract("DependsOnLib", { + const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { RubbishMath: rubbishMath, }, @@ -86,6 +90,8 @@ describe.skip("libraries", () => { return { dependsOnLib }; }); + const result = await this.deploy(moduleDefinition); + assert.equal(await libDeployResult.rubbishMath.add(1, 2), 3); assert.equal(await result.dependsOnLib.addThreeNumbers(1, 2, 3), 6); }); diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index 3a47373293..8996021629 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -3,11 +3,8 @@ import { assert } from "chai"; import { loadModule } from "../src/load-module"; -import { useEnvironment } from "./useEnvironment"; - +// TODO: convert over once old code paths are removed describe.skip("loadModule", function () { - useEnvironment("user-modules"); - it("should return the module given the module name", () => { const module = loadModule("ignition", "TestModule"); diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index d11e958544..2dcc4062b0 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -1,208 +1,134 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { deployModule, mineBlocks } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("module parameters", () => { - useEnvironment("minimal"); +describe("module parameters", () => { + useEphemeralIgnitionProject("minimal-new-api"); - describe("required", () => { - it("should be able to retrieve a number", async function () { - const result = await deployModule( - this.hre, - (m) => { - const myNumber = m.getParam("MyNumber"); + it("should be able to retrieve a default number", async function () { + const moduleDefinition = defineModule("WithDefaultModule", (m) => { + const myNumber = m.getParameter("MyNumber", 42); - const foo = m.contract("Foo"); + const foo = m.contract("Foo"); - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); + m.call(foo, "incByPositiveNumber", [myNumber]); - return { foo }; - }, - { - parameters: { - MyNumber: 123, - }, - } - ); - - const v = await result.foo.x(); - - assert.equal(v, Number(124)); + return { foo }; }); - it("should be able to retrieve a string", async function () { - const result = await deployModule( - this.hre, - (m) => { - const myString = m.getParam("MyString"); - - const greeter = m.contract("Greeter", { - args: [myString], - }); + const result = await this.deploy(moduleDefinition); - return { greeter }; - }, - { - parameters: { - MyString: "Example", - }, - } - ); - - const v = await result.greeter.getGreeting(); + const v = await result.foo.x(); - assert.equal(v, "Example"); - }); + assert.equal(v, Number(43)); }); - describe("optional", () => { - it("should be able to retrieve a default number", async function () { - const result = await deployModule(this.hre, (m) => { - const myNumber = m.getOptionalParam("MyNumber", 42); - - const foo = m.contract("Foo"); + it("should be able to override a default number", async function () { + const moduleDefinition = defineModule("WithDefaultModule", (m) => { + const myNumber = m.getParameter("MyNumber", 10); - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); + const foo = m.contract("Foo"); - return { foo }; - }); + m.call(foo, "incByPositiveNumber", [myNumber]); - // then - const v = await result.foo.x(); - - assert.equal(v, Number(43)); + return { foo }; }); - it("should be able to override a default number", async function () { - const result = await deployModule( - this.hre, - (m) => { - const myNumber = m.getOptionalParam("MyNumber", 10); + const result = await this.deploy(moduleDefinition, { + WithDefaultModule: { + MyNumber: 20, + }, + }); - const foo = m.contract("Foo"); + assert.equal(await result.foo.x(), Number(21)); + }); - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); + it("should be able to retrieve a default string", async function () { + const moduleDefinition = defineModule("WithDefaultStringModule", (m) => { + const myString = m.getParameter("MyString", "Example"); - return { foo }; - }, - { - parameters: { - MyNumber: 20, - }, - } - ); + const greeter = m.contract("Greeter", [myString]); - // then - const v = await result.foo.x(); - - assert.equal(v, Number(21)); + return { greeter }; }); - it("should be able to retrieve a default string", async function () { - const result = await deployModule(this.hre, (m) => { - const myString = m.getOptionalParam("MyString", "Example"); - - const greeter = m.contract("Greeter", { - args: [myString], - }); - - return { greeter }; - }); + const result = await this.deploy(moduleDefinition); - const v = await result.greeter.getGreeting(); + const v = await result.greeter.getGreeting(); - assert.equal(v, "Example"); - }); - - it("should be able to override a default string", async function () { - const result = await deployModule( - this.hre, - (m) => { - const myString = m.getOptionalParam("MyString", "Example"); + assert.equal(v, "Example"); + }); - const greeter = m.contract("Greeter", { - args: [myString], - }); + it("should be able to override a default string", async function () { + const moduleDefinition = defineModule("WithDefaultStringModule", (m) => { + const myString = m.getParameter("MyString", "Example"); - return { greeter }; - }, - { - parameters: { - MyString: "NotExample", - }, - } - ); + const greeter = m.contract("Greeter", [myString]); - // then - const v = await result.greeter.getGreeting(); + return { greeter }; + }); - assert.equal(v, "NotExample"); + const result = await this.deploy(moduleDefinition, { + WithDefaultStringModule: { + MyString: "NotExample", + }, }); + + assert.equal(await result.greeter.getGreeting(), "NotExample"); }); +}); - describe("validation", () => { - it("should throw if no parameters object provided", async function () { - await this.hre.run("compile", { quiet: true }); +// TODO: bring back with parameter validation +describe.skip("validation", () => { + useEphemeralIgnitionProject("minimal-new-api"); - const userModule = buildModule("MyModule", (m) => { - const myNumber = m.getParam("MyNumber"); + it("should throw if no parameters object provided", async function () { + await this.hre.run("compile", { quiet: true }); - const foo = m.contract("Foo"); + const userModule = defineModule("UserModule", (m) => { + const myNumber = m.getParameter("MyNumber"); - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); + const foo = m.contract("Foo"); - return { foo }; - }); + m.call(foo, "incByPositiveNumber", [myNumber]); - const deployPromise = this.hre.ignition.deploy(userModule, { ui: false }); + return { foo }; + }); - await mineBlocks(this.hre, [1, 1], deployPromise); + const deployPromise = this.hre.ignition2.deploy(userModule); - await assert.isRejected( - deployPromise, - 'No parameters object provided to deploy options, but module requires parameter "MyNumber"' - ); - }); + await assert.isRejected( + deployPromise, + 'No parameters object provided to deploy options, but module requires parameter "MyNumber"' + ); + }); - it("should throw if parameter missing from parameters", async function () { - await this.hre.run("compile", { quiet: true }); + it("should throw if parameter missing from parameters", async function () { + await this.hre.run("compile", { quiet: true }); - const userModule = buildModule("MyModule", (m) => { - const myNumber = m.getParam("MyNumber"); + const userModule = defineModule("UserModule", (m) => { + const myNumber = m.getParameter("MyNumber"); - const foo = m.contract("Foo"); + const foo = m.contract("Foo"); - m.call(foo, "incByPositiveNumber", { - args: [myNumber], - }); + m.call(foo, "incByPositiveNumber", [myNumber]); - return { foo }; - }); + return { foo }; + }); - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: { + const deployPromise = this.hre.ignition2.deploy(userModule, { + parameters: { + UserModule: { NotMyNumber: 11, }, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1], deployPromise); - - await assert.isRejected( - deployPromise, - 'No parameter provided for "MyNumber"' - ); + }, }); + + await assert.isRejected( + deployPromise, + 'No parameter provided for "MyNumber"' + ); }); }); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 6f566913d5..9883f06345 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -3,11 +3,11 @@ import { assert } from "chai"; import fs from "fs-extra"; import path from "path"; -import { useEnvironment } from "../useEnvironment"; +import { useEphemeralIgnitionProject } from "../use-ignition-project"; describe("plan", () => { // TODO: rename back to minimal api once execution switched over - useEnvironment("minimal-new-api"); + useEphemeralIgnitionProject("minimal-new-api"); it("should create a plan", async function () { const planPath = path.resolve("../minimal-new-api/cache/plan"); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts b/packages/hardhat-plugin/test/use-ignition-project.ts similarity index 74% rename from packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts rename to packages/hardhat-plugin/test/use-ignition-project.ts index b450bd8307..31d937c234 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/useDeploymentDirectory.ts +++ b/packages/hardhat-plugin/test/use-ignition-project.ts @@ -2,6 +2,7 @@ import { DeployConfig, IgnitionModuleDefinition, IgnitionModuleResult, + ModuleParameters, } from "@ignored/ignition-core"; import { Contract } from "ethers"; import fs from "fs-extra"; @@ -9,25 +10,70 @@ import { resetHardhatContext } from "hardhat/plugins-testing"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { buildAdaptersFrom } from "../../../src/buildAdaptersFrom"; -import { IgnitionHelper } from "../../../src/ignition-helper"; -import { waitForPendingTxs } from "../../helpers"; -import { clearPendingTransactionsFromMemoryPool } from "../helpers"; +import { buildAdaptersFrom } from "../src/buildAdaptersFrom"; +import { IgnitionHelper } from "../src/ignition-helper"; -export function useDeploymentDirectory( +import { clearPendingTransactionsFromMemoryPool } from "./execution/helpers"; +import { waitForPendingTxs } from "./helpers"; + +export function useEphemeralIgnitionProject( + fixtureProjectName: string, + config?: Partial +) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "./fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + + this.hre = hre; + this.deploymentDir = undefined; + + await hre.run("compile", { quiet: true }); + + const testConfig: Partial = { + transactionTimeoutInterval: 1000, + ...config, + }; + + this.config = testConfig; + + this.deploy = ( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + parameters: { [key: string]: ModuleParameters } = {} + ) => { + return this.hre.ignition2.deploy(moduleDefinition, { + parameters, + }); + }; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} + +export function useFileIgnitionProject( fixtureProjectName: string, deploymentId: string, config?: Partial ) { beforeEach("Load environment", async function () { process.chdir( - path.join(__dirname, "../../fixture-projects", fixtureProjectName) + path.join(__dirname, "./fixture-projects", fixtureProjectName) ); const hre = require("hardhat"); const deploymentDir = path.join( - path.resolve(__dirname, "../../fixture-projects/minimal-new-api/"), + path.resolve(__dirname, "./fixture-projects/minimal-new-api/"), "deployments", deploymentId ); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index 0dea11444f..49ce9f59d1 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,169 +1,33 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule, IDeploymentBuilder } from "@ignored/ignition-core"; +import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { mineBlocks } from "./helpers"; -import { useEnvironment } from "./useEnvironment"; +import { useEphemeralIgnitionProject } from "./use-ignition-project"; -describe.skip("useModule", function () { - useEnvironment("minimal"); +describe("useModule", function () { + useEphemeralIgnitionProject("minimal-new-api"); describe("returning futures from module usage", () => { it("using useModule", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyModule = buildModule( - "ThirdPartySubmodule", - (m: IDeploymentBuilder) => { - const foo = m.contract("Foo"); - - return { foo }; - } - ); - - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { - const { foo } = m.useModule(thirdPartyModule); - - m.call(foo, "inc", { - args: [], - }); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); - - const x = await result.foo.x(); - - assert.equal(x, Number(2)); - }); - }); - - describe("passing futures into submodules", () => { - it("using useModule", async function () { - await this.hre.run("compile", { quiet: true }); - - const thirdPartySubmodule = buildModule("ThirdPartySubmodule", (m) => { - const foo = m.getParam("Foo"); - - m.call(foo, "inc", { - args: [], - }); - - return {}; - }); - - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { + const thirdPartyModule = defineModule("ThirdPartySubmodule", (m) => { const foo = m.contract("Foo"); - m.useModule(thirdPartySubmodule, { - parameters: { - Foo: foo, - }, - }); - return { foo }; }); - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); - - const x = await result.foo.x(); - - assert.equal(x, Number(2)); - }); - }); - - describe("modules depending on modules", () => { - it("should allow ordering using returned futures", async function () { - await this.hre.run("compile", { quiet: true }); - - const addSecondAndThirdEntryModule = buildModule( - "SecondAndThirdCallModule", - (m) => { - const trace = m.getParam("Trace"); - - const secondCall = m.call(trace, "addEntry", { - args: ["second"], - }); - - m.call(trace, "addEntry", { - args: ["third"], - after: [secondCall], - }); - - return {}; - } - ); - - const fourthCallModule = buildModule("FourthCallModule", (m) => { - const trace = m.getParam("Trace"); - - m.call(trace, "addEntry", { - args: ["fourth"], - }); - - return {}; - }); - - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { - const trace = m.contract("Trace", { - args: ["first"], - }); - - const secondAndThirdModule = m.useModule(addSecondAndThirdEntryModule, { - parameters: { - Trace: trace, - }, - }); - - m.useModule(fourthCallModule, { - parameters: { - Trace: trace, - }, - after: [secondAndThirdModule], - }); + const userModule = defineModule("UserModule", (m) => { + const { foo } = m.useModule(thirdPartyModule); - return { trace }; - }); + m.call(foo, "inc"); - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, + return { foo }; }); - await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); - - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); - const entry4 = await result.trace.entries(3); + const result = await this.deploy(userModule); - assert.deepStrictEqual( - [entry1, entry2, entry3, entry4], - ["first", "second", "third", "fourth"] - ); + assert.equal(await result.foo.x(), Number(2)); }); }); @@ -171,19 +35,15 @@ describe.skip("useModule", function () { it("should execute all in a module before any that depends on a contract within the module", async function () { await this.hre.run("compile", { quiet: true }); - const firstSecondAndThirdModule = buildModule( + const firstSecondAndThirdModule = defineModule( "SecondAndThirdCallModule", (m) => { - const trace = m.contract("Trace", { - args: ["first"], - }); + const trace = m.contract("Trace", ["first"]); - const secondCall = m.call(trace, "addEntry", { - args: ["second"], - }); + const secondCall = m.call(trace, "addEntry", ["second"]); - m.call(trace, "addEntry", { - args: ["third"], + m.call(trace, "addEntry", ["third"], { + id: "third-add-entry", after: [secondCall], }); @@ -191,32 +51,21 @@ describe.skip("useModule", function () { } ); - const fourthCallModule = buildModule("FourthCallModule", (m) => { + const fourthCallModule = defineModule("FourthCallModule", (m) => { const { trace } = m.useModule(firstSecondAndThirdModule); - m.call(trace, "addEntry", { - args: ["fourth"], - }); + m.call(trace, "addEntry", ["fourth"]); return { trace }; }); - const userModule = buildModule("UserModule", (m: IDeploymentBuilder) => { - const { trace } = m.useModule(fourthCallModule, {}); + const userModule = defineModule("UserModule", (m) => { + const { trace } = m.useModule(fourthCallModule); return { trace }; }); - const deployPromise = this.hre.ignition.deploy(userModule, { - parameters: {}, - ui: false, - }); - - await mineBlocks(this.hre, [1, 1, 1, 1], deployPromise); - - const result = await deployPromise; - - assert.isDefined(result); + const result = await this.deploy(userModule); const entry1 = await result.trace.entries(0); const entry2 = await result.trace.entries(1); diff --git a/packages/hardhat-plugin/test/useEnvironment.ts b/packages/hardhat-plugin/test/useEnvironment.ts deleted file mode 100644 index 79faa41712..0000000000 --- a/packages/hardhat-plugin/test/useEnvironment.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { resetHardhatContext } from "hardhat/plugins-testing"; -import path from "path"; - -export function useEnvironment(fixtureProjectName: string) { - beforeEach("Load environment", function () { - process.chdir(path.join(__dirname, "fixture-projects", fixtureProjectName)); - this.hre = require("hardhat"); - }); - - afterEach("reset hardhat context", function () { - resetHardhatContext(); - }); -} From 0530ffdb2ca51faf804e54ce8d9658d76c1e54de Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 19 Jul 2023 12:08:21 +0100 Subject: [PATCH 0558/1302] fix: wire library injection through exState init This fixes the deployment of contracts/libraries that need linked to other libraries. This is done by resolving the library deps to the deployed libraries during the init command for execution state. --- .../internal/execution/execution-engine.ts | 47 +++++++++++++------ .../internal/execution/execution-strategy.ts | 1 + .../execution/onchain-state-transitions.ts | 4 +- ...-future-to-value.ts => resolve-futures.ts} | 40 +++++++++++++++- packages/core/src/new-api/types/journal.ts | 1 + .../new-api/execution/execution-engine.ts | 23 ++++++--- .../test/new-api/reconciliation/reconciler.ts | 2 + .../minimal-new-api/contracts/WithLibrary.sol | 36 ++++++++++---- packages/hardhat-plugin/test/libraries.ts | 39 ++++++++++++++- .../test/use-ignition-project.ts | 1 + 10 files changed, 159 insertions(+), 35 deletions(-) rename packages/core/src/new-api/internal/utils/{resolve-future-to-value.ts => resolve-futures.ts} (70%) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 2caf365453..4b6941c8bd 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -25,6 +25,7 @@ import { import { AccountRuntimeValue, ArgumentType, + ContractFuture, Future, FutureType, ModuleParameters, @@ -52,7 +53,10 @@ import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; import { resolveFromAddress } from "../utils/resolve-from-address"; -import { resolveFutureToValue } from "../utils/resolve-future-to-value"; +import { + resolveContractFutureToAddress, + resolveFutureToValue, +} from "../utils/resolve-futures"; import { resolveModuleParameter } from "../utils/resolve-module-parameter"; import { executionStateReducer } from "./execution-state-reducer"; @@ -552,9 +556,9 @@ export class ExecutionEngine { deploymentParameters, executionStateMap, }), - libraries: Object.fromEntries( - Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) - ), + libraries: this._resolveLibraries(future.libraries, { + executionStateMap, + }), from: this._resolveAddress(future.from, { accounts }), }; @@ -583,9 +587,9 @@ export class ExecutionEngine { deploymentParameters, executionStateMap, }), - libraries: Object.fromEntries( - Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) - ), + libraries: this._resolveLibraries(future.libraries, { + executionStateMap, + }), from: this._resolveAddress(future.from, { accounts }), }; @@ -610,9 +614,9 @@ export class ExecutionEngine { contractName: future.contractName, value: "0", constructorArgs: [], - libraries: Object.fromEntries( - Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) - ), + libraries: this._resolveLibraries(future.libraries, { + executionStateMap, + }), from: this._resolveAddress(future.from, { accounts }), }; @@ -634,9 +638,9 @@ export class ExecutionEngine { contractName: future.contractName, value: "0", constructorArgs: [], - libraries: Object.fromEntries( - Object.entries(future.libraries).map(([key, lib]) => [key, lib.id]) - ), + libraries: this._resolveLibraries(future.libraries, { + executionStateMap, + }), from: this._resolveAddress(future.from, { accounts }), }; @@ -656,9 +660,7 @@ export class ExecutionEngine { futureId: future.id, futureType: future.type, strategy, - // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), - // history: [], args: this._resolveArgs(future.args, { accounts, deploymentParameters, @@ -868,6 +870,21 @@ export class ExecutionEngine { } } + /** + * Resolve the libraries to their deployed addresses. + */ + private _resolveLibraries( + libraries: Record>, + { executionStateMap }: { executionStateMap: ExecutionStateMap } + ) { + return Object.fromEntries( + Object.entries(libraries).map(([key, lib]) => [ + key, + resolveContractFutureToAddress(lib, { executionStateMap }), + ]) + ); + } + /** * Resolve the address like from to either undefined - which passes the * user intent to the execution strategy, or to a usable string address. diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 29b7e8ba2c..53c0b64a4d 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -114,6 +114,7 @@ export class BasicExecutionStrategy value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, storedArtifactPath: deploymentExecutionState.storedArtifactPath, + libraries: deploymentExecutionState.libraries, from: sender, }; diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index d7ae4ea300..d6a5a7c9c8 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -457,9 +457,9 @@ async function _convertRequestToDeployTransaction( const args = request.args; const value = BigInt(request.value); const from = request.from; + const libraries = request.libraries; - // TODO: fix libraries - const linkedByteCode = await collectLibrariesAndLink(artifact, {}); + const linkedByteCode = await collectLibrariesAndLink(artifact, libraries); const tx = state.chainDispatcher.constructDeployTransaction( linkedByteCode, diff --git a/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts b/packages/core/src/new-api/internal/utils/resolve-futures.ts similarity index 70% rename from packages/core/src/new-api/internal/utils/resolve-future-to-value.ts rename to packages/core/src/new-api/internal/utils/resolve-futures.ts index e132bb1432..4bd3f6384f 100644 --- a/packages/core/src/new-api/internal/utils/resolve-future-to-value.ts +++ b/packages/core/src/new-api/internal/utils/resolve-futures.ts @@ -12,6 +12,44 @@ import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { assertIgnitionInvariant } from "./assertions"; +/** + * Resolve a future to its value for execution. This will depend on the future + * type, so a contract deploy will resolve to its address. + * + * @param future + * @param context + */ +export function resolveContractFutureToAddress( + future: Future, + context: { executionStateMap: ExecutionStateMap } +): string { + const executionState = _resolveFromExecutionState( + future, + context.executionStateMap + ); + + assertIgnitionInvariant( + isDeploymentExecutionState(executionState) || + isContractAtExecutionState(executionState), + `Cannot only resolve an address for a ContractAt, NamedLibrary, NamedContract, ArtifactLibrary, ArtifactContract` + ); + + if (isContractAtExecutionState(executionState)) { + return executionState.contractAddress; + } + + if (isDeploymentExecutionState(executionState)) { + assertIgnitionInvariant( + executionState.contractAddress !== undefined, + `Future ${future.id} does not have a contract address` + ); + + return executionState.contractAddress; + } + + return _assertNeverExecutionState(executionState); +} + /** * Resolve a future to its value for execution. This will depend on the future * type, so a contract deploy will resolve to its address. @@ -90,6 +128,6 @@ function _resolveFromExecutionState< return executionState; } -function _assertNeverExecutionState(_state: never): SolidityParameterType { +function _assertNeverExecutionState(_state: never): T { throw new IgnitionError("Unknown execution state"); } diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index b7580038c3..c3dc6be898 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -79,6 +79,7 @@ export interface DeployContractInteractionMessage { contractName: string; storedArtifactPath: string; value: string; + libraries: { [key: string]: string }; from: string; } diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index cd3c5158d3..f7b952164a 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -136,6 +136,7 @@ describe("execution engine", () => { ], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -255,6 +256,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: accounts[2], + libraries: {}, storedArtifactPath: "Module1:Contract1.json", }, { @@ -356,6 +358,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: accounts[1], + libraries: {}, storedArtifactPath: "Module1:Contract1.json", }, { @@ -446,6 +449,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Library1.json", + libraries: {}, from: accounts[2], }, { @@ -560,6 +564,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: accounts[2], + libraries: {}, storedArtifactPath: "Module1:Library1.json", }, { @@ -661,6 +666,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), from: accounts[1], + libraries: {}, storedArtifactPath: "Module1:Library1.json", }, { @@ -759,6 +765,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -927,6 +934,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1082,6 +1090,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1253,6 +1262,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1410,6 +1420,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1553,6 +1564,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1772,6 +1784,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -1925,6 +1938,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: accounts[1], }, { @@ -2007,9 +2021,6 @@ describe("execution engine", () => { "Contract1", [{ nested: library1, arr: [account1, supply] }], { - libraries: { - Library1: library1, - }, from: account1, } ); @@ -2085,6 +2096,7 @@ describe("execution engine", () => { args: [], value: BigInt(0).toString(), storedArtifactPath: "Module1:Library1.json", + libraries: {}, from: accounts[1], }, { @@ -2136,9 +2148,7 @@ describe("execution engine", () => { nested: differentAddress, }, ], - libraries: { - Library1: "Module1:Library1", - }, + libraries: {}, from: accounts[1], }, { @@ -2155,6 +2165,7 @@ describe("execution engine", () => { ], value: BigInt(0).toString(), storedArtifactPath: "Module1:Contract1.json", + libraries: {}, from: exampleAccounts[1], }, { diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 6b77c40a36..cabcb121bb 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -136,6 +136,7 @@ describe("Reconciliation", () => { args: [], contractName: "Contract1", storedArtifactPath: "./Module1:Contract1.json", + libraries: {}, value: BigInt(0).toString(), // history indicates from was accounts[3] from: exampleAccounts[0], @@ -192,6 +193,7 @@ describe("Reconciliation", () => { args: [], contractName: "Contract1", storedArtifactPath: "./Module1:Contract1.json", + libraries: {}, value: BigInt(0).toString(), // history indicates from was accounts[3] from: exampleAccounts[3], diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol index 903f589c6c..3a1f0acd2a 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/WithLibrary.sol @@ -2,17 +2,33 @@ pragma solidity >=0.7.0 <0.9.0; library RubbishMath { - function add(uint16 left, uint16 right) public pure returns (uint16) { - return left + right; - } + function add(uint16 left, uint16 right) public pure returns (uint16) { + return left + right; + } } contract DependsOnLib { - function addThreeNumbers( - uint16 first, - uint16 second, - uint16 third - ) public pure returns (uint16) { - return RubbishMath.add(first, RubbishMath.add(second, third)); - } + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return RubbishMath.add(first, RubbishMath.add(second, third)); + } +} + +library LibDependsOnLib { + function add(uint16 left, uint16 right) public pure returns (uint16) { + return RubbishMath.add(left, right); + } +} + +contract DependsOnLibThatDependsOnLib { + function addThreeNumbers( + uint16 first, + uint16 second, + uint16 third + ) public pure returns (uint16) { + return LibDependsOnLib.add(first, LibDependsOnLib.add(second, third)); + } } diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 9f4217ddf4..9db37cb879 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; // TODO: fix libraries in execution -describe.skip("libraries", () => { +describe("libraries", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to deploy a contract that depends on a hardhat library", async function () { @@ -95,4 +95,41 @@ describe.skip("libraries", () => { assert.equal(await libDeployResult.rubbishMath.add(1, 2), 3); assert.equal(await result.dependsOnLib.addThreeNumbers(1, 2, 3), 6); }); + + it("should be able to deploy a library that depends on a library", async function () { + const moduleDefinition = defineModule("ArtifactLibraryModule", (m) => { + const rubbishMath = m.library("RubbishMath"); + + const libDependsOnLib = m.library("LibDependsOnLib", { + libraries: { + RubbishMath: rubbishMath, + }, + }); + + const dependsOnLibThatDependsOnLib = m.contract( + "DependsOnLibThatDependsOnLib", + [], + { + libraries: { + LibDependsOnLib: libDependsOnLib, + }, + } + ); + + return { rubbishMath, libDependsOnLib, dependsOnLibThatDependsOnLib }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.isDefined(result); + const contractThatDependsOnLibOnLib = result.dependsOnLibThatDependsOnLib; + + const libBasedAddtion = await contractThatDependsOnLibOnLib.addThreeNumbers( + 1, + 2, + 3 + ); + + assert.equal(libBasedAddtion, 6); + }); }); diff --git a/packages/hardhat-plugin/test/use-ignition-project.ts b/packages/hardhat-plugin/test/use-ignition-project.ts index 31d937c234..428f2c32fa 100644 --- a/packages/hardhat-plugin/test/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/use-ignition-project.ts @@ -28,6 +28,7 @@ export function useEphemeralIgnitionProject( const hre = require("hardhat"); await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); this.hre = hre; this.deploymentDir = undefined; From 0bfb8789cb9d3066e7da32426d63f0371ff3054c Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 21 Jul 2023 12:44:13 +0100 Subject: [PATCH 0559/1302] fix: rework ephemeral deployment to support passed artifacts This involved reworking the deployment loaders to separate between storing artifacts from HH/artifact resolver and those passed in. In Ephemeral mode we ignore the passed artifact but keep the name used to load via the artifact resolver. In file mode we store the artifact for later retrieval. The future id is used to identify the artifact to load now instead of artifact path. For a future this is recorded in the execution state under `artifactFutureId` to support futures that resolve their artifacts based on another future. --- .../core/src/new-api/internal/deployer.ts | 2 +- .../ephemeral-deployment-loader.ts | 72 ++++++--- .../file-deployment-loader.ts | 38 +++-- .../internal/execution/execution-engine.ts | 130 +++++++-------- .../execution/execution-state-reducer.ts | 11 +- .../internal/execution/execution-strategy.ts | 10 +- .../execution/onchain-state-transitions.ts | 8 +- .../new-api/internal/types/execution-state.ts | 11 +- packages/core/src/new-api/types/artifact.ts | 1 - packages/core/src/new-api/types/deployer.ts | 16 +- .../src/new-api/types/deployment-loader.ts | 14 +- packages/core/src/new-api/types/journal.ts | 22 ++- packages/core/test/new-api/batcher.ts | 3 +- .../new-api/execution/execution-engine.ts | 148 +++++++----------- .../core/test/new-api/execution/restart.ts | 2 +- packages/core/test/new-api/helpers.ts | 66 ++++---- .../futures/reconcileArtifactContractAt.ts | 13 +- .../reconcileArtifactContractDeployment.ts | 3 +- .../reconcileArtifactLibraryDeployment.ts | 3 +- .../futures/reconcileNamedContractAt.ts | 7 +- .../futures/reconcileNamedContractCall.ts | 5 +- .../reconcileNamedContractDeployment.ts | 3 +- .../reconcileNamedLibraryDeployment.ts | 3 +- .../futures/reconcileNamedStaticCall.ts | 5 +- .../futures/reconcileReadEventArgument.ts | 5 +- .../test/new-api/reconciliation/reconciler.ts | 7 +- .../src/hardhat-artifact-resolver.ts.ts | 6 +- .../hardhat-plugin/src/ignition-helper.ts | 24 +-- .../test/execution/deploy-from-artifact.ts | 35 +++++ .../test/execution/minimal-contract-deploy.ts | 34 ++-- 30 files changed, 354 insertions(+), 353 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/deploy-from-artifact.ts diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 684b635313..74803806ea 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -184,7 +184,7 @@ export class Deployer { for (const contract of contractStates) { const artifact = await this._deploymentLoader.loadArtifact( - contract.storedArtifactPath + contract.artifactFutureId ); entries.push([contract.id, artifact]); diff --git a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index 3747e79051..856384e4ab 100644 --- a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -1,9 +1,8 @@ -import fs from "fs"; - import { Artifact, ArtifactResolver, BuildInfo } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; import { Journal } from "../../types/journal"; import { MemoryJournal } from "../journal/memory-journal"; +import { assertIgnitionInvariant } from "../utils/assertions"; /** * Stores and loads deployment related information without making changes @@ -14,6 +13,11 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { public journal: Journal; private _deployedAddresses: { [key: string]: string }; + private _savedArtifacts: { + [key: string]: + | { _kind: "artifact"; artifact: Artifact } + | { _kind: "contractName"; contractName: string }; + }; constructor( private _artifactResolver: ArtifactResolver, @@ -21,14 +25,7 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { ) { this.journal = new MemoryJournal(this._verbose); this._deployedAddresses = {}; - } - - public async loadArtifact(storedArtifactPath: string): Promise { - const json = await fs.promises.readFile(storedArtifactPath); - - const artifact = JSON.parse(json.toString()); - - return artifact; + this._savedArtifacts = {}; } public async recordDeployedAddress( @@ -38,24 +35,51 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { this._deployedAddresses[futureId] = contractAddress; } - public async storeArtifact( - _futureId: string, - artifact: Artifact - ): Promise { - const artifactPath = await this._artifactResolver.resolvePath( - artifact.contractName - ); + public async storeBuildInfo(_buildInfo: BuildInfo): Promise { + // For ephemeral we are ignoring build info + } - if (artifactPath === undefined) { - throw new Error(`Artifact path not found for ${artifact.contractName}`); - } + public async storeNamedArtifact( + futureId: string, + contractName: string, + _artifact: Artifact + ): Promise { + this._savedArtifacts[futureId] = { _kind: "contractName", contractName }; + } - return artifactPath; + public async storeUserProvidedArtifact( + futureId: string, + artifact: Artifact + ): Promise { + this._savedArtifacts[futureId] = { _kind: "artifact", artifact }; } - public async storeBuildInfo(buildInfo: BuildInfo): Promise { - const id = buildInfo.id; + public async loadArtifact(artifactFutureId: string): Promise { + const futureId = artifactFutureId; + + const saved = this._savedArtifacts[futureId]; - return `${id}.json`; + assertIgnitionInvariant( + saved !== undefined, + `No stored artifact for ${futureId}` + ); + + switch (saved._kind) { + case "artifact": { + return saved.artifact; + } + case "contractName": { + const fileArtifact = this._artifactResolver.loadArtifact( + saved.contractName + ); + + assertIgnitionInvariant( + fileArtifact !== undefined, + `Unable to load artifact, underlying resolver returned undefined for ${saved.contractName}` + ); + + return fileArtifact; + } + } } } diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 110dfcb381..6090e2446c 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -55,10 +55,20 @@ export class FileDeploymentLoader implements DeploymentLoader { this._deploymentDirsEnsured = true; } - public async storeArtifact( + public storeNamedArtifact( futureId: string, + _contractName: string, artifact: Artifact - ): Promise { + ): Promise { + // For a file deployment we don't differentiate between + // named contracts (from HH) and anonymous contracts passed in by the user + return this.storeUserProvidedArtifact(futureId, artifact); + } + + public async storeUserProvidedArtifact( + futureId: string, + artifact: Artifact + ): Promise { await this._initialize(); const artifactFilePath = path.join( @@ -69,31 +79,28 @@ export class FileDeploymentLoader implements DeploymentLoader { artifactFilePath, JSON.stringify(artifact, undefined, 2) ); - - return path.relative(this._paths.deploymentDir, artifactFilePath); } - public async storeBuildInfo(buildInfo: BuildInfo): Promise { + public async storeBuildInfo(buildInfo: BuildInfo): Promise { await this._initialize(); const buildInfoFilePath = path.join( this._paths?.buildInfoDir, `${buildInfo.id}.json` ); + await fs.writeFile( buildInfoFilePath, JSON.stringify(buildInfo, undefined, 2) ); - - return path.relative(this._paths.deploymentDir, buildInfoFilePath); } - public async loadArtifact(storedArtifactPath: string): Promise { + public async loadArtifact(futureId: string): Promise { await this._initialize(); - const json = await fs.readFile( - path.join(this._paths?.deploymentDir, storedArtifactPath) - ); + const artifactFilePath = this._resolveArtifactPathFor(futureId); + + const json = await fs.readFile(artifactFilePath); const artifact = JSON.parse(json.toString()); @@ -124,4 +131,13 @@ export class FileDeploymentLoader implements DeploymentLoader { `${JSON.stringify(deployedAddresses, undefined, 2)}\n` ); } + + private _resolveArtifactPathFor(futureId: string) { + const artifactFilePath = path.join( + this._paths.artifactsDir, + `${futureId}.json` + ); + + return artifactFilePath; + } } diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 4b6941c8bd..1f979b24ed 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -11,7 +11,11 @@ import { isModuleParameterRuntimeValue, } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; -import { DeploymentResult } from "../../types/deployer"; +import { + DeploymentResult, + DeploymentResultContract, + DeploymentResultContracts, +} from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; import { ExecutionResultMessage, @@ -45,6 +49,7 @@ import { ExecutionStrategyContext, } from "../types/execution-engine"; import { + ContractAtExecutionState, DeploymentExecutionState, ExecutionStateMap, ExecutionStatus, @@ -150,7 +155,7 @@ export class ExecutionEngine { return { status: "success", - contracts: this._resolveDeployedContractsFrom(state), + contracts: await this._resolveDeployedContractsFrom(state), module: state.module, }; } @@ -534,7 +539,7 @@ export class ExecutionEngine { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - const artifactContractPath = await deploymentLoader.storeArtifact( + await deploymentLoader.storeUserProvidedArtifact( future.id, future.artifact ); @@ -547,8 +552,7 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath: artifactContractPath, - storedBuildInfoPath: undefined, + artifactFutureId: future.id, contractName: future.contractName, value: future.value.toString(), constructorArgs: this._resolveArgs(future.constructorArgs, { @@ -564,10 +568,7 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_DEPLOYMENT: - const { - storedArtifactPath: namedContractArtifactPath, - storedBuildInfoPath: namedContractBuildInfoPath, - } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + await this._storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, deploymentLoader, }); @@ -578,8 +579,7 @@ export class ExecutionEngine { futureType: future.type, strategy, dependencies: [...future.dependencies].map((f) => f.id), - storedArtifactPath: namedContractArtifactPath, - storedBuildInfoPath: namedContractBuildInfoPath, + artifactFutureId: future.id, contractName: future.contractName, value: future.value.toString(), constructorArgs: this._resolveArgs(future.constructorArgs, { @@ -595,10 +595,7 @@ export class ExecutionEngine { return state; case FutureType.NAMED_LIBRARY_DEPLOYMENT: - const { - storedArtifactPath: namedLibArtifactPath, - storedBuildInfoPath: namedLibBuildInfoPath, - } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + await this._storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, deploymentLoader, }); @@ -609,8 +606,7 @@ export class ExecutionEngine { futureType: future.type, strategy, dependencies: [...future.dependencies].map((f) => f.id), - storedArtifactPath: namedLibArtifactPath, - storedBuildInfoPath: namedLibBuildInfoPath, + artifactFutureId: future.id, contractName: future.contractName, value: "0", constructorArgs: [], @@ -622,7 +618,7 @@ export class ExecutionEngine { return state; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - const artifactLibraryPath = await deploymentLoader.storeArtifact( + await deploymentLoader.storeUserProvidedArtifact( future.id, future.artifact ); @@ -633,8 +629,7 @@ export class ExecutionEngine { futureType: future.type, strategy, dependencies: [...future.dependencies].map((f) => f.id), - storedArtifactPath: artifactLibraryPath, - storedBuildInfoPath: undefined, + artifactFutureId: future.id, contractName: future.contractName, value: "0", constructorArgs: [], @@ -646,9 +641,8 @@ export class ExecutionEngine { return state; case FutureType.NAMED_CONTRACT_CALL: { - const { contractAddress, storedArtifactPath } = executionStateMap[ - future.contract.id - ] as DeploymentExecutionState; + const { contractAddress, artifactFutureId: callContractFutureId } = + executionStateMap[future.contract.id] as DeploymentExecutionState; assertIgnitionInvariant( contractAddress !== undefined, @@ -668,16 +662,17 @@ export class ExecutionEngine { }), functionName: future.functionName, contractAddress, - storedArtifactPath, + artifactFutureId: callContractFutureId, value: future.value.toString(), from: resolveFromAddress(future.from, { accounts }), }; return state; } case FutureType.NAMED_STATIC_CALL: { - const { contractAddress, storedArtifactPath } = executionStateMap[ - future.contract.id - ] as DeploymentExecutionState; + const { + contractAddress, + artifactFutureId: staticCallContractFutureId, + } = executionStateMap[future.contract.id] as DeploymentExecutionState; assertIgnitionInvariant( contractAddress !== undefined, @@ -699,16 +694,15 @@ export class ExecutionEngine { }), functionName: future.functionName, contractAddress, - storedArtifactPath, + artifactFutureId: staticCallContractFutureId, from: resolveFromAddress(future.from, { accounts }), }; return state; } case FutureType.READ_EVENT_ARGUMENT: { // TODO: This should also support contractAt - const { contractAddress, storedArtifactPath } = executionStateMap[ - future.emitter.id - ] as DeploymentExecutionState; + const { contractAddress, artifactFutureId: readEventContractFutureId } = + executionStateMap[future.emitter.id] as DeploymentExecutionState; // TODO: This should support multiple transactions const { txId } = executionStateMap[ @@ -733,7 +727,7 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - storedArtifactPath, + artifactFutureId: readEventContractFutureId, eventName: future.eventName, argumentName: future.argumentName, txToReadFrom: txId, @@ -801,10 +795,7 @@ export class ExecutionEngine { address = contractAddress; } - const { - storedArtifactPath: namedContractAtArtifactPath, - storedBuildInfoPath: namedContractAtBuildInfoPath, - } = await this._storeArtifactAndBuildInfoAgainstDeployment(future, { + await this._storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, deploymentLoader, }); @@ -819,8 +810,7 @@ export class ExecutionEngine { // history: [], contractName: future.contractName, contractAddress: address, - storedArtifactPath: namedContractAtArtifactPath, - storedBuildInfoPath: namedContractAtBuildInfoPath, + artifactFutureId: future.id, }; return state; } @@ -845,7 +835,7 @@ export class ExecutionEngine { address = contractAddress; } - const artifactContractAtPath = await deploymentLoader.storeArtifact( + await deploymentLoader.storeUserProvidedArtifact( future.id, future.artifact ); @@ -860,8 +850,7 @@ export class ExecutionEngine { // history: [], contractName: future.contractName, contractAddress: address, - storedArtifactPath: artifactContractAtPath, - storedBuildInfoPath: undefined, + artifactFutureId: future.id, }; return state; } @@ -914,17 +903,16 @@ export class ExecutionEngine { } ) { const artifact = await artifactResolver.loadArtifact(future.contractName); - const storedArtifactPath = await deploymentLoader.storeArtifact( + await deploymentLoader.storeNamedArtifact( future.id, + future.contractName, artifact ); const buildInfo = await artifactResolver.getBuildInfo(future.contractName); - const storedBuildInfoPath = - buildInfo === undefined - ? undefined - : await deploymentLoader.storeBuildInfo(buildInfo); - return { storedArtifactPath, storedBuildInfoPath }; + if (buildInfo !== undefined) { + await deploymentLoader.storeBuildInfo(buildInfo); + } } private _resolveArgs( @@ -960,41 +948,39 @@ export class ExecutionEngine { return future; } - private _resolveDeployedContractsFrom({ + private async _resolveDeployedContractsFrom({ executionStateMap, - }: ExecutionEngineState): Record< - string, - { - contractName: string; - contractAddress: string; - storedArtifactPath: string; - } - > { - const deployments = Object.values(executionStateMap) - .filter(isDeploymentExecutionState) + deploymentLoader, + }: ExecutionEngineState): Promise { + const contracts = Object.values(executionStateMap) + .filter( + ( + exState + ): exState is DeploymentExecutionState | ContractAtExecutionState => + isDeploymentExecutionState(exState) || + isContractAtExecutionState(exState) + ) .filter((des) => des.status === ExecutionStatus.SUCCESS) - .map((des) => [ + .map((des): [string, Omit] => [ des.id, { contractName: des.contractName, contractAddress: des.contractAddress!, - storedArtifactPath: des.storedArtifactPath, }, ]); - const contractAts = Object.values(executionStateMap) - .filter(isContractAtExecutionState) - .filter((des) => des.status === ExecutionStatus.SUCCESS) - .map((des) => [ - des.id, - { - contractName: des.contractName, - contractAddress: des.contractAddress!, - storedArtifactPath: des.storedArtifactPath, - }, - ]); + const deployedContracts: DeploymentResultContracts = {}; + + for (const [futureId, entry] of contracts) { + const artifact = await deploymentLoader.loadArtifact(futureId); + + deployedContracts[futureId] = { + ...entry, + artifact, + }; + } - return Object.fromEntries([...deployments, ...contractAts]); + return deployedContracts; } private _setupExecutionStrategyContext( diff --git a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts index 924cb09c79..22d65a059d 100644 --- a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -223,8 +223,7 @@ function initialiseExecutionStateFor( nonce: null, txHash: null, }, - storedArtifactPath: futureStart.storedArtifactPath, - storedBuildInfoPath: futureStart.storedBuildInfoPath, + artifactFutureId: futureStart.artifactFutureId, contractName: futureStart.contractName, value: BigInt(futureStart.value), constructorArgs: futureStart.constructorArgs, @@ -252,7 +251,7 @@ function initialiseExecutionStateFor( txHash: null, }, contractAddress: futureStart.contractAddress, - storedArtifactPath: futureStart.storedArtifactPath, + artifactFutureId: futureStart.artifactFutureId, args: futureStart.args, from: futureStart.from, functionName: futureStart.functionName, @@ -279,7 +278,7 @@ function initialiseExecutionStateFor( txHash: null, }, contractAddress: futureStart.contractAddress, - storedArtifactPath: futureStart.storedArtifactPath, + artifactFutureId: futureStart.artifactFutureId, args: futureStart.args, from: futureStart.from, functionName: futureStart.functionName, @@ -304,7 +303,7 @@ function initialiseExecutionStateFor( nonce: null, txHash: null, }, - storedArtifactPath: futureStart.storedArtifactPath, + artifactFutureId: futureStart.artifactFutureId, eventName: futureStart.eventName, argumentName: futureStart.argumentName, txToReadFrom: futureStart.txToReadFrom, @@ -356,7 +355,7 @@ function initialiseExecutionStateFor( nonce: null, txHash: null, }, - storedArtifactPath: futureStart.storedArtifactPath, + artifactFutureId: futureStart.artifactFutureId, contractAddress: futureStart.contractAddress, contractName: futureStart.contractName, }; diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 53c0b64a4d..9d5772101b 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -113,7 +113,7 @@ export class BasicExecutionStrategy contractName: deploymentExecutionState.contractName, value: deploymentExecutionState.value.toString(), args: deploymentExecutionState.constructorArgs, - storedArtifactPath: deploymentExecutionState.storedArtifactPath, + artifactFutureId: deploymentExecutionState.artifactFutureId, libraries: deploymentExecutionState.libraries, from: sender, }; @@ -156,7 +156,7 @@ export class BasicExecutionStrategy futureId: callExecutionState.id, executionId: 1, contractAddress: callExecutionState.contractAddress, - storedArtifactPath: callExecutionState.storedArtifactPath, + artifactFutureId: callExecutionState.artifactFutureId, value: callExecutionState.value.toString(), args: callExecutionState.args, functionName: callExecutionState.functionName, @@ -199,7 +199,7 @@ export class BasicExecutionStrategy futureId: staticCallExecutionState.id, executionId: 1, contractAddress: staticCallExecutionState.contractAddress, - storedArtifactPath: staticCallExecutionState.storedArtifactPath, + artifactFutureId: staticCallExecutionState.artifactFutureId, args: staticCallExecutionState.args, functionName: staticCallExecutionState.functionName, from: sender, @@ -233,7 +233,7 @@ export class BasicExecutionStrategy subtype: "read-event-arg", futureId: readEventArgExecutionState.id, executionId: 1, - storedArtifactPath: readEventArgExecutionState.storedArtifactPath, + artifactFutureId: readEventArgExecutionState.artifactFutureId, eventName: readEventArgExecutionState.eventName, argumentName: readEventArgExecutionState.argumentName, txToReadFrom: readEventArgExecutionState.txToReadFrom, @@ -308,7 +308,7 @@ export class BasicExecutionStrategy subtype: "contract-at", futureId: contractAtExecutionState.id, executionId: 1, - storedArtifactPath: contractAtExecutionState.storedArtifactPath, + artifactFutureId: contractAtExecutionState.artifactFutureId, contractAddress: contractAtExecutionState.contractAddress, contractName: contractAtExecutionState.contractName, }; diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index d6a5a7c9c8..a2207b414b 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -450,7 +450,7 @@ async function _convertRequestToDeployTransaction( state: ExecutionEngineState ): Promise { const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath + request.artifactFutureId ); const abi = artifact.abi; @@ -477,7 +477,7 @@ async function _convertRequestToCallFunctionTransaction( state: ExecutionEngineState ): Promise { const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath + request.artifactFutureId ); const contractAddress: string = request.contractAddress; @@ -518,7 +518,7 @@ async function _queryStaticCall( state: ExecutionEngineState ): Promise { const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath + request.artifactFutureId ); try { @@ -559,7 +559,7 @@ async function _readEventArg( state: ExecutionEngineState ): Promise { const artifact = await state.deploymentLoader.loadArtifact( - request.storedArtifactPath + request.artifactFutureId ); try { diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index b761758dd6..29da494041 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -125,8 +125,7 @@ export interface DeploymentExecutionState | FutureType.NAMED_LIBRARY_DEPLOYMENT | FutureType.ARTIFACT_LIBRARY_DEPLOYMENT > { - storedArtifactPath: string; // As stored in the deployment directory. - storedBuildInfoPath?: string; // As stored in the deployment directory. Optional as it's not always present + artifactFutureId: string; // As stored in the deployment directory. contractName: string; constructorArgs: ArgumentType[]; libraries: Record; // TODO: Do we need to store their future ids for the reconciliation process? @@ -138,7 +137,7 @@ export interface DeploymentExecutionState export interface CallExecutionState extends BaseExecutionState { - storedArtifactPath: string; // As stored in the deployment directory. + artifactFutureId: string; contractAddress: string; functionName: string; args: ArgumentType[]; @@ -149,7 +148,7 @@ export interface CallExecutionState export interface StaticCallExecutionState extends BaseExecutionState { - storedArtifactPath: string; // As stored in the deployment directory. + artifactFutureId: string; contractAddress: string; functionName: string; args: ArgumentType[]; @@ -161,14 +160,14 @@ export interface ContractAtExecutionState extends BaseExecutionState< FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT > { - storedArtifactPath: string; // As stored in the deployment directory. + artifactFutureId: string; contractName: string; contractAddress: string; } export interface ReadEventArgumentExecutionState extends BaseExecutionState { - storedArtifactPath: string; // As stored in the deployment directory. + artifactFutureId: string; eventName: string; argumentName: string; txToReadFrom: string; diff --git a/packages/core/src/new-api/types/artifact.ts b/packages/core/src/new-api/types/artifact.ts index 33f3b24df3..b5f6246526 100644 --- a/packages/core/src/new-api/types/artifact.ts +++ b/packages/core/src/new-api/types/artifact.ts @@ -21,7 +21,6 @@ export interface Artifact { export interface ArtifactResolver { loadArtifact(contractName: string): Promise; getBuildInfo(contractName: string): Promise; - resolvePath(contractName: string): Promise; } /** diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts index e28ed2fe67..492c0fec58 100644 --- a/packages/core/src/new-api/types/deployer.ts +++ b/packages/core/src/new-api/types/deployer.ts @@ -1,3 +1,4 @@ +import { Artifact } from "./artifact"; import { IgnitionModule, IgnitionModuleResult } from "./module"; /** @@ -57,11 +58,22 @@ export interface DeploymentResultTimeout { } /** - * The successfully deployed contract from the deployment run. + * A successfully deployed contract from the deployment run. + * + * @beta + */ +export interface DeploymentResultContract { + contractName: string; + contractAddress: string; + artifact: Artifact; +} + +/** + * The successfully deployed contracts from the deployment run. * * @beta */ export type DeploymentResultContracts = Record< string, - { contractName: string; contractAddress: string; storedArtifactPath: string } + DeploymentResultContract >; diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/types/deployment-loader.ts index 31a602b49f..a445560aab 100644 --- a/packages/core/src/new-api/types/deployment-loader.ts +++ b/packages/core/src/new-api/types/deployment-loader.ts @@ -8,9 +8,17 @@ import { Journal } from "./journal"; */ export interface DeploymentLoader { journal: Journal; - loadArtifact(storedArtifactPath: string): Promise; - storeArtifact(futureId: string, artifact: Artifact): Promise; - storeBuildInfo(buildInfo: BuildInfo): Promise; + loadArtifact(artifactFutureId: string): Promise; + storeUserProvidedArtifact( + futureId: string, + artifact: Artifact + ): Promise; + storeNamedArtifact( + futureId: string, + contractName: string, + artifact: Artifact + ): Promise; + storeBuildInfo(buildInfo: BuildInfo): Promise; recordDeployedAddress( futureId: string, contractAddress: string diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index c3dc6be898..1461c28019 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -77,7 +77,7 @@ export interface DeployContractInteractionMessage { executionId: number; args: ArgumentType[]; contractName: string; - storedArtifactPath: string; + artifactFutureId: string; value: string; libraries: { [key: string]: string }; from: string; @@ -97,7 +97,7 @@ export interface CallFunctionInteractionMessage { functionName: string; value: string; contractAddress: string; - storedArtifactPath: string; + artifactFutureId: string; from: string; } @@ -114,7 +114,7 @@ export interface StaticCallInteractionMessage { args: ArgumentType[]; functionName: string; contractAddress: string; - storedArtifactPath: string; + artifactFutureId: string; from: string; } @@ -128,7 +128,7 @@ export interface ReadEventArgumentInteractionMessage { subtype: "read-event-arg"; futureId: string; executionId: number; - storedArtifactPath: string; + artifactFutureId: string; eventName: string; argumentName: string; txToReadFrom: string; @@ -164,7 +164,7 @@ export interface ContractAtInteractionMessage { executionId: number; contractName: string; contractAddress: string; - storedArtifactPath: string; + artifactFutureId: string; } // #endregion @@ -378,8 +378,7 @@ export interface DeployContractStartMessage { | FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; strategy: string; dependencies: string[]; - storedArtifactPath: string; - storedBuildInfoPath: string | undefined; + artifactFutureId: string; contractName: string; constructorArgs: ArgumentType[]; libraries: { [key: string]: string }; @@ -403,7 +402,7 @@ export interface CallFunctionStartMessage { value: string; contractAddress: string; from: string | undefined; - storedArtifactPath: string; + artifactFutureId: string; } /** @@ -420,7 +419,7 @@ export interface StaticCallStartMessage { args: ArgumentType[]; functionName: string; contractAddress: string; - storedArtifactPath: string; + artifactFutureId: string; from: string; } @@ -435,7 +434,7 @@ export interface ReadEventArgumentStartMessage { futureType: FutureType.READ_EVENT_ARGUMENT; strategy: string; dependencies: string[]; - storedArtifactPath: string; + artifactFutureId: string; eventName: string; argumentName: string; txToReadFrom: string; @@ -471,8 +470,7 @@ export interface ContractAtStartMessage { futureType: FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT; strategy: string; dependencies: string[]; - storedArtifactPath: string; - storedBuildInfoPath: string | undefined; + artifactFutureId: string; contractName: string; contractAddress: string; } diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index 3ef7f4e148..15aca219ea 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -25,8 +25,7 @@ describe("batcher", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index f7b952164a..39a237a0aa 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -3,10 +3,6 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; import { defineModule } from "../../../src/new-api/define-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; -import { - DeployContractStartMessage, - JournalableMessage, -} from "../../../src/new-api/types/journal"; import { accumulateMessages, assertDeploymentFailure, @@ -97,7 +93,7 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", + artifact: contractWithThreeArgConstructorArtifact, }, }); @@ -111,8 +107,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [ @@ -135,7 +130,7 @@ describe("execution engine", () => { { nested: 2000 }, ], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -176,7 +171,7 @@ describe("execution engine", () => { }); it("should execute an artifact contract deploy", async () => { - const fakeArtifact: Artifact = { + const contract1Artifact: Artifact = { abi: [], contractName: "Contract1", bytecode: "", @@ -187,7 +182,7 @@ describe("execution engine", () => { const account2 = m.getAccount(2); const contract1 = m.contractFromArtifact( "Contract1", - fakeArtifact, + contract1Artifact, [], { from: account2, @@ -222,7 +217,6 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Contract1": { contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", contractAddress: exampleAddress, }, }); @@ -237,16 +231,13 @@ describe("execution engine", () => { futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], libraries: {}, from: accounts[2], - } as Omit< - DeployContractStartMessage, - "storedBuildInfoPath" - > as any as JournalableMessage, + }, { type: "onchain-action", subtype: "deploy-contract", @@ -257,7 +248,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), from: accounts[2], libraries: {}, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-transaction-request", @@ -341,8 +332,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -359,7 +349,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), from: accounts[1], libraries: {}, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-transaction-request", @@ -417,7 +407,6 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Library1": { contractName: "Library1", - storedArtifactPath: "Module1:Library1.json", contractAddress: exampleAddress, }, }); @@ -432,8 +421,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Library1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Library1", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], @@ -448,7 +436,7 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Library1.json", + artifactFutureId: "Module1:Library1", libraries: {}, from: accounts[2], }, @@ -489,7 +477,7 @@ describe("execution engine", () => { }); it("should execute an artifact library deploy", async () => { - const fakeArtifact: Artifact = { + const contract1Artifact: Artifact = { abi: [], contractName: "Contract1", bytecode: "", @@ -498,7 +486,7 @@ describe("execution engine", () => { const moduleDefinition = defineModule("Module1", (m) => { const account2 = m.getAccount(2); - const library1 = m.libraryFromArtifact("Library1", fakeArtifact, { + const library1 = m.libraryFromArtifact("Library1", contract1Artifact, { from: account2, }); @@ -530,8 +518,8 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Library1": { contractName: "Library1", - storedArtifactPath: "Module1:Library1.json", contractAddress: exampleAddress, + artifact: contract1Artifact, }, }); @@ -545,16 +533,13 @@ describe("execution engine", () => { futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Library1.json", + artifactFutureId: "Module1:Library1", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], libraries: {}, from: accounts[2], - } as Omit< - DeployContractStartMessage, - "storedBuildInfoPath" - > as any as JournalableMessage, + }, { type: "onchain-action", subtype: "deploy-contract", @@ -565,7 +550,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), from: accounts[2], libraries: {}, - storedArtifactPath: "Module1:Library1.json", + artifactFutureId: "Module1:Library1", }, { type: "onchain-transaction-request", @@ -649,8 +634,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Library1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Library1", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], @@ -667,7 +651,7 @@ describe("execution engine", () => { value: BigInt(0).toString(), from: accounts[1], libraries: {}, - storedArtifactPath: "Module1:Library1.json", + artifactFutureId: "Module1:Library1", }, { type: "onchain-transaction-request", @@ -734,7 +718,6 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", }, }); @@ -748,8 +731,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -764,7 +746,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -917,8 +899,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -933,7 +914,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1059,7 +1040,6 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", }, }); @@ -1073,8 +1053,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1089,7 +1068,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1136,7 +1115,7 @@ describe("execution engine", () => { contractAddress: exampleAddress, from: accounts[1], functionName: "configure", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", value: "0", }, { @@ -1147,7 +1126,7 @@ describe("execution engine", () => { executionId: 1, functionName: "configure", futureId: "Module1:Contract1#configure", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", from: accounts[1], value: "0", }, @@ -1245,8 +1224,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1261,7 +1239,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1308,7 +1286,7 @@ describe("execution engine", () => { contractAddress: exampleAddress, from: accounts[1], functionName: "configure", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", value: "0", }, { @@ -1319,7 +1297,7 @@ describe("execution engine", () => { executionId: 1, functionName: "configure", futureId: "Module1:Contract1#configure", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", from: accounts[1], value: "0", }, @@ -1389,7 +1367,6 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", }, }); @@ -1403,8 +1380,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1419,7 +1395,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1466,7 +1442,7 @@ describe("execution engine", () => { contractAddress: exampleAddress, from: accounts[1], functionName: "test", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-action", @@ -1476,7 +1452,7 @@ describe("execution engine", () => { executionId: 1, functionName: "test", futureId: "Module1:Contract1#test", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", from: accounts[1], }, { @@ -1547,8 +1523,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1563,7 +1538,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1610,7 +1585,7 @@ describe("execution engine", () => { contractAddress: exampleAddress, from: accounts[1], functionName: "test", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-action", @@ -1620,7 +1595,7 @@ describe("execution engine", () => { executionId: 1, functionName: "test", futureId: "Module1:Contract1#test", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", from: accounts[1], }, { @@ -1656,7 +1631,6 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", }, }); @@ -1672,8 +1646,7 @@ describe("execution engine", () => { contractAddress: exampleAddress, contractName: "Contract1", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-action", @@ -1682,7 +1655,7 @@ describe("execution engine", () => { executionId: 1, contractAddress: exampleAddress, contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-result", @@ -1753,7 +1726,6 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", }, }); @@ -1767,8 +1739,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1783,7 +1754,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1832,7 +1803,7 @@ describe("execution engine", () => { eventIndex: 0, emitterAddress: exampleAddress, txToReadFrom: txId, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-action", @@ -1844,7 +1815,7 @@ describe("execution engine", () => { eventIndex: 0, emitterAddress: exampleAddress, txToReadFrom: txId, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-result", @@ -1921,8 +1892,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [], @@ -1937,7 +1907,7 @@ describe("execution engine", () => { contractName: "Contract1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: accounts[1], }, @@ -1986,7 +1956,7 @@ describe("execution engine", () => { eventIndex: 0, emitterAddress: exampleAddress, txToReadFrom: txId, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "onchain-action", @@ -1998,7 +1968,7 @@ describe("execution engine", () => { eventIndex: 0, emitterAddress: exampleAddress, txToReadFrom: txId, - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", }, { type: "execution-failure", @@ -2059,12 +2029,10 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Contract1": { contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", contractAddress: exampleAddress, }, "Module1:Library1": { contractName: "Library1", - storedArtifactPath: "Module1:Library1.json", contractAddress: differentAddress, }, }); @@ -2079,8 +2047,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], - storedArtifactPath: "Module1:Library1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Library1", contractName: "Library1", value: BigInt(0).toString(), constructorArgs: [], @@ -2095,7 +2062,7 @@ describe("execution engine", () => { contractName: "Library1", args: [], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Library1.json", + artifactFutureId: "Module1:Library1", libraries: {}, from: accounts[1], }, @@ -2138,8 +2105,7 @@ describe("execution engine", () => { futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: ["Module1:Library1"], - storedArtifactPath: "Module1:Contract1.json", - storedBuildInfoPath: "build-info-12345.json", + artifactFutureId: "Module1:Contract1", contractName: "Contract1", value: BigInt(0).toString(), constructorArgs: [ @@ -2164,7 +2130,7 @@ describe("execution engine", () => { }, ], value: BigInt(0).toString(), - storedArtifactPath: "Module1:Contract1.json", + artifactFutureId: "Module1:Contract1", libraries: {}, from: exampleAccounts[1], }, @@ -2317,32 +2283,26 @@ describe("execution engine", () => { assertDeploymentSuccess(result, { "Module1:Contract1": { contractName: "Contract1", - storedArtifactPath: "Module1:Contract1.json", contractAddress: addr1, }, "Module1:ContractA": { contractName: "ContractA", - storedArtifactPath: "Module1:ContractA.json", contractAddress: addr2, }, "Module1:Contract2": { contractName: "Contract2", - storedArtifactPath: "Module1:Contract2.json", contractAddress: addr3, }, "Module1:ContractB": { contractName: "ContractB", - storedArtifactPath: "Module1:ContractB.json", contractAddress: addr4, }, "Module1:Contract3": { contractName: "Contract3", - storedArtifactPath: "Module1:Contract3.json", contractAddress: addr5, }, "Module1:ContractC": { contractName: "ContractC", - storedArtifactPath: "Module1:ContractC.json", contractAddress: addr6, }, }); diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index 045963b1bc..b7a310a74f 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -108,7 +108,7 @@ describe("execution engine", () => { "Module1:Contract1": { contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "Module1:Contract1.json", + artifact: contractWithOneArgConstructorArtifact, }, }); }); diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index b27ebd7a3a..35b98d0f68 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,12 +1,7 @@ import { assert } from "chai"; import ethers from "ethers"; -import { - ArgumentType, - Artifact, - ArtifactResolver, - DeploymentResultContracts, -} from "../../src"; +import { ArgumentType, Artifact, ArtifactResolver } from "../../src"; import { Deployer } from "../../src/new-api/internal/deployer"; import { AccountsState } from "../../src/new-api/internal/execution/execution-engine"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; @@ -15,7 +10,11 @@ import { OnchainState, OnchainStatuses, } from "../../src/new-api/internal/types/execution-state"; -import { DeploymentResult } from "../../src/new-api/types/deployer"; +import { + DeploymentResult, + DeploymentResultContract, + DeploymentResultContracts, +} from "../../src/new-api/types/deployer"; import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; import { Journal, JournalableMessage } from "../../src/new-api/types/journal"; @@ -43,16 +42,16 @@ export function assertInstanceOf( assert.instanceOf(obj, klass, `Not a valid instace of ${klass.name}`); } +export const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, +}; + export function setupMockArtifactResolver(artifacts?: { [key: string]: Artifact; }): ArtifactResolver { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - return { loadArtifact: async (contractName: string) => { if (artifacts === undefined) { @@ -75,9 +74,6 @@ export function setupMockArtifactResolver(artifacts?: { getBuildInfo: async (_contractName: string) => { return { id: 12345 } as any; }, - resolvePath: async (contractName: string) => { - return `${contractName}.json`; - }, }; } @@ -87,21 +83,18 @@ export function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { return { journal, recordDeployedAddress: async () => {}, - storeArtifact: async (futureId, artifact) => { - const storedArtifactPath = `${futureId}.json`; - - storedArtifacts[storedArtifactPath] = artifact; - - return storedArtifactPath; + storeUserProvidedArtifact: async (artifactFutureId, artifact) => { + storedArtifacts[artifactFutureId] = artifact; }, - storeBuildInfo: async (buildInfo) => { - return `build-info-${buildInfo.id}.json`; + storeNamedArtifact: async (artifactFutureId, _contractName, artifact) => { + storedArtifacts[artifactFutureId] = artifact; }, - loadArtifact: async (storedArtifactPath) => { - const artifact = storedArtifacts[storedArtifactPath]; + storeBuildInfo: async () => {}, + loadArtifact: async (artifactFutureId: string) => { + const artifact = storedArtifacts[artifactFutureId]; if (artifact === undefined) { - throw new Error(`Artifact not stored for ${storedArtifactPath}`); + throw new Error(`Artifact not stored for ${artifactFutureId}`); } return artifact; @@ -192,7 +185,10 @@ export function assertDeploymentFailure( export function assertDeploymentSuccess( result: DeploymentResult, - expectedContracts: DeploymentResultContracts + expectedContracts: Record< + string, + Omit & { artifact?: Artifact } + > ) { assert.isDefined(result); @@ -200,7 +196,17 @@ export function assertDeploymentSuccess( assert.fail("result expected to be success"); } - assert.deepStrictEqual(result.contracts, expectedContracts); + const modifiedExpected: DeploymentResultContracts = Object.fromEntries( + Object.entries(expectedContracts).map(([futureId, details]) => [ + futureId, + { + artifact: { ...fakeArtifact, contractName: details.contractName }, + ...details, + }, + ]) + ); + + assert.deepStrictEqual(result.contracts, modifiedExpected); } export function setupMockChainDispatcher({ diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index a9deff7b17..ed4a233f17 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -34,7 +34,7 @@ describe("Reconciliation - artifact contract at", () => { onchain: initOnchainState, contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", }; const exampleDeploymentState: DeploymentExecutionState = { @@ -45,8 +45,7 @@ describe("Reconciliation - artifact contract at", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], @@ -63,7 +62,7 @@ describe("Reconciliation - artifact contract at", () => { history: [], onchain: initOnchainState, contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], @@ -92,7 +91,7 @@ describe("Reconciliation - artifact contract at", () => { futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", }, }; @@ -130,7 +129,7 @@ describe("Reconciliation - artifact contract at", () => { status: ExecutionStatus.STARTED, contractName: "Another", contractAddress: differentAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", }, }; @@ -158,7 +157,7 @@ describe("Reconciliation - artifact contract at", () => { status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", contractAddress: differentAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", }, }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index 7ebf950ce3..e9e30874e4 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -33,8 +33,7 @@ describe("Reconciliation - artifact contract", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 4534bce7d5..d1cb363f0b 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -33,8 +33,7 @@ describe("Reconciliation - artifact library", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index 137fb30e35..75ffea7129 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -26,7 +26,7 @@ describe("Reconciliation - named contract at", () => { onchain: initOnchainState, contractName: "Contract1", contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", }; const exampleDeploymentState: DeploymentExecutionState = { @@ -37,8 +37,7 @@ describe("Reconciliation - named contract at", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], @@ -55,7 +54,7 @@ describe("Reconciliation - named contract at", () => { history: [], onchain: initOnchainState, contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index 2940197a73..57a62fb95d 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -27,8 +27,7 @@ describe("Reconciliation - named contract call", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], @@ -46,7 +45,7 @@ describe("Reconciliation - named contract call", () => { history: [], onchain: initOnchainState, contractAddress: differentAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", functionName: "function", args: [], value: BigInt("0"), diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 79d67fc0d9..4d7090d6f4 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -25,8 +25,7 @@ describe("Reconciliation - named contract", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 163b5fcb93..4da6ece0cd 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -25,8 +25,7 @@ describe("Reconciliation - named library", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 9fd7df01a2..b38bd009b6 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -27,8 +27,7 @@ describe("Reconciliation - named static call", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], @@ -45,7 +44,7 @@ describe("Reconciliation - named static call", () => { history: [], onchain: initOnchainState, contractAddress: exampleAddress, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", functionName: "function", args: [], from: exampleAccounts[0], diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 30716158e0..d958253154 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -23,7 +23,7 @@ describe("Reconciliation - read event argument", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", + artifactFutureId: "./artifact.json", eventName: "event1", argumentName: "argument1", eventIndex: 0, @@ -39,8 +39,7 @@ describe("Reconciliation - read event argument", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index cabcb121bb..8e23d447e6 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -24,8 +24,7 @@ describe("Reconciliation", () => { dependencies: new Set(), history: [], onchain: initOnchainState, - storedArtifactPath: "./artifact.json", - storedBuildInfoPath: "./build-info.json", + artifactFutureId: "./artifact.json", contractName: "Contract1", value: BigInt("0"), constructorArgs: [], @@ -135,7 +134,7 @@ describe("Reconciliation", () => { executionId: 1, args: [], contractName: "Contract1", - storedArtifactPath: "./Module1:Contract1.json", + artifactFutureId: "./Module1:Contract1.json", libraries: {}, value: BigInt(0).toString(), // history indicates from was accounts[3] @@ -192,7 +191,7 @@ describe("Reconciliation", () => { executionId: 1, args: [], contractName: "Contract1", - storedArtifactPath: "./Module1:Contract1.json", + artifactFutureId: "./Module1:Contract1.json", libraries: {}, value: BigInt(0).toString(), // history indicates from was accounts[3] diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts index 9fa1ab127e..f57b8e671d 100644 --- a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts +++ b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts.ts @@ -9,7 +9,7 @@ export class HardhatArtifactResolver implements ArtifactResolver { public async getBuildInfo( contractName: string ): Promise { - const artifactPath = await this.resolvePath(contractName); + const artifactPath = await this._resolvePath(contractName); if (artifactPath === undefined) { throw new Error(`Artifact path not found for ${contractName}`); @@ -28,7 +28,9 @@ export class HardhatArtifactResolver implements ArtifactResolver { return JSON.parse(buildInfoJson.toString()); } - public async resolvePath(contractName: string): Promise { + private async _resolvePath( + contractName: string + ): Promise { const artifactPaths = await this._hre.artifacts.getArtifactPaths(); const artifactPath = artifactPaths.find( diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index f9cd3fb5c1..a1559c7a5f 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -9,9 +9,7 @@ import { ModuleParameters, } from "@ignored/ignition-core"; import { Contract } from "ethers"; -import fs from "fs-extra"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -import path from "path"; import { buildAdaptersFrom } from "./buildAdaptersFrom"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; @@ -85,11 +83,9 @@ export class IgnitionHelper { ); } - const { storedArtifactPath, contractAddress } = deployedContract; + const { contractAddress, artifact } = deployedContract; - const abi: any[] = await this._resolveAbiFromArtifactPath( - storedArtifactPath - ); + const abi: any[] = artifact.abi; resolvedOutput[key] = await this._hre.ethers.getContractAt( abi, @@ -99,20 +95,4 @@ export class IgnitionHelper { return resolvedOutput; } - - private async _resolveAbiFromArtifactPath( - storedArtifactPath: any - ): Promise { - const artifact = JSON.parse( - ( - await fs.readFile( - this._deploymentDir !== undefined - ? path.join(this._deploymentDir, storedArtifactPath) - : storedArtifactPath - ) - ).toString() - ); - - return artifact.abi; - } } diff --git a/packages/hardhat-plugin/test/execution/deploy-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-from-artifact.ts new file mode 100644 index 0000000000..2ce3cac089 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/deploy-from-artifact.ts @@ -0,0 +1,35 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useEphemeralIgnitionProject, +} from "../use-ignition-project"; + +/** + * Deploy a contract from an artifact. + */ +describe("execution - deploy from artifact", function () { + // TODO: rename back to minimal api once execution switched over + useEphemeralIgnitionProject("minimal-new-api"); + + it("should deploy a contract that is callable", async function () { + const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = defineModule("FooModule", (m) => { + const foo = m.contractFromArtifact("Foo", fooArtifact); + + return { foo }; + }); + + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); + + assert.equal(await result.foo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts index 27333c6e23..99a50a7c3c 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts @@ -2,9 +2,10 @@ import { defineModule } from "@ignored/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; - -import { sleep } from "./helpers"; +import { + TestChainHelper, + useEphemeralIgnitionProject, +} from "../use-ignition-project"; /** * This is the simplest contract deploy case. @@ -12,36 +13,23 @@ import { sleep } from "./helpers"; * Deploy a single contract with non-problematic network */ describe("execution - minimal contract deploy", function () { - this.timeout(60000); - // TODO: rename back to minimal api once execution switched over useEphemeralIgnitionProject("minimal-new-api"); it("should deploy a contract that is callable", async function () { - await this.hre.run("compile", { quiet: true }); - - await this.hre.network.provider.request({ - method: "evm_setAutomine", - params: [false], - }); - const moduleDefinition = defineModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; }); - const deployPromise = this.hre.ignition2.deploy(moduleDefinition, { - parameters: {}, - }); - - await sleep(100); - await this.hre.network.provider.send("evm_mine"); - - const result = await deployPromise; - - const x = await result.foo.x(); + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); - assert.equal(x, Number(1)); + assert.equal(await result.foo.x(), Number(1)); }); }); From 7eb14944e75acaed8d733220e5b1c6b3680d30a6 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 4 Jul 2023 22:08:10 -0400 Subject: [PATCH 0560/1302] add module param validations and update existing tests --- .../core/src/new-api/internal/deployer.ts | 6 +- .../futures/validateArtifactContractAt.ts | 25 +++++-- .../validateArtifactContractDeployment.ts | 25 ++++++- .../validateArtifactLibraryDeployment.ts | 8 ++- .../futures/validateNamedContractAt.ts | 21 +++++- .../futures/validateNamedContractCall.ts | 27 +++++++- .../validateNamedContractDeployment.ts | 29 ++++++++- .../futures/validateNamedLibraryDeployment.ts | 8 ++- .../futures/validateNamedStaticCall.ts | 24 ++++++- .../futures/validateReadEventArgument.ts | 8 ++- .../validation/futures/validateSendData.ts | 22 +++++-- .../new-api/internal/validation/validate.ts | 65 +++++++++++++++---- packages/core/test/new-api/call.ts | 21 ++++-- packages/core/test/new-api/contract.ts | 6 +- packages/core/test/new-api/contractAt.ts | 3 +- .../core/test/new-api/contractFromArtifact.ts | 3 +- packages/core/test/new-api/library.ts | 3 +- .../core/test/new-api/readEventArgument.ts | 9 ++- packages/core/test/new-api/staticCall.ts | 11 ++-- 19 files changed, 267 insertions(+), 57 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 74803806ea..8e3547754d 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -90,7 +90,11 @@ export class Deployer { ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); - await validate(module, this._artifactResolver); + await validate( + module, + this._artifactResolver, + deploymentParameters[module.id] + ); const previousStateMap = await this._loadExecutionStateFrom( this._deploymentLoader.journal diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts index a70282c69d..5f75dfc2fd 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts @@ -1,9 +1,26 @@ +import { IgnitionValidationError } from "../../../../errors"; +import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactContractAtFuture } from "../../../types/module"; +import { + ArtifactContractAtFuture, + ModuleParameters, +} from "../../../types/module"; export async function validateArtifactContractAt( - _future: ArtifactContractAtFuture, - _artifactLoader: ArtifactResolver + future: ArtifactContractAtFuture, + _artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { - return; /* noop - nothing to validate here */ + if (isModuleParameterRuntimeValue(future.address)) { + if ( + moduleParameters[future.address.name] === undefined && + future.address.defaultValue === undefined + ) { + throw new IgnitionValidationError( + `Module parameter '${future.address.name}' requires a value but was given none` + ); + } + } + + return; } diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index 5110321312..4a046b0d2b 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -1,13 +1,34 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; +import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { + ArtifactContractDeploymentFuture, + ModuleParameters, +} from "../../../types/module"; export async function validateArtifactContractDeployment( future: ArtifactContractDeploymentFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { + const moduleParams = future.constructorArgs.filter( + isModuleParameterRuntimeValue + ); + + const missingParams = moduleParams.filter( + (param) => + moduleParameters[param.name] === undefined && + param.defaultValue === undefined + ); + + if (missingParams.length > 0) { + throw new IgnitionValidationError( + `Module parameter '${missingParams[0].name}' requires a value but was given none` + ); + } + const artifact = await artifactLoader.loadArtifact(future.contractName); const argsLength = future.constructorArgs.length; diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts index 1916480bd0..ac538cc096 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts @@ -1,9 +1,13 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { + ArtifactLibraryDeploymentFuture, + ModuleParameters, +} from "../../../types/module"; export async function validateArtifactLibraryDeployment( _future: ArtifactLibraryDeploymentFuture, - _artifactLoader: ArtifactResolver + _artifactLoader: ArtifactResolver, + _moduleParameters: ModuleParameters ) { return; /* noop - nothing to validate here */ } diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts index 6c6c89f1fd..736f988e40 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -1,12 +1,27 @@ import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractAtFuture } from "../../../types/module"; +import { ModuleParameters, NamedContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( future: NamedContractAtFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { + if (isModuleParameterRuntimeValue(future.address)) { + if ( + moduleParameters[future.address.name] === undefined && + future.address.defaultValue === undefined + ) { + throw new IgnitionValidationError( + `Module parameter '${future.address.name}' requires a value but was given none` + ); + } + } + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index 8b6775b2f1..ab62cb90a0 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -1,14 +1,35 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractCallFuture } from "../../../types/module"; +import { + ModuleParameters, + NamedContractCallFuture, +} from "../../../types/module"; export async function validateNamedContractCall( future: NamedContractCallFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { + const moduleParams = future.args.filter(isModuleParameterRuntimeValue); + + const missingParams = moduleParams.filter( + (param) => + moduleParameters[param.name] === undefined && + param.defaultValue === undefined + ); + + if (missingParams.length > 0) { + throw new IgnitionValidationError( + `Module parameter '${missingParams[0].name}' requires a value but was given none` + ); + } + const artifact = "artifact" in future.contract ? future.contract.artifact diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index bf5bbfe2ce..0dbe79725e 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -1,14 +1,37 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractDeploymentFuture } from "../../../types/module"; +import { + ModuleParameters, + NamedContractDeploymentFuture, +} from "../../../types/module"; export async function validateNamedContractDeployment( future: NamedContractDeploymentFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { + const moduleParams = future.constructorArgs.filter( + isModuleParameterRuntimeValue + ); + + const missingParams = moduleParams.filter( + (param) => + moduleParameters[param.name] === undefined && + param.defaultValue === undefined + ); + + if (missingParams.length > 0) { + throw new IgnitionValidationError( + `Module parameter '${missingParams[0].name}' requires a value but was given none` + ); + } + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts index b92558cb38..cf44938d3e 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -1,11 +1,15 @@ import { IgnitionValidationError } from "../../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { + ModuleParameters, + NamedLibraryDeploymentFuture, +} from "../../../types/module"; export async function validateNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + _moduleParameters: ModuleParameters ) { const artifact = await artifactLoader.loadArtifact(future.contractName); diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts index acb12e102c..a17dfcbaa4 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -1,14 +1,32 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedStaticCallFuture } from "../../../types/module"; +import { ModuleParameters, NamedStaticCallFuture } from "../../../types/module"; export async function validateNamedStaticCall( future: NamedStaticCallFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { + const moduleParams = future.args.filter(isModuleParameterRuntimeValue); + + const missingParams = moduleParams.filter( + (param) => + moduleParameters[param.name] === undefined && + param.defaultValue === undefined + ); + + if (missingParams.length > 0) { + throw new IgnitionValidationError( + `Module parameter '${missingParams[0].name}' requires a value but was given none` + ); + } + const artifact = "artifact" in future.contract ? future.contract.artifact diff --git a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts index 880cc92849..b3d675f225 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts @@ -3,11 +3,15 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ReadEventArgumentFuture } from "../../../types/module"; +import { + ModuleParameters, + ReadEventArgumentFuture, +} from "../../../types/module"; export async function validateReadEventArgument( future: ReadEventArgumentFuture, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + _moduleParameters: ModuleParameters ) { const artifact = "artifact" in future.emitter diff --git a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts index 49157815d8..005b2b93de 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts @@ -1,9 +1,23 @@ +import { IgnitionValidationError } from "../../../../errors"; +import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { SendDataFuture } from "../../../types/module"; +import { ModuleParameters, SendDataFuture } from "../../../types/module"; export async function validateSendData( - _future: SendDataFuture, - _artifactLoader: ArtifactResolver + future: SendDataFuture, + _artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ) { - return; /* noop - nothing to validate here */ + if (isModuleParameterRuntimeValue(future.to)) { + if ( + moduleParameters[future.to.name] === undefined && + future.to.defaultValue === undefined + ) { + throw new IgnitionValidationError( + `Module parameter '${future.to.name}' requires a value but was given none` + ); + } + } + + return; } diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index 41fd20076e..79d1ec31b3 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -1,5 +1,9 @@ import { ArtifactResolver } from "../../types/artifact"; -import { FutureType, IgnitionModule } from "../../types/module"; +import { + FutureType, + IgnitionModule, + ModuleParameters, +} from "../../types/module"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { validateArtifactContractAt } from "./futures/validateArtifactContractAt"; @@ -15,32 +19,69 @@ import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, - artifactLoader: ArtifactResolver + artifactLoader: ArtifactResolver, + moduleParameters: ModuleParameters ): Promise { const futures = getFuturesFromModule(module); for (const future of futures) { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - return validateArtifactContractDeployment(future, artifactLoader); + return validateArtifactContractDeployment( + future, + artifactLoader, + moduleParameters + ); case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - return validateArtifactLibraryDeployment(future, artifactLoader); + return validateArtifactLibraryDeployment( + future, + artifactLoader, + moduleParameters + ); case FutureType.ARTIFACT_CONTRACT_AT: - return validateArtifactContractAt(future, artifactLoader); + return validateArtifactContractAt( + future, + artifactLoader, + moduleParameters + ); case FutureType.NAMED_CONTRACT_DEPLOYMENT: - return validateNamedContractDeployment(future, artifactLoader); + return validateNamedContractDeployment( + future, + artifactLoader, + moduleParameters + ); case FutureType.NAMED_LIBRARY_DEPLOYMENT: - return validateNamedLibraryDeployment(future, artifactLoader); + return validateNamedLibraryDeployment( + future, + artifactLoader, + moduleParameters + ); case FutureType.NAMED_CONTRACT_AT: - return validateNamedContractAt(future, artifactLoader); + return validateNamedContractAt( + future, + artifactLoader, + moduleParameters + ); case FutureType.NAMED_CONTRACT_CALL: - return validateNamedContractCall(future, artifactLoader); + return validateNamedContractCall( + future, + artifactLoader, + moduleParameters + ); case FutureType.NAMED_STATIC_CALL: - return validateNamedStaticCall(future, artifactLoader); + return validateNamedStaticCall( + future, + artifactLoader, + moduleParameters + ); case FutureType.READ_EVENT_ARGUMENT: - return validateReadEventArgument(future, artifactLoader); + return validateReadEventArgument( + future, + artifactLoader, + moduleParameters + ); case FutureType.SEND_DATA: - return validateSendData(future, artifactLoader); + return validateSendData(future, artifactLoader, moduleParameters); } } } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 5ebc00d179..dc9c325d1e 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -558,7 +558,8 @@ describe("call", () => { await assert.isRejected( validateNamedContractCall( future as any, - setupMockArtifactResolver({ Another: {} as any }) + setupMockArtifactResolver({ Another: {} as any }), + {} ), /Artifact for contract 'Another' is invalid/ ); @@ -586,7 +587,11 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {} + ), /Contract 'Another' doesn't have a function test/ ); }); @@ -627,7 +632,11 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {} + ), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -686,7 +695,11 @@ describe("call", () => { ); await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), + validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {} + ), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 4d6439fab8..f1bf516907 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -556,7 +556,8 @@ describe("contract", () => { future as any, setupMockArtifactResolver({ Another: {} as any, - }) + }), + {} ), /Artifact for contract 'Another' is invalid/ ); @@ -588,7 +589,8 @@ describe("contract", () => { await assert.isRejected( validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }) + setupMockArtifactResolver({ Test: fakeArtifact }), + {} ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index d8cccf8424..190dc51ab0 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -272,7 +272,8 @@ describe("contractAt", () => { future as any, setupMockArtifactResolver({ Another: fakeArtifact, - }) + }), + {} ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 2529e7bcec..fcb534d2f0 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -629,7 +629,8 @@ describe("contractFromArtifact", () => { await assert.isRejected( validateArtifactContractDeployment( future as any, - setupMockArtifactResolver() + setupMockArtifactResolver(), + {} ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 3278770f01..c6f61eacd1 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -311,7 +311,8 @@ describe("library", () => { await assert.isRejected( validateNamedLibraryDeployment( future as any, - setupMockArtifactResolver({ Another: {} as any }) + setupMockArtifactResolver({ Another: {} as any }), + {} ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 9222625227..4e4841ac18 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -235,7 +235,8 @@ describe("Read event argument", () => { await assert.isRejected( validateReadEventArgument( future as any, - setupMockArtifactResolver({ Another: {} as any }) + setupMockArtifactResolver({ Another: {} as any }), + {} ), /Artifact for contract 'Another' is invalid/ ); @@ -263,7 +264,11 @@ describe("Read event argument", () => { ); await assert.isRejected( - validateReadEventArgument(future as any, setupMockArtifactResolver()), + validateReadEventArgument( + future as any, + setupMockArtifactResolver(), + {} + ), /Contract 'Another' doesn't have an event test/ ); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 7c72ac4184..f877774f9f 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -544,7 +544,8 @@ describe("static call", () => { await assert.isRejected( validateNamedStaticCall( future as any, - setupMockArtifactResolver({ Another: {} as any }) + setupMockArtifactResolver({ Another: {} as any }), + {} ), /Artifact for contract 'Another' is invalid/ ); @@ -572,7 +573,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), + validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), /Contract 'Another' doesn't have a function test/ ); }); @@ -613,7 +614,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), + validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -672,7 +673,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), + validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); @@ -713,7 +714,7 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), + validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ ); }); From 985d35d4f6c80848ce4d88fb1ef4aae01fa970b5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 5 Jul 2023 00:04:46 -0400 Subject: [PATCH 0561/1302] add tests for new validations --- packages/core/test/new-api/call.ts | 79 ++++++++++++++++ packages/core/test/new-api/contract.ts | 91 +++++++++++++++++++ packages/core/test/new-api/contractAt.ts | 83 ++++++++++++++--- .../test/new-api/contractAtFromArtifact.ts | 67 +++++++++++++- .../core/test/new-api/contractFromArtifact.ts | 78 +++++++++++++++- packages/core/test/new-api/send.ts | 53 ++++++++++- packages/core/test/new-api/staticCall.ts | 77 ++++++++++++++++ 7 files changed, 512 insertions(+), 16 deletions(-) diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index dc9c325d1e..532b5f57ff 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -565,6 +565,85 @@ describe("call", () => { ); }); + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [p]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [p]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ) + ); + }); + it("should not validate a non-existant function", async () => { const fakeArtifact: Artifact = { abi: [], diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index f1bf516907..2049893d60 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -595,5 +595,96 @@ describe("contract", () => { /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); }); + + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", [p]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", [p]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ) + ); + }); }); }); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 190dc51ab0..56ae039550 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; +import { Artifact, FutureType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -9,7 +10,12 @@ import { validateNamedContractAt } from "../../src/new-api/internal/validation/f import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contractAt", () => { - const fakeArtifact: any = {}; + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifactDefinition = defineModule( @@ -179,16 +185,8 @@ describe("contractAt", () => { it("should throw if the same contract is deployed twice without differentiating ids", () => { const moduleDefinition = defineModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0x123", - fakeArtifact - ); - const sameContract2 = m.contractAt( - "SameContract", - "0x123", - fakeArtifact - ); + const sameContract1 = m.contractAt("SameContract", "0x123"); + const sameContract2 = m.contractAt("SameContract", "0x123"); return { sameContract1, sameContract2 }; }); @@ -251,6 +249,67 @@ describe("contractAt", () => { ); }); + it("should not validate a missing module parameter", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const another = m.contractAt("Another", p); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_AT + ); + + await assert.isRejected( + validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", "0x1234"); + const another = m.contractAt("Another", p); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_AT + ); + + await assert.isFulfilled( + validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ) + ); + }); + it("should not validate an invalid artifact", async () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", @@ -271,7 +330,7 @@ describe("contractAt", () => { validateNamedContractAt( future as any, setupMockArtifactResolver({ - Another: fakeArtifact, + Another: {} as any, }), {} ), diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index b59728ea6e..9e405433b9 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -1,11 +1,13 @@ import { assert } from "chai"; -import { Artifact } from "../../src"; +import { Artifact, FutureType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateArtifactContractAt } from "../../src/new-api/internal/validation/futures/validateArtifactContractAt"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contractAtFromArtifact", () => { const fakeArtifact: Artifact = { @@ -276,6 +278,67 @@ describe("contractAtFromArtifact", () => { ); }); + it("should not validate a missing module parameter", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + ); + + await assert.isRejected( + validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", "0x1234"); + const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + ); + + await assert.isFulfilled( + validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ) + ); + }); + it("should not validate an invalid artifact", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index fcb534d2f0..58dbf4ff74 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { Artifact } from "../../src"; +import { Artifact, FutureType } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { AccountRuntimeValueImplementation, @@ -635,5 +635,81 @@ describe("contractFromArtifact", () => { /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); }); + + it("should not validate a missing module parameter", async () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const contract1 = m.contractFromArtifact("Test", fakeArtifact, [p]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isRejected( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contractFromArtifact("Test", fakerArtifact, [p]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {} + ) + ); + }); }); }); diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index e8ba6a647b..172124d884 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -7,9 +7,11 @@ import { SendDataFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateSendData } from "../../src/new-api/internal/validation/futures/validateSendData"; import { FutureType } from "../../src/new-api/types/module"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("send", () => { it("should be able to setup a send", () => { @@ -369,5 +371,54 @@ describe("send", () => { /Invalid address given/ ); }); + + it("should not validate a missing module parameter", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + m.send("id", p, 0n, ""); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isRejected( + validateSendData(future as any, setupMockArtifactResolver(), {}), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", "0x123"); + m.send("id", p, 0n, ""); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isFulfilled( + validateSendData(future as any, setupMockArtifactResolver(), {}) + ); + }); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index f877774f9f..362d3f5df3 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -551,6 +551,83 @@ describe("static call", () => { ); }); + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p"); + m.staticCall(another, "test", [p]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p", true); + m.staticCall(another, "test", [p]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isFulfilled( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ) + ); + }); + it("should not validate a non-existant function", async () => { const fakeArtifact: Artifact = { abi: [], From 8211141c081d0b3aa205d45f5a85762212497b7b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 20 Jul 2023 01:11:03 -0400 Subject: [PATCH 0562/1302] submodule validation --- .../core/src/new-api/internal/deployer.ts | 6 +- .../new-api/internal/validation/validate.ts | 61 +++---- packages/core/test/new-api/useModule.ts | 156 ++++++++++++++++++ 3 files changed, 179 insertions(+), 44 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 8e3547754d..55f260ebfc 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -90,11 +90,7 @@ export class Deployer { ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); - await validate( - module, - this._artifactResolver, - deploymentParameters[module.id] - ); + await validate(module, this._artifactResolver, deploymentParameters); const previousStateMap = await this._loadExecutionStateFrom( this._deploymentLoader.journal diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index 79d1ec31b3..a0a3916834 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -20,68 +20,51 @@ import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + moduleParameters: { [key: string]: ModuleParameters } ): Promise { const futures = getFuturesFromModule(module); + // originally, I wrote a getSubmodulesFromModule function similar to the one above + // that recursively retrieved all submodules regardless of how deeply nested they were. + // however, by taking only the top level submodules of the current depth and recursively + // validating each of those, we achieve the same effect. + const submodules = module.submodules; + for (const submodule of submodules) { + await validate(submodule, artifactLoader, moduleParameters); + } + + const params = moduleParameters[module.id] ?? {}; + for (const future of futures) { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: return validateArtifactContractDeployment( future, artifactLoader, - moduleParameters + params ); case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: return validateArtifactLibraryDeployment( future, artifactLoader, - moduleParameters + params ); case FutureType.ARTIFACT_CONTRACT_AT: - return validateArtifactContractAt( - future, - artifactLoader, - moduleParameters - ); + return validateArtifactContractAt(future, artifactLoader, params); case FutureType.NAMED_CONTRACT_DEPLOYMENT: - return validateNamedContractDeployment( - future, - artifactLoader, - moduleParameters - ); + return validateNamedContractDeployment(future, artifactLoader, params); case FutureType.NAMED_LIBRARY_DEPLOYMENT: - return validateNamedLibraryDeployment( - future, - artifactLoader, - moduleParameters - ); + return validateNamedLibraryDeployment(future, artifactLoader, params); case FutureType.NAMED_CONTRACT_AT: - return validateNamedContractAt( - future, - artifactLoader, - moduleParameters - ); + return validateNamedContractAt(future, artifactLoader, params); case FutureType.NAMED_CONTRACT_CALL: - return validateNamedContractCall( - future, - artifactLoader, - moduleParameters - ); + return validateNamedContractCall(future, artifactLoader, params); case FutureType.NAMED_STATIC_CALL: - return validateNamedStaticCall( - future, - artifactLoader, - moduleParameters - ); + return validateNamedStaticCall(future, artifactLoader, params); case FutureType.READ_EVENT_ARGUMENT: - return validateReadEventArgument( - future, - artifactLoader, - moduleParameters - ); + return validateReadEventArgument(future, artifactLoader, params); case FutureType.SEND_DATA: - return validateSendData(future, artifactLoader, moduleParameters); + return validateSendData(future, artifactLoader, params); } } } diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 8ee469c8bd..9772bffff4 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -1,7 +1,11 @@ import { assert } from "chai"; +import { Artifact } from "../../src"; import { defineModule } from "../../src/new-api/define-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { validate } from "../../src/new-api/internal/validation/validate"; + +import { setupMockArtifactResolver } from "./helpers"; describe("useModule", () => { it("should be able to use a submodule", () => { @@ -84,4 +88,156 @@ describe("useModule", () => { ) ); }); + + describe("validation", () => { + it("should validate nested module parameters", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const submoduleDefinition = defineModule("Submodule1", (m) => { + const param1 = m.getParameter("param1"); + const contract1 = m.contract("Contract1", [param1]); + + return { contract1 }; + }); + + const submodule2Definition = defineModule("Submodule2", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + const param2 = m.getParameter("param2"); + const contract2 = m.contract("Contract2", [param2]); + + return { contract1, contract2 }; + }); + + const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const { contract1, contract2 } = m.useModule(submodule2Definition); + + const param3 = m.getParameter("param3"); + const contract3 = m.contract("Contract3", [param3]); + + return { contract1, contract2, contract3 }; + }); + + const moduleParams = { + Submodule1: { + param1: 42, + }, + Submodule2: { + param2: 123, + }, + Module1: { + param3: 40, + }, + }; + + const constructor = new ModuleConstructor(moduleParams); + // const submodule = constructor.construct(submoduleDefinition); + const moduleWithSubmodule = constructor.construct( + moduleWithSubmoduleDefinition + ); + + await assert.isFulfilled( + validate( + moduleWithSubmodule, + setupMockArtifactResolver({ + Contract1: fakeArtifact, + Contract2: fakeArtifact, + Contract3: fakeArtifact, + }), + moduleParams + ) + ); + }); + + it("should not validate missing module parameters is deeply nested submodules", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const submoduleDefinition = defineModule("Submodule1", (m) => { + const param1 = m.getParameter("param1"); + const contract1 = m.contract("Contract1", [param1]); + + return { contract1 }; + }); + + const submodule2Definition = defineModule("Submodule2", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + const param2 = m.getParameter("param2"); + const contract2 = m.contract("Contract2", [param2]); + + return { contract1, contract2 }; + }); + + const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const { contract1, contract2 } = m.useModule(submodule2Definition); + + const param3 = m.getParameter("param3"); + const contract3 = m.contract("Contract3", [param3]); + + return { contract1, contract2, contract3 }; + }); + + const moduleParams = { + Submodule2: { + param2: 123, + }, + Module1: { + param3: 40, + }, + }; + + const constructor = new ModuleConstructor(moduleParams); + // const submodule = constructor.construct(submoduleDefinition); + const moduleWithSubmodule = constructor.construct( + moduleWithSubmoduleDefinition + ); + + await assert.isRejected( + validate( + moduleWithSubmodule, + setupMockArtifactResolver({ + Contract1: fakeArtifact, + Contract2: fakeArtifact, + Contract3: fakeArtifact, + }), + moduleParams + ), + /Module parameter 'param1' requires a value but was given none/ + ); + }); + }); }); From c5d87f6ebb00aa11b9996d4776f857479f18637e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 20 Jul 2023 02:19:51 -0400 Subject: [PATCH 0563/1302] validate module params deeply nested in constructor/call args --- .../utils/retrieve-nested-runtime-values.ts | 41 ++++++++ .../validateArtifactContractDeployment.ts | 6 +- .../futures/validateNamedContractCall.ts | 8 +- .../validateNamedContractDeployment.ts | 10 +- .../futures/validateNamedStaticCall.ts | 8 +- packages/core/test/new-api/call.ts | 83 ++++++++++++++++ packages/core/test/new-api/contract.ts | 95 +++++++++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 80 ++++++++++++++++ packages/core/test/new-api/staticCall.ts | 81 ++++++++++++++++ 9 files changed, 391 insertions(+), 21 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts diff --git a/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts b/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts new file mode 100644 index 0000000000..e832154eb0 --- /dev/null +++ b/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts @@ -0,0 +1,41 @@ +import { + isFuture, + isModuleParameterRuntimeValue, + isRuntimeValue, +} from "../../type-guards"; +import { + ArgumentType, + ModuleParameterRuntimeValue, + RuntimeValueType, +} from "../../types/module"; + +export function retrieveNestedRuntimeValues( + args: ArgumentType[] +): Array> { + return args.flatMap(checkForValues).filter(isModuleParameterRuntimeValue); +} + +function checkForValues( + arg: ArgumentType +): + | Array | null> + | ModuleParameterRuntimeValue + | null { + if (isRuntimeValue(arg)) { + if (arg.type === RuntimeValueType.ACCOUNT) { + return null; + } + + return arg; + } + + if (Array.isArray(arg)) { + return arg.flatMap(checkForValues); + } + + if (!isFuture(arg) && typeof arg === "object" && arg !== null) { + return Object.values(arg).flatMap(checkForValues); + } + + return null; +} diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index 4a046b0d2b..e3535d6b07 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -1,21 +1,19 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ArtifactContractDeploymentFuture, ModuleParameters, } from "../../../types/module"; +import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateArtifactContractDeployment( future: ArtifactContractDeploymentFuture, artifactLoader: ArtifactResolver, moduleParameters: ModuleParameters ) { - const moduleParams = future.constructorArgs.filter( - isModuleParameterRuntimeValue - ); + const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index ab62cb90a0..acca2c9e3c 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -1,22 +1,20 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { - isArtifactType, - isModuleParameterRuntimeValue, -} from "../../../type-guards"; +import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ModuleParameters, NamedContractCallFuture, } from "../../../types/module"; +import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedContractCall( future: NamedContractCallFuture, artifactLoader: ArtifactResolver, moduleParameters: ModuleParameters ) { - const moduleParams = future.args.filter(isModuleParameterRuntimeValue); + const moduleParams = retrieveNestedRuntimeValues(future.args); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index 0dbe79725e..16903ecd01 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -1,24 +1,20 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { - isArtifactType, - isModuleParameterRuntimeValue, -} from "../../../type-guards"; +import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ModuleParameters, NamedContractDeploymentFuture, } from "../../../types/module"; +import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedContractDeployment( future: NamedContractDeploymentFuture, artifactLoader: ArtifactResolver, moduleParameters: ModuleParameters ) { - const moduleParams = future.constructorArgs.filter( - isModuleParameterRuntimeValue - ); + const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts index a17dfcbaa4..42ae5fa1b9 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -1,19 +1,17 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { - isArtifactType, - isModuleParameterRuntimeValue, -} from "../../../type-guards"; +import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ModuleParameters, NamedStaticCallFuture } from "../../../types/module"; +import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedStaticCall( future: NamedStaticCallFuture, artifactLoader: ArtifactResolver, moduleParameters: ModuleParameters ) { - const moduleParams = future.args.filter(isModuleParameterRuntimeValue); + const moduleParams = retrieveNestedRuntimeValues(future.args); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 532b5f57ff..3a6073e37b 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -644,6 +644,89 @@ describe("call", () => { ); }); + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ) + ); + }); + it("should not validate a non-existant function", async () => { const fakeArtifact: Artifact = { abi: [], diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 2049893d60..69ab05b7b3 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -686,5 +686,100 @@ describe("contract", () => { ) ); }); + + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ) + ); + }); }); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 58dbf4ff74..e2905e8f86 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -711,5 +711,85 @@ describe("contractFromArtifact", () => { ) ); }); + + it("should not validate a missing module parameter (deeply nested)", async () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p"); + const contract1 = m.contractFromArtifact("Test", fakeArtifact, [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isRejected( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contractFromArtifact("Test", fakerArtifact, [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {} + ) + ); + }); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 362d3f5df3..47e31dcbc9 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -628,6 +628,87 @@ describe("static call", () => { ); }); + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p"); + m.staticCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ), + /Module parameter 'p' requires a value but was given none/ + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p", true); + m.staticCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isFulfilled( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ) + ); + }); + it("should not validate a non-existant function", async () => { const fakeArtifact: Artifact = { abi: [], From f05657bf5ed141d37f781977d00132d44cdb4a9d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 12 Jul 2023 00:33:10 -0400 Subject: [PATCH 0564/1302] add module params as an option for `value` --- .../internal/execution/execution-engine.ts | 50 ++++++++++++++++--- .../src/new-api/internal/module-builder.ts | 7 ++- packages/core/src/new-api/internal/module.ts | 8 +-- .../new-api/stored-deployment-serializer.ts | 42 ++++++++++++---- .../core/src/new-api/types/module-builder.ts | 8 +-- packages/core/src/new-api/types/module.ts | 8 +-- .../new-api/types/serialized-deployment.ts | 8 +-- packages/core/test/new-api/call.ts | 33 ++++++++++++ packages/core/test/new-api/contract.ts | 35 +++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 35 +++++++++++++ packages/core/test/new-api/send.ts | 31 ++++++++++++ 11 files changed, 232 insertions(+), 33 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 1f979b24ed..d56daa6793 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -538,12 +538,21 @@ export class ExecutionEngine { let state: FutureStartMessage; switch (future.type) { - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: { await deploymentLoader.storeUserProvidedArtifact( future.id, future.artifact ); + let value: string; + if (typeof future.value === "bigint") { + value = future.value.toString(); + } else { + value = resolveModuleParameter(future.value, { + deploymentParameters, + }) as string; + } + state = { type: "execution-start", futureId: future.id, @@ -554,7 +563,7 @@ export class ExecutionEngine { // history: [], artifactFutureId: future.id, contractName: future.contractName, - value: future.value.toString(), + value, constructorArgs: this._resolveArgs(future.constructorArgs, { accounts, deploymentParameters, @@ -567,12 +576,22 @@ export class ExecutionEngine { }; return state; - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + } + case FutureType.NAMED_CONTRACT_DEPLOYMENT: { await this._storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, deploymentLoader, }); + let value: string; + if (typeof future.value === "bigint") { + value = future.value.toString(); + } else { + value = resolveModuleParameter(future.value, { + deploymentParameters, + }) as string; + } + state = { type: "execution-start", futureId: future.id, @@ -581,7 +600,7 @@ export class ExecutionEngine { dependencies: [...future.dependencies].map((f) => f.id), artifactFutureId: future.id, contractName: future.contractName, - value: future.value.toString(), + value, constructorArgs: this._resolveArgs(future.constructorArgs, { accounts, deploymentParameters, @@ -594,6 +613,7 @@ export class ExecutionEngine { }; return state; + } case FutureType.NAMED_LIBRARY_DEPLOYMENT: await this._storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, @@ -649,6 +669,15 @@ export class ExecutionEngine { `Internal error - dependency ${future.contract.id} used before it's resolved` ); + let value: string; + if (typeof future.value === "bigint") { + value = future.value.toString(); + } else { + value = resolveModuleParameter(future.value, { + deploymentParameters, + }) as string; + } + state = { type: "execution-start", futureId: future.id, @@ -663,7 +692,7 @@ export class ExecutionEngine { functionName: future.functionName, contractAddress, artifactFutureId: callContractFutureId, - value: future.value.toString(), + value, from: resolveFromAddress(future.from, { accounts }), }; return state; @@ -758,6 +787,15 @@ export class ExecutionEngine { to = contractAddress; } + let value: string; + if (typeof future.value === "bigint") { + value = future.value.toString(); + } else { + value = resolveModuleParameter(future.value, { + deploymentParameters, + }) as string; + } + state = { type: "execution-start", futureId: future.id, @@ -766,7 +804,7 @@ export class ExecutionEngine { // status: ExecutionStatus.STARTED, dependencies: [...future.dependencies].map((f) => f.id), // history: [], - value: future.value.toString(), + value, data: future.data ?? "0x", to, from: resolveFromAddress(future.from, { accounts }), diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index e5fc5a62ea..c9f0f8b89b 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -722,8 +722,11 @@ export class IgnitionModuleBuilderImplementation< } } - private _assertValidValue(value: bigint | any, func: (...[]: any[]) => any) { - if (typeof value !== "bigint") { + private _assertValidValue( + value: bigint | ModuleParameterRuntimeValue | any, + func: (...[]: any[]) => any + ) { + if (!isModuleParameterRuntimeValue(value) && typeof value !== "bigint") { this._throwErrorWithStackTrace( `Given value option '${value}' is not a \`bigint\``, func diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index aec272d0ca..90c2a33565 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -62,7 +62,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: ArgumentType[], public readonly libraries: Record>, - public readonly value: bigint, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); @@ -82,7 +82,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly constructorArgs: ArgumentType[], public readonly artifact: Artifact, public readonly libraries: Record>, - public readonly value: bigint, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); @@ -137,7 +137,7 @@ export class NamedContractCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: ArgumentType[], - public readonly value: bigint, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); @@ -226,7 +226,7 @@ export class SendDataFutureImplementation | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - public readonly value: bigint, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly data: string | undefined, public readonly from: string | AccountRuntimeValue | undefined ) { diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index a06bb186b8..2e60e73932 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -139,7 +139,9 @@ export class StoredDeploymentSerializer { ? this._serializeAccountRuntimeValue(future.from) : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: this._serializeBigint(future.value), + value: isRuntimeValue(future.value) + ? this._serializeModuleParamterRuntimeValue(future.value) + : this._serializeBigint(future.value), }; return serializedNamedContractDeploymentFuture; @@ -161,7 +163,9 @@ export class StoredDeploymentSerializer { ? this._serializeAccountRuntimeValue(future.from) : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: this._serializeBigint(future.value), + value: isRuntimeValue(future.value) + ? this._serializeModuleParamterRuntimeValue(future.value) + : this._serializeBigint(future.value), }; return serializedArtifactContractDeploymentFuture; @@ -212,7 +216,9 @@ export class StoredDeploymentSerializer { contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, args: future.args.map((arg) => context.argReplacer(arg)), - value: this._serializeBigint(future.value), + value: isRuntimeValue(future.value) + ? this._serializeModuleParamterRuntimeValue(future.value) + : this._serializeBigint(future.value), from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) : future.from, @@ -308,7 +314,9 @@ export class StoredDeploymentSerializer { : isRuntimeValue(future.to) ? this._serializeModuleParamterRuntimeValue(future.to) : future.to, - value: this._serializeBigint(future.value), + value: isRuntimeValue(future.value) + ? this._serializeModuleParamterRuntimeValue(future.value) + : this._serializeBigint(future.value), data: future.data, from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) @@ -635,7 +643,11 @@ export class StoredDeploymentDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - this._deserializedBigint(serializedFuture.value), + this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.value + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from @@ -655,7 +667,11 @@ export class StoredDeploymentDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - this._deserializedBigint(serializedFuture.value), + this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.value + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from @@ -703,7 +719,11 @@ export class StoredDeploymentDeserializer { serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), - this._deserializedBigint(serializedFuture.value), + this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.value + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from @@ -739,7 +759,7 @@ export class StoredDeploymentDeserializer { ) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.address - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : serializedFuture.address ); case FutureType.ARTIFACT_CONTRACT_AT: @@ -791,7 +811,11 @@ export class StoredDeploymentDeserializer { serializedFuture.to ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus : serializedFuture.to, - this._deserializedBigint(serializedFuture.value), + this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + ? (this._deserializeModuleParameterRuntimeValue( + serializedFuture.value + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + : this._deserializedBigint(serializedFuture.value), serializedFuture.data, this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 3a2752daba..17915c7f21 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -43,7 +43,7 @@ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: bigint; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -56,7 +56,7 @@ export interface ContractFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: bigint; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -92,7 +92,7 @@ export interface LibraryFromArtifactOptions { export interface CallOptions { id?: string; after?: Future[]; - value?: bigint; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -235,7 +235,7 @@ export interface IgnitionModuleBuilder { send( id: string, to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, - value?: bigint, + value?: bigint | ModuleParameterRuntimeValue, data?: string, options?: SendDataOptions ): SendDataFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0b4308cd27..fa2aabe2d6 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -121,7 +121,7 @@ export interface NamedContractDeploymentFuture { contractName: ContractNameT; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -140,7 +140,7 @@ export interface ArtifactContractDeploymentFuture { artifact: Artifact; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -192,7 +192,7 @@ export interface NamedContractCallFuture< contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; - value: bigint; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -280,7 +280,7 @@ export interface SendDataFuture { module: IgnitionModule; dependencies: Set; to: string | AddressResolvableFuture | ModuleParameterRuntimeValue; - value: bigint; + value: bigint | ModuleParameterRuntimeValue; data: string | undefined; from: string | AccountRuntimeValue | undefined; } diff --git a/packages/core/src/new-api/types/serialized-deployment.ts b/packages/core/src/new-api/types/serialized-deployment.ts index bc33432349..ff8dc7cf55 100644 --- a/packages/core/src/new-api/types/serialized-deployment.ts +++ b/packages/core/src/new-api/types/serialized-deployment.ts @@ -79,7 +79,7 @@ export interface SerializedNamedContractDeploymentFuture contractName: string; constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; - value: SerializedBigInt; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue; from: string | SerializedAccountRuntimeValue | undefined; } @@ -95,7 +95,7 @@ export interface SerializedArtifactContractDeploymentFuture constructorArgs: SerializedArgumentType[]; artifact: Artifact; libraries: SerializedLibraries; - value: SerializedBigInt; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue; from: string | SerializedAccountRuntimeValue | undefined; } @@ -137,7 +137,7 @@ export interface SerializedNamedContractCallFuture functionName: string; contract: FutureToken; args: SerializedArgumentType[]; - value: SerializedBigInt; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue; from: string | SerializedAccountRuntimeValue | undefined; } @@ -201,7 +201,7 @@ export interface SerializedReadEventArgumentFuture export interface SerializedSendDataFuture extends BaseSerializedFuture { type: FutureType.SEND_DATA; to: string | FutureToken | SerializedModuleParameterRuntimeValue; - value: SerializedBigInt; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue; data: string | undefined; from: string | SerializedAccountRuntimeValue | undefined; } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 3a6073e37b..429cfea89c 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -165,6 +165,39 @@ describe("call", () => { assert.equal(callFuture.value, BigInt(42)); }); + it("Should be able to pass an ModuleParameterRuntimeValue as a value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const example = m.contract("Example"); + + m.call(example, "test", [], { value: m.getParameter("value") }); + + return { example }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Example#test" + ); + + if (!(callFuture instanceof NamedContractCallFutureImplementation)) { + assert.fail("Not a named contract deployment"); + } + + assertInstanceOf( + callFuture.value, + ModuleParameterRuntimeValueImplementation + ); + }); + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 69ab05b7b3..4cf77343f5 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -188,6 +188,41 @@ describe("contract", () => { assert.equal(anotherFuture.value, BigInt(42)); }); + it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contract("Another", [], { + value: m.getParameter("value"), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assertInstanceOf( + anotherFuture.value, + ModuleParameterRuntimeValueImplementation + ); + }); + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index e2905e8f86..896afed448 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -187,6 +187,41 @@ describe("contractFromArtifact", () => { assert.equal(anotherFuture.value, BigInt(42)); }); + it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, [], { + value: m.getParameter("value"), + }); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:Another" + ); + + if ( + !(anotherFuture instanceof ArtifactContractDeploymentFutureImplementation) + ) { + assert.fail("Not an artifact contract deployment"); + } + + assertInstanceOf( + anotherFuture.value, + ModuleParameterRuntimeValueImplementation + ); + }); + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 172124d884..4d01f51758 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -145,6 +145,37 @@ describe("send", () => { assert.equal(sendFuture.value, BigInt(42)); }); + it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + m.send("test send", "0xtest", m.getParameter("value"), ""); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const moduleWithDependentContracts = constructor.construct( + moduleWithDependentContractsDefinition + ); + + assert.isDefined(moduleWithDependentContracts); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1:test send" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assertInstanceOf( + sendFuture.value, + ModuleParameterRuntimeValueImplementation + ); + }); + it("should be able to pass a string as from option", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", From 989412dc9008eb4ac3d02c4bdb706e8e65f179c9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 12 Jul 2023 22:07:44 -0400 Subject: [PATCH 0565/1302] fix lint error --- .../futures/reconcileArtifactContractDeployment.ts | 4 +++- .../reconciliation/futures/reconcileNamedContractCall.ts | 4 +++- .../futures/reconcileNamedContractDeployment.ts | 4 +++- .../internal/reconciliation/futures/reconcileSendData.ts | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 287326046b..c608254243 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -57,7 +57,9 @@ export function reconcileArtifactContractDeployment( if (!isEqual(future.value, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${future.value}` + `Value has been changed from ${executionState.value} to ${ + typeof future.value === "bigint" ? future.value : "a module parameter" + }` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index eb535aabc1..d0f2563252 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -43,7 +43,9 @@ export function reconcileNamedContractCall( if (!isEqual(future.value, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${future.value}` + `Value has been changed from ${executionState.value} to ${ + typeof future.value === "bigint" ? future.value : "a module parameter" + }` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 703d5d8ce5..877c5226de 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -58,7 +58,9 @@ export function reconcileNamedContractDeployment( if (!isEqual(future.value, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${future.value}` + `Value has been changed from ${executionState.value} to ${ + typeof future.value === "bigint" ? future.value : "a module parameter" + }` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index e2ba0d031a..c2b8066463 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -36,7 +36,9 @@ export function reconcileSendData( if (!isEqual(future.value, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${future.value}` + `Value has been changed from ${executionState.value} to ${ + typeof future.value === "bigint" ? future.value : "a module parameter" + }` ); } From c4862a58325abc9f0f8f7ef00e945ea3f2b9b62b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 20 Jul 2023 23:45:30 -0400 Subject: [PATCH 0566/1302] resolve module param in reconciliation and add a test to ensure serialization --- .../reconcileArtifactContractDeployment.ts | 12 ++++++++---- .../futures/reconcileNamedContractCall.ts | 12 ++++++++---- .../futures/reconcileNamedContractDeployment.ts | 12 ++++++++---- .../reconciliation/futures/reconcileSendData.ts | 12 ++++++++---- .../new-api/stored-deployment-serializer.ts | 17 +++++++++++++++++ 5 files changed, 49 insertions(+), 16 deletions(-) diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index c608254243..fe63873a52 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -3,6 +3,7 @@ import { isEqual } from "lodash"; import { ArtifactContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; +import { resolveModuleParameter } from "../../utils/resolve-module-parameter"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { @@ -54,12 +55,15 @@ export function reconcileArtifactContractDeployment( return fail(future, "Libraries have been changed"); } - if (!isEqual(future.value, executionState.value)) { + const resolvedValue = + typeof future.value === "bigint" + ? future.value + : (resolveModuleParameter(future.value, context) as bigint); + + if (!isEqual(resolvedValue, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${ - typeof future.value === "bigint" ? future.value : "a module parameter" - }` + `Value has been changed from ${executionState.value} to ${resolvedValue}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts index d0f2563252..bd564a11f7 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -3,6 +3,7 @@ import { isEqual } from "lodash"; import { NamedContractCallFuture } from "../../../types/module"; import { CallExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; +import { resolveModuleParameter } from "../../utils/resolve-module-parameter"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; @@ -40,12 +41,15 @@ export function reconcileNamedContractCall( return fail(future, "Function args have been changed"); } - if (!isEqual(future.value, executionState.value)) { + const resolvedValue = + typeof future.value === "bigint" + ? future.value + : (resolveModuleParameter(future.value, context) as bigint); + + if (!isEqual(resolvedValue, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${ - typeof future.value === "bigint" ? future.value : "a module parameter" - }` + `Value has been changed from ${executionState.value} to ${resolvedValue}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 877c5226de..bdb321a308 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -3,6 +3,7 @@ import { isEqual } from "lodash"; import { NamedContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; +import { resolveModuleParameter } from "../../utils/resolve-module-parameter"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { @@ -55,12 +56,15 @@ export function reconcileNamedContractDeployment( return fail(future, "Libraries have been changed"); } - if (!isEqual(future.value, executionState.value)) { + const resolvedValue = + typeof future.value === "bigint" + ? future.value + : (resolveModuleParameter(future.value, context) as bigint); + + if (!isEqual(resolvedValue, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${ - typeof future.value === "bigint" ? future.value : "a module parameter" - }` + `Value has been changed from ${executionState.value} to ${resolvedValue}` ); } diff --git a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts index c2b8066463..3a4d19a4f6 100644 --- a/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/new-api/internal/reconciliation/futures/reconcileSendData.ts @@ -3,6 +3,7 @@ import { isEqual } from "lodash"; import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../types/execution-state"; import { resolveFromAddress } from "../../utils/resolve-from-address"; +import { resolveModuleParameter } from "../../utils/resolve-module-parameter"; import { ExecutionStateResolver } from "../execution-state-resolver"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; import { addressToErrorString, fail } from "../utils"; @@ -33,12 +34,15 @@ export function reconcileSendData( ); } - if (!isEqual(future.value, executionState.value)) { + const resolvedValue = + typeof future.value === "bigint" + ? future.value + : (resolveModuleParameter(future.value, context) as bigint); + + if (!isEqual(resolvedValue, executionState.value)) { return fail( future, - `Value has been changed from ${executionState.value} to ${ - typeof future.value === "bigint" ? future.value : "a module parameter" - }` + `Value has been changed from ${executionState.value} to ${resolvedValue}` ); } diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index 8b3e44a58d..d9f4f1920e 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -60,6 +60,23 @@ describe("stored deployment serializer", () => { module, }); }); + + it("should serialize a contract deployment with module parameter value", () => { + const moduleDefinition = defineModule("Module1", (m) => { + const value = m.getParameter("value", "42"); + const contract1 = m.contract("Contract1", [], { value }); + + return { contract1 }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + assertSerializableModuleIn({ + details, + module, + }); + }); }); describe("contractFromArtifact", () => { From 233d0e30b6d6f89faee76cebcb45668a54e15f88 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 25 Jul 2023 02:53:29 -0400 Subject: [PATCH 0567/1302] validate module parameter type for value --- .../src/new-api/internal/module-builder.ts | 4 +- packages/core/src/new-api/internal/module.ts | 8 +- .../futures/validateArtifactContractAt.ts | 13 ++- .../validateArtifactContractDeployment.ts | 17 ++++ .../futures/validateNamedContractAt.ts | 13 ++- .../futures/validateNamedContractCall.ts | 21 ++++- .../validateNamedContractDeployment.ts | 21 ++++- .../validation/futures/validateSendData.ts | 28 +++++- .../new-api/stored-deployment-serializer.ts | 8 +- .../core/src/new-api/types/module-builder.ts | 8 +- packages/core/src/new-api/types/module.ts | 8 +- packages/core/test/new-api/call.ts | 73 ++++++++++++++++ packages/core/test/new-api/contract.ts | 79 +++++++++++++++++ packages/core/test/new-api/contractAt.ts | 31 +++++++ .../test/new-api/contractAtFromArtifact.ts | 31 +++++++ .../core/test/new-api/contractFromArtifact.ts | 87 +++++++++++++++++++ packages/core/test/new-api/send.ts | 49 +++++++++++ .../new-api/stored-deployment-serializer.ts | 2 +- 18 files changed, 468 insertions(+), 33 deletions(-) diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index c9f0f8b89b..349775232b 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -540,7 +540,7 @@ export class IgnitionModuleBuilderImplementation< public send( id: string, to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, - value?: bigint, + value?: bigint | ModuleParameterRuntimeValue, data?: string, options: SendDataOptions = {} ): SendDataFuture { @@ -723,7 +723,7 @@ export class IgnitionModuleBuilderImplementation< } private _assertValidValue( - value: bigint | ModuleParameterRuntimeValue | any, + value: bigint | ModuleParameterRuntimeValue | any, func: (...[]: any[]) => any ) { if (!isModuleParameterRuntimeValue(value) && typeof value !== "bigint") { diff --git a/packages/core/src/new-api/internal/module.ts b/packages/core/src/new-api/internal/module.ts index 90c2a33565..cc2a89b376 100644 --- a/packages/core/src/new-api/internal/module.ts +++ b/packages/core/src/new-api/internal/module.ts @@ -62,7 +62,7 @@ export class NamedContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: ArgumentType[], public readonly libraries: Record>, - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); @@ -82,7 +82,7 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly constructorArgs: ArgumentType[], public readonly artifact: Artifact, public readonly libraries: Record>, - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); @@ -137,7 +137,7 @@ export class NamedContractCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: ArgumentType[], - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_CONTRACT_CALL, module); @@ -226,7 +226,7 @@ export class SendDataFutureImplementation | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: bigint | ModuleParameterRuntimeValue, public readonly data: string | undefined, public readonly from: string | AccountRuntimeValue | undefined ) { diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts index 5f75dfc2fd..af2bbea97e 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts @@ -12,13 +12,18 @@ export async function validateArtifactContractAt( moduleParameters: ModuleParameters ) { if (isModuleParameterRuntimeValue(future.address)) { - if ( - moduleParameters[future.address.name] === undefined && - future.address.defaultValue === undefined - ) { + const param = + moduleParameters[future.address.name] ?? future.address.defaultValue; + if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.address.name}' requires a value but was given none` ); + } else if (typeof param !== "string") { + throw new IgnitionValidationError( + `Module parameter '${ + future.address.name + }' must be of type 'string' but is '${typeof param}'` + ); } } diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index e3535d6b07..9766793f4d 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; +import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ArtifactContractDeploymentFuture, @@ -27,6 +28,22 @@ export async function validateArtifactContractDeployment( ); } + if (isModuleParameterRuntimeValue(future.value)) { + const param = + moduleParameters[future.value.name] ?? future.value.defaultValue; + if (param === undefined) { + throw new IgnitionValidationError( + `Module parameter '${future.value.name}' requires a value but was given none` + ); + } else if (typeof param !== "bigint") { + throw new IgnitionValidationError( + `Module parameter '${ + future.value.name + }' must be of type 'bigint' but is '${typeof param}'` + ); + } + } + const artifact = await artifactLoader.loadArtifact(future.contractName); const argsLength = future.constructorArgs.length; diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts index 736f988e40..34fcd04b11 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -12,13 +12,18 @@ export async function validateNamedContractAt( moduleParameters: ModuleParameters ) { if (isModuleParameterRuntimeValue(future.address)) { - if ( - moduleParameters[future.address.name] === undefined && - future.address.defaultValue === undefined - ) { + const param = + moduleParameters[future.address.name] ?? future.address.defaultValue; + if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.address.name}' requires a value but was given none` ); + } else if (typeof param !== "string") { + throw new IgnitionValidationError( + `Module parameter '${ + future.address.name + }' must be of type 'string' but is '${typeof param}'` + ); } } diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index acca2c9e3c..ae2841978a 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -1,7 +1,10 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ModuleParameters, @@ -28,6 +31,22 @@ export async function validateNamedContractCall( ); } + if (isModuleParameterRuntimeValue(future.value)) { + const param = + moduleParameters[future.value.name] ?? future.value.defaultValue; + if (param === undefined) { + throw new IgnitionValidationError( + `Module parameter '${future.value.name}' requires a value but was given none` + ); + } else if (typeof param !== "bigint") { + throw new IgnitionValidationError( + `Module parameter '${ + future.value.name + }' must be of type 'bigint' but is '${typeof param}'` + ); + } + } + const artifact = "artifact" in future.contract ? future.contract.artifact diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index 16903ecd01..c92023f637 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -1,7 +1,10 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ModuleParameters, @@ -28,6 +31,22 @@ export async function validateNamedContractDeployment( ); } + if (isModuleParameterRuntimeValue(future.value)) { + const param = + moduleParameters[future.value.name] ?? future.value.defaultValue; + if (param === undefined) { + throw new IgnitionValidationError( + `Module parameter '${future.value.name}' requires a value but was given none` + ); + } else if (typeof param !== "bigint") { + throw new IgnitionValidationError( + `Module parameter '${ + future.value.name + }' must be of type 'bigint' but is '${typeof param}'` + ); + } + } + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { diff --git a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts index 005b2b93de..5d19eb5283 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts @@ -9,13 +9,33 @@ export async function validateSendData( moduleParameters: ModuleParameters ) { if (isModuleParameterRuntimeValue(future.to)) { - if ( - moduleParameters[future.to.name] === undefined && - future.to.defaultValue === undefined - ) { + const param = moduleParameters[future.to.name] ?? future.to.defaultValue; + if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.to.name}' requires a value but was given none` ); + } else if (typeof param !== "string") { + throw new IgnitionValidationError( + `Module parameter '${ + future.to.name + }' must be of type 'string' but is '${typeof param}'` + ); + } + } + + if (isModuleParameterRuntimeValue(future.value)) { + const param = + moduleParameters[future.value.name] ?? future.value.defaultValue; + if (param === undefined) { + throw new IgnitionValidationError( + `Module parameter '${future.value.name}' requires a value but was given none` + ); + } else if (typeof param !== "bigint") { + throw new IgnitionValidationError( + `Module parameter '${ + future.value.name + }' must be of type 'bigint' but is '${typeof param}'` + ); } } diff --git a/packages/core/src/new-api/stored-deployment-serializer.ts b/packages/core/src/new-api/stored-deployment-serializer.ts index 2e60e73932..d493fe68c7 100644 --- a/packages/core/src/new-api/stored-deployment-serializer.ts +++ b/packages/core/src/new-api/stored-deployment-serializer.ts @@ -646,7 +646,7 @@ export class StoredDeploymentDeserializer { this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) @@ -670,7 +670,7 @@ export class StoredDeploymentDeserializer { this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) @@ -722,7 +722,7 @@ export class StoredDeploymentDeserializer { this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._deserializedBigint(serializedFuture.value), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) @@ -814,7 +814,7 @@ export class StoredDeploymentDeserializer { this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._deserializedBigint(serializedFuture.value), serializedFuture.data, this._isSerializedAccountRuntimeValue(serializedFuture.from) diff --git a/packages/core/src/new-api/types/module-builder.ts b/packages/core/src/new-api/types/module-builder.ts index 17915c7f21..fc7e222d8b 100644 --- a/packages/core/src/new-api/types/module-builder.ts +++ b/packages/core/src/new-api/types/module-builder.ts @@ -43,7 +43,7 @@ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: bigint | ModuleParameterRuntimeValue; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -56,7 +56,7 @@ export interface ContractFromArtifactOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: bigint | ModuleParameterRuntimeValue; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -92,7 +92,7 @@ export interface LibraryFromArtifactOptions { export interface CallOptions { id?: string; after?: Future[]; - value?: bigint | ModuleParameterRuntimeValue; + value?: bigint | ModuleParameterRuntimeValue; from?: string | AccountRuntimeValue; } @@ -235,7 +235,7 @@ export interface IgnitionModuleBuilder { send( id: string, to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, - value?: bigint | ModuleParameterRuntimeValue, + value?: bigint | ModuleParameterRuntimeValue, data?: string, options?: SendDataOptions ): SendDataFuture; diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index fa2aabe2d6..0f35810e50 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -121,7 +121,7 @@ export interface NamedContractDeploymentFuture { contractName: ContractNameT; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint | ModuleParameterRuntimeValue; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -140,7 +140,7 @@ export interface ArtifactContractDeploymentFuture { artifact: Artifact; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint | ModuleParameterRuntimeValue; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -192,7 +192,7 @@ export interface NamedContractCallFuture< contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; - value: bigint | ModuleParameterRuntimeValue; + value: bigint | ModuleParameterRuntimeValue; from: string | AccountRuntimeValue | undefined; } @@ -280,7 +280,7 @@ export interface SendDataFuture { module: IgnitionModule; dependencies: Set; to: string | AddressResolvableFuture | ModuleParameterRuntimeValue; - value: bigint | ModuleParameterRuntimeValue; + value: bigint | ModuleParameterRuntimeValue; data: string | undefined; from: string | AccountRuntimeValue | undefined; } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 429cfea89c..6f88313e9d 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -631,6 +631,79 @@ describe("call", () => { ); }); + it("should not validate a module parameter of the wrong type for value", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p", false as unknown as bigint); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [], { value: p }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ), + /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ); + }); + + it("should validate a module parameter of the correct type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "payable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const p = m.getParameter("p", 42n); + + const another = m.contractFromArtifact("Another", fakeArtifact, []); + m.call(another, "test", [], { value: p }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {} + ) + ); + }); + it("should validate a missing module parameter if a default parameter is present", async () => { const fakeArtifact: Artifact = { abi: [ diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 4cf77343f5..30e67ee084 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -677,6 +677,85 @@ describe("contract", () => { ); }); + it("should not validate a module parameter of the wrong type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", false as unknown as bigint); + const contract1 = m.contract("Test", [], { value: p }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ), + /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ); + }); + + it("should validate a module parameter of the correct type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 42n); + const contract1 = m.contract("Test", [], { value: p }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {} + ) + ); + }); + it("should validate a missing module parameter if a default parameter is present", async () => { const fakeArtifact: Artifact = { abi: [ diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 56ae039550..11fcd56595 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -310,6 +310,37 @@ describe("contractAt", () => { ); }); + it("should not validate a module parameter of the wrong type", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123 as unknown as string); + const another = m.contractAt("Another", p); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_AT + ); + + await assert.isRejected( + validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ), + /Module parameter 'p' must be of type 'string' but is 'number'/ + ); + }); + it("should not validate an invalid artifact", async () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index 9e405433b9..c618dea4de 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -339,6 +339,37 @@ describe("contractAtFromArtifact", () => { ); }); + it("should not validate a module parameter of the wrong type", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 123 as unknown as string); + const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + + return { another }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + ); + + await assert.isRejected( + validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {} + ), + /Module parameter 'p' must be of type 'string' but is 'number'/ + ); + }); + it("should not validate an invalid artifact", () => { const moduleWithDependentContractsDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 896afed448..1dc572a18c 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -747,6 +747,93 @@ describe("contractFromArtifact", () => { ); }); + it("should not validate a module parameter of the wrong type for value", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", false as unknown as bigint); + const contract1 = m.contractFromArtifact("Test", fakerArtifact, [], { + value: p, + }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isRejected( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {} + ), + /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ); + }); + + it("should validate a module parameter of the correct type for value", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 42n); + const contract1 = m.contractFromArtifact("Test", fakerArtifact, [], { + value: p, + }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + ); + + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {} + ) + ); + }); + it("should not validate a missing module parameter (deeply nested)", async () => { const moduleWithContractFromArtifactDefinition = defineModule( "Module1", diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 4d01f51758..05cb6c96bb 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -451,5 +451,54 @@ describe("send", () => { validateSendData(future as any, setupMockArtifactResolver(), {}) ); }); + + it("should not validate a module parameter of the wrong type for value", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", false as unknown as bigint); + m.send("id", "0xasdf", p, ""); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isRejected( + validateSendData(future as any, setupMockArtifactResolver(), {}), + /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ); + }); + + it("should validate a module parameter of the correct type for value", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const p = m.getParameter("p", 42n); + m.send("id", "0xasdf", p, ""); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isFulfilled( + validateSendData(future as any, setupMockArtifactResolver(), {}) + ); + }); }); }); diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index d9f4f1920e..c57b07bb53 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -63,7 +63,7 @@ describe("stored deployment serializer", () => { it("should serialize a contract deployment with module parameter value", () => { const moduleDefinition = defineModule("Module1", (m) => { - const value = m.getParameter("value", "42"); + const value = m.getParameter("value", 42n); const contract1 = m.contract("Contract1", [], { value }); return { contract1 }; From 00e4f6f57cffc2af70f358bedf7dbe8c423b54ed Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 19 Jul 2023 14:50:31 +0100 Subject: [PATCH 0568/1302] fix: artifact module loading Pre-artifact loading for the passed Ignition module should use the artifact resolved for named contracts, but read the artifacts from the passed future for user provided cases. Two integration tests have been added that cover the bug. --- .../core/src/new-api/internal/deployer.ts | 54 +++++++++++++++--- packages/core/src/new-api/type-guards.ts | 48 ++++++++++++++++ .../deploy-contract-at-from-artifact.ts | 57 +++++++++++++++++++ .../test/execution/deploy-contract-at.ts | 52 +++++++++++++++++ ...ct.ts => deploy-contract-from-artifact.ts} | 2 +- ...-contract-deploy.ts => deploy-contract.ts} | 2 +- .../multiple-batch-contract-deploy.ts | 2 - 7 files changed, 206 insertions(+), 11 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts create mode 100644 packages/hardhat-plugin/test/execution/deploy-contract-at.ts rename packages/hardhat-plugin/test/execution/{deploy-from-artifact.ts => deploy-contract-from-artifact.ts} (92%) rename packages/hardhat-plugin/test/execution/{minimal-contract-deploy.ts => deploy-contract.ts} (93%) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 55f260ebfc..4dcc049f5c 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -5,7 +5,16 @@ import type { } from "../types/module"; import type { IgnitionModuleDefinition } from "../types/module-builder"; -import { isContractFuture } from "../type-guards"; +import { IgnitionError } from "../../errors"; +import { + isArtifactContractAtFuture, + isArtifactContractDeploymentFuture, + isArtifactLibraryDeploymentFuture, + isContractFuture, + isNamedContractAtFuture, + isNamedContractDeploymentFuture, + isNamedLibraryDeploymentFuture, +} from "../type-guards"; import { Artifact, ArtifactResolver } from "../types/artifact"; import { DeployConfig, DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; @@ -123,8 +132,11 @@ export class Deployer { ); if (reconciliationResult.reconciliationFailures.length > 0) { - // TODO: Provide more information - throw new Error("Reconciliation failed"); + const failures = reconciliationResult.reconciliationFailures + .map((rf) => ` ${rf.futureId} - ${rf.failure}`) + .join("\n"); + + throw new IgnitionError(`Reconciliation failed\n\n${failures}`); } if (reconciliationResult.missingExecutedFutures.length > 0) { @@ -167,11 +179,33 @@ export class Deployer { const entries: Array<[string, Artifact]> = []; for (const contract of contracts) { - const artifact = await this._artifactResolver.loadArtifact( - contract.contractName - ); + if ( + isNamedContractDeploymentFuture(contract) || + isNamedContractAtFuture(contract) || + isNamedLibraryDeploymentFuture(contract) + ) { + const artifact = await this._artifactResolver.loadArtifact( + contract.contractName + ); - entries.push([contract.id, artifact]); + entries.push([contract.id, artifact]); + + continue; + } + + if ( + isArtifactContractDeploymentFuture(contract) || + isArtifactContractAtFuture(contract) || + isArtifactLibraryDeploymentFuture(contract) + ) { + const artifact = contract.artifact; + + entries.push([contract.id, artifact]); + + continue; + } + + this._assertNeverContract(contract); } return Object.fromEntries(entries); @@ -192,4 +226,10 @@ export class Deployer { return Object.fromEntries(entries); } + + private _assertNeverContract(contract: never) { + throw new IgnitionError( + `Unexpected contract future type: ${JSON.stringify(contract)}` + ); + } } diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index cae571dcf6..4515b8caa7 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -4,6 +4,8 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArtifactContractAtFuture, + ArtifactContractDeploymentFuture, + ArtifactLibraryDeploymentFuture, ContractFuture, DeploymentFuture, FunctionCallFuture, @@ -11,6 +13,8 @@ import { FutureType, ModuleParameterRuntimeValue, NamedContractAtFuture, + NamedContractDeploymentFuture, + NamedLibraryDeploymentFuture, NamedStaticCallFuture, ReadEventArgumentFuture, RuntimeValue, @@ -150,6 +154,50 @@ export function isReadEventArgumentFuture( return future.type === FutureType.READ_EVENT_ARGUMENT; } +/** + * Returns true if future is of type NamedContractDeploymentFuture. + * + * @beta + */ +export function isNamedContractDeploymentFuture( + future: Future +): future is NamedContractDeploymentFuture { + return future.type === FutureType.NAMED_CONTRACT_DEPLOYMENT; +} + +/** + * Returns true if future is of type ArtifactContractDeploymentFuture. + * + * @beta + */ +export function isArtifactContractDeploymentFuture( + future: Future +): future is ArtifactContractDeploymentFuture { + return future.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; +} + +/** + * Returns true if future is of type NamedLibraryDeploymentFuture. + * + * @beta + */ +export function isNamedLibraryDeploymentFuture( + future: Future +): future is NamedLibraryDeploymentFuture { + return future.type === FutureType.NAMED_LIBRARY_DEPLOYMENT; +} + +/** + * Returns true if future is of type ArtifactLibraryDeploymentFuture. + * + * @beta + */ +export function isArtifactLibraryDeploymentFuture( + future: Future +): future is ArtifactLibraryDeploymentFuture { + return future.type === FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; +} + /** * Returns true if future is of type NamedContractAtFuture. * diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts new file mode 100644 index 0000000000..85deeb93ae --- /dev/null +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts @@ -0,0 +1,57 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useEphemeralIgnitionProject, +} from "../use-ignition-project"; + +/** + * Use an existingly deployed contract through the `contractAtFromArtifact` api. + * + * First deploy a working contract, then reuse it from a subsequent module + * with a passed in artifact. + */ +describe("execution - deploy contractAt from artifact", function () { + // TODO: rename back to minimal api once execution switched over + useEphemeralIgnitionProject("minimal-new-api"); + + it("should deploy a contract that is callable", async function () { + // Arrange + const moduleDefinition = defineModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); + + const fooAddress = result.foo.address; + assert.equal(fooAddress, "0x5FbDB2315678afecb367f032d93F642f64180aa3"); + + // Act + const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); + + const contractAtModuleDefinition = defineModule("FooModule", (m) => { + const atFoo = m.contractAtFromArtifact("AtFoo", fooAddress, fooArtifact); + + return { atFoo }; + }); + + const contractAtFromArtifactResult = await this.deploy( + contractAtModuleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); + + // Assert + assert.equal(await contractAtFromArtifactResult.atFoo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts new file mode 100644 index 0000000000..e6b010198a --- /dev/null +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts @@ -0,0 +1,52 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useEphemeralIgnitionProject, +} from "../use-ignition-project"; + +/** + * Use an existingly deployed contract through the `contractAt` api. + * + * First deploy a working contract, then reuse it from a subsequent module. + */ +describe("execution - deploy contract at", function () { + // TODO: rename back to minimal api once execution switched over + useEphemeralIgnitionProject("minimal-new-api"); + + it("should deploy a contract that is callable", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.deploy( + moduleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); + + const fooAddress = result.foo.address; + + assert.equal(fooAddress, "0x5FbDB2315678afecb367f032d93F642f64180aa3"); + + const contractAtModuleDefinition = defineModule("FooModule", (m) => { + const foo = m.contractAt("Foo", fooAddress); + + return { foo }; + }); + + const contractAtResult = await this.deploy( + contractAtModuleDefinition, + async (c: TestChainHelper) => { + await c.mineBlock(1); + } + ); + + assert.equal(await contractAtResult.foo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/deploy-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts similarity index 92% rename from packages/hardhat-plugin/test/execution/deploy-from-artifact.ts rename to packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts index 2ce3cac089..a483b6bd9e 100644 --- a/packages/hardhat-plugin/test/execution/deploy-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts @@ -10,7 +10,7 @@ import { /** * Deploy a contract from an artifact. */ -describe("execution - deploy from artifact", function () { +describe("execution - deploy contract from artifact", function () { // TODO: rename back to minimal api once execution switched over useEphemeralIgnitionProject("minimal-new-api"); diff --git a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts b/packages/hardhat-plugin/test/execution/deploy-contract.ts similarity index 93% rename from packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts rename to packages/hardhat-plugin/test/execution/deploy-contract.ts index 99a50a7c3c..c931572e11 100644 --- a/packages/hardhat-plugin/test/execution/minimal-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract.ts @@ -12,7 +12,7 @@ import { * * Deploy a single contract with non-problematic network */ -describe("execution - minimal contract deploy", function () { +describe("execution - deploy contract", function () { // TODO: rename back to minimal api once execution switched over useEphemeralIgnitionProject("minimal-new-api"); diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts index a6fc6d8556..bf8d9c1df1 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -12,8 +12,6 @@ import { sleep } from "./helpers"; * The intent here is to test batching. */ describe("execution - multiple batch contract deploy", function () { - this.timeout(60000); - // TODO: rename back to minimal api once execution switched over useEphemeralIgnitionProject("minimal-new-api"); From 223cda84cef5d131701b89f0ca43d0aa7036b3ab Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jul 2023 16:06:40 +0100 Subject: [PATCH 0569/1302] refactor: update examples to use new apis Update the examples to use the new api. We are removing the `create2` example as this will be dealt with by an execution strategy in the future. We are removing the `multisig` example as it was not based on a realistic use case. Resolves #325 --- examples/complete/test/Complete.js | 133 +------- examples/create2/.eslintrc.js | 14 - examples/create2/.gitignore | 9 - examples/create2/.prettierignore | 5 - examples/create2/README.md | 15 - examples/create2/contracts/Bar.sol | 6 - examples/create2/contracts/Create2Factory.sol | 21 -- examples/create2/contracts/Foo.sol | 6 - examples/create2/hardhat.config.js | 17 - .../create2/ignition/Create2FactoryModule.js | 42 --- examples/create2/package.json | 21 -- examples/create2/test/create2.test.js | 15 - examples/ens/ignition/ENS.js | 84 ++--- examples/ens/ignition/test-registrar.js | 13 +- examples/ens/test/sample-test.js | 8 +- examples/multisig/.eslintrc.js | 14 - examples/multisig/.gitignore | 9 - examples/multisig/.prettierignore | 5 - examples/multisig/README.md | 43 --- examples/multisig/contracts/Multisig.sol | 307 ------------------ examples/multisig/contracts/Owned.sol | 16 - examples/multisig/contracts/Timelock.sol | 4 - examples/multisig/hardhat.config.js | 18 - examples/multisig/ignition/MultisigModule.js | 43 --- examples/multisig/package.json | 21 -- .../multisig/scripts/confirmTransaction.js | 20 -- examples/multisig/test/Multisig.js | 79 ----- examples/sample/ignition/LockModule.js | 5 +- examples/sample/test/Lock.js | 4 +- examples/ts-sample/ignition/LockModule.ts | 11 +- examples/ts-sample/test/Lock.ts | 16 +- examples/uniswap/ignition/Uniswap.js | 95 +++--- examples/uniswap/test/uniswap-test.js | 2 +- .../execution/onchain-state-transitions.ts | 3 +- .../hardhat-plugin/src/ignition-helper.ts | 4 +- packages/hardhat-plugin/src/index.ts | 3 +- 36 files changed, 118 insertions(+), 1013 deletions(-) delete mode 100644 examples/create2/.eslintrc.js delete mode 100644 examples/create2/.gitignore delete mode 100644 examples/create2/.prettierignore delete mode 100644 examples/create2/README.md delete mode 100644 examples/create2/contracts/Bar.sol delete mode 100644 examples/create2/contracts/Create2Factory.sol delete mode 100644 examples/create2/contracts/Foo.sol delete mode 100644 examples/create2/hardhat.config.js delete mode 100644 examples/create2/ignition/Create2FactoryModule.js delete mode 100644 examples/create2/package.json delete mode 100644 examples/create2/test/create2.test.js delete mode 100644 examples/multisig/.eslintrc.js delete mode 100644 examples/multisig/.gitignore delete mode 100644 examples/multisig/.prettierignore delete mode 100644 examples/multisig/README.md delete mode 100644 examples/multisig/contracts/Multisig.sol delete mode 100644 examples/multisig/contracts/Owned.sol delete mode 100644 examples/multisig/contracts/Timelock.sol delete mode 100644 examples/multisig/hardhat.config.js delete mode 100644 examples/multisig/ignition/MultisigModule.js delete mode 100644 examples/multisig/package.json delete mode 100644 examples/multisig/scripts/confirmTransaction.js delete mode 100644 examples/multisig/test/Multisig.js diff --git a/examples/complete/test/Complete.js b/examples/complete/test/Complete.js index f1d9007e3c..3888a7941f 100644 --- a/examples/complete/test/Complete.js +++ b/examples/complete/test/Complete.js @@ -1,132 +1 @@ -const { - time, - loadFixture, -} = require("@nomicfoundation/hardhat-network-helpers"); -const { anyValue } = require("@nomicfoundation/hardhat-chai-matchers/withArgs"); -const { expect } = require("chai"); -const LockModule = require("../ignition/CompleteModule"); - -// TODO: bring back tests once execution is on new-api -describe.skip("Complete", function () { - // We define a fixture to reuse the same setup in every test. - // We use loadFixture to run this setup once, snapshot that state, - // and reset Hardhat Network to that snapshot in every test. - async function deployOneYearLockFixture() { - const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; - const ONE_GWEI = 1_000_000_000; - - const lockedAmount = ONE_GWEI; - const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; - - // Contracts are deployed using the first signer/account by default - const [owner, otherAccount] = await ethers.getSigners(); - - const { lock } = await ignition.deploy(LockModule, { - parameters: { - unlockTime, - lockedAmount, - }, - }); - - return { lock, unlockTime, lockedAmount, owner, otherAccount }; - } - - describe("Deployment", function () { - it("Should set the right unlockTime", async function () { - const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); - - expect(await lock.unlockTime()).to.equal(unlockTime); - }); - - it("Should set the right owner", async function () { - const { lock, owner } = await loadFixture(deployOneYearLockFixture); - - expect(await lock.owner()).to.equal(owner.address); - }); - - it("Should receive and store the funds to lock", async function () { - const { lock, lockedAmount } = await loadFixture( - deployOneYearLockFixture - ); - - expect(await ethers.provider.getBalance(lock.address)).to.equal( - lockedAmount - ); - }); - - it("Should fail if the unlockTime is not in the future", async function () { - // We don't use the fixture here because we want a different deployment - const latestTime = await time.latest(); - const Lock = await ethers.getContractFactory("Lock"); - await expect(Lock.deploy(latestTime, { value: 1 })).to.be.revertedWith( - "Unlock time should be in the future" - ); - }); - }); - - describe("Withdrawals", function () { - describe("Validations", function () { - it("Should revert with the right error if called too soon", async function () { - const { lock } = await loadFixture(deployOneYearLockFixture); - - await expect(lock.withdraw()).to.be.revertedWith( - "You can't withdraw yet" - ); - }); - - it("Should revert with the right error if called from another account", async function () { - const { lock, unlockTime, otherAccount } = await loadFixture( - deployOneYearLockFixture - ); - - // We can increase the time in Hardhat Network - await time.increaseTo(unlockTime); - - // We use lock.connect() to send a transaction from another account - await expect(lock.connect(otherAccount).withdraw()).to.be.revertedWith( - "You aren't the owner" - ); - }); - - it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { - const { lock, unlockTime } = await loadFixture( - deployOneYearLockFixture - ); - - // Transactions are sent using the first signer by default - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()).not.to.be.reverted; - }); - }); - - describe("Events", function () { - it("Should emit an event on withdrawals", async function () { - const { lock, unlockTime, lockedAmount } = await loadFixture( - deployOneYearLockFixture - ); - - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()) - .to.emit(lock, "Withdrawal") - .withArgs(lockedAmount, anyValue); // We accept any value as `when` arg - }); - }); - - describe("Transfers", function () { - it.skip("Should transfer the funds to the owner", async function () { - const { lock, unlockTime, lockedAmount, owner } = await loadFixture( - deployOneYearLockFixture - ); - - await time.increaseTo(unlockTime); - - await expect(lock.withdraw()).to.changeEtherBalances( - [owner, lock], - [lockedAmount, -lockedAmount] - ); - }); - }); - }); -}); +describe.skip("Complete", function () {}); diff --git a/examples/create2/.eslintrc.js b/examples/create2/.eslintrc.js deleted file mode 100644 index 89ab13dc05..0000000000 --- a/examples/create2/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - extends: ["plugin:prettier/recommended"], - parserOptions: { - ecmaVersion: "latest", - }, - env: { - es6: true, - node: true, - }, - rules: { - "no-console": "error", - }, - ignorePatterns: ["artifacts/*", "cache/*"], -}; diff --git a/examples/create2/.gitignore b/examples/create2/.gitignore deleted file mode 100644 index 36077f2884..0000000000 --- a/examples/create2/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -.env -coverage -coverage.json -typechain - -#Hardhat files -cache -artifacts diff --git a/examples/create2/.prettierignore b/examples/create2/.prettierignore deleted file mode 100644 index 6da739a76c..0000000000 --- a/examples/create2/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/artifacts -/cache -/coverage -/.nyc_output diff --git a/examples/create2/README.md b/examples/create2/README.md deleted file mode 100644 index 7f9e67be72..0000000000 --- a/examples/create2/README.md +++ /dev/null @@ -1,15 +0,0 @@ -# Create2 Example for Ignition - -This hardhat project is an example of using ignition to deploy contracts with a `create2` factory. - -## Deploying - -Currently our api isn't flexible enough to support direct cli use of `create2` factories, as we haven't yet implemented a native approach to loading bytecode. See the tests for an example of usage where we work around this constraint with async calls to read artifacts directly. - -## Test - -To run the hardhat tests using ignition: - -```shell -npm run test -``` diff --git a/examples/create2/contracts/Bar.sol b/examples/create2/contracts/Bar.sol deleted file mode 100644 index 6c4c63e33d..0000000000 --- a/examples/create2/contracts/Bar.sol +++ /dev/null @@ -1,6 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -contract Bar { - string public name = "Bar"; -} diff --git a/examples/create2/contracts/Create2Factory.sol b/examples/create2/contracts/Create2Factory.sol deleted file mode 100644 index 4038a68651..0000000000 --- a/examples/create2/contracts/Create2Factory.sol +++ /dev/null @@ -1,21 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -import "@openzeppelin/contracts/utils/Create2.sol"; - -contract Create2Factory { - event Deployed(bytes32 indexed salt, address deployed); - - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) public returns (address) { - address deployedAddress; - - deployedAddress = Create2.deploy(amount, salt, bytecode); - emit Deployed(salt, deployedAddress); - - return deployedAddress; - } -} diff --git a/examples/create2/contracts/Foo.sol b/examples/create2/contracts/Foo.sol deleted file mode 100644 index 0c13497f8f..0000000000 --- a/examples/create2/contracts/Foo.sol +++ /dev/null @@ -1,6 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -contract Foo { - string public name = "Foo"; -} diff --git a/examples/create2/hardhat.config.js b/examples/create2/hardhat.config.js deleted file mode 100644 index 1c2232b7f9..0000000000 --- a/examples/create2/hardhat.config.js +++ /dev/null @@ -1,17 +0,0 @@ -require("@ignored/hardhat-ignition"); - -/** - * @type import('hardhat/config').HardhatUserConfig - */ -module.exports = { - solidity: "0.8.5", - networks: { - hardhat: { - mining: { - // auto: false - }, - blockGasLimit: 5_000_000_000, - initialBaseFeePerGas: 1_000_000_000, - }, - }, -}; diff --git a/examples/create2/ignition/Create2FactoryModule.js b/examples/create2/ignition/Create2FactoryModule.js deleted file mode 100644 index 945e966836..0000000000 --- a/examples/create2/ignition/Create2FactoryModule.js +++ /dev/null @@ -1,42 +0,0 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); - -module.exports = buildModule("Create2Factory", (m) => { - const Create2Artifact = m.getArtifact("Create2Factory"); - const BarArtifact = m.getArtifact("Bar"); - const FooArtifact = m.getArtifact("Foo"); - - const create2 = m.contract("Create2Factory", Create2Artifact, { args: [] }); - - const fooCall = m.call(create2, "deploy", { - args: [0, toBytes32(1), FooArtifact.bytecode], - }); - - const fooEvent = m.event(create2, "Deployed", { - args: [toBytes32(1)], - after: [fooCall], - }); - - const barCall = m.call(create2, "deploy", { - args: [0, toBytes32(2), BarArtifact.bytecode], - after: [fooEvent], - }); - - const barEvent = m.event(create2, "Deployed", { - args: [toBytes32(2)], - after: [barCall], - }); - - const foo = m.contractAt("Foo", fooEvent.params.deployed, FooArtifact.abi, { - after: [fooEvent], - }); - - const bar = m.contractAt("Bar", barEvent.params.deployed, BarArtifact.abi, { - after: [barEvent], - }); - - return { create2, foo, bar }; -}); - -function toBytes32(n) { - return hre.ethers.utils.hexZeroPad(hre.ethers.utils.hexlify(n), 32); -} diff --git a/examples/create2/package.json b/examples/create2/package.json deleted file mode 100644 index 9cf31f3b44..0000000000 --- a/examples/create2/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@nomicfoundation/ignition-create2-example", - "private": true, - "version": "0.0.13", - "scripts": { - "test": "hardhat test", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", - "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" - }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0", - "prettier-plugin-solidity": "1.1.3" - }, - "dependencies": { - "@openzeppelin/contracts": "4.7.3" - } -} diff --git a/examples/create2/test/create2.test.js b/examples/create2/test/create2.test.js deleted file mode 100644 index ccfd687381..0000000000 --- a/examples/create2/test/create2.test.js +++ /dev/null @@ -1,15 +0,0 @@ -const { assert } = require("chai"); - -const Create2FactoryModule = require("../ignition/Create2FactoryModule"); - -describe("Create2", function () { - let deployResults; - - before(async () => { - deployResults = await ignition.deploy(Create2FactoryModule); - }); - - it("should return an instantiated factory", async function () { - assert.isDefined(deployResults.create2); - }); -}); diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 29fb56a96f..6d9fcee90c 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { defineModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; @@ -16,73 +16,59 @@ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; const ZERO_HASH = "0x0000000000000000000000000000000000000000000000000000000000000000"; -const setupResolver = buildModule("RESOLVER", (m) => { - const ens = m.getParam("ENS"); - const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); +const registryModule = defineModule("REGISTRY", (m) => { + const ens = m.contract("ENSRegistry"); + + return { ens }; +}); + +const resolverModule = defineModule("RESOLVER", (m) => { + const { ens } = m.useModule(registryModule); + const account = m.getAccount(0); // Setup resolver - const resolver = m.contract("PublicResolver", { - args: [ens, ZERO_ADDRESS], - }); + const resolver = m.contract("PublicResolver", [ens, ZERO_ADDRESS]); - m.call(ens, "setSubnodeOwner", { - id: "set sub-node owner for resolver", - args: [ZERO_HASH, resolverLabel, account], + m.call(ens, "setSubnodeOwner", [ZERO_HASH, resolverLabel, account], { + id: "set-subnode-owner-for-resolver", }); - m.call(ens, "setResolver", { - args: [resolverNode, resolver], - }); + m.call(ens, "setResolver", [resolverNode, resolver]); - m.call(resolver, "setAddr(bytes32,address)", { - args: [resolverNode, resolver], - }); + m.call(resolver, "setAddr(bytes32,address)", [resolverNode, resolver]); return { resolver }; }); -const setupReverseRegistrar = buildModule("REVERSEREGISTRAR", (m) => { - const ens = m.getParam("ENS"); - const resolver = m.getParam("RESOLVER"); - const account = m.getOptionalParam("ACCOUNT", m.accounts[0]); +const reverseRegistrarModule = defineModule("REVERSEREGISTRAR", (m) => { + const account = m.getAccount(0); + + const { ens } = m.useModule(registryModule); + const { resolver } = m.useModule(resolverModule); // Setup Reverse Registrar - const reverseRegistrar = m.contract("ReverseRegistrar", { - args: [ens, resolver], - }); + const reverseRegistrar = m.contract("ReverseRegistrar", [ens, resolver]); - m.call(ens, "setSubnodeOwner", { - id: "set sub-node owner reverse", - args: [ZERO_HASH, reverseLabel, account], + m.call(ens, "setSubnodeOwner", [ZERO_HASH, reverseLabel, account], { + id: "set-subnode-owner-reverse", }); - m.call(ens, "setSubnodeOwner", { - id: "set sub-node addr label", - args: [reverseTldHash, addrLabel, reverseRegistrar], - }); + m.call( + ens, + "setSubnodeOwner", + [reverseTldHash, addrLabel, reverseRegistrar], + { + id: "set-subnode-addr-label", + } + ); return { reverseRegistrar }; }); -module.exports = buildModule("ENS", (m) => { - const owner = m.accounts[0]; - - const ens = m.contract("ENSRegistry"); - - const { resolver } = m.useModule(setupResolver, { - parameters: { - ENS: ens, - ACCOUNT: owner, - }, - }); - - const { reverseRegistrar } = m.useModule(setupReverseRegistrar, { - parameters: { - ENS: ens, - RESOLVER: resolver, - ACCOUNT: owner, - }, - }); +module.exports = defineModule("ENS", (m) => { + const { ens } = m.useModule(registryModule); + const { resolver } = m.useModule(resolverModule); + const { reverseRegistrar } = m.useModule(reverseRegistrarModule); return { ens, resolver, reverseRegistrar }; }); diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js index 835e260738..34195289ba 100644 --- a/examples/ens/ignition/test-registrar.js +++ b/examples/ens/ignition/test-registrar.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { defineModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const setupENSRegistry = require("./ENS"); @@ -11,7 +11,7 @@ const ZERO_HASH = const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -module.exports = buildModule("`TEST` registrar", (m) => { +module.exports = defineModule("`TEST` registrar", (m) => { const tld = "test"; const tldHash = namehash.hash(tld); const tldLabel = labelhash(tld); @@ -19,13 +19,10 @@ module.exports = buildModule("`TEST` registrar", (m) => { const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); // Setup registrar - const registrar = m.contract("FIFSRegistrar", { - args: [ens, tldHash], - }); + const registrar = m.contract("FIFSRegistrar", [ens, tldHash]); - m.call(ens, "setSubnodeOwner", { - id: "set sub-node owner for registrar", - args: [ZERO_HASH, tldLabel, ACCOUNT_0], + m.call(ens, "setSubnodeOwner", [ZERO_HASH, tldLabel, ACCOUNT_0], { + id: "set-subnode-owner-for-registrar", }); return { ens, resolver, registrar, reverseRegistrar }; diff --git a/examples/ens/test/sample-test.js b/examples/ens/test/sample-test.js index 251fc318b6..a60ef03c11 100644 --- a/examples/ens/test/sample-test.js +++ b/examples/ens/test/sample-test.js @@ -4,13 +4,13 @@ const namehash = require("eth-ens-namehash"); const labelhash = (label) => hre.ethers.utils.keccak256(hre.ethers.utils.toUtf8Bytes(label)); -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -const ACCOUNT_1 = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; - describe("ENS", function () { it("should be able to create new subrecords", async function () { + const [{ address: ACCOUNT_0 }, { address: ACCOUNT_1 }] = + await hre.ethers.getSigners(); + // Arrange - const { ens, resolver } = await ignition.deploy(ENSModule); + const { ens, resolver } = await ignition2.deploy(ENSModule); await ens.setSubnodeOwner( namehash.hash("test"), diff --git a/examples/multisig/.eslintrc.js b/examples/multisig/.eslintrc.js deleted file mode 100644 index 8457c86dfe..0000000000 --- a/examples/multisig/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - extends: ["plugin:prettier/recommended"], - parserOptions: { - ecmaVersion: "latest", - }, - env: { - es6: true, - node: true, - }, - rules: { - "no-console": "error", - }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], -}; diff --git a/examples/multisig/.gitignore b/examples/multisig/.gitignore deleted file mode 100644 index 36077f2884..0000000000 --- a/examples/multisig/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -node_modules -.env -coverage -coverage.json -typechain - -#Hardhat files -cache -artifacts diff --git a/examples/multisig/.prettierignore b/examples/multisig/.prettierignore deleted file mode 100644 index 6da739a76c..0000000000 --- a/examples/multisig/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/artifacts -/cache -/coverage -/.nyc_output diff --git a/examples/multisig/README.md b/examples/multisig/README.md deleted file mode 100644 index 01e69fbfb5..0000000000 --- a/examples/multisig/README.md +++ /dev/null @@ -1,43 +0,0 @@ -# Multisig Example for Ignition - -This hardhat project is an example of using ignition to deploy a basic Multisig contract, send a transaction via the multisig, wait for an external confirmation, then resume the deploy to execute the confirmed transaction. - -The module demonstrates how `m.event(...)` can be used to pause deployment until after an event matching the given filter has been emitted on-chain. - -## Deploying - -To run the ignition deploy against a local hardhat node, first start the node: - -```shell -npx hardhat node -``` - -In a different tab, run the MultisigModule to deploy the multisig contract and submit a transaction: - -```shell -npx hardhat deploy MultisigModule.js --network localhost -``` - -The run should deploy and submit the transaction successfully but show the multisig/confirmation as pending and so the deployment is on `Hold`. - -Confirm the transaction (externally to the deployment) with a hardhat scripts under `./scripts`: - -```shell -npx hardhat run ./scripts/confirmTransaction.js --network localhost -``` - -The submitted transaction is now confirmed within the multisig. - -A rerun of the deployment will skip to the previously on hold `Multisig/Confirmation` step, and proceed to completion from there: - -```shell -npx hardhat deploy MultisigModule.js --network localhost -``` - -## Test - -To run the hardhat tests using ignition: - -```shell -npm run test -``` diff --git a/examples/multisig/contracts/Multisig.sol b/examples/multisig/contracts/Multisig.sol deleted file mode 100644 index d784e9b3a9..0000000000 --- a/examples/multisig/contracts/Multisig.sol +++ /dev/null @@ -1,307 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract Multisig { - event Confirmation(address indexed sender, uint indexed transactionId); - event Revocation(address indexed sender, uint indexed transactionId); - event Submission(uint indexed transactionId); - event Execution(uint indexed transactionId); - event ExecutionFailure(uint indexed transactionId); - event Deposit(address indexed sender, uint value); - event OwnerAddition(address indexed owner); - event OwnerRemoval(address indexed owner); - event RequirementChange(uint required); - - uint public constant MAX_OWNER_COUNT = 50; - - mapping(uint => Transaction) public transactions; - mapping(uint => mapping(address => bool)) public confirmations; - mapping(address => bool) public isOwner; - address[] public owners; - uint public required; - uint public transactionCount; - - struct Transaction { - address destination; - uint value; - bytes data; - bool executed; - } - - modifier onlyWallet() { - require(msg.sender == address(this)); - _; - } - - modifier ownerDoesNotExist(address owner) { - require(!isOwner[owner]); - _; - } - - modifier ownerExists(address owner) { - require(isOwner[owner]); - _; - } - - modifier transactionExists(uint transactionId) { - require(transactions[transactionId].destination != address(0)); - _; - } - - modifier confirmed(uint transactionId, address owner) { - require(confirmations[transactionId][owner]); - _; - } - - modifier notConfirmed(uint transactionId, address owner) { - require(!confirmations[transactionId][owner]); - _; - } - - modifier notExecuted(uint transactionId) { - require(!transactions[transactionId].executed); - _; - } - - modifier notNull(address _address) { - require(_address != address(0)); - _; - } - - modifier validRequirement(uint ownerCount, uint _required) { - require( - ownerCount <= MAX_OWNER_COUNT && - _required <= ownerCount && - _required != 0 && - ownerCount != 0 - ); - _; - } - - receive() external payable { - if (msg.value > 0) emit Deposit(msg.sender, msg.value); - } - - constructor( - address[] memory _owners, - uint _required - ) payable validRequirement(_owners.length, _required) { - for (uint i = 0; i < _owners.length; i++) { - require(!isOwner[_owners[i]] && _owners[i] != address(0)); - isOwner[_owners[i]] = true; - } - owners = _owners; - required = _required; - } - - function addOwner( - address owner - ) - public - onlyWallet - ownerDoesNotExist(owner) - notNull(owner) - validRequirement(owners.length + 1, required) - { - isOwner[owner] = true; - owners.push(owner); - emit OwnerAddition(owner); - } - - function removeOwner(address owner) public onlyWallet ownerExists(owner) { - isOwner[owner] = false; - for (uint i = 0; i < owners.length - 1; i++) - if (owners[i] == owner) { - owners[i] = owners[owners.length - 1]; - break; - } - owners.pop(); - if (required > owners.length) changeRequirement(owners.length); - emit OwnerRemoval(owner); - } - - function replaceOwner( - address owner, - address newOwner - ) public onlyWallet ownerExists(owner) ownerDoesNotExist(newOwner) { - for (uint i = 0; i < owners.length; i++) - if (owners[i] == owner) { - owners[i] = newOwner; - break; - } - isOwner[owner] = false; - isOwner[newOwner] = true; - emit OwnerRemoval(owner); - emit OwnerAddition(newOwner); - } - - function changeRequirement( - uint _required - ) public onlyWallet validRequirement(owners.length, _required) { - required = _required; - emit RequirementChange(_required); - } - - function submitTransaction( - address destination, - uint value, - bytes memory data - ) public returns (uint transactionId) { - transactionId = addTransaction(destination, value, data); - confirmTransaction(transactionId); - } - - function confirmTransaction( - uint transactionId - ) - public - ownerExists(msg.sender) - transactionExists(transactionId) - notConfirmed(transactionId, msg.sender) - { - confirmations[transactionId][msg.sender] = true; - emit Confirmation(msg.sender, transactionId); - } - - function revokeConfirmation( - uint transactionId - ) - public - ownerExists(msg.sender) - confirmed(transactionId, msg.sender) - notExecuted(transactionId) - { - confirmations[transactionId][msg.sender] = false; - emit Revocation(msg.sender, transactionId); - } - - function executeTransaction( - uint transactionId - ) - public - ownerExists(msg.sender) - confirmed(transactionId, msg.sender) - notExecuted(transactionId) - { - if (isConfirmed(transactionId)) { - Transaction storage txn = transactions[transactionId]; - txn.executed = true; - if (external_call(txn.destination, txn.value, txn.data.length, txn.data)) - emit Execution(transactionId); - else { - emit ExecutionFailure(transactionId); - txn.executed = false; - } - } - } - - function external_call( - address destination, - uint value, - uint dataLength, - bytes memory data - ) internal returns (bool) { - bool result; - assembly { - let x := mload(0x40) // "Allocate" memory for output (0x40 is where "free memory" pointer is stored by convention) - let d := add(data, 32) // First 32 bytes are the padded length of data, so exclude that - result := call( - sub(gas(), 34710), // 34710 is the value that solidity is currently emitting - // It includes callGas (700) + callVeryLow (3, to pay for SUB) + callValueTransferGas (9000) + - // callNewAccountGas (25000, in case the destination address does not exist and needs creating) - destination, - value, - d, - dataLength, // Size of the input (in bytes) - this is what fixes the padding problem - x, - 0 // Output is ignored, therefore the output size is zero - ) - } - return result; - } - - function isConfirmed(uint transactionId) public view returns (bool) { - uint count = 0; - for (uint i = 0; i < owners.length; i++) { - if (confirmations[transactionId][owners[i]]) count += 1; - if (count == required) return true; - } - - return false; - } - - function addTransaction( - address destination, - uint value, - bytes memory data - ) internal notNull(destination) returns (uint transactionId) { - transactionId = transactionCount; - transactions[transactionId] = Transaction({ - destination: destination, - value: value, - data: data, - executed: false - }); - transactionCount += 1; - emit Submission(transactionId); - } - - function getConfirmationCount( - uint transactionId - ) public view returns (uint count) { - for (uint i = 0; i < owners.length; i++) - if (confirmations[transactionId][owners[i]]) count += 1; - } - - function getTransactionCount( - bool pending, - bool executed - ) public view returns (uint count) { - for (uint i = 0; i < transactionCount; i++) - if ( - (pending && !transactions[i].executed) || - (executed && transactions[i].executed) - ) count += 1; - } - - function getOwners() public view returns (address[] memory) { - return owners; - } - - function getConfirmations( - uint transactionId - ) public view returns (address[] memory _confirmations) { - address[] memory confirmationsTemp = new address[](owners.length); - uint count = 0; - uint i; - for (i = 0; i < owners.length; i++) - if (confirmations[transactionId][owners[i]]) { - confirmationsTemp[count] = owners[i]; - count += 1; - } - _confirmations = new address[](count); - for (i = 0; i < count; i++) _confirmations[i] = confirmationsTemp[i]; - } - - function getTransactionIds( - uint from, - uint to, - bool pending, - bool executed - ) public view returns (uint[] memory _transactionIds) { - uint[] memory transactionIdsTemp = new uint[](transactionCount); - uint count = 0; - uint i; - for (i = 0; i < transactionCount; i++) - if ( - (pending && !transactions[i].executed) || - (executed && transactions[i].executed) - ) { - transactionIdsTemp[count] = i; - count += 1; - } - _transactionIds = new uint[](to - from); - for (i = from; i < to; i++) - _transactionIds[i - from] = transactionIdsTemp[i]; - } -} diff --git a/examples/multisig/contracts/Owned.sol b/examples/multisig/contracts/Owned.sol deleted file mode 100644 index 96557cde73..0000000000 --- a/examples/multisig/contracts/Owned.sol +++ /dev/null @@ -1,16 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract Owned { - address public owner; - uint public count; - - constructor(address _owner) { - owner = _owner; - } - - function inc() public { - require(msg.sender == owner, "Only owner can inc"); - count++; - } -} diff --git a/examples/multisig/contracts/Timelock.sol b/examples/multisig/contracts/Timelock.sol deleted file mode 100644 index ceaf0a387b..0000000000 --- a/examples/multisig/contracts/Timelock.sol +++ /dev/null @@ -1,4 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -import "@openzeppelin/contracts/governance/TimelockController.sol"; diff --git a/examples/multisig/hardhat.config.js b/examples/multisig/hardhat.config.js deleted file mode 100644 index 0e8d9661a2..0000000000 --- a/examples/multisig/hardhat.config.js +++ /dev/null @@ -1,18 +0,0 @@ -require("@nomicfoundation/hardhat-toolbox"); -require("@ignored/hardhat-ignition"); - -/** - * @type import('hardhat/config').HardhatUserConfig - */ -module.exports = { - solidity: "0.8.5", - networks: { - hardhat: { - mining: { - // auto: false - }, - blockGasLimit: 5_000_000_000, - initialBaseFeePerGas: 1_000_000_000, - }, - }, -}; diff --git a/examples/multisig/ignition/MultisigModule.js b/examples/multisig/ignition/MultisigModule.js deleted file mode 100644 index e04ee882ba..0000000000 --- a/examples/multisig/ignition/MultisigModule.js +++ /dev/null @@ -1,43 +0,0 @@ -const { ethers } = require("ethers"); -const { buildModule } = require("@ignored/hardhat-ignition"); - -module.exports = buildModule("MultisigModule", (m) => { - const MultisigArtifact = m.getArtifact("Multisig"); - - const [ACCOUNT_0, ACCOUNT_1] = m.accounts; - - const owners = [ACCOUNT_0, ACCOUNT_1]; - const required = 2; - const value = ethers.utils.parseUnits("100"); - - const multisig = m.contract("Multisig", MultisigArtifact, { - args: [owners, required], - }); - - const funding = m.sendETH(multisig, { value, after: [multisig] }); - - // contract auto confirms when you submit - const call = m.call(multisig, "submitTransaction", { - args: [ACCOUNT_0, ethers.utils.parseUnits("50"), "0x00"], - after: [funding], - }); - - // second confirmation - const confirm = m.call(multisig, "confirmTransaction", { - args: [0], - after: [call], - from: ACCOUNT_1, - }); - - const event = m.event(multisig, "Confirmation", { - args: [ACCOUNT_1, 0], - after: [confirm], - }); - - m.call(multisig, "executeTransaction", { - args: [event.params.transactionId], - after: [event], - }); - - return { multisig }; -}); diff --git a/examples/multisig/package.json b/examples/multisig/package.json deleted file mode 100644 index 4444e523f3..0000000000 --- a/examples/multisig/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "@nomicfoundation/ignition-example-multisig", - "private": true, - "version": "0.0.13", - "scripts": { - "test": "hardhat test", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", - "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" - }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0", - "prettier-plugin-solidity": "1.1.3" - }, - "dependencies": { - "@openzeppelin/contracts": "^4.3.2" - } -} diff --git a/examples/multisig/scripts/confirmTransaction.js b/examples/multisig/scripts/confirmTransaction.js deleted file mode 100644 index dcd53311f2..0000000000 --- a/examples/multisig/scripts/confirmTransaction.js +++ /dev/null @@ -1,20 +0,0 @@ -async function main() { - const transactionIdToConfirm = 0; - const multisigAddress = "0x5FbDB2315678afecb367f032d93F642f64180aa3"; - - const artifact = await hre.artifacts.readArtifact("Multisig"); - const multisigInstance = await hre.ethers.getContractAt( - artifact.abi, - multisigAddress - ); - await multisigInstance.confirmTransaction(transactionIdToConfirm); - - // eslint-disable-next-line no-console - console.log(`Confirmed transaction for execution `); -} - -main().catch((error) => { - // eslint-disable-next-line no-console - console.error(error); - process.exitCode = 1; -}); diff --git a/examples/multisig/test/Multisig.js b/examples/multisig/test/Multisig.js deleted file mode 100644 index dac91e2c6e..0000000000 --- a/examples/multisig/test/Multisig.js +++ /dev/null @@ -1,79 +0,0 @@ -const { expect } = require("chai"); -const { ethers } = require("ethers"); - -const Multisig = require("../ignition/MultisigModule"); - -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -const ACCOUNT_1 = "0x70997970c51812dc3a010c7d01b50e0d17dc79c8"; - -describe("Multisig", function () { - describe("a deploy broken up by an external call", () => { - let multisig; - - this.beforeAll(async () => { - const journal = new MemoryCommandJournal(); - - try { - await ignition.deploy(Multisig, { - journal, - }); - } catch (err) { - // ignore - } - - const moduleResult = await ignition.deploy(Multisig, { - journal, - }); - - multisig = moduleResult.multisig; - }); - - it("should confirm a stored transaction", async function () { - const [isConfirmed0] = await multisig.functions.confirmations( - 0, - ACCOUNT_0 - ); - - const [isConfirmed1] = await multisig.functions.confirmations( - 0, - ACCOUNT_1 - ); - - expect(isConfirmed0).to.equal(true); - expect(isConfirmed1).to.equal(true); - }); - - it("should execute a confirmed transaction", async function () { - const submittedTx = await multisig.functions.transactions(0); - - expect(submittedTx.destination).to.equal(ACCOUNT_0); - expect(submittedTx.value.toString()).to.equal( - ethers.utils.parseUnits("50").toString() - ); - expect(submittedTx.data).to.equal("0x00"); - expect(submittedTx.executed).to.equal(true); - }); - }); -}); - -class MemoryCommandJournal { - constructor() { - this.entries = []; - } - - async record(command) { - this.entries.push(JSON.stringify(command)); - } - - async *read() { - for (const entry of this.entries) { - const command = JSON.parse(entry); - - yield command; - } - } - - clear() { - this.entries = []; - } -} diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index 940d9ffd90..336ea344e1 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -9,11 +9,10 @@ const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); module.exports = defineModule("LockModule", (m) => { const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); - // TODO: do we intend to support runtime values for value? - // const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); + const lockedAmount = m.getParameter("lockedAmount", BigInt(ONE_GWEI)); const lock = m.contract("Lock", [unlockTime], { - value: BigInt(ONE_GWEI), + value: lockedAmount, }); return { lock }; diff --git a/examples/sample/test/Lock.js b/examples/sample/test/Lock.js index d9ec652d7c..7d6d3bdc17 100644 --- a/examples/sample/test/Lock.js +++ b/examples/sample/test/Lock.js @@ -14,7 +14,7 @@ describe("Lock", function () { const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const ONE_GWEI = 1_000_000_000; - const lockedAmount = ONE_GWEI; + const lockedAmount = BigInt(ONE_GWEI); const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; // Contracts are deployed using the first signer/account by default @@ -116,7 +116,7 @@ describe("Lock", function () { }); describe("Transfers", function () { - it.skip("Should transfer the funds to the owner", async function () { + it("Should transfer the funds to the owner", async function () { const { lock, unlockTime, lockedAmount, owner } = await loadFixture( deployOneYearLockFixture ); diff --git a/examples/ts-sample/ignition/LockModule.ts b/examples/ts-sample/ignition/LockModule.ts index 7c989afbae..993317d009 100644 --- a/examples/ts-sample/ignition/LockModule.ts +++ b/examples/ts-sample/ignition/LockModule.ts @@ -1,5 +1,5 @@ +import { defineModule } from "@ignored/hardhat-ignition"; import hre from "hardhat"; -import { buildModule } from "@ignored/hardhat-ignition"; const currentTimestampInSeconds = Math.round( new Date(2023, 1, 1).valueOf() / 1000 @@ -9,12 +9,11 @@ const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); -const LockModule = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); +const LockModule = defineModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); + const lockedAmount = m.getParameter("lockedAmount", BigInt(ONE_GWEI)); - const lock = m.contract("Lock", { - args: [unlockTime], + const lock = m.contract("Lock", [unlockTime], { value: lockedAmount, }); diff --git a/examples/ts-sample/test/Lock.ts b/examples/ts-sample/test/Lock.ts index 30204900e9..4c5b87a937 100644 --- a/examples/ts-sample/test/Lock.ts +++ b/examples/ts-sample/test/Lock.ts @@ -1,7 +1,7 @@ -import { ethers, ignition } from "hardhat"; -import { time, loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { anyValue } from "@nomicfoundation/hardhat-chai-matchers/withArgs"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; import { expect } from "chai"; +import { ethers } from "hardhat"; import LockModule from "../ignition/LockModule"; @@ -13,16 +13,18 @@ describe("Lock", function () { const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const ONE_GWEI = 1_000_000_000; - const lockedAmount = ONE_GWEI; + const lockedAmount = BigInt(ONE_GWEI); const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; // Contracts are deployed using the first signer/account by default const [owner, otherAccount] = await ethers.getSigners(); - const { lock } = await ignition.deploy(LockModule, { + const { lock } = await ignition2.deploy(LockModule, { parameters: { - unlockTime, - lockedAmount, + LockModule: { + unlockTime, + lockedAmount, + }, }, }); @@ -113,7 +115,7 @@ describe("Lock", function () { }); describe("Transfers", function () { - it.skip("Should transfer the funds to the owner", async function () { + it("Should transfer the funds to the owner", async function () { const { lock, unlockTime, lockedAmount, owner } = await loadFixture( deployOneYearLockFixture ); diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js index ff00f2465b..491ce05412 100644 --- a/examples/uniswap/ignition/Uniswap.js +++ b/examples/uniswap/ignition/Uniswap.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { defineModule } = require("@ignored/hardhat-ignition"); const UniswapV3Factory = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json"); const UniswapInterfaceMulticall = require("@uniswap/v3-periphery/artifacts/contracts/lens/UniswapInterfaceMulticall.sol/UniswapInterfaceMulticall.json"); @@ -42,38 +42,45 @@ function asciiStringToBytes32(str) { return "0x" + Buffer.from(str, "ascii").toString("hex").padEnd(64, "0"); } -module.exports = buildModule("Uniswap", (m) => { - const owner = m.accounts[0]; +module.exports = defineModule("Uniswap", (m) => { + const owner = m.getAccount(0); const v2CoreFactoryAddress = ADDRESS_ZERO; const weth9 = m.contract("WETH9"); // DEPLOY_V3_CORE_FACTORY - const uniswapV3Factory = m.contract("UniswapV3Factory", UniswapV3Factory); + const uniswapV3Factory = m.contractFromArtifact( + "UniswapV3Factory", + UniswapV3Factory + ); // 1 - add-1bp-fee-tier - m.call(uniswapV3Factory, "enableFeeAmount", { - args: [ONE_BP_FEE, ONE_BP_TICK_SPACING], - }); + m.call(uniswapV3Factory, "enableFeeAmount", [ + ONE_BP_FEE, + ONE_BP_TICK_SPACING, + ]); // 2 - deploy-multicall2 - const multicall2Address = m.contract("Multicall2", UniswapInterfaceMulticall); + const multicall2Address = m.contractFromArtifact( + "Multicall2", + UniswapInterfaceMulticall + ); // DEPLOY_PROXY_ADMIN - const proxyAdmin = m.contract("ProxyAdmin", ProxyAdmin); + const proxyAdmin = m.contractFromArtifact("ProxyAdmin", ProxyAdmin); // DEPLOY_TICK_LENS - const tickLens = m.contract("TickLens", TickLens); + const tickLens = m.contractFromArtifact("TickLens", TickLens); // DEPLOY_NFT_DESCRIPTOR_LIBRARY_V1_3_0 - const nftDescriptor = m.contract("NFTDescriptor", NFTDescriptor); + const nftDescriptor = m.contractFromArtifact("NFTDescriptor", NFTDescriptor); // DEPLOY_NFT_POSITION_DESCRIPTOR_V1_3_0 - const nonfungibleTokenPositionDescriptor = m.contract( + const nonfungibleTokenPositionDescriptor = m.contractFromArtifact( "nonfungibleTokenPositionDescriptorAddressV1_3_0", NonfungibleTokenPositionDescriptor, + [weth9, asciiStringToBytes32(NATIVE_CURRENCY_LABEL)], { - args: [weth9, asciiStringToBytes32(NATIVE_CURRENCY_LABEL)], libraries: { NFTDescriptor: nftDescriptor, }, @@ -81,63 +88,55 @@ module.exports = buildModule("Uniswap", (m) => { ); // DEPLOY_TRANSPARENT_PROXY_DESCRIPTOR - const descriptorProxy = m.contract( + const descriptorProxy = m.contractFromArtifact( "TransparentUpgradeableProxy", TransparentUpgradeableProxy, - { - args: [nonfungibleTokenPositionDescriptor, proxyAdmin, "0x"], - } + [nonfungibleTokenPositionDescriptor, proxyAdmin, "0x"] ); // DEPLOY_NONFUNGIBLE_POSITION_MANAGER - const nonfungibleTokenPositionManager = m.contract( + const nonfungibleTokenPositionManager = m.contractFromArtifact( "NonfungibleTokenPositionManager", NonfungiblePositionManager, - { - args: [uniswapV3Factory, weth9, descriptorProxy], - } + [uniswapV3Factory, weth9, descriptorProxy] ); // DEPLOY_V3_MIGRATOR - const v3Migrator = m.contract("V3Migrator", V3Migrator, { - args: [uniswapV3Factory, weth9, nonfungibleTokenPositionManager], - }); + const v3Migrator = m.contractFromArtifact("V3Migrator", V3Migrator, [ + uniswapV3Factory, + weth9, + nonfungibleTokenPositionManager, + ]); // TRANSFER_V3_CORE_FACTORY_OWNER - m.call(uniswapV3Factory, "setOwner", { - args: [owner], + m.call(uniswapV3Factory, "setOwner", [owner], { after: [v3Migrator], }); // DEPLOY_V3_STAKER - const v3Staker = m.contract("UniswapV3Staker", UniswapV3Staker, { - args: [ - uniswapV3Factory, - nonfungibleTokenPositionManager, - MAX_INCENTIVE_START_LEAD_TIME, - MAX_INCENTIVE_DURATION, - ], - }); + const v3Staker = m.contractFromArtifact("UniswapV3Staker", UniswapV3Staker, [ + uniswapV3Factory, + nonfungibleTokenPositionManager, + MAX_INCENTIVE_START_LEAD_TIME, + MAX_INCENTIVE_DURATION, + ]); // DEPLOY_QUOTER_V2 - const quoterV2 = m.contract("QuoterV2", QuoterV2, { - args: [uniswapV3Factory, weth9], - }); + const quoterV2 = m.contractFromArtifact("QuoterV2", QuoterV2, [ + uniswapV3Factory, + weth9, + ]); // DEPLOY_V3_SWAP_ROUTER_02 - const swapRouter02 = m.contract("SwapRouter02", SwapRouter02, { - args: [ - v2CoreFactoryAddress, - uniswapV3Factory, - nonfungibleTokenPositionManager, - weth9, - ], - }); + const swapRouter02 = m.contractFromArtifact("SwapRouter02", SwapRouter02, [ + v2CoreFactoryAddress, + uniswapV3Factory, + nonfungibleTokenPositionManager, + weth9, + ]); // TRANSFER_PROXY_ADMIN - m.call(proxyAdmin, "transferOwnership", { - args: [owner], - }); + m.call(proxyAdmin, "transferOwnership", [owner]); return { weth9, diff --git a/examples/uniswap/test/uniswap-test.js b/examples/uniswap/test/uniswap-test.js index 9f43896d97..2c44cb803a 100644 --- a/examples/uniswap/test/uniswap-test.js +++ b/examples/uniswap/test/uniswap-test.js @@ -22,7 +22,7 @@ describe("Uniswap", function () { // Deploy Uniswap ({ nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02 } = - await ignition.deploy(UniswapModule)); + await ignition2.deploy(UniswapModule)); // Deploy example tokens Solidus and Florin const Solidus = await hre.ethers.getContractFactory("Solidus"); diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index a2207b414b..8f591a86a8 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -84,7 +84,8 @@ export const onchainStateTransitions: OnchainStateTransitions = { assertIgnitionInvariant( next === null || isOnChainResultMessage(next), `Message not in sync with onchain state - EXECUTE: ${JSON.stringify( - next + next, + serializeReplacer )}` ); diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index a1559c7a5f..b25b3cd383 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -34,7 +34,9 @@ export class IgnitionHelper { string, IgnitionModuleResult >, - { parameters = {} }: { parameters: { [key: string]: ModuleParameters } } + { parameters = {} }: { parameters: { [key: string]: ModuleParameters } } = { + parameters: {}, + } ): Promise> { const accounts = (await this._hre.network.provider.request({ method: "eth_accounts", diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 0a0880d10c..da3c63bb04 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -274,7 +274,8 @@ task("deploy2") artifactResolver, deploymentDir, moduleDefinition: userModule as any, - deploymentParameters: parameters as any, + // TODO: parameters needs properly typed with module + deploymentParameters: (parameters as any) ?? {}, accounts, verbose: logs, }); From 2d610a243303c5f7f736ddf01ac631d69d526b88 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jul 2023 15:06:00 +0100 Subject: [PATCH 0570/1302] refactor: swap new cli commands for old Replace the old commands with those that use the new-api directly. Resolves #328. --- examples/ens/test/sample-test.js | 2 +- examples/sample/test/Lock.js | 2 +- examples/ts-sample/test/Lock.ts | 2 +- examples/uniswap/test/uniswap-test.js | 2 +- packages/hardhat-plugin/src/CommandJournal.ts | 117 ------------ packages/hardhat-plugin/src/ConfigWrapper.ts | 47 ----- ...AdaptersFrom.ts => build-adapters-from.ts} | 6 +- .../src/buildIgnitionProvidersFrom.ts | 68 ------- .../hardhat-plugin/src/ignition-helper.ts | 2 +- .../hardhat-plugin/src/ignition-wrapper.ts | 174 ------------------ packages/hardhat-plugin/src/index.ts | 147 +-------------- .../hardhat-plugin/src/type-extensions.ts | 8 +- packages/hardhat-plugin/test/config.ts | 5 +- .../multiple-batch-contract-deploy.ts | 2 +- packages/hardhat-plugin/test/params.ts | 4 +- .../test/use-ignition-project.ts | 4 +- 16 files changed, 23 insertions(+), 569 deletions(-) delete mode 100644 packages/hardhat-plugin/src/CommandJournal.ts delete mode 100644 packages/hardhat-plugin/src/ConfigWrapper.ts rename packages/hardhat-plugin/src/{buildAdaptersFrom.ts => build-adapters-from.ts} (94%) delete mode 100644 packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts delete mode 100644 packages/hardhat-plugin/src/ignition-wrapper.ts diff --git a/examples/ens/test/sample-test.js b/examples/ens/test/sample-test.js index a60ef03c11..1715a08a8f 100644 --- a/examples/ens/test/sample-test.js +++ b/examples/ens/test/sample-test.js @@ -10,7 +10,7 @@ describe("ENS", function () { await hre.ethers.getSigners(); // Arrange - const { ens, resolver } = await ignition2.deploy(ENSModule); + const { ens, resolver } = await ignition.deploy(ENSModule); await ens.setSubnodeOwner( namehash.hash("test"), diff --git a/examples/sample/test/Lock.js b/examples/sample/test/Lock.js index 7d6d3bdc17..008004039e 100644 --- a/examples/sample/test/Lock.js +++ b/examples/sample/test/Lock.js @@ -20,7 +20,7 @@ describe("Lock", function () { // Contracts are deployed using the first signer/account by default const [owner, otherAccount] = await ethers.getSigners(); - const { lock } = await ignition2.deploy(LockModule, { + const { lock } = await ignition.deploy(LockModule, { parameters: { LockModule: { unlockTime, diff --git a/examples/ts-sample/test/Lock.ts b/examples/ts-sample/test/Lock.ts index 4c5b87a937..61e975d158 100644 --- a/examples/ts-sample/test/Lock.ts +++ b/examples/ts-sample/test/Lock.ts @@ -19,7 +19,7 @@ describe("Lock", function () { // Contracts are deployed using the first signer/account by default const [owner, otherAccount] = await ethers.getSigners(); - const { lock } = await ignition2.deploy(LockModule, { + const { lock } = await ignition.deploy(LockModule, { parameters: { LockModule: { unlockTime, diff --git a/examples/uniswap/test/uniswap-test.js b/examples/uniswap/test/uniswap-test.js index 2c44cb803a..9f43896d97 100644 --- a/examples/uniswap/test/uniswap-test.js +++ b/examples/uniswap/test/uniswap-test.js @@ -22,7 +22,7 @@ describe("Uniswap", function () { // Deploy Uniswap ({ nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02 } = - await ignition2.deploy(UniswapModule)); + await ignition.deploy(UniswapModule)); // Deploy example tokens Solidus and Florin const Solidus = await hre.ethers.getContractFactory("Solidus"); diff --git a/packages/hardhat-plugin/src/CommandJournal.ts b/packages/hardhat-plugin/src/CommandJournal.ts deleted file mode 100644 index 6d8e45b158..0000000000 --- a/packages/hardhat-plugin/src/CommandJournal.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { serializeReplacer } from "@ignored/ignition-core/helpers"; -import { - DeployStateExecutionCommand, - ICommandJournal, -} from "@ignored/ignition-core/soon-to-be-removed"; -import { BigNumber } from "ethers"; -import fs from "fs"; -import ndjson from "ndjson"; -import { deserializeError } from "serialize-error"; - -export class CommandJournal implements ICommandJournal { - constructor(private _chainId: number, private _path: string) {} - - public async record(command: DeployStateExecutionCommand) { - return fs.promises.appendFile( - this._path, - `${JSON.stringify( - { chainId: this._chainId, ...command }, - serializeReplacer.bind(this) - )}\n` - ); - } - - public read(): AsyncGenerator { - return this._readFromNdjsonFile(this._path); - } - - public readAll(): AsyncGenerator< - DeployStateExecutionCommand & { chainId: number }, - void, - unknown - > { - return this._readAllFromNdjsonFile(this._path); - } - - private async *_readFromNdjsonFile(ndjsonFilePath: string) { - if (!fs.existsSync(ndjsonFilePath)) { - return; - } - - const stream = fs.createReadStream(ndjsonFilePath).pipe(ndjson.parse()); - - for await (const chunk of stream) { - // TODO: we need to pull out ndjson, and come up with a different - // line level deserializer to avoid this serialize/deserialize step - const json = JSON.stringify(chunk); - const deserializedChunk = JSON.parse( - json, - this._deserializeReplace.bind(this) - ); - - if ( - !("chainId" in deserializedChunk) || - deserializedChunk.chainId !== this._chainId - ) { - continue; - } - - delete deserializedChunk.chainId; - - yield deserializedChunk as DeployStateExecutionCommand; - } - } - - private async *_readAllFromNdjsonFile(ndjsonFilePath: string) { - if (!fs.existsSync(ndjsonFilePath)) { - return; - } - - const stream = fs.createReadStream(ndjsonFilePath).pipe(ndjson.parse()); - - for await (const chunk of stream) { - // TODO: we need to pull out ndjson, and come up with a different - // line level deserializer to avoid this serialize/deserialize step - const json = JSON.stringify(chunk); - const deserializedChunk = JSON.parse( - json, - this._deserializeReplace.bind(this) - ); - - if (!("chainId" in deserializedChunk)) { - continue; - } - - yield deserializedChunk as DeployStateExecutionCommand & { - chainId: number; - }; - } - } - - private _deserializeReplace(_key: string, value: unknown) { - if (typeof value === "string" && /^\d+n$/.test(value)) { - return BigInt(value.substr(0, value.length - 1)); - } - - if (this._isSerializedBigInt(value)) { - return BigNumber.from(value.hex); - } - - if (typeof value === "object" && value !== null && "message" in value) { - return deserializeError(value); - } - - return value; - } - - private _isSerializedBigInt( - value: unknown - ): value is { type: "BigNumber"; hex: string } { - return ( - typeof value === "object" && - value !== null && - "type" in value && - (value as { type: string }).type === "BigNumber" - ); - } -} diff --git a/packages/hardhat-plugin/src/ConfigWrapper.ts b/packages/hardhat-plugin/src/ConfigWrapper.ts deleted file mode 100644 index 00dce98798..0000000000 --- a/packages/hardhat-plugin/src/ConfigWrapper.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - ConfigProvider, - ExternalParamValue, - HasParamResult, - ModuleParams, - IgnitionError, -} from "@ignored/ignition-core"; - -export class ConfigWrapper implements ConfigProvider { - public parameters: ModuleParams | undefined; - - constructor() { - this.parameters = undefined; - } - - public async setParams(parameters: ModuleParams | undefined): Promise { - this.parameters = parameters; - } - - public async getParam(paramName: string): Promise { - if (this.parameters === undefined) { - throw new IgnitionError( - `No parameters object provided to deploy options, but module requires parameter "${paramName}"` - ); - } - - return this.parameters[paramName]; - } - - public async hasParam(paramName: string): Promise { - if (this.parameters === undefined) { - return { - found: false, - errorCode: "no-params", - }; - } - - const paramFound = paramName in this.parameters; - - return paramFound - ? { found: true } - : { - found: false, - errorCode: "param-missing", - }; - } -} diff --git a/packages/hardhat-plugin/src/buildAdaptersFrom.ts b/packages/hardhat-plugin/src/build-adapters-from.ts similarity index 94% rename from packages/hardhat-plugin/src/buildAdaptersFrom.ts rename to packages/hardhat-plugin/src/build-adapters-from.ts index 63ed827d1f..d2770bd11b 100644 --- a/packages/hardhat-plugin/src/buildAdaptersFrom.ts +++ b/packages/hardhat-plugin/src/build-adapters-from.ts @@ -1,18 +1,20 @@ import { Adapters, BlocksAdapter, + GasAdapter, + SignerAdapter, TransactionsAdapter, } from "@ignored/ignition-core"; import { ethers } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; export function buildAdaptersFrom(hre: HardhatRuntimeEnvironment): Adapters { - const signerAdapter = { + const signerAdapter: SignerAdapter = { getSigner: (address: string): Promise => hre.ethers.getSigner(address), }; - const gasAdapter = { + const gasAdapter: GasAdapter = { estimateGasLimit: async ( tx: ethers.providers.TransactionRequest ): Promise => { diff --git a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts b/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts deleted file mode 100644 index 8dc30a3d73..0000000000 --- a/packages/hardhat-plugin/src/buildIgnitionProvidersFrom.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { Providers } from "@ignored/ignition-core"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; - -import { ConfigWrapper } from "./ConfigWrapper"; - -export function buildIgnitionProvidersFrom(hre: HardhatRuntimeEnvironment) { - const providers: Providers = { - artifacts: { - getArtifact: (name: string) => hre.artifacts.readArtifact(name), - hasArtifact: async (name: string) => { - try { - return await hre.artifacts.artifactExists(name); - } catch (err) { - return false; - } - }, - getAllArtifacts: async () => { - const names = await hre.artifacts.getAllFullyQualifiedNames(); - - const artifacts = await Promise.all( - names.map((n) => hre.artifacts.readArtifact(n)) - ); - - return artifacts; - }, - }, - gasProvider: { - estimateGasLimit: async (tx: any) => { - const gasLimit = await hre.ethers.provider.estimateGas(tx); - - // return 1.5x estimated gas - return gasLimit.mul(15).div(10); - }, - estimateGasPrice: async () => { - return hre.ethers.provider.getGasPrice(); - }, - }, - ethereumProvider: hre.network.provider, - transactions: { - isConfirmed: async (txHash: any) => { - const blockNumber = await hre.ethers.provider.getBlockNumber(); - const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); - if (receipt === null) { - return false; - } - - return receipt.blockNumber <= blockNumber; - }, - isMined: async (txHash: any) => { - const receipt = await hre.ethers.provider.getTransactionReceipt(txHash); - return receipt !== null; - }, - }, - config: new ConfigWrapper(), - accounts: { - getAccounts: async () => { - return (await hre.network.provider.request({ - method: "eth_accounts", - })) as string[]; - }, - getSigner: async (address) => { - return hre.ethers.getSigner(address); - }, - }, - }; - - return providers; -} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index b25b3cd383..e33d5208a8 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -11,7 +11,7 @@ import { import { Contract } from "ethers"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { buildAdaptersFrom } from "./buildAdaptersFrom"; +import { buildAdaptersFrom } from "./build-adapters-from"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; export class IgnitionHelper { diff --git a/packages/hardhat-plugin/src/ignition-wrapper.ts b/packages/hardhat-plugin/src/ignition-wrapper.ts deleted file mode 100644 index 06a1917487..0000000000 --- a/packages/hardhat-plugin/src/ignition-wrapper.ts +++ /dev/null @@ -1,174 +0,0 @@ -import type { Contract } from "ethers"; - -import { - IgnitionDeployOptions, - IgnitionError, - initializeIgnition, - Module, - ModuleDict, - ModuleParams, - Providers, - SerializedDeploymentResult, -} from "@ignored/ignition-core"; -import { - ICommandJournal, - DeploymentResult, - DeploymentResultState, -} from "@ignored/ignition-core/soon-to-be-removed"; -import { HardhatRuntimeEnvironment } from "hardhat/types"; - -import { CommandJournal } from "./CommandJournal"; -import { initializeRenderState, renderToCli } from "./ui/renderToCli"; - -type HardhatEthers = HardhatRuntimeEnvironment["ethers"]; - -type DeployResult = { - [K in keyof T]: Contract; -}; - -export type IgnitionWrapperOptions = Omit< - IgnitionDeployOptions, - keyof { force?: boolean } ->; - -/** - * Hardhat entry into Ignition. - * - * @alpha - */ -export class IgnitionWrapper { - constructor( - private _providers: Providers, - private _ethers: HardhatEthers, - public options: IgnitionWrapperOptions - ) {} - - /** - * Run a deployment of the given Ignition module. - * @param ignitionModule - the Ignition module to deploy - * @param deployParams - the configuration parameters to control the - * deployment run. - * @returns the deployed contracts as Ethers contract objects - */ - public async deploy( - ignitionModule: Module, - deployParams?: { - parameters?: ModuleParams; - journalPath?: string | undefined; - ui?: boolean; - journal?: ICommandJournal; - force?: boolean; - } - ): Promise> { - const showUi = deployParams?.ui ?? false; - const force = deployParams?.force ?? false; - - const chainId = await this._getChainId(this._providers); - - const journal = - deployParams?.journal ?? - (deployParams?.journalPath !== undefined - ? new CommandJournal(chainId, deployParams?.journalPath) - : undefined); - - const ignition = initializeIgnition({ - providers: this._providers, - uiRenderer: showUi - ? renderToCli(initializeRenderState(), deployParams?.parameters) - : undefined, - journal, - }); - - if (deployParams?.parameters !== undefined) { - await this._providers.config.setParams(deployParams.parameters); - } - - const deploymentResult = (await ignition.deploy(ignitionModule, { - ...this.options, - force, - })) as DeploymentResult; - - if (deploymentResult._kind === DeploymentResultState.HOLD) { - const heldVertexes = deploymentResult.holds; - - let heldMessage = ""; - for (const vertex of heldVertexes) { - heldMessage += ` - ${vertex.label}\n`; - } - - throw new IgnitionError( - `Execution held for module '${ignitionModule.name}':\n\n${heldMessage}` - ); - } - - if (deploymentResult._kind === DeploymentResultState.FAILURE) { - const [failureType, failures] = deploymentResult.failures; - - if (failures.length === 1) { - throw failures[0]; - } - - let failuresMessage = ""; - for (const failure of failures) { - failuresMessage += ` - ${failure.message}\n`; - } - - throw new IgnitionError( - `${failureType} for module '${ignitionModule.name}':\n\n${failuresMessage}` - ); - } - - return this._toDeploymentResult( - deploymentResult.result as any // TODO: This `as any` should be removed once we have a proper type for the result of deploy - ); - } - - /** - * Construct a plan (or dry run) describing how a deployment will be executed - * for the given module. - * - * @param ignitionModule - the Ignition module to plan out - * @returns the a description of the modules deployment, including the - * execution dependency graph. - */ - public async plan(ignitionModule: Module) { - const ignition = initializeIgnition({ - providers: this._providers, - }); - - return ignition.plan(ignitionModule); - } - - public async info(moduleName: string, journalPath: string) { - const journal = new CommandJournal(0, journalPath); - - const ignition = initializeIgnition({ - providers: this._providers, - journal, - }); - - return ignition.info(moduleName); - } - - private async _toDeploymentResult( - serializedDeploymentResult: SerializedDeploymentResult - ): Promise> { - const resolvedOutput: { [k: string]: Contract } = {}; - - for (const [key, { abi, address }] of Object.entries( - serializedDeploymentResult - )) { - resolvedOutput[key] = await this._ethers.getContractAt(abi, address); - } - - return resolvedOutput as DeployResult; - } - - private async _getChainId(providers: Providers) { - const result = await providers.ethereumProvider.request({ - method: "eth_chainId", - }); - - return Number(result); - } -} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index da3c63bb04..3ca735c612 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -14,17 +14,15 @@ import { lazyObject } from "hardhat/plugins"; import path from "path"; import prompts from "prompts"; -import { buildAdaptersFrom } from "./buildAdaptersFrom"; -import { buildIgnitionProvidersFrom } from "./buildIgnitionProvidersFrom"; +import { buildAdaptersFrom } from "./build-adapters-from"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; import { IgnitionHelper } from "./ignition-helper"; -import { IgnitionWrapper } from "./ignition-wrapper"; import { loadModule } from "./load-module"; import { writePlan } from "./plan/write-plan"; -import "./type-extensions"; -import { renderInfo } from "./ui/components/info"; import { open } from "./utils/open"; +import "./type-extensions"; + export { buildModule, defineModule } from "@ignored/ignition-core"; export interface IgnitionConfig { @@ -34,8 +32,6 @@ export interface IgnitionConfig { eventDuration: number; } -const DISPLAY_UI = process.env.DEBUG === undefined; - /* ignition config defaults */ const IGNITION_DIR = "ignition"; const DEPLOYMENTS_DIR = "deployments"; @@ -63,6 +59,7 @@ extendConfig((config, userConfig) => { /* setup core configs */ const userIgnitionConfig = userConfig.ignition ?? {}; + // TODO: this should wire into the new config config.ignition = { maxRetries: userIgnitionConfig.maxRetries ?? MAX_RETRIES, gasPriceIncrementPerRetry: @@ -76,116 +73,12 @@ extendConfig((config, userConfig) => { * Add an `ignition` object to the HRE. */ extendEnvironment((hre) => { - const providers = buildIgnitionProvidersFrom(hre); - hre.ignition = lazyObject(() => { - const isHardhatNetwork = hre.network.name === "hardhat"; - - const txPollingInterval = isHardhatNetwork ? 100 : 5000; - - return new IgnitionWrapper(providers, hre.ethers, { - ...hre.config.ignition, - txPollingInterval, - networkName: hre.network.name, - }); - }); - - hre.ignition2 = lazyObject(() => { - // const isHardhatNetwork = hre.network.name === "hardhat"; - - // TODO: rewire txPollingInterval - // const txPollingInterval = isHardhatNetwork ? 100 : 5000; - return new IgnitionHelper(hre); }); }); task("deploy") - .addPositionalParam("moduleNameOrPath") - .addOptionalParam( - "parameters", - "A JSON object as a string, of the module parameters, or a relative path to a JSON file" - ) - .addFlag("force", "restart the deployment ignoring previous history") - .setAction( - async ( - { - moduleNameOrPath, - parameters: parametersInput, - force, - }: { moduleNameOrPath: string; parameters?: string; force: boolean }, - hre - ) => { - const chainId = Number( - await hre.network.provider.request({ - method: "eth_chainId", - }) - ); - - if (chainId !== 31337) { - const prompt = await prompts({ - type: "confirm", - name: "networkConfirmation", - message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, - initial: false, - }); - - if (prompt.networkConfirmation !== true) { - console.log("Deploy cancelled"); - return; - } - } - - await hre.run("compile", { quiet: true }); - - const userModule: Module | undefined = loadModule( - hre.config.paths.ignition, - moduleNameOrPath - ); - - if (userModule === undefined) { - console.warn("No Ignition modules found"); - process.exit(0); - } - - let parameters: ModuleParams | undefined; - if (parametersInput === undefined) { - parameters = resolveParametersFromModuleName( - userModule.name, - hre.config.paths.ignition - ); - } else if (parametersInput.endsWith(".json")) { - parameters = resolveParametersFromFileName(parametersInput); - } else { - parameters = resolveParametersString(parametersInput); - } - - const isHardhatNetwork = hre.network.name === "hardhat"; - const journalPath = isHardhatNetwork - ? undefined - : resolveJournalPath(userModule.name, hre.config.paths.ignition); - - try { - await hre.ignition.deploy(userModule, { - parameters, - journalPath, - ui: DISPLAY_UI, - force, - }); - } catch (err) { - if (DISPLAY_UI) { - // display of error or on hold is done - // based on state, thrown error display - // can be ignored - process.exit(1); - } else { - throw err; - } - } - } - ); - -task("deploy2") .addPositionalParam("moduleNameOrPath") .addOptionalParam( "parameters", @@ -385,32 +278,6 @@ task("plan") ); task("ignition-info") - .addPositionalParam("moduleNameOrPath") - .setDescription("Lists the status of all deployments") - .setAction( - async ({ moduleNameOrPath }: { moduleNameOrPath: string }, hre) => { - const userModule: Module | undefined = loadModule( - hre.config.paths.ignition, - moduleNameOrPath - ); - - if (userModule === undefined) { - console.warn("No Ignition modules found"); - process.exit(0); - } - - const journalPath = resolveJournalPath( - userModule?.name, - hre.config.paths.ignition - ); - - const moduleInfo = await hre.ignition.info(userModule.name, journalPath); - - renderInfo(Object.values(moduleInfo)); - } - ); - -task("ignition-info2") .addParam("deploymentId") .addFlag("json", "format as json") .setDescription("Lists the deployed contract addresses of a deployment") @@ -511,12 +378,6 @@ function resolveConfigPath(filepath: string): ModuleParams { } } -function resolveJournalPath(moduleName: string, ignitionPath: string) { - const journalFile = `${moduleName}.journal.ndjson`; - - return path.join(ignitionPath, journalFile); -} - function resolveParametersString(paramString: string): ModuleParams { try { return JSON.parse(paramString); diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index ca376869eb..9509c0bdd2 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -2,12 +2,12 @@ import "hardhat/types/config"; import "hardhat/types/runtime"; -import type { IgnitionWrapper } from "./ignition-wrapper"; import type { IgnitionConfig } from "./index"; import { IgnitionHelper } from "./ignition-helper"; declare module "hardhat/types/config" { + // TODO: double check each of these makes sense export interface ProjectPathsUserConfig { ignition?: string; deployments?: string; @@ -29,10 +29,6 @@ declare module "hardhat/types/config" { declare module "hardhat/types/runtime" { export interface HardhatRuntimeEnvironment { - ignition: IgnitionWrapper; - } - - export interface HardhatRuntimeEnvironment { - ignition2: IgnitionHelper; + ignition: IgnitionHelper; } } diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index cc33a43a69..8b7e2e988a 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,12 +1,13 @@ /* eslint-disable import/no-unused-modules */ -import type { IgnitionWrapperOptions } from "../src/ignition-wrapper"; import { assert } from "chai"; import { BigNumber } from "ethers"; // TODO: convert these tests over once Ignition config has been updated describe.skip("config", () => { - let loadedOptions: IgnitionWrapperOptions; + // useEnvironment("with-config"); + + let loadedOptions: any; beforeEach(function () { loadedOptions = this.hre.ignition.options; diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts index bf8d9c1df1..049c5f5a1d 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -53,7 +53,7 @@ describe("execution - multiple batch contract deploy", function () { }; }); - const deployPromise = this.hre.ignition2.deploy(moduleDefinition, { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { parameters: {}, }); diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index 2dcc4062b0..6bddfa08c8 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -97,7 +97,7 @@ describe.skip("validation", () => { return { foo }; }); - const deployPromise = this.hre.ignition2.deploy(userModule); + const deployPromise = this.hre.ignition.deploy(userModule); await assert.isRejected( deployPromise, @@ -118,7 +118,7 @@ describe.skip("validation", () => { return { foo }; }); - const deployPromise = this.hre.ignition2.deploy(userModule, { + const deployPromise = this.hre.ignition.deploy(userModule, { parameters: { UserModule: { NotMyNumber: 11, diff --git a/packages/hardhat-plugin/test/use-ignition-project.ts b/packages/hardhat-plugin/test/use-ignition-project.ts index 428f2c32fa..2871eb0e7e 100644 --- a/packages/hardhat-plugin/test/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/use-ignition-project.ts @@ -10,7 +10,7 @@ import { resetHardhatContext } from "hardhat/plugins-testing"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { buildAdaptersFrom } from "../src/buildAdaptersFrom"; +import { buildAdaptersFrom } from "../src/build-adapters-from"; import { IgnitionHelper } from "../src/ignition-helper"; import { clearPendingTransactionsFromMemoryPool } from "./execution/helpers"; @@ -50,7 +50,7 @@ export function useEphemeralIgnitionProject( >, parameters: { [key: string]: ModuleParameters } = {} ) => { - return this.hre.ignition2.deploy(moduleDefinition, { + return this.hre.ignition.deploy(moduleDefinition, { parameters, }); }; From d82b229e69e1aef5e614072221b33b1799c9eb81 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 24 Jul 2023 20:57:07 +0100 Subject: [PATCH 0571/1302] refactor: remove ui from plugin --- packages/hardhat-plugin/src/index.ts | 10 +- packages/hardhat-plugin/src/load-module.ts | 4 +- .../components/ReconciliationFailedPanel.tsx | 24 -- .../src/ui/components/StartingPanel.tsx | 12 - .../ui/components/UnexpectedErrorPanel.tsx | 27 -- .../ui/components/ValidationFailedPanel.tsx | 81 ------ .../components/execution/AddressResults.tsx | 56 ----- .../components/execution/BatchExecution.tsx | 212 ---------------- .../src/ui/components/execution/Divider.tsx | 15 -- .../components/execution/ExecutionPanel.tsx | 33 --- .../ui/components/execution/FinalStatus.tsx | 230 ------------------ .../components/execution/ModuleParameters.tsx | 36 --- .../ui/components/execution/NetworkInfo.tsx | 16 -- .../components/execution/SummarySection.tsx | 29 --- .../src/ui/components/execution/views.ts | 16 -- .../src/ui/components/index.tsx | 35 --- .../ui/components/info/ModuleInfoPanel.tsx | 82 ------- .../src/ui/components/info/index.tsx | 21 -- .../hardhat-plugin/src/ui/renderToCli.tsx | 64 ----- packages/hardhat-plugin/src/ui/types.ts | 198 --------------- 20 files changed, 6 insertions(+), 1195 deletions(-) delete mode 100644 packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/StartingPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/Divider.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/views.ts delete mode 100644 packages/hardhat-plugin/src/ui/components/index.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/info/index.tsx delete mode 100644 packages/hardhat-plugin/src/ui/renderToCli.tsx delete mode 100644 packages/hardhat-plugin/src/ui/types.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3ca735c612..3d4182d2b5 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,8 +1,6 @@ import { deploy, - Module, ModuleConstructor, - ModuleDict, ModuleParams, wipe, } from "@ignored/ignition-core"; @@ -125,7 +123,7 @@ task("deploy") await hre.run("compile", { quiet: true }); - const userModule: Module | undefined = loadModule( + const userModule: any | undefined = loadModule( hre.config.paths.ignition, moduleNameOrPath ); @@ -135,7 +133,7 @@ task("deploy") process.exit(0); } - let parameters: ModuleParams | undefined; + let parameters: any | undefined; if (parametersInput === undefined) { parameters = resolveParametersFromModuleName( userModule.name, @@ -363,13 +361,13 @@ function resolveParametersFromModuleName( : undefined; } -function resolveParametersFromFileName(fileName: string): ModuleParams { +function resolveParametersFromFileName(fileName: string): any { const filepath = path.resolve(process.cwd(), fileName); return resolveConfigPath(filepath); } -function resolveConfigPath(filepath: string): ModuleParams { +function resolveConfigPath(filepath: string): any { try { return require(filepath); } catch { diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index f2823e5c3c..53e2939bda 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,4 +1,4 @@ -import { Module, ModuleDict, IgnitionError } from "@ignored/ignition-core"; +import { IgnitionError } from "@ignored/ignition-core"; import setupDebug from "debug"; import fsExtra from "fs-extra"; import path from "path"; @@ -8,7 +8,7 @@ const debug = setupDebug("hardhat-ignition:modules"); export function loadModule( modulesDirectory: string, moduleNameOrPath: string -): Module | undefined { +): any | undefined { debug(`Loading user modules from '${modulesDirectory}'`); if (!fsExtra.existsSync(modulesDirectory)) { diff --git a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx deleted file mode 100644 index 52d75665f0..0000000000 --- a/packages/hardhat-plugin/src/ui/components/ReconciliationFailedPanel.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text } from "ink"; - -export const ReconciliationFailedPanel = ({ - deployState, -}: { - deployState: DeployState; -}) => { - return ( - - - Ignition cannot rerun the module{" "} - {deployState.details.moduleName}, it has been altered - since the last run. - - - - - Remove the journal file to restart the deployment from a clean state. - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx b/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx deleted file mode 100644 index 0a1b247973..0000000000 --- a/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Box, Text } from "ink"; -import Spinner from "ink-spinner"; - -export const StartingPanel = () => { - return ( - - - Ignition starting - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx b/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx deleted file mode 100644 index 841466986a..0000000000 --- a/packages/hardhat-plugin/src/ui/components/UnexpectedErrorPanel.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text } from "ink"; - -export const UnexpectedErrorPanel = ({ - deployState, -}: { - deployState: DeployState; -}) => { - return ( - - - Ignition failed with an error for{" "} - {deployState.details.moduleName} - - - - {deployState.unexpected.errors.map((err, i) => ( - - ))} - - - ); -}; - -export const ErrorBox = ({ error }: { error: Error }) => { - return {error.message}; -}; diff --git a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx b/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx deleted file mode 100644 index 30d7b19527..0000000000 --- a/packages/hardhat-plugin/src/ui/components/ValidationFailedPanel.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import { IgnitionValidationError } from "@ignored/ignition-core"; -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text } from "ink"; -import { relative } from "path"; - -export const ValidationFailedPanel = ({ - deployState, -}: { - deployState: DeployState; -}) => { - return ( - - - Ignition validation failed for module{" "} - {deployState.details.moduleName} - - - - {deployState.validation.errors.map((err, i) => ( - - ))} - - - ); -}; - -export const ErrorBox: React.FC<{ error: Error }> = ({ error }) => { - return ( - - - error:{" "} - {error.message} - - ); -}; - -export const ErrorFileLocation: React.FC<{ error: Error }> = ({ error }) => { - if (!(error instanceof IgnitionValidationError)) { - return null; - } - - const { file, line, column } = parseFileLink(error); - - if (file === "") { - return null; - } - - return ( - - {file}: - {line}: - {column} - - ); -}; - -const parseFileLink = ( - error: Error -): { file: string; line: string; column: string } => { - try { - // @ts-ignore - // eslint-disable-next-line no-console - const stack = error.stack.split("\n")[1]; - - const regexp = /\s*at Object.action \D([^:]+):([^:]+):([^:]+)\)$/gm; - const matches = stack.matchAll(regexp); - - let file: string = ""; - let line: string = ""; - let column: string = ""; - - for (const match of matches) { - file = match[1]; - line = match[2]; - column = match[3]; - } - - return { file: relative(process.cwd(), file), line, column }; - } catch { - return { file: "", line: "", column: "" }; - } -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx deleted file mode 100644 index e98bd9692a..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { viewExecutionResults } from "@ignored/ignition-core/helpers"; -import { - DeployState, - VertexResultEnum, -} from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Spacer, Text } from "ink"; - -import { AddressMap } from "../../types"; - -import { NetworkInfo } from "./NetworkInfo"; - -export const AddressResults = ({ - deployState, -}: { - deployState: DeployState; -}) => { - const addressMap = resolveDeployAddresses(deployState); - - const networkInfo = { - chainId: deployState.details.chainId, - networkName: deployState.details.networkName, - }; - - return ( - - - Deployed Addresses - - - - - {...Object.entries(addressMap).map(([label, address]) => ( - - {label} {`->`} {address} - - ))} - - ); -}; - -const resolveDeployAddresses = (deployState: DeployState) => { - const addressMap: AddressMap = {}; - - for (const value of viewExecutionResults(deployState).values()) { - if ( - value !== undefined && - value._kind === VertexResultEnum.SUCCESS && - "name" in value.result && - "address" in value.result - ) { - addressMap[value.result.name] = value.result.address; - } - } - - return addressMap; -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx deleted file mode 100644 index 261201f3df..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ /dev/null @@ -1,212 +0,0 @@ -import { IgnitionError } from "@ignored/ignition-core"; -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text } from "ink"; -import Spinner from "ink-spinner"; - -import { UiBatch, UiVertex, UiVertexStatus } from "../../types"; - -import { Divider } from "./Divider"; - -export const BatchExecution = ({ - deployState, -}: { - deployState: DeployState; -}) => { - const batches = resolveBatchesFrom(deployState); - - if (batches.length === 0) { - return null; - } - - return ( - <> - - - - {deployState.phase === "execution" ? ( - <> - - Executing - - - ) : ( - <> - Executed - - )} - - - {batches.map((batch, i) => ( - - ))} - - ); -}; - -const Batch = ({ batch }: { batch: UiBatch }) => { - const borderColor = resolveBatchBorderColor(batch.vertexes); - - return ( - - - #{batch.batchCount} - - - {batch.vertexes.map((vertex, i) => ( - - ))} - - ); -}; - -const Vertex = ({ vertex }: { vertex: UiVertex }) => { - const { borderColor, borderStyle, textColor } = resolveVertexColors(vertex); - - return ( - - - {vertex.label} - - ); -}; - -const StatusBadge = ({ vertex }: { vertex: UiVertex }) => { - let badge: any = " "; - switch (vertex.status) { - case "COMPELETED": - badge = ; - break; - case "ERRORED": - badge = ; - break; - case "HELD": - badge = 🔶; - break; - case "RUNNING": - badge = ; - break; - } - - return ( - <> - - {badge} - - - ); -}; - -function resolveBatchBorderColor(vertexes: UiVertex[]) { - if (vertexes.some((v) => v.status === "RUNNING")) { - return "lightgray"; - } - - if (vertexes.some((v) => v.status === "ERRORED")) { - return "red"; - } - - if (vertexes.some((v) => v.status === "HELD")) { - return "yellow"; - } - - if (vertexes.every((v) => v.status === "COMPELETED")) { - return "green"; - } - - return "lightgray"; -} - -function resolveVertexColors(vertex: UiVertex): { - borderColor: string; - borderStyle: "single" | "classic" | "bold" | "singleDouble"; - textColor: string; -} { - switch (vertex.status) { - case "COMPELETED": - return { - borderColor: "greenBright", - borderStyle: "single", - textColor: "white", - }; - case "RUNNING": - return { - borderColor: "lightgray", - borderStyle: "singleDouble", - textColor: "white", - }; - case "HELD": - return { - borderColor: "yellow", - borderStyle: "bold", - textColor: "white", - }; - case "ERRORED": - return { - borderColor: "redBright", - borderStyle: "bold", - textColor: "white", - }; - } -} - -const resolveBatchesFrom = (deployState: DeployState): UiBatch[] => { - const stateBatches = - deployState.execution.batch !== null - ? [ - ...deployState.execution.previousBatches, - deployState.execution.batch.keys(), - ] - : deployState.execution.previousBatches; - - return stateBatches.map((sb, i) => ({ - batchCount: i, - vertexes: [...sb] - .sort() - .map((vertexId): UiVertex | null => { - const vertex = - deployState.transform.executionGraph?.vertexes.get(vertexId); - - if (vertex === undefined) { - return null; - } - - const uiVertex: UiVertex = { - id: vertex.id, - label: vertex.label, - type: vertex.type, - status: determineStatusOf(deployState, vertex.id), - }; - - return uiVertex; - }) - .filter((v): v is UiVertex => v !== null), - })); -}; - -const determineStatusOf = ( - deployState: DeployState, - vertexId: number -): UiVertexStatus => { - const execution = deployState.execution; - - if (execution.vertexes[vertexId]?.status === "RUNNING") { - return "RUNNING"; - } - - if (execution.vertexes[vertexId]?.status === "FAILED") { - return "ERRORED"; - } - - if (execution.vertexes[vertexId]?.status === "HOLD") { - return "HELD"; - } - - if (execution.vertexes[vertexId]?.status === "COMPLETED") { - return "COMPELETED"; - } - - throw new IgnitionError(`Unable to determine vertex status for ${vertexId}`); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx b/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx deleted file mode 100644 index b4a26f474c..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Box, Text } from "ink"; - -export const Divider = () => { - return ( - - - - {Array.from({ length: 400 }) - .map((_i) => "─") - .join("")} - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx deleted file mode 100644 index 177f7609d9..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import type { ModuleParams } from "@ignored/ignition-core"; - -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box } from "ink"; - -import { BatchExecution } from "./BatchExecution"; -import { FinalStatus } from "./FinalStatus"; -import { SummarySection } from "./SummarySection"; -import { viewEverthingExecutedAlready } from "./views"; - -export const ExecutionPanel = ({ - deployState, - moduleParams, -}: { - deployState: DeployState; - moduleParams?: ModuleParams; -}) => { - if (viewEverthingExecutedAlready(deployState)) { - return ( - - - - ); - } - - return ( - - - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx deleted file mode 100644 index dcb811703d..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ /dev/null @@ -1,230 +0,0 @@ -import { viewExecutionResults } from "@ignored/ignition-core/helpers"; -import { - DeployState, - ExecutionVertex, - VertexResultEnum, -} from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text } from "ink"; - -import { DeploymentError, DeploymentHold } from "../../types"; - -import { AddressResults } from "./AddressResults"; -import { Divider } from "./Divider"; -import { viewEverthingExecutedAlready } from "./views"; - -export const FinalStatus = ({ deployState }: { deployState: DeployState }) => { - if (deployState.phase === "complete") { - if (viewEverthingExecutedAlready(deployState)) { - return ( - - - - - Nothing new to deploy, everything deployed on a previous run of{" "} - {deployState.details.moduleName} - - - - - - - ); - } - - return ( - - - - - 🚀 Deployment Complete for module{" "} - {deployState.details.moduleName} - - - - - - - ); - } - - if (deployState.phase === "hold") { - const deploymentHolds: DeploymentHold[] = getDeploymentHolds(deployState); - - return ( - - - - - - 🟡 {deployState.details.moduleName}{" "} - deployment{" "} - - on hold - - - - - - {deploymentHolds.map((dh) => ( - - ))} - - - ); - } - - if (deployState.phase === "failed") { - const deploymentErrors: DeploymentError[] = - getDeploymentErrors(deployState); - - return ( - - - - - - ⛔ {deployState.details.moduleName}{" "} - deployment{" "} - - failed - - - - - - {deploymentErrors.map((de) => ( - - ))} - - - ); - } - - return null; -}; - -const getDeploymentErrors = (deployState: DeployState): DeploymentError[] => { - const executionResults = viewExecutionResults(deployState); - - return Object.entries(deployState.execution.vertexes) - .filter(([_id, v]) => v.status === "FAILED") - .map(([id]) => parseInt(id, 10)) - .map((id) => { - const vertexResult = executionResults.get(id); - - if ( - vertexResult === undefined || - vertexResult === null || - vertexResult._kind === VertexResultEnum.SUCCESS || - vertexResult._kind === VertexResultEnum.HOLD - ) { - return null; - } - - const failure = vertexResult.failure; - - const vertex = deployState.transform.executionGraph?.vertexes.get(id); - - if (vertex === undefined) { - return null; - } - - const errorDescription = buildErrorDescriptionFrom(failure, vertex); - - return errorDescription; - }) - .filter((x): x is DeploymentError => x !== null); -}; - -const getDeploymentHolds = (deployState: DeployState): DeploymentHold[] => { - return Object.entries(deployState.execution.vertexes) - .filter(([_id, v]) => v.status === "HOLD") - .map(([id]) => parseInt(id, 10)) - .map((id) => { - const vertex = deployState.transform.executionGraph?.vertexes.get(id); - - if (vertex === undefined) { - return null; - } - - const holdDescription = buildHoldDescriptionFrom(vertex); - - return holdDescription; - }) - .filter((x): x is DeploymentError => x !== null); -}; - -const buildErrorDescriptionFrom = ( - error: Error, - vertex: ExecutionVertex -): DeploymentError => { - const message = "reason" in error ? (error as any).reason : error.message; - - return { - id: vertex.id, - vertex: vertex.label, - message, - failureType: resolveFailureTypeFrom(vertex), - }; -}; - -const buildHoldDescriptionFrom = (vertex: ExecutionVertex): DeploymentHold => { - return { - id: vertex.id, - vertex: vertex.label, - event: vertex.type === "AwaitedEvent" ? vertex.event : undefined, - }; -}; - -const resolveFailureTypeFrom = (vertex: ExecutionVertex): string => { - switch (vertex.type) { - case "ContractCall": - return "Failed contract call"; - case "StaticContractCall": - return "Failed static contract call"; - case "ContractDeploy": - return "Failed contract deploy"; - case "DeployedContract": - return "-"; - case "LibraryDeploy": - return "Failed library deploy"; - case "AwaitedEvent": - return "Failed awaited event"; - case "SentETH": - return "Failed to send ETH"; - } -}; - -const DepError = ({ - deploymentError, -}: { - deploymentError: DeploymentError; -}) => { - return ( - - - {deploymentError.failureType} - {deploymentError.vertex} - - {deploymentError.message} - - ); -}; - -const DepHold = ({ deploymentHold }: { deploymentHold: DeploymentHold }) => { - if (deploymentHold.event === undefined) { - return ( - - {deploymentHold.vertex} - - ); - } - - return ( - - - {deploymentHold.vertex} waiting on event{" "} - {deploymentHold.event} - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx deleted file mode 100644 index c945c3e54a..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/ModuleParameters.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import type { ModuleParams } from "@ignored/ignition-core"; - -import { Newline, Text } from "ink"; - -export const ModuleParameters = ({ - moduleParams, -}: { - moduleParams?: ModuleParams; -}) => { - if (moduleParams === undefined) { - return null; - } - - const entries = Object.entries(moduleParams); - - if (entries.length === 0) { - return null; - } - - const params = entries.map(([key, value]) => ( - - - {key}: {value.toString()} - - - - )); - - return ( - - Module parameters: - - {...params} - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx b/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx deleted file mode 100644 index 32b069fa8a..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { Text } from "ink"; - -export const NetworkInfo = ({ - networkInfo: { chainId, networkName }, -}: { - networkInfo: { - chainId: number; - networkName: string; - }; -}) => { - return ( - - Network: {networkName} ({chainId}) - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx deleted file mode 100644 index d6e7214b2c..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { ModuleParams } from "@ignored/ignition-core"; -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; -import { Box, Text, Spacer } from "ink"; - -import { ModuleParameters } from "./ModuleParameters"; -import { NetworkInfo } from "./NetworkInfo"; - -export const SummarySection = ({ - deployState: { - details: { moduleName, ...networkInfo }, - }, - moduleParams, -}: { - deployState: DeployState; - moduleParams?: ModuleParams; -}) => { - return ( - - - - Deploying module {moduleName} - - - - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/views.ts b/packages/hardhat-plugin/src/ui/components/execution/views.ts deleted file mode 100644 index f1b6dca174..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/views.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; - -/** - * Determine whether any on-chain executions happened in this - * run. An execution that requires on-chain updates in this - * run will have batches, a lack of batches indicates nothing - * to execute or execution happened on a previous run. - * @param deployState the deploy state - * @returns whether on-chain executions happened in this run - */ -export function viewEverthingExecutedAlready(deployState: DeployState) { - return ( - deployState.execution.batch === null && - deployState.execution.previousBatches.length === 0 - ); -} diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx deleted file mode 100644 index b2487c9a91..0000000000 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { ModuleParams } from "@ignored/ignition-core"; -import { DeployState } from "@ignored/ignition-core/soon-to-be-removed"; - -import { ReconciliationFailedPanel } from "./ReconciliationFailedPanel"; -import { StartingPanel } from "./StartingPanel"; -import { UnexpectedErrorPanel } from "./UnexpectedErrorPanel"; -import { ValidationFailedPanel } from "./ValidationFailedPanel"; -import { ExecutionPanel } from "./execution/ExecutionPanel"; - -export const IgnitionUi = ({ - deployState, - moduleParams, -}: { - deployState: DeployState; - moduleParams?: ModuleParams; -}) => { - switch (deployState.phase) { - case "uninitialized": - case "validating": - return ; - case "validation-failed": - return ; - case "failed-unexpectedly": - return ; - case "reconciliation-failed": - return ; - case "execution": - case "complete": - case "failed": - case "hold": - return ( - - ); - } -}; diff --git a/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx b/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx deleted file mode 100644 index 88bbaf9a75..0000000000 --- a/packages/hardhat-plugin/src/ui/components/info/ModuleInfoPanel.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import type { - ModuleInfoData, - NetworkInfoData, - ContractInfoData, -} from "@ignored/ignition-core"; - -import { Box, Text, Spacer } from "ink"; - -export const ModuleInfoPanel = ({ data }: { data: ModuleInfoData }) => { - return ( - - - {data.moduleName} - - {divider(data.moduleName, "_", data.moduleName.length + 1)} - - - {...data.networks.map((networkData) => ( - - ))} - - ); -}; - -const StatusPanel = ({ data }: { data: NetworkInfoData }) => { - const nameWidth = getMaxStringLength( - data.contracts.map(({ contractName }) => contractName) - ); - - const statusWidth = getMaxStringLength( - data.contracts.map(({ status }) => status) - ); - - return ( - - - - {data.networkName} ({data.chainId}) - - - {divider(data.networkName)} - - - {...data.contracts.map((contract) => ( - - ))} - - ); -}; - -const StatusRow = ({ - nameWidth, - statusWidth, - data, -}: { - nameWidth: number; - statusWidth: number; - data: ContractInfoData; -}) => { - const name = data.contractName.padEnd(nameWidth); - const status = data.status.padEnd(statusWidth); - - return ( - - - {name}   {status}   {data.address} - - - ); -}; - -function divider(name: string, fill: string = "-", length?: number): string { - return new Array(length ?? name.length).fill(fill).join(""); -} - -function getMaxStringLength(strings: string[]): number { - return Math.max(...strings.map((str) => str.length)); -} diff --git a/packages/hardhat-plugin/src/ui/components/info/index.tsx b/packages/hardhat-plugin/src/ui/components/info/index.tsx deleted file mode 100644 index a54efdf879..0000000000 --- a/packages/hardhat-plugin/src/ui/components/info/index.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import type { ModuleInfoData } from "@ignored/ignition-core"; - -import { Box, render } from "ink"; - -import { ModuleInfoPanel } from "./ModuleInfoPanel"; - -export function renderInfo(data: ModuleInfoData[]) { - render(); -} - -const InfoView = ({ data }: { data: ModuleInfoData[] }) => { - return ( - - {...data.map((panelData) => ( - - - - ))} - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/renderToCli.tsx b/packages/hardhat-plugin/src/ui/renderToCli.tsx deleted file mode 100644 index 69abfdbdf0..0000000000 --- a/packages/hardhat-plugin/src/ui/renderToCli.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { ModuleParams, IgnitionError } from "@ignored/ignition-core"; -import { - DeployState, - UpdateUiAction, -} from "@ignored/ignition-core/soon-to-be-removed"; -import { render } from "ink"; - -import { IgnitionUi } from "./components"; - -interface RenderState { - rerender: null | ((node: React.ReactNode) => void); - unmount: null | (() => void); - waitUntilExit: null | (() => Promise); - clear: null | (() => void); -} - -export function initializeRenderState(): RenderState { - return { - rerender: null, - unmount: null, - waitUntilExit: null, - clear: null, - }; -} - -export function renderToCli( - renderState: RenderState, - moduleParams?: ModuleParams -): UpdateUiAction { - return (state: DeployState) => { - if (renderState.rerender === null) { - const { rerender, unmount, waitUntilExit, clear } = render( - , - { patchConsole: false } - ); - - renderState.rerender = rerender; - renderState.unmount = unmount; - renderState.waitUntilExit = waitUntilExit; - renderState.clear = clear; - - return; - } - - renderState.rerender( - - ); - }; -} - -export function unmountCli(state: RenderState): Promise { - if ( - state.unmount === null || - state.waitUntilExit === null || - state.clear === null - ) { - throw new IgnitionError("Cannot unmount with no unmount function"); - } - - state.clear(); - state.unmount(); - - return state.waitUntilExit(); -} diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts deleted file mode 100644 index a7651be611..0000000000 --- a/packages/hardhat-plugin/src/ui/types.ts +++ /dev/null @@ -1,198 +0,0 @@ -import { - DeployPhase, - ExecutionVertex, - ExecutionVertexType, - VertexVisitResultFailure, -} from "@ignored/ignition-core/soon-to-be-removed"; - -enum VertexStatusState { - SUCCESS = "success", - FAILURE = "failure", -} - -interface VertexSuccess { - status: VertexStatusState.SUCCESS; - vertex: ExecutionVertex; -} - -interface VertexFailure { - status: VertexStatusState.FAILURE; - vertex: ExecutionVertex; - error: unknown; -} - -interface Unstarted { - status: "unstarted"; - vertex: ExecutionVertex; -} - -export type VertexStatus = Unstarted | VertexSuccess | VertexFailure; - -export type UiVertexStatus = "RUNNING" | "COMPELETED" | "ERRORED" | "HELD"; -export interface UiVertex { - id: number; - label: string; - type: ExecutionVertexType; - status: UiVertexStatus; -} - -export interface UiBatch { - batchCount: number; - vertexes: UiVertex[]; -} - -export interface DeploymentError { - id: number; - vertex: string; - message: string; - failureType: string; -} - -export interface DeploymentHold { - id: number; - vertex: string; - event?: string; -} - -export class DeploymentState { - public phase: DeployPhase; - public moduleName: string; - - private executionVertexes: { [key: string]: VertexStatus }; - private order: number[]; - public batches: UiBatch[]; - private errors: { [key: number]: VertexVisitResultFailure } | undefined; - - constructor({ moduleName }: { moduleName: string }) { - this.moduleName = moduleName; - this.phase = "uninitialized"; - - this.order = []; - - this.executionVertexes = {}; - this.batches = []; - } - - public startExecutionPhase() { - this.phase = "execution"; - } - - public endExecutionPhase( - endPhase: "complete" | "failed", - errors?: { - [key: number]: VertexVisitResultFailure; - } - ) { - this.phase = endPhase; - this.errors = errors; - } - - public setBatch(batchCount: number, batch: UiBatch) { - this.batches[batchCount] = batch; - } - - public setExecutionVertexes(vertexes: ExecutionVertex[]) { - this.order = vertexes.map((v) => v.id); - - this.executionVertexes = Object.fromEntries( - vertexes.map((v): [number, Unstarted] => [ - v.id, - { status: "unstarted", vertex: v }, - ]) - ); - } - - public setExeuctionVertexAsSuccess(vertex: ExecutionVertex) { - this.executionVertexes[vertex.id] = { - vertex, - status: VertexStatusState.SUCCESS, - }; - } - - public setExecutionVertexAsFailure(vertex: ExecutionVertex, err: unknown) { - this.executionVertexes[vertex.id] = { - vertex, - status: VertexStatusState.FAILURE, - error: err, - }; - } - - public toStatus(): VertexStatus[] { - return this.order.map((id) => this.executionVertexes[id]); - } - - public executedCount(): { executed: number; total: number } { - const total = this.order.length; - const executed = Object.values(this.executionVertexes).filter( - (v) => v.status !== "unstarted" - ).length; - - return { executed, total }; - } - - public getDeploymentErrors(): DeploymentError[] { - if (this.batches.length === 0) { - return []; - } - - const lastBatch = this.batches[this.batches.length - 1]; - const errors = this.errors ?? {}; - - return Object.keys(errors) - .map((ids: string) => { - const id = parseInt(ids, 10); - - const error = errors[id]; - const vertex = lastBatch.vertexes.find((v) => v.id === id); - - if (vertex === undefined) { - return undefined; - } - - const errorDescription = this._buildErrorDescriptionFrom( - error.failure, - vertex - ); - - return errorDescription; - }) - .filter((x): x is DeploymentError => x !== undefined); - } - - private _buildErrorDescriptionFrom( - error: Error, - vertex: UiVertex - ): DeploymentError { - const message = "reason" in error ? (error as any).reason : error.message; - - return { - id: vertex.id, - vertex: vertex.label, - message, - failureType: this._resolveFailureTypeFrom(vertex), - }; - } - - private _resolveFailureTypeFrom(vertex: UiVertex): string { - switch (vertex.type) { - case "ContractCall": - return "Failed contract call"; - case "StaticContractCall": - return "Failed static contract call"; - case "ContractDeploy": - return "Failed contract deploy"; - case "DeployedContract": - return "-"; - case "LibraryDeploy": - return "Failed library deploy"; - case "AwaitedEvent": - return "Failed awaited event"; - case "SentETH": - return "Failed to send ETH"; - } - } -} - -export interface AddressMap { - [label: string]: string; -} From 05ffb4dd1895c93455fc87e3696434befa9394c9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jul 2023 15:41:25 +0100 Subject: [PATCH 0572/1302] refactor: apply import plugin to eslint --- config/eslint/eslintrc.js | 18 +++++- package-lock.json | 13 ++-- packages/core/.eslintrc.js | 6 ++ packages/core/package.json | 2 +- .../file-deployment-loader.ts | 27 ++++----- .../new-api/internal/journal/file-journal.ts | 4 +- .../new-api/internal/reconciliation/utils.ts | 1 + packages/core/test/new-api/helpers.ts | 6 +- packages/hardhat-plugin/package.json | 1 + packages/hardhat-plugin/src/index.ts | 17 +++--- packages/hardhat-plugin/src/load-module.ts | 12 ++-- .../hardhat-plugin/src/plan/write-plan.ts | 10 ++-- packages/hardhat-plugin/test/helpers.ts | 59 ------------------- packages/hardhat-plugin/test/plan/index.ts | 6 +- .../test/use-ignition-project.ts | 6 +- 15 files changed, 72 insertions(+), 116 deletions(-) diff --git a/config/eslint/eslintrc.js b/config/eslint/eslintrc.js index c8c7744f02..7aadfeeb62 100644 --- a/config/eslint/eslintrc.js +++ b/config/eslint/eslintrc.js @@ -4,15 +4,31 @@ module.exports = { es6: true, node: true, }, - extends: ["plugin:prettier/recommended"], + extends: [ + "plugin:prettier/recommended", + "plugin:import/recommended", + "plugin:import/typescript", + ], parser: "@typescript-eslint/parser", plugins: [ "@nomiclabs/eslint-plugin-hardhat-internal-rules", "eslint-plugin-import", "no-only-tests", "@typescript-eslint", + "import", ], + settings: { + "import/resolver": { + typescript: true, + node: true, + }, + }, + rules: { + "import/no-unused-modules": [ + 2, + { unusedExports: true, missingExports: true }, + ], "@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/array-type": [ "error", diff --git a/package-lock.json b/package-lock.json index 8a279aebbc..65e2f2c254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,6 +41,7 @@ "examples/create2": { "name": "@nomicfoundation/ignition-create2-example", "version": "0.0.13", + "extraneous": true, "dependencies": { "@openzeppelin/contracts": "4.7.3" }, @@ -67,6 +68,7 @@ "examples/multisig": { "name": "@nomicfoundation/ignition-example-multisig", "version": "0.0.13", + "extraneous": true, "dependencies": { "@openzeppelin/contracts": "^4.3.2" }, @@ -3172,18 +3174,10 @@ "resolved": "examples/complete", "link": true }, - "node_modules/@nomicfoundation/ignition-create2-example": { - "resolved": "examples/create2", - "link": true - }, "node_modules/@nomicfoundation/ignition-ens-example": { "resolved": "examples/ens", "link": true }, - "node_modules/@nomicfoundation/ignition-example-multisig": { - "resolved": "examples/multisig", - "link": true - }, "node_modules/@nomicfoundation/ignition-sample-example": { "resolved": "examples/sample", "link": true @@ -21051,7 +21045,7 @@ "chai-as-promised": "7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.1", + "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", @@ -21138,6 +21132,7 @@ "esbuild": "^0.15.9", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 4285f9e252..e55d632623 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -5,4 +5,10 @@ module.exports = { sourceType: "module", }, ignorePatterns: [".eslintrc.js"], + rules: { + "import/no-unused-modules": [ + 0, + { unusedExports: true, missingExports: true }, + ], + }, }; diff --git a/packages/core/package.json b/packages/core/package.json index e32074256d..b691f5b93c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -73,7 +73,7 @@ "chai-as-promised": "7.1.1", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.1", + "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 6090e2446c..f1622e4bf2 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -1,4 +1,4 @@ -import fs from "fs-extra"; +import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; import { Artifact, BuildInfo } from "../../types/artifact"; @@ -48,9 +48,9 @@ export class FileDeploymentLoader implements DeploymentLoader { return; } - await fs.ensureDir(this._paths.deploymentDir); - await fs.ensureDir(this._paths.artifactsDir); - await fs.ensureDir(this._paths.buildInfoDir); + await ensureDir(this._paths.deploymentDir); + await ensureDir(this._paths.artifactsDir); + await ensureDir(this._paths.buildInfoDir); this._deploymentDirsEnsured = true; } @@ -75,10 +75,8 @@ export class FileDeploymentLoader implements DeploymentLoader { this._paths.artifactsDir, `${futureId}.json` ); - await fs.writeFile( - artifactFilePath, - JSON.stringify(artifact, undefined, 2) - ); + + await writeFile(artifactFilePath, JSON.stringify(artifact, undefined, 2)); } public async storeBuildInfo(buildInfo: BuildInfo): Promise { @@ -89,10 +87,7 @@ export class FileDeploymentLoader implements DeploymentLoader { `${buildInfo.id}.json` ); - await fs.writeFile( - buildInfoFilePath, - JSON.stringify(buildInfo, undefined, 2) - ); + await writeFile(buildInfoFilePath, JSON.stringify(buildInfo, undefined, 2)); } public async loadArtifact(futureId: string): Promise { @@ -100,7 +95,7 @@ export class FileDeploymentLoader implements DeploymentLoader { const artifactFilePath = this._resolveArtifactPathFor(futureId); - const json = await fs.readFile(artifactFilePath); + const json = await readFile(artifactFilePath); const artifact = JSON.parse(json.toString()); @@ -114,9 +109,9 @@ export class FileDeploymentLoader implements DeploymentLoader { await this._initialize(); let deployedAddresses: { [key: string]: string }; - if (await fs.pathExists(this._paths.deployedAddressesPath)) { + if (await pathExists(this._paths.deployedAddressesPath)) { const json = ( - await fs.readFile(this._paths.deployedAddressesPath) + await readFile(this._paths.deployedAddressesPath) ).toString(); deployedAddresses = JSON.parse(json); @@ -126,7 +121,7 @@ export class FileDeploymentLoader implements DeploymentLoader { deployedAddresses[futureId] = contractAddress; - await fs.writeFile( + await writeFile( this._paths.deployedAddressesPath, `${JSON.stringify(deployedAddresses, undefined, 2)}\n` ); diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index 525f054dd4..da718bb6e0 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -1,6 +1,6 @@ /* eslint-disable no-bitwise */ import fs, { closeSync, constants, openSync, writeFileSync } from "fs"; -import ndjson from "ndjson"; +import { parse } from "ndjson"; import { Journal, JournalableMessage } from "../../types/journal"; @@ -27,7 +27,7 @@ export class FileJournal implements Journal { return; } - const stream = fs.createReadStream(this._filePath).pipe(ndjson.parse()); + const stream = fs.createReadStream(this._filePath).pipe(parse()); for await (const chunk of stream) { const json = JSON.stringify(chunk); diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index a3b0e3850d..8ba0b62b42 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -1,3 +1,4 @@ +// eslint-disable-next-line import/default import type CborT from "cbor"; import { diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 35b98d0f68..058bd49063 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,5 +1,5 @@ import { assert } from "chai"; -import ethers from "ethers"; +import { ethers, providers } from "ethers"; import { ArgumentType, Artifact, ArtifactResolver } from "../../src"; import { Deployer } from "../../src/new-api/internal/deployer"; @@ -253,7 +253,7 @@ export function setupMockChainDispatcher({ export class MockChainDispatcher implements ChainDispatcher { private _accountsState: AccountsState; - private _sentTxs: { [key: string]: ethers.providers.TransactionRequest }; + private _sentTxs: { [key: string]: providers.TransactionRequest }; private _currentBlock: number; constructor( @@ -348,7 +348,7 @@ export class MockChainDispatcher implements ChainDispatcher { _args: ArgumentType[], _value: bigint, _from: string - ): Promise { + ): Promise { const fakeTransaction = { _kind: "TEST-CALL-TRANSACTION" } as any; return fakeTransaction; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index ba456c4904..fece0ba571 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -57,6 +57,7 @@ "esbuild": "^0.15.9", "eslint": "^7.32.0", "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "3.5.5", "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3d4182d2b5..d023a936ee 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -6,11 +6,11 @@ import { } from "@ignored/ignition-core"; import "@nomiclabs/hardhat-ethers"; import { BigNumber } from "ethers"; -import fs from "fs-extra"; +import { existsSync, readdirSync, readJSONSync } from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; -import prompts from "prompts"; +import Prompt from "prompts"; import { buildAdaptersFrom } from "./build-adapters-from"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver.ts"; @@ -21,7 +21,8 @@ import { open } from "./utils/open"; import "./type-extensions"; -export { buildModule, defineModule } from "@ignored/ignition-core"; +// eslint-disable-next-line import/no-unused-modules +export { defineModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; @@ -108,7 +109,7 @@ task("deploy") ); if (chainId !== 31337) { - const prompt = await prompts({ + const prompt = await Prompt({ type: "confirm", name: "networkConfirmation", message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, @@ -297,17 +298,17 @@ task("ignition-info") "deployed_addresses.json" ); - if (!fs.existsSync(deploymentDir)) { + if (!existsSync(deploymentDir)) { console.error(`No deployment found with id ${deploymentDir}`); process.exit(1); } - if (!fs.existsSync(deployedAddressesPath)) { + if (!existsSync(deployedAddressesPath)) { console.log(`No contracts deployed`); process.exit(0); } - const deployedAddresses = fs.readJSONSync(deployedAddressesPath); + const deployedAddresses = readJSONSync(deployedAddressesPath); if (formatAsJson) { console.log(JSON.stringify(deployedAddresses, undefined, 2)); @@ -353,7 +354,7 @@ function resolveParametersFromModuleName( moduleName: string, ignitionPath: string ): ModuleParams | undefined { - const files = fs.readdirSync(ignitionPath); + const files = readdirSync(ignitionPath); const configFilename = `${moduleName}.config.json`; return files.includes(configFilename) diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 53e2939bda..cf3aa5ac7e 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,6 +1,6 @@ import { IgnitionError } from "@ignored/ignition-core"; import setupDebug from "debug"; -import fsExtra from "fs-extra"; +import { existsSync, pathExistsSync } from "fs-extra"; import path from "path"; const debug = setupDebug("hardhat-ignition:modules"); @@ -11,7 +11,7 @@ export function loadModule( ): any | undefined { debug(`Loading user modules from '${modulesDirectory}'`); - if (!fsExtra.existsSync(modulesDirectory)) { + if (!existsSync(modulesDirectory)) { throw new IgnitionError(`Directory ${modulesDirectory} not found.`); } @@ -42,12 +42,12 @@ function resolveFullPathToModule( moduleNameOrPath: string ): string | undefined { const pathToModule = path.resolve(moduleNameOrPath); - if (fsExtra.pathExistsSync(pathToModule)) { + if (pathExistsSync(pathToModule)) { return pathToModule; } const relativeToModules = path.resolve(modulesDirectory, moduleNameOrPath); - if (fsExtra.pathExistsSync(relativeToModules)) { + if (pathExistsSync(relativeToModules)) { return relativeToModules; } @@ -55,7 +55,7 @@ function resolveFullPathToModule( modulesDirectory, `${moduleNameOrPath}.js` ); - if (fsExtra.pathExistsSync(relativeToModulesWithJsExtension)) { + if (pathExistsSync(relativeToModulesWithJsExtension)) { return relativeToModulesWithJsExtension; } @@ -63,7 +63,7 @@ function resolveFullPathToModule( modulesDirectory, `${moduleNameOrPath}.ts` ); - if (fsExtra.pathExistsSync(relativeToModulesWithTsExtension)) { + if (pathExistsSync(relativeToModulesWithTsExtension)) { return relativeToModulesWithTsExtension; } diff --git a/packages/hardhat-plugin/src/plan/write-plan.ts b/packages/hardhat-plugin/src/plan/write-plan.ts index 0d6a7b908f..9f5479bd93 100644 --- a/packages/hardhat-plugin/src/plan/write-plan.ts +++ b/packages/hardhat-plugin/src/plan/write-plan.ts @@ -2,7 +2,7 @@ import { StoredDeployment, StoredDeploymentSerializer, } from "@ignored/ignition-core"; -import fs from "fs-extra"; +import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; export async function writePlan( @@ -17,7 +17,7 @@ export async function writePlan( "../dist" ); - const templateDirExists = await fs.pathExists(templateDir); + const templateDirExists = await pathExists(templateDir); if (!templateDirExists) { console.warn(`Unable to find template directory: ${templateDir}`); @@ -26,12 +26,12 @@ export async function writePlan( const planDir = path.join(cacheDir, "plan"); - await fs.ensureDir(planDir); + await ensureDir(planDir); - const indexHtml = await fs.readFile(path.join(templateDir, "index.html")); + const indexHtml = await readFile(path.join(templateDir, "index.html")); const updatedHtml = indexHtml .toString() .replace('{"unloaded":true}', JSON.stringify(serializedStoredDeployment)); - await fs.writeFile(path.join(planDir, "index.html"), updatedHtml); + await writeFile(path.join(planDir, "index.html"), updatedHtml); } diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/helpers.ts index 5c7f426db4..eb3f91ffc3 100644 --- a/packages/hardhat-plugin/test/helpers.ts +++ b/packages/hardhat-plugin/test/helpers.ts @@ -1,41 +1,3 @@ -import { buildModule, IDeploymentBuilder } from "@ignored/ignition-core"; -import { ModuleDict } from "@ignored/ignition-core/src/types/module"; - -export const resultAssertions = { - contract: (predicate?: ContractResultPredicate): ExpectedFutureResult => { - return { - kind: "contract", - predicate: predicate ?? (async () => {}), - }; - }, - transaction: (): ExpectedFutureResult => { - return { - kind: "transaction", - }; - }, -}; - -type ContractResultPredicate = (contract: any) => Promise; -type ExpectedFutureResult = - | { - kind: "contract"; - predicate: ContractResultPredicate; - } - | { - kind: "transaction"; - }; - -export async function mineBlocks( - hre: any, - expectedBlocks: number[], - finished: Promise -) { - for (const expectedPendingTxs of expectedBlocks) { - await waitForPendingTxs(hre, expectedPendingTxs, finished); - await hre.network.provider.send("evm_mine"); - } -} - const sleep = (timeout: number) => new Promise((res) => setTimeout(res, timeout)); @@ -68,24 +30,3 @@ export async function waitForPendingTxs( await sleep(50); } } - -export async function deployModule( - hre: any, - moduleDefinition: (m: IDeploymentBuilder) => ModuleDict, - options?: { parameters: {} } -): Promise { - await hre.run("compile", { quiet: true }); - - const userModule = buildModule("MyModule", moduleDefinition); - - const deployPromise = hre.ignition.deploy(userModule, { - ...options, - ui: false, - }); - - await mineBlocks(hre, [1, 1, 1], deployPromise); - - const result = await deployPromise; - - return result; -} diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 9883f06345..a940464e0d 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import fs from "fs-extra"; +import { emptyDirSync, readdir } from "fs-extra"; import path from "path"; import { useEphemeralIgnitionProject } from "../use-ignition-project"; @@ -11,7 +11,7 @@ describe("plan", () => { it("should create a plan", async function () { const planPath = path.resolve("../minimal-new-api/cache/plan"); - fs.emptyDirSync(planPath); + emptyDirSync(planPath); await this.hre.run("compile", { quiet: true }); await this.hre.run("plan", { @@ -19,7 +19,7 @@ describe("plan", () => { moduleNameOrPath: "MyModule.js", }); - const files = await fs.readdir(planPath); + const files = await readdir(planPath); assert(files.includes("index.html")); }); diff --git a/packages/hardhat-plugin/test/use-ignition-project.ts b/packages/hardhat-plugin/test/use-ignition-project.ts index 2871eb0e7e..f0595a80cc 100644 --- a/packages/hardhat-plugin/test/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/use-ignition-project.ts @@ -5,7 +5,7 @@ import { ModuleParameters, } from "@ignored/ignition-core"; import { Contract } from "ethers"; -import fs from "fs-extra"; +import { ensureDirSync, removeSync } from "fs-extra"; import { resetHardhatContext } from "hardhat/plugins-testing"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; @@ -91,7 +91,7 @@ export function useFileIgnitionProject( this.config = testConfig; - fs.ensureDirSync(deploymentDir); + ensureDirSync(deploymentDir); this.deploy = ( moduleDefinition: IgnitionModuleDefinition< @@ -113,7 +113,7 @@ export function useFileIgnitionProject( afterEach("reset hardhat context", function () { resetHardhatContext(); - fs.removeSync(this.deploymentDir); + removeSync(this.deploymentDir); }); } From 3a309d2774bcd71ae705070a53a3b7cbea08348f Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 24 Jul 2023 22:35:02 +0100 Subject: [PATCH 0573/1302] refactor: remove old tests in core And add eslint-disable to new-api tests. --- packages/core/test/buildModule.ts | 48 - packages/core/test/collectLibrariesAndLink.ts | 2 +- packages/core/test/contractsService.ts | 88 -- .../core/test/deploymentBuilder/accounts.ts | 94 -- .../core/test/deploymentBuilder/artifacts.ts | 105 -- .../test/deploymentBuilder/buildModule.ts | 49 - packages/core/test/deploymentBuilder/calls.ts | 375 ------ .../core/test/deploymentBuilder/deploy.ts | 495 -------- packages/core/test/deploymentBuilder/event.ts | 436 ------- .../core/test/deploymentBuilder/helpers.ts | 27 - .../core/test/deploymentBuilder/libraries.ts | 144 --- .../core/test/deploymentBuilder/metadata.ts | 40 - .../core/test/deploymentBuilder/parameters.ts | 65 - .../core/test/deploymentBuilder/sendETH.ts | 132 -- .../test/deploymentBuilder/staticCalls.ts | 384 ------ .../core/test/deploymentBuilder/useModule.ts | 599 --------- packages/core/test/deploymentBuilder/value.ts | 137 -- packages/core/test/execution/batching.ts | 84 -- packages/core/test/execution/dispatch.ts | 521 -------- packages/core/test/execution/rerun.ts | 471 ------- packages/core/test/graph/adjacencyList.ts | 158 --- packages/core/test/graph/helpers.ts | 37 - packages/core/test/helpers.ts | 98 -- packages/core/test/helpers/exact-interface.ts | 1 + .../core/test/helpers/getMockProviders.ts | 100 -- packages/core/test/helpers/getMockServices.ts | 98 -- .../core/test/helpers/setupIgnitionWith.ts | 26 - packages/core/test/internal/Ignition.ts | 11 - packages/core/test/new-api/batcher.ts | 1 + packages/core/test/new-api/call.ts | 1 + packages/core/test/new-api/contract.ts | 1 + packages/core/test/new-api/contractAt.ts | 1 + .../test/new-api/contractAtFromArtifact.ts | 1 + .../core/test/new-api/contractFromArtifact.ts | 1 + .../new-api/execution/execution-engine.ts | 1 + .../core/test/new-api/execution/restart.ts | 1 + .../execution/sort-futures-by-nonce.ts | 1 + packages/core/test/new-api/getAccount.ts | 1 + packages/core/test/new-api/getParameter.ts | 1 + packages/core/test/new-api/helpers.ts | 1 + packages/core/test/new-api/library.ts | 1 + .../core/test/new-api/libraryFromArtifact.ts | 1 + .../core/test/new-api/readEventArgument.ts | 1 + .../futures/reconcileArtifactContractAt.ts | 1 + .../reconcileArtifactContractDeployment.ts | 1 + .../reconcileArtifactLibraryDeployment.ts | 1 + .../futures/reconcileNamedContractAt.ts | 1 + .../futures/reconcileNamedContractCall.ts | 1 + .../reconcileNamedContractDeployment.ts | 1 + .../reconcileNamedLibraryDeployment.ts | 1 + .../futures/reconcileNamedStaticCall.ts | 1 + .../futures/reconcileReadEventArgument.ts | 1 + .../futures/reconcileSendData.ts | 1 + .../test/new-api/reconciliation/reconciler.ts | 1 + packages/core/test/new-api/send.ts | 1 + packages/core/test/new-api/staticCall.ts | 1 + .../new-api/stored-deployment-serializer.ts | 1 + .../test/new-api/types/deployment-loader.ts | 32 + packages/core/test/new-api/types/module.ts | 1 + packages/core/test/new-api/useModule.ts | 1 + .../core/test/new-api/utils/adjacency-list.ts | 1 + .../test/new-api/utils/replace-within-arg.ts | 1 + packages/core/test/new-api/wipe.ts | 1 + packages/core/test/options.ts | 132 -- packages/core/test/state-reducer/execution.ts | 351 ------ .../test/state-reducer/preparation-steps.ts | 155 --- packages/core/test/state-reducer/utils.ts | 83 -- packages/core/test/tx-sender.ts | 62 - .../core/test/util/MemoryCommandJournal.ts | 43 - packages/core/test/validation.ts | 1103 ----------------- 70 files changed, 68 insertions(+), 6752 deletions(-) delete mode 100644 packages/core/test/buildModule.ts delete mode 100644 packages/core/test/contractsService.ts delete mode 100644 packages/core/test/deploymentBuilder/accounts.ts delete mode 100644 packages/core/test/deploymentBuilder/artifacts.ts delete mode 100644 packages/core/test/deploymentBuilder/buildModule.ts delete mode 100644 packages/core/test/deploymentBuilder/calls.ts delete mode 100644 packages/core/test/deploymentBuilder/deploy.ts delete mode 100644 packages/core/test/deploymentBuilder/event.ts delete mode 100644 packages/core/test/deploymentBuilder/helpers.ts delete mode 100644 packages/core/test/deploymentBuilder/libraries.ts delete mode 100644 packages/core/test/deploymentBuilder/metadata.ts delete mode 100644 packages/core/test/deploymentBuilder/parameters.ts delete mode 100644 packages/core/test/deploymentBuilder/sendETH.ts delete mode 100644 packages/core/test/deploymentBuilder/staticCalls.ts delete mode 100644 packages/core/test/deploymentBuilder/useModule.ts delete mode 100644 packages/core/test/deploymentBuilder/value.ts delete mode 100644 packages/core/test/execution/batching.ts delete mode 100644 packages/core/test/execution/dispatch.ts delete mode 100644 packages/core/test/execution/rerun.ts delete mode 100644 packages/core/test/graph/adjacencyList.ts delete mode 100644 packages/core/test/graph/helpers.ts delete mode 100644 packages/core/test/helpers.ts delete mode 100644 packages/core/test/helpers/getMockProviders.ts delete mode 100644 packages/core/test/helpers/getMockServices.ts delete mode 100644 packages/core/test/helpers/setupIgnitionWith.ts delete mode 100644 packages/core/test/internal/Ignition.ts create mode 100644 packages/core/test/new-api/types/deployment-loader.ts delete mode 100644 packages/core/test/options.ts delete mode 100644 packages/core/test/state-reducer/execution.ts delete mode 100644 packages/core/test/state-reducer/preparation-steps.ts delete mode 100644 packages/core/test/state-reducer/utils.ts delete mode 100644 packages/core/test/tx-sender.ts delete mode 100644 packages/core/test/util/MemoryCommandJournal.ts delete mode 100644 packages/core/test/validation.ts diff --git a/packages/core/test/buildModule.ts b/packages/core/test/buildModule.ts deleted file mode 100644 index 26b7b6362c..0000000000 --- a/packages/core/test/buildModule.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../src/buildModule"; - -describe("buildModule", () => { - const values = [ - [42, "number"], - ["thanks for all the fish", "string"], - [{}, "object"], - [[], "object"], - [() => {}, "function"], - [undefined, "undefined"], - [null, "null"], - ]; - - describe("param validation", () => { - it("should only allow a string to be passed as `moduleName`", () => { - for (const [value, type] of values) { - if (type === "string") { - // @ts-ignore - assert.doesNotThrow(() => buildModule(value, () => {})); - } else { - assert.throws( - // @ts-ignore - () => buildModule(value, () => {}), - /`moduleName` must be a string/ - ); - } - } - }); - - it("should only allow a function to be passed as `moduleAction`", () => { - for (const [value, type] of values) { - if (type === "function") { - // @ts-ignore - assert.doesNotThrow(() => buildModule("", value)); - } else { - assert.throws( - // @ts-ignore - () => buildModule("", value), - /`moduleAction` must be a function/ - ); - } - } - }); - }); -}); diff --git a/packages/core/test/collectLibrariesAndLink.ts b/packages/core/test/collectLibrariesAndLink.ts index 9614024e14..7ced93fbf6 100644 --- a/packages/core/test/collectLibrariesAndLink.ts +++ b/packages/core/test/collectLibrariesAndLink.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { expect } from "chai"; -import { collectLibrariesAndLink } from "../src/internal/utils/collectLibrariesAndLink"; +import { collectLibrariesAndLink } from "../src/new-api/internal/utils/collectLibrariesAndLink"; describe("collectLibrariesAndLink", function () { describe("library linking needed", () => { diff --git a/packages/core/test/contractsService.ts b/packages/core/test/contractsService.ts deleted file mode 100644 index 62358441d1..0000000000 --- a/packages/core/test/contractsService.ts +++ /dev/null @@ -1,88 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { ContractsServiceProviders } from "../src/internal/types/services"; -import type { TxSender } from "../src/internal/utils/tx-sender"; - -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { ContractsService } from "../src/internal/services/ContractsService"; - -const txSender: TxSender = { - async send(..._) { - return "0xabc"; - }, - async sendAndReplace(..._) { - return "0xabc"; - }, -} as TxSender; - -const providersFake = { - signersProvider: { - async getDefaultSigner() { - return { - async sendTransaction(_: {}) { - return { - hash: "", - blockHash: "", - blockNumber: 0, - nonce: 0, - gasLimit: 100, - confirmations: 0, - chainId: 0, - data: "", - from: "", - } as unknown as ethers.providers.TransactionResponse; - }, - }; - }, - }, - web3Provider: { - n: 0, - async getBlockNumber() { - this.n++; - return this.n; - }, - async getTransaction() { - return { - hash: "", - nonce: 0, - gasLimit: 21000, - gasPrice: 100, - }; - }, - }, - transactionsProvider: { - async isConfirmed(_: {}) { - return false; - }, - async isMined(_: {}) { - return false; - }, - }, - gasProvider: { - async estimateGasLimit(_: {}) { - return ethers.BigNumber.from(0); - }, - async estimateGasPrice() { - return ethers.BigNumber.from(0); - }, - }, -} as unknown as ContractsServiceProviders; - -describe("ContractsService", function () { - it("should retry an unconfirmed transaction until the retry limit is hit", async function () { - const contractsService = new ContractsService(providersFake, txSender); - - const fakeTx: ethers.providers.TransactionRequest = {}; - - await assert.isRejected( - contractsService.sendTx(fakeTx, { - maxRetries: 4, - gasPriceIncrementPerRetry: null, - pollingInterval: 10, - signer: {} as any, - }), - /Transaction not confirmed within max retry limit/ - ); - }); -}); diff --git a/packages/core/test/deploymentBuilder/accounts.ts b/packages/core/test/deploymentBuilder/accounts.ts deleted file mode 100644 index a633bd6083..0000000000 --- a/packages/core/test/deploymentBuilder/accounts.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { getDeploymentVertexByLabel } from "./helpers"; - -describe("deployment builder - accounts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const accountsModule = buildModule("accounts", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange", { - from: m.accounts[1], - }); - - m.call(exchange, "addToken", { - args: [token], - value: ethers.utils.parseUnits("10"), - from: m.accounts[1], - }); - - return { token, exchange }; - }); - - const constructionResult = generateDeploymentGraphFrom(accountsModule, { - chainId: 31337, - accounts: [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - ], - artifacts: [], - }); - - if (isFailure(constructionResult)) { - assert.fail("Failure to construct deployment garph"); - } - - deploymentGraph = constructionResult.result.graph; - }); - - it("should default to the first account if not given a from parameter", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.fail("depNode not retrieved"); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - - it("should deploy with a given from address", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.fail("depNode not retrieved"); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal(depNode.from, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); - }); - - it("should call a function with a given from address", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.fail("depNode not retrieved"); - } - - if (!isCall(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal(depNode.from, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"); - }); -}); diff --git a/packages/core/test/deploymentBuilder/artifacts.ts b/packages/core/test/deploymentBuilder/artifacts.ts deleted file mode 100644 index 06ff63fd85..0000000000 --- a/packages/core/test/deploymentBuilder/artifacts.ts +++ /dev/null @@ -1,105 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { IgnitionError } from "../../src/errors"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { isArtifactContract } from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; -import { ProcessResultKind } from "../../src/types/process"; - -import { getDeploymentVertexByLabel } from "./helpers"; - -describe("deployment builder - artifacts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const artifactsModule = buildModule( - "artifacts", - (m: IDeploymentBuilder) => { - const artifact = m.getArtifact("Token"); - - const token = m.contract("Token", artifact); - - return { token }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - artifactsModule, - { - chainId: 31337, - accounts: [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - ], - artifacts: [ - { - contractName: "Token", - bytecode: "test", - abi: [], - linkReferences: {}, - }, - ], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should retrieve the stored artifact", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.fail("depNode not retrieved"); - } - - if (!isArtifactContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal(depNode.artifact.bytecode, "test"); - }); - - it("should return an error when trying to retrieve an invalid artifact", () => { - const artifactsModule = buildModule( - "artifacts", - (m: IDeploymentBuilder) => { - const artifact = m.getArtifact("None"); - - const token = m.contract("Token", artifact); - - return { token }; - } - ); - - const result = generateDeploymentGraphFrom(artifactsModule, { - chainId: 31337, - accounts: [ - "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", - ], - artifacts: [ - { - contractName: "Token", - bytecode: "test", - abi: [], - linkReferences: {}, - }, - ], - }); - - assert.deepStrictEqual(result, { - _kind: ProcessResultKind.FAILURE, - message: "Deployment graph construction failed", - failures: [new IgnitionError("Artifact None does not exist")], - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/buildModule.ts b/packages/core/test/deploymentBuilder/buildModule.ts deleted file mode 100644 index 7170de2634..0000000000 --- a/packages/core/test/deploymentBuilder/buildModule.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { IgnitionError } from "../../src/errors"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { ProcessResultKind } from "../../src/types/process"; - -describe("deployment builder - buildModule", () => { - it("should return an error if build module is given an async callback", () => { - const badAsyncModule = buildModule("BadAsyncModule", (async () => { - return {}; - }) as any); - - const result = generateDeploymentGraphFrom(badAsyncModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); - - assert.deepStrictEqual(result, { - _kind: ProcessResultKind.FAILURE, - message: "Deployment graph construction failed", - failures: [ - new IgnitionError( - "The callback passed to 'buildModule' for BadAsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'." - ), - ], - }); - }); - - it("should return error if build module throws an exception", () => { - const badAsyncModule = buildModule("BadAsyncModule", () => { - throw new IgnitionError("User thrown error"); - }); - - const result = generateDeploymentGraphFrom(badAsyncModule, { - chainId: 31337, - accounts: [], - artifacts: [], - }); - - assert.deepStrictEqual(result, { - _kind: ProcessResultKind.FAILURE, - message: "Deployment graph construction failed", - failures: [new IgnitionError("User thrown error")], - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/calls.ts b/packages/core/test/deploymentBuilder/calls.ts deleted file mode 100644 index 2c7bda1d63..0000000000 --- a/packages/core/test/deploymentBuilder/calls.ts +++ /dev/null @@ -1,375 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import { isCall, isHardhatContract } from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - calls", () => { - describe("with basic value args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange"); - const another = m.contract("Another"); - - m.call(exchange, "addToken", { - args: [token], - after: [another], - from: m.accounts[0], - }); - - return {}; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - callModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); - - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); - }); - - it("should have the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange/addToken"); - assert(isCall(depNode)); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show no dependencies for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show three dependencies for the call node Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Token", - type: "", - }, - { id: 1, label: "Exchange", type: "" }, - { id: 2, label: "Another", type: "" }, - ]); - }); - - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the contract node Exchange as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 0, - label: "Token", - type: "contract", - subtype: "hardhat", - contractName: "Token", - _future: true, - }, - ]); - }); - - it("should record the address to send from for the call node Exchange at Exchange/addToken", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); - - describe("with array args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const captureArraysContracts = m.contract("CaptureArraysContract"); - - m.call(captureArraysContracts, "recordArrays", { - args: [ - [1, 2, 3], - ["a", "b", "c"], - [true, false, true], - ], - from: m.accounts[0], - }); - - return {}; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - callModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the contract node CaptureArraysContract", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "CaptureArraysContract"); - assert(isHardhatContract(depNode)); - }); - - it("should have the call node CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "CaptureArraysContract/recordArrays"); - assert(isCall(depNode)); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show one dependencies for the call node CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "CaptureArraysContract", - type: "", - }, - ]); - }); - - it("should record the argument list for the contract node CaptureArraysContract as empty", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - [1, 2, 3], - ["a", "b", "c"], - [true, false, true], - ]); - }); - - it("should record the address to send from for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/deploy.ts b/packages/core/test/deploymentBuilder/deploy.ts deleted file mode 100644 index 1ce0f30581..0000000000 --- a/packages/core/test/deploymentBuilder/deploy.ts +++ /dev/null @@ -1,495 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - isArtifactContract, - isDeployedContract, - isHardhatContract, -} from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; -import { ArtifactOld } from "../../src/types/hardhat"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - deploy", function () { - const options = { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }; - - describe("single contract", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", { from: m.accounts[0] }); - - return { example }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - singleModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 1); - }); - - it("should have the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Example"); - }); - - it("should show no dependencies for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should record the argument list for the contract node as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the correct address to send from", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Example"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); - - describe("two unrelated contracts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const twoContractsModule = buildModule( - "two contracts", - (m: IDeploymentBuilder) => { - const example1 = m.contract("Example1"); - const example2 = m.contract("Example2"); - - return { example1, example2 }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - twoContractsModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have both contract nodes", () => { - const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); - - assert.isDefined(depNode1); - assert.equal(depNode1?.label, "Example1"); - - const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); - - assert.isDefined(depNode2); - assert.equal(depNode2?.label, "Example2"); - }); - - it("should show no dependencies either contract node", () => { - const depNode1 = getDeploymentVertexByLabel(deploymentGraph, "Example1"); - - if (depNode1 === undefined) { - return assert.isDefined(depNode1); - } - - const deps1 = getDependenciesForVertex(deploymentGraph, depNode1); - - assert.deepStrictEqual(deps1, []); - - const depNode2 = getDeploymentVertexByLabel(deploymentGraph, "Example2"); - - if (depNode2 === undefined) { - return assert.isDefined(depNode1); - } - - const deps2 = getDependenciesForVertex(deploymentGraph, depNode2); - - assert.deepStrictEqual(deps2, []); - }); - }); - - describe("contract with constructor args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const withConstructorArgsModule = buildModule( - "withConstructorArgs", - (m: IDeploymentBuilder) => { - const token = m.contract("Token", { - args: ["My Token", "TKN", 18], - }); - - return { token }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - withConstructorArgsModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have one node", () => { - assert.equal(deploymentGraph.vertexes.size, 1); - }); - - it("should have the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Token"); - }); - - it("should show no dependencies for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should record the argument list for the contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, ["My Token", "TKN", 18]); - }); - }); - - describe("dependencies between contracts", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const depsBetweenContractsModule = buildModule( - "dependenciesBetweenContracts", - (m: IDeploymentBuilder) => { - const a = m.contract("A"); - const someother = m.contract("Someother"); - - const b = m.contract("B", { - args: [a], - after: [someother], - }); - - return { a, b }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - depsBetweenContractsModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the contract node A", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "A"); - assert(isHardhatContract(depNode)); - }); - - it("should have the contract node B", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "B"); - assert(isHardhatContract(depNode)); - }); - - it("should show no dependencies for the contract node A", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show two dependencies, on A for the contract node B, on A for Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "B"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 0, label: "A", type: "" }, - { id: 1, label: "Someother", type: "" }, - ]); - }); - - it("should record the argument list for the contract node A as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "A"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - }); - - describe("existing contract", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const uniswapModule = buildModule("Uniswap", (m: IDeploymentBuilder) => { - const abi = [{}]; - const someother = m.contract("Someother"); - - const uniswap = m.contractAt("UniswapRouter", "0x123...", abi, { - after: [someother], - }); - - return { uniswap }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - uniswapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the deployed contract node", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "UniswapRouter" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "UniswapRouter"); - assert(isDeployedContract(depNode)); - }); - - it("should show one dependencies for the deployed contract node on someother", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "UniswapRouter" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); - }); - }); - - describe("deploying a contract from an artifact", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const artifact = { abi: [], bytecode: "xxx" } as any as ArtifactOld; - - const fromArtifactModule = buildModule( - "FromArtifact", - (m: IDeploymentBuilder) => { - const someother = m.contract("Someother"); - - const foo = m.contract("Foo", artifact, { - args: [0], - after: [someother], - }); - - return { foo }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - fromArtifactModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure to construct deployment graph"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the artifact contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Foo"); - assert(isArtifactContract(depNode)); - }); - - it("should show one dependency for the artifact contract node on Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Someother", - type: "", - }, - ]); - }); - - it("should record the argument list for the artifact contract node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isArtifactContract(depNode)) { - return assert.fail("Not an artifact contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, [0]); - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/event.ts b/packages/core/test/deploymentBuilder/event.ts deleted file mode 100644 index 84921b1a89..0000000000 --- a/packages/core/test/deploymentBuilder/event.ts +++ /dev/null @@ -1,436 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import { - isArtifactContract, - isAwaitedEvent, - isCall, - isHardhatContract, -} from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -const artifact = { - contractName: "Token", - abi: [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - { - indexed: false, - internalType: "uint256", - name: "value", - type: "uint256", - }, - ], - name: "SomeEvent", - type: "event", - }, - { - inputs: [], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "num", - type: "uint256", - }, - ], - name: "verify", - outputs: [], - stateMutability: "pure", - type: "function", - }, - ], - bytecode: - "608060405234801561001057600080fd5b5061019c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80638753367f1461003b578063f8a8fd6d14610057575b600080fd5b610055600480360381019061005091906100d7565b610061565b005b61005f610071565b005b607b811461006e57600080fd5b50565b3073ffffffffffffffffffffffffffffffffffffffff167fdde371250dcd21c331edbb965b9163f4898566e8c60e28868533281edf66ab03607b6040516100b89190610113565b60405180910390a2565b6000813590506100d18161014f565b92915050565b6000602082840312156100ed576100ec61014a565b5b60006100fb848285016100c2565b91505092915050565b61010d81610138565b82525050565b60006020820190506101286000830184610104565b92915050565b6000819050919050565b60006101438261012e565b9050919050565b600080fd5b6101588161012e565b811461016357600080fd5b5056fea2646970667358221220feb2fe32fb60d1ce42ae5b67f1d29871608dc1e7f38f6abad28706024c3aa14864736f6c63430008070033", - linkReferences: {}, -}; - -describe("deployment builder - await event", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const eventModule = buildModule("event", (m: IDeploymentBuilder) => { - const testContract = m.contract("Test", artifact); - const testContract2 = m.contract("Token"); - - const call = m.call(testContract, "test", { args: [] }); - - const event = m.event(testContract, "SomeEvent", { - args: [testContract], - after: [call], - }); - - const event2 = m.event(testContract2, "SomeEvent", { - args: [testContract2], - after: [call], - }); - - m.call(testContract, "verify", { - args: [event.params.value, event2.params.value], - }); - - return {}; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - eventModule, - { - chainId: 31337, - accounts: [], - artifacts: [artifact], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have six nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 6); - }); - - it("should have the contract node Test", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Test"); - assert(isArtifactContract(depNode)); - }); - - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); - - it("should have the call node Test/test", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Test/test"); - assert(isCall(depNode)); - }); - - it("should have the await event node Test/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Test/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Test/SomeEvent"); - assert(isAwaitedEvent(depNode)); - }); - - it("should have the await event node Token/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Token/SomeEvent"); - assert(isAwaitedEvent(depNode)); - }); - - it("should have the call node Test/verify", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Test/verify"); - assert(isCall(depNode)); - }); - - it("should show no dependencies for the contract node Test", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show one dependency for the call node Test/test", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Test", - type: "", - }, - ]); - }); - - it("should show two dependencies for the event node Test/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Test/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Test", - type: "", - }, - { - id: 2, - label: "Test/test", - type: "", - }, - ]); - }); - - it("should show two dependencies for the event node Token/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 1, - label: "Token", - type: "", - }, - { - id: 2, - label: "Test/test", - type: "", - }, - ]); - }); - - it("should show three dependencies for the call node Test/verify", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Test", - type: "", - }, - { - id: 3, - label: "Test/SomeEvent", - type: "", - }, - { - id: 4, - label: "Token/SomeEvent", - type: "", - }, - ]); - }); - - it("should record the argument list for the contract node Test as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isArtifactContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the call node Test/test as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/test"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the event node Test/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Test/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isAwaitedEvent(depNode)) { - return assert.fail("Not an awaited event dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 0, - label: "Test", - type: "contract", - subtype: "artifact", - artifact, - _future: true, - }, - ]); - }); - - it("should record the argument list for the event node Token/SomeEvent", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/SomeEvent" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isAwaitedEvent(depNode)) { - return assert.fail("Not an awaited event dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 1, - contractName: "Token", - label: "Token", - type: "contract", - subtype: "hardhat", - _future: true, - }, - ]); - }); - - it("should record the argument list for the call node Test/verify", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Test/verify"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isCall(depNode)) { - return assert.fail("Not a call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 3, - label: "value", - type: "eventParam", - subtype: "uint256", - _future: true, - }, - { - vertexId: 4, - label: "value", - type: "eventParam", - subtype: "uint256", - _future: true, - }, - ]); - }); -}); diff --git a/packages/core/test/deploymentBuilder/helpers.ts b/packages/core/test/deploymentBuilder/helpers.ts deleted file mode 100644 index 5ff2c7f0a2..0000000000 --- a/packages/core/test/deploymentBuilder/helpers.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { DeploymentGraph } from "../../src/internal/dsl/DeploymentGraph"; -import { getDependenciesFor } from "../../src/internal/graph/adjacencyList"; -import { DeploymentGraphVertex } from "../../src/internal/types/deploymentGraph"; -import { VertexDescriptor } from "../../src/internal/types/graph"; - -export function getDeploymentVertexByLabel( - deploymentGraph: DeploymentGraph, - label: string -): DeploymentGraphVertex | undefined { - return Array.from(deploymentGraph.vertexes.values()).find( - (n) => n.label === label - ); -} - -export function getDependenciesForVertex( - deploymentGraph: DeploymentGraph, - { id }: { id: number } -): VertexDescriptor[] { - const depIds = getDependenciesFor(deploymentGraph.adjacencyList, id); - - return depIds - .map((depId) => deploymentGraph.vertexes.get(depId)) - .filter( - (nodeDesc): nodeDesc is DeploymentGraphVertex => nodeDesc !== undefined - ) - .map((vertex) => ({ id: vertex.id, label: vertex.label, type: "" })); -} diff --git a/packages/core/test/deploymentBuilder/libraries.ts b/packages/core/test/deploymentBuilder/libraries.ts deleted file mode 100644 index bf0f81fb41..0000000000 --- a/packages/core/test/deploymentBuilder/libraries.ts +++ /dev/null @@ -1,144 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - isHardhatContract, - isHardhatLibrary, -} from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - libraries", () => { - describe("libraries", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const someother = m.contract("Someother"); - - const safeMath = m.library("SafeMath", { - args: [42], - after: [someother], - from: m.accounts[0], - }); - - const contract = m.contract("Contract", { - libraries: { - SafeMath: safeMath, - }, - }); - - return { safeMath, contract }; - } - ); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - librariesModule, - { - chainId: 31, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the library node SafeMath", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "SafeMath"); - assert(isHardhatLibrary(depNode)); - }); - - it("should have the contract node Contract", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Contract"); - assert(isHardhatContract(depNode)); - }); - - it("should show one dependencies for the library node SafeMath to Someother", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Someother", type: "" }]); - }); - - it("should show one dependency on library node SafeMath for Contract", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Contract"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 1, label: "SafeMath", type: "" }]); - }); - - it("should record the argument list for the library node SafeMath as [42]", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatLibrary(depNode)) { - return assert.fail("Not a hardhat library dependency node"); - } - - assert.deepStrictEqual(depNode.args, [42]); - }); - - it("should record the correct address to deploy from", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "SafeMath"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatLibrary(depNode)) { - return assert.fail("Not a hardhat library dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/metadata.ts b/packages/core/test/deploymentBuilder/metadata.ts deleted file mode 100644 index 943e05e194..0000000000 --- a/packages/core/test/deploymentBuilder/metadata.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -describe("deployment builder - metadata", () => { - it("should inject the chainId via the builder", () => { - const chainIdModule = buildModule("chainId", (m: IDeploymentBuilder) => { - if (m.chainId === 42) { - return {}; - } - - assert.fail("Chain id was not injected"); - }); - - generateDeploymentGraphFrom(chainIdModule, { - chainId: 42, - accounts: [], - artifacts: [], - }); - }); - - it("should inject the accounts via the builder", () => { - const accountsModule = buildModule("accounts", (m: IDeploymentBuilder) => { - if (m.accounts[0] === "0x1" && m.accounts[1] === "0x2") { - return {}; - } - - assert.fail("Chain id was not injected"); - }); - - generateDeploymentGraphFrom(accountsModule, { - chainId: 42, - accounts: ["0x1", "0x2"], - artifacts: [], - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/parameters.ts b/packages/core/test/deploymentBuilder/parameters.ts deleted file mode 100644 index 3dea57e5bd..0000000000 --- a/packages/core/test/deploymentBuilder/parameters.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { IgnitionError } from "../../src/errors"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { isContract } from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -describe("deployment builder - parameters", function () { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const librariesSubmodule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m) => { - const { token } = m.useModule(librariesSubmodule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - if (!isContract(token)) { - throw new IgnitionError("Not contract"); - } - - return { token }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - { - chainId: 31, - accounts: [], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); -}); diff --git a/packages/core/test/deploymentBuilder/sendETH.ts b/packages/core/test/deploymentBuilder/sendETH.ts deleted file mode 100644 index 8ef9b958d3..0000000000 --- a/packages/core/test/deploymentBuilder/sendETH.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import { isHardhatContract } from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - send ETH", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const sendModule = buildModule("send", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const value = ethers.utils.parseUnits("10"); - - m.sendETH(token, { value, after: [token], from: m.accounts[0] }); - - return {}; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - sendModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); - - it("should have the send node send/1", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "send/1"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "send/1"); - assert(depNode.type === "SendETH"); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show 1 dependency for the send node send/1", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "send/1"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Token", - type: "", - }, - ]); - }); - - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the correct address to send from", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); -}); diff --git a/packages/core/test/deploymentBuilder/staticCalls.ts b/packages/core/test/deploymentBuilder/staticCalls.ts deleted file mode 100644 index a9704780cd..0000000000 --- a/packages/core/test/deploymentBuilder/staticCalls.ts +++ /dev/null @@ -1,384 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import { - isStaticCall, - isHardhatContract, -} from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - static calls", () => { - describe("with basic value args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - - const totalSupply = m.staticCall(token, "totalSupply", { - args: [token], - from: m.accounts[0], - }); - - const exchange = m.contract("Exchange", { args: [totalSupply] }); - - return { token, exchange }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - callModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - - it("should have the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - assert.equal(depNode?.label, "Token"); - assert(isHardhatContract(depNode)); - }); - - it("should have the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Exchange"); - assert(isHardhatContract(depNode)); - }); - - it("should have the static call node Token/totalSupply", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/totalSupply" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "Token/totalSupply"); - assert(isStaticCall(depNode)); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show one dependency for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 1, label: "Token/totalSupply", type: "" }, - ]); - }); - - it("should show one dependency for the static call node Token/totalSupply", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/totalSupply" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "Token", - type: "", - }, - ]); - }); - - it("should record the argument list for the contract node Token as empty", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the contract node Exchange", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 1, - label: "Token/totalSupply", - type: "static-call", - _future: true, - }, - ]); - }); - - it("should record the argument list for the call node Token at Token/totalSupply", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/totalSupply" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isStaticCall(depNode)) { - return assert.fail("Not a static call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - { - vertexId: 0, - label: "Token", - type: "contract", - subtype: "hardhat", - contractName: "Token", - _future: true, - }, - ]); - }); - - it("should record the address to send from for the static call node Token at Token/totalSupply", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Token/totalSupply" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isStaticCall(depNode)) { - return assert.fail("Not a static call dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); - - describe("with array args", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const captureArraysContracts = m.contract("CaptureArraysContract"); - - m.staticCall(captureArraysContracts, "recordArrays", { - args: [ - [1, 2, 3], - ["a", "b", "c"], - [true, false, true], - ], - from: m.accounts[0], - }); - - return {}; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - callModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have two nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 2); - }); - - it("should have the contract node CaptureArraysContract", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "CaptureArraysContract"); - assert(isHardhatContract(depNode)); - }); - - it("should have the static call node CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - assert.equal(depNode?.label, "CaptureArraysContract/recordArrays"); - assert(isStaticCall(depNode)); - }); - - it("should show no dependencies for the contract node Token", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, []); - }); - - it("should show one dependencies for the call node CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "CaptureArraysContract", - type: "", - }, - ]); - }); - - it("should record the argument list for the contract node CaptureArraysContract as empty", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("Not a hardhat contract dependency node"); - } - - assert.deepStrictEqual(depNode.args, []); - }); - - it("should record the argument list for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isStaticCall(depNode)) { - return assert.fail("Not a static call dependency node"); - } - - assert.deepStrictEqual(depNode.args, [ - [1, 2, 3], - ["a", "b", "c"], - [true, false, true], - ]); - }); - - it("should record the address to send from for the call node CaptureArraysContract at CaptureArraysContract/recordArrays", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "CaptureArraysContract/recordArrays" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - if (!isStaticCall(depNode)) { - return assert.fail("Not a static call dependency node"); - } - - assert.equal(depNode.from, "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/useModule.ts b/packages/core/test/deploymentBuilder/useModule.ts deleted file mode 100644 index c52d40a957..0000000000 --- a/packages/core/test/deploymentBuilder/useModule.ts +++ /dev/null @@ -1,599 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; - -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { IgnitionError } from "../../src/errors"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; -import { - ArtifactContract, - ContractFutureOld, - EventFuture, - HardhatContract, - LibraryFuture, - ProxyFuture, - Virtual, -} from "../../src/types/future"; -import { Module } from "../../src/types/module"; -import { ProcessResultKind } from "../../src/types/process"; - -import { - getDependenciesForVertex, - getDeploymentVertexByLabel, -} from "./helpers"; - -describe("deployment builder - useModule", () => { - let deploymentGraph: IDeploymentGraph; - const options = { - chainId: 31, - accounts: [], - artifacts: [], - }; - - describe("use one module from another", () => { - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - return { token, token2 }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have three nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 3); - }); - }); - - describe("depending on a module", () => { - before(() => { - const TokenModule = buildModule( - "TokenModule", - (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const module = m.useModule(TokenModule); - - const foo = m.contract("Foo", { after: [module] }); - - return { foo }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should have the Token node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Token"); - }); - - it("should show the Token node depending on the modules before virtual node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { - id: 0, - label: "TokenModule:0::before", - type: "", - }, - ]); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should foo depending on the after virtual node of the TokenModule", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 2, label: "TokenModule:0::after", type: "" }, - ]); - }); - }); - - describe("depending on a contract within a module", () => { - before(() => { - const TokenModule = buildModule( - "TokenModule", - (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - - return { token }; - } - ); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const { token } = m.useModule(TokenModule); - - const foo = m.contract("Foo", { after: [token] }); - - return { foo }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have four nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 4); - }); - - it("should show foo depending on the after virtual node of the TokenModule (magic of proxy)", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 2, label: "TokenModule:0::after", type: "" }, - ]); - }); - }); - - describe("a module depending on a contract", () => { - before(() => { - const TokenModule = buildModule( - "TokenModule", - (m: IDeploymentBuilder) => { - const bar = m.contract("Bar"); - const baz = m.contract("Baz"); - - return { bar, baz }; - } - ); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const foo = m.contract("Foo"); - - const { bar, baz } = m.useModule(TokenModule, { after: [foo] }); - - return { foo, bar, baz }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have five nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 5); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should have the Bar node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Bar"); - }); - - it("should have the Baz node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Baz"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Baz"); - }); - - it("should show Bar depending on the module before node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 1, label: "TokenModule:0::before", type: "" }, - ]); - }); - - it("should show Baz depending on the module before node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Baz"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 1, label: "TokenModule:0::before", type: "" }, - ]); - }); - - it("should show module before virtual vertex depending on the Foo contract", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "TokenModule:0::before" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [{ id: 0, label: "Foo", type: "" }]); - }); - }); - - describe("a module depending on a module", () => { - before(() => { - const FooModule = buildModule("FooModule", (m: IDeploymentBuilder) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const BarModule = buildModule("BarModule", (m: IDeploymentBuilder) => { - const bar = m.contract("Bar"); - - return { bar }; - }); - - const WrapModule = buildModule("Wrap", (m: IDeploymentBuilder) => { - const fooModule = m.useModule(FooModule); - const { bar } = m.useModule(BarModule, { after: [fooModule] }); - - return { foo: fooModule.foo, bar }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - WrapModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have six nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 6); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should have the Bar node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Bar"); - }); - - it("should show Bar depending on the module before node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 3, label: "BarModule:1::before", type: "" }, - ]); - }); - - it("should show bar module before virtual vertex depending on the Foo module after virtual vertex", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "BarModule:1::before" - ); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 2, label: "FooModule:0::after", type: "" }, - ]); - }); - }); - - describe("nesting modules within modules within modules", () => { - before(() => { - const BottomModule = buildModule("Bottom", (m: IDeploymentBuilder) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const MiddleModule = buildModule("Middle", (m: IDeploymentBuilder) => { - const { foo } = m.useModule(BottomModule); - - return { foo }; - }); - - const TopModule = buildModule("Top", (m: IDeploymentBuilder) => { - const { foo } = m.useModule(MiddleModule); - - const bar = m.contract("Bar", { args: [foo] }); - - return { foo, bar }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - TopModule, - options - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should create a graph", () => { - assert.isDefined(deploymentGraph); - }); - - it("should have six nodes", () => { - assert.equal(deploymentGraph.vertexes.size, 6); - }); - - it("should have the Foo node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Foo"); - }); - - it("should have the Bar node", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - assert.isDefined(depNode); - assert.equal(depNode?.label, "Bar"); - }); - - it("should show one dependencies, between Bar and Middle module", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Bar"); - - if (depNode === undefined) { - return assert.isDefined(depNode); - } - - const deps = getDependenciesForVertex(deploymentGraph, depNode); - - assert.deepStrictEqual(deps, [ - { id: 4, label: "Middle:0::after", type: "" }, - ]); - }); - }); - - describe("reusing the same module with different parameters", () => { - let differentParamsModule: Module<{ - token: HardhatContract | ArtifactContract; - token2: HardhatContract | ArtifactContract; - }>; - - before(() => { - const librariesModule = buildModule( - "libraries", - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token }; - } - ); - - differentParamsModule = buildModule("Error", (m: IDeploymentBuilder) => { - const { token } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - const { token: token2 } = m.useModule(librariesModule, { - parameters: { tokenSymbol: "DIFFERENT", tokenName: "Example" }, - }); - - return { token, token2 }; - }); - }); - - it("should fail with an error", () => { - const result = generateDeploymentGraphFrom( - differentParamsModule, - options - ); - - assert.deepStrictEqual(result, { - _kind: ProcessResultKind.FAILURE, - message: "Deployment graph construction failed", - failures: [ - new IgnitionError( - "`useModule` cannot be invoked on the same module using different parameters" - ), - ], - }); - }); - }); - - describe("returning non contract futures from within a module", () => { - // @ts-ignore - let returnsWrongFutureTypeModule: Module<{ - token: - | ContractFutureOld - | LibraryFuture - | Virtual - | ProxyFuture - | EventFuture; - }>; - - before(() => { - const returnTypeModule = buildModule( - "returnsParam", - // @ts-ignore - // ignoring here to specifically test for js ability to bypass type guards - (m: IDeploymentBuilder) => { - const symbol = m.getOptionalParam("tokenSymbol", "TKN"); - const name = m.getParam("tokenName"); - const token = m.contract("Token", { - args: [symbol, name, 1_000_000], - }); - - return { token, name }; - } - ); - - returnsWrongFutureTypeModule = buildModule( - "ReturnsParamModule", - (m: IDeploymentBuilder) => { - const { token } = m.useModule(returnTypeModule, { - parameters: { tokenSymbol: "EXAMPLE", tokenName: "Example" }, - }); - - return { token }; - } - ); - }); - - it("should fail with an error", () => { - const result = generateDeploymentGraphFrom( - // @ts-ignore - returnsWrongFutureTypeModule, - { - chainId: 31, - accounts: [], - artifacts: [], - } - ); - - assert.deepStrictEqual(result, { - _kind: ProcessResultKind.FAILURE, - message: "Deployment graph construction failed", - failures: [ - new IgnitionError( - 'Cannot return Future of type "parameter" from a module' - ), - ], - }); - }); - }); -}); diff --git a/packages/core/test/deploymentBuilder/value.ts b/packages/core/test/deploymentBuilder/value.ts deleted file mode 100644 index b835840917..0000000000 --- a/packages/core/test/deploymentBuilder/value.ts +++ /dev/null @@ -1,137 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { IDeploymentGraph } from "../../src/internal/types/deploymentGraph"; -import type { ArtifactOld } from "../../src/types/hardhat"; - -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "../../src/buildModule"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { - isArtifactContract, - isCall, - isHardhatContract, -} from "../../src/internal/utils/guards"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { IDeploymentBuilder } from "../../src/types/dsl"; - -import { getDeploymentVertexByLabel } from "./helpers"; - -describe("deployment builder - value", () => { - let deploymentGraph: IDeploymentGraph; - - before(() => { - const artifact = { abi: [], bytecode: "xxx" } as any as ArtifactOld; - - const callModule = buildModule("call", (m: IDeploymentBuilder) => { - const token = m.contract("Token"); - const exchange = m.contract("Exchange", { - value: ethers.utils.parseUnits("42"), - }); - - m.call(exchange, "addToken", { - args: [token], - value: ethers.utils.parseUnits("10"), - }); - - const foo = m.contract("Foo", artifact, { - args: [0], - value: ethers.utils.parseUnits("3"), - }); - - return { foo }; - }); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - callModule, - { - chainId: 31337, - accounts: [], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Construction of deployment graph failed"); - } - - deploymentGraph = constructDeploymentGraphResult.result.graph; - }); - - it("should default to zero value if not given a value parameter", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Token"); - - if (depNode === undefined) { - assert.fail("depNode not returned"); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("0").toString() - ); - }); - - describe("contract", () => { - it("should deploy with a given value", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Exchange"); - - if (depNode === undefined) { - assert.fail("depNode not returned"); - } - - if (!isHardhatContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("42").toString() - ); - }); - }); - - describe("call", () => { - it("should deploy with a given value", () => { - const depNode = getDeploymentVertexByLabel( - deploymentGraph, - "Exchange/addToken" - ); - - if (depNode === undefined) { - assert.fail("depNode not returned"); - } - - if (!isCall(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("10").toString() - ); - }); - }); - - describe("artifact", () => { - it("should deploy with a given value", () => { - const depNode = getDeploymentVertexByLabel(deploymentGraph, "Foo"); - - if (depNode === undefined) { - assert.fail("depNode not returned"); - } - - if (!isArtifactContract(depNode)) { - return assert.fail("unknown error"); - } - - assert.equal( - depNode.value.toString(), - ethers.utils.parseUnits("3").toString() - ); - }); - }); -}); diff --git a/packages/core/test/execution/batching.ts b/packages/core/test/execution/batching.ts deleted file mode 100644 index 2683a43836..0000000000 --- a/packages/core/test/execution/batching.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import type { - ContractDeployExecutionVertex, - ExecutionVertex, - ExecutionVertexVisitResult, -} from "../../src/internal/types/executionGraph"; - -import { assert } from "chai"; -import { BigNumber } from "ethers"; - -import { Deployment } from "../../src/internal/deployment/Deployment"; -import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; -import { executeInBatches } from "../../src/internal/execution/execute"; -import { - VertexResultEnum, - VisitResultState, -} from "../../src/internal/types/graph"; -import { ICommandJournal } from "../../src/internal/types/journal"; -import { buildAdjacencyListFrom } from "../graph/helpers"; - -describe("Execution - batching", () => { - it("should run", async () => { - const vertex0: ExecutionVertex = createFakeContractDeployVertex(0, "first"); - const vertex1: ExecutionVertex = createFakeContractDeployVertex( - 1, - "second" - ); - const vertex2: ExecutionVertex = createFakeContractDeployVertex(2, "third"); - - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = buildAdjacencyListFrom({ - 0: [1], - 1: [2], - 2: [], - }); - - executionGraph.vertexes.set(0, vertex0); - executionGraph.vertexes.set(1, vertex1); - executionGraph.vertexes.set(2, vertex2); - - const mockServices = {} as any; - const mockJournal: ICommandJournal = { - record: async () => {}, - async *read() {}, - async *readAll() {}, - }; - const mockUpdateUiAction = () => {}; - - const deployment = new Deployment( - "MyModule", - mockServices, - mockJournal, - mockUpdateUiAction - ); - - const result = await executeInBatches( - deployment, - executionGraph, - async (): Promise => { - return { _kind: VertexResultEnum.SUCCESS, result: {} as any }; - }, - {} as any - ); - - assert.isDefined(result); - assert.equal(result._kind, VisitResultState.SUCCESS); - }); -}); - -function createFakeContractDeployVertex( - vertexId: number, - label: string -): ContractDeployExecutionVertex { - return { - type: "ContractDeploy", - id: vertexId, - label, - artifact: {} as any, - args: [], - libraries: {}, - value: BigNumber.from(0), - signer: {} as any, - }; -} diff --git a/packages/core/test/execution/dispatch.ts b/packages/core/test/execution/dispatch.ts deleted file mode 100644 index fa417625c5..0000000000 --- a/packages/core/test/execution/dispatch.ts +++ /dev/null @@ -1,521 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { ethers } from "ethers"; -import sinon from "sinon"; - -import { Deployment } from "../../src/internal/deployment/Deployment"; -import { ExecutionGraph } from "../../src/internal/execution/ExecutionGraph"; -import { execute } from "../../src/internal/execution/execute"; -import { ExecutionVertex } from "../../src/internal/types/executionGraph"; -import { - VertexResultEnum, - VisitResultState, -} from "../../src/internal/types/graph"; -import { ICommandJournal } from "../../src/internal/types/journal"; -import { - Services, - TransactionOptions, -} from "../../src/internal/types/services"; -import { ArtifactOld } from "../../src/types/hardhat"; -import { buildAdjacencyListFrom } from "../graph/helpers"; -import { getMockServices } from "../helpers"; - -const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; - -describe("Execution - dispatch", () => { - afterEach(() => { - sinon.restore(); - }); - - it("should execute a contract deploy", async () => { - const fakeArtifact: ArtifactOld = { - contractName: "Foo", - abi: [], - bytecode: - "6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", - linkReferences: {}, - }; - - const contractDeploy: ExecutionVertex = { - type: "ContractDeploy", - id: 0, - label: "Foo", - artifact: fakeArtifact, - args: [], - libraries: {}, - value: ethers.utils.parseUnits("0"), - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - const mockServices = { - ...getMockServices(), - contracts: { - sendTx: async ( - _deployedTx: ethers.providers.TransactionRequest, - _txOptions?: TransactionOptions - ): Promise => { - return "0x0"; - }, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash !== "0x0") { - assert.fail("Wrong transaction address"); - } - - return { contractAddress: "0xAddr" }; - }, - } as any, - }; - - const response = await runExecuteOnSingleVertex( - contractDeploy, - mockServices - ); - - assert.isDefined(response); - - if (response._kind !== VisitResultState.SUCCESS) { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(0), { - _kind: VertexResultEnum.SUCCESS, - result: { - abi: [], - address: "0xAddr", - bytecode: fakeArtifact.bytecode, - name: "Foo", - value: ethers.utils.parseUnits("0"), - }, - }); - }); - - it("should execute a library deploy", async () => { - const fakeArtifact: ArtifactOld = { - contractName: "Foo", - abi: [], - bytecode: - "6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", - linkReferences: {}, - }; - - const contractDeploy: ExecutionVertex = { - type: "LibraryDeploy", - id: 0, - label: "Foo", - artifact: fakeArtifact, - args: [], - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - const mockServices = { - ...getMockServices(), - contracts: { - sendTx: async ( - _deployedTx: ethers.providers.TransactionRequest, - _txOptions?: TransactionOptions - ): Promise => { - return "0x0"; - }, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash !== "0x0") { - assert.fail("Wrong transaction address"); - } - - return { contractAddress: "0xAddr" }; - }, - } as any, - }; - - const response = await runExecuteOnSingleVertex( - contractDeploy, - mockServices - ); - - assert.isDefined(response); - if (response._kind !== VisitResultState.SUCCESS) { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(0), { - _kind: VertexResultEnum.SUCCESS, - result: { - abi: [], - address: "0xAddr", - bytecode: fakeArtifact.bytecode, - name: "Foo", - }, - }); - }); - - it("should execute a contract call", async () => { - const fakeArtifact: ArtifactOld = { - contractName: "Foo", - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "x", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - ], - bytecode: - "0x6080604052600a60005534801561001557600080fd5b506102a3806100256000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80630c55699c1461003b578063812600df14610059575b600080fd5b610043610075565b604051610050919061016d565b60405180910390f35b610073600480360381019061006e91906100ee565b61007b565b005b60005481565b600081116100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061014d565b60405180910390fd5b806000808282546100cf9190610199565b9250508190555050565b6000813590506100e881610256565b92915050565b60006020828403121561010457610103610228565b5b6000610112848285016100d9565b91505092915050565b6000610128601283610188565b91506101338261022d565b602082019050919050565b610147816101ef565b82525050565b600060208201905081810360008301526101668161011b565b9050919050565b6000602082019050610182600083018461013e565b92915050565b600082825260208201905092915050565b60006101a4826101ef565b91506101af836101ef565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156101e4576101e36101f9565b5b828201905092915050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600080fd5b7f6e206d75737420626520706f7369746976650000000000000000000000000000600082015250565b61025f816101ef565b811461026a57600080fd5b5056fea2646970667358221220cc04d844f616d44488d76bfdbc831ad25ac2a62a3638e3e6b184ac61b359372264736f6c63430008050033", - linkReferences: {}, - }; - - const contractDeploy: ExecutionVertex = { - type: "ContractDeploy", - id: 0, - label: "Foo", - artifact: fakeArtifact, - args: [], - libraries: {}, - value: ethers.utils.parseUnits("0"), - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - const contractCall: ExecutionVertex = { - type: "ContractCall", - id: 1, - label: "Foo", - contract: { vertexId: 0, type: "contract", label: "Foo", _future: true }, - method: "inc", - args: [1], - value: ethers.utils.parseUnits("0"), - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - const sendTxStub = sinon.stub(); - sendTxStub.onCall(0).resolves("0x1"); - sendTxStub.onCall(1).resolves("0x2"); - - const mockServices: Services = { - ...getMockServices(), - contracts: { - sendTx: sendTxStub, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash === "0x1") { - return { - contractAddress: "0x0000000000000000000000000000000000000001", - }; - } - - return { - contractAddress: "0x0000000000000000000000000000000000000002", - }; - }, - } as any, - }; - - const response = await runExecuteOnDependentVertex( - [contractDeploy, contractCall], - mockServices - ); - - assert.isDefined(response); - if (response._kind !== VisitResultState.SUCCESS) { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(1), { - _kind: VertexResultEnum.SUCCESS, - result: { - hash: "0x2", - }, - }); - }); - - describe("await event", () => { - let contractDeploy: ExecutionVertex; - let contractCall: ExecutionVertex; - let awaitedEvent: ExecutionVertex; - let mockServices: Services; - - beforeEach(() => { - const fakeArtifact = { - contractName: "Test", - abi: [ - { - type: "event", - name: "SomeEvent", - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - ], - }, - { - inputs: [], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - bytecode: - "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", - linkReferences: {}, - }; - - contractDeploy = { - type: "ContractDeploy", - id: 0, - label: "Test", - artifact: fakeArtifact, - args: [], - libraries: {}, - value: ethers.utils.parseUnits("0"), - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - contractCall = { - type: "ContractCall", - id: 1, - label: "Test/test", - contract: { - vertexId: 0, - type: "contract", - label: "Test", - _future: true, - }, - method: "test", - args: [], - value: ethers.utils.parseUnits("0"), - signer: new ethers.VoidSigner( - "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266" - ), - }; - - awaitedEvent = { - type: "AwaitedEvent", - id: 2, - abi: fakeArtifact.abi, - address: { - vertexId: 0, - type: "contract", - subtype: "artifact", - artifact: fakeArtifact, - label: "Test", - _future: true, - }, - label: "Test/SomeEvent", - event: "SomeEvent", - args: [ACCOUNT_0], - }; - - const iface = new ethers.utils.Interface(fakeArtifact.abi); - - const fakeLog = iface.encodeEventLog( - ethers.utils.EventFragment.from(fakeArtifact.abi[0]), - ["0x0000000000000000000000000000000000000003"] - ); - - const sendTxStub = sinon.stub(); - sendTxStub.onCall(0).resolves("0x1"); - sendTxStub.onCall(1).resolves("0x2"); - - const waitForEventStub = sinon.stub(); - waitForEventStub.onFirstCall().resolves(fakeLog); - - mockServices = { - ...getMockServices(), - contracts: { - sendTx: sendTxStub, - } as any, - transactions: { - wait: (txHash: string) => { - if (txHash === "0x1") { - return { - contractAddress: "0x0000000000000000000000000000000000000001", - }; - } - - return { - contractAddress: "0x0000000000000000000000000000000000000002", - }; - }, - waitForEvent: waitForEventStub, - } as any, - }; - }); - - it("should return the result of an awaited event that completes within the timeout", async () => { - const response = await runExecuteOnDependentVertex( - [contractDeploy, contractCall, awaitedEvent], - mockServices - ); - - if (response._kind !== VisitResultState.SUCCESS) { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(2), { - _kind: VertexResultEnum.SUCCESS, - result: { - topics: ["0x0000000000000000000000000000000000000003"], - }, - }); - }); - - it("should return as on hold if an awaited event is not detected within the timeout", async () => { - const response = await runExecuteOnDependentVertex( - [contractDeploy, awaitedEvent], - { - ...mockServices, - transactions: { - ...mockServices.transactions, - waitForEvent: sinon.stub().resolves(null), - }, - } - ); - - assert( - response._kind === VisitResultState.HOLD, - `response should be hold, not: ${response._kind}` - ); - }); - }); - - it("should ignore an already deployed contract", async () => { - const contractDeploy: ExecutionVertex = { - type: "DeployedContract", - id: 0, - label: "Foo", - address: "0xAddr", - abi: [], - }; - - const mockServices: Services = { - ...getMockServices(), - contracts: { - deploy: async (): Promise => { - assert.fail("deploy should not be called"); - }, - } as any, - }; - - const response = await runExecuteOnSingleVertex( - contractDeploy, - mockServices - ); - - assert.isDefined(response); - if (response._kind !== VisitResultState.SUCCESS) { - return assert.fail("deploy failed"); - } - - assert.deepStrictEqual(response.result.get(0), { - _kind: VertexResultEnum.SUCCESS, - result: { - name: "Foo", - abi: [], - address: "0xAddr", - }, - }); - }); -}); - -async function runExecuteOnSingleVertex( - executionVertex: ExecutionVertex, - mockServices: Services -) { - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = buildAdjacencyListFrom({ - 0: [], - }); - executionGraph.vertexes.set(0, executionVertex); - - const mockUpdateUiAction = () => {}; - const mockJournal: ICommandJournal = { - record: async () => {}, - async *read() {}, - async *readAll() {}, - }; - - const deployment = new Deployment( - "MyModule", - mockServices, - mockJournal, - mockUpdateUiAction - ); - - deployment.state.transform.executionGraph = executionGraph; - - return execute(deployment, {} as any); -} - -async function runExecuteOnDependentVertex( - vertexes: ExecutionVertex[], - mockServices: Services -) { - const obj: { [key: number]: number[] } = {}; - const len = vertexes.length; - for (let i = 0; i < len; i++) { - obj[i] = i === len - 1 ? [] : [i + 1]; - } - - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = buildAdjacencyListFrom(obj); - - vertexes.forEach((vertex, i) => { - executionGraph.vertexes.set(i, vertex); - }); - - const mockUpdateUiAction = () => {}; - const mockJournal: ICommandJournal = { - record: async () => {}, - async *read() {}, - async *readAll() {}, - }; - - const deployment = new Deployment( - "MyModule", - mockServices, - mockJournal, - mockUpdateUiAction - ); - - deployment.state.transform.executionGraph = executionGraph; - - return execute(deployment, {} as any); -} diff --git a/packages/core/test/execution/rerun.ts b/packages/core/test/execution/rerun.ts deleted file mode 100644 index 56e845e3cf..0000000000 --- a/packages/core/test/execution/rerun.ts +++ /dev/null @@ -1,471 +0,0 @@ -/* eslint-disable import/no-unused-modules */ - -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "../../src/buildModule"; -import { IgnitionError } from "../../src/errors"; -import { IgnitionImplementation } from "../../src/internal/Ignition"; -import { TransactionsService } from "../../src/internal/services/TransactionsService"; -import { DeploymentResultState } from "../../src/internal/types/deployment"; -import { ArtifactOld } from "../../src/types/hardhat"; -import { Providers } from "../../src/types/providers"; -import { getMockServices } from "../helpers"; -import { setupIgnitionWith } from "../helpers/setupIgnitionWith"; -import { MemoryCommandJournal } from "../util/MemoryCommandJournal"; - -describe("Rerunning execution", () => { - const tokenArtifact: ArtifactOld = { - contractName: "Token", - abi: [ - { - name: "ConfigComplete", - type: "event", - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "name", - type: "address", - }, - ], - }, - { - inputs: [ - { - internalType: "uint256", - name: "supply", - type: "uint256", - }, - ], - name: "configure", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - bytecode: "0x0000000001", - linkReferences: {}, - }; - - describe("when a deployment is already complete", () => { - let sentTransactionCount: number; - let ignition: IgnitionImplementation; - let myModule: any; - - beforeEach(() => { - sentTransactionCount = 0; - - myModule = buildModule("MyModule", (m) => { - const token = m.contract("Token"); - - m.call(token, "configure", { args: [100] }); - - return { token }; - }); - - ignition = setupIgnitionWith({ - services: { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => tokenArtifact, - getAllArtifacts: () => [tokenArtifact], - }, - transactions: { - wait: (tx: string) => { - sentTransactionCount++; - - if (tx === "0x00001") { - return { - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }; - } - - if (tx === "0x00002") { - return {}; - } - - if (tx === "0x00003") { - return { - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }; - } - - if (tx === "0x00004") { - return {}; - } - - throw new Error(`Unexpected transaction sent: ${tx}`); - }, - }, - accounts: { - getAccounts: () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - } as any, - journal: new MemoryCommandJournal(), - }); - }); - - it("should record complete on first run", async () => { - // Act - const result = await ignition.deploy(myModule, {} as any); - - // Assert - assert.equal(result._kind, DeploymentResultState.SUCCESS); - - // two transactions have been sent - assert.equal(sentTransactionCount, 2, "precondition before rerun"); - }); - - it("should not rerun any on-chain transactions on second run", async () => { - // Arrange - await ignition.deploy(myModule, {} as any); - - // Act - const redeployResult = await ignition.deploy(myModule, {} as any); - - // Assert - assert.equal(redeployResult._kind, DeploymentResultState.SUCCESS); - - // only two on-chain transactions happen, none from the rerun - assert.equal( - sentTransactionCount, - 2, - "postcondition on-chain transactions" - ); - - if (redeployResult._kind !== DeploymentResultState.SUCCESS) { - return assert.fail("Not a successful deploy"); - } - - assert.equal( - redeployResult.result.token.address, - "0x1F98431c8aD98523631AE4a59f267346ea31F984" - ); - }); - - it("should rerun all on-chain transactions on second run if force enabled", async () => { - // Arrange - await ignition.deploy(myModule, {} as any); - - // Act - const redeployResult = await ignition.deploy(myModule, { - force: true, - } as any); - - // Assert - assert.equal(redeployResult._kind, DeploymentResultState.SUCCESS); - }); - }); - - describe("when a deployment is on hold", () => { - let sentTransactionCount: number; - let eventQueryCount: number; - let ignition: IgnitionImplementation; - let myModule: any; - - beforeEach(() => { - sentTransactionCount = 0; - eventQueryCount = 0; - - myModule = buildModule("MyModule", (m) => { - const token = m.contract("Token", tokenArtifact); - - const configureCall = m.call(token, "configure", { args: [100] }); - - m.event(token as any, "ConfigComplete", { - after: [configureCall], - args: [], - }); - - return { token }; - }); - - const iface = new ethers.utils.Interface(tokenArtifact.abi); - - const fakeLog = iface.encodeEventLog( - ethers.utils.EventFragment.from(tokenArtifact.abi[0]), - ["0x0000000000000000000000000000000000000003"] - ); - - ignition = setupIgnitionWith({ - services: { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => tokenArtifact, - getAllArtifacts: () => [tokenArtifact], - }, - transactions: { - wait: (tx: string) => { - sentTransactionCount++; - - if (tx === "0x00001") { - return { - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }; - } - - if (tx === "0x00002") { - return {}; - } - - throw new Error(`Unexpected transaction sent: ${tx}`); - }, - waitForEvent: async () => { - eventQueryCount++; - - if (eventQueryCount === 1) { - return null; - } else if (eventQueryCount === 2) { - return fakeLog; - } else { - throw new Error("Unexpected query call"); - } - }, - }, - accounts: { - getAccounts: () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - } as any, - journal: new MemoryCommandJournal(), - }); - }); - - it("should record hold on first run", async () => { - // Act - const result = await ignition.deploy(myModule, {} as any); - - // Assert - assert.equal(result._kind, DeploymentResultState.HOLD); - - // two calls sent - assert.equal( - sentTransactionCount, - 2, - "Wrong number of on-chain transactions" - ); - - // one event waited for - assert.equal(eventQueryCount, 1, "Wrong number of on-chain queries"); - }); - - it("should rerun the await event on a rerun", async () => { - // arrange - await ignition.deploy(myModule, {} as any); - - // Act - const redeployResult = await ignition.deploy(myModule, {} as any); - - // Assert - // only the original two transactions, no more - assert.equal(sentTransactionCount, 2, "postconditition after rerun"); - - // additional query call on second run - assert.equal(eventQueryCount, 2, "Wrong number of on-chain queries"); - - if (redeployResult._kind !== DeploymentResultState.SUCCESS) { - return assert.fail("Not a successful deploy"); - } - - assert.equal( - redeployResult.result.token.address, - "0x1F98431c8aD98523631AE4a59f267346ea31F984" - ); - }); - - it("should return on hold if there is an error waiting for the tx hash to confirm", async () => { - myModule = buildModule("TxModule", (m) => { - const token = m.contract("Token", tokenArtifact); - - return { token }; - }); - - ignition = setupIgnitionWith({ - services: { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => tokenArtifact, - getAllArtifacts: () => [tokenArtifact], - }, - transactions: new TransactionsService({} as Providers), - accounts: { - getAccounts: () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - } as any, - journal: new MemoryCommandJournal(), - }); - - const result = await ignition.deploy(myModule, {} as any); - - assert.equal(result._kind, DeploymentResultState.HOLD); - }); - }); - - describe("when a deployment fails", () => { - let sentTransactionCount: number; - let ignition: IgnitionImplementation; - let myModule: any; - - beforeEach(() => { - sentTransactionCount = 0; - let configureCallErroredBefore = false; - - myModule = buildModule("MyModule", (m) => { - const token = m.contract("Token"); - - m.call(token, "configure", { args: [100] }); - - return { token }; - }); - - ignition = setupIgnitionWith({ - services: { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => tokenArtifact, - getAllArtifacts: () => [tokenArtifact], - }, - contracts: { - transactionCount: 0, - async sendTx(): Promise { - this.transactionCount++; - - if (this.transactionCount === 2) { - if (!configureCallErroredBefore) { - configureCallErroredBefore = true; - throw new Error("Revert: All the apes have gone!"); - } else { - return `0x0000${this.transactionCount}`; - } - } - - return `0x0000${this.transactionCount}`; - }, - }, - transactions: { - wait: () => { - sentTransactionCount++; - - return { - contractAddress: "0x1F98431c8aD98523631AE4a59f267346ea31F984", - }; - }, - }, - accounts: { - getAccounts: () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - } as any, - journal: new MemoryCommandJournal(), - }); - }); - - it("should record fail on first run", async () => { - // Act - const result = await ignition.deploy(myModule, {} as any); - - // Assert - assert.equal(result._kind, DeploymentResultState.FAILURE); - - // one calls sent - assert.equal( - sentTransactionCount, - 1, - "Wrong number of on-chain transactions" - ); - - assert.deepStrictEqual(result, { - _kind: DeploymentResultState.FAILURE, - failures: [ - "execution failed", - [new Error("Revert: All the apes have gone!")], - ], - }); - }); - - it("should recall the failed transaction on a rerun", async () => { - // Arrange - await ignition.deploy(myModule, {} as any); - - // Act - const redeployResult = await ignition.deploy(myModule, {} as any); - - // Assert - // the second transaction is successfully sent - assert.equal(sentTransactionCount, 2, "postconditition after rerun"); - - if (redeployResult._kind !== DeploymentResultState.SUCCESS) { - return assert.fail("Not a successful deploy"); - } - - assert.equal( - redeployResult.result.token.address, - "0x1F98431c8aD98523631AE4a59f267346ea31F984" - ); - }); - - it("should error if the module has been changed", async () => { - // Arrange - const someModule = buildModule("MyModule", (m) => { - const token = m.contract("Token"); - - m.call(token, "configure", { args: [100] }); - - return { token }; - }); - - const modifiedModule = buildModule("MyModule", (m) => { - const token = m.contract("Token"); - - m.call(token, "configure", { args: [999] }); - - return { token }; - }); - - await ignition.deploy(someModule, {} as any); - - // Act - const modifiedResult = await ignition.deploy(modifiedModule, {} as any); - - // Assert - // the second transaction is not sent - assert.equal(sentTransactionCount, 1, "postconditition after rerun"); - - assert.deepStrictEqual(modifiedResult, { - _kind: DeploymentResultState.FAILURE, - failures: [ - "Module reconciliation failed", - [ - new IgnitionError( - "The module has been modified since the last run. You can ignore the previous runs with the '--force' flag." - ), - ], - ], - }); - }); - }); -}); diff --git a/packages/core/test/graph/adjacencyList.ts b/packages/core/test/graph/adjacencyList.ts deleted file mode 100644 index e97361886f..0000000000 --- a/packages/core/test/graph/adjacencyList.ts +++ /dev/null @@ -1,158 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { - constructEmptyAdjacencyList, - addEdge, - getDependenciesFor, - clone, - topologicalSort, - eliminate, - ensureVertex, -} from "../../src/internal/graph/adjacencyList"; - -import { buildAdjacencyListFrom, constructAdjacencyList } from "./helpers"; - -describe("Adjacency list", () => { - it("should allow looking up deps for a two node graph", () => { - const adjacencyList = constructEmptyAdjacencyList(); - ensureVertex(adjacencyList, 0); - ensureVertex(adjacencyList, 1); - - addEdge(adjacencyList, { from: 0, to: 1 }); - - assert.deepStrictEqual(getDependenciesFor(adjacencyList, 1), [0]); - }); - - it("should allow looking up single deps for a three node graph", () => { - const adjacencyList = constructEmptyAdjacencyList(); - ensureVertex(adjacencyList, 0); - ensureVertex(adjacencyList, 1); - ensureVertex(adjacencyList, 2); - - addEdge(adjacencyList, { from: 0, to: 1 }); - addEdge(adjacencyList, { from: 1, to: 2 }); - - assert.deepStrictEqual(getDependenciesFor(adjacencyList, 2), [1]); - }); - - it("should allow looking up multiple deps for a three node graph", () => { - const adjacencyList = constructEmptyAdjacencyList(); - ensureVertex(adjacencyList, 0); - ensureVertex(adjacencyList, 1); - ensureVertex(adjacencyList, 2); - - addEdge(adjacencyList, { from: 0, to: 2 }); - addEdge(adjacencyList, { from: 1, to: 2 }); - - assert.deepStrictEqual(getDependenciesFor(adjacencyList, 2), [0, 1]); - }); - - it("should be clonable", () => { - const adjacencyList = constructEmptyAdjacencyList(); - ensureVertex(adjacencyList, 0); - ensureVertex(adjacencyList, 1); - ensureVertex(adjacencyList, 2); - - addEdge(adjacencyList, { from: 0, to: 2 }); - addEdge(adjacencyList, { from: 1, to: 2 }); - - const clonedList = clone(adjacencyList); - - assert.deepStrictEqual(clonedList, adjacencyList); - }); - - it("should do a topological sort", () => { - const adjacencyList = constructEmptyAdjacencyList(); - ensureVertex(adjacencyList, 0); - ensureVertex(adjacencyList, 1); - ensureVertex(adjacencyList, 2); - - addEdge(adjacencyList, { from: 0, to: 2 }); - addEdge(adjacencyList, { from: 1, to: 2 }); - - const order = topologicalSort(adjacencyList); - - assert.deepStrictEqual(order, [1, 0, 2]); - }); - - describe("eliminate", () => { - it("should operate on a vertex with one out bound", () => { - const adjacencyList = constructAdjacencyList([ - { from: 0, to: 1 }, - { from: 1, to: 2 }, - ]); - - const updated = eliminate(adjacencyList, 1); - - assert.deepStrictEqual( - updated, - buildAdjacencyListFrom({ - 0: [2], - 2: [], - }) - ); - }); - - it("should operate on vertex with one dependent", () => { - const adjacencyList = constructAdjacencyList([ - { from: 0, to: 1 }, - { from: 2, to: 3 }, - ]); - - const updated = eliminate(adjacencyList, 2); - - assert.deepStrictEqual( - updated, - buildAdjacencyListFrom({ - 0: [1], - 1: [], - 3: [], - }) - ); - }); - - it("should operate on vertex with one dependency", () => { - const adjacencyList = constructAdjacencyList([ - { from: 0, to: 1 }, - { from: 2, to: 3 }, - ]); - - const updated = eliminate(adjacencyList, 3); - - assert.deepStrictEqual( - updated, - buildAdjacencyListFrom({ - 0: [1], - 1: [], - 2: [], - }) - ); - }); - - it("should operate on vertexes with many dependency", () => { - const adjacencyList = constructAdjacencyList([ - { from: 0, to: 3 }, - { from: 1, to: 3 }, - { from: 2, to: 3 }, - { from: 3, to: 4 }, - { from: 3, to: 5 }, - { from: 3, to: 6 }, - ]); - - const updated = eliminate(adjacencyList, 3); - - assert.deepStrictEqual( - updated, - buildAdjacencyListFrom({ - 0: [4, 5, 6], - 1: [4, 5, 6], - 2: [4, 5, 6], - 4: [], - 5: [], - 6: [], - }) - ); - }); - }); -}); diff --git a/packages/core/test/graph/helpers.ts b/packages/core/test/graph/helpers.ts deleted file mode 100644 index 2252e05efd..0000000000 --- a/packages/core/test/graph/helpers.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { - addEdge, - ensureVertex, - constructEmptyAdjacencyList, -} from "../../src/internal/graph/adjacencyList"; - -export function constructAdjacencyList( - edges: Array<{ from: number; to: number }> -) { - const adjacencyList = constructEmptyAdjacencyList(); - - const vertexes = edges.reduce((acc, { from, to }) => { - acc.add(from); - acc.add(to); - return acc; - }, new Set()); - - for (const vertex of vertexes.values()) { - ensureVertex(adjacencyList, vertex); - } - - for (const { from, to } of edges) { - addEdge(adjacencyList, { from, to }); - } - - return adjacencyList; -} - -export function buildAdjacencyListFrom(literal: { [key: number]: number[] }) { - const expectedMap = new Map>(); - - for (const [key, list] of Object.entries(literal)) { - expectedMap.set(parseInt(key, 10), new Set(list)); - } - - return expectedMap; -} diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts deleted file mode 100644 index 5d8758c28d..0000000000 --- a/packages/core/test/helpers.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { ethers } from "ethers"; - -import { IgnitionError } from "../src/errors"; -import { - Services, - TransactionOptions, - ITransactionsService, - INetworkService, - IContractsService, - IConfigService, - IArtifactsService, - IAccountsService, -} from "../src/internal/types/services"; -import { ArtifactOld } from "../src/types/hardhat"; -import { HasParamResult } from "../src/types/providers"; - -export function getMockServices() { - const mockServices: Services = { - network: new MockNetworkService(), - contracts: new MockContractsService(), - artifacts: new MockArtifactsService(), - transactions: new MockTransactionService(), - config: new MockConfigService(), - accounts: new MockAccountsService(), - }; - - return mockServices; -} - -class MockNetworkService implements INetworkService { - public async getChainId(): Promise { - return 31337; - } -} - -class MockContractsService implements IContractsService { - private contractCount: number; - - constructor() { - this.contractCount = 0; - } - - public async sendTx( - _deployTransaction: ethers.providers.TransactionRequest, - _txOptions?: TransactionOptions | undefined - ): Promise { - this.contractCount++; - - return `0x0000${this.contractCount}`; - } -} - -class MockArtifactsService implements IArtifactsService { - public async hasArtifact(_name: string): Promise { - return true; - } - - public getArtifact(_name: string): Promise { - throw new IgnitionError("Method not implemented."); - } - - public getAllArtifacts(): Promise { - throw new IgnitionError("Method not implemented"); - } -} - -class MockTransactionService implements ITransactionsService { - public wait(_txHash: string): Promise { - return {} as any; - } - - public waitForEvent( - _filter: ethers.EventFilter, - _durationMs: number - ): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockConfigService implements IConfigService { - public getParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } - - public hasParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockAccountsService implements IAccountsService { - public getAccounts(): Promise { - throw new IgnitionError("Method not implemented."); - } - - public getSigner(_address: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} diff --git a/packages/core/test/helpers/exact-interface.ts b/packages/core/test/helpers/exact-interface.ts index a7381f264e..c193f0010b 100644 --- a/packages/core/test/helpers/exact-interface.ts +++ b/packages/core/test/helpers/exact-interface.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ export type ForbiddenExcessProperties = { [P in K]: never; }; diff --git a/packages/core/test/helpers/getMockProviders.ts b/packages/core/test/helpers/getMockProviders.ts deleted file mode 100644 index 5777e1017f..0000000000 --- a/packages/core/test/helpers/getMockProviders.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { ethers } from "ethers"; - -import { IgnitionError } from "../../src/errors"; -import { ExternalParamValue } from "../../src/types/dsl"; -import { ArtifactOld } from "../../src/types/hardhat"; -import { ModuleParams } from "../../src/types/module"; -import { - AccountsProvider, - ArtifactsProvider, - ConfigProvider, - EIP1193Provider, - GasProvider, - HasParamResult, - Providers, - TransactionsProvider, -} from "../../src/types/providers"; - -export function getMockProviders(): Providers { - const mockProviders: Providers = { - artifacts: new MockArtifactsProvider(), - ethereumProvider: new MockEthereumProvider(), - gasProvider: new MockGasProvider(), - transactions: new MockTransactionsProvider(), - config: new MockConfigProvider(), - accounts: new MockAccountsProvider(), - }; - - return mockProviders; -} - -class MockArtifactsProvider implements ArtifactsProvider { - public async getArtifact(_name: string): Promise { - throw new IgnitionError("Method not implemented."); - } - public async getAllArtifacts(): Promise { - throw new IgnitionError("Method not implemented."); - } - public async hasArtifact(_name: string): Promise { - return false; - } -} - -class MockEthereumProvider implements EIP1193Provider { - public async request(_args: { - method: string; - params?: unknown[] | undefined; - }): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockGasProvider implements GasProvider { - public estimateGasLimit( - _tx: ethers.providers.TransactionRequest - ): Promise { - throw new IgnitionError("Method not implemented."); - } - - public estimateGasPrice(): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockTransactionsProvider implements TransactionsProvider { - public isConfirmed(_txHash: string): Promise { - throw new IgnitionError("Method not implemented."); - } - - public isMined(_txHash: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockConfigProvider implements ConfigProvider { - public parameters: ModuleParams | undefined; - - public setParams(_parameters: { - [key: string]: ExternalParamValue; - }): Promise { - throw new IgnitionError("Method not implemented."); - } - - public getParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } - - public hasParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockAccountsProvider implements AccountsProvider { - public getAccounts(): Promise { - throw new Error("Method not implemented."); - } - - public getSigner(_address: string): Promise { - throw new Error("Method not implemented."); - } -} diff --git a/packages/core/test/helpers/getMockServices.ts b/packages/core/test/helpers/getMockServices.ts deleted file mode 100644 index e34e0fdf00..0000000000 --- a/packages/core/test/helpers/getMockServices.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { ethers } from "ethers"; - -import { IgnitionError } from "../../src/errors"; -import { - IAccountsService, - IArtifactsService, - IConfigService, - IContractsService, - INetworkService, - ITransactionsService, - Services, - TransactionOptions, -} from "../../src/internal/types/services"; -import { ArtifactOld } from "../../src/types/hardhat"; -import { HasParamResult } from "../../src/types/providers"; - -export function getMockServices() { - const mockServices: Services = { - network: new MockNetworkService(), - contracts: new MockContractsService(), - artifacts: new MockArtifactsService(), - transactions: new MockTransactionService(), - config: new MockConfigService(), - accounts: new MockAccountsService(), - }; - - return mockServices; -} - -class MockNetworkService implements INetworkService { - public async getChainId(): Promise { - return 31337; - } -} - -class MockContractsService implements IContractsService { - private contractCount: number; - - constructor() { - this.contractCount = 0; - } - - public async sendTx( - _deployTransaction: ethers.providers.TransactionRequest, - _txOptions?: TransactionOptions | undefined - ): Promise { - this.contractCount++; - - return `0x0000${this.contractCount}`; - } -} - -class MockArtifactsService implements IArtifactsService { - public getAllArtifacts(): Promise { - throw new Error("Method not implemented."); - } - - public async hasArtifact(_name: string): Promise { - return true; - } - - public getArtifact(_name: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockTransactionService implements ITransactionsService { - public wait(_txHash: string): Promise { - return {} as any; - } - - public waitForEvent( - _filter: ethers.EventFilter, - _durationMs: number - ): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockConfigService implements IConfigService { - public getParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } - - public hasParam(_paramName: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} - -class MockAccountsService implements IAccountsService { - public getAccounts(): Promise { - throw new IgnitionError("Method not implemented."); - } - - public getSigner(_address: string): Promise { - throw new IgnitionError("Method not implemented."); - } -} diff --git a/packages/core/test/helpers/setupIgnitionWith.ts b/packages/core/test/helpers/setupIgnitionWith.ts deleted file mode 100644 index 4b7161a323..0000000000 --- a/packages/core/test/helpers/setupIgnitionWith.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IgnitionImplementation } from "../../src/internal/Ignition"; -import { NoopCommandJournal } from "../../src/internal/journal/NoopCommandJournal"; -import { ICommandJournal } from "../../src/internal/types/journal"; -import { Services } from "../../src/internal/types/services"; - -class TestIgnition extends IgnitionImplementation { - constructor({ - services, - journal = new NoopCommandJournal(), - }: { - services: Services; - journal?: ICommandJournal; - }) { - super({ services, uiRenderer: () => {}, journal }); - } -} - -export function setupIgnitionWith({ - services, - journal, -}: { - services: Services; - journal?: ICommandJournal; -}) { - return new TestIgnition({ services, journal }); -} diff --git a/packages/core/test/internal/Ignition.ts b/packages/core/test/internal/Ignition.ts deleted file mode 100644 index 32d31cd2e9..0000000000 --- a/packages/core/test/internal/Ignition.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Ignition } from "../../src"; -import { IgnitionImplementation } from "../../src/internal/Ignition"; -import { ExactInterface } from "../helpers/exact-interface"; -import { getMockProviders } from "../helpers/getMockProviders"; - -describe("IgnitionImplementation", function () { - it("Shouldn't have any property apart from the ones defined in the Ignition interface", function () { - const _implementation: ExactInterface = - IgnitionImplementation.create({ providers: getMockProviders() }); - }); -}); diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index 15aca219ea..cf791ddf48 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 6f88313e9d..677d704d60 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 30e67ee084..f58e01a00f 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 11fcd56595..ef1676ee2e 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index c618dea4de..8a523db67d 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 1dc572a18c..4d9be4dbe1 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 39a237a0aa..6373e70928 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index b7a310a74f..dc418cddc4 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { defineModule } from "../../../src/new-api/define-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; import { Wiper } from "../../../src/new-api/internal/wiper"; diff --git a/packages/core/test/new-api/execution/sort-futures-by-nonce.ts b/packages/core/test/new-api/execution/sort-futures-by-nonce.ts index c839752647..8b7a30e8a5 100644 --- a/packages/core/test/new-api/execution/sort-futures-by-nonce.ts +++ b/packages/core/test/new-api/execution/sort-futures-by-nonce.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { sortFuturesByNonces } from "../../../src/new-api/internal/execution/sort-futures-by-nonces"; diff --git a/packages/core/test/new-api/getAccount.ts b/packages/core/test/new-api/getAccount.ts index 09f181efce..3a49b4e663 100644 --- a/packages/core/test/new-api/getAccount.ts +++ b/packages/core/test/new-api/getAccount.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index 065cac91e7..09a243c6b5 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 058bd49063..7c76bb97f8 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { ethers, providers } from "ethers"; diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index c6f61eacd1..e5ea27146c 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 0dd8bd9a26..48c27f82ed 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 4e4841ac18..d8a95058c2 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact, FutureType, ReadEventArgumentFuture } from "../../src"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index ed4a233f17..c86e7bb3ea 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../../../src"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index e9e30874e4..77fbc8778d 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../../../src"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index d1cb363f0b..33461f44c3 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../../../src"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index 75ffea7129..5d6512029b 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index 57a62fb95d..f9ef0f1d93 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 4d7090d6f4..083b3baa39 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 4da6ece0cd..bfc3eeceb7 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index b38bd009b6..43ccb7c246 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index d958253154..0b5442f23e 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index f621de94f7..55ebb554dc 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 8e23d447e6..471f3acd83 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 05cb6c96bb..88541dedff 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 47e31dcbc9..df7fd2499b 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index c57b07bb53..dd415ccbb8 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/types/deployment-loader.ts b/packages/core/test/new-api/types/deployment-loader.ts new file mode 100644 index 0000000000..a71cfd9113 --- /dev/null +++ b/packages/core/test/new-api/types/deployment-loader.ts @@ -0,0 +1,32 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { EphemeralDeploymentLoader } from "../../../src/new-api/internal/deployment-loader/ephemeral-deployment-loader"; +import { FileDeploymentLoader } from "../../../src/new-api/internal/deployment-loader/file-deployment-loader"; +import { DeploymentLoader } from "../../../src/new-api/types/deployment-loader"; +import { ExactInterface } from "../../helpers/exact-interface"; +import { setupMockArtifactResolver } from "../helpers"; + +describe("DeploymentLoaderImpls", function () { + describe("file-deployment-loader", () => { + it("Shouldn't have any property apart from the ones defined in the Deployment loader interface", function () { + const _implementation: ExactInterface< + DeploymentLoader, + FileDeploymentLoader + > = new FileDeploymentLoader("./example", true); + + assert.isDefined(_implementation); + }); + }); + + describe("ephemeral-deployment-loader", () => { + it("Shouldn't have any property apart from the ones defined in the Deployment loader interface", function () { + const _implementation: ExactInterface< + DeploymentLoader, + EphemeralDeploymentLoader + > = new EphemeralDeploymentLoader(setupMockArtifactResolver(), true); + + assert.isDefined(_implementation); + }); + }); +}); diff --git a/packages/core/test/new-api/types/module.ts b/packages/core/test/new-api/types/module.ts index 2705fd9917..d77a8165c7 100644 --- a/packages/core/test/new-api/types/module.ts +++ b/packages/core/test/new-api/types/module.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { Future, FutureType, diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 9772bffff4..34170ac628 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { Artifact } from "../../src"; diff --git a/packages/core/test/new-api/utils/adjacency-list.ts b/packages/core/test/new-api/utils/adjacency-list.ts index 5669641b65..0920c6dd50 100644 --- a/packages/core/test/new-api/utils/adjacency-list.ts +++ b/packages/core/test/new-api/utils/adjacency-list.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { AdjacencyList } from "../../../src/new-api/internal/utils/adjacency-list"; diff --git a/packages/core/test/new-api/utils/replace-within-arg.ts b/packages/core/test/new-api/utils/replace-within-arg.ts index 94f5cef099..9641a10d8a 100644 --- a/packages/core/test/new-api/utils/replace-within-arg.ts +++ b/packages/core/test/new-api/utils/replace-within-arg.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { ArgumentType, SolidityParameterType } from "../../../src"; diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index bb1ffee495..70fff7ac66 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; diff --git a/packages/core/test/options.ts b/packages/core/test/options.ts deleted file mode 100644 index 947d7e5518..0000000000 --- a/packages/core/test/options.ts +++ /dev/null @@ -1,132 +0,0 @@ -/* eslint-disable import/no-unused-modules */ - -import { assert } from "chai"; -import { BigNumber, ethers } from "ethers"; - -import { buildModule, Ignition } from "../src"; -import { - DeploymentResult, - DeploymentResultState, -} from "../src/internal/types/deployment"; -import { ArtifactOld } from "../src/types/hardhat"; - -import { getMockServices } from "./helpers"; -import { setupIgnitionWith } from "./helpers/setupIgnitionWith"; - -describe("deploy options", () => { - const tokenArtifact: ArtifactOld = { - contractName: "Token", - abi: [ - { - name: "ConfigComplete", - type: "event", - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "name", - type: "address", - }, - ], - }, - { - inputs: [ - { - internalType: "uint256", - name: "supply", - type: "uint256", - }, - ], - name: "configure", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - bytecode: "0x0000000001", - linkReferences: {}, - }; - - let ignition: Ignition; - let capturedTxOptions: any = null; - - before(async function () { - const services = getMockServices(); - - ignition = setupIgnitionWith({ - services: { - ...services, - accounts: { - ...services.accounts, - getAccounts: async () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: async (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - artifacts: { - hasArtifact: async () => true, - getArtifact: async () => tokenArtifact, - getAllArtifacts: async () => [tokenArtifact], - }, - transactions: { - ...services.transactions, - wait: async () => ({ - blockHash: "", - blockNumber: 0, - confirmations: 0, - from: "", - byzantium: true, - contractAddress: "", - cumulativeGasUsed: BigNumber.from(0), - effectiveGasPrice: BigNumber.from(0), - gasUsed: BigNumber.from(0), - logs: [], - logsBloom: "", - to: "", - transactionHash: "", - transactionIndex: 0, - type: 0, - }), - }, - contracts: { - ...services.contracts, - sendTx: async (_tran, txOptions) => { - capturedTxOptions = txOptions; - return "0xb75381e904154b34814d387c29e1927449edd98d30f5e310f25e9b1f19b0b077"; - }, - }, - }, - }); - - const module = buildModule("Example", (m) => { - m.contract("Token"); - - return {}; - }); - - const result = (await ignition.deploy(module, { - maxRetries: 1, - gasPriceIncrementPerRetry: BigNumber.from(1000), - pollingInterval: 4, - eventDuration: 10000, - networkName: "test-network", - force: false, - txPollingInterval: 4, - })) as DeploymentResult; - - assert.equal(result._kind, DeploymentResultState.SUCCESS); - }); - - it("should pass the options through to the transaction service", async function () { - assert.equal(capturedTxOptions.maxRetries, 1); - assert(BigNumber.isBigNumber(capturedTxOptions.gasPriceIncrementPerRetry)); - assert( - BigNumber.from(capturedTxOptions.gasPriceIncrementPerRetry).eq(1000) - ); - assert.equal(capturedTxOptions.pollingInterval, 4); - assert.equal(capturedTxOptions.eventDuration, 10000); - }); -}); diff --git a/packages/core/test/state-reducer/execution.ts b/packages/core/test/state-reducer/execution.ts deleted file mode 100644 index 768743a2c1..0000000000 --- a/packages/core/test/state-reducer/execution.ts +++ /dev/null @@ -1,351 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { - deployStateReducer, - initializeDeployState, -} from "../../src/internal/deployment/deployStateReducer"; -import { DeployState } from "../../src/internal/types/deployment"; -import { VertexResultEnum } from "../../src/internal/types/graph"; - -import { applyActions, resolveExecutionGraphFor } from "./utils"; - -describe("deployment state reducer", () => { - let state: DeployState; - - beforeEach(async () => { - const initialState = initializeDeployState("ExecutionExample"); - - const exampleExecutionGraph = await resolveExecutionGraphFor( - buildModule("TokenModule", (m) => { - const token = m.contract("Token"); - - const dex = m.contract("Dex", { after: [token] }); - const registrar = m.contract("Registrar", { after: [token] }); - - const aggregator = m.contract("Aggregator", { - after: [registrar], - }); - - return { token, dex, registrar, aggregator }; - }) - ); - - state = applyActions(initialState, [ - { - type: "SET_CHAIN_ID", - chainId: 31337, - }, - { - type: "SET_NETWORK_NAME", - networkName: "Hardhat", - }, - { - type: "START_VALIDATION", - }, - { - type: "TRANSFORM_COMPLETE", - executionGraph: exampleExecutionGraph, - }, - ]); - }); - - describe("starting execution", () => { - beforeEach(() => { - state = deployStateReducer(state, { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }); - }); - - it("should update the phase to execution", () => { - assert.equal(state.phase, "execution"); - }); - - it("should set the vertexes to unstarted", () => { - assert.deepStrictEqual(state.execution.vertexes, { - "0": { - status: "UNSTARTED", - result: undefined, - }, - "1": { - status: "UNSTARTED", - result: undefined, - }, - "2": { - status: "UNSTARTED", - result: undefined, - }, - "3": { - status: "UNSTARTED", - result: undefined, - }, - }); - }); - }); - - describe("setting new batch", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - ]); - }); - - it("should move the Token vertex from uninitialized to batch", () => { - assert.equal(state.execution.vertexes[0].status, "RUNNING"); - assert.deepStrictEqual(state.execution.batch, new Set([0])); - }); - }); - - describe("updating batch", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - ]); - }); - - it("should update the batch result", () => { - assert.equal(state.execution.batch, null); - - assert.deepStrictEqual(state.execution.vertexes[0], { - status: "COMPLETED", - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }); - }); - }); - - describe("completing batch", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - ]); - }); - - it("should complete the batch", () => { - assert.equal(state.execution.batch, null); - assert.deepStrictEqual(state.execution.vertexes[0], { - status: "COMPLETED", - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }); - }); - }); - - describe("completing deployment", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [1, 2], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 1, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 2, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [3], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 3, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - ]); - }); - - it("should be in the complete phase", () => { - assert.equal(state.phase, "complete"); - }); - - it("should show the vertexes as complete", () => { - assert.equal(state.execution.batch, null); - - assert.equal( - Object.values(state.execution.vertexes).every( - (v) => v.status === "COMPLETED" && v.result !== undefined - ), - true - ); - }); - }); - - describe("stopping on an on hold state", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [1], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 1, - result: { - _kind: VertexResultEnum.HOLD, - }, - }, - ]); - }); - - it("should be in the complete phase", () => { - assert.equal(state.phase, "hold"); - }); - - it("should show the vertexes as complete", () => { - assert.equal(state.execution.batch, null); - - assert.deepStrictEqual(state.execution.vertexes[1], { - status: "HOLD", - result: undefined, - }); - }); - }); - - describe("stopping on an failed state", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "EXECUTION::START", - executionGraphHash: "XXX", - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [0], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 0, - result: { - _kind: VertexResultEnum.SUCCESS, - result: { hash: "example" }, - }, - }, - - { - type: "EXECUTION::SET_BATCH", - batch: [1], - }, - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId: 1, - result: { - _kind: VertexResultEnum.FAILURE, - failure: new Error("No connection"), - }, - }, - ]); - }); - - it("should be in the complete phase", () => { - assert.equal(state.phase, "failed"); - }); - - it("should show the vertexes as complete", () => { - assert.equal(state.execution.batch, null); - - assert.deepStrictEqual(state.execution.vertexes[1], { - status: "FAILED", - result: { - _kind: VertexResultEnum.FAILURE, - failure: new Error("No connection"), - }, - }); - }); - }); -}); diff --git a/packages/core/test/state-reducer/preparation-steps.ts b/packages/core/test/state-reducer/preparation-steps.ts deleted file mode 100644 index 4b432f83e7..0000000000 --- a/packages/core/test/state-reducer/preparation-steps.ts +++ /dev/null @@ -1,155 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; - -import { buildModule } from "../../src/buildModule"; -import { - deployStateReducer, - initializeDeployState, -} from "../../src/internal/deployment/deployStateReducer"; -import { DeployState } from "../../src/internal/types/deployment"; -import { IExecutionGraph } from "../../src/internal/types/executionGraph"; - -import { applyActions, resolveExecutionGraphFor } from "./utils"; - -describe("deployment state reducer", () => { - let state: DeployState; - beforeEach(() => { - state = initializeDeployState("Example"); - }); - - describe("initialization", () => { - it("sets the module name", () => { - assert.equal(state.details.moduleName, "Example"); - }); - }); - - describe("setup", () => { - it("supports setting the chainId", () => { - const updated = deployStateReducer(state, { - type: "SET_CHAIN_ID", - chainId: 31337, - }); - - assert.equal(updated.details.chainId, 31337); - }); - - it("supports setting the network name", () => { - const updated = deployStateReducer(state, { - type: "SET_NETWORK_NAME", - networkName: "Hardhat", - }); - - assert.equal(updated.details.networkName, "Hardhat"); - }); - }); - - describe("validation", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "SET_CHAIN_ID", - chainId: 31337, - }, - { - type: "SET_NETWORK_NAME", - networkName: "Hardhat", - }, - { - type: "START_VALIDATION", - }, - ]); - }); - - describe("starting", () => { - it("should update the phase", () => { - assert.equal(state.phase, "validating"); - }); - }); - - describe("failure", () => { - beforeEach(() => { - state = deployStateReducer(state, { - type: "VALIDATION_FAIL", - errors: [new Error("Bad input")], - }); - }); - - it("should update the phase", () => { - assert.equal(state.phase, "validation-failed"); - }); - - it("should set errors against the validation phase", () => { - assert.equal(state.validation.errors.length, 1); - assert.equal(state.validation.errors[0].message, "Bad input"); - }); - }); - }); - - describe("transform", () => { - let exampleExecutionGraph: IExecutionGraph; - - beforeEach(async () => { - exampleExecutionGraph = await resolveExecutionGraphFor( - buildModule("TokenModule", (m) => { - const token = m.contract("Token"); - - return { token }; - }) - ); - - state = applyActions(state, [ - { - type: "SET_CHAIN_ID", - chainId: 31337, - }, - { - type: "SET_NETWORK_NAME", - networkName: "Hardhat", - }, - { - type: "START_VALIDATION", - }, - ]); - }); - - describe("completion", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "TRANSFORM_COMPLETE", - executionGraph: exampleExecutionGraph, - }, - ]); - }); - - it("should set the execution graph", () => { - if (state.transform.executionGraph === null) { - assert.fail(); - } - - assert.equal(state.transform.executionGraph.vertexes.size, 1); - }); - }); - - describe("unexpected failure", () => { - beforeEach(() => { - state = applyActions(state, [ - { - type: "UNEXPECTED_FAIL", - errors: [new Error("Failed graph transform")], - }, - ]); - }); - - it("should not set the execution graph", () => { - assert.isNull(state.transform.executionGraph); - }); - - it("should set the an entry in the unexpected errors", () => { - assert.deepStrictEqual(state.unexpected.errors, [ - new Error("Failed graph transform"), - ]); - }); - }); - }); -}); diff --git a/packages/core/test/state-reducer/utils.ts b/packages/core/test/state-reducer/utils.ts deleted file mode 100644 index ee0a6a6730..0000000000 --- a/packages/core/test/state-reducer/utils.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { deployStateReducer } from "../../src/internal/deployment/deployStateReducer"; -import { generateDeploymentGraphFrom } from "../../src/internal/process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "../../src/internal/process/transformDeploymentGraphToExecutionGraph"; -import { - DeployState, - DeployStateCommand, -} from "../../src/internal/types/deployment"; -import { isFailure } from "../../src/internal/utils/process-results"; -import { validateDeploymentGraph } from "../../src/internal/validation/validateDeploymentGraph"; -import { Module } from "../../src/types/module"; -import { ProcessResultKind } from "../../src/types/process"; -import { getMockServices } from "../helpers"; - -export function applyActions( - state: DeployState, - actions: DeployStateCommand[] -) { - return actions.reduce(deployStateReducer, state); -} - -export async function resolveExecutionGraphFor(module: Module) { - const constructDeploymentGraphResult = generateDeploymentGraphFrom(module, { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - }); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure constructing deployment graph"); - } - - const { graph: deploymentGraph } = constructDeploymentGraphResult.result; - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: (name: string) => ({ - _format: "hh-sol-artifact-1", - contractName: name, - sourceName: `contracts/${name}.sol`, - abi: [], - bytecode: "0x0", - deployedBytecode: "0x0", - linkReferences: {}, - deployedLinkReferences: {}, - }), - getAllArtifacts: () => [], - }, - accounts: { - getAccounts: () => { - return ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]; - }, - getSigner: (_address: string) => { - return new ethers.VoidSigner(_address); - }, - }, - } as any; - - const { _kind: validationKind } = await validateDeploymentGraph( - deploymentGraph, - {}, - mockServices - ); - - if (validationKind === ProcessResultKind.FAILURE) { - throw new Error("Cannot resolve graph, failed validation"); - } - - const transformResult = await transformDeploymentGraphToExecutionGraph( - deploymentGraph, - mockServices - ); - - if (isFailure(transformResult)) { - throw new Error("Cannot resolve graph, failed transform"); - } - - return transformResult.result.executionGraph; -} diff --git a/packages/core/test/tx-sender.ts b/packages/core/test/tx-sender.ts deleted file mode 100644 index 726ba4b3ef..0000000000 --- a/packages/core/test/tx-sender.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { assert } from "chai"; -import { ethers } from "ethers"; -import sinon from "sinon"; - -import { TxSender } from "../src/internal/utils/tx-sender"; -import { GasProvider } from "../src/types/providers"; - -class SignerSpy { - private _index = -1; - - public async sendTransaction(_tx: ethers.providers.TransactionRequest) { - this._index++; - return { - hash: `hash-${this._index}`, - } as ethers.providers.TransactionResponse; - } -} - -class MockGasProvider implements GasProvider { - public async estimateGasLimit( - _tx: ethers.providers.TransactionRequest - ): Promise { - return ethers.BigNumber.from(21000); - } - public async estimateGasPrice(): Promise { - return ethers.utils.parseUnits("1", "gwei"); - } -} - -function createSignerSpy() { - const signerSpy = new SignerSpy(); - - return sinon.spy(signerSpy); -} - -function createMockTx() { - return {} as ethers.providers.TransactionRequest; -} - -function runTests() { - const mockGasProvider = new MockGasProvider(); - - it("should add two transactions to journal", async function () { - const txSender = new TxSender(mockGasProvider); - - const signerStub = createSignerSpy(); - const mockTx1 = createMockTx(); - const hash1 = await txSender.send(signerStub as any, mockTx1); - assert.equal(hash1, "hash-0"); - assert.isTrue(signerStub.sendTransaction.calledWith(mockTx1)); - - const mockTx2 = createMockTx(); - const hash2 = await txSender.send(signerStub as any, mockTx2); - assert.equal(hash2, "hash-1"); - assert.isTrue(signerStub.sendTransaction.calledWith(mockTx2)); - }); -} - -describe("TxSender", function () { - runTests(); -}); diff --git a/packages/core/test/util/MemoryCommandJournal.ts b/packages/core/test/util/MemoryCommandJournal.ts deleted file mode 100644 index 479355f3ea..0000000000 --- a/packages/core/test/util/MemoryCommandJournal.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { DeployStateExecutionCommand } from "../../src/internal/types/deployment"; -import { ICommandJournal } from "../../src/internal/types/journal"; - -export class MemoryCommandJournal implements ICommandJournal { - private entries: string[]; - - constructor() { - this.entries = []; - } - - public async record(command: DeployStateExecutionCommand): Promise { - this.entries.push(JSON.stringify(command)); - } - - public async *read(): AsyncGenerator< - DeployStateExecutionCommand, - void, - unknown - > { - for (const entry of this.entries) { - const command: DeployStateExecutionCommand = JSON.parse(entry); - - yield command; - } - } - - public async *readAll(): AsyncGenerator< - DeployStateExecutionCommand & { chainId: number }, - void, - unknown - > { - for (const entry of this.entries) { - const command: DeployStateExecutionCommand & { chainId: number } = - JSON.parse(entry); - - yield command; - } - } - - public clear() { - this.entries = []; - } -} diff --git a/packages/core/test/validation.ts b/packages/core/test/validation.ts deleted file mode 100644 index 56f12ab010..0000000000 --- a/packages/core/test/validation.ts +++ /dev/null @@ -1,1103 +0,0 @@ -/* eslint-disable import/no-unused-modules */ - -import { assert } from "chai"; -import { ethers } from "ethers"; - -import { buildModule } from "../src/buildModule"; -import { IgnitionValidationError } from "../src/errors"; -import { generateDeploymentGraphFrom } from "../src/internal/process/generateDeploymentGraphFrom"; -import { ResultsAccumulator } from "../src/internal/types/graph"; -import { Services } from "../src/internal/types/services"; -import { isFailure } from "../src/internal/utils/process-results"; -import { validateDeploymentGraph } from "../src/internal/validation/validateDeploymentGraph"; -import { IDeploymentBuilder } from "../src/types/dsl"; -import { ArtifactContract } from "../src/types/future"; -import { ArtifactOld } from "../src/types/hardhat"; -import { Module, ModuleDict } from "../src/types/module"; -import { ProcessResultKind, ProcessStepResult } from "../src/types/process"; - -import { getMockServices } from "./helpers"; - -describe("Validation", () => { - const exampleArtifact: ArtifactOld = { - contractName: "Example", - abi: [], - bytecode: "0x0", - linkReferences: {}, - }; - - describe("artifact contract deploy", () => { - it("should validate a correct artifact contract deploy", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", exampleArtifact); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should not validate a artifact contract deploy with the wrong number of args", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", exampleArtifact, { - args: [1, 2, 3], - }); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "The constructor of the contract 'Example' expects 0 arguments but 3 were given" - ); - }); - - it("should not validate a artifact contract deploy with a non-BigNumber value", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", exampleArtifact, { - args: [1, 2, 3], - value: "42" as any, - }); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "For contract 'value' must be a BigNumber" - ); - }); - - it("should not validate a artifact contract deploy with a non-address `from`", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example", exampleArtifact, { - args: [1, 2, 3], - value: ethers.utils.parseUnits("42"), - from: 1 as any, - }); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "For contract 'from' must be a valid address string" - ); - }); - }); - - describe("artifact library deploy", () => { - it("should validate a correct artifact library deploy", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", exampleArtifact); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should not validate a artifact library deploy with a non-address `from`", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", exampleArtifact, { - args: [], - from: 1 as any, - }); - - return { example }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "For library 'from' must be a valid address string" - ); - }); - }); - - describe("call", () => { - const exampleCallArtifact = { - _format: "hh-sol-artifact-1", - contractName: "Foo", - sourceName: "contracts/Foo.sol", - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "sub", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "x", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - ], - bytecode: "0x0", - deployedBytecode: "0x0", - linkReferences: {}, - deployedLinkReferences: {}, - }; - - it("should validate a correct call", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "sub", { args: [2] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should validate an overriden call", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "inc(bool,uint256)", { args: [true, 2] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should fail a call on a nonexistant function", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "nonexistant", { args: [] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Contract 'Foo' doesn't have a function nonexistant" - ); - }); - - it("should fail a call with wrong number of arguments", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "sub", { args: [] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Function sub in contract Foo expects 1 arguments but 0 were given" - ); - }); - - it("should fail an overloaded call with wrong number of arguments", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("MyContract"); - - m.call(example, "inc", { args: [] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Function inc in contract MyContract is overloaded, but no overload expects 0 arguments" - ); - }); - - it("should fail a call on a non-BigNumber as value", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "nonexistant", { args: [], value: true as any }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For call 'value' must be a BigNumber" - ); - }); - - it("should fail a call sent from an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.call(example, "nonexistant", { - args: [], - value: ethers.utils.parseUnits("42"), - from: 1 as any, - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For call 'from' must be a valid address string" - ); - }); - }); - - describe("static call", () => { - const exampleCallArtifact = { - _format: "hh-sol-artifact-1", - contractName: "Foo", - sourceName: "contracts/Foo.sol", - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "sub", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [], - name: "x", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, - ], - bytecode: "0x0", - deployedBytecode: "0x0", - linkReferences: {}, - deployedLinkReferences: {}, - }; - - it("should validate a correct static call", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.staticCall(example, "x", { args: [] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should fail a static call on a nonexistant function", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.staticCall(example, "nonexistant", { args: [] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Contract 'Foo' doesn't have a function nonexistant" - ); - }); - - it("should fail a static call with wrong number of arguments", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.staticCall(example, "x", { args: [1] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Function x in contract Foo expects 0 arguments but 1 were given" - ); - }); - - it("should fail a call sent from an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.staticCall(example, "nonexistant", { - args: [], - from: 1 as any, - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For static call 'from' must be a valid address string" - ); - }); - - it("should fail a static call on a non-readonly function", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.staticCall(example, "sub", { args: [1] }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Function sub in contract Foo is not 'pure' or 'view' and cannot be statically called" - ); - }); - }); - - describe("sendETH", () => { - const exampleCallArtifact = { - _format: "hh-sol-artifact-1", - contractName: "Foo", - sourceName: "contracts/Foo.sol", - abi: [ - { - stateMutability: "payable", - type: "receive", - }, - ], - bytecode: - "6080604052348015600f57600080fd5b50604580601d6000396000f3fe608060405236600a57005b600080fdfea2646970667358221220da7e5683d44d4d83925bddf4a1eb18237892d4fe13551888fef8b0925eb9023664736f6c63430008070033", - deployedBytecode: "0x0", - linkReferences: {}, - deployedLinkReferences: {}, - }; - - it("should validate a correct send", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - const value = ethers.utils.parseUnits("42"); - - m.sendETH(example, { value }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should fail a send with an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - const value = ethers.utils.parseUnits("42"); - - m.sendETH("0xnull", { value }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - `"0xnull" is not a valid address` - ); - }); - - it("should fail a call on a non-BigNumber as value", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.sendETH(example, { value: true as any }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For send 'value' must be a BigNumber" - ); - }); - - it("should fail a send from an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Foo"); - - m.sendETH(example, { - value: ethers.utils.parseUnits("42"), - from: 1 as any, - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleCallArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For send 'from' must be a valid address string" - ); - }); - }); - - describe("awaited event", () => { - const exampleEventArtifact = { - _format: "hh-sol-artifact-1", - contractName: "Test", - sourceName: "contracts/Test.sol", - abi: [ - { - anonymous: false, - inputs: [ - { - indexed: true, - internalType: "address", - name: "sender", - type: "address", - }, - ], - name: "SomeEvent", - type: "event", - }, - { - inputs: [], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - bytecode: - "6080604052348015600f57600080fd5b5060b08061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", - deployedBytecode: - "6080604052348015600f57600080fd5b506004361060285760003560e01c8063f8a8fd6d14602d575b600080fd5b60336035565b005b3373ffffffffffffffffffffffffffffffffffffffff167f62e1088ac332ffa611ac64bd5a2aef2c27de42d3c61c686ec5c53753c35c7f6860405160405180910390a256fea2646970667358221220a77b6f6bba99fe90fc34a87656ffff1d3703a60de09e70feb2a64ed1dee0862264736f6c63430008070033", - linkReferences: {}, - deployedLinkReferences: {}, - }; - - it("should validate a correct awaited event", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test", exampleEventArtifact); - - const call = m.call(example, "test", { args: [] }); - - m.event(example as ArtifactContract, "SomeEvent", { - after: [call], - args: ["0x0"], - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleEventArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should fail awaiting a nonexistant event", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test", exampleEventArtifact); - - const call = m.call(example, "test", { args: [] }); - - m.event(example as ArtifactContract, "Nonexistant", { - args: [], - after: [call], - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleEventArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Contract 'Test' doesn't have an event Nonexistant" - ); - }); - - it("should fail an awaited event with too many arguments", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Test", exampleEventArtifact); - - const call = m.call(example, "test", { args: [] }); - - m.event(example as ArtifactContract, "SomeEvent", { - after: [call], - args: [1, 2, 3, 4], - }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleEventArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Event SomeEvent in contract Test expects 1 arguments but 4 were given" - ); - }); - }); - - describe("deployed contract", () => { - it("should validate a correct artifact library deploy", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const existing = m.contractAt( - "Example", - "0x0000000000000000000000000000000000000000", - [] - ); - - return { existing }; - }); - - const validationResult = await runValidation(singleModule); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should not validate a deployed contract with an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const existing = m.contractAt("Example", "0xBAD", []); - - return { existing }; - }); - - const validationResult = await runValidation(singleModule); - - assertValidationError( - validationResult, - "The existing contract Example has an invalid address 0xBAD" - ); - }); - }); - - describe("hardhat contract deploy", () => { - it("should validate a correct contract deploy", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.contract("Example"); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should not validate a contract deploy on a non-existant hardhat contract", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const nonexistant = m.contract("Nonexistant"); - - return { nonexistant }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => false, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Contract with name 'Nonexistant' doesn't exist" - ); - }); - - it("should not validate a contract with non-BigNumber value", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const nonexistant = m.contract("Nonexistant", { value: "42" as any }); - - return { nonexistant }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => false, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For contract 'value' must be a BigNumber" - ); - }); - - it("should not validate a contract deployed from an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const nonexistant = m.contract("Nonexistant", { from: 1 as any }); - - return { nonexistant }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => false, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For contract 'from' must be a valid address string" - ); - }); - }); - - describe("hardhat library deploy", () => { - it("should validate a correct deploy", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example"); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - - it("should not validate a library deploy on a non-existant hardhat library", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const nonexistant = m.library("Nonexistant"); - - return { nonexistant }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => false, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "Library with name 'Nonexistant' doesn't exist" - ); - }); - - it("should not validate a library deployed from an invalid address", async () => { - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - const example = m.library("Example", { args: [], from: 1 as any }); - - return { example }; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assertValidationError( - validationResult, - "For library 'from' must be a valid address string" - ); - }); - }); - - describe("virtual", () => { - it("should validate", async () => { - const submodule = buildModule("sub", (m) => { - const example = m.contract("Example"); - - return { example }; - }); - - const singleModule = buildModule("single", (m: IDeploymentBuilder) => { - m.useModule(submodule); - - return {}; - }); - - const mockServices = { - ...getMockServices(), - artifacts: { - hasArtifact: () => true, - getArtifact: () => exampleArtifact, - }, - } as any; - - const validationResult = await runValidation(singleModule, mockServices); - - assert.equal(validationResult._kind, ProcessResultKind.SUCCESS); - }); - }); -}); - -async function runValidation( - ignitionModule: Module, - givenMockServices?: Services | undefined -) { - const mockServices: Services = - givenMockServices ?? - ({ - ...getMockServices(), - } as any); - - const constructDeploymentGraphResult = generateDeploymentGraphFrom( - ignitionModule, - { - chainId: 31337, - accounts: ["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"], - artifacts: [], - } - ); - - if (isFailure(constructDeploymentGraphResult)) { - assert.fail("Failure while constructing deployment graph"); - } - - const { graph, callPoints } = constructDeploymentGraphResult.result; - - const validationResult = await validateDeploymentGraph( - graph, - callPoints, - mockServices - ); - - return validationResult; -} - -function assertValidationError( - validationResult: ProcessStepResult>, - expectedMessage: string -) { - if (!isFailure(validationResult)) { - return assert.fail("validation should have failed"); - } - - assert.equal(validationResult.message, "Validation failed"); - - const error = validationResult.failures[0]; - assert.equal(error.message, expectedMessage); - assert.isTrue(error instanceof IgnitionValidationError); -} From 430d571b395e0db3981e4162c4db188bff0741f6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 24 Jul 2023 20:26:06 +0100 Subject: [PATCH 0574/1302] refactor: remove old ./src from core Constrain the exports to only new-api, then remove all non-new-api code under src. --- packages/core/src/buildModule.ts | 32 - packages/core/src/helpers.ts | 3 - packages/core/src/index.ts | 11 - packages/core/src/initialization.ts | 50 - packages/core/src/internal/Ignition.ts | 557 --------- .../src/internal/deployment/Deployment.ts | 265 ----- .../deployment/deployExecutionStateReducer.ts | 98 -- .../internal/deployment/deployStateReducer.ts | 204 ---- .../core/src/internal/deployment/utils.ts | 30 - .../src/internal/dsl/DeploymentBuilder.ts | 1031 ----------------- .../core/src/internal/dsl/DeploymentGraph.ts | 17 - packages/core/src/internal/dsl/ScopeStack.ts | 19 - .../src/internal/execution/ExecutionGraph.ts | 4 - .../execution/dispatch/executeAwaitedEvent.ts | 55 - .../execution/dispatch/executeContractCall.ts | 58 - .../dispatch/executeContractDeploy.ts | 74 -- .../dispatch/executeDeployedContract.ts | 29 - .../dispatch/executeLibraryDeploy.ts | 61 - .../execution/dispatch/executeSendETH.ts | 55 - .../dispatch/executeStaticContractCall.ts | 43 - .../execution/dispatch/executionDispatch.ts | 41 - .../src/internal/execution/dispatch/utils.ts | 68 -- .../core/src/internal/execution/execute.ts | 147 --- .../src/internal/execution/loadJournalInto.ts | 12 - packages/core/src/internal/execution/utils.ts | 22 - packages/core/src/internal/graph/Graph.ts | 25 - .../core/src/internal/graph/adjacencyList.ts | 99 -- packages/core/src/internal/graph/utils.ts | 13 - packages/core/src/internal/graph/visit.ts | 54 - .../internal/journal/NoopCommandJournal.ts | 24 - .../process/generateDeploymentGraphFrom.ts | 46 - ...onvertDeploymentVertexToExecutionVertex.ts | 309 ----- ...oymentGraphByEliminatingVirtualVertexes.ts | 46 - ...ransformDeploymentGraphToExecutionGraph.ts | 57 - .../src/internal/services/AccountsService.ts | 28 - .../src/internal/services/ArtifactsService.ts | 19 - .../src/internal/services/ConfigService.ts | 16 - .../src/internal/services/ContractsService.ts | 155 --- .../src/internal/services/NetworkService.ts | 14 - .../internal/services/TransactionsService.ts | 39 - .../src/internal/services/createServices.ts | 36 - .../core/src/internal/types/deployment.ts | 304 ----- .../src/internal/types/deploymentGraph.ts | 229 ---- packages/core/src/internal/types/execution.ts | 12 - .../core/src/internal/types/executionGraph.ts | 276 ----- packages/core/src/internal/types/graph.ts | 120 -- packages/core/src/internal/types/journal.ts | 57 - packages/core/src/internal/types/services.ts | 114 -- .../core/src/internal/types/validation.ts | 14 - .../internal/utils/collectLibrariesAndLink.ts | 134 --- packages/core/src/internal/utils/guards.ts | 162 --- .../core/src/internal/utils/networkNames.ts | 36 - .../src/internal/utils/paramAssertions.ts | 23 - .../src/internal/utils/process-results.ts | 38 - packages/core/src/internal/utils/proxy.ts | 23 - packages/core/src/internal/utils/serialize.ts | 34 - packages/core/src/internal/utils/sets.ts | 19 - packages/core/src/internal/utils/tx-sender.ts | 67 -- .../internal/validation/dispatch/helpers.ts | 64 - .../dispatch/validateArtifactContract.ts | 62 - .../dispatch/validateArtifactLibrary.ts | 41 - .../validation/dispatch/validateCall.ts | 97 -- .../dispatch/validateDeployedContract.ts | 30 - .../validation/dispatch/validateEvent.ts | 94 -- .../dispatch/validateHardhatContract.ts | 65 -- .../dispatch/validateHardhatLibrary.ts | 42 - .../validation/dispatch/validateSendETH.ts | 50 - .../validation/dispatch/validateStaticCall.ts | 99 -- .../validation/dispatch/validateVirtual.ts | 18 - .../validation/dispatch/validationDispatch.ts | 66 -- .../validation/validateDeploymentGraph.ts | 44 - .../internal/execution/execution-engine.ts | 2 +- .../execution/onchain-state-transitions.ts | 3 +- .../src/{ => new-api}/internal/utils/sleep.ts | 0 packages/core/src/soon-to-be-removed.ts | 36 - packages/core/src/types/dsl.ts | 317 ----- packages/core/src/types/future.ts | 284 ----- packages/core/src/types/hardhat.ts | 14 - packages/core/src/types/ignition.ts | 90 -- packages/core/src/types/info.ts | 31 - packages/core/src/types/module.ts | 48 - packages/core/src/types/plan.ts | 6 - packages/core/src/types/process.ts | 17 - packages/core/src/types/providers.ts | 108 -- packages/core/src/types/serialization.ts | 22 - packages/core/src/ui-helpers.ts | 5 +- packages/hardhat-plugin/src/index.ts | 11 +- 87 files changed, 9 insertions(+), 7385 deletions(-) delete mode 100644 packages/core/src/buildModule.ts delete mode 100644 packages/core/src/helpers.ts delete mode 100644 packages/core/src/initialization.ts delete mode 100644 packages/core/src/internal/Ignition.ts delete mode 100644 packages/core/src/internal/deployment/Deployment.ts delete mode 100644 packages/core/src/internal/deployment/deployExecutionStateReducer.ts delete mode 100644 packages/core/src/internal/deployment/deployStateReducer.ts delete mode 100644 packages/core/src/internal/deployment/utils.ts delete mode 100644 packages/core/src/internal/dsl/DeploymentBuilder.ts delete mode 100644 packages/core/src/internal/dsl/DeploymentGraph.ts delete mode 100644 packages/core/src/internal/dsl/ScopeStack.ts delete mode 100644 packages/core/src/internal/execution/ExecutionGraph.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeContractCall.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeContractDeploy.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeDeployedContract.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeSendETH.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts delete mode 100644 packages/core/src/internal/execution/dispatch/executionDispatch.ts delete mode 100644 packages/core/src/internal/execution/dispatch/utils.ts delete mode 100644 packages/core/src/internal/execution/execute.ts delete mode 100644 packages/core/src/internal/execution/loadJournalInto.ts delete mode 100644 packages/core/src/internal/execution/utils.ts delete mode 100644 packages/core/src/internal/graph/Graph.ts delete mode 100644 packages/core/src/internal/graph/adjacencyList.ts delete mode 100644 packages/core/src/internal/graph/utils.ts delete mode 100644 packages/core/src/internal/graph/visit.ts delete mode 100644 packages/core/src/internal/journal/NoopCommandJournal.ts delete mode 100644 packages/core/src/internal/process/generateDeploymentGraphFrom.ts delete mode 100644 packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts delete mode 100644 packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts delete mode 100644 packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts delete mode 100644 packages/core/src/internal/services/AccountsService.ts delete mode 100644 packages/core/src/internal/services/ArtifactsService.ts delete mode 100644 packages/core/src/internal/services/ConfigService.ts delete mode 100644 packages/core/src/internal/services/ContractsService.ts delete mode 100644 packages/core/src/internal/services/NetworkService.ts delete mode 100644 packages/core/src/internal/services/TransactionsService.ts delete mode 100644 packages/core/src/internal/services/createServices.ts delete mode 100644 packages/core/src/internal/types/deployment.ts delete mode 100644 packages/core/src/internal/types/deploymentGraph.ts delete mode 100644 packages/core/src/internal/types/execution.ts delete mode 100644 packages/core/src/internal/types/executionGraph.ts delete mode 100644 packages/core/src/internal/types/graph.ts delete mode 100644 packages/core/src/internal/types/journal.ts delete mode 100644 packages/core/src/internal/types/services.ts delete mode 100644 packages/core/src/internal/types/validation.ts delete mode 100644 packages/core/src/internal/utils/collectLibrariesAndLink.ts delete mode 100644 packages/core/src/internal/utils/guards.ts delete mode 100644 packages/core/src/internal/utils/networkNames.ts delete mode 100644 packages/core/src/internal/utils/paramAssertions.ts delete mode 100644 packages/core/src/internal/utils/process-results.ts delete mode 100644 packages/core/src/internal/utils/proxy.ts delete mode 100644 packages/core/src/internal/utils/serialize.ts delete mode 100644 packages/core/src/internal/utils/sets.ts delete mode 100644 packages/core/src/internal/utils/tx-sender.ts delete mode 100644 packages/core/src/internal/validation/dispatch/helpers.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateArtifactContract.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateCall.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateDeployedContract.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateEvent.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateHardhatContract.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateSendETH.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateStaticCall.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validateVirtual.ts delete mode 100644 packages/core/src/internal/validation/dispatch/validationDispatch.ts delete mode 100644 packages/core/src/internal/validation/validateDeploymentGraph.ts rename packages/core/src/{ => new-api}/internal/utils/sleep.ts (100%) delete mode 100644 packages/core/src/soon-to-be-removed.ts delete mode 100644 packages/core/src/types/dsl.ts delete mode 100644 packages/core/src/types/future.ts delete mode 100644 packages/core/src/types/hardhat.ts delete mode 100644 packages/core/src/types/ignition.ts delete mode 100644 packages/core/src/types/info.ts delete mode 100644 packages/core/src/types/module.ts delete mode 100644 packages/core/src/types/plan.ts delete mode 100644 packages/core/src/types/process.ts delete mode 100644 packages/core/src/types/providers.ts delete mode 100644 packages/core/src/types/serialization.ts diff --git a/packages/core/src/buildModule.ts b/packages/core/src/buildModule.ts deleted file mode 100644 index 31254b034c..0000000000 --- a/packages/core/src/buildModule.ts +++ /dev/null @@ -1,32 +0,0 @@ -import type { Module, ModuleDict } from "./types/module"; - -import { - assertFunctionParam, - assertStringParam, -} from "./internal/utils/paramAssertions"; -import { IDeploymentBuilder } from "./types/dsl"; - -/** - * A factory that builds a deployment module given configuration function that - * manipulates an injected deployment builder. - * - * @param moduleName - The name that will be used for the module internally and in - * logging and the UI. - * @param moduleConfigurationAction - A non-async function that configures the - * deployment. - * @returns An Ignition module that can be deployed. - * - * @alpha - */ -export function buildModule( - moduleName: string, - moduleConfigurationAction: (m: IDeploymentBuilder) => T -): Module { - assertStringParam(moduleName, "moduleName"); - assertFunctionParam(moduleConfigurationAction, "moduleAction"); - - return { - name: moduleName, - action: moduleConfigurationAction, - }; -} diff --git a/packages/core/src/helpers.ts b/packages/core/src/helpers.ts deleted file mode 100644 index 27ab63a0fd..0000000000 --- a/packages/core/src/helpers.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { viewExecutionResults } from "./internal/deployment/utils"; -export { VertexResultEnum } from "./internal/types/graph"; -export { serializeReplacer } from "./internal/utils/serialize"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index a3a2afc2be..6617dd44c9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,4 @@ -export { buildModule } from "./buildModule"; export * from "./errors"; -export * from "./initialization"; export { defineModule } from "./new-api/define-module"; export { deploy } from "./new-api/deploy"; export { wipe } from "./new-api/wipe"; @@ -14,12 +12,3 @@ export * from "./new-api/types/deployer"; export * from "./new-api/types/module"; export * from "./new-api/types/module-builder"; export * from "./new-api/types/serialized-deployment"; -export * from "./types/dsl"; -export * from "./types/future"; -export * from "./types/hardhat"; -export * from "./types/ignition"; -export * from "./types/info"; -export * from "./types/module"; -export * from "./types/plan"; -export * from "./types/providers"; -export * from "./types/serialization"; diff --git a/packages/core/src/initialization.ts b/packages/core/src/initialization.ts deleted file mode 100644 index ac0770b021..0000000000 --- a/packages/core/src/initialization.ts +++ /dev/null @@ -1,50 +0,0 @@ -import type { UpdateUiAction } from "./internal/types/deployment"; -import type { ICommandJournal } from "./internal/types/journal"; -import type { - ICommandJournalT, - Ignition, - UpdateUiActionT, -} from "./types/ignition"; -import type { Providers } from "./types/providers"; - -import { IgnitionImplementation } from "./internal/Ignition"; - -/** - * The setup options for the Ignition. - * - * @alpha - */ -export interface IgnitionInitializationArguments { - /** - * The adapters that allows Ignition to communicate with external systems - * like the target blockchain or local filesystem. - */ - providers: Providers; - - /** - * An optional UI update function that will be invoked with the current - * Ignition state on each major state change. - */ - uiRenderer?: UpdateUiActionT; - - /** - * An optional journal that will be used to store a record of the current - * run and to access the history of previous runs. - */ - journal?: ICommandJournalT; -} - -/** - * Creates a new instances of Ignition - * - * @alpha - */ -export function initializeIgnition( - args: IgnitionInitializationArguments -): Ignition { - return IgnitionImplementation.create({ - providers: args.providers, - journal: args.journal as ICommandJournal | undefined, - uiRenderer: args.uiRenderer as UpdateUiAction | undefined, - }); -} diff --git a/packages/core/src/internal/Ignition.ts b/packages/core/src/internal/Ignition.ts deleted file mode 100644 index ae4c3899a8..0000000000 --- a/packages/core/src/internal/Ignition.ts +++ /dev/null @@ -1,557 +0,0 @@ -import type { - ModuleInfoData, - NetworkInfoData, - ContractInfoData, -} from "../types/info"; -import type { Module, ModuleDict } from "../types/module"; -import type { IgnitionPlan } from "../types/plan"; -import type { - ContractInfo, - SerializedDeploymentResult, -} from "../types/serialization"; -import type { ICommandJournal } from "./types/journal"; - -import setupDebug from "debug"; - -import { IgnitionError } from "../errors"; -import { Ignition, IgnitionDeployOptions } from "../types/ignition"; -import { ProcessStepResult } from "../types/process"; -import { Providers } from "../types/providers"; - -import { Deployment } from "./deployment/Deployment"; -import { execute } from "./execution/execute"; -import { loadJournalInto } from "./execution/loadJournalInto"; -import { hashExecutionGraph } from "./execution/utils"; -import { NoopCommandJournal } from "./journal/NoopCommandJournal"; -import { generateDeploymentGraphFrom } from "./process/generateDeploymentGraphFrom"; -import { transformDeploymentGraphToExecutionGraph } from "./process/transformDeploymentGraphToExecutionGraph"; -import { createServices } from "./services/createServices"; -import { - DeployStateExecutionCommand, - DeploymentResult, - DeploymentResultState, - UpdateUiAction, -} from "./types/deployment"; -import { - ExecutionResultsAccumulator, - ExecutionVisitResult, - IExecutionGraph, -} from "./types/executionGraph"; -import { VertexResultEnum, VisitResultState } from "./types/graph"; -import { Services } from "./types/services"; -import { networkNameByChainId } from "./utils/networkNames"; -import { - isFailure, - processStepFailed, - processStepSucceeded, -} from "./utils/process-results"; -import { resolveProxyValue } from "./utils/proxy"; -import { validateDeploymentGraph } from "./validation/validateDeploymentGraph"; - -const log = setupDebug("ignition:main"); - -/** - * The setup options for the Ignition. - * - * @internal - */ -export interface IgnitionCreationArgs { - /** - * The adapters that allows Ignition to communicate with external systems - * like the target blockchain or local filesystem. - */ - providers: Providers; - - /** - * An optional UI update function that will be invoked with the current - * Ignition state on each major state change. - */ - uiRenderer?: UpdateUiAction; - - /** - * An optional journal that will be used to store a record of the current - * run and to access the history of previous runs. - */ - journal?: ICommandJournal; -} - -/** - * The setup options for Ignition - * - * @internal - */ -export interface IgnitionConstructorArgs { - /** - * An adapter that allows Ignition to communicate with external services - * like the target blockchain or local filesystem. - */ - services: Services; - - /** - * A UI update function that will be invoked with the current - * Ignition state on each major state change. - */ - uiRenderer: UpdateUiAction; - - /** - * A journal that will be used to store a record of the current - * run and to access the history of previous runs. - */ - journal: ICommandJournal; -} - -/** - * The entry point for deploying using _Ignition_. - * - * @internal - */ -export class IgnitionImplementation implements Ignition { - private _services: Services; - private _uiRenderer: UpdateUiAction; - private _journal: ICommandJournal; - - /** - * A factory function to create a new Ignition instance based on the - * given providers. - * - * @param options - The setup options for Ignition. - * @returns The setup Ignition instance - */ - public static create({ - providers, - uiRenderer = () => {}, - journal = new NoopCommandJournal(), - }: IgnitionCreationArgs) { - return new IgnitionImplementation({ - services: createServices(providers), - uiRenderer: uiRenderer as UpdateUiAction, - journal: journal as ICommandJournal, - }); - } - - /** - * Creates a new Ignition instance that will manage and orchestrate a - * deployment. - * - * @param options - The service-based setup options for Ignition. - * - * @internal - */ - protected constructor({ - services, - uiRenderer, - journal, - }: IgnitionConstructorArgs) { - this._services = services; - this._uiRenderer = uiRenderer; - this._journal = journal; - } - - /** - * Run a deployment based on a given Ignition module on-chain, - * leveraging any configured journal to record. - * - * @param ignitionModule - An Ignition module - * @param options - Configuration options - * @returns A struct indicating whether the deployment was - * a success, failure or hold. A successful result will - * include the addresses of the deployed contracts. - * - * @internal - */ - public async deploy( - ignitionModule: Module, - options: IgnitionDeployOptions - ): Promise> { - log(`Start deploy`); - - const deployment = new Deployment( - ignitionModule.name, - this._services, - this._journal, - this._uiRenderer - ); - - try { - const [chainId, accounts, artifacts] = await Promise.all([ - this._services.network.getChainId(), - this._services.accounts.getAccounts(), - this._services.artifacts.getAllArtifacts(), - ]); - - await deployment.setDeploymentDetails({ - accounts, - chainId, - artifacts, - networkName: networkNameByChainId[chainId] ?? "unknown", - force: options.force, - }); - - const constructExecutionGraphResult = - await this._constructExecutionGraphFrom(deployment, ignitionModule); - - if (isFailure(constructExecutionGraphResult)) { - log("Failed to construct execution graph"); - - return { - _kind: DeploymentResultState.FAILURE, - failures: [ - constructExecutionGraphResult.message, - constructExecutionGraphResult.failures, - ], - }; - } - - const { executionGraph, moduleOutputs } = - constructExecutionGraphResult.result; - - log("Execution graph constructed"); - await deployment.transformComplete(executionGraph); - - // rebuild previous execution state based on journal - log("Load journal entries for network"); - await loadJournalInto(deployment, this._journal); - - // check that safe to run based on changes - log("Reconciling previous runs with current module"); - const moduleChangeResult = this._checkSafeDeployment(deployment); - - if (isFailure(moduleChangeResult)) { - log("Failed to reconcile"); - await deployment.failReconciliation(); - - return { - _kind: DeploymentResultState.FAILURE, - failures: [moduleChangeResult.message, moduleChangeResult.failures], - }; - } - - log("Execute based on execution graph"); - const executionResult = await execute(deployment, { - maxRetries: options.maxRetries, - gasPriceIncrementPerRetry: options.gasPriceIncrementPerRetry, - pollingInterval: options.pollingInterval, - eventDuration: options.eventDuration, - }); - - return this._buildOutputFrom(executionResult, moduleOutputs); - } catch (err) { - if (!(err instanceof Error)) { - const unexpectedError = new IgnitionError("Unexpected error"); - - await deployment.failUnexpected([unexpectedError]); - return { - _kind: DeploymentResultState.FAILURE, - failures: ["Unexpected error", [unexpectedError]], - }; - } - - await deployment.failUnexpected([err]); - return { - _kind: DeploymentResultState.FAILURE, - failures: ["Unexpected error", [err]], - }; - } - } - - /** - * Construct a plan (or dry run) describing how a deployment will be executed - * for the given module. - * - * @param deploymentModule - The Ignition module to be deployed - * @returns The deployment details as a plan - * - * @internal - */ - public async plan( - deploymentModule: Module - ): Promise { - log(`Start plan`); - - const [chainId, accounts, artifacts] = await Promise.all([ - this._services.network.getChainId(), - this._services.accounts.getAccounts(), - this._services.artifacts.getAllArtifacts(), - ]); - - const constructionResult = generateDeploymentGraphFrom(deploymentModule, { - chainId, - accounts, - artifacts, - }); - - if (isFailure(constructionResult)) { - throw new IgnitionError(constructionResult.message); - } - - const { graph: deploymentGraph, callPoints } = constructionResult.result; - - const validationResult = await validateDeploymentGraph( - deploymentGraph, - callPoints, - this._services - ); - - if (isFailure(validationResult)) { - throw new IgnitionError(validationResult.message); - } - - const transformResult = await transformDeploymentGraphToExecutionGraph( - deploymentGraph, - this._services - ); - - if (isFailure(transformResult)) { - throw new IgnitionError(transformResult.message); - } - - const { executionGraph } = transformResult.result; - - return { - deploymentGraph, - executionGraph, - networkName: networkNameByChainId[chainId] ?? "unknown", - }; - } - - /** - * Retrieve information about the given deployed module - * - * @param moduleName - The name of the Ignition module to retrieve data about - * @returns The addresses of the deployed contracts across any relevant networks - * - * @internal - */ - public async info(moduleName: string): Promise { - log(`Start info`); - - const journalData: { - [networkTag: string]: Array< - DeployStateExecutionCommand & { chainId: number } - >; - } = {}; - for await (const command of this._journal.readAll()) { - const network = networkNameByChainId[command.chainId] ?? "unknown"; - const networkTag = `${network}:${command.chainId}`; - - if (journalData[networkTag] === undefined) { - journalData[networkTag] = []; - } - - journalData[networkTag].push(command); - } - - const deployments: Deployment[] = []; - for (const [networkTag, commands] of Object.entries(journalData)) { - const deployment = new Deployment( - moduleName, - this._services, - this._journal - ); - - const [networkName, chainId] = networkTag.split(":"); - await deployment.setDeploymentDetails({ - networkName, - chainId: +chainId, - }); - - await deployment.load(commands); - - deployments.push(deployment); - } - - const moduleInfoData: { [moduleName: string]: ModuleInfoData } = {}; - for (const deployment of deployments) { - const { - networkName, - chainId, - moduleName: deploymentName, - } = deployment.state.details; - - const contracts: ContractInfoData[] = []; - for (const vertex of Object.values(deployment.state.execution.vertexes)) { - if ( - vertex.status === "COMPLETED" && - "bytecode" in vertex.result.result && - "value" in vertex.result.result - ) { - contracts.push({ - contractName: vertex.result.result.name, - status: "deployed", - address: vertex.result.result.address, - }); - } - } - - if (contracts.length > 0) { - const networkInfo: NetworkInfoData = { - networkName, - chainId, - contracts, - }; - moduleInfoData[deploymentName] ??= { - moduleName: deploymentName, - networks: [], - }; - moduleInfoData[deploymentName].networks.push(networkInfo); - } - } - - return Object.values(moduleInfoData); - } - - private async _constructExecutionGraphFrom( - deployment: Deployment, - ignitionModule: Module - ): Promise< - ProcessStepResult<{ executionGraph: IExecutionGraph; moduleOutputs: T }> - > { - log("Generate deployment graph from module"); - const deploymentGraphConstructionResult = generateDeploymentGraphFrom( - ignitionModule, - { - chainId: deployment.state.details.chainId, - accounts: deployment.state.details.accounts, - artifacts: deployment.state.details.artifacts, - } - ); - - if (isFailure(deploymentGraphConstructionResult)) { - await deployment.failUnexpected( - deploymentGraphConstructionResult.failures - ); - - return deploymentGraphConstructionResult; - } - - const { - graph: deploymentGraph, - callPoints, - moduleOutputs, - } = deploymentGraphConstructionResult.result; - - await deployment.startValidation(); - const validationResult = await validateDeploymentGraph( - deploymentGraph, - callPoints, - deployment.services - ); - - if (isFailure(validationResult)) { - await deployment.failValidation(validationResult.failures); - - return validationResult; - } - - log("Transform deployment graph to execution graph"); - const transformResult = await transformDeploymentGraphToExecutionGraph( - deploymentGraph, - deployment.services - ); - - if (isFailure(transformResult)) { - await deployment.failUnexpected(transformResult.failures); - - return transformResult; - } - - return processStepSucceeded({ - executionGraph: transformResult.result.executionGraph, - moduleOutputs, - }); - } - - private _buildOutputFrom( - executionResult: ExecutionVisitResult, - moduleOutputs: T - ): DeploymentResult { - if (executionResult._kind === VisitResultState.FAILURE) { - return { - _kind: DeploymentResultState.FAILURE, - failures: executionResult.failures, - }; - } - - if (executionResult._kind === VisitResultState.HOLD) { - return { - _kind: DeploymentResultState.HOLD, - holds: executionResult.holds, - }; - } - - const serializedDeploymentResult = this._serialize( - moduleOutputs, - executionResult.result - ); - - return { - _kind: DeploymentResultState.SUCCESS, - result: serializedDeploymentResult, - }; - } - - private _serialize( - moduleOutputs: T, - result: ExecutionResultsAccumulator - ): SerializedDeploymentResult { - const entries = Object.entries(moduleOutputs); - - const serializedResult: { [k: string]: ContractInfo } = {}; - for (const [key, value] of entries) { - const future = resolveProxyValue(value); - - const executionResultValue = result.get(future.vertexId); - - if ( - executionResultValue === undefined || - executionResultValue === null || - executionResultValue._kind === VertexResultEnum.FAILURE || - executionResultValue._kind === VertexResultEnum.HOLD || - future.type !== "contract" - ) { - continue; - } - - serializedResult[key] = executionResultValue.result as ContractInfo; - } - - return serializedResult as SerializedDeploymentResult; - } - - private _checkSafeDeployment( - deployment: Deployment - ): ProcessStepResult { - if (deployment.state.details.force) { - return processStepSucceeded(true); - } - - if (deployment.state.transform.executionGraph === null) { - return processStepFailed("Module reconciliation failed", [ - new IgnitionError( - "Execution graph must be set to check safe deployment" - ), - ]); - } - - const previousExecutionGraphHash = - deployment.state.execution.executionGraphHash; - - if (previousExecutionGraphHash === "") { - return processStepSucceeded(true); - } - - const currentExecutionGraphHash = hashExecutionGraph( - deployment.state.transform.executionGraph - ); - - if (previousExecutionGraphHash === currentExecutionGraphHash) { - return processStepSucceeded(true); - } - - return processStepFailed("Module reconciliation failed", [ - new IgnitionError( - "The module has been modified since the last run. You can ignore the previous runs with the '--force' flag." - ), - ]); - } -} diff --git a/packages/core/src/internal/deployment/Deployment.ts b/packages/core/src/internal/deployment/Deployment.ts deleted file mode 100644 index eeed724330..0000000000 --- a/packages/core/src/internal/deployment/Deployment.ts +++ /dev/null @@ -1,265 +0,0 @@ -import type { - DeployNetworkConfig, - DeployState, - DeployStateCommand, - DeployStateExecutionCommand, - UpdateUiAction, -} from "../types/deployment"; -import type { ExecutionVertexVisitResult } from "../types/executionGraph"; -import type { ICommandJournal } from "../types/journal"; -import type { Services } from "../types/services"; - -import setupDebug from "debug"; - -import { IgnitionError } from "../../errors"; -import { ExecutionGraph } from "../execution/ExecutionGraph"; -import { - VertexDescriptor, - VertexResultEnum, - VertexVisitResultFailure, -} from "../types/graph"; - -import { - deployStateReducer, - initializeDeployState, -} from "./deployStateReducer"; -import { isDeployStateExecutionCommand } from "./utils"; - -const log = setupDebug("ignition:deployment"); - -export class Deployment { - public state: DeployState; - public services: Services; - public ui?: UpdateUiAction; - private commandJournal: ICommandJournal; - - constructor( - moduleName: string, - services: Services, - journal: ICommandJournal, - ui?: UpdateUiAction - ) { - this.state = initializeDeployState(moduleName); - this.services = services; - this.commandJournal = journal; - this.ui = ui; - } - - public async load( - commandStream: - | AsyncGenerator - | DeployStateExecutionCommand[] - ) { - log("Loading from journal"); - - for await (const command of commandStream) { - this.state = deployStateReducer(this.state, command); - } - } - - public setDeploymentDetails(config: Partial) { - return this._runDeploymentCommand( - `DeploymentDetails resolved as ${JSON.stringify(config)}`, - { type: "SET_DETAILS", config } - ); - } - - public setChainId(chainId: number) { - return this._runDeploymentCommand(`ChainId resolved as '${chainId}'`, { - type: "SET_CHAIN_ID", - chainId, - }); - } - - public setNetworkName(networkName: string) { - return this._runDeploymentCommand( - `NetworkName resolved as '${networkName}'`, - { - type: "SET_NETWORK_NAME", - networkName, - } - ); - } - - public setAccounts(accounts: string[]) { - return this._runDeploymentCommand( - `Accounts resolved as '${accounts.join(", ")}'`, - { - type: "SET_ACCOUNTS", - accounts, - } - ); - } - - public setForceFlag(force: boolean) { - return this._runDeploymentCommand( - `Force resolved as '${force.toString()}'`, - { - type: "SET_FORCE_FLAG", - force, - } - ); - } - - public startValidation() { - return this._runDeploymentCommand("Validate deployment graph", { - type: "START_VALIDATION", - }); - } - - public failValidation(errors: Error[]) { - return this._runDeploymentCommand( - [`Validation failed with errors`, errors], - { - type: "VALIDATION_FAIL", - errors, - } - ); - } - - public transformComplete(executionGraph: ExecutionGraph) { - return this._runDeploymentCommand( - [`Transform complete`, [executionGraph]], - { - type: "TRANSFORM_COMPLETE", - executionGraph, - } - ); - } - - public failUnexpected(errors: Error[]) { - return this._runDeploymentCommand( - [`Failure from unexpected errors`, errors], - { - type: "UNEXPECTED_FAIL", - errors, - } - ); - } - - public failReconciliation() { - return this._runDeploymentCommand(`Reconciliation failed`, { - type: "RECONCILIATION_FAILED", - }); - } - - public startExecutionPhase(executionGraphHash: string) { - return this._runDeploymentCommand("Starting Execution", { - type: "EXECUTION::START", - executionGraphHash, - }); - } - - public updateExecutionWithNewBatch(batch: number[]) { - return this._runDeploymentCommand("Update execution with new batch", { - type: "EXECUTION::SET_BATCH", - batch, - }); - } - - public async updateVertexResult( - vertexId: number, - result: ExecutionVertexVisitResult - ) { - return this._runDeploymentCommand( - [`Update current with batch result for ${vertexId}`, [result]], - { - type: "EXECUTION::SET_VERTEX_RESULT", - vertexId, - result, - } - ); - } - - public readExecutionErrors() { - return [...Object.entries(this.state.execution.vertexes)] - .filter(([_id, value]) => value.status === "FAILED") - .reduce( - ( - acc: { [key: number]: VertexVisitResultFailure }, - [id, { result }] - ) => { - if ( - result === undefined || - result === null || - result._kind !== VertexResultEnum.FAILURE - ) { - return acc; - } - - acc[parseInt(id, 10)] = result; - - return acc; - }, - {} - ); - } - - public readExecutionHolds(): VertexDescriptor[] { - const executionGraph = this.state.transform.executionGraph; - - if (executionGraph === null) { - throw new IgnitionError("Cannot read from unset execution graph"); - } - - return [...Object.entries(this.state.execution.vertexes)] - .filter(([_id, value]) => value.status === "HOLD") - .map(([id]) => { - const vertex = executionGraph.vertexes.get(parseInt(id, 10)); - - if (vertex === undefined) { - return null; - } - - const descriptor: VertexDescriptor = { - id: vertex.id, - label: vertex.label, - type: vertex.type, - }; - - return descriptor; - }) - .filter((x): x is VertexDescriptor => x !== null); - } - - public hasUnstarted(): boolean { - return Object.values(this.state.execution.vertexes).some( - (v) => v.status === "UNSTARTED" - ); - } - - public hasErrors(): boolean { - return Object.values(this.state.execution.vertexes).some( - (v) => v.status === "FAILED" - ); - } - - public hasHolds(): boolean { - return Object.values(this.state.execution.vertexes).some( - (v) => v.status === "HOLD" - ); - } - - private async _runDeploymentCommand( - logMessage: string | [string, any[]], - command: DeployStateCommand - ): Promise { - log.apply(this, typeof logMessage === "string" ? [logMessage] : logMessage); - - if (isDeployStateExecutionCommand(command)) { - await this.commandJournal.record(command); - } - - this.state = deployStateReducer(this.state, command); - - this._renderToUi(this.state); - } - - private _renderToUi(state: DeployState) { - if (this.ui === undefined) { - return; - } - - this.ui(state); - } -} diff --git a/packages/core/src/internal/deployment/deployExecutionStateReducer.ts b/packages/core/src/internal/deployment/deployExecutionStateReducer.ts deleted file mode 100644 index acf6bc2112..0000000000 --- a/packages/core/src/internal/deployment/deployExecutionStateReducer.ts +++ /dev/null @@ -1,98 +0,0 @@ -import type { - ExecutionState, - DeployStateExecutionCommand, - VertexExecutionState, - VertexExecutionStatusUnstarted, - VertexExecutionStatusFailed, - VertexExecutionStatusCompleted, - VertexExecutionStatusHold, -} from "../types/deployment"; -import type { ExecutionVertexVisitResult } from "../types/executionGraph"; - -import { VertexResultEnum } from "../types/graph"; - -export function deployExecutionStateReducer( - state: ExecutionState, - action: DeployStateExecutionCommand -): ExecutionState { - switch (action.type) { - case "EXECUTION::START": - // initialisation is done at the deployStateReducer level - return state; - case "EXECUTION::SET_BATCH": - return updateExecutionStateWithNewBatch(state, action.batch); - case "EXECUTION::SET_VERTEX_RESULT": - const updatedVertexes: { [key: number]: VertexExecutionState } = { - ...state.vertexes, - [action.vertexId]: convertTo(action.result), - }; - - if ( - state.batch !== null && - [...state.batch].every( - (id) => - updatedVertexes[id]?.status === "COMPLETED" || - updatedVertexes[id]?.status === "FAILED" || - updatedVertexes[id]?.status === "HOLD" - ) - ) { - return { - ...state, - batch: null, - previousBatches: [...state.previousBatches, state.batch], - vertexes: updatedVertexes, - }; - } - - return { - ...state, - vertexes: updatedVertexes, - }; - } -} - -function updateExecutionStateWithNewBatch( - state: ExecutionState, - batch: number[] -): ExecutionState { - const uniqueBatch = new Set(batch); - - const updatedVertexes = [...uniqueBatch].reduce( - (vertexes, id): { [key: number]: VertexExecutionState } => ({ - ...vertexes, - [id]: { - status: "RUNNING" as VertexExecutionStatusUnstarted, - result: undefined, - }, - }), - state.vertexes - ); - - return { - ...state, - batch: uniqueBatch, - vertexes: updatedVertexes, - }; -} - -function convertTo( - vertexVisitResult: ExecutionVertexVisitResult -): VertexExecutionState { - switch (vertexVisitResult._kind) { - case VertexResultEnum.SUCCESS: - return { - status: "COMPLETED" as VertexExecutionStatusCompleted, - result: vertexVisitResult, - }; - case VertexResultEnum.FAILURE: - return { - status: "FAILED" as VertexExecutionStatusFailed, - result: vertexVisitResult, - }; - case VertexResultEnum.HOLD: - return { - status: "HOLD" as VertexExecutionStatusHold, - result: undefined, - }; - } -} diff --git a/packages/core/src/internal/deployment/deployStateReducer.ts b/packages/core/src/internal/deployment/deployStateReducer.ts deleted file mode 100644 index bb47f8bd7d..0000000000 --- a/packages/core/src/internal/deployment/deployStateReducer.ts +++ /dev/null @@ -1,204 +0,0 @@ -import type { - DeployPhase, - DeployState, - ExecutionState, - DeployStateCommand, - VertexExecutionState, -} from "../types/deployment"; - -import { ExecutionGraph } from "../execution/ExecutionGraph"; - -import { deployExecutionStateReducer } from "./deployExecutionStateReducer"; - -export function initializeDeployState(moduleName: string): DeployState { - return { - phase: "uninitialized", - details: { - moduleName, - chainId: 0, - networkName: "", - accounts: [], - artifacts: [], - force: false, - }, - validation: { - errors: [], - }, - transform: { - executionGraph: null, - }, - execution: { - run: 0, - vertexes: {}, - batch: null, - previousBatches: [], - executionGraphHash: "", - }, - unexpected: { - errors: [], - }, - }; -} - -export function deployStateReducer( - state: DeployState, - action: DeployStateCommand -): DeployState { - switch (action.type) { - case "SET_DETAILS": - return { - ...state, - details: { - ...state.details, - ...action.config, - }, - }; - case "SET_CHAIN_ID": - return { - ...state, - details: { - ...state.details, - chainId: action.chainId, - }, - }; - case "SET_NETWORK_NAME": - return { - ...state, - details: { - ...state.details, - networkName: action.networkName, - }, - }; - case "SET_ACCOUNTS": - return { - ...state, - details: { - ...state.details, - accounts: action.accounts, - }, - }; - case "SET_FORCE_FLAG": - return { - ...state, - details: { - ...state.details, - force: action.force, - }, - }; - case "START_VALIDATION": - return { - ...state, - phase: "validating", - }; - case "VALIDATION_FAIL": - return { - ...state, - phase: "validation-failed", - validation: { - ...state.validation, - errors: action.errors, - }, - }; - case "TRANSFORM_COMPLETE": - return { - ...state, - transform: { executionGraph: action.executionGraph }, - }; - case "RECONCILIATION_FAILED": - return { ...state, phase: "reconciliation-failed" }; - case "UNEXPECTED_FAIL": - return { - ...state, - phase: "failed-unexpectedly", - unexpected: { - errors: action.errors, - }, - }; - case "EXECUTION::START": - if (state.transform.executionGraph === null) { - return state; - } - - const executionStateForRun = deployExecutionStateReducer( - initialiseExecutionStateFrom( - state.transform.executionGraph, - action.executionGraphHash, - state.execution, - state.details.force - ), - action - ); - - return { - ...state, - phase: resolvePhaseFrom(executionStateForRun), - execution: executionStateForRun, - }; - case "EXECUTION::SET_BATCH": - return { - ...state, - execution: deployExecutionStateReducer(state.execution, action), - }; - case "EXECUTION::SET_VERTEX_RESULT": - const updatedExecution = deployExecutionStateReducer( - state.execution, - action - ); - - return { - ...state, - phase: resolvePhaseFrom(updatedExecution), - execution: updatedExecution, - }; - } -} - -function initialiseExecutionStateFrom( - executionGraph: ExecutionGraph, - executionGraphHash: string, - previousExecutionState: ExecutionState, - force: boolean -): ExecutionState { - const vertexes = Array.from(executionGraph.vertexes.keys()).reduce<{ - [key: number]: VertexExecutionState; - }>((acc, id) => { - if (!force && previousExecutionState.vertexes[id]?.status === "COMPLETED") { - return { ...acc, [id]: previousExecutionState.vertexes[id] }; - } - - return { ...acc, [id]: { status: "UNSTARTED", result: undefined } }; - }, {}); - - const executionState: ExecutionState = { - ...previousExecutionState, - run: previousExecutionState.run + 1, - vertexes, - batch: null, - previousBatches: [], - executionGraphHash, - }; - - return executionState; -} - -function resolvePhaseFrom(executionState: ExecutionState): DeployPhase { - if ( - Object.values(executionState.vertexes).some((v) => v.status === "FAILED") - ) { - return "failed"; - } - - if (Object.values(executionState.vertexes).some((v) => v.status === "HOLD")) { - return "hold"; - } - - if ( - Object.values(executionState.vertexes).every( - (v) => v.status !== "UNSTARTED" - ) - ) { - return "complete"; - } - - return "execution"; -} diff --git a/packages/core/src/internal/deployment/utils.ts b/packages/core/src/internal/deployment/utils.ts deleted file mode 100644 index 5e2d79c2e5..0000000000 --- a/packages/core/src/internal/deployment/utils.ts +++ /dev/null @@ -1,30 +0,0 @@ -import type { - DeployState, - DeployStateCommand, - DeployStateExecutionCommand, -} from "../types/deployment"; -import type { - ExecutionResultsAccumulator, - ExecutionVertexVisitResult, -} from "../types/executionGraph"; - -export function isDeployStateExecutionCommand( - command: DeployStateCommand -): command is DeployStateExecutionCommand { - return [ - "EXECUTION::START", - "EXECUTION::SET_BATCH", - "EXECUTION::SET_VERTEX_RESULT", - ].includes(command.type); -} - -export function viewExecutionResults( - deployState: DeployState -): ExecutionResultsAccumulator { - const entries: Array<[number, ExecutionVertexVisitResult | undefined]> = - Object.entries(deployState.execution.vertexes).map( - ([vertexId, vertexState]) => [parseInt(vertexId, 10), vertexState.result] - ); - - return new Map(entries); -} diff --git a/packages/core/src/internal/dsl/DeploymentBuilder.ts b/packages/core/src/internal/dsl/DeploymentBuilder.ts deleted file mode 100644 index 4d632e3bdf..0000000000 --- a/packages/core/src/internal/dsl/DeploymentBuilder.ts +++ /dev/null @@ -1,1031 +0,0 @@ -import type { - AddressResolvable, - ArtifactContract, - ArtifactLibrary, - ContractCall, - ContractFutureOld, - DependableFuture, - DeployedContract, - DeploymentGraphFuture, - EventFuture, - EventParamFuture, - EventParams, - HardhatContract, - HardhatLibrary, - OptionalParameter, - ParameterValue, - ProxyFuture, - RequiredParameter, - SendFuture, - StaticContractCall, - Virtual, -} from "../../types/future"; -import type { ArtifactOld } from "../../types/hardhat"; -import type { Module, ModuleDict } from "../../types/module"; - -import { BigNumber, ethers } from "ethers"; -import hash from "object-hash"; - -import { IgnitionError, IgnitionValidationError } from "../../errors"; -import { - ArtifactContractDeploymentVertex, - ArtifactLibraryDeploymentVertex, - CallDeploymentVertex, - CallPoints, - DeployedContractDeploymentVertex, - DeploymentBuilderOptions, - DeploymentGraphVertex, - EventVertex, - HardhatContractDeploymentVertex, - HardhatLibraryDeploymentVertex, - IDeploymentGraph, - ScopeData, - SendVertex, - StaticCallDeploymentVertex, - VirtualVertex, -} from "../../internal/types/deploymentGraph"; -import { - assertModuleReturnTypes, - isArtifact, - isContract, - isDependable, - isFuture, - isParameter, -} from "../../internal/utils/guards"; -import { resolveProxyDependency } from "../../internal/utils/proxy"; -import { - AwaitOptions, - CallOptionsOld, - ContractOptionsOld, - IDeploymentBuilder, - InternalParamValue, - SendOptions, - StaticCallOptionsOld, - UseModuleOptions, -} from "../../types/dsl"; -import { addEdge, ensureVertex } from "../graph/adjacencyList"; - -import { DeploymentGraph } from "./DeploymentGraph"; -import { ScopeStack } from "./ScopeStack"; - -interface ArtifactMap { - [contractName: string]: ArtifactOld; -} - -/** - * A module's data. - * - * @internal - */ -export interface ModuleData { - result: Virtual & ModuleDict; - optionsHash: string; -} - -/** - * A cache of modules. - * - * @internal - */ -export interface ModuleCache { - [label: string]: ModuleData; -} - -type DeploymentApiPublicFunctions = - | InstanceType["contract"] - | InstanceType["library"] - | InstanceType["contractAt"] - | InstanceType["call"] - | InstanceType["staticCall"] - | InstanceType["event"] - | InstanceType["sendETH"] - | InstanceType["useModule"]; - -const DEFAULT_VALUE = ethers.utils.parseUnits("0"); - -/** - * A builder object for specifying the different parts of your deployment - * and their interdependencies. - */ -export class DeploymentBuilder implements IDeploymentBuilder { - /** {@inheritDoc IDeploymentBuilder.chainId} */ - public chainId: number; - - /** {@inheritDoc IDeploymentBuilder.accounts} */ - public accounts: string[]; - - /** - * The deployment graph built from the configuration actions. - * - * @internal - */ - public graph: IDeploymentGraph; - - /** - * A mapping of deployment graph vertexes to the source code - * position of the DeploymentBuilder action that created - * them. Used during validation to provide better error - * messages. - * - * @internal - */ - public callPoints: CallPoints; - - private idCounter: number = 0; - private moduleCache: ModuleCache = {}; - private useModuleInvocationCounter: number = 0; - private scopes: ScopeStack = new ScopeStack(); - private artifactMap: ArtifactMap = {}; - - constructor(options: DeploymentBuilderOptions) { - this.chainId = options.chainId; - this.accounts = options.accounts; - this.graph = new DeploymentGraph(); - this.callPoints = {}; - - for (const artifact of options.artifacts) { - this.artifactMap[artifact.contractName] = artifact; - } - } - - public library( - libraryName: string, - options?: ContractOptionsOld - ): HardhatLibrary; - public library( - libraryName: string, - artifact: ArtifactOld, - options?: ContractOptionsOld - ): ArtifactLibrary; - public library( - libraryName: string, - artifactOrOptions?: ContractOptionsOld | ArtifactOld, - givenOptions?: ContractOptionsOld - ): HardhatLibrary | ArtifactLibrary { - if (isArtifact(artifactOrOptions)) { - const artifact = artifactOrOptions; - const options: ContractOptionsOld | undefined = givenOptions; - - const artifactContractFuture: ArtifactLibrary = { - vertexId: this._resolveNextId(), - label: libraryName, - type: "library", - subtype: "artifact", - artifact, - _future: true, - }; - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.library, { - id: artifactContractFuture.vertexId, - label: libraryName, - type: "ArtifactLibrary", - artifact, - args: options?.args ?? [], - scopeAdded: this.scopes.getScopedLabel(), - after: options?.after ?? [], - from: options?.from ?? this.accounts[0], - }); - - return artifactContractFuture; - } else { - const options: ContractOptionsOld | undefined = artifactOrOptions; - - const libraryFuture: HardhatLibrary = { - vertexId: this._resolveNextId(), - label: libraryName, - type: "library", - subtype: "hardhat", - libraryName, - _future: true, - }; - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.library, { - id: libraryFuture.vertexId, - label: libraryName, - type: "HardhatLibrary", - libraryName, - args: options?.args ?? [], - scopeAdded: this.scopes.getScopedLabel(), - after: options?.after ?? [], - from: options?.from ?? this.accounts[0], - }); - - return libraryFuture; - } - } - - public contract( - contractName: string, - options?: ContractOptionsOld - ): HardhatContract; - public contract( - contractName: string, - artifact: ArtifactOld, - options?: ContractOptionsOld - ): ArtifactContract; - public contract( - contractName: string, - artifactOrOptions?: ArtifactOld | ContractOptionsOld, - givenOptions?: ContractOptionsOld - ): HardhatContract | ArtifactContract { - if (isArtifact(artifactOrOptions)) { - const artifact = artifactOrOptions; - const options: ContractOptionsOld | undefined = givenOptions; - - const artifactContractFuture: ArtifactContract = { - vertexId: this._resolveNextId(), - label: contractName, - type: "contract", - subtype: "artifact", - artifact, - _future: true, - }; - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contract, { - id: artifactContractFuture.vertexId, - label: contractName, - type: "ArtifactContract", - artifact, - args: options?.args ?? [], - libraries: options?.libraries ?? {}, - scopeAdded: this.scopes.getScopedLabel(), - after: options?.after ?? [], - value: options?.value ?? DEFAULT_VALUE, - from: options?.from ?? this.accounts[0], - }); - - return artifactContractFuture; - } else { - const options: ContractOptionsOld | undefined = artifactOrOptions; - - const contractFuture: HardhatContract = { - vertexId: this._resolveNextId(), - label: contractName, - type: "contract", - subtype: "hardhat", - contractName, - _future: true, - }; - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contract, { - id: contractFuture.vertexId, - label: contractName, - type: "HardhatContract", - contractName, - args: options?.args ?? [], - libraries: options?.libraries ?? {}, - scopeAdded: this.scopes.getScopedLabel(), - after: options?.after ?? [], - value: options?.value ?? DEFAULT_VALUE, - from: options?.from ?? this.accounts[0], - }); - - return contractFuture; - } - } - - public contractAt( - contractName: string, - address: string | EventParamFuture, - abi: any[], - options?: { after?: DeploymentGraphFuture[] } - ): DeployedContract { - const deployedFuture: DeployedContract = { - vertexId: this._resolveNextId(), - label: contractName, - type: "contract", - subtype: "deployed", - abi, - address, - _future: true, - }; - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.contractAt, { - id: deployedFuture.vertexId, - label: contractName, - type: "DeployedContract", - address, - abi, - scopeAdded: this.scopes.getScopedLabel(), - after: options?.after ?? [], - }); - - return deployedFuture; - } - - public call( - contractFuture: DeploymentGraphFuture, - functionName: string, - { args, after, value, from }: CallOptionsOld - ): ContractCall { - const callFuture: ContractCall = { - vertexId: this._resolveNextId(), - label: `${contractFuture.label}/${functionName}`, - type: "call", - _future: true, - }; - - let contract: ContractFutureOld; - if (isParameter(contractFuture)) { - const parameter = contractFuture; - const scope = parameter.scope; - - const scopeData = this.graph.scopeData[scope]; - - if ( - scopeData === undefined || - scopeData.parameters === undefined || - !(parameter.label in scopeData.parameters) - ) { - throw new IgnitionError("Could not resolve contract from parameter"); - } - - contract = scopeData.parameters[parameter.label] as - | HardhatContract - | ArtifactContract - | DeployedContract; - } else if (isContract(contractFuture)) { - contract = contractFuture; - } else { - throw new IgnitionError( - `Not a contract future ${contractFuture.label} (${contractFuture.type})` - ); - } - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.call, { - id: callFuture.vertexId, - label: callFuture.label, - type: "Call", - contract, - method: functionName, - args: args ?? [], - after: after ?? [], - scopeAdded: this.scopes.getScopedLabel(), - value: value ?? DEFAULT_VALUE, - from: from ?? this.accounts[0], - }); - - return callFuture; - } - - public staticCall( - contractFuture: DeploymentGraphFuture, - functionName: string, - { args, after, from }: StaticCallOptionsOld - ): StaticContractCall { - const staticCallFuture: StaticContractCall = { - vertexId: this._resolveNextId(), - label: `${contractFuture.label}/${functionName}`, - type: "static-call", - _future: true, - }; - - let contract: ContractFutureOld; - if (isParameter(contractFuture)) { - const parameter = contractFuture; - const scope = parameter.scope; - - const scopeData = this.graph.scopeData[scope]; - - if ( - scopeData === undefined || - scopeData.parameters === undefined || - !(parameter.label in scopeData.parameters) - ) { - throw new IgnitionError("Could not resolve contract from parameter"); - } - - contract = scopeData.parameters[parameter.label] as - | HardhatContract - | ArtifactContract - | DeployedContract; - } else if (isContract(contractFuture)) { - contract = contractFuture; - } else { - throw new IgnitionError( - `Not a contract future ${contractFuture.label} (${contractFuture.type})` - ); - } - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.call, { - id: staticCallFuture.vertexId, - label: staticCallFuture.label, - type: "StaticCall", - contract, - method: functionName, - args: args ?? [], - after: after ?? [], - scopeAdded: this.scopes.getScopedLabel(), - from: from ?? this.accounts[0], - }); - - return staticCallFuture; - } - - public event( - contractFuture: DeploymentGraphFuture, - eventName: string, - { args, after }: AwaitOptions - ): EventFuture { - const vertexId = this._resolveNextId(); - - const eventFuture: EventFuture = { - vertexId, - label: `${contractFuture.label}/${eventName}`, - type: "await", - subtype: "event", - _future: true, - params: {}, - }; - - let contract: ContractFutureOld; - if (isParameter(contractFuture)) { - const parameter = contractFuture; - const scope = parameter.scope; - - const scopeData = this.graph.scopeData[scope]; - - if ( - scopeData === undefined || - scopeData.parameters === undefined || - !(parameter.label in scopeData.parameters) - ) { - throw new IgnitionError("Could not resolve contract from parameter"); - } - - contract = scopeData.parameters[parameter.label] as - | HardhatContract - | ArtifactContract - | DeployedContract; - } else if ( - isContract(contractFuture) && - contractFuture.type === "contract" - ) { - contract = contractFuture; - } else { - throw new IgnitionError( - `Not a contract future ${contractFuture.label} (${contractFuture.type})` - ); - } - - let abi: any[]; - let address: string | ArtifactContract | HardhatContract | EventParamFuture; - if (contract.subtype === "artifact") { - abi = contract.artifact.abi; - address = contract; - } else if (contract.subtype === "deployed") { - abi = contract.abi; - address = contract.address; - } else { - abi = this.artifactMap[contract.contractName].abi; - address = contract; - } - - eventFuture.params = this._parseEventParams(abi, eventFuture); - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.event, { - id: eventFuture.vertexId, - label: eventFuture.label, - type: "Event", - address, - abi, - event: eventName, - args: args ?? [], - after: after ?? [], - scopeAdded: this.scopes.getScopedLabel(), - }); - - return eventFuture; - } - - public sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture { - const vertexId = this._resolveNextId(); - - const sendFuture: SendFuture = { - vertexId, - label: `send/${vertexId}`, - type: "send", - subtype: "eth", - _future: true, - }; - - let address: AddressResolvable; - if (typeof sendTo === "string" || isContract(sendTo)) { - address = sendTo; - } else if (isParameter(sendTo)) { - const parameter = sendTo; - const scope = parameter.scope; - - const scopeData = this.graph.scopeData[scope]; - - if ( - scopeData === undefined || - scopeData.parameters === undefined || - !(parameter.label in scopeData.parameters) - ) { - throw new IgnitionError("Could not resolve contract from parameter"); - } - - address = scopeData.parameters[parameter.label] as ContractFutureOld; - } else { - if (sendTo.subtype !== "address") { - throw new IgnitionError( - `Event param "${sendTo.label}" is type "${sendTo.subtype}" but must be type "address"` - ); - } - - address = sendTo; - } - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.sendETH, { - id: vertexId, - label: sendFuture.label, - type: "SendETH", - address, - value: options.value, - after: options.after ?? [], - scopeAdded: this.scopes.getScopedLabel(), - from: options?.from ?? this.accounts[0], - }); - - return sendFuture; - } - - public getParam(paramName: string): RequiredParameter { - const paramFuture: RequiredParameter = { - label: paramName, - type: "parameter", - subtype: "required", - scope: this.scopes.getScopedLabel(), - _future: true, - }; - - return paramFuture; - } - - public getOptionalParam( - paramName: string, - defaultValue: ParameterValue - ): OptionalParameter { - const paramFuture: OptionalParameter = { - label: paramName, - type: "parameter", - subtype: "optional", - defaultValue, - scope: this.scopes.getScopedLabel(), - _future: true, - }; - - return paramFuture; - } - - public getArtifact(contractName: string): ArtifactOld { - const artifact = this.artifactMap[contractName]; - - if (artifact === undefined) { - throw new IgnitionError(`Artifact ${contractName} does not exist`); - } - - return artifact; - } - - public useModule( - module: Module, - options?: UseModuleOptions - ): Virtual & T { - const moduleKey = `module:${module.name}`; - - if (this.moduleCache[moduleKey] !== undefined) { - const moduleData = this.moduleCache[moduleKey]; - - const newHash = hash(options ?? null); - - if (moduleData.optionsHash !== newHash) { - throw new IgnitionError( - "`useModule` cannot be invoked on the same module using different parameters" - ); - } - - return moduleData.result as Virtual & T; - } - - const { result, after } = this._useSubscope(module, options); - - assertModuleReturnTypes(result); - - const moduleResult = { ...this._enhance(result, after), ...after }; - - const optionsHash = hash(options ?? null); - - this.moduleCache[moduleKey] = { result: moduleResult, optionsHash }; - - return moduleResult; - } - - private _enhance(result: T, after: Virtual): T { - return Object.fromEntries( - Object.entries(result).map(([key, value]) => [ - key, - { - label: key, - type: "proxy", - proxy: after, - value, - _future: true, - } as ProxyFuture, - ]) - ) as T; - } - - private _createBeforeVirtualVertex( - label: string, - after: DeploymentGraphFuture[] = [] - ): Virtual { - const beforeLabel = `${label}::before`; - - const virtualFuture: Virtual = { - vertexId: this._resolveNextId(), - label: beforeLabel, - type: "virtual", - _future: true, - }; - - const scopeLabel = this.scopes.getScopedLabel(); - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.useModule, { - id: virtualFuture.vertexId, - label: beforeLabel, - type: "Virtual", - after, - scopeAdded: scopeLabel, - }); - - return virtualFuture; - } - - private _createAfterVirtualVertex( - label: string, - after: DeploymentGraphFuture[] = [] - ): Virtual { - const afterLabel = `${label}::after`; - - const virtualFuture: Virtual = { - vertexId: this._resolveNextId(), - label: afterLabel, - type: "virtual", - _future: true, - }; - - const scopeLabel = this.scopes.getScopedLabel(); - - DeploymentBuilder._addVertex(this.graph, this.callPoints, this.useModule, { - id: virtualFuture.vertexId, - label: afterLabel, - type: "Virtual", - after, - scopeAdded: scopeLabel, - }); - - return virtualFuture; - } - - private _resolveNextId(): number { - return this.idCounter++; - } - - private static _captureCallPoint( - callPoints: CallPoints, - f: DeploymentApiPublicFunctions, - vertexId: number - ) { - const potentialValidationError = new IgnitionValidationError(""); - potentialValidationError.resetStackFrom(f as any); - callPoints[vertexId] = potentialValidationError; - } - - private static _addVertex( - graph: DeploymentGraph, - callPoints: CallPoints, - f: DeploymentApiPublicFunctions, - depNode: DeploymentGraphVertex - ): void { - DeploymentBuilder._captureCallPoint(callPoints, f, depNode.id); - - graph.vertexes.set(depNode.id, depNode); - - ensureVertex(graph.adjacencyList, depNode.id); - - switch (depNode.type) { - case "HardhatContract": - return DeploymentBuilder._addHardhatContractVertex(depNode, graph); - case "ArtifactContract": - return DeploymentBuilder._addArtifactContractVertex(depNode, graph); - case "DeployedContract": - return DeploymentBuilder._addDeployedContractVertex(depNode, graph); - case "HardhatLibrary": - return DeploymentBuilder._addHardhatLibraryVertex(depNode, graph); - case "ArtifactLibrary": - return DeploymentBuilder._addArtifactLibraryVertex(depNode, graph); - case "Call": - return DeploymentBuilder._addCallVertex(depNode, graph); - case "StaticCall": - return DeploymentBuilder._addStaticCallVertex(depNode, graph); - case "Event": - return DeploymentBuilder._addEventVertex(depNode, graph); - case "SendETH": - return DeploymentBuilder._addSendETHVertex(depNode, graph); - case "Virtual": - return DeploymentBuilder._addVirtualVertex(depNode, graph); - } - } - - private static _addVirtualVertex( - depNode: VirtualVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - } - - private static _addSendETHVertex( - depNode: SendVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); - - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - } - - private static _addEventVertex(depNode: EventVertex, graph: DeploymentGraph) { - DeploymentBuilder._addEdgeBasedOn(depNode.address, graph, depNode); - - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.args), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - } - - private static _addCallVertex( - depNode: CallDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); - - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.args), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - } - - private static _addStaticCallVertex( - depNode: StaticCallDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgeBasedOn(depNode.contract, graph, depNode); - - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.args), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.after), - graph, - depNode - ); - } - - private static _addArtifactLibraryVertex( - depNode: ArtifactLibraryDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - } - - private static _addHardhatLibraryVertex( - depNode: HardhatLibraryDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - } - - private static _addDeployedContractVertex( - depNode: DeployedContractDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - } - - private static _addArtifactContractVertex( - depNode: ArtifactContractDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.libraries), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - } - - private static _addHardhatContractVertex( - depNode: HardhatContractDeploymentVertex, - graph: DeploymentGraph - ) { - DeploymentBuilder._addEdgesBasedOn(depNode.args, graph, depNode); - DeploymentBuilder._addEdgesBasedOn( - Object.values(depNode.libraries), - graph, - depNode - ); - DeploymentBuilder._addEdgesBasedOn(depNode.after, graph, depNode); - } - - private static _addEdgesBasedOn( - args: InternalParamValue[], - graph: DeploymentGraph, - depNode: DeploymentGraphVertex - ) { - for (const arg of args) { - DeploymentBuilder._addEdgeBasedOn(arg, graph, depNode); - } - } - - private static _addEdgeBasedOn( - arg: InternalParamValue, - graph: DeploymentGraph, - depNode: DeploymentGraphVertex - ) { - if ( - typeof arg === "string" || - typeof arg === "number" || - typeof arg === "boolean" || - BigNumber.isBigNumber(arg) || - !isFuture(arg) - ) { - return; - } - - if (isDependable(arg)) { - addEdge(graph.adjacencyList, { - from: resolveProxyDependency(arg).vertexId, - to: depNode.id, - }); - - return; - } - - if (arg.type === "eventParam") { - addEdge(graph.adjacencyList, { - from: arg.vertexId, - to: depNode.id, - }); - - return; - } - - if (isParameter(arg)) { - const resolvedArg = DeploymentBuilder._resolveParameterFromScope( - graph, - arg - ); - - if (isDependable(resolvedArg)) { - addEdge(graph.adjacencyList, { - from: resolveProxyDependency(resolvedArg).vertexId, - to: depNode.id, - }); - return; - } - - return; - } - } - - private static _resolveParameterFromScope( - graph: DeploymentGraph, - param: RequiredParameter | OptionalParameter - ) { - const scopeData = graph.scopeData[param.scope]; - - if (scopeData === undefined || scopeData.parameters === undefined) { - return param; - } - - const scopeValue = scopeData.parameters[param.label]; - - if (param.subtype === "optional") { - return scopeValue ?? param.defaultValue; - } - - if (scopeValue === undefined) { - return param; - } - - return scopeValue; - } - - private _useSubscope( - module: Module, - options?: UseModuleOptions - ) { - const useModuleInvocationId = this.useModuleInvocationCounter++; - const label = `${module.name}:${useModuleInvocationId}`; - - this.scopes.push(label); - const scopeLabel = this.scopes.getScopedLabel(); - - const beforeVirtualVertex = this._createBeforeVirtualVertex( - label, - options?.after - ); - - const scopeData: ScopeData = { - before: beforeVirtualVertex, - parameters: options?.parameters, - }; - - this.graph.scopeData[scopeLabel] = scopeData; - - const result = module.action(this); - - const addedVertexes = [...this.graph.vertexes.values()] - .filter((v) => v.scopeAdded === scopeLabel) - .filter((v) => v.type !== "Virtual") - .map( - (v): DependableFuture => ({ - vertexId: v.id, - label: v.label, - type: "virtual", - _future: true, - }) - ); - - for (const addedVertex of addedVertexes) { - addEdge(this.graph.adjacencyList, { - from: beforeVirtualVertex.vertexId, - to: resolveProxyDependency(addedVertex).vertexId, - }); - } - - const afterVirtualVertex = this._createAfterVirtualVertex( - label, - addedVertexes - ); - - scopeData.after = afterVirtualVertex; - - this.scopes.pop(); - - return { before: beforeVirtualVertex, result, after: afterVirtualVertex }; - } - - private _parseEventParams( - abi: Array<{ type: string; name: string; inputs: any[] }>, - event: EventFuture - ): EventParams { - const [_, eventName] = event.label.split("/"); - - const abiEvent = abi.find( - (v) => v.type === "event" && v.name === eventName - ); - - if (abiEvent === undefined) { - return {}; - } - - return abiEvent.inputs.reduce((acc, { name, type }) => { - acc[name] = { - vertexId: event.vertexId, - label: name, - type: "eventParam", - subtype: type, - _future: true, - }; - - return acc; - }, {}); - } -} diff --git a/packages/core/src/internal/dsl/DeploymentGraph.ts b/packages/core/src/internal/dsl/DeploymentGraph.ts deleted file mode 100644 index 6c53e17154..0000000000 --- a/packages/core/src/internal/dsl/DeploymentGraph.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Graph } from "../graph/Graph"; -import { - DeploymentGraphVertex as DeploymentGraphVertex, - ScopeData, -} from "../types/deploymentGraph"; - -export class DeploymentGraph extends Graph { - public scopeData: { - [key: string]: ScopeData; - }; - - constructor() { - super(); - - this.scopeData = {}; - } -} diff --git a/packages/core/src/internal/dsl/ScopeStack.ts b/packages/core/src/internal/dsl/ScopeStack.ts deleted file mode 100644 index 491b6b633e..0000000000 --- a/packages/core/src/internal/dsl/ScopeStack.ts +++ /dev/null @@ -1,19 +0,0 @@ -export class ScopeStack { - private scopes: string[]; - - constructor() { - this.scopes = []; - } - - public push(scopeName: string): void { - this.scopes.push(scopeName); - } - - public pop(): string | undefined { - return this.scopes.pop(); - } - - public getScopedLabel() { - return this.scopes.join("/"); - } -} diff --git a/packages/core/src/internal/execution/ExecutionGraph.ts b/packages/core/src/internal/execution/ExecutionGraph.ts deleted file mode 100644 index 1b24910c7d..0000000000 --- a/packages/core/src/internal/execution/ExecutionGraph.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { Graph } from "../graph/Graph"; -import { ExecutionVertex } from "../types/executionGraph"; - -export class ExecutionGraph extends Graph {} diff --git a/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts b/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts deleted file mode 100644 index 6d1636642e..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeAwaitedEvent.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - AwaitedEventExecutionVertex, - ExecutionVertexVisitResult, -} from "../../types/executionGraph"; - -import { Contract, ethers } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeAwaitedEvent( - { event, address, abi, args }: AwaitedEventExecutionVertex, - resultAccumulator: Map, - { services, options }: ExecutionContext -): Promise { - const resolve = resolveFrom(resultAccumulator); - - const resolvedArgs = [...args, address].map(resolve).map(toAddress); - - const resolvedAddress = resolvedArgs.pop(); - - let topics: ethers.utils.Result; - try { - const contractInstance = new Contract(resolvedAddress, abi); - - const filter = contractInstance.filters[event](...resolvedArgs); - - const eventResult = await services.transactions.waitForEvent( - filter, - options.eventDuration - ); - - if (eventResult === null) { - return { - _kind: VertexResultEnum.HOLD, - }; - } - - topics = contractInstance.interface.parseLog(eventResult).args; - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - topics, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeContractCall.ts b/packages/core/src/internal/execution/dispatch/executeContractCall.ts deleted file mode 100644 index e726a4114b..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeContractCall.ts +++ /dev/null @@ -1,58 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - ContractCallExecutionVertex, - ExecutionVertexVisitResult, -} from "../../types/executionGraph"; - -import { Contract } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeContractCall( - { method, contract, args, value, signer }: ContractCallExecutionVertex, - resultAccumulator: Map, - { services, options }: ExecutionContext -): Promise { - const resolve = resolveFrom(resultAccumulator); - - const resolvedArgs = args.map(resolve).map(toAddress); - - const { address, abi } = resolve(contract); - - let txHash: string; - try { - const contractInstance = new Contract(address, abi, signer); - - const unsignedTx = await contractInstance.populateTransaction[method]( - ...resolvedArgs, - { value, from: await signer.getAddress() } - ); - - txHash = await services.contracts.sendTx(unsignedTx, { - ...options, - signer, - }); - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - try { - await services.transactions.wait(txHash); - } catch { - return { - _kind: VertexResultEnum.HOLD, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - hash: txHash, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts b/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts deleted file mode 100644 index c7b40659f1..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeContractDeploy.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - ContractDeployExecutionVertex, - ExecutionResultsAccumulator, - ExecutionVertexVisitResult, -} from "../../types/executionGraph"; - -import { ContractFactory, ethers } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; -import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeContractDeploy( - { artifact, args, libraries, value, signer }: ContractDeployExecutionVertex, - resultAccumulator: ExecutionResultsAccumulator, - { services, options }: ExecutionContext -): Promise { - let txHash: string; - try { - const resolve = resolveFrom(resultAccumulator); - - const resolvedArgs = args.map(resolve).map(toAddress); - - const resolvedLibraries = Object.fromEntries( - Object.entries(libraries ?? {}).map(([k, v]) => [ - k, - toAddress(resolve(v)), - ]) - ); - - const linkedByteCode = await collectLibrariesAndLink( - artifact, - resolvedLibraries - ); - - const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); - - const deployTransaction = Factory.getDeployTransaction(...resolvedArgs, { - value, - }); - - txHash = await services.contracts.sendTx(deployTransaction, { - ...options, - signer, - }); - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - let receipt: ethers.providers.TransactionReceipt; - try { - receipt = await services.transactions.wait(txHash); - } catch { - return { - _kind: VertexResultEnum.HOLD, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - value, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts b/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts deleted file mode 100644 index 9ec4edc183..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeDeployedContract.ts +++ /dev/null @@ -1,29 +0,0 @@ -import type { - DeployedContractExecutionVertex, - ExecutionResultsAccumulator, - ExecutionVertexVisitResult, -} from "../../types/executionGraph"; -import type { Services } from "../../types/services"; - -import { VertexResultEnum } from "../../types/graph"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeDeployedContract( - { label, address, abi }: DeployedContractExecutionVertex, - _resultAccumulator: ExecutionResultsAccumulator, - _: { services: Services } -): Promise { - const resolve = resolveFrom(_resultAccumulator); - - const resolvedAddress = toAddress(resolve(address)); - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - name: label, - abi, - address: resolvedAddress, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts b/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts deleted file mode 100644 index ea9f81dd6c..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeLibraryDeploy.ts +++ /dev/null @@ -1,61 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - ExecutionResultsAccumulator, - ExecutionVertexVisitResult, - LibraryDeployExecutionVertex, -} from "../../types/executionGraph"; - -import { ContractFactory, ethers } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; -import { collectLibrariesAndLink } from "../../utils/collectLibrariesAndLink"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeLibraryDeploy( - { artifact, args, signer }: LibraryDeployExecutionVertex, - resultAccumulator: ExecutionResultsAccumulator, - { services, options }: ExecutionContext -): Promise { - let txHash: string; - try { - const resolvedArgs = args - .map(resolveFrom(resultAccumulator)) - .map(toAddress); - - const linkedByteCode = await collectLibrariesAndLink(artifact, {}); - - const Factory = new ContractFactory(artifact.abi, linkedByteCode, signer); - - const deployTransaction = Factory.getDeployTransaction(...resolvedArgs); - - txHash = await services.contracts.sendTx(deployTransaction, { - ...options, - signer, - }); - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - let receipt: ethers.providers.TransactionReceipt; - try { - receipt = await services.transactions.wait(txHash); - } catch { - return { - _kind: VertexResultEnum.HOLD, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - name: artifact.contractName, - abi: artifact.abi, - bytecode: artifact.bytecode, - address: receipt.contractAddress, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeSendETH.ts b/packages/core/src/internal/execution/dispatch/executeSendETH.ts deleted file mode 100644 index 25a83f60a6..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeSendETH.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - ExecutionVertexVisitResult, - SentETHExecutionVertex, -} from "../../types/executionGraph"; -import type { PopulatedTransaction } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeSendETH( - { address, value, signer }: SentETHExecutionVertex, - resultAccumulator: Map, - { services, options }: ExecutionContext -): Promise { - const resolve = resolveFrom(resultAccumulator); - - const to = toAddress(resolve(address)); - - let txHash: string; - try { - const tx: PopulatedTransaction = { - to, - value, - from: await signer.getAddress(), - }; - - txHash = await services.contracts.sendTx(tx, { - ...options, - signer, - }); - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - try { - await services.transactions.wait(txHash); - } catch { - return { - _kind: VertexResultEnum.HOLD, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - hash: txHash, - value, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts b/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts deleted file mode 100644 index 54c8731120..0000000000 --- a/packages/core/src/internal/execution/dispatch/executeStaticContractCall.ts +++ /dev/null @@ -1,43 +0,0 @@ -import type { - BaseArgValue, - ExecutionVertexVisitResult, - StaticContractCallExecutionVertex, -} from "../../types/executionGraph"; - -import { Contract, ethers } from "ethers"; - -import { VertexResultEnum } from "../../types/graph"; - -import { resolveFrom, toAddress } from "./utils"; - -export async function executeStaticContractCall( - { method, contract, args, signer }: StaticContractCallExecutionVertex, - resultAccumulator: Map -): Promise { - const resolve = resolveFrom(resultAccumulator); - - const resolvedArgs = args.map(resolve).map(toAddress); - - const { address, abi } = resolve(contract); - - let result: BaseArgValue | ethers.utils.Result; - try { - const contractInstance = new Contract(address, abi, signer); - - result = await contractInstance[method](...resolvedArgs, { - from: await signer.getAddress(), - }); - } catch (err) { - return { - _kind: VertexResultEnum.FAILURE, - failure: err as any, - }; - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: { - data: result, - }, - }; -} diff --git a/packages/core/src/internal/execution/dispatch/executionDispatch.ts b/packages/core/src/internal/execution/dispatch/executionDispatch.ts deleted file mode 100644 index be276022d5..0000000000 --- a/packages/core/src/internal/execution/dispatch/executionDispatch.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { ExecutionContext } from "../../types/deployment"; -import type { - ExecutionResultsAccumulator, - ExecutionVertex, - ExecutionVertexVisitResult, -} from "../../types/executionGraph"; - -import { executeAwaitedEvent } from "./executeAwaitedEvent"; -import { executeContractCall } from "./executeContractCall"; -import { executeContractDeploy } from "./executeContractDeploy"; -import { executeDeployedContract } from "./executeDeployedContract"; -import { executeLibraryDeploy } from "./executeLibraryDeploy"; -import { executeSendETH } from "./executeSendETH"; -import { executeStaticContractCall } from "./executeStaticContractCall"; - -export function executionDispatch( - executionVertex: ExecutionVertex, - resultAccumulator: ExecutionResultsAccumulator, - context: ExecutionContext -): Promise { - switch (executionVertex.type) { - case "ContractDeploy": - return executeContractDeploy(executionVertex, resultAccumulator, context); - case "DeployedContract": - return executeDeployedContract( - executionVertex, - resultAccumulator, - context - ); - case "ContractCall": - return executeContractCall(executionVertex, resultAccumulator, context); - case "StaticContractCall": - return executeStaticContractCall(executionVertex, resultAccumulator); - case "LibraryDeploy": - return executeLibraryDeploy(executionVertex, resultAccumulator, context); - case "AwaitedEvent": - return executeAwaitedEvent(executionVertex, resultAccumulator, context); - case "SentETH": - return executeSendETH(executionVertex, resultAccumulator, context); - } -} diff --git a/packages/core/src/internal/execution/dispatch/utils.ts b/packages/core/src/internal/execution/dispatch/utils.ts deleted file mode 100644 index afb9443cf9..0000000000 --- a/packages/core/src/internal/execution/dispatch/utils.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { - ArgValue, - ExecutionResultsAccumulator, -} from "../../types/executionGraph"; - -import { IgnitionError } from "../../../errors"; -import { VertexResultEnum } from "../../types/graph"; -import { - isDependable, - isEventParam, - isProxy, - isStaticCallFuture, -} from "../../utils/guards"; - -export function toAddress(v: any) { - if (typeof v === "object" && "address" in v) { - return v.address; - } - - return v; -} - -export function resolveFrom(context: ExecutionResultsAccumulator) { - return (arg: ArgValue) => resolveFromContext(context, arg); -} - -function resolveFromContext( - context: ExecutionResultsAccumulator, - arg: ArgValue -): any { - if (isProxy(arg)) { - return resolveFromContext(context, arg.value); - } - - if (!isDependable(arg) && !isEventParam(arg)) { - return arg; - } - - const entry = context.get(arg.vertexId); - - if (entry === undefined) { - throw new IgnitionError( - `No context entry for ${arg.vertexId} (${arg.label})` - ); - } - - if (entry._kind === VertexResultEnum.FAILURE) { - throw new IgnitionError( - `Looking up context on a failed vertex - violation of constraint` - ); - } - - if (entry._kind === VertexResultEnum.HOLD) { - throw new IgnitionError( - `Looking up context on a on hold - violation of constraint` - ); - } - - if (isEventParam(arg) && "topics" in entry.result) { - return entry.result.topics[arg.label]; - } - - if (isStaticCallFuture(arg) && "data" in entry.result) { - return entry.result.data; - } - - return entry.result; -} diff --git a/packages/core/src/internal/execution/execute.ts b/packages/core/src/internal/execution/execute.ts deleted file mode 100644 index 6a059269f6..0000000000 --- a/packages/core/src/internal/execution/execute.ts +++ /dev/null @@ -1,147 +0,0 @@ -import type { Deployment } from "../deployment/Deployment"; -import type { ExecutionOptions, ExecutionState } from "../types/deployment"; -import type { ExecutionVertexDispatcher } from "../types/execution"; -import type { - ExecutionResultsAccumulator, - ExecutionVertex, - ExecutionVertexVisitResult, - ExecutionVisitResult, -} from "../types/executionGraph"; -import type { Services } from "../types/services"; - -import { IgnitionError } from "../../errors"; -import { viewExecutionResults } from "../deployment/utils"; -import { VisitResultState } from "../types/graph"; - -import { ExecutionGraph } from "./ExecutionGraph"; -import { executionDispatch } from "./dispatch/executionDispatch"; -import { allDependenciesCompleted, hashExecutionGraph } from "./utils"; - -export async function execute( - deployment: Deployment, - options: ExecutionOptions -): Promise { - if (deployment.state.transform.executionGraph === null) { - throw new IgnitionError("Cannot execute without an execution graph"); - } - - return executeInBatches( - deployment, - deployment.state.transform.executionGraph, - executionDispatch, - options - ); -} - -export async function executeInBatches( - deployment: Deployment, - executionGraph: ExecutionGraph, - executionVertexDispatcher: ExecutionVertexDispatcher, - options: ExecutionOptions -): Promise { - const executionGraphHash = hashExecutionGraph(executionGraph); - - await deployment.startExecutionPhase(executionGraphHash); - - while (deployment.hasUnstarted()) { - const batch = calculateNextBatch( - deployment.state.execution, - executionGraph - ); - - await deployment.updateExecutionWithNewBatch(batch); - - await executeBatch( - batch, - executionGraph, - viewExecutionResults(deployment.state), - deployment.updateVertexResult.bind(deployment), - { services: deployment.services }, - executionVertexDispatcher, - options - ); - - if (deployment.hasErrors()) { - const errors = deployment.readExecutionErrors(); - - return { - _kind: VisitResultState.FAILURE, - failures: [ - "execution failed", - Object.values(errors).map((err) => err.failure), - ], - }; - } - - if (deployment.hasHolds()) { - const holds = deployment.readExecutionHolds(); - - return { - _kind: VisitResultState.HOLD, - holds, - }; - } - } - - return { - _kind: VisitResultState.SUCCESS, - result: viewExecutionResults(deployment.state), - }; -} - -function calculateNextBatch( - executionState: ExecutionState, - executionGraph: ExecutionGraph -): number[] { - const potentials = new Set( - Object.entries(executionState.vertexes) - .filter(([_id, v]) => v.status === "UNSTARTED") - .map(([id]) => parseInt(id, 10)) - ); - - const alreadyCompleted = new Set( - Object.entries(executionState.vertexes) - .filter(([_id, v]) => v.status === "COMPLETED") - .map(([id]) => parseInt(id, 10)) - ); - - return [...potentials].filter((vertexId) => - allDependenciesCompleted(vertexId, executionGraph, alreadyCompleted) - ); -} - -async function executeBatch( - batch: number[], - executionGraph: ExecutionGraph, - resultsAccumulator: ExecutionResultsAccumulator, - deploymentStateUpdate: ( - vertexId: number, - result: ExecutionVertexVisitResult - ) => Promise, - { services }: { services: Services }, - executionVertexDispatcher: ExecutionVertexDispatcher, - options: ExecutionOptions -): Promise { - const batchVertexes = [...batch] - .map((vertexId) => executionGraph.vertexes.get(vertexId)) - .filter((v): v is ExecutionVertex => v !== undefined); - - if (batchVertexes.length !== batch.length) { - throw new IgnitionError( - "Unable to retrieve all vertexes while executing batch" - ); - } - - const promises = batchVertexes.map(async (vertex) => { - const result = await executionVertexDispatcher(vertex, resultsAccumulator, { - services, - options, - }); - - await deploymentStateUpdate(vertex.id, result); - - return { vertexId: vertex.id, result }; - }); - - await Promise.all(promises); -} diff --git a/packages/core/src/internal/execution/loadJournalInto.ts b/packages/core/src/internal/execution/loadJournalInto.ts deleted file mode 100644 index 43ec6b21ef..0000000000 --- a/packages/core/src/internal/execution/loadJournalInto.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Deployment } from "../deployment/Deployment"; -import { ICommandJournal } from "../types/journal"; - -/** - * Update the deployment execution state with the previous runs in the journal. - */ -export async function loadJournalInto( - deployment: Deployment, - journal: ICommandJournal -): Promise { - return deployment.load(journal.read()); -} diff --git a/packages/core/src/internal/execution/utils.ts b/packages/core/src/internal/execution/utils.ts deleted file mode 100644 index 559a01d828..0000000000 --- a/packages/core/src/internal/execution/utils.ts +++ /dev/null @@ -1,22 +0,0 @@ -import hash from "object-hash"; - -import { ExecutionGraph } from "../execution/ExecutionGraph"; -import { getDependenciesFor } from "../graph/adjacencyList"; -import { serializeReplacer } from "../utils/serialize"; - -export function allDependenciesCompleted( - vertexId: number, - executionGraph: ExecutionGraph, - completed: Set -) { - const depenencies = getDependenciesFor( - executionGraph.adjacencyList, - vertexId - ); - - return depenencies.every((vid) => completed.has(vid)); -} - -export function hashExecutionGraph(executionGrpah: ExecutionGraph) { - return hash(JSON.parse(JSON.stringify(executionGrpah, serializeReplacer))); -} diff --git a/packages/core/src/internal/graph/Graph.ts b/packages/core/src/internal/graph/Graph.ts deleted file mode 100644 index 5f71a8b5cd..0000000000 --- a/packages/core/src/internal/graph/Graph.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { AdjacencyList, IGraph } from "../types/graph"; - -import { constructEmptyAdjacencyList } from "./adjacencyList"; - -export class Graph implements IGraph { - public adjacencyList: AdjacencyList; - public vertexes: Map; - - constructor() { - this.adjacencyList = constructEmptyAdjacencyList(); - this.vertexes = new Map(); - } - - public getEdges() { - const edges: Array<{ from: number; to: number }> = []; - - for (const [from, edgeList] of this.adjacencyList.entries()) { - for (const to of edgeList.values()) { - edges.push({ from, to }); - } - } - - return edges; - } -} diff --git a/packages/core/src/internal/graph/adjacencyList.ts b/packages/core/src/internal/graph/adjacencyList.ts deleted file mode 100644 index f66b253899..0000000000 --- a/packages/core/src/internal/graph/adjacencyList.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { DiGraph, TopologicalSort } from "js-graph-algorithms"; - -import { IgnitionError } from "../../errors"; -import { AdjacencyList } from "../types/graph"; - -export function constructEmptyAdjacencyList(): AdjacencyList { - return new Map>(); -} - -export function addEdge( - adjacencyList: AdjacencyList, - { from, to }: { from: number; to: number } -) { - const toSet = adjacencyList.get(from) ?? new Set(); - - toSet.add(to); - - adjacencyList.set(from, toSet); -} - -export function ensureVertex(adjacencyList: AdjacencyList, v: number) { - const toSet = adjacencyList.get(v) ?? new Set(); - - adjacencyList.set(v, toSet); -} - -export function getDependenciesFor(adjacencyList: AdjacencyList, to: number) { - return [...adjacencyList.entries()] - .filter(([_from, toSet]) => toSet.has(to)) - .map(([from]) => from); -} - -export function clone(adjacencyList: AdjacencyList): AdjacencyList { - const newList: AdjacencyList = new Map(); - - for (const [from, toSet] of adjacencyList.entries()) { - newList.set(from, new Set(toSet)); - } - - return newList; -} - -export function topologicalSort(adjacencyList: AdjacencyList): number[] { - if (adjacencyList.size === 0) { - return []; - } - - const vertexes = [...adjacencyList.values()].reduce( - (acc, v) => new Set([...acc].concat([...v])), - new Set(adjacencyList.keys()) - ); - - const dag = new DiGraph(Math.max(...vertexes) + 1); - - for (const [from, toSet] of adjacencyList.entries()) { - for (const to of toSet) { - dag.addEdge(from, to); - } - } - - const ts = new TopologicalSort(dag); - const order = ts.order().filter((elem) => vertexes.has(elem)); - - return order; -} - -/** - * Remove a vertex, transfering its dependencies to its dependents. - * @param adjacencyList the adjacency list - * @param v the vertex to eliminate - * @returns an adjacency list without the vertex - */ -export function eliminate( - adjacencyList: AdjacencyList, - v: number -): AdjacencyList { - const updatedList = clone(adjacencyList); - - const dependencies = getDependenciesFor(updatedList, v); - const dependents = updatedList.get(v) ?? new Set(); - - updatedList.delete(v); - - for (const dependency of dependencies) { - const toSet = updatedList.get(dependency); - - if (toSet === undefined) { - throw new IgnitionError("Dependency sets should be defined"); - } - - const setWithoutV = new Set([...toSet].filter((n) => n !== v)); - - const updatedSet = new Set([...setWithoutV, ...dependents]); - - updatedList.set(dependency, updatedSet); - } - - return updatedList; -} diff --git a/packages/core/src/internal/graph/utils.ts b/packages/core/src/internal/graph/utils.ts deleted file mode 100644 index 9bef2aa9dc..0000000000 --- a/packages/core/src/internal/graph/utils.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { IGraph } from "../types/graph"; - -import { topologicalSort } from "./adjacencyList"; - -export function getSortedVertexIdsFrom(executionGraph: IGraph): number[] { - const orderedIds = topologicalSort(executionGraph.adjacencyList); - - const totalOrderedIds = Array.from(executionGraph.vertexes.keys()) - .filter((k) => !orderedIds.includes(k)) - .concat(orderedIds); - - return totalOrderedIds; -} diff --git a/packages/core/src/internal/graph/visit.ts b/packages/core/src/internal/graph/visit.ts deleted file mode 100644 index e8a510ef02..0000000000 --- a/packages/core/src/internal/graph/visit.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { IgnitionError } from "../../errors"; -import { - IGraph, - ResultsAccumulator, - VertexResultEnum, - VertexVisitResult, - VisitResult, - VisitResultState, -} from "../types/graph"; - -export async function visit( - phase: "Execution" | "Validation", - orderedVertexIds: number[], - graph: IGraph, - context: C, - resultAccumulator: ResultsAccumulator, - vistitorAction: ( - vertex: T, - resultAccumulator: ResultsAccumulator, - context: C - ) => Promise> -): Promise> { - for (const vertexId of orderedVertexIds) { - const vertex = graph.vertexes.get(vertexId); - - if (vertex === undefined) { - throw new IgnitionError(`Could not get vertex ${vertexId}`); - } - - const vertexVisitResult = await vistitorAction( - vertex, - resultAccumulator, - context - ); - - if (vertexVisitResult._kind === VertexResultEnum.FAILURE) { - return { - _kind: VisitResultState.FAILURE, - failures: [`${phase} failed`, [vertexVisitResult.failure]], - }; - } - - if (vertexVisitResult._kind === VertexResultEnum.HOLD) { - return { - _kind: VisitResultState.HOLD, - holds: [vertex as any], - }; - } - - resultAccumulator.set(vertexId, vertexVisitResult); - } - - return { _kind: VisitResultState.SUCCESS, result: resultAccumulator }; -} diff --git a/packages/core/src/internal/journal/NoopCommandJournal.ts b/packages/core/src/internal/journal/NoopCommandJournal.ts deleted file mode 100644 index e59182a060..0000000000 --- a/packages/core/src/internal/journal/NoopCommandJournal.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { DeployStateExecutionCommand } from "../types/deployment"; -import type { ICommandJournal } from "../types/journal"; - -export class NoopCommandJournal implements ICommandJournal { - public async record(_command: DeployStateExecutionCommand): Promise { - return; - } - - public read(): AsyncGenerator { - return fakeRead(); - } - - public readAll(): AsyncGenerator< - DeployStateExecutionCommand & { chainId: number }, - void, - unknown - > { - return fakeRead(); - } -} - -async function* fakeRead() { - return; -} diff --git a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts b/packages/core/src/internal/process/generateDeploymentGraphFrom.ts deleted file mode 100644 index ca5e878851..0000000000 --- a/packages/core/src/internal/process/generateDeploymentGraphFrom.ts +++ /dev/null @@ -1,46 +0,0 @@ -import type { - CallPoints, - DeploymentBuilderOptions, - IDeploymentGraph, -} from "../types/deploymentGraph"; - -import { IgnitionError } from "../../errors"; -import { Module, ModuleDict } from "../../types/module"; -import { ProcessStepResult } from "../../types/process"; -import { DeploymentBuilder } from "../dsl/DeploymentBuilder"; -import { assertModuleReturnTypes } from "../utils/guards"; -import { - processStepErrored, - processStepSucceeded, -} from "../utils/process-results"; - -export function generateDeploymentGraphFrom( - ignitionModule: Module, - builderOptions: DeploymentBuilderOptions -): ProcessStepResult<{ - graph: IDeploymentGraph; - callPoints: CallPoints; - moduleOutputs: T; -}> { - try { - const graphBuilder = new DeploymentBuilder(builderOptions); - - const moduleOutputs = ignitionModule.action(graphBuilder); - - if (moduleOutputs instanceof Promise) { - throw new IgnitionError( - `The callback passed to 'buildModule' for ${ignitionModule.name} returns a Promise; async callbacks are not allowed in 'buildModule'.` - ); - } - - assertModuleReturnTypes(moduleOutputs); - - return processStepSucceeded({ - graph: graphBuilder.graph, - callPoints: graphBuilder.callPoints, - moduleOutputs, - }); - } catch (error) { - return processStepErrored(error, "Deployment graph construction failed"); - } -} diff --git a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts b/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts deleted file mode 100644 index b2b59e7aab..0000000000 --- a/packages/core/src/internal/process/transform/convertDeploymentVertexToExecutionVertex.ts +++ /dev/null @@ -1,309 +0,0 @@ -import { BigNumber, ethers } from "ethers"; - -import { IgnitionError } from "../../../errors"; -import { ExternalParamValue, InternalParamValue } from "../../../types/dsl"; -import { DeploymentGraphFuture } from "../../../types/future"; -import { ArtifactOld } from "../../../types/hardhat"; -import { - ArtifactContractDeploymentVertex, - ArtifactLibraryDeploymentVertex, - CallDeploymentVertex, - DeployedContractDeploymentVertex, - DeploymentGraphVertex, - EventVertex, - HardhatContractDeploymentVertex, - HardhatLibraryDeploymentVertex, - IDeploymentGraph, - SendVertex, - StaticCallDeploymentVertex, -} from "../../types/deploymentGraph"; -import { - ArgValue, - AwaitedEventExecutionVertex, - ContractCallExecutionVertex, - ContractDeployExecutionVertex, - DeployedContractExecutionVertex, - ExecutionVertex, - LibraryDeployExecutionVertex, - SentETHExecutionVertex, - StaticContractCallExecutionVertex, -} from "../../types/executionGraph"; -import { Services } from "../../types/services"; -import { isFuture } from "../../utils/guards"; - -interface TransformContext { - services: Services; - graph: IDeploymentGraph; -} - -export function convertDeploymentVertexToExecutionVertex( - context: TransformContext -): (deploymentVertex: DeploymentGraphVertex) => Promise { - return ( - deploymentVertex: DeploymentGraphVertex - ): Promise => { - switch (deploymentVertex.type) { - case "HardhatContract": - return convertHardhatContractToContractDeploy( - deploymentVertex, - context - ); - case "ArtifactContract": - return convertArtifactContractToContractDeploy( - deploymentVertex, - context - ); - case "DeployedContract": - return convertDeployedContractToDeployedDeploy( - deploymentVertex, - context - ); - case "Call": - return convertCallToContractCall(deploymentVertex, context); - case "StaticCall": - return convertStaticCallToStaticContractCall(deploymentVertex, context); - case "HardhatLibrary": - return convertHardhatLibraryToLibraryDeploy(deploymentVertex, context); - case "ArtifactLibrary": - return convertArtifactLibraryToLibraryDeploy(deploymentVertex, context); - case "Event": - return convertAwaitToAwaitedEvent(deploymentVertex, context); - case "SendETH": - return convertSendToSentETH(deploymentVertex, context); - case "Virtual": - throw new IgnitionError( - `Virtual vertex should be removed ${deploymentVertex.id} (${deploymentVertex.label})` - ); - } - }; -} - -async function convertHardhatContractToContractDeploy( - vertex: HardhatContractDeploymentVertex, - transformContext: TransformContext -): Promise { - const artifact: ArtifactOld = - await transformContext.services.artifacts.getArtifact(vertex.contractName); - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "ContractDeploy", - id: vertex.id, - label: vertex.label, - artifact, - args: await convertArgs(vertex.args, transformContext), - libraries: vertex.libraries, - value: (await resolveParameter( - vertex.value, - transformContext - )) as BigNumber, - signer, - }; -} - -async function convertArtifactContractToContractDeploy( - vertex: ArtifactContractDeploymentVertex, - transformContext: TransformContext -): Promise { - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "ContractDeploy", - id: vertex.id, - label: vertex.label, - artifact: vertex.artifact, - args: await convertArgs(vertex.args, transformContext), - libraries: vertex.libraries, - value: (await resolveParameter( - vertex.value, - transformContext - )) as BigNumber, - signer, - }; -} - -async function convertDeployedContractToDeployedDeploy( - vertex: DeployedContractDeploymentVertex, - _transformContext: TransformContext -): Promise { - return { - type: "DeployedContract", - id: vertex.id, - label: vertex.label, - address: vertex.address, - abi: vertex.abi, - }; -} - -async function convertCallToContractCall( - vertex: CallDeploymentVertex, - transformContext: TransformContext -): Promise { - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "ContractCall", - id: vertex.id, - label: vertex.label, - contract: await resolveParameter(vertex.contract, transformContext), - method: vertex.method, - args: await convertArgs(vertex.args, transformContext), - value: (await resolveParameter( - vertex.value, - transformContext - )) as BigNumber, - signer, - }; -} - -async function convertStaticCallToStaticContractCall( - vertex: StaticCallDeploymentVertex, - transformContext: TransformContext -): Promise { - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "StaticContractCall", - id: vertex.id, - label: vertex.label, - contract: await resolveParameter(vertex.contract, transformContext), - method: vertex.method, - args: await convertArgs(vertex.args, transformContext), - signer, - }; -} - -async function convertHardhatLibraryToLibraryDeploy( - vertex: HardhatLibraryDeploymentVertex, - transformContext: TransformContext -): Promise { - const artifact: ArtifactOld = - await transformContext.services.artifacts.getArtifact(vertex.libraryName); - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "LibraryDeploy", - id: vertex.id, - label: vertex.label, - artifact, - args: await convertArgs(vertex.args, transformContext), - signer, - }; -} - -async function convertArtifactLibraryToLibraryDeploy( - vertex: ArtifactLibraryDeploymentVertex, - transformContext: TransformContext -): Promise { - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "LibraryDeploy", - id: vertex.id, - label: vertex.label, - artifact: vertex.artifact, - args: await convertArgs(vertex.args, transformContext), - signer, - }; -} - -async function convertAwaitToAwaitedEvent( - vertex: EventVertex, - transformContext: TransformContext -): Promise { - return { - type: "AwaitedEvent", - id: vertex.id, - label: vertex.label, - abi: vertex.abi, - address: vertex.address, - event: vertex.event, - args: await convertArgs(vertex.args, transformContext), - }; -} - -async function convertSendToSentETH( - vertex: SendVertex, - transformContext: TransformContext -): Promise { - const signer: ethers.Signer = - await transformContext.services.accounts.getSigner(vertex.from); - - return { - type: "SentETH", - id: vertex.id, - label: vertex.label, - address: vertex.address, - value: (await resolveParameter( - vertex.value, - transformContext - )) as BigNumber, - signer, - }; -} - -async function convertArgs( - args: InternalParamValue[], - transformContext: TransformContext -): Promise { - const resolvedArgs = []; - - for (const arg of args) { - const resolvedArg = await resolveParameter(arg, transformContext); - - resolvedArgs.push(resolvedArg); - } - - return resolvedArgs; -} - -async function resolveParameter( - arg: ExternalParamValue | T, - { services, graph }: TransformContext -): Promise { - if (!isFuture(arg)) { - return arg; - } - - if (arg.type !== "parameter") { - return arg; - } - - const scope = arg.scope; - const scopeData = graph.scopeData[scope]; - - if ( - scopeData !== undefined && - scopeData.parameters !== undefined && - arg.label in scopeData.parameters - ) { - return scopeData.parameters[arg.label] as string | number | T; - } - - const hasParamResult = await services.config.hasParam(arg.label); - - if (arg.subtype === "optional") { - return hasParamResult.found - ? services.config.getParam(arg.label) - : (arg.defaultValue as T); - } - - if (hasParamResult.found === false) { - switch (hasParamResult.errorCode) { - case "no-params": - throw new IgnitionError( - `No parameters object provided to deploy options, but module requires parameter "${arg.label}"` - ); - case "param-missing": - throw new IgnitionError(`No parameter provided for "${arg.label}"`); - } - } - - return services.config.getParam(arg.label); -} diff --git a/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts b/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts deleted file mode 100644 index 57ecfbe3aa..0000000000 --- a/packages/core/src/internal/process/transform/reduceDeploymentGraphByEliminatingVirtualVertexes.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { DeploymentGraph } from "../../dsl/DeploymentGraph"; -import { eliminate } from "../../graph/adjacencyList"; -import { DeploymentGraphVertex } from "../../types/deploymentGraph"; - -/** - * Deployment graphs can have virtual vertex that represent the - * execution of all vertexes in a module/subgraph. - * - * We reduce the graph to remove the virtual nodes, by adding - * edges from any dependents to the virtual nodes dependents: - * - * A B A B - * │ │ │ │ - * └──►V◄──┘ ~ └─►C◄─┘ - * │ ~ - * ▼ - * C - * - * @param deploymentGraph the deployment graph with virtual vertexes - * @returns a reduced deployment graph - */ -export function reduceDeploymentGraphByEliminatingVirtualVertexes( - deploymentGraph: DeploymentGraph -): DeploymentGraph { - const virtualVertexes = [...deploymentGraph.vertexes.values()].filter( - (v) => v.type === "Virtual" - ); - - for (const virtualVertex of virtualVertexes) { - eliminateVirtualVertexFrom(deploymentGraph, virtualVertex); - } - - return deploymentGraph; -} - -function eliminateVirtualVertexFrom( - deploymentGraph: DeploymentGraph, - virtualVertex: DeploymentGraphVertex -): void { - deploymentGraph.adjacencyList = eliminate( - deploymentGraph.adjacencyList, - virtualVertex.id - ); - - deploymentGraph.vertexes.delete(virtualVertex.id); -} diff --git a/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts b/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts deleted file mode 100644 index a37c8896b5..0000000000 --- a/packages/core/src/internal/process/transformDeploymentGraphToExecutionGraph.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { ProcessStepResult } from "../../types/process"; -import { ExecutionGraph } from "../execution/ExecutionGraph"; -import { clone } from "../graph/adjacencyList"; -import { - DeploymentGraphVertex, - IDeploymentGraph, -} from "../types/deploymentGraph"; -import { ExecutionVertex, IExecutionGraph } from "../types/executionGraph"; -import { Services } from "../types/services"; -import { - processStepErrored, - processStepSucceeded, -} from "../utils/process-results"; - -import { convertDeploymentVertexToExecutionVertex } from "./transform/convertDeploymentVertexToExecutionVertex"; -import { reduceDeploymentGraphByEliminatingVirtualVertexes } from "./transform/reduceDeploymentGraphByEliminatingVirtualVertexes"; - -export async function transformDeploymentGraphToExecutionGraph( - deploymentGraph: IDeploymentGraph, - services: Services -): Promise> { - try { - const reducedDeploymentGraph = - reduceDeploymentGraphByEliminatingVirtualVertexes(deploymentGraph); - - const executionGraph: IExecutionGraph = await convertDeploymentToExecution( - reducedDeploymentGraph, - convertDeploymentVertexToExecutionVertex({ - services, - graph: reducedDeploymentGraph, - }) - ); - - return processStepSucceeded({ executionGraph }); - } catch (err) { - return processStepErrored( - err, - "Graph transformation and simplification failed" - ); - } -} - -async function convertDeploymentToExecution( - deploymentGraph: IDeploymentGraph, - convert: (vertex: DeploymentGraphVertex) => Promise -) { - const executionGraph = new ExecutionGraph(); - executionGraph.adjacencyList = clone(deploymentGraph.adjacencyList); - - for (const [id, deploymentVertex] of deploymentGraph.vertexes.entries()) { - const executionVertex = await convert(deploymentVertex); - - executionGraph.vertexes.set(id, executionVertex); - } - - return executionGraph; -} diff --git a/packages/core/src/internal/services/AccountsService.ts b/packages/core/src/internal/services/AccountsService.ts deleted file mode 100644 index d3ed84c68c..0000000000 --- a/packages/core/src/internal/services/AccountsService.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { Providers } from "../../types/providers"; -import type { IAccountsService } from "../types/services"; -import type { ethers } from "ethers"; - -export class AccountsService implements IAccountsService { - private _accounts: string[] = []; - private _signers: { [address: string]: ethers.Signer } = {}; - - constructor(private readonly _providers: Providers) {} - - public async getAccounts(): Promise { - if (this._accounts.length === 0) { - this._accounts = await this._providers.accounts.getAccounts(); - } - - return this._accounts; - } - - public async getSigner(address: string): Promise { - if (this._signers[address] === undefined) { - this._signers[address] = await this._providers.accounts.getSigner( - address - ); - } - - return this._signers[address]; - } -} diff --git a/packages/core/src/internal/services/ArtifactsService.ts b/packages/core/src/internal/services/ArtifactsService.ts deleted file mode 100644 index e72c6e92d0..0000000000 --- a/packages/core/src/internal/services/ArtifactsService.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type { ArtifactOld } from "../../types/hardhat"; -import type { Providers } from "../../types/providers"; -import type { IArtifactsService } from "../types/services"; - -export class ArtifactsService implements IArtifactsService { - constructor(private readonly _providers: Providers) {} - - public getArtifact(name: string): Promise { - return this._providers.artifacts.getArtifact(name); - } - - public hasArtifact(name: string): Promise { - return this._providers.artifacts.hasArtifact(name); - } - - public getAllArtifacts(): Promise { - return this._providers.artifacts.getAllArtifacts(); - } -} diff --git a/packages/core/src/internal/services/ConfigService.ts b/packages/core/src/internal/services/ConfigService.ts deleted file mode 100644 index 70072bfc82..0000000000 --- a/packages/core/src/internal/services/ConfigService.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { HasParamResult, Providers } from "../../types/providers"; - -import { ExternalParamValue } from "../../types/dsl"; -import { IConfigService } from "../types/services"; - -export class ConfigService implements IConfigService { - constructor(private readonly _providers: Providers) {} - - public getParam(paramName: string): Promise { - return this._providers.config.getParam(paramName); - } - - public hasParam(paramName: string): Promise { - return this._providers.config.hasParam(paramName); - } -} diff --git a/packages/core/src/internal/services/ContractsService.ts b/packages/core/src/internal/services/ContractsService.ts deleted file mode 100644 index e26795a1c2..0000000000 --- a/packages/core/src/internal/services/ContractsService.ts +++ /dev/null @@ -1,155 +0,0 @@ -import type { - ContractsServiceProviders, - IContractsService, - TransactionOptions, -} from "../types/services"; - -import setupDebug from "debug"; -import { ethers } from "ethers"; - -import { IgnitionError } from "../../errors"; -import { sleep } from "../utils/sleep"; -import { TxSender } from "../utils/tx-sender"; - -export class ContractsService implements IContractsService { - private _debug = setupDebug("ignition:services:contracts-service"); - - constructor( - private _providers: ContractsServiceProviders, - private _txSender: TxSender - ) {} - - public async sendTx( - deployTransaction: ethers.providers.TransactionRequest, - txOptions: TransactionOptions - ): Promise { - if (deployTransaction.to !== undefined) { - this._debug("Calling method of contract"); - } else { - this._debug("Deploying contract"); - } - - return this._sendTx(txOptions.signer, deployTransaction, txOptions); - } - - private async _sendTx( - signer: ethers.Signer, - tx: ethers.providers.TransactionRequest, - txOptions: TransactionOptions - ): Promise { - if (txOptions?.gasLimit !== undefined) { - tx.gasLimit = ethers.BigNumber.from(txOptions.gasLimit); - } - - if (txOptions?.gasPrice !== undefined) { - tx.gasPrice = ethers.BigNumber.from(txOptions.gasPrice); - } - - let blockNumberWhenSent = - await this._providers.web3Provider.getBlockNumber(); - - let txHash = await this._txSender.send(signer, tx); - - let txSent = tx; - let retries = 0; - while (true) { - const currentBlockNumber = - await this._providers.web3Provider.getBlockNumber(); - - if (await this._providers.transactionsProvider.isConfirmed(txHash)) { - break; - } - - if (blockNumberWhenSent + 5 <= currentBlockNumber) { - if (retries === txOptions.maxRetries) { - throw new IgnitionError( - "Transaction not confirmed within max retry limit" - ); - } - - const txToSend = await this._bump( - txHash, - signer, - txSent, - txHash, - txOptions.gasPriceIncrementPerRetry - ); - - blockNumberWhenSent = - await this._providers.web3Provider.getBlockNumber(); - - txHash = await this._txSender.sendAndReplace(signer, txToSend); - - txSent = txToSend; - retries++; - } - - await sleep(txOptions.pollingInterval); - } - - return txHash; - } - - private async _bump( - _txHash: string, - _signer: ethers.Signer, - previousTxRequest: ethers.providers.TransactionRequest, - previousTxHash: string, - gasPriceIncrementPerRetry: ethers.BigNumber | null - ): Promise { - const previousTx = await this._providers.web3Provider.getTransaction( - previousTxHash - ); - - const newEstimatedGasPrice = - await this._providers.gasProvider.estimateGasPrice(); - - if (previousTx.gasPrice !== undefined) { - // Increase 10%, and add 1 to be sure it's at least rounded up - // or add by user's config value if present - const newGasPrice = - gasPriceIncrementPerRetry !== null - ? ethers.BigNumber.from(previousTx.gasPrice).add( - gasPriceIncrementPerRetry - ) - : ethers.BigNumber.from(previousTx.gasPrice) - .mul(110000) - .div(100000) - .add(1); - - return { - ...previousTxRequest, - nonce: previousTx.nonce, - gasPrice: newEstimatedGasPrice.gt(newGasPrice) - ? newEstimatedGasPrice - : newGasPrice, - }; - } else if ( - previousTx.maxFeePerGas !== undefined && - previousTx.maxPriorityFeePerGas !== undefined - ) { - const newMaxFeePerGas = ethers.BigNumber.from(previousTx.maxFeePerGas) - .mul(110000) - .div(100000) - .add(1); - - const newMaxPriorityFeePerGas = ethers.BigNumber.from( - previousTx.maxPriorityFeePerGas - ) - .mul(110000) - .div(100000) - .add(1); - - return { - ...previousTxRequest, - nonce: previousTx.nonce, - maxFeePerGas: newMaxFeePerGas, - maxPriorityFeePerGas: newMaxPriorityFeePerGas, - }; - } - - throw new IgnitionError( - `Transaction doesn't have gasPrice or maxFeePerGas/maxPriorityFeePerGas` - ); - } -} diff --git a/packages/core/src/internal/services/NetworkService.ts b/packages/core/src/internal/services/NetworkService.ts deleted file mode 100644 index 67c6e2696e..0000000000 --- a/packages/core/src/internal/services/NetworkService.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Providers } from "../../types/providers"; -import { INetworkService } from "../types/services"; - -export class NetworkService implements INetworkService { - constructor(private readonly _providers: Providers) {} - - public async getChainId(): Promise { - const result = await this._providers.ethereumProvider.request({ - method: "eth_chainId", - }); - - return Number(result); - } -} diff --git a/packages/core/src/internal/services/TransactionsService.ts b/packages/core/src/internal/services/TransactionsService.ts deleted file mode 100644 index c7b824ccd2..0000000000 --- a/packages/core/src/internal/services/TransactionsService.ts +++ /dev/null @@ -1,39 +0,0 @@ -import type { Providers } from "../../types/providers"; -import type { ITransactionsService } from "../types/services"; - -import { ethers } from "ethers"; - -export class TransactionsService implements ITransactionsService { - constructor(private readonly _providers: Providers) {} - - public async wait( - txHash: string - ): Promise { - const provider = new ethers.providers.Web3Provider( - this._providers.ethereumProvider - ); - - return provider.waitForTransaction(txHash); - } - - public async waitForEvent( - filter: ethers.EventFilter, - durationMs: number - ): Promise { - const provider = new ethers.providers.Web3Provider( - this._providers.ethereumProvider - ); - - return new Promise((resolve) => { - const timeout = setTimeout(() => { - resolve(null); - }, durationMs); - - provider.once(filter, (log) => { - clearTimeout(timeout); - - resolve(log); - }); - }); - } -} diff --git a/packages/core/src/internal/services/createServices.ts b/packages/core/src/internal/services/createServices.ts deleted file mode 100644 index eaee22570a..0000000000 --- a/packages/core/src/internal/services/createServices.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ethers } from "ethers"; - -import { Providers } from "../../types/providers"; -import { Services } from "../types/services"; -import { TxSender } from "../utils/tx-sender"; - -import { AccountsService } from "./AccountsService"; -import { ArtifactsService } from "./ArtifactsService"; -import { ConfigService } from "./ConfigService"; -import { ContractsService } from "./ContractsService"; -import { NetworkService } from "./NetworkService"; -import { TransactionsService } from "./TransactionsService"; - -export function createServices(providers: Providers): Services { - const txSender = new TxSender(providers.gasProvider); - - const services: Services = { - network: new NetworkService(providers), - artifacts: new ArtifactsService(providers), - contracts: new ContractsService( - { - gasProvider: providers.gasProvider, - transactionsProvider: providers.transactions, - web3Provider: new ethers.providers.Web3Provider( - providers.ethereumProvider - ), - }, - txSender - ), - transactions: new TransactionsService(providers), - config: new ConfigService(providers), - accounts: new AccountsService(providers), - }; - - return services; -} diff --git a/packages/core/src/internal/types/deployment.ts b/packages/core/src/internal/types/deployment.ts deleted file mode 100644 index c7ea3135fb..0000000000 --- a/packages/core/src/internal/types/deployment.ts +++ /dev/null @@ -1,304 +0,0 @@ -import type { ModuleDict, ModuleParams } from "../../types/module"; -import type { SerializedDeploymentResult } from "../../types/serialization"; -import type { - ExecutionVertex, - ExecutionVertexVisitResult, - VertexVisitResultSuccessResult, -} from "./executionGraph"; -import type { - IGraph, - VertexDescriptor, - VertexVisitResultFailure, - VertexVisitResultSuccess, -} from "./graph"; -import type { Services } from "./services"; - -import { BigNumber } from "ethers"; - -import { ArtifactOld } from "../../types/hardhat"; - -/** - * An UI update function that will be invoked on each internal change with the - * latest version of the state. - * - * @internal - */ -export type UpdateUiAction = (deployState: DeployState) => void; -export type UiParamsClosure = (moduleParams?: ModuleParams) => UpdateUiAction; - -/** - * The possible deployment states. - * - * @internal - */ -export enum DeploymentResultState { - SUCCESS = "success", - FAILURE = "failure", - HOLD = "hold", -} - -/** - * The outcome of a deployment run. A deployment can either: - * - `success` with a set of deployed contract information as the result - * - `failure` with a list of errors - * - `hold` indicating that the deployment is part way through but either - * blocked or timed out. - * - * @internal - */ -export type DeploymentResult = - | { _kind: DeploymentResultState.FAILURE; failures: [string, Error[]] } - | { _kind: DeploymentResultState.HOLD; holds: VertexDescriptor[] } - | { - _kind: DeploymentResultState.SUCCESS; - result: SerializedDeploymentResult; - }; - -/** - * The different phases a deployment will move through: - * - * uninitialized -\> validating -\> execution -\> complete - * | |--------\> hold - * | |--------\> failed - * | - * |----------------------\> validation-failed - * |----------------------\> reconciliation-failed - * - * @internal - */ -export type DeployPhase = - | "uninitialized" - | "validating" - | "execution" - | "complete" - | "failed" - | "hold" - | "validation-failed" - | "reconciliation-failed" - | "failed-unexpectedly"; - -/** - * Commands for updating Ignitions execution state; external interactions - * with the blockchain are integrated into the Ignition execution state - * through these commands. - * - * @internal - */ -export type DeployStateExecutionCommand = - | { - type: "EXECUTION::START"; - executionGraphHash: string; - } - | { - type: "EXECUTION::SET_BATCH"; - batch: number[]; - } - | { - type: "EXECUTION::SET_VERTEX_RESULT"; - vertexId: number; - result: ExecutionVertexVisitResult; - }; - -export type DeployStateCommand = - | { type: "SET_DETAILS"; config: Partial } - | { type: "SET_CHAIN_ID"; chainId: number } - | { type: "SET_NETWORK_NAME"; networkName: string } - | { type: "SET_ACCOUNTS"; accounts: string[] } - | { type: "SET_FORCE_FLAG"; force: boolean } - | { - type: "START_VALIDATION"; - } - | { - type: "VALIDATION_FAIL"; - errors: Error[]; - } - | { - type: "TRANSFORM_COMPLETE"; - executionGraph: IGraph; - } - | { - type: "RECONCILIATION_FAILED"; - } - | { - type: "UNEXPECTED_FAIL"; - errors: Error[]; - } - | DeployStateExecutionCommand; - -/** - * The subsection of the deployment state used during the validation phase - * of a deployment, where the user's given Module is analysed for potential - * problems. - * - * @internal - */ -export interface ValidationState { - errors: Error[]; -} - -/** - * The vertex has not yet been executed for this deployment run. - * - * @internal - */ -export type VertexExecutionStatusUnstarted = "UNSTARTED"; - -/** - * The vertex is currently being executed, but the result has come back yet. - * - * @internal - */ -export type VertexExecutionStatusRunning = "RUNNING"; - -/** - * The action the vertex represented has completed successfully. - * - * @internal - */ -export type VertexExecutionStatusCompleted = "COMPLETED"; - -/** - * The action the vertex represented has failed with an error. - * - * @internal - */ -export type VertexExecutionStatusFailed = "FAILED"; - -/** - * The action the vertex represented either timed out or its condition - * has not been met withint the time out. - * - * @internal - */ -export type VertexExecutionStatusHold = "HOLD"; - -export type VertexExecutionStatus = - | VertexExecutionStatusUnstarted - | VertexExecutionStatusRunning - | VertexExecutionStatusCompleted - | VertexExecutionStatusFailed - | VertexExecutionStatusHold; - -/** - * The state associated with a currently running vertex execution. - * - * @internal - */ -export interface VertexExecutionStateRunning { - status: VertexExecutionStatusUnstarted; - result: undefined; -} - -/** - * The state associated with an unstarted vertex execution. - * - * @internal - */ -export interface VertexExecutionStateUnstarted { - status: VertexExecutionStatusRunning; - result: undefined; -} - -/** - * The state associated with a successfully completed execution of a vertex. - * - * @internal - */ -export interface VertexExecutionStateCompleted { - status: VertexExecutionStatusCompleted; - result: VertexVisitResultSuccess; -} - -/** - * The state associated with a failed execution of a vertex. - * - * @internal - */ -export interface VertexExecutionStateFailed { - status: VertexExecutionStatusFailed; - result: VertexVisitResultFailure; -} - -/** - * The state associated with a held execution of a vertex, either - * due to a time out or a condition not met. - * - * @internal - */ -export interface VertexExecutionStateHold { - status: VertexExecutionStatusHold; - result: undefined; -} - -/** - * The states a vertex can go through during execution. - * - * @internal - */ -export type VertexExecutionState = - | VertexExecutionStateUnstarted - | VertexExecutionStateRunning - | VertexExecutionStateCompleted - | VertexExecutionStateFailed - | VertexExecutionStateHold; - -/** - * The part of the deployment state used during the execution phase where - * the dependency graph of on-chain actions are batched then executed with - * their results recorded. - * - * @internal - */ -export interface ExecutionState { - run: number; - vertexes: { [key: number]: VertexExecutionState }; - batch: Set | null; - previousBatches: Array>; - executionGraphHash: string; -} - -/** - * The key details and configuration used to interact with or understand - * the Ethereum chain being interacted with. - * - * @internal - */ -export interface DeployNetworkConfig { - moduleName: string; - chainId: number; - networkName: string; - accounts: string[]; - artifacts: ArtifactOld[]; - force: boolean; -} - -/** - * The core state of an Ignition deploy. Ignitions control flow is based on - * this state, and updates to it are controlled through update commands. - * - * @internal - */ -export interface DeployState { - phase: DeployPhase; - details: DeployNetworkConfig; - validation: ValidationState; - transform: { - executionGraph: IGraph | null; - }; - execution: ExecutionState; - unexpected: { - errors: Error[]; - }; -} - -export interface ExecutionOptions { - maxRetries: number; - gasPriceIncrementPerRetry: BigNumber | null; - pollingInterval: number; - eventDuration: number; -} - -export interface ExecutionContext { - services: Services; - options: ExecutionOptions; -} diff --git a/packages/core/src/internal/types/deploymentGraph.ts b/packages/core/src/internal/types/deploymentGraph.ts deleted file mode 100644 index 5fe005fbd6..0000000000 --- a/packages/core/src/internal/types/deploymentGraph.ts +++ /dev/null @@ -1,229 +0,0 @@ -import type { BigNumber } from "ethers"; - -import { InternalParamValue } from "../../types/dsl"; -import { - AddressResolvable, - ArtifactContract, - ContractFutureOld, - DeploymentGraphFuture, - EventParamFuture, - HardhatContract, - ParameterFuture, - Virtual, -} from "../../types/future"; -import { ArtifactOld } from "../../types/hardhat"; - -import { AdjacencyList, VertexDescriptor } from "./graph"; - -/** - * Scope data to manage internal nested calls to submodules. - * - * @internal - */ -export interface ScopeData { - before: Virtual; - after?: Virtual; - parameters?: { [key: string]: string | number | DeploymentGraphFuture }; -} - -/** - * A dependency graph that matches the deployment decribed by a Module. - * - * @internal - */ -export interface IDeploymentGraph { - vertexes: Map; - adjacencyList: AdjacencyList; - scopeData: { - [key: string]: ScopeData; - }; - getEdges(): Array<{ from: number; to: number }>; -} - -/** - * A mapping of library names to the future address - * of the deployed library. - * - * @internal - */ -export interface LibraryMap { - [key: string]: DeploymentGraphFuture; -} - -/** - * A vertex representing an action specified in the Deployment api. - * - * @internal - */ -export type DeploymentGraphVertex = - | HardhatContractDeploymentVertex - | ArtifactContractDeploymentVertex - | DeployedContractDeploymentVertex - | HardhatLibraryDeploymentVertex - | ArtifactLibraryDeploymentVertex - | CallDeploymentVertex - | StaticCallDeploymentVertex - | VirtualVertex - | EventVertex - | SendVertex; - -/** - * Deploy a contract, where the contract will be retrieved by name - * from Hardhat's Artifact store. - * - * @internal - */ -export interface HardhatContractDeploymentVertex extends VertexDescriptor { - type: "HardhatContract"; - scopeAdded: string; - contractName: string; - args: InternalParamValue[]; - libraries: LibraryMap; - after: DeploymentGraphFuture[]; - value: BigNumber | ParameterFuture; - from: string; -} - -/** - * Deploy a contract based on a given Artifact. - * - * @internal - */ -export interface ArtifactContractDeploymentVertex extends VertexDescriptor { - type: "ArtifactContract"; - scopeAdded: string; - artifact: ArtifactOld; - args: InternalParamValue[]; - libraries: LibraryMap; - after: DeploymentGraphFuture[]; - value: BigNumber | ParameterFuture; - from: string; -} - -/** - * Refer to an existing deployed contract, for later use in the Module. - * - * @internal - */ -export interface DeployedContractDeploymentVertex extends VertexDescriptor { - type: "DeployedContract"; - scopeAdded: string; - address: string | EventParamFuture; - abi: any[]; - after: DeploymentGraphFuture[]; -} - -/** - * Deploy a library, where the library will be retrieved by name - * from Hardhat's Artifact store. - * - * @internal - */ -export interface HardhatLibraryDeploymentVertex extends VertexDescriptor { - type: "HardhatLibrary"; - libraryName: string; - scopeAdded: string; - args: InternalParamValue[]; - after: DeploymentGraphFuture[]; - from: string; -} - -/** - * Deploy a library based on a given artifact. - * - * @internal - */ -export interface ArtifactLibraryDeploymentVertex extends VertexDescriptor { - type: "ArtifactLibrary"; - scopeAdded: string; - artifact: ArtifactOld; - args: InternalParamValue[]; - after: DeploymentGraphFuture[]; - from: string; -} - -/** - * Invoke a smart contract method. - * - * @internal - */ -export interface CallDeploymentVertex extends VertexDescriptor { - type: "Call"; - scopeAdded: string; - contract: ContractFutureOld; - method: string; - args: InternalParamValue[]; - after: DeploymentGraphFuture[]; - value: BigNumber | ParameterFuture; - from: string; -} - -/** - * Read from a smart contract method. - * - * @internal - */ -export interface StaticCallDeploymentVertex extends VertexDescriptor { - type: "StaticCall"; - scopeAdded: string; - contract: ContractFutureOld; - method: string; - args: InternalParamValue[]; - after: DeploymentGraphFuture[]; - from: string; -} - -/** - * A non-action vertex used to represent group relationships. The virtual - * vertex can depend on many other vertexes, so a dependency on the virtual - * vertex will mean depending on all its dependents. - * - * The virtual vertex is removed during translation to a simplified - * execution graph. - * - * @internal - */ -export interface VirtualVertex extends VertexDescriptor { - type: "Virtual"; - scopeAdded: string; - after: DeploymentGraphFuture[]; -} - -/** - * Await on an on-chain Ethereum event. - * - * @internal - */ -export interface EventVertex extends VertexDescriptor { - type: "Event"; - scopeAdded: string; - abi: any[]; - address: string | ArtifactContract | HardhatContract | EventParamFuture; - event: string; - args: InternalParamValue[]; - after: DeploymentGraphFuture[]; -} - -/** - * Send ETH to a contract/address. - * - * @internal - */ -export interface SendVertex extends VertexDescriptor { - type: "SendETH"; - scopeAdded: string; - address: AddressResolvable; - value: BigNumber | ParameterFuture; - after: DeploymentGraphFuture[]; - from: string; -} - -export interface DeploymentBuilderOptions { - chainId: number; - accounts: string[]; - artifacts: ArtifactOld[]; -} - -export interface CallPoints { - [key: number]: Error; -} diff --git a/packages/core/src/internal/types/execution.ts b/packages/core/src/internal/types/execution.ts deleted file mode 100644 index b467926a2f..0000000000 --- a/packages/core/src/internal/types/execution.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { ExecutionContext } from "./deployment"; -import type { - ExecutionResultsAccumulator, - ExecutionVertex, - ExecutionVertexVisitResult, -} from "./executionGraph"; - -export type ExecutionVertexDispatcher = ( - vertex: ExecutionVertex, - resultAccumulator: ExecutionResultsAccumulator, - context: ExecutionContext -) => Promise; diff --git a/packages/core/src/internal/types/executionGraph.ts b/packages/core/src/internal/types/executionGraph.ts deleted file mode 100644 index 02eb836975..0000000000 --- a/packages/core/src/internal/types/executionGraph.ts +++ /dev/null @@ -1,276 +0,0 @@ -import type { BigNumber, ethers } from "ethers"; - -import { - AddressResolvable, - ArtifactContract, - DeploymentGraphFuture, - EventParamFuture, - HardhatContract, -} from "../../types/future"; -import { ArtifactOld } from "../../types/hardhat"; - -import { LibraryMap } from "./deploymentGraph"; -import { - AdjacencyList, - ResultsAccumulator, - VertexDescriptor, - VertexVisitResult, - VisitResult, -} from "./graph"; - -/** - * A dependency graph for on-chain execution. - * - * @internal - */ -export interface IExecutionGraph { - adjacencyList: AdjacencyList; - vertexes: Map; - getEdges(): Array<{ from: number; to: number }>; -} - -/** - * The base value that Ethereum ABIs accept. - * - * @internal - */ -export type BaseArgValue = number | BigNumber | string | boolean; - -/** - * A composite (i.e. arrays and nested objects) of base value that Ethereum - * ABIs accept. - * - * @internal - */ -export type StructuredArgValue = - | BaseArgValue - | StructuredArgValue[] - | { [field: string]: StructuredArgValue }; - -/** - * The allowed values when passing an argument to a smart contract method call. - * - * @internal - */ -export type ArgValue = - | BaseArgValue - | StructuredArgValue - | DeploymentGraphFuture; - -/** - * The different types of the vertexes of the execution graph. - * - * @internal - */ -export type ExecutionVertexType = - | "ContractDeploy" - | "DeployedContract" - | "LibraryDeploy" - | "ContractCall" - | "StaticContractCall" - | "AwaitedEvent" - | "SentETH"; - -/** - * The vertexes of the execution graph. - * - * @internal - */ -export type ExecutionVertex = - | ContractDeployExecutionVertex - | DeployedContractExecutionVertex - | LibraryDeployExecutionVertex - | ContractCallExecutionVertex - | StaticContractCallExecutionVertex - | AwaitedEventExecutionVertex - | SentETHExecutionVertex; - -/** - * Deploy a contract based on the given artifact. - * - * @internal - */ -export interface ContractDeployExecutionVertex extends VertexDescriptor { - type: "ContractDeploy"; - artifact: ArtifactOld; - args: ArgValue[]; - libraries: LibraryMap; - value: BigNumber; - signer: ethers.Signer; -} - -/** - * Make no on-chain action but substitute an already known - * address and abi. - * - * @internal - */ -export interface DeployedContractExecutionVertex extends VertexDescriptor { - type: "DeployedContract"; - address: string | EventParamFuture; - abi: any[]; -} - -/** - * Deploy a library based on the given artifact. - * - * @internal - */ -export interface LibraryDeployExecutionVertex extends VertexDescriptor { - type: "LibraryDeploy"; - artifact: ArtifactOld; - args: ArgValue[]; - signer: ethers.Signer; -} - -/** - * Make a method call to a smart chain contract. - * - * @internal - */ -export interface ContractCallExecutionVertex extends VertexDescriptor { - type: "ContractCall"; - contract: any; - method: string; - args: ArgValue[]; - value: BigNumber; - signer: ethers.Signer; -} - -/** - * Make a static call to a read-only method of a smart chain contract. - * - * @internal - */ -export interface StaticContractCallExecutionVertex extends VertexDescriptor { - type: "StaticContractCall"; - contract: any; - method: string; - args: ArgValue[]; - signer: ethers.Signer; -} - -/** - * Wait for the an Ethereum event to execute. - * - * @internal - */ -export interface AwaitedEventExecutionVertex extends VertexDescriptor { - type: "AwaitedEvent"; - abi: any[]; - address: string | ArtifactContract | HardhatContract | EventParamFuture; - event: string; - args: ArgValue[]; -} - -/** - * Transfer ETH to a contract/address. - * - * @internal - */ -export interface SentETHExecutionVertex extends VertexDescriptor { - type: "SentETH"; - address: AddressResolvable; - value: BigNumber; - signer: ethers.Signer; -} - -/** - * The result of a successful contract deployment. - * - * @internal - */ -export interface ContractDeploySuccess { - name: string; - abi: any[]; - bytecode: string; - address: string; - value: ethers.BigNumber; -} - -/** - * The result of a successful existing contract. - * - * @internal - */ -export interface DeployedContractSuccess { - name: string; - abi: any[]; - address: string; -} - -/** - * The result of a successful library deployment. - * - * @internal - */ -export interface LibraryDeploySuccess { - name: string; - abi: any[]; - bytecode: string; - address: string; -} - -/** - * The result of a successful wait on an Ethereum event. - * - * @internal - */ -export interface AwaitedEventSuccess { - topics: ethers.utils.Result; -} - -/** - * The result of a successful smart contract method invocation. - * - * @internal - */ -export interface ContractCallSuccess { - hash: string; -} - -/** - * The result of a successful smart contract static call. - * - * @internal - */ -export interface StaticContractCallSuccess { - data: BaseArgValue | ethers.utils.Result; -} - -/** - * The result of a successful transfer of ETH to a contract/address. - * - * @internal - */ -export interface SendETHSuccess { - hash: string; - value: ethers.BigNumber; -} - -/** - * The result of a successful vertex execution. - * - * @internal - */ -export type VertexVisitResultSuccessResult = - | ContractDeploySuccess - | DeployedContractSuccess - | LibraryDeploySuccess - | AwaitedEventSuccess - | ContractCallSuccess - | StaticContractCallSuccess - | SendETHSuccess; - -/** - * The result of a processing a vertex of the execution graph. - * - * @internal - */ -export type ExecutionVertexVisitResult = - VertexVisitResult; - -export type ExecutionResultsAccumulator = - ResultsAccumulator; - -export type ExecutionVisitResult = VisitResult; diff --git a/packages/core/src/internal/types/graph.ts b/packages/core/src/internal/types/graph.ts deleted file mode 100644 index 1af04dab89..0000000000 --- a/packages/core/src/internal/types/graph.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * An abstraction for representing the edges of a graph, - * where a from vertex id is matched to a set of linked - * to vertexes. - * - * @internal - */ -export type AdjacencyList = Map>; - -/** - * An adjacency list based graph. - * - * @internal - */ -export interface IGraph { - adjacencyList: AdjacencyList; - vertexes: Map; - getEdges(): Array<{ from: number; to: number }>; -} - -/** - * An Ignition on-chain action as part of a depedency graph. - * - * @internal - */ -export interface VertexDescriptor { - id: number; - label: string; - type: string; - args?: any[]; -} - -/** - * A graph of Ignition on-chain actions. - * - * @internal - */ -export type VertexGraph = IGraph; - -/** - * The different possibilities of processing a dependency graph vertex. - * - * @internal - */ -export enum VertexResultEnum { - SUCCESS = "success", - FAILURE = "failure", - HOLD = "hold", -} - -/** - * The result of performing the vertex actioni succeeded with the result. - * - * @internal - */ -export interface VertexVisitResultSuccess { - _kind: VertexResultEnum.SUCCESS; - result: T; -} - -/** - * The result of performing the vertex action failed with the given error. - * - * @internal - */ -export interface VertexVisitResultFailure { - _kind: VertexResultEnum.FAILURE; - failure: Error; -} - -/** - * The result of performing the vertex action either timed out or did not - * meet the test condition. - * - * @internal - */ -export interface VertexVisitResultHold { - _kind: VertexResultEnum.HOLD; -} - -/** - * The result of processing a vertex in the dependency graph, either a - * success, failure or on hold. - * - * @internal - */ -export type VertexVisitResult = - | VertexVisitResultSuccess - | VertexVisitResultFailure - | VertexVisitResultHold; - -/** - * The possible state of processing a visit pass. - * - * @internal - */ -export enum VisitResultState { - SUCCESS = "success", - FAILURE = "failure", - HOLD = "hold", -} - -export type VisitResult = - | { - _kind: VisitResultState.SUCCESS; - result: ResultsAccumulator; - } - | { - _kind: VisitResultState.FAILURE; - failures: [string, Error[]]; - } - | { - _kind: VisitResultState.HOLD; - holds: VertexDescriptor[]; - }; - -export type ResultsAccumulator = Map< - number, - VertexVisitResult | undefined ->; diff --git a/packages/core/src/internal/types/journal.ts b/packages/core/src/internal/types/journal.ts deleted file mode 100644 index b050cec752..0000000000 --- a/packages/core/src/internal/types/journal.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { DeployStateExecutionCommand } from "./deployment"; - -export interface JournalEntry { - txHash: string; - blockNumberWhenSent: number; -} - -/** - * A journal keeps track of all the transactions sent during a deployment. If a - * deployment is interrupted and resumed later for any reason, the journal can - * then be used to avoid re-sending transactions if possible. - */ -export interface Journal { - addEntry( - moduleId: string, - executorId: string, - entry: JournalEntry - ): Promise; - getEntry( - moduleId: string, - executorId: string, - entryIndex: number - ): Promise; - replaceEntry( - moduleId: string, - executorId: string, - entryIndex: number, - entry: JournalEntry - ): Promise; - delete(moduleId: string): Promise; -} - -/** - * An adapter to record and retrieve a transaction log of deployment state - * changes. - * - * @internal - */ -export interface ICommandJournal { - /** - * Store a record of the given command - * @param command - The deployment update command to record - * - * @internal - */ - record(command: DeployStateExecutionCommand): Promise; - - /** - * Read out the stored deployment update commands. - */ - read(): AsyncGenerator; - readAll(): AsyncGenerator< - DeployStateExecutionCommand & { chainId: number }, - void, - unknown - >; -} diff --git a/packages/core/src/internal/types/services.ts b/packages/core/src/internal/types/services.ts deleted file mode 100644 index 36c614ce67..0000000000 --- a/packages/core/src/internal/types/services.ts +++ /dev/null @@ -1,114 +0,0 @@ -import type { ArtifactOld } from "../../types/hardhat"; -import type { - GasProvider, - HasParamResult, - TransactionsProvider, -} from "../../types/providers"; -import type { ExternalParamValue } from "./../../types/dsl"; - -import { ethers } from "ethers"; - -/** - * Access a set of predefined ethereum accounts and their equivalent signers. - * - * @internal - */ -export interface IAccountsService { - getAccounts(): Promise; - getSigner(address: string): Promise; -} - -/** - * Provide access to contract artifacts (i.e. the container for a contract's - * abi, bytecode and other key metadata). - * - * @internal - */ -export interface IArtifactsService { - getArtifact(name: string): Promise; - hasArtifact(name: string): Promise; - getAllArtifacts(): Promise; -} - -/** - * Provide access to underlying configuration options. - * - * @internal - */ -export interface IConfigService { - getParam(paramName: string): Promise; - - hasParam(paramName: string): Promise; -} - -/** - * Allow the sending of transactions to smart contracts on-chain. - * - * @internal - */ -export interface IContractsService { - sendTx( - deployTransaction: ethers.providers.TransactionRequest, - txOptions?: TransactionOptions - ): Promise; -} - -/** - * Provide access to details of the chain being deployed against. - * - * @internal - */ -export interface INetworkService { - getChainId(): Promise; -} - -/** - * Provide general access to the target chains transaction and event - * processing. - * - * @internal - */ -export interface ITransactionsService { - wait(txHash: string): Promise; - waitForEvent( - filter: ethers.EventFilter, - durationMs: number - ): Promise; -} - -/** - * Configuration options to be sent to the target chain with the transaction - * to be processed. - * - * @internal - */ -export interface TransactionOptions { - gasLimit?: ethers.BigNumberish; - gasPrice?: ethers.BigNumberish; - maxRetries: number; - gasPriceIncrementPerRetry: ethers.BigNumber | null; - pollingInterval: number; - signer: ethers.Signer; -} - -export interface ContractsServiceProviders { - web3Provider: ethers.providers.Web3Provider; - transactionsProvider: TransactionsProvider; - gasProvider: GasProvider; -} - -/** - * Adapter implementations for the underlying services that represent - * Ignitions interactions with external systems (i.e. the target blockchain, - * the filesystem etc). - * - * @internal - */ -export interface Services { - network: INetworkService; - contracts: IContractsService; - artifacts: IArtifactsService; - transactions: ITransactionsService; - config: IConfigService; - accounts: IAccountsService; -} diff --git a/packages/core/src/internal/types/validation.ts b/packages/core/src/internal/types/validation.ts deleted file mode 100644 index 8eef0574fd..0000000000 --- a/packages/core/src/internal/types/validation.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CallPoints } from "./deploymentGraph"; -import { ResultsAccumulator, VertexVisitResult, VisitResult } from "./graph"; -import { Services } from "./services"; - -export type ValidationVisitResult = VisitResult; - -export type ValidationVertexVisitResult = VertexVisitResult; - -export type ValidationResultsAccumulator = ResultsAccumulator; - -export interface ValidationDispatchContext { - services: Services; - callPoints: CallPoints; -} diff --git a/packages/core/src/internal/utils/collectLibrariesAndLink.ts b/packages/core/src/internal/utils/collectLibrariesAndLink.ts deleted file mode 100644 index e902a3d394..0000000000 --- a/packages/core/src/internal/utils/collectLibrariesAndLink.ts +++ /dev/null @@ -1,134 +0,0 @@ -// eslint-disable-next-line import/no-extraneous-dependencies -import { IgnitionError } from "../../errors"; -import { ArtifactOld } from "../../types/hardhat"; - -interface Link { - sourceName: string; - libraryName: string; - address: string; -} - -interface Libraries { - [libraryName: string]: string; -} - -export async function collectLibrariesAndLink( - artifact: ArtifactOld, - libraries: Libraries -) { - const { utils } = await import("ethers"); - - const neededLibraries: Array<{ - sourceName: string; - libName: string; - }> = []; - for (const [sourceName, sourceLibraries] of Object.entries( - artifact.linkReferences - )) { - for (const libName of Object.keys(sourceLibraries)) { - neededLibraries.push({ sourceName, libName }); - } - } - - const linksToApply: Map = new Map(); - for (const [linkedLibraryName, linkedLibraryAddress] of Object.entries( - libraries - )) { - if (!utils.isAddress(linkedLibraryAddress)) { - throw new IgnitionError( - `You tried to link the contract ${artifact.contractName} with the library ${linkedLibraryName}, but provided this invalid address: ${linkedLibraryAddress}` - ); - } - - const matchingNeededLibraries = neededLibraries.filter((lib) => { - return ( - lib.libName === linkedLibraryName || - `${lib.sourceName}:${lib.libName}` === linkedLibraryName - ); - }); - - if (matchingNeededLibraries.length === 0) { - let detailedMessage: string; - if (neededLibraries.length > 0) { - const libraryFQNames = neededLibraries - .map((lib) => `${lib.sourceName}:${lib.libName}`) - .map((x) => `* ${x}`) - .join("\n"); - detailedMessage = `The libraries needed are: -${libraryFQNames}`; - } else { - detailedMessage = "This contract doesn't need linking any libraries."; - } - throw new IgnitionError( - `You tried to link the contract ${artifact.contractName} with ${linkedLibraryName}, which is not one of its libraries. -${detailedMessage}` - ); - } - - if (matchingNeededLibraries.length > 1) { - const matchingNeededLibrariesFQNs = matchingNeededLibraries - .map(({ sourceName, libName }) => `${sourceName}:${libName}`) - .map((x) => `* ${x}`) - .join("\n"); - throw new IgnitionError( - `The library name ${linkedLibraryName} is ambiguous for the contract ${artifact.contractName}. -It may resolve to one of the following libraries: -${matchingNeededLibrariesFQNs} -To fix this, choose one of these fully qualified library names and replace where appropriate.` - ); - } - - const [neededLibrary] = matchingNeededLibraries; - - const neededLibraryFQN = `${neededLibrary.sourceName}:${neededLibrary.libName}`; - - // The only way for this library to be already mapped is - // for it to be given twice in the libraries user input: - // once as a library name and another as a fully qualified library name. - if (linksToApply.has(neededLibraryFQN)) { - throw new IgnitionError( - `The library names ${neededLibrary.libName} and ${neededLibraryFQN} refer to the same library and were given as two separate library links. -Remove one of them and review your library links before proceeding.` - ); - } - - linksToApply.set(neededLibraryFQN, { - sourceName: neededLibrary.sourceName, - libraryName: neededLibrary.libName, - address: linkedLibraryAddress, - }); - } - - if (linksToApply.size < neededLibraries.length) { - const missingLibraries = neededLibraries - .map((lib) => `${lib.sourceName}:${lib.libName}`) - .filter((libFQName) => !linksToApply.has(libFQName)) - .map((x) => `* ${x}`) - .join("\n"); - - throw new IgnitionError( - `The contract ${artifact.contractName} is missing links for the following libraries: -${missingLibraries} -Learn more about linking contracts at https://hardhat.org/plugins/nomiclabs-hardhat-ethers.html#library-linking -` - ); - } - - return linkBytecode(artifact, [...linksToApply.values()]); -} - -function linkBytecode(artifact: ArtifactOld, libraries: Link[]): string { - let bytecode = artifact.bytecode; - - for (const { sourceName, libraryName, address } of libraries) { - const linkReferences = artifact.linkReferences[sourceName][libraryName]; - for (const { start, length } of linkReferences) { - bytecode = - bytecode.substr(0, 2 + start * 2) + - address.substr(2) + - bytecode.substr(2 + (start + length) * 2); - } - } - - return bytecode; -} diff --git a/packages/core/src/internal/utils/guards.ts b/packages/core/src/internal/utils/guards.ts deleted file mode 100644 index 56df474d6f..0000000000 --- a/packages/core/src/internal/utils/guards.ts +++ /dev/null @@ -1,162 +0,0 @@ -import type { - ContractFutureOld, - DependableFuture, - DeploymentGraphFuture, - EventParamFuture, - OptionalParameter, - ProxyFuture, - RequiredParameter, - StaticContractCall, - Virtual, -} from "../../types/future"; -import type { - ArtifactContractDeploymentVertex, - ArtifactLibraryDeploymentVertex, - CallDeploymentVertex, - DeployedContractDeploymentVertex, - DeploymentGraphVertex, - EventVertex, - HardhatContractDeploymentVertex, - HardhatLibraryDeploymentVertex, - StaticCallDeploymentVertex, -} from "../types/deploymentGraph"; - -import { IgnitionError } from "../../errors"; -import { ArtifactOld } from "../../types/hardhat"; -import { ModuleDict } from "../../types/module"; - -export function isArtifact(artifact: any): artifact is ArtifactOld { - return ( - artifact !== null && - artifact !== undefined && - artifact.bytecode && - artifact.abi - ); -} - -export function isHardhatContract( - node: DeploymentGraphVertex -): node is HardhatContractDeploymentVertex { - return node.type === "HardhatContract"; -} - -export function isArtifactContract( - node: DeploymentGraphVertex -): node is ArtifactContractDeploymentVertex { - return node.type === "ArtifactContract"; -} - -export function isDeployedContract( - node: DeploymentGraphVertex -): node is DeployedContractDeploymentVertex { - return node.type === "DeployedContract"; -} - -export function isCall( - node: DeploymentGraphVertex -): node is CallDeploymentVertex { - return node.type === "Call"; -} - -export function isStaticCall( - node: DeploymentGraphVertex -): node is StaticCallDeploymentVertex { - return node.type === "StaticCall"; -} - -export function isAwaitedEvent( - node: DeploymentGraphVertex -): node is EventVertex { - return node.type === "Event"; -} - -export function isHardhatLibrary( - node: DeploymentGraphVertex -): node is HardhatLibraryDeploymentVertex { - return node.type === "HardhatLibrary"; -} - -export function isArtifactLibrary( - node: DeploymentGraphVertex -): node is ArtifactLibraryDeploymentVertex { - return node.type === "ArtifactLibrary"; -} - -export function isFuture(possible: {}): possible is DeploymentGraphFuture { - return ( - possible !== undefined && - possible !== null && - typeof possible === "object" && - "_future" in possible - ); -} - -export function isDependable(possible: any): possible is DependableFuture { - return ( - isFuture(possible) && - (possible.type === "call" || - possible.type === "static-call" || - possible.type === "contract" || - possible.type === "library" || - possible.type === "virtual" || - possible.type === "await" || - possible.type === "proxy" || - possible.type === "send") - ); -} - -export function isProxy(possible: any): possible is ProxyFuture { - return isFuture(possible) && possible.type === "proxy"; -} - -export function isVirtual(possible: any): possible is Virtual { - return isFuture(possible) && possible.type === "virtual"; -} - -export function isEventParam(possible: any): possible is EventParamFuture { - return isFuture(possible) && possible.type === "eventParam"; -} - -export function isStaticCallFuture( - possible: any -): possible is StaticContractCall { - return isFuture(possible) && possible.type === "static-call"; -} - -export function isParameter( - future: DeploymentGraphFuture -): future is RequiredParameter | OptionalParameter { - return future.type === "parameter"; -} - -export function isContract( - future: DeploymentGraphFuture -): future is ContractFutureOld { - if (isProxy(future)) { - return isContract(future.value); - } - - return future.type === "contract"; -} - -export function isLibrary( - future: DeploymentGraphFuture -): future is ContractFutureOld { - if (isProxy(future)) { - return isLibrary(future.value); - } - - return future.type === "library"; -} - -export function assertModuleReturnTypes(moduleResult: T) { - for (const future of Object.values(moduleResult)) { - if (isContract(future) || isLibrary(future)) { - continue; - } - - throw new IgnitionError( - `Cannot return Future of type "${future.type}" from a module` - ); - } -} diff --git a/packages/core/src/internal/utils/networkNames.ts b/packages/core/src/internal/utils/networkNames.ts deleted file mode 100644 index 74d6e7a174..0000000000 --- a/packages/core/src/internal/utils/networkNames.ts +++ /dev/null @@ -1,36 +0,0 @@ -type NetworkNamesMap = Record; - -export const networkNameByChainId: NetworkNamesMap = { - 1: "mainnet", - 3: "ropsten", - 4: "rinkeby", - 5: "goerli", - 42: "kovan", - 11155111: "sepolia", - 56: "bsc", - 97: "bscTestnet", - 128: "heco", - 256: "hecoTestnet", - 250: "opera", - 4002: "ftmTestnet", - 10: "optimisticEthereum", - 420: "optimisticGoerli", - 137: "polygon", - 80001: "polygonMumbai", - 42161: "arbitrumOne", - 421613: "arbitrumGoerli", - 421611: "arbitrumTestnet", - 43114: "avalanche", - 43113: "avalancheFujiTestnet", - 1284: "moonbeam", - 1285: "moonriver", - 1287: "moonbaseAlpha", - 100: "gnosis", - 10200: "chiado", - 77: "sokol", - 1313161554: "aurora", - 1313161555: "auroraTestnet", - 1666600000: "harmony", - 1666700000: "harmonyTest", - 31337: "hardhat", -}; diff --git a/packages/core/src/internal/utils/paramAssertions.ts b/packages/core/src/internal/utils/paramAssertions.ts deleted file mode 100644 index c11a8bc3b9..0000000000 --- a/packages/core/src/internal/utils/paramAssertions.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { BigNumber } from "ethers"; - -import { IgnitionError } from "../../errors"; - -export function assertStringParam(param: any, paramName: string) { - if (typeof param !== "string") { - throw new IgnitionError(`\`${paramName}\` must be a string`); - } -} - -export function assertFunctionParam(param: any, paramName: string) { - if (typeof param !== "function") { - throw new IgnitionError(`\`${paramName}\` must be a function`); - } -} - -export function assertBigNumberParam(param: any, paramName: string) { - if (param !== undefined) { - if (!BigNumber.isBigNumber(param)) { - throw new IgnitionError(`\`${paramName}\` must be a BigNumber`); - } - } -} diff --git a/packages/core/src/internal/utils/process-results.ts b/packages/core/src/internal/utils/process-results.ts deleted file mode 100644 index c9af3f1419..0000000000 --- a/packages/core/src/internal/utils/process-results.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { - ProcessResultKind, - ProcessStepFailure, - ProcessStepResult, - ProcessStepSuccess, -} from "../../types/process"; - -export const processStepSucceeded = (result: T): ProcessStepSuccess => ({ - _kind: ProcessResultKind.SUCCESS, - result, -}); - -export const processStepFailed = ( - message: string, - failures: Error[] -): ProcessStepFailure => ({ - _kind: ProcessResultKind.FAILURE, - message, - failures, -}); - -export const processStepErrored = ( - error: unknown, - message: string -): ProcessStepFailure => { - const resolvedError = - error instanceof Error - ? error - : new Error(`Failed with unknown error ${error as any}`); - - return processStepFailed(message, [resolvedError]); -}; - -export const isFailure = ( - result: ProcessStepResult -): result is ProcessStepFailure => { - return result._kind === ProcessResultKind.FAILURE; -}; diff --git a/packages/core/src/internal/utils/proxy.ts b/packages/core/src/internal/utils/proxy.ts deleted file mode 100644 index 79c31b9265..0000000000 --- a/packages/core/src/internal/utils/proxy.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { DependableFuture, ProxyFuture } from "../../types/future"; - -import { isProxy } from "./guards"; - -export function resolveProxyDependency( - future: DependableFuture -): Exclude { - if (isProxy(future)) { - return resolveProxyDependency(future.proxy); - } - - return future; -} - -export function resolveProxyValue( - future: DependableFuture -): Exclude { - if (isProxy(future)) { - return resolveProxyValue(future.value); - } - - return future; -} diff --git a/packages/core/src/internal/utils/serialize.ts b/packages/core/src/internal/utils/serialize.ts deleted file mode 100644 index 1c70106eb2..0000000000 --- a/packages/core/src/internal/utils/serialize.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { serializeError } from "serialize-error"; - -/** - * When stringifying core state, use this as the replacer. - */ -export function serializeReplacer(_key: string, value: unknown) { - if (value instanceof Set) { - return Array.from(value).sort(); - } - - if (value instanceof Map) { - return Object.fromEntries(value); - } - - if (typeof value === "bigint") { - return `${value.toString(10)}n`; - } - - if (value instanceof Error) { - return serializeError(new Error(value.message)); - } - - if (value instanceof Object && !(value instanceof Array)) { - const obj: any = value; - return Object.keys(obj) - .sort() - .reduce((sorted: any, key) => { - sorted[key] = obj[key]; - return sorted; - }, {}); - } - - return value; -} diff --git a/packages/core/src/internal/utils/sets.ts b/packages/core/src/internal/utils/sets.ts deleted file mode 100644 index 1afb0bfbd7..0000000000 --- a/packages/core/src/internal/utils/sets.ts +++ /dev/null @@ -1,19 +0,0 @@ -export function union(setA: Set, setB: Set) { - const _union = new Set(setA); - - for (const elem of setB) { - _union.add(elem); - } - - return _union; -} - -export function difference(setA: Set, setB: Set) { - const _difference = new Set(setA); - - for (const elem of setB) { - _difference.delete(elem); - } - - return _difference; -} diff --git a/packages/core/src/internal/utils/tx-sender.ts b/packages/core/src/internal/utils/tx-sender.ts deleted file mode 100644 index 910a94f8ba..0000000000 --- a/packages/core/src/internal/utils/tx-sender.ts +++ /dev/null @@ -1,67 +0,0 @@ -import setupDebug, { IDebugger } from "debug"; -import { ethers } from "ethers"; - -import { GasProvider } from "../../types/providers"; - -/** - * Sends, replaces and keeps track of transactions. - * - * An instance of this class is created for every executor. - * Each transaction sent from that executor should go through this class. - */ -export class TxSender { - private _debug: IDebugger; - - constructor(private _gasProvider: GasProvider) { - this._debug = setupDebug(`ignition:tx-sender`); - } - - /** - * Sends `tx` using `signer`. - * - * Returns the index of the transaction in the journal and its hash. - */ - public async send( - signer: ethers.Signer, - tx: ethers.providers.TransactionRequest - ): Promise { - this._debug(`sending transaction`, [tx]); - - const sentTx = await this._send(signer, tx); - - return sentTx.hash; - } - - /** - * Sends `tx` to replace the transaction with index `txIndex`. - * - * Returns the hash of the new transaction. - */ - public async sendAndReplace( - signer: ethers.Signer, - tx: ethers.providers.TransactionRequest - ): Promise { - const sentTx = await this._send(signer, tx); - - return sentTx.hash; - } - - private async _send( - signer: ethers.Signer, - tx: ethers.providers.TransactionRequest - ): Promise { - if (tx.gasLimit === undefined) { - const gasLimit = await this._gasProvider.estimateGasLimit(tx); - - tx.gasLimit = gasLimit; - } - - if (tx.gasPrice === undefined) { - const gasPrice = await this._gasProvider.estimateGasPrice(); - - tx.gasPrice = gasPrice; - } - - return signer.sendTransaction(tx); - } -} diff --git a/packages/core/src/internal/validation/dispatch/helpers.ts b/packages/core/src/internal/validation/dispatch/helpers.ts deleted file mode 100644 index 9bd12b015c..0000000000 --- a/packages/core/src/internal/validation/dispatch/helpers.ts +++ /dev/null @@ -1,64 +0,0 @@ -import type { Services } from "../../types/services"; - -import { IgnitionError } from "../../../errors"; -import { ContractFutureOld } from "../../../types/future"; -import { CallPoints, DeploymentGraphVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum, VertexVisitResultFailure } from "../../types/graph"; -import { resolveProxyValue } from "../../utils/proxy"; - -export async function resolveArtifactForContractFuture( - givenFuture: ContractFutureOld, - { services }: { services: Services } -): Promise { - const future = resolveProxyValue(givenFuture); - - switch (future.type) { - case "contract": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "deployed": - return future.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.contractName - ); - return artifact.abi; - } - case "library": - switch (future.subtype) { - case "artifact": - return future.artifact.abi; - case "hardhat": - const artifact = await services.artifacts.getArtifact( - future.libraryName - ); - return artifact.abi; - } - case "virtual": - throw new IgnitionError(`Cannot call virtual future`); - case "call": - throw new IgnitionError(`Cannot call call future`); - case "static-call": - throw new IgnitionError(`Cannot call static-call future`); - case "await": - throw new IgnitionError(`Cannot call await future`); - case "send": - throw new IgnitionError(`Cannot call send future`); - } -} - -export function buildValidationError( - vertex: DeploymentGraphVertex, - message: string, - callPoints: CallPoints -): VertexVisitResultFailure { - const failure = callPoints[vertex.id] ?? new IgnitionError("-"); - - failure.message = message; - - return { - _kind: VertexResultEnum.FAILURE, - failure, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts b/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts deleted file mode 100644 index fb01b620a3..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateArtifactContract.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { ethers, BigNumber } from "ethers"; - -import { ArtifactContractDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; -import { isArtifact, isParameter } from "../../utils/guards"; - -import { buildValidationError } from "./helpers"; - -export async function validateArtifactContract( - vertex: ArtifactContractDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - { callPoints }: ValidationDispatchContext -): Promise { - if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return buildValidationError( - vertex, - `For contract 'value' must be a BigNumber`, - callPoints - ); - } - - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For contract 'from' must be a valid address string`, - callPoints - ); - } - - const artifactExists = isArtifact(vertex.artifact); - - if (!artifactExists) { - return buildValidationError( - vertex, - `Artifact with name '${vertex.label}' doesn't exist`, - callPoints - ); - } - - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(vertex.artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return buildValidationError( - vertex, - `The constructor of the contract '${vertex.label}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts b/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts deleted file mode 100644 index 7a28b6cea5..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateArtifactLibrary.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ethers } from "ethers"; - -import { ArtifactLibraryDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; -import { isArtifact } from "../../utils/guards"; - -import { buildValidationError } from "./helpers"; - -export async function validateArtifactLibrary( - vertex: ArtifactLibraryDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - context: ValidationDispatchContext -): Promise { - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For library 'from' must be a valid address string`, - context.callPoints - ); - } - - const artifactExists = isArtifact(vertex.artifact); - - if (!artifactExists) { - return buildValidationError( - vertex, - `Artifact not provided for library '${vertex.label}'`, - context.callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateCall.ts b/packages/core/src/internal/validation/dispatch/validateCall.ts deleted file mode 100644 index 0211383f88..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateCall.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { ethers, BigNumber } from "ethers"; - -import { CallDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; -import { isParameter } from "../../utils/guards"; - -import { - buildValidationError, - resolveArtifactForContractFuture, -} from "./helpers"; - -export async function validateCall( - vertex: CallDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - context: ValidationDispatchContext -): Promise { - if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return buildValidationError( - vertex, - `For call 'value' must be a BigNumber`, - context.callPoints - ); - } - - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For call 'from' must be a valid address string`, - context.callPoints - ); - } - - const contractName = vertex.contract.label; - - const artifactAbi = await resolveArtifactForContractFuture( - vertex.contract, - context - ); - - if (artifactAbi === undefined) { - return buildValidationError( - vertex, - `Artifact with name '${contractName}' doesn't exist`, - context.callPoints - ); - } - - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(artifactAbi); - - const funcs = Object.entries(iface.functions) - .filter(([fname]) => fname === vertex.method) - .map(([, fragment]) => fragment); - - const functionFragments = iface.fragments - .filter((frag) => frag.name === vertex.method) - .concat(funcs); - - if (functionFragments.length === 0) { - return buildValidationError( - vertex, - `Contract '${contractName}' doesn't have a function ${vertex.method}`, - context.callPoints - ); - } - - const matchingFunctionFragments = functionFragments.filter( - (f) => f.inputs.length === argsLength - ); - - if (matchingFunctionFragments.length === 0) { - if (functionFragments.length === 1) { - return buildValidationError( - vertex, - `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, - context.callPoints - ); - } else { - return buildValidationError( - vertex, - `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, - context.callPoints - ); - } - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateDeployedContract.ts b/packages/core/src/internal/validation/dispatch/validateDeployedContract.ts deleted file mode 100644 index 691cbcbbc5..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateDeployedContract.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { isAddress } from "@ethersproject/address"; - -import { DeployedContractDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -import { buildValidationError } from "./helpers"; - -export async function validateDeployedContract( - vertex: DeployedContractDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - { callPoints }: ValidationDispatchContext -): Promise { - if (typeof vertex.address === "string" && !isAddress(vertex.address)) { - return buildValidationError( - vertex, - `The existing contract ${vertex.label} has an invalid address ${vertex.address}`, - callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateEvent.ts b/packages/core/src/internal/validation/dispatch/validateEvent.ts deleted file mode 100644 index 9d8e73f9fa..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateEvent.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { ethers } from "ethers"; - -import { EventVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -import { - buildValidationError, - resolveArtifactForContractFuture, -} from "./helpers"; - -export async function validateEvent( - vertex: EventVertex, - _resultAccumulator: ValidationResultsAccumulator, - { callPoints, services }: ValidationDispatchContext -): Promise { - let artifactAbi: any[] | undefined; - if (typeof vertex.address === "string") { - if (!ethers.utils.isAddress(vertex.address)) { - return buildValidationError( - vertex, - `Invalid address ${vertex.address}`, - callPoints - ); - } - - artifactAbi = vertex.abi; - } else if (vertex.address.type === "contract") { - artifactAbi = await resolveArtifactForContractFuture(vertex.address, { - services, - }); - - if (artifactAbi === undefined) { - return buildValidationError( - vertex, - `Contract with name '${vertex.address.label}' doesn't exist`, - callPoints - ); - } - } - - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(artifactAbi ?? vertex.abi); - - const events = Object.entries(iface.events) - .filter(([fname]) => fname === vertex.event) - .map(([, fragment]) => fragment); - - const eventFragments = iface.fragments - .filter((frag) => frag.name === vertex.event) - .concat(events); - - if (eventFragments.length === 0) { - const contractName = vertex.label.split("/")[0]; - - return buildValidationError( - vertex, - `Contract '${contractName}' doesn't have an event ${vertex.event}`, - callPoints - ); - } - - const matchingEventFragments = eventFragments.filter( - (f) => f.inputs.length >= argsLength - ); - - if (matchingEventFragments.length === 0) { - if (eventFragments.length === 1) { - const contractName = vertex.label.split("/")[0]; - - return buildValidationError( - vertex, - `Event ${vertex.event} in contract ${contractName} expects ${eventFragments[0].inputs.length} arguments but ${argsLength} were given`, - callPoints - ); - } else { - return buildValidationError( - vertex, - `Event ${vertex.event} in contract is overloaded, but no overload expects ${argsLength} arguments`, - callPoints - ); - } - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts b/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts deleted file mode 100644 index 1f573778cb..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateHardhatContract.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { ethers, BigNumber } from "ethers"; - -import { HardhatContractDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; -import { isParameter } from "../../utils/guards"; - -import { buildValidationError } from "./helpers"; - -export async function validateHardhatContract( - vertex: HardhatContractDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - { services, callPoints }: ValidationDispatchContext -): Promise { - if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return buildValidationError( - vertex, - `For contract 'value' must be a BigNumber`, - callPoints - ); - } - - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For contract 'from' must be a valid address string`, - callPoints - ); - } - - const artifactExists = await services.artifacts.hasArtifact( - vertex.contractName - ); - - if (!artifactExists) { - return buildValidationError( - vertex, - `Contract with name '${vertex.contractName}' doesn't exist`, - callPoints - ); - } - - const artifact = await services.artifacts.getArtifact(vertex.contractName); - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(artifact.abi); - const expectedArgsLength = iface.deploy.inputs.length; - - if (argsLength !== expectedArgsLength) { - return buildValidationError( - vertex, - `The constructor of the contract '${vertex.contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given`, - callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts b/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts deleted file mode 100644 index 939b7d5b2b..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateHardhatLibrary.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ethers } from "ethers"; - -import { HardhatLibraryDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -import { buildValidationError } from "./helpers"; - -export async function validateHardhatLibrary( - vertex: HardhatLibraryDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - { callPoints, services }: ValidationDispatchContext -): Promise { - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For library 'from' must be a valid address string`, - callPoints - ); - } - - const artifactExists = await services.artifacts.hasArtifact( - vertex.libraryName - ); - - if (!artifactExists) { - return buildValidationError( - vertex, - `Library with name '${vertex.libraryName}' doesn't exist`, - callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateSendETH.ts b/packages/core/src/internal/validation/dispatch/validateSendETH.ts deleted file mode 100644 index fc641f711d..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateSendETH.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { ethers, BigNumber } from "ethers"; - -import { SendVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; -import { isParameter } from "../../utils/guards"; - -import { buildValidationError } from "./helpers"; - -export async function validateSendETH( - vertex: SendVertex, - _resultAccumulator: ValidationResultsAccumulator, - { callPoints }: ValidationDispatchContext -): Promise { - if (!BigNumber.isBigNumber(vertex.value) && !isParameter(vertex.value)) { - return buildValidationError( - vertex, - `For send 'value' must be a BigNumber`, - callPoints - ); - } - - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For send 'from' must be a valid address string`, - callPoints - ); - } - - if ( - typeof vertex.address === "string" && - !ethers.utils.isAddress(vertex.address) - ) { - return buildValidationError( - vertex, - `"${vertex.address}" is not a valid address`, - callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateStaticCall.ts b/packages/core/src/internal/validation/dispatch/validateStaticCall.ts deleted file mode 100644 index 179f3f8174..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateStaticCall.ts +++ /dev/null @@ -1,99 +0,0 @@ -import { ethers } from "ethers"; - -import { StaticCallDeploymentVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -import { - buildValidationError, - resolveArtifactForContractFuture, -} from "./helpers"; - -export async function validateStaticCall( - vertex: StaticCallDeploymentVertex, - _resultAccumulator: ValidationResultsAccumulator, - context: ValidationDispatchContext -): Promise { - if (!ethers.utils.isAddress(vertex.from)) { - return buildValidationError( - vertex, - `For static call 'from' must be a valid address string`, - context.callPoints - ); - } - - const contractName = vertex.contract.label; - - const artifactAbi = await resolveArtifactForContractFuture( - vertex.contract, - context - ); - - if (artifactAbi === undefined) { - return buildValidationError( - vertex, - `Artifact with name '${contractName}' doesn't exist`, - context.callPoints - ); - } - - const argsLength = vertex.args.length; - - const iface = new ethers.utils.Interface(artifactAbi); - - const funcs = Object.entries(iface.functions) - .filter(([fname]) => fname === vertex.method) - .map(([, fragment]) => fragment); - - const functionFragments = iface.fragments - .filter((frag) => frag.name === vertex.method) - .concat(funcs); - - if (functionFragments.length === 0) { - return buildValidationError( - vertex, - `Contract '${contractName}' doesn't have a function ${vertex.method}`, - context.callPoints - ); - } - - const matchingFunctionFragments = functionFragments.filter( - (f) => f.inputs.length === argsLength - ); - - if (matchingFunctionFragments.length === 0) { - if (functionFragments.length === 1) { - return buildValidationError( - vertex, - `Function ${vertex.method} in contract ${contractName} expects ${functionFragments[0].inputs.length} arguments but ${argsLength} were given`, - context.callPoints - ); - } else { - return buildValidationError( - vertex, - `Function ${vertex.method} in contract ${contractName} is overloaded, but no overload expects ${argsLength} arguments`, - context.callPoints - ); - } - } - - const funcFrag = - matchingFunctionFragments[0] as ethers.utils.FunctionFragment; - - if (!funcFrag.constant) { - return buildValidationError( - vertex, - `Function ${vertex.method} in contract ${contractName} is not 'pure' or 'view' and cannot be statically called`, - context.callPoints - ); - } - - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validateVirtual.ts b/packages/core/src/internal/validation/dispatch/validateVirtual.ts deleted file mode 100644 index 2dee5b0fa5..0000000000 --- a/packages/core/src/internal/validation/dispatch/validateVirtual.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { DeploymentGraphVertex } from "../../types/deploymentGraph"; -import { VertexResultEnum } from "../../types/graph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -export async function validateVirtual( - _deploymentVertex: DeploymentGraphVertex, - _resultAccumulator: ValidationResultsAccumulator, - _context: ValidationDispatchContext -): Promise { - return { - _kind: VertexResultEnum.SUCCESS, - result: undefined, - }; -} diff --git a/packages/core/src/internal/validation/dispatch/validationDispatch.ts b/packages/core/src/internal/validation/dispatch/validationDispatch.ts deleted file mode 100644 index 15e963aaeb..0000000000 --- a/packages/core/src/internal/validation/dispatch/validationDispatch.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { DeploymentGraphVertex } from "../../types/deploymentGraph"; -import { - ValidationDispatchContext, - ValidationResultsAccumulator, - ValidationVertexVisitResult, -} from "../../types/validation"; - -import { validateArtifactContract } from "./validateArtifactContract"; -import { validateArtifactLibrary } from "./validateArtifactLibrary"; -import { validateCall } from "./validateCall"; -import { validateDeployedContract } from "./validateDeployedContract"; -import { validateEvent } from "./validateEvent"; -import { validateHardhatContract } from "./validateHardhatContract"; -import { validateHardhatLibrary } from "./validateHardhatLibrary"; -import { validateSendETH } from "./validateSendETH"; -import { validateStaticCall } from "./validateStaticCall"; -import { validateVirtual } from "./validateVirtual"; - -export function validationDispatch( - deploymentVertex: DeploymentGraphVertex, - resultAccumulator: ValidationResultsAccumulator, - context: ValidationDispatchContext -): Promise { - switch (deploymentVertex.type) { - case "ArtifactContract": - return validateArtifactContract( - deploymentVertex, - resultAccumulator, - context - ); - case "ArtifactLibrary": - return validateArtifactLibrary( - deploymentVertex, - resultAccumulator, - context - ); - case "DeployedContract": - return validateDeployedContract( - deploymentVertex, - resultAccumulator, - context - ); - case "Call": - return validateCall(deploymentVertex, resultAccumulator, context); - case "StaticCall": - return validateStaticCall(deploymentVertex, resultAccumulator, context); - case "HardhatLibrary": - return validateHardhatLibrary( - deploymentVertex, - resultAccumulator, - context - ); - case "HardhatContract": - return validateHardhatContract( - deploymentVertex, - resultAccumulator, - context - ); - case "Virtual": - return validateVirtual(deploymentVertex, resultAccumulator, context); - case "Event": - return validateEvent(deploymentVertex, resultAccumulator, context); - case "SendETH": - return validateSendETH(deploymentVertex, resultAccumulator, context); - } -} diff --git a/packages/core/src/internal/validation/validateDeploymentGraph.ts b/packages/core/src/internal/validation/validateDeploymentGraph.ts deleted file mode 100644 index 4323363b3e..0000000000 --- a/packages/core/src/internal/validation/validateDeploymentGraph.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { IgnitionError } from "../../errors"; -import { ProcessStepResult } from "../../types/process"; -import { getSortedVertexIdsFrom } from "../graph/utils"; -import { visit } from "../graph/visit"; -import { CallPoints, IDeploymentGraph } from "../types/deploymentGraph"; -import { ResultsAccumulator, VisitResultState } from "../types/graph"; -import { Services } from "../types/services"; -import { - processStepErrored, - processStepFailed, - processStepSucceeded, -} from "../utils/process-results"; - -import { validationDispatch } from "./dispatch/validationDispatch"; - -export async function validateDeploymentGraph( - deploymentGraph: IDeploymentGraph, - callPoints: CallPoints, - services: Services -): Promise>> { - try { - const orderedVertexIds = getSortedVertexIdsFrom(deploymentGraph); - - const visitResult = await visit( - "Validation", - orderedVertexIds, - deploymentGraph, - { services, callPoints }, - new Map(), - validationDispatch - ); - - switch (visitResult._kind) { - case VisitResultState.SUCCESS: - return processStepSucceeded(visitResult.result); - case VisitResultState.FAILURE: - return processStepFailed("Validation failed", visitResult.failures[1]); - case VisitResultState.HOLD: - throw new IgnitionError("Holds not exepected in validation"); - } - } catch (err) { - return processStepErrored(err, "Validation failed"); - } -} diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index d56daa6793..34c66e947d 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -5,7 +5,6 @@ import sortBy from "lodash/sortBy"; import uniq from "lodash/uniq"; import { IgnitionError } from "../../../errors"; -import { sleep } from "../../../internal/utils/sleep"; import { isFutureThatSubmitsOnchainTransaction, isModuleParameterRuntimeValue, @@ -63,6 +62,7 @@ import { resolveFutureToValue, } from "../utils/resolve-futures"; import { resolveModuleParameter } from "../utils/resolve-module-parameter"; +import { sleep } from "../utils/sleep"; import { executionStateReducer } from "./execution-state-reducer"; import { ExecutionStategyCycler } from "./execution-strategy-cycler"; diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index 8f591a86a8..d6fdc0793b 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -1,7 +1,7 @@ import { ethers } from "ethers"; import { IgnitionError } from "../../../errors"; -import { serializeReplacer } from "../../../helpers"; + import { CallFunctionInteractionMessage, DeployContractInteractionMessage, @@ -40,6 +40,7 @@ import { import { assertIgnitionInvariant } from "../utils/assertions"; import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; +import { serializeReplacer } from "../journal/utils/serialize-replacer"; import { isCallFunctionInteraction, isContractAtInteraction, diff --git a/packages/core/src/internal/utils/sleep.ts b/packages/core/src/new-api/internal/utils/sleep.ts similarity index 100% rename from packages/core/src/internal/utils/sleep.ts rename to packages/core/src/new-api/internal/utils/sleep.ts diff --git a/packages/core/src/soon-to-be-removed.ts b/packages/core/src/soon-to-be-removed.ts deleted file mode 100644 index a2b5a5bdaf..0000000000 --- a/packages/core/src/soon-to-be-removed.ts +++ /dev/null @@ -1,36 +0,0 @@ -// WARNING: Do not import anything from here. These things are meant to be -// internal or replaced soon, and will be removed from the public API ASAP. -// Consider yourself warned. - -import { IDeploymentGraph } from "./internal/types/deploymentGraph"; -import { IExecutionGraph } from "./internal/types/executionGraph"; - -export { - DeploymentResultState, - DeploymentResult, - DeployStateExecutionCommand, - DeployState, - DeployPhase, - UpdateUiAction, -} from "./internal/types/deployment"; -export { - DeploymentGraphVertex, - IDeploymentGraph, -} from "./internal/types/deploymentGraph"; -export { - ExecutionVertex, - ExecutionVertexType, - IExecutionGraph, -} from "./internal/types/executionGraph"; -export { - VertexResultEnum, - VertexVisitResultFailure, - VertexDescriptor, - VertexGraph, -} from "./internal/types/graph"; -export { ICommandJournal } from "./internal/types/journal"; - -export interface LegacyIgnitionPlan { - deploymentGraph: IDeploymentGraph; - executionGraph: IExecutionGraph; -} diff --git a/packages/core/src/types/dsl.ts b/packages/core/src/types/dsl.ts deleted file mode 100644 index 3a287f7ce7..0000000000 --- a/packages/core/src/types/dsl.ts +++ /dev/null @@ -1,317 +0,0 @@ -import { BigNumber } from "ethers"; - -import { - AddressResolvable, - ArtifactContract, - ArtifactLibrary, - ContractCall, - DeployedContract, - DeploymentGraphFuture, - EventFuture, - EventParamFuture, - HardhatContract, - HardhatLibrary, - OptionalParameter, - ParameterFuture, - ParameterValue, - RequiredParameter, - SendFuture, - StaticContractCall, - Virtual, -} from "./future"; -import { ArtifactOld } from "./hardhat"; -import { Module, ModuleDict } from "./module"; - -/** - * A builder object for specifying the different parts and - * dependencies of your deployment. - * - * @alpha - */ - -export interface IDeploymentBuilder { - /** - * The `chainId` of the network being deployed to. - */ - chainId: number; - - /** - * The Hardhat accounts as defined in the `Hardhat.config.{js,ts}` file, - * deployment actions can leverage these accounts to specify which - * account the on-chain transaction that underlies the action will - * execute under. - */ - accounts: string[]; - - /** - * Call a contract method. - * - * @param contractFuture - A contract future - * @param functionName - the name of the method to be invoked - * @param options - The options to control the method invocation. - * - * @alpha - */ - call( - contractFuture: DeploymentGraphFuture, - functionName: string, - options: CallOptionsOld - ): ContractCall; - - /** - * Statically call a contract method. - * - * @param contractFuture - A contract future - * @param functionName - the name of the read-only method to be called - * @param options - The options to control the method invocation. - * - * @alpha - */ - staticCall( - contractFuture: DeploymentGraphFuture, - functionName: string, - options: StaticCallOptionsOld - ): StaticContractCall; - - /** - * Deploy a named contract from Hardhat's contracts folder. - * - * @param contractName - The name of the contract to deploy - * @param options - The options for controlling the deployment of the contract - * - * @alpha - */ - contract(contractName: string, options?: ContractOptionsOld): HardhatContract; - - /** - * Deploy a contract based on an artifact. - * - * @param contractName - The label to use for the given contract in logs, - * errors and UI - * @param artifact - The artifact containing the contract data (i.e. bytecode, - * abi etc) - * @param options - The options for controlling the deployment of the contract - * - * @alpha - */ - contract( - contractName: string, - artifact: ArtifactOld, - options?: ContractOptionsOld - ): ArtifactContract; - - /** - * Refer to an existing deployed smart contract, the reference can be passed - * to subsequent actions. - * - * @param contractName - The label to use for the given contract in logs, - * errors and UI - * @param address - the Ethereum address of the contract - * @param abi - The contract's Application Binary Interface (ABI) - * @param options - The options for controlling the use of the deployed - * contract - * - * @alpha - */ - contractAt( - contractName: string, - address: string | EventParamFuture, - abi: any[], - options?: { after?: DeploymentGraphFuture[] } - ): DeployedContract; - - /** - * Wait for a contract to emit an event, then continue with the deployment - * passing any returned arguments onto subsequent actions. - * - * @param contractFuture - The contract future where the event will originate - * @param eventName - The name of the event to wait on - * @param options - The options to control the wait for the event - * - * @alpha - */ - event( - contractFuture: DeploymentGraphFuture, - eventName: string, - options: AwaitOptions - ): EventFuture; - - /** - * Retreive an artifact for the named contract or library within Hardhat's - * contracts folder. - * - * @param contractName - The name of the contract or library to retrieve - * the artifact for - * @returns The artifact for the contract or library - */ - getArtifact(contractName: string): ArtifactOld; - - /** - * Get the value of a named parameter that _can_ be passed into the currently - * scoped Module. If the Module does not receive the parameter then the - * default value will be used instead. - * - * @param paramName - The parameter name - * @param defaultValue - The default value to use if no parameter with the - * given name is provided to the module currently in scops. - * - * @alpha - */ - getOptionalParam( - paramName: string, - defaultValue: ParameterValue - ): OptionalParameter; - - /** - * Get the value of a named parameter that _must_ be passed into the currently - * scoped Module. - * - * @param paramName - The parameter name - * - * @alpha - */ - getParam(paramName: string): RequiredParameter; - - /** - * Deploy a named library from Hardhat's contracts folder. - * - * @param libraryName - The name of the library to deploy - * @param options - The options to control the deployment of the library - * - * @alpha - */ - library(libraryName: string, options?: ContractOptionsOld): HardhatLibrary; - /** - * Deploy a library based on an artifact. - * - * @param libraryName - The label to use for the given library in logs, - * errors and UI - * @param artifact - The artifact containing the library;s data (i.e. - * bytecode, abi etc) - * @param options - The options to control the deployment of the library - */ - library( - libraryName: string, - artifact: ArtifactOld, - options?: ContractOptionsOld - ): ArtifactLibrary; - - /** - * Transfer ETH to an externally owned account or contract based on address. - * - * @param sendTo - The Ethereum address to send the ETH to - * @param options - The options to control the send - * - * @alpha - */ - sendETH(sendTo: AddressResolvable, options: SendOptions): SendFuture; - - /** - * Deploy a module from within the current module. - * - * @param module - The Ignition module to be deployed - * @param options - The options that control the running of the submodule - * @returns A results object that is both a future that can be depended on, - * representing the completion of everything within the submodule, - * and contains the contract futures of any contracts or libraries deployed. - * - * @alpha - */ - useModule( - module: Module, - options?: UseModuleOptions - ): Virtual & T; -} - -/** - * The options for an await action. - * - * @alpha - */ -export interface AwaitOptions { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; -} - -/** - * The options for a smart contract method call. - * - * @alpha - */ -export interface CallOptionsOld { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; - value?: BigNumber | ParameterFuture; - from?: string; -} - -/** - * The options for a smart contract stati call. - * - * @alpha - */ -export interface StaticCallOptionsOld { - args: InternalParamValue[]; - after?: DeploymentGraphFuture[]; - from?: string; -} - -/** - * The options for a Contract deploy. - * - * @alpha - */ -export interface ContractOptionsOld { - args?: InternalParamValue[]; - libraries?: { - [key: string]: DeploymentGraphFuture; - }; - after?: DeploymentGraphFuture[]; - value?: BigNumber | ParameterFuture; - from?: string; -} - -/** - * The options for sending ETH to an address/contract. - * - * @alpha - */ -export interface SendOptions { - value: BigNumber | ParameterFuture; - after?: DeploymentGraphFuture[]; - from?: string; -} - -/** - * The options when using a module within another module. - * - * @alpha - */ -export interface UseModuleOptions { - parameters?: { [key: string]: number | string | DeploymentGraphFuture }; - after?: DeploymentGraphFuture[]; -} - -/** - * Paramater value types - * - * @alpha - */ -export type BaseArgumentTypeOld = number | BigNumber | string | boolean; - -/** - * Allowed parameters that can be passed into a module. - * - * @alpha - */ -export type ExternalParamValue = - | BaseArgumentTypeOld - | ExternalParamValue[] - | { [field: string]: ExternalParamValue }; - -/** - * Allowed parameters across internal `useModule` boundaries. - * - * @alpha - */ -export type InternalParamValue = ExternalParamValue | DeploymentGraphFuture; diff --git a/packages/core/src/types/future.ts b/packages/core/src/types/future.ts deleted file mode 100644 index ae855d47b7..0000000000 --- a/packages/core/src/types/future.ts +++ /dev/null @@ -1,284 +0,0 @@ -import type { ArtifactOld } from "./hardhat"; - -/** - * A future representing the address of a contract deployed using the - * Hardhat Artifact system. - * - * @alpha - */ -export interface HardhatContract { - vertexId: number; - label: string; - type: "contract"; - subtype: "hardhat"; - contractName: string; - _future: true; -} - -/** - * A future representing the value of a contract deployed using a given - * artifact. - * - * @alpha - */ -export interface ArtifactContract { - vertexId: number; - label: string; - type: "contract"; - subtype: "artifact"; - artifact: ArtifactOld; - _future: true; -} - -/** - * A future representing the address of an already deployed contract. - * - * @alpha - */ -export interface DeployedContract { - vertexId: number; - label: string; - type: "contract"; - subtype: "deployed"; - abi: any[]; - address: string | EventParamFuture; - _future: true; -} - -/** - * A future representing the address of a library deployed using Hardhat's - * artifact system. - * - * @alpha - */ -export interface HardhatLibrary { - vertexId: number; - label: string; - type: "library"; - subtype: "hardhat"; - libraryName: string; - _future: true; -} - -/** - * A future representing the address of a library deployed using a given - * artifact. - * - * @alpha - */ -export interface ArtifactLibrary { - vertexId: number; - label: string; - type: "library"; - subtype: "artifact"; - artifact: ArtifactOld; - _future: true; -} - -/** - * A future representing an on-chain smart contract method invocation. - * - * @alpha - */ -export interface ContractCall { - vertexId: number; - label: string; - type: "call"; - _future: true; -} - -/** - * A future representing a retrieval of data from statically calling an on-chain smart contract method. - * - * @alpha - */ -export interface StaticContractCall { - vertexId: number; - label: string; - type: "static-call"; - _future: true; -} - -/** - * A future representing an on-chain Ethereum event. - * - * @alpha - */ -export interface EventFuture { - vertexId: number; - label: string; - type: "await"; - subtype: "event"; - _future: true; - params: EventParams; -} - -/** - * A future representing the sending of Eth to a contract/address. - * - * @alpha - */ -export interface SendFuture { - vertexId: number; - label: string; - type: "send"; - subtype: "eth"; - _future: true; -} - -/** - * A mapping of named parameter labels to future parameter values. - * - * @alpha - */ -export interface EventParams { - [eventParam: string]: EventParamFuture; -} - -/** - * A future representing a parameter of an on-chain Ethereum event. - * - * @alpha - */ -export interface EventParamFuture { - vertexId: number; - label: string; - type: "eventParam"; - subtype: string; - _future: true; -} - -/** - * A value that can be used as a Module parameter. - * - * @alpha - */ -export type ParameterValue = string | number | DeploymentGraphFuture; - -/** - * A future representing a parameter value that _must_ be provided to the module - * for it to execute. - * - * @alpha - */ -export interface RequiredParameter { - label: string; - type: "parameter"; - subtype: "required"; - scope: string; - _future: true; -} - -/** - * A future representing a parameter value that _may_ be provided to the module - * for it to execute. In its absence the `defaultValue` will be used. - * - * @alpha - */ -export interface OptionalParameter { - label: string; - type: "parameter"; - subtype: "optional"; - defaultValue: ParameterValue; - scope: string; - _future: true; -} - -/** - * A future representing a virtual node used for grouping other actions. - * - * @alpha - */ -export interface Virtual { - vertexId: number; - label: string; - type: "virtual"; - _future: true; -} - -/** - * A future that allows the splitting of dependency from value resolution. - * A proxy can stand for the value of another future, but point its - * dependency (the proxy) on a different. - * - * This allows the wrapping of a returned Contract future so that a - * dependency on it can be made to depend on the Virtual vertex that - * represents the entire submodule. - * - * @alpha - */ -export interface ProxyFuture { - label: string; - type: "proxy"; - proxy: DependableFuture; - value: DependableFuture; - _future: true; -} - -/** - * A future representing the address of a deployed Contract. - * - * @alpha - */ -export type ContractFutureOld = - | HardhatContract - | ArtifactContract - | DeployedContract; - -/** - * The future representing the address of a deployed library. - * - * @alpha - */ -export type LibraryFuture = HardhatLibrary | ArtifactLibrary; - -/** - * The future representing the value of calling a smart contract method. - * - * @alpha - */ -export type CallableFuture = ContractFutureOld | LibraryFuture; - -/** - * A future value from an on-chain action that. - * - * @alpha - */ -export type DependableFuture = - | ContractFutureOld - | LibraryFuture - | ContractCall - | StaticContractCall - | Virtual - | ProxyFuture - | EventFuture - | SendFuture; - -/** - * A future value representing an Ethereum address. - * - * @alpha - */ -export type AddressResolvable = - | string - | ParameterFuture - | EventParamFuture - | ContractFutureOld; - -/** - * The future value of a passed parameter to a Module. - * - * @alpha - */ -export type ParameterFuture = RequiredParameter | OptionalParameter; - -/** - * The future values usable within the Module api. - * - * @alpha - */ -export type DeploymentGraphFuture = - | DependableFuture - | ParameterFuture - | EventParamFuture - | StaticContractCall; diff --git a/packages/core/src/types/hardhat.ts b/packages/core/src/types/hardhat.ts deleted file mode 100644 index 0d6aae468c..0000000000 --- a/packages/core/src/types/hardhat.ts +++ /dev/null @@ -1,14 +0,0 @@ -/** - * An compilation artifact representing a smart contract. - * - * @alpha - */ -export interface ArtifactOld { - contractName: string; - bytecode: string; - abi: any[]; - linkReferences: Record< - string, - Record> - >; -} diff --git a/packages/core/src/types/ignition.ts b/packages/core/src/types/ignition.ts deleted file mode 100644 index d11eea3cee..0000000000 --- a/packages/core/src/types/ignition.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { BigNumber } from "ethers"; - -import { ModuleInfoData } from "./info"; -import { Module, ModuleDict } from "./module"; -import { IgnitionPlan } from "./plan"; - -/** - * The type of the CommandJournal that Ignition uses. - * - * @alpha - */ -export type ICommandJournalT = unknown; - -/** - * The type of a callback to update the UI. - * - * @alpha - */ -export type UpdateUiActionT = unknown; - -/** - * The configuration options that control how on-chain execution will happen - * during the deploy. - * - * @alpha - */ -export interface IgnitionDeployOptions { - txPollingInterval: number; - networkName: string; - maxRetries: number; - gasPriceIncrementPerRetry: BigNumber | null; - pollingInterval: number; - eventDuration: number; - force: boolean; -} - -/** - * The result of a deployment operation. - * - * @alpha - */ -export type DeploymentResultT = // eslint-disable-line @typescript-eslint/no-unused-vars - unknown; - -/** - * Ignition's main interface. - * - * @alpha - */ -export interface Ignition { - /** - * Run a deployment based on a given Ignition module on-chain, - * leveraging any configured journal to record. - * - * @param ignitionModule - An Ignition module - * @param options - Configuration options - * @returns A struct indicating whether the deployment was - * a success, failure or hold. A successful result will - * include the addresses of the deployed contracts. - * - * @alpha - */ - deploy( - ignitionModule: Module, - options: IgnitionDeployOptions - ): Promise>; - - /** - * Construct a plan (or dry run) describing how a deployment will be executed - * for the given module. - * - * @param deploymentModule - The Ignition module to be deployed - * @returns The deployment details as a plan - * - * @alpha - */ - plan( - deploymentModule: Module - ): Promise; - - /** - * Retrieve information about the given deployed module - * - * @param moduleName - The name of the Ignition module to retrieve data about - * @returns The addresses of the deployed contracts across any relevant networks - * - * @alpha - */ - info(moduleName: string): Promise; -} diff --git a/packages/core/src/types/info.ts b/packages/core/src/types/info.ts deleted file mode 100644 index c82264a752..0000000000 --- a/packages/core/src/types/info.ts +++ /dev/null @@ -1,31 +0,0 @@ -/** - * A data structure describing a deployed Module - * - * @alpha - */ -export interface ModuleInfoData { - moduleName: string; - networks: NetworkInfoData[]; -} - -/** - * A data structure describing network info for a deployed Module - * - * @alpha - */ -export interface NetworkInfoData { - networkName: string; - chainId: number; - contracts: ContractInfoData[]; -} - -/** - * A data structure describing a deployed Contract - * - * @alpha - */ -export interface ContractInfoData { - contractName: string; - status: string; - address: string; -} diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts deleted file mode 100644 index 50e7abfcc2..0000000000 --- a/packages/core/src/types/module.ts +++ /dev/null @@ -1,48 +0,0 @@ -import type { ExternalParamValue } from "../types/dsl"; -import type { - ContractFutureOld, - LibraryFuture, - ProxyFuture, - Virtual, -} from "./future"; - -import { IDeploymentBuilder } from "./dsl"; - -/** - * The potential return results of deploying a module. - * - * @alpha - */ -export type ModuleReturnValue = - | ContractFutureOld - | LibraryFuture - | Virtual - | ProxyFuture; - -/** - * The results of deploying a module. - * - * @alpha - */ -export interface ModuleDict { - [key: string]: ModuleReturnValue; -} - -/** - * An Ignition module that can be deployed. - * - * @alpha - */ -export interface Module { - name: string; - action: (builder: IDeploymentBuilder) => T; -} - -/** - * A mapping of parameter labels to allowed values or futures. - * - * @alpha - */ -export interface ModuleParams { - [key: string]: ExternalParamValue; -} diff --git a/packages/core/src/types/plan.ts b/packages/core/src/types/plan.ts deleted file mode 100644 index e1a5612f15..0000000000 --- a/packages/core/src/types/plan.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * The planned deployment, including a summary of its current status. - * - * @alpha - */ -export type IgnitionPlan = unknown; diff --git a/packages/core/src/types/process.ts b/packages/core/src/types/process.ts deleted file mode 100644 index 7a4bda16ec..0000000000 --- a/packages/core/src/types/process.ts +++ /dev/null @@ -1,17 +0,0 @@ -export enum ProcessResultKind { - SUCCESS = "success", - FAILURE = "failure", -} - -export interface ProcessStepSuccess { - _kind: ProcessResultKind.SUCCESS; - result: T; -} - -export interface ProcessStepFailure { - _kind: ProcessResultKind.FAILURE; - message: string; - failures: Error[]; -} - -export type ProcessStepResult = ProcessStepSuccess | ProcessStepFailure; diff --git a/packages/core/src/types/providers.ts b/packages/core/src/types/providers.ts deleted file mode 100644 index 33d0df40ac..0000000000 --- a/packages/core/src/types/providers.ts +++ /dev/null @@ -1,108 +0,0 @@ -import type { ExternalParamValue } from "../types/dsl"; -import type { ArtifactOld } from "./hardhat"; - -import { ethers } from "ethers"; - -import { ModuleParams } from "./module"; - -/** - * The low level adapters that allow Ignition to interact with external services - * like the target chain or the local filesystem. - * - * @alpha - */ -export interface Providers { - artifacts: ArtifactsProvider; - ethereumProvider: EIP1193Provider; - gasProvider: GasProvider; - transactions: TransactionsProvider; - config: ConfigProvider; - accounts: AccountsProvider; -} - -/** - * Provide access to contract artifacts based on a label. - * - * @alpha - */ -export interface ArtifactsProvider { - getArtifact: (name: string) => Promise; - hasArtifact: (name: string) => Promise; - getAllArtifacts: () => Promise; -} - -/** - * Provide access to the target Ethereum chain via requests. - * - * @alpha - */ -export interface EIP1193Provider { - request: (args: { method: string; params?: unknown[] }) => Promise; -} - -/** - * Provide access to Ethereum gas information for the target chain. - * - * @alpha - */ -export interface GasProvider { - estimateGasLimit: ( - tx: ethers.providers.TransactionRequest - ) => Promise; - estimateGasPrice: () => Promise; -} - -/** - * Provide access to transaction information for the target chain. - * - * @alpha - */ -export interface TransactionsProvider { - isConfirmed(txHash: string): Promise; - isMined(txHash: string): Promise; -} - -/** - * Allowed error codes for a parameter lookup. - * - * @alpha - */ -export type HasParamErrorCode = "no-params" | "param-missing"; - -/** - * The results of a parameter look up. - * - * @alpha - */ -export type HasParamResult = - | { - found: false; - errorCode: HasParamErrorCode; - } - | { found: true }; - -/** - * Provide access to configuration options for Ignition execution. - * - * @alpha - */ -export interface ConfigProvider { - parameters: ModuleParams | undefined; - - setParams(parameters: { [key: string]: ExternalParamValue }): Promise; - - getParam(paramName: string): Promise; - - hasParam(paramName: string): Promise; -} - -/** - * Provide a set of usable Ethereum accounts that can be made available within - * the Module api. - * - * @alpha - */ -export interface AccountsProvider { - getAccounts(): Promise; - getSigner(address: string): Promise; -} diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts deleted file mode 100644 index 7002dacca5..0000000000 --- a/packages/core/src/types/serialization.ts +++ /dev/null @@ -1,22 +0,0 @@ -import type { ModuleDict } from "./module"; - -/** - * The details of a deployed contract. The combination of address and abi - * should allow a consumer to call the contract. - * - * @internal - */ -export interface ContractInfo { - name: string; - address: string; - abi: any[]; -} - -/** - * The contract details from a successful deployment. - * - * @internal - */ -export type SerializedDeploymentResult = { - [K in keyof T]: ContractInfo; -}; diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts index befa804525..bf97d02c08 100644 --- a/packages/core/src/ui-helpers.ts +++ b/packages/core/src/ui-helpers.ts @@ -1,7 +1,8 @@ +/* eslint-disable import/no-unused-modules */ export { - StoredDeploymentSerializer, StoredDeploymentDeserializer, + StoredDeploymentSerializer, } from "./new-api/stored-deployment-serializer"; +export * from "./new-api/type-guards"; export * from "./new-api/types/module"; export * from "./new-api/types/serialized-deployment"; -export * from "./new-api/type-guards"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d023a936ee..19983f0475 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,9 +1,4 @@ -import { - deploy, - ModuleConstructor, - ModuleParams, - wipe, -} from "@ignored/ignition-core"; +import { deploy, ModuleConstructor, wipe } from "@ignored/ignition-core"; import "@nomiclabs/hardhat-ethers"; import { BigNumber } from "ethers"; import { existsSync, readdirSync, readJSONSync } from "fs-extra"; @@ -353,7 +348,7 @@ task("wipe") function resolveParametersFromModuleName( moduleName: string, ignitionPath: string -): ModuleParams | undefined { +): any | undefined { const files = readdirSync(ignitionPath); const configFilename = `${moduleName}.config.json`; @@ -377,7 +372,7 @@ function resolveConfigPath(filepath: string): any { } } -function resolveParametersString(paramString: string): ModuleParams { +function resolveParametersString(paramString: string): any { try { return JSON.parse(paramString); } catch { From ef1e2e504d9404cbf35b0e9e1de1283d0d27790d Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 24 Jul 2023 23:15:42 +0100 Subject: [PATCH 0575/1302] refactor: tighten eslint unused rules in core --- packages/core/.eslintrc.js | 6 -- packages/core/src/index.ts | 1 + .../internal/execution/execution-strategy.ts | 7 +- .../src/new-api/internal/execution/guards.ts | 2 +- .../execution/onchain-state-transitions.ts | 14 ++-- .../new-api/internal/journal/type-guards.ts | 14 ---- .../src/new-api/internal/module-builder.ts | 2 +- .../new-api/internal/reconciliation/types.ts | 2 +- .../new-api/internal/reconciliation/utils.ts | 12 +-- .../internal/types/execution-engine.ts | 2 +- .../new-api/internal/types/execution-state.ts | 77 ------------------- packages/core/src/new-api/types/journal.ts | 18 +---- 12 files changed, 15 insertions(+), 142 deletions(-) diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index e55d632623..4285f9e252 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -5,10 +5,4 @@ module.exports = { sourceType: "module", }, ignorePatterns: [".eslintrc.js"], - rules: { - "import/no-unused-modules": [ - 0, - { unusedExports: true, missingExports: true }, - ], - }, }; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 6617dd44c9..df1b917065 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,3 +1,4 @@ +/* eslint-disable import/no-unused-modules */ export * from "./errors"; export { defineModule } from "./new-api/define-module"; export { deploy } from "./new-api/deploy"; diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 9d5772101b..71d55fa203 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -42,12 +42,7 @@ import { } from "../types/execution-state"; import { assertIgnitionInvariant } from "../utils/assertions"; -export abstract class ExecutionStrategyBase {} - -export class BasicExecutionStrategy - extends ExecutionStrategyBase - implements ExecutionStrategy -{ +export class BasicExecutionStrategy implements ExecutionStrategy { public executeStrategy({ executionState, sender, diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index b5dfd1a184..02e6b7b188 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -55,7 +55,7 @@ export function isExecutionHold( return potential.type === "execution-hold"; } -export function isOnChainAction( +function isOnChainAction( potential: JournalableMessage ): potential is OnchainInteractionMessage { return potential.type === "onchain-action"; diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index d6fdc0793b..ce9d4fd9bc 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -1,7 +1,6 @@ import { ethers } from "ethers"; import { IgnitionError } from "../../../errors"; - import { CallFunctionInteractionMessage, DeployContractInteractionMessage, @@ -32,6 +31,7 @@ import { isOnchainTransactionRequest, isOnchainTransactionReset, } from "../journal/type-guards"; +import { serializeReplacer } from "../journal/utils/serialize-replacer"; import { ExecutionEngineState } from "../types/execution-engine"; import { DeploymentExecutionState, @@ -40,7 +40,6 @@ import { import { assertIgnitionInvariant } from "../utils/assertions"; import { collectLibrariesAndLink } from "../utils/collectLibrariesAndLink"; -import { serializeReplacer } from "../journal/utils/serialize-replacer"; import { isCallFunctionInteraction, isContractAtInteraction, @@ -50,7 +49,7 @@ import { isStaticCallInteraction, } from "./guards"; -export interface OnchainStateTransitionContinue { +interface OnchainStateTransitionContinue { status: "continue"; next: | ExecutionSuccess @@ -59,11 +58,11 @@ export interface OnchainStateTransitionContinue { | TransactionMessage; } -export interface OnchainStateTransitionPause { +interface OnchainStateTransitionPause { status: "pause"; } -export type OnchainStateTransition = ( +type OnchainStateTransition = ( state: ExecutionEngineState, next: TransactionMessage | null, strategyInst: AsyncGenerator< @@ -73,10 +72,7 @@ export type OnchainStateTransition = ( > ) => Promise; -export type OnchainStateTransitions = Record< - OnchainStatuses, - OnchainStateTransition ->; +type OnchainStateTransitions = Record; const DEFAULT_CONFIRMATIONS = 0; diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index 42c6510c65..e936801f50 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -11,7 +11,6 @@ import { OnchainReadEventArgumentSuccessMessage, OnchainResultFailureMessage, OnchainResultMessage, - OnchainResultSuccessMessage, OnchainSendDataSuccessMessage, OnchainStaticCallSuccessMessage, OnchainTransactionAccept, @@ -197,19 +196,6 @@ export function isOnChainResultMessage( return message.type === "onchain-result"; } -export function isOnChainSuccessMessage( - message: JournalableMessage -): message is OnchainResultSuccessMessage { - return ( - isOnchainDeployContractSuccessMessage(message) || - isOnchainCallFunctionSuccessMessage(message) || - isOnchainStaticCallSuccessMessage(message) || - isOnchainReadEventArgumentSuccessMessage(message) || - isOnchainSendDataSuccessMessage(message) || - isOnchainContractAtSuccessMessage(message) - ); -} - export function isOnChainFailureMessage( message: JournalableMessage ): message is OnchainResultFailureMessage { diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 349775232b..3ea5bb9db8 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -132,7 +132,7 @@ export class ModuleConstructor { } } -export class IgnitionModuleBuilderImplementation< +class IgnitionModuleBuilderImplementation< ModuleIdT extends string, ResultsContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index 59ed26d95c..5d1f2500e7 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -7,7 +7,7 @@ export interface ReconciliationFailure { failure: string; } -export interface ReconciliationFutureResultSuccess { +interface ReconciliationFutureResultSuccess { success: true; } diff --git a/packages/core/src/new-api/internal/reconciliation/utils.ts b/packages/core/src/new-api/internal/reconciliation/utils.ts index 8ba0b62b42..858a20a3c3 100644 --- a/packages/core/src/new-api/internal/reconciliation/utils.ts +++ b/packages/core/src/new-api/internal/reconciliation/utils.ts @@ -1,11 +1,7 @@ // eslint-disable-next-line import/default import type CborT from "cbor"; -import { - AccountRuntimeValue, - Future, - ModuleParameterType, -} from "../../types/module"; +import { Future, ModuleParameterType } from "../../types/module"; import { ReconciliationFutureResult } from "./types"; @@ -38,12 +34,6 @@ export function failWithError( }; } -export function accountRuntimeValueToErrorString( - potential: AccountRuntimeValue -) { - return JSON.stringify(potential); -} - export function moduleParameterToErrorString(potential: ModuleParameterType) { return JSON.stringify(potential); } diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index f22aac935d..10fc0a006e 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -15,7 +15,7 @@ import { ChainDispatcher } from "./chain-dispatcher"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; import { TransactionLookupTimer } from "./transaction-timer"; -export interface ExecutionConfig { +interface ExecutionConfig { blockPollingInterval: number; transactionTimeoutInterval: number; } diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index 29da494041..e538ec05e6 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -5,83 +5,6 @@ import { SolidityParameterType, } from "../../types/module"; -/** - * This interface represents a transaction that was sent to the network. - * - * We keep enough information to track its progress, including detecting if it - * was dropped or replaced by a different one. - */ -interface Transaction { - sender: string; - nonce: number; - txId: string; - // TODO: Should we record something else? Maybe to do fewer requests? -} - -/** - * We define the possible onchain interactions that execution strategies can request. - */ -enum OnchainInteractionType { - DEPLOYMENT, - FUNCTION_CALL, - SEND, -} - -/** - * Each onchain interaction is recorded associated to an id, provided by the execution - * strategy. With the entire ExecutionHistory, using these ids, the strategy must be - * able to regenerate its internal state and resume an execution. - * - * We also associate a sequence of transactions with each onchain interactions. These - * are the different transactions that Ignition tried to send to execute this onchain - * interaction. Ideally it should be a single one, but we may need to replace it due - * to errors or gas price changes, so we store all of them, in order. - */ -interface BaseOnchainInteraction< - OnchainInteractionTypeT extends OnchainInteractionType -> { - id: string; - type: OnchainInteractionTypeT; - transactions: Transaction[]; -} - -/** - * A request to deploy a contract using by sending a transaction to the null address. - */ -interface DeploymentOnchainInteraction - extends BaseOnchainInteraction { - deploymentBytecode: string; // Maybe we want to optimize this out of the journal? In some cases it can be read from the artifact. - constructorArgs: ArgumentType[]; - value: bigint; -} - -/** - * A request to call a function of an existing contract. - */ -interface FunctionCallOnchainInteraction - extends BaseOnchainInteraction { - contractAddress: string; - signature: string; // TODO: Maybe ABI fragment? - arguments: ArgumentType[]; - value: bigint; -} - -/** - * A request to send an arbitrary EVM message to an account. - */ -interface SendOnchainInteraction - extends BaseOnchainInteraction { - to: string; - data: string; - value: bigint; - transactions: Transaction[]; -} - -export type OnchainInteraction = - | DeploymentOnchainInteraction - | FunctionCallOnchainInteraction - | SendOnchainInteraction; - /** * The execution history of a future is a sequence of onchain interactions. */ diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/types/journal.ts index 1461c28019..42d30ffa38 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/types/journal.ts @@ -225,7 +225,7 @@ export type OnchainResultMessage = | OnchainResultSuccessMessage | OnchainResultFailureMessage; -export type OnchainResultSuccessMessage = +type OnchainResultSuccessMessage = | OnchainDeployContractSuccessMessage | OnchainCallFunctionSuccessMessage | OnchainStaticCallSuccessMessage @@ -339,7 +339,7 @@ export interface OnchainFailureMessage { * * @beta */ -export type ExecutionMessage = ExecutionUpdateMessage | ExecutionResultMessage; +type ExecutionMessage = ExecutionUpdateMessage | ExecutionResultMessage; // #region "FutureExecutionUpdate" @@ -348,7 +348,7 @@ export type ExecutionMessage = ExecutionUpdateMessage | ExecutionResultMessage; * * @beta */ -export type ExecutionUpdateMessage = FutureStartMessage; +type ExecutionUpdateMessage = FutureStartMessage; /** * A journal message to initialise the execution state for a future. @@ -490,18 +490,6 @@ export type ExecutionResultMessage = | ExecutionTimeout | ExecutionHold; -/** - * The types of execution result. - * - * @beta - */ -export type ExecutionResultTypes = [ - "execution-success", - "execution-failure", - "execution-timeout", - "execution-hold" -]; - // #region "ExecutionSuccess" /** From 123df69d12ab33a3ad0ed2bc65e26d3e24756b66 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 25 Jul 2023 03:08:31 -0400 Subject: [PATCH 0576/1302] remove isAdapters and move types/journals to internal Fixes #315 --- .../core/src/new-api/internal/deployer.ts | 2 +- .../ephemeral-deployment-loader.ts | 2 +- .../file-deployment-loader.ts | 2 +- .../internal/execution/execution-engine.ts | 18 ++++----- .../execution/execution-state-reducer.ts | 2 +- .../execution/execution-strategy-cycler.ts | 7 ++-- .../internal/execution/execution-strategy.ts | 38 +++++++++---------- .../src/new-api/internal/execution/guards.ts | 2 +- .../execution/onchain-action-reducer.ts | 2 +- .../execution/onchain-state-transitions.ts | 2 +- .../new-api/internal/journal/file-journal.ts | 2 +- .../internal/journal/memory-journal.ts | 2 +- .../new-api/internal/journal/type-guards.ts | 6 +-- .../src/new-api/internal/journal/utils/log.ts | 2 +- .../internal/types/execution-engine.ts | 10 ++--- .../new-api/internal/types/execution-state.ts | 3 +- .../new-api/{ => internal}/types/journal.ts | 6 ++- packages/core/src/new-api/internal/wiper.ts | 2 +- packages/core/src/new-api/type-guards.ts | 17 --------- .../src/new-api/types/deployment-loader.ts | 3 +- packages/core/test/new-api/helpers.ts | 5 ++- packages/core/test/new-api/wipe.ts | 2 +- 22 files changed, 64 insertions(+), 73 deletions(-) rename packages/core/src/new-api/{ => internal}/types/journal.ts (99%) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 4dcc049f5c..dda1e05361 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -18,7 +18,6 @@ import { import { Artifact, ArtifactResolver } from "../types/artifact"; import { DeployConfig, DeploymentResult } from "../types/deployer"; import { DeploymentLoader } from "../types/deployment-loader"; -import { Journal } from "../types/journal"; import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; @@ -36,6 +35,7 @@ import { DeploymentExecutionState, ExecutionStateMap, } from "./types/execution-state"; +import { Journal } from "./types/journal"; import { TransactionLookupTimer } from "./types/transaction-timer"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; diff --git a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index 856384e4ab..49e59eff60 100644 --- a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -1,7 +1,7 @@ import { Artifact, ArtifactResolver, BuildInfo } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; -import { Journal } from "../../types/journal"; import { MemoryJournal } from "../journal/memory-journal"; +import { Journal } from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; /** diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index f1622e4bf2..2909f4ffcc 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -3,8 +3,8 @@ import path from "path"; import { Artifact, BuildInfo } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; -import { Journal } from "../../types/journal"; import { FileJournal } from "../journal/file-journal"; +import { Journal } from "../types/journal"; export class FileDeploymentLoader implements DeploymentLoader { public journal: Journal; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 34c66e947d..2c559905a1 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -16,15 +16,6 @@ import { DeploymentResultContracts, } from "../../types/deployer"; import { DeploymentLoader } from "../../types/deployment-loader"; -import { - ExecutionResultMessage, - ExecutionTimeout, - FutureStartMessage, - JournalableMessage, - OnchainTransactionReset, - StartRunMessage, - TransactionMessage, -} from "../../types/journal"; import { AccountRuntimeValue, ArgumentType, @@ -53,6 +44,15 @@ import { ExecutionStateMap, ExecutionStatus, } from "../types/execution-state"; +import { + ExecutionResultMessage, + ExecutionTimeout, + FutureStartMessage, + JournalableMessage, + OnchainTransactionReset, + StartRunMessage, + TransactionMessage, +} from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; diff --git a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts index 22d65a059d..effc69f8c5 100644 --- a/packages/core/src/new-api/internal/execution/execution-state-reducer.ts +++ b/packages/core/src/new-api/internal/execution/execution-state-reducer.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { FutureStartMessage, JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, isContractAtStartMessage, @@ -24,6 +23,7 @@ import { SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; +import { FutureStartMessage, JournalableMessage } from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; import { diff --git a/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts b/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts index 4aa3e4feba..2f1160ea57 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy-cycler.ts @@ -1,12 +1,11 @@ +import { isOnChainResultMessage } from "../journal/type-guards"; +import { ExecutionState } from "../types/execution-state"; import { ExecutionSuccess, OnchainInteractionMessage, OnchainResultMessage, TransactionMessage, -} from "../../types/journal"; -import { isOnChainResultMessage } from "../journal/type-guards"; -import { ExecutionState } from "../types/execution-state"; - +} from "../types/journal"; export class ExecutionStategyCycler { /** * Given a execution strategy and history of on chain transactions diff --git a/packages/core/src/new-api/internal/execution/execution-strategy.ts b/packages/core/src/new-api/internal/execution/execution-strategy.ts index 71d55fa203..70ed92825e 100644 --- a/packages/core/src/new-api/internal/execution/execution-strategy.ts +++ b/packages/core/src/new-api/internal/execution/execution-strategy.ts @@ -1,4 +1,22 @@ import { IgnitionError } from "../../../errors"; +import { + isCallExecutionState, + isContractAtExecutionState, + isDeploymentExecutionState, + isReadEventArgumentExecutionState, + isSendDataExecutionState, + isStaticCallExecutionState, +} from "../type-guards"; +import { ExecutionStrategy } from "../types/execution-engine"; +import { + CallExecutionState, + ContractAtExecutionState, + DeploymentExecutionState, + ExecutionState, + ReadEventArgumentExecutionState, + SendDataExecutionState, + StaticCallExecutionState, +} from "../types/execution-state"; import { CallFunctionInteractionMessage, CalledFunctionExecutionSuccess, @@ -21,25 +39,7 @@ import { SendDataInteractionMessage, StaticCallExecutionSuccess, StaticCallInteractionMessage, -} from "../../types/journal"; -import { - isCallExecutionState, - isContractAtExecutionState, - isDeploymentExecutionState, - isReadEventArgumentExecutionState, - isSendDataExecutionState, - isStaticCallExecutionState, -} from "../type-guards"; -import { ExecutionStrategy } from "../types/execution-engine"; -import { - CallExecutionState, - ContractAtExecutionState, - DeploymentExecutionState, - ExecutionState, - ReadEventArgumentExecutionState, - SendDataExecutionState, - StaticCallExecutionState, -} from "../types/execution-state"; +} from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; export class BasicExecutionStrategy implements ExecutionStrategy { diff --git a/packages/core/src/new-api/internal/execution/guards.ts b/packages/core/src/new-api/internal/execution/guards.ts index 02e6b7b188..9243d4e34d 100644 --- a/packages/core/src/new-api/internal/execution/guards.ts +++ b/packages/core/src/new-api/internal/execution/guards.ts @@ -18,7 +18,7 @@ import { SendDataInteractionMessage, StaticCallExecutionSuccess, StaticCallInteractionMessage, -} from "../../types/journal"; +} from "../types/journal"; export function isExecutionResultMessage( potential: JournalableMessage diff --git a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts index 927a3f6dd3..97df27aaf0 100644 --- a/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts +++ b/packages/core/src/new-api/internal/execution/onchain-action-reducer.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { TransactionMessage } from "../../types/journal"; import { isOnchainCallFunctionSuccessMessage, isOnchainContractAtSuccessMessage, @@ -14,6 +13,7 @@ import { } from "../journal/type-guards"; import { serializeReplacer } from "../journal/utils/serialize-replacer"; import { OnchainState, OnchainStatuses } from "../types/execution-state"; +import { TransactionMessage } from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; import { diff --git a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts index ce9d4fd9bc..4c428d0021 100644 --- a/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts +++ b/packages/core/src/new-api/internal/execution/onchain-state-transitions.ts @@ -22,7 +22,7 @@ import { SendDataInteractionMessage, StaticCallInteractionMessage, TransactionMessage, -} from "../../types/journal"; +} from "../../internal/types/journal"; import { ArgumentType } from "../../types/module"; import { isOnChainResultMessage, diff --git a/packages/core/src/new-api/internal/journal/file-journal.ts b/packages/core/src/new-api/internal/journal/file-journal.ts index da718bb6e0..9991f4bc3e 100644 --- a/packages/core/src/new-api/internal/journal/file-journal.ts +++ b/packages/core/src/new-api/internal/journal/file-journal.ts @@ -2,7 +2,7 @@ import fs, { closeSync, constants, openSync, writeFileSync } from "fs"; import { parse } from "ndjson"; -import { Journal, JournalableMessage } from "../../types/journal"; +import { Journal, JournalableMessage } from "../types/journal"; import { deserializeReplacer } from "./utils/deserialize-replacer"; import { logJournalableMessage } from "./utils/log"; diff --git a/packages/core/src/new-api/internal/journal/memory-journal.ts b/packages/core/src/new-api/internal/journal/memory-journal.ts index fcd711f814..86332878e0 100644 --- a/packages/core/src/new-api/internal/journal/memory-journal.ts +++ b/packages/core/src/new-api/internal/journal/memory-journal.ts @@ -1,4 +1,4 @@ -import { Journal, JournalableMessage } from "../../types/journal"; +import { Journal, JournalableMessage } from "../types/journal"; import { deserializeReplacer } from "./utils/deserialize-replacer"; import { logJournalableMessage } from "./utils/log"; diff --git a/packages/core/src/new-api/internal/journal/type-guards.ts b/packages/core/src/new-api/internal/journal/type-guards.ts index e936801f50..a8bba39245 100644 --- a/packages/core/src/new-api/internal/journal/type-guards.ts +++ b/packages/core/src/new-api/internal/journal/type-guards.ts @@ -1,3 +1,5 @@ +import { FutureType } from "../../types/module"; +import { isOnchainInteractionMessage } from "../execution/guards"; import { CallFunctionStartMessage, ContractAtStartMessage, @@ -22,9 +24,7 @@ import { StaticCallStartMessage, TransactionMessage, WipeMessage, -} from "../../types/journal"; -import { FutureType } from "../../types/module"; -import { isOnchainInteractionMessage } from "../execution/guards"; +} from "../types/journal"; /** * Determines if potential is a StartRunMessage. diff --git a/packages/core/src/new-api/internal/journal/utils/log.ts b/packages/core/src/new-api/internal/journal/utils/log.ts index 7bef1d6e25..ab5c05b81b 100644 --- a/packages/core/src/new-api/internal/journal/utils/log.ts +++ b/packages/core/src/new-api/internal/journal/utils/log.ts @@ -1,4 +1,3 @@ -import { JournalableMessage } from "../../../types/journal"; import { SolidityParameterType } from "../../../types/module"; import { isCallFunctionInteraction, @@ -17,6 +16,7 @@ import { isStaticCallExecutionSuccess, isStaticCallInteraction, } from "../../execution/guards"; +import { JournalableMessage } from "../../types/journal"; import { isCallFunctionStartMessage, isContractAtStartMessage, diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 10fc0a006e..50a0778874 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,10 +1,5 @@ import { ArtifactResolver } from "../../types/artifact"; import { DeploymentLoader } from "../../types/deployment-loader"; -import { - ExecutionSuccess, - OnchainInteractionMessage, - OnchainResultMessage, -} from "../../types/journal"; import { IgnitionModule, IgnitionModuleResult, @@ -13,6 +8,11 @@ import { import { ChainDispatcher } from "./chain-dispatcher"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; +import { + ExecutionSuccess, + OnchainInteractionMessage, + OnchainResultMessage, +} from "./journal"; import { TransactionLookupTimer } from "./transaction-timer"; interface ExecutionConfig { diff --git a/packages/core/src/new-api/internal/types/execution-state.ts b/packages/core/src/new-api/internal/types/execution-state.ts index e538ec05e6..3c3d0bb835 100644 --- a/packages/core/src/new-api/internal/types/execution-state.ts +++ b/packages/core/src/new-api/internal/types/execution-state.ts @@ -1,10 +1,11 @@ -import { TransactionMessage } from "../../types/journal"; import { ArgumentType, FutureType, SolidityParameterType, } from "../../types/module"; +import { TransactionMessage } from "./journal"; + /** * The execution history of a future is a sequence of onchain interactions. */ diff --git a/packages/core/src/new-api/types/journal.ts b/packages/core/src/new-api/internal/types/journal.ts similarity index 99% rename from packages/core/src/new-api/types/journal.ts rename to packages/core/src/new-api/internal/types/journal.ts index 42d30ffa38..4c70676de4 100644 --- a/packages/core/src/new-api/types/journal.ts +++ b/packages/core/src/new-api/internal/types/journal.ts @@ -1,4 +1,8 @@ -import { ArgumentType, FutureType, SolidityParameterType } from "./module"; +import { + ArgumentType, + FutureType, + SolidityParameterType, +} from "../../types/module"; /** * Store a deployments execution state as a transaction log. diff --git a/packages/core/src/new-api/internal/wiper.ts b/packages/core/src/new-api/internal/wiper.ts index 0ea02270cb..48939d2df4 100644 --- a/packages/core/src/new-api/internal/wiper.ts +++ b/packages/core/src/new-api/internal/wiper.ts @@ -1,8 +1,8 @@ import { IgnitionError } from "../../errors"; -import { Journal, WipeMessage } from "../types/journal"; import { executionStateReducer } from "./execution/execution-state-reducer"; import { ExecutionStateMap } from "./types/execution-state"; +import { Journal, WipeMessage } from "./types/journal"; export class Wiper { constructor(private _journal: Journal) {} diff --git a/packages/core/src/new-api/type-guards.ts b/packages/core/src/new-api/type-guards.ts index 4515b8caa7..d9eda251a2 100644 --- a/packages/core/src/new-api/type-guards.ts +++ b/packages/core/src/new-api/type-guards.ts @@ -1,4 +1,3 @@ -import { Adapters } from "./types/adapters"; import { Artifact } from "./types/artifact"; import { AccountRuntimeValue, @@ -331,19 +330,3 @@ export function isModuleParameterRuntimeValue( potential.type === RuntimeValueType.MODULE_PARAMETER ); } - -/** - * Returns true if potential is a set of adapters. - * - * @beta - */ -export function isAdapters(potential: unknown): potential is Adapters { - return ( - typeof potential === "object" && - potential !== null && - /* TODO: make this type safe */ - "signer" in potential && - "gas" in potential && - "transactions" in potential - ); -} diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/types/deployment-loader.ts index a445560aab..d4d11d77cd 100644 --- a/packages/core/src/new-api/types/deployment-loader.ts +++ b/packages/core/src/new-api/types/deployment-loader.ts @@ -1,5 +1,6 @@ +import { Journal } from "../internal/types/journal"; + import { Artifact, BuildInfo } from "./artifact"; -import { Journal } from "./journal"; /** * Read and write to the deployment storage. diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 7c76bb97f8..540112d036 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -11,13 +11,16 @@ import { OnchainState, OnchainStatuses, } from "../../src/new-api/internal/types/execution-state"; +import { + Journal, + JournalableMessage, +} from "../../src/new-api/internal/types/journal"; import { DeploymentResult, DeploymentResultContract, DeploymentResultContracts, } from "../../src/new-api/types/deployer"; import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; -import { Journal, JournalableMessage } from "../../src/new-api/types/journal"; export const exampleAccounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index 70fff7ac66..b07c300ade 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -3,8 +3,8 @@ import { assert } from "chai"; import { defineModule } from "../../src/new-api/define-module"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; +import { Journal } from "../../src/new-api/internal/types/journal"; import { Wiper } from "../../src/new-api/internal/wiper"; -import { Journal } from "../../src/new-api/types/journal"; import { IgnitionModuleResult } from "../../src/new-api/types/module"; import { IgnitionModuleDefinition } from "../../src/new-api/types/module-builder"; From b397aeb3a1c7d496bd20766942e5ea9433dfcc60 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 25 Jul 2023 11:13:26 +0100 Subject: [PATCH 0577/1302] refactor: move deployment-loader types to internal --- packages/core/src/new-api/internal/deployer.ts | 2 +- .../internal/deployment-loader/ephemeral-deployment-loader.ts | 2 +- .../internal/deployment-loader/file-deployment-loader.ts | 2 +- .../core/src/new-api/internal/execution/execution-engine.ts | 2 +- .../src/new-api/{ => internal}/types/deployment-loader.ts | 4 ++-- packages/core/src/new-api/internal/types/execution-engine.ts | 2 +- packages/core/test/new-api/helpers.ts | 2 +- packages/core/test/new-api/types/deployment-loader.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) rename packages/core/src/new-api/{ => internal}/types/deployment-loader.ts (84%) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index dda1e05361..e568b50b36 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -17,7 +17,6 @@ import { } from "../type-guards"; import { Artifact, ArtifactResolver } from "../types/artifact"; import { DeployConfig, DeploymentResult } from "../types/deployer"; -import { DeploymentLoader } from "../types/deployment-loader"; import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; @@ -29,6 +28,7 @@ import { Reconciler } from "./reconciliation/reconciler"; import { ArtifactMap } from "./reconciliation/types"; import { isContractExecutionStateArray } from "./type-guards"; import { ChainDispatcher } from "./types/chain-dispatcher"; +import { DeploymentLoader } from "./types/deployment-loader"; import { ExecutionStrategy } from "./types/execution-engine"; import { ContractAtExecutionState, diff --git a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index 49e59eff60..d3d9ac1530 100644 --- a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -1,6 +1,6 @@ import { Artifact, ArtifactResolver, BuildInfo } from "../../types/artifact"; -import { DeploymentLoader } from "../../types/deployment-loader"; import { MemoryJournal } from "../journal/memory-journal"; +import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 2909f4ffcc..07d3299e8e 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -2,8 +2,8 @@ import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; import { Artifact, BuildInfo } from "../../types/artifact"; -import { DeploymentLoader } from "../../types/deployment-loader"; import { FileJournal } from "../journal/file-journal"; +import { DeploymentLoader } from "../types/deployment-loader"; import { Journal } from "../types/journal"; export class FileDeploymentLoader implements DeploymentLoader { diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 2c559905a1..67a51b82fc 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -15,7 +15,6 @@ import { DeploymentResultContract, DeploymentResultContracts, } from "../../types/deployer"; -import { DeploymentLoader } from "../../types/deployment-loader"; import { AccountRuntimeValue, ArgumentType, @@ -34,6 +33,7 @@ import { isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; +import { DeploymentLoader } from "../types/deployment-loader"; import { ExecutionEngineState, ExecutionStrategyContext, diff --git a/packages/core/src/new-api/types/deployment-loader.ts b/packages/core/src/new-api/internal/types/deployment-loader.ts similarity index 84% rename from packages/core/src/new-api/types/deployment-loader.ts rename to packages/core/src/new-api/internal/types/deployment-loader.ts index d4d11d77cd..b46271def4 100644 --- a/packages/core/src/new-api/types/deployment-loader.ts +++ b/packages/core/src/new-api/internal/types/deployment-loader.ts @@ -1,6 +1,6 @@ -import { Journal } from "../internal/types/journal"; +import { Artifact, BuildInfo } from "../../types/artifact"; -import { Artifact, BuildInfo } from "./artifact"; +import { Journal } from "./journal"; /** * Read and write to the deployment storage. diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 50a0778874..684ef483ca 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,5 +1,4 @@ import { ArtifactResolver } from "../../types/artifact"; -import { DeploymentLoader } from "../../types/deployment-loader"; import { IgnitionModule, IgnitionModuleResult, @@ -7,6 +6,7 @@ import { } from "../../types/module"; import { ChainDispatcher } from "./chain-dispatcher"; +import { DeploymentLoader } from "./deployment-loader"; import { ExecutionState, ExecutionStateMap } from "./execution-state"; import { ExecutionSuccess, diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 540112d036..833afd024f 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -7,6 +7,7 @@ import { Deployer } from "../../src/new-api/internal/deployer"; import { AccountsState } from "../../src/new-api/internal/execution/execution-engine"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; import { ChainDispatcher } from "../../src/new-api/internal/types/chain-dispatcher"; +import { DeploymentLoader } from "../../src/new-api/internal/types/deployment-loader"; import { OnchainState, OnchainStatuses, @@ -20,7 +21,6 @@ import { DeploymentResultContract, DeploymentResultContracts, } from "../../src/new-api/types/deployer"; -import { DeploymentLoader } from "../../src/new-api/types/deployment-loader"; export const exampleAccounts: string[] = [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", diff --git a/packages/core/test/new-api/types/deployment-loader.ts b/packages/core/test/new-api/types/deployment-loader.ts index a71cfd9113..2ea2fa46d3 100644 --- a/packages/core/test/new-api/types/deployment-loader.ts +++ b/packages/core/test/new-api/types/deployment-loader.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { EphemeralDeploymentLoader } from "../../../src/new-api/internal/deployment-loader/ephemeral-deployment-loader"; import { FileDeploymentLoader } from "../../../src/new-api/internal/deployment-loader/file-deployment-loader"; -import { DeploymentLoader } from "../../../src/new-api/types/deployment-loader"; +import { DeploymentLoader } from "../../../src/new-api/internal/types/deployment-loader"; import { ExactInterface } from "../../helpers/exact-interface"; import { setupMockArtifactResolver } from "../helpers"; From 35fb15fa93ea71fc3c1840bace31372a0126b395 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 25 Jul 2023 03:17:55 -0400 Subject: [PATCH 0578/1302] create type for DeploymentParameters --- packages/core/src/new-api/deploy.ts | 4 ++-- packages/core/src/new-api/internal/deployer.ts | 4 ++-- .../src/new-api/internal/execution/execution-engine.ts | 6 +++--- .../src/new-api/internal/reconciliation/reconciler.ts | 8 ++++++-- .../core/src/new-api/internal/reconciliation/types.ts | 4 ++-- .../core/src/new-api/internal/types/execution-engine.ts | 4 ++-- .../new-api/internal/utils/resolve-module-parameter.ts | 4 ++-- .../core/src/new-api/internal/validation/validate.ts | 4 ++-- packages/core/src/new-api/types/module.ts | 9 +++++++++ 9 files changed, 30 insertions(+), 17 deletions(-) diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 31f0688f17..235fdc1690 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -5,7 +5,7 @@ import { ChainDispatcherImpl } from "./internal/execution/chain-dispatcher"; import { Adapters } from "./types/adapters"; import { ArtifactResolver } from "./types/artifact"; import { DeployConfig, DeploymentResult } from "./types/deployer"; -import { IgnitionModuleResult, ModuleParameters } from "./types/module"; +import { DeploymentParameters, IgnitionModuleResult } from "./types/module"; import { IgnitionModuleDefinition } from "./types/module-builder"; /** @@ -32,7 +32,7 @@ export async function deploy({ string, IgnitionModuleResult >; - deploymentParameters: { [key: string]: ModuleParameters }; + deploymentParameters: DeploymentParameters; accounts: string[]; verbose: boolean; }): Promise { diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index e568b50b36..f6a7f3bfa0 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -1,7 +1,7 @@ import type { ContractFuture, + DeploymentParameters, IgnitionModuleResult, - ModuleParameters, } from "../types/module"; import type { IgnitionModuleDefinition } from "../types/module-builder"; @@ -94,7 +94,7 @@ export class Deployer { string, IgnitionModuleResult >, - deploymentParameters: { [key: string]: ModuleParameters }, + deploymentParameters: DeploymentParameters, accounts: string[] ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 67a51b82fc..28de429adb 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -19,9 +19,9 @@ import { AccountRuntimeValue, ArgumentType, ContractFuture, + DeploymentParameters, Future, FutureType, - ModuleParameters, NamedContractAtFuture, NamedContractDeploymentFuture, NamedLibraryDeploymentFuture, @@ -531,7 +531,7 @@ export class ExecutionEngine { accounts: string[]; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; - deploymentParameters: { [key: string]: ModuleParameters }; + deploymentParameters: DeploymentParameters; } ): Promise { const strategy = "basic"; @@ -956,7 +956,7 @@ export class ExecutionEngine { private _resolveArgs( args: ArgumentType[], context: { - deploymentParameters: { [key: string]: ModuleParameters }; + deploymentParameters: DeploymentParameters; accounts: string[]; executionStateMap: ExecutionStateMap; } diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index 0f051ecad8..ca2f9ac88a 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -1,4 +1,8 @@ -import { Future, IgnitionModule, ModuleParameters } from "../../types/module"; +import { + DeploymentParameters, + Future, + IgnitionModule, +} from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; @@ -21,7 +25,7 @@ export class Reconciler { public static reconcile( module: IgnitionModule, executionStateMap: ExecutionStateMap, - deploymentParameters: { [key: string]: ModuleParameters }, + deploymentParameters: DeploymentParameters, accounts: string[], moduleArtifactMap: ArtifactMap, storedArtifactMap: ArtifactMap diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index 5d1f2500e7..afc880ecce 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -1,5 +1,5 @@ import { Artifact } from "../../types/artifact"; -import { Future, ModuleParameters } from "../../types/module"; +import { DeploymentParameters, Future } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; export interface ReconciliationFailure { @@ -27,7 +27,7 @@ export interface ReconciliationResult { export interface ReconciliationContext { executionStateMap: ExecutionStateMap; - deploymentParameters: { [key: string]: ModuleParameters }; + deploymentParameters: DeploymentParameters; accounts: string[]; moduleArtifactMap: ArtifactMap; storedArtifactMap: ArtifactMap; diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 684ef483ca..82eb2f82a7 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,8 +1,8 @@ import { ArtifactResolver } from "../../types/artifact"; import { + DeploymentParameters, IgnitionModule, IgnitionModuleResult, - ModuleParameters, } from "../../types/module"; import { ChainDispatcher } from "./chain-dispatcher"; @@ -30,7 +30,7 @@ export interface ExecutionEngineState { module: IgnitionModule>; executionStateMap: ExecutionStateMap; accounts: string[]; - deploymentParameters: { [key: string]: ModuleParameters }; + deploymentParameters: DeploymentParameters; strategy: ExecutionStrategy; artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; diff --git a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts index bac2ae1418..5a6a5c4332 100644 --- a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts @@ -1,14 +1,14 @@ import { + DeploymentParameters, ModuleParameterRuntimeValue, ModuleParameterType, - ModuleParameters, } from "../../types/module"; import { assertIgnitionInvariant } from "./assertions"; export function resolveModuleParameter( moduleParamRuntimeValue: ModuleParameterRuntimeValue, - context: { deploymentParameters: { [key: string]: ModuleParameters } } + context: { deploymentParameters: DeploymentParameters } ): ModuleParameterType { if (context.deploymentParameters === undefined) { assertIgnitionInvariant( diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index a0a3916834..7fdb56a0f2 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -1,8 +1,8 @@ import { ArtifactResolver } from "../../types/artifact"; import { + DeploymentParameters, FutureType, IgnitionModule, - ModuleParameters, } from "../../types/module"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; @@ -20,7 +20,7 @@ import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, artifactLoader: ArtifactResolver, - moduleParameters: { [key: string]: ModuleParameters } + moduleParameters: DeploymentParameters ): Promise { const futures = getFuturesFromModule(module); diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index 0f35810e50..ec764f4289 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -361,6 +361,15 @@ export interface ModuleParameters { [parameterName: string]: ModuleParameterType; } +/** + * An object containing a map of module ID's to their respective ModuleParameters. + * + * @beta + */ +export interface DeploymentParameters { + [moduleId: string]: ModuleParameters; +} + /** * The results of deploying a module must be a dictionary of contract futures * From 24a273e2554d50a8bc07d2610a46a074b09dd3a0 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 26 Jul 2023 00:31:51 -0400 Subject: [PATCH 0579/1302] move DeploymentParameters type to more relevant file --- packages/core/src/new-api/deploy.ts | 8 ++++++-- packages/core/src/new-api/internal/deployer.ts | 12 ++++++------ .../internal/execution/execution-engine.ts | 2 +- .../new-api/internal/reconciliation/reconciler.ts | 7 ++----- .../src/new-api/internal/reconciliation/types.ts | 3 ++- .../new-api/internal/types/execution-engine.ts | 7 ++----- .../internal/utils/resolve-module-parameter.ts | 2 +- .../src/new-api/internal/validation/validate.ts | 13 +++++-------- packages/core/src/new-api/types/deployer.ts | 15 ++++++++++++++- packages/core/src/new-api/types/module.ts | 9 --------- 10 files changed, 39 insertions(+), 39 deletions(-) diff --git a/packages/core/src/new-api/deploy.ts b/packages/core/src/new-api/deploy.ts index 235fdc1690..1edd8be769 100644 --- a/packages/core/src/new-api/deploy.ts +++ b/packages/core/src/new-api/deploy.ts @@ -4,8 +4,12 @@ import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployme import { ChainDispatcherImpl } from "./internal/execution/chain-dispatcher"; import { Adapters } from "./types/adapters"; import { ArtifactResolver } from "./types/artifact"; -import { DeployConfig, DeploymentResult } from "./types/deployer"; -import { DeploymentParameters, IgnitionModuleResult } from "./types/module"; +import { + DeployConfig, + DeploymentParameters, + DeploymentResult, +} from "./types/deployer"; +import { IgnitionModuleResult } from "./types/module"; import { IgnitionModuleDefinition } from "./types/module-builder"; /** diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index f6a7f3bfa0..4a04e219d9 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -1,8 +1,4 @@ -import type { - ContractFuture, - DeploymentParameters, - IgnitionModuleResult, -} from "../types/module"; +import type { ContractFuture, IgnitionModuleResult } from "../types/module"; import type { IgnitionModuleDefinition } from "../types/module-builder"; import { IgnitionError } from "../../errors"; @@ -16,7 +12,11 @@ import { isNamedLibraryDeploymentFuture, } from "../type-guards"; import { Artifact, ArtifactResolver } from "../types/artifact"; -import { DeployConfig, DeploymentResult } from "../types/deployer"; +import { + DeployConfig, + DeploymentParameters, + DeploymentResult, +} from "../types/deployer"; import { Batcher } from "./batcher"; import { ExecutionEngine } from "./execution/execution-engine"; diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 28de429adb..5ffbf596e9 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -11,6 +11,7 @@ import { } from "../../type-guards"; import { ArtifactResolver } from "../../types/artifact"; import { + DeploymentParameters, DeploymentResult, DeploymentResultContract, DeploymentResultContracts, @@ -19,7 +20,6 @@ import { AccountRuntimeValue, ArgumentType, ContractFuture, - DeploymentParameters, Future, FutureType, NamedContractAtFuture, diff --git a/packages/core/src/new-api/internal/reconciliation/reconciler.ts b/packages/core/src/new-api/internal/reconciliation/reconciler.ts index ca2f9ac88a..d3a5f78984 100644 --- a/packages/core/src/new-api/internal/reconciliation/reconciler.ts +++ b/packages/core/src/new-api/internal/reconciliation/reconciler.ts @@ -1,8 +1,5 @@ -import { - DeploymentParameters, - Future, - IgnitionModule, -} from "../../types/module"; +import { DeploymentParameters } from "../../types/deployer"; +import { Future, IgnitionModule } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; diff --git a/packages/core/src/new-api/internal/reconciliation/types.ts b/packages/core/src/new-api/internal/reconciliation/types.ts index afc880ecce..1c33d1dbcc 100644 --- a/packages/core/src/new-api/internal/reconciliation/types.ts +++ b/packages/core/src/new-api/internal/reconciliation/types.ts @@ -1,5 +1,6 @@ import { Artifact } from "../../types/artifact"; -import { DeploymentParameters, Future } from "../../types/module"; +import { DeploymentParameters } from "../../types/deployer"; +import { Future } from "../../types/module"; import { ExecutionState, ExecutionStateMap } from "../types/execution-state"; export interface ReconciliationFailure { diff --git a/packages/core/src/new-api/internal/types/execution-engine.ts b/packages/core/src/new-api/internal/types/execution-engine.ts index 82eb2f82a7..89f5b2c011 100644 --- a/packages/core/src/new-api/internal/types/execution-engine.ts +++ b/packages/core/src/new-api/internal/types/execution-engine.ts @@ -1,9 +1,6 @@ import { ArtifactResolver } from "../../types/artifact"; -import { - DeploymentParameters, - IgnitionModule, - IgnitionModuleResult, -} from "../../types/module"; +import { DeploymentParameters } from "../../types/deployer"; +import { IgnitionModule, IgnitionModuleResult } from "../../types/module"; import { ChainDispatcher } from "./chain-dispatcher"; import { DeploymentLoader } from "./deployment-loader"; diff --git a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts index 5a6a5c4332..326e3a6c20 100644 --- a/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/new-api/internal/utils/resolve-module-parameter.ts @@ -1,5 +1,5 @@ +import { DeploymentParameters } from "../../types/deployer"; import { - DeploymentParameters, ModuleParameterRuntimeValue, ModuleParameterType, } from "../../types/module"; diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index 7fdb56a0f2..d8b4d7e55e 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -1,9 +1,6 @@ import { ArtifactResolver } from "../../types/artifact"; -import { - DeploymentParameters, - FutureType, - IgnitionModule, -} from "../../types/module"; +import { DeploymentParameters } from "../../types/deployer"; +import { FutureType, IgnitionModule } from "../../types/module"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { validateArtifactContractAt } from "./futures/validateArtifactContractAt"; @@ -20,7 +17,7 @@ import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, artifactLoader: ArtifactResolver, - moduleParameters: DeploymentParameters + deploymentParameters: DeploymentParameters ): Promise { const futures = getFuturesFromModule(module); @@ -30,10 +27,10 @@ export async function validate( // validating each of those, we achieve the same effect. const submodules = module.submodules; for (const submodule of submodules) { - await validate(submodule, artifactLoader, moduleParameters); + await validate(submodule, artifactLoader, deploymentParameters); } - const params = moduleParameters[module.id] ?? {}; + const params = deploymentParameters[module.id] ?? {}; for (const future of futures) { switch (future.type) { diff --git a/packages/core/src/new-api/types/deployer.ts b/packages/core/src/new-api/types/deployer.ts index 492c0fec58..e803b62d31 100644 --- a/packages/core/src/new-api/types/deployer.ts +++ b/packages/core/src/new-api/types/deployer.ts @@ -1,5 +1,9 @@ import { Artifact } from "./artifact"; -import { IgnitionModule, IgnitionModuleResult } from "./module"; +import { + IgnitionModule, + IgnitionModuleResult, + ModuleParameters, +} from "./module"; /** * Configuration options for the deployment. @@ -77,3 +81,12 @@ export type DeploymentResultContracts = Record< string, DeploymentResultContract >; + +/** + * An object containing a map of module ID's to their respective ModuleParameters. + * + * @beta + */ +export interface DeploymentParameters { + [moduleId: string]: ModuleParameters; +} diff --git a/packages/core/src/new-api/types/module.ts b/packages/core/src/new-api/types/module.ts index ec764f4289..0f35810e50 100644 --- a/packages/core/src/new-api/types/module.ts +++ b/packages/core/src/new-api/types/module.ts @@ -361,15 +361,6 @@ export interface ModuleParameters { [parameterName: string]: ModuleParameterType; } -/** - * An object containing a map of module ID's to their respective ModuleParameters. - * - * @beta - */ -export interface DeploymentParameters { - [moduleId: string]: ModuleParameters; -} - /** * The results of deploying a module must be a dictionary of contract futures * From 27e6f15d9d37d66b7d22a10a3ade97bc0698214c Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 25 Jul 2023 17:03:14 +0100 Subject: [PATCH 0580/1302] fix: journaling in empty folder The journal is now accessed via the deployment loader through two new methods that wrap the journal methods. This allows us to hook in and initialize the required directories before the first journal write. Note: the journal write remains sync, even though the deployment loader method is async, to allow for directory creation. Fixes #340 --- .../core/src/new-api/internal/deployer.ts | 7 ++-- .../ephemeral-deployment-loader.ts | 14 ++++++-- .../file-deployment-loader.ts | 35 ++++++++++++------- .../internal/execution/execution-engine.ts | 3 +- .../internal/types/deployment-loader.ts | 5 +-- packages/core/test/new-api/helpers.ts | 7 +++- 6 files changed, 47 insertions(+), 24 deletions(-) diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 4a04e219d9..1c41d401a5 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -35,7 +35,6 @@ import { DeploymentExecutionState, ExecutionStateMap, } from "./types/execution-state"; -import { Journal } from "./types/journal"; import { TransactionLookupTimer } from "./types/transaction-timer"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; @@ -102,7 +101,7 @@ export class Deployer { await validate(module, this._artifactResolver, deploymentParameters); const previousStateMap = await this._loadExecutionStateFrom( - this._deploymentLoader.journal + this._deploymentLoader ); const contracts = getFuturesFromModule(module).filter(isContractFuture); @@ -162,11 +161,11 @@ export class Deployer { } private async _loadExecutionStateFrom( - journal: Journal + deploymentLoader: DeploymentLoader ): Promise { let state: ExecutionStateMap = {}; - for await (const message of journal.read()) { + for await (const message of deploymentLoader.readFromJournal()) { state = executionStateReducer(state, message); } diff --git a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts index d3d9ac1530..7e36929b09 100644 --- a/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -1,7 +1,7 @@ import { Artifact, ArtifactResolver, BuildInfo } from "../../types/artifact"; import { MemoryJournal } from "../journal/memory-journal"; import { DeploymentLoader } from "../types/deployment-loader"; -import { Journal } from "../types/journal"; +import { Journal, JournalableMessage } from "../types/journal"; import { assertIgnitionInvariant } from "../utils/assertions"; /** @@ -10,7 +10,7 @@ import { assertIgnitionInvariant } from "../utils/assertions"; * Used when running in environments like Hardhat tests. */ export class EphemeralDeploymentLoader implements DeploymentLoader { - public journal: Journal; + private _journal: Journal; private _deployedAddresses: { [key: string]: string }; private _savedArtifacts: { @@ -23,11 +23,19 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { private _artifactResolver: ArtifactResolver, private _verbose: boolean ) { - this.journal = new MemoryJournal(this._verbose); + this._journal = new MemoryJournal(this._verbose); this._deployedAddresses = {}; this._savedArtifacts = {}; } + public async recordToJournal(message: JournalableMessage): Promise { + this._journal.record(message); + } + + public readFromJournal(): AsyncGenerator { + return this._journal.read(); + } + public async recordDeployedAddress( futureId: string, contractAddress: string diff --git a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts index 07d3299e8e..4c51528ba8 100644 --- a/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/new-api/internal/deployment-loader/file-deployment-loader.ts @@ -4,10 +4,10 @@ import path from "path"; import { Artifact, BuildInfo } from "../../types/artifact"; import { FileJournal } from "../journal/file-journal"; import { DeploymentLoader } from "../types/deployment-loader"; -import { Journal } from "../types/journal"; +import { Journal, JournalableMessage } from "../types/journal"; export class FileDeploymentLoader implements DeploymentLoader { - public journal: Journal; + private _journal: Journal; private _deploymentDirsEnsured: boolean; private _paths: { @@ -30,7 +30,7 @@ export class FileDeploymentLoader implements DeploymentLoader { "deployed_addresses.json" ); - this.journal = new FileJournal(journalPath, this._verbose); + this._journal = new FileJournal(journalPath, this._verbose); this._paths = { deploymentDir: this._deploymentDirPath, @@ -43,16 +43,15 @@ export class FileDeploymentLoader implements DeploymentLoader { this._deploymentDirsEnsured = false; } - private async _initialize(): Promise { - if (this._deploymentDirsEnsured) { - return; - } + public async recordToJournal(message: JournalableMessage): Promise { + await this._initialize(); - await ensureDir(this._paths.deploymentDir); - await ensureDir(this._paths.artifactsDir); - await ensureDir(this._paths.buildInfoDir); + // NOTE: the journal record is sync, even though this call is async + this._journal.record(message); + } - this._deploymentDirsEnsured = true; + public readFromJournal(): AsyncGenerator { + return this._journal.read(); } public storeNamedArtifact( @@ -83,7 +82,7 @@ export class FileDeploymentLoader implements DeploymentLoader { await this._initialize(); const buildInfoFilePath = path.join( - this._paths?.buildInfoDir, + this._paths.buildInfoDir, `${buildInfo.id}.json` ); @@ -127,6 +126,18 @@ export class FileDeploymentLoader implements DeploymentLoader { ); } + private async _initialize(): Promise { + if (this._deploymentDirsEnsured) { + return; + } + + await ensureDir(this._paths.deploymentDir); + await ensureDir(this._paths.artifactsDir); + await ensureDir(this._paths.buildInfoDir); + + this._deploymentDirsEnsured = true; + } + private _resolveArtifactPathFor(futureId: string) { const artifactFilePath = path.join( this._paths.artifactsDir, diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 5ffbf596e9..a8510c0e89 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -502,8 +502,7 @@ export class ExecutionEngine { state: ExecutionEngineState, message: JournalableMessage ): Promise { - // NOTE: recording to the journal is a sync operation - state.deploymentLoader.journal.record(message); + await state.deploymentLoader.recordToJournal(message); if (isDeployedContractExecutionSuccess(message)) { await state.deploymentLoader.recordDeployedAddress( diff --git a/packages/core/src/new-api/internal/types/deployment-loader.ts b/packages/core/src/new-api/internal/types/deployment-loader.ts index b46271def4..c7a5fbc613 100644 --- a/packages/core/src/new-api/internal/types/deployment-loader.ts +++ b/packages/core/src/new-api/internal/types/deployment-loader.ts @@ -1,6 +1,6 @@ import { Artifact, BuildInfo } from "../../types/artifact"; -import { Journal } from "./journal"; +import { JournalableMessage } from "./journal"; /** * Read and write to the deployment storage. @@ -8,7 +8,8 @@ import { Journal } from "./journal"; * @beta */ export interface DeploymentLoader { - journal: Journal; + recordToJournal(message: JournalableMessage): Promise; + readFromJournal(): AsyncGenerator; loadArtifact(artifactFutureId: string): Promise; storeUserProvidedArtifact( futureId: string, diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index 833afd024f..b41a7456c1 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -85,7 +85,12 @@ export function setupMockDeploymentLoader(journal: Journal): DeploymentLoader { const storedArtifacts: { [key: string]: Artifact } = {}; return { - journal, + recordToJournal: async (message) => { + journal.record(message); + }, + readFromJournal: () => { + return journal.read(); + }, recordDeployedAddress: async () => {}, storeUserProvidedArtifact: async (artifactFutureId, artifact) => { storedArtifacts[artifactFutureId] = artifact; From abf883eec4d3cfe27187a9decbab756c89291deb Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 25 Jul 2023 13:20:35 +0100 Subject: [PATCH 0581/1302] fix: update files included in published packages We were missing dist files. I have included a build step for each package on `prepack`. --- packages/core/.npmignore | 6 ++++-- packages/core/package.json | 13 +++---------- packages/hardhat-plugin/.npmignore | 3 +++ packages/hardhat-plugin/package.json | 3 ++- packages/ui/.npmignore | 21 +++++++++++++++++++++ packages/ui/package.json | 4 ++-- 6 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 packages/ui/.npmignore diff --git a/packages/core/.npmignore b/packages/core/.npmignore index 36a390e373..c72bb8c108 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -6,6 +6,8 @@ coverage/ .nycrc .prettierignore .prettierrc +!dist dist/test -test -src +test/ +src/ +temp diff --git a/packages/core/package.json b/packages/core/package.json index b691f5b93c..d43746bc39 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -22,20 +22,12 @@ "types": "./dist/src/index.d.ts", "exports": { ".": "./dist/src/index.js", - "./helpers": "./dist/src/helpers.js", - "./ui-helpers": "./dist/src/ui-helpers.js", - "./soon-to-be-removed": "./dist/src/soon-to-be-removed.js" + "./ui-helpers": "./dist/src/ui-helpers.js" }, "typesVersions": { "*": { - "helpers": [ - "./dist/src/helpers" - ], "ui-helpers": [ "./dist/src/ui-helpers" - ], - "soon-to-be-removed": [ - "./dist/src/soon-to-be-removed" ] } }, @@ -51,7 +43,8 @@ "test:debug": "DEBUG='ignition:*' npm run test", "test:build": "tsc --project ./test/", "test:coverage": "nyc mocha --recursive \"test/**/*.ts\"", - "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo" + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo", + "prepack": "npm run build" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", diff --git a/packages/hardhat-plugin/.npmignore b/packages/hardhat-plugin/.npmignore index d389e78726..77b73f35d4 100644 --- a/packages/hardhat-plugin/.npmignore +++ b/packages/hardhat-plugin/.npmignore @@ -7,5 +7,8 @@ post-build.js .nycrc .prettierignore .prettierrc +!dist +dist/test +src/ test/ esbuild.js diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index fece0ba571..662c5d88e6 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -30,7 +30,8 @@ "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", - "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments" + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments", + "prepack": "npm run build" }, "devDependencies": { "@ignored/ignition-core": "^0.0.13", diff --git a/packages/ui/.npmignore b/packages/ui/.npmignore new file mode 100644 index 0000000000..4021786438 --- /dev/null +++ b/packages/ui/.npmignore @@ -0,0 +1,21 @@ +.mocharc.json +.nycrc +.prettierignore +.prettierrc +.eslintrc.cjs + + +.gitkeep +index.html +src/ +scripts/ +examples/ +test/ +public/ + +tsconfig.json +tsconfig.node.json +vite.config.ts + +!dist +!dist/index.html diff --git a/packages/ui/package.json b/packages/ui/package.json index 51f0cb51a0..c0880aac43 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,5 @@ { "name": "@ignored/ignition-ui", - "private": true, "version": "0.0.13", "type": "module", "scripts": { @@ -11,7 +10,8 @@ "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "clean": "rimraf dist tsconfig.tsbuildinfo" + "clean": "rimraf dist tsconfig.tsbuildinfo", + "prepack": "npm run build" }, "dependencies": { "@ignored/ignition-core": "^0.0.13", From f4114c08ce9e418e626fa8c794990dcd95fa325f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 26 Jul 2023 00:41:20 -0400 Subject: [PATCH 0582/1302] export buildModule alias for defineModule --- packages/core/src/index.ts | 2 +- packages/core/src/new-api/define-module.ts | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index df1b917065..c9cdcf9c49 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ export * from "./errors"; -export { defineModule } from "./new-api/define-module"; +export { defineModule, buildModule } from "./new-api/define-module"; export { deploy } from "./new-api/deploy"; export { wipe } from "./new-api/wipe"; /* TODO: how is module constructor getting exposed? */ diff --git a/packages/core/src/new-api/define-module.ts b/packages/core/src/new-api/define-module.ts index f66ec43a0c..53febb5293 100644 --- a/packages/core/src/new-api/define-module.ts +++ b/packages/core/src/new-api/define-module.ts @@ -34,3 +34,15 @@ export function defineModule< return { id: moduleId, moduleDefintionFunction }; } + +/** + * Construct a module definition that can be deployed through Ignition. + * + * @param moduleId - the id of the module + * @param moduleDefintionFunction - a function accepting the + * IgnitionModuleBuilder to configure the deployment + * @returns a module definition + * + * @beta + */ +export const buildModule = defineModule; From 4e289199cfaa728ab36c7566b22522bc30ef3816 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 26 Jul 2023 18:39:34 -0400 Subject: [PATCH 0583/1302] fix for validation bug --- .../futures/validateArtifactContractAt.ts | 11 +- .../validateArtifactContractDeployment.ts | 13 +- .../validateArtifactLibraryDeployment.ts | 8 +- .../futures/validateNamedContractAt.ts | 8 +- .../futures/validateNamedContractCall.ts | 13 +- .../validateNamedContractDeployment.ts | 13 +- .../futures/validateNamedLibraryDeployment.ts | 8 +- .../futures/validateNamedStaticCall.ts | 7 +- .../futures/validateReadEventArgument.ts | 8 +- .../validation/futures/validateSendData.ts | 12 +- .../new-api/internal/validation/validate.ts | 64 ++++-- .../new-api/execution/execution-engine.ts | 213 +++++++++++++++--- packages/core/test/new-api/helpers.ts | 11 +- 13 files changed, 293 insertions(+), 96 deletions(-) diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts index af2bbea97e..2a1f07e90d 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts @@ -1,19 +1,18 @@ import { IgnitionValidationError } from "../../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ArtifactContractAtFuture, - ModuleParameters, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { ArtifactContractAtFuture } from "../../../types/module"; export async function validateArtifactContractAt( future: ArtifactContractAtFuture, _artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { if (isModuleParameterRuntimeValue(future.address)) { const param = - moduleParameters[future.address.name] ?? future.address.defaultValue; + deploymentParameters[future.address.moduleId]?.[future.address.name] ?? + future.address.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.address.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index 9766793f4d..b1ccbd7eb3 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -3,22 +3,20 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ArtifactContractDeploymentFuture, - ModuleParameters, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { ArtifactContractDeploymentFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateArtifactContractDeployment( future: ArtifactContractDeploymentFuture, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); const missingParams = moduleParams.filter( (param) => - moduleParameters[param.name] === undefined && + deploymentParameters[param.moduleId]?.[param.name] === undefined && param.defaultValue === undefined ); @@ -30,7 +28,8 @@ export async function validateArtifactContractDeployment( if (isModuleParameterRuntimeValue(future.value)) { const param = - moduleParameters[future.value.name] ?? future.value.defaultValue; + deploymentParameters[future.value.moduleId]?.[future.value.name] ?? + future.value.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.value.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts index ac538cc096..c68b6e14f9 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts @@ -1,13 +1,11 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { - ArtifactLibraryDeploymentFuture, - ModuleParameters, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; export async function validateArtifactLibraryDeployment( _future: ArtifactLibraryDeploymentFuture, _artifactLoader: ArtifactResolver, - _moduleParameters: ModuleParameters + _deploymentParameters: DeploymentParameters ) { return; /* noop - nothing to validate here */ } diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts index 34fcd04b11..571917a4af 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -4,16 +4,18 @@ import { isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ModuleParameters, NamedContractAtFuture } from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { NamedContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( future: NamedContractAtFuture, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { if (isModuleParameterRuntimeValue(future.address)) { const param = - moduleParameters[future.address.name] ?? future.address.defaultValue; + deploymentParameters[future.address.moduleId]?.[future.address.name] ?? + future.address.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.address.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index ae2841978a..0ea02cf5a8 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -6,22 +6,20 @@ import { isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ModuleParameters, - NamedContractCallFuture, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { NamedContractCallFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedContractCall( future: NamedContractCallFuture, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { const moduleParams = retrieveNestedRuntimeValues(future.args); const missingParams = moduleParams.filter( (param) => - moduleParameters[param.name] === undefined && + deploymentParameters[param.moduleId]?.[param.name] === undefined && param.defaultValue === undefined ); @@ -33,7 +31,8 @@ export async function validateNamedContractCall( if (isModuleParameterRuntimeValue(future.value)) { const param = - moduleParameters[future.value.name] ?? future.value.defaultValue; + deploymentParameters[future.value.moduleId]?.[future.value.name] ?? + future.value.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.value.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index c92023f637..4b237b81d3 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -6,22 +6,20 @@ import { isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ModuleParameters, - NamedContractDeploymentFuture, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { NamedContractDeploymentFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedContractDeployment( future: NamedContractDeploymentFuture, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); const missingParams = moduleParams.filter( (param) => - moduleParameters[param.name] === undefined && + deploymentParameters[param.moduleId]?.[param.name] === undefined && param.defaultValue === undefined ); @@ -33,7 +31,8 @@ export async function validateNamedContractDeployment( if (isModuleParameterRuntimeValue(future.value)) { const param = - moduleParameters[future.value.name] ?? future.value.defaultValue; + deploymentParameters[future.value.moduleId]?.[future.value.name] ?? + future.value.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.value.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts index cf44938d3e..0919986112 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -1,15 +1,13 @@ import { IgnitionValidationError } from "../../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ModuleParameters, - NamedLibraryDeploymentFuture, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { NamedLibraryDeploymentFuture } from "../../../types/module"; export async function validateNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, artifactLoader: ArtifactResolver, - _moduleParameters: ModuleParameters + _deploymentParameters: DeploymentParameters ) { const artifact = await artifactLoader.loadArtifact(future.contractName); diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts index 42ae5fa1b9..e508a60073 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -3,19 +3,20 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ModuleParameters, NamedStaticCallFuture } from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { NamedStaticCallFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; export async function validateNamedStaticCall( future: NamedStaticCallFuture, artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { const moduleParams = retrieveNestedRuntimeValues(future.args); const missingParams = moduleParams.filter( (param) => - moduleParameters[param.name] === undefined && + deploymentParameters[param.moduleId]?.[param.name] === undefined && param.defaultValue === undefined ); diff --git a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts index b3d675f225..692e78f535 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts @@ -3,15 +3,13 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { - ModuleParameters, - ReadEventArgumentFuture, -} from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { ReadEventArgumentFuture } from "../../../types/module"; export async function validateReadEventArgument( future: ReadEventArgumentFuture, artifactLoader: ArtifactResolver, - _moduleParameters: ModuleParameters + _deploymentParameters: DeploymentParameters ) { const artifact = "artifact" in future.emitter diff --git a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts index 5d19eb5283..6e3f791130 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts @@ -1,15 +1,18 @@ import { IgnitionValidationError } from "../../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { ModuleParameters, SendDataFuture } from "../../../types/module"; +import { DeploymentParameters } from "../../../types/deployer"; +import { SendDataFuture } from "../../../types/module"; export async function validateSendData( future: SendDataFuture, _artifactLoader: ArtifactResolver, - moduleParameters: ModuleParameters + deploymentParameters: DeploymentParameters ) { if (isModuleParameterRuntimeValue(future.to)) { - const param = moduleParameters[future.to.name] ?? future.to.defaultValue; + const param = + deploymentParameters[future.to.moduleId]?.[future.to.name] ?? + future.to.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.to.name}' requires a value but was given none` @@ -25,7 +28,8 @@ export async function validateSendData( if (isModuleParameterRuntimeValue(future.value)) { const param = - moduleParameters[future.value.name] ?? future.value.defaultValue; + deploymentParameters[future.value.moduleId]?.[future.value.name] ?? + future.value.defaultValue; if (param === undefined) { throw new IgnitionValidationError( `Module parameter '${future.value.name}' requires a value but was given none` diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index d8b4d7e55e..03909b26aa 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -30,38 +30,74 @@ export async function validate( await validate(submodule, artifactLoader, deploymentParameters); } - const params = deploymentParameters[module.id] ?? {}; - for (const future of futures) { switch (future.type) { case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - return validateArtifactContractDeployment( + await validateArtifactContractDeployment( future, artifactLoader, - params + deploymentParameters ); + break; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - return validateArtifactLibraryDeployment( + await validateArtifactLibraryDeployment( future, artifactLoader, - params + deploymentParameters ); + break; case FutureType.ARTIFACT_CONTRACT_AT: - return validateArtifactContractAt(future, artifactLoader, params); + await validateArtifactContractAt( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.NAMED_CONTRACT_DEPLOYMENT: - return validateNamedContractDeployment(future, artifactLoader, params); + await validateNamedContractDeployment( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.NAMED_LIBRARY_DEPLOYMENT: - return validateNamedLibraryDeployment(future, artifactLoader, params); + await validateNamedLibraryDeployment( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.NAMED_CONTRACT_AT: - return validateNamedContractAt(future, artifactLoader, params); + await validateNamedContractAt( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.NAMED_CONTRACT_CALL: - return validateNamedContractCall(future, artifactLoader, params); + await validateNamedContractCall( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.NAMED_STATIC_CALL: - return validateNamedStaticCall(future, artifactLoader, params); + await validateNamedStaticCall( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.READ_EVENT_ARGUMENT: - return validateReadEventArgument(future, artifactLoader, params); + await validateReadEventArgument( + future, + artifactLoader, + deploymentParameters + ); + break; case FutureType.SEND_DATA: - return validateSendData(future, artifactLoader, params); + await validateSendData(future, artifactLoader, deploymentParameters); + break; } } } diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 6373e70928..17d38195ad 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -999,6 +999,37 @@ describe("execution engine", () => { }); describe("call function", () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "a", + type: "uint256", + }, + { + internalType: "bytes", + name: "b", + type: "bytes", + }, + { + internalType: "bool", + name: "c", + type: "bool", + }, + ], + name: "configure", + outputs: [], + stateMutability: "payable", + type: "function", + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + it("should execute a call", async () => { const journal = new MemoryJournal(); @@ -1029,6 +1060,9 @@ describe("execution engine", () => { }, }, }, + artifacts: { + Contract1: fakeArtifact, + }, }); const result = await deployer.deploy( @@ -1037,12 +1071,16 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, + assertDeploymentSuccess( + result, + { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + }, }, - }); + { Contract1: fakeArtifact } + ); const journalMessages = await accumulateMessages(journal); @@ -1201,6 +1239,9 @@ describe("execution engine", () => { }, }, }, + artifacts: { + Contract1: fakeArtifact, + }, }); const result = await deployer.deploy( @@ -1325,6 +1366,37 @@ describe("execution engine", () => { }); describe("static call", () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "a", + type: "uint256", + }, + { + internalType: "bytes", + name: "b", + type: "bytes", + }, + { + internalType: "bool", + name: "c", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "pure", + type: "function", + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + it("should execute a static call", async () => { const journal = new MemoryJournal(); @@ -1356,6 +1428,9 @@ describe("execution engine", () => { return "example_static_call_result"; }, + artifacts: { + Contract1: fakeArtifact, + }, }); const result = await deployer.deploy( @@ -1364,12 +1439,16 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, + assertDeploymentSuccess( + result, + { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + }, }, - }); + { Contract1: fakeArtifact } + ); const journalMessages = await accumulateMessages(journal); @@ -1502,6 +1581,7 @@ describe("execution engine", () => { staticCall: async (_contractAddress, _abi, _functionName) => { throw new Error("Query reverted"); }, + artifacts: { Contract1: fakeArtifact }, }); const result = await deployer.deploy( @@ -1678,6 +1758,27 @@ describe("execution engine", () => { }); describe("read event arg", () => { + const fakeArtifact: Artifact = { + abi: [ + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "arg1", + type: "uint256", + }, + ], + name: "EventName1", + type: "event", + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + it("should execute a read event arg", async () => { const journal = new MemoryJournal(); @@ -1715,6 +1816,7 @@ describe("execution engine", () => { return "event-arg-value"; }, + artifacts: { Contract1: fakeArtifact }, }); const result = await deployer.deploy( @@ -1723,12 +1825,16 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, + assertDeploymentSuccess( + result, + { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + }, }, - }); + { Contract1: fakeArtifact } + ); const journalMessages = await accumulateMessages(journal); @@ -1869,6 +1975,7 @@ describe("execution engine", () => { ) => { throw new Error("Unable to read event"); }, + artifacts: { Contract1: fakeArtifact }, }); const result = await deployer.deploy( @@ -1981,6 +2088,49 @@ describe("execution engine", () => { }); describe("with complex arguments", () => { + const fakeArtifact = { + abi: [ + { + inputs: [ + { + components: [ + { + internalType: "address", + name: "nested", + type: "address", + }, + { + components: [ + { + internalType: "address", + name: "a", + type: "address", + }, + { + internalType: "uint256", + name: "b", + type: "uint256", + }, + ], + internalType: "struct Arr[1]", + name: "arr", + type: "tuple[1]", + }, + ], + internalType: "struct T", + name: "arg", + type: "tuple", + }, + ], + stateMutability: "nonpayable", + type: "constructor", + }, + ], + contractName: "Contract1", + bytecode: "", + linkReferences: {}, + }; + it("should execute deploy when futures are passed as nested arguments", async () => { const moduleDefinition = defineModule("Module1", (m) => { const account1 = m.getAccount(1); @@ -1990,7 +2140,7 @@ describe("execution engine", () => { const contract1 = m.contract( "Contract1", - [{ nested: library1, arr: [account1, supply] }], + [{ nested: library1, arr: [{ a: account1, b: supply }] }], { from: account1, } @@ -2019,6 +2169,7 @@ describe("execution engine", () => { }, }, }, + artifacts: { Contract1: fakeArtifact }, }); const result = await deployer.deploy( @@ -2027,16 +2178,20 @@ describe("execution engine", () => { exampleAccounts ); - assertDeploymentSuccess(result, { - "Module1:Contract1": { - contractName: "Contract1", - contractAddress: exampleAddress, - }, - "Module1:Library1": { - contractName: "Library1", - contractAddress: differentAddress, + assertDeploymentSuccess( + result, + { + "Module1:Contract1": { + contractName: "Contract1", + contractAddress: exampleAddress, + }, + "Module1:Library1": { + contractName: "Library1", + contractAddress: differentAddress, + }, }, - }); + { Contract1: fakeArtifact } + ); const journalMessages = await accumulateMessages(journal); @@ -2111,7 +2266,9 @@ describe("execution engine", () => { value: BigInt(0).toString(), constructorArgs: [ { - arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + arr: [ + { a: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", b: 1000 }, + ], nested: differentAddress, }, ], @@ -2127,7 +2284,9 @@ describe("execution engine", () => { args: [ { nested: differentAddress, - arr: ["0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", 1000], + arr: [ + { a: "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", b: 1000 }, + ], }, ], value: BigInt(0).toString(), diff --git a/packages/core/test/new-api/helpers.ts b/packages/core/test/new-api/helpers.ts index b41a7456c1..c8deed51ce 100644 --- a/packages/core/test/new-api/helpers.ts +++ b/packages/core/test/new-api/helpers.ts @@ -58,7 +58,7 @@ export function setupMockArtifactResolver(artifacts?: { }): ArtifactResolver { return { loadArtifact: async (contractName: string) => { - if (artifacts === undefined) { + if (artifacts?.[contractName] === undefined) { return { ...fakeArtifact, contractName, @@ -197,7 +197,8 @@ export function assertDeploymentSuccess( expectedContracts: Record< string, Omit & { artifact?: Artifact } - > + >, + artifacts?: { [contractName: string]: Artifact } ) { assert.isDefined(result); @@ -209,7 +210,11 @@ export function assertDeploymentSuccess( Object.entries(expectedContracts).map(([futureId, details]) => [ futureId, { - artifact: { ...fakeArtifact, contractName: details.contractName }, + artifact: { + ...fakeArtifact, + contractName: details.contractName, + ...artifacts?.[details.contractName], + }, ...details, }, ]) From d1e006e4be1c6581d9e2fe40d286e10984263748 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Jul 2023 09:56:57 +0100 Subject: [PATCH 0584/1302] fix: use artifact from future during depFromArt validation --- .../validation/futures/validateArtifactContractDeployment.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index b1ccbd7eb3..714c200c36 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -43,7 +43,7 @@ export async function validateArtifactContractDeployment( } } - const artifact = await artifactLoader.loadArtifact(future.contractName); + const artifact = future.artifact; const argsLength = future.constructorArgs.length; From 060468197d51096fd72f3502d6b640e46e937dae Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Jul 2023 12:00:42 +0100 Subject: [PATCH 0585/1302] feat: re-export buildModule via @ignored/hardhat-ignition --- packages/hardhat-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 19983f0475..d50346b00a 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -17,7 +17,7 @@ import { open } from "./utils/open"; import "./type-extensions"; // eslint-disable-next-line import/no-unused-modules -export { defineModule } from "@ignored/ignition-core"; +export { buildModule, defineModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; From f4be5334ef2e0b4ba0331c1a9ab84ce28254ca22 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 25 Jul 2023 15:56:44 +0100 Subject: [PATCH 0586/1302] docs: update the docs to new-api The samples have been updated to the new-api, and those changes are now reflected in the getting started guide and general docs Resolves #250. --- README.md | 2 +- docs/creating-modules-for-deployment.md | 192 ++++++---------------- docs/explanation.md | 6 +- docs/getting-started-guide.md | 74 +++++---- docs/running-a-deployment.md | 14 +- docs/using-ignition-in-hardhat-tests.md | 6 +- examples/sample/ignition/LockModule.js | 10 +- examples/ts-sample/ignition/LockModule.ts | 17 +- 8 files changed, 125 insertions(+), 196 deletions(-) diff --git a/README.md b/README.md index 81586ed74d..c6baa835db 100644 --- a/README.md +++ b/README.md @@ -52,8 +52,8 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex This repo contains example projects that show **Ignition** features in context (under `./examples`): - [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Ignition +- [Typescript Sample](./examples/ts-sample) - the **Hardhat** typescript starter project enhanced with Ignition - [ENS](./examples/ens) - deploy ENS and its registry for local testing -- [Create2](./examples/create2) - deploy contracts using a `create2` factory - [Uniswap](./examples/uniswap) - deploy Uniswap and test swaps ## Contributing diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index b969543985..59a823ed22 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -10,10 +10,9 @@ - [Adding an endowment of _Eth_](./creating-modules-for-deployment.md#adding-an-endowment-of-eth) - [Dependencies between contracts](./creating-modules-for-deployment.md#dependencies-between-contracts) - [Retrieving an artifact](./creating-modules-for-deployment.md#retrieving-an-artifact) - - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) - [Deploying from an artifact](./creating-modules-for-deployment.md#deploying-from-an-artifact) + - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) - - [Create2](./creating-modules-for-deployment.md#create2) - [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transferring-eth-as-part-of-a-call) - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transferring-eth-outside-of-a-call) @@ -22,7 +21,6 @@ - [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) - [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) - [Module Parameters](./creating-modules-for-deployment.md#module-parameters) -- [Switching based on the _Network Chain ID_](./creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) --- @@ -56,12 +54,10 @@ const token = m.contract("Token"); ### Constructor arguments -In **Solidity** contracts may have constructor arguments that need satisfied on deployment. This can be done by passing an `args` array as part of the options: +In **Solidity** contracts may have constructor arguments that need satisfied on deployment. This can be done by passing an `args` array as the second parameter: ```tsx -const token = m.contract("Token", { - args: ["My Token", "TKN", 18], -}); +const token = m.contract("Token", ["My Token", "TKN", 18]); ``` ### Adding an endowment of _Eth_ @@ -69,8 +65,8 @@ const token = m.contract("Token", { The deployed contract can be given an endowment of _Eth_ by passing the value of the endowment under the options object: ```tsx -const token = m.contract("Token", { - value: ethers.utils.parseUnits("1"), +const token = m.contract("Token", [], { + value: BigInt(ethers.utils.parseUnits("1").toString()), }); ``` @@ -80,9 +76,7 @@ If a contract needs the address of another contract as a constructor argument, t ```tsx const a = m.contract("A"); -const b = m.contract("B", { - args: [a], -}); +const b = m.contract("B", [a]); ``` You can think of this as `b` being the equivalent of a promise of an address, although **_futures are not promises_**. @@ -91,42 +85,33 @@ If a contract does not directly depend through arguments on another contract, a ```tsx const a = m.contract("A"); -const b = m.contract("B", { +const b = m.contract("B", [], { after: [a], }); ``` -### Retrieving an artifact +### Deploying from an artifact -You can use the module system itself to retrieve any of your locally compiled contract artifacts. This allows you to access and use the artifact ABI and bytecode wherever you'd like: +To allow you to use your own mechanism for getting the contract artifact, `contractFromArtifact` supports passing an `Artifact` as the second parameter: -```tsx -const artifact = m.getArtifact("Foo"); +```javascript +const artifact = hre.artifacts.readArtifactSync("Foo"); + +const userModule = buildModule("MyModule", (m) => { + m.contractFromArtifact("Foo", artifact, [0]); +}); ``` ### Using an existing contract -A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and abi: +A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and artifact: ```tsx -const artifact = m.getArtifact("UniswapRouter"); -const uniswap = m.contractAt("UniswapRouter", "0x123...", artifact.abi) - -m.call(uniswap, "swap", { ... }) -``` - -### Deploying from an artifact - -To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as an optional second parameter: +const uniswap = m.contractAtFromArtifact("UniswapRouter", "0x0...", artifact); -```javascript -const artifact = hre.artifacts.readArtifactSync("Foo"); - -const userModule = buildModule("MyModule", (m) => { - m.contract("Foo", artifact, { - args: [0], - }); -}); +m.call(uniswap, "swap", [ + /*...*/ +]); ``` ### Linking libraries @@ -135,7 +120,7 @@ A library can be deployed and linked to a contract by passing the libraries cont ```tsx const safeMath = m.library("SafeMath"); -const contract = m.contract("Contract", { +const contract = m.contract("Contract", [], { libraries: { SafeMath: safeMath, }, @@ -144,56 +129,6 @@ const contract = m.contract("Contract", { A library is deployed in the same way as a contract. -### Create2 - -`Create2` allows for reliably determining the address of a contract before it is deployed. - -It requires a factory contract: - -```solidity -//SPDX-License-Identifier: MIT -pragma solidity ^0.8.5; - -import "@openzeppelin/contracts/utils/Create2.sol"; - -contract Create2Factory { - event Deployed(bytes32 indexed salt, address deployed); - - function deploy( - uint256 amount, - bytes32 salt, - bytes memory bytecode - ) public returns (address) { - address deployedAddress; - - deployedAddress = Create2.deploy(amount, salt, bytecode); - emit Deployed(salt, deployedAddress); - - return deployedAddress; - } -} -``` - -Given the `create2` factory, you can deploy a contract via the factory by: - -```ts -module.exports = buildModule("Create2Example", (m) => { - const create2 = m.contract("Create2Factory"); - - const fooArtifact = m.getArtifact("Foo"); - - const fooAddress = m.call(create2, "deploy", { - args: [ - 0, // amount - toBytes32(1), // salt - fooArtifact.bytecode, // contract bytecode - ], - }); - - return { create2, foo: m.contractAt(fooAddress) }; -}); -``` - ## Calling contract methods Not all contract configuration happens via the constructor. To configure a contract through a call to a contract method: @@ -202,9 +137,7 @@ Not all contract configuration happens via the constructor. To configure a contr const token = m.contract("Token"); const exchange = m.contract("Exchange"); -m.call(exchange, "addToken", { - args: [token], -}); +m.call(exchange, "addToken", [token]); ``` ### Transferring _Eth_ as part of a call @@ -212,8 +145,8 @@ m.call(exchange, "addToken", { Similar to `ethers`, a call can transfer `Eth` by passing a `value` under the options: ```tsx -m.call(exchange, "deposit", { - value: ethers.utils.parseUnits("1"), +m.call(exchange, "deposit", [], { + value: BigInt(ethers.utils.parseUnits("1").toString()), }); ``` @@ -235,9 +168,7 @@ A contract might need the result of some other contract method as an input: const token = m.contract("Token"); const totalSupply = m.staticCall(token, "totalSupply"); -const someContract = m.contract("ContractName", { - args: [totalSupply], -}); +const someContract = m.contract("ContractName", [totalSupply]); ``` In this example, `totalSupply` is called a **deferred value**. Similar to how a contract future is a contract that will eventually be deployed, a deferred value is some value that will eventually be available. That means **you can't do this**: @@ -255,32 +186,30 @@ Because `totalSupply` is not a number, it is a future. A deployment can be put `on-hold` until an on-chain event has been emitted (for instance a timelock or multisig approval): ```tsx -const artifact = m.getArtifact("Multisig"); -const multisig = m.contract("Multisig", artifact, { args: [] }); +const multisig = m.contract("Multisig", []); const call = m.call(multisig, "authorize"); -const event = m.event(multisig, "AuthorizedBy", { - args: ["0xUser1"], - after: [call], -}); +const authorizerEventArg = m.readEventArgument( + call, + "AuthorizedBy", // Event name + "Authorizer" // Event arg name +); -m.call(multisig, "execute", { args: [event.params.transactionId] }); +m.call(multisig, "execute", [authorizerEventArg]); ``` The `event` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `event` condition. -Upon execution, the `EventFuture` will be resolved to the values of the params emitted by the given event. You can then use those values in tests or other modules as expected. - -A full example of the `event` function can be seen in our [Multisig example](../examples/multisig/README.md). +Upon execution, the `EventFuture` will be resolved to the values of the requested parameter emitted by the given event. You can then use that value in tests or other modules as expected. ## Network Accounts Management -All accounts configured for the current network can be accessed from within an **Ignition** module via `m.accounts`: +All accounts configured for the current network can be accessed from within an **Ignition** module via `m.getAccount(index)`: ```tsx module.exports = buildModule("Multisig", (m) => { - const [owner] = m.accounts; // typeof m.accounts === string[] + const owner = m.getAccount(0); }); ``` @@ -288,20 +217,22 @@ You can then use these addresses anywhere you normally would, such as constructo ```tsx module.exports = buildModule("Multisig", (m) => { - const [owner, alsoAnOwner, notAnOwner] = m.accounts; // typeof m.accounts === string[] + const owner = m.getAccount(0); + const alsoAnOwner = m.getAccount(1); + const notAnOwner = m.getAccount(2); - const multisig = m.deploy("Multisig", { args: [owner, alsoAnOwner], { from: owner }}); + const multisig = m.contract("Multisig", [owner, alsoAnOwner], { + from: owner, + }); - const value = ethers.utils.parseUnits("100"); - const fund = m.sendETH(multisig, { value, from: notAnOwner }) + const value = BigInt(ethers.utils.parseUnits("100").toString()); + const fund = m.send("fund", multisig, value, undefined, { from: notAnOwner }); - const call = m.call(multisig, "authorize", { from: alsoAnOwner }); + const call = m.call(multisig, "authorize", [], { from: alsoAnOwner }); }); ``` -Note that if `from` is not provided, **Ignition** will default to sending transactions using the first configured account (`m.accounts[0]`). - -A more complete example of the `from` option can be found in our [Multisig example](../examples/multisig/README.md) +Note that if `from` is not provided, **Ignition** will default to sending transactions using the first configured account (`accounts[0]`). ## Including modules within modules @@ -313,9 +244,8 @@ module.exports = buildModule("`TEST` registrar", (m) => { const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); - const registrar = m.contract("FIFSRegistrar", { - args: [ens, namehash.hash("test")], - }); + // Setup registrar + const registrar = m.contract("FIFSRegistrar", [ens, tldHash]); // ... @@ -323,7 +253,7 @@ module.exports = buildModule("`TEST` registrar", (m) => { }); ``` -Calls to `useModule` memoize the results object, assuming the same parameters are passed. Multiple calls to the same module with different parameters are banned. +Calls to `useModule` memoize the results object. Only contract or library types can be returned when building a module. @@ -332,8 +262,8 @@ Only contract or library types can be returned when building a module. Modules can have parameters that are accessed using the `DeploymentBuilder` object: ```tsx -const symbol = m.getParam("tokenSymbol"); -const name = m.getParam("tokenName"); +const symbol = m.getParameter("tokenSymbol"); +const name = m.getParameter("tokenName"); const token = m.contract("Token", { args: [symbol, name, 1_000_000], @@ -342,28 +272,10 @@ const token = m.contract("Token", { When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed and will error. -You can use optional params with default values too: +You can use optional params by providing default values: ```tsx -const symbol = m.getOptionalParam("tokenSymbol", "TKN"); -``` - -## Switching based on the _Network Chain ID_ - -The `DeploymentBuilder` (`m`) exposes the chain id of the network in which the contracts are being deployed. This is useful if you need to do different things depending on the network. - -```tsx -const userModule = buildModule("MyModule", (m) => { - const daiAddresses = { - 1: "0x123...", // mainnet DAI - 4: "0x234...", // rinkeby DAI - }; - - const daiAddress = daiAddresses[m.chainId]; - const myContract = m.contract("MyContract", { - args: [daiAddress], - }); -}); +const symbol = m.getParameter("tokenSymbol", "TKN"); ``` --- diff --git a/docs/explanation.md b/docs/explanation.md index 67b6c435c3..fe5918dcd4 100644 --- a/docs/explanation.md +++ b/docs/explanation.md @@ -24,9 +24,9 @@ A module is built by calling the `buildModule` function and passing it a unique ```tsx module.exports = buildModule("CounterModule", (m) => { - const intialCounterValue = 123; + const initialCounterValue = 123; - const counter = m.contract("Counter", { args: [initialCounterValue] }); + const counter = m.contract("Counter", [initialCounterValue]); return { counter }; }); @@ -44,7 +44,7 @@ In the above example, when we call `m.contract`, we create a contract deployment module.exports = buildModule("ContractWithInitModule", (m) => { const c = m.contract("ContractWithInitModule"); - m.call(c, "init", { args: [123] }); + m.call(c, "init", [123]); return { c }; }); diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 261a01c18a..94ba4a3cf1 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -14,7 +14,8 @@ ## Setup -This guide assumes you are starting with the Hardhat Javascript project as covered in the [Hardhat quick start](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start). +This guide assumes you are starting with the Hardhat Javascript project as covered in +the [Hardhat quick start](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start). ```shell $ npx hardhat @@ -27,7 +28,7 @@ $ npx hardhat 888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. 888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 -👷 Welcome to Hardhat v2.9.9 👷‍ +👷 Welcome to Hardhat v2.17.0 👷‍ ? What do you want to do? … ❯ Create a JavaScript project @@ -36,6 +37,9 @@ $ npx hardhat Quit ``` +> WARNING: currently Ignition only supports Ethers v5. You will need to downgrade +> `@nomicfoundation/hardhat-toolbox` to version `2.0.2` to work with Ignition + Add **Ignition** to your **Hardhat** project by installing the plugin: ```bash @@ -64,17 +68,19 @@ Add a deployment module under the `./ignition` folder for the example `Lock.sol` // ./ignition/LockModule.js const { buildModule } = require("@ignored/hardhat-ignition"); -const currentTimestampInSeconds = Math.round(new Date(2023, 01, 01) / 1000); +const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; -const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei"); +const ONE_GWEI = BigInt(hre.ethers.utils.parseUnits("1", "gwei")); module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getOptionalParam("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getOptionalParam("lockedAmount", ONE_GWEI); + const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); - const lock = m.contract("Lock", { args: [unlockTime], value: lockedAmount }); + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); return { lock }; }); @@ -88,12 +94,15 @@ Run the `deploy` task to test the module against an ephemeral **Hardhat** node ( npx hardhat deploy LockModule ``` -A file containing module parameters can be passed as a flag at the command line: +A file containing module parameters, indexed by the `ModuleId` used in `buildModule`, can be passed as a flag at +the command line: ```json // ignition/LockModule.config.json { - "unlockTime": 4102491600 + "LockModule": { + "unlockTime": 4102491600 + } } ``` @@ -101,41 +110,41 @@ A file containing module parameters can be passed as a flag at the command line: npx hardhat deploy --parameters ignition/LockModule.config.json LockModule ``` -Parameters can also be passed at the command line via a json string: +To deploy against a specific network pass it on the command line, for instance to deploy against +a local **Hardhat** node: ```bash -npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule -# Ensure you have properly escaped the json string +npx hardhat node +# in another terminal +npx hardhat deploy LockModule --network localhost ``` -To deploy against a specific network pass it on the command line, for instance to deploy against a local **Hardhat** node: +Running against a non-ephemeral network will generate a `deployment` stored under `./ignition/deployments`. The +deployment identified by a `deploymentId` that can be passed at the command line: ```bash -npx hardhat node -# in another terminal -npx hardhat deploy --network localhost LockModule +npx hardhat deploy LockModule --network localhost --id dev-deploy ``` +If no `deploymentId` is provided a default is generated based on the `chainId` e.g. _network-31337_ for the localhost +network. + ### Getting Info About Previous Deployments -Run the `ignition-info` task to display info about your successfully deployed contracts (non-ephemeral nodes only): +Run the `ignition-info` task to display info about your successfully deployed contracts within a deployment: ```bash -npx hardhat ignition-info LockModule - -# example output: - LockModule - ___________ - - hardhat (31337) - ------- +npx hardhat ignition-info --deployment-id dev-deploy +# Deployed Addresses +# ================== - Lock   deployed   0x5FbDB2315678afecb367f032d93F642f64180aa3 +# LockModule:Lock 0x5FbDB2315678afecb367f032d93F642f64180aa3 ``` ### Using the Module Within Hardhat Tests -Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide the `./test/Lock.js` test file can be leverage **Ignition** by updating the `deployOneYearLockFixture` fixture: +Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide +the `./test/Lock.js` test file can be leverage **Ignition** by updating the `deployOneYearLockFixture` fixture: ```js ... @@ -148,7 +157,7 @@ const LockModule = require("../ignition/LockModule"); const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; const ONE_GWEI = 1_000_000_000; - const lockedAmount = ONE_GWEI; + const lockedAmount = BigInt(ONE_GWEI); const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; // Contracts are deployed using the first signer/account by default @@ -156,8 +165,10 @@ const LockModule = require("../ignition/LockModule"); const { lock } = await ignition.deploy(LockModule, { parameters: { - unlockTime, - lockedAmount, + LockModule: { + unlockTime, + lockedAmount, + }, }, }); @@ -165,7 +176,8 @@ const LockModule = require("../ignition/LockModule"); } ``` -The **Hardhat** test command will automatically include the `ignition` object within the scope of test files when running tests: +The **Hardhat** test command will automatically include the `ignition` object within the scope of test files +when running tests: ```sh npx hardhat test diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index cc5df8427b..7b4ace4c1c 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -6,8 +6,8 @@ - [Visualizing your deployment with the `plan` task](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) - [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - - [Configuration options](./running-a-deployment.md#configuration-options) - - [Resuming a failed or onhold deployment](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) + --- @@ -41,19 +41,19 @@ Deploying a module is done using the **Ignition** deploy task: npx hardhat deploy LockModule ``` -Module parameters can be passed as a `json` string to the `parameters` flag: +Module parameters, indexed by `ModuleId`, can be passed as a `json` string to the `parameters` flag: ```sh -npx hardhat deploy --parameters "{\"unlockTime\":4102491600,\"lockedAmount\":2000000000}" LockModule.js +npx hardhat deploy --parameters "{\"LockModule\": {\"unlockTime\":4102491600,\"lockedAmount\":2000000000}}" LockModule.js ``` By default the deploy task will deploy to an ephemeral Hardhat network. To target a network from your Hardhat config, you can pass its name to the network flag: ```sh -npx hardhat deploy --network mainnet LockModule.js +npx hardhat deploy LockModule.js --network mainnet ``` -### Configuration options + diff --git a/docs/using-ignition-in-hardhat-tests.md b/docs/using-ignition-in-hardhat-tests.md index 6d0572ed39..8427eeaa16 100644 --- a/docs/using-ignition-in-hardhat-tests.md +++ b/docs/using-ignition-in-hardhat-tests.md @@ -6,7 +6,7 @@ Requiring **Ignition** within your `hardhat.config.{ts,js}` will automatically inject the `ignition` object as a global variable within **Hardhat** test files. -The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional configuration object as the second argument. Module parameters can be passed under the `parameters` property of the options object: +The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional configuration object as the second argument. Module parameters can be passed under the `parameters` property of the options object, indexed by the `ModuleId`: ```js it("should allow setting the start count for new counters", async function () { @@ -20,7 +20,9 @@ it("should allow setting the start count for new counters", async function () { const { counter } = await ignition.deploy(CounterModule, { parameters: { - startCount: 42, + Counter: { + startCount: 42, + }, }, }); diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index 336ea344e1..1dfee081b4 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -1,15 +1,15 @@ // ./ignition/LockModule.js -const { defineModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); -const currentTimestampInSeconds = Math.round(new Date(2023, 1, 1) / 1000); +const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; -const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); +const ONE_GWEI = BigInt(hre.ethers.utils.parseUnits("1", "gwei")); -module.exports = defineModule("LockModule", (m) => { +module.exports = buildModule("LockModule", (m) => { const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getParameter("lockedAmount", BigInt(ONE_GWEI)); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", [unlockTime], { value: lockedAmount, diff --git a/examples/ts-sample/ignition/LockModule.ts b/examples/ts-sample/ignition/LockModule.ts index 993317d009..d3175500c3 100644 --- a/examples/ts-sample/ignition/LockModule.ts +++ b/examples/ts-sample/ignition/LockModule.ts @@ -1,17 +1,20 @@ -import { defineModule } from "@ignored/hardhat-ignition"; +import { buildModule } from "@ignored/hardhat-ignition"; import hre from "hardhat"; const currentTimestampInSeconds = Math.round( - new Date(2023, 1, 1).valueOf() / 1000 + new Date(2023, 0, 1).valueOf() / 1000 ); -const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; -const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; +const TEN_YEAR_IN_SECS: number = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE: number = + currentTimestampInSeconds + TEN_YEAR_IN_SECS; -const ONE_GWEI = hre.ethers.utils.parseUnits("1", "gwei").toString(); +const ONE_GWEI: bigint = BigInt( + hre.ethers.utils.parseUnits("1", "gwei").toString() +); -const LockModule = defineModule("LockModule", (m) => { +const LockModule = buildModule("LockModule", (m) => { const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getParameter("lockedAmount", BigInt(ONE_GWEI)); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); const lock = m.contract("Lock", [unlockTime], { value: lockedAmount, From 97d2242e152bb4a51b156074b6029e20cba9cc98 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Jul 2023 11:11:13 +0100 Subject: [PATCH 0587/1302] chore: bump version to v0.1.0 Update the packages versions and changelogs for the `0.1.0 - 2023-07-27` release. --- docs/publish.md | 20 +++++++++++--------- examples/complete/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/package.json | 2 +- examples/uniswap/package.json | 2 +- package-lock.json | 26 +++++++++++++------------- packages/core/CHANGELOG.md | 13 +++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin/package.json | 10 +++++----- packages/ui/CHANGELOG.md | 11 +++++++++++ packages/ui/package.json | 4 ++-- 13 files changed, 74 insertions(+), 35 deletions(-) create mode 100644 packages/ui/CHANGELOG.md diff --git a/docs/publish.md b/docs/publish.md index 4d66c8a5c1..56eeb67f58 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -7,13 +7,15 @@ To publish ignition: 3. Create a release branch `git checkout -b release/yyyy-mm-dd` 4. Update the `CHANGELOG.md` under `./packages/core`. 5. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. -6. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` -7. Update the version of dependencies: +6. Update the `CHANGELOG.md` under `./packages/ui`. +7. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` +8. Update the version of dependencies: +- cores version in hardhat-ui deps - cores version in hardhat-ignition devDeps and peerDeps - examples version of hardhat-ignition -8. Commit the version update `git commit`: +9. Commit the version update `git commit`: ``` chore: bump version to vX.X.X @@ -22,9 +24,9 @@ Update the packages versions and changelogs for the `X.X.X - yyyy-mm-dd` release. ``` -9. Push the release branch and open a pull request, the PR description should match the changelogs -10. On a successful check, `rebase merge` the release branch into main -11. Switch to main branch and pull the latest changes -12. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -13. Publish `@ignored/ignition-core` and `@ignored/hardhat-ignition` : `npm publish -w @ignored/ignition-core -w @ignored/hardhat-ignition` -14. Create a release on github off of the pushed tag +10. Push the release branch and open a pull request, the PR description should match the changelogs +11. On a successful check, `rebase merge` the release branch into main +12. Switch to main branch and pull the latest changes +13. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +14. Publish `@ignored/ignition-core`, `@ignored/ignition-ui` and `@ignored/hardhat-ignition` : `npm publish -w @ignored/ignition-core -w @ignored/hardhat-ui -w @ignored/hardhat-ignition` +15. Create a release on github off of the pushed tag diff --git a/examples/complete/package.json b/examples/complete/package.json index 3725820c67..6302d65b99 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 363bb485cd..4d8d79296d 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 642a83fef8..30397cfd04 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 000a2ba2bd..25eae0fdca 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 157612546a..ac45798d02 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 65e2f2c254..7561cb2e57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,7 @@ "name": "@nomicfoundation/ignition-complete-example", "version": "0.0.13", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -59,7 +59,7 @@ "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -83,7 +83,7 @@ "name": "@nomicfoundation/ignition-sample-example", "version": "0.0.13", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -93,7 +93,7 @@ "name": "@nomicfoundation/ignition-ts-sample-example", "version": "0.0.13", "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -113,7 +113,7 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", + "@ignored/hardhat-ignition": "^0.1.0", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -21011,7 +21011,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.0.13", + "version": "0.1.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21094,7 +21094,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.0.13", + "version": "0.1.0", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -21108,8 +21108,8 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@ignored/ignition-ui": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-ui": "^0.1.0", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -21151,8 +21151,8 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@ignored/ignition-ui": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-ui": "^0.1.0", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" } @@ -21302,9 +21302,9 @@ }, "packages/ui": { "name": "@ignored/ignition-ui", - "version": "0.0.13", + "version": "0.1.0", "dependencies": { - "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 92c15157f0..16d65b1a79 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.1.0 - 2023-07-27 + +### Added + +- Rerunning now uses a reconciliation phase to allow more leeway in changing a module between runs +- Deployments against real networks are recorded to `./ignition/deployments/`, including recording the deployed addresses and the artifacts (i.e. abi, build-info etc) used for each contract deploy + +### Changed + +- The _Module API_ has went through considerable restructuring, including _breaking changes_, please see the `./docs` for more details +- The plan task has been enhanced to give a module centric view rather than the lower level execution that was previously shown +- The _ui_ during a deployment has been reduced to showing the results, the full UI will be brought back in a coming release + ## 0.0.13 - 2023-04-18 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index d43746bc39..e2925f3454 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.0.13", + "version": "0.1.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 5c3d98dae4..47ca342e99 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.1.0 - 2023-07-27 + +### Added + +- Rerunning now uses a reconciliation phase to allow more leeway in changing a module between runs +- Deployments against real networks are recorded to `./ignition/deployments/`, including recording the deployed addresses and the artifacts (i.e. abi, build-info etc) used for each contract deploy + +### Changed + +- The _Module API_ has went through considerable restructuring, including _breaking changes_, please see the `./docs` for more details +- The plan task has been enhanced to give a module centric view rather than the lower level execution that was previously shown +- The _ui_ during a deployment has been reduced to showing the results, the full UI will be brought back in a coming release + ## 0.0.13 - 2023-04-18 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 662c5d88e6..69f5ab0097 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.0.13", + "version": "0.1.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -34,8 +34,8 @@ "prepack": "npm run build" }, "devDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@ignored/ignition-ui": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-ui": "^0.1.0", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -74,8 +74,8 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.0.13", - "@ignored/ignition-ui": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-ui": "^0.1.0", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" }, diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md new file mode 100644 index 0000000000..83385f50ec --- /dev/null +++ b/packages/ui/CHANGELOG.md @@ -0,0 +1,11 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## 0.1.0 - 2023-07-27 + +### Added + +- A UI used to display plans of Ignition deployments diff --git a/packages/ui/package.json b/packages/ui/package.json index c0880aac43..7bd0bea842 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-ui", - "version": "0.0.13", + "version": "0.1.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -14,7 +14,7 @@ "prepack": "npm run build" }, "dependencies": { - "@ignored/ignition-core": "^0.0.13", + "@ignored/ignition-core": "^0.1.0", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", From 1bd539752bd63860a6146931785e1997c7f61104 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sat, 29 Jul 2023 23:55:34 +0100 Subject: [PATCH 0588/1302] fix: allow readEventArg as address in contractAt(FromArtifact) We were assuming either a deployment execution state or a contract at execution state when resolving the address of a contractAt or contractAtFromArtifact future. A check has been added to see if the address is a readEventArg, then resolves the result and checks it is a valid address string. Fixes #354. --- .../internal/execution/execution-engine.ts | 93 +++++++++++++++---- packages/hardhat-plugin/test/events.ts | 61 ++++++++++++ .../minimal-new-api/contracts/Factory.sol | 19 ++++ 3 files changed, 153 insertions(+), 20 deletions(-) create mode 100644 packages/hardhat-plugin/test/events.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index a8510c0e89..2c2110fd90 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -6,6 +6,7 @@ import uniq from "lodash/uniq"; import { IgnitionError } from "../../../errors"; import { + isFuture, isFutureThatSubmitsOnchainTransaction, isModuleParameterRuntimeValue, } from "../../type-guards"; @@ -30,6 +31,7 @@ import { isCallExecutionState, isContractAtExecutionState, isDeploymentExecutionState, + isReadEventArgumentExecutionState, isSendDataExecutionState, isStaticCallExecutionState, } from "../type-guards"; @@ -53,6 +55,7 @@ import { StartRunMessage, TransactionMessage, } from "../types/journal"; +import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; @@ -819,17 +822,42 @@ export class ExecutionEngine { address = resolveModuleParameter(future.address, { deploymentParameters, }) as string; - } else { - const { contractAddress } = executionStateMap[ - future.address.id - ] as DeploymentExecutionState; + } else if (isFuture(future.address)) { + const exState = executionStateMap[future.address.id]; - assertIgnitionInvariant( - contractAddress !== undefined, - `Internal error - dependency ${future.address.id} used before it's resolved` - ); - - address = contractAddress; + if ( + isDeploymentExecutionState(exState) || + isContractAtExecutionState(exState) + ) { + const contractAddress = exState.contractAddress; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.address.id} used before it's resolved` + ); + + address = contractAddress; + } else if (isReadEventArgumentExecutionState(exState)) { + const contractAddress = exState.result; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ReadEventArgument ${future.address.id} used before it's resolved` + ); + + assertIgnitionInvariant( + typeof contractAddress === "string" && isAddress(contractAddress), + `Read event argument ${future.address.id} must be a valid address` + ); + + address = contractAddress; + } else { + throw new IgnitionError( + `Cannot resolve address of ${future.id}, not an allowed future type ${future.address.type}` + ); + } + } else { + throw new IgnitionError(`Unable to resolve address of ${future.id}`); } await this._storeArtifactAndBuildInfoAgainstDeployment(future, { @@ -859,17 +887,42 @@ export class ExecutionEngine { address = resolveModuleParameter(future.address, { deploymentParameters, }) as string; - } else { - const { contractAddress } = executionStateMap[ - future.address.id - ] as DeploymentExecutionState; + } else if (isFuture(future.address)) { + const exState = executionStateMap[future.address.id]; - assertIgnitionInvariant( - contractAddress !== undefined, - `Internal error - dependency ${future.address.id} used before it's resolved` - ); - - address = contractAddress; + if ( + isDeploymentExecutionState(exState) || + isContractAtExecutionState(exState) + ) { + const contractAddress = exState.contractAddress; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ${future.address.id} used before it's resolved` + ); + + address = contractAddress; + } else if (isReadEventArgumentExecutionState(exState)) { + const contractAddress = exState.result; + + assertIgnitionInvariant( + contractAddress !== undefined, + `Internal error - dependency ReadEventArgument ${future.address.id} used before it's resolved` + ); + + assertIgnitionInvariant( + typeof contractAddress === "string" && isAddress(contractAddress), + `Read event argument ${future.address.id} must be a valid address` + ); + + address = contractAddress; + } else { + throw new IgnitionError( + `Cannot resolve address of ${future.id}, not an allowed future type ${future.address.type}` + ); + } + } else { + throw new IgnitionError(`Unable to resolve address of ${future.id}`); } await deploymentLoader.storeUserProvidedArtifact( diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/events.ts new file mode 100644 index 0000000000..501bca5064 --- /dev/null +++ b/packages/hardhat-plugin/test/events.ts @@ -0,0 +1,61 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./use-ignition-project"; + +describe("events", () => { + useEphemeralIgnitionProject("minimal-new-api"); + + it("should be able to use the output of a readEvent in a contract at", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.readEventArgument( + createCall, + "Deployed", + "fooAddress" + ); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); + + it("should be able to use the output of a readEvent in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.readEventArgument( + createCall, + "Deployed", + "fooAddress" + ); + + const foo = m.contractAtFromArtifact("Foo", newAddress, artifact); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol new file mode 100644 index 0000000000..a7e601c6f6 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +import "./Contracts.sol"; + +contract FooFactory { + event Deployed(address indexed fooAddress); + + function create() public { + Foo foo = new Foo(); + + emit Deployed(address(foo)); + } + + function isDeployed() public pure returns (bool output) { + return true; + } +} From 19cc33a2480da425223773d2a7f1201162bf3655 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sun, 30 Jul 2023 14:19:55 +0100 Subject: [PATCH 0589/1302] chore: bump version to v0.1.1 Update the packages versions and changelogs for the `0.1.1 - 2023-07-30` release. --- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/uniswap/package.json | 4 ++-- package-lock.json | 36 ++++++++++++++-------------- packages/core/CHANGELOG.md | 6 +++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 6 +++++ packages/hardhat-plugin/package.json | 10 ++++---- packages/ui/package.json | 4 ++-- 11 files changed, 48 insertions(+), 36 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 6302d65b99..2a07bcdc89 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.0.13", + "version": "0.1.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 4d8d79296d..fd0e8df939 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.0.13", + "version": "0.1.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 30397cfd04..96bd61977f 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.0.13", + "version": "0.1.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 25eae0fdca..2e6e47dd24 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.0.13", + "version": "0.1.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index ac45798d02..00fe8135f7 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.0.13", + "version": "0.1.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 7561cb2e57..782d1355ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.0.13", + "version": "0.1.1", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -54,12 +54,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.0.13", + "version": "0.1.1", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -81,9 +81,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.0.13", + "version": "0.1.1", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -91,9 +91,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.0.13", + "version": "0.1.1", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -101,7 +101,7 @@ }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.0.13", + "version": "0.1.1", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -113,7 +113,7 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.0", + "@ignored/hardhat-ignition": "^0.1.1", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -21011,7 +21011,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21094,7 +21094,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -21108,8 +21108,8 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.1.0", - "@ignored/ignition-ui": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-ui": "^0.1.1", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -21151,8 +21151,8 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.1.0", - "@ignored/ignition-ui": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-ui": "^0.1.1", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" } @@ -21302,9 +21302,9 @@ }, "packages/ui": { "name": "@ignored/ignition-ui", - "version": "0.1.0", + "version": "0.1.1", "dependencies": { - "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 16d65b1a79..b20b2da8cf 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.1.0 - 2023-07-30 + +### Fixed + +- Fix validation error when using the result of a `readEventArgument` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/354)) + ## 0.1.0 - 2023-07-27 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index e2925f3454..680f007777 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 47ca342e99..392551f575 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.1.0 - 2023-07-30 + +### Fixed + +- Fix validation error when using the result of a `readEventArgument` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/354)) + ## 0.1.0 - 2023-07-27 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 69f5ab0097..f2aedaef8f 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -34,8 +34,8 @@ "prepack": "npm run build" }, "devDependencies": { - "@ignored/ignition-core": "^0.1.0", - "@ignored/ignition-ui": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-ui": "^0.1.1", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -74,8 +74,8 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.1.0", - "@ignored/ignition-ui": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-ui": "^0.1.1", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" }, diff --git a/packages/ui/package.json b/packages/ui/package.json index 7bd0bea842..cc70ca1853 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-ui", - "version": "0.1.0", + "version": "0.1.1", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -14,7 +14,7 @@ "prepack": "npm run build" }, "dependencies": { - "@ignored/ignition-core": "^0.1.0", + "@ignored/ignition-core": "^0.1.1", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", From ada743c787b9a5f854da23672e8ceb1dc5865156 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 30 Jul 2023 13:02:37 -0400 Subject: [PATCH 0590/1302] fix: allow staticCall as address in contractAt(FromArtifact) --- .../internal/execution/chain-dispatcher.ts | 6 +- .../internal/execution/execution-engine.ts | 18 ++- .../minimal-new-api/contracts/Factory.sol | 6 + packages/hardhat-plugin/test/static-calls.ts | 105 ++++++++++++++++++ 4 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 packages/hardhat-plugin/test/static-calls.ts diff --git a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts index f9cb645921..f55d4bc87e 100644 --- a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts @@ -168,7 +168,11 @@ export class ChainDispatcherImpl implements ChainDispatcher { const contractInstance = new Contract(contractAddress, abi, signer); - const result = await contractInstance[functionName](...args, { + const validFunctionName = functionName.endsWith("()") + ? functionName + : `${functionName}()`; + + const result = await contractInstance[validFunctionName](...args, { from, }); diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 2c2110fd90..0c5936198d 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -837,17 +837,20 @@ export class ExecutionEngine { ); address = contractAddress; - } else if (isReadEventArgumentExecutionState(exState)) { + } else if ( + isReadEventArgumentExecutionState(exState) || + isStaticCallExecutionState(exState) + ) { const contractAddress = exState.result; assertIgnitionInvariant( contractAddress !== undefined, - `Internal error - dependency ReadEventArgument ${future.address.id} used before it's resolved` + `Internal error - dependency ${future.address.id} used before it's resolved` ); assertIgnitionInvariant( typeof contractAddress === "string" && isAddress(contractAddress), - `Read event argument ${future.address.id} must be a valid address` + `Future '${future.address.id}' must be a valid address` ); address = contractAddress; @@ -902,17 +905,20 @@ export class ExecutionEngine { ); address = contractAddress; - } else if (isReadEventArgumentExecutionState(exState)) { + } else if ( + isReadEventArgumentExecutionState(exState) || + isStaticCallExecutionState(exState) + ) { const contractAddress = exState.result; assertIgnitionInvariant( contractAddress !== undefined, - `Internal error - dependency ReadEventArgument ${future.address.id} used before it's resolved` + `Internal error - dependency ${future.address.id} used before it's resolved` ); assertIgnitionInvariant( typeof contractAddress === "string" && isAddress(contractAddress), - `Read event argument ${future.address.id} must be a valid address` + `Future '${future.address.id}' must be a valid address` ); address = contractAddress; diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol index a7e601c6f6..2bbff94ae7 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol @@ -7,9 +7,15 @@ import "./Contracts.sol"; contract FooFactory { event Deployed(address indexed fooAddress); + address public deployed; + + bool public nonAddressResult; + function create() public { Foo foo = new Foo(); + deployed = address(foo); + emit Deployed(address(foo)); } diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts new file mode 100644 index 0000000000..25b619272b --- /dev/null +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -0,0 +1,105 @@ +/* eslint-disable import/no-unused-modules */ +import { defineModule } from "@ignored/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./use-ignition-project"; + +describe("static calls", () => { + useEphemeralIgnitionProject("minimal-new-api"); + + it("should be able to use the output of a static call in a contract at", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "deployed", [], { + after: [createCall], + }); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); + + it("should be able to use the output of a static call in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "deployed", [], { + after: [createCall], + }); + + const foo = m.contractAtFromArtifact("Foo", newAddress, artifact); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); + + it("should not be able to use the output of a non-address static call in a contract at", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const nonAddress = m.staticCall(fooFactory, "nonAddressResult", [], { + after: [createCall], + }); + + const foo = m.contractAt("Foo", nonAddress); + + return { fooFactory, foo }; + }); + + await assert.isRejected( + this.deploy(moduleDefinition), + /Future 'FooModule:FooFactory#nonAddressResult' must be a valid address/ + ); + }); + + it("should not be able to use the output of a non-address static call in an artifact contract at", async function () { + const artifact = await this.hre.artifacts.readArtifact("Foo"); + + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const nonAddress = m.staticCall(fooFactory, "nonAddressResult", [], { + after: [createCall], + }); + + const foo = m.contractAtFromArtifact("Foo", nonAddress, artifact); + + return { fooFactory, foo }; + }); + + await assert.isRejected( + this.deploy(moduleDefinition), + /Future 'FooModule:FooFactory#nonAddressResult' must be a valid address/ + ); + }); +}); From b21eada8d0b5b62f92e29b001addd9d91d60d4b1 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 31 Jul 2023 18:01:40 +0000 Subject: [PATCH 0591/1302] Add .d.ts extension to a subpath type export --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index 680f007777..d1277b15f7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -27,7 +27,7 @@ "typesVersions": { "*": { "ui-helpers": [ - "./dist/src/ui-helpers" + "./dist/src/ui-helpers.d.ts" ] } }, From b3a393e53c15c3e10f376faf71a94181073cb2ba Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 31 Jul 2023 18:02:05 +0000 Subject: [PATCH 0592/1302] Remove engines fields --- packages/core/package.json | 3 --- packages/hardhat-plugin/package.json | 3 --- 2 files changed, 6 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index d1277b15f7..c3863dd898 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -15,9 +15,6 @@ "solidity", "deployment" ], - "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - }, "main": "./dist/src/index.js", "types": "./dist/src/index.d.ts", "exports": { diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f2aedaef8f..a8ab3dba6b 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -15,9 +15,6 @@ "solidity", "deployment" ], - "engines": { - "node": "^14.0.0 || ^16.0.0 || ^18.0.0" - }, "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "scripts": { From 437df17de004c161d4e857fc17994f519d665fa9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 31 Jul 2023 17:42:17 -0400 Subject: [PATCH 0593/1302] add a temp fix to support static calls with parameters --- .../internal/execution/chain-dispatcher.ts | 20 ++++++-- .../minimal-new-api/contracts/Factory.sol | 2 + packages/hardhat-plugin/test/static-calls.ts | 46 +++++++++++++++++++ 3 files changed, 65 insertions(+), 3 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts index f55d4bc87e..8db43f1f39 100644 --- a/packages/core/src/new-api/internal/execution/chain-dispatcher.ts +++ b/packages/core/src/new-api/internal/execution/chain-dispatcher.ts @@ -168,9 +168,23 @@ export class ChainDispatcherImpl implements ChainDispatcher { const contractInstance = new Contract(contractAddress, abi, signer); - const validFunctionName = functionName.endsWith("()") - ? functionName - : `${functionName}()`; + // todo: temp fix + // if user provided a function name with parenthesis, assume they know what they're doing + // if not, add the open parenthesis for the regex test + const userFnOrNormalized = functionName.endsWith(")") + ? functionName.replace("(", "\\(").replace(")", "\\)") + : `${functionName}\\(`; + + const matchingFunctions = Object.keys(contractInstance).filter((key) => + new RegExp(userFnOrNormalized).test(key) + ); + + assertIgnitionInvariant( + matchingFunctions.length === 1, + "Ignition does not yet support overloaded static calls" + ); + + const [validFunctionName] = matchingFunctions; const result = await contractInstance[validFunctionName](...args, { from, diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol index 2bbff94ae7..75105edba6 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/contracts/Factory.sol @@ -8,6 +8,7 @@ contract FooFactory { event Deployed(address indexed fooAddress); address public deployed; + address[] public allDeployed; bool public nonAddressResult; @@ -15,6 +16,7 @@ contract FooFactory { Foo foo = new Foo(); deployed = address(foo); + allDeployed.push(address(foo)); emit Deployed(address(foo)); } diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index 25b619272b..8320821db6 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -55,6 +55,52 @@ describe("static calls", () => { assert.equal(await result.foo.x(), Number(1)); }); + it("should be able to use the output of a static call function in a contract at (with arg)", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "allDeployed", [0], { + after: [createCall], + }); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); + + it("should be able to use the output of a static call function in a contract at (with function signature)", async function () { + const moduleDefinition = defineModule("FooModule", (m) => { + const account1 = m.getAccount(1); + + const fooFactory = m.contract("FooFactory", [], { from: account1 }); + + const createCall = m.call(fooFactory, "create", []); + + const newAddress = m.staticCall(fooFactory, "allDeployed(uint256)", [0], { + after: [createCall], + }); + + const foo = m.contractAt("Foo", newAddress); + + return { fooFactory, foo }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.equal(await result.fooFactory.isDeployed(), true); + assert.equal(await result.foo.x(), Number(1)); + }); + it("should not be able to use the output of a non-address static call in a contract at", async function () { const moduleDefinition = defineModule("FooModule", (m) => { const account1 = m.getAccount(1); From 4f1ba0a44cf7c0273c33d7b51ebcffef493b609c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 31 Jul 2023 18:07:16 -0400 Subject: [PATCH 0594/1302] chore: bump version to v0.1.2 Update the packages versions and changelogs for the `0.1.2 - 2023-07-31` release. --- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/uniswap/package.json | 4 ++-- package-lock.json | 36 ++++++++++++++-------------- packages/core/CHANGELOG.md | 9 ++++++- packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 9 ++++++- packages/hardhat-plugin/package.json | 10 ++++---- packages/ui/package.json | 4 ++-- 11 files changed, 52 insertions(+), 38 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 2a07bcdc89..daf9262176 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index fd0e8df939..026b1b3f54 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 96bd61977f..04156dff7d 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 2e6e47dd24..6400ae6670 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index 00fe8135f7..ce79a75402 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.1.1", + "version": "0.1.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 782d1355ef..763f5cb780 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.1.1", + "version": "0.1.2", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -54,12 +54,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.1.1", + "version": "0.1.2", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -81,9 +81,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.1.1", + "version": "0.1.2", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -91,9 +91,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.1.1", + "version": "0.1.2", "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -101,7 +101,7 @@ }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.1.1", + "version": "0.1.2", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -113,7 +113,7 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.1.1", + "@ignored/hardhat-ignition": "^0.1.2", "@nomicfoundation/hardhat-toolbox": "2.0.2", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -21011,7 +21011,7 @@ }, "packages/core": { "name": "@ignored/ignition-core", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21094,7 +21094,7 @@ }, "packages/hardhat-plugin": { "name": "@ignored/hardhat-ignition", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -21108,8 +21108,8 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.1.1", - "@ignored/ignition-ui": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", + "@ignored/ignition-ui": "^0.1.2", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -21151,8 +21151,8 @@ "node": "^14.0.0 || ^16.0.0 || ^18.0.0" }, "peerDependencies": { - "@ignored/ignition-core": "^0.1.1", - "@ignored/ignition-ui": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", + "@ignored/ignition-ui": "^0.1.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" } @@ -21302,9 +21302,9 @@ }, "packages/ui": { "name": "@ignored/ignition-ui", - "version": "0.1.1", + "version": "0.1.2", "dependencies": { - "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b20b2da8cf..3ee3ee8400 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,7 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## 0.1.0 - 2023-07-30 +## 0.1.2 - 2023-07-31 + +### Fixed + +- Fix validation error when using the result of a `staticCall` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/357)) +- Fix bug in `staticCall` execution logic preventing successful execution + +## 0.1.1 - 2023-07-30 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 680f007777..80d63c8027 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-core", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 392551f575..76388641ba 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,7 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). -## 0.1.0 - 2023-07-30 +## 0.1.2 - 2023-07-31 + +### Fixed + +- Fix validation error when using the result of a `staticCall` as the address of a `contractAt`/`contractAtFromArtifact` ([#354](https://github.com/NomicFoundation/ignition/issues/357)) +- Fix bug in `staticCall` execution logic preventing successful execution + +## 0.1.1 - 2023-07-30 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f2aedaef8f..a872c2533c 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/hardhat-ignition", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -34,8 +34,8 @@ "prepack": "npm run build" }, "devDependencies": { - "@ignored/ignition-core": "^0.1.1", - "@ignored/ignition-ui": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", + "@ignored/ignition-ui": "^0.1.2", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "@types/chai": "^4.2.22", @@ -74,8 +74,8 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.1.1", - "@ignored/ignition-ui": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", + "@ignored/ignition-ui": "^0.1.2", "@nomiclabs/hardhat-ethers": "^2.0.2", "hardhat": "^2.14.0" }, diff --git a/packages/ui/package.json b/packages/ui/package.json index cc70ca1853..00c918b240 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@ignored/ignition-ui", - "version": "0.1.1", + "version": "0.1.2", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -14,7 +14,7 @@ "prepack": "npm run build" }, "dependencies": { - "@ignored/ignition-core": "^0.1.1", + "@ignored/ignition-core": "^0.1.2", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", From 1d160dbe19a06075c866d92976f363d4b7b895e2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 3 Aug 2023 00:56:49 -0400 Subject: [PATCH 0595/1302] added a simple test for complete example --- examples/complete/test/Complete.js | 41 +++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/examples/complete/test/Complete.js b/examples/complete/test/Complete.js index 3888a7941f..f72f3c15d0 100644 --- a/examples/complete/test/Complete.js +++ b/examples/complete/test/Complete.js @@ -1 +1,40 @@ -describe.skip("Complete", function () {}); +const { loadFixture } = require("@nomicfoundation/hardhat-network-helpers"); +const { expect } = require("chai"); +const CompleteModule = require("../ignition/CompleteModule"); + +describe("Complete", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployCompleteFixture() { + const { + basic, + library, + libFromArtifact, + withLib, + duplicate, + duplicateWithLib, + } = await ignition.deploy(CompleteModule); + + return { + basic, + library, + libFromArtifact, + withLib, + duplicate, + duplicateWithLib, + }; + } + + it("Should transfer funds to the BasicContract", async () => { + const { basic } = await loadFixture(deployCompleteFixture); + + expect(await ethers.provider.getBalance(basic.address)).to.equal(123n); + }); + + it("Should add two to a given number", async () => { + const { withLib } = await loadFixture(deployCompleteFixture); + + expect(await withLib.readonlyFunction(40)).to.equal(42); + }); +}); From 6e6bf39c8b3e595adb5f519b92ff56f42b8bab1a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 2 Aug 2023 01:06:53 -0400 Subject: [PATCH 0596/1302] rename all instances of defineModule to buildModule --- examples/complete/ignition/CompleteModule.js | 4 +- examples/ens/ignition/ENS.js | 10 +-- examples/ens/ignition/test-registrar.js | 4 +- examples/uniswap/ignition/Uniswap.js | 4 +- packages/core/src/index.ts | 2 +- .../{define-module.ts => build-module.ts} | 14 +--- .../src/new-api/internal/module-builder.ts | 2 +- packages/core/test/new-api/batcher.ts | 24 +++--- packages/core/test/new-api/call.ts | 66 +++++++-------- packages/core/test/new-api/contract.ts | 64 +++++++-------- packages/core/test/new-api/contractAt.ts | 26 +++--- .../test/new-api/contractAtFromArtifact.ts | 26 +++--- .../core/test/new-api/contractFromArtifact.ts | 64 +++++++-------- .../new-api/execution/execution-engine.ts | 36 ++++----- .../core/test/new-api/execution/restart.ts | 6 +- packages/core/test/new-api/getAccount.ts | 4 +- packages/core/test/new-api/getParameter.ts | 12 +-- packages/core/test/new-api/library.ts | 24 +++--- .../core/test/new-api/libraryFromArtifact.ts | 24 +++--- .../core/test/new-api/readEventArgument.ts | 22 ++--- .../futures/reconcileArtifactContractAt.ts | 12 +-- .../reconcileArtifactContractDeployment.ts | 16 ++-- .../reconcileArtifactLibraryDeployment.ts | 12 +-- .../futures/reconcileNamedContractAt.ts | 12 +-- .../futures/reconcileNamedContractCall.ts | 16 ++-- .../reconcileNamedContractDeployment.ts | 16 ++-- .../reconcileNamedLibraryDeployment.ts | 12 +-- .../futures/reconcileNamedStaticCall.ts | 16 ++-- .../futures/reconcileReadEventArgument.ts | 16 ++-- .../futures/reconcileSendData.ts | 14 ++-- .../test/new-api/reconciliation/reconciler.ts | 32 ++++---- packages/core/test/new-api/send.ts | 40 +++++----- packages/core/test/new-api/staticCall.ts | 60 +++++++------- .../new-api/stored-deployment-serializer.ts | 80 +++++++++---------- packages/core/test/new-api/useModule.ts | 26 +++--- packages/core/test/new-api/wipe.ts | 4 +- packages/hardhat-plugin/src/index.ts | 2 +- packages/hardhat-plugin/test/calls.ts | 16 ++-- packages/hardhat-plugin/test/contracts.ts | 18 ++--- .../hardhat-plugin/test/error-handling.ts | 8 +- packages/hardhat-plugin/test/events.ts | 6 +- .../deploy-contract-at-from-artifact.ts | 6 +- .../test/execution/deploy-contract-at.ts | 6 +- .../deploy-contract-from-artifact.ts | 4 +- .../test/execution/deploy-contract.ts | 4 +- .../multiple-batch-contract-deploy.ts | 4 +- .../error-on-pending-user-transactions.ts | 4 +- ...-with-replaced-pending-user-transaction.ts | 4 +- .../error-on-transaction-dropped.ts | 4 +- .../error-on-user-transaction-sent.ts | 4 +- ...rerun-with-dropped-ignition-transaction.ts | 4 +- ...with-now-complete-ignition-transactions.ts | 4 +- ...erun-with-pending-ignition-transactions.ts | 4 +- ...ith-replaced-confirmed-user-transaction.ts | 4 +- .../timeouts/deploy-run-times-out.ts | 4 +- .../timeouts/rerun-a-deploy-that-timed-out.ts | 4 +- .../hardhat-plugin/test/existing-contract.ts | 6 +- .../minimal-new-api/ignition/MyModule.js | 4 +- packages/hardhat-plugin/test/libraries.ts | 12 +-- packages/hardhat-plugin/test/params.ts | 14 ++-- packages/hardhat-plugin/test/static-calls.ts | 14 ++-- packages/hardhat-plugin/test/use-module.ts | 12 +-- packages/ui/examples/ComplexModule.js | 10 +-- 63 files changed, 498 insertions(+), 510 deletions(-) rename packages/core/src/new-api/{define-module.ts => build-module.ts} (75%) diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 075fe2d58b..20568a2d19 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -1,10 +1,10 @@ // ./ignition/CompleteModule.js -const { defineModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const withLibArtifact = require("../libArtifacts/ContractWithLibrary.json"); const libArtifact = require("../libArtifacts/BasicLibrary.json"); -module.exports = defineModule("CompleteModule", (m) => { +module.exports = buildModule("CompleteModule", (m) => { const basic = m.contract("BasicContract"); const library = m.library("BasicLibrary"); const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact, { diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 6d9fcee90c..0262ad520f 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { defineModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; @@ -16,13 +16,13 @@ const ZERO_ADDRESS = "0x0000000000000000000000000000000000000000"; const ZERO_HASH = "0x0000000000000000000000000000000000000000000000000000000000000000"; -const registryModule = defineModule("REGISTRY", (m) => { +const registryModule = buildModule("REGISTRY", (m) => { const ens = m.contract("ENSRegistry"); return { ens }; }); -const resolverModule = defineModule("RESOLVER", (m) => { +const resolverModule = buildModule("RESOLVER", (m) => { const { ens } = m.useModule(registryModule); const account = m.getAccount(0); @@ -40,7 +40,7 @@ const resolverModule = defineModule("RESOLVER", (m) => { return { resolver }; }); -const reverseRegistrarModule = defineModule("REVERSEREGISTRAR", (m) => { +const reverseRegistrarModule = buildModule("REVERSEREGISTRAR", (m) => { const account = m.getAccount(0); const { ens } = m.useModule(registryModule); @@ -65,7 +65,7 @@ const reverseRegistrarModule = defineModule("REVERSEREGISTRAR", (m) => { return { reverseRegistrar }; }); -module.exports = defineModule("ENS", (m) => { +module.exports = buildModule("ENS", (m) => { const { ens } = m.useModule(registryModule); const { resolver } = m.useModule(resolverModule); const { reverseRegistrar } = m.useModule(reverseRegistrarModule); diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js index 34195289ba..3eaf2bf737 100644 --- a/examples/ens/ignition/test-registrar.js +++ b/examples/ens/ignition/test-registrar.js @@ -1,4 +1,4 @@ -const { defineModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const setupENSRegistry = require("./ENS"); @@ -11,7 +11,7 @@ const ZERO_HASH = const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -module.exports = defineModule("`TEST` registrar", (m) => { +module.exports = buildModule("`TEST` registrar", (m) => { const tld = "test"; const tldHash = namehash.hash(tld); const tldLabel = labelhash(tld); diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js index 491ce05412..04b35f8e28 100644 --- a/examples/uniswap/ignition/Uniswap.js +++ b/examples/uniswap/ignition/Uniswap.js @@ -1,4 +1,4 @@ -const { defineModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@ignored/hardhat-ignition"); const UniswapV3Factory = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json"); const UniswapInterfaceMulticall = require("@uniswap/v3-periphery/artifacts/contracts/lens/UniswapInterfaceMulticall.sol/UniswapInterfaceMulticall.json"); @@ -42,7 +42,7 @@ function asciiStringToBytes32(str) { return "0x" + Buffer.from(str, "ascii").toString("hex").padEnd(64, "0"); } -module.exports = defineModule("Uniswap", (m) => { +module.exports = buildModule("Uniswap", (m) => { const owner = m.getAccount(0); const v2CoreFactoryAddress = ADDRESS_ZERO; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c9cdcf9c49..1c3dd1c244 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ export * from "./errors"; -export { defineModule, buildModule } from "./new-api/define-module"; +export { buildModule } from "./new-api/build-module"; export { deploy } from "./new-api/deploy"; export { wipe } from "./new-api/wipe"; /* TODO: how is module constructor getting exposed? */ diff --git a/packages/core/src/new-api/define-module.ts b/packages/core/src/new-api/build-module.ts similarity index 75% rename from packages/core/src/new-api/define-module.ts rename to packages/core/src/new-api/build-module.ts index 53febb5293..fa7e0fecd5 100644 --- a/packages/core/src/new-api/define-module.ts +++ b/packages/core/src/new-api/build-module.ts @@ -16,7 +16,7 @@ import { * * @beta */ -export function defineModule< +export function buildModule< ModuleIdT extends string, ContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult @@ -34,15 +34,3 @@ export function defineModule< return { id: moduleId, moduleDefintionFunction }; } - -/** - * Construct a module definition that can be deployed through Ignition. - * - * @param moduleId - the id of the module - * @param moduleDefintionFunction - a function accepting the - * IgnitionModuleBuilder to configure the deployment - * @returns a module definition - * - * @beta - */ -export const buildModule = defineModule; diff --git a/packages/core/src/new-api/internal/module-builder.ts b/packages/core/src/new-api/internal/module-builder.ts index 3ea5bb9db8..2c0a06c1a8 100644 --- a/packages/core/src/new-api/internal/module-builder.ts +++ b/packages/core/src/new-api/internal/module-builder.ts @@ -122,7 +122,7 @@ export class ModuleConstructor { if ((mod as any).results instanceof Promise) { throw new IgnitionError( - `The callback passed to 'defineModule' for ${moduleDefintion.id} returns a Promise; async callbacks are not allowed in 'defineModule'.` + `The callback passed to 'buildModule' for ${moduleDefintion.id} returns a Promise; async callbacks are not allowed in 'buildModule'.` ); } diff --git a/packages/core/test/new-api/batcher.ts b/packages/core/test/new-api/batcher.ts index cf791ddf48..482a2aca55 100644 --- a/packages/core/test/new-api/batcher.ts +++ b/packages/core/test/new-api/batcher.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { Batcher } from "../../src/new-api/internal/batcher"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { @@ -35,7 +35,7 @@ describe("batcher", () => { }; it("should batch a contract deploy module", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -45,7 +45,7 @@ describe("batcher", () => { }); it("should batch through dependencies", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); @@ -70,21 +70,21 @@ describe("batcher", () => { }); it("should batch submodules such that everything in a submodule is executed if just one future in the submodule is depended on", () => { - const submoduleLeft = defineModule("SubmoduleLeft", (m) => { + const submoduleLeft = buildModule("SubmoduleLeft", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "configure"); return { contract1 }; }); - const submoduleRight = defineModule("SubmoduleRight", (m) => { + const submoduleRight = buildModule("SubmoduleRight", (m) => { const contract2 = m.contract("Contract2"); m.call(contract2, "configure"); return { contract2 }; }); - const submoduleMiddle = defineModule("SubmoduleMiddle", (m) => { + const submoduleMiddle = buildModule("SubmoduleMiddle", (m) => { const { contract1 } = m.useModule(submoduleLeft); const { contract2 } = m.useModule(submoduleRight); @@ -94,7 +94,7 @@ describe("batcher", () => { return { contract3 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract3 } = m.useModule(submoduleMiddle); const contract4 = m.contract("Contract4", [contract3]); @@ -117,19 +117,19 @@ describe("batcher", () => { }); it("should deploy submodules even when no direct connection", () => { - const submoduleLeft = defineModule("Left", (m) => { + const submoduleLeft = buildModule("Left", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const submoduleRight = defineModule("Right", (m) => { + const submoduleRight = buildModule("Right", (m) => { const contract2 = m.contract("Contract2"); return { contract2 }; }); - const submoduleMiddle = defineModule("Middle", (m) => { + const submoduleMiddle = buildModule("Middle", (m) => { m.useModule(submoduleLeft); m.useModule(submoduleRight); @@ -138,7 +138,7 @@ describe("batcher", () => { return { contract3 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract3 } = m.useModule(submoduleMiddle); const contract4 = m.contract("Contract4", [contract3]); @@ -153,7 +153,7 @@ describe("batcher", () => { }); it("should bypass intermediary successful nodes", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [contract1]); diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 677d704d60..03f8e4ff52 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -17,7 +17,7 @@ import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("call", () => { it("should be able to setup a contract call", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "test"); @@ -55,7 +55,7 @@ describe("call", () => { }); it("should be able to pass one contract as an arg dependency to a call", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -96,7 +96,7 @@ describe("call", () => { }); it("should be able to pass one contract as an after dependency of a call", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -137,7 +137,7 @@ describe("call", () => { }); it("should be able to pass value as an option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -167,7 +167,7 @@ describe("call", () => { }); it("Should be able to pass an ModuleParameterRuntimeValue as a value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -200,7 +200,7 @@ describe("call", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -230,7 +230,7 @@ describe("call", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -262,7 +262,7 @@ describe("call", () => { describe("Arguments", () => { it("Should support base values as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [1, true, "string", 4n]); @@ -281,7 +281,7 @@ describe("call", () => { }); it("Should support arrays as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [[1, 2, 3n]]); @@ -300,7 +300,7 @@ describe("call", () => { }); it("Should support objects as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [{ a: 1, b: [1, 2] }]); @@ -319,7 +319,7 @@ describe("call", () => { }); it("Should support futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [contract1]); @@ -338,7 +338,7 @@ describe("call", () => { }); it("should support nested futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [{ arr: [contract1] }]); @@ -357,7 +357,7 @@ describe("call", () => { }); it("should support AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [account1]); @@ -378,7 +378,7 @@ describe("call", () => { }); it("should support nested AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [{ arr: [account1] }]); @@ -402,7 +402,7 @@ describe("call", () => { }); it("should support ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [p]); @@ -427,7 +427,7 @@ describe("call", () => { }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1"); m.call(contract1, "foo", [{ arr: [p] }]); @@ -453,7 +453,7 @@ describe("call", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { - const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.call(sameContract1, "test", [], { id: "first" }); @@ -482,7 +482,7 @@ describe("call", () => { }); it("should throw if the same function is called twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.call(sameContract1, "test"); m.call(sameContract1, "test"); @@ -499,7 +499,7 @@ describe("call", () => { }); it("should throw if a call tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.call(sameContract1, "test", [], { id: "first" }); m.call(sameContract1, "test", [], { id: "first" }); @@ -517,7 +517,7 @@ describe("call", () => { describe("validation", () => { it("should not validate a non-bignumber value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -536,7 +536,7 @@ describe("call", () => { }); it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -555,7 +555,7 @@ describe("call", () => { }); it("should not validate a non-contract", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -576,7 +576,7 @@ describe("call", () => { }); it("should not validate a non-existant hardhat contract", async () => { - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); m.call(another, "test"); @@ -607,7 +607,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p"); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -640,7 +640,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -681,7 +681,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p", 42n); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -727,7 +727,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p", true); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -759,7 +759,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p"); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -808,7 +808,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const p = m.getParameter("p", true); const another = m.contractFromArtifact("Another", fakeArtifact, []); @@ -842,7 +842,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.call(another, "test"); @@ -887,7 +887,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.call(another, "inc", [1, 2]); @@ -950,7 +950,7 @@ describe("call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.call(another, "inc", [1, 2, 3]); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index f58e01a00f..40c35fba78 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -17,7 +17,7 @@ import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("contract", () => { it("should be able to setup a deploy contract call", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -49,7 +49,7 @@ describe("contract", () => { }); it("should be able to pass one contract as an arg dependency to another", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -85,7 +85,7 @@ describe("contract", () => { }); it("should be able to pass one contract as an after dependency of another", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -121,7 +121,7 @@ describe("contract", () => { }); it("should be able to pass a library as a dependency of a contract", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -160,7 +160,7 @@ describe("contract", () => { }); it("should be able to pass value as an option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { value: BigInt(42) }); @@ -190,7 +190,7 @@ describe("contract", () => { }); it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { @@ -225,7 +225,7 @@ describe("contract", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { from: "0x2" }); @@ -255,7 +255,7 @@ describe("contract", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { from: m.getAccount(1) }); @@ -287,7 +287,7 @@ describe("contract", () => { describe("Arguments", () => { it("Should support base values as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [1, true, "string", 4n]); return { contract1 }; @@ -305,7 +305,7 @@ describe("contract", () => { }); it("Should support arrays as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [[1, 2, 3n]]); return { contract1 }; @@ -318,7 +318,7 @@ describe("contract", () => { }); it("Should support objects as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [{ a: 1, b: [1, 2] }]); return { contract1 }; @@ -334,7 +334,7 @@ describe("contract", () => { }); it("Should support futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [contract1]); @@ -351,7 +351,7 @@ describe("contract", () => { }); it("should support nested futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [{ arr: [contract1] }]); @@ -368,7 +368,7 @@ describe("contract", () => { }); it("should support AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [account1]); @@ -386,7 +386,7 @@ describe("contract", () => { }); it("should support nested AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [{ arr: [account1] }]); @@ -405,7 +405,7 @@ describe("contract", () => { }); it("should support ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1", [p]); @@ -427,7 +427,7 @@ describe("contract", () => { }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1", [{ arr: [p] }]); @@ -446,7 +446,7 @@ describe("contract", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.contract("SameContract", [], { id: "first" }); @@ -475,7 +475,7 @@ describe("contract", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); const sameContract2 = m.contract("SameContract"); @@ -491,7 +491,7 @@ describe("contract", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract", [], { id: "same", }); @@ -513,7 +513,7 @@ describe("contract", () => { describe("validation", () => { it("should not validate a non-bignumber value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { value: 42 as any }); @@ -531,7 +531,7 @@ describe("contract", () => { }); it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { from: 1 as any }); @@ -549,7 +549,7 @@ describe("contract", () => { }); it("should not validate a non-contract library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -572,7 +572,7 @@ describe("contract", () => { }); it("should not validate an invalid artifact", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another"); @@ -607,7 +607,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const contract1 = m.contract("Test", [1, 2, 3]); @@ -652,7 +652,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -692,7 +692,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); @@ -732,7 +732,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 42n); @@ -777,7 +777,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123); @@ -822,7 +822,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -870,7 +870,7 @@ describe("contract", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index ef1676ee2e..7a145fa5f9 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; @@ -19,7 +19,7 @@ describe("contractAt", () => { }; it("should be able to setup a contract at a given address", () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const contract1 = m.contractAt("Contract1", "0xtest"); @@ -56,7 +56,7 @@ describe("contractAt", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -83,7 +83,7 @@ describe("contractAt", () => { }); it("should be able to pass a static call future as the address", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -113,7 +113,7 @@ describe("contractAt", () => { }); it("Should be able to pass a module param as address", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); const paramWithoutDefault = m.getParameter("addressWithoutDefault"); @@ -146,7 +146,7 @@ describe("contractAt", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.contractAt( @@ -185,7 +185,7 @@ describe("contractAt", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractAt("SameContract", "0x123"); const sameContract2 = m.contractAt("SameContract", "0x123"); @@ -201,7 +201,7 @@ describe("contractAt", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", "0x123", @@ -233,7 +233,7 @@ describe("contractAt", () => { describe("validation", () => { it("should not validate an invalid address", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractAt("Another", 42 as any); @@ -251,7 +251,7 @@ describe("contractAt", () => { }); it("should not validate a missing module parameter", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -282,7 +282,7 @@ describe("contractAt", () => { }); it("should validate a missing module parameter if a default parameter is present", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", "0x1234"); @@ -312,7 +312,7 @@ describe("contractAt", () => { }); it("should not validate a module parameter of the wrong type", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123 as unknown as string); @@ -343,7 +343,7 @@ describe("contractAt", () => { }); it("should not validate an invalid artifact", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractAt("Another", ""); diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index 8a523db67d..3ac38ebe57 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; @@ -19,7 +19,7 @@ describe("contractAtFromArtifact", () => { }; it("should be able to setup a contract at a given address", () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const contract1 = m.contractAtFromArtifact( @@ -60,7 +60,7 @@ describe("contractAtFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -92,7 +92,7 @@ describe("contractAtFromArtifact", () => { }); it("should be able to pass a static call future as the address", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -122,7 +122,7 @@ describe("contractAtFromArtifact", () => { }); it("Should be able to pass a module param as address", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); const paramWithoutDefault = m.getParameter("addressWithoutDefault"); @@ -163,7 +163,7 @@ describe("contractAtFromArtifact", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.contractAtFromArtifact( @@ -202,7 +202,7 @@ describe("contractAtFromArtifact", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractAtFromArtifact( "SameContract", "0x123", @@ -226,7 +226,7 @@ describe("contractAtFromArtifact", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractAtFromArtifact( "SameContract", "0x123", @@ -258,7 +258,7 @@ describe("contractAtFromArtifact", () => { describe("validation", () => { it("should not validate an invalid address", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractAtFromArtifact( @@ -280,7 +280,7 @@ describe("contractAtFromArtifact", () => { }); it("should not validate a missing module parameter", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -311,7 +311,7 @@ describe("contractAtFromArtifact", () => { }); it("should validate a missing module parameter if a default parameter is present", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", "0x1234"); @@ -341,7 +341,7 @@ describe("contractAtFromArtifact", () => { }); it("should not validate a module parameter of the wrong type", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123 as unknown as string); @@ -372,7 +372,7 @@ describe("contractAtFromArtifact", () => { }); it("should not validate an invalid artifact", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractAtFromArtifact( diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 4d9be4dbe1..52e13952a9 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ArtifactContractDeploymentFutureImplementation, @@ -23,7 +23,7 @@ describe("contractFromArtifact", () => { }; it("should be able to deploy with a contract based on an artifact", () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ @@ -64,7 +64,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an arg dependency", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -91,7 +91,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -118,7 +118,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass a library as a dependency of a contract", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -157,7 +157,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass value as an option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -189,7 +189,7 @@ describe("contractFromArtifact", () => { }); it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -224,7 +224,7 @@ describe("contractFromArtifact", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -256,7 +256,7 @@ describe("contractFromArtifact", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -290,7 +290,7 @@ describe("contractFromArtifact", () => { describe("Arguments", () => { it("Should support base values as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ 1, true, @@ -313,7 +313,7 @@ describe("contractFromArtifact", () => { }); it("Should support arrays as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ [1, 2, 3n], ]); @@ -328,7 +328,7 @@ describe("contractFromArtifact", () => { }); it("Should support objects as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ { a: 1, b: [1, 2] }, ]); @@ -346,7 +346,7 @@ describe("contractFromArtifact", () => { }); it("Should support futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ contract1, @@ -365,7 +365,7 @@ describe("contractFromArtifact", () => { }); it("should support nested futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ { arr: [contract1] }, @@ -384,7 +384,7 @@ describe("contractFromArtifact", () => { }); it("should support AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ account1, @@ -404,7 +404,7 @@ describe("contractFromArtifact", () => { }); it("should support nested AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ { arr: [account1] }, @@ -425,7 +425,7 @@ describe("contractFromArtifact", () => { }); it("should support ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ p, @@ -449,7 +449,7 @@ describe("contractFromArtifact", () => { }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ { arr: [p] }, @@ -470,7 +470,7 @@ describe("contractFromArtifact", () => { describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.contractFromArtifact( @@ -510,7 +510,7 @@ describe("contractFromArtifact", () => { }); it("should throw if the same contract is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractFromArtifact( "SameContract", fakeArtifact @@ -531,7 +531,7 @@ describe("contractFromArtifact", () => { }); it("should throw if a contract tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contractFromArtifact( "SameContract", fakeArtifact, @@ -562,7 +562,7 @@ describe("contractFromArtifact", () => { describe("validation", () => { it("should not validate a non-bignumber value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -582,7 +582,7 @@ describe("contractFromArtifact", () => { }); it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, [], { @@ -602,7 +602,7 @@ describe("contractFromArtifact", () => { }); it("should not validate a non-contract library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -625,7 +625,7 @@ describe("contractFromArtifact", () => { }); it("should not validate an invalid artifact", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contractFromArtifact("Another", {} as Artifact, []); @@ -643,7 +643,7 @@ describe("contractFromArtifact", () => { }); it("should not validate an incorrect number of constructor args", async () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const contract1 = m.contractFromArtifact( @@ -673,7 +673,7 @@ describe("contractFromArtifact", () => { }); it("should not validate a missing module parameter", async () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -721,7 +721,7 @@ describe("contractFromArtifact", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123); @@ -762,7 +762,7 @@ describe("contractFromArtifact", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); @@ -806,7 +806,7 @@ describe("contractFromArtifact", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 42n); @@ -836,7 +836,7 @@ describe("contractFromArtifact", () => { }); it("should not validate a missing module parameter (deeply nested)", async () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -886,7 +886,7 @@ describe("contractFromArtifact", () => { linkReferences: {}, }; - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 123); diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 17d38195ad..730dcb23c9 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact, FutureType } from "../../../src"; -import { defineModule } from "../../../src/new-api/define-module"; +import { buildModule } from "../../../src/new-api/build-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; import { accumulateMessages, @@ -52,7 +52,7 @@ describe("execution engine", () => { it("should execute a contract deploy", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); @@ -179,7 +179,7 @@ describe("execution engine", () => { linkReferences: {}, }; - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account2 = m.getAccount(2); const contract1 = m.contractFromArtifact( "Contract1", @@ -288,7 +288,7 @@ describe("execution engine", () => { }); it("should record a reverted contract deploy", async () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -376,7 +376,7 @@ describe("execution engine", () => { describe("library deploy", () => { it("should execute a library deploy", async () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account2 = m.getAccount(2); const library1 = m.library("Library1", { from: account2 }); @@ -485,7 +485,7 @@ describe("execution engine", () => { linkReferences: {}, }; - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account2 = m.getAccount(2); const library1 = m.libraryFromArtifact("Library1", contract1Artifact, { from: account2, @@ -590,7 +590,7 @@ describe("execution engine", () => { }); it("should record a revert of library deploy", async () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.library("Library1", { from: account1 }); @@ -680,7 +680,7 @@ describe("execution engine", () => { it("should execute a send data", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -844,7 +844,7 @@ describe("execution engine", () => { it("should record a revert of send data", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1033,7 +1033,7 @@ describe("execution engine", () => { it("should execute a call", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1207,7 +1207,7 @@ describe("execution engine", () => { it("should record a revert of call function", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1400,7 +1400,7 @@ describe("execution engine", () => { it("should execute a static call", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1556,7 +1556,7 @@ describe("execution engine", () => { it("should record a revert of static call function", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1692,7 +1692,7 @@ describe("execution engine", () => { it("should execute a contract at", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", exampleAddress); return { contract1 }; @@ -1782,7 +1782,7 @@ describe("execution engine", () => { it("should execute a read event arg", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -1945,7 +1945,7 @@ describe("execution engine", () => { it("should record a revert of a read event arg", async () => { const journal = new MemoryJournal(); - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -2132,7 +2132,7 @@ describe("execution engine", () => { }; it("should execute deploy when futures are passed as nested arguments", async () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const supply = m.getParameter("supply", 1000); @@ -2347,7 +2347,7 @@ describe("execution engine", () => { const tx6 = "0x666"; it("should execute a deploy over multiple batches with different from accounts", async () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const account2 = m.getAccount(2); diff --git a/packages/core/test/new-api/execution/restart.ts b/packages/core/test/new-api/execution/restart.ts index dc418cddc4..6bd9d70b23 100644 --- a/packages/core/test/new-api/execution/restart.ts +++ b/packages/core/test/new-api/execution/restart.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "../../../src/new-api/define-module"; +import { buildModule } from "../../../src/new-api/build-module"; import { MemoryJournal } from "../../../src/new-api/internal/journal/memory-journal"; import { Wiper } from "../../../src/new-api/internal/wiper"; import { @@ -34,14 +34,14 @@ describe("execution engine", () => { }; it("should allow restart", async () => { - const firstRunModDef = defineModule("Module1", (m) => { + const firstRunModDef = buildModule("Module1", (m) => { // Invalid constructor arg - causes revert const contract1 = m.contract("Contract1", [0]); return { contract1 }; }); - const secondRunModDef = defineModule("Module1", (m) => { + const secondRunModDef = buildModule("Module1", (m) => { // Valid constructor arg const contract1 = m.contract("Contract1", [1]); diff --git a/packages/core/test/new-api/getAccount.ts b/packages/core/test/new-api/getAccount.ts index 3a49b4e663..acabfc430e 100644 --- a/packages/core/test/new-api/getAccount.ts +++ b/packages/core/test/new-api/getAccount.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; @@ -9,7 +9,7 @@ import { assertInstanceOf } from "./helpers"; describe("getAccount", () => { it("should return the correct RuntimeValue", () => { - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const account2 = m.getAccount(2); const contract = m.contract("Contract", [], { from: account2 }); diff --git a/packages/core/test/new-api/getParameter.ts b/packages/core/test/new-api/getParameter.ts index 09a243c6b5..5a8b760264 100644 --- a/packages/core/test/new-api/getParameter.ts +++ b/packages/core/test/new-api/getParameter.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { ModuleParameterType } from "../../src/new-api/types/module"; @@ -11,7 +11,7 @@ import { assertInstanceOf } from "./helpers"; describe("getParameter", () => { describe("Without default value", function () { it("should return the correct RuntimeValue", () => { - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const p = m.getParameter("p"); const contract = m.contract("Contract", [p]); @@ -31,7 +31,7 @@ describe("getParameter", () => { describe("With default value", function () { it("should accept base values as default", () => { - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const s = m.getParameter("string", "default"); const n = m.getParameter("number", 1); const bi = m.getParameter("bigint", 1n); @@ -69,7 +69,7 @@ describe("getParameter", () => { it("Should accept arrays as deafult", () => { const defaultValue: ModuleParameterType = [1, "dos", 3n, false]; - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const p = m.getParameter("p", defaultValue); const contract = m.contract("Contract", [p]); @@ -88,7 +88,7 @@ describe("getParameter", () => { it("Should accept objects as deafult", () => { const defaultValue: ModuleParameterType = { a: 1, b: "dos", c: 3n }; - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const p = m.getParameter("p", defaultValue); const contract = m.contract("Contract", [p]); @@ -109,7 +109,7 @@ describe("getParameter", () => { const defaultValue: ModuleParameterType = { arr: [123, { a: [{ o: true }] }], }; - const defintion = defineModule("MyModule", (m) => { + const defintion = buildModule("MyModule", (m) => { const p = m.getParameter("p", defaultValue); const contract = m.contract("Contract", [p]); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index e5ea27146c..4d3e8b275b 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, NamedLibraryDeploymentFutureImplementation, @@ -15,7 +15,7 @@ import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("library", () => { it("should be able to setup a deploy library call", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1"); return { library1 }; @@ -47,7 +47,7 @@ describe("library", () => { }); it("should be able to pass one library as an after dependency of another", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -83,7 +83,7 @@ describe("library", () => { }); it("should be able to pass a library as a dependency of a library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -122,7 +122,7 @@ describe("library", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.library("Another", { @@ -154,7 +154,7 @@ describe("library", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.library("Another", { @@ -188,7 +188,7 @@ describe("library", () => { describe("passing id", () => { it("should be able to deploy the same library twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.library("SameContract", { id: "first" }); @@ -217,7 +217,7 @@ describe("library", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.library("SameContract"); const sameContract2 = m.library("SameContract"); @@ -232,7 +232,7 @@ describe("library", () => { }); it("should throw if a library tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.library("SameContract", { id: "same", }); @@ -253,7 +253,7 @@ describe("library", () => { describe("validation", () => { it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", [], { from: 1 as any }); @@ -271,7 +271,7 @@ describe("library", () => { }); it("should not validate a non-contract library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -294,7 +294,7 @@ describe("library", () => { }); it("should not validate an invalid artifact", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.library("Another"); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 48c27f82ed..04d0ab909f 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ArtifactLibraryDeploymentFutureImplementation, @@ -20,7 +20,7 @@ describe("libraryFromArtifact", () => { }; it("should be able to deploy with a library based on an artifact", () => { - const moduleWithContractFromArtifactDefinition = defineModule( + const moduleWithContractFromArtifactDefinition = buildModule( "Module1", (m) => { const library1 = m.libraryFromArtifact("Library1", fakeArtifact); @@ -51,7 +51,7 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass an after dependency", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -78,7 +78,7 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass a library as a dependency of a library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.library("Example"); @@ -117,7 +117,7 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.libraryFromArtifact("Another", fakeArtifact, { @@ -149,7 +149,7 @@ describe("libraryFromArtifact", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.libraryFromArtifact("Another", fakeArtifact, { @@ -183,7 +183,7 @@ describe("libraryFromArtifact", () => { describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { - const moduleWithSameContractTwiceDefinition = defineModule( + const moduleWithSameContractTwiceDefinition = buildModule( "Module1", (m) => { const sameContract1 = m.libraryFromArtifact( @@ -221,7 +221,7 @@ describe("libraryFromArtifact", () => { }); it("should throw if the same library is deployed twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.libraryFromArtifact( "SameContract", fakeArtifact @@ -242,7 +242,7 @@ describe("libraryFromArtifact", () => { }); it("should throw if a library tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.libraryFromArtifact( "SameContract", fakeArtifact, @@ -271,7 +271,7 @@ describe("libraryFromArtifact", () => { describe("validation", () => { it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.libraryFromArtifact("Another", fakeArtifact, { @@ -291,7 +291,7 @@ describe("libraryFromArtifact", () => { }); it("should not validate a non-contract library", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -314,7 +314,7 @@ describe("libraryFromArtifact", () => { }); it("should not validate an invalid artifact", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.libraryFromArtifact("Another", {} as Artifact); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index d8a95058c2..257a319a19 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact, FutureType, ReadEventArgumentFuture } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; import { validateReadEventArgument } from "../../src/new-api/internal/validation/futures/validateReadEventArgument"; @@ -19,7 +19,7 @@ describe("Read event argument", () => { linkReferences: {}, }; - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("Contract"); const contractFromArtifact = m.contractFromArtifact( "ContractFromArtifact", @@ -51,7 +51,7 @@ describe("Read event argument", () => { }); it("should infer the emitter from the future correctly", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("Contract"); const call = m.call(contract, "fuc"); @@ -73,7 +73,7 @@ describe("Read event argument", () => { }); it("should accept an explicit emitter", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("ContractThatCallsEmitter"); const emitter = m.contract("ContractThatEmittsEvent2"); const call = m.call(contract, "doSomethingAndCallThEmitter", [emitter]); @@ -96,7 +96,7 @@ describe("Read event argument", () => { }); it("should set the right eventName and argumentName", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("Contract"); const call = m.call(contract, "fuc"); @@ -121,7 +121,7 @@ describe("Read event argument", () => { }); it("should default the eventIndex to 0", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "EventName1", "arg1"); @@ -140,7 +140,7 @@ describe("Read event argument", () => { }); it("should accept an explicit eventIndex", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "EventName1", "arg1", { eventIndex: 1 }); @@ -165,7 +165,7 @@ describe("Read event argument", () => { describe("passing ids", () => { it("should have a default id based on the emitter's contract name, the event name, argument and index", () => { - const defintion = defineModule("Module1", (m) => { + const defintion = buildModule("Module1", (m) => { const main = m.contract("Main"); const emitter = m.contract("Emitter"); @@ -189,7 +189,7 @@ describe("Read event argument", () => { }); it("should be able to read the same argument twice by passing a explicit id", () => { - const moduleWithSameReadEventArgumentTwiceDefinition = defineModule( + const moduleWithSameReadEventArgumentTwiceDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -220,7 +220,7 @@ describe("Read event argument", () => { describe("validation", () => { it("should not validate a non-existant hardhat contract", async () => { - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); m.readEventArgument(another, "test", "arg"); @@ -251,7 +251,7 @@ describe("Read event argument", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.readEventArgument(another, "test", "arg"); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts index c86e7bb3ea..6f4e78339b 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractAt.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../../../src"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { ContractAtExecutionState, DeploymentExecutionState, @@ -70,7 +70,7 @@ describe("Reconciliation - artifact contract at", () => { }; it("should reconcile when using an address string", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const contract1 = m.contractAtFromArtifact( "Contract1", exampleAddress, @@ -80,7 +80,7 @@ describe("Reconciliation - artifact contract at", () => { return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -100,7 +100,7 @@ describe("Reconciliation - artifact contract at", () => { }); it("should reconcile when using a static call", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); @@ -138,7 +138,7 @@ describe("Reconciliation - artifact contract at", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAtFromArtifact( "ContractChanged", exampleAddress, @@ -172,7 +172,7 @@ describe("Reconciliation - artifact contract at", () => { }); it("should find changes to contract address as a literal unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAtFromArtifact( "Contract1", exampleAddress, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts index 77fbc8778d..6a75379cf5 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../../../src"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -43,7 +43,7 @@ describe("Reconciliation - artifact contract", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const supply = m.getParameter("supply", BigInt(1000)); const safeMath = m.library("SafeMath"); @@ -61,7 +61,7 @@ describe("Reconciliation - artifact contract", () => { return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -88,7 +88,7 @@ describe("Reconciliation - artifact contract", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact( "ContractChanged", fakeArtifact, @@ -118,7 +118,7 @@ describe("Reconciliation - artifact contract", () => { }); it("should find changes to constructors unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const owner = m.getAccount(3); const supply = m.getParameter("supply", BigInt(500)); const ticker = m.getParameter("ticker", "CodeCoin"); @@ -154,7 +154,7 @@ describe("Reconciliation - artifact contract", () => { }); it("should find changes to libraries unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { @@ -191,7 +191,7 @@ describe("Reconciliation - artifact contract", () => { }); it("should find changes to value unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { id: "Example", value: BigInt(4), @@ -218,7 +218,7 @@ describe("Reconciliation - artifact contract", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [], { id: "Example", from: twoAddress, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 33461f44c3..d37620f75d 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../../../src"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -43,7 +43,7 @@ describe("Reconciliation - artifact library", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const safeMath = m.library("SafeMath"); const mainLib = m.libraryFromArtifact("MainLibrary", fakeArtifact, { @@ -53,7 +53,7 @@ describe("Reconciliation - artifact library", () => { return { safeMath, mainLib }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { mainLib } = m.useModule(submoduleDefinition); return { mainLib }; @@ -80,7 +80,7 @@ describe("Reconciliation - artifact library", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const library1 = m.libraryFromArtifact("LibraryChanged", fakeArtifact, { id: "Example", }); @@ -107,7 +107,7 @@ describe("Reconciliation - artifact library", () => { }); it("should find changes to libraries unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); const mainLib = m.libraryFromArtifact("MainLibrary", fakeArtifact, { @@ -145,7 +145,7 @@ describe("Reconciliation - artifact library", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const library1 = m.libraryFromArtifact("Library1", fakeArtifact, { id: "Example", from: twoAddress, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts index 5d6512029b..1cff3c7280 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractAt.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { ContractAtExecutionState, DeploymentExecutionState, @@ -62,13 +62,13 @@ describe("Reconciliation - named contract at", () => { }; it("should reconcile unchanged when using an address string", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const contract1 = m.contractAt("Contract1", exampleAddress); return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -87,7 +87,7 @@ describe("Reconciliation - named contract at", () => { }); it("should reconcile unchanged when using an static call", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); @@ -124,7 +124,7 @@ describe("Reconciliation - named contract at", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAt("ContractChanged", exampleAddress, { id: "Factory", }); @@ -152,7 +152,7 @@ describe("Reconciliation - named contract at", () => { }); it("should find changes to contract address as a literal unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAt("Contract1", exampleAddress, { id: "Factory", }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts index f9ef0f1d93..2332694ff5 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractCall.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { CallExecutionState, DeploymentExecutionState, @@ -54,7 +54,7 @@ describe("Reconciliation - named contract call", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "function1", [1, "a", contract1], {}); @@ -62,7 +62,7 @@ describe("Reconciliation - named contract call", () => { return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -84,7 +84,7 @@ describe("Reconciliation - named contract call", () => { }); it("should find changes to contract unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "function1", [], { id: "config" }); @@ -117,7 +117,7 @@ describe("Reconciliation - named contract call", () => { }); it("should find changes to function name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "functionChanged", [], { id: "config" }); @@ -148,7 +148,7 @@ describe("Reconciliation - named contract call", () => { }); it("should find changes to function args unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const ticker = m.getParameter("ticker", "CHANGED"); const contract1 = m.contract("Contract1"); @@ -181,7 +181,7 @@ describe("Reconciliation - named contract call", () => { }); it("should find changes to value unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "function1", [], { id: "config", value: BigInt(3) }); @@ -212,7 +212,7 @@ describe("Reconciliation - named contract call", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "function1", [], { id: "config", from: twoAddress }); diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts index 083b3baa39..c9657e78e1 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -35,7 +35,7 @@ describe("Reconciliation - named contract", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const owner = m.getAccount(3); const supply = m.getParameter("supply", BigInt(500)); const ticker = m.getParameter("ticker", "CodeCoin"); @@ -55,7 +55,7 @@ describe("Reconciliation - named contract", () => { return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -86,7 +86,7 @@ describe("Reconciliation - named contract", () => { }); it("should find changes to contract name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("ContractChanged", [], { id: "Example", }); @@ -112,7 +112,7 @@ describe("Reconciliation - named contract", () => { }); it("should find changes to constructor args unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const owner = m.getAccount(3); const supply = m.getParameter("supply", BigInt(500)); const ticker = m.getParameter("ticker", "CodeCoin"); @@ -147,7 +147,7 @@ describe("Reconciliation - named contract", () => { }); it("should find changes to libraries unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); const contract1 = m.contract("Contract1", [], { @@ -183,7 +183,7 @@ describe("Reconciliation - named contract", () => { }); it("should find changes to value unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract", [], { id: "Example", value: BigInt(3), @@ -210,7 +210,7 @@ describe("Reconciliation - named contract", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract", [], { id: "Example", from: twoAddress, diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts index bfc3eeceb7..cfd642b489 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -35,7 +35,7 @@ describe("Reconciliation - named library", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const safeMath = m.library("SafeMath"); const mainLib = m.library("MainLibrary", { @@ -45,7 +45,7 @@ describe("Reconciliation - named library", () => { return { safeMath, mainLib }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { mainLib } = m.useModule(submoduleDefinition); return { mainLib }; @@ -72,7 +72,7 @@ describe("Reconciliation - named library", () => { }); it("should find changes to library name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const library = m.library("LibraryChanged", { id: "Library" }); return { library }; @@ -97,7 +97,7 @@ describe("Reconciliation - named library", () => { }); it("should find changes to libraries unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); const mainLib = m.library("MainLibrary", { @@ -135,7 +135,7 @@ describe("Reconciliation - named library", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const library = m.library("Library", { id: "Library", from: twoAddress }); return { library }; diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts index 43ccb7c246..8c998ff501 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileNamedStaticCall.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -52,7 +52,7 @@ describe("Reconciliation - named static call", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "function1", [1, "a"]); @@ -60,7 +60,7 @@ describe("Reconciliation - named static call", () => { return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -84,7 +84,7 @@ describe("Reconciliation - named static call", () => { }); it("should find changes to contract unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "function1", [], { id: "config" }); @@ -116,7 +116,7 @@ describe("Reconciliation - named static call", () => { }); it("should find changes to function name unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "functionChanged", [], { id: "config" }); @@ -149,7 +149,7 @@ describe("Reconciliation - named static call", () => { }); it("should find changes to function args unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const ticker = m.getParameter("ticker", "CHANGED"); const contract1 = m.contract("Contract1"); @@ -184,7 +184,7 @@ describe("Reconciliation - named static call", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "function1", [], { @@ -220,7 +220,7 @@ describe("Reconciliation - named static call", () => { }); it("should not reconcile the use of the result of a static call that has changed", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const resultArg1 = m.staticCall(contract1, "function1", ["first"], { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts index 0b5442f23e..0cb75df210 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileReadEventArgument.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { DeploymentExecutionState, ExecutionStatus, @@ -50,7 +50,7 @@ describe("Reconciliation - read event argument", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "EventName1", "arg1"); @@ -58,7 +58,7 @@ describe("Reconciliation - read event argument", () => { return { contract }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract } = m.useModule(submoduleDefinition); return { contract }; @@ -82,7 +82,7 @@ describe("Reconciliation - read event argument", () => { }); it("should find changes to the event unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "EventChanged", "arg1", { @@ -117,7 +117,7 @@ describe("Reconciliation - read event argument", () => { }); it("should find changes to the argument unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "event1", "argChanged", { @@ -152,7 +152,7 @@ describe("Reconciliation - read event argument", () => { }); it("should find changes to the event index unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract = m.contract("Contract"); m.readEventArgument(contract, "event1", "argument1", { @@ -187,7 +187,7 @@ describe("Reconciliation - read event argument", () => { }); it("should find changes to the emitter unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); @@ -231,7 +231,7 @@ describe("Reconciliation - read event argument", () => { }); it("should not reconcile the use of an event argument that has changed", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const readEvent1 = m.readEventArgument(contract1, "event1", "argument1", { diff --git a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts index 55ebb554dc..da97650b8c 100644 --- a/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/new-api/reconciliation/futures/reconcileSendData.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../../src/new-api/define-module"; +import { buildModule } from "../../../../src/new-api/build-module"; import { ExecutionStatus, SendDataExecutionState, @@ -29,13 +29,13 @@ describe("Reconciliation - send data", () => { }; it("should reconcile unchanged", () => { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { m.send("test_send", exampleAddress, 0n, "example_data"); return {}; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const {} = m.useModule(submoduleDefinition); return {}; @@ -50,7 +50,7 @@ describe("Reconciliation - send data", () => { }); it("should find changes to the to address unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", differentAddress, 0n, "example_data"); return {}; @@ -74,7 +74,7 @@ describe("Reconciliation - send data", () => { }); it("should find changes to the to data unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", exampleAddress, 0n, "changed_data"); return {}; @@ -97,7 +97,7 @@ describe("Reconciliation - send data", () => { }); it("should find changes to the value unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", exampleAddress, 3n, "example_data"); return {}; @@ -120,7 +120,7 @@ describe("Reconciliation - send data", () => { }); it("should find changes to from unreconciliable", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", exampleAddress, 0n, "example_data", { from: differentAddress, }); diff --git a/packages/core/test/new-api/reconciliation/reconciler.ts b/packages/core/test/new-api/reconciliation/reconciler.ts index 471f3acd83..0582878cb5 100644 --- a/packages/core/test/new-api/reconciliation/reconciler.ts +++ b/packages/core/test/new-api/reconciliation/reconciler.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../../src/new-api/define-module"; +import { buildModule } from "../../../src/new-api/build-module"; import { ArtifactMap } from "../../../src/new-api/internal/reconciliation/types"; import { DeploymentExecutionState, @@ -34,7 +34,7 @@ describe("Reconciliation", () => { }; it("should successfully reconcile on an empty execution state", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -44,7 +44,7 @@ describe("Reconciliation", () => { }); it("should successfully reconcile even in with complex arguments", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const safeMath = m.library("SafeMath"); const contract1 = m.contract("Contract1", [], { @@ -70,7 +70,7 @@ describe("Reconciliation", () => { }); it("should find previous executed futures that have been left out of the current module", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -91,7 +91,7 @@ describe("Reconciliation", () => { }); it("should flag as unreconsiliable a future that has changed type", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1", { id: "Example" }); return { library1 }; @@ -116,7 +116,7 @@ describe("Reconciliation", () => { describe("from and accounts interactions", () => { it("should reconcile from where both future and execution state are undefined but there is history", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1", [], { from: undefined }); return { contract1 }; @@ -150,7 +150,7 @@ describe("Reconciliation", () => { }); it("should reconcile any from if the execution state from is not set and there were no messages", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -171,7 +171,7 @@ describe("Reconciliation", () => { }); it("should flag as unreconsiliable a changed from where the history indicates a different from", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const account2 = m.getAccount(2); // from is accounts[2] const contract1 = m.contract("Contract1", [], { from: account2 }); @@ -216,7 +216,7 @@ describe("Reconciliation", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; it("should reconcile unchanged dependencies", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); const contract3 = m.contract("Contract3", [], { @@ -250,7 +250,7 @@ describe("Reconciliation", () => { }); it("should reconcile the reduction of dependencies", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); const contract3 = m.contract("Contract3", [], { @@ -284,7 +284,7 @@ describe("Reconciliation", () => { }); it("should reconcile the addition of a dependency to a completed future", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [], { after: [contract1], @@ -311,7 +311,7 @@ describe("Reconciliation", () => { }); it("should not reconcile the addition of a dependency that is not a success", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [], { after: [contract1], @@ -348,7 +348,7 @@ describe("Reconciliation", () => { it("should not reconcile the addition of a dependency where the dependent has alread started", () => { const addr1 = exampleAddress; - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contractOriginal = m.contract("ContractOriginal"); const contractNew = m.contract("ContractNew"); @@ -394,7 +394,7 @@ describe("Reconciliation", () => { it("should reconcile unchanged bytecodes", () => { const addr1 = exampleAddress; - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -434,7 +434,7 @@ describe("Reconciliation", () => { it("should not reconcile changed bytecodes", () => { const addr1 = exampleAddress; - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -499,7 +499,7 @@ describe("Reconciliation", () => { const addr1 = exampleAddress; - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index 88541dedff..b78a3aaf37 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -16,7 +16,7 @@ import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("send", () => { it("should be able to setup a send", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { m.send("test send", "0xtest", 0n, "test-data"); return {}; @@ -51,7 +51,7 @@ describe("send", () => { }); it("should be able to pass one contract as the 'to' arg for a send", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -85,7 +85,7 @@ describe("send", () => { }); it("should be able to pass one contract as an after dependency of a send", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -119,7 +119,7 @@ describe("send", () => { }); it("should be able to pass a value", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { m.send("test send", "0xtest", 42n, ""); @@ -147,7 +147,7 @@ describe("send", () => { }); it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { m.send("test send", "0xtest", m.getParameter("value"), ""); @@ -178,7 +178,7 @@ describe("send", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { m.send("test send", "0xtest", 0n, "", { from: "0x2" }); @@ -206,7 +206,7 @@ describe("send", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { m.send("test send", "0xtest", 0n, "", { from: m.getAccount(1) }); @@ -235,7 +235,7 @@ describe("send", () => { }); it("Should be able to pass a module param as address", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); const paramWithoutDefault = m.getParameter("addressWithoutDefault"); @@ -267,7 +267,7 @@ describe("send", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { - const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { m.send("test send", "0xtest", 0n, "test", { id: "first" }); m.send("test send", "0xtest", 0n, "test", { id: "second" }); @@ -294,7 +294,7 @@ describe("send", () => { }); it("should throw if the same function is called twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { m.send("test send", "0xtest", 0n, "test"); m.send("test send", "0xtest", 0n, "test"); @@ -310,7 +310,7 @@ describe("send", () => { }); it("should throw if a call tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { m.send("test send", "0xtest", 0n, "test", { id: "first" }); m.send("test send", "0xtest", 0n, "test", { id: "first" }); return {}; @@ -327,7 +327,7 @@ describe("send", () => { describe("validation", () => { it("should not validate a non-bignumber value option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -346,7 +346,7 @@ describe("send", () => { }); it("should not validate a non-string data option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -365,7 +365,7 @@ describe("send", () => { }); it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -384,7 +384,7 @@ describe("send", () => { }); it("should not validate an invalid address", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -405,7 +405,7 @@ describe("send", () => { }); it("should not validate a missing module parameter", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p"); @@ -430,7 +430,7 @@ describe("send", () => { }); it("should validate a missing module parameter if a default parameter is present", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", "0x123"); @@ -454,7 +454,7 @@ describe("send", () => { }); it("should not validate a module parameter of the wrong type for value", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); @@ -479,7 +479,7 @@ describe("send", () => { }); it("should validate a module parameter of the correct type for value", async () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const p = m.getParameter("p", 42n); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index df7fd2499b..4901502fc8 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -18,7 +18,7 @@ import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("static call", () => { it("should be able to setup a static call", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "test"); @@ -56,7 +56,7 @@ describe("static call", () => { }); it("should be able to pass one contract as an arg dependency to a static call", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -97,7 +97,7 @@ describe("static call", () => { }); it("should be able to pass one contract as an after dependency of a static call", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -138,7 +138,7 @@ describe("static call", () => { }); it("should be able to pass its result into another call", () => { - const moduleWithASingleContractDefinition = defineModule("Module1", (m) => { + const moduleWithASingleContractDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const data = m.staticCall(contract1, "test"); @@ -172,7 +172,7 @@ describe("static call", () => { }); it("should be able to pass a string as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -202,7 +202,7 @@ describe("static call", () => { }); it("Should be able to pass an AccountRuntimeValue as from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const example = m.contract("Example"); @@ -234,7 +234,7 @@ describe("static call", () => { describe("Arguments", () => { it("Should support base values as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [1, true, "string", 4n]); @@ -253,7 +253,7 @@ describe("static call", () => { }); it("Should support arrays as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [[1, 2, 3n]]); @@ -272,7 +272,7 @@ describe("static call", () => { }); it("Should support objects as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [{ a: 1, b: [1, 2] }]); @@ -291,7 +291,7 @@ describe("static call", () => { }); it("Should support futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [contract1]); @@ -310,7 +310,7 @@ describe("static call", () => { }); it("should support nested futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [{ arr: [contract1] }]); @@ -329,7 +329,7 @@ describe("static call", () => { }); it("should support AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [account1]); @@ -350,7 +350,7 @@ describe("static call", () => { }); it("should support nested AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [{ arr: [account1] }]); @@ -374,7 +374,7 @@ describe("static call", () => { }); it("should support ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [p]); @@ -399,7 +399,7 @@ describe("static call", () => { }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1"); m.staticCall(contract1, "foo", [{ arr: [p] }]); @@ -425,7 +425,7 @@ describe("static call", () => { describe("passing id", () => { it("should be able to statically call the same function twice by passing an id", () => { - const moduleWithSameCallTwiceDefinition = defineModule("Module1", (m) => { + const moduleWithSameCallTwiceDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("Example"); m.staticCall(sameContract1, "test", [], { id: "first" }); @@ -454,7 +454,7 @@ describe("static call", () => { }); it("should throw if the same function is statically called twice without differentiating ids", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.staticCall(sameContract1, "test"); m.staticCall(sameContract1, "test"); @@ -471,7 +471,7 @@ describe("static call", () => { }); it("should throw if a static call tries to pass the same id twice", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const sameContract1 = m.contract("SameContract"); m.staticCall(sameContract1, "test", [], { id: "first" }); m.staticCall(sameContract1, "test", [], { id: "first" }); @@ -489,7 +489,7 @@ describe("static call", () => { describe("validation", () => { it("should not validate a non-address from option", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -508,7 +508,7 @@ describe("static call", () => { }); it("should not validate a non-contract", () => { - const moduleWithDependentContractsDefinition = defineModule( + const moduleWithDependentContractsDefinition = buildModule( "Module1", (m) => { const another = m.contract("Another", []); @@ -529,7 +529,7 @@ describe("static call", () => { }); it("should not validate a non-existant hardhat contract", async () => { - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); m.staticCall(another, "test"); @@ -560,7 +560,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p"); m.staticCall(another, "test", [p]); @@ -606,7 +606,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p", true); m.staticCall(another, "test", [p]); @@ -637,7 +637,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p"); m.staticCall(another, "test", [ @@ -685,7 +685,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p", true); m.staticCall(another, "test", [ @@ -718,7 +718,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.staticCall(another, "test"); @@ -759,7 +759,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.staticCall(another, "inc", [1, 2]); @@ -818,7 +818,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.staticCall(another, "inc", [1, 2, 3]); @@ -859,7 +859,7 @@ describe("static call", () => { linkReferences: {}, }; - const moduleDef = defineModule("Module1", (m) => { + const moduleDef = buildModule("Module1", (m) => { const another = m.contractFromArtifact("Another", fakeArtifact, []); m.staticCall(another, "inc", [1]); diff --git a/packages/core/test/new-api/stored-deployment-serializer.ts b/packages/core/test/new-api/stored-deployment-serializer.ts index dd415ccbb8..517f8b260d 100644 --- a/packages/core/test/new-api/stored-deployment-serializer.ts +++ b/packages/core/test/new-api/stored-deployment-serializer.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, @@ -29,7 +29,7 @@ describe("stored deployment serializer", () => { describe("contract", () => { it("should serialize a contract deployment", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; @@ -45,7 +45,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contract deployments with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [contract1]); const contract3 = m.contract("Contract3", [], { after: [contract2] }); @@ -63,7 +63,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contract deployment with module parameter value", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const value = m.getParameter("value", 42n); const contract1 = m.contract("Contract1", [], { value }); @@ -89,7 +89,7 @@ describe("stored deployment serializer", () => { }; it("should serialize a contractFromArtifact deployment", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); return { contract1 }; @@ -105,7 +105,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contractFromArtifact deployment with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ @@ -134,7 +134,7 @@ describe("stored deployment serializer", () => { describe("contractAt", () => { it("should serialize a contractAt", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", "0x0"); return { contract1 }; @@ -150,7 +150,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contractAt with a future address", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", "0x0"); const call = m.staticCall(contract1, "getAddress"); const contract2 = m.contractAt("Contract2", call); @@ -168,7 +168,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contractAt with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", "0x0"); const contract2 = m.contractAt("Contract2", "0x0", { after: [contract1], @@ -196,7 +196,7 @@ describe("stored deployment serializer", () => { }; it("should serialize a contractAt", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAtFromArtifact( "Contract1", "0x0", @@ -216,7 +216,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contractAt with a future address", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAtFromArtifact( "Contract1", "0x0", @@ -242,7 +242,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a contractAt with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contractAtFromArtifact( "Contract1", "0x0", @@ -279,7 +279,7 @@ describe("stored deployment serializer", () => { }; it("should serialize a library deployment", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1"); return { library1 }; @@ -295,7 +295,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a library deployment with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1"); const library2 = m.library("Library2", { after: [library1] }); @@ -315,7 +315,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a libraries passed in as libraries", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.library("Library1"); const contract2 = m.contract("Contract2", [], { @@ -371,7 +371,7 @@ describe("stored deployment serializer", () => { }; it("should serialize a libraryFromArtifact deployment", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.libraryFromArtifact("Contract1", fakeArtifact); return { library1 }; @@ -387,7 +387,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a libraryFromArtifact deployment with dependency", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const library1 = m.libraryFromArtifact("Library1", fakeArtifact); const library2 = m.libraryFromArtifact("Library2", fakeArtifact, { @@ -409,7 +409,7 @@ describe("stored deployment serializer", () => { describe("call", () => { it("should serialize a call", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.call(contract1, "lock", [1, "a", false]); @@ -427,7 +427,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a call with dependencies", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); @@ -449,7 +449,7 @@ describe("stored deployment serializer", () => { describe("static call", () => { it("should serialize a call", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); m.staticCall(contract1, "lock", [1, "a", false]); @@ -467,7 +467,7 @@ describe("stored deployment serializer", () => { }); it("should serialize a static call with dependencies", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2"); @@ -487,7 +487,7 @@ describe("stored deployment serializer", () => { }); it("Should serialize readEventArgument", () => { - const moduleDefinition = defineModule("Module1", (m) => { + const moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); const emitter = m.contract("Emitter"); @@ -512,13 +512,13 @@ describe("stored deployment serializer", () => { describe("useModule", () => { it("should serialize a deployment leveraging useModule", () => { - const submodule = defineModule("Submodule", (m) => { + const submodule = buildModule("Submodule", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submodule); return { contract1 }; @@ -534,13 +534,13 @@ describe("stored deployment serializer", () => { }); it("should serialize contract dependencies over the useModule barrier", () => { - const submodule = defineModule("Submodule", (m) => { + const submodule = buildModule("Submodule", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { contract1 } = m.useModule(submodule); const contract2 = m.contract("Contract2", [contract1]); @@ -559,25 +559,25 @@ describe("stored deployment serializer", () => { }); it("should serialize a diamond useModule", () => { - const bottomModuleDefinition = defineModule("BottomModule", (m) => { + const bottomModuleDefinition = buildModule("BottomModule", (m) => { const bottomContract = m.contract("Contract1"); return { bottomContract }; }); - const leftModuleDefinition = defineModule("LeftModule", (m) => { + const leftModuleDefinition = buildModule("LeftModule", (m) => { const { bottomContract } = m.useModule(bottomModuleDefinition); return { leftContract: bottomContract }; }); - const rightModuleDefinition = defineModule("RightModule", (m) => { + const rightModuleDefinition = buildModule("RightModule", (m) => { const { bottomContract } = m.useModule(bottomModuleDefinition); return { rightContract: bottomContract }; }); - const moduleDefinition = defineModule("TopModule", (m) => { + const moduleDefinition = buildModule("TopModule", (m) => { const { leftContract } = m.useModule(leftModuleDefinition); const { rightContract } = m.useModule(rightModuleDefinition); @@ -612,7 +612,7 @@ describe("stored deployment serializer", () => { describe("Complex arguments serialization", () => { it("Should support base values as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [1, true, "string", 4n]); return { contract1 }; @@ -628,7 +628,7 @@ describe("stored deployment serializer", () => { }); it("Should support arrays as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [[1, 2, 3n]]); return { contract1 }; @@ -644,7 +644,7 @@ describe("stored deployment serializer", () => { }); it("Should support objects as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1", [{ a: 1, b: [1, 2] }]); return { contract1 }; @@ -660,7 +660,7 @@ describe("stored deployment serializer", () => { }); it("Should support futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [contract1]); @@ -677,7 +677,7 @@ describe("stored deployment serializer", () => { }); it("should support nested futures as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); const contract2 = m.contract("Contract2", [{ arr: [contract1] }]); @@ -694,7 +694,7 @@ describe("stored deployment serializer", () => { }); it("should support AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [account1]); @@ -711,7 +711,7 @@ describe("stored deployment serializer", () => { }); it("should support AccountRuntimeValues as from", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [], { from: account1 }); @@ -728,7 +728,7 @@ describe("stored deployment serializer", () => { }); it("should support nested AccountRuntimeValues as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const account1 = m.getAccount(1); const contract1 = m.contract("Contract1", [{ arr: [account1] }]); @@ -745,7 +745,7 @@ describe("stored deployment serializer", () => { }); it("should support ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1", [p]); @@ -762,7 +762,7 @@ describe("stored deployment serializer", () => { }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const p = m.getParameter("p", 123); const contract1 = m.contract("Contract1", [{ arr: [p] }]); diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index 34170ac628..d517f8c83e 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { Artifact } from "../../src"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; import { validate } from "../../src/new-api/internal/validation/validate"; @@ -10,13 +10,13 @@ import { setupMockArtifactResolver } from "./helpers"; describe("useModule", () => { it("should be able to use a submodule", () => { - const submoduleDefinition = defineModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { const { contract1 } = m.useModule(submoduleDefinition); return { contract1 }; @@ -34,13 +34,13 @@ describe("useModule", () => { }); it("returns the same result set (object equal) for each usage", () => { - const submoduleDefinition = defineModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { const { contract1: first } = m.useModule(submoduleDefinition); const { contract1: second } = m.useModule(submoduleDefinition); @@ -63,13 +63,13 @@ describe("useModule", () => { }); it("supports dependending on returned results", () => { - const submoduleDefinition = defineModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const contract1 = m.contract("Contract1"); return { contract1 }; }); - const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { const { contract1 } = m.useModule(submoduleDefinition); const contract2 = m.contract("Contract2", [contract1]); @@ -111,14 +111,14 @@ describe("useModule", () => { linkReferences: {}, }; - const submoduleDefinition = defineModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const param1 = m.getParameter("param1"); const contract1 = m.contract("Contract1", [param1]); return { contract1 }; }); - const submodule2Definition = defineModule("Submodule2", (m) => { + const submodule2Definition = buildModule("Submodule2", (m) => { const { contract1 } = m.useModule(submoduleDefinition); const param2 = m.getParameter("param2"); @@ -127,7 +127,7 @@ describe("useModule", () => { return { contract1, contract2 }; }); - const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { const { contract1, contract2 } = m.useModule(submodule2Definition); const param3 = m.getParameter("param3"); @@ -187,14 +187,14 @@ describe("useModule", () => { linkReferences: {}, }; - const submoduleDefinition = defineModule("Submodule1", (m) => { + const submoduleDefinition = buildModule("Submodule1", (m) => { const param1 = m.getParameter("param1"); const contract1 = m.contract("Contract1", [param1]); return { contract1 }; }); - const submodule2Definition = defineModule("Submodule2", (m) => { + const submodule2Definition = buildModule("Submodule2", (m) => { const { contract1 } = m.useModule(submoduleDefinition); const param2 = m.getParameter("param2"); @@ -203,7 +203,7 @@ describe("useModule", () => { return { contract1, contract2 }; }); - const moduleWithSubmoduleDefinition = defineModule("Module1", (m) => { + const moduleWithSubmoduleDefinition = buildModule("Module1", (m) => { const { contract1, contract2 } = m.useModule(submodule2Definition); const param3 = m.getParameter("param3"); diff --git a/packages/core/test/new-api/wipe.ts b/packages/core/test/new-api/wipe.ts index b07c300ade..da75a43412 100644 --- a/packages/core/test/new-api/wipe.ts +++ b/packages/core/test/new-api/wipe.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { defineModule } from "../../src/new-api/define-module"; +import { buildModule } from "../../src/new-api/build-module"; import { MemoryJournal } from "../../src/new-api/internal/journal/memory-journal"; import { Journal } from "../../src/new-api/internal/types/journal"; import { Wiper } from "../../src/new-api/internal/wiper"; @@ -29,7 +29,7 @@ describe("wipe", () => { journal = new MemoryJournal(); wiper = new Wiper(journal); - moduleDefinition = defineModule("Module1", (m) => { + moduleDefinition = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1", [], { after: [] }); const contract2 = m.contract("Contract2", [], { after: [contract1] }); const contract3 = m.contract("Contract3", [], { after: [contract2] }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index d50346b00a..e131682ade 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -17,7 +17,7 @@ import { open } from "./utils/open"; import "./type-extensions"; // eslint-disable-next-line import/no-unused-modules -export { buildModule, defineModule } from "@ignored/ignition-core"; +export { buildModule } from "@ignored/ignition-core"; export interface IgnitionConfig { maxRetries: number; diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index abdb112025..7ed0912eff 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -8,7 +8,7 @@ describe("calls", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to call contracts", async function () { - const moduleDefinition = defineModule("SetAddressModule", (m) => { + const moduleDefinition = buildModule("SetAddressModule", (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", [ "0x0000000000000000000000000000000000000000", @@ -30,7 +30,7 @@ describe("calls", () => { }); it("should be able to call contracts with array args", async function () { - const moduleDefinition = defineModule("ArrayArgModule", (m) => { + const moduleDefinition = buildModule("ArrayArgModule", (m) => { const captureArraysContract = m.contract("CaptureArraysContract"); m.call(captureArraysContract, "recordArrays", [ @@ -52,7 +52,7 @@ describe("calls", () => { }); it("should be able to call contracts with arrays nested in objects args", async function () { - const moduleDefinition = defineModule("ArrayNestedModule", (m) => { + const moduleDefinition = buildModule("ArrayNestedModule", (m) => { const captureComplexObjectContract = m.contract( "CaptureComplexObjectContract" ); @@ -79,7 +79,7 @@ describe("calls", () => { }); it("should be able to make calls in order", async function () { - const moduleDefinition = defineModule("OrderedModule", (m) => { + const moduleDefinition = buildModule("OrderedModule", (m) => { const trace = m.contract("Trace", ["first"]); const second = m.call(trace, "addEntry", ["second"], { id: "AddEntry1" }); @@ -108,7 +108,7 @@ describe("calls", () => { describe("passing value", () => { it("should be able to call a contract passing a value", async function () { - const moduleDefinition = defineModule("PassingValue", (m) => { + const moduleDefinition = buildModule("PassingValue", (m) => { const passingValue = m.contract("PassingValue"); m.call(passingValue, "deposit", [], { @@ -133,7 +133,7 @@ describe("calls", () => { }); it("should be able to call a contract passing a value via a parameter", async function () { - const submoduleDefinition = defineModule("Submodule", (m) => { + const submoduleDefinition = buildModule("Submodule", (m) => { // const depositValue = m.getParameter("depositValue", 1000); const passingValue = m.contract("PassingValue"); @@ -146,7 +146,7 @@ describe("calls", () => { return { passingValue }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { passingValue } = m.useModule(submoduleDefinition); return { passingValue }; diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 715b1b0441..9271cbcc30 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -8,7 +8,7 @@ describe("contract deploys", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to deploy a contract", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; @@ -20,7 +20,7 @@ describe("contract deploys", () => { }); it("should be able to deploy a contract with arguments", async function () { - const moduleDefinition = defineModule("GreeterModule", (m) => { + const moduleDefinition = buildModule("GreeterModule", (m) => { const greeter = m.contract("Greeter", ["Hello World"]); return { greeter }; @@ -33,7 +33,7 @@ describe("contract deploys", () => { }); it("should be able to deploy contracts with dependencies", async function () { - const moduleDefinition = defineModule("DependentModule", (m) => { + const moduleDefinition = buildModule("DependentModule", (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", [bar]); @@ -51,7 +51,7 @@ describe("contract deploys", () => { }); it("should be able to deploy contracts without dependencies", async function () { - const moduleDefinition = defineModule("WithoutDepModule", (m) => { + const moduleDefinition = buildModule("WithoutDepModule", (m) => { const foo = m.contract("Foo"); const bar = m.contract("Bar"); @@ -72,7 +72,7 @@ describe("contract deploys", () => { const artifact = await this.hre.artifacts.readArtifact("Greeter"); - const moduleDefinition = defineModule("ArtifactModule", (m) => { + const moduleDefinition = buildModule("ArtifactModule", (m) => { const greeter = m.contractFromArtifact("Greeter", artifact, [ "Hello World", ]); @@ -88,7 +88,7 @@ describe("contract deploys", () => { describe("with endowment", () => { it("should be able to deploy a contract with an endowment", async function () { - const moduleDefinition = defineModule("EndowmentModule", (m) => { + const moduleDefinition = buildModule("EndowmentModule", (m) => { const passingValue = m.contract("PassingValue", [], { value: BigInt(this.hre.ethers.utils.parseEther("1").toString()), }); @@ -112,7 +112,7 @@ describe("contract deploys", () => { // TODO: bring this back once parameters for value enabled it.skip("should be able to deploy a contract with an endowment via a parameter", async function () { - const submoduleDefinition = defineModule("submodule", (m) => { + const submoduleDefinition = buildModule("submodule", (m) => { const endowment = m.getParameter( "endowment", BigInt(this.hre.ethers.utils.parseEther("2").toString()) @@ -125,7 +125,7 @@ describe("contract deploys", () => { return { passingValue }; }); - const moduleDefinition = defineModule("Module", (m) => { + const moduleDefinition = buildModule("Module", (m) => { const { passingValue } = m.useModule(submoduleDefinition); return { passingValue }; diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts index cac95b00fc..a8bb1ec24b 100644 --- a/packages/hardhat-plugin/test/error-handling.ts +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -10,18 +10,18 @@ describe("module error handling", () => { it("should error on passing async callback", async function () { await assert.isRejected( this.deploy( - defineModule("AsyncModule", (async () => { + buildModule("AsyncModule", (async () => { return {}; }) as any) ), - /The callback passed to 'defineModule' for AsyncModule returns a Promise; async callbacks are not allowed in 'defineModule'./ + /The callback passed to 'buildModule' for AsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./ ); }); it("should error on module throwing an exception", async function () { await assert.isRejected( this.deploy( - defineModule("AsyncModule", () => { + buildModule("AsyncModule", () => { throw new Error("User thrown error"); }) ), diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/events.ts index 501bca5064..b1453ea19a 100644 --- a/packages/hardhat-plugin/test/events.ts +++ b/packages/hardhat-plugin/test/events.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -8,7 +8,7 @@ describe("events", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to use the output of a readEvent in a contract at", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -35,7 +35,7 @@ describe("events", () => { it("should be able to use the output of a readEvent in an artifact contract at", async function () { const artifact = await this.hre.artifacts.readArtifact("Foo"); - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts index 85deeb93ae..587438359c 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -19,7 +19,7 @@ describe("execution - deploy contractAt from artifact", function () { it("should deploy a contract that is callable", async function () { // Arrange - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; @@ -38,7 +38,7 @@ describe("execution - deploy contractAt from artifact", function () { // Act const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); - const contractAtModuleDefinition = defineModule("FooModule", (m) => { + const contractAtModuleDefinition = buildModule("FooModule", (m) => { const atFoo = m.contractAtFromArtifact("AtFoo", fooAddress, fooArtifact); return { atFoo }; diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts index e6b010198a..3d5ee289f1 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -17,7 +17,7 @@ describe("execution - deploy contract at", function () { useEphemeralIgnitionProject("minimal-new-api"); it("should deploy a contract that is callable", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; @@ -34,7 +34,7 @@ describe("execution - deploy contract at", function () { assert.equal(fooAddress, "0x5FbDB2315678afecb367f032d93F642f64180aa3"); - const contractAtModuleDefinition = defineModule("FooModule", (m) => { + const contractAtModuleDefinition = buildModule("FooModule", (m) => { const foo = m.contractAt("Foo", fooAddress); return { foo }; diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts index a483b6bd9e..6a87ca9c53 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -17,7 +17,7 @@ describe("execution - deploy contract from artifact", function () { it("should deploy a contract that is callable", async function () { const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contractFromArtifact("Foo", fooArtifact); return { foo }; diff --git a/packages/hardhat-plugin/test/execution/deploy-contract.ts b/packages/hardhat-plugin/test/execution/deploy-contract.ts index c931572e11..5127079f60 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -17,7 +17,7 @@ describe("execution - deploy contract", function () { useEphemeralIgnitionProject("minimal-new-api"); it("should deploy a contract that is callable", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo"); return { foo }; diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts index 049c5f5a1d..2085516681 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "../use-ignition-project"; @@ -21,7 +21,7 @@ describe("execution - multiple batch contract deploy", function () { params: [false], }); - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const contract1 = m.contract("Foo", [], { id: "Contract1" }); const contractA = m.contract("Foo", [], { id: "ContractA" }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts index 2aca4c257d..7d7a1d1ddb 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { waitForPendingTxs } from "../../helpers"; @@ -22,7 +22,7 @@ describe("execution - error on pending user transactions", () => { it("should error if a transaction is in flight for an account used in the deploy", async function () { // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); const foo = m.contract("Foo", [], { from: account2 }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts index 5f6780ec2e..96b0e10717 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -20,7 +20,7 @@ describe("execution - error on rerun with replaced pending user transaction", () ); it("should error on the second run", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts index 577146d560..cff3801042 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -16,7 +16,7 @@ describe("execution - error on transaction dropped", () => { it("should error on the drop being detected", async function () { // Setup a module with two contract deploys (foo1 and foo2) over 2 batches - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts index e31a3e8a9d..921e45dc1b 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -16,7 +16,7 @@ describe("execution - error on user transaction sent", () => { useFileIgnitionProject("minimal-new-api", "error-on-user-transaction-sent"); it("should error on the drop being detected", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts index fb7cc0e6b4..55c2a8be26 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -20,7 +20,7 @@ describe("execution - rerun with dropped ignition transactions", () => { ); it("should deploy successfully on second run", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo", []); return { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts index e5d6678c7e..7f7ebaa603 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -21,7 +21,7 @@ describe("execution - rerun with now complete ignition transactions", () => { it("should complete the run on the second attempt", async function () { // Setup a module with 6 foo contracts deployed in pairs of 2 over 3 batches - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts index 81b2851623..64c8ad5dc8 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -19,7 +19,7 @@ describe("execution - rerun with pending ignition transactions", () => { ); it("should complete the run on the second attempt", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts index 56d0e6c865..9cc1be7c63 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -22,7 +22,7 @@ describe("execution - rerun with replaced confirmed user transaction", () => { ); it("should deploy user interfered transaction on second run", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); // batch 1 diff --git a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts index 0040c512eb..f85a23cdfd 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -17,7 +17,7 @@ describe("execution - deploy run times out", () => { it("should error naming timed out transactions", async function () { // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); const foo = m.contract("Foo", [], { from: account2 }); diff --git a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts index c0eeabea17..9e41cd47c3 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { @@ -17,7 +17,7 @@ describe("execution - rerun a deploy that timed out", () => { it("should error naming timed out transactions", async function () { // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); const foo = m.contract("Foo", [], { from: account2 }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index 6f4973c13c..39fda7e907 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -15,7 +15,7 @@ describe("existing contract", () => { "UsesContract" ); - const firstModuleDefinition = defineModule("FirstModule", (m) => { + const firstModuleDefinition = buildModule("FirstModule", (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", [ "0x0000000000000000000000000000000000000000", @@ -31,7 +31,7 @@ describe("existing contract", () => { const barAddress: string = firstResult.bar.address; const usesContractAddress: string = firstResult.usesContract.address; - const secondModuleDefinition = defineModule("SecondModule", (m) => { + const secondModuleDefinition = buildModule("SecondModule", (m) => { const bar = m.contractAt("Bar", barAddress, barArtifact); const usesContract = m.contractAt( "UsesContract", diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js index b272036d4a..cb7a2935d8 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/minimal-new-api/ignition/MyModule.js @@ -1,7 +1,7 @@ // eslint-disable-next-line import/no-unused-modules -const { defineModule } = require("@ignored/ignition-core"); +const { buildModule } = require("@ignored/ignition-core"); -module.exports = defineModule("MyModule", (m) => { +module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar"); const usesContract = m.contract("UsesContract", [ "0x0000000000000000000000000000000000000000", diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 9db37cb879..7bb076419a 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -9,7 +9,7 @@ describe("libraries", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to deploy a contract that depends on a hardhat library", async function () { - const moduleDefinition = defineModule("WithLibModule", (m) => { + const moduleDefinition = buildModule("WithLibModule", (m) => { const rubbishMath = m.library("RubbishMath"); const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { @@ -41,7 +41,7 @@ describe("libraries", () => { "RubbishMath" ); - const moduleDefinition = defineModule("ArtifactLibraryModule", (m) => { + const moduleDefinition = buildModule("ArtifactLibraryModule", (m) => { const rubbishMath = m.libraryFromArtifact("RubbishMath", libraryArtifact); const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { @@ -67,7 +67,7 @@ describe("libraries", () => { }); it("should deploy a contract with an existing library", async function () { - const libraryModuleDefinition = defineModule("LibraryModule", (m) => { + const libraryModuleDefinition = buildModule("LibraryModule", (m) => { const rubbishMath = m.library("RubbishMath"); return { rubbishMath }; @@ -78,7 +78,7 @@ describe("libraries", () => { const libAddress = libDeployResult.rubbishMath.address; const libAbi = libDeployResult.rubbishMath.abi; - const moduleDefinition = defineModule("ConsumingLibModule", (m) => { + const moduleDefinition = buildModule("ConsumingLibModule", (m) => { const rubbishMath = m.contractAt("RubbishMath", libAddress, libAbi); const dependsOnLib = m.contract("DependsOnLib", [], { @@ -97,7 +97,7 @@ describe("libraries", () => { }); it("should be able to deploy a library that depends on a library", async function () { - const moduleDefinition = defineModule("ArtifactLibraryModule", (m) => { + const moduleDefinition = buildModule("ArtifactLibraryModule", (m) => { const rubbishMath = m.library("RubbishMath"); const libDependsOnLib = m.library("LibDependsOnLib", { diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index 6bddfa08c8..6e8a0c1449 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -8,7 +8,7 @@ describe("module parameters", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to retrieve a default number", async function () { - const moduleDefinition = defineModule("WithDefaultModule", (m) => { + const moduleDefinition = buildModule("WithDefaultModule", (m) => { const myNumber = m.getParameter("MyNumber", 42); const foo = m.contract("Foo"); @@ -26,7 +26,7 @@ describe("module parameters", () => { }); it("should be able to override a default number", async function () { - const moduleDefinition = defineModule("WithDefaultModule", (m) => { + const moduleDefinition = buildModule("WithDefaultModule", (m) => { const myNumber = m.getParameter("MyNumber", 10); const foo = m.contract("Foo"); @@ -46,7 +46,7 @@ describe("module parameters", () => { }); it("should be able to retrieve a default string", async function () { - const moduleDefinition = defineModule("WithDefaultStringModule", (m) => { + const moduleDefinition = buildModule("WithDefaultStringModule", (m) => { const myString = m.getParameter("MyString", "Example"); const greeter = m.contract("Greeter", [myString]); @@ -62,7 +62,7 @@ describe("module parameters", () => { }); it("should be able to override a default string", async function () { - const moduleDefinition = defineModule("WithDefaultStringModule", (m) => { + const moduleDefinition = buildModule("WithDefaultStringModule", (m) => { const myString = m.getParameter("MyString", "Example"); const greeter = m.contract("Greeter", [myString]); @@ -87,7 +87,7 @@ describe.skip("validation", () => { it("should throw if no parameters object provided", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = defineModule("UserModule", (m) => { + const userModule = buildModule("UserModule", (m) => { const myNumber = m.getParameter("MyNumber"); const foo = m.contract("Foo"); @@ -108,7 +108,7 @@ describe.skip("validation", () => { it("should throw if parameter missing from parameters", async function () { await this.hre.run("compile", { quiet: true }); - const userModule = defineModule("UserModule", (m) => { + const userModule = buildModule("UserModule", (m) => { const myNumber = m.getParameter("MyNumber"); const foo = m.contract("Foo"); diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index 8320821db6..40b1960774 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -8,7 +8,7 @@ describe("static calls", () => { useEphemeralIgnitionProject("minimal-new-api"); it("should be able to use the output of a static call in a contract at", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -33,7 +33,7 @@ describe("static calls", () => { it("should be able to use the output of a static call in an artifact contract at", async function () { const artifact = await this.hre.artifacts.readArtifact("Foo"); - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -56,7 +56,7 @@ describe("static calls", () => { }); it("should be able to use the output of a static call function in a contract at (with arg)", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -79,7 +79,7 @@ describe("static calls", () => { }); it("should be able to use the output of a static call function in a contract at (with function signature)", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -102,7 +102,7 @@ describe("static calls", () => { }); it("should not be able to use the output of a non-address static call in a contract at", async function () { - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); @@ -127,7 +127,7 @@ describe("static calls", () => { it("should not be able to use the output of a non-address static call in an artifact contract at", async function () { const artifact = await this.hre.artifacts.readArtifact("Foo"); - const moduleDefinition = defineModule("FooModule", (m) => { + const moduleDefinition = buildModule("FooModule", (m) => { const account1 = m.getAccount(1); const fooFactory = m.contract("FooFactory", [], { from: account1 }); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index 49ce9f59d1..acceed119c 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; @@ -11,13 +11,13 @@ describe("useModule", function () { it("using useModule", async function () { await this.hre.run("compile", { quiet: true }); - const thirdPartyModule = defineModule("ThirdPartySubmodule", (m) => { + const thirdPartyModule = buildModule("ThirdPartySubmodule", (m) => { const foo = m.contract("Foo"); return { foo }; }); - const userModule = defineModule("UserModule", (m) => { + const userModule = buildModule("UserModule", (m) => { const { foo } = m.useModule(thirdPartyModule); m.call(foo, "inc"); @@ -35,7 +35,7 @@ describe("useModule", function () { it("should execute all in a module before any that depends on a contract within the module", async function () { await this.hre.run("compile", { quiet: true }); - const firstSecondAndThirdModule = defineModule( + const firstSecondAndThirdModule = buildModule( "SecondAndThirdCallModule", (m) => { const trace = m.contract("Trace", ["first"]); @@ -51,7 +51,7 @@ describe("useModule", function () { } ); - const fourthCallModule = defineModule("FourthCallModule", (m) => { + const fourthCallModule = buildModule("FourthCallModule", (m) => { const { trace } = m.useModule(firstSecondAndThirdModule); m.call(trace, "addEntry", ["fourth"]); @@ -59,7 +59,7 @@ describe("useModule", function () { return { trace }; }); - const userModule = defineModule("UserModule", (m) => { + const userModule = buildModule("UserModule", (m) => { const { trace } = m.useModule(fourthCallModule); return { trace }; diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index 485bfc3065..594ec4a518 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -1,8 +1,8 @@ -import { defineModule } from "@ignored/ignition-core"; +import { buildModule } from "@ignored/ignition-core"; const fakeArtifact = ["fake artifact"]; -const uniswap = defineModule("Uniswap", (m) => { +const uniswap = buildModule("Uniswap", (m) => { const router = m.contract("UniswapRouter", [1, 2, 3]); m.call(router, "configure", [3, 4, 5]); @@ -10,7 +10,7 @@ const uniswap = defineModule("Uniswap", (m) => { return { router }; }); -const balancerDefinition = defineModule("Balancer", (m) => { +const balancerDefinition = buildModule("Balancer", (m) => { const safeMath = m.library("SafeMath"); const balancer = m.contract("BalancerCore", [], { @@ -26,7 +26,7 @@ const balancerDefinition = defineModule("Balancer", (m) => { return { balancer }; }); -const synthetixDefinition = defineModule("Synthetix", (m) => { +const synthetixDefinition = buildModule("Synthetix", (m) => { const synthetixCore = m.contractAt("SynthetixCore", "0x0123", fakeArtifact); const { router } = m.useModule(uniswap); @@ -36,7 +36,7 @@ const synthetixDefinition = defineModule("Synthetix", (m) => { return { synthetix: synthetixCore }; }); -const moduleDefinition = defineModule("MyModule", (m) => { +const moduleDefinition = buildModule("MyModule", (m) => { const { synthetix } = m.useModule(synthetixDefinition); const { balancer } = m.useModule(balancerDefinition); From a3a8e77171f98ee86370fc12954b00fdba225064 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Jul 2023 09:55:06 +0100 Subject: [PATCH 0597/1302] fix: arg listing calls in plan If a call includes the arg list (e.g. "setUniswap(boolean,address)") we need to escape the brackets and commas to form an allowed mermaid id. I used a `window.diagram` local variable on the plan page to diagnose the issue and intend to retain it to help trouble shooting. Fixes #351. --- examples/ens/ignition/test-registrar.js | 2 +- package-lock.json | 114 ++++++++++ packages/ui/.mocharc.json | 3 + packages/ui/examples/ComplexModule.js | 2 +- packages/ui/package.json | 8 +- packages/ui/src/components/mermaid.tsx | 10 +- packages/ui/src/utils/to-mermaid.ts | 56 +++-- packages/ui/test/to-mermaid.ts | 269 ++++++++++++++++++++++++ 8 files changed, 444 insertions(+), 20 deletions(-) create mode 100644 packages/ui/.mocharc.json create mode 100644 packages/ui/test/to-mermaid.ts diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js index 3eaf2bf737..1cad60905a 100644 --- a/examples/ens/ignition/test-registrar.js +++ b/examples/ens/ignition/test-registrar.js @@ -11,7 +11,7 @@ const ZERO_HASH = const ACCOUNT_0 = "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"; -module.exports = buildModule("`TEST` registrar", (m) => { +module.exports = buildModule("TEST registrar", (m) => { const tld = "test"; const tldHash = namehash.hash(tld); const tldLabel = labelhash(tld); diff --git a/package-lock.json b/package-lock.json index 763f5cb780..04c454474d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21312,15 +21312,20 @@ "styled-components": "5.3.10" }, "devDependencies": { + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/styled-components": "5.1.26", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", "@vitejs/plugin-react": "^4.0.0", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", + "mocha": "^9.1.3", "rimraf": "3.0.2", "typescript": "^5.0.2", "vite": "^4.3.2", @@ -21511,6 +21516,15 @@ "node": ">=0.4.0" } }, + "packages/ui/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "packages/ui/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -21532,6 +21546,15 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "packages/ui/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "packages/ui/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -21776,6 +21799,91 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "packages/ui/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "packages/ui/node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/ui/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "packages/ui/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "packages/ui/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "packages/ui/node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -21862,6 +21970,12 @@ "engines": { "node": ">=14.17" } + }, + "packages/ui/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true } } } diff --git a/packages/ui/.mocharc.json b/packages/ui/.mocharc.json new file mode 100644 index 0000000000..5ec3aeaca2 --- /dev/null +++ b/packages/ui/.mocharc.json @@ -0,0 +1,3 @@ +{ + "require": "ts-node/register/transpile-only" +} diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index 594ec4a518..3b3d2bc732 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -31,7 +31,7 @@ const synthetixDefinition = buildModule("Synthetix", (m) => { const { router } = m.useModule(uniswap); - m.call(synthetixCore, "setUniswap", [router]); + m.call(synthetixCore, "setUniswap(boolean,address)", [false, router]); return { synthetix: synthetixCore }; }); diff --git a/packages/ui/package.json b/packages/ui/package.json index 00c918b240..d0a066aa96 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -6,7 +6,7 @@ "predev": "npm run regenerate-deployment-example", "dev": "vite --force", "build": "tsc && vite build", - "test": "exit 0", + "test": "mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", @@ -22,16 +22,22 @@ "styled-components": "5.3.10" }, "devDependencies": { + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/styled-components": "5.1.26", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/parser": "^5.57.1", "@vitejs/plugin-react": "^4.0.0", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", + "mocha": "^9.1.3", "rimraf": "3.0.2", + "ts-node": "10.9.1", "typescript": "^5.0.2", "vite": "^4.3.2", "vite-plugin-singlefile": "0.13.5" diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index 18138b052e..cf9c8431eb 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -8,7 +8,15 @@ import { toMermaid } from "../utils/to-mermaid"; export const Mermaid: React.FC<{ deployment: StoredDeployment; }> = ({ deployment }) => { - const diagram = useMemo(() => toMermaid(deployment), [deployment]); + const diagram = useMemo(() => { + const d = toMermaid(deployment); + + // NOTE: this is explicitly added to aid troubleshooting + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (window as any).diagram = d; + + return d; + }, [deployment]); useEffect(() => { mermaid.initialize({}); diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 3ff7a57c00..3bd01161f7 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -6,8 +6,8 @@ import { StoredDeployment, isFuture, } from "@ignored/ignition-core/ui-helpers"; -import { getAllFuturesForModule } from "../queries/futures"; -import { argumentTypeToString } from "./argumentTypeToString"; +import { getAllFuturesForModule } from "../queries/futures.js"; +import { argumentTypeToString } from "./argumentTypeToString.js"; export function toMermaid(deployment: StoredDeployment) { const modules = recursivelyListModulesAndSubmodulesFor(deployment.module); @@ -19,7 +19,12 @@ export function toMermaid(deployment: StoredDeployment) { const futureDependencies = [ ...new Set( getAllFuturesForModule(deployment.module) - .flatMap((f) => Array.from(f.dependencies).map((d) => [f.id, d.id])) + .flatMap((f) => + Array.from(f.dependencies).map((d) => [ + toEscapedId(f.id), + toEscapedId(d.id), + ]) + ) .map(([from, to]) => `${from} --> ${to}`) ), ].join("\n"); @@ -27,23 +32,23 @@ export function toMermaid(deployment: StoredDeployment) { const moduleDependencies = [ ...new Set( modules - .flatMap((f) => Array.from(f.submodules).map((d) => [f.id, d.id])) + .flatMap((f) => + Array.from(f.submodules).map((d) => [ + toEscapedId(f.id), + toEscapedId(d.id), + ]) + ) .map(([from, to]) => `${from} -.-> ${to}`) ), ].join("\n"); - return `flowchart BT\n\n${deployment.module.id}:::startModule\n\n${subgraphSections}\n\n${futureDependencies}\n\n${moduleDependencies}\n\nclassDef startModule stroke-width:4px`; -} - -function prettyPrintModule( - module: IgnitionModule>, - lineIndent = "" -): string { - const futureList = Array.from(module.futures) - .map((f) => `${lineIndent}${f.id}["${toLabel(f)}"]`) - .join(`\n${lineIndent}`); - - return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction BT\n\n${lineIndent}${lineIndent}${futureList}\n${lineIndent}end`; + return `flowchart BT\n\n${toEscapedId( + deployment.module.id + )}:::startModule\n\n${subgraphSections}${ + futureDependencies === "" ? "" : "\n\n" + futureDependencies + }${ + moduleDependencies === "" ? "" : "\n\n" + moduleDependencies + }\n\nclassDef startModule stroke-width:4px`; } function recursivelyListModulesAndSubmodulesFor( @@ -56,6 +61,17 @@ function recursivelyListModulesAndSubmodulesFor( ); } +function prettyPrintModule( + module: IgnitionModule>, + lineIndent = "" +): string { + const futureList = Array.from(module.futures) + .map((f) => `${lineIndent}${toEscapedId(f.id)}["${toLabel(f)}"]`) + .join(`\n${lineIndent}`); + + return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction BT\n\n${lineIndent}${futureList}\n${lineIndent}end`; +} + function toLabel(f: Future): string { switch (f.type) { case FutureType.NAMED_CONTRACT_DEPLOYMENT: @@ -98,3 +114,11 @@ function toLabel(f: Future): string { }`; } } + +function toEscapedId(id: string): string { + return id + .replace("(", "_") + .replace(")", "_") + .replace(",", "_") + .replace(" ", "_"); +} diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts new file mode 100644 index 0000000000..2de1338445 --- /dev/null +++ b/packages/ui/test/to-mermaid.ts @@ -0,0 +1,269 @@ +import { + Artifact, + IgnitionModuleDefinition, + IgnitionModuleResult, + ModuleConstructor, + buildModule, +} from "@ignored/ignition-core"; +import { assert } from "chai"; +import { toMermaid } from "../src/utils/to-mermaid.js"; + +describe("to-mermaid", () => { + it("should render a single deploy contract diagram", () => { + const moduleDefinition = buildModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module:::startModule + + subgraph Module + direction BT + + Module:Contract1["Deploy Contract1"] + end + + classDef startModule stroke-width:4px`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a module with a space in the name", () => { + const moduleDefinition = buildModule("Test registrar", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1", [{ arr: [p] }]); + + return { contract1 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Test_registrar:::startModule + + subgraph Test registrar + direction BT + + Test_registrar:Contract1["Deploy Contract1"] + end + + classDef startModule stroke-width:4px`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a multi-module deploy diagram", () => { + const sub1 = buildModule("Submodule1", (m) => { + const contract1 = m.contract("Contract1", []); + + return { contract1 }; + }); + + const sub2 = buildModule("Submodule2", (m) => { + const contract2 = m.contract("Contract2", []); + + return { contract2 }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { contract1 } = m.useModule(sub1); + const { contract2 } = m.useModule(sub2); + + const contract3 = m.contract("Contract3", [], { + after: [contract1, contract2], + }); + + return { contract3 }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module:::startModule + + subgraph Module + direction BT + + Module:Contract3["Deploy Contract3"] + end + subgraph Submodule1 + direction BT + + Submodule1:Contract1["Deploy Contract1"] + end + subgraph Submodule2 + direction BT + + Submodule2:Contract2["Deploy Contract2"] + end + + Module:Contract3 --> Submodule1:Contract1 + Module:Contract3 --> Submodule2:Contract2 + + Module -.-> Submodule1 + Module -.-> Submodule2 + + classDef startModule stroke-width:4px`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render a complex diagram with all actions", () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const libArtifact = fakeArtifact; + const withLibArtifact = fakeArtifact; + + const moduleDefinition = buildModule("Module", (m) => { + const basic = m.contract("BasicContract"); + const library = m.library("BasicLibrary"); + const libFromArtifact = m.libraryFromArtifact( + "BasicLibrary", + libArtifact, + { + id: "BasicLibrary2", + } + ); + const withLib = m.contractFromArtifact( + "ContractWithLibrary", + withLibArtifact, + [], + { + libraries: { BasicLibrary: library }, + } + ); + + const call = m.call(basic, "basicFunction", [40]); + const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); + m.staticCall(withLib, "readonlyFunction", [eventArg]); + + const duplicate = m.contractAt("BasicContract", basic, { + id: "BasicContract2", + }); + const duplicateWithLib = m.contractAtFromArtifact( + "ContractWithLibrary", + withLib, + withLibArtifact, + { id: "ContractWithLibrary2" } + ); + + m.send("test-send", duplicate, 123n); + + return { + basic, + library, + libFromArtifact, + withLib, + duplicate, + duplicateWithLib, + }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module:::startModule + + subgraph Module + direction BT + + Module:BasicContract["Deploy BasicContract"] + Module:BasicLibrary["Deploy library BasicLibrary"] + Module:BasicLibrary2["Deploy library from artifact BasicLibrary"] + Module:ContractWithLibrary["Deploy from artifact ContractWithLibrary"] + Module:BasicContract#basicFunction["Call BasicContract/basicFunction"] + Module:BasicContract#BasicEvent#eventArg#0["Read event from future Module:BasicContract#basicFunction (event BasicEvent argument eventArg)"] + Module:ContractWithLibrary#readonlyFunction["Static call ContractWithLibrary/readonlyFunction"] + Module:BasicContract2["Existing contract BasicContract (Module:BasicContract)"] + Module:ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module:ContractWithLibrary)"] + Module:test-send["Send data to Module:BasicContract2"] + end + + Module:ContractWithLibrary --> Module:BasicLibrary + Module:BasicContract#basicFunction --> Module:BasicContract + Module:BasicContract#BasicEvent#eventArg#0 --> Module:BasicContract#basicFunction + Module:ContractWithLibrary#readonlyFunction --> Module:ContractWithLibrary + Module:ContractWithLibrary#readonlyFunction --> Module:BasicContract#BasicEvent#eventArg#0 + Module:BasicContract2 --> Module:BasicContract + Module:ContractWithLibrary2 --> Module:ContractWithLibrary + Module:test-send --> Module:BasicContract2 + + classDef startModule stroke-width:4px`; + + assertDiagram(moduleDefinition, expectedResult); + }); + + it("should render calls with args", () => { + const moduleDefinition = buildModule("Module", (m) => { + const resolver = m.contract("ens", []); + + m.call(resolver, "setAddr(bytes32,address)", [123, "0x0123"]); + m.staticCall(resolver, "getAddr(bytes32,address)", [123, "0x0123"]); + + return { resolver }; + }); + + const expectedResult = testFormat` + flowchart BT + + Module:::startModule + + subgraph Module + direction BT + + Module:ens["Deploy ens"] + Module:ens#setAddr_bytes32_address_["Call ens/setAddr(bytes32,address)"] + Module:ens#getAddr_bytes32_address_["Static call ens/getAddr(bytes32,address)"] + end + + Module:ens#setAddr_bytes32_address_ --> Module:ens + Module:ens#getAddr_bytes32_address_ --> Module:ens + + classDef startModule stroke-width:4px`; + + assertDiagram(moduleDefinition, expectedResult); + }); +}); + +function assertDiagram( + moduleDefinition: IgnitionModuleDefinition< + string, + string, + IgnitionModuleResult + >, + expectedResult: string +) { + const details = { + networkName: "hardhat", + chainId: 31117, + }; + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDefinition); + + const result = toMermaid({ + details, + module, + }); + + assert.equal(result, expectedResult); +} + +function testFormat(expected: TemplateStringsArray): string { + return expected + .toString() + .substring(1) + .split("\n") + .map((line) => line.substring(6)) + .join("\n"); +} From e0dad38de460be150904bd2a5e7dc492390a40d3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 2 Aug 2023 01:34:15 -0400 Subject: [PATCH 0598/1302] replace use of `any` in hardhat-plugin --- packages/hardhat-plugin/src/index.ts | 29 ++++++++++++--------- packages/hardhat-plugin/src/load-module.ts | 10 +++++-- packages/hardhat-plugin/test/load-module.ts | 4 +-- 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index e131682ade..06b55c9b6e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,4 +1,9 @@ -import { deploy, ModuleConstructor, wipe } from "@ignored/ignition-core"; +import { + deploy, + DeploymentParameters, + ModuleConstructor, + wipe, +} from "@ignored/ignition-core"; import "@nomiclabs/hardhat-ethers"; import { BigNumber } from "ethers"; import { existsSync, readdirSync, readJSONSync } from "fs-extra"; @@ -119,7 +124,7 @@ task("deploy") await hre.run("compile", { quiet: true }); - const userModule: any | undefined = loadModule( + const userModule = loadModule( hre.config.paths.ignition, moduleNameOrPath ); @@ -129,10 +134,10 @@ task("deploy") process.exit(0); } - let parameters: any | undefined; + let parameters: DeploymentParameters | undefined; if (parametersInput === undefined) { parameters = resolveParametersFromModuleName( - userModule.name, + userModule.id, hre.config.paths.ignition ); } else if (parametersInput.endsWith(".json")) { @@ -160,9 +165,8 @@ task("deploy") adapters, artifactResolver, deploymentDir, - moduleDefinition: userModule as any, - // TODO: parameters needs properly typed with module - deploymentParameters: (parameters as any) ?? {}, + moduleDefinition: userModule, + deploymentParameters: parameters ?? {}, accounts, verbose: logs, }); @@ -226,8 +230,7 @@ task("plan") ) => { await hre.run("compile", { quiet: true }); - // TODO: alter loadModule to return new-api modules at type level - const userModule: any = loadModule( + const userModule = loadModule( hre.config.paths.ignition, moduleNameOrPath ); @@ -348,7 +351,7 @@ task("wipe") function resolveParametersFromModuleName( moduleName: string, ignitionPath: string -): any | undefined { +): DeploymentParameters | undefined { const files = readdirSync(ignitionPath); const configFilename = `${moduleName}.config.json`; @@ -357,13 +360,13 @@ function resolveParametersFromModuleName( : undefined; } -function resolveParametersFromFileName(fileName: string): any { +function resolveParametersFromFileName(fileName: string): DeploymentParameters { const filepath = path.resolve(process.cwd(), fileName); return resolveConfigPath(filepath); } -function resolveConfigPath(filepath: string): any { +function resolveConfigPath(filepath: string): DeploymentParameters { try { return require(filepath); } catch { @@ -372,7 +375,7 @@ function resolveConfigPath(filepath: string): any { } } -function resolveParametersString(paramString: string): any { +function resolveParametersString(paramString: string): DeploymentParameters { try { return JSON.parse(paramString); } catch { diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index cf3aa5ac7e..78212fa4a4 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,4 +1,8 @@ -import { IgnitionError } from "@ignored/ignition-core"; +import { + IgnitionError, + IgnitionModuleDefinition, + IgnitionModuleResult, +} from "@ignored/ignition-core"; import setupDebug from "debug"; import { existsSync, pathExistsSync } from "fs-extra"; import path from "path"; @@ -8,7 +12,9 @@ const debug = setupDebug("hardhat-ignition:modules"); export function loadModule( modulesDirectory: string, moduleNameOrPath: string -): any | undefined { +): + | IgnitionModuleDefinition> + | undefined { debug(`Loading user modules from '${modulesDirectory}'`); if (!existsSync(modulesDirectory)) { diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index 8996021629..948d93130f 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -12,7 +12,7 @@ describe.skip("loadModule", function () { assert.fail("Module was not loaded"); } - assert.equal(module.name, "testing123"); + // assert.equal(module.name, "testing123"); }); it("should return the module given the module name and extension", () => { @@ -22,7 +22,7 @@ describe.skip("loadModule", function () { assert.fail("Module was not loaded"); } - assert.equal(module.name, "testing123"); + // assert.equal(module.name, "testing123"); }); it("should throw if the module name does not exist", () => { From a0a5af7e56e65fd1b963c398ee46fc18636ed233 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 2 Aug 2023 01:41:37 -0400 Subject: [PATCH 0599/1302] re-enable the module loading tests --- .../user-modules/ignition/TestModule.js | 4 ++-- packages/hardhat-plugin/test/load-module.ts | 11 +++++++---- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js index 9da83b38b8..9403fd43db 100644 --- a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/TestModule.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/no-unused-modules module.exports = { - name: "testing123", - action: () => {}, + id: "testing123", + moduleDefintionFunction: () => {}, }; diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index 948d93130f..f79fcd9826 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -3,8 +3,11 @@ import { assert } from "chai"; import { loadModule } from "../src/load-module"; -// TODO: convert over once old code paths are removed -describe.skip("loadModule", function () { +import { useEphemeralIgnitionProject } from "./use-ignition-project"; + +describe("loadModule", function () { + useEphemeralIgnitionProject("user-modules"); + it("should return the module given the module name", () => { const module = loadModule("ignition", "TestModule"); @@ -12,7 +15,7 @@ describe.skip("loadModule", function () { assert.fail("Module was not loaded"); } - // assert.equal(module.name, "testing123"); + assert.equal(module.id, "testing123"); }); it("should return the module given the module name and extension", () => { @@ -22,7 +25,7 @@ describe.skip("loadModule", function () { assert.fail("Module was not loaded"); } - // assert.equal(module.name, "testing123"); + assert.equal(module.id, "testing123"); }); it("should throw if the module name does not exist", () => { From 0c53077833dd19641984c9e00c252e5007233ec4 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 26 Jul 2023 20:03:11 -0400 Subject: [PATCH 0600/1302] add validation errors for invalid account indexes --- .../internal/execution/execution-engine.ts | 5 +- .../utils/resolve-account-runtime-value.ts | 21 +++ .../internal/utils/resolve-from-address.ts | 3 +- .../new-api/execution/execution-engine.ts | 134 ++++++++++++++++++ 4 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index 0c5936198d..d6017050bc 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -79,6 +79,7 @@ import { } from "./guards"; import { onchainStateTransitions } from "./onchain-state-transitions"; import { sortFuturesByNonces } from "./sort-futures-by-nonces"; +import { resolveAccountRuntimeValue } from "../utils/resolve-account-runtime-value"; type ExecutionBatch = Future[]; @@ -1025,7 +1026,9 @@ export class ExecutionEngine { future: (f) => { return resolveFutureToValue(f, context); }, - accountRuntimeValue: (arv) => context.accounts[arv.accountIndex], + accountRuntimeValue: (arv) => { + return resolveAccountRuntimeValue(arv, context.accounts); + }, moduleParameterRuntimeValue: (mprv) => { return resolveModuleParameter(mprv, context); }, diff --git a/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts b/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts new file mode 100644 index 0000000000..afac328e1c --- /dev/null +++ b/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts @@ -0,0 +1,21 @@ +import { IgnitionValidationError } from "../../../errors"; +import { AccountRuntimeValue } from "../../types/module"; + +export function resolveAccountRuntimeValue( + arv: AccountRuntimeValue, + accounts: string[] +): string { + if (arv.accountIndex < 0) { + throw new IgnitionValidationError( + `Account index cannot be a negative number` + ); + } + + if (arv.accountIndex >= accounts.length) { + throw new IgnitionValidationError( + `Requested account index '${arv.accountIndex}' is greater than the total number of available accounts '${accounts.length}'` + ); + } + + return accounts[arv.accountIndex]; +} diff --git a/packages/core/src/new-api/internal/utils/resolve-from-address.ts b/packages/core/src/new-api/internal/utils/resolve-from-address.ts index 8f67df9323..a30642fe30 100644 --- a/packages/core/src/new-api/internal/utils/resolve-from-address.ts +++ b/packages/core/src/new-api/internal/utils/resolve-from-address.ts @@ -3,6 +3,7 @@ import { AccountRuntimeValue } from "../../types/module"; import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "./assertions"; +import { resolveAccountRuntimeValue } from "./resolve-account-runtime-value"; export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, @@ -27,7 +28,7 @@ export function resolveFromAddress( `Could not resolve from address: ${JSON.stringify(from)}` ); - const runtimeAddress = accounts[from.accountIndex]; + const runtimeAddress = resolveAccountRuntimeValue(from, accounts); assertIgnitionInvariant( isAddress(runtimeAddress), diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 730dcb23c9..cfbdbcb1f9 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2468,4 +2468,138 @@ describe("execution engine", () => { }); }); }); + + describe("with invalid account indexes", () => { + const addr1 = "0x1F98431c8aD98523631AE4a59f267346ea31F981"; + const addr2 = "0x1F98431c8aD98523631AE4a59f267346ea31F982"; + const addr3 = "0x1F98431c8aD98523631AE4a59f267346ea31F983"; + const addr4 = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const addr5 = "0x1F98431c8aD98523631AE4a59f267346ea31F985"; + const addr6 = "0x1F98431c8aD98523631AE4a59f267346ea31F986"; + + const tx1 = "0x111"; + const tx2 = "0x222"; + const tx3 = "0x333"; + const tx4 = "0x444"; + const tx5 = "0x555"; + const tx6 = "0x666"; + + it("should not allow indexing an account less than zero", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const from = m.getAccount(-1); + const contract = m.contract("Contract1", [], { from }); + + return { contract }; + }); + + const deployer = setupDeployerWithMocks({ + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr1, + transactionHash: tx1, + }, + 1: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr2, + transactionHash: tx2, + }, + 2: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr3, + transactionHash: tx3, + }, + }, + [accounts[2]]: { + 0: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr4, + transactionHash: tx4, + }, + 1: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr5, + transactionHash: tx5, + }, + 2: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr6, + transactionHash: tx6, + }, + }, + }, + }); + + assert.isRejected( + deployer.deploy(moduleDefinition, {}, exampleAccounts), + /Account index cannot be a negative number/ + ); + }); + + it("should not allow indexing an account greater than the number of available accounts", async () => { + const moduleDefinition = defineModule("Module1", (m) => { + const from = m.getAccount(10); + const contract = m.contract("Contract1", [], { from }); + + return { contract }; + }); + + const deployer = setupDeployerWithMocks({ + transactionResponses: { + [accounts[1]]: { + 0: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr1, + transactionHash: tx1, + }, + 1: { + blockNumber: 0, + confirmations: 1, + contractAddress: addr2, + transactionHash: tx2, + }, + 2: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr3, + transactionHash: tx3, + }, + }, + [accounts[2]]: { + 0: { + blockNumber: 1, + confirmations: 1, + contractAddress: addr4, + transactionHash: tx4, + }, + 1: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr5, + transactionHash: tx5, + }, + 2: { + blockNumber: 2, + confirmations: 1, + contractAddress: addr6, + transactionHash: tx6, + }, + }, + }, + }); + + assert.isRejected( + deployer.deploy(moduleDefinition, {}, exampleAccounts), + /Requested account index '10' is greater than the total number of available accounts '6'/ + ); + }); + }); }); From d8f88c9c267560983d144aa0a096e22503d9f00e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 27 Jul 2023 10:17:56 +0100 Subject: [PATCH 0601/1302] fix: apply eslint rule --- .../internal/execution/execution-engine.ts | 2 +- .../new-api/execution/execution-engine.ts | 110 +----------------- 2 files changed, 6 insertions(+), 106 deletions(-) diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index d6017050bc..df9f399249 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -59,6 +59,7 @@ import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; +import { resolveAccountRuntimeValue } from "../utils/resolve-account-runtime-value"; import { resolveFromAddress } from "../utils/resolve-from-address"; import { resolveContractFutureToAddress, @@ -79,7 +80,6 @@ import { } from "./guards"; import { onchainStateTransitions } from "./onchain-state-transitions"; import { sortFuturesByNonces } from "./sort-futures-by-nonces"; -import { resolveAccountRuntimeValue } from "../utils/resolve-account-runtime-value"; type ExecutionBatch = Future[]; diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index cfbdbcb1f9..1e877f960d 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2470,20 +2470,6 @@ describe("execution engine", () => { }); describe("with invalid account indexes", () => { - const addr1 = "0x1F98431c8aD98523631AE4a59f267346ea31F981"; - const addr2 = "0x1F98431c8aD98523631AE4a59f267346ea31F982"; - const addr3 = "0x1F98431c8aD98523631AE4a59f267346ea31F983"; - const addr4 = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; - const addr5 = "0x1F98431c8aD98523631AE4a59f267346ea31F985"; - const addr6 = "0x1F98431c8aD98523631AE4a59f267346ea31F986"; - - const tx1 = "0x111"; - const tx2 = "0x222"; - const tx3 = "0x333"; - const tx4 = "0x444"; - const tx5 = "0x555"; - const tx6 = "0x666"; - it("should not allow indexing an account less than zero", async () => { const moduleDefinition = defineModule("Module1", (m) => { const from = m.getAccount(-1); @@ -2492,52 +2478,9 @@ describe("execution engine", () => { return { contract }; }); - const deployer = setupDeployerWithMocks({ - transactionResponses: { - [accounts[1]]: { - 0: { - blockNumber: 0, - confirmations: 1, - contractAddress: addr1, - transactionHash: tx1, - }, - 1: { - blockNumber: 0, - confirmations: 1, - contractAddress: addr2, - transactionHash: tx2, - }, - 2: { - blockNumber: 1, - confirmations: 1, - contractAddress: addr3, - transactionHash: tx3, - }, - }, - [accounts[2]]: { - 0: { - blockNumber: 1, - confirmations: 1, - contractAddress: addr4, - transactionHash: tx4, - }, - 1: { - blockNumber: 2, - confirmations: 1, - contractAddress: addr5, - transactionHash: tx5, - }, - 2: { - blockNumber: 2, - confirmations: 1, - contractAddress: addr6, - transactionHash: tx6, - }, - }, - }, - }); + const deployer = setupDeployerWithMocks({}); - assert.isRejected( + await assert.isRejected( deployer.deploy(moduleDefinition, {}, exampleAccounts), /Account index cannot be a negative number/ ); @@ -2551,54 +2494,11 @@ describe("execution engine", () => { return { contract }; }); - const deployer = setupDeployerWithMocks({ - transactionResponses: { - [accounts[1]]: { - 0: { - blockNumber: 0, - confirmations: 1, - contractAddress: addr1, - transactionHash: tx1, - }, - 1: { - blockNumber: 0, - confirmations: 1, - contractAddress: addr2, - transactionHash: tx2, - }, - 2: { - blockNumber: 1, - confirmations: 1, - contractAddress: addr3, - transactionHash: tx3, - }, - }, - [accounts[2]]: { - 0: { - blockNumber: 1, - confirmations: 1, - contractAddress: addr4, - transactionHash: tx4, - }, - 1: { - blockNumber: 2, - confirmations: 1, - contractAddress: addr5, - transactionHash: tx5, - }, - 2: { - blockNumber: 2, - confirmations: 1, - contractAddress: addr6, - transactionHash: tx6, - }, - }, - }, - }); + const deployer = setupDeployerWithMocks({}); - assert.isRejected( + await assert.isRejected( deployer.deploy(moduleDefinition, {}, exampleAccounts), - /Requested account index '10' is greater than the total number of available accounts '6'/ + /Requested account index \'10\' is greater than the total number of available accounts \'5\'/ ); }); }); From b957b4e9c789af668dc6b8d0c032c4f08247bb11 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 2 Aug 2023 00:15:35 -0400 Subject: [PATCH 0602/1302] move account index validation to validation phase --- .../core/src/new-api/internal/deployer.ts | 7 ++- .../internal/execution/execution-engine.ts | 3 +- .../utils/resolve-account-runtime-value.ts | 21 -------- .../internal/utils/resolve-from-address.ts | 3 +- .../utils/retrieve-nested-runtime-values.ts | 41 ---------------- .../futures/validateArtifactContractAt.ts | 5 +- .../validateArtifactContractDeployment.ts | 24 ++++++++-- .../validateArtifactLibraryDeployment.ts | 11 +++-- .../futures/validateNamedContractAt.ts | 3 +- .../futures/validateNamedContractCall.ts | 18 +++++-- .../validateNamedContractDeployment.ts | 18 +++++-- .../futures/validateNamedLibraryDeployment.ts | 10 +++- .../futures/validateNamedStaticCall.ts | 23 +++++++-- .../futures/validateReadEventArgument.ts | 3 +- .../validation/futures/validateSendData.ts | 16 ++++++- .../src/new-api/internal/validation/utils.ts | 48 +++++++++++++++++++ .../new-api/internal/validation/validate.ts | 39 ++++++++++----- packages/core/test/new-api/call.ts | 30 ++++++++---- packages/core/test/new-api/contract.ts | 24 ++++++---- packages/core/test/new-api/contractAt.ts | 12 +++-- .../test/new-api/contractAtFromArtifact.ts | 9 ++-- .../core/test/new-api/contractFromArtifact.ts | 21 +++++--- packages/core/test/new-api/library.ts | 3 +- .../core/test/new-api/readEventArgument.ts | 6 ++- packages/core/test/new-api/send.ts | 8 ++-- packages/core/test/new-api/staticCall.ts | 43 +++++++++++++---- packages/core/test/new-api/useModule.ts | 6 ++- 27 files changed, 299 insertions(+), 156 deletions(-) delete mode 100644 packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts delete mode 100644 packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts create mode 100644 packages/core/src/new-api/internal/validation/utils.ts diff --git a/packages/core/src/new-api/internal/deployer.ts b/packages/core/src/new-api/internal/deployer.ts index 1c41d401a5..dc925d914f 100644 --- a/packages/core/src/new-api/internal/deployer.ts +++ b/packages/core/src/new-api/internal/deployer.ts @@ -98,7 +98,12 @@ export class Deployer { ): Promise { const module = this._moduleConstructor.construct(moduleDefinition); - await validate(module, this._artifactResolver, deploymentParameters); + await validate( + module, + this._artifactResolver, + deploymentParameters, + accounts + ); const previousStateMap = await this._loadExecutionStateFrom( this._deploymentLoader diff --git a/packages/core/src/new-api/internal/execution/execution-engine.ts b/packages/core/src/new-api/internal/execution/execution-engine.ts index df9f399249..3f28ce839b 100644 --- a/packages/core/src/new-api/internal/execution/execution-engine.ts +++ b/packages/core/src/new-api/internal/execution/execution-engine.ts @@ -59,7 +59,6 @@ import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { replaceWithinArg } from "../utils/replace-within-arg"; -import { resolveAccountRuntimeValue } from "../utils/resolve-account-runtime-value"; import { resolveFromAddress } from "../utils/resolve-from-address"; import { resolveContractFutureToAddress, @@ -1027,7 +1026,7 @@ export class ExecutionEngine { return resolveFutureToValue(f, context); }, accountRuntimeValue: (arv) => { - return resolveAccountRuntimeValue(arv, context.accounts); + return context.accounts[arv.accountIndex]; }, moduleParameterRuntimeValue: (mprv) => { return resolveModuleParameter(mprv, context); diff --git a/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts b/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts deleted file mode 100644 index afac328e1c..0000000000 --- a/packages/core/src/new-api/internal/utils/resolve-account-runtime-value.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { AccountRuntimeValue } from "../../types/module"; - -export function resolveAccountRuntimeValue( - arv: AccountRuntimeValue, - accounts: string[] -): string { - if (arv.accountIndex < 0) { - throw new IgnitionValidationError( - `Account index cannot be a negative number` - ); - } - - if (arv.accountIndex >= accounts.length) { - throw new IgnitionValidationError( - `Requested account index '${arv.accountIndex}' is greater than the total number of available accounts '${accounts.length}'` - ); - } - - return accounts[arv.accountIndex]; -} diff --git a/packages/core/src/new-api/internal/utils/resolve-from-address.ts b/packages/core/src/new-api/internal/utils/resolve-from-address.ts index a30642fe30..8f67df9323 100644 --- a/packages/core/src/new-api/internal/utils/resolve-from-address.ts +++ b/packages/core/src/new-api/internal/utils/resolve-from-address.ts @@ -3,7 +3,6 @@ import { AccountRuntimeValue } from "../../types/module"; import { isAddress } from "../utils"; import { assertIgnitionInvariant } from "./assertions"; -import { resolveAccountRuntimeValue } from "./resolve-account-runtime-value"; export function resolveFromAddress( from: string | AccountRuntimeValue | undefined, @@ -28,7 +27,7 @@ export function resolveFromAddress( `Could not resolve from address: ${JSON.stringify(from)}` ); - const runtimeAddress = resolveAccountRuntimeValue(from, accounts); + const runtimeAddress = accounts[from.accountIndex]; assertIgnitionInvariant( isAddress(runtimeAddress), diff --git a/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts b/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts deleted file mode 100644 index e832154eb0..0000000000 --- a/packages/core/src/new-api/internal/utils/retrieve-nested-runtime-values.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { - isFuture, - isModuleParameterRuntimeValue, - isRuntimeValue, -} from "../../type-guards"; -import { - ArgumentType, - ModuleParameterRuntimeValue, - RuntimeValueType, -} from "../../types/module"; - -export function retrieveNestedRuntimeValues( - args: ArgumentType[] -): Array> { - return args.flatMap(checkForValues).filter(isModuleParameterRuntimeValue); -} - -function checkForValues( - arg: ArgumentType -): - | Array | null> - | ModuleParameterRuntimeValue - | null { - if (isRuntimeValue(arg)) { - if (arg.type === RuntimeValueType.ACCOUNT) { - return null; - } - - return arg; - } - - if (Array.isArray(arg)) { - return arg.flatMap(checkForValues); - } - - if (!isFuture(arg) && typeof arg === "object" && arg !== null) { - return Object.values(arg).flatMap(checkForValues); - } - - return null; -} diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts index 2a1f07e90d..7daa890cde 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractAt.ts @@ -7,7 +7,8 @@ import { ArtifactContractAtFuture } from "../../../types/module"; export async function validateArtifactContractAt( future: ArtifactContractAtFuture, _artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + _accounts: string[] ) { if (isModuleParameterRuntimeValue(future.address)) { const param = @@ -25,6 +26,4 @@ export async function validateArtifactContractAt( ); } } - - return; } diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts index 714c200c36..288f7d4543 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactContractDeployment.ts @@ -1,18 +1,32 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isModuleParameterRuntimeValue } from "../../../type-guards"; +import { + isAccountRuntimeValue, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { ArtifactContractDeploymentFuture } from "../../../types/module"; -import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; +import { + retrieveNestedRuntimeValues, + validateAccountRuntimeValue, +} from "../utils"; export async function validateArtifactContractDeployment( future: ArtifactContractDeploymentFuture, - artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + _artifactLoader: ArtifactResolver, + deploymentParameters: DeploymentParameters, + accounts: string[] ) { - const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); + const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + const accountParams = [ + ...runtimeValues.filter(isAccountRuntimeValue), + ...(isAccountRuntimeValue(future.from) ? [future.from] : []), + ]; + + accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts index c68b6e14f9..541c7c30cd 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateArtifactLibraryDeployment.ts @@ -1,11 +1,16 @@ +import { isAccountRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { validateAccountRuntimeValue } from "../utils"; export async function validateArtifactLibraryDeployment( - _future: ArtifactLibraryDeploymentFuture, + future: ArtifactLibraryDeploymentFuture, _artifactLoader: ArtifactResolver, - _deploymentParameters: DeploymentParameters + _deploymentParameters: DeploymentParameters, + accounts: string[] ) { - return; /* noop - nothing to validate here */ + if (isAccountRuntimeValue(future.from)) { + validateAccountRuntimeValue(future.from, accounts); + } } diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts index 571917a4af..04554ca47f 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractAt.ts @@ -10,7 +10,8 @@ import { NamedContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( future: NamedContractAtFuture, artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + _accounts: string[] ) { if (isModuleParameterRuntimeValue(future.address)) { const param = diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts index 0ea02cf5a8..0c0747a30b 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractCall.ts @@ -2,20 +2,32 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { + isAccountRuntimeValue, isArtifactType, isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { NamedContractCallFuture } from "../../../types/module"; -import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; +import { + retrieveNestedRuntimeValues, + validateAccountRuntimeValue, +} from "../utils"; export async function validateNamedContractCall( future: NamedContractCallFuture, artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ) { - const moduleParams = retrieveNestedRuntimeValues(future.args); + const runtimeValues = retrieveNestedRuntimeValues(future.args); + const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + const accountParams = [ + ...runtimeValues.filter(isAccountRuntimeValue), + ...(isAccountRuntimeValue(future.from) ? [future.from] : []), + ]; + + accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts index 4b237b81d3..d987902bb1 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedContractDeployment.ts @@ -2,20 +2,32 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; import { + isAccountRuntimeValue, isArtifactType, isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { NamedContractDeploymentFuture } from "../../../types/module"; -import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; +import { + retrieveNestedRuntimeValues, + validateAccountRuntimeValue, +} from "../utils"; export async function validateNamedContractDeployment( future: NamedContractDeploymentFuture, artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ) { - const moduleParams = retrieveNestedRuntimeValues(future.constructorArgs); + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); + const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + const accountParams = [ + ...runtimeValues.filter(isAccountRuntimeValue), + ...(isAccountRuntimeValue(future.from) ? [future.from] : []), + ]; + + accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts index 0919986112..7af0d32c70 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -1,14 +1,20 @@ import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { isAccountRuntimeValue, isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { validateAccountRuntimeValue } from "../utils"; export async function validateNamedLibraryDeployment( future: NamedLibraryDeploymentFuture, artifactLoader: ArtifactResolver, - _deploymentParameters: DeploymentParameters + _deploymentParameters: DeploymentParameters, + accounts: string[] ) { + if (isAccountRuntimeValue(future.from)) { + validateAccountRuntimeValue(future.from, accounts); + } + const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { diff --git a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts index e508a60073..8d89d92ab8 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateNamedStaticCall.ts @@ -1,18 +1,33 @@ import { ethers } from "ethers"; import { IgnitionValidationError } from "../../../../errors"; -import { isArtifactType } from "../../../type-guards"; +import { + isAccountRuntimeValue, + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { NamedStaticCallFuture } from "../../../types/module"; -import { retrieveNestedRuntimeValues } from "../../utils/retrieve-nested-runtime-values"; +import { + retrieveNestedRuntimeValues, + validateAccountRuntimeValue, +} from "../utils"; export async function validateNamedStaticCall( future: NamedStaticCallFuture, artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ) { - const moduleParams = retrieveNestedRuntimeValues(future.args); + const runtimeValues = retrieveNestedRuntimeValues(future.args); + const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + const accountParams = [ + ...runtimeValues.filter(isAccountRuntimeValue), + ...(isAccountRuntimeValue(future.from) ? [future.from] : []), + ]; + + accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts index 692e78f535..1347953f22 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateReadEventArgument.ts @@ -9,7 +9,8 @@ import { ReadEventArgumentFuture } from "../../../types/module"; export async function validateReadEventArgument( future: ReadEventArgumentFuture, artifactLoader: ArtifactResolver, - _deploymentParameters: DeploymentParameters + _deploymentParameters: DeploymentParameters, + _accounts: string[] ) { const artifact = "artifact" in future.emitter diff --git a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts index 6e3f791130..e321d00ee9 100644 --- a/packages/core/src/new-api/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/new-api/internal/validation/futures/validateSendData.ts @@ -1,14 +1,26 @@ import { IgnitionValidationError } from "../../../../errors"; -import { isModuleParameterRuntimeValue } from "../../../type-guards"; +import { + isAccountRuntimeValue, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deployer"; import { SendDataFuture } from "../../../types/module"; +import { validateAccountRuntimeValue } from "../utils"; export async function validateSendData( future: SendDataFuture, _artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ) { + const accountParams = [ + ...(isAccountRuntimeValue(future.from) ? [future.from] : []), + ...(isAccountRuntimeValue(future.to) ? [future.to] : []), + ]; + + accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + if (isModuleParameterRuntimeValue(future.to)) { const param = deploymentParameters[future.to.moduleId]?.[future.to.name] ?? diff --git a/packages/core/src/new-api/internal/validation/utils.ts b/packages/core/src/new-api/internal/validation/utils.ts new file mode 100644 index 0000000000..be01a4bce7 --- /dev/null +++ b/packages/core/src/new-api/internal/validation/utils.ts @@ -0,0 +1,48 @@ +import { IgnitionValidationError } from "../../../errors"; +import { + AccountRuntimeValue, + ArgumentType, + RuntimeValue, +} from "../../types/module"; +import { isFuture, isRuntimeValue } from "../../type-guards"; + +export function validateAccountRuntimeValue( + arv: AccountRuntimeValue, + accounts: string[] +): void { + if (arv.accountIndex < 0) { + throw new IgnitionValidationError( + `Account index cannot be a negative number` + ); + } + + if (arv.accountIndex >= accounts.length) { + throw new IgnitionValidationError( + `Requested account index '${arv.accountIndex}' is greater than the total number of available accounts '${accounts.length}'` + ); + } +} + +export function retrieveNestedRuntimeValues( + args: ArgumentType[] +): Array { + return args.flatMap(checkForValues).filter(isRuntimeValue); +} + +function checkForValues( + arg: ArgumentType +): Array | RuntimeValue | null { + if (isRuntimeValue(arg)) { + return arg; + } + + if (Array.isArray(arg)) { + return arg.flatMap(checkForValues); + } + + if (!isFuture(arg) && typeof arg === "object" && arg !== null) { + return Object.values(arg).flatMap(checkForValues); + } + + return null; +} diff --git a/packages/core/src/new-api/internal/validation/validate.ts b/packages/core/src/new-api/internal/validation/validate.ts index 03909b26aa..36fec42ed7 100644 --- a/packages/core/src/new-api/internal/validation/validate.ts +++ b/packages/core/src/new-api/internal/validation/validate.ts @@ -17,7 +17,8 @@ import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, artifactLoader: ArtifactResolver, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ): Promise { const futures = getFuturesFromModule(module); @@ -27,7 +28,7 @@ export async function validate( // validating each of those, we achieve the same effect. const submodules = module.submodules; for (const submodule of submodules) { - await validate(submodule, artifactLoader, deploymentParameters); + await validate(submodule, artifactLoader, deploymentParameters, accounts); } for (const future of futures) { @@ -36,67 +37,81 @@ export async function validate( await validateArtifactContractDeployment( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: await validateArtifactLibraryDeployment( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.ARTIFACT_CONTRACT_AT: await validateArtifactContractAt( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.NAMED_CONTRACT_DEPLOYMENT: await validateNamedContractDeployment( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.NAMED_LIBRARY_DEPLOYMENT: await validateNamedLibraryDeployment( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.NAMED_CONTRACT_AT: await validateNamedContractAt( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.NAMED_CONTRACT_CALL: await validateNamedContractCall( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.NAMED_STATIC_CALL: await validateNamedStaticCall( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.READ_EVENT_ARGUMENT: await validateReadEventArgument( future, artifactLoader, - deploymentParameters + deploymentParameters, + accounts ); break; case FutureType.SEND_DATA: - await validateSendData(future, artifactLoader, deploymentParameters); + await validateSendData( + future, + artifactLoader, + deploymentParameters, + accounts + ); break; } } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 03f8e4ff52..493f67aa6e 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -593,7 +593,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: {} as any }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); @@ -626,7 +627,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -659,7 +661,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ ); @@ -700,7 +703,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -746,7 +750,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -780,7 +785,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -829,7 +835,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -859,7 +866,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver(), - {} + {}, + [] ), /Contract 'Another' doesn't have a function test/ ); @@ -904,7 +912,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver(), - {} + {}, + [] ), /Function inc in contract Another expects 1 arguments but 2 were given/ ); @@ -967,7 +976,8 @@ describe("call", () => { validateNamedContractCall( future as any, setupMockArtifactResolver(), - {} + {}, + [] ), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index 40c35fba78..c3e37a63b4 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -593,7 +593,8 @@ describe("contract", () => { setupMockArtifactResolver({ Another: {} as any, }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); @@ -626,7 +627,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); @@ -672,7 +674,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -712,7 +715,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ ); @@ -752,7 +756,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -797,7 +802,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -844,7 +850,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -892,7 +899,8 @@ describe("contract", () => { validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ) ); }); diff --git a/packages/core/test/new-api/contractAt.ts b/packages/core/test/new-api/contractAt.ts index 7a145fa5f9..0aedbf4014 100644 --- a/packages/core/test/new-api/contractAt.ts +++ b/packages/core/test/new-api/contractAt.ts @@ -275,7 +275,8 @@ describe("contractAt", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -306,7 +307,8 @@ describe("contractAt", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ) ); }); @@ -336,7 +338,8 @@ describe("contractAt", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ), /Module parameter 'p' must be of type 'string' but is 'number'/ ); @@ -364,7 +367,8 @@ describe("contractAt", () => { setupMockArtifactResolver({ Another: {} as any, }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/contractAtFromArtifact.ts b/packages/core/test/new-api/contractAtFromArtifact.ts index 3ac38ebe57..242a072173 100644 --- a/packages/core/test/new-api/contractAtFromArtifact.ts +++ b/packages/core/test/new-api/contractAtFromArtifact.ts @@ -304,7 +304,8 @@ describe("contractAtFromArtifact", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -335,7 +336,8 @@ describe("contractAtFromArtifact", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ) ); }); @@ -365,7 +367,8 @@ describe("contractAtFromArtifact", () => { setupMockArtifactResolver({ Another: fakeArtifact, }), - {} + {}, + [] ), /Module parameter 'p' must be of type 'string' but is 'number'/ ); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 52e13952a9..0b5f1bac49 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -666,7 +666,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver(), - {} + {}, + [] ), /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ ); @@ -695,7 +696,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -743,7 +745,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), - {} + {}, + [] ) ); }); @@ -786,7 +789,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), - {} + {}, + [] ), /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ ); @@ -830,7 +834,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), - {} + {}, + [] ) ); }); @@ -860,7 +865,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -910,7 +916,8 @@ describe("contractFromArtifact", () => { validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), - {} + {}, + [] ) ); }); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 4d3e8b275b..9d7dca9149 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -313,7 +313,8 @@ describe("library", () => { validateNamedLibraryDeployment( future as any, setupMockArtifactResolver({ Another: {} as any }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); diff --git a/packages/core/test/new-api/readEventArgument.ts b/packages/core/test/new-api/readEventArgument.ts index 257a319a19..34706db3fe 100644 --- a/packages/core/test/new-api/readEventArgument.ts +++ b/packages/core/test/new-api/readEventArgument.ts @@ -237,7 +237,8 @@ describe("Read event argument", () => { validateReadEventArgument( future as any, setupMockArtifactResolver({ Another: {} as any }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); @@ -268,7 +269,8 @@ describe("Read event argument", () => { validateReadEventArgument( future as any, setupMockArtifactResolver(), - {} + {}, + [] ), /Contract 'Another' doesn't have an event test/ ); diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index b78a3aaf37..e56697bda3 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -424,7 +424,7 @@ describe("send", () => { ); await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}), + validateSendData(future as any, setupMockArtifactResolver(), {}, []), /Module parameter 'p' requires a value but was given none/ ); }); @@ -449,7 +449,7 @@ describe("send", () => { ); await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}) + validateSendData(future as any, setupMockArtifactResolver(), {}, []) ); }); @@ -473,7 +473,7 @@ describe("send", () => { ); await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}), + validateSendData(future as any, setupMockArtifactResolver(), {}, []), /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ ); }); @@ -498,7 +498,7 @@ describe("send", () => { ); await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}) + validateSendData(future as any, setupMockArtifactResolver(), {}, []) ); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index 4901502fc8..ba2419b2ee 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -546,7 +546,8 @@ describe("static call", () => { validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: {} as any }), - {} + {}, + [] ), /Artifact for contract 'Another' is invalid/ ); @@ -578,7 +579,8 @@ describe("static call", () => { validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -624,7 +626,8 @@ describe("static call", () => { validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -657,7 +660,8 @@ describe("static call", () => { validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ), /Module parameter 'p' requires a value but was given none/ ); @@ -705,7 +709,8 @@ describe("static call", () => { validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), - {} + {}, + [] ) ); }); @@ -732,7 +737,12 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), /Contract 'Another' doesn't have a function test/ ); }); @@ -773,7 +783,12 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), /Function inc in contract Another expects 1 arguments but 2 were given/ ); }); @@ -832,7 +847,12 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); @@ -873,7 +893,12 @@ describe("static call", () => { ); await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver(), {}), + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ ); }); diff --git a/packages/core/test/new-api/useModule.ts b/packages/core/test/new-api/useModule.ts index d517f8c83e..96b584f470 100644 --- a/packages/core/test/new-api/useModule.ts +++ b/packages/core/test/new-api/useModule.ts @@ -162,7 +162,8 @@ describe("useModule", () => { Contract2: fakeArtifact, Contract3: fakeArtifact, }), - moduleParams + moduleParams, + [] ) ); }); @@ -235,7 +236,8 @@ describe("useModule", () => { Contract2: fakeArtifact, Contract3: fakeArtifact, }), - moduleParams + moduleParams, + [] ), /Module parameter 'param1' requires a value but was given none/ ); From 3aabd86c0b7a8d0b8cf1d404a26113fe2b2dc99e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 2 Aug 2023 00:56:20 -0400 Subject: [PATCH 0603/1302] add tests for account index validation --- .../src/new-api/internal/validation/utils.ts | 4 +- packages/core/test/new-api/call.ts | 94 +++++++++++++++++++ packages/core/test/new-api/contract.ts | 70 ++++++++++++++ .../core/test/new-api/contractFromArtifact.ts | 60 ++++++++++++ .../new-api/execution/execution-engine.ts | 34 ------- packages/core/test/new-api/library.ts | 56 +++++++++++ .../core/test/new-api/libraryFromArtifact.ts | 64 ++++++++++++- packages/core/test/new-api/send.ts | 50 ++++++++++ packages/core/test/new-api/staticCall.ts | 94 +++++++++++++++++++ 9 files changed, 489 insertions(+), 37 deletions(-) diff --git a/packages/core/src/new-api/internal/validation/utils.ts b/packages/core/src/new-api/internal/validation/utils.ts index be01a4bce7..12428d3fc0 100644 --- a/packages/core/src/new-api/internal/validation/utils.ts +++ b/packages/core/src/new-api/internal/validation/utils.ts @@ -1,10 +1,10 @@ import { IgnitionValidationError } from "../../../errors"; +import { isFuture, isRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue, ArgumentType, RuntimeValue, } from "../../types/module"; -import { isFuture, isRuntimeValue } from "../../type-guards"; export function validateAccountRuntimeValue( arv: AccountRuntimeValue, @@ -25,7 +25,7 @@ export function validateAccountRuntimeValue( export function retrieveNestedRuntimeValues( args: ArgumentType[] -): Array { +): RuntimeValue[] { return args.flatMap(checkForValues).filter(isRuntimeValue); } diff --git a/packages/core/test/new-api/call.ts b/packages/core/test/new-api/call.ts index 493f67aa6e..952b1a7809 100644 --- a/packages/core/test/new-api/call.ts +++ b/packages/core/test/new-api/call.ts @@ -982,5 +982,99 @@ describe("call", () => { /Function inc in contract Another is overloaded, but no overload expects 3 arguments/ ); }); + + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "public", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + const account = m.getAccount(-1); + m.call(another, "inc", [1], { from: account }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "public", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + const account = m.getAccount(1); + m.call(another, "inc", [1], { from: account }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_CONTRACT_CALL + ); + + await assert.isRejected( + validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/contract.ts b/packages/core/test/new-api/contract.ts index c3e37a63b4..1bb29c9025 100644 --- a/packages/core/test/new-api/contract.ts +++ b/packages/core/test/new-api/contract.ts @@ -904,5 +904,75 @@ describe("contract", () => { ) ); }); + + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(-1); + const contract1 = m.contract("Test", [], { from: account }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(1); + const contract1 = m.contract("Test", [], { from: account }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/contractFromArtifact.ts b/packages/core/test/new-api/contractFromArtifact.ts index 0b5f1bac49..9bfc45e85a 100644 --- a/packages/core/test/new-api/contractFromArtifact.ts +++ b/packages/core/test/new-api/contractFromArtifact.ts @@ -921,5 +921,65 @@ describe("contractFromArtifact", () => { ) ); }); + + it("should not validate a negative account index", async () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(-1); + const contract1 = m.contractFromArtifact("Test", fakeArtifact, [], { + from: account, + }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const moduleWithContractFromArtifactDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(1); + const contract1 = m.contractFromArtifact("Test", fakeArtifact, [], { + from: account, + }); + + return { contract1 }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithContractFromArtifactDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/execution/execution-engine.ts b/packages/core/test/new-api/execution/execution-engine.ts index 1e877f960d..730dcb23c9 100644 --- a/packages/core/test/new-api/execution/execution-engine.ts +++ b/packages/core/test/new-api/execution/execution-engine.ts @@ -2468,38 +2468,4 @@ describe("execution engine", () => { }); }); }); - - describe("with invalid account indexes", () => { - it("should not allow indexing an account less than zero", async () => { - const moduleDefinition = defineModule("Module1", (m) => { - const from = m.getAccount(-1); - const contract = m.contract("Contract1", [], { from }); - - return { contract }; - }); - - const deployer = setupDeployerWithMocks({}); - - await assert.isRejected( - deployer.deploy(moduleDefinition, {}, exampleAccounts), - /Account index cannot be a negative number/ - ); - }); - - it("should not allow indexing an account greater than the number of available accounts", async () => { - const moduleDefinition = defineModule("Module1", (m) => { - const from = m.getAccount(10); - const contract = m.contract("Contract1", [], { from }); - - return { contract }; - }); - - const deployer = setupDeployerWithMocks({}); - - await assert.isRejected( - deployer.deploy(moduleDefinition, {}, exampleAccounts), - /Requested account index \'10\' is greater than the total number of available accounts \'5\'/ - ); - }); - }); }); diff --git a/packages/core/test/new-api/library.ts b/packages/core/test/new-api/library.ts index 9d7dca9149..1c24b6165c 100644 --- a/packages/core/test/new-api/library.ts +++ b/packages/core/test/new-api/library.ts @@ -319,5 +319,61 @@ describe("library", () => { /Artifact for contract 'Another' is invalid/ ); }); + + it("should not validate a negative account index", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(-1); + const test = m.library("Test", { from: account }); + + return { test }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(1); + const test = m.library("Test", { from: account }); + + return { test }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/libraryFromArtifact.ts b/packages/core/test/new-api/libraryFromArtifact.ts index 04d0ab909f..2cd7a23dcb 100644 --- a/packages/core/test/new-api/libraryFromArtifact.ts +++ b/packages/core/test/new-api/libraryFromArtifact.ts @@ -8,8 +8,10 @@ import { ArtifactLibraryDeploymentFutureImplementation, } from "../../src/new-api/internal/module"; import { ModuleConstructor } from "../../src/new-api/internal/module-builder"; +import { getFuturesFromModule } from "../../src/new-api/internal/utils/get-futures-from-module"; +import { validateArtifactLibraryDeployment } from "../../src/new-api/internal/validation/futures/validateArtifactLibraryDeployment"; -import { assertInstanceOf } from "./helpers"; +import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; describe("libraryFromArtifact", () => { const fakeArtifact: Artifact = { @@ -330,5 +332,65 @@ describe("libraryFromArtifact", () => { /Invalid artifact given/ ); }); + + it("should not validate a negative account index", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(-1); + const test = m.libraryFromArtifact("Test", fakeArtifact, { + from: account, + }); + + return { test }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateArtifactLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(1); + const test = m.libraryFromArtifact("Test", fakeArtifact, { + from: account, + }); + + return { test }; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const [future] = getFuturesFromModule(module); + + await assert.isRejected( + validateArtifactLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/send.ts b/packages/core/test/new-api/send.ts index e56697bda3..e22b78ea5d 100644 --- a/packages/core/test/new-api/send.ts +++ b/packages/core/test/new-api/send.ts @@ -501,5 +501,55 @@ describe("send", () => { validateSendData(future as any, setupMockArtifactResolver(), {}, []) ); }); + + it("should not validate a negative account index", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(-1); + m.send("id", "0xasdf", 0n, "", { from: account }); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isRejected( + validateSendData(future as any, setupMockArtifactResolver(), {}, []), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const moduleWithDependentContractsDefinition = defineModule( + "Module1", + (m) => { + const account = m.getAccount(1); + m.send("id", "0xasdf", 0n, "", { from: account }); + + return {}; + } + ); + + const constructor = new ModuleConstructor(); + const module = constructor.construct( + moduleWithDependentContractsDefinition + ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + await assert.isRejected( + validateSendData(future as any, setupMockArtifactResolver(), {}, []), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); diff --git a/packages/core/test/new-api/staticCall.ts b/packages/core/test/new-api/staticCall.ts index ba2419b2ee..14a96d67e7 100644 --- a/packages/core/test/new-api/staticCall.ts +++ b/packages/core/test/new-api/staticCall.ts @@ -902,5 +902,99 @@ describe("static call", () => { /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ ); }); + + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + const account = m.getAccount(-1); + m.staticCall(another, "inc", [1], { from: account }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Account index cannot be a negative number/ + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const moduleDef = defineModule("Module1", (m) => { + const another = m.contractFromArtifact("Another", fakeArtifact, []); + const account = m.getAccount(1); + m.staticCall(another, "inc", [1], { from: account }); + + return { another }; + }); + + const constructor = new ModuleConstructor(); + const module = constructor.construct(moduleDef); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_STATIC_CALL + ); + + await assert.isRejected( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + ); + }); }); }); From 3584a78d4affb22165f16b8cd621188a633c5823 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 28 Jul 2023 10:52:12 +0100 Subject: [PATCH 0604/1302] feat: expose config options through deploy The execution config is now exposed through deploy and wired into the `hardhat-ignition` plugin config. Number of blockConfirmations has been added to the config as well In addition to setting the config from hardhat config we allow the config to be overriden per `hre.ignition.deploy(module, {config: {...}}` call. This is needed for tests. Resolves #312. --- docs/running-a-deployment.md | 44 ++++++++---------- examples/ens/test/sample-test.js | 4 +- examples/sample/test/Lock.js | 1 + examples/ts-sample/test/Lock.ts | 3 +- examples/uniswap/test/uniswap-test.js | 4 +- packages/core/src/new-api/deploy.ts | 4 +- .../src/new-api/internal/defaultConfig.ts | 28 +++++++++++ .../core/src/new-api/internal/deployer.ts | 11 +---- .../execution/onchain-state-transitions.ts | 4 +- .../internal/types/execution-engine.ts | 9 +--- packages/core/src/new-api/types/deployer.ts | 15 ++++++ packages/core/test/new-api/call.ts | 4 +- packages/core/test/new-api/contract.ts | 4 +- .../core/test/new-api/contractFromArtifact.ts | 4 +- packages/core/test/new-api/helpers.ts | 3 ++ packages/core/test/new-api/library.ts | 4 +- .../core/test/new-api/libraryFromArtifact.ts | 4 +- packages/core/test/new-api/send.ts | 4 +- packages/core/test/new-api/staticCall.ts | 4 +- .../hardhat-plugin/src/ignition-helper.ts | 16 ++++++- packages/hardhat-plugin/src/index.ts | 27 +---------- .../hardhat-plugin/src/type-extensions.ts | 9 ++-- packages/hardhat-plugin/test/config.ts | 46 +++++++++---------- .../multiple-batch-contract-deploy.ts | 7 +-- .../with-config/hardhat.config.js | 9 ++-- packages/hardhat-plugin/test/type-helper.ts | 28 +++++++++++ .../test/use-ignition-project.ts | 14 ++++-- 27 files changed, 177 insertions(+), 137 deletions(-) create mode 100644 packages/core/src/new-api/internal/defaultConfig.ts create mode 100644 packages/hardhat-plugin/test/type-helper.ts diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 7b4ace4c1c..87b8d705f6 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -6,8 +6,8 @@ - [Visualizing your deployment with the `plan` task](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) - [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - + - [Configuration options](./running-a-deployment.md#configuration-options) + --- @@ -53,16 +53,15 @@ By default the deploy task will deploy to an ephemeral Hardhat network. To targe npx hardhat deploy LockModule.js --network mainnet ``` - Module:BasicLibrary @@ -190,7 +190,7 @@ describe("to-mermaid", () => { Module:ContractWithLibrary#readonlyFunction --> Module:BasicContract#BasicEvent#eventArg#0 Module:BasicContract2 --> Module:BasicContract Module:ContractWithLibrary2 --> Module:ContractWithLibrary - Module:test-send --> Module:BasicContract2 + Module:test_send --> Module:BasicContract2 classDef startModule stroke-width:4px`; From 5b45b09d84936f0113fa99bf938f7cb422de843e Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 13 Sep 2023 18:22:29 +0100 Subject: [PATCH 0925/1302] feat: change call/staticCall ids to match namespacing We now use the same rule for namespacing the a call/staticCall action as we use for other actions. If the user provides an id, the only namespacing is to the module (rather than the module/contract as it was before). --- .../src/internal/utils/future-id-builders.ts | 7 +++--- packages/core/test/call.ts | 6 ++--- .../futures/reconcileNamedContractCall.ts | 16 ++++++------- .../futures/reconcileNamedStaticCall.ts | 24 +++++++------------ packages/core/test/staticCall.ts | 6 ++--- .../core/test/utils/future-id-builders.ts | 4 ++-- 6 files changed, 29 insertions(+), 34 deletions(-) diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index b4121ed9ec..88144a0f17 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -46,9 +46,10 @@ export function toCallFutureId( contractName: string, functionName: string ) { - return `${moduleId}${MODULE_SEPERATOR}${contractName}${SUBKEY_SEPERATOR}${ - userProvidedId ?? functionName - }`; + const futureKey = + userProvidedId ?? `${contractName}${SUBKEY_SEPERATOR}${functionName}`; + + return `${moduleId}${MODULE_SEPERATOR}${futureKey}`; } /** diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index da539e7ea7..88b35144a4 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -383,11 +383,11 @@ describe("call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example#first" + ({ id }) => id === "Module1:first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example#second" + ({ id }) => id === "Module1:second" ); assert.isDefined(callFuture); @@ -417,7 +417,7 @@ describe("call", () => { m.call(sameContract1, "test", [], { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1:SameContract#first found in module Module1/ + /Duplicated id Module1:first found in module Module1/ ); }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index 04ec7b7a8f..76c55583c4 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -117,7 +117,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -128,7 +128,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module:Contract1)", }, @@ -158,7 +158,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "functionUnchanged", @@ -168,7 +168,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: "Function name has been changed from functionUnchanged to functionChanged", }, @@ -240,7 +240,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -251,7 +251,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: "Value has been changed from 2 to 3", }, ]); @@ -280,7 +280,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -291,7 +291,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index 099df95c30..fb3b68a862 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -118,7 +118,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract1#config", + id: "Module:config", status: ExecutionStatus.STARTED, functionName: "function1", contractAddress: exampleAddress, @@ -128,7 +128,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module:Contract1)", }, @@ -158,7 +158,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -169,7 +169,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: "Function name has been changed from functionUnchanged to functionChanged", }, @@ -245,7 +245,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract1#config", + id: "Module:config", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -257,7 +257,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#config", + futureId: "Module:config", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); @@ -354,13 +354,10 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract1#second_call", + id: "Module:second_call", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, - dependencies: new Set([ - "Module:Contract1", - "Module:Contract1#first_call", - ]), + dependencies: new Set(["Module:Contract1", "Module:first_call"]), contractAddress: exampleAddress, functionName: "function1", args: ["second"], @@ -373,10 +370,7 @@ describe("Reconciliation - named static call", () => { ...exampleDeploymentState, id: "Module:Contract2", status: ExecutionStatus.STARTED, - dependencies: new Set([ - "Module:Contract1#first_call", - "Module:Contract1#second_call", - ]), + dependencies: new Set(["Module:first_call", "Module:second_call"]), contractName: "Contract2", constructorArgs: ["first"], result: { diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 4d6722bf5c..04d2c98a09 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -398,11 +398,11 @@ describe("static call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example#first" + ({ id }) => id === "Module1:first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:Example#second" + ({ id }) => id === "Module1:second" ); assert.isDefined(callFuture); @@ -432,7 +432,7 @@ describe("static call", () => { m.staticCall(sameContract1, "test", [], 0, { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1:SameContract#first found in module Module1/ + /Duplicated id Module1:first found in module Module1/ ); }); }); diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index 835ca286ca..c0ee09dbe6 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -32,10 +32,10 @@ describe("future id rules", () => { ); }); - it("namespaces the user provided id to the module and contract being called", () => { + it("namespaces the user provided id to the module", () => { assert.equal( toCallFutureId("MyModule", "MyId", "MyContract", "MyFunction"), - "MyModule:MyContract#MyId" + "MyModule:MyId" ); }); }); From 91bc6ca9ee132119eafe3bfc58395166185dffbc Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 13 Sep 2023 21:17:19 +0100 Subject: [PATCH 0926/1302] feat: allow ethers style event names --- packages/core/src/internal/module-builder.ts | 6 ++--- .../internal/utils/identifier-validators.ts | 6 ++--- packages/core/test/validations/id-rules.ts | 24 +++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 33598bd831..c884a7a502 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -71,7 +71,7 @@ import { toSendDataFutureId, } from "./utils/future-id-builders"; import { - isValidFunctionName, + isValidFunctionOrEventName, isValidIgnitionIdentifier, isValidSolidityIdentifier, } from "./utils/identifier-validators"; @@ -725,7 +725,7 @@ class IgnitionModuleBuilderImplementation< eventName: string, func: (...[]: any[]) => any ) { - if (isValidSolidityIdentifier(eventName)) { + if (isValidFunctionOrEventName(eventName)) { return; } @@ -739,7 +739,7 @@ class IgnitionModuleBuilderImplementation< functionName: string, func: (...[]: any[]) => any ) { - if (isValidFunctionName(functionName)) { + if (isValidFunctionOrEventName(functionName)) { return; } diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index 80f3fe25f7..f7c812720e 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -39,13 +39,13 @@ export function isValidSolidityIdentifier(identifier: string): boolean { } /** - * Does the function name match Ignition's rules for function names. This is + * Does the function or event name match Ignition's rules. This is * looser than Solidity's rules, but allows Ethers style `myfun(uint256,bool)` - * function specification. + * function/event specifications. * * @param functionName - the function name to test * @returns true if the function name is valid */ -export function isValidFunctionName(functionName: string): boolean { +export function isValidFunctionOrEventName(functionName: string): boolean { return functionNameRegex.test(functionName); } diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index 3146a0eed8..c3e9a1abfa 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -255,6 +255,18 @@ describe("id rules", () => { }); }, /The function name "config:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); }); + + it("should allow ethers style function specification", () => { + assert.doesNotThrow(() => { + buildModule("MyModule", (m) => { + const myContract = m.contract("MyContract"); + + m.staticCall(myContract, "config(uint256,bool)"); + + return { myContract }; + }); + }); + }); }); describe("constrain event names", () => { @@ -269,6 +281,18 @@ describe("id rules", () => { }); }, /The event "MyEvent:v2" contains banned characters, event names can only contain alphanumerics, underscores or dollar signs/); }); + + it("should allow ethers sytle event specification", () => { + assert.doesNotThrow(() => { + buildModule("MyModule", (m) => { + const myContract = m.contract("MyContract"); + + m.readEventArgument(myContract, "MyEvent(bool,bool)", "MyArg"); + + return { myContract }; + }); + }); + }); }); describe("constrain argument names", () => { From a0ee590c2fa45d1a43c3db41281f8f6312c419cd Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 13 Sep 2023 22:15:34 +0100 Subject: [PATCH 0927/1302] feat: change id separators Modify our id separators, swapping: - `:` => `#` - `#` => `.` This allows us to write the identifiers as filenames on windows. Resolves #441. --- .../src/internal/utils/future-id-builders.ts | 6 +- packages/core/test/batcher.ts | 32 +++---- packages/core/test/call.ts | 30 +++---- packages/core/test/contract.ts | 30 +++---- packages/core/test/contractAt.ts | 12 +-- packages/core/test/contractAtFromArtifact.ts | 12 +-- packages/core/test/contractFromArtifact.ts | 22 ++--- packages/core/test/library.ts | 22 ++--- packages/core/test/libraryFromArtifact.ts | 18 ++-- packages/core/test/readEventArgument.ts | 8 +- .../futures/reconcileArtifactContractAt.ts | 16 ++-- .../reconcileArtifactContractDeployment.ts | 26 +++--- .../reconcileArtifactLibraryDeployment.ts | 18 ++-- .../futures/reconcileNamedContractAt.ts | 16 ++-- .../futures/reconcileNamedContractCall.ts | 36 ++++---- .../reconcileNamedContractDeployment.ts | 26 +++--- .../reconcileNamedLibraryDeployment.ts | 18 ++-- .../futures/reconcileNamedStaticCall.ts | 52 +++++------ .../futures/reconcileReadEventArgument.ts | 48 +++++------ .../futures/reconcileSendData.ts | 20 ++--- .../core/test/reconciliation/reconciler.ts | 86 +++++++++---------- packages/core/test/send.ts | 30 +++---- packages/core/test/staticCall.ts | 34 ++++---- packages/core/test/useModule.ts | 2 +- .../core/test/utils/future-id-builders.ts | 14 +-- packages/hardhat-plugin/test/static-calls.ts | 4 +- .../generate-example-deployment-json.js | 23 +---- .../pages/plan-overview/components/action.tsx | 2 +- packages/ui/test/to-mermaid.ts | 60 ++++++------- 29 files changed, 354 insertions(+), 369 deletions(-) diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index 88144a0f17..0768e1b360 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -2,12 +2,12 @@ * The seperator in ids that indicated before as the module id and after * as the parts making up the particular future. */ -const MODULE_SEPERATOR = ":"; +const MODULE_SEPERATOR = "#"; /** * The seperator in ids that indicated different subparts of the future key. */ -const SUBKEY_SEPERATOR = "#"; +const SUBKEY_SEPERATOR = "."; /** * Construct the future id for a contract or library deployment, namespaced by the @@ -77,7 +77,7 @@ export function toReadEventArgumentFutureId( ) { const futureKey = userProvidedId ?? - `${contractName}#${eventName}${SUBKEY_SEPERATOR}${nameOrIndex}${SUBKEY_SEPERATOR}${eventIndex}`; + `${contractName}${SUBKEY_SEPERATOR}${eventName}${SUBKEY_SEPERATOR}${nameOrIndex}${SUBKEY_SEPERATOR}${eventIndex}`; return `${moduleId}${MODULE_SEPERATOR}${futureKey}`; } diff --git a/packages/core/test/batcher.ts b/packages/core/test/batcher.ts index 84f6634154..ac449976b0 100644 --- a/packages/core/test/batcher.ts +++ b/packages/core/test/batcher.ts @@ -35,7 +35,7 @@ describe("batcher", () => { return { contract1 }; }); - assertBatching({ ignitionModule }, [["Module1:Contract1"]]); + assertBatching({ ignitionModule }, [["Module1#Contract1"]]); }); it("should batch through dependencies", () => { @@ -57,9 +57,9 @@ describe("batcher", () => { }); assertBatching({ ignitionModule }, [ - ["Module1:Contract1", "Module1:Contract2"], - ["Module1:Contract3"], - ["Module1:Contract4", "Module1:Contract5"], + ["Module1#Contract1", "Module1#Contract2"], + ["Module1#Contract3"], + ["Module1#Contract4", "Module1#Contract5"], ]); }); @@ -98,15 +98,15 @@ describe("batcher", () => { }); assertBatching({ ignitionModule }, [ - ["SubmoduleLeft:Contract1", "SubmoduleRight:Contract2"], + ["SubmoduleLeft#Contract1", "SubmoduleRight#Contract2"], [ - "SubmoduleLeft:Contract1#configure", - "SubmoduleRight:Contract2#configure", + "SubmoduleLeft#Contract1.configure", + "SubmoduleRight#Contract2.configure", ], - ["SubmoduleMiddle:Contract3"], - ["SubmoduleMiddle:Contract3#configure"], - ["Module:Contract4"], - ["Module:Contract4#configure"], + ["SubmoduleMiddle#Contract3"], + ["SubmoduleMiddle#Contract3.configure"], + ["Module#Contract4"], + ["Module#Contract4.configure"], ]); }); @@ -141,8 +141,8 @@ describe("batcher", () => { }); assertBatching({ ignitionModule }, [ - ["Left:Contract1", "Middle:Contract3", "Right:Contract2"], - ["Module:Contract4"], + ["Left#Contract1", "Middle#Contract3", "Right#Contract2"], + ["Module#Contract4"], ]); }); @@ -162,15 +162,15 @@ describe("batcher", () => { deploymentState: { chainId: 123, executionStates: { - "Module1:Contract2": { + "Module1#Contract2": { ...exampleDeploymentState, - id: "Module1:Contract2", + id: "Module1#Contract2", status: ExecutionStatus.SUCCESS, }, }, }, }, - [["Module1:Contract1"], ["Module1:Contract3"]] + [["Module1#Contract1"], ["Module1#Contract3"]] ); }); }); diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index 88b35144a4..aa5e6f522d 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -29,7 +29,7 @@ describe("call", () => { assert.equal(moduleWithASingleContract.id, "Module1"); assert.equal( moduleWithASingleContract.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // 1 contract future & 1 call future @@ -60,15 +60,15 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -93,15 +93,15 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -125,7 +125,7 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -147,7 +147,7 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -172,7 +172,7 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -194,7 +194,7 @@ describe("call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -383,11 +383,11 @@ describe("call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:first" + ({ id }) => id === "Module1#first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:second" + ({ id }) => id === "Module1#second" ); assert.isDefined(callFuture); @@ -404,7 +404,7 @@ describe("call", () => { return { sameContract1 }; }), - /Duplicated id Module1:SameContract#test found in module Module1/ + /Duplicated id Module1#SameContract.test found in module Module1/ ); }); @@ -417,7 +417,7 @@ describe("call", () => { m.call(sameContract1, "test", [], { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1:first found in module Module1/ + /Duplicated id Module1#first found in module Module1/ ); }); }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 8792fabfb0..89a2f75c49 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -27,7 +27,7 @@ describe("contract", () => { assert.equal(moduleWithASingleContract.id, "Module1"); assert.equal( moduleWithASingleContract.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // 1 contract future @@ -52,11 +52,11 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -80,11 +80,11 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -110,11 +110,11 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -138,7 +138,7 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -162,7 +162,7 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -187,7 +187,7 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -209,7 +209,7 @@ describe("contract", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -368,11 +368,11 @@ describe("contract", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -385,7 +385,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -402,7 +402,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 8ee77c7f01..8e33d0b634 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -29,7 +29,7 @@ describe("contractAt", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // Stores the address @@ -79,7 +79,7 @@ describe("contractAt", () => { const anotherFuture = moduleWithDependentContracts.results.another; const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#getAddress" + ({ id }) => id === "Module1#Example.getAddress" ); assert.equal(anotherFuture.dependencies.size, 1); @@ -139,11 +139,11 @@ describe("contractAt", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -156,7 +156,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -183,7 +183,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 71dad868ae..156b68c530 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -33,7 +33,7 @@ describe("contractAtFromArtifact", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // Stores the address @@ -88,7 +88,7 @@ describe("contractAtFromArtifact", () => { const anotherFuture = moduleWithDependentContracts.results.another; const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#getAddress" + ({ id }) => id === "Module1#Example.getAddress" ); assert.equal(anotherFuture.dependencies.size, 1); @@ -156,11 +156,11 @@ describe("contractAtFromArtifact", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -181,7 +181,7 @@ describe("contractAtFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -208,7 +208,7 @@ describe("contractAtFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index b392177e0c..c7c7a2889d 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -37,7 +37,7 @@ describe("contractFromArtifact", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // Stores the arguments @@ -104,11 +104,11 @@ describe("contractFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -134,7 +134,7 @@ describe("contractFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -158,7 +158,7 @@ describe("contractFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -185,7 +185,7 @@ describe("contractFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -209,7 +209,7 @@ describe("contractFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -400,11 +400,11 @@ describe("contractFromArtifact", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -423,7 +423,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -450,7 +450,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index 6d103dce46..a19de6309c 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -25,7 +25,7 @@ describe("library", () => { assert.equal(moduleWithASingleContract.id, "Module1"); assert.equal( moduleWithASingleContract.results.library1.id, - "Module1:Library1" + "Module1#Library1" ); // 1 contract future @@ -50,11 +50,11 @@ describe("library", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -80,11 +80,11 @@ describe("library", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -110,7 +110,7 @@ describe("library", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -134,7 +134,7 @@ describe("library", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -161,11 +161,11 @@ describe("library", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -178,7 +178,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -195,7 +195,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 594718869f..5a1d2a3779 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -32,7 +32,7 @@ describe("libraryFromArtifact", () => { assert.equal(moduleWithContractFromArtifact.id, "Module1"); assert.equal( moduleWithContractFromArtifact.results.library1.id, - "Module1:Library1" + "Module1#Library1" ); // 1 contract future @@ -74,11 +74,11 @@ describe("libraryFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -104,7 +104,7 @@ describe("libraryFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -128,7 +128,7 @@ describe("libraryFromArtifact", () => { assert.isDefined(moduleWithDependentContracts); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); if ( @@ -164,11 +164,11 @@ describe("libraryFromArtifact", () => { assert.equal(moduleWithSameContractTwice.id, "Module1"); assert.equal( moduleWithSameContractTwice.results.sameContract1.id, - "Module1:first" + "Module1#first" ); assert.equal( moduleWithSameContractTwice.results.sameContract2.id, - "Module1:second" + "Module1#second" ); }); @@ -187,7 +187,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:SameContract found in module Module1/ + /Duplicated id Module1#SameContract found in module Module1/ ); }); @@ -212,7 +212,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1:same found in module Module1/ + /Duplicated id Module1#same found in module Module1/ ); }); }); diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 6e485dfbec..8c361e0f29 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -161,8 +161,8 @@ describe("Read event argument", () => { assert.equal(mod.id, "Module1"); const futuresIds = Array.from(mod.futures).map((f) => f.id); - assert.include(futuresIds, "Module1:Main#EventName#arg1#0"); - assert.include(futuresIds, "Module1:Emitter#EventName2#arg2#1"); + assert.include(futuresIds, "Module1#Main.EventName.arg1.0"); + assert.include(futuresIds, "Module1#Emitter.EventName2.arg2.1"); }); it("should be able to read the same argument twice by passing a explicit id", () => { @@ -185,8 +185,8 @@ describe("Read event argument", () => { moduleWithSameReadEventArgumentTwice.futures ).map((f) => f.id); - assert.include(futuresIds, "Module1:Example#EventName#arg1#0"); - assert.include(futuresIds, "Module1:second"); + assert.include(futuresIds, "Module1#Example.EventName.arg1.0"); + assert.include(futuresIds, "Module1#second"); }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts index 502cd69271..fd99905d11 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts @@ -86,7 +86,7 @@ describe("Reconciliation - artifact contract at", () => { const deploymentState = createDeploymentState({ ...exampleContractAtState, - id: `Submodule:Contract1`, + id: `Submodule#Contract1`, futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -109,7 +109,7 @@ describe("Reconciliation - artifact contract at", () => { const deploymentState = createDeploymentState( { ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Example", @@ -120,7 +120,7 @@ describe("Reconciliation - artifact contract at", () => { }, { ...exampleStaticCallState, - id: "Module:Example#getAddress", + id: "Module#Example.getAddress", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, functionName: "getAddress", @@ -131,7 +131,7 @@ describe("Reconciliation - artifact contract at", () => { }, { ...exampleContractAtState, - id: "Module:Another", + id: "Module#Another", futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "Another", @@ -161,7 +161,7 @@ describe("Reconciliation - artifact contract at", () => { moduleDefinition, createDeploymentState({ ...exampleContractAtState, - id: "Module:Factory", + id: "Module#Factory", futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", @@ -172,7 +172,7 @@ describe("Reconciliation - artifact contract at", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Factory", + futureId: "Module#Factory", failure: "Contract name has been changed from ContractUnchanged to ContractChanged", }, @@ -197,7 +197,7 @@ describe("Reconciliation - artifact contract at", () => { moduleDefinition, createDeploymentState({ ...exampleContractAtState, - id: "Module:Factory", + id: "Module#Factory", futureType: FutureType.ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, @@ -206,7 +206,7 @@ describe("Reconciliation - artifact contract at", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Factory", + futureId: "Module#Factory", failure: "Address has been changed from 0xBA12222222228d8Ba445958a75a0704d566BF2C8 to 0x1F98431c8aD98523631AE4a59f267346ea31F984", }, diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts index 92694bab69..fe868d8639 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -67,7 +67,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:SafeMath", + id: "Submodule#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -78,7 +78,7 @@ describe("Reconciliation - artifact contract", () => { }, { ...exampleDeploymentState, - id: "Submodule:Contract1", + id: "Submodule#Contract1", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, constructorArgs: [{ supply: BigInt(1000) }], @@ -106,7 +106,7 @@ describe("Reconciliation - artifact contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", @@ -115,7 +115,7 @@ describe("Reconciliation - artifact contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Contract name has been changed from ContractUnchanged to ContractChanged", }, @@ -141,7 +141,7 @@ describe("Reconciliation - artifact contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, constructorArgs: [ @@ -154,7 +154,7 @@ describe("Reconciliation - artifact contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1", + futureId: "Module#Contract1", failure: "Argument at index 2 has been changed", }, ]); @@ -178,7 +178,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:SafeMath", + id: "Module#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -189,7 +189,7 @@ describe("Reconciliation - artifact contract", () => { }, { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, libraries: {}, @@ -199,7 +199,7 @@ describe("Reconciliation - artifact contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1", + futureId: "Module#Contract1", failure: "Library SafeMath has been added", }, ]); @@ -219,7 +219,7 @@ describe("Reconciliation - artifact contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, value: BigInt(3), @@ -228,7 +228,7 @@ describe("Reconciliation - artifact contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Value has been changed from 3 to 4", }, ]); @@ -248,7 +248,7 @@ describe("Reconciliation - artifact contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, from: oneAddress, @@ -257,7 +257,7 @@ describe("Reconciliation - artifact contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 80ca19c1af..4c22d6a3cc 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -59,7 +59,7 @@ describe("Reconciliation - artifact library", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:SafeMath", + id: "Submodule#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -70,7 +70,7 @@ describe("Reconciliation - artifact library", () => { }, { ...exampleDeploymentState, - id: "Submodule:MainLibrary", + id: "Submodule#MainLibrary", futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", @@ -95,7 +95,7 @@ describe("Reconciliation - artifact library", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "LibraryUnchanged", @@ -104,7 +104,7 @@ describe("Reconciliation - artifact library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Contract name has been changed from LibraryUnchanged to LibraryChanged", }, @@ -127,7 +127,7 @@ describe("Reconciliation - artifact library", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:SafeMath", + id: "Module#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -138,7 +138,7 @@ describe("Reconciliation - artifact library", () => { }, { ...exampleDeploymentState, - id: "Module:MainLibrary", + id: "Module#MainLibrary", futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", @@ -151,7 +151,7 @@ describe("Reconciliation - artifact library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:MainLibrary", + futureId: "Module#MainLibrary", failure: "Library Unchanged has been removed", }, ]); @@ -171,7 +171,7 @@ describe("Reconciliation - artifact library", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library1", @@ -181,7 +181,7 @@ describe("Reconciliation - artifact library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts index dc623a4529..3e54b829f2 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts @@ -81,7 +81,7 @@ describe("Reconciliation - named contract at", () => { const deploymentState = createDeploymentState({ ...exampleContractAtState, - id: `Submodule:Contract1`, + id: `Submodule#Contract1`, futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -103,7 +103,7 @@ describe("Reconciliation - named contract at", () => { const previousExecutionState = createDeploymentState( { ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Example", @@ -114,7 +114,7 @@ describe("Reconciliation - named contract at", () => { }, { ...exampleStaticCallState, - id: "Module:Example#getAddress", + id: "Module#Example.getAddress", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, functionName: "getAddress", @@ -125,7 +125,7 @@ describe("Reconciliation - named contract at", () => { }, { ...exampleContractAtState, - id: "Module:Another", + id: "Module#Another", futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, @@ -149,7 +149,7 @@ describe("Reconciliation - named contract at", () => { moduleDefinition, createDeploymentState({ ...exampleContractAtState, - id: "Module:Factory", + id: "Module#Factory", futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", @@ -159,7 +159,7 @@ describe("Reconciliation - named contract at", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Factory", + futureId: "Module#Factory", failure: "Contract name has been changed from ContractUnchanged to ContractChanged", }, @@ -179,7 +179,7 @@ describe("Reconciliation - named contract at", () => { moduleDefinition, createDeploymentState({ ...exampleContractAtState, - id: "Module:Factory", + id: "Module#Factory", futureType: FutureType.NAMED_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, @@ -188,7 +188,7 @@ describe("Reconciliation - named contract at", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Factory", + futureId: "Module#Factory", failure: "Address has been changed from 0xBA12222222228d8Ba445958a75a0704d566BF2C8 to 0x1F98431c8aD98523631AE4a59f267346ea31F984", }, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index 76c55583c4..a94313ecbb 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -75,7 +75,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:Contract1", + id: "Submodule#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -84,7 +84,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Submodule:Contract1#function1", + id: "Submodule#Contract1.function1", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.SUCCESS, functionName: "function1", @@ -108,7 +108,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -117,7 +117,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -128,9 +128,9 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: - "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module:Contract1)", + "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module#Contract1)", }, ]); }); @@ -149,7 +149,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -158,7 +158,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "functionUnchanged", @@ -168,7 +168,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: "Function name has been changed from functionUnchanged to functionChanged", }, @@ -191,7 +191,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -200,7 +200,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:Contract1#function1", + id: "Module#Contract1.function1", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -211,7 +211,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#function1", + futureId: "Module#Contract1.function1", failure: "Argument at index 0 has been changed", }, ]); @@ -231,7 +231,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -240,7 +240,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -251,7 +251,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: "Value has been changed from 2 to 3", }, ]); @@ -271,7 +271,7 @@ describe("Reconciliation - named contract call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -280,7 +280,7 @@ describe("Reconciliation - named contract call", () => { }, { ...exampleContractCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -291,7 +291,7 @@ describe("Reconciliation - named contract call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts index cee1491f44..1ee48ed8af 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -69,7 +69,7 @@ describe("Reconciliation - named contract", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:SafeMath", + id: "Submodule#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -80,7 +80,7 @@ describe("Reconciliation - named contract", () => { }, { ...exampleDeploymentState, - id: "Submodule:Contract1", + id: "Submodule#Contract1", status: ExecutionStatus.STARTED, constructorArgs: [ "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", @@ -109,7 +109,7 @@ describe("Reconciliation - named contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", }) @@ -117,7 +117,7 @@ describe("Reconciliation - named contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Contract name has been changed from ContractUnchanged to ContractChanged", }, @@ -145,7 +145,7 @@ describe("Reconciliation - named contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", constructorArgs: [1, 2, 3], @@ -154,7 +154,7 @@ describe("Reconciliation - named contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Contract name has been changed from ContractUnchanged to ContractChanged", }, @@ -179,7 +179,7 @@ describe("Reconciliation - named contract", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:SafeMath", + id: "Module#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -190,7 +190,7 @@ describe("Reconciliation - named contract", () => { }, { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.STARTED, libraries: {}, } @@ -199,7 +199,7 @@ describe("Reconciliation - named contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1", + futureId: "Module#Contract1", failure: "Library SafeMath has been added", }, ]); @@ -219,7 +219,7 @@ describe("Reconciliation - named contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", status: ExecutionStatus.STARTED, contractName: "Contract", value: BigInt(2), @@ -228,7 +228,7 @@ describe("Reconciliation - named contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: "Value has been changed from 2 to 3", }, ]); @@ -248,7 +248,7 @@ describe("Reconciliation - named contract", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Example", + id: "Module#Example", status: ExecutionStatus.STARTED, contractName: "Contract", from: oneAddress, @@ -257,7 +257,7 @@ describe("Reconciliation - named contract", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Example", + futureId: "Module#Example", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts index adaf130980..ae308d80f1 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -59,7 +59,7 @@ describe("Reconciliation - named library", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:SafeMath", + id: "Submodule#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -70,7 +70,7 @@ describe("Reconciliation - named library", () => { }, { ...exampleDeploymentState, - id: "Submodule:MainLibrary", + id: "Submodule#MainLibrary", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", @@ -93,7 +93,7 @@ describe("Reconciliation - named library", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Library", + id: "Module#Library", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "LibraryUnchanged", @@ -102,7 +102,7 @@ describe("Reconciliation - named library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Library", + futureId: "Module#Library", failure: "Contract name has been changed from LibraryUnchanged to LibraryChanged", }, @@ -125,7 +125,7 @@ describe("Reconciliation - named library", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:SafeMath", + id: "Module#SafeMath", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", @@ -136,7 +136,7 @@ describe("Reconciliation - named library", () => { }, { ...exampleDeploymentState, - id: "Module:MainLibrary", + id: "Module#MainLibrary", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", @@ -149,7 +149,7 @@ describe("Reconciliation - named library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:MainLibrary", + futureId: "Module#MainLibrary", failure: "Library Unchanged has been removed", }, ]); @@ -166,7 +166,7 @@ describe("Reconciliation - named library", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Library", + id: "Module#Library", futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library", @@ -176,7 +176,7 @@ describe("Reconciliation - named library", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Library", + futureId: "Module#Library", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index fb3b68a862..787d9b8025 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -75,7 +75,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:Contract1", + id: "Submodule#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -84,7 +84,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Submodule:Contract1#function1", + id: "Submodule#Contract1.function1", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, contractAddress: exampleAddress, @@ -109,7 +109,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -118,7 +118,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:config", + id: "Module#config", status: ExecutionStatus.STARTED, functionName: "function1", contractAddress: exampleAddress, @@ -128,9 +128,9 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: - "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module:Contract1)", + "Contract address has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module#Contract1)", }, ]); }); @@ -149,7 +149,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -158,7 +158,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -169,7 +169,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: "Function name has been changed from functionUnchanged to functionChanged", }, @@ -192,7 +192,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -201,7 +201,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract1#function1", + id: "Module#Contract1.function1", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -213,7 +213,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1#function1", + futureId: "Module#Contract1.function1", failure: "Argument at index 0 has been changed", }, ]); @@ -236,7 +236,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -245,7 +245,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:config", + id: "Module#config", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, @@ -257,7 +257,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:config", + futureId: "Module#config", failure: `From account has been changed from ${oneAddress} to ${twoAddress}`, }, ]); @@ -277,7 +277,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract", + id: "Module#Contract", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { @@ -288,7 +288,7 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:Contract#function", + id: "Module#Contract.function", status: ExecutionStatus.STARTED, nameOrIndex: "argUnchanged", } @@ -297,7 +297,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract#function", + futureId: "Module#Contract.function", failure: "Argument name or index has been changed from argUnchanged to argChanged", }, @@ -331,7 +331,7 @@ describe("Reconciliation - named static call", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -340,10 +340,10 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:first_call", + id: "Module#first_call", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, - dependencies: new Set(["Module:Contract1"]), + dependencies: new Set(["Module#Contract1"]), contractAddress: exampleAddress, functionName: "function1", args: ["first"], @@ -354,10 +354,10 @@ describe("Reconciliation - named static call", () => { }, { ...exampleStaticCallState, - id: "Module:second_call", + id: "Module#second_call", futureType: FutureType.NAMED_STATIC_CALL, status: ExecutionStatus.SUCCESS, - dependencies: new Set(["Module:Contract1", "Module:first_call"]), + dependencies: new Set(["Module#Contract1", "Module#first_call"]), contractAddress: exampleAddress, functionName: "function1", args: ["second"], @@ -368,9 +368,9 @@ describe("Reconciliation - named static call", () => { }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", status: ExecutionStatus.STARTED, - dependencies: new Set(["Module:first_call", "Module:second_call"]), + dependencies: new Set(["Module#first_call", "Module#second_call"]), contractName: "Contract2", constructorArgs: ["first"], result: { @@ -383,7 +383,7 @@ describe("Reconciliation - named static call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract2", + futureId: "Module#Contract2", failure: "Argument at index 0 has been changed", }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts index 83027ca2b1..f6ea9cd3f5 100644 --- a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts @@ -74,7 +74,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Submodule:Contract", + id: "Submodule#Contract", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract", @@ -85,7 +85,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Submodule:Contract#EventName1#arg1#0", + id: "Submodule#Contract.EventName1.arg1.0", status: ExecutionStatus.STARTED, eventName: "EventName1", nameOrIndex: "arg1", @@ -110,7 +110,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract", + id: "Module#Contract", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract", @@ -121,7 +121,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent", + id: "Module#ReadEvent", status: ExecutionStatus.STARTED, eventName: "eventUnchanged", } @@ -130,7 +130,7 @@ describe("Reconciliation - read event argument", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:ReadEvent", + futureId: "Module#ReadEvent", failure: "Event name has been changed from eventUnchanged to EventChanged", }, @@ -153,7 +153,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract", + id: "Module#Contract", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { @@ -164,7 +164,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent", + id: "Module#ReadEvent", status: ExecutionStatus.STARTED, nameOrIndex: "argUnchanged", } @@ -173,7 +173,7 @@ describe("Reconciliation - read event argument", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:ReadEvent", + futureId: "Module#ReadEvent", failure: "Argument name or index has been changed from argUnchanged to argChanged", }, @@ -197,7 +197,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract", + id: "Module#Contract", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { @@ -208,7 +208,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent", + id: "Module#ReadEvent", status: ExecutionStatus.STARTED, eventIndex: 1, } @@ -217,7 +217,7 @@ describe("Reconciliation - read event argument", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:ReadEvent", + futureId: "Module#ReadEvent", failure: "Event index has been changed from 1 to 3", }, ]); @@ -241,7 +241,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", @@ -252,7 +252,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", @@ -263,7 +263,7 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent", + id: "Module#ReadEvent", status: ExecutionStatus.STARTED, emitterAddress: exampleAddress, } @@ -272,9 +272,9 @@ describe("Reconciliation - read event argument", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:ReadEvent", + futureId: "Module#ReadEvent", failure: - "Emitter has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module:Contract2)", + "Emitter has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8 (future Module#Contract2)", }, ]); }); @@ -306,7 +306,7 @@ describe("Reconciliation - read event argument", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -315,9 +315,9 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent1", + id: "Module#ReadEvent1", status: ExecutionStatus.SUCCESS, - dependencies: new Set(["Module:Contract1"]), + dependencies: new Set(["Module#Contract1"]), eventName: "event1", nameOrIndex: "argument1", emitterAddress: exampleAddress, @@ -325,9 +325,9 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleReadArgState, - id: "Module:ReadEvent2", + id: "Module#ReadEvent2", status: ExecutionStatus.SUCCESS, - dependencies: new Set(["Module:Contract1"]), + dependencies: new Set(["Module#Contract1"]), eventName: "event2", nameOrIndex: "argument2", emitterAddress: exampleAddress, @@ -335,9 +335,9 @@ describe("Reconciliation - read event argument", () => { }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", status: ExecutionStatus.STARTED, - dependencies: new Set(["Module:ReadEvent1", "Module:ReadEvent2"]), + dependencies: new Set(["Module#ReadEvent1", "Module#ReadEvent2"]), contractName: "Contract2", result: { type: ExecutionResultType.SUCCESS, @@ -350,7 +350,7 @@ describe("Reconciliation - read event argument", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract2", + futureId: "Module#Contract2", failure: "Argument at index 0 has been changed", }, ]); diff --git a/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/core/test/reconciliation/futures/reconcileSendData.ts index 9f3d619a78..06dca8e5cd 100644 --- a/packages/core/test/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/reconciliation/futures/reconcileSendData.ts @@ -50,7 +50,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Submodule:test_send", + id: "Submodule#test_send", status: ExecutionStatus.STARTED, }) ); @@ -67,7 +67,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Module:test_send", + id: "Module#test_send", status: ExecutionStatus.STARTED, data: "0x", }) @@ -85,7 +85,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Module:test_send", + id: "Module#test_send", status: ExecutionStatus.STARTED, to: exampleAddress, }) @@ -93,7 +93,7 @@ describe("Reconciliation - send data", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:test_send", + futureId: "Module#test_send", failure: 'Address "to" has been changed from 0x1F98431c8aD98523631AE4a59f267346ea31F984 to 0xBA12222222228d8Ba445958a75a0704d566BF2C8', }, @@ -111,7 +111,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Module:test_send", + id: "Module#test_send", status: ExecutionStatus.STARTED, data: "unchanged_data", }) @@ -119,7 +119,7 @@ describe("Reconciliation - send data", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:test_send", + futureId: "Module#test_send", failure: "Data has been changed from unchanged_data to changed_data", }, ]); @@ -136,7 +136,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Module:test_send", + id: "Module#test_send", status: ExecutionStatus.STARTED, value: 2n, }) @@ -144,7 +144,7 @@ describe("Reconciliation - send data", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:test_send", + futureId: "Module#test_send", failure: "Value has been changed from 2 to 3", }, ]); @@ -163,7 +163,7 @@ describe("Reconciliation - send data", () => { moduleDefinition, createDeploymentState({ ...exampleSendState, - id: "Module:test_send", + id: "Module#test_send", status: ExecutionStatus.STARTED, from: exampleAddress, }) @@ -171,7 +171,7 @@ describe("Reconciliation - send data", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:test_send", + futureId: "Module#test_send", failure: `From account has been changed from ${exampleAddress} to ${differentAddress}`, }, ]); diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 999db31e13..f1ac68c63b 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -22,7 +22,7 @@ import { describe("Reconciliation", () => { const exampleDeploymentState: DeploymentExecutionState = { - id: "Module1:Contract1", + id: "Module1#Contract1", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, strategy: "basic", @@ -90,14 +90,14 @@ describe("Reconciliation", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module1:ContractMissed", // This future is not in the module + id: "Module1#ContractMissed", // This future is not in the module status: ExecutionStatus.STARTED, }) ); assert.deepStrictEqual( reconiliationResult.missingExecutedFutures, - ["Module1:ContractMissed"], + ["Module1#ContractMissed"], "Expected one missing previous executed future" ); }); @@ -112,7 +112,7 @@ describe("Reconciliation", () => { const reconiliationResult = await reconcile(moduleDefinition, { chainId: 123, executionStates: { - "Module1:Example": { + "Module1#Example": { ...exampleDeploymentState, futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, @@ -122,9 +122,9 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module1:Example", + futureId: "Module1#Example", failure: - "Future with id Module1:Example has changed from NAMED_CONTRACT_DEPLOYMENT to NAMED_LIBRARY_DEPLOYMENT", + "Future with id Module1#Example has changed from NAMED_CONTRACT_DEPLOYMENT to NAMED_LIBRARY_DEPLOYMENT", }, ]); }); @@ -139,7 +139,7 @@ describe("Reconciliation", () => { const reconiliationResult = await reconcile(moduleDefinition, { chainId: 123, executionStates: { - "Module1:Example": { + "Module1#Example": { ...exampleDeploymentState, status: ExecutionStatus.TIMEOUT, }, @@ -148,9 +148,9 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module1:Contract1", + futureId: "Module1#Contract1", failure: - "The previous run of the future Module1:Contract1 timed out, and will need wiped before running again", + "The previous run of the future Module1#Contract1 timed out, and will need wiped before running again", }, ]); }); @@ -165,7 +165,7 @@ describe("Reconciliation", () => { const reconiliationResult = await reconcile(moduleDefinition, { chainId: 123, executionStates: { - "Module1:Example": { + "Module1#Example": { ...exampleDeploymentState, status: ExecutionStatus.FAILED, }, @@ -174,9 +174,9 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module1:Contract1", + futureId: "Module1#Contract1", failure: - "The previous run of the future Module1:Contract1 failed, and will need wiped before running again", + "The previous run of the future Module1#Contract1 failed, and will need wiped before running again", }, ]); }); @@ -192,7 +192,7 @@ describe("Reconciliation", () => { const reconiliationResult = await reconcile(moduleDefinition, { chainId: 123, executionStates: { - "Module1:Contract1": { + "Module1#Contract1": { ...exampleDeploymentState, futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, @@ -225,7 +225,7 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module1:Contract1", + futureId: "Module1#Contract1", failure: `From account has been changed from ${exampleAccounts[3]} to ${exampleAccounts[2]}`, }, ]); @@ -251,24 +251,24 @@ describe("Reconciliation", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", }, { ...exampleDeploymentState, - id: "Module:Contract3", + id: "Module#Contract3", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - dependencies: new Set(["Module:Contract2", "Module:Contract2"]), + dependencies: new Set(["Module#Contract2", "Module#Contract2"]), contractName: "Contract3", } ) @@ -291,24 +291,24 @@ describe("Reconciliation", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", }, { ...exampleDeploymentState, - id: "Module:Contract3", + id: "Module#Contract3", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, - dependencies: new Set(["Module:Contract1", "Module:Contract2"]), + dependencies: new Set(["Module#Contract1", "Module#Contract2"]), contractName: "Contract3", } ) @@ -330,14 +330,14 @@ describe("Reconciliation", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Contract2", @@ -362,14 +362,14 @@ describe("Reconciliation", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:Contract1", + id: "Module#Contract1", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, // Could still be in flight contractName: "Contract1", }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, dependencies: new Set(), // no deps on last run @@ -380,9 +380,9 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract2", + futureId: "Module#Contract2", failure: - "A dependency from Module:Contract2 to Module:Contract1 has been added, and both futures had already started executing, so this change is incompatible", + "A dependency from Module#Contract2 to Module#Contract1 has been added, and both futures had already started executing, so this change is incompatible", }, ]); }); @@ -404,7 +404,7 @@ describe("Reconciliation", () => { createDeploymentState( { ...exampleDeploymentState, - id: "Module:ContractOriginal", + id: "Module#ContractOriginal", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, dependencies: new Set(), // no deps on last run @@ -412,10 +412,10 @@ describe("Reconciliation", () => { }, { ...exampleDeploymentState, - id: "Module:Contract2", + id: "Module#Contract2", futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, - dependencies: new Set("Module:ContractOriginal"), // no deps on last run + dependencies: new Set("Module#ContractOriginal"), // no deps on last run contractName: "Contract2", constructorArgs: [exampleAddress], } @@ -424,9 +424,9 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module:Contract2", + futureId: "Module#Contract2", failure: - "A dependency from Module:Contract2 to Module:ContractNew has been added. The former has started executing before the latter started executing, so this change is incompatible.", + "A dependency from Module#Contract2 to Module#ContractNew has been added. The former has started executing before the latter started executing, so this change is incompatible.", }, ]); }); @@ -450,15 +450,15 @@ describe("Reconciliation", () => { }; const storedArtifactMap = { - "Module:Contract1": moduleArtifactMap.Contract1, + "Module#Contract1": moduleArtifactMap.Contract1, }; const reconciliationResult = await reconcile( moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Contract1", - artifactId: "Module:Contract1", + id: "Module#Contract1", + artifactId: "Module#Contract1", }), new ArtifactMapDeploymentLoader(storedArtifactMap), new ArtifactMapResolver(moduleArtifactMap) @@ -484,7 +484,7 @@ describe("Reconciliation", () => { }; const storedArtifactMap = { - "Module:Contract1": { + "Module#Contract1": { abi: [], bytecode: "0xbbbbbb", contractName: "Contract1", @@ -496,8 +496,8 @@ describe("Reconciliation", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Contract1", - artifactId: "Module:Contract1", + id: "Module#Contract1", + artifactId: "Module#Contract1", }), new ArtifactMapDeploymentLoader(storedArtifactMap), new ArtifactMapResolver(moduleArtifactMap) @@ -505,7 +505,7 @@ describe("Reconciliation", () => { assert.deepStrictEqual(reconciliationResult.reconciliationFailures, [ { - futureId: "Module:Contract1", + futureId: "Module#Contract1", failure: "Artifact bytecodes have been changed", }, ]); @@ -532,7 +532,7 @@ describe("Reconciliation", () => { }); const storedArtifactMap = { - "Module:Contract1": { + "Module#Contract1": { abi: [], bytecode: mainnetWethBytecode, contractName: "Contract1", @@ -553,8 +553,8 @@ describe("Reconciliation", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - id: "Module:Contract1", - artifactId: "Module:Contract1", + id: "Module#Contract1", + artifactId: "Module#Contract1", }), new ArtifactMapDeploymentLoader(storedArtifactMap), new ArtifactMapResolver(moduleArtifactMap) diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 59e9d64085..483b767bad 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -33,7 +33,7 @@ describe("send", () => { assert.equal(moduleWithASingleContract.submodules.size, 0); const sendFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -54,11 +54,11 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -80,11 +80,11 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -105,7 +105,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -125,7 +125,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -148,7 +148,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -168,7 +168,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const sendFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:test_send" + ({ id }) => id === "Module1#test_send" ); if (!(sendFuture instanceof SendDataFutureImplementation)) { @@ -190,11 +190,11 @@ describe("send", () => { return {}; }); - const futureC = Array.from(module.futures).find((f) => f.id === "Module:C"); + const futureC = Array.from(module.futures).find((f) => f.id === "Module#C"); assertInstanceOf(futureC, SendDataFutureImplementation); const futureC2 = Array.from(module.futures).find( - (f) => f.id === "Module:C2" + (f) => f.id === "Module#C2" ); assertInstanceOf(futureC2, SendDataFutureImplementation); @@ -219,11 +219,11 @@ describe("send", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const sendFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:first" + ({ id }) => id === "Module1#first" ); const sendFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:second" + ({ id }) => id === "Module1#second" ); assert.isDefined(sendFuture); @@ -239,7 +239,7 @@ describe("send", () => { return {}; }), - /Duplicated id Module1:test_send found in module Module1/ + /Duplicated id Module1#test_send found in module Module1/ ); }); @@ -251,7 +251,7 @@ describe("send", () => { m.send("first", "0xtest", 0n, "test"); return {}; }), - /Duplicated id Module1:first found in module Module1/ + /Duplicated id Module1#first found in module Module1/ ); }); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 04d2c98a09..c760d5d462 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -30,7 +30,7 @@ describe("static call", () => { assert.equal(moduleWithASingleContract.id, "Module1"); assert.equal( moduleWithASingleContract.results.contract1.id, - "Module1:Contract1" + "Module1#Contract1" ); // 1 contract future & 1 call future @@ -61,15 +61,15 @@ describe("static call", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -94,15 +94,15 @@ describe("static call", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example" + ({ id }) => id === "Module1#Example" ); const anotherFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Another" + ({ id }) => id === "Module1#Another" ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -128,11 +128,11 @@ describe("static call", () => { assert.isDefined(moduleWithASingleContract); const staticCallFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1#test" + ({ id }) => id === "Module1#Contract1.test" ); const callFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1#test2" + ({ id }) => id === "Module1#Contract1.test2" ); if (!(callFuture instanceof NamedContractCallFutureImplementation)) { @@ -156,11 +156,11 @@ describe("static call", () => { assert.isDefined(moduleWithASingleContract); const staticCallFuture = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1#test" + ({ id }) => id === "Module1#Contract1.test" ); const staticCallFuture2 = [...moduleWithASingleContract.futures].find( - ({ id }) => id === "Module1:Contract1#test2" + ({ id }) => id === "Module1#Contract1.test2" ); if (!(staticCallFuture instanceof NamedStaticCallFutureImplementation)) { @@ -187,7 +187,7 @@ describe("static call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -209,7 +209,7 @@ describe("static call", () => { assert.isDefined(moduleWithDependentContracts); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1:Example#test" + ({ id }) => id === "Module1#Example.test" ); if (!(callFuture instanceof NamedStaticCallFutureImplementation)) { @@ -398,11 +398,11 @@ describe("static call", () => { assert.equal(moduleWithSameCallTwice.id, "Module1"); const callFuture = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:first" + ({ id }) => id === "Module1#first" ); const callFuture2 = [...moduleWithSameCallTwice.futures].find( - ({ id }) => id === "Module1:second" + ({ id }) => id === "Module1#second" ); assert.isDefined(callFuture); @@ -419,7 +419,7 @@ describe("static call", () => { return { sameContract1 }; }), - /Duplicated id Module1:SameContract#test found in module Module1/ + /Duplicated id Module1#SameContract.test found in module Module1/ ); }); @@ -432,7 +432,7 @@ describe("static call", () => { m.staticCall(sameContract1, "test", [], 0, { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1:first found in module Module1/ + /Duplicated id Module1#first found in module Module1/ ); }); }); diff --git a/packages/core/test/useModule.ts b/packages/core/test/useModule.ts index 960404710e..5b57757f02 100644 --- a/packages/core/test/useModule.ts +++ b/packages/core/test/useModule.ts @@ -211,7 +211,7 @@ describe("useModule", () => { assert.deepStrictEqual(result, { type: DeploymentResultType.VALIDATION_ERROR, errors: { - "Submodule1:Contract1": [ + "Submodule1#Contract1": [ "Module parameter 'param1' requires a value but was given none", ], }, diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index c0ee09dbe6..bcabdac929 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -12,14 +12,14 @@ describe("future id rules", () => { it("the fallback id should be built based on the contract or library name", () => { assert.equal( toDeploymentFutureId("MyModule", undefined, "MyContract"), - "MyModule:MyContract" + "MyModule#MyContract" ); }); it("namespaces to the module a user provided id", () => { assert.equal( toDeploymentFutureId("MyModule", "MyId", "MyContract"), - "MyModule:MyId" + "MyModule#MyId" ); }); }); @@ -28,14 +28,14 @@ describe("future id rules", () => { it("the fallback id should be built based on the contractName and function name", () => { assert.equal( toCallFutureId("MyModule", undefined, "MyContract", "MyFunction"), - "MyModule:MyContract#MyFunction" + "MyModule#MyContract.MyFunction" ); }); it("namespaces the user provided id to the module", () => { assert.equal( toCallFutureId("MyModule", "MyId", "MyContract", "MyFunction"), - "MyModule:MyId" + "MyModule#MyId" ); }); }); @@ -51,7 +51,7 @@ describe("future id rules", () => { "MyArg", 2 ), - "MyModule:MyContract#MyFunction#MyArg#2" + "MyModule#MyContract.MyFunction.MyArg.2" ); }); @@ -65,14 +65,14 @@ describe("future id rules", () => { "MyArg", 2 ), - "MyModule:MyId" + "MyModule#MyId" ); }); }); describe("send data ids", () => { it("namespaces the user provided id to the module", () => { - assert.equal(toSendDataFutureId("MyModule", "MyId"), "MyModule:MyId"); + assert.equal(toSendDataFutureId("MyModule", "MyId"), "MyModule#MyId"); }); }); }); diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index fe5c68dda2..c92b553c1d 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -149,7 +149,7 @@ describe("static calls", () => { await assert.isRejected( this.deploy(moduleDefinition), - /Future 'FooModule:FooFactory#nonAddressResult' must be a valid address/ + /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ ); }); @@ -174,7 +174,7 @@ describe("static calls", () => { await assert.isRejected( this.deploy(moduleDefinition), - /Future 'FooModule:FooFactory#nonAddressResult' must be a valid address/ + /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ ); }); }); diff --git a/packages/ui/scripts/generate-example-deployment-json.js b/packages/ui/scripts/generate-example-deployment-json.js index 22964c8eb9..8d3c7fea3f 100644 --- a/packages/ui/scripts/generate-example-deployment-json.js +++ b/packages/ui/scripts/generate-example-deployment-json.js @@ -1,10 +1,7 @@ -import { - ModuleConstructor, - StoredDeploymentSerializer, -} from "@ignored/ignition-core"; +import { StoredDeploymentSerializer } from "@ignored/ignition-core"; import { writeFile } from "node:fs/promises"; -import moduleDefinition from "../examples/ComplexModule.js"; +import complexModule from "../examples/ComplexModule.js"; const main = async () => { await writeDeploymentJsonFor({ @@ -12,12 +9,12 @@ const main = async () => { chainId: 999, networkName: "Hardhat", }, - moduleDefinition: moduleDefinition, + module: complexModule, }); }; async function writeDeploymentJsonFor(deployment) { - const serializedDeployment = serializeDeployment(deployment); + const serializedDeployment = StoredDeploymentSerializer.serialize(deployment); console.log("Deployment written to ./public/deployment.json"); @@ -27,16 +24,4 @@ async function writeDeploymentJsonFor(deployment) { ); } -function serializeDeployment(deployment) { - const constructor = new ModuleConstructor(deployment.details.chainId, []); - const module = constructor.construct(deployment.moduleDefinition); - - const serializedModule = StoredDeploymentSerializer.serialize({ - details: deployment.details, - module, - }); - - return serializedModule; -} - main(); diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 0859d9b1d3..79831d6602 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -16,7 +16,7 @@ export const Action: React.FC<{ const displayText = toDisplayText(future); const navigateToFuture = useCallback(() => { - return navigate(`/future/${future.id}`); + return navigate(`/future/${encodeURIComponent(future.id)}`); }, [future.id, navigate]); return ( diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 33adbbb6f1..4b56787b97 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -19,7 +19,7 @@ describe("to-mermaid", () => { subgraph Module direction BT - Module:Contract1["Deploy Contract1"] + Module#Contract1["Deploy Contract1"] end classDef startModule stroke-width:4px`; @@ -43,7 +43,7 @@ describe("to-mermaid", () => { subgraph Test_registrar direction BT - Test_registrar:Contract1["Deploy Contract1"] + Test_registrar#Contract1["Deploy Contract1"] end classDef startModule stroke-width:4px`; @@ -83,21 +83,21 @@ describe("to-mermaid", () => { subgraph Module direction BT - Module:Contract3["Deploy Contract3"] + Module#Contract3["Deploy Contract3"] end subgraph Submodule1 direction BT - Submodule1:Contract1["Deploy Contract1"] + Submodule1#Contract1["Deploy Contract1"] end subgraph Submodule2 direction BT - Submodule2:Contract2["Deploy Contract2"] + Submodule2#Contract2["Deploy Contract2"] end - Module:Contract3 --> Submodule1:Contract1 - Module:Contract3 --> Submodule2:Contract2 + Module#Contract3 --> Submodule1#Contract1 + Module#Contract3 --> Submodule2#Contract2 Module -.-> Submodule1 Module -.-> Submodule2 @@ -171,26 +171,26 @@ describe("to-mermaid", () => { subgraph Module direction BT - Module:BasicContract["Deploy BasicContract"] - Module:BasicLibrary["Deploy library BasicLibrary"] - Module:BasicLibrary2["Deploy library from artifact BasicLibrary"] - Module:ContractWithLibrary["Deploy from artifact ContractWithLibrary"] - Module:BasicContract#basicFunction["Call BasicContract/basicFunction"] - Module:BasicContract#BasicEvent#eventArg#0["Read event from future Module:BasicContract#basicFunction (event BasicEvent argument eventArg)"] - Module:ContractWithLibrary#readonlyFunction["Static call ContractWithLibrary/readonlyFunction"] - Module:BasicContract2["Existing contract BasicContract (Module:BasicContract)"] - Module:ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module:ContractWithLibrary)"] - Module:test_send["Send data to Module:BasicContract2"] + Module#BasicContract["Deploy BasicContract"] + Module#BasicLibrary["Deploy library BasicLibrary"] + Module#BasicLibrary2["Deploy library from artifact BasicLibrary"] + Module#ContractWithLibrary["Deploy from artifact ContractWithLibrary"] + Module#BasicContract.basicFunction["Call BasicContract/basicFunction"] + Module#BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"] + Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary/readonlyFunction"] + Module#BasicContract2["Existing contract BasicContract (Module#BasicContract)"] + Module#ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"] + Module#test_send["Send data to Module#BasicContract2"] end - Module:ContractWithLibrary --> Module:BasicLibrary - Module:BasicContract#basicFunction --> Module:BasicContract - Module:BasicContract#BasicEvent#eventArg#0 --> Module:BasicContract#basicFunction - Module:ContractWithLibrary#readonlyFunction --> Module:ContractWithLibrary - Module:ContractWithLibrary#readonlyFunction --> Module:BasicContract#BasicEvent#eventArg#0 - Module:BasicContract2 --> Module:BasicContract - Module:ContractWithLibrary2 --> Module:ContractWithLibrary - Module:test_send --> Module:BasicContract2 + Module#ContractWithLibrary --> Module#BasicLibrary + Module#BasicContract.basicFunction --> Module#BasicContract + Module#BasicContract.BasicEvent.eventArg.0 --> Module#BasicContract.basicFunction + Module#ContractWithLibrary.readonlyFunction --> Module#ContractWithLibrary + Module#ContractWithLibrary.readonlyFunction --> Module#BasicContract.BasicEvent.eventArg.0 + Module#BasicContract2 --> Module#BasicContract + Module#ContractWithLibrary2 --> Module#ContractWithLibrary + Module#test_send --> Module#BasicContract2 classDef startModule stroke-width:4px`; @@ -215,13 +215,13 @@ describe("to-mermaid", () => { subgraph Module direction BT - Module:ens["Deploy ens"] - Module:ens#setAddr_bytes32_address_["Call ens/setAddr(bytes32,address)"] - Module:ens#getAddr_bytes32_address_["Static call ens/getAddr(bytes32,address)"] + Module#ens["Deploy ens"] + Module#ens.setAddr_bytes32_address_["Call ens/setAddr(bytes32,address)"] + Module#ens.getAddr_bytes32_address_["Static call ens/getAddr(bytes32,address)"] end - Module:ens#setAddr_bytes32_address_ --> Module:ens - Module:ens#getAddr_bytes32_address_ --> Module:ens + Module#ens.setAddr_bytes32_address_ --> Module#ens + Module#ens.getAddr_bytes32_address_ --> Module#ens classDef startModule stroke-width:4px`; From 1d6118135a2b8a9eb37e5dd5ebcb79402851ed46 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 11:24:59 +0100 Subject: [PATCH 0928/1302] refactor: tweak order of validation checks --- packages/core/src/internal/module-builder.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index c884a7a502..cf75cccd6c 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -432,10 +432,10 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.staticCall); this._assertValidFunctionName(functionName, this.staticCall); + this._assertValidNameOrIndex(nameOrIndex, this.staticCall); this._assertUniqueStaticCallId(futureId); this._assertValidFrom(options.from, this.staticCall); this._assertValidCallableContract(contractFuture, this.staticCall); - this._assertValidNameOrIndex(nameOrIndex, this.staticCall); /* validation end */ const future = new NamedStaticCallFutureImplementation( From 8d08c1bd687e066a3b501bae9988e67ce83ec789 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 11:36:07 +0100 Subject: [PATCH 0929/1302] test: add covering test --- packages/core/test/utils/future-id-builders.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index bcabdac929..74dcfaa9a0 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -55,6 +55,20 @@ describe("future id rules", () => { ); }); + it("the fallback id should be built even when the arg is an index", () => { + assert.equal( + toReadEventArgumentFutureId( + "MyModule", + undefined, + "MyContract", + "MyFunction", + 3, + 2 + ), + "MyModule#MyContract.MyFunction.3.2" + ); + }); + it("namespaces the user provided id to the module", () => { assert.equal( toReadEventArgumentFutureId( From d6b30500a4dbbe2c19080363ce983477e7e84cec Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 13 Sep 2023 17:44:01 -0400 Subject: [PATCH 0930/1302] introduced new deployment result type and moved logic out of reconciler --- packages/core/src/internal/deployer.ts | 56 +++++++++++++++++++ .../src/internal/reconciliation/reconciler.ts | 41 +------------- packages/core/src/types/deploy.ts | 23 ++++++++ 3 files changed, 81 insertions(+), 39 deletions(-) diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 76623b8e60..40836b3a2e 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -1,5 +1,6 @@ import type { IgnitionModule, IgnitionModuleResult } from "../types/module"; +import { IgnitionError } from "../errors"; import { isContractFuture } from "../type-guards"; import { ArtifactResolver } from "../types/artifact"; import { @@ -8,6 +9,7 @@ import { DeploymentResult, DeploymentResultType, ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, SuccessfulDeploymentResult, } from "../types/deploy"; @@ -39,6 +41,7 @@ import { import { ExecutionStrategy } from "./execution/types/execution-strategy"; import { formatExecutionError } from "./formatters"; import { Reconciler } from "./reconciliation/reconciler"; +import { ReconciliationFailure } from "./reconciliation/types"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; import { validateStageTwo } from "./validation/validateStageTwo"; @@ -148,6 +151,30 @@ export class Deployer { return reconciliationErrorResult; } + const previousRunErrors = this._checkForPreviousRunErrors(deploymentState); + + if (previousRunErrors.length > 0) { + // todo: can this be more DRY? + const errors: PreviousRunErrorDeploymentResult["errors"] = {}; + + for (const { futureId, failure } of previousRunErrors) { + if (errors[futureId] === undefined) { + errors[futureId] = []; + } + + errors[futureId].push(failure); + } + + const previousRunErrorResult: PreviousRunErrorDeploymentResult = { + type: DeploymentResultType.PREVIOUS_RUN_ERROR, + errors, + }; + + // this._emitDeploymentCompleteEvent(reconciliationErrorResult); + + return previousRunErrorResult; + } + if (reconciliationResult.missingExecutedFutures.length > 0) { // TODO: indicate to UI that warnings should be shown } @@ -337,6 +364,35 @@ export class Deployer { }), }; } + + private _checkForPreviousRunErrors( + deploymentState: DeploymentState + ): ReconciliationFailure[] { + const failuresOrTimeouts = Object.values( + deploymentState.executionStates + ).filter( + (exState) => + exState.status === ExecutionStatus.FAILED || + exState.status === ExecutionStatus.TIMEOUT + ); + + return failuresOrTimeouts.map((exState) => ({ + futureId: exState.id, + failure: this._previousRunFailedMessageFor(exState), + })); + } + + private _previousRunFailedMessageFor(exState: ExecutionState): string { + if (exState.status === ExecutionStatus.FAILED) { + return `The previous run of the future ${exState.id} failed, and will need wiped before running again`; + } + + if (exState.status === ExecutionStatus.TIMEOUT) { + return `The previous run of the future ${exState.id} timed out, and will need wiped before running again`; + } + + throw new IgnitionError(`Unsupported execution status: ${exState.status}`); + } } // TODO: Does this exist anywhere else? It's in fact just checking if it sends txs diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index 5f6be6c6c9..00f630f0a2 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -1,13 +1,9 @@ -import { IgnitionError } from "../../errors"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { Future, IgnitionModule } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; import { DeploymentState } from "../execution/types/deployment-state"; -import { - ExecutionState, - ExecutionStatus, -} from "../execution/types/execution-state"; +import { ExecutionState } from "../execution/types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; @@ -33,7 +29,7 @@ export class Reconciler { artifactResolver: ArtifactResolver, defaultSender: string ): Promise { - let reconciliationFailures = await this._reconcileEachFutureInModule( + const reconciliationFailures = await this._reconcileEachFutureInModule( module, { deploymentState, @@ -50,10 +46,6 @@ export class Reconciler { ] ); - if (reconciliationFailures.length === 0) { - reconciliationFailures = this._reconcileNoErroredFutures(deploymentState); - } - // TODO: Reconcile sender of incomplete futures. const missingExecutedFutures = this._missingPreviouslyExecutedFutures( @@ -92,35 +84,6 @@ export class Reconciler { return failures; } - private static _reconcileNoErroredFutures( - deploymentState: DeploymentState - ): ReconciliationFailure[] { - const failuresOrTimeouts = Object.values( - deploymentState.executionStates - ).filter( - (exState) => - exState.status === ExecutionStatus.FAILED || - exState.status === ExecutionStatus.TIMEOUT - ); - - return failuresOrTimeouts.map((exState) => ({ - futureId: exState.id, - failure: this._previousRunFailedMessageFor(exState), - })); - } - - private static _previousRunFailedMessageFor(exState: ExecutionState): string { - if (exState.status === ExecutionStatus.FAILED) { - return `The previous run of the future ${exState.id} failed, and will need wiped before running again`; - } - - if (exState.status === ExecutionStatus.TIMEOUT) { - return `The previous run of the future ${exState.id} timed out, and will need wiped before running again`; - } - - throw new IgnitionError(`Unsupported execution status: ${exState.status}`); - } - private static _missingPreviouslyExecutedFutures( module: IgnitionModule, deploymentState: DeploymentState diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 736edf423a..26544f6323 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -42,6 +42,7 @@ export type DeploymentResult< | ValidationErrorDeploymentResult | ReconciliationErrorDeploymentResult | ExecutionErrorDeploymentResult + | PreviousRunErrorDeploymentResult | SuccessfulDeploymentResult; /** @@ -66,6 +67,11 @@ export enum DeploymentResultType { */ EXECUTION_ERROR = "EXECUTION_ERROR", + /** + * One or more futures from a previous run failed or timed out. + */ + PREVIOUS_RUN_ERROR = "PREVIOUS_RUN_ERROR", + /** * The entire deployment was successful. */ @@ -147,6 +153,23 @@ export interface ExecutionErrorDeploymentResult { successful: string[]; } +/** + * A deployment result where one or more futures from a previous run failed or timed out + * and need their state wiped. + * + * @beta + */ +export interface PreviousRunErrorDeploymentResult { + type: DeploymentResultType.PREVIOUS_RUN_ERROR; + + /** + * A map from future id to a list of all of its previous run errors. + */ + errors: { + [futureId: string]: string[]; + }; +} + /** * A deployment result where all of the futures of the module have completed * successfully. From 7ec1749b646af20eefc5ead4a72fd7ef87e604eb Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 13 Sep 2023 19:34:31 -0400 Subject: [PATCH 0931/1302] update UI to handle PreviousRunErrors --- .../ui/components/execution/FinalStatus.tsx | 51 +++++++++++++++++++ ...-deployment-result-to-exception-message.ts | 14 +++++ 2 files changed, 65 insertions(+) diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index efd969823c..cae1ac827c 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -2,6 +2,7 @@ import { DeploymentResultType, ExecutionErrorDeploymentResult, IgnitionModuleResult, + PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, SuccessfulDeploymentResult, ValidationErrorDeploymentResult, @@ -48,6 +49,15 @@ export const FinalStatus = ({ state }: { state: UiState }) => { /> ); } + case DeploymentResultType.PREVIOUS_RUN_ERROR: { + return ( + + ); + } case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { return ( ); }; + +const PreviousRunErrorResult: React.FC<{ + moduleName: string; + chainId: number; + result: PreviousRunErrorDeploymentResult; +}> = ({ moduleName, result }) => { + return ( + + + + + ⛔ Deployment cancelled due to failed or timed out futures on a previous + run of module {moduleName}. + + + + + + {Object.entries(result.errors).map(([futureId, futureErrors]) => ( + + {futureId}{" "} + + These futures will need to be rerun; use the `wipe` task to reset + them: + + + {futureErrors.map((error, i) => ( + + {" "} + - {error} + + + ))} + + ))} + + + + + ); +}; diff --git a/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts index 9bf4fb8a40..10d7822ccc 100644 --- a/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts +++ b/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts @@ -1,6 +1,7 @@ import { DeploymentResultType, ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, ValidationErrorDeploymentResult, } from "@ignored/ignition-core"; @@ -18,6 +19,7 @@ export function errorDeploymentResultToExceptionMessage( | ValidationErrorDeploymentResult | ReconciliationErrorDeploymentResult | ExecutionErrorDeploymentResult + | PreviousRunErrorDeploymentResult ): string { switch (result.type) { case DeploymentResultType.VALIDATION_ERROR: @@ -26,6 +28,8 @@ export function errorDeploymentResultToExceptionMessage( return _convertReconciliationError(result); case DeploymentResultType.EXECUTION_ERROR: return _convertExecutionError(result); + case DeploymentResultType.PREVIOUS_RUN_ERROR: + return _convertPreviousRunError(result); } } @@ -95,6 +99,16 @@ function _convertExecutionError(result: ExecutionErrorDeploymentResult) { ${sections.join("\n\n")}`; } +function _convertPreviousRunError(result: PreviousRunErrorDeploymentResult) { + const errorsList = Object.entries(result.errors).flatMap( + ([futureId, errors]) => errors.map((err) => ` * ${futureId}: ${err}`) + ); + + return `The deployment wasn't run because of the following errors in a previous run: + +${errorsList.join("\n")}`; +} + function _toText({ timeouts, failures, From de1f60130fdcb5e18a8144b8f36869dd8eff2eab Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 13 Sep 2023 19:41:25 -0400 Subject: [PATCH 0932/1302] update tests --- packages/core/src/internal/deployer.ts | 37 ++----------------- .../src/internal/reconciliation/reconciler.ts | 35 +++++++++++++++++- .../core/test/reconciliation/reconciler.ts | 25 ++++--------- 3 files changed, 44 insertions(+), 53 deletions(-) diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 40836b3a2e..3b3d0a8d85 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -1,6 +1,5 @@ import type { IgnitionModule, IgnitionModuleResult } from "../types/module"; -import { IgnitionError } from "../errors"; import { isContractFuture } from "../type-guards"; import { ArtifactResolver } from "../types/artifact"; import { @@ -41,7 +40,6 @@ import { import { ExecutionStrategy } from "./execution/types/execution-strategy"; import { formatExecutionError } from "./formatters"; import { Reconciler } from "./reconciliation/reconciler"; -import { ReconciliationFailure } from "./reconciliation/types"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; import { validateStageTwo } from "./validation/validateStageTwo"; @@ -151,10 +149,10 @@ export class Deployer { return reconciliationErrorResult; } - const previousRunErrors = this._checkForPreviousRunErrors(deploymentState); + const previousRunErrors = + Reconciler.checkForPreviousRunErrors(deploymentState); if (previousRunErrors.length > 0) { - // todo: can this be more DRY? const errors: PreviousRunErrorDeploymentResult["errors"] = {}; for (const { futureId, failure } of previousRunErrors) { @@ -170,7 +168,7 @@ export class Deployer { errors, }; - // this._emitDeploymentCompleteEvent(reconciliationErrorResult); + this._emitDeploymentCompleteEvent(previousRunErrorResult); return previousRunErrorResult; } @@ -364,35 +362,6 @@ export class Deployer { }), }; } - - private _checkForPreviousRunErrors( - deploymentState: DeploymentState - ): ReconciliationFailure[] { - const failuresOrTimeouts = Object.values( - deploymentState.executionStates - ).filter( - (exState) => - exState.status === ExecutionStatus.FAILED || - exState.status === ExecutionStatus.TIMEOUT - ); - - return failuresOrTimeouts.map((exState) => ({ - futureId: exState.id, - failure: this._previousRunFailedMessageFor(exState), - })); - } - - private _previousRunFailedMessageFor(exState: ExecutionState): string { - if (exState.status === ExecutionStatus.FAILED) { - return `The previous run of the future ${exState.id} failed, and will need wiped before running again`; - } - - if (exState.status === ExecutionStatus.TIMEOUT) { - return `The previous run of the future ${exState.id} timed out, and will need wiped before running again`; - } - - throw new IgnitionError(`Unsupported execution status: ${exState.status}`); - } } // TODO: Does this exist anywhere else? It's in fact just checking if it sends txs diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index 00f630f0a2..ad6499ca8a 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -1,9 +1,13 @@ +import { IgnitionError } from "../../errors"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { Future, IgnitionModule } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; import { DeploymentState } from "../execution/types/deployment-state"; -import { ExecutionState } from "../execution/types/execution-state"; +import { + ExecutionState, + ExecutionStatus, +} from "../execution/types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; @@ -56,6 +60,35 @@ export class Reconciler { return { reconciliationFailures, missingExecutedFutures }; } + public static checkForPreviousRunErrors( + deploymentState: DeploymentState + ): ReconciliationFailure[] { + const failuresOrTimeouts = Object.values( + deploymentState.executionStates + ).filter( + (exState) => + exState.status === ExecutionStatus.FAILED || + exState.status === ExecutionStatus.TIMEOUT + ); + + return failuresOrTimeouts.map((exState) => ({ + futureId: exState.id, + failure: this._previousRunFailedMessageFor(exState), + })); + } + + private static _previousRunFailedMessageFor(exState: ExecutionState): string { + if (exState.status === ExecutionStatus.FAILED) { + return `The previous run of the future ${exState.id} failed, and will need wiped before running again`; + } + + if (exState.status === ExecutionStatus.TIMEOUT) { + return `The previous run of the future ${exState.id} timed out, and will need wiped before running again`; + } + + throw new IgnitionError(`Unsupported execution status: ${exState.status}`); + } + private static async _reconcileEachFutureInModule( module: IgnitionModule, context: ReconciliationContext, diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index f1ac68c63b..31a47290a2 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -8,6 +8,7 @@ import { ExecutionStatus, } from "../../src/internal/execution/types/execution-state"; import { getDefaultSender } from "../../src/internal/execution/utils/get-default-sender"; +import { Reconciler } from "../../src/internal/reconciliation/reconciler"; import { FutureType } from "../../src/types/module"; import { exampleAccounts } from "../helpers"; @@ -129,14 +130,8 @@ describe("Reconciliation", () => { ]); }); - it("should flag as unreconsiliable a future that timed out on the previous run", async () => { - const moduleDefinition = buildModule("Module1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - const reconiliationResult = await reconcile(moduleDefinition, { + it("should flag as PreviousRunError a future that timed out on the previous run", async () => { + const reconiliationResult = Reconciler.checkForPreviousRunErrors({ chainId: 123, executionStates: { "Module1#Example": { @@ -146,7 +141,7 @@ describe("Reconciliation", () => { }, }); - assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + assert.deepStrictEqual(reconiliationResult, [ { futureId: "Module1#Contract1", failure: @@ -155,14 +150,8 @@ describe("Reconciliation", () => { ]); }); - it("should flag as unreconsiliable a future that failed on the previous run", async () => { - const moduleDefinition = buildModule("Module1", (m) => { - const contract1 = m.contract("Contract1"); - - return { contract1 }; - }); - - const reconiliationResult = await reconcile(moduleDefinition, { + it("should flag as PreviousRunError a future that failed on the previous run", async () => { + const reconiliationResult = Reconciler.checkForPreviousRunErrors({ chainId: 123, executionStates: { "Module1#Example": { @@ -172,7 +161,7 @@ describe("Reconciliation", () => { }, }); - assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + assert.deepStrictEqual(reconiliationResult, [ { futureId: "Module1#Contract1", failure: From 5e8f7234b82d47d2670f135609595e954dcc0f13 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 13 Sep 2023 20:11:59 -0400 Subject: [PATCH 0933/1302] update to UI --- .../src/ui/components/execution/FinalStatus.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index cae1ac827c..db0b9b8d8a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -196,14 +196,14 @@ const PreviousRunErrorResult: React.FC<{ + + These futures will need to be rerun; use the `wipe` task to reset + them: + + {Object.entries(result.errors).map(([futureId, futureErrors]) => ( - {futureId}{" "} - - These futures will need to be rerun; use the `wipe` task to reset - them: - - + {futureId} {futureErrors.map((error, i) => ( {" "} From 2d2a46ad24069167f5cd3c8524258bb8ebe06f76 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 12 Sep 2023 22:06:16 +0000 Subject: [PATCH 0934/1302] Overload ModuleBuilder's contract, library and contractAt --- packages/core/src/internal/module-builder.ts | 133 ++++++++++++++++--- packages/core/src/types/module-builder.ts | 37 +----- 2 files changed, 120 insertions(+), 50 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index cf75cccd6c..dc64ee8c8a 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -38,10 +38,8 @@ import { import { CallOptions, ContractAtOptions, - ContractFromArtifactOptions, ContractOptions, IgnitionModuleBuilder, - LibraryFromArtifactOptions, LibraryOptions, ReadEventArgumentOptions, SendDataOptions, @@ -179,6 +177,40 @@ class IgnitionModuleBuilderImplementation< } public contract( + contractName: ContractNameT, + args?: ArgumentType[], + options?: ContractOptions + ): NamedContractDeploymentFuture; + public contract( + contractName: string, + artifact: Artifact, + args?: ArgumentType[], + options?: ContractOptions + ): ArtifactContractDeploymentFuture; + public contract( + contractName: ContractNameT, + artifactOrArgs?: Artifact | ArgumentType[], + argsorOptions?: ArgumentType[] | ContractAtOptions, + maybeOptions?: ContractOptions + ): + | NamedContractDeploymentFuture + | ArtifactContractDeploymentFuture { + if (isArtifactType(artifactOrArgs)) { + return this._contractFromArtifact( + contractName, + artifactOrArgs, + argsorOptions as ArgumentType[], // TODO: Validate instead of cast + maybeOptions + ); + } + + const args = artifactOrArgs; + const options = argsorOptions as ContractOptions; // TODO: Validate instead of cast + + return this._namedArtifactContract(contractName, args, options); + } + + private _namedArtifactContract( contractName: ContractNameT, args: ArgumentType[] = [], options: ContractOptions = {} @@ -228,11 +260,11 @@ class IgnitionModuleBuilderImplementation< return future; } - public contractFromArtifact( + private _contractFromArtifact( contractName: string, artifact: Artifact, args: ArgumentType[] = [], - options: ContractFromArtifactOptions = {} + options: ContractOptions = {} ): ArtifactContractDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, @@ -246,10 +278,10 @@ class IgnitionModuleBuilderImplementation< this._assertValidId(options.id, this.contractFromArtifact); this._assertValidContractName(contractName, this.contractFromArtifact); this._assertUniqueArtifactContractId(futureId); - this._assertValidLibraries(options.libraries, this.contractFromArtifact); - this._assertValidValue(options.value, this.contractFromArtifact); - this._assertValidFrom(options.from, this.contractFromArtifact); - this._assertValidArtifact(artifact, this.contractFromArtifact); + this._assertValidLibraries(options.libraries, this.contract); + this._assertValidValue(options.value, this.contract); + this._assertValidFrom(options.from, this.contract); + this._assertValidArtifact(artifact, this.contract); /* validation end */ const future = new ArtifactContractDeploymentFutureImplementation( @@ -283,6 +315,27 @@ class IgnitionModuleBuilderImplementation< } public library( + libraryName: LibraryNameT, + options?: LibraryOptions + ): NamedLibraryDeploymentFuture; + public library( + libraryName: string, + artifact: Artifact, + options?: LibraryOptions + ): ArtifactLibraryDeploymentFuture; + public library( + libraryName: LibraryNameT, + artifactOrOptions?: Artifact | LibraryOptions, + options?: LibraryOptions + ) { + if (isArtifactType(artifactOrOptions)) { + return this._libraryFromArtifact(libraryName, artifactOrOptions, options); + } + + return this._namedArtifactLibrary(libraryName, artifactOrOptions); + } + + private _namedArtifactLibrary( libraryName: LibraryNameT, options: LibraryOptions = {} ): NamedLibraryDeploymentFuture { @@ -323,10 +376,10 @@ class IgnitionModuleBuilderImplementation< return future; } - public libraryFromArtifact( + private _libraryFromArtifact( libraryName: string, artifact: Artifact, - options: LibraryFromArtifactOptions = {} + options: LibraryOptions = {} ): ArtifactLibraryDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, @@ -339,9 +392,9 @@ class IgnitionModuleBuilderImplementation< this._assertValidId(options.id, this.libraryFromArtifact); this._assertValidContractName(libraryName, this.libraryFromArtifact); this._assertUniqueArtifactLibraryId(futureId); - this._assertValidLibraries(options.libraries, this.libraryFromArtifact); - this._assertValidFrom(options.from, this.libraryFromArtifact); - this._assertValidArtifact(artifact, this.libraryFromArtifact); + this._assertValidLibraries(options.libraries, this.library); + this._assertValidFrom(options.from, this.library); + this._assertValidArtifact(artifact, this.library); /* validation end */ const future = new ArtifactLibraryDeploymentFutureImplementation( @@ -464,6 +517,48 @@ class IgnitionModuleBuilderImplementation< } public contractAt( + contractName: ContractNameT, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + options?: ContractAtOptions + ): NamedContractAtFuture; + public contractAt( + contractName: string, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + artifact: Artifact, + options?: ContractAtOptions + ): ArtifactContractAtFuture; + public contractAt( + contractName: ContractNameT, + address: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue, + artifactOrOptions?: Artifact | ContractAtOptions, + options?: ContractAtOptions + ) { + if (isArtifactType(artifactOrOptions)) { + return this._contractAtFromArtifact( + contractName, + address, + artifactOrOptions, + options + ); + } + + return this._namedArtifactContractAt( + contractName, + address, + artifactOrOptions + ); + } + + private _namedArtifactContractAt( contractName: ContractNameT, address: | string @@ -504,7 +599,7 @@ class IgnitionModuleBuilderImplementation< return future; } - public contractAtFromArtifact( + private _contractAtFromArtifact( contractName: string, address: | string @@ -523,8 +618,8 @@ class IgnitionModuleBuilderImplementation< this._assertValidId(options.id, this.contractAtFromArtifact); this._assertValidContractName(contractName, this.contractAt); this._assertUniqueContractAtFromArtifactId(futureId); - this._assertValidAddress(address, this.contractAtFromArtifact); - this._assertValidArtifact(artifact, this.contractAtFromArtifact); + this._assertValidAddress(address, this.contractAt); + this._assertValidArtifact(artifact, this.contractAt); /* validation end */ const future = new ArtifactContractAtFutureImplementation( @@ -773,7 +868,7 @@ class IgnitionModuleBuilderImplementation< return this._assertUniqueFutureId( futureId, `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractFromArtifact("MyContract", artifact, [], { id: "MyId"})\``, - this.contractFromArtifact + this.contract ); } @@ -789,7 +884,7 @@ class IgnitionModuleBuilderImplementation< return this._assertUniqueFutureId( futureId, `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.libraryFromArtifact("MyLibrary", artifact, { id: "MyId"})\``, - this.libraryFromArtifact + this.library ); } @@ -821,7 +916,7 @@ class IgnitionModuleBuilderImplementation< return this._assertUniqueFutureId( futureId, `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAtFromArtifact("MyContract", "0x123...", { id: "MyId"})\``, - this.contractAtFromArtifact + this.contractAt ); } diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index a07178532e..ee3d647d1c 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -23,7 +23,7 @@ import { } from "./module"; /** - * The options for a `ContractOptions` call. + * The options for a `contract` call. * * @beta */ @@ -35,19 +35,6 @@ export interface ContractOptions { from?: string | AccountRuntimeValue; } -/** - * The options for a `contractFromArtifact` call. - * - * @beta - */ -export interface ContractFromArtifactOptions { - id?: string; - after?: Future[]; - libraries?: Record>; - value?: bigint | ModuleParameterRuntimeValue; - from?: string | AccountRuntimeValue; -} - /** * The options for a `library` call. * @@ -60,18 +47,6 @@ export interface LibraryOptions { from?: string | AccountRuntimeValue; } -/** - * The options for a `libraryFromArtifact` call. - * - * @beta - */ -export interface LibraryFromArtifactOptions { - id?: string; - after?: Future[]; - libraries?: Record>; - from?: string | AccountRuntimeValue; -} - /** * The options for a `call` call. * @@ -158,11 +133,11 @@ export interface IgnitionModuleBuilder { options?: ContractOptions ): NamedContractDeploymentFuture; - contractFromArtifact( + contract( contractName: string, artifact: Artifact, args?: ArgumentType[], - options?: ContractFromArtifactOptions + options?: ContractOptions ): ArtifactContractDeploymentFuture; library( @@ -170,10 +145,10 @@ export interface IgnitionModuleBuilder { options?: LibraryOptions ): NamedLibraryDeploymentFuture; - libraryFromArtifact( + library( libraryName: string, artifact: Artifact, - options?: LibraryFromArtifactOptions + options?: LibraryOptions ): ArtifactLibraryDeploymentFuture; call( @@ -200,7 +175,7 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): NamedContractAtFuture; - contractAtFromArtifact( + contractAt( contractName: string, address: | string From 808c2b752c74bc8f7c935938f15370f4e2a46e4f Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 12 Sep 2023 22:18:20 +0000 Subject: [PATCH 0935/1302] Update all ocurrences --- docs/creating-modules-for-deployment.md | 6 +- examples/complete/ignition/CompleteModule.js | 15 +- examples/uniswap/ignition/Uniswap.js | 33 ++-- packages/core/src/internal/module-builder.ts | 6 +- packages/core/test/call.ts | 22 +-- packages/core/test/contractAtFromArtifact.ts | 57 +++---- packages/core/test/contractFromArtifact.ts | 150 ++++++------------ packages/core/test/libraryFromArtifact.ts | 68 +++----- packages/core/test/readEventArgument.ts | 6 +- .../futures/reconcileArtifactContractAt.ts | 12 +- .../reconcileArtifactContractDeployment.ts | 32 ++-- .../reconcileArtifactLibraryDeployment.ts | 8 +- packages/core/test/staticCall.ts | 12 +- .../core/test/stored-deployment-serializer.ts | 75 +++------ packages/hardhat-plugin/test/contracts.ts | 4 +- packages/hardhat-plugin/test/events.ts | 2 +- .../deploy-contract-at-from-artifact.ts | 2 +- .../deploy-contract-from-artifact.ts | 2 +- .../hardhat-plugin/test/existing-contract.ts | 4 +- packages/hardhat-plugin/test/libraries.ts | 2 +- packages/hardhat-plugin/test/static-calls.ts | 4 +- packages/ui/test/to-mermaid.ts | 23 +-- 22 files changed, 191 insertions(+), 354 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 59a823ed22..6005f368e6 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -92,13 +92,13 @@ const b = m.contract("B", [], { ### Deploying from an artifact -To allow you to use your own mechanism for getting the contract artifact, `contractFromArtifact` supports passing an `Artifact` as the second parameter: +To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as the second parameter: ```javascript const artifact = hre.artifacts.readArtifactSync("Foo"); const userModule = buildModule("MyModule", (m) => { - m.contractFromArtifact("Foo", artifact, [0]); + m.contract("Foo", artifact, [0]); }); ``` @@ -107,7 +107,7 @@ const userModule = buildModule("MyModule", (m) => { A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and artifact: ```tsx -const uniswap = m.contractAtFromArtifact("UniswapRouter", "0x0...", artifact); +const uniswap = m.contractAt("UniswapRouter", "0x0...", artifact); m.call(uniswap, "swap", [ /*...*/ diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index d890783f32..97270eb89b 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -7,17 +7,12 @@ const libArtifact = require("../libArtifacts/BasicLibrary.json"); module.exports = buildModule("CompleteModule", (m) => { const basic = m.contract("BasicContract"); const library = m.library("BasicLibrary"); - const libFromArtifact = m.libraryFromArtifact("BasicLibrary", libArtifact, { + const libFromArtifact = m.library("BasicLibrary", libArtifact, { id: "BasicLibrary2", }); - const withLib = m.contractFromArtifact( - "ContractWithLibrary", - withLibArtifact, - [], - { - libraries: { BasicLibrary: library }, - } - ); + const withLib = m.contract("ContractWithLibrary", withLibArtifact, [], { + libraries: { BasicLibrary: library }, + }); const call = m.call(basic, "basicFunction", [40]); const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); @@ -26,7 +21,7 @@ module.exports = buildModule("CompleteModule", (m) => { const duplicate = m.contractAt("BasicContract", basic, { id: "BasicContract2", }); - const duplicateWithLib = m.contractAtFromArtifact( + const duplicateWithLib = m.contractAt( "ContractWithLibrary", withLib, withLibArtifact, diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js index 04b35f8e28..d97c15fef7 100644 --- a/examples/uniswap/ignition/Uniswap.js +++ b/examples/uniswap/ignition/Uniswap.js @@ -49,10 +49,7 @@ module.exports = buildModule("Uniswap", (m) => { const weth9 = m.contract("WETH9"); // DEPLOY_V3_CORE_FACTORY - const uniswapV3Factory = m.contractFromArtifact( - "UniswapV3Factory", - UniswapV3Factory - ); + const uniswapV3Factory = m.contract("UniswapV3Factory", UniswapV3Factory); // 1 - add-1bp-fee-tier m.call(uniswapV3Factory, "enableFeeAmount", [ @@ -61,22 +58,19 @@ module.exports = buildModule("Uniswap", (m) => { ]); // 2 - deploy-multicall2 - const multicall2Address = m.contractFromArtifact( - "Multicall2", - UniswapInterfaceMulticall - ); + const multicall2Address = m.contract("Multicall2", UniswapInterfaceMulticall); // DEPLOY_PROXY_ADMIN - const proxyAdmin = m.contractFromArtifact("ProxyAdmin", ProxyAdmin); + const proxyAdmin = m.contract("ProxyAdmin", ProxyAdmin); // DEPLOY_TICK_LENS - const tickLens = m.contractFromArtifact("TickLens", TickLens); + const tickLens = m.contract("TickLens", TickLens); // DEPLOY_NFT_DESCRIPTOR_LIBRARY_V1_3_0 - const nftDescriptor = m.contractFromArtifact("NFTDescriptor", NFTDescriptor); + const nftDescriptor = m.contract("NFTDescriptor", NFTDescriptor); // DEPLOY_NFT_POSITION_DESCRIPTOR_V1_3_0 - const nonfungibleTokenPositionDescriptor = m.contractFromArtifact( + const nonfungibleTokenPositionDescriptor = m.contract( "nonfungibleTokenPositionDescriptorAddressV1_3_0", NonfungibleTokenPositionDescriptor, [weth9, asciiStringToBytes32(NATIVE_CURRENCY_LABEL)], @@ -88,21 +82,21 @@ module.exports = buildModule("Uniswap", (m) => { ); // DEPLOY_TRANSPARENT_PROXY_DESCRIPTOR - const descriptorProxy = m.contractFromArtifact( + const descriptorProxy = m.contract( "TransparentUpgradeableProxy", TransparentUpgradeableProxy, [nonfungibleTokenPositionDescriptor, proxyAdmin, "0x"] ); // DEPLOY_NONFUNGIBLE_POSITION_MANAGER - const nonfungibleTokenPositionManager = m.contractFromArtifact( + const nonfungibleTokenPositionManager = m.contract( "NonfungibleTokenPositionManager", NonfungiblePositionManager, [uniswapV3Factory, weth9, descriptorProxy] ); // DEPLOY_V3_MIGRATOR - const v3Migrator = m.contractFromArtifact("V3Migrator", V3Migrator, [ + const v3Migrator = m.contract("V3Migrator", V3Migrator, [ uniswapV3Factory, weth9, nonfungibleTokenPositionManager, @@ -114,7 +108,7 @@ module.exports = buildModule("Uniswap", (m) => { }); // DEPLOY_V3_STAKER - const v3Staker = m.contractFromArtifact("UniswapV3Staker", UniswapV3Staker, [ + const v3Staker = m.contract("UniswapV3Staker", UniswapV3Staker, [ uniswapV3Factory, nonfungibleTokenPositionManager, MAX_INCENTIVE_START_LEAD_TIME, @@ -122,13 +116,10 @@ module.exports = buildModule("Uniswap", (m) => { ]); // DEPLOY_QUOTER_V2 - const quoterV2 = m.contractFromArtifact("QuoterV2", QuoterV2, [ - uniswapV3Factory, - weth9, - ]); + const quoterV2 = m.contract("QuoterV2", QuoterV2, [uniswapV3Factory, weth9]); // DEPLOY_V3_SWAP_ROUTER_02 - const swapRouter02 = m.contractFromArtifact("SwapRouter02", SwapRouter02, [ + const swapRouter02 = m.contract("SwapRouter02", SwapRouter02, [ v2CoreFactoryAddress, uniswapV3Factory, nonfungibleTokenPositionManager, diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index dc64ee8c8a..9b3b129858 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -867,7 +867,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactContractId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractFromArtifact("MyContract", artifact, [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contract("MyContract", artifact, [], { id: "MyId"})\``, this.contract ); } @@ -883,7 +883,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactLibraryId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.libraryFromArtifact("MyLibrary", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.library("MyLibrary", artifact, { id: "MyId"})\``, this.library ); } @@ -915,7 +915,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueContractAtFromArtifactId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAtFromArtifact("MyContract", "0x123...", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", { id: "MyId"})\``, this.contractAt ); } diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index aa5e6f522d..df3e086aaa 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -522,7 +522,7 @@ describe("call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test"); return { another }; @@ -561,7 +561,7 @@ describe("call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "inc", [1, 2]); return { another }; @@ -618,7 +618,7 @@ describe("call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "inc(bool,uint256)", [1, 2, 3]); return { another }; @@ -658,7 +658,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [p]); return { another }; @@ -690,7 +690,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [], { value: p }); return { another }; @@ -730,7 +730,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 42n); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [], { value: p }); return { another }; @@ -775,7 +775,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", true); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [p]); return { another }; @@ -806,7 +806,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [ [123, { really: { deeply: { nested: [p] } } }], ]); @@ -854,7 +854,7 @@ describe("call", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", true); - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.call(another, "test", [ [123, { really: { deeply: { nested: [p] } } }], ]); @@ -899,7 +899,7 @@ describe("call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); const account = m.getAccount(-1); m.call(another, "inc", [1], { from: account }); @@ -944,7 +944,7 @@ describe("call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); const account = m.getAccount(1); m.call(another, "inc", [1], { from: account }); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 156b68c530..c9029be14c 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -18,11 +18,7 @@ describe("contractAtFromArtifact", () => { it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractAtFromArtifact( - "Contract1", - "0xtest", - fakeArtifact - ); + const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); return { contract1 }; }); @@ -52,14 +48,9 @@ describe("contractAtFromArtifact", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractAtFromArtifact( - "Another", - "0xtest", - fakeArtifact, - { - after: [example], - } - ); + const another = m.contractAt("Another", "0xtest", fakeArtifact, { + after: [example], + }); return { example, another }; }); @@ -78,7 +69,7 @@ describe("contractAtFromArtifact", () => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); - const another = m.contractAtFromArtifact("Another", call, fakeArtifact); + const another = m.contractAt("Another", call, fakeArtifact); return { example, another }; }); @@ -100,12 +91,8 @@ describe("contractAtFromArtifact", () => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); const paramWithoutDefault = m.getParameter("addressWithoutDefault"); - const withDefault = m.contractAtFromArtifact( - "C", - paramWithDefault, - fakeArtifact - ); - const withoutDefault = m.contractAtFromArtifact( + const withDefault = m.contractAt("C", paramWithDefault, fakeArtifact); + const withoutDefault = m.contractAt( "C2", paramWithoutDefault, fakeArtifact @@ -135,13 +122,13 @@ describe("contractAtFromArtifact", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractAtFromArtifact( + const sameContract1 = m.contractAt( "SameContract", "0x123", fakeArtifact, { id: "first" } ); - const sameContract2 = m.contractAtFromArtifact( + const sameContract2 = m.contractAt( "SameContract", "0x123", fakeArtifact, @@ -168,12 +155,12 @@ describe("contractAtFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractAtFromArtifact( + const sameContract1 = m.contractAt( "SameContract", "0x123", fakeArtifact ); - const sameContract2 = m.contractAtFromArtifact( + const sameContract2 = m.contractAt( "SameContract", "0x123", fakeArtifact @@ -189,7 +176,7 @@ describe("contractAtFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractAtFromArtifact( + const sameContract1 = m.contractAt( "SameContract", "0x123", fakeArtifact, @@ -197,7 +184,7 @@ describe("contractAtFromArtifact", () => { id: "same", } ); - const sameContract2 = m.contractAtFromArtifact( + const sameContract2 = m.contractAt( "SameContract", "0x123", fakeArtifact, @@ -219,11 +206,7 @@ describe("contractAtFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractAtFromArtifact( - "Another", - 42 as any, - fakeArtifact - ); + const another = m.contractAt("Another", 42 as any, fakeArtifact); return { another }; }), @@ -235,11 +218,7 @@ describe("contractAtFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractAtFromArtifact( - "Another", - "", - {} as Artifact - ); + const another = m.contractAt("Another", "", {} as Artifact); return { another }; }), @@ -263,7 +242,7 @@ describe("contractAtFromArtifact", () => { it("should not validate a missing module parameter", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + const another = m.contractAt("Another", p, fakeArtifact); return { another }; }); @@ -288,7 +267,7 @@ describe("contractAtFromArtifact", () => { it("should validate a missing module parameter if a default parameter is present", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", "0x1234"); - const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + const another = m.contractAt("Another", p, fakeArtifact); return { another }; }); @@ -312,7 +291,7 @@ describe("contractAtFromArtifact", () => { it("should not validate a module parameter of the wrong type", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 123 as unknown as string); - const another = m.contractAtFromArtifact("Another", p, fakeArtifact); + const another = m.contractAt("Another", p, fakeArtifact); return { another }; }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index c7c7a2889d..c4fbf2c3ab 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -22,7 +22,7 @@ describe("contractFromArtifact", () => { it("should be able to deploy with a contract based on an artifact", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + const contract1 = m.contract("Contract1", fakeArtifact, [ 1, "a", BigInt("9007199254740991"), @@ -56,9 +56,7 @@ describe("contractFromArtifact", () => { it("should be able to pass an arg dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [ - example, - ]); + const another = m.contract("Another", fakeArtifact, [example]); return { example, another }; }); @@ -75,7 +73,7 @@ describe("contractFromArtifact", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { after: [example], }); @@ -94,7 +92,7 @@ describe("contractFromArtifact", () => { it("should be able to pass a library as a dependency of a contract", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.library("Example"); - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { libraries: { Example: example }, }); @@ -124,7 +122,7 @@ describe("contractFromArtifact", () => { it("should be able to pass value as an option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { value: BigInt(42), }); @@ -148,7 +146,7 @@ describe("contractFromArtifact", () => { it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { value: m.getParameter("value"), }); @@ -175,7 +173,7 @@ describe("contractFromArtifact", () => { it("should be able to pass a string as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { from: "0x2", }); @@ -199,7 +197,7 @@ describe("contractFromArtifact", () => { it("Should be able to pass an AccountRuntimeValue as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, [], { + const another = m.contract("Another", fakeArtifact, [], { from: m.getAccount(1), }); @@ -225,7 +223,7 @@ describe("contractFromArtifact", () => { describe("Arguments", () => { it("Should support base values as arguments", () => { const module = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + const contract1 = m.contract("Contract1", fakeArtifact, [ 1, true, "string", @@ -245,9 +243,7 @@ describe("contractFromArtifact", () => { it("Should support arrays as arguments", () => { const module = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - [1, 2, 3n], - ]); + const contract1 = m.contract("Contract1", fakeArtifact, [[1, 2, 3n]]); return { contract1 }; }); @@ -257,7 +253,7 @@ describe("contractFromArtifact", () => { it("Should support objects as arguments", () => { const module = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + const contract1 = m.contract("Contract1", fakeArtifact, [ { a: 1, b: [1, 2] }, ]); @@ -273,9 +269,7 @@ describe("contractFromArtifact", () => { it("Should support futures as arguments", () => { const module = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); - const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ - contract1, - ]); + const contract2 = m.contract("Contract2", fakeArtifact, [contract1]); return { contract1, contract2 }; }); @@ -289,7 +283,7 @@ describe("contractFromArtifact", () => { it("should support nested futures as arguments", () => { const module = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); - const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ + const contract2 = m.contract("Contract2", fakeArtifact, [ { arr: [contract1] }, ]); @@ -305,9 +299,7 @@ describe("contractFromArtifact", () => { it("should support AccountRuntimeValues as arguments", () => { const module = buildModule("Module", (m) => { const account1 = m.getAccount(1); - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - account1, - ]); + const contract1 = m.contract("Contract1", fakeArtifact, [account1]); return { contract1 }; }); @@ -322,7 +314,7 @@ describe("contractFromArtifact", () => { it("should support nested AccountRuntimeValues as arguments", () => { const module = buildModule("Module", (m) => { const account1 = m.getAccount(1); - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ + const contract1 = m.contract("Contract1", fakeArtifact, [ { arr: [account1] }, ]); @@ -340,9 +332,7 @@ describe("contractFromArtifact", () => { it("should support ModuleParameterRuntimeValue as arguments", () => { const module = buildModule("Module", (m) => { const p = m.getParameter("p", 123); - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - p, - ]); + const contract1 = m.contract("Contract1", fakeArtifact, [p]); return { contract1 }; }); @@ -361,9 +351,7 @@ describe("contractFromArtifact", () => { it("should support nested ModuleParameterRuntimeValue as arguments", () => { const module = buildModule("Module", (m) => { const p = m.getParameter("p", 123); - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, [ - { arr: [p] }, - ]); + const contract1 = m.contract("Contract1", fakeArtifact, [{ arr: [p] }]); return { contract1 }; }); @@ -378,20 +366,12 @@ describe("contractFromArtifact", () => { describe("passing id", () => { it("should use contract from artifact twice by passing an id", () => { const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { id: "first" } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "second", - } - ); + const sameContract1 = m.contract("SameContract", fakeArtifact, [], { + id: "first", + }); + const sameContract2 = m.contract("SameContract", fakeArtifact, [], { + id: "second", + }); return { sameContract1, sameContract2 }; }); @@ -412,14 +392,8 @@ describe("contractFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact - ); + const sameContract1 = m.contract("SameContract", fakeArtifact); + const sameContract2 = m.contract("SameContract", fakeArtifact); return { sameContract1, sameContract2 }; }), @@ -431,22 +405,12 @@ describe("contractFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); - const sameContract2 = m.contractFromArtifact( - "SameContract", - fakeArtifact, - [], - { - id: "same", - } - ); + const sameContract1 = m.contract("SameContract", fakeArtifact, [], { + id: "same", + }); + const sameContract2 = m.contract("SameContract", fakeArtifact, [], { + id: "same", + }); return { sameContract1, sameContract2 }; }), @@ -461,14 +425,9 @@ describe("contractFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractFromArtifact( - "Another", - fakeArtifact, - [], - { - value: 42 as any, - } - ); + const another = m.contract("Another", fakeArtifact, [], { + value: 42 as any, + }); return { another }; }), @@ -480,14 +439,9 @@ describe("contractFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractFromArtifact( - "Another", - fakeArtifact, - [], - { - from: 1 as any, - } - ); + const another = m.contract("Another", fakeArtifact, [], { + from: 1 as any, + }); return { another }; }), @@ -502,7 +456,7 @@ describe("contractFromArtifact", () => { const another = m.contract("Another", []); const call = m.call(another, "test"); - const test = m.contractFromArtifact("Test", fakeArtifact, [], { + const test = m.contract("Test", fakeArtifact, [], { libraries: { Call: call as any }, }); @@ -516,11 +470,7 @@ describe("contractFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractFromArtifact( - "Another", - {} as Artifact, - [] - ); + const another = m.contract("Another", {} as Artifact, []); return { another }; }), @@ -544,11 +494,7 @@ describe("contractFromArtifact", () => { it("should not validate an incorrect number of constructor args", async () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact( - "Test", - fakeArtifact, - [1, 2, 3] - ); + const contract1 = m.contract("Test", fakeArtifact, [1, 2, 3]); return { contract1 }; }); @@ -581,7 +527,7 @@ describe("contractFromArtifact", () => { it("should not validate a missing module parameter", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const contract1 = m.contractFromArtifact("Test", fakeArtifact, [p]); + const contract1 = m.contract("Test", fakeArtifact, [p]); return { contract1 }; }); @@ -623,7 +569,7 @@ describe("contractFromArtifact", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 123); - const contract1 = m.contractFromArtifact("Test", fakerArtifact, [p]); + const contract1 = m.contract("Test", fakerArtifact, [p]); return { contract1 }; }); @@ -658,7 +604,7 @@ describe("contractFromArtifact", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); - const contract1 = m.contractFromArtifact("Test", fakerArtifact, [], { + const contract1 = m.contract("Test", fakerArtifact, [], { value: p, }); @@ -696,7 +642,7 @@ describe("contractFromArtifact", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 42n); - const contract1 = m.contractFromArtifact("Test", fakerArtifact, [], { + const contract1 = m.contract("Test", fakerArtifact, [], { value: p, }); @@ -720,7 +666,7 @@ describe("contractFromArtifact", () => { it("should not validate a missing module parameter (deeply nested)", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const contract1 = m.contractFromArtifact("Test", fakeArtifact, [ + const contract1 = m.contract("Test", fakeArtifact, [ [123, { really: { deeply: { nested: [p] } } }], ]); @@ -764,7 +710,7 @@ describe("contractFromArtifact", () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 123); - const contract1 = m.contractFromArtifact("Test", fakerArtifact, [ + const contract1 = m.contract("Test", fakerArtifact, [ [123, { really: { deeply: { nested: [p] } } }], ]); @@ -788,7 +734,7 @@ describe("contractFromArtifact", () => { it("should not validate a negative account index", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); - const contract1 = m.contractFromArtifact("Test", fakeArtifact, [], { + const contract1 = m.contract("Test", fakeArtifact, [], { from: account, }); @@ -811,7 +757,7 @@ describe("contractFromArtifact", () => { it("should not validate an account index greater than the number of available accounts", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(1); - const contract1 = m.contractFromArtifact("Test", fakeArtifact, [], { + const contract1 = m.contract("Test", fakeArtifact, [], { from: account, }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 5a1d2a3779..ef518923fb 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -21,7 +21,7 @@ describe("libraryFromArtifact", () => { it("should be able to deploy with a library based on an artifact", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const library1 = m.libraryFromArtifact("Library1", fakeArtifact); + const library1 = m.library("Library1", fakeArtifact); return { library1 }; }); @@ -45,7 +45,7 @@ describe("libraryFromArtifact", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.library("Example"); - const another = m.libraryFromArtifact("Another", fakeArtifact, { + const another = m.library("Another", fakeArtifact, { after: [example], }); @@ -64,7 +64,7 @@ describe("libraryFromArtifact", () => { it("should be able to pass a library as a dependency of a library", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.library("Example"); - const another = m.libraryFromArtifact("Another", fakeArtifact, { + const another = m.library("Another", fakeArtifact, { libraries: { Example: example }, }); @@ -94,7 +94,7 @@ describe("libraryFromArtifact", () => { it("should be able to pass a string as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.libraryFromArtifact("Another", fakeArtifact, { + const another = m.library("Another", fakeArtifact, { from: "0x2", }); @@ -118,7 +118,7 @@ describe("libraryFromArtifact", () => { it("Should be able to pass an AccountRuntimeValue as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - const another = m.libraryFromArtifact("Another", fakeArtifact, { + const another = m.library("Another", fakeArtifact, { from: m.getAccount(1), }); @@ -144,18 +144,12 @@ describe("libraryFromArtifact", () => { describe("passing id", () => { it("should use library from artifact twice by passing an id", () => { const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { id: "first" } - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "second", - } - ); + const sameContract1 = m.library("SameContract", fakeArtifact, { + id: "first", + }); + const sameContract2 = m.library("SameContract", fakeArtifact, { + id: "second", + }); return { sameContract1, sameContract2 }; }); @@ -176,14 +170,8 @@ describe("libraryFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact - ); + const sameContract1 = m.library("SameContract", fakeArtifact); + const sameContract2 = m.library("SameContract", fakeArtifact); return { sameContract1, sameContract2 }; }), @@ -195,20 +183,12 @@ describe("libraryFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "same", - } - ); - const sameContract2 = m.libraryFromArtifact( - "SameContract", - fakeArtifact, - { - id: "same", - } - ); + const sameContract1 = m.library("SameContract", fakeArtifact, { + id: "same", + }); + const sameContract2 = m.library("SameContract", fakeArtifact, { + id: "same", + }); return { sameContract1, sameContract2 }; }), @@ -223,7 +203,7 @@ describe("libraryFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.libraryFromArtifact("Another", fakeArtifact, { + const another = m.library("Another", fakeArtifact, { from: 1 as any, }); @@ -240,7 +220,7 @@ describe("libraryFromArtifact", () => { const another = m.contract("Another", []); const call = m.call(another, "test"); - const test = m.libraryFromArtifact("Test", fakeArtifact, { + const test = m.library("Test", fakeArtifact, { libraries: { Call: call as any }, }); @@ -254,7 +234,7 @@ describe("libraryFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.libraryFromArtifact("Another", {} as Artifact); + const another = m.library("Another", {} as Artifact); return { another }; }), @@ -279,7 +259,7 @@ describe("libraryFromArtifact", () => { it("should not validate a negative account index", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); - const test = m.libraryFromArtifact("Test", fakeArtifact, { + const test = m.library("Test", fakeArtifact, { from: account, }); @@ -302,7 +282,7 @@ describe("libraryFromArtifact", () => { it("should not validate an account index greater than the number of available accounts", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(1); - const test = m.libraryFromArtifact("Test", fakeArtifact, { + const test = m.library("Test", fakeArtifact, { from: account, }); diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 8c361e0f29..2d21548293 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -19,7 +19,7 @@ describe("Read event argument", () => { const mod = buildModule("Module1", (m) => { const contract = m.contract("Contract"); - const contractFromArtifact = m.contractFromArtifact( + const contractFromArtifact = m.contract( "ContractFromArtifact", fakeArtifact ); @@ -41,7 +41,7 @@ describe("Read event argument", () => { ) as ReadEventArgumentFuture[]; assert.equal(read1.futureToReadFrom, mod.results.contract); - assert.equal(read2.futureToReadFrom, mod.results.contractFromArtifact); + assert.equal(read2.futureToReadFrom, mod.results.contract); assert.equal(read3.futureToReadFrom, callFuture); }); @@ -263,7 +263,7 @@ describe("Read event argument", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.readEventArgument(another, "test", "arg"); return { another }; diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts index fd99905d11..96e60eda69 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts @@ -69,11 +69,7 @@ describe("Reconciliation - artifact contract at", () => { it("should reconcile when using an address string", async () => { const submoduleDefinition = buildModule("Submodule", (m) => { - const contract1 = m.contractAtFromArtifact( - "Contract1", - exampleAddress, - mockArtifact - ); + const contract1 = m.contractAt("Contract1", exampleAddress, mockArtifact); return { contract1 }; }); @@ -101,7 +97,7 @@ describe("Reconciliation - artifact contract at", () => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); - const another = m.contractAtFromArtifact("Another", call, mockArtifact); + const another = m.contractAt("Another", call, mockArtifact); return { another }; }); @@ -145,7 +141,7 @@ describe("Reconciliation - artifact contract at", () => { it("should find changes to contract name unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contractAtFromArtifact( + const contract1 = m.contractAt( "ContractChanged", exampleAddress, mockArtifact, @@ -181,7 +177,7 @@ describe("Reconciliation - artifact contract at", () => { it("should find changes to contract address as a literal unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contractAtFromArtifact( + const contract1 = m.contractAt( "Contract1", exampleAddress, mockArtifact, diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts index fe868d8639..d8fe8ce391 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -42,16 +42,11 @@ describe("Reconciliation - artifact contract", () => { const supply = m.getParameter("supply", BigInt(1000)); const safeMath = m.library("SafeMath"); - const contract1 = m.contractFromArtifact( - "Contract1", - mockArtifact, - [{ supply }], - { - libraries: { - SafeMath: safeMath, - }, - } - ); + const contract1 = m.contract("Contract1", mockArtifact, [{ supply }], { + libraries: { + SafeMath: safeMath, + }, + }); return { contract1 }; }); @@ -92,12 +87,9 @@ describe("Reconciliation - artifact contract", () => { it("should find changes to contract name unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact( - "ContractChanged", - mockArtifact, - [], - { id: "Example" } - ); + const contract1 = m.contract("ContractChanged", mockArtifact, [], { + id: "Example", + }); return { contract1 }; }); @@ -128,7 +120,7 @@ describe("Reconciliation - artifact contract", () => { const supply = m.getParameter("supply", BigInt(500)); const ticker = m.getParameter("ticker", "CodeCoin"); - const contract1 = m.contractFromArtifact("Contract1", mockArtifact, [ + const contract1 = m.contract("Contract1", mockArtifact, [ owner, { nested: { supply } }, [1, ticker, 3], @@ -164,7 +156,7 @@ describe("Reconciliation - artifact contract", () => { const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); - const contract1 = m.contractFromArtifact("Contract1", mockArtifact, [], { + const contract1 = m.contract("Contract1", mockArtifact, [], { libraries: { SafeMath: safeMath, }, @@ -207,7 +199,7 @@ describe("Reconciliation - artifact contract", () => { it("should find changes to value unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact("Contract1", mockArtifact, [], { + const contract1 = m.contract("Contract1", mockArtifact, [], { id: "Example", value: BigInt(4), }); @@ -236,7 +228,7 @@ describe("Reconciliation - artifact contract", () => { it("should find changes to from unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contractFromArtifact("Contract1", mockArtifact, [], { + const contract1 = m.contract("Contract1", mockArtifact, [], { id: "Example", from: twoAddress, }); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 4c22d6a3cc..97ad349f43 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -41,7 +41,7 @@ describe("Reconciliation - artifact library", () => { const submoduleDefinition = buildModule("Submodule", (m) => { const safeMath = m.library("SafeMath"); - const mainLib = m.libraryFromArtifact("MainLibrary", mockArtifact, { + const mainLib = m.library("MainLibrary", mockArtifact, { libraries: { SafeMath: safeMath }, }); @@ -84,7 +84,7 @@ describe("Reconciliation - artifact library", () => { it("should find changes to contract name unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const library1 = m.libraryFromArtifact("LibraryChanged", mockArtifact, { + const library1 = m.library("LibraryChanged", mockArtifact, { id: "Example", }); @@ -115,7 +115,7 @@ describe("Reconciliation - artifact library", () => { const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); - const mainLib = m.libraryFromArtifact("MainLibrary", mockArtifact, { + const mainLib = m.library("MainLibrary", mockArtifact, { libraries: { Changed: safeMath }, }); @@ -159,7 +159,7 @@ describe("Reconciliation - artifact library", () => { it("should find changes to contract name unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { - const library1 = m.libraryFromArtifact("Library1", mockArtifact, { + const library1 = m.library("Library1", mockArtifact, { id: "Example", from: twoAddress, }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index c760d5d462..5de75ff052 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -537,7 +537,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "test"); return { another }; @@ -576,7 +576,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "inc", [1, 2]); return { another }; @@ -633,7 +633,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "inc(bool,uint256)", [1, 2, 3]); return { another }; @@ -672,7 +672,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "inc", [1]); return { another }; @@ -956,7 +956,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); const account = m.getAccount(-1); m.staticCall(another, "inc", [1], 0, { from: account }); @@ -1001,7 +1001,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); const account = m.getAccount(1); m.staticCall(another, "inc", [1], 0, { from: account }); diff --git a/packages/core/test/stored-deployment-serializer.ts b/packages/core/test/stored-deployment-serializer.ts index 98d1fe941d..726d5d203e 100644 --- a/packages/core/test/stored-deployment-serializer.ts +++ b/packages/core/test/stored-deployment-serializer.ts @@ -80,7 +80,7 @@ describe("stored deployment serializer", () => { it("should serialize a contractFromArtifact deployment", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); + const contract1 = m.contract("Contract1", fakeArtifact, []); return { contract1 }; }); @@ -93,18 +93,13 @@ describe("stored deployment serializer", () => { it("should serialize a contractFromArtifact deployment with dependency", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractFromArtifact("Contract1", fakeArtifact, []); + const contract1 = m.contract("Contract1", fakeArtifact, []); - const contract2 = m.contractFromArtifact("Contract2", fakeArtifact, [ - contract1, - ]); + const contract2 = m.contract("Contract2", fakeArtifact, [contract1]); - const contract3 = m.contractFromArtifact( - "Contract3", - fakeArtifact, - [], - { after: [contract2] } - ); + const contract3 = m.contract("Contract3", fakeArtifact, [], { + after: [contract2], + }); return { contract1, contract2, contract3 }; }); @@ -172,11 +167,7 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAtFromArtifact( - "Contract1", - "0x0", - fakeArtifact - ); + const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); return { contract1 }; }); @@ -189,17 +180,9 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with a future address", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAtFromArtifact( - "Contract1", - "0x0", - fakeArtifact - ); + const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); const call = m.staticCall(contract1, "getAddress"); - const contract2 = m.contractAtFromArtifact( - "Contract2", - call, - fakeArtifact - ); + const contract2 = m.contractAt("Contract2", call, fakeArtifact); return { contract1, contract2 }; }); @@ -212,19 +195,10 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with dependency", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAtFromArtifact( - "Contract1", - "0x0", - fakeArtifact - ); - const contract2 = m.contractAtFromArtifact( - "Contract2", - "0x0", - fakeArtifact, - { - after: [contract1], - } - ); + const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + const contract2 = m.contractAt("Contract2", "0x0", fakeArtifact, { + after: [contract1], + }); return { contract1, contract2 }; }); @@ -284,22 +258,17 @@ describe("stored deployment serializer", () => { }, }); - const contract3 = m.contractFromArtifact( - "Contract3", - fakeArtifact, - [], - { - libraries: { - Lib1: library1, - }, - } - ); + const contract3 = m.contract("Contract3", fakeArtifact, [], { + libraries: { + Lib1: library1, + }, + }); const library4 = m.library("Library4", { libraries: { Lib1: library1 }, }); - const library5 = m.libraryFromArtifact("Library5", fakeArtifact, { + const library5 = m.library("Library5", fakeArtifact, { libraries: { Lib1: library1 }, }); @@ -329,7 +298,7 @@ describe("stored deployment serializer", () => { it("should serialize a libraryFromArtifact deployment", () => { const module = buildModule("Module1", (m) => { - const library1 = m.libraryFromArtifact("Contract1", fakeArtifact); + const library1 = m.library("Contract1", fakeArtifact); return { library1 }; }); @@ -342,9 +311,9 @@ describe("stored deployment serializer", () => { it("should serialize a libraryFromArtifact deployment with dependency", () => { const module = buildModule("Module1", (m) => { - const library1 = m.libraryFromArtifact("Library1", fakeArtifact); + const library1 = m.library("Library1", fakeArtifact); - const library2 = m.libraryFromArtifact("Library2", fakeArtifact, { + const library2 = m.library("Library2", fakeArtifact, { after: [library1], }); diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 2eb771252a..30a3a0e7f9 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -76,9 +76,7 @@ describe("contract deploys", () => { const artifact = await this.hre.artifacts.readArtifact("Greeter"); const moduleDefinition = buildModule("ArtifactModule", (m) => { - const greeter = m.contractFromArtifact("Greeter", artifact, [ - "Hello World", - ]); + const greeter = m.contract("Greeter", artifact, ["Hello World"]); return { greeter }; }); diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/events.ts index 6807dad3f6..167f00ed81 100644 --- a/packages/hardhat-plugin/test/events.ts +++ b/packages/hardhat-plugin/test/events.ts @@ -48,7 +48,7 @@ describe("events", () => { "fooAddress" ); - const foo = m.contractAtFromArtifact("Foo", newAddress, artifact); + const foo = m.contractAt("Foo", newAddress, artifact); return { fooFactory, foo }; }); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts index 7c66a8108b..4b162ccbce 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts @@ -38,7 +38,7 @@ describe.skip("execution - deploy contractAt from artifact", function () { const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); const contractAtModuleDefinition = buildModule("FooModule", (m) => { - const atFoo = m.contractAtFromArtifact("AtFoo", fooAddress, fooArtifact); + const atFoo = m.contractAt("AtFoo", fooAddress, fooArtifact); return { atFoo }; }); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts index 4a0fc8cc86..2fdea59935 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts @@ -17,7 +17,7 @@ describe("execution - deploy contract from artifact", function () { const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contractFromArtifact("Foo", fooArtifact); + const foo = m.contract("Foo", fooArtifact); return { foo }; }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index 4fcf57fb73..c29eed706d 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -31,8 +31,8 @@ describe("existing contract", () => { await firstResult.usesContract.getAddress(); const secondModuleDefinition = buildModule("SecondModule", (m) => { - const bar = m.contractAtFromArtifact("Bar", barAddress, barArtifact); - const usesContract = m.contractAtFromArtifact( + const bar = m.contractAt("Bar", barAddress, barArtifact); + const usesContract = m.contractAt( "UsesContract", usesContractAddress, usesContractArtifact diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index fd6404bd71..6da51a08c8 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -41,7 +41,7 @@ describe("libraries", () => { ); const moduleDefinition = buildModule("ArtifactLibraryModule", (m) => { - const rubbishMath = m.libraryFromArtifact("RubbishMath", libraryArtifact); + const rubbishMath = m.library("RubbishMath", libraryArtifact); const dependsOnLib = m.contract("DependsOnLib", [], { libraries: { RubbishMath: rubbishMath, diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index c92b553c1d..22bef6664f 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -44,7 +44,7 @@ describe("static calls", () => { after: [createCall], }); - const foo = m.contractAtFromArtifact("Foo", newAddress, artifact); + const foo = m.contractAt("Foo", newAddress, artifact); return { fooFactory, foo }; }); @@ -167,7 +167,7 @@ describe("static calls", () => { after: [createCall], }); - const foo = m.contractAtFromArtifact("Foo", nonAddress, artifact); + const foo = m.contractAt("Foo", nonAddress, artifact); return { fooFactory, foo }; }); diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 4b56787b97..4cd5a83ea7 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -121,21 +121,12 @@ describe("to-mermaid", () => { const moduleDefinition = buildModule("Module", (m) => { const basic = m.contract("BasicContract"); const library = m.library("BasicLibrary"); - const libFromArtifact = m.libraryFromArtifact( - "BasicLibrary", - libArtifact, - { - id: "BasicLibrary2", - } - ); - const withLib = m.contractFromArtifact( - "ContractWithLibrary", - withLibArtifact, - [], - { - libraries: { BasicLibrary: library }, - } - ); + const libFromArtifact = m.library("BasicLibrary", libArtifact, { + id: "BasicLibrary2", + }); + const withLib = m.contract("ContractWithLibrary", withLibArtifact, [], { + libraries: { BasicLibrary: library }, + }); const call = m.call(basic, "basicFunction", [40]); const eventArg = m.readEventArgument(call, "BasicEvent", "eventArg"); @@ -144,7 +135,7 @@ describe("to-mermaid", () => { const duplicate = m.contractAt("BasicContract", basic, { id: "BasicContract2", }); - const duplicateWithLib = m.contractAtFromArtifact( + const duplicateWithLib = m.contractAt( "ContractWithLibrary", withLib, withLibArtifact, From 6c9c6393451e6cf891180baa9ac104754291b0d0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 18:38:42 +0000 Subject: [PATCH 0936/1302] Replace some casts with validations --- packages/core/src/internal/module-builder.ts | 29 +++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 9b3b129858..416c0c7263 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -195,19 +195,34 @@ class IgnitionModuleBuilderImplementation< ): | NamedContractDeploymentFuture | ArtifactContractDeploymentFuture { - if (isArtifactType(artifactOrArgs)) { - return this._contractFromArtifact( + if (artifactOrArgs === undefined || Array.isArray(artifactOrArgs)) { + if (Array.isArray(argsorOptions)) { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to contract "${contractName}" in module "${this._module.id}"`, + this.contract + ); + } + + return this._namedArtifactContract( contractName, artifactOrArgs, - argsorOptions as ArgumentType[], // TODO: Validate instead of cast - maybeOptions + argsorOptions ); } - const args = artifactOrArgs; - const options = argsorOptions as ContractOptions; // TODO: Validate instead of cast + if (argsorOptions !== undefined && !Array.isArray(argsorOptions)) { + this._throwErrorWithStackTrace( + `Invalid parameter "args" provided to contract "${contractName}" in module "${this._module.id}"`, + this.contract + ); + } - return this._namedArtifactContract(contractName, args, options); + return this._contractFromArtifact( + contractName, + artifactOrArgs, + argsorOptions, + maybeOptions + ); } private _namedArtifactContract( From 84827c623662ab63447be7839e0f61964cd54995 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 18:38:53 +0000 Subject: [PATCH 0937/1302] Fix broken test --- packages/core/test/readEventArgument.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 2d21548293..a4abf77fdd 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -41,7 +41,7 @@ describe("Read event argument", () => { ) as ReadEventArgumentFuture[]; assert.equal(read1.futureToReadFrom, mod.results.contract); - assert.equal(read2.futureToReadFrom, mod.results.contract); + assert.equal(read2.futureToReadFrom, mod.results.contractFromArtifact); assert.equal(read3.futureToReadFrom, callFuture); }); From 01eecfef67861ed3b4f955c928c2306a3e976654 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 18:39:03 +0000 Subject: [PATCH 0938/1302] Remove outdated tests --- packages/core/test/contractAtFromArtifact.ts | 12 ------------ packages/core/test/libraryFromArtifact.ts | 12 ------------ 2 files changed, 24 deletions(-) diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index c9029be14c..588d56b2bf 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -213,18 +213,6 @@ describe("contractAtFromArtifact", () => { /Invalid address given/ ); }); - - it("should not validate an invalid artifact", () => { - assert.throws( - () => - buildModule("Module1", (m) => { - const another = m.contractAt("Another", "", {} as Artifact); - - return { another }; - }), - /Invalid artifact given/ - ); - }); }); describe("stage two", () => { diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index ef518923fb..2c657b24c0 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -229,18 +229,6 @@ describe("libraryFromArtifact", () => { /Given library 'Call' is not a valid Future/ ); }); - - it("should not validate an invalid artifact", () => { - assert.throws( - () => - buildModule("Module1", (m) => { - const another = m.library("Another", {} as Artifact); - - return { another }; - }), - /Invalid artifact given/ - ); - }); }); describe("stage two", () => { From 6a07ff7b720e708b27c8d4a3cf4a002c1f6fd445 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 18:55:28 +0000 Subject: [PATCH 0939/1302] Rebase on top of `development` --- packages/core/src/internal/module-builder.ts | 10 +++++----- packages/core/test/staticCall.ts | 4 ++-- packages/core/test/validations/id-rules.ts | 15 ++++++--------- 3 files changed, 13 insertions(+), 16 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 416c0c7263..94328cae45 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -290,8 +290,8 @@ class IgnitionModuleBuilderImplementation< options.value ??= BigInt(0); /* validation start */ - this._assertValidId(options.id, this.contractFromArtifact); - this._assertValidContractName(contractName, this.contractFromArtifact); + this._assertValidId(options.id, this.contract); + this._assertValidContractName(contractName, this.contract); this._assertUniqueArtifactContractId(futureId); this._assertValidLibraries(options.libraries, this.contract); this._assertValidValue(options.value, this.contract); @@ -404,8 +404,8 @@ class IgnitionModuleBuilderImplementation< options.libraries ??= {}; /* validation start */ - this._assertValidId(options.id, this.libraryFromArtifact); - this._assertValidContractName(libraryName, this.libraryFromArtifact); + this._assertValidId(options.id, this.library); + this._assertValidContractName(libraryName, this.library); this._assertUniqueArtifactLibraryId(futureId); this._assertValidLibraries(options.libraries, this.library); this._assertValidFrom(options.from, this.library); @@ -630,7 +630,7 @@ class IgnitionModuleBuilderImplementation< ); /* validation start */ - this._assertValidId(options.id, this.contractAtFromArtifact); + this._assertValidId(options.id, this.contractAt); this._assertValidContractName(contractName, this.contractAt); this._assertUniqueContractAtFromArtifactId(futureId); this._assertValidAddress(address, this.contractAt); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 5de75ff052..5ff97edf9c 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -711,7 +711,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "inc", [], "a"); return { another }; @@ -750,7 +750,7 @@ describe("static call", () => { }; const module = buildModule("Module1", (m) => { - const another = m.contractFromArtifact("Another", fakeArtifact, []); + const another = m.contract("Another", fakeArtifact, []); m.staticCall(another, "inc", [], 2); return { another }; diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index c3e9a1abfa..b2428735da 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -35,7 +35,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in contractFromArtifact ids", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContract = m.contractFromArtifact( + const myContract = m.contract( "MyContractFromArtifact", fakeArtifact, [], @@ -64,7 +64,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in libraryFromArtifact ids", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myLibraryFromArtifact = m.libraryFromArtifact( + const myLibraryFromArtifact = m.library( "MyLibraryFromArtifact", fakeArtifact, { @@ -120,7 +120,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in contractAtFromArtifact ids", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContractAt = m.contractAtFromArtifact( + const myContractAt = m.contractAt( "MyContract", exampleAddress, fakeArtifact, @@ -173,10 +173,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in contractFromArtifact contract name", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContract = m.contractFromArtifact( - "MyContract:v2", - fakeArtifact - ); + const myContract = m.contract("MyContract:v2", fakeArtifact); return { myContract }; }); @@ -196,7 +193,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in libraryFromArtifact contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myLibraryFromArtifact = m.libraryFromArtifact( + const myLibraryFromArtifact = m.library( "MyLibraryFromArtifact:v2", fakeArtifact ); @@ -219,7 +216,7 @@ describe("id rules", () => { it("should not allow non-alphanumerics in contractAtFromArtifact contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContractAt = m.contractAtFromArtifact( + const myContractAt = m.contractAt( "MyContractAt:v2", exampleAddress, fakeArtifact From bb020a76e98df2051c3bc9eea2cea45cc64a1bd0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 19:26:56 +0000 Subject: [PATCH 0940/1302] Rename FutureType values --- .../helpers/build-initialize-message-for.ts | 16 +++---- .../helpers/save-artifacts-for-future.ts | 16 +++---- .../reducers/helpers/initializers.ts | 4 +- .../execution/types/execution-state.ts | 14 +++--- .../src/internal/execution/types/messages.ts | 2 +- packages/core/src/internal/module.ts | 32 ++++++------- ...concile-future-specific-reconciliations.ts | 16 +++---- .../internal/validation/validateStageOne.ts | 16 +++---- .../internal/validation/validateStageTwo.ts | 16 +++---- .../core/src/stored-deployment-serializer.ts | 34 ++++++------- packages/core/src/type-guards.ts | 48 +++++++++---------- packages/core/src/types/module.ts | 32 ++++++------- .../core/src/types/serialized-deployment.ts | 16 +++---- packages/core/test/batcher.ts | 2 +- packages/core/test/call.ts | 46 +++++++++--------- packages/core/test/contract.ts | 2 +- packages/core/test/contractAt.ts | 6 +-- packages/core/test/contractAtFromArtifact.ts | 6 +-- packages/core/test/contractFromArtifact.ts | 12 ++--- .../helpers/build-initialize-message-for.ts | 24 +++++----- .../running-a-named-contract-deploy.ts | 2 +- .../running-a-named-library-deploy.ts | 2 +- .../execution/reducers/running-contract-at.ts | 2 +- packages/core/test/library.ts | 2 +- packages/core/test/readEventArgument.ts | 2 +- .../futures/reconcileArtifactContractAt.ts | 18 +++---- .../reconcileArtifactContractDeployment.ts | 18 +++---- .../reconcileArtifactLibraryDeployment.ts | 14 +++--- .../futures/reconcileNamedContractAt.ts | 18 +++---- .../futures/reconcileNamedContractCall.ts | 16 +++---- .../reconcileNamedContractDeployment.ts | 6 +-- .../reconcileNamedLibraryDeployment.ts | 14 +++--- .../futures/reconcileNamedStaticCall.ts | 18 +++---- .../futures/reconcileReadEventArgument.ts | 14 +++--- .../core/test/reconciliation/reconciler.ts | 32 ++++++------- packages/core/test/staticCall.ts | 48 +++++++++---------- packages/core/test/wipe.ts | 4 +- .../components/future-summary.tsx | 32 ++++++------- .../pages/plan-overview/components/action.tsx | 26 +++++----- packages/ui/src/utils/to-mermaid.ts | 16 +++---- 40 files changed, 332 insertions(+), 332 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 36453f4296..409a4b4968 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -33,8 +33,8 @@ export async function buildInitializeMessageFor( defaultSender: string ): Promise { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: const deploymentExecStateInit: DeploymentExecutionStateInitializeMessage = _extendBaseInitWith( JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, @@ -57,8 +57,8 @@ export async function buildInitializeMessageFor( ); return deploymentExecStateInit; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: const libraryDeploymentInit: DeploymentExecutionStateInitializeMessage = _extendBaseInitWith( JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, @@ -76,7 +76,7 @@ export async function buildInitializeMessageFor( ); return libraryDeploymentInit; - case FutureType.NAMED_CONTRACT_CALL: { + case FutureType.CONTRACT_CALL: { const namedContractCallInit: CallExecutionStateInitializeMessage = _extendBaseInitWith( JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE, @@ -102,7 +102,7 @@ export async function buildInitializeMessageFor( return namedContractCallInit; } - case FutureType.NAMED_STATIC_CALL: { + case FutureType.STATIC_CALL: { const namedStaticCallInit: StaticCallExecutionStateInitializeMessage = _extendBaseInitWith( JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE, @@ -128,8 +128,8 @@ export async function buildInitializeMessageFor( return namedStaticCallInit; } - case FutureType.NAMED_CONTRACT_AT: - case FutureType.ARTIFACT_CONTRACT_AT: { + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: { const contractAtInit: ContractAtExecutionStateInitializeMessage = _extendBaseInitWith( JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, diff --git a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts index b7c6025bf0..13b6e6e9c3 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts @@ -14,22 +14,22 @@ export async function saveArtifactsForFuture( deploymentLoader: DeploymentLoader ): Promise { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - case FutureType.NAMED_LIBRARY_DEPLOYMENT: - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return _storeArtifactAndBuildInfoAgainstDeployment(future, { artifactResolver, deploymentLoader, }); - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + case FutureType.CONTRACT_AT: return deploymentLoader.storeUserProvidedArtifact( future.id, future.artifact ); - case FutureType.NAMED_CONTRACT_CALL: - case FutureType.NAMED_STATIC_CALL: + case FutureType.CONTRACT_CALL: + case FutureType.STATIC_CALL: case FutureType.READ_EVENT_ARGUMENT: case FutureType.SEND_DATA: return; diff --git a/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/core/src/internal/execution/reducers/helpers/initializers.ts index 2959b91d98..cbee26b036 100644 --- a/packages/core/src/internal/execution/reducers/helpers/initializers.ts +++ b/packages/core/src/internal/execution/reducers/helpers/initializers.ts @@ -46,7 +46,7 @@ export function initialiseStaticCallExecutionStateFrom( const callExecutionInitialState: StaticCallExecutionState = { id: action.futureId, type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, strategy: action.strategy, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), @@ -129,7 +129,7 @@ export function initialiseCallExecutionStateFrom( const callExecutionInitialState: CallExecutionState = { id: action.futureId, type: ExecutionSateType.CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, strategy: action.strategy, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 61cda043c5..39a5366737 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -61,10 +61,10 @@ interface BaseExecutionState< /** The future types that can be used with a DeploymentExecutionState */ export type DeploymentExecutionStateFutureTypes = - | FutureType.NAMED_CONTRACT_DEPLOYMENT - | FutureType.ARTIFACT_CONTRACT_DEPLOYMENT - | FutureType.NAMED_LIBRARY_DEPLOYMENT - | FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + | FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT + | FutureType.CONTRACT_DEPLOYMENT + | FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT + | FutureType.LIBRARY_DEPLOYMENT; /** * The execution state used for the different kinds of futures @@ -91,7 +91,7 @@ export interface DeploymentExecutionState export interface CallExecutionState extends BaseExecutionState< ExecutionSateType.CALL_EXECUTION_STATE, - FutureType.NAMED_CONTRACT_CALL + FutureType.CONTRACT_CALL > { artifactId: string; contractAddress: string; @@ -112,7 +112,7 @@ export interface CallExecutionState export interface StaticCallExecutionState extends BaseExecutionState< ExecutionSateType.STATIC_CALL_EXECUTION_STATE, - FutureType.NAMED_STATIC_CALL + FutureType.STATIC_CALL > { artifactId: string; contractAddress: string; @@ -151,7 +151,7 @@ export interface SendDataExecutionState export interface ContractAtExecutionState extends BaseExecutionState< ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, - FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT + FutureType.NAMED_ARTIFACT_CONTRACT_AT | FutureType.CONTRACT_AT > { artifactId: string; contractName: string; diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index d10f690380..c41f9b35b1 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -150,7 +150,7 @@ export interface SendDataExecutionStateCompleteMessage { export interface ContractAtExecutionStateInitializeMessage { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE; - futureType: FutureType.NAMED_CONTRACT_AT | FutureType.ARTIFACT_CONTRACT_AT; + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT | FutureType.CONTRACT_AT; futureId: string; strategy: string; dependencies: string[]; diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index 6b4d6401f2..cf9398aed7 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -53,7 +53,7 @@ abstract class BaseFutureImplementation { export class NamedContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements NamedContractDeploymentFuture { constructor( @@ -65,14 +65,14 @@ export class NamedContractDeploymentFutureImplementation< public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.NAMED_CONTRACT_DEPLOYMENT, module); + super(id, FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, module); } } export class ArtifactContractDeploymentFutureImplementation< ContractNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements ArtifactContractDeploymentFuture { constructor( @@ -85,14 +85,14 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, module); + super(id, FutureType.CONTRACT_DEPLOYMENT, module); } } export class NamedLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements NamedLibraryDeploymentFuture { constructor( @@ -102,14 +102,14 @@ export class NamedLibraryDeploymentFutureImplementation< public readonly libraries: Record>, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.NAMED_LIBRARY_DEPLOYMENT, module); + super(id, FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, module); } } export class ArtifactLibraryDeploymentFutureImplementation< LibraryNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements ArtifactLibraryDeploymentFuture { constructor( @@ -120,7 +120,7 @@ export class ArtifactLibraryDeploymentFutureImplementation< public readonly libraries: Record>, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, module); + super(id, FutureType.LIBRARY_DEPLOYMENT, module); } } @@ -128,7 +128,7 @@ export class NamedContractCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements NamedContractCallFuture { constructor( @@ -140,7 +140,7 @@ export class NamedContractCallFutureImplementation< public readonly value: bigint | ModuleParameterRuntimeValue, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.NAMED_CONTRACT_CALL, module); + super(id, FutureType.CONTRACT_CALL, module); } } @@ -148,7 +148,7 @@ export class NamedStaticCallFutureImplementation< ContractNameT extends string, FunctionNameT extends string > - extends BaseFutureImplementation + extends BaseFutureImplementation implements NamedStaticCallFuture { constructor( @@ -160,12 +160,12 @@ export class NamedStaticCallFutureImplementation< public readonly nameOrIndex: string | number, public readonly from: string | AccountRuntimeValue | undefined ) { - super(id, FutureType.NAMED_STATIC_CALL, module); + super(id, FutureType.STATIC_CALL, module); } } export class NamedContractAtFutureImplementation - extends BaseFutureImplementation + extends BaseFutureImplementation implements NamedContractAtFuture { constructor( @@ -177,12 +177,12 @@ export class NamedContractAtFutureImplementation | AddressResolvableFuture | ModuleParameterRuntimeValue ) { - super(id, FutureType.NAMED_CONTRACT_AT, module); + super(id, FutureType.NAMED_ARTIFACT_CONTRACT_AT, module); } } export class ArtifactContractAtFutureImplementation - extends BaseFutureImplementation + extends BaseFutureImplementation implements ArtifactContractAtFuture { constructor( @@ -195,7 +195,7 @@ export class ArtifactContractAtFutureImplementation | ModuleParameterRuntimeValue, public readonly artifact: Artifact ) { - super(id, FutureType.ARTIFACT_CONTRACT_AT, module); + super(id, FutureType.CONTRACT_AT, module); } } diff --git a/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts b/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts index edf402a23c..1eb90b1aab 100644 --- a/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts +++ b/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts @@ -27,49 +27,49 @@ export async function reconcileFutureSpecificReconciliations( context: ReconciliationContext ): Promise { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return reconcileNamedContractDeployment( future, executionState as DeploymentExecutionState, context ); - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return reconcileArtifactContractDeployment( future, executionState as DeploymentExecutionState, context ); - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return reconcileNamedLibraryDeployment( future, executionState as DeploymentExecutionState, context ); - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return reconcileArtifactLibraryDeployment( future, executionState as DeploymentExecutionState, context ); - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return reconcileNamedContractCall( future, executionState as CallExecutionState, context ); - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return reconcileNamedStaticCall( future, executionState as StaticCallExecutionState, context ); - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return reconcileNamedContractAt( future, executionState as ContractAtExecutionState, context ); - case FutureType.ARTIFACT_CONTRACT_AT: { + case FutureType.CONTRACT_AT: { return reconcileArtifactContractAt( future, executionState as ContractAtExecutionState, diff --git a/packages/core/src/internal/validation/validateStageOne.ts b/packages/core/src/internal/validation/validateStageOne.ts index 00617669dc..6c648c80a6 100644 --- a/packages/core/src/internal/validation/validateStageOne.ts +++ b/packages/core/src/internal/validation/validateStageOne.ts @@ -52,28 +52,28 @@ async function _validateFuture( artifactLoader: ArtifactResolver ): Promise { switch (future.type) { - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: await validateArtifactContractDeployment(future, artifactLoader); break; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: await validateArtifactLibraryDeployment(future, artifactLoader); break; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: await validateArtifactContractAt(future, artifactLoader); break; - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: await validateNamedContractDeployment(future, artifactLoader); break; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: await validateNamedLibraryDeployment(future, artifactLoader); break; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: await validateNamedContractAt(future, artifactLoader); break; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: await validateNamedContractCall(future, artifactLoader); break; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: await validateNamedStaticCall(future, artifactLoader); break; case FutureType.READ_EVENT_ARGUMENT: diff --git a/packages/core/src/internal/validation/validateStageTwo.ts b/packages/core/src/internal/validation/validateStageTwo.ts index 7b2c86ea25..1e5623d06e 100644 --- a/packages/core/src/internal/validation/validateStageTwo.ts +++ b/packages/core/src/internal/validation/validateStageTwo.ts @@ -62,7 +62,7 @@ async function _validateFuture( accounts: string[] ) { switch (future.type) { - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: await validateArtifactContractDeployment( future, artifactLoader, @@ -70,7 +70,7 @@ async function _validateFuture( accounts ); break; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: await validateArtifactLibraryDeployment( future, artifactLoader, @@ -78,7 +78,7 @@ async function _validateFuture( accounts ); break; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: await validateArtifactContractAt( future, artifactLoader, @@ -86,7 +86,7 @@ async function _validateFuture( accounts ); break; - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: await validateNamedContractDeployment( future, artifactLoader, @@ -94,7 +94,7 @@ async function _validateFuture( accounts ); break; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: await validateNamedLibraryDeployment( future, artifactLoader, @@ -102,7 +102,7 @@ async function _validateFuture( accounts ); break; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: await validateNamedContractAt( future, artifactLoader, @@ -110,7 +110,7 @@ async function _validateFuture( accounts ); break; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: await validateNamedContractCall( future, artifactLoader, @@ -118,7 +118,7 @@ async function _validateFuture( accounts ); break; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: await validateNamedStaticCall( future, artifactLoader, diff --git a/packages/core/src/stored-deployment-serializer.ts b/packages/core/src/stored-deployment-serializer.ts index b95b0d7616..6c933ea8ed 100644 --- a/packages/core/src/stored-deployment-serializer.ts +++ b/packages/core/src/stored-deployment-serializer.ts @@ -124,7 +124,7 @@ export class StoredDeploymentSerializer { context: SerializeContext ): SerializedFuture { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: const serializedNamedContractDeploymentFuture: SerializedNamedContractDeploymentFuture = { id: future.id, @@ -147,7 +147,7 @@ export class StoredDeploymentSerializer { }; return serializedNamedContractDeploymentFuture; - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: const serializedArtifactContractDeploymentFuture: SerializedArtifactContractDeploymentFuture = { id: future.id, @@ -171,7 +171,7 @@ export class StoredDeploymentSerializer { }; return serializedArtifactContractDeploymentFuture; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: const serializedNamedLibraryDeploymentFuture: SerializedNamedLibraryDeploymentFuture = { id: future.id, @@ -188,7 +188,7 @@ export class StoredDeploymentSerializer { }; return serializedNamedLibraryDeploymentFuture; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: const serializedArtifactLibraryDeploymentFuture: SerializedArtifactLibraryDeploymentFuture = { id: future.id, @@ -206,7 +206,7 @@ export class StoredDeploymentSerializer { }; return serializedArtifactLibraryDeploymentFuture; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: const serializedNamedContractCallFuture: SerializedNamedContractCallFuture = { id: future.id, @@ -227,7 +227,7 @@ export class StoredDeploymentSerializer { }; return serializedNamedContractCallFuture; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: const serializedNamedStaticCallFuture: SerializedNamedStaticCallFuture = { id: future.id, @@ -246,7 +246,7 @@ export class StoredDeploymentSerializer { }; return serializedNamedStaticCallFuture; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: const serializedNamedContractAtFuture: SerializedNamedContractAtFuture = { id: future.id, @@ -265,7 +265,7 @@ export class StoredDeploymentSerializer { }; return serializedNamedContractAtFuture; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: const serializedArtifactContractAtFuture: SerializedArtifactContractAtFuture = { id: future.id, @@ -542,7 +542,7 @@ export class StoredDeploymentDeserializer { } if ( - swappedFuture.type === FutureType.NAMED_CONTRACT_CALL || + swappedFuture.type === FutureType.CONTRACT_CALL || swappedFuture.type === FutureType.SEND_DATA ) { throw new IgnitionError( @@ -632,7 +632,7 @@ export class StoredDeploymentDeserializer { const mod = this._lookup(modulesLookup, serializedFuture.moduleId); switch (serializedFuture.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return new NamedContractDeploymentFutureImplementation( serializedFuture.id, mod, @@ -655,7 +655,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return new ArtifactContractDeploymentFutureImplementation( serializedFuture.id, mod, @@ -679,7 +679,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return new NamedLibraryDeploymentFutureImplementation( serializedFuture.id, mod, @@ -694,7 +694,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return new ArtifactLibraryDeploymentFutureImplementation( serializedFuture.id, mod, @@ -710,7 +710,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return new NamedContractCallFutureImplementation( serializedFuture.id, mod, @@ -731,7 +731,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return new NamedStaticCallFutureImplementation( serializedFuture.id, mod, @@ -748,7 +748,7 @@ export class StoredDeploymentDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return new NamedContractAtFutureImplementation( serializedFuture.id, mod, @@ -766,7 +766,7 @@ export class StoredDeploymentDeserializer { ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : serializedFuture.address ); - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return new ArtifactContractAtFutureImplementation( serializedFuture.id, mod, diff --git a/packages/core/src/type-guards.ts b/packages/core/src/type-guards.ts index bcdbb4cf03..7e468fde17 100644 --- a/packages/core/src/type-guards.ts +++ b/packages/core/src/type-guards.ts @@ -90,12 +90,12 @@ export function isContractFuture( future: Future ): future is ContractFuture { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - case FutureType.NAMED_LIBRARY_DEPLOYMENT: - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: - case FutureType.NAMED_CONTRACT_AT: - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return true; default: @@ -112,10 +112,10 @@ export function isCallableContractFuture( future: Future ): future is CallableContractFuture { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: - case FutureType.NAMED_CONTRACT_AT: - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return true; default: @@ -133,7 +133,7 @@ export function isAddressResolvableFuture( ): future is AddressResolvableFuture { return ( isContractFuture(future) || - future.type === FutureType.NAMED_STATIC_CALL || + future.type === FutureType.STATIC_CALL || future.type === FutureType.READ_EVENT_ARGUMENT ); } @@ -147,8 +147,8 @@ export function isFunctionCallFuture( future: Future ): future is FunctionCallFuture { return ( - future.type === FutureType.NAMED_CONTRACT_CALL || - future.type === FutureType.NAMED_STATIC_CALL + future.type === FutureType.CONTRACT_CALL || + future.type === FutureType.STATIC_CALL ); } @@ -160,7 +160,7 @@ export function isFunctionCallFuture( export function isNamedStaticCallFuture( future: Future ): future is NamedStaticCallFuture { - return future.type === FutureType.NAMED_STATIC_CALL; + return future.type === FutureType.STATIC_CALL; } /** @@ -182,7 +182,7 @@ export function isReadEventArgumentFuture( export function isNamedContractDeploymentFuture( future: Future ): future is NamedContractDeploymentFuture { - return future.type === FutureType.NAMED_CONTRACT_DEPLOYMENT; + return future.type === FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; } /** @@ -193,7 +193,7 @@ export function isNamedContractDeploymentFuture( export function isArtifactContractDeploymentFuture( future: Future ): future is ArtifactContractDeploymentFuture { - return future.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + return future.type === FutureType.CONTRACT_DEPLOYMENT; } /** @@ -204,7 +204,7 @@ export function isArtifactContractDeploymentFuture( export function isNamedLibraryDeploymentFuture( future: Future ): future is NamedLibraryDeploymentFuture { - return future.type === FutureType.NAMED_LIBRARY_DEPLOYMENT; + return future.type === FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; } /** @@ -215,7 +215,7 @@ export function isNamedLibraryDeploymentFuture( export function isArtifactLibraryDeploymentFuture( future: Future ): future is ArtifactLibraryDeploymentFuture { - return future.type === FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + return future.type === FutureType.LIBRARY_DEPLOYMENT; } /** @@ -226,7 +226,7 @@ export function isArtifactLibraryDeploymentFuture( export function isNamedContractAtFuture( future: Future ): future is NamedContractAtFuture { - return future.type === FutureType.NAMED_CONTRACT_AT; + return future.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT; } /** @@ -237,7 +237,7 @@ export function isNamedContractAtFuture( export function isArtifactContractAtFuture( future: Future ): future is ArtifactContractAtFuture { - return future.type === FutureType.ARTIFACT_CONTRACT_AT; + return future.type === FutureType.CONTRACT_AT; } /** @@ -249,10 +249,10 @@ export function isDeploymentType( potential: unknown ): potential is DeploymentFuture["type"] { const deploymentTypes = [ - FutureType.NAMED_CONTRACT_DEPLOYMENT, - FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.NAMED_LIBRARY_DEPLOYMENT, - FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.CONTRACT_DEPLOYMENT, + FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, + FutureType.LIBRARY_DEPLOYMENT, ]; return ( diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 6b5de96539..a3132543f8 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -32,14 +32,14 @@ export type ArgumentType = * @beta */ export enum FutureType { - NAMED_CONTRACT_DEPLOYMENT = "NAMED_CONTRACT_DEPLOYMENT", - ARTIFACT_CONTRACT_DEPLOYMENT = "ARTIFACT_CONTRACT_DEPLOYMENT", - NAMED_LIBRARY_DEPLOYMENT = "NAMED_LIBRARY_DEPLOYMENT", - ARTIFACT_LIBRARY_DEPLOYMENT = "ARTIFACT_LIBRARY_DEPLOYMENT", - NAMED_CONTRACT_CALL = "NAMED_CONTRACT_CALL", - NAMED_STATIC_CALL = "NAMED_STATIC_CALL", - NAMED_CONTRACT_AT = "NAMED_CONTRACT_AT", - ARTIFACT_CONTRACT_AT = "ARTIFACT_CONTRACT_AT", + NAMED_ARTIFACT_CONTRACT_DEPLOYMENT = "NAMED_ARTIFACT_CONTRACT_DEPLOYMENT", + CONTRACT_DEPLOYMENT = "CONTRACT_DEPLOYMENT", + NAMED_ARTIFACT_LIBRARY_DEPLOYMENT = "NAMED_ARTIFACT_LIBRARY_DEPLOYMENT", + LIBRARY_DEPLOYMENT = "LIBRARY_DEPLOYMENT", + CONTRACT_CALL = "CONTRACT_CALL", + STATIC_CALL = "STATIC_CALL", + NAMED_ARTIFACT_CONTRACT_AT = "NAMED_ARTIFACT_CONTRACT_AT", + CONTRACT_AT = "CONTRACT_AT", READ_EVENT_ARGUMENT = "READ_EVENT_ARGUMENT", SEND_DATA = "SEND_DATA", } @@ -126,7 +126,7 @@ export type AddressResolvableFuture = * @beta */ export interface NamedContractDeploymentFuture { - type: FutureType.NAMED_CONTRACT_DEPLOYMENT; + type: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; @@ -144,7 +144,7 @@ export interface NamedContractDeploymentFuture { * @beta */ export interface ArtifactContractDeploymentFuture { - type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + type: FutureType.CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; @@ -162,7 +162,7 @@ export interface ArtifactContractDeploymentFuture { * @beta */ export interface NamedLibraryDeploymentFuture { - type: FutureType.NAMED_LIBRARY_DEPLOYMENT; + type: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; @@ -178,7 +178,7 @@ export interface NamedLibraryDeploymentFuture { * @beta */ export interface ArtifactLibraryDeploymentFuture { - type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + type: FutureType.LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; @@ -197,7 +197,7 @@ export interface NamedContractCallFuture< ContractNameT extends string, FunctionNameT extends string > { - type: FutureType.NAMED_CONTRACT_CALL; + type: FutureType.CONTRACT_CALL; id: string; module: IgnitionModule; dependencies: Set; @@ -217,7 +217,7 @@ export interface NamedStaticCallFuture< ContractNameT extends string, FunctionNameT extends string > { - type: FutureType.NAMED_STATIC_CALL; + type: FutureType.STATIC_CALL; id: string; module: IgnitionModule; dependencies: Set; @@ -234,7 +234,7 @@ export interface NamedStaticCallFuture< * @beta */ export interface NamedContractAtFuture { - type: FutureType.NAMED_CONTRACT_AT; + type: FutureType.NAMED_ARTIFACT_CONTRACT_AT; id: string; module: IgnitionModule; dependencies: Set; @@ -252,7 +252,7 @@ export interface NamedContractAtFuture { * @beta */ export interface ArtifactContractAtFuture { - type: FutureType.ARTIFACT_CONTRACT_AT; + type: FutureType.CONTRACT_AT; id: string; module: IgnitionModule; dependencies: Set; diff --git a/packages/core/src/types/serialized-deployment.ts b/packages/core/src/types/serialized-deployment.ts index 0b010b7833..cd7e006aef 100644 --- a/packages/core/src/types/serialized-deployment.ts +++ b/packages/core/src/types/serialized-deployment.ts @@ -75,7 +75,7 @@ export interface BaseSerializedFuture { */ export interface SerializedNamedContractDeploymentFuture extends BaseSerializedFuture { - type: FutureType.NAMED_CONTRACT_DEPLOYMENT; + type: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; contractName: string; constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; @@ -90,7 +90,7 @@ export interface SerializedNamedContractDeploymentFuture */ export interface SerializedArtifactContractDeploymentFuture extends BaseSerializedFuture { - type: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT; + type: FutureType.CONTRACT_DEPLOYMENT; contractName: string; constructorArgs: SerializedArgumentType[]; artifact: Artifact; @@ -106,7 +106,7 @@ export interface SerializedArtifactContractDeploymentFuture */ export interface SerializedNamedLibraryDeploymentFuture extends BaseSerializedFuture { - type: FutureType.NAMED_LIBRARY_DEPLOYMENT; + type: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; contractName: string; libraries: SerializedLibraries; from: string | SerializedAccountRuntimeValue | undefined; @@ -119,7 +119,7 @@ export interface SerializedNamedLibraryDeploymentFuture */ export interface SerializedArtifactLibraryDeploymentFuture extends BaseSerializedFuture { - type: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT; + type: FutureType.LIBRARY_DEPLOYMENT; contractName: string; artifact: Artifact; libraries: SerializedLibraries; @@ -133,7 +133,7 @@ export interface SerializedArtifactLibraryDeploymentFuture */ export interface SerializedNamedContractCallFuture extends BaseSerializedFuture { - type: FutureType.NAMED_CONTRACT_CALL; + type: FutureType.CONTRACT_CALL; functionName: string; contract: FutureToken; args: SerializedArgumentType[]; @@ -147,7 +147,7 @@ export interface SerializedNamedContractCallFuture * @beta */ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { - type: FutureType.NAMED_STATIC_CALL; + type: FutureType.STATIC_CALL; functionName: string; contract: FutureToken; args: SerializedArgumentType[]; @@ -161,7 +161,7 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { * @beta */ export interface SerializedNamedContractAtFuture extends BaseSerializedFuture { - type: FutureType.NAMED_CONTRACT_AT; + type: FutureType.NAMED_ARTIFACT_CONTRACT_AT; contractName: string; address: string | FutureToken | SerializedModuleParameterRuntimeValue; } @@ -173,7 +173,7 @@ export interface SerializedNamedContractAtFuture extends BaseSerializedFuture { */ export interface SerializedArtifactContractAtFuture extends BaseSerializedFuture { - type: FutureType.ARTIFACT_CONTRACT_AT; + type: FutureType.CONTRACT_AT; contractName: string; address: string | FutureToken | SerializedModuleParameterRuntimeValue; artifact: Artifact; diff --git a/packages/core/test/batcher.ts b/packages/core/test/batcher.ts index ac449976b0..dd86c49c75 100644 --- a/packages/core/test/batcher.ts +++ b/packages/core/test/batcher.ts @@ -15,7 +15,7 @@ describe("batcher", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index df3e086aaa..ba9e0c4e2b 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -36,11 +36,11 @@ describe("call", () => { assert.equal(moduleWithASingleContract.futures.size, 2); assert.equal( [...moduleWithASingleContract.futures][0].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT ); assert.equal( [...moduleWithASingleContract.futures][1].type, - FutureType.NAMED_CONTRACT_CALL + FutureType.CONTRACT_CALL ); // No submodules @@ -215,7 +215,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -231,7 +231,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -247,7 +247,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -263,7 +263,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -279,7 +279,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -296,7 +296,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -314,7 +314,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -335,7 +335,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -357,7 +357,7 @@ describe("call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_CONTRACT_CALL + ({ type }) => type === FutureType.CONTRACT_CALL ); assertInstanceOf(future, NamedContractCallFutureImplementation); @@ -501,7 +501,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -529,7 +529,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -568,7 +568,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -625,7 +625,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -665,7 +665,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -697,7 +697,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -737,7 +737,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isFulfilled( @@ -782,7 +782,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isFulfilled( @@ -815,7 +815,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -863,7 +863,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isFulfilled( @@ -907,7 +907,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( @@ -952,7 +952,7 @@ describe("call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_CALL + (v) => v.type === FutureType.CONTRACT_CALL ); await assert.isRejected( diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 89a2f75c49..dfcc44dba5 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -34,7 +34,7 @@ describe("contract", () => { assert.equal(moduleWithASingleContract.futures.size, 1); assert.equal( [...moduleWithASingleContract.futures][0].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT ); // No submodules diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 8e33d0b634..edf459fc94 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -257,7 +257,7 @@ describe("contractAt", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_AT + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); await assert.isRejected( @@ -282,7 +282,7 @@ describe("contractAt", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_AT + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); await assert.isFulfilled( @@ -306,7 +306,7 @@ describe("contractAt", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_CONTRACT_AT + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); await assert.isRejected( diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 588d56b2bf..63b70b590e 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -236,7 +236,7 @@ describe("contractAtFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + (v) => v.type === FutureType.CONTRACT_AT ); await assert.isRejected( @@ -261,7 +261,7 @@ describe("contractAtFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + (v) => v.type === FutureType.CONTRACT_AT ); await assert.isFulfilled( @@ -285,7 +285,7 @@ describe("contractAtFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_AT + (v) => v.type === FutureType.CONTRACT_AT ); await assert.isRejected( diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index c4fbf2c3ab..0296077836 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -533,7 +533,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isRejected( @@ -575,7 +575,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isFulfilled( @@ -612,7 +612,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isRejected( @@ -650,7 +650,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isFulfilled( @@ -674,7 +674,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isRejected( @@ -718,7 +718,7 @@ describe("contractFromArtifact", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.ARTIFACT_CONTRACT_DEPLOYMENT + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); await assert.isFulfilled( diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index 487963cc4e..ceb94ed84a 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -292,7 +292,7 @@ describe("buildInitializeMessageFor", () => { const safeMathExState: Partial = { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, result: { type: ExecutionResultType.SUCCESS, address: libraryAddress, @@ -390,7 +390,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(message, { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:ArtifactContract", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], artifactId: "MyModule:ArtifactContract", @@ -429,7 +429,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(message, { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedLibrary", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: ["MyModule:SafeMath"], artifactId: "MyModule:NamedLibrary", @@ -461,7 +461,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(message, { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:ArtifactLibrary", - futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + futureType: FutureType.LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: ["MyModule:SafeMath"], artifactId: "MyModule:ArtifactLibrary", @@ -630,7 +630,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(message, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:NamedContractAt", @@ -657,7 +657,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(message, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:ArtifactContractAt", - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:ArtifactContractAt", @@ -695,7 +695,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(m, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:NamedContractAt", @@ -725,7 +725,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(m, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:NamedContractAt", @@ -739,7 +739,7 @@ describe("buildInitializeMessageFor", () => { beforeEach(() => { const namedContractAtExState: Partial = { type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, contractAddress: differentAddress, }; @@ -771,7 +771,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(m, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:SecondNamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:SecondNamedContractAt", @@ -816,7 +816,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(m, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:NamedContractAt", @@ -864,7 +864,7 @@ describe("buildInitializeMessageFor", () => { assert.deepStrictEqual(m, { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:NamedContractAt", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "MyModule:NamedContractAt", diff --git a/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts b/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts index 2eea866b86..3d98ae8c8e 100644 --- a/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts +++ b/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts @@ -41,7 +41,7 @@ describe("DeploymentStateReducer", () => { { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: "future1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", dependencies: [], artifactId: "future1", diff --git a/packages/core/test/execution/reducers/running-a-named-library-deploy.ts b/packages/core/test/execution/reducers/running-a-named-library-deploy.ts index 3153be697f..4e0bf15d70 100644 --- a/packages/core/test/execution/reducers/running-a-named-library-deploy.ts +++ b/packages/core/test/execution/reducers/running-a-named-library-deploy.ts @@ -34,7 +34,7 @@ describe("DeploymentStateReducer", () => { { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: "future1", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, strategy: "basic", dependencies: [], artifactId: "future1", diff --git a/packages/core/test/execution/reducers/running-contract-at.ts b/packages/core/test/execution/reducers/running-contract-at.ts index 33d51af033..3119fa4833 100644 --- a/packages/core/test/execution/reducers/running-contract-at.ts +++ b/packages/core/test/execution/reducers/running-contract-at.ts @@ -27,7 +27,7 @@ describe("DeploymentStateReducer", () => { { type: JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, futureId: "ContractAt1", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", dependencies: [], artifactId: "ContractAt1", diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index a19de6309c..928ac3b50c 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -32,7 +32,7 @@ describe("library", () => { assert.equal(moduleWithASingleContract.futures.size, 1); assert.equal( [...moduleWithASingleContract.futures][0].type, - FutureType.NAMED_LIBRARY_DEPLOYMENT + FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT ); // No submodules diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index a4abf77fdd..536b457940 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -33,7 +33,7 @@ describe("Read event argument", () => { }); const callFuture = Array.from(mod.futures).find( - (f) => f.type === FutureType.NAMED_CONTRACT_CALL + (f) => f.type === FutureType.CONTRACT_CALL ); const [read1, read2, read3] = Array.from(mod.futures).filter( diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts index 96e60eda69..ca8e5bbec6 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts @@ -26,7 +26,7 @@ describe("Reconciliation - artifact contract at", () => { const exampleContractAtState: ContractAtExecutionState = { id: "Example", type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -38,7 +38,7 @@ describe("Reconciliation - artifact contract at", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -54,7 +54,7 @@ describe("Reconciliation - artifact contract at", () => { const exampleStaticCallState: StaticCallExecutionState = { id: "Example", type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -83,7 +83,7 @@ describe("Reconciliation - artifact contract at", () => { const deploymentState = createDeploymentState({ ...exampleContractAtState, id: `Submodule#Contract1`, - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, artifactId: "./artifact.json", @@ -106,7 +106,7 @@ describe("Reconciliation - artifact contract at", () => { { ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Example", result: { @@ -117,7 +117,7 @@ describe("Reconciliation - artifact contract at", () => { { ...exampleStaticCallState, id: "Module#Example.getAddress", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.SUCCESS, functionName: "getAddress", result: { @@ -128,7 +128,7 @@ describe("Reconciliation - artifact contract at", () => { { ...exampleContractAtState, id: "Module#Another", - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "Another", contractAddress: differentAddress, @@ -158,7 +158,7 @@ describe("Reconciliation - artifact contract at", () => { createDeploymentState({ ...exampleContractAtState, id: "Module#Factory", - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", contractAddress: differentAddress, @@ -194,7 +194,7 @@ describe("Reconciliation - artifact contract at", () => { createDeploymentState({ ...exampleContractAtState, id: "Module#Factory", - futureType: FutureType.ARTIFACT_CONTRACT_AT, + futureType: FutureType.CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, }) diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts index d8fe8ce391..fa69810688 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -23,7 +23,7 @@ describe("Reconciliation - artifact contract", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, strategy: "basic", status: ExecutionStatus.STARTED, @@ -63,7 +63,7 @@ describe("Reconciliation - artifact contract", () => { { ...exampleDeploymentState, id: "Submodule#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -74,7 +74,7 @@ describe("Reconciliation - artifact contract", () => { { ...exampleDeploymentState, id: "Submodule#Contract1", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, constructorArgs: [{ supply: BigInt(1000) }], libraries: { @@ -99,7 +99,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", }) @@ -134,7 +134,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, constructorArgs: [ "0x15d34AAf54267DB7D7c367839AAf71A00a2C6A65", @@ -171,7 +171,7 @@ describe("Reconciliation - artifact contract", () => { { ...exampleDeploymentState, id: "Module#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -182,7 +182,7 @@ describe("Reconciliation - artifact contract", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, libraries: {}, } @@ -212,7 +212,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, value: BigInt(3), }) @@ -241,7 +241,7 @@ describe("Reconciliation - artifact contract", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, + futureType: FutureType.CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, from: oneAddress, }) diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 97ad349f43..0244f7e08c 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -24,7 +24,7 @@ describe("Reconciliation - artifact library", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -60,7 +60,7 @@ describe("Reconciliation - artifact library", () => { { ...exampleDeploymentState, id: "Submodule#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -71,7 +71,7 @@ describe("Reconciliation - artifact library", () => { { ...exampleDeploymentState, id: "Submodule#MainLibrary", - futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + futureType: FutureType.LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", libraries: { @@ -96,7 +96,7 @@ describe("Reconciliation - artifact library", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + futureType: FutureType.LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "LibraryUnchanged", }) @@ -128,7 +128,7 @@ describe("Reconciliation - artifact library", () => { { ...exampleDeploymentState, id: "Module#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -139,7 +139,7 @@ describe("Reconciliation - artifact library", () => { { ...exampleDeploymentState, id: "Module#MainLibrary", - futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + futureType: FutureType.LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", libraries: { @@ -172,7 +172,7 @@ describe("Reconciliation - artifact library", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + futureType: FutureType.LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library1", from: oneAddress, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts index 3e54b829f2..8b717ca65a 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts @@ -25,7 +25,7 @@ describe("Reconciliation - named contract at", () => { const exampleContractAtState: ContractAtExecutionState = { id: "Example", type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -37,7 +37,7 @@ describe("Reconciliation - named contract at", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -53,7 +53,7 @@ describe("Reconciliation - named contract at", () => { const exampleStaticCallState: StaticCallExecutionState = { id: "Example", type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -82,7 +82,7 @@ describe("Reconciliation - named contract at", () => { const deploymentState = createDeploymentState({ ...exampleContractAtState, id: `Submodule#Contract1`, - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, }); @@ -104,7 +104,7 @@ describe("Reconciliation - named contract at", () => { { ...exampleDeploymentState, id: "Module#Example", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Example", result: { @@ -115,7 +115,7 @@ describe("Reconciliation - named contract at", () => { { ...exampleStaticCallState, id: "Module#Example.getAddress", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.SUCCESS, functionName: "getAddress", result: { @@ -126,7 +126,7 @@ describe("Reconciliation - named contract at", () => { { ...exampleContractAtState, id: "Module#Another", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, contractName: "Another", @@ -150,7 +150,7 @@ describe("Reconciliation - named contract at", () => { createDeploymentState({ ...exampleContractAtState, id: "Module#Factory", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractName: "ContractUnchanged", contractAddress: exampleAddress, @@ -180,7 +180,7 @@ describe("Reconciliation - named contract at", () => { createDeploymentState({ ...exampleContractAtState, id: "Module#Factory", - futureType: FutureType.NAMED_CONTRACT_AT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, status: ExecutionStatus.STARTED, contractAddress: differentAddress, }) diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index a94313ecbb..37aa17c449 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -26,7 +26,7 @@ describe("Reconciliation - named contract call", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -42,7 +42,7 @@ describe("Reconciliation - named contract call", () => { const exampleContractCallState: CallExecutionState = { id: "Example", type: ExecutionSateType.CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -85,7 +85,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Submodule#Contract1.function1", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.SUCCESS, functionName: "function1", args: [1, "a", differentAddress], @@ -118,7 +118,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Module#config", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", contractAddress: exampleAddress, @@ -159,7 +159,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Module#config", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "functionUnchanged", } @@ -201,7 +201,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Module#Contract1.function1", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", args: [["UNCHANGED"]], @@ -241,7 +241,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Module#config", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", value: BigInt(2), @@ -281,7 +281,7 @@ describe("Reconciliation - named contract call", () => { { ...exampleContractCallState, id: "Module#config", - futureType: FutureType.NAMED_CONTRACT_CALL, + futureType: FutureType.CONTRACT_CALL, status: ExecutionStatus.STARTED, functionName: "function1", from: oneAddress, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts index 1ee48ed8af..7271abf4e2 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -24,7 +24,7 @@ describe("Reconciliation - named contract", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -70,7 +70,7 @@ describe("Reconciliation - named contract", () => { { ...exampleDeploymentState, id: "Submodule#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -180,7 +180,7 @@ describe("Reconciliation - named contract", () => { { ...exampleDeploymentState, id: "Module#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { diff --git a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts index ae308d80f1..f0cdcdb4c1 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -24,7 +24,7 @@ describe("Reconciliation - named library", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -60,7 +60,7 @@ describe("Reconciliation - named library", () => { { ...exampleDeploymentState, id: "Submodule#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -71,7 +71,7 @@ describe("Reconciliation - named library", () => { { ...exampleDeploymentState, id: "Submodule#MainLibrary", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", libraries: { @@ -94,7 +94,7 @@ describe("Reconciliation - named library", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Library", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "LibraryUnchanged", }) @@ -126,7 +126,7 @@ describe("Reconciliation - named library", () => { { ...exampleDeploymentState, id: "Module#SafeMath", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "SafeMath", result: { @@ -137,7 +137,7 @@ describe("Reconciliation - named library", () => { { ...exampleDeploymentState, id: "Module#MainLibrary", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "MainLibrary", libraries: { @@ -167,7 +167,7 @@ describe("Reconciliation - named library", () => { createDeploymentState({ ...exampleDeploymentState, id: "Module#Library", - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Library", from: oneAddress, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index 787d9b8025..691ec4c33e 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -26,7 +26,7 @@ describe("Reconciliation - named static call", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -42,7 +42,7 @@ describe("Reconciliation - named static call", () => { const exampleStaticCallState: StaticCallExecutionState = { id: "Example", type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -85,7 +85,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Submodule#Contract1.function1", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.SUCCESS, contractAddress: exampleAddress, functionName: "function1", @@ -159,7 +159,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Module#config", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, functionName: "functionUnchanged", @@ -202,7 +202,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Module#Contract1.function1", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, functionName: "function1", @@ -246,7 +246,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Module#config", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.STARTED, contractAddress: exampleAddress, functionName: "function1", @@ -278,7 +278,7 @@ describe("Reconciliation - named static call", () => { { ...exampleDeploymentState, id: "Module#Contract", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -341,7 +341,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Module#first_call", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.SUCCESS, dependencies: new Set(["Module#Contract1"]), contractAddress: exampleAddress, @@ -355,7 +355,7 @@ describe("Reconciliation - named static call", () => { { ...exampleStaticCallState, id: "Module#second_call", - futureType: FutureType.NAMED_STATIC_CALL, + futureType: FutureType.STATIC_CALL, status: ExecutionStatus.SUCCESS, dependencies: new Set(["Module#Contract1", "Module#first_call"]), contractAddress: exampleAddress, diff --git a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts index f6ea9cd3f5..ffb6b4b281 100644 --- a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts @@ -41,7 +41,7 @@ describe("Reconciliation - read event argument", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Example", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -75,7 +75,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Submodule#Contract", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract", result: { @@ -111,7 +111,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Module#Contract", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract", result: { @@ -154,7 +154,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Module#Contract", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -198,7 +198,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Module#Contract", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, result: { type: ExecutionResultType.SUCCESS, @@ -242,7 +242,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", result: { @@ -253,7 +253,7 @@ describe("Reconciliation - read event argument", () => { { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", result: { diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 31a47290a2..7e817c9299 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -25,7 +25,7 @@ describe("Reconciliation", () => { const exampleDeploymentState: DeploymentExecutionState = { id: "Module1#Contract1", type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", status: ExecutionStatus.STARTED, dependencies: new Set(), @@ -115,7 +115,7 @@ describe("Reconciliation", () => { executionStates: { "Module1#Example": { ...exampleDeploymentState, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, }, }, @@ -183,7 +183,7 @@ describe("Reconciliation", () => { executionStates: { "Module1#Contract1": { ...exampleDeploymentState, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, from: getDefaultSender(exampleAccounts), }, @@ -206,7 +206,7 @@ describe("Reconciliation", () => { moduleDefinition, createDeploymentState({ ...exampleDeploymentState, - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, from: exampleAccounts[3], }) @@ -241,21 +241,21 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", }, { ...exampleDeploymentState, id: "Module#Contract3", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, dependencies: new Set(["Module#Contract2", "Module#Contract2"]), contractName: "Contract3", @@ -281,21 +281,21 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract2", }, { ...exampleDeploymentState, id: "Module#Contract3", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, dependencies: new Set(["Module#Contract1", "Module#Contract2"]), contractName: "Contract3", @@ -320,14 +320,14 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, contractName: "Contract1", }, { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, contractName: "Contract2", dependencies: new Set(), // no deps on last run @@ -352,14 +352,14 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#Contract1", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, // Could still be in flight contractName: "Contract1", }, { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, dependencies: new Set(), // no deps on last run contractName: "Contract2", @@ -394,7 +394,7 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#ContractOriginal", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.SUCCESS, dependencies: new Set(), // no deps on last run contractName: "ContractOriginal", @@ -402,7 +402,7 @@ describe("Reconciliation", () => { { ...exampleDeploymentState, id: "Module#Contract2", - futureType: FutureType.NAMED_CONTRACT_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, status: ExecutionStatus.STARTED, dependencies: new Set("Module#ContractOriginal"), // no deps on last run contractName: "Contract2", diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 5ff97edf9c..6d24f78466 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -37,11 +37,11 @@ describe("static call", () => { assert.equal(moduleWithASingleContract.futures.size, 2); assert.equal( [...moduleWithASingleContract.futures][0].type, - FutureType.NAMED_CONTRACT_DEPLOYMENT + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT ); assert.equal( [...moduleWithASingleContract.futures][1].type, - FutureType.NAMED_STATIC_CALL + FutureType.STATIC_CALL ); // No submodules @@ -230,7 +230,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -246,7 +246,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -262,7 +262,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -278,7 +278,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -294,7 +294,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -311,7 +311,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -329,7 +329,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -350,7 +350,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -372,7 +372,7 @@ describe("static call", () => { }); const future = [...module.futures].find( - ({ type }) => type === FutureType.NAMED_STATIC_CALL + ({ type }) => type === FutureType.STATIC_CALL ); assertInstanceOf(future, NamedStaticCallFutureImplementation); @@ -516,7 +516,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -544,7 +544,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -583,7 +583,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -640,7 +640,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -679,7 +679,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -718,7 +718,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -757,7 +757,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -796,7 +796,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -841,7 +841,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isFulfilled( @@ -873,7 +873,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -920,7 +920,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isFulfilled( @@ -964,7 +964,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( @@ -1009,7 +1009,7 @@ describe("static call", () => { }); const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_STATIC_CALL + (v) => v.type === FutureType.STATIC_CALL ); await assert.isRejected( diff --git a/packages/core/test/wipe.ts b/packages/core/test/wipe.ts index bdce65d702..90a0179500 100644 --- a/packages/core/test/wipe.ts +++ b/packages/core/test/wipe.ts @@ -28,7 +28,7 @@ describe("wipe", () => { const contract1InitMessage: DeploymentExecutionStateInitializeMessage = { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: contract1Id, - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, artifactId: contract1Id, constructorArgs: [], contractName: "Contract1", @@ -43,7 +43,7 @@ describe("wipe", () => { const contract2InitMessage: DeploymentExecutionStateInitializeMessage = { type: JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, futureId: contract1Id, - futureType: FutureType.NAMED_LIBRARY_DEPLOYMENT, + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, artifactId: contract2Id, constructorArgs: [], contractName: "Contract1", diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index c62f75bb69..bb43bdeb83 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -36,19 +36,19 @@ export const FutureSummary: React.FC<{ function resolveTitleFor(future: Future): string { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return `Contract deploy - ${future.contractName}`; - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return `Contract deploy from Artifact - ${future.contractName}`; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return `Library deploy - ${future.contractName}`; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return `Library deploy from Artifact - ${future.contractName}`; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return `Call - ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return `Static call - ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract - ${future.contractName} (${ typeof future.address === "string" ? future.address @@ -56,7 +56,7 @@ function resolveTitleFor(future: Future): string { ? future.address.id : argumentTypeToString(future.address) })`; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return `Existing contract from Artifact - ${future.contractName} (${ typeof future.address === "string" ? future.address @@ -73,7 +73,7 @@ function resolveTitleFor(future: Future): string { const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return (

    Contract - {future.contractName}

    @@ -87,7 +87,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
    ); - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return (

    Contract - {future.contractName}

    @@ -101,19 +101,19 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
    ); - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return (

    Library - {future.contractName}

    ); - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return (

    Library - {future.contractName}

    ); - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return (

    Contract - {future.contract.contractName}

    @@ -126,7 +126,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
    ); - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return (

    Contract - {future.contract.contractName}

    @@ -139,7 +139,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
    ); - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return (

    Contract - {future.contractName}

    @@ -154,7 +154,7 @@ const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => {
    ); - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return (

    Contract - {future.contractName}

    diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/plan-overview/components/action.tsx index 79831d6602..356a0c1ae9 100644 --- a/packages/ui/src/pages/plan-overview/components/action.tsx +++ b/packages/ui/src/pages/plan-overview/components/action.tsx @@ -28,19 +28,19 @@ export const Action: React.FC<{ function toDisplayText(future: Future): string { switch (future.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return `Contract deploy ${future.contractName}`; - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return `Deploy contract ${future.contractName} from artifact`; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return `Library deploy ${future.contractName}`; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return `Library deploy ${future.contractName} from artifact`; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return `Call ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return `Static call ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract ${future.contractName} (${ typeof future.address === "string" ? future.address @@ -48,7 +48,7 @@ function toDisplayText(future: Future): string { ? future.address.id : argumentTypeToString(future.address) })`; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return `Existing contract ${future.contractName} from artifact (${ typeof future.address === "string" ? future.address @@ -85,10 +85,10 @@ const ActionBtn = styled.div<{ futureType: FutureType }>` ${(props) => [ - FutureType.NAMED_CONTRACT_DEPLOYMENT, - FutureType.ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.NAMED_LIBRARY_DEPLOYMENT, - FutureType.ARTIFACT_LIBRARY_DEPLOYMENT, + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.CONTRACT_DEPLOYMENT, + FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, + FutureType.LIBRARY_DEPLOYMENT, ].includes(props.futureType) && css` background: green; @@ -96,7 +96,7 @@ const ActionBtn = styled.div<{ futureType: FutureType }>` `} ${(props) => - [FutureType.NAMED_CONTRACT_CALL, FutureType.NAMED_STATIC_CALL].includes( + [FutureType.CONTRACT_CALL, FutureType.STATIC_CALL].includes( props.futureType ) && css` diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 430798df21..c6b0cfb9b5 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -74,19 +74,19 @@ function prettyPrintModule( function toLabel(f: Future): string { switch (f.type) { - case FutureType.NAMED_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: return `Deploy ${f.contractName}`; - case FutureType.ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: return `Deploy from artifact ${f.contractName}`; - case FutureType.NAMED_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: return `Deploy library ${f.contractName}`; - case FutureType.ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: return `Deploy library from artifact ${f.contractName}`; - case FutureType.NAMED_CONTRACT_CALL: + case FutureType.CONTRACT_CALL: return `Call ${f.contract.contractName}/${f.functionName}`; - case FutureType.NAMED_STATIC_CALL: + case FutureType.STATIC_CALL: return `Static call ${f.contract.contractName}/${f.functionName}`; - case FutureType.NAMED_CONTRACT_AT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract ${f.contractName} (${ typeof f.address === "string" ? f.address @@ -94,7 +94,7 @@ function toLabel(f: Future): string { ? f.address.id : argumentTypeToString(f.address) })`; - case FutureType.ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: return `Existing contract from artifact ${f.contractName} (${ typeof f.address === "string" ? f.address From c5b048d737ce66a3adf9897d98c9dd167c5d750c Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 19:37:35 +0000 Subject: [PATCH 0941/1302] Rename futures --- .../helpers/save-artifacts-for-future.ts | 12 +-- packages/core/src/internal/module-builder.ts | 58 +++++++------- packages/core/src/internal/module.ts | 38 ++++----- .../futures/reconcileArtifactContractAt.ts | 4 +- .../reconcileArtifactContractDeployment.ts | 4 +- .../reconcileArtifactLibraryDeployment.ts | 4 +- .../futures/reconcileNamedContractAt.ts | 4 +- .../futures/reconcileNamedContractCall.ts | 4 +- .../reconcileNamedContractDeployment.ts | 4 +- .../reconcileNamedLibraryDeployment.ts | 4 +- .../futures/reconcileNamedStaticCall.ts | 4 +- .../helpers/reconcile-address.ts | 6 +- .../helpers/reconcile-arguments.ts | 16 ++-- .../helpers/reconcile-artifacts.ts | 24 +++--- .../helpers/reconcile-contract-name.ts | 24 +++--- .../helpers/reconcile-contract.ts | 9 +-- .../reconciliation/helpers/reconcile-from.ts | 24 +++--- .../helpers/reconcile-function-name.ts | 9 +-- .../helpers/reconcile-libraries.ts | 16 ++-- .../reconciliation/helpers/reconcile-value.ts | 12 +-- .../stageOne/validateArtifactContractAt.ts | 4 +- .../validateArtifactContractDeployment.ts | 4 +- .../validateArtifactLibraryDeployment.ts | 4 +- .../stageOne/validateNamedContractAt.ts | 4 +- .../stageOne/validateNamedContractCall.ts | 4 +- .../validateNamedContractDeployment.ts | 4 +- .../validateNamedLibraryDeployment.ts | 4 +- .../stageOne/validateNamedStaticCall.ts | 4 +- .../stageTwo/validateArtifactContractAt.ts | 4 +- .../validateArtifactContractDeployment.ts | 4 +- .../validateArtifactLibraryDeployment.ts | 4 +- .../stageTwo/validateNamedContractAt.ts | 4 +- .../stageTwo/validateNamedContractCall.ts | 4 +- .../validateNamedContractDeployment.ts | 4 +- .../validateNamedLibraryDeployment.ts | 4 +- .../stageTwo/validateNamedStaticCall.ts | 4 +- .../core/src/stored-deployment-serializer.ts | 12 +-- packages/core/src/type-guards.ts | 36 ++++----- packages/core/src/types/module-builder.ts | 38 ++++----- packages/core/src/types/module.ts | 78 ++++++++++--------- .../helpers/build-initialize-message-for.ts | 36 ++++----- .../future-processor/named-contract-deploy.ts | 4 +- .../hardhat-plugin/src/ignition-helper.ts | 8 +- 43 files changed, 275 insertions(+), 281 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts index 13b6e6e9c3..c934dc6ae2 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts @@ -2,9 +2,9 @@ import { ArtifactResolver } from "../../../../types/artifact"; import { Future, FutureType, - NamedContractAtFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; @@ -38,9 +38,9 @@ export async function saveArtifactsForFuture( async function _storeArtifactAndBuildInfoAgainstDeployment( future: - | NamedLibraryDeploymentFuture - | NamedContractDeploymentFuture - | NamedContractAtFuture, + | NamedArtifactLibraryDeploymentFuture + | NamedArtifactContractDeploymentFuture + | NamedArtifactContractAtFuture, { deploymentLoader, artifactResolver, diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 94328cae45..d93bf43186 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -16,9 +16,9 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, CallableContractFuture, ContractFuture, FutureType, @@ -27,11 +27,11 @@ import { ModuleParameterRuntimeValue, ModuleParameterType, ModuleParameters, - NamedContractAtFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + NamedArtifactContractAtFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, } from "../types/module"; @@ -180,21 +180,21 @@ class IgnitionModuleBuilderImplementation< contractName: ContractNameT, args?: ArgumentType[], options?: ContractOptions - ): NamedContractDeploymentFuture; + ): NamedArtifactContractDeploymentFuture; public contract( contractName: string, artifact: Artifact, args?: ArgumentType[], options?: ContractOptions - ): ArtifactContractDeploymentFuture; + ): ContractDeploymentFuture; public contract( contractName: ContractNameT, artifactOrArgs?: Artifact | ArgumentType[], argsorOptions?: ArgumentType[] | ContractAtOptions, maybeOptions?: ContractOptions ): - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture { + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture { if (artifactOrArgs === undefined || Array.isArray(artifactOrArgs)) { if (Array.isArray(argsorOptions)) { this._throwErrorWithStackTrace( @@ -229,7 +229,7 @@ class IgnitionModuleBuilderImplementation< contractName: ContractNameT, args: ArgumentType[] = [], options: ContractOptions = {} - ): NamedContractDeploymentFuture { + ): NamedArtifactContractDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -280,7 +280,7 @@ class IgnitionModuleBuilderImplementation< artifact: Artifact, args: ArgumentType[] = [], options: ContractOptions = {} - ): ArtifactContractDeploymentFuture { + ): ContractDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -332,12 +332,12 @@ class IgnitionModuleBuilderImplementation< public library( libraryName: LibraryNameT, options?: LibraryOptions - ): NamedLibraryDeploymentFuture; + ): NamedArtifactLibraryDeploymentFuture; public library( libraryName: string, artifact: Artifact, options?: LibraryOptions - ): ArtifactLibraryDeploymentFuture; + ): LibraryDeploymentFuture; public library( libraryName: LibraryNameT, artifactOrOptions?: Artifact | LibraryOptions, @@ -353,7 +353,7 @@ class IgnitionModuleBuilderImplementation< private _namedArtifactLibrary( libraryName: LibraryNameT, options: LibraryOptions = {} - ): NamedLibraryDeploymentFuture { + ): NamedArtifactLibraryDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -395,7 +395,7 @@ class IgnitionModuleBuilderImplementation< libraryName: string, artifact: Artifact, options: LibraryOptions = {} - ): ArtifactLibraryDeploymentFuture { + ): LibraryDeploymentFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -439,7 +439,7 @@ class IgnitionModuleBuilderImplementation< functionName: FunctionNameT, args: ArgumentType[] = [], options: CallOptions = {} - ): NamedContractCallFuture { + ): ContractCallFuture { const futureId = toCallFutureId( this._module.id, options.id, @@ -489,7 +489,7 @@ class IgnitionModuleBuilderImplementation< args: ArgumentType[] = [], nameOrIndex: string | number = 0, options: StaticCallOptions = {} - ): NamedStaticCallFuture { + ): StaticCallFuture { const futureId = toCallFutureId( this._module.id, options.id, @@ -538,7 +538,7 @@ class IgnitionModuleBuilderImplementation< | AddressResolvableFuture | ModuleParameterRuntimeValue, options?: ContractAtOptions - ): NamedContractAtFuture; + ): NamedArtifactContractAtFuture; public contractAt( contractName: string, address: @@ -547,7 +547,7 @@ class IgnitionModuleBuilderImplementation< | ModuleParameterRuntimeValue, artifact: Artifact, options?: ContractAtOptions - ): ArtifactContractAtFuture; + ): ContractAtFuture; public contractAt( contractName: ContractNameT, address: @@ -580,7 +580,7 @@ class IgnitionModuleBuilderImplementation< | AddressResolvableFuture | ModuleParameterRuntimeValue, options: ContractAtOptions = {} - ): NamedContractAtFuture { + ): NamedArtifactContractAtFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -622,7 +622,7 @@ class IgnitionModuleBuilderImplementation< | ModuleParameterRuntimeValue, artifact: Artifact, options: ContractAtOptions = {} - ): ArtifactContractAtFuture { + ): ContractAtFuture { const futureId = toDeploymentFutureId( this._module.id, options.id, @@ -660,10 +660,10 @@ class IgnitionModuleBuilderImplementation< public readEventArgument( futureToReadFrom: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture | SendDataFuture - | NamedContractCallFuture, + | ContractCallFuture, eventName: string, nameOrIndex: string | number, options: ReadEventArgumentOptions = {} @@ -683,8 +683,8 @@ class IgnitionModuleBuilderImplementation< "contract" in futureToReadFrom ? futureToReadFrom.contract : (futureToReadFrom as - | ArtifactContractDeploymentFuture - | NamedContractDeploymentFuture); + | ContractDeploymentFuture + | NamedArtifactContractDeploymentFuture); const emitter = options.emitter ?? contractToReadFrom; diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index cf9398aed7..966a6e24de 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -3,9 +3,9 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, ContractFuture, Future, FutureType, @@ -13,11 +13,11 @@ import { IgnitionModuleResult, ModuleParameterRuntimeValue, ModuleParameterType, - NamedContractAtFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + NamedArtifactContractAtFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, ReadEventArgumentFuture, RuntimeValueType, SendDataFuture, @@ -54,7 +54,7 @@ export class NamedContractDeploymentFutureImplementation< ContractNameT extends string > extends BaseFutureImplementation - implements NamedContractDeploymentFuture + implements NamedArtifactContractDeploymentFuture { constructor( public readonly id: string, @@ -73,7 +73,7 @@ export class ArtifactContractDeploymentFutureImplementation< ContractNameT extends string > extends BaseFutureImplementation - implements ArtifactContractDeploymentFuture + implements ContractDeploymentFuture { constructor( public readonly id: string, @@ -93,7 +93,7 @@ export class NamedLibraryDeploymentFutureImplementation< LibraryNameT extends string > extends BaseFutureImplementation - implements NamedLibraryDeploymentFuture + implements NamedArtifactLibraryDeploymentFuture { constructor( public readonly id: string, @@ -110,7 +110,7 @@ export class ArtifactLibraryDeploymentFutureImplementation< LibraryNameT extends string > extends BaseFutureImplementation - implements ArtifactLibraryDeploymentFuture + implements LibraryDeploymentFuture { constructor( public readonly id: string, @@ -129,7 +129,7 @@ export class NamedContractCallFutureImplementation< FunctionNameT extends string > extends BaseFutureImplementation - implements NamedContractCallFuture + implements ContractCallFuture { constructor( public readonly id: string, @@ -149,7 +149,7 @@ export class NamedStaticCallFutureImplementation< FunctionNameT extends string > extends BaseFutureImplementation - implements NamedStaticCallFuture + implements StaticCallFuture { constructor( public readonly id: string, @@ -166,7 +166,7 @@ export class NamedStaticCallFutureImplementation< export class NamedContractAtFutureImplementation extends BaseFutureImplementation - implements NamedContractAtFuture + implements NamedArtifactContractAtFuture { constructor( public readonly id: string, @@ -183,7 +183,7 @@ export class NamedContractAtFutureImplementation export class ArtifactContractAtFutureImplementation extends BaseFutureImplementation - implements ArtifactContractAtFuture + implements ContractAtFuture { constructor( public readonly id: string, @@ -207,10 +207,10 @@ export class ReadEventArgumentFutureImplementation public readonly id: string, public readonly module: IgnitionModuleImplementation, public readonly futureToReadFrom: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture | SendDataFuture - | NamedContractCallFuture, + | ContractCallFuture, public readonly eventName: string, public readonly nameOrIndex: string | number, public readonly emitter: ContractFuture, diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts index ff8fa925eb..82182cc8de 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -1,4 +1,4 @@ -import { ArtifactContractAtFuture } from "../../../types/module"; +import { ContractAtFuture } from "../../../types/module"; import { ContractAtExecutionState } from "../../execution/types/execution-state"; import { reconcileAddress } from "../helpers/reconcile-address"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; @@ -6,7 +6,7 @@ import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileArtifactContractAt( - future: ArtifactContractAtFuture, + future: ContractAtFuture, executionState: ContractAtExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index b0c7be1502..33abd0ac89 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -1,4 +1,4 @@ -import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { ContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../execution/types/execution-state"; import { reconcileArguments } from "../helpers/reconcile-arguments"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; @@ -9,7 +9,7 @@ import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileArtifactContractDeployment( - future: ArtifactContractDeploymentFuture, + future: ContractDeploymentFuture, executionState: DeploymentExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index a13a656b74..0bcaebf581 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -1,4 +1,4 @@ -import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { LibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../execution/types/execution-state"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; @@ -7,7 +7,7 @@ import { reconcileLibraries } from "../helpers/reconcile-libraries"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileArtifactLibraryDeployment( - future: ArtifactLibraryDeploymentFuture, + future: LibraryDeploymentFuture, executionState: DeploymentExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts index 958cbf330e..fbe46daa08 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -1,4 +1,4 @@ -import { NamedContractAtFuture } from "../../../types/module"; +import { NamedArtifactContractAtFuture } from "../../../types/module"; import { ContractAtExecutionState } from "../../execution/types/execution-state"; import { reconcileAddress } from "../helpers/reconcile-address"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; @@ -6,7 +6,7 @@ import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileNamedContractAt( - future: NamedContractAtFuture, + future: NamedArtifactContractAtFuture, executionState: ContractAtExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts index 8ee4e9dd91..02f2195c9e 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -1,4 +1,4 @@ -import { NamedContractCallFuture } from "../../../types/module"; +import { ContractCallFuture } from "../../../types/module"; import { CallExecutionState } from "../../execution/types/execution-state"; import { reconcileArguments } from "../helpers/reconcile-arguments"; import { reconcileContract } from "../helpers/reconcile-contract"; @@ -8,7 +8,7 @@ import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export function reconcileNamedContractCall( - future: NamedContractCallFuture, + future: ContractCallFuture, executionState: CallExecutionState, context: ReconciliationContext ): ReconciliationFutureResult { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index c7dc411dfb..5d34bcd121 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -1,4 +1,4 @@ -import { NamedContractDeploymentFuture } from "../../../types/module"; +import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../execution/types/execution-state"; import { reconcileArguments } from "../helpers/reconcile-arguments"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; @@ -9,7 +9,7 @@ import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileNamedContractDeployment( - future: NamedContractDeploymentFuture, + future: NamedArtifactContractDeploymentFuture, executionState: DeploymentExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index a01e7963e2..41400165a9 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -1,4 +1,4 @@ -import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; import { DeploymentExecutionState } from "../../execution/types/execution-state"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; @@ -7,7 +7,7 @@ import { reconcileLibraries } from "../helpers/reconcile-libraries"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileNamedLibraryDeployment( - future: NamedLibraryDeploymentFuture, + future: NamedArtifactLibraryDeploymentFuture, executionState: DeploymentExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts index b1f8895e13..a816fd53fd 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -1,4 +1,4 @@ -import { NamedStaticCallFuture } from "../../../types/module"; +import { StaticCallFuture } from "../../../types/module"; import { StaticCallExecutionState } from "../../execution/types/execution-state"; import { compare } from "../helpers/compare"; import { reconcileArguments } from "../helpers/reconcile-arguments"; @@ -8,7 +8,7 @@ import { reconcileFunctionName } from "../helpers/reconcile-function-name"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export function reconcileNamedStaticCall( - future: NamedStaticCallFuture, + future: StaticCallFuture, executionState: StaticCallExecutionState, context: ReconciliationContext ): ReconciliationFutureResult { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts index 6c41149137..23e16d0528 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts @@ -1,6 +1,6 @@ import { - ArtifactContractAtFuture, - NamedContractAtFuture, + ContractAtFuture, + NamedArtifactContractAtFuture, } from "../../../types/module"; import { resolveAddressLike } from "../../execution/future-processor/helpers/future-resolvers"; import { ContractAtExecutionState } from "../../execution/types/execution-state"; @@ -12,7 +12,7 @@ import { import { compare } from "./compare"; export function reconcileAddress( - future: NamedContractAtFuture | ArtifactContractAtFuture, + future: NamedArtifactContractAtFuture | ContractAtFuture, exState: ContractAtExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts index bb649e9592..071c09529d 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts @@ -1,9 +1,9 @@ import { isDeploymentFuture } from "../../../type-guards"; import { - ArtifactContractDeploymentFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedStaticCallFuture, + ContractDeploymentFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + StaticCallFuture, } from "../../../types/module"; import { resolveArgs } from "../../execution/future-processor/helpers/future-resolvers"; import { @@ -20,10 +20,10 @@ import { fail } from "../utils"; export function reconcileArguments( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedStaticCallFuture - | NamedContractCallFuture, + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | StaticCallFuture + | ContractCallFuture, exState: | DeploymentExecutionState | CallExecutionState diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts index b262350aa1..6318280c87 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts @@ -1,10 +1,10 @@ import { - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, - NamedContractAtFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, } from "../../../types/module"; import { ContractAtExecutionState, @@ -18,12 +18,12 @@ import { fail, getBytecodeWithoutMetadata } from "../utils"; export async function reconcileArtifacts( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture - | NamedContractAtFuture - | ArtifactContractAtFuture, + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | NamedArtifactContractAtFuture + | ContractAtFuture, exState: DeploymentExecutionState | ContractAtExecutionState, context: ReconciliationContext ): Promise { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts index e412e328ab..c3e1d04ecd 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts @@ -1,10 +1,10 @@ import { - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, - NamedContractAtFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, } from "../../../types/module"; import { ContractAtExecutionState, @@ -19,12 +19,12 @@ import { compare } from "./compare"; export function reconcileContractName( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture - | NamedContractAtFuture - | ArtifactContractAtFuture, + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | NamedArtifactContractAtFuture + | ContractAtFuture, exState: DeploymentExecutionState | ContractAtExecutionState, _context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts index 3fb7093d47..c1292106b0 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts @@ -1,7 +1,4 @@ -import { - NamedContractCallFuture, - NamedStaticCallFuture, -} from "../../../types/module"; +import { ContractCallFuture, StaticCallFuture } from "../../../types/module"; import { resolveAddressLike } from "../../execution/future-processor/helpers/future-resolvers"; import { CallExecutionState, @@ -15,9 +12,7 @@ import { import { compare } from "./compare"; export function reconcileContract( - future: - | NamedContractCallFuture - | NamedStaticCallFuture, + future: ContractCallFuture | StaticCallFuture, exState: CallExecutionState | StaticCallExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts index a07cac7ed8..287be15621 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts @@ -1,10 +1,10 @@ import { - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, SendDataFuture, } from "../../../types/module"; import { resolveFutureFrom } from "../../execution/future-processor/helpers/future-resolvers"; @@ -23,12 +23,12 @@ import { compare } from "./compare"; export function reconcileFrom( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture - | NamedContractCallFuture - | NamedStaticCallFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | ContractCallFuture + | StaticCallFuture | SendDataFuture, exState: | DeploymentExecutionState diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts index e2a73c517a..023005d9d4 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts @@ -1,7 +1,4 @@ -import { - NamedContractCallFuture, - NamedStaticCallFuture, -} from "../../../types/module"; +import { ContractCallFuture, StaticCallFuture } from "../../../types/module"; import { CallExecutionState, StaticCallExecutionState, @@ -14,9 +11,7 @@ import { import { compare } from "./compare"; export function reconcileFunctionName( - future: - | NamedContractCallFuture - | NamedStaticCallFuture, + future: ContractCallFuture | StaticCallFuture, exState: CallExecutionState | StaticCallExecutionState, _context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts index eef509e6db..0e26ba6a1b 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts @@ -1,8 +1,8 @@ import { - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, } from "../../../types/module"; import { resolveLibraries } from "../../execution/future-processor/helpers/future-resolvers"; import { DeploymentExecutionState } from "../../execution/types/execution-state"; @@ -14,10 +14,10 @@ import { fail } from "../utils"; export function reconcileLibraries( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture, + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture, exState: DeploymentExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts index a1201b6227..67d5e58e3d 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts @@ -1,7 +1,7 @@ import { - ArtifactContractDeploymentFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, + ContractDeploymentFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, SendDataFuture, } from "../../../types/module"; import { resolveValue } from "../../execution/future-processor/helpers/future-resolvers"; @@ -19,9 +19,9 @@ import { compare } from "./compare"; export function reconcileValue( future: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedContractCallFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | ContractCallFuture | SendDataFuture, exState: | DeploymentExecutionState diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts index 6b8ec94876..56917f6540 100644 --- a/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts @@ -1,8 +1,8 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactContractAtFuture } from "../../../types/module"; +import { ContractAtFuture } from "../../../types/module"; export async function validateArtifactContractAt( - _future: ArtifactContractAtFuture, + _future: ContractAtFuture, _artifactLoader: ArtifactResolver ) { return; // no-op diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts index ae6d03d457..f98fd9a1f0 100644 --- a/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts @@ -1,10 +1,10 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { ContractDeploymentFuture } from "../../../types/module"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; export async function validateArtifactContractDeployment( - future: ArtifactContractDeploymentFuture, + future: ContractDeploymentFuture, _artifactLoader: ArtifactResolver ) { const artifact = future.artifact; diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts index 93fbe7082d..54ae6b9f88 100644 --- a/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts @@ -1,8 +1,8 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { LibraryDeploymentFuture } from "../../../types/module"; export async function validateArtifactLibraryDeployment( - _future: ArtifactLibraryDeploymentFuture, + _future: LibraryDeploymentFuture, _artifactLoader: ArtifactResolver ) { return; // no-op diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts index 4aa4cdc48e..48c3a4eee3 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts @@ -1,10 +1,10 @@ import { IgnitionValidationError } from "../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractAtFuture } from "../../../types/module"; +import { NamedArtifactContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( - future: NamedContractAtFuture, + future: NamedArtifactContractAtFuture, artifactLoader: ArtifactResolver ) { const artifact = await artifactLoader.loadArtifact(future.contractName); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts index 0095a19865..c5212e7ddd 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts @@ -1,14 +1,14 @@ import { IgnitionValidationError } from "../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractCallFuture } from "../../../types/module"; +import { ContractCallFuture } from "../../../types/module"; import { validateArtifactFunction, validateArtifactFunctionName, } from "../../execution/abi"; export async function validateNamedContractCall( - future: NamedContractCallFuture, + future: ContractCallFuture, artifactLoader: ArtifactResolver ) { const artifact = diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts index be21bbafde..edf99355d0 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts @@ -1,12 +1,12 @@ import { IgnitionValidationError } from "../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedContractDeploymentFuture } from "../../../types/module"; +import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; export async function validateNamedContractDeployment( - future: NamedContractDeploymentFuture, + future: NamedArtifactContractDeploymentFuture, artifactLoader: ArtifactResolver ) { const artifact = await artifactLoader.loadArtifact(future.contractName); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts index b477df7c4b..1025bc98d9 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts @@ -1,11 +1,11 @@ import { IgnitionValidationError } from "../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; import { validateLibraryNames } from "../../execution/libraries"; export async function validateNamedLibraryDeployment( - future: NamedLibraryDeploymentFuture, + future: NamedArtifactLibraryDeploymentFuture, artifactLoader: ArtifactResolver ) { const artifact = await artifactLoader.loadArtifact(future.contractName); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts index 46ababb8db..dec782b6a8 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts @@ -1,14 +1,14 @@ import { IgnitionValidationError } from "../../../errors"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; -import { NamedStaticCallFuture } from "../../../types/module"; +import { StaticCallFuture } from "../../../types/module"; import { validateArtifactFunction, validateFunctionArgumentParamType, } from "../../execution/abi"; export async function validateNamedStaticCall( - future: NamedStaticCallFuture, + future: StaticCallFuture, artifactLoader: ArtifactResolver ) { const artifact = diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts index fc65b80816..eeac6e55aa 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts @@ -2,10 +2,10 @@ import { IgnitionValidationError } from "../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { ArtifactContractAtFuture } from "../../../types/module"; +import { ContractAtFuture } from "../../../types/module"; export async function validateArtifactContractAt( - future: ArtifactContractAtFuture, + future: ContractAtFuture, _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, _accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts index 8f6625d378..4ed1068e28 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts @@ -5,14 +5,14 @@ import { } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { ArtifactContractDeploymentFuture } from "../../../types/module"; +import { ContractDeploymentFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; export async function validateArtifactContractDeployment( - future: ArtifactContractDeploymentFuture, + future: ContractDeploymentFuture, _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts index c1d8ec6a8c..ee5c974d4d 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts @@ -1,12 +1,12 @@ import { isAccountRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { ArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { LibraryDeploymentFuture } from "../../../types/module"; import { validateLibraryNames } from "../../execution/libraries"; import { validateAccountRuntimeValue } from "../utils"; export async function validateArtifactLibraryDeployment( - future: ArtifactLibraryDeploymentFuture, + future: LibraryDeploymentFuture, _artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts index 587344f2b7..1f9c64e9cf 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts @@ -2,10 +2,10 @@ import { IgnitionValidationError } from "../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { NamedContractAtFuture } from "../../../types/module"; +import { NamedArtifactContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( - future: NamedContractAtFuture, + future: NamedArtifactContractAtFuture, _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, _accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts index 18ab152c8e..e8cbe454e3 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts @@ -5,14 +5,14 @@ import { } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { NamedContractCallFuture } from "../../../types/module"; +import { ContractCallFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; export async function validateNamedContractCall( - future: NamedContractCallFuture, + future: ContractCallFuture, _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts index 20affce6ae..f8b76dad80 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts @@ -5,14 +5,14 @@ import { } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { NamedContractDeploymentFuture } from "../../../types/module"; +import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; export async function validateNamedContractDeployment( - future: NamedContractDeploymentFuture, + future: NamedArtifactContractDeploymentFuture, artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts index 8787fd30da..705c8e55f9 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts @@ -1,11 +1,11 @@ import { isAccountRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { NamedLibraryDeploymentFuture } from "../../../types/module"; +import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; import { validateAccountRuntimeValue } from "../utils"; export async function validateNamedLibraryDeployment( - future: NamedLibraryDeploymentFuture, + future: NamedArtifactLibraryDeploymentFuture, _artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts index 093dbb3b0a..36becb052c 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts @@ -5,14 +5,14 @@ import { } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; -import { NamedStaticCallFuture } from "../../../types/module"; +import { StaticCallFuture } from "../../../types/module"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; export async function validateNamedStaticCall( - future: NamedStaticCallFuture, + future: StaticCallFuture, _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] diff --git a/packages/core/src/stored-deployment-serializer.ts b/packages/core/src/stored-deployment-serializer.ts index 6c933ea8ed..70fe5ae6f1 100644 --- a/packages/core/src/stored-deployment-serializer.ts +++ b/packages/core/src/stored-deployment-serializer.ts @@ -29,7 +29,7 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, - ArtifactContractDeploymentFuture, + ContractDeploymentFuture, ContractFuture, Future, FutureType, @@ -37,8 +37,8 @@ import { IgnitionModuleResult, ModuleParameterRuntimeValue, ModuleParameterType, - NamedContractCallFuture, - NamedContractDeploymentFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, RuntimeValueType, } from "./types/module"; import { @@ -793,9 +793,9 @@ export class StoredDeploymentDeserializer { futuresLookup, serializedFuture.futureToReadFrom.futureId ) as - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedContractCallFuture, + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | ContractCallFuture, serializedFuture.eventName, serializedFuture.nameOrIndex, this._lookup( diff --git a/packages/core/src/type-guards.ts b/packages/core/src/type-guards.ts index 7e468fde17..eec1dc5842 100644 --- a/packages/core/src/type-guards.ts +++ b/packages/core/src/type-guards.ts @@ -2,9 +2,9 @@ import { Artifact } from "./types/artifact"; import { AccountRuntimeValue, AddressResolvableFuture, - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, CallableContractFuture, ContractFuture, DeploymentFuture, @@ -12,10 +12,10 @@ import { Future, FutureType, ModuleParameterRuntimeValue, - NamedContractAtFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, ReadEventArgumentFuture, RuntimeValue, RuntimeValueType, @@ -159,7 +159,7 @@ export function isFunctionCallFuture( */ export function isNamedStaticCallFuture( future: Future -): future is NamedStaticCallFuture { +): future is StaticCallFuture { return future.type === FutureType.STATIC_CALL; } @@ -170,7 +170,7 @@ export function isNamedStaticCallFuture( */ export function isReadEventArgumentFuture( future: Future -): future is NamedStaticCallFuture { +): future is StaticCallFuture { return future.type === FutureType.READ_EVENT_ARGUMENT; } @@ -181,7 +181,7 @@ export function isReadEventArgumentFuture( */ export function isNamedContractDeploymentFuture( future: Future -): future is NamedContractDeploymentFuture { +): future is NamedArtifactContractDeploymentFuture { return future.type === FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; } @@ -192,7 +192,7 @@ export function isNamedContractDeploymentFuture( */ export function isArtifactContractDeploymentFuture( future: Future -): future is ArtifactContractDeploymentFuture { +): future is ContractDeploymentFuture { return future.type === FutureType.CONTRACT_DEPLOYMENT; } @@ -203,7 +203,7 @@ export function isArtifactContractDeploymentFuture( */ export function isNamedLibraryDeploymentFuture( future: Future -): future is NamedLibraryDeploymentFuture { +): future is NamedArtifactLibraryDeploymentFuture { return future.type === FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; } @@ -214,7 +214,7 @@ export function isNamedLibraryDeploymentFuture( */ export function isArtifactLibraryDeploymentFuture( future: Future -): future is ArtifactLibraryDeploymentFuture { +): future is LibraryDeploymentFuture { return future.type === FutureType.LIBRARY_DEPLOYMENT; } @@ -225,7 +225,7 @@ export function isArtifactLibraryDeploymentFuture( */ export function isNamedContractAtFuture( future: Future -): future is NamedContractAtFuture { +): future is NamedArtifactContractAtFuture { return future.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT; } @@ -236,7 +236,7 @@ export function isNamedContractAtFuture( */ export function isArtifactContractAtFuture( future: Future -): future is ArtifactContractAtFuture { +): future is ContractAtFuture { return future.type === FutureType.CONTRACT_AT; } @@ -282,12 +282,12 @@ export function isFutureThatSubmitsOnchainTransaction( ): f is Exclude< Exclude< Exclude< - Exclude>, + Exclude>, ReadEventArgumentFuture >, - NamedContractAtFuture + NamedArtifactContractAtFuture >, - ArtifactContractAtFuture + ContractAtFuture > { return ( !isNamedStaticCallFuture(f) && diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index ee3d647d1c..b24d5fea20 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -3,9 +3,9 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, CallableContractFuture, ContractFuture, Future, @@ -13,11 +13,11 @@ import { IgnitionModuleResult, ModuleParameterRuntimeValue, ModuleParameterType, - NamedContractAtFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + NamedArtifactContractAtFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, } from "./module"; @@ -131,32 +131,32 @@ export interface IgnitionModuleBuilder { contractName: ContractNameT, args?: ArgumentType[], options?: ContractOptions - ): NamedContractDeploymentFuture; + ): NamedArtifactContractDeploymentFuture; contract( contractName: string, artifact: Artifact, args?: ArgumentType[], options?: ContractOptions - ): ArtifactContractDeploymentFuture; + ): ContractDeploymentFuture; library( libraryName: LibraryNameT, options?: LibraryOptions - ): NamedLibraryDeploymentFuture; + ): NamedArtifactLibraryDeploymentFuture; library( libraryName: string, artifact: Artifact, options?: LibraryOptions - ): ArtifactLibraryDeploymentFuture; + ): LibraryDeploymentFuture; call( contractFuture: CallableContractFuture, functionName: FunctionNameT, args?: ArgumentType[], options?: CallOptions - ): NamedContractCallFuture; + ): ContractCallFuture; staticCall( contractFuture: CallableContractFuture, @@ -164,7 +164,7 @@ export interface IgnitionModuleBuilder { args?: ArgumentType[], nameOrIndex?: string | number, options?: StaticCallOptions - ): NamedStaticCallFuture; + ): StaticCallFuture; contractAt( contractName: ContractNameT, @@ -173,7 +173,7 @@ export interface IgnitionModuleBuilder { | AddressResolvableFuture | ModuleParameterRuntimeValue, options?: ContractAtOptions - ): NamedContractAtFuture; + ): NamedArtifactContractAtFuture; contractAt( contractName: string, @@ -183,14 +183,14 @@ export interface IgnitionModuleBuilder { | ModuleParameterRuntimeValue, artifact: Artifact, options?: ContractAtOptions - ): ArtifactContractAtFuture; + ): ContractAtFuture; readEventArgument( futureToReadFrom: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture | SendDataFuture - | NamedContractCallFuture, + | ContractCallFuture, eventName: string, nameOrIndex: string | number, options?: ReadEventArgumentOptions diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index a3132543f8..70b45a490d 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -12,7 +12,7 @@ export type BaseArgumentType = | string | boolean | ContractFuture - | NamedStaticCallFuture + | StaticCallFuture | ReadEventArgumentFuture | RuntimeValue; @@ -50,14 +50,14 @@ export enum FutureType { * @beta */ export type Future = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture - | NamedContractCallFuture - | NamedStaticCallFuture - | NamedContractAtFuture - | ArtifactContractAtFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | ContractCallFuture + | StaticCallFuture + | NamedArtifactContractAtFuture + | ContractAtFuture | ReadEventArgumentFuture | SendDataFuture; @@ -68,12 +68,12 @@ export type Future = * @beta */ export type ContractFuture = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture - | NamedContractAtFuture - | ArtifactContractAtFuture; + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | NamedArtifactContractAtFuture + | ContractAtFuture; /** * A future representing only contracts that can be called off-chain (i.e. not libraries). @@ -82,10 +82,10 @@ export type ContractFuture = * @beta */ export type CallableContractFuture = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedContractAtFuture - | ArtifactContractAtFuture; + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactContractAtFuture + | ContractAtFuture; /** * A future representing a deployment. @@ -93,10 +93,10 @@ export type CallableContractFuture = * @beta */ export type DeploymentFuture = - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture - | NamedLibraryDeploymentFuture - | ArtifactLibraryDeploymentFuture; + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture; /** * A future representing a call. Either a static one or one that modifies contract state @@ -107,8 +107,8 @@ export type FunctionCallFuture< ContractNameT extends string, FunctionNameT extends string > = - | NamedContractCallFuture - | NamedStaticCallFuture; + | ContractCallFuture + | StaticCallFuture; /** * A future that can be resolved to a standard Ethereum address. @@ -117,7 +117,7 @@ export type FunctionCallFuture< */ export type AddressResolvableFuture = | ContractFuture - | NamedStaticCallFuture + | StaticCallFuture | ReadEventArgumentFuture; /** @@ -125,7 +125,9 @@ export type AddressResolvableFuture = * * @beta */ -export interface NamedContractDeploymentFuture { +export interface NamedArtifactContractDeploymentFuture< + ContractNameT extends string +> { type: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; @@ -143,7 +145,7 @@ export interface NamedContractDeploymentFuture { * * @beta */ -export interface ArtifactContractDeploymentFuture { +export interface ContractDeploymentFuture { type: FutureType.CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; @@ -161,7 +163,9 @@ export interface ArtifactContractDeploymentFuture { * * @beta */ -export interface NamedLibraryDeploymentFuture { +export interface NamedArtifactLibraryDeploymentFuture< + LibraryNameT extends string +> { type: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; @@ -177,7 +181,7 @@ export interface NamedLibraryDeploymentFuture { * * @beta */ -export interface ArtifactLibraryDeploymentFuture { +export interface LibraryDeploymentFuture { type: FutureType.LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; @@ -193,7 +197,7 @@ export interface ArtifactLibraryDeploymentFuture { * * @beta */ -export interface NamedContractCallFuture< +export interface ContractCallFuture< ContractNameT extends string, FunctionNameT extends string > { @@ -213,7 +217,7 @@ export interface NamedContractCallFuture< * * @beta */ -export interface NamedStaticCallFuture< +export interface StaticCallFuture< ContractNameT extends string, FunctionNameT extends string > { @@ -233,7 +237,7 @@ export interface NamedStaticCallFuture< * * @beta */ -export interface NamedContractAtFuture { +export interface NamedArtifactContractAtFuture { type: FutureType.NAMED_ARTIFACT_CONTRACT_AT; id: string; module: IgnitionModule; @@ -251,7 +255,7 @@ export interface NamedContractAtFuture { * * @beta */ -export interface ArtifactContractAtFuture { +export interface ContractAtFuture { type: FutureType.CONTRACT_AT; id: string; module: IgnitionModule; @@ -276,10 +280,10 @@ export interface ReadEventArgumentFuture { module: IgnitionModule; dependencies: Set; futureToReadFrom: - | NamedContractDeploymentFuture - | ArtifactContractDeploymentFuture + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture | SendDataFuture - | NamedContractCallFuture; + | ContractCallFuture; eventName: string; nameOrIndex: string | number; emitter: ContractFuture; diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index ceb94ed84a..a5c0a72dec 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -46,15 +46,15 @@ import { SendDataFutureImplementation, } from "../../../../src/internal/module"; import { - ArtifactContractAtFuture, - ArtifactContractDeploymentFuture, - ArtifactLibraryDeploymentFuture, + ContractAtFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, FutureType, - NamedContractAtFuture, - NamedContractCallFuture, - NamedContractDeploymentFuture, - NamedLibraryDeploymentFuture, - NamedStaticCallFuture, + NamedArtifactContractAtFuture, + ContractCallFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, } from "../../../../src/types/module"; @@ -69,16 +69,16 @@ describe("buildInitializeMessageFor", () => { const libraryAddress = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; const basicStrategy = { name: "basic" } as any; - let namedContractDeployment: NamedContractDeploymentFuture; - let anotherNamedContractDeployment: NamedContractDeploymentFuture; - let safeMathLibraryDeployment: NamedLibraryDeploymentFuture; - let artifactContractDeployment: ArtifactContractDeploymentFuture; - let namedLibraryDeployment: NamedLibraryDeploymentFuture; - let artifactLibraryDeployment: ArtifactLibraryDeploymentFuture; - let namedContractCall: NamedContractCallFuture; - let staticCall: NamedStaticCallFuture; - let namedContractAt: NamedContractAtFuture; - let artifactContractAt: ArtifactContractAtFuture; + let namedContractDeployment: NamedArtifactContractDeploymentFuture; + let anotherNamedContractDeployment: NamedArtifactContractDeploymentFuture; + let safeMathLibraryDeployment: NamedArtifactLibraryDeploymentFuture; + let artifactContractDeployment: ContractDeploymentFuture; + let namedLibraryDeployment: NamedArtifactLibraryDeploymentFuture; + let artifactLibraryDeployment: LibraryDeploymentFuture; + let namedContractCall: ContractCallFuture; + let staticCall: StaticCallFuture; + let namedContractAt: NamedArtifactContractAtFuture; + let artifactContractAt: ContractAtFuture; let readEventArgument: ReadEventArgumentFuture; let sendData: SendDataFuture; diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/core/test/execution/future-processor/named-contract-deploy.ts index bada0eef64..8f82a9ccf3 100644 --- a/packages/core/test/execution/future-processor/named-contract-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-deploy.ts @@ -1,6 +1,6 @@ import { assert } from "chai"; -import { NamedContractDeploymentFuture } from "../../../src"; +import { NamedArtifactContractDeploymentFuture } from "../../../src"; import { TransactionParams } from "../../../src/internal/execution/jsonrpc-client"; import { deploymentStateReducer } from "../../../src/internal/execution/reducers/deployment-state-reducer"; import { ExecutionResultType } from "../../../src/internal/execution/types/execution-result"; @@ -27,7 +27,7 @@ describe("future processor", () => { // Arrange const fakeModule = {} as any; - const deploymentFuture: NamedContractDeploymentFuture = + const deploymentFuture: NamedArtifactContractDeploymentFuture = new NamedContractDeploymentFutureImplementation( "MyModule:TestContract", fakeModule, diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index a44806da0d..ead8e254cc 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -11,8 +11,8 @@ import { IgnitionModule, IgnitionModuleResult, isContractFuture, - NamedContractAtFuture, - NamedContractDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, SuccessfulDeploymentResult, } from "@ignored/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; @@ -157,8 +157,8 @@ export type IgnitionModuleResultsTToEthersContracts< IgnitionModuleResultsT extends IgnitionModuleResult > = { [contract in keyof IgnitionModuleResultsT]: IgnitionModuleResultsT[contract] extends - | NamedContractDeploymentFuture - | NamedContractAtFuture + | NamedArtifactContractDeploymentFuture + | NamedArtifactContractAtFuture ? TypeChainEthersContractByName : Contract; }; From 5bcdd1a099aa0fd49b1e67ba0dfadfa8f0eda854 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 14 Sep 2023 19:43:50 +0000 Subject: [PATCH 0942/1302] Fix a broken test --- packages/core/test/reconciliation/reconciler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 7e817c9299..437da16460 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -125,7 +125,7 @@ describe("Reconciliation", () => { { futureId: "Module1#Example", failure: - "Future with id Module1#Example has changed from NAMED_CONTRACT_DEPLOYMENT to NAMED_LIBRARY_DEPLOYMENT", + "Future with id Module1#Example has changed from NAMED_ARTIFACT_CONTRACT_DEPLOYMENT to NAMED_ARTIFACT_LIBRARY_DEPLOYMENT", }, ]); }); From d6bff1fbf97cba5623e84c68424b210f992bccfa Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 12:07:30 +0100 Subject: [PATCH 0943/1302] feat: rename plan to visualize We intend to support viewing an already run deployment, hence plan makes less sense. Instead we will go with the more generic visualize for the moment. --- README.md | 2 +- docs/images/{plan-1.png => visualize-1.png} | Bin docs/images/{plan-2.png => visualize-2.png} | Bin docs/running-a-deployment.md | 18 ++-- packages/core/src/index.ts | 4 +- packages/core/src/ui-helpers.ts | 2 +- packages/core/src/{plan.ts => visualize.ts} | 2 +- packages/hardhat-plugin/README.md | 2 +- packages/hardhat-plugin/src/index.ts | 16 ++-- .../write-visualization.ts} | 8 +- packages/hardhat-plugin/test/plan/index.ts | 12 +-- packages/ui/README.md | 4 +- packages/ui/src/main.tsx | 4 +- .../plan-overview/components/plan-details.tsx | 37 --------- .../plan-overview/components/plan-summary.tsx | 78 ------------------ .../src/pages/plan-overview/plan-overview.tsx | 25 ------ .../components/action.tsx | 0 .../components/visualization-details.tsx | 36 ++++++++ .../components/visualization-summary.tsx | 77 +++++++++++++++++ .../visualization-overview.tsx | 24 ++++++ 20 files changed, 175 insertions(+), 176 deletions(-) rename docs/images/{plan-1.png => visualize-1.png} (100%) rename docs/images/{plan-2.png => visualize-2.png} (100%) rename packages/core/src/{plan.ts => visualize.ts} (94%) rename packages/hardhat-plugin/src/{plan/write-plan.ts => visualization/write-visualization.ts} (77%) delete mode 100644 packages/ui/src/pages/plan-overview/components/plan-details.tsx delete mode 100644 packages/ui/src/pages/plan-overview/components/plan-summary.tsx delete mode 100644 packages/ui/src/pages/plan-overview/plan-overview.tsx rename packages/ui/src/pages/{plan-overview => visualization-overview}/components/action.tsx (100%) create mode 100644 packages/ui/src/pages/visualization-overview/components/visualization-details.tsx create mode 100644 packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx create mode 100644 packages/ui/src/pages/visualization-overview/visualization-overview.tsx diff --git a/README.md b/README.md index c6baa835db..e9b8d0894e 100644 --- a/README.md +++ b/README.md @@ -44,7 +44,7 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Switching based on the _Network Chain ID_](./docs/creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) - [Using Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) - [Running a deployment](./docs/running-a-deployment.md) - - [Visualizing your deployment with the `plan` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) + - [Visualizing your deployment with the `visualize` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) - [Executing the deployment](./docs/running-a-deployment.md#executing-the-deployment) ### Examples diff --git a/docs/images/plan-1.png b/docs/images/visualize-1.png similarity index 100% rename from docs/images/plan-1.png rename to docs/images/visualize-1.png diff --git a/docs/images/plan-2.png b/docs/images/visualize-2.png similarity index 100% rename from docs/images/plan-2.png rename to docs/images/visualize-2.png diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 14b12762df..5cc484a027 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -4,34 +4,34 @@ ### Table of Contents -- [Visualizing your deployment with the `plan` task](./running-a-deployment.md#visualizing-your-deployment-with-the-plan-task) +- [Visualizing your deployment with the `visualize` task](./running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) - [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - [Configuration options](./running-a-deployment.md#configuration-options) - + --- Once you have built and tested your deployment module, it is time to deploy it! Start by making sure you understand exactly what will be executed on chain. -## Visualizing your deployment with the `plan` task +## Visualizing your deployment with the `visualize` task -**Ignition** adds a `plan` task to the cli, that will generate a HTML report showing a _dry run_ of the deployment - the contract deploys and contract calls. +**Ignition** adds a `visualize` task to the cli, that will generate a HTML report showing a _dry run_ of the deployment - the contract deploys and contract calls. -The `plan` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): +The `visualize` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): ```bash -npx hardhat plan ENS +npx hardhat visualize ENS ``` -Running `plan` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: +Running `visualize` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: -![Main plan output](images/plan-1.png) +![Main visualize output](images/visualize-1.png) The report summarises the contract that will be deployed and the contract calls that will be made. It shows the dependency graph as it will be executed by Ignition (where a dependency will not be run until all its dependents have successfully completed). -If something in your deployment isn't behaving the way you expected, the `plan` task can be an extremely helpful tool for debugging and verifying that your and **Ignition**'s understanding of the deployment are the same. +If something in your deployment isn't behaving the way you expected, the `visualize` task can be an extremely helpful tool for debugging and verifying that your and **Ignition**'s understanding of the deployment are the same. ## Executing the deployment diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f8a1930d5f..88594374e2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,8 +1,7 @@ -export * from "./errors"; export { buildModule } from "./build-module"; export { deploy } from "./deploy"; +export * from "./errors"; export { formatSolidityParameter } from "./internal/formatters"; -export { plan } from "./plan"; export { StoredDeploymentSerializer } from "./stored-deployment-serializer"; export * from "./type-guards"; export * from "./types/artifact"; @@ -12,4 +11,5 @@ export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; export * from "./types/serialized-deployment"; +export { visualize } from "./visualize"; export { wipe } from "./wipe"; diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts index e0512996c0..dbc163c1c5 100644 --- a/packages/core/src/ui-helpers.ts +++ b/packages/core/src/ui-helpers.ts @@ -1,3 +1,4 @@ +export { formatSolidityParameter } from "./internal/formatters"; export { StoredDeploymentDeserializer, StoredDeploymentSerializer, @@ -5,4 +6,3 @@ export { export * from "./type-guards"; export * from "./types/module"; export * from "./types/serialized-deployment"; -export { formatSolidityParameter } from "./internal/formatters"; diff --git a/packages/core/src/plan.ts b/packages/core/src/visualize.ts similarity index 94% rename from packages/core/src/plan.ts rename to packages/core/src/visualize.ts index 83b0e40bd3..69ea5bdea4 100644 --- a/packages/core/src/plan.ts +++ b/packages/core/src/visualize.ts @@ -11,7 +11,7 @@ import { * * @beta */ -export async function plan({ +export async function visualize({ artifactResolver, storedDeployment, }: { diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index a6557f3c92..87265efa69 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -28,7 +28,7 @@ import "@ignored/hardhat-ignition"; ## Tasks -This plugin provides the `deploy` and `plan` tasks. +This plugin provides the `deploy` and `visualize` tasks. ## Usage diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 62bfe0ee9d..ce141cf9b5 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,7 +1,7 @@ import { deploy, DeploymentParameters, - plan, + visualize, wipe, } from "@ignored/ignition-core"; import "@nomicfoundation/hardhat-ethers"; @@ -14,10 +14,10 @@ import Prompt from "prompts"; import { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; import { IgnitionHelper } from "./ignition-helper"; import { loadModule } from "./load-module"; -import { writePlan } from "./plan/write-plan"; import { UiEventHandler } from "./ui/UiEventHandler"; import { VerboseEventHandler } from "./ui/VerboseEventHandler"; import { open } from "./utils/open"; +import { writeVisualization } from "./visualization/write-visualization"; import "./type-extensions"; @@ -163,7 +163,7 @@ task("deploy") } ); -task("plan") +task("visualize") .addFlag("quiet", "Disables logging output path to terminal") .addPositionalParam("moduleNameOrPath") .setAction( @@ -194,7 +194,7 @@ task("plan") const artifactResolver = new HardhatArtifactResolver(hre); - const serializedModule = await plan({ + const serializedModule = await visualize({ artifactResolver, storedDeployment: { details: { @@ -205,16 +205,18 @@ task("plan") }, }); - await writePlan(serializedModule, { cacheDir: hre.config.paths.cache }); + await writeVisualization(serializedModule, { + cacheDir: hre.config.paths.cache, + }); if (!quiet) { const indexFile = path.join( hre.config.paths.cache, - "plan", + "visualization", "index.html" ); - console.log(`Plan written to ${indexFile}`); + console.log(`Deployment visualization written to ${indexFile}`); open(indexFile); } diff --git a/packages/hardhat-plugin/src/plan/write-plan.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts similarity index 77% rename from packages/hardhat-plugin/src/plan/write-plan.ts rename to packages/hardhat-plugin/src/visualization/write-visualization.ts index 3896a8f05d..6c5a1339f1 100644 --- a/packages/hardhat-plugin/src/plan/write-plan.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -2,7 +2,7 @@ import { SerializedStoredDeployment } from "@ignored/ignition-core"; import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; -export async function writePlan( +export async function writeVisualization( serializedStoredDeployment: SerializedStoredDeployment, { cacheDir }: { cacheDir: string } ) { @@ -18,14 +18,14 @@ export async function writePlan( process.exit(1); } - const planDir = path.join(cacheDir, "plan"); + const visualizationDir = path.join(cacheDir, "visualization"); - await ensureDir(planDir); + await ensureDir(visualizationDir); const indexHtml = await readFile(path.join(templateDir, "index.html")); const updatedHtml = indexHtml .toString() .replace('{"unloaded":true}', JSON.stringify(serializedStoredDeployment)); - await writeFile(path.join(planDir, "index.html"), updatedHtml); + await writeFile(path.join(visualizationDir, "index.html"), updatedHtml); } diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index fb368f6005..4ee8812cba 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -5,20 +5,20 @@ import path from "path"; import { useEphemeralIgnitionProject } from "../use-ignition-project"; -describe("plan", () => { +describe("visualize", () => { useEphemeralIgnitionProject("minimal"); - it("should create a plan", async function () { - const planPath = path.resolve("../minimal/cache/plan"); - emptyDirSync(planPath); + it("should create a visualization", async function () { + const visualizationPath = path.resolve("../minimal/cache/visualization"); + emptyDirSync(visualizationPath); await this.hre.run("compile", { quiet: true }); - await this.hre.run("plan", { + await this.hre.run("visualize", { quiet: true, moduleNameOrPath: "MyModule.js", }); - const files = await readdir(planPath); + const files = await readdir(visualizationPath); assert(files.includes("index.html")); }); diff --git a/packages/ui/README.md b/packages/ui/README.md index 109f5a7c22..d8fe4f7b86 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -1,6 +1,6 @@ -# Ignition Plan UI +# Ignition Visualize UI -The website used in Ignitions plan task for visualising a deployment. +The website used in Ignitions `visualize` task for visualising a deployment. ## Development diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index 96668463cd..e2e0b7dd4b 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -5,7 +5,7 @@ import { StoredDeploymentDeserializer } from "@ignored/ignition-core/ui-helpers" import ReactDOM from "react-dom/client"; import { RouterProvider, createHashRouter } from "react-router-dom"; import { FutureDetails } from "./pages/future-details/future-details"; -import { PlanOverview } from "./pages/plan-overview/plan-overview"; +import { VisualizationOverview } from "./pages/visualization-overview/visualization-overview"; const loadDeploymentFromEmbeddedDiv = (): StoredDeployment | null => { const scriptTag = document.getElementById("deployment"); @@ -40,7 +40,7 @@ const main = async () => { const router = createHashRouter([ { path: "/", - element: , + element: , }, { path: "/future/:futureId", diff --git a/packages/ui/src/pages/plan-overview/components/plan-details.tsx b/packages/ui/src/pages/plan-overview/components/plan-details.tsx deleted file mode 100644 index 64117d9ff6..0000000000 --- a/packages/ui/src/pages/plan-overview/components/plan-details.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import { useMemo } from "react"; -import styled from "styled-components"; -import { Mermaid } from "../../../components/mermaid"; -import { getAllFuturesForModule } from "../../../queries/futures"; -import { Action } from "./action"; - -export const PlanDetails: React.FC<{ deployment: StoredDeployment }> = ({ - deployment, -}) => { - const futures = useMemo( - () => getAllFuturesForModule(deployment.module), - [deployment] - ); - - return ( -
    -

    Plan

    - -
    - -
    - -

    Actions

    - - {futures.map((future) => ( - - ))} - -
    - ); -}; - -const Actions = styled.div` - display: grid; - row-gap: 0.5rem; -`; diff --git a/packages/ui/src/pages/plan-overview/components/plan-summary.tsx b/packages/ui/src/pages/plan-overview/components/plan-summary.tsx deleted file mode 100644 index 721ad50f82..0000000000 --- a/packages/ui/src/pages/plan-overview/components/plan-summary.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import React, { useMemo } from "react"; -import styled from "styled-components"; -import { SummaryHeader } from "../../../components/summary-header"; -import { - getAllCallFuturesFor, - getAllDeployFuturesFor, -} from "../../../queries/futures"; - -export const PlanSummary: React.FC<{ deployment: StoredDeployment }> = ({ - deployment, -}) => { - const { details } = deployment; - const deployFutures = useMemo( - () => getAllDeployFuturesFor(deployment), - [deployment] - ); - const callFutures = useMemo( - () => getAllCallFuturesFor(deployment), - [deployment] - ); - - return ( -
    - - -

    - The successful completion of the plan will send{" "} - {deployFutures.length + callFutures.length} - transactions: -

    - - - {deployFutures.length === 0 ? null : ( - -

    {deployFutures.length} deploys

    -
      - {deployFutures.map((deploy) => ( -
    • - {deploy.contractName} ({deploy.module.id}) -
    • - ))} -
    -
    - )} - - {callFutures.length === 0 ? null : ( - -

    {callFutures.length} calls

    -
      - {callFutures.map((call) => ( -
    • {call.id}
    • - ))} -
    -
    - )} -
    -
    - ); -}; - -const SummaryColumns = styled.div` - display: grid; - grid-template-columns: 1fr 1fr 1fr; -`; - -const SummaryColumn = styled.div` - h4 { - text-decoration: underline; - } - - ul { - list-style-type: none; - } -`; diff --git a/packages/ui/src/pages/plan-overview/plan-overview.tsx b/packages/ui/src/pages/plan-overview/plan-overview.tsx deleted file mode 100644 index 16a6c7acc7..0000000000 --- a/packages/ui/src/pages/plan-overview/plan-overview.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import React from "react"; -import { Page, PageTitle, Panel } from "../../components/shared"; -import { PlanDetails } from "./components/plan-details"; -import { PlanSummary } from "./components/plan-summary"; - -export const PlanOverview: React.FC<{ deployment: StoredDeployment }> = ({ - deployment, -}) => { - return ( - -
    - Ignition - {deployment.module.id} -
    - - - - - - - - -
    - ); -}; diff --git a/packages/ui/src/pages/plan-overview/components/action.tsx b/packages/ui/src/pages/visualization-overview/components/action.tsx similarity index 100% rename from packages/ui/src/pages/plan-overview/components/action.tsx rename to packages/ui/src/pages/visualization-overview/components/action.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx new file mode 100644 index 0000000000..02e7e1d161 --- /dev/null +++ b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx @@ -0,0 +1,36 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { useMemo } from "react"; +import styled from "styled-components"; +import { Mermaid } from "../../../components/mermaid"; +import { getAllFuturesForModule } from "../../../queries/futures"; +import { Action } from "./action"; + +export const VisualizationDetails: React.FC<{ deployment: StoredDeployment }> = + ({ deployment }) => { + const futures = useMemo( + () => getAllFuturesForModule(deployment.module), + [deployment] + ); + + return ( +
    +

    Visualization

    + +
    + +
    + +

    Actions

    + + {futures.map((future) => ( + + ))} + +
    + ); + }; + +const Actions = styled.div` + display: grid; + row-gap: 0.5rem; +`; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx new file mode 100644 index 0000000000..33e488c50b --- /dev/null +++ b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx @@ -0,0 +1,77 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import React, { useMemo } from "react"; +import styled from "styled-components"; +import { SummaryHeader } from "../../../components/summary-header"; +import { + getAllCallFuturesFor, + getAllDeployFuturesFor, +} from "../../../queries/futures"; + +export const VisualizationSummary: React.FC<{ deployment: StoredDeployment }> = + ({ deployment }) => { + const { details } = deployment; + const deployFutures = useMemo( + () => getAllDeployFuturesFor(deployment), + [deployment] + ); + const callFutures = useMemo( + () => getAllCallFuturesFor(deployment), + [deployment] + ); + + return ( +
    + + +

    + The successful completion of the deployment will send{" "} + {deployFutures.length + callFutures.length} + transactions: +

    + + + {deployFutures.length === 0 ? null : ( + +

    {deployFutures.length} deploys

    +
      + {deployFutures.map((deploy) => ( +
    • + {deploy.contractName} ({deploy.module.id}) +
    • + ))} +
    +
    + )} + + {callFutures.length === 0 ? null : ( + +

    {callFutures.length} calls

    +
      + {callFutures.map((call) => ( +
    • {call.id}
    • + ))} +
    +
    + )} +
    +
    + ); + }; + +const SummaryColumns = styled.div` + display: grid; + grid-template-columns: 1fr 1fr 1fr; +`; + +const SummaryColumn = styled.div` + h4 { + text-decoration: underline; + } + + ul { + list-style-type: none; + } +`; diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx new file mode 100644 index 0000000000..ceedcc2ad4 --- /dev/null +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -0,0 +1,24 @@ +import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import React from "react"; +import { Page, PageTitle, Panel } from "../../components/shared"; +import { VisualizationDetails } from "./components/visualization-details"; +import { VisualizationSummary } from "./components/visualization-summary"; + +export const VisualizationOverview: React.FC<{ deployment: StoredDeployment }> = + ({ deployment }) => { + return ( + +
    + Ignition - {deployment.module.id} +
    + + + + + + + + +
    + ); + }; From 6232f703b99ad8814c46e2867c339a9836227cdd Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 15:55:53 +0100 Subject: [PATCH 0944/1302] refactor: remove details from stored deployment --- .../core/src/stored-deployment-serializer.ts | 6 --- .../core/src/types/serialized-deployment.ts | 8 ---- .../core/test/stored-deployment-serializer.ts | 38 ------------------- packages/hardhat-plugin/src/index.ts | 10 ----- packages/ui/src/components/summary-header.tsx | 14 +------ .../components/future-summary.tsx | 7 +--- .../components/visualization-summary.tsx | 6 +-- 7 files changed, 5 insertions(+), 84 deletions(-) diff --git a/packages/core/src/stored-deployment-serializer.ts b/packages/core/src/stored-deployment-serializer.ts index 70fe5ae6f1..7ce3ae5d47 100644 --- a/packages/core/src/stored-deployment-serializer.ts +++ b/packages/core/src/stored-deployment-serializer.ts @@ -90,9 +90,6 @@ export class StoredDeploymentSerializer { const allModules = this._getModulesAndSubmoduleFor(deployment.module); return { - details: { - ...deployment.details, - }, startModule: deployment.module.id, modules: Object.fromEntries( allModules.map((m) => [m.id, this._serializeModule(m, { argReplacer })]) @@ -478,9 +475,6 @@ export class StoredDeploymentDeserializer { } return { - details: { - ...serializedDeployment.details, - }, module: this._lookup(modulesLookup, serializedDeployment.startModule), }; } diff --git a/packages/core/src/types/serialized-deployment.ts b/packages/core/src/types/serialized-deployment.ts index cd7e006aef..dfee62ee6c 100644 --- a/packages/core/src/types/serialized-deployment.ts +++ b/packages/core/src/types/serialized-deployment.ts @@ -244,10 +244,6 @@ export interface SerializedModuleParameterRuntimeValue { * @beta */ export interface StoredDeployment { - details: { - networkName: string; - chainId: number; - }; module: IgnitionModule>; } @@ -260,10 +256,6 @@ export interface StoredDeployment { * @beta */ export interface SerializedStoredDeployment { - details: { - networkName: string; - chainId: number; - }; startModule: string; modules: { [key: string]: SerializedStoredModule; diff --git a/packages/core/test/stored-deployment-serializer.ts b/packages/core/test/stored-deployment-serializer.ts index 726d5d203e..b370747a45 100644 --- a/packages/core/test/stored-deployment-serializer.ts +++ b/packages/core/test/stored-deployment-serializer.ts @@ -21,11 +21,6 @@ import { import { StoredDeployment } from "../src/types/serialized-deployment"; describe("stored deployment serializer", () => { - const details = { - networkName: "hardhat", - chainId: 31117, - }; - describe("contract", () => { it("should serialize a contract deployment", () => { const module = buildModule("Module1", (m) => { @@ -35,7 +30,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -50,7 +44,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -64,7 +57,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -86,7 +78,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -105,7 +96,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -120,7 +110,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -135,7 +124,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -151,7 +139,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -173,7 +160,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -188,7 +174,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -204,7 +189,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -226,7 +210,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -243,7 +226,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -282,7 +264,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -304,7 +285,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -321,7 +301,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -338,7 +317,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -355,7 +333,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -372,7 +349,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -389,7 +365,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -409,7 +384,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -430,7 +404,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -452,7 +425,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -484,7 +456,6 @@ describe("stored deployment serializer", () => { }); const deployment = { - details, module, }; @@ -515,7 +486,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -528,7 +498,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -541,7 +510,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -555,7 +523,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -583,7 +550,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -597,7 +563,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -611,7 +576,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -625,7 +589,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); @@ -639,7 +602,6 @@ describe("stored deployment serializer", () => { }); assertSerializableModuleIn({ - details, module, }); }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ce141cf9b5..0249aff8da 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -186,21 +186,11 @@ task("visualize") process.exit(0); } - const chainId = Number( - await hre.network.provider.request({ - method: "eth_chainId", - }) - ); - const artifactResolver = new HardhatArtifactResolver(hre); const serializedModule = await visualize({ artifactResolver, storedDeployment: { - details: { - networkName: hre.network.name, - chainId, - }, module: userModule, }, }); diff --git a/packages/ui/src/components/summary-header.tsx b/packages/ui/src/components/summary-header.tsx index 914237601c..d4b5676abe 100644 --- a/packages/ui/src/components/summary-header.tsx +++ b/packages/ui/src/components/summary-header.tsx @@ -1,24 +1,18 @@ import React from "react"; import styled from "styled-components"; -export const SummaryHeader: React.FC<{ - networkName: string; - chainId: number; -}> = ({ networkName, chainId }) => { +export const SummaryHeader: React.FC = () => { return (
    Summary
    - - Network: {networkName} ({chainId}) -
    ); }; const Header = styled.div` display: grid; - grid-template-columns: auto 1fr auto; + grid-template-columns: auto 1fr; p { font-weight: bold; @@ -28,7 +22,3 @@ const Header = styled.div` const Title = styled.h2` place-self: center; `; - -const NetworkText = styled.p` - place-self: center; -`; diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index bb43bdeb83..f852de8bdc 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -11,7 +11,7 @@ import { argumentTypeToString } from "../../../utils/argumentTypeToString"; export const FutureSummary: React.FC<{ deployment: StoredDeployment; future: Future; -}> = ({ deployment, future }) => { +}> = ({ future }) => { const title = resolveTitleFor(future); return ( @@ -21,10 +21,7 @@ export const FutureSummary: React.FC<{
    - +
    diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx index 33e488c50b..8ac074b352 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx @@ -9,7 +9,6 @@ import { export const VisualizationSummary: React.FC<{ deployment: StoredDeployment }> = ({ deployment }) => { - const { details } = deployment; const deployFutures = useMemo( () => getAllDeployFuturesFor(deployment), [deployment] @@ -21,10 +20,7 @@ export const VisualizationSummary: React.FC<{ deployment: StoredDeployment }> = return (
    - +

    The successful completion of the deployment will send{" "} From 2c860719b055e1ef5844fdedad0e8ada4bd12298 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 18:11:55 +0100 Subject: [PATCH 0945/1302] refactor: change serialization to be module based Replace the deployment serializer with just an IgnitionModule serializer. --- ...lizer.ts => ignition-module-serializer.ts} | 64 +++---- packages/core/src/index.ts | 4 +- ...ialized-deployment.ts => serialization.ts} | 48 +---- packages/core/src/ui-helpers.ts | 10 +- packages/core/src/visualize.ts | 18 +- .../core/test/stored-deployment-serializer.ts | 167 ++++++------------ packages/hardhat-plugin/src/index.ts | 26 +-- .../src/visualization/write-visualization.ts | 6 +- .../generate-example-deployment-json.js | 17 +- packages/ui/src/components/mermaid.tsx | 13 +- packages/ui/src/main.tsx | 23 ++- .../components/future-summary.tsx | 2 - .../pages/future-details/future-details.tsx | 17 +- .../components/visualization-details.tsx | 48 ++--- .../components/visualization-summary.tsx | 96 +++++----- .../visualization-overview.tsx | 38 ++-- packages/ui/src/queries/futures.ts | 17 +- packages/ui/src/utils/to-mermaid.ts | 11 +- packages/ui/test/to-mermaid.ts | 10 +- 19 files changed, 276 insertions(+), 359 deletions(-) rename packages/core/src/{stored-deployment-serializer.ts => ignition-module-serializer.ts} (94%) rename packages/core/src/types/{serialized-deployment.ts => serialization.ts} (85%) diff --git a/packages/core/src/stored-deployment-serializer.ts b/packages/core/src/ignition-module-serializer.ts similarity index 94% rename from packages/core/src/stored-deployment-serializer.ts rename to packages/core/src/ignition-module-serializer.ts index 7ce3ae5d47..dfe5b60e9c 100644 --- a/packages/core/src/stored-deployment-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -51,7 +51,9 @@ import { SerializedArtifactLibraryDeploymentFuture, SerializedBigInt, SerializedFuture, + SerializedIgnitionModule, SerializedLibraries, + SerializedModuleDescription, SerializedModuleParameterRuntimeValue, SerializedNamedContractAtFuture, SerializedNamedContractCallFuture, @@ -60,24 +62,21 @@ import { SerializedNamedStaticCallFuture, SerializedReadEventArgumentFuture, SerializedSendDataFuture, - SerializedStoredDeployment, - SerializedStoredModule, - StoredDeployment, -} from "./types/serialized-deployment"; +} from "./types/serialization"; interface SerializeContext { argReplacer: (arg: ArgumentType) => SerializedArgumentType; } /** - * Serialize a deployment. + * Serialize an Ignition module. * * @beta */ -export class StoredDeploymentSerializer { +export class IgnitionModuleSerializer { public static serialize( - deployment: StoredDeployment - ): SerializedStoredDeployment { + ignitionModule: IgnitionModule> + ): SerializedIgnitionModule { const argReplacer = (arg: ArgumentType) => replaceWithinArg(arg, { accountRuntimeValue: this._serializeAccountRuntimeValue, @@ -87,10 +86,10 @@ export class StoredDeploymentSerializer { future: this._convertFutureToFutureToken, }); - const allModules = this._getModulesAndSubmoduleFor(deployment.module); + const allModules = this._getModulesAndSubmoduleFor(ignitionModule); return { - startModule: deployment.module.id, + startModule: ignitionModule.id, modules: Object.fromEntries( allModules.map((m) => [m.id, this._serializeModule(m, { argReplacer })]) ), @@ -100,7 +99,7 @@ export class StoredDeploymentSerializer { private static _serializeModule( userModule: IgnitionModule>, context: SerializeContext - ): SerializedStoredModule { + ): SerializedModuleDescription { return { id: userModule.id, futures: Array.from(userModule.futures).map((future) => @@ -396,16 +395,18 @@ export class StoredDeploymentSerializer { } /** - * Deserialize a deployment that was previously serialized using StoredDeploymentSerialized. + * Deserialize an `IgnitionModule` that was previously serialized using + * IgnitionModuleSerializer. * * @beta */ -export class StoredDeploymentDeserializer { +export class IgnitionModuleDeserializer { public static deserialize( - serializedDeployment: SerializedStoredDeployment - ): StoredDeployment { - const sortedModules = - this._getSerializedModulesInReverseTopologicalOrder(serializedDeployment); + serializedIgnitionModule: SerializedIgnitionModule + ): IgnitionModule> { + const sortedModules = this._getSerializedModulesInReverseTopologicalOrder( + serializedIgnitionModule + ); const modulesLookup: Map = new Map(); for (const serializedModule of sortedModules) { @@ -418,8 +419,9 @@ export class StoredDeploymentDeserializer { } } - const sortedFutures = - this._getSerializedFuturesInReverseTopologicalOrder(serializedDeployment); + const sortedFutures = this._getSerializedFuturesInReverseTopologicalOrder( + serializedIgnitionModule + ); const futuresLookup: Map = new Map(); const contractFuturesLookup: Map< @@ -455,7 +457,7 @@ export class StoredDeploymentDeserializer { } for (const serializedModule of Object.values( - serializedDeployment.modules + serializedIgnitionModule.modules )) { const mod = this._lookup(modulesLookup, serializedModule.id); @@ -474,23 +476,21 @@ export class StoredDeploymentDeserializer { } } - return { - module: this._lookup(modulesLookup, serializedDeployment.startModule), - }; + return this._lookup(modulesLookup, serializedIgnitionModule.startModule); } private static _getSerializedModulesInReverseTopologicalOrder( - serializedDeployment: SerializedStoredDeployment - ): SerializedStoredModule[] { - const graph: Graph = new Map(); + serializedIgnitionModule: SerializedIgnitionModule + ): SerializedModuleDescription[] { + const graph: Graph = new Map(); - for (const mod of Object.values(serializedDeployment.modules)) { + for (const mod of Object.values(serializedIgnitionModule.modules)) { graph.set(mod, new Set()); } - for (const mod of Object.values(serializedDeployment.modules)) { + for (const mod of Object.values(serializedIgnitionModule.modules)) { for (const submodToken of mod.submodules) { - const submod = serializedDeployment.modules[submodToken.moduleId]; + const submod = serializedIgnitionModule.modules[submodToken.moduleId]; graph.get(submod)!.add(mod); } } @@ -499,9 +499,9 @@ export class StoredDeploymentDeserializer { } private static _getSerializedFuturesInReverseTopologicalOrder( - serializedDeployment: SerializedStoredDeployment + serializedIgnitionModule: SerializedIgnitionModule ): SerializedFuture[] { - const serializedFutures = this._getAllFuturesFor(serializedDeployment); + const serializedFutures = this._getAllFuturesFor(serializedIgnitionModule); const serializedFuturesMap = Object.fromEntries( serializedFutures.map((f) => [f.id, f]) ); @@ -606,7 +606,7 @@ export class StoredDeploymentDeserializer { } private static _getAllFuturesFor( - deployment: SerializedStoredDeployment + deployment: SerializedIgnitionModule ): SerializedFuture[] { return Object.values(deployment.modules).flatMap((m) => Object.values(m.futures) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 88594374e2..c708a61f66 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,8 +1,8 @@ export { buildModule } from "./build-module"; export { deploy } from "./deploy"; export * from "./errors"; +export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; -export { StoredDeploymentSerializer } from "./stored-deployment-serializer"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; @@ -10,6 +10,6 @@ export * from "./types/execution-events"; export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; -export * from "./types/serialized-deployment"; +export * from "./types/serialization"; export { visualize } from "./visualize"; export { wipe } from "./wipe"; diff --git a/packages/core/src/types/serialized-deployment.ts b/packages/core/src/types/serialization.ts similarity index 85% rename from packages/core/src/types/serialized-deployment.ts rename to packages/core/src/types/serialization.ts index dfee62ee6c..26fd30bbdc 100644 --- a/packages/core/src/types/serialized-deployment.ts +++ b/packages/core/src/types/serialization.ts @@ -1,5 +1,5 @@ import { Artifact } from "./artifact"; -import { FutureType, IgnitionModule, IgnitionModuleResult } from "./module"; +import { FutureType } from "./module"; /** * A serialized bigint. @@ -238,63 +238,33 @@ export interface SerializedModuleParameterRuntimeValue { defaultValue: string | undefined; } -/** - * The details of a deployment that will be used in the UI. - * - * @beta - */ -export interface StoredDeployment { - module: IgnitionModule>; -} - // Serialized Deployments /** - * The serialized version of a complete deployment, combining the - * chain details with the module to be deployed. + * The serialized version of an Ignition module and its submodules. * * @beta */ -export interface SerializedStoredDeployment { +export interface SerializedIgnitionModule { startModule: string; modules: { - [key: string]: SerializedStoredModule; + [key: string]: SerializedModuleDescription; }; } /** - * The serialized version of an Ignition module. + * A subpart of the `SerializedIgnitionModule` that describes one + * module/submodule and its relations to futures and other submodule. * * @beta */ -export interface SerializedStoredModule { +export interface SerializedModuleDescription { id: string; submodules: ModuleToken[]; - futures: SerializedStoredFutures; - results: SerializedStoredResults; + futures: SerializedFuture[]; + results: Array<[name: string, token: FutureToken]>; } -/** - * Serialized versions of a modules used submodules. - * - * @beta - */ -export type SerializedStoredSubmodules = SerializedStoredModule[]; - -/** - * The serialized futures that are executed in deploying a module. - * - * @beta - */ -export type SerializedStoredFutures = SerializedFuture[]; - -/** - * The serialized results of a module. - * - * @beta - */ -export type SerializedStoredResults = Array<[name: string, token: FutureToken]>; - /** * The serialized libraries, where each library * has been replaced by a token. diff --git a/packages/core/src/ui-helpers.ts b/packages/core/src/ui-helpers.ts index dbc163c1c5..edf1f988b4 100644 --- a/packages/core/src/ui-helpers.ts +++ b/packages/core/src/ui-helpers.ts @@ -1,8 +1,8 @@ -export { formatSolidityParameter } from "./internal/formatters"; export { - StoredDeploymentDeserializer, - StoredDeploymentSerializer, -} from "./stored-deployment-serializer"; + IgnitionModuleDeserializer, + IgnitionModuleSerializer, +} from "./ignition-module-serializer"; +export { formatSolidityParameter } from "./internal/formatters"; export * from "./type-guards"; export * from "./types/module"; -export * from "./types/serialized-deployment"; +export * from "./types/serialization"; diff --git a/packages/core/src/visualize.ts b/packages/core/src/visualize.ts index 69ea5bdea4..59718e029c 100644 --- a/packages/core/src/visualize.ts +++ b/packages/core/src/visualize.ts @@ -1,10 +1,8 @@ +import { IgnitionModuleSerializer } from "./ignition-module-serializer"; import { validateStageOne } from "./internal/validation/validateStageOne"; import { ArtifactResolver } from "./types/artifact"; -import { - SerializedStoredDeployment, - StoredDeployment, - StoredDeploymentSerializer, -} from "./ui-helpers"; +import { IgnitionModule, IgnitionModuleResult } from "./types/module"; +import { SerializedIgnitionModule } from "./types/serialization"; /** * Serialize an IgnitionModule for displaying to the user @@ -12,13 +10,13 @@ import { * @beta */ export async function visualize({ + ignitionModule, artifactResolver, - storedDeployment, }: { + ignitionModule: IgnitionModule>; artifactResolver: ArtifactResolver; - storedDeployment: StoredDeployment; -}): Promise { - await validateStageOne(storedDeployment.module, artifactResolver); +}): Promise { + await validateStageOne(ignitionModule, artifactResolver); - return StoredDeploymentSerializer.serialize(storedDeployment); + return IgnitionModuleSerializer.serialize(ignitionModule); } diff --git a/packages/core/test/stored-deployment-serializer.ts b/packages/core/test/stored-deployment-serializer.ts index b370747a45..afb56e39f3 100644 --- a/packages/core/test/stored-deployment-serializer.ts +++ b/packages/core/test/stored-deployment-serializer.ts @@ -3,22 +3,21 @@ import { assert } from "chai"; import { Artifact } from "../src"; import { buildModule } from "../src/build-module"; +import { + IgnitionModuleDeserializer, + IgnitionModuleSerializer, +} from "../src/ignition-module-serializer"; import { ArtifactContractDeploymentFutureImplementation, ArtifactLibraryDeploymentFutureImplementation, NamedContractDeploymentFutureImplementation, NamedLibraryDeploymentFutureImplementation, } from "../src/internal/module"; -import { - StoredDeploymentDeserializer, - StoredDeploymentSerializer, -} from "../src/stored-deployment-serializer"; import { ContractFuture, IgnitionModule, IgnitionModuleResult, } from "../src/types/module"; -import { StoredDeployment } from "../src/types/serialized-deployment"; describe("stored deployment serializer", () => { describe("contract", () => { @@ -29,9 +28,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contract deployments with dependency", () => { @@ -43,9 +40,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contract deployment with module parameter value", () => { @@ -56,9 +51,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -77,9 +70,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contractFromArtifact deployment with dependency", () => { @@ -95,9 +86,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -109,9 +98,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contractAt with a future address", () => { @@ -123,9 +110,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contractAt with dependency", () => { @@ -138,9 +123,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -159,9 +142,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contractAt with a future address", () => { @@ -173,9 +154,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a contractAt with dependency", () => { @@ -188,9 +167,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -209,9 +186,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a library deployment with dependency", () => { @@ -225,9 +200,7 @@ describe("stored deployment serializer", () => { }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a libraries passed in as libraries", () => { @@ -263,9 +236,7 @@ describe("stored deployment serializer", () => { }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -284,9 +255,7 @@ describe("stored deployment serializer", () => { return { library1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a libraryFromArtifact deployment with dependency", () => { @@ -300,9 +269,7 @@ describe("stored deployment serializer", () => { return { library1, library2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -316,9 +283,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a call with dependencies", () => { @@ -332,9 +297,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -348,9 +311,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a static call with dependencies", () => { @@ -364,9 +325,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("Should serialize readEventArgument", () => { @@ -383,9 +342,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); @@ -403,9 +360,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize contract dependencies over the useModule barrier", () => { @@ -424,9 +379,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2, contract3 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should serialize a diamond useModule", () => { @@ -455,23 +408,19 @@ describe("stored deployment serializer", () => { return { leftContract, rightContract }; }); - const deployment = { - module, - }; + assertSerializableModuleIn(module); - assertSerializableModuleIn(deployment); - - const reserialized = StoredDeploymentDeserializer.deserialize( + const reserialized = IgnitionModuleDeserializer.deserialize( JSON.parse( JSON.stringify( - StoredDeploymentSerializer.serialize(deployment), + IgnitionModuleSerializer.serialize(module), sortedKeysJsonStringifyReplacer ) ) ); - const lc = reserialized.module.results.leftContract; - const rc = reserialized.module.results.rightContract; + const lc = reserialized.results.leftContract; + const rc = reserialized.results.rightContract; assert.equal(lc, rc); }); @@ -485,9 +434,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("Should support arrays as arguments", () => { @@ -497,9 +444,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("Should support objects as arguments", () => { @@ -509,9 +454,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("Should support futures as arguments", () => { @@ -522,9 +465,7 @@ describe("stored deployment serializer", () => { return { contract1, contract2 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should support nested futures as arguments", () => { @@ -549,9 +490,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should support AccountRuntimeValues as from", () => { @@ -562,9 +501,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should support nested AccountRuntimeValues as arguments", () => { @@ -575,9 +512,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should support ModuleParameterRuntimeValue as arguments", () => { @@ -588,9 +523,7 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); it("should support nested ModuleParameterRuntimeValue as arguments", () => { @@ -601,28 +534,28 @@ describe("stored deployment serializer", () => { return { contract1 }; }); - assertSerializableModuleIn({ - module, - }); + assertSerializableModuleIn(module); }); }); }); -function assertSerializableModuleIn(deployment: StoredDeployment) { +function assertSerializableModuleIn( + module: IgnitionModule> +) { const serialized = JSON.stringify( - StoredDeploymentSerializer.serialize(deployment), + IgnitionModuleSerializer.serialize(module), // This is not actually needed, but we use it to be able to compare the // serialized string, which can be easier to debug. sortedKeysJsonStringifyReplacer, 2 ); - const deserialized = StoredDeploymentDeserializer.deserialize( + const deserialized = IgnitionModuleDeserializer.deserialize( JSON.parse(serialized) ); const reserialized = JSON.stringify( - StoredDeploymentSerializer.serialize(deserialized), + IgnitionModuleSerializer.serialize(deserialized), sortedKeysJsonStringifyReplacer, 2 ); @@ -634,16 +567,16 @@ function assertSerializableModuleIn(deployment: StoredDeployment) { ); assert.deepEqual( - deployment, + module, deserialized, "Module not the same across serialization/deserialization" ); // Invariants - const ignitionModule = StoredDeploymentDeserializer.deserialize( + const ignitionModule = IgnitionModuleDeserializer.deserialize( JSON.parse(reserialized) - ).module; + ); assert( Object.values(ignitionModule.results).every((result) => diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 0249aff8da..1d03def71a 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,7 +1,7 @@ import { deploy, DeploymentParameters, - visualize, + IgnitionModuleSerializer, wipe, } from "@ignored/ignition-core"; import "@nomicfoundation/hardhat-ethers"; @@ -186,18 +186,22 @@ task("visualize") process.exit(0); } - const artifactResolver = new HardhatArtifactResolver(hre); + // const artifactResolver = new HardhatArtifactResolver(hre); + + // const result = await visualize({ + // ignitionModule: userModule, + // artifactResolver, + // }); - const serializedModule = await visualize({ - artifactResolver, - storedDeployment: { - module: userModule, - }, - }); + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(userModule); - await writeVisualization(serializedModule, { - cacheDir: hre.config.paths.cache, - }); + await writeVisualization( + { module: serializedIgnitionModule }, + { + cacheDir: hre.config.paths.cache, + } + ); if (!quiet) { const indexFile = path.join( diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts index 6c5a1339f1..11e41aa613 100644 --- a/packages/hardhat-plugin/src/visualization/write-visualization.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -1,9 +1,9 @@ -import { SerializedStoredDeployment } from "@ignored/ignition-core"; +import { SerializedIgnitionModule } from "@ignored/ignition-core"; import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; export async function writeVisualization( - serializedStoredDeployment: SerializedStoredDeployment, + visualizationPayload: { module: SerializedIgnitionModule }, { cacheDir }: { cacheDir: string } ) { const templateDir = path.join( @@ -25,7 +25,7 @@ export async function writeVisualization( const indexHtml = await readFile(path.join(templateDir, "index.html")); const updatedHtml = indexHtml .toString() - .replace('{"unloaded":true}', JSON.stringify(serializedStoredDeployment)); + .replace('{"unloaded":true}', JSON.stringify(visualizationPayload)); await writeFile(path.join(visualizationDir, "index.html"), updatedHtml); } diff --git a/packages/ui/scripts/generate-example-deployment-json.js b/packages/ui/scripts/generate-example-deployment-json.js index 8d3c7fea3f..53fc8d74c2 100644 --- a/packages/ui/scripts/generate-example-deployment-json.js +++ b/packages/ui/scripts/generate-example-deployment-json.js @@ -1,26 +1,21 @@ -import { StoredDeploymentSerializer } from "@ignored/ignition-core"; +import { IgnitionModuleSerializer } from "@ignored/ignition-core"; import { writeFile } from "node:fs/promises"; import complexModule from "../examples/ComplexModule.js"; const main = async () => { - await writeDeploymentJsonFor({ - details: { - chainId: 999, - networkName: "Hardhat", - }, - module: complexModule, - }); + await writeDeploymentJsonFor(complexModule); }; -async function writeDeploymentJsonFor(deployment) { - const serializedDeployment = StoredDeploymentSerializer.serialize(deployment); +async function writeDeploymentJsonFor(ignitionModule) { + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(ignitionModule); console.log("Deployment written to ./public/deployment.json"); await writeFile( "./public/deployment.json", - JSON.stringify(serializedDeployment, undefined, 2) + JSON.stringify({ module: serializedIgnitionModule }, undefined, 2) ); } diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index cf9c8431eb..98bd5f9a2e 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -1,22 +1,25 @@ import React, { useEffect, useMemo } from "react"; import styled from "styled-components"; -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { + IgnitionModule, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import mermaid from "mermaid"; import { toMermaid } from "../utils/to-mermaid"; export const Mermaid: React.FC<{ - deployment: StoredDeployment; -}> = ({ deployment }) => { + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { const diagram = useMemo(() => { - const d = toMermaid(deployment); + const d = toMermaid(ignitionModule); // NOTE: this is explicitly added to aid troubleshooting // eslint-disable-next-line @typescript-eslint/no-explicit-any (window as any).diagram = d; return d; - }, [deployment]); + }, [ignitionModule]); useEffect(() => { mermaid.initialize({}); diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index e2e0b7dd4b..77d6918653 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -1,13 +1,20 @@ import React from "react"; -import type { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; -import { StoredDeploymentDeserializer } from "@ignored/ignition-core/ui-helpers"; +import { + IgnitionModule, + IgnitionModuleDeserializer, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import ReactDOM from "react-dom/client"; import { RouterProvider, createHashRouter } from "react-router-dom"; import { FutureDetails } from "./pages/future-details/future-details"; import { VisualizationOverview } from "./pages/visualization-overview/visualization-overview"; -const loadDeploymentFromEmbeddedDiv = (): StoredDeployment | null => { +const loadDeploymentFromEmbeddedDiv = (): IgnitionModule< + string, + string, + IgnitionModuleResult +> | null => { const scriptTag = document.getElementById("deployment"); if (scriptTag === null || scriptTag.textContent === null) { @@ -20,13 +27,13 @@ const loadDeploymentFromEmbeddedDiv = (): StoredDeployment | null => { return null; } - return StoredDeploymentDeserializer.deserialize(data); + return IgnitionModuleDeserializer.deserialize(data.module); }; const loadDeploymentFromDevFile = async () => { const response = await fetch("./deployment.json"); const data = await response.json(); - return StoredDeploymentDeserializer.deserialize(data); + return IgnitionModuleDeserializer.deserialize(data.module); }; const loadDeploymentData = () => { @@ -35,16 +42,16 @@ const loadDeploymentData = () => { const main = async () => { try { - const deployment = await loadDeploymentData(); + const ignitionModule = await loadDeploymentData(); const router = createHashRouter([ { path: "/", - element: , + element: , }, { path: "/future/:futureId", - element: , + element: , }, ]); diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index f852de8bdc..a6e713966f 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -1,7 +1,6 @@ import { Future, FutureType, - StoredDeployment, isFuture, } from "@ignored/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; @@ -9,7 +8,6 @@ import { SummaryHeader } from "../../../components/summary-header"; import { argumentTypeToString } from "../../../utils/argumentTypeToString"; export const FutureSummary: React.FC<{ - deployment: StoredDeployment; future: Future; }> = ({ future }) => { const title = resolveTitleFor(future); diff --git a/packages/ui/src/pages/future-details/future-details.tsx b/packages/ui/src/pages/future-details/future-details.tsx index 78ccd86e63..df9506764a 100644 --- a/packages/ui/src/pages/future-details/future-details.tsx +++ b/packages/ui/src/pages/future-details/future-details.tsx @@ -1,18 +1,21 @@ -import { StoredDeployment } from "@ignored/ignition-core"; +import { + IgnitionModule, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import React, { useMemo } from "react"; import { useParams } from "react-router-dom"; import { Page } from "../../components/shared"; import { getFutureById } from "../../queries/futures"; import { FutureSummary } from "./components/future-summary"; -export const FutureDetails: React.FC<{ deployment: StoredDeployment }> = ({ - deployment, -}) => { +export const FutureDetails: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { const { futureId } = useParams(); const future = useMemo( - () => getFutureById(deployment, futureId), - [deployment, futureId] + () => getFutureById(ignitionModule, futureId), + [ignitionModule, futureId] ); if (future === undefined) { @@ -25,7 +28,7 @@ export const FutureDetails: React.FC<{ deployment: StoredDeployment }> = ({ return ( - + ); }; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx index 02e7e1d161..4e5ff23b19 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx @@ -1,34 +1,38 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { + IgnitionModule, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import { useMemo } from "react"; import styled from "styled-components"; import { Mermaid } from "../../../components/mermaid"; import { getAllFuturesForModule } from "../../../queries/futures"; import { Action } from "./action"; -export const VisualizationDetails: React.FC<{ deployment: StoredDeployment }> = - ({ deployment }) => { - const futures = useMemo( - () => getAllFuturesForModule(deployment.module), - [deployment] - ); +export const VisualizationDetails: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { + const futures = useMemo( + () => getAllFuturesForModule(ignitionModule), + [ignitionModule] + ); - return ( -

    -

    Visualization

    - -
    - -
    + return ( +
    +

    Visualization

    -

    Actions

    - - {futures.map((future) => ( - - ))} - +
    +
    - ); - }; + +

    Actions

    + + {futures.map((future) => ( + + ))} + +
    + ); +}; const Actions = styled.div` display: grid; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx index 8ac074b352..40e88c2436 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx @@ -1,4 +1,7 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { + IgnitionModule, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import React, { useMemo } from "react"; import styled from "styled-components"; import { SummaryHeader } from "../../../components/summary-header"; @@ -7,55 +10,56 @@ import { getAllDeployFuturesFor, } from "../../../queries/futures"; -export const VisualizationSummary: React.FC<{ deployment: StoredDeployment }> = - ({ deployment }) => { - const deployFutures = useMemo( - () => getAllDeployFuturesFor(deployment), - [deployment] - ); - const callFutures = useMemo( - () => getAllCallFuturesFor(deployment), - [deployment] - ); +export const VisualizationSummary: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { + const deployFutures = useMemo( + () => getAllDeployFuturesFor(ignitionModule), + [ignitionModule] + ); + const callFutures = useMemo( + () => getAllCallFuturesFor(ignitionModule), + [ignitionModule] + ); - return ( -
    - + return ( +
    + -

    - The successful completion of the deployment will send{" "} - {deployFutures.length + callFutures.length} - transactions: -

    +

    + The successful completion of the deployment will send{" "} + {deployFutures.length + callFutures.length} + transactions: +

    - - {deployFutures.length === 0 ? null : ( - -

    {deployFutures.length} deploys

    -
      - {deployFutures.map((deploy) => ( -
    • - {deploy.contractName} ({deploy.module.id}) -
    • - ))} -
    -
    - )} + + {deployFutures.length === 0 ? null : ( + +

    {deployFutures.length} deploys

    +
      + {deployFutures.map((deploy) => ( +
    • + {deploy.contractName} ({deploy.module.id}) +
    • + ))} +
    +
    + )} - {callFutures.length === 0 ? null : ( - -

    {callFutures.length} calls

    -
      - {callFutures.map((call) => ( -
    • {call.id}
    • - ))} -
    -
    - )} -
    -
    - ); - }; + {callFutures.length === 0 ? null : ( + +

    {callFutures.length} calls

    +
      + {callFutures.map((call) => ( +
    • {call.id}
    • + ))} +
    +
    + )} + +
    + ); +}; const SummaryColumns = styled.div` display: grid; diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx index ceedcc2ad4..0e056c9926 100644 --- a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -1,24 +1,28 @@ -import { StoredDeployment } from "@ignored/ignition-core/ui-helpers"; +import { + IgnitionModule, + IgnitionModuleResult, +} from "@ignored/ignition-core/ui-helpers"; import React from "react"; import { Page, PageTitle, Panel } from "../../components/shared"; import { VisualizationDetails } from "./components/visualization-details"; import { VisualizationSummary } from "./components/visualization-summary"; -export const VisualizationOverview: React.FC<{ deployment: StoredDeployment }> = - ({ deployment }) => { - return ( - -
    - Ignition - {deployment.module.id} -
    +export const VisualizationOverview: React.FC<{ + ignitionModule: IgnitionModule>; +}> = ({ ignitionModule }) => { + return ( + +
    + Ignition - {ignitionModule.id} +
    - - - + + + - - - -
    - ); - }; + + + +
    + ); +}; diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index e1fb165e79..9a2f91415a 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -2,20 +2,21 @@ import { DeploymentFuture, FunctionCallFuture, Future, - StoredDeployment, + IgnitionModule, + IgnitionModuleResult, isDeploymentFuture, isFunctionCallFuture, } from "@ignored/ignition-core/ui-helpers"; export function getFutureById( - deployment: StoredDeployment, + ignitionModule: IgnitionModule>, futureId: string | undefined ): Future | undefined { if (futureId === undefined) { return undefined; } - const f = getAllFuturesForModule(deployment.module).find( + const f = getAllFuturesForModule(ignitionModule).find( (f) => f.id === futureId ); @@ -30,7 +31,7 @@ export function getFutureById( export function getAllFuturesForModule({ futures, submodules, -}: StoredDeployment["module"]): Future[] { +}: IgnitionModule>): Future[] { return Array.from(futures).concat( Array.from(submodules.values()).flatMap((submodule) => getAllFuturesForModule(submodule) @@ -46,16 +47,16 @@ export function getAllFuturesForModule({ * - artifact library deploys */ export function getAllDeployFuturesFor( - deployment: StoredDeployment + ignitionModule: IgnitionModule> ): DeploymentFuture[] { - return getAllFuturesForModule(deployment.module).filter(isDeploymentFuture); + return getAllFuturesForModule(ignitionModule).filter(isDeploymentFuture); } /** * Get all calls in a module and its submodules */ export function getAllCallFuturesFor( - deployment: StoredDeployment + ignitionModule: IgnitionModule> ): FunctionCallFuture[] { - return getAllFuturesForModule(deployment.module).filter(isFunctionCallFuture); + return getAllFuturesForModule(ignitionModule).filter(isFunctionCallFuture); } diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index c6b0cfb9b5..7c96310635 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -3,14 +3,15 @@ import { FutureType, IgnitionModule, IgnitionModuleResult, - StoredDeployment, isFuture, } from "@ignored/ignition-core/ui-helpers"; import { getAllFuturesForModule } from "../queries/futures.js"; import { argumentTypeToString } from "./argumentTypeToString.js"; -export function toMermaid(deployment: StoredDeployment) { - const modules = recursivelyListModulesAndSubmodulesFor(deployment.module); +export function toMermaid( + ignitionModule: IgnitionModule> +) { + const modules = recursivelyListModulesAndSubmodulesFor(ignitionModule); const subgraphSections = modules .map((m) => prettyPrintModule(m, " ")) @@ -18,7 +19,7 @@ export function toMermaid(deployment: StoredDeployment) { const futureDependencies = [ ...new Set( - getAllFuturesForModule(deployment.module) + getAllFuturesForModule(ignitionModule) .flatMap((f) => Array.from(f.dependencies).map((d) => [ toEscapedId(f.id), @@ -43,7 +44,7 @@ export function toMermaid(deployment: StoredDeployment) { ].join("\n"); return `flowchart BT\n\n${toEscapedId( - deployment.module.id + ignitionModule.id )}:::startModule\n\n${subgraphSections}${ futureDependencies === "" ? "" : "\n\n" + futureDependencies }${ diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 4cd5a83ea7..dce6054449 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -221,15 +221,7 @@ describe("to-mermaid", () => { }); function assertDiagram(ignitionModule: IgnitionModule, expectedResult: string) { - const details = { - networkName: "hardhat", - chainId: 31117, - }; - - const result = toMermaid({ - details, - module: ignitionModule, - }); + const result = toMermaid(ignitionModule); assert.equal(result, expectedResult); } From ff8fe1f297f2a846ca3334a906bf50abde52d0ef Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 18:17:55 +0100 Subject: [PATCH 0946/1302] refactor: remove visualize from core api For the moment, remove the visualize function from the public core api. Out intent is to bring this back, returning the full deployment result type so that a visualization can show the current journaled state of a deployment. This will be additative to the api. --- packages/core/src/index.ts | 1 - packages/core/src/visualize.ts | 22 ---------------------- packages/hardhat-plugin/src/index.ts | 7 ------- 3 files changed, 30 deletions(-) delete mode 100644 packages/core/src/visualize.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c708a61f66..db4dbfeb5f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -11,5 +11,4 @@ export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; export * from "./types/serialization"; -export { visualize } from "./visualize"; export { wipe } from "./wipe"; diff --git a/packages/core/src/visualize.ts b/packages/core/src/visualize.ts deleted file mode 100644 index 59718e029c..0000000000 --- a/packages/core/src/visualize.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { IgnitionModuleSerializer } from "./ignition-module-serializer"; -import { validateStageOne } from "./internal/validation/validateStageOne"; -import { ArtifactResolver } from "./types/artifact"; -import { IgnitionModule, IgnitionModuleResult } from "./types/module"; -import { SerializedIgnitionModule } from "./types/serialization"; - -/** - * Serialize an IgnitionModule for displaying to the user - * - * @beta - */ -export async function visualize({ - ignitionModule, - artifactResolver, -}: { - ignitionModule: IgnitionModule>; - artifactResolver: ArtifactResolver; -}): Promise { - await validateStageOne(ignitionModule, artifactResolver); - - return IgnitionModuleSerializer.serialize(ignitionModule); -} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1d03def71a..3441fafd22 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -186,13 +186,6 @@ task("visualize") process.exit(0); } - // const artifactResolver = new HardhatArtifactResolver(hre); - - // const result = await visualize({ - // ignitionModule: userModule, - // artifactResolver, - // }); - const serializedIgnitionModule = IgnitionModuleSerializer.serialize(userModule); From f68813c8d6c3063fbfc0d6527e6ca9ffd614d6e2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 21:11:24 +0100 Subject: [PATCH 0947/1302] test: tweak timeout The chainId check test needs to read an existing deployment, the startup time seems to trip the timeout. --- .../new-api/internal/reconciliation/chainId.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts index 9330e361c5..909d3e7c72 100644 --- a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts +++ b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts @@ -2,7 +2,9 @@ import { assert } from "chai"; import { useHardhatProject } from "../../../helpers/hardhat-projects"; -describe("chainId reconciliation", () => { +describe("chainId reconciliation", function () { + this.timeout(60000); + useHardhatProject("default-with-new-chain-id"); it("should halt when running a deployment on a different chain", async function () { From 5bf67c152fbda93277f0c34ab92c9208273d06ad Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 14 Sep 2023 21:31:44 +0100 Subject: [PATCH 0948/1302] feat: store debug files with build infos If a build info is stored for a future id, record a debug file as a pointer. The debug file is a sibling to the artifact file, so under `./ignition/deployments//artifacts`: - `LockModule#Lock.json` - `LockModule#Lock.dbg.json` The dbg file points at the Ignition build info file via a relative path. Resolves #472. --- .../ephemeral-deployment-loader.ts | 5 +++- .../file-deployment-loader.ts | 27 ++++++++++++++++++- .../src/internal/deployment-loader/types.ts | 2 +- .../helpers/save-artifacts-for-future.ts | 2 +- packages/core/test/reconciliation/helpers.ts | 5 +++- 5 files changed, 36 insertions(+), 5 deletions(-) diff --git a/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts index 32743691dc..3a481d4135 100644 --- a/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts +++ b/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts @@ -46,7 +46,10 @@ export class EphemeralDeploymentLoader implements DeploymentLoader { this._deployedAddresses[futureId] = contractAddress; } - public async storeBuildInfo(_buildInfo: BuildInfo): Promise { + public async storeBuildInfo( + _futureId: string, + _buildInfo: BuildInfo + ): Promise { // For ephemeral we are ignoring build info } diff --git a/packages/core/src/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/internal/deployment-loader/file-deployment-loader.ts index 0fac6ebfc8..d364d21fad 100644 --- a/packages/core/src/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/internal/deployment-loader/file-deployment-loader.ts @@ -81,7 +81,10 @@ export class FileDeploymentLoader implements DeploymentLoader { await writeFile(artifactFilePath, JSON.stringify(artifact, undefined, 2)); } - public async storeBuildInfo(buildInfo: BuildInfo): Promise { + public async storeBuildInfo( + futureId: string, + buildInfo: BuildInfo + ): Promise { await this._initialize(); const buildInfoFilePath = path.join( @@ -90,6 +93,28 @@ export class FileDeploymentLoader implements DeploymentLoader { ); await writeFile(buildInfoFilePath, JSON.stringify(buildInfo, undefined, 2)); + + const debugInfoFilePath = path.join( + this._paths.artifactsDir, + `${futureId}.dbg.json` + ); + + const relativeBuildInfoPath = path.relative( + this._paths.artifactsDir, + buildInfoFilePath + ); + + await writeFile( + debugInfoFilePath, + JSON.stringify( + { + _format: "hh-sol-dbg-1", + buildInfo: relativeBuildInfoPath, + }, + undefined, + 2 + ) + ); } public async loadArtifact(futureId: string): Promise { diff --git a/packages/core/src/internal/deployment-loader/types.ts b/packages/core/src/internal/deployment-loader/types.ts index 2ed3de03c8..74151367b5 100644 --- a/packages/core/src/internal/deployment-loader/types.ts +++ b/packages/core/src/internal/deployment-loader/types.ts @@ -19,7 +19,7 @@ export interface DeploymentLoader { contractName: string, artifact: Artifact ): Promise; - storeBuildInfo(buildInfo: BuildInfo): Promise; + storeBuildInfo(futureId: string, buildInfo: BuildInfo): Promise; recordDeployedAddress( futureId: string, contractAddress: string diff --git a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts index c934dc6ae2..e758ba82ad 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts @@ -58,6 +58,6 @@ async function _storeArtifactAndBuildInfoAgainstDeployment( const buildInfo = await artifactResolver.getBuildInfo(future.contractName); if (buildInfo !== undefined) { - await deploymentLoader.storeBuildInfo(buildInfo); + await deploymentLoader.storeBuildInfo(future.id, buildInfo); } } diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/core/test/reconciliation/helpers.ts index 3b178d125f..fc2dd54d8c 100644 --- a/packages/core/test/reconciliation/helpers.ts +++ b/packages/core/test/reconciliation/helpers.ts @@ -56,7 +56,10 @@ class MockDeploymentLoader implements DeploymentLoader { throw new Error("Method not implemented."); } - public storeBuildInfo(_buildInfo: BuildInfo): Promise { + public storeBuildInfo( + _futureId: string, + _buildInfo: BuildInfo + ): Promise { throw new Error("Method not implemented."); } From 8e67866e315e9c0199274465b66cffcfb98d6424 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 15 Sep 2023 11:40:02 +0100 Subject: [PATCH 0949/1302] chore: bump version to v0.4.0 Update the packages versions and changelogs for the `0.4.0 - 2023-09-15` release. --- README.md | 8 +-- docs/creating-modules-for-deployment.md | 2 +- docs/getting-started-guide.md | 6 +- docs/publish.md | 2 +- examples/complete/hardhat.config.js | 2 +- examples/complete/ignition/CompleteModule.js | 2 +- examples/complete/package.json | 4 +- examples/ens/hardhat.config.js | 2 +- examples/ens/ignition/ENS.js | 2 +- examples/ens/ignition/test-registrar.js | 2 +- examples/ens/package.json | 4 +- examples/sample/hardhat.config.js | 2 +- examples/sample/ignition/LockModule.js | 2 +- examples/sample/package.json | 4 +- examples/ts-sample/hardhat.config.ts | 2 +- examples/ts-sample/ignition/LockModule.ts | 2 +- examples/ts-sample/package.json | 4 +- examples/uniswap/hardhat.config.js | 2 +- examples/uniswap/ignition/Uniswap.js | 2 +- examples/uniswap/package.json | 4 +- package-lock.json | 66 +++++++++---------- packages/core/CHANGELOG.md | 15 +++++ packages/core/package.json | 4 +- .../hardhat.config.js | 2 +- .../ignition/LockModule.js | 2 +- packages/hardhat-plugin/CHANGELOG.md | 18 +++++ packages/hardhat-plugin/README.md | 8 +-- packages/hardhat-plugin/package.json | 12 ++-- .../src/hardhat-artifact-resolver.ts | 6 +- .../hardhat-plugin/src/ignition-helper.ts | 4 +- packages/hardhat-plugin/src/index.ts | 6 +- packages/hardhat-plugin/src/load-module.ts | 2 +- .../hardhat-plugin/src/type-extensions.ts | 2 +- .../hardhat-plugin/src/ui/UiEventHandler.tsx | 2 +- .../src/ui/VerboseEventHandler.ts | 2 +- .../components/execution/AddressResults.tsx | 2 +- .../components/execution/DeployParameters.tsx | 4 +- .../components/execution/ExecutionPanel.tsx | 2 +- .../ui/components/execution/FinalStatus.tsx | 2 +- .../components/execution/SummarySection.tsx | 4 +- .../src/ui/components/index.tsx | 2 +- packages/hardhat-plugin/src/ui/types.ts | 5 +- ...-deployment-result-to-exception-message.ts | 4 +- .../src/visualization/write-visualization.ts | 4 +- packages/hardhat-plugin/test/calls.ts | 2 +- packages/hardhat-plugin/test/config.ts | 2 +- packages/hardhat-plugin/test/contracts.ts | 2 +- .../hardhat-plugin/test/error-handling.ts | 2 +- packages/hardhat-plugin/test/events.ts | 2 +- .../deploy-contract-at-from-artifact.ts | 2 +- .../test/execution/deploy-contract-at.ts | 2 +- .../deploy-contract-from-artifact.ts | 2 +- .../test/execution/deploy-contract.ts | 2 +- .../multiple-batch-contract-deploy.ts | 2 +- .../error-on-pending-user-transactions.ts | 2 +- ...-with-replaced-pending-user-transaction.ts | 2 +- .../error-on-transaction-dropped.ts | 2 +- .../error-on-user-transaction-sent.ts | 2 +- ...rerun-with-dropped-ignition-transaction.ts | 2 +- ...with-now-complete-ignition-transactions.ts | 2 +- ...erun-with-pending-ignition-transactions.ts | 2 +- ...ith-replaced-confirmed-user-transaction.ts | 2 +- .../timeouts/deploy-run-times-out.ts | 2 +- .../timeouts/rerun-a-deploy-that-timed-out.ts | 2 +- .../hardhat-plugin/test/existing-contract.ts | 2 +- .../minimal/ignition/MyModule.js | 2 +- .../with-config/ignition/MyModule.js | 2 +- .../with-invalid-config/ignition/MyModule.js | 2 +- packages/hardhat-plugin/test/libraries.ts | 2 +- packages/hardhat-plugin/test/params.ts | 2 +- packages/hardhat-plugin/test/static-calls.ts | 2 +- .../test/use-ignition-project.ts | 2 +- packages/hardhat-plugin/test/use-module.ts | 2 +- ...-deployment-result-to-exception-message.ts | 2 +- packages/ui/CHANGELOG.md | 6 ++ packages/ui/examples/ComplexModule.js | 2 +- packages/ui/package.json | 6 +- .../generate-example-deployment-json.js | 2 +- packages/ui/src/components/mermaid.tsx | 2 +- packages/ui/src/main.tsx | 2 +- .../components/future-summary.tsx | 2 +- .../pages/future-details/future-details.tsx | 2 +- .../components/action.tsx | 2 +- .../components/visualization-details.tsx | 2 +- .../components/visualization-summary.tsx | 2 +- .../visualization-overview.tsx | 2 +- packages/ui/src/queries/futures.ts | 2 +- .../ui/src/utils/argumentTypeToString.tsx | 2 +- packages/ui/src/utils/to-mermaid.ts | 2 +- packages/ui/test/to-mermaid.ts | 6 +- packages/ui/vite.config.ts | 2 +- 91 files changed, 198 insertions(+), 148 deletions(-) diff --git a/README.md b/README.md index e9b8d0894e..e28e5463dc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![npm](https://img.shields.io/npm/v/@ignored/hardhat-ignition.svg)](https://www.npmjs.com/package/@ignored/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) # Ignition @@ -13,19 +13,19 @@ Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay u ## Installation ```bash -npm install --save-dev @ignored/hardhat-ignition +npm install --save-dev @nomicfoundation/hardhat-ignition ``` And add the following statement to your `hardhat.config.js`: ```js -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); ``` Or, if you are using TypeScript, add this to your `hardhat.config.ts`: ```js -import "@ignored/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition"; ``` ## Getting Started diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index 6005f368e6..a0c1dda98b 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -29,7 +29,7 @@ An **Ignition** deployment is composed of modules. A module is a special javascr For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: ```javascript -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); module.exports = buildModule("MyModule", (m) => { const token = m.contract("Token"); diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 328fb81b82..56d15a88dc 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -40,7 +40,7 @@ $ npx hardhat Add **Ignition** to your **Hardhat** project by installing the plugin: ```bash -npm install --save-dev @ignored/hardhat-ignition +npm install --save-dev @nomicfoundation/hardhat-ignition ``` Modify your `hardhat.config.js` file, to include **Ignition**: @@ -48,7 +48,7 @@ Modify your `hardhat.config.js` file, to include **Ignition**: ```javascript require("@nomicfoundation/hardhat-toolbox"); // ... -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); ``` Create an `./ignition` folder in your project root to contain your deployment modules. @@ -63,7 +63,7 @@ Add a deployment module under the `./ignition` folder for the example `Lock.sol` ```js // ./ignition/LockModule.js -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; diff --git a/docs/publish.md b/docs/publish.md index 965126f8ab..e7814f35e8 100644 --- a/docs/publish.md +++ b/docs/publish.md @@ -30,5 +30,5 @@ yyyy-mm-dd` release. 13. On a successful check, `rebase merge` the release branch into `main` 14. Switch to main branch and pull the latest changes 15. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -16. Publish `@ignored/ignition-core`, `@ignored/ignition-ui` and `@ignored/hardhat-ignition` : `npm publish -w @ignored/ignition-core -w @ignored/ignition-ui -w @ignored/hardhat-ignition` +16. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui` and `@nomicfoundation/hardhat-ignition` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition` 17. Create a release on github off of the pushed tag diff --git a/examples/complete/hardhat.config.js b/examples/complete/hardhat.config.js index 25f05d06a5..13d2a0f3fa 100644 --- a/examples/complete/hardhat.config.js +++ b/examples/complete/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { diff --git a/examples/complete/ignition/CompleteModule.js b/examples/complete/ignition/CompleteModule.js index 97270eb89b..3c6a3b6691 100644 --- a/examples/complete/ignition/CompleteModule.js +++ b/examples/complete/ignition/CompleteModule.js @@ -1,5 +1,5 @@ // ./ignition/CompleteModule.js -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const withLibArtifact = require("../libArtifacts/ContractWithLibrary.json"); const libArtifact = require("../libArtifacts/BasicLibrary.json"); diff --git a/examples/complete/package.json b/examples/complete/package.json index 6b11a4ead2..f33290ecbb 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.3.0", + "version": "0.4.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/hardhat.config.js b/examples/ens/hardhat.config.js index 0e8d9661a2..35757a331b 100644 --- a/examples/ens/hardhat.config.js +++ b/examples/ens/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); /** * @type import('hardhat/config').HardhatUserConfig diff --git a/examples/ens/ignition/ENS.js b/examples/ens/ignition/ENS.js index 4235a455e2..3d817ab9ae 100644 --- a/examples/ens/ignition/ENS.js +++ b/examples/ens/ignition/ENS.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; diff --git a/examples/ens/ignition/test-registrar.js b/examples/ens/ignition/test-registrar.js index b205d7f90e..30d036824f 100644 --- a/examples/ens/ignition/test-registrar.js +++ b/examples/ens/ignition/test-registrar.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const namehash = require("eth-ens-namehash"); const setupENSRegistry = require("./ENS"); diff --git a/examples/ens/package.json b/examples/ens/package.json index c01795cb0d..3c21a7f267 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.3.0", + "version": "0.4.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/hardhat.config.js b/examples/sample/hardhat.config.js index b58214d629..e2073ce58b 100644 --- a/examples/sample/hardhat.config.js +++ b/examples/sample/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { diff --git a/examples/sample/ignition/LockModule.js b/examples/sample/ignition/LockModule.js index b92a97215c..b2f59882bd 100644 --- a/examples/sample/ignition/LockModule.js +++ b/examples/sample/ignition/LockModule.js @@ -1,5 +1,5 @@ // ./ignition/LockModule.js -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; diff --git a/examples/sample/package.json b/examples/sample/package.json index 66ef176f00..22d64492cd 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.3.0", + "version": "0.4.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/hardhat.config.ts b/examples/ts-sample/hardhat.config.ts index 032fa8e67b..007372f697 100644 --- a/examples/ts-sample/hardhat.config.ts +++ b/examples/ts-sample/hardhat.config.ts @@ -1,7 +1,7 @@ import type { HardhatUserConfig } from "hardhat/config"; +import "@nomicfoundation/hardhat-ignition"; import "@nomicfoundation/hardhat-toolbox"; -import "@ignored/hardhat-ignition"; const config: HardhatUserConfig = { solidity: "0.8.17", diff --git a/examples/ts-sample/ignition/LockModule.ts b/examples/ts-sample/ignition/LockModule.ts index e196458c55..cc64bd5d8f 100644 --- a/examples/ts-sample/ignition/LockModule.ts +++ b/examples/ts-sample/ignition/LockModule.ts @@ -1,4 +1,4 @@ -import { buildModule } from "@ignored/hardhat-ignition"; +import { buildModule } from "@nomicfoundation/hardhat-ignition"; import hre from "hardhat"; const currentTimestampInSeconds = Math.round( diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index f37b4e158e..417c3ac755 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.3.0", + "version": "0.4.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/uniswap/hardhat.config.js b/examples/uniswap/hardhat.config.js index 08c4c1b029..7c66793023 100644 --- a/examples/uniswap/hardhat.config.js +++ b/examples/uniswap/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); /** * @type import('hardhat/config').HardhatUserConfig diff --git a/examples/uniswap/ignition/Uniswap.js b/examples/uniswap/ignition/Uniswap.js index d97c15fef7..d753af1a11 100644 --- a/examples/uniswap/ignition/Uniswap.js +++ b/examples/uniswap/ignition/Uniswap.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const UniswapV3Factory = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json"); const UniswapInterfaceMulticall = require("@uniswap/v3-periphery/artifacts/contracts/lens/UniswapInterfaceMulticall.sol/UniswapInterfaceMulticall.json"); diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index e56b8e9acf..cbadd0a137 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-uniswap-example", "private": true, - "version": "0.3.0", + "version": "0.4.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 76b73b11ee..a2f1745b90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.3.0", + "version": "0.4.0", "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -246,12 +246,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.3.0", + "version": "0.4.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -465,9 +465,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.3.0", + "version": "0.4.0", "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -667,9 +667,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.3.0", + "version": "0.4.0", "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -869,7 +869,7 @@ }, "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.3.0", + "version": "0.4.0", "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -881,7 +881,7 @@ "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" }, "devDependencies": { - "@ignored/hardhat-ignition": "^0.3.0", + "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.14.0", "prettier-plugin-solidity": "1.1.3" @@ -3311,18 +3311,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@ignored/hardhat-ignition": { - "resolved": "packages/hardhat-plugin", - "link": true - }, - "node_modules/@ignored/ignition-core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@ignored/ignition-ui": { - "resolved": "packages/ui", - "link": true - }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4034,6 +4022,10 @@ "setimmediate": "^1.0.5" } }, + "node_modules/@nomicfoundation/hardhat-ignition": { + "resolved": "packages/hardhat-plugin", + "link": true + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", @@ -4123,6 +4115,10 @@ "resolved": "examples/complete", "link": true }, + "node_modules/@nomicfoundation/ignition-core": { + "resolved": "packages/core", + "link": true + }, "node_modules/@nomicfoundation/ignition-ens-example": { "resolved": "examples/ens", "link": true @@ -4135,6 +4131,10 @@ "resolved": "examples/ts-sample", "link": true }, + "node_modules/@nomicfoundation/ignition-ui": { + "resolved": "packages/ui", + "link": true + }, "node_modules/@nomicfoundation/ignition-uniswap-example": { "resolved": "examples/uniswap", "link": true @@ -21724,8 +21724,8 @@ } }, "packages/core": { - "name": "@ignored/ignition-core", - "version": "0.3.0", + "name": "@nomicfoundation/ignition-core", + "version": "0.4.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21859,8 +21859,8 @@ } }, "packages/hardhat-plugin": { - "name": "@ignored/hardhat-ignition", - "version": "0.3.0", + "name": "@nomicfoundation/hardhat-ignition", + "version": "0.4.0", "license": "MIT", "dependencies": { "debug": "^4.3.2", @@ -21875,10 +21875,10 @@ "serialize-error": "8.1.0" }, "devDependencies": { - "@ignored/ignition-core": "^0.3.0", - "@ignored/ignition-ui": "^0.3.0", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-ui": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -21916,9 +21916,9 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.3.0", - "@ignored/ignition-ui": "^0.3.0", "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-ui": "^0.4.0", "hardhat": "^2.14.0" } }, @@ -22153,10 +22153,10 @@ } }, "packages/ui": { - "name": "@ignored/ignition-ui", - "version": "0.3.0", + "name": "@nomicfoundation/ignition-ui", + "version": "0.4.0", "dependencies": { - "@ignored/ignition-core": "^0.3.0", + "@nomicfoundation/ignition-core": "^0.4.0", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 7c4ae555c6..a9ee9b9ed2 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,21 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.4.0 - 2023-09-15 + +### Added + +- Store artifact debug files as part of deployment directory ([#473](https://github.com/NomicFoundation/ignition/pull/473)) + +### Changed + +- Changed npm package name to `@nomicfoundation/ignition-core` +- Constrain module ids and action ids to better support storing deployments on windows ([#466](https://github.com/NomicFoundation/ignition/pull/466)) + +### Fixed + +- Fix batch completion on non-automining chains ([#467](https://github.com/NomicFoundation/ignition/pull/467)) + ## 0.3.0 - 2023-08-30 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index fb7588a3d4..5a1f861503 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { - "name": "@ignored/ignition-core", - "version": "0.3.0", + "name": "@nomicfoundation/ignition-core", + "version": "0.4.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js index cdbd90a3a7..c76e2c9b8d 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js @@ -1,4 +1,4 @@ -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/LockModule.js b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/LockModule.js index 2b9d7e5c1c..6ed59e1929 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/LockModule.js +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/LockModule.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@ignored/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition"); const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 53cc3e6dd6..7f612ed681 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,24 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.4.0 - 2023-09-15 + +### Added + +- Advanced cli UI for deploy ([#401](https://github.com/NomicFoundation/ignition/pull/401)) +- Store artifact debug files as part of deployment directory ([#473](https://github.com/NomicFoundation/ignition/pull/473)) + +### Changed + +- Changed npm package name to `@nomicfoundation/hardhat-ignition` +- rename the `plan` task to `visualize` ([#471](https://github.com/NomicFoundation/ignition/pull/471)) +- Constrain module ids and action ids to better support storing deployments on windows ([#466](https://github.com/NomicFoundation/ignition/pull/466)) +- Rename `use-verbose` flag on `deploy` task to `simple-text-ui` ([#444](https://github.com/NomicFoundation/ignition/pull/444)) + +### Fixed + +- Fix batch completion on non-automining chains ([#467](https://github.com/NomicFoundation/ignition/pull/467)) + ## 0.3.0 - 2023-08-30 ### Added diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 87265efa69..0793fbe54f 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -1,4 +1,4 @@ -[![npm](https://img.shields.io/npm/v/@ignored/hardhat-ignition.svg)](https://www.npmjs.com/package/@ignored/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) # hardhat-ignition @@ -11,19 +11,19 @@ This plugin brings **Ignition** to your **Hardhat** project, allowing you to orc ## Installation ```bash -npm install --save-dev @ignored/hardhat-ignition +npm install --save-dev @nomicfoundation/hardhat-ignition ``` And add the following statement to your `hardhat.config.js`: ```js -require("@ignored/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition"); ``` Or, if you are using TypeScript, add this to your `hardhat.config.ts`: ```js -import "@ignored/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition"; ``` ## Tasks diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 6591ea3aa8..c3f4399fc8 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { - "name": "@ignored/hardhat-ignition", - "version": "0.3.0", + "name": "@nomicfoundation/hardhat-ignition", + "version": "0.4.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -31,8 +31,8 @@ "prepack": "npm run build" }, "devDependencies": { - "@ignored/ignition-core": "^0.3.0", - "@ignored/ignition-ui": "^0.3.0", + "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-ui": "^0.4.0", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", "@types/chai": "^4.2.22", @@ -72,8 +72,8 @@ "typescript": "^4.7.4" }, "peerDependencies": { - "@ignored/ignition-core": "^0.3.0", - "@ignored/ignition-ui": "^0.3.0", + "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-ui": "^0.4.0", "@nomicfoundation/hardhat-ethers": "^3.0.4", "hardhat": "^2.14.0" }, diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts index f57b8e671d..3178437096 100644 --- a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts +++ b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts @@ -1,4 +1,8 @@ -import { Artifact, ArtifactResolver, BuildInfo } from "@ignored/ignition-core"; +import { + Artifact, + ArtifactResolver, + BuildInfo, +} from "@nomicfoundation/ignition-core"; import fs from "fs"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index ead8e254cc..a08cb1d8fd 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -14,7 +14,7 @@ import { NamedArtifactContractAtFuture, NamedArtifactContractDeploymentFuture, SuccessfulDeploymentResult, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -133,7 +133,7 @@ export class IgnitionHelper { ): Promise { if (!isContractFuture(future)) { throw new HardhatPluginError( - "@ignored/hardhat-ignition", + "@nomicfoundation/hardhat-ignition", `Expected contract future but got ${future.id} with type ${future.type} instead` ); } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3441fafd22..bfc270c747 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,10 +1,10 @@ +import "@nomicfoundation/hardhat-ethers"; import { deploy, DeploymentParameters, IgnitionModuleSerializer, wipe, -} from "@ignored/ignition-core"; -import "@nomicfoundation/hardhat-ethers"; +} from "@nomicfoundation/ignition-core"; import { existsSync, readdirSync, readJSONSync } from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; @@ -22,7 +22,7 @@ import { writeVisualization } from "./visualization/write-visualization"; import "./type-extensions"; // eslint-disable-next-line import/no-unused-modules -export { buildModule } from "@ignored/ignition-core"; +export { buildModule } from "@nomicfoundation/ignition-core"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 5e8d5fe912..d49aa718b8 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,4 +1,4 @@ -import { IgnitionError, IgnitionModule } from "@ignored/ignition-core"; +import { IgnitionError, IgnitionModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import { existsSync, pathExistsSync } from "fs-extra"; import path from "path"; diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index cc1eb75507..1179611234 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -2,7 +2,7 @@ import "hardhat/types/config"; import "hardhat/types/runtime"; -import { DeployConfig } from "@ignored/ignition-core"; +import { DeployConfig } from "@nomicfoundation/ignition-core"; import { IgnitionHelper } from "./ignition-helper"; diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx index f6484958e2..e7f7d100ad 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx @@ -32,7 +32,7 @@ import { TransactionConfirmEvent, TransactionSendEvent, WipeApplyEvent, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { render } from "ink"; import { IgnitionUi } from "./components"; diff --git a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts index b8ad6e9cf7..4414cb27de 100644 --- a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts +++ b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts @@ -27,7 +27,7 @@ import { TransactionConfirmEvent, TransactionSendEvent, WipeApplyEvent, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; export class VerboseEventHandler implements ExecutionEventListener { public runStart(event: RunStartEvent): void { diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 8edd425a2b..451c2629f3 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,7 +1,7 @@ import { IgnitionModuleResult, SuccessfulDeploymentResult, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { Box, Spacer, Text } from "ink"; import { NetworkInfo } from "./NetworkInfo"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx index 23c0c8cd68..941908b0e1 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx @@ -1,9 +1,9 @@ import type { DeploymentParameters, ModuleParameters, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; -import { Text, Newline } from "ink"; +import { Newline, Text } from "ink"; export const DeployParameters = ({ deployParams, diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index 5af85d5611..da877c56b3 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -1,4 +1,4 @@ -import type { DeploymentParameters } from "@ignored/ignition-core"; +import type { DeploymentParameters } from "@nomicfoundation/ignition-core"; import { Box } from "ink"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index db0b9b8d8a..c64935741a 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -6,7 +6,7 @@ import { ReconciliationErrorDeploymentResult, SuccessfulDeploymentResult, ValidationErrorDeploymentResult, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { Box, Newline, Text } from "ink"; import { UiState } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx index 043f6b8974..fbcd01e37b 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx @@ -1,5 +1,5 @@ -import { DeploymentParameters } from "@ignored/ignition-core"; -import { Box, Text, Spacer } from "ink"; +import { DeploymentParameters } from "@nomicfoundation/ignition-core"; +import { Box, Spacer, Text } from "ink"; import { UiState } from "../../types"; diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx index c17a043a7f..930a0ece7b 100644 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ b/packages/hardhat-plugin/src/ui/components/index.tsx @@ -1,4 +1,4 @@ -import type { DeploymentParameters } from "@ignored/ignition-core"; +import type { DeploymentParameters } from "@nomicfoundation/ignition-core"; import { UiState, UiStateDeploymentStatus } from "../types"; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 266d0ba0ff..a45c2470dc 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -1,4 +1,7 @@ -import { DeploymentResult, IgnitionModuleResult } from "@ignored/ignition-core"; +import { + DeploymentResult, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core"; export enum UiFutureStatusType { UNSTARTED = "UNSTARTED", diff --git a/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts index 10d7822ccc..db02b53b1f 100644 --- a/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts +++ b/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts @@ -4,7 +4,7 @@ import { PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, ValidationErrorDeploymentResult, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; /** @@ -135,7 +135,7 @@ function _toText({ } throw new HardhatPluginError( - "@ignored/hardhat-ignition", + "@nomicfoundation/hardhat-ignition", "Invariant violated: neither timeouts or failures" ); } diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts index 11e41aa613..183dbc1b10 100644 --- a/packages/hardhat-plugin/src/visualization/write-visualization.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -1,4 +1,4 @@ -import { SerializedIgnitionModule } from "@ignored/ignition-core"; +import { SerializedIgnitionModule } from "@nomicfoundation/ignition-core"; import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; import path from "path"; @@ -7,7 +7,7 @@ export async function writeVisualization( { cacheDir }: { cacheDir: string } ) { const templateDir = path.join( - require.resolve("@ignored/ignition-ui/package.json"), + require.resolve("@nomicfoundation/ignition-ui/package.json"), "../dist" ); diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/calls.ts index d4d5fa078a..f12a24e2bf 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/calls.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 36029f1ffa..88e42c5b0c 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,6 +1,6 @@ /* eslint-disable import/no-unused-modules */ -import { DeployConfig, buildModule } from "@ignored/ignition-core"; +import { DeployConfig, buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { KeyListOf } from "./type-helper"; diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 30a3a0e7f9..205b1e3196 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts index 6ec99541d0..1ef33498b3 100644 --- a/packages/hardhat-plugin/test/error-handling.ts +++ b/packages/hardhat-plugin/test/error-handling.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/events.ts index 167f00ed81..c61ff3ef13 100644 --- a/packages/hardhat-plugin/test/events.ts +++ b/packages/hardhat-plugin/test/events.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts index 4b162ccbce..5e81e72ce0 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts index 916afdad5c..8d8e248727 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts index 2fdea59935..84fd82a59b 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { waitForPendingTxs } from "../helpers"; diff --git a/packages/hardhat-plugin/test/execution/deploy-contract.ts b/packages/hardhat-plugin/test/execution/deploy-contract.ts index a3e2d4be9b..a2e69bfe72 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { waitForPendingTxs } from "../helpers"; diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts index 7fb49d640d..14ac3a8c51 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "../use-ignition-project"; diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts index 39adecdaeb..1d77b324a4 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { waitForPendingTxs } from "../../helpers"; diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts index ac7aca2c99..07815222c8 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts index 4218caf047..8b02d1e4d0 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts index cdb74273cb..47d3501931 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts index 8ba9a16dfd..2163ac8c03 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts index 06183e5fd8..c3000d7a2a 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts index 270a9613ff..5b633cb794 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts index a0f73945be..3a49397d5a 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts +++ b/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts index 3bc5db8d85..51c26d7bcb 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts index 7c3c80fbff..10d0552348 100644 --- a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts +++ b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index c29eed706d..890762fee1 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js index cb7a2935d8..f00a750bde 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/MyModule.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/no-unused-modules -const { buildModule } = require("@ignored/ignition-core"); +const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar"); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js index 3a4fc78c52..9f13f90ace 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/MyModule.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/no-unused-modules -const { buildModule } = require("@ignored/ignition-core"); +const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar"); diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/MyModule.js index 3a4fc78c52..9f13f90ace 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/MyModule.js @@ -1,5 +1,5 @@ // eslint-disable-next-line import/no-unused-modules -const { buildModule } = require("@ignored/ignition-core"); +const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { const bar = m.contract("Bar"); diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/libraries.ts index 6da51a08c8..146036bda7 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/libraries.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/params.ts index 2e5f375dc9..6c33254069 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/params.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index 22bef6664f..8c34694a6e 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/use-ignition-project.ts b/packages/hardhat-plugin/test/use-ignition-project.ts index dab2d5d311..5dafa55647 100644 --- a/packages/hardhat-plugin/test/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/use-ignition-project.ts @@ -1,4 +1,4 @@ -import { DeployConfig, IgnitionModule } from "@ignored/ignition-core"; +import { DeployConfig, IgnitionModule } from "@nomicfoundation/ignition-core"; import { Contract } from "ethers"; import { ensureDirSync, removeSync } from "fs-extra"; import { resetHardhatContext } from "hardhat/plugins-testing"; diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/use-module.ts index ec0e3b398c..586047e6f6 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/use-module.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./use-ignition-project"; diff --git a/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts index 0fabeec6a1..5af59e6927 100644 --- a/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts +++ b/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts @@ -3,7 +3,7 @@ import { ExecutionErrorDeploymentResult, ReconciliationErrorDeploymentResult, ValidationErrorDeploymentResult, -} from "@ignored/ignition-core"; +} from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 83385f50ec..015829aa36 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.4.0 - 2023-09-15 + +### Changed + +- Now published on the `@nomicfoundation` namespace + ## 0.1.0 - 2023-07-27 ### Added diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index 3b3d2bc732..4a972e1b64 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -1,4 +1,4 @@ -import { buildModule } from "@ignored/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; const fakeArtifact = ["fake artifact"]; diff --git a/packages/ui/package.json b/packages/ui/package.json index c91d48211d..309d457329 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { - "name": "@ignored/ignition-ui", - "version": "0.3.0", + "name": "@nomicfoundation/ignition-ui", + "version": "0.4.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -14,7 +14,7 @@ "prepack": "npm run build" }, "dependencies": { - "@ignored/ignition-core": "^0.3.0", + "@nomicfoundation/ignition-core": "^0.4.0", "mermaid": "10.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/packages/ui/scripts/generate-example-deployment-json.js b/packages/ui/scripts/generate-example-deployment-json.js index 53fc8d74c2..b619aa1482 100644 --- a/packages/ui/scripts/generate-example-deployment-json.js +++ b/packages/ui/scripts/generate-example-deployment-json.js @@ -1,4 +1,4 @@ -import { IgnitionModuleSerializer } from "@ignored/ignition-core"; +import { IgnitionModuleSerializer } from "@nomicfoundation/ignition-core"; import { writeFile } from "node:fs/promises"; import complexModule from "../examples/ComplexModule.js"; diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index 98bd5f9a2e..ea5aa75d55 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -4,7 +4,7 @@ import styled from "styled-components"; import { IgnitionModule, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import mermaid from "mermaid"; import { toMermaid } from "../utils/to-mermaid"; diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index 77d6918653..1bcf46e48c 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -4,7 +4,7 @@ import { IgnitionModule, IgnitionModuleDeserializer, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import ReactDOM from "react-dom/client"; import { RouterProvider, createHashRouter } from "react-router-dom"; import { FutureDetails } from "./pages/future-details/future-details"; diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx index a6e713966f..3ffbd30e87 100644 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ b/packages/ui/src/pages/future-details/components/future-summary.tsx @@ -2,7 +2,7 @@ import { Future, FutureType, isFuture, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import { PageTitle, Panel } from "../../../components/shared"; import { SummaryHeader } from "../../../components/summary-header"; import { argumentTypeToString } from "../../../utils/argumentTypeToString"; diff --git a/packages/ui/src/pages/future-details/future-details.tsx b/packages/ui/src/pages/future-details/future-details.tsx index df9506764a..5b0a220272 100644 --- a/packages/ui/src/pages/future-details/future-details.tsx +++ b/packages/ui/src/pages/future-details/future-details.tsx @@ -1,7 +1,7 @@ import { IgnitionModule, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import React, { useMemo } from "react"; import { useParams } from "react-router-dom"; import { Page } from "../../components/shared"; diff --git a/packages/ui/src/pages/visualization-overview/components/action.tsx b/packages/ui/src/pages/visualization-overview/components/action.tsx index 356a0c1ae9..8481730661 100644 --- a/packages/ui/src/pages/visualization-overview/components/action.tsx +++ b/packages/ui/src/pages/visualization-overview/components/action.tsx @@ -2,7 +2,7 @@ import { Future, FutureType, isFuture, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import React, { useCallback } from "react"; import { useNavigate } from "react-router-dom"; import styled, { css } from "styled-components"; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx index 4e5ff23b19..f3e6213dd4 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx @@ -1,7 +1,7 @@ import { IgnitionModule, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import { useMemo } from "react"; import styled from "styled-components"; import { Mermaid } from "../../../components/mermaid"; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx index 40e88c2436..6f16006f93 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx @@ -1,7 +1,7 @@ import { IgnitionModule, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import React, { useMemo } from "react"; import styled from "styled-components"; import { SummaryHeader } from "../../../components/summary-header"; diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx index 0e056c9926..0f2116ced9 100644 --- a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -1,7 +1,7 @@ import { IgnitionModule, IgnitionModuleResult, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import React from "react"; import { Page, PageTitle, Panel } from "../../components/shared"; import { VisualizationDetails } from "./components/visualization-details"; diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index 9a2f91415a..897ed0dfe6 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -6,7 +6,7 @@ import { IgnitionModuleResult, isDeploymentFuture, isFunctionCallFuture, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; export function getFutureById( ignitionModule: IgnitionModule>, diff --git a/packages/ui/src/utils/argumentTypeToString.tsx b/packages/ui/src/utils/argumentTypeToString.tsx index 3a4a3334dd..fbfb67fbba 100644 --- a/packages/ui/src/utils/argumentTypeToString.tsx +++ b/packages/ui/src/utils/argumentTypeToString.tsx @@ -3,7 +3,7 @@ import { RuntimeValueType, isFuture, isRuntimeValue, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; export function argumentTypeToString(argument: ArgumentType): string { return JSON.stringify( diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 7c96310635..a9695da872 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -4,7 +4,7 @@ import { IgnitionModule, IgnitionModuleResult, isFuture, -} from "@ignored/ignition-core/ui-helpers"; +} from "@nomicfoundation/ignition-core/ui-helpers"; import { getAllFuturesForModule } from "../queries/futures.js"; import { argumentTypeToString } from "./argumentTypeToString.js"; diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index dce6054449..6695dd4fa7 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -1,4 +1,8 @@ -import { Artifact, IgnitionModule, buildModule } from "@ignored/ignition-core"; +import { + Artifact, + IgnitionModule, + buildModule, +} from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { toMermaid } from "../src/utils/to-mermaid.js"; diff --git a/packages/ui/vite.config.ts b/packages/ui/vite.config.ts index 31e35cae03..533d4623c0 100644 --- a/packages/ui/vite.config.ts +++ b/packages/ui/vite.config.ts @@ -6,7 +6,7 @@ import { viteSingleFile } from "vite-plugin-singlefile"; export default defineConfig({ plugins: [react(), viteSingleFile()], optimizeDeps: { - include: ["@ignored/ignition-core/ui-helpers"], + include: ["@nomicfoundation/ignition-core/ui-helpers"], }, build: { commonjsOptions: { From 9483774166b8d90c43b96191feb5d816792746d5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 17 Sep 2023 20:39:04 -0400 Subject: [PATCH 0950/1302] refactor stage two validation to return all validation errors --- .../core/src/internal/execution/libraries.ts | 75 +++++++++++++------ .../stageTwo/validateArtifactContractAt.ts | 11 ++- .../validateArtifactContractDeployment.ts | 19 +++-- .../validateArtifactLibraryDeployment.ts | 12 ++- .../stageTwo/validateNamedContractAt.ts | 11 ++- .../stageTwo/validateNamedContractCall.ts | 19 +++-- .../validateNamedContractDeployment.ts | 21 ++++-- .../validateNamedLibraryDeployment.ts | 8 +- .../stageTwo/validateNamedStaticCall.ts | 15 +++- .../stageTwo/validateReadEventArgument.ts | 4 +- .../validation/stageTwo/validateSendData.ts | 21 ++++-- .../core/src/internal/validation/utils.ts | 13 ++-- .../internal/validation/validateStageTwo.ts | 73 ++++++++---------- 13 files changed, 183 insertions(+), 119 deletions(-) diff --git a/packages/core/src/internal/execution/libraries.ts b/packages/core/src/internal/execution/libraries.ts index b450dca221..63eca2a45a 100644 --- a/packages/core/src/internal/execution/libraries.ts +++ b/packages/core/src/internal/execution/libraries.ts @@ -15,6 +15,7 @@ import { IgnitionValidationError } from "../../errors"; import { Artifact } from "../../types/artifact"; +import { assertIgnitionInvariant } from "../utils/assertions"; /** * This function validates that the libraries object ensures that libraries: @@ -26,8 +27,10 @@ import { Artifact } from "../../types/artifact"; export function validateLibraryNames( artifact: Artifact, libraryNames: string[] -) { - validateNotRepeatedLibraries(artifact, libraryNames); +): string[] { + const errors: string[] = []; + + errors.push(...validateNotRepeatedLibraries(artifact, libraryNames)); const requiredLibraries = new Set(); for (const sourceName of Object.keys(artifact.linkReferences)) { @@ -36,27 +39,38 @@ export function validateLibraryNames( } } - const libraryNameToParsedName = libraryNames.map((libraryName) => - getActualNameForArtifactLibrary(artifact, libraryName) - ); - - for (const parsedName of Object.values(libraryNameToParsedName)) { - requiredLibraries.delete( - getFullyQualifiedName(parsedName.sourceName, parsedName.libName) + try { + const libraryNameToParsedName = libraryNames.map((libraryName) => + getActualNameForArtifactLibrary(artifact, libraryName) ); - } - if (requiredLibraries.size !== 0) { - const fullyQualifiedNames = Array.from(requiredLibraries) - .map((name) => `* ${name}`) - .join("\n"); + for (const parsedName of Object.values(libraryNameToParsedName)) { + requiredLibraries.delete( + getFullyQualifiedName(parsedName.sourceName, parsedName.libName) + ); + } - throw new IgnitionValidationError( - `Invalid libraries for contract ${artifact.contractName}: The following libraries are missing: + if (requiredLibraries.size !== 0) { + const fullyQualifiedNames = Array.from(requiredLibraries) + .map((name) => `* ${name}`) + .join("\n"); + + errors.push( + `Invalid libraries for contract ${artifact.contractName}: The following libraries are missing: ${fullyQualifiedNames}` + ); + } + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "Error must be of type IgnitionValidationError" ); + + errors.push(e.message); } + + return errors; } /** @@ -101,19 +115,32 @@ function linkReference( function validateNotRepeatedLibraries( artifact: Artifact, libraryNames: string[] -) { +): string[] { + const errors: string[] = []; + for (const inputName of libraryNames) { - const { sourceName, libName } = parseLibraryName( - artifact.contractName, - inputName - ); + try { + const { sourceName, libName } = parseLibraryName( + artifact.contractName, + inputName + ); - if (sourceName !== undefined && libraryNames.includes(libName)) { - throw new IgnitionValidationError( - `Invalid libraries for contract ${artifact.contractName}: The names "${inputName}" and "${libName}" clash with each other, please use qualified names for both.` + if (sourceName !== undefined && libraryNames.includes(libName)) { + errors.push( + `Invalid libraries for contract ${artifact.contractName}: The names "${inputName}" and "${libName}" clash with each other, please use qualified names for both.` + ); + } + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + `Error must be of type IgnitionValidationError` ); + + errors.push(e.message); } } + + return errors; } /** diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts index eeac6e55aa..91697fef37 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; @@ -9,21 +8,25 @@ export async function validateArtifactContractAt( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, _accounts: string[] -) { +): Promise { + const errors: string[] = []; + if (isModuleParameterRuntimeValue(future.address)) { const param = deploymentParameters[future.address.moduleId]?.[future.address.name] ?? future.address.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.address.name}' requires a value but was given none` ); } else if (typeof param !== "string") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.address.name }' must be of type 'string' but is '${typeof param}'` ); } } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts index 4ed1068e28..375b662a8c 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -16,7 +15,9 @@ export async function validateArtifactContractDeployment( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ @@ -24,7 +25,11 @@ export async function validateArtifactContractDeployment( ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; - accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); const missingParams = moduleParams.filter( (param) => @@ -33,7 +38,7 @@ export async function validateArtifactContractDeployment( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${missingParams[0].name}' requires a value but was given none` ); } @@ -43,15 +48,17 @@ export async function validateArtifactContractDeployment( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.value.name}' requires a value but was given none` ); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.value.name }' must be of type 'bigint' but is '${typeof param}'` ); } } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts index ee5c974d4d..1378112014 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts @@ -10,10 +10,16 @@ export async function validateArtifactLibraryDeployment( _artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + if (isAccountRuntimeValue(future.from)) { - validateAccountRuntimeValue(future.from, accounts); + errors.push(...validateAccountRuntimeValue(future.from, accounts)); } - validateLibraryNames(future.artifact, Object.keys(future.libraries)); + errors.push( + ...validateLibraryNames(future.artifact, Object.keys(future.libraries)) + ); + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts index 1f9c64e9cf..5b2aa4dc42 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; @@ -9,21 +8,25 @@ export async function validateNamedContractAt( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, _accounts: string[] -) { +): Promise { + const errors: string[] = []; + if (isModuleParameterRuntimeValue(future.address)) { const param = deploymentParameters[future.address.moduleId]?.[future.address.name] ?? future.address.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.address.name}' requires a value but was given none` ); } else if (typeof param !== "string") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.address.name }' must be of type 'string' but is '${typeof param}'` ); } } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts index e8cbe454e3..26b94790bf 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -16,7 +15,9 @@ export async function validateNamedContractCall( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ @@ -24,7 +25,11 @@ export async function validateNamedContractCall( ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; - accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); const missingParams = moduleParams.filter( (param) => @@ -33,7 +38,7 @@ export async function validateNamedContractCall( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${missingParams[0].name}' requires a value but was given none` ); } @@ -43,15 +48,17 @@ export async function validateNamedContractCall( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.value.name}' requires a value but was given none` ); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.value.name }' must be of type 'bigint' but is '${typeof param}'` ); } } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts index f8b76dad80..05c3a4e3fc 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -13,10 +12,12 @@ import { export async function validateNamedContractDeployment( future: NamedArtifactContractDeploymentFuture, - artifactLoader: ArtifactResolver, + _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ @@ -24,7 +25,11 @@ export async function validateNamedContractDeployment( ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; - accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); const missingParams = moduleParams.filter( (param) => @@ -33,7 +38,7 @@ export async function validateNamedContractDeployment( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${missingParams[0].name}' requires a value but was given none` ); } @@ -43,15 +48,17 @@ export async function validateNamedContractDeployment( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.value.name}' requires a value but was given none` ); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.value.name }' must be of type 'bigint' but is '${typeof param}'` ); } } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts index 705c8e55f9..29a318bcce 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts @@ -9,8 +9,12 @@ export async function validateNamedLibraryDeployment( _artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + if (isAccountRuntimeValue(future.from)) { - validateAccountRuntimeValue(future.from, accounts); + errors.push(...validateAccountRuntimeValue(future.from, accounts)); } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts index 36becb052c..99c557b6ea 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -16,7 +15,9 @@ export async function validateNamedStaticCall( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ @@ -24,7 +25,11 @@ export async function validateNamedStaticCall( ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; - accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); const missingParams = moduleParams.filter( (param) => @@ -33,8 +38,10 @@ export async function validateNamedStaticCall( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${missingParams[0].name}' requires a value but was given none` ); } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts b/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts index e6ad4067a0..9b8065d59b 100644 --- a/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts +++ b/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts @@ -7,6 +7,6 @@ export async function validateReadEventArgument( _artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, _accounts: string[] -) { - return; // no-op +): Promise { + return []; // no-op } diff --git a/packages/core/src/internal/validation/stageTwo/validateSendData.ts b/packages/core/src/internal/validation/stageTwo/validateSendData.ts index fb878e00f9..66bcc0bb8a 100644 --- a/packages/core/src/internal/validation/stageTwo/validateSendData.ts +++ b/packages/core/src/internal/validation/stageTwo/validateSendData.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../../errors"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -13,24 +12,30 @@ export async function validateSendData( _artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { + const errors: string[] = []; + const accountParams = [ ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ...(isAccountRuntimeValue(future.to) ? [future.to] : []), ]; - accountParams.forEach((arv) => validateAccountRuntimeValue(arv, accounts)); + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); if (isModuleParameterRuntimeValue(future.to)) { const param = deploymentParameters[future.to.moduleId]?.[future.to.name] ?? future.to.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.to.name}' requires a value but was given none` ); } else if (typeof param !== "string") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.to.name }' must be of type 'string' but is '${typeof param}'` @@ -43,11 +48,11 @@ export async function validateSendData( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( + errors.push( `Module parameter '${future.value.name}' requires a value but was given none` ); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( + errors.push( `Module parameter '${ future.value.name }' must be of type 'bigint' but is '${typeof param}'` @@ -55,5 +60,5 @@ export async function validateSendData( } } - return; + return errors; } diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts index 014a4650dc..d30690757c 100644 --- a/packages/core/src/internal/validation/utils.ts +++ b/packages/core/src/internal/validation/utils.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../errors"; import { isFuture, isRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue, @@ -9,18 +8,20 @@ import { export function validateAccountRuntimeValue( arv: AccountRuntimeValue, accounts: string[] -): void { +): string[] { + const errors: string[] = []; + if (arv.accountIndex < 0) { - throw new IgnitionValidationError( - `Account index cannot be a negative number` - ); + errors.push(`Account index cannot be a negative number`); } if (arv.accountIndex >= accounts.length) { - throw new IgnitionValidationError( + errors.push( `Requested account index '${arv.accountIndex}' is greater than the total number of available accounts '${accounts.length}'` ); } + + return errors; } export function retrieveNestedRuntimeValues( diff --git a/packages/core/src/internal/validation/validateStageTwo.ts b/packages/core/src/internal/validation/validateStageTwo.ts index 1e5623d06e..277d8afdff 100644 --- a/packages/core/src/internal/validation/validateStageTwo.ts +++ b/packages/core/src/internal/validation/validateStageTwo.ts @@ -1,4 +1,3 @@ -import { IgnitionValidationError } from "../../errors"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters, @@ -6,7 +5,6 @@ import { ValidationErrorDeploymentResult, } from "../../types/deploy"; import { Future, FutureType, IgnitionModule } from "../../types/module"; -import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { validateArtifactContractAt } from "./stageTwo/validateArtifactContractAt"; @@ -28,31 +26,30 @@ export async function validateStageTwo( ): Promise { const futures = getFuturesFromModule(module); + const errors: ValidationErrorDeploymentResult["errors"] = {}; + for (const future of futures) { - try { - await _validateFuture( - future, - artifactLoader, - deploymentParameters, - accounts - ); - } catch (err) { - assertIgnitionInvariant( - err instanceof IgnitionValidationError, - `Expected an IgnitionValidationError when validating the future ${future.id}` - ); + const validationErrors = await _validateFuture( + future, + artifactLoader, + deploymentParameters, + accounts + ); - return { - type: DeploymentResultType.VALIDATION_ERROR, - errors: { - [future.id]: [err.message], - }, - }; + if (validationErrors.length > 0) { + errors[future.id] = validationErrors; } } - // No validation errors - return null; + if (Object.keys(errors).length === 0) { + // No validation errors + return null; + } + + return { + type: DeploymentResultType.VALIDATION_ERROR, + errors, + }; } async function _validateFuture( @@ -60,87 +57,77 @@ async function _validateFuture( artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] -) { +): Promise { switch (future.type) { case FutureType.CONTRACT_DEPLOYMENT: - await validateArtifactContractDeployment( + return validateArtifactContractDeployment( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.LIBRARY_DEPLOYMENT: - await validateArtifactLibraryDeployment( + return validateArtifactLibraryDeployment( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.CONTRACT_AT: - await validateArtifactContractAt( + return validateArtifactContractAt( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: - await validateNamedContractDeployment( + return validateNamedContractDeployment( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: - await validateNamedLibraryDeployment( + return validateNamedLibraryDeployment( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - await validateNamedContractAt( + return validateNamedContractAt( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.CONTRACT_CALL: - await validateNamedContractCall( + return validateNamedContractCall( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.STATIC_CALL: - await validateNamedStaticCall( + return validateNamedStaticCall( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.READ_EVENT_ARGUMENT: - await validateReadEventArgument( + return validateReadEventArgument( future, artifactLoader, deploymentParameters, accounts ); - break; case FutureType.SEND_DATA: - await validateSendData( + return validateSendData( future, artifactLoader, deploymentParameters, accounts ); - break; } } From 85b079051e2c0802b42df681d90cfb8dee3defc8 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 17 Sep 2023 21:25:14 -0400 Subject: [PATCH 0951/1302] refactor tests to match validation changes --- packages/core/test/call.ts | 32 +++++------ packages/core/test/contract.ts | 32 +++++------ packages/core/test/contractAt.ts | 12 ++--- packages/core/test/contractAtFromArtifact.ts | 12 ++--- packages/core/test/contractFromArtifact.ts | 32 +++++------ packages/core/test/execution/libraries.ts | 57 ++++++++++---------- packages/core/test/library.ts | 14 ++--- packages/core/test/libraryFromArtifact.ts | 14 ++--- packages/core/test/send.ts | 46 +++++++++++----- packages/core/test/staticCall.ts | 26 ++++----- 10 files changed, 156 insertions(+), 121 deletions(-) diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index ba9e0c4e2b..d4d0e3a622 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -668,14 +668,14 @@ describe("call", () => { (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isRejected( - validateNamedContractCall( + assert.includeMembers( + await validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -700,14 +700,14 @@ describe("call", () => { (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isRejected( - validateNamedContractCall( + assert.includeMembers( + await validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, [] ), - /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] ); }); @@ -818,14 +818,14 @@ describe("call", () => { (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isRejected( - validateNamedContractCall( + assert.includeMembers( + await validateNamedContractCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -910,14 +910,14 @@ describe("call", () => { (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isRejected( - validateNamedContractCall( + assert.includeMembers( + await validateNamedContractCall( future as any, setupMockArtifactResolver(), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -955,14 +955,16 @@ describe("call", () => { (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isRejected( - validateNamedContractCall( + assert.includeMembers( + await validateNamedContractCall( future as any, setupMockArtifactResolver(), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index dfcc44dba5..691f86f619 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -550,14 +550,14 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( + assert.includeMembers( + await validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -584,14 +584,14 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( + assert.includeMembers( + await validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] ); }); @@ -698,14 +698,14 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( + assert.includeMembers( + await validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -767,14 +767,14 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( + assert.includeMembers( + await validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -795,14 +795,16 @@ describe("contract", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( + assert.includeMembers( + await validateNamedContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index edf459fc94..508fb334aa 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -260,8 +260,8 @@ describe("contractAt", () => { (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); - await assert.isRejected( - validateNamedContractAt( + assert.includeMembers( + await validateNamedContractAt( future as any, setupMockArtifactResolver({ Another: fakeArtifact, @@ -269,7 +269,7 @@ describe("contractAt", () => { {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -309,8 +309,8 @@ describe("contractAt", () => { (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); - await assert.isRejected( - validateNamedContractAt( + assert.includeMembers( + await validateNamedContractAt( future as any, setupMockArtifactResolver({ Another: fakeArtifact, @@ -318,7 +318,7 @@ describe("contractAt", () => { {}, [] ), - /Module parameter 'p' must be of type 'string' but is 'number'/ + ["Module parameter 'p' must be of type 'string' but is 'number'"] ); }); }); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 63b70b590e..b02be03b21 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -239,8 +239,8 @@ describe("contractAtFromArtifact", () => { (v) => v.type === FutureType.CONTRACT_AT ); - await assert.isRejected( - validateArtifactContractAt( + assert.includeMembers( + await validateArtifactContractAt( future as any, setupMockArtifactResolver({ Another: fakeArtifact, @@ -248,7 +248,7 @@ describe("contractAtFromArtifact", () => { {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -288,8 +288,8 @@ describe("contractAtFromArtifact", () => { (v) => v.type === FutureType.CONTRACT_AT ); - await assert.isRejected( - validateArtifactContractAt( + assert.includeMembers( + await validateArtifactContractAt( future as any, setupMockArtifactResolver({ Another: fakeArtifact, @@ -297,7 +297,7 @@ describe("contractAtFromArtifact", () => { {}, [] ), - /Module parameter 'p' must be of type 'string' but is 'number'/ + ["Module parameter 'p' must be of type 'string' but is 'number'"] ); }); }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 0296077836..26baeececb 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -536,14 +536,14 @@ describe("contractFromArtifact", () => { (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); - await assert.isRejected( - validateArtifactContractDeployment( + assert.includeMembers( + await validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -615,14 +615,14 @@ describe("contractFromArtifact", () => { (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); - await assert.isRejected( - validateArtifactContractDeployment( + assert.includeMembers( + await validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ), - /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] ); }); @@ -677,14 +677,14 @@ describe("contractFromArtifact", () => { (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); - await assert.isRejected( - validateArtifactContractDeployment( + assert.includeMembers( + await validateArtifactContractDeployment( future as any, setupMockArtifactResolver({ Test: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -743,14 +743,14 @@ describe("contractFromArtifact", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateArtifactContractDeployment( + assert.includeMembers( + await validateArtifactContractDeployment( future as any, setupMockArtifactResolver(), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -766,14 +766,16 @@ describe("contractFromArtifact", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateArtifactContractDeployment( + assert.includeMembers( + await validateArtifactContractDeployment( future as any, setupMockArtifactResolver(), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/execution/libraries.ts b/packages/core/test/execution/libraries.ts index a87ab366c9..a0ded71c61 100644 --- a/packages/core/test/execution/libraries.ts +++ b/packages/core/test/execution/libraries.ts @@ -18,48 +18,49 @@ describe("Libraries handling", () => { }); it("Should throw if a library name is not recognized", async () => { - assert.throws(() => { + assert.includeMembers( validateLibraryNames(deploymentFixturesArtifacts.WithLibrary, [ "NotALibrary", - ]); - }, "not needed"); + ]), + [ + "Invalid library NotALibrary for contract WithLibrary: this library is not needed by this contract.", + ] + ); }); it("Should throw if a library name is ambiguous", () => { - try { - validateLibraryNames( - deploymentFixturesArtifacts.WithAmbiguousLibraryName, - ["Lib"] - ); - } catch (error: any) { - assert.include(error.message, `The name "Lib" is ambiguous`); - assert.include(error.message, `contracts/C.sol:Lib`); - assert.include(error.message, `contracts/Libs.sol:Lib`); - return; - } - - assert.fail("Should have thrown"); + const [error] = validateLibraryNames( + deploymentFixturesArtifacts.WithAmbiguousLibraryName, + ["Lib"] + ); + + assert(error !== undefined); + assert.include(error, `The name "Lib" is ambiguous`); + assert.include(error, `contracts/C.sol:Lib`); + assert.include(error, `contracts/Libs.sol:Lib`); }); it("Should throw if a library is missing", () => { - try { - validateLibraryNames(deploymentFixturesArtifacts.WithLibrary, []); - } catch (error: any) { - assert.include(error.message, `The following libraries are missing:`); - assert.include(error.message, `contracts/C.sol:Lib`); - return; - } - - assert.fail("Should have thrown"); + const [error] = validateLibraryNames( + deploymentFixturesArtifacts.WithLibrary, + [] + ); + + assert(error !== undefined); + assert.include(error, `The following libraries are missing:`); + assert.include(error, `contracts/C.sol:Lib`); }); it("Should throw if a name is used twice, as FQN and bare name", () => { - assert.throws(() => { + assert.includeMembers( validateLibraryNames(deploymentFixturesArtifacts.WithLibrary, [ "Lib", "contracts/C.sol:Lib", - ]); - }, `The names "contracts/C.sol:Lib" and "Lib" clash with each other`); + ]), + [ + `Invalid libraries for contract WithLibrary: The names "contracts/C.sol:Lib" and "Lib" clash with each other, please use qualified names for both.`, + ] + ); }); it("Should accept bare names if non-ambiguous", () => { diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index 928ac3b50c..e6f05f81f8 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -285,14 +285,14 @@ describe("library", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedLibraryDeployment( + assert.includeMembers( + await validateNamedLibraryDeployment( future as any, setupMockArtifactResolver({ Another: {} as any }), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -306,14 +306,16 @@ describe("library", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedLibraryDeployment( + assert.includeMembers( + await validateNamedLibraryDeployment( future as any, setupMockArtifactResolver({ Another: {} as any }), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 2c657b24c0..54973fc67e 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -256,14 +256,14 @@ describe("libraryFromArtifact", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateArtifactLibraryDeployment( + assert.includeMembers( + await validateArtifactLibraryDeployment( future as any, setupMockArtifactResolver({ Another: {} as any }), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -279,14 +279,16 @@ describe("libraryFromArtifact", () => { const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateArtifactLibraryDeployment( + assert.includeMembers( + await validateArtifactLibraryDeployment( future as any, setupMockArtifactResolver({ Another: {} as any }), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 483b767bad..c1a20b40dd 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -337,9 +337,14 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}, []), - /Module parameter 'p' requires a value but was given none/ + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -372,9 +377,14 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}, []), - /Module parameter 'p' must be of type 'bigint' but is 'boolean'/ + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] ); }); @@ -407,9 +417,14 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}, []), - /Account index cannot be a negative number/ + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Account index cannot be a negative number"] ); }); @@ -425,9 +440,16 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isRejected( - validateSendData(future as any, setupMockArtifactResolver(), {}, []), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 6d24f78466..52dc2e66c8 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -799,14 +799,14 @@ describe("static call", () => { (v) => v.type === FutureType.STATIC_CALL ); - await assert.isRejected( - validateNamedStaticCall( + assert.includeMembers( + await validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -876,14 +876,14 @@ describe("static call", () => { (v) => v.type === FutureType.STATIC_CALL ); - await assert.isRejected( - validateNamedStaticCall( + assert.includeMembers( + await validateNamedStaticCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, [] ), - /Module parameter 'p' requires a value but was given none/ + ["Module parameter 'p' requires a value but was given none"] ); }); @@ -967,14 +967,14 @@ describe("static call", () => { (v) => v.type === FutureType.STATIC_CALL ); - await assert.isRejected( - validateNamedStaticCall( + assert.includeMembers( + await validateNamedStaticCall( future as any, setupMockArtifactResolver(), {}, [] ), - /Account index cannot be a negative number/ + ["Account index cannot be a negative number"] ); }); @@ -1012,14 +1012,16 @@ describe("static call", () => { (v) => v.type === FutureType.STATIC_CALL ); - await assert.isRejected( - validateNamedStaticCall( + assert.includeMembers( + await validateNamedStaticCall( future as any, setupMockArtifactResolver(), {}, [] ), - /Requested account index \'1\' is greater than the total number of available accounts \'0\'/ + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] ); }); }); From a433f266291cae3a39f220ff58d9a3f062c90fa0 Mon Sep 17 00:00:00 2001 From: Franco Zeoli Date: Tue, 19 Sep 2023 13:53:09 -0300 Subject: [PATCH 0952/1302] Update README.md branding --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e28e5463dc..e314c9b177 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) -# Ignition +# Hardhat Ignition > **WARNING**: This repository is **highly experimental**, and is under **active development**. Any code or binaries produced from this project **should not be used in any production or critical workloads**. The API is preliminary, **the API will change**. -Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. +Hardhat Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. @@ -30,7 +30,7 @@ import "@nomicfoundation/hardhat-ignition"; ## Getting Started -See our [Getting started guide](./docs/getting-started-guide.md) for a worked example of **Ignition usage**. +See our [Getting started guide](./docs/getting-started-guide.md) for a worked example of **Hardhat Ignition usage**. ## Documentation @@ -42,17 +42,17 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Including modules within modules](./docs/creating-modules-for-deployment.md#including-modules-within-modules) - [Module Parameters](./docs/creating-modules-for-deployment.md#module-parameters) - [Switching based on the _Network Chain ID_](./docs/creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) -- [Using Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) +- [Using Hardhat Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) - [Running a deployment](./docs/running-a-deployment.md) - [Visualizing your deployment with the `visualize` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) - [Executing the deployment](./docs/running-a-deployment.md#executing-the-deployment) ### Examples -This repo contains example projects that show **Ignition** features in context (under `./examples`): +This repo contains example projects that show **Hardhat Ignition** features in context (under `./examples`): -- [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Ignition -- [Typescript Sample](./examples/ts-sample) - the **Hardhat** typescript starter project enhanced with Ignition +- [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Hardhat Ignition +- [Typescript Sample](./examples/ts-sample) - the **Hardhat** typescript starter project enhanced with Hardhat Ignition - [ENS](./examples/ens) - deploy ENS and its registry for local testing - [Uniswap](./examples/uniswap) - deploy Uniswap and test swaps @@ -60,7 +60,7 @@ This repo contains example projects that show **Ignition** features in context ( Contributions are always welcome! Feel free to open any issue or send a pull request. -Go to [CONTRIBUTING.md](./CONTRIBUTING.md) to learn about how to set up Ignition's development environment. +Go to [CONTRIBUTING.md](./CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. ## Feedback, help and news From 74de7f07f98dc9c5c86e598e55633ae4f15b498c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 15 Sep 2023 00:26:48 -0400 Subject: [PATCH 0953/1302] implement new event for missing futures warnings Add new view and UI updates to show missing futures warnings in both the advanced UI and the simple text ui. Resolves #434. --- packages/core/src/internal/deployer.ts | 15 +++++++++++- packages/core/src/types/execution-events.ts | 13 +++++++++++ .../hardhat-plugin/src/ui/UiEventHandler.tsx | 9 ++++++++ .../src/ui/VerboseEventHandler.ts | 9 ++++++++ .../components/execution/ExecutionPanel.tsx | 3 +++ .../src/ui/components/execution/Warnings.tsx | 23 +++++++++++++++++++ packages/hardhat-plugin/src/ui/types.ts | 1 + 7 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 3b3d0a8d85..cad7e9e186 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -174,7 +174,9 @@ export class Deployer { } if (reconciliationResult.missingExecutedFutures.length > 0) { - // TODO: indicate to UI that warnings should be shown + this._emitReconciliationWarningsEvent( + reconciliationResult.missingExecutedFutures + ); } const batches = Batcher.batch(ignitionModule, deploymentState); @@ -275,6 +277,17 @@ export class Deployer { }); } + private _emitReconciliationWarningsEvent(warnings: string[]): void { + if (this._executionEventListener === undefined) { + return; + } + + this._executionEventListener.reconciliationWarnings({ + type: ExecutionEventType.RECONCILIATION_WARNINGS, + warnings, + }); + } + private _emitDeploymentBatchEvent(batches: string[][]): void { if (this._executionEventListener === undefined) { return; diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index a29d6f2c93..45b47af802 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -30,6 +30,7 @@ export type ExecutionEvent = | OnchainInteractionTimeoutEvent | BatchInitializeEvent | DeploymentStartEvent + | ReconciliationWarningsEvent | BeginNextBatchEvent | SetModuleIdEvent; @@ -61,6 +62,7 @@ export enum ExecutionEventType { ONCHAIN_INTERACTION_TIMEOUT = "ONCHAIN_INTERACTION_TIMEOUT", BATCH_INITIALIZE = "BATCH_INITIALIZE", DEPLOYMENT_START = "DEPLOYMENT_START", + RECONCILIATION_WARNINGS = "RECONCILIATION_WARNINGS", BEGIN_NEXT_BATCH = "BEGIN_NEXT_BATCH", DEPLOYMENT_COMPLETE = "DEPLOYMENT_COMPLETE", SET_MODULE_ID = "SET_MODULE_ID", @@ -116,6 +118,16 @@ export interface DeploymentCompleteEvent { result: DeploymentResult>; } +/** + * An event indicating that a deployment has reconciliation warnings. + * + * @beta + */ +export interface ReconciliationWarningsEvent { + type: ExecutionEventType.RECONCILIATION_WARNINGS; + warnings: string[]; +} + /** * An event indicating a future that deploys a contract * or library has started execution. @@ -434,6 +446,7 @@ export interface ExecutionEventTypeMap { [ExecutionEventType.DEPLOYMENT_START]: DeploymentStartEvent; [ExecutionEventType.BEGIN_NEXT_BATCH]: BeginNextBatchEvent; [ExecutionEventType.DEPLOYMENT_COMPLETE]: DeploymentCompleteEvent; + [ExecutionEventType.RECONCILIATION_WARNINGS]: ReconciliationWarningsEvent; [ExecutionEventType.SET_MODULE_ID]: SetModuleIdEvent; } diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx index e7f7d100ad..e4c941ed71 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx @@ -22,6 +22,7 @@ import { OnchainInteractionReplacedByUserEvent, OnchainInteractionTimeoutEvent, ReadEventArgExecutionStateInitializeEvent, + ReconciliationWarningsEvent, RunStartEvent, SendDataExecutionStateCompleteEvent, SendDataExecutionStateInitializeEvent, @@ -68,6 +69,7 @@ export class UiEventHandler implements ExecutionEventListener { moduleName: null, batches: [], result: null, + warnings: [], }; constructor(private _deploymentParams: DeploymentParameters = {}) {} @@ -333,6 +335,13 @@ export class UiEventHandler implements ExecutionEventListener { }; } + public reconciliationWarnings(event: ReconciliationWarningsEvent): void { + this.state = { + ...this.state, + warnings: [...this.state.warnings, ...event.warnings], + }; + } + public setModuleId(event: SetModuleIdEvent): void { this.state = { ...this.state, diff --git a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts index 4414cb27de..d0738e64d1 100644 --- a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts +++ b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts @@ -17,6 +17,7 @@ import { OnchainInteractionReplacedByUserEvent, OnchainInteractionTimeoutEvent, ReadEventArgExecutionStateInitializeEvent, + ReconciliationWarningsEvent, RunStartEvent, SendDataExecutionStateCompleteEvent, SendDataExecutionStateInitializeEvent, @@ -251,6 +252,14 @@ export class VerboseEventHandler implements ExecutionEventListener { console.log(`Deployment complete`); } + public reconciliationWarnings(event: ReconciliationWarningsEvent): void { + console.log( + `Deployment produced reconciliation warnings:\n${event.warnings.join( + " -" + )}` + ); + } + public setModuleId(event: SetModuleIdEvent): void { console.log(`Starting validation for module: ${event.moduleName}`); } diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx index da877c56b3..b509dd78ae 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx @@ -7,6 +7,7 @@ import { UiState } from "../../types"; import { BatchExecution } from "./BatchExecution"; import { FinalStatus } from "./FinalStatus"; import { SummarySection } from "./SummarySection"; +import { Warnings } from "./Warnings"; import { viewEverythingExecutedAlready } from "./views"; export const ExecutionPanel = ({ @@ -19,6 +20,7 @@ export const ExecutionPanel = ({ if (viewEverythingExecutedAlready(state)) { return ( + {state.warnings.length > 0 && } ); @@ -27,6 +29,7 @@ export const ExecutionPanel = ({ return ( + {state.warnings.length > 0 && } diff --git a/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx b/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx new file mode 100644 index 0000000000..ad67483d2c --- /dev/null +++ b/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx @@ -0,0 +1,23 @@ +import { Box, Newline, Text } from "ink"; + +import { UiState } from "../../types"; + +export const Warnings = ({ state: { warnings } }: { state: UiState }) => { + return ( + <> + + + Warning, deployment missing previously executed futures: + + + + {...warnings.map((warning) => - {warning})} + + + ); +}; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index a45c2470dc..7e6617c746 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -61,6 +61,7 @@ export interface UiState { moduleName: string | null; batches: UiBatches; result: DeploymentResult> | null; + warnings: string[]; } export interface AddressMap { From 88b32941508fe10bb796c440d7ef8e25136485c9 Mon Sep 17 00:00:00 2001 From: Zoey Date: Wed, 20 Sep 2023 08:21:02 -0400 Subject: [PATCH 0954/1302] Support using the result from `m.staticCall` or `m.readEventArgument` as value option (#478) Expands the allowed arguments that can be passed to value in contract deployments and contract calls to include staticCall futures and readEventArgument futures (enforcing that they return big ints when used that way)3 Serialization has been expanded to support this and integration tests added. Resolves #455 --- .../core/src/ignition-module-serializer.ts | 40 ++++++++++-- .../helpers/build-initialize-message-for.ts | 18 +++++- .../helpers/future-resolvers.ts | 33 +++++++--- packages/core/src/internal/module-builder.ts | 28 +++++++- packages/core/src/internal/module.ts | 18 +++++- .../reconciliation/helpers/reconcile-value.ts | 3 +- packages/core/src/types/module-builder.ts | 22 +++++-- packages/core/src/types/module.ts | 18 +++++- packages/core/src/types/serialization.ts | 6 +- packages/core/test/contract.ts | 59 +++++++++++++++++ ...lizer.ts => ignition-module-serializer.ts} | 56 ++++++++++++++++ packages/hardhat-plugin/test/contracts.ts | 64 +++++++++++++++++++ .../minimal/contracts/Contracts.sol | 14 ++++ 13 files changed, 340 insertions(+), 39 deletions(-) rename packages/core/test/{stored-deployment-serializer.ts => ignition-module-serializer.ts} (91%) diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index dfe5b60e9c..d0de4ed437 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -29,6 +29,7 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, + ContractCallFuture, ContractDeploymentFuture, ContractFuture, Future, @@ -37,9 +38,10 @@ import { IgnitionModuleResult, ModuleParameterRuntimeValue, ModuleParameterType, - ContractCallFuture, NamedArtifactContractDeploymentFuture, + ReadEventArgumentFuture, RuntimeValueType, + StaticCallFuture, } from "./types/module"; import { FutureToken, @@ -137,7 +139,9 @@ export class IgnitionModuleSerializer { ? this._serializeAccountRuntimeValue(future.from) : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: isRuntimeValue(future.value) + value: isFuture(future.value) + ? this._convertFutureToFutureToken(future.value) + : isRuntimeValue(future.value) ? this._serializeModuleParamterRuntimeValue(future.value) : this._serializeBigint(future.value), }; @@ -161,7 +165,9 @@ export class IgnitionModuleSerializer { ? this._serializeAccountRuntimeValue(future.from) : future.from, libraries: this._convertLibrariesToLibraryTokens(future.libraries), - value: isRuntimeValue(future.value) + value: isFuture(future.value) + ? this._convertFutureToFutureToken(future.value) + : isRuntimeValue(future.value) ? this._serializeModuleParamterRuntimeValue(future.value) : this._serializeBigint(future.value), }; @@ -214,7 +220,9 @@ export class IgnitionModuleSerializer { contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, args: future.args.map((arg) => context.argReplacer(arg)), - value: isRuntimeValue(future.value) + value: isFuture(future.value) + ? this._convertFutureToFutureToken(future.value) + : isRuntimeValue(future.value) ? this._serializeModuleParamterRuntimeValue(future.value) : this._serializeBigint(future.value), from: isRuntimeValue(future.from) @@ -640,7 +648,13 @@ export class IgnitionModuleDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + this._isSerializedFutureToken(serializedFuture.value) + ? (this._lookup(futuresLookup, serializedFuture.value.futureId) as + | StaticCallFuture + | ReadEventArgumentFuture) + : this._isSerializedModuleParameterRuntimeValue( + serializedFuture.value + ) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values @@ -664,7 +678,13 @@ export class IgnitionModuleDeserializer { this._lookup(contractFuturesLookup, lib.futureId), ]) ), - this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + this._isSerializedFutureToken(serializedFuture.value) + ? (this._lookup(futuresLookup, serializedFuture.value.futureId) as + | StaticCallFuture + | ReadEventArgumentFuture) + : this._isSerializedModuleParameterRuntimeValue( + serializedFuture.value + ) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values @@ -716,7 +736,13 @@ export class IgnitionModuleDeserializer { serializedFuture.args.map((arg) => this._deserializeArgument(arg, futuresLookup) ), - this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) + this._isSerializedFutureToken(serializedFuture.value) + ? (this._lookup(futuresLookup, serializedFuture.value.futureId) as + | StaticCallFuture + | ReadEventArgumentFuture) + : this._isSerializedModuleParameterRuntimeValue( + serializedFuture.value + ) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.value ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 409a4b4968..74c6f0dec8 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -51,7 +51,11 @@ export async function buildInitializeMessageFor( accounts ), libraries: resolveLibraries(future.libraries, deploymentState), - value: resolveValue(future.value, deploymentParameters), + value: resolveValue( + future.value, + deploymentParameters, + deploymentState + ), from: resolveFutureFrom(future.from, accounts, defaultSender), } ); @@ -95,7 +99,11 @@ export async function buildInitializeMessageFor( deploymentState ), artifactId: future.contract.id, - value: resolveValue(future.value, deploymentParameters), + value: resolveValue( + future.value, + deploymentParameters, + deploymentState + ), from: resolveFutureFrom(future.from, accounts, defaultSender), } ); @@ -191,7 +199,11 @@ export async function buildInitializeMessageFor( deploymentState, deploymentParameters ), - value: resolveValue(future.value, deploymentParameters), + value: resolveValue( + future.value, + deploymentParameters, + deploymentState + ), data: future.data ?? "0x", from: resolveFutureFrom(future.from, accounts, defaultSender), } diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts index e661cea69b..b63ae092c0 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts @@ -1,6 +1,9 @@ import { isAddress } from "ethers"; -import { isModuleParameterRuntimeValue } from "../../../../type-guards"; +import { + isFuture, + isModuleParameterRuntimeValue, +} from "../../../../type-guards"; import { DeploymentParameters } from "../../../../types/deploy"; import { AccountRuntimeValue, @@ -9,7 +12,9 @@ import { ContractFuture, Future, ModuleParameterRuntimeValue, + ReadEventArgumentFuture, SolidityParameterType, + StaticCallFuture, } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; import { assertIgnitionInvariant } from "../../../utils/assertions"; @@ -30,23 +35,33 @@ import { convertEvmValueToSolidityParam } from "../../utils/convert-evm-tuple-to * @returns the resolved bigint */ export function resolveValue( - givenValue: bigint | ModuleParameterRuntimeValue, - deploymentParameters: DeploymentParameters + givenValue: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture, + deploymentParameters: DeploymentParameters, + deploymentState: DeploymentState ): bigint { if (typeof givenValue === "bigint") { return givenValue; } - const moduleParam = resolveModuleParameter(givenValue, { - deploymentParameters, - }); + let result: SolidityParameterType; + if (isFuture(givenValue)) { + result = findResultForFutureById(deploymentState, givenValue.id); + } else { + result = resolveModuleParameter(givenValue, { + deploymentParameters, + }); + } assertIgnitionInvariant( - typeof moduleParam === "bigint", - "Module parameter used as value must be a bigint" + typeof result === "bigint", + "Module parameter or future result used as value must be a bigint" ); - return moduleParam; + return result; } /** diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index d93bf43186..584911e4c6 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -10,6 +10,8 @@ import { isContractFuture, isFuture, isModuleParameterRuntimeValue, + isNamedStaticCallFuture, + isReadEventArgumentFuture, } from "../type-guards"; import { Artifact } from "../types/artifact"; import { @@ -258,6 +260,10 @@ class IgnitionModuleBuilderImplementation< options.from ); + if (isFuture(options.value)) { + future.dependencies.add(options.value); + } + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } @@ -310,7 +316,9 @@ class IgnitionModuleBuilderImplementation< options.from ); - this._module.futures.add(future); + if (isFuture(options.value)) { + future.dependencies.add(options.value); + } for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); @@ -470,6 +478,10 @@ class IgnitionModuleBuilderImplementation< future.dependencies.add(contractFuture); + if (isFuture(options.value)) { + future.dependencies.add(options.value); + } + for (const arg of resolveArgsToFutures(args)) { future.dependencies.add(arg); } @@ -966,10 +978,20 @@ class IgnitionModuleBuilderImplementation< } private _assertValidValue( - value: bigint | ModuleParameterRuntimeValue | any, + value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture + | any, func: (...[]: any[]) => any ) { - if (!isModuleParameterRuntimeValue(value) && typeof value !== "bigint") { + if ( + !isReadEventArgumentFuture(value) && + !isNamedStaticCallFuture(value) && + !isModuleParameterRuntimeValue(value) && + typeof value !== "bigint" + ) { this._throwErrorWithStackTrace( `Given value option '${value}' is not a \`bigint\``, func diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index 966a6e24de..6931cbd105 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -62,7 +62,11 @@ export class NamedContractDeploymentFutureImplementation< public readonly contractName: ContractNameT, public readonly constructorArgs: ArgumentType[], public readonly libraries: Record>, - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, module); @@ -82,7 +86,11 @@ export class ArtifactContractDeploymentFutureImplementation< public readonly constructorArgs: ArgumentType[], public readonly artifact: Artifact, public readonly libraries: Record>, - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.CONTRACT_DEPLOYMENT, module); @@ -137,7 +145,11 @@ export class NamedContractCallFutureImplementation< public readonly functionName: FunctionNameT, public readonly contract: ContractFuture, public readonly args: ArgumentType[], - public readonly value: bigint | ModuleParameterRuntimeValue, + public readonly value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.CONTRACT_CALL, module); diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts index 67d5e58e3d..f5a46b9c35 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts @@ -31,7 +31,8 @@ export function reconcileValue( ): ReconciliationFutureResultFailure | undefined { const resolvedValue = resolveValue( future.value, - context.deploymentParameters + context.deploymentParameters, + context.deploymentState ); return compare(future, "Value", exState.value, resolvedValue); diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index b24d5fea20..be41530165 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -3,27 +3,27 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, + CallableContractFuture, ContractAtFuture, + ContractCallFuture, ContractDeploymentFuture, - LibraryDeploymentFuture, - CallableContractFuture, ContractFuture, Future, IgnitionModule, IgnitionModuleResult, + LibraryDeploymentFuture, ModuleParameterRuntimeValue, ModuleParameterType, NamedArtifactContractAtFuture, - ContractCallFuture, NamedArtifactContractDeploymentFuture, NamedArtifactLibraryDeploymentFuture, - StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, + StaticCallFuture, } from "./module"; /** - * The options for a `contract` call. + * The options for a `contract` deployment. * * @beta */ @@ -31,7 +31,11 @@ export interface ContractOptions { id?: string; after?: Future[]; libraries?: Record>; - value?: bigint | ModuleParameterRuntimeValue; + value?: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture; from?: string | AccountRuntimeValue; } @@ -55,7 +59,11 @@ export interface LibraryOptions { export interface CallOptions { id?: string; after?: Future[]; - value?: bigint | ModuleParameterRuntimeValue; + value?: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture; from?: string | AccountRuntimeValue; } diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 70b45a490d..9f0a738534 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -135,7 +135,11 @@ export interface NamedArtifactContractDeploymentFuture< contractName: ContractNameT; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint | ModuleParameterRuntimeValue; + value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture; from: string | AccountRuntimeValue | undefined; } @@ -154,7 +158,11 @@ export interface ContractDeploymentFuture { artifact: Artifact; constructorArgs: ArgumentType[]; libraries: Record>; - value: bigint | ModuleParameterRuntimeValue; + value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture; from: string | AccountRuntimeValue | undefined; } @@ -208,7 +216,11 @@ export interface ContractCallFuture< contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; - value: bigint | ModuleParameterRuntimeValue; + value: + | bigint + | ModuleParameterRuntimeValue + | StaticCallFuture + | ReadEventArgumentFuture; from: string | AccountRuntimeValue | undefined; } diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 26fd30bbdc..237f22b3ed 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -79,7 +79,7 @@ export interface SerializedNamedContractDeploymentFuture contractName: string; constructorArgs: SerializedArgumentType[]; libraries: SerializedLibraries; - value: SerializedBigInt | SerializedModuleParameterRuntimeValue; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue | FutureToken; from: string | SerializedAccountRuntimeValue | undefined; } @@ -95,7 +95,7 @@ export interface SerializedArtifactContractDeploymentFuture constructorArgs: SerializedArgumentType[]; artifact: Artifact; libraries: SerializedLibraries; - value: SerializedBigInt | SerializedModuleParameterRuntimeValue; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue | FutureToken; from: string | SerializedAccountRuntimeValue | undefined; } @@ -137,7 +137,7 @@ export interface SerializedNamedContractCallFuture functionName: string; contract: FutureToken; args: SerializedArgumentType[]; - value: SerializedBigInt | SerializedModuleParameterRuntimeValue; + value: SerializedBigInt | SerializedModuleParameterRuntimeValue | FutureToken; from: string | SerializedAccountRuntimeValue | undefined; } diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index dfcc44dba5..840e99ffe8 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -7,6 +7,8 @@ import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, NamedContractDeploymentFutureImplementation, + NamedStaticCallFutureImplementation, + ReadEventArgumentFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; import { FutureType } from "../src/types/module"; @@ -177,6 +179,63 @@ describe("contract", () => { ); }); + it("Should be able to pass a StaticCallFuture as a value option", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const contract = m.contract("Contract"); + const staticCall = m.staticCall(contract, "test"); + + const another = m.contract("Another", [], { + value: staticCall, + }); + + return { another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assertInstanceOf(anotherFuture.value, NamedStaticCallFutureImplementation); + }); + + it("Should be able to pass a ReadEventArgumentFuture as a value option", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const contract = m.contract("Contract"); + const eventArg = m.readEventArgument(contract, "TestEvent", "eventArg"); + + const another = m.contract("Another", [], { + value: eventArg, + }); + + return { another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Another" + ); + + if ( + !(anotherFuture instanceof NamedContractDeploymentFutureImplementation) + ) { + assert.fail("Not a named contract deployment"); + } + + assertInstanceOf( + anotherFuture.value, + ReadEventArgumentFutureImplementation + ); + }); + it("should be able to pass a string as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const another = m.contract("Another", [], { from: "0x2" }); diff --git a/packages/core/test/stored-deployment-serializer.ts b/packages/core/test/ignition-module-serializer.ts similarity index 91% rename from packages/core/test/stored-deployment-serializer.ts rename to packages/core/test/ignition-module-serializer.ts index afb56e39f3..85850bcfef 100644 --- a/packages/core/test/stored-deployment-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -53,6 +53,34 @@ describe("stored deployment serializer", () => { assertSerializableModuleIn(module); }); + + it("should serialize a contract deployment with a call future as value", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1", []); + + const call1 = m.staticCall(contract1, "getValue"); + + const contract2 = m.contract("Contract2", [], { value: call1 }); + + return { contract1, contract2 }; + }); + + assertSerializableModuleIn(module); + }); + + it("should serialize a contract deployment with a read event argument as value", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1", []); + + const event1 = m.readEventArgument(contract1, "Event1", "Value1"); + + const contract2 = m.contract("Contract2", [], { value: event1 }); + + return { contract1, contract2 }; + }); + + assertSerializableModuleIn(module); + }); }); describe("contractFromArtifact", () => { @@ -299,6 +327,34 @@ describe("stored deployment serializer", () => { assertSerializableModuleIn(module); }); + + it("should serialize a call with a call future as value", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1", []); + + const staticCall1 = m.staticCall(contract1, "getValue"); + + m.call(contract1, "lock", [], { value: staticCall1 }); + + return { contract1 }; + }); + + assertSerializableModuleIn(module); + }); + + it("should serialize a call with a read event argument as value", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1", []); + + const event1 = m.readEventArgument(contract1, "Event1", "Value1"); + + m.call(contract1, "lock", [], { value: event1 }); + + return { contract1 }; + }); + + assertSerializableModuleIn(module); + }); }); describe("static call", () => { diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/contracts.ts index 205b1e3196..b9cd0a5f2c 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/contracts.ts @@ -144,5 +144,69 @@ describe("contract deploys", () => { this.hre.ethers.parseEther("2").toString() ); }); + + it("should be able to deploy a contract with an endowment via a static call", async function () { + const submoduleDefinition = buildModule("submodule", (m) => { + const valueContract = m.contract("StaticCallValue"); + + const valueResult = m.staticCall(valueContract, "getValue"); + + const passingValue = m.contract("PassingValue", [], { + value: valueResult, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + await result.passingValue.getAddress() + ); + + assert.equal(actualInstanceBalance.toString(), "42"); + }); + + it("should be able to deploy a contract with an endowment via an event argument", async function () { + const submoduleDefinition = buildModule("submodule", (m) => { + const valueContract = m.contract("EventArgValue"); + + const valueResult = m.readEventArgument( + valueContract, + "EventValue", + "value" + ); + + const passingValue = m.contract("PassingValue", [], { + value: valueResult, + }); + + return { passingValue }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { passingValue } = m.useModule(submoduleDefinition); + + return { passingValue }; + }); + + const result = await this.deploy(moduleDefinition); + + assert.isDefined(result.passingValue); + + const actualInstanceBalance = await this.hre.ethers.provider.getBalance( + await result.passingValue.getAddress() + ); + + assert.equal(actualInstanceBalance.toString(), "42"); + }); }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index d4559d1afc..5b1ae2d7d1 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -49,6 +49,20 @@ contract Greeter { } } +contract StaticCallValue { + function getValue() public pure returns (uint256) { + return 42; + } +} + +contract EventArgValue { + event EventValue(uint256 value); + + constructor() { + emit EventValue(42); + } +} + contract PassingValue { constructor() payable {} From a02a881c7eaf945d2decd03487079aa6eba041fe Mon Sep 17 00:00:00 2001 From: Zoey Date: Wed, 20 Sep 2023 08:27:50 -0400 Subject: [PATCH 0955/1302] added chalk styling to simple-text-ui output (#477) --- package-lock.json | 48 +++++- packages/hardhat-plugin/package.json | 7 +- .../src/ui/VerboseEventHandler.ts | 153 +++++++++++++----- 3 files changed, 161 insertions(+), 47 deletions(-) diff --git a/package-lock.json b/package-lock.json index a2f1745b90..664031b5f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21863,6 +21863,7 @@ "version": "0.4.0", "license": "MIT", "dependencies": { + "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", "fs-extra": "^10.0.0", @@ -21996,6 +21997,51 @@ "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, + "packages/hardhat-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/hardhat-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/hardhat-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "packages/hardhat-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, "packages/hardhat-plugin/node_modules/dagre-d3-es": { "version": "7.0.9", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", @@ -22048,7 +22094,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -22110,7 +22155,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index c3f4399fc8..893815ad7a 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -31,10 +31,10 @@ "prepack": "npm run build" }, "devDependencies": { - "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-ui": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -72,12 +72,13 @@ "typescript": "^4.7.4" }, "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", "@nomicfoundation/ignition-ui": "^0.4.0", - "@nomicfoundation/hardhat-ethers": "^3.0.4", "hardhat": "^2.14.0" }, "dependencies": { + "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", "fs-extra": "^10.0.0", diff --git a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts index d0738e64d1..dd93e7120e 100644 --- a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts +++ b/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts @@ -29,20 +29,29 @@ import { TransactionSendEvent, WipeApplyEvent, } from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; export class VerboseEventHandler implements ExecutionEventListener { public runStart(event: RunStartEvent): void { - console.log(`Deployment started for chainId: ${event.chainId}`); + console.log( + chalk.inverse(`Deployment started for chainId: ${event.chainId}`) + ); } public wipeApply(event: WipeApplyEvent): void { - console.log(`Removing the execution of future ${event.futureId}`); + console.log( + chalk.bold(`Removing the execution of future ${event.futureId}`) + ); } public deploymentExecutionStateInitialize( event: DeploymentExecutionStateInitializeEvent ): void { - console.log(`Starting to execute the deployment future ${event.futureId}`); + console.log( + chalk.blueBright( + `Starting to execute the deployment future ${event.futureId}` + ) + ); } public deploymentExecutionStateComplete( @@ -51,19 +60,25 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - `Successfully completed the execution of deployment future ${ - event.futureId - } with address ${event.result.result ?? "undefined"}` + chalk.bgBlue.bold( + `Successfully completed the execution of deployment future ${ + event.futureId + } with address ${event.result.result ?? "undefined"}` + ) ); } case ExecutionEventResultType.ERROR: { return console.log( - `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + chalk.bgRed.bold( + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + ) ); } case ExecutionEventResultType.HELD: { return console.log( - `Execution of future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + chalk.bgYellow.bold( + `Execution of future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ) ); } } @@ -72,7 +87,9 @@ export class VerboseEventHandler implements ExecutionEventListener { public callExecutionStateInitialize( event: CallExecutionStateInitializeEvent ): void { - console.log(`Starting to execute the call future ${event.futureId}`); + console.log( + chalk.cyanBright(`Starting to execute the call future ${event.futureId}`) + ); } public callExecutionStateComplete( @@ -81,17 +98,23 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - `Successfully completed the execution of call future ${event.futureId}` + chalk.bgCyan.bold( + `Successfully completed the execution of call future ${event.futureId}` + ) ); } case ExecutionEventResultType.ERROR: { return console.log( - `Execution of call future ${event.futureId} failed with reason: ${event.result.error}` + chalk.bgRed.bold( + `Execution of call future ${event.futureId} failed with reason: ${event.result.error}` + ) ); } case ExecutionEventResultType.HELD: { return console.log( - `Execution of call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + chalk.bgYellow.bold( + `Execution of call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ) ); } } @@ -100,7 +123,11 @@ export class VerboseEventHandler implements ExecutionEventListener { public staticCallExecutionStateInitialize( event: StaticCallExecutionStateInitializeEvent ): void { - console.log(`Starting to execute the static call future ${event.futureId}`); + console.log( + chalk.cyanBright( + `Starting to execute the static call future ${event.futureId}` + ) + ); } public staticCallExecutionStateComplete( @@ -109,19 +136,25 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - `Successfully completed the execution of static call future ${ - event.futureId - } with result ${event.result.result ?? "undefined"}` + chalk.bgCyan.bold( + `Successfully completed the execution of static call future ${ + event.futureId + } with result ${event.result.result ?? "undefined"}` + ) ); } case ExecutionEventResultType.ERROR: { return console.log( - `Execution of static call future ${event.futureId} failed with reason: ${event.result.error}` + chalk.bgRed.bold( + `Execution of static call future ${event.futureId} failed with reason: ${event.result.error}` + ) ); } case ExecutionEventResultType.HELD: { return console.log( - `Execution of static call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + chalk.bgYellow.bold( + `Execution of static call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ) ); } } @@ -130,7 +163,11 @@ export class VerboseEventHandler implements ExecutionEventListener { public sendDataExecutionStateInitialize( event: SendDataExecutionStateInitializeEvent ): void { - console.log(`Started to execute the send data future ${event.futureId}`); + console.log( + chalk.magentaBright( + `Started to execute the send data future ${event.futureId}` + ) + ); } public sendDataExecutionStateComplete( @@ -139,19 +176,25 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - `Successfully completed the execution of send data future ${ - event.futureId - } in tx ${event.result.result ?? "undefined"}` + chalk.bgMagenta.bold( + `Successfully completed the execution of send data future ${ + event.futureId + } in tx ${event.result.result ?? "undefined"}` + ) ); } case ExecutionEventResultType.ERROR: { return console.log( - `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + chalk.bgRed.bold( + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` + ) ); } case ExecutionEventResultType.HELD: { return console.log( - `Execution of send future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + chalk.bgYellow.bold( + `Execution of send future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` + ) ); } } @@ -160,16 +203,20 @@ export class VerboseEventHandler implements ExecutionEventListener { public contractAtExecutionStateInitialize( event: ContractAtExecutionStateInitializeEvent ): void { - console.log(`Executed contract at future ${event.futureId}`); + console.log( + chalk.gray.bold(`Executed contract at future ${event.futureId}`) + ); } public readEventArgumentExecutionStateInitialize( event: ReadEventArgExecutionStateInitializeEvent ): void { console.log( - `Executed read event argument future ${event.futureId} with result ${ - event.result.result ?? "undefined" - }` + chalk.green.dim( + `Executed read event argument future ${event.futureId} with result ${ + event.result.result ?? "undefined" + }` + ) ); } @@ -181,32 +228,42 @@ export class VerboseEventHandler implements ExecutionEventListener { ExecutionEventNetworkInteractionType.ONCHAIN_INTERACTION ) { console.log( - `New onchain interaction requested for future ${event.futureId}` + chalk.dim( + `New onchain interaction requested for future ${event.futureId}` + ) ); } else { - console.log(`New static call requested for future ${event.futureId}`); + console.log( + chalk.dim(`New static call requested for future ${event.futureId}`) + ); } } public transactionSend(event: TransactionSendEvent): void { console.log( - `Transaction ${event.hash} sent for onchain interaction of future ${event.futureId}` + chalk.dim( + `Transaction ${event.hash} sent for onchain interaction of future ${event.futureId}` + ) ); } public transactionConfirm(event: TransactionConfirmEvent): void { - console.log(`Transaction ${event.hash} confirmed`); + console.log(chalk.dim(`Transaction ${event.hash} confirmed`)); } public staticCallComplete(event: StaticCallCompleteEvent): void { - console.log(`Static call completed for future ${event.futureId}`); + console.log( + chalk.dim(`Static call completed for future ${event.futureId}`) + ); } public onchainInteractionBumpFees( event: OnchainInteractionBumpFeesEvent ): void { console.log( - `A transaction with higher fees will be sent for onchain interaction of future ${event.futureId}` + chalk.dim( + `A transaction with higher fees will be sent for onchain interaction of future ${event.futureId}` + ) ); } @@ -214,7 +271,9 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionDroppedEvent ): void { console.log( - `Transactions for onchain interaction of future ${event.futureId} has been dropped and will be resent` + chalk.dim( + `Transactions for onchain interaction of future ${event.futureId} has been dropped and will be resent` + ) ); } @@ -222,7 +281,9 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionReplacedByUserEvent ): void { console.log( - `Transactions for onchain interaction of future ${event.futureId} has been replaced by the user and the onchain interaction exection will start again` + chalk.dim( + `Transactions for onchain interaction of future ${event.futureId} has been replaced by the user and the onchain interaction exection will start again` + ) ); } @@ -230,26 +291,32 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionTimeoutEvent ): void { console.log( - `Onchain interaction of future ${event.futureId} failed due to being resent too many times and not having confirmed` + chalk.dim( + `Onchain interaction of future ${event.futureId} failed due to being resent too many times and not having confirmed` + ) ); } public batchInitialize(event: BatchInitializeEvent): void { console.log( - `Starting execution for batches: ${JSON.stringify(event.batches)}` + chalk.greenBright.bold( + `Starting execution for batches: ${JSON.stringify(event.batches)}` + ) ); } public deploymentStart(_event: DeploymentStartEvent): void { - console.log(`Starting execution for new deployment`); + console.log( + chalk.yellowBright.bold(`Starting execution for new deployment`) + ); } public beginNextBatch(_event: BeginNextBatchEvent): void { - console.log(`Starting execution for next batch`); + console.log(chalk.greenBright.bold(`Starting execution for next batch`)); } public deploymentComplete(_event: DeploymentCompleteEvent): void { - console.log(`Deployment complete`); + console.log(chalk.bgGreen.bold(`Deployment complete`)); } public reconciliationWarnings(event: ReconciliationWarningsEvent): void { @@ -261,6 +328,8 @@ export class VerboseEventHandler implements ExecutionEventListener { } public setModuleId(event: SetModuleIdEvent): void { - console.log(`Starting validation for module: ${event.moduleName}`); + console.log( + chalk.yellowBright(`Starting validation for module: ${event.moduleName}`) + ); } } From 519622fe95fadf1a644dedd18a65966df58b7441 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Sep 2023 18:21:48 -0400 Subject: [PATCH 0956/1302] implement fundamental error structures --- packages/core/src/errors-list.ts | 65 ++++++++++++++++ packages/core/src/errors.ts | 125 ++++++++++++++++++++++--------- 2 files changed, 153 insertions(+), 37 deletions(-) create mode 100644 packages/core/src/errors-list.ts diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts new file mode 100644 index 0000000000..0e83a56c2a --- /dev/null +++ b/packages/core/src/errors-list.ts @@ -0,0 +1,65 @@ +export const ERROR_PREFIX = "IGN"; + +export interface ErrorDescriptor { + number: number; + // Message can use templates. See applyErrorMessageTemplate + message: string; +} + +export function getErrorCode(error: ErrorDescriptor): string { + return `${ERROR_PREFIX}${error.number}`; +} + +export const ERROR_RANGES: { + [category in keyof typeof ERRORS]: { + min: number; + max: number; + title: string; + }; +} = { + GENERAL: { + min: 1, + max: 99, + title: "General errors", + }, + INTERNAL: { + min: 100, + max: 199, + title: "Internal errors", + }, +}; + +export const ERRORS = { + GENERAL: { + TEST: { + number: 1, + message: "Test error", + }, + }, + INTERNAL: { + TEMPLATE_INVALID_VARIABLE_NAME: { + number: 100, + message: "Invalid variable name: %variable%", + }, + TEMPLATE_VARIABLE_NOT_FOUND: { + number: 101, + message: "Variable not found: %variable%", + }, + TEMPLATE_VALUE_CONTAINS_VARIABLE_TAG: { + number: 102, + message: "Value contains variable tag: %variable%", + }, + }, +}; + +/** + * Setting the type of ERRORS to a map let us access undefined ones. Letting it + * be a literal doesn't enforce that its values are of type ErrorDescriptor. + * + * We let it be a literal, and use this variable to enforce the types + */ +const _PHONY_VARIABLE_TO_FORCE_ERRORS_TO_BE_OF_TYPE_ERROR_DESCRIPTOR: { + [category: string]: { + [name: string]: ErrorDescriptor; + }; +} = ERRORS; diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 5752dd7caa..588c2ce290 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,3 +1,5 @@ +import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; + /** * All exceptions intenionally thrown with Ignition-core * extend this class. @@ -5,54 +7,103 @@ * @alpha */ export class IgnitionError extends Error { - constructor(message: string) { - super(message); + constructor( + errorDescriptor: ErrorDescriptor, + messageArguments: Record = {} + ) { + const prefix = `${getErrorCode(errorDescriptor)}: `; + const formattedMessage = applyErrorMessageTemplate( + errorDescriptor.message, + messageArguments + ); + + super(prefix + formattedMessage); this.name = this.constructor.name; } } /** - * This error class represents issue detected by Ignition-cores - * validation phase on the user inputed module. Validation errors - * capture the stack to the action within the offending module, - * to enhance the locality of the validation error message. + * This function applies error messages templates like this: + * + * - Template is a string which contains a variable tags. A variable tag is a + * a variable name surrounded by %. Eg: %plugin1% + * - A variable name is a string of alphanumeric ascii characters. + * - Every variable tag is replaced by its value. + * - %% is replaced by %. + * - Values can't contain variable tags. + * - If a variable is not present in the template, but present in the values + * object, an error is thrown. * - * * @alpha + * @param template The template string. + * @param values A map of variable names to their values. */ -export class IgnitionValidationError extends IgnitionError { - constructor(message: string) { - super(message); - - // This is required to allow calls to `resetStackFrom`, - // otherwise the function is not available on the - // error instance - Object.setPrototypeOf(this, new.target.prototype); +export function applyErrorMessageTemplate( + template: string, + values: { [templateVar: string]: any } +): string { + return _applyErrorMessageTemplate(template, values, false); +} + +function _applyErrorMessageTemplate( + template: string, + values: { [templateVar: string]: any }, + isRecursiveCall: boolean +): string { + if (!isRecursiveCall) { + for (const variableName of Object.keys(values)) { + if (variableName.match(/^[a-zA-Z][a-zA-Z0-9]*$/) === null) { + throw new IgnitionError( + ERRORS.INTERNAL.TEMPLATE_INVALID_VARIABLE_NAME, + { + variable: variableName, + } + ); + } + + const variableTag = `%${variableName}%`; + + if (!template.includes(variableTag)) { + throw new IgnitionError(ERRORS.INTERNAL.TEMPLATE_VARIABLE_NOT_FOUND, { + variable: variableName, + }); + } + } } - /** - * Reset the stack hiding parts that are bellow the given function. - * The intention is the function should be part of the user callable - * api, so that the stack leads directly to the line in the module - * the user called (i.e. `m.contract(...)`) - * - * @param f - the function to hide all of the stacktrace above - * - * @internal - */ - public resetStackFrom(f: () => any) { - Error.captureStackTrace(this, f); + if (template.includes("%%")) { + return template + .split("%%") + .map((part) => _applyErrorMessageTemplate(part, values, true)) + .join("%"); } -} -/** - * This error class is thrown in situations where Ignition - * intentionally doesn't support a certain operation. - * - * @alpha - */ -export class UnsupportedOperationError extends IgnitionError { - constructor(message: string) { - super(message); + for (const variableName of Object.keys(values)) { + let value: string; + + if (values[variableName] === undefined) { + value = "undefined"; + } else if (values[variableName] === null) { + value = "null"; + } else { + value = values[variableName].toString(); + } + + if (value === undefined) { + value = "undefined"; + } + + const variableTag = `%${variableName}%`; + + if (value.match(/%([a-zA-Z][a-zA-Z0-9]*)?%/) !== null) { + throw new IgnitionError( + ERRORS.INTERNAL.TEMPLATE_VALUE_CONTAINS_VARIABLE_TAG, + { variable: variableName } + ); + } + + template = template.split(variableTag).join(value); } + + return template; } From 3a97486bd41dec11f38a1b4863be7c814fabac89 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Sep 2023 19:39:39 -0400 Subject: [PATCH 0957/1302] updated all existing usages of IgnitionError --- packages/core/src/build-module.ts | 11 +- packages/core/src/errors-list.ts | 124 +++++++++++++++++- packages/core/src/errors.ts | 2 +- .../core/src/ignition-module-serializer.ts | 19 +-- .../internal/execution/execution-engine.ts | 3 +- .../handlers/monitor-onchain-interaction.ts | 10 +- .../src/internal/execution/jsonrpc-client.ts | 8 +- .../internal/execution/nonce-management.ts | 34 +++-- packages/core/src/internal/module-builder.ts | 7 +- .../src/internal/reconciliation/reconciler.ts | 5 +- .../core/src/internal/utils/assertions.ts | 5 +- packages/core/src/internal/wiper.ts | 20 ++- .../hardhat-plugin/src/ignition-helper.ts | 4 +- 13 files changed, 188 insertions(+), 64 deletions(-) diff --git a/packages/core/src/build-module.ts b/packages/core/src/build-module.ts index 7f3c9ef9c8..6963c18e1a 100644 --- a/packages/core/src/build-module.ts +++ b/packages/core/src/build-module.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "./errors"; +import { ERRORS } from "./errors-list"; import { ModuleConstructor } from "./internal/module-builder"; import { isValidIgnitionIdentifier } from "./internal/utils/identifier-validators"; import { IgnitionModule, IgnitionModuleResult } from "./types/module"; @@ -23,17 +24,17 @@ export function buildModule< moduleDefintionFunction: (m: IgnitionModuleBuilder) => IgnitionModuleResultsT ): IgnitionModule { if (typeof moduleId !== "string") { - throw new IgnitionError(`\`moduleId\` must be a string`); + throw new IgnitionError(ERRORS.MODULE.INVALID_MODULE_ID); } if (!isValidIgnitionIdentifier(moduleId)) { - throw new IgnitionError( - `The moduleId "${moduleId}" contains banned characters, ids can only contain alphanumerics or underscores` - ); + throw new IgnitionError(ERRORS.MODULE.INVALID_MODULE_ID_CHARACTERS, { + moduleId, + }); } if (typeof moduleDefintionFunction !== "function") { - throw new IgnitionError(`\`moduleDefintionFunction\` must be a function`); + throw new IgnitionError(ERRORS.MODULE.INVALID_MODULE_DEFINITION_FUNCTION); } const constructor = new ModuleConstructor(); diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 0e83a56c2a..0f6fb446f2 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -25,29 +25,141 @@ export const ERROR_RANGES: { INTERNAL: { min: 100, max: 199, - title: "Internal errors", + title: "Internal Ignition errors", + }, + MODULE: { + min: 200, + max: 299, + title: "Module related errors", + }, + SERIALIZATION: { + min: 300, + max: 399, + title: "Serialization errors", + }, + EXECUTION: { + min: 400, + max: 499, + title: "Execution errors", + }, + RECONCILIATION: { + min: 500, + max: 599, + title: "Reconciliation errors", + }, + WIPE: { + min: 600, + max: 699, + title: "Wipe errors", }, }; export const ERRORS = { GENERAL: { - TEST: { + ASSERTION_ERROR: { number: 1, - message: "Test error", + message: "Internal Ignition invariant was violated: %description%", }, }, INTERNAL: { TEMPLATE_INVALID_VARIABLE_NAME: { number: 100, - message: "Invalid variable name: %variable%", + message: + "Variable names can only include ascii letters and numbers, and start with a letter, but got %variable%", }, TEMPLATE_VARIABLE_NOT_FOUND: { number: 101, - message: "Variable not found: %variable%", + message: "Variable %variable%'s tag not present in the template", }, TEMPLATE_VALUE_CONTAINS_VARIABLE_TAG: { number: 102, - message: "Value contains variable tag: %variable%", + message: + "Template values can't include variable tags, but %variable%'s value includes one", + }, + }, + MODULE: { + INVALID_MODULE_ID: { + number: 200, + message: "Module id must be a string", + }, + INVALID_MODULE_ID_CHARACTERS: { + number: 201, + message: + 'The moduleId "%moduleId%" contains banned characters, ids can only contain alphanumerics or underscores', + }, + INVALID_MODULE_DEFINITION_FUNCTION: { + number: 202, + message: "Module definition function must be a function", + }, + ASYNC_MODULE_DEFINITION_FUNCTION: { + number: 203, + message: + "The callback passed to 'buildModule' for %moduleDefinitionId% returns a Promise; async callbacks are not allowed in 'buildModule'.", + }, + }, + SERIALIZATION: { + INVALID_FUTURE_ID: { + number: 300, + message: "Unable to lookup future during deserialization: %futureId%", + }, + INVALID_FUTURE_TYPE: { + number: 301, + message: "Invalid FutureType %type% as serialized argument", + }, + LOOKAHEAD_NOT_FOUND: { + number: 302, + message: "Lookahead value %key% missing", + }, + }, + EXECUTION: { + FUTURE_NOT_FOUND: { + number: 400, + message: "Could not locate future id from batching", + }, + DROPPED_TRANSACTION: { + number: 401, + message: + "Error while executing %futureId%: all the transactions of its network interaction %networkInteractionId% were dropped. Please try rerunning Ignition.", + }, + INVALID_JSON_RPC_RESPONSE: { + number: 402, + message: "Invalid JSON-RPC response for %method%: %response%", + }, + WAITING_FOR_CONFIRMATIONS: { + number: 403, + message: + "You have sent transactions from %sender%. Please wait until they get %requiredConfirmations% confirmations before running Ignition again.", + }, + WAITING_FOR_NONCE: { + number: 404, + message: + "You have sent transactions from %sender% with nonce %nonce%. Please wait until they get %requiredConfirmations% confirmations before running Ignition again.", + }, + INVALID_NONCE: { + number: 405, + message: + "The next nonce for %sender% should be %expectedNonce%, but is %pendingCount%. Please make sure not to send transactions from %sender% while running this deployment and try again.", + }, + }, + RECONCILIATION: { + INVALID_EXECUTION_STATUS: { + number: 500, + message: "Unsupported execution status: %status%", + }, + }, + WIPE: { + UNINITIALIZED_DEPLOYMENT: { + number: 600, + message: + "Cannot wipe %futureId% as the deployment hasn't been intialialized yet", + }, + NO_STATE_FOR_FUTURE: { + number: 601, + message: "Cannot wipe %futureId% as no state recorded against it", + }, + DEPENDENT_FUTURES: { + number: 602, + message: `Cannot wipe %futureId% as there are dependent futures that have already started: %dependents%`, }, }, }; diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 588c2ce290..410885f18a 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,7 +1,7 @@ import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; /** - * All exceptions intenionally thrown with Ignition-core + * All exceptions intentionally thrown with Ignition-core * extend this class. * * @alpha diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index d0de4ed437..5e8898cbc9 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "./errors"; +import { ERRORS } from "./errors-list"; import { AccountRuntimeValueImplementation, ArtifactContractAtFutureImplementation, @@ -538,20 +539,18 @@ export class IgnitionModuleDeserializer { const swappedFuture = this._lookup(futureLookup, arg.futureId); if (swappedFuture === undefined) { - throw new IgnitionError( - `Unable to lookup future during deserialization: ${arg.futureId}` - ); + throw new IgnitionError(ERRORS.SERIALIZATION.INVALID_FUTURE_ID, { + futureId: arg.futureId, + }); } if ( swappedFuture.type === FutureType.CONTRACT_CALL || swappedFuture.type === FutureType.SEND_DATA ) { - throw new IgnitionError( - `Invalid FutureType ${ - FutureType[swappedFuture.type] - } as serialized argument` - ); + throw new IgnitionError(ERRORS.SERIALIZATION.INVALID_FUTURE_TYPE, { + type: FutureType[swappedFuture.type], + }); } return swappedFuture; @@ -855,7 +854,9 @@ export class IgnitionModuleDeserializer { const value = lookupTable.get(key); if (value === undefined) { - throw new IgnitionError(`Lookahead value ${key} missing`); + throw new IgnitionError(ERRORS.SERIALIZATION.LOOKAHEAD_NOT_FOUND, { + key, + }); } return value; diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index 69b2bd6ac5..9023f199f1 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { @@ -223,7 +224,7 @@ export class ExecutionEngine { const future = futures.find((f) => f.id === futureId); if (future === undefined) { - throw new IgnitionError("Could not locate future id from batching"); + throw new IgnitionError(ERRORS.EXECUTION.FUTURE_NOT_FOUND); } return future; diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts index bee8c5ceae..2f9638ae30 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../../../../errors"; +import { ERRORS } from "../../../../errors-list"; import { assertIgnitionInvariant } from "../../../utils/assertions"; import { JsonRpcClient } from "../../jsonrpc-client"; import { TransactionTrackingTimer } from "../../transaction-tracking-timer"; @@ -84,11 +85,10 @@ export async function monitorOnchainInteraction( // We do not try to recover from dopped transactions mid-execution if (transaction === undefined) { - throw new IgnitionError( - `Error while executing ${exState.id}: all the transactions of its network interaction ${lastNetworkInteraction.id} were dropped. - -Please try rerunning Ignition.` - ); + throw new IgnitionError(ERRORS.EXECUTION.DROPPED_TRANSACTION, { + futureId: exState.id, + networkInteractionId: lastNetworkInteraction.id, + }); } const [block, receipt] = await Promise.all([ diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 4b07e96c60..32573b710e 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { EIP1193Provider } from "../../types/provider"; import { @@ -599,9 +600,10 @@ function assertResponseType( assertion: boolean ): asserts assertion { if (!assertion) { - throw new IgnitionError( - `Invalid JSON-RPC response for ${method}: ${JSON.stringify(response)}` - ); + throw new IgnitionError(ERRORS.EXECUTION.INVALID_JSON_RPC_RESPONSE, { + method, + response: JSON.stringify(response), + }); } } function formatReceiptLogs(method: string, response: object): TransactionLog[] { diff --git a/packages/core/src/internal/execution/nonce-management.ts b/packages/core/src/internal/execution/nonce-management.ts index 1894a51c4a..337fe8bb64 100644 --- a/packages/core/src/internal/execution/nonce-management.ts +++ b/packages/core/src/internal/execution/nonce-management.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { getPendingNonceAndSender } from "../views/execution-state/get-pending-nonce-and-sender"; import { getPendingOnchainInteraction } from "../views/execution-state/get-pending-onchain-interaction"; @@ -79,9 +80,10 @@ export async function getNonceSyncMessages( // Case 0: We don't have any pending transactions if (pendingTransactions.length === 0) { if (safeConfirmationsCount !== pendingCount) { - throw new IgnitionError( - `You have sent transactions from ${sender}. Please wait until they get ${requiredConfirmations} confirmations before running Ignition again.` - ); + throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_CONFIRMATIONS, { + sender, + requiredConfirmations, + }); } } @@ -103,9 +105,11 @@ export async function getNonceSyncMessages( if (latestCount > nonce) { // We don't continue until the user's transactions have enough confirmations if (safeConfirmationsCount <= nonce) { - throw new IgnitionError( - `You have sent a transaction from ${sender} with nonce ${nonce}. Please wait until it gets ${requiredConfirmations} confirmations before running Ignition again.` - ); + throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_NONCE, { + sender, + nonce, + requiredConfirmations, + }); } messages.push({ @@ -121,9 +125,11 @@ export async function getNonceSyncMessages( // We first handle confirmed transactions, that'w why this check is safe here if (pendingCount > nonce) { - throw new IgnitionError( - `You have sent a transaction from ${sender} with nonce ${nonce}. Please wait until it gets ${requiredConfirmations} confirmations before running Ignition again.` - ); + throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_NONCE, { + sender, + nonce, + requiredConfirmations, + }); } // Case 3: There's no transaction sent by the user with this nonce, but ours were still dropped @@ -176,11 +182,11 @@ export class JsonRpcNonceManager implements NonceManager { : pendingCount; if (expectedNonce !== pendingCount) { - throw new IgnitionError( - `The next nonce for ${sender} should be ${expectedNonce}, but is ${pendingCount}. - -Please make sure not to send transactions from ${sender} while running this deployment and try again.` - ); + throw new IgnitionError(ERRORS.EXECUTION.INVALID_NONCE, { + sender, + expectedNonce, + pendingCount, + }); } // The nonce hasn't been used yet, but we update as it will be immediately used. diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 584911e4c6..7e95856776 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -2,6 +2,7 @@ import assert from "assert"; import { inspect } from "util"; import { IgnitionError, IgnitionValidationError } from "../errors"; +import { ERRORS } from "../errors-list"; import { isAccountRuntimeValue, isAddressResolvableFuture, @@ -132,9 +133,9 @@ export class ModuleConstructor { ); if ((mod as any).results instanceof Promise) { - throw new IgnitionError( - `The callback passed to 'buildModule' for ${moduleDefintion.id} returns a Promise; async callbacks are not allowed in 'buildModule'.` - ); + throw new IgnitionError(ERRORS.MODULE.ASYNC_MODULE_DEFINITION_FUNCTION, { + moduleDefinitionId: moduleDefintion.id, + }); } this._modules.set(moduleDefintion.id, mod); diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index ad6499ca8a..beead0a014 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { Future, IgnitionModule } from "../../types/module"; @@ -86,7 +87,9 @@ export class Reconciler { return `The previous run of the future ${exState.id} timed out, and will need wiped before running again`; } - throw new IgnitionError(`Unsupported execution status: ${exState.status}`); + throw new IgnitionError(ERRORS.RECONCILIATION.INVALID_EXECUTION_STATUS, { + status: exState.status, + }); } private static async _reconcileEachFutureInModule( diff --git a/packages/core/src/internal/utils/assertions.ts b/packages/core/src/internal/utils/assertions.ts index bf2c4b4f02..a413355b03 100644 --- a/packages/core/src/internal/utils/assertions.ts +++ b/packages/core/src/internal/utils/assertions.ts @@ -1,12 +1,11 @@ import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; export function assertIgnitionInvariant( invariant: boolean, description: string ): asserts invariant { if (!invariant) { - throw new IgnitionError( - `Internal Ignition invariant was violated: ${description}` - ); + throw new IgnitionError(ERRORS.GENERAL.ASSERTION_ERROR, { description }); } } diff --git a/packages/core/src/internal/wiper.ts b/packages/core/src/internal/wiper.ts index f8faf7c91d..ef2d20e647 100644 --- a/packages/core/src/internal/wiper.ts +++ b/packages/core/src/internal/wiper.ts @@ -1,4 +1,5 @@ import { IgnitionError } from "../errors"; +import { ERRORS } from "../errors-list"; import { DeploymentLoader } from "./deployment-loader/types"; import { @@ -17,17 +18,15 @@ export class Wiper { const deploymentState = await loadDeploymentState(this._deploymentLoader); if (deploymentState === undefined) { - throw new IgnitionError( - `Cannot wipe ${futureId} as the deployment hasn't been intialialized yet` - ); + throw new IgnitionError(ERRORS.WIPE.UNINITIALIZED_DEPLOYMENT, { + futureId, + }); } const executionState = deploymentState.executionStates[futureId]; if (executionState === undefined) { - throw new IgnitionError( - `Cannot wipe ${futureId} as no state recorded against it` - ); + throw new IgnitionError(ERRORS.WIPE.NO_STATE_FOR_FUTURE, { futureId }); } const dependents = Object.values(deploymentState.executionStates).filter( @@ -35,11 +34,10 @@ export class Wiper { ); if (dependents.length > 0) { - throw new IgnitionError( - `Cannot wipe ${futureId} as there are dependent futures that have already started:\n${dependents - .map((state) => ` ${state.id}\n`) - .join()}` - ); + throw new IgnitionError(ERRORS.WIPE.DEPENDENT_FUTURES, { + futureId, + dependents: dependents.map((d) => d.id).join(", "), + }); } const wipeMessage: WipeExecutionStateMessage = { diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index a08cb1d8fd..a9542b9137 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -7,7 +7,6 @@ import { DeploymentResultType, EIP1193Provider, Future, - IgnitionError, IgnitionModule, IgnitionModuleResult, isContractFuture, @@ -89,7 +88,8 @@ export class IgnitionHelper { if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { const message = errorDeploymentResultToExceptionMessage(result); - throw new IgnitionError(message); + // todo: should we implement an IgnitionPluginError to throw here instead? + throw new Error(message); } return this._toEthersContracts(ignitionModule, result); From afc1b700e6acac0156fb593b03d0eb37267972e4 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Sep 2023 20:58:57 -0400 Subject: [PATCH 0958/1302] update all IgnitionValidationErrors to use IgnitionError instead --- packages/core/src/deploy.ts | 9 +- packages/core/src/errors-list.ts | 137 ++++++++++++++++++ packages/core/src/internal/execution/abi.ts | 128 +++++++++------- .../core/src/internal/execution/libraries.ts | 59 ++++---- packages/core/src/internal/module-builder.ts | 15 +- .../stageOne/validateNamedContractAt.ts | 9 +- .../stageOne/validateNamedContractCall.ts | 9 +- .../validateNamedContractDeployment.ts | 9 +- .../validateNamedLibraryDeployment.ts | 9 +- .../stageOne/validateNamedStaticCall.ts | 9 +- .../stageOne/validateReadEventArgument.ts | 9 +- .../stageTwo/validateArtifactContractAt.ts | 19 +-- .../validateArtifactContractDeployment.ts | 25 ++-- .../stageTwo/validateNamedContractAt.ts | 19 +-- .../stageTwo/validateNamedContractCall.ts | 25 ++-- .../validateNamedContractDeployment.ts | 25 ++-- .../stageTwo/validateNamedStaticCall.ts | 9 +- .../validation/stageTwo/validateSendData.ts | 35 ++--- .../core/src/internal/validation/utils.ts | 14 +- .../internal/validation/validateStageOne.ts | 6 +- .../internal/validation/validateStageTwo.ts | 6 +- packages/hardhat-plugin/src/load-module.ts | 8 +- .../hardhat-plugin/src/ui/UiEventHandler.tsx | 3 +- 23 files changed, 389 insertions(+), 207 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index da4509e26a..9491a7e382 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "./errors"; +import { IgnitionError } from "./errors"; +import { ERRORS } from "./errors-list"; import { DEFAULT_AUTOMINE_REQUIRED_CONFIRMATIONS, defaultConfig, @@ -83,9 +84,9 @@ export async function deploy< if (defaultSender !== undefined) { if (!accounts.includes(defaultSender)) { - throw new IgnitionValidationError( - `Default sender ${defaultSender} is not part of the provided accounts` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_DEFAULT_SENDER, { + defaultSender, + }); } } else { defaultSender = getDefaultSender(accounts); diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 0f6fb446f2..4b281b506c 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -52,6 +52,11 @@ export const ERROR_RANGES: { max: 699, title: "Wipe errors", }, + VALIDATION: { + min: 700, + max: 799, + title: "Validation errors", + }, }; export const ERRORS = { @@ -60,6 +65,10 @@ export const ERRORS = { number: 1, message: "Internal Ignition invariant was violated: %description%", }, + UNSUPPORTED_DECODE: { + number: 2, + message: "Ignition can't decode ethers.js value of type %type%: %value%", + }, }, INTERNAL: { TEMPLATE_INVALID_VARIABLE_NAME: { @@ -162,6 +171,134 @@ export const ERRORS = { message: `Cannot wipe %futureId% as there are dependent futures that have already started: %dependents%`, }, }, + VALIDATION: { + INVALID_DEFAULT_SENDER: { + number: 700, + message: + "Default sender %defaultSender% is not part of the provided accounts", + }, + MISSING_EMITTER: { + number: 701, + message: + "`options.emitter` must be provided when reading an event from a SendDataFuture", + }, + INVALID_MODULE: { + number: 702, + message: "Module validation failed with reason: %message%", + }, + INVALID_CONSTRUCTOR_ARGS_LENGTH: { + number: 703, + message: + "The constructor of the contract '%contractName%' expects %expectedArgsLength% arguments but %argsLength% were given", + }, + INVALID_FUNCTION_ARGS_LENGTH: { + number: 704, + message: + "Function %functionName% in contract %contractName% expects %expectedLength% arguments but %argsLength% were given", + }, + INVALID_STATIC_CALL: { + number: 705, + message: + "Function %functionName% in contract %contractName% is not 'pure' or 'view' and cannot be statically called", + }, + INDEXED_EVENT_ARG: { + number: 706, + message: + "Indexed argument %argument% of event %eventName% of contract %contractName% is not stored in the receipt, but its hash is, so you can't read it.", + }, + INVALID_OVERLOAD_NAME: { + number: 707, + message: "Invalid %eventOrFunction% name '%name%'", + }, + OVERLOAD_NOT_FOUND: { + number: 708, + message: + "%eventOrFunction% '%name%' not found in contract %contractName%", + }, + REQUIRE_BARE_NAME: { + number: 709, + message: + "%eventOrFunction% name '%name%' used for contract %contractName%, but it's not overloaded. Use '%bareName%' instead.", + }, + OVERLOAD_NAME_REQUIRED: { + number: 710, + message: + "%eventOrFunction% '%name%' is overloaded in contract %contractName%. Please use one of these names instead: %normalizedNameList%", + }, + INVALID_OVERLOAD_GIVEN: { + number: 711, + message: + "%eventOrFunction% '%name%' is not a valid overload of '%bareName%' in contract %contractName%. Please use one of these names instead: %normalizedNameList%", + }, + EVENT_ARG_NOT_FOUND: { + number: 712, + message: + "Event %eventName% of contract %contractName% has no argument named %argument%", + }, + INVALID_EVENT_ARG_INDEX: { + number: 713, + message: + "Event %eventName% of contract %contractName% has only %expectedLength% arguments, but argument %argument% was requested", + }, + FUNCTION_ARG_NOT_FOUND: { + number: 714, + message: + "Function %functionName% of contract %contractName% has no return value named %argument%", + }, + INVALID_FUNCTION_ARG_INDEX: { + number: 715, + message: + "Function %functionName% of contract %contractName% has only %expectedLength% return values, but value %argument% was requested", + }, + MISSING_LIBRARIES: { + number: 716, + message: + "Invalid libraries for contract %contractName%: The following libraries are missing: %fullyQualifiedNames%", + }, + CONFLICTING_LIBRARY_NAMES: { + number: 717, + message: + "Invalid libraries for contract %contractName%: The names '%inputName%' and '%libName%' clash with each other, please use qualified names for both.", + }, + INVALID_LIBRARY_NAME: { + number: 718, + message: "Invalid library name %libraryName% for contract %contractName%", + }, + LIBRARY_NOT_NEEDED: { + number: 719, + message: + "Invalid library %libraryName% for contract %contractName%: this library is not needed by this contract.", + }, + AMBIGUOUS_LIBRARY_NAME: { + number: 720, + message: `Invalid libraries for contract %contractName%: The name "%libraryName%" is ambiguous, please use one of the following fully qualified names: %fullyQualifiedNames%`, + }, + INVALID_LIBRARY_ADDRESS: { + number: 721, + message: `Invalid address %address% for library %libraryName% of contract %contractName%`, + }, + NEGATIVE_ACCOUNT_INDEX: { + number: 722, + message: "Account index cannot be a negative number", + }, + ACCOUNT_INDEX_TOO_HIGH: { + number: 723, + message: + "Requested account index '%accountIndex%' is greater than the total number of available accounts '%accountsLength%'", + }, + INVALID_ARTIFACT: { + number: 724, + message: "Artifact for contract '%contractName%' is invalid", + }, + MISSING_MODULE_PARAMETER: { + number: 725, + message: "Module parameter '%name%' requires a value but was given none", + }, + INVALID_MODULE_PARAMETER_TYPE: { + number: 726, + message: `Module parameter '%name%' must be of type '%expectedType%' but is '%actualType%'`, + }, + }, }; /** diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index 9bdf9d8667..118363775a 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -7,10 +7,8 @@ import type { Result, } from "ethers"; -import { - IgnitionValidationError, - UnsupportedOperationError, -} from "../../errors"; +import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { Artifact } from "../../types/artifact"; import { ArgumentType, SolidityParameterType } from "../../types/module"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -161,9 +159,11 @@ export function validateContractConstructorArgsLength( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - throw new IgnitionValidationError( - `The constructor of the contract '${contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_CONSTRUCTOR_ARGS_LENGTH, { + contractName, + argsLength, + expectedArgsLength, + }); } } @@ -194,16 +194,20 @@ export function validateArtifactFunction( // Check that the number of arguments is correct if (fragment.inputs.length !== args.length) { - throw new IgnitionValidationError( - `Function ${functionName} in contract ${contractName} expects ${fragment.inputs.length} arguments but ${args.length} were given` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_FUNCTION_ARGS_LENGTH, { + functionName, + contractName, + argsLength: args.length, + expectedLength: fragment.inputs.length, + }); } // Check that the function is pure or view, which is required for a static call if (isStaticCall && !fragment.constant) { - throw new IgnitionValidationError( - `Function ${functionName} in contract ${contractName} is not 'pure' or 'view' and cannot be statically called` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_STATIC_CALL, { + functionName, + contractName, + }); } } @@ -253,9 +257,11 @@ export function validateArtifactEventArgumentParams( // as their hash is stored in a topic, and its actual value isn't stored // anywhere if (hasDynamicSize(paramType)) { - throw new IgnitionValidationError( - `Indexed argument ${argument} of event ${eventName} of contract ${emitterArtifact.contractName} is not stored in the receipt, but its hash is, so you can't read it.` - ); + throw new IgnitionError(ERRORS.VALIDATION.INDEXED_EVENT_ARG, { + eventName, + argument, + contractName: emitterArtifact.contractName, + }); } } } @@ -473,11 +479,10 @@ function ethersValueIntoEvmValue( return ethersResultIntoEvmTuple(ethersValue, paramType.components); } - throw new UnsupportedOperationError( - `Ignition can't decode ethers.js value of type ${ - paramType.type - }: ${JSON.stringify(ethersValue, undefined, 2)}` - ); + throw new IgnitionError(ERRORS.GENERAL.UNSUPPORTED_DECODE, { + type: paramType.type, + value: JSON.stringify(ethersValue, undefined, 2), + }); } function ethersResultIntoEvmValueArray( @@ -599,9 +604,10 @@ function validateOverloadedName( const bareName = getBareName(name); if (bareName === undefined) { - throw new IgnitionValidationError( - `Invalid ${eventOrFunction} name "${name}"` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_OVERLOAD_NAME, { + eventOrFunction, + name, + }); } const { ethers } = require("ethers") as typeof import("ethers"); @@ -618,9 +624,11 @@ function validateOverloadedName( .filter((fragment) => fragment.name === bareName); if (fragments.length === 0) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} "${name}" not found in contract ${artifact.contractName}` - ); + throw new IgnitionError(ERRORS.VALIDATION.OVERLOAD_NOT_FOUND, { + name, + eventOrFunction: eventOrFunctionCapitalized, + contractName: artifact.contractName, + }); } // If it is not overloaded we force the user to use the bare name @@ -628,9 +636,12 @@ function validateOverloadedName( // process. if (fragments.length === 1) { if (bareName !== name) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} name "${name}" used for contract ${artifact.contractName}, but it's not overloaded. Use "${bareName}" instead.` - ); + throw new IgnitionError(ERRORS.VALIDATION.REQUIRE_BARE_NAME, { + name, + bareName, + eventOrFunction: eventOrFunctionCapitalized, + contractName: artifact.contractName, + }); } return; @@ -647,19 +658,22 @@ function validateOverloadedName( const normalizedNameList = normalizedNames.map((nn) => `* ${nn}`).join("\n"); if (bareName === name) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} "${name}" is overloaded in contract ${artifact.contractName}. Please use one of these names instead: - -${normalizedNameList}` - ); + throw new IgnitionError(ERRORS.VALIDATION.OVERLOAD_NAME_REQUIRED, { + name, + normalizedNameList, + eventOrFunction: eventOrFunctionCapitalized, + contractName: artifact.contractName, + }); } if (!normalizedNames.includes(name)) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} "${name}" is not a valid overload of "${bareName}" in contract ${artifact.contractName}. Please use one of these names instead: - -${normalizedNameList}` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_OVERLOAD_GIVEN, { + name, + bareName, + normalizedNameList, + eventOrFunction: eventOrFunctionCapitalized, + contractName: artifact.contractName, + }); } } @@ -681,17 +695,22 @@ function getEventArgumentParamType( } } - throw new IgnitionValidationError( - `Event ${eventName} of contract ${contractName} has no argument named ${argument}` - ); + throw new IgnitionError(ERRORS.VALIDATION.EVENT_ARG_NOT_FOUND, { + eventName, + argument, + contractName, + }); } const paramType = eventFragment.inputs[argument]; if (paramType === undefined) { - throw new IgnitionValidationError( - `Event ${eventName} of contract ${contractName} has only ${eventFragment.inputs.length} arguments, but argument ${argument} was requested` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_EVENT_ARG_INDEX, { + eventName, + argument, + contractName, + expectedLength: eventFragment.inputs.length, + }); } return paramType; @@ -719,17 +738,22 @@ export function validateFunctionArgumentParamType( } if (!hasArg) { - throw new IgnitionValidationError( - `Function ${functionName} of contract ${contractName} has no return value named ${argument}` - ); + throw new IgnitionError(ERRORS.VALIDATION.FUNCTION_ARG_NOT_FOUND, { + functionName, + argument, + contractName, + }); } } else { const paramType = functionFragment.outputs[argument]; if (paramType === undefined) { - throw new IgnitionValidationError( - `Function ${functionName} of contract ${contractName} has only ${functionFragment.outputs.length} return values, but value ${argument} was requested` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_FUNCTION_ARG_INDEX, { + functionName, + argument, + contractName, + expectedLength: functionFragment.outputs.length, + }); } } } diff --git a/packages/core/src/internal/execution/libraries.ts b/packages/core/src/internal/execution/libraries.ts index b450dca221..f4ba7a1124 100644 --- a/packages/core/src/internal/execution/libraries.ts +++ b/packages/core/src/internal/execution/libraries.ts @@ -13,7 +13,8 @@ * @file */ -import { IgnitionValidationError } from "../../errors"; +import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { Artifact } from "../../types/artifact"; /** @@ -51,11 +52,10 @@ export function validateLibraryNames( .map((name) => `* ${name}`) .join("\n"); - throw new IgnitionValidationError( - `Invalid libraries for contract ${artifact.contractName}: The following libraries are missing: - - ${fullyQualifiedNames}` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_LIBRARIES, { + fullyQualifiedNames, + contractName: artifact.contractName, + }); } } @@ -109,9 +109,11 @@ function validateNotRepeatedLibraries( ); if (sourceName !== undefined && libraryNames.includes(libName)) { - throw new IgnitionValidationError( - `Invalid libraries for contract ${artifact.contractName}: The names "${inputName}" and "${libName}" clash with each other, please use qualified names for both.` - ); + throw new IgnitionError(ERRORS.VALIDATION.CONFLICTING_LIBRARY_NAMES, { + inputName, + libName, + contractName: artifact.contractName, + }); } } } @@ -129,9 +131,10 @@ function parseLibraryName( const parts = libraryName.split(":"); if (parts.length > 2) { - throw new IgnitionValidationError( - `Invalid library name ${libraryName} for contract ${contractName}` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_LIBRARY_NAME, { + libraryName, + contractName, + }); } if (parts.length === 1) { @@ -163,9 +166,10 @@ function getActualNameForArtifactLibrary( artifact.linkReferences[sourceName] === undefined || artifact.linkReferences[sourceName][libName] === undefined ) { - throw new IgnitionValidationError( - `Invalid library ${libraryName} for contract ${artifact.contractName}: this library is not needed by this contract.` - ); + throw new IgnitionError(ERRORS.VALIDATION.LIBRARY_NOT_NEEDED, { + libraryName, + contractName: artifact.contractName, + }); } return { sourceName, libName }; @@ -190,9 +194,10 @@ function getActualNameForArtifactLibrary( bareNameToParsedNames[libName] === undefined || bareNameToParsedNames[libName].length === 0 ) { - throw new IgnitionValidationError( - `Invalid library ${libraryName} for contract ${artifact.contractName}: this library is not needed by this contract.` - ); + throw new IgnitionError(ERRORS.VALIDATION.LIBRARY_NOT_NEEDED, { + libraryName, + contractName: artifact.contractName, + }); } if (bareNameToParsedNames[libName].length > 1) { @@ -203,11 +208,11 @@ function getActualNameForArtifactLibrary( ) .join("\n"); - throw new IgnitionValidationError( - `Invalid libraries for contract ${artifact.contractName}: The name "${libraryName}" is ambiguous, please use one of the following fully qualified names: - -${fullyQualifiedNames}` - ); + throw new IgnitionError(ERRORS.VALIDATION.AMBIGUOUS_LIBRARY_NAME, { + fullyQualifiedNames, + libraryName, + contractName: artifact.contractName, + }); } return bareNameToParsedNames[libName][0]; @@ -222,9 +227,11 @@ function validateAddresses( ) { for (const [libraryName, address] of Object.entries(libraries)) { if (address.match(/^0x[0-9a-fA-F]{40}$/) === null) { - throw new IgnitionValidationError( - `Invalid address ${address} for library ${libraryName} of contract ${artifact.contractName}` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_LIBRARY_ADDRESS, { + address, + libraryName, + contractName: artifact.contractName, + }); } } } diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 7e95856776..49f6844407 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -1,7 +1,6 @@ -import assert from "assert"; import { inspect } from "util"; -import { IgnitionError, IgnitionValidationError } from "../errors"; +import { IgnitionError } from "../errors"; import { ERRORS } from "../errors-list"; import { isAccountRuntimeValue, @@ -65,6 +64,7 @@ import { SendDataFutureImplementation, } from "./module"; import { resolveArgsToFutures } from "./utils"; +import { assertIgnitionInvariant } from "./utils/assertions"; import { toCallFutureId, toDeploymentFutureId, @@ -687,9 +687,7 @@ class IgnitionModuleBuilderImplementation< futureToReadFrom.type === FutureType.SEND_DATA && options.emitter === undefined ) { - throw new IgnitionValidationError( - "`options.emitter` must be provided when reading an event from a SendDataFuture" - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_EMITTER); } const contractToReadFrom = @@ -789,7 +787,7 @@ class IgnitionModuleBuilderImplementation< SubmoduleIgnitionModuleResultsT > ): SubmoduleIgnitionModuleResultsT { - assert( + assertIgnitionInvariant( ignitionSubmodule !== undefined, "Trying to use `undefined` as submodule. Make sure you don't have a circular dependency of modules." ); @@ -807,7 +805,10 @@ class IgnitionModuleBuilderImplementation< message: string, func: (...[]: any[]) => any ): never { - const validationError = new IgnitionValidationError(message); + const validationError = new IgnitionError( + ERRORS.VALIDATION.INVALID_MODULE, + { message } + ); // Improve the stack trace to stop on module api level Error.captureStackTrace(validationError, func); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts index 48c3a4eee3..6efc25dc67 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { NamedArtifactContractAtFuture } from "../../../types/module"; @@ -10,8 +11,8 @@ export async function validateNamedContractAt( const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contractName, + }); } } diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts index c5212e7ddd..e1c360428f 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ContractCallFuture } from "../../../types/module"; @@ -17,9 +18,9 @@ export async function validateNamedContractCall( : await artifactLoader.loadArtifact(future.contract.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contract.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contract.contractName, + }); } validateArtifactFunctionName(artifact, future.functionName); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts index edf99355d0..f01f05fec6 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; @@ -12,9 +13,9 @@ export async function validateNamedContractDeployment( const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contractName, + }); } validateLibraryNames(artifact, Object.keys(future.libraries)); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts index 1025bc98d9..a01739ce6e 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; @@ -11,9 +12,9 @@ export async function validateNamedLibraryDeployment( const artifact = await artifactLoader.loadArtifact(future.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contractName, + }); } validateLibraryNames(artifact, Object.keys(future.libraries)); diff --git a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts index dec782b6a8..ac2beb51ae 100644 --- a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { StaticCallFuture } from "../../../types/module"; @@ -17,9 +18,9 @@ export async function validateNamedStaticCall( : await artifactLoader.loadArtifact(future.contract.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contract.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contract.contractName, + }); } validateArtifactFunction( diff --git a/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts b/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts index f537a3844d..f3ae23cb7f 100644 --- a/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts +++ b/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { ReadEventArgumentFuture } from "../../../types/module"; @@ -14,9 +15,9 @@ export async function validateReadEventArgument( : await artifactLoader.loadArtifact(future.emitter.contractName); if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.emitter.contractName}' is invalid` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.emitter.contractName, + }); } validateArtifactEventArgumentParams( diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts index eeac6e55aa..e87b34ef05 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; @@ -15,15 +16,15 @@ export async function validateArtifactContractAt( deploymentParameters[future.address.moduleId]?.[future.address.name] ?? future.address.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.address.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.address.name, + }); } else if (typeof param !== "string") { - throw new IgnitionValidationError( - `Module parameter '${ - future.address.name - }' must be of type 'string' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.address.name, + expectedType: "string", + actualType: typeof param, + }); } } } diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts index 4ed1068e28..b78963e994 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -33,9 +34,9 @@ export async function validateArtifactContractDeployment( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( - `Module parameter '${missingParams[0].name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: missingParams[0].name, + }); } if (isModuleParameterRuntimeValue(future.value)) { @@ -43,15 +44,15 @@ export async function validateArtifactContractDeployment( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.value.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.value.name, + }); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( - `Module parameter '${ - future.value.name - }' must be of type 'bigint' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.value.name, + expectedType: "bigint", + actualType: typeof param, + }); } } } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts index 1f9c64e9cf..459f5eb775 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; @@ -15,15 +16,15 @@ export async function validateNamedContractAt( deploymentParameters[future.address.moduleId]?.[future.address.name] ?? future.address.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.address.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.address.name, + }); } else if (typeof param !== "string") { - throw new IgnitionValidationError( - `Module parameter '${ - future.address.name - }' must be of type 'string' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.address.name, + expectedType: "string", + actualType: typeof param, + }); } } } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts index e8cbe454e3..0ecb606a31 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -33,9 +34,9 @@ export async function validateNamedContractCall( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( - `Module parameter '${missingParams[0].name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: missingParams[0].name, + }); } if (isModuleParameterRuntimeValue(future.value)) { @@ -43,15 +44,15 @@ export async function validateNamedContractCall( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.value.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.value.name, + }); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( - `Module parameter '${ - future.value.name - }' must be of type 'bigint' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.value.name, + expectedType: "bigint", + actualType: typeof param, + }); } } } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts index f8b76dad80..03681e5e25 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -33,9 +34,9 @@ export async function validateNamedContractDeployment( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( - `Module parameter '${missingParams[0].name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: missingParams[0].name, + }); } if (isModuleParameterRuntimeValue(future.value)) { @@ -43,15 +44,15 @@ export async function validateNamedContractDeployment( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.value.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.value.name, + }); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( - `Module parameter '${ - future.value.name - }' must be of type 'bigint' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.value.name, + expectedType: "bigint", + actualType: typeof param, + }); } } } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts index 36becb052c..f25cb2857b 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -33,8 +34,8 @@ export async function validateNamedStaticCall( ); if (missingParams.length > 0) { - throw new IgnitionValidationError( - `Module parameter '${missingParams[0].name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: missingParams[0].name, + }); } } diff --git a/packages/core/src/internal/validation/stageTwo/validateSendData.ts b/packages/core/src/internal/validation/stageTwo/validateSendData.ts index fb878e00f9..4486a4ccd9 100644 --- a/packages/core/src/internal/validation/stageTwo/validateSendData.ts +++ b/packages/core/src/internal/validation/stageTwo/validateSendData.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../../errors"; +import { IgnitionError } from "../../../errors"; +import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -26,15 +27,15 @@ export async function validateSendData( deploymentParameters[future.to.moduleId]?.[future.to.name] ?? future.to.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.to.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.to.name, + }); } else if (typeof param !== "string") { - throw new IgnitionValidationError( - `Module parameter '${ - future.to.name - }' must be of type 'string' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.to.name, + expectedType: "string", + actualType: typeof param, + }); } } @@ -43,15 +44,15 @@ export async function validateSendData( deploymentParameters[future.value.moduleId]?.[future.value.name] ?? future.value.defaultValue; if (param === undefined) { - throw new IgnitionValidationError( - `Module parameter '${future.value.name}' requires a value but was given none` - ); + throw new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: future.value.name, + }); } else if (typeof param !== "bigint") { - throw new IgnitionValidationError( - `Module parameter '${ - future.value.name - }' must be of type 'bigint' but is '${typeof param}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.INVALID_MODULE_PARAMETER_TYPE, { + name: future.value.name, + expectedType: "bigint", + actualType: typeof param, + }); } } diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts index 014a4650dc..1f4a67ccb8 100644 --- a/packages/core/src/internal/validation/utils.ts +++ b/packages/core/src/internal/validation/utils.ts @@ -1,4 +1,5 @@ -import { IgnitionValidationError } from "../../errors"; +import { IgnitionError } from "../../errors"; +import { ERRORS } from "../../errors-list"; import { isFuture, isRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue, @@ -11,15 +12,14 @@ export function validateAccountRuntimeValue( accounts: string[] ): void { if (arv.accountIndex < 0) { - throw new IgnitionValidationError( - `Account index cannot be a negative number` - ); + throw new IgnitionError(ERRORS.VALIDATION.NEGATIVE_ACCOUNT_INDEX); } if (arv.accountIndex >= accounts.length) { - throw new IgnitionValidationError( - `Requested account index '${arv.accountIndex}' is greater than the total number of available accounts '${accounts.length}'` - ); + throw new IgnitionError(ERRORS.VALIDATION.ACCOUNT_INDEX_TOO_HIGH, { + accountIndex: arv.accountIndex, + accountsLength: accounts.length, + }); } } diff --git a/packages/core/src/internal/validation/validateStageOne.ts b/packages/core/src/internal/validation/validateStageOne.ts index 6c648c80a6..9abec0710f 100644 --- a/packages/core/src/internal/validation/validateStageOne.ts +++ b/packages/core/src/internal/validation/validateStageOne.ts @@ -1,4 +1,4 @@ -import { IgnitionValidationError } from "../../errors"; +import { IgnitionError } from "../../errors"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentResultType, @@ -30,8 +30,8 @@ export async function validateStageOne( await _validateFuture(future, artifactLoader); } catch (err) { assertIgnitionInvariant( - err instanceof IgnitionValidationError, - `Expected an IgnitionValidationError when validating the future ${future.id}` + err instanceof IgnitionError, + `Expected an IgnitionError when validating the future ${future.id}` ); return { diff --git a/packages/core/src/internal/validation/validateStageTwo.ts b/packages/core/src/internal/validation/validateStageTwo.ts index 1e5623d06e..93ad6839d9 100644 --- a/packages/core/src/internal/validation/validateStageTwo.ts +++ b/packages/core/src/internal/validation/validateStageTwo.ts @@ -1,4 +1,4 @@ -import { IgnitionValidationError } from "../../errors"; +import { IgnitionError } from "../../errors"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters, @@ -38,8 +38,8 @@ export async function validateStageTwo( ); } catch (err) { assertIgnitionInvariant( - err instanceof IgnitionValidationError, - `Expected an IgnitionValidationError when validating the future ${future.id}` + err instanceof IgnitionError, + `Expected an IgnitionError when validating the future ${future.id}` ); return { diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index d49aa718b8..9eec8ef51a 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,4 +1,4 @@ -import { IgnitionError, IgnitionModule } from "@nomicfoundation/ignition-core"; +import { IgnitionModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import { existsSync, pathExistsSync } from "fs-extra"; import path from "path"; @@ -12,7 +12,7 @@ export function loadModule( debug(`Loading user modules from '${modulesDirectory}'`); if (!existsSync(modulesDirectory)) { - throw new IgnitionError(`Directory ${modulesDirectory} not found.`); + throw new Error(`Directory ${modulesDirectory} not found.`); } const fullpathToModule = resolveFullPathToModule( @@ -21,11 +21,11 @@ export function loadModule( ); if (fullpathToModule === undefined) { - throw new IgnitionError(`Could not find module ${moduleNameOrPath}`); + throw new Error(`Could not find module ${moduleNameOrPath}`); } if (!isInModuleDirectory(modulesDirectory, fullpathToModule)) { - throw new IgnitionError( + throw new Error( `The referenced module ${moduleNameOrPath} is outside the module directory ${modulesDirectory}` ); } diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx index e4c941ed71..7e38e4b298 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx @@ -14,7 +14,6 @@ import { ExecutionEventListener, ExecutionEventResult, ExecutionEventResultType, - IgnitionError, IgnitionModuleResult, NetworkInteractionRequestEvent, OnchainInteractionBumpFeesEvent, @@ -355,7 +354,7 @@ export class UiEventHandler implements ExecutionEventListener { this._renderState.waitUntilExit === null || this._renderState.clear === null ) { - throw new IgnitionError("Cannot unmount with no unmount function"); + throw new Error("Cannot unmount with no unmount function"); } this._renderState.clear(); From 4a595769dc2bc0fa3f68ef2bede5614d926fe779 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Sep 2023 21:16:39 -0400 Subject: [PATCH 0959/1302] fix tests --- packages/core/src/errors-list.ts | 10 ++++++---- packages/core/test/call.ts | 2 +- packages/core/test/execution/abi.ts | 22 +++++++++++----------- packages/core/test/execution/libraries.ts | 2 +- packages/core/test/readEventArgument.ts | 2 +- packages/core/test/staticCall.ts | 2 +- packages/core/test/useModule.ts | 2 +- packages/core/test/wipe.ts | 2 +- 8 files changed, 23 insertions(+), 21 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 4b281b506c..622e86c31b 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -222,13 +222,15 @@ export const ERRORS = { }, OVERLOAD_NAME_REQUIRED: { number: 710, - message: - "%eventOrFunction% '%name%' is overloaded in contract %contractName%. Please use one of these names instead: %normalizedNameList%", + message: `%eventOrFunction% '%name%' is overloaded in contract %contractName%. Please use one of these names instead: + +%normalizedNameList%`, }, INVALID_OVERLOAD_GIVEN: { number: 711, - message: - "%eventOrFunction% '%name%' is not a valid overload of '%bareName%' in contract %contractName%. Please use one of these names instead: %normalizedNameList%", + message: `%eventOrFunction% '%name%' is not a valid overload of '%bareName%' in contract %contractName%. Please use one of these names instead: + +%normalizedNameList%`, }, EVENT_ARG_NOT_FOUND: { number: 712, diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index ba9e0c4e2b..de31550416 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -534,7 +534,7 @@ describe("call", () => { await assert.isRejected( validateNamedContractCall(future as any, setupMockArtifactResolver()), - /Function "test" not found in contract Another/ + /Function 'test' not found in contract Another/ ); }); diff --git a/packages/core/test/execution/abi.ts b/packages/core/test/execution/abi.ts index e2b658f461..72aa041670 100644 --- a/packages/core/test/execution/abi.ts +++ b/packages/core/test/execution/abi.ts @@ -252,7 +252,7 @@ describe("abi", () => { const artifact = callEncodingFixtures.WithComplexArguments; assert.throws(() => { decodeArtifactFunctionCallResult(artifact, "nonExistent", "0x"); - }, 'Function "nonExistent" not found in contract WithComplexArguments'); + }, "Function 'nonExistent' not found in contract WithComplexArguments"); }); it("Should be able to decode a single successful result", () => { @@ -373,7 +373,7 @@ describe("abi", () => { const artifact = callEncodingFixtures.WithComplexArguments; assert.throws(() => { encodeArtifactFunctionCall(artifact, "nonExistent", []); - }, 'Function "nonExistent" not found in contract WithComplexArguments'); + }, "Function 'nonExistent' not found in contract WithComplexArguments"); }); it("Should encode the arguments and return them", () => { @@ -651,7 +651,7 @@ describe("abi", () => { callEncodingFixtures.FunctionNameValidation, "12" ), - `Invalid function name "12"` + `Invalid function name '12'` ); assert.throws( @@ -660,7 +660,7 @@ describe("abi", () => { callEncodingFixtures.FunctionNameValidation, "asd(123, asd" ), - `Invalid function name "asd(123, asd"` + `Invalid function name 'asd(123, asd'` ); }); @@ -671,7 +671,7 @@ describe("abi", () => { callEncodingFixtures.FunctionNameValidation, "nonExistentFunction" ), - `Function "nonExistentFunction" not found in contract FunctionNameValidation` + `Function 'nonExistentFunction' not found in contract FunctionNameValidation` ); assert.throws( @@ -680,7 +680,7 @@ describe("abi", () => { callEncodingFixtures.FunctionNameValidation, "nonExistentFunction2(uint,bytes32)" ), - `Function "nonExistentFunction2(uint,bytes32)" not found in contract FunctionNameValidation` + `Function 'nonExistentFunction2(uint,bytes32)' not found in contract FunctionNameValidation` ); }); @@ -708,7 +708,7 @@ describe("abi", () => { callEncodingFixtures.FunctionNameValidation, "noOverloads()" ); - }, `Function name "noOverloads()" used for contract FunctionNameValidation, but it's not overloaded. Use "noOverloads" instead`); + }, `Function name 'noOverloads()' used for contract FunctionNameValidation, but it's not overloaded. Use 'noOverloads' instead`); }); }); @@ -721,7 +721,7 @@ describe("abi", () => { "withTypeBasedOverloads" ); }, - `Function "withTypeBasedOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: + `Function 'withTypeBasedOverloads' is overloaded in contract FunctionNameValidation. Please use one of these names instead: * withTypeBasedOverloads(uint256) * withTypeBasedOverloads(int256)` @@ -734,7 +734,7 @@ describe("abi", () => { "withParamCountOverloads" ); }, - `Function "withParamCountOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: + `Function 'withParamCountOverloads' is overloaded in contract FunctionNameValidation. Please use one of these names instead: * withParamCountOverloads() * withParamCountOverloads(int256)` @@ -749,7 +749,7 @@ describe("abi", () => { "withTypeBasedOverloads(bool)" ); }, - `Function "withTypeBasedOverloads(bool)" is not a valid overload of "withTypeBasedOverloads" in contract FunctionNameValidation. Please use one of these names instead: + `Function 'withTypeBasedOverloads(bool)' is not a valid overload of 'withTypeBasedOverloads' in contract FunctionNameValidation. Please use one of these names instead: * withTypeBasedOverloads(uint256) * withTypeBasedOverloads(int256)` @@ -762,7 +762,7 @@ describe("abi", () => { "withParamCountOverloads(bool)" ); }, - `Function "withParamCountOverloads(bool)" is not a valid overload of "withParamCountOverloads" in contract FunctionNameValidation. Please use one of these names instead: + `Function 'withParamCountOverloads(bool)' is not a valid overload of 'withParamCountOverloads' in contract FunctionNameValidation. Please use one of these names instead: * withParamCountOverloads() * withParamCountOverloads(int256)` diff --git a/packages/core/test/execution/libraries.ts b/packages/core/test/execution/libraries.ts index a87ab366c9..51708fc3ec 100644 --- a/packages/core/test/execution/libraries.ts +++ b/packages/core/test/execution/libraries.ts @@ -59,7 +59,7 @@ describe("Libraries handling", () => { "Lib", "contracts/C.sol:Lib", ]); - }, `The names "contracts/C.sol:Lib" and "Lib" clash with each other`); + }, `The names 'contracts/C.sol:Lib' and 'Lib' clash with each other`); }); it("Should accept bare names if non-ambiguous", () => { diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 536b457940..391c713a29 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -275,7 +275,7 @@ describe("Read event argument", () => { await assert.isRejected( validateReadEventArgument(future as any, setupMockArtifactResolver()), - /Event "test" not found/ + /Event 'test' not found/ ); }); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 6d24f78466..54625fea9f 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -549,7 +549,7 @@ describe("static call", () => { await assert.isRejected( validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function "test" not found in contract Another/ + /Function 'test' not found in contract Another/ ); }); diff --git a/packages/core/test/useModule.ts b/packages/core/test/useModule.ts index 5b57757f02..4ed7a6d277 100644 --- a/packages/core/test/useModule.ts +++ b/packages/core/test/useModule.ts @@ -212,7 +212,7 @@ describe("useModule", () => { type: DeploymentResultType.VALIDATION_ERROR, errors: { "Submodule1#Contract1": [ - "Module parameter 'param1' requires a value but was given none", + "IGN725: Module parameter 'param1' requires a value but was given none", ], }, }); diff --git a/packages/core/test/wipe.ts b/packages/core/test/wipe.ts index 90a0179500..f8d0497416 100644 --- a/packages/core/test/wipe.ts +++ b/packages/core/test/wipe.ts @@ -134,7 +134,7 @@ describe("wipe", () => { await assert.isRejected( wiper.wipe(contract1Id), - `Cannot wipe ${contract1Id} as there are dependent futures that have already started:\n ${contract2Id}` + `Cannot wipe ${contract1Id} as there are dependent futures that have already started: ${contract2Id}` ); }); }); From 298c9f53a4025ee075752ec64c340a4d38c207fc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Sep 2023 21:25:10 -0400 Subject: [PATCH 0960/1302] fix lint --- packages/core/src/errors-list.ts | 6 ++++++ packages/core/src/errors.ts | 6 ++++-- packages/core/src/index.ts | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 622e86c31b..e55aa74cbe 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -1,5 +1,11 @@ export const ERROR_PREFIX = "IGN"; +/** + * ErrorDescriptor is a type that describes an error. + * It's used to generate error codes and messages. + * + * @beta + */ export interface ErrorDescriptor { number: number; // Message can use templates. See applyErrorMessageTemplate diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 410885f18a..66ef944fea 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -35,8 +35,10 @@ export class IgnitionError extends Error { * - If a variable is not present in the template, but present in the values * object, an error is thrown. * - * @param template The template string. - * @param values A map of variable names to their values. + * @param template - The template string. + * @param values - A map of variable names to their values. + * + * @beta */ export function applyErrorMessageTemplate( template: string, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index db4dbfeb5f..f205abb165 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,7 @@ export { buildModule } from "./build-module"; export { deploy } from "./deploy"; export * from "./errors"; +export { ErrorDescriptor } from "./errors-list"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export * from "./type-guards"; From 975b82ff14fc1a9cf814aa3fa4738b16bd0cb16e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Sep 2023 17:47:32 -0400 Subject: [PATCH 0961/1302] add plugin errors --- packages/core/src/errors.ts | 69 +++++++++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 66ef944fea..bbf040de49 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,12 +1,25 @@ import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; +/** + * Base error class extended by all custom errors. + * Placeholder to allow us to customize error output formatting in the future. + * + * @alpha + */ +export class CustomError extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + } +} + /** * All exceptions intentionally thrown with Ignition-core * extend this class. * * @alpha */ -export class IgnitionError extends Error { +export class IgnitionError extends CustomError { constructor( errorDescriptor: ErrorDescriptor, messageArguments: Record = {} @@ -23,6 +36,58 @@ export class IgnitionError extends Error { } } +/** + * This class is used to throw errors from Ignition plugins made by third parties. + * + * @alpha + */ +export class IgnitionPluginError extends CustomError { + public static isIgnitionPluginError( + error: any + ): error is IgnitionPluginError { + return ( + typeof error === "object" && + error !== null && + (error as IgnitionPluginError)._isIgnitionPluginError === true + ); + } + + private readonly _isIgnitionPluginError = true; + + public readonly pluginName: string; + + constructor(pluginName: string, message: string) { + super(message); + this.pluginName = pluginName; + Object.setPrototypeOf(this, IgnitionPluginError.prototype); + } +} + +/** + * This class is used to throw errors from *core* Ignition plugins. + * If you are developing a third-party plugin, use IgnitionPluginError instead. + * + * @alpha + */ +export class NomicIgnitionPluginError extends IgnitionPluginError { + public static isNomicIgnitionPluginError( + error: any + ): error is NomicIgnitionPluginError { + return ( + typeof error === "object" && + error !== null && + (error as NomicIgnitionPluginError)._isNomicIgnitionPluginError === true + ); + } + + private readonly _isNomicIgnitionPluginError = true; + + constructor(pluginName: string, message: string) { + super(pluginName, message); + Object.setPrototypeOf(this, NomicIgnitionPluginError.prototype); + } +} + /** * This function applies error messages templates like this: * @@ -38,7 +103,7 @@ export class IgnitionError extends Error { * @param template - The template string. * @param values - A map of variable names to their values. * - * @beta + * @alpha */ export function applyErrorMessageTemplate( template: string, From a2922238f3dff5a8ecfe8bd75390caadde68032c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Sep 2023 18:21:35 -0400 Subject: [PATCH 0962/1302] move all external imports inside their respective task definitions --- packages/hardhat-plugin/src/index.ts | 45 ++++++++++++++++++---------- 1 file changed, 30 insertions(+), 15 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index bfc270c747..b606754c9e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,23 +1,10 @@ +import type { DeploymentParameters } from "@nomicfoundation/ignition-core"; + import "@nomicfoundation/hardhat-ethers"; -import { - deploy, - DeploymentParameters, - IgnitionModuleSerializer, - wipe, -} from "@nomicfoundation/ignition-core"; import { existsSync, readdirSync, readJSONSync } from "fs-extra"; import { extendConfig, extendEnvironment, task } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; -import Prompt from "prompts"; - -import { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; -import { IgnitionHelper } from "./ignition-helper"; -import { loadModule } from "./load-module"; -import { UiEventHandler } from "./ui/UiEventHandler"; -import { VerboseEventHandler } from "./ui/VerboseEventHandler"; -import { open } from "./utils/open"; -import { writeVisualization } from "./visualization/write-visualization"; import "./type-extensions"; @@ -50,6 +37,8 @@ extendConfig((config, userConfig) => { */ extendEnvironment((hre) => { hre.ignition = lazyObject(() => { + const { IgnitionHelper } = require("./ignition-helper"); + return new IgnitionHelper(hre); }); }); @@ -82,6 +71,16 @@ task("deploy") }, hre ) => { + const { default: Prompt } = await import("prompts"); + const { deploy } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const { loadModule } = await import("./load-module"); + const { UiEventHandler } = await import("./ui/UiEventHandler"); + const { VerboseEventHandler } = await import("./ui/VerboseEventHandler"); + const chainId = Number( await hre.network.provider.request({ method: "eth_chainId", @@ -174,6 +173,16 @@ task("visualize") }: { quiet: boolean; moduleNameOrPath: string }, hre ) => { + const { IgnitionModuleSerializer } = await import( + "@nomicfoundation/ignition-core" + ); + + const { loadModule } = await import("./load-module"); + const { open } = await import("./utils/open"); + const { writeVisualization } = await import( + "./visualization/write-visualization" + ); + await hre.run("compile", { quiet: true }); const userModule = loadModule( @@ -272,6 +281,12 @@ task("wipe") }: { deployment: string; future: string }, hre ) => { + const { wipe } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const deploymentDir = path.join( hre.config.paths.ignition, "deployments", From 2ffe56de11884c0858d4dc8a5b70eb85bbb180b6 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Sep 2023 19:21:29 -0400 Subject: [PATCH 0963/1302] added basic type validations for js users --- packages/core/src/internal/module-builder.ts | 77 ++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 49f6844407..e81aa16b7f 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -165,6 +165,13 @@ class IgnitionModuleBuilderImplementation< } public getAccount(accountIndex: number): AccountRuntimeValue { + if (typeof accountIndex !== "number") { + this._throwErrorWithStackTrace( + `Account index must be a number, received ${typeof accountIndex}`, + this.getAccount + ); + } + return new AccountRuntimeValueImplementation(accountIndex); } @@ -172,6 +179,13 @@ class IgnitionModuleBuilderImplementation< parameterName: string, defaultValue?: ParamTypeT ): ModuleParameterRuntimeValue { + if (typeof parameterName !== "string") { + this._throwErrorWithStackTrace( + `Parameter name must be a string, received ${typeof parameterName}`, + this.getParameter + ); + } + return new ModuleParameterRuntimeValueImplementation( this._module.id, parameterName, @@ -198,6 +212,13 @@ class IgnitionModuleBuilderImplementation< ): | NamedArtifactContractDeploymentFuture | ContractDeploymentFuture { + if (typeof contractName !== "string") { + this._throwErrorWithStackTrace( + `Contract name must be a string, received ${typeof contractName}`, + this.contract + ); + } + if (artifactOrArgs === undefined || Array.isArray(artifactOrArgs)) { if (Array.isArray(argsorOptions)) { this._throwErrorWithStackTrace( @@ -352,6 +373,13 @@ class IgnitionModuleBuilderImplementation< artifactOrOptions?: Artifact | LibraryOptions, options?: LibraryOptions ) { + if (typeof libraryName !== "string") { + this._throwErrorWithStackTrace( + `Library name must be a string, received ${typeof libraryName}`, + this.library + ); + } + if (isArtifactType(artifactOrOptions)) { return this._libraryFromArtifact(libraryName, artifactOrOptions, options); } @@ -449,6 +477,20 @@ class IgnitionModuleBuilderImplementation< args: ArgumentType[] = [], options: CallOptions = {} ): ContractCallFuture { + if (!Array.isArray(args)) { + this._throwErrorWithStackTrace( + `Invalid parameter "args" provided to call "${functionName}" in module "${this._module.id}"`, + this.call + ); + } + + if (typeof options !== "object") { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to call "${functionName}" in module "${this._module.id}"`, + this.call + ); + } + const futureId = toCallFutureId( this._module.id, options.id, @@ -503,6 +545,20 @@ class IgnitionModuleBuilderImplementation< nameOrIndex: string | number = 0, options: StaticCallOptions = {} ): StaticCallFuture { + if (!Array.isArray(args)) { + this._throwErrorWithStackTrace( + `Invalid parameter "args" provided to staticCall "${functionName}" in module "${this._module.id}"`, + this.staticCall + ); + } + + if (typeof options !== "object") { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to staticCall "${functionName}" in module "${this._module.id}"`, + this.staticCall + ); + } + const futureId = toCallFutureId( this._module.id, options.id, @@ -570,6 +626,13 @@ class IgnitionModuleBuilderImplementation< artifactOrOptions?: Artifact | ContractAtOptions, options?: ContractAtOptions ) { + if (typeof contractName !== "string") { + this._throwErrorWithStackTrace( + `Contract name must be a string, received ${typeof contractName}`, + this.contractAt + ); + } + if (isArtifactType(artifactOrOptions)) { return this._contractAtFromArtifact( contractName, @@ -681,6 +744,13 @@ class IgnitionModuleBuilderImplementation< nameOrIndex: string | number, options: ReadEventArgumentOptions = {} ): ReadEventArgumentFuture { + if (typeof options !== "object") { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to readEventArgument "${eventName}" in module "${this._module.id}"`, + this.readEventArgument + ); + } + const eventIndex = options.eventIndex ?? 0; if ( @@ -742,6 +812,13 @@ class IgnitionModuleBuilderImplementation< data?: string, options: SendDataOptions = {} ): SendDataFuture { + if (typeof options !== "object") { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to send "${id}" in module "${this._module.id}"`, + this.send + ); + } + const futureId = toSendDataFutureId(this._module.id, id); const val = value ?? BigInt(0); From 84fc8a1e971c5ece71966ceda5cc093e1495851c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 24 Sep 2023 20:14:50 -0400 Subject: [PATCH 0964/1302] update plugin errors to use HardhatPluginError --- .../src/hardhat-artifact-resolver.ts | 6 +++++- packages/hardhat-plugin/src/ignition-helper.ts | 5 ++--- packages/hardhat-plugin/src/load-module.ts | 14 +++++++++++--- packages/hardhat-plugin/src/ui/UiEventHandler.tsx | 6 +++++- 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts index 3178437096..2127025310 100644 --- a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts +++ b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts @@ -4,6 +4,7 @@ import { BuildInfo, } from "@nomicfoundation/ignition-core"; import fs from "fs"; +import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; @@ -16,7 +17,10 @@ export class HardhatArtifactResolver implements ArtifactResolver { const artifactPath = await this._resolvePath(contractName); if (artifactPath === undefined) { - throw new Error(`Artifact path not found for ${contractName}`); + throw new HardhatPluginError( + "hardhat-ignition", + `Artifact path not found for ${contractName}` + ); } const debugPath = artifactPath.replace(".json", ".dbg.json"); diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index a9542b9137..7a08621c0d 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -88,8 +88,7 @@ export class IgnitionHelper { if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { const message = errorDeploymentResultToExceptionMessage(result); - // todo: should we implement an IgnitionPluginError to throw here instead? - throw new Error(message); + throw new HardhatPluginError("hardhat-ignition", message); } return this._toEthersContracts(ignitionModule, result); @@ -133,7 +132,7 @@ export class IgnitionHelper { ): Promise { if (!isContractFuture(future)) { throw new HardhatPluginError( - "@nomicfoundation/hardhat-ignition", + "hardhat-ignition", `Expected contract future but got ${future.id} with type ${future.type} instead` ); } diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 9eec8ef51a..8fc190a2dc 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,6 +1,7 @@ import { IgnitionModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import { existsSync, pathExistsSync } from "fs-extra"; +import { HardhatPluginError } from "hardhat/plugins"; import path from "path"; const debug = setupDebug("hardhat-ignition:modules"); @@ -12,7 +13,10 @@ export function loadModule( debug(`Loading user modules from '${modulesDirectory}'`); if (!existsSync(modulesDirectory)) { - throw new Error(`Directory ${modulesDirectory} not found.`); + throw new HardhatPluginError( + "hardhat-ignition", + `Directory ${modulesDirectory} not found.` + ); } const fullpathToModule = resolveFullPathToModule( @@ -21,11 +25,15 @@ export function loadModule( ); if (fullpathToModule === undefined) { - throw new Error(`Could not find module ${moduleNameOrPath}`); + throw new HardhatPluginError( + "hardhat-ignition", + `Could not find module ${moduleNameOrPath}` + ); } if (!isInModuleDirectory(modulesDirectory, fullpathToModule)) { - throw new Error( + throw new HardhatPluginError( + "hardhat-ignition", `The referenced module ${moduleNameOrPath} is outside the module directory ${modulesDirectory}` ); } diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx index 7e38e4b298..d64f32aa2f 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx @@ -33,6 +33,7 @@ import { TransactionSendEvent, WipeApplyEvent, } from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; import { render } from "ink"; import { IgnitionUi } from "./components"; @@ -354,7 +355,10 @@ export class UiEventHandler implements ExecutionEventListener { this._renderState.waitUntilExit === null || this._renderState.clear === null ) { - throw new Error("Cannot unmount with no unmount function"); + throw new HardhatPluginError( + "hardhat-ignition", + "Cannot unmount with no unmount function" + ); } this._renderState.clear(); From af6144f8efdbf5b4d704a1a254b0c15b4a52191d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 24 Sep 2023 20:20:53 -0400 Subject: [PATCH 0965/1302] refactor export of buildModule in plugin for efficiency --- packages/hardhat-plugin/src/index.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index b606754c9e..546cb09e2b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -8,8 +8,15 @@ import path from "path"; import "./type-extensions"; -// eslint-disable-next-line import/no-unused-modules -export { buildModule } from "@nomicfoundation/ignition-core"; +// this is ugly, but it's fast :) +// discussion: https://github.com/NomicFoundation/hardhat-ignition/pull/483 +export const buildModule: typeof import("@nomicfoundation/ignition-core").buildModule = + (...args) => { + const { buildModule: coreBuildModule } = + require("@nomicfoundation/ignition-core") as typeof import("@nomicfoundation/ignition-core"); + + return coreBuildModule(...args); + }; /* ignition config defaults */ const IGNITION_DIR = "ignition"; From a01671569b52b09464fa2ae3d43adaa73cf7ccba Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 24 Sep 2023 21:30:08 -0400 Subject: [PATCH 0966/1302] merge stageOne validation into stageTwo and update stageOne logic for multiple errors flow --- packages/core/src/internal/deployer.ts | 4 +- packages/core/src/internal/execution/abi.ts | 133 +++++++++++++----- .../stageOne/validateArtifactContractAt.ts | 9 -- .../validateArtifactContractDeployment.ts | 19 --- .../validateArtifactLibraryDeployment.ts | 9 -- .../stageOne/validateNamedContractAt.ts | 17 --- .../stageOne/validateNamedContractCall.ts | 34 ----- .../validateNamedContractDeployment.ts | 27 ---- .../validateNamedLibraryDeployment.ts | 20 --- .../stageOne/validateNamedStaticCall.ts | 39 ----- .../stageOne/validateReadEventArgument.ts | 27 ---- .../validation/stageOne/validateSendData.ts | 9 -- .../stageTwo/validateArtifactContractAt.ts | 2 + .../validateArtifactContractDeployment.ts | 18 +++ .../validateArtifactLibraryDeployment.ts | 2 + .../stageTwo/validateNamedContractAt.ts | 17 ++- .../stageTwo/validateNamedContractCall.ts | 29 +++- .../validateNamedContractDeployment.ts | 27 +++- .../validateNamedLibraryDeployment.ts | 19 ++- .../stageTwo/validateNamedStaticCall.ts | 41 +++++- .../stageTwo/validateReadEventArgument.ts | 31 +++- .../validation/stageTwo/validateSendData.ts | 2 + .../{validateStageTwo.ts => validate.ts} | 2 +- .../internal/validation/validateStageOne.ts | 86 ----------- packages/core/test/useModule.ts | 6 +- 25 files changed, 285 insertions(+), 344 deletions(-) delete mode 100644 packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts delete mode 100644 packages/core/src/internal/validation/stageOne/validateSendData.ts rename packages/core/src/internal/validation/{validateStageTwo.ts => validate.ts} (98%) delete mode 100644 packages/core/src/internal/validation/validateStageOne.ts diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 3b3d0a8d85..ba3540b424 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -42,7 +42,7 @@ import { formatExecutionError } from "./formatters"; import { Reconciler } from "./reconciliation/reconciler"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; -import { validateStageTwo } from "./validation/validateStageTwo"; +import { validate } from "./validation/validate"; /** * Run an Igntition deployment. @@ -78,7 +78,7 @@ export class Deployer { accounts: string[], defaultSender: string ): Promise> { - const validationResult = await validateStageTwo( + const validationResult = await validate( ignitionModule, this._artifactResolver, deploymentParameters, diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index 9bdf9d8667..d8e678ecfe 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -153,7 +153,9 @@ export function validateContractConstructorArgsLength( artifact: Artifact, contractName: string, args: ArgumentType[] -): void { +): string[] { + const errors: string[] = []; + const argsLength = args.length; const { ethers } = require("ethers") as typeof import("ethers"); @@ -161,10 +163,12 @@ export function validateContractConstructorArgsLength( const expectedArgsLength = iface.deploy.inputs.length; if (argsLength !== expectedArgsLength) { - throw new IgnitionValidationError( - `The constructor of the contract '${contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` + errors.push( + `Contract ${contractName} expects ${expectedArgsLength} constructor arguments but ${argsLength} were given` ); } + + return errors; } /** @@ -185,8 +189,19 @@ export function validateArtifactFunction( functionName: string, args: ArgumentType[], isStaticCall: boolean -) { - validateOverloadedName(artifact, functionName, false); +): string[] { + try { + validateOverloadedName(artifact, functionName, false); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "validateOverloadedName should only throw IgnitionValidationErrors" + ); + + return [e.message]; + } + + const errors: string[] = []; const { ethers } = require("ethers") as typeof import("ethers"); const iface = new ethers.Interface(artifact.abi); @@ -194,17 +209,19 @@ export function validateArtifactFunction( // Check that the number of arguments is correct if (fragment.inputs.length !== args.length) { - throw new IgnitionValidationError( + errors.push( `Function ${functionName} in contract ${contractName} expects ${fragment.inputs.length} arguments but ${args.length} were given` ); } // Check that the function is pure or view, which is required for a static call if (isStaticCall && !fragment.constant) { - throw new IgnitionValidationError( + errors.push( `Function ${functionName} in contract ${contractName} is not 'pure' or 'view' and cannot be statically called` ); } + + return errors; } /** @@ -218,8 +235,19 @@ export function validateArtifactFunction( export function validateArtifactFunctionName( artifact: Artifact, functionName: string -) { - validateOverloadedName(artifact, functionName, false); +): string[] { + try { + validateOverloadedName(artifact, functionName, false); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "validateOverloadedName should only throw IgnitionValidationErrors" + ); + + return [e.message]; + } + + return []; } /** @@ -234,30 +262,62 @@ export function validateArtifactEventArgumentParams( emitterArtifact: Artifact, eventName: string, argument: string | number -) { - validateOverloadedName(emitterArtifact, eventName, true); +): string[] { + try { + validateOverloadedName(emitterArtifact, eventName, false); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "validateOverloadedName should only throw IgnitionValidationErrors" + ); + + return [e.message]; + } + const { ethers } = require("ethers") as typeof import("ethers"); const iface = new ethers.Interface(emitterArtifact.abi); - const eventFragment = getEventFragment(iface, eventName); + let eventFragment: EventFragment; + try { + eventFragment = getEventFragment(iface, eventName); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "getEventFragment should only throw IgnitionValidationErrors" + ); - const paramType = getEventArgumentParamType( - emitterArtifact.contractName, - eventName, - eventFragment, - argument - ); + return [e.message]; + } + + let paramType: ParamType; + try { + paramType = getEventArgumentParamType( + emitterArtifact.contractName, + eventName, + eventFragment, + argument + ); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "getEventArgumentParamType should only throw IgnitionValidationErrors" + ); + + return [e.message]; + } if (paramType.indexed === true) { // We can't access the value of indexed arguments with dynamic size // as their hash is stored in a topic, and its actual value isn't stored // anywhere if (hasDynamicSize(paramType)) { - throw new IgnitionValidationError( - `Indexed argument ${argument} of event ${eventName} of contract ${emitterArtifact.contractName} is not stored in the receipt, but its hash is, so you can't read it.` - ); + return [ + `Indexed argument ${argument} of event ${eventName} of contract ${emitterArtifact.contractName} is not stored in the receipt, but its hash is, so you can't read it.`, + ]; } } + + return []; } /** @@ -592,7 +652,7 @@ function validateOverloadedName( artifact: Artifact, name: string, isEvent: boolean -) { +): void { const eventOrFunction = isEvent ? "event" : "function"; const eventOrFunctionCapitalized = isEvent ? "Event" : "Function"; @@ -632,8 +692,6 @@ function validateOverloadedName( `${eventOrFunctionCapitalized} name "${name}" used for contract ${artifact.contractName}, but it's not overloaded. Use "${bareName}" instead.` ); } - - return; } const normalizedNames = fragments.map((f) => { @@ -705,10 +763,19 @@ export function validateFunctionArgumentParamType( functionName: string, artifact: Artifact, argument: string | number -): void { +): string[] { const { ethers } = require("ethers") as typeof import("ethers"); const iface = new ethers.Interface(artifact.abi); - const functionFragment = getFunctionFragment(iface, functionName); + let functionFragment: FunctionFragment; + try { + functionFragment = getFunctionFragment(iface, functionName); + } catch (e) { + assertIgnitionInvariant( + e instanceof IgnitionValidationError, + "getFunctionFragment should only throw IgnitionValidationErrors" + ); + return [e.message]; + } if (typeof argument === "string") { let hasArg = false; @@ -719,19 +786,21 @@ export function validateFunctionArgumentParamType( } if (!hasArg) { - throw new IgnitionValidationError( - `Function ${functionName} of contract ${contractName} has no return value named ${argument}` - ); + return [ + `Function ${functionName} of contract ${contractName} has no return value named ${argument}`, + ]; } } else { const paramType = functionFragment.outputs[argument]; if (paramType === undefined) { - throw new IgnitionValidationError( - `Function ${functionName} of contract ${contractName} has only ${functionFragment.outputs.length} return values, but value ${argument} was requested` - ); + return [ + `Function ${functionName} of contract ${contractName} has only ${functionFragment.outputs.length} return values, but value ${argument} was requested`, + ]; } } + + return []; } /** diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts deleted file mode 100644 index 56917f6540..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateArtifactContractAt.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ArtifactResolver } from "../../../types/artifact"; -import { ContractAtFuture } from "../../../types/module"; - -export async function validateArtifactContractAt( - _future: ContractAtFuture, - _artifactLoader: ArtifactResolver -) { - return; // no-op -} diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts deleted file mode 100644 index f98fd9a1f0..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateArtifactContractDeployment.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { ArtifactResolver } from "../../../types/artifact"; -import { ContractDeploymentFuture } from "../../../types/module"; -import { validateContractConstructorArgsLength } from "../../execution/abi"; -import { validateLibraryNames } from "../../execution/libraries"; - -export async function validateArtifactContractDeployment( - future: ContractDeploymentFuture, - _artifactLoader: ArtifactResolver -) { - const artifact = future.artifact; - - validateLibraryNames(artifact, Object.keys(future.libraries)); - - validateContractConstructorArgsLength( - artifact, - future.contractName, - future.constructorArgs - ); -} diff --git a/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts deleted file mode 100644 index 54ae6b9f88..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateArtifactLibraryDeployment.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ArtifactResolver } from "../../../types/artifact"; -import { LibraryDeploymentFuture } from "../../../types/module"; - -export async function validateArtifactLibraryDeployment( - _future: LibraryDeploymentFuture, - _artifactLoader: ArtifactResolver -) { - return; // no-op -} diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts deleted file mode 100644 index 48c3a4eee3..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractAt.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { NamedArtifactContractAtFuture } from "../../../types/module"; - -export async function validateNamedContractAt( - future: NamedArtifactContractAtFuture, - artifactLoader: ArtifactResolver -) { - const artifact = await artifactLoader.loadArtifact(future.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); - } -} diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts deleted file mode 100644 index c5212e7ddd..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractCall.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { ContractCallFuture } from "../../../types/module"; -import { - validateArtifactFunction, - validateArtifactFunctionName, -} from "../../execution/abi"; - -export async function validateNamedContractCall( - future: ContractCallFuture, - artifactLoader: ArtifactResolver -) { - const artifact = - "artifact" in future.contract - ? future.contract.artifact - : await artifactLoader.loadArtifact(future.contract.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contract.contractName}' is invalid` - ); - } - - validateArtifactFunctionName(artifact, future.functionName); - - validateArtifactFunction( - artifact, - future.contract.contractName, - future.functionName, - future.args, - false - ); -} diff --git a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts deleted file mode 100644 index edf99355d0..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateNamedContractDeployment.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; -import { validateContractConstructorArgsLength } from "../../execution/abi"; -import { validateLibraryNames } from "../../execution/libraries"; - -export async function validateNamedContractDeployment( - future: NamedArtifactContractDeploymentFuture, - artifactLoader: ArtifactResolver -) { - const artifact = await artifactLoader.loadArtifact(future.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); - } - - validateLibraryNames(artifact, Object.keys(future.libraries)); - - validateContractConstructorArgsLength( - artifact, - future.contractName, - future.constructorArgs - ); -} diff --git a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts deleted file mode 100644 index 1025bc98d9..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateNamedLibraryDeployment.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; -import { validateLibraryNames } from "../../execution/libraries"; - -export async function validateNamedLibraryDeployment( - future: NamedArtifactLibraryDeploymentFuture, - artifactLoader: ArtifactResolver -) { - const artifact = await artifactLoader.loadArtifact(future.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contractName}' is invalid` - ); - } - - validateLibraryNames(artifact, Object.keys(future.libraries)); -} diff --git a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts deleted file mode 100644 index dec782b6a8..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateNamedStaticCall.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { StaticCallFuture } from "../../../types/module"; -import { - validateArtifactFunction, - validateFunctionArgumentParamType, -} from "../../execution/abi"; - -export async function validateNamedStaticCall( - future: StaticCallFuture, - artifactLoader: ArtifactResolver -) { - const artifact = - "artifact" in future.contract - ? future.contract.artifact - : await artifactLoader.loadArtifact(future.contract.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.contract.contractName}' is invalid` - ); - } - - validateArtifactFunction( - artifact, - future.contract.contractName, - future.functionName, - future.args, - true - ); - - validateFunctionArgumentParamType( - future.contract.contractName, - future.functionName, - artifact, - future.nameOrIndex - ); -} diff --git a/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts b/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts deleted file mode 100644 index f537a3844d..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateReadEventArgument.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { IgnitionValidationError } from "../../../errors"; -import { isArtifactType } from "../../../type-guards"; -import { ArtifactResolver } from "../../../types/artifact"; -import { ReadEventArgumentFuture } from "../../../types/module"; -import { validateArtifactEventArgumentParams } from "../../execution/abi"; - -export async function validateReadEventArgument( - future: ReadEventArgumentFuture, - artifactLoader: ArtifactResolver -) { - const artifact = - "artifact" in future.emitter - ? future.emitter.artifact - : await artifactLoader.loadArtifact(future.emitter.contractName); - - if (!isArtifactType(artifact)) { - throw new IgnitionValidationError( - `Artifact for contract '${future.emitter.contractName}' is invalid` - ); - } - - validateArtifactEventArgumentParams( - artifact, - future.eventName, - future.nameOrIndex - ); -} diff --git a/packages/core/src/internal/validation/stageOne/validateSendData.ts b/packages/core/src/internal/validation/stageOne/validateSendData.ts deleted file mode 100644 index f3e10bb8b4..0000000000 --- a/packages/core/src/internal/validation/stageOne/validateSendData.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ArtifactResolver } from "../../../types/artifact"; -import { SendDataFuture } from "../../../types/module"; - -export async function validateSendData( - _future: SendDataFuture, - _artifactLoader: ArtifactResolver -) { - return; // no-op -} diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts index 91697fef37..5938998de5 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts @@ -11,6 +11,8 @@ export async function validateArtifactContractAt( ): Promise { const errors: string[] = []; + /* stage two */ + if (isModuleParameterRuntimeValue(future.address)) { const param = deploymentParameters[future.address.moduleId]?.[future.address.name] ?? diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts index 375b662a8c..19316fe380 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts @@ -5,6 +5,8 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractDeploymentFuture } from "../../../types/module"; +import { validateContractConstructorArgsLength } from "../../execution/abi"; +import { validateLibraryNames } from "../../execution/libraries"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, @@ -18,6 +20,22 @@ export async function validateArtifactContractDeployment( ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = future.artifact; + + errors.push(...validateLibraryNames(artifact, Object.keys(future.libraries))); + + errors.push( + ...validateContractConstructorArgsLength( + artifact, + future.contractName, + future.constructorArgs + ) + ); + + /* stage two */ + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts index 1378112014..a3a8909565 100644 --- a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts @@ -13,6 +13,8 @@ export async function validateArtifactLibraryDeployment( ): Promise { const errors: string[] = []; + /* stage two */ + if (isAccountRuntimeValue(future.from)) { errors.push(...validateAccountRuntimeValue(future.from, accounts)); } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts index 5b2aa4dc42..509b35b98a 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts @@ -1,16 +1,29 @@ -import { isModuleParameterRuntimeValue } from "../../../type-guards"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactContractAtFuture } from "../../../types/module"; export async function validateNamedContractAt( future: NamedArtifactContractAtFuture, - _artifactLoader: ArtifactResolver, + artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, _accounts: string[] ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = await artifactLoader.loadArtifact(future.contractName); + + if (!isArtifactType(artifact)) { + errors.push(`Artifact for contract '${future.contractName}' is invalid`); + } + + /* stage two */ + if (isModuleParameterRuntimeValue(future.address)) { const param = deploymentParameters[future.address.moduleId]?.[future.address.name] ?? diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts index 26b94790bf..51f9be3dba 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts @@ -1,10 +1,12 @@ import { isAccountRuntimeValue, + isArtifactType, isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractCallFuture } from "../../../types/module"; +import { validateArtifactFunction } from "../../execution/abi"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, @@ -12,12 +14,37 @@ import { export async function validateNamedContractCall( future: ContractCallFuture, - _artifactLoader: ArtifactResolver, + artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = + "artifact" in future.contract + ? future.contract.artifact + : await artifactLoader.loadArtifact(future.contract.contractName); + + if (!isArtifactType(artifact)) { + errors.push( + `Artifact for contract '${future.contract.contractName}' is invalid` + ); + } else { + errors.push( + ...validateArtifactFunction( + artifact, + future.contract.contractName, + future.functionName, + future.args, + false + ) + ); + } + + /* stage two */ + const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts index 05c3a4e3fc..081f28e2b2 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts @@ -1,10 +1,13 @@ import { isAccountRuntimeValue, + isArtifactType, isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; +import { validateContractConstructorArgsLength } from "../../execution/abi"; +import { validateLibraryNames } from "../../execution/libraries"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, @@ -12,12 +15,34 @@ import { export async function validateNamedContractDeployment( future: NamedArtifactContractDeploymentFuture, - _artifactLoader: ArtifactResolver, + artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = await artifactLoader.loadArtifact(future.contractName); + + if (!isArtifactType(artifact)) { + errors.push(`Artifact for contract '${future.contractName}' is invalid`); + } else { + errors.push( + ...validateLibraryNames(artifact, Object.keys(future.libraries)) + ); + + errors.push( + ...validateContractConstructorArgsLength( + artifact, + future.contractName, + future.constructorArgs + ) + ); + } + + /* stage two */ + const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts index 29a318bcce..2faa3257c9 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts @@ -1,17 +1,32 @@ -import { isAccountRuntimeValue } from "../../../type-guards"; +import { isAccountRuntimeValue, isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { validateLibraryNames } from "../../execution/libraries"; import { validateAccountRuntimeValue } from "../utils"; export async function validateNamedLibraryDeployment( future: NamedArtifactLibraryDeploymentFuture, - _artifactLoader: ArtifactResolver, + artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, accounts: string[] ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = await artifactLoader.loadArtifact(future.contractName); + + if (!isArtifactType(artifact)) { + errors.push(`Artifact for contract '${future.contractName}' is invalid`); + } else { + errors.push( + ...validateLibraryNames(artifact, Object.keys(future.libraries)) + ); + } + + /* stage two */ + if (isAccountRuntimeValue(future.from)) { errors.push(...validateAccountRuntimeValue(future.from, accounts)); } diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts index 99c557b6ea..f52f4b3d99 100644 --- a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts @@ -1,10 +1,15 @@ import { isAccountRuntimeValue, + isArtifactType, isModuleParameterRuntimeValue, } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { StaticCallFuture } from "../../../types/module"; +import { + validateArtifactFunction, + validateFunctionArgumentParamType, +} from "../../execution/abi"; import { retrieveNestedRuntimeValues, validateAccountRuntimeValue, @@ -12,12 +17,46 @@ import { export async function validateNamedStaticCall( future: StaticCallFuture, - _artifactLoader: ArtifactResolver, + artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, accounts: string[] ): Promise { const errors: string[] = []; + /* stage one */ + + const artifact = + "artifact" in future.contract + ? future.contract.artifact + : await artifactLoader.loadArtifact(future.contract.contractName); + + if (!isArtifactType(artifact)) { + errors.push( + `Artifact for contract '${future.contract.contractName}' is invalid` + ); + } else { + errors.push( + ...validateArtifactFunction( + artifact, + future.contract.contractName, + future.functionName, + future.args, + true + ) + ); + + errors.push( + ...validateFunctionArgumentParamType( + future.contract.contractName, + future.functionName, + artifact, + future.nameOrIndex + ) + ); + } + + /* stage two */ + const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ diff --git a/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts b/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts index 9b8065d59b..622d64d9fd 100644 --- a/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts +++ b/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts @@ -1,12 +1,37 @@ +import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ReadEventArgumentFuture } from "../../../types/module"; +import { validateArtifactEventArgumentParams } from "../../execution/abi"; export async function validateReadEventArgument( - _future: ReadEventArgumentFuture, - _artifactLoader: ArtifactResolver, + future: ReadEventArgumentFuture, + artifactLoader: ArtifactResolver, _deploymentParameters: DeploymentParameters, _accounts: string[] ): Promise { - return []; // no-op + const errors: string[] = []; + + /* stage one */ + + const artifact = + "artifact" in future.emitter + ? future.emitter.artifact + : await artifactLoader.loadArtifact(future.emitter.contractName); + + if (!isArtifactType(artifact)) { + errors.push( + `Artifact for contract '${future.emitter.contractName}' is invalid` + ); + } else { + errors.push( + ...validateArtifactEventArgumentParams( + artifact, + future.eventName, + future.nameOrIndex + ) + ); + } + + return errors; } diff --git a/packages/core/src/internal/validation/stageTwo/validateSendData.ts b/packages/core/src/internal/validation/stageTwo/validateSendData.ts index 66bcc0bb8a..b5524fa25d 100644 --- a/packages/core/src/internal/validation/stageTwo/validateSendData.ts +++ b/packages/core/src/internal/validation/stageTwo/validateSendData.ts @@ -15,6 +15,8 @@ export async function validateSendData( ): Promise { const errors: string[] = []; + /* stage two */ + const accountParams = [ ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ...(isAccountRuntimeValue(future.to) ? [future.to] : []), diff --git a/packages/core/src/internal/validation/validateStageTwo.ts b/packages/core/src/internal/validation/validate.ts similarity index 98% rename from packages/core/src/internal/validation/validateStageTwo.ts rename to packages/core/src/internal/validation/validate.ts index 277d8afdff..d77a5adfd7 100644 --- a/packages/core/src/internal/validation/validateStageTwo.ts +++ b/packages/core/src/internal/validation/validate.ts @@ -18,7 +18,7 @@ import { validateNamedStaticCall } from "./stageTwo/validateNamedStaticCall"; import { validateReadEventArgument } from "./stageTwo/validateReadEventArgument"; import { validateSendData } from "./stageTwo/validateSendData"; -export async function validateStageTwo( +export async function validate( module: IgnitionModule, artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, diff --git a/packages/core/src/internal/validation/validateStageOne.ts b/packages/core/src/internal/validation/validateStageOne.ts deleted file mode 100644 index 6c648c80a6..0000000000 --- a/packages/core/src/internal/validation/validateStageOne.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { IgnitionValidationError } from "../../errors"; -import { ArtifactResolver } from "../../types/artifact"; -import { - DeploymentResultType, - ValidationErrorDeploymentResult, -} from "../../types/deploy"; -import { Future, FutureType, IgnitionModule } from "../../types/module"; -import { assertIgnitionInvariant } from "../utils/assertions"; -import { getFuturesFromModule } from "../utils/get-futures-from-module"; - -import { validateArtifactContractAt } from "./stageOne/validateArtifactContractAt"; -import { validateArtifactContractDeployment } from "./stageOne/validateArtifactContractDeployment"; -import { validateArtifactLibraryDeployment } from "./stageOne/validateArtifactLibraryDeployment"; -import { validateNamedContractAt } from "./stageOne/validateNamedContractAt"; -import { validateNamedContractCall } from "./stageOne/validateNamedContractCall"; -import { validateNamedContractDeployment } from "./stageOne/validateNamedContractDeployment"; -import { validateNamedLibraryDeployment } from "./stageOne/validateNamedLibraryDeployment"; -import { validateNamedStaticCall } from "./stageOne/validateNamedStaticCall"; -import { validateReadEventArgument } from "./stageOne/validateReadEventArgument"; -import { validateSendData } from "./stageOne/validateSendData"; - -export async function validateStageOne( - module: IgnitionModule, - artifactLoader: ArtifactResolver -): Promise { - const futures = getFuturesFromModule(module); - - for (const future of futures) { - try { - await _validateFuture(future, artifactLoader); - } catch (err) { - assertIgnitionInvariant( - err instanceof IgnitionValidationError, - `Expected an IgnitionValidationError when validating the future ${future.id}` - ); - - return { - type: DeploymentResultType.VALIDATION_ERROR, - errors: { - [future.id]: [err.message], - }, - }; - } - } - - // No validation errors - return null; -} - -async function _validateFuture( - future: Future, - artifactLoader: ArtifactResolver -): Promise { - switch (future.type) { - case FutureType.CONTRACT_DEPLOYMENT: - await validateArtifactContractDeployment(future, artifactLoader); - break; - case FutureType.LIBRARY_DEPLOYMENT: - await validateArtifactLibraryDeployment(future, artifactLoader); - break; - case FutureType.CONTRACT_AT: - await validateArtifactContractAt(future, artifactLoader); - break; - case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: - await validateNamedContractDeployment(future, artifactLoader); - break; - case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: - await validateNamedLibraryDeployment(future, artifactLoader); - break; - case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - await validateNamedContractAt(future, artifactLoader); - break; - case FutureType.CONTRACT_CALL: - await validateNamedContractCall(future, artifactLoader); - break; - case FutureType.STATIC_CALL: - await validateNamedStaticCall(future, artifactLoader); - break; - case FutureType.READ_EVENT_ARGUMENT: - await validateReadEventArgument(future, artifactLoader); - break; - case FutureType.SEND_DATA: - await validateSendData(future, artifactLoader); - break; - } -} diff --git a/packages/core/test/useModule.ts b/packages/core/test/useModule.ts index 5b57757f02..41997d2923 100644 --- a/packages/core/test/useModule.ts +++ b/packages/core/test/useModule.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { Artifact, DeploymentResultType } from "../src"; import { buildModule } from "../src/build-module"; -import { validateStageTwo } from "../src/internal/validation/validateStageTwo"; +import { validate } from "../src/internal/validation/validate"; import { setupMockArtifactResolver } from "./helpers"; @@ -130,7 +130,7 @@ describe("useModule", () => { }; await assert.isFulfilled( - validateStageTwo( + validate( moduleWithSubmodule, setupMockArtifactResolver({ Contract1: fakeArtifact, @@ -197,7 +197,7 @@ describe("useModule", () => { }, }; - const result = await validateStageTwo( + const result = await validate( moduleWithSubmodule, setupMockArtifactResolver({ Contract1: fakeArtifact, From 2b31a92b726b017ca6ba06a9536825354de2bcfb Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 24 Sep 2023 21:31:27 -0400 Subject: [PATCH 0967/1302] rename stageTwo folder to futures --- .../validateArtifactContractAt.ts | 0 .../validateArtifactContractDeployment.ts | 0 .../validateArtifactLibraryDeployment.ts | 0 .../validateNamedContractAt.ts | 0 .../validateNamedContractCall.ts | 0 .../validateNamedContractDeployment.ts | 0 .../validateNamedLibraryDeployment.ts | 0 .../validateNamedStaticCall.ts | 0 .../validateReadEventArgument.ts | 0 .../{stageTwo => futures}/validateSendData.ts | 0 .../core/src/internal/validation/validate.ts | 20 +++++++++---------- packages/core/test/call.ts | 4 ++-- packages/core/test/contract.ts | 4 ++-- packages/core/test/contractAt.ts | 4 ++-- packages/core/test/contractAtFromArtifact.ts | 4 ++-- packages/core/test/contractFromArtifact.ts | 4 ++-- packages/core/test/library.ts | 4 ++-- packages/core/test/libraryFromArtifact.ts | 4 ++-- packages/core/test/send.ts | 4 ++-- packages/core/test/staticCall.ts | 4 ++-- 20 files changed, 28 insertions(+), 28 deletions(-) rename packages/core/src/internal/validation/{stageTwo => futures}/validateArtifactContractAt.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateArtifactContractDeployment.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateArtifactLibraryDeployment.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateNamedContractAt.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateNamedContractCall.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateNamedContractDeployment.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateNamedLibraryDeployment.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateNamedStaticCall.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateReadEventArgument.ts (100%) rename packages/core/src/internal/validation/{stageTwo => futures}/validateSendData.ts (100%) diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateArtifactContractAt.ts rename to packages/core/src/internal/validation/futures/validateArtifactContractAt.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateArtifactContractDeployment.ts rename to packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateArtifactLibraryDeployment.ts rename to packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateNamedContractAt.ts rename to packages/core/src/internal/validation/futures/validateNamedContractAt.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateNamedContractCall.ts rename to packages/core/src/internal/validation/futures/validateNamedContractCall.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateNamedContractDeployment.ts rename to packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateNamedLibraryDeployment.ts rename to packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateNamedStaticCall.ts rename to packages/core/src/internal/validation/futures/validateNamedStaticCall.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts b/packages/core/src/internal/validation/futures/validateReadEventArgument.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateReadEventArgument.ts rename to packages/core/src/internal/validation/futures/validateReadEventArgument.ts diff --git a/packages/core/src/internal/validation/stageTwo/validateSendData.ts b/packages/core/src/internal/validation/futures/validateSendData.ts similarity index 100% rename from packages/core/src/internal/validation/stageTwo/validateSendData.ts rename to packages/core/src/internal/validation/futures/validateSendData.ts diff --git a/packages/core/src/internal/validation/validate.ts b/packages/core/src/internal/validation/validate.ts index d77a5adfd7..87341ec636 100644 --- a/packages/core/src/internal/validation/validate.ts +++ b/packages/core/src/internal/validation/validate.ts @@ -7,16 +7,16 @@ import { import { Future, FutureType, IgnitionModule } from "../../types/module"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; -import { validateArtifactContractAt } from "./stageTwo/validateArtifactContractAt"; -import { validateArtifactContractDeployment } from "./stageTwo/validateArtifactContractDeployment"; -import { validateArtifactLibraryDeployment } from "./stageTwo/validateArtifactLibraryDeployment"; -import { validateNamedContractAt } from "./stageTwo/validateNamedContractAt"; -import { validateNamedContractCall } from "./stageTwo/validateNamedContractCall"; -import { validateNamedContractDeployment } from "./stageTwo/validateNamedContractDeployment"; -import { validateNamedLibraryDeployment } from "./stageTwo/validateNamedLibraryDeployment"; -import { validateNamedStaticCall } from "./stageTwo/validateNamedStaticCall"; -import { validateReadEventArgument } from "./stageTwo/validateReadEventArgument"; -import { validateSendData } from "./stageTwo/validateSendData"; +import { validateArtifactContractAt } from "./futures/validateArtifactContractAt"; +import { validateArtifactContractDeployment } from "./futures/validateArtifactContractDeployment"; +import { validateArtifactLibraryDeployment } from "./futures/validateArtifactLibraryDeployment"; +import { validateNamedContractAt } from "./futures/validateNamedContractAt"; +import { validateNamedContractCall } from "./futures/validateNamedContractCall"; +import { validateNamedContractDeployment } from "./futures/validateNamedContractDeployment"; +import { validateNamedLibraryDeployment } from "./futures/validateNamedLibraryDeployment"; +import { validateNamedStaticCall } from "./futures/validateNamedStaticCall"; +import { validateReadEventArgument } from "./futures/validateReadEventArgument"; +import { validateSendData } from "./futures/validateSendData"; export async function validate( module: IgnitionModule, diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index d4d0e3a622..d2d3e1e76a 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -636,12 +636,12 @@ describe("call", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateNamedContractCall"); + let vm: typeof import("../src/internal/validation/futures/validateNamedContractCall"); let validateNamedContractCall: typeof vm.validateNamedContractCall; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateNamedContractCall" + "../src/internal/validation/futures/validateNamedContractCall" ); validateNamedContractCall = vm.validateNamedContractCall; diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 691f86f619..2cb1839753 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -510,12 +510,12 @@ describe("contract", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateNamedContractDeployment"); + let vm: typeof import("../src/internal/validation/futures/validateNamedContractDeployment"); let validateNamedContractDeployment: typeof vm.validateNamedContractDeployment; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateNamedContractDeployment" + "../src/internal/validation/futures/validateNamedContractDeployment" ); validateNamedContractDeployment = vm.validateNamedContractDeployment; diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 508fb334aa..deb3f0d426 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -237,12 +237,12 @@ describe("contractAt", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateNamedContractAt"); + let vm: typeof import("../src/internal/validation/futures/validateNamedContractAt"); let validateNamedContractAt: typeof vm.validateNamedContractAt; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateNamedContractAt" + "../src/internal/validation/futures/validateNamedContractAt" ); validateNamedContractAt = vm.validateNamedContractAt; diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index b02be03b21..f6a8c21221 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -216,12 +216,12 @@ describe("contractAtFromArtifact", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateArtifactContractAt"); + let vm: typeof import("../src/internal/validation/futures/validateArtifactContractAt"); let validateArtifactContractAt: typeof vm.validateArtifactContractAt; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateArtifactContractAt" + "../src/internal/validation/futures/validateArtifactContractAt" ); validateArtifactContractAt = vm.validateArtifactContractAt; diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 26baeececb..8c527bff7b 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -512,12 +512,12 @@ describe("contractFromArtifact", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateArtifactContractDeployment"); + let vm: typeof import("../src/internal/validation/futures/validateArtifactContractDeployment"); let validateArtifactContractDeployment: typeof vm.validateArtifactContractDeployment; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateArtifactContractDeployment" + "../src/internal/validation/futures/validateArtifactContractDeployment" ); validateArtifactContractDeployment = diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index e6f05f81f8..373f57c7b7 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -264,12 +264,12 @@ describe("library", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateNamedLibraryDeployment"); + let vm: typeof import("../src/internal/validation/futures/validateNamedLibraryDeployment"); let validateNamedLibraryDeployment: typeof vm.validateNamedLibraryDeployment; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateNamedLibraryDeployment" + "../src/internal/validation/futures/validateNamedLibraryDeployment" ); validateNamedLibraryDeployment = vm.validateNamedLibraryDeployment; diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 54973fc67e..fff61c6ad2 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -232,12 +232,12 @@ describe("libraryFromArtifact", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateArtifactLibraryDeployment"); + let vm: typeof import("../src/internal/validation/futures/validateArtifactLibraryDeployment"); let validateArtifactLibraryDeployment: typeof vm.validateArtifactLibraryDeployment; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateArtifactLibraryDeployment" + "../src/internal/validation/futures/validateArtifactLibraryDeployment" ); validateArtifactLibraryDeployment = diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index c1a20b40dd..00a723b3e5 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -314,12 +314,12 @@ describe("send", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateSendData"); + let vm: typeof import("../src/internal/validation/futures/validateSendData"); let validateSendData: typeof vm.validateSendData; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateSendData" + "../src/internal/validation/futures/validateSendData" ); validateSendData = vm.validateSendData; diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 52dc2e66c8..85d76bfbda 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -768,12 +768,12 @@ describe("static call", () => { }); describe("stage two", () => { - let vm: typeof import("../src/internal/validation/stageTwo/validateNamedStaticCall"); + let vm: typeof import("../src/internal/validation/futures/validateNamedStaticCall"); let validateNamedStaticCall: typeof vm.validateNamedStaticCall; before(async () => { vm = await import( - "../src/internal/validation/stageTwo/validateNamedStaticCall" + "../src/internal/validation/futures/validateNamedStaticCall" ); validateNamedStaticCall = vm.validateNamedStaticCall; From 3a5ce6bfe73d56601b74e28cb5e3e0f769e638a5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 24 Sep 2023 22:43:18 -0400 Subject: [PATCH 0968/1302] update tests --- packages/core/src/deploy.ts | 8 +- packages/core/src/internal/deployer.ts | 14 - packages/core/src/internal/execution/abi.ts | 68 +- packages/core/test/call.ts | 864 ++++++++-------- packages/core/test/contract.ts | 603 ++++++------ packages/core/test/contractAt.ts | 173 ++-- packages/core/test/contractAtFromArtifact.ts | 130 ++- packages/core/test/contractFromArtifact.ts | 491 +++++----- packages/core/test/execution/abi.ts | 139 +-- packages/core/test/library.ts | 121 +-- packages/core/test/libraryFromArtifact.ts | 91 +- packages/core/test/readEventArgument.ts | 91 +- packages/core/test/send.ts | 208 ++-- packages/core/test/staticCall.ts | 977 ++++++++++--------- 14 files changed, 1930 insertions(+), 2048 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index da4509e26a..9eb3b173bd 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -10,7 +10,7 @@ import { BasicExecutionStrategy } from "./internal/execution/basic-execution-str import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; import { checkAutominedNetwork } from "./internal/utils/check-automined-network"; -import { validateStageOne } from "./internal/validation/validateStageOne"; +import { validate } from "./internal/validation/validate"; import { ArtifactResolver } from "./types/artifact"; import { DeployConfig, @@ -65,9 +65,11 @@ export async function deploy< }); } - const validationResult = await validateStageOne( + const validationResult = await validate( ignitionModule, - artifactResolver + artifactResolver, + deploymentParameters, + accounts ); if (validationResult !== null) { diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index ba3540b424..b972239295 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -42,7 +42,6 @@ import { formatExecutionError } from "./formatters"; import { Reconciler } from "./reconciliation/reconciler"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; -import { validate } from "./validation/validate"; /** * Run an Igntition deployment. @@ -78,19 +77,6 @@ export class Deployer { accounts: string[], defaultSender: string ): Promise> { - const validationResult = await validate( - ignitionModule, - this._artifactResolver, - deploymentParameters, - accounts - ); - - if (validationResult !== null) { - this._emitDeploymentCompleteEvent(validationResult); - - return validationResult; - } - let deploymentState = await this._getOrInitializeDeploymentState( ignitionModule.id ); diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index d8e678ecfe..f3692245d5 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -8,6 +8,7 @@ import type { } from "ethers"; import { + IgnitionError, IgnitionValidationError, UnsupportedOperationError, } from "../../errors"; @@ -72,7 +73,11 @@ export function encodeArtifactFunctionCall( functionName: string, args: SolidityParameterType[] ): string { - validateArtifactFunctionName(artifact, functionName); + const validationErrors = validateArtifactFunctionName(artifact, functionName); + + if (validationErrors.length > 0) { + throw new IgnitionValidationError(validationErrors[0]); + } const { ethers } = require("ethers") as typeof import("ethers"); const iface = new ethers.Interface(artifact.abi); @@ -123,7 +128,11 @@ export function decodeArtifactFunctionCallResult( functionName: string, returnData: string ): InvalidResultError | SuccessfulEvmExecutionResult { - validateArtifactFunctionName(artifact, functionName); + const validationErrors = validateArtifactFunctionName(artifact, functionName); + + if (validationErrors.length > 0) { + throw new IgnitionValidationError(validationErrors[0]); + } const { ethers } = require("ethers") as typeof import("ethers"); const iface = ethers.Interface.from(artifact.abi); @@ -164,7 +173,7 @@ export function validateContractConstructorArgsLength( if (argsLength !== expectedArgsLength) { errors.push( - `Contract ${contractName} expects ${expectedArgsLength} constructor arguments but ${argsLength} were given` + `The constructor of the contract '${contractName}' expects ${expectedArgsLength} arguments but ${argsLength} were given` ); } @@ -264,7 +273,7 @@ export function validateArtifactEventArgumentParams( argument: string | number ): string[] { try { - validateOverloadedName(emitterArtifact, eventName, false); + validateOverloadedName(emitterArtifact, eventName, true); } catch (e) { assertIgnitionInvariant( e instanceof IgnitionValidationError, @@ -681,43 +690,44 @@ function validateOverloadedName( throw new IgnitionValidationError( `${eventOrFunctionCapitalized} "${name}" not found in contract ${artifact.contractName}` ); - } - - // If it is not overloaded we force the user to use the bare name - // because having a single representation is more friendly with our reconciliation - // process. - if (fragments.length === 1) { + } else if (fragments.length === 1) { + // If it is not overloaded we force the user to use the bare name + // because having a single representation is more friendly with our reconciliation + // process. if (bareName !== name) { throw new IgnitionValidationError( `${eventOrFunctionCapitalized} name "${name}" used for contract ${artifact.contractName}, but it's not overloaded. Use "${bareName}" instead.` ); } - } - - const normalizedNames = fragments.map((f) => { - if (ethers.Fragment.isEvent(f)) { - return getEventNameWithParams(f); - } + } else { + // If it's overloaded, we force the user to use the full name + const normalizedNames = fragments.map((f) => { + if (ethers.Fragment.isEvent(f)) { + return getEventNameWithParams(f); + } - return getFunctionNameWithParams(f); - }); + return getFunctionNameWithParams(f); + }); - const normalizedNameList = normalizedNames.map((nn) => `* ${nn}`).join("\n"); + const normalizedNameList = normalizedNames + .map((nn) => `* ${nn}`) + .join("\n"); - if (bareName === name) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} "${name}" is overloaded in contract ${artifact.contractName}. Please use one of these names instead: + if (bareName === name) { + throw new IgnitionValidationError( + `${eventOrFunctionCapitalized} "${name}" is overloaded in contract ${artifact.contractName}. Please use one of these names instead: ${normalizedNameList}` - ); - } + ); + } - if (!normalizedNames.includes(name)) { - throw new IgnitionValidationError( - `${eventOrFunctionCapitalized} "${name}" is not a valid overload of "${bareName}" in contract ${artifact.contractName}. Please use one of these names instead: + if (!normalizedNames.includes(name)) { + throw new IgnitionValidationError( + `${eventOrFunctionCapitalized} "${name}" is not a valid overload of "${bareName}" in contract ${artifact.contractName}. Please use one of these names instead: ${normalizedNameList}` - ); + ); + } } } @@ -771,7 +781,7 @@ export function validateFunctionArgumentParamType( functionFragment = getFunctionFragment(iface, functionName); } catch (e) { assertIgnitionInvariant( - e instanceof IgnitionValidationError, + e instanceof IgnitionValidationError || e instanceof IgnitionError, "getFunctionFragment should only throw IgnitionValidationErrors" ); return [e.message]; diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index d2d3e1e76a..59109a6eb5 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -9,6 +9,7 @@ import { NamedContractCallFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedContractCall } from "../src/internal/validation/futures/validateNamedContractCall"; import { FutureType } from "../src/types/module"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -480,493 +481,488 @@ describe("call", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateNamedContractCall"); - let validateNamedContractCall: typeof vm.validateNamedContractCall; + it("should not validate a non-existant hardhat contract", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + m.call(another, "test"); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateNamedContractCall" - ); - - validateNamedContractCall = vm.validateNamedContractCall; + return { another }; }); - it("should not validate a non-existant hardhat contract", async () => { - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - m.call(another, "test"); - - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); + }); - await assert.isRejected( - validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: {} as any }) - ), - /Artifact for contract 'Another' is invalid/ - ); - }); + it("should not validate a non-existant function", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "Another", + bytecode: "", + linkReferences: {}, + }; - it("should not validate a non-existant function", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "Another", - bytecode: "", - linkReferences: {}, - }; + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test"); - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test"); + return { another }; + }); - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ['Function "test" not found in contract Another'] + ); + }); - await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), - /Function "test" not found in contract Another/ - ); + it("should not validate a call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "inc", [1, 2]); + + return { another }; }); - it("should not validate a call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "inc", [1, 2]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), - /Function inc in contract Another expects 1 arguments but 2 were given/ - ); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc in contract Another expects 1 arguments but 2 were given", + ] + ); + }); + + it("should not validate an overloaded call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "Another", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "inc(bool,uint256)", [1, 2, 3]); + + return { another }; }); - it("should not validate an overloaded call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - contractName: "Another", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "inc(bool,uint256)", [1, 2, 3]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - await assert.isRejected( - validateNamedContractCall(future as any, setupMockArtifactResolver()), - /Function inc\(bool,uint256\) in contract Another expects 2 arguments but 3 were given/ - ); - }); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc(bool,uint256) in contract Another expects 2 arguments but 3 were given", + ] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateNamedContractCall"); - let validateNamedContractCall: typeof vm.validateNamedContractCall; + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateNamedContractCall" - ); + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); - validateNamedContractCall = vm.validateNamedContractCall; + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [p]); + + return { another }; }); - it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [p]); + it("should not validate a module parameter of the wrong type for value", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - return { another }; - }); + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", false as unknown as bigint); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [], { value: p }); - assert.includeMembers( - await validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return { another }; }); - it("should not validate a module parameter of the wrong type for value", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", false as unknown as bigint); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] + ); + }); - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [], { value: p }); + it("should validate a module parameter of the correct type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + name: "test", + outputs: [], + stateMutability: "payable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 42n); + + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [], { value: p }); + + return { another }; + }); - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); - assert.includeMembers( - await validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [p]); + + return { another }; }); - it("should validate a module parameter of the correct type for value", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [], - name: "test", - outputs: [], - stateMutability: "payable", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 42n); - - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [], { value: p }); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); - - await assert.isFulfilled( - validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) - ); - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", true); - - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [p]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); - await assert.isFulfilled( - validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) - ); - }); + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); + return { another }; + }); - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - assert.includeMembers( - await validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contract("Another", fakeArtifact, []); + m.call(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; }); - it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "test", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", true); - - const another = m.contract("Another", fakeArtifact, []); - m.call(another, "test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - await assert.isFulfilled( - validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) - ); + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "public", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + const account = m.getAccount(-1); + m.call(another, "inc", [1], { from: account }); + + return { another }; }); - it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "public", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - const account = m.getAccount(-1); - m.call(another, "inc", [1], { from: account }); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - assert.includeMembers( - await validateNamedContractCall( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "public", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + const account = m.getAccount(1); + m.call(another, "inc", [1], { from: account }); + + return { another }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "public", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - const account = m.getAccount(1); - m.call(another, "inc", [1], { from: account }); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); - assert.includeMembers( - await validateNamedContractCall( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); - }); + assert.includeMembers( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 2cb1839753..f5bbb2f431 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -9,6 +9,7 @@ import { NamedContractDeploymentFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedContractDeployment } from "../src/internal/validation/futures/validateNamedContractDeployment"; import { FutureType } from "../src/types/module"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -451,362 +452,342 @@ describe("contract", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateNamedContractDeployment"); - let validateNamedContractDeployment: typeof vm.validateNamedContractDeployment; + it("should not validate an invalid artifact", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contract("Another"); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateNamedContractDeployment" - ); - - validateNamedContractDeployment = vm.validateNamedContractDeployment; + return { another }; }); - it("should not validate an invalid artifact", async () => { - const module = buildModule("Module1", (m) => { - const another = m.contract("Another"); + const [future] = getFuturesFromModule(module); - return { another }; - }); + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ + Another: {} as any, + }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); + }); - const [future] = getFuturesFromModule(module); + it("should not validate an incorrect number of constructor args", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - await assert.isRejected( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ - Another: {} as any, - }) - ), - /Artifact for contract 'Another' is invalid/ - ); + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Test", [1, 2, 3]); + + return { contract1 }; }); - it("should not validate an incorrect number of constructor args", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + [ + "The constructor of the contract 'Test' expects 0 arguments but 3 were given", + ] + ); + }); - const module = buildModule("Module1", (m) => { - const contract1 = m.contract("Test", [1, 2, 3]); + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", [p]); - return { contract1 }; - }); + return { contract1 }; + }); - const [future] = getFuturesFromModule(module); + const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }) - ), - /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ - ); - }); + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateNamedContractDeployment"); - let validateNamedContractDeployment: typeof vm.validateNamedContractDeployment; + it("should not validate a module parameter of the wrong type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", false as unknown as bigint); + const contract1 = m.contract("Test", [], { value: p }); - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateNamedContractDeployment" - ); - - validateNamedContractDeployment = vm.validateNamedContractDeployment; + return { contract1 }; }); - it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const contract1 = m.contract("Test", [p]); - - return { contract1 }; - }); - - const [future] = getFuturesFromModule(module); + const [future] = getFuturesFromModule(module); - assert.includeMembers( - await validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); - }); - - it("should not validate a module parameter of the wrong type for value", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", false as unknown as bigint); - const contract1 = m.contract("Test", [], { value: p }); - - return { contract1 }; - }); + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] + ); + }); - const [future] = getFuturesFromModule(module); + it("should validate a module parameter of the correct type for value", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 42n); + const contract1 = m.contract("Test", [], { value: p }); - assert.includeMembers( - await validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] - ); + return { contract1 }; }); - it("should validate a module parameter of the correct type for value", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 42n); - const contract1 = m.contract("Test", [], { value: p }); - - return { contract1 }; - }); - - const [future] = getFuturesFromModule(module); + const [future] = getFuturesFromModule(module); - await assert.isFulfilled( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ) - ); - }); - - it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123); - const contract1 = m.contract("Test", [p]); - - return { contract1 }; - }); + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ) + ); + }); - const [future] = getFuturesFromModule(module); + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", [p]); - await assert.isFulfilled( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ) - ); + return { contract1 }; }); - it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const contract1 = m.contract("Test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { contract1 }; - }); + const [future] = getFuturesFromModule(module); - const [future] = getFuturesFromModule(module); + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ) + ); + }); - assert.includeMembers( - await validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; }); - it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123); - const contract1 = m.contract("Test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { contract1 }; - }); + const [future] = getFuturesFromModule(module); - const [future] = getFuturesFromModule(module); + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - await assert.isFulfilled( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ) - ); + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; }); - it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const [future] = getFuturesFromModule(module); - const module = buildModule("Module1", (m) => { - const account = m.getAccount(-1); - const contract1 = m.contract("Test", [], { from: account }); + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ) + ); + }); - return { contract1 }; - }); + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - const [future] = getFuturesFromModule(module); + const module = buildModule("Module1", (m) => { + const account = m.getAccount(-1); + const contract1 = m.contract("Test", [], { from: account }); - assert.includeMembers( - await validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + return { contract1 }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + const [future] = getFuturesFromModule(module); - const module = buildModule("Module1", (m) => { - const account = m.getAccount(1); - const contract1 = m.contract("Test", [], { from: account }); + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); - return { contract1 }; - }); + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - const [future] = getFuturesFromModule(module); - - assert.includeMembers( - await validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); + const module = buildModule("Module1", (m) => { + const account = m.getAccount(1); + const contract1 = m.contract("Test", [], { from: account }); + + return { contract1 }; }); + + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index deb3f0d426..0f445c357c 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -5,6 +5,7 @@ import { Artifact, FutureType } from "../src"; import { buildModule } from "../src/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedContractAt } from "../src/internal/validation/futures/validateNamedContractAt"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -203,124 +204,100 @@ describe("contractAt", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateNamedContractAt"); - let validateNamedContractAt: typeof vm.validateNamedContractAt; + it("should not validate an invalid artifact", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contractAt("Another", ""); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateNamedContractAt" - ); - - validateNamedContractAt = vm.validateNamedContractAt; + return { another }; }); - it("should not validate an invalid artifact", async () => { - const module = buildModule("Module1", (m) => { - const another = m.contractAt("Another", ""); - - return { another }; - }); + const [future] = getFuturesFromModule(module); - const [future] = getFuturesFromModule(module); - - await assert.isRejected( - validateNamedContractAt( - future as any, - setupMockArtifactResolver({ - Another: {} as any, - }) - ), - /Artifact for contract 'Another' is invalid/ - ); - }); + assert.includeMembers( + await validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: {} as any, + }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateNamedContractAt"); - let validateNamedContractAt: typeof vm.validateNamedContractAt; + it("should not validate a missing module parameter", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const another = m.contractAt("Another", p); - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateNamedContractAt" - ); - - validateNamedContractAt = vm.validateNamedContractAt; + return { another }; }); - it("should not validate a missing module parameter", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const another = m.contractAt("Another", p); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT + ); - return { another }; - }); + assert.includeMembers( + await validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", "0x1234"); + const another = m.contractAt("Another", p); - assert.includeMembers( - await validateNamedContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return { another }; }); - it("should validate a missing module parameter if a default parameter is present", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", "0x1234"); - const another = m.contractAt("Another", p); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT + ); - return { another }; - }); + await assert.isFulfilled( + validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ) + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT - ); + it("should not validate a module parameter of the wrong type", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123 as unknown as string); + const another = m.contractAt("Another", p); - await assert.isFulfilled( - validateNamedContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ) - ); + return { another }; }); - it("should not validate a module parameter of the wrong type", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123 as unknown as string); - const another = m.contractAt("Another", p); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT + ); - assert.includeMembers( - await validateNamedContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ), - ["Module parameter 'p' must be of type 'string' but is 'number'"] - ); - }); + assert.includeMembers( + await validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ), + ["Module parameter 'p' must be of type 'string' but is 'number'"] + ); }); }); }); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index f6a8c21221..aeb1a7b698 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -5,6 +5,7 @@ import { Artifact, FutureType } from "../src"; import { buildModule } from "../src/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateArtifactContractAt } from "../src/internal/validation/futures/validateArtifactContractAt"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -215,91 +216,78 @@ describe("contractAtFromArtifact", () => { }); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateArtifactContractAt"); - let validateArtifactContractAt: typeof vm.validateArtifactContractAt; + it("should not validate a missing module parameter", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const another = m.contractAt("Another", p, fakeArtifact); - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateArtifactContractAt" - ); - - validateArtifactContractAt = vm.validateArtifactContractAt; + return { another }; }); - it("should not validate a missing module parameter", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const another = m.contractAt("Another", p, fakeArtifact); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_AT + ); - return { another }; - }); + assert.includeMembers( + await validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_AT - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", "0x1234"); + const another = m.contractAt("Another", p, fakeArtifact); - assert.includeMembers( - await validateArtifactContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return { another }; }); - it("should validate a missing module parameter if a default parameter is present", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", "0x1234"); - const another = m.contractAt("Another", p, fakeArtifact); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_AT + ); - return { another }; - }); + await assert.isFulfilled( + validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ) + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_AT - ); + it("should not validate a module parameter of the wrong type", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123 as unknown as string); + const another = m.contractAt("Another", p, fakeArtifact); - await assert.isFulfilled( - validateArtifactContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ) - ); + return { another }; }); - it("should not validate a module parameter of the wrong type", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123 as unknown as string); - const another = m.contractAt("Another", p, fakeArtifact); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_AT - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_AT + ); - assert.includeMembers( - await validateArtifactContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ), - ["Module parameter 'p' must be of type 'string' but is 'number'"] - ); - }); + assert.includeMembers( + await validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ), + ["Module parameter 'p' must be of type 'string' but is 'number'"] + ); }); }); }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 8c527bff7b..556ab7356b 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -9,6 +9,7 @@ import { ModuleParameterRuntimeValueImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateArtifactContractDeployment } from "../src/internal/validation/futures/validateArtifactContractDeployment"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -479,305 +480,281 @@ describe("contractFromArtifact", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateArtifactContractDeployment"); - let validateArtifactContractDeployment: typeof vm.validateArtifactContractDeployment; + it("should not validate an incorrect number of constructor args", async () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Test", fakeArtifact, [1, 2, 3]); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateArtifactContractDeployment" - ); - - validateArtifactContractDeployment = - vm.validateArtifactContractDeployment; + return { contract1 }; }); - it("should not validate an incorrect number of constructor args", async () => { - const module = buildModule("Module1", (m) => { - const contract1 = m.contract("Test", fakeArtifact, [1, 2, 3]); - - return { contract1 }; - }); - - const [future] = getFuturesFromModule(module); + const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver() - ), - /The constructor of the contract 'Test' expects 0 arguments but 3 were given/ - ); - }); + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "The constructor of the contract 'Test' expects 0 arguments but 3 were given", + ] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateArtifactContractDeployment"); - let validateArtifactContractDeployment: typeof vm.validateArtifactContractDeployment; + it("should not validate a missing module parameter", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", fakeArtifact, [p]); - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateArtifactContractDeployment" - ); - - validateArtifactContractDeployment = - vm.validateArtifactContractDeployment; + return { contract1 }; }); - it("should not validate a missing module parameter", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const contract1 = m.contract("Test", fakeArtifact, [p]); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - return { contract1 }; - }); + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", fakerArtifact, [p]); - assert.includeMembers( - await validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return { contract1 }; }); - it("should validate a missing module parameter if a default parameter is present", async () => { - const fakerArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123); - const contract1 = m.contract("Test", fakerArtifact, [p]); - - return { contract1 }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - await assert.isFulfilled( - validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ) - ); - }); + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ) + ); + }); - it("should not validate a module parameter of the wrong type for value", async () => { - const fakerArtifact: Artifact = { - abi: [ - { - inputs: [], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", false as unknown as bigint); - const contract1 = m.contract("Test", fakerArtifact, [], { - value: p, - }); - - return { contract1 }; + it("should not validate a module parameter of the wrong type for value", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", false as unknown as bigint); + const contract1 = m.contract("Test", fakerArtifact, [], { + value: p, }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); - - assert.includeMembers( - await validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ), - ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] - ); + return { contract1 }; }); - it("should validate a module parameter of the correct type for value", async () => { - const fakerArtifact: Artifact = { - abi: [ - { - inputs: [], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 42n); - const contract1 = m.contract("Test", fakerArtifact, [], { - value: p, - }); - - return { contract1 }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] + ); + }); - await assert.isFulfilled( - validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ) - ); + it("should validate a module parameter of the correct type for value", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 42n); + const contract1 = m.contract("Test", fakerArtifact, [], { + value: p, + }); + + return { contract1 }; }); - it("should not validate a missing module parameter (deeply nested)", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - const contract1 = m.contract("Test", fakeArtifact, [ - [123, { really: { deeply: { nested: [p] } } }], - ]); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - return { contract1 }; - }); + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ) + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); + it("should not validate a missing module parameter (deeply nested)", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", fakeArtifact, [ + [123, { really: { deeply: { nested: [p] } } }], + ]); - assert.includeMembers( - await validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return { contract1 }; }); - it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakerArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "uint256", - name: "p", - type: "uint256", - }, - ], - stateMutability: "payable", - type: "constructor", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 123); - const contract1 = m.contract("Test", fakerArtifact, [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { contract1 }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.CONTRACT_DEPLOYMENT - ); + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - await assert.isFulfilled( - validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ) - ); + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakerArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Test", fakerArtifact, [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { contract1 }; }); - it("should not validate a negative account index", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(-1); - const contract1 = m.contract("Test", fakeArtifact, [], { - from: account, - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); - return { contract1 }; - }); + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ) + ); + }); - const [future] = getFuturesFromModule(module); + it("should not validate a negative account index", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(-1); + const contract1 = m.contract("Test", fakeArtifact, [], { + from: account, + }); - assert.includeMembers( - await validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + return { contract1 }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(1); - const contract1 = m.contract("Test", fakeArtifact, [], { - from: account, - }); + const [future] = getFuturesFromModule(module); - return { contract1 }; + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(1); + const contract1 = m.contract("Test", fakeArtifact, [], { + from: account, }); - const [future] = getFuturesFromModule(module); - - assert.includeMembers( - await validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); + return { contract1 }; }); + + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/execution/abi.ts b/packages/core/test/execution/abi.ts index e2b658f461..3a3d328b90 100644 --- a/packages/core/test/execution/abi.ts +++ b/packages/core/test/execution/abi.ts @@ -645,42 +645,42 @@ describe("abi", () => { describe("validations", () => { describe("validateArtifactFunctionName", () => { it("Should throw if the function name is not valid", () => { - assert.throws( - () => - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "12" - ), - `Invalid function name "12"` + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "12" + ), + [`Invalid function name "12"`] ); - assert.throws( - () => - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "asd(123, asd" - ), - `Invalid function name "asd(123, asd"` + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "asd(123, asd" + ), + [`Invalid function name "asd(123, asd"`] ); }); it("Should throw if the function name is not found", () => { - assert.throws( - () => - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "nonExistentFunction" - ), - `Function "nonExistentFunction" not found in contract FunctionNameValidation` + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "nonExistentFunction" + ), + [ + `Function "nonExistentFunction" not found in contract FunctionNameValidation`, + ] ); - assert.throws( - () => - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "nonExistentFunction2(uint,bytes32)" - ), - `Function "nonExistentFunction2(uint,bytes32)" not found in contract FunctionNameValidation` + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "nonExistentFunction2(uint,bytes32)" + ), + [ + `Function "nonExistentFunction2(uint,bytes32)" not found in contract FunctionNameValidation`, + ] ); }); @@ -702,70 +702,73 @@ describe("abi", () => { ); }); - it("Should not throw if the function name with types is used", () => { - assert.throws(() => { + it("Should throw if the function name with types is used", () => { + assert.includeMembers( validateArtifactFunctionName( callEncodingFixtures.FunctionNameValidation, "noOverloads()" - ); - }, `Function name "noOverloads()" used for contract FunctionNameValidation, but it's not overloaded. Use "noOverloads" instead`); + ), + [ + `Function name "noOverloads()" used for contract FunctionNameValidation, but it's not overloaded. Use "noOverloads" instead.`, + ] + ); }); }); describe("Overloaded functions", () => { it("Should throw if the bare function name is used", () => { - assert.throws( - () => { - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "withTypeBasedOverloads" - ); - }, - `Function "withTypeBasedOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "withTypeBasedOverloads" + ), + [ + `Function "withTypeBasedOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: * withTypeBasedOverloads(uint256) -* withTypeBasedOverloads(int256)` +* withTypeBasedOverloads(int256)`, + ] ); - assert.throws( - () => { - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "withParamCountOverloads" - ); - }, - `Function "withParamCountOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "withParamCountOverloads" + ), + [ + `Function "withParamCountOverloads" is overloaded in contract FunctionNameValidation. Please use one of these names instead: * withParamCountOverloads() -* withParamCountOverloads(int256)` +* withParamCountOverloads(int256)`, + ] ); }); it("Should throw if the overload described by the function name doesn't exist", () => { - assert.throws( - () => { - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "withTypeBasedOverloads(bool)" - ); - }, - `Function "withTypeBasedOverloads(bool)" is not a valid overload of "withTypeBasedOverloads" in contract FunctionNameValidation. Please use one of these names instead: + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "withTypeBasedOverloads(bool)" + ), + [ + `Function "withTypeBasedOverloads(bool)" is not a valid overload of "withTypeBasedOverloads" in contract FunctionNameValidation. Please use one of these names instead: * withTypeBasedOverloads(uint256) -* withTypeBasedOverloads(int256)` +* withTypeBasedOverloads(int256)`, + ] ); - assert.throws( - () => { - validateArtifactFunctionName( - callEncodingFixtures.FunctionNameValidation, - "withParamCountOverloads(bool)" - ); - }, - `Function "withParamCountOverloads(bool)" is not a valid overload of "withParamCountOverloads" in contract FunctionNameValidation. Please use one of these names instead: + assert.includeMembers( + validateArtifactFunctionName( + callEncodingFixtures.FunctionNameValidation, + "withParamCountOverloads(bool)" + ), + [ + `Function "withParamCountOverloads(bool)" is not a valid overload of "withParamCountOverloads" in contract FunctionNameValidation. Please use one of these names instead: * withParamCountOverloads() -* withParamCountOverloads(int256)` +* withParamCountOverloads(int256)`, + ] ); }); diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index 373f57c7b7..019f0a0bb4 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -7,6 +7,7 @@ import { NamedLibraryDeploymentFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedLibraryDeployment } from "../src/internal/validation/futures/validateNamedLibraryDeployment"; import { FutureType } from "../src/types/module"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -232,92 +233,68 @@ describe("library", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateNamedLibraryDeployment"); - let validateNamedLibraryDeployment: typeof vm.validateNamedLibraryDeployment; + it("should not validate an invalid artifact", async () => { + const module = buildModule("Module1", (m) => { + const another = m.library("Another"); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateNamedLibraryDeployment" - ); - - validateNamedLibraryDeployment = vm.validateNamedLibraryDeployment; + return { another }; }); - it("should not validate an invalid artifact", async () => { - const module = buildModule("Module1", (m) => { - const another = m.library("Another"); - - return { another }; - }); - - const [future] = getFuturesFromModule(module); + const [future] = getFuturesFromModule(module); - await assert.isRejected( - validateNamedLibraryDeployment( - future as any, - setupMockArtifactResolver({ Another: {} as any }) - ), - /Artifact for contract 'Another' is invalid/ - ); - }); + assert.includeMembers( + await validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateNamedLibraryDeployment"); - let validateNamedLibraryDeployment: typeof vm.validateNamedLibraryDeployment; - - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateNamedLibraryDeployment" - ); + it("should not validate a negative account index", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(-1); + const test = m.library("Test", { from: account }); - validateNamedLibraryDeployment = vm.validateNamedLibraryDeployment; + return { test }; }); - it("should not validate a negative account index", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(-1); - const test = m.library("Test", { from: account }); + const [future] = getFuturesFromModule(module); - return { test }; - }); + assert.includeMembers( + await validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); - const [future] = getFuturesFromModule(module); + it("should not validate an account index greater than the number of available accounts", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(1); + const test = m.library("Test", { from: account }); - assert.includeMembers( - await validateNamedLibraryDeployment( - future as any, - setupMockArtifactResolver({ Another: {} as any }), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + return { test }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(1); - const test = m.library("Test", { from: account }); - - return { test }; - }); - - const [future] = getFuturesFromModule(module); - - assert.includeMembers( - await validateNamedLibraryDeployment( - future as any, - setupMockArtifactResolver({ Another: {} as any }), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); - }); + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateNamedLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index fff61c6ad2..d3a4cbe183 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -8,6 +8,7 @@ import { ArtifactLibraryDeploymentFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateArtifactLibraryDeployment } from "../src/internal/validation/futures/validateArtifactLibraryDeployment"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -231,66 +232,52 @@ describe("libraryFromArtifact", () => { }); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateArtifactLibraryDeployment"); - let validateArtifactLibraryDeployment: typeof vm.validateArtifactLibraryDeployment; - - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateArtifactLibraryDeployment" - ); - - validateArtifactLibraryDeployment = - vm.validateArtifactLibraryDeployment; - }); - - it("should not validate a negative account index", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(-1); - const test = m.library("Test", fakeArtifact, { - from: account, - }); - - return { test }; + it("should not validate a negative account index", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(-1); + const test = m.library("Test", fakeArtifact, { + from: account, }); - const [future] = getFuturesFromModule(module); - - assert.includeMembers( - await validateArtifactLibraryDeployment( - future as any, - setupMockArtifactResolver({ Another: {} as any }), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + return { test }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(1); - const test = m.library("Test", fakeArtifact, { - from: account, - }); + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateArtifactLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); - return { test }; + it("should not validate an account index greater than the number of available accounts", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(1); + const test = m.library("Test", fakeArtifact, { + from: account, }); - const [future] = getFuturesFromModule(module); - - assert.includeMembers( - await validateArtifactLibraryDeployment( - future as any, - setupMockArtifactResolver({ Another: {} as any }), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); + return { test }; }); + + const [future] = getFuturesFromModule(module); + + assert.includeMembers( + await validateArtifactLibraryDeployment( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 536b457940..ed7374da8f 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -4,6 +4,7 @@ import { assert } from "chai"; import { Artifact, FutureType, ReadEventArgumentFuture } from "../src"; import { buildModule } from "../src/build-module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateReadEventArgument } from "../src/internal/validation/futures/validateReadEventArgument"; import { setupMockArtifactResolver } from "./helpers"; @@ -221,63 +222,57 @@ describe("Read event argument", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateReadEventArgument"); - let validateReadEventArgument: typeof vm.validateReadEventArgument; + it("should not validate a non-existant hardhat contract", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + m.readEventArgument(another, "test", "arg"); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateReadEventArgument" - ); - - validateReadEventArgument = vm.validateReadEventArgument; + return { another }; }); - it("should not validate a non-existant hardhat contract", async () => { - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - m.readEventArgument(another, "test", "arg"); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.READ_EVENT_ARGUMENT - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.READ_EVENT_ARGUMENT + ); - await assert.isRejected( - validateReadEventArgument( - future as any, - setupMockArtifactResolver({ Another: {} as any }) - ), - /Artifact for contract 'Another' is invalid/ - ); - }); + assert.includeMembers( + await validateReadEventArgument( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); + }); - it("should not validate a non-existant event", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; + it("should not validate a non-existant event", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "Another", + bytecode: "", + linkReferences: {}, + }; - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.readEventArgument(another, "test", "arg"); + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.readEventArgument(another, "test", "arg"); - return { another }; - }); + return { another }; + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.READ_EVENT_ARGUMENT - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.READ_EVENT_ARGUMENT + ); - await assert.isRejected( - validateReadEventArgument(future as any, setupMockArtifactResolver()), - /Event "test" not found/ - ); - }); + assert.includeMembers( + await validateReadEventArgument( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ['Event "test" not found in contract Another'] + ); }); }); }); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 00a723b3e5..01f9609490 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -8,6 +8,7 @@ import { SendDataFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateSendData } from "../src/internal/validation/futures/validateSendData"; import { FutureType } from "../src/types/module"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -313,145 +314,132 @@ describe("send", () => { }); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateSendData"); - let validateSendData: typeof vm.validateSendData; + it("should not validate a missing module parameter", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + m.send("id", p, 0n, ""); - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateSendData" - ); - - validateSendData = vm.validateSendData; + return {}; }); - it("should not validate a missing module parameter", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p"); - m.send("id", p, 0n, ""); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - return {}; - }); + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", "0x123"); + m.send("id", p, 0n, ""); - assert.includeMembers( - await validateSendData( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + return {}; }); - it("should validate a missing module parameter if a default parameter is present", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", "0x123"); - m.send("id", p, 0n, ""); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - return {}; - }); + await assert.isFulfilled( + validateSendData(future as any, setupMockArtifactResolver(), {}, []) + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + it("should not validate a module parameter of the wrong type for value", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", false as unknown as bigint); + m.send("id", "0xasdf", p, ""); - await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}, []) - ); + return {}; }); - it("should not validate a module parameter of the wrong type for value", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", false as unknown as bigint); - m.send("id", "0xasdf", p, ""); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - return {}; - }); + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + it("should validate a module parameter of the correct type for value", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", 42n); + m.send("id", "0xasdf", p, ""); - assert.includeMembers( - await validateSendData( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Module parameter 'p' must be of type 'bigint' but is 'boolean'"] - ); + return {}; }); - it("should validate a module parameter of the correct type for value", async () => { - const module = buildModule("Module1", (m) => { - const p = m.getParameter("p", 42n); - m.send("id", "0xasdf", p, ""); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - return {}; - }); + await assert.isFulfilled( + validateSendData(future as any, setupMockArtifactResolver(), {}, []) + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + it("should not validate a negative account index", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(-1); + m.send("id", "0xasdf", 0n, "", { from: account }); - await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}, []) - ); + return {}; }); - it("should not validate a negative account index", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(-1); - m.send("id", "0xasdf", 0n, "", { from: account }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - return {}; - }); + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + it("should not validate an account index greater than the number of available accounts", async () => { + const module = buildModule("Module1", (m) => { + const account = m.getAccount(1); + m.send("id", "0xasdf", 0n, "", { from: account }); - assert.includeMembers( - await validateSendData( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + return {}; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const module = buildModule("Module1", (m) => { - const account = m.getAccount(1); - m.send("id", "0xasdf", 0n, "", { from: account }); - - return {}; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.SEND_DATA - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); - assert.includeMembers( - await validateSendData( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); - }); + assert.includeMembers( + await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 85d76bfbda..2a847722ea 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -10,6 +10,7 @@ import { NamedStaticCallFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedStaticCall } from "../src/internal/validation/futures/validateNamedStaticCall"; import { FutureType } from "../src/types/module"; import { assertInstanceOf, setupMockArtifactResolver } from "./helpers"; @@ -495,535 +496,549 @@ describe("static call", () => { }); }); - describe("stage one", () => { - let vm: typeof import("../src/internal/validation/stageOne/validateNamedStaticCall"); - let validateNamedStaticCall: typeof vm.validateNamedStaticCall; + it("should not validate a non-existant hardhat contract", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + m.staticCall(another, "test"); - before(async () => { - vm = await import( - "../src/internal/validation/stageOne/validateNamedStaticCall" - ); - - validateNamedStaticCall = vm.validateNamedStaticCall; + return { another }; }); - it("should not validate a non-existant hardhat contract", async () => { - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - m.staticCall(another, "test"); - - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + ["Artifact for contract 'Another' is invalid"] + ); + }); - await assert.isRejected( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: {} as any }) - ), - /Artifact for contract 'Another' is invalid/ - ); - }); + it("should not validate a non-existant function", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "Another", + bytecode: "", + linkReferences: {}, + }; - it("should not validate a non-existant function", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "Another", - bytecode: "", - linkReferences: {}, - }; + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "test"); - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "test"); + return { another }; + }); - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ['Function "test" not found in contract Another'] + ); + }); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function "test" not found in contract Another/ - ); + it("should not validate a static call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "inc", [1, 2]); + + return { another }; }); - it("should not validate a static call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "inc", [1, 2]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function inc in contract Another expects 1 arguments but 2 were given/ - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc in contract Another expects 1 arguments but 2 were given", + ] + ); + }); + + it("should not validate an overloaded call with wrong number of arguments", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "Another", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "inc(bool,uint256)", [1, 2, 3]); + + return { another }; }); - it("should not validate an overloaded call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "view", - type: "function", - }, - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - { - internalType: "uint256", - name: "n", - type: "uint256", - }, - ], - name: "inc", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "Another", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "inc(bool,uint256)", [1, 2, 3]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function inc\(bool,uint256\) in contract Another expects 2 arguments but 3 were given/ - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc(bool,uint256) in contract Another expects 2 arguments but 3 were given", + ] + ); + }); + + it("should not validate a non-readonly function", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "inc", [1]); + + return { another }; }); - it("should not validate a non-readonly function", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "nonpayable", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "inc", [1]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function inc in contract Another is not 'pure' or 'view' and cannot be statically called/ - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc in contract Another is not 'pure' or 'view' and cannot be statically called", + ] + ); + }); + + it("should not validate a nameOrIndex that is invalid (nonexistent name)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "inc", [], "a"); + + return { another }; }); - it("should not validate a nameOrIndex that is invalid (nonexistent name)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [], - name: "inc", - outputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - stateMutability: "pure", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "inc", [], "a"); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function inc of contract Another has no return value named a/ - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Function inc of contract Another has no return value named a"] + ); + }); + + it("should not validate a nameOrIndex that is invalid (out of range)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + stateMutability: "pure", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + m.staticCall(another, "inc", [], 2); + + return { another }; }); - it("should not validate a nameOrIndex that is invalid (out of range)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [], - name: "inc", - outputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - stateMutability: "pure", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - m.staticCall(another, "inc", [], 2); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isRejected( - validateNamedStaticCall(future as any, setupMockArtifactResolver()), - /Function inc of contract Another has only 1 return values, but value 2 was requested/ - ); - }); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Function inc of contract Another has only 1 return values, but value 2 was requested", + ] + ); }); - describe("stage two", () => { - let vm: typeof import("../src/internal/validation/futures/validateNamedStaticCall"); - let validateNamedStaticCall: typeof vm.validateNamedStaticCall; + it("should not validate a missing module parameter", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; - before(async () => { - vm = await import( - "../src/internal/validation/futures/validateNamedStaticCall" - ); + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p"); + m.staticCall(another, "test", [p]); - validateNamedStaticCall = vm.validateNamedStaticCall; + return { another }; }); - it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - const p = m.getParameter("p"); - m.staticCall(another, "test", [p]); - - return { another }; - }); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); - assert.includeMembers( - await validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p", true); + m.staticCall(another, "test", [p]); + + return { another }; }); - it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "test", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - const p = m.getParameter("p", true); - m.staticCall(another, "test", [p]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isFulfilled( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) - ); + await assert.isFulfilled( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a missing module parameter (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p"); + m.staticCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; }); - it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - const p = m.getParameter("p"); - m.staticCall(another, "test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - assert.includeMembers( - await validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ), - ["Module parameter 'p' requires a value but was given none"] - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + ["Module parameter 'p' requires a value but was given none"] + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p", true); + m.staticCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; }); - it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "test", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", []); - const p = m.getParameter("p", true); - m.staticCall(another, "test", [ - [123, { really: { deeply: { nested: [p] } } }], - ]); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - await assert.isFulfilled( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) - ); + await assert.isFulfilled( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a negative account index", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + const account = m.getAccount(-1); + m.staticCall(another, "inc", [1], 0, { from: account }); + + return { another }; }); - it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - const account = m.getAccount(-1); - m.staticCall(another, "inc", [1], 0, { from: account }); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - assert.includeMembers( - await validateNamedStaticCall( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - ["Account index cannot be a negative number"] - ); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + ["Account index cannot be a negative number"] + ); + }); + + it("should not validate an account index greater than the number of available accounts", async () => { + const fakeArtifact: Artifact = { + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "view", + type: "function", + }, + ], + contractName: "", + bytecode: "", + linkReferences: {}, + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakeArtifact, []); + const account = m.getAccount(1); + m.staticCall(another, "inc", [1], 0, { from: account }); + + return { another }; }); - it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { - abi: [ - { - inputs: [ - { - internalType: "bool", - name: "b", - type: "bool", - }, - ], - name: "inc", - outputs: [], - stateMutability: "view", - type: "function", - }, - ], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - - const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); - const account = m.getAccount(1); - m.staticCall(another, "inc", [1], 0, { from: account }); - - return { another }; - }); - - const future = getFuturesFromModule(module).find( - (v) => v.type === FutureType.STATIC_CALL - ); + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); - assert.includeMembers( - await validateNamedStaticCall( - future as any, - setupMockArtifactResolver(), - {}, - [] - ), - [ - "Requested account index '1' is greater than the total number of available accounts '0'", - ] - ); - }); + assert.includeMembers( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + [ + "Requested account index '1' is greater than the total number of available accounts '0'", + ] + ); }); }); }); From cb297ffcec72cd70f24d3d536993931ec2b2b996 Mon Sep 17 00:00:00 2001 From: Filip Pajic Date: Mon, 25 Sep 2023 11:26:49 +0200 Subject: [PATCH 0969/1302] Update main README table of contents --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e314c9b177..9d60bbd884 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,9 @@ See our [Getting started guide](./docs/getting-started-guide.md) for a worked ex - [Creating Modules for Deployments](./docs/creating-modules-for-deployment.md) - [Deploying a Contract](./docs/creating-modules-for-deployment.md#deploying-a-contract) - [Calling contract methods](./docs/creating-modules-for-deployment.md#calling-contract-methods) + - [Network Accounts Management](./docs/creating-modules-for-deployment.md#network-accounts-management) - [Including modules within modules](./docs/creating-modules-for-deployment.md#including-modules-within-modules) - [Module Parameters](./docs/creating-modules-for-deployment.md#module-parameters) - - [Switching based on the _Network Chain ID_](./docs/creating-modules-for-deployment.md#switching-based-on-the-network-chain-id) - [Using Hardhat Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) - [Running a deployment](./docs/running-a-deployment.md) - [Visualizing your deployment with the `visualize` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) From 0b8d11a15ae2673e2dcd4263febf9a1296634e76 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 26 Sep 2023 21:25:15 +0100 Subject: [PATCH 0970/1302] feat/update-visualize (#486) * feat(visualization-report): change title to HH branding Apply Harhdat branding: * The title of the report has been changed to `Hardhat Ignition - `. * The page title has been changed to `Hardhat Ignition`. * Add the HH favicon * feat(visualize-report): update summary to show ids Replace the bespoke approach to deploys/calls with a display of ids. Turn the lists of ids into links that lead to the detail page. * feat(visualization-report): rename overview subtitle to futures Rename `Actions` to `Futures`. We no longer use the name `Actions`. * feat(visualizition-report): display ids in futures list * feat: reflow mermaid top to bottom * feat(visualization-report): include breadcrumb on details page * feat: fix mermaid tests * remove duplicate futures from html * move future details into dropdown --------- Co-authored-by: zoeyTM --- packages/ui/index.html | 3 +- packages/ui/public/favicon.ico | Bin 0 -> 15406 bytes packages/ui/src/components/shared.tsx | 4 + packages/ui/src/main.tsx | 5 - .../components/future-summary.tsx | 193 --------------- .../pages/future-details/future-details.tsx | 34 --- .../components/action.tsx | 106 -------- .../components/future-block.tsx | 232 ++++++++++++++++++ .../components/visualization-details.tsx | 31 ++- .../components/visualization-summary.tsx | 17 +- .../visualization-overview.tsx | 2 +- packages/ui/src/queries/futures.ts | 10 +- packages/ui/src/utils/to-mermaid.ts | 8 +- packages/ui/test/to-mermaid.ts | 32 +-- 14 files changed, 299 insertions(+), 378 deletions(-) create mode 100644 packages/ui/public/favicon.ico delete mode 100644 packages/ui/src/pages/future-details/components/future-summary.tsx delete mode 100644 packages/ui/src/pages/future-details/future-details.tsx delete mode 100644 packages/ui/src/pages/visualization-overview/components/action.tsx create mode 100644 packages/ui/src/pages/visualization-overview/components/future-block.tsx diff --git a/packages/ui/index.html b/packages/ui/index.html index 69895eb221..39a9286d4b 100644 --- a/packages/ui/index.html +++ b/packages/ui/index.html @@ -3,7 +3,8 @@ - Ignition + + Hardhat Ignition
    diff --git a/packages/ui/public/favicon.ico b/packages/ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d5e6b335eb8776f9c0f1909ba912bcac6112f509 GIT binary patch literal 15406 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/components/shared.tsx b/packages/ui/src/components/shared.tsx index 1210b0ccf8..48005feeac 100644 --- a/packages/ui/src/components/shared.tsx +++ b/packages/ui/src/components/shared.tsx @@ -14,3 +14,7 @@ export const Panel = styled.div` border: 1px solid black; padding: 1rem; `; + +export const Breadcrumb = styled.div` + padding-bottom: 1rem; +`; diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index 1bcf46e48c..2460067935 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -7,7 +7,6 @@ import { } from "@nomicfoundation/ignition-core/ui-helpers"; import ReactDOM from "react-dom/client"; import { RouterProvider, createHashRouter } from "react-router-dom"; -import { FutureDetails } from "./pages/future-details/future-details"; import { VisualizationOverview } from "./pages/visualization-overview/visualization-overview"; const loadDeploymentFromEmbeddedDiv = (): IgnitionModule< @@ -49,10 +48,6 @@ const main = async () => { path: "/", element: , }, - { - path: "/future/:futureId", - element: , - }, ]); ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render( diff --git a/packages/ui/src/pages/future-details/components/future-summary.tsx b/packages/ui/src/pages/future-details/components/future-summary.tsx deleted file mode 100644 index 3ffbd30e87..0000000000 --- a/packages/ui/src/pages/future-details/components/future-summary.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import { - Future, - FutureType, - isFuture, -} from "@nomicfoundation/ignition-core/ui-helpers"; -import { PageTitle, Panel } from "../../../components/shared"; -import { SummaryHeader } from "../../../components/summary-header"; -import { argumentTypeToString } from "../../../utils/argumentTypeToString"; - -export const FutureSummary: React.FC<{ - future: Future; -}> = ({ future }) => { - const title = resolveTitleFor(future); - - return ( -
    -
    - {title} -
    - - - - -
    - -
    -
    -
    - ); -}; - -function resolveTitleFor(future: Future): string { - switch (future.type) { - case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: - return `Contract deploy - ${future.contractName}`; - case FutureType.CONTRACT_DEPLOYMENT: - return `Contract deploy from Artifact - ${future.contractName}`; - case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: - return `Library deploy - ${future.contractName}`; - case FutureType.LIBRARY_DEPLOYMENT: - return `Library deploy from Artifact - ${future.contractName}`; - case FutureType.CONTRACT_CALL: - return `Call - ${future.contract.contractName}/${future.functionName}`; - case FutureType.STATIC_CALL: - return `Static call - ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - return `Existing contract - ${future.contractName} (${ - typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address) - })`; - case FutureType.CONTRACT_AT: - return `Existing contract from Artifact - ${future.contractName} (${ - typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address) - })`; - case FutureType.READ_EVENT_ARGUMENT: - return `Read event argument from future - ${future.id}`; - case FutureType.SEND_DATA: - return `Send data - ${future.id}`; - } -} - -const FutureDetailsSection: React.FC<{ future: Future }> = ({ future }) => { - switch (future.type) { - case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: - return ( -
    -

    Contract - {future.contractName}

    -

    Constructor Args

    -
      - {Object.entries(future.constructorArgs).map(([key, value]) => ( -
    • - {key} - {argumentTypeToString(value)} -
    • - ))} -
    -
    - ); - case FutureType.CONTRACT_DEPLOYMENT: - return ( -
    -

    Contract - {future.contractName}

    -

    Constructor Args

    -
      - {Object.entries(future.constructorArgs).map(([key, value]) => ( -
    • - {key} - {argumentTypeToString(value)} -
    • - ))} -
    -
    - ); - case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: - return ( -
    -

    Library - {future.contractName}

    -
    - ); - case FutureType.LIBRARY_DEPLOYMENT: - return ( -
    -

    Library - {future.contractName}

    -
    - ); - case FutureType.CONTRACT_CALL: - return ( -
    -

    Contract - {future.contract.contractName}

    -

    function - {future.functionName}

    -

    Args

    -
      - {Object.entries(future.args).map(([, value]) => ( -
    • {argumentTypeToString(value)}
    • - ))} -
    -
    - ); - case FutureType.STATIC_CALL: - return ( -
    -

    Contract - {future.contract.contractName}

    -

    function - {future.functionName}

    -

    Args

    -
      - {Object.entries(future.args).map(([, value]) => ( -
    • {argumentTypeToString(value)}
    • - ))} -
    -
    - ); - case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - return ( -
    -

    Contract - {future.contractName}

    -

    - Address -{" "} - {typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address)} -

    -
    - ); - - case FutureType.CONTRACT_AT: - return ( -
    -

    Contract - {future.contractName}

    -

    - Address -{" "} - {typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address)} -

    -
    - ); - case FutureType.READ_EVENT_ARGUMENT: - return ( -
    -

    Future - {future.futureToReadFrom.id}

    - {future.futureToReadFrom !== future.emitter ? ( -

    Emitter - {future.emitter.id}

    - ) : null} -

    Event - {future.eventName}

    -

    Event index - {future.eventIndex}

    -

    Argument - {future.nameOrIndex}

    -
    - ); - case FutureType.SEND_DATA: - return ( -
    -

    - To -{" "} - {typeof future.to === "string" - ? future.to - : isFuture(future.to) - ? future.to.id - : argumentTypeToString(future.to)} -

    -

    Data - {future.data}

    -
    - ); - } -}; diff --git a/packages/ui/src/pages/future-details/future-details.tsx b/packages/ui/src/pages/future-details/future-details.tsx deleted file mode 100644 index 5b0a220272..0000000000 --- a/packages/ui/src/pages/future-details/future-details.tsx +++ /dev/null @@ -1,34 +0,0 @@ -import { - IgnitionModule, - IgnitionModuleResult, -} from "@nomicfoundation/ignition-core/ui-helpers"; -import React, { useMemo } from "react"; -import { useParams } from "react-router-dom"; -import { Page } from "../../components/shared"; -import { getFutureById } from "../../queries/futures"; -import { FutureSummary } from "./components/future-summary"; - -export const FutureDetails: React.FC<{ - ignitionModule: IgnitionModule>; -}> = ({ ignitionModule }) => { - const { futureId } = useParams(); - - const future = useMemo( - () => getFutureById(ignitionModule, futureId), - [ignitionModule, futureId] - ); - - if (future === undefined) { - return ( - -

    Future not found

    -
    - ); - } - - return ( - - - - ); -}; diff --git a/packages/ui/src/pages/visualization-overview/components/action.tsx b/packages/ui/src/pages/visualization-overview/components/action.tsx deleted file mode 100644 index 8481730661..0000000000 --- a/packages/ui/src/pages/visualization-overview/components/action.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { - Future, - FutureType, - isFuture, -} from "@nomicfoundation/ignition-core/ui-helpers"; -import React, { useCallback } from "react"; -import { useNavigate } from "react-router-dom"; -import styled, { css } from "styled-components"; -import { argumentTypeToString } from "../../../utils/argumentTypeToString"; - -export const Action: React.FC<{ - future: Future; -}> = ({ future }) => { - const navigate = useNavigate(); - - const displayText = toDisplayText(future); - - const navigateToFuture = useCallback(() => { - return navigate(`/future/${encodeURIComponent(future.id)}`); - }, [future.id, navigate]); - - return ( - - {displayText} - - ); -}; - -function toDisplayText(future: Future): string { - switch (future.type) { - case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: - return `Contract deploy ${future.contractName}`; - case FutureType.CONTRACT_DEPLOYMENT: - return `Deploy contract ${future.contractName} from artifact`; - case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: - return `Library deploy ${future.contractName}`; - case FutureType.LIBRARY_DEPLOYMENT: - return `Library deploy ${future.contractName} from artifact`; - case FutureType.CONTRACT_CALL: - return `Call ${future.contract.contractName}/${future.functionName}`; - case FutureType.STATIC_CALL: - return `Static call ${future.contract.contractName}/${future.functionName}`; - case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - return `Existing contract ${future.contractName} (${ - typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address) - })`; - case FutureType.CONTRACT_AT: - return `Existing contract ${future.contractName} from artifact (${ - typeof future.address === "string" - ? future.address - : isFuture(future.address) - ? future.address.id - : argumentTypeToString(future.address) - })`; - case FutureType.READ_EVENT_ARGUMENT: - return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.nameOrIndex})`; - case FutureType.SEND_DATA: - return `Send data to ${ - typeof future.to === "string" - ? future.to - : isFuture(future.to) - ? future.to.id - : argumentTypeToString(future.to) - }`; - } -} - -const Text = styled.p` - margin: 0; -`; - -const ActionBtn = styled.div<{ futureType: FutureType }>` - border: 1px solid black; - padding: 1rem; - font-weight: bold; - - &:hover { - background: blue; - cursor: pointer; - } - - ${(props) => - [ - FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, - FutureType.CONTRACT_DEPLOYMENT, - FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, - FutureType.LIBRARY_DEPLOYMENT, - ].includes(props.futureType) && - css` - background: green; - color: white; - `} - - ${(props) => - [FutureType.CONTRACT_CALL, FutureType.STATIC_CALL].includes( - props.futureType - ) && - css` - background: yellow; - color: black; - `} -`; diff --git a/packages/ui/src/pages/visualization-overview/components/future-block.tsx b/packages/ui/src/pages/visualization-overview/components/future-block.tsx new file mode 100644 index 0000000000..72f158852f --- /dev/null +++ b/packages/ui/src/pages/visualization-overview/components/future-block.tsx @@ -0,0 +1,232 @@ +import { + ArgumentType, + Future, + FutureType, + isFuture, +} from "@nomicfoundation/ignition-core/ui-helpers"; +import React from "react"; +import styled, { css } from "styled-components"; +import { argumentTypeToString } from "../../../utils/argumentTypeToString"; + +export const FutureBlock: React.FC<{ + future: Future; + toggleState: Record; + setToggled: (id: string) => void; +}> = ({ future, toggleState, setToggled }) => { + const futureId = future.id; + const toggled = toggleState[futureId]; + + const displayText = toDisplayText(future); + + const fontWeight = toggled ? "normal" : "bold"; + + const isLibrary = + future.type === FutureType.LIBRARY_DEPLOYMENT || + future.type === FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; + + return ( + + {!isLibrary && ( + setToggled(futureId)} toggled={toggled} /> + )} + {displayText} + [{future.module.id}] + {toggled && ( + + )} + + ); +}; + +function toDisplayText(future: Future): string { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + return `Contract deploy ${future.id}`; + case FutureType.CONTRACT_DEPLOYMENT: + return `Deploy contract ${future.id} from artifact`; + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + return `Library deploy ${future.id}`; + case FutureType.LIBRARY_DEPLOYMENT: + return `Library deploy ${future.id} from artifact`; + case FutureType.CONTRACT_CALL: + return `Call ${future.id}`; + case FutureType.STATIC_CALL: + return `Static call ${future.id}`; + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + return `Existing contract ${future.id} (${ + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) + })`; + case FutureType.CONTRACT_AT: + return `Existing contract ${future.id} from artifact (${ + typeof future.address === "string" + ? future.address + : isFuture(future.address) + ? future.address.id + : argumentTypeToString(future.address) + })`; + case FutureType.READ_EVENT_ARGUMENT: + return `Read event from future ${future.futureToReadFrom.id} (event ${future.eventName} argument ${future.nameOrIndex})`; + case FutureType.SEND_DATA: + return `Send data ${future.id} to ${ + typeof future.to === "string" + ? future.to + : isFuture(future.to) + ? future.to.id + : argumentTypeToString(future.to) + }`; + } +} + +const Text = styled.div` + margin: 0; + display: inline; +`; + +const FutureBtn = styled.div<{ futureType: FutureType }>` + border: 1px solid black; + padding: 1rem; + font-weight: normal; + + ${(props) => + [ + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + FutureType.CONTRACT_DEPLOYMENT, + FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, + FutureType.LIBRARY_DEPLOYMENT, + ].includes(props.futureType) && + css` + background: green; + color: white; + `} + + ${(props) => + [FutureType.CONTRACT_CALL, FutureType.STATIC_CALL].includes( + props.futureType + ) && + css` + background: yellow; + color: black; + `} +`; + +const ToggleBtn: React.FC<{ + toggled: boolean; + setToggled: () => void; +}> = ({ toggled, setToggled }) => { + return ( + + {toggled ? "- " : "+ "} + + ); +}; + +const FutureDetailsSection: React.FC<{ + future: Future; + setToggled: (id: string) => void; +}> = ({ future, setToggled }) => { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.CONTRACT_DEPLOYMENT: + return ( +
    +

    Constructor Arguments

    +
      + {Object.entries(future.constructorArgs).map(([, arg]) => ( + + ))} +
    +
    + ); + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + return null; + case FutureType.CONTRACT_CALL: + return ( +
    +

    Arguments

    +
      + {Object.entries(future.args).map(([, arg]) => ( + + ))} +
    +
    + ); + case FutureType.STATIC_CALL: + return ( +
    +

    Arguments

    +
      + {Object.entries(future.args).map(([, arg]) => ( + + ))} +
    +
    + ); + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + case FutureType.CONTRACT_AT: + return ( +
    +

    Contract - {future.contractName}

    +

    + Address -{" "} + {typeof future.address === "string" ? ( + future.address + ) : ( + + )} +

    +
    + ); + case FutureType.READ_EVENT_ARGUMENT: + return ( +
    +

    Emitter - {future.emitter.id}

    +

    Event - {future.eventName}

    +

    Event index - {future.eventIndex}

    +

    Argument - {future.nameOrIndex}

    +
    + ); + case FutureType.SEND_DATA: + return ( +
    +

    + To -{" "} + {typeof future.to === "string" ? ( + future.to + ) : ( + + )} +

    +

    Data - {future.data}

    +
    + ); + } +}; + +const Argument: React.FC<{ + setToggled: (id: string) => void; + arg: ArgumentType; +}> = ({ setToggled, arg }) => { + if (isFuture(arg)) { + return ( +
  • setToggled(arg.id)} + > + {argumentTypeToString(arg)} +
  • + ); + } + return
  • {argumentTypeToString(arg)}
  • ; +}; diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx index f3e6213dd4..299f24f0c7 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-details.tsx @@ -1,12 +1,13 @@ import { + FutureType, IgnitionModule, IgnitionModuleResult, } from "@nomicfoundation/ignition-core/ui-helpers"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import styled from "styled-components"; import { Mermaid } from "../../../components/mermaid"; import { getAllFuturesForModule } from "../../../queries/futures"; -import { Action } from "./action"; +import { FutureBlock } from "./future-block"; export const VisualizationDetails: React.FC<{ ignitionModule: IgnitionModule>; @@ -16,6 +17,23 @@ export const VisualizationDetails: React.FC<{ [ignitionModule] ); + const toggleMap = Object.fromEntries( + futures + .filter( + ({ type }) => + type !== FutureType.LIBRARY_DEPLOYMENT && + type !== FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT + ) + .map(({ id }) => [id, false]) + ); + + const [toggleState, setToggledInternal] = useState(toggleMap); + + const setToggled = (id: string) => { + const newState = { ...toggleState, [id]: !toggleState[id] }; + setToggledInternal(newState); + }; + return (

    Visualization

    @@ -24,10 +42,15 @@ export const VisualizationDetails: React.FC<{
    -

    Actions

    +

    Futures

    {futures.map((future) => ( - + ))}
    diff --git a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx index 6f16006f93..7b9847d5d9 100644 --- a/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx +++ b/packages/ui/src/pages/visualization-overview/components/visualization-summary.tsx @@ -27,9 +27,8 @@ export const VisualizationSummary: React.FC<{

    - The successful completion of the deployment will send{" "} - {deployFutures.length + callFutures.length} - transactions: + The successful completion of the deployment will apply{" "} + {deployFutures.length + callFutures.length} updates on-chain:

    @@ -39,7 +38,7 @@ export const VisualizationSummary: React.FC<{
      {deployFutures.map((deploy) => (
    • - {deploy.contractName} ({deploy.module.id}) + {deploy.id}
    • ))}
    @@ -51,7 +50,9 @@ export const VisualizationSummary: React.FC<{

    {callFutures.length} calls

      {callFutures.map((call) => ( -
    • {call.id}
    • +
    • + {call.id} +
    • ))}
    @@ -63,15 +64,11 @@ export const VisualizationSummary: React.FC<{ const SummaryColumns = styled.div` display: grid; - grid-template-columns: 1fr 1fr 1fr; + grid-template-columns: 1fr 1fr; `; const SummaryColumn = styled.div` h4 { text-decoration: underline; } - - ul { - list-style-type: none; - } `; diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx index 0f2116ced9..ab940156cc 100644 --- a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -13,7 +13,7 @@ export const VisualizationOverview: React.FC<{ return (
    - Ignition - {ignitionModule.id} + Hardhat Ignition - {ignitionModule.id}
    diff --git a/packages/ui/src/queries/futures.ts b/packages/ui/src/queries/futures.ts index 897ed0dfe6..c1b8316624 100644 --- a/packages/ui/src/queries/futures.ts +++ b/packages/ui/src/queries/futures.ts @@ -32,11 +32,13 @@ export function getAllFuturesForModule({ futures, submodules, }: IgnitionModule>): Future[] { - return Array.from(futures).concat( - Array.from(submodules.values()).flatMap((submodule) => - getAllFuturesForModule(submodule) + return Array.from(futures) + .concat( + Array.from(submodules.values()).flatMap((submodule) => + getAllFuturesForModule(submodule) + ) ) - ); + .filter((v, i, a) => a.indexOf(v) === i); // remove duplicates } /** diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index a9695da872..b0cc7436f5 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -43,7 +43,7 @@ export function toMermaid( ), ].join("\n"); - return `flowchart BT\n\n${toEscapedId( + return `flowchart TB\n\n${toEscapedId( ignitionModule.id )}:::startModule\n\n${subgraphSections}${ futureDependencies === "" ? "" : "\n\n" + futureDependencies @@ -70,7 +70,7 @@ function prettyPrintModule( .map((f) => `${lineIndent}${toEscapedId(f.id)}["${toLabel(f)}"]`) .join(`\n${lineIndent}`); - return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction BT\n\n${lineIndent}${futureList}\n${lineIndent}end`; + return `${lineIndent}subgraph ${module.id}\n${lineIndent} direction TB\n\n${lineIndent}${futureList}\n${lineIndent}end`; } function toLabel(f: Future): string { @@ -84,9 +84,9 @@ function toLabel(f: Future): string { case FutureType.LIBRARY_DEPLOYMENT: return `Deploy library from artifact ${f.contractName}`; case FutureType.CONTRACT_CALL: - return `Call ${f.contract.contractName}/${f.functionName}`; + return `Call ${f.contract.contractName}.${f.functionName}`; case FutureType.STATIC_CALL: - return `Static call ${f.contract.contractName}/${f.functionName}`; + return `Static call ${f.contract.contractName}.${f.functionName}`; case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract ${f.contractName} (${ typeof f.address === "string" diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 6695dd4fa7..3a51ffa810 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -16,12 +16,12 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart BT + flowchart TB Module:::startModule subgraph Module - direction BT + direction TB Module#Contract1["Deploy Contract1"] end @@ -40,12 +40,12 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart BT + flowchart TB Test_registrar:::startModule subgraph Test_registrar - direction BT + direction TB Test_registrar#Contract1["Deploy Contract1"] end @@ -80,22 +80,22 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart BT + flowchart TB Module:::startModule subgraph Module - direction BT + direction TB Module#Contract3["Deploy Contract3"] end subgraph Submodule1 - direction BT + direction TB Submodule1#Contract1["Deploy Contract1"] end subgraph Submodule2 - direction BT + direction TB Submodule2#Contract2["Deploy Contract2"] end @@ -159,20 +159,20 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart BT + flowchart TB Module:::startModule subgraph Module - direction BT + direction TB Module#BasicContract["Deploy BasicContract"] Module#BasicLibrary["Deploy library BasicLibrary"] Module#BasicLibrary2["Deploy library from artifact BasicLibrary"] Module#ContractWithLibrary["Deploy from artifact ContractWithLibrary"] - Module#BasicContract.basicFunction["Call BasicContract/basicFunction"] + Module#BasicContract.basicFunction["Call BasicContract.basicFunction"] Module#BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"] - Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary/readonlyFunction"] + Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"] Module#BasicContract2["Existing contract BasicContract (Module#BasicContract)"] Module#ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"] Module#test_send["Send data to Module#BasicContract2"] @@ -203,16 +203,16 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart BT + flowchart TB Module:::startModule subgraph Module - direction BT + direction TB Module#ens["Deploy ens"] - Module#ens.setAddr_bytes32_address_["Call ens/setAddr(bytes32,address)"] - Module#ens.getAddr_bytes32_address_["Static call ens/getAddr(bytes32,address)"] + Module#ens.setAddr_bytes32_address_["Call ens.setAddr(bytes32,address)"] + Module#ens.getAddr_bytes32_address_["Static call ens.getAddr(bytes32,address)"] end Module#ens.setAddr_bytes32_address_ --> Module#ens From 076dc9b52ed38a21df0a7104fd394730c2269370 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 28 Sep 2023 15:31:01 -0400 Subject: [PATCH 0971/1302] bring back previous comment and use new.target.prototype instead --- packages/core/src/errors.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index bbf040de49..18d65d3796 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -59,7 +59,11 @@ export class IgnitionPluginError extends CustomError { constructor(pluginName: string, message: string) { super(message); this.pluginName = pluginName; - Object.setPrototypeOf(this, IgnitionPluginError.prototype); + + // This is required to allow calls to `resetStackFrom`, + // otherwise the function is not available on the + // error instance + Object.setPrototypeOf(this, new.target.prototype); } } From fa8fb08c52a0e2bfc26664ca035522710b09f54c Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 28 Sep 2023 15:32:18 +0000 Subject: [PATCH 0972/1302] Remove the only `new Error`. --- packages/core/src/internal/utils/adjacency-list.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/core/src/internal/utils/adjacency-list.ts b/packages/core/src/internal/utils/adjacency-list.ts index b8fa6b1ae4..5041d73405 100644 --- a/packages/core/src/internal/utils/adjacency-list.ts +++ b/packages/core/src/internal/utils/adjacency-list.ts @@ -1,3 +1,5 @@ +import { assertIgnitionInvariant } from "./assertions"; + export class AdjacencyList { /** * A mapping from futures to each futures dependencies. @@ -71,9 +73,10 @@ export class AdjacencyList { for (const dependent of dependents) { const toSet = this._list.get(dependent); - if (toSet === undefined) { - throw new Error("Dependency sets should be defined"); - } + assertIgnitionInvariant( + toSet !== undefined, + "Dependency sets should be defined" + ); const setWithoutFuture = new Set( [...toSet].filter((n) => n !== futureId) From 087e3b3372b2195116ec01e7c4c24978afd462cb Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 28 Sep 2023 15:33:18 +0000 Subject: [PATCH 0973/1302] Simplified error constructors --- packages/core/src/errors.ts | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 18d65d3796..bf632a0248 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -31,8 +31,6 @@ export class IgnitionError extends CustomError { ); super(prefix + formattedMessage); - - this.name = this.constructor.name; } } @@ -59,11 +57,6 @@ export class IgnitionPluginError extends CustomError { constructor(pluginName: string, message: string) { super(message); this.pluginName = pluginName; - - // This is required to allow calls to `resetStackFrom`, - // otherwise the function is not available on the - // error instance - Object.setPrototypeOf(this, new.target.prototype); } } @@ -85,11 +78,6 @@ export class NomicIgnitionPluginError extends IgnitionPluginError { } private readonly _isNomicIgnitionPluginError = true; - - constructor(pluginName: string, message: string) { - super(pluginName, message); - Object.setPrototypeOf(this, NomicIgnitionPluginError.prototype); - } } /** From ab5a824a0631d7aef6e411513a530532d4b395e0 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 28 Sep 2023 15:36:01 +0000 Subject: [PATCH 0974/1302] Add support for error causes --- packages/core/src/errors.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index bf632a0248..e4dd8f27f6 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -7,8 +7,8 @@ import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; * @alpha */ export class CustomError extends Error { - constructor(message: string) { - super(message); + constructor(message: string, cause?: Error) { + super(message, { cause }); this.name = this.constructor.name; } } @@ -22,7 +22,8 @@ export class CustomError extends Error { export class IgnitionError extends CustomError { constructor( errorDescriptor: ErrorDescriptor, - messageArguments: Record = {} + messageArguments: Record = {}, + cause?: Error ) { const prefix = `${getErrorCode(errorDescriptor)}: `; const formattedMessage = applyErrorMessageTemplate( @@ -30,7 +31,7 @@ export class IgnitionError extends CustomError { messageArguments ); - super(prefix + formattedMessage); + super(prefix + formattedMessage, cause); } } @@ -54,8 +55,8 @@ export class IgnitionPluginError extends CustomError { public readonly pluginName: string; - constructor(pluginName: string, message: string) { - super(message); + constructor(pluginName: string, message: string, cause?: Error) { + super(message, cause); this.pluginName = pluginName; } } From 39bfbb4b37ef7f0148db6b9e5517c80876756f29 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 20 Sep 2023 17:32:27 +0100 Subject: [PATCH 0975/1302] fix: allow undefined froms to pass reconciliation If a `from` is undefined on the first run, allow it to reconcile on the second run using the account that was selected during initialization of the future on the first run. This is only valid if the first run from account (the default sender on the first run) is still in the list of accounts. Fixes #413. --- .../reconciliation/helpers/reconcile-from.ts | 8 +++- .../futures/reconcileNamedContractCall.ts | 34 +++++++++++++++++ .../reconcileNamedContractDeployment.ts | 28 ++++++++++++++ .../futures/reconcileNamedStaticCall.ts | 37 +++++++++++++++++++ .../futures/reconcileSendData.ts | 25 +++++++++++++ 5 files changed, 130 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts index 287be15621..f9fe4e33a7 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts @@ -1,11 +1,11 @@ import { + ContractCallFuture, ContractDeploymentFuture, LibraryDeploymentFuture, - ContractCallFuture, NamedArtifactContractDeploymentFuture, NamedArtifactLibraryDeploymentFuture, - StaticCallFuture, SendDataFuture, + StaticCallFuture, } from "../../../types/module"; import { resolveFutureFrom } from "../../execution/future-processor/helpers/future-resolvers"; import { @@ -37,6 +37,10 @@ export function reconcileFrom( | StaticCallExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { + if (future.from === undefined && context.accounts.includes(exState.from)) { + return undefined; + } + const resolvedFrom = resolveFutureFrom( future.from, context.accounts, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index 37aa17c449..88cc138e84 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -94,6 +94,40 @@ describe("Reconciliation - named contract call", () => { ); }); + it("should reconcile when the from is undefined but the exState's from is in the accounts list", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [1, "a", contract1], { from: undefined }); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleContractCallState, + id: "Module#Contract1.function1", + futureType: FutureType.CONTRACT_CALL, + status: ExecutionStatus.SUCCESS, + functionName: "function1", + args: [1, "a", differentAddress], + from: exampleAccounts[2], + } + ) + ); + }); + it("should find changes to contract unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts index 7271abf4e2..3ba19a6b04 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -96,6 +96,34 @@ describe("Reconciliation - named contract", () => { ); }); + /** + * This test here is in a first run, the from is undefined and the defaultSender is used. + * On the second run the from is undefined but a different defaultSender is now in play. + * We say this should reconcile but the account from the first run should be used, as long + * as it is in the accounts list + */ + it("should reconcile where the future is undefined but the exState's from is in the accounts list", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + from: undefined, + }); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.STARTED, + contractName: "Contract", + from: exampleAccounts[3], + }) + ); + }); + it("should find changes to contract name unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("ContractChanged", [], { diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index 691ec4c33e..e8892a5483 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -95,6 +95,43 @@ describe("Reconciliation - named static call", () => { ); }); + it("should reconcile when the from is undefined but the exState's from is in the accounts list", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [1, "a"], 0, { + from: undefined, + }); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleStaticCallState, + id: "Module#Contract1.function1", + futureType: FutureType.STATIC_CALL, + status: ExecutionStatus.SUCCESS, + contractAddress: exampleAddress, + functionName: "function1", + args: [1, "a"], + from: exampleAccounts[4], + } + ) + ); + }); + it("should find changes to contract unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); diff --git a/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/core/test/reconciliation/futures/reconcileSendData.ts index 06dca8e5cd..6303f36582 100644 --- a/packages/core/test/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/reconciliation/futures/reconcileSendData.ts @@ -56,6 +56,31 @@ describe("Reconciliation - send data", () => { ); }); + /** + * This test here is in a first run, the from is undefined and the defaultSender is used. + * On the second run the from is undefined but a different defaultSender is now in play. + * We say this should reconcile but the account from the first run should be used, as long + * as it is in the accounts list. + */ + it("should reconcile where the future is undefined but the exState's from is in the accounts list", async () => { + const moduleDefinition = buildModule("Module", (m) => { + m.send("test_send", exampleAddress, 0n, "example_data", { + from: undefined, + }); + + return {}; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState({ + ...exampleSendState, + id: "Module#test_send", + status: ExecutionStatus.STARTED, + }) + ); + }); + it("should reconcile between undefined and 0x for data", async () => { const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", exampleAddress, 0n, undefined); From 422c821b15b10cb310771f6b49b93747caaa1525 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 20 Sep 2023 21:18:04 +0100 Subject: [PATCH 0976/1302] fix: display all deployed contracts The result was constrained to only those contracts returned by the module. It now returns all contracts and contractAts that have been deployed in this run and previous runs. The `ignition-helper` now takes the responsibility of resolving the modules results to contracts (and only the result contracts). Note the types have not been altered. Resolves #480. --- examples/ens/.gitignore | 1 + packages/core/src/internal/deployer.ts | 43 +++---------------- .../internal/views/find-deployed-contracts.ts | 24 ++++++----- .../hardhat-plugin/src/ignition-helper.ts | 8 ++-- 4 files changed, 24 insertions(+), 52 deletions(-) diff --git a/examples/ens/.gitignore b/examples/ens/.gitignore index 36077f2884..72d98e146d 100644 --- a/examples/ens/.gitignore +++ b/examples/ens/.gitignore @@ -7,3 +7,4 @@ typechain #Hardhat files cache artifacts +ignition/deployments diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 90dbf21644..2e8287e8d2 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -42,6 +42,7 @@ import { formatExecutionError } from "./formatters"; import { Reconciler } from "./reconciliation/reconciler"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; +import { findDeployedContracts } from "./views/find-deployed-contracts"; /** * Run an Igntition deployment. @@ -206,26 +207,17 @@ export class Deployer { IgnitionModuleResultsT extends IgnitionModuleResult >( deploymentState: DeploymentState, - module: IgnitionModule + _module: IgnitionModule ): Promise> { if (!this._isSuccessful(deploymentState)) { return this._getExecutionErrorResult(deploymentState); } + const deployedContracts = findDeployedContracts(deploymentState); + return { type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, - contracts: Object.fromEntries( - Object.entries(module.results).map(([name, contractFuture]) => [ - name, - { - id: contractFuture.id, - contractName: contractFuture.contractName, - address: getContractAddress( - deploymentState.executionStates[contractFuture.id] - ), - }, - ]) - ) as SuccessfulDeploymentResult< + contracts: deployedContracts as SuccessfulDeploymentResult< ContractNameT, IgnitionModuleResultsT >["contracts"], @@ -392,28 +384,3 @@ function canFail( exState.type === ExecutionSateType.STATIC_CALL_EXECUTION_STATE ); } - -// TODO: Does this exist somewhere else? -function getContractAddress(exState: ExecutionState): string { - assertIgnitionInvariant( - exState.type === ExecutionSateType.DEPLOYMENT_EXECUTION_STATE || - exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, - `Execution state ${exState.id} should be a deployment or contract at execution state` - ); - - assertIgnitionInvariant( - exState.status === ExecutionStatus.SUCCESS, - `Cannot get contract address from execution state ${exState.id} because it is not successful` - ); - - if (exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE) { - return exState.contractAddress; - } - - assertIgnitionInvariant( - exState.result?.type === ExecutionResultType.SUCCESS, - `Cannot get contract address from execution state ${exState.id} because it is not successful` - ); - - return exState.result.address; -} diff --git a/packages/core/src/internal/views/find-deployed-contracts.ts b/packages/core/src/internal/views/find-deployed-contracts.ts index 3d754d7f69..23da301ce5 100644 --- a/packages/core/src/internal/views/find-deployed-contracts.ts +++ b/packages/core/src/internal/views/find-deployed-contracts.ts @@ -9,14 +9,14 @@ import { import { assertIgnitionInvariant } from "../utils/assertions"; interface DeployedContract { - futureId: string; + id: string; contractName: string; - contractAddress: string; + address: string; } -export function findDeployedContracts( - deploymentState: DeploymentState -): DeployedContract[] { +export function findDeployedContracts(deploymentState: DeploymentState): { + [futureId: string]: DeployedContract; +} { return Object.values(deploymentState.executionStates) .filter( ( @@ -26,7 +26,11 @@ export function findDeployedContracts( exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE ) .filter((des) => des.status === ExecutionStatus.SUCCESS) - .map(_toDeployedContract); + .map(_toDeployedContract) + .reduce<{ [futureId: string]: DeployedContract }>((acc, contract) => { + acc[contract.id] = contract; + return acc; + }, {}); } function _toDeployedContract( @@ -41,16 +45,16 @@ function _toDeployedContract( ); return { - futureId: des.id, + id: des.id, contractName: des.contractName, - contractAddress: des.result.address, + address: des.result.address, }; } case ExecutionSateType.CONTRACT_AT_EXECUTION_STATE: { return { - futureId: des.id, + id: des.id, contractName: des.contractName, - contractAddress: des.contractAddress, + address: des.contractAddress, }; } } diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index 7a08621c0d..a0452d97b1 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -113,12 +113,12 @@ export class IgnitionHelper { > { return Object.fromEntries( await Promise.all( - Object.entries(result.contracts).map( - async ([name, deployedContract]) => [ + Object.entries(ignitionModule.results).map( + async ([name, contractFuture]) => [ name, await this._getContract( - ignitionModule.results[name], - deployedContract + contractFuture, + result.contracts[contractFuture.id] ), ] ) From bef4a8f4e8935a3c56c71e19a4570988e8556793 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 29 Sep 2023 11:28:36 +0100 Subject: [PATCH 0977/1302] refactor: change the success result type The success result no longer includes the type of the current modules results. The deploy result includes contracts from previous runs, hence the type is too restrictive. --- packages/core/src/deploy.ts | 2 +- packages/core/src/internal/deployer.ts | 14 ++++------- packages/core/src/types/deploy.ts | 24 +++++++++---------- packages/core/src/types/execution-events.ts | 3 +-- .../hardhat-plugin/src/ignition-helper.ts | 2 +- .../hardhat-plugin/src/ui/UiEventHandler.tsx | 5 ++-- .../components/execution/AddressResults.tsx | 10 ++------ .../ui/components/execution/FinalStatus.tsx | 3 +-- packages/hardhat-plugin/src/ui/types.ts | 7 ++---- 9 files changed, 25 insertions(+), 45 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index e05b32a2a9..d8aa3d73d3 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -58,7 +58,7 @@ export async function deploy< deploymentParameters: DeploymentParameters; accounts: string[]; defaultSender?: string; -}): Promise> { +}): Promise { if (executionEventListener !== undefined) { executionEventListener.setModuleId({ type: ExecutionEventType.SET_MODULE_ID, diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 2e8287e8d2..b644bfda79 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -10,7 +10,6 @@ import { ExecutionErrorDeploymentResult, PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, - SuccessfulDeploymentResult, } from "../types/deploy"; import { ExecutionEventListener, @@ -77,7 +76,7 @@ export class Deployer { deploymentParameters: DeploymentParameters, accounts: string[], defaultSender: string - ): Promise> { + ): Promise { let deploymentState = await this._getOrInitializeDeploymentState( ignitionModule.id ); @@ -208,7 +207,7 @@ export class Deployer { >( deploymentState: DeploymentState, _module: IgnitionModule - ): Promise> { + ): Promise { if (!this._isSuccessful(deploymentState)) { return this._getExecutionErrorResult(deploymentState); } @@ -217,10 +216,7 @@ export class Deployer { return { type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, - contracts: deployedContracts as SuccessfulDeploymentResult< - ContractNameT, - IgnitionModuleResultsT - >["contracts"], + contracts: deployedContracts, }; } @@ -277,9 +273,7 @@ export class Deployer { }); } - private _emitDeploymentCompleteEvent( - result: DeploymentResult> - ): void { + private _emitDeploymentCompleteEvent(result: DeploymentResult): void { if (this._executionEventListener === undefined) { return; } diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 26544f6323..576bae25fc 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -1,4 +1,4 @@ -import { IgnitionModuleResult, ModuleParameters } from "./module"; +import { ModuleParameters } from "./module"; /** * Configuration options for the deployment. @@ -35,15 +35,12 @@ export interface DeployConfig { * * @beta */ -export type DeploymentResult< - ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult -> = +export type DeploymentResult = | ValidationErrorDeploymentResult | ReconciliationErrorDeploymentResult | ExecutionErrorDeploymentResult | PreviousRunErrorDeploymentResult - | SuccessfulDeploymentResult; + | SuccessfulDeploymentResult; /** * The different kinds of results that a deployment can produce. @@ -174,22 +171,23 @@ export interface PreviousRunErrorDeploymentResult { * A deployment result where all of the futures of the module have completed * successfully. * + * The deployed contracts returned include the deployed contracts from previous + * runs. + * * @beta */ -export interface SuccessfulDeploymentResult< - ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult -> { +export interface SuccessfulDeploymentResult { type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT; /** * A map with the contracts returned by the deployed module. * - * The contracts can be the result of a deployment or a contractAt call. + * The contracts can be the result of a deployment or a contractAt call, + * in the current run and the previous runs */ contracts: { - [key in keyof IgnitionModuleResultsT]: { + [key: string]: { id: string; - contractName: IgnitionModuleResultsT[key]["contractName"]; + contractName: string; address: string; }; }; diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 45b47af802..91d478de8e 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -1,5 +1,4 @@ import { DeploymentResult } from "./deploy"; -import { IgnitionModuleResult } from "./module"; /** * Events emitted by the execution engine to allow tracking @@ -115,7 +114,7 @@ export interface BeginNextBatchEvent { */ export interface DeploymentCompleteEvent { type: ExecutionEventType.DEPLOYMENT_COMPLETE; - result: DeploymentResult>; + result: DeploymentResult; } /** diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin/src/ignition-helper.ts index a0452d97b1..be215a8389 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin/src/ignition-helper.ts @@ -104,7 +104,7 @@ export class IgnitionHelper { ContractNameT, IgnitionModuleResultsT >, - result: SuccessfulDeploymentResult + result: SuccessfulDeploymentResult ): Promise< IgnitionModuleResultsTToEthersContracts< ContractNameT, diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx index d64f32aa2f..0ce75bb639 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/UiEventHandler.tsx @@ -14,7 +14,6 @@ import { ExecutionEventListener, ExecutionEventResult, ExecutionEventResultType, - IgnitionModuleResult, NetworkInteractionRequestEvent, OnchainInteractionBumpFeesEvent, OnchainInteractionDroppedEvent, @@ -433,7 +432,7 @@ export class UiEventHandler implements ExecutionEventListener { private _applyResultToBatches( batches: UiBatches, - result: DeploymentResult> + result: DeploymentResult ): UiBatches { const newBatches: UiBatches = []; @@ -453,7 +452,7 @@ export class UiEventHandler implements ExecutionEventListener { private _hasUpdatedResult( futureId: string, - result: DeploymentResult> + result: DeploymentResult ): UiFuture | null { if (result.type !== DeploymentResultType.EXECUTION_ERROR) { return null; diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx index 451c2629f3..3d6f01c031 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx @@ -1,7 +1,4 @@ -import { - IgnitionModuleResult, - SuccessfulDeploymentResult, -} from "@nomicfoundation/ignition-core"; +import { SuccessfulDeploymentResult } from "@nomicfoundation/ignition-core"; import { Box, Spacer, Text } from "ink"; import { NetworkInfo } from "./NetworkInfo"; @@ -10,10 +7,7 @@ export const AddressResults = ({ contracts, chainId, }: { - contracts: SuccessfulDeploymentResult< - string, - IgnitionModuleResult - >["contracts"]; + contracts: SuccessfulDeploymentResult["contracts"]; chainId: number; }) => { return ( diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx index c64935741a..8bf52a237d 100644 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx @@ -1,7 +1,6 @@ import { DeploymentResultType, ExecutionErrorDeploymentResult, - IgnitionModuleResult, PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, SuccessfulDeploymentResult, @@ -73,7 +72,7 @@ export const FinalStatus = ({ state }: { state: UiState }) => { const SuccessfulResult: React.FC<{ moduleName: string; chainId: number; - result: SuccessfulDeploymentResult>; + result: SuccessfulDeploymentResult; }> = ({ moduleName, chainId, result }) => { return ( diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 7e6617c746..d14c195e0c 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -1,7 +1,4 @@ -import { - DeploymentResult, - IgnitionModuleResult, -} from "@nomicfoundation/ignition-core"; +import { DeploymentResult } from "@nomicfoundation/ignition-core"; export enum UiFutureStatusType { UNSTARTED = "UNSTARTED", @@ -60,7 +57,7 @@ export interface UiState { chainId: number | null; moduleName: string | null; batches: UiBatches; - result: DeploymentResult> | null; + result: DeploymentResult | null; warnings: string[]; } From fa5ecdf408ddcb7479e2021a86a981f6c9a8c0b1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 29 Sep 2023 11:28:36 +0100 Subject: [PATCH 0978/1302] feat: new simple ui Replace the ink based cli UI with a simpler console based ui. Resolves #495 --- package-lock.json | 447 +----------------- packages/hardhat-plugin/package.json | 9 +- packages/hardhat-plugin/src/index.ts | 18 +- .../src/ui/components/StartingPanel.tsx | 12 - .../components/execution/AddressResults.tsx | 28 -- .../components/execution/BatchExecution.tsx | 160 ------- .../components/execution/DeployParameters.tsx | 60 --- .../src/ui/components/execution/Divider.tsx | 15 - .../components/execution/ExecutionPanel.tsx | 37 -- .../ui/components/execution/FinalStatus.tsx | 220 --------- .../ui/components/execution/NetworkInfo.tsx | 11 - .../components/execution/SummarySection.tsx | 28 -- .../src/ui/components/execution/Warnings.tsx | 23 - .../src/ui/components/execution/views.ts | 16 - .../src/ui/components/index.tsx | 20 - .../src/ui/helpers/display-batch.ts | 60 +++ .../helpers/display-deploying-module-panel.ts | 19 + .../ui/helpers/display-deployment-complete.ts | 182 +++++++ .../src/ui/helpers/display-separator.ts | 3 + .../ui/helpers/display-starting-message.ts | 12 + ...entHandler.tsx => pretty-event-handler.ts} | 107 ++--- packages/hardhat-plugin/src/ui/types.ts | 1 + ...entHandler.ts => verbose-event-handler.ts} | 0 23 files changed, 340 insertions(+), 1148 deletions(-) delete mode 100644 packages/hardhat-plugin/src/ui/components/StartingPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/Divider.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx delete mode 100644 packages/hardhat-plugin/src/ui/components/execution/views.ts delete mode 100644 packages/hardhat-plugin/src/ui/components/index.tsx create mode 100644 packages/hardhat-plugin/src/ui/helpers/display-batch.ts create mode 100644 packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts create mode 100644 packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts create mode 100644 packages/hardhat-plugin/src/ui/helpers/display-separator.ts create mode 100644 packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts rename packages/hardhat-plugin/src/ui/{UiEventHandler.tsx => pretty-event-handler.ts} (86%) rename packages/hardhat-plugin/src/ui/{VerboseEventHandler.ts => verbose-event-handler.ts} (100%) diff --git a/package-lock.json b/package-lock.json index 664031b5f6..a30900cd1c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5667,11 +5667,6 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", "dev": true }, - "node_modules/@types/yoga-layout": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", - "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==" - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.31.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", @@ -6646,6 +6641,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, "engines": { "node": ">=8" } @@ -6677,17 +6673,6 @@ "node": ">= 4.0.0" } }, - "node_modules/auto-bind": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", - "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -7563,39 +7548,6 @@ "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -7660,21 +7612,6 @@ "node": ">=4" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -7742,17 +7679,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/code-excerpt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", - "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", - "dependencies": { - "convert-to-spaces": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", @@ -7982,14 +7908,6 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, - "node_modules/convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", - "engines": { - "node": ">= 4" - } - }, "node_modules/cookie": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", @@ -13059,158 +12977,6 @@ "dev": true, "peer": true }, - "node_modules/ink": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", - "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", - "dependencies": { - "ansi-escapes": "^4.2.1", - "auto-bind": "4.0.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", - "indent-string": "^4.0.0", - "is-ci": "^2.0.0", - "lodash": "^4.17.20", - "patch-console": "^1.0.0", - "react-devtools-core": "^4.19.1", - "react-reconciler": "^0.26.2", - "scheduler": "^0.20.2", - "signal-exit": "^3.0.2", - "slice-ansi": "^3.0.0", - "stack-utils": "^2.0.2", - "string-width": "^4.2.2", - "type-fest": "^0.12.0", - "widest-line": "^3.1.0", - "wrap-ansi": "^6.2.0", - "ws": "^7.5.5", - "yoga-layout-prebuilt": "^1.9.6" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": ">=16.8.0", - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/ink-spinner": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/ink-spinner/-/ink-spinner-4.0.3.tgz", - "integrity": "sha512-uJ4nbH00MM9fjTJ5xdw0zzvtXMkeGb0WV6dzSWvFv2/+ks6FIhpkt+Ge/eLdh0Ah6Vjw5pLMyNfoHQpRDRVFbQ==", - "dependencies": { - "cli-spinners": "^2.3.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "ink": ">=3.0.5", - "react": ">=16.8.2" - } - }, - "node_modules/ink/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ink/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ink/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ink/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/ink/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ink/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ink/node_modules/type-fest": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", - "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ink/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -13373,17 +13139,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", @@ -14224,7 +13979,8 @@ "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==" + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", @@ -16254,14 +16010,6 @@ "upper-case-first": "^1.1.0" } }, - "node_modules/patch-console": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", - "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", - "engines": { - "node": ">=10" - } - }, "node_modules/path-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", @@ -16858,15 +16606,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-devtools-core": { - "version": "4.27.8", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.27.8.tgz", - "integrity": "sha512-KwoH8/wN/+m5wTItLnsgVraGNmFrcTWR3k1VimP1HjtMMw4CNF+F5vg4S/0tzTEKIdpCi2R7mPNTC+/dswZMgw==", - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -16893,22 +16632,6 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "peer": true }, - "node_modules/react-reconciler": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", - "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "scheduler": "^0.20.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^17.0.2" - } - }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -17363,40 +17086,6 @@ "node": ">=8" } }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -17768,15 +17457,6 @@ "which": "bin/which" } }, - "node_modules/scheduler": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", - "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", @@ -18016,14 +17696,6 @@ "node": ">=8" } }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/shelljs": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", @@ -18070,7 +17742,8 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", @@ -18126,49 +17799,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/snake-case": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", @@ -18953,25 +18583,6 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" - } - }, "node_modules/stacktrace-parser": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", @@ -21375,17 +20986,6 @@ "node": ">=4" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -21447,6 +21047,7 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -21460,6 +21061,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -21474,6 +21076,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -21484,7 +21087,8 @@ "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/wrappy": { "version": "1.0.2", @@ -21682,17 +21286,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/yoga-layout-prebuilt": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", - "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", - "dependencies": { - "@types/yoga-layout": "1.9.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/z-schema": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", @@ -21867,13 +21460,7 @@ "debug": "^4.3.2", "ethers": "^6.7.0", "fs-extra": "^10.0.0", - "ink": "3.2.0", - "ink-spinner": "4.0.3", - "lodash.flattendeep": "^4.4.0", - "ndjson": "2.0.0", - "prompts": "^2.4.2", - "react": "18.2.0", - "serialize-error": "8.1.0" + "prompts": "^2.4.2" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", @@ -21890,7 +21477,6 @@ "@types/lodash.flattendeep": "^4.4.7", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", - "@types/ndjson": "2.0.1", "@types/node": "12.20.25", "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", @@ -22122,17 +21708,6 @@ "web-worker": "^1.2.0" } }, - "packages/hardhat-plugin/node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "packages/hardhat-plugin/node_modules/sinon": { "version": "14.0.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 893815ad7a..f70d8669b1 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -45,7 +45,6 @@ "@types/lodash.flattendeep": "^4.4.7", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", - "@types/ndjson": "2.0.1", "@types/node": "12.20.25", "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", @@ -82,12 +81,6 @@ "debug": "^4.3.2", "ethers": "^6.7.0", "fs-extra": "^10.0.0", - "ink": "3.2.0", - "ink-spinner": "4.0.3", - "lodash.flattendeep": "^4.4.0", - "ndjson": "2.0.0", - "prompts": "^2.4.2", - "react": "18.2.0", - "serialize-error": "8.1.0" + "prompts": "^2.4.2" } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 546cb09e2b..db5d33d994 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -8,6 +8,9 @@ import path from "path"; import "./type-extensions"; +/* ignition config defaults */ +const IGNITION_DIR = "ignition"; + // this is ugly, but it's fast :) // discussion: https://github.com/NomicFoundation/hardhat-ignition/pull/483 export const buildModule: typeof import("@nomicfoundation/ignition-core").buildModule = @@ -18,9 +21,6 @@ export const buildModule: typeof import("@nomicfoundation/ignition-core").buildM return coreBuildModule(...args); }; -/* ignition config defaults */ -const IGNITION_DIR = "ignition"; - extendConfig((config, userConfig) => { /* setup path configs */ const userPathsConfig = userConfig.paths ?? {}; @@ -85,8 +85,11 @@ task("deploy") "./hardhat-artifact-resolver" ); const { loadModule } = await import("./load-module"); - const { UiEventHandler } = await import("./ui/UiEventHandler"); - const { VerboseEventHandler } = await import("./ui/VerboseEventHandler"); + + const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); + const { VerboseEventHandler } = await import( + "./ui/verbose-event-handler" + ); const chainId = Number( await hre.network.provider.request({ @@ -147,7 +150,7 @@ task("deploy") const executionEventListener = simpleTextUi ? new VerboseEventHandler() - : new UiEventHandler(parameters); + : new PrettyEventHandler(); try { await deploy({ @@ -161,9 +164,6 @@ task("deploy") accounts, }); } catch (e) { - if (executionEventListener instanceof UiEventHandler) { - executionEventListener.unmountCli(); - } throw e; } } diff --git a/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx b/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx deleted file mode 100644 index 0a1b247973..0000000000 --- a/packages/hardhat-plugin/src/ui/components/StartingPanel.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { Box, Text } from "ink"; -import Spinner from "ink-spinner"; - -export const StartingPanel = () => { - return ( - - - Ignition starting - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx b/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx deleted file mode 100644 index 3d6f01c031..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/AddressResults.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { SuccessfulDeploymentResult } from "@nomicfoundation/ignition-core"; -import { Box, Spacer, Text } from "ink"; - -import { NetworkInfo } from "./NetworkInfo"; - -export const AddressResults = ({ - contracts, - chainId, -}: { - contracts: SuccessfulDeploymentResult["contracts"]; - chainId: number; -}) => { - return ( - - - Deployed Addresses - - - - - {Object.values(contracts).map((contract) => ( - - {contract.id} {`->`} {contract.address} - - ))} - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx b/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx deleted file mode 100644 index 16b028c46b..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/BatchExecution.tsx +++ /dev/null @@ -1,160 +0,0 @@ -import { Box, Text } from "ink"; -import Spinner from "ink-spinner"; - -import { - UiFuture, - UiFutureStatusType, - UiState, - UiStateDeploymentStatus, -} from "../../types"; - -import { Divider } from "./Divider"; - -export const BatchExecution = ({ state }: { state: UiState }) => { - const isComplete = state.status === UiStateDeploymentStatus.COMPLETE; - - return ( - <> - - - - {isComplete ? ( - Execution complete - ) : ( - - Executing - - )} - - - {state.batches - .filter((batch, i) => isBatchDisplayable(batch, i)) - .map((batch, i) => ( - - ))} - - ); -}; - -const Batch = ({ batch, index }: { batch: UiFuture[]; index: number }) => { - const borderColor = resolveBatchBorderColor(batch); - - return ( - - - #{index} - - - {batch.map((future, i) => ( - - ))} - - ); -}; - -const Future = ({ future }: { future: UiFuture }) => { - const { borderColor, borderStyle, textColor } = resolveFutureColors(future); - - return ( - - - {future.futureId} - - ); -}; - -const StatusBadge = ({ future }: { future: UiFuture }) => { - let badge: any = " "; - switch (future.status.type) { - case UiFutureStatusType.UNSTARTED: - badge = ; - break; - case UiFutureStatusType.SUCCESS: - badge = ; - break; - case UiFutureStatusType.PENDING: - badge = 🔶; - break; - case UiFutureStatusType.ERRORED: - badge = ; - break; - case UiFutureStatusType.HELD: - badge = 🔶; - break; - } - - return ( - <> - - {badge} - - - ); -}; - -function resolveBatchBorderColor(futures: UiFuture[]) { - if (futures.some((v) => v.status.type === UiFutureStatusType.UNSTARTED)) { - return "lightgray"; - } - - if (futures.some((v) => v.status.type === UiFutureStatusType.ERRORED)) { - return "red"; - } - - if (futures.some((v) => v.status.type === UiFutureStatusType.PENDING)) { - return "yellow"; - } - - if (futures.every((v) => v.status.type === UiFutureStatusType.SUCCESS)) { - return "green"; - } - - return "lightgray"; -} - -function resolveFutureColors(future: UiFuture): { - borderColor: string; - borderStyle: "single" | "classic" | "bold" | "singleDouble"; - textColor: string; -} { - switch (future.status.type) { - case UiFutureStatusType.UNSTARTED: - return { - borderColor: "lightgray", - borderStyle: "singleDouble", - textColor: "white", - }; - case UiFutureStatusType.SUCCESS: - return { - borderColor: "greenBright", - borderStyle: "single", - textColor: "white", - }; - case UiFutureStatusType.PENDING: - return { - borderColor: "yellow", - borderStyle: "bold", - textColor: "white", - }; - case UiFutureStatusType.ERRORED: - return { - borderColor: "redBright", - borderStyle: "bold", - textColor: "white", - }; - case UiFutureStatusType.HELD: - return { - borderColor: "yellow", - borderStyle: "bold", - textColor: "white", - }; - } -} - -function isBatchDisplayable(batch: UiFuture[], index: number): boolean { - if (index === 0) { - return true; - } - - return batch.some((v) => v.status.type !== UiFutureStatusType.UNSTARTED); -} diff --git a/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx b/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx deleted file mode 100644 index 941908b0e1..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/DeployParameters.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import type { - DeploymentParameters, - ModuleParameters, -} from "@nomicfoundation/ignition-core"; - -import { Newline, Text } from "ink"; - -export const DeployParameters = ({ - deployParams, -}: { - deployParams?: DeploymentParameters; -}) => { - if (deployParams === undefined) { - return null; - } - - const entries = Object.entries(deployParams); - - if (entries.length === 0) { - return null; - } - - const params = entries.map(([moduleId, moduleParams]) => { - return ( - - - Module: {moduleId} - - - - - - ); - }); - - return ( - - Deployment parameters: - - {...params} - - ); -}; - -const ModuleParams = ({ moduleParams }: { moduleParams: ModuleParameters }) => { - const entries = Object.entries(moduleParams); - - const params = entries.map(([paramId, paramValue]) => { - return ( - - - {paramId}: {JSON.stringify(paramValue)} - - - - ); - }); - - return {...params}; -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx b/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx deleted file mode 100644 index b4a26f474c..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/Divider.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Box, Text } from "ink"; - -export const Divider = () => { - return ( - - - - {Array.from({ length: 400 }) - .map((_i) => "─") - .join("")} - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx b/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx deleted file mode 100644 index b509dd78ae..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/ExecutionPanel.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import type { DeploymentParameters } from "@nomicfoundation/ignition-core"; - -import { Box } from "ink"; - -import { UiState } from "../../types"; - -import { BatchExecution } from "./BatchExecution"; -import { FinalStatus } from "./FinalStatus"; -import { SummarySection } from "./SummarySection"; -import { Warnings } from "./Warnings"; -import { viewEverythingExecutedAlready } from "./views"; - -export const ExecutionPanel = ({ - state, - deployParams, -}: { - state: UiState; - deployParams?: DeploymentParameters; -}) => { - if (viewEverythingExecutedAlready(state)) { - return ( - - {state.warnings.length > 0 && } - - - ); - } - - return ( - - - {state.warnings.length > 0 && } - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx b/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx deleted file mode 100644 index 8bf52a237d..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/FinalStatus.tsx +++ /dev/null @@ -1,220 +0,0 @@ -import { - DeploymentResultType, - ExecutionErrorDeploymentResult, - PreviousRunErrorDeploymentResult, - ReconciliationErrorDeploymentResult, - SuccessfulDeploymentResult, - ValidationErrorDeploymentResult, -} from "@nomicfoundation/ignition-core"; -import { Box, Newline, Text } from "ink"; - -import { UiState } from "../../types"; - -import { AddressResults } from "./AddressResults"; -import { Divider } from "./Divider"; - -export const FinalStatus = ({ state }: { state: UiState }) => { - if (state.result === null) { - return null; - } - - switch (state.result.type) { - case DeploymentResultType.VALIDATION_ERROR: { - return ( - - ); - } - case DeploymentResultType.RECONCILIATION_ERROR: { - return ( - - ); - } - case DeploymentResultType.EXECUTION_ERROR: { - return ( - - ); - } - case DeploymentResultType.PREVIOUS_RUN_ERROR: { - return ( - - ); - } - case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { - return ( - - ); - } - } -}; - -const SuccessfulResult: React.FC<{ - moduleName: string; - chainId: number; - result: SuccessfulDeploymentResult; -}> = ({ moduleName, chainId, result }) => { - return ( - - - - - 🚀 Deployment Complete for module{" "} - {moduleName} - - - - - - - ); -}; - -const ErrorResult: React.FC<{ - moduleName: string; - chainId: number; - message: string; - result: ReconciliationErrorDeploymentResult | ValidationErrorDeploymentResult; -}> = ({ moduleName, message, result }) => { - return ( - - - - - ⛔ {message} {moduleName} - - - - - - {Object.entries(result.errors).map(([futureId, futureErrors]) => ( - - {futureId} errors: - - {futureErrors.map((error, i) => ( - - {" "} - - {error} - - - ))} - - ))} - - - - - ); -}; - -const ExecutionErrorResult: React.FC<{ - moduleName: string; - chainId: number; - result: ExecutionErrorDeploymentResult; -}> = ({ moduleName, result }) => { - return ( - - - - - ⛔ Execution failed for module {moduleName} - - - - - - {result.timedOut.length > 0 && ( - - - Timed Out: - - - {result.timedOut.map(({ futureId, networkInteractionId }) => ( - - - {futureId}/{networkInteractionId} - - ))} - - )} - - {result.failed.length > 0 && ( - - - Failed: - - - - {result.failed.map(({ futureId, networkInteractionId, error }) => ( - - - {futureId}/{networkInteractionId}: {error} - - ))} - - )} - - - - - ); -}; - -const PreviousRunErrorResult: React.FC<{ - moduleName: string; - chainId: number; - result: PreviousRunErrorDeploymentResult; -}> = ({ moduleName, result }) => { - return ( - - - - - ⛔ Deployment cancelled due to failed or timed out futures on a previous - run of module {moduleName}. - - - - - - - These futures will need to be rerun; use the `wipe` task to reset - them: - - - {Object.entries(result.errors).map(([futureId, futureErrors]) => ( - - {futureId} - {futureErrors.map((error, i) => ( - - {" "} - - {error} - - - ))} - - ))} - - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx b/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx deleted file mode 100644 index a7eb0ba35b..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/NetworkInfo.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { Text } from "ink"; - -export const NetworkInfo = ({ - networkInfo: { chainId }, -}: { - networkInfo: { - chainId: number; - }; -}) => { - return Chain ID: {chainId}; -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx b/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx deleted file mode 100644 index fbcd01e37b..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/SummarySection.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { DeploymentParameters } from "@nomicfoundation/ignition-core"; -import { Box, Spacer, Text } from "ink"; - -import { UiState } from "../../types"; - -import { DeployParameters } from "./DeployParameters"; -import { NetworkInfo } from "./NetworkInfo"; - -export const SummarySection = ({ - state: { chainId, moduleName }, - deployParams, -}: { - state: UiState; - deployParams?: DeploymentParameters; -}) => { - return ( - - - - Deploying module {moduleName} - - - - - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx b/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx deleted file mode 100644 index ad67483d2c..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/Warnings.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import { Box, Newline, Text } from "ink"; - -import { UiState } from "../../types"; - -export const Warnings = ({ state: { warnings } }: { state: UiState }) => { - return ( - <> - - - Warning, deployment missing previously executed futures: - - - - {...warnings.map((warning) => - {warning})} - - - ); -}; diff --git a/packages/hardhat-plugin/src/ui/components/execution/views.ts b/packages/hardhat-plugin/src/ui/components/execution/views.ts deleted file mode 100644 index 3dd1ca2566..0000000000 --- a/packages/hardhat-plugin/src/ui/components/execution/views.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { UiState, UiStateDeploymentStatus } from "../../types"; - -/** - * Determine whether any on-chain executions happened in this - * run. An execution that requires on-chain updates in this - * run will have batches, a lack of batches indicates nothing - * to execute or execution happened on a previous run. - * @param state the deploy state - * @returns whether on-chain executions happened in this run - */ -export function viewEverythingExecutedAlready(state: UiState): boolean { - return ( - state.status !== UiStateDeploymentStatus.UNSTARTED && - state.batches.length === 0 - ); -} diff --git a/packages/hardhat-plugin/src/ui/components/index.tsx b/packages/hardhat-plugin/src/ui/components/index.tsx deleted file mode 100644 index 930a0ece7b..0000000000 --- a/packages/hardhat-plugin/src/ui/components/index.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import type { DeploymentParameters } from "@nomicfoundation/ignition-core"; - -import { UiState, UiStateDeploymentStatus } from "../types"; - -import { StartingPanel } from "./StartingPanel"; -import { ExecutionPanel } from "./execution/ExecutionPanel"; - -export const IgnitionUi = ({ - state, - deployParams, -}: { - state: UiState; - deployParams?: DeploymentParameters; -}) => { - if (state.status === UiStateDeploymentStatus.UNSTARTED) { - return ; - } - - return ; -}; diff --git a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts new file mode 100644 index 0000000000..008f132442 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts @@ -0,0 +1,60 @@ +import { UiFuture, UiFutureStatusType, UiState } from "../types"; + +export function redisplayBatch(state: UiState): void { + if (state.currentBatch === 0) { + return; + } + + const batch = state.batches[state.currentBatch - 1]; + const panelHeight = batch.length + 3; + + process.stdout.moveCursor(0, -panelHeight); + process.stdout.clearScreenDown(); + + displayBatch(state); +} + +/** + * Display the current batch. + * + * @param state - the UI state + * @param clearCurrent - whether to write over the current batch + */ +export function displayBatch(state: UiState): void { + if (state.currentBatch === 0) { + return; + } + + const batch = state.batches[state.currentBatch - 1]; + + console.log(`Batch #${state.currentBatch}`); + console.log(""); + + for (const future of batch.sort((a, b) => + a.futureId.localeCompare(b.futureId) + )) { + console.log(_futureStatus(future)); + } + + console.log(""); +} + +function _futureStatus(future: UiFuture): string { + switch (future.status.type) { + case UiFutureStatusType.UNSTARTED: { + return ` 🔄 ${future.futureId} running ...`; + } + case UiFutureStatusType.SUCCESS: { + return ` ✅ ${future.futureId} success`; + } + case UiFutureStatusType.PENDING: { + return ` ⏳ ${future.futureId} timed out`; + } + case UiFutureStatusType.ERRORED: { + return ` ⛔ ${future.futureId} failed`; + } + case UiFutureStatusType.HELD: { + return ` ⏳ ${future.futureId} held`; + } + } +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts new file mode 100644 index 0000000000..09a0053601 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts @@ -0,0 +1,19 @@ +import chalk from "chalk"; + +import { UiState } from "../types"; + +import { displaySeparator } from "./display-separator"; + +export function displayDeployingModulePanel(state: UiState) { + process.stdout.clearLine(0); + process.stdout.cursorTo(0); + console.log(""); + console.log( + chalk.bold( + `Deploying module ${chalk.italic(state.moduleName ?? "unknown")}` + ) + ); + console.log(""); + displaySeparator(); + console.log(""); +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts new file mode 100644 index 0000000000..3fb9ad15be --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts @@ -0,0 +1,182 @@ +import { + DeploymentCompleteEvent, + DeploymentResultType, + ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + SuccessfulDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; + +import { UiState } from "../types"; + +export function displayDeploymentComplete( + state: UiState, + event: DeploymentCompleteEvent +) { + switch (event.result.type) { + case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { + _displaySuccessfulDeployment(state, event.result); + break; + } + case DeploymentResultType.VALIDATION_ERROR: { + _displayValidationErrors(state, event.result); + break; + } + case DeploymentResultType.RECONCILIATION_ERROR: { + _displayReconciliationErrors(state, event.result); + break; + } + case DeploymentResultType.PREVIOUS_RUN_ERROR: { + _displayPreviousRunErrors(state, event.result); + break; + } + case DeploymentResultType.EXECUTION_ERROR: { + _displayExecutionErrors(state, event.result); + break; + } + } +} + +function _displaySuccessfulDeployment( + state: UiState, + result: SuccessfulDeploymentResult +) { + console.log(""); + console.log( + chalk.bold( + `🚀 Deployment Complete for module ${chalk.italic( + state.moduleName ?? "unknown" + )}` + ) + ); + console.log(""); + console.log("Deployed Addresses"); + console.log(""); + + for (const contract of Object.values(result.contracts)) { + console.log(`${contract.id} - ${contract.address}`); + } +} + +function _displayValidationErrors( + state: UiState, + result: ValidationErrorDeploymentResult +) { + console.log(""); + console.log( + chalk.bold( + `⛔ Validation failed for module ${chalk.italic( + state.moduleName ?? "unknown" + )}` + ) + ); + console.log(""); + + for (const [futureId, errors] of Object.entries(result.errors)) { + console.log(`${chalk.bold(futureId)} errors:`); + console.log(""); + + for (const error of errors) { + console.log(` - ${error}`); + } + + console.log(""); + } +} + +function _displayReconciliationErrors( + state: UiState, + result: ReconciliationErrorDeploymentResult +) { + console.log(""); + console.log( + chalk.bold( + `⛔ Reconciliation failed for module ${chalk.italic( + state.moduleName ?? "unknown" + )}` + ) + ); + console.log(""); + + for (const [futureId, errors] of Object.entries(result.errors)) { + console.log(`${chalk.bold(futureId)} errors:`); + console.log(""); + + for (const error of errors) { + console.log(` - ${error}`); + } + + console.log(""); + } +} + +function _displayPreviousRunErrors( + state: UiState, + result: PreviousRunErrorDeploymentResult +) { + console.log(""); + console.log( + chalk.bold( + `⛔ Deployment cancelled due to failed or timed out futures on a previous run of module ${chalk.italic( + state.moduleName ?? "unknown" + )}` + ) + ); + console.log(""); + console.log( + `These futures will need to be rerun; use the ${chalk.italic( + "wipe" + )} task to reset them:` + ); + console.log(""); + + for (const [futureId] of Object.entries(result.errors)) { + console.log(` - ${futureId}`); + } +} + +function _displayExecutionErrors( + state: UiState, + result: ExecutionErrorDeploymentResult +) { + console.log(""); + console.log( + chalk.bold( + `⛔ Execution failed for module ${chalk.italic( + state.moduleName ?? "unknown" + )}` + ) + ); + console.log(""); + + if (result.timedOut.length > 0) { + console.log(chalk.yellow("Timed out:")); + console.log(""); + + for (const { futureId } of Object.values(result.timedOut)) { + console.log(` - ${futureId}`); + } + } + + if (result.failed.length > 0) { + console.log(chalk.red("Failures:")); + console.log(""); + + for (const { futureId, networkInteractionId, error } of Object.values( + result.failed + )) { + console.log(` - ${futureId}/${networkInteractionId}: ${error}`); + } + } + + if (result.held.length > 0) { + console.log(chalk.yellow("Held:")); + console.log(""); + + for (const { futureId, heldId, reason } of Object.values(result.held)) { + console.log(` - ${futureId}/${heldId}: ${reason}`); + } + } +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-separator.ts b/packages/hardhat-plugin/src/ui/helpers/display-separator.ts new file mode 100644 index 0000000000..b29d3f973a --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/display-separator.ts @@ -0,0 +1,3 @@ +export function displaySeparator() { + console.log("─".repeat(Math.min(process.stdout.columns ?? 80))); +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts b/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts new file mode 100644 index 0000000000..bdc2f9fc6f --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts @@ -0,0 +1,12 @@ +import { UiState } from "../types"; + +/** + * Display the temporary starting message. Note this does not print a newline. + * + * @param state - the UI state + */ +export function displayStartingMessage(state: UiState) { + process.stdout.write( + `Ignition starting for module ${state.moduleName ?? "unknown"}...` + ); +} diff --git a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts similarity index 86% rename from packages/hardhat-plugin/src/ui/UiEventHandler.tsx rename to packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 0ce75bb639..884b044764 100644 --- a/packages/hardhat-plugin/src/ui/UiEventHandler.tsx +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -32,10 +32,12 @@ import { TransactionSendEvent, WipeApplyEvent, } from "@nomicfoundation/ignition-core"; -import { HardhatPluginError } from "hardhat/plugins"; -import { render } from "ink"; -import { IgnitionUi } from "./components"; +import { displayBatch, redisplayBatch } from "./helpers/display-batch"; +import { displayDeployingModulePanel } from "./helpers/display-deploying-module-panel"; +import { displayDeploymentComplete } from "./helpers/display-deployment-complete"; +import { displaySeparator } from "./helpers/display-separator"; +import { displayStartingMessage } from "./helpers/display-starting-message"; import { UiBatches, UiFuture, @@ -47,26 +49,13 @@ import { UiStateDeploymentStatus, } from "./types"; -interface RenderState { - rerender: null | ((node: React.ReactNode) => void); - unmount: null | (() => void); - waitUntilExit: null | (() => Promise); - clear: null | (() => void); -} - -export class UiEventHandler implements ExecutionEventListener { - private _renderState: RenderState = { - rerender: null, - unmount: null, - waitUntilExit: null, - clear: null, - }; - +export class PrettyEventHandler implements ExecutionEventListener { private _uiState: UiState = { status: UiStateDeploymentStatus.UNSTARTED, chainId: null, moduleName: null, batches: [], + currentBatch: 0, result: null, warnings: [], }; @@ -79,8 +68,16 @@ export class UiEventHandler implements ExecutionEventListener { public set state(uiState: UiState) { this._uiState = uiState; + } + + public deploymentStart(event: DeploymentStartEvent): void { + this.state = { + ...this.state, + status: UiStateDeploymentStatus.DEPLOYING, + moduleName: event.moduleName, + }; - this._renderToCli(); + displayStartingMessage(this.state); } public runStart(event: RunStartEvent): void { @@ -88,6 +85,20 @@ export class UiEventHandler implements ExecutionEventListener { ...this.state, chainId: event.chainId, }; + + displayDeployingModulePanel(this.state); + } + + public beginNextBatch(_event: BeginNextBatchEvent): void { + // rerender the previous batch + redisplayBatch(this.state); + + this.state = { + ...this.state, + currentBatch: this.state.currentBatch + 1, + }; + + displayBatch(this.state); } public wipeApply(event: WipeApplyEvent): void { @@ -141,6 +152,8 @@ export class UiEventHandler implements ExecutionEventListener { ...this.state, batches: this._applyUpdateToBatchFuture(updatedFuture), }; + + redisplayBatch(this.state); } public callExecutionStateInitialize( @@ -315,23 +328,23 @@ export class UiEventHandler implements ExecutionEventListener { _event: OnchainInteractionTimeoutEvent ): void {} - public deploymentStart(event: DeploymentStartEvent): void { - this.state = { - ...this.state, - status: UiStateDeploymentStatus.DEPLOYING, - moduleName: event.moduleName, - }; - } - - public beginNextBatch(_event: BeginNextBatchEvent): void {} - public deploymentComplete(event: DeploymentCompleteEvent): void { + const originalStatus = this.state.status; + this.state = { ...this.state, status: UiStateDeploymentStatus.COMPLETE, result: event.result, batches: this._applyResultToBatches(this.state.batches, event.result), }; + + if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { + redisplayBatch(this.state); + + displaySeparator(); + } + + displayDeploymentComplete(this.state, event); } public reconciliationWarnings(event: ReconciliationWarningsEvent): void { @@ -348,42 +361,6 @@ export class UiEventHandler implements ExecutionEventListener { }; } - public unmountCli(): void { - if ( - this._renderState.unmount === null || - this._renderState.waitUntilExit === null || - this._renderState.clear === null - ) { - throw new HardhatPluginError( - "hardhat-ignition", - "Cannot unmount with no unmount function" - ); - } - - this._renderState.clear(); - this._renderState.unmount(); - } - - private _renderToCli(): void { - if (this._renderState.rerender === null) { - const { rerender, unmount, waitUntilExit, clear } = render( - , - { patchConsole: false } - ); - - this._renderState.rerender = rerender; - this._renderState.unmount = unmount; - this._renderState.waitUntilExit = waitUntilExit; - this._renderState.clear = clear; - - return; - } - - this._renderState.rerender( - - ); - } - private _applyUpdateToBatchFuture(updatedFuture: UiFuture): UiBatches { const batches: UiBatches = []; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index d14c195e0c..864c3d2b85 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -57,6 +57,7 @@ export interface UiState { chainId: number | null; moduleName: string | null; batches: UiBatches; + currentBatch: number; result: DeploymentResult | null; warnings: string[]; } diff --git a/packages/hardhat-plugin/src/ui/VerboseEventHandler.ts b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/VerboseEventHandler.ts rename to packages/hardhat-plugin/src/ui/verbose-event-handler.ts From 509844564cfe48fd717b1d7ecd5f192081993d2a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Sep 2023 20:01:09 -0400 Subject: [PATCH 0979/1302] add section to the docs discussing source control tradeoffs --- docs/running-a-deployment.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 5cc484a027..27b1f064b3 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -7,6 +7,7 @@ - [Visualizing your deployment with the `visualize` task](./running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) - [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - [Configuration options](./running-a-deployment.md#configuration-options) +- [Source control for deployments](./running-a-deployment.md#source-control-for-deployments) --- @@ -107,6 +108,12 @@ The value of `requiredConfirmations` is the number of blocks after a transaction --- +## Source control for deployments + +Ignition creates several files when a deployment is run. You may want to commit some or all of these files to source control. + +While committing the entire `deployments` directory is the recommended approach, there are some reasons why you may want to commit only some of the files: namely, repo bloat. The `deployments` directory can grow quite large, especially if you are deploying to multiple networks. At the very least, you should commit the `deployed_addresses.json` file found within each deployment directory. This file contains the addresses of all contracts deployed by the module. + Submodule1#Contract1 Module#Contract3 --> Submodule2#Contract2 Module -.-> Submodule1 - Module -.-> Submodule2 - - classDef startModule stroke-width:4px`; + Module -.-> Submodule2`; assertDiagram(moduleDefinition, expectedResult); }); @@ -161,9 +225,15 @@ describe("to-mermaid", () => { const expectedResult = testFormat` flowchart TB - Module:::startModule + Module + + subgraph Module[ ] + direction TB - subgraph Module + subgraph ModulePadding["[ Module ]"] + direction TB + + subgraph ModuleInner[ ] direction TB Module#BasicContract["Deploy BasicContract"] @@ -178,6 +248,14 @@ describe("to-mermaid", () => { Module#test_send["Send data to Module#BasicContract2"] end + style ModuleInner fill:none,stroke:none + end + + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7 + Module#ContractWithLibrary --> Module#BasicLibrary Module#BasicContract.basicFunction --> Module#BasicContract Module#BasicContract.BasicEvent.eventArg.0 --> Module#BasicContract.basicFunction @@ -185,9 +263,7 @@ describe("to-mermaid", () => { Module#ContractWithLibrary.readonlyFunction --> Module#BasicContract.BasicEvent.eventArg.0 Module#BasicContract2 --> Module#BasicContract Module#ContractWithLibrary2 --> Module#ContractWithLibrary - Module#test_send --> Module#BasicContract2 - - classDef startModule stroke-width:4px`; + Module#test_send --> Module#BasicContract2`; assertDiagram(moduleDefinition, expectedResult); }); @@ -205,9 +281,15 @@ describe("to-mermaid", () => { const expectedResult = testFormat` flowchart TB - Module:::startModule + Module + + subgraph Module[ ] + direction TB + + subgraph ModulePadding["[ Module ]"] + direction TB - subgraph Module + subgraph ModuleInner[ ] direction TB Module#ens["Deploy ens"] @@ -215,10 +297,16 @@ describe("to-mermaid", () => { Module#ens.getAddr_bytes32_address_["Static call ens.getAddr(bytes32,address)"] end - Module#ens.setAddr_bytes32_address_ --> Module#ens - Module#ens.getAddr_bytes32_address_ --> Module#ens + style ModuleInner fill:none,stroke:none + end - classDef startModule stroke-width:4px`; + style ModulePadding fill:none,stroke:none + end + + style Module fill:#fbfbfb,stroke:#e5e6e7 + + Module#ens.setAddr_bytes32_address_ --> Module#ens + Module#ens.getAddr_bytes32_address_ --> Module#ens`; assertDiagram(moduleDefinition, expectedResult); }); From 2fcc474ea5d6ace7cdf538a60051d5958fd89d67 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 5 Oct 2023 16:09:17 -0400 Subject: [PATCH 1010/1302] misc updates --- .../src/visualization/write-visualization.ts | 2 +- packages/ui/index.html | 9 ++++++-- packages/ui/public/favicon.ico | Bin 15406 -> 0 bytes packages/ui/src/assets/TooltipIcon.tsx | 16 +++++++++++++ packages/ui/src/main.css | 11 +++++++-- packages/ui/src/main.tsx | 7 ++++++ .../components/deployment-flow.tsx | 13 ++++++----- .../components/execution-batches.tsx | 9 ++++---- .../components/future-batch.tsx | 3 ++- packages/ui/src/utils/to-mermaid.ts | 21 +++++++++++++----- 10 files changed, 69 insertions(+), 22 deletions(-) delete mode 100644 packages/ui/public/favicon.ico create mode 100644 packages/ui/src/assets/TooltipIcon.tsx diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts index fb349d655f..66cec23689 100644 --- a/packages/hardhat-plugin/src/visualization/write-visualization.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -28,7 +28,7 @@ export async function writeVisualization( const indexHtml = await readFile(path.join(templateDir, "index.html")); const updatedHtml = indexHtml .toString() - .replace('{"unloaded":true}', JSON.stringify(visualizationPayload)); + .replace('{ "unloaded": true }', JSON.stringify(visualizationPayload)); await writeFile(path.join(visualizationDir, "index.html"), updatedHtml); } diff --git a/packages/ui/index.html b/packages/ui/index.html index 39a9286d4b..e240cdb26b 100644 --- a/packages/ui/index.html +++ b/packages/ui/index.html @@ -3,14 +3,19 @@ - + Hardhat Ignition

    Ignition deployment loading...

    - + diff --git a/packages/ui/public/favicon.ico b/packages/ui/public/favicon.ico deleted file mode 100644 index d5e6b335eb8776f9c0f1909ba912bcac6112f509..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15406 zcmeHO3virO6+W96NoW}wC`BxqR_v70VQ6`#TFOhDQi_$APFtlY&Oj?j#hH$SGW9{J zm7+2Ng0(O{My7Ubfl+y=2oz*$o21Dm*)(aM&1;{3cJt2e9=~({+}%I_zOrd_ssP z$;Gqj82C2yGaV02s_SUz# zuqs>d)U#Y#TFPtJuHgmyUYT59cytW!h}CZj&83z>9|&@vkYT66B_A*6n>TLYf*#0S z5?iS#2luhvr~+B)W&pK`4?1S_cC*oCv=5aQs(o*e~m?ETpPorq6h zuWTR6OdZ2fRkk(|1t#-ci^n14y${+2TA{|n9lo2IaX!_7hwu@eny>H{p2^M`>%N^V zEp^&ZSM#p+$MHzo)gPta(JxStzozz5DKBSe*Qm*}6=#P0PS$odd2;Tw4n~0`N+(C6 z>WntzjK*0YyaQa0{rCXRo>S*FRb0Z$h=M10OQ;_DDCUwWf6*1B@14V@EYh`UKgZIQ z)!&-XzUU=KJRecKHGj!VM!H^-xM0`Qyzu1%*~v}%C-bWjeb(Vf@LW^R0S2Y-=osaa z@RdBrhfXe?Gl$pQzK&-*TT_-xs4u#n=vbng=)jx@Orx>6uh)RY$>zR$go`h~3Uno} z+Pp%otk1zh&^}3H+NvtH=di(@vtVTl(*4>gD2VRwx}*>!G5Hu6*zz zKBFD;#!@yRZR)4kmxixT;IH=mP#xxl%#Ap8V?VOC=?`=9RTT;Rul@Ri?2z?nEo)Ev z@V#raKIJ*kK6EF^{IF7IqD=GNe4k6tJTs<;OaIFb*QMtzScJdq_vu3G@Lx#ANK-rZ zA+0xC`cw3!uf+H-+xg?nycPfG>*-jlZ+!#vaEIsw$z8%E!ENC!X-8u>m&`qnSKoCf z7q@v6zT3;A51r&5I6otQDbNvGN?jvvbr#8al;RvJ*s)u!y#!u1toZJR-oJE8ymcWD zFT$P2rS7b~IKz^R0eMC_&o_B}B*EgsIfvW-G=iIFkvH-TC_IhxF$^rvV6M-a2It9D ze7uALk(bbq;UxXDkNqghy+}U3WO5@j@GHo_$jIN|eKWu*c@uAQ0d$7z(7$bRI z>7GTkxRV?+7Le1o1o3h@>br)Hx>v&IbUo~RH-c`Opc_@*QU6L+M#`FX7N|DFPatj1 zWRQDnU4I#TWEHUA-2)rOcGwU1!jA9;(p9kOxIoRYNw&hq)B$^37i^NBeu5 zN&bnny+@T*bx^m;+l=2X)U85WZy>!Fv>o~PP>rubVGu0o0!$ZF54%&1aXIX( zTdBd=4_izdY!6{&^Ay`honhKN#r7ihD2c@`DRv3*rA>ug!Dy_Uq{RoO+q2pswQbUj zBj{Tj`n?}xx0Q|pqu9utPE((D;vUmrd<$|t3@jt6O=(xKS?#8^z%Twfv15rHLF@-U z*ie$)-xBYM_PdPvTWnCub^u#I(?AsRkK0uRyY$K4uWJ7Y#^*5A3T9vzTVvl?oAQH- zEGJTkM@${*}1D+tbH+lSywOuyG;bX$_TJUFy5w(Suh*C z5ckpfh-*?}kTF(vVYHnMj#DXX@{C%rCh``{g5A7(F2h`YLCOA9`2IKQioe>xeLcX- z6n4EY9ra(T=9r;Z)ibKb6}5fTiA_X!8>M$@~n~JQ(Y(y4(2T7har- zJuiLRGM{Dqg=)Ns^G9?AJwB=8DdNvR_@;Wxq3!TDZ`i^|2n zeq}p%8vfY1tIuD1oZ;+pw0gPt;!C)+tc(k{ZsR4-{*rIG{quaoefM$E$?Vq8q_LLu zD`(L0kdac?a~l7M%`rXK?6Eh|<{jhHGss07@8#mFD>(na8|;AJqp&-~=e>J`uZ16E z+0G|9A3myB`Ajmmei!*SVGTDAyqh3-ZU+K;UzBU8{&dqV954Nkn*PA zB}^^Bl?k|YhHLNwY7AAz)`?y()>w2SjoBKD{9k{Ui&A>_9a(YfG-O-2WhT(#sN1r~vgSm8>lpb7_L=xwLXF!RpBT6i`n^ZJ9TcCkon#zSjDOzW zKje~f%p1I;)1+lD@y#1I@|+_L$@_1|Z2j$q{?a|>f$!=wR;WqS3|~U);2%w2Bk)^& zj*=GqY4o7NZ+<(5-9CSoJhvx%?9vax-#2~`vM)@E*`C=HS^}Ki>V2WSF|?B4xBIRw zvU0TgxcG{zV|~!_U$tcm_J7PpOW7%#OSo^a6<0SWj40=S~pWfz@3qQu6 zUB8~s{h)ffvi}?UbfM0o zLH-%K8^&eegU|PI@^btQ)lBw5&SxL5KpzfaPm82G2eOoT1mzC_`-+U`>rC`V-fa6L z_e1_p>_h$Ft!*;t=Cl2q)aeK2TG$gF0PfP6fRe)#^~$p1 zIn#yBK723@{7xF;3uhY6wAz!g@8>UKF6=>E32KIHI}nRqQb^J#karC6Z%}R%()cIN xX&6NR8{qSSaj~+I8N3{8eu>)4_5VjsL)bY;ISJ$>kdr`80yzofBrtUe{2OEkb?X2C diff --git a/packages/ui/src/assets/TooltipIcon.tsx b/packages/ui/src/assets/TooltipIcon.tsx new file mode 100644 index 0000000000..be04a3273f --- /dev/null +++ b/packages/ui/src/assets/TooltipIcon.tsx @@ -0,0 +1,16 @@ +import React from "react"; + +export const TooltipIcon: React.FC = () => ( + + + +); diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 9319a7ac6b..dbf67491eb 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -6,7 +6,7 @@ body { } .deploy-background { - background: #fbf8d8; + background: #fffde7; } .call-background { @@ -26,6 +26,9 @@ body { .styled-tooltip span { font-weight: 400 !important; } +.styled-tooltip * { + font-size: 0.8rem !important; +} .batches-tooltip { max-width: 231px !important; @@ -35,6 +38,10 @@ body { max-width: 391px !important; } +.future-argument:hover { + font-weight: 700; +} + /* mermaid styles */ .mermaid * { @@ -53,6 +60,6 @@ body { font-size: 16px; } -.nodes rect { +.futureNode rect { stroke: none !important; } diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index 225d384927..aaa1d8119b 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -57,6 +57,13 @@ const main = async () => { try { const { ignitionModule, batches } = await loadDeploymentData(); + document.title = `${ignitionModule.id} Deployment Visualization - Hardhat Ignition`; + + // const link = document.createElement("link"); + // link.rel = "shortcut icon"; + // link.href = faviconBase64; + // document.head.appendChild(link); + const router = createHashRouter([ { path: "/", diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 75306d250e..7692a4a16d 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -9,6 +9,7 @@ import styled, { css } from "styled-components"; import { Mermaid } from "../../../components/mermaid"; import { getAllFuturesForModule } from "../../../queries/futures"; import { toEscapedId } from "../../../utils/to-escaped-id"; +import { TooltipIcon } from "../../../assets/TooltipIcon"; export const DeploymentFlow: React.FC<{ ignitionModule: IgnitionModule>; @@ -80,10 +81,10 @@ const VisualizeDiv = styled.div` `; const FlowTooltip: React.FC = () => ( - - + + + +
    Diagram reference

    @@ -163,7 +164,7 @@ const BatchBtn = styled.span<{ isCurrentlyHovered: boolean }>` margin: auto 0.5rem; border-radius: 10px; background: #ffffff; - border: 2px solid #edcf00; + border: 1px solid #edcf00; cursor: pointer; ${(props) => @@ -171,6 +172,6 @@ const BatchBtn = styled.span<{ isCurrentlyHovered: boolean }>` ` background: #16181D; color: #FBF8D8; - border: 2px solid #16181D; + border: 1px solid #16181D; `} `; diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx index c2fa26b027..cd0dd20f2b 100644 --- a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx +++ b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -10,6 +10,7 @@ import styled from "styled-components"; import { getAllFuturesForModule } from "../../../queries/futures"; import { FutureBatch } from "./future-batch"; +import { TooltipIcon } from "../../../assets/TooltipIcon"; export const ExecutionBatches: React.FC<{ ignitionModule: IgnitionModule>; @@ -95,10 +96,10 @@ export const ExecutionBatches: React.FC<{ }; const BatchesTooltip: React.FC = () => ( - - + + + +
    Futures that can be parallelized are executed at the same time in diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 94a4974b24..0e37d0bcf2 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -46,7 +46,7 @@ export const FutureBatch: React.FC<{ const Batch = styled.div` padding: 1rem; - border: 2px solid #edcf00; + border: 1px solid #edcf00; border-radius: 7px; `; @@ -350,6 +350,7 @@ const Argument: React.FC<{ color: "#16181D", cursor: "pointer", }} + className="future-argument" onClick={() => setToggled(arg.id)} onMouseEnter={() => setHoveredFuture(arg.id)} onMouseLeave={() => setHoveredFuture("")} diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 2dca65d7c9..3887563d80 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -65,17 +65,26 @@ function prettyPrintModule( module: IgnitionModule>, lineIndent = "" ): string { - const futureList = Array.from(module.futures) - .map((f) => `${lineIndent}${toEscapedId(f.id)}["${toLabel(f)}"]`) + const futures = Array.from(module.futures); + const futureList = futures + .map( + (f) => `${lineIndent}${toEscapedId(f.id)}["${toLabel(f)}"]:::futureNode` + ) .join(`\n${lineIndent}`); - const inner = `${lineIndent}subgraph ${module.id}Inner[ ]\n${lineIndent} direction TB\n\n${lineIndent}${futureList}\n${lineIndent}end\n\nstyle ${module.id}Inner fill:none,stroke:none`; + if (futures.length > 0) { + const inner = `${lineIndent}subgraph ${module.id}Inner[ ]\n${lineIndent} direction TB\n\n${lineIndent}${futureList}\n${lineIndent}end\n\nstyle ${module.id}Inner fill:none,stroke:none`; + + const title = `${lineIndent}subgraph ${module.id}Padding["[ ${module.id} ]"]\n${lineIndent} direction TB\n\n${lineIndent}${inner}\n${lineIndent}end\n\nstyle ${module.id}Padding fill:none,stroke:none`; - const title = `${lineIndent}subgraph ${module.id}Padding["[ ${module.id} ]"]\n${lineIndent} direction TB\n\n${lineIndent}${inner}\n${lineIndent}end\n\nstyle ${module.id}Padding fill:none,stroke:none`; + const outer = `${lineIndent}subgraph ${module.id}[ ]\n${lineIndent} direction TB\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${module.id} fill:#fbfbfb,stroke:#e5e6e7`; + + return outer; + } - const outer = `${lineIndent}subgraph ${module.id}[ ]\n${lineIndent} direction TB\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${module.id} fill:#fbfbfb,stroke:#e5e6e7`; + const title = `${lineIndent}subgraph ${module.id}Padding["[ ${module.id} ]"]\n${lineIndent} direction TB\n\n${lineIndent}end\n\nstyle ${module.id}Padding fill:none,stroke:none`; - return outer; + return `${lineIndent}subgraph ${module.id}[ ]\n${lineIndent} direction TB\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${module.id} fill:#fbfbfb,stroke:#e5e6e7`; } function toLabel(f: Future): string { From 2c40038e4e053c0f028454816585aae035aaed46 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 5 Oct 2023 16:28:16 -0400 Subject: [PATCH 1011/1302] graph adjustments --- packages/ui/src/components/mermaid.tsx | 6 +++++- packages/ui/src/main.css | 2 -- packages/ui/src/utils/to-mermaid.ts | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index ea5aa75d55..30ae34f4bf 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -22,7 +22,11 @@ export const Mermaid: React.FC<{ }, [ignitionModule]); useEffect(() => { - mermaid.initialize({}); + mermaid.initialize({ + flowchart: { + padding: 30, + }, + }); mermaid.contentLoaded(); }); diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index dbf67491eb..af6d1bde0a 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -46,7 +46,6 @@ body { .mermaid * { font-family: "Roboto", sans-serif; - font-size: 15px; } .mermaid rect { @@ -57,7 +56,6 @@ body { /* selects moduleIds only */ .clusters .nodeLabel { font-weight: 700; - font-size: 16px; } .futureNode rect { diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 3887563d80..101310f68f 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -44,7 +44,7 @@ export function toMermaid( ), ].join("\n"); - return `flowchart TB\n\n${toEscapedId( + return `%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '30px' }}}%%\n\nflowchart TB\n\n${toEscapedId( ignitionModule.id )}\n\n${subgraphSections}${ futureDependencies === "" ? "" : "\n\n" + futureDependencies From d1574608da949eb1f8611ba7fa9fe816f6021d0f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 5 Oct 2023 16:56:25 -0400 Subject: [PATCH 1012/1302] small style fixes --- packages/ui/src/components/socials/index.tsx | 2 +- packages/ui/src/main.css | 2 ++ .../pages/visualization-overview/components/deployment-flow.tsx | 1 - packages/ui/src/utils/to-mermaid.ts | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/components/socials/index.tsx b/packages/ui/src/components/socials/index.tsx index 9684c5711d..2dc9b6c7f8 100644 --- a/packages/ui/src/components/socials/index.tsx +++ b/packages/ui/src/components/socials/index.tsx @@ -11,7 +11,7 @@ export enum SocialsEnum { const SOCIALS_LINKS = { [SocialsEnum.GITHUB]: "https://github.com/NomicFoundation/hardhat-ignition", [SocialsEnum.TWITTER]: "https://twitter.com/HardhatHQ", - [SocialsEnum.DISCORD]: "https://discord.gg/zJx3ZpkVpq", + [SocialsEnum.DISCORD]: "https://hardhat.org/ignition-discord", }; export const socialsItems = [ diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index af6d1bde0a..1d2f7d6052 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -26,6 +26,7 @@ body { .styled-tooltip span { font-weight: 400 !important; } + .styled-tooltip * { font-size: 0.8rem !important; } @@ -46,6 +47,7 @@ body { .mermaid * { font-family: "Roboto", sans-serif; + font-size: 30px; } .mermaid rect { diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 7692a4a16d..b3fb7eed62 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -87,7 +87,6 @@ const FlowTooltip: React.FC = () => (
    Diagram reference
    -
    Future to future dependency         ---> diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 101310f68f..3887563d80 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -44,7 +44,7 @@ export function toMermaid( ), ].join("\n"); - return `%%{init: {'theme': 'base', 'themeVariables': { 'fontSize': '30px' }}}%%\n\nflowchart TB\n\n${toEscapedId( + return `flowchart TB\n\n${toEscapedId( ignitionModule.id )}\n\n${subgraphSections}${ futureDependencies === "" ? "" : "\n\n" + futureDependencies From 9cc4dddcc05a56d3c8ff18474df08f9148892b06 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 5 Oct 2023 18:51:25 -0400 Subject: [PATCH 1013/1302] update tooltip weight --- packages/ui/src/main.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 1d2f7d6052..44aee5ac6a 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -35,6 +35,10 @@ body { max-width: 231px !important; } +.batches-tooltip div { + font-weight: 400 !important; +} + .flow-tooltip { max-width: 391px !important; } From 06300a15bc610df8d943a67ef65cd3869f7e0d3e Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 11:25:02 +0100 Subject: [PATCH 1014/1302] test: update ui test --- packages/ui/test/to-mermaid.ts | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 7be9699333..62c0fc2e58 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -29,7 +29,7 @@ describe("to-mermaid", () => { subgraph ModuleInner[ ] direction TB - Module#Contract1["Deploy Contract1"] + Module#Contract1["Deploy Contract1"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -65,7 +65,7 @@ describe("to-mermaid", () => { subgraph Test_registrarInner[ ] direction TB - Test_registrar#Contract1["Deploy Contract1"] + Test_registrar#Contract1["Deploy Contract1"]:::futureNode end style Test_registrarInner fill:none,stroke:none @@ -117,7 +117,7 @@ describe("to-mermaid", () => { subgraph ModuleInner[ ] direction TB - Module#Contract3["Deploy Contract3"] + Module#Contract3["Deploy Contract3"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -136,7 +136,7 @@ describe("to-mermaid", () => { subgraph Submodule1Inner[ ] direction TB - Submodule1#Contract1["Deploy Contract1"] + Submodule1#Contract1["Deploy Contract1"]:::futureNode end style Submodule1Inner fill:none,stroke:none @@ -155,7 +155,7 @@ describe("to-mermaid", () => { subgraph Submodule2Inner[ ] direction TB - Submodule2#Contract2["Deploy Contract2"] + Submodule2#Contract2["Deploy Contract2"]:::futureNode end style Submodule2Inner fill:none,stroke:none @@ -236,16 +236,16 @@ describe("to-mermaid", () => { subgraph ModuleInner[ ] direction TB - Module#BasicContract["Deploy BasicContract"] - Module#BasicLibrary["Deploy library BasicLibrary"] - Module#BasicLibrary2["Deploy library from artifact BasicLibrary"] - Module#ContractWithLibrary["Deploy from artifact ContractWithLibrary"] - Module#BasicContract.basicFunction["Call BasicContract.basicFunction"] - Module#BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"] - Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"] - Module#BasicContract2["Existing contract BasicContract (Module#BasicContract)"] - Module#ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"] - Module#test_send["Send data to Module#BasicContract2"] + Module#BasicContract["Deploy BasicContract"]:::futureNode + Module#BasicLibrary["Deploy library BasicLibrary"]:::futureNode + Module#BasicLibrary2["Deploy library from artifact BasicLibrary"]:::futureNode + Module#ContractWithLibrary["Deploy from artifact ContractWithLibrary"]:::futureNode + Module#BasicContract.basicFunction["Call BasicContract.basicFunction"]:::futureNode + Module#BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"]:::futureNode + Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"]:::futureNode + Module#BasicContract2["Existing contract BasicContract (Module#BasicContract)"]:::futureNode + Module#ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"]:::futureNode + Module#test_send["Send data to Module#BasicContract2"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -292,9 +292,9 @@ describe("to-mermaid", () => { subgraph ModuleInner[ ] direction TB - Module#ens["Deploy ens"] - Module#ens.setAddr_bytes32_address_["Call ens.setAddr(bytes32,address)"] - Module#ens.getAddr_bytes32_address_["Static call ens.getAddr(bytes32,address)"] + Module#ens["Deploy ens"]:::futureNode + Module#ens.setAddr_bytes32_address_["Call ens.setAddr(bytes32,address)"]:::futureNode + Module#ens.getAddr_bytes32_address_["Static call ens.getAddr(bytes32,address)"]:::futureNode end style ModuleInner fill:none,stroke:none From f124e56054f8777f8e6bdabff295e3f6f5a0ce7a Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 12:01:10 +0100 Subject: [PATCH 1015/1302] feat: set minimum width Take the laptop width of 1280px as a minimum, set the main content width as 920px (with padding 180px). This means the mermaid diagram will always have a minimum width - leading to a better outcome. I also cleaned up some console errors due to react + the svg. --- .../visualization-overview.tsx | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx index 5b8dcfcd8b..d05450ebea 100644 --- a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -6,8 +6,8 @@ import React from "react"; import styled from "styled-components"; import { DeploymentFlow } from "./components/deployment-flow"; -import { Summary } from "./components/summary"; import { ExecutionBatches } from "./components/execution-batches"; +import { Summary } from "./components/summary"; import { socialsItems } from "../../components/socials"; @@ -112,6 +112,7 @@ const Contents = styled.div` padding: 5rem 180px; display: grid; row-gap: 1rem; + min-width: 920px; `; const Panel = styled.div` @@ -179,10 +180,10 @@ const HardhatLogo: React.FC = () => ( y2="3.59" gradientUnits="userSpaceOnUse" > - - - - + + + + ( y2="10.496" gradientUnits="userSpaceOnUse" > - - - + + + ( gradientUnits="userSpaceOnUse" gradientTransform="matrix(18.5398 0 0 18.4136 3.701 44.539)" > - - - - + + + + From be8c2e81e4d129aabfde612027afb3ebbd18915d Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 13:10:19 +0100 Subject: [PATCH 1016/1302] fix: movement on toggle To fix the toggle movement on the +/- toggle. I have wrapped the button header so that a set width can be set on the toggle button the following text. The right aligned module name has to be brought in again. --- .../components/future-batch.tsx | 45 ++++---------- .../components/future-header.tsx | 58 +++++++++++++++++++ 2 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 packages/ui/src/pages/visualization-overview/components/future-header.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 0e37d0bcf2..0cd0fe2309 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -2,12 +2,13 @@ import { ArgumentType, Future, FutureType, - isFuture, isDeploymentType, + isFuture, } from "@nomicfoundation/ignition-core/ui-helpers"; import React from "react"; import styled from "styled-components"; import { argumentTypeToString } from "../../../utils/argumentTypeToString"; +import { FutureHeader } from "./future-header"; export const FutureBatch: React.FC<{ batch: Future[]; @@ -56,6 +57,8 @@ const BatchHeader = styled.div` const FutureBtn = styled.div<{ isLibrary: boolean; toggled: boolean }>` padding: 1rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; margin: 1rem; border-top-left-radius: 5px; @@ -82,21 +85,6 @@ const FutureBtn = styled.div<{ isLibrary: boolean; toggled: boolean }>` `} `; -const Text = styled.div` - margin: 0; - display: inline; -`; - -const ModuleName = styled.div` - margin: 0; - display: inline; - - font-weight: 700; - float: right; - padding: 0.5rem; - margin-top: -0.5rem; -`; - const FutureBlock: React.FC<{ future: Future; toggleState: Record; @@ -133,17 +121,13 @@ const FutureBlock: React.FC<{ toggled={toggled} onClick={() => setToggled(futureId)} > - {!isLibrary && } - - {displayText} - - setCurrentlyHovered(future.module.id)} - onMouseLeave={() => setCurrentlyHovered("")} - > - [ {future.module.id} ] - + {toggled && ( = ({ toggled }) => { - return {toggled ? "- " : "+ "}; -}; - const FutureDetailsStyle = styled.div` cursor: auto; padding: 1rem 2rem; @@ -359,5 +337,6 @@ const Argument: React.FC<{ ); } + return
  • {argumentTypeToString(arg)}
  • ; }; diff --git a/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/ui/src/pages/visualization-overview/components/future-header.tsx new file mode 100644 index 0000000000..10a63c8015 --- /dev/null +++ b/packages/ui/src/pages/visualization-overview/components/future-header.tsx @@ -0,0 +1,58 @@ +import { Future } from "@nomicfoundation/ignition-core/ui-helpers"; +import styled from "styled-components"; + +export const FutureHeader: React.FC<{ + isLibrary: boolean; + toggled: boolean; + displayText: string; + setCurrentlyHovered: (id: string) => void; + future: Future; +}> = ({ isLibrary, toggled, displayText, setCurrentlyHovered, future }) => { + if (isLibrary) { + return ( + +
    + {displayText} + + ); + } + + return ( + + {isLibrary ?
    : } + {displayText} +
    + setCurrentlyHovered(future.module.id)} + onMouseLeave={() => setCurrentlyHovered("")} + > + [ {future.module.id} ] + + + ); +}; + +const ToggleNameWrap = styled.div` + display: grid; + grid-template-columns: 1rem auto 1fr auto; +`; + +const ToggleBtn: React.FC<{ + toggled: boolean; +}> = ({ toggled }) => { + return {toggled ? "- " : "+ "}; +}; + +const ModuleName = styled.div` + font-weight: 700; + padding: 0.5rem; +`; + +const ToggleNameText = styled.p` + margin: 0; + display: inline; + padding-top: 0.5rem; + padding-bottom: 0.5rem; + text-align: center; +`; From 2be9ef8e4731385b61c9d2c4f112ef2b0ef1f31f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 6 Oct 2023 13:09:19 -0400 Subject: [PATCH 1017/1302] doc link and small tweaks --- packages/ui/src/assets/ExternalLinkIcon.tsx | 15 +++++ packages/ui/src/assets/purple-rocket.png | Bin 0 -> 3896 bytes packages/ui/src/components/mermaid.tsx | 2 +- .../components/execution-batches.tsx | 2 +- .../visualization-overview.tsx | 63 ++++++++++++++---- 5 files changed, 67 insertions(+), 15 deletions(-) create mode 100644 packages/ui/src/assets/ExternalLinkIcon.tsx create mode 100644 packages/ui/src/assets/purple-rocket.png diff --git a/packages/ui/src/assets/ExternalLinkIcon.tsx b/packages/ui/src/assets/ExternalLinkIcon.tsx new file mode 100644 index 0000000000..58c310609c --- /dev/null +++ b/packages/ui/src/assets/ExternalLinkIcon.tsx @@ -0,0 +1,15 @@ +import React from "react"; + +export const ExternalLinkIcon: React.FC = () => ( + + + + + +); diff --git a/packages/ui/src/assets/purple-rocket.png b/packages/ui/src/assets/purple-rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..677c61ad6e14889cb55cbe6fb28439a45491076d GIT binary patch literal 3896 zcmV-856AF{P)bZLBsaMgf#y^XB1#?`GRyjg1Dqx{j;4~31G%O;ENg&%~BgtfDlFat4 z_xF7@oKh=Q8?b-$Wa zhSg#TK+~e(X!vj{CH?Gy2OjA7y8?gfZMRiaE?f3SR#sL40oI0wh7b;i8CjNLHk;vc zxuB{l_V3@1mX?;8TefUD#DCqOpLpVlpXBA`Jxar)13i8EG&~*;qk~VSQn1_Yu-R;I zI-Th4?WG0KP+VMet)^`~{I!99>ZzyhC@!A#-vrv1OePSCM9|UEfw5!9qQ1V~0IRd@ zcDv#AdcpHNhKGltC<;1*eL0nt4crw6|NQgMd;RGd$Hrt?^Urs`jt>u7n3&SiQe08+8=k9vsbrFTYcjUlvSv*R-JR(O zw)f+^H@0Kp!gPcN%i#9p7_8^!<{}o08O*1pr9qM;Lq>^20@>LaU5`BSn8IEu;BRi- z**v@a-IXs@Z?e>VcqhjAZ-mS0huiMMreCtqq?5=@dy{~R1lVgxrLeFN(P-2tScYLR zI5=p4ud6#+L(did3TV5iqGH|$HhyhZ^~)yYWPBS@PG+U9zg*<3U< zoW-$YN6^yNjL1+3lANSFCFJC?uvoqcrz4wK_rPkkLJ$N4bV*4GYHDh5?p!n3rK}gP za#_JY{q)m6x$e5_UQ;#RTU>Ym9i0=X`JBU3tfY+luV0i)ueo7! zq>(jR4Vmb^J}@wVlP5`1nVEFI?)jE2IXO8&{WF(EHXAl9F-XL?M)%L1ZO04Gx)6?7 zFt%_p$;FAGp+Tb|>7e!RIDh`Up>usw3?s)!err^jfA!UMo;kCZHns;l(sh>fC67kq zh(}Zu7D)K*ZVz7h)i4^HESOYc!ksH^$na}a12QtRUxve3M8Knl!{|P*Pe332{r$!S z3JMBdAqNT`IB&U7X-nqvb7l&}D?ho+$GjQn8A!;rx1XC?$%#guo z?c^p3c{LA@TSLtU^Dw#WA$Wb+Qe z?H?|EV9Qmk-~@WQdlAwL?Q|m*pTn>`i$yT*4Tt;4EmTY@E<@?$Db#?{NeY}{fjVeC z)96t_w?&<8T{f+)t@=k7?%A_v@1Oqe-z1w=bE}szow=JLgT1cqtWA)$B7}m2=`dc}zoC+hwj+a=v*^^Dh>EQ;MN z$TmKW&EtJ)snf4bb9uR9lcKPuggn3{HA;l;Lr@VzUvD=CBO%C=-T@VuOe{%+#hhzr zkXL_fUXkWITK6-S}=3Out4&#VacKe z2zGR1!o*1i<2q2C@pwFLj1ks#XVJmy%+q~`XhjappFdyz!r)*0?&}-GW_fNp>t!V+ z35~?15w{FPgd|Bcx~DFo5r?6xf`HfmH8Z&g{BIUi^=CL_L8hc@GS*#8MP7-m`aCymXShV%F;KVOVVCpV}=&Xe(43NZR z1IhRbnDEkbv95K;|_Ad{R`v zrC7+Mc|jh6%@jvW9fHZMB0oFR$lf-)6IQ#6wsT%8SPP<&VSL=ugyGi~!5*53js2ZvuB1<4JjP+y2SC>BY;A6FUc^U3AjjgzT&Ll9L zK(>}Z$N7GI($tLoZ*(ITQt|K)9>m^;caTUmQpMA9f}_m^ttu^RlAh~bI1mWjTsXdL z$GUav5?>{r@W+B1?kS$V~qazkv+ zoW)b7O!8a$Y^4~VH3h$`eHY`$)xd0b0R4O7^bpP`Q7?^^JdI%J6ZXp;OvT8;2ds+#p%cKL%)YtAa{vofl&l%Vm$t(=qc=w ze~Of=(eQnhQe!M;0XrDL4E28aGW`2^kNx{q?~UvIs-cj&J@bVkanG(LUA`H)X$)^S zE2<5*t~vk|6nf>@d+0c$2%Dvqh()YWA`WDkrl8oq7&gui z7dM8s+p&pHG#54gtx^1vk@%xEE3O+`9@}o4F~!B2DUWM36b8TAI1A6dq@g=JgwFTQ z!YcDfv-q%L+>QADR6oA8<3Hh1XQ0GV2AeMnHr7vyr>3Xbq1vLVAn?i2*hgFveD>tt zw}s*Y2TK+RHbCHqDRw2mGgkccKg?K|{W{bk4K9-#75-vaWH$zSc;D5IC1;>HGkMlS z_qyntOop+sGzCT&+D-8;J{sUZHxl=3m>D+vOb(Mb@W(lFI(Rc-;J`aF@xzI~hA$}~ zlYrkbV=BH`ln2+ewzB+pXNL>iKKKMX>>Nj(Sf!zWr;f}s)a*F52To2Nb>>g)x^1>Q z(*9PLw0yEXYnz?(6JzAhnkLhdtCTJsU}ARyx|1vp69YNw54NAo=^KQB|<)*<{;t4J08Yh zPaNw{%|!NiE0R5Yfpz}Io^=&J?3`y?5QrrN+N7i)le`q-Mj@@Ml&fWZQ$X4mWu@4{ z(1GM=GhhDb`*Rd8KbFhSWQ2kuVqGLNC80BkbDCFS^e)G&;Jm0biE_M(td+HC+@y!0p%5BD>r#+2!vq2Uysu6`g zLnk!4w;)QpE!tQ?%o1NPdmNA4_ts6J(K;)-2t1c9I80ORj1m)JE1m#lxF0eFD61_C z&)oGU{_EgeIGG6A8v>KtdSd71-@fUBU-M3hc2F8@JVVJ*!jM92b6x~YX^7>k|E5|k zo9^Cr)9`4X&|L&x^m1Cp;`vC_{2r;+Af%ocm?&-g4tL<*|0#hv+K1qFu{9z!wa&l) zy^9(R=c3rfl1w-jR@OwUTj-Pwh-D|QX(=zMud13aW0bE8;I;aCTi+XZu!C>D4<;^w z4T*5fOh;@>1n2wAjfwh}hQK#6S2C()c@-;OtoV3c-v@o%q|A;)=1O+D`)p^SH(ozyvPvtv*EaWTl=ll16{GBD~1<6{e zDI{9Q6f%i`S1Z5k5@7%AYWm;R>Cuy+Sb24I9RIlf`t|>ER#D|C*jt$Z0000 { mermaid.initialize({ flowchart: { - padding: 30, + padding: 50, }, }); diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx index cd0dd20f2b..2706ff5fcf 100644 --- a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx +++ b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -73,7 +73,7 @@ export const ExecutionBatches: React.FC<{ - [{ignitionModule.id}] + [ {ignitionModule.id} ] >; @@ -20,18 +22,33 @@ export const VisualizationOverview: React.FC<{ - - {socialsItems.map((social) => { - const { Icon } = social; - return ( - - - - - - ); - })} - + + + + DOCUMENTATION + + + + + {socialsItems.map((social) => { + const { Icon } = social; + return ( + + + + + + ); + })} + + @@ -60,9 +77,29 @@ export const VisualizationOverview: React.FC<{ }; const RocketIcon: React.FC = () => ( - 🚀 + rocket ); +const DocLink = styled.span` + font-size: 14px; + font-weight: 400; + line-height: 14px; + letter-spacing: 0.07em; + text-align: left; + margin-top: -5px; + + padding-right: 2rem; + + & a { + text-decoration: none; + color: #040405; + } +`; + const SocialsList = styled.ul` min-width: 80px; width: 80px; From 352a8ca590f1d62f27ae26fc0640c1ea01bc1035 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 6 Oct 2023 17:59:06 -0400 Subject: [PATCH 1018/1302] scroll to future & better quality rocket --- packages/ui/src/assets/purple-rocket.png | Bin 3896 -> 950444 bytes .../components/execution-batches.tsx | 36 +++++++++++++----- .../components/future-batch.tsx | 7 +++- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/packages/ui/src/assets/purple-rocket.png b/packages/ui/src/assets/purple-rocket.png index 677c61ad6e14889cb55cbe6fb28439a45491076d..d58df0040d9e38bd568e124687de194fb8f1d891 100644 GIT binary patch literal 950444 zcmeFZ2UJsO+cv5*j*5+@f}kLgDm8SFGD1KSK_r4m2?!xTfCNbBQf8DYAQA#7b?7|| zEeN5EN)eD=B7}g5)KH{%I2)%q|M}kUeb+hPzt&mn{8>rZ+56c~xu5Iq_a^M_om*#5 zah*DHsvu)IJt;jG zO_V)a#|MYH=X1vp>Eno0vH_{9T~+Z?20Fl?+^nv8VVtmdWiM6G*M60ODJ>^1 zEu$=_pbVD1`o{|djEJ+bRfa>f{}>PWr3$ilb8}Ial=SrUl<<_1aK_n5f|Zn%B&DP! zrKQDz7UFnstecgWI2M2H&mJHsJQ9a?aYH*}uO9YjW$ohYcc0ozPQFv!}91^AF0ZjASpR2*U z!BKzH^FO#9X#UsDZfM(oaqr=ke=G{+h5i>!53l^y)J0hnhq7`*L4c1c=nxm;U@37a z8AC8w8FTj zgz()zH}a~qtc1)}VLdA(8hg04BA}}_NM&1R9L5UR1vJLW4khV=wF6!KYj2e`ot>O< zz+8a^$$Xu-o}Mxki+8iaB2iF?DhODL1R8Cl47RpaMA_I_iObj`t;A(ztZc*;6_jMe zZ4_j>&X>l2ATco%gN>)kS zTE^>9`;K#y`LX=^!oYZ-B*qLP%jEJ{&P zTv15@U{om^S(J=|qJp$M3Uu{wzm|F6Zv}02#>;PI%5vWstUS?#G!!ufo(sOAAghePZHe(HV^OSjKlvSpERuO z{y1_%tNqtIVy&cLtt4jykPZwGQC3b?UR((bmKC>^lTkoQDauJ%*~q9!9*QQQi>tpM z{obwQe?R_LfuXE}KAeyDAG5fJa{X&QSHH>#Wh>2 z+M|HY{wJeK0}LqtC-?o{4DW2~=4pjP-L(5k-QV@X-T#KEe!mTAZ-uo(0UAjXB>De% zIf_aEUr8%jiCf7kDTvG3NZW`j*~p>9<-t<&NNXttu)GZbo&R<@z*hYscmB682kDIU zK;hi}-XRw&oE4x~Q8>IR$QI{}x%!uox$5S8)yl=i361>9bCModn?Ll{UwHY~WV1ox z(BI(T+fn|S!qxx5@%}C9Y>_rrR<=l#xUGVsthlTdSV3G-N>)x>PDx2lR$4(3rHHip z|IRl3+vOmok=BYRE2KDB!A2Tb4zLm>q^%V2rJ!gnFE1sJLLvY4a{d<;_Mf3nPD1LR zn(04hqQAEM&nbP2hp#C3H$XeY;$Oi0pFrLJ%y|EHoBlJU`>%w<|Hf_lstA6U;*$TX zfdBnB^pPii1|Ek=C$OMg(Ht&_R~%F9=(49 z`p)GC==c-%=9l2$uP)S|U%M-B54ykq^ViqEUCbvD-=5fn{M7ZsHz$75KlXnb0QC4j zbod<<|A!9$f2V`aKSjvL)Uz2Egse;YhaW{%d@8hq*a+{^*OAj6se*UoLPJ;QJ-%~) zX*M}9#psWyuRP<+_2cw+f614hMg^KUvF~rN`V`$bdkMb>vTjhKM3dgfmJM%p6k9e) z=sU*=EDjjV`r2Yukr8GG^aq^LSGbYwUe0P|wn++(PDk}3(AJqyZoP<09^%*vu=Z$Q zKSY}wvl>}$1mSnKxc|ukDa(pn%p`$_SfcO4xuqMFggj)VGR_L1k00ID|1MDCuh|^g z}j> zk&58f2=EV=xa>1dXSDz5n0!gP>b^3#i9cA^p&T08z2;fO27+-SZ6d4`kOClWH+sF* zFc;kx85+T-IhkxIrwwj81BOR{ZwB)tbzM3HSlJ`qv49&DVMRSO`(YJhwbclB3zUCnFLh2Bf!=XtorbG zBlXwb`@xR>y~f|v38i96ta6}Um}V2_l4B_8nq}CCR#P^F$Zp_q4Rt!J4_E`erlsU%j460FIYgaa6wo;gc~88hr_J?C?Z$meYSicXh7KrW^0=F{`n_mQ zLAI24{Lu6IUhSOh=!5|@VZb{jT%{95;3v3}BEj1}@1g8R=XlgX>HN^Ee(G$Y-zv5M zj@JCoHnNwHI*xh}w<}7IVz^$1y{M1`Nt-*ySma1ZF(FRV47u;w7afP?jYXO#pX6K5 zBJOB}s)|fNU`hj~%tW|1!pH<+oCkk;TZCN%l}>~a;bCCGUel?j7jHOY95JVmZnhE7 z^0Wr~WH!2QUD#0VC471XIr=wU(f0E0Ic4voU}VJEY#T^~x$~pjUKYg|x~D>SRRgDt zf@HfAbyslWJLG$*4p~I=7FW{?m>0<}kF&;`_>R@Z(j7h@# z$!J?ASw_X;KSd}+*G0H~y4+n$dHk))|I#hY5Vvy^cS#-u zb||`6Nd&&nJRd~BU5&jgoYxF%fr`&Ujf@_lOcpR?+Kg?*;3&3o zhgO@PL+q z*m12A;itaQ6NA#X%Zvzu46(KWZ?y+mP}Ai=Dw96IjUXu7%givH7(-mj05sv9Yzu^t zDW?x_d5~UQhB80xAk@n7PZR1!nYnmj?nIM4+|)Hgjvi`4s({79^We(8rdg(mKZBL; z!6r;w0Kl+z>o}_RnMP(BB1IkM%bDl3g+pNa@YoHpN>$PRK5 zAcfaUtS_+RJpFl_IHgVHqC2+*PYuP^D6n=zw0rf`MiV3JEm}$J+g#PpHsvC~Z!h&m z;FDdlNm@?u9JFbUNoh+@rY^yzjlFIxshGWk8nNV_kWCY7Bb&s<0&jG}eJFv*q)&z> z6!yv@P$qS)E7pmqM&-6;3?bV+!Nx3wUv4UlzX@w2lQHIU<~8GJ+UdVVlc`97I8`Ag z3|#~jX)LJz1Zx50t7sNUtLXmsS(z6~gNQh{6)w@NCR0WU5eEw5j7j4I1HZLl`O$ZA z!hxJ&rk~x#PZ=0%ncUy9rRWvpx8~==W~=W6vWOt(d`e|7n-zYw&vGY{%J`uV2>cD+ zJ}Vs=kLAvraL17L+ng(JzuTT)kL;?zG&I>zY4HQf)g4##R|cmOw+2Z<_V-}X@O+Vs z3i*gLtk*Ol+dj*38Ju$(3csLbz6s?g z?^k@4xSmZu8M9a8JVQGEFg8$$UKRsKX;Ty^zc6!7Wjq( ze+uv}j~fo3{tOfG7vJEIhvB?c!ye>UbPx$uEY@OKoVP`UDp+>h5&9GE=V*X@G8B;` zz!yZa1Qj$qGs}7UQF0%!mER+EZ#GD0xqDn`DPYSobRcCoRDm1%Dt@$uiDZ+4r12B{ zm#l+FI7<1H7;J3iCCk{vICv9fmtY$m z%38Z#t@bJx_i?9)$)uP3dTt4s%20Ma$kWjBZWtHx7?>?-1(T4S2rv>lp<{i0U4r@C zxjVNqx}gT=g}hTzKWn+ZurT5M~_hMwyMxri2vPbIM>rpiM_pafg) z?Ng?=g|AnL&ki`#25u8FJ)Z`WT-W?Ovr2f=7*k^vs5w!7H_ZtRxWXz3bR#TT=#jJ5 z2Ak5BU)Vb-P>*S}VUKWD1d+O^?Wp%&xaq~!be{lc=bevZds|*ADUsS4F-u;)DqN8x z7qylIC7;HqNJ=cLqyilCZpGK^yjF5n)g6K^8c8z%X3BSTDKcXDb&p_>#; z65{L40}BdB=M5-Fr{9UaUj-JVK$GtZXPqiq(>VoZ)tKw2F0va?A8CZ<_4t@l*W4&{ zo<5^m$*jv%ch&0!)z9IRu)GHQ7#3D)Fv*VM!(q}E0nW^{4#wsj`}Iv%yPo4cK^8>Y zZJ`qjk7k&6bImOu1ovE9jV(`GJ%w@CWUVZz+gq=0>b>agR4KP!tM{?`jl7{?d55H3 zJowVv zDkfnf1lXhk`phX26e*S~H?gHD;{Nv_uIojD8itx8pLHDZGT=e?Ix~^}6hMBER_J#E ziJAuCX>f=%$%c9M!d!;k+lER=pr?Tt52wfxnP@a^3uG z5iO0AY#PtukMr}>=RF)l-?`kW7CxoK`FYJodT?PrGCro|vxCZ|S`JyO8%F*WMHiRcG-WCJ3;o=Id!zJGw08-P8_Bx)9|-Mx+w7CFUd zB$0JlM+7fmlwICZJ`gsb3?6c6;xrx_hQ&NAw;HP9m7`sR&c-dFoW$0CzEFwf_NdxX zl@ES#VucYj5OS%2#liK0BwX)Qy2+cG@j9K0XHNbk_Y)Ek^KcU?!>lStu52 z!JQ_W#a|@X@2+QL6b*kGVUSrN-^BS=3EffES_-l8t`>i4T~)7M^~!T`dUK>UgSxRm ze+1@<3b=CqE%j~pw38xddvnGfDuwwrs0Wf6v$~-W&GjuZ)L9eTpK@nF9UIryG9N-9 z!<@;EMfZS(RkT(Nd|%|w7szRm1HH>G(r>8a`oMVYNvRkw(a75n+x9kbn2gLaOe??i z9IO=GLh6-z0TD^gXG~j2WPOHR&#oBT791Mje2dK#1k^yp2?2Xy_(1!FLmO>FB8_qT zW~E=fc>GPgc8m4#zS|Ce`b$!<(_Kdy&m#oM!2uRoGPXgsXlsns7k zURfjQRxC7p&n5z$?q2lyg2r70HIsNXi^vBULv92?2Swr8y}cG&WqP6>^Ll4a?@YnW z>c>VK>3x*+$Rk%NRpk`j>>O_ku`=0Fezahij?m1akTr(}$6w0zBkw!ws*mtf1oy^@ z?xfIH1IlvRQ%%zvjsR7fVR=h>us}b)218htWY%y&fe&cb2Sgm^(6~&bE&n3c_N3jG zVi`B_sxV(e6u5!CLupE744P01sL_P%IqmbMX3O0yy$Y@GIEt`b$1DT4t86is4k$NT zURX*98fz-q(U!Zn^RAdLaT2;qLa7K8HaC*8sZej}sgfp-9Hkv2#WpOcxn9E{=L12m zbi>pBmna<^6w;i#r90vtf*Sd;Ryzg^*eo{XJxMX2lUmM{_0?wId%)?x3S-PB{WsKiFhiXX*CpLMn!gF1(4JXA_c!iC#}YdL9a)~A54>wg zjP#3ZFUp5{^GA$LuZZL=F!3#%=3D63;DL%T&pL)tjKh7*v2ESt!c%+@!N7M!!?1w_ znWjsWbFWcJ_@>YjF;U^RQy?F8Tz`DJ$II9nM06fz=9~ul!mi;d|E;^%f2b_v1=9rG zHKltOZwTTki>LXb@~hQYJ}G}^43#6o>|lAiqRFtl zSI-HK7*19@6{`j%a0k2fv*%~S`d*w_!w*&)P{0 zCnTR*yF{b5VAn-@Klip3o&Ltg`1Kl01pECDm#$$W#wL9pml&Rkrlxn0Y3;e!+gy!| zGV)31GIMhPlY-^buNSQWt0L|Er@JTJ4XG0VdiJXGo81x2`KIUH5jn6~2sfaYTsuq> zvKubhMIdr?e_igM%#73`1vikm&!Xe27X7hCsn2uQu3<1Y7ARMWcVzr3>l&Yl@^jOd z=$E6+Ft3nH&12Mgm^(`hQ3ApGYudhM;Io_dG|KGu_*p2tp2S-<$E#4U7hpDg{?vlf zL}f{ek|Xy$%GbEL3P!O`+}7o>jm_EP@1PUl3AU9zLa!v%PgRIlm+Sck&j#CM9^kiMygC~;&Vu-)D5wLd6C~}T zBh8X$woTHm(Z=%V6)sIDF^t=qYkW0gV%LwIz0cpoY~(3I)MU?ZDjWT!Q^~k%NXH`4 z_Oy z!$u17=lAl(7MqPmg0cDvcerilQS|ZE3Nh*&2 zk^mDJ$vLrA(NL<?_hm{*9Z4fo;yLqG~r zQkFal|I*aK6cABT;$FcxjZjBv&6SPXO(&hnvart(J_RE*Xs?v^J4C;?EqguDXtcf3 zsXk?7q(_ABsP8@$G$C*_{<6u9+|AD?yBnNA6`wsgapZ3a`O~Os6Q{pS9$P#dmv<~4 zJ^{-!heZRt4ZvHZ!mfO%n6bU@LGd;;>K{*}KFKd!D7s%TV_Wv}Bww&8KLycDymU@cqw#;z;vjd)gJ*f@m6_F`HoUlqsp!hww%MCS-OOLCKz02yhP%3oaC28XtM zlo%WIDBSb#(EDL5e*T&p1r$$f;v7;l9${l;;={I>gVI$x(Ndhx!NDR~J>%oOOHT5S zY$HS<2oC5QnI_Ii?U)0dm^t0B>O1>P|KMzY1>vk$-3jcM04)eB_?gA}fpPzc2Sv%e zm>QBeKMCw_ttEA>wwkmE7)ClG>#+cDhXT>gm{PH3l*u__A7HNtfI2vlrs%kArLuJ4 zHmtt+q`tMSkV7eJwc2}VRhK|nb-FzzaGs<=jm$j5M1Qf0kFUZhUo4poSY*rb6F{cE z)3;;`Ci9io-R@f;InI;LDHeCF*Hz`Q(-swOr35FGxazrsZTsUIMTq$ z?t2mxXfJrT%wUO}bmdkYN|q-|q)j?M|MA7}OR1gI#)HLx-Qtk8MuJQe^r@-e(uDDv zO=)qN?2UVmKdUG91^pc-|4pb(FH>$bSuDRzHsU%oUgB!U) zw@G!wuAUWCLA>V-&ADve>p>njp-x`lvAA93+xVRldsk5p3=pHweij)~={IC}CZfc) z3LL!b`=iE5wZ!6OOMgGt0G}`F{tt)yB6`--*KQicoiH|zXXa>Y9LJfd4LZr|-!JIT=yz}rs4(R%9AGT@ z)bcnf(45K!vnyD1Pri->i$U4AqMDuVo)K<4-MSL7tdb+vmJ3LrUSf}Itw2KIkGNi; zO@ko5pC^HUf*S&5u3=rIHx%@_AXT$J{?)>id>$>Hl4)okZu_j;&K$F|DPd5F>8ZNi zy8Rvb_Crtc(-q#v+b17c4zSVVN=zBH$>NS}ANIy2qEv~$z8O$8F6ye-qq^(CTeB?_ zDV{1k_fn>06A`6r4v7bg2Yb95S%n8gey5Cb^UvOOm+%(&lxcqPeY7C-$u}@i7mz<8 zfylY>Q9(L{8;C2|SWwq~y|`9RVm!f7ykF6=yx7XbX2#m=Qh$Gc#sqHbSKvy1{zh9V z7Zcxccx(AZX;uv>OsD{~6&H6mVX}eK(Vw7t`5eHQvLY9pW{>TZKKR*2pqLlR@Q;Fi zREw^_*4~|cEYCVP;IB&zK1RBcLTNRNCrx+U9VE}s5F-3n?NXJ=DeA#@>2DA zC@^p29BfU!{^fygPVY;3A61^2N)wV>O4PmxT=JVl<;T?Hi5fqH*I7%gs+LE2hIP%)*6TkFl&_u*dS)q> zPH|53Yx*2M)U|(x32|V)TFi9tXxgWgD#aQNpRHXldS9_scnN7}bOGFCFa7c^AR$sM zm)Z&%zZ3`TEzQ`dY*#i%@gStM@z#dV!a4~2F;K$Z+kXhh{W1F@B|792TlY_)!5X0k z;)j73|qD`{+7)V|Bguc22MK_ zsBl}UnWTDiQ7SW4o6c6tu1St)j68RyW%xzc*&;k`^_uTIz+~r@7~{95Ty`MAd+<;O~-tP zhpk$k8CzIS#`mSXT~{`Q$xXdTef$~*M0xHtC;#fAcsU0CxRZ1-hFU!8zg5W_uGf4ktxf9R9!7L#u$xN~}-Z73h&Y1VOA>1a-edc(Ji=xf=(hI$&M^4VlSwJLM)JGDa z1)ANQm2qnDxyx#X!=5{zHEUH#X`Q)yTV+_;2Ssc3MNisFd}Gr^)6v++zZ5x*${zQx z$DojY<$mY71-y~VwFO1;B_rBmvo}_2G2Uhed?qycXLnWAL5U@vN-lf&cM_h|kafq@ zkgE%Flcx~spQxu03O>|YiAzX8MW88&vVMn`b^dr2I_-c~8Bu~VI5VXM&J`RF)469V zBCwwp{jCqMc`KUD;CfaP5#{~LT!OdVwyZP0ZGxkqe|D>7W+@}4xA#QZ;M~Ki2XpZ# zr5;n}WtGkzS-qSSA-mJlYU4?OLbM0Czsec2Z)W_V`a3EI1RMB^xnOTfSpaq@ge~r_|zJMHVfxbs$ift>?K> z^9L^=bp@PQ_Oi6K{jKRJ0sg5y%&Ceg^#+%XYg08ZW!vK^9?5$oV)X@AhDCw=HkA`E zii^kJF^Q9NpO;JJXPVghDFR$bGTdL$uOI0wozs8YZQsIa299%LW?rb}it0Vf`c0T| zUn`f9z>S21xP-ILRnq3m3JMCGqoSe?HYeK?i}m&O)zwv1Yd2=s3T6@&ibH7g^6VO! zCUGmZEj$6M)2#IRfK>X8>RSL7v@=*Iyn$&L7@V(!3v5Q0?CaMd_#A$K6ZrK^Hl~K4 zgyE;V$Ot;@H46dZQAMc}hf(LLmKWK6#-7g{b>_A1k>(GhyZeP|tv78i-ji6B+5hlj zDE;M5tGPNzk>6~OytCe|#jE7d=B{dZQhbq(vR_JCP7_`x+uH^Nm>Muh%&NzjDj3@R z6lNC!Kc5KdUX!0rOg0*?R;5ABM&{*<2dqrGNnJk2yEs3;XGY*(Q4zJ(vM9Wj;aWuO zI>;6N2Y(>$!j|%{Z+TE!IKms^mRNfH3MfPL{b)F5IW^WKKIb7W|N1m_WcEacCIz6JTyXxK@)$*@wF^ca}I}`Tt z`N_35@)`#_2{YxL>z|5QnxPz6PdQEdoJkfc33aCw&U3k4^Vr+1zW;e>eYg~z(EIS= zCa#L-V7@qD$LRt8f&ZdCj!d6Jyz{Bi>sb~#3KS$&bjdvtDt>&OY7AwMCVhWaI<9P<46~^B zryP8IJ!TxmL*LnW6w+IH;>1q8R-Ds2eret_2MY%O5EAzG8A{jUxR7v+Tiri!s@lCBdmgEMO<7sl z!Q#=QN9~=NVWB{LHLFIzf^JW_+mIqzqOs+SFmR+jE!xO(DYT4#-sO0WpJ@k1mj8LO zc#%+uS@a7eNv>O?LDlJzwC%7py>hesQ1U*dbv-tv9>tAlu)(ID;7fB)L!N)SioJ21 zx3s-vrPy&tgV}30egI<1on6r(Au)NY*n&6Uk(bvOhk$^CMth?9S-Iks*IyQSvc7eX zn6*#7KGX?<@$iLMloG;u;MUZX-HGPr<`Z^yb|F)CcFfQ8pQR=xr}&qcOQbqi(n3rV zp>b1#s~c9H}NRZmA@btPVXSLX90PF9O6%awO$2zXitH0|{J}DyTMxP+P zavzQ1pAiqxn5T7uTimE8O*S4;I~g>Pl3&YAn@OdvnIY+5P;yZM-&VDC2f0?=)NSlL zgsc1U+1jJ{P~(6AkFeX8Ue#+m+8rK|XzB!FkF1*eCF7MQZJJcJI_ONXko3zW?VM7* z>MEpF4mTEgYgg9)v7Iq4#LRnn&&A7YvuxlAQhQ4oI_XoR5Le-9jPxxX!5GPT}+Wws?z!Fj>b!h#2Zuvn117!J6EkH(k0R=CVIz6wZp$}T-Ax#Yb zX9#A@ULcR*reDa=GbkcJmyd~Yii%jjnTi7EG1NFq^Efhz?KYtW{entrN~1TFYBxWP z)UNOnY?kqHQIfcqvB^(%{=xTmg!7bGvs$NbBB&vUTCjg&!V}p00H3AVMuqzQ-8Q=^ z4!aE!$rhPqV-?X7oMBL{o-7!0;?~^$-p<_E+YmiiP`WT+6a6xWx6AR&Du6#F!f)Q} z6*So^XYvaojgCmXX({RzSTXlqTH|94Pn#Yh*_%-oX+ZEtY@SP#D&N=|{MjZkcj21b zp2se-wrv}c;pDen-aWO;xEAag_GP||c{|k6a$%dz(^!LwcS6h!dAi=KVPS>l4dSZW zizTL*B_xXLl64pSWVq(*FQ0G3Rn+vw)MnJ15x)(3d1Q;B68ObX5Wvk>H5a=WusIQL zxxW{0>A$sNd9b2h@4dC$I1apO^Yc$3b#aR$s{0=S;eN1Bu{Y=-{7zlScDd}7Vk!l95xJT3p-hhh#OvhiKMIBr1bygRo;ebnYK>N2>BArW5W z*~|H0hKIcm(Orw7v6zikrciiybOtHQY2R&VeyN;T1jlt%jSAwCsGTnNdABh0jk4P2 zKu{EYF==J84#>~+8$sR0x18#@EX~bT)s-Lk*4KM(RyxQkx2+V4Ri0MkTsS}o>U`t> z>}z$Kt~j#V3AgoVL!9KzNRfO+vgnL3pbq2?6bM=J53{&ttUat4(xo!iR>Ip>)RU8v zcH>h6_O~SK_qQ1w#TIpn$~SIszn@x>)w?Hu`J4%XpNP5yi1wKFm>XP?!g}|tBjl7^ z=RJ*&RLgYIO7Ay)KrJY9m)!2-vEpR=@&2-@$>n^GZJr(UhQwnj{xk~z1GBzDePak| z)UwbiS663~T)`fG99zJM$Hc@TX#JJ7AKo6dgp&cVpVacJOt$o+F?C-QV8mBB9+1yc z3Pm-jQ5}0M+mPX=xGie+0n2ZGzcs`ViEK_KA8c}R;x`tqwAT%$^7tumMU9;Iu6w`i zs|oog0=(%36h5-Lf<85I0*QB1#~xEgHA%;@C|25>TMrHcVu7Y;Y$)rs?C|uD8QsDH z>1jQauO}w@8^Tj*)Jy?-@O95D@; z0e}WPd;EJiESe?#<(ybssdl-J2zNJ7=+>)!m?N!@^?$9s0TX$G%Zd7RIb(fyLXDJ* z6Da4MpH7CvAnzg#b9aCC0 zzw5w#OGkeFHOFt@pS?M@bq3U?$lO)*i)pk0?c7l^J_7I0xEXaocUCxG!B`)!MD5&t z+Ka22w9DZbZ;rA}rBmv6{R0A)$6aJq#6SNsjGgjTOxmA>f0KsY+|DFQjxny#i{W4NC`&S#mvw3G-0 zZkC!Q{kJCKALR%&KWVg%?sIPs4P92L-_OG#dM73Xil~m(5e6o4tDjrgeKx=F(J7u$ zf-x;?SDlX)5ecoO{7oNnKBlQgCdY7SZz1 z@?vFVqksptIo(s!uc@PiwDOwwR^l(`B3rb_hjv09iPKKpYU0el{+eXlHn+R`X=L@| zM_P;5YIC>!rjH`01W+>8J<13BmR^2Htpzn!x=^|hWc3oO>ecj?$gU!WsZ(1%@JvK{ zsaV;(hZzy2RLD?{hi7ZEixdGBQBLK`eM2g0H*Wa(`r>>Krc(VAYP^;lep@7MKHjxH zWatZ(LhCn9*>N`?n_0|3e6Fas)WFqY0;)lsmK^E&fpds!xJ8X=z8`t>Xykp(rpwA| zCF7;H6ETdTfo2=h&eeBObG71bmF4Cze-96(lsh?{&(1N|B`z%Py{fDXD0HvOD-h@m zuN^g<{U%RUukYj&#L7y)mfjf&4iHS|4V`ub`9L6V6H6-wdIYK?nNyvqy#V@Wrl)hEjZ(>X5)DsjoFu^IyYY}pA#hn+(F<20xo{>!OQ)f2 zKJR|PAmnCuFljon#n@7t95(tq=?q}5lABs9ndlGropU?8$ZJ>dmSMCCb?Z@t8pLq@ z!mIsdweclXIz^42drxgg`=E*E{%Ukz+Pa2DZBgODmc%QdOtfasps4u@@koFD1e9Tg6AQRNu0}%)_jv$iV0R{seTu!Tr5lQh z_V5dwNS%|ew;N9J<&qo$IF(xzC$65Z-(5bf`e;3(Zu8UW?YXkf>9S6>j9XDW-N2V{ zC%(0`kd>maA$Vf~v59^SQ8aC{&rZTHX+w#NnAwf7cnmvvVO#!n z|9#2(3gr^Af}Y&;<+Q!agu%2@Y%(SE!`&!^DcZ`MN~dw(pPGG9`_FdN*2DS=P>$C9cV)il0)|kz>~K@K!6NLk3t$0 zrv#yFFhb_XB*%`bv7|)qpI?WDqKkmc0e_YaNebFa1Z;cUHGCwv-Nv?w6Oiyk!q?)c z+kmZKKImkxma4E=(Ek)r5I0YpIN^4%@8<)!%&OkYfeWMcqcw;A;m*zu5oL1iX^|ND zO{4ZybqwcLITK9%yMDHqyJ_+o%VHM=IN4$WB(j`dyWqpDr#v9&=Xs$z4O}@fvKCKa z?ZVJlX(MXQ8IpcBE;^H2438OS>hvImh$-MER3T71tGtiieXQI|W2@}+9+ZPxriQSj zISyf;G~OA0Kou~Ppw8f`l+BCoTLSS<^$6{^@r@6q^m}|Y>#e>un7-V2%{ksWEEzgo zFWt0%gLSWdT6y9P4{O%@p&`eTw^)$lVB}{xQ%5*Zev?gfNH-~3)gc51za4voK9@;^ zKmeO%kW8kD$D#&9=`(IHV`F1CcXus-IB{(P2n&lIz@|RbmCv3%n+9y?)y*a3_U=mO z%+|`(p&l3-9jzD0nd|%|7XI1k-j|%2xAg2uzuFwoq(I26@5vPhIRGLE+G#ZIae;R>Tx2OSWQxQEXuRs zPXk%rXWs%sFM%wPVrx)B=F3;_V}XjQgzQKNAbijq0Fc^kH30%$4F5qqzD>~DlS1#o zRb>u3X-itxWu^;Hx5Nmo&JD_Zr4w*0n|x^sF& zVwMXRmD69@pJ8ezuMfMLmGJHi){67aQuNlz(7xwR7)MH^{7dfep|u?}P2Q7tdp@Y+ zN!JH!;BNxy?J}UP87LrKqPL=LhhHT5;>LHzHoWO~X9Q zN4(5;H}M~WEmaXFB9WyV#B#zN5deTDK=kRS1HtqI4M-}uNgL8o)Kc;IO}2(`8)1MU z2aremR}$6ndK&=?7k>_)RUPz>$sZdK)$5&{IAtkn?sV$7h(NzPJ(RxXI|7-LxOnjDwg2R-TP_;1i zBEl&{6i(Lrtx0XCdpfNYGyiI@sWqg|YYncxaK@{HCqLfZr*&;~Rm+!5 z_&et(w@rS%eZ#*Yr@p3Wo+J&P zp&8}q2f7v(Q+n1uzLBg9f44?MJHE9XmE(yg?-f)C@}2Lmcu%Iy8<-eHX(2|7^KmcY z6Z`Fb&yOnc9{D@y`Gx6P)@R0=&lezw*UZ7eaiEsizQ5C(qkmAGE__(pY(?N_Vy)%i zqtLO5!xiC;k0)2WWo{1o)M7#SFzi9ni1sJIkn&DZSX?jj3ra_YVW(;4J|3o!<%wChU^umK zi9CH{{#=@8u7#xtgG>|jqI)2t>(chOwJ$Uu!{ipp-(*C|+*coHZcf)DS2HLb?Fb9M zrcdiA^-+PIA#xhg+DM#GS_tHO)$$p$u11&*f-L1z8M~6I*J^i$+uvCGN&ifdTzzyf zAl!hM#|ibl)!q$YZF>h|7sC(IEBwiol?pHd|D{On$iP0+dqzfp@xUEMc_5Z>{sbV! zd0xnI5`hb{LUwFHktaT~4b?31X|IpCv&Z1w_d75^* zCo_izGA!%t$%^rS1wu@T+bJyl`LXq&RN9?s`eN^aZ~VItANEf&jXWrK8Pyr7L(;T< zX&UfMUcq>~BBeJpA&aDm@&Sc<4;H5~krNZ-8X%WE&OgY*BG7DdzYlWk@9K-)g0u?q zSm7||+aMM|{l4c2*8(TDpR=s@-81)CVm(Br}#`u0fxKGrI+n5MFZ`R1*cl@b*^mKkhotuqDYAjuP@}*J;41y5ML|~*j_yhz4qFc zp?f4hgj$PwFsieAd+)(v-PR?)#Kf@s>~4a;8Y6%mlF=P{{K?U?A#crMGJ_hTxK%Gd zCAy=EC}->X7}s3soqm~E9gDRhUeQrI6YBcv7SGW7i`+TUG3!qidb+^_p8ZvhCILx& zFK16t<(GzH9nuOqDSeTC2Q1dir-#=lYKC8E=b$?*7~D|&W*VxAlT9N!_Xp873v6!5aatA;H^$}p1 zwv|;n1MWCb{#6gG^if z*{aqj!p(PZ_|HSK%>Iw+TwL$*eL%rs(oJ0ef@T19dgxPKJngfyE`Dg908+1@K(xB1 z#wk6rk|quWN4kJ4!1STM-QB|bEPrM?OoZ^L`RW{s#BTdO-9X!&C4r&~J@N^C0YS%- zL|+c;SWRYyWDAhFt?bfnu~?`TBdPp{wDXMl=M?r zmTJ?5r-YmXVxv-gmkj>FzyTm4d{_HoW<-fOP{Ee(;9O-sVkr^70mw@LW&6`WNW=Tf z_8KE3K0aPQlh_G3-EWt?RQS??M=na++S+V;WcZGKEq6CCGBS)qt*~hfx9T|x1h>aH zPRu`)vd<*>RT@yR5Rzo1lLR7tW8zHrj{1|z^w`h@d&|V@8jgBEy%rD`7Hj(>EOLd1 zM_z+Ex!-Tv>m+}T?^tqja`)@kM^$}RLsJ0p2-wVr(iBLcXlEG6Xq!o{$~cG97(XKe$5Ok+}HWFK0lo<6a;_%r}Z+6jIMc9Y)U~b?1xG~c%={GFF>FT_twO1G)|5B>1>Lkk~Mj}*x%G<~4{##xp_tgbvvAx^DK0RdCXq@*Mj zOR><_T*_yh3O%GkB=j{BDLN8{SUQ0kBZlifKt+HSnyK8!lhnCzp2YDmu|iQ zAtkL|bKcQrZJOP*9<*Gn?5@;5cqF#Gp&3MyY#m@EYB z&?>I@HFG(N@<(|_7xO9c6f8bnmfu!;XMdx3=NWCU;{(O~!@`3hGBp5r4DRGjBLN_F zem~CL;QrbZ+1quxUfVTdZI$S1i!1ehX}s!NyBW}L@@^k_Llf`+43-BT|H4$#ngKtd z^Nzm$fs3#2Za+}pSzq(&m6wmZyL)kdJ`_RyUIeAgd4>SQJk)ri!tfo1Hbl5QNLH^` za8_2(waBXiF0a?C{rTMS@43z#*L(T{cdTQt=!2Qr9D`r&i}FZ7NI_ki%0>t$*_Vu$ z&sKv|H8Nr$^K(M%ATSU9tjw}9nIRf2!>%*skiv)RW^9Zv z3%#9k5-;=xRDI>ih5p*ijQh4(?jz~Xf;ByvMw4q<WqzLAIzXp z1s5_%T>?HEWj2YnfSxe}#HZP>-%(RH3-!*JpnC-g)&v>ZtrwCgARg7kdG`1d!Jsz) z#MEf^^a&hLO4jW`$pSnUErTuq?dkDA#0!YWaGeVw@acLkb8#M$2>lPXvXkC;X~_Fn%$rZ19ytN2clKTHGH%TbC+?2RAiZyN!B5IV$3;ZU$ZM)L`r64 zn_(ujFhX`_Fou$S4A}-VhTk=PzK_%S^?1}j{ZqI5ec#vhx}LAsZDy0L!YdiSy`ecd zRHU@|Wx$0CV&{N6;Z9605jVBEn*M*yFbFF@x;tp)V08GvBM>#PMND!gu2+O2X)kq3 z)(Y{eCi*i|8soq3BCSuiQA74)kfaFPq~}t{tl*XXiT)(~@ZPEZ!*;sVhct_q+{WazXONg0UDa^Z!p1@E?)AA`gG(i7 z(avyn^!EO!dss93pqX2;Fy4X5VLu$8k9YLxI*{`I&=n+M9&E}q6c;! zq#@WVY2kXdiaM3bl19@k;V2&zL!sxUqBZ_vaad~jw6CVd6wNWCC-z{x*25t@^{^4g zcF`YuX=(Q6?u*Jo=i2>Knm5p`H#hZq2DSB$8SXtpwT@3Qzf_TEXLNW&*J!@ksnVJL zIQw53l!SmJpE~)wjL~V55%y3)(B;&zMX29A+S=M`Hv#O4_tOK8PX-strh8e7U%0yQrdHu;d;A4_LMwC-&?QUTpP9HuJte?16+Bp;7DgZto&Ej$(96A+aLPfm z3m2%g{Na7br`yKdI2JPU1rMu35%V-WzrA@AT|Ku<3sqKQ>ery>b>wJSiBBBrwRT&r z)Ts*@Z1rJ)iGtGbVMrhlXx;mvbVoPv@{xUh=WB6O&^)~cSz|`;yeM5TNUgfr=)mhntbvdtFP_3eP!up`G6-Jh^V1-D-q?p_G_Ffoon0%D? z?{+u-FPQVs5O8B>+K|0`p=lETx$ zZ%Eptbn-xbdR@F<3KoG1omBX?v2UwBCrrj=#(G-88;K^i=;R<7{wX9CXEDa3m*)nC zN*H!FDE{mA)coPP%^_bU4uieb-cBtX|NK%#sZFCqIE7dpe*`61@cD-PvZ4I4p1kj~ ze4xWz+3zZL{2ZXZ+j6L2l!p+?3&bYMJQ3^!Y`m_DNMw&UN?_Jmyc2DjYKK941qTP8 z&S^Jz^!`wWiL8c^;P`k+rB`q45#Q%^5t9@dgdX$C!(cI7vF~#qT|w&H^NU_f35U=j zW`a@~63H1P%WMO|R^ z*gvln;*{sd489H%S3pxMRj98H2IVrge|`LUR};2_r&1D1xnEmzY_aOnX1RKTe>(}FPI9zRQRn_XZ z{{DVKVPT&Ts!*1hRrbW^D7_V7L0oNwXMsW|^FSOfW|uxKOpEle z&x1O0L5-Cn9(>J1ailvfG&h1?`%p!OGowm^Wjz{|*H3Ui8?D&lRC5#bm;A~XiY=c+ zc@i=JPo{A0XKSI2K|aXV2+)DnDz?w}s)`dfLyPI?f55NUov%W{2T2=}dsvEnD`7fl z`7U%wx3R0RgwLlvMJpk(HiVV}uGgH&!ONW7m(&}>8;+ZA>G~HqT<{Id`VJ9-X=?&W zZ*mtq?eG_yL-3yc%xmnlR@ocMPQd&?j{Sze$Za}ikI%ks;2Dy`9{a@sMgApF#Fd4D{ZA8B}AUS1AY!K0I= zNl^Z)iN{-A*`w!k?7-klTXi{{vQMOYq1io$hc=Dz0=!?)P%P%>-_U3`wKIFHXY2g8omA*p)F}LV@4kX1q}db|NlE3w^wiwAs3>Zv7JU)=xsw^KFjg`L z%J_-N5AfZ!#vbEh>T`^WN`7B9TCkpvYd}VYd(vPjTKM&x1gW-BjuK`^;76HL zQ4Cx{btw_;FstNi&s{CS`Q|zeA{xbLVWPR=r%Sz16SoZ6{zeFOW(27X-N0AUju=I` zi6I$-{(1h+SM!svQGFLjG$zbn=@SjJlOqI474rd!9qs2x4o?p>yn7O@{( z-`18NfWQAc_>aEJ6)44{>N25pquvOup-U4;-dAb*iOl!B;Mk_SAF0BmD-l+AgBW!DaJQ|ZSRYVm|pvj_X?3I?#={|JF zDO?|`0yXSm1Xdc(p+go*ejbx&9cf!5X`~BF#4AK|W5LR2Atx-TMv^Yz1=qM{Y*s<3 zR(Ua4{o9tG&HJ<8kvm0n?jd(N#y}1fq)QY6@RR`a?H^zopM~-#Uthmzp)UP`v$ZIGfQVl zHq;WT-2RT?y#!6mN$UWJP1*m%_3G`SI{$I z7I;saDAi@^diy!s_Ll<#7{o)8f_0f`TxgyulCy+UT~P`l<1gkrA2ILUJaCke#z?GG zkrWfVN;@TDGme>!`Vd=L7yUUlg&7z`y5nxwNxDeyTci2g%z3phmUw4qlW?v@F6TAA zUZbkMa#aziJZ)|q8%uem64t%NB<5c^9ei)jcuk$H{P0fngs_eVAX4oB1=nHL7RGX5 zo;lwNHi_~Edlf9>!SVfY{u@=rvOg~Z@sa$(dC@x<3N8fq+K$>P--0LwSGt!ZU@KX+ zwvnB(p@R#EkbDU+5VSq%^^e!9blLzK$K7{x2pM2r0I<)C+IIxs( zq4pUF7M#`#3^u1HYu#k)c{tbMc7a9fa;cP(KMW%?J$n*YzQ9nvcj?=UkM|lU$Ay*~ zC+p^!=NP_mSE*n;be*7qEapy7@TBN}EA@s2Z3ccn~8 zJ0QQg1peh|NfbX+#bu$|MZfJp2nKuzeH^;StEeJ-zv`LJaD?{H!r(s$gHcuTX@LUc zSCNzlM+<_W$pCJ0yp_N^iCD`FsvQV@nl(h?)9sRBR;dLbhZQ(C4;ob_%H(Rai`{ly z>=_ut^?5tQ!!bU@H5oSk+Q;WKyP{;TT4EYi*>u&0j1U)mkIzzSs*3Joo-p$_3EpF8 z*ms-^I0A@X$uHzhWrd(MJekwZYiSz(kQw{8$QlPyXS7PZBF=JRLHC_=>jWE9E=H1HHbP}jjx*dW|dk; zm>5?VrVLQ6MZh$y*IKSvclFnq03cRDI~f z`CmOAlF#4C`5?_YVQ+Z=zwN_rv|g^VmQG%mhXTdlhTegvwby?CBk~G~pILhFk8ncV zqrja%=p<*j_P|tnM;sYL{^lt(?^>$eB%5c`*~6+Le)DM*f7(-Q8n@<)!Roju zsY=y;fl7Fdma;;&a13t*;>h`^m+^QN{5Bd66%kvC4WhBw^|%5x;wb86Ox3P`F)Nk|@WNt$HUJ5hDi4@>e1>5Q5;m8!X1a@9OZ&eyv(*Aw~MKcC%S7$Z<_ zBFxD*jP)Q2=I`AjMpmhq`&{-iLHXv})p003xzn)Qcrq6(DHtW2oKD(9n*w#V{*^ww z`&fPDNW1YFQrx8V-o9;BijpdfjZy8EvK3j4@?{<6G=zic@Pd2DYh^?G530d3)c{K&s)OR_APRRtE`llYGY~ZE5*;PnsH&*eW445;>AEn7eq26_quNP$k6T zQPJ3F&F>2>A-G+fcjQ`t!=jV*jtNQD8*Z(3tT-CeITfCd_{lndS8j;?G^UrlLsAyR zFQ@W;4f&P@-aSYk8yi#S4fqy7&-v=6MuSm7sQFQIE7a#UW`VN@h;^GW;STcgM? z&6Wz&gGWqZArW_8WNcER^k9Kfef6(q9NOMwfys(j7GwsR%rxZv&78m)zP+(oYIx4_ z3vr|%{(EF)zpN1|$0+eKsE%=i^Y=}Fok^Yuke-9O0v775re;A=(Wi7qQzvh_5*{Aj zI=>j2K;P?Mt?56*Vslz0kWL(~?OQDiK>~B7Z-d=e-)4}<$}G=S&7I5jMe*ygm-^H2 z;Yy{xvu8>#`nbCVP*-Vf&pUn-OY896W4%{F%vIsq(B^?6S~#AAEOv9tqSe*hMGehl zh$I<%%HPRNKH!RF<~wCZJofr$@E-9sVlX*ER?p`Kb-6n_I(p8`%xvR62!+homL;|K z;g)<3b|TAEhgt$5&7|<^tg*HFc4};TGmo?)hU5#uRf zlZSm%%z3O)>5UFJ=ird&%-LLbWY3c3cp%Nm{jt2UVP~^sz=YP$h_PPZ&}%v9nQqy3 z`}Mu51Z8x=ogCFtr@lVo4Gy}&BWIF^#}mopR1P){2C&X)=!il3SkTP=oM@6q&}|gM zPahQ0;UV3@cF0^yKALPUja`0>!yN1iBnAC!eb#YTj6J2wgtARTc6XO4=72@rIw80bmAj8u@W@S!7!!wRrc#-b%w*l{5R25>z5pUf7w% z|L5ne8Jq@Y?bv3AnAivq2ICpT4KFRILBGXo2X7MUxXg^YjpdR{sV!s4-Zw`BvUmRX zH^3TCym}(>H)Fe%y6{5<55#R6%c}roxSzzVHt!S^lFdC*uJs|$w0#fY&Z4#KX@#RuV-C5-m8blv=flu=!-eK*R*Ymi8@x?F1ix*CKUYDuti7xjwUSa! z(i>pqVr%+Z8ic!0{I&!6IK*7eZ@FHi4$EnLZ{@_TjJ{>YvOFpJfJgM3UErXe#-S&* z?|aVe`;j%4TvknXl?3K>&?!ae#1oaL-CJxi|5`H3BL$}?GC`%82+FU_K3X6SID8Pu z4I7P6dTB#*{X@I=QOh_e*m+AsTrSf)+res4h^^Q%6#b@B+5ZXGp!VV@@r)PZ%mIaO zn?4WHww5WeFSIo@*Efgd=^@Rb;jU-X1e<@M$!2o5UJyGoVQfx7liF(6)og#6pp*(y zlrD8w7{%Y#w&~A#ArFKD=+MFI^9BQMYH$Zk&3|k3xp(hRxEjC&W`3^kEKal>O-mNn ziLm)rIX1&0v$9Z)bOQ<9*7{LN0xr$1fUwc){qoP`x{nZys&a^sh4kKd7^fAk9wn$GtWgk+NELxhKG#mP_ zgP!!KYwM3mdL_kTRO=Ok9Zkg5q2Z+R*WOtDCczu17s7e3so3I`E@N~y%WTc*a(*I^{Z>}U8&A!l0rc~;8u*Y;qC?a^3Cp3Q( z#1)^~OqmCAw#A>X8=vAp1tNV%SE?~hEpt)Um{Losj*HHF*6HNq>II{~$%TbPV2f%V zEJuOU6#AiV(4u)z5ipXMU?h;&_hRUKC{9ekokMWY=_KMNef2AkeVeO;8r9>lXC%?V zfks3y{Pihed~fX3DHI$sdfUY1y3%=iC@wIpfGKHO{8@=X6X#oI*3Gfl%j*pCTsant z57#$uX1Fe&4OhBqeAt>1;z`yX?fcnKujVJ1!`Aq}ZW>gqjb3P?{h<*VZo6BqZEI_* zQA;GAh2bW!c4zm;@+8!(j%MQ%>TF61HrSfavTXGVUh)Ye`nH1O`pZF4+*{YA;*E*g zD?Y*fS_z&gL9z%5h2%c=BoCCCHw=4NR8%G9R67d~ew#9j8jrf^-=&)8e~(4Dyid(dOn|57Jg=kPSna-~jYh*F0-ABK$5->RF|X{8ZA5}{1JMpr#ADy> zl`W@xfRH45gXts93% zo|yZF+oE6UfZ~rEsAnh%R(YJmDC=Ay_*G-H)>aNiw-&UBK0o=D^^4$DYftPomx^5e zNNm_YNd(`GzMA*|%yK8@$#zNc_KC%IxEMEhUfVf4_yod1)hdK7wk31%z0*l!gXf^C zsBli)S8zbxNs0B_X=**bJ^gVU>b}NZ{VQ)S6MvK1{^H6#Y0o4X$vpoNa$1Gtw!u^nLj2M^{>*-d$u!q~ zkGYho#OhK%bhSW6&u76XKUYTKu_BK&<`RQc?Zx#G!72JKjuMkzHLzEt|Dvk`t#V(Z zHm-{laO;*GY#{i)V5t4Nwp4N}Q`LDAyzGOlmMQjWnMJ7ANpU==^3=j|; zjf!;~zZ`Lzx$s?j&z0)e#j&x+dN4G$7I$@-ixguhRJ37^jC2{?A&wDo{ptC;dYzMM zO6My({Wc?0yxYU$C8N2E^dXUC^E*D>TGFb6qPll}Dh_`Qs~gL=ow*e0^rv2TQBgLI z%24LfV_d+fYthToy%JE5W&@e0D_MWYwA)AZ$s3LKCkpqN_1B@&Mo{(iTKOD;_h8Qj zJW+UP+sSxwdFxo)GL4~-Xa50Zd7ffGS&r@4dCVgzgj6xC{_F8;+W4Va1qDr}N=3EP z>mrxt(SRYnT2(UCmUmU9EvH?u8BUh8aD-z#i8(ypZju-Rvu&VM-qu)rawpjQ&q^@0 zv{W%wQgrkIaA`pP3`H$@7hK7nXiYC(twhE$kt@Bj+qIKPQG zMLQ4TkCD@DI=fY#h%xGzfmBbXSk``*6S7ET$>oEXe#HD?l$ifiI|?9xwGqtq5$@8rf82OI5y5$``)sZY1KOw)G462n+(RE8mTNoXV08h!{A<40KeO8>mZp0Zcqnf9IVJxL=9x5ye(a*jR!>)n5LQl0 zxG^0u9o~k<1iTCyp7VRMxzOUL-;9s!=~J~EC6C%mygHE7qY}BU!uPD1OQLLo%c_DZ{%>E~b>Dx3mU& z-wF@<%-LiS>d>2zHig08P=s{i117RbJ{}(NkZfLjuQHJbT~AEmG~VPX?llrK&bU=a z(xIlfmTqe&Mr>0`tM#IAhaAzg1+}TJ%39Y0Bty4Nl7gvjf~N&;;K?{5*L6`=NC32D z03Uc>CSXMfY{2AU2n*dHuo7^bi_I4$=j9!7uRL7fHb78De#T}Jp=*R|I4SsjN~>QG zc$IxTJ|@r7z7k;BRi!21*ax{aC!049AsPSRjovm1Otzc5IhK- z7pTL4p#!n>$%HYLx7AtQ(q`OvJavI!(|8C&VF zf_4i+|L$(M2NRLLG}Ud96Zl>UHPhu^jK!Q}5f_FdCn@#OWKln~wmr4~UxU}6W+yC4 z&mANksk3)tG>^3`(9}JK*5?azg4xgvZLIdf@a#E^vum2}B!bKbrXO$VyVyQ2xuk_| z`M!2wNw5!FkyBCDmP5ofAM`IX+v(|T^V8TXRsgo(rp^j{Mc9(YfH2wtRYP0Jwm8 zT&K8punCXc1SIi!=VXnOyCus;(rxh=tqFXdJdL{M=J0g4=9ZxMa~DsaJ3o9!RT4sM zhQ?eH9jKifoBCyIostY zn>a7yw7b~4?2w;jnSY}w@~Xl;tfN!=sO~%Oc z{{3|5ztx_YJT)pP-svg52R-jXwW@ZwD%}@hqy9k^n8R^vmGKw1-y~8uq}}!JDSB1J zs==0feerI^ww}j-?b3Io>id3s#_wS1e1Og z{2$Ww#uo3If8hZe?xzK+2Srb)l4s!PbA%wB*Fb6qV?e?F2wyO77(L47GSm&uNnidcvw|DmlYg&G0%K_s1Z&sCZPX)ct# zKzrQ$pil(*&;S05kj2R5Cqs3-ANgNvhNfgalz+8B92Rp0GB4R*OE6pp^#>Nu z^b3T?Y+x`4l~|66>>W9c^36XBR?U>qYlIH~z zFW~sR7@?!@!)rO61skjD+ZyddrkPTf>`%5BZK7&d)_O~W*`JVcqsKE`aJk$Sy%${Z zW_iX%q*Na0MWA#{6J;g&{%1!fp>HseHO~2dAqNCPI zX&_v}>ou2hv`~6)z-nMyq0PaY_ovRUq>UpQ_@Q!cRx)a0!(M!G5*D zivK&XL=vJZ(^bOum9?Cv3;!Gj*U1~po9W3T6&+(tAp+?m$lnbxIhXhm>_RQEgV>p5UD0WL zu{DHkJzA(rG^-94pIggdg}k|f1y#WKq=GR&KR@IIJv-A@d#BXA_r=Wjt9z=rJc$>E z<^b9QxD71_sLOXX1x`)mDEGxw$L;YwT%uVRiSyqSYYBs1!2B(L-3ZiUni7&W?GL^8G_{q zpUBZ#q|@tRgP8#b{~AJ7kdv4MawkT4J^ar)eHx;#HpN^fzsy+#hbdV2Mde=!Il)5B zWup)S>}l7%eY?KVnxQ^i$Aj~D#f~5R@(Bny1N7HLXlh#)GpnoJ5LT|3 z=GpP`N>!!gySW#~+00dQ^}RI)J=t2%z|MNt=2`})`r>2OJ`ags2A4JWq9zCj*$0X| zq^;2bu63jUXGB2i3wfT@3x;=aqruN(I^5fR(OPXHB*T&-Q5Wk~IT4oid1i7l;%@mq zXdu-`dQ%GA#Wn&)$KO^WVImY8!)kO}X}DW1DXEv#qW&Z3kPw2Wg^Pu{HIA~FBT73W zZ`zr0T6F7il65hgLk2`L+eN4d_y+`So zI^UWOw3Lt5z*t>q59%Z4w3kpodj$m?KQSsxl4nGIYUM%KLUw23q}{HP`}B+hpt}9R zP|ZSr+s*^FXL$$}u#R&OK{lT02<{U5Oz%_~BM8)ymW&*Vlvj8_zqU0u!rE?}eWeEP zu87bz?6_esfR!AOvg1xRA_hG5bCq{-Rs4=c$10x;)9NH59#T>o(4!|hN!#8Qzg=D& zC%*dcjAyoqEU)M1S=Z|7hV@#A4orVi+jz+?BQ?uIG;gQV2cQ{#(dndTmC8FL?LZu_RzxnGD_%5)E$J1T^5^EC5-7h z4|@6ycbi$HM9?~Ab>iOSQ$mYoF6TX3_h-rNWGH_Xxzo}(HrYHJ_8`qoZ5SK|oI*ll z<8V%9W{~fL2kh_b>p@ZlpHEM`J+l4o^Bs{d1&C^16bMjzO4)902`fk_O|zrmJ7qC! z;}AsJoYYmiSLuV&BmFq1{*Ls4<`8x?N|%;y?{!8d5bwJS_-cyy7uu@tfG zqic6^6>ZX>kapl*De~=WrMY414=4{+(&h6=S{M z$bCFu`z#Q&Pe547$;#qURl)3WnDos<2%=mbfG&rP5|2x{@L@B$A+XtD#;@pi%XeWR zD8p%D%YYv4Qra`7U>&MHW%10ziY*u1&6}e zvgNCCHv|+zoVr9-by{1qT%|wIn?BC0x>?zfSsr#9diOST!_z*0|yd;)_d^3kRB^{1j9$-5KZrx4WOPFbV(f%? zk#XEkUpL~c@P;G7Y;w7@d;g4A@Nz;fY4AChv7q#AVdZ&XF;iC*xf2=V*>>8KY-8=Z z<)_sVn+VOtJ9*gv6l_Wt^VSugdY)C*}ud!7&J`YCNseAPr0vpecGEiR=L zujyYS!9-l=VWdE0{SWd}OL&*-jYDPVOgyjI>(+MD->W=2dIzzps%rUAh{^@{heCbB zGn1R~?{ zOc0Cy9jDyQRjD8KoDuKVx7#+j{H72)>k&$)N(>mxh=x<>m2|P(7Wa_Z<(jX5P?LZE zxs+yx@({ExtYZRpy|4DA_wjI3*gzs75s2Gw4P#@Lz?1STD=EoZGaw-b5*|Nu9Hv`eA0bJu2+w)NDGUa^J(;Dm-kIZ=H6Mxm@KZIl6E8a2qGD!ikqcqm77fi`Z zHg+o84hpvA&R5iglLd&Dl}!^M$sFogem8~eS_zsg$F*ygVQX%j*%aSTEF56;4`oE` zgcn#GGq?U+RgYNnD4{DZF---#A?%jB1U+*`d3U!q)C!wx;F@AUDR^HiXRd_Gcw2N7 zhWU*bo_Av3X0Zx~a5CO<_qLnf8ZW&1T_302`2-F-rB2S~Qg}!PVn~)>2eq2R^vBe2 z7Fp>hA^0S>3^8W!tBYDnX#m>!9aGwqM!vLU79nHgb%F7Xrri~hdU$Gc zYx_r=!}gQjGw+RF1{d4DJZSfT!)%aoEv~zvS=WlF3uk|ylP>kFpH)}sr>zX_$-8)W zNIy8(Z9or`gW}&ti9ejLi{eyOx1;#ps)Qv-N|7Vc?~0v%PHoS=V!)%Do|5&!)pT(z zg`w`43Pz}!@ z#1F*kw+YllOI5VkOHt*P;yF0qfl-Gv8Q)>uD@6Z&22|A*j#6S(yzT4>zrdiu^~%}N zo2+!2cjF7ot)_YSemCCS5m5fg_4Q0%WFeUSoKEKPC}4Ux=iU3P|FmAHYn$-q;fFx7 zKM7tN6FIA`U09}=5mYn#al5vD1PKMj%wWY>L9(ftjk+q`od(V~yte68(0sri+Z{$B zCbX%YUHcJ&>D*m%PUR`)Ce89l2`<&01~ zUbkzKH8ENth*{lP_Ki9Tn{~hC-paS8#+b<)G;yC*&J?@KrOP;p5+)!ZxA==%+Rt*b z0^aw4;BuoUY1dED-3jf$`w}eE(l#M`i8TRQw{~WBmS%eU#5age+N=LwE@>O6EGtqj z*hw#G@p47i;QbzT9QnP2P6i5Ih+MJgHbzuec@9&1NHU?v;7CPNQ~IP&+FA}5qW#sJ z_q&qXMF&x`dCxx4uA7q>gWP`03nYhPx5GrU1Q31$?DipB`EHYK3opa_eKG|y1$%hP zF2GQa9zC)t0qEn=`)6k^VNd)1Zi=A7rsf%d=jT8Igyol1hyEEM1>u7v(L3f+*RGYKdw9L zew()C%twKh)ry+N)aoUxI@f$R8xAU=1i=ky=5Xt^NG;LPj9vIWMo`)91!wTO3?yIl^fb?sQP+Gi6?`?`u&HWktm_fWPJaHKtCo4 z@8B-;n)X7|viN>QfH!I%>889soWCG&fL{r&tY=`i`M)eMa0!EtOjzGjVSv_5{}C)x z^yKl(%uI}0hH27kN=mhR2u?wZ)^3q)0oDh;1`Cg_d7T_x1 zQr7g!H757@b6(H2)A)$xQxd1ul)L+^5+b31w6#sNRE>*dV%!ymPf@v;=u_%!=T$H1hFu44sWn`A7Wj|1-y(~PiAv$RH*DC+H3bp(c*@B%X$lslint%UO ze%%8~0b&q<^oOU5{s1PjeA#9BBX~3k{XrXrAa5#zw8ZUoIVGr*uU8NM&b%WLlk6Nz z%POK5MTF?S2Pa%EmnQpO}5tcEZNJUs!*1rND`6#~_x zdn%dyZ63S$emoTcq6TDMP=mDOB>CW~d-VQG4Ok}XT{Ei6yC|vU{2GH5TcBl{KU(lq zYabGXK7eZyDWEi&+VCs~MQd&`)rYg`^ZktWtOKod{*4=Kt>g16=S^fe9CKF9) zz6WbGVV6c06(3tV&q}C6pR_saWsMjW{vqayazG4!>92i?h9yNt4VhRC7Ezgxbl zUbR5p5MmnWkn;;kLj@junG(!_>qAQZ-jCTxx1`)$RN05NV-s;LDSD-~Y{SgU0hW)$ z2Bs9Eki*~60@hiC@s$ZHZv~%0VnMn*}cW^r{1|LGIsaF30$%<2y=Hxba5DU z7e+UXka&{~sA<;k!8(q)R6clfv!oGXw49%MY5&@}{gCAhTZ+;iF4kNkW<5?>alk2G z3+mL{vk^|`9^ixzq2rsb*o}sG9VfQX0h{owBdKa@8&2aFQI#(ubM4cpW?bH-)(n9f#nV?ZRZoF=o`v={Qi`kf|4clF;K zw2@dhH1#K~tJc2pY5ZpJ#?k5mtaraGskZ1S4?Tyg4c2sNvXciXRxSTkKkV+Ws;dym zWOw`)AzJFHD0@@a{Iu*}x}2jFKg)hRci7*C6ZhIQXvLY@wfxtio;ZvW{rUiYxwIvH zR)@xIh?B&7%#?L_(O63LZAQqQ@&)kzaDJkRYeS@#Th2e$(06sBI$L?crmpb%MSf8c zWX}YZK_3B!)^PjX@;PW9Hs0J&6jx4b(UjDCkvsxZaK)CVNAxV)s>)K~y0x{O9asiX z6U%6^(e5Icjtr<&ZH9!`J5J{KtVldiA5jUDsF_w?q_G_Cq}^iGh4ZCLFlm+thV-Y| z3>|?dxhqN_GAAMy^0BzUx3n&AFve{)LYjDs)8^dajSN4Im&B32MM`^)E61B~u0oj@ zmw_>3|Jo)3?))F4;JYzDB>H+R6U%rCqMm%gQ&&HjK7*&(!HSiAoPh4<-jTbAoIzyM z`&9TNJNYGLb!dEUHcxPVqyhfek0laGLlRQ=XwBh#cQZP6&gTkJP=O+^Xskb*FsGMo zqDGYLS3EX75)hO@$BNt5V#J%iEA#)zOz-M;>umiIO!kO~E9AumK)S*MwG6a&Mr&s_D>-DQ9PdfOw^SS^(|$xtMjgrTX3zOtr)957 znNya1pbJjFYV^V?d*ZsA3HnYh35R_PY4bNK=t6!qc1zB4x_8`W{aJTips{Fr;7!{QH` z2GP%ICRf+V4b?(Nj^xa#oOfOk5`dw3t6vrWg%}mno42H-3iiMh%VxNe!qYfmc{!;n zl+l68gwL}oJ_S|BBpyr(COuaf7%i&PsEGFyCaFN?u7x78?&3?96~)3oO^efPLnx-* z9p-#ia+ovM_Nm+G2u7|vzcGwx;RdpnYaT&F{y4i~c}rX5PZw65W3sueyu))ZIq=NE zlU$1p_Vc_In}AHLIcS%1;H!mO)WC;}k-C@|QmslI|L-m%TKZ>SIcqQdbg^m%T$fT~ zIwiZ`A35R@Pu!Ifof4@}SVQ-f;Xd!uUkDrUp)nuC_eOVKFEKS+L5Sy-C`QKi#y?nW z@U|gY=nO1&qWgJgzD?sNEF*{J?&Cfggdel@?DzX4lZAv2+O4vMev>tVtoQGf zN5WDrc&h1@Qo6g?dz7^M97Id;fC41py;e}^uYGY1X2(SaQZHX~HZ=D`Fi6G}+;V9d zN{3n^VJ#u%kyA>@YRs*LN2#S&l*|cO=5SOk+K2v;vzv$+E||jyW?*86Y~y83uYOz& z-}kReB1@`Zl$@R%@n4;Yk6@Z{Q_JAaFDxt!yPGQpY38&`6kELZL{Ohlo&u#3WCSGr z@#@aX+{l(0f9?J1$=X!mTWX12fuhgZKvdT?szFf#0FxrS1(!V*dP`V_E zns|X3)Cmd6CLwaYPs^B~l8b9_QF-_0_5(lAT;|rL*yrsD+?|^mDMf;2#u{fahIY7Z zx`&itOmuX#WW-70J@tAhc;Em4Cqg^B)}C@qXh6jM367IxH{?OW+Rg;N45FPv%@Yp$ z6_dzwD^tcj{3*?)ocm5<_QPD}v^Uzjt+iG2<8d-_%7c8?ZXx8Ed@7$>Pq3L{*~PVbiq>=H>(o}?s4Xp z--+g@lfB+=m*a@Do4gbkT5<4tff2g1L-rav;md_SVt^jJ-hs(GT5wIMvrjfB=>FK^Yb)n;pIDu7^4z=YAyRSAiNi zA1)jBpHhauz?LCDgS1dRl%WpfmcD%Rcz0ZZ`8`hgm_2efs>n47yKx^W@DOGGGXD7X zrmPOXVf~5<{k8r%y*UHoKs#FM7T0I{>_q z6ixbs#9)XRxz%OO`r~F#acR!jca`ElD$w^x-V-CL>b=&NU|a+DXcKfC<0I=c zml_-8v>_4&!)1Z($d7c8>YF93|9(-!L)Oo$`^b$!+p65R1oxZfc3#zMzKB<@!;v4P z#&7~orI>uQz5VB$Dn*%JgQiA|tu2eHw5yZ zK6Jn1P6W4~W$!@ePQ*8rI2J?+m+!@%DsUbshF5cHB0Ci~)+7YuP_%u5p}7xcOII9f z>JS^%qDOU?W`Ajcyfd-~!IMN!-2E`7I{SF*3na|G`e&hG9!`8WyHUaUKwoj64(-#5 z+}4*~#kAggR7j{4VNUQ^6V3g$Wb?_^2Hu84jy$Uvy8P^>6R{}f%uyFk zvhQZt8pl*#U!$gaMHFy;Y>E_WsLqo0Qxeufokl92B7-2UH3+Y`@uUXLbLTkUnwpwc z%3rsXq`h7Sm8V8IElN=SI9u|K!_JCDkdil_e3dIkBFb^O7Skr=!!A5;KbrrGUzV{-W#}eQO6Q{?f}h z1z+99qKhETn7f(G_SsK_BF5*Cc6kHg`_!zd!?J-&oRN0aN9{D-iMYVGx=2@{x`)&QsHz7SN7BGB$~_Q6o+8E@kA;Usb=Z+HmXvX;bYFn#~-j7OIP z{M7txxoBabVzf-jaG0G^PtGO7J&i-i#umiha}ru%J85qyCR2fJn7qTp=p;ckhZ3!zjP5RQJ$y6gRxDMJN^vJCN`2WqF-74hquuGA6IW4 z4Q2fQ{SRZ`$(DU75s9*v>>-jZ62_h-X6(CRhAhceDT=Z$ku8j6vTv1rkFl$)Lx{mx zesACVcka*q`CiAV(?5<}*SxRS@_as?0rHpC(;vQohv@LtFA<(p&QK8SUi7`hTlXNQ z$i*Xphy_fEK}f8-X87ADwVKt~Bw#rhfli`!icrcDuqzFjKY9XMv~s|lISmDxpXHH}k@Jd0#ZoervMVh@8tky!E;{JT zSfBr72+=zc*PTwDXH9>tM{toh)7xy+sZXTB;l6jX4tGZJ*Z)1epgVht5J`Sz{E8{( zIi@CJJV7&_+Ud;s2*}rJJ4@Yg7$hzg#`oe9Exr(z2f|}KgsYX!`Vj-L&bz5RiO)wd zI=9a3(CMTdi`uA#Xu;zP%V&t79aT?e;-m8!X+3d>T_|VEA%JCR&SLlQ6&go z3Uv^=Ei$DJ06QT?jWDm@uQQJXF6F8tkJ?5&ghdY29V)lri`^WS*8C$8i}vfVCATS4P_!OW%38P zR1S4*DwM{1KPi1v2c&uKa_0j=&|*EUdD;XX9iRyPKV*2I*8yN3pu%(lQ_TcA%;G4G zl#Tf$Az8GhCoU%oh?Bo2bvpp58E|g8$Z!qWN@Xp0{`|@qqXBqb=eFD5a8Q>6r0r&t z-^iUh2d~TVZ`wBlX9f_~R)n;!yeFyiu{8^rCA}FrFYc!k`5vq}D*J}W9Na2J>@4*N zhU%N-(Vs{DJwNv~x;qV)TYvglkXd#oJirj3rLyNIu(3>6+3sqC>)ro>gQf2d-{Hs0 zvNRZ&PiG8ohS9(s(tqtY*WQ~{{*61LqyAxjsJyg3RZ#YO^JuVshLG{%jn9@xrB!*Q zn>;&ucE9EO_+Iz;9zn?8fC~7G7-v-Ma}+R{N7H(o4l+FSz-S1Z+oG4>4ZV74WEJjYK8!nriYxv+5V1K4CV0|%CQ`2_j05}@$| z;e61?3qv)&H2RM0dR6nf(}T|P69`e3iBl-gtE))iR`+!9s|rS>8~@O%10e?zJzC$U zo`3xDB@g(fsIA1^z>G=%7hK&hvA^8D1*FXgda5u0l){*rb0RiJ;4+EvBC)rd9WZ_TTTFunvW z{Yj+(kGp$Q$R++O^7_y6^}p1X?yibEs*`>x4~%1et;;`*xNmH!9^|P(Dt(FM1o;~< z+E0$wHHZ~S-+YOCSFSt8%PyxNRc!}8fF0Bqbt=FrH#45mZCuXNm;bzzs~@`$ zn=n%rLF2k6$HHw~u`ep{mIVVfYz_R~Yqit}0@vSe791vRG~o`}nz)Mt*nb4vao-`n zKyFQ)0iRL8DAQ!jTlsK<&9spJEI3Z7>tEJ`EUX;BIGsVLoNw?m!Fu#Jco~KReb;ZW zVp_C*{1zavZg3^k@vE&D82lCXMyjp%SUp;7a3%RH;Ge5my1}e2bM~`A(Lp1~2X;(# ztrnaN9I|GMlBs%NBzcueYjiqCDh^`j7k@uXL`J$GV z+preP#RnG5t{Qo4GqE;zjk${N>YBcJnN0oWa^ap(w(g~e6VzfSo6CRq55TDbN+qDb zJ10myCcgaWkIqPi$ z`wmRDp3~kN7|c&&c-*5fiEhJ!Jw!qMUs$zg`a`;eA+4`C(Z4yO@2Bg}Dd4&JDgPsZ zoXK;nV7vh2*rg#!#L4|7t*xV-iPXYuN{wtJ_f&rx-KOR2K7QF4vEHmN8q?u9p|}J} zuspwVbedK50m#Qg{=Hm=8;DWPT8&G_Uts2b>X8b@nm(?#^&S8J z1K$9|d4MMY9?w!U+Ts$nH^1Z8cH&Y#4!Klhoh-clCc5}e$f@kIgh8wVme1qk%|&XX zSDcGtxzFZ)@z>z&GoFvK2o+qEe$a72=;^QCJ-LgWu?oyLGdP8Zrw|uj4ow(+wYcC4 z*U|O6@agist3sFQ#awk>H$5Ks^x3=khv1mEs_C6ef}B9)0ia=_%7s8rDRM0`VVV~# z#zAH%AhEdeY)IF%_49Frd&{0V?`=x^T&dkj%D=N;ndwBVzFUU5`=@it^+gBm_Y&;z zm9{T>6vRvoA*{ZA*Rw2s*=c7b#KjOBf#6h@R%@c%kC{XRDm8G-195Yy7vNM9o*|0( zZ(E-SRw;_q5<>&lyDzyHfh?jK)Aw5qVH}fOuj-LqY;ia6BVCfia{iKA!-$R9K@p_J zP7S`*RDz~fpQ?NF&SvAtiDl@n9<|6Dr~ii~-b|UtWTo>`S5Q0U34v~CB9((9JZNuc zEF1)w{bnp&cFqJ$%ugv_KpMw#P(MYa+66`Dv+Zh?_JG{T&}_Hx@hv^eaQm{sJXgf% zl_5Np3U-#)L}zF67Ges5D|=H5Zsq@xPL6#4PR+~DKLTKWKpZg=8g|z-NK0!#Y~dzX zk{%bG?qY_Ef|Lvwz;?x6i66cs_<;Jds}{AMXkV;?bH_^X9q0I0&tePz+`1tzE6*}P zQ?&lgD(6oEr@UjV&OM>7@(HQ1YyR9p*$UggEPk=bJFWz)xCG54k5j*Nk{?ce`B1Y9 z@UtDhxd`PykN>1o5*PpOwX|kckXp&uS!Sck$s6A9UqUNu`r?&8F7!)3dFb?u^|7L+ zlUXCB8q+_H^>i{FlmHdWUuzY=T&y+y<2NRB7rhE^8YsV#!CCV6#v@|X8i>zh*EWkW zZxmJ^+;WxSS`CX-ku1B@W-r|qD&00_Iu!4v!~m4{fyW2ZA63E=0R&i@lI=%Xk1aN$}+DI>Zb|Jz^jLi6(mTen9zTmjbBid$%NX=lbc zMC{TGrm@-s@8A&M8mM$?At}c!dzXxa(Qj*Wb5jv9LK=sZ?5{iF%x4)WY1*Elcu7i5QNTr{(r7BhF=+`nvNjl{{2kftWEhN{_E^L%|XCIc#dvWsZa0w z2(|%Y%d-3`{+Gak@q;a` zt!b5=uc985W+-|p1ri<9kWj|@edg?8Iw4qjGK}J>Q*>%g>dSwwQ|@A`@;7o8B%HC|mcY_{VQlPoImq%j+u!)NG2sDR$7@GNN75*? zu`Y!@q*CkX>-8Hwc~el(wgR;`1>F67ja zdiia|CToxJ(#|o{guKc0^!@qiuE)1OJlF<1H>Hq$x~;Ff46{fAOey#uRqhZKiqgZ> z)bExjHcN+NMPJR4-*+ui1vkG{wu+n|k<=L@*B}-U{5&^FJK)-m+)S9(O%384rOJ}8 z?++k9>DBXS%9D>>^g!3J`@wR{+#m<WrD+n%Y(WQ=OSPR&t- z5YV-Avh(;`N&8XttMy~#fwlF1L{-FGz!I+5EwiDZwsm3uE3$Q?3Emx6u*8}9UMFMy zAM7CV=3w8C|6E5NdBs=Rm@oPxzL-mVoSU5u`?rt(e(sLmt>xh0P-$*x3TiGchC1BO zPRWrIy>})gaE~^l=BCGz8}}doyApXx8igEdpGwN;x8kMy?gHw(`;o3@#khT=_0r;E z&U3@S-9Pl;yS?b?(VL#N&at-9m}V>JWJ{d=puyo5AN_3m0FwK%%SDGX;TzVA-qv0- zf>Z}u01+T_QWaDCRi8Ki0drrV*^=+aD-@Mz+p9ck6h)Sr5R;MJOu{g&SE*738-?n# ze>Y}q211JN|KPZvn|Il$3C@g?(NItbXy5M;OJ-O7wv|ieBH>AHSjswT81z$|jyVFQ zE_Zzab^s@PIsat2CF`JYko<2{w)>`p6^3zgymm+~1~KQo+MKl7 z+tih5^SA`U$$U}44M1VS&cIe<>D&-`1pF1vVZiufQ09Ti1j{Kf z^BxCC1)*epv}A?XNPg6#oC~5+Sg}!kTE~2j_wX!kSZWKB>aF$XF6BHX1*C67nVZy2 zKz9M2yuUlY_0B)T2O#+9@BW^1UE>jH%jJ~%*4EK^+Z<^wXfCteExEKrN`*8ADK1w! zZN6XZB3*)1I=3sRR7v0d%Hii`($f@RsuodIpA#fmi5sY+*L%G`KQ_Q9In`2^#{365 zRI&anG+PG3Qp;(D5n^6J7$QcllP4Q9*(Dp#|3yFB+iTf^reum)WIa>;j6#!Q>-d#@ zIBc8si)^Jtn8Xyc1NYsd`L|j8K6wT!cYU7}wzA^0tG8M_I^qJ2gMyM$2Y|V4_ut-{ zKRDnVS^YP=eScDLQEA{UF!}oqTNd;Cm5_mC{@#3vd-0~3%tjAg{EWCBFq+=a%vDYviD18A>(!5hS*+uudoCIyY{`Wc%HgRb zcS!{!j7eh$eqO%TIz}$qE~*(>6Yz_4mikk|))i)`U^KcKRT?wW%YH-XKBL?57{S@R zpY6c|{-u8#Voone0CC!9I>#j7)(3lVyLv1(d+y>RoLoP8bJ%VKKg5=xtQ*`z=c4Vf zS-l#z(`A0OB(2ruNYz^n`@>JBq$HX!*~=Jz9CCHt8C&kvJCd#mUzzgXxOo%gx7u^8 zHAMR`fI0@;_87&F+VH;|bK3GASP$3;b~XSXz+VK1e&7GOmtZ+@SbN>IHR4#j!g zS0XF+Ct3Jc)s!whceySBzkiZgtzxk3hs4l-R<35mO|7k&%zYtb$n%jaeFmkJ;DYrf) zzv7|Nj{ogkWMGs`=Y*VK>!lM$NRj7^i7y0lCH$GavgT`4z<< z-Pk*WKd{cNt#&04uV1s!fRw#Ce0J7)UGJRVrjuWeqGye|2LR!5MOVh`B5c26MM>c*+rloB@n%3fG zsv$Hs&NPJupu3weOEyPjstt+K6yUejXe}>~{#>KaqhY1eca*rkU+)x9Ulh>#Ptr48 za)i;)qQgdz?9#Sf=Flk-hzk+W9PQlOo;epyZBhufU3hFCo0cFaTEv4whq zXPK{&BJ>S0J)N7;!=|wf*aZLX_oa%adMvET+Xg_pNOQMolKASABX4)QsHeqKFTLz? zbeDSfloc91#8%C`LOPiDKGe$ps)BK&=~#f9kD7Z5>LG*;qC>^9#0;UL)r9sRxkK-g z9C2;=CNTVTI_zNUp);`Df_)1KC`Z6dUy#OjF7J_|Sft#N$rRQfuGCOAX}au-Cp>4G z>X1nuwvBO|(tdDo8nu)+nVw88U_=s8Lh(lqmCnm5c3ie_pmG9JVcWEiD<*Y}%gP55xW3JCWPJHbIevwe_9zwF#eE!+sx{Nb>zq z-KYF>lA;j_sb!o(Knr1>7}`PqlfBZ~Eq{z_X1X4dINo1j(EZ_J9Qhhf>VMblY#qHc zr|;cBB-S?2W}N|HdW`&pJTO!?92^3bOp*rzG24j6-UfaZsL*g1r>+CtROf(kzIm3U?#8U^QH)?hHhq6 zE$&i6A(tWj%#dg^5`Q=T{HzF~S%>rbjS%w^3f8!^Ak`mqtWg03(pJNDCUz>0KZ3%k zGk*?f;51(jrT;y~kg0~;yrx64;TzjZkAUrzS?Nv@LYUILJpa6+Nhqplrc*uqMv;>| z&V6d&N|M#WFi74$NgNzmrjI$%AZsJbrB0-dL^(tys{1d+E_K z6s%*KQ(?q0>)L_*NpeXXc~6eG0z$m60|6~ALnbkF$e757v1i^|S$81T)uIE4$dJq< z)qn{FU-*>|v;HQwHd%AzAF*$@+juNxs5X(P=6wZzyv2I2DA?P26F_?aQs88 z4`}Q=XU=8*!?K(WZ;fhnm+M_zaeDHf3)yY&1PyQWgUn9?Y1sm}>F0!~uygm~$nI{{ z78vJfL$rFQQPWi47CUXZ%9FJuJ2<1L9y_3`s9b@m1Pw3Qj;Or**cv{QgkXk@;) z%}GTAO+!Zx{binQWl`}43)A+r37IZDa+U4)ebMPc{b#fY~HD8!g2}v*YGpZs90cY9_$V zXXL9@(VM`Ln_>SA9uh;F=*bY!*iTaoE3B9TPlc1Ow4R$){M#Z%?(!$4;OVguAJowl z?b)$DR-djt;F@sT@=1kO&!m=x6=vpVg>nxflJq#JW|t4T39z!6vb~X0_=p^8W^7+h zijP=}zg5FnF&nz6y^w!pD-e*wA5a z`UrnZK*{yx#zW-$`t?)waIv~-x?g{~V`D$p)HOAAozG&*$~?ou57NP5b=RxCwelGieR&c?{_IW=0hThKZI9+Q5^Y9*-Vw`@X)Flj#g$p$yp zmmhO&qNbTh+5=lQ<}Z4Ho1t(ewyc%GYt)=Mlngv_{_*Zo?GUZ7Na6tuH55}l#8-&y z!sAfW%2LyQCUWu5Q97})NC;6rX8wPj0hGnXKbT$)S@4hgoh*WBpf=csGy_M+!7nhg zQV9V#0wSOhjQic8x>!G&s1h4KH2GS&>|&v?!upTF1lwAAlu3-oXXUx372c%ozNNu! zp}l|qSZ$DdY^ST4r_^W1*zlIUG5*&5B+jJqwEGvkyIZzzlQS@AadJT&s75qef1!|c zsDo*9V|EMX>cpfYXqSS^-KM&CETVz7YwvuXk)TxPGf3Ecete_bQkh4>f__cqqM-~A9AGfKs$g+fb@9bVua&G=vKaRj%AB6M z?ePfpx8*|HFPY-!JAOl6k$2EYQ;^z8sHS@f=nH-!u{9FdH)7Eo{u%K&gYw7clj5uK zD&&K75jm=HrYo5WkXyf4W27A!mlF^S+jcVMV!qJXJ7_WIv(_aVeQ=v2Q^$pXEpeGvZozy2kbRA;^2Qj{ z;lC4%T*F&DE=IZ58=Ih9G(|2P@FCUfL*Ru1H%rE-;<>y8WrAnO$xp;wedBtq-J|fS z_06ieRm@1bdCQ-S_>t-94dKDJ$7{%x|85LxlWWYRtL*-$!6uTxi4Y?%FRy|HrC}e~ z*?^VJK)3?v7Qs{D-|s4vgYhYJyG33vmXUzMd>EKWeMjqV&z9k1X;a=rI%Vpft? zmv$aETtbbLY_hbbna@j9XiOehKaW@++agaPjVCFlQI>-YqwbOK{AEF{Fx4<&t_kL3 z1x1}Hy|;HLleo*_?)i%)Xr4BZ;~JIcFlSIBHkGtDUq8K1-0^iGx2kN_z%O#Lej$b6 zNe&ZX(iHN~B$R(?o2NXXX5N}kSoZc!?%o}!*N1p<+xx1$W{q=? zya}74a3lV?qX}ED74!qsftKbbx!Tq?Nu5~=Um|J6zm=eD46BPXCEpVM5e)H%Cz#aLjgcaKDM@oe=#?uV+p z_s^8v+xgc8joTiWT2L8TnAULE1!;qM+G_PpLX#@Cn-2+4raE( zV#1FK!&?f&j~NFKNIO?(mZTk&Sd@aiQH4ohu(nMVGeQzA94##yUpY91HF)DMz?Sib z871K4#iGNiLt+u5J@7pew<56Tz-lKYJ1DE!M-fO{H(!}B(P8mAriRDN^m!zQ3(X7W zD5@x1ei7#6-2~%UNz@Kfy|*UHrn`Qy9r6Nb~^3X7W*?cDdf#I0Z|ZTLP1g=NFHmjT{Ov_cZS5fE%`sfNsWh z6|DPZrc*FRH5308(%SmZaJq&UPA%1y;{CC6zbNi;6wUmO#*@|&6@t&)#7`c$XCY!a z1zAvJnskB`%v*>`%m03T+%fD|ByTZy(+1X}K)^W+3; zs2+gncyVoq&FX|Lo=C@kGRDnmVh8@0H;g!w*a}{QR*GxsdAp~fy#fm-OY&P0IW_f% zs=+VIWd!=6kAz%pvzsyWPR7fH?N5T2D&8<*TO=yvw8SCrsaeL!gLa<{7~k&RTpxX(l$9-rgd8a&Bewz!CodW0dIjTZh>+Wg?ZrBJ;;I{^dQ*qeA^5lIQrizTIyF(!9b|oUE8u1P8gnG9*A%%qgvx6Wm z=!Nh?dv0AZb2k!*sVSIV%I#+OfJTJ?aXT)(|3U@F9R=jrVo(R}>- zx&o3okT!E%E_I|A&xrbNzA$7G)gDQbSRl;9!*#y^>hjx`22HAw&UNe8!d3m&JK~-> zstdZWHPJG}Hd`+~B=6^g?h`0y4Rp72;C|Tx_oxT4crV;v8(;`){Xw zLbvyl#YWI}j-}YK{>r_P!p=ISmfhCE^rz?M=N|I6FMxmZd2yUPRK%tybTd+iSZ7L{ zH?f3QRJpzL=l558>p@D1OTHEL1_{r<*eIsC4z0praGRF5nj1fq{lVdB@Elaa2p zn7#4b^aonUtn@ekxoT1~e00U0e6FDc%EG3`#*cBjtD;9?mzM5d>vb@{{2CWPTU-^O&$R_#%bGCUB93O=Lg^o(D9xG=A3CnFM1LGik>%ND{K$)!n`-&i`*Ey5J9 zMyfz^c`=uoRdtcK_A2YNx_Ot$==?MKa3N-2@VQe)EHHfg&}2+P!*88 zr6>Qu+`IA{`{niE$`{gPF3N?5hJDS!6Yj#>o0j58WawkmDZhmDL}7ZHyHrYQi3=G*}aX4V51n)h8Np%Y+VCQ}3{2MTp0~qZ19QkwNXlg=v3JWBW ziBCJI4qa#T-v@@JW2vdGSbHzj4G%(ugTsMy^#EALIY5cg4BE-l?|prJw?PdG6shc* zc|sit9A4XPQr8gUiF&a?b*sL&4dm4mtLGn+i45ht#kYbH6%Tm(1e_P1J*n5Xf2Z0k zj+G2lekF3;*UoIGD_4t?QZh_Sq)$wu;o;%De}yX&t!_jWhfX3wNx#x6X~-tfO7c$QF;A;~}W2{jW`Mr4Beq^yB!p9#I4LtnV?Js_lah`f#UB zW5QRrT?X{fmb-yLJGhivYykQC%M~-^AZ)U#+%f?76-naxhcmbTy3IkegSlH$A2CEVsIDoPhg7m`~12XaVt z3&lkuuo!_GLqE&TL;(}1Go(ZcIFyqL2>c*dT z#8lHdF6Yt!=SF&7gIDzg;c6dD+yE*P9Lg(Q+!yR0cD9F3C0#gc-zcjw5yZQ^V|7d< zN_+O+b$$26FUwWDzx5EipSzys4qZhiW6D3k9VTQO>H7b{FHfX_M_Wwab#s{${=Mt(bguuxPpP@=T=g zEg31Ap212@;>Ts%W!@SK<`kNjREw^K6{I)OrKGnr*MGEjUS+Bd>=6 zXnibG277M%@YtBIj8xi0put;^PvrG}@}s+1dSUNbZR4}3Bu$?M0XJJF7?-R2YTV=* z{%6G8LL;z$*s@V{QSPqb6SQ0u4z;4pULjR&&#z$wbtKif(xMpcOiWedgNj~r1MR?fR( zhH*w?5np^g`(>pCgob~qYOgSl{U*g5bMW9O$?kMKpZrK*f=p~aqLIJ~kzi`xHEs1o z&Nv^&M07RDjqEqHxE^tY)0%XynzQy2Hdvpl&0fislv=T6Wf-0*p0Ot|4^QZa-`jWsl7LwI;>PdaBVfE0>O{?osdRyIg9 z|M6Jr!4Scq#VS`cnv-6GZ_`kU>vnv11lV~-NQtugW(zF7@6o$Uc9Ti~LM8Ad_|HzQ;RhDBk9mG^ot-Y&`nir zKv_vEo_MZ&^=s1M_5Dp!LX}aHJ;pT^pVdco$$?5sKo(MjQVl6ur!r*tA@x&HMa&HI6Q(IbR~aIGVc|nX&== z)da#RZ~i)I9cC)|6Kz^eO%HyG!p@5uw%N1afNSx|m>~Bg@}$6eJbV&1EhNdm!H_>G zg#z#n+*viWH?&+!7c#Jv4fa5qqz;>~{Uc%`Pu?O%w~niYC(D1BVA~q<3!Ul?;h3J4 z`-ntN22AtkNSfm)eFCnfC&D>?PVd2Rvdy$#_e+}@|DK5Sp|6(p_N)ANePD^}RG|Y2t z4U&e8Eu&0g{SskXL}>eEcX@tGp$jUoZx4&GZYoQ%Sk5_t)T*ArHK@@v!yDCb=c^}aWI=GzmO+oU+%t>ctHn@ zO7u|s{g$Qm&(oNI=W3p3pSbclYLF(L=B*p&=j;vEE_2Z@0vB63%=lF`HC)L>x28-j z)D#@wa;Xsll3XHTmJWk3j4#fMRC!9x&F{J3iu*E|EBU^+JdkVDr z^&RKy`A!a-`K0h;;Rkc47e4ZyksB~bN(JjGC~+-DGNQky7@5jeQ&2#)q%X1lP~{-C z@xsCb;|i3&I=|~WdGGbV!dOGru6Ap-xZLk2w5~axXu3>$fw<6@*Y%i4(q!E~ z8JTjK-ZL*p`*n&wia*Th3Pl*1ZY-xV^t|Z|#vc>&HB70^^wb^)6|M6&qfqH}j0euuniZ@apIPaN4L#CT_R@N=iL2P_JlUp#U`T+O-g!27R42(JDO3KyC|P8z7HD;1jnHTk3hvr+j4~6Z+B*-Y;qP4E&O+w;k$uo(gt~f>y>O1ZdNAzjEotY6nt<){_fH>p#)l6JAdU812e!C*ndX#NIr!}6{jP{@O({Nc z9$s-C9;s+yTbU`;w^oQ$G!)9Ji4k($zP_WHLdNZeV3iJSDm}BBM}N?PkgCUOnHfPO z&}_DXwzNNWD=aJ}mKk1Lc9085o1y+g+huQ8X>R`6EaD66XT7eczbh>2rSOJks*g!) z$k%SQSx)N-#!pN$&&%y@k<2+Nhg!pL<)Z7oYTuj*^b3>5Q^?$dVB;5(rMVR8DA{wf zW9najYID4w_JFOxBX<~WNH{p_Kj2Xs^$~c);Fccm<$@p8LBE0p=i(8yMr_p zUCV1+q|_R=*(uPfh^tR+91}wm%ZAxBX;7@sWKu}irqG=n-*&p)p#H*i&v%#HI26`F z0lWr95k{Eram^)XZe4);1!nX7LcA^>k&dk zO~a6Q3q-mD81r~=V^z16vx04EaL>Dyqv~`IuLx9+=hV=sJ{rsWUmIl+<9@}Z3~uRN zz`^*Rv+5X}RTJlmLcrrA0vO`XYH%YT=^z;J{8e?EQH@z?N>G*mgJz(BLQW&Dw@r@L zzh+m_^YLFIUjUu_7r(n?|9>yveB9GKAJ9zXJv|_vMJ#Q*eccU>9%5cN&{-N1PRP}u z2igE_hRDiJPf;l?V!TDS;g4=H2+6z<>0|y%Rozg3H}4NzyHChb4*Q#?)RUin31$h6 zNpMWK(xfY98Pj1RiXFj2Ra?uRnkrj{aI=~luWMwNcoeZ`p)^=Zwtm^JW*;$qRo!Y` znDR4p&Cs@w;L!dNm%1i2+sUo+>+i(;3&#Lz?shktpmf4_|6_%~*kaOA+4s^s!Om-e zI%yBk?HX+h(hGIQX>YkkywJJAP-8w_*Smwa6nIv{!rvoppV~{@C;2(G%mii74RWqF zR_=MkMin(dmdDF;TY<8rG`o*Wm0ZIlnZ+ev?FOk@WC~?3Q$lRqbFwy4v!*nz3ncae zZBkLS^u%e{x(Api4$E?qSF@`UryWp&P?QUmP*jd&h4qECsT@p%Ur#58M@Gk%p-<5* z+g^=q1kQ*9r(;8$-GZ*|qrc0CbSo;?7_#2o zP3K6$8W(>bEiEp7{wEe+Fhnm#Wk9I%h{r8=%0Y1XFeZ$L(muL@QBe!~7VlF+XxvJl zb+(+-1ltAdpFOoXBrvDB$yc{ArOc#Kd^{e2b%FD;9{8tL?rG0dUbO9!7v$xw%7wI&tp9wRfk{d zYyJAX4a^KLsN$u81%rN`i5ZL-=Yf_N2pts^6M!i%^%r6 z5n8xo@){Wua-~jb#518M(a09iqtsHMgmS((;|Sybdc~Od;Z~P6PR5Irlo6|}oJlfW;5;4XObC@|ulQRwlap*{MgKQi zlW~YLs)dyf-7;BW@O83QLDDcCxvhq!do*DfOySI{^O)%=6+>1v`8JaUhk&S*xD*u= ze~rKclJ`JTaYK(&)LTHB>7r_f+Pr`nM4_dQUP6#EpGxbdh;Z~68%@5EWm~bYXb-7r z4T+HJvwJjmrVxGmOMAqYO5b;^bpG{<1at#_0Q(0H{Y-2DnX2#*_prGM*a?o(7ZJJC z(xs16c49_dbO2Y69F{CQ117J7*2+zD-3d7BaPEJ2x7q>v z=?N!d)jyGkN5AyBq=%0QtyvX!jZ(T+UU~mg|Bo!%Y&`7C_|^Or=9g%nu8(+f?9!8EfaAH10wZswd|btENZ25?VK^ zdFw6Qz{Kg#%cV*8=#mog<5h$3HV&Imbk&H#cK?gBh|JJ`Yy~k9-AS?{4w0*)svWJ5 zqsQ5GF9>Bn9BdU7XL>G8%e)f(V)SqELr+|Tp*t<#tE)Q?482e#)Ta7HZV6u=it0uE zj;k=gVV2+C;C--mogy>*R$H)Xu7uuay%;~!T&oH5QgMkMF27Ds_M)pTQ+;z36%;Oz zErpqXuSs;{QZIA-gs0K!esMiHo59VM+r43Uz+~seBmaE<(W37+CkVt?V8T~o*pw+K zpnP0;w#`LNnu&*xi-!mDnpx@t6+;rL9U7Gjjf|`eSK*=&xxoLLWH~EA^guRzQMj7)-nt zo|3e3=m@)<=`yDfedrzS+@dR@TF@|hmKIU8m_&56r&P74dxZt{pQz56S4O6UBsJe= z0=g)z66f#MwPiFaXI{ItUN+EBKp2xu!@_Sfk_-}CmYVSYNLmk+d3Rxd6;9l=$005` z@{p{ub&8BJznRY$G81)(Q_7oOVeTH>pEtSJF&IT#;?ycPv8nPw>I{W6@h$GRp}~af z^;&rNu-~vxHf^&1UJavCA#S!?8cRRC-})Plsw+uQPR~76-+n7g8h(tt@f1) ztS{ArW}x@Bk?}e@HW>L+-TAlSvx7%nq9h7S~xQr^!5 zFH~O!4ds0ZJi=13<)KhG&l{mF5em|?w}vhKw*y-L_QT4uWo*Skk20#f-^!ddMrOgB zK^0pautJJ*vOy(M>zcg2cmHYx*G`3e7aZdGmsd8rB{6+TEAH6KnS@nMthL4b;e&RI zsN!NS7nWT!BIIFe1Im!Q!>`XRvH?C{=7GhcU^JP;EHmyrOe*|(75&jB)En31k={%j zNKhO3m)3ET1d(@I#1QI>iz(6+mu*Ws?JFTSmxgk+MdNZ@o9X|O$m|YZ;U8AcZ{EUo zWo;b*c>%Pw8JdV#{sw@7ifD)uuTK;qW zI>3o9q_IZX|AHz9_Vi4*G&k>$r7C;~@&{U05%6{M0&Y}((KnZi0{W)zoF5RU_B->S zH3Nd7q#6uQy+)Vgs-QXfH8@!{S_#DfTnZqPd-6A5ZT9TerFyvBPdK_BxKZh)g6}b; z0v1l-*~!Uj&4jRhSDWkON?E#4;%R-+9U{#9H^lQCVsor+{qkL=JA&OIc0GY_rDnox zZ-@S5HUB_pIPXwhfW=wP|Eg}AZ0vYETV`?9pda<<5f8&n>{9W9cl@zzWd;ZBhp4x6 zQX|ksZ!M*c%+R=~#LV#rb-ki9t<|`RE(cEjzT?Fu8w&B=YXn27cur*TG>u&R1nG&w zB%ONFg#gG0*hub;`}f5dr8pr=tOX*Pb@By^Frv8OC|tx<>a|d;OI#bG$_Q}-rQgIg zx>mG%)%B;HXgCZf1v3oe3CzS>Uk$b6H^@wa$f@mf%ML@Ct2MdtH*})y^=Z z@I=h(`Vqeq_N}Lp?figVzx6{q_Fhy=xiBhrA;GKke2r?o1Z>0$R z1$W%_RH>vP54SC6u$%q`e?0ap8Uv27mJ=e$oxB1L$3H<=s_aS!>2yT%lPp-?pJyrg zsK)vH!hcdC7^OSev0m;Kpj)ti)lsb;EaZM19UawxD}4~&%WJC@+{m(`*dX`F|IqKn zRPD^a_;chlI}%ajJe%=kaxVq@%aWg`+R5U?~FTX+|OAzbgiJ>prU$7QPr2R!~*5mrJW-?JpjD3u3-FiSW` zTm>b^?Z~knJNY6{oU12p0qegcl`8G%74z*gfFTu#Xb?Gie(iDg5V`pzYBJqZ+@mB` zDa`NawX7NoR%Hgy@XVPQwnE3Trp%rp^h)(XotGdv?JQ~TcPxgrA=IOyH&VzXG$qM5 zsKs7@!ZL$cl+;fh4{53n>1?wvM*y!E_XU#_9@e}UP^NqehGY#w@nt`@(JGcORh_Zy8Z+t=WoVvxK%EL=Ms23!;nK=ICS#f%Gi%fM} zpP7<2TPasH9bNS~=4kc7}_zSO?!$SdU?2$6Lx`F<8-V%t6m2Q*qaR@QI+x1EBp05ublOB%M zJ_dJYK7s$=yuKUnpi(NGud-r!_$S8OW_T}tr*Wcqxj%Z%ylBDCnPMvSV_#`}-H+#o>_kL+pfL|wkLyzL}y&b+luj?tpf_mLPwx!;SsUeIR7{9;Sl*e}eq!5XV2A zfs0ITp_5f*_ZKh5K4-w-W?TW`K6c~i^eNLO`RRU#6 zgR_WsD6oJ?q(#1$3%IapxL|C#}F)di~`LOUN0*& z%31lkePv>HGrOzvMtEu}=cvLZN3Y0E26HjWhqPZ!Ahpn`Ew$u3u!Dk_ZB~uXESETeZgLhmNwv@dqDezD7oDp zQxoIvt zkWi!!dqe(yQ@B~_kZQcfgDp<~pJ|aFZG-c^dvFn!=?v*QII-|dO(R}LMIJ&D)ve%{ zEi9Srja*2G^G;n)>o%i}0V9IhFFjMZs=GCu@gJ+fXhQ~?KH3Qc)-|KfQn}3!E$hC| zmb5&7;2J;7F*6oXhaZqgulex8D>c;9@^D4o8#;tuS$#82oId=EpO#*9DWYfdW^cb8 z>|kP2HZmoel+5wZ?VyZjG<|h>lfP%;hVc%g)DyeM#Y;XboTH_?_%CjEd8^_uf1wjQ z3wV%Y^k4adpR8JWcxb!YJX2jHiC-MA!IM|L7I#`Fek8<=yp;CKBR1cCr%Tu)s~`SX ztU?1;_rr9#WgpuTyh>`nY9sKIeA^$}pH2hy&5uEd;TRxH3knPQS>6vi{gsP?xIwgx z*uV_fyWp&+X~edBb?boO0X_q=8^Kk;dUa+X;XRq^33W+=CBg9o$T_G?l~=M^y}w@65LOhmBSyEc5qe!<`j4jtF3!jEnOdr z%k2V@Ha|wOWZ+OSt*tBd#NVA={5-cgWG|1aO;r+GAi2Q5jwtKp%yY0p+##JTQ*@0n z_hy3Mu9?&(ZYR|X2U2AQ*G`>JwNi`}ijcp*Jv!o<-n-D-i5rr59-=>MIxLZI|ubCArw-59_p52cti@Ya8R*hh?MKf zf$1O(3kjxS8dqsa?tG05B*I?2{5&>Ys;qSL%LLh%+65= z&AcPn!>^vCgnsOP9F<^C*r9&i8EILD$V7E8*b!*?=I=0Qn%_hLhh3OGg4a5I-@{2NEA*G;t#NC~!hZ1v#yJc{$Oe9qXOfy`^&o(JLgfFc zN~!_iXg|E+t0>MI%%SA9YYttHpKRyZZqCfiOrh?(rZ!hiPLa8L$yVe;^&P;h*gdZH z#cV^zy_NA092wXvmi+Y9)*k=y7H>#6;B(7}saZPKswx69eBRih@OSZ84u`)M&QEW? zTaCJRLtCm-=)Z!)eOFKukylt0`WUSWx^L9#>%lt@2%ri;4GqHM@y92?)0Rc7hNxRC z{o0shTbHZDwGvZ*&E<9Wk4sE=dsaQcJ1``Fc}U^a0&e6-v&^Tk(xAwUlXaZW(f7GO z!_atMVQwBFlpu-$ZV@ACb(!)CgXJOKgfl8UpN6Khv`uiMOIhJ{XFKtCG;xY?F^36A zP~vt?#^634liME9S6f%DsAek^Gsb8RK(Q`2Ly zz?Zf6@09@t+?uDYGoKPA!d`KM&;-@ml{nz?ccXaU^g4xeRHA)hwJX-HL`96qB;-me zCj9(Y8YM*~82PEg?w%Bzbc9wM_=mY_jEZN|(Fzf!iB7*$#OHkV#j)>74F&YxkYp}p z8%H8%AJy+(LZaGQ)y{{L#Md*wFY#&n(*(qZ8S}J=!lSn5=jj(&AWJgdmv}OKc<7_J z)m4)awef9x`@@+x z!58@8<{KIs9zDDt|Lhj>h6W3FM~sQ1yF`~ghdbSKf!eqXVx?EkumX&#L=HHJnV6aR z=jad5CO*&|qZD|0IPD;PD08wnd1vFtrwj4C`qJ02s04UUmaQUX)yC>AerRZBRSUtD zk03xpZzUQoX^pMej<;^q!B|^ zk~!f@=4N)+cxKi!NjVPTT0F7@OXTO8n+&;>Svy=I{2Xn^1V*yFIG+jo!79K!NjKmsNWF$3d(v+Z zSK3xWQa$%e?lpwFf&8*(U3DA-vLon$IfQ2UNmqv%h2al1CHyX zettt*-3j+)Cw=>>LgENcx9GNj+?DL;%>T}byk>EtHHAzgOWQH~0Vjh2@`q<>uMYt6 z5a?s~{0;8vItZ@|62YK@-c>j>qg!gRa*D=>vP;>_F@g%@$QawHL zN^9I_yV-sk#r*ade)DEnyHIB+!_H8PPuS%pUV zEm|*k_H;b@c@4>3^De+pytSKyprM!QWEp>Ctl=7(y^i%(L}de?1qX$bgCPSQgC10$ zF4Nr5QD!I99BUw2kg}oMj255>p(``td?d~vJkf^WkWx0E_Ep>=$-~gzOiv;8Jts}X zJ__qcMv)A6>~vOKzLthOqA5#5_%AHX&-7~h-7oAMY(d{Oc$vw_jMN6C@r`#Kt z3B157icf*3R_`9R&0xq*84LIY?Ry8l8KO0J$Z1t%h%1ueSmG;nBpJVQ z5WgDoiTRHQIhWiwC?4zR@Kx9KX%wuF5BGgQ z!-0>#|KSFhDX%Duj;ggZH5~p1>EwME;u}+whfz`4!=fVL_2o|Y#jG4-os*ws=wE(O zyW%)Tlbo&WrpRqC%L#ZIXJ{GV)oM9CUfWnuJLb_n;gNiMB$#(D=2HsRM;n!JzP=!f z!I0tDVMF(@(K1S%E5x|GpJ!87NF`z>>LQ){XxIB+>6IoWV0qmG{Iz8k$~|i+a2$@B z$w`!&)~X<_&@!v;=PT=M>%hV>W7cA%dFFfrA~iFhqPY9ndjH7XfFo7wG?B73t37h9 z(Mx$0!)3)3p4s1fGzsy%vx7Mf+&tWKGcyoSg9^qlsidwedrolvwTYjGdyK6ny1hO$ zE=zoUts_hiP1@_|-0%{m56Oxl_qn-c?)iA6Z+E^l4~ZG2u(VtINbGC7KU#}hO0+Z@ z<1F%HL>4wlTPi++DwaJBJnU<$8>g_Nou?ussqHF4%rca|AU673gT&U5u6OkimwSFO zIJP=Dm0L+CgN*x7b_InZ59A&pNy9Fwzet?B!?#9(HaN^M<@cMN8+~c)iH_zAF{Ssf z7`iidQt4KCyog<+h3XuBWD-&NZpM~2Zed#`JIJTav*+IYWTUhD8bT@2zChr|0mn&I z^h$yb$*&h;30yIfix+zh0N^W3?tP5H+uLZ}V04CPW&cKlmy>i4#y>Ph5{eaaA+x%tNGC91b3t@8#w`aGu+It3hUjHw(eFr&a*08G zW`3c|C9V$6^o0jezNJ`Z+cb=K@Vu&7XIfitYAzA{)Wo5#SUThIR(OMQWGeadDVlb5 zl`zI_E`Gg(NbJWx9Z|;S_}>##ands{={L&tXMw2)Z}>!qhSGxWE^w{T$pH$JFi12? zr*qq0eJiUT0A4OzPErJ62EM7R^MZ8TZQqUrA@MY$^O@bD-v7rvs-m1xV^HUEQio?s>sUR|=w$%u4gju^1{UcFx z%T^`kP;?X?yS_TZ$eftSwS04MO>FXz8y0o0_*LNPXF0=ftyz|IpZ_)b#$!ltx)!RADoIBh6lh#j6*FrisaEdE7 zM;GL~0RO~+XmJ*N+w0hBw*dWO(mV;$ul25_e_I)Cmi|pq@0ku#z!ZDDB*ZLpzNClm`Oq^I+o6h6|uP0LSYiGZ64?u5CQ}20YaN&jRaM z3E(bLGPyHyO}2Mr&gaa3xKIQ#h_+HBAC-tGl2YU>HVX8x-81>g+r$hx1EF-GKpX|I z?E+5r7xw0PPoOnsr*{I5hRqaJDo_dZ3^A~AA7qYcY&IVQ73VwJcr=CAOIQl+NSCJ7 z)Jj1W4#)a&;p^2b5!&iaMDkc@<=BPUAH=So;q4X0QmL}GO?6`2F1$BbeeA^Q{dbrnKO(Bg-R zSNNRtbU3N+GUm`)Ji}c($BCbQ2(&Nk3ugJe7Fh%r>tMpcf1Y1CHT=Ettk1k-Cro4l^S8h+sS3_4Yd|u=|?Ob?o zl>80hD=&H(`B^fItj{*Fy_F-3<3{F)K(3EucL(I}hweAOEk}?J6`$-vTfsnn*hv3N{uH0Z&Xr@@l_G=b zaV`1#(%4V`?+RTu^uJp%E+ax6n2>-!vLBT0F@wcepeLA&$RJwS0$!$h#Z;*)n3*1)%&{s*0F?-tL5gwZ4hu9z2c;Bm+7reY<1rO6Y zD12o^HI9nyJ_k7Nddy5xJPD!aaM7U~Eb$2mo>-r#4X4=F0i@WuD=EFNP`~LQhTl%4 z{XC`T)H8+PUPF+H-dY-~D4lgFd24fj$nAA$_}6y~hxQH~ENo%UK8dZGhVSrE+KLED z-W!PLg|c5Lv^n)CFH=3g+01r&lc$<1m-NOc1=g1=l%|1B(ti-@#Z+G)T_)!i`xqXCw~2x88!hDmC#h9u3B>h>qRqcb2 zU!>P>fw0@CP(x9ITC2YgSi#gliMu8&CfH-7o^Jy%if#2TQ>d7sZ&Q4A%2xiqr$ zwDwb*{)l^Qmy)6)$w_v+K4@htd-4O?eL{7G-tRD3|J&2Po!0TcTdKdOt*^je{yD-E zwyNim8kh-pUd73g8gr1+wq1R^d*Uh@Uau?cbi+QjLZ`?w=NoPC6l^g$sW5N2`@fIq zAyS5GuW_RLDY`{DwKveu*K=bD7&1>5L6`3p5O$O-EWC#8JI}%o*-g8;As`iJdW-(e zjasfPue$?@9Cn-_;dl`RI;hLvcG?G@Nss+OCo(6S`_r@gIj12v6AYv|SwO<|PKJ|; zpBN!A@{vfm5R)MfWeB@Emx72)K$A2dNp&r-%G9t_W#C-CVJZ8FE6{5A!uFtiqLwzy%mFbl@pf3EV{8 zd8^u~ENMNnG2g9t?ONO5pdj}JRUK(CPBAQg&Mww1P8J33*Fr0M7Rl;#+;x9*kpW$J zCcTuBx@N0Xe0cjsMK64-xZ_U320i>17yqhGAh+P&WNmY{7mh->;5=^4Fd6bR*x&X% z&ps4hTC)Egs;6BUk^2n%kMCc1Eq&1p8_e=I8g|sdE9CQ|bN-3Tf|uBy z_p_R|vKtVtzMbO|N5#=BRezUx4=gT6 znif*xy?t?|Q+vwOt2XuhXyD8Hy9!G`BrNWzuDN`ee1&$=S}ff;NXGD<;txl2Rm}j! zk=#7mVAXi|n+%!W*?-<8?v&GsB97?TIG5PCmfVSQ3fE6MsQGUq_jFP>U{(fh`y$`Q7P#0L>X?~@)#eQTersvw8V6dT73%~j ze2INHoe2JO>Zw;Zr)9ry43ObATac=GJi1HxdG6z91J2WS#~=_tgR z0{+fNS{Rm?AVEWQ5dr_5+m^G=Dv_5SA!S%9YgzMie`qhFuVCg82dM+`bJ{EoGH`P{$5L@dLqbB0v$9{SacNvEOSVfVTnIH`#4z6a zhGL_45`^RpyvckC^~63!o>+x|7PYoGXm)S83`K+&W#Z<%aO)j$Y5H+qH@j0^N+(c3 z*Xl%R?#c(d_l+}Vp8MMSql!S9olkLjK8vISrpq^Z!z1v+HTQgAqmNxu$!! z)F+ekOA7Gm-DruA5+5gP0<7}r-D=X`qF4Unt1%ZK`WFo->;HJ{Kd#dTH4>Ic_4)CV zLICfg22(2|jX{6v_qFDe?Ug&cDHzFVoK?M5`AR<-^Mp98(6aPPXWW`QziJJ=LY#G0 z=HZX`qC*b@G96CIolK6wk5fx|xJnx2uee*voA}4hE4?E|41N~QP1aeudpE_*Vo5Z& z$JqJB|8~NUwAe^j3J3@aP=j-~!J;Jaj7D(=v^Y5czS4Z)6I}zfouJ4S$oJ7vtL%!m zCFAGereZ#z9dQjhxrdzR7>cPSR4qZDyq?h&0@O8a6-gb>>UH z0L1z8Y+AvCkSd%&m+4Eoge>Z3G#$P;=O=TzWuXV9J|e%;BI}<1W8OzwS=Y9GX@0J- z>*vGp${2PDN!^J)*NKU%1_n){qiUMGCotwG6}}0OuSv!O?~I((m~!kXWl#VfD$R2} zFcxRi7>bmfYTbGyx&C|b95=U~v{*#*z$>Cq5#2)*d-SUU^rWIgI(_23RevWr-&*8x z`K=v)uMM8ba<;UBz}RB?v9`wGN=9{-V0}Ju1>}!F9yde>G{C zpIm3l&AXf?>3SLR9r=R(=0q^xyQaJBlulITAx4~RvZmSYTpq{@7O>&dN4~AEpotYo{AOzs%H10NLYpKt z()LMU!hGH6oUXFa%He~Od~){DK4qEO)Ob6NW=5$b#F)X8F1ZuA8#D3g)t>H)lIxP!suVa~wB3nLmPX#Qd*cdC#m6&l7D{-u$VOa-0a{T3wUb zA$Jwxt*V0$Fc_lUZ+WK)q8{L1OFJuD4?n!Stq-`{-T-#iPa{I_FXX!km(#B-x1nP&+BT zN6`JFq|UXuUPQHM+E&(NO472D8%QrhS;Z*J#lBBn$m}L z3$<~jBUI6sXGVhh7|XUXaH;2n2{x3+)ZG_idadu5yeJUW{~(M$?Wpj1&#}nMv?93# z+2EN;5hGp7`stxhIp(;zErHccfSE_gyeSn+#Sh_R(81s{Ub!;ArgunPQLeUC2)2b7 z1`i?(`_#`evsn=sD6q3C?6u<|;(VcUx9AXznFW*|AuuO>h$w14q5SD=V<~)q zAhj>xbdl%fxlDG_a(XXcSipSZ823R=oGl+g%0ZDbf&yBpd7t+CH*+y0;(6Emf3)?> z+h`UKY|Xb;mOSsfr?xP@^$s4xt1c}KH;;dN^<=uH?%K0v>mygLD823+#;*+rl^EVb z(t}q;vgt^fr_hPes;<XSQJVq~DT#x2Dt;w9w6isal}9*5Xa*_~^8vD(3enwNXR- zr_zlv`46uC$vUVzIIhXQ(R#4N=i-~8M>N}u2!@}enGgty#k+f+(B7Xp>*0az( zF94oiIPX9wV7xIW0g~$+56-$zZC~Gw}ZGTt&x9$;^&HnFZv_OPo{b2&tZu0Lx5i;8a-Ma*5jv zpX_Rv&U+!8_d*MdRsgcjz1Fk~1vh~Z@X%s?o`eChLTD3C8YyBmxu0Dj_g#qwk|SF+ z2)U^yE#GIkH^IP_nFniqww1`7Wq5v7%e0%}3RC=fT^f0k71FIM8P8Aj-=O`6t7rL3 zZ@4q-1`AUNq8u^LK0!4VA#W}ZAA0Az0;|8J+sV(}jb(tU2T(~=lV*!PXtTGV|9)Sw+qPR( z#BQce#t4dG`^fTSmXl-v-#>TH7l}c)FU)H~OcBETRuC14bH;fw-F+0@C9G+y(3)-} zOOy%U%2C~HW6l`MrOOU36<+w}QeFiCDq#{T=z%%qJT257>SQiaZhhc&HPB-oCs)5Z zWHpM8@0U>gx==WIMN&S!MzVm6l;6cym-OSy{D5g_WX;9ja>U(Cty%c%DtQ;xf(Y7r zR^SP-bZzYcPb}of7cp7Cp)>v9Y8`I%-6_u#C>f2{gZlC6O~W7Wo=>P%LmM8as!ypB zgIB7b9@;Le8cawiPEg147UIc&mfBUL7h*@o*>yft4L-71s)_#ka-?3s`2WmS#^})q zP_1(TTuFC5JUoK@JUutg>_Ijypa$sdG?j$tMcqKgvdcy`qQ`}8h&D%<|te-^XFxqy^gb!7Si zcPNMax}7O9=|sx`IhZZ7%nzYVsn}dteyZTQ|B>Nv7;5d3Ex~C6$X$W~BNm}pTjd;&L=OF7A zCCewoe3JrI;<_NHfU>nKyEg#e4{@Rt(votdP=m{k;x zx(5+~xFXo9j84{{Z>pP8=u!55Uf6P>5(_rL=E>{_*wP`)AO(u6bd;kcEHpAZn8AT2 zCu?(B__2AZXz@t%;~872T4c=-Jep_D4^N}FY}vy6&YM`txVKH*PCR)^d|9stSf?Rn zhszGrK5mDNxAEP@%!PRh8?0qij$QWUBv5-c&d$PiBN#Y%I_;qj0j7ISvWrjby;pEt zU-KY1r0g_uJ%6i#yNTSlwBtuk+HoB{$sfm!sba}LKd*TG+QEO|EtDvmn9>>lkRs0g z>UKVP-3l0|{xNcT6#JUJE6t^3S|pc4dpvNxiP!Nzd#g3AKBY?nI>K^=05Ra#bkYhK zs#nhH8+(Da3fB1&%|TvXUT14mfXlBM>HX%qn5~PhW0}g^pmXlCw_qqq&ml)N04Ezb zbN4pCNP2pnNGft4OQyu1016#vcO>V{o1E?Z5UC`N#2xqBl%rW*b2468voX$aYFF$G zOuYyB)S%UruKIFPZr9^~YU>}@))ubsylWe~|7><)tv{~XtyNp zK@9nYM%7l`qxqRGpX1iM;8%R1mf_cJn1orrfO? z6)9OCAFaY5ZJotnvWtuoNtfNLfW8-4moh!NQC=p?0^^<$%~yXlrtH-2-_4U)pV-S4 zTsHkyJ?gmjGG7g&r2=wsf}Un*o0G&9Q{-8}?Y~zC&11F3A9C|IK@76*DsykHtJbG* z-K^9kRj68;i-ri;WEyBDQGOfgzEdl8S=z6a*Exu?14&!-d7v7W^ccmUJMGx>62RzN zh6z%#0o4*RnZ0>FuLT%M`<}M+o^l=E_)J1ONTbQwhBO9zhK5uGMt93gd>l@KWpeN< zHR{5_9a|hHmuVhQ`2C}q7C}X#lU*-$x6iDO{rNe&Gy?d>_9YI7H<#*i8m#`s*p5WJ z7O1F^0ZXDkaRpTg_%fVLBxbr1gUKZubYG4u{0{l=OZoIXZvip9At0Efi*wj}oRboCk+pOt}h79S(ni5Bz6cIrO zJX#cEs{J>;)r#*w42;tVR-lny6?hDpnXC{CdJJ6P|MQYp0B(`}?ydc!GrYHLtTdSC zzV^vduC_=2?$eFQ$d#B#38ifCA54A)~%Xz4}vY>FE&c1TVluJ zs3)ebH7ebo>m|!sXC&3u7I^x9N$JN|wbfI89+I)_hD5c^FEMmemccZW+QAm$$lWv(2iFfO`YIb6pGpI2 zHz$f2^QhReX8{OW78ZuG+vzPs1T^gjgAPH{*2@+Oe{(&lLp4~7W@%;riDFqdVvN?* zDe+kle-5_{7NpWt3B?|%(nPTZRD}jRP~Qs~f;cixOehMOv@x*hWl4!KurX%7+~}Nq z(({|$307dp$HGg^qSDpI)Wadb9!8JQBMj1sP2ra`lryVBs6sym-K@Rn)XBH$V1Gf= zQ;Bv#D)b)e?heJx2NdhMWyKK)hkF!Wg0}C$Y%6hnK+3Y$uT{=e{J{uyE!p-1W6I&k9e#WoQX|ut4gk&}hHP*U zi*W@$T!%WVkf=9lXjk#Yda9X>p8w|--W`t~P;hU#ZoRVc9qELNYps3=!t|qSx`(8J z$m-G2K(1e_F8;h_NBV~^`^Yuve-%Y?ZL8+82V8Tu!;KH_J#Q8muo%R>`oFfQY4x6B zh!7|rS%@zxJeUIYi~E2SHyybB&8$Tg?04fzMOexN)eI(zib;cki0heKI<`_5K`69o6eQ(17byr<< zI>L*=5vg9N9Y9SL8akUi9P^vz-o-c+mdl(IB1G*Y3hmKJbfolV=9Nz%tuM7 zdftyCiL%_Gy`xAwb*vYK8f&l?wxhRjPLzPyMO`L*TJr~L0JMx^?r3Ley#4ewEXi{q zFHC?@p9&KE(N@K<_2*KS2#YOSCf!Ot|ID~YOlR9TodvsXeij=vIy1`_ZWv9n$h^oF zK`&u%dSV6le^fd`2;E%MGL`ta7Bg@>pUuw4i4ZI^ZDk7^gqV+VnAEv6lYxpjwWiG# zL2Pvn^Ja!Rkohol8V#9`ls)9HvEo`=Rr$uP1I>aCcCw0W4mHX06BCcd{^IE#k);&U zGpa8H2^#xM^L!a}q7=|HG3nhLu~1w91z$616f9XnbYdLzY+&l2^RDwE8vtN_9R5ys zMM-4Hf$HAAe%7jl;y7_q;(PNQ{}o?!#xACYz9R3ivFLPVWgD}^@9>?fZnj11oscY7 z39{=qeaW}i#(sIX$O(aeEC1^?))(bawEy!}&=$aooq(5i%aJvD z^k(~PnNYOm4IGB7&%xg6X7N`H~l=r4Evboh0d#ZC$Z*qrSsfZ4|S`9)73539}H zIXwz$-Dq7~Up_xORtbH3{d$L!i(OTx?T_GBq|jTr1kLX5Nj&jMi7Z`-#`8zd5^UF< zDJeav?CI~hwyng?Y!TqNRPmP`C;((vLvn40G7 zhQIN^1FYh;4(hc)LPF5N-J|txwXSa7Q??g>*z$zRti;Q$OUf-qdvi|2V&AwD2(6^O z0MmsTw^)TJWYest&mKNoQLuyY`}!>}%1oB!F0-YJB(yVkz4MQdcM=v;KNjW7sl*UW zWwNzT;f=!BWRfHEEBwvjm=jbwf*fZs7ZbVW=T@^M;nH8(UfmgYQG8CG97XV z-0C4M+?F|4wX;D>15x_RvD`Rp4qN$!%^{HZdZm6y5xNFkVnss7mF`tjf_^oxLq$t6 zVl%6+c_(KZtzOCegZRq%G;bxOt^qP7Kad(YMGP2SARkPP>WprpZOc5YxfZKy&UqYl z_-^b@D2>)S69Mk}GFX}_f%+z}J^%pA&lPS2cO$lfLQq*(F{aZfo#?n&op9U6hP-gs zuRXIV<4_1)P49*iKQ+8g=~%t%z>AuIdpG1As$)SpbVej_n2wKq+bzZGwX|5cvgzbV zjdM`Q3|nNdzW2(#_x>+#sSo~Nlivp+79#=slzpdi^Tx9+RR9qG$zYC}ZU&Xk^F>8P zxD;Re##`EN8r!Rl6}i&uz&|Tb5Ac{?sNWE9lS0Xc_a_t}06wTzA#*SfOvG#gfRDG~HGXowm!@P{bEEa@c7Vao6Yw#7n{ zn?!9LQBg^JW9PxMn*2)!2DjISn(TTU!%Y4u5Dh`or?IQEMae?o-uyXiVXd~Ye_Eka zzPlG1Pv_79>qq`RYn=@~JIhM(ylQQr*-hCNbNlPd1T(~rG;R3Qd%Tb|I|+@ZHzVYY7l)prjTr%`*u^8hyU$hk9t&Ll-VA zB^F`m5*BQPif1Ij9#UG|_HvJrnYw;^egE@4tx>A3q=D?r0xDs~1=(1r*tuK&ky0!W zBLx3%NX&(9PefEMVw+@V8zP#9ilFS<3&94Co~Pmn-GB&w5pvbJ|FS>?NXvr-`;1N$ z`4SLh{{lw6g5EmMu!cF&n|RKqfq%41srOw4G-qa z^<*C3t>yAc8kVO59Myz`jg!N*&?u~@XE2zn9J~CQx&l-^MxKRlgUW+9L6UPVynj5G zxIWzB_%WSJQepDwRie-H3l4x7#d7(@r|V|!$bq;qP!6ep-0z9~`S{rxE_Saw zXph-k^5g^Rj`eK%qnkb(_EA?7K!i~|x-FQk&0%9ITQ|$KBa0?!FXZ0)+h6Xl6>b}v z1+PF%O3KWItgOuxl}gq(dts6`Q*$epF$x}p&LQM=F9yXCM3H)SYa7qdvxI*TJIy+4 z+R7dNYmEsur#lLJKl=mY6Vwi9-(FCoqAxQqk;;%P1A2^wiD87g{!4$71@jZ4sUhMk zG2Dyc3(qeLq=fyY+WC&)bV41KCAHleYu+y(5AIs&JW`ACxmLvd1(h_$`}O*6ZI=V> zC_qKPyCR5sy4&~|VT>{9lG}`1rQRE8T8E7GqjmXAvKa52(9u;Vf;6ohnc?!V<1yA$ z_H})82e0pf*h~(4$02UeEfuyN&vbt+<WMC;e>&H#r7%tKdZvcx&)tNl)>79 z`XvM%8yDrm5l)*A3yib^r`K6FJIUIVU05$}S_XbDzPBM95z=9;Bn?;4;dlRliv?8c zfPO@0y)R8$mp`dtPD|er@|f$1qtjH^L9+p7TfFj1Rzpb%Mhb_-PK``e2kwGS1Z$g9 z@>UMHx+&1FXRhU(t}wU_NREWRPE8G5Yd(~S&L$8!Oibj0fZ$rEL9=Hy`FENb(lpkC zA9%{U;53~=gxX)5l#6FJ;(FqZp9(xh*pk1wk8b`s!jN5SM!j!(ES**#ldI$KNu^ra zs*)2(?IJz9QlcqR+a)ilFz{&D=D&)7$L*ftl(D3TN*2JnVpjBx88l~H`C!v>LO$zM z0pBz{q*5|nEJU~+gN9b%()xhzTIl1o83A_~jf+vzVu z-d#T`2&I1sl{&on=XI8rL{Ste8eR!>`*=(WFQ0%+)L_TOz3!zZ@(@)SSFmf(H;h%i zG*Lkqaru)go#}O^35dzZF8K1FLdhu(bQMe0O+$JrE4s&Ane=?Mu7YWC>qam)j69UK zt|>N;bYFHv=Va1q>t@uFgS0^M?8Ol%D}52>B!G+Zi)RC!ylIi(+R3(o=?eb`ejz)d zn+W59_y9Xux)qrj7YIYK8A*?##vx{F5EiOwry@@n8qf(%(XtWzcV~=$L^=tc#_|1) z9UZ*}ylh9Q_Q4S-lI+rOhMTe225_+^+}xA!{AijfpeR0jVS+D6f)+pyjG5k{E>cRV zf7VQ;YkwYm-}$Rt`~8@T;x_`$?^7$Fd;AVW#s@>APXduNlhszEPb|q+X$@($_@(8g znMt@;Lt5V9HQmFJ7>8-9q(6;lQe9KCG?n&Ol};9$;Umk1i6(h)uALpns|{-~2q0hs zN=9l*gioMTiF8Ik|5=E0_wA2cr}aBc^e5dXxHubLp@c6u_CB&1X75PY>{x=1n{_W z#B|1_rlw{97UIbrU>RsRt9|YUx)qROlZ@+y=%SII$`^gY>R4uU5a)o%HJ6uQo^P^B zzA-Qt?pgdG(90|I#fx)Clhel+tWSQP#xqYH!n%srm&XtZym8n7z*@P=h8mB;iA3N9 zDGMkWrGk@Ox$_2_iiE6F&MoRXpk0bh=^iaynz9xHKwp{0z^0C+(b!a1+j3Yj#piKl zq1V?V1tHozPyRKQswWImQAgfX^!tlyIqH<$_#_z=&aAoz>3^$s(~f~##&JuDW9dFN zCtJAqVeF3WFfE&K!EZ$lNT1fVZq>=8ixuh_H7+L;r{6B6Eo9M zlHO8=(>JO*L>?o8N#U9fsjvsnrw zRbt)jxnToOdjbP|DV_*Z@r12(Z-)vaNmQD$W2Aphwc;w*r;x}k_+qV+q}aPZf`pl? z_Y4PAtLx5l@t#7vqa2qiU{17F)AyvPQuL@475^&G>Nqe`Fkb1?GJ$?KB6O?fX>pUv z_;=dX3t&$G&{YL^(_v{P4 zM5Mc!GUln0DA~4Ya#{kxnczyNJTGlP{zv2Lj0Y7DH}?z}hHV{z+EqO2D)#EjuK>XJ z2gZE))K&{}ZQwBXPVEYw6j(pq(DlJ}zm$s^?XZh>;eCY}wc(oc)|gaPZ=j#rfzIO9 z-Tn8Q@#Orb(udDzbVQ}YpSPtLyIvpG=|3TEdIkS?N_%;4^y!mdJmRmutev&jZGwz? zP(8pcrhlD`#X>O*}g0Q{&jRo=X6JTl3rH`)LfK8x6LqjPP z7qH&m5kW`YK^;LS{in3`CpQ}p|6bxzGxj-f3u)JC^${DWr+Tj5$!(ONI6JILQF;zC znEMRNVnFkW^7ErVn!#hB{&4olB~H@D#Amy(>yPuZN*R!7DKn?oVmGv8_M!;-%lC!+ zPu5G`SNZ*KXG1}O9COe*OY`Y5@7yGAsy*gWKR+z#3#$+}H>Cl}P}M>MW(z;;9{Ps{ z!Jf@7(6QZT3N9!?a>_I+#okz3Ma6Q&#&ZTS@A-dCc*b2!Au?iK^8@S~rRGdG2Kns# zSw83WP0)B>iuYwT<71sWzuG>*R@J5Hgi)XInZKIckxqWFBtM`a{w~7t(B_c-7Vd6U z@2POsjQUH6pm1%NVA5rpPBC-~11%<-vrRQ0@2D}aei;_U#`%%QL0~2!Sn?uApGJ@Z zX^oR!n}zK*MMgTs2nZ<}*)>}^l%r;5)aOaUQ6ULG4M##35qvBeghx^xwA$QZu4}&} zAej(nDrpT3jU?tbBjLQr5*h=D_>XRV>8N%eA8khCY{e8-E4=w@ApoI({6@`pXuBd$8voW++CPrn%);!}VR5}N} zo(d0q-)9stajGoFR(?nAny-WM4WpS)FRmEsf~FM+3HV3=cN9!%5RX{DD7ftK3KLbR zKlyhE0fU{Cn>20cJxyK=d5=jMTWDLMsCD*7ui#evk$mp`Ym0}~{S7;n9{`}wo%ePw zTdb)Y9h%eOm+qf%n9U66!WmW|LNEg& z1O-4)a4o6dWC4U(2PFkprLjmSe-#F|ARzpzZeQ#eU~sIcx8PbaUZ zV5jY3y26((G?h}&bv(>vZz9bF7|CpqM%wSYXD&M`*`VU)E{7f}*6aR%WW9A%l!3Q3 zJTnYkLn9#}NW;)63@I(r9U_7P0|*F64UKe%qzEeA4Ba7(DBTPpASDu#-{bw(ecyY3 zFKZS{{}S~)=Q(HZefGu-lIPR}SQYHO#jxTi5J8`@h`ut6^M8V2gWR6&vBcWLm}1F5 zNal|FJxSy3*wNd|V|gz`!KI@4NWO}S>5LfShslt~5!m61-T4zN)DLoRpvurQNk&=w zIq-YF6g}ore_3IXI`AwPjMAL(cQ7GBDF|8>4C=(>;ziPqg}Xm!T*7ayPLFU`@Wlw! zHPBL%$k^!@<(mp;msXip!plDc*XB8^Uo={nozqWh95X40_DwlFeb1b2voLQ~HXBCw zOkbpb7q_T*bdzw53~BXG)B22&vcR643?!UvFN!mB${?9=Ox+QpMWb zlK%5xa|cw}azG;Z?Qh_;0C4ZOc}f}Ho$B1`8V3>!t2}-tGddg#62GA*iLmn37qxU4 z=za+d`9L~wUce>S?e(@CW-9#-P-I`lUo1gwKz6NJ2_TVWUV;h3 zf5_uL)YZ`1F}VKd8-YgHB&0$2V&yLP_{m*s|L77Rg#ePn@wSAmE&fIV7S+E%Jl+Utjog>6)$_q67Z*o2@@fAO$LOqKa%nJ4F%*b4GkG{lFUa)GuB8~*V+EZw~9YN z8kly^F>D=8u=?{&?66afchQ_&o)-^T)x{jm+wMC5D00}wyjPjLHE4`$ zwGSr^neYD7wszDy)D98dOzM%feB~XEGd1)n(9PmZ!HN3eBe=_s&uQQw`UeBE0LN;f{ zkZD9~MuRc$irQp>rtHkW!I9|_g=38_C;~v#aaa5(x9WhwmF;*B*Txk(Fga_0&@h6tgN1MxW)}c zqYUn((TSEk1ifEe{_%+6yp8nBXVfK&D|%1DbGh+VY~YNQ)Pco~270PKfFb>?dH?qF z-)4X3{is)w1Aa74&Mv-2SquFwjw|bpFF)GEkd=$_*iAFnGuyo?2u}SwBVYNy&6tg8mMft83S%Wq!f^K`X#mj?w6>+ z7Cl9IL8!HQHRIN*%o)E86^k=@J?shv5@ng~{Ne4S=*vsb*~!9Pu;YbGWc~NDmH6xC z*x$%1$!@*lDsk)eV;hBt&`T94vFbo#4xCryZPFUU9!o+)6 zalIG6FS^bS*H$zt7%|lCK#bqFNDE>4XOxfi8RB7oCfUqPx*cL>l!zVqR5+g!Tn7FI z(7~WjFk0KE)16&G$_6h}?85qnMB|3nTxkP89!T<_!S&9_Z~Fcf3ls0TUZuWWg7Cv_8=n`H}8f&C(=0=P3Uq>@k-}tAFuZj z8au9K_w4WUW!wW4s^_;i4n5kS(T*oCSH814y<9ny%$vN~4^G)X-ZKrHIn!NTz!gS= zC))$+XO?iY8)g=0>fSh4I?4e;h=tGo=oxf{E^m7!ImgL5;&NxboDn_-ze;#Vh>sC40^(i z?NG!5`{C)D6ZK@vpb(&QQTF3`81ar9(SYB{fD|Fx%hlr=FZtUn%}J)fbr_piJcF4% zJvu8Pp2PY@BS?}gyXjYBP*Z!euj}&b(8??$tFJLZpnbaS^4@|Mloac=ad;h7`+<-D@ur; zawIywQySrC3FitIBxxYQo~@HR7r{3cu6t%oC`T|P&($F?RIC9~#cyR#F-Y+jK?x~+xKWxW>of?rU6qQ%a`SUE8FjSvj3+! z)agn(5ZM6-ye|w(r@jNV`Y#UZ8n{u|bpc`(0s*)~4v5SKPHspu{@#r*=e?1B{d}is z)$xTaNJ252<)P45=8!H)$>dBQo}%`W$<$YTHv?B#mx`5B==8$0=Bu<4-Bi7z*R3OL z$%^oPik?h2cuUsY0qKi{rPTpO1XQ?I-=Mt-vD&z>frAS>yVyHSGx$OVS<)#UhNbUQ z?poGLMWyNyvC!h2IM+SNmFa5pJwN)p-4T&_L)!Xh{cvLE6`NaBy=5?48ce~r=p(4L zg98snuA|UtjB6cse!Rh+I|cE12+zUS{M>2%#mz4Xv+59j^H`68(OyC}XMJN)h~E z5DCn>F6fLIjVkR|h+v+PI4$S1=A)`g16Mr4^(aQwnKuxqk@3DMKW{7N5k?~fwt@*n zoftPZ8@4;k?Zy``%{(9ZV}Ip{KJg@IRbydpz@FeMBZef<$8ka1IKyR0JvCB~{|YvJ zCdZ*!o$kTXL#@2dMrknP+>H^+pMWGK)S}C~<+VSxZA`VrRY`ezRs?BMgeP-pUlG`c zP|{4dsatY!I(x(E{|{o~1zWS1p1iyOOnLDHeF8UI?9Sem(zL zb-ldal|kd6o#KSCm(#)3C^i1K?%O8D+x=CgEE)mJ-dK9^{Cbs+l>rZ_zO^-$$S)UK z>j}Eggfc1LN&gjp`Rz*Q(WffSCCORn>vZ`!IJJetmypa>mrV9}n#>$v=6c3WTYYGox-rZkrH<9t#d1W5wqG`?6Vlc0d0Bk-b!>8RyNAa>>*7XQJ4&0cWl^czyQl#7KqcRbRC6dfI%1ceqQ z2L+TWa~w8v&iceF^u+f}Xd>zx*(ZvikPwC^aU9-%971nGh;ZZGvvXf&pW@pqf~nMg zE-E-GP~s!-elB)qDB)XrA1k+>jJ0^5=Xf2>m%1=(Nk@L9oi}zUPkc!z#Ct)e zeY|Io1vwyjQ_eUt(Vup|_P(pJ3p&3og1^Vya3PI(no@nKq46B@E^o{_sb%hh|(09&G_s1Bt;#HC)ii&o@8uY*;`rQDm^MZ%59gq|2dm)AqQ)a zQ~otLEo7!Ft!P#5cHyG%CEoJK6NFbg)7hXMLPH4-{z=vT1o+82i23grxLe~^$5tSF z>fU$)2sp^6LwEfI=j#hZhn!+1;U6#G+2vhkZC0gsO8RUMDRjEo!Q_@^GU=-%P_DLl z86oBe%zV~iVNtxA519+GrpPNSDak^?F?A?#8A#PwX|k=-se`!?#4E3kf(BW$0J@}m ztVIdE2uiNrYUQ+8LAs)^HAHGjBRTOb41^!7@#@pKOeLwoi+0sSNfi+HtV;_VYMRu_ zG!tk^>B8TZ)-j$bS|DOb_t%r}KPgoz`ovKLVj_N)pZ#L#Nse&3}Kb>Zz}Zv{jFawyxx$`woves zaE`VB;E$ZHt*zbuFKp*udAIyi_r?xja%9G(r%l!3ICJ!(45pfF$mwtzovLBo=IyDX z`krCv^WW>YV>!}|{#Rn{7d@5Lxz}DEGf%48K2}%rPpE~}0y#_M8|07GloBQt;g(_XQ1@hx zf^sCe3k7A;lrHXMoPuqP(Cz>%Ww?v&7sC9|M$Un?F>DYU#5deJ5d2z$nYRn$J~4lk z0r58LUeqlbb~S?D)F`AwiulP$so57#Ki9bGT9V2yNs_Y2{P9H0k}vu^dXP;lqCNJa z(N#*B{BtD5I|)PU2us``?7}2VEk_pYK;+_aabswU5=s|ZZb2?i?Mw(OOYbEF0&W%X zJ|BfKZxY1DxXl+Sz=Z^#gG{q5nw-vsOkeLaB2xqdoX#frRd42`hu*)a0 z&CbsU!yq}@_7$;5-X-db&6sipEkm%qiCB7P%#G{ZYj9`wozzu*t#0}iQ~ZF0gaqeM zs8={`AUXtAab7?8v9f;jCy79_tl&ob7MvM!=J6cyba%d z!W4%zmX45eVBGJJ@3h|cf8>nP{>VwkQ&dC!v*CY~sS5p_UZ`NWLDM7Kks=^2EDO*` z9x^d81$qOO`l4f{LyRs~EJm;zreN5{@we+p?9VWj0_E2odvFFw?MU(cdN*`N zGOn{q%gpm2kG5!@^vZwyUANV>fLv$&cBPH|Hu*yg{-@-7ykuo8&ufY1=~Pu!x$;w# zD)67zN1#6$r_lAB5pc@5-jjjLBI7s|Cqw)@X(g@_g8IH4 zQ_}A-mQ|8XPd~s78I)qO+PgH;ZFW-~8LjoTQnoQ*P4$g0^ne?2%PG$P-GflGWxvm$ z?5Z{oloOh)yek$K0}lV=R!z z^bbOczyGNF@=~fW<)?>Ky*uN5MbUfr9!m_k=UF)thVhra3WN12cX37~*xdsHSFNlf zbW2d3N}=WDe65$erSN{{VIhY5_n%2H6fEo)%1v9!tb-iI-0%t|r zcYBO+vDuUG{O}qwes~MX%DN{e?mKJ#q^eyd(iVJ=%zBn)W`&$^Z!i;EZO3mHKyAGPv)&qUr&Uv%v+hBkB{%&m&;vWoyZR)h2e?hKVF5RIHOo%UZdt$d#t7tzBd{lV}DHO zL^1mwH2}XeKhrblO*%cp5%o{t$YwV#*NZl==I2Sox(Y2(PygDMcbYKA^f{yg@6sS4_6eRloA)$O=OgL%6KV;RMYIr$pl|T;W;MR zxudSGGF@Ar`Ys>3t_8myvbJINR}jPX3>&BZ8K;CGu z70Tm{+a%Emuo|&Qw?^=5E9LS2s4G0I8v)Zewr%`N9ICGb^C<6lzQKTSnl3cMW5V zGyeDDJ;KF6c^T@n2V8S#Q>q8D7o45&2_@>H(iS>E>1|JXZAh-&!8cpO{lY=h@m>mxI3_1_yI!C#?!xn{Rdkv ziEp&s{!Y?02$Zp?p~l|JXG>TVq*AMMcB;dM*o+}iN6>(e9k>k2rrP^eB{Z2L8kdyg zVrv@j{P4-qg0;?wY^xcb9+KlGPMdhX!raRFCgUt2wkDub6 z?6Y`>>P*l7Zd6Pd-nImr;=`8%R<8v=pqgx?)6|uPTJK6{3WE_OyGbDx*F+#Ei@m4u zC!ajCn@eIIkEWvvzEkdXPkZPxKupr5=u}_`HgG4XwqxSh?a~Q!jWQ9pp z)G*o1OlEMA3@RF5A&vWGr-DN8>Qo(0!lVLzCwFkLULFM*kPh(7TtV2D5l?KMF`jB; zpC+58Qk?3|0y7J+mhk;%P}Pe?8nM3P`&8ZUB-Q&|h<|zDVV^zTkKF?N2EO3Wo@uz( zt!0%`sRyi_t$15v^=6Dl7J*s_@z6D!Bm1DKcYwMG`24G9@fE+2wzfwO<%HIBmzy=) z&fsBgnq!4}2Zub^dWV5+yzhRKVJ&nqFaP;(<8t0R9N=R*e_Zp;`wUZe!7&dVaRQ z0BnG_D5pR4G96cvVq!s~<(_5dlu{O0#k|b4)cMd9bu66w+>$pR2M3)gsHasEVn2As z%<*>jw1E#64>4ys_YRh`)(354KR&Qd(-?U%CSbIUswern1&7Z=3=t)GS@bkVXA3J` zW-e{9Ggg6&<8tRRQ0UmDqOonFBO$9vT(zpEN7)$=qG~T=thCOdP z4RKVvAcQHvLOmu7RO2(=!TQ?$m0|N&AYTwK8)&->)JvDbBVN(l=*EpZ;hxkkC->$7 zc$2(X?E_4iTFnVIfU}gVgk*bB%k}9ykd^!rOj@c_RRY;O%zRY_dDfIOL7somba2Z3 zYTj-kt=J>0pDC@_R7C{*EVtD4{@;_89S`QBUTZk#FKPgPgJ+Eba|GbcRyW<}$zcR>@^gl}135}K<)_)YXyk3lfB`OZPm>EIP779l&{o2;vf;iA zwNpg3tKTT^Pcc5O@A!mqC@}+w@+EuXTeKD8im9 zDXHad)AVDGPXTCAJU%W?RzgO`?-1~E-U13*+0ps2I#(Es)qKL}(d(YaQ_|@y$RsxR zO35HC_%uI(!lRQ#)Uy{Qui;F5LaG& zCz0V&zHRUX9jz)z!PCY;8st*(g7-E4jH7&gfo^_^e|AQ6c7``F(CNC7q;&5=qCM0R z%EpRoNz9_A%eDl~qTyeiuXnt-J->x8`5nntm^VR+SYyI%pVxBLm_JA&&{bI$>Jo4$ z$D;W_T2bH7n3M6r87$TYnV~hi*m?cP@K-qV3|IxcmRyGanmJ9LA<{3m)F*IGGVhWpwR9gE7cdnhRag)fjF1Yo=*lWXayu;nss`mjaf-n+Uk~E7rJ3L%)Ps)(kTED&*{8IGNmecPnoO0?JXO=t ziKD1Fr>JkPs2vZf?T_>UpBuR(NoT0#m!znim-b#QRmIxbz26m)UwU}dJapSEG<>-s zSytP(#^zz_NQ8sMz{t4v=TF_m!LurQ6^h={kW3;=Fl7hV2h+2Q3)<;sY3c?vdVAh( z<+N&a_iBFcG^zy%2m`pmjL{ds+6Y3isdcVOWpkV}{%UtoEJ9|W_wBG!b{HIu3M!~`0(OM2Ck((8a&fs=dA#$vqu=z> zanbvjMNFKS-#oIa;RPAHWC|3@27QKS{8I*(nYr+Flz9?JgypkRB7W-n$o`5j^Jdo*^xCFR?M{*i>uGMP(}NZ%(Cy@qt=^g zv&OfZKIXHF3S!@@#2$+YGn1=+{86hO*wVn+=BkBE*laTDY7VujHHn*Z+V#mq=^$_G z&j+XG7x;{^KH~T9N@nccui)>xI-HdG=}AophCSEW^(hRgxs^Xr`_@=?gouZE?~?l{ zSBEq!lfz56yN2Gp&vyo=^azGUBS9Yy`O#`h*o|8?pFrd%+~&|5H(!}RBDd|U6WkDT zqU?zF_JCO$pHzPJ1f9+>2)_p2>uEx^Z1NeC7YS$^kj7h$Fl1E@C_!}OZ6=p5J^mA8pk67Tm=xM%YZ26+O^k$iQIhIV8 zkOgSeK)bgI>RdVezEjtz)3-wJNwE3}vw0r>Xbx;GmIahOB~S^o3k!-21Hfh|kkaWF z^C5ztj7kjO{9&uBH$WOfG`(6Z7Tf*lftZyEQ_Ol_bR!^I7v!(#$?bHi@7!h}qv{AT z*mP!`C<|UbYEt8~h@C$iRX6jrM&qwfv$vOFwR&Pqao%P1qklENe`b);TGsKYDM^=A zm;5DN7MohX8)Z(Pn~0(Aj_S=z;642x_%rKo8T*dKWe=$~83vM-x4$Ku5e88o4$s z5P)lU%OfUE;&%KjG*-*nUrRxaIgS{rR_XBEAQvk|=yhdLGOZM;UJtsL(1A~oPBlB% z^cR!n@#qq`{o)ds+_t>0@!%V+uTMt)`kQKv9eyVVZ9i#V-hbw9i&fe2m)g?zM631g z_Nvk6>1h-XMqGr~OXKgqdAGd|zFG3`@H5F8v# zUV>`+@P3BYWyN}r=J40PI*}D2$|SA0R-_7hq@F#$h`ify?bWQ@j9}S;=Of(BU*_~> zBg%?bFSIS_(>_d=Ht3R?S3Vo;)JdP?3^C0W4js_X7^4QpcqioIWA{tllvP&zqL+z3v5T?x(CA<>d~0*_;F9ji6VrZ zkg8u*yXS&op;gPTK9|6r#V>w~e$~kA#AChedEalZ=_i zS`9$}Q6v3TpG-%%M&3lVYb77~AewDTmBPLw!9z$Bmty3_cLmYn6e(N}BXEg9V+&Cl zzoX-nRP>LUC*SQY?xx;cw4k{%jdB#wQn@;@yY2Dnj?e~UpzQ*mK3SaR;iPf{0lFH9 z*sxHH3h;ipzYaLY0k)fDV&dY7pSVDjmiucihTaU*^QNWmEGvz&1*T1b0PA(Yy4`CJ4VYoP3E@gr#1ARq9bvM>}6ZHm4$ z`{A`TYZTO=<$ffRk3R58t=0g4QDup<&0!mqh{Lq&9vc^{YRtX;4+t+X9Nw?WWv8T+ z<&!HH=;wExb8~ZZ_{jTcwFeM-W+e|k=NLbsM8y=S>Q5P8zXu~P7?AeZNUE*y+;GrX z7xmc)JL|u{-gLRy#b{+PItl>8B;WZrRZ2QkH^*)e0U~MN?R+TjNSj0RN~~s#E~w1N zw>lk(%vV!1BmQXN%RW*MH>BA$2ZISQQ^WTgx}GXvlJlqryMFp92(udQjD^gRhw2t{ zmWMSFWjGfHY`zz*`jh?IE65qL+hAi^G>q~_nn}o}tWqJsv}7@k?c+n;OdI@^q4_Tk zC}w_TI?5-k%Z%_n^5}V!yY( zT7TZv^c&N`fxz^CE-6jo}V;;4ToR*JaQ#j4CLaL)gN7=~eNh_+!Bu(DYg3vLjk3a({ zto0pIcORHNxU+)ehbU&e129!tube*6JpmsUZ1MexDiq3! z5@Dw7qB|$bM}R4| z8Qf}AtdOKMyS&&n#ba~~oIbDhoXd3%SGGs-r1N6{M{CTtLj7k#J`dKYx|j8)FGqHo z`2AkjkA0{QY1xqfayq0jYDhqY9PFgaYmK2u^^r4^bp_+gYpeY_h$OWx!+qb4rEu0w z%tZ98oY)45k5W7`waq zQHqsD6kgiZanC20ri0Kb@J1ByYU25aLIWLjc6phfpRFcXtQG5ds_l#Xh5a|xwY4Ex z;x65$(ZD6q;Pc>~o*soI`iG$y+kb5wAS++fta>vnJ~=fvfzr~*kCi+_2iVkVwWLC0gds(qV4$-}SuMBSwY#wO`@iv;75_^LkBt>uFUQb*#&_lWw18Ll(+$ecLcihZ z##}o;A{EGai3-<={y_J5J#B=+IiE8$*>h#+)()0oR{nzhA#Gf_GJ|enpnl;_2Yg$$ z7|#SfdhZFmUiD|?=s59}0E)mVJ#POrZDVoV+L%dr#P28$xESAeS%u9Pg@s;u%3ddsRJ`Fy8SX9>9J zL$L>>F9Q+&EF{&Mb6O*h*BUI@ zomg((;82$>*Dp^iFt-*h?Xzi21Y}^I#`Sz;;Xgcc{rj4rRCwf}G<23&Sc)Qb^lJI0rOi4S=s)B1ODbEWOWC@bmNVy%**!*>hCz7 zlMu)hxM>wPPL&mPsk zCjutfVSYA-jS|t?PH6_76>htRAiVf$sqtt8QsVa2(JZi+c#@RB(fEF1;AK~)JS>BJ zv(qK#-~rG0=Jxlyy!7^ZM^{YqNZ!5ly*@XmnYV2(-+!`a7KABmJ!QC4oBB_w2FA+C zp`0D{mG=AK$@P$f$XjO#h5(Pl<+dmHWxS83kB^V12A@xAeAn-D<5j5ap5RDNZSsVt zGnIAPg&{wG=W3{RdA3xLypXB+@So?deV%`Ki?k@X{ZkGPjgqrY!V%lW`;;4@bbq7flx z;WF>%2|uOY70{ZQnKk+yb6W=N*tK4bU3p*adsVg667sOsHSmAP?D)3WCA<}Tzx8cK zX}!w9jZ3{Cu&x6CfF0CiIUU?BKS-1M60*a`1b%Pte$4({vYsBq&B4Qylx6@9 zj`-4xN?RbyK&!0oBk743)Sj#fXp!&={8V zjS)sjndenG_SfcU65Zb!%HWSIPg^5k(9)uGx+}%w6M;~@-ztgn3>t-8u)a{u@u*(& z>qmwLPGW!2(`^;e22*vNKKYGbVwK0IZnN||ru=R0v<8|S_`5Ny<9NQK5YE*tfCmK7 zif{XG$OZ&|FU}1BYa=ik18AEQ5;g<41cdxcE<8V6 zdEBug04jw+0AJodY}J7Hy{$qdiK4^MX^Jk;+WUDbTOqcZiAVdZtNEb$H3s)b<(`6X z!rNr}VVpC?9;GKsf8H}qiS2dTQ@s}tysJEO*!|qx_R?&ry?G|O;AP~hmeDRk>2 zHC+#>cUs?{lXDDa>c3(unp7|OPtrT^8hAfUmLg|rd4cmVl9hmqqqXyYmHZ8W>Kr2? zB52C%i(v})Y>mT$Iin_aJhrS6R2wyP=``i7D1bTELBF@lrny^F(B%pPc<`(9Lrj)S zdzXF39hvnljuF3hb&F$lZFyDufuFm<2Kfgnr2#BS)xDt1P;yixHWAs2%$=)wi5-FGJ`{WtjuBH=~6L1f{AEIJ`OBZAuDXk8j0tz-N|=|KA|Q~`_)?M ztSF~7V6mO4G1YP7e%xGT{>79Xo(<&k>Z1hUq}KPSj(siPZvBoUubuwT%{{VN-r7g$ zf3-yf+DY1QW7p7E_*Ss+x`UI>8jteq;B0gL8T|daQ=uRoePJ~!@)_-ZYnC!MOQ^@q zTjJ{HOpa?Qb-GQ_{J}Q-SjPCY7+#vf8s-OWtTZ~^qeM)CF1S=XKcbG+@zZEpqNSr? z$_Pp|PA=;g+8^kHg$)y^A2Xn;xPO^bZB@{D4mP!Gl@-(x-vKkzFth6gLw7lRjv>V4 zR(oZBzB`r2sH(d9>0)XZ!4e=bVpE|21P$5^n6-eCp_%%6QQ#%cghnoPuUwC=tZvKQ zN&eTx{lCDF6kR||1nhM*{N{)xwy<#*MkmrPXT7S^5J4PZ*Ar;Jc;<#X_^-DC7Lz57 zorBv37gznHw~sbf2HDiMlD>wWbPy?trCLGN_i}rrqVF4|9xfhE2EVlt0k7`1D-X1) zUunVqzFYurIdfmQaIsIaeL|ugli4y=o{H!IB%rS8^*f3JFyDmp{}j;$x_zimQ!nNm zKN;<^K3WHQvGl*;`5%ok0LVGS0Z2NnUd&Kk%}`Wy>8;szCjHxW!{prK5Gsui@43t= zg(U9Bs?4se3>*fWOUuk(i8hGcfvXvw*&A8!1uM8{F>6CJSnlz$JjZ{xn*3pK7NL$o z@&0AAX;R4L(NrP3^pF17gO6Ogx1J@fDB}(9S!1!0@E9`RUIC;Rp$}i5;eyuL`cKBK zdPa?q>o@1Jo%EG$agH;Vh@?*$+MhB;U*qP4hW;5W{i>*kp~#Y4F%Mb1!ql+N(3xFq z3vE<|5eJ1Gvq?ZdWB-6&HJPeH)dKtqYL%^11_tn_78}Uh!x7^8zs9(n<+q2!_QgR< zJ|L$yyI!9!W_MpWW1>3*#rc2xf6vx!4l_2#P@4_2N=NXoA-Mz3YzP9ro zCNM9#wgC823;v##Fpj>BfgzolB)tlp5ZA*NM-;sR%fzWO8MrUv3&;$@FaKWp{AAG@ zUMC^_omPuaY?>AEkXbrJ3?f)|{_XVSRk_~23jYU_ouWOeruz~nRfTNghvYg{pu*De zGva_qZGR0Ib=9QrFM{Bx>ur7AL{+{dXffVP?nE}IzZftC$medmrwLA(Ev6Ui=Bad< z;VNgP)UVOLFVJ2y+qX|#_abYwu=A}i-?b0zSh)8Lf?#Norme8*i0kQ5{Bz|G9HjQT z#e8!J1q2)$K9)c1$32UFWEZ>_Am8$diy&oM|F7FNK!3h^GA=hTI5@Z{<0-}X>)_zu zjM3swbr!uc@ZP<^ zw4%8j&{)juWpYOK>ki3=X5g{>VcKIIE%*-^$2B1VYgCFZ8ESv<`R_^Kr@cBqSh~6` zH$%(*I=>Q#Q~9V>qz{bRL^fH}>Sc%$Q=U*ndYg-hbDz3p5hcJQmDeMhRz>>(Ifu2o zI|cASTwI@wyY20DD3jlD{E@=vw@|NYVyRkA{#i(#2myh!@DT|{H~6Z`u%V#)s+67T z$wBO34FZ5G^iBd0ApCYM3$ z758ETbGY7AI^N|F{mnJ_`z;7U{*+Q0ReH|@5N$g<6)#TWG`)cvZNJt2X7DBbQSTI0 zo{a|Y2@$0-G|ywSOXF4`w3*1d!U;~+&s4VOf}tI`~hV?9Dj zBo%b5m25@bc)k4AZ^{;5oED!3KJezhj=#Z<*0uPx07I=-r{x8Z>TqRXSy}!@R*raant*>INc!{WddDEVGJY9m%LsXP8iV}HdeGB;94?7d|=E!9l zu|wS-2a%1r8>!;&tO;8czDtotGse6rvFsvg>!s1U(1?O@1xHb_vV-1ROEEqe76MRc zQv){F<+yy36tSfWs~Htf-}+nbBYP^(BOzsHJ+o*OKZy7Dy)7kcBA$DizmLrv2~&Ro zvqSJeJn;V_(BA1GrJTe@8$SSy-oQ&9dvRlhD!hD^WwKAJI6ox7M_s+jF`%oVd#qT=ISuJ z-OGwN0bU~-Egi49kI2?F^N15;Mweqv>X#fvmgr;-H<=^_lCT8fgev;1mhw%7|D|I( z9>8afDyz@o9c~yO8?yw`KQ0^qgyiZUMSlM0&mSM#k+<(ZsjG8&gRM@5Hn2$q5T!#4 zC4tBe;KFWJ~Cex`L`IMt04~aVb-2?QgtYA`d53P{QHiJ`)Y>7gt zP@ZUtTJrQ%^weWK_ws7ld+&)mKbM0{^7GyGTW3gACVVQ*6}Ks-6C#?!HSyK4GNJ*I z0jgweoz~s+Cqo^vH4^0cmv$_6RI%Ad0#Jy;6SImy*Xw@Lc%80-UhdJC;eFC@+}Axy zuVX-CSk@yZVzi{5jK9Lf$vNfS4eHJQUZ;(d_eo^*qzAP0{-S0t5@6wY`ghfhaLu42 zwA+?$`6o&sffh^C9`Z3!zC*6>LV-vKpHr9Fo75Cp`7;94-l)qNgoP-@o6v{Y1uk=f znb-ePMY0k)ht(!CgTeS# zmutOZgPrMv$T;O9=Y1s!^4^e13Piv8~1*nQqSe}8yJk;MP z=!>T<;knWHN7$cf@Z2ZkhRWi*=3~PZQr6%Eh+8428U>6F__sTz-lw?Z7CX=OAU4h+FdlHR z49UqGJQ$>qy$r+#X7g+COfcdhe~qR2nd}pW*5p2BFd$s|eBAZwfOch(ZtW-ZXCA>% z&2Cfda$&D)?qG1&7WK>b`3rmhJPkTKuDtHq$2l#@N_qX z_^_uqBy53#5-I&|cw?Mc@;A$3Gx`HN!IXG3U$c$iObYfPY`bk_ux z+N7M*O_QGIoT%>{0M>FJ_=@p*g-KGO#{6M!&QIY4J3gW%X`niC7tJ@r28F$!CT%O( z3d@k=zgGu_MDF9mNrP#+7uV;yG$VcbDv!2he77derEkjxp5#cnEa?^#qOu3eulyis zY%hdE){HTKoWj2~ZkJJ)flTba zpY}$6^k_$sA4xd(cGZe9s)p`t@qE|kr`e5c=|O40;g6uH=7CyMLEhkY&xO5CBx7X7 zf}xQ>_IC3LtNz~aTZuTXxOGi+L1-^tD8uH=k35n8EbACWM?SEU>E0<&)qrtGYa1X! z9R#X+0QjnmSNRyN5UGt`NL_QT2W?TOw>l8JL~NR=l{OHrh0tJZUegC`h3Tf*!4!ab zsmnAP81wu9$Iy%2=#DOxLt*pQ1Z%Iy1!$Z?#voNGCheU^lHfIiuwROJ#>SNsqOg7} zS;CP|+&4U96+G3s)&&G6W`+#wHibUP&Bd?z8l#-{t+gD|W3JZ}J2l3EAPhoc z3Nq9?b-FbOHBt-hsT}CL^(%N(y#trIiHO0Dct{OpdoH~4&gW+BBrLz1&U)U0fARIl zPE>r*rxcFlvxa|bk}ZL!ufaopKqkVYeSUDLlybY>>kQvDE%_m@6Bk*`HMGAmBG`?W z{6WoyL-%qc_k4_(-UCK?%Nez^=FgjaI?$cx$3nZ6)Ph)_;0blD6e1>ypc~*&Bnszx zn0%jAO_dc45dCufgT@&O-p~=?DAh|;A;)qfDzw0QG$MFE7T`__IJw7ep6$|gP8JyBxa?WG z&RS7?wZPG*Ic?FLA{;T};-x#`#@L5(ja%e!n{b8k7*(uZt=!2@&&*V}wZ#IB>R&R# zUS&r=fUYe2Y%`XXms2Ges=osez<*vsztcMa+ms8%>oar*-*N|=T2!>{Q_3}fxw$yM zyIsNH%3Xjhz1Oe-nBcjIVNCf!#@;I9odsH;&Ju5&s)(|}qQ&s~;E~@23{X#*q_F_R z5GZ1W&~)#a=F9hEsg7?C_d40`ESCBc9_crS4@^U4jr{emkleLjmTPRir@hnOP)vHicDCW&ybcLN^qgv+8eq>C6e*|xD?#>RY+S;NmT^KnyKL0!) zs7hmICgX9rvKEcxg_`^{w@uru>PI+612;x>Xp<_OV7z%#`$TJ^x+zrH$t)kLLeI|B zML-A957MVbcP5=8=6ri0+q_ho`9Jvlp7UAjq!kA*x+6qTUu3pPM#eZSOR*Y1P$|~O zmlQNo-(DU|QPW*O#Z%cw;@fH*Xe?iv{ZKB3I0rXT{$c1gQoskRGs95CccuiN(>9w~ zH63s$|Be=}Hk1-r3R=zfXqu$(d6aP~+xoHeVil|!gDWRJaesnpUD6{HwmYA{2YPx; z?HXPGccPsCkF56&r#k%q$Im$qj$@rcv)AwT`COmt`n})Z>*_E6sH^AezVGK_ey_hwlI$ei&79)BN?MMVPpWLqGQox} z!#d;6?amL#!X;6$!}nALd2&)?i4cIuxek4;mD+aoK$!qM<( zdeFz2q#V3U0JZ{P!o^>zk2~@~eDTtf#Z9y3#Kc6)4XjvGgG>tnVQ|w8?!?U}9lX2l ze#hIN7$tw z(qr}wvs0@yBlqs-2E8)gh;~SeTi3~2XrmiLz1TfzkA@KD3TIl?Toe}j$}^6ymhE0g zUD5xEDt11u1iz4Ed+sdbr*)MNsBGE?+0I^oxcXmS2yjyr2jX*TN*zkl{@b#ryaAwDY=l4&Vc&Br$X&&IL%3`t(e)PM;*oxQp`9r6vcC4T>(LBE-J8ppq(l-S=h;~BsC z!y@|}e4M-Utylm80-8I_wt(qV~-iNl2~%4O>>yxwkXqKrdPwM6i@D^E{0Db|w)zS{K) zO{kkSaj})Tevvdn6*|g5ysyj#4n65tlT7Q=KcVf-u2S^==<9Rysb%6;G3tsCqcO%k z(wI9EbA^Ay0^^ez&qNWNO8&$UR)5Tbu0jGsW)2s=X&%98QTu0t`k-i~pG+#00|C>pt2fNheJ1v1!eu9^cMa8e_pN z0P_q>&>Oft8=V_t-I)^e*H0cP!W-iWtSMxc_99O)s4eBu7M+!|D6lP^eBu^eT)qBU z<6k`;;D+8UdF1A9aOQQYvo(A}=T#g2pB?>w6|vgHH*m|lu{T~Kv`vDP1hW!A2Mc7} z^WVVtI}PaES;mhe23&|5Da00;^vd%(%9oDKLr(${6>|Dvwa`9ZNtsa;uXn=?PcZ5R zR!=tZeFrL2n_E_|{reB!AM|bM<>H~_h?WtEmO35gFaA&9uw0Fr$u_Ha2Bwym$X|G7 zBA^UCf1*LSeca@w$F6Dk&yhCW7HRMpv0J@jWt1cd8%8{&sNFl7a$K0Z*z^n1ahU$z zG1FTHPtS;yd|o%+IyMB(%Rb3)%nLfAJ1@15aw{*Q?baVVb$Qg zM9YM1dskE!#Ccez&_wskXl*+Zt&_J@Yc418CEJ)en7vhN=ZRC&o}V@1nQm7oA?cDr+GYphusH$(f6me0On2I3_P(xG z^5~{GweG48yC;Amh`dMTQf&H+paQrxJxtkW{(cE-yVdG>f`dG7gSGwUMl5h?A~J~& z&U2@|N=YG{rbWlYM+bMgA(m#vf#E0O&U1I1?Y@0fVThytO+a*qGD7sxqX-N#r|-V(46Q-h0^F zoOa{428`EBsx>2N7yYH zK{T5qTe*6)T|Q)TR!UzLN#*>=Q}C-KYyW=%3_@3Wz)S!Be_iTPPd@2@4A#fuVBSx_ zycdHfi!CTaZKu4=nfJo_Qwx3jXoaq1!7dBYufA9h@~ zxb8l66_cO%9bN9j*m?F@HXR~Og-}qC4cQoMy~~k+NkW8i1y`fSJpbBYAuRbbRzd1Slvzt-d6cjUijdE-{#d*#17shNR z5M@_jRt>R(3rG@K#hX?g*!H;)+D0Asjc)(8CT6Dd2&wKa#`bh8Dd%~g#)9>fe2iED zDXDueLr}0ewnSQmhRvr?ay-rmfqwef09R(_G@P~uz5bfeqs zlB71jf0G~UkH+#K=oF76Bx|2N*Y?0i1ne%xXlz#0mL(YHapDd8*+C@PB$4<6FeS{f zu41y9^4Sq1^eeniQx3c-t@lALe7dZZ<2%;0p=~jEL)6dk+;B*O%7ET4uc-+Ihh6sE&Rt~fc6H{3bOc)bl=7azdAP?;xM_brAIxd0o z-0w~z!RkmaFE8+A+=MaY|B_1myvD<|+gPEV?5EN0tke97lJ)IW+qhQPWNxFq`l5vW z?+sev*0~M$zaPi7un(ESrbhf`bT@vC$a(nQ1Amd~%q`bpFw>U`Up4YHSy!^|F;Wlx zr~bKcDxntP5dU@iYDsW9o$;E0h%O^%Ilter_s$ zVZ(hN5Xqbn#u$u4z{wi2q%l16QF+;+OS{}Z0oDzmwYC=m?LS*diMLhvoK%;VC(I|@ z)e!v9_d(B;Fu~SJopohC(9-5T>Z|>^E0$T`OK!vIdU(7Z!Qc}HP6kCOX-Oo*Ac4S= zWWgA@M%G1SSgaK_@GZ1zeJF~gXbq+K{sP9fN!~@|kvN4K;mo#?E2f62slD=K@Q0DV zJuGnB^nZni=Dezr!l-rFetYX|^cyufZ0ISG$?!gvkc%d;iK~3E4)(KUEN+ zQVo~Yax<=1E=NR55RTXfwiULFvyR%|hL;4Eg7cP&UN)4<^<1|)hHbA zcal=@6{1^~iXHIRB6`c*uxh*f(3hycF5dtS34)=`RlsSH$QL6sW6M9mYq?7VhjULf_-u)Jw4rf2Vmh~ke9|muE=Yv zN^OOt4VuLY_Y%V_3sQPH?DHtaeG$ zR3h=Cd5?;)=1=Qe=;{&%-XrKQyKbjAaOr=29%}ODf7@G5D)% z8TcF-<*4KoGGFKp$e6p^!KA;K+XSOJzJz2Ct7`LqA?=_&eezAz@n?2}zvZfu+GM8Y?~a`1MyH+*@5M#PRp)~E$#KB2pxYIOLsVOUUWv-euO!&| zzha=4vR(jf;Vrq&l*2ubi#9;M4SQS+gLTD>7`;RDbBr<{TCyLqJGQ^$Y&eahsT^3}iQr8BpPL*qc(LH56PAOnaj zc!VLx=<}IEs~XX#;vmgi*}1{Yc(KAmf-s>NzBFXyJ-pC%QuiHY=glL6<}2lB-YdS2 z9`;yE|1db)`&bZe7WfmcD~T7Cul>E~%wQQaeO%MXs!^!XFY?L@>Yby@*mAEGT_`z&5{i z@fz7;2}Qv^aLQ=4m*GNAy-ulWLe-MzXcx|%%}28zU;BkNpbw}L7U9;*Q(Ox;tDQ)Z zw1AD8UB{;%6Kc;?Xm{DqtH~yGtK`^Rif*N|$g+2FceOKm#4c|=ehHByZ-+X$a+H;` z4^72}JtX;-DVe_{X~#^)Bo!tHnYujZAr+;;LBiXBM4Zz;(TzePQj*k@tlHVq5>6Rq z-WkG-;AAMmT9A%C7=8fL>pa32jZ+DB`{ZQyu-!?#%~Y`E_isJtoOe)_!=odyY@Hb$ z+@6g_{j?UQthF3jr1 z*D}je@27m`+Eq01)=2j3>wvXTvTnw*m)*V1m>l!e-m*us9(zo*7Kb7QTYKkfmkrye z(~gq661elFiPR1iy~vs6NnO&VnUuhk$&<9z3Ec; zpE50>jk|;Buhr2nD}Rr9h&R1V@Nm2TAQCJo?sbl{CV={X29gLbd#{d>$i9R#iy)=w&>Q?C&W_}V(YIhvgQ?J z{3*_tNh0th*@-C_AaP}5Gx^HPkdz0vx@9Q|5$ET(ryIt*wjTP>()IK8!@CiZ3Rc7r zSgy&ko^&| zZa1Q0?xInD7VFY(GB$2J={tt`Lx;v6m&unypY7EnRi0woRf_!}U$J8e&?C!S6wfW5 zknrygnmNUOgGec^4vDcR`z|Ck>0~%9k5@#+Fj)8wU)RflaR7BJ&dl%;Ht*6WMUlXl z)SFl~mVC@7;?0xTv@*BW@(QK(@NK=1vfDM~bK2WxMB?M7+`(Nu9DWpAo-B?@xA&)| zY4AUBbFrh~T-Xe1C$Aql;dsUy{DBldX!Rf^){s=PG!u=Gz1ykDY&Egt4ip zt>0Jne?z9V`SDF}4Z7LenP2(W;xPw2T8W)mQT_Z}12?*Gr?r;O{p5=KtZ~dJ^4&)S zcy)RJ*qi^uGbiwD09J7ry-S*264~6E-DVlEGvHJ3kV;mU_+*xf>0%U~_Z|YJxn28Q zfmp18)m#~(r37i2wpxh?8~;|qsd0QYQvKXrh0GH>j&jrXk^ZJzrOLfWQSr;nioc%I zcK8YXzx$qI$e5TwC$nd!BZ$|#2_>8L0>L52;KY3lBC0SFAn)lwJce>rU}y!QW!>n% zEZ{baA#jtibRb)Yv60}10O(qw%Q>>YUm0|B0DuR??gcepr(NSZ%z8%_(}naOy4e}& z%FsS!$>P6CdXfX7)cwRrhLR&GBa&{1G1F31Xtz+}*;}9v`DlrEUtAL$A4fYMZ?mhY zLNoBY6{M)3wnahK^f>qk5PJAOHudEt)!m>w7my4UiYK=RaC|1FnZnK4*rk>oo{m4c zJNRIqOFqf68;y(Zp^SA?Y^!oJt|$X4T^j$v;mssR+v5nO2v|201QRhLhka6&-rYAY zujft=e;c98aV*TNjPK*Q&`T{Km&G{r2p3%(l-Yr{^jnYb-5R9RNa5qAEqqLb^GijU zwgsVj&LgpXLO$NujA4~>KZ?Gv#px$ND%kA}CIOFEfS@aMmpIap)uRV~ES;VcV9 z6(Xh7taD~W=S@L1{1`{<3Oa%@&HsUa4FPAQbEKbtc=h<>}q5^3W z{$vY#_&1R|$S@{`EXDkj>V*lYfVfp(B3>+vL)|}HdgeELEj4@dqrI{lMYUeF)R!6! z+;=)u1~Z!*H7Mf{NEM!%@My7Z!?teQmjj-Xqb?;wo<*_e_`jv)i>YdxMC zO~xE`rI_9i&!P04M6`T7k*;nwNTz6H(B5ly%!_o=)1$HwZ{58u>`Z}txhK2nbV z$E6s@6&?SdjL8$4wY$9)H=7#K+lKaq-J8XXI0gU^K;q=F2Hv-)dmfD?)jXy=SihZ~ z)ANLRJ~s@(XoWa@nO_l`22ZPb0|QJ+H94qx6}?)xb471*eYJz?k)N1(?{W2mRcQRS ztdjI;uH1Zr6^XxF&k!@jT2c;9nNL&&?{f)!z#pmT{2GTgi@GkuoOp8Q%v; zCBaaVX%SRPS^-ZHZVTj%#6YlqvfduEwFg;l6h%qc*TCMMJ$3Wcq#v$ZGv-fHX7`XqE@e%9xcI#QITF_l=Ky%b+IXF1&l}%@C&S2^GxyZ{9a4beW5=+NuB|=&AIR zB-6--UGvBQGV;kfbbFjDIj*z_AO23^{5cL(T0ho}!;7(~HfFbFR?M{lwbR@Fi;~S!9}=-Vt2? zuN&46#YX-xR|;+s#0iQ%{UsRl|IDNmr3LdXInT^eRo3|4OW*4#FqI(9BU(aCLc;d| zOyv(Jk-w{+C6F-GcWsJh#uUp5>Nl&}w{t@Hgf-V((ndo(zWAEEm5fmXAHm7Yj&G33 z#oue9_(!diXOs;ODV+W+QpbrrA@!X9``xRAPW$w|>yL+03|j%8-l8$AFFrtilis_h zG3~|IQrzIi)6dChi;wT|NY7mJ1>aL&#prxUBJa+5JcgtlvhDLpg)~z!%Lq%A@a8m1EPf7im z)sv*+;@dENTvbk+VuAb#>6G3>8N|bJho~RqW_qRSC61LgiIP`IS17>*v~`fLbhds7 zCUAln7<}@O!s!po!Z8Ki#c&xzUm_@aj|Zoes!f}$Zgj9uAf?wwXH&wS@1xP@feejR zq;rY*dyO@H+ngw=Osf3hYX9=KLid0+=2{U4$tUF4%OM*3f$335emmCu5zA&HZBqP& zOEj83tYQ5V6HE_UL84y&B80<5o9MZ0cQxC2GCU6wK+2Hs{o;C*1EP<^nI>+KHc}M9 z@P{ey&#$A_K}J6Nz#6wM>VjK3&)0?eRcD;XqCVke-ygD!IjY|a-f0ymo2>G=HA47_ z2pQV!=5`r!URP8Ngk8X$1>{IT_{P=Cm!ZO+p^{VmB=s{N5CaevKiC(S2Yx1Bzh8pf z#&4I*OljK;qs2n(>mI?sF;3Vu-eq2|#Y^Gw0{8OF9NZ+?zHq9xXs*6~^o=v^r>QOV z)X%Jnaf)%wmx7A-Ud7oQ30+5>XZRe*4y)~ zpZF!t+o9W!DVKoEQ`Nr*KBOv5mzUv(b1t!t%$2C&D3G0J=6*P zbMXTQzODh#n>RChKlvF`>u-t=H{q!=7MaV}aA=D`OJEEzene$wO_Uqt95ZUpG)Ec% z1*$ZpWp2nz7k*+XquK-H+9FzsfbN?*DT@eUZN^T6UeuAjIlVgk;8@Tom=7qxOc>32 z+8{%-^7^*8ucMrI5`~7POzxTyn&x3s?VvZ~DM>`FRV6r6H4Z+e*x6osnrDzCs})4# z&8d=0l-~(5%CC%uEKkaq?NoBZ84^RDj^ik>GX%>etuS!J-{B4nbf8Y*RRWl#~whSJ$?Qw73*Q7fJ zI$XdQkLiPTfBKsj1qhP^#Dkm zX}2brxGOZi6jmbov}0=V283ECKYQB0`9{#qV^gc2IT*w$(trMmP5Pd4?DzNYK3dbt z?J1{h;UjCDT$FdX^mo5P@{X)O+T-)0_zG24hgzq&|`UKYdBoTP*AqRNXI4?3v z&4j>O1HdKuq!qNpTWOIyI*?d~>VmgG(ySZGKEQT>~Rj-N2TfW!K&`{~!mJ{*_BZ8C9EI ziE$Y?9ut;_+rqMK(_LmL^ObPnVH0isYYHvWXZV84JoB;s50<$}=QSI=BimSzTwm)n z7WA=V*+%Pg7q-YQyi}LDXknWOJW~1|@0{*dGyLL%HkX`&*M{(;)RqmVb<8vNsS$aj z895)W%|iW}o~{~)$U?|Yy-Q)+bbdy=)?`uAS1i9m$(hgfy=PcTiJbnJIZf>if%QiZ zA98M=AzHa0=@}Vjg4BucFvFz4WpDph;>d82^1g89*&OJLnp%!Au==TnUFar+@3zwB zU0g|Z68`^XBi|@~ z_jn(9?^n*g5cvJ*(IcM~5V#Tq4medJV&dle)KMh>=_Isx_M(`qap;Ra6Y3{zpQUXG zpWY;sn*&`R;V6a?J|AL%h$bc?+Ktb;fP^xsX4sv@x@KEkXw$m<4J0+y5!gqR$Kkp``&MdN7#^tYhGwVkDd~ld=5KQgVIRNdMS3W%h^|DJ z+SOX$|3XvX`tHJW{Zm07cfd-eyh!wCr;XLgNqT>rzm?@#E2f^F2uR!Mn$4!>ep32= z2IMJ>=>1dQ^Ncv{gxTg;*bC+_33FIZJvbp;qjOJgGuU%~=b6M#*C`<{v9F7eL9!T9 z3`0%Wp)Almgmm4Y)d`(;wUNi9DWVSHyYDWrQ;PMuSF^IPWvJ|W*UO7)w|LCp0eS06 zy+FhdAv*cG((Ok`M!ORlvN035ePOe0guky57iaH|&xt|*6t7_&gq`K=QX-Nc(BlAx zL3j1N`$a@VBq@87)gAZX=&Mzk0j@-vvCe`W*>0#dK~AE~?O>y$FPjZwHJ?wt#>5I` zMLO&KmUhpRa`Eaj62xA`u_(Hb-`ms6UHqW_GmC5$_FsCH>pyMx9&ajx7acfR9f3;4 z*Bii#KfxK71_I@D0JdIk!sCy@W_s)))fOwH7{~OJDtTcmr_`aE&cXJ*j#=HwLgey| zQ-8t#n2Ct))g5QY7?>P8UthuHYqv`_bLOH z+-j47+z|IJZW%zHaAnQ#Qw*haRkC@0nA?#nw8XR^1M6atLvohlIpf@c{3CR#x>-xI53G<@@VRCpc@a1gEK9_Qs6(VO)s{@bE(T~39M3vbyrt51-V58nlqMY6h zv^hH`_)|;r@eYbn>x}yid~=!&Y!pboGb@}bo=wJM_MsXUi+u4-KU1q7g$=<`RQPk@ zhDWZBRCr~^mCdAm28+GANT6Rlr&bpwHhMac+M$o@5dsf(zOge2LCO&XR+B_FBMt z3htBkg9nLoI?ak@)D+utgb(82K_)fGS_2>p#Z$~I;3QEnz)6Dcr4S0^mdVM=wmd> zI0Hno{xqDKk~wH)7-+4JNiDEiI#4!79Rsct*!M0LDVkeU{mx{j&o<=OKg-u$NfVEk zxRp21SfGD>9A{yE70mV?J3C>R^V~EeRaFng%#eG~4mS-67P?g--uZKn!0%*{|7!P? zoqpR=L=?(;pCRj3WKyhJi3H*W8UZ!@=1t~zn(P;{(|9hC>9viGfCOEkJd^JBK4ALF zkPuuBw6q*s(w@;EOxF|xL<^x_G35)OcH zWMJ$|%Y48KXs}VBxVF&S>(T11fdkCopGN(<3c_6*&5@uvD?E0%G_P^H&3LM5Snpt) zqX7;&1jWKu>PSk|q5eK$NFUzb zRGva@nIT&P{0qG&gA|CcV2zhg86PR&K(NSe*@Z4<_rQMqHkaYRC%eUPfH7Fmc_&6$ z{|wLI;b7vLrGMq5pT?BiQjx~0#MVh_=P%9tSATn3HaWIiO5Rml0=fnicVVr$Eu(gJBR4G3ta9;#~|8Vf$^s2fp~u5EdBH879sL{>N2E{mtw zT^W5n{%Le!P)Ru^w6%0Ox>tNAYN%;NhPo))D(?@u7LHervyNl#(Mx@eqZqebq4ggr zP@TvvXAGtg`1xgMLWNepPwA%;W7EU*oOVin0Va{ zPsvjOD==2&T3)-wBkLKi8(kcSnMwFFPH|s>_6)C^t(9tfC(6mijxR$bOctIz5((#m z!eF*DgofYVQ0;iH(Sf+WhjmBO4^XYY@4XQ1hLwji1P52cw;s7va>-=A(k+!GFyjeJ zr>0Vh4>d%XXLN6kJWKo!%E zQ&t@wkZx0p1V;{AeT9n@-O;4cGRCV({W(SiSE28Gouuv5-EU(45i=yW$H3jA?5S^V z5`=_7(ci@q`&KX$LZP&8?RY?19}f}1Cd5Dz`=cdJX9kJeswvxT)kY&E!qUtj2~tM# ze^j%Ilq~LE*s8@2IraSGQmfZC5gvUN*s8o0GH7=C`LcJUPMOc0D%ePfxA(_`>RKeT zJ*=z{B;$ku>ia14yqR#KIQpH|LSxKMik^u{SKia)?CQ!xuoVJ-UV^UcikbV>FQ z`51bjIE{*mnmo3+HUGlD0kN@fwX6r-VOlq!Q=QqAi+%m`s@_HUpmiz)RjuSROVP#8 z#KIn)3wDGA<{sy`&+Q_L_t{_k=aR5wqK|t1BJ$n7crza*K?!IIXujTEXx{;*7H`)# zZ_b86lpctQe5atvXp69yxidZVgmL=LBzLecM$6LCx*EdOq)Y*cV-DcQx$)S?`0d~I zK5MwcNHf>AS?anseCXD=dqK^!#ZgoY1-Y`RV!G=U6ZnWae%<|d9q@o`)1v!Lg8J=o zIM#%E&SVl(Gz+~>fy4c4(l+LhSP2OUd%@5=I~5O$cB zjmxFXjFRkZ3j`f53E}C~9D@La=g;U1Bv@22vMxR#s$PaTD)xytRxN*fnIS~!gqP9= zH#vmV`j#8!R~XUF;`n*_flnqP)rv;ih{Md`Rkc&o9SIc+J?y_)7Da75pnBV@u)v}Z zYaKGDUB*Qw1k=Pqdu}ToZhI>y``gkJp#6Z;*6tpvP3z(N24F?>8^1dVs~D>~6_hew zsAtP%gZ>qL%?NSc?%oh9ke)gHl=b#xc}`x~s}tdI&p=pPif1ne#Uqs|9C<5HGLRue z6@pEi!h~-|m`$c&GoE$Jzp6wT+aE#(eRBRR{7KysIa`ru-oI=L|5%s+6Whw9OA?3W z{#TR(w}zik>y)L<#P0JDCFN|l-v<=}g)OV~&Rk*xpZDFSA|m(`ugIZwTAGbo>)Q59 zuPlC^)7M}KHpUL=q92I+GPyqwxc!0J0+j%3|D=X5qz#K;Y86JBbx22E6R(1XLY*?YdFZTsGT)s?=# zZ`S3>1Ht|Yxjl-hxt~PBt2O<68z=uu-y@G?iZlLjlO;m|^gU7FVkHKPK-2MZPrSRT zs;UWXOc%}Aq(WT^R>?)*7@k&`0q&bZwc3p+gSEs4#Hvdgh&j6{wi@)ix_@yreognL z=Is`DL~pXX;kV(|ZI!@&!t7t=VYfH4kghVMgSZLj>o zzscYBzU*h;o~8RVHx3XIE?ifYp%0(r9EyUOqxUXGIX$*U$9G#B?tpG9UM%L=LBsv~ z6%dBlH5`2d>n+lT%C?3f_SgH~NL$)3T>g10*l+fHrBN`;uWvPt4{uL$k9e*R@CMTT zTdryQZk}E60E<_1@O&pUv)Zm!Z7t^^u9H0?dq(89OAdL9c8hV&UnWNnDbfiJKIUSN z>k2JdtyY?eJHb{aC-whYGh$GyG!|jI4YcrZw0scGT-(@9&(#f~}eY0tslI<%=Z3r`C@YBDz zS-a1av?UEll?+-B*dPk3u2JoS;jm_TV54t;1c(Mm}nS4dJo%dj4T!&0R~)FrBpgiYnmQ_FrWB4pfJrn#{B~L>-yTYtlJ3MqX6iU19h2tnrQbf+KDr zTBgN7Yg4;-{PzQ=#}THROuJ`-OQp7-@cs%VevRhz-dSW04JT!1IS`3fjc0!J?xRO8 zQ(mHavGjimBw2#1wULZWOdGF?c?sXP-_*oOfE37|?!bP1F$Nf1bbL>)Rk4=3(ygw& z^o};B&0y4OsATPcIU^ji5L658k3idUFNy%uZ^ul7``-DS&rLLrqw{9(oy83_NivVa z{KhB|&(7=ehP02h4za9M34vHn(vbH$0IGpoSN-%;jUqW0JEh|Tpt zzfBKHdW35Rt3a*pi+DWm*X$o_nG#hsM2=K9(Q>tm8Zb+9YSw;+Hx`u<25<%GJSCsh zSAa~mgX{rV4pU911N6b56kqy^*!GTRH@-9!oi)~#RA67MnNNQ*;%1a&MriLdg2f2= z0))fwz62LXOd6A^U~uy8lxj>P@k-0M2W=&o{3daCQseOr_Oskb!pt3#23Zy~8v`Yo z>B>URFZA}W@&_bpPn7sNjdGnN8oZx<^gmZeP-a@h4a5thIgC+WB%7iqak*Ka|GY~0 zPIa&D94-G}ckdwWn7)c{jVN_g=1rT)Otas0JjnC#z3J+iH07HBS^0EKaZ2pZ4{M8q zYPHg^kNS!=Rzvw}RrU-*Fr(Oy-akbR|8WKWyc_EI&gHuN$->-a^Uudu)X6-Yh7Dt2 zlXY|cqaNAM{Z8dA>fRN(HGHf5gvkG%FGMg`K&`AyyHz)2>55eKDF0-!_dYP8Ql6iS z;>ef^L0x$yQ^RYzZDJuMhTkGLc^e~%=lt$CHXY$4Xi~4bZc*tRN zT*mOjtcrcLHK3Q|iNG_rp&qCz6`So-HPO-vqtTclbuH`_!1~RiRt3Ij5NN#U{g@>nS2T>)1%l6!@cH7{T%~1+(`0bV2WP@Cx>Q{!;hgYTSjRWf zm#)8LK$O2bB&b9EY_P&fO+kw@~1pi|;GB=TUr`s!RtWX_05l4HM%@u#a!+bPC`C_Qy! zbju*uoUnDL!Z#J-ROgpyfqzbzRmd^(*&3GPc23^EBtY4JxF#`3c%Z4{_`69fdz<5@ zpyO!yTMDh;5t+Suw&fU%9-9*ssB|gb4N@XiS#JaAxYpX%$A@mlVce$~mrv-TpSbJ0 zZU;CQ(^HFuNyJ|Ga=6ru9~2E ze+T=(D&{}=+RiNgFg6lt+0GPui#~h+r0hueUYvNjZ%?1j&wlgbRn7m!ZSjn@tGq~B zS9@u!b-G|hS}TJlaGv8k!t7?jt%aE9Ddqoa{rU5j!(3BT)^)pI7q9PC*51VdjMwn# zURyQ2v9}o=1@C9wxmX1+N!s(N>JWc_h+fvS@E;v{vCH$f^c3(Z5h;fAdsmbuem83Rbk)(L@r-eFu0}tm~L5B_vZ}Ww~z(8n9WIoS(Dm>gc z-Bud}MyR{$Ny!6OhuF1A7OA`V3$3J{g~4q&{$}h&2NZ`t4DoPp+hZrC;-q0`+J@#{ zq^PF9z7iUDg8q=KRof?b;?-PB6;0`#tzS8@dsS+R;ZlmFi{$?|l7Usf>xg5vts8z8 zurCC!Ct$~KF_1({5cyr@1lPMsCQDVY8U*&u3-Zj?a%d7Ay_Ky*%E+x$7yo^H{h^d# z-atF$6(Ah`WY$?8KbZI`_V|^6*mQHxNuzbc{+qv z-5rnMRD^kcWNTQ_S$X>}h2iJ>l2UC5{2aL9sw_uB{eVP=mq`5XlA1psiX=8XrlbF< zsIkPhXPs68p;ZmeHkbOuSU{`XP#Mt+q1KMFYq{sR=(KrfkhOB8)n$Bq%;8`2^_wM# zE}<1y&T_LKuhwy=FB*Q_Ok|I0+sWh@deF%LB;TN+Qiz~v2!sL+O?p1%%mc>^*mHwm z7sk!Lbl|}328Cr2KBk^rZY`o0KCddYO+5_ODrpA#f5B!pyo3Epkv3Z0w2b2(%2CEnhF4oSXy!o1M=w7{whr zu$aVJ{tiVkg)iv}dd>>zaccUwY-(b1#Az43EYAJ(`#)=z{4Qku6HM;pZ22X{!Uh5#*Y|;?xx$#st>FnSa%w4eBZ)+)XLdt zEZt<0ew36KuVIZoP!RmY(SGO^FyxS3-@+|oR+kOGM~vTUgC{`Yxys|G`3P@D25upl z$JH%0WL~ah{EqsItF4&>->muH4rk9H@nlLumcA7U-FFXbCraL87+b0n$0KFzAZVE{ zR98Mk|47D*pP#lFNOD0k3QyKUyAF7nkcHUCR#1OzviVWxi~Z@cCz1tBa@iWEfxL@h z9|<>kyHR?Q2tVhp#AH}mr%#Lm_;*~mDaIamyHQvMJHMOgmN6oA8uv4%e4&S(2Pt&p zmev29X&>klu>mT@Ky`|#&L%u{6SUQ=HE8&iNsf&EEmEr{0uzL|pHoFaC91t30%PBbbR{8xIK4g zex4sBGf=w3Jj3b~kabZwX*(ivX!OQ%Y}ykt_BwQ1{s3OV=-3)m1WDv!CT5bM7fpFR zxqd3khsM{ZVV*#m=3~XGe4q&&^$eRLK;IHa8es1RHmJN?CJDeSWv{yUK99NC9V7hxj3~Uu=<2Ofw5%%qOsc+Vn1_`{HSqNSc5W9%7>*tJEZelO286@mx7X53# z6&vaDZ7ZDgM}V1&tPaXh<$h^sGD9qxlLH3~rD8^O7h;_Si!x<7wI^qQ=1h;$Rlr;B z2?<`I;0(F`s9UCTUwOK0VxvsnPLT&pe||ISGTNlgZZf`8;8gjluQ#DFV$#5JDvPOL z=XdR&TBMr}_jwVd!r|`)O+SU&>2bsOWd21b18*tyB96Y6@IbS$rxnyH<&RIPWoJ~#Lk!~OR6aA zoB#-ixZECR+Wfohd5IPOjAG|KZngeb0Z@1i_T*!A}^Gl=ZsPc_4W$V#oa6!rf8Q;SPl(pAQds~iOT zsIHy;kI&dYjjmY5CJPWCeyvFU?pNgKnr6g`(E;tI-+*toP{b8U{=_xNp9fwW0G(;rg-T4OUS5msNi zOp_c(i78&bFP2l-q4jq8Ej>fP=?#J0B9}3XDH47 zU<~j|!61Nb0ISPQjA?T71&i;+r{-3>eF%jRUNY|!k1HG8WFEPR-|x!DG}e#cntdD+ zP(_k5SlMh=JgMoUK5S&!OF=UMei4ZQV1|SrZ$~-1#@@`?0DPae`#~#ZOPoK0@a*;^ zb(pv-VWbzo1G7e4EVlYg4Y=W!FDk=kU!S{P^&_pil1nGks*;kjg_lz`}@D0So zaFa`mJj^dBhSn3PCPR%fEliEy19AnKVDl>U&jG5X+M?$xx_!l)uFsNpnxje7s=tis z)8!Fg^1wHV@z035R}kkloO+bMM<^#pmr<307OLJw391BB!ehf$=+Q=A`Az4SK{S6R zlk&XMgSyB)$LE@NfA{agIvA^_#8Jb;@+p*ZOT4&s3^`_7^=+S=A=Z`f;Rz=sj)y93 zUy%r_W##OPPHPFwNGIe=#AJbk#e}SERL@lENb6`*QsS%deC}qO4^~l@_PD!Sh8bdC z#^Lii0rjI2$y<)FI4zIC9ru&@hc3XcCnO{U*aUE@Ar*S*8Mz z3|FNo{&%p;b$VbJ6NHXwGPD1sFt9w$HG?bi9*AM|+PS(s=LNq~nNgNj?tR!&oo?jl zZx*ioK6_aGLJ*XP_i9tX@U0Mm3MQ2z;)h5yuo)((dz|btUiJE&@}Bg>_=PPkolndR z>@HT*XEvlR?&rZ9ruc<~n2H=_6-bh^j1l-yEy*WP>nz;s*lImXUw6|fO9-Y<6MI;zf{**E)NW_KUwHOAh#CzkOwMZmZ3=#o#v0vv zF-etM!L;7?NS(IVwV}OPR8R_o<0nZcC7oslGDKn)bm(wudAf;YRR}sI7n>|)g9xKY zc06k3zI1$=-OHB};GmmjPa#cgBpB`Pt8#&PjO*&jLj^J*4RM;T9C6`v*2Nqyg?{m+ zy@5M%CIju$vAj6d5oZud^8k|)hIzxwjy-#`ZH}!7)GAIlhUmM53~qHAb~?xZN7h?M zH64Hd<6{gMJ-Sm=kVd*w5k&!|YlxJG*;e zS!`(_o{73l8wlx;ziPf%2=V9T;r?*vll!V1{GQe~Q7SRIzFU)@|Apt?39l6g zkEIP;CjoG-{XZKCK&iP2xO^@69s@Gu#!h&}y}Va;skA>vLFFJrcoHCr(9OcU`KhJp zS7)1DPF=jYPA5;|R*U{uTJqO_US93kDD(ysw5u?aS5z~tY$JKfOrk5QX;!+d0W%?< zanZ03zex}q<3GHe?}vCtQ4WEKdeuq7X@P`nR)y5%pDPR*vQ_k?CNCd#^Qf1)4#_^)JViay5`kCIW)h3qGKZG)#akP3pFjU^F4q+;__=tKk*3$LE05=w;QZr&X zWw4@D!v8C~2mD!*Fja==>G4>iE}$ExQ)0-u5CJ>KqU>Zk9doF`YaI_d@gv`!(5*>l z#|Q+^6ZKnx24UhMm3u9O99ur=u-UNDD|4K|`B${;;vo&-Ri__)bC(^L+@OYJZ(lRi zQ(3YQZa4W5cKS%E{rN`m0Sf)Ijq2`KuX`N24*3+Pt_&v>)<>9 z_CU6s;-^~LQuV6G6($-uKt$!9Mu+z{WuqoIfVxh7={}937fBLCQyNtkr=`)&hzC>B zAg-dsA9<(rAW}9`=?%OFqKXf-IptJ^@Nk8^vZ|B&RqV16 zzPC?#WdMR1z#D5+$)Zkkx$XRUdLywPX+;g$W>|UVdZq1i;Qc&ZkmZM$vl=(Z4Y9#^ z-g7-E#5}2fUNEumCf%o<@G)1*XaMb+{hxyO5VUlh&PhqFK0$CN=ATpY0^rbaei%$Z zZYCoq*J}H5>$?k|)Hy@9z8PG&p|opm%#|ag;WyH@7}hn{WQ>yPQoBn*Gmy^x;X@CA zb^w~9f3}K|{%12U4%g_~!3XsEW#A-t8u$9U?sa$FJ?=O-p(^UoO3cK7AzLRg7a_-7 z(_?_014b)z7YyK1_p2sr0vn_-8F_(cgG5iKQrN^x_CZi-plr2JV*oV;pOh8i{`-o? zw)epA#9O>x6$J4fuKtvFb!^cu305_-f8(`B+uq2-Pg8POZ_5;*RcKO6&~j|n_YigEQiW z>&FpCSCphH>EU0&s}4kkU!D>zge#~)1IHEgq2(hqTFS~qHqBZmFW9k4{K{)-Apx%B z2cBKt|S|CdSU>`xel4|R19U@;-z^uK$IWL_5-pS{5lO{xY&zDT?esLS$i~Eps z`0%>oisHYiAdjJzA0aS84)o)%KaT;O!#pr(-Sz3SAPo(wm-TIAGf9Mv#JFa;Ue z+z~dB;wJwc6#Y&mk|pd~j=DoV)1OwE|wB`r(f=au}U zzR9XdF~1oPU%poncr>@koYOGRGUMVXIg+kPI!yt!-n0u|q{%7pZjC$v{l+xvMG|PC3{=yDv0Vz`8DS zBcIP34^@sDkT1KGlnt0do))j^ml_lJU}wuN1;{T=Yh#+ECoKyvo1beM(Y+wHPXh?P zBbJ`C7yi+nsiXSyK4Agz7G>zBhUo#1VZbN>Q6CAw7>Igedw%O`!^3@?o3zhO0l`VY z<8?wj89AUF(fHl27&NJdtRQkQ&AY0{X`hteo-N$l@TbEovTd$IrvuX5ZbUh7|`!CZF!>t8>B+mbn8ioC~|W*dFJ5w@nR2uNr;j?}yxVt-%Qr3OU+83LC740_If#@x_)INdTD(}~sr zZA(D4!A+_YsgHKHvtdbc_l5<5EG%lD3g68O`IGyYh`=8NE=K*(0LZl|U0k0e<-|PC zY(pNC7f4EpCV!kW{b__-of6)lmk<#FDKlyMuzxG4&@rrUrc%cLtSoMW@ktKsF;QbX zi`d}9H;rMnUAQl?9i`?ChL%~SI1I!qpTa6{?Qx!OWEJao;KR_<2mA0&+YM~kl1EBC z!i8yv*%S4bDClj&uDJ8{^xa`u6~3UxD-#@w&(g&ma}S`G;v7q=HOe?54+6`y zd@AqMP<7665b5=3Y*~~wZ-Q}dzulwfXTOUxF1=xbXTY!Y=ELa^U-_uZk-*S|k;EP% zu$K&l$otzeirBb7%N`+aaYZQYlnRH*rzk@iR9{WuLe7ej zc$?ba%-W$G_`z9Ugl^xZXlBYidc$j(D_L}B-+_m0%Nf(`1K?i-N(*q%1CUA&rSV|% zI+8IXKq1pj|FQ!ESc5Gua`@=O0>I#@sDkGy%{vXnl@0=FSvy6rMg((lboB)bBWpoI zymb2alJZhgpvy%|+nw@#$RYVJo}_=1l4^Ver~U4Qr>viaEUUjKut@s*UY_j6ym|v^;M#;XCD5-O1T=AK}i#8GRMs-A5 z9}2}Yu(0^}ooh-`Qe@g&sPmeDYG>buKEn|3E6v5RzbZXhjTr>bKL<8bvtD}%^FCg| z#qYfr_rh#c-WY~)z0ab~Dh)$Rx$Vg!E$~9ZQ?DF89=@L-=_oR3kL7*U7;Pl2{tATl z!s0$HsUfu}^-eHr;V3jELt@$Ym=((skONEST(=U*-GoLHGH55S65+yQwG`N+`MZ^ zP(U04rrPVfcqT=iP!LeGl{=+(KZaur5HMN>G7s%?ajoAxv!bqGY$}W-vI5aC(PLx z&A%5HM(tDBT@UY8KWepCsC)`VA3OIYS1+6yUi7Adx1XODUeK_NFOYBneX%S@BGgjFl+>%*tfx z?Bny1?dBl-OyPE~y=!Eo0!abXpvA`Pph&ux4yNjrbrc+$)CrV$%+y*iE*$k(=P_6u zPF(Yv5fNy-G?awm-pj6=P6#pwl05J!_wO--FP&+l>T94b5*!uv0{f0TN)pNkh+4)E6eJplm2 z9|d$aps_tK1K66Rc?t14AGDMPL0o^nlYZ9MjSPjYyPm_A!yGSN_+LGki@Z1;&<6PQlia%Zp10;^1iZKZbEp?1@uG?{&u)VV+( z6mYtA2k#qSi0Gc4|9+@_KU`!|Ql4>n$u{IBrS}bZ6@M%-b`4^Wmq0Bf)k&|+^>PQX zzf@Y^9{g|XoVa25C=TN4r>sGY`VTdN=~O8ZtJ+9YS@ivrTOeZkpQsCROS~faowE5mApXb)eE7@ixu$`eT!j z3UocMp`k|L0|~8|GBDE1oaK8@<8Ikjftr}r;_#)~!*-KWa{L-iIfDXgQ#1E9)^OxG$R|s>w~r@g+x}hmeE1-~5jYx@k>{;|@43 zq;j?GshdS1cGM6jn`Gx%<8IiO&N>v4$u|%{SM}RHY-^|Q-l&oE$9RkBX?F>{+!W9m z30s^Rgzr3Hub#h%+iZ^RYE%Cj{*7) zk=)XEE4oUEzZA24LxBk&j;3O&4U!MOB7P2PP@6G>fpChRjZFXO%&XP=o;4n96;yxF z0mH;ZbmG90c)y{cIc#{CtZ5z+M;W_NObLVObQ*!=&r>LgG#H>;I9!G>!c7ynNS&n2 zptG~=_s&kpbz7(Nst@uZ=`+$V;8CK2+|NWz_E^uo#*M>X`|_2ewLyBa$78deTAQ!( zXKigQi4?c0zTpj+*vB%hQ0AVm+U$(T5WMzHr`+TOmE2VX7PfECLV6=#kNN1-I9Hkw zxTLY~e>qATI84B7&^%gl@sz=jeYu$`rDd-a((wVOM>te5sa_bK&fA?yej{jGpcg1Z z;Mkhi`-L)T7a>cI__bE7Zh~^P*fr$$rkdYJErDi-~(8N>y@AA?yu)jOk{#BxH}#AB-i!yEy<)hr_hREByAGwHU>9!kgQj>#a|#{a)*l^5rro1|ro(#c2*Y z%UazOJa!}MTxw5pdq@0z_OIRB=e%QPrjv)KKMt$wbE(B?y6X$pq8trBr&QuN`;QWs zFCBn5bBcX*1wRGDqK~z5U&}vgpg^dD{&3zv^RXyS--i|Fg@yZ^C6TbXUh> zg=QM8F9hKg5@u(D;`G;qIxlJB1l=t&r}jL2wRCJ_@8jbX`9fiS`S(|r426k?1rV0j z)?LxK8+1p#hS6Xo@$7}djquI3pnp(LDKWRwbRGY8lhQ<;dafep-B~>q9<0VBi7jcV zF}vG(RcK>VW*T;`M1z-2e~CGt!)+JW@XyBIxhfV|?^4yJ;#AK)Tibn6-I6PF{gECM z?lkifLxy}ur7~}5jI_^1tRUiB}4L4Y3n- zNP^bTHs5$JZ-+#u$T|WwNq-NBc#Ho)pGy^TxT~T99^wkzBezwt|9c zTx7_n>}hv!bT5sxv?7A9S9ll86S}>IoPX3T`4JwC@^B-L%Bcu*d1CK($lm`l3bmp6 z{hC9IMltchr#ya~dpM*)RqPST?CRjyfae`ul5Q!Q(E<@yb@8v3W_@47wjTwAD4oX6 zHiYcf5yM{bXEPDz-JO*V)w!par$-d^cC3bR_<4>tKQ)zTT0}CJaG5*k=AjpfYuFh7 z7mpnZwD9^LIf&m%VYqOt41VH^Ni9t8cI5n*KJZ8~CI2ca%yX$d-;FpI}=~RbK;W^yS?(XXw`|dKoP*F`~KkN8GS!MRJ{x{43P-Pgl z<_Z{@dDFe0uWSC>gQ2-;i#XMnEu0m$m9G8SnueF$tkl34Mq0k zqz}{SdkK4Ue)^+9waqttKTF1LJom|`dzz`DcH#snQ55_=XcRF=E#yUl^9z%t}|Sh^H^F>h@hb3z6V%pQpkZUIz6 zTN4Fm|7>g*ZwAW&^2+|<9?Mdz6Ghu!$H3FYr-!>T3=55)mv&5Yp54tw&f@e&5rl=k z*8}lr4Y2co@YQF;0l|^Ra?b`)44ael?SvSszuC%>VPqPOb1R;>5ooqo+miGSg zi|~1b-_-i`b5FWJIGV1>fuVPe7gST?h+jTKtK={mOg7hbGe6j$H)1zYFU;6RvS|a+Xn@-i5Rr}Fw8gmoXIjw7dz@jP7 zOqsrra!?+7DS}I)){;KgjP4fI?(ECp*z$J}wW1W{hX{CYQH@+F&vDT2MGA){f$b72~*l^rY+@~NO> zN(Cbgsf_t7mA7E&iXyAMMQzLVM4dm-^0D>rn^-}yT`(yy3z4!^b9{8eO=)Vj?<&O8 zN7Q31>M>pg0wC@@pFdrI`TW(zyi=4=*N@LJ^)e3Tvb(Sjd79qLBH<3!x~&8h`L6%Q zyTtdaMMc|HeCF1MhhIWWI`0kp&!-0L{hwOReR7}Mc|8LdcK7GoJ@)Uj&9`1gF8UvI zzA!U0^_6%M@0FS_qWO{>xl)1=60qp6WCGCVZ%j4^(Kx|lC}OwhhaGMMvvq&}hSodw zrceJ*!lwVV!YvyRHMV#M5ToD>*?`qJVr?kB;@F?Qs_G$9Tz{aKg)Xjc%Vjcoo)>9rgUa^G?0TC$uLgBw*MRTY0ZuJBNhlz){V6}ced zKIL)kyQA26zx@3(`BL^zQTF(c?m(q%iS}yal-MoUP96qw!R3tzV^1am`HF0qsA3K-(YHJqAf8Yf&qfZ8K?^7b_6{6DA&QnhD$q3UiDEc0<#>+lB-25 zyb`NqBuVeh$tT6|naCS`!qLZSaIA!OL6f(+RlASjK9>HEbST}2`O1%iv@#XN3Cg;< z(}?;)>};@UUP621#>K^~)4q@V<9IGxj5{osT+Tyl%J;TmA6>cMw~W`em6h**lyQW?!Ra&t}QDninmMM>)|6Ih11G+JvT_SlIy^-BF@KrWzbu0>A4Lp zSX(KZ7~H0z9ZaQJ`QdU8@zuptd++Uy`7JKW_k9)En#Mvr$v{tPJ(9Y*N-@z!-4v7D zG23tl5Bh~$!I_dTOZci+k#3$c0j!5%d|{4o_Nwg}oTN>QQZ`NN*ME&0mJ)*J6Cyi! zu-|qncQq4p!(8t)AIAQE*gA6Fn&4g#H6VShLZ&gsL&0^`-%3{UYgtCvH9BP+QSHbA z@4d;aPmDq4a^sCPxOph&DbT9YeZ76LvC(cT>_-&YZ?f%^L5NiA$d5dnxA$= z!S0b2vyEgaP_xpWfOIkzUZXg+^@sp@T7~@D?(mg%?wxV~7E3sKxTL!|E{3tm=apM_ zV4?V#M2I9nhg(7uFW1_hvHIkywOzl_AOy!Juu}zc5iZ3mo=%a%Y;Umwl7tcozBak$tGl%FJbjz=`3?(=BzLY2l;1FUTk{6m_GIhARg zLvU2Cru*@G*l8@T$B>jXzIOPRhQ4k3;L7ks8FaMDAT#f!<|IdhyxyLsJ(Mp@m^eJZ zin$T?Nbrr}di#EHk+SI&P*>9q;;ql->l|H>$O#Nuh)6?Y#@>8-UEl7MUJ=DOI3b63 z)O#r+pdh|GhCFq?%;I)U-#8Z^9H)E2Ssp?iGPs($5{a6aXTNIZ5hfZ>eSzJ2m*+?EW9@VN>$NlmP@fO;FszLNBtcLmfG>1Je9D)gA$_`h1@CD25OT-zQ8EqL?SgF4SDir-x z|3n@6Hk!@nmf-A|4WNp3O|B8|)XCTm$J*grE4LPFPs!AvqFyn2uueA-hXO|*_M}CA{Hcg zl;+)88h*_0Tl$;)?A+7uvM+~z?Z3zC;RMHh#(UY`JBR}6p3na_z6c}>=%wqsY9m??FYjAIG+c2=>|#4GmRTnTzTwpV{v^Jc zB&GX~6WD;6m!Rd!wQ%?{hcm;*M(^74@%S#*Ggj2P*FjtbQ)f^Pl-Y1PpCd-ueiwwmLX|WFtDNCJq&DJIvfFYS-}~5Ep`9NGzTGp7-2!^V1s)T>OtPY zVIKfBpWa^IF0C}ThsKH>eGx7W@ZzcXa=!s(_8YAhdY+@Its%Lzig`rB0jg4s<-&b- z@5RfwANL#yho4*2zCGM=jk=6+I#{)fq7$SRXHw)LxNl*Rhi}(gzu-&ff7G|w=K*LM zY$ETPnUz-ktV=ici`FBw1*i>&J2}pxW zNf6l)i4lvUsSN+fk0^py$m7myG6(4EYznzPKd#`tBlpr>6#44gVIcDT^=x=Vg<<{m z7R&dj+dYpW8Ty_4aIY4YUskvzxJ=t^ykdKWrv-fr<7Rv1zWjI{Ew`)}B9^ou5{Id_ zm1)h>Q37}w4+Vk_@8x`(LaV7LtR6mBd8svD9|htW289~NvukpV%PPe~)s=dY_8eun zd1Q5|ql!2dEUiP}iU8U-U+UjH%6MpOhf|`{JOAR%PLl>x@>8xX2Dr#Rs(N=EfWMym zQbNWV-w?dM^Ewvh4(g+2$Ae^k+B=r<@!Rg+$#l8Dr`2lFC>*}Wq1fW_j9hUc`|lU9 z^$Ww%ShM;)!Iw@0jxzYL@PY3WVW4$b|E{l~8txaeNj7D(QyCTeDA`f%#D5LMy_qF7 zKTwCLd45F21jGu@xBF03q?Nd~;Qbmp-HTb9rNrIJZkeaAAsbeJw7rlbvt%^BH+O27 zXdz$hS!qxcxwhO?QnX>0YD&z5A>4faZ&~=?N$gKzksYIw>XSq(Bxqkk^EeZTQ@oV; z7wzeP0jOCO3`_Ou2dah!s;J36k~P|`Y`KV+A-hAgBv|b(=!aOEQNJ3WeKE1&cRv`h zerQ`-Ipc89ym(D^J9Yc_7Jq`2_GzGDPx9xE*NID4vfZV}M06VuhX$zQp&FB*yRn?Y z!QOVDRK@o$a>`5vtQfv$c_33NJqboZbHw4<5k5Iv`N5xavLwNP-H|zw(XIfldB$X3 zj)T_yE8&}q`wBocw&Fek@0N8U>T$Kfv5Li_uO@Q7F{$Icc|ufbWNU^0)N)eUj;?;J z(X|$>B@N0S*|M`RvafcxOdg!W!Hj)o8YRX-5NKTnXP~lBEq9nyET_=I$=GGO2s^gT zx7ZJBV|Yx;N>hgGW+^W%1i~>Ne3OYGF2oB#*en73ZAQ9m<4iB|KRBf^9%E=X>58i) z-UV+4CvB(Z-CK?!t7r>^K^<;$UmB(Fb7q4O3&o=Hq@f$CuJ8Q0I_yuW-q;0+-tA9d zk7svPYN(@#2=ND*t_FFLeX36HFuAh8Ny5T8DWsF_K2VAhiw=NHU*jU*hq#>HBWysk z+uGivzmFhJiEZpx{>D&3u^yCg&b;|03~|dGT>m`$OKoKse0Tb)@?CVJefYM*$!RiK z?YZu@7v_(2z-hu!xP0>?g{eE9G7$F{-xNZc_JT@rn?}+xqNL(!qzO9goT8e+O=Z{n zRG`+#pV?F%g>o)wVN3Q`vI}elJEJPc3y@z?o$omD)+41dGx@Q{$7_Rzx^geZ-R^{p z>Eyp$?fSpwe5bS;bWj8(rxE2(wtqsca{0@h>h?>3D02A;IRE>Xmtm{9o{V!n;nsW! znr1p1LKS_%h+kos9HGc=yYlUR>D4Yq*VYhMM}P`N;dh+2xOB>PMJ$fl;MNGOqD&rU zI1c^3YmA5Bw~=gC*IvEX%kFaCuo;jrSV;{LGCaN8t!M^woir<{|9?sVMT0>JfeT z5%AEe3W=#x!_>us62uiJdN@LYvxPn4h-YzXVe4ey`6ZL~SVf}-aJ#+gePf9a`U4ym zw(JRHkb`}}*;0iVf_7oW3P+}ZM!9~*4wLHe=5|>?mM~RH#=f_tXp4}GYpyXi*E$6a zsT!0!Qn@5$Gu83<%=_Q|;czVxr0iMh@Z1-}i(aEh-ClTMY8*Z&Ed6*FPN*Wag1$9xd9WcQs| z%FKxz2{?JTbS9@2P9s!v*dx7e5PY@)w>M3wPU{Fx+n21G(vRA|FKk>&63n-sPl}b zoW~@e-v@Ye*XKak>+SCS(G0oEmC3ha3JMA@ii&bXHGRn(r{g{laKE=ed`V)mMoW2o zoS@H@Lm!em#gWvN*87|R(pHN9WoK@FT?D1Z-BtYjaQz{?@!7%1F6I8*Hz7f))o+Ta zj0G71jlMH(K|8zX@k0fCDiuWo_?@x34)?EzM@_ve_w8l<>Uuuekk-j$)d|%j;P{8* z;4wyB?WK`jo9Vlt8>kL9%aUalwjIVU5!U>`?Zw|j zQg-C4jSK*h62cj>+RxZsLeR5;JS^LagZl^+k-74adO0eg7=wT}#OMo1%tS@@*IncrIg)(PcKmx2^_PLNN&Uz`zK7aG z>&nr0E1c;(<~9;5eiDl#0>8{pNrnD+#0Cvs-;Ev*Xr<>O;ky^c9#oSltkL-kFWG<& z#$Ll9ISh7#fvk?a44(#w8aze*gff<3pjk08Zo>k*NlX{AzPjOi*;|J-4Q<)tY(+M< zGuOl{P72>yz$s2e3o3up!N~M5&<3o7C8#-E#4X%Rrl+r+X}UN7J=^SJ-sZEl|Ldob zcNV6u^wv=%ZCLRaX+rOiUq!9+wJ<$Pq_w2gEz9hFANzqpdN}$aByisE=>)ZvVNuZo zeJfr0ACXrg!$;{bs{59Jm(9`x6&X$7N{w)X1L$bVs zI@X4des@?QxNJeexLKrYYwKQZ1g`V0WtJ{bqLA0?t)1^o9=kd;VV5RRQGme_==Om8 zHo*L5;`aO68sOKZQJKukH%gs22%)267#VrUw@#_1)c;TsioXRBp`dMh`>-tz7fLG@ zS3gQ@Pi5xZ)T|vMKbC z5k&;j=`07PRKZ^S)E`b-W??2^C#Pez+EK? zu{ky$-ZI|;gB?SM{-!jts-Cb^wIQSS1Ub0(MpmHc-trW4mi0Cw6G;I#(=4>1UOw5+|W@7x)!10N*1NaM=|r?&PJ^ zm?DMyop=IM*mGUfs%z&(NcKY$^XGplR|lXWdSEyyRFQY;EzTtH?80zAIN*Vm-yR6y zgj99Z?=~l&o=jFCPhbfwAH*UQs>!9C$@%>qQYxqV)}`1_r3c&ISDC*ur{2o|Uqx%i z1TMq4nVStH62xRYwVmKinDsLXGXpaJ$cD4f<6|U@0*$RT&v!KD&T~eg*8HaclUY*- z*4e4AbR0jg*Xe^XeTi(d`ziUF-P6AxMcgV5esFFoYJS%#2U;iO`p85L5^NtYT2>4DR9 zqXv^?Wc@39R_+_iwwJiH;;Sw-*z^Ay=E_z_ws>rqUTwbck63#hIPV_bWcO2?XbyeP z2xt8STc@j48dzK8nEeVD%?JsL1qY4cHkCB{m}Gh|eTR8!F-akR7;wu0DD_n5By3r_ z0=rZekhZ5-!t{~US*r%Obq7btcstMM+&5N6lyuIKoc!uIKv=eXu13zYncRbgd)-#9 zcTIMEOso>h`9X$$zXQ{*B(vi2gQLM)UBj~6(cI*5hcg5jF5XPQu^>8xcLGN=2oSgh z0+C)Yb}H?2c>MfJPd&_<1ERHZQb0n=2D zrg-@}2NnZA;hr`1piv ze>|dB;Fm6g(~i^#v{=T!g}^TA{wSjZW0qBbJ+5EP@Guwt zQB6nbv9ag=ywl3HlRtr1YPOwNO}5yHMV*?Mn0Q*0!oAoKRj%Hj7|~b_0J}E|)#Kqt zj|otAu5UIaLjnsYSXNixO2kfgw6s3IZ?EVPkd)QhOoww|Mc_cuwzpI=P7-!RW}2C4 z+gZv)J&bFzE^k{~5zj)i#~1hWyp|kUYubzZVsHEB&v);rN0m*H3DN-$#GVn1^>^@7 zSRY`%?&23CU3ZD95iDjA$4(5^ilxq`PGA`xM>LHFgvMUHW1P{_+qKWvVBUTIebWl+ zSwY1EHe>i`K=xmpb>-)&Ahjpl8t+?R{ahTHkX)g*T7kDX_pFr~u8f!pKsX#EaIrn# zl^Ha|**-8gxN>KN7W15JgpXg7#X(*unQ-crV;)EuQ@zxcY4uMNCI6PFjS5^#)>;r**lk{a_I^s>xCa_&8r-f0ldEm`bQ5w z2AaSXygj(1IZQG!y&M%-zXI;O3Ijf^sdev(N$kivdH9@2a(vd3&CDdv$)i;US);*=QmFIH6!W=M2ie zQrm1amCV7mrRx#&Q?Mp`6_#c>@sOs&BNu|v&nVnRQ!}$=pnG;HT(2lB-xT-<3^C?@ z3!@erP+s0qUcQp;bQRFn1zYjN<%6GaIy}}?sz1OyOEj{xt`I*6|BTaGIzGKCT4pBh zdE^#ZFv=+FyRiJO+g5SC&X!b>KG|M6mgZk@^}jp8{#;wsI}E(Om>*hIZ^E<#&7?w z0To(hHLqw6kUp=++lD)w(WS`6UaQ3#vc}L;vkBODGV9AO0%jXXd(2#36uehnOup#1 z92MA8|It0gL>$8hu^V7D#A~|o5O%6h+5926k?TraASK#$BZ(66l%|rMQ0`MULR*3& zu@qzk2*EF8b&SJd5TLG7EgHPfQ*SO7AvOf}=z1g!(jZhx-BolN+N*w`T}HR>+ALj$e;>P}EdN}L zO1q`EkK>d-@@?uP zn6|R&XPxb9o6(Hxe;oDOlWw3PV*gRrmw?KvkKk_iy{zj$_7S~5g>q*uL9sA-*nb@y zWcgs=j9bLAE!4{rULVf+9vkMx#^d}IF!AXWe>F+6?|&)NfI1`_7wvPO$SI>qezs>_OzkfI z+G0wS*4nPdF)CdL&QuDrkS;8#Wovma)|4DtXlauJ4w}*yK(Hma1GiK({{%q?BUpPw z22|#&-m+Nf@!Uj$d`P??!TUG?x!)9yA0Pnk1ls?SwAACW;QAeYG{sIW$}XH{Wkiy} zqYmFVYzAjmczttF6)|Oza9OTG7JE7MSR4hF{c8^$Wc3{OrEbwLkima5LRn=W3s!&0 zJ_&hCDN zOA+E>JMe=0eQxZsJ4pla0*ygh@N|&vm7hqNd63@tjIVyt7y3`8-EI(^HMD z^xC11qMH0QU%r;vJJcJq0pZ_A!MTJSS3M4=-UOQqR4SLABw1k-U&8htFoK)=KnImp z%Nr`rl6*;dgh^I20_)YqMX7QERYwn=R9#@5i`m8@ZukG^Z2u1{xlS8L)KjS@2pzYS zVfTTN?nuEGxZ1Y^8i&0X!13YhzPYJsI!|8JjKd><1~8REK3|`W?9oJ89m$@uOSo-@ z2}z=bE3kc4nxi24NnxfS}+Z*8G;S{rs<>3+gX3r=3=Uq9NgGURO(e@+g2T zLLv>r-X?MmbE)Py%JVA4wth~<;Ut|lc|KuL1Ioj5E3Ta3HZiaFQ>+Mp%U3;b!*i&9OpQ`={36DfA%Tq-uMlTesI6vfS`03kHP<40J3s zxM&a6@AgwFVs~cznym@G8zS(cF1Ui_j1=kI_?U{&Vg7R&S$poxBlAUQE@|51vJne| zEp+=v*xfLq9J(%Uh;>!RJGlJmU|T%*oPYlE!pTq2M<~bM`;J+eB=dsza>-1h4vL4; z5lw4(pd)a4O}yn~eA`FwAdBxFzO)P5B+cI786?FS zJm3tu9M+-6qm9IKZ#ETt*SR(XWIwQup*%RF(t|B8J)s$4yC1$X%$Z9#k-*3&y`Vd+ zY5R4LiIfvIV2f-&b|biHPrzPJT??_1A(InKzRK znLbC6i#I3r3cd#izuC&CuvUQ6=IhEVA!QCoWwwk&#zqH1o0|JW*JHl#UXAitF)bg= z>yn1ARL_Z>4pHeM8`SRU$yI!D`8*kN-eEw)gx&tRy?s1)-L0VVjb(r#yPv^}Xq6|s zAI};nKeezKK9y8T)trxCHK#c~?<}d2;KJ0v0csog=m4FM^NB9L6H7gV{28W*!#}Q( zNrFZW9szGbI*cX1_tRdCQ|oH~Mwc3&ozyQrHlp@)L4`KyjluAj>OP`L5$l14LDqPs zG$1PirI*0sL2^$*h*_nWY?IS7D6@d;FLrNhgJWSVh?qHsimhyC2ut`u!(&B7BB zS1!WVaE=3&Erq692)gRR@lKKsNyNi|WKjaS((49&sx;)N0y&zQ_3NkahZDa$hu>*p zFxsH$4vU;6P72ary$&pO>v``@*r`Jmb#w1MmiVOp((x_8$zrc{^Ri3hp(o1 zI?gmz)+(-57Qg<+9-L?Izd7}R3X!cXvj&$JD9?KO9!gQvOU=3S+yz8rz@f}iFaUh; zlNd3JsPCSfqye2pqSdtj_}MfxnO^t#wTBQ{{LQXoliuiR3imUP+U4~?^z45YeJWh6 zA(uJoUVXk}m|-(Y-(r3IbglHidZU)<6j(8*)~rmgSfQz@>0%2|`1l_l&NnM~{W;%Q zG%nRU=6dobV`CK`^gi2>1U1k9L4a-w$7Evwb=)0+2X9BZLRZ5WvD7{33uj{5Ntver zA!=E_{eouC_kshB-B5q29QSn9E3yUh!6c`Ma%ccj{Xj)GU;QCghZba)7XE~GN7*=u zGcd$4=^nRUAyeU`(A5YZoCS;1#J!0{&8yHuHRc~To260 zN?gvZvmFiF{Y|LP1Wly~x&BEbr7d)THX5H24_;ddl7LhXD49>gQnmyJKZ^CEUT>n&TEQA__^ z8Y`};$7QR>?<&+<4)Ro_x_ne*cjWj?+?Jx)I{~wXsSWyrAX_fMf8f8Je*nWqq8IF=|r` zY#*sKJxGr4WLf`t9MdhXP5B4)<=eHL0@tuipOYCI|J%#O+nYYX0R8HYb;f5ap2(am zzCj;?MU)wH2dT_MGIYM(HV)!UI;>IUPBt4-E(#_8+T+PwoC{V*<2;%PBvazHXPt! zBy3=h>vYYZ!=Iq1Wu#r zj(n~O^*u(?HCx||+-;fR;3pA|`YycCKG=)3Ywo}aiagCOcT5Xz@=Jlk#G2(Dr~Drb zsc9v4%IPt<57zFfXzZR#8i$uTZs>D&ml2@tEZ&eOACE0c6k85`WKlu|2TN`4MYE|1 z(XA^%a=EnD8HyfsJ0#{*WRgBv?kE@9Gl3Gj&f^JENvJ5(OGr7q31ZKpp#6YBVTjdc z>pqE{pFEI|WQ5Suk{H(u^Wt8nnCg`?Nooho%zXUO^kY~wklIV&U7Y0ajY|$8rV%FB z-6oN6vv$Nx!_XAz+n6og`402^-Y>(yvCi)R23x-z#3LMDs`J)ufu5d~iNp~a7S^sm z7o2kHhsm}3P{jvaVgW>f^QswJ* z!xNdLS5Z>WQRl@V^Bjnt)T;#0$T0y?w0_N-j!uDt1kJt3}rcl&`jK*^qD&X1BO$5`(X`w2jv_Z zpj^B`*E_qo;B=7qp=*fXc2!Qb_`IaRywmw74nj17S6n+-TnighmLNbzJ(Y0YV2v<= zB9Xo)WxPzvubbud!$+qk%N}kiZaRk{pq`ckW_2~sPQEFeoxMiy`<#gLJm7HCTKdoG1sg-9Vvgaq7=j(NX-+X z4oZYWVYxVE8bSR521xCQ&QeGSzIuQ$k^lga9WB*Fhx%fJ>#buS%EXjDOvY269p%}$ zs0B4R;?3%PEo0!~8mPM5Ayb+fE1m9Rb!n`eQbCYEz90G#1NgP|= zoKddx`_xjBUjS+Ab$Y7HCLAjV@wbfdelW)3`khtUMkNc#^VFIWt3lhQ_Trl6Q3Fj`lUF`{(MO*c2yHlsHeo!6HNx7|RFLz0KW&DnJhcTo=a z8(m!hTyz}Xy$H|RqaQ*E2okuOE_^}0i$cYQON&)5N6#2Y6^xyK%I5)?3BYP{=W0UX zn#%7Kc!_*ZaUhDO3mVzSb|CvPlg~jkrd;(vRG%pJg`xDA|vK0NovGzj=a_ywn{hS$JNF`;4Do0~XwC-qh8L2cWGbZ+1F$1D^F#hRY}a%aNiN=b{*E2cvSjqJ z=RnvYalg*UC#QTc`Qt51Du86!uAU)&i_-ri*}i4LjYp4lqKkEtH%3D(T?)z}y9wY& zpI{_nOjMab`E(M+R*F|Y6ZKv-nw=I#VoQ>&FvR32AU`D2*tCvtE0Cm>G4p?R)eH*N zrSXK@UhC*;2&)qTFkpe&_{M1+xjUJx7YQ`&7DAs@DXbVf@c<+j{_)cTRj71%i1Q0L zmwE8!p1}+Ig*!GkD|yGh?D$)m`j_Ux7g2*Q+->NE9~H|Z>LPx5K&T9)p*W@N>(`u1 z*|MvAB|tIIEG_UCi*;n>PQwD8Jdykd9xTP&{KIT!*_+O9pRk=z6QkG_N|i* zE$%I73RANDvt6ke6P5z))Y3Toz$%8 zoUr$-$%TvS)L~9@19KDkbgOJ3H^7SX&zg3|CV-9{bm>_>y3-(a7yJ^nL72~+uF%Xw zQ^{uTC>sb^N}I9iUR~UGV?Qo9NT+DbIM?D>@hgAn#?Tl?j=#Mzz}nR-N=52ZlasW@ zq$6g?!W1AV_z_%DloRW4CD;JUM6#+$8x>QBERY*xQx)I}uNMW+HIY!Ti8s_M!`)Ue z4j{zU!8(y_EY@9Hh=W8p>co}B(Kt4ZH zqv-gQw!`1&rF&|8N2Wz`_t-@%boYU}z{^cX`}udHXFXyB7C=UUM2zo8d8 zu_GS=+II|k0j!C`V=hhrsmrx)pS^m;KSjy0GxyW(@i50`!g1$x%cI1NLVIOlO3V(g zevAWUb%9NlRbuzImu|GV?FS z%KzfeQjFjFL4a&NF6tD_&tT4mp6%}cS34b15H)OhtVmW2=L&D>Q+Wf={XPA5**XT{ zchxxL_xC%0cG}OF(Zo-pG}>7%!e2PGG;m>RS64G{89Rz%>2%TrhnRe5YkXebc$4^} z@5m^$Uquw_e*2AwTQBlcm3du5P*wK<`%NinR-_4x(ACAUrS(Yy>j`MJ4F|)#gB!F| z$pz&=2T6GBa{*emC4pkUoGepv%>`9~ZzM)z!PQ4?*4LG|Hr*>$+zYEP4)CPrCwy}y ziqVxC)dJfijOYRS{++ZaO$sEaQ9Xkemd!mHD8LR&`s9X_L?_W++-&iwFPR$JZV#r9 z|NVu4rZc{n5c;C{S^ZOGRAV9h7&}6}7~b5y2X6n?cIfQKxK85|icFzdje;2p_tOGg zND?*JSqownEyd}7e-kD(qs8*#Hf<^1<_^MM?h4=F#q&gyb)l#vvWd#e958cjeDHU@ zP&N>$FxdzVGb`jXJsiu} zdQt34BLmEpf2&v6<{uO6e<}p4lUXF{^B3ETD*8E}$5800rsBCT9H~O~fOi&PAHbaT z$NumTCS1uKZ;wF%x>xYeEdbS4Qe!#sq+3mBO~_}oBGY`VVSPF6A?g^N$^?u6qBP~j z@5+joZ{QBD8;Lx*^_2EMa_(K5CQP>eySnm%@%r+L@{6M;2AFo=7Bx$OyTf7|3IQC<;~$zdxd(ZCc`g4 zIa4H{&n*GRvGX~QhodllD=@@qgh?80@F@}MX&I0yp#eSyEqX~R>2hZM+Dv5GZ(Q^| zCaJNZwy@5Q6m$DJ*Pr{YF;3|gfRJ0&WH(;-t=0ii{g9Kyy@tJ7xI1v~1?^tjDFQqW?R31GygP5s#LvpNrLiV%v{tO|jYECLQ&7KeI0iPODV?kmkZPu8N*v}?e)b${ z6uyN0VX(x@GTN$GXU_t~-Js^r5v@%-q0X=0;s(h3!x)fkA$?@F$g;mBOkZ)lw+>I&72s~=TGNM$}u-@-?uX@tEyvkZ`JJeNz3w@ccYb5Iu7_4u0V&Z zsRS)lJi{)C?I#Kcz4CrTu^Z zv@d;v10-E*8r?5~kF>K)op$x!WjRo+uZxX-jkA^BZv9?_+(^AfW!G68`mw39Bg#;b zCL0l3Lgd0p*Eh7x+0{9Y$45y|es-pamYZn^FkdA2wa4S@7r-zPoT;B#=^&T+4{LX@ z8%1G63lGTZV;t7lEjp5OFiv7*BJ2BYD@PHxy1RdP<@a*p25e#6eke6GyS*(LM{$|pW-_7>U5AtyFBc?fq+WxnTvaA&v724h}2MDnziFf3!nRIf|B*KGM~K2)vSPp;N6Sz?G9+?TWd_V>9&FN>OVn zRBEa3iD8m8SF;^28Bloy@6CsdOVS|G=$OU8)dSBQp#{ki3}W>pm$#LMz7Sw zcJj@eI}&Y3-3jr-R@@C%xo;-x^ItUbX{;gDpQRsccrDKEv{N(W4PWHUrQ;LKzeBpEJp0}qe zBZn+6#%y;BX+Oxa&}}4!b^Fh9=&2vQBm!;|=yvDNi~~Qaq+a$HF-OVSyUUaV)wjl= zz}|8orv?Jl3d5L9Ri;VYxyn4hCAKS7WA5?PKyFJmXpMI@EnoTG=eva{=qqAG4OnjAlmVQ!=U@Zp zwKuOmcmC6+(%MSsZhzvveBs{Q>~#`{x9_r8KM(LYycN99tjm-{raHoAX8x?;H7B}1 zlm{eW_cAV4WqOANX>zl?!VNI0Ov?s+C%9tDV?w!-txPg(xt4r(-t+2+|S}}!o}!6*7+^oP_5*s>MUT;;Wkx~5zU%BwN(gh-R^+w`E{Jv zQf(S3Ei8>wt>54cod#zR*X57w1-B_qe6EtUGJNUclXj$S;+;F}NDaiQRC1HL8nj6A zlKv*HNd?%_tuq9;h_$p{!1yl^zmHE|>~wxnkG3l`1U8OCK|U*q1sa1W9ASg{Fl#*x z6%qwXxmD2rC{+gt7A89~k6GGrYofJ^o z<_dG>W&x&xFW-9QmHy~m2r=7M`^Ga*)tccC?uyr+V_GP<0`W?=NJ(j|H)J#K@2r(x z;KW)ql%>^k>#Tw%BY4cNJbOKXAUL8#flln4wokM_Y3NH+zGhzT z8gQPhra*%NB`7OEm>sCzwgUOF_rarx8b_y&?(O`l8}EblKWy~lF9$2bZw$1iKs~h{knPgw!p*vH5+xHUwjV;f?n1DC+YV>nMsL5-Ubj# zc+3(-SveSoK?DK-HPw>J#!`oq7aGY?BQvhW@7??Lpif2EZe!ax4K*^hwxAC5bMgoO z5d?x-jQ(e<_N!*`)uKsjG-kyDOyrqN19IK&Chv-AR$US#^phQ!Tu7+6D>@_!>cE;^ zk?SNM;@>=w)0OjeTeQc^Y-Lr=LQN6e?id;r>1PvP1Lk#;5OP>Q8GAi)CD(6WC+kD6 zamjSASVuRI>x+-aC%iyM*hYKLU}&7*-p0F%uF1KFecg8k!?JUyx#tEuEzyVae-CmW zrJwe7z%7a4JIewT1r=KN0%h3UdAq@;>g4Nx6TYb8Ah)mGN~Q*908{lQ#XX>%xFINM zg!$dAz0cLp+JJp>yHlcJ{fJFNZ1P4`Z`w zv9-W_@$#~9W$#yu2R_Wib!jY*L*`X1b3YkKjM3|(fT}8c#SXWUEWji4_^t5&CgHQEp0^HX6=hDL&Iwp7wms4?nlYZb&CP!c|;+2b8WphQ8puRFpSASB1O38D!b|~qLJxg_AK2>Zh?cus-m+1x zgc%Ymw1QrBf(pohL6kdb);S(Qcv^#~#Jki=j$o{U%VB-ZOqq*kXC&4I+=PzcMzyCiN6$~4x`Ufv{5{1Yqiv*-?~zON#Q%$2;ByQ;ns33gPDl)O!yvNTs& zpBvJFVLP^!ndPXd6SRRMSz~$dn>x3nH_O2r6Qwx1NQw;noRuSz3e}DIGadCasJgF1 z*$1BC?vA&{rsKKDy*r! z_Ni|7^yz0k)7{#0O**ecWxt1IdnMyy#2{YXpnJJ}MTucgj{T^H^GF;R)gO3GB&==q zt}&`>k_E#RkxG(raYpwJhqHz68nBRO6#4qf8KTAIbqB;|Z9 zdxP5>e%PTsmG-7R@*gF>cgrr3$I1;le$2v^WS;~biDLJ0QMwAkn`J;j;QxKjzaXuf zagQ{*@!cGkU39XGY(B^KCGuZx0J_#6r{mp)%lX5@Lm;b{xuM($R?V41gxTGh)2GFL zWgsX?`weDt`#sBf`jZ>oGK!BNRsr@RbGsV1?@$5_!y z66QIU|4sqT2~=)y1MVgdJ4!2BL1)}u?jd=cYDdXCpN?Acwm3hm+>FHH11WjH8V~04 ztD*&b?zhCbS}Q!^dGxRnLjo^(ltgv}NbAKn4f7*J@cpmgL3$S{Yu@GH7vA}Bigg;h zLgaGJbLD*r`TX3Yjz^3AZ;fEOKs-hFS@^Y#EqsS$wb-0ljeAU5hlKZiO<(-!HzJ#$6FHRM{7(P3*`U}BEg!FzK zd#qWr<*?0T<3pLd)f>WJvoinN$dPSiHTBLV>%;s`8X&swPGHkD+ggGyVsStZcEv;{qD#FG<_n1?wJ4VMN z)hc94(lR8|LeB0X#2D`Y^;nr83IxC#!K8oi&vToj52`^-pbT08@rex26 z!l~HpZ42IdZIDdRDYZiy4jJqM7*app2ByW%q*pT7D`CoDQLqvvk*-u8@)2~`KDmx9 z5V`Zb7PZlYHXoC&Qaz^PqSF^C3UkL(J(JpZrq&{vy`wZ8tEU}d2L2#XOHx2}$S^%2 zsn9HGZfqBza4?g<neJqX~Uk&dzUZ!$asqd^xPFc-%HC0FYs{x3t4^f z_70uTTccK&KA!r%0wmS5?shoj1Oh?R;7&dBPOVZMIE#z-@k_SllUxY=)0&yzLZx$2 zOo}7!{)R6${YHVu{3E&;dw<}26i*onXE&4Bx;*>*hBn!f-j6Q2Nk`|k>tU79T*4+|h?482VZ(WLJm zc=ZuFEz{p}I|BOZ`<`6pC+s6A|CI!fxkf6FDPE#dFE;w8KwH$P{=>2HW}m%<_C(@_ zpWrwvGWVnC22((%uH5Y`nNjVl`P75yB_nNOq|F`b8^D zmC6C4bj&2TGnCy-gtna*O5}IMhlz*af-8$L@g6P~x2@_M+UA9@_a)K+Q(#T=A+W+(z73Cyxys(PmvnCL%eAQPd%aKW zkSC&4ww62lvI0ELu+v<)H}&)MIo0dvkQk6%%dX&v3I%c{4&N{b>E|VV`wN{==I6{$ z*UE5g*YGe3(tj}5j)nkRJpQ6Q6u4!4JoHFF!KL9p&)=nTS>~4nZYq7nb7B@I6jRxG z_)9ADid@cM^~PqKGwzs7>9mI>C(Ay9YxMjyej)e&lcrywLe#r`#~?5Sq=&~OaSxaW z{s5qc+F5f9Bmc$3M!x0+atw1&EddM{0R5*@+SL#x=u{rjAob+CviHjK&~Dxzg>wy% zBZi?^)yTrDiWFVH_F;;mv#xbr|27&e&s-hHyXk&0d?xlG3Gxi~DK!%MP^QHD@d2Gf zrr<+npwIj+y{J%i$DNKi>)YFeXueO$;8a`sp-2q*q<9pNm&vZ{LOaz+7+3N-igyU4 zIz+9_aE?NED6Z4m)|vHw73UD35jCMWGtHo-7cCpIwJ$|L!GYJyz@KCWDO@ ze)|n&KJLAn_1ve^r(KJTvo4XhEcMOr2M*ILQ1B{nt7Hvu2+#ut>Mpcls1( zo?nqgBHL*Ct){Ta&{V)G=B$?BjtlObx;4y;S%T8lmSS)G>9h;ra9a3*#$P)NdjiT26!Ajv?col+*$a!kbUEF<6F?hh^V7zq_ zgqAOHOvF|PNjX$sP1&&~_sINDHmfY%2=T6N*ra4)2S_Mf&p!O?^bZZnUbxt;zwBE( zz#dn4m`ngD*lJG?xw0oW!|0XnIr#9L8ZPh`ja>jJkhk}d%6N>*jTjX_J5E31vZ+(* zOW;{kUQzLD^ZQjx8}-{It{*aCDbJEd=f3K7HJrXy(=l8ZjU5GTKh~z9#p`BtewOGa zS9X4u7DHhwqigQz`kp0~1g#%&SbTfTdHOf$-qCioHGO}HBP$R96c8K1l;PMTt)es4 zKaj_fCf1=giieG96~?;#BZDcV771T4mO1Z%=-m;7Z7$4?()o0)iV_jX$e2cN`e;Oe zvY_;cLe_phqUDC#@OL?qu4dO5id%3ppYs!_K{{nC2Q9afL`{n_+Ftm(*7Ou$Mzu*~ z5TO(=lCx-wmqWG+Qq;hO+C<-zyNOk zb6B-UDBQOX^`z_SHSnWb?oF75A2O8riH0cpev0;^Zrq0-ChEw7j&?c90#|5dY3*dC}E z;&rmDPQe=6qwQ!miS6h0UXKnvf()W|=j|g3dbqrgH;HKJT`F*fgVVRe$+>4+f+Sob~;^@tMS=7}I^U%6j_sV>6nZLC;fM0jAiqxsreI*>1l2nh4ud=m$UXEqBH1VYwjQ zxGy!he0F;Kyqsq$cXmnqgZLs(^{K+3$^Ef8PBq?&*+WtXEkQ!Jo?nf0zx%RYMf1No z`Fd0Qj)DswGhI66heVcNZf|XEdGKpI|9!w1eB7BR1vm*#H8ZQ&H6tLezu@J$I4Ks{ zC_93BFb~yF-f$d0@U*SQp00jl4!Za$Z)w#U z3Q^c#0u_Lb`l|s{`>94gXF>KST_)PnD6G)6kXZFduNE(H(DyJ6?{X_4=WB&GM_d;j zjqU4Z3Xv@46Uy5yZ&*W9NnYtySpp|57%awAt4~{|mr!b3vlBmR>i{bEp{QP-?~o9o zWH*=$z`OD)`KXG<^4U)CI@8;h$K-=U={rj`X}i3a7F|iPbVJ-Kih~OmwvLV=Rg|B) z%V$RrcvNJ3Nq~QD>j8w+Al>e&LX*YMJ}C5*#jgUN{_lu=-2UNSXEPc)6O6SVS+u6D z7D%>1<$63ARPdOrFN|oimJ+(=>Qw)hz#_Eb{gyiE8qAPp(2?5F;kDV@!hYfX@zw2n zV!-x30ct_I5!NoNTeQ2*0wj@~dWm*n<&6&jHMbTe-UTufB}LXzK(FXBr^@{_aRbA` z5iQ}-&6{>xS7l7Wwr@&?K)%_qs$R#|9`u+1mVU6Tn8qbbTWn2UqnR-2H=jr1Z_oSM zT8VAq0Q1e}>z|ZaMY5+cwsR%pUYmi6c_Ev7kZIn54&I15yUd0MiaQ38T>$J6QD;A* zIL~M=qk=x^9l`6cD5aMh(E$E?AF>`k1{Dx0H4(Rwx|`BzFH2TQXkr8t3RgB}+3R13 z?suNIG5sTgSOR+gmk6qn7|N$kE(Jd)+DXa$-;yJbFF;1`UFr>VGa(mfe$@=wU;TyK zBQ#$g{EJd;?)PBvgE>;^_W{Ck6ndz+%=;2015GgZEXPmhayNO$$ocdkzwr7DGN53& zZo+M4o~2_{zRGB?>oVJ4Ay561{Qb>-&QcSO-%k2S9SN#M0=>cC$c&9`8#C-Q zq-9EsK4eDHfy>``3ZyQ|iIZP}_4Z%|XdjW8k{&*=t8uBEA2%)I-bQmF?4NSP`9MUT zFvId#l`Qh?6tV?zKB5!vTr5aU2yH7;*XxaGsL7~cB^G<5hrC8a(Bve;AkWSd#9}sS zL*S|ET)RSvqVHC;6nZQ43DE=W>l$Bw=(auC=2RS%T=*=>uTTgQ^iz{4Q;$kLRa1z6)+kR zkhuZ^xW+oK4LPVeEtR)nf7-t7r(2xaJK=qSY#aRQ=LcAmCb8VVJcsdohFh){iS zl>iR8_igGe1v-c>2F>_jYI2$Fzxex%6GMCA7IO{&jHOK0jC4 zJGEbEk4fVs?W#E7@LA;}>FCR8vEPZqZ?$m~uA-YUh-Q8d776alHjb3j+|`_>VSpLx z0*)JS8@Vfpz9z{Y>a`K|+i>#lY&y2QuvR@?o}!Ej^4<+E)%V`bn&`Z>E72#=yf*92Jcfz>xtqjIEF z>!-jN2CI*}f1tPA8fw((ymEQ5Q3p!n|u!FM1kt2Ylg;5#$pC6BxbI>m$xR*r3GvWO|N`T zR5D6H&M;Bh_-lH?R9ZD8wsJm0r&Dyny|&|AkXeRMia?|rxQq;%9jj70=p{(|vW|kq z99BQ#T=3XU@(urs1Sopztpmq1{5w4u9m&=9cX*D2VK$4^~X@_p#F-S&l+ z%R}3SLP-PjqEASI0X%F^;kZy0N7!Q)+V{E!B=~^&5#)ljt$imNWK}*?{-Q5oqR^h@K`bt&lJKkBY7SSE zdLV&_edlk+(qk{SMhm(*NDuL7{qH;92#m z2_TW`;LR12V z&!~gkz?C%KDEkam1yi8K{dFl2 zXg~$cDqpK0z~L@6=N$d(FLObv)>JrWS$Uy_gC;u_*{h=OrWNMUy68dgoO~PGD${Ln zabawj<7La=1LQ&;1FHS5_bITEZ7OLQzrV6KRn?Tx+1W5B+pntNLH9f1Ex#*ndVlFC zrhKXp;X9UU)CwMqu6|GWyL`^0+0~p|EfHZvV{BaLGT0FzW#Lydv$($An~w6kqdXn7 z8QvpyDylK>)$-NA{m!4}%6@qkhfZT-cPHaRcatH$YjTYw25*x7uc;3GVLZN#)~*>= z$Ugj^4`kr}>Nng!gyR69%g%p(8*^fBCP-ncmLfKrWk?xZbajnNn?kjc$F|QzEr;x?!FG@EB{0C;8wL3=H4;xAp@bVZCjVO(+K*f zKATZfuxm^;GZNG6r!tB;$2UNJ&W)9WK)yZp zwsa70!67kp6lt-tH`;)RS!aBq**DflA*#AMs7~RZs3RRYwoEs#bXx#>Ej5`2yoP%5d#a1_k%)#vMf~kF<$Q;JsqBmh@x{8Nn zqP#TbdqA`h&etrBIOBfdtdOnwVAMU{26xL1--&Zssc8{`{LQ17i*kS0kHrFVHVZRpwI*;{M1_C+RsIj@T{Q z6TZ`DU%@w)0Em7Q_?XUfhkt!9rHQabuM9W43X6-!PDn}w!eU!x*`Y6|(SGA{^K2>< zV42RNo3MmmTbLiHj!IP#zKQ+9=MD936~v zN-70X}M*Z0+RY_5%;za#RHRy=?+U_Iv{ zzC1THO^}Q%EubMr z!&D;eVYLK4qhw}*PXGU++*9R6^VjspScnsUhk>`*(h5%V^5mS7G58mdt^?j?f45Ca z9%mJaDL>gsBAq(-_p2ZvP*V2<6U?dX*#HWPdtpmyoSJj1KWZ#ypmEARBqnXl{5`_L z(#B?Gf1hdUN&4q{H$W^CqA$2-^h)BJ!K$*Oae@%mkcE0bE?JnZtHWV6rEzB_K~Fj| zx3^GUzuA`5nF4Lm>saDh& z8=r+eW5|2&(}ym=VDoRnCbU&}L1yYK$s;l4y#aXs0=>pz1n72PfdWZUATQ#0&i#AX z3PG!<(vs?_mGaJ_-=c8c&6B^rkDcgHFJjvK&=xGZR`K?)?U0tiBPX<`p6xd4k9nXN zx@0fs_SehH$m}kJU4#1%X7Q7(TVayvqRu8~?4Zx$4`tZBj9ix4UZ+%=>PoOv53_Nm z#q!k1>6i)kduP{6mdQT>X`B0%+fo&Rk@{3pkx^L3sM2qAzP;2O)S)cJ`tgD3KA>5( zsaKpb@k8Ximv->k7Is8D`V1~w210f;fnTxBO&>qQI?u9Y@2~-gcgtsBnL)xk(U$w3 z5{{kQ-RBlV-2rx){(lV`t6Ubo_D2b}4o9WR(i2{XYyu&Uz|9lcf)%{{JlTgtwD z3BRU2KFTVhgXW?KdKT)nses1J>i&SX3=iD!FrV~#Y@m*zdivcaR=LdolmLGE{KfAZ zvR)jG-w8}l$A$d<{q0SAv)^Us!avUF&ci&7#=4o^>NW4X0eOK=?n;%J+?(AfHb97{ z4_>!yl-iR_F!Ov3-VsYuq`)lwhDT)agf{^-zhi`jA{U_AD=J+&&#ta1+7+lX3KMpq z`lkEw)=iw@kaz0Gutt}Ax{ttOP%>@H(kT=Ch|b@a)snNIN}1Ehwvbt92q}N*E@y1ZeJK zrb%oVF@I6M!vv%aUDw>pFlUaJj9d9WaIUDvdB}6MghdpETHu?A4?TE}J{AZ$@x8|Q zPTJc0#nbz5l{tqF!g%eIKQ9#qbDioCPOYc}l7S+)8{}*UWE)r>b|>;QEYE>Xv|76E zhfrOPR1QkXYanV$-@1>7T;^a1Figopc_N2Ey3V3m>p~cws?fR0qSLDx^-J6XrI574^Q-98p=qZD~2zIWwaSTqfKos2ALaxifGL=Y*(Rrc3u-1h;%jH z#HQY%A$pS%R^adf@3{r|uRkQa>JWyk^(`LKz6Su(9Waj_wJI~=y8#fhaH{XkNgBR9 zF$sa2TpGXeVj3IW=ge)4Z-lk1S2J+pC@(Mc!LaI{8gL08zxmK0^4Ia%hRT1hx*`Jl zjp)bMLyiYK#FBK)zh~dy|Fc#vJv2hj{@lUkX*LsX+mseRakTEF>=v2G8w*-N3129}#T*E)S6Yh$ zWE)=cy`hN36LHX_OCJOxq?NYXUrl0W0&@wynf+D8d!~`lW;_eC*vZAfuw135vNXIw z1pa9~H|~v&^L^Rz!(qMpQa(}QdSa<`4tshPp97<6YqsCsw4X!h1!h_vcjt*xfi8z> zh`~cYOVUqBG9lGZdnKK7pTo=Nz#Po%nkH<2_U+0uzlW%|X=o@NyD>Mecvzcm&*t7Y zanFAEj0ba<w&C!(Sszhgotdvme*1tYr)us)G?5hd zb~?sk@G!E7I@p-PXSb-G^4pKx1|9#opO={`Y&E36we|!*?M_$!(;pU~fW{$4;rpP1 zS^mmJJW+!J5woRCValiD{`y_0(EuE1@r#G*8?r><#!!ghx2hj{6MU%L zSI$|RUyVU^%+l2IaoMr4u^W3WJ{x1zIqGb3W?<)s$bO6eq}KnM*W!_HFo=>Omw5|9 z>BZSe%|-}t_jR|QZ|)NKt*vYb<{p?C??#rInNmvU8VPvbMjKx`C3}~}#vJ{fr^5$4 z0ePn_ghISq40ICAzva#gESuoP{Y05c`O-DFd*ziA4a%N~mrjZ6KGhYorMNaaQmm78 zFDF;J%5>1cq%lm@JnXGku!s?dzj%{EW}N=kT=lHVtZfwpED{|C^rAYBJ#8H|t$=QE zIa?Hbp&z-%U2379Kr< zrotqU5Gs9;;A+Yy&*>U*d_*~E$5ezl53c=CY8IT~w&lCCsp|1!rT`JKA+PepLuqJy zD%OE_l3U?JFae+{kE)t8Jh?3VyH%IzT{7z4s2^`T-AM`*jPzP}6f;PTD^4*TWR_S5 zKB#mDX3_6bbeW=c7kRM)9QEZR>y2cl$zf$5K()5WLgQGBv9oy;#-Z{7NO&YC%$T~L zZjot_l|#}reWbMTG0klnM+B@~K$O)w)upo(gzWs>ITvo4tx9V8-X)Y!-djGe^@FTt zhUegfCp65^Zufa<6?l|EYaYIE{c?6`M{IBD(eEaKDfJLmB~|F2!O5f09gb~v6Y0>1 zpU2Z^rN)e?A{Ss307|#j1}Dq|7gh3cfFBd~PV`L2^SJpNn6QH;hW&irdK7SuR0pXI z8s9rPj^p;kNZcPs?NDj}w_SfV9ndMBXtju$>9OwF=&U*z7~*gG$+!EE(mRv$Zc0JF z{9thkZkR3Gf_)=#zVUq6Nyki`{Ac{@|L))T;Wh%~TrhZjfRAgdBOou&fM{|1AK<{X z2mIdrp5NwwvaH=Ntg5QYT;6?U9jFTw2esMr%@1sVJkuNi(a$XH#06-cYkVMEiNe8u za``nayEhjyn9}+6O>#TUHcpkVV9d)Z35XE|RT(j=QGrgjXY4?MT!!(-nM4Sr3*^b< zP61~k6C4bMpHpOTpXUZnp6%?lW9*>uy^ilI2`<}ccZyqX67Gi=1~oZ)Oe_xMg8!Cf ziSNj}W`cDv(mgWC3>F(2kmyv?Z3XP57uxELye(G)%wxuWL znM!0ZaH-b6D1Tu=9Z5j}igq%}YpR%{)J0{WuC)o<_#4dwoUF~N7Dyy)y^e%1qxnDY>zjp225hr0>p;N
  • doI9nH)2{E$lX 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

    `WO}54G&kA{Z9~mmmHpJgD#%FnhoW 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%0Al*z$HGeN3@9j{~ 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ཕ_@~aPfG-eGhfS?WSR4jI z9>-H6c9?tt_|B1wjsE%2s!NNtp(DfJId)nw#Hd|mcPQIep0Ct)7-ePDV6CAM7tTNm znNXd1@g0rv)@uKr{Nn!cC}hk$PQgA*^F!h`3HzZ$XlotJ<e;6g~v3BR;V7a~ghl()H*T{^bs_PsP%wch9@zAt6<-&*bR=uO*pEuMOeCyp>Dd&!Y6wez_xoT$csUCaIG zu^sYz!>m>G?!$4@-T0h4pkU?yOI18t9K``m92`$4k#P+W2L{3`_qK;)jb5r|Vor}) z8)k;Q>5DLFb4$D_PFaZ{^Wd;ELaFlPZTL7*I7?7nFKoLtTi~5-e54=sc4id~cl_cd zcosj4uE$Ph4>EuX7X#e>=cSndeiKCT26A`02C4vHk>log;XRB>5mp4ARvnpRpSeYG z*)n}b9fd4SL94(yARtm_g}*+l<>_&Z=4ERMWG(u={szVUH6>sb<7xX%gi=5>;8L;^ zd;a*wkqrW_Kn2|JS-3r^ki5e0xFJUn3%9rDA0Pew`*b@jz8-jeba&MKwD4@$>3?SV z!-HH4S-;Y#Pg)+EL=q`a-4i8>#(bZU^#XSsi>jak=HcZ0kZbb75X978uGfrRL)NqnF?4t(|bYW%m zt~je$SlAV1#n>vw)Si&cE&!GM4Kj%$P6ZogY!EBUNobRY5@ag%iDVJ#b1%6{2+l84 z1~K3USGyZ$UbBCPmCts_K&bYT%~O-fu53gjy{F^j?#P=GaLmaplW3jQKhu1aWk8hff_vDf# zYNP^P1o-X6uur6^1_4s65s6n`_lRlpw1t+n4f$Vl0q1RSN`gqiQhL zmREeVGx$Q1umpA=!8?&205n9M?Z8kpW%Pf9d=E@rvgIsDF+NVhgr^q<>YmM>8k41QD*Umfv?~!G1UVTOeFw5hYVT7 zTamHl{~G*7l{ZP*r>3fYg73d(~?_M;09)suvS+7>Zp_!|i?Lm+3XKmhJDdrc>kL))K_SrGHqEu1&bD42V$_4wl{m zyJt^0JAOb~qQ)*A7Pf4a9@O)GmQT|vXn)<4K~hUtHszl&VF|WSZUYA@4i@PM$+U(- zhwEy*HUd9-m!%e~{e%_D)=xx9j z=i00qtRLog=IsG^V~A0d;w_?CU*FBH`@7v=+~tl4F045`Kkeu4J+}l^-s$mg*_GOB zyZm3H-4pz35W$h}X^)s#S|k=Vs0vq0 zS2{$HsIkhDjJ2c;M1GK18Q@e-Pac5HD^4vc4mqQa(bQ|3XN&y->Q_Y&zkeS9I^~YR zmU@TzMHZU-jR15F)!-}4FOt>KH%VB-d?94oNc{jdf)bEvX=P$Ug~IZ1QXCZV->*}- zy+GgZKlhd9bS zoUow$v(xo}Y!P%0O3useRt+Cn<2PIhQ$tc@KvDbMeDqo_yphye+d!|qwU$2I6K)N! zm~so3VnP(u0}~PDz{#J|9QfgwNCECCVm&V_N*7q#MT}Bf9jfVjq@MzNHlSZ&s&W9e zU#?UjUDp&T=P8Y^#%n!Dc<$c6`r5E%5HIFQ{nNF94YQbTO)&7!0nWJ36U0Pm3V9W zO}{4mT4O%1FyWZu6m7PRu0DLnm_iJz-~Gj3pG8wA7v4{AL>8K}rJ^6@5no2U=R@yJ z5ULZDM4B~pdib1`5gWAkv4j&N(Gc`6aeE&35B{#8$F&Z2%zS<#-1W7()(X*!fS0dB z*eXSN;OYDt?Z>OE1|B8Kf$pX>K4KY`rBYF|wdB8j=Rf!SluKkJS@C}re)SYG+T3{H zKBfvuV*HBZfrriQAbQG{|0cYIvHDdJoJVU+z6*aW+1K`EQ|4QSU|@Y_t%-a=#&OeU z>8h}x+w+4DMFxKleCpXW-;XR>BZz!oxl;rv1yhp67tPh! z@F6yoGq%;MzFb2pj5uO~{*lCJ=0Bg#-8AXCr4l4IqTwUSBCQ2nX!s=U3Ms+`;BO53 z><^F)e0*xifvfu7QrE$leowfVy5uX}gAfyZH?w=>P-KajGYa?J4VzGZeari8wqJoh zc4y-OqRCfoOP`NS%b)M(3D3{{bEpbS{N_^HiiZD_UiaU~-;`4eod!EU7 zvtQ15^Ds8_vYbb-qbf6}Z=XXtJP&vQEru~g_kq)cQX*XB;StDg5}*RLgbi^WMD^bk z6=W;4(O;^-B4pG|4522Q7k(tepNVo?G7CTXe{>GrIz4oRJ%G0g`VLk{=r)ybwJ#>RMW#t;%Y~jm^|GOR4h$nJsQK1z;(C$5*r0fTI{yoypj16Pjy2I8ClL*XYxb&$NPpQ( zAreRf5GMyij}g!ix%PlVNUdbFW+=zf^SL8hLw2ejMu&;W6E$1f?!ByUh( zP#;+?E*z$ z?eKLSH%TT>&WASAk7~AX8LO16!$Sr*Uq@z5NbnSg#|1OU6NxYU@W5_}4A&VyG=&MF zHkqGJplc42vL(?ovlhvrZpL2Sq=4cqu+xz2DgIcWp3*S!!Uuq9xMBw-<11Fc>b6iL z9VuoV2QXFmFZpUw?!vaJiG1FiVKvtJ*bc$d^vG+8tq2vggR*K#-}jA87CmD-2=mkS<;07t z5$SHN@IZu(7=vvGBj$iQS5`d&9lTT3JBCdr0N3s?txOHi_IS$lH~?d1XdP-H8x844 zoyeoZudQ7A?WeY^=*@)%I;sFqeRKbw=_A@Go7flkZi^zYwcm{4-RXyLN#}{hC2@!GzvrUAV}*Rez}wPD zfa8w4bA?3gFs^Uh?h$9@$f~(6cN#U8h@Z1qRA@qT|TpGt7w34D~{r))PpN(VDE;CIYo!%XoIHexT^a|Xu^ zP-ZbY%RZDxpq9!pmYmdMS^P11izp5PApMusrSj-#wLHp1t(Tg7`Fbd`pJPH;3YCEW z9YhX!9{cUvhKACLfqEBi7n6Fg@FV5;rKPW2U5_t+9Y<|+P~FR<*kIOR%*yCPoc_$! zbe}a^H?T3YgEhU)({5+u?sCM=;Ho_2SBL(ibEDfyPE@j`ApCz#gCUp!tWr&t2a}>Z zFd_cNIJ!7Sw8?pb zYWalb4vQD*QexWs(IUOv@zqF&5@;io2E4U_m0vE$D51KFeOH3SHH>RW!Rv_vV+d`*{8FS) z4%7O^9Ur)jZklcwl=+dst#`3Ub0c?9I_^goD&5;w6oE1v4BI3!t`~H(=tp=ffA|fh z=Q^!ils&c%VeYDBUFTm9mQ_XX-c$*fJ9Qe_6eH>4`eMPgvIwX&nas;sM`8+Vr2v-p z`$E9;q`EzQxP4rGhDp~N5Um09s1d+!t!1|&0*$_#9B7sgpj4UkhD^$zX`ukWrhRvM(!*!Rk&8Z-aoi+2?jB4@Yhcm11fUV_>gAt@w^XZbUY~*)lc^3{ zA%h75bIK8i<%qE{#EKx$i+3g?j)xieLse=uaF^AvJ=5G%y%VprZCoW^kSew3T(E1q z_4@l0_OP`ESkgjo-br$1)W`3WnZ`@uuOGsVA$fa+Svn|J~Y;>iJlQH*5W z3U0zbQa=)76ve;Ux_$pA=;lVX9%%Q{AkFPlHF+ON{`5Y~Jc>vj?&hCU5cK&!QmJHA z2Vp)2AiY7FP6!B!AT~9^9rGN1oh>~l)ogNCAqcH6LZ zhe^=|nuf#lX1+T2@fBPzO?|)MoVNPV5c&CWunK@QD%@k@{sk!Gdv+F!E^yGSa=nvg%7-CRPrg4k?sH(gS z=QoX7B&%LwH$|J0AW=CjGv)U%v5m~JSIiM=40ekf=8Zp?*EPScoJ9D`dGe~}_ za(7c9;ur()9Sp!f{(8RLgrsU6mK|L>6~K%tJZ+e0W?$ma2`r7*^&P0`3O7UEuewiC zkp8#U{dZGlL>_weg84vs4ZCpbolWN&-vKC%EuTl9pg&^5=@ZXrBGYci9+?RZFD7#U z1Af#z8}c-$Vy44>$(^3d2i1|4e7j4|A_MxOJr%k6ze#_cpX7@^pr%$sRPj@EVWgnX zTk=LaNB6UmC1$AKG%@iu254jY#+`}Q{Com}cUD(X1dr<_bC1r~-CR~CmYJy*vs)c| z$)8>Rw>Ca>@W0fC9EH-J9st1IYib1Jig8Tz=Aiz5mBBg#)3KvLtHG7>W_&n){oh`P zdxJNdNOIel{@Nz~?ShpS<{xJtK^awboXbNcFVD z9{6x3(Rc;Q7U<3*o3Qw_IhBeO82k*d5dZk6UmbQt>FY$rw-m;U1wg{pXBV&D#AFW8 z-n4Y*Wv=rs$leEdYoWU$(al=#F8s+j#5{z8KrzSzt6Cc|XfJdYZ2B9U!y9xaUKOwS zt_kJR0>s~(DGz1%G#0vT@g*Rx8;|w%M=?0-;t1yU1BDe!_dCSzVUYw5|6j&AS*_^f zACS%BlYEt?Q8nPGv_yqq1Sae~WI&rnTCVAWti0O+OY1=<)Xy6V2M@V7Yc-@1?*cu=sJO8SDV7w_U3<#ktodJ!&Q|W ztog@e^LwN6>!^!ZRryOvJlZx4^giFBzMH>Z`Z3Tu%+vugObqfvu5oD3ug$*n_=v?6 zpl@bwgw~w!g*@=Zg0&R`ZrnaA7Gg~2Ej}oUHU!nlrcZTN!_T9nc@0vgV;^k;u_QPo zAW}X_DWI|!Jb9&C`nT#jae0%utj7OL>tFWG9A@BFZMGHVEOUxa!Tq`=Ffq46hC`=;xj zRAe0^Auc8ot!lV_RGxb>O#3M*%_Fm(jrsjbL19J0A}W)%O=B^8?-Fy;F+0A!{0m;A zvsa2Ma)zqlJE!i=Lz+^+zAlbLlgbmsmPC5Gfi`@UHcZ%q{eARf&kt}PB3?sq7(mg0 zrj9j(*PJWk90_Mlxt?rGH13IWutTwM=z9Oy4~}Kqhf=^a3X{l@4f)ZLz^B%tdk1}6z$@8Xr_h0Awn2W?(9r1xfS~819gQf%^P2652hNdD zli0E=Xc!(5}9dW-xh8tV0qyOR{d1rZd^Z;MiCq0O4YDoPF`HM7_yc zGIL&HUF5mXI-@ks{?bFBU$Ku%JFhn#NlX*eXVvhCb7P+5mvLgM%`#`5MTR2X047vF9d~pW9#iIh3W?49EhtoD(UXJZ>@tBHhQM)T!|KtO z(j#At`%{pHd>KEG+G9`MtwKuX0~py?jP~ z%-+bUUy1=UF$&(i$?#eKK{U)gXn2Ue!#A!UKZt#h-e`}?%51Jaj)x%b(HNwPQF&Qk zB~4vx5e+M(hJ?N2cDGTIW`H!7!JV;rpkw@46mL zCO4NyQ|Y;kT*~pfVI;LmAEfcb+J#=AYQx?6pkb;0z7fzEm!kc6@tRR{Zrjh_mnSz9 zRlzYKi!FW6R*VlRWO;qAHbnnNt-H5gL5}=yw#GAXJ7WmbH-4k3&no!O;qAfa+;8!wi5BXM`Cd^=VJ{Q5+dzj5A>8-~xYF3yTEaIo%){4)SE@1R z?mbutUT!s;t8Ii99!w+GMoWtnT!lb2XAsyx;3#<8BKM-who|AeDW&yJ#BIK*RlRsh z+t62QWkkPCUGwh`_6Ed5#lm>q$3wsTP}^o2fa{sROpog0ha*sRSz zNMg_-wV^^}iE$IKDQIh0X~+GT0T{7Aeo_7hF>VFi6VX}^?TALB)CaLx!DfXH*1|K5 zunC3IW{jJi%;d-Ho;VuOmrAbxEVpGh3ASwKtPQ!>%bB}M2p$EitfQ45qNx3%vz4;3 z9PZT#k8{#B{r0A+hReD8{YdTy!|#-VXPpH7>OIpOYYp4{%=SYA@4?Ok=v&s}f>E$F zTJU#~u0iX)36EB>-lbdMc*fV$O#nF@Gd$B6oq*VJdiiHeOZM7_Dn!%mPMpldh&6u2bnvg=?RpHyqdrc@fIn2xkT`Dq z%qR`|IM1**#rS1BG}AgbZxd!TlP|HZ zc)isn8*%~6DkGUs7+gSlhk|ra6{U43#bx7}qxnx7ghP!J8t$IFr}4@)xZ2ZuC;Tx$ z@YwuuZ~W=-tGd%kY_YY~+yCD+rPT$n`d`xYJ#EfGlF_ePz>WOOPbhJA!mhd z63>|{$tRDk3_dEUB7i}pO=w`Z4!8r~UA~k>W|ha){PW9VSW9@aM0;dzF1xN5gqw)b zZs%tIfbr&E4rBB426Oh&OFmu)`XYNwWtsyDtd6V2hK4>(Ut#%!le)enfpLW!nwo9W z!Xhh2_pig^9VaYQmk8-tD=s!=r9#&hJ2KdG{hS3|*f2T~w+EQrt4%_-7*t`a#)yA2 zAS|-$*W<^9br=3|j;xNBnkkF?m30+X0)0fMBC2*0Q!SJ18hVw+GfQcX1#Kzad-j9= z|LC+)llSOBZof?vOI$XB!Z+Aus$V3lJ<=#FHdfZmrEV}V2RKPzcnC+2EgsZnewhtP zK>AX#tG9XT-u>}Z2F}P7xuBC!gN1OKNlw}1xWvHSmz0mSiaxS;#yIVvDmi|G%#v`%ay}l_6uNf85=Q4mNAX5|#2Wl>m zM*55bD&+id6R21%1Ch!fr%e`(D>A1$o-L(Tff7NF*R;Z*u;UV6^*dTFAD6Wu<)n2v zEx}i5YsuwP-Mz0I&@9w^i(+%0$&ZWEJd{pQv@(Zuu(!nj<|hw4<94fKgxz&;gl%l zTwA)|S<1Ve7I+6!OUn6wA{L)fR{*X51#7!fSfRO4w+=&ZU)2p~W|}rPiHTsE|us z*ge9XW$!^l{X{%mAd5=5#v0JzN9R1;4Mk_8!il6Ug0Kw#0cYbftjnflKO z&(dkQ&2KAoI6OilKoPGfAV2!hu(y*vghFEe97D#pz+PK00YnBSL#Sn_Wf-?ZsQgj9;-zs~#e?*28lU&rHA;Y@EYE3ca#REY|Y|wwF)4zXF zg)?Yexz0Z3YBpJPK0mImn})dk(@YIIC+GcQXI1)t?K{ts0U^uQs&9+;tWJ#I9Ct=% z(Q1718@6FcwILj_((|$~0}_XUm7p*w#8c6QeAfmDk4|dRrM@g)&jw44hxg;3kJd@z zEjdfm(Y7yNw;me#v0ujV;fNKN(dy(Vyrt#i(Z!H?zykC+m>aN49Ytal6Y>XD{pY3= zkr0NXcVJMEF6Va%)4Yy{`0^%;r#ZpTk9UmUJD)DhsV{ebYxm5ZacsNB&B%wx-=Z(n z30DzO))hzN1Bnw*uAAIT=v+@488+HcdMa|J0F63Ey4ysoh~jAPh7;AD=;e z^c80RRv3UfMXnvP`SpWt;+^>mz1S1l6z1mWe#%tQQ_3dYL*2|!uERTt3)qx)wt8R4 zr=?51U5L)wr&S6PSt5XesFO;~*!{jCRZfK>-O+q&1L3w`pN{vmAgj-Hx8SX1GR1>z zjq}X`X3_gH7Tq<%KVE<&?ly5(wL?1!?W}p z-rw913v-&RaBSYvu{?eoyFu11?Cva!neRPh-%F|Uw#rbH+;Z-^=}9T^O7zg@fFbSq zQDTN_owLX@<5E-LGrt>^i!{L=8JCeE3%o_nfhEoK%LaNR>6Z%||s_P^0{so(~u6D(P?vhqa5dI;|-4K$@>JxQ7r~2uq1$=vaBOWq3 zTAmvLCMhJEcP4RWqHH=kX(16WW|~wrhV1^kN>jrEU;;Vn0es=TRrPg9UV?$%tO-Zj zH#sYn;eWil+}!F8*b4(Nm)twS^(~@>X%Yv^uPV%Fi+{>q)R=z{6Qf#i{k-9NeX|M4 zxiiXhmc{U)$L_5BnOMIrUvym`;G8?zhW2JjuI>ZhYx)nrgO|B%0zMl0%-(A3BepI~ zBJNnti+qTwK`;3>)J%8V{`MRWNTK=g@KK^HeL`=B*UrgFFP{8`SQeY3F4Y@%fHd0 zpCupM4^FO+GrKq%_k_uRL>745L1i(y`(HlJPVkT>Us=UaN8Jcwb{QL@CCO)_X`LWl z{y9k9p~~&JdD!{h^|U&nVIKUnw)yX`yK|7&JFT;3Sc;G@^6^Vbh!dBEfFVB+{gRP#jdKVY3}Ubx@8^~O;Cv+B`Wpyc8BQc@Fzwy097}5S#-iB z2vWJVZAp&MKM+foZ9oYy!7?x)X*e` zyo)Y!O$3X*CjRPu&vz+-=W??DwWzc#LMKnAGUc#XHOKtg^)*UHu%_Fp`u(rw zgOjj+ygTbtm!aKPRieYri!i}mQ_@OF7o4Zp7<#;54HiRoPXp!^Ro9HGkwm&* zKT?-Ux&+3r0J*TsgL4`zU+z&TB|A2rj11#KF)+7+B$KTe?b6+s$53!;k`gaob@t}U7p29;U50M#N|a4CwSkL!QvK{Hzw zCdYche;2Z_=AQwp%&k1U5^oRD%MVxyGNkA8*)S{EH?qmpU(*hwSGis+N#-&FRiz^e z_L0awNpyR%rGgCTJ{kuO>sSAcd@DowMSts4X2@4vZ|RXVu$0pKP#lm0P2~qvf`S5l zF<2v{H7rYyQW?fprms5rNw;K}07m`IJryL_n`DpjKCMMrz5?Ch=f$xs;+j&xSiyIp zd!eE1Eip#K79Ih}St|g7q=1k9j@w;@n^iN-*doVN%8JFu-A2Yo8iYm zlusw?X`3J2_zeERkOQNnZmyFyj6u2(y_mFc1D7pXD;qsSRXwWY4MtN&ywy&olweB} zto+?dQ=0(Co$wI1(zRx1YYkQnQ#Y;j3n!Kg>!-(D`@qOQVT}wy46aLxN0{Oj< z2>m5GZ_mLN#S4B&%Ohp&At(=xjp(z&Nl#4eF6mufGqC372CWMLyR>;LQ~fOcGdsTC zar+4F{+e3#$OtyVf7*MF&I4BE;tB+2k(0;4Wev)o9^xrbPaub z8|1XHYERSI>$P?N%iUF`7;qGyCc6W;w{JbUnA`?+yNcN2Xw(fSdG(xgrArO#h zEJYq=p_A&d_eV`b1-nASf7+K_U%7;FYf;7h!b7Xa6Vl$U*rln6U7L@~cYhsPB^Swo zJD@V1J2S1rIaLDOPdp&g+p5~;{qeoZ-76RwopL3WS)o|ol4Q`{s^-id6S%R3r>;hn zp^Nx1P93%ZcD|4nXAdcMe*GS1kORqWQ{lx$^(epEH+NFeLAGs`7RP}a5XfTEg2Qm6 zX21Z-FcA)BR~M!Tg59Wm<)SPkp?;p)SX(UASq)GrQ?f~UWXeM(b5~}%Z%yDH5^nMa zMXySFi)#(Sq7u;>N}Uhx<0-@zHEiz7%F>{QL~4Xd)Q@%*%^rOdzvme=$GGK?7Bufr zU1;806m04$-f8#z>;t)cc3>o&{_<~R7C+S*#J8<8*Zd}7G(kIC|BFeMOp~$~M}!x( zbyUmrNrc$}1OS)TH2Q4E^uhas(PM#ptqhkmTp5uK2?g`Bd#rx?GuzRv{K#MRfc9ez zuP~fFtufRL)W1wM%K@7gC}(N;3Q+fKyR?_MI7n@PVn4 zalxHv*{7J8Z{lE0{qu${gpEVi&U%Cl_3_&S6WU!*%t8t9fx&cq$JpsyU*(YrrY`-7 z!-tRctRB-@q?<)BMCmrYuTP?FvqB#)=}E8n{n^=+eDdW`J$@Fx}Jaj5XD-o>(ohuU2kHA1wpj1RQM8Gek7a?I@n2gq7njZ&{svXb3 zr#XmuyYZ&~K>id#;Teac-K0={J+i!Zcffbm)Nkr+L=g2euN)eB@up4;bz6D!>!XI9 zGjKpB)_$W_RghA;`h|ebF4M84|w?l0rY5A?}iKdqu0y{Xa7TH)J(YH{`PSWZzCV&5}O z_WIym91`&)-xC?GxP4p4$-2_G;uIPDSvwV_`Ak3cyZN?ZJp5uM@`>D%gAJ3A>6_e$ zweFj+4?`qpbYZLLQRpP@{c^Kc-!FR$F}y_$@IyRUG&SB4-J9&d(~w`$+rR44?vEvw zhT$-aZI`ot;atS-&Oi9Xje@CHn@E5XoOuW;#7@nF!(j=61fk?6;2%{_sS%^@^)XOTCmHUN?wq!kmJ{3hlgrKi2t9IX=blosRQ+){n<$H z)JVTrp7&q{`F%rpa9LxXl3?dYc= z{gv*1*>_O){UzqQ>t0jx{w_7-VdHR1@LI*S5vQr#%IWLIo{db~J*3eGv%+g546X<; zLYD40>;?%?G6BwjokYIc)y++!$ZC;pYiu6=5<@3lzVU)P5N9ty)m68tG|ZhN-wNq< z8fwf2t~4onxt)`gZaOkmy2z2&YQLcw^9I@MD)fNM+7qg@yp=DW{1aQ3+Trte-XHSD zcPvYHuu7hEU-i~+WnU6(#X|wL*?sKa-97#x+c7dCoU};7A9Gy}on0*LL?HM*!YG`M zr|?7wF+Ch3t4zlCo@l%URfnEfSo~LXN{lQDWyPG9Od|)_5Cp{pG&n0!LYrP?%KGH`*@6acZ4@BOtLEHw_218u(en%I@W7m z2{YXZVhdRzp82hecwa+e6t1jiX{xtKsrhonwbn_JwxhCq+WZdB7B|%8(&>&#Oyym* ziQMN6@~r(*4pppJ7a}EbL0}%7T{ua?VBOJ#frbU|A*KI*@AkaAT~kDv`21+|yx{ZM z<=L#kTH-6n&T4>=&yfAUFS^|QR4SNKJ}(ztlFcrfPoF(d$9cw-0_!A2L(VV${oT@B z3q0SmXn)$TlMK1MWz;lSu)ANuH*nEZ+=e$5>=kv-XGrsNGbyyr&MpF~fgg+B(so0c zSUj0+^J$R!$_i+#D)cEA&XEl;qUB$Q4w*nXv_x^JLBz-~?Q|{O>-xB*qR)D;tWu;( zQq{HDETCDI?0O`n%^bdaDmoK*Gd2s`(thcltmF6@Lp4H<#w~&Emng}1oB_oFQm%bR$ zcX)p1?`mRDxt7iQr+)DE40vEX z5RniNsYX;Mtxe*dagaee;hc9AUPW4d-IyIng6-CBR6e(Ju9Xt zOyA9;z^mhig2RPhF_n;9D?q}$8^2{Tq*c@E*~>oit-s!@pF7?iKgae&|5rP^V53=` zLUZM6rHR42>#rvuuXEZNMJ*wiXw#fym9ONRK2VmLiPCui?v^i9{(VV@asB$N zL^tzUk8XxR;h@Yh6zrF(DdPVbx1mwsKzaPa?Kq7wFWw~PC^a1^KbG|mP$ng?^6nL` zZsNh~4{DI=yN(_%Ij*9o*#HxKXQOy+Be-s<1;EdaTi3|0Q+4=sdDh15i-(Pe0lSd1Ew|v?^RDNd z=Ltp5u7`hX!~f*98k zP0>Ho*njGC{>^3KUqR8M969aU)0h7(bE81UC7e^bz09?)mlM$s~6CqJW2OKk;g+4r@2JB!*Fx+C;6xL z8@vqCLhaDUT(qmkCT(DMk5}s; zQ%iU4q*p|9&`lp&1JI0+0t%ETp#8Yh8jtYa zoe;_)oRAWsRhm7E#$+S}>uKNs-w|#2jeU){6j*h=cR~Lrf%$ah=_1j)z4$Aj71q3} z7UB!+Q<$a$!l#| z=J@+Y?l!nMww2E>-9%5cX*N%kAyX|HyC$e!A8SNYxY6zNV4E&SWLfqv%&B{$mB?g? z{c+(}I<$edP&Qn2Ypo?vaRbw0K378FkqdCx7yU0eRJ>1kD5X1sOQvp_P%z|f^B_6o;wLfH^OoS} zhZ#+aklVIv{RKvpq3EsMwcJ;oo_xg};)C`wOsqg+pmRqUDslu#R1l9Z#AK@LPoKB@ z-Ez{0Uj0mbq=eQp!xlt3qtFZA07{;fb;A~c3^MDbT$Ho_GIT0|fCA9UlIUj6)F5|U z>ejRxyE0K&I42IzRV9@>-&9{(1hojBz4yiY<8hP}BuuC24j8r$9bCHRX?CwislMVg8^9iFno{PQ+N(|jo1}lj3$6OQ zwM_#$qYQ3Ae4f}aU{x{;Zx6?np}jv9QW#Od&)+i1ma@`e|K2p9bR>%4?pkniS!Ztr z90|O-`{_$;*vZ~`BC+aZ_%+OF1#RfB$+y+l^#_wS_8A4y90s_D8Kr6v)pQoLHb>*V zQeL<2zIkiWu7X8&<=RA$JVJpkw_K^CYv3YHJeL%d45O5BHbn0V|Q5FzcKmD zLlr0md<`dHecD+S^VAZ)?5bcrC@ey5`vd3Y&mt3t*(Jj+wCbvI#|5{m&SGly;wLPcg04O*_absuE@uNiNzU(6a26k(k4|)R9ZXmHNqEst+Uvey zzkc*~At=a|W_dlB>zGaX{O9TbR3@NVj(%Y(mHkcUAnWo#{)qz-p~chTRaH1)dKjhF8C<)U4+c ziOg7Yk~}DpZo^&L{8}m6Fnfwh(B1ED_@xJ=Bb3m{L?O9mEO7&W9+)aTlXRh4wjj2? zizCSdHGlY@8hCj%gxLR|(bx%YPe7C>(Pm>--+L4DjuSh#kgEa7hfIryqvwCmH)rvj zU4cSfV(Y;tORi^!9YIeU;i8MHq&>HU&8SQ&$V^Ot8cYtOAO*|ro;_J!eE3BZIJ6nS zg4GO*F}N8~s3dSC))Gw~fpPjP3#9$(Ld-YqA%VnMG^xdd2K{xuc;HduJcq(QX+Bcc( z*qXMs_>R?}h>hPlWaR@i0ZS#tr&1VsQi~~6?Hv+8;FQFd$Q%ThVmgQX3X<7c9-Jc- z?u<60ow6rR4d!%5b!XVth%b}XqZAPjLW}7KJ5@wt%9L%Z&tn#_sKucnW~q3Xyc4-H z!BVJDz?W~oi7@!;Nc)9j&R_Cn{$hi!EI<06iW^;*pvsWSL|}t8_0EIz;!ond9UkA5 z-n+~Ytna7=!Dc$!gj+|zZjuI|RB#fyckVkb=N{eC22eVaTI2^sCcmP5Vj`t|Q->Zi zw_18iQR!mLThT4;^vZmB=jpBU+ymFlI;Xa|2@psO6o!`nGIwk4-8-bO(s!%wCoTJ+ zttPI(4^2?iBZPBo7U?0*B{*F)f9EF0jU3<1ISB2smyip>j5xGV-Z?1?{tEZu552st zaeKY1^L4E)pRb+#Z}5s;w@-LWrTjpY_1fQ9+=uI=$-RE3bu_0}-%RrUCaUf|y`X55^E#DMWHz@yC?XN4w6Bu(zD?pzr;)F&C{LX3UYI6;Whx=;Q0`q_!kfa(iC%e_{j)n!`Y?FvT3;&-oUhB-#Br?wWK z-W93ZOw@wTe?TxN|4Wxh5wCW#xP4rgJEKT-_bs8(fAn`u8hlW}n3kKea#X-r7Ci#B&DUUrPpD{`^YCw%*x%zN^8#_S6$} zzOj~e{OcoJgiy<4KOdP!$OEN&4U>_MM-h(6DIBd?uC43D1VI%=WO=r&Pg8@$M$$Hlie`t5~I5 z0+xB&8HF;|K>z6`bq^BScFEQkL|Iur>|^X)4yYmnJw|!*lcGam2=&X>#%wv+dA#SR zuAuONTVZsMEd7MlJ#fH^^n-5Lsu0@1EwOF$yZtN$PU7>jl~$NwpTwusNW5FiR+##4mrf zHnHtC4u^2oxDyMRw0G|vvi{fteQ};N?DZyuBlT4`?tR)-vlH9ASx8anujeoB98kI?K4I`)=zG!vHhn(4Eo^(m5dA4bmkb-5@zMNJ>jchje$Rgb31&fPi#J z*TZ%0>pstUH}C)R`|Q2HYwfj*{12phg~cWSb1R{PZFVTo!28&Ff1xYzk;eUmpk~Aj z#+o`Gtln;IMGgn7Oh%gRqt|ZyLH2Q5Rmk+t=r=C*03Ay9Mf0-tZ`Y3XKYBDk?iEQN zd9N-u69rp(muHb*bnpvQoB1HeFFhY|$tCjf!*t}x+Jo;lxeKVmd6BpBds-N|m=u*h z0=LR~3K`7^u4`|02*DR9rF|4&0;UfpzWW~K(T!1HwJ$YqyNTb^jwEH>dfgMts=79= zPEo3|$o=LNV}3ZBKAZj3e}0i|agUWme*eQ$s=8NC(osd?f5wS_=IlVC|2`Ne2%#-< zN0=Ax$^M(>4DoiKi{Gm2e&<+$XUqSmRD=fvBW>ygd zPK25n`qx`~RXt~UT7&L)r<4-e;qaG0(fqY$OZVq|m^x~iI>dm0s>(nBM+6WxsaJ{6 za!*C7FYQPr;k+W&foxMpJs>-TfpsK*mON|OyuiA$ush_74Sq+H9KfKh0ZW_ppavtt zw2Eb#^@ubF3QaRiW5AqHkgkP?f7Ie4gx$Csl!4FuW+5|KU`e|@tg;d!vjrJFBWfz! zFsng@Ux3y@-WISXP$;&P1BRiq-ni}ykRre@o_0`b_QICzc@P3@x>}uqs_Wp&IFV8T zr!q^(XVfCSY%Cl`A`> zCT6_LSp~b$HN`lNv_G}yODberas$$0NLUQ#N?Hs%`bK8w^>ors!-g$U@gx|q03XZI z+*d3WHx{6D?e0MeeZoV#iCN(-?B`n8_(!%{70;=SC{rzX%v5vYBu0Cw1^Pu8YgF z$2CoGZ^sUFgLtqDb4B^5mg-iQ;iIIr$ z#)8AZ0B2>v2&L>1k0BIVdg` zqG3*UF9#t}8nW*+_Eq!n!YYNClhaFZkuRgHg|m8JNbNa5j`9le&$$-11TJXJmuI4v zm!j(odNNf(0z&Zgx;Fc47FqjGOzZGQf*~nW641nl8V9_LaL_2y8X^tFM@@(rG$zVd@(Zt}5W zXbH77i%e|aFYY4>r1y{1PqL_am1w?x3CqeuFYSx}a7b;zW9W$qaeC?TAmXp3tjxbt!8p!_hJ;eK4e*(kGT8i9VH*p8U>J_;9eey=yzL;G@;3@ zdtq-h5s)8QVqi)@4V^^jP zXYa}rn|UdvaLHQMA-&!;*hbAEv*y{x%i}cHyWW5J$;!tjKyZ;aC;j8Zw;mV4p8t=g z;{HWb_TaPF9Y_)<>ZSd9HT#zdj*SiZ8{U2K z6e@q79vxzakZ04)6vDYOjv1u7#jMnY!~U`kfrz$IG#iZpGb%8077xMFQgd!*rm&Pd zor0J6E3(br5aQykw3du{Xt$JUFc)2ZvBu*&>>gJ2N;|3-k&E8EKDh1Vgk=%lmof0Pv5d(v%1t^y?1&w_5fyBmxMFR z%mv!G%KGO1A?W)hJ}X&MIjWauiNHdpxswxVyRYxU(jxLQP8@hl#(^oAvjgPKcWQb= zRhk`f5nQa3%d$o-fbvzB^Q9HHc<~1aQT#eQ#M?y7a?5Cd?6GwH-0~fs$Ns}@@JZhw zFu#XdEjV|dp&~b09S_ciUcuCB4+rQS^iD_)1OfY7>5UEGFMbY@V1O8)n2JbV{sT~s z2yDzioQ`9HAhAkh@r7PH4h72vv&%T|D`|@l#08TTp|Kr>u&JOcCV$wj?HQXaq%Kni z7)fk4G;gL1ZK)OYM40i)(Y3igQ8uyV;U*S3z z`vLV&s8R@iDtEuMe{l1>$uHMS5)2by(~u=ABgpiuvzGq4V3Oh`iy2UXxZ$Dw9@uU~ zxe98m7jnN?kpAgJDeti)E`ILpow>&+G0Wbvf=Bv`Sw1}L`DGKE3-WS}{d*?0&lAgA zX3I#@-u+_KvB_+WspYmmj9=f_NLXKy$3L2Mi%fgLY;_B}YVwe}-q(#qc={>t8)`%B z`s9qJunj!wm;vsanoBPWxf7bUk-Up<-RMTu==34@112<8@MX2^GP4#-{nfe&(@Pcdh>O9Te zlYVWF?_*cp0ElSRw2b@kz&L6Ip_C6B2r3-JSkF6xRaUPJjk9yp5BnFm#U4m&nEo=* zQ=_gS;&5x>FqSIzR8+SgFvD$<5c}B{qMcve&$H1gHKTu;r-zsSc#V4)7CYR>D1LT`^VtsHxM7~%8QxoMAgNwB`hT54H?<7g~;bzqSzXH zpy5_c1$nAU%{h!5z!4(@@&Map$xeea+Jc?DTK)%_ zVP~*GCDj_@n%N($o&bJ^X$1$e;B@`U=>VKF#f`8z1FAv%MI)-14u`(l_aD4=5=com zgqn&Py`17Prt$4+TV+?e=D#1cvpQ=+z~6LGAluw>4g_jFYLGG8Mz!=$W$uD^J2D=} z#Wa^VIK}sF%fJ6N(fze7;F8oD!GTD!x(CmgQaQuXFm&`xk2##X{KC@Ga<-Pb!?ak^ zU10KXX*Fq^eE-Pr-|TS2J>Gx9&|V3Pw>!}gUnToY;9Me4uaG1cN>Onnp*s~-_wYo* zVazf#B)9e4Eme7Mf_vNHVxNb(E6b|hU0o`~S2Tp^o(MU+S1!C{o50n|)EbBBxR!A5 zZIjhy=q@o)h1yh3vOC&TBL59=d5Tj|FvE_TgM3rt{}6p}L%b<4{%z!fTYIia3h+Ou z7avK%LY+87-Aw&$bS)FCygi{lzNX_2p(4iYE3g0_gcOY=?Tf4ZgQeoqMu|8aj|CgTYSiJ8a{81XUJ_^G}^bBC;%Fr8b{G$rC|q6Xls3_0#E zU*Wql`_1WA`fdFP^b<*p<~OTdOD9eKpOGRtb-n(yAbM(LqH7n>&n5<|!GdMMDoJTb zz32NlX$(#-AACOE?E{O5i{*hK2`-016xL9=%{*_b#pBI@T1>zy|V41MSsT?=_zJ7ddgobGq-dJ(13Wn>l#L472mm+q6 zA_+m>oZui4kq?Jymq)3S;+0 z^$$WJi!BXejX80Vs&xLDcwwDQczNur$R6#LRkO972a!h-Le9?pIwwB6_v{tj9?Ju0 z1>9-9>M5jo*l#)C;u+=_q9W-sj)VD@*z^=q2}#jnl__eC4B*F)w#~7Z(|r2d@?R(B zKzp=09pZfm7$0~HEsm?4*E)u7&*@ZlIn)RVb3eU#3nId*dG|e#i0=pE*HN6sO)55S z8(iES_LAP2_9~HyLI*&7=u-wU}e{wMzb4sMNq(X{ni43Cu(a!N0Ymw^PP+I)}{JtR9 z`x>o$g(&2~VDmuQpC|SzYH8>|k-Lz9eFLL+j%cn$!eUk4@x@hQK=e%8WPu&Y~H1e86l@FW`(>eIHfu z2stJ@-kA7BalEoP>}^e0@CVasjIN4MG0TL*MbO0jH`3Tk+}bbbBuL^YsQ5+7gxdlA zwxAsmu>`0Sf^ue@t4n=0Jitho-5a8a2o%Oq;Dm2hhkpT#kUuCU($ZsnEY#M^2Z9@FFQe)Q$$0+F;cz~5uk zK4X6byJ^P~F{tBEbt8s5iS)x)`a@>s#1wxTU$jDM{yrWtTH!QEn ztfSM?BQz6?a+k2Rm~OxP0S;pH;E-?Z8kn3ns5aAhM5a7=Rp(EWT=5K0H7!y-Zpk?s zJ>JPRp`El{{&`f!V0bIp;rp%QeRo3D_q}<^I+lbAog?pgn%*Um$0;TigVvFxCTpxZ zY)RZ;EEj3W?zzWaYu8oeb#+bvXJpT9at&*M;9V0^@$=79Mw-(z>3xJFTTDy%%A9(+ z-*>1OzR^#05S|1(3L++5g_3$Ggn3Ce=uHio#5N}A9-v*rsEzT1Ai2Vpb}6R^VA-=# zF{#~-gxotk5NtCh1Lf8A?m&~uXm_^ox?EK-M0de#Q+NCg3WyN*k0r* zpITql0N%yxz}JiQ-Jg%~oa{#$xk8-&*Kk|=um9@#_)W%Z7H5LIMQjsFlbr6yU$Y~b zIo%JN*MVm{W2$0pLbrb%-|0-RZv8wakJ(%6XY#~Sh-t2j%V*t?)NM)%y4#kanp@KL z#BVd|OQtx~3$oOJNEczqrL-bcJQWqg&Egc#MGfnFEP47O#9QK@g7bu1f;&FLiF$B}Mf$bQ#=mzITN zy^D;5Pl<&65ro%ba;3| zm5$@a(4xoFlEvoSYE$#qws8`c(y9#QF%ImQr?prsAFcw$F9}kClBI*Pv&qTGD9qdH zD#yZRo#&SHlh%2$zK@w7x`cCgG8rGoC<$1?P%iYmG z{8>I9kQJbbIW3o=1Nfe|8>&MXH8D`DedYNKME~=eZJHnD#oM&^Xdbmxa!KO(* zuerMo8D?A;{PsbXniujP7d>0XmOWiH2Ae+T+TWS>E6v^=@TRA)WAb17>n8F5Y+rri zuyk0T@U1lWa1cfw(0mC$tt!7f()Vyxtfs@hxM^?KcqM0ImYMFq-wX*TvC!C?p%bVE zVMAJ*@4aJ+ugHBrC!mC95xovn{YsKDPfw*GJb6WZ>+o@O8T9K?w9)f44m(T2ncyeh z1}CtUODR2nfGE{V?Tk;x3guOO?5KUgHiS6?F3*N9XC65EZV&!;^X9FA6OL>z-_%j!}BjuMFOy%uwHcg9o`I)-UsMMy=q*oBGB%t?QJAz~tyLYSKmfoF{Thb6@9xJ(y$&NPH&Jg}7L8qoDzQP6z zOKW|Li7rA0n}@bR2a7;74jVFRJUSrJ1cam{YO+IDdVS;EW;CvwJz(45kM6(#f#_F=3~G+8-aC`}a}Uq^Kz2 z8+bc+$lK)hp}s1fFrxmNpx7w5P;>XZBTme>w`;zf&4^W-Si9H4H>ay^NTNy)Rh3uWehZQjdoadVZP2cocK5EKbgU#u>Y?}kdpiC$3@@VrVc4t+<8?aSOq zZ*1=*Cn>{^?JMM^I-KGD~ysP9I0|(;|?g=8h$Wz2(0d1+fG_i@AK-^dFAi7`>5A_rIgivvMzK` zbJgZ0_(*FF1lGI5){pY!c|Q5O49Zt@OLYnF#zULSk?3-B3Rxx83u_}c?~g9&otB{o zuNk)SJ{mW5T_Q!q72z!L?T~2SaBuE|;>y(lM0|@3g7|7}*F{M;tSL#F}J&F2ndP<|p$&_L9HSA%%<;DUzz1X`%eYKwqSOCT&j^>d@rL zG0$0|E`c1OrDlV9F6P2fjMwT2bSkv?sPp}E61p?-3c?!v?zayp(&k(#o`j`KhS#k7 z-t^$^^w-Trw*SRgr|@7k=5eM|nW(RWB0A^)I3WL7a{6WtX#0mJ1g23Rhf+5pRnlvi zkk3a)V@((b+!DSl{rx3$>biT7eff1RHeY_^dp}1(N$BTZGT=R&ON3zP+@u7jP7jty z#b2vqe-%+gps&sX9UDuU4*5XuKpv*5@#1!VSASPyl`hezzE;{=w@6fjfZE>o=&Sh< z|J)z%ENb%Wb_~~WLX<$anu{8^ESVG;M1@C*jU@P4BLQ%7`Rhj^?aGX9s6*WM26J4R zcJea1$ov`!${h=ZHitSf~_3C`3OCgvnkirH&hrej}!VwHtBbZ#c_?nf65^bK{KuT|$1m z())|$Rh^VvGTC=tijw^H>qUm^1P8)_Y5wb-$|jL3(qG^5FD>(5tboJP1(@B@w0I=n z&j>ejzDhPMYj%{8$o^@WbGY_tc8jmK#E@CPe4pS8NDPQj;f_#3BgiS@=v-VXlG zcRCg8^^L>-cqj*X%c624Cvt{tgpYa+B~*VeX}XtiMGM2`8+t@NzS`3zl=B*Ukq}M2 z7tem|(v*`u>X-|o{>BH+Om6!?9njz|r`uko+{d?j* zjM8#sWcW2Y1bOW>G=|wJBA`b(?GN9N4rmw*_Wj|SjR{t%>*W(``=E9rDn33d+v2kkAa%p6}0pCk%sY=H)c zP#fCSRo_$o@@X1KGwB?v4!po|3V6n8A}b(MmheP>$$+ZHT8M;9Z#IHXUWxpfqT8kc z^5+J*Q`XHNkl021QUAmXAY-F6tsjO0EuoR7U>KO{#4H#d5^e5^D2q}f5{{3ESrL$ynCXm0 z&&YhFQCBw8l5avQ|J>;~-5;)dv|Kk=c!%2MIdWC}H9WA==49M!#$zo;i3~sclKT34 zoo1h+rP)Y+E>752wRA3p*D@pctc0fAE@J|7?h2)nXY7oICneIo9rxyOboB@ z6sacrlYpymZdXBk=aqurzhz>12SVA%1~)1+9kU{ ztRqe(Ho9aDc%nxduGqVsNIbe;xS?kv1`S3LNa$OIqbFm;s)dm!r}t!F%Xp%_YL6Xt z%;PaAwfPuKzsQm{0P8enG+_G6id&k^`3GYqn*~9Aty=tT3cXt4h3z8|tWDDW_)VZ; z!p&+Gr*6K2?m|d$EQ{x@>j9>Jn_EO+XQxwOccb;hknpw*y!F3)TbB4geEX>#;xdo^ z_U$)Y;OCS1v5R3{>mPwW=MPEUewT~lkAJsscU2dDc*S3TbafK?wIyspMuA7ewTAZ}*2t823|oIcMo&aP@U)Xw=EWXV)UfarG$-G!Or zNkcY0KU*0CRrXj}9=~`{1UhN7yep+e#i&*_mvAVUIP72{u(Sdbk${(7MfU&KDdY;C8cK{z4BL zfQj_B15S`)6-U{FyeO)^Vt2f8#-v4U2Wb&Nx+KwB{u3Z{IA+2 zE6Dp{&!s_v>g5cDuJ^?bZ^yMw2K|yLRar6<*IenBqxpkaX8fKAz&Ykhh1O@5vK8LB zG6zY&Z?et_Q0QyMAnDpzEcr@OIM@~VVUU@6&vS|(7=g%2;IKFU=YaSNHGt7ck`HxUQWn{42*uM%DpGm*saW9e{r6%Mm6c354ELv z`=*L32Q~RRPQ~|e)-MdftH;*OK5IM8?Z~!e zS4L~PjvxAax`x?Qf={oBNQ{(=LsY;yatq)>XUeC|O`*i%%*!3(ZnD*t%^ ztN5sF4v)2h#48v=5r^RDh;aa{un-E)xtEo^YCCU}18yIX9F>TFL;Nt-`mnvu)@-?( z-@`4hah73zK9J6UNHZ9kq!k8$P|R_oYL>dH`1wgHa}qji7GO#(4ixB%YKS{_r2ehi zMwvwq>LE65&R`jxqz9qsa;TZ){Ce2NU+cQTDRwDkwQ#bF@kJ395L@W)Y#+Yqt!G$R zT^_tNkJH}TfV6ZNZ`_vS8eXuc4iaG!e8B)AQ!`eaB7lw4{wM$px29Nip=VSeyzmz@ zXe?#GDPqU<;pernT(wjw({y}ikai^!psK2Oyv6I9qN%CLO`~D)kYxVF88E(~?pVQw;t>3ug2= zEEWXwA**<*)v>2p{Q|2B3GpU+*9%HU#BGXPM#nwBDv6_Y86$P z-NCo7T8`>ZFhAh_{WP)O>~QZ-LkETXKBzIM5j;Glcl_5Jk;siyVKR;`YK(+)B1}}}aZu4q5jaYk{9d20A6`!wLV$Vd!$4g z7uD7n^gp~qSH{4|R2p|Bk!WrHx;{158 zc)%cg^>Au-yZGyIGsi1#{G|`PDkGWtKXhE+KXm+IL`JVtFSr?M-D%=@Z{^aGo+I}8 z$J*2B!{1EtcA>|8hIs}P(aK$26t9!RIC{@$FIlB_0|MbBptL-|Hxj!CDrxv(oEd)> zg^gY>PTn^WAPchbD>U{;A_EkPNWmUrz>#ChpZ`kW*u(7I#R+Ll-x1mM4wasNhg5KJ zDnT&;B3TCTBch?1n|g6yN{{ru2k~d(`R+T^7YL_}$d1;4<{&+W3(OLLi^6r7W?XUh znT{PfKYC1D#l`c>Hk8PXZM}v_wkxG+J1kWYq?;IR>>t^&vQHpDh~m)>Rhd@=7kWE| zQ3S+<238B+XoX3GDU?D7U8Ckpti62$!rNR*D`hR9)NON4;QbLs9EaDy4I`N5ydFD2 zO}H99G8Uz1-_|ge%kCa@jyts+zeAVKE+O{{pGsTw)tvMOv?M}kT?=>BHHzI z$I{__qGgv{FD8MDVgjBg{E7kI7tdS60k-*3fB?=4 z{y=+Pw9wt;0S#^!xIQzz*66_S;iqt1M%-K{7}>O!(^9P_EXs5=9XN-_X>S%;kRpxc z^eQMXZUm(b(pOr5d}N}#)Xf$M)Ch$a1~}Gw3R?{@A+}6z__%y5za7hMy@WXc(W%`aYChhog%w-XxcQW zBipz`!JQ$5uoZBB*#1+}y@i5R1~q$gPBhJeH-7dyHSTo)P2X{+?bsCGj0i?Xvx2N{`k0Gr0-~;G zs~e|}i?h@D*;B~biDz8dblqkK7IJyme|OX@{xt#xYEYL8DuQ9oI>Gfg`)p^I5}h3# z-TH!)?|1(D}66haG=)`{ZJrilC-0o&nYQdgn0}Q4Dxok|l;gQe0 z5Q|!;*_V)n+MSr?>2!l{3CjvBtRoTs|U1U!^v$$5_;l*?Oi8Lp*3!F7%B1}e9Ni%ShoF^pv=b%gqE0ngO zBZesZDiQF$!8#$6^&4t7s(>v=UK1=ac zt!xBhHHOsmD&ZA1WkjHnVB)ae`?2|B)hT`I?2^?56#q&nq00mKL-1FGUX*AkYD*j3 z3n}?fY&^~`E~iG_D{U{HL2s7*tpiCv&K6M@mx%pa(4lZo|JxyhY}uhU#=-k z1Fn`^_>ys>p25T{EUj&y$I8Iz8OpZU-yjH2QTXNe@IH@wm`nJw)$=_6sGI*DXHe#o zc58NRwU@~`@1=y}Q$SIdgCakzhljFTX z_jzNtAcUR&`nD-Q{EIG~bz>4HgTgo@43=`v3uj_eQtt`D-oVbh+881qJ#1JvF%;%F)*4q}U_T@5AYD(LVLY|yloq6V8ttl&`dlve+6Ir~1Z zXZWR;JvE(xqJ5d*`l`g+*_!Y=?%LU}BYHK2Jb9XJTy*Q`633)Vq(5`aE^C&~Rufhc z#;*z1c3$fh#)?YN%<>ucnWt(&)|iJj10Ha^;!n0huGjku+GQ6gbWPWL_$dw#z#^}z z%otBy%P0`*t3=||=BYRQJR$6CVh?BWu(>{z-soM9)1B`u+m^!i+%|HsSM$CN_fWa^ zjtrXIxFcOjI2!gslCH^5FtKDqN$bv(Qj{zb`ozL3eA2V zFGakLD!RO}Lvxtxwc@|q<15R!@Sf_^8%qvR;j65~N9o5EUp0$avRV z++pt0i2%fw5(yR%Sk7hN6?p3(RDH0%DSZJk9&rmjLoYxK5!KA&L`X%jK(8?KUSAV| z0Mm6oEJ-djk^)9>jn@>PA_eKhrXh%RMwiZYS$lw=B4$5hc&jYWlB_|$4Jir0xo($F9` zgjlzwYYPJm#$PW+gQ|^v96VHKt#y^$BtiPP-|xx3L6*(mPM4uk{`k72-+2W6RloaJ*@GgX@Db6(%)nIpu8j?;4UaLr>naq;NIQC-{)|LuziNL zY$S5rW}Ii0SzQO69bkcA@v4(2nQ}X6Hu!0B$%ze3T}_*9GK9v|KQ|4Xa;Yf24EEZV zsVAG(=1-3ur>;aQ09@Ip^yi}^a+FvMOHXx=3}+nzWk)k2B>wDnH)rebk>CWO+l@Ao z9Rr*V&shSx@kvAwpCoi{3<{tHE^H%Y;kNvyao6&p4sHQ|r5&jI3RJ+2)vS2^J`I*c zp@bhyaf*4W7-|)CcL$8V;Me=oEs_3%voWUs5BM6hxFxV7{@yFz*?kv!?}e$R(!9~q zvuGbgXsvs5{#|e)4Rb;Z+61qK;z6VM(2OA^0udXTrK3hPGb}B|GVdV<5$)a&8x${h zc0s}hnp#NxY`S1&L`;fE<%s$dtISJsHEBajhL`9}UJRK6?5iux)0;n<-jqG#=^Q&Y zIv9r2mW}Ci4&MyfyL0jq8lqM7_$^o#ftV1grC8 zd;AWM)7KrF6unUPo<4qX*nzN#peOo?Cvlr>S}L(H{buwfq&s=*C0iQ<>G~|!tUa49 zqJWW(j#|aZwVa+#uH_m0>9eWQD?Plk8~(BR?&80?k#FQtyk)$18k5w3*(N@EUAj0||XH5Y?bU9|O)}h&>76a)0lPM@%Oc{|8@mOZe+`!8S2#y;(h@JXB(CeR0hWSo^D>&d58 zplGD1urTS*_IR5omWr@5-@GI9LH(*R6=6aX7mnCWMCWzy@&;$*-p`V7L6fW1_7=sZUlZH>>@uX^Vv zNco%JqfClX$KfyJefq5S;dc||agO*+&E4Ts zePw+7ahx%+#g6^|2^nPi*9anB1|D-G(0#?zh~Hh;TTP#5tn|j;e>+vzYi0lZlZlb2 zBf)O`{^0G_@5Ak<{ky-V4UXlUUCfGHVecqniGDBSvl7oq!Lffx$XE8GTOputFnx9X zDHzlfl_>kG1;n7J zm*Y2bA&;ww9nT?b53?Lk==IuB-H(@US>LOA2Ep33A-3GoTcRsvGU|Ayb~B`E&|brD zRS^SOWAmubOGQ&4sm2n7Ya0vP^;cpMI|G-nZ?<4 zGXAxH$UDi(Rf&$-Br71c(i`H7(h_(L_BtUmJJ|yZ-=pYx_g>E8n1}}kahT+6J(!2% zzdbG0a-O>Jt|o#8@uH@R;_kl-nRSix;fg5N1+V@3vlVf(5psRDmNYCNCMFXJoAa%n zPX`dvmj7u}=oknFy?~7nnAGW-g{Nr$)f`{I-E5ge6D=H?tC)oC z|7se?m?pSUNN^)dlQhiTb;{BQ!%(RyJej5(#ZCM6tJfzXj1`<-*C3fDo?8MOf#P(J zE-Z~C73H}M`?47J@x7+CLbb!YmVMHn%&X_>ORv@ppH{x`H&3fb)VbE6c}zuwkggK0 zA-K(N4e=^+6MkANp}zVw`8Dk+#Q`8qMKo30-xK`LNv1IM?iGQ&gk?$hY&V6lsK(F+OWbk`4MeCZjWZA=>z2|<0_~iY62__S>JERljgh?v{s7GEl-jVMO+{w zR}3$#`?ySR5Cro0{K`HGRhNF^sqN^^yI{*RqDW^#axy$>*Mm=t4uafj9z-djFR6SF zhb1S!Z0WrH`D7mliFGcKNRaK{mI6oZTpMAS?-%`rJR=j*q0|k|QsUSNMZ23|=MZnG zNF=ZavL{oa2r??Rqq3w)pWCWoT){VaQJZh9!e$>x#tzWN*?(-Lx!I?@1ZO~wDIK@Y zI^T$VaHmAM_x*={z8D)dw7h*?gMXNO*_d6VW4Cgf0fY*a_v67qp$VzC$UVX>du9jO zZ>D*OwDCQ?Fwg!jYWm&uqAaW~0df10uy#p8H|Alqn;uQizpsS{;sDByvY=hEvbq5q z?%og-tjU?iFa3fqw=Q|qzh))~6mI2xBl{)Srdvs9>G-*D{-9G=K+@&2NFvs|GSxih+tg{{##~(j= zABw}Nu55tjOLsMWrAO`+X*ef#{uTvxmQfg8E%eb-eps$3&UOIo*B+tt*qH;4+C1Mc zRkB1JLt=far`c17RL|_S+|=?lhHYTUaCcRGhoDpuq8cI61yS!xV=kK+$?c)YJJp+= zZ!zo~9DHD_N-J?T!(&@NQJvepH)5NwH;wFAVTAWZ~> z@*=4(c(5jV8wTCPl17Rj_wYi$O8^-F1(9RwnQ!3i-P_)9R9aih1e^>Bnw1nDe9(;z z7b5we8lm z?^9SzbA@n=(~mexRWVUN&O2|OMvfRRHyRSt|1~#8{kNv=f$Lca=Jnp&lBVwBiU+nI zWe$FF(!tuFoh|six!GBMp{vUA!$iDIDA2=NP<%biL<#jE`lZb*rOD7z(w3+RH)A!$ z$Rp#jk7|*jkgHos{)@h%{!<1m9JAp4Gi?LJjs{=zlf#lYh3emQxv`>xL13-V2#r-f zN`Bo(DB9fJMKLZ5uH0#)kZoT>pr0uomL!I0mqF zH;abYbA>yJ1YdB5n<@n-qf!Jj&LHJWONkgn!kFI`6S_dX;WJj$v+^27(yC}scP0*K zkg~r1J_)EBeuH27dF%WyKD(-MKL&uRO17E~axNf_nrbcGpE@ z{arqZ(oH`SViOg}&v#sd*ZKtsm!&8S6}3uj37b`y@mpUy zaGbB~ZNacdRjgQU(Vp7l(bQs^M(cDT_ApSk22XstR`FBm8+c6!KStGxph}g=hU+aV zn%Bo3H>EQ8M+~{FU_Bit*C_e3HfOb9%jyNgHmXIEyyu_+`GkqswQmMR)}H_{{Px?W zpbgNPdb=n!rj5`9{ks09w~D;1BCN%&4YT7rl}O0FXGd6R*;+(X5kvZl!^P3fdaC$x zg%od9+6!UF3co;JGl;B*aV9{`98Kk@(oK6cq;==qs|^P2fe8}a6F+hV1Me+O%ez}& zNn=2)hEfoGw1FV3n?lq0<)NIJh(zY*?f0POjJ*ohCQfdHvVnJDZAjXjT0^1s1aSQ< zTCgf4;mT>$D;~p*?Bv04iGpa}g-Y4ZWu6^jO0%Wj?kOu5H~tJwI;m;V`(|PJTfrwf zlGfCaN86{<$L!r<)gj80)y8hh*dwIZt^a?-%Tf84-GoGQcAJBSH*Hg`1QTanNpzxD z@9w^@-tFIR4L+QA4j%3=+IwDEii!KyWEqjoj75L-x)_zSKqd9o!ckU`(T0vns_9F< zeOV1$2sT3tu1%({;G9wDRVxa|-N(N!zV<*z%y%!Y}yUx|D;m*NUHo170_yhK<2e{8*F zQyfs2h1)bV?(Xg`L4sQ#1b26LcW>MYBxrDVclQw7-66OKx7%~)otgXL_7CW)uIf|g z?6vlK*4!Z6Q~Vzm>YP2{-{-opjaRib3U>9HE_ z*}Y>nJQJg&&@)DGV9|Sdm6X-D=IULzC8*$pxfS1admznE?A<;~Z*)_XDZ1J5iU-1x z!S}&6iASO|WtGlKI{lzyZDjSO+^NhhBnnH~&tw(NtW*@ab!NUWRP{uU-@-cbvy@cS zQv^=MhNEN*mm)3^MK&Zp66x!PSrr)#=8L8qv*xNgimD);c0iT_gBsf@n`_`3-2G-T zBi6fh7g%Mc8Nwb3gZK6gUaMh-WRRgHK*)&L#6m9TDXR==WvfifEZBlke>O0f)wf#} zZ|>!BK~Im)#3-}Xq-`t?4MN8#*5@RBajvwN|00PvILpqN%Bf`S@pkmMfAT%FbR^Bn$|lY+{B@>hs4s^t%&b)s)kgo5WW+px4O5S;U3TO+7G#{5_sX8}Xl?SHVSZQjA5>?<#Pf|jrDV^> zezNTI6)BGA?^<4=dDVmrT4VsZ&t&sxFg2ZA@@ryRE-OZ#Bzd85w5<<^K2#M_>vZb!gj-#SFWBGn3MF+N9 z{eown16kLEEZd(l;(Al8hZoWT&~%fY08$;@r`4xF8(* zHt`_{(>Qh(o4z%OM*ZkUXUj&+Pi*Zli;i+>2~YNwjd8xQ9$13x0L&fs1cY87By4}T7~I1jwL#=gr1xQE>;ExvLwE9G;9!I zxfa7sm!duP*A2e@%W0p7VxBpoF@6zYhvboh#9W6pPXbs;+%g>6yE5=P1|nfzBV?un z&pI@rFO@R3o>r%~GX*{%GUl(x_ zAS_kkE!)}~d5X37RlF^PLgmKI?GL*~owyX*cz<3&Lkn#1)Cw@bb?ZZpm_PVWE)9bA zj`~kX;F55bnV_%XlWd9)2jW2v-h)|v->@y#bj4T$k)9myNj<< z^R~*OiMc{)E&oOhTTXo_O@VpXG{jkL9~Tsi3_aYdqrP9Sj>DRc`{_GHFQ68IUz`kx za*&e^j7=Q0dj@1D6`E&;-AC{-I?pglip`8AByCCXTfvb-A*u$K_D7=yawx|#_AkyL z?YdmUM?#bDLOJ~F6G2A?oymDz@1UVx_k3)<;WU5T(mhTE-hM9Z4l-2BHHpqovtZvP z5iLAvv}600FWkcMMBpw2-g7VV`Kr#K45FR!)m%}UHm{|wl_KvRK68m0IzXtN+A<1o zhuS0Y7{-OuHC-2hbOvvb2>Sbl`g$hR_Ow8&s%!Bl96C;2A5^HmzCYRi(wo4D<|xId zN&~{gA96#spgl?ZkOqBwd7a$jimP`rAcXPWEVzfO&4v=M$8F)_J&cqXf_0m)?Jinu zDp>K~scZIl`hio0*(boQLjLh>MF0YjN2*Ig%xNW8vk@eIw=Kghu?3X9Czl_mzB^j|laz$e^k*(5wW$|JYXl6I zBktDx3isDz^At*BROx*9x(L);)!Q8ShCqC;c9-?%2%Nm>&5NGv{sI=}Id{ZzHYfW_ z8=0BfQlMHL*;>B-=CB4nF%S~X z^Uk>X?nh?Ql}wHgC(T`bD*KB$XRk9L%+?d=h_|i6&RIUGU{oXTN883$wC^`MfE(`c zuj74L?z~1}ZM2yxT~W$#9VULpzGc47<7ghLDVg`!M?Furt;>DK{)DJXU7XpAm`$R7 zR%VQRI$bUIC~xih4~>aBmBhIT5PFiD2?U;(T4>n>|9TH!>Xr@8o#Xt`<&=(1O4lR= zNMt{Y3ud9=o%6-aUBoj0;zRk^&K}yw(InV>3lYm0NaUf=vRR`Au4FT&%Ki`(H=ajp z;l#rB08`TP%gW4PZ|kuCi%5Et=8tH6V0o}P_I>dPS*(8h3%h}ktPv8(gnyC4e=+uS z^0M`Yndji?XJgA4&@p0yt};6-ii*ngDQ)y3U}fDm@a6o?QnzQL!!STke!>-hoa6t< z9mz5O{UZHv_%FlWirG&HaqQGy+ko_?Vh--&AvmZo&62+?@1?U>110U~q6hy4T?LA95l2dn4A7k^0wcaXk!R zC)j|IFWU0OiCm}?E6H9$ElVm#&p*i=^heo$%#3r;-ZjKCMe3mvK`r2?5O>&gae_Du z8%D~3r)e90`ww1m&3MJdJcJ;W(sJOX(B{y`@y8?C4$(GQz#YQLGqHoQkv)Q`y_^(w z!#I*rrHfS)CMt%^aY)xrt6Iv}M1c2BDV=*dEXe{s?o!{?i zAipo@4&@tqe6zHd+o!$|0ad})hLDkm|JR6EFhjcSZ8hNYdw<1w9~1G5ol754KQ~G< zLWH(OtYrv>mp)lNbq^-rl*k~2Y)T)vAYk-e+>-`84xnA{z=`yB?NNCxZNHuYcS+Jd z8K+T98cC$WO8=ef2Blvg&6u9qUFKF3@miN8 zaAd^)KIC4>N2p8N$&!GlU}Mq{ofapIx*S?dYMCi?!zG41Q=z2`<-;W-l{8@(bp4Pj z+VM8~XK_{TGEd}(eUrykbm!x~+Y|6pH;0iYO|d-v@}FM?wVn@W@wzw{HelR&Tr65D zcKqsauP?ANRzXY0G}ro#ux@7VZfQpmP7wo^RTC5+!ix0@1tZ~e)|%<`$RDTt#l_Fc z^ZGcMtzeZq(K|-r+Z6lW-kA-v3CxDJad7J58(D*_OII2gvzEYnL>=P}P|_|$kJcp- zY6l^!&83}m(UQ$0)K9kUZTXLZP9~tKQ5Z1y&%Lg{2?~9WSH=8Lrm*Jc5#^yd&3|_m z0C2@^$TU@K9vugG+{dAF_n`hZ6QUEtl0;j-Cxt;or{$x4G(smvw?T@^ZpBoKlkF?r zVrKp-*DUunnIpClEOALB?Uk*eSm-UOL>a_jZKy*q{k->VFs109YftuTGaiYz-T!lw z9Be@@24Z%9FMVkoIpi$fjW*fTDB*+JU_tP()U=F0)%#GD8i6vN^o!1&4Cj*3Jvc|3 zu@if<_B9T1p9&KLQdO(Vx`n=}^h;OgoFZOt9*5R;XLh;fCDVz=)Vf;Q-k(W(_O!pa zz2tZ%#IQv=fuwRxYIXlNGuQM#nK?l-@1b2ACI|KBp}T5BJ<_R31CjKco_8mYo7a%1 zr?CeJ=N#?i=_yZlqS>#D9%Q$cr5PEGWNaQ1C5c>x`i6^3c)R2SaRs|1Qhu!YBDqXX_9G!O z2iULLJCgdPL?UPq2SyCb$r?=DgeY3NqoGOf9qSum`g%5k1{n^w-f;qMuQeb4&EZ*< zf`4MP()SMcYh{x4e}S1itq)YFou;o(Mo$!!zk8;pDO!rqQZC}8V3d*Y`;!{9o$7Q! ztZC`!bpH(Dq^E8d_qC#*$s?|dto9{Gzg3fe2N#|*e zTf%P^up`%k#6_}(4eX7WQ7Yp?xZh2@^mQCMF zp(fp+?TJ&~*6w!LNG0qr+Al~HI(#spoo8+O*qxI%?Gv$*FTesoSX6nKvHB1lEjar~ zEPYi+jpo~7Yi0_84;*l>8A0D_$xruS|jtS6j~dBU>TBGSC_q)a z#QA5@rVGfqV06ELlvy`oL5bQ;WsP9~vSEUWH8@Acv-aw}V{Q**$JaqNI$-;dB=ED6 zL~<^{zzJT~8O}806o$%MrE#PD==7{Q*C~GErm*D0m_H9qquwbo)Vu-J>9?49sX~D$ z+*2B{3-l>G6(9tVzeDln5$sjDSqQhf7qcX=gVM)Enwfg;N&z1x+hhM;$)TeJ}1xxYA1;*HWNLVHNR=<*-YZ$uj)Gz@B8YffV+#^ zmY_93?fLZ5QxdA27y)kQF^*f!?!kXynZqmx4Pu0q{m5$E^-a9x2|03`f)K;KqiW#B zl<^9aIHg}0uplrd@?QvP2w6np^?K;P`!+s`F>ntxGJc{|tfUy~ku0RrO`Y7fi17Qq zEhJ2B`MvExx@JfXa=Q5KQkJkD+v%&)W-;TKO*tv;;*hXGkavifGG}yuZwj(1CttZ^ z(Zee-RIC_Nbes~ND3V*lEG{EuQ{kUVcg*lcYn1~JBYSG%6)MeAAqMw%DWAm4+?Me! z%uhN4>`&?J9Xid7*#;@D>dG7qU@_$n@jFBN?Kk8__F-M!$C(JvI-Pgy+41XzOOd|% z?!hEa}m_%q08Ukr|x+#ai zz}YKzwW6We31Jw#hZN1lMcnna7f}KPur(9X!N<1@{S)UGpy3J8u!p}-=8#^E4#wREpC3|cvy{`VPW_#BJvQ z4_E|J^|JJBcZc4A&v3e0Y5Ozy)b-Vppe+C=EW!;9<|b|YU=&Z$#AmzW$$8n|^VRx}Yx-#X zZtC{DI1X7SUUbXyN;O}kH;}JL#zHT49Dh{2Rrne%jxkvy4fF4u#!@|f(U{#3&k#72 z3~i%u%;p!sXpwy?&RyA_PWsu`)n~mz?$Od-0T%%>lv1zk(OdWhXM{lF{+%2 zYW;LC1+u@NI7n+`;$pX^`{Lssx0o*`dCILo`c?EtkCY#w`h5^^4gG72%){p`9WZU} zdT!~L76&RA1$$@`t6!H$iJFf8%2mjP;|r*-X!;0(>5!OVX3^0h!0A4sJ04GjU8z=v z^55nrO4HqA2*k8(y9&N)B5PXl4utYVs`UvCyB z{}|oHTbi(NeR-6_RrL*u`WzHxFukb8UaZE=dg@qwln}F@kU3wqagh$!n<+0SFK2gA z+A;_M1-JMsv@LdAI`_N{vwU^qEEFPjKa77iO*(=pN8cXGLv>aA85+{Dx6(C|TyxRI z`!=!I{RU>PHVWZtCY=A@;1C`De}Y4ql3IH8^GGQRcGxLP9WgO2iZzOmWl{f|*Ah*~ z><=^VyZaT0t^T`)wS;OsW|Y3xT;huiJxiZXf9ZTqzFML!i?pF0sLhP3v8c416M$I2 zxc2YW489-nA2nEyg8o-*K$|v&rJWk9%9M+kwj5r+(o4{mtOu?k6~->AQ{KH8@9B=u zRoLp`?{4&R^>O!tf_a+VMMd?0O;IH%4HQP?XZzLgxuV);r3Whsp`=5mal($dk z2-5Q0|47+W?W&l7n8D=MD-L>)K33MKg?4fJRbj~?f}x@p8Ql`rS-G#y(%>p?(Fr zToWK#xDAErZXNt04lT^5F`U0KpEC}K&5f^i;4b$D&_o84M-tcx;@ETa2RdNU(Zqvl zgp#1>xC-cF7EihQlB&O->gZa3E_EQHwBoYc?vmE$We-=z4(sl6)0T>B#8V8-&r(>$#?t$E*qHa|`5??wwZI*1E+y%sZa1X+N-{-q+Pa{1N;>)op~-8Q z9XibmK5cKGUk_9%7W=-gnT$Ic)qQFv{{NVQ|7p_F&5O@-kwGUqXW?XwrF)lhFc?#lmUB%%GiLb&zl zX|Er>lsb3+wU=6wVzf7fi1+<5Hh1=o}N(td4|C9uFh>@|=_^8nS#6=gS0J_ciB$9uIN&qJS4414l zT<0r3|J5vM?G^-O5HQLvZ;|f2U*IQPp6`ry33xd@z)MTR;m6Sh)$!#B_}$%O_PpJI zx&s6T%%Pn=hnF=2bO#S6IXKj&Iimo(LSR=X$hR$}E)!~>U6AaBkaZ@I`TvuMmBxVw zw&>(q+puHN)9cCGgQJW`2hDe8@at7?vxaAAH;>ob?+rX?K}m*;9FV)IoQ{-XDK`^WGAsAc>W%w1y7Kw#i)dc*~f%sJ|+w*e~ zb(1x?y-@>-cPhE)!kgvAKC-#0+P&1*wL<=y1-+OFd`fcgx87o-8Z=&iJUzeFTy@A= zD-$PLCx7354j|qT5~JG)moZK&g2ZImcQL*RK=2OF0|oF8Nhf6GrO2U$H$`WoGF^c$ zzddfv-9^4{8jikb?D~H~g*dg1eZg~kYS5J%)aa#u@v}Y z$~fnFC%RQqrtp0-*?>{=M2BD)288s`e4i zgY`yJ%G;U;1jQM7hbD1EaT8l5d17Qo09E|??gxw_CqK{M8 zM$=*%wST^9G2d2vw+wJSZnnQ=J?DKK?qcvCZj*!R*1YkUnt0y4*9_`~CRR!zzQ2sM zOvpa>clC07g@{jYvubWMFrK!?|0jn&|7ZSlBsAtYtZi)$2xwo@%MsN2)%ALPa9ZKbRI*yV^)%7Aeo4-gA0YlRcMzW-C#siODWRrB^y9MM)x zGlCsJ@mZ8{RHu(|P~BDplxv34%5If>G&sVW-z0Yen4LX(jl?7KN`^@+y`#iF3b6sU zA*{NQP3ovD_Uk0!0s*`^8U=dnFIpZ63&EtjU-BxV%BimbAopB&rpTT_U&RLwk`J2h z_D7cYrx>;!J?NhHa8J_av|N0}-o>CeP%gq8W!dj&BZOK1ZYfxDpuV^~lo(LFv`%Nd zHp9?}qoeoc8QF;x2kX9t`Qkj`dfN&v;eu=jVokKVx<$Ud`70^!OdJ3MAFeGQH&Sb^ zCe{e5N%GRp#Kz&pd3^t#)N4RVACdS4)ud_}7#0|?K*2zaK6sIrQ8Z`2LwNPRQao3$ zO8^G;IQ$GI<=04q1mXqTbNy5|G8KWmQgvB(be+UpcL|Jc3OZJzIB9sX=}%4hBH(iS zII!uZ5TG})-051Q-(=MlJN#O_xIsS1ykgDG6rO+P>^np?1X?U*%-3MtdB2=UG`>5WZpDQ1%n|Se zWi_e#Gbv2E%ZjQ+wy?J>AOfAEe25KOeQRO*A^2qE3evVp#0^M2#5g=oY6kiQw*7^V zxJGU>;zn~4FSJgZxABjYp1_TB{k(OhSr!}^7{n{9>EDPIPI2D;(YHggdesVbh+J|~ zsB?e7e7%HNhYR%0t_j-`7ZP@Ef*AMk3cGv_u0O-6+Xet|b%X5Kht#=-;M+xmMEs zW{XPJ^_O*mOWMa{#=C;v+~#`;gF>B9o! z?-EaCwJfi|N)4N#kbZX0qck-zaW;%}T^|FaS3Z zN>1!qmD6shmg-K|tRSeYsg&kxUNe&Te7OgUgk7Un6~KhA}!3f1U>A&lMEXsi6R)k4n+ONebv>8J9k+#Ue-^FO3ac+M5)N9)y^VO$Eo>X z4eGxiQA+W7wV|~@pt0kUiSH?D!1XPmVK?j5D4pT<(5Y-_vDlR`Ei<9HTcX;COuPaiTNH5|>njum9}@j*owJ zySXJdYli(h|T8#Gr_*i zF4N8rhzt{WkG;tG6$pW@+S)XIhEzk!2Y&&cVfa**_4DKoOjZbAj2kfmzuoaH4qBu` zOOC~oSBWc6>#*6`+wVM|ARZnbdfnaNC~QI8en@?LI4U(uZ)=%e@;c9&#-a`@`K?CR z)Q>-z)x{MyFwf~LzD=`LF|6|&O6r(9%60|RGB`a311*W$n}?$J(vcCr?cKV14hrl5 z0{S`YZf-W0dvVlW>5%$^X9vU0c@-VeAI~iHQ;l)#Es^9cpG?&}Lcc?{9&sw`_(#zb z=ENz4EH&mE8c7?=Y<36x;xOHfs`+^vv)c*&79;65n8O$P3`pU&8f29(^zWji>|k1) zaa03iLCDbKh3qXARRV|=PBz7xENGE7no@n_IR_#3q+b>b8pTh-bvLY zTN331@m1pJ;7~qgEGDU4MWm}HX3U>=VlbO9kKpZ5axV?t3>xxHQ9)bI1|td+QIp`b zQ1)WPke@&eJC9}S9+?{wKprU2o)=MjqsFubR}Rmv5Fx$!=eI+5-7y4>l07M_Rc!|G z>lc<_^Si4i_8HDTCj?t5DUZZ#buu>17~ zBJK9Bs)5CwTgBb2q#HZXS|SF4dM5#knZ!x*FU^-t1I22CKyR|K6%UZ*m`W+3F1ALO%gPC&CM&)jf}YCzS}eXG56Oq_Af3*e zF0xoY8f%*9wfoKRf_o?No68-q>#O~|0btmSkMfwJ?tyq|w;Y*=i~dB=4fF6Ju^HsE z=7Ace;eorQyC>;Cq31c`HBJhnVAK1!ofTyJs{8^En+&iDB3Fu#8isff0ijg`IeQ<^ zfiFFK3%51Xp|F&qrby~NE5I+>`SfEN1k5(py_N0kmqIY4;qw24V1Bte$%iOS?Pwyk z9(>Li0-Zd4j%FWu=h^Y{4E2pr6>RTGc*rI-z1#-OZ7{GC?wR0RwU7ly1wwAV$D2ED zi*Cs#UzmC-J`>L1ln90 zR}Imxvi(qxGW>X}QD(Cp|I0Pcq(0-0UzSZ@HvR>>b!3<3V|3Aif?NI1SWeUUMySE{ z?fgH==On&1KmVZeoqjJx^ z@JU$5))rWj=Yb!^!afH04`Pe#x>ZL`&Qi;kyt@R-kyatB%IGLL8kLEPnXB!`vo~YK zMl&!%qDDU%F{l6vBMMlk$JJoWpah!n6x1Iz5FpmtCyE=Ut*j#-p1;Qy*P)P1oxt?@&<3!$@|GD6kzyt001pEE)@1#YSe=R-U zH_O0Mfs`;J={X#7C^11oZ6lSR#vfj8U4fsT%U3ybxFTBQ&rgpx-Tr?Lq-Fwp2Ypex zV#*;KDf3kJhn2_8f#H;5&+FLA=#q$@L1(wb-O%s;bjb1>UTC?|@`s4;$DQ5i_o640 zEu9ODx&@4~;856ajpeK}3%|zN<%JV1sBW4qR{~%%B%YL3 zQLW>VrBp2Y=8VIXTNHPoBY8O8ujC0rKC^-ELoLYG#kbobW88ge$khaTAo{i1=bhoo z&rtg+at;=W=XjLk=CI5Mg_d%FOk{Tkz~)tQ^47mR2U76e5$jD*(yfu=&BO7>P>_ll z?*Ml#uZ`?Wly5@F{VqO~hPk_gj|`UbMlu%vmqcPzJR_K8iBk2SZ14{b3Bk{-?>i!| zG|d&D_d7hp-Jzi`O5c6vKLztaUv`3}DE+yAeg9#Mhz;7b<>a^lZaGX>EjgWn+V5yq z7i8T|nLaHW@#C%wSzrCvh4?bb()ln+vfk#2s25I( zNe(>75tUW}rI6DYiZa-K^xnnxvY=iU0n)EA50-3XYc^W9mMPmOjXBe|vtBN@ch7*Q z3xtY2KG6*gTyFYsWOjt#jFvQx$ri7y94G-9LlfZvop`K&qU$2-^$r9ZfCSg zz8GRakz${4Cu4Kp37FKMy zbJvc{;#jY{Y_q09#g29>o{+uVmLIuO&OwtJiX2u(#E}CIZjt2=e5bvn$C7IwVWN{-PeKm}W^=fgqY%pK{ zWy?dw_-nHT^Y`WBkF+e#uxMGhn!t)?}R@QUo zaL=^z$50g1qeGLiF(zO7xnC8-ui#2=WDKf|+W31)nqw{}RU^ET`-j`6$_OmNs;G3$ z*SlWVujkMU`LABR#hojBIPQKylExSm=y+KFhBiyO%lb{T`5AD|Akz0TDnI7xt4^j) z+VHC1yKV(}+%&Cyn59*`bx*x@Uy$3SlO$tI7J0Ez{tD@pfy+Z}rbz#lc7GJ^&mqK} zqZmIi;B$s&*71LV;TH1$pe|%2n#XjSZ=*VVt}k|1@B)3W7fL?n4(7H#%${z>5}I%E zcw2S3P45NEgTI4L0B&)?<#o)#%oU6+v`!PxSrn}q+l=ajE^0@xX+(Jrp>1aQIn`i2 zp312H*=J-WKnH`hc3C`v1S6SY;Qq}TAhh&qFXmJd*s9C%WcsmiK>0QLy9Yk=w>lBA z`-KUngNZ$Xd;mGAOq*5;2dRX)afV=&X*zx^jRUFsW6zsm09cnd-r4#6WAL^l$7C;L z%SaWv`b!5?Y@Ly*Q8}RAD7-|KZptN$gBg5zfIA_nUc>BsBo)YYwFKzPK|Qd$d+MT=tJo@wJG z{Ubc-uMEF9V;BIj-jcDmca%p%5O-*Y=jL!iz(0xg4o|c=?yEJF)pM!7h^d+pti;e{ zoja)LN2|6(3foS0AtxOz&L6VwaZVGvzB?T!3lbQMJGu0DhjlAGi0s&NwS{4Pl%`da2cQR~t)n216^3&Err`2P9#gLqU% zG!<;USyB%}$#cS~6TRkeRZ`H(j%oO9D=Z>OJo1L`A?-^Ek)xR6k6Z_sl1eTmC6Vc% zf7C(57HNs=jM^+|9K%vS+e`)emSdII2vb<(It`MLu%=i7aNJAtrGDqV{XM|&C~|P47D`d2Jbel!?fn~@-17)R!9Ko4lTEDXqx zbd9^uY=hrR1iFJq*TkpQb7ftvl_WPTeZcAW!STEFDT=uBUmY%a5sLs-ge=KuONW(#O+5!Pa}0q0k$8X3QSqX?dAooUOR&-H1+j6}%ny z-e=}uMo{~+E)-juC{7S;`7laNqH1U}!bv^tZ;llWiZbUohF%tPLw%F!U@;^ z2Q+HzKfm~{M&hNZoU|&jx|cNFYqSl&CNM2Iq79li_V@!Sgi+9Gj{Rc#K79#CpB!OP zPDko=Z|Fz+xFLNf`&jCMjB5QNZ?}hOhC-me0z#6!@`UZq2+yC4&7l}L4jauO4hP;1sVP?Lt`Ml*n>`@=AZB%TG%se*bgm+l4x=)n=_tpPF&N#b3ZB>;7OBet(qc z4E!J+-ou!#Qs-Xx5TZ|UGo?wrjC-QOKQ#n*U4aGpmS~cOhOy0 z#n~E-&cyhsz|lrcfUsOC6PAk9)T}sdm7v%ndN^KL86-iB{mTb?1}Q22mxxR$nQ|y~ z5>hs~_cHh!QH&pI25LoR(ODgmmB>k~#A!>K~&T(nyVX0WBCDAdc%|8l4M?&SE?GX~ctQhpD zdcj6N&}psv*D#djtNIUXKSP;KfWV=?>IV=lSGMN4PoCaC+{e(k9k z$A`s9v%yE~F&4{H;2b{ylv2rE3h52Jf!%5@Hmi=R{5Kvjjk@0zRO>M^U^}8tDHYuQ zm9$mEb<~8kS|ecq6lBw$@4d49=_^;w!%GCU_ja}mL3T{iEg2V!y2-ah4^oD53guJw z6P7AZ@zN9jZOlVJGrPLz|1k@xDK-{?8!#KY@6WrVTiHUdcOrsM13j;Aw-G%r+ojIZ z4N_;7#%AtrIVmboQvrzq^&aJhiHkt`Z(=pwPF?9;6H?FXiFei~B%G9>|}DktW6jmyZ{ z$(y9=yokY-?*!v-l`nEK#~>Kd!xZ*^nCkAaXj`9$Kc0JDp%vmG33@W&k%mLX+H;-p zc>c6x#C=I^UV_JHjk_De^Ln#<#cCJkN)Ee4{i+!vedUZ;QY$+|qF z(YD&6(6+jRiAqMSXiXuVYwn?20rxoXdx1|iULGJldlZY7%iN4ja55n&MMn~Jr{{A9 zKgV)QV)ej{P4Li=Y_Fs9!(aW^bHhL~vcP{7@d*ia_AO~shgQ5qt<@muoK^Ve7+It! zQ5i(^dgu>S{Z;T_G+vh7*V7(CqI<(V7F2SjCL^znb%BUxdk)fsnNKLVF*MC2iPM6jkF)0{76f($>paW}jyY9O(=Sy0=^IkVL z9P^8Y_N7eJ=C@SAX$aznr=n#Fd)yZlJJh`?Atz6@Tbsf$3;9X99*YUnxWCzXjn`q! z5yIu#aZ{LW=5qgX&{{;xa1YFr8mq~3aPHMQIB(_KHCz{6bR|)v=aADY(Z75CST57J zXO%LLf+rY*+4QnAj~hGx%*r#x?r4~Ak6TIzSI(!Mk514<)_Li!tP_Zwa|Um+1!0F} zkzw3vDn{#y)kZ~vPL_h}J3_Jw^w&?k7xkY+3hdu4x;#JsQgk_p#N|_2?1Tfqe_r%?J?p>wQQD5S zwEj?n`LFr=`lhSJxJg1;0`#wl=cnj$51dJj+WFjF3^}XRCgn6;kfWZy^qVt51~!Y& zsmgD?3_l3To{+a2L*hC7i=23RcEu{)aYGZD3{~jlL(u*lraf=_AeHYeE<5izl`zsn zf#m4h<;#`~Gue5K>(Tr5K@WOAwPI+C??{Xz^`I}mT>fV}Wo%+iai+5tV zAQFt1z~YH2Tzrs347?7cbZsq6g%*eoG&e?Mpwx+BTFx(DFaXY}v1hOVgl0+o>O z)6OnfV|EfG*-1|5iAWIkf@^Wu01TQor4`ufwobrav5LxJv$q7snI@H~Mfj4&?sVwy zwz;00);A6wK>v_?r9E$G{dG-<2f~DkHP%||6-a2_D7NLzns7Rt)Niye>D3g(jRCbc zhqwa4ise_O2t}p%H0lv9LCgpzDTi%H9AlJpi|9l@LeIplafa`rYiu^QC8}v+#&vmQ*EB z0_Nt|b9+`iD!`~v{0mAN6FPxfaqt1H*A7pq70_0y)=J44Wf&fo$7_#JvZ#&Ln=8-W z1=xDc8+{pFqH>uXAC#ryJ*E>S-{RLTbM61?G;zz(ly;N78OIyi_NCxVLc87K5;M0N zY@vX6kzx7uC^=NE?%WE=2IelxIa#%vaBH8fxaG|9?nk!ga&^V^|J95-%Kpze6aU5D zx0E91u<;IJ|3Y588s-7wo*f(vPU#=U(|^mFV5EuAkW`$<{!_uNFHDCCCO|k49zpJBc|AaCQt{wQ6lICgIYL{cWnO!gd+ikOu%sn51 zr#!?bCZvNkuKt@IYS}W_6ZUa144jg8vX(e42j91qk>np+?#d9P3#k)*5Pmd|c&37m z48uaY#QClA4H4IfCpB=(#<5nqiX|XtgFXkhqUWMQE z2>OzAyInuve3-fx(&59@Sh zfg2Le@VoaZMKW{3;}ctXN(v({Q*iFy-HK>;5!OU1Z%xT8#E!K5j`z=4=H7DqNH4gX>RQ-+Z)Akg`uA_)Yf4q8h!TH0%gtxl)PYN zatah0wqrpzK)SIGP}5qe6WVnQ{n&Eyg2dwR?i?QKVPv;mdw)V`P&)YZqQ8*+CN4Wh z=zxBG=tbFDq`Q8ZtW;7JC>u4t>Me%$qB7e>HMf#>z($2->RN5K1Mi28^& zgK6}8APpl@nxEd2G;;y-+y}L%3%oYIvxei4&3^HVbZ@{DB6oC*wEDV2Al0zy2gWx2 z|MqcNQ+pjn{6hnu&P`u;Jr!$@7{?vDkp#M-oS-iWD8YZ|ML4p8{Nb*_cYg5;3j~F0 z+ipC=bX!k=t(Sf1^)7#`aQG~Eh#b{F8a~w%7zWdjdT}q$*dM< zuSS3vE>+29ipi&h`Na`UF8F%&N#bNPl^*J_ux zhKDhzWqZ2>D|sQ}ffyH>bl%saX?_FeK3`~j-Ie?CqfH1OIZQ5|zp}3X>4YJBifqT_ zg_tNqf)K4*54bvvAJ%S=JjBtsg+X?PCcah5??SC!e2{-(x+18ubs$DTru7e=?rW_T zI^BuyslSx~GPr-OxuQ4!+ZtkV+WvG@{MWrNK{_`0nk9oC*1MGS9$Y`>GnJB_TL8^a z!^7Q0nmN}xI8m=Y+q?#bfAARd?;CmUbg8hYrs$nC!c?7G8W?T&beZL1|H!d(a%q+K znL(ZgMepSI! z@*g)3eu9}%>oDbsQs&;uZ+cvuxzPX#(SM^=@>f&b<*O(sx`SktiA}kyCzhyD4UbTLxvb!y#=>?2whc&DQOUROu&**&gCPvE*4Y zb-7ZD9i5D=3lphHlF(Jhm#5|X+!buEbmE{7_nk#jke^J6@|bCt)?edS1)_?~Im7Mu zWiL)A1tn^Em9tHZsD5BgDcA9Wa^1s`m~QVnW}^$E1QhQ>wIZj8sLJiRUWki7<3)tT z^dY~~udq;pzm%dLKngk~WT9mAG-k&7TD^iDSSqf*WjPKmMAs6JXbxUT*uv-a?~5T2 zKPgu{R^XC5L#g$(TlD^=@bOD^DhzoH56GWJ*i--cxkYqZIi_jcx!WfiZ%n#%wYxVZ zrPm9I7V10olxtX9&>`h#Z8>pRFkf&&c6Z;b7&W~gbnBGEHq^Th$kYIS^OQppJk_Yl z-Tp|Z!1!3L{DT2ksygcw(Lvnb_*uKC^lSuX$if0 z!FgE1a=3CoftyxU=qGIb+D$`|!fiv|#Nf6Af2~h5UOnVlnms9gt(KVcH2bC)MN_^W znAV0bXg4)$2@lPuD+K570(;Zl5-Z7$js|R(m(xA;Fsu1GZjG?z8nnE_=M%mKcq5(} zBC!b-Q*D2dv`)@SN&inRjQNjR$ct!Ag4B-jdUC&eQ*kNsc4ipx`g-m7VbT!b?5fdr zvhO9CTozn~Ffo{Gt(NyC#mFYP)49kZcQ?12d(`csY4FV8+^=ld(crS_sw~mzx9%vyuviFv0OkjRcF6U#oj29WkN;) zfwOsjQ3K*DKBmgEyb=B-waFxrFypbhyvzZQA!xO~*k1*>Br2TR~TLg;sJmb8y-5O z#yn)jM6em1ZMl)egfQ>jy^VBh=p=UfgFMw=UQYlDy(Wsh$A-97!{!$Lyo`ufGe&Z3J1(m5}U?5T%X4uQ_h78PpIOMIL(E(x{<7t<4Pq^MhdB{p0jc z=W}l6I_r|$%&CLcq~Bd-(Xp(U%6@e9GZvC8LxwFGO~y1@3@C-cV6-=#efvasZwlr)+=hd&b=7mP9Jey@>KYp(zP;7d~z~esSq^@ei4VuF^VzXl}!BeHr z;a}wABIZ60DXJ^G_$}IMS$W&qdD_cUGYKw5dH{FXn~Io=%BzdClzR-yRs_|rLU*13 z-OyYWgAW{qpwB5VwH#ZXZYkna1!EzgKjM8)U9!cU@_{)xsgZ(;oBj`Kg|CZe+*ad( z?tdxR7j>DV`1?zyJCxjsy)O#6#gyP9j)-Lt8+qy3b`hiOw7y00U{tG58TAun$bdPc z48p;21rSh!fpg5r3zErxCH-{X77$%`YRo424WR;7g zkK~&+`7W$zM8v5@82<_FK$APIEdQ*v0?x25h<+{XWH1B;-d(-y5q=DMSq^?ZiO)1$ zYw9Fd{x)9DK(L#wmW*E6AU#h+?xWwV6T*{yQ*ACcu{DZVNa{e4y0bu~&sdLPJ1L2U zUm`r}!h@dkWG=o;jIH6U?z~(Z5JyY*ZVc;FxkhbxyX{p~A={a=qMu6`1ZfNz^$z%m zZ~FTWVv4rUBNWF>CPq-V_08fagcH^pP;6RHh(wuzT|?EEl{9R#Aqd4AL3;}*#u0T1 z-Hr0uIeN1D5ehZ*LBfsv6pIgsUAQl|rfdDL9o%a_M0y<-KwOQ729Z6Un!Cpem#b3+ zyNdU=m^?GDXGCze*ivcZu&(_eTJDM18Ns?AY^(8>hhSgLZ0luS@Ohv>l(2hh5~^%cR($IyL4*SQDzEU8lB5~h&+yjN~Gc*vYO ztblP7;C~21#WKOZFXL9IBSVj(L$kNj68|dHtf@4C{cRqb-YcqtyoA$JO&YaxK(q#? z8Cgxo>zJ;2Tl81lFuPyObmD0tyF}05FER8qh+a#-2u{vXb#pS?j6M$U-68Pmh02g( z`6@?!llqRdAO#Qn0#l8|%pzTHi5xUB0Dmy&t?M{PeE8i7d&}9fG8?`o%AKdQ3Z~BP zmx7*lMX~(hyYVs`Nvu)q`J&@NG)Qz4hS;iq=1K3fLs80#c+ntKfB$po>qb+9{TH>y z21)K*l%Z75G;Wyyg;X&MQaIPB1ZYzt$RN?H?Yp3Vq39)1cCb<^Q7~%Z07Ep&{oflX zxZDH*g9i`P@&k6(PQ!Sl9gI zqOINvIruFdT|=;Xq&V-+{qzn@c<`Wz^Z z?^yMj_mXoUOa^KJ4NPr<%vgoNwJMXJXS=!GE*+RJDDtV95EI`y`{ahzg+98H zEqRi$qt0l;*H{JPSCiG82K)rh!$OoR7JbV|r+TCJRN#osnc=x`2>_eI88cuN`v2sg z3Jhq(#Q$?IG&1vU?HyCgD4%71|B>W6Iyd8*V4zP9N6l|XV0vsE&fdI*z#rb%0j(zt z$+S^l*OTx1kNrv+yBLfv5e#EiT^&0-gZ}@#R^q z>ZxO`}Cd1&!#<*=TTAhSx}F zv6H6oy?^fU`KZBRIr4O;aaQ~3HgtTro22L>Wh*(C1=nj6{V2~?XZs@m*q$Sp57Rmvd&qbOJv<@iFjK zS~qF_Sw4&?nA7zCWcPm(ZLA6ZfE7&ns@u+&Sf@5kh5uehPl-Mcs+tPF-E?&46sRzm zCnwowE2E^LSj-X4dBRAK7ghqa@j;IDIvirsh1nmd4a!iaV`xC@u*Q}Mq%oRLrf)))ob1ChS}ap)-cai1Y5Dsx3XV}VK320hiyv=KEGQCttYJ({PPk>N zS9%e@%NaTU@bCCWo}pb<v`^X54f^P8uLtC zK4Mgw72{_jC#T|_kLMR}T`pdAfH`mpfYxALtPL1fs3pDr62aVGnW;n?~E! zqvQNNrhcU6CoYZelHx_m2_t*S%9gtRLq%rCz<;THeGy^6bZ9>=c0jgLE4|vX+{`|FCBsb2+^n~EcOH^rZj5s#^e!hUvvzR< z&D5wMHA~)=M^d8dvihe>gU?%x?CEzpm5fNr-;%9l=kly_-I7`y5Y!yZbYuYx& z4}B^0<+weOa)glRg=A;g3&Bp$dm=vPjlSrMp7_5<7X>@5J&$HgU1;ZoEB*+KEO_6;U=4JOVF8xHmQ&h^Vq4bX3+y1}4s+K~_I01~Mn z9EzZkf?MZmRN}2_yttq_5ZH~lpJA={{Q}48#`&wgnD^z_!qku(8gl7B{JMj8%e(cM;EBom(8{IL0_saZkJiQZ> zveP-z>r2O%7RJVLThz1f0v`5#1G-n4T)+&%H(scJS@o^T)0FON1I?X_0Sne zF{=DF)4*>lG6%1ld`?iKP|bF>K7sfJg<=~Yu3M?KozM5GSD$Lif_zg0Kzzv4yk@3>DASrWEG*PmIZn=f8Y7+vYX?QlVW??iS%~xcY?CzW zh0sm7l*z=35p^Dkz4rl2j7YR-!u$&Hj}Dh6(%nbJVf1MD>`{8ZxeI)U&X_UiIBIDN zeFe!xd~eko{UnCi?`q~tVfo=vN4%>z_*;mEh*Y92N#`99Pdm~qfxJlCfbnFv53R6r zYt0MxhFV`lDv-pc%B7$5gJ=AeN5nUrT#7_jHxIO_e88VSiZLf@x@0C@1X_vWB6eFX z2@|8c+f4|fuczn*qQ=|Hqkvl!2Tyd&W*iV;>w{s}f@Hi`Q|PLbx_bQVEb&H1Fd=2| zC4m!pL7`RDs>8OBsnH^g-A|gzmVl5!>;w&XLxi7e{)7(@{I#w*eYb~%fc^^ zcL;t-JDRwKHy^vqD_MYx67U;ng6xNa$rIlO{hFa)pI!5iU)PY;j{&P65U*yb4wKLo z0vc70cS~~6yJLy9)ZrFyRS8zT&;D+vho2s_Dm(Q9&?d(6y-5MUjlG2evjacEe@6X6 z7+@RgHc~7ir6qrdQ&`5$55qu{!mQAOW?f=mwr@CR0anmVWnh<<=8zN72yg!-IV~Um zFa(2w;0b1uMoB=eOwGN4NK6gZb&}VT^XrypBW6Q6*@!ogqqtXU=70KhsRm-P~&jdkIi> zpy#R9(0l7D~&7*VxKOQ-ED`P5H>&FLE!H8wcH-O2E+$kt zSpk}CClX(?>o8#sA{G|LvEAEcTsrpQS54}aO$6-~GW^;bR3Czhl=AU&f6~t7C-cg&IG>$ zZ4e4q3Q3Y1j19lT1l`{t1ic*zP#9zFdxTl}A?4HCv>JMP@E~5Ymac~B!z_b@KEkaL z49nsMxco&7dMfD|NGxHT7X01~=Nsyces$&di3qm{e2=VfG2PNf`s>|$#C7cU8*x)w z!LVHZnl}E|k9F!-sKh>%)Z^2cmgIV5R3;+v{qsthw4uhKm;|)IniGme>ev2+`W+QA-xK<-(@umAOciNA~fqq)rsO2UX+p8O*8@yPtIcudMP0-A>x>ltI_ zY|aDIF(#(gJ%6Bx8bt3P)kk2jb4 zbl?~L!50)W^9bA!BC;1-pr2dzGKQ?e-xUR>g!M9u_EWa>49=dTb)M#nX9I6zwts{% zpu{5MO9`?s2_jiA5!s7tBaC_4G5)rjZilV0Q!@+~1Mj?keQGHDe2T|nt)yc#GuQK| z<%Ahc`wRY>r-Wk}cWz=vhq^ZH$Wc#MDf@B+qPa!e8jQ*peb*&Aj^N|tT5*O`xCkDm zWn}cbZAU>y z$c<5gqV79gn%zZea{*5s!WGjzWVNm+tF&Ue+zURM+iI!xbhFqUY={36yzwrr-$)DhV2!{#_FFDYLr`k& z{k`;~WHn25b0>PX<8JJ#B2b<0dvmzN{~t4(|2t+rWJEYXmF)gY<`dqr_Ei?yceOYd zvKx=1LZ%%m3HKX*i^MxgiLUshoAp;sUfexR`mCZxCb_Tk$EUrf4m#G(d>G0yxc2n2 zPzyK7M5zQ%Wf)~G{m0!)IQuY;WN{fJzskwtEw~(NHnq3F_rSnljNgIeZGqZ&YWLHe zo}6dZgqR(0s$=*0>ge#q2sVj1md%#IzfCEG;iB_D+Js?uz-?sl+aBntClTprX1)JW zjkitll)`D{#()$C!2;PKD%%(4mU|O(9k$E(t*`wEW` zl-v29g$eyLeF<%t4<@#H!G4?TWx6yt{?;pW>{gMb6^-9kJyEwvdAOU#n?MSt384wL zArc#InP|E_)ImmUk&01nOF@QWu}{-3j7ib8^b_v!zGHE39;80s8HS!RrPyNX&%wUNqED`1YLm*1PE9d2Hk9OxbBb0CFwXHeI zHpyY?0NqFJ^*4xTu$mmP0$vN?>FHeMSGfogIm{f}9P1);FyZFCw|3<>G#9ebPu0Da zyuCJSka*Aud=7Bw0hN`6CDZ!h_=?*o*SOf&n}~0?Ubz3$!FB*4UQUQT`GAlQG^kMx zwNub14xSmdUh)P1(e=5n5jt#PZc`@RDo3I%ZprOr*7b+5sZXGUyaab3G91NpND+cG zK4m=>>_;d%D8Z!fUAypBD|X%=wgYn}5UXwxtL70`=SgzrQO5=WV|#$HNBo5yQQrT!4MF zv;M2{4$huQFOH*CW&)q71*{xd;pn2p!|ynhMHH{Ez3rn_#9Qrr>K}@WX-KM-D6Ogg zVWIezoOd0OxfNCu$=;60$D=#E+rbPJ0eVNKi&Nn;1-IrOFHTM7ep!nT5pYafAPRxK z5E&5i*r6)6d!6u#oVQD=H4HyR90vlDiqBp0@RM-i2jG`=Y*rDCg~G%UXzXOMUtMs+ zlI1s0Ut)do!lV^!lX241J5m}K$r+Gyw(XZ-LqtobHf8=AL{Y=@SVuHJGBEm4Bg|=M zjY2gV8wp+;jkX72D)4JuAjtXcW%)U0Z)ei0S@3Ejv7^>rXEkyC zyJ5!}FFHX>h7xz&d!Qz$Hb16#KCHXhdGF>Hl#)1kWiT-D3%3d z+7C*I|ARmg@CHBTi*`-mgy!)Z#tya)WmXQE7ID2L(w+~5sl*`r@OCc>VW8|x{AONF zKzP`$6X+$WAGThR!6eq7YsB`w<f@8swaKagww6|JYUmy+@0%>XofAj1CfPFad4h_IbwHf|E~8TdGua~k&_Xf2%pg3M z`q^mq;uIPfz@!EGYCZtj-4h^KCs~~g`?2t35mt}%x%;>dI0EY;gy{;5D3nS%kcQF2 z{aoP>CoUWs7?QSOpTi@z>R7+d#$lRo(JUyt=m?p|5vBcpJnud1veDPfv(^Gg3uS#V z(yz`?Au>{;|2!2ta?LG9iF!5v(rxq7KA<7ctgmH|x$t4|*UgWc#zb;3LrE+FS{50u z0c`4665M@CGDSOjR3x49gtD)#L~{+;;EJ$6!JGy;huQ=0tTIH<+KHn%l81l z3;k)2_%HU;<_5HHrp+eK>n6lK^1pFcG<{4v2H*N+3gml_-w7AYvz3Oc#an4~?B=9B zUe(O>@8(Q|w{N4p^RW6~TB@_>KL;y8k{8py?Qx*aWW&)k==OE6gdJ++gD!vD9*#%6 z>+(gqnmRkPoifG@q?8WG*;iR>I#_ias}{aQ*$CHieAW7pr}cr{Fo8rdjV6Aibm*b2 z*Jhv)HI_cTB{Rqwvyhx=-*ZcSRNE`r6O?v>IE9C*o^Jsk0#JtFg%Bek zV3!5Ph6!4T%TW6a!XF`D(h!lDiJInm1=lzUYXfEFPzkLb74R2P^7&t&u;6)-nNT#?y6qVT%KA zP4z|gKJkACo&`u^)jt$2XhK7qjaa?7RO6^cof)bk?n2dkq}4k1ESbzKnTjkKXbu^Q z)w+t+nTp@X=+>;@Y+E@t!lm-Omy@SQYYKr!El++`?P z*P-jOU}D5fan7_&6{9ilc#$&CO_-58#p?;I^9|8(h3CYg##4!PmxB0Gzl9Nmas}ga z%MW?q8Te$`Rh<$klvGd3wH*nh{*MTM_Rs5x8~sWbU0>gI>}$ctj-H3(Ka{y2A8sz{ zC`4XncCJcP7Y+{iI>xH3P6w5k(&POAj>CwoBpzVuC>Y6l{E|wd+1No3BQst{4$)dr zGVAGg2_8p~ERT;CLWp8v9QQazcLL0`w-Bx6S0fbRo=2*99LHB@ybg=`uE@nNw$4am z88YX&eE89a)ClObUB1bz1F1k`fT5q`$M0IW+L*7brd#ct(dOA4T)g^OE& z4dEde;sqyE&i+LEDOB$b;|l{+iim@~K-eL-8zWjp>3$yZht_C#yFL$La0q81k8k52 zrr?uVy5+gSC!^*^((e5#K~5|dOiVdN01gISbN_;U>22Pmg?9lO7~*~Tfm$2zU6*Q9 zOdYy~>i_2WA01tbCz8mWTOKcH9|qGebEqD+ILIGD6yHKC+BSY{5;(M%*h~P#12EW76ZTH|p0& z4@}DK9Uodwdc4+AZ(q#$Y;ew9Kh^In1D_EQo?Z2PH z^XU3~Kb(F7?%=QVN2R4Sp5r%gkZVhnW5Dga_|CQz&RV}>v^}_w zLa^%Y(1B5Dh2qj?Qk+!iBnk+KjMEbrAfgwOORetXy_z=B&=C4n9qE@WACZVnZD&5T zwjW2J*C}3fxftC{TfYjPoFKP3Qp-CE-f&b6G5v7Rsao32WBy5`70hdm#gfGzvWCqh zq=9L~Eip(#1mwtMQnneQhnT{Jt$ZzK1ghgZX)r2Yk^>d)eoHF-NRG#ilL)LiH=(3F zC&vMLPIfhq*6>si6DsaXDO3bZ1u9=OXo_Y4CCq3I3twzj&iuW!T2k_Y4PP2uk)J5u zS_da-ZWG@%YcXv(@<*+>@%tQU6)BScYzcBRV0Z2geDU#W@>NToaOc&t_&+yL;J>3? zUk3uNr%wBPwPAi&N8saSv~Kdp*X2J`!MADiv*nat>{BW)ZpL3d$4XWT8+sW&BjlO! z_lpgN&_TGCz<&0EEm2ILDGcW+Q=GHKCk2)@7#w!JZgN!_S9?(Ba*xMm4{R`%y>%M{6gS&=u4Pi zS~K4}$~JglB#*s;yV&C}-UoKIR^<(NS`zIvyX>UNC?VYrh13jMei(8P9C{h;Z6y_B z(wpt2V!}mH5zhUSl_10aRrzuz`eM6-G8jgYJfKycNsLv(!6=noCB#f%2KWg~IujuW z`05w*tafjpeGi;_HE>4;q#W8`d;(BMwpYR@pxT5?$M(0J)SJ{a=&^B{vNagh)I)bu z2CVf4;|(UzA-5CY(`8FlQsN=1YHE3#(ggcbSV$KRLHJ5Rm$5Px<98a0+ z9a-WOrGg_r?0Tv3qJ{lx^4Sc2TRTe=%$^q#y*Zd+ojqSRW;$cGwQHr=Wa5-+!RMo* zbH|1@Rm4fhAO2Ly=drGff(7pT>2Bb~-yFzV*DJvpZ#PP@JPQ6XYHNL>ds@!?%T3Ku z$%yYVH#vTjKnN4@6Ro;|u8?BKSo0rVMi{D4(t>Fz{BDWb@0dr#0so)SLqWg; zaMDB+;^&)mv;@(iLFP1gKdxPW(F1 znH!bFEp+51Wg%o9C;S8Nu3Lq_aFSl>u8a146(7p;SRq*OuBV!#;OOpa=|DO5!oewf zcDlD>x>VQVJZo;m$-+TTrc8Q(Ge#$4$R8yG#}pqvDff zftopZF`Rg1eXRYEE+{v9kr=#P`~~~3mLMwxN^C3d576&r(Dp1c{HbqMF{o6+SYsg; z!td5f7^M2X)AM?zSQZt-|!xJAi&3`%?Kx`PbdSVsQv$?R3v5xrf|01nvphEK01G zpR}%CqmEMuV~$=Fw>oN+MgNuUBwbbTl|8gp;mJ%cFl3h_5B&i z9%Zem_4w_g@98RO^3$|vS6v}1wzGciPL@Xga8j<8EsFU;*I-P@)6-G2+q;|j zt8)1MIsv6qLe228gZ*t!9BG5BQAPLh^%>Sb*N3%%YRV79+&Tb{zk#U#(^V$J^N@R`gC(aXetuWBlPhjiR3t#ON+Bti`o{S){Ba}4Emgt*RR@{sd`f)|%R}LEo5Iw$)R;WGc+>c5ac=37589VCE>m(SfUxgJ! zhqs6!9j-PBw=$zy&RqN*h$|UfMH^dBPmOp27jSqTPFSSf=bwxvNPgb}yEI#N&bHOQ zxQyprJg<)Qemd4A2HC9q0P@eezJq7oDlL7*p~9XMH|?i~O>1A`f^&d2M(6LOC7*tY3lOi9Sa-M&(xN9SYw@7u4MbXfD9=yB zU4@*f>fJ9I4HJ1UJn6iyK9dljwrRwWw0*{g=_h!_1mxUzdL_u3cwgFTXW?zCc=pHW zYWLAtbQG&~n5!3#GduLz8&F23N>9{cCF#TvVEw~uyAZt4X;2Nk@ja-3-HDH@@Xp23 z;=U68Fm3!j@P2&_zckoZ6osckD&lBuLYVll#dKJZ7`BYT{^2+6)^*cxIvw{UaN@8O zxQ7T9npD(XmwCFsRi!uAmvimG#KD*9sV6O_aCMS5#yI5)D_AhN@) zSLZXzot}OXm2RL8gu*kuVhw?DKNP7mU_{?5ICeRvFlf}okzb5rJi^v^d(tC91>SIR z$9&d&k8I1Jtp@Q&H0R9&6>=xTC(UqWvlo(qBSBd%>|{|t9({Z_UtfpZU+G;R^cHI#txks853Az1 zKP+;qN7kmXW|MFU)GVas+%4Zk`P#_dXoTE?xBs{1Px7C+%&6}XZER`s<@)sP=_njp z71ROcw!ic`2OYELcP2mX%?!j7lNMv+RtwTVV&AbDVuMgN-cR3Vh~bCYhmmtSSWJ(j zS5`z4bGK20EX9?fW;}E_djGx3U<<@BZ09?~FPx1x)(7`RZ5dh=dKWoECrJgt45F-i zjh6xv$V>zm6070Stj9`T1ovA`WC@w0-$V4qn3!Iia09x&ku(w7t_3%IdLpVp4R{jl zBFM)q-eZ76t<$P{B5m_NAliKVEgJMXHg)wdR^FC9)nM!w!nAZuG^DrI=?drVyxG6r z;SJr=hL4o2JDJtMs)tW_!Fm8&8VZp)cjOUphmHDOxu}7ex6uPttV1dYFPyC9)%_=T zlD(~3uQGu}1{NHoKI)&&{h9{dn)?Q!y|s_{1Y-ypy#~~MYhE4Vt;YR6;xrWaoJ`jo zNz=`(VoBoppzv~Q#+0eG>gfvv1giK#YkTUll`BCknpZ*gdOM9)f_fg`J&g!O*h?IQ zNfKeNemdr&lyf$djv)P=&qR?=8h*A7DR`B|Hf6177hBRGCbU{6pQ}qKEKTgdz3=_O zcBkxOb3L>=F@diOf=>3{E-~z?? zJ)zifIZ36acQn$rwX;4nw0wsF0 zS`3L!zg;=#N7y!uyFP9nUEx^s(@r0vP-Mz9I^v9YTe%>6GK&EPQ1s^~W0#plL~>7X z>v|K0x7>Gb@ggWaa1A*ooLmv?m!z#SC^|M!hR4AwpEV!}OG|gbu0k|$ebKd-nn~$b zd60jk9BM1TeLsBno6~EIEE!jHCMSdSWB=`0*vo0GGfRv|_7`ju5s$J+@`jJy0tQMd zXS%luJzNyPWAfiFR` zY)K>sO2)*M;Ua9&4a7MxnbiQ}MtGtyy%4)7TcY`a;(RTzHU8;$L_UHKjavr65OhxQ zu6{web2_z^2K}F4B-@nykF(oXn(W=@VrR*eOVUJY=kdP|(QQ)}Ho-(Nvivz+095pbzEgukkGc2Zj15f5z_*#Uk-FR`krrl0iJR2+j)lo>XNh>h+VYD(P?C!jx^ zQh7#yWq-oL6~``MAm$I{Nvdb1J!sPEb-@kzBH&A#gX~cOa7Bm*6^Ws`er1)z+iJw4 zBE+se57CgqB0Uj<&q4E0gj2T)+z8PDV#gNCzXr z(m9n~x+O4%N_4?Xv><4+an*XCyFBkxG|fWqEjB}OtuL=h&%q+ab23WYeZb5?`qWjH zgI3sjSPEQ1+RU66L+dbM+U{`!`4t-15(kFZ|Ck7(rvFQ6e-TQaEYJ@h9Cxlg@2JZB z&ph@zwQu^eU%uWHO}R9S$krk% z_^_pqkm$NAX~q_AOp+!)5V^baD8I)eL=h@zN|9f7H0fxgt%98y9D6>-Svi}4#{G~XCf z;z4EX7fbJ5z3eQGxS|w9wLxZVTCn%+9FYTAj1ZPHr)|h;E9uMGW@mUD`4A0k@Dm_8 zzo0*+_sAh?meGROT3ktF3i$^^B}y);@6J zwf~-j-+qQ@+!6WRP;Ip+R2D8A8#{rf?XHE%ovyF)aG+vz3|(?}uQWBstY>gLyXUqe zqUaqzYqg-7gSrF_&^A`bjxZ_5yY9x^#E=no3z58U7Ocbcoe$ zhc%QQm!`^2$pC&35Q2%4a>(Jur54QRIes$`1MB?TMZNY@mv; z$t)+9HPQjISaBtpZzocihH&p>KFJV$ML{>jA|-0!umrUMpbf;WWDfLU$Mc``axW-g zZCXVL1Lfh@T(F2@IFQ+t%o$M#DJkcE)Z!48JvcDBm}!t?VrHu0;%Pyyx=~)e&*@TU zq^^wD6nzPNi}%`t!l6mh6Pc;gaH@=*UHbmD^@sx3Q5)UJ*QcZQ_3JlA^YSFGf?m7? z+0tsXW)W=lLNuJYj8ASF&MFrwCP~RBvf9e*%hSAhr~fu?p+F15T4o>Imagsb~ENcqR}67zN4!O*J$~JBA z7hxPllr^XM(%-u9l=JCIR975*As&Y-2r%K_02@IE@D3Y;KD2GVCqz9@XZUQH@Vo3{ z=Kum`2n_%LimRC$Fwm8X`YfbuUjIgPwC;b@2FZ z@XsOZa)<8Iz4>3^>t?!Q(8sM=dG2ECS}MAhc=?e5TYuER>=@Y--um%2{RtOuzqse& z*30c9kpK@jOull&@+Q>ThF&lM#5V@*N4yj@#^AWyXAM^ejOscg&CAoWcCajhZ$rUc zCUpXnne>GU8YYLCPBiT&E&vRRP~Sr9_FLK9JijgOP4Xf;c|1%J&|ZJ1I54*S5BpWX z715tFftDMbs+!1pq%>s=MeTO<3kgsEvw~uw>Zg4swZ-=FuCJJ3{oOUPJ&tA0sK_lH zI!1&Q6Yy$!A%@=yvk;JCNb#B-%)lB#2rcqO6Q!|}b`<@zk+rZ55^HT2Z?63p#figj zpT(q8hpN>?=CVVDAF(!l4t*Q$AFPE9qtuj07JFJMSj2smu=g{@?nWh%-Y73rZ;cnG z=&}=rM+h02?!2e!*N!3bd$)3aJ>J^wZXnXr>Z@;CUah$uXRNP*(@xvk!~8D^NVKYW zsnPeWKm9)7o>((X93L(`jQHpT4q_M+$JY|Sxc~nSkbmHI!O`3GR-sVYL&nM1wB;bU z!{_=rnE&~#=k4ZtZ0h6j*b;*)gG!BxlUTL3? zplBJ?b#(V|7<`l!g>KP`y7vm$Q#fK0VV{=W%=-Qp-aZ?WIb*DrP!MmU|wlp){4ihxGGSiC7JeP_i@@1$TS5iE?% ze_hC>H@!ng!Ym96MM{HBn|k|UPW5gCC*}sXHyu4KI?6sOveEPC>xNh1&s$gt^!XY5yt)zw-&Nasa27xtB;448& z7#4PVhE;sE6`-ZVRhVwXj!K&jyD2doan^eURZ9tZ)WRH<_fw^=Pr;pLJB>CVtgddf zC6Z?l*3KUWRJT8xk+XRk0E@1_ZQz2oK&=b6O2<-Gjn97E5_EIYYuy30gR_ZMqpjd^jSEt`kFHa4olW&`*g!=@m3a9Ckl;nTuyY_*sOFqOCOne>crevFB zA|&M6s!Ec~`@K$PG5@;Ke*Uw&^d{Ia=2W*vSyvk9S`~f0i9XBx`_MF4-t&BPJ#s)f z^K|VqP*amw#1zV=K5f$n35B&F>I-ecfsy2h0%7zUz&WA&INVxmg)&u9Es{X=22NMW zyi#tAyJ3=2u}Nc3Ey@`Tj1n&v(6KT43Tu=f{GV=Hz*V_ z_U;$I@PxMLjq_t|um-Dx!rBpyyw^Tht-~UzBeZoWFE!Jv$LBC|U}N&=16`=;665Bm z0EaK4KA}KbNq#CZDa=r$&(SEN?Z?bNBAXMI$G2X+RUuXh&lej*;q3X_*Qk1|1rP^a zkUwgr700~PV1l^>fTEcZM#49Il(9Q?fZrCi>FVnnS@mcH)t+@+Rvp!R1&Mqh{#sabQebH{ zlxZiYKJWAv?2(`*1a}Rtp>TK2LKEDAySqzp2<{Tx z-3qw1&faI=`*0uT`~|bmK1Oe?e+|6wqR^sd9AQW1Czty`3*{SgLEvm=dIu!`&gancrtw*dv;tKJxRywy@lOG($f>sQO(iDE zS^s2m65Vyf!}hgh60?5v#gWX<;3g=FJmcYi-l>XY6+$eMewTUjH5WIK(rK(lI>?q_ zg*Ubo{lw)Q`GQSJy$9i$d|~KxyCGA}tKL|q%Q1KsZvI(Q!hpgcPG7X7c`mq9%TSrU zJJD0VFKJcKzD_LOKqCeV`3e4iY5$ml|Hs(*9xv5otz=_2eJ=yKH+-DHSRL+u5ode9 z6MtPlF1MzzpM=f;!pZdWM{WAZ8wF_t@pJ^POw4qoFSi@r`;!B!YT@)vwJ|6_^J{#27A?}X5Ni4B9ix`BQ&7pwTL37BB zctF(IHxxcHIh-KgFDVw-M$Dis5zILMq)%hzI|*?x-2H+MX=ULSfoQ&JnApDHJ<)7= zih=XRJ265^Wb%?o2U#jKO-I3>Ysm1$(S!?el< zpOKjy4<-)Lmg?~ye|nyhK{}w4tq~C-?9m==oc@65SOReu69|H(6 zb9yw|5Ez8sm`36-naH$eSuij!HQDoYVR}hFKn=#9<$iwS!iPIU*(ODOUf@)C!2)kG zicoL0lwK|JZ}wtrK4Avjy&(t?>*|1f54PHQ2j(t0j$N35V9<92ZkS#I%?p~aR%)XI zBEn;4s5izF)83%C`Zfk0(F7l?`nz5)UzHiI&yZRf**9nilgX}!N6L~g3(CoCcJ6|8 zL;EE(?@`7Nlt3qG?%Uh{H~b5GDz&?BY{HGDjg?eS4bWEh_cVA1=W-UPG8a#IOT}`$ zTJhG}isbDgnwatIO=<7|APtLoQ8)cSFgn{ZoPC_kb47^2ZXk`1`Y-n3*Oxt3EvRL) z4n9K0D*Voe4x}F1y0Q_=0Ewfg#J;#&e-niSTo7&lv5-+>NqygpXxsZ+IKWSnyN4On zb(PDnrRGcE%%}GBDyH;Mc|Wl%F2Ejlmeq6lTarM+$#_vbY*$e6V$E}LDkfj*&YOFw z-@oHUvhd-_j^a#MwN2;O$pd>QZ_`3Rp_1APYkO1xY10sx5m5EoN+20SI<8Pk2QFB z*2fP1({|%AoAV02=O_My!P-tj`A?VjY3hA=n^(K<#Vbtl z8P;}7%`tRbe!5W_K+n8VlFpmd(y*vK&fI?x>W?jfrmn^==e$?1hl_k7LeyXwquf4d z+c{*`)iXbjw|@h_f5Tj%4P}D1qhFFyq7Mn@y47stQA_QKFtJ~rF&5f=#=Fo|$A(L} zzB{tZdn;dAqq0e-D3=b3PgM=gxJnDi6 zB${}e9OB9ck;m?kD;o%TLCvakgvw0mRw&=m|1x-BObUYqFiAw^cTJ^$e4F0(?Yv9c zCbg|^=JhmM-829>KDY#QOjt!!)zDga1M`|wTSPd0Dgn+sKjf9Fuv+|uFFK}Svi!q0 zgES&gVcGIQKhq&i$CFG(51?XN@nA}w0Lzi4X3Q42kNWt5QVQdk7C*KaYl_kM#(w7e zwgVglMAx(6su2`S!KQiN%xf_Zn+7|LhHNN}wYHMmhbGomv)zouw3TTv-oud0w&M1+ z*$wezNcCf-iY@|4j<&9Do87u}>3cGVY{AP2Kl>5BY7+2^dVz z)f`BB&6hTkLwUqRn@V0AN>3lTx2uoCzbs4x{@;s^(SJ0WxQGgN-I~V4J1ECHRX-S~~f@Md%#nuozVXKZRV1 zB25Q5?Df=vSGF6MMc|6F959i3&Iw*3L;)T?zemw~+fTZnuA-ZDL3T#=vV3@?&ur0k zTv0K?-!GRDN=_b55}?d*97=Q}q0b&+tIcxhWMtcC&CHlclT$`!ot-l68^P1TXP`-L z6Zx`+@lypiCC-o^TfPWafwjosObmR?tU%WOy0DM|Qe|V|Yv#WSOdd?2m*cDQVWm`% zX>h)SFpIVw3%;U(kHpmb`AYoKkN8J+YxA&mGTqh(o zal~YzdA?>6Iv}4D6`|5#+Q(qO*rX`J>xU8e=L>t!+{P>3MHv9T|F}$$bw*Qd4m&Yd z+uruOk!BY@g`PAG>})tSX#J`fu>T)$TPEcpLVb-SGR^NfY+L9lp(*cbfitrgI5GL3E%=_ z>5AcyP;r_rZL%;-;_#U8A9Q4##B_w!(v=fyFo32Os3M#yhVa;ZDK|Qvq3Ccfz1*Hpv_@5LSP29u22I*FwZSxv#hCvT##(8_kR=AnUU+@i*+A@WD70jbOd|gZ z4`B2lmc?^aGQsamB~p@e!0vlcUmxY*!2R4BE^Ss12+-W&PCCVBDEX$WkSN!i8Z>Bw zVgd36{b{=Z8_T1niK;#1*O2~xP-;MDlw_lw&N#^p$WglzYE6CPQKYkFZ5u4D znA~tZQ0)?bKd#T|fLwcuclkaa`dmYf$l48Kna2#Ym9#8PP%UeVVU{qLxJr;ioDkG% zv@k&fm};EU95!aR*0#NWkaIeu3{Ur#mk8*7%;Iu8$V{aNu2garbQ-KelS64zgL*CzsvIK_Xl2Hp01>nojaZy5^@1HMh!23gE{z&y&9s=UNLDcB{^mMXtf5f8mosmoV=0ehTYsc_CGd4b|8Y)6(*A9Eg=H)7@m z08BW`;~gm9j~6eG16gn1?8n%6BfMDe2+Js791ov%@C*EcZvkkgw$~12pG*aV8;Abv zA*ZeKX1ash#D@C^ffqShTRzQBJAcV{A1jF)9H{g$@KLVWIwiOLYOFZm^oe3kf>J-5 zo&p4bBO$2L9h7u?*jLUfS~bbI*Kk-EG{L%BupEiX2v`wSCnm8$l_d7HgKO-U?sv50 z#;-7{D*=53H?&o4-1Zhh@p=OTuAEeaF;eQ4##*@bp_cG`bE^Ia)zjiKK5>@;@Qr*Q zSW%3cIl`Wsf_c$Ub!9Su=pRStj(g#>*bv6x;oH=YNF-~6nB25H%GJ_-%&%skwkWvE zZJX*5rr|bgNzIi`gn#;UVl}rCQLrNJx}qBJPiUWK8EL}m(JEr5J!9RVjLPUQzM(5Y z1I*Q1^&Pb2CdM=wj|R#zKS45ad0qcjE5T@M-J#wW(J0)UsuT13m!gUVjP7r~_r_?R z)i8gKY>YiqFESwQ)ElrXZi4R4bwSQC-ZETbO(#cj&&!V^Vq9^8^fdaxME^r9qR#w> zbJgAJTn^vgjB0OpRZil6w-a)|*Waxt3Kc&LMIP5NrYIoi&?&b^!BNx1h!FWasvXe+ zC_TnRQv$9^r&Cdxu)zyP_jTh0{KfQqByb2{q_igqnWw5p8LiAtO-r&Oj1ZPerN5&B zK3`u3H)NLd`Mevr?YsWZFILNx z-`!C{m?)v7GEF9mghWHHFF2W*u``WOr2IE9!f~feH;u09j z4_%y*wFAu#sBIv;ul3dDeP~XW7~q}P2P+i+Ri<8k_;Fn~=_7D3XKUKo3$cwaA5(19 z(;0{6-cEnhS7xC#nvYjuC8&5P`M}^N3h;zmBr6@1qQ@jSZd|-AX)$QOq-MJO)bdiM zbj4W}(MEf@@WH!%gsyv|vwVT&q`t?7ffb)RvMB#G2-6-HkugLy=; z`c^U6f~9QaZe}W#2b$Lj@{Cu#>^(As{LQ-9dU5Iw`D)nf9pZSl-47Rx*e@J%pp7CT znzK7ov}J$B=>%`*v^8ix<9OxU*yCF-yXft^xfU!6!$dvTq_K5CNLj2PlpM0us}nxi z!&!Kv_k{x6JPKhXH1snN(XN$}W2nC!^^gT?XrT|w{4A*Pp@!U9t_Q8g2s(|vLp5d% zNQfv87=qTS^_iQ!Wmr7lCDk9xpAE1~h{4Cau@hVOS74E%_)CM@O}=Oz;zc~pn$kE2RCtjSOD{|o&! zi+uf$1WJO^ZOC2QEW!VM0+OoV^$32st*0;+dz?tx5Xymx&CY9&wQMxm01BuB*)F+s zP2V?#zs$qEYryXt*ze<7tVPCDOKAY&@>JTWqfA z^#WynW82}T4ND0b5VeW~q>7(LhS{gqj|;adN~1gO9s5lID-BcQ)5ysIogMm_7li;y zMtU%Nk*51hcbf$2&{Q%Q-_ElxwlBn=QPwgtO>FII{_Or-kr0CY%A9HJ;QXzzkAf|G z_vYq+LqK+7m~feq>1)kBNrPjY3d{Z~{`)lq3A(Hn(AW_oe8J_|Z5TwD_zh(fxKWD0 z(;M=U^7J#W68gtMMweM?3I2Z5_+KT9&f;7EQ;cxEc#f~Gjb&zY3nr}SiU!-u$DHH_ z5TG$jKnTK(qCqQ4LtUse3OhPEIW?*otVDHKk&U|AhYu)BIx3?xB}}ZQ#JzpEA1{K5 z(|9?F+~A>8X)a--=CZ!VlHTOkP{kJ@`fF6M-zNtK$wRftbW|0*);1%!*4h|mp7rhT z`_k)HCO;4GcCWA?o{WCl&#%AGG=*88-_tv)0}C|(tC=FK61&*@L;6rZpW=l;-h0AH zkyu*?Yro8til@A#*Qa?`y|-g)N4TBso?7Rl>Aj!T@z{ z_Y?6sB76PZnghKBu-_xTD$vnu@wd-pQfv~66RVb4%QR3E|Nm4E^0EP^uXT}O=IH)$ z<;0Wr<|_1XM;{Z>{W=5LzUXfDf8H~!*xwBwRI>f`(b7ceas=-Vwg@nVij>ZaAry8+ zf;HzK^ilo+57t8=kgsX$V<(1N99oU6Y1L_&y?1OeptYT*e}fV<^1Gu-eI=LFitNkX zUXjZ-Gf4m1+rZ-$*%T9_b*Od=t;a4Hc?qVrI=_60?5=BDNH}C}3E&KvJrB3Jza0Uf zOYLcVRlZ6Iz8G&iH~2N_GSV8Qr5wYgv1S>3FFZvk)*Rb^^f6W zkQ~a55gt zz-0;8Lv7FaC^Tj9gB(|>0$4MT4hUB)DTfbMX)+Noo8V%V_W-Hi<>XkGajz^AH@6Qn=kUH zV42~L2%&P)aC)^+CaX5stFd=^9;BM8XkbqkUm-6`&KIaav66@v6Q^%htGhFHL+krO zD&F9!&KrCcsZNB_VzNuwyAj4qMS>bMP5X#8<($Rj%vzpPL8lb+`n4j$WIb0Ez`=Z8 z&kH+e)^506(b;n|0Z(4_2A^Xn*0VcLJK1({Xc3~)bh+IEgrQF#!KC6~`aJt#dVD5= zkHH-8m^hsyDF0Hcd-1QuPXkR>9AJl~)~+7dR2PNjYok6$oB-;)^p89t^$Ho_5mh6C_HSJFW{b=;sms3$>NW^sb zznYG~f5lK5stj)C^|sV+e*MOxFS+gD=fyOPfcGS5rM$0>$>;bVvKgm zr>g1qd^cGw{T3c+l5QGv#o`qRgi!WxAxjKif&yt9^$AHDbqE)8U0`i(DOXq$gD9Em z8BihA)50Rof&$-G$QaH#fZm9x@(Kkx#_(d*x(g)foy#VtD*}kho0Ruom_gTzJ@Y&= zzZ7bAN^W_FmxwTmrT?DF_*8g0<&>VubS_aLuF+WA8YV`a_tsejN(MT^>?$Ok)&{}! zH1>D^|5YW!2y)Bh300XP6BrvqS?$A*gWY017yj?0#{N%$EkP9(q^33)E;)n^R2_3u zR`b=WE!kHoE#(Zn23LuhS32!RxTt@`0f^a^h0aB8=nku9VmZ4zJ3weadP_&gfNg7^ zRlVea5O^^d%N~EAKQaUh2E}BsABE){c1pQrXdvB=C z=qnZZH2p$LN%($^mFMNR4(`4>J~%0MzAoRZefnTRFuzskfJ{kP!n7Er=)}x3)YqHm z!P?X{ION1xPqRiuu}%K~#o*mM_(vwq5Yp&4*C1j!)fxzki0W^ZkHL5SoZ{Sc*J&mP z>=w2m{n8T!_m>i4_V6mOFqLuqgQeHpTb!1b%Z}F7-4^A!QSI!VU@8YZf^*!ZjMq5B z7M2hRB`Y*TgozG-lOoaKq2ykCj846DrjwzEVRa)Rt{Q!$r zk-h@1WP3&d-529_KgMt zdMin66^0e#H-Y5j7brGMQtLDB{v5?YEowJX7XKd=C&C=iCXIUKL0rb(q!9QI~9?56gR_ ziz1ob-g6?Z4lFkIlz;jC1-b&{6Jp31-fCQI@YMy*xLP;@_9Z5b@y6|_x_S6dVKWX> z-9p+y@K*Vc=82F?M7rmfaoSINYPMK&5&twN^RZt6tt$u5z&UkQJ;We#t;* zPjky;G3Knj!`L}Ss4MEVuoPXE{{g;&C{B+xe`DAHw+??EQyhC*WP z;@U^J$U910)h zBh}hRsqz{%ii@-uerNZ_*7I9AC|ZA3!!1R)*Z&r_Ws+*E4$1GAR(_?WUSE8dpZcHg z%pvmsETp|}U1}#(=o?N#b|B}+g9Y6k-p^ab>=clFdTR{v*RGtLb>7wa$NLH{c}?jQ zunx8kdbPMW45x{`T%?5pPOfavPG_Hi;%}o~eGLT;u3UhdGK^bk8B7!Af+Rn%WJf`( zDrrkjLGwD>Y`#n5ux)ACX7S|?x;=*&_a>wEaB2POW88ZC6WGl-7q@k;oO{muqLAju zuddgs5gNEXR+x_~bq$U^ISbt90sDt#Gnk2Nw_r#NNM^!r@n9utTmGyCS+M%HhuJk# z{xRh#ySkEZ=E#aw*W&fR%dmdjtEK>&WM-~~-ryUK*$np2;l-NP)T&ul!C~efOCvee zp7*U%#EnxGII!0enD*ib$fis>$rfs5U;1@S1fY@YLm8 zu*{Zh(mQ9wU$2H#U#3N^zK|GoP`d!{X}Y|Jk+; zo(51FG`y@46>$wreT|5?m}p^9IaFV>yG2u(DzEwGFM;dBOvzVN|F}z0M7u>M@e>&*;TP zWj6HxW+^}mMdJn3?x9z8frF&n59xoaW)Y!1s(a>uO;Oh6si31Z{NE2)xb0=CR9 zZteE)$3>x}6By}Ez^c5`A`G{yH!ie$S?SjUNA_A!1gsuVK{PiC zi4r499Gg_dxO|0)In>)Yg-|kBwc3s>HRIo?Q?|(|7j*`=)hbPPV=za@4&H@nuyNHD zd5UKZ^;T8z>ITRQ-uJ`kZyZdFz-|`*3P-G?8*EZwL3{M_dVS#r-^ zpT<#?{DJJ04e*jYUjcBWc*CK&xEM)_GZFmr(jpj4pUN(UjjYX4g*M@3Gjq*`enYMO zWb1vN7hN$I>j4z}*7OqcEgd#4{(QsBgQTi#)t9cdeP(}5PjZpx0d5X~X#=(hTcxY& z_HHik45yZ6bKiiN(?UaoE87^>+UZ|#B8B^o);WLvg8ji}kiJ!NFNCnAOxf=$PO+MCeV+iJ>D%JJWiPvX56)#r{z4dis-ullBf(2F zd--5u&eu}j*AmU+E*)Vk?0@hxlmFI7n7j6Z(_+&7G34!fc^4|}zpYQPk^4Od2n0YP z66AF@)1CFRlztSa1T~Q9h}c_xPCxM2l9Tir3*X9&@I3Y^34vSKQ%XeigPn`}Jw3kE z7yqwcW-*1yO&Q)Sqb};N_Bi}iBbdzP2Py%hsZdEioiEdnbZ6c=RhUh+YmKnVn9F*) z3%?PP+xy%V-SEe`qi4g@p1EsJBM4K`tj7y8Xfq0Jdix}CW%0aAD&yn=P5mizI#Oo3 z&JEI#@VMKLAvq8v`cJUxya_5&w7eCFXlTL1xeK~@!9%oNkl>W}Rj%e&pZFVu8}gji z-TQI@TTI_v<3N^4^Qh7*`&VIr4Aa;R4_2ztIOXG+t`rs%(MMq9cc~~uC?CVBeaN?~ zXK;^pa&i(n`il2Z+aD@4ks((i-+^Z_N@>N~7sA+OYB@7ZToj_Du*d&2E%8KLO022z zqy8uQQMOi1hB3*a+lYf*GuiDs)5V4#he4I!qY8te`@=&@a(%M6{GDT{@5ghd{6I0P zPM{}rISO_hl$eOi3Xbsv3LI=v5o+UYh_=ObcfE7^KmIm`8ZjB=w8CNrk*(Pez?YAV zNkze^7B_}H&nOCXALkp*QhliL}j-frA~kOL8nQbL5rL)UPHiyI|~0e zu~FB>z+JpMd@na>=<&*}pt1Zpi?j-h5E!1v6+}`LATAS}zB$ThSAq)KeYS|MR;~j} z`0E+zANl#L_tyu=;IdjfeZ5@yWpY=8;pRE!`r6g?wS>PBV^JGGmmaOgdpc}hPpW)& z<879``ZJ9ucJ_bcW9@-URcJ*$QegR8Zm$nCXEgK0JZ-YD8@-(#KmB>1W@8s8`YxWO z^I21Rj<81xcK|y`L&I)VJQxz~T@<2V8i)#j?WtK|)zPxcGjo1aZiL~*|4ft^7iGsI z7>916Xn0tSlwqFQ|t1U*#LIRm%E)n#4^J1H0EZ2wjjfT$@_p zc%XnprlzcM8F%$4XbT>p~+ zei$P2b$t;#&siH<`YaIO5_D6pC?Y1@-+u#Lqt<6xBtxX@S;Ml`EZ9ND(>CGrM)~C4 zjd+&r4h#Z-FScmDTLojm2KBT$D6|a{W^h(;;2XwFO-`AJ!;7^E^{oqs{-Sa&h*K5; za45m~!(sYx5KekX)C_aNMbad4UJmUZJ)uC}c9vJYlQ*Ri)x@jC{edx=)T)r)eU=@gk<;ASEk+bxy%m~)f*E!PF(DM3A!!bI(Hp(2sT#D{Z`F|1-4K2O3Kg z<_8yW;zMzaGkV>PXEkc|<{*jWIvA_UkiWvqBmh2*1$5NV{8bzokmI}(wEKIKzcf~Z z)F3+N(U7po2ZJ{peN#QWI2El2?m!s4DG349FT>Ff^8;#Y*0w0#$6$S*_R?Bp@jXOA zzG&F6SQtUDNwBqx6gkFgD#i2>$Dg%o8Pgyt@ZMK8?datb#A(`YnZ^b?r>C?~^54RV zMn|6(StOnu`^0Cyan;%4!^H^{+cz-;U;%OY37Xh(IQn@; zx^JLxI#B(;#>MaOm?_^7->MakH8CW7V+t9pK%CQF#Q^-W$%+ZWFDz9nZX&IECXLHI z4rK8^g=_fXf7K>7g}7r8!uA1we-I3`Ly!jb9TTnVCNzRYTEM~Y?pN89NCLr9VX; ztxlSv+C;H%bZ~_24?U#^tZIgb=UK7*WI(tgbN(8>TYJHwCJ8+#`t|fh>8ov8(d2sPA?i284`O$UV%WTtUV(pdn%50*D z?=wtEpB$zIPUaE$9qHXTgz`1FTgy%E;PzI5*h7)#jz`kDUn(D9RxZlSytuTv%P!-+1Rl@S=mIu*#JZqRE5}@jq654x;nccNN|S^T(Nl z8RFBtXXqP6(z>U*2$>)$g! zH~$h3?W0kR0;CoFJ&;>AU=!IgYUF9$63G43KOI=YYzMRhG6C=eb7J23iQ#Q=ZFbN< z73c{rqM|Ak4*QokM@Gn?w*xNmKb@Q8^?|0GlGyx`_7{|kBCF-=Dn^qh6iDkE7~fKg zR~PHl64eG*QeVVIVV@)WZ6EFr-YiE)ye_`|{Y5l4QHC9Ku`pOCr!Ifd z%Mt3(vhAG*DQ+->1Se^xrZ&^iNI<^5gKaxknd1RL1)Yp9FJ@+3q`QbFWRY5kVu-?# zt$j1KTlxVaz21L%uy-Ll=9yXIgD~AuQ9?m@u57!4h@FHhmTw6G|x&hA4q znqb4n_a_%6q?wfTqV5iywg82cd}G73_@25zlbP@OEp^Ukc^`DVqnoeY#oEbYu?abA z%*@FDR(4l%0tiQ$5LO&w3cTZ!mc_b!-?cit-nG_5#ro{IdT(y5ALpUedNHqPdTRo( zzYAInG5yWrbO{liNWap=^z=Y0B4)Fe=yMHTaJ*AzL}E=oUi749D2qaHs)2cg|}S@D+i>6#|1>W<0DHWnt>ttAe}Pzdg-#?W z1}mwCJmldyzDkruBAP2B1BjkcEdh(hDCdNAU6bR3q}k>(xA9vXNfu`Wpl|4*@I|cl z$i_PT;kY}EJU?V1pHRc4jKg2AQ_sG0REdwU+SS6jYQ~wp$p9c`a_ZWii20+($Dfo3 zsa!_Re{G(>lI`0g^mT?+Cj2!Bk8J+=4dG1v(kZ*y1F<`$fTaFNXQHFCPj;m(J>*?v zf10EYmEZm0m#1SY?;eLX$JT3}vFir}yfu`hI~b;FSO$E!CHlot(2%2q2Lh>t^9Zxp z-{QOA9Ont`!@^xr;@5+Cu2F`9Sm;aG60WTv_F5RXNv^-@zP;Sq$uQvhM!fxT9;4gm z?oD+=egE0!LQP9cwh&j65yZ3f@4e^S4X7``DRyLc#r>jK!z2?oPY;92~thjNASW{t>&lgI7Ng~Hd_QDu_P zeAKg8lW&z6J7!vAWaGK%WI66IutI!YzH~=K;a07<5Qh_b~<4ZZn zDi)?^AYja3e(&21s`es^dmS`D^$8b4+$Z?%7mzumO)yky*Ayg)N@`>N4I$pEnbrhI zB=A9!&(-C`FQiTMeo_<(tH43uz<~7%0>Pe|nsV{>4>~DluHa{u5W-~9$$WvshIPXaw?hm5QK_<#~nPbfJLC4Kp4Lc2IS0S+Tioa9LRm zTR2kTk|ECce*Dd<<5Z5o;VKltkssi!i{=j;P}Uc+US??Q>&uqdhS#oghyS~nMDWcXtr!@BB=&g9?fdx1m|Bi5 zgNJVY;4-(?`*~{m5*2T8dK!H{y2YQ`Q3aI^6dcxmXFl?*QUDgLY7-Tq+QYcW(p4_HB)Mhay?C4%Z?I)J$v+k=;1LG z2%aCtg+GMI|N2psm1a+EpX6j2wlR6C`}2K4qS2aeBEqUI zma#3CPB+IGaB1yWux0MM>vy{GA4r)_#iza;?ZitvDo<5cQ077r&3jkm-N&TgUzQ`n zyaUkiYIIy!`iJ{PU#|(5?d4^N#D>pbxdtx8Iz4@C>cs$b?`+(2!5Qcs2#P)(pM9S~fAb=CFd&-R&3^4kYrW1276T;JjQO{TJFD+s%HX^l#9K zdWz@$)E}ftR?~jo{zHLuod4kK8*rK=z$%!_897HdCct^9!~Yu<*oyhh2lmkQjon@XUiWcFtCDh*(R@rUs^rhLcYU z38oZWB0JWWt|?cdYL2If_8Qwbc2PMN7yKOa70zxKxE2{PFIIRVx6p35b$HSziFqO@ zFF>jYApDaTB59|`vu2_<58iuZ+W_xr`5qmjpHq+*SPj*mxIz89RAS!GnBCrQh*MQn zCi;C!XQtgk1KB_Gf`jod-si)g(*+&|im9uTb!9tFU@j;GGNAmnP@hTi56c|IQBjPZ zm=$e!VqSFVUCiK@38eE5_#T0gWnC0=03Cc0UMN#;nS>VXPrD`QFyo6?WDI}*Fzezp zofTfauP}(Xg2wG#@V#m+p6&zzkd@|KeqOM&GuejjkUp57p*NrJghntDl^3l?Kw_!p zt@+G*D6ZF^nDPoC9zIc@jj$-JyXJD5CQwv@=)$^!Lq5OM{L^@K!}{4+%n-?N0B!ln z7w^`2zZtH)CK#*-O8UF&IB9;BzAL1b?2I(e7P%|2-ge>T?9=r{`1g&8%>vkqurBFB z=dG0{=5P`t7MJa&OmXjOz^Om_YEj!q;6P^_yWs&kog0CM#rK4SZEMndWx%=cPYsqb zYR&oQvLAC(bbp?`L`xSc!2f>Q|LrYtT)=g8xhFEDkHwXS?0jic-M(*!z0f?VS zg)$n()-+62du3(z@Egm-%??eKm)NF`!Gt!)I0`qkIIfCh~R|DPr1(Q7_Np@wG)-@r{EE|SDOaS-X>yW?|Enzv- z5Fzmp)USsEwO*$isMwhCOpp%$f$eDW#Bkd1fj9O(^H8GaZBYlidq>Mpk?-~+Q0(p& zCtMyrV+RiTdqlPxZPkbkBtNJX1Y^U~!c6|0mQ2)P@mZK_R`ckV{;}4AE8t01stk(~ zv-j{fDUwpIrWTY?U1c&3LinT2DGoJqatLc+rHl$h1EA}3q1ZN znd705ROWRrFkQiaGZ533a*4<#I}}}8ZI5X_?+O|#hGL!g9UTZtvnyb1|`*<{THOxR`30@lzH|k z!O8Gs@l_)_SrUv1*!EE`MZ(q9yYCxs(l=AeUac>)5jzrfb7=MXH4%TG(%EwCMp=E+ zMrTQE%Ng*$#IA130E-YmX%^dg=<*)xa+gS3kZdLF+D!@C3$3$`%gX{-}B zZSb0?O&U6HpR|@F*IB{<^sZzA0pDtI_Tf=`t zI+fZSh6uDEyv#6~{$MIKGZ-4RA;3_Np2_k$bZ0+vk5Pn!<;-B6?V&!e_Di=tCuXn$E>f-7c2$d&nKt4JU(05=^m zt9eChU@7BtTQTC{a^A;j%g)J{NLf=_;qvknOHA|?l>++Yhz11ToIuZMWVS!IbH(~z zf0qkXB-9i?H76IIDLErt=lx&VaRK+r)J1?wm4y(ko^k zDY4${{wse1y`ovw8W{CQdZZ3l)EJ*_PYj-biv)W~HSO&qiq>V)Q7(*v^S+}m(};`1 zp)8(~Nk~{(pGlew6d}ciFRIN@h!pOj{@uSwIpwFX-<%s}P|f%wJg!Pt^a5)v#B`EK z@fUv#x5sei?&Z?4IrQ5IYlG&>S0yq(#x9T8&QNbiJ}Q(g-p(xAcd)(=-_I^5tNS2d$M_yUXYjF?3zV1SBfu%H zZ&^{UMpO7b4*7n-uR3M^7({Q@Y(qshP^Gqr7oT9;@p@0jP&DnxCm_mgvq%sK|5GnB zK(o^9IiALwSrQ39)v;VqCn&kks&!~^9xq$WC%hPHV1__|+5~Ajm0vhA&=gQ{;gkaL zV@6@W*5PyDTL|?aemNr}Ty5!as6k$JoHFS!5Q}h#)N7MN`cmMPzV?ZWkFu}Vb}&ez zwmqWh7t0V|$00>sY6Oygck{3>gDtqJ^9uK%WQ~AB;xxCqUcoc0N`h)_VdvFIydxBoR3xpC$W|-355Tuz zMyr@v^`)i5Ab0ssx*ohVoIY0W@6mkD<8!l4UkBG(!J(thdlNz3@jGT?pR+>I{em3P zr@_Am82-K5&@~}rIh}aTmgxxfSdh zsR8~uyFtPF2(^|0csYo=DxD&A9ACpI12%t!Dp2n~ybfPCR7|MmyrL$!RezQp?5W*rLd=6#k=yE8T1p0TFidk;Sy-b-r$ zzAT|jjGzUej~9i)_KqNR;S1VAd@%4 z6zf0cn#62uT{+Tvh)q&a|9Z1>)DPVevqp*{UIx(IG-lxP0&%f>CT7u0$IvDv@6e;| zR27i`%QTb+cI=Gcc1mNGKPsVu;clZgLHZop|HITd1xDItUAto2w(X>2r;~JSI~_ae*yx~RcWhT| z+qP}ne`enKX8waZcuuSCyPmz*y4K!(*lnL5G=yGW;p2`7soGaTT`d9VzgwLvAR-;! z!`MBo+z0M0qYjJApU$Sq_}p*6zan7gEx|V0K#nP+9O&ZmY*e@(030|CxK)>!1*3IB zkuh+P2L%7MHjYr1L4%0?sS=|6EtS3t&2A*l8b78O84+l4&NI{=lt6#T?iw-s1LCe-x%kiO4Tf;@a zE{DOqyq=+vs4dgC`o~0K;Q*4hoLj`Qdc$w7+C-!rWG`2$kYmKA!W5R z9=oNeu3*|Y<>aqIGb*>}PPIl8uC+rV#?$LZ@AO#%aIV_@D1-BugHVRi#t`>9drmq`)fmgRItXm#^hML zC_aa`eX8i<2LETrkNf1hB@ExZ$B!S6H0TJeqZj3=igF@BW62kPl9&I8ug?+Iy}L~x zkkFl&I*4WprM-S9ZIWYY+`b=obkak|B6;UEWL8L()63GWE!NI;?3n+J5EO+xTUh!m zvUma?`R7QjsNuf?(`V0r?f_iubd2q^E}y6I{ZXDBW0u!V!NZGnhoEwspm~gAQ4*AI zBYK4$4Hu(yCr->5Rpk?rwzcwoDY!CtN2`)#xgtNH_L zdj6;T>x#YO>WIBVvW{lxeBGQtb9h^ZGpOQzxBb@u)CA6v%T0-#x4$9*=@XrQ*0;n* z9B_VJ>CN2h|4mYOqtf}Uz+&6Tm|c0AhPl1G5A%#Dw*W?lG;8f=i9-%ODT|^3zr;Nx zkqekNtXBASI*t~@Y)!{4csW&>DNGYmNySKUDs3g+?}!?Eo4Sgd@&k&Dj?d=>9f?S= zr?ysEM_0GonV?S#c%EGj0yZ@uvOG2)z~NUdWImk=QJ!I%E#%=nqe&qVLze2Y@dMzy zXq;elWY@piz<$@xziOEwk&vGJlE#Vue8`C9SOEm<4Z z71o_VCws!9C+GuVx90uzX^lS4?>?T#Ar$nCL?ZHzl%LGpntpcDsas^O5Ekd4^a#j1 zK$g5`!E6hKp;X8v8!}Zw)Ob;wy{Fs;rS>=}ckI?ch&`)0RxkI~T&e3EU%e-9 zTYC|NsQ|z9CPb^&ZY{N9_T7y;a69}g1E2Ds$Ar458rBl6)Dx@JQ>sI|@y)C(dY^_A zcEK#|d#kh~r_2)?I-jLErNvpZoU+oH@Wjz@mXg9Iw$4D$S~UD0e}K!*OG{QU2$c%> zLn`^+u>{Tt0tLObvJLe-_jLa zJ6J(IIz(@e(o*sx?6=~KxlP0vBS~7pJGGO8`nZeOF(0G|_ZO(x!^>PO9@MfPuj4tGsD?7Qr3 z#G~0o^w2G2h<-NpAA#1pC1D&+rj67xOc>H2G=>kj#I z^-vVYx5C?LN)-ZcP}ZOCwLJ6Z1*+@L{X;VBcUJZ z7=UdEm0dea56+mLvVH)sib=r%VilCg`wl$I>keLmYik)4*)^sQIst>bGYg&+!is)D zH?(XYHMz`+@9B(0!25|tZIpsDonr_$re5LWip?}5OQ!+U^qUYkJ*Ejmi!F%Nfr92| zV#nrct`Q+BbVJXb@UlX3c6lEB{RFlE(d&jI>vGzIH9bxLMKU!}ZCofVF|&Ii&PP0b zFc8pXix8gSQv3wA3yqoK;`jFR+u-S|+jT~j7nohg$2TdKO#Q#R?a`ZqOoFe-on9{} zm0Wbr3qrz%xs)lTIGFRGgX1uNPDEu{f;m^ZP0dtVT-AI#KEI*&`)Pz)w0VNVyz>gJ zH$mu-PATU1P-$FNY4kDS?lGY2p!`I@gfm`TTH;W9z#a5_eOg#o-;Y{+Je$TVjfYMD zA-?F$%+uR_x4qmxTvbSQ>xT7On>B&=jsnMDAi+?gs4TNpnaC7)g-G{}m=uHFxM&`| zit%E5xCu0+sB(Y%>Fuk#2RMA2|ychG@ zcy4!g(Y^@;8%+ufoul8Mp%4e~0t9PWbjD8JpPQ+7?U#4f`GkN;2r&YTGiz@?t9r5{ zqtl%mo}kmdKogq{rrM{#O})EJ3?f%NM5hhCgbw+9QiSo+XE>ME!!W!MKU5&5A%&W1 zUFJmT=y9D^ZSFW$%c%MPU5;mSvVS)VOiCK;Ev|-K>UMk|PwjRBPtSs0C9Qm`>5F}d zsMH8Y;W?I&7Sa;Gd8Wi`m>r;gb{*%ZUf?wvnzhKUg=D&BkZRuMGmHZXPe7p;{Eq0f znrHA5Q)Qn~+;dJi%in@vH?ZC5D%M*jfUwfj<)uhyp$Xz5K1b5waS2OnGi9>Ia3u(f ztw0T*)Da})#Z{qohMJciXzj(>$_)?-m*SN;ZLi?dI)VkXey?MI1Dq>2Is6At&#yEMoEU_&~IJj&7-LQ9;N5d*BcOFi|fm@@t{_ za{t$SBiGce9GLfKr*dW%V zL%U{fEhcyfX%q|>cR8Z{68^S{V*r?U7|f)CB0>~yICmwE{WbJoQ`&BZzrT^gW^<+e z4#aW>wx#L-Yxw95Qcm<}20J@3qHRW6&NDqDxU*^YYxpCpk4Wd~cIS<=yk6o|FCy%M z!ph!ee;x(eJGi{7(%3soi^gAFlm)wjCh3R6`&TAbFlt{^=w4DZCO}xi;sH4&xcH2J zfP&iD62Vd2M+`=W`L{NZet*HhPQAak28&AOfkv)hm><(fU`tyRLn`2GSl|@OUgG4l zWPz<+5s^JzjXOQuG9eI+NNDN}-N;pqJ149s(S_3gxrFZ5_@0$P!KF#N8U3O6ATcS; zusr%L8AJ$gld43@Vqt8>>#2ILjEg3Ds~7)SV=VJK6Us@wXG=!Z8*`iJJER+C{<7s^ zjva56`AlGo``CH26E-ku@pf|6a2E7$7FJ1CA-UClX0RJ7Tm+&7r=K-|L5*uk*6gG- z?TCWSt+C|gKV9>egbM8}iL)Pp+G=7nJy0G!cK@s{@Ordp=X-UVwUKJ1%781Lhzdki zi3)fS;%dQ&{BU~T6!s+!08fztISAoq)KehJO`oQ(SVIjJBjyxduS?{2AR^t<0TtyvN_*aL-FIo9_P8qoXfzPMkWBd7TGj!$wF>Q` zbKrGhx{x(sx<+#o5eYaAR<`VO_hsC$*0t>j^awr`?^VXLDlIRdfu#$s-Y(ts2XqDVG;F#kn(kNQewD32>&1Vr%sHODirda+Fo6cS zsU&$o&fW0UCR@J{P^#q+j!mA%@he;=<=hRYN5%ij^0e5y_4!GJUXNot@PWLBCWT0bj?% zyFC34@8_p&yc(?utk>{pEZ83v+3doq;0t?lQ^PpKrr{!f1qnXnLD$*Q0Z8lE8E;9Z zSd8aJ_a{-Cq=;63L6SB0FryiBBDKWs%cxB-U4^P*buH&?b3h;(WSKPW5M~DP&?aX` zM)gHX&fi|I9MyMn_*&`xZ?^aWC$RHy&Z8~u**LHT4+S}lrk|uvv2^c#tNTZqEs9}T zl8;;>PRw9x)L<Z z)fo&5?iU&`%2khord=a{K=JXn_r+7m+k1F~k4Ah!hqxvT<<7)b!s(bt@aTQQVy7WB zm;s$l*6}U@Ad~Y zwh>Huq0J?a3O5nB<$_>OXi$z;Gbw7y^d~qS&X*W%_a}HM6O_N4Kj6QH+KPHzEmJ)` zJr^~dBmp#kI&8J&!bUZY@fRc7n>#{+iOdK=!Vxf`h-Nn*RWb7Qr#?~@&ZYzAd1Qp$aq^@-YdR__jwn-N7aNbwnTmd`oZ7g@` z2}wePt%n^!X*MND%1yGo3zrk(5ZB<2VS9wlR@odZCeshd|IE{$9e7^OkhGj(r;J?OGxVA-TKJ_a~WqCla^`uEB#EmXz}5CUSr7^sqY0}0gHO|8!tVBTK%u& zdp{>T7TVx#tR3B4V4z8pwZ(JU8>vaYXebA#D~z*DOxm(Xf$lBy_!g+`@B@qgvf zHjRJdPx=XArd_g3@>%PjXTAEJKHe{TVXX~miyY^ZR`$C(jP~La-`v8OB)li+a7f^L zTTO-5K##nR%q-aph=zS6QAt3nZOgbdTk%fJ6i6`)xPZs{Csd8fg6%XJKA@?b8;t|Y z4Wzj@lTU+{S?4ot*kuPcx2TSJ1s8}BYZ(^X6xkO)4DBjKOURJ`$G_~fS(wghhL~s- zVDX%-+)@&5)D(tq#xy0D_d3zTLRC>vQWC)m7h3*?Wni>w03gE=oFT>@!QC!6o7S-Z z>atWOTYb^0V(cq&#`P#VRS@cx3?qrm4a zpyAY{iy~=f47xOyfh`J$sK;KW=bZ_yka%RtmzU7e_1=%N(eg^W;c?Hw*WvXiI?E@- zP4I-ei_iAlTX0jB=YNf(Lj7$$B25&iU=)17Ybva+AzFC@y@2mUX zCa@qFm*x}H{E^ta>Lq>q+;8+vlOx_tS>CdYV|6)q1yoRrP0XM_1);Cm*UsFYVC+0kmb3R!K`fr#QBc{a9^K8ac=RaYqo*s%>o0b>BO(kj8%(_#4QY5_l*QB zdRK_+woq6kf?l?~z9s?@P(?%ZA?qW(9&qamm4I4QB{XG@I_tu^Ikc52VCvKV%9x~o z`dw-VkL|salefL;UMRQWhS|LSp!5-f_&koUb*1Gn`8U6C*2Xo#_y}A~y0Sp!4d_^S ziPql_66B64gm&bYF5s5#@VcRNG&4HdiNyQQFwbL5+aoA8ex|O<*e9R*uWvl*fCc5{ z1k4c1!$~e|X`6~12)aszBupDpT*D;`1Yi~*A#G7*4g#4c9+ z)~(ANupl?R16_{3)Jk5xGngucAM7qF4jpgvE>C>Yuf(_c)XD`g9y&|4{{A~YE@A`~ zZJnOb-rX+)@#p9>Sw9MP!w_B06Fi+#$~+prEatEKC&Z4Mk<%&F;K@vZo=L)vP<^il z5<-2x{(%N!K=>EniXExNu~hbG&&<>3;1s!g0PghF>0_{4P|rX^C1_gV%l;XfWPlEO z&J_!&gjkyNtrmv?Vj{ClEZQ%{5$M1uEG1pu7(ml&#aK@rVOE`U9emKu?$g=H6UymT z`6v;LZWepL@Q&Rvak-V6&l|axoPJlAr+m1Y*fBfh2eDq%thHDSFR?jUpd7qq_P5uLd)sFlZrKPc9W3|zvdTu?;02>qL2~k{QQKs?W%emo-IrC24k$u$0lUMC z)P7h7nC?2EBK;!w_4rs;{H1rcoj#e|%Z8z0B^(YSPWTsE2y<*e^S;I}L0nZ+)-0%> zaQ8@P_iapM3^v^*B0?tcb`)`PlJl2qL*Kqj#HlHiam6i9`-ad8LKt|OUkEe@iY3ZV z6kt8Dp}UkfKnZjL(~6HU;vBeo$-Zv=Fb|gwR&)n`LzU<^(4d-a?L9)F2e&ZOjmzQ- znW{hK*XRWS(gZecl)<`%L6YWH-v!EyMypip670^=-|g%l-w$#@kYV7^6n%JD^y}#f z#pn4r^yz*V$?(lxKP`a{jir#UTev>`6 z-Fs&@#5`}?<)6(rhdwS~V`xvJvtFJW*TqVIRm)`Nh*~6f*1WQN^DV0dL)}j~yuB~W zUb;6H@1pP4Uzlu^-|NT9kXk(NZ_U1~vd>z${d&BpXf%w#K#6UbnXf6a%1c1?&kh8k z8`!Y^DpJJP)l!ZiZ!H5<&4Fj|3j=+Dto_k;m^U2i9S5sPslzKtiukx8%&kgh4l@0n z7Pi#gKbQ4uA^h4t_jnW^n!|YNnB&ULWuW1$CoOy!VJ~5039S*m$tRiG?RNuAgQA{w zG|*`Yv($Qa6C7#wTb(=yu7GomXouTuowX!;w$0lF864Kr1ESqvp-db57a~`=Z5d|@ z8!*64>J5lq*L9BwZBa$TYMX*pI8h(;AW4Sf)Wh$Gn?*t3B9M>_Vc(_^8prEeX6joO z(zK8z+~EG}WmWuxtwDsP$ULZ3wN#c_R;Q?2_R|jt#Yz<5w2)Gd6Yn?FVOomIne}FE zcOf})+U|Mt#c>P46JHcZ(mDc~Wf4K?+=|mE+#H)ZAPZ0ZDg$RA6*vQvw-a1p3nie_ zWa`emj|1D4Aeb_(SrPSkf>y92vjlcCrXm zMnqBZ4M`OWkk7Y=9w)bwf}qR6nL$-y>M&%BBHww81wbh4yK4`VxdmH$j>SW7M={kG zAx{&97h$cKPjA64O6|~_Py4QQa>DD0VAV3ZH@ts6z>lJ;n6RaPt7m3(p zbZ_p@t1Rv$BTql@tFRQrq=5hvi|>~n4Z*yF^)OLSEkWIg%J#DmiUk#q2|^CiwNl%8&0RkhxdGG3M6Ld!^s`|bxzo+3tCsfey>alJ$VI%VlV z`3aC6F9yb@4+S*N<&wbYaf3!T@UDxt>Cr9CI38+kO5UjvPBU%!Efd+sUOV>Y#|47| zp&BMdREpztCDR|y14aOKD`BRmM%YeUrkEzoDEsSW{rMuk&3yf*9f~Vm4!GZ|p=%;- z$oPgu8-#$&oXmD>w_0jU@GXt`xgzE9;n|r>?1*ww9Ts^aSxEc#E2w)ijApRWX^{I} z$R!@8IieovEEeiJm z=!2WQe#PAHR{P!=q&uN`#aUTBMYWh9TAIq_ysS9gv2e(de*!k*)}ld3 z4_g=RK^+$A2-}dI=y7R4@IWlGEB)L>HO64#A(_`<7uB(vTCA&eaGmi)7PXx5K)#*& zC-FL$kwCdv87q?fwa_rOx#ZqM$Btq_L=5ZmXrg4w5&B&r4crxL$n3Q}t#b}img;}; zB^z5yoqS*$DX!|oJR@gA&zNVr@Om(n#SCSv#7N(#Heg1l`?+5(jzsm!ok_H{F^%%@ z_|OIab#w=*%)bayDx|CHTd1SHZe<9ec!_@8c*}6j+R*qDY`1i@v3o+xd4t@-VnvX? zt#bC9GsE3xkQxY_&L8}9G*AgU>%qjl%m{|~CPTXAwFeXdQgC#bpkM*Qv(7as5$?M( z&i608_k;842T(6Q@A^Om--!5=z>9pIj5(r{7L)%hBWv?TNhlaz3f zpQI{@A{BMD;cB=X>I!E%bYc4Jk=P7p;MLp5i3<_KL~MiRSso%!Dj$uyH*d-UStdi# zFAjalg+Z;W*=Q`|cZA|q^z9H4dT%#2G7f)}3&w77TQ<@&;jlp5+nqL7OrIMMLI{kP zbocd|J>%p;Z_i~?KW_x|?v0JgWZg55j~@-KQ=)|as@Cd%z{7_Uw;uEnxP*stNOvBH zwvyW3j++hM`y+nuVCY>8UQ^PRdNT|oD6cc%Y{*nAJ1%dY(qa%klEC^Ofoby}>lL~r zIM^E&SyT78A(hiCPqWK!2D|{~jKL|-GdSB3!7KF=uSdd^U2raVru`^%u|I@Mk_Hqq zpx1zqbjQ3E!}p~yz66G_wSKJU4?@){Ou52YUf_B9U(MsI;56&;j)~1E)mgDk%Iyz z&3_ACZwca!Z23cz1#Dq|ZE_GQfcUX)xPts(1`8fIZWc9O7;FLI$7?cf%Q;bl1&$yg zDuf_GCPd*E;#V>-un{G|8Vsmj2vk`NEq7Dx`54L|Ugf9Ao=GPjAC1bn!=C9B%`PLN z*&Gn?tF3XTj5t*{gTB%c0OSJD;$4dB7r>TbU&jd%&0d>YeFJviz0bxAm+Jm)QW5?Y z=#f0k+O~H2V^w>Tlm`nN8P1OBfpqKP-#!c~`2ziF>0gqTy91kMX`X>cZ*43n&p?En zPtsR&z<_ZI5pmSYK{}&%N*;$6**E>WdxXAwE?2Fh&5`f4<1I08RDH8VFwINcr%Upr z^D6fxr@d^0Ep*;p_tNFIcM{CWSdkZCqpGU@L)k7RPnWd3{%8dgh{?f5D_)!^(holl zi$O!J22^Wf(tVuc=GC1QKKDOA61!07UFvC$`stC?L?WLG=Z8+o=oRG7Gl3wwg+UCT zK(?{UA=d*>85D*6yXC3)naN>u8TXNIue$6OCm!rYquxrN4 zWe0(i@+NMxdMW9J8tTj|-x;JC_XOh>E~a|TrSx{z&N{nJQBCJQitD`o&STA+(=sw9 zBmsS-Uq2^Wd)nBEQ^8Z3@cI-G_rJ6xP8`b77a@Q}E&>#rJ1$+3rJSvt9kJn51Fwv8 zvE>7kW);t)QY^SKs0k%P`#gCa9mkOg+je%cGoV;yqeGbN4g55Dtowr9uY*Yie_fVWz^sR*{o=v-31kso4P)}&wD zR?O`llP>Su%2Lr~0)??ha+Lh7!cK0(qte2#$EvA^xF%*y(3X2FdT7uL$#$6(J|LS& z+sqF~0lr~HbF@}?7TF9fs$Da9xvr;Q^;CzV4wMCx8PXaY1DgX47Zex7vU)-U9hc4t zt6Od{asH9wGLHDgEGpEf;6Z9gsKyF?H=#o3quvv}1NtSw(CLbzdfoH7|Ft~nX73^B zFYC`8VOzePiFDSG;A{XQ-Au|6Orb}3-Z7};Eg1gAdCu2LzsjoXyBiz<_ZJ#MJ-+_g zGINb(1bA?1`Y?8O3)y@0*KrU;s!;B~ggajwxBDn z$K&*`w;U-WpO4IwusOgmecS@0jVpxd=&(J5kI@|+h0ag)OC~m-9yUV9)1Ul(R6ijm zONmliZ%__uZ>5P`Yv1jBK5P~*wl$F}PD}OVifZc@wAOBGzYMH%tuEIoSi%F^xpGBe z;aJgqkpTvUr{_N@wKjWT$m}nq@=XbOosPnF=nP&-hY!^ql8^Mcy-rIAdK4j(uQnd? z4+j|j=yR9VCWpKZ(m_|0Z+Hs+&t>XRJjh5YFyVJXE zec5Fe5JeTZA`3fy*a(Q)bmDkkhLQ@6G$ZY~wXk`_niz0-yu|vzGD&*^4y2`cPvMyC z$H~7OB(Nb7D^v5@VMosNzqLCUesVOpx{Ut^vQszy=eSZ_@ODhMtjHG5jwc!&^G#8V z`?-G2p>!I@k{5RqX_njlxb`C#R7{JpAV;YK)ebE+?F1*R1PTsG{_RiFfP|@?`!p|s$xf<$CW;I+Vy7^6015r1Vjyr z)CD97deNUX8cR`9E zzs0P9F|XIn8yg?DcbNQ_+v4c`Tc$Q>Gy~vh3qo7TGRua~3Dv~a8rb`cg2~#OpWfs| zBMhh}>Os5-EdV>YS00>h0}BC+1<=8OIM(5120F=XAwth80MO}q-8d!S>9w3)A?Ox~ zTY#aV;|HUc_?aCKgPxa@9kXwKkMoaDz!y)?P{9K;*UDd=R%ZI2QGSU2TV_rh?D50% z8`d2QTG{|oph<=BVkJpKpjuEkwa9w-zl0MbY!m<__&$9ujm9w9=^CLPq4z%c&Akigm`O$I zs=PZKz_oSYJCXj+edC z_hZePp>Oi{btl zV3Yxss$A*vjOMq;!84XNcIB7<73idC{?RW~ij50eN-MPumnO8#%M&yYDKnQ|QRUwS z$rsc4T5rO?AJ?&daN9>X7pI2SZ^P4GALkQYvarbWDqm77#6Y_W*wqpXPseO9IH%|| z{_wylNDsEf0s!18*!^@MV!+Ue6MOo@2=_=cG>8x-Vl`}s*=~r~{M6=5rFb@25ngso zr7j7ejfBJIeAJiPU_xy7J({4yXE(uE)&e@>e!BX5rEA0K;{dD32xM>x1;xCOcR?!zHb_vE9jOHw>zLuXUYQ}~rI z6MjvjFi^nRsvcP+g9LroW%Wj zQXkrJ=7gxcbT1eayc64s?;(3N;!$_7L?eP#Zke8$IvuV;{J$Q&gm>o2 zN5i#MkL3WXTDxyQA=TmVw{W(8a4WsZsxK*-l0!seQYm)2W|48j32x{!#XjnPPsnBj z&>J3I`?U&me8=NDIE>BMzuZL3INP87J|cje!4dlH@SVf;eJa+wGk(u_o@jH= zC*m?5{TuD;$E7C=nXdUS-i; zf9AZJ$S-xR7OX`%+-fG!Z7N-h6)ZLi7E<4Y;Ck z^L^06^j3;!sn1+&19!e)555_!&FKR2#^wm*52f?LO@)SWWf6A@J#z(RihWeS$(LRQ z!7`PGKq%lFB+o>+yL|)0IF6gssWPQtz)VAb2mj^#T})i;T-Z z=JPfbcDwM%7_+vJPO$*Jy4SPR?eE|%3k)H#emMr)4ayNN%!@O@n)p{Ibozo`PYZ6B zot~GS?)OzC4Zfiz&%tXsk~){VXaue;KBtY)PS9d)sd7c?o}Lk=1!Zz?Z)Sa6X^0D= zju1jD!m)UGwD^RQdkZvempVpn3b^#*$+*?a)Yr9E=&Jlp$Vj4-8|^!Uq;Hf{Gl%W`?Y)C*8I z1Ul*EGVjmV*DfLZxCR|RRqKPa$ML4#zn@o^NJ5e4bo9TsRobc<^@aD()EBGrW zyia8B6x?bK+1jnWz(ORq>$^#7)|Tr@t53B*G!T=ZLV?4|(@}+K^J(EDkn8h4*~j^A zKJW6{=*5lo(ucwGf#>vCnrrg{lJL}yQYgwlrNG> zWz2w*nFmgn5+dYY59uu+<#H8du0>$HIyC5zu>&Q;3jX>66H=YUOS6_Y;ODdkJ~hUG z8zHB`j6xc8MMAM{ySoooFY}uNA3JUZ0(yPc9xdov8sg=6{1qj;=Ll8Y-S|=kpA_ zKkMSlBUTq-DX962`3LPDK*53bd5kWr5MHm28F!-XzG^_O=P@lYhdR0^L-g`)Bo(I`+Ugw)EU3uTrqnm96x2NJdr!D`gky8+{*ONbybpQ zJgj|AR9cIB96{syIoP&8-VovCmyId99Fab z4Sr=X;Y{b3+69k$K+ zPjVN~?S$C}?PXFD7K`PE_sS*jYT$O*TC_*yx_5A)AeDH*p7mE8L|j zT6%i;leoxWBueLce>Soc2IL^1CTog$JG(BQfz0M7)n*6bj&!N#h?#ccT8#+l8sXdr ziRk(U%?6Wf8PpTL`4I@_2w4bsWfdhcnt*57NC4bZue%ga7NJC29qIY1~%$jkTvdKe%qWeGN40JGXe^2zeXyVvr-OhHi(6l>tO=c(>pc+f^7AgT)Amowm*Abu&@Q@}1mMJmn z&p&4-Am|9RuH+}ZM);4+EGtGV6*_oJalG)1rb}70`?qIg! zBhdh!oP4kSJASYjRmuB9OAI>W*uJ@Cphg!Az)ts=ho1767xw{q9nwm3#1m+TG4f&! zDCl3>{6NR@5ZmFtE5X>0)`%{~#@oNNzV6XJJDk8JPnRDq+DC=M<{q2ghN0x0I`^jL zKV4f3SRLG`WNCgFZ5g|8JAA-TpVZv%N%eEnI71wL@QN!UQi|QEKQ~$9ZFR=F4&c`O zpkUv;mvf)yy)xa5?U&gN*`Y|mN6cFHq1c2U4+XgDERD+S>BIe)U0SwoC~>X_H;kJ0 z{ciz#6Za4A*3&1dOiD_55dNJjyvZ!a>=4)hH43F(EQoJgk z_i5~DaS3VR-bzt<4Qi=n(pezvbA1!AQ(%kDzJ`@QkA#+u)DM{MVGA}i2l@WtZc-F0 z11@<)b&{1QB=st17rR{d+&kTdk@bsQ8gU0D{uD2qB^Azq?rhwwczI{XBEtP0+XQ+I zB+Wk!B+wX|vQh=LyuvY<-|HcU+&SQAg1lQBYvuUzPkfMc$6AxLly#`}b8G&R*Y;%{ z4NoYefQR)Ye)h9Fc(ZAK>qR*)M}ktZrg3Mcai^vMOGaLaWm5(mrdprPs~tk7Zr1kk zKHFa#Mtj2~=+Foj9{qj{tFd`_$#IekIeB~EOT>qJ(ARlFc64@j^fpsqV_ki<$@0;C z!azt7auJdGVBPq)c>z$Vy-?DX+zk>5D!lS@Ts)p+>53NKs__Z^=ZALvju&(NkM#ai zNnc5}HlzU>KRJ%a4uvlj#Mt>hUvtu|_VoLD9fs9$c{T?FW3qaa9@9D^3gyp=HN&6N z`vH*g*P<;tOK_7}6b*6lO~`2Uxt?r!p_QDSN&dIa2o@Vc9cLg43(8J=sX!B46nrAD zlz4CheO4Go#Wz0UcL6==(jP>~g{(r8FXo#C=cp=q!L;Yia^>k1!#9ZzI+ z!1MWe@Nm`SV5>H@Ywd?#LbT1iopxK?MFlU}5QUw;j?nrQK5A09AP#(d57M5U!gYsS z%IojQsk=u6m)9wyqg$JqRkan-SqT6#Z-U?xJUDQ5gb==ne04>y3zbwTK}H)}1mtLC zNq>2reg_RbsBIOpy7&~gZBVE&bblXr@$1*&YxT3?rAEf>XLg2<;6X3v@+#7Z_Cqm& z`$#@dMN04aCO7mtdye#gDsgv>V57U5Kc~ftyv%f)yH*bGHxYp41k;r6N~EHy1HAA-oc{}uvV)cfA`Dx(CZqVj8{&u*{9AbTvw@QDT zmF$$UHTKj7voU0KRQI@oej~xmEQfb(vWHG<2H##ZRl4^Mi@Z-^9aI;e#d9&Bm%lnDC{H1`4;Ka{F9v9K*)G*d14%4jKD zg8f8t*YNnh%{|$~1gG~dE&l}2I>=MluMr=r0H~BzWj!zhSWG#UQi&`{pZF(q;|rzY z7vgcQku7;tC{;0FNX=zfDNz@ey2tameC`O(jAm%>;r2J1GncKs?%Gu`%XdoxpMp%B_F*35^EGF4r!oibB5>B=_I!kqmoAnmfjJ^shm4umg z4oH56crBrIXbR9t6YjVux=+0mj*%n+NLT_-$>SukuUwjn-_&7$s2Xd@Gh0wDl@)0e z^O&g^&$=9y`%^>|XzrG3?>M`M6sZ?!qSIVEhu> z2NL-c`$<-IxsbjP*1W}!>%9z5LAB8Ps-`r)(4#-;!@C1(c4B=x2ZdIB{QH&K>BytTHeolOLb;e2){$>4fLo!nmQEpmZH$#xW zgUb-hN^b%S&Q+@6hSZeF(LZjK1rz&oR2GPp=w%U@faF%^hIFcgO-V)wfy*|dPc_ye z%PE^Y=2XcDB(8)N<>G01tVpw_LmKcRoT+=$5niGm0O0xJ(qh~jXE>>IrimRT{SDmX zh_l_JE1^d;(je^`<6*xyiv1rOjE+teVpJ?}3_3+E7wPMe^)kc%FX}Bb{O`mD9EuUN z88W`MmHw%$8!;)a?C;cp?BiFTN`t#58>Lgolq3Yd9&ODWD5v31dq9g8m{wrID+rw* zMsDYFjQyB~9|PU+-z#zshGDWZ%JjYefnRuE*4}pzcRL zE%zi~l7q4iCgQRl38fn9!Q8^|6SNK|Z@h_e8-*-D^-8GVa~>?x-AgOFY!GQ>+w-Cx z?lFy*D^>PWys$G1QG<0+H5SM)7DzYT80%ULs^pk9a$L8uukPrZz2{+Ez-r>8bDqfw z48{NhnTnCKu$86rOg&Z=yV%mw47P|Z zi>Sd0YW+xKc8;>nDiv_MYOD`DVXV%jdwy8l==hlEbU)nXwLAY5BPjOWYjFoHyUU?*lZD@}xhjpL2y{ z-JYPPIiNtm{|GhRm83=F59|xGT)sWQBNiyx~~k0^L_G8^1^3j z?4M7XcOJuCKq%A?9X9Cmy*$RR62;~)w~jKuMNROtnrV=pNGVFf*S^0={zIgEnX0x) z|9)57DV}-s0~x^1;T>I&9(K}44~e|apL_KQS09wd3&Rt_aVL`y6|~k()OdsqPwe`U zFvSU%dOrICCsT;Sg|+-?Au4I@bwNP(zU0%h>`HFbvxND#D>T4#95ro=X!w4FYFV)f zCMGA7k_oGLn1{6LRLZdS0&K6ly^6t4KRRR%fCXSBON~fK)DL{8OaHDLH;!q(ntn0Y zq&M8jFDA$&m}37j{qFJUv9f`NJ>=qQkPN?D&`qVa?(GYOuAC3rR8zyZf^LJBV)yPbG~i!*`wwGxDaB7Bav7lW&Dd+jD~Wkqs(V;YidmLbD_Ao zM@9Z$3hJWgQrQFZHVkgblwnl8&2)J8NV!9EN6+#LY|$wk{W)ZY3sg1@GP(sbjjU=Q zKmVZrM(=m0AkQxsVDWWnQJGywc(50Kwp;B2Ajt)RIoK9_NN}>9L-JhBK+Ft6>Gw_E zM$Fobe~1PFRE!=To}QjwyL^Qr>6{}oWfCaB%@(@J$LD+7>gLPu>+)&Nm+B3=a0qY- zM7oVY2kEL)a&h5VPG>0cWb6HZM4fYEo!$1eW4p1@*tQ!qZfrKTogF7lnkH>*qp@w< z){bp^zx#Q9?>Xn6`xC5tt~uu#;~IyDM~iS^90=1IHxpA1f?Qpl$meU^7PQXVh-x?< zW+4a2l^fRBCroLpTH}3Eg!^r}nBYjczBcCZQvwd=Z%!9|1RZQEg7ctX@(?3SVyp_J zLtQdKLHff}-~8Eh9hT59gd52eWZj2peWN-~5h^=v!|KsEQKG5hNa^~bbF6@B*B*iA z9!h`C{3C#Bxd6Ma z_TmU1Pq4Vg$eN!uDs&g;gH2@q!NvYxo7!IfZ$}UyZ`y{M-?3<#?Aw2;_5J-x`TS-M z;QBBF^ndSB2Aym@#VyR3gcaR*(H({Ve)Zmu7Lr6rKo}8#=^3&p()&XbSLB6|hCv-z zfUgeLNp-uUmad~~i_7wt$On`O@-uFfvxY=?4t~;k*|u;bp#eHyH|~NpnIeZ1 zqd4Y6@}GrtLF1o)LtKAPvqt~IkPZE`6B#JcE^$c?#&l`g@o6&N6Sye1pO&kQg^6$Y zJ3SIsiueb{0v_bwE^B!IntjSp75fGIo&FwB&`EURNreqSDS83hlZGF zwwu992t{HzE%xn1{lGHW?;Zhl-0RC>Cjph#(tTrO2+)vTPheBsYYJ*uHYs47*+|Bm z{`fYh5!gZEh6jhVs8zBrah~z|E<56;EUIw{K{mn6>FTRS*PTFVjWOz%S2}mL_m>)& zndwDdS||{5V-r@+cxAVM=d}yvSZ5CY{%;-K5>xD2-0IcipMw&&1SrOJCS$7_3h%A1 zeiO-L!bfWQkWcB!e8MchltDUMie4rx$6Ne zAM8FVs@kh8=3;Y7IfJwd!Hj+nn;K17CN3jI+_~uE55qE2TkB+IgK`$91%tjnkhVcK z2<01X`5}&a9`KVonAHeOp4B^I9>AA&bO{n6WES?>uCt-<4s*KW3^h|PEs%TYQu#YR zB2at^OsS#GyddwEku|j@F_U=(N|VDy_EYQyM;}z9YTQX{(3Z`mG zTl4gqnm=L2{)hRRfA)W~og?{Tc}Ogjw5M=QnI*DLcBe_(n4?j4z>_0O*2hg(tJmGO zt=-aneb$Vrp}6hM;&;Q}$g~sS^u!Vh={)48iotE&Kxu40Uyh)ZcM2;cb!*S7)QFY> zTgx9ZNd2Qh>k5ctlaAL+OlrZNJ)hk| z=9EcyEJdFXH{W}JyLguYktvr*4YGmbN3ab<$S}zW|w99iD_5RSE#=|pSA1a9(H<P64*;o3nQJ>d)zs!s#!AIyr$dG1+P3`F;!r~2vQ^(8O$QrFY%PU8EDeE`>iDcP9Sy_X}r z7M21K^H{h0b|PIF=M#dOqb<$VBtP8)HMMiNf^b?6lSOa&JebR2P7iW*=;7;4{30W2 zp6>&!0I@IAxRFF}eU-lv-W%tBm^99MWV z9OQ(|V6*i97nddfUoUis!H$O#N#m(~k3xyOX1E!DN^5j7Df(K};&)R#CHg+(2zcrd zZD%>~>*TGPH?8X3Y=`?T4pR%EaOj6$djZKln$Xrw5fY5s7>(8A6PLTClony?`IPF? z>7t<##DIz>;@a?-hz#%ln|`)uwPO8*B+!~+nYsELkE*2?FT>2|zOr3vK)L-__aEyf z9-`aP#Bb=_AB9JHdS@o`Au&scodz!f#33TF#uJL{4p1%r{qg0yQD>A+==<^_wkseK zzb|Z@5U`PAOvX&c6=F<5Il1nrH%_3H5Zb4qOF$Ip3G@QIUIM&R#T|>a2M)0FY18!T z6#W6eAxW8pW5GK!Ba-)UmUSJVpHOBii6LYZLhnG9q)QfH{cSEn6A8a9B0b3{r4K#(i6Iiw@2To&?Gq`XjS?JSyZqjTKv1rt^ z5gZGdrCPp^Q6G*}A*zER2o~6*6ae~S3q)&W-FT_l!Rd;fM~n7ZMIz-|Z?)cslQAMh zitx0CL;JydZy3zYhqgmJP`ZQ~p9CuX{i?8FUOp!c@ar!gTayB(!u@kg9%~XuRqo~& ze5fezL9AQ{g4=^Phc-U7?>Ow92cMcVR2?GMjLM1OCh6a<6ykd=vTrXj->+ZtnmalZ z$Sw{JX4Xyl-sLJOVDyRgQbL2(&XYCg8|8P(Fr=n(~FdPAeZR$>$u6Dv{p}8 z=w28}a;kv80slc>5bT@(YpZaPuQ~ri!Td=e$%Fs52mfW|B;NVW&8Cg_`@zZ1$XeMU zS!Z2~-`g*p%r0m5>y?p%lacR^N`6i%W;`ZzE}hu2{l96Tw51e3(`P#Y??MpzUi_Xr&GIu4aQZdp(# z*LM4JuO?E{N6aMu?WTY1CpTrIwXIW$PVxACP^sE+bO~%&mnPW6xx7tCzj62mF_AkT z_Q&+BQVkNYQ6~=PG6Kpjw}8C<7CcMxrPj#X=yPCj;a^B`p`2Sj*$j8);b&Ev)U7)B z*z4^o(SA|COUbuBBfr2$z`e-oKH<1;;F%2MO|$(KQd(U=@v%v zZ3M?pJ!Y4iT6ucmSnTajEqj{QBdKD)Od8pv>%u3qHG-S5&>oRk;7kz?@$eP})?`5$ z37$17j4|PiT&2?aL|m=X6}EI05LoqACjGr`aP~_k){A@w*}Hii5=-uEizGfp?PR8k zglSwwrGx6+V4Z}MrB9?UxEL!w)|6OGawPxRuPUhA^NV;5p#LEAjME9`-UIzw%gQ7& zxy)W^O^ToIj6zT$)MQ$;IPXTo)LqLB$;n5P*V%nJfwC;4)lNfZ`c+vCI)N728f769 zHO$J)6xL%&wshBMkfVS7<9E?SW3U#K=mymWF3hYCk9f9)iEh=}YpA+wz1}Z^H3D_D;THde^?HPv!UfQEKW0 zv>jc3s|i!ID}LGM-Lhtk@9Eu!tVRiDv(il{xk#aYzZreo9%ff7T>~(55XIm}vkhu= z)`Q6PB%rgyfq&lH4Pi2U9inQDa>EV1upS1}k5xHFbHSmu2eL z#QvO?W~^wy>B~q+RfaI&ZE@u`!Z9l|;BM5$JHSd&aAEXFF2r&Ig*JjaZSXHUr1}rY zNXUJq%pVSVkY7l;3D{eq#h7x1h?zwZ6!}w-E4mxte7)p#p#>l}oSt+#-G%K@QH}d7 zXUqbH&C-FghA{5(PRq!c?ge&hC5~+>0j5e$J7HX5wb_}4&(O(h5NqitGZBl>*BpE< zW{9S0MIJGY>NBm}82nEpJuqy(WGy|wzu!p)VhC=~tYD?2JCUHw1TC%c7i>JM3B^O^ zv4iRDmbT*2vv);7LtO*tA7iXn@m((%4YS4qp~EOJ5|*f;5a<2}5)g%4G>Tw-yVRNv z;Dfxy?Cy=n5QF$As<@9o$&&tg1jRuVDMh^UEj4**vrg8%sJcR{UD;3>`z4V2;dPuN ztwTPjmmGhQIUrOUCJuHuN)$t01v6KbyNGm8sT2;ptu8~-wPvgH3<9sHZOd1=lhU~> zdE_%3C!NeII|PxS;-Nm}Q^us(aFq_~E3+-BWhkIId4kV;G!@ukYE>dF6(AGjsQPy>%ahfY5WV%P6%7#cQVATE>`X1;3Z*aQ+|UC;rN972WtOkPMu zpoZ^{;-&2Ea(^U+fFC32MB`mh6$2#5zYAfrxO~0G**8j%EC5il|eK-c5Ucrb~ zQvY(H-KO-f21efVW+)n(&G;i%T6nJZI)xgc(k=2@_g5r;nkTG+Eu}z=Z7l(qpWO-= zG;x~76}k1nr5REzT7)V+lv*L`SG4J37c7sEJyA5)MWkYgv|}TgazOd02q-;<^&C-? z6Z!!9pXBuvkUgSo^eQEeq0z(=ZNA&pp9xiW8c*>XH8%BcJ6-r-pgyd>UMqNL26ZRU zFJ%NesA!VRyC+o)zi_n22hZY2UuCE66O=n_Gc7=?Vz5JCb4{5H=zzIhd+0;Z+z>@i zd+$R}*N-4l(Wmt6T^YbFat6RBs-tMIR4}vwhk?dQRb^CsXp2>=3@I?jUQZ0dKm&7V zkG4D>fe8~kI9n;O|D|;(e+>h}On{5F(FJbEYOLye?Rp)>y`Ch*=<1UFv-@$YkHz#i zAvf4uO4x}}ojtg+^-}S|OhG7&KJ5^tjQffjIPe)=I!7Awh&go#YpAcR|Dxig*@B}1 zmJyAItcO?x^^HJzT1GT;>KV_Bvn^aea5X|jhH1x2z5RVa+=DwhV9H5swq`Nfa&Byv zq@D6bphs->G^NP&6~JMHm~?cAK;`j>S?~$Dy}(XBC%_%L%=f7qphhMIJp9fiUT^z2 z=Tnyg>?Ce2)$O0q`w#?+CJL)s?};GR#w~}yv;ks503sBwQv8>jmh{g9 zitswm0iR^3?86kb`RCo1`tcecimw@GnE%Aa_skPho=>J^n6HK$}5bq?2N0u?#dEzAYO!Wup}&jC}z2I1fwu)wa{ z=RI@!zJAyz@jL@vkZuimxK$wvCyF4|<$n#*3CaJ8=jD{`JV!oj_NA>l@F2J8Zt&t2 zS2ay#w|Ds6j0i3%i~N(}7;7jBc)8A8xQ~}=Yfa(MF;LW=_{CUCGg*3hRXw<&bzqDe zXa`kbD2}EgWvA-qGKhoz=SHB$$s-;@b?4hl+&TG6};7wejY} zxtEQ}0t?F}K3)Lvg51TtpI?R9DO-lAY{%g~eNK+P71Tp|Bv2bqzZUA{rM3QtMaQ3` znn%AmWtf=(_ANf5MRL)dpm_M3SqTHY?Kc@7za=DN1igS5%o$5KcN1R`R{50OmqKv9 zyF`DmY*0)1G0M-Cz}(ytsOg+FD}AG?>#=OVK+xSK2;lX2DcUPTmSIw9qp%=Mx8o(7 zOu5hOL10>OdtJ&!4vxbXuL;%^Xk~UvI){Nhlu7O;aJUDP@H6c@o7ptwFxZxP>6W=2 zp%dL2x|${QtnXNw`LGnUInM@v1q+aMhemM`8pz-we_F_?%!r1qSYO7fu^PzXBw5^m zBU;;OHQ4cK=pU`D;b7)rgIG7Q>6z#aW#B69$;#T!+3d?arnneKa~4|b+jc{D-QY_} z)1kmS8;N!I?9Q~+;_YbtC>r*zA92nB5C%jh2aZiRS87x=OHM%?TJ({SF6K25m7ig0 z9bk=J@Shx`=Um!VKMtOH-R!A7KV8pFG#P>h=R`jyJvYI}|3fBzWG^^{S?%8UIvW{+ zR%Ym-t~j=$!NY*}e!xwnqm*GIC{R1|a^skFR7jOpxfDD9vBw~bRDwb8f=F%%lVyBb z=obgtz6$>o->KRDT}$HNL*}`2$C@s0qA(sTOyB)75B+gF$Wi`>=q_I1S-^AoY^K3^ z{i|V%SYmM(gI$zNOD!^lI<4LD`XJ0H8<=UKGlgO)fz@`X+_#U#;U zOkpuL5xAz${+~tV+uXkkmnb|lUWHlqo_W(nIp%9D!uwAIL_R^5NnMyb&%dvI@*pspUSZvAvyD- zj@^x&u2RQxbVE*mz_*UJXsQtQGnmVfCP_7?2DK8eBKGo|^%V{$oCA~X%DNzN*bo?W z1L2w(H=*3LgQ(FXBCyvxVdvv|GdGd~GJuuq1q{U!d%2DTZd&Wr_5!D5*umj14`|}Z z5TAMA1)s9?nP5`V%O=n?L$h;|1h-~c^OaY~_;%N!;{?~y0~047Ll9GlFl=(luC_X+ zuDU)Vy1LQ3Kx%I{mf2f3E8I2;#uJ!K8YKuN33Zy(%@rrc5`|pYWy{H8q-D$M4=Oj+ z{z6aLzmi7#Ym#!6KJ)1Q49|C+Z8QNEeN>miXbBOI8H;zS3E90*W*4ixpkQ{Vs5{)K z#W!=bHfomqn5mY|Csb&t8?RVt(K5EE#wf=`(8WjKX&e|WuQ^+6c1YHCpVSa%Bta=} za#>Ug`GR2sTX>Xg7}CfSV1#{U+cM@OBCG-(S!YrBT(QoP8%PmV>z9<1{;uBEX9;YFP%Z*;>y1t!I=Z zs_R*JS=Fi6f-#_1Ps=Qe`M{=)oJJ=*Pc9NgraOG{R4ySdl@&b+Jt`^LQMyBYkNCEDnY;- z)qkSD#AD%dFc}cQ@Tk^rt3v0PuV|y|eB8Sy6#2pwv8HE~;=`X{9)%q3U5{chWGVkn z%CpzjY&TK+3+4yYVprGacEOF_5ZM|gSg~%TJjUAo&)9yc|Fur#w}<}Q`#`wOviI5i zaj4QW$Z|_AcC4Su_Va&U32`*?zw6*6y4E}BcPB^rn!sK}{go+`1z5i*l0{pRcj)YUEtMItHh$~}`wV2#< zHiRp|FLGCPkwPcYxW-xBRQTJjthd}FLTmZ&U0=>jDnpjPT(D8yVCW%Du-HO_gZ7G! zzvjL_V#_13DLVAHz9JoujW}pLP=7X~k+g;_qxS58M=k;JOAj9*dox<0;~+Sdx+28u zX(dx);-1ra5i>xBwbn?HYo8ANQ8%_R)*E!OzJA;0e7mX&_yKwZy$QeVY&_0Xz~sPk zfuG03%Wu<5Q+Br%7GF^oyxQkkQ6nJMiwCaK_EEDbe zb!v3ktxRe-h?ph_wbE_%9V=@ZnHOiJ$ty~3BC`2&1Q$>r7%WqLJv{>3>Yy{marv^& zP4XD#^@9dzyiT=J^X_>twU^tB5Gts1PjNQF-oE#ARs?NDuMZewX*)k=oF+PrV@>z; zYKJtGJKI+|uNatGlbN|ZHRYJ)c<;k3H4Ypvq^6Rvuz=Afv0z^J~j8Zbf-h=UOxR&+|hz^7 zNAS3Fn{tPGjDldXa~Mt{3&+&{H}$qu{PPC@u1yQ(P&g^9(Z^p-V#eSv0p~kCuRw6c z?{hTpf4N@M$_{V=8fINwAGBsM_QeY;%3;C1DmR$I0leZ4Zi4sSn zGJv+lVO#;hLx-}w_@kY&`|6ArinEC%2|FmEZg5{WsFYB332mp=wSv4~_QQogB$dMa zJK)jDFt=sec)H~5jg%|yJ7)NJEQ5F8>506GQ@WCC^d1bDPa$U~w*thUh>Hj`9_4g3*R@ zh5n6nXnFXwb(p;adcFi<0UkR%uSa}idzf=oBgowY<(9<27!83yMzKP!dQG;>Ak#w` zysLAQ4sOai;E5vzj|r1Y$m;t!<1U(HU0}7D4rOHu68Wi}Tg79WyebPnismLYslUjO zWQiaBn23%cG9n)~POR8%_gss1$`PTO@DH{oN^ofVsyGZKZYF-cY4yWm%hEZPZQbCY zht&WdD9#B&C0=5JklT9v4(9bAsUeGsLqDdr<7r*8!PgMx9)8F@reczU#!XZ7e51JP9;<6|a6r>|_r1X3?z6EZ>V{AMZ{ zwt#RlK=_BkDNWa>#DRB2Ge9r;xA}WPvsn$%$put9uk5v-qfJ=uVWz1AKq9#1SrPb9 zd0BLy~oK87JLh~m;r;LQxymk_zDb&H0pR2VNiu2$=CE% z(dW-@>l_|Ok%AdOib@b9k0Ory*&H@d<@uSD70o<4sigx6F@u}T8~l9jgLq**3+Dkd`3 zj&bFAH3##eMM$BJ$p(LlZC-lh)@;y>Q&=kaAqo|D0Xt#>iuM+IJ^g&wi)RSj>T~Yj zQbGET>5n=5s_#(@i}2D^(RPKy!(+G-kF{P8PWd9bGE&KZS?j=9kAn;iO$7%B1>NKB z8CEyJ&(enMc1Mqf4nPo4Re42SmD{d0NVVZH2-yE%MDKjA5PiPR_B)&c`IKI~tA8Pl z9xke+?E-+km|*fo3$)cp8mqbwHHl^`GrIU~QuhR!Y6_g4Bjf$KGJ+wMftAkxu z;?*B0x$xJH?Z&bsKg!p7;>Zbbc11sD;Rf{nR1&LSjlIPx6v=8Mr+f7W*x7}Qyvgy5 zni0JGIlS7@>F|qn7+^G{_eW?&9zDnh#_Sz^YAv}`oW3sNKqQy+MiVv9;f+ueRiZnr z^tm(C9uOk4X=p=jJSEz)^=X`};zTbVx-eG!bFQxH9PW?TwcK^}u+9`<68dG!gEbOE zvYAryi)NlD=zqiR+89^`_KZhw-)4a|qu>!c-D$CU>L~j391D62A$z~?@_E=)20CO5 zx4Y(?yTw+BSTQN4%v9%8A|&D-g?FPuq6XPC-LGJEr}Z$rQYudZi|Riha6L2|jf3$W zud(%6@1FGo6|d1P!$#$T++hnDoirrfQ0aIR213?hIQxJfb>udN7bnQ-k>V+@{N+v( z^$Bc^6~TtYOV3jZNqUr!i*$ipk@c=EaZ8}EKlJ77*8xG+Vk;Y^^Nu=5clEm;5cBtB z1=ER+sz2dpJC3izMH0Amf-U~0(lN>hv-Q-bn_g4by%CMBn$uo;(+;FVm_#~@s(h-> z+OCTQ#ALr;;XMIAc7faQKoCJ?R%Y%Dp{a7t0=Dh~2BzC7cTvH#dc!TM{8<1rh6lU@ zCMGt%9A|k$^&nrjbwwRQtUc+kUHY({P!-7#O_hakmjdKDC%bMR6$P#@Cy{~3KP9fJg;!Q3!{hZ7{i zQJn)_NIrq1K+N5Dlh=<=fj;6deTMMp4u0A{>=VTtYz$)k-h#kLc8_J*h=!G%2BHiH zCFjK~$TvufSJ8o;82^%d`pLq+0So)7#nS~|;PXoe;8pZ3JK$|`?ecBEUf>Bc*T=Y` z!$K2)!G;G>zgTiQTANp>dg8*7S)TsY?8jH0^E9QZsTv#JNh%fCLzYN-A9$oEhF%Sj zPLOe<2S53((S-y}^eUHQ@dd$)#mU$}*Jwp7kY~5flEs(Y{`>L6IZkUkmGSq$6RaO(~Yh zU3dHhc?Pjmam^Ehi0*yW#g^FSuXd@9tSvVUq=q);rHCgNqk{Jh9H|^Ml6jYIae)om zh0{SJ-RJE8Yk$1y|5^HjcKXwPA?6`&kpA$#9SM2-xVw(%dUF(cn|TDC%}jwlm^=M^ z_|B8=_1T%RXAGsR64YE0;nZQBq_(00qk>jj)N|5$(z?%Z#)nnj#lK=oG*^M1f8Cet zB)$aR>fnD(23|}cm2=511y+ieLh%v%z+or-g*^CEH(Qw1ThH9)C1fu&Y3W$a+F4h> znxf^pIxZZWRZ9rbO~=K=S`@$jisVT^zmBnTHN_X)dUb|FzWS~bbEsT-b$2cKw&e>7 zB=ftZeTwLM<|hrf!uTW{v_*<-%a$Rk4;Q2@UL#!yev>0T!U_wS*xD}Z)`kDbV>Q6S zwhC1hJ=#ULG{%R>LzmxsZ-A=i>7~3Tr`TR4ma<^RAI48q{{423FvCGc0SOLy!cTlm z7W`WbX3ovo1WRj7my6?K*a}^_VJyA#B_mA=Gz}E3<=m>M`>oFKWFg?#f=#{f6Qtnz zR%Qth?d*u{zLqNCljqoKB?9M6h({(SD}O&1t6X#ZKbaGfk* zv&lmb&C+{FBtul{)CxS(*=|6lGKFI|px6zQB)?+qgX7Nrb0Pe5@O!`fG>59EJVQK7 zuRiw_^?Q^7ouh;108h6I@v)s>w2Gryv&Zk=cZJjPB%wp1VA3E9AxaU{F;)0QQ_3ML z*Tt>WIdewZM6Qscfbq;wkEtO>>u1qzdne*W^H14cY(L>!`;iJ59`lLBtPxzfycE}z zIhV2T3TMv>+T%`RzTPtBX6^-rW0wNO@)kwhsFtn}_QWegRbf0of&ULV>#w-NuAz*9 zO%F(79wkb=^xBf=J5_j7ymXhm^T&_Wtour4d}kg;uA&kh0r+ct&8is9mN=@v^X?76 z)WY4lyJ^xL|Ig8I(}7k|;Grh4>thNK()BiVxdYzu#~xMcS*1apkP41_ z`PMYkJB?3$$#UK$wlO~j%@zr@ZAnTBjJbz5v+cUL<(^a>>^$5}9D5L&pT*u9jU&T; zsPH{qxY-kK)S)y0+#WH++^Vf6wsD``h@CVFRLYP(3HP+8n&=9qj2U-pyAAfHp=mOO zLWH1I*w=8_2e&l3%DhJQ`OeT};UmFJAbnae{x;#HeYx!=&^O{29{)`GQ0zLMM#%k% z;c_AAt>-%ydi3KxmPgVgt_l+ykNRYYz$H=$g|nfeEyG_B?B~OmBCwYLGelFj{Ch~E zftkG~-|6I)-8*sgN)?;v3kG}@S#AqwpH5rP@ylpd)x-;<(ep_@=mPWxcz)&WdYS0r z6KVzV$|(b2ZL%2ENkA0Dp-CgAwT^3z4T^K+Wv#7tX$PgH?(mfCrdIa6Y-~aOKDJ(m zUcLTOR-3I$T`sAy({SXz)B--#xi!Z@CHoMVx zEC}gHIH-bjO{+E`H zo2kQ_8zH(InOG!N(S%T_Q|35t+ZHhMD5Z${zGdra8^V`z6mcJ?k*gAQ^3RXc(ZA;cEfEe-ToARrwXptEDoKEOE5&QzEn~VS^QY|MuDZoNNcT@M?;DWe5`iMI3gA zkPWBbM(FK{KH&Y9YCmQt^a$Q2a%Ki3ywKHa!yXdkl@P2Ki;~lpgH9egKMrp7y zfPzZW zx@K&~v%HK(gyqI0cEG9i+-|ctd85UUY&V*^B#rYpi|p=W-iB?cs3`X^U@zwE>2k&LJVAPcE01yE&mbWRG^OCp`hRYPee-{~d~eae9n4atXaYOnIe-CAAFLneM(;q7 zBjDp~>9VuI=WXR}bLpbYvE4&Vqe;SCK%Hrl<0m4x%m#CzaKSiWtM`$guQQR0KK=at z?2~Bq`QQ$Qo*<>b2=+3cNqERlEUG6FYJsqTG0tVHRz*H|5+jl76o+Z@2h$PF{so*r zD^RGl5X=1K=mJKLEJ-hQbC};?2Xpa@RSB^YrDFr4^!gJ?U={jhbR1HKQW4|m(G6lO z1^gch!<<+VeTPi!dco1#mcNEg2^Ecn8^@|2KO?Z@q}mb#$bw%32)1m_%Gi(BEnPnp zBxRJc4dTD57tq5>FDuzoRDU)`bTSN5f#iZNfeZ!9fPe#lr>+mttJ^LR#3g7)jSiVk zBy{n0y4*wnnH?@F!%=Gj3Cz5M!$%rjR_Ai|@4YV#jpydH^Xtz=56>DOCYsS`a;y3C zT7edGv1s?UZHuB!QH}6Z8=gGF6Ja?kJ(f%PyNEA!fz&YSS>8TX%eUS=G|_aePvf-U zqEF9IC@!%nQyumjZLrbGK4MY;4_WIROKSrx;t_~6%5hn&yV9IQ38n!@;D8Zq;I;{V zg4nazx4DaVU}TdN?Z6cb3!ENpaIUBk>XyR%y9ykM}i@8+J47Pl+roSF6g z-zyN1k-z+SU>cPMqk%8Oe z;b^gATD}m0DEYH$*7jID=!0vIm;ciCLWTQLD%US0>~KkRXLe&j&O{(ncHv0L+VFQC zDuRbE?bLs0KOCbI|97KA9y4*~)7UC0kpW&};4eE~s{q%Yfa{Hju8-q%+R{wGdFJa& z;yYoCU5-g+G%UKM6m-dOi@Fv5JRh=wm4x$$X0GL3LOKNKWmG!*_1j2aD5A>dixy^1 z@E9y?HB=3})h1SCp2#1@8S!uQQGaqAfqyu0{gpkP<%%w2#OsL`N;%hhtGHo=?c75fjz0%P}Ycp?!)DUk3+1oIFIA zy14_hcGEu~H3*{+E37FNTm00wowygRN_q{s-5qc(kk?Zuu21a31?%_^;t`8hNdk(D z#f;q;yb5c`zf~gILqzIiU+3VGE?Reqm{UqLT(d`#0Td=%=jGtBEdM%g2YTD;m7ftV zS%lqA5Re**N=I|HyMXYP+gO(Y`=meNNDT~)&0|VdzTak60nU%LIzP^{J3bbdI(gT+ zUXx4HI^avQ!1H(un2O+TPowDnm(hJBN)MwyDkl+laMkPcC(ayvV*p#4XXNiBw0Gj< zUyuq*x0#4NS-kKDxmCq|3mn6#_iIejUn=?n*$Pr8a#!#RPy`yJnSr3Wf z4~#vQ-oZKwl8k3)rWirh60L`XU5_-AN`?+3^ay`MdNDJf*nKr%bRm=PW>jtB>{ycX zk?iRCn|0ZS?{h-fjkr}Aoe5mPZ$~3iq+Ph+xL`UdW=0*(eDflu&hAU4|87b}mH(ZN z&&*vrEDWp_zoVDiZTfs1<%@!jA3CDBk?9%b&Mv| z^!A#cl(G{!h#}C^3#8SxwAJE4D4njZMH)w{!PU%y)$>pHU7!viyIde*9)3Z4QN{9e zAc8359_170HcB2cRUgi|%xpdu8s!2Rr|X7J5``~mMfJ;6l)C6`dt*qtBsmKpU5rdxBG*H%t14b-p%VUE=;6Zv<{{iQ@Aaz*3IraBUqRP^o+-c`=_Hwvq^>mMP>Pls*8+^(db6=98|F!A zxCLw>PKrz0>Q#mi3ZlPOf!}w2b`(X7o&>FRXfK#^($5GVhLW|^>n?$FIwjJL(7zO@ ziC2^M6JmI~nzwTCKS^SS)DQloU0&i;Zw=O5HE0UnYFW~Sca72Zlufa&InmTk!_9O% zl2!RTIw83jW(n-%w&hwk&a*kwP$O2vZ5B=6y)gatTIWx!bWp+oTS34;3g092hBOIWUEQLbd5wXk^ICuCC@6}!y+mUA;%y1 z<;9Bi3JTNg=LGZ>()6*hekLL9zNpyxc$Ck_bcx-sWFtjn7p$}Q6SuSk$Mw_dqDMCr9ev@Yk=NBak4?ngrGz7gz3g> z;-x3jZ&RD|SE0!<4>iP5RXM-I{`4M|G|ukMeWR5ITE`y0>zNim$L_XEiXc;5i~4e} z0R)kr04PowKvH3e)Y+A^21oE$TJ-e?gE(>x1=uNoit-m>mI1!1@28oOGh42bP%MP}P9!0Ub{p9NUm28{!Llis^zi-A~ zmt_Y;o!)YDF@X8mh_+T^ag8DOL{Hp|R)s3ou!@`YYU`RV)R2)Dd@#rW(7>R%|J3=qoM(i!A# zBgK^FE;m5;h^yNQ)-UGV!e=%#_7!ayn=fk1M<@y4V`)S2oDrMt&VaC!)X*@I6#!cHAx3JtdNI{M@9UGatbi5>w#&+mjXj>M3t z+aoLd0+?-le7gR-YrufF1;>x;wkp80Ein6H70R)G7W5ec<&%j(s@vR3 zd!|Csl7>dp7p6>Z?Ixmn1H4=u#$eSwlgi6YlU#;d0;KL&I}bDO!-SNM&#v&|GakI! zf2gu$f6=c0M1v1l zQGg!*t5%6(IXXHSU*z%@RPG~vl4WG~?T)y59ZlM|mU zuGdkSjv>llKFsHEI=ow-m=3Mup8G&haXsg30~v{df79 zAM-EdX^w-fZFzEcAA0t-4B$TYDH~J_3eA3hI%H!MTO-8zHFJc-jXexCxm^*MszM(F zc9^Snf{@C!Bef&%-hpy3i;@PysM{!e5_w%yZ^jv_BN5Oho%)}NUw>D-){&>~S4BQj zF;1d}MlC!q_U1qC3U6PWUBHsT|E)ufnw(Le!t`NOw zSIwSz%W5m=W@>DlfBAjRJrIFmak^keEPn>IsC6(eZD-Prtm;D98L(}9acxT0fMs>b z(BosPdxNYpB1$hP+6f^>?5}h1mYs3zkQNg>rH+t*rQK&uI!R-0Aq~#9E$S=P+pX>B zon>*JF)%d)_Ssz;Fd14`KaP?`e@D&}Rz159sgpYb&fUPlt*|AfdN1yF98qwYg1*`wlp-li4{FAAH- z;5mTB_(6RL7z}_kqWmvO4gmRY`@RyDg4$Q#pkqL4AnbefP!}6;y&*&PcDGjV<8eu3 zBw+op5MEs0^F@b?+!F!I`>1&Md9os8N*_*RFF-vBF>#s)&y!90n2|;6Czc-qZwFTY zhZuM8W9Arnp;*s36nkjKg<3bqZ z8zwO~f6N!f=>cJgB+_X`O%<598)xo*2JJGi^<51FT6vw~`TFa#B8H#T{CEaT?67Q> ztdnjSR1{a{`Qd}Z!`R2%tBWV+)a3d2#NE6H9;?$NC*X1&xakRVvcd9}*h8 zwF-fjYCgAP_up^eyXd^TWi-RDz28Ko&O?q-v*O@>% zYyUx+zKz~g_~**ET`%+0Gi_^EtDw&dDq+Ij;D^j7;p`n5Sl z(2l|-SR|(iKOu^EAib|bGxiG@@fhXH;>?FNektq^hf+{Z4+hE_8|TFI)HAS`6{V>E z=G2M~3aUXnPLX_0rQ9nN!#9V;y`@NsVpsZ^?Brn`$XSNW*Vg#U#E^Uph5#}Ob`T>H z1w)K?8JI^tC}{5zh}5RMYf1FOe`10v$#LbT4GS^~wca`1etZ}q#ipk`W5<{S9Q+gh zBh|!|rdf0&ylASX{tYqwRI)t7Fi4lwv@63nPd;CVMEG?!wyNvqg>_TV`{EdQu=~jo z0WUcWPVZ+AQ@-|&+{zh7OO4Vr6b@N@q3$q!V2eKArv4>0T=nJAq?iY3%Hf@v+fm`Y7+Qi8 zitR%@aYaboAgoM;(P9reKcnCm*nE5G-P+Y^$`d|;@*xqgk|s&}QP5`}&lV$_h>Ezu;)Y zuG7xsa2NNpa#DW~`xRQRU#5;zx8tf;WS^i^2>uh**zcX-?(%Lq3N55mhPb~dEvm+n zY^x%)F!CgM2mBk#%FRljTgi z^EV8O$#`}Kk%5_o{PEggW^Tn)*r#e-gabc2vB8IUUEgYC`!gnMF-X61#nAv8Dp)l| zXTEgPE}>or@6goL9ThV1C;yTitne~PrYvH!W&!EHfqg6e-}A3$QYY$ovjRR6AF}}a z#a(%(`--Z_$uZyca_o|>ui(v6PtE!MA6M_#o>{nT3qP^hvDL9{cdSm*v2B}AoOEp4 zwr$&X(y^^KYoD|Bxvuxaynn%{nxjUIs=`WNb+QQV|IMbOMl0SQYcj~pqI52U$T*t_ zHoNy`!(}mdHiu<4=}!Ck*rUeMz+>wdv%8ZuS()|e z6hIhFd_&G@Woy?aA+3Srb7)17TMgEfFo1q1I$F(&$l6yJBwfLGJb+#o+Z7V1zUk=h zDl2^Qu2Za3V*8A`rc!kCvFleZcY#iF>)l-VX~Kj=8*M8pc_n3z`0jN}l-n@yS)W;L z@?~uu8uGSjN#aNHF`QwwI#0YtAjg%po1d)XaZ>o7=TPkgWK)MgiOI@|i+8Ql*W>9Z zQT0;$?Y1$XT{TPnV04U_AYXxG@8XSby3D~i=0M2|;F=gU)nQ7w@$PGFW2RohT_ybz1N;Ux1FnL012YNv zu5BU)_R^<`f7eIANpitj;lW-OgCzZ%$!LG#D{u|HSc?5`s1udH!5*117DvlJ{P zC4*w#p4?Ooc{5PcL3%$CRVEOz-nPg(G$K)WI_@eyw(`%a!5X-Ra69d{w$3AvFSH41 zrMh`(t(HD2Ku?xNDcz!r%o-D^&E25J89_4)3zDrRsE4)mhT5fjO)e`vQ^6lX=fBxx zZ{ZIWWg&>qJW=)kg;^Ol5}3|mzpIIX1vLHN`mZhAUXZ%|3dv6?*xB5 z1e=qGOR=4&O7fj+Li{e656;6TULPqqn7D59rbm^VJ|Ch5J zhlSS#Y0X2Q1pKx#t^e&_Vya<}hUv+I!rdo$tcFip9TXJ!(ih3|TID8zDci!&$pq5# z$D9r4;rL)#5a7$|KkDX2@KdQfA$Q^@-yaFrUy64I9n!nm2OiDZ>Sw~zsjdPD0cHRq zsFI$gCGe+9ukhxrXDr|6<>s4D&FuZ#W7Xb_0CN;B1O)|1NFfwbr3inP;R_2oCsKZ6 z4(szRXrb2p{h<}ok2`k!(*qb7=7XWq5Wq+(zyYh-Ir;*Pnl#9mGs1a#H64)#716L+ z3_>ai2U4)cD_oFE1V!^wOGRNI$wvs>2woIAk>^zN6t*x+y$z!D+&N{2!s0p=OkT(z z9+t}#>sX`$ewee7bLgcJWhzsxzckUff-b5epnOc;1V!&=ICd0dp3#V7qyYi}LH*bS z9*)Ek11=>z%s#Zxnut6G5)B5P)5aeLFgLTdGlPs+4)bUVwLL?p|0&7!20nZXiV6 zo>U`pC&k1$qa-7%o-RJ(*Xq(y!}rsmf~B36p9i^x={4Q)?-xFmeF>=+PqW0*_-p2Z zzREHlhFnVl8X}v*l)r@)+*y_T+0tcXT}ZB~nY3e2j0?XPm!-Rm&=5H#jDX}oa*&|- zTuO7{jn;)p8WPM`(>6le*gen#TAXlXx9Z@Cr_8imy(*@e-koz`Uh}Mp19r~K#g=&XlDrcwyp-goOA`?1UO|77jLR2P1tV=d1=k_b$6OGXdd&U`>wM%F?$sJ^|iZpg2qcCpy5Goo=oQ=ns zsE3LFu72^vhRp101$kP|rm-|!#Xv=i@ZEz=vT`R}O_`GU$W}K;6}t@IcrRRPc|=Ts zQySEM!o8@?y%uqyOqe4rQ%M@@=>YV>iG~wx`3I|gUdXqeCx_jhqO8weoI53DvcoN!m?DdVS%@6R?Q%^ z+fGzu`};9RD-K`|HgIIlnx0F?0tMoX7??G8eq%W+8Yk2aOrdI1Vkn_Zl+Hm?swv#Z zrfX(q%!pd#&@4od=d>js31kK@P9fC84om|lg(z8kt^ST@XPoV|!S+lw6a<053IBS) zsw{I4cc7#5g&zy5zjzCMCp9c-Y>2v^IhK}p-3r&LnHr6i;d(P@PGrskI^qMo zXT7)8_jo&BdywKMG{LzL-Ju#^xBsCM&5X!UZdPjM$-%$Ta7^3JkFVQqpBneiplxI6 zbX(+Th98m5dM$gx-@~(70K1}19!)f94(Fwzl9-heCjXmB2LsH_bq} zeS`iTOYFSxt|79-Ll6inQM*4INSR6kPKDlX=iY z+NZsA(`%kx=Psf4;%mS!#D`Mzgw5bSW(guV-DY~9j;doHP!eOc+;k8HD;QB&7Bl_7 z-1>fQTtout-{Y-X7*p^sG8S>Dv&F~F<0l(kPvhgI#&F(MP3i(gFm|jOB3E&`LFiBr zl_U;KE_KFcJv+Hs=H{EO%xC8^&5ginZ49PJTYN06!sW~dNG|$OkBu#KHIEzyAE}WD zo|@B2lTJj+JLRIHx&+F;IJN5nDWiU2r>qaTr)cr`HfH(AtA}mpseS>f)ezscw24ni zD!wwev*IKwO%f!-FJ&YY&p&In22i)&jg_I0Zb4eO5)Ft?D!|{rAEQl?v3I93MYOt{ zAbg)E-<}u09uT`;-XSkHH-&^CQZQplMIa&Jh?OvU@J+a23(uXCnP9Pv)L68(P3cOg z5O*G0tJf8O+2t%H2NatB=##Rb-+m1c0YP$ zVd%KsO)b`Wzpy(wAVfIUMLB*-aT{7S1RQ}9kt`Yi!6U#!L_$JxG=zr{M6WRH$j>JY zUD6xWBRAc>$jEsSP`yif!v+bB;0v)>sM4QI`bQ7L}rmV2{{pzI+1 zX{p=)Lx@!TL8}P&3RpaErWW;sY_n4h9(SYv$-f+j7C1>lm1D&bfr zA_~SmQRKv=L4&){T(y5eaZd# zBHuwVgod&#g!x^V^QWI=dy)!+(owEgaJDqBKG-Pca1N5cER5J4ZyJ&3Q9(>s1f_(@|^bK@)Dt82{DmO#+2p!^1`43 zu0%$t)mgk3v=vl-d8gRk^b*&DIhPByuPN|Kh1lqc>A}cdHYtq!MiN&-6g~}T@jW(m z8e@BV(zTRT4iaN7bUI^)87IL>j~C}&tW$)+xHk3`P@%c5FWGTu&$1Mv9eoT^{czi) zZ~A30?^Y$G@t(u%%utH&eifQGSf0+$FuAgcbNMQtakbx_8RiZK(()-Ri3RFkKjFk@ zhtakZVmbcb60k6t{(rEH`(2SEtMjdGdwU#DO&%9}@)ZA;3#MMK7$6D&;@9+p8wG)4 zf=^*3u$1T#nJS2lhP#N^U+d8WL{LYjp)ue}@#n?78Ze~i@%sImsaoKM4gWEXrJ<6K z>cS4S@QVH!_&~7`RHUYBr2NOBJ+|cvZlt-k;uy9t= zp8cDE9DREE_4-ftf_`2BzhWa-5XLp2TU?G47}IQPySw?+)pzA{2lIIyGHrj6&XXc* zx3}D= zp@0pg;*re7x^!82{zJ)&T?b+2x5Icd_F@$Jx@{JPTIdC2w5WK<&~I9|t{o|OY9>az zsedE-&G0SxfTmDHqGn%=6?|i^Bq&ne##SJOeARy65jVR^G9w2(Rr)TshrPS%j&7gZ^Q*d`LJpdPZNWOv z2!kY3xM+wJ%OJtPyt1;v&CSimkIj$RCGHBD`4hBu&vu1|2o$8=bB^JiA~=5oL2QUn zKjQcb=dPdWXJpGB-OaWQxrzYWsfonvTHh!0HpGac1xRPad$L5}75l$$>wMJ0G?&SC zV!$;tNyTQWk14z?($MRkkvTj=V2{c(SF zWF@7>i#c#d+s(GVb3;0vH5(y^9`ExVuokXC(gg;?$(MtWYLK&=@H^ z*gipA(?LyfWsSW`m18D#H;LI#>74~snJ7a0gQIZvf?xWCR0{N*I}utR%h4ZV(shiF z5I{2yS?CDp2s1M##yq+~ziDhGPGi0BGeH*++C_i-$9}Sav#DA{E4L%$^pHCwyUmBB(XMuoYX+>!YVB6C&%U1`3OnhYb#^ zm|jC~L&mP2OJL_Jc;O4`p9fE6qaLo^g;aFjk9@cmp4Hg5!`v*;H;SdCs?R;bubWJY zET5NVF}e;V$wz0ZhWOevy6Z7R@FUQP1nl0Dva-g_%+808kIvYoU}8`a|4}FZi%xCY zs9>zSkvaVyM0v;!Cj0S9nt|PhK*`r;fjmTjtegUp;Ly#UP{YxRM6Mj@24qmfQ3cfG z#-tE#%tXw0Y}CO3rXbihKLBzh5qUE{w8buZlpbR! zR36#16)s9eSOx4JSW(#6HwOPUwqgc?P=B!kJc)!#48;rde$mx(DpyJDHn*F$0+)6W zX2Z|v=Z*$+c2ID5CU8=C6i8w)dq|$d);5%3T3VC?Sg90&M+WmbDpZgjre8z;SmAiT zJrJf|N539@KP7+A^pb`|MK|c=K$+X$xZMU+q@GTC$h=APjh_nDk(qh0F6VQj^s`mr zzu!@Z&EEt8dlfF#x?MV|o2+R+e*-85>wrAXPdDSfpXfecXHVBBgxzA!hJ=>re&!LN zq-YA15yDek4r7d>ejv;Tg@;j#YoIw&&}2i{mFr#mnO-1Ms8Uwy9gFQEh`5aj8YYXL zdYh}+mI&r6*iE#LUSH(_D6#v=!n$NoMH*F#XYUhxpf@Y6)8Y2OG;kUQ>HP0y_dWir z7#&rj{en4zpxelX_@zux)!zhiS7sCl<05jGPap*8v>4qLo8sS1LBP#}`8j=2{^mIIsnsl1)ioGz7lTqn> zioAtov;SihB;pfZ+>P)F>SvN1?RPvFD_eqjdA2b8s5v^E>{Qk9I9!LD?!J9|4NLZw zc6!B6+WQ-4mEOA;lT09B7KCmRBEH{Q*%{w#yTNOJHMJ@9C&`G2QBmKvE#!=cqn2Nz zFDwWFT9e-BjCDa#t7hGq42uy9XOFheufdyyR{gj$l1N|69=WQaa424@ec$)wKpl3! z9YylCh78kS>Xg(?N9R5H==o9LXRcgzKu#leu-6HX;nhTdf>w6BBYJiE68e)Yr_3Fd zcyncxSvekFJxLa1DDqp!U|Ulh`Jq_;1y#|i2dlep>RnO7l4bqRXlHT_FvFh}3;b$n z#~$*QO>x=lUPiS(5(WLW**$@=JC;kfHP~kPAcn%q88l?G@g)63X;cd`4CS$0re?hm~57Fb7}%6G{w673T_?aKwV~ z>*cn|4!A;-Mx+ch&L}j4)3Enmn&)%^VQ=&WD>jJZAZBDqfO6awVg=VR>HgWnPJ;{$ zPrKW6_qXCM&yp~F?<2Qw0?FSta7H=@DHQdkxbh?@IuWAf|w3@_(NI-5uP29vB92tKnZ29NH8CQ zMR}$2dw#Dee0^R!VbODDad|}%CxixjX)3z*rcd%*mU@GecP_v1;bSr$v)g-j(bwZH z6;t;Mp?uI)Xb_#rB3UqT>|ZUIVp0u=*>e%?Y-K#RNUTDe|9HnIgLZXRxK^%(~u^Q->Q%kqHM@T*F4wb_lR zxbNYlE4DuK1`4NeHVa_cxQ?>Z)}|XvEU#kKeaP)>;wg&bX&08U&=lKJ;B!4%8X6$L z+h3rs6?~8{o;vUOt+K8`T7wt%4qA(?IQ5y}Mr77UJ~~zcK^;~9pV~nx`9Eq0Gzzo7 zIydhIkN4A3Btg;WT~(OH^>t>SjJN=nBFcMV8k z**g*`P%ebxU*pFlc?Z>%1vziKhK2a@njfF@gWSaCLtNXhC$szFc4+8P7tJ^|#7GE3 z{K`9A)9kn&I=o@12xQjJB`2RS!n@f~o@kfruZc6JN^AlIkK%LU*1jBKU@>~B<&hA_ z63oa5c8uunPhYRo&xZnEDA_(v*z;h$b-#fTLdq*^KY%GYXd<=3L#ep(OQ@`XEMnVP z#4?@a$*yHcG=r9;zXaluS8n*x9@5J#<}tj|C6Q24b4ckpFnA{AT8b6KAo$3%7~XJ{ zF^8kFbPj`}6b9FV89A&tc6#(XQ6D&#s^uMQ1<(#EY9k0)Jl&zo*5*7z8T~1oT*X(~YgcYw2k>5xU84!S}<8!iptmFPsIjLmo1Gd); zXruP`wk{Zh^EvO)0uT|?7av|9O{U|jR_XB7x3@Pds{DcMVNw7yfTz9ykdrV{#FVEO zr({4>9YUmiw;}BsIK=1Z;xCz=dzc%2II`0@y7C8&aH5^~_kF?%9XES2`AUWSg7Yo| z$AuGTCpb5W%54AgnR!Q4wJGk@e|F#-qug47&XS-kJk+M%FGRBD%N~^>jx=^2u~j=K z7f_+O40&(z$>2pl^9xDxIbZ*KM&+lBbV@2~9_Z&OuSa@*YJc=J{C~*nm--L#+(Mzl zsge<&TH?tf!P+=wzR z;|%8_hpMfslS82R zvx5%%hi6`hXtmY_`F*||IgQ0^p1ZJ>^8}5~$rNmMNX&H}5{F2|}hniYV zBAe<-vuK_E!tB%{@aJQd^ zS4e0ztdTC!ADxn6)CmXx%5GU1#^pw<=fa}qB+mfJ==Ro=c5U#+M!ltIPm{mIJXup=!f$r4#qd)(i(L+hi`7m&G#G|SQn zO}>2rysF$iUrUe={eGJdsUQ0D=%HS&SpgVs(h{e2q#r8UB>Xe~Wy<%r_=Vq8`DHg8 zuSU5(H%n&e>2kZ(?(LPMn4|bDzYs-=Dg za?rpHd|CM_3*5R9>)NhlgMJsFkQXgftm7oCcvY2_|7d-b?|*)@EJ$p!&i5&}u`Nd+ z{DWVS-CC&&MyqfM{lPnOEYx;nNYD^rmjkE~ze&Y!5l^~X$$DV`5bQ>Gf2h7se?9Va zJPk9{G#fMSf!yvwi)50r0I`UaV6iocIHsA6Dsm+JB0y5rj`g)9lOuJ&g$#`saj6U6 zp!K2(rrj8eOT&tD%+BGq6kEAaDriGakRwRTa&P?y2?J7!6VjwVNAGFE3a5Zu06F~5(s&7BGO zz6~6`Y%8$4A!Xm(R7es65=yJus!2LJYx3MReX{Xeq&V%4dXRrLt^Sn7`3HH$HWwr#oNHTFb@5`x zUAqMSsUW4nR%t%;aHy+}$~woX8fY7y^&poU0iOup6!$x>^v@*uUK`-g>6qg^#N|Ca ztT?$_WYZ4ArE3j2rI;5X!E)Wd9Y5_i=UP9`!M48pdyaRj4GR}rfsghJwng5xt*;Z- zG`1Iru>4qFs&B409!viP@%zqy%Drz4r^rkf!OaI`#)t5@PG44-Ar>D|3jA`nJNFHe5as0c7GH7=Ay`-m6R?|k~wReDE;CDu4;P*s@3x`#= z`L+*A1(;2h>y0dOt6%DB3L&OqWUH_Y?@XvDqtum{QHarU+a2y_qi4%D8Q*K*7|NvL3;Sw--B|Vsa9hI3 zIV+DS;z_$jK{Z6g_-H2+s328F7bhv7r#n`7+BeJgIa=Nk!>d$v8B6;o8UbsC=TD#p91F;=cqPP|4`zWyXi`PMo+MjXPam z#f0V`g#Z6P_W(?$;PI2$zTK^*)zQzTlUqGgp-5^rJYy_)bV#ruFF}RWeV|OQR`t5V zt*PO!*D{-a-gla2)&L%4u)u$AboM>uqP^IO2!@q-m5nxTXr*=cM7RmBi-}}T_}`Sj|DGAlh8Z#vG3$C&`4l%hYTKBn z%m=Gxe?Y4_&2Y!BaXRrH5eFZDdxAGt6XH56F z^kKtqZ_f;!Sjt#gM1+h6G60X9;|$|BbgTC_yqMz#Nx&UtT1&0J4~Ntcj2RL#s#y&U z;2+aOw>z~N@46_qmywTc8hJL`&iNG73CaX?cpo!5$M(Iz7hU83WrbgrnAqFvOIrvzNbsC_+V?^XVOiwkpz&=tn91iB(7I+d(~p@7tJVb!Vf?>4a@q z$dynX4QM06u9R_kG~Fa9V8Us1A_1R3X6bUX^XXtYnL*&@;jlUx2`LIqh?oKvW0M49 zhOJ2-^f205OTJz3k{g*K$cete0iJA$3MKHu&19-$v1#Gq%o*3}EYGDx+WXS`c~#{! zyO9fbbm3}D%tnMv)@JG`vvaZWd!qJh&m?ib#oAEj5qDLVuv=*1H^mM5NMygE`)m8{ zN+y&*wR1?hs+a{A4LxB3H(U9lH;ymg;R}%+OY{wY`{xCSv6S4ZlagfPICHk7UtFU~ z-|OOk)9L-K_Wy7K{qR&qpm1`0<2O>V`Bpb44$RbygadMgnH0Wx{?sV9fFa>X;b0riXv8MFn@ehhkVsh`5UIBbboW7^nGgH7DMTpIj3 z^r)0<;rac?fMM=%0qV7i(!#SW7`#RIU?P9V4gNq%$Sv$ zX;-I48Od8^hs%-2IRJ{shb_q2Fps#9} zXVoB;=SXXxcvbR)wx>$afJi|wj!u(i=r^-jx+zAe%X^!VmebPex{NAk%4ChB6YveH zeI-r1Z|YwA{13|nbKmLc&x$M^;aYZoTIyMrrToT+%}ENM`-gaj_kWR&@?F4pAeWV%&+yAt&BCa}~yT#vU}$CK#=o-UeIr#D+YU0E~#U|hH^5OihZkTPoQ zv;}4U#wOCv*0#!iz~wr@!R!@iN7+>ozcC~RKaX+piL6+7Se+!g?3oHLM6fB!u}L3a z8m5ob^=Tjkn^?^HOXAb{M98*=KP|ASRs0_C*a}rG=YxN%SDS9RVfuqo&bsLAr|f=t zH`heJeUL^c@j-~4*OsBTnBdm5<6Yn!TUEXA9J}@OA=3DGcF`df;Y@FB`r}bd@YPpk z&BLeJw&;jW4ED|DN3O%l|KfJ;CtuE+DhV@>K?#_kY^HjmfuQ;!o)un?A#GjFd;f2j zFlI)vwlwRB$L1-8)^27MV|L2G+uXy+Ne58(Gzib87Q`d+9+et`@MHklj!H<}ybrcK zsa-T@Cos+_J*kcAL%7G-!q~bPIk9DGtTb^~zW`D>SDoD=SW1{zm}E4b?4hlUs_(7= zulhL-%Fz-T7xW(%E%7{W5w&SOyg64|4p6DV5^&KW!#xH8C5LZ27k^Zm8eP>Ui@q$L zh-PH>a=%m%+G7lS$0L$G5y4oMt~&-g)UjDdZ}Fsz01VC%|0?*MZC~ynb-#j^u!`}D zfk6C(%{KrrgBG$mC{iW}S7E6iMeV)`aQdj5R#Im%VANoglGtPn;)Qg??$h35sGy}- z7~Z)Zi)8|TRX9rRJ$iUywSQ)Txq?mlLE&sX0Dp(#gVjPQ0YVMSno!^Yh81jv5CL;o z%6Y&4x=fniP1&%B4QRHbhN7iFV}q@!KctNT-GgUK`cfz3pNq3QLyxoh!fu#FguoK{ z{0RZK3eAXkOK4@{15L4vTyeU$WF&0Vvuzr^nk=v&kdQ;j~r)Z1arhU)1lf*niB1 zUg&D1*9i58PR*+ARP_9iV9b!YhQmu6C$!Mht$DVZvc5a&LL&!H`-XKBai%z~W6MHw zi9s0>;eA&+0xijwfBL-IX}t@}mGyJdPBHhe z=0{FrLBCXT9J6@XM=9M>r#`8{a~+Bzb-?2t33!$Lsf(netWCg5Ep}fxenI}U+vnEh zLct?nQ|{F^zP!W+iCsL)02UT08Dvz+Yf9e3|7y1ru>>>T5x>UpgQ?VI1`VW^>NERN z0)zv= zrV_)nTB%>ih@NMpG9!NisDEB<>O=)C9GwxfzmqG?5~n9t1?c6Hp)o9;}=pMG5dPD$lHUkLpsa?B5ZI&OcT){7@SNkiZUrZFG1b zB@28(XLme7AU;xH8N*?f<>o7m^ypDSIv~Rq=BTNcYtX?+?B0=7sTZ)56a;fEoVER7 zx6oW(9P%;!X!yz$nA6G>QgEa^?%e<};``DqJbVr?54Y{-nRELt+4Mxo#3gJ-su z)sgXo#zZ<(5XcTn2N_`X_Yh*I(3E~pd|J2XhkUhxxwfA>BozWYYhZ^n{Tn`3$S!U> z_91l^{7;I8P4akQ;o+U35@NUuw@+=TG)BOFkIUIV1j@$VPp9BF@&9m(@NX~k;}}CN zPo};wVV?6KfSIXIdCElI>+K;iS>W|wKE>5$XFF%QEV`p#1hY|wkRJXi2*$!*+6+H-&0p`W_FGHw?VOJ8u1&^zK&r{!C1*WbaL^$Uq|Px?&XiOw?}@YMD> z+4(F&OUI9zrjt*NNyX-*RL)N>FWIFi!{v;s`yVkKkC!`F#r4_~n%r=&hx7c30@H>D zMOrKSmTSfM{XvWEC`DOHmdo4LrQ`ZOa)5UY@-;nr?rPRKTe^HE)>(VR9j_J-AIqio zy>gaYsp77q2;+x2$lb8SN8vf8=OMy)Tkkc zIE8<)#X~jUIU6HAm9Vl^37`Z)^HT;7%nP#FH|FczI>ORi2;k`&mLr`2ceL_rML^Vs zV_mo0HS#P*)sP2jP>=KeWP~6{Co;i}du>Jz#~gj9mC)upSAmZ%4=BQkF41z`gQPM_ zhUA2lu*N$z9hedV><= zv4B8;`u8`V92#1a8Mmd0SdE7FmsKUyphg$Goe+ezJMFGw_S8wi(!mh*v(@;wJ- z|D{Lh`s8A-w>9v14|{njSHl1~;~kve-VOV2LU%#kgLcl7FhWI_{D%CTX16e2It^Q{X6IsP*|y`C5K!OKo?0 zb8g9TSO)aC_4(+k-I{UmT?Kb}>a;kpq^ z%W^CJtkK0hS~QaCpUI5f-%3@a@KeFElcPfr4HP}+7o09$|1Vwf!uHj-y`sEGMPF7)Buix6-Y2V=dw6VK%fslH6WLOw$ zY5<~j2%^kMH)I}P`o}7C+K1Iy8AecsPYZf|O6^_j;MsoD6l~%F4Sw&0;Jv*27aLy8 zUIJ~HRMSF24*dvBn1gpl-)!cUn{gB~dQ9V$s>LZvE<{-~f;tIk(rdbVOxj^$3sxIC z==JcO5F4Cawd=13TOU5;lA`-yTGz5x*?&NsY$RmvE)YNo zpu9MzIvY$Xm>rO=ye(adEz9dRp2pe2_>F{rz32UBsg|9M2^_$?zlxT6* z)_U)*V$x@N-llRSFK0hnCslWw7PQD^TpYXW@YRU$k{f`3vm3>g_k;LoUAL>uC!gET zw<`hXv&W0VQKP&RXzFo1w!dIzgWTDqgEJb8nUf0U*0K5|Mlv&d!%5old)L=saXsgP zuL;A8NHe08*hnB)PEWiDQW5KqjqHNbqaSSzoKC;u&hGX@UDHX|e4^_enX|%}7ziKm zev@Jay|8HSgJR*MS}y(Jo|%K5$41EAIy*B3mmpmf_MSZ9cO{C%{0SxYM#^S%qO!&y zi8{Vj677K#$179kBS@HpSK&YXT?8-}Uj^b6Zf&_MCYQto6Tk zqH)*cZ;AsyV5aXsO0=kUKP%<#_H}RdwALEXX^DyCTCGi6-2R;=HkIP@D;rM^^hz^M zezUQ-v;AOB`z4yF&d-YjkKuxmv}8+PS>fB+;c;4Dm^e9Y+~LASSh-c`WxlSwOr!JZ z3UOMOC5sv5a+%Gu(dPZA_x7l$a#0>Mp|ER)!Mi97$c8rijR$aa1`!(Avk*Gg;}JQua z1+1GIzSeW1Kj*wNiwoIjv3b&|)*&}*?2QC)Id1_(qQYKXC^bXn92~((k1H+9KQFE& zBZ)ziBwI(GiVfG61jzSVK)th_dYWrhyaW-aFzjoZBN+rbBILI|aFV-PqGf1k5ip4R z7!!f$q!eOe5&l>~ih3rYOdwW&*U?dA(X)NZBPK1iAJRYx36SLy9uMlVH7i~4QZ(yv z$dQuB@@t#S^{O@IV3B@%nu;BqM_RwIM(n3HCbfXfpj+m`k<{c{>vM>Khe9Ev=3pD> zIR(|F=@nfW7@LPGQK(*X_};;PeqQMS7(pgbjJUxfY5^57g&LJRoKA!JNHtDyO`V3i zbxBPI07^qYzFMzh5{#I7wjQDz-jObq3n6Dipn9P_Bb~kP7eG^7lQWN_#@Pw8*|m6O z9=*uQ?sS1U%l(k|v5b_3>Cnp1-SO@I&McDIjr&7$sZxl?y_g@2}npKJvRygRC8?R z-1zx@dvdq;N<-;vnxJ`a?G1?~q`l_gZp}$?3IDAF$BPK-%<+gWR>`I$WWb=Gn>5RD zc`+M!)Si9z|18Zl_rOaetq6?ZQrJ?& zOI1ak*?%irlJhCM(yA~_ zAc+!83jY$VP)z)E=R*7ngkmW~DN=tLKBk~7B(AiXVH^^@(4;f&9H;)*u5roB3ynuB z^8-H-;7P_0ZrcKV`*2K;1u}w61fK^VgU1YEqtz9z``PSzvzwkQR0uLlf^~ik>yJuA zI-Z`+6D~A2GrM^Dg(^JVx)}!tU{$ zIf)}V$B{k!dl$+N8tJDjx67dEY5tc!&2h_OUk2va6wyua(r)T;Eo(Bc5~9ALMBD0) z>p|1(ugxppw~%b#=iLzb^NY*q;Q$oPa69A73~Yq_%_HayH!?{0obs`6w}{zw0%#M% zvvo+wkE@z`#8Yw>I%_$ zhg0^2)10SW+RzQnd`WisD&z+V7>bPo1MBh?lwbdY4w|M&+i1Z5&Qs|S5Pi!$A{d4# zL?Zdcxb+{N^0u3wuMfDY{2tD4mxY**E?r#dvs)IqbrREgEg& z`ir>;#&@gZ?wGJF+saxH6wwU1AL!_>GKq$GMYuDD$#FeY%|Ey(-Asfj&Mh=X{vi6iV7cU^*AL-=k8T|LH zW(i7mb%VR}<@oLpJ8g<(t35>Gw=ZaxaR?kRNrrCo#F(d@HmCq227aEY&IAUJW!=Lo zBFCeqfp2j4PNMU6^6R}{pc6ihPmr*01YXfR(EeZuAVM_Z_q2rS1tvW7JE;YMW&i4B z%HWO?9_k(xSew+kH%zyVLJMSvRI;|?q^tF`3#~k1J3r;Hv-JG_H59GT(M*KaHZTvA zhEo_du(R`G;ZxXSKJFX{iMaQ$j`ZW!n70_vXf9X|?ikhjZ93ELQ zd!O7*cfY^se%>*B?M^mt`8?hpj*sW}N+A68JBtS=9p&^Vlma&hW{0e=3xrv^869yw zQ_#YVya=EJ!c{ibPYU3eLk9x?QP$vQSx+ur8@lpyKIJ?V^Z6E=zhM()UL1kAK5Q)Z z?zzcd0~9!&lc0&5MODF^`C`^+MXd8KtKfK43*@=8&cxWQ;3sj;OJ*UDZQ5n$IvVaK zMjx)I6DmH4FIqT>yI5GW$~P~(QYA&>8sf?`m8FoPXjbyqPimkX|2HJAXul%@484>U ztPM~Wncv^ep#5^%+1>qqvflmtzTccRZDx9R0E5F&ZMquP2!a45+7F6FP2^~M-)8Vn zD7X;C(3`6NQ$MUTAkO7cs zhjQ9Q>qTs;tXv`#kExMM4Xa*$@L%&3xP*N5Yw@&B<7ii2(bC`_`{2m#N&z@?ZX8I} z_u5zIh-P(Jhnv~L2a~dWzzzrWM5eEd8(bp%}4TZz5!rso)MNZlHGU`6oFer50Ci*S+B7I`X>2 zY(drPkkv8n5F3Pq$pwfV{>euyblNOy1@1v;VwGD#Vk8G}az^_Z3n zR0d}00N7v5Hd!aIDUwo zKnt%W;>^Ijez3{L+#NwCI`E5Up~ldBm2ZZmVYzOrPr|+{$ovaYYkn;Xs*rX=$|Z}% zKoAj&ev&^)Ov$Pu;^tPKerM6w3-oxZDxe1LAE^XaP>#b^Id}o!u;Ow60CZ7Fg6&;b z#}cTD`fiTSR^>qx{bDS%7k|)3z?O$YA!eZSH~+b^B`~n`334glJt+5pVq<-^KeYwl z{s*Fwu_twYT#cubI$*I@XJcbScXOk|=W-SE|KsYdqT-6SZS5-D-Q5x#3U?@+-~obL zaCaxTySo($5D0F;-QC?iK=9!9*FNp;b8q`!*Gs+BSaYsEdjGnpu{bcC+D!a~rMe!`^E8KGge+^^o)KQM zjS6gUC_!ZC??y{3(&$~`ii}|^9hXb5gywF{KgoDotDn%}%IFHQmCs9={B6K7;I4wR z=@P(YV5H{6Y1Uv$er_0&n9AI*HC8?*8I#--pwOc;NBnVr#eP2$liA?wX}M|#e3^&X zge1AoS^S(jJCs};kZ3}5jbm%k;#gSk-52GT}iIe}|ElgF4 z6ycZRKeuA0`~1z8=d&%tx0kc`%YmVQZ^xqtQ;RAU<{|XT)ia~oGfy_*x$s#qC?Cxz zP{)yzVJ*5rANzWPdwWg76|rOUrz>*JB7Ez^>}A5`F-MH)NJ5elN55b&4f2f#WncF0 z8tHoz(6Z=STKF`mQJm-J{k_OdUYYUA3FjkLrp?u-m?OTXn8X!@8LI|{({>UN9>8x6A8rDJ3%n-)Ba%;{W^ps zh00_K%CRO>W`cg|Z@>L>{X5>-y^$xmzL8_%sVR;iFi48Z|JdJJk*ixhNLuboKbhZF z=e@JrX35t1@I2u<)v2JN4~%9F%67iXFiLo1m6BRcHXQci&C1(c+j^g|Ebx2t?0Q-< zdfkl^>%3YgEC{HrlEd%&1`bMx1@yzEQ%b{uLJA=eFkrN<*NiiaH&6u5^f?n_p0dh_ z1lOyAalD1BVkZbsv7rkf&qDSgzPv%--^n+BrX*Cr`E8f%;kRCUhXL65^()G|55Ld{ zU+_cu0CA0)yh)j*phRe#u6OqnS;^U|bdaYgVxg}7MtX^J<*y^Uj-^grc1w|bO%iLv zWY5HsTSpNL2mJu;WBIMAckqOcu6En(lo|G?Q}(FSW>Ixq<-?cs2fm1^dkRDeQkoxq zkCp#7;3f+tNWD^{d_iLzY8B+~@_oKmanSd=boA*Z3^#>>rdb+!dO3 zfYzs&XdbHQ4L=Y<&dW3aL(t1V2GSk|k(q1jk(&5gM(5=bQ=U0u(nqA=E;MKyG^o+b zAs^9B^c`d+wwm6pn8oaMRs7(_=B+<=s`GO^yL`*5PuX}rRa1(-0{swIrqW1XszuQF zJRhHE7=T5yk{HgWGp8jicN(+?*A7p8eHiX!2$V9gPAOH5svRmFAn*EUYV6HOnLl>9 z!z$LA+B5j7jDADCCr=*xiY$SZxa@O@xJW%n0Z(WvO%#9WGqA~MUHAy2%2!Qwy?x@; z5@qb3aZS?o84_T%XcY0C*x%C}QaeWh-GHKortO*!yKu$+h3!voW zw;bmyZk3Z5zucl1lE^HRbOc>;G-OkcxiDDR5~G6mM4K6$Pxfj2|D~WltOYy~Pv(vl zJ`C&J*&taX37y^rMyE`KcrNVaX4K*!)w+K}JYrG6YIZ#<1P0d}{N>Sw!iR`qv%v^h z7GP9Gcn$NgI=H(8i{;gVZB@~p!p_(=z31i@ksd=GiEshlsY;Wxzu7DW`sJF+_UBav zqBplKmWE!Z>-E(y{tZsMP|eS_|B)BMq!tpOf+6&7XVOp;X$DA-I{v$Ox5(_+^?JVb zexlX&_Q?MJ2yL5gbMk)1v*l8NccDyiCwRsk_ap4?8QBSj7g)@hRWu4C+avrTBE=rW; z6x_z249mx>c)B)yX1&?rCFcl=_Vs*UQIsEENOCM1ZObsL5%B!Q^k1owC0XOGmL88f zeWN0qzF8VX;lT15JpMm&LEwMn0>yr4QIHuZ!uDW)v!1W>_421y=eN_aj!H+q@RbU$ z-E~d_;if=bTljETDs`ANpuBfEQxsJgVp~7O(nM4uK0E;dCmuYtdZ@1_y_=g?=EX)= z?V#$^;Ytk-PbM1%0VaM~^!&CmPmZR}6`@ASK+R13j9tLdzT44e){l+nF&*!sLD&-U zui`crk>jNF@Q|Ok{;wOr!Arpl4lW5dwf$0DVMm8KWRf5o1S!@9)<7|Wd7eS-_|J<} z@#&?Xis|0p7-=GPCpl)l1M=%O3ll}7=TkYvQFdXV1qt8~DWTAjvax+INTm^Ax${Ex zp*rcAo77-wuaVbE8*{FhfwyPf;?>)du z4^W0)&P|865^mQ`~;|nbw64_7#~e*V+k9dE*D34yA1=i!JG2a0@J~DD#TVqdnQmZ8rX|Xf!k9t z&o9hW>+Te2aD#n*X4Es$hS*%s*SA>#6Njk1uHC=7!n4BP^qI9lxVGN=y!Sv|MfiE~ z@X^x0zRvm0ulIrJ%89aq>HFVmnDGT&&PX$u3NmsEQSaBmI4#k)KYLxT3)KP7PeRaP znqSK3GPEfC=KVG5S6wh0GecU?3QY5+Cpnx$iZs+FLF5#l>p~=%Il%p6NRdCc8*O7Bo_1>*b0sa*T|A198Aa+-cWD!%GvNEZ(wzHYct z{5twY3>$WIa*+3q8`u2ORfraq<~kSOa_m*<5U?sjD)YQ20Jdj-<1UDU@sdpswaQzo zJ=9}ZHSYXsvyt7L-r@(upm z50lPaCo&esG9#{_`H7?o$BEOi#N7Qo76-&RgTPcjRH&s&HAO5vxZEjL49)v~J33F} z3Cv$8x~t!ry#rC66Drus_F60rULIxGXmX^CNKK{x8hL~M*xm7u4c|R@vTLUxRXn&f zTq$bZ9v_WEl>-J_6TZ|J>JsTmY7%V0?sc}B`9|^WL207%CC~%EjXQ0X9G0pZ!SeKn1eU*;xAaC$D zGGLM-*q~rTCP~=H4oNwVWlG#vnnL?YTegz>#}g%t8Vt!3OEJZCh|3xP*n1GJwl)p| z__hlK(d80~+qN)LO|lS`FVDg@o8HEfLC|^yKYI zsln8&w|r+tN^(ygjFmqXl-|p2{b0mqjfhItbk23XzG%z$diHgryDJk$o-y;Zg80={ zip=y^v3TXz4DN)8?$SEGnL(}E@#Leb@XFSB40FDeCIbIlrp zh{UFlA+IxzKn`&Z$p+`eVf+RT)npxJg9HRF(-O;N!S$Zs-h_I-o|k8pe)=80fwUam z3`57Rw%TG%YzjZq%Lh{EJrpi?pKf@WUP8V~gDxS1pD| zMMi<(W=P;v?CtHl?zY}e-!BN?pV+&eu4E|#+`d{`dX^1G=uAdO61^p4B{9NFqY=T2 z!~qU$ zuwjH=G*(axS{!c z2gS#$1$ZSdstRAp%f#}$&@$Cmo0V0MULVcNh5}-xK`V_v&*vw?mB^v&_;11n%ttT( zO#R!${}8}SqK@aK+{gc`bRCru)lZU8st@(BF@qZXBdP5}f2oz*SfKp)@FU-&@V{n& zM~we7Y6E0!)*ma65nWx?&8_x`ks94an zG!ja3kccL_HpbF-<4XyIGB`T`6TKUE*1qq(Lq$jgJC$C0S30_5MRjhoQa5$oj8S-- zDmOr#NJOuI{5-$lucLixgfA>(Nvb)#h78ra&EHyuUNWji*0N2VCCAp!C6|tJ%-2UA zP~wx82jb}CH<`&v4P^XN)nWc}4O74YK0(<*MRD@yy*9TutD|G;6PvgCPjEPF{t?ZG zjG6hmJ%I15rKt8@LQ|(s1abNA3rlIN?y%f`U}p*z>xwe+m6sZWC6hI=Z*Qx^-^Zj; zr;GkMxG=&n_MD8<6@Ri4kFDLw;!LdHq-BU4ak@CVTW{}s7z*QU3PptBf-&*u#PnSu^7(!eIxS5ZRM!(7ie1o$44G_JTA}^ zPBQxe++S_tQ|4Zk=P@FX79(WbX{k#RUKHWQ{Pp{GHrwwAaLjLj09R}l)t;}m;fT}q zI*R|l8~V#@mC44vBw8Ido;fJnn5o-J+&UKCHSUv4Qhh}%5xI?KG!3ZV*rj7cKs?r0Ar$X6dT4;-8S3yrpE4J&qrnTgykrLwm)j0 znaC~mEczP2a;w0I*onTp%3USiO$n%kPl!;f(^Ok<2B(t&v~*od=1sfA|JTR+E#N;h zM1|ckmZ(GhN<$k7AtGzUp(a3nkN16@NLw z$4Wxo10d9PSJ6o1rf+a;Rq2VbmD2J~JBx$x%Qq zwj+p;s`m??2JIRqi^zbX#1(zjie+N+IBkhO4 zNZYe-f!J1uw3@kFn%0#+UHxS((?m^vA!fx$F7}uel>0Cl950UHHs#E@yS@34ENyXj zT09xpe@@_XuzAeiT`T@kRkpEv`~8`7{w&KM_V!rdow7qL$q)CEQ))i>-FKnz(;LpWlV4tj5zO;*8FPq}HqP z)Vzd8eaWCQk>c?S1b9p(0*Zip}&7xF~$V=nXqstH9{#p`b8y!#~>{v?PJP2#6o2+x<J68$Nx}l#62#9Bl>rx`JIVH}cnDBKuP@jn1YvyM9WXq>I$o-(=;| zViMd+(^OGu*`CRcY>@k@LrDDaBo+X%Ae@q}ihMn!ACDD;-V@vjBMnG`p@x+U$}%pA zJ)VR!`u2dn`S?n|+}0Hl8y>hAI0`{htw^kufD*dl(i+Mm;gO3!yIWJd)Z&`TgllR5>lH_}Rl_+Z5B`4^xS1&N0{&6!?(7Cdue``epW|D(t zCa)7J28yka?h36?>8C2T$HTt7{P}rw^-}(`*4rjfxF84=GKkloCX!UhIA2Dckzl3_ zn?h=0=O}Rgg@a<=ePH^x21W)Tsd1Zkl^~N?HM&OvfERB;vbF}bZ#t2CT3+nkEdtN& z$iMmuN~V#rRIz;hYKm=p#Ao)^wMBP*d09uu^=@|MKLd5$JJ&_dp8HK~ETf7fkJ2J! zpbG`GL^J|mimY*YeTs|Gs?vYGdcNp*=ey{*c`Jw3G;I##@HtdQ7k(4g-=1+olSYxz zV>{7@a#`(o!*~%C;U-;c5K^fbD!Wyoj4zf1%^GbMlTsPuJUvtcB?jgo-a(!8wOTri z!e4sBL(Wu<9Ei_&#e3|vZW;SJl!5};7lh)JKP^+0n*@7>VhaXsC(BkLbPJse7meM5 z+&XQiwnnYZh=Q5gCv=Aminr~qbtCDM2G+v_1?6(hrteB0UmCROKFx7kc76n}v50-( z!d~bt`MtW~>>&qPk(vMYG#@NeQGeaq5x+3;4;TDCy(m#j+p$zMBv z>o;4CSxXVwz$-0KP7s>}1e||I|1TfY&__TSYWzg}kUgM?SR$;QMYg$?Nny`gQHf{c z-5|BsYn%w1B~e5^jpM|win~?3-8>jV$y6`jelWLyWe>3L9yF%59A@Y<%bhd(snO=? zSoL?k)59N1*yQ5Yr69Bo0KTzjan#~*3h5TuZ9yZEqf5|ZuvL_0JeHFUk_wMQ(*>8C zzbC*rvpAx=ZMby%&m)%aMBrS(1mDj6bM*bj(r`b)&3v7qd@@pNglu#>z74<~7hIB* z=ktjqP!n8P2CR@D>T^8_+fBPbIq^w2ws&{!oRu>y#zUt@Cqg%QMz#uUlq6{0oE&mt z2*3pYy=Oy~qx$Ua?s>99k{|`hJQ3GNM3*m?4S@Y4K{eV#MWimEpfEO&C2->@f$$wB z^?>1Co@_&`*YYADjxXRIIh?aQQ_EN${fFgn3^k`LaU$~|XpEfF4W1UKm2F5<>8V^w zL0h;v>>KtN+^&OiU7MDSV&b^)&N}w6f_!&z5wFSf<1|_+d{`X4rt@JL*LMOL^V+)hdMA^;*{9w5L+91QjElg-wZ<_FTxdebt^f*hl2-Zq;f0 zS&sBbWjAdS98}G3=1oy7P3y8mn8S=D83chao7L+G%n!x_@TyLHN5lRrs2>zUqg(;1 zG=cf%444@xi!ncd_|g^(>cJ+^G^|1+07kWS>1tfp9T_OoKU*yr!-SL@LY6?I8-u}H zqno3(jZZa5Mc5-z1)4-Nmmy@Jw_Vu(6IwP3A6YYlYr*qU-w_*)6f+|!BD9)$?pUza z>FauHY$>Ft{gElvQzi)pv|lqCpYeQ1`df(#=#e~zB>0&Y!{!t%l%#ZRdM?;xwRwFM z6*zevN5*g7qkjddLUg4rEBUukJf^D|-*WFK534GQG2R$3$mDO9YhzvMB90G-kK}+w zce|l8GEpi-r(Gvq z=*@3u>y#DV+W0c28P#T}pRUm4#5XFrOha@y4JGelpLlhCL&Mky+wret!JqjQS$8z%0-nraHT5D=@c6`@c z-+U$WJf}3abqs%13qc4?yOoBPK@41%@o;JDu*jaC>M`fgvlnz;&galiiQcyDc%6xq z?zqd;V*0=I=$q2vhE!CH9<11TJY5%87rg)Zk>LOI)<)TW_vTC4?sPghks@svD-(iU z&hlf&>Cb}`IhhO^2LcpL2LKV_P0RG<{{}+NvQ<=xuCZbUa25%dIM~tyqYD*am_p=f zolao=HSe||$NCry{P}-rqAw(-lUEp5yr{!rdrJ4bqq@kob;Lg7-popOVO>tZ;r;gf zKwKWztePNZ_aujFatpoiGKP^B6X*rDrA%ZCQrgMF(|22n1XL1cEeeT`M;VFHOzWu_ zQ)sXH(4LH&5;i&HWf!)g9p8GWL|wSeh_+=d`B+IUUU^XXZCNd-Xo*$+#6FUj(3iy7hc2`QNba^|AuypEpQ9_+LfhwNq+6MI4G+Se*u} zj`A?d`*)1f0bLFTPxgF_aUPoVWa=K*SRqnH#XyfCi$-{~6=y0ET2&gNqu4^4(O8Sr z`ob)w!SCfjsw^U|`u_Hr!5DA1P0U^w%XfcJx@{nxnZ%;c~ z4@d8J%=(Wun7ZN9GSm@`cT+ml^h2zttE2a(Dve+uk#*^L+{@By*%VNQTtG0F6bF6-V^Ucg zqyjFQY^u`><^BHsfm2x|0EV88rBAVmdI4Ap0L0m7_7Iuwp$+i*2c!MN+6DRr-z=Vs z_LZbL`wjAgLIEB(6OnNv>15T#vI>$?WV~&;sU@*~2VU$NY|maY|lg(W@kq3PXCPyFv;_kQSOYQWgg% z%b3lX@%wh~B9x@G>3zDf^gaeH@oV=vo;{$iGHR<$w|s;Up?PzYP*0&M5TEn@Mj~L~ z)crAwe=RJVf21lSZi_z7g4l*6-5S>O9p0@T9%7O?>acDl8PC}tC+O&R9<;F+I5c_6 zh!nHoROQ-cQ_JuX~(+zcz`Vyvk07OJ+R9$ z;C(&lDxO>rY%wM!{jA2dT>)E@gxgmB{oBV_@{3DX9hBaZZr9VEc-tY?*yC5LG_sSP zYV+e54OlCcy=cwVn>qWC!Ht8mpw`Cke9s=Qk4^(3eaQ`G%nCU2tZeUptqCI`{IndZ z<~r#8!(cd;YeN3x|0OX9YyL-aV8A9&XHr)}nW+yRxr7W`aRX9`AUIxoQXm$~?=%`R zkhsQgBO}+QKBgoR-`4~GVz0?p>@}1DnE+gfmo`D;XsR|f97R&vKw`ZML4ub@*R*va zg5=t&(TTjuHmKRJ&960AF#-i5UZQGd=ZE5r#hq$}F+?m8=%M@hULn|>87of~P92Ny z<#UmlT#E8Pgc$o4BJ$;fM@ieAB&SIcq;d2o1DvWtmPS?+_04W?XVD6pcS|gsA;uHH zSwBZM5$fN%)0qCON_DNKLTB62oCH2%#PfW_>>M6~cjFSlWmA61S6G$_ zY)d7tnY5V9LA{>OJ`Q6=S;O{4+JSOHScHWMky_`k?hh58U*L?FEeC~mKY^>Z+oxc5 zV7iIWO}V)(hUISJ~}NgPhT2z z&ngO)^L+<*f#Hx8h;;h_we<~)CO?d8+p!T6yX_ul;*MK4_SoRrNqX{qGBeS6)1^juWQ_w{wYou~h$-Tq0R zEZL`>974>R6=~Mr;N|A#cD=fAI`!>pC8OH!p+~mb?`1}oUBC6^HtX1|wYjc685Ns@ zBa;)16b($g=v&O9MuJ+oX@cumBnx)ZdYVE`MeuUW0hojQbc45aQVZ}l;pEK^A7r-gU1%WivJqG-BUO`|Ht^LdPq0nM%EAgwBgqW@R6e zX2Od9=^B~MC5Vfxko=5Y)iBw}Apq20TR#84HX|fxPKYvPZXSHO-X#MYBslTwD{=?ofEg3j0?XjNKO>u!^rVTife~yQPlGUa z_YC{H+B90ta&jyF*xb#(`g-QK_?|Ax2;^Bv21e&5na5^RvTSSX|9v2JZv>&AeA5Y? z(nV9+_~`BJ`7scvP+S5ZJ=UbP(jMVu`$=gr=yP^?Nj~RKt25ZxTer6EbqDFgW)L>z zSy9u2p%lqhUU8L{&p_-y1k14{Sxh{f^DD$DDmJ06wXLmOgL=3enRrr+k!FD-P%e>Q`*R!SEU5}|tT?fMiK5}PB*c=`U6WE~rh z9W)FF>rSc6{XYlfi|9C zf2B<(u8gUxSS*=44%6dv?0_1)3)=4%a~!*#BDUUl%An62{$5aGgohOBYU|V4v%rTp zIWz^pT!bbVFMYLuH?Y?D0)IeOL~IIxHPbgP)b3vOf*%W!-q-IQ4_v8$;qF0ttU7*! z3rADjtr(x9>BnV7$I6J`Awtjjh>eDEK`p+kA38tF8`xq!Em%sr>t>DJlI^TPyMK<% zbA1?12>g_?za`m#jPz#mdv({_CG%9flYz6_ z&@;og#;XQNzs-07$M%eePTa$Qca2=Gwwv=kD1>|~rfrN}qLwl|Z{WPH7>X)E0tgr- zSE+<%v~%0lO{X*#A#(L2Wyv#RkHqm8bpAI^q`;o=Keln~`ZGn*P~`A_E8Z_*zvid2 zfCrPCV_g9jXt3fuT#(o#e3YVrtE0lZSti}@)vT;Ml46*Bs6@h z{UO}{0xw|H5lD~-#m`EATEi(iOdRc0K2Q0V_QJ8AP%BU&O_mB4Jh-}^coat$24*V3J`E-YEGQ`8dR^y`2{n#CUmHfeA8ZRS z(dQBbF>xz^H7V*ElnBMUuZ$xQ15R#wgq@@%m?Gz?)ZWR#TW(nN?FPaUpE$>wse+!C}S0Y4J~&;e-`)lIdX&>~jF)Vc<= z10UkVummvlgNQttx06%K@*LmP~9` zu})*QL~Bz{gOh<{Hy;;E-=i`WvDbeKm|`z~=r7uDHe)i_4Mcs97W2$2l{!HbuK9$j z6)fNaG^-!zu~+oC{lQHR<1lxbp2dwD+@Ro~(OO~s-ql_vzKP&@ zhRDGT(NB)nc!8Edq0`y)2a(?9Tg$y%f}`@MB9@U?I1t7?-Mkk`NxmAXYNcf9ryF_0~JDMCeLpbJr3=h7t(Ze)a>~CWG5`=(ugm z^CPD9U`yAM3cv{mS$4w?by11DALnF-BLjV*)k^5w>gfce>M!A}u*5%} z1s?^f!F)#2Yzp)Xz++AK0oG_|c(51HP(0UBjFFcrkOUb5@dL|($cQteg7Q)RDFXV2 zuN5_TE41;sXuj-B?PqBzjwo8leOH+`CRV54bs4*&tm)2-9fb)*vDbrMU_G z&AcRxD5tdELR@sEtvWayQ1r);Z+9)v#YJO^Ih_YWkk3CIeNRRiXozxO$yEGxN}|mv zZ{D^txPcqj<;q>m1C8NOyhha`gYOft_uNv_C!sVz`gSBs2oXH#p)Y}dy^}YrQ}1eC ziS&9S{nB*aU)x&$jX6Y(eYsDIUhXaRdxb#PdvxtQK*Pb_hZnz8dd5Qh~d zE=m=a9+IdPZ7=cx4CYLSW&PAGmQoiEZIXW!EalSamp2_>Yq+EgtRX~wC9kqE=t?^+QQNzS1^!#XN8(NfYu6msi$Ny?SZ&` z=(%Kh{Wi5h*aU&e)Y;&{gz#o@3$e-pz83f4b7U`}e+}=R87nERaLC5i?V5c=bGJVS z1I91{ZFl`gLeO!C{*|_M>kzbA($yB(sT|+-HjGYZT|LERmOI#l;{7>mr9ALrDsL5W zYHclY7NEFEHTo!=T6D(LbMvnRVqgDnouTQtloG{OtMzwd)7A-Q%Pn|yXO@Dix-xr5 zZ?QYh@+FsG36gq~ixYC$knxbYVn4g~uxwy|DBM{2JN5u276{35L$;um2d>|l{$H}9 zOZ$IZcT$mBaT*aA+9MFlP!}c;t(38*kd+jy8VLh}9ETLDqB*3Z-WAb@zi}`K54gQx zQd#{G!39G7jBwZ;+;RZNpN&=WG2%0=WXJ(>f+hwdW!hct1ucymCYJhHeJ=~GhymBZ zPJLU(rq9{=v!kfz<>NE+$s2iNixhu-wyC)kkp&brnD7mjN;>Hs8$kCWgQ zS@ZrJ;gPcO-siq=fDyW9>>VQPaF?CtidtqK5p@ZM*O7Q5GCmTHu56{6#>xto3(*F0 zHpuSez+YqVOB~`1u-2kfFeeN#;%U6IeG=cnhDX`X!z8TTr#m-0DpWv^wWbn(1b};d z!I)(6MH{#XQuu*5p=em}P`?TSc%_vFp_})jAE05U{eIltzpT8!+Fx$^i6^Sx-&y}% zrMuq)ogT$ksqh9?sIsR4!xVk-DFJI3SN@q7G&#Y3ftR2RbBH=`Z^><{&<7xDM9d# zsECRSbUMGZ1ytNf*w!AsD`c}djXc>7iqIGO(*ar;Gf6M?uS9xv^@9MJUK)Bx)BeJ~ zf@DJ+iXUhBiTGY|kYiJ)2fDTG^gB?aW*$Wq3fp6f*n#!;x@r=B&r6Ap?`} zP8=1Vfv<>wQUT;y@-xe162OA9zyI2HpZ|CgqagOScd_Ml+u^wtaP`!vXW7)`ncgo~ z%W1eL%-;RCIe}ce8Vtq@^{`FA8}NNJv< z%E%*1F>s_NaWUvqmo@fz!{Hw@17zsJUGv7D>_u*Ij;=;B`xH=H9um$izKejj@zj)d zk%-VFL3b${%;S>ma0Z9)!5kZPT*mg#)5*kkf3a>o8|ejh=i4i)M!8zffvp`YZtn}J zwdV`20Xp4nM9MYINOhAZ#?%5+g3Up8LUpUI3g0nZaNEQaay5a2DcuijlzKUC@2BB?f-6i17!Z^s|y6q0ur{)($#16*db^XQ<++F?65c>+l2@jL{ly9F49#m zDzDHZ0>HkL`mkA6nNh#fTX1{aOq{r}$&}%X)p~z87l)%Fu2{8?={UogNa|d5bi~Pf zcbi!do7GuhG!?LUI&}Fz$J__Fy{0s&>}^jP+cSJKDehiXi{A+>TxR^X+9Bo3Y+#AJ zR_Fj{z*352%QHsQUQjkB5Bnm`_xAoxI^S1Wa8xuLyvCj%kF6bIVZtSXDm zO|FKb(0v+nZi_}da*Z5ORf6ZMUhm84dPUmucZMy(j|^9(x*r#0T|MG@9n&9O zj&9}mJ^qANucLgo0DK|vp%s^?%Nw`F_;at>YL}21Q%7p#5shbAi(2EtV}rE$Gd@#R2^64M!&JHnmS`;XWi0CJ|G=OT`JXXFB=LW6W4q4c|)v8D9Cykh>( z{&x-<-EZf}Nu$Nl?CZ&lHVLGe0s_*0sDof4t-7&dt&Uix^5wDAuy7RYcOzWjurREk$!cH+=|wsWDOQbzCWHGS~NBU48_ zwhqm_5;(ZO`h3P07Lc=ZLM@Ue#o7V#Y;NHLR(|>(R*6MD>2W-an7Ql z7~D$?!Qd7wKIfOFS`eb3W8~#!N8$;PP2~Oa5hIf(0ttR#j!~kgn^U|(qCV^{)xl{Y z#E@r9znX64C>v2Mfw21EGmfnK*Zb(oXEY>>A8I1enzF~Ot}bNvj+Goa==7KR$uMQN z_g)TsU>6R1j?5+E)+Y@3fqDgsFXFaLX|eM~?uJ!1)5VA$>gxXlX%V~+szffe_f{@q6hC*||t7xRmFl=5BBJ_`>DOZ=$i|D^ub|493Y%-00xEQ0r zmO#NS*Nq2UrY@(L{+I4k`$$SGcLeSZvP>4Vkz@< zwP3*59!qIM_@baThSp#p@i5*GZkS3Q&QACq>}cn3E)|xY_d80X!SVoCZ04UXrL{p2 z7&*ydN|*TGwy6N+{#}-0>{vRH*Z8m6r+T$u3Pu!eR5j#S0tnQr*S?V5Xh#UOG*b10 zD*9O_<#osJA|6*KoPYc4lr6BQ>OLpeg_W!R&@-Q0`>5rcrKYZF^Bqr1$}Uo4Ao_D` z2BiWOA)sV|h4#B*t?s;Tfv{k%@XdcB?+=xHn?AQ2OdiY!~TwYB%f zIp7jo(6PD-w`DQKZDEPf?Hdl7@YkMNS-!^FU&N-JCLpL;*O(DqVln?PuZYvE1?h)M zgx6J6^a+n_H+8dURUxmpNQ{&b@|E^w-cVT%X&;!espRE-I@2=|Uj=m7MG9K2=#uKj zFYW#%>x6gW49m=cu+d0l2DjWY^y%YU`5`&?{Y)Qfu3E?|_=sIR@CVMd%ss%+Z@PA8 z^%$D8rj^%aHv(7adCR-5vPo7%v@*9m@deUGT;<~YCKT3cqN`z-o$$)RY&bPx>vB5F zDng4R6xcevVlDLEqRUC!*u5a3)&KIvLW&ctJ#H$5fA?Q@T)@ZwoNURUpy-{@L51hx z@aNUix?D|8YNcOznJ^3}zTalEhkJ;>2^LGYsr;_qYQ?cN*VM^|XBr4@R!2R_mPF^` znJxy~LO6r1tsxp!8JbJ?1dEG~c;(DZ3#FO57ouAUnIq!BOljAKfS$iw-nWxSly4Ig zDqG&xKJSN5vx#*J1F@QfTr6ydMDbis%4OdA05TB^#IjS{oi7`w28@Tdr4M@7@)uvA zeSXxy-^=d;2Ma~oL@n3C=;y9o)^@$S()nA`H)Obd_Q(8LYHf4wzqIx~aT3)S}TVAf0=kPo8BBC?N@rKADkJ00bTV7ysrDjWbn22xzTPo=Z z_zH-$w+XR_3HYLFle-5_fmqZCb!ZSYRZ~gklKrrm-=j-injvus8l7+XqZy)>jc)k* zc0n;A`d9r7yyJF}#+gJbPRF$}Yz&Z{bfTvMe zO8=LCm3mEl7?=q%QbmJ%*yxC`W;zJ=-`?kVIlBnDVa{dRRH(IWpoj_PZX`T74IC>O zh`jix_=6r2UYXNnvV#6mV|+VKp1YWs^aEmlNQsglrPtrFQ4o(Y6e@K;86FI z4cg`=T0IJEx@gIk=vN<;RxiB$uO-&P59Zfke8GCjM5ne+U(&d9(&TOP6qb4ZpNN&$ ze}*a%tG>sW+f=7R<#AV}XS+1_r1(=YaRk0u|8P1dNMLL%mStH7IH?}r=Z+);_r+Xw z;xDDGconjR4LRhCEXh+1j667_1`-C6x2KyztWS%>^(5rut3IUXJ$L5F#DZ#{!44L4 zFo_&UM-x5gwhOn8Z*M1vj&BchP5z!I{dFXw&Ne|Y`XCYz0Rb0UIEud0cDP%1Caig) ziSgOfzk-qH=O17vR{W8mD%RT(puvtl?*{V9zWu!Rsz1kDb{k#o`UKO}EX8ed)y@V( zkSgfG)v`QfMJ+`qqq%g*K3_QDg(+%j$(c6`m2rujJ^}y0xUvqPiU6>uPmHQ6Z31JM z+irv5OVDD;)UX}4nnMB}3;rj3g}}v}bOpm{f!ZA%_$54-HJ}P+n;hcpz7`U?KdaATh}`*2P58z=YHHqu6g{;w79j~vuas{uoQJePMr_b=U^`Vwo{AXq@JbpvqB@C zahC&$9`g<(|8+NI%Kth-?B%L)>*a}$UBAnJ@9$#Av%-HYVWYb^^-#A= z9Ae$vAZz+W33otyx7to~1N$yFaP zFq^z@%Rk3*ROy+QS@Y%{=;ojWE4Hfc{r6s2oM8$j{RgP_BBUzm#GO~#=XV+A``J8i z@=;b_oKuue9Ka^B{Z<1Rjzd7c}#p<==N}}^Pn`qxe8NlZi_65&-c$t z=x)f+J?2^j$us`f(H28p?F~IBl5o_?`pkCp`k5*lXd6)1YnX-zA7hw0vguv#c|pIH zA@&v_RM37qH?m=Sq=_1<6+S+;hZX|EfDp@aWB$DxaYUj=7hML&2KioESGSv1uE_*z z?^n5cBeNmtN8bkG^T_%x%{h5n6+r;Y)i8PBT;R#1cxA^OEBXMV6`^ZB?tI{!gYOvJ zywV?*ilW6Tj`jsditn?M=?tMNIv3dj=XI>{zYKH-0W0u{e1oi!1Z~#)Wok%p^j4UY z-;SnaQ$8Y{;*CO&rm)lRM&N4^T_+#qCC&ejsdIjeD}1;8%w%HQYHT)k8Z}9i290go znmCOc8;u*=X2Zs|ZR_TH?mg$+U-n*nB$QYFGC&Rqdc=PuN55nlP zW_voemdNRQ38PYX6%=hB+y^m}K`|@P0uYb=$*M46a~KDeOL%*8kF<94@49lw3-4|O zcemv_S}LQ~AHJ4(Bc_%qeBk2Efw_sD-TTR{)x6#ZC2Yd)=}znXWoLw?!~1T$yp>QX zZE~uoh5%b!>BElGgnmn||b5#=;DB`fe}!>;+$C4#_+ z`lBkN($J~xXZ=S)Kp>F^U%nz44J0gEB8Qxt}OE|4dC(w`_ z8rfjOmAGdWXWkY=S^2k1MGmxQT()cr)wmi)(x~U+)@u{~!lmvcezOLN*78Dn=5yOU!P5RdNF$lTn59eS?lAgcr4ONiPQ;|I z^lWkSg8!CMwqR6%zEbrxAE?{4A2x_n@+cP5QZtQ)ngZ5Of>%5NxDuu|YFbN~cOr^W zqVPn8YdH_GXY;b`P^v^##`8jKnaX;5S`8Jt6|Q)$NyRL7`{cJU!-*k>Hq`xVZcH|_^wZu1?J8~1KU%16nE9n2J;bL<7{(j1r-B=X? zCsEru8yqAO0vu*dmvgvYPJei+Ep77jAk@02kGy7Mhc#E1Rc%l~M5C=)7mt>R+g_5% z;ycbqx$3hjOfowcT}f8)){WDIPuzj%tYfD&MF9StML^dffl+c2v9!@4L~4x;*{(S@ zyJddZ01B9;X`C=fEfO??xsDhV`3G%J$$u1u-33<@o@;_-gQk-wF#CmNVtcpK3#RWG za7WGw-2|$J@BPcq9e(@i)>o#YYlmUOMRbRg=eL;;zyanY0?m zxt4+NhImqm`N(x#`ja^bT`DLFwLT$QYh6im=ZKtd~ji0Z2iS!?p9E(z<@|aC{v6N<)9<=CLjSxWh_I4f6uY7#_L5AN-GfBbDZZ%@i0%1x3%G)XVf)w^OAo^U?5d2Xp_fp<&Ri z0X1|wFOEwM(aTU%ZRo?w7hl`M_WiOFDWPF-KN2V9t0J*Q0xW?FK@L_}Ljxr&M^t9X zKu6WZ*6>N6GRumV-%)|WwX%YDU&Jvt#E^93ysRym-GGXZVk&}tSy1nE#nek(GRA+L5e^;tO3b z>}Hfx0sIh*_Lwhjh?9E4OZ7h9$q$F^#$wTd-pIRVeU-GhY_8i)O>g8XwlF_kf{Esh z%_b8Jow$lH2IZ>p`s^LKOij;YhZbdu)VqGZ4M0=NEy+$aI{LC3+#142^X8|099ny~ zx@#Pf)wH}!Blc{pPXSW_PthXchc`x?Z*c1ccZZ$vs)lrHR#PnQmca8I>Mc0-DlblN2O~xZ=8@}PENe5F*%b3p$_2u_-GhS{eZ0X9GhKUO^k2vU`CMD z!zy7S?!d@8&i8aEMIB!iuKC(K{jNf0m~%=(-b!@~Ky)3sDK+qa{D+OiI5mbKpooSq z#sFQLA7#t{n_#CcT78MKYvq^keTccW$@KdqR^_`OQP4**++0XM9*$AXR04yW?JA$k z_EVHu=hM|xsh-c{td*YL(^D|vylob9jiG^y1(h;AMFAElCK%3icgFt@WR){4N2Q=V zkk5$o%X1XK!Nw9W34y6$7mo&pi~1LMLznh{{E^XA@u?5SN^OLbhX9y{hQ{N4r^%_} z_xD=F!3zCbnIK6sn;kCM7Qk`^FSB4cspz~j6w`Q!4J3-9NQvn!jO8mF{`qIMmjpw9 zKH=l(T4Hgmqhfg9Ia~?HR!JsHu)`&dzIpmoE{V>)^+Jaq(W@AyX8C^WqV1Y!=9dc` zK=C9_J#D&GqTcrwp2+=5uWB>rz^dFb118xccIQgTY_bRF9Q0+Vsg!4wN$caC@eH?Q zQ$K}if3#r@nfN@J@A4zLC8Hw9Da}Qbr~f^GB%=Qbm(XZH)8Dx_UCCE_?!C@(Ok}LK zH`Y7vAG2`9pu~jB(P4=H;|QEoG~iU4OP8`JyCy_eq=KMZ$*5`2m_Oz8SXb6?Mt}~& z6$yGo=@u%wWaIkSyngGf+LtA5TR zlAl9CMah0Rim23m+KE^2yL$6Fe?OQ~OU_zZUD8UfAwUW>8V`@eVvA%;(gcFpMN};l zTEvpf^s%=>TyGHO2-NhQ#TGZYQ6fd~_4Q%YRg4(1BGmEA3|y+hXS)fKY9)5q0annH z4L*rb=JI`smUG9zITxppY&DVSb`5JkL%&WaI7II}3mccQ13D@>0x^uPTGK-);$(>XSJlIorYEwzl5uh-JHEFs$|0mlO{n1nL>JL9zQ*zUeU$S}HeYF?5 zujl>xC22omK)S){^!V1w4fX2P=XX>As5ByJJB}JV1uS99q`g_@OK+3IV3jM2%{qkj zXG&ia9wnOoL;>829m!ZBH<9gkw)WG^@8$4svhMTh)?$R6L$$ps?K13;ck;bLo|&8^ zZqQZu@av(xVEsh#lSb9#2$p%apLcs@1l3=B|NGeMzKYUPID~@ z=ryCBrQDKTTZ~_$l+^`Ud*7n?J1&aO@27HUM&pyxZ~;kpqO4uFe&g_(hL&NEUnM|u zqC9XOQWt6*LKxjqH)_s#oPkXZb3;|(V zO2l}Q?E&rm9{}{F1n|4x-CNmWG=&ysU&roQbrFXV44gel9EVefhux3F+r*X`_IQod zzm&DUM`o|gshWkPWE_bltuqA`73tSq_+&r~G7&Tmd;9T4vvW8%J zw@d}De@BSRPS{m>AZ{o`!x+W@&Vd>O@0X&Oi|6;pn1yy9(kXgrHkWik7pU%_p9!({ zb5@CQ<5w)(Ls6d>{-7aJe()>DV`tkp^qGE$fxmpRN(Jog-L+7${u}tiw8G{ByXV=V zU71j{WC2AD{{wylato<25m68E7qvm|LZVyQNoaCs3e%=vV*I{IXkHzYY1VKNpWOlB z_H{?8?C>JuFB*U>z{(=$A~6!Ort|2qHtMIt-Gqaaz{b(N+PDNOHbK(DTxD!%0U{Le z>;SEh5<$OG7pb>YdiBzr-~qAED~#MX>b8P-C79WzfB)Xk-aHijUTUJ+F-95c#1Drq zk0OixB$L;_X?T2jc9wdqr{j0IG;3w2^K!Gbob7k_$nZfnt> zV_lvH3j$!^sZtbweH?=pA>6*ubWM;xnP(3GEVNYj;u!yp64x@&DmU_~i#oj}F8k{; zx*5AUnqhy9KC8}0 zXZts(E#am1r^EHt)~jy*`wCyrtb5XmazuuCsem~e42r`9`OR{UU@4veAoF4u zyfiD$I6c!rX3*3HHI(i4_|Lx zFEABMJqdDI4wnEpaac`969tPTZD^ou6-2@$786e>(^j?1nAxZ*G6zing!0eFEg4`r zVx-f7iaGE@{sH#F7FNw~OE6AGKRB>kw6bQ0jYkn7v&2;=!gV!~CFi`!CgoQ*{>@1C z6!uMCVX}U2M5HfIP$%olf%%_RD9Q2kZO9753g~H3kKkgR684_4pb@pRdj$?@?jaZ2 zS7>J<*p`XW;wL}oO*Z% z_pU;Q2CXuK*|<}tkkuFUw`Y)8I$SV>-v@CohSO=PeQXivaP@`2bTD)T~ zsnAsZyevVTedvR=taH&RJ~WD*BD>`Vig3E*E!3D3v}$W{S)w6WAT--*b4?63_EY@TchbK7Z1qn8?Yq{=Kg9j5CD8Vx3R+H+8HjHJrZOvywH8ws#&j`@qeyrNTDlxWqdirA z2KJ~oL}vZ=rZ1B}b;%nQuHUx(&IzDBLYiyD7*l?m67WDAe^ay^W zYu%oVrVbA3dT$?}?(4q0pRSDfr4aGo)71N(ASUHK&;70#n6@kEt6jvdD%1DqX%MnF z4otr5czdBit@OEyw_|R9-+LLauif_aYv4k6G@@j~08|G*gC)LD)J)*bn!@6mWDW9?`dK?8Z-XBBCoDVG1@{Hs1kT@+zEy#?^0ADV zqS53)q5Dvy^tR@?|ChP_kt|cc$EAJrYN^}h?jZN&Za@FOP>fp3ohB3fXj4&IIVmGJ zE76naSgi?k26hoPY~J&>H`kLQ^xKOKm~dO1;Y>;SA(jI7fQ1A`uaPFeL6UyOGc!OD zhA7yXNFEydvm_8)3y=ZA!P8 zeOR}TY2flvx_$$H!DnE_e$hWPin&g%?1ktfx(~$8kf!vSs*T9D`OR_RL`?$dq+UO* zO2#Vo@QQCEEFm!3hqW&mzUv#$#}KctFZgagnQxC~OVwifVa@L0QktRyAGv{hX#;Sq z3|swl-?k@jlzAaTMTMB-VN=roVf`by@O_y_P$s(~r6C|7 zASl3ib50VkkvzPLWa&UfMN%w&X1^pw3Qg*ley4;8R%2`n1;@v=;qcuGSh!=l=f_E} zB8ualJ~dF9)jpC|cCj}y%$Y-C;qBs8sSwq88he+ne*cQdpzxrWVGbkIh2hJuxxe7O zkab@l*ufT03~2F2Bps3JXKUf&<>n-va2nbk0_=2ls9CR!f7FAnt98>qG|bJ!_}@!l zcXr{rukO(r&2gir*a5E==8PT0mA0U!coW`dfrp=IfBAnq&(K7fOx1tC6`M$sZErA@ zLMWh_`M)CgA0?zP0XTOSi8-#;@D|HltWKuY4bF2Bs7CEupXh#0eFZo=b`BwjM(|qxx6I`|BRZ( zwW#rcGJN@``G?{5G{L>%907urZkp-hRJiE(5ZEi#=zFy>{4DHyu}f1)veM>=alQI? zDQHKMiuD5x4NDR%%`#MRL0e7#fNMsmyWx}5HMzJqh5S_tCC4#hZlk!ycv1QZrog*C z5zVi&Z)+HoFz0Wx>mOhn$GRk7;hz6X?0cCSSv0N088oxG5%6BL@E>lP=A&TArW9QQ zlLrRb6V_!SjvC3(RrU!=Vq=9=7>dW>=82c3T()Faadzx_p3`y>W2I76$@Q0_S21CF z#!e10ZjzY7vS>$sHBuP>%;NpmiA?k|%X4oRsO;BEjE;^MWRf+(t~x##s?6YAkmxT6 z#+d>{Bq>h90M!<1C)}qhe9W>ZP?{(@Bs5ws7lB82O!!)_TShqzRcs7~b)GM06c2T; z<%PO*y$_X`ns8X@CwZF*ClmxtAEOFve%HAuMmU%(Yn)piyya8&*NzNpbEah4{Vgi~ z;gV%ybC;BOaIP9*b_i1KjL><{f`6#&2>G2Ng|T1|Yz3uegH3I2UiBtjuT6n%k4?S@&l*%Qlx^Gdn`kvuJ+J;-lw* z>PBEKo+2}sT3>rsVVC!}!2L>{*1Ng>h~%{n$HyzHWEMS-y$`0&v%N1*#mpBK$1h4C zG$e8=Fk2+@O%J?ct^K#_o;^@}utCUAoE97mUu|=kS(tqIVQINpERN5;OYR{?dBoO# zndB^BSjou9$%*xx4v_FgEK?15+^3w3qPDuQ9Y}yw_el=MaUWk4L`erwzIx|W3)&Q8 zQhf9cpon2U!}{0JXkIyMYT4eH%~*5$BfOLBH>udAUt67-#prw0-iGu&0~Q|8RSWz1 zoD4>!{}vQFH_n_#o}A;Z@dumQX1Sdf+;ct|jvtd9Bc2`plNx4ttbAEad=zc9(K>fI z#R^B>>)>O2MsK{*`I_2j9w>jP*0#U?mvQR31QJw@QHoTX_bMSK+U|4p0m z$FvQKIm&Yw0U6Fgnw6&+g6?PSdICHicQ30S>4w|#N*2GD6SZu=nrr(G;f{NE<`|hU zc~P=WCUwz&1HWwHY^*LROK*qwN)&exL_D$ag)}myEeJ=WGgj?=+X;?@1 zhh;Xw_LYMtf;C~o8po1dNoa?7WzcmdaJv=QBDUZfxJ);9qF0<%7|%Q)Bk14syohv{ zV&6Pmw_~wU)HM4Y8CGL^fPC;U`V4Z&tutcKP6`qn$*@jF!N>BiAoI#mDfvh6BMZyg zQ>=KZK+|7Pv=W)dPLDDY1e;1r zgbGWf6|UdxyZ7XCZWM*B@?GKK<*JbzXGYyIGnwC*W0wuK8M^Iu7 zfm|fZuebLG&7XeAE^7gB0y2+`PCAQTp3BTa$3d(AsQ7@xP-g3Ptq&eM#A%r0sum?o z;lfnWmXIHyU@p*9CQYtkzkls5loZF&1GkJJYTr;%FKL4tkhisL z>8nBpm?$m5ySgY99eaCF17>L?En;Oo_1E<3Rits&C@SrqWBkxya!%szWKJq6kNdlQ=YE zzl7jX4jfP>X%AK3VqR~z2r!s&`V7Q@c%p@PO>K1+QvSwzBf5uZX6~6wyPryM~wM1vWdNd}gA^t?CN9 zmyPK{GFp9(@Ae$4 ziK*A`&9`Hayxid zmc)d!1Y9)f3q<8c)TSx=2*KzHq=^P}RYU26rjQ({46#ZFpMD!S4ERoZyr$~idGrL< zPyN#X=5fb{5kRFO5c&SOySgsAVSmH7im4n`!>?!-U>Dwwh?$ftwjhvg0^bwk_&Q-! zXiTLbSRHgpe1`V*Y4wf(GuwfC8U{0VzpV4*F-<;`f7OnTf@>tmTyUbi3c88lDD)Z> ztVI=QyFLOmIaM4Ezu}8(=jdm=xkt3zHJly!dVu*eHRDG}6mL*J*>|Ee_!0MVsV2 zqeaCg^Cj}nBC^tSC|NzKw7lb0xgK*e5><+s^{tHVNvE;f`Rl`FVvMiz@l^KOLaWQ^ z%2s!Ky^(SWS5bf|wkSrgc?e~Xv`oy%_r87Up6}Q@G>5^RA7Og8)`CLkVq6R~EY-NV zXLsPn_mX^SY$~7)Q6;&s*e7_eGS|D{S5;H1t5WlhhhSknXU9Fma6RCbI%e2xtjADDEK<%Mo5_5 z?sY6A^n9SK{d@v*wzecu&do~g9}dRKaIuvL3I|j2p2-K;cafnj|6)J>XG@%qg1PA# zvi<^CIz@X67mQ_Ol63aitK=ti9f8y%*&s)nGuukBSFq41`X zk;HjpwR$?OZ%-da&zo^rQtyX>S(Zwn#>VFd^>*vRfvPyll0TAYVj{6&DkK%}8iT(G zm#D88`1zo%knzTOvrP~Yp+c5T4SP41L^wf8h-Fb`3nX@%3(l}w@it{Y;Uzi!tH37o zD)~7%Xp9!AA5}5a>GdVelrmtvI`F}Zx?ws%-mgsPMif``i$INbxT8L|e>or{Zye_& z;x1*J$cLJ>67kBlG1BqkbNL&5;mG`~x5QzHr~`Lj#!1Q~%K3hUqwSqSLz2u+7Tv=HH8sFLVQUIA(8qGeW7| z)gdKtgi1d>jCh^`lCbSH&a7|8n}s~*rx?xINS4mM4mA*sn+pU2RH)Z!43mfUv>Jr6 zL-(&eIEKO3xZp&PV^iaQZ!==5^{=-;(X1rcGG5>2~N|~Sd_AM;Z?SfK) zXwO%+r@7(QhKOI3qbHla9JjBPzV`OdrP-%GPN!0>^DOOLoi4Xu>Q}PA4WemL{QfLa zJVaL`=?R#J!rdAB5qC?>_oJqr4+V{F3@>D}1Y8^_8*-uG62)FMd<@O3K$ks9z^%Ub zNn3&UY{X5f+R7@xW@llV)}H4NDMA|1Z1RR?AAc9}^R_oy=V?`m4IwF8hFqt>dLZ=2 zsx?)7KmK;n!>Y#i@D%}cM72n($gUo%3scvGfZUIcEiXbI9?c&!JDA~F^$IkoXDlG3 zgo@C-iS8CIJ_y4BE~se}B817L2rV+~hHeHw6yk6@h5VxM{?^#!yGu>L0hN*{4 zjWAOP9mUZ8;%jp0k^|^6q1nq6R<-=KKA9ylfa}oyk!+aAtobKaB9&HGRO$-|eyP{p z?B~wzE*191v3q;LC-RbnoPropL~0~+B*?*k5^yGHg5?Py1{}KD$6gTO2GTa+r)n}o z;=&d~C{`_ZC_}h&xDib;BSHbbg+W~0^Udze5bnnD8JdZ9SGVg?22y#hiP!kpb)G59-n)^To&2+ye;mteE3AuIa*^# z$_Z_xz@MnFWpc?1oKN-ToFzle(a#uf7PNkG@R#ZsF_q2gaIJQStaK5S8}wo4myG0 zx;NQ{FJCFRdv8ybgSM?n#z@AS_3(Ra(j4^gdnr!mWT?K*aDBY((1Gv{(cy&i1-p(& z>+CEj5QgCSX#32KhgU6&3VNx^2hS7GfRr?ic|${}2L_YX`9qoTUrY-r0m$n11=DS< z}68=lKX7d;KOZsA&y>r0!cakD(l0b{@s-&cBHZC6%mdrqFLE}~zrUjB5Ua%~vEL(Bn5y~$G%vl>y5(tJ>- zVD%wLGX-+U5pzvpEbA9vT{vq-MJKWTFlH8LjMi^?T{ga$WiZq*|CS&#aHvAX24VRoW zeK;P>yD#FK(L4M(QiNuLf293`Mvwjm5F%F~Gy8cHzn{PFS5`HkDK7Y9AS4E&l8Gwr z6e~J5Y^jKsc%#hJlYkFeIvn!G$jNq?Oq`m2^D9n?3_apUxI_Dw^Bdbn1>gQ?4v9BP zUq}ZLe=WAV+SWs(R~41{Sva{?omx9S+oQ3^^~uLfRTM73mVlK*GQV0vPk-XXi0?bk z>j{$Zd!=4?=d18L;gBWj$5M2RXfzaXs6vheSA$ZxtIvBlf+wQ0XO3Rf3BHg=BhorGhSyT!OT?G8G-3#E z0tJti&2DGD;6YNJ?DS;Cw!rx+m!|5}7Dblj0aULVV!7oqjexlCjixj^a!mSCh1SS% zmEveHMbQ81T;hKYrNN)5t#Baqo(9kw$W;5Wd7(j)KvOV^S+#+vlDIVTA4{A>=mc!e z8b6uADo;ANsI5Kyb|LSZle0j6J5ufU6H=V)_eUw%MmvFt=lh1jwz5KH8LLDQ3Gf_D z8h+dcQKk%RSUBK7GEg==o22zZOy`x=d(2;_=zGzH;Q6D?3#S=K+Krv6E3naD6S(NM zY4Jf5v!%41z))fAuA*Rf%C7@C(dNvQFzo0@Ar9_`!|f%xNTv?blhdQI4PoR!ZG3@XH#wYA3;DfMXulm`oaBb|qa>t> z#6^g9dkR?r(aW^_aY)vcENeSdgLZR9_i&-YbU@6nUq73@4m6hU4}G5N!5fsdlD;h5%4yK?gOE52U$jM++9HWp+n;_?c z*7d#Q(e*wC>po9vv|XLas7w#C-mwvIgeJ`G`zva0gq-0BWH=Zs;`|Y-YCQSWRRav8 z*hYd^`!T{ta_KfJp{N8|42U`xX6$b0?mh!$zdWK;_%(Wc)wjw=8;|ENAZU?4TJK|m#|D1t0+ zRf}i~(~{P~jpk#fu?;Nv9w zc0$jZvb{QP)L%!VIK@fEtX2|IHnmQPgQ8+%^W$S7Qn$(?p$2ou% z(n;wVBY3P7BuzY;4s6-%FTiH293E`+f!`?8c*WbQ ztEQC^i3Qi@d*+t*J~~cwn#MEHBSlaC&y9Og!hggICzl!r;^Leti)@?GlM2uQ7>j}^ zxle@eZ+|V&&V?Sgt@zwsbk7U7`8;k3pXfeb3_eA~WEb?lBKJ#c)KAy}`9{kZFCAF+ z+!L9{Py@d%S zLCo5)N`gGcnxF7HVOf(SfZL3zsl*CJA9g=K&Fu%?C}={ER!lZ7!MMSU?Ry+)&_eaxI@wJMp`A3GV~k;PI8G9}r1k-ws7-3-X4#t9J8}<^tg0 z2@Z@G7X+0j<6fZ*dxQZM!qkOC4lhQ_xg=r*MZNiG0nI66PFF?wGYw1zCZn>P)?Z|- zo)qZ$<^&y6KCrikv-WT)^Ky~Qva#ytj=wDrxI!-zgfz&8RR`RN=zStbmPYl8<+bkH z*`_2;zK8i&l_jNyMix~2*OXe_9#n^qJ{020NoWo2Zd~nNR{ea7k^E*4tGBMbFu&&E z<-7UVXq(Y=u}5mQZ03g=$r3mtuJmUkQa_j;se z_j1?R>34YF`P`fOVPTmz=iqB-r)c16H0RO@Ou%qi<%!lLe|bSG^c$qHS!}vP!yua% zX42yP(R)B`!^zscxWM-Z+5`?WvMQIWs${NOaH%Imd$2{bH>faW;ph69<2wel*5f}O z90!hJ*)-+eO6zZzQbQ8xOJgp;@vlziu~qQs2V$NKc#w34C4en3$nmWnIn9Uvq73n* z;kr#*o#zP5KMdNtk?7$1$<&Y7tb_G>*Bg&MNY>LT>ERU{nO)s6p>+ zY4K3+UkR;n&4j&R?fKqE3&Ij9JUnzrPB4`7JfY1zvJqw0-KyRH9to2_riu`~XCYwV zjQ@3nVgK$zAM8`LHcBec>UCX9y4L!($a1dzdNQ~-Ucb*Z=Iz60$g31S5XbrnQWgv? zjsOXQ#O^Sq@jSYP7nT*qq90z0lhDRZy3Z85CY5Ct-wJiGYis zPl|UmjNc3rtdd2q8x^91b%BbvLUB&AbYy|Zk&pe*MF_58iFuEkipma9O5Kg{HVf~A z(P)o#Ll`8fqH^5e8hnz;sR&lPOBLzim*Y62<@t+_1M4L4wnwxub%f5)b( z9GM@4MFPIvNVt}g{zXDQ>t_AH3HRbLxgfEHi~H>hq%WAs)4RKs5E7S=#t=_9%}j@A zgM1_@6{?&|f(@XfOi)4FVT>e}-hL{nHBXF1s~R%*bFNGSfixaOEgK5I+GRvm)`1=tP5?X{ z!-s|Qrop_<<#igS$Q9)!QBF~gY^=DhCt+Yg(duLSVW@1QFJ5jWrW|R#+eV2lg*J3+ zv{_^r;$#ey0MJ@rO7fw(8XS#DgEH!W^rHhQZzgw1ccYod@fk?qgOZ zUrn;iAS@#{ehSSv3wC!jZxPM{+b2!z++%j(^*W2J#v<&BzMj^>NDT*~R4vcLgxP%5 zX%)I6mrxr$hIo0(uI7oZvdi(eBh4`R?l(GKG!5|#)oy@H zhzIo97(ZH?g1(}m<&y;k=m(pY>>74t%*wXg))Oy(MY8?>r0HX~LA;aAU((@gWAz?xAJh&{gn2xs-!d*Ko}1r!s{N5jU!4Sv@b5+rxdB{ z+IVrZ)QjPky$oTzeC2aE;)7)*Z@>BajV*2KbEivryyibB5FBy23;fUIT_`eV4i zlhx5&sn|hiF?Y>kURAka#pUWkGEdnojwhmAZjBQbG8NKPczpFy7i<3nQ)Dr)$`u94 zej@NDiu^XGou-{-q(3Woxg+kj@vErFPV~uDQ)>H5z|@#^)mefhn}z%FhYpPe!UyFj zg8q|X%?#y`#zH}>1Dk?=^>nWh%`@u`)JN!T+}*Yoqf(h#1`G!_hdUOof$=fxWz+pJ zMTJf6WRAGC5cEVci1+u<^s;T#30GXy7#We;FzHRrZK~?#h)txbhM|M@dCEUNBGJk` zO^ygj6=bj}^YTzeocT&*bX`h4u_918=mN@2?=2I{6c|!7_pOdgD>O6|*VfnPI!gF$Q{nvO%&pV!TEXvS`?|5C+2`fs z3cI1YgE{7u2=i-H&JG-fswi5w`F58B0GMxJWl;X}Z*1e6S$S@hq!AK zX;v&mT5&~5{T>SIKgiaq=^y5sasz5p#W|ZTxFobBvfw-va)f*U1n8wdpV=qPp@t&l zVkXJWDsjRc_D*e1&th}nmZ2kW&pcS?1S!v;`-)cEgvmlxxOVdeWgzL=cGI{_wZ*n& zb+Kdgqg++ZO*`nMP7E?x8b3tNyyS#09Naf%=8fBPxlJO2U>P_8C0beSbLJYg8e zSx8sB-F&yNJ1gyUo~u2*&lk7N=gf@g8nKln0QlQjiiXmTIL-MPpEX3|(~K-pMCpN( zaMn-Bdw_t)`;#7?4_xO}gmZbR^TYgQbOE9l8Y5M_>;|>*C%XdKwW_$SL*JtXErIrc z8D{bOG#2>YKy%S%r+ZpROFu_~e;dV!bHk?7Yhh`wNzHIsO}sJw`L5EaKq9fVjw;+MS7<7Ykr;pc%|)b7tTW*2)3 z6Pxwf8NI2vT&!tC0VTk^kl4syu~j`{y#ZiRhn`98$)OnBi8B1AdY|BgyvTMFTUP|K z)zKb6)p#_a7yw&8GNc39`>nP0;euOF|6X(~oiKebICxeQa_8tg;a_^*CY?yjRS5(79Xb|2!bvw zX6?qaG7SG*A5uOE!!<)-%GtXRtymqP4=*w95qCi}2fmA*nBw`=DWktQ;IJW7es1&# z+F^8>4pB?o-jHFoqgzO|w5 z^+(xi8;MTQ>D@Q2h*g|#35W_Hr;?_rv29DCjkkwrPp*j8gWom`$Ly#+he0HBYMelz zC^nWVtIDrQ#-re@ImB91LVg1V)#NA3|31ax=QBX%@DJ%RYEMX6CvnueJL{gW`<-vh zCBIksZC@#jzNSy8UJnvl8Sl!W%R`HTsnp$LWdM}KaF$TM5+cBrfPc`A?RAM=L^Ba# zwjrmv-qp-i|0pin6VGS--^kUfK(;BDd#;Sm&r@*f$I~5MxR(jxDp$`*GoJT?_D8>! zV?4;8Yg0om!a>mz>Vkb3NL6#I;$B#;5G^qEy@MPOOB`o}=#hX5!Yz;v+O z07WMu$$)Ty{PD|FE|_|ooGAZ2FcI9ub!pHSD(HlS*eQM>1qiwYOuFWCNg)9MVZeZp z@zVUMfQT6OquXm3Q#U`|$7I)wwNB5EMfeTlxAv;wLu!2wln|JFha%Jj zNd3U~(Jp0S^*f8umYfA)@z=ghP$O?#T6Z9HR(?X>BD2Idga#Bwa)z#{p16TGn}|@- z`KGHkV(pg=uJH_B6PC7%t?oy)wGQ8-VD9%a*KhBl-{vaBR9eY$3m$y6LaVDmC_}_d zD7gHvu-AwmVL0FIrTWUX*D*Wa=e_Lrn|)js-8Oe`KRde`E}eL*l8`I#d^+2V}h|;yFSl9xIt+82p*HKSZ;4&K&dj zL(vTb5U{ai;amX~lt7HBW(wn`y51(SB^;R?9p2}7R6;IE@cv*Y&|T=nxhmt6zIGgD z(>Vw-X0C`q^>v--*HudNebMo1YHg638gp8^!H<58y-w|mTKxDImhscL-bOA!6W@D6 z|B^iSZmstB;i9J26qoJsJn=FUHxRv~_FjE^YEoc2D1(h6dH1UalgZWnoayW=xj@#{&Q#rDH0 z-k*Tk!M0yaazKFb9&Fw85pH+z#ayPnoz~>-;A`?%B?Y|KVevg<1fOu(r1DYGmEjql zR(YnmUb#buIXTfxD=3i7#`t#-&p&pj8))d9E5A3*n~?eJ!TiErJAghQvH6wCiJ`w+w}5A zv*70pS4(6-DT$V3K!A*a5WooL2rHi`9ZE2L$W5Z_^4BB}Lf9~-xBY|cIyg>;3Kaqe zFys6`ME&(&l;0b!56=wU-AE(djl_U7(jC$z-5oBxKOM`TO=e?ij zv-dCef3RNbUgvcj=N0bd1xmE5kS@d^{WWb969Mc){D!Qcz(`GQU8SlTLRIXF*#m&W z^%k6S((>36CfdTk&*vhrQnMIFKDD5z_p4cSX>r2JIiCCW|JIWDEw-zvx~=vn&Ub zSdlw;!F`y?Gzg?Dx7UoHkDZjeuJ%r=JJQ`?~#iDeq znwwq%MJ9gw}*67_v3;IV7>FDtQbFY`PYT$$6)636<8Dv03kHsLqM8Xb7ityp@+GywvTWkSPKaC_we=kOMUL~}L zE44fv)tU$P>~>e%#@$v|tbI7A>~gcTvs&qDhc{LW^TR!N%!Rdmv=xc#iRcA1nR}SO zSKV*eG8D+1*%7gF66S^w^E|a^x)SHE_Mt1f5en)7&_#PYD2%pr)ZI4 zV(hucr!(lhGc+qbu=Q^4cOL8cy7&6o+8TM5zS81M1_~p}ZETgOLum^$8x&;=sNN2Dgyo3Xd!T`xNY@h}@Abjl@L`vm@QJVDbDtb?iACM4+~(vUk9i)TY!^$dcpml`=MA_4Aby#B=Q}oNvgDy4xr94412RC70_Qd4pJi?xb`4 z5)-`0h+_k(O2TOR5hbC>jO^rce*@-(x{&DnY%vX6$JS@6;PG77zZ^3YBF`#j=#V() z(qoK$s|~UaUeTf0ib*)z8J#=}DgQ3|wu&~2R^9D(u$pxq$SW3b=4EDnN}G0siN_W- z6lg5^PuD!Gu_CkWJMX9!%of{0OP~;a>?wv(yiYJSbi@Dc1p zDKoaD>h+y^rc%WhjVYMtNsXKurvLfA`|tY zIMK?h8xq+fy5I)n-$o|KkwdFAc3)xXJ=!@(;g?ofoP#=eHM+dr7Ek|_9O}l==L;6Q zudZf&nJ->jK24wpsTdV*)KZ5=lBENl5Z}K4Csd5!#S1 z-)|PaaOs~3F{MZVyYS(i_zZh1k1Wni<$QP1X9RZ?O;9b4#iOT*#r`ClrGUn5$dCOB z;|{#?zfD^Np2@bP~q64l9lij^R-r|rjNb;g8}=Kv7UKC3%x z!U3oFjMN?pZ=|C}G)wVDVj?CIl=XI!?t_{vIIT`-553lPNI>{s2#4kr;al<6B=akW ze)ZRt5KWQVH`EhaKv@aBy`Lz=UN>>8`~xv=427`Mfd~ia<3K*l4%CT0vkk2BFERMb zm%cQ|2lJs8KI`OEd*mS~bT;(Y82!d4?}mx(ritSQxJm6yV%-7}0pEtWP*}ptNu{wD z^!C(QBh7PaYL}P1l$#)gkS0RJun71xDVw6ODtuCEQ&!Hbjo#b!l2Tbh+xIXYcSYxN z<2f%d(yU=)}SBHplXNz{cy6eXNWnU%8_x!nC{Mq91`KlXl zw((AFm@MLftM7;_;H{K!v94ww)x5!$w9}`?%h~pB>kLh&%K!4VIEHBB;cuaeQM>o$ z_J7xs13M;BVdc0|Ex*B_H*W+Lig|1vf%K|-O&}gb^mhms`E41XX2-D!aX`4l+VpeH z8UGMyMox~F3d8iXaxKq#|E&ey;Lnwe5tR45h$J8qs%sE6GN@M%u0H$*Q!1xnQsmwx zq6s4aFt8Y>g_&>f&zXg@7S2CLJcCAwiR_sZCl_K$Ztb)frYpqYHB44|V8Hk}y^0DF z`_-uU-R;U{sntdq+C|e2v!ZrylO@Rt{qepV!H_O{=W5#u=EPD+PJlYIo9U*$)Wj*` z8O}(B)u>TY-v#}W?Dsnn`#^+B=hMKXv%PbBAJbfH!UyET<(u0*px$VzkKS5IANkY= zZT-n~WssW!K2RQ2L2%G!pvI7#KiPMw!k{UdYqRzL&+c*$CByU-Bp=&ps{;7%-;GZ4 z3`DvfCf3JC-!AT#f9K76If*!7QaCEdrfJmizL)&%tQ~0d5T#wQwbu#|$9pTQH*^yT z4@vAqO+UZc`^De5KHCb<{M6gPfiP8l@RCDwK?oM?=cZ>Bh#3oI4&QT(EtL)NP&)9v z!+jDV+;l_AxCXk?f6zUpl9XndJ1_ZGie~8_x~g5CtdK0IC3>+?hm4sYw(|iatt~i0 z0>Da(t)uE(k#Eenm!~xo1eAYJnvyyZyyUs9zra7h+^%aI>S}+S_`CrP76fMC&V)Wg zx3+*{PxpAwmv=$^3ky!BK|x=mOA>o8-4%@AfbK--i8go1Q-?f&z63kav!{eiI~cw0 zR5>%@$W!Y{Wo;NM(O&+*kX^Jr?Hjnp*F@w{~^E#bE>uPv-}E0ES3S;E+R2UMK|e z&A#ODX{-KKv){Bxmg=vvCuae6m{R3hAjd8Om65dz zIc~we{X`Razw&}!I*}${E)IyiCd8k}YWbhuvD_5XpXe+4(lBg%fUTFM&HSl`^n{fB z^3s_zm~fZd>UMlawz1msFmaG)>~l3!tjMw6>2`PDv;HdeP4(FBm^WvPlOoPPsP^=5 zh@{B?(O`#*Q`X6}B7DWZrYp#nxNwcfq{Zcs{{>(ElMJc`Q>~1-eL0`K)-f!^*45$B zELC;!MnGe2dLZ9AI225X#5tg%?n6;^%Q6u=Uz(F-%wif!FqwcF8zb)9+pFiYoQuWL zMHSVnBASV5{1FqwCBe?Q?B3V?j1;9bneJ?=$3jn>KI1g#RW$nxl!5Q^`9$H#7sck* z?T7-w8E)9?NlkY}Lz2GCk7V({WkWUdm-)X**{?TnXWb z`;6N!=o5at!9uQ){tN5Lt+Q`4%4yyKvqOWkikOCz2bmm5Dr8ZTzcH7uF}H4Sx_M~# ze~9}(0oMNl1dZWdUIplS9l&gbK@#z7A;NDE?b!=W(xT-@l)X(F?j9PLLL4dZc# zx9kan+;dKFp-~u>bCJ1;H3mI^$%Yg z?H&JI)yXYU<tPZ*%dp;6>A*EIw1Fpxhh#q1RE)q7z#C2u~aeLADeBcA#PcuH-q*?15Swf|l*nIAUz_o%o>lx#9)>;;J@Gs4{|fKb^k{WSr`P*(H7;7DeC! z&_I2V@8&rOoZ5*Or;MvE0sFgxTzR}vc;~T{jV>RgSW`@Vmg}0Bv0O(N7tU8_YwabDYmfWISpwZYPotwc8?PtZ2h{-{r@!1_#ilm{_QGV9 z)zuos%&vy5@hU5%J9n8P-TWXVL6b@sUes63h{k!nsH_1!D4t1d@bq#u($~T)Imu{L zyF!wte)K_DSpAF7ehNQTOI0R>HMpXln}NEMqlz=nhtP1cP;r+Zfw)H^e>C()^L?tb z8#{E#H<4~UckQ^~4_NtdbFkFd1i8!bvKx1Z^OfQ9#wVPPxP8OC?E?b@;QMYeeu^1-hXn}vKFxk@}u%?VYJ*+4Pt?jk4 z9T)gx2t_yFmfpqOW@)3$mHZGteO#}^Ix;-2`e513e6@@aQr`i8kg_!T2^bk^=`5Yc zkXT5q_yM9W;9Jy45la1)x}^#sPG;kmkI(3Qa zA!5%;6TUM{6-#7#nh)HXJj0GwRsME61uS2Q=3VLS9aW=STqK@WZ!2_H1AX>$*ME;R zBNLt|YFvc`t7-VY1W3C4qDc2%PNyskhu9o@z&U;jG%ktA5539BC@B@KR3|p@kkzYf zzTVN=o)IC%WD2ZC9+0;CFqH|1h4K)u^5ZY<7;YL1ayb}3yAMV8m^DqF(R+9J14n%q z6I@{x!eZ|{#@X6EqOrd>j(}Ka#9B3_BrCEV??6ThoSS@`3kYcT?pU)%9HgAm$i}V8 zpqbLmF1aq0E6VT>6Kjd3dLX#ch3EG|@cVqz&;h~RRegb}v;tA8U$D_ENI?!Zq5XzR zfXqo~uT-I6M`A)|%5;090AJ%VY(Q-S)mI%jHt z9HJpEM6ovxv?dskf!-6_KX>ViPe*_|_H*;QW%5OaY{QjWYoq&~*YDkLk-xI4JN_By zZ@d!3?MmZrcfrq@>%SQVBmSHYsnqh-Q#soRs&TtJ>qHZ9T=jo>ydgUe^tm}A6Q~M$ z={?QbAQxZFQ&||$5Xu^}5zYiS1DHjyNwcl%nxpyG+g3=?%y}Db&T<#ycNX zs=85J{(Gb=@Qu-R32CpGxP?K=OYOKmpLP4#p8V0;fXtQN=l5&{r^6S6)Hdg^3Yp=X zP{{fnXxJX7!fp76dz#G9$j7B_Ad3+~Q^c)@o00hLijE3XxK_RwGVbV-o)H{(&V~Zm z{~>S=&n4k{iOOq|eJ^0B86!MNYo87$oSGF_ruvEqtO*n)NK7=8$Y7FU8z$Er8T(>^ z&eCisR`&M)6SZJYNYF71zY8U2iW9>hnIK?0Kh2O`F#5A$_zGLY@jSizxJR^GD4SK^ zSB(2jP65c&F+&ZykFfbl_yr{5xd&0ZjmW?xE_Qw=mXD-gsDT{<(~CEx5nXZBNzsX= zYqUTP-^nvr5PtOiDBXYu3ji{DeA)ZV7DH#~48Kb~=e|qD8gbn;LigC@$spIU9JDJm z+iR?-0HYwwh&bl-wZS`*RPS=U>9sr~I~eF4#FB-Ka5~)Z?@~90BjJeRQWl7LLTE!& zut3P9Jgu%)0PZ`1^J&0t$2PssL;X?;1cf&&A+4PC@PpY z3(QTnJKjVHYzw9bA>fzmjM&7i8VemUmY)Lz&} zE*}>Z4PU_rvj)va62nnK6OadHy|8gug;Xb?dVB0&YZzE#Q#eCZk4X>qDSIx={~Y5o zoP`!6D#As?ji1gCUh+KnshFtM7{13I5;oG%MPp%&{n#$y zOh;w{tjlik#K|Zn858~oLZhWlY39#S{F|l7+GV)elL{x&;tP2gMWL@0vYI%XfsPlGi<-fx^ z4~q)@Zf1%{ttnT#yK8mFWM>bh$XCST)rwV_P%7hgMsJdx7CU(CasDDU%uQ+c)p;}^ z22!G;L!mC~`ha@#L?^JBg`c*sMkMMuGhLw?sq(a*9R9ICzRwFt_!=VGK{c(8}6EnkUj$eQaNP-{e)pjdN zIgB$g<%n?R@7v+$>KmeWXL)?$2qb#ZaKf9e4+rTq66AeQg#K1l76b?(I^1bFrv7|U z{&tc-dWUwa$k=Fhwehd9If}zSS~=+GoYse;9uK>c_~T;T0-e~Ze>VIj?}45nQxKQG zE=PtblqyYC1Vj>|&%7O4UXHapM9O$zYo_}DV2VOZZv*08IUIXo4h9vI)(*b!91Z-%=r(Afc+?VK$v3LZ=e<$-7*vAo*y*b{q%-4R#E6ULQuM zn9TIFe#2^fKdZ}Q=^e2;D%08y6cP{6e?{!^QRIuiUC zwA8R5hEO#?SV{I9w}C~$pOubclpA=dCnOpMCnPE5FU1@I3f{*2A4}wOXmyTUp9{?A z2)vMAi|KW$t{Sw%G4`C`5W0-1Q`u6I>n4cK58`&&?x=ER>tzJ6VcA}A(eZs-84$6E z4w-3d3=!Cb89-yUsBhjXFt`_!xAh|aOybv`0M-rtrVQjC0Lz_cV`E;R^l@1*=_BEq zb>a`!q0|;EI$0s(I@!}bT^5GM5toKt7`B2^RZGLb z^z?KHb_Q5sAq8RX+B<+nD5av8Ptz(S9Im1g$rS^K)G22LyU-LghC4~_A8Xstf4fAI z`_hBbaT9ZJ`IsCD%&g6B2?0ts9V~fM>8ugThXFTS#-lIqzi0!~V<8r0CnQ zh48~it+E*Pk#;G~9Y4@Mx80T+Pos!o1?9CI3R4(PPMCNC zTpN&-1Q+yL@D4O&ZWBA1!EQ@+0+~8V`gbbTJT?}Bqu20=D9Axa5EBQ0=j`J&5?^h1 zQfNv18Fi&Ly@iY}LPOJ5n?H^XWighjE~H_EsTO1MW^xn=R`l$)%(OH-)F(PoqOxZ; zHMX@Jc|cwJY0s!}y&zbmz>-^#dmixMJtI6v`Ew;rR(zwZq-AFXF%)MsE%&auG@xwE zVEQ~7d1a$*^0v{zc!}wWHT~g!J49W3_G3d|IJZb;iWA)Fcgp{iMwghg9n)hbkIOJ!(zLjp{+oPf0OQuQyA>lL3Oo!CmP-d0X6=Utv*B*VYz6 zBHW;6W)L(vFwWLS4oJ0iYcOh>LX~64R zOEZSqsT{11_3FZbdT=FtRp)`}m{K49@L^_>X1-gc@070khAIggY^ka_uMbc#TIn7~ zb~y*UCx^4fbnMGUsJ2Af<;ICkDGisTB_P%1?Zr`S+KCLhLw|kU z==zFxumGMb=o6y{&TG|<#p^TtDJbqgu#p1jh$PCz%57{zt&r~Ng;8AtWI^_edZLjB zAWP_v;I4M?Oa8z=$GEjDq?RDNc%(bbS^9BvN+4mFqdaaRRsyT==|<_VUM)B0o{xNXdMENiAcsTGPF7r&gA(gC{I{z zDW^8AeY`+TV^cidI3ho1I4-UN{4e+DD?6ZnxL*MgN`#3k8QwEpx@M9C=^pXe!7A>e zZD`wM1RaCB9+p+WoBU2}HY_`5>e2-s-8l!2 z#*z%5a;+Hs(2C-5oUv+F&S-zpRmW)U4Xw~}Xn5H-a&NZjGfl@_0X%U_U84~ZolK3zO~4b8&@vs5Go05 z1@E=N(AKeOCl&t(jC}S)8v>d{#jh&O7)QM?o&)8>ZTygyV60|%_qBRW962G&@51L( zEJg!79n6oeKN69S25_!FzLE5-Kz5rXjH)}3@_)knwQYg0b;~E%XC$|1vr=je^+%L@ z@wug=+)}@ZWb6j1l}Qy3a?>|aaZbSPhht5>YcB5(ZCSVT%_rMbUWYR~nLRAl^Zo{E zrjc4l%nnDVP|`MK)+54T+aB4eLJT|@Qu`#7$4Twoygza2AAOhfnosv#9 zjxHnIjd5r|Z{O91>+U)3m%zngbx=Z<@%n)4hU5`OESSQZKvhAQbD9_%hb{@Jz`wdM zapTXv<*aTZHlV)He&{&iCBPfg2*(BsfEH6cZQ~wVJYQNVvExll6$beR(&7vGM_!9L z;-Rqp9_d^cPqF@2|A2yVF(H26^Ss6A`PER?iH|VS%Q2s$#f~v1eqV1sK2UB=l z1Kr8K5Xc0X6WwhQd_Grt&aSp$Wad*nupJopJ0Q+C&xNxYYGXFpeQ~tKjefyB3KNTuAs5^@8%V=y|ch%n7) z@9!lM;Y8MhK39Dhy7;-JBBjM~Hy%HLl3sP6m_4B|%==@ritK#*gJN0ggYIc!d6rD> zhSn^nuiI4K`SlWrzy5l0^7ERzB6h;I+ulg__U!^=w=rkM?JgT^fH-H3(P`UxoK|@r z2;3?;6fGV;HB7T}T}ds z?eyS{gK+~LZd_=B$&Jvn=Z?G62FFF{8w2Zp{cQOfTHFWmrDIJXB8 zAH<~Kq3Y;EU6|Pj%EiAAB^P}`-h@ssYcVjB z5RnQCpbseR=|Q2w3Bw)^>9F1jtLr+qqh4d^kHfi@kW3ibibFmPD_}ydU>j2}3~YdI zPk?SJ5z?A%St(VegC=T?LeMnQT|^7~ z#@@Yp5g93V+N4@KV&3oFZL?j&>Fx0yp{Rv;JdB-pYluro`cBZ?sq0t0W6b^BNNAy< ztwMTQg91^eG67i$?OXGyzFQ9%`J;jUfDT1h!Ac&{aNQRp`7`e3{Kt3EsWP)9ZJAD4 zrk1F#WRXo+I_+G?d$FPEsPPu9-ypN=y#sW)B*~M!ES9CO-;{j0 z9&JKK+X!)ylf)t1;gh8u%OWR@)71Y$dhQ|A|0cx3W?6$EZI-G7gPZlx11!qbK)bis z)AY0iO2=d)X8NxK<_PqwXx$&Q$DN6PA!*hLT!8Db4{<Z{;@W5d(5~dWcZ>^4q0kUQmRC) zZRx>2OKLAE99a7@^rNBH65od!2WbB+^S2zatL;*=70S16YUATrY~qVCaSD}cfebCf zBYd$bPDfZhwz4O7M+}x(hZ2azE1xY#)Bp?`2-w1wus+YRFqcurBV4*`68ue z4G}503fdGEjhKSPh9r{}O-sHDimzVw=_%Gwy`^tdD)fMJ`w^2ezO?y#SZ^R-%{*`# zrC%#i5}Xu9Cm3mO|5+4q@@R{Z*9G2zjVFapQ{8l$_>X>Qj|sI2@|0xnH!v+7;g~LI z9Nry!p}tWc+?UHo1BQzMzk`d3ZeQ58Y7f$^EcE#Vi8>(4yPV5fn`R9Z#}?t()YLmF zx_$<6tMy)bGfJ$S_~hDl)4x8UeIMM$oH#hU8^Hm7UmqPYc&z^*#jeR>+@|**4=VEw z8V9~?9SW?!_+PaWz0on$$FTN`a@taNwVPCx=^=;Aq%q7d=2)p2w|JiZT6nvT{Lgut zv931meE#i*b+#d1`{eAUgj&$V-y|m|uda|-zUnVU_-VLHDE_0Tf8&JUoLVriQs~cV zo1=kH4$ur`jE*)qn5sd-65;1=g=>Nmf31*ypH*W-S+>a!me_Df=~O%M$VE%h{tuE@ zS$Mmhb`h1jHETm2c~kJIY2sh^I1C~~POlq_OVO;|Ux|HNcYEx0NsH-7dm5CxC!LVwT!L*E8YJ0AaT<0Ct0PS<(_4xNZ=9Ix z|9@wU`Tv|T$(oQGvo#7aF$3|gx5w@2wS}X>JC);yb&Dc0>Lp2qXoaFZ_+`TU^1=O% z*CVLTUMcoaXd8KU;hu@(^H{KvS00TL9DSm|pmwicXHdKWJqzPC_eGtmcJGt-A2&ub zAC%rN@|sl7UgtwYpU;6@IAAC)vBHKl2#$w}aj$n^12b$q#l$h0m%LbnwhpadF<_&9 zHQZY8->2RA_SSHXc(PO~?e>ZbLI>a~x~#Ei+my0sfOs_FR+**N%WiW$;w|AcN(#|s zGHnJ6?wX|0L`Is;XS+Kf{sMx$)BU)#l5d|FQ4EqB6qMk&F-R2jj4i+(`1MKP{0Dbd z1}c&kil=gm;ax4}Ul0`(ARh(JgA(%Z=+Rl}{-|q`gzc2rX2cAs7e%vXTJnxr4X;uo zixDQbBZPF*i;NWN}l;!`d2k}vZjS7^jZ=oa(RD#2EAyUH_3 znH{hyK;IL03oPWX5@G0rw_-HU>$JW*tp3vxj4%pLT--jvont>c|VGf~qrsf_D{`HigrF zNIlk|N8n-!)wCW$)wBXub9(~VFW%`TqUS)CApc5lTc();Eh7uHUVa@af&9THBSdpo z_!GblWfyEvG>)64#PTKc@@{9j2U%4W^rG&=_!Aidg3KX|<(^r5{F{)ypNu(_(VNP( zFT2{;mT2P99PyK34EA91^qmGtJqk!hvm#77%)I3M-cSb7>TG|;^!i)AsSqG^OzWSUP$ z#vu6oWPas;2kPJFB$yjjgx&N6vXC{TJjr-@;+Ri3>oO8=dt#lWbc%XZRhR|W1c!$c zp!Y!%&obPhMtJiQRA2kkSws^JaOA$qb%Jx-s9g?ysdRjcbyMzWqq2fqmA_+zJ7X5~ zK1^pj#tESrmzptlxqX<>CMMFmXJ8}(_R|N^WaseYloB%lIDs{K;Rq~q{8I+mp%~yY z4ero6vl$+444R+L4Sw&CVte$eCGHsoyVuHdo_!P42Yo0$s-6pph05DmNdbUVLLR5bSiP+i|8tlKtfzCO_ma`}TU8ZGd%gk8<75-?Y*xg^ zH7BN-Vwyn6(CRn9;)Z4}cJZOdZW*!|y9MFb8CTEXo$0QDuC%7*RsCH5hnp2^<*Zxc`Z~bx6{00as*|Ay8Kmo8A^w!OnW|7VlLqQ>Q z@Wd5lst(k)Xg#>mC5;+bic~Y{h)DBT4@D4I`p|K1D&2pG-`NX?ci+=Xn)_(fw@FJ&l`<&kN38G*lGYY+HzEfcFnQmo#TP? z&RU&*5o>CE*vIy5XBDz(2i?c7z5f$0euHZiqHn5ryh&c^zQts8KB{88-r`ZY_Vdrx zCq{xqH~e$~5*O-`?PC>z?jX&_Q~wmUC3ZCF$6u~)1+fel)_9A$Gkh%d4Lq}pBzBs+ zZBQ@A35x&q(|3LNFUd&h)vv8uxOu)@dYtZDI9hAxIPQ!b{Nkf3|2f$L!z_|q4@x%a zo7njBNCweWsRn<8M1xbKHXY%8pTH~pIiTY6J-$2&%Oj;f6#qGygo(f=Ms}j^C(UiG z$Iuww7qu!cns*gDfMu)h!g56*fVHn^>_LtMQ*Xy4Sev;u1t=$>2UD2|`L(h|k6EHx zGz&g{`BAsQBvLmr+QX(YiBt7^Gvx&ZD>EF>%BM=jNEE9hWFDRKNZi}_rLji$u>*!@)0 zRMH5=@Gu=jUFgh^+Xw|SpNT4iirYDOD}F?l$ZzX!8(@*MfghrZ4Tw$Tq_Uw_Q$&C{ z*hqO2D?6O-cM{UX3yte>0tjaxYtj@=T(7^v1AAt@j-;{}KmScm5c9d) z9?a|VJWP%$pV2bp(54nxZ3oH90+dm$z3UVV3pN z<=w$OvTwLg3N>-k0A2Ixrwhx0jUyH524IP+%!yl(R=o9DFe=kcuRZ?(sGDWs_k6i3 zr0uk2mdAm(BBvYQ>j%-0;uD?X4*Q@Zrf(ChC{AMILX+YrtE`vw5#vh4Q+fDpMBJ|y3S33(Sl;VX@l0hKDBo5 zB9@+1vemb^ z8gj!q$*UE8hTy(CHbmVJZIpB!P}*yEk7rU>;8}A528c%QEAV}N>Y1eNSruVtHf?)m zrw(r08VZ!JOw=p?W>b6!Kv&uS3R9OPR*(NtVq2EXl4Be_X5c`&R;S8&XXKCUkZ>l= z6!IK?lXN*=WvYOYL^gE+eXTU4tdYKSe?EATw}{BQ@}9|KWMgVaG@&Z5`OC^Q@Sj22 zL=Oo%!}NnJz0u-jN2E7b!`v~4d#%DXy`L{|*xxP#{?DW8X6_y1XHz9j)m$>(3(s$U zqzX(mwKlNZ9Vm}tx)kRUqQZhi`dQS{k7%NoXcu6ONXoCvkC8TD@+DNd;KPKGJc^bU z3?anc4gTT^C51CNPPoyZ7lQ(n6tk!)e)@p)*=u~icKS;d( zMx*a)Ur#fqyJ8P}5Xja4IpM7@ z=ziQJvWOqX_3uz*Yc<1;5;k^>A{@y zz4|hr1z^iQD)|;kWsiFRByg;JHN3>r$UI!VWrzIAmFJs_-e_5Kq|7X8dRqgyXh=uj zO4O)OfZ)&Sb~%#H07v9&?ZF!tCr_CERHXQ*G;O&v3~6lPCc8qr%bZ%!9SH#!e4+ z-l&zX1;>TkPJjUexOMbqMY%pf;fI0F%R}@e?$o4SN9K>hPqm%v>6BOf?GO<0c~1GG!9syG84;&|SOM$j{Hf1={nKdKq3|@e+s(lF z{~jYRB}A}SA|pIuo8H9r>)GM&vzPS$f{U&tzZwUuJ7zTwxxa|&07>WVns7f7zBFoh zsxTc%x3iUzH+c{h#EL4uN^*kb(k3 zm)SZ>2LJ>nUPNnR?pvj`=H~H{|H9Hv8h+40rWABv<3k;4MiQm1kw-T(fV8o#wP^8F z`bI}NddK7T5**Vo$_-D9t&MJvbpGnMMcH)5QDW9$bPSFye(IF8k!@>f>m22IF%-|#+KhQiL+lDYTm>6Q1n_2kxXO3J~g=GL5@!Jy9nMf&9QGjH zE|Yl_l#??sdIY9+ZKYL8;M=G_yXUFwz_xB*BRR#9?Of$^Jhh7HzO=R0H{dx;a?*Fu z9nV z@teM0oPD=?n@%A@3iCxVMGyPu->TlfGc<;7o=rmsA_ze;)1v{k(Y?!1Oa+Aeb_4{9 zA`IsL38$lresUJqwYedY|&2qcQ#Ni>4 za-Da@p+3L}%rG_)p|3j-Rf5GS$Rd&c2>Jfid81B(FjY#r&6bU@wIP|2hbu|DFTN%|!l z6h=}YXvLW{26K^C_v6I3v)p;pGSXlWlu z4LH;#xVzc|D`gH>*#=K z@vhl^cIy1w`-H@R<9D7Y%9Ab*J!lwD&L{!r*f(qRM@W1%)zoQ_5cl|X@RVe}c5l^r zwl2koz_ay39iu0UgI1zfI)NtkvV;)z(80S`d!Jvcd&Aj>KL^o>5>7%$^!;mPUCe<}*O=UYVN!kQL7P>}gFtOZ) z?U1>glHy1} zdl8E6BxH*<5C^is8V`t8uQ2WRwGGYi(UVSV293qJ?7K8vy*khXV#?-mdp^q4;xPsI zvkQ}8oeQx1+Y+`*>a~UNg&81JM5z8MWswXK-HO4Km5wafrr#>PORZZFW1?jG>hFO} zf31>yu9aIS4Q^8^D^411)ia>T$niB@$SQs}ob-7p*wgfX<6}K)*#9Cj0J}UFLKOOGt^BRr?}*DwwlS({$Bzo;g= z-Lmn9d0$scxscop@{Dwx36&*Cj^K`PDYTF)?*khe)~v{J#c>*KIbfKU!igL+k8MPhGILD0_U}2*B;g=3HPT(ATvX%4H z@~<7s`A~(@tW_YA6L-!AEd;*7#i*nxg^91}EJ_@u1{Q%y0E*PvpH5h*;E)fYT24%8 z5r|X7p#wI5WD08u}iCbrc5ISc*gYh)s_7ad06fhXwG1E=S~wUv5MM)4Gkc?K1W^ei5k0;7I*$6FTd@!0AtJ`cVwmP_*6(YP0x)XjL5%SOdPQ ziCA+>YnAK+&Zn8`LE{IAC+B_Im+fUfSW_x1XTRB>?kmgXich@qwp!C!b6YYK5qBN_k;h(D}8>6r>=ZZ5jxmCSoNdtSlw|3T-8 z&ENb>01pq3CLZ@Q4(6J$-ik~rz;g;jWsRdjwg7T{1ubC>l$>y^zL=GQGTaAQs&R%LkJokn|$ zraJ!8vPwaMwdI7M$JbuNWdodqq3&ui{1p0(`ArLK{~4H^i5 z0z`rPDD#n5k;iV|vm`g`#>!E~mQ{*RP=@S(iG}tMtN{iDpaOGV_5X><*?Zl&8hsgL zI0{`W(;X|D;d2Eq;DYD%80DEn5~^;x3WoGHP(iGrH2KG@?$Xk*I%9wX9P)Q_6QS_z zNvd%0)>?M7*FVhCtWeg=RFRjRds&0w6qSSWOO5=#oDCp$Vaj<%plAP7D53QGLi2YG zTr+76%%ySfaLF0TyD5up#PlTOht2_F+Z7nyaImogC1H*$hZe}- zJ8cnvY>vizw6$B~nwtHS2P)W_EJgqxC@O5nkpR9A1D%xdy&Mf#kTWgr_lrUEW#rqQ z&i!*}f(apCRJ^Hv9KgXO6H#3&u@0n{!|4J&s<<)4`){iH*<(Q^b;vz^F#oSb9d90gkL`chQhO>kL{4&Zh^)_ z=`$l07ez7jb&=6*(0CC|n1ZKc84MV*ZgSib-VaV1Q{)N0MGjx`1mVxd*(L6L2HVo_ zd0`^g+^E-V;na&h91c=;zrNj{znwb?M2=qB?F=usYLx5^Czs^IE^N%`y1?gpzNvxy zT0+tZwvwi>->xX;=s%Nj0Gk&VQ+m~SeWYl!HjIfoU5)Uj03%&wxKF={8LSKhyM0g( z5^{Q5Pc=4+C3vdeWsLUf#T(qxZd{7VB1d(`a7j=JDj;W_Dq5;$6k<_ZujQ^>dQ?cf zASwtS0t86`M6*YHEOMB=;fa6hi+&E59y2l*&melPWuTiFEASxEesJ?X@LL{Z)QRC& zy)6=YV_FEaKV_kIRr#XPpPI_tq*OlJF}CKg-l06*mIfD!V((z=wBW5L`-><+OnJ=_ zqx#!?o597vE@6WYMenZ6?_X-IpALj3|I!KH%nhcl#+NvRt}m!8i*f`}+X5$6@1(xx zKG_-+j5G-|cQaX=k`n5DZmZ?cgMNem7@|a*`TsHXPVsd(U)b-?jvL#yZ99$KG`4ML z$Bo-Kjm;g~PJ_m_-Pk<&o%8Nzp*3V*0%(8RgF2 z{rTgqIBwGBM0?!@r&peD)moggqD=XabV{3io>vKjzw++GBnZC5yW4QGz=>~)Bw#~g zR#e55`$M_j)t8Oabq8IfiH?XjUsU&Jt!mYMOJ$?$pAc3?g*1C(QEtJDw}t#KGG>Be z?ders?`01`@cDq4UI0i+giA*$nH&d(-Jf~daCu7TTWx~}`XXpxBmZF?zx=cWoH|KWmxUUILW{qk ziHZbNP#Rc?#X0hp7|(Lm)}mKpIm?|6IaVtmV=fu3e`7Phz*L`;-Iw&KFT(N-H5Ry}$ zu@|o`PE$8t2YlyRcYwZfK&7$+On8Ok)_eMy@KN+h2V#B(c~3IYd}%m{XSu`0p0feP z(108Fc9zH;C8h2uu=<4Z=^hL5@>M%fenH;tVl09CrO}qn?oLeKs|~w@aDhpC zu_vT~Fz6s9&;GNxV`-5M59CTel!O}r*|Oh55V^mN?%CB5PLLB2zG}G9^WHy<>PMKY zATuBZNLwC2rWfD5H7ZBV#!Bf-Pymh((PeHtF91qorNRFVWHfOTi>0cW6k?X!gv!yQ zw(tHk5`E0VHgPl_gI+@)8@t3FCI(=`$rSq27$evcl@23nlZ(n~(;0^bQw`M~eBmS# z{}zgI$bC73GP!m5aqs@RHGC+x%ZK}7WDp!Wa_h5Mm9)Y%?x2Rn0yUz z+ezOn&8pA&nYjiXi;X((i7^fhsNu~diR=Dk&S1o!3-j8ZSlIfrYg#I0=Sve<+0U$v zAphag>er5yUd%>m7Bdaf!3b3$rRH1!aN8rJGE!n-BJ^1Oq>dqDO*GBS{WPLWa7)n-@$^xl9}W)B-C+L0j6FXo(qGl(D1AF#tfJt zGTk}E;RzdqI?v_O`x>({_N@<3PYsUkGs;n(cwP@g-(j99R-r)3Dx6wN2iRxur`Ja6}L-Su< zVcL=)kXJxupcSOof=l#RhT9Ajeh=nVrXo;@8g0`0H}I2slG#~BY+En0Dxi>d3l#WX^#RDTEbGi=J{7ExM8Rs`R0fGD=)kpcI) z4u$wq@9A_16&ru~K4$#MED8KfN=khTuB-=eT*!YKQEqXm>p(IuOgJcjb}W0yC`2rC z_RJAwoiu*5bYTA4$?bY56$p!T$rgP!pp`>YK*H{L8dQRRQ4M2MmYSxewIkL#ywo2! zJ!hleA+1}d6z>8q{m_!AL?7*P%1KDW^h*U&nKOKI7Ro*KTZIjqAgPVxL>PH)OKjG9 zp{Y0meR2LZk2w|mJ){G=j3>*zr_y;+IN%aD@Udibr+@R6*e3wc%R!qX;iZpEFjOD)Z&#LuS38m4&7iuXhDC zmE=9xq=mp(81|pr{`3&4Gr;Hk-Kz=B_FG(u+pf{wB+&2d_HO$ASVSv>CXk6*mn1QB z9iohHMDD@tUVv(#5U#-hzLAeeafpI0tOn88ZVj%+XwI(obA%r!qVzLsc|PD(Hc#bi zFjs)-G_Qdb6&5By2iW8=Wfcuir@+=X(nyr4vpRHqXUZ#VFdQn4iwBH>_#PBhqzkEy zc|&CG&+^^%B~IRf8c?#4Ae0vSFg~r3_F%%9c^CNDT2)$mrfZ$9o#`gJ79eVpqr_qO z@*}WB->vJ{{}{$==RlG@)+0R#fD5L;c6tHeklhg5L83Vey}1h~+Q&HzxR1&p{mr?cS1Z!{Uhjw3eqIb7MqbLOCQtjhFd zpVlH2l!ftYmE~fH%DX7z``;w2Rj=&;*-tPVJ&?{ac`Qho#|v$g(M`ap3KpV(&1&<- z?VkJWZezzpEiG{rgOQISElFx$xYdv;sfxP3hp^? z61_eg$^v6{F$M!&!MLmC6X-kEcPONd@DZ=!9-}*7vIx*Gv(F2pELZ7yyiauLB1`5! zq{LUVVS*ugTdszoER9c3{@_RZbj8CO28N7%_HuV)i@7LVKX~#aC#1*F7U0fUxj$6CM#|C06y9pR^ogx;|HTQW^~ONy=s*M|_-j@& zS1+OeD$uC;oPlABE6{)gRzj{ZLEr;plSmDW)D0uj00qmKmY=ukjbnBX%Eujo*Ubep z=n8e=y!SUW6doL&6-I~4BzwhsN5LJJnU*g^k9`QXGva}=nNU2@(%;{`@{qoz#wa#2 zt*nkl$XsWAqAkT9aouTvJki~BFn1iwkU&XyI-$VJyVdEOegKaLSucFRM;L6#?T3Ok-7E>JMr7~u zaB4Ign<|D+q`9Vh80`|lG_Ky7IpehMi31Zobl9K zf9H4ccx~iZjuTN}(VC=L^h5TyxhZzxkmo{NPM6=#t9*ChL9*vN?<${bvW4!;BX_nl z7|ZTfdoe=y&d+gy@t|*xi*0!v9cS>t=oKe3j|$eR@9Hp4vKq1hZqMVE+GobsISE7( zo@hI#R!E-1GD^GZ6UKl+Wz>{aA}F6!2F_!Yb?^JmN2`Yk@n{PXMklim3#l)!OG=1R zD4QL#Crc9y<)4f>^H((dr_n%u-EBVm>|gO;(|WPw257t$g_(){AF3S-%$Dy0082V0 z>R)ePz8lPYiqpU$<>)gI;M9h|x(jW{gB*@-&#GZ7*5UTBuTn`t>STD(IL!Ngf57CZ zA*iBy2;BHJ_>`D2+$}GIntpHFB}?shfWIB#22~QjLK8IQrd|K8EP0B{x41}?(kDei zAtG|(4&mZ{20jwY>A&fMzd6Ngt*0rZj=?z<%YMZw1G z6(~xAO!ddoMNJtmg;(i_aPNwg(9RTU55w8u59bNIA`G~kwRGM|hi6<5;&x@V(V*}Y z+;qoB;NBwy|BA9#zZAo<|3kOi2~uWW3n_AXu0dRY@mTH|=Q<05VL=?95nY6l*3}+E z9m3LyqnD*(jWD4rxqDtHYoE=!AyM|6_-I<;zk&E0w@%5G#qsqmY4-4=tq+k7%3`)` zS!c6>rrDE~AXaQ4IA%8`cl6HK7I%S_aEb+uFzb888%$Pcs8drlVh=tnqHVYh9Dxne zu;nRlV{J&H?dlTY-x_KfTwQpV?0L}?QE|~eRVLitsSPsST4UJH<0Sz@Q?xBd-k4AB z4D7U?xeRmYa=r#-vJawuYGfwdL_YoI5O~@bb+pI8_aeuA1TQ+ay~;{p#y9%Tqy?Kq zBruq9b8|poFZDh0*QD^D-J*Mr^)|_ubR~o9v{hquyNYdodhuKu7CMuOH=Cln{Ir8n zysGs!HpIibb>+7yLzX`~EYt+I^YR9cn3ktq{3ozp?N7%LdJ@Hg)BZ{l3Hgql0&bB3 z(MO|fH+y(-I*nZ?t=bgO(Ea5ef+kfDIeWt{d>+fLf10hFmOEiv_`;3+ID;{98L=bo z_M8kz9Pxb#dn989dkO^pr-Iy$0*(SALjMW%TCnK|cX?V|WK@WBxb7zg3VOLcAk9T% z=&_WnF&0&&_HlCkQX?hvYPC}6zkc1`g|!@6S+3nJ!Jc=scjU}s>Vd_+#nfsW|70ttCk15FUVhWj70$LpAN27s0Ev6Sk<$qdUCH!ycSe$)5 zQ|*eW#9Fi*XJXfN6Mp~VRx~&2&q#g{l+w!~ZBn~3y2_DY#Y0dyIHBHp(71O2C~ey6 z39`-c3m*%7MumMK4zh)>3C%Tw#f0gCbSEcJ zFa0k^m!2*!boVH^%OG<3`*#a^R#$|T$So}co^3*aFFOm8C+tv zdV^Q#53x=ZS&TnSar6+;JmVp3v&_%edM3EW^+Hg%#`{EBzy+vAJw7sgu^Kft|!U!C5yPRtW49((a>J+|n4CY4%%t&)jj2cAsQN z1S|v%Mp5i+Y)RgGkjDp+DXD^r*) zO{jn4Zrsj|ife+ARa3DT#9T^nvl_)fQnrs5LpU&c$^_dlc~P&h?sEdLvbQW1DzcJN za|p;snKNU3cB*40#b4#^&UU`Vrr|L8IdALmpz-yOrSD&*?Y3KVs&r`v=Z01Oc(912 zJ}FQ442i&;9M!*PMeF30{dK{rlSLWG+J7{7HBji*6qM`U zE;?i-{?;5@ExQy{82#b3QkeE9NWEYwt=a8f7r&b3rF0PoCC6;e47I4$zd_jZE1q-H z`~T}Hue*PL27r3XE^+oT9@@g9oM#3;{+;(c_ji8+9~eEPf2X3Zmy2qw1)-5L1<65> z8rh|zq>R}FK2)uAH>;8ecDTCM`R~{?y1$aa>xyjqb1Uly|CQv4wieo~R;Z_J8v4GD z?tMxMJ0TsgbV&n9fHK2wgBbtId;w#+s8`lWbiD^#U$76tKTmel+qerM56m)jMk@3&1bPmiTq`j4nxpc`VzSw;tU_WZJsf zKqrX3n;8Z9-bl&F0r{v+#E?bxX#&&fi*x8BWK4qYlm)y?1~E`m8i zl(nonxz4V1gk30{-mrfB&mwN^F~E0Hox>Hxx9`wLeY)gdEWg`8i1sks5N>qF%Ll%r zlDxnBGkT(kSr8?c2!a|Xt~uwZ+Bt;^m?d$?NDWycdlP%DDu>i~KBbAa05W)7`ABE3 zK1t00ZQuDt0U3-dEBm@>*AM>70;Dy{GlnH50@x*ZNmQK>(S`h4?B7h<^j2iGLG3DD zp;WjflU3W`oSZ?FfOkfNkEa`4N9&q3SOg?$jAa8xK5S!?P zsA^6C_CY=m0b>{7;-HpcXk_^ivGt0`O#5p0gVCGSDsxO%MX~!ts3c{C8J`|GY@Hy& zV{g=uU)&GxyBO@9DiA!JvFng{4{}Y2+Zgs&uxtN6TDj7Qm_h&n_f8~()KU?eCVF8Y3Bds6M_RaS7ysMSb;pD*{ zOfT}wefFpw1mQZ9&#$*;i>fS-PMPa}3gZLFzNe6IAw6`1-N5d?=dcLgE_2e({T;(T zUR{Ci`O&o(nodnxpZ;Dm|y;`0g&$lDN9J`9B(&9g!Mt4yD$3hOQ z|D5*Sq(ci{uFCKU5FC3k0MMF_*7?sM^ z{)s#_ewASGHBHBxZ_!uhVp5gt3WSUEED@^O=7-T*Qax*LIod|In)$dVhLAO`M=QR3p^UPGEmanK zi;2`* z$PcfNk|7)JJiP7LDm&=gtVQ5I;uTm8ZPZGF--N<=o{nn+sTYA!1gX`#?^!ar`#^~gni@n#_mHA#fPlOd9bB?Tnrv9D2JQ$e9;?wh zo1-Xi_9nm!Y6F^}oS#reanvWYOI#y`!d))6$cQx!7e-V<6f#=T6+?~4sE)7q>4v~- zzjM~>g=Atk{ad{8OA>$qCK1v#eMukyV;*;|0{1Y($GFhjWjJ&yOvwb&YbDRkooZUrF*OwW!bs5(y`k!a|pkIkkeC2z*;J)_8V z=mAs30WLu^Za|268<=>0M4yM{+yQ>5+1C9o6ichMi}h)3aRR5Yukk5f!q<}<{`yPg zSXn$-i9VchMxn>3cZ&x7_Xt-AT;I+t>oZsgoA1{rPo_EB(LENZ)u$ zv>*6k$QlkBpEj-^T{i4ai-=|=;hyZR=Ke2#t{eXIXV}FLRu-tQMWPKO#e7mtd~E0* za!~_zlBJZ8O+leyKS892l?obA7GgJ4l*<-PX_Ly#IMKUyYn-(v4GQGTzA@w z^6<8_YMW|6rhJ2)UcCgU1OPoS=`!cChxvN;iVa-a*A&D}Y5w=Hyd$XTSsWTHj{HT} zC6KL9#3qZDf?WVBP(jcMk6JF0oo2agk`Vj)?(hb^k}0%6Hy3dZN$-buV=CGUE}v-( zLYombGqL3-Gqd;9#}Iw*G!B$+s8V-NMdB%!8O4vZz*t)uW|nR}%hVvMZ<$^p+NUdL zp_Tv3HVHQ=sQ6bGFis~|B`w;nQYG&TIJK^csxZN~hx^_;%9u}$87jKiY(As?58chL zkL4YKL0dNUbw=1|g9@RSKDY%qy_eT78y}P1gJ4_FnkCDg&kBN-Mguf0oKAgqbIxwm z3iyxl)1>o0qJ$Eyz?!v2V{?xmmKm!JzBJ2v~lAY5sCjJDO*tn@8l-%p8?aI(5W z>gfFRzyx4JNrVoMg`;qeUttVC6w?^C@C!WcTnq~w1~M%u85EA(`|O?AN-Ifv?-Hq^z*J zbq7DT@GKF^Sft3sq`EGp+JF?` zQ_4q*Ds$pWUj@1Qt4)Ar#;?7S@f36wdVhSk2$yh9Bqp0 z57UduHY&b2PO(c2O%Bg)-7^GoR5Um!ZW9^|y}E=}4G+zSJvWi@il;6C$K@M2vUT{ZbZt=qGIwoJ(6ttqB44U<_EQXRO+FLRO zMAn}P3v!5fdE@j6+V=}DQo179uAH?*Y1uo2)qTRkK||)}dUsQQ86p4N8&f?ArF*>< z!*euLyBr~TghAsiBPop93Cvj{N&M4&h`A_ zGmC*&U^EX*FjN8>Cs;<4B>jYMDkHRd4CD6uhWd%PN+89&*x9b{Z(+b7X#C8dUIMja z{R1wlIzj1;^Y*>I3!QCl3_Awi6TDu}^RNXv!Nn7CZWK5htVDek3HPJL2e4u>kJD-p zu-&IubH6DX-GqY59NFv%6f&^EHsQe z5-S9Zd-zaeA_#Ll3ieD>4rxe2tV`v85?d{jouoISd>v8HFPJs+Q!c12f{>ypAEtLH zG@wTF6K!hVkdXa!+K2G0T!)W- zv`&ECsCZ>9;+xE3&Y1IlDhLVVc4Z7$XhkBOEb1*>DW-^#uQ6hgRlcn6A3)YIMi+br z&N|ei>I+i3tpV&=Wbt%!OmB5TOEWF^S*R=m>rRi8Q)<3P7_ZnqCr|vmF;Hd2#4`F; z%d>AN<67lX|23T70a$3y*q`v-Q9>tz8wq9};GP`dT~CXz?vVgDZv7D3(f-pFAf;la z!_;Q+@!mTz-FvUpjF{NunifaBN?Q=aKKkGC^XlK0Jo#}=!O}q2rUBDoNxw_iK3^L= z1laU3O{sP9@8(E7Z6|pffYZncF@P^;QmbMfIi#3yIjk!r$HCv=WDA#2oG0?F9BDlY z-@=RUQq~YWf|eN|NOiFmKETlYN~OHNpGqrWS6=A32n0Cn2nmTPLKw~Y!YxP6tU$Lp za?WCvZZl0vQEoB#!ddRt4A=+lalOeZ6pVJMCW>|hW+kS2q~4TW5<_^O8mlP;3A!qd z`E8MD6DZLHwL`kYZv3PQjM-i#u)+0sp=49{mO{$>h`~84Iu6@21Dk~0>DEyq_ zA|d-!@qXGVg{7!Gl3b9As-#9Q56D4t0_&s(A{5JYt5H|53T~<+X+x#N)kME0$y{=0 z3hB>ATjAvVzHWXrX_V2nsc@SwY|iTmQ^(UR&*iCMM{MT^=IT2qzMRh>DuykMDvV3A z8pO;sUXlpgJserCrP4;LEOBHU9LJ)O?TpDxLmDUicoFTYM8P>%stdYl7L{_-i1bKA z5s$3T@xndrJ_D6fBtrvijZv_v^eMmH4Q!gLs8dhbn84#|pcgXB+r0aka2s@YBh(S< z$e?Dk4gwFo+iX*lqI3+roBS!zZYA!jg%e!Nei^|Ex7<`@j5O5)->~&(OPJgZ!gwAs znpj)1g?Nkj=v#~fUTr3aLts;nj3>_3bV=0&i@yJLfBjrr7Lc z(G)V~Yw7HK!KtL!RJ*RkW~nq;Ll$dj_spAo zOfUBlQzwqbvEzz(ZQS#7J1@PbGJ_vZ^6M3^D3!iz7~8Bb zhz;9JYX_O6n-Hc-oR=TElS@LFwLZ5S3_(9GVlqv&(#iCv+oqM+1or-(1Ka6){aYQXqC>*2qAyhfn<56iphCQlSAwwP2QrA+|__$Q zLO7DH7v}f<7m(@}yE_@1PPTI7LGzmriLz)u7tsmmKu+%22 zlHp3P{Kq+b$K}6ar<>DMw)UwW#T3%T(Fj&j-g0!Q9OugFdPq{dJ%e(H~ zm9aeT8mB$l_*Pnnt3;}B)u9_;DQcR9B4rq@Sww%UKmI^lt$+3tLpu8{yVd`_HZ_1v z$o~!2!R5SU?L0s>;B?9U4L+px=Wpdd*qJ3u4P}!9OF@6~>_MH&m}6kPgE8U?T+}wW z$(|I)8jf^hPxk)SW#S3De>>xD1Okb8#a67bp~bMMxI!iefu6{hwDwD45v%M6Mbvwt zi+t3RdD|_NPP_f<>f%~bJ2i#X0Ja6QK1Z+@B95~!1mZ8pMVk$9b zH1ed!A6%JQ@gajO!UvA0x!=J3{TB8GCE#F5#)Q4*(l6 z^|bU^QSMN~P7}#Emf|q(SW96gP&-Y?bNEh+$*B+5#D*IyOrp;!$tO9*HKR8^aCned zxnq(e^}hhTn;i~LjC^1g{+)UrJ^4$UHHTdf3p?9ZM>A0@+I5G-~3{A$6iYB3wdhB+fR%x zJros4-uRuo(;o5W%c&uipjHz`_!gb?1hea3fhfE4&oxiY{3rpslSa^`izbBlaXLMA z!thg?M$KK+;YD^b=67!9FuZ^@iYnkU^lpgf#^B`pKG#~iKU@?CfS6P%0#m%n0qETe z{OKHa#_de%B5IWPT{dVY_?PRY}gV}#h5WX$eZI92VogMm7E=XlixHO(2Q8$11gBg?-4_R;4a zQVy9$&zIX_@dTx1TV zFEdl`P1V8rghxlBr&Cang9cwV(0T=|E3Qdgau{-x?=P)_w2p8ojmp)AwQ7`4Xg0WV zY5gUKn1kgrlJmkpl!O`hvCQL(rzeN!Deq9Bw&y$h|iN>KJSqFHlA(ZXeayaorQI9DYSZqAEZW~}B zP_D3%M{uNTINDD1xI9N(zxuemX+H3DZ2p>FKQMn>H^3{lw7gNEBlpksnpl~$`)ZfZ zT^cygq&h~IviTiC(N6bOS4asA*RNVR@f7iL1c z54l1oDSHs3mBG@sdOVbUWfj*`6H5%m&8K)yKqXJGge~OOXW1WDrUfXS;mQ^ zCnyMYu$Dc@8s3X(qr)c6lA&ZYm6ma<5NKf5v&QfG^ta2WV@Cum_X#m~3E;$=HLUUA zg4Ax7Miga$F)tI~LgX^8t)|~w8*q%t+qt9P{MzC;60+q=xZJLoQ=w1kn)Z99A<5FZ z@HurcyL!~f3d&M6T>&=&|55WfjKyH3-0QmS7yl$|5nX9Tcu7<1vxF=H-^0bmpp0W@ zeDkIk3Q3^TPvq&oCdQ+huMFvV6XpZfrKs9NaevtQM96#U1wIfO zJf3rSoh>8eenpuA#!zjche^e#+Qj8%UlH=L>Hk!PjQR9K>-Rp1mDm=;d^o zy%%8B)`$N50G@;k_jy9BLEnynU_Dd4E<7Vz9*n|{=OSdP41`+l)_69AeV>MutvsG- z=FU4IMcPT0?gEj09Wa#5=y8B)giBHY%x%K{#Qwsor7T6~?OW@!2@flIT|2A$Gp z3ux06O(fDg&SOR1D>JG;E-~albPC@pf{EG?GtZ{Xd&-nC3d+Dq%|`7m&k(k zg1Ti-OA}(300LzYxRK9`vQ(;T8);)>D^NiXTeB)5gCzcHF<0FsXcL(Ki=&0VQ1HgV z8N>YiPFp6pP`&&LwiVO-vt3UUoC*ax#fO%qt=J+yghKI$&wt(B~-b|9f_g(%P~E+YIsPdK8W*Oh~@2FPM;^0Z?Vk zzXM>UQES+wNr%kFy*4E;^hxtZUd4&qj*I5Vq)Eh`{7LA1I>|mx@U*gfn5eqexQRlg zPm)i6A>t3-+-^U2`aAjOlBBLanXd$gA9(wB$D`(sh&|fESKW!8PB#!Mu7Zk@O0R(T zPC&PIfWaO7+&`d+?8cO;pl4+CFFWUcphm@n#%&oZv2ETD@BW1jY|`q9Hg9Q#%LqFW zy>1T9J?`hS-&0M6BXeHjsV$_JpF+=ehM{gSj+hA|%@So0^PH60ENY>xQ`GQk1m)Y5_(lmwhwtMap}D1UX|c?O|0Q0)O@ZN72+ziF@4D%u11!_=7u27k(+ydfrQ9*@W2}(N?Z5ft ztZ78Y1R{pebW)G71tBrTi)m~BNG!`$t}Zh5NDQt{FT@u!NVl7&NX+fw0fHd4NF{+v zTo2RRs4`?**YoOLC(AdF_kmvMEFb^Wb4Lg-U0DwR{1BGpCP~*S4p?_THJtPy1lHwp znpoyQbMTEi10Y!og*v|p=roRhtmLr_`cT#6JM84legg`uIEqhU~)d3&WAJYIE6wO@QwBGaLVvN z0Di|tB%{5O1)esoz*zIg<9o8UauLYd48bT2Kc?jy2{IyL1FiZOzH50}RS6VGv_wEtUQIt9(&ap9g zr4C3=xV4R<5iskJezb?L3ALzgCG zZdmCT{Fj#~-HtKF_JQBTKQc>w0=zcCK{vQ9oY75lBgIH&Y{b6Y!IT@6)rY?E`5*^9KtU)(JcKY@2kO3fX zalY(~g9a>sRLxPkywAzugx48Ex)U;9mbyji0n4w-6M%HZGtv5zM0KH7T%6QlfAc?v z$9${O1}{&LnHt$B@szT5&`RTAlKhI6%rB=zg+GEfxv@ixW8)yK`j+ZmuJJ*@>>5}>H{ zviXI5+7ja*2#6$FCP{M@E@$7ip^!|OBVUy>bs`ra0>2Dz576nMcJpCLU~y|_Uf*w5 zWNpCnqkp#L_6W-11+oX+GZ%!0;q`Anm%r{ZJQKevoQta3h$sc0s4`9TsirL{LRKTl z7y6bel5amEZ7aXQ{}4)9ZsR@gVoR{MaV8E3DIYEpcPRtmhl+MCK)7-LxK~e1vUz;< zefVl-o?%SJFknBie)4Vq^zU8uTiU96H?o6EM5bY5p!ATSH!KuRt8=Y2jj?UpUu1a& zNaL|at8F%0cmb#Z?nauZP#9t)uFJD+ih{_{@GJl|NJ58I)xfMM6wM+Gv7^38)1u5) zI<|?_^Dy+Zkj4B=$<+H=u0-;R6oC*?x{%cR_dTsK<{67YEnrI&^XAC{`t$9fVeCW; z&{6$8`W)szWLA9NMHsa)TQID!L>9rA8rEzqSA!f1wRAf=bM)M|ZsFuoYMYL*ICKq% z7hg0!;M=xmBjNXCi3EqEtcd_{)ps*H&E0F1>orNUV;RM@%VwCgBDQbM`e_kBNm6e! zs(eZajH7?>6rlp~!vN{{^Qai74Xo6?D342H_d^O7-A-khGF!E?Z z%}8#HhZp3Z*~dgNo0*Pv_XzxoKtm^h18Fr69a@GP9lEDTmCLLQmxgL}(xVPkq+R!H zNWoNR%Zx6oT~?{+Li%Y~?tp*!Yfd0FbZjxC80obzXmdGyb>-{fcq@z#YwEg^vOUxw zz(Gf{8$h>M?4uARrp)GjV}?7iVnlh2fSuO;4aU?ZMQe(Iq#<86gv+ZXfSEux5^-rj z*Ab>#C|vGo)rGJ$yIKRLnvLDI91cloznORx7B*N0!b!I1(Vkt{*ST#O$Z-xhc`&s-~*22?F54{MZP6~hvYm- zS7v^J5a>D~W-SGsqF~Spwdv(tu1pH&3^kZ`k`VRHm@OELXOOYCoNGC{1W8AV&DS{i z$0_MGk^+uRT5>t6OFVvRO{#k^ZM?YUwUNW?oZ#@PZ*#4OW3vl*NrnpxfDW?1hv?3v^9uWv>WAvhlwRM0S4Gr25QxT-2S>$>@5hnno!tiym4?5 z5bIsTA-*y3!aBx*N`eBP86Xdjvz}F5kEz}KcS{^1*Couaf|q;!KkjjFEiL{Cz}`c- z40PGQ9GhY50hH0$oRKW56wOZ{c*wkz{1caYrR0<@^!a-xYZ=DpnCBzw2^-Zsb>cHS zd4sO^DYw^ZPK}`L-0>)x4Z6O-QGJ0~l`%Pv@aW*c$okw?m=q;E*4F3f%%@O$Pd5P(u73BsT+l1(x)bQ8_9lCm8GP;j{or~GM1SoY8oQiQHY7hK z)oR@7I4WCi4m?a}(&yauqlu?rxX;%>_B&etpxAg};CfKK#h3@qy*rEnJ9zI`EZ zi8k(X>r&vSc%UG?vPF18NHe*g*sqj5jwtG0@+{CvAMx);>NnShr!&CYwFwMF%B7R~4$~%w6w>gb zZNW_lv@`|fG+J3Oy*5BM+TX+d?PAaa2n*5DJOA@(u!oF?Czq)dk4Gi{GsRLW6YCSW zPp)n%-C?lk9+V~xmr<-s;hL;1`2!sRTX79jl>|1NVL>C6Z28(kR0(&%8} zz@;NSC#2VK(61wa9LSpATeio0eVFkVWx?NMntEtl)wt^w4eSsSlfoj-op5dkkba!3 z!H|%)P#hg8#8jkF4@BfSh-@PSz4@Vx4dJ7>>E%tp^Xfo(v;U>rA6DiDdA(c__M-;B zqzF5q3dlc{Hj@~a)A5sc5lQu=9T~A*_9vj!EHoi3wCH_I>jFql86mM7Mxx%yn<{#W z3hAa#7u=gCvA4I3X)^EyR6vZeHn={ueOo5v_pkNFYu_<@!1Mjxw#6x^=j{t4sAZwc~Ng~#CeSvOwrZM<8dX|gK{b<;Kb ze&lJRU4%uH$9sc~*X80zo5zgwB6tck#Z8QHZLMI55)ZYfrm!)A2^WM;QwyY}{5PW- zL?j=JM2#aZ{lmuS)D^Ujh(M=j8B|NAZAmtfCV1n5&QI+Olbr8^Bc9@ixY9l{%Q~og zgbmlxmC+YUHf?p& zjgY^Ck6|^sXTB_)+v2mcEc4|4eh7pMU%i%nIAzSdozWi6P%Twn2>w>_X`r=UNx3+I zA16xq81v&gs?ywZ%;8>I~t{IAuG z)n@kNc(OYjAKX08?7mLfe7k(Tz6|Q#Y+ral!-V7_w(5|W(BYSF>J7Dudh-y{Z8JQo)pktH0t*Sp6T!i5OW362KTmK3zok--$A z45>GZOJJMt42d@vE31KU24|&r{U=Lt%1&{sglWwU*n+K4N3@D-@a2r1O1Ua@q(yRs zlsL+MHAEbE#0!IotF1Azx*Yo(i~1|gD!uI!M_|3~E>57^`lXK-I}PlMU|0mqZ?6OT z`A=CkS*@4zhaGGA(6On1^9do^Tt9-3VUJfavJ*n?^)uF_Eo2>)eMy(M0| zsolLYBz~dhIMePN+bp^zM+&$7KIU}wkswdq^)!&3?(IZm2N7}$dqg~RC z#>xPhRve101d`etByyn15qjlcv@?)sD3;W1#{eb@h;IA3h-l4ko4o5TmFKF@P;dCJ z?%~!k93cwCur&?{e|e7*rHs&Kva_uzh@L=gIrC#Bk0xjn`gg8a^prRmd5wH_0iMn% zfQ7-RtdijeQ9+JOB{C5C!t?QV7CC3*Vyc}wv(xM8XvmeN%k$}~#9&?6_1*A~{TuS- zgXpa#>;dpgxib`R+Yp#K@$1DiR6!FcD2*0@Iw68Q4FC64_^1${~Az}{{&pDUH(z}@;k>D zlK1(O>UT@mi}UP`_v_cj3*xhEJwlTD(&voA*p= znc@abjT{I{ogkfMgiASHfjPHA5J~T{9S6nZ%yApoh?eQ3rbS#2kjn5vkPdwZI_qLi z%N6Df!L^Bz@VOKHX2PQLgH2@;onzLcOc&%=V7_I+Z(xpod1eXy_Z?>UGTmsvL>)4& z{33OAVR*su-LjiYy$Lt)d8?9(#f*NVREad%lp!Co3iuPHE03^)TCiOy%7mUoC`=C` zwk=4dH5fVxTFUVCtgv?q7hYIJZ!L7l0S?~-oJ3j%Z~}Os#SJQ~0A){MgCOB?6K0dY zOCqklJ`r#HJAZu|uk;O3v=!;fO((U!RD>n{_Speale1;iiTVRG7{^z_Xxe2@$rKt3 za6lZc+A5lJ37r;(GWJL^&!Nkqg=-|adw#}Hu>rPT{OtmPdyR7FeSuqWeo+vDUCO8# z8|yu@n{D7q-$$5^dyUE6wSGK8B0qN&JJ>^jTe7mT3muERjb$+TfnyK{smc~9`^KZG zZ25sV+(F?ba!N)79oP}658G(7;N_tNIo1-b1!W!GxSquBY8k_}vordg;&-e0BonjH z^`2z3;N$(`1M}t+S@Xl9-8oUy@JRD=b^#d+?BG{`?(Vxo!+M2I$~Q$Kt;^XEp*Fh% z{s*uMQy?7Fw@b|fAS8S20`*Ki*T(e9D7UT(D4zYR6#k~_+kRC(kiF(QSW>#Zuf$t- zhF(nwdW`~aHRaPrdYup_iP172H^+Eea=1|IAW*8n7(jv=$fy2L*=K`O?qo~v+c zfHSVo2XXcGm9%4HOIBK=MHM^G-2NH;OW^o*dGh=4C5cDTf_*y`%3b~H@Qo3K%*qSg zaea!=-yerHasevnnESDQr&6FbNU68ud$Bs^bL9>!KGAv$J2ZA^6n4A(Iw5qRBmY%| zluK#8+G~{L5$!-H7Do(*t6s*IhG*NQ>L<+-F;{%Ht)Tjb9rapzRs_AL9WHA#E|+|rmXFjEhYhM{X@^DDRZTY#mIL8 zd=U3=&|~AzyxXr^>;&3ossQi#=$o4gulh6iD?LF+?Wc0Q&$9Q6hLk2Ji!e#m(}O%) z4aM%aX6%U64%a+54aWwfJ9gWYLC|O$#6Xx%P}YTTSBi+sdK{+blKe9&7AD#n!^%1DBD{zx$G_*Hx(#Z;3vu`MHV%UohFZI=IDaC?S5GxO6~^djRv15pj@l7gr8B zp)q+X?GDC({Yx>a{T4L^Q=%t?ybQ;mlRP^bQ#1_`Au!6AP)fj2(r23#Mh-5HuiD8@ zPWOXAqM*rA|Msg^w`+QxqV0Xu^=g9Pa`&TMd@Nar_kvP{Jn9FH;j!E}{77l)OFjkc zWt&&y9c|bzvKrjQ<}y|0u)49|=wmTHMId-Y+9Cs$jo|c%#XaBQBifuxTrwz1-^b7> z)s+n*zcmOif!;{VFZQ?nj&2W^6Wd{jEIVh=A;;fQZ-{uyx~gGGLFsc)G%k?Cm6*|{ z8KhiGg^M!29NxLV3$Nk}4e%9s2k9d5Mn=?WMCCM4JRQ;xkNV@Wb(}}^3Zen zhM7t4X}cNVAr(%alt%g0*iYcv%S32x_^8nSKs-?b{->g%y%o$<0(YNa;$af|--0z1 z(Jn0!hQJ-B)Nbv+o|1mUR(e$~P1Z-7d@6%b$)Z$Ro{2D|0%H1M z>GvN>JSRJ(VBmHLoWAm8v zex?M3`EI^kqftSA!vW=S%VOI#U1ay#_dhe5{|suLjYmGE`LI4k7h{8q z^^)+$M;FER2FLq>_fpi0HlL?sn&_O%2SP*k^;Dx44n!ME%dhdn7-NpCB;a-PIV<0j z#)*wWvqR!$m#;QAUo{^0Bl&*d6Xv-oi*7u^heajDg=GKHDL#Uxw0ikKqhKQFCa4JC zP5|XYQHHUYvjYhI@KHr9rhjWxtfo;<=xi2BQTSo!Kp$p4QC`PLGpydFk?H`QAe2nD z8%*s;Nmr~x2MlU?_m#?MqU+feIGL}j2z~fS^{!D`4j3gIs+*>!TH;AjAo#Zobk$*Bs+MBV^_*8u8Z#WJ!n^&_B3uORd1FU^&%Evf@?08{sLI}TEb+|+FvI=PMzK$Crp4%KcLGBOF-4EuM88EeRq(&oUeNuLP z-QQ8joY*pENF{6#-_|T6zFHUo)BX*=I^=%SP2X1n9DF&w@W-lVZmGt6{ky{%^o1KW zA^JxJkNDDdYj-7jlMnBwTNdl8f7S9yPNT8~Ign-} z4|IY2&)#oK!dFFZG5>M9djJO8HwpefJ!$xVIGEu+#Yc~eX!7O*%)=sBZBF+=9)Z=Z zC5%57)WkkBcXOPvZHR=u2(g}3+C7S2=B&y=^8Y-+%{WvJWyR=9b^;+#JM{DZ-7TC; z;+tzcg<&^U{pUGZO~+p~>2S!=w{(GyMNDbSoPN!a>+vy50*zb?WH19e z-E0@Wb@>e;msB?R7Ygy81f(II`FdY0@ex>dyDvuzj=QO%)g2^ z$XN6iZlvO|Jq&f|Oi&eW4;>kUq5+F%d3h)m)>muc8rNq$6}v&Ux`T;D4^{QGfsezZ z%kGrmW&2$B;gB*a(&Rf(TV%)@cDX!L8UyE(4QXWPS!xojK+QS*`$CO@8E;(g122xY z2!If7G=La3oA{H}dAPnWQPdagYWG~+g1uUYbnx@P*VxZJ&n5+CCNI+LPFkvr)@CE#Ap@{(jaTuf zZ7viRNkS+=#_L~~sf@t9b~5_z9h zyh%JTY9^m3>>DLtO!606xcsTx5n7GQol2YLdlA0cygL&M)SibO!ml8Af;dOvyGFLkPY{<5eX-S>CW2qr6?tlmVbjW zC}_&c!H#_Mx0%fqh;xMDwd}Ol*90R7J6?6nZDX=f{uHQ9oD_T(mP9xyl~L8dL)vzB zKY9{tVR^DT9v&QhpO2!MMSLDSXV)Lh&l`MEvmUmaTm|$qsIC87!|dGPrAA#Z9Zu+!Wmlk{+2rp zRO;DeQ!cr<9h&wtTdB&Cs^{FxUEl%CjQAAX9+B7Sc9ANlHb+xAQ`0flPwM046u@HN zZV9Yu0hDSX#+HiGm*+efFmVS(Fb;mO7!N6Fv7{O;v6zG!WG`#5KQy&`15aw>@}JXN zqzM+vg`DmIk3YzpzvIMjvleR<~xpNxl3yqc}i~vip|@`*e3MF8E{>wsh_KJ9gX~W? zRj`+WFxQ1fET%w;7Y|O>X@o3b8b(vxu?0m$pv{umS6E<9a)G1#Of|c?UXSQVV|php zkT#z#cAr{5k0~BjWcHpp0d66>O2=lA?X={`VI5GALePLI6f2+lp#_Dy5Q?XcHM(Y<0jL6V&{JzH%W#6h71c+6end`1YJWfA5Cd z{ahI`<~QP!CPX~~zXOCL1Y%NQjZ|+k-dZzwDZO1Paf9mMk5FPXvM>9Pi%JHKkgB3! z+NiuCPo%6f|LOI-g^3-1XE@Tx*qlCbqk^0356A)rVPAS*dL=u!@bssA-C|z({++ad z=QvvN&~$x>x*s*|lpJ9NfaL^KZA$lvI{rhLpAOc)qPUQWUgh!KQ5sp;JQl^;dS9uC zS_ca!T9q^Q)_+@ibF4?H7|}k_U%JeT6->*H0@)qoqwx5%IAV&O$z^=Gx#Xc>lW+Qw zU|9(7(fvHSB%QoNdM{8|o^$e!ce?W?gJLTJL&2(|=F{HPhXf(I)`Srs*BI%8>2BxZ7PP z?kOG5iRm$-x^Br`YZl>V{C=Bh{)MVa0ub!x6<~P-URc&wv1Tw5DXDFzaeCS~B8B$i zL{Y%Z-V{UMUiE0IM5UQ~GOa3ZJu>61nWQ9REFm*q$xQzws? zV>A{@LfHX~Q3eS8|0B2Yg3)feZ30v7fl6*nx8#1KIcSb@T{IALXlP)Y`R$7$SNq32 zfg==wyKwkW%%NXGj>Z$vTR%`36WlW4HLM4TGy2R*xE&_sNv1uvicJky#5YzZfJoJh z`4W6c!RReiK=dUDq3@x0fVppSE`oY53-NB(+R?ks8qC{s1u#AiP*Ft1@W8Etr!D}z zw?wWc+>Y}Z?8g4-)gao4uI-|_#Sxf->L(7&-BkPA>OQ|q%{UJP-A*JCxf?cG6mZ9| z@BFg_9h|z_Rc#u+&gnIMT6um#O-~QnMU_I=;#Qd-MZzumd3geRCAKvB$gDi@lB|zV zgaVfbP$#Jry|V5IZkRuKi--M;ZbC=(R{M7NidZpojDZd!QdtfBl@`gtYqEcFBcxcY z2)%wBnZ&pkpJU<~%m|}^jZOjzjAX^&zyDTZ>7DzR8&-MLG%PR!tZ<<#W1Kpo6}s~` zEpBA)erZaE5HvJ`>7r^RJ9nltRz!YQ{%AmX6G|}plaNo>j1grzI3D9;cy149F-Ykx z&kHg2X}Dy3XnvD}S1YnS`U1ku8KTmP46q2mR|!B;9Z45TbX-0X2rLmYZpHCsA;bmYwcZIurz)=4HKhCJP+C2VU?u@NRaY z;C2k5#{ccK0%+2<|E!I_BY^!yz*#GutCb?Z{TUv!00mJT=q;$39X}%-y`}O)xpJ;P z>MsT%fCpqa^a}W#6cm{N;)JBXjT>&VuxjueXPE6ophchjx;MX(w??)NYw{WzI#F z&EBS!=L6sXaA3fP6*(us^LkQZ!*&YdCRb6)2QkL-UHf79LFVaK*j>)HHoXq(I!QwO zN$-l6_3|R*7>6|%o-&DL(6^Bp2CoK3^|S=XmatoFwJXM{+jEaDRb6>vzn|1LdEq#SO}!&x6+qAmKpl0f1m2V6j9(>o;xrv zAA|XSXOC5!8zK&?1lxnq1-0B8hYuF&qPa%8St&Zg z?cxRQ;z|Hl901BQ-be4>-33kcgf&J)kuCLSOsNAadILOBt9&0JdfI{pRT|drrhYou+~{%rw|m?4e8)G&48z+Ae8wK?=d1t&p8DoLH^wBLbZOd3j++=^s3r|b zBV_~D64*@Pl&}DKYf`0ZP&9KWC$Rz$KM@>M0Zf|D%^U`m2GUSs05L!aaT~%G%2FrC zpk(I2Ii$ zjJzlnNaOW!0A)@fJcxEMo-LPf3jPN`3Xt9qa;Jmu7z{GCnfM(Y>o3toox>y^CIKj= zDTiUv`$KuFwBwAeL>KK^T_%p~RMNT~vz9Z3onT)K(9CZ1ZXa{x9$)!~u1<^i-O_|+ zoKjqu(^~5_$uW^;WLu|I_!emsV`wk?uV+B>tcw+K-#~!5)kbjdA9;;zOt5wdGPnCF ziY&wJo7RUGW`hq)ZriM}w`@FZby%F}YRxpySJ5AjI%j_^Ve(~De=G@-+z(L^->T%T zr1c0?!<82X90qTbEJT%8r4AUWpAd-C(0lI%DHMvPz!jVu${=z?&3J9ydB=@DslFY~ zR(7Gwq5A=Gw&89s&_>;G*}~W7(+^Q?yv}<*3vJuoOZ_Lr;&$0{Hg9&|dnmZ>V%=)D zy1Q-uzhLOp`v!VsU|uT^%wXrg@Qg+yObLgq2yr`#JJTu>>ohQh>`2zD;;}j^wes^* zPMfBMu*65@v6zz6=A6axVVBNo?m6eHE+AUW`v!SW9pu%J#zt`ySEd7#E{^DG6Ymedf*S$hMRX%vWWx4FzdW#=2#OL`K zROT{qQfQ=cKzWiWx59lieDWx4!5Rz<&Wm zRg$;GH)0B1Fpi|^p4MDppn<~Q6(#cVs^^dF1pD{T0!V$C(-VB2-vt^`WrXR-Vz((x z?pG#)cREi+N1H~cLRc|_UnGV+vpbj;68u>E;dQ&Y*|Yi9%K>Tyq*0-LC%qefP6VK+ zm`z9%aTs-qMW9cVn%i6}1rM)(IfnRcM|)^!0ejMa4w?hb`Lja&gqgz8TtP~Y62BQk4hPSRcC{-;T}`Av+Sie|xnAC#oQ#_bw?6kUbgp%{olDvr-m&oWyr&Ga zG~j<;Dmf|G2=zGpT>CL&rPVu9nTYCU1K;O}%fRL(8phsE846k9Rk$6}T_q0c%FFsz z+L9{fc03|f7g|~YS8V=FCWsgOF0#z}#hEb0Q*6GCw!^Twa10e!L<=(+3$O1)2TBXt zhKg9|kavFCepKN;-AFk#%I0WsM7~O-GfN>xt*9Jqhi@C**YPX9U(?%7BXHuoo?@v8 zFOk7D6J-0TF&f06IK3TRg7BO@x-7EBE4mMh{YFanDr;>YIObudt zARMhDNNx+W?1)|oXlArGxIUI>RJ7fX@l^afJGlL1j!xblPUTNOZw(27HEdene@DIk zFB(X+{}T-?2)y5-(eV4EVwm#efEey^>pN;sUi~S0yUe<`Cu|@KkAMv;0pPwBJ7r!3 zVRt>T{OPn@+Ft6aTbDcQkR7hdhAwg9Vm#;hOMmA|oXtHLKOj!=-ir!m$!}}B3Bn7& z1Hnc;i84I1MQZj9`6TVmV%=rZtgQN#{fdv1mBi-JpccJgYln3+sX0n!shdo5q1S~e z(#r9#(Fxt5oSD&k1nwZT)0#Q4y&U2c{d6UpY=v>Q6=IBBH|2)5USupDZLFnV)SUc z>#2h!$Z8f-Ov0oPh({5@uE9&Mrx}W9m&uO1o_B`Hwzu?5N#a-gTJIN{pN$*P zT(6`rBl!0__QYYd{Flb^(|ZFOg zSL#Dxr%ud3@#U#@%Bc3#k|R-@TODsb9T0j7Nq0K+=zjsL_K*!!!pA z7EW5(QGE_5=keRW)#a-#Wg@Vg^;>n*e-0qIk5h=mpEHed&6$lWWL3XpTeos^$RIDF zoIV@wTlAt7vpB$MH07>u=48P7(Eg!7?Fsjb?u*#=8daQQNNrXD(oB!N z)=^~WQS%`ESaql)<5NuXb&3GbWg3yN+k>|L>yc%p;K%8yV)pBD5Wy$+!6)!)&EcFK zcjyiCXe0P$_21#uGsUL>69ok8AXT3yl}aQ18D2mnbKmuN&XA~&xvsuXenwifx9$K1 z95Nj_d+oth*xQwd*y1-0^tz*Bu<~>|)Z)t-^-1gs?b8yJ4|jMrRV$yB-D#2V6`p&D zecp){?FhLgJ`-cZmrpgxV5ioTk5X4+wPSB4n~a*?=djN7=A>5qJ{XQ zjx0!i;uTF^?2KS~x}6koJcVC=`u|qy^g9(nwi<&m%$bX!haefX&1+wsEeN9KjFW4A z(`h6C44P9`v6q!-!p=32;j~GyHgvv&Gz44AZE?wDUQhj&$by;OVIDvk98tpBI{}|Y z9_y>J!P!Bz8pI+^&o_;mEA7{NiYuyLeB^vyT%68@Von<|ds>K^Axuly&qpn=W@>XP84=KLohm1u> z8HePUA|az0oWIEXw9wm#taB==r(jwO%Er&j0I_3)r`3d1oKOzL?fCOW`PoYt&8qNs z3l2cF@xk&%z>{u*b#Ch9wAbiP0hD$TyhIpZ$$ElP?p$b(OJZ}g$O?;3ewUp8wK}z` zTaJWR#mk_Mqpyxf@-5%mHb?swNii}d$43$=VfgzO87j)cHuC4E1&7+8Pec9AmZbWZ zXrK*+X2{HlaEZs@izyzqym;{;@cdbeVXD0pwduRrAOj^tyV_K!hdp`xTA(zx>8%(T zVE|B@+@YaxYx`cFl2`KKOPIV8p8;coj-JQi;tCbI)lK?&E@hgR{yYni>>h(yRjQ=y zurTsdjBTPHGn_*pIDT*+%o-KS=GQn()S;$DLILD(V~5~kGIE77AQ@aoXccI6I~IuE z+4prtp7cJYXVzWqHaUfhpfb|*_mVixbmM{H_&jGVgs}04I08%@m(;`l=~}Z!0ByCp z)COPDk)K!e%T}~59z`P`h7pSh;iLA>lE!P;Vmb%bJ{nhJYpMW4mu<%<8upT8cRYJj zl!W^F1XGbv|6>L5GTZ$nNaKB?nM9@b9%k#3w8dw^tG~UD-7d*M&5Tk8!^MIu3ejnp zy~00VAHI0BFO+bMSH{#$J~EFo*^lgcZq(S$BhFbtCX;8dFrx(jdr^1~D%o~HrzhSG zAx5z*R`_9gfkMfaoM&kKg9cMR{uFus*Mu}4a$Q9M<{QTFo=AbvL2$;%zjWEk+%nn~ zqw|v~SqDJGccK_rGP+00`6?6BUY!8ZRMh+2_$-+%{@WMbc8vN=6U9|B21_o=0yTHd zq>_k4sNxy<6%5;~&{;0XHAm-7a6-U?mYal(?xCmBcUN}UCTY8UY@U$D#GB&P1fy){ zck#PAYeTnx;i1DM30e7LZ0z)ERA$MDZt`DN4`Au|U=@k`(8&-?#rC|qsGA@hB|vGn znDw$TxZ+xE646-#W3Lp9J!A)l*&4hT0+Bt~`#v`@WmYrxR0=X74jPa5WC|huD>WWRy))QvK5ks$ z8xZmC*8?225btm|RRRwLv>BoaH-{M1YhQgj#F?L{jJn?(Xl{xv$PaiTtQPU-y?L8w zZHyM*x}(#@8o-Md17=yik<#knlG3)asyI6iDfvzwbJMUP^Ls~0M&L6ok%J}q{l>aI z<`1;;4A;a_jhUU({Zut(5@3o9Dpl-FSWK?(j8T+Olwc5xY-Si3Js44Ocvtj|eAdVY z;NdcaEW_2vYHABvCq-s3^PcR`;{HvH21vP2;asTS07HzDwK@IZ3A=>Exy-}SY2;l}Fzd!9o zdb<59f92(mxE|XNA05nkeHr{>EBt;toH{CE#Pdq!cnd$o;#JFo|ETp*B5VmOYx=V! zIO47{AT=H=XlJ50`#JOpq|Ef=vHSbIDPco>Lw7DmMGF_oKf*c?3NDTj0umR&5`cG!$jSP-aMIKn5&g0^TX5r&LgR$;gl9u)JJdt@l$Xick?oEyQuq!##Ng zm)?A54fhMo<7v|gw{Si?eH^@k(;$M*N%G2HO?VxXAw$@v8s6fKn=}{-CMFt5*Q#sQD(wPf42mKRClDv>C4+Yxq+ zEHl7LD({L;gek`Z>4lgiVZye5TxA1K==-=iS3(Z5)l+IMhU1dlpv-bqkG{~lAJL;S zeKkHZg{~#1`oaBNzvohB5zqEOtkOXc)aO#Sq59x><7kmy4X+xixwymQ2jhEw?=+Qs zkl0^59$N!%IYLEsdo@;R3)gT|km8EB%(20p0a)MZq}-1SFG`71D*z}J{@PlbVBAV6 zWjBV$LkGq}4u(!SlO9ghMJnM0B5^to$`Wo0^n9#SMIADLwK@0DoH?p-OOIJO`Jm+6 zzfpu~7zZ}E*YI1@ijLgpZiJ0UXS9t5WSubqQWr?#tB??jTm~Hj?LxmsEN!e0@ccWW z?zrdSxnANpw7XbAnk9l+!ysc;{Y9CBJq)3N!%MN6byjrru4EY2YX@2YV?kVzs(`Zr zS->SRpkq7_Pc0@bbEvrus#pl_A>1}@RI;5tG!%r>Vb{lC$WwnQ$<71p;Mv=E-{a}Q zOX2GoSD#wP<4;Gkiw}QD?=c}JomcF~F?F(QD;gT>)nhQ?`bU{uOG!AL|0qaHHsDbz zhqjNBg2z+j9`f<4N%xjuj$3%!poN1z^^h_mv_5?lOTh!mE|LKY?-rGeAh5C zzkmDuNdR|{Ea@`2vl$@IF&`iDBD={4f8@1!{q(F?OrBxLd6mwo*l66hxvU(G(S!=P z3Ub%lgqOh=S891`EM2J4lthuikNc@;l&clv^Hu8YmeN>pg)M$-ZGcPZiYG@r6hc-n z2T}G;(_S&WDc{}op=YBzesc3^?;t$c=Wz+~i?91Z&jO3l5H_onS2F8=z>vCd7tBP7c@m#s`dZ&@!(jqdl2PRm1qGq5utmB{}0muGifHB)cE$#*F-^(RDf7R2OxHDsGOdIwminJ6C;gIFk)0h;gP#iqvtMXZ&dG^X zzCiMRvfSaxcl>)CP!1xnuO_=A(g%DstZ*h7SEO!WE$}MTNv^aL;!=`ZMj#}Hz5~!1 zo&n$pjt0BI*-2#&9UY)&ciaLl-w%i{ytrZOSGT7LCeK71PM;eaS@eACm-+tDubt@{ zt-uz$jxWF+{ry~q`g+)wlht2|AMjNKdg8`-=1ZIGDIP)}xeY!Kud8DLDMW!gS-n*% z&0i+MTuGR+g?As!s&sHm4pd7^kgih=A1z`4v|AaN7qitY`47JheFxT$G1B}9UEt9& z+t5o-5(eJHfLX-WcDwUbR27V38gKA1Fz2REx}!7wW-t-uI}7pKI%zModTHT!xOZmE zV+a!C--!cZifKIFhV!0|keo5!vH47PbsK=2It_bx$cqixZMcxrB#us@Dk%3wNs87y}N=1Frddfao2Gc{v07BxwdIHGCAUdQiP z-rPfQm(X|3+(Rn+Ri4s_qk6kZv1t8 zZrylC9Ols=%7>p|@cDoLd1u%scT9@{!ZcnxZ?zG)tKLspi^!nhy-o@uJX3#SzQ1fH5%?@rD!`6;=691;pulF1EwdQ!marrX@@wDFS!HYdW-4JaSzRlUJeuXH)2 z4QPsrQ&s>HCk|M5>x`UN;O?Ybe$O1Hz>N}Yvqf(b2gwl!>`e!KO4+mwdPdVkxikhf zyVsGOK1lzreLYaV*jyN08X>0L0h~ddz(Hcd8Qz@?hJs1cYbxDpZo9IVuhUwC1gau9 zV_)};Q71SFh(U-u@E{J#i#2$#ERfh>0!TeQJ7{&TNXDw~3w_b`=RAM8LN z%VG-Dfy$NTVhB-+Q>+_|A_Rj;x4u|7;)3NVL6!*zyHEhL`w^!$_(3rXTLdxepLCOw zG1rlE0SSf^h?tXdxL_rtq`NtiHve*{DMvI^j|@RYlMX|Hx(dG*Dw~|Wf{7v@UE4x_ zh6LWS$x3KwYn}Zp50ft3S|gm;LxuCpgcw!U8C6B>Qvc6Ly3X3N!_p(lNd#0zJED`#0AMHt6Z zkA`yT%L?rH<{IfuvK(FhNa7|9mdC_~G0I&|q!dJfm+%fs>j`k@7&>EC>v2+Y0~T7d zwV&_msAJ=$%r~}(hE7ZIY%v-)xLCFH7Sos-gaU#t1Ws3u)@<< z0~GMrL@>c&x!}@L+jqIIdKkA*ti8+9)C?rs_kU=ViWmjMVri%(W3 zEsNqO^l}N^?D!DY`?oBxByu!8a_`#ieXDw*weeQ{i> z`0=a8^;lobYBT@nBIdTeC|1%w9!=S4LNd-cCgD-_LZ&q)2utRC?sI@sq6im?X?!sn zh5$kcFyil|%FM&B-J*{%JFIPr6^+au!Dx zvlL!Wkz#Jy2MA+l0+o<7jMs5GE!~qwAAg@}R$!UaPFQo=l8m1ZlD($ybDNDsjE{U9 zh;8m`9XMu#qE=dAqd~QWg1vwrd^~(QdlzuKO}^Y6UlbAJ$TpPG6SP;=%j5uI({)uJ zq-Q{E=#YN-1D<5QCD>@-cED9=OuJ(-?&E`-G5=AgE8@25y6hA!EXj((M))N0r^?~&epj3mI zi?oh(3{;o+VT1@hmHFwn;uuH+^9NQL7TU>JQ0ypLRI^7JN-{?uX6^k7V#9YAMcCsK zPPdaNtK;TwdtRHRqxNyAd@*euu~O1TxbWx;CQp`Khq6?$WQMr|R$|fenfGLtYjZ2& z)y1A3KOw6>I#iqFg#ga&SWW@N{x2!c$aB-~Dn`NTt2atpx$exw56OFz1jy<$v|tYt zR{VXw0%9Wg3HxQ7ifT1wTR^ju@O&kL*y^3qj#R<-n+|w8ZP<&lBxgOw^{!rCjYWO@ z5!a+xH_XmoOr{yMlo-9QcoSv!conz{I*5F>`$|=Rh;L8~M0LjN`elI3Qm%!4vh6@juyHk^J{>|M(Ac@s5DV5s*RvQ&>9h zaB1+b+p1oN*WW-=p&b&o@>-9zh$bY`on}>`|E;c~+pN_l zQOqTiA07@rZ82e#Y?(*RbTBQjSQrH30*$1`BBF0)YiAOOCQ8=RAG7mF+t5~Qr3v#7 zTScze*IUO|>KER|7`LP83-b9-g0M(SWQda3i@SN;RCRenfKdzt*Jy)fd!nBqH7y^f z=&2f5V@PO$yEsiO7LzqWvYFfXUZ55?YYb#y2LR*bFulDTiVQ@5+=}eB^9c8y;9jAF z-F6Dkb7iKL1S{xWLJWVH+TSxtX=COvI3A4L;~IZty_iTultTSj^e%lO23udkT2gVPN?kv+hl5{UhsY^FelF{JsskXz2EOj z5KC%4pFCa{58zC#Y9386don?PfYa59B)t}n6PsgWBU5c>H`T0ADH8E~@8nu0_v{?zHyPld~r)2fhjj>qUJJx(DspulZP}Pk3 z@_+%aUE!vKs~Tko--I$G)&bbJ=pC8Jt3T^9EK^TSi>+ip3KI}lSm zR}U2059B$S8@Mp*J#y^d3P}ggh;&%7kI4pUD}9;wuGgX?FzN+AFUvb8@7f2H_W#rk zfmEPJTDgkl9z;2*Z=EO_y{WGl0=^Jj&E)sXfdEZ3q;6&3(MR_QJAKZXy#95*A)yLq zQMkwp!;Ql~>gRq3`{mE2V}rpO+$H(@U1%X5cq%|gKa;JrfT;vU)@hdfw>$g^$O<7C z$G(eaYaMR~)Xk5_=-q#BBAtOQjj)BXfi@^nL@6_(!C0B1XyBe?0?~x7Ix)8vJRJOm z{Dl1Hdb-d#JRZO&;wHL;aj66CWDdY*^X`FHN{Id$r#dW=pWVVR>IBsu5Onv-boMO zmC^pV1;PU~FF}}DXsU~&_DR(peeDoW7)ldBO`Mq#;@)2NeP9$_*AVax8(j7DxgB$I zsHQgTSw5%~yj9e$K+s_;HR7K+gP?_0ewwHYM5rYMz^d5i@0}K$qrS+ zMj0RKvkzW(-PkCQd-x_T%C#7*>pf8|-zH`!t{IqA=vULDE}h^|cPYmeZFAs$ zaPLud?yDR8#qx3+qqkR2VMG9`+mEkPU7c@;gKYj*R4e5RKXvY2IRkNXtT+P2tXoXk zou(mPboCCON8{c)N746W+sqEv(}Gc3!RwoPUtw?WL(kSv4a@=a1q&HvI>&V`%J}8K z_AECAvH!{Fvg}6NU4rK=Hm^@dZZpnA=$~LeR28}L4}=EqsAF>p{VrL;7}_7;H7mBm z*90Gd5U~YW>W-V?LeYBD8r<6S+p&Z1VU1gk19wWh>gzZVY{hdq@*XD;+>oDpHqW@^ zO{k=Y5ZPTFb=Xt+Pp{Z#$)KS*#b&h+q*J8+P_>U1GE!x{;vtu!cAL@?9pW45Uj`M| zMyqJcUNkhp#y1mG7zn|W0%RdFma>KW@CLx=y05LUVECU72-zL?!alFFn_H3D9pTZN zBL3R^b$iqNG8wf1IDbdJ^FZ$J(0_t|S+viYQdg-!*c)S27OdRH_Aluw-UB3PK;8B(RiH9!2^#j@1r{v)Kjee|2ePsd%GViG+_7Zf= zyAR|9gs=0Hz#&N5<=x+3I2=Rqt%)B&sHOyz~T909jbI|Jf&yg*k5(mVK= z=!kuvkX~3K>Uir8yJt0C=ZCP~+i2m}iH+ye%6b8F-)$Q0>@F@ua{P8jMXaO`X}b-! z5&;`~Pv{t477oq?A-f>0ZmQo|b8C2LXte(iQ*YT8XS8f<(Y7Z@Us=H7;TiMsg@^b3?z60B& zHUu(JYqy;10t&Nk6;-Ay51|w6?v2PRP*2sr9{845dKA_ADL@iDTC2z87pF*FvtGm$ePz>++)S@X`U{kC8Wq#!pf$sQX@W>xc9pwdA~@d{wC zh|%z>Do5Q!v>QxLPRsM(Fv`g7t-YSCi4Cy`hkDZafPWNgZU}T_=|W0*tz@L zb%NUosBf7ZfG4 zT+W7=Ly|iV>N+As@8Z|ohLq62al8-6vM`}Th&kypYo6^!)$YP+bYV9XUIlNoWR5tP zi1w!=&G{3l6q*E{SbXVd6!K&8?R=bcEOg+wC_Gy1Q}s45>QzU zqHM`jq`6LH61Q@0Wfi;Rsv@xlXpJBA^m?Fb>~9UGYiob|^P2(Y*1p*=%@rfG%677E zbq+)y%fho@OSnf%1h150A=)qgjNL81_S#boUpBtcSZ}9~8J#)>K8dkt8FsiIXTcyO zUlLXVs-g3srlri7iwXaYS7E_$s^fs2E2L3M{t!>oe%dPs#+UQd)G%ZuOgukVic822* zy8PY;N-t~-QaTm0MEoO=c{3wH=l}0gPJmp>pONFJDB<%MoHBwZU+~4(!^;dSNe9#- z6;aO0Sfj}Zi3+++hAzML@^n4x>_|nK?lf3YG$0`v z`R-;$pp%Fd3I7Et9DZmV<}*Swm`A!0ykmFiF$#XI?7YMUEE&FHKtoIk>c&opeg11a%O0glkQ*^Pv7lTytV3|Xp zRLpKTe&>{u&RTCBjuSU+yu(zzZE8Mld^9ag-jj@v-h&teBDVSEVJ=8A+yE#3Y}^@f zV@?bkX|Dl}Qhf?FvC$D*^Z*uQbCxIFyk}>a?lG)#w!uG{TdBz`o4+n}2P6FMs4GPr z2z8377MU?x`TxPkvJSK+k?^00Wi#?EAdOscLmSi(Ix4dj9T)4q*Um@9#~(KJbAU-cR3dghkMi=lMZ73luI>?u9 zUw+$EK8&GWA-Hg_&bC|z29u(CYz1_OvaW5TcBfOQbTZY>IhkT*ueco66XR{=lySKlx~a8WxyKtRS(;ih52P#~J=sH_z&fH9%~# zQI&4FJ*CCf_29zt)}lUSvGDbph!Uh-$LsMudeT;v!#3H&Ac$!bvl-qARJXVDG&t^x zXP4FHb~Zo9TPf^u{-Q}H`qGiFV;jE%YZGJm|NiNF|I<)Lw6lByC#BL6=c_(z z#s;)Nyf^R`nXt#CSZz`{_-uwn@60PyOWvn9rd}s(+R%&pe^PF>6v9!^EdRn9{)tLh z<}3Y*%&pN(uarQKmjT~`fChsLi0b2Hmxl9%QVl}K%o@9?HXF_ko;A}&rOu+}He>@h z?!lwJ&-;HVudWEXd7$r}kOSLZcQ(NBApiRZf>Qk_(m)_NPWA=tgi4OCc(uQqDvv}6 zFOCu!v;KxH`nsXt%lf{@+x)gglCiQp@KY34_4?nP8pT|nl293Uf{Bt+h@zq z^obshQ4haoV$`!Y80H;y6v&NT}&- z6g=Cq!S871!-;~{%t)i?j2UHl#m{lX95$@;&&*uNpge5=>QCH0PR(>!&fl8n5XscP zna%K=Qia)B*qs0)88f1n^yURPy3)=q*pOE-lKqr<(zPt$vIp6Fxv6?GyQkQU=BIwO zg|O8T8)kzG=+)sI03`Egj}g-%2}*7@)?`KbHYz4uupv=p2TD@CxDQs3_Y3Xg2g==)+H>GMys%5ND(y2m^2QG z?osytxTTSfIz5q?e!}VVY!SN|eNx$Bvp%s{RMrX>ZJB6v<*mWBN*(f2^HuqM64VY- z&Mx{n5@)1ZVpZ&WFta8{w4r?*J|v1zf_6-_U-0=lT%^#-_=IL zf2s|w-^p>%Y;iG~or^*0xEHJ3l6Mc7+_rT!HzsJB3^`aM=MH6+h4w>EOkQAcAN03w|9_zr9>4gIEF@rzM?qri z=PbIv{l5L~S%|+~H#{{TNm78p&0Y;!FIBMuqhX`3-Rk%V=eHEah0|sDQ_ican(%#S z2O=DI;VKMl@+NvCEy~W4OB=fIK^PKUQ6CE*JAQ+i=og04q^lmzH8O#c_>%%51N`h? zep$_@EQZU?x$-1-p`ajP#_{{{NpNvvBy>-O2BX!S;vUkew!e-QUtYYw6A0aJ!)ACn z2OK%01xc_a<t$d8KDKy(EkBN6`g|&mP)4+7`}E zvsz9bSl*W}^q$4qoZjii=GO%)uU-sqZLNe5&XB)Q=K;i(Bs*d|97)xJY5~+HHrR%6 z%azzFUzsQ4CT0?__%M#dkt5vx(CR%`>a(`by8cmVRw(`iYmCa4il?Z&UxrdpG)q({X#w%Co_$CLML1)q_@bs`j^C?ouEc=dBk!_O_%} z)lPXR=9nk4`w{Jd8xkh$UpsK4yN}tXBz;hQOG}RS5gp{|UxUOL^q(-9D-qj?#^hoa zTR+$R=XE=lb)k>mh^F!PoAZ{XllY4LPZviijjyul{~Mg*ee@sMX812k-}=?D#WE}U z^3Go8NlTy|;w(mOIXN_T%clJ?8^uPx;djX=4s3kIm>ca{ODaA%J`N0oT>=(Ijx_#E z<&4R-AGw@0)-}8<>bV0_>?MijicP4vin>E6fPWhL>6m-g^2vR&hR~OLk%H8AjL1m; zv}_3!3>kP)$2UdDU4;=6#_uoz+UUQxiMzNP3~v>>=EVeuO)=G70-r043YPR)4Baa0 za^t?zuKDYi>hD~JEkD)`7~(K%F1R4Os{BTd)seFir|ZyTm*xGOPX-tJ7(Ih~3jRBI zO6|te?je#~^-aiPLssD1z$J`8SVEetHNev0Wyk9gQhp_avw=>bp{T2bTkE&RkAY!!hVm*1I`=H+4h@&Zg z?SCdTe`;N_nrn)Q=MO4lOIGbOjRSt1MOoi`pCE!A#d+g(yt+o*_{xvZoj3rJ?+aFZ zmLp&*tRrm5xVA9XGQP{~8CP`-Q6T{r*)&`5l+aa=GA)NDK7;;hB*@UNZV%9NV?)0Y>Tk%0(j{n+Z&kp{d7Bpok*FbUG*w2c)OHfd# z^MF`mF_phLOrEsWklcQ~vjom{ptO z+DjsWBaAbu4YyU$1dgEpmIb;&$bsj2P_a#&WxNS#wt1TCRA?sOHE=B)koK163DfM< z?`>Qcx^-K`j2E@~M4+)z?7ORtKglv}BFFk4XB6;lB@Px~?g~_cSz_1Da?S?u?L9_( zrZ-3lH`TmJZKxd;sU}t^Cv3N07X5g0uW=GZb zk9oaU(T|G{gV*ypw=G;oE+HuiW;4k}S~@jkG-iH2N@{(naS!#yeD|Vw_s>aY<%SVv z>}*uuB4k;7DD!t9N_srxT~Lo*hKx~W3I z0N1#HtD!bzdSiqZ!Vks)qp_^RxjbT~Ut!Y&tF zKT2NO7B_U4ZnrdBp0ePN#b`uO$rgRfp9m66S^Y5LJ-e%n$P6<7Bmm~Z)t-eZ9W>)? zS$A#Z=O7MrQ;Z5wSduEQkqzAxdcr~35S)Nyq64bcgeuVGju#x6W^Tc{5M46D@0$5K zf>SENDVo95NIjAaBfT$8RfWb-fofj0cfb*=@9=!=HHZP9Rz5|uu7UrdK2L)-uUK3I%#bBKJ~WX%v+e_Fnm(bQjmc`}*E z{CLlw(0#nRFFi`{ymI?Dm3Q@D$iLU4|G4;n{c3hwWiGmUG;9(SNn_rZUj~|3t>oM2 z-iOu(57N$jwV~$zAv&Qeph5;h`SI3w?SG9<$i-pj$0eir@pdV{!Pz3p1QkIai`l;y!6hU;hb7NKn>? zA{XKz2+OSj6Ha}DG0exu5z>hGbu3FZ-t-ddHIGmgU=!|zAH$u-i$7@qO7RZ`z|mCW z0IrR!32BS$<3LDAyqv^q7gy)$U42%fulypO2Q1O(`xcA6Q`o8(Q?2!ETMRz4f=t6k zQdvxVKbl0#30O9v!g5CdHJ`$N)vI-fhHh7s@4M`V;>b9!0%u^;7%o@qVs@UYHvW$I z&23L7>YbjCPL5|-d$7RI6&_c2+V(rW4H*;{Nd0h5KP8NYfWHE7$~U@ms{g zA7!9Cmkjs^^c~VJyQA%!*y~ab(3BVed}0=*`qTlq!1hRl2=IH#6p760ll89$QNHan zPIC=BGN04BH78AjhqeRX$fNP9t>qO-Tkd=_7@)6RE@4MROjglnht~ znL6SsU?}qbfcnR|09Q5O9D;P%PZ)rFz?4i^e|FM%J2&&oiU2lWVzBb`i693SF z4FDF4 z!&1jw^<3@v&*!S)h-Nd*%JATpPD6bx>ysMf+)~o;q$i&k^n*m1+{Ty-o(XTGJ@qE z2ltJjl{&;_S`W6k)-~-FTX41+1CK>!Qa~9_(<-8Dfm~4PCv~7hktX&2>+{6%7za$? zVj2Qbx6a#dpbWQTg$R_g0Np7P5|a}gQ^m~Zluv#vcuAod-xE~FUl1Mv3tq7?_R)1s zmfN(%B|P+)&l!v#0#8s54Arq`bITSA{Xe5_h6PB2UMQbYC@`@5_MA*Ds8^cd?sWBt z5;)57EI}~26s&ap@PO8SL675LKp*IGytf5+*PKtNH75Ig)BN%1!JxN82^~`djQ*)U zs<$As+bJj?2HQ*K_+JSA4B|tA?u|n7RQoJyR{yY~bff*gG{gbcOJkoLPgj!#wQdq7 zm6HFf_g+8n!ux^YwfJMj4?P27h(8utZj{>Tz@KPTn$`1FG$z+ zUK>ztb6}v+=v<|Jb3q-}_kk<$g-{>Ry0N;kMv?6^sBV#iY!UG^>?tUT9}e+^y$8EL zQ!-I$3<5*YDMemR5ia~5$%TB6=X(-Qczv5(wzkV{%^x%`wZkXal*PV5K6y(mKanEp$k>^cqnZ%r28ZQV&IN#BaSK^ombp!11Lnz#$D-~O6;&PP0@j^{`Dg^!;X!}I0wYx_0}*TR5~2j5kr|0lr? z4M8qPID^ZY|)ff9VUat?Q-PQkF8m9;fyPOH_M&5MA zq4LF8VfmU45KV|72$X=vGKH)#7CG9F7rM$Z{~d<-EFZ2`vb#bSd~eZwAIew0lT?9> z0_FwlqbCD?6{U%7XO2)0RN1f7vW528TS=*0M>;R+&!=+Y$dX}sS?`7dps2|0K`}H% zD~uWZoIUXdUC~t^bCBST!V?QcvcN`yS$g}-XENaBx?D%N*o5rLq7#FSr7E5KneB3Z zMh~Hm2~u;(&_$1Id*9Jy9RWxcVonedmI8tRxzLlq6e^GX@t!w_XJ=&l1qx^6KJ}1l zludQX@9gfFQ_Pg-YbTfIDqiT~XN;Vk+9|&TQ4poa zhSN^;KiB#_+z`g_SI0Cr+*dn?adm+eWQC$41lus!m6ag~~Y6O$cY~8v)?8z{Fp83c=DOGcB?hzuin5obI z8aaVAuvbPFCt^%F>-c)@@j%U^GO^iMh?4kQ+zxe?s|KHKLHih|tjTxnScZPj{`c~} znVe24)GxXP5#8MFA>`04Oq1+r*=x*5ay1wjI_rS-p6e$T-F z)JMyQ>`th(34pZ$pduRR^DW7*WpdMz1c@TAoHB)cm`(h|BIPu?{1_l(?;b&z*csM3 zBulF4*U7}`7VF15?)%HfNmF$LGj45u#Q}{l|u3SZK0#$FBO(+ z(}qt%2otP@_%7MRwkL7QU^OOqVONs@xP~Hd+w6R_AYPV(OOJio?mkTJ8#a_;P?yG zfu781^QB`QK(laz<460CB@v~6@VAJ_NY`76Q2PTy(lnP*En>0HIMo>;^0WnKFVWyW3Y zYI~nF;n7QV+VtGeW887tHdyb(!-xdZ3a@?Rv(8eQcM_GEAz9HFeM-~Hql!|%@4xcDf zMVeS9Wwtt|0)bfjacGgkeqkuj+tuDUiCt%eWlGX3p>=d~R{bTv>l5B}-~GfvKlhVD znGc7T)zgNd(tSNgXIV*~nP`*8|5ek98UIr?#oNCw1<{X!_o#CAZs1?CJ74En{XE}# z&K{b^&)o$&W(>WSa~uGJ2z0ttPr}4YoeU}a7lr<7`(dZK>F;H3EP)b$_D^h@{%N-k z*P3F>+%F6(uKl5mh|6S_)ynT3W|K>+rjha}zcDZ*K&Q}rF!r*ft;GCZoS$OR6HKJ9 zHWSh5@@DFB@Jqx_{Hb+xn>OSf6{n0(IboBl%CdK#&CDf zhWAr3Fd>?do3gI<)YYvRdP=fIL z4^6kO)yH*%<9qv|IFpJQ~Mq?96v=miUAGdoM?Jfa%P&CqpTowG<>YYb=J&VtSLD z$PgiG2tbf1QAES_q1emRtD}J8jI2*Q{x9rzbqI`gUGjI2JajvhDSo+|w!Owza|ROh zP`47TcTCJY& zMvFpfrC`kD1js?<_k+;%5v*eda zEVp@N*FG(nW%bs1_J^<2dic8(CjNVwU(WSZL((=_o%Par`Nkr#^)tB}kxOx6z;QPx zDd&kf!gYG%Q;c^j8fEMa$DlwTJ{TXP`nNNdkNO}o(>Afp8imqB+WYdJ%tQA3yosIg zOLEM|A!KjmquIyyzAU>H9n%3Jq%$?@zr?p<=KmZFNbp@q^#%snnPXQwp=JncCGJC~ z*F}Dl{_A1IMuq{&strp<+GOe)uFj{BfjEDD8%YUe3|KvFXoV>MC$_a+gZ&>kkWGg* z3wNtT2~7obZbDiA=0DI8Vt;7E)n%f7b5mpe(^-!4k2}L-$FI%8L;w`NL@e_8dY2m#v^jB()|WjO})S9 zEBb;c!a>aNN%wLgH0l%9t(AwP0y!gEA9uJD)AxKuJO>#g;BO*Vf<)J(n{W>o#5-ra zBE3p}x3s=b$2uue;_{r-qG>E-ClDJ)Gb6%_*LZ$@gV(bO9sBL zml+?hos!+Vte?;4FJi+7uI&JD4Ij#6$O7AaxsR3Dn3@@Mw{g1F zh-Um9eE4Il$L*!Gu$!ybGaMk$(pRn9!cI)(8WLL0->d^wj&|s2&uTKt5s-x0t^l@e zG9)H}S?%oT4(!D!Zu1&}WDmUTZtqNVbo%TcTS<<2<(QFiK>3?W5h3N)bgg1#q2IN_*OS)(v~#@*wH zpbwnJ*d-Zg6LGB?Lx-@|g^Y5SP(8+-QljNJcpZRVqIS_l&t&K=LEP3w)up&p{03Ck zWkfz7IancO{IhcYzN!XKBve*>_=sb$+X%Fpi5w@33|ZZTA_1Ij;`=ouef$MOi?R)3 zcbrd%Hf?iWhz!ul5pc~2ns5MjnJ~=x@@0Opo3K3cB)Uk)rlrsF)5OahHX>|3b z3EG&0-}7+cTXCnuj+;`K;|{!1yYrb>{QrmU%_bNGJiB@oX#KBQ|NR!CZ+wjY(!7y8 zC6MSf`ru-{(2EFpFc5e?&A;%z9=Gd!I!doHFj)Jrwpyucvv+_mZWJ;@&9xzEr^`_i z!HL$bJ*aJC;22L6(;vTgmD^Ypv|9JN<`gyNcZQuUr0=ebSdtwYFcooF*2aZe4yb{H zpf*5v^yFEvPRMpTd0v~R43y;h3hOPaccFTK2Vm$?PFi?boRRU~4@Q}BeC}J;nKXSk zy=rz4Qo$&h#_u|ii!j%3 z4?5^{A%P_1#y8*ZYK=Cc0nfYJVN?LR3ETD_J^s!PAqCb2ObpN%%LfYnHrA?vX{8w8 zG4jgbY7E8m7VOwZL(1O^w%g;T`hbk?)yXl;WT(D4toCCt3s?hqs0Gl2!^NCsuZC(h z8R+rt9?TwXaa(yCtLkvRc>cutW>)L=q;C1J4)gWgKP@Y5O7Ove83pWJP^9(JWl6v2nT%Bech-`i zr5$T8wc(Gp$7r5YS3lgW&!IM40B*(N;Y}8Y{j1JF=;zTjIc@CYA7M&CP9~IYaQ=mO zzf`w)xiUXNCo6)hfMvLPj;atRZap_=wZ#$NCe4e`eW9R#nBH6&t0!IpCLh^}IK*ew zU~O-x@`TK1d-{DrzvZqC@`B%@kBfTVlNA@!iQcI`P&Ax3r#|ES-{{Q$KpPZ(K+Z)Z z^}sp}VZb5yuvrIKz856HyW{J@GcMXZPv-Nwy*++rC-Qi>mVEwxzOaCo?c3fY(UYC# zk+Ec3J%>dby_xcfjH$0qB2Eh!^E*)GT5>p0Nb@;c&-cq;85X1;<&IFt9s}020^RWYCAtGLPK$8+(*re{LMBk6 zW^z-!KY?0v{1Kul9LOSAV9>X5L(r3&KbA0kuXcDZk3~D816O2Hz6HwF1%_EovgOl= z%ZKI7i=`OJ4f{e*z@ejhBI8?h@=*?p1q@lq2{~g@O)XwYbAP_2st6*I|bRjZy? znaB%SPpR2i9wfdeRED)+D+p#chGOWhGQ>%Kfk!6($a#w7B^H;voqsg4>^a25>GJoi zh!~)?elnSO=ENaf<=*JeofmB5Eyk33qPym^MV#( zrjlA$B^l}&vaWaS6+eRu#zXn5IcXcNK0OPN2VY5 zd&q7FoD09zghao>`ZQEN1XvnVJ(heM_ouud(Ev5*U4|i(XFO8?h|m#pxdrtF_U}@i z?vowk7=NL}?w1Jif?wWj#FPNxgip$B8T|W*p|NP#XBbn1IMF*4`&TJHBVOuw70>+6 zba?$uqaI`@kq30|wY+0XC0)Bn5MBKG#oOkiOw@ummxNT^_wOiTdmwu4kSxc=|m}lQz_Z zTnM=HaY=5fgC;P?qTw5A=a?zUWaH0-x%r0$JO9y^_v7ao^Tl(EV9yNewg$WUn*fF9 zHfNdhGL#N5BwPcpRDp%`S3h>Ep9S5QaBREvI=7d$)^i+i062z1%C`x z5@YZ0-wm4BjP_TDVI}y^X6$^J6zTP#xhRTsb^9bAaT6naGqprC(b?#7zN|E4(}Ajh zzDXxMb(r}wh|yF>vJ<$2kXQI{W;D}yGp-W3e39|#!hU!xxD=FR^CTwBZ-+nyOo)EZ8=fivg6 zy${%QzlY`RxPzlzH{V8=uu7BGj_X(T}SnMv3B)dm#>d-Qv8LL&@`!JR0gs! zKhyZ^-hf)L^3SZz#9mNbszH|!^Y)WNcJ7vTigMtvD|?-tmWV}XOGTtH9nv+jcs z&qhi2tgA-ka<`508CeT*^=%IqT@AQ$h*9$=u5w8jfR7(MyLW?%KPfRg9gjf#jh>S4 z5fa{X>l4%d@9;Nix$iH?_~~spp%Ym=`(ZJJ(fS|AsDk&Mq zl@aHE%iOsTnL9hhzWLxcJPWZu(fJEvtM7369#dtK;41Tdvw;m=%xeD4)#IikpNKa# zv2gP`NxPfL`)0n3hTBDEQGVbM&z}w;BvenX%TNSExP;}v*!M=m+V7Q5h6Jd+ zPasz0*FRgPC&@S58u^I?>>RQsc>j>A<-gRCD^(Zj18NJ605vYF)!?F~GWE!Fd-*P+`F_^)wZF@cc*6Gu zXj(J!Z-L;LoyI++zIUOJs7+uJPGFm@>un5Mf*BCE+MgG{?$abg&#q$a&Htjb}T5J>^h*rqaiWgnrGPL4;rn9lAe z>VmV`!VfjIHLasBEGTR%?9>qoABj&hN2W!~F7CM@0>~f-FQ3qF z9x1O#a;r>0&qb#kBdXq;we_UQRGWoVWHlP0-W1i1gZ$?23n<{o+ep|_vAQ^>1?N3K zLpK`uu<~s+UN?y z&{gK{$F{H_(IpmZ40wb2Deb`llW|nfi(7oe#yv7Z{AVwm3*$oW_kv2V=c$^cFYkMU ztZzHxsY^<0K_b!E=qp1%{>vXIDh~;T6a|LyIreo>IinpC_Sq7J>JUHIwSUhD8Y{_#lb&x1{{DiiBOurjP)Z|rUMM+GH0w?SR;bMgjXk2moEnaOo1ib`YP z3FZOPc3O<5IVzuC1!5}7TEKlR|6L1|`%QcgxJB=JRL>=}9L)izTTfQMZ?s_pMLmsX zXGpMlpr?tn(`GXrZdb?{)Z*jq&`3%ACH@TA?5H z`?(p*z;JueSUD^z5?&p-ka{Z0%{QS~OG^xEK7+AY;o^$7CHz9tQ4oSKAYcbB2d+=m zo>xq_{_*U@?b6_V!Juc%OJQ>>P-2Ioy#);w$jl#W1yTr&!)TGG^OF}~Ir)rH^(`W$ zs7%@s8`MM`G=R`&KZaCuhCy6^Hw5(ppkuG$-WqHU96V>-wWY`ZX3Gb_32t%e=|Fyf zt~?j*-6=k7+1bFdW4gGWF{BdHvD`a}3iC^f52ihi8kqoTYz(KFjn9G{c3(Prl4>j~ zz$U_WbI!0qo;43ayy%&N>@Yg;pt??}-9~B~2jxM;=3U3slb3d$sujsUo!TJ@c#$L1 z>0#(a?Fzp2v>X)yukpC+dLCXQAkOYDf!#=;ZH89c>I zd~C)IvcB$EdtIyA9+}*GFLM32z2oVBV&iD+4?+du&xzf+P4v$y?k_U*M4Fu(d>=Qb z`g;OplF`o%j$+VQ+McfXyVA0+*BmEYMr;-;%ntEXog)~;HCX=6m-x#{Bctl789#F?hUrDaz(a13-^Neym?CWK$$ zvA029;L0fiw!?3R_sGDQnS%}p9sZ0?Q3OAQga#np7uj>VxLYP(?B3t{ z8vK%m!s#3U%wp6QBhJ836h{Xph}AcIWkF3Zc*nUl2kdSVh2WEjlQ$o3{R~H6?+Dy@ ze}#VC$Gh0PTqpJ#&)p&@TBjS=wSSJ4H%A(X1(RbTMb|b7+zBeKu@u^sN!zFV3o}Ve z-OcDoX?Nqg<;((wTeeVN}tJ6S^hIUHcQ;lcmt< zCTsZ@6~#!_DB9pWG3OV^ty7QP2w#JtaM+=7sh#Nx5ZQA=>ir9K!r?__;EV-8Q?Ofn z(M<54X(x1#fzBw-m^CJSS(t+4f56q2_VtG~hw1M3+ljrI&vL)cXG%xxkiRwS=87yW_BUr}786@5BA-}{V| zt|?5Fr6Hx!UDLSl32`TXktIZ_8lN|`L^^_7Fx-}LfqiP#uMpe1?Vle!c*Kg2CNd=- z-YT>&g-TK(A>_T(l&TB~hc33Ln3`ShF(sa;q3;0sx)BT)c{o4nt2^tk_QvDC>j5wu6@RHjr z=uX1iuI5KD65qb0+^|oKe|@f7U=?;h7L4h5+BMMq*!sxs5cT`LCwnbaQ&rX?vwL;^ z(&v+p^sCjYY$A0jGjk8g)RY1HHzgzWudeF}NfWAr+Y8Y8`LF1HgHY zUOu(AX4&&(gt?KUGbr7*TtL4Ns)8n^q$^ z%^k_lZq}CqL_7_4uF99{;^18TAvsIR=IBnrA)C~z5T~XowU(`3V65 zats8`$H6kA>o*X0w**tvY2l`YWqsX4Ji_|~Qc@6QUv>(Gf%`slK|Do6Kh=^+o1*jP z%=p)M$Ta$(au%RfCNBy1ChW;ecJSx(+z^z`3@LOp4a4um+@qS1{PwNcN42}5=ZdeW=oNm1 zyfaBG!Q%DO<@A#^p3#4}g9RdQ>c3M7c`tuSyY34>(lASDs@Zt_GhPr4wLW_kJ)^w* zAQ0g8cHP@3{IH0IdFDgiv@*xe)v73x@FiV!f^r(gg+v98QK6pIA=-57TFB>A)FT~yP6o+>GP8hA zB%mgZ@p5BzZmJaa+zH$ead}(g%{sRAzP0c>*+G7L&y07r_d8g$T;jMh8j!pRwipOV z0s+Ip*kMFDhBVdWf*3=klJAv(;> zLccwM*6Du9I27MFf7*pNrWu*iFJ40uso%cuG595StfRE58e3m+9#Qz%skD&%Sdw@_ zh$=-%%|OHuDpE*cN(%zVc7L}Zf{7R}Y=muDh2jj~g@VQ|yPa2b0wOicu{e#-1Qt1= z{Q-RMQo@n;R~@bY%A~P%_t*Zx z%RM{2{`n!a_BpW@Xbafb@4`y<5>5^(TK+>tt7aNva~;GB@hJ0y5ll9%c(`YgTQOAu zSH(J;IcA+jF&u{o<%^+|^DQsD4hB(#m{Nf*dgTHvLmIH!ts8p`DZ4-DXD}1%D zq(Sy44|L5?wME!|!5@a`o(+cWy0T>LueDXuWe9QuV$z_-Zq0xa|0M}}h9zGDO0%r8 zBC^}3)M!KcFw0t%$f#6A@C+a;E#)zYSf%+LhX+F>^Fp*KmO^ss|7+9$?ycP zOE3T&FX@8Mt<;841yYlti|{_%?VxI(~h6F#>QWFmLVN}X;kTI+)B5hG_*%)D(*`uXt*dU zTF*9vunn(5b;%J-i&NsOVmAK$Q zE=TyiTUK~oXZ1bEkQx-4t6)fLZ=%vt2iId{YZcehbLTXp)WN5%o~I5hawa?PeD|?N z&pG$;BN|w&HdHenZMYWqAp~$$O{-f7#}e^f^axpyohmrbcou#T zR;^djc9}em3{)@;#ZZI#-emtWv*Lav(>1{Aca6LLe#cCV8f0RG=L9sXE^&kX?F=P0 zB>|L-NuyfiQjf5ASy-)4l!IA~kYmFBwFKi7-zOdfGDp5t>@FQ?bKg=T`|Ee*_o_-P zES2MmPMDR$YnHeUG=&Ra`gwkAyz+2d6JkJu?3yF*0H9~Yon*c8gPMz(GSt`+ z`M9~>+Db53KxY7f?zJSyFd1|>*dxz8c zR&v_Tfxg({yK-piFdMD7-&n=)HoM z_XfaLplSGDY2RW|nrw^WQ_OcRYO1f_#6*N>VuuVh3!OSj)y=+4Fh%g@@5s8!qdM6B z4X5>70v*RzOM7sGNmzcUqo2=#obfAOzz9(I1;4k^|bxdd#O$J*4is}D`dImHu&jDXySus0F$4)xx*v5)&tAmbh+Z`tz+qP|WY}>Z^W}oMJ_c>qYAGq&1#~4*L zs%|C#%e_XL>vEg?Qh%0?ml>@y)LF&HD1Yc0%2*2blo%-P7i_D2B1GfSH!v3bl|G@8 z$Yy|i%|sdYtt{-717{@`(1EBX{{pl^VZu?#MJTAxoLubaH>O|R+dQ6PZ<{*bOyu4U zp7}j?UcY@=IeCn{g+aAK^?sCpJvjfbG5ag?F!cNT)H`@hLOD(%$B)>*zI>jCFJhDJ z@8N_UuD6kDS?eB`kzz+1MJ5x0&2=5KEUQE-aFVwmQ!POu5Hj`?#Lrq{FX=aCnGEVB z7#QGhWJ%a;oUB~=ch@O)f*oB$z7H}gY~P32Bpa5$B20f(}M_@rE!Iguz4BdxbE z2^8|W5Fs!ZFJbq1vc;iDsPz4uyNEaLj=kZOSjWG)=9HMOCcAHV&46411QCcPB8~Wi z1tVpZ1$M91nGU&i%L8-+jb8D+Fw~ipa z5<0V*Yf}G^+Lf|E0ZL(8wFiEydS{Zc22Q+wSaWQu0_M?rqwloJ^J@dorD}Vfy>fdA zFL@NhpDB*1HkVjb3iKVgM2gA*F(wrDg^EZ8cAMz|299M_(us0IcidZGxqklSqU2J6 zaa!WaZT7rpA#l5($$ULf;d$s4vBdvARStfQio@mmJD4~iuC}=QW&qi_B8kK(gtz68 z=VfChbS5Sns_DvvHmPhc=$lfS5=KZ_)?_)cnH3VEi-dH{4A~4x5CAJCK~N2Nj&=lw z3JRQZ>V9vdUTf*-&&)*TvwzTYe(MccrJ(Cvvn2F^)&HO??#S!+65{^)zWAEJbQ(Pj z1~HPZ)l*h^D^b9{tPEHoOLx*LHKfXPY`rtN4LHls(kE}KfR#&>L}3wFWiMwx`Vmh5 z+S67J$R|dCe!d2s>;aybCShtWUfFnY8QpXU38`d<=31fVeDW+D99Y#Yi`G z45y>5Pros+evz2o?&^78V3OJXeAh(yeE(P1XAioFF5`)h{jHRV4@$qwj65aizx`SC zD0%iPw4N7_srXJ*C5FlCz{g)`kH^lNZ5!|VhE31Qs;tiIG&OoB_DcMY>eUGXPKQ8e zq3nzp3{ANFWzHbe*jgvi-?37hRBEw0-^e5KF?`#%!n(B8XhdZcS!CP_QA-Z>)Y9#v zx+_09_2OAxj7o~xO`-+L2Bt|^R&w>Vxz~^!I0^sWIgg4#J7ZrMhpb`nefJwQ4bQrV zJ*af=r&|GbO5X2z%KC)}haJb{ydHmiCC$4)fecO$64*)$N{MZ$Z}36bJF8L#+n#%S=(lvMEGl z#I19J$@(pe+a2sxyJ}sonDn1}_>L|Y`bj3qIRZk6>X2Yzpuj>{Qv|?3@{%45!tsyX zJ0k0Dysbx_{^_FT8Ht%u$hcp`#68*U=zsuyABd%i$P4RF0_&^*)kb=l}mLQOlh6e<03&J z2)F3NERv|-S>W=UOn)IG|Hucn%8PD-mlfFWv{!lVSh92bTpzsk7c3tB=c0^7 zcY$SY0$9sHV*e>7Yz7wG0mvat8N#tAFf9khy`gYHwJ(%LiK1YVGVkT8WsY%7M<(Wa zDnY}!qLzkUAtP9=39uL7`AJ#u+$*!GX$~V!+!|r+XmcvsA!i)ACCNh?iD*Y#O8}O`})dKwt9=U*Rmhkq>fBq>VPX z{>6gS(bm&_tj-U*s-&Ug_qzCN^L~q|+wsynK&az-GWM-GNB76pZwA`l{FMJ~ zxKLIg9DODi=r7p%-63k)s@vVprLx-Z2id(pIzI0$2tN+yDefQcnTMvVGCEvY(vunS zGhmJ71I_PUSWT*I>*02ArYe&4y~&DdCiSM2#{Wpvp|e`-39<<3G<4N5zW|Vu@v0%T z^~``>J%;r5)Gu9G$Fn`)yRoMvXQkB>PU3iuU z$b$zvfPF#Jm(^`?I#mKU_FslSL2mH%v^ZLTNErh^Z3Dm3&^75+F?)F2OBp&DKtp=} zCd#4r-~^ZL3exhBUk11S1h4rR=!5f}K({d%m_^aU8iyrX>4o9BA)k!R@^Z+fkFjfr za!j|0V+y~8FQ2~q0?mHC_<2C_wY1_L(A)*e16yO&Q-lB-k0a2cSxy%Tnys)x`}`Wk{1wNJZq?RZgt&8vzowr^oe zaZO@jS+&=x1QG2zkbt@(U@)*nRS#ys70}k1cD6bVY~*YYt)p?9RP9g3YF>xv_#P%6 zmP3A7%cXykjl1xZn`4TH?f!j_qD6$To#`=(f>1nlW+IWXE5rD6>ZKFh!qyyyV#Ge3h-Z zxI20`lRr>S;!U`nTdeV_uRP7fU?qms8m2kkC$Bg$y_8dM7mj>>E>`_nZ4zl^VP+Dp zEe~wjn?w#G)Yc+YTsIVpKJ>AIhfCipx_ zP$PU^NgyQP?701H{p>{CLacyMXUz70M*QfRuM*^~jBinWXCB()IRH*7Y{q z8%cLB5T1lP-b$6Im)Gl4z1FkY3xj#R-o_bd)^1nt5b4V* zbTN5%{fYFa#3D${Z^2{k;w@lex0$RZ3f*z6=y6zS7PVdkpn@e$YdHU<9|CWGJQ#94 z9Neti{WRRax4{)Zt{_QaVB3eLco<^6fj{%I~leZ>4;+3jnWD> z0@mCB!Bw&-g3ZByqeItkSv(P#owvvY&og9r{Or)FUcQO)q{&)0n!M&nHG}%Ml|Qu; zjQ+H6mBXnRnNFgWGSQ)28Qj24lbjD=xG}?65-p;b;}a(vX{I|Kz1%}HLjp{tAC(Ju zC~BY+;RoJ3LRXu(@n|H3+UnN$zO+K$F$tdcAO6A9-%k8_1Z_u=+_6Z|dgh3t1#-^0 z;}2W4i0ukie5;ck!w|Y9+Qe~=+}B0rDB}`N+RZ`L;689Ic_1$@!6xTYFXPr_S~Ax? zwI$q)1S>wS^e8teG0a0^5krnf(OXgLAe=&_&59c1b>+Lv8Lt*^(BA>!?DAJ5ZQaskd5Kugdid`LUlCT^7Ab z)Fqz;USU-uhopDDsfo?urKCH#33g(7d^5pZEb`1so55*TMPao@i9$8~lEMeBbIs-^ zRB`S3%{`bWJI=rcoH2Qo#;Xsndkkg{5Z`U5FfAWCXzz`?cWM*_zC7gJ9?e(&QjvH2 zUN))Y{yEU){!sugm+{4#FxK(Bq>ajv9hqxcDT! z&ARKy0k_S^^5%!!=gVr<=Tk_u&XNX!$H`jF!OcG_EqqYqa``d zgmav;&6BGasjh)CelPGQzSd~hY}4Q2oRDK2L@;Eu7IF24c#IshPY|Yo$@!qwe5%Y0rE($KGV8cCiWQd0Mq>+D5k0m$~+6Sq{i%i65#EJMk^LA&K zBKZ5|337um<}6!hzoN88#K;m+i)e%CK$oiqzCJ=OR?<6KoIah@6w$47+#lUmWwc&R zO*Tg1xdjw=d^r`meYs4;7YOjhu~06ESLBqnFy1{RjYwY}W&G`_qUrI~&T^dVGMv3T zD>|J+mUY-4#c35k)K@K@i$i$O8o8A>rZ6=-%LzV7oJ;p zYDPERLC|&fC%4we32M(Xk=98SwXwp_ym$PxIRWYrZ&ki78OjGyD=PO;cS2RSp#Jpt zu;+NAz(AKl@WS{){EP#xlEX;Iv+Mq9s(PZ zW5kfEgx(w_R&f$c!doQ?MoL<)&3ExgRFnoWWr6tQY&x_a472?n!3qH7A9BOxk`tRG z1w97;4jVW|93+^v{13DTSxf*)a43kB{3kJGwm*zO5q0?<=(56kaJ}wJ!1^=+f604) zKIHBFkutlv&RO^F!19Ka-2~B^I$kJ3P4WMLW6N58>o4T^vWN6Rx|I3uT|$R0)BSU? z%IlS#|80Yv-)*;HsP|oKXd+|Hs*)gWcKIC20V6vaBO!dJ{(${`Bta=W)3yr@BxA44 z5Jpq`V>WJ^Y|9y7kH1lRe3v?rqAHv4X$ajWnQAtQQGF`wnGk~bE8GF^hBVaQKoeQ! z_e|UUd|J-W_u*Mf*nAYao|s!3*{>NHU3^nWhrUT_y5(o9T-l8y)URBN`6_*dmbH~! z6RYs434t65g*Iu(gWP8Ge?Mu>bf|qNZ{Bab)12R;t9kH0k=gBKit<`3Rk!qMY3m=% z@I)TA?oN*`TjkmOAXlzjBB^O}$7jy?xV1i%ynYZ3tN~4P%Ag+kG`8lmI=}WKACNFy zFkrkuQi#U=rhjCTG;>gii5QqY!FV8%Q7ZTf93Q8PI?1_y=E7c-0@wC_*6@;$T<(tT z|80Ic!ft;$jNblol^ckKr)`v_jDH}i_gB;f;w{3$Ep(gGr7)>z`?kxkxR*qYcBJc< z%Va>wkZdWmOnY;K7H`t$AD7A|vvJ%~Plp+kd=+FS%SHB?h(*}Mf*ySH8FBIOV64~9 zY)>mqqcgl;=Y*Q*d7cv%qknndP;d{)zQ?86>cnGeLd(cLKw|rGP=<(tXt-Lh4O0vI zDUlf>e;NNvb4;wU3XbaI9W<}^rmF$SKuVu#|15bT50(n(kzZBJj2Q!-PBeo|@sFAc zec)+iV?Q9P7p&CZO91j@6N~CLx{NV;!&CE>dD#dl9rtRq(E^BO-)7q@9&rc$RPyeU zEs{lsH0%Yush;<0ep3><6L2qeff#kzZsX#SYnWPYjZ{)g+IRib%<7m}5BA8IghY#U zk;+PqM{`3f16KtfISxWvxIJ*jt2WincUBj^`3hF~lja>REF2jc2dW%pq(sq#%SLci zf?EbK_vlxZ?Jy+^y@U@(foqaLNUqM4*u7^^=!g-`9p)qyR8IW^!fTi#l)1jWO}{2} zc|K>DbiF^x(eb-nd$gH2doNfvT>2e1QoS_7Drxcl7YUyJq8xqb3lUieX6JXNT|Y0_ zy&niWA0sb6x;{gO2>9!~&X!Fk*)g3%Whc;uHOZwz7>Be6C(2G?RVvvdY&fVN|aqb%6OLQ0UHugdga_AUdv_`YAk=#}D?Wrlj ztgEFkiYp$Bxgxw3ASI%_4EGHRa{vjv=wMha#+CV`n6nlG z&@Q@#)b`-|V*1kYESWZ=-5vN@xjn!YQJH>B(|K$%t$q2gK2imikt&;*Gmi({G1z)~ z=c1v_bzh8dOO5{%uqI|XjSz{7lN;y_YbJmRnJdho;NO7cCNit(t>;K`^n$Kkq?(O9 zpAU}+-RbXjoUIQ=+>_M#PWf^AIoo8rvyG3}#sWQwlwI$C1*a#mQuDDkA8Yghdbvb2 z;>M^YO5@{6MoKR`DfCdmK@@SDK>k50DqfH5p+l9hDa8K45L4+jrdZv`?=b?P_1$BS<*f1Z(W&Ted#0V;oO z?`oyYLFs$8w!}LV_{x2~Nm<}Stf3sq3%b>2IPrI0W#`%3w>lwPN)4x59Nem-b=+qz z^;|)q?mR~%6ZP_>#TOT$Vy(*JfL-}>X1aivw)SC?Ksnc(u z0_`^{x?}sJ2y|{KZ~h;q8U5P@`e8#@Nt;*bpt5f@^~o)CuTqKN+T*Fs5`>Gsm2mFR zEmRmeX-S)bUHQm>Lf>HU&{P3f`;YVKWT2~URzWze%C#i$cF@CA)hBiPMvl`}C{DNU>bvLBn zO6hSL%GNMj8d`eRtE3rgQvfs&TIm=9ezp4v**s+IrO5eKp8Wv<1P?n$viI`z-8$m0 z&lP=5A6H-MZ}|R=Z&f-Df7AE_JJZsiWU@}r@8v45aVr%*>0S|gvPBMG>P-z?^?o{l z?{K0;4EzdF^SHn+^4Ige90@d;)k#$Q3=5*%4OtSvPcjbxR>2_EP_(p$=U0;~){C zcJG|IY%R2k;=; z#e9YmImi)CLlVw396~r-3+xNTijJD)`84p}xry$5xMuI! zj(TV{Ppg1MeannUCbeaTDIPY*w~uX?%$J2c{??nbpe|l}=R?f)^>+GhFXNNL?_(MN z!@>XO7-a)nr{BOa<*97-e2UclxC{Dx?t1m%Yp82>Ihl57J8xM}jA9GJR~@5}KckZL{*Y~u~)*(Ll_ zr7sfDGj`TxyKY}uRD>MJc?Hhmp;4ov2AKoYL1P+7IlkJEq_o9_3dA)u?&JzN3SsrY zcIgnLbazcovxA#*k)_lhV~1bDF~RCyIi<7P+@C2FlTcZIo+x8qwto{(S$u*WG#g z33f>UawDXI&W6e++QP$5tEIKofW=Apx4q9r*@xqqLpTQfU>6rcCsVt z&{j8_3cGWIAjgiMPzwaGu6S{^CCf(0{y-i>*kSkdnu!V^s1pdczfS0QUR?_ob2hfy zzT`w#@!apw%V~S=4Cy<+Ep9ziz-iWxd-_9kLDxBpB&%~&qsF?Y=adQ!lpgH+!4us5 z?8E2=r6KXDY^vDOvTLOZRJ%G_9R!kl>rIxs)TFAh&I+urLwx1S>PlRsT3~7Jj%+77 zT2IKFfw+43k`gNf2j}%xIaU^wj(<0p5fy0~hGUigRCHO=B<=XcZ}RT3RysxG(ub-s zx%;$qoiao_g@vZ}9?eRYwukAdn-!$oiRXz`VAIFy0C@#9hGA16WL&R&zRnP`>$i}bGTLw2JP@Jjx>*{Nf2bvr zlhi8G2xH^^32Vr#RZfpCGl}Hj3w}b$%XLf~e|PrS_Mg?T`P1;|T!Q0^k7t+8_l2g< z<3%6Ohd)X_9(!XCQu+iN(6e5|cjumQ8p;2?DrHu{R^9ABFyP4*);{*m&plO{8?WaU zljVG!&L1Pk8P7k8qNYlwDP;SlqJcc?@ZKJpFtl@I`6Cs%;fp#>@-2uoJon@1? zrQwzdhEzs)5XSzvAQMqZ?H81!+OHiyQ1S<-(D-VrGAFz1*d%BI0k*ye%m~a{+I2he z3(YiDYrLAQUV5j(Ru1|HlTPFdI_Ip1sVBIf%STmfhu2OcJA6T)@*>`%>;+*jy;?~UU${J7*bR@zAMGEbE?3*Hi`6TuLlc(4h3h~mVQ~Ll zj~xJ*KKd(K$!Nkv4sn9%N^4F^5!V1%DT>$GbT~<=K?%^@9gmZ$`R2~8{You*Yk=Pk zp@<%Qyd2yWY=^JmD-4<}jDrQ~xcvk9=@!0}VCk+&Rb^%u$6}8cz=mt{S2IoFUouvI zLTA$<4Xr;^tiY@CLU=6}cN$+7VP{{Zi7xrSZPbji4j?t8yKf*dwV*a|k$u>uJWK&4m8Fc$xPBj&(dlvR;l#5d$mr44xg>4Pg+)XVZD4bvOa} zb0?O;H2=HU$am&?o&(iMMT(Q~e6P;pbt=`2nEM^rp#5ii{Z7V=P1Fng#L1{DNbdQQ zR$f5*?B2K!{-uS}`rl@hP)*$Sg%9pqoPT)8lB@EEO<|-HfQ38i;l1ROUu74>Y)KRh zG_%AE_<+$KzTMw!_riU7_DyDKIw5Ql+C)j8L|vJaYZ{RitSsqAf4BddsK;-3zT{6fB`IH>vO^iWnvq^ z{BR&xo-^U?+>y#$%4W3YZs6lRw%&LESNl_F{=Yn6NaAOu6Dqaz=Lw669^~4ep4Q7Y zIX+jvCXc!3$uCzYn8hp|082XSPfs)JNj_JO zj}tbP^&TE=hgAf-6m)n)JkH7Y_#AM`kZ6EN*dr#$ z%b-)edvb}cbNW<+7ZSg>_OIWe@_2_pF)A4S>MSO(n@t2kds`70FT(2u+{;}Ges^?s z{+38K2In-Lv1UI3Lo;D(ACbq*XNenZC0AnC+Pa z!>hn7;`RP35;P|17ZlMy|FQrm6EWS=e3#S-?=T8)85LXcG9nEGh&DleI` zyZ!rzdfz#`?xW;@t&V}e;%>hLwARZMJMY*qER=5uuP9upxoNpbX}Bmg7FP&mPTMs9 zd~?fWdMSl-63yv@y%S42Vswc>!uC2a+v8-<<~xRCo9Ki8XMy%!U*6@t!MH;g>&wJK z%(ZyIinCcdv?Q9aunnPgp-6X?VM+BvrzvMmq$P8Kec*4PzsEp*+V^1@lonvPtI8K% zm1}=$s$DjPz2q-|hukcX4KXtU7OE2>(p5#R@u1gnJMQx`zxi?O^LkD=;j((kR(F6|{*nWH9k*_Czlu!% zZ}oWHZTPwn#zQ7LcW6W@@(Pcbl9fNrr( z6EQ&Gb~89o0--bU!X)yJy)n$1Zzt}ng{zE9hs^2IC#S3_Yd-Q0oZnp7_%{<~Xl0cg zsrj*eKI0b*4;=tktR`)MZ;$c3shVVnK;$@O2)`O_$7UCoKS{bD5I(Q$gaLf#)$4dc z!h(w~Fr1P<=YRj<#X&Mn#a1R!t${8h5gSdZqZUW82?fGTh36)P%DRua_>Cq_ZjXFV zy4nku+bXfi9DKM2z`}<*6W!^d;x>m~arA7J#r~BbgsJ|?!q@jl;NP67k+f1nJuK)C z!`ST{tBBt{O3mrCi`Oqb1`!eRprOd7buuiNM#{XRumwNO9wpelFhTdAhqzn^4>0#2 z8gx72r@cOK&zotWi!~jiP1D}ZkLb;=tA4c&UZ?v%SrbuN?>|{@n-ZQ9k?&=a9UXkS z5_>w6sel_L{Gts(rlHb{bb_@WQJU}$x6L34NH6FQ%Z(QtUo8_-{tt*ZQGBV zCV4zl4~|gsq16}`w|}A#v!vrgWr@&ohW%??by_v=Xk+;nPt^P9c+Bcy3XhhPOg2re6xSj=(!_;xfwxjyz5i zK{JBoN6XYC18TDJoARa1p$eky-+4iucMAv4FcTbETwz&80em1xJ(p+9PWqf3Hl}XQ zz?>i{{r*JKc@XgPzt(_NRD>~q;E+S?faS`2G>(q!n)ReQ zbMGAe)8To36Y<>Vp4=ViditL3j@2F8MC=I236+Pa$RQAs0u_r&^OQ1rB{iC0wwntD z8znyE;Z;QV-PH<;-C#kvi)8-~VWSFpWFFs>S7lfSQ)-^+ht5eOvHxpJN+QKa+H(!c z%-zosP6yVppj)zLC0cz0)6>(6@UqK;P-m~%SwPtNl=V06;!{g69};N8yQ?yd^O zm>oiY{%Qik!Dmu*yz$6fE>t{}!yj2?-h*BF&JwVvn15kPNF*fJO=408-6`$12s|pi zMQKlAa%J7i%M0woIGwXc6ajj2V(&&#Hw5HI_!CNPb_>f#hu!B zn{@b6^$A?JDhom-DI0IZU{u^7&@~8?R-M+_a6MM9XTRBS?%2+82Uhky2FfT@&f95% ztp6C(xi+d#L(=J1Y@Wq`%E)87(JtgX>y#Suc`{U71lqR_&nS{Kp^Gy%BBqv8D6CrXizu;^{KOk6-cU>03=?ube z|5F4C@cl1B=M@3pT{V6fi?Jwk4ZD^{9I~Am<>q$9z#ghIfd(raW`&^`*7N|;)!4nI z4tt7Y%nH%oKEhiSCN%NC?OhJAfQkGkb#8qotIomsLK&T>y&al7Ch~DU+wHK z+is4GzEw>!KCzl*M0^^9#>^_PbOMh-vRF=vQgpg}JaD)QNxxbl9p7&#;F6&;WYsu$ zu2gYITXVs^h>}+ITZx2iKFNQ&sMFWuZ$& zq2++T{tCXdRD946#ueHl;C!XZxfdl9C}H(sX@EKEYWXQeV*F}Nz^K>O>?uB9XJa(C zi?4_WNoLE-@XlL85kJrK+@ep7)Am2YtA%B?c<0Kp`tYeSa`h|d-w;SS-|C#n0`tkMaY8jj%`q(0+oAk!2AUR^7&$7>*N2_zM0N^k_N;cyO;7U4U+$nSFB@GS8b9w zIik(@D^POGE}o=c?5AKOr^MUj96HN}ftxs8-xVrW@#+linTbmKEd(eThx^gq|5GI( zi84k;Mv(-aIM4jKR0J({5)ADsc@v(h`;dEXxWTt$X5w3e%R9S@7MuYAP?MHxphc)? z?b5wdbUizTK1x$}(y!#+PIChtW_l#Bl;ohtOD%t3@Fb}i^?l4XM#dbcNqqajj25D{ z_O^3Sj*AAm;e9}_K6D3^bW}eI?xgTz4hnoWyK_&iFcD{rlb6E}Ys~5;qrq;r5ek9m zAAPlJh`b?hCQIv?BD6tbROUs@l;t!NFiETQC;!~d-_llot>PoVT}7>XLrXxor# zQ>9MN`)QK%jy>iKGZ>5}WL=!WRsq0*q3Hn@Pn60O!jYAE9_MU@*r*3CpfwOxLsRu? z0qtE=XLH}|oo5TeZaPBG`oKrXq-ANC6YtPzmkl~-9vg~yBq0Dh7DHx4*TPwoCpVY| zRqf}#8c6=H`j*?@di%rM{4`t~UmRb-myA%sL`UiH{N%qn;?@hGF_$xjjDp(-sJzX4c50Gr(tDLYL`tYz5-I2*ShMWzxgLH`LNCuBx>&}R)#i*m>~uiid>f^1 zez`NlK@ zE(;{_?oj1klH_9+n`)-TP&SxBIqC;cn{89?J>&>8l22j4zfu{Xd_6F5L_l@eI}j1P z$Qc&&BYKk!b)^r<)0Mk&;P07C4iDRxZA||5yM8rqyR(tM{K*+ypQx^IjfvOY2WrMT&bU8D< z^CvvssrJ4)aYUV0s_#xve>dzCfBo}w94v3Czz@UBw-d`+R+s?#i#)9wYmvh5M+Agw zNBd6p+xQ-hxH)v$)WO>0<}kF7jVAC{nOAeN3m8>Lm-AFm|SVaH`s_w3)vDutDlUdZkh(108ut68LZ{_HeO8)t5ja{`G-eGH5<&S< zX_&x<8)7G3=i0SUFBL<~nW+#&Ece!uJG>HaSP~eJu;4gKhqJm_NU=Zo`jA%##k;k( zb;k0`-3fbT`@_!X!vG;3XUqM2#rgp&$vf7R2#k{9f5q`^%ZLA&QBVqdaoQ^84L;A- zSDOef9v&uYhA|L1PmM2N_Z~mmnJX^av74+oCUY>c@y|P}x$PyFQygVFYl$K=I(H;5 zuJ9TehPMo|e#qp_x$WE(#v42Ep^-QEnx}d>q4*y=7Y0qo$L5wGM6mgx;6NP?EX+tw z=uI++vhRW&fRs*gllYR-l~>sr#=F9;6xp75ib%q(3lUgFp%*@G2Y1=6*6NEYy(9v@ zdq&N z>ru)s$LBCzV-wgP{CJX3L-lIqPrD@{=5muhMFPIqd)h*4 z_RsFQfMZ{9r?JL#R5!-ymmQ>Yvj84BpeG@KP2_rl5D_alKw zhYnW^X*b8Umc#l;nNc&HMSOw+%}2D7tPx}xcq}@3#SAPY=nqjd`s|irp!@{ua(1{) z({B5w0n{J$TT*P~Z$X4?NwexhE^7wVH3B++BmBb+ErB&ovNJSLkXjIpXs`%U9@gQG zYh0;gzKf9v`VGLb7DK3ab{@@!7oEi>2q&v-HTd@VQtU9eP~qZ#SNWTaBF!UAUF2l) z=?4DGxi)_ZtcRK4%>0;@ddd9hRS#}pjF7)$yC-e*Kv4sV$!*8dCkQRsq|vnQP{kL& z(fUH$-p6bu7P-U0<^^^+f2l@HQ8^^|!s#3L99G7raIar63$yldh^O!k*^Sx*3et& z-S7QV`A7ZbG`%Y95rJcjQJ^DZRw^eLN{t^{8hiR*jc!p$LGvYH-@*FfoQj^mBUl(l zSm-O%cOc|%5bJ`~T@=kO>^lqN=ojm1R!z~)6tX%kE-y2GFEcuy=0+(ddG7)$cE6O# z=NDQa2k5QLRfe85evThtvtdB`E%hN{`Ame3Jq0=%7O9IXX*i{?4+<E2Ik4PRhwKeg`b?V*qD z+gS}^Fk3s)Afk%SxbZB|^uM}8Lm#!Tf#hL1hRN|BU%b=hYHP!YhhJ={Y?k za8fYVhrJ9d16>3?(gHK?2&CpvjREGi;u73^Aav*j^h*O+U-aP)U3DTc&=(cy- z(w{GWcyziwnEptM`C&y_fg(^Ci8 zi&syqb8w>87^SZU5hJi>)Tj*bl6+@%2qCX$YdSSV&>?JV>f3$vJ47Wy-7(C$XlVL- zpv^}e#TEVMH=nTCLzuQASRO5~FPk7hf4<~Zwm)Hf#-UBSSb@1lY}p%oTG_%#pc=dhnNS4dc(}vWMx#A+uK8mlw6nB*QMa+ciX-uY-pqK`L{Z> z0ma^=+;WI5$ME=Vdd4@~*Q`fI-Bu_T*2ukeVf@R;ZGTCoLu$Ry?KO(2E}zD_V0Ya@ zL|MoMOVnNU;N8!dY-J|(XOE+;pFX_W2+s>7Jvi=K(5#Fms>igi~$sLB)lkfj7o#uzM$f#$O4XyCNaApmX<+ZwLz^3L* z@(0G=bx#~AW5a}r6zTruF^i!sygqEk_cZm{xOSr z&(*(Sh}+n0sVt@b?=m3U^5)Q&LYt+1IOCLuZS)aB8#v1#uZ4wga^yav>MHJIOMO+T# zjwEYPn>d~8os~%Qd7ZmsCAd@?>ZFXgB7CF-ZM7Jo8Zv+qK5Ksujlw==-E*?E78jqh z*=?yB9zU{w=l2cxNJK>*39AZG9Q9xn=v(2VxVnQJHRMvwtx& z-^Txi%YB?3rIhh6bJ<<1nKo4t*Egw5hdh(kT|ryNhGLBAqYHlb`!#PshMx#DI&pQQ z9K9?LI8E@l>OR_{r}|v73$|+j@ss)XuZpfV1()qx0^ke`r7j1Z&8MOZEb8<{k`p=Y z+`z6(c)%|7>2v3a46F&`7c{|bVBw(d9jYEh5?^~bq0|#$&T#suT0-H)D-B_xp7Dw# z$~JdR&sb*lV+PlvOGR3da8eQc;9UtfzHbU{Q6&M2GshKd?X1=2KT4rd?EOnOpF4;m zk;B!^{z{+#e%h;$1*{gMbcla&OGcY^vxlo+;nA{^=WK;%pqm9HrnMhwXcp7_qwxiL z9=GYEmbshdttcn>(6;O`Vg8hCs^5qQ>m+RNq50B7{Z6YD>OUAgpqKYe^{JX?ym#X#lqi#}z@341fMptM z$Ve$&j{ih~a7p$@RHNIP*020>)TH-M9LAT1spP1I%EUi2gUbPi&cxDc~sVF?DKhK zcRfwI6j0*@8tWB6u#puGOePcc7P657*0pSE}~;td6&%jpxxxZ^w^V`mRQgm+dU;jP|!W zL)qB5+_+2u^}1h8C0oi}<&)Q)p){3tQ^Brn z$*b%>#v{yIe;>(wbXHFN5L(Z5sp;peS|{U&yJwbYgoreA70zimUsb{rpqSdb6yuB!~(Nz;ZI!SyfX78>&lDZs^ z*D*i8x}cAxugCw}knH6LUS#KYBPU$Em*t7r606MrrR1WkVUIp0WQc0goST;qG+_NJ9+qT(7xE~87W!Xsf8E`3ul}RDGOjYTbv%&SKjxaDipvt~tR_ID+ zg|fdhH@aOu*Qs3}$D^x#YzQkF zlY@K*onUAM>B9_dd!+Sb=4n;XWy6Py1u1n{1*a#l4=cy)uK(=1zKtGUy)_Z^42&Wg zbK|3ZS*-^lL*V%eOBPhx^@;XewyZD6z;j1h;Kh`gs6fqk{%psOA)rE`@^{sP&vHVs zL(dr{Sb?P+sb(bMC)jVPa|R%p^47-wH2Ma3LG{yK!4?E*dd7f`)WVvPX)fUtA3e_2 zb$32G2-t0Cs++26z3x0+_U886FbTXK)@PHlT=$or#eA5!-5&~!AD32H($+!QkN~q@ z2#3$B$QZ%d68Jes;=oW-_}o~j{N`Y)@=UYb41)>tovP zL+e@EDy9$5DO=mc0n?H+ZVJQ+O1;LTiI4_Ew_qqZ!bx#0RBeb;0%YWZDLOXW;`s*$ zBCBe}N|qt4oPz!$O4f=0UXXt$ZitPj!Q|S zeXA0)&VzQhKu3*!x+HkwZ(BJh5_&BXI?=|ixcVf%ueM5e2WHJjsH-Rs1{ zU6JJfCV}X1T#9~OI(>9>cBCfYcG>y=sCozXxWYyacaltOr!gC|L6bDe#A1T_O}TNJ+C8bwTza#^<0yPx3=V<$GH6q zpu>MNupb8CyKbj+tQSn6$_r-&N&~HP>#7xI!wSqCnVbgkvyAW-9MYD>dEfll{NF)}_Z%GK3m3{wxBY=pCXB;hcBxaeL& zs1C;7a?^5US>&ySR?43*Yqm2J`+&c>S_6NwG*2hj3g|Rzg2A}hGQ?kRqE5Ag&XXh5R&ny0gXA5YSV=1G4DF=qJ5v~t_=hY|zZq!j# z^%Bn9=cqekP#^&Qg@R@z_Cj+Dzf88dA~3%#=RTe2@khoUHlU@nPBr;+5}D$l+f&G& zC{0sb!TM0Du$J(K49lC|i);KC?hgLigibN_7_}t)5^8PZ=Uo{fCOJdZUVwe>(C5*j z3)Aypi5`_F<;&nkj)R_vbHobR31CdXLV$l_;{tGy0?S%ZJX{i+e6(yIRU=XPo5D{? zE>G?MG=aUhn`Gur*WD3JJ@?zWd1@b40lSAngTtj#_SNU8!&_dswwx}nuHT<{45F{G zXby6WE`&lU4jCpIb5;$Fm7GU7jx5;x%-RLCOq`QE`o5IsY81^gw;DilELs?yQZF&9 zRE|*#88_?9QrV@5akyDn;cp4|-mBTnROd$!gv9lw&UxW*b5M=!?wp7$IyNLDHwGx- z(yf~0UVQIg$POjkebk0(fpdPO_IcJ!HZtdXSK~dD(LW2ahM197J8Fm)_*&q^c_PZK z3SR`mHOnt`h)>H`mL0u3Y>MjqVfQm$U#<i?2-WFAoe;~?myRGvYZNz@~QlAsTQmkUOl+4TJ)Q=in{d(uDESJnAn9iM<2 zMJt=dqrtZ*P5Aq_NEq4kf|&*(R5mOs_kx3JZiG(_+>FqaX6Y3Q_zpbw8RG`mZ)^en zpMmWA>9M(c0v9L7YN0d9HM^&2NGah<->NRc=sEXH`MNCz`JSpgZHaE~xb>}x1P`== zXN^$hCbqfk8M@_3BnUn#m^-tDY<|}6hHtZP8<0KU9%|u%pd=872)j66_K{qy%c^`l zAaJrE$lyRf2h_YczjtL<_v-=vnHgH`d>hV=M01oc6PdaIdOnYuTtBHz?EbOQ?h>9% z>#3d%H16=d!RX-w5(!NhLMmKbVam%SuWL_H71lL`^v6kSBE$f<(;Cn z5?5cM>>WCFk#f3I$u`1H8JwF!rGM)ePNF0~M=VFn1LeI<0`R;DA=WQr;?n1lJ z*qLOEk7E^+;Yr+R&xsty`V}pO#*3&s1*F*Cg*%kl{z7{tp*w--Wvv)J%vd|>i#G+; zX7vYcajslbh=^m|sn2p6lf>c-hfvdpiRJzZhOZN~$m|GVUvM=rOL~s!tOcstZ_P?s zzdj~iUF};V#XNf;Jzh&kVrJ|OBaK2iD&$nJ(9h-CCsX?>U124g&C>q;B9WMd_qasS zbzY-|; zchU8lr7j=*I;4dP>ZVh-;@7UXuQl8Kp(UN~l^D~h3bhLXS*i)YHM{UJ@u>Y{NTouc zGz`C>R&^;h%AVhuOr|&A-Zf@Convmg-iezK^WU#8TffF&fb**ScwVNf#a{pGcmrDl zKHkVOnkmMFp^^GYtf19x?*aF**A<#sD83$^v856<4pfy0gbS-hYuV$?8Dg*nn-G1b`s>bBn>hP!i|e5M;si2*CdGY>Ocs0NwN~TL)Id z=}3*g*Ut#`#4u$#Vn!A_WK%ZRT(i;JC-P7tJjf*%=^=BJS(Ruczdy;DpGCr}8hsh7YAKN9Nu)&FdOtAk?K4?E>SlBHnyx_j>ovv|zUFg<|Vm7I~_0OD_a&)VAAbwf7 zF1usYjEoJ=214PbXLIxYg%y&^=tGN03CuJi3`dKqO{3?vgw%Vkkm7IVnI0!IzgnQf ztdI$M`@q{OF4rkXc$mriG7K2Pfp0w>jDySpmxjYF9o;0U3K6#=8;WY2r&Nv1`66Tn ze`2qqCMA$zED^`6J`cC5it36(Ku6blCOJ~N;zUW8(9$Qk){8-}GgBhqvHzA1p2gZD zi2NL;5OBZiFa0DN>mAMBMvZq87+b;q|E{|KIpV*sKz$ z9Q9JpFii)0NHLcawki>Bti@r2D?L_NG@=I$NY+p(8UZX8-3_Fgel6M~DJ7>(az(WM zc3ZkF0i`LZ*XQvep*u?`_CJ8#P(&zm#P?mStF9D_2yLcg2{OIxC&5=&X*Ipp`v2$# z?m4M#h!PlJ57=LbMOqAJIlnDgbc$Icz}l-K21`TnLe75a&%jus>Ze1SW5 z2aj8N&lhGgM;QuXPDXQCb=e$Q$7bFBH7$p4 zu%tY{U0J!*wZH-|jxnXBL0_#OK=iWzOa8@h@rF2Uw&M$PLPA5Bq=<3=2@n4agmt}6 zyU1HV>19S_x2;lrkXUAWSqTQ483Ym6l*Nk#)h5*o|9!aV>RNc;YGljbk!K3lEW5Z4 zZOAD)`$Pb64iX)pj3iRnP*G`1DPNWEUjjWv)2K#!uEJouE&~|~EJLf^1BG?{3uP_n zpP(ccV)Uccg0(Z&<(}e-#1|TGAl;m@{clFx}hp0 z_7}4|mM*ORU2Jf*o`*!&9#3zJAUC_CgI5hzAHqP?$+6&F=XT3$wZHE>AMAWMN|p0| zy(UR(aolNL3r_s=jE}y4sPV0S^1rfwC)9sr|22suH;&Zt#}sF0Qh%Bpo`{KZD0f1Q zc=_6Bmu;V;q3~6}khwVhGxI4XBWimfcSMC;%4~7&<#u=~R)|GcHZd?_kbhSbhEBT# zM!`TfJi>DfVw%GhQLcmg!;+=ZAdr)Ej3Cf09Gok)f~xA)Mu9HrPWK$mc3%$Xu9Ri- zYRzGo34*-%;V0XVQkZuN9gSG;yol=8T=cl=h&;m8f4XY03w6(bil$H+AOLlOa-+pv zP7tfxs~z(7o_o!XOFo%|xNzNk%r}c=7zr7m3DR8aT-YM zxD2lPTJET=HVG7mUy6wRWXxQU>Zp^CCT)Pf{$r=G9Nfor=qry?Dv?bmO3D{>IeMaf zx@aDPr4~gN@@?FrIA4-uH5SR#bgQg#0z0Vh(haL|t9>eaVYx1MSH__{?OSKtgT(X~ zNCe#M?Y7V6+iw$zTb#CMdKXt6**w`^eg(fekTO^8(n{+xU^~Z{u-VR3V&gz}>JAOig zP!vPy?!HuB!&aewvGko4^Y&32?`vOjD!8q1WJCOZA}ru}SE|-2{1KCEtrbL_8#-$7)cCsFHPC2?=L->-?I=7B63`~GF-=J%di~Bug9hbo-^Dup|T+I zkd-wV9)O=8n{RkNw>Ek`r_7y*8fXn}!QAMEnRf^TXoi2eU&-pw&_pQIf#{Ia#PsLY zB+!GA98FiY0k|J`@NHLe89fwo=l+o{0A}!LnVC`Q9hBahSXSCpAjXufZ;qs9P&2Us zTDw4#jtcj5)6Y|(TxGrN>Y1_g>B<(MeIlPBbrk=+NrQB_d57x4RQ;^+T^<6uuNQ<6 zRjBA>EaMK8Ap;J&hX)^jb3iW6sc6Mp$FEA%V!0zT`JhzZp zSHS*d?R8aLwym?);jVqk(q}5L{M4Z16@J|Lf{x1rK@(z*OC||);R9)`E{BnZDs6Zn zSVl_8p&g57%eSmOKi`#LgU7B`&(jpqkYjqLI^_T$x&0VMm?FGSPKk|q977EH7wOa` zX~vAfdUfF5y>J+Xs)?e+G8T4FicLVe=xJ4gnL7JzO*M1)-i%MkrL0=_CcY!qo{}MT zLDIsyRxtw^RLW`-#3<4r3DtITdmC>hhww!iW#;0ZaxrA)2OM%p(M_s+2CLE@y<#9E zGE+wkwyK?9kvWuc)xk>}s)?yQ%FsC)$F>}n;6{tomyRu2 z@Ikj{-aF%`pc}5_dl9qzVbe+id|y-WoZ5J$oQRo$-0?Qz*!@a&Y$yt!yDGA{Cb#`V z-_9LHq4kfu{n1Lkhx!m7$DN&O65nGEgf~{Mr9)Lr~-;g+08C~Jvca~AZRI;V1&ZrrpbaF@mqZk-V4 z%BPGzN>!<^ZuhJ*jZ)tS?sab5xJ2SzrINC=yRBx&@ga>}1YyitGc+0ifa z^UCRMyz?EtWfk&56ATqkfDcWnEj(!Y#-&QD4mfwHhGx@ zrE;NM4O7ED-Ngo7RN`wKTl?(H9S7_tGOe}04dpH}YrCHX)E;KKS{yz#H@ZG9wPLND zlD5Ead&qA`xu71Z(_L5LZ%oXLgDQDCux5$u?LJ-75L;YKCk^a*HYpFuAW^xKQ;=5QLWhodv~MF1`ABj+Gd({2iMLdcSd1!;IpNC{JOON*QG zi}E4Yi`-xpNj+yMHlsdpFRFd->Vi6BS^Bjn>v9M@pt0U)2|?ZL2s$Mp+`1SKr7*3Yg#pTR*GgW>qlXF-b`he9l2t?5*$2Pk zRbzB3QcUQr^?%dj3ug8?B=g*#BNf1$*b-8!OHXLn!m!UWsYJnqF>2`$x-gd>)b|ANJg96 zTQ>b7n4tMN@i1{=bEqZ0nKCKYHhTUrh_#}n&kv{qk^05>s?%6XKb@tpFAK2!vKGbo zqs?({S(!YJlYKZ&N`FdhiEih+7-Kfxf;Bju?<{^PxptXbmpfi>%IaL5i3 zZB{hC&4Rtfm+&yQ%eYJqlF)`%>cZ;vrZk6bCp3@Gvb}#g_Shai`|?OEwNzk#5E195 zCg9QJ2$*%vaM)ujP;~tbh68J)Y+%z2b;@q;{8#JxafsZ8$6k>5M(fjAf8qqV?>X3N z;^H%Kd%$S^gu`0i^Y{NKrO;sLxX+>(GR>HKhRtQr`8vV)M6}1;#H%i=jqk`ai-W#7 z`>1ChS*A{_7-aSco zqnQCCiokebtu#!?1eVdnkP;bUR@-r?m}6;v`!Yp%Zj&1c&nO?JUGgRuFfE92qsOxm zdQG{UJwrxxqm)@Y;j>Z@@FU^$Z#h#rVLD|;jH{$6LKX^X9qBsEFw=&|Ez#SRjdzg6 z!uDeg{>SqUJh;e%dp#G9d$r_H z*gXz8@(Q>IkauZTd(b`dZn`jS6_uQd^7q&X>J*~T>j?}L+KGcGlwSyw>AfJEX?w;D zlVl!avE-Q^SJBZhLDjxG>Ln^z3P5~heR#5mz<$52iEe?QK} z&o9%fUFy0&Wy=wJzb(5k^S#VzwH{7%atL_8G5YcYf=F@53kLh3DdOZ@oG#5raZdB( z$wYBhB9a6Xt@%o27&-g9628ugL22jbmR2$E4@&_+74+DMd*S@nFQfc5)82>f7}H}_ zG?*H64dM}sxLbHU(Fh6q)nr_$Tzeuo(%*zNlZ)%Ri^3_Pjj2n zijIu&5NtOy<Pb1yl-CW=7c zd?vdr`lB?X)1fxr$Gv7PwanJHg ziS<(W&mT&)T~c_Uk=$*1JJ_QfPsgOT*?Nc$TFbX01J0^QG(eC-()hXZWAl1IntLNH z`|DMiD!-niL|n?L1jax}e)94rHHb&xeW~SIU8Hbw=&LZ*bQG(GN#_zWRqkL8+vObc zc!wJ8{2G$`vr_yZ1?bWOFb8wgYO!1DssUA!DFxhg5K^*5l%2SvmHz>_|ALP-DZ*j8CY^(mNKM<{a*&dnKdE57S z24=h;sA#|6a1-*;ZdJkNQw8!O!cmK)4q1?+)2JJ2b5Lqli{BF4V zqNrT)BKMO;Q#tr?r9>?STK6QK_erML6st=LR8WnWceFOISf%}t#G1PgQ$x;xik0c@ z>D##35uT{q@ki@X^kC5WwXox6-b3&6*5~E812NXuYBH-M81 zP`P;c526rzR#G?5Z z{^$q20C}Gz32D*{`I6(4+c2Mr5!ooCM&l(OLnRqN1pSdvAb`4}9G*{Qdgdhokwp7F z@rIRWXt5=Km@dxmAZybi z@)~Xr`GAT&qnq_&U%RFUktbfTj&r;pQ9rsVrpxLtEu9*Ldq@&aIf07(bK_dp{uey6 zV5uw^KPbpXQ`+%^E9eOZ&PA zTs-gxCp!`FNx4lk#$ae=?6}mx8nh4wy(~5Ku`>yOWgfx8F(@7rn^?zUz)IyC`@`rj zIj@yZCL7(prv-isN8@b(Dt#gHX6tRUU6|=aiYP`;;Q>YySr+Ru0#r-385-EuhN%)i z2nN{FkpERCpBj3;7b;@g>d%>vTRH1!4Q47T^Pd1J+cu_c-i`*0 z{^NjO1aV8XDe_2*-U;@1_ddCQR0^ZV7B0cz5+ga>Pk9X-;%z>OScE08`_XXxBHowY zsS+$KTONlELY3e~labZ!orqMS72Dn1$!r)VFwIiXQB7L~_qHYGa}V zKjZ}#NBVI1l^CO&$%)ug&irvgM~TNTasL1l&*Yuj6@>Jq!t+F>pg3V-2(zG#K~RQr zP0z=Wi7+*c<*${+ywMLPR|*rm%9 zK*j*0`6bP0y{khM-xr62TZpL2XuMMOxZm73B2Z2t7^Pb2i~QYWc?Ioxl$4pi3&vh? zw@r@SP1DT1Y{ItcI`@7D)6Mw=k3%zY*MuJ0Msw639vKjeru7iRNUi1R6%+BSRLG(# zaBZ~pvPk6VQwGt(URQ|lH%gwS#ExumoeAU}f2!-o**|*0L za~HjP6jIRwPKfQq!zo~c)s!4;)itxFTBav` z@{ILR=hS5R{-2fs@qbzdfkCRK7ADKYe0IA>$+slLp7tjNW5y;g^EC>Rj^WDFXlUjY z`N#dKGGf_BB`b*__yxx#0vgf66l+Ta4g0Lr2#SEHoD`gYHMH|mDSnp05*$f#Osn5%IE;)43wI97AIkA8uEV8(NY$b-_VzgSk^+{Bh;u;OS;{Ca@dJB_ z2+U%oVu_5lh>P{0w35L&-WZxVbj(m-9N@aYY^)gUX75LxdxoB6{M=Rqztbp zUX6Wku3h^kF4ubRnVk`p-mhe1k&auofMc616Txq4zDn<>RL8S0C~(S@KiCrs$s)Qv z&3%le{#r7jdTdDQtTsp7-M?BzH?IhD2-OAjnMMhhSh%ZHJNHq%lpe~|38CkJEFMdw zRA)Ki{LoQ-`!lxMA1`<7_160=Iy*{Bn}{+!uA9NI>-R$N*m$ka^~xUy)OSlx-UkPB zV;gzX%J3;KICmCzYfK>CPSNnk5rfKy1YyFMfvA4A$ZsX~!bV|{ujRY#e>GceR@wGc zqMq(PlwDv`O0ECC_0x1=rK;kVzE-|{kNVn9lFfe4xAGW&2U+D@Vz20c<<_xZc zZ0w?sqOavZ*sonrpU`qmH|~KOqHiMLO|YpDUFd27r~R?_TRC0V&uLs@@BI;nL?73? zw~NUG>Vr)QXN&nANP*>Dzec~hM8hl%m^*ust6SQCCtVqWk1Ru2=4 z=1w?LQWor_)O0Z?5*(rUTlK(Wwy}IbR+yCNuW--(AtlPDQtWGW5Bmdd%l38LNEgtpZ<))RzMoxlc(OJU4)Gb;kSgOf@>0tYh%!g34UX&6ac0CuPd0O$z~gPlN`wzayK^x9)600I3{ zFnLywbL~Lk=C|shHDYs+8dZOhO3GI^gT^?CaK)b?sJ=|GI+clzO=j}3GN{+cR42^99_luRSI`cT+F<-rg2HyiO zt4i#Pzw4s`QC(!g!MuiHA~?g6@C!BKM+clU1+lRQf_zII&E;i-qJ%7T@~6u5N(TQx z5Y7A3!(F9-sg`{yUW|MQ#hpA>9iTLy%+O0Q4Yyz8p;@AP(l}=K{6_J37DKeZIZN4u z4L7Dr4GL4{R#LNAj z9gQHGyg@0jT=d`|Xe=g8h#GyG)S6mSQLyCpImgJ4Tbc%Fjn)M5Eugp?2fxnLUPFl~ zKw-scjUooSU*4r7BF)(?!m(}Lsg$`wOFQ7UMBEp}_wMOk%E1SSCec4|K^}(}mW11j zHABfaEzV&2NA&yD`7ZB!@;8%9ZTE*8Uho>x{-Fs8?`^;@+{m`Ii;0cx1RJxd4B@2z z-9@;Z26qvl@$As%Nyir!+Sg;LH+zS_U2Z=eQ>%^cPrtvyt^sqJrZU)|_5AYq~SjY#%0+>;OY+(d9wF)gp^G5!Sp zg2E>>eI9F7eq8JdlNLbw{lmWCv~#ekVdY@Z3fPi4I5(3y6C0*W=1++Xg82Cj&1N_E zk-w+&a}oR+biBfB_&jn(a17eD@j*%iI->vd2X&R1k(Mk)@+D!*AeQAAPKy%?pxYi_ zbALSh+_HbXb$TLTsi8Fo&>;F!G(r0#6S}_4o%jx>`r$#18TD3dJY*-=Gk9D*@xLq#YFKUQ0RffS(P^a6M#qWMky4;ppmW z&czHu?2NL|cnr{6x#%bK!Ta9ka}|f}gViO!TN-;0>e<(WDP`D&3mP*=iL~fJidHAXxF)Qab^5;;j`!3p1^;=(M?liYCb!q zY6!M%%A4&dj9RpovF*q@y*W?<4>o=YtkX{%oveDAiIo zq>-R3fzw5b07p0_4^pgE&UVzPjwakhojrUMyL*T%1&@y5a;0q-Y)eXI z%eO!JeVQuVj z{%|3#MJ?MNKT+2&NK6ElXVi>r^+%3W%oTZ^{0+(z5O6|b}v zZa>C#Az^@oZ`}uu2zi26m~npAk!1B>bap7&G|Ox1&pR{ETjq?uUy~R9DX(bfSx4Ov z#VE;RkN^?%P)aiMNT$1xiG7L%8@qoB=4fDu#BQ#qZ};!7Cr4}S_`CE%^C@ff62j9# z#LBrVBHskQdJHJX$mUl7!4xFB)7e(n)AQD+s~3#I3B3rDiXV25)s>&IToe5F`IqC7 z8Bbbh?f6u>)CI31b0Ots_qW5u`XXCh82A@ZTsyVQ!2&6n6hX%)F?=C=qXPNPJmS*k z4EKBrx=+?ls~sPBSS)SDd|xAx7RW;ZFlf;;6c1RcW(99=U*Xe#cv~DwLkWBkd~rU& zi6bPQA?1q*hHWldbr%Q*hjm$qL_SqR8`aGc9p4&-#lnkZtOlaGURwo&7jei=tm2~D z!{w2k85uQh3K?)0ENsFPsLr(#RgU^|9LSDDM}$mhBXIrT{(faNhiMQUhXe{A6` zr4+gU`bq)G&8C;eg1dhs+NS92YYn{`(6cKb| z%>Lo%MGJ6@Km9>^T;dDI{`Grt$`Oz?V7iM#-HcJu%(E61svYl*_$MxZnevU}Z)qxx z3=u0G0oi*M8K{^0BFD!QOQywh3uSJX&5I=2m6r0ENiMS`aZu&&!ZL?eHOOG4i)+h z%0|0CvU8H9af;JM!wsfm|1#jpXJ#z~j>~6BX)qB^s>Sz>$f=SFpT~TJbXj`lfk@+6Sb>6T&C4Q9vu*aA_+2-fD*b7V1B5629@dQirM*cy!r%&^&@Y1 z-s9t=M`7%k`}x-0aJ3$=&{6`BF?ncka=tqmReoLznA(Ld$Ty_)*jjn+-+d zF8_i5wxvx4~?yC3E+UC_zVOwU98)>#?m6YKzjibVaxyN1*pABf_Kvb)>DO zs5j#+eW^?K17k`z`;h{NORdSn>rdq7X78)bdPvUvt=dEd6W{w={q3aZ{vnw6`UWd_ z8)pB?I>lgoTR!}pdG-zb>4g3%M0SVe&l2mtUI|gCYC6U!;NZ=+N`fQETXYHIgb0%H z3R&2tbMw(_D;*-jPJY5zEWtyqZCwfJtv$;5nV5=tK|Qhy30$io|MEIe|RU) zqLn{9THxOWeZR0+;Xyv0X+L65qB9ZO0>exnnOJd|5ikj-H-{L-4m!iY`Moa*pgi7w z!Lz7Dr$3fK>ca_I&DsXqE`zK!#l~iIB+Z*j zSdKq%m1==KqPo0;Zua%O?s;dl@-I6?Tjz3``e(UqA0YY!Nj zO5L3H-`lPL%YTGXv!6nQIBo5(X5YPEboiZbeywo3S9fksqN+--Aasot3_3su&4HL| zMF(HVO|xS(Y>T1wuo&fy6Rq)C)G5n>`wB5@e-Xms{2~xW92Ftidpbf8|Um&Tzv`?#PiF4-!8#Zr{YG%t`S_jDuVPZIpS6Ww=1Q zOKUpRIB1|y=i}gMqh!4VDzB|q7bkeVo$~P0>p{ikGW;1LpZPJ1k|Z9b{thWSS>Lr* zA-;Kk^lggD7PAWiPIXXfR)M#suEC0kmM8nUb!yGNDGbcO0OkN@078g6jAc0VZTBnU z;5}ZOtwaG25|_&Lf$1r7v@9=^{a*MJp{Z75TYwPUQZh%=%O0!eJ2Ufkzm0$&v(Kp{ zsR+%wcppMoXcw6{cBGpt~?SEcjWlM9yNP;>VO zH0C+|ZZjbx4i0(B?}T3ZL0NpHul^qs2(Ot8wx_*bo-f<{{LRk3m}+tZ4w3xMk8c!m z9o{!1y8@6_?R4y~>P8GqvbFs>xAc#?)a}P7s`tE$ z-Y_*&v^2~psurEb+`&I|I;=Y#AWv#l7mFP&HEJVlyuZGk9pUD2Hfa{729A z<**3n5wXY(yBfrq&B$tt{Fy4yeg&fKzXQ$Bf1f}RKs7Mhy`%;(x(?_g1Y`nErO)`E zc@=8%1eo>v^47FcreD109yt@M{mk^`G4}I|@B@8SAIsLHC&0c$;|Gz!_eSBtMWb?)^>^-!GL;ktBBNrrEP4(c>0!FxqR5&EFuD8#JFy4Tj=DuL0TVOf`cC05QJTbbGy>gQSfkyGgqh(=Q5w z|NbJ6Jm`olKAH;8fC49MUkCW!LVP~yIvzVeFg#oySayBSoe>4GRvy1bPiaNxAut0_ zc)E|3#KHYb+1=62W`E}Q;a}f9uHlN-1BMW)^+1wYV`ykg;W`*U^%3C6NC!gsA50-B zfO=?F4h^^KWA0hdj;)xwBVtIu>1SFl(9yI2GQXN5n?F>H(g}R8IW0F-`FM}8z@t^K z{`2D~9*a0l_a6|}ZJi#Jbz97x~3{A zhL}W-F8Xx_=!jTE5gS#VI|AP(w~G%*Y)}XaUPY8)B<1ueSBYbYhkNMm8X~>F%A;1- zR{j-^BnX|nm}ABzyc4rBL-OM(8$V#Nt~}VUmu6idU!jB>P@-(~>jgz5V67x0@>@wrP%H5sB86x)~pDcw>R00rV3FbLo>0h=@i zLK=m`7g3ZDZ1|KCz}T0H#pi-H(&PZ;8YZcjI_UVC;!78|%Aye$Wfl}Kt~>wuoL=db=)*=i6vnX<>|J@7}0 zf9hDXPQ$zNLTRKYi-2#N97Y{KI5fcX zJr|;ueFPomP;xkO0Bs(syjd28!S*WNdfdrvLEoEjvSzz9Hlx@;x!lE8W2KL;nw~rC z<;MelN(4(UAu=313uPp{m+wH}xKAB%< z&g|G#=^oNaIAjz}sI*|)qOi3%gEiRiZ6`oH+f*kbhBICpP%>d&@4V@|wIKl?8W*!3 zpt27-^k+uX&n`{P1OI0AVf|5u%M+1Dn}(`yU<~8B6y88pIp^qIj0jAxL3pU=oO80R z{}K5cZD!S7nqfqr0D*AAhqsd=_0JAs!oS&n+aM|E=tWbSXQz=?=DMB*j zWJxbrt3AdL$XupHf)PU55$Eq?ZtG<04OebIQPUOgMLdF=>zJ9)>*a5 z4Zg>vWz-1)yNh@w)XcZ(=-XBSRPhzA`faU|y8pvJA!+!}eUsA<%)<9?a1mJM_r7VQ zp3LyDc^>viM1h=)?~+QP1VWOD3*slMNTI;MGNCu~LvQ5T2>Yci5B`SY3%Jxt0Y{i= zsaT$A6k>(ThKMDM^N{+=vMrt!ef!hkWr<}|+{0>iB}Q$tinU(7HJyh-rqIB)oGEFw zyw4x=0Eh9B>)^xmkvN5bv{ap~Y=@KR@ry2-AHg?^77wI-#To&&Q7_1YsM~r(PTJps zf1X%aNtXL)^Qxh}hE|+TJE7}jk~_v@5z@RfN`^$1Sd^Ria^emgj=TrR=tqkavSf~< zyG8`?^^bNwVRt-oRc;O3r|KJx^&pkQfE&2qWRP|A#d`m${B6jJ*x8G=@;nE}-4elz zni(Ilh~K@c!F1gsNBI*$!6_E-2Cq!&1PVL4&=!^gjt2{?@j1gV#U2CCQKj~UU=R&y z+7PQ9_O~P_8Otl+F)^tBH(tpJ%I~B&;zmfDK?Wbjoi?cm5z$R}oJU>;8<)^bXLYZZ zp6+#&cR}ENnA_}8HHFsubuF$nVe88f!FaTijsL1vyL{(7C*~CRX*Q!I4Q1?w!AeBEzJJw4bG^&d-g(Mj2VUR{6sV| zlU)Vj6kaSMafahmsnI?Obz=wejX7Rf{5U&gLrHaL-dK#YuxTmbp=Vws+Y42NK+3@V zopxvM5enJrjvh zg(5e3wS&YgzWhD;5X#+Dw2)Ow9}QKdYUh#{eE+an5rutBNh&#L9P+^mmF;cSulWg2 z_0WfhGVM9Zv41D8g7*1v%ks5OpJVY zJltDg7Vf>Y-_n{3R$2Xd{`9{@l$QTI)D1AL7{$0&k(Ya;^fw3XshRu@KCc7S z^B?C2-r7?PEJDKiWL3O15L;!*i1LV8WTvT(R_K4_QX)uw$)iCm$uLm;4;oem^>0KD z59Ica6{MmSOE#gJzeDj0^V?igVw%Z0k(K)Ja+KrXg`47h=oNt~`I{Ekp;w_hHC0H- zZ9;xEv}}uf4|Ou%)MvLv1GD$0>9M!U)3om)165IMWdmR8a{f(hubXFsWu4MOK~o(da7> z(38rq3Tko6L=kU=QbI(HXm^p8+M20Y%kCGbP?j9V^T`lv!0c(4T%J@*R2``WBu9hT zp{6+>Y{Wg^KKR~l25q(z1-vm|xgJ?CdywL^pOS!9&6Kwn9dC$zW zRgEjVb0&;@&`Jb{2fe%vj&L7;pT_E_x{Y@K~ko^92$`$21jhB})YT zKYD0VmKW5+G2+TF+4t zWTvRd8O<%x5zp%jO8e;{l0{}Bd)#2AapzfRdLX$uMGL+b(T7xH=)lp?g{HFemO;+h zxm2VO2xgh8xctP%6|y)Q{tiOIv#UwYE~dt$ITPMpgCZSiMlN8Y!cS}=lTvOm)-Ubi+LX5S?u*9 zAebhOy#FW+og?JV_)p{{siyu3pSj=|=uU9=9lgF8NO)(hg+_`62Z0`Jnv_h3+hAe6 z7QD)of#{#&7a4cRTQC~HD)8}FVOmUGZkP}Q4$K08PvA2V+|5U=i7C}kNxh}&z!Ua z@s_6nm-7O2a3=&@Xb&(0h!>rwA&h~m#&7S*GbXVOXt}K7KYD(!%r>{MZKE>xG5ZoY zHRYdpd;!*>0*YZ}@P~FeFB>_G-BY1bXa!4uk*4+oa;#oqf-6h1D&<2qk4d<-lKJIF zz9!YGaUe)W(~JH*E5J5gz{m}HDZ-b~bm z&wf=-s=LhX4cub+*`{2@wL<7|fPS(@Z&-7ZP*2op?@WbHQ>5;gsX0?2`P4jv8kb$A zDQIerijJIWq1e_2r2?y+PPL-n=P{G%$&z+NyYep-rpA0P53Q=KrVX-t@>S8-*1eOt zRbStc;5tZSO^w*cum?$oA95pT4YBj>QW6r;vXmt<1{v9;PF4u{l2I8#2%vId1TaR7 zJOm>*s0f;U2HcC)2*RjHe}XhtGI2;|^lAfI{~Fu)CtE|T8Kn3bL0pek!NqUNGI!e8 z`vPogBA{8${`)TUC`LH8^w{@;^{4F-U720YG?s{qMS;fbLL@cc*bzzL1=1~+C=|+Y zH*mebB0-LSp0Is&UGVwt=5b0O;9mxU^0$|h%jfURPWkHrc~(0x*^ijVYgH_bJO8_2 z`62TkUlmw{q7)|6!HWk*)Ax(T*)La@1j6_GZ&mqbZ(sXUqRA+65Q+zA1>3lo10y?7 zmqjq9wvAo2CLx@cM;BNj;2t=ExvYHxB-3H%1Q)QJnRA1d7Ga~c}u8ZGq`fBS(0Q2A2;>hIC zeq`k31~j7Eq}kwNNWiW7y4%G-xOxRRFZ7m6JMKa;w!c)bwR=XY=Du0Z69r89LPMO@ zt3*7Y)t{1961m_ORf618$&xNo@xDOMGl^viTCa#(3HAs^7iV;D`A43OXr*S3q>M{3 z8aQPeMB$>1_9`VZ=Ioto%5pLy4q1zIB(#_^JYsuaU_0%#2ffMrKRtLH*NdCc=fFm5 z`Y4S@!-0`l@;JR;<*{$ho0)b$-@x(o(*(m0E|S@g(Z}Pvz9ONUUmNHD)(0{h>^VCN zm%YZ=DsP?Y(2P^<`m`bGyp*L^zl|dAzy&h)Yzhewn#V?El;VYH~4@86sB0!pXy{ z^Yin~)zy_&hDR&*VxW5&DNsob;T&}_Nka9}87;(1>XpKM$Lj4wHwO$<($!5?PnL{u=7K!pbQLjPDKF4Bw zJfgyH>CDe~o5rBb{@}{-BW8M>((i@e!0_nbUC~Fu%<_u{47la@(BqPrgS6ElbPmf- zGJ*0$LzhP;he~7)0wf##dMCa4nq^|`Aj5~~&uD;Q;N?IAkPw?@t}`)q8P0kkOpCBA zq0B%%EDh^j_FD;^fc!3+wQP{KWHMx`Kb|AUFc0qqqSU<50;k+C<>5@|s^Q(E*7D0f zQ{a35()HE*5pn2Cv=4~37y%#)anT8CORVKIBj8`!W&Su|f2#aAm7HLPoUFqv>4rXe z;ZWH~s|B5mN>wD42Z>gW*z*Cz68~DR8XC=o(?4 zswp;oW9ITKGOF3QAJQ2PzPwOyzi}xtAXM_gawMKZJhB6+39I){G6g0^oo!`j#=Vsg zO7zOTfT^zCg<+nD+RSe!dfp|zeBOWzcQk@SD&xxCIrw*SpRQQ4Nyr#H(yo>q5TE}3 zuW{cNNEm8C15^Fw_*v&Tst?B=2@t`rbF~vq#`>K72lqd>VB~`+uad5pK;=r``V)cD zlst2Mxi>Ozzps4DYHt_#O#=-pW!x?&WeG$dmo&GYms zg8hnd$)uqMrsxQH%BeaHmL~2;3?8e^q2>?Z&($E-@``oJA2b5O4&&C6L^9k;%wZaM zZ|-^3?-X2YXqCtB_v~oH-HVIH4Wz3rx!IKeNHi9{5n=QkCyBmS$P~ic|E%|f?Uo=C z1+F6O7K;bfiWxj4X9WA+WN6Oq#3LU6z&6J0jYFR2NY+KMC5MFG$6VrMq^uc;-cApU zy1K6d{}ZBY=_N{VJQy!{&z>5!?s0*+IC{FM+3JG;sj3G(+|>u?KR4=Dxi6QXV=w3$s_++jK7Weh@FU`e7`Ltt+GYP9eLE<7UCmgesK zRKH(%jJM^L*=cHW`TBA<@-4Z3% z>AWLjSWS3&H@60i-1LkrFs}(SPClr?3=Xq3fdP(}ebFb5kuoMK&fodXI^gAbjd&~Y zc`DD#sQqt0y;sfaTkm9;(V*tX%S?n@c=GQ1uPpvG``?pX|2ZC}7c9Xqin)A%ylSIw z%-T_B2d5+`e)PamFv$Zz1B3zZ)(%Fifbm%S_7&N6d}m=?#ZaBhT)tQ;MI_($kZ!_| zX2OtB)KEK^$!A`93S_VOA!NJNWZMR&$MXb=+}3k}TLh{6TYoD2coHZ=R{1ij zf?v0nQX`^1K1bCaGfY44P))f#-@@l{$bdyWOV%70=On_VfQIp8c5$_?zYd#7;poqJ@BD0Nsqjis@E1R0K&o}BPaAdNWCqJ5Y6lNJ3)(L<9wkgOVqg_n~zjk$Zs zNRATE!7^0!evt~6r{g6>+XizQL!is3MaLi~5m#LbJ=OB_{lf_N0Hw36*?$1ZQ4vfK zSsl%=xmhE>jqbUOOZ`(u4c2U5t0jkwp%ixalqWH*Elccpv=cKew81zZ43&{(u;Evj zzA9dRe`ET0iUg*gEBAD4`u;4DOlXfyq*TP9a*t!{e(io-HpjzQ+>oR~7H5dy?aEaN z72#@+CiM_VU<%H{tZ3Rd0Da%jT~^R|+$?l+V_Jf{BG}D63?NAwN{B9^M{CDmfG)tC z@o;D?Koj!OGPBE{Q7^yRcP;KTQ2!<5Fj2!Yt9Kk-j8v7Dz@bYhsW$8!vQfx&62N+6 zh)b}I*AZA96E1$-gBmX&rU2Vg1q%TxartaiO#;UGOMP+4$c_X;oo~ArD1~p8M}dJa z8EZj7dk6S6k5O^WFP)ceWUJx*2kTbT|8ocabG)%P;~od5QT>uF4@QL7<)}pX43ta? zMa4WP6Z!6rG(?tav)lHUkF?-R&xvYPSJD9B1gejWgn>W2lc-@SEK`2Q^asnh$6o^+ z?y@c$W9xbbEOSd^imH2|j>oX*}$!Mt^7B zJuW5ginSrKL5L*^b!3l&zRNFQ{%3GVn-)yM*ISSdEx5*5GwD~WGcvP*yvkW-y}FwGYN}9NE&#U{D;Hv9}Rp|Kw z*L!mLD)Sg^1{R>IUPg&UP)M+yVU=`K732l`nbAeGyF7m0Q6UAYlA*}TnVuvE|oek}>F_J6@dN2>=F{E|kT8|@u!ygxln zNa}x|^}~3X?)3o&Cf?>=d~`%~(lhku(yBm4a1OR0*NqdDO=zB+!d#I<7!^-F5X@Ll zp(2WWg*ijK^EIkOV6YAHW#vml1aQL!mqnI)tPq{c-OECkabeWnqiB*rU;nOqT-a@N z@ur(JqKz3VJMPhT=C3Lac1Zo1k>O0w_lrx38l0}Vozeo4%Q?FQrvu3@71Ei5o5M+m zjTJ+Wy3ildHzgA;vRYFi#S}ubT8!j}(v~2V2ZI2SIaeE=%Y%MUu_(8+)K~x==-00N zZ!eCu6+1}cY0%*c+V3)t8&BHwF}#_Xz;^Av{Ty$!jNxXZ*0;+GY{&Qh`y;2 z%RGms|2evWc_EkF*1*{^1W{vD*05~2qPS>72@qr~Vr;Fs^}b1b>GwEDp21?lvHnI6 z##~H@WSQi|&%M_;ke(-KoXEtY6L0 z88=;$xJ;zErBcfu2@f+OcrCtRMJ&@Up8^a>DuC2Z5VawKz?8!lHy>16}d>R`yGw(JA zJ+g^)Lmb1QHi22lq~4}#Ba*!g8~nBiF2qdFyi8nYb19pEtGa9(Bw?;Tdf8`c@CL-l z^(!?wP+(u;lprsL$<{HtWsf>@t8*5w@$IV9{n(R(Q@;lf+v-?Bvj zh#1_TdEpJ~izK$1&_O~rv>CNeXETXH02Vt;z%C5v~OD!attcB5-gVNp^vUzD5TQ%5M z&cu(x4d~zR5KDUe9fcBxOGYqN;eGqVVx7EWXR(guU5+KWDt9jWF3@Z-v8!G8&8eHP zzQW~Pmkl_9Ob(RYNF1Y9Otam29fN#M$>cnj%+1y7gUR3kWX=@M%F%HEJx{O&iXKyNAl&JLNW)JRWHe}@lwca& zVh#YR1eQC4%&+ll$zVjO@Qctkzh1+tp#bGJRl(zsu0K(3WpwRQ ziWTir7`~L*=k(zK*~;XrCyvKyY+SEhmm$3oW;_T70Tr92hM2U>)HC>H$S=sXj9q@? zHq7j;Pp#r}kZy7E*07Vs@>j446O3%1=0wYfa03V`XL5j0NhQ@evujI{%cX4`5)hav zlmajlzaI`t2w`$@zsCBL?c`u)feVkPk=d6T6#WBSP98TYeJ-~RVKAJ^|$fC4d;{p|?Ao&*NE z+N|j4cS$L?eb?7CpiK!tMVmr{kkhq6dD6Qf-qb#K$ z-@DO2^$uZnVUN`oK{jORc3WpL;~Z`5!EnhU#-png#iT>cS!e6Yhz99Ra-x^%>FOnk8RFA^Cp!LLSi^&Q@3G{ZFO{X^J<^a(5({10u!#JA>2H| zAo51+W;yOVA1Np&vXF(Ov0d#BJb|)C({wah3B!_C=?3nigX95dkbla_)2P8Z!3?^o zzY=l3;o`7USefZ_resK?XYQ+NeXGZqFGfK4%eb9V5oEO(x(-?CWm27Qd*-X9lE94S{QJ(RD({xm_EA}-wd{umh59Q1&^`TXpcJfJf>=jg6D5QgLI-_hq* zV>rC^I{kP(wzWQZq3u|#kC^Na1BWYyiw-cVHpHuhxTl0mZiZdZa$IZgF}NKNHGo1Eh!h6(N%w&d8fWFJIJ(AeI-y!WLrB+n&-!<2$;1+7wtnxnxz8)5aTbV@ z539>+rR-#2d|x@DN>eU^t|3$QGw{1wdcNBOk(Rtisc?s7iF$#6Q>%?!Oqx(k#n2#OtWjniERtm)2f&wX5@Ca=@1Z8n-wk>(3X0r%-6#J=1L*=GHZTGwuCz=wbdv$~ z8uc;m_N4vMAJB2#nb+cL1yQUXT)+97=!f(ngFa9PBocCqfhsl+YUCgribjPJxU7hP zDrorGSNstA@)GD`0qG`r3*65%4-M>n)9Ioo*zco~$OS$ALXm}B7Uy(_u8lUVKeFJ5 z?LT4gBo|}Z*#50J#FutXXoQR6xbfod^SHBi^R()O*7g(3yKC1Z9FGP`5iY@6 z5YZK+5D+BAN(I;8Zmrv8SE5?Fi`G;?lNM^*l@^#a-VxWYUY~4O1bIAGCJ8W*?zjtk z->8<~?QF=P=}$DvFAe$`nqE@0uJEMbcNA(m-a<}+hh%FsOAB@&iw>ZvEwTJ@XIJC37R66$4B=ZB z!Vp6}_c;MX3y^)d^cC;NGM3t9nu7n9J~|dvzc0*oZxE&JEk>{Otx7_i-3fRyK(fRP zZC0rXMkzGi{+n+nT^9UCNop}f0tbb%JQB=WyH7cEhTEMNF%l8i+&PKCB$s-1jZvJprWe_q z1Th|!jR)B{7E}ZU)*aiqFv_f86WEQ8=S#M{VUsq>dV$C1*#SBCJaFvHUUd!d3;Pgv z|7%CNIez=86A?{;U`WS+DACv1PVIf;w{#Qs@l5*lEl;1Ptx=+R4B$XIfSSQgyY<}{ zmxD4dn(729hDs_eR(xjP-idrd1L}8c8T5c2)IV%d1=ZisZRf5C2H)?-9`1E0=W3pX z8tdC76SJVrV`h`V#$Fsg3997Y;;v5!;3^_IFXVZDDG1!q`|RXhHe$nWH(&p=-j}xw z{BAhEs6xPv0nNm}*57X?45+ALV#kZ5o=M{8g=)uADyV3SCpbn;PV{iE?P4KgrWj=D zvaGOR3V>g|@^3hRJ--oTFnEi)rz;L3gvu@1auR!_i(8{>SO|T@{S5uY*9EaGdb(IR zhHB58zkWUg2gU)8F2}g0bLn=#0^S8T2kE%jcDue->VyyEDdO9yM%?&K+ZR zt;DL)@^nG8hFa9lR>708Q*%VXvg7DYUNVfi-6YYdV_YVe7PmT-xk#r|t0aHppz0iag? zl>}kV$s(k_iSe>nuS(l?QadZ;?qZkGry-Tr$1N%iGJ5pTNZN`v;dZFL8Q`{9A7wf- z3YTa7I6yNX&j5uI9fJOp$tThthpvE7b@yq@OC5m!v%^>T)H`O*#+EY$noAQDMP zfqJ_)*hah5AKk=z2_F~S-nS35#|E{C@+8#ux4|jw|M~@Ahd*8ro}4~vn71F~qj*}- zMBiZ0aqFllEaUfraiC0pAp|4vBdPv?9*Rc=2Grm!;@uqG{f=l2{FuKoYMndKb(J26Fx_4rGR4nY4|k8^9!^Hy?HPaQQkk??@uMrDf1mC8tQB|s02 zaqNsR+JNu9EeodyQ)jD>s1ENuU?Xv7F9M?xtLdiaz<~{+zE+R{a!KgXfgR&|F|>?B zqy!Ae8u`~3T;1_AW|EBKIY(Q@m<^sw^vDAlc@CeA&|bt6t@8Kr6;V6E%CL-gCmoQv zUcsWolf~b~wmfidcRwG&a_t$Dt{b5Y`qrFA7j=-5!Mt8LnCuVvb?Yo%E5ldMs}@m^ zm~qzc`qaf-c$|0!5wX7Da3lxT2i|cud*y=eo0Y#?K|9)yAE!G>m;Pt(TTCcf!dH(k zNqhCelGtin)948Qm!K+M6J&$|M%r@o!JV=*^E$bE(SyKA6aGpNAH_m~Rn`R;4(N&@|>J>J1If&XyI z@;73-2rArRv~C}JRBc4pqVm0k#9%(9=H%4J7a{DuD+-yhY4@Jvxfx-| zx}9<0)pccq362&37zO_0-TYXI@;mw^F`-eRSG>`PdOE z__*{K_#R)YfI0@I@zukrWi>ug)tFR-%D@Sh!d|Plr*kn;?~FlMazoG2$NO4?X6w$B zRc0VudU56kEfqybg)u_@r(dr1-BXpJk8jz{vg|xmaz9qyRwthp6z+vdV8Awz={Smck${!l!vq7F!a8DJ%UMA?p!sWe+uZ2Ta=x85 z^`{@2Efs7@msKi(x$1zP@Ul}Q-3jZnqWUFxl}adQy$MP@Z6-kmhr&c&)*SQi?EUw@ zdoR?5>mQ5#+=b7ZZo(Z8=l9*hZ5~fp9yec3`(PkwCs@4xmwqt{pA>n-XG_>kR&xDH zh7^?^weVG1REv=DUoa}>uNc5YC@SX(g8JY7pe3ts!G>UoD!h5509e=TwMI4sc()%t z23bfd*n=Td6rsJKXiyQXhhU#;QA&3}Fd|}N+3WbYMM_JA#k1OYCe9^G9apQOKDVpk zwkf8$ub_V2>M6&?@>DC~q1IC6jB`YCf+I0O3!KOd&8dh=vDD&=i%AA49aUh~xd&acB2>IXPYTX4=EbSX&yb zPQ)T3h1`Sk{^Ivk_)c82vsy{5vmQO-k31AzO)WD6;sAbWU3l z!V5b`_63R^DVr&d__;D#8#TC=3Kb#d>05ZZjIK>L57+uhEL>!|P@8oq_ZJEcbiI|X zka)(gz>Y5?Ry*D8sOp~orZ=7@EqzNnj*jcbD0|3M>1#1(Q%`}3fp#7eCc~Y^AU1K2 zZpma`(mE0!4JM8gT|dNT86Z5KD!vHjwy!I@--RHIYKC?+iGDLVWqk`C|CB?;gb=)~ zFeq!KCS?iwT}=eT@P=H2T5nMMEd9Zu&e|;>Z+`77Y&W0gS@%WE+J#={UEESbhaG*2 zg2M5xL|;jCV7({Xu?KK-8+Xq1}tJ6*$&SzIj z1>FyOjx|C2cQd`*I8?7KBGW=XP7%lf%P0x>4#2&rvqHley%KWEc*~*l@+^N#xvGSCmXZ2mV+R0=`iC8-c z7BUOtR-o#lUj$kB+5uCc|=k&9$dmkaSdz5SbBpYb@Z#!6rO+8+=Kg!n-u<4CUiXWoL0xB_O&4lct(;*K+-R zYUO!Ex`T4y^nv?Ka?JvAOOAqnkFR?Xx>wqLU$9*~UiHHV)k!|3fK9?3s>a2Rpn#x7 z#)ksWH&ezqp`#0xOYPNXyt>B}QEI`_?-y&M?E0&02{OsMYF3>xInl3ojTi*>+InVeZlLb0Z6D$3SH;Z3f6x#L!FfJ77#=I|&z+8lH6-49yYN8X8|(pv?-s z`nk4a?S3`gt)x4>!tNn;=Z9>5d)x;=?=7ql}Zosr@4_#JoTD$Gq<^N3)v0w%vc`fM31sKhS%Sh zN#OP&x>^1IW1yAy!4*XJZq_d{M1Cud4^h8=!uGGE4aQOs{Ng*mhhSah3f&FHB$7BJ zX*;fv{OwC&5>ixJ6sL6WHhT{;fh&fln?S;9R42_IR(>DeAfS91>A?n0GOZtK_ zdFl%V#l00d#$je-xVnlax#PJ9_;yCZSrcU`D;IvA)g4TOY=;!9l(~zgj5TzI$L-%I zus})~RvRq3p{DZFHbK4RH_T@9j~C)ia`7PJkJi3%p_BlO01`FBbEw12fZ?DYP)wfnufyXU@>QsSZ3a)^uC z{(Ad_ZaZ~W7#^)Ar?oi8-C{T;UT|TK@>ddsxm~nEC{we73nb1z}S%p^O*10 zRZ*s<@l2WRjEfXiO$$7}k%}#?J?$jmy%W|S#r$5}?fO?ykHBAP9)^^?*C(x-e(# z77;DFz!*a{(b&6CVt(s>aMM3;j~n;DbehOJoaVzPSO2v^qN7xG7G2%!TL ze~W&bshiVN0Yx?GY7Ecw5YpA-+^UDfeZ$Ik!gHbuottAtY>YG6HBi`wo_GIX4O7K- z&mJK?LK36DMwrvAe#^^u!yQvi0z~yyA~1oyo~4OxcierfRbY zdzku@{l45j+?j5FyCl~OrzVjtDty`d-*;qC%>RIC2@07*lKxuey@%jo2W*-m_M;je zuCheMg}Du098DJZur_G)+(0JN8Jba9_v)iKM`W6WGdA5Nho5x8?2s6ub<)Sa16|U` zWHc}`mI=9ZQH-q8lk^&b#`Hl8<5eoFTl6CnH1vx+dj?-aF+(m>UqE@c&+yGFw7~C|Ii;Cq2;@m=`dvBPdI6$Y%F7GHo)$-%6+{J zM3HstF77P&f@tQe_cKbg)BQi1R%yfAH zNNv9woY0d!z4U4w38sb*WN=f%q%8y_Z#csfJ4YdBw{}astJaaqKIZGAyrAsw2ANn$ z2Opy`ZxC=X`e1`tSWW9i0cKpSn$9*P-$CWh>7D?R%IIBXT3@t&@>DU9cfLJ5Z^Xso zS%`Q12Zk#6LKz4X!fTUPe|llXf=*2#i^DT6)5mS(T`LrLvq(K1c=pVF)!}~>rA=J$ z`gUvnk!6AwI4wFw`mJs7Tej<|z zO}V-(0$Z@JD%ho(hLK=e3)K8`Y>=QK>f#Sy@(m!}ljc~yX2sV&FDj*f57kZZ~jN}uqug1F^N0(=ko*O8nv;3?j^ZLscwP(I%af8f@Xj?oi|JIq{aGf^fF zZS6P2o{yLw^#BEk0gQ@DZc;xGWIErFqOqZABlO9uGLsWR9R3=f#4D;W59PFVoVD9! z9bZkHNQOuzHGUaY7kIuW@AybVx!#->hLP%JgAou~Di3}m@00&H1%B*(yl4_^b%%DQ zQ3f*xLtwPBz?eW&U@-LaEgPd!U5j27MxLijSp4w>=XW1$LE6#xXqH1mwYRf)!D2Pr zhn^OVTP&cAWa`*;Qp8aSvx68501l`NwVReuZHS2RIB!^2Aj1nV7-N%KfvAMylPuz*Csmaa@v#2WeJ4Lo38123C7o&!3vHI-h zf-;Uq@xvR>eXHcAFNfm;(CS~oIGr~e2Y@Qc*n>r9O>zOG&1gWFH&&7!Zt36fKC)IB zvhu^BL@DCLGeN4lF%kx&y|nsb1d)s`t<@q^4U~+iV*hWyE%e7L$u)X-b*qxc1X(3> z&;gHDbC^+$4Xlwuoo(%inG@#LaM?SBZL33L>C}(B<^>e4I%(Ep3_eLz9NFM_L@}5! zR=FV>aw(-$ilf?Qfq?7$BVpgCu&hAOzpZ&eUanV9(l6BG&1S?x(6uHY=1lg9{Qs*> zS+RV{vj3b>M#j767^3cs@ILY;h|)k2>fhE9=F&3uloWsHf@czwir>j0W{n*YKUrbX zFB&nFd#+h3vE&CmX!kwPrnlxX-H-zyc)~LM;5H?4ckzT7#@WHLscg+6+MiUFWGMLV zsEX>aN&+SrcE!}AkZ=|F@=T($4TBVRcT5CL)162W104R6q)e^9!apKJFZA-z-~OON zG`Yf~W!qBXOA1$6&Fb2tcR530NRFj`J@4suWwV;b>V!*bP{_TrU#BXWjCRTIfeK@@ zo5wOn|B@|sVaOQlTjaH64F++HErFRN8b-rOb#)z;R2-H_$r+?owjfx=&_$a7!YgFL ze1lFwulyZv|AwFL-iEhRJcLhO&PtI&y7Mz3YFOm zbFFCfvHSAn5)JLo=G2gR(P?<4$|K^{i6Zki-&(j(>hNFC!E#z_L^;!KV(jo8y8bP1 zH(`wI5pKQY5i;V6(I zW$z%tulqQ$x>GbREQ#Xor^vSaW#s2y>(`AIiG~_{w>f|LIqwDad6Ub`q7q=aPN-$? z-8_VT`S;F`c@blFpu3a(eEzjPjxcWY%2E|rnaIg@0ca3lxVQeYNKa|2-fmkx?NCe^ zr&uw9v3Y8gVRpU41B_^@P?3nfmNB4fYpzbhx7S3{<*++}sCw#s;jr0hN*Ah#$Y6Z+ zbSta6auaOg1aRjY^!7=BpijAy-Py37vvJ*xY@r>Qpjt4;o4W~YAv;d2+C&eE#CnI~ zEb(X6%EHkR?au$ut3Q~Wv8vDoXKSRN2f;lpXYL=sAzuP#t^yPC?-a7n?_p8O zSKYVgPFHVv*g^hp`j77q+heE0Z#%bw?mK8=IBj7E|E;yCncpX z83ihrdYn{GZbiPG+Z!9tQ(%{o$044G6mQnRG|>%I&2oM6z~ogIIkv%yE13+p+z;U8 z5K|z{*_CHVwkht9(2JRtEhBa590JL_gS%@U; zESA@7p;&}vS0v=5HPHRkP)*(V*E`HYLp4DUtaCn6Tap7aW*!{_`BxV^&&2Efb|07e zJpQO?H4Y@HAsq8k@xD-Sagt6@U*jP+5W=NhdgHh}{xaT4wfC{f&C0?p+2n@a*Dd3Z|O6NUTd zMgOM=B4ke}{bd$_#2O5OCqf!m+`rT&ScUi|OEsUp^1wUu%6Q_iRYGl@8a#QPA=bz9K>7eR{v56a0^br3y|O4=16})-@aG*nHXb_qN;bB5JAoaUy6l=x|k7rRPQBE<6-*<9!|Wf90{0 zrT+oUGc*#Vfz0a1^&k@hTyf)H*#MWH39)9&zQ_?MxOXP!JasTqVU#hV&Yc~A1tw?; z9gb?7b43JL6!zY5HpAdw<|^EfnWAf6ZUwXwFxre_gK3dZT#8~1sW=J0#E_Q=EbDXv zu@Yu}kmM5PmK=U9+7N33w7Seqx@hu@l1#N3V4{IWb3=-Z(xk+lc6(P^cb>q1ezZkVPDHQl3RW4YL<4YfEuF57K(%22$EjEuOH5~8`{FRXCX z{G0xe0)-zD@-}z4y2XWDu^vlEOn!LBGi5q%Uva?{U_~tvR<;?mvN%wH#3~DyvXuYx zCa+M?3u2OxAT)r$@WQ2Kwf`P}$@wpTRLkutrh(5P-Gd{0EkW|%CZ0RryyZ6qNHGlu zYH&BdHe_?lBS!Kz7&s-}? zp;pC&?TjoKfs47%tzmx>2$@b3+M=7FjOv~V;EZnVgNEqQ<#dY(JI#!Y=J>4E_WrcL zgOjktciK*!qA%K8Vmkg*=rE-t{G9`zpn2!h1t=bB@RH-zk2%7jtlE z;8omw^7t>VG%8zUU3wimD@TFY-wKz@rx7t4$pPE}n}bRH7W@#1iG0VCE6uFOXLE47 z(-0;XKUz}u>QV-@+=Il*ESL#Jd~2vD zdH5s??hT_dLUg|L`{-Xy87Thhs(Ir$(@`ICls>0<(`>Jy4*PXbIpPT!z%2N&)Tu3u zfXXtM`!tE_j5g2WlMk4?=}MVicA)L7{>6(Jos3w<4m`368}3*Cj0yWy_vt5o@Ppat zrMG!2@Om|@yZe3a;=}CY@O>J~Zvz&f1X1FM``_9pF8#VsvA3BNc=>1T`kGqvI=Up0 z)Q}W9vYG~}S#rk4?Da_A(5x%A1i8b+psOE!6FI<-+`Ce_@M9!u^v z7Hl>Mk=dJss3xZggJ=aDG`z2xB8+0teKGu%fY?&Hi3^7Dki0v07$jp7ZGu}?@p?c` zFYV{dpGkxp3C4Z+*R=+)H}gP>X68o|f!dlyvtn$2z-*k;YPv0NIp1$&#u$uac&JoP zwNK&31c=mFhuXd{p6BD0K$$q7T&lNG-;bxYE-KAV`(}G>xaDCNPHURrd;45i8w7f) z)Df4tR#u-a|EEJgos9k1=eXvNU3o-4U_+Mhtll_C^8sCi4T@LXHL_M1C)vQHvp?Vk znJiV*@I?uFI#h_)Awm*q9vUkBf=`EoD+zLiak%?*h~MCKC$zg8qatH?Zkf&Uxya%k%Ay*-Hgo^8 z=xQp)6n)x3>zQy&2OZFPqDlqV$z1VQ)xo?x@N4%$8GgM@9DhmLVP#d`+6$J)nQE4) zS@8YiXTY8g-iCfPYWCZUjnTh)yfBb4-CIQ0Rw6H!h3y*jr@`KiO%EWHnk+2&bj2?% z=H6N3`{TXN*XDn5WXTzIHkV|C>?>L%lx_y?0rz(%TSt(&gEF;bH1)1*w6uU$*|2 zzF499PdA>3EvXjk7Cq@ASo zi1v6o4}q0X;DD9bm%m@GT`xXkeH5Nyw^;xDCm61WE|8}j3oMNW3)O0_hUSseaYc=J z92@K)%UgGFcsm5S-R94Uo-G%$E-USFI`NF5{*pG&P(Cd(qC$Z;FN#U-flX6~IaKV` zQQ+Luqs81bRN7d6X)@tLU%aMY58R)TkPtAEr9P6<&R^BV~rQN!TYu z{XbN_1y@|rwyld4P`CsQR)rJXHMlzjcXxMp4G`RdJHg!@LU0T2?(P!c);_Pjd-nYY ztF<-ToMZIS`#0Eb%4cLJdJHV)1lW!d;;?GIe`?0oRvk-8lx+B=z}_6=m{UgzTWz4T zwQ^5c7T0=n^|_iq0H-2}GF5|jFa$-L0?0xGuXJZ$v4&zuj^2*Km;9=cL?dj}yeS%s zv%Y`hUc6ztsPykM3p8y|1b{^1Dn0(&0+9ZIH35qpET+jS(s7wx^6FtEGD>(t(L`^` ztZ@kkRVZ$fYjLFole=P)ozQ|pvK-2dvx6IJnzvSw2uNh_<@*Hf7f0kxp)I9-MyWmc zXUxW9Q=rr7qx5aN$>3YSl~h0LZ~K67#D+Jk7_vw**%%w7by|@Y;m9Z&7%3>}l)to} zXjG^eN1CSJ94T6RAC)xZlWR!e;_pq)cJq&ykrl~3iLdH=*&R{!zYB?(p)OJ2K%npD zDO6XipP&FD09!Iv&{He+Ig>BZt;%X40c&v8cOWi!OaKfFX=zRpTBWSd>2mece}K0? zdF9=)N;uWjl4W~KP};mt;m*Hnv-PgeJC3Y2G4(+qwy}vii-{eCNou;)i23$I{d926 zY;``U)_yfdlJC|qS3G!v>S^iRVz%dOx2I>9E=BBq9Tv`X1V14GcAMYfdjBBGmYfY@ z#e>Li{g*wrn|_xQ9Zc(Q+t)7C0Ug|$odg=|)YwN^z~c%EvH!I%K{`CU|LO3cK|^wH zH~ft17Ig-(r6Gny5-8-SU+jM|2E*vdfsIWV%3M%a5X-7gTa*KcA}AqpPC(; zZ99=&Dl{Uo)Q%!J;xfKJ8GMt-lMw+#w5bNMyBm9dr=}C)#Gqwrcu9;8w ztg=?pUu-|u==4jndixu;tMpg6Kr&UI^s`ofC4?=AyWYA&g}h?xyz+AcRkqT*v$TDQ zGZu=p?z{7C+9z`AB%NA68aif-g=WX7u&5#tQ4W4A?Vp@w=la=O$e8Wt=N6cMQ%F7M zYV;h0*nV@d2jdIjI%0(m9uX{UMn^8D9>w8m>gw%WJ=1Bfe}!RyJ`pc;7A=hX)o7wZ zf~1cY(fOGL7iAz~7D;|k6WOH;ni0B+0wxBr)9i|w%;B8Hd@p&-*(N&+Y8oz&JoJYU zRql>#CoKlW%I!Ln=JSPAhKCc6#Rv=mz;`mf0l*`_#g?KSk6MvxpIFZTzy;fDgx`N9 zV35Ip#^Po6Mrj8pK={Mr^ zJ+nzf}1Vpvi$gQ<4K zeAUX!Y2@{juiez@tIf}g@om@GiwFM>wFA3-lDkdYo;G+>ThHFqPtC~`m%n`-Z};vF zqFV&LpAl-_Agi+;SI{48h&#JI8vk*4`+iB_bXuMonfmWzD)S%Tktsocka0n^fk*UP z>D!GXk;;~D&H!`dn6o;(Bp-Uf6n{OIk=51gJYq7Pj213qqA;bGjNA7&b`jPYxi0$n z+7x1%pKb8@D^0(C|8nsYee5A(S3!1R32IC8On}$YlfBO zzCgBoDgrM{T%LrOynkyL(%c@$Zd`^P++B_8P`jL0ZIBLMLm!=fYvib@` zLf2}B(1GULK)GBuXxUdIjVp#J)~aq_7(>tZsB+uVsh82Kaiqj)zPQ5F)*{>{Ud&TZ z2{Rk1JZq{?P7bB%4(&%;>oJ|*QzsJO688QAvn?dVA{q%EiaM+`IP7t)B39uuhwLo(I8_#T?q)%9_-HiprLL7wIfiezu6|M=O zn)kVotKp5jHjSW>_u;68tMxa;hR6+**n2mBkzCBCefr5=h&L2W)is5gsP(?c`JqQ4 z$IO|?B5zD@IJ)}oChcZEZfLHzekAQ*Pk4y-JVx%YV*bzUBZ@%`G)MtP0ez0LmH5+c zcxf`W7+xfYC37BF%lAW96OHM|b|7oB;deSXhDN*G%rzKfvEd>dPYazlIUd^OMZG^8 zAl@IIZLlyfn5{=w#unp${eRf?KHvh;N`FPNEj#WZP7c02z~6Ab^a)7JZRf+tEcp+@ zJiM3Nu2bPxC^yVC8a>BOKREc4{91XTS>=pn%1Lj$IGt{iV(`=pl<@BxQ-3sSyu_o_ z)rEKN8U5#>97TvbbAy?8BbWcHOOXKyi%o*LIk7esI_{6lwi&)6$(r}gnL*FLRfo4f zm+yBAE-mj5M-M5a9%C0>(-D$#tdKF!f6wsDU$y_|lve&wAp5@RU&pI+Mr_aKQNPSO zOEauRN}^02`kCnTAmIyIu?#mAhkqJ0EiTX^J_d?68Zb-oMHlT*nO7yxrj87_GE|j5 zHb{_|B#_R)T6_Hq7U$`3u!cU)PTv4(fe)J7yPEbKtG5@Qu+caao8EabweIs^@zzZH zJ8yEk!cj?UuBF0ebthmr%Y{!tv;cXGQZ;=nm6@)=x`yhnA;&X78ij<-a~x-hDx8Al z7hEZVk|vGN-U^iW$i#p}L>tG5c3Wt1Rpk#|cSg0+=Cjzp2I$j)5Qm*b#rjY6x}$(V@#_=sUD+nRAdRgH$NCuX3zL74jOsnO}HQ=NizEM zF`%jaV=WF>!=Xn!dSD8p9U7u&o@cUk6>DAFWdLknv}wD7GyM={Z)D3apC4hWW#dNb zN;U-%!vD6VX8%e(NMWBU$|$Yt&cEYd5rjL94tBFNeM|5+Uw44bMW(?Pp$Ka|OZp|g zQj$9ODkMy^J7em+z~^JN;(}oPz2{F8_LlA*plopc^8$zG_)ZVX&nOm^K%GB!#5BId zVNW#}5eyH6#z@vZhUJQ)V^GLjg~5>W7LWp4 zOw>-CR{DaKl{2w+M8}pE>^A7L_z)@5C)Bke*HNeO5d@I(z<|EM9 zGe$~u@ps$i|0=ne=cG-LmP?dM1OrflvAFK+)~rcvN1)tHPHu+0HV$K~GeoSUrx7Oy z{l(W+(xiTf#L@3t?3J8EBvjYkMP=i4^u?R-C->Jn;tNEs_XgN8lp@S5Hf{?*DvaCt z)o-2$vi44xCcsraC}T%{u{iEiIoTh0SVnmnsyBrkI-DtK7+4csTOn152x6{EU%Fn?s@S zB*~TnsU}7l9;jZO?6?b81OO{l;N6-n>mp=S%_OSsNrcf08vN{~zSX2hj?kX2kQ~pX zVICd7VU8jyvJx{K$F5cLQijDaApK$Y6c1cg;($1Ybx z78r_^F?I;=lDo2bTluqnq=@sZdB4A^GYI=hWwu+4nuV8{m*NiJD#7gXsZp@)cH?GY z0Md8)yj!?B?!pev(|+QHAQZZxzggmQyO<_`05>?q%#LMIUm14lhXIX-P4BBKzdcS~ z2i-oT#mqrU=9y4UVUH@WKVX!_HBcidabn*E8b46VOv1_ZzPz?|Gxl-kTLvg6Mn_eZ zCm7PvHbRLMK$wrishfa;BW*JROBIPKW`b$E)j%0!?;ECvGK(3f&a8-5A$3I&s&i0b zY32_)xY3ik;7DoF`51#7eTH~xd?{kDdm_A=Je$pCsAhe&KpOU=We+k!G95>OY#`0g zc5KW$g-qKS1!|h%`A}CFkSxSqpV>LYgI+(BZnf+{(s_0D_b}k9sLl6z_p zcTkR!EtAd*JfZvjET;#)uB)9Z*O=vBlFbZR(x|DsiGLs>5kj)oxy=IjH#y@i&{W1X9T zRs+mm9F!^eOr1B6u76V~6*VFYpDf08R;`4$JV--CfE!+LHszI8cvk7>3>%>|t$4U$ zf1;ibEsV-eV$9%^Zy;nNK2sEAX56ufjq8z1w9B=R=f3+@!5;`3oBO{{Fv&|u*fi76 z2^*mD#vsHg@7=6@QiK?R+XLk~vS40^xtO@x%RIUKocLsl6aekY8He}ZzMRv-=G{VR z5MYTbEJ(8@D6jIyF;Dg!FGqcx)*jA01H(OjDqQ0=_9AtaogG!}EM0yHq2m z>v<;RQt)vo8xmjLp7+rRsP|}nanl@{!tAHQDCYj}l=kvFo$Y^O9#xiou<(IlCTHJT zT1K(SV|o%LIXNp}`U;>^=E?2WiuFV!X&hRsOC+YKBE?km!>p?^Rl9P-d%sfxZu>P| z?G*@kV%zz@vb9Hr+xzglP?b{t`OQTYCVV=U5G1{+oBbup0;i5hH@LFC7;dlmBG*D> zkwP8kD3wN$&n5vmQ0~*#Q{DLS!UrOKujOLQaF!5c?T#K>S?;#asLBoyB~0WpIKLTZmp=zn1hH`3hCSKv8wA zs2eI;A&e^})=+YvjR+Ad??WiJkPOUsq0L8cw`B_CpOiDup@x{V{i!KA%OD3pSlOzK zok+Mui&q17DL>mydYxX}QkES{7OLh!%!W~Q&`%*D*K}mLBpNRe4|fmoB^ zLbkPOQ2>HY6m-G?;Q}LH{LK_xOv`IE24q*@ablGcRMP&!gx7W$q%>0bMe zG3L+;2PYPyKMIqBSruyXLqMDH(ri9Qh-C;}2x*#SLCKaKc;C#W|G+kwRc$eF8cF+9 zH3M3EN>dAiZR_M>hquvDPdC|QE|nU?$z}ZvzAUn1n8`AL7uo7=w~5|lo@U)3zEs6GQ5JEPxSe9$^cW&#{wNBkdcY^u|4#7(d~bCbwcPg z-=i3P6-kCV=hmQq@&B`9AQ$Dw{C||F*)jz2AV5$k<{XB?KjOLBnu~3^Aw}lwqg>z;}XB zz%&%WLi|0?-W~1J9g!2hFj@KK7Y<{yMAM0Pt36A)%#9{^6-5E}a}BzxkP#{aPLYMO z!9>K4?O8`ZHJHd7F%9?r6!GlEBMc39V&NrcWgp2v%_xVk0C*r1&?}`2P4$(O$HFs zy~Kno8&dItyGX?HWFvEsC~AOq<^|ca;+hPRvGCegSG62ZiiH|5NyY9l{KVc#OXJ}6 z<%<3~yvLb`MO#Yn5AvHFOWNC>vx0)uM8NrC&Iom!RwP=6!o74J zQ56`(G)uqrzIWO;R2u^YKpvbSMpY>5!cjA)GFgG4 zM$Z)vBbKd-9dGaRQ*>UoPsPNE&eQV9E1Ig|DGd$)h)fnNgYC(4MnU!k@vp=-YwKK7 zOwTN66Kg~l%$+bI5^ud~?aYZCsBN?F%wDcoGoZ(KE?*o{DF{{WZ~s-|JaE{?E<{a8 z(ka+b{7Y|D!fGJ4YitSC`yjOE?`g4oeY~T+w3?U^Llm#V8hQ07IVDkQMmSjNtV4!L zvuKX`!QHOLPJd_j$6|!sHLv51OfG}g$K8slji>9Ihie_z)_-4Lt^h0)CogS1|6Qbh zB>%^x-oyx!`a^+S0uEOwJB<=yPJn}_K@?FBL@vt;1pFmEFT0Pnwekpao%H@X;5Uhw zEa_Trt0IaSeC!?U9m!LO(kw<13?k^o4TaV-#E^)z1@96({lk8?Mdeu~LtEZToD=&Z zuk{7mHpWmnQB}VsP?;z=m1~VQiwH)+WS!?ed#ss}Pw3pm1ACP_`yk!<`q{K_XoNF7 zVnbhtTs_{Vy;<0BgF{|COJ*UPel4Q|Muhs<;KO|N5%ud zEH41pwl+kmpRZ*K&B@IX>lj7nd7ES2UE0Se)(-uE6m5L`f9ZX>YeTz;vq?aFGKZ$8a7!ivx(w> zY{9?L^dmXyqDnGTCa70l3(8WiB3}=Z^|AV7wUb>gdA#Dotf!fl)lwbeM_Ubzaeca<_te!8n$x^M<_gk6B|C$fHBmR%Sak3#4jR@p5Vzs2WdLG<6=LW4u zF(`zKNij@L4hZy)lNBb^R;ki^XE><@R&+v%(StQ$N->Wl0?CvLBYKSsl_!*b0)C&= zv4T@Ya;c%U{8A9N&YydNk~jxk#uaH9_j6vUkM%u&WqeawGw|4nc7^^vDq?kZ;D~2^ zyf^?|IzpCe`7Oz`Y)YAef@;h2P&t(c+1k0~#&T8nOAKP5X&877llxOWFtIFIC=K7w zcu)<2{@%ZM(xeWK-u4JU^9^522nF6kWFP}h4e=W`23tsj_(2Z3)FJuMJ&@$i-yL;j z#4PA9Jgmg|pzx|d2@^eeNGQfD)OXz5-_yhUm6)M>c+S{+U=v;HtE3pupM4gHUPF8qDyeox(@xF1->>(WZ_zR@ zJ%qT|n$Fz!b0QwE6Ue{*b55NW5`9R4dsy#T+P=&RIMg)TTRD!GNvXovH~D!cX&I;8 zG@RLDZPr~v^mpo{`5W;{bWM-_2jX~G$jewWPOY0VoFkuMi^tfV<6ov%Y!bqG>P+C3 zsg)g%^?0qcZKU-vAY@^=z$YV+f&rsMAxSaFvN|M##{rA~>pX<`w%(Edr%<&5V0!dhr8J-J8u>MUA8tH@ zZOK9yN6{r1{))T(N+Q(Y*=-jthpr~_j0iurXmw~JNV@mFqx zb0fSQYPx9KDR|Ys#V1fj61LSC)kJxlB%dyJ5TNU@IQa*93n)e5Nakp4Xu6kh-i;Mj zq1A@UFnkF9Sal0;gg%}9-p#Q88qr{q; z68n45a+xPF0G;1(%Qnv`MYA$uCJI7bpz9tdJ$f zMIelinJ`TrR*d45a=S6}yfL5IBiQP7IZ@$3^6zbXg73r2$#*}kUekZFx0VaiHM|qa zy+$fYg8cC$+u1IkT zF@#{;-_*7*_I8HKh^y?6zXjR2*}=sqQlp>sG9`dfOB~bF;}-hQh!D3TSd^P? zeBCx-s(IL=ojsciDYGnUx(f=*18n~)prz-YEf50HxhqC+=Xw`DX7k7d=ffr#3$yu{ zJuDh_?nW*wV)gAC_7-X^kU3?w&e~vtsVGtMMf5WCz1NdR1*+951HR~1)_*d9O+}>q z?9slZPfs?{oX^SDIzMn~3NGlsVpf()jJgwPOD(Awt1YsG7E+8?AYEg*2?rBO;KMDk z?tp-Eigcu#w*_--G09nQL&01Fh^?e!Ex`COFk&CXrwU8 zwwfE|1m(gs{yKgf$ivj&h+$-`oLq(|!j`TEV^qGY4Yt?XnD#gNE*(@S{_v-OS8piq z&c}8)Rdo#yNU3B1rBgCxIEcj|W7cWIzJI<6!@p0K_|F<>ol^1FULEK1@u1n`NapjZuhsJkjqyz}>4e389^8RG(PN6*SW$I%RrRRURRw5c=7kTN z5TLUvfp-st5!acY2{gQ}s=#Fmf>u%X{6fc9DFr4=0{x8yvzpFa@9cqyH{0I#UR*o` zT3^OvbM^cVUQQ(;9L<4~hnZEQnpgh8TCibw+y7>B8{UNf2g3j-4ejLu+FhPFKTccZ zQtVmN0pxe7#fbyObCZdFjG#%mtlk5NZTo`d>DR)!WY@O$jT*t7! zjbM;~c5&;MLAlE&UjrcoOSa%XD(gaaog+6Rd2g2$+y{RS=d6p4u~56k8soNETg`Rr z=xSRt5K?+W)fbH}&vD|iMRRrP%|$Jyy-= zQ3gyah!0yJ61l>cf5)BJ3#9&%+q)f}DI=kE$rOX+@`c$nXj$Y)A`I?Jbo}axJCkKrc?B zORNx}jADQgjE`Ac9LV6dbs^;WA@eGPplMv+ELwWAjNLrChyP9UjM$OQQR%ildCJYb^qe;qrh0cqTxdPjQTy?j<+MmE zqp^{cO(X|^YM2P)A05st7Etk2UWh1Hy^mTTJ$dI}Ci~So^9VpdpOGmMLI|LGV;7Ex z3GB+jqefWWMQ9<>3wT)QfF!vd3k!XyYe+W)-k)zyPC|Y|W=EK)MosCjOaEQ@ZT+Y6 z>s8qZ4|D<#EI0YS{C?XW!Q*OH%w?_YRS3yG7s5&<~i=BYJ5yO3h5$J^*r zjne&+e)-Z@9Vw-mKR98o>%nPA9f4!k;FxN-zei7AVQDR^e2kS+&$6Em^Nh{1? z^L{y22+Kyau_AezhNa?0X(tYPvFY4l2luU2B7PWCZ;9ohm`Vc?^Mre|1J#9EPK0Cw zaiQ+>x4bZ$%QVv)gH@I|y|soU*dA>w653WPnYoY)L~SFgVWc9y2w%^Sms#Z@xw*_n z>Kf@auj1s%_6}pfwsnq3+4$J9ISw5)!^A)}1ZLbjwEYVfD`HNA8Ny&53X5@K@`zZB z=(6$1p;x@{?eut?tf^k}Iyj8rx_ocs<9&8(;eAPO|NSYHJCxZ%GxvOITny?!f%_cs z@GIsIGLiD<6Xowcc&Yc{r0G}_OZF|T@B;zf2{Z6rDs?E3H^$9x) zUNV~@5^lx6LZb8J6~@}|Vh`zzzXy<~65{pt*gM(W!Q2vTk*t!+A_dUGPCw-q;WYYn zPKz<$2_ZF(+|wqt-E&36MTv@WE{1i>VXW*b`ONtU(wC=Ncs4 zZs%dEH3ohML+BcdXdAjj=YB-E*NAX3Mh+~Gb^m=&D*vZE3}h)~9DcCmf7_XS*xeM! z%=L9*D9PVkCFj+2Ju;H5fChaJ-!cm_{k!?^kF5xo)tB{nEK?%zE|hdOFGpW0o(ce* zXF6;S?HnFMe)G)pq#I-}unEeI?Tr@_wKud!{#<;0Jq!~x{`ICvM@4Ta{OGe`)jaK# z$D5?#3EqW&=O>)Cy}EYCEKc)d5!3U@UmkWXzUTfOzpKm|%vpn{>rd+$7Q6U))4n2c z%Fg^!+cJnNTwU~|odfDc;3B!>Wn z;qeJ^slZLAcF36wz~xQe(UQ}HQ9(RGl0kP+H9)E0qvKK9K#@QjX|5`GhP)Jx1}d-) z`tT|Ifj#SR;rN@t1M;kXdbW)eo(G*+!CDW^L@M`6y9YLr0 zUaaNocaWK|xrA~ZFq9~eh)=4Ax-lUAHH2>WW^2#&awS_)gX^NJgTL)dc&`1TOkzmS)SyrPhH3BTc zsHWmrJ4WCr!wZCh=2$KwRz?A|VYIi2*`}QmO${6Zind^vG=_s(kOA@Ikkt#NEBJkfG%Cjq~z$RG@!Y~yygh?0c zj{+YHrl}9Rh?$Qcr_!eG#WI<3CA^i3wrPS@_wb#xX6VSaggxVKPxI9Rl!6A0=qnlEsSt_&9ahU;e<7L;}71!3aCm6V~iNb$HpXPXKwaF7Xy zF2N1{z&?P-?v+izK4AUjZmU$QOy(6-kVYqcnUV!yZB|Od>HqQaGclP)&0+xh1>I}G z)9KCVOA-tPim6a@@EYtc2?p!51qcL{59=MsTTiq1-S;0-WTdqeS3=wFGSEE(jx!3* zr1!5h;+MyJILpg_+b}gsj=RdHNa1-(e2AtK@wX@fit!DQ@Cd6VI~yvBErHhT0t zxY=Sm(NNSh4hEos$McMu1w}szQ2-AWDDL~c!2POCjuSu-v#xue_!uIZ4qfkk**aM< zNVV7rrdQB>XLPq;Y{Iq z;L?M;5dyOT)UPC|by|MAv2SCbbju03vm4=M)gR!%%O4u*Cc8M^~UeC+> zw%F%#^XB*50Cl6V^N}>K z?NrTGQe5uW*L9y7zlV()lAGtGw*m1YaR_}>OvEjW9_gE0rYqK0&y1!?V{jCp76e~r zo+qq#qI!wG2Fn5qK6yvEiodHPNZ^8fat-kn5aJ~FOake|ji(^~qkqZyO;_}}O$?rD zySst6?3rXJb*>+l5wYFx2UoCDyD2W&t zS8NPgC|PJ+C^zN8m64OngyW2aMRLz7A+8$9t_aBmfTg&xu#9P=!#xQ709zNG%&*kkjVVu9*{;Ji?7Jg_MG+Zg408If?W&mVJtLNsHdD~8z z*f}~m-WZ8he5~1gH~e_X_IPkudsYkZyve-SI*BlHdy-z_^ZZ_mA8P!)E)zUp8_+C) z0b~R51iDaX6*!``|Le-eX>dX<&m}|}oM%b2qniGc0V?k}`FZ1}QqJR1=GQYutcy?Y zyOTid|5>3}n`C{gFsS0eHs!11n~rABVi65_*j)9YPX3+(;qz?`{uHBwjsvISop{;s zqA~=emkI$)wA!~KKG|Cl6E9JMK@kGJ)uWRUKjX`U8u)z8 zNd~B16h>lx5Oyzy=?F%WC%#nt0}QDiA4&CE*YiH){qA&mosX#5^xS^fBwqjORVcXe znx}IgXNmdks6&hCe<3b*&4N)7fn3p&SUN9qfImw>D%bByqm;D!b_H^>C+0d zGf-G@zW#8PZtv?DhgWC|Yx^cCJ!r@@UmVqqqnVuza_{>T5`hW+*(hQzl_t#c8R`>U z+bQ(!b6_J$&;)SVbQsbRP+5Q3x0-V68>w(yEOh#P9}tpmQGr=5!)`OEF!MJ|m;b^Z zx6zy}7R^5EA)4|_$60$q+GSnCjG*x>KUA`mt`q5;R0umYMg7nE*QDagA0Ms@eJg-l%_CPKx|d}Abg;4?3Xg{RGtt? zzoJ{{5enRY0%#=}5G_akXJ)8KSDTD!ZbTl!m(>)V!Ie#Dj{0D`jW6RVu@ajQf!Lgp z+y|yLA>qtPfHjAruNSw7xDe#txxz>Cs8|h=LAoEGo({4VA8OWL&QJD+I>vTwdX9h8 zbm7I-_{ojEOBb{&p^~ki}(;}P3Iaj%CABv5R)7$VyltV)#m1I_ZG6j5T=wzWV zR$Glueih}qK!m8~$#{8Kn>T!htHzdK`R4qb4Fvwn+#-}t0W?KE>|h}gX1{;D?oFkP z(l~xw%?#}Qi%!L{36xgaa2>{%d_bzxIaLIW5^*MV$(1p?(uucuN@lO`ji()UJl!uu zaDNIUFfL(?dh|{I+;7L6(8;=%q-8SwlYlxlEr<;KZCD-4q)!XaEHl)Ln4!h_mF>sN z#QdRs!24MRQ@7jeD!RYxTQOfiN4wM0!H(xW%gYmhxR_Zn{r_8B@jqAP19c<8(R&pA zH5EV_nc&aq>Xd-@^VvC9Ps8)xn?;?!_tGQQ122fmjY2k$ z5zUih&-4!pX(Pm;lEHn?!5Obmybwa7nh_$A`}U*7gyU!FJ*Q2k!cJI;z{yAcNV(Fe!y|8n?B&E?gr1i!1_(-JGfh9wji`gl3c11$`wPS4fkA~y#r~!W*P!yMh%~XZ8?Pc~+s8s) zzEPzkt#mLobLWC;xwc+&rk`Zd=1gac1A`Q57xBpthdDOVF3FQa8`E3P>h$V9u+dRA zEtrPmvEfW0^JGIIF{&x4WaCLbxbfjkAVJ%|}ZmD0yhTo1;hBtTZlq~+$;gy)_FGuU%w64CfrK_@rn z(Nu|*q!#c)D4f*n)DoZBW;x02SUoerXACTHQALwhGA1REXBB{%jPY zP(t})fq|Hh%weQeC>xCu>rRXVJ;a|n$`-pjjD$6@u$8% zsrA+YDqGyBWQ2j+Al+1&Ynayd&}asrPieeF5-TS)Chdxc&;pT|zD6p4s^>8z=IBp> zlY*D0MBGWm9vDZD(_RyMFFKje zk1iO7*wbYJEKr?Bdkry86Zp+BMi?<6TgP7g$KHd_yhd!M6ktrUe2fe`P$bY*l{}x$-&+CXXg%z zKiVJlANDV~MpXPa5Z|uZVGvSbN;WGugM;~EPItGj@usrg-aR%yZr(h)U-u<11@q3m z-TVTiE8>M|!6MVkvr6|i6Z7AZ^lzo|i0HpZQIQ<8`*4;NVbZi$qHtp1TeDjlGM~D^>Qh8n|B(I%E?t-@N)E7m`|DZfP>3e|b5eoRaKY~)w}8E~(q zb6LJE`{|=LCBGGARo~Mh4Pu>&MY_vs^O=9^TFBkX=ATJ@kA6~gD3 z!8ewO1e8>!r9d}}dBM5zMKB~c2d&JiMkv=v{*4re8KA}>Qf=KGQ|aK0JQ}d)}y8<^U{*m|bj~`DbDM_xL`zMYNAA57F`>vD6>*V2Bk`3uOvB8^TUBFYH z^T*XdwSnIfgGNtW#lWA&B|*_ME-W%+OpoS4+|g*;lRTlgJ>1OD>|5 za1nMpLooL8&(C!_;0iLCuv{Yxnd!b?arsE{M!GE-N6uPV5-*0OSN=kCk&Ev9w~B;U z$NN2|zRvNdBV@(Uvv^ZFW$puxIyAa}ilds_xv_ITFT4MRZ0vJMIWo&QQ_EfK!7Gd| zT~!!UO7M-HtGYyB@_`K+Yl6Kaxhdqsh>$=MC7MPSOGNU;h?lBO#XRKSl3tO~787Xo zw`+aw?_#>>yjkPp(r>%nh0GFt{XSM^rrNuHBLMHDfWJCe{~w!MHxIdDzJ8dDZyVZFq;$pOqBrI8tFO8kxGeM_wFGAg(8hHpCxpTT$ zdL#2+Kd_saau;6^JWoavbw;1N9GS>uOtNYRTU)r4g24VUtLMUS}FN`rW53~(iG$=)%+?5s}RZG7iVwl8ih+EuIP}}6z@|JO? zTG0Dro$BgzUPuoHGGZAiFeMbaIA62eX=ad5Z|>k*2sBSF{m$E{Ypi^TjWoxAxL=j< zyJ5f#R2!Hm9K7{8QaY)FGTgNYb8GVX_r5To?@1;FIRPmXncOi8+7#goC6r2}12S=@=KGNn+;> zJcU_5h!94-S9x|;Uh^GPs@hriE(Vq6qXjDm2y<} z^DEmX#2}pE`UevR3|+9}A9OPt2y>TL64nuXHjkHtaazG~$?%`7gLoinaBCl>9(_+1O#T z7z~uet7OS6@JPvFW2<*#_e=kI+@=3zSWC`F=Aysv&DjY0qXTgl4%u5yWDZaksp9wA z<$piiu`4L9ACalEoPcFUPZw{tfa_Nc#emmS($0^+r2d%#Z|7BXewvkJk+Xrl1eijh zOt2ae6cCI%&QLaeLF!lSTIh-k6dC(nouAaW(v~_nf2O%IsFqYDQROKLB{@>*xBO?r zEoUb;>tjoE?a4|o%0$HYJ^&?&q@wNxE>=6#7Z)l52vj)*XJ-noGe#72mlUmweFXzL z5zXQn>bZRMs9h&5@FG#&sCq(?`7(@yO6;yWUxd*tTs{e!+Yy{;Kbo3R!_bgJm)or! zmzz3_srW{Wz4vcbakn;F&Lygp%-`a4m~VipD#JyUbiDbjPGKaBwARiAQoT*E;r5-K zD#SvA{l7eB=B6?faGFMRQ$e#jCT$ae5Wghge?FL9%M`cn8yzMowqe*u+#5E!tR9S- z*U8-dL(uu;>5U z=JNP=SI0wet;g%N#Rsy9Ua$HgVD+5T4xs3r~by$kz=ZGaXP z55kDa6hDbG3AzgjE)OLcCeq-FgZb$|QF&$J$kLN-{1}sJgTFlX)5|Pk-H}=@e}Q}6 z)1UDlg#+nvVI@3_YQw$O3q&)8cITY}sVPq52tDg%Y9DsYvCL?y5zDgJxH5hvBFJ{j zoxXT2(>KdJ)TGvxY%;8@*$@`Wzee$=p9^KH251q~f5=4|fAAr$sy$rCY)4J%Vvx00 zSLXhLWe&7ro-|MsF0LKc#}C(xI&fJzlSxuq@Qas^+nx_Z3+ZPavs+=aAUlG=7_ z64PUPV<}Anadl=XwBUzXSq7S}Q0UuI8Ka>~PsExq1?=IRUsh3IEe-;mVa@U}V}!eM zkZkQT)pzFvUA81<#V)w{Z$-E%+%%VZIh>BeAVE6yrtEOLRC)gtp5X=a8VWS#1U$Ip-AD)hN&|2yu4mcz^s@nyc03hx2PR)rz1L{R3yACDeeAR z(8bv|EAwzr43ry`*AY9{#8E<-4gAT%^C{v9h9jKVb&1<`aV?IWweaxc9 zcAc;u0W2mYk8de|TKqK!6Td)Ul?^8E4cR(l-@bDl{M!(ED_kp$aq)=%8nN34@rDfO zJdzr;xqR$acwBruoSgGr5^c0TD{!~J=r8H`#Vq;#Xyq1dS-}vQO$0`?rZ+iRypC~9 z3LPk@@D5w?8!I4h6GawHA_kvm?nAli`xz5sh=8(b!sh%(C~-gAyf$Om z*kJZ-a3TG??%=qQQu$!UA9t%gArCF9{`!aoTyLLhX0RW~WaA&7`Ey*e` zYT(&B7u%lFL{nR{L0rVcEGGr&1?0Vp(Ughn5JHG>Sfl@T&$j7zUFy+&evf4;;m|FAIx5k$x5D}lhy_F=pSXOq)Ta~8tZ>)i|l?V zy*IBG26c5SJGsJ+&OX;uu+fx@Sf;>rG2^Kr^|a3ft;ha)Zt-*9E<^LAR`+#x32Yk{HAJdsVlQv(n7zo5UaaouP4s}cnuGS zP*vSVP^^0_A#vIa75;(k_T}BWUZz=NfDkxeJkKve8cxympZ-0)H;|Hi^*mVr4e5=U zs^*+*#J>Zc-LUY1+(eg9FkQ?rr>QoVy8)0NO@zyhjp9I4N9gFP7 z>HAOnUoetTW~`MYjz|yRIiS8lI2<7!N9CkPH%E)n9KF9Cjw$1Dj1fhd?7QgHgcvcE zWmQUUJ?lv?dlw$q*ee*$nsR%p(yU5b&egmCD zD0XHuS}6*8(-BO;d&!uv;Qm7Ad!QB|2qqMO*sIREkbG^rwk54E+v&_svf1{0 z_e|RPF!P_og-1QL@p3&=RUx>{r~St3zTGe#@$Gvu%`8#M|1KWlgbbV@B4V6jKatc8 zSzM;h>6HKDIrU}F+hQrC*pu@Ka<4Pz*w@?6NPC=* zwnDU)v%UA*T)lv&f3I9QUhj(tEf;UrA4BH`CT>^I3>vx0F^W+;ZDqaENbAs-?3WP3 ztXU>dtW{J2V$VtEA&%UuMx!xJQk#<_Tj`w@n?ISRMCH8u!G`TEy)h%Tl>hVH3-%Li z{_MB#$58RO`_t~SB;opQtvEq>O->e4YH)D_L+kv8`&LJVl+Sj0vFK2v{OIA|+sl4c z5i36^)FrzU7wGW6t{>~1mSb8UFHLBcPXEFR(;LIBt0m+2ZU{$D59OJX6Z(efmqZ+g zbok{7ZSe*hmp1hS_WKI|4^{vCA9>U*4WJ#{wr!geO^lgf;!JGYPA1L-6Wg|JTOC^+ zO{}^7+OI{I9z40&c2vHv=C2tm0{DiCt^`dJ@0Khahqt zXgam{uP7_$ni zZwigMZyq_9u|G~0dEh)Y`nu|oqUNRyyZVgSZt2)=3q5#ye1Vu=);*%a6DtKSgPfF? z(sK<^ERbbB=&eQRd--ybD7#e>!v_w?0A@ipnN|M7YA1x$rbuLJnL3KkkSGCWd zu%M@s&(onb*$+TZ(DUiH|0|FnVf!WF@ztHgw!AsS)O7vD9$uB(89Xs|D@;|LY<~q%2L!a;%vp$>{|=&xoDV=e8DB zfWq2$AD@UelaI*9a!yc1DUJ1ZF(vQ@CnTlYWqfU5+Cp7yjiiRSpv5d$Te79)vqxmv z$?VSm?1ktyXx#MVsy+jUOPaJ`MVeLMv5D9p_4m)FV8pbT6}*W`PHfZ;C`Rf>CLq8E zafMdU(yjhW0^rzG>6l%s)dD>UKxCSA#FBGZ?VC9J@;m~1$krnL{9OKb^I<6ZFGMTA z*VXy{_0ID_Q_q#G5XmrHE(+IWzwy6EX?(#$T>+NK#N-EikCQ57IevHBhS~o2+pQ67 zqCGqD7t5TE+8A}R9lw26No;*Z0A(FbwyLaO(n9HCk)<%hG-=v34+3$=DlmkvTvDc) zlUis6le2@l1Aw!L{5d&L$RReUZkf-d4aI5w#N&{sC86%oULI8sNFMo?3~3q~dhcE3 z6Nk(~J?%Ci!70~2Fs>ExMA1vZA{~I}eA=(S9z5|poqZ;v9BNa3#s}JqSID+eVir+} ze?w!3uQ(ilpQDF|fTzwt(FbsJhhe^$B0V7lBJrj{8`b10Ous06KZW$O46b4`fc1RA zIZU$fbBG6S{*wA!rSbvQqK{F{i5M(jYc1m7!qV%qeC1&ozc4y-Pp|5Cd)zXPAa&Q1 zdGQarFhxMCNkJ--s1qRr-&bDf;4Y5O4}#={r~szSoo>rR86x&!t`B&gZ=S&_5O@l&F%guY&+eK6Y*mWbwQ9@n*FaV1h9{#;h>^C<*dcT~SmV z9r3CA9LbL|AV60v=>qDUwqQQNkw5%6bnSN4bihSqT$4fft2<4xZw>HAmi_?tal^L; zI?$hrC2_yT^+%I>Mzn5K*L9HvS1OPD-U(*cCMl1MP033r$odwXI@3oe+Gv9B&MI&jW;Sv`EN6sW0o zXFh09fF@A2GFGF!2Vl#X_DVF>pbnTuND{3+hdO!!b2wyZ~i zc-cRTIq-0d{TbUH+;4h;&FWOwM0y(o8x55X-??4O%h;L(Tg`kz3e;x=`g4;hpKm`5 z19pNgrMK2=d7WS2gR8eK1IU*)RH2M@`7g#fm;g_QKh-m3tQ%V(TK#8!OCzI0g6)XPuWVCwzUVXRRMD}pl_I|Gp z_*c8*cWl^uw+JWZd3%jlIjqvz{n@=XDvN0aK=4?a_WS!^8+QSZ-~m6eys$o!Trm;( zQp3$1|Ic}w!NPdMl81wfUtMQuV@&`m#MY$1bN+ekuoQ9fygpf#$m7XghC(@ZRdzP+ zOa7YJWLVEj)RZT>nKiL}E%k%l{@ps+V{h(4>N3bO2z>~|80M-*i0ouR1AYqHPd%VP zv3S|q<3cD;!y*7r`3C3Y-cR8$Rh~68?+)Gc>s<7+lVzOT;!l0bS?yHFR)-avy+0jW z4lGNJ@Fz)@O{`Jpa3)~p-bWgqU)It644HM_w(|}LykdH@K?>t~wV=~}KYYZ}g%qxK zA*nPV1h>8^<)FbnrGQ&}A&6B%qwj!b!&D-exGUI+A#S8di}s$=94Vl}ei}7nYMR1D zK#+uQRT)2>3Xa;~1;!YgA{QD7A+As%J!<;iy=Q~wx879Zu0`IT5BHE94E>(p*-*iI zx5wMyJx-0*XI053{s>1_%=UPnGbWx!i%gJVl~bT2-9SWwulN8`itY_ThU&-{GD)}K zI(PMs%^u(Ag`k(`FhmA7RhtL@Z$i3={M8?mW=k!J$ZR()D?lqL-2=7TyF-?Xf+#N5jr(S0<$HnE-}=_RA4y$jc7De%kX)|0&KXnUz_uG z0cN#8FF-Jp;(Vikc#i?uGeudB#5MNcj6!bwe^8RCKz0QBeDT8p)8Mt3umAhLM{N;Z z?)F7^>05V2Phu3_4-@MP?%Z6b<>8e0#4xNpB_zW_#7l_wjdyAng)I zhD>ar8?T2!D|)(OWrB|UkYkkn;Rpp5u)MG1xb4X8HhS{-C^T8p0JA!zgU$V1JPH9Ri@g)NV} zpINo%*Wb8Rdy|+yX{+(z=P45&-XPxW^T*iRN^W4<1_7Kn37O$BP2+N4ds9wo1pc!f zZq5aA{vFO0sGo8%4+*!f$%n#GwqYZ>vs+?*&!Fo7=O-X|7iPw0=R=ym=TU~g?Um@q zrJtPBE&Nh;BRP%v_Jw&YI9j`N6S@HXN!)qc;$#spCjE4woh~(FdI>#_!eb;uZTCh0FsKIhnaL`#!6T0zKTu}C<> zG@)?{5Vj0I)ug(VmZ0n%t&->X&^w|+>AnYo#9Wp@ z>NFQaZLP(3(mQoJWm*jEiD*=-7Ca2wg+My15VpS=vk41z@G7|hS1YprJ_BBI{hh9b zX8%3!_K(N!H@u;^?P(YbSR^jZM*TldNEYVc**Pcz3`o;Wh0M~{78Nl+W6#%hF7Tjn zN}CACWLy2W@K@!Pj7Tme7uL)o?W>=-mTRXzsj_uw!{P^Kht+}Fmwi%yY(@8qKo%gl zt0zLKgQ||AV!i4%>nhc1nHRz?nsUN&^w=iE1#0FU9Hq9b8AMaYN(G@eKaxmpzg2mD zwIc|~6lkl(hNf8cW+I-mSe`hjG2BC3PyO020vVU=pO3zk0hK2Y~Q#IRlcBvxj&YWF0fHZ&+a93eDe zy>O+7+7=7!x*rOlj!)-ZN4m4L^66#tJ^kosHu^<>QpMgX+O|1}=uIGu=!{u35COMC4`jh~^a&)y@+A6tD`Bzp_L2hF3{9<`wyYHCs8eF<>I9Pm zxVQ;dNSDCri(jzZbmi(k9}ZP%#xvdw@r>*=P(#3WCu%`eIndKo&LolRHZZ@=v6EVm zg$d6KL@Pt|gd{TajwPY;#jo89)lqDEc^719b+49yIU0S3zNlG~{z^r*0+Gp~kfB7L z7hzT#t;>v$HsVUULj1H&vOj2#uxZMahfpqIp&^UV`Xnc@q|iqK*JO?IF-fw@rD`CG zR6SZrR0*${E(>I@r>P%uzxvV5wV8`T$uXbCOmtgSgR_uz)mt(9F91N!XAX|BhhV7a z8IH?lyfl{JEF~=t8knXm7y+cau`wO_B$|cnZ^e`x3uEZGMaaU_p>%&tlOac!t$iL| zyXnBr|1X6W25&RET893h(g?PmN0;-b?fkWX;5m_$Ih2?&k>j#juv#svB-9N^R8Gee z_^TdT_|)jOwzjOZDk|NH1Tjb@H{1>eI8=7s0b%iRAkX>FUmLZ2yyH%qaaSJ}T;a{+ zPmsddq$;zsLQz{klysE#HAfIvm$T)VB1sGjU7M>nW`W5qH_Mt9Ye{+KT}f$$Ez*hk zb@ftXPZsbnx;QRpV?GdV@{C?pH;`AzjgyRQXM z`@hh&3|p_TmDX9#dx|a1bUI}?qf@>Rj>CAo1`BQE2a6#!F~^VJt&e!sl)1y*@cNr{ z#%QYkDG>La+AvFawugb@tZqr)gcA z(!eTlhfEmXQ>umZlSYFjw4KRFI>ArP(@B$?Rr_>+1b_;=8DOg5i6DS5lK3AxW7BTgF9{%P!;Zp>!A6g(tnAJ1f8)0y7TW?ne%E-ieAn-` zUZ9oQGQ;lpIWhC0SUEY8M^DuMK!SgWSmL2VdtKUl|wgu1ypePnJJNY44(oAeKRp+zb_k zv+CHafX4w-B7757yyQYF7O#_0nXsms#_PH!hKK<3)xxm?A0Z4J`b+Sq?)~KJuDPCl zU9nndUp}{z?-w2jg8P;f6NHsh0`Ax$yxMm?ox8gK-TgA$_5!s(*>^uq{U?>{Nj9Rj z=AHSHWm_6K9^DG-jdj?6W%B=lIIaJIIL6EnNl&2>7lSX0ZzqQS?jftCmFaNNSs3RX zs&aV@bvEx=UyT%OQu7p~$Q5_164Rl{~jG1sncR~ zyq2l9UQHkWdhwBFBwsz17a>g%G&$E)P6}EybED5|v{K=q+ca3UtUAt(3b@KCZ(oIw z7BI#{Fke;E7O&!jO={i~VN;T|xXZ{T*|Gx1Ubk5PN5$uZQEN7J8OE3ra3kqZ0h{jJ3VMuL4gnwQ zr%;6q$bCwVc?@NahSC-N9(_nWG6?Kq66)=MV-$<%N^q?`xifjIk8c?7zXl55W*(90zS3k=!Us~O^8Zol8QFSEQul{*3i*c^kj~8Dcd~i8%)&$EiBaBg8*$#^AVd{K81*Q@W); z@>5n`QcB#t_SuFZm%(;ghaHsw806G5!>>!1WzRX&O7IhtdWGJ!8q1gs{Shkv0PEQUbT5t>zGj|pS}Wrqx8P{;wCfzag1_|xk3BBp|^KxwZ?FZc&Fn5zt;CU z6S}PGt8crfwbRfmdSC= z^i4BbEjMl+H^~d7Dzejei-nJ~X<0;;qbwVL#Jj3Wge;!i8RokIQK)x#W;k88hTn6~ z+(jRC33*HbP;|CoiSWL@59gk5SJS0*JKm3jnc$z;3pNqYkLUi_T;{l^ow#4m0vOpy zU(a84nErdzxtAEs(TL42j8Oy&uG`lhjv8*y#FOppEtbAz7uCUsT4q)E30}%Ih%#08G?L9iwya&4GYo^8H98s>;ctI=D?LDPDlnSsH+&!k**HKz>*SJET1I`uW^664c zZzQ=L7lD65o3_j5mwDRLxsy>?nbd&gGBkXDj&;!AiPvY+AjZW_z)dr+ZtR%Ij(L@= z5evozdcA%^Oky87dZH>I%;?r|h@4%`Jd_!pIXo-vNLBcW%M`#rLihAk+BVFAnQb~jBeUbYjqgy%G=Ydct` z>?^-OqDGqag+r4w%5a4= z5omE-xW)_ELOzQDQsNRim~&%0TQ- z=NU93y63unt=5OyGeAqriZAq%22~;K*m9wYo6Cg;uki*~DP10u&EI$PeoizKjk^&Q zX#ztA zR+|(j&O>;Wx{##^)Oqk0K;lQB3_QgG=#c+O_`?p~IJVjSyBIneb;Iou{PAUO`AbRn z$0i7L(xZEb?u{C$hzSW16uuZaeNZPVh6G$}WUu1;&8I8nw2ZKrVG8>tVVn^cff$mS z@uh@y!lZeBd5?mO*l^q@Lbe;vLK8>b&4T3`~+Ui`- z$Ti>m40E-qE=Co$kn4lFCD*CabbnU>bOF%NBS2h{! zZ2Et$+hye%=&*Z`)YH1O+mcz>R!6KlPGX{H%yI;Ugc;-FGbh{0ODWsH9;A=yOMd{L zv+#Zf!5`+WO%BdQmd7NaqvW8+`sun|rdJXv#!zOK_RxmVoazq9WTNQ7WdvWT^Zfy+ zUA7q8!1(gU>X;(A$AO5RorWLd{fTR81PFwmI4vNhtxQP>Pc~UoIibq&*z#oPGJm2_ zxcx?=FB`V*7xp3vx`c%#$ZZ>`h)z}M+$ zVsUtWezC1JfUxr@wP^A;1La@NY`^wg<$&H^FYk^YxjC#6jc#c(d>jp-W0GoIlNekf z{kwrbo>=Q#hw?9+_3jVOZydErNOH;aL|7r4(EPTznGKh| zjOd9NHB^%NxTYy71XR7Sg$? z*@x`c{6J65Yi&P`vM1OA>^|eJ+@Wx;KXM^Le3Ucz6H0`{Z!FA8LfYmfr$&|cu)EaT zx@p(L#+q{RIgdFH%P76aC(5B(t&8zGa@WnOPXjxU zdi<~>(jNBKIUP!DP-iuLKhmm!9xve~id65hz_?lg^KD3E^)U3HeKK7A#Fl5jk-uL< zCJZ2VX?W4URAe%#+bfy&1?oEy?HY4Kpcwh{-=4 z8~(RG-BZBA3B3tSmtw}St%tX7+rh=~8oQGa&h7r@G&CcEzWoIgk$!k=)C zo|^F4f*CfA_B(73lhr=0907Ht4m)Pn_^zX{IY9#(&f(X-Kj?yeq3|IHEZ-eesvejgW@zoWKe2jCTj=$@ z9}y#=E$rB=gZHoD`K5H|u_6(s>iNkc>|9s#CeQ8S={{K1;4V6C6mL7ine|R2IXE5= zZSYsvxlI>L)R4|)cEi}8`gBkphUF@!W6j-s90b?eox2)*&dw%gwh#73MhdO%Kn(G; z5#Nx_RS%kj<~L$9lksf+7Sh?+iyGSDK2)%t=QC#{Nh4w!YjU7ds8NJT;zL8x3?fd( zRar$>WZ{Ka|3H?dbLST27@WsQ8>C{bplTS#P;?qHb2E+ZFE58Z(fg(mHcigQbP-?7 zPhMOh^R2o9pGF1U4j40MfQWrOuxnAbprwB}JkS zU9+V`(mmhi9*>uH?r-1Ss-Qp{Z!H$an>Qzle+7$-P_C0__P8nJZilBxgv_>qjR5XA zub$bItr13XV9k7ptY?$+?fzmHB)}If9G`uG0nIhYzxzmN6vC8zGl;E2kN-i8XfqTO zVSh2P?doZF4QA%w3~lv0T>~zTXM74{=Pg3UcPVs5sU@eSQ!G?W&Hkr8rkTJpi+I7r zP0y0Is7_Y)B?(E_+RCu25&qQt&jn67z$wHCjS&#av0Q8A8n=Xu+Rcv2G`Wc%CQaqy zQxSEpEvyN}0l)zgGAf>nvVj1>xUb1z=eZrjTH;6RTe(^moDhO?ODaYrzjG`m?Drf% zDiGArO3RWfKE+^QDb#F2OQ*3}dr3GBoDC^wfsXi%^vCEdOrsrLIr30kLmFuz(ZC16YecjwH##0--gvrS zdW!blUXGcwB=KD1^^+&)a(i~~0zQrRiZ37HEBh+Ut_rD9ttuIDI}d^sfG%2^N;`6Z z<4br7E|HDB*-sC_jdd}6u-OK&LC5QnquasX{`1$>VaMk(d{ne@;;g~nJWKFd4ZJ~&Vsw%2`r_?3b5fX}|Q>0TfKZN+CIe4VKMx+IxfDADr zr8k=i^*oAd$<3&?(#D})2@>|2D`X0L$5V{kl3h3tGT#v@ekZUt|B+n4-8x5+9*zX) z_rx14g$2z#ib#yP$Ko)g1=(c0tAP6SCxlK-2vZADQqlI8q0Y%c(oH~#%^3tDIGA}d zY^63XkkD2O1M0$X|M+9uf*XR)pxtf{Z2}Q6t+-#Be2O?~l$fMvYrUyjU-)YGRVlzh z&X=Vif%}41h9R_B1RG*I{ER&?5^bJeQQI@V+@WqxrrV6bPWe3L;!W1)dfS)1-Rmql zb_?{R<-Q_{@1WAd3OgLc079r2WSsP^otgNbdIbj>f{z(=owwGxZHK6kz@~`ji>+N# z`UVG;ax9t#Ra%KGr77g&w)Xb1vskkqn}F_X4jFY>Ca;u}w{K{HRJR4CC1eM7hdzUa z3gz$bQOcYAu?9SWx}GqjkXqP5H6wp7jIQpy?%T;Fgy`x=1}w(GuACVFl4Ww=k*41S zo53qmxNkFuo+Q|o`s2}#n^uU7bEL;i;(Yq&s=LK50>vg4`KqW9S1w3`Jb`*-Ipd)w zdK;pGH;Up@YbcH>^vWkk(3Na$#T(Z>cn5$calXJC)GC`P^>8iAm>$bozYa}g_J}nY z4r~LiKHd!sjxozX~*^l|sV_ zcy!BGcyWnVuZSJ=x*r@}{ymm1Z-2@jU41%?rJ_ZGu;^#La=_Fpv}0HUg7*pt9qXGd zBf@rg=IMN2LGT`ebd$Ofu&(_8_9h}(4+P~CC6%)%UOxb5^rlN_fffrK+B#E zP_iINIRgRxOg(CWmjST%C`YxaG&*m#;r=XGJ&ED&(xGXEtNNNFwY$GkMDqOI((=?8 zC1RY`0KAl9?YNK2Uu6+p;W&JLkE(8t)vFcFD}Ir8B(U1vt#bsrF& zAe{)gRA4N*u|*3HYakZ5-&}X4F!1GF?Fv>2lvq_<9o*Y}oQU#I-P0P0wyH7^N2Tej zZ~Y3^qGD%ORwP2VT|#SFLhO1QYC<;r81QO@XjZMCwaG=`$@JAlA@osKb0Mj}e*t~f zn3$yrEej)^QaVZ6Z2#CvJRpbg9lbXe-{N6WspTLFY=0|c z(`426321XW^XqK5{X?Kg8Z^Zqz6fs^b}0iCpaTesS#ZFb*rul-u@jKFr&p|4y@$y& zHTU{qa2MT}&_v<#&1>(C#?TVLf+3hd5hTtmqk6eqIU_9QkD;S)*JgEu5!U6m$gJ0`3AVml)v=||6bV7d(yD+;o|r-OPs~EioFGU=N3^~Y^5S7@O9cFkw{C8+Y#}p4=Q%-+6W%49?+!@71z(xuw9&1!ef} zd4(yk3K~M~|4#e$6jX`y(yRw;w1aV>SqbRz^*Eyk0+C>K!>biN#ROe}Gi6$3PvThQ zHQbP`H+=(NVgbzLnBtUx80ZA`PezP%$^2wT&Pfrym6`Tr6I?kS{#tF_zO@->rJEMF zPIu`ZK{@$bm!?H2w)??Ft$XW$w}A!(R1a0YD~-;-C{t{DAx1O>H;#k_l<-?mbEKs$ z!2KL5Ee&Kz8!jkyZt*9iU@bIZiE{(eI(l(s3FS^h-R+X+xyRSAiy{`J z;v_i`h5b8#smeF1v7_Zx_Zcg8+z@U7zFV|6LFK#i5KB$Ibfg#9Q~ zczRfRE>aT#*|#Cw%fm^Qw{G3fNT)gQRjoDW1jLAjvPAduU2fc0>6dr!FpJy(1 zZ_HG}-tdl_Gz{Euf|0one(Z@TuAgw_@qzgX1Nj|IHkvS+%gvj1#-Zw332eN2v3^Cg z+Pl{70s0uP&VCwATNP{k@;8B*|J1|acd)6CMg^TDQ1+DD&y zTiWHGU)=tw)>ayv7u3xnGpY2jfsFnA8}7zm3mS2%75K~++;3rPJ+>&Xg6AHe3~?TW zcF*#B*299u(VMvfD$;TkGCDR5p)C9DO6;S%3Y^&USj94YoSr@?Fr zx@N=DxlM54g0ecsn=}1sX#9>K_*J;FEXn;9eR5^0xr^q&x_wowR#}JN4FRCu+_0E8}5aY zQc@m5(90!=|=NUSET~0YI%k6v?L~^{Hgdxrmn^<gbLc2S-_VIlHLprU<@y>(|;c{RGHYeG{GmC%myOjJrlPOcwzgLFr z&i{%8Rcn=?evqM0>d@*7Iqw9bp{t>6nl1oMprh2I8!HfJ#-7%d%*A-e-bxW#L&9Un zB3j?3myfm!64={vgV|t#b+5lGgW0VPTe*50?+>012O%au-+AQ!4m65Ueb@TNL~v;S ze|S0%+_*h`&+{p^!A(9}zt!XtGc@*`B&?%@-V1R9+9<)IZSV~MmMtW z&pYiYjt=CM+=76Df}v!wP$LV5l3p$?oxvPZ_GW6! zhh%pdK7eP4NAJDc6XuY0Q15$S)__!meYBW%aC^P#AKC*?vUA2=tSKe%bIj%>LYMuv0D`ST6Js#y9N9+YqJ#e@o85bZsmyvf@3Drq*1Gr%S*|pNGZ^-^a%0} zsQ{7TBG|Y7a{b(gw$Z>&Du8M~?LN1|CMC{pArZDmsv5@9D5wd{&R|cLg^}EwSfT_U z1jTMv%BOf4|5WK7W5V9pw3|)<2;rUj(VC)VR?ptSMdlcS!?HHJn%z+R{=o6mkOI<=1Xs zF=M+EgZO4X1PVSkcVAy19IT#>qnUULj1H_0mSE`S7mFxxNTmD^SR6rE?Yv*1^STp+*Fs$w4YX;m8@ zZ>BQn`+-Jio!`m#ji1qN;@oN+WT;>YJW;6&CNa%jx6A+7?Bepc0;~s4Ts)nLwKXNxQ&&-%HSi1X+ig%gz@q+Z%b@I zTVVC+5$fs_Vkx4?t{EY@ef5EvG$8QPwGXCLL>ZoB9iqDrasncrh2^G6!+SNJUJIeV z22msPyJyC7h3tR+AYu*r*-6o@xQ%)Tdq=cSPk&gU!HC)s8goGFGrCEt?w!b(Q6d&V z9m9tC1zx*szf8vnv6P#*ErrSFB<*_3zu{vgR>fnd>!tGcXgZ*BMK)K>I5+W#i*;>% z0$#P}7|d1uZ++bS244{=h+ovav}&hHEQstmh|oiIV5$~who#uxj{k`IDEigGyBPm; zYNW*FWoq}qChoIa_K`{;BE=PE&x3YWfMP^3!Z*by4~hFmYoW9Xg*vAUrDhIM1yKbj ztL5NKUQUj!91>B1CO&teUL_%BpTAS9cP`#qz^m>U_0H;6caZ7lkxYpzH&|&8{N-oI z?7(Dp{HX2RYJC||;yDO#!x@0)3?zhk0a!6W0-^DT)TZX7wMF|kNsHiyPw>0R%lnAv zJeFXFt2S{DCpZs_WgsE|&V`-4ft#q?6;MkEP4hRG;5(@8{*U{`FyT+aAhwWH_F(v3 zKfqfopqX(-+UfG^h4ro}e@2}Brhon03efOs+wbio_QFFnZ~mO_TO1i?#h1PnM5h1m z2L;n{N?^d~N$|y#9KDbMTG%X+Y8%Q2RZm{$p0WCi2ZH-Zi&?pVWp>*}vya@gYpW@o zKpMZ*s)1!|x4(=7*(U8&CM7!j#=+vhNf`{g!e{yWFW&c??G<)c!e1@XQx*VL4JYoR zdinQh02Y*nN0LqkQ3`BFP`lrJ^<0Z~=r+NqO-2KV!FD`kPJCXRV-eQnfxi`^;)#;@2_0nHmAP}wXj;e+pUG?He6K(!Im{f2<-odFTpUA0o()2S$Es4;5PnE zG3Q_^w}%fy8^LZGvTJX2$KaMpU=Felv5{J>kSxb7 zp&KGufdKbqS1~N8A!z$X_wtYq+CBpWkrUPQ*tE_IyxGpMc9yx=*;vU7N6PUqCX6e0 zalU?Cl$9T)-Br*qgjQ)NY3Up9XfVy~zY3y9kTPWIZ(vVi_bt_I^ncXaTs*wSUdRf0 z?07c0om`b>wqAAdX>WZdj9wTrrLg_3z}lZkB!Q;@|7A##0_;`$NDuy1+bK6WgKzLp zqrdvNwy_q;i{Qb=mn@5)=1uUTEJ4}+OGK>3VrROe+It#4!PL=TrdXSZ7hHTJdq#1xw=I*V$hW0c~*H`due?)1fb;eSMy zCK=C1sJA z8C=N==I@Y0b= z5$!-~3ZyHf$o92XZzTG4>dkC}1{?G-D=$O=xUQqn zNRg9eRDC0to1}9}GX{1)@eCYR3Z5@kW(8$*tC#^l>?DODsr&TKq`~*By{>q*+bJY= znpW`)&A$Z|B|8_iQ4f zaI1T^FC;>Kxjwo)e&k4hLU$qi#={f|L$5+05ePQu3!Ww>7h z5yk1XQ!?L?oEvd!*_al!^xR3AQk#g+M(Cn6E#PjYkm!2z<@p@w;oscS`{Cct`!Gq4jFs=4h;?llryJavg!1*NYDeLw74rFcM3!q zTFSOKN@IYyZIl2LPrF(#%3(V^p`bY_mBPZxW%c}wZ2`yAs_=9eXl=r$T*2j$Q2a3L z(gZ|cKZG?#U@b&n2ej*;dny;no7*=3C#wW^@UNMAq|yYL&Qm0b7{fVUtTdB2d&d*` zsU;XWY-Wg+=z9vNevRE8if#&i7ra=b7RL_9IdfIs<&omQA2zE7H9Or8(;K=^q9j)! zKkl`SXY8XJT?<&YpgZJm?Gwl@qr%{h@;d_{MY5Yr;sYMcX3d4cc-LYO&ZL7Xx<@GZ zU8&xS4zr|*aN<9?<|IrO?02j5Lk0bbNg6)PgWHJeKrQ7gRmJ#jju_Z%xmtYDU*}Gf zKqOjv%uVAP)hl9gpXe6WgFGY5>=6+1AjCWf40<}jE#N7qdt5{b3#Ci|)41Yhd+DIM zvEtGoLw=A^elXW9|7~+l-34r`8HfLm6yJE0`LYB09O5{!h+E9k7`x_~*Vj4S~ z{R5>Lb@_MAD2GA+D*ytE9OrIcim@JQ9jH{W=7(o@{i7)N4c4H$jhXe{Z1H4sM>cf! ztZ9MjafR)&L*(Ny9Pzk-rt{mH)VV303~7#1$O>%C)lre(jl&I@f;Afmt}U^KeViR zcYkyeyP-&Sngr)r5*7Dgwb}@mg=OgLF1EXu`_c6;9=!>V`ZY-}nS|iyS#QF+DQ{>& z?!IZcmHWkm6djHg1*d zE>fKy!4zZH4zgW3FxWIigRgHZAw_}sCobg_h|`7PeG{r9dhOP3+~%oD9Qv2sZ>}~4 zB-n5md}t&XuAl?%sULVZqThhDYU%#84)H}T{*|P4%g`=99~uSPbeH?{&65l2w$dAM z6$9z%Sm~q%3gNrlI%x@627smz$XcihKk{61XCxmC65V=F!h&QxyJObWJD0^bgsYM* z_R(t|^CS0}#w%fyFzy62cCGh2D1>9{GP_k=d6)ijg@yL{A*wddgX5{3;VGejMIX~d1S7Kq#07n^=0W3tk8C>n412Vt89AMd5G*6_rg=Ar~(oL$_{vc(P{-> z7$5U1=e4k4{Lscos%nfnp8f-VhV$gj^?wO&&6QpaaI&ajl%%wFH~xdk4_QWZp*(#% ztFrJb@RP;)Gl)eSkQ$7{C+LzalqL)N4MrOYE8oHOh!S@l?3n;wt{>2Ay5W5sD@ggC z=F`Yh+s(hu3DMhxyulwbxq&KmFlhPaaLqPEdg0bjhzbx?#K1?&qb|UYaR8yySILI$~ht3LcsuP(PgF( zm2V8F+J?ghEG?0$D0289D8l<`(y9kW^>mXPVqwtP67X&Mq06xNOS2VN`ZsfYP(+Cv z(OwXu5C*-Z4{#(oF4!eE+qL*x7|rsJ&ihh^^9TaSp4+S?$T&fu6v>YvE>l=i&xa1j? zy6|KCoCnCr;1d%pMX}kf>O_UZ7mPaH_#hm1(R?Mu_eR<1M;FAQ9IHR!KJ z61c=Gv;L*@rep#nf7FHWHru+nsthR9GA$xZVNY)RQM>LjkmU_=0x0F~B}vi;i8fjJOL%=foxF51SRJ zD}3j=LaoXkJMC|$8!9{R_Y2*b*VWe!y$<0=T6#FMMlVuP!}#toRsa9m0Sh4hWLBr} z{XTtOnru=FnT<7pWdoy^g5<6$7+#eb=*@kpMvSm1D3()oSV&y;yN5F@@O8#su^Lb9 zaIWL-i!Uh$-#+dw?TUyyO`)wyjZ4ZaNXqqcs0n8a;kd9|p+`|kT`oSGV&SqP_=CKo zP$}WK`=uv(E?#M6nbgo`MxKLkeQ7PY@-v;~twgL>5eWK?|E%0r)>ocEwJjaGKAZ*Z znmhnTO^mQrQUw2UYA>vQ1uZRHy%nEA+Y>l?*!Ogn5SCfPIsLR}{j>cdlc1!CVH9Bn zRxkT`FymI)6`M4oG`L;JHs@i!WDl(Nd`v*9#7#27$m&85QX;bLc`PFAN)2)a{s=19 z%Jw;(YIGE^j817@KcCq?+n71B0H)Q7u66l7Aaw?SusWNcU@j+qHVmejUj9xehKGE= z&8j;m`GSiq)@W;)!dzS4!Se8+DI&6AYi?0_u5Vmr2YWD1uy_iuCql<)5O|3Z$aU(4 zLU>YfrlS)8vG9WNCG5LzIpvqKZ-}GVzuXGYuz|=rk|$*-sJbb?x|-ke(cIWBKU%x+ zHn5|i%#-Y|h|O~Xg;;^Z3|-FV-6BH)X)^y(<82U-p4x0LhK~5zS3P!FQTp76rxz+V zK=d6}FcZcO)Q~Wv?p1HPc|gJo;W?4G=Lfl2{?_l}_i@#7i#O_59h$ z7HiuIhzA{6re+9};nx2TiZt{@aL#>vDKbLI zR>MsMptVo-U6fFUXDxptS70Ge?FhEOg38gp84He}#T7)_)kFy{T+NHMCXf4GNyYpP z^%j+cMoFg~d(XvJri!L<2?gZF?(+d`5z9_3vRC7Ds!x*G4wi+9sWc*j=<1W5V;Bh` z42!Z~SbIXPSs*aWXS5pRLgfQ)oqCFVR?Hwov08XZ!$ZhiyrX?clQ4%#CP` zeYihfdI}+-`y#9t6z9;I-nt5P9k9ZhS(8>|CySmyiEq;1ggu!+S`l~={2Z<2cU-|R=(0OY}ukxEbNVy)1i8q3?FpVZugk=0zmhEh3jvO8~BQv*H z{Wp!RHixX+^WgOK43wOFvU>iq4jzE6+$T~{+{O)AbZ)zAAgmVKT-v8E|DozF*y7r{CcwtsH9*kd?(TYVcXxLSjk`mF zySoRMMuG)Ga0za~X>BP+e#(0L+@C@o2-N+9g8HG?vej&TWND1l} zqHOe3NV@>W$ikxp1TASHxzEKcD>dUzY<1rMW0dQ#a+A3bi9;KJ}PLnK3VQxh4Q*{TdC!bpaS3M7TJh z4-un;G$ICiwRN$?*(p2%b~PE7E-xLUJ$yK0N~h1~4sy~9b64*S#TSPJFJULG6ypwv zoXm>-X|3D}BNf1|7Tw-{s6Wz0rv&qPSwZ*^Ml4A9mIS-Vmq&9=??djglZD{~k_`<~jqt_Co%FB)5Hxj3uS$^aD*yu`zvD{&b&hJa!aBlqOdq4li z?;G?&)#NHh#Wy2ys4ZFv5YC?b^1L5z3{dB9rLQvB})^*ZRgfyAo%yi&>dZps^Zp{DobRcQ@SS-U|d1}G1sK65(+tj0Lgv3XtBL_LMkDv8UJ zl&2{8&4dO!UQG(_QxIz;m`Dgtg6b`%I5oRdX_1r%M0|$5aw4Zi^GU9YoKun5A)BxK z!8fAA0dF${?FD%!SCRxV4+A;6dmW^QjL))|V5$(cKh(8{Xwbo~j zhzc!3-Jd^j(7|p#_5D#rEQZHLOQWXDmmtFYcD4KYg31f4fZO^aOsW_y&UI5=L|Lna zqv@w><-?pw(;F=~G|acX8_*`}YACO5{6#w0C0>dn+MHFo^k+x!+nfa}&V?hOgBrC8 z6-##0pGS3;hg`*55e?Z9{WsxGsirV-b%R`gb+oHG29Ys_tu2Sphx+=D+D@culSu_J z2d875qt;+aPU9eJxili}B(<0E0q34c&7O+zdDcZy&67d?1BGjWLkFy-a1A5hWBVW< z!zix#=Nj@>FrEB}50IPpYfzSeZN_7jjqz_UifTF!_~uCu>-NszBg%_QRgV%B`>eBv zv_cz)RK5&zr)xi^P(lay0b+Zc&Qns9i0=UOs;;QeAp{HG6r`Qep%+B@asj^5N~Td& zx%&!c;c+MaCXo%uTtf=Ko9X9}Zv&8$0`vjGpX@)bP(Jt?|Jh47_`mO6<6kBwepdB) zMSzG$CrDKjHDNIF7+ycpQlB=A9?{m>Tn>@PayB%KT1X4J1JNo52VO4q_l4C&fV7KU zTLD|{pjCcuxAvd%fhpPcbtkZROLa~Mbfv{Pvh4@$4_AXyPH2UsSK*S$01C90@{{Vh z5>kLGe2)&27fwMBYai=ZG@{U?3u7mVF_z)Y^oG2E{+3fcKo88H(+x=?L`|Wm?~;~_ z5p01B9D2;N$bn@Nc&KR_Xufa?7|YdH$7V-p_l`YhF>hQgzybhg#Tm}GKvMeI@S$10 zZ9bps3}jRMBrSm^_ZIV9B3T*<*2uBXJkv2V`07^a^-=9`jFT-*W6aZy^}l|$C!Lso z3ousE#hRR(T=49>*);$5x7yew#MsqYoNs^WNIMBr@_}qe@P`2PSvvGQhJ3^9UPh}k zOxdXtPPmQWPc9OFQyWjYcz?ay9q0?Xx|!Hoz23FvpcXdZZu@4-X~4=^sNI~oOLlxP zlus(oe}A3>xtLr0O4VU=qO37hJ7+H^;#oL7V*Zs%T6eif7FEJPw%$(#zGr@E%Q-7< z*m}*YVhqaMAg;>cymkytH-B_QQpno156ObuzofR4>Vq{*6Y1lb3pLZEDi?E$yM9rpN(Fpz-^ zSqdF#^gEEHZ}_vrNCT#EcZ)~=x6a$w8xX14dH?7Aw`I`TC6?bxuvP6|35k&Id~UtR zn05C5nFKQKDQf<;k!T3Vk*i19AB(lOz(%HicEaAVfsYm8;b5M~aq7vAO3zSYJ#%8# zp|P#}I>uOpn?GRDZFhm zE#}R0WmWAwKTe$hQ8BUyhETQnit4Q6A>Lr0vp_h1M)a_KFs}3(7r-8h2q4w8B953- zM`Fgysdst0UX$ZCG%3Q+Tb`-AUb}X;0YBUOKpX^3ftsqi1N(D-gt>`DdB@1zHOO;@ z{^Z9yDppoYvH(yBsC0MlQ~#vUWQ>JxBL8}(6%V?ep4(@C+f7gte|@>lqS(BxGILYY zo!a@uOe#XgjX|I2saZ^B^!w`&<&$CaHv@COkPOrQYH+JvLi^}luaO!#LBf!|H&0GI z*%jbO=3JusJ+dk@BV$PsrdsDZN`PPeixe-07}Q(o7vM9uRs@8zYibM{;(b}`TO(gq zaZhjI8HPXZ4y!pT4Laz{ENC;qD_Gl$Gytk@(~e($g7RsRrBNf7kwR`UjCSSFvQ(?L&-6!Kd za!&mYjlr=tMBSDt51zG{cFU^vgYTwknhr8{fyFjM^ao}|X> zUET8@z^X16S)q_@Nb2Rm+K$afrOb=p>cuF-`l;H8Gc~`5DAd*HYN{MOn!gF}g%OcW zW8ylH@BS**m}bc?&{erKvdq zEmS-R!~6QLR?|$Ou_amZdX42Sfmc&DaOg8@HXnJbTr>7yiMAe>h<-t80IkmOWOM~X z5_{czQ@z_FbDmLaI~bIf@vC6}dTlIW$RBJVm@iTzmv&h@H>o9@E7CeVfrAk}uAP2_ zT_9Z(%?NKDd0y0X)8&=KdyX`?H*Xp6l$K={^14kPazDpj7<@hPamY3H^ns2>((21xp{wI5R>siq}A8|@U^AY zmQ^~YzFr)Z4Pf4r+v+Zny{k{OPGQ7p~t&rSBb*0b0Iycv8f}r zskVLO?E%5Gb^Jo>bY^SLHx0s5#HLEs?Z7_5{3)if{IG$jX4X~ExHUmp_~1-)s+Hb7 zF*LTAxFoe!qJ-KbRecB9ULw1$ln>obX?JK)r)+L@Qh24%_3dfwsCVU2e52>vqhx#c zO}D`ZF*>W{I0wvB_xte~{h9xucnK3!dDK^|m2zpX&rYgs;jYAy$qlzaq;krX{pWEXAjSt1j=dwS>UsQveJ>=xTg8b0=c{rI+N}$CTy2xUS&(a5N&kwEN6e0 z)~e`CtLU&LwsUI{9t~fgUYpz8H|uZuYb5FwtvcT2t32n|2$&m@wXmvnlTCFIPgx|w zk;2qTpoFNVq5*vNS5wndZRIy#!DV(>@9RzPCg6OD23=Y9h-&b2m(Jp>!b3PSdu&2a`^sh^62ko8 zt|X&)RshyN(VP0rnHv!PeNb4X)#`$;GHdbBDCzKVUCy4S>fGHc6l7|t>Ntf z_o94-8)mq|lgH++e_e%RT%T(DU{z7t^;ksQ*ZlJZqnHtea-F-cGwN=WAWl`iFZ`I} zPI>aim{=}?0_`?FmP$ZdC7_)1^pD>Qr6gplj{eFK*C+%_D9Rp~*^KaL*fWxHKk#9# zqO#vDg|?>AxQD(@j#&l-ysWM~hFsqxz26dT2R{v&h=z0rgXiNnO-N@SDyWnRkfhLy z$&43jJ-EDjcGLlwIwv3%pVTnYM+E$*4gza@$# zwYq&p{+DA+ThXLdm2!-+Yc_Md>iK*ve>PMQ2H2EyC65ABFn=$;qVTw!b&}iWHhfKH z9%Z|;a6h73K7c!gY9Ry7U;x7#;Bt3GCK((8DWPmg*b3CJr`Re>v$Do^SNMtzLl7C=wf8LHujmulZ=V zk*HqEQ@qGhe8c}+y`rGiYgi`qYc+O_I)iBx8+|5+`eLG0EUbjrRQ5S)pw8n6F} zMQUTL9qUqL1Z6~?ogikqno_DO-6k)-xPoj`p8Y_WjwrJno?fa|!{^2Hj!qDVOC9y~t zqZ#(P6}1@6GD6D~z!ZBf{P$Fx3LKwTss})r0iNtEFDqhT5tE(&^cMCa-Tz4qXS#0XEo8b33Y(m`C*%5BH<( zqu(lrvCyL~FNHr=Y32`>mNaBFKAkX+DxMj9ihem38~)f8S51JeV|Z zc^OOE2l-tDdmR)AKhgv92FRW3gY4y(I<@iHCvq7-bfJ6xk0jdmuOwP?=27##8WlmW zR)QCsb}#kX5jDC7>Y8N`(r8Ej(8{sc?KOLr;^^t`%fUa&0#9#$e5F}?QIM&IL_2*}WbA#( z25h#mx{qy^6{j}jZFF+JWX7&hdrd$#dWzYD*&(XDtm3gXNulbh&%K;ydW$b1)klL{qZUx;u+ld3OuB#qR17F;&T5m@GT1z>R(x8v=8QY<8aPsv0 zoWImL3r!xB28G5BAq*LY)0Sk(#~e(o4ujA9Fq@u0&q7#%6OoKlmqL?JkonF~Q#4A& z_n|r~t{R=dQaelG*hv?@r$i+viKfGAuGFaQ@pI?N1Fb{;(0qvB1o;NIuXn;&U<_@L zA69$x#c8jb$5#pM*TuG9u0b=Mm(cL;!~36?I(22+SIq(FPAN5Qys?qaLZN*(YZ?$QKN{$X7^v-fC7 z16Nln?nkweH5H1BQmTraD4d#91pE;dsZn{9bto4WrHkW9S5Olak%)q*J}7^%nrP5< zriPS;Q$Z`#qtBJak41+>(z$P4Q)K> z#4(Xn3An+_+qH`c7rYpW_XGr-RlT3=j%`DRU+NyWAbQ-{uc*dB7;GsS@!j%Nik~L2 z%gE`l&jwKaUxaWXc5U{~M&E`yxBG67-yr-&K@fMl;6UAmP2z=R+bBmXcydM&-sWfv z)aWdC2t#+zf`kGr8OjE+BTcp%rkelO)5PlTkS=#YW5yW45RP3Ja^07& zIgng*Z?D+zc>epANK3kZq-R)@v_NJhj@{g)l$fci$}NjkHzPVa2m!gvtcpl z7B{eu<9c$PH`Wb6DRf^HvG^JnL1sImpKj2r{3kO&B#a65xyQ#}L3;KxU`UAQNv?$K z#?Poo?|e3a-XB0783lW!>cMgAFVsMgrZdnVa^!t$_kIOlh8_*}7(KW5ZQpOV{hHV9 z-$d!Sl4HwR0#-Y%uUB3NJoi7grY_x{A{UDk78sc8#s_Zp-N&a-VT|AqJC%q^h`YkY1yTJvn)1<8nUsu-uVLlRR1eb?WF ztZQ$%Q>jITmf_RZO`!MDnAJSC7k=U-)v~<8Ty<$!aoFC5U_OsmzF>^jWxKwa&#)5k z2@^kOby2f zDK6u06eAdnL5A!h^rx?sR&p)2>h(tEmJv!>)xD>4#c5Mz3g|kp5*gMzFyHSKWX7xX zu$i;*D+#ej9ghCMVIxR+a8e$wz?K}x{R50IPy>^Rt%=4UzyfsQJ{ra)n^(=Q!L>)I zlA5mp>|jpkr+he8qI{$*BYoSA_c%S`#gBXKvdkMh64_*>0HB+riM=)7JS(+Kf%|h| zKW)lC>i411XBCXPFmVXJEtrfigmkc0CsV!UB@twe2r$VdNrNk}IY16LO9EHIkG=5# zYD0f=<5^P_%*1ZMc+$><@%68oED+@9LS4vv3YPEN+raDDU$wWlclpsP(d^R_R8{;x z%90^o1@;dkf2=>*RRQmB>7m-l)z9_u%l7~mCkfjiKM7zjT>S+BLkEFv#vp;T=C0^= z7zKcHr5ni(fA&dOSiHf*w`=gcUXpcMdFJTAn~z2W3?5-Z(ydr)1$*t z9+-%-*L|m8pD$dC*Ft(^bMVX)p2G)hCY&B$;ZpS!>HDC}0-tN^@#Jp`L4LkkLEd3( zYmJQ<&c_@mXu+Kx#j#Kg_d=dFxbo&49ZrK2rOLRSU-Y}&5bM87C=%(q-+tRoTNe+w z1$l~erF;)$tz`!YQCZ5rcCH})f39sP)y)g-qAzKsKE+V6P-e%hsgjVw5}_M?(9V$5 z$my_OaH>jkd{M*NDJ>A%@|7w{)h7ED~F66lTtSrf>6Brz|>1- z=;#+Zy_L@8PT&sfBGML@(~X8zApDdQF-2y*EJ28Ah&F=OV;^?0^Rn8>Dxms2IA7p) zn($cA0kh1Q8L&Muo6n`aE)u;M1~%E~m+tg&t_*U5uFm?an8}yH6vO_Gno8A7X$>JH z8@!|xXwDYl8B=;P0Q9q%9BoN@^xM00c=-oxnNLU6UxKF}w*$|v8_Zt!R?hSq-|*^# zX5!v;tvzg&cb%{KbF~=0tBZ?;Jio5}Y!Vv)2K%=ifwY&3|75h|?ziJERRc%?$OBn2 zv7AIWA=gElG^7CXQ0Eyw%C~+o&1#+V&~O^?ZAABmUryboye$=)Ods0 zrEJa5a#~z_JfZk#X%%)wT{D0>X6rSctd67+b6(Hmy78Jnu8XpyH>%S=G_jO!>>=753&KJHYY?v^)K z3%-icCsm=r{0Gt@ii+eb=5bP?#U?mJ8F(9vV)Bhc4$X{E*EN8}90QrpG&>g5a&=NV zwA(f|^tr*-Y2$pW@7eObp;Nr)@4nxAPW&#={B4=vlMYr7BRVAQqr(c1@+oWIw!r7N zyTb)`v0jg0@3vZXZn6)`%SwrQO4>A}@e44!k3S>dXV&y5pP0*s-pJU#!BN8Vdu5X^ z35Xl+oR>#?)kb(2q>QDd&G~!U#(&4LQU8*0PfsYl`2D4YFL-a1s8(v?WQ{_i>$wg!!p8FEpyae#9jZ(jwR9`uwDptHIHtP-G;3mPxy3U() zz3rOFOP(UtCnYl^!!cq`?G96oHYz(xCG^EgsR}S2i{OgIiJ#=nbOpayo6X0YoQr^Y zn$utJ#K^Y{ow{bD7=V}sUxR1fA46WP+Xf(KLl=L8EdSDzuoa1(I=9opG8@pR?)R_4oDnTYli<)~g=Vq#5IJiN7HCSkI9A9shccEv)vd z#HQuh$vzT)@a+T=@cz7-M2$slnJIBaDZLKCUjl#-^Es5}BrB5=-k$;hO2Xv5M>RqA zuCz}knZhESQYAaBF&8nuH|l+{+rJ0f`SJ)_I}zoE{Y#AL*6zMT)>1%jV_W>XixG_7 zR>Ppe`9YHqb1%k@ozB=yT?r(A_U~KUh#~v(YXq!lqs!DBU_p1@4rxa~6D}9cEC!2j zQUhJ|1|g-2Jfk``qXKdiOk{76bigbzphapT@|YT72f?&#T#sODls`!~HNe8Qw%#qcry2}ij@9-nCuugtu;NI_M=2enmz6j49Yd_Mil+IapiuT;J0?tq6+68)O{$%;SY+_5$!G8v0U)7RCmD zg{tVff^Rh&Q+AB5LKVYj3lD@5jOIfnhRK#h&cQ8_$U&UVv%B|5)BKyEd7EY_aUKVU6k|%n{^EYNRwA-@!C)u=>4((LjOa$o@SRQ40+AQXG?_x8 zv+FtAL(^6;m%;Yivi7iabInU@4U`CY>$(XhG?ZbF>ak^Ltm%t&kau3g5s7~^ceK)> zyi;ub&?a);$r5ls&hvXU`On<^QRJT~S)OUfvuGEzk_wx>3!~Yo(10X3U3;sKUl;h> zEj-R!h4HZyHL4>iEux}V5zDa;E|fK`Ch-wT83&EA249*(kR-ujjQCZj?&xy{6NO`E zx9#hCSZ?o|YUCTQC+ig3Z>uR=>~zB~*5FR_0M!vKOHb{?QoH}tkqts7{$(xVN>DYA z>I2*?R~_TI&n1<2=in+?-O*(_&hjh!|Hx(&OIj(QbxGh024-$Z4TUjT5IW|2HkwK% z4|Vvluu!e=x>Wf&lO!m|r9E9?R}EF1;rA2T)1=B3U-RZ3yWS6p9@|z} zE8QHE^(0B4hpD9GE0zz?$#9g5-Opb?uq}CBis66ZWV|gI*qK)Z1^3CNH9eG4v$4EP z`lUU{g?es8!>D6ZlD!%uM4*K?p{ODxA=^&x+h4fr3m1HN*av~qC?G2#ucwo0?+XLk z!ddSIKj-X{7Nq%%^$t$A17i$FTiI+Y@;|zQpXepbl$6LO5JS3TFfys7sMn?9)md8eXZ1YQTGXXV`78oFQ zq*o@j!G$%E{*vZ@DRW`t9RZjBx?j7F%t3)?2xHtau?#OSEz4JB5whP`uydp^imeBg zRa~eKHzJq9;)Fe7mLq1OM*`^AY&(kQZ-@6L5+Xr z{C~bMmH%^%j4FV@JCTFdtfzi9oisyIAgdsuyZ*V731EC&pN2yT<1T}Qht#DM9WLG3 z{)yEr!go37CBvJDPaE~J*B|I*WEOU`3)`u#*XDzd^gF51eI22gl<#AKb~FHPFxp8X zS|YQA#a&&wV5jXtz?JMU8e$DRJD*>73jyBKi@zLno~^f0|WSh%JR zuH4p&2^wDCox7Wx>{Em(OXb~e7__`g-@EY86jNOF5h4%#g@6Ze1Jhu9i zM4tW7|Jf3gP0!lx{buzIy1BeN@N7$dc;YWVsuy`M@ZW2nPOTYRt#PEtK3&b!-m3mL zqImG;M?oa8ySB~ke%H>?(eOCFEiOG}9n{+AYbe?Cm~I)YdfC7Dc*#aKH3Uwt1Z8#BY9R(aZ;{P+LSPm_P0G@vN}N?$(3w_X*N ze2-&!NNnHq40^Qd)!sJnmINKZj>H!zn3%RVfWNnBomlx+)2Ms*YqE?ihiwF7b;3>5 zDCje3(yBvdA(*--#z5+P+Jwk#5x3@*m|7!Pskj312@rKvr61-zk7#9Cro!_wla&f|5cW_mIsleT@AXfnqLoo9$8IAZ#iZ`2P3`%Mxsfg6MykYPiT^T-y9$YcZF^7~zRgEL| zE0<+0^36U>H@zMI8ir5|+?zj+KZ>n(dE5^>iu@fxM>5kgAY+(A8B9jD6xc@kA09gQ z-zi-@>8PayjcYbakjQcBTnEq(*A+{NK@L+p`Y5F58eRgjG7u^fknI;wY2!8e=TUbOVgpcC zk02hEP`Wsxt(ch|+9dR4huJiJv$(|8gz5YfkJ>$Yyhjc7+}GHX;F4lpY`|Zwj|RC5 z0kNh?hE6ti%dfM!UNRt?w@Xfb{hJ|=RRbISw__pfE1g?qj(6E@0?hFgn9!1qy#w0s zDKsFM8N=4G36s<*=0HUEW;3o*Up}6~2$eY^7rIT2`mQE=I!v+|#n-57>O1 zEls~xujWDT7O(|HGcMQZoft#y+t1xM_r`!to)x`7v{4j4Jc@*7=^XG>JNRC1950m|5oZQ zG>Kuq!>Q?H3s}|!n_D=6Mm_0u+BcKwc8H0P$|8EmZf~i7XqQf};&W9(<(@Uk+ z0zT-R0UgZqIO8dT z+-irO^TdN6huVu?kIa(XKoGTqhYT|I$R%h5WbFh?B%;-qK> zv`|T^!ZHnej8w_k7I)mOynr7$F~TnDMFK3zq{>)M`DBX%0){)Q9ue2enFHRC>4^+s z@xOcX1%AOg^%omRL~0Vgs_D#Kb~ccc3P8F}luW(`0UXR1Nh1~>47iS{Icy3>!>R&; zGEPf+m#nKvQ12!*k}yg&lB2A=U{vZFL>`F{Fo$w2umZ=Mrx!S-g z?A|t-i?_5Bn(KQeHU_KBcFvisM%|7vnQ0f|xT$rCJ)hsh^uu=F%iT?{TTu7oKEGJw z^2!BK9dl8R}jR*7w!R?F)V|`b>q3RZM4IIZJIVF9lzY=*f0PkKul} zt43x!-+b%Ehe_5R_D@u>Xf*=7F z>pzpoM^T-n;v}_u13WqGtz_?Ir!QOuJWxmBsku_GU5@d?q6TCj)O95`J1 zgs=?i(ValwyuLvmHpkr{$Kyq=rrYo4o;F8fdIx&i_-aFk>4`OQNt8$b1>o2~enF%D zE@^bCAESz9m}ti8>b5?Q!jg8HS~y@*PLm-}h>KaNMKD0=R7tj}$IYq46tpv=#L#U^OR)n*XL zm686^#v`7=s9g~EVMqb1IH}NnrU*OJp-Jm~vcGn*WqHdYO7%I)DLUAr_d=9#a3$Ur zQCW>FIpxsbgJb+QEh@2-?3Oj`Lv~n& zxo`{cQga$zB>mug!Q$)IcYS_CdKs(_Hht0KHXLZ;n2B|90q-CIe?f2OIqHIO@oAER z)e=w_Im(s_bM5|Oljw4t1m@HeZrSV`KU}5J*^&)IyS#pXQ|ISS{VllwanQ$o{A{US z`HfN5>XcwpL`w8j->B8K-{ttb*z1$Xkp!W1Gh8@*7E>hxjYI+sAM?NEPW*0gaaQqb zycFjb@3}rW1Uo%;K0HD*(VBuC<%W?s0@1m=EPbsL0tfy_aV6D)B3}7gmT9AbY^+yH zQ$;O287a=JMWj1a4^&@RAADwAr}N!WDZ`-O)isyIFm~$^L8ES@STIT-mkBpI5*&*p z+2DTn!x3#BuCD}TF$Iu*L9PX^pZZlvD@I7o_m|!NXd5r4j8oTTlv5tTY==K$j|vVx zK9?tQ%`5pCJG!+e_kq)ts>kQ$3sEB5Pk!Gwb}5+BMb1mf%cpz}ulL;YGlE7HtRLeF zP@0MGXmG+K!j9e6|8rmJaQCz?yUEK1IOHj$PrL^*EspWv20;~hMbs`}K$Yitmh@{Q zU=kryb&-~1;1|H-j^L!)gdr)!k0y>7ji5Alij+94-En2K@GXssUmOG zopKtQP(s z`71{Fa^uDS;PRqhysPhd*PQ1yH|aCX0bVNVD%1Aae-mGCa?nJIOGY0IJjR5s+8j0c z`@25x1cW+d79(P6b*4m}nC~iA&=5`Tb`4~tN0rXGD$v_?uFThk!9-@zb866G0eb$>X{XvW&74-Fe>{6Ajw% z#jYan3kSpohC#Y~JEG1|!qe|g-sjZbeK|d1{85jQJ-14$iAu>v^UD~BryCknoy|Wf zFj;cenqXwqt9FU8^YyvBvOfy<1)g4?kHV^99cj8W&Rq6;ot^x9i-+ex6p%EN)fZZh zzo^7yFcmb05XoUZ{Q{zOPxmG1mTgliMgFI!jzJjsh(Cb?P<( z#TQSq4-Eb(l6-eDZ`wvWsO%wAf`RIy71{~=j~|(8)bu3DpU9KzIp3CT{bhpZII8|^VY9CGuQ3DhoQ+OrOUj{U)$Mp$0dfq`VrnRG7q+= z?EfHBCloS;xG_Q#cwF^os`hQgSRti!#9>t7FbH^!NaY&UXjt*1AV3reydI+uWD4Fh zD?UMXFk8Y3iQMWa17{Cq_F%vfOaH-wO$N^TVKc`az9Z4puCw#KL;mBoS?$kdVYxZ{ zusYVM44woY0<|+UG4-Ruq^pciu`KF(q`MG-i7ypB zt$P0X(wf(Y2q~NEX$=*qbKupL7GJVXjcgjzu`h6L=St?)IR5$YqMg1Is$K>+e?9`g zi}eK@nQ0@MNg~P@htb>)`yR5zB>}vJwtoL5S#jG8c|ACKdEJ?tOt|b{7Z51S>Ar2_ z`c@sU&N73CQ0#<$*lwuj zv|+*)>hHfl%7RrdJ7v-^lN@CkFB}gooy^AE$v4pkFV2e9yQ#&#+T=05Y2YU#-Q4HmR3&>NxfI z+vpI>4yJp{LF$q6IRp~V8+|EB9v;+&2$hWVuwx-`K*TYC4SNG5kup_!mQpGEf>@df zj%F-XTI%DqxtF7N4*vz3w!cFO(=?U|FBIix1;pOfx;h=1CQZPBl~;Xz9h+L20Sbm* zPMvdTs?~(HO8V+y0M#<#POoFSJg&9i4%E^Y#(oMIPK|uS^~)yuANiC4Xj6D(m}gut zBk;p85@a|`fFFkC<2>WgIiHHiC6!9mC2HyD}oKH+8qLwCQz@~Xb zUE4=4+#;w}aWAS9IK5i?`L*~RtnF6tUj%`I&bE-wRxaPp+|O=;*yOgqYsc)APESKk ziUZhD=q6}OUusFiM=E#Qd^y-Lv|&wX@YZ=;syy%bbL4PpNa5jo9z)3&RjxXrJ2L#w zPnMbs?;3q0>f^UO+L6$)py`F8QmCcGD&@F&LgBfy$Nn&m8jGm;i@b#esvf6(%5fXZ zzetbxFE>6z#YWPi%Z={mxwVJom!-d_RXj`-5gzrkf&fOYss95AZ9QlhUeuFq zLt#Nf&vU({h9w?GnWD*5s8%tdInHsZV`L8*OM{Yg>w54{a>g}RJY)<^iYVji)6Glm z@amseXLvd=42M+JDe8LRWtnl7e5|Z)+=BL2^zE$P(QkH}-xiJ9H>XDV*Rgv0fp(>* zmbh*FvYDC}%}fe-#mQQRS}Ec-8pU3Rm9g=E9936(!QM_G+a5(YdzyXZ^?(l&AXwG? zcA74^UBd9&VG=ueUe#nL(Y&;(>*eRQC18qc-wV`UyxILC9u4Gw%Q)X5m3`K%sqZ%a z`SAknn+W0PR0$b5^lHuUH*Oj>+1<`P2M(dlteA-fcX$SfwbS2+FCWU}`P4}17PN2G zC!X$({hinX8>z8x2Jg2*__too?{Dt0{9RtWn8wtgsZpsuQ~!1skOKu`^*Sai9RBdf zXf||(jw?ckVlC=6S**ziB(a4vcP;wTi~Wj9R>^JCfPf~*ac0>TUzXp}wrzMf_@Puw zFHQp2w(%}#NRiVQh016fXQ*apqQFr#^=Xz3b(EP zhqu3P6)D{;{n5KwlirolCKKJq2LFjfSSrwT;w{|hzw`VF_a`S4a-yQ_R8n#eNfmU&gE^K0XW2Vn+;wJ{|6lI1O%z-M80kjcLFF% z8q;flNG31Xx;-uqQ(BZNs?}S*H3R59AFG_&;Y;`HyuVl-HrxBX$sk&ztEM=SePp>h z@AV?1Se|r#HFr6>TPrXN>0kG4LfhtV%k^eGLN9lq$0qToy`T3@{Xk88c{D?2ySM2)KSH;@m+6URQ11-? z#m1{`SNHX*d(i&=kTryxyitTwScs76sC10rgD-S2+U6ewb+b4gyzNE2DEtwJ^rjge||O?Lj5Mw zEW?3sTyTZ#f#!Acw?sipQqZ=;H;=ZbtIS?3=^Bwpi*Q~MqPSr~-)_W4Kpp|>ZqFSw ziq^NX7!pl_fIcqo*`bLfuO*)a{J2*b#>lm#XRM5J-l1Auf!8(La#2+7`_Ug3cF@Lq zwKsn{FW~vRXeS$w+@2$nH}J*OQ@%6G*%WRija#tr?)&E{(xC(*uRedV@wpoNvW)e$ z--4?>Z-*;DHwdI@xpDi2V(DQTXv^UbxWX|nfTk3MWTm4?a%K}Uzcw=N*+C zIP^U{n7`a44H0eEfAh1|Bxr?ls<$_PXM%6+&n_C8R@}}*RCS&)G7kK9Zq#c;@bv9C zJP-XY`Jg5sHHMm$9PJNGa0H#FCfu6W(8H3#H!Dw2Qj&N&Q(c^01>7xEaWR@5+UASt z>@2`W^R|eWd-r)sPp%w558&3P4!wxkrKc>&|8CoTud1@HjDOoR=CQfcbuEDKPixOb zG_%t}yVFXMS@2m>Q&a!*7{tl%GEluSImAjXLY`7I@-#h`Y*j@4|L{=8y|gZ3&p=FD zPD?F&yFoqA!Yz1VIIAwBm${!k&{NB7WRpLWB{tavXmm^G1IZOl{cTc#DYUj_HHZ5v_cxviD-) zHX0mNdu*|SppyOdqU&5hb7gE~LcC1&*D_rihD!HfWr#uZ96c>4apU)+Ym*UEI3aYw zjO|uVCa>(R?^^>JUDJc0p!dGth|HCgJ-mQG?e+Nq89OGCfQYZ5cHOVFi-Y|$w|~>r zdc~g)u9j!sE-izOg4hzqN4#O_#%*c+`rbd1VCve8xjUYJaK3gIFck&$wLq*PllLi5 zsrP4{{7hj3Q6)!NM#k;+;aI}l;n=>VCaBor8C|&w)vJ=BpcFg7qW=(T-D%N8v!~rs zAz49}5z%t)(J8s=v@p%S-@sf$l3H(&7Yrif+Cz_IGctIF`d5`ttB z_P3T+^|&5$a`W|cS%;~Xi_sWS_2zw6?o9qL!*7W~|4wOI%rER6}*m|ddJ-S8YE=3d{ zl}}FuiO|!d)rq62V4*Cq!sxJqR8_KNH8Y$w@#LH+ewg))?YaZwC9f*0iaWoruhw`w z_{Z1*@8LnbR;<>O93>ixxgK?S()bVME7jekLH+0!R4bG*j#&09)wv4&h~`^>#lpjP zPY5k;BDmYNcgy=S$5M`?oujv@@S4dQ|A9^GeNUsb(J$*t&* zkC)rh!=5_orG?YUkx4m3!~aiJR{_*^)ASRZ0L9&*c(GF4g11oI-Jv)X3vPwt&;rH1 zxJ!z=wLqb?1ShzZ6n7}_rF~xc-px#AGRfrb{=0j-dwcuaV+T>AAU?Adx;pa(dPD1S znn&a&X#$m_9PtyqV*26i22X0X5xHsSWi&8@LBsEl>jor#NsAFnD4BLWM&cd|6yk8aRAT z5|2u8XjI8X9H=A--|u}d@ejKE{_}v^EwClvc7i;h#WlD!`1-q2@&4CI7efi)j|LPd z$^_Nst?_^Cq8?c&G9ppukTYTV(d6PA*c=q>#aC_bX=YjQH2ymu1xeYFQ#@w0nywmY z`{Q0?>UEq{!r<-ICqXQY>K!g;P3GF2GK;#Z2L)%{_){P_Mz};m-(^3l)iai7WKNNyPrMtQ^V5Qf;ZFDw`c{TO~^J+9zkviQHa`i zqNrZ|rCDTKyCu2Ke9yrjWnZEU919y-s`3b>BM-L=+*f9aCXxmPiFdNTM>kssdW;K< zJ33&Vy>hs7A4zvd9E44ijg>0$FCX6ezBLn}%PV__0+#qA8sDS=a-$-$Dm0cGnE30=)3Jv&X1g_xN%m{IvC z;VpT19qEpCU*C&_rpUc%Ls}QJ+Cx*g$a2T|MX^c?{2Fq)(1ir=^$A87xYANR&cU0E zD|)@M)57Ish_2)-P|S+MF8Ji}Y7rMossOTP<$iB)uj^eY<#j1#fCqYo+lE`jO|6lm zees*Mjy%H)@3tKWZX^zG&%i<)+$QnUmuQR2bpY2lyOU1{CK7Q}B=XN(KEH+?mT}HF z+10@j31*Y%BXa184Q%=9C-i#n9u|>+(5E*E*r`#!IDmIa!{NU_X2tig3h_o?IElxWOpU^ii_qQ<1;UZj#~z%!gA zyS=q-lmxJFrgn+`{1brbBR>65S*&5yO{`&pYD^12kp=Z(S|{-j#aY zzmoRE4v|)k2&cfqYo-wci`s$*Izpo!QgNy}sIiXaxuLLk1t1}GyoG>>#EzI^ultK# z0d*Kk_TfsrWKYQvetemxZNZ0I=fWWuuS&d(7~O#>d!J}K^^LfSlE|aHtPhh#Bx$u(GH@* z9oQi=uiUqJB=*`ytPZ|S)2VX1> zpy#&d=#>5#uCm7h*{8;TQs=?xotL(zysWhj!<<$FfD$i4OiloQIlWtGhAO_Rz+T6A z9z~IRpO%VCt87a`@?VOT7in>Q8}ZEUK$|3G{o_9 zi6ELaDLaJ?wqr3WjKNEy*jj(%LdRNO)~i1DkfyD6W_2(ZXRmF*YK=d?1K{Zt>5qCS zy15hEfBg-cbZ|G)%nR6nKO$q6V3}GXqe+#@Qpk=~qPmpH^bK7^BrTdTHzo#XO?b-m zjnYXp*<{-lK>j<;*COS)p&)Xx9A7sdY0AYH#!1K;&|@NFm{>mg|HryBW4I89Z^ni+&b;YTQPg zhje()#aW)fb-lImsb_I@hC&0$li(YryX2xOzdq&e6VkiDU9>{bNZ$3BQP`*siKZ3O zj;dNG6p)>khHOYxc>an~WCPnFFHD6~0!J7m#4^{i$=}|rzS@g2Ha?|aZofNGdN`L3 zxjlHeFqfutaS7_(SYy*6S?NDfIker=r6r8v7xhJU0{J%~R{peFp(PTw4}Zka_;YXQ z{^#-W#o6ypDvDB>FBCfHAnGtXw^6%2=U7gO^+lr6kXX)g?_SP$V)r-gBr?1uRt|&* z;aF;qNd$<&ol(w9MjE{9)(0DMvP=C;t)AJ6jO&G?E=wp_qr<%1o9q?_c$xO{z7F9sh?trMqW8JfFoZ<;Qv z7AI#_OSoza(HI|wyYji{B?5Q{dZ`q1Yn91>(M65KXtMz+};8h zy+uYs3Dj|yq&hJ-kJGiDsMks2%@}%NOT8&kwqF3kn<-&@1sO#&&(O-=nl|%;9lj;` z*FBS6U45j7&Gqs3O+7mH$XvgP!oEaz;0=vAJ!~O)^i@#Pz4ZMWeUk5r|Hd)A%eZI0 zt^1+R!un1Mzp}3NNuF4L1^M*glQfRk)X1hB|EBW*WXX3(k`DKDlC6L67kYZrT%<8^ z-zoF4i5X6l(Ivn|{m7WFCrE;YN^ldj+snfdxnu+^*JS6?AeesIik;koL{w zf$jLmPkshm;MoozTC#2+ctX}dVMJ_2kz*fCbskmlNrR3vTF;)tEPlV>ZscjT7f@_c4>| zI8QgVi!+9^DpV(pgep%?h|j_6_C03~@#_R|r)-YK4=j^nceT}=f@2i=(HyzLK1tHA zhEdp2ltSD0A4+5lDM(lb$Q0WwGQ!iiRW$Xqa4{bZ9Cv0^=c<0H>!d(p3Go?qoNZYk zMt5Kr&`DM32|>A8_&7&~69IOn$H5yU7?SN>M@cBC$}PUVl*mJm@#DwAhGdo(uO}U! zxKaY#UW)FnZ&?rf^HPwz(8y-JD@-*w()uk+o{~-A8uFa~QR%Sr)nF=AGVfbd0J`H2 zzp==;QxfvJ{yE~6&*fQKUv0`iQN7@&xRDWjP2oCiQZu7qI9^qmr8_X?B|oNMv@J}u@D9Jg^C~Ns19x(Va`S(0uEMk3Bs%?WFGj@m zc|r_oYnEpFgNvig`A##R#xNpAP1gQfpMdPOr16L4XqM<#;i(7n{fDO>R94{PrU- zQ0ffVaH~az$oY?mf{y@9OnirEtYn?X+za8)0Vj-4WfT}?L$Tgq=K)8Mtsh81jN#gm zp{p|Pbgw$C%(%7%`RXV=%^e4DYe1ITu{DbDMq!~VD^awh2P*o-Sr?2cp6+3Vd~Q5R5^cb zC@3M$)#=3Pp$eOh8->Lc8IH%<@e6;ovdn7VE;X#jw@8;qt3>(4GWWqqFHI*Rj6Pu` z_*vd`@t4ses)Wh0wcTo}MEtR}s{*Pd{K}~-L(POdy@;u%KFCQkRlHdvxB6V_PQ3!& zr$k7`-ymq_@&n2q<$4B;QfpFPnFBpNHT?90zo0_OA{jr0%sWNV0p~}tlx;M!t7)j4 zF!*v7fRA}|PJ6s-pIl;N0$RmiZK}J*ve|_L%)^3mZYPYiVNOsFg&9az4Z|0|6wPs{ z^E|8{<}clkgk1ePSni-VZ}<8sXLpaxm>k~mhfN5=y)>q6&G+sAQe8O9z;4?tjs#}ZLzPFLy_y$s#&Op)oCOm4O%?4Fg!N3 zFoPqWCm~#XtU^^ytHCd3vu$mc_cWW5e=1C>N3WpBb`l4Sgvi3M0 zy#WPK1<~WJUgs`gM9)a&r!*{YtRy37VCoKcEa7AcRSvs)66x=zV^RV)B$Pga>+daV z3?+PY7~acz_v{>;1@IdZoarbfI5g}OuI#U@EW$+>{WP;!R9@v+&yEq{X^c1V(va3e zlkSa@x5emQ^4Q)R7r)_B5$kozrrZ<`G-ulRv?bslM4TJB67EQr7*UWjmPHtNRfZAO z6#G5Mfr(Uh17}fL%?z;m&Bj50;^n(_h}FCCj2Ij~oySBbj>HMQjP|C1G`*=B@u_$b zbN!-y^ZjcU?Y&b=h)iwsnwr_$TO?lZ!BTL0(9Xo{#-gxPu1SY~hy-1TUA*6Bm$V*? z1EBxG)>Y}h`S-^A0c85_L3VGF@>fl}|G?MDTH2n#_K@Ev^APZ8iY4|KE>omstimW7 z1G?rBF$d#?3@QQX&-M};u2y!EJwPP*%_?3YV=rYm`v89-qhj$JjF0R%w#G5s7!x`h z{(MHcdK=IbN8641oN8%aHmAwI*ly4KgeYnysuWXDD>0OG^w?~wJR5ECEP%ZnpMiU_ zJ^Cy&euN3R<^*Bo2>B|`XFyXeKK=~Ri*nSX1pGuFHdfZ;7!46L!lydU>?);X46IDV zH!!LhZ8yd|T^NcZ!_!b@;BlJ2d0$6ZY#oDE1*D2ePd7e_Q?MF~a;RuC=5rH&Lc>tM zfjEm(nawW}=gGe9ocPRvIdn?nhy>IIFe3nG9{Mj<;lHnpGM0p1H>ZMvIY+Af7(~3R zBLz?vifk6PIlLA>8Wa%oe<(M7(;rW1v=HL#X??3g#ob-R*deTkQ!?jMMYN5?na7); z8q#^b1AATx^^i0%6gQmjI&nrUK;1sou3R}^&LkxHx$JwInfl4gV^;brBExDD1s;DS zMA*OSoW2U_t&%h8Vf=o+>@}jEJnFX?2XSptVwA zum%^EBe5mqtjuLd;z}LR`Yb^8ZqlAY@qeTq^8t?Dm9KnA?24ZX(&YEjW|<*22oUiYI)oucTwz|N3v;! z%2>p1UkC-jOQEaLb3hV$Kn6MkknnT$cA_uxoM(n!4kgq8jD}vJWznq6U-p6607epm z1Gco|S)=YOPF-BYsRszB<8^S+1M%zT^ zD%JsBxHI_?A;s_ zB&e8&sL}NV?(ka^yrhcqiI{yFXGex`Wlc@ZBlk1=Lz4w7j_%bKI`tJ@WGgD*MU-$G zVmBfsrIkAfPSzKb%7D&{vA)>n%tVm%@N1SC8Q~x>i!T&iQ$J&Y_s}_GIx53o6f_jD zV_9r{@-h@YXTgmQe=nC_Kmsa*eg%K*eA61-c_+6ah5^pdK~3Ad#}jRXUW)jJpDMbm z>5)amn71`c(jJ%vw|O8ggtKSsf*SqK_wF2Rw}d5VkP!qhdeWjsyVo}PzW{_t@P*mS6|blpFD;IxU#e&E5%`J+nb>D9@$;PJ$H5%hp# zkZt7ac-HS4o7K6lgdbA+Q@R zI!0b$%TsrfG!aoxIUjlzaC>zkF74NPxt*PlY#QR(V`P3CJ$k~$A^<{TfvpZJmo z^8eMi3|Y8Q_wEwMj`zc~TZP*}XW-Rp!rT17#<5d}22sveudvBLBKSmMg%oMjWnTW8 ze1x$~XB4^wr&j>TpoEFV3}l?@Z3XeTE=*0)$hEp1_O<5P-DwAc6e;J$O53jTpL5h1^U4f>EhA4S2L_JfTIbtdv^?bk z4S@tfF%Rtn*UtlK(=(+Ulq5xzsdA58*Si>98JoM9s1WsxHpjAs@VBcNR#>4~Buxv} zNZcwM1c~C;ixPjgAcXVl>xCa_RkKnnoxvN$FqHuM4^CD2n!1u0rwv3fwAZP$|Nnd{ z#0sfnR1M*}HoB&sL$Dt$W)cwh+m1;o<7HthAtjcm4;DHMX5h;Dieh#uE*q{4fVO*f z5)MHp01ku_P4tP>N+wQH=Lo5hF|>4ai5YjjK7F+_Tyr?XV|wRU-*!6WetD8UprYTi z-FL;2xkoU%qmdVZ1EgdeYhy;Diy&ozoVO9<=*gghDM&$yD!ZPEfOJ&ZZqs>8Pk0X3b{Rs)O3pNkG6(X1&us5>W5#34pIJFKu#X)ZYQ~oir{(OdvpR4{_ZoLNhy9&4SlQ{d_+NGW!v-WH?2&gn$>ll8j<_mc z@9(Y+_;%m#Joq6t7crgersfEVSxdrPsKDqp<=p)xRE-Z>Ko@ofI(M_FD~)>FHOd|6 zNK@NxaT~b+6|5KrOUZ2szPW<0+%4Nz2_FVZw0m7^H*V>(S00wr66W_!1R9Uq!xj@!u&Z2R$10v&*fMLp1 zh0sgj9;p#1K7nDT(430qOmR-~mt&97Y1(XA1RQBdjxL z2SW`2=LR1+iXg}uc#I+lbXy>SKT#C`MK@ppkANDq>f1hzG`X5#!GzBubSqT1&$lw~ z`+tw#PcIBN{Y)6ccdW_mNZa0&(|*z7l9dPkh6C&y9?sv{Dw6+0XRgSlYZpEvm~Jw& zZ|FE(zw1K6M*HSVxs5+*`DIcS7E2r*)nv+TA7|vXlv$-mfW}VB-rrixn+kRam8qDU z1kvnJVQ8|bf8c@cNOxUZA!cd<=z}ii^B=1nJ|}r72)FJ%8#Jm*ws1)xZbOcDKtMd$ zPUErQleVX+Rde}`{)6p1Lw0!*J{d+P0szo{=Rlp+3va@w)DWx!xJsIIqR5{B$(Ui- zM83rb17+Csy+GK^#^>c~xU3)a5{Tdf!Zl?+Rajh5^bWlcviC3kyiG{1TwYUy9 zmI#c^z(raNV8=Zv5OKt>U*YodT^(Ea73i~-o=-cm(t2L*jhM;L7VuojSeRy}I0Z48 z0w@_|oCV#9km3XvtVAJ9iSz7YSHtH_Q)Hv}4&+ZY&}EP=g@Vc{lNRsU+$s~#ehIkU zA7}ex$WWpg8Wss~A|cVf@hamgBT>SJP`(z#pSm1FH=f4lWgmG>P!#YixEgOAP@x< zv9H7v0P8K6evqTA0wIJpz}*0aI`bmoCsSWkXdhS9eVz0nZ;@JIGmp|m$sFac0W-LXRyiV40V(X?(Lit!U94%YOwBfhZ)TB2- zR+x~T7_6lea-omTU_}6kkD^;H8vMe}ps!G<7-YoZVnPiowOfGAU(d!F>(jN&@GRGH zkFO+DLg|(H>t2%hvcw8RUwwYfl>S#SgW(jrc^)qu31X>arSx$ZoVqr;9H^tF&TO8% zV8YUp-G{iB^A+N`@RntuEwvtEmLPF2p!L ztBY2!>;NrYf;>Yg6gPbJ4RupY^zL#QBbWh|x^1A@NSsD~>YE&^GAeOALwO>b-y~8G zAdSAimE*w!SC^36dB}VHA~ZkE^>X1}vw+ZCvr>m*O|`Gwn?F>Xa<{*angs>_G<0!Y zlMxg5<;`@KYJiP?YAwf$$fKan@w|5l=KU*<@*&(9?Eu+4N^JM6q%20Kx^1?%P7xb- z{*s$Mjqey#xfx=SFF-t42i|!U!_fPUtKBbVKLvNOjJdfBt=VY4|0}i9;obV_+bUtH zj%6dWTM$oB0Z(v^l{)ZP?Tri%A)zS^rEBWj98V&bHO0tSK$8EMkWaGlC|`$N%P4h{iYH%RlSkvjQY7WtFGsP~EatHtXi_%2Mu76-euG??OPcT=7^r zg6_k;y}bbngeXsWMJOQ>ejf2^byyxIr%lvO5jE;=bVBKRdHQAcbc!h{zUwjDaxp3C ztZIoYFZ|a{9yvwuv(~fxBXkqgNak3?6FO0MsRg)P-nz|R=1FA^Gx%zfsH~&uk!VB` zf^{@LY`{%8&<9MWzA8Jn2>f<`sxzCzBW2VxV~Xq|c(K4Xd+@~7^v?Qw#*K190MTGh zIg>Bzx>K&aycc7p7blwZXO~*i#B}`Ljf6+kvQ)s$5v&K`4#Plzf|C9K8BNYd>WXvAhX^xq9CVY0 zz-wjS{edK3VYj8g?*?sNBSNJI%A0g?{Ne;&j9D`AEileWi$5a8BzDOYSb(FepBM$5 z`q?Mz>l;wq^x$u%boWu$^ZRpdCPD*Iu#4Yu z!ITM5sh=pP9z`l?vcJZs$-VG^Jngl3%;-zn<8e1|zd1T=>1liS_RCOO2P|?(ycP~& zNb{l|&O=jBCkU@94HSs_yKBKI$;G~LkA08E(6<|~d$4fp>gWin@NJc5^s_5-By^04 zB<^eVkl};FtX3neR#j;5x(@KiP8gIzTo4Nr3!| zYY3$9$O8(5!c#p;iRe3Q)^$zt;avXvX_`~&S`@~yU<-}-(6xH-2h2^nInjx;YuB=u zh?L@(w#XC};gIv!rzzQ&ML&NYmKb$mdhkAu#UC1?)!it;?JMD*H2?d|{mV>t!TJRl zh0o(G?Q5G_x~9Y-T?O+6L~4bt62Yu~I|hX$dFr3=l%vr=)6^H%r@nMKj*8FX=xA$HxZJd4{In=A*tO*rcTq;q8y&t_M(dD%{ticbwE0Zt}ksv0~JHCopiUQ_Lh@1m^j~5 zP*@Q5JE739O8=Bb_+M#=hP#jpebd!tHX62^b0ICmMBEK5mlSy#sT2s2qEZ8#a9`SJ zfce-_5*I1`iwQq zPT8;r@x~!iZWGXhz8S%hA#uB;=R?QgMpy2#e8k@RdeOt#Fx%aALc+lC$@j63qURzt z!iO-sZMt4vvuOUeMc=h`-H0wW|Jg2v+$~W}3Hfb*R$c#G`*may-~#CsE*mh@YQo?E zV8;@K%Azm7Q*zVUBVc_K<1f_E8C-w$g_q9d?nbzUjcoQFPpG?&6={Mn9EX&!**s&S zqwkqK`dFbp3w%jsA9zCqeZ_JhjX_kSKBAN(9-NBdDz9;;6e z@yZu5d(?9C(Sh7(=!^a}F%RU#bOmjtly3rf?b{cV$Q9Xc@w9Dxm||E?==M+>JLL;w z)7elZC&JB_Ob~T}5O3f8nYzQTE~Xu(xw#L@s%PwIqFTEQi8N&qNS53y54RF1+gLRS zKz**Mjh!kT#($Ygi{?5!V>|sBdA%G7+oG=|POukB@C|=g4EPz#FUkNn#6UW)Nb)*1 z*#wi9@P3!Mb#Lrw5r@I0pZ|8yUnf`{3tdV-DtQH@ejnp6)iLMH8**|y22*zpY`K~` zuVdTRyT^Tzk2%MT$C{MFIbedcnh!uia{1}FG_{3{K&#^B4hOEJI3_n8>T`*jS@jen zf8=I{3G0sC1O)yf`uFgbrkmi|RJh8_Vf)4LyX6(hWcLL*5@RUvNa~G-H(kRSZ%}=3 zD`fvBW#(MH$IUhHsH}CS9TVZBQ-b%Lu1pYa@JDudGuT1N-`{G9302^hejvMKw5n<1 zoZ04M zjZ?GnWh-<4`s*d#S7(!MZ9|hTdi8NB;%pkACVo9!Eb7m53&GiN=9}0KP7R<|YKsoT zDqsR?eAJ}*&K|s&{^IX*J!|?Se%83oMzn)t^qrN7n`#4UWf6CGZ3DrR;}a8?4S6K(Fjx^~8pQQYwdc!=<1vtIp zLEjuz4_Ol`P_2Kxqgae|#31AqvP)L^JE1>s z4~O!)D;I*Df>g?wv_s%|w2#2&q+q~f%#ZjMSPD@EZJZMF7VDrt%={PmbMbf;-~bp8 zsiwa78KLqk$``~QbLGbt#99<_%Kg9JA&}PXR@>+z0eOX1!TvuZo}CVW|M5cpEMPZ> z&+QiFpQZf$T=&1d;W4Uml)RzsgM7n32cn^{|qR< ygNADQ@7XgId4`7}ovnY-lxW}oOy+-w`zq!$Wm^0l%S;r|CCp&VKO literal 3896 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 + type !== FutureType.LIBRARY_DEPLOYMENT && + type !== FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT + ) + .map(({ id }) => id); + + const scrollRefMap = useRef( + nonLibraryFutureIds.reduce((acc, id) => { + return { ...acc, [id]: createRef() }; + }, {} as Record>) + ); + const toggleMap = Object.fromEntries( - futures - .filter( - ({ type }) => - type !== FutureType.LIBRARY_DEPLOYMENT && - type !== FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT - ) - .map(({ id }) => [id, false]) + nonLibraryFutureIds.map((id) => [id, false]) ); const [toggleState, setToggledInternal] = useState(toggleMap); const setToggled = (id: string) => { - const newState = { ...toggleState, [id]: !toggleState[id] }; + const newToggleStatus = !toggleState[id]; + + if (newToggleStatus) { + scrollRefMap.current[id].current?.scrollIntoView({ + behavior: "smooth", + block: "center", + }); + } + + const newState = { ...toggleState, [id]: newToggleStatus }; setToggledInternal(newState); }; @@ -87,6 +104,7 @@ export const ExecutionBatches: React.FC<{ setToggled={setToggled} setCurrentlyHovered={setCurrentlyHovered} setHoveredFuture={setHoveredFuture} + scrollRefMap={scrollRefMap.current} /> ))} diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 0cd0fe2309..4010bd8d71 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -17,6 +17,7 @@ export const FutureBatch: React.FC<{ setToggled: (id: string) => void; setCurrentlyHovered: (id: string) => void; setHoveredFuture: (id: string) => void; + scrollRefMap: Record>; }> = ({ batch, index, @@ -24,6 +25,7 @@ export const FutureBatch: React.FC<{ setToggled, setCurrentlyHovered, setHoveredFuture, + scrollRefMap, }) => { return ( @@ -39,6 +41,7 @@ export const FutureBatch: React.FC<{ setToggled={setToggled} setCurrentlyHovered={setCurrentlyHovered} setHoveredFuture={setHoveredFuture} + scrollRef={scrollRefMap[future.id]} /> ))} @@ -92,6 +95,7 @@ const FutureBlock: React.FC<{ setCurrentlyHovered: (id: string) => void; setHoveredFuture: (id: string) => void; classKey: string; + scrollRef: React.RefObject; }> = ({ future, toggleState, @@ -99,6 +103,7 @@ const FutureBlock: React.FC<{ setCurrentlyHovered, setHoveredFuture, classKey, + scrollRef, }) => { const futureId = future.id; const toggled = toggleState[futureId]; @@ -114,7 +119,7 @@ const FutureBlock: React.FC<{ : "call-background"; return ( -
    +
    Date: Sat, 7 Oct 2023 12:41:52 -0400 Subject: [PATCH 1019/1302] change tooltip copy --- .../components/execution-batches.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx index 33ac4bcb2e..69a7102fe2 100644 --- a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx +++ b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -120,15 +120,15 @@ const BatchesTooltip: React.FC = () => (
    - Futures that can be parallelized are executed at the same time in + Futures that can be run simultaneously are executed at the same time in batches.

    - The order of the futures represented here is not representative of the - final order when the deployment is executed, which can only be known - once they confirm. The specific order, though, is not relevant for the - deployment, which is why they can be parallelized. + The sequence shown here doesn't reflect the final execution order. + The exact order is determined once they're run. However, this + specific order isn't relevant to the process, allowing for + simultaneous execution.
    From 39bca53dc4305786c915dec83d8e6aea4735ad87 Mon Sep 17 00:00:00 2001 From: Franco Zeoli Date: Sat, 7 Oct 2023 18:44:26 +0000 Subject: [PATCH 1020/1302] Last touch to tooltip copy --- .../visualization-overview/components/execution-batches.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx index 69a7102fe2..8f53b7ad8b 100644 --- a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx +++ b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -125,7 +125,7 @@ const BatchesTooltip: React.FC = () => (

    - The sequence shown here doesn't reflect the final execution order. + The sequence order shown for each batch doesn't reflect the final execution order. The exact order is determined once they're run. However, this specific order isn't relevant to the process, allowing for simultaneous execution. From 25df24c8377163a49fed5f62dc61d96b209204ae Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 08:56:10 +0100 Subject: [PATCH 1021/1302] fix: for long future header titles Switch back to text-align left for the future header text. Limit the centering of text to only the +/- button. --- .../components/future-header.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/ui/src/pages/visualization-overview/components/future-header.tsx index 10a63c8015..211991dd6b 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-header.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-header.tsx @@ -12,7 +12,7 @@ export const FutureHeader: React.FC<{ return (
    - {displayText} + {displayText} ); } @@ -20,7 +20,7 @@ export const FutureHeader: React.FC<{ return ( {isLibrary ?
    : } - {displayText} + {displayText}
    = ({ toggled }) => { - return {toggled ? "- " : "+ "}; + return {toggled ? "- " : "+ "}; }; const ModuleName = styled.div` @@ -49,10 +49,14 @@ const ModuleName = styled.div` padding: 0.5rem; `; -const ToggleNameText = styled.p` +const Text = styled.p` margin: 0; display: inline; padding-top: 0.5rem; padding-bottom: 0.5rem; + text-align: left; +`; + +const ToggleBtnText = styled(Text)` text-align: center; `; From 835695a36931915dfe289d750d31fa1ddac9706d Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 09:11:42 +0100 Subject: [PATCH 1022/1302] fix: tweak call text display of futures We have switched to `.` to represent the separator before the call. --- .../pages/visualization-overview/components/future-batch.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 4010bd8d71..58018fee71 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -156,7 +156,7 @@ function toDisplayText(future: Future): string { case FutureType.LIBRARY_DEPLOYMENT: return `Library deploy ${future.id} from artifact`; case FutureType.CONTRACT_CALL: - return `Call ${future.contract.contractName}/${future.functionName}`; + return `Call ${future.contract.contractName}.${future.functionName}`; case FutureType.STATIC_CALL: return `Static call ${future.id}`; case FutureType.NAMED_ARTIFACT_CONTRACT_AT: From 7be5935e45a0599a8a285bb398356334d0293c17 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 09:44:31 +0100 Subject: [PATCH 1023/1302] fix(visualize): separate argument from li We use the Argument components both in lists and as standalone values (`to` in send data for example). The previous Argument component included a li which doesn't work as well for the standalone values. The `li` is now added at the list level, while the Argument component returns either a `p` or `a` depending on the type of argument being displayed. --- packages/ui/src/main.css | 4 -- .../components/future-batch.tsx | 59 ++++++++++++------- 2 files changed, 38 insertions(+), 25 deletions(-) diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 44aee5ac6a..0a8c0c8e08 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -43,10 +43,6 @@ body { max-width: 391px !important; } -.future-argument:hover { - font-weight: 700; -} - /* mermaid styles */ .mermaid * { diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 58018fee71..a93d04b9c8 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -218,12 +218,13 @@ const FutureDetailsSection: React.FC<{

    {args.length === 0 ? "No " : null}Constructor Arguments

      {args.map(([, arg], i) => ( - +
    • + +
    • ))}
    @@ -239,12 +240,13 @@ const FutureDetailsSection: React.FC<{

    {args.length === 0 ? "No " : null}Arguments

      {args.map(([, arg], i) => ( - +
    • + +
    • ))}
    @@ -257,12 +259,13 @@ const FutureDetailsSection: React.FC<{

    {args.length === 0 ? "No " : null}Arguments

      {args.map(([, arg], i) => ( - +
    • + +
    • ))}
    @@ -327,7 +330,7 @@ const Argument: React.FC<{ }> = ({ setToggled, arg, setHoveredFuture }) => { if (isFuture(arg)) { return ( -
  • setHoveredFuture("")} > {argumentTypeToString(arg)} -
  • + ); } - return
  • {argumentTypeToString(arg)}
  • ; + return {argumentTypeToString(arg)}; }; + +const ArgumentText = styled.p` + margin: 0; +`; + +const ArgumentLink = styled.a` + textdecoration: underline; + color: #16181d; + cursor: pointer; + + &:hover { + font-weight: 700; + } +`; From 4022d8cd3ca36fa8419226c0b16758b2ecd8ced2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 10:07:16 +0100 Subject: [PATCH 1024/1302] chore: remove unneeded comment lines --- packages/ui/src/main.tsx | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/ui/src/main.tsx b/packages/ui/src/main.tsx index aaa1d8119b..29478e42a0 100644 --- a/packages/ui/src/main.tsx +++ b/packages/ui/src/main.tsx @@ -59,11 +59,6 @@ const main = async () => { document.title = `${ignitionModule.id} Deployment Visualization - Hardhat Ignition`; - // const link = document.createElement("link"); - // link.rel = "shortcut icon"; - // link.href = faviconBase64; - // document.head.appendChild(link); - const router = createHashRouter([ { path: "/", From f3f5f569e001fb26b65eaccd2fd5829b02d7d186 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 5 Oct 2023 22:25:34 +0000 Subject: [PATCH 1025/1302] Add support for networks with less blocks than the amount of required confirmations --- .../get-nonce-sync-messages.ts | 30 +++++++++++++------ 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts index dd4511ce48..21f244324b 100644 --- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts @@ -77,16 +77,19 @@ export async function getNonceSyncMessages( ); const block = await jsonRpcClient.getLatestBlock(); - // TODO: What happens if this is < 0? - const confirmedBlockNumber = block.number - requiredConfirmations + 1; + const confirmedBlockNumber: number | undefined = + block.number - requiredConfirmations + 1 >= 0 + ? block.number - requiredConfirmations + 1 + : undefined; for (const [sender, pendingTransactions] of Object.entries( pendingTransactionsPerSender )) { - const safeConfirmationsCount = await jsonRpcClient.getTransactionCount( - sender, - confirmedBlockNumber - ); + // If this is undefined, it means that no transaction has fully confirmed. + const safeConfirmationsCount = + confirmedBlockNumber !== undefined + ? await jsonRpcClient.getTransactionCount(sender, confirmedBlockNumber) + : undefined; const pendingCount = await jsonRpcClient.getTransactionCount( sender, @@ -98,9 +101,14 @@ export async function getNonceSyncMessages( "latest" ); + const hasPendingTransactions = + safeConfirmationsCount === undefined + ? pendingCount > 0 + : safeConfirmationsCount !== pendingCount; + // Case 0: We don't have any pending transactions if (pendingTransactions.length === 0) { - if (safeConfirmationsCount !== pendingCount) { + if (hasPendingTransactions) { throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_CONFIRMATIONS, { sender, requiredConfirmations, @@ -139,10 +147,14 @@ export async function getNonceSyncMessages( // That means there is a block that includes it // If we look at the latest transaction count, it will be at least 6 if (latestCount > nonce) { + const hasEnoughConfirmations = + safeConfirmationsCount !== undefined && + safeConfirmationsCount >= nonce; + // We know the ignition transaction was replaced, and the replacement // transaction has at least one confirmation. // We don't continue until the user's transactions have enough confirmations - if (safeConfirmationsCount <= nonce) { + if (!hasEnoughConfirmations) { throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_NONCE, { sender, nonce, @@ -195,7 +207,7 @@ export async function getNonceSyncMessages( if (highestPendingNonce + 1 < pendingCount) { // If they have enough confirmation we continue, otherwise we throw // and wait for further confirmations - if (safeConfirmationsCount !== pendingCount) { + if (hasPendingTransactions) { throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_NONCE, { sender, nonce: pendingCount - 1, From 8d64b93826ba39411c902cc0f474b388c673fe7c Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 5 Oct 2023 22:25:53 +0000 Subject: [PATCH 1026/1302] Update the nonce sync tests --- .../get-nonce-sync-messages.ts | 838 ++++++++++-------- 1 file changed, 473 insertions(+), 365 deletions(-) diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index 202cd1d8b3..caa679309a 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -27,7 +27,6 @@ import { import { exampleAccounts } from "../../helpers"; const requiredConfirmations = 5; -const latestBlock = 10; describe("execution - getNonceSyncMessages", () => { let exampleModule: IgnitionModule< @@ -145,394 +144,499 @@ describe("execution - getNonceSyncMessages", () => { `IGN403: You have sent transactions from ${exampleAccounts[1]}. Please wait until they get 5 confirmations before running Ignition again.` ); }); - }); - describe("second deployment run", () => { - it("should succeed with an in-flight transaction that has been mined between runs", async () => { - // Assuming a fresh chain, and a deployment that was halted on the first - // future and its deploy transaction is included in a block before the - // next run - - // The in-flight transaction has been included in a block, so latest includes it - const latestCount = 1; - // Safest is x blocks in the past so is zero - const safestCount = 0; - // There are no pending - const pendingCount = latestCount; - // The nonce of the now complete transaction is 0 - const nonce = 0; + describe("With less blocks than the required confirmations", () => { + it("Should run on if there aren't any transaction", async () => { + // No transactions + const latestCount1 = 0; + const pendingCount1 = latestCount1; - const deploymentState = - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + const latestCount2 = 0; + const pendingCount2 = latestCount2; - const inflightTxHash = ( - ( - deploymentState.executionStates[ - "Example#MyContract" - ] as DeploymentExecutionState - ).networkInteractions[0] as OnchainInteraction - ).transactions[0].hash; + const ignitionModule = buildModule("Example", (m) => { + m.contract("MyContract", [], { from: exampleAccounts[1] }); + m.contract("AnotherContract", [], { from: undefined }); - await assertNoSyncMessageNeeded({ - ignitionModule: exampleModule, - deploymentState, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, - }, - }, - // We are saying that the inflight transaction is now included in a block - getTransaction: (txHash: string) => { - if (txHash !== inflightTxHash) { - throw new Error( - `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` - ); - } + return {}; + }); - return { _kind: "FAKE_TRANSACTION" }; - }, - }); - }); - - it("should succeed with an in-flight transaction that has been completely confirmed between runs", async () => { - // Assuming a fresh chain, and a deployment that was halted on the first - // future and its deploy transaction is completly confirmed now - - const latestCount = 1; - const safestCount = 1; - const pendingCount = latestCount; - const nonce = 0; - - const deploymentState = - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); - - const inflightTxHash = ( - ( - deploymentState.executionStates[ - "Example#MyContract" - ] as DeploymentExecutionState - ).networkInteractions[0] as OnchainInteraction - ).transactions[0].hash; - - await assertNoSyncMessageNeeded({ - ignitionModule: exampleModule, - deploymentState, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, + await assertGetNonceSyncResult( + { + ignitionModule, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount1, + latest: latestCount1, + number: () => { + throw new Error("Should not be called"); + }, + }, + [exampleAccounts[2]]: { + pending: pendingCount2, + latest: latestCount2, + number: () => { + throw new Error("Should not be called"); + }, + }, + }, + latestBlockNumber: 0, }, - }, - // We are saying that the inflight transaction is now completely - getTransaction: (txHash: string) => { - if (txHash !== inflightTxHash) { - throw new Error( - `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` - ); - } - - return { _kind: "FAKE_TRANSACTION" }; - }, + [] + ); }); - }); - - it("should succeed with an in-flight transaction that has not been mined between runs but is in the mempool", async () => { - // Assuming a fresh chain, and a deployment that was halted on the first - // future and its deploy transaction is in the mempool but not mined - // at the start of the second run - const latestCount = 0; - const safestCount = 0; - const pendingCount = latestCount + 1; - const nonce = 0; + it("Should throw if there's any transaction sent by the user", async () => { + // No transactions + const latestCount1 = 1; + const pendingCount1 = latestCount1; - const deploymentState = - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + const ignitionModule = buildModule("Example", (m) => { + m.contract("MyContract", [], { from: exampleAccounts[1] }); - const inflightTxHash = ( - ( - deploymentState.executionStates[ - "Example#MyContract" - ] as DeploymentExecutionState - ).networkInteractions[0] as OnchainInteraction - ).transactions[0].hash; + return {}; + }); - await assertNoSyncMessageNeeded({ - ignitionModule: exampleModule, - deploymentState, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, + await assertGetNonceSyncThrows( + { + ignitionModule, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount1, + latest: latestCount1, + number: () => { + throw new Error("Should not be called"); + }, + }, + // We define this just to validate that it's ignored, as its the default sender, but it won't be used + [exampleAccounts[2]]: { + pending: 2, + latest: 2, + number: () => { + throw new Error("Should not be called"); + }, + }, + }, + latestBlockNumber: 3, }, - }, - // We are saying that the inflight transaction is still in the mempool - getTransaction: (txHash: string) => { - if (txHash !== inflightTxHash) { - throw new Error( - `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` - ); - } - - return { _kind: "FAKE_TRANSACTION" }; - }, + `IGN403: You have sent transactions from ${exampleAccounts[1]}. Please wait until they get 5 confirmations before running Ignition again.` + ); }); }); + }); - it("should indicate the user replaced the transaction and the user transaction is safely confirmed", async () => { - // Set latest to be an arbitrary nonce - const latestCount = 30; - // Set safest to be the same as latest, it is not relevant - const safestCount = latestCount; - // There are no pending transactions - const pendingCount = latestCount; - // Set the nonce to be less than latest, indicating it was replaced - const nonce = latestCount - 1; - - await assertGetNonceSyncResult( - { - ignitionModule: exampleModule, - deploymentState: - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, + describe("second deployment run", () => { + const latestBlockNumbers = [0, 3, 10]; + + for (const latestBlockNumber of latestBlockNumbers) { + describe(`With latest block ${latestBlockNumber}`, () => { + it("should succeed with an in-flight transaction that has been mined between runs", async () => { + // Assuming a fresh chain, and a deployment that was halted on the first + // future and its deploy transaction is included in a block before the + // next run + + // The in-flight transaction has been included in a block, so latest includes it + const latestCount = 1; + // Safest is x blocks in the past so is zero + const safestCount = 0; + // There are no pending + const pendingCount = latestCount; + // The nonce of the now complete transaction is 0 + const nonce = 0; + + const deploymentState = + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + + const inflightTxHash = ( + ( + deploymentState.executionStates[ + "Example#MyContract" + ] as DeploymentExecutionState + ).networkInteractions[0] as OnchainInteraction + ).transactions[0].hash; + + await assertNoSyncMessageNeeded({ + ignitionModule: exampleModule, + deploymentState, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, }, - }, - }, - [ - { - futureId: "Example#MyContract", - networkInteractionId: 1, - type: JournalMessageType.ONCHAIN_INTERACTION_REPLACED_BY_USER, - }, - ] - ); - }); - - it("should throw if the user replaced the transaction and the user transaction is mined but has not yet fully confirmed", async () => { - // set an arbitrary nonce - const nonce = 16; - // put the latest as bigger than the nonce being checked - const latest = nonce + 1; - // there are no pending - const pending = latest; - // the safest is behind the nonce - const safest = nonce - 1; - - await assertGetNonceSyncThrows( - { - ignitionModule: exampleModule, - deploymentState: - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), - transactionCountEntries: { - [exampleAccounts[1]]: { - pending, - latest, - number: () => safest, + // We are saying that the inflight transaction is now included in a block + getTransaction: (txHash: string) => { + if (txHash !== inflightTxHash) { + throw new Error( + `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` + ); + } + + return { _kind: "FAKE_TRANSACTION" }; }, - }, - }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16. Please wait until they get 5 confirmations before running Ignition again.` - ); - }); - - it("should error if the user replaced the transaction and the user transaction is in the mempool but not mined (pending)", async () => { - // Set latest to an arbitary nonce - const latestCount = 30; - // Safe is the same as latest - const safestCount = latestCount; - // Set the nonce to be the latest (nonce's are ids not cardinalities) - const nonce = latestCount; - // Set pending larger than the nonce - const pendingCount = nonce + 1; - - await assertGetNonceSyncThrows( - { - ignitionModule: exampleModule, - deploymentState: - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, + latestBlockNumber, + }); + }); + + it("should succeed with an in-flight transaction that has been completely confirmed between runs", async () => { + // Assuming a fresh chain, and a deployment that was halted on the first + // future and its deploy transaction is completly confirmed now + + const latestCount = 1; + const safestCount = 1; + const pendingCount = latestCount; + const nonce = 0; + + const deploymentState = + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + + const inflightTxHash = ( + ( + deploymentState.executionStates[ + "Example#MyContract" + ] as DeploymentExecutionState + ).networkInteractions[0] as OnchainInteraction + ).transactions[0].hash; + + await assertNoSyncMessageNeeded({ + ignitionModule: exampleModule, + deploymentState, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, }, - }, - }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30. Please wait until they get 5 confirmations before running Ignition again.` - ); - }); - - it("should throw if the user sent transactions with higher nonces than ignition's highest pending nonce, that have not all confirmed", async () => { - // The ignition transaction is in the mempool but unmined - // Further user transactions have followed from the user, they have not - // mined either yet - by definition. - - // set an arbitrary nonce - const nonce = 10; - // Set the latest to be equivalent to the everything before the - // Ignition transaction waiting in the mempool - const latest = nonce; - // there are further user provided transactions pending - const pending = latest + 1 /* ignition sent */ + 1; /* user sent */ - // the safest has only caught up with latest - const safest = latest; - - const deploymentState = - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); - - const inflightTxHash = ( - ( - deploymentState.executionStates[ - "Example#MyContract" - ] as DeploymentExecutionState - ).networkInteractions[0] as OnchainInteraction - ).transactions[0].hash; - - await assertGetNonceSyncThrows( - { - ignitionModule: exampleModule, - deploymentState, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending, - latest, - number: () => safest, + // We are saying that the inflight transaction is now completely + getTransaction: (txHash: string) => { + if (txHash !== inflightTxHash) { + throw new Error( + `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` + ); + } + + return { _kind: "FAKE_TRANSACTION" }; }, - }, - getTransaction: (txHash: string) => { - if (txHash !== inflightTxHash) { - throw new Error( - `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` - ); - } - - return { _kind: "FAKE_TRANSACTION" }; - }, - }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11. Please wait until they get 5 confirmations before running Ignition again.` - ); - }); - - it("should pass if the user sent transactions with higher nonces than ignition's highest pending nonce but they have confirmed", async () => { - // The ignition transaction was sent, the process killed, but is now mined. - // Further user transactions have followed from the user, they have been mined - // and are now confirmed. - - // set an arbitrary nonce - const nonce = 10; - // Set the latest to be equivalent of the Ignition nonce mined - // plus an additional user transaction also mined - const latest = nonce + 1 /* ignition sent */ + 1; /* user sent */ - // there are thus none pending - const pending = latest; - // the safest caught up with latest - const safest = latest; - - const deploymentState = - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); - - const inflightTxHash = ( - ( - deploymentState.executionStates[ - "Example#MyContract" - ] as DeploymentExecutionState - ).networkInteractions[0] as OnchainInteraction - ).transactions[0].hash; - - await assertNoSyncMessageNeeded({ - ignitionModule: exampleModule, - deploymentState, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending, - latest, - number: () => safest, - }, - }, - getTransaction: (txHash: string) => { - if (txHash !== inflightTxHash) { - throw new Error( - `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` - ); + latestBlockNumber, + }); + }); + + it("should succeed with an in-flight transaction that has not been mined between runs but is in the mempool", async () => { + // Assuming a fresh chain, and a deployment that was halted on the first + // future and its deploy transaction is in the mempool but not mined + // at the start of the second run + + const latestCount = 0; + const safestCount = 0; + const pendingCount = latestCount + 1; + const nonce = 0; + + const deploymentState = + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + + const inflightTxHash = ( + ( + deploymentState.executionStates[ + "Example#MyContract" + ] as DeploymentExecutionState + ).networkInteractions[0] as OnchainInteraction + ).transactions[0].hash; + + await assertNoSyncMessageNeeded({ + ignitionModule: exampleModule, + deploymentState, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, + }, + // We are saying that the inflight transaction is still in the mempool + getTransaction: (txHash: string) => { + if (txHash !== inflightTxHash) { + throw new Error( + `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` + ); + } + + return { _kind: "FAKE_TRANSACTION" }; + }, + latestBlockNumber, + }); + }); + + it("should indicate the user replaced the transaction and the user transaction is safely confirmed", async () => { + if (latestBlockNumber < requiredConfirmations - 1) { + // This test doesn't make sense if we can't really get completely confirmed transactions + return; } - return { _kind: "FAKE_TRANSACTION" }; - }, - }); - }); - - it("should indicate if the ignition transaction was dropped from mempool (no user interference)", async () => { - // Set an arbitary latest - const latestCount = 30; - // The safest is exactly the same as latest - const safestCount = latestCount; - // Pending isn't relevant so is set to latest - const pendingCount = latestCount; - // Set the nonce to latest (note nonce is not a cardinality), - // indicating it was dropped as latest/pending should be larger - // than the nonce - const nonce = latestCount; - - await assertGetNonceSyncResult( - { - ignitionModule: exampleModule, - deploymentState: - setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, + // Set latest to be an arbitrary nonce + const latestCount = 30; + // Set safest to be the same as latest, it is not relevant + const safestCount = latestCount; + // There are no pending transactions + const pendingCount = latestCount; + // Set the nonce to be less than latest, indicating it was replaced + const nonce = latestCount - 1; + + await assertGetNonceSyncResult( + { + ignitionModule: exampleModule, + deploymentState: + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, + }, + latestBlockNumber, }, - }, - }, - [ - { - futureId: "Example#MyContract", - networkInteractionId: 1, - type: JournalMessageType.ONCHAIN_INTERACTION_DROPPED, - }, - ] - ); - }); - - it("should ignore futures that have already been completed", async () => { - // Safest count nonce is set arbitarily - const latestCount = 40; - // Safest is the same as latest - const safestCount = latestCount; - // There are multiple pending transactions on top of latest - const pendingCount = latestCount + 99; + [ + { + futureId: "Example#MyContract", + networkInteractionId: 1, + type: JournalMessageType.ONCHAIN_INTERACTION_REPLACED_BY_USER, + }, + ] + ); + }); + + it("should throw if the user replaced the transaction and the user transaction is mined but has not yet fully confirmed", async () => { + // set an arbitrary nonce + const nonce = 16; + // put the latest as bigger than the nonce being checked + const latest = nonce + 1; + // there are no pending + const pending = latest; + // the safest is behind the nonce + const safest = nonce - 1; + + await assertGetNonceSyncThrows( + { + ignitionModule: exampleModule, + deploymentState: + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), + transactionCountEntries: { + [exampleAccounts[1]]: { + pending, + latest, + number: () => safest, + }, + }, + latestBlockNumber, + }, + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16. Please wait until they get 5 confirmations before running Ignition again.` + ); + }); + + it("should error if the user replaced the transaction and the user transaction is in the mempool but not mined (pending)", async () => { + // Set latest to an arbitary nonce + const latestCount = 30; + // Safe is the same as latest + const safestCount = latestCount; + // Set the nonce to be the latest (nonce's are ids not cardinalities) + const nonce = latestCount; + // Set pending larger than the nonce + const pendingCount = nonce + 1; + + await assertGetNonceSyncThrows( + { + ignitionModule: exampleModule, + deploymentState: + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, + }, + latestBlockNumber, + }, + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30. Please wait until they get 5 confirmations before running Ignition again.` + ); + }); + + it("should throw if the user sent transactions with higher nonces than ignition's highest pending nonce, that have not all confirmed", async () => { + // The ignition transaction is in the mempool but unmined + // Further user transactions have followed from the user, they have not + // mined either yet - by definition. + + // set an arbitrary nonce + const nonce = 10; + // Set the latest to be equivalent to the everything before the + // Ignition transaction waiting in the mempool + const latest = nonce; + // there are further user provided transactions pending + const pending = latest + 1 /* ignition sent */ + 1; /* user sent */ + // the safest has only caught up with latest + const safest = latest; + + const deploymentState = + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + + const inflightTxHash = ( + ( + deploymentState.executionStates[ + "Example#MyContract" + ] as DeploymentExecutionState + ).networkInteractions[0] as OnchainInteraction + ).transactions[0].hash; + + await assertGetNonceSyncThrows( + { + ignitionModule: exampleModule, + deploymentState, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending, + latest, + number: () => safest, + }, + }, + getTransaction: (txHash: string) => { + if (txHash !== inflightTxHash) { + throw new Error( + `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` + ); + } + + return { _kind: "FAKE_TRANSACTION" }; + }, + latestBlockNumber, + }, + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11. Please wait until they get 5 confirmations before running Ignition again.` + ); + }); + + it("should pass if the user sent transactions with higher nonces than ignition's highest pending nonce but they have confirmed", async () => { + if (latestBlockNumber < requiredConfirmations - 1) { + // This test doesn't make sense if we can't really get completely confirmed transactions + return; + } - await assertNoSyncMessageNeeded({ - ignitionModule: exampleModule, - deploymentState: { - ...deploymentStateReducer(), - executionStates: { - "Example#MyContract": { - ...exampleDeploymentState, - id: "Example#MyContract", - status: ExecutionStatus.SUCCESS, + // The ignition transaction was sent, the process killed, but is now mined. + // Further user transactions have followed from the user, they have been mined + // and are now confirmed. + + // set an arbitrary nonce + const nonce = 10; + // Set the latest to be equivalent of the Ignition nonce mined + // plus an additional user transaction also mined + const latest = nonce + 1 /* ignition sent */ + 1; /* user sent */ + // there are thus none pending + const pending = latest; + // the safest caught up with latest + const safest = latest; + + const deploymentState = + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce); + + const inflightTxHash = ( + ( + deploymentState.executionStates[ + "Example#MyContract" + ] as DeploymentExecutionState + ).networkInteractions[0] as OnchainInteraction + ).transactions[0].hash; + + await assertNoSyncMessageNeeded({ + ignitionModule: exampleModule, + deploymentState, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending, + latest, + number: () => safest, + }, }, - }, - }, - transactionCountEntries: { - [exampleAccounts[1]]: { - pending: pendingCount, - latest: latestCount, - number: () => safestCount, - }, - }, + getTransaction: (txHash: string) => { + if (txHash !== inflightTxHash) { + throw new Error( + `Mock getTransaction was not expecting the getTransaction request for: ${txHash}` + ); + } + + return { _kind: "FAKE_TRANSACTION" }; + }, + latestBlockNumber, + }); + }); + + it("should indicate if the ignition transaction was dropped from mempool (no user interference)", async () => { + // Set an arbitary latest + const latestCount = 30; + // The safest is exactly the same as latest + const safestCount = latestCount; + // Pending isn't relevant so is set to latest + const pendingCount = latestCount; + // Set the nonce to latest (note nonce is not a cardinality), + // indicating it was dropped as latest/pending should be larger + // than the nonce + const nonce = latestCount; + + await assertGetNonceSyncResult( + { + ignitionModule: exampleModule, + deploymentState: + setupDeploymentStateBasedOnExampleModuleWithOneTranWith(nonce), + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, + }, + latestBlockNumber, + }, + [ + { + futureId: "Example#MyContract", + networkInteractionId: 1, + type: JournalMessageType.ONCHAIN_INTERACTION_DROPPED, + }, + ] + ); + }); + + it("should ignore futures that have already been completed", async () => { + // Safest count nonce is set arbitarily + const latestCount = 40; + // Safest is the same as latest + const safestCount = latestCount; + // There are multiple pending transactions on top of latest + const pendingCount = latestCount + 99; + + await assertNoSyncMessageNeeded({ + ignitionModule: exampleModule, + deploymentState: { + ...deploymentStateReducer(), + executionStates: { + "Example#MyContract": { + ...exampleDeploymentState, + id: "Example#MyContract", + status: ExecutionStatus.SUCCESS, + }, + }, + }, + transactionCountEntries: { + [exampleAccounts[1]]: { + pending: pendingCount, + latest: latestCount, + number: () => safestCount, + }, + }, + latestBlockNumber, + }); + }); }); - }); + } }); }); @@ -552,6 +656,7 @@ async function assertGetNonceSyncThrows( }; }; getTransaction?: (txHash: string) => any; + latestBlockNumber?: number; }, errorMessage: string ) { @@ -569,6 +674,7 @@ async function assertNoSyncMessageNeeded(ctx: { }; }; getTransaction?: (txHash: string) => any; + latestBlockNumber?: number; }) { return assertGetNonceSyncResult(ctx, []); } @@ -579,6 +685,7 @@ async function assertGetNonceSyncResult( deploymentState = deploymentStateReducer(), transactionCountEntries = {}, getTransaction, + latestBlockNumber = 10, }: { ignitionModule: IgnitionModule< string, @@ -594,13 +701,14 @@ async function assertGetNonceSyncResult( }; }; getTransaction?: (txHash: string) => any; + latestBlockNumber?: number; }, expectedResult: Array< OnchainInteractionReplacedByUserMessage | OnchainInteractionDroppedMessage > ) { const mockJsonRpcClient = setupJsonRpcClient( - latestBlock, + latestBlockNumber, transactionCountEntries, getTransaction ); From 162a2f5d8ae9e9c7341dcd34bc6c783b5b91a3fd Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 6 Oct 2023 18:20:42 +0000 Subject: [PATCH 1027/1302] Update packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts Co-authored-by: John Kane --- .../test/execution/nonce-management/get-nonce-sync-messages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index caa679309a..84d3ff58a3 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -229,7 +229,7 @@ describe("execution - getNonceSyncMessages", () => { const latestBlockNumbers = [0, 3, 10]; for (const latestBlockNumber of latestBlockNumbers) { - describe(`With latest block ${latestBlockNumber}`, () => { + describe(`With latest block #${latestBlockNumber} and ${requiredConfirmations} required confirmations`, () => { it("should succeed with an in-flight transaction that has been mined between runs", async () => { // Assuming a fresh chain, and a deployment that was halted on the first // future and its deploy transaction is included in a block before the From 7eee0f314cd53b5d9d4a10333f1942dc28d024a6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 10:40:42 +0100 Subject: [PATCH 1028/1302] refactor: rename pending and count variables for clarity The original versions didn't give clarity that there are two sets of pending transactions. The transactions that were in-flight from Ignitions previous run, and the pending count on-chain for the account. The renames and explanations hopefully clarify this distinction. --- .../get-nonce-sync-messages.ts | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts index 21f244324b..5d80f25e29 100644 --- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts @@ -82,7 +82,7 @@ export async function getNonceSyncMessages( ? block.number - requiredConfirmations + 1 : undefined; - for (const [sender, pendingTransactions] of Object.entries( + for (const [sender, pendingIgnitionTransactions] of Object.entries( pendingTransactionsPerSender )) { // If this is undefined, it means that no transaction has fully confirmed. @@ -101,14 +101,19 @@ export async function getNonceSyncMessages( "latest" ); - const hasPendingTransactions = + // Is the pending count the same as the safe count (x confirmation blocks + // in the past), then all pending transactions have been safely confirmed. + // There is one other case, where the current block is so low, we + // can't have enough confirmations (i.e. block 2 when confirmations required + // is 5). In that case all pending onchain transactions are unconfirmed. + const hasOnchainUnconfirmedPendingTransactions = safeConfirmationsCount === undefined ? pendingCount > 0 : safeConfirmationsCount !== pendingCount; - // Case 0: We don't have any pending transactions - if (pendingTransactions.length === 0) { - if (hasPendingTransactions) { + // Case 0: We don't have any pending Ignition transactions + if (pendingIgnitionTransactions.length === 0) { + if (hasOnchainUnconfirmedPendingTransactions) { throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_CONFIRMATIONS, { sender, requiredConfirmations, @@ -121,7 +126,7 @@ export async function getNonceSyncMessages( transactions, executionStateId, networkInteractionId, - } of pendingTransactions) { + } of pendingIgnitionTransactions) { const fetchedTransactions = await Promise.all( transactions.map((tx) => jsonRpcClient.getTransaction(tx)) ); @@ -201,13 +206,13 @@ export async function getNonceSyncMessages( // Case 4: the user sent additional transactions with nonces higher than // our highest pending nonce. const highestPendingNonce = Math.max( - ...pendingTransactions.map((t) => t.nonce) + ...pendingIgnitionTransactions.map((t) => t.nonce) ); if (highestPendingNonce + 1 < pendingCount) { // If they have enough confirmation we continue, otherwise we throw // and wait for further confirmations - if (hasPendingTransactions) { + if (hasOnchainUnconfirmedPendingTransactions) { throw new IgnitionError(ERRORS.EXECUTION.WAITING_FOR_NONCE, { sender, nonce: pendingCount - 1, From 8f511feb52d5d751847e3bbbf28d189216cd44e7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 5 Oct 2023 18:53:57 +0100 Subject: [PATCH 1029/1302] chore: update version of HH to 2.18.0 This is to leverage the new scoped-tasks. --- examples/complete/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/.gitignore | 2 +- examples/ts-sample/package.json | 2 +- examples/uniswap/package.json | 2 +- package-lock.json | 205 ++++++++++++++------------- packages/hardhat-plugin/package.json | 4 +- 8 files changed, 115 insertions(+), 106 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 4d6ab52521..5a53374909 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ens/package.json b/examples/ens/package.json index 2455304bc4..5610b495e8 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" }, "dependencies": { diff --git a/examples/sample/package.json b/examples/sample/package.json index f10a96d365..b417bb3ad3 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ts-sample/.gitignore b/examples/ts-sample/.gitignore index 71f6a160fc..13d4977246 100644 --- a/examples/ts-sample/.gitignore +++ b/examples/ts-sample/.gitignore @@ -8,4 +8,4 @@ typechain-types #Hardhat files cache artifacts - +ignition/deployments diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 8a9afe9a7b..26a7318571 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json index e6025a29cb..490c68f2f4 100644 --- a/examples/uniswap/package.json +++ b/examples/uniswap/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" }, "dependencies": { diff --git a/package-lock.json b/package-lock.json index 80bb5ece26..2963583c6d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -253,7 +253,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -469,7 +469,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -671,7 +671,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -883,7 +883,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.4.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -3661,15 +3661,15 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.1.tgz", - "integrity": "sha512-u1Yioemi6Ckj3xspygu/SfFvm8vZEO8/Yx5a1QLzi6nVU0jz3Pg2OmHKJ5w+D9Ogk1vhwRiqEBAqcb0GVhCyHw==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", + "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "ethereum-cryptography": "0.1.3", "ethers": "^5.7.1" }, @@ -3681,6 +3681,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3700,17 +3701,17 @@ } }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.1.tgz", - "integrity": "sha512-NhzndlGg829XXbqJEYrF1VeZhAwSPgsK/OB7TVrdzft3y918hW5KNd7gIZ85sn6peDZOdjBsAXIpXZ38oBYE5A==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-ethash": "3.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", + "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-ethash": "3.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "abstract-level": "^1.0.3", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", @@ -3726,6 +3727,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3745,22 +3747,22 @@ } }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.1.tgz", - "integrity": "sha512-OBErlkfp54GpeiE06brBW/TTbtbuBJV5YI5Nz/aB2evTDo+KawyEzPjBlSr84z/8MFfj8wS2wxzQX1o32cev5g==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", + "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-util": "9.0.2", "crc-32": "^1.2.0" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.1.tgz", - "integrity": "sha512-KDjGIB5igzWOp8Ik5I6QiRH5DH+XgILlplsHR7TEuWANZA759G6krQ6o8bvj+tRUz08YygMQu/sGd9mJ1DYT8w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", + "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "abstract-level": "^1.0.3", "bigint-crypto-utils": "^3.0.23", "ethereum-cryptography": "0.1.3" @@ -3773,6 +3775,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3792,14 +3795,14 @@ } }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.1.tgz", - "integrity": "sha512-oL8vJcnk0Bx/onl+TgQOQ1t/534GKFaEG17fZmwtPFeH8S5soiBYPCLUrvANOl4sCp9elYxIMzIiTtMtNNN8EQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", + "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", "dependencies": { "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "mcl-wasm": "^0.7.1", @@ -3813,6 +3816,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3832,9 +3836,9 @@ } }, "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.1.tgz", - "integrity": "sha512-xtxrMGa8kP4zF5ApBQBtjlSbN5E2HI8m8FYgVSYAnO6ssUoY5pVPGy2H8+xdf/bmMa22Ce8nWMH3aEW8CcqMeQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", + "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", "bin": { "rlp": "bin/rlp" }, @@ -3843,12 +3847,12 @@ } }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.1.tgz", - "integrity": "sha512-B5ApMOnlruVOR7gisBaYwFX+L/AP7i/2oAahatssjPIBVDF6wTX1K7Qpa39E/nzsH8iYuL3krkYeUFIdO3EMUQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", + "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "ethers": "^5.7.1", @@ -3859,6 +3863,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3878,12 +3883,12 @@ } }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.1.tgz", - "integrity": "sha512-A64It/IMpDVODzCgxDgAAla8jNjNtsoQZIzZUfIV5AY6Coi4nvn7+VReBn5itlxMiL2yaTlQr9TRWp3CSI6VoA==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", + "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", "readable-stream": "^3.6.0" @@ -3896,6 +3901,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3915,15 +3921,15 @@ } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.1.tgz", - "integrity": "sha512-0HwxUF2u2hrsIM1fsasjXvlbDOq1ZHFV2dd1yGq8CA+MEYhaxZr8OTScpVkkxqMwBcc5y83FyPl0J9MZn3kY0w==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", + "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", "dependencies": { "@chainsafe/ssz": "^0.9.2", "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "ethereum-cryptography": "0.1.3" }, "engines": { @@ -3934,6 +3940,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3953,12 +3960,12 @@ } }, "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.1.tgz", - "integrity": "sha512-TwbhOWQ8QoSCFhV/DDfSmyfFIHjPjFBj957219+V3jTZYZ2rf9PmDtNOeZWAE3p3vlp8xb02XGpd0v6nTUPbsA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", + "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", "dependencies": { "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", "ethereum-cryptography": "0.1.3" }, "engines": { @@ -3986,6 +3993,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -4005,19 +4013,19 @@ } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.1.tgz", - "integrity": "sha512-rArhyn0jPsS/D+ApFsz3yVJMQ29+pVzNZ0VJgkzAZ+7FqXSRtThl1C1prhmlVr3YNUlfpZ69Ak+RUT4g7VoOuQ==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", + "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", "mcl-wasm": "^0.7.1", @@ -4031,6 +4039,7 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -6821,9 +6830,9 @@ } }, "node_modules/bigint-crypto-utils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.2.2.tgz", - "integrity": "sha512-U1RbE3aX9ayCUVcIPHuPDPKcK3SFOXf93J1UK/iHlJuQB7bhagPIX06/CLpLEsDThJ7KA4Dhrnzynl+d2weTiw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "engines": { "node": ">=14.0.0" } @@ -12164,22 +12173,22 @@ } }, "node_modules/hardhat": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.17.1.tgz", - "integrity": "sha512-1PxRkfjhEzXs/wDxI5YgzYBxNmvzifBTjYzuopwel+vXpAhCudplusJthN5eig0FTs4qbi828DBIITEDh8x9LA==", + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", + "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.1", - "@nomicfoundation/ethereumjs-blockchain": "7.0.1", - "@nomicfoundation/ethereumjs-common": "4.0.1", - "@nomicfoundation/ethereumjs-evm": "2.0.1", - "@nomicfoundation/ethereumjs-rlp": "5.0.1", - "@nomicfoundation/ethereumjs-statemanager": "2.0.1", - "@nomicfoundation/ethereumjs-trie": "6.0.1", - "@nomicfoundation/ethereumjs-tx": "5.0.1", - "@nomicfoundation/ethereumjs-util": "9.0.1", - "@nomicfoundation/ethereumjs-vm": "7.0.1", + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.2", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -13671,9 +13680,9 @@ "dev": true }, "node_modules/js-sdsl": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.1.tgz", - "integrity": "sha512-6Gsx8R0RucyePbWqPssR8DyfuXmLBooYN5cZFZKjHGnQuaf7pEzhtpceagJxVu4LqhYY5EYA7nko3FmeHZ1KbA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -21536,7 +21545,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", @@ -21551,7 +21560,7 @@ "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", "@nomicfoundation/ignition-ui": "^0.4.0", - "hardhat": "^2.14.0" + "hardhat": "^2.18.0" } }, "packages/hardhat-plugin/node_modules/@noble/hashes": { diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index f70d8669b1..b511d443bc 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -59,7 +59,7 @@ "eslint-plugin-import": "2.24.2", "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.14.0", + "hardhat": "^2.18.0", "mermaid": "^9.1.7", "mocha": "^9.1.1", "nyc": "15.1.0", @@ -74,7 +74,7 @@ "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", "@nomicfoundation/ignition-ui": "^0.4.0", - "hardhat": "^2.14.0" + "hardhat": "^2.18.0" }, "dependencies": { "chalk": "^4.0.0", From bd4a5593a73193363adbb48f61c3d3373b100f60 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 5 Oct 2023 21:04:50 +0100 Subject: [PATCH 1030/1302] feat: use scope-tasks Scope all of Ignition's tasks under the `ignition` keyword. To allow this we now depend on hardhat v2.18.0 and above. The flags and parameters have been rationalized as well, and missing descriptions added. Specifically: * deploy has had its `force` flag removed as it is no longer used. * wipe has had the param deployment changed to `id` to match the usage in our other tasks We also remove the verbose UI flag option on deploy. We should look to improving our debug output instead. Resolves #442. Co-authored-by: Patricio Palladino --- docs/creating-modules-for-deployment.md | 2 +- docs/getting-started-guide.md | 10 ++-- docs/running-a-deployment.md | 12 ++-- examples/complete/README.md | 2 +- examples/ens/README.md | 4 +- examples/sample/README.md | 2 +- examples/ts-sample/README.md | 2 +- examples/uniswap/README.md | 2 +- .../internal/reconciliation/chainId.ts | 9 ++- packages/hardhat-plugin/src/index.ts | 58 ++++++++++--------- packages/hardhat-plugin/test/plan/index.ts | 14 +++-- 11 files changed, 65 insertions(+), 52 deletions(-) diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md index a0c1dda98b..9f14b92134 100644 --- a/docs/creating-modules-for-deployment.md +++ b/docs/creating-modules-for-deployment.md @@ -38,7 +38,7 @@ module.exports = buildModule("MyModule", (m) => { }); ``` -Modules can be deployed directly at the cli (with `npx hardhat deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](./using-ignition-in-hardhat-tests.md)) or consumed by other Modules to allow for complex deployments. +Modules can be deployed directly at the cli (with `npx hardhat ignition deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](./using-ignition-in-hardhat-tests.md)) or consumed by other Modules to allow for complex deployments. During a deployment, **Ignition** uses the module to generate an execution plan of the transactions to run and the order in which to run them based on their dependencies. A module uses the injected `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they interdepend on each other. diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md index 1914536c89..1d80ca8c24 100644 --- a/docs/getting-started-guide.md +++ b/docs/getting-started-guide.md @@ -89,7 +89,7 @@ module.exports = buildModule("LockModule", (m) => { Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): ```bash -npx hardhat deploy LockModule +npx hardhat ignition deploy LockModule ``` A file containing module parameters, indexed by the `ModuleId` used in `buildModule`, can be passed as a flag at @@ -105,7 +105,7 @@ the command line: ``` ```bash -npx hardhat deploy --parameters ignition/modules/LockModule.config.json LockModule +npx hardhat ignition deploy --parameters ignition/modules/LockModule.config.json LockModule ``` To deploy against a specific network pass it on the command line, for instance to deploy against @@ -114,14 +114,14 @@ a local **Hardhat** node: ```bash npx hardhat node # in another terminal -npx hardhat deploy LockModule --network localhost +npx hardhat ignition deploy LockModule --network localhost ``` Running against a non-ephemeral network will generate a `deployment` stored under `./ignition/deployments`. The deployment identified by an `id` that can be passed at the command line: ```bash -npx hardhat deploy LockModule --network localhost --id dev-deploy +npx hardhat ignition deploy LockModule --network localhost --id dev-deploy ``` If no `id` is provided a default is generated based on the `chainId` e.g. _network-31337_ for the localhost @@ -132,7 +132,7 @@ network. Run the `status` task to display info about your successfully deployed contracts within a deployment: ```bash -npx hardhat status --id dev-deploy +npx hardhat ignition status --id dev-deploy # Deployed Addresses # ================== diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md index 4267bb6f61..4288f15a75 100644 --- a/docs/running-a-deployment.md +++ b/docs/running-a-deployment.md @@ -21,7 +21,7 @@ Once you have built and tested your deployment module, it is time to deploy it! The `visualize` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): ```bash -npx hardhat visualize ENS +npx hardhat ignition visualize ENS ``` Running `visualize` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: @@ -39,19 +39,19 @@ If something in your deployment isn't behaving the way you expected, the `visual Deploying a module is done using the **Ignition** deploy task: ```sh -npx hardhat deploy LockModule +npx hardhat ignition deploy LockModule ``` Module parameters, indexed by `ModuleId`, can be passed as a `json` string to the `parameters` flag: ```sh -npx hardhat deploy --parameters "{\"LockModule\": {\"unlockTime\":4102491600,\"lockedAmount\":2000000000}}" LockModule.js +npx hardhat ignition deploy --parameters "{\"LockModule\": {\"unlockTime\":4102491600,\"lockedAmount\":2000000000}}" LockModule.js ``` By default the deploy task will deploy to an ephemeral Hardhat network. To target a network from your Hardhat config, you can pass its name to the network flag: ```sh -npx hardhat deploy LockModule.js --network mainnet +npx hardhat ignition deploy LockModule.js --network mainnet ``` ### Configuration options @@ -122,7 +122,7 @@ Future versions of Ignition will make the `deployments` file system structure li A run of a deployment can succeed, fail or be on hold. A failed deployment or one that is on hold, assuming it was run against a non-ephemeral network, can be rerun using the deploy command: -`npx hardhat deploy MyModule.js --network localhost` +`npx hardhat ignition deploy MyModule.js --network localhost` Each run logs its events to a journal file (recorded in a sibling file to the module under `MyModule.journal.ndjson`). The journal file is used to reconstruct the state of the deployment during previous runs. Runs are scoped to the `chainId` of the network, so that runs against different networks do not interact. Any failed contract deploys or contract calls will be retried, the deployment picking up from where the last fail occurred. Any `event` invocations that had not returned and hence were on `Hold` on the last run, will be retried as well. @@ -131,7 +131,7 @@ Each run logs its events to a journal file (recorded in a sibling file to the mo To start a deployment again, ignoring the state from previous runs and rerunning the entirety of the module, the force flag can be used: ``` -npx hardhat deploy MyModule.js --network localhost --force +npx hardhat ignition deploy MyModule.js --network localhost --force ``` For non-development network deployments, this means some form of deployment freezing will be recommended that records relevant information such as contract abi, deployed address and network. These files will be recommended to be committed into project repositories as well. --> diff --git a/examples/complete/README.md b/examples/complete/README.md index c5ea3d4cdd..4107d4dae1 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -7,7 +7,7 @@ This is a bit of a contrived example project, intended mostly to ensure working To run the ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat deploy CompleteModule.js +npx hardhat ignition deploy CompleteModule.js ``` ## Test diff --git a/examples/ens/README.md b/examples/ens/README.md index 70ce43f4b2..2447902e19 100644 --- a/examples/ens/README.md +++ b/examples/ens/README.md @@ -7,7 +7,7 @@ This hardhat project is an example of using ignition to deploy the ENS system of To run the ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat deploy ENS.js +npx hardhat ignition deploy ENS.js ``` To run a deploy of ENS with a test registrar against the local node: @@ -15,7 +15,7 @@ To run a deploy of ENS with a test registrar against the local node: ```shell npx hardhat node # In another terminal -npx hardhat deploy test-registrar.js --network localhost +npx hardhat ignition deploy test-registrar.js --network localhost ``` ## Test diff --git a/examples/sample/README.md b/examples/sample/README.md index cf907930be..0a243ae138 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -7,7 +7,7 @@ This hardhat project is a variant of Hardhat's javascript sample project. To run the ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat deploy LockModule.js +npx hardhat ignition deploy LockModule.js ``` ## Test diff --git a/examples/ts-sample/README.md b/examples/ts-sample/README.md index 673f2058ef..d7d8a5410d 100644 --- a/examples/ts-sample/README.md +++ b/examples/ts-sample/README.md @@ -7,7 +7,7 @@ This hardhat project is a variant of Hardhat's typescript sample project. To run the ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat deploy LockModule +npx hardhat ignition deploy LockModule ``` ## Test diff --git a/examples/uniswap/README.md b/examples/uniswap/README.md index d4680d5eac..24f366d510 100644 --- a/examples/uniswap/README.md +++ b/examples/uniswap/README.md @@ -7,7 +7,7 @@ This hardhat project is an example of using ignition to deploy the Uniswap syste To run the ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat deploy Uniswap.js +npx hardhat ignition deploy Uniswap.js ``` ## Test diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts index 5882521025..af9e820fdd 100644 --- a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts +++ b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts @@ -11,9 +11,12 @@ describe("chainId reconciliation", function () { this.hre.network.name = "something-else"; await assert.isRejected( - this.hre.run("deploy", { - moduleNameOrPath: "./ignition/modules/LockModule.js", - }), + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + moduleNameOrPath: "./ignition/modules/LockModule.js", + } + ), /Previous chain id: 123\. Current chain id: 31337/ ); }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index fa668cf412..1f4fe25439 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -6,7 +6,7 @@ import type { import "@nomicfoundation/hardhat-ethers"; import chalk from "chalk"; import { readdirSync } from "fs-extra"; -import { extendConfig, extendEnvironment, task } from "hardhat/config"; +import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { lazyObject } from "hardhat/plugins"; import path from "path"; @@ -15,6 +15,11 @@ import "./type-extensions"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; +const ignitionScope = scope( + "ignition", + "Deploy your smart contracts using Hardhat Ignition" +); + // this is ugly, but it's fast :) // discussion: https://github.com/NomicFoundation/hardhat-ignition/pull/483 export const buildModule: typeof import("@nomicfoundation/ignition-core").buildModule = @@ -54,30 +59,27 @@ extendEnvironment((hre) => { }); }); -task("deploy") - .addPositionalParam("moduleNameOrPath") +ignitionScope + .task("deploy") + .addPositionalParam( + "moduleNameOrPath", + "The name of the module file within the Ignition modules directory, or a path to the module file" + ) .addOptionalParam( "parameters", - "A JSON object as a string, of the module parameters, or a relative path to a JSON file" + "A relative path to a JSON file to use for the module parameters," ) .addOptionalParam("id", "set the deployment id") - .addFlag("force", "restart the deployment ignoring previous history") - .addFlag( - "simpleTextUi", - "use a simple text based UI instead of the default UI" - ) + .setDescription("Deploy a module to the specified network") .setAction( async ( { moduleNameOrPath, parameters: parametersInput, - simpleTextUi, id: givenDeploymentId, }: { moduleNameOrPath: string; parameters?: string; - force: boolean; - simpleTextUi: boolean; id: string; }, hre @@ -91,9 +93,6 @@ task("deploy") const { loadModule } = await import("./load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); - const { VerboseEventHandler } = await import( - "./ui/verbose-event-handler" - ); const chainId = Number( await hre.network.provider.request({ @@ -152,9 +151,7 @@ task("deploy") const artifactResolver = new HardhatArtifactResolver(hre); - const executionEventListener = simpleTextUi - ? new VerboseEventHandler() - : new PrettyEventHandler(); + const executionEventListener = new PrettyEventHandler(); try { await deploy({ @@ -173,9 +170,14 @@ task("deploy") } ); -task("visualize") +ignitionScope + .task("visualize") .addFlag("quiet", "Disables logging output path to terminal") - .addPositionalParam("moduleNameOrPath") + .addPositionalParam( + "moduleNameOrPath", + "The name of the module file within the Ignition modules directory, or a path to the module file" + ) + .setDescription("Visualize a module as an HTML report") .setAction( async ( { @@ -232,9 +234,10 @@ task("visualize") } ); -task("status") - .addParam("id") - .setDescription("Lists the deployed contract addresses of a deployment") +ignitionScope + .task("status") + .addParam("id", "The id of the deployment to show") + .setDescription("Show the current status of a deployment") .setAction(async ({ id }: { id: string }, hre) => { const { status } = await import("@nomicfoundation/ignition-core"); @@ -328,10 +331,11 @@ task("status") } }); -task("wipe") - .addParam("deployment") - .addParam("future") - .setDescription("Reset a deployments future to allow rerunning") +ignitionScope + .task("wipe") + .addParam("id", "The id of the deployment that has the future to wipe") + .addParam("future", "The id of the future within the deploment to wipe") + .setDescription("Reset a deployment's future to allow rerunning") .setAction( async ( { diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 4ee8812cba..be9d9a99f4 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -13,10 +13,16 @@ describe("visualize", () => { emptyDirSync(visualizationPath); await this.hre.run("compile", { quiet: true }); - await this.hre.run("visualize", { - quiet: true, - moduleNameOrPath: "MyModule.js", - }); + await this.hre.run( + { + scope: "ignition", + task: "visualize", + }, + { + quiet: true, + moduleNameOrPath: "MyModule.js", + } + ); const files = await readdir(visualizationPath); From 6dbf1f43235b819997ec22dd55c741b76b627edb Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 15:18:33 +0100 Subject: [PATCH 1031/1302] feat: rename quiet flag on visualize to no-open Rename and correct the description of the `quiet` flag to `no-open` indicating you want the opening in browser suppressed. This is useful in scripts (or Ignition's tests). --- packages/hardhat-plugin/src/index.ts | 8 ++++---- packages/hardhat-plugin/test/plan/index.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1f4fe25439..dd2d0f6f94 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -172,7 +172,7 @@ ignitionScope ignitionScope .task("visualize") - .addFlag("quiet", "Disables logging output path to terminal") + .addFlag("noOpen", "Disables opening report in browser") .addPositionalParam( "moduleNameOrPath", "The name of the module file within the Ignition modules directory, or a path to the module file" @@ -181,9 +181,9 @@ ignitionScope .setAction( async ( { - quiet = false, + noOpen = false, moduleNameOrPath, - }: { quiet: boolean; moduleNameOrPath: string }, + }: { noOpen: boolean; moduleNameOrPath: string }, hre ) => { const { IgnitionModuleSerializer, batches } = await import( @@ -220,7 +220,7 @@ ignitionScope } ); - if (!quiet) { + if (!noOpen) { const indexFile = path.join( hre.config.paths.cache, "visualization", diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index be9d9a99f4..56da130774 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -19,7 +19,7 @@ describe("visualize", () => { task: "visualize", }, { - quiet: true, + noOpen: true, moduleNameOrPath: "MyModule.js", } ); From c931e3d79585e35638f74cf3135cc429cc0ed76c Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 14:33:44 +0100 Subject: [PATCH 1032/1302] chore: remove the uniswap example Rather than get into the weeds of licenses, we will drop this example for now. Resolves #510. --- README.md | 1 - examples/sample/README.md | 5 +- examples/uniswap/.eslintrc.js | 14 - examples/uniswap/.gitignore | 10 - examples/uniswap/.prettierignore | 5 - examples/uniswap/README.md | 19 - examples/uniswap/contracts/Florin.sol | 13 - examples/uniswap/contracts/Solidus.sol | 13 - examples/uniswap/contracts/Uniswap.sol | 12 - examples/uniswap/contracts/WETH9.sol | 758 ------------------- examples/uniswap/hardhat.config.js | 39 - examples/uniswap/ignition/modules/Uniswap.js | 147 ---- examples/uniswap/package.json | 28 - examples/uniswap/test/helpers.js | 65 -- examples/uniswap/test/simplified-test.js | 31 - examples/uniswap/test/uniswap-test.js | 172 ----- package-lock.json | 470 +----------- 17 files changed, 4 insertions(+), 1798 deletions(-) delete mode 100644 examples/uniswap/.eslintrc.js delete mode 100644 examples/uniswap/.gitignore delete mode 100644 examples/uniswap/.prettierignore delete mode 100644 examples/uniswap/README.md delete mode 100644 examples/uniswap/contracts/Florin.sol delete mode 100644 examples/uniswap/contracts/Solidus.sol delete mode 100644 examples/uniswap/contracts/Uniswap.sol delete mode 100644 examples/uniswap/contracts/WETH9.sol delete mode 100644 examples/uniswap/hardhat.config.js delete mode 100644 examples/uniswap/ignition/modules/Uniswap.js delete mode 100644 examples/uniswap/package.json delete mode 100644 examples/uniswap/test/helpers.js delete mode 100644 examples/uniswap/test/simplified-test.js delete mode 100644 examples/uniswap/test/uniswap-test.js diff --git a/README.md b/README.md index 9d60bbd884..f506037db5 100644 --- a/README.md +++ b/README.md @@ -54,7 +54,6 @@ This repo contains example projects that show **Hardhat Ignition** features in c - [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Hardhat Ignition - [Typescript Sample](./examples/ts-sample) - the **Hardhat** typescript starter project enhanced with Hardhat Ignition - [ENS](./examples/ens) - deploy ENS and its registry for local testing -- [Uniswap](./examples/uniswap) - deploy Uniswap and test swaps ## Contributing diff --git a/examples/sample/README.md b/examples/sample/README.md index 0a243ae138..8c826c0c61 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -1,6 +1,7 @@ -# Hardhat Sample for Ignition +# Hardhat Sample for Hardhat Ignition -This hardhat project is a variant of Hardhat's javascript sample project. +This Hardhat project is a variant of Hardhat's sample project enhanced with +Hardhat Ignition. ## Deploying diff --git a/examples/uniswap/.eslintrc.js b/examples/uniswap/.eslintrc.js deleted file mode 100644 index 8457c86dfe..0000000000 --- a/examples/uniswap/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = { - extends: ["plugin:prettier/recommended"], - parserOptions: { - ecmaVersion: "latest", - }, - env: { - es6: true, - node: true, - }, - rules: { - "no-console": "error", - }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], -}; diff --git a/examples/uniswap/.gitignore b/examples/uniswap/.gitignore deleted file mode 100644 index 72d98e146d..0000000000 --- a/examples/uniswap/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -node_modules -.env -coverage -coverage.json -typechain - -#Hardhat files -cache -artifacts -ignition/deployments diff --git a/examples/uniswap/.prettierignore b/examples/uniswap/.prettierignore deleted file mode 100644 index 6da739a76c..0000000000 --- a/examples/uniswap/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/artifacts -/cache -/coverage -/.nyc_output diff --git a/examples/uniswap/README.md b/examples/uniswap/README.md deleted file mode 100644 index 24f366d510..0000000000 --- a/examples/uniswap/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# Uniswap Example for Ignition - -This hardhat project is an example of using ignition to deploy the Uniswap system of contracts, based on the [_Deploy Uniswap v3 script_](https://github.com/Uniswap/deploy-v3). - -## Deploying - -To run the ignition deploy against the ephemeral hardhat network: - -```shell -npx hardhat ignition deploy Uniswap.js -``` - -## Test - -To run the hardhat tests using ignition: - -```shell -npm run test -``` diff --git a/examples/uniswap/contracts/Florin.sol b/examples/uniswap/contracts/Florin.sol deleted file mode 100644 index c842b8cc17..0000000000 --- a/examples/uniswap/contracts/Florin.sol +++ /dev/null @@ -1,13 +0,0 @@ -//SPDX-License-Identifier: Unlicense -pragma solidity ^0.7.6; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract Florin is ERC20, Ownable { - constructor() ERC20("Florin", "FN") {} - - function mint(address to, uint256 amount) public onlyOwner { - _mint(to, amount); - } -} diff --git a/examples/uniswap/contracts/Solidus.sol b/examples/uniswap/contracts/Solidus.sol deleted file mode 100644 index 345902f4b7..0000000000 --- a/examples/uniswap/contracts/Solidus.sol +++ /dev/null @@ -1,13 +0,0 @@ -//SPDX-License-Identifier: Unlicense -pragma solidity ^0.7.6; - -import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "@openzeppelin/contracts/access/Ownable.sol"; - -contract Solidus is ERC20, Ownable { - constructor() ERC20("Solidus", "SO") {} - - function mint(address to, uint256 amount) public onlyOwner { - _mint(to, amount); - } -} diff --git a/examples/uniswap/contracts/Uniswap.sol b/examples/uniswap/contracts/Uniswap.sol deleted file mode 100644 index 500c289377..0000000000 --- a/examples/uniswap/contracts/Uniswap.sol +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-License-Identifier: Unlicense -pragma solidity ^0.7.6; -// import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol"; -// import "@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol"; -// import "@uniswap/v3-core/contracts/interfaces/IERC20Minimal.sol"; -// import "@uniswap/v3-periphery/contracts/interfaces/INonfungiblePositionManager.sol"; -// import "@uniswap/v3-periphery/contracts/libraries/TransferHelper.sol"; - -// import "./core/UniswapV3Factory.sol"; -// import "./periphery/SwapRouter.sol"; - -import "@openzeppelin/contracts/proxy/ProxyAdmin.sol"; diff --git a/examples/uniswap/contracts/WETH9.sol b/examples/uniswap/contracts/WETH9.sol deleted file mode 100644 index 5a9a2d4570..0000000000 --- a/examples/uniswap/contracts/WETH9.sol +++ /dev/null @@ -1,758 +0,0 @@ -// Copyright (C) 2015, 2016, 2017 Dapphub - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -pragma solidity >=0.4.22 <0.6; - -contract WETH9 { - string public name = "Wrapped Ether"; - string public symbol = "WETH"; - uint8 public decimals = 18; - - event Approval(address indexed src, address indexed guy, uint256 wad); - event Transfer(address indexed src, address indexed dst, uint256 wad); - event Deposit(address indexed dst, uint256 wad); - event Withdrawal(address indexed src, uint256 wad); - - mapping(address => uint256) public balanceOf; - mapping(address => mapping(address => uint256)) public allowance; - - function() external payable { - deposit(); - } - - function deposit() public payable { - balanceOf[msg.sender] += msg.value; - emit Deposit(msg.sender, msg.value); - } - - function withdraw(uint256 wad) public { - require(balanceOf[msg.sender] >= wad); - balanceOf[msg.sender] -= wad; - msg.sender.transfer(wad); - emit Withdrawal(msg.sender, wad); - } - - function totalSupply() public view returns (uint256) { - return address(this).balance; - } - - function approve(address guy, uint256 wad) public returns (bool) { - allowance[msg.sender][guy] = wad; - emit Approval(msg.sender, guy, wad); - return true; - } - - function transfer(address dst, uint256 wad) public returns (bool) { - return transferFrom(msg.sender, dst, wad); - } - - function transferFrom( - address src, - address dst, - uint256 wad - ) public returns (bool) { - require(balanceOf[src] >= wad); - - if (src != msg.sender && allowance[src][msg.sender] != uint256(-1)) { - require(allowance[src][msg.sender] >= wad); - allowance[src][msg.sender] -= wad; - } - - balanceOf[src] -= wad; - balanceOf[dst] += wad; - - emit Transfer(src, dst, wad); - - return true; - } -} - -/* - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. - -*/ diff --git a/examples/uniswap/hardhat.config.js b/examples/uniswap/hardhat.config.js deleted file mode 100644 index 7c66793023..0000000000 --- a/examples/uniswap/hardhat.config.js +++ /dev/null @@ -1,39 +0,0 @@ -require("@nomicfoundation/hardhat-toolbox"); -require("@nomicfoundation/hardhat-ignition"); - -/** - * @type import('hardhat/config').HardhatUserConfig - */ -module.exports = { - solidity: { - compilers: [ - { - version: "0.5.5", - }, - { - version: "0.7.6", - settings: { - optimizer: { - enabled: true, - runs: 800, - }, - metadata: { - // do not include the metadata hash, since this is machine dependent - // and we want all generated code to be deterministic - // https://docs.soliditylang.org/en/v0.7.6/metadata.html - bytecodeHash: "none", - }, - }, - }, - ], - }, - networks: { - hardhat: { - mining: { - // auto: false - }, - blockGasLimit: 5_000_000_000, - initialBaseFeePerGas: 1_000_000_000, - }, - }, -}; diff --git a/examples/uniswap/ignition/modules/Uniswap.js b/examples/uniswap/ignition/modules/Uniswap.js deleted file mode 100644 index d753af1a11..0000000000 --- a/examples/uniswap/ignition/modules/Uniswap.js +++ /dev/null @@ -1,147 +0,0 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); - -const UniswapV3Factory = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json"); -const UniswapInterfaceMulticall = require("@uniswap/v3-periphery/artifacts/contracts/lens/UniswapInterfaceMulticall.sol/UniswapInterfaceMulticall.json"); -const ProxyAdmin = require("@openzeppelin/contracts/build/contracts/ProxyAdmin.json"); -const TickLens = require("@uniswap/v3-periphery/artifacts/contracts/lens/TickLens.sol/TickLens.json"); -const NFTDescriptor = require("v3-periphery-1_3_0/artifacts/contracts/libraries/NFTDescriptor.sol/NFTDescriptor.json"); -const NonfungibleTokenPositionDescriptor = require("v3-periphery-1_3_0/artifacts/contracts/NonfungibleTokenPositionDescriptor.sol/NonfungibleTokenPositionDescriptor.json"); -const TransparentUpgradeableProxy = require("@openzeppelin/contracts/build/contracts/TransparentUpgradeableProxy.json"); -const NonfungiblePositionManager = require("@uniswap/v3-periphery/artifacts/contracts/NonfungiblePositionManager.sol/NonfungiblePositionManager.json"); -const V3Migrator = require("@uniswap/v3-periphery/artifacts/contracts/V3Migrator.sol/V3Migrator.json"); -const UniswapV3Staker = require("@uniswap/v3-staker/artifacts/contracts/UniswapV3Staker.sol/UniswapV3Staker.json"); -const QuoterV2 = require("@uniswap/swap-router-contracts/artifacts/contracts/lens/QuoterV2.sol/QuoterV2.json"); -const SwapRouter02 = require("@uniswap/swap-router-contracts/artifacts/contracts/SwapRouter02.sol/SwapRouter02.json"); - -const ONE_BP_FEE = 100; -const ONE_BP_TICK_SPACING = 1; -const NATIVE_CURRENCY_LABEL = "ETH"; - -const ONE_MINUTE_SECONDS = 60; -const ONE_HOUR_SECONDS = ONE_MINUTE_SECONDS * 60; -const ONE_DAY_SECONDS = ONE_HOUR_SECONDS * 24; -const ONE_MONTH_SECONDS = ONE_DAY_SECONDS * 30; -const ONE_YEAR_SECONDS = ONE_DAY_SECONDS * 365; - -// 2592000 -const MAX_INCENTIVE_START_LEAD_TIME = ONE_MONTH_SECONDS; -// 1892160000 -const MAX_INCENTIVE_DURATION = ONE_YEAR_SECONDS * 2; - -const ADDRESS_ZERO = "0x0000000000000000000000000000000000000000"; - -function isAscii(str) { - return /^[\x00-\x7F]*$/.test(str); -} - -function asciiStringToBytes32(str) { - if (str.length > 32 || !isAscii(str)) { - throw new Error("Invalid label, must be less than 32 characters"); - } - - return "0x" + Buffer.from(str, "ascii").toString("hex").padEnd(64, "0"); -} - -module.exports = buildModule("Uniswap", (m) => { - const owner = m.getAccount(0); - const v2CoreFactoryAddress = ADDRESS_ZERO; - - const weth9 = m.contract("WETH9"); - - // DEPLOY_V3_CORE_FACTORY - const uniswapV3Factory = m.contract("UniswapV3Factory", UniswapV3Factory); - - // 1 - add-1bp-fee-tier - m.call(uniswapV3Factory, "enableFeeAmount", [ - ONE_BP_FEE, - ONE_BP_TICK_SPACING, - ]); - - // 2 - deploy-multicall2 - const multicall2Address = m.contract("Multicall2", UniswapInterfaceMulticall); - - // DEPLOY_PROXY_ADMIN - const proxyAdmin = m.contract("ProxyAdmin", ProxyAdmin); - - // DEPLOY_TICK_LENS - const tickLens = m.contract("TickLens", TickLens); - - // DEPLOY_NFT_DESCRIPTOR_LIBRARY_V1_3_0 - const nftDescriptor = m.contract("NFTDescriptor", NFTDescriptor); - - // DEPLOY_NFT_POSITION_DESCRIPTOR_V1_3_0 - const nonfungibleTokenPositionDescriptor = m.contract( - "nonfungibleTokenPositionDescriptorAddressV1_3_0", - NonfungibleTokenPositionDescriptor, - [weth9, asciiStringToBytes32(NATIVE_CURRENCY_LABEL)], - { - libraries: { - NFTDescriptor: nftDescriptor, - }, - } - ); - - // DEPLOY_TRANSPARENT_PROXY_DESCRIPTOR - const descriptorProxy = m.contract( - "TransparentUpgradeableProxy", - TransparentUpgradeableProxy, - [nonfungibleTokenPositionDescriptor, proxyAdmin, "0x"] - ); - - // DEPLOY_NONFUNGIBLE_POSITION_MANAGER - const nonfungibleTokenPositionManager = m.contract( - "NonfungibleTokenPositionManager", - NonfungiblePositionManager, - [uniswapV3Factory, weth9, descriptorProxy] - ); - - // DEPLOY_V3_MIGRATOR - const v3Migrator = m.contract("V3Migrator", V3Migrator, [ - uniswapV3Factory, - weth9, - nonfungibleTokenPositionManager, - ]); - - // TRANSFER_V3_CORE_FACTORY_OWNER - m.call(uniswapV3Factory, "setOwner", [owner], { - after: [v3Migrator], - }); - - // DEPLOY_V3_STAKER - const v3Staker = m.contract("UniswapV3Staker", UniswapV3Staker, [ - uniswapV3Factory, - nonfungibleTokenPositionManager, - MAX_INCENTIVE_START_LEAD_TIME, - MAX_INCENTIVE_DURATION, - ]); - - // DEPLOY_QUOTER_V2 - const quoterV2 = m.contract("QuoterV2", QuoterV2, [uniswapV3Factory, weth9]); - - // DEPLOY_V3_SWAP_ROUTER_02 - const swapRouter02 = m.contract("SwapRouter02", SwapRouter02, [ - v2CoreFactoryAddress, - uniswapV3Factory, - nonfungibleTokenPositionManager, - weth9, - ]); - - // TRANSFER_PROXY_ADMIN - m.call(proxyAdmin, "transferOwnership", [owner]); - - return { - weth9, - uniswapV3Factory, - multicall2Address, - proxyAdmin, - tickLens, - nftDescriptor, - nonfungibleTokenPositionDescriptor, - descriptorProxy, - nonfungibleTokenPositionManager, - v3Migrator, - v3Staker, - quoterV2, - swapRouter02, - }; -}); diff --git a/examples/uniswap/package.json b/examples/uniswap/package.json deleted file mode 100644 index 490c68f2f4..0000000000 --- a/examples/uniswap/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "@nomicfoundation/ignition-uniswap-example", - "private": true, - "version": "0.4.0", - "scripts": { - "test": "hardhat test", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", - "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", - "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" - }, - "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", - "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - }, - "dependencies": { - "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", - "@uniswap/swap-router-contracts": "1.1.0", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.1.1", - "@uniswap/v3-sdk": "3.9.0", - "@uniswap/v3-staker": "1.0.2", - "bignumber.js": "9.1.0", - "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" - } -} diff --git a/examples/uniswap/test/helpers.js b/examples/uniswap/test/helpers.js deleted file mode 100644 index 827e9d89cd..0000000000 --- a/examples/uniswap/test/helpers.js +++ /dev/null @@ -1,65 +0,0 @@ -const bn = require("bignumber.js"); -const { BigNumber } = require("ethers"); - -bn.config({ EXPONENTIAL_AT: 999999, DECIMAL_PLACES: 40 }); - -// returns the sqrt price as a 64x96 -function encodePriceSqrt(reserve1, reserve0) { - return BigInt( - new bn(reserve1.toString()) - .div(reserve0.toString()) - .sqrt() - .multipliedBy(new bn(2).pow(96)) - .integerValue(3) - .toString() - ); -} - -async function getPoolImmutables(poolContract) { - const [factory, token0, token1, fee, tickSpacing, maxLiquidityPerTick] = - await Promise.all([ - poolContract.factory(), - poolContract.token0(), - poolContract.token1(), - poolContract.fee(), - poolContract.tickSpacing(), - poolContract.maxLiquidityPerTick(), - ]); - - const immutables = { - factory, - token0, - token1, - fee, - tickSpacing, - maxLiquidityPerTick, - }; - - return immutables; -} - -async function getPoolState(poolContract) { - const [liquidity, slot] = await Promise.all([ - poolContract.liquidity(), - poolContract.slot0(), - ]); - - const PoolState = { - liquidity, - sqrtPriceX96: slot[0], - tick: slot[1], - observationIndex: slot[2], - observationCardinality: slot[3], - observationCardinalityNext: slot[4], - feeProtocol: slot[5], - unlocked: slot[6], - }; - - return PoolState; -} - -module.exports = { - encodePriceSqrt, - getPoolImmutables, - getPoolState, -}; diff --git a/examples/uniswap/test/simplified-test.js b/examples/uniswap/test/simplified-test.js deleted file mode 100644 index 6979f37332..0000000000 --- a/examples/uniswap/test/simplified-test.js +++ /dev/null @@ -1,31 +0,0 @@ -const { assert } = require("chai"); -const UniswapModule = require("../ignition/modules/Uniswap"); - -describe("uniswap deploy", () => { - let nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02; - - beforeEach(async () => { - const [sign1, sign2] = await hre.ethers.getSigners(); - owner = sign1; - user1 = sign2; - - // Deploy Uniswap - ({ nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02 } = - await ignition.deploy(UniswapModule)); - }); - - it("should deploy uniswap", async () => { - assert.equal( - await nonfungibleTokenPositionManager.getAddress(), - "0xb7f8bc63bbcad18155201308c8f3540b07f84f5e" - ); - assert.equal( - await uniswapV3Factory.getAddress(), - "0xdc64a140aa3e981100a9beca4e685f962f0cf6c9" - ); - assert.equal( - await swapRouter02.getAddress(), - "0xa51c1fc2f0d1a1b8494ed1fe312d7c3a78ed91c0" - ); - }); -}); diff --git a/examples/uniswap/test/uniswap-test.js b/examples/uniswap/test/uniswap-test.js deleted file mode 100644 index 471bbf5a13..0000000000 --- a/examples/uniswap/test/uniswap-test.js +++ /dev/null @@ -1,172 +0,0 @@ -const { assert } = require("chai"); -const { Token } = require("@uniswap/sdk-core"); -const { Pool, Position, nearestUsableTick } = require("@uniswap/v3-sdk"); -const UniswapV3Pool = require("@uniswap/v3-core/artifacts/contracts/UniswapV3Pool.sol/UniswapV3Pool.json"); -const UniswapModule = require("../ignition/modules/Uniswap"); -const { - encodePriceSqrt, - getPoolImmutables, - getPoolState, -} = require("./helpers"); - -// TODO: We need to decide if we are bringing back the full uniswap example -// given it depends on ethers-v5. -describe.skip("Uniswap", function () { - const fee = 500; - let owner, user1, solidus, florin; - let nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02; - let pool; - - before(async () => { - const [sign1, sign2] = await hre.ethers.getSigners(); - owner = sign1; - user1 = sign2; - - // Deploy Uniswap - ({ nonfungibleTokenPositionManager, uniswapV3Factory, swapRouter02 } = - await ignition.deploy(UniswapModule)); - - // Deploy example tokens Solidus and Florin - const Solidus = await hre.ethers.getContractFactory("Solidus"); - solidus = await Solidus.deploy(); - - const Florin = await hre.ethers.getContractFactory("Florin"); - florin = await Florin.deploy(); - - const solidusAddress = await solidus.getAddress(); - const florinAddress = await florin.getAddress(); - - // Create pool for solidus/florin - await nonfungibleTokenPositionManager.createAndInitializePoolIfNecessary( - solidusAddress, - florinAddress, - fee, - encodePriceSqrt(1, 1), - { gasLimit: 5000000 } - ); - - const poolAddress = await uniswapV3Factory.getPool( - solidusAddress, - florinAddress, - fee - ); - - pool = await hre.ethers.getContractAtFromArtifact( - UniswapV3Pool, - poolAddress - ); - - const nonfungibleTokenPositionManagerAddress = - await nonfungibleTokenPositionManager.getAddress(); - - // Add liquidity to pool - await solidus.mint(owner.address, hre.ethers.parseUnits("1000", 18)); - await solidus - .connect(owner) - .approve( - nonfungibleTokenPositionManagerAddress, - hre.ethers.parseUnits("1000", 18) - ); - - await florin.mint(owner.address, hre.ethers.parseUnits("1000", 18)); - await florin - .connect(owner) - .approve( - nonfungibleTokenPositionManagerAddress, - hre.ethers.parseUnits("1000", 18) - ); - - const [poolImmutables, poolState] = await Promise.all([ - getPoolImmutables(pool), - getPoolState(pool), - ]); - - const SolidusToken = new Token( - 31337, - poolImmutables.token0, - 18, - "SO", - "Solidus" - ); - - const FlorinToken = new Token( - 31337, - poolImmutables.token1, - 18, - "FN", - "Florin" - ); - - const poolFromSdk = new Pool( - SolidusToken, - FlorinToken, - poolImmutables.fee, - poolState.sqrtPriceX96.toString(), - poolState.liquidity.toString(), - poolState.tick - ); - - const position = new Position({ - pool: poolFromSdk, - liquidity: hre.ethers.parseUnits("1", 18), - tickLower: - nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) - - poolImmutables.tickSpacing * 2, - tickUpper: - nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) + - poolImmutables.tickSpacing * 2, - }); - - const { amount0: amount0Desired, amount1: amount1Desired } = - position.mintAmounts; - - await nonfungibleTokenPositionManager.connect(owner).mint( - { - token0: solidusAddress, - token1: florinAddress, - fee: fee, - tickLower: - nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) - - poolImmutables.tickSpacing * 2, - tickUpper: - nearestUsableTick(poolState.tick, poolImmutables.tickSpacing) + - poolImmutables.tickSpacing * 2, - amount0Desired: amount0Desired.toString(), - amount1Desired: amount1Desired.toString(), - amount0Min: 0, - amount1Min: 0, - recipient: owner.address, - deadline: Math.floor(Date.now() / 1000) + 60 * 10, - }, - { gasLimit: "1000000" } - ); - }); - - it("should allow swapping from florin token to solidus token", async function () { - // arrange - const amountToSwap = 100; - - // add that amount to the users florin's balance - await florin.mint(user1.address, 100); - await florin.connect(user1).approve(await swapRouter02.getAddress(), 100); - - assert.equal(await florin.balanceOf(user1.address), 100); - assert.equal(await solidus.balanceOf(user1.address), 0); - - // act - await swapRouter02.connect(user1).exactInputSingle({ - tokenIn: florinAddress, - tokenOut: solidusAddress, - fee, - recipient: user1.address, - deadline: Math.floor(Date.now() / 1000) + 60 * 10, - amountIn: amountToSwap, - amountOutMinimum: 0, - sqrtPriceLimitX96: 0, - }); - - // assert - assert.equal(await florin.balanceOf(user1.address), 0); - assert.equal(await solidus.balanceOf(user1.address), 98); - }); -}); diff --git a/package-lock.json b/package-lock.json index 2963583c6d..9e89589807 100644 --- a/package-lock.json +++ b/package-lock.json @@ -870,6 +870,7 @@ "examples/uniswap": { "name": "@nomicfoundation/ignition-uniswap-example", "version": "0.4.0", + "extraneous": true, "dependencies": { "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", "@uniswap/swap-router-contracts": "1.1.0", @@ -887,203 +888,6 @@ "prettier-plugin-solidity": "1.1.3" } }, - "examples/uniswap/node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true - }, - "examples/uniswap/node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" - } - }, - "examples/uniswap/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", - "dev": true, - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" - }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" - } - }, - "examples/uniswap/node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", - "dev": true, - "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.2.0", - "typescript": ">=4.5.0" - } - }, - "examples/uniswap/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" - }, - "examples/uniswap/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" - } - }, - "examples/uniswap/node_modules/@typechain/hardhat": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.1" - } - }, - "examples/uniswap/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", - "dev": true, - "peer": true - }, - "examples/uniswap/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", - "dev": true, - "peer": true - }, - "examples/uniswap/node_modules/ethers": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "peer": true, - "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "examples/uniswap/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "examples/uniswap/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true, - "peer": true - }, - "examples/uniswap/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.9.2", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", @@ -4171,10 +3975,6 @@ "resolved": "packages/ui", "link": true }, - "node_modules/@nomicfoundation/ignition-uniswap-example": { - "resolved": "examples/uniswap", - "link": true - }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", @@ -6073,203 +5873,6 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, - "node_modules/@uniswap/lib": { - "version": "4.0.1-alpha", - "resolved": "https://registry.npmjs.org/@uniswap/lib/-/lib-4.0.1-alpha.tgz", - "integrity": "sha512-f6UIliwBbRsgVLxIaBANF6w09tYqc6Y/qXdsrbEmXHyFA7ILiKrIwRFXe1yOg8M3cksgVsO9N7yuL2DdCGQKBA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/sdk-core": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/@uniswap/sdk-core/-/sdk-core-3.2.3.tgz", - "integrity": "sha512-ERVYKa5ENPwDA6/UZ45H1D5xIqTFcvDYpLxcncOzX8vRXuCAupMUoFFH5s/xx8IMcstONsAOPR1h4vRCzUkSsA==", - "dependencies": { - "@ethersproject/address": "^5.0.2", - "big.js": "^5.2.2", - "decimal.js-light": "^2.5.0", - "jsbi": "^3.1.4", - "tiny-invariant": "^1.1.0", - "toformat": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/sdk-core/node_modules/big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "engines": { - "node": "*" - } - }, - "node_modules/@uniswap/swap-router-contracts": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.1.0.tgz", - "integrity": "sha512-GPmpx1lvjXWloB95+YUabr3UHJYr3scnSS8EzaNXnNrIz9nYZ+XQcMaJxOKe85Yi7IfcUQpj0HzD2TW99dtolA==", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.3.0", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/swap-router-contracts/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, - "node_modules/@uniswap/swap-router-contracts/node_modules/@uniswap/v3-periphery": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", - "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v2-core": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@uniswap/v2-core/-/v2-core-1.0.1.tgz", - "integrity": "sha512-MtybtkUPSyysqLY2U210NBDeCHX+ltHt3oADGdjqoThZaFRDKwM6k1Nb3F0A3hk5hwuQvytFWhrWHOEq6nVJ8Q==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-core/-/v3-core-1.0.0.tgz", - "integrity": "sha512-kSC4djMGKMHj7sLMYVnn61k9nu+lHjMIxgg9CDQT+s2QYLoA56GbSK9Oxr+qJXzzygbkrmuY6cwgP6cW2JXPFA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.1.1.tgz", - "integrity": "sha512-orqD2Xy4lxVPF6pxd7ECSJY0gzEuqyeVSDHjzM86uWxOXlA4Nlh5pvI959KaS32pSOFBOVVA4XbbZywbJj+CZg==", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-periphery/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, - "node_modules/@uniswap/v3-sdk": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-sdk/-/v3-sdk-3.9.0.tgz", - "integrity": "sha512-LuoF3UcY1DxSAQKJ3E4/1Eq4HaNp+x+7q9mvbpiu+/PBj+O1DjLforAMrKxu+RsA0aarmZtz7yBnAPy+akgfgQ==", - "dependencies": { - "@ethersproject/abi": "^5.0.12", - "@ethersproject/solidity": "^5.0.9", - "@uniswap/sdk-core": "^3.0.1", - "@uniswap/swap-router-contracts": "^1.2.1", - "@uniswap/v3-periphery": "^1.1.1", - "@uniswap/v3-staker": "1.0.0", - "tiny-invariant": "^1.1.0", - "tiny-warning": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-sdk/node_modules/@openzeppelin/contracts": { - "version": "3.4.2-solc-0.7", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.2-solc-0.7.tgz", - "integrity": "sha512-W6QmqgkADuFcTLzHL8vVoNBtkwjvQRpYIAom7KiUNoLKghyx3FgH0GBjt8NRvigV1ZmMOBllvE1By1C+bi8WpA==" - }, - "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/swap-router-contracts": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/swap-router-contracts/-/swap-router-contracts-1.3.0.tgz", - "integrity": "sha512-iKvCuRkHXEe0EMjOf8HFUISTIhlxI57kKFllf3C3PUIE0HmwxrayyoflwAz5u/TRsFGYqJ9IjX2UgzLCsrNa5A==", - "dependencies": { - "@openzeppelin/contracts": "3.4.2-solc-0.7", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.4.1", - "dotenv": "^14.2.0", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-periphery": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.4.1.tgz", - "integrity": "sha512-Ab0ZCKOQrQMKIcpBTezTsEhWfQjItd0TtkCG8mPhoQu+wC67nPaf4hYUhM6wGHeFUmDiYY5MpEQuokB0ENvoTg==", - "dependencies": { - "@openzeppelin/contracts": "3.4.2-solc-0.7", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.0.tgz", - "integrity": "sha512-JV0Qc46Px5alvg6YWd+UIaGH9lDuYG/Js7ngxPit1SPaIP30AlVer1UYB7BRYeUVVxE+byUyIeN5jeQ7LLDjIw==", - "deprecated": "Please upgrade to 1.0.1", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-sdk/node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, - "node_modules/@uniswap/v3-staker": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@uniswap/v3-staker/-/v3-staker-1.0.2.tgz", - "integrity": "sha512-+swIh/yhY9GQGyQxT4Gz54aXYLK+uc3qsmIvaAX+FjvhcL9TGOvS9tXbQsCZM4AJW63vj6TLsmHIjGMIePL1BQ==", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@uniswap/v3-staker/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, "node_modules/@vitejs/plugin-react": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", @@ -6785,11 +6388,6 @@ } ] }, - "node_modules/base64-sol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/base64-sol/-/base64-sol-1.0.1.tgz", - "integrity": "sha512-ld3cCNMeXt4uJXmLZBHFGMvVpK9KsLVEhPpFRXnvSVAqABKbuNZg/+dsq3NuM+wxFLb/UrVkz7m1ciWmkMfTbg==" - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -8685,11 +8283,6 @@ "node": ">=0.10.0" } }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" - }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -9016,14 +8609,6 @@ "no-case": "^2.2.0" } }, - "node_modules/dotenv": { - "version": "14.3.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-14.3.2.tgz", - "integrity": "sha512-vwEppIphpFdvaMCaHfCEv9IgwcxMljMw2TnAQBB4VWPvzXQLTb82jwmdOKzlEVUL3gNFT4l4TPKO+Bn+sqcrVQ==", - "engines": { - "node": ">=12" - } - }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -12257,17 +11842,6 @@ "hardhat": "^2.0.2" } }, - "node_modules/hardhat-watcher": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hardhat-watcher/-/hardhat-watcher-2.5.0.tgz", - "integrity": "sha512-Su2qcSMIo2YO2PrmJ0/tdkf+6pSt8zf9+4URR5edMVti6+ShI8T3xhPrwugdyTOFuyj8lKHrcTZNKUFYowYiyA==", - "dependencies": { - "chokidar": "^3.5.3" - }, - "peerDependencies": { - "hardhat": "^2.0.0" - } - }, "node_modules/hardhat/node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -13711,11 +13285,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsbi": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/jsbi/-/jsbi-3.2.5.tgz", - "integrity": "sha512-aBE4n43IPvjaddScbvWRA2YlTzKEynHzu7MqOyTipdHucf/VxS63ViCjxYRg86M8Rxwbt/GfzHl1kKERkt45fQ==" - }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -19431,16 +19000,6 @@ "node": ">=0.10.0" } }, - "node_modules/tiny-invariant": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", - "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", - "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" - }, "node_modules/title-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", @@ -19481,11 +19040,6 @@ "node": ">=8.0" } }, - "node_modules/toformat": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", - "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -20228,28 +19782,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v3-periphery-1_3_0": { - "name": "@uniswap/v3-periphery", - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@uniswap/v3-periphery/-/v3-periphery-1.3.0.tgz", - "integrity": "sha512-HjHdI5RkjBl8zz3bqHShrbULFoZSrjbbrRHoO2vbzn+WRzTa6xY4PWphZv2Tlcb38YEKfKHp6NPl5hVedac8uw==", - "dependencies": { - "@openzeppelin/contracts": "3.4.1-solc-0.7-2", - "@uniswap/lib": "^4.0.1-alpha", - "@uniswap/v2-core": "1.0.1", - "@uniswap/v3-core": "1.0.0", - "base64-sol": "1.0.1", - "hardhat-watcher": "^2.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/v3-periphery-1_3_0/node_modules/@openzeppelin/contracts": { - "version": "3.4.1-solc-0.7-2", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-3.4.1-solc-0.7-2.tgz", - "integrity": "sha512-tAG9LWg8+M2CMu7hIsqHPaTyG4uDzjr6mhvH96LvOpLZZj6tgzTluBt+LsCf1/QaYrlis6pITvpIaIhE+iZB+Q==" - }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", From 6c841214a06ec72cf1d4ec1a3537bf412fe9bece Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 14:45:56 +0100 Subject: [PATCH 1033/1302] docs: update the example readmes --- examples/complete/README.md | 8 ++++---- examples/ens/README.md | 8 ++++---- examples/sample/README.md | 7 +++---- examples/ts-sample/README.md | 9 +++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/examples/complete/README.md b/examples/complete/README.md index 4107d4dae1..bc1240ad89 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -1,10 +1,10 @@ -# Complete Example for Ignition +# Complete Example for Hardhat Ignition -This is a bit of a contrived example project, intended mostly to ensure working end-to-end functionality across the API. +This is a contrived example project, intended mostly to ensure working end-to-end functionality across the API. ## Deploying -To run the ignition deploy against the ephemeral hardhat network: +To run the Ignition deploy against the ephemeral hardhat network: ```shell npx hardhat ignition deploy CompleteModule.js @@ -12,7 +12,7 @@ npx hardhat ignition deploy CompleteModule.js ## Test -To run the hardhat tests using ignition: +To run the Hardhat tests using Ignition: ```shell npm run test diff --git a/examples/ens/README.md b/examples/ens/README.md index 2447902e19..a86427d0f9 100644 --- a/examples/ens/README.md +++ b/examples/ens/README.md @@ -1,10 +1,10 @@ -# ENS Example for Ignition +# ENS Example for Hardhat Ignition -This hardhat project is an example of using ignition to deploy the ENS system of contracts, based on the [Deploying ens on a private chain](https://docs.ens.domains/deploying-ens-on-a-private-chain#migration-file-example) from the ens docs. +This Hardhat project is an example of using ignition to deploy the ENS system of contracts, based on the [Deploying ens on a private chain](https://docs.ens.domains/deploying-ens-on-a-private-chain#migration-file-example) from the ens docs. ## Deploying -To run the ignition deploy against the ephemeral hardhat network: +To run the Ignition deploy against the ephemeral Hardhat network: ```shell npx hardhat ignition deploy ENS.js @@ -20,7 +20,7 @@ npx hardhat ignition deploy test-registrar.js --network localhost ## Test -To run the hardhat tests using ignition: +To run the hardhat tests using Ignition: ```shell npm run test diff --git a/examples/sample/README.md b/examples/sample/README.md index 8c826c0c61..abb79ade36 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -1,11 +1,10 @@ # Hardhat Sample for Hardhat Ignition -This Hardhat project is a variant of Hardhat's sample project enhanced with -Hardhat Ignition. +This project is Hardhat's sample project enhanced with Hardhat Ignition. ## Deploying -To run the ignition deploy against the ephemeral hardhat network: +To run the Ignition deploy against the ephemeral hardhat network: ```shell npx hardhat ignition deploy LockModule.js @@ -13,7 +12,7 @@ npx hardhat ignition deploy LockModule.js ## Test -To run the hardhat tests using ignition: +To run the hardhat tests using Ignition: ```shell npm run test diff --git a/examples/ts-sample/README.md b/examples/ts-sample/README.md index d7d8a5410d..ae0cd503f1 100644 --- a/examples/ts-sample/README.md +++ b/examples/ts-sample/README.md @@ -1,10 +1,11 @@ -# Hardhat Sample for Ignition +# Hardhat Typescript Sample for Hardhat Ignition -This hardhat project is a variant of Hardhat's typescript sample project. +This project is Hardhat's typescript sample project enhanced with Hardhat +Ignition. ## Deploying -To run the ignition deploy against the ephemeral hardhat network: +To run the Ignition deploy against the ephemeral Hardhat network: ```shell npx hardhat ignition deploy LockModule @@ -12,7 +13,7 @@ npx hardhat ignition deploy LockModule ## Test -To run the hardhat tests using ignition: +To run the hardhat tests using Ignition: ```shell npm run test From 290f7c0754921f11ad3f23cc52a488407c588a94 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 11:45:42 +0100 Subject: [PATCH 1034/1302] chore: remove ui deps Move the ui projects dependencies to dev-dependencies. The UI npm package consists of a single `index.html` file that is used from the Ignition plugin. This is built during publishing. There is no need for any additional dependencies. Resolves #521. --- package-lock.json | 198 +++++++++++++++++++++++++++++++-------- packages/ui/package.json | 17 ++-- 2 files changed, 167 insertions(+), 48 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9e89589807..1193632935 100644 --- a/package-lock.json +++ b/package-lock.json @@ -910,6 +910,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, "dependencies": { "@babel/highlight": "^7.22.5" }, @@ -969,6 +970,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -983,6 +985,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1022,6 +1025,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1030,6 +1034,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, "dependencies": { "@babel/template": "^7.22.5", "@babel/types": "^7.22.5" @@ -1042,6 +1047,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1053,6 +1059,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1104,6 +1111,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -1115,6 +1123,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1123,6 +1132,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, "engines": { "node": ">=6.9.0" } @@ -1154,6 +1164,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -1167,6 +1178,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1219,6 +1231,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", @@ -1232,6 +1245,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "dev": true, "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.5", @@ -1252,6 +1266,7 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -1264,7 +1279,8 @@ "node_modules/@braintree/sanitize-url": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "dev": true }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", @@ -1315,6 +1331,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dev": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -1322,17 +1339,20 @@ "node_modules/@emotion/memoize": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "dev": true }, "node_modules/@emotion/stylis": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==" + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "dev": true }, "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "dev": true }, "node_modules/@ensdomains/address-encoder": { "version": "0.1.9", @@ -3086,6 +3106,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dev": true, "dependencies": { "@floating-ui/utils": "^0.1.3" } @@ -3094,6 +3115,7 @@ "version": "1.5.3", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dev": true, "dependencies": { "@floating-ui/core": "^1.4.2", "@floating-ui/utils": "^0.1.3" @@ -3102,12 +3124,14 @@ "node_modules/@floating-ui/utils": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==", + "dev": true }, "node_modules/@fontsource/roboto": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==" + "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==", + "dev": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", @@ -3265,6 +3289,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3278,6 +3303,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "devOptional": true, "engines": { "node": ">=6.0.0" } @@ -3286,6 +3312,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, "engines": { "node": ">=6.0.0" } @@ -3293,12 +3320,14 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -3307,7 +3336,8 @@ "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", @@ -4365,6 +4395,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", "integrity": "sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==", + "dev": true, "engines": { "node": ">=14" } @@ -5398,7 +5429,8 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true }, "node_modules/@types/qs": { "version": "6.9.7", @@ -5411,6 +5443,7 @@ "version": "18.2.9", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.9.tgz", "integrity": "sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w==", + "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5446,7 +5479,8 @@ "node_modules/@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true }, "node_modules/@types/secp256k1": { "version": "4.0.3", @@ -6340,6 +6374,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", + "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.21.4", @@ -6354,7 +6389,8 @@ "node_modules/babel-plugin-syntax-jsx": { "version": "6.18.0", "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==" + "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", + "dev": true }, "node_modules/balanced-match": { "version": "1.0.2", @@ -6879,6 +6915,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7177,7 +7214,8 @@ "node_modules/classnames": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", @@ -7420,6 +7458,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "engines": { "node": ">= 10" } @@ -7581,6 +7620,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, "dependencies": { "layout-base": "^1.0.0" } @@ -7731,6 +7771,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, "engines": { "node": ">=4" } @@ -7754,6 +7795,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -7774,12 +7816,14 @@ "node_modules/csstype": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true }, "node_modules/cytoscape": { "version": "3.25.0", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", + "dev": true, "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -7792,6 +7836,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, "dependencies": { "cose-base": "^1.0.0" }, @@ -7803,6 +7848,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, "dependencies": { "cose-base": "^2.2.0" }, @@ -7814,6 +7860,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, "dependencies": { "layout-base": "^2.0.0" } @@ -7821,7 +7868,8 @@ "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true }, "node_modules/d": { "version": "1.0.1", @@ -7836,6 +7884,7 @@ "version": "7.8.5", "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dev": true, "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -7876,6 +7925,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dev": true, "dependencies": { "internmap": "1 - 2" }, @@ -7887,6 +7937,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, "engines": { "node": ">=12" } @@ -7895,6 +7946,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7910,6 +7962,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, "dependencies": { "d3-path": "1 - 3" }, @@ -7921,6 +7974,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "dev": true, "engines": { "node": ">=12" } @@ -7929,6 +7983,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, "dependencies": { "d3-array": "^3.2.0" }, @@ -7940,6 +7995,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, "dependencies": { "delaunator": "5" }, @@ -7951,6 +8007,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "dev": true, "engines": { "node": ">=12" } @@ -7959,6 +8016,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -7971,6 +8029,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -7995,6 +8054,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "dev": true, "engines": { "node": ">=12" } @@ -8003,6 +8063,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, "dependencies": { "d3-dsv": "1 - 3" }, @@ -8014,6 +8075,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -8027,6 +8089,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "dev": true, "engines": { "node": ">=12" } @@ -8035,6 +8098,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "dev": true, "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -8046,6 +8110,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, "engines": { "node": ">=12" } @@ -8054,6 +8119,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dev": true, "dependencies": { "d3-color": "1 - 3" }, @@ -8065,6 +8131,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, "engines": { "node": ">=12" } @@ -8073,6 +8140,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, "engines": { "node": ">=12" } @@ -8081,6 +8149,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "dev": true, "engines": { "node": ">=12" } @@ -8089,6 +8158,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, "engines": { "node": ">=12" } @@ -8097,6 +8167,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dev": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -8112,6 +8183,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "dev": true, "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -8124,6 +8196,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "dev": true, "engines": { "node": ">=12" } @@ -8132,6 +8205,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -8143,6 +8217,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dev": true, "dependencies": { "d3-array": "2 - 3" }, @@ -8154,6 +8229,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dev": true, "dependencies": { "d3-time": "1 - 3" }, @@ -8165,6 +8241,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "dev": true, "engines": { "node": ">=12" } @@ -8173,6 +8250,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "dev": true, "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -8191,6 +8269,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "dev": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -8206,6 +8285,7 @@ "version": "7.0.10", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dev": true, "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -8225,7 +8305,8 @@ "node_modules/dayjs": { "version": "1.11.8", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", - "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==" + "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==", + "dev": true }, "node_modules/death": { "version": "1.1.0", @@ -8432,6 +8513,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dev": true, "dependencies": { "robust-predicates": "^3.0.0" } @@ -8586,7 +8668,8 @@ "node_modules/dompurify": { "version": "2.4.5", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", + "dev": true }, "node_modules/domutils": { "version": "3.1.0", @@ -8632,7 +8715,8 @@ "node_modules/elkjs": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", + "dev": true }, "node_modules/elliptic": { "version": "6.5.4", @@ -11594,6 +11678,7 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, "engines": { "node": ">=4" } @@ -12258,7 +12343,8 @@ "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true }, "node_modules/highlight.js": { "version": "10.7.3", @@ -12287,6 +12373,7 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dev": true, "dependencies": { "react-is": "^16.7.0" } @@ -12294,7 +12381,8 @@ "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, "node_modules/hosted-git-info": { "version": "5.2.1", @@ -12461,6 +12549,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -12610,6 +12699,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "dev": true, "engines": { "node": ">=12" } @@ -13270,7 +13360,8 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -13294,6 +13385,7 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -13423,7 +13515,8 @@ "node_modules/khroma": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "dev": true }, "node_modules/kind-of": { "version": "6.0.3", @@ -13453,7 +13546,8 @@ "node_modules/layout-base": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true }, "node_modules/lcid": { "version": "1.0.0", @@ -13565,7 +13659,8 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true }, "node_modules/lodash.assign": { "version": "4.2.0", @@ -13698,6 +13793,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -14151,6 +14247,7 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", + "dev": true, "dependencies": { "@braintree/sanitize-url": "^6.0.0", "@khanacademy/simple-markdown": "^0.8.6", @@ -14175,6 +14272,7 @@ "version": "0.8.6", "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", + "dev": true, "dependencies": { "@types/react": ">=16.0.0" }, @@ -14187,6 +14285,7 @@ "version": "16.14.0", "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", + "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14201,6 +14300,7 @@ "version": "16.14.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", + "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14216,6 +14316,7 @@ "version": "0.19.1", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14226,6 +14327,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -14948,7 +15050,8 @@ "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "dev": true }, "node_modules/nopt": { "version": "3.0.6", @@ -15887,7 +15990,8 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", @@ -16028,6 +16132,7 @@ "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.4.0", @@ -16039,6 +16144,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, "peer": true }, "node_modules/proxy-addr": { @@ -16207,6 +16313,7 @@ "version": "17.0.2", "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -16220,6 +16327,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -16232,6 +16340,7 @@ "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0" } @@ -16240,6 +16349,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true, "peer": true }, "node_modules/react-refresh": { @@ -16255,6 +16365,7 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.0.tgz", "integrity": "sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==", + "dev": true, "dependencies": { "@remix-run/router": "1.6.0" }, @@ -16269,6 +16380,7 @@ "version": "6.11.0", "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.0.tgz", "integrity": "sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==", + "dev": true, "dependencies": { "@remix-run/router": "1.6.0", "react-router": "6.11.0" @@ -16285,6 +16397,7 @@ "version": "5.21.4", "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.4.tgz", "integrity": "sha512-LZsllEbiu63zNwuCalq3gIFcBu2Xf0I0fMg7uuF7/5ROo5//uHe8Sum7v9L1Rtp6IozcoU9YAjkNUZdrxutsNg==", + "dev": true, "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" @@ -16765,7 +16878,8 @@ "node_modules/robust-predicates": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true }, "node_modules/rollup": { "version": "3.24.0", @@ -16928,7 +17042,8 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true }, "node_modules/safe-array-concat": { "version": "1.0.0", @@ -17296,7 +17411,8 @@ "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==" + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", @@ -18451,6 +18567,7 @@ "version": "5.3.10", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", + "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -18479,7 +18596,8 @@ "node_modules/stylis": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "dev": true }, "node_modules/supports-color": { "version": "5.5.0", @@ -19025,6 +19143,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, "engines": { "node": ">=4" } @@ -19190,6 +19309,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, "engines": { "node": ">=6.10" } @@ -19986,7 +20106,8 @@ "node_modules/web-worker": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true }, "node_modules/web3": { "version": "1.10.0", @@ -21360,17 +21481,9 @@ "packages/ui": { "name": "@nomicfoundation/ignition-ui", "version": "0.4.0", - "dependencies": { + "devDependencies": { "@fontsource/roboto": "^5.0.8", "@nomicfoundation/ignition-core": "^0.4.0", - "mermaid": "10.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "6.11.0", - "react-tooltip": "^5.21.4", - "styled-components": "5.3.10" - }, - "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", @@ -21384,8 +21497,14 @@ "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", + "mermaid": "10.1.0", "mocha": "^9.1.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "6.11.0", + "react-tooltip": "^5.21.4", "rimraf": "3.0.2", + "styled-components": "5.3.10", "ts-node": "10.9.1", "typescript": "^5.0.2", "vite": "^4.3.2", @@ -21987,6 +22106,7 @@ "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dev": true, "dependencies": { "loose-envify": "^1.1.0" }, diff --git a/packages/ui/package.json b/packages/ui/package.json index 3ededb3155..e5d521831a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -13,17 +13,10 @@ "clean": "rimraf dist tsconfig.tsbuildinfo", "prepack": "npm run build" }, - "dependencies": { + "dependencies": {}, + "devDependencies": { "@fontsource/roboto": "^5.0.8", "@nomicfoundation/ignition-core": "^0.4.0", - "mermaid": "10.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "6.11.0", - "react-tooltip": "^5.21.4", - "styled-components": "5.3.10" - }, - "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", @@ -37,8 +30,14 @@ "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", + "mermaid": "10.1.0", "mocha": "^9.1.3", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "6.11.0", + "react-tooltip": "^5.21.4", "rimraf": "3.0.2", + "styled-components": "5.3.10", "ts-node": "10.9.1", "typescript": "^5.0.2", "vite": "^4.3.2", From 9075dbb03aa7f7ec1d00063ab3dd272bd9289301 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 9 Oct 2023 13:38:14 +0000 Subject: [PATCH 1035/1302] Make the UI a dependency of the plugin, not peerDependency --- package-lock.json | 3 +-- packages/hardhat-plugin/package.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1193632935..6c0989078d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21163,6 +21163,7 @@ "version": "0.4.0", "license": "MIT", "dependencies": { + "@nomicfoundation/ignition-ui": "^0.4.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", @@ -21173,7 +21174,6 @@ "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -21212,7 +21212,6 @@ "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", "hardhat": "^2.18.0" } }, diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index b511d443bc..62012339fc 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -34,7 +34,6 @@ "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -73,10 +72,10 @@ "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", "hardhat": "^2.18.0" }, "dependencies": { + "@nomicfoundation/ignition-ui": "^0.4.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", From 57b1e02cb7340c415c547c806d996f674d2dc456 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 14:30:48 +0100 Subject: [PATCH 1036/1302] chore: update node typing and target We leverage `cause` on error and `at` on the array object. This is available on recent versions of the `v16.x` of node. We think this is acceptable in terms of node 16 support and so are bumping our target to `ES2022`. At the same time we are increasing our `@types/node` version to be the latest in the node 16 line. --- config/typescript/tsconfig.json | 2 +- package-lock.json | 6819 ++++++++------------------ packages/core/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 4 files changed, 2069 insertions(+), 4756 deletions(-) diff --git a/config/typescript/tsconfig.json b/config/typescript/tsconfig.json index fbbc0efe2c..7a48075d46 100644 --- a/config/typescript/tsconfig.json +++ b/config/typescript/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "module": "commonjs", "declaration": true, "declarationMap": true, diff --git a/package-lock.json b/package-lock.json index 6c0989078d..33fc769487 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,8 +40,6 @@ }, "examples/complete/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "dev": true, "funding": [ { @@ -49,13 +47,13 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "peer": true }, "examples/complete/node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/chai-as-promised": "^7.1.3", @@ -72,9 +70,8 @@ }, "examples/complete/node_modules/@nomicfoundation/hardhat-ethers": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -87,9 +84,8 @@ }, "examples/complete/node_modules/@nomicfoundation/hardhat-toolbox": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", "dev": true, + "license": "MIT", "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", @@ -112,9 +108,8 @@ }, "examples/complete/node_modules/@typechain/ethers-v6": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -128,9 +123,8 @@ }, "examples/complete/node_modules/@typechain/hardhat": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -144,22 +138,18 @@ }, "examples/complete/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/complete/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/complete/node_modules/ethers": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { @@ -171,6 +161,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.9.2", @@ -187,9 +178,8 @@ }, "examples/complete/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -203,16 +193,14 @@ }, "examples/complete/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true, + "license": "0BSD", "peer": true }, "examples/complete/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10.0.0" @@ -230,20 +218,6 @@ } } }, - "examples/create2": { - "name": "@nomicfoundation/ignition-create2-example", - "version": "0.0.13", - "extraneous": true, - "dependencies": { - "@openzeppelin/contracts": "4.7.3" - }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0", - "prettier-plugin-solidity": "1.1.3" - } - }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", "version": "0.4.0", @@ -259,8 +233,6 @@ }, "examples/ens/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "dev": true, "funding": [ { @@ -268,13 +240,13 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "peer": true }, "examples/ens/node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/chai-as-promised": "^7.1.3", @@ -291,9 +263,8 @@ }, "examples/ens/node_modules/@nomicfoundation/hardhat-ethers": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -306,9 +277,8 @@ }, "examples/ens/node_modules/@nomicfoundation/hardhat-toolbox": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", "dev": true, + "license": "MIT", "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", @@ -331,9 +301,8 @@ }, "examples/ens/node_modules/@typechain/ethers-v6": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -347,9 +316,8 @@ }, "examples/ens/node_modules/@typechain/hardhat": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -363,22 +331,18 @@ }, "examples/ens/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/ens/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/ens/node_modules/ethers": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { @@ -390,6 +354,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.9.2", @@ -406,9 +371,8 @@ }, "examples/ens/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -422,16 +386,14 @@ }, "examples/ens/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true, + "license": "0BSD", "peer": true }, "examples/ens/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10.0.0" @@ -449,20 +411,6 @@ } } }, - "examples/multisig": { - "name": "@nomicfoundation/ignition-example-multisig", - "version": "0.0.13", - "extraneous": true, - "dependencies": { - "@openzeppelin/contracts": "^4.3.2" - }, - "devDependencies": { - "@ignored/hardhat-ignition": "^0.0.13", - "@nomicfoundation/hardhat-toolbox": "2.0.2", - "hardhat": "^2.14.0", - "prettier-plugin-solidity": "1.1.3" - } - }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", "version": "0.4.0", @@ -475,8 +423,6 @@ }, "examples/sample/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "dev": true, "funding": [ { @@ -484,13 +430,13 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "peer": true }, "examples/sample/node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/chai-as-promised": "^7.1.3", @@ -507,9 +453,8 @@ }, "examples/sample/node_modules/@nomicfoundation/hardhat-ethers": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -522,9 +467,8 @@ }, "examples/sample/node_modules/@nomicfoundation/hardhat-toolbox": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", "dev": true, + "license": "MIT", "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", @@ -547,9 +491,8 @@ }, "examples/sample/node_modules/@typechain/ethers-v6": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -563,9 +506,8 @@ }, "examples/sample/node_modules/@typechain/hardhat": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -579,22 +521,18 @@ }, "examples/sample/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/sample/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/sample/node_modules/ethers": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { @@ -606,6 +544,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.9.2", @@ -622,9 +561,8 @@ }, "examples/sample/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -638,16 +576,14 @@ }, "examples/sample/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true, + "license": "0BSD", "peer": true }, "examples/sample/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10.0.0" @@ -677,8 +613,6 @@ }, "examples/ts-sample/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "dev": true, "funding": [ { @@ -686,13 +620,13 @@ "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "peer": true }, "examples/ts-sample/node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/chai-as-promised": "^7.1.3", @@ -709,9 +643,8 @@ }, "examples/ts-sample/node_modules/@nomicfoundation/hardhat-ethers": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "debug": "^4.1.1", @@ -724,9 +657,8 @@ }, "examples/ts-sample/node_modules/@nomicfoundation/hardhat-toolbox": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", "dev": true, + "license": "MIT", "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", @@ -749,9 +681,8 @@ }, "examples/ts-sample/node_modules/@typechain/ethers-v6": { "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.15", @@ -765,9 +696,8 @@ }, "examples/ts-sample/node_modules/@typechain/hardhat": { "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "fs-extra": "^9.1.0" @@ -781,22 +711,18 @@ }, "examples/ts-sample/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/ts-sample/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "dev": true, + "license": "MIT", "peer": true }, "examples/ts-sample/node_modules/ethers": { "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "dev": true, "funding": [ { @@ -808,6 +734,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "peer": true, "dependencies": { "@adraffy/ens-normalize": "1.9.2", @@ -824,9 +751,8 @@ }, "examples/ts-sample/node_modules/fs-extra": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "at-least-node": "^1.0.0", @@ -840,16 +766,14 @@ }, "examples/ts-sample/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", "dev": true, + "license": "0BSD", "peer": true }, "examples/ts-sample/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=10.0.0" @@ -867,37 +791,14 @@ } } }, - "examples/uniswap": { - "name": "@nomicfoundation/ignition-uniswap-example", - "version": "0.4.0", - "extraneous": true, - "dependencies": { - "@openzeppelin/contracts": "npm:@openzeppelin/contracts@3.4.2-solc-0.7", - "@uniswap/swap-router-contracts": "1.1.0", - "@uniswap/v3-core": "1.0.0", - "@uniswap/v3-periphery": "1.1.1", - "@uniswap/v3-sdk": "3.9.0", - "@uniswap/v3-staker": "1.0.2", - "bignumber.js": "9.1.0", - "v3-periphery-1_3_0": "npm:@uniswap/v3-periphery@1.3.0" - }, - "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", - "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + "license": "MIT" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -908,9 +809,8 @@ }, "node_modules/@babel/code-frame": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", - "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.22.5" }, @@ -920,18 +820,16 @@ }, "node_modules/@babel/compat-data": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", @@ -959,18 +857,16 @@ }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -983,9 +879,8 @@ }, "node_modules/@babel/helper-annotate-as-pure": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -995,9 +890,8 @@ }, "node_modules/@babel/helper-compilation-targets": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/compat-data": "^7.22.5", "@babel/helper-validator-option": "^7.22.5", @@ -1014,27 +908,24 @@ }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", - "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", - "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.5", "@babel/types": "^7.22.5" @@ -1045,9 +936,8 @@ }, "node_modules/@babel/helper-hoist-variables": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1057,9 +947,8 @@ }, "node_modules/@babel/helper-module-imports": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1069,9 +958,8 @@ }, "node_modules/@babel/helper-module-transforms": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", - "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-module-imports": "^7.22.5", @@ -1088,18 +976,16 @@ }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1109,9 +995,8 @@ }, "node_modules/@babel/helper-split-export-declaration": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.22.5" }, @@ -1121,36 +1006,32 @@ }, "node_modules/@babel/helper-string-parser": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, + "license": "MIT", "dependencies": { "@babel/template": "^7.22.5", "@babel/traverse": "^7.22.5", @@ -1162,9 +1043,8 @@ }, "node_modules/@babel/highlight": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", - "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.5", "chalk": "^2.0.0", @@ -1176,9 +1056,8 @@ }, "node_modules/@babel/parser": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", "dev": true, + "license": "MIT", "bin": { "parser": "bin/babel-parser.js" }, @@ -1188,9 +1067,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-self": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1203,9 +1081,8 @@ }, "node_modules/@babel/plugin-transform-react-jsx-source": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, @@ -1218,8 +1095,7 @@ }, "node_modules/@babel/runtime": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -1229,9 +1105,8 @@ }, "node_modules/@babel/template": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", - "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/parser": "^7.22.5", @@ -1243,9 +1118,8 @@ }, "node_modules/@babel/traverse": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.22.5", "@babel/generator": "^7.22.5", @@ -1264,9 +1138,8 @@ }, "node_modules/@babel/types": { "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.22.5", "@babel/helper-validator-identifier": "^7.22.5", @@ -1278,27 +1151,23 @@ }, "node_modules/@braintree/sanitize-url": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@chainsafe/as-sha256": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" + "license": "Apache-2.0" }, "node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } }, "node_modules/@chainsafe/ssz": { "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.4.2", @@ -1307,9 +1176,8 @@ }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -1319,9 +1187,8 @@ }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "devOptional": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1329,35 +1196,30 @@ }, "node_modules/@emotion/is-prop-valid": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dev": true, + "license": "MIT", "dependencies": { "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/stylis": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@emotion/unitless": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@ensdomains/address-encoder": { "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", + "license": "BSD", "dependencies": { "bech32": "^1.1.3", "blakejs": "^1.1.0", @@ -1370,22 +1232,17 @@ }, "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/@ensdomains/buffer": { "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", - "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", "dependencies": { "@nomiclabs/hardhat-truffle5": "^2.0.0" } }, "node_modules/@ensdomains/ens": { "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", + "license": "CC0-1.0", "dependencies": { "bluebird": "^3.5.2", "eth-ens-namehash": "^2.0.8", @@ -1396,8 +1253,7 @@ }, "node_modules/@ensdomains/ens-contracts": { "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", - "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "license": "MIT", "dependencies": { "@ensdomains/buffer": "^0.0.13", "@ensdomains/solsha1": "0.0.3", @@ -1407,24 +1263,21 @@ }, "node_modules/@ensdomains/ens/node_modules/ansi-regex": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/camelcase": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/cliui": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "license": "ISC", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1", @@ -1433,8 +1286,7 @@ }, "node_modules/@ensdomains/ens/node_modules/find-up": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "license": "MIT", "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -1445,8 +1297,7 @@ }, "node_modules/@ensdomains/ens/node_modules/fs-extra": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -1457,18 +1308,15 @@ }, "node_modules/@ensdomains/ens/node_modules/get-caller-file": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "license": "MIT", "dependencies": { "number-is-nan": "^1.0.0" }, @@ -1478,16 +1326,14 @@ }, "node_modules/@ensdomains/ens/node_modules/jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@ensdomains/ens/node_modules/load-json-file": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -1501,8 +1347,7 @@ }, "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -1512,8 +1357,7 @@ }, "node_modules/@ensdomains/ens/node_modules/parse-json": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "license": "MIT", "dependencies": { "error-ex": "^1.2.0" }, @@ -1523,8 +1367,7 @@ }, "node_modules/@ensdomains/ens/node_modules/path-exists": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "license": "MIT", "dependencies": { "pinkie-promise": "^2.0.0" }, @@ -1534,8 +1377,7 @@ }, "node_modules/@ensdomains/ens/node_modules/path-type": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -1547,16 +1389,14 @@ }, "node_modules/@ensdomains/ens/node_modules/pify": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/read-pkg": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "license": "MIT", "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -1568,8 +1408,7 @@ }, "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "license": "MIT", "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -1580,21 +1419,18 @@ }, "node_modules/@ensdomains/ens/node_modules/require-from-string": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/@ensdomains/ens/node_modules/require-main-filename": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -1604,16 +1440,14 @@ }, "node_modules/@ensdomains/ens/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/@ensdomains/ens/node_modules/solc": { "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", + "license": "MIT", "dependencies": { "fs-extra": "^0.30.0", "memorystream": "^0.3.1", @@ -1627,8 +1461,7 @@ }, "node_modules/@ensdomains/ens/node_modules/string-width": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "license": "MIT", "dependencies": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -1640,8 +1473,7 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-ansi": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "license": "MIT", "dependencies": { "ansi-regex": "^2.0.0" }, @@ -1651,8 +1483,7 @@ }, "node_modules/@ensdomains/ens/node_modules/strip-bom": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "license": "MIT", "dependencies": { "is-utf8": "^0.2.0" }, @@ -1662,13 +1493,11 @@ }, "node_modules/@ensdomains/ens/node_modules/which-module": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "license": "MIT", "dependencies": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" @@ -1679,13 +1508,11 @@ }, "node_modules/@ensdomains/ens/node_modules/y18n": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + "license": "ISC" }, "node_modules/@ensdomains/ens/node_modules/yargs": { "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", + "license": "MIT", "dependencies": { "cliui": "^3.2.0", "decamelize": "^1.1.1", @@ -1705,8 +1532,7 @@ }, "node_modules/@ensdomains/ens/node_modules/yargs-parser": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", + "license": "ISC", "dependencies": { "camelcase": "^3.0.0", "lodash.assign": "^4.0.6" @@ -1714,8 +1540,7 @@ }, "node_modules/@ensdomains/ensjs": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", + "license": "ISC", "dependencies": { "@babel/runtime": "^7.4.4", "@ensdomains/address-encoder": "^0.1.7", @@ -1728,467 +1553,117 @@ } }, "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts" + "version": "0.2.4" }, "node_modules/@ensdomains/solsha1": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", - "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", "dependencies": { "hash-test-vectors": "^1.3.2" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/darwin-x64": { "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.19.tgz", - "integrity": "sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "android" + "darwin" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.19.tgz", - "integrity": "sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", "dev": true, - "optional": true, - "os": [ - "android" - ], + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.19.tgz", - "integrity": "sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.1", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.19.tgz", - "integrity": "sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", "dev": true, - "optional": true, - "os": [ - "darwin" - ], + "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.19.tgz", - "integrity": "sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, "engines": { - "node": ">=12" + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.19.tgz", - "integrity": "sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", "dev": true, - "optional": true, - "os": [ - "freebsd" - ], + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=12" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.19.tgz", - "integrity": "sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=12" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.19.tgz", - "integrity": "sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/js": { + "version": "8.42.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.19.tgz", - "integrity": "sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.19.tgz", - "integrity": "sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.19.tgz", - "integrity": "sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.19.tgz", - "integrity": "sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.19.tgz", - "integrity": "sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.19.tgz", - "integrity": "sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.19.tgz", - "integrity": "sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.19.tgz", - "integrity": "sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.19.tgz", - "integrity": "sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.19.tgz", - "integrity": "sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.19.tgz", - "integrity": "sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.19.tgz", - "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ethereumjs/common": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "license": "MIT", "dependencies": { "crc-32": "^1.2.0", "ethereumjs-util": "^7.1.1" @@ -2196,8 +1671,7 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2218,8 +1692,7 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -2233,8 +1706,7 @@ }, "node_modules/@ethereumjs/tx": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "license": "MPL-2.0", "dependencies": { "@ethereumjs/common": "^2.5.0", "ethereumjs-util": "^7.1.2" @@ -2242,8 +1714,7 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -2264,8 +1735,7 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -2279,8 +1749,6 @@ }, "node_modules/@ethersproject/abi": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", "funding": [ { "type": "individual", @@ -2291,6 +1759,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -2305,8 +1774,6 @@ }, "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2317,6 +1784,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2327,8 +1795,6 @@ }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -2339,6 +1805,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2351,8 +1818,6 @@ }, "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -2363,6 +1828,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -2373,8 +1839,6 @@ }, "node_modules/@ethersproject/address": { "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", "funding": [ { "type": "individual", @@ -2385,6 +1849,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.6.2", "@ethersproject/bytes": "^5.6.1", @@ -2395,8 +1860,6 @@ }, "node_modules/@ethersproject/base64": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -2407,14 +1870,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -2425,6 +1887,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -2432,8 +1895,6 @@ }, "node_modules/@ethersproject/bignumber": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "funding": [ { "type": "individual", @@ -2444,6 +1905,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -2452,8 +1914,6 @@ }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -2464,14 +1924,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -2482,14 +1941,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -2500,6 +1958,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -2515,8 +1974,6 @@ }, "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2527,6 +1984,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2537,8 +1995,6 @@ }, "node_modules/@ethersproject/hash": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -2549,6 +2005,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -2563,8 +2020,6 @@ }, "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2575,6 +2030,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2585,8 +2041,6 @@ }, "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -2597,6 +2051,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -2614,8 +2069,6 @@ }, "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "funding": [ { "type": "individual", @@ -2626,6 +2079,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -2644,8 +2098,6 @@ }, "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2656,6 +2108,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2666,8 +2119,6 @@ }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -2678,6 +2129,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -2685,8 +2137,6 @@ }, "node_modules/@ethersproject/logger": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -2696,12 +2146,11 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ] + ], + "license": "MIT" }, "node_modules/@ethersproject/networks": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -2712,14 +2161,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -2730,6 +2178,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -2737,8 +2186,6 @@ }, "node_modules/@ethersproject/properties": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -2749,14 +2196,13 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -2767,6 +2213,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -2792,8 +2239,6 @@ }, "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2804,6 +2249,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2814,8 +2260,6 @@ }, "node_modules/@ethersproject/random": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -2826,6 +2270,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -2833,8 +2278,6 @@ }, "node_modules/@ethersproject/rlp": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "funding": [ { "type": "individual", @@ -2845,6 +2288,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -2852,8 +2296,6 @@ }, "node_modules/@ethersproject/sha2": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -2864,6 +2306,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -2872,8 +2315,6 @@ }, "node_modules/@ethersproject/signing-key": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "funding": [ { "type": "individual", @@ -2884,6 +2325,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -2895,8 +2337,6 @@ }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "funding": [ { "type": "individual", @@ -2907,6 +2347,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2918,8 +2359,6 @@ }, "node_modules/@ethersproject/strings": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "funding": [ { "type": "individual", @@ -2930,6 +2369,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -2938,8 +2378,6 @@ }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "funding": [ { "type": "individual", @@ -2950,6 +2388,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -2964,8 +2403,6 @@ }, "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2976,6 +2413,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2986,8 +2424,6 @@ }, "node_modules/@ethersproject/units": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "funding": [ { "type": "individual", @@ -2998,6 +2434,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -3006,8 +2443,6 @@ }, "node_modules/@ethersproject/wallet": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -3018,6 +2453,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -3038,8 +2474,6 @@ }, "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -3050,6 +2484,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -3060,8 +2495,6 @@ }, "node_modules/@ethersproject/web": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "funding": [ { "type": "individual", @@ -3072,6 +2505,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -3082,8 +2516,6 @@ }, "node_modules/@ethersproject/wordlists": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "funding": [ { "type": "individual", @@ -3094,6 +2526,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -3104,18 +2537,16 @@ }, "node_modules/@floating-ui/core": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dev": true, + "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dev": true, + "license": "MIT", "dependencies": { "@floating-ui/core": "^1.4.2", "@floating-ui/utils": "^0.1.3" @@ -3123,21 +2554,18 @@ }, "node_modules/@floating-ui/utils": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", - "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@fontsource/roboto": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -3149,9 +2577,8 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -3162,15 +2589,13 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", @@ -3184,9 +2609,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -3197,9 +2621,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -3209,9 +2632,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -3224,9 +2646,8 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -3236,36 +2657,32 @@ }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/nyc-config-typescript": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2" }, @@ -3278,18 +2695,16 @@ }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -3301,33 +2716,29 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -3335,19 +2746,16 @@ }, "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "license": "MIT" }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "license": "ISC", "dependencies": { "ethereumjs-abi": "^0.6.8", "ethereumjs-util": "^6.2.1", @@ -3361,9 +2769,8 @@ }, "node_modules/@microsoft/api-extractor": { "version": "7.34.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", - "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/api-extractor-model": "7.26.4", "@microsoft/tsdoc": "0.14.2", @@ -3384,9 +2791,8 @@ }, "node_modules/@microsoft/api-extractor-model": { "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", - "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", @@ -3395,9 +2801,8 @@ }, "node_modules/@microsoft/api-extractor/node_modules/typescript": { "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -3408,15 +2813,13 @@ }, "node_modules/@microsoft/tsdoc": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@microsoft/tsdoc-config": { "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", "dev": true, + "license": "MIT", "dependencies": { "@microsoft/tsdoc": "0.14.2", "ajv": "~6.12.6", @@ -3426,9 +2829,8 @@ }, "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", "dev": true, + "license": "MIT", "dependencies": { "is-core-module": "^2.1.0", "path-parse": "^1.0.6" @@ -3439,31 +2841,28 @@ }, "node_modules/@noble/hashes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@noble/secp256k1": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -3474,18 +2873,16 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3496,8 +2893,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-block": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -3513,9 +2909,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3536,8 +2930,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-common": "4.0.2", @@ -3559,9 +2952,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3582,8 +2973,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-common": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", + "license": "MIT", "dependencies": { "@nomicfoundation/ethereumjs-util": "9.0.2", "crc-32": "^1.2.0" @@ -3591,8 +2981,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-ethash": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -3607,9 +2996,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3630,8 +3017,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-evm": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", + "license": "MPL-2.0", "dependencies": { "@ethersproject/providers": "^5.7.1", "@nomicfoundation/ethereumjs-common": "4.0.2", @@ -3648,9 +3034,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3671,8 +3055,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-rlp": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", + "license": "MPL-2.0", "bin": { "rlp": "bin/rlp" }, @@ -3682,8 +3065,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-statemanager": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-common": "4.0.2", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -3695,9 +3077,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3718,8 +3098,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-trie": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-rlp": "5.0.2", "@nomicfoundation/ethereumjs-util": "9.0.2", @@ -3733,9 +3112,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3756,8 +3133,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-tx": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", + "license": "MPL-2.0", "dependencies": { "@chainsafe/ssz": "^0.9.2", "@ethersproject/providers": "^5.7.2", @@ -3772,9 +3148,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3795,8 +3169,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-util": { "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", + "license": "MPL-2.0", "dependencies": { "@chainsafe/ssz": "^0.10.0", "@nomicfoundation/ethereumjs-rlp": "5.0.2", @@ -3808,16 +3181,14 @@ }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1" } }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "license": "Apache-2.0", "dependencies": { "@chainsafe/as-sha256": "^0.3.1", "@chainsafe/persistent-merkle-tree": "^0.5.0" @@ -3825,9 +3196,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3848,8 +3217,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-vm": { "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", + "license": "MPL-2.0", "dependencies": { "@nomicfoundation/ethereumjs-block": "5.0.2", "@nomicfoundation/ethereumjs-blockchain": "7.0.2", @@ -3871,9 +3239,7 @@ }, "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3898,9 +3264,8 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.8.tgz", - "integrity": "sha512-MNqQbzUJZnCMIYvlniC3U+kcavz/PhhQSsY90tbEtUyMj/IQqsLwIRZa4ctjABh3Bz0KCh9OXUZ7Yk/d9hr45Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ethereumjs-util": "^7.1.4" @@ -3911,9 +3276,8 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/pbkdf2": "^3.0.0", @@ -3935,9 +3299,8 @@ }, "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dev": true, + "license": "MPL-2.0", "peer": true, "dependencies": { "@types/bn.js": "^5.1.0", @@ -3952,9 +3315,8 @@ }, "node_modules/@nomicfoundation/hardhat-verify": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", - "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -3973,9 +3335,8 @@ }, "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver.js" @@ -4007,8 +3368,7 @@ }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "license": "MIT", "engines": { "node": ">= 12" }, @@ -4025,28 +3385,12 @@ "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -4055,136 +3399,14 @@ "node": ">= 10" } }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", - "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@nomiclabs/hardhat-truffle5": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", - "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "license": "MIT", "dependencies": { "@nomiclabs/truffle-contract": "^4.2.23", "@types/chai": "^4.2.0", @@ -4200,8 +3422,7 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -4222,8 +3443,7 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -4237,8 +3457,7 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -4250,24 +3469,21 @@ }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@nomiclabs/hardhat-web3": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", - "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "license": "MIT", "peer": true, "dependencies": { "@types/bignumber.js": "^5.0.0" @@ -4279,8 +3495,7 @@ }, "node_modules/@nomiclabs/truffle-contract": { "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", - "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "license": "MIT", "dependencies": { "@ensdomains/ensjs": "^2.0.1", "@truffle/blockchain-utils": "^0.1.3", @@ -4303,21 +3518,18 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "license": "MIT", "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -4332,8 +3544,7 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -4341,35 +3552,27 @@ }, "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + "license": "MIT" }, "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + "license": "MIT" }, "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + "version": "2.0.1" }, "node_modules/@openzeppelin/contracts": { "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", - "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" + "license": "MIT" }, "node_modules/@pkgr/utils": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.1.tgz", - "integrity": "sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "fast-glob": "^3.2.12", @@ -4387,24 +3590,21 @@ }, "node_modules/@pkgr/utils/node_modules/tslib": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/@remix-run/router": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", - "integrity": "sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=14" } }, "node_modules/@rushstack/node-core-library": { "version": "3.55.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", - "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", "dev": true, + "license": "MIT", "dependencies": { "colors": "~1.2.1", "fs-extra": "~7.0.1", @@ -4425,9 +3625,8 @@ }, "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -4439,27 +3638,24 @@ }, "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/@rushstack/node-core-library/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/@rushstack/rig-package": { "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", - "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", "dev": true, + "license": "MIT", "dependencies": { "resolve": "~1.22.1", "strip-json-comments": "~3.1.1" @@ -4467,9 +3663,8 @@ }, "node_modules/@rushstack/ts-command-line": { "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", - "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", "dev": true, + "license": "MIT", "dependencies": { "@types/argparse": "1.0.38", "argparse": "~1.0.9", @@ -4479,25 +3674,23 @@ }, "node_modules/@scure/base": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.1.tgz", - "integrity": "sha512-ZxOhsSyxYwLJj3pLZCefNitxsj093tb2vq90mp2txoYeBqbcjDjqFhyM8eUjq/uFm6zJ+mUuqxlS2FkuSY1MTA==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "node_modules/@scure/bip32": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@noble/secp256k1": "~1.7.0", @@ -4506,14 +3699,13 @@ }, "node_modules/@scure/bip39": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "@noble/hashes": "~1.2.0", "@scure/base": "~1.1.0" @@ -4521,8 +3713,7 @@ }, "node_modules/@sentry/core": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -4536,8 +3727,7 @@ }, "node_modules/@sentry/hub": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "@sentry/utils": "5.30.0", @@ -4549,8 +3739,7 @@ }, "node_modules/@sentry/minimal": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/types": "5.30.0", @@ -4562,8 +3751,7 @@ }, "node_modules/@sentry/node": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/core": "5.30.0", "@sentry/hub": "5.30.0", @@ -4581,8 +3769,7 @@ }, "node_modules/@sentry/tracing": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", + "license": "MIT", "dependencies": { "@sentry/hub": "5.30.0", "@sentry/minimal": "5.30.0", @@ -4596,16 +3783,14 @@ }, "node_modules/@sentry/types": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "license": "BSD-3-Clause", "engines": { "node": ">=6" } }, "node_modules/@sentry/utils": { "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", + "license": "BSD-3-Clause", "dependencies": { "@sentry/types": "5.30.0", "tslib": "^1.9.3" @@ -4616,8 +3801,7 @@ }, "node_modules/@sindresorhus/is": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -4627,15 +3811,13 @@ }, "node_modules/@sinonjs/text-encoding": { "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true + "dev": true, + "license": "(Unlicense OR Apache-2.0)" }, "node_modules/@solidity-parser/parser": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" @@ -4643,8 +3825,7 @@ }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.1" }, @@ -4654,14 +3835,12 @@ }, "node_modules/@tokenizer/token": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@truffle/abi-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.1.tgz", - "integrity": "sha512-ZQUY3XUxEPdqxNaoXsOqF0spTtb6f5RNlnN4MUrVsJ64sOh0FJsY7rxZiUI3khfePmNh4i2qcJrQlKT36YcWUA==", + "license": "MIT", "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", @@ -4670,13 +3849,11 @@ }, "node_modules/@truffle/blockchain-utils": { "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.8.tgz", - "integrity": "sha512-ZskpYDNHkXD3ota4iU3pZz6kLth87RC+wDn66Rp2Or+DqqJCKdnmS9GDctBi1EcMPDEi0BqpkdrfBuzA9uIkGg==" + "license": "MIT" }, "node_modules/@truffle/codec": { "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.15.2.tgz", - "integrity": "sha512-rLLy1RmDq3stE1Bd6cnPO9kGpoB5QE4caY665ghmAURqlqD0ik1Bhbfi4MIRwM7YVx2sYw485qsxfPzlewnT4g==", + "license": "MIT", "dependencies": { "@truffle/abi-utils": "^1.0.1", "@truffle/compile-common": "^0.9.6", @@ -4692,8 +3869,7 @@ }, "node_modules/@truffle/codec/node_modules/cbor": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", + "license": "MIT", "dependencies": { "bignumber.js": "^9.0.1", "nofilter": "^1.0.4" @@ -4704,8 +3880,7 @@ }, "node_modules/@truffle/codec/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -4715,16 +3890,14 @@ }, "node_modules/@truffle/codec/node_modules/nofilter": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/@truffle/codec/node_modules/semver": { "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -4737,13 +3910,11 @@ }, "node_modules/@truffle/codec/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "license": "ISC" }, "node_modules/@truffle/compile-common": { "version": "0.9.6", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.6.tgz", - "integrity": "sha512-TCcmr1E0GqMZJ2tOaCRNEllxTBJ/g7TuD6jDJpw5Gt9Bw0YO3Cmp6yPQRynRSO4xMJbHUgiEsSfRgIhswut5UA==", + "license": "MIT", "dependencies": { "@truffle/error": "^0.2.1", "colors": "1.4.0" @@ -4751,21 +3922,18 @@ }, "node_modules/@truffle/compile-common/node_modules/@truffle/error": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.1.tgz", - "integrity": "sha512-5Qy+z9dg9hP37WNdLnXH4b9MzemWrjTufRq7/DTKqimjyxCP/1zlL8gQEMdiSx1BBtAZz0xypkID/jb7AF/Osg==" + "license": "MIT" }, "node_modules/@truffle/compile-common/node_modules/colors": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/@truffle/contract-schema": { "version": "3.4.14", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.14.tgz", - "integrity": "sha512-IwVQZG9RVNwTdn321+jbFIcky3/kZLkCtq8tqil4jZwivvmZQg8rIVC8GJ7Lkrmixl9/yTyQNL6GtIUUvkZxyA==", + "license": "MIT", "dependencies": { "ajv": "^6.10.0", "debug": "^4.3.1" @@ -4773,8 +3941,7 @@ }, "node_modules/@truffle/debug-utils": { "version": "6.0.51", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.51.tgz", - "integrity": "sha512-lpsmkOnNDZq/zMWqWRXP1j2q3IcL6sM6GRLxSSwaWrubLK1s4aVunY3HNzYHeBswTwo/cYwxQD8PawMeNqe8GA==", + "license": "MIT", "dependencies": { "@truffle/codec": "^0.15.2", "@trufflesuite/chromafi": "^3.0.0", @@ -4786,13 +3953,11 @@ }, "node_modules/@truffle/error": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" + "license": "MIT" }, "node_modules/@truffle/interface-adapter": { "version": "0.5.34", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.34.tgz", - "integrity": "sha512-gPxabfMi2TueE4VxnNuyeudOfvGJQ1ofVC02PFw14cnRQhzH327JikjjQbZ1bT6S7kWl9H6P3hQPFeYFMHdm1g==", + "license": "MIT", "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", @@ -4801,8 +3966,7 @@ }, "node_modules/@truffle/interface-adapter/node_modules/ethers": { "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", + "license": "MIT", "dependencies": { "aes-js": "3.0.0", "bn.js": "^4.11.9", @@ -4817,13 +3981,11 @@ }, "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/hash.js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.0" @@ -4831,29 +3993,22 @@ }, "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + "license": "MIT" }, "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + "version": "2.0.1" }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", + "license": "MIT", "dependencies": { "camelcase": "^4.1.0", "chalk": "^2.3.2", @@ -4867,24 +4022,21 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "license": "MIT", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -4894,47 +4046,39 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/@types/argparse": { "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/bignumber.js": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", + "license": "MIT", "peer": true, "dependencies": { "bignumber.js": "*" @@ -4942,16 +4086,14 @@ }, "node_modules/@types/bn.js": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.1.tgz", - "integrity": "sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "license": "MIT", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -4961,23 +4103,20 @@ }, "node_modules/@types/chai": { "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==" + "license": "MIT" }, "node_modules/@types/chai-as-promised": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.5.tgz", - "integrity": "sha512-jStwss93SITGBwt/niYrkf2C+/1KTeZCZl1LaeezTlqppAKeoQC7jxyqYuP72sxBGKCIbw7oHgbYssIRzT5FCQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/chai": "*" } }, "node_modules/@types/concat-stream": { "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -4985,9 +4124,8 @@ }, "node_modules/@types/d3": { "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -5023,45 +4161,39 @@ }, "node_modules/@types/d3-array": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", - "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.2.tgz", - "integrity": "sha512-uGC7DBh0TZrU/LY43Fd8Qr+2ja1FKmH07q2FoZFHo1eYl8aj87GhfVoY1saJVJiq24rp1+wpI6BvQJMKgQm8oA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.2.tgz", - "integrity": "sha512-2TEm8KzUG3N7z0TrSKPmbxByBx54M+S9lHoP2J55QuLU0VSQ9mE96EJSAOVNEqd1bbynMjeTS9VHmz8/bSw8rA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.2.tgz", - "integrity": "sha512-abT/iLHD3sGZwqMTX1TYCMEulr+wBd0SzyOQnjYNLp7sngdOHYtNkMRI5v3w5thoN+BWtlHVDx2Osvq6fxhZWw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.2.tgz", - "integrity": "sha512-k6/bGDoAGJZnZWaKzeB+9glgXCYGvh6YlluxzBREiVo8f/X2vpTEdgPy9DN7Z2i42PZOZ4JDhVdlTSTSkLDPlQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" @@ -5069,168 +4201,144 @@ }, "node_modules/@types/d3-delaunay": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", - "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.2.tgz", - "integrity": "sha512-rxN6sHUXEZYCKV05MEh4z4WpPSqIw+aP7n9ZN6WYAAvZoEAghEK1WeVZMZcHRBwyaKflU43PCUAJNjFxCzPDjg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.2.tgz", - "integrity": "sha512-qmODKEDvyKWVHcWWCOVcuVcOwikLVsyc4q4EBJMREsoQnR2Qoc2cZQUyFUPgO9q4S3qdSqJKBsuefv+h0Qy+tw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-76pBHCMTvPLt44wFOieouXcGXWOF0AJCceUvaFkxSZEu4VDUdv93JfpMa6VGNFs01FHfuP4a5Ou68eRG1KBfTw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.2.tgz", - "integrity": "sha512-gllwYWozWfbep16N9fByNBDTkJW/SyhH6SGRlXloR7WdtAaBui4plTP+gbUgiEot7vGw/ZZop1yDZlgXXSuzjA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.4.tgz", - "integrity": "sha512-q7xbVLrWcXvSBBEoadowIUJ7sRpS1yvgMWnzHJggFy5cUZBq2HZL5k/pBSm0GdYWS1vs5/EDwMjSKF55PDY4Aw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", - "integrity": "sha512-5KY70ifCCzorkLuIkDe0Z9YTf9RR2CjBX1iaJG+rgM/cPP+sO+q9YdQ9WdhQcgPj1EQiJ2/0+yUkkziTG6Lubg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.3.tgz", - "integrity": "sha512-bK9uZJS3vuDCNeeXQ4z3u0E7OeJZXjUgzFdSOtNtMCJCLvDtWDwfpRVWlyt3y8EvRzI0ccOu9xlMVirawolSCw==", "dev": true, + "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-9hjRTVoZjRFR6xo8igAJyNXQyPX6Aq++Nhb5ebrUF414dv4jr2MitM2fWiOY475wa3Za7TOS2Gh9fmqEhLTt0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.2.tgz", - "integrity": "sha512-QNcK8Jguvc8lU+4OfeNx+qnVy7c0VrDJ+CCVFS9srBo2GL9Y18CnIxBdTF3v38flrGy5s1YggcoAiu6s4fLQIw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", - "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.5.tgz", - "integrity": "sha512-xCB0z3Hi8eFIqyja3vW8iV01+OHGYR2di/+e+AiOcXIOrY82lcvWW8Ke1DYE/EUVMsBl4Db9RppSBS3X1U6J0w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", - "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", - "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.0.tgz", - "integrity": "sha512-yjfBUe6DJBsDin2BMIulhSHmr5qNR5Pxs17+oW4DoVPyVIXZ+m6bs7j1UVKP08Emv6jRmYrYqxYzO63mQxy1rw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.3.tgz", - "integrity": "sha512-/S90Od8Id1wgQNvIA8iFv9jRhCiZcGhPd2qX0bKF/PS+y0W5CrXKgIiELd2CvG1mlQrWK/qlYh3VxicqG1ZvgA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.3.tgz", - "integrity": "sha512-OWk1yYIIWcZ07+igN6BeoG6rqhnJ/pYe+R1qWFM2DtW49zsoSjgb9G5xB0ZXA8hh2jAzey1XuRmMSoXdKw8MDA==", "dev": true, + "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" @@ -5238,27 +4346,24 @@ }, "node_modules/@types/debug": { "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", - "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/dompurify": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", "dev": true, + "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/form-data": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -5266,24 +4371,21 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/geojson": { "version": "7946.0.10", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", - "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/minimatch": "*", @@ -5292,9 +4394,8 @@ }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -5302,89 +4403,76 @@ }, "node_modules/@types/http-cache-semantics": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==" + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/keyv": { "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/lodash": { "version": "4.14.189", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", - "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/lodash.flattendeep": { "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.7.tgz", - "integrity": "sha512-1h6GW/AeZw/Wej6uxrqgmdTDZX1yFS39lRsXYkg+3kWvOWWrlGCI6H7lXxlUHOzxDT4QeYGmgPpQ3BX9XevzOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" + "license": "MIT" }, "node_modules/@types/mermaid": { "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", - "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", "dev": true, + "license": "MIT", "dependencies": { "mermaid": "*" } }, "node_modules/@types/minimatch": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/minimist": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/mocha": { "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ms": { "version": "0.7.31", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", - "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/ndjson": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", - "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "@types/through": "*" @@ -5392,35 +4480,30 @@ }, "node_modules/@types/node": { "version": "20.2.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", - "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/pbkdf2": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/prompts": { "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.4.tgz", - "integrity": "sha512-p5N9uoTH76lLvSAaYSZtBCdEXzpOOufsRjnhjVSrZGXikVGHX9+cc9ERtHRV4hvBKHyZb1bg4K+56Bd2TqUn4A==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "kleur": "^3.0.3" @@ -5428,22 +4511,19 @@ }, "node_modules/@types/prop-types": { "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/qs": { "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/@types/react": { "version": "18.2.9", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.9.tgz", - "integrity": "sha512-pL3JAesUkF7PEQGxh5XOwdXGV907te6m1/Qe1ERJLgomojS6Ne790QiA7GUl434JEkFA2aAaB6qJ5z4e1zJn/w==", "dev": true, + "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -5452,17 +4532,15 @@ }, "node_modules/@types/react-dom": { "version": "18.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.4.tgz", - "integrity": "sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/readable-stream": { "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "license": "MIT", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" @@ -5470,52 +4548,45 @@ }, "node_modules/@types/responselike": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { "version": "0.16.3", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", - "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/secp256k1": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/sinon": { "version": "10.0.15", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.15.tgz", - "integrity": "sha512-3lrFNQG0Kr2LDzvjyjB6AMJk4ge+8iYhQfdnSwIwlG88FUOV43kPcQqDZkDa/h3WSZy6i8Fr0BSjfQtB1B3xuQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/styled-components": { "version": "5.1.26", - "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", - "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", "dev": true, + "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -5524,24 +4595,21 @@ }, "node_modules/@types/through": { "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz", - "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", - "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", - "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/scope-manager": "4.31.2", @@ -5570,9 +4638,8 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.31.2", @@ -5594,9 +4661,8 @@ }, "node_modules/@typescript-eslint/parser": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", - "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/types": "4.31.2", @@ -5621,9 +4687,8 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2" @@ -5638,9 +4703,8 @@ }, "node_modules/@typescript-eslint/type-utils": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/typescript-estree": "5.59.9", "@typescript-eslint/utils": "5.59.9", @@ -5665,9 +4729,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5678,9 +4741,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.59.9", "@typescript-eslint/visitor-keys": "5.59.9", @@ -5705,9 +4767,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" @@ -5722,9 +4783,8 @@ }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5734,9 +4794,8 @@ }, "node_modules/@typescript-eslint/types": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true, + "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -5747,9 +4806,8 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2", @@ -5774,9 +4832,8 @@ }, "node_modules/@typescript-eslint/utils": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -5800,9 +4857,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.9", "@typescript-eslint/visitor-keys": "5.59.9" @@ -5817,9 +4873,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5830,9 +4885,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.59.9", "@typescript-eslint/visitor-keys": "5.59.9", @@ -5857,9 +4911,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" @@ -5874,9 +4927,8 @@ }, "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -5886,9 +4938,8 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", - "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" @@ -5903,15 +4954,13 @@ }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/@vitejs/plugin-react": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", - "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/core": "^7.21.4", "@babel/plugin-transform-react-jsx-self": "^7.21.0", @@ -5927,20 +4976,17 @@ }, "node_modules/abbrev": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" + "license": "MIT" }, "node_modules/abstract-level": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -5956,8 +5002,7 @@ }, "node_modules/accepts": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5968,9 +5013,8 @@ }, "node_modules/acorn": { "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5980,27 +5024,24 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -6008,21 +5049,18 @@ }, "node_modules/adm-zip": { "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "license": "MIT", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + "license": "MIT" }, "node_modules/agent-base": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", "dependencies": { "debug": "4" }, @@ -6032,8 +5070,7 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -6044,8 +5081,7 @@ }, "node_modules/ajv": { "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6059,9 +5095,8 @@ }, "node_modules/amdefine": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, + "license": "BSD-3-Clause OR MIT", "optional": true, "peer": true, "engines": { @@ -6070,16 +5105,14 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, @@ -6092,22 +5125,19 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-sequence-parser": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", - "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ansi-styles": { "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", "dependencies": { "color-convert": "^1.9.0" }, @@ -6117,14 +5147,12 @@ }, "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/anymatch": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -6135,9 +5163,8 @@ }, "node_modules/append-transform": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, + "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -6147,30 +5174,26 @@ }, "node_modules/archy": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/arg": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, + "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-back": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -6178,9 +5201,8 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -6191,14 +5213,12 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "license": "MIT" }, "node_modules/array-includes": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -6215,18 +5235,16 @@ }, "node_modules/array-union": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-uniq": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -6234,9 +5252,8 @@ }, "node_modules/array.prototype.flat": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -6252,9 +5269,8 @@ }, "node_modules/array.prototype.reduce": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -6272,75 +5288,65 @@ }, "node_modules/arrify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asap": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/asn1": { "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "license": "MIT", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "license": "MIT", "engines": { "node": ">=0.8" } }, "node_modules/assertion-error": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/async-limiter": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + "license": "MIT" }, "node_modules/asynckit": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "license": "MIT" }, "node_modules/at-least-node": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, + "license": "ISC", "peer": true, "engines": { "node": ">= 4.0.0" @@ -6348,8 +5354,7 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -6359,22 +5364,19 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "license": "MIT" }, "node_modules/babel-plugin-styled-components": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.3.tgz", - "integrity": "sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.21.4", @@ -6388,27 +5390,22 @@ }, "node_modules/babel-plugin-syntax-jsx": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", - "integrity": "sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/balanced-match": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "license": "MIT" }, "node_modules/base-x": { "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -6422,39 +5419,35 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "license": "BSD-3-Clause", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "license": "Unlicense" }, "node_modules/bech32": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "license": "MIT" }, "node_modules/big-integer": { "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, + "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", + "license": "MIT", "engines": { "node": "*" }, @@ -6465,47 +5458,40 @@ }, "node_modules/bigint-crypto-utils": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/bignumber.js": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/blakejs": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" + "license": "MIT" }, "node_modules/bluebird": { "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + "license": "MIT" }, "node_modules/bn.js": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" + "license": "MIT" }, "node_modules/body-parser": { "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -6527,16 +5513,14 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6546,13 +5530,11 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -6565,14 +5547,12 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" + "license": "ISC" }, "node_modules/bplist-parser": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, + "license": "MIT", "dependencies": { "big-integer": "^1.6.44" }, @@ -6582,8 +5562,7 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6591,8 +5570,7 @@ }, "node_modules/braces": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "license": "MIT", "dependencies": { "fill-range": "^7.0.1" }, @@ -6602,13 +5580,11 @@ }, "node_modules/brorand": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" + "license": "MIT" }, "node_modules/browser-level": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", + "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -6618,13 +5594,11 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + "license": "ISC" }, "node_modules/browserify-aes": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -6636,8 +5610,6 @@ }, "node_modules/browserslist": { "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "dev": true, "funding": [ { @@ -6653,6 +5625,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001489", "electron-to-chromium": "^1.4.411", @@ -6668,16 +5641,14 @@ }, "node_modules/bs58": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", + "license": "MIT", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", + "license": "MIT", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -6686,8 +5657,6 @@ }, "node_modules/buffer": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -6702,6 +5671,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -6709,24 +5679,20 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "license": "MIT" }, "node_modules/buffer-to-arraybuffer": { "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" + "license": "MIT" }, "node_modules/buffer-xor": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" + "license": "MIT" }, "node_modules/bufferutil": { "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -6736,9 +5702,8 @@ }, "node_modules/bundle-name": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, + "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -6751,8 +5716,6 @@ }, "node_modules/busboy": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", "dependencies": { "streamsearch": "^1.1.0" }, @@ -6762,24 +5725,21 @@ }, "node_modules/bytes": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "license": "MIT", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -6795,8 +5755,7 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", "dependencies": { "pump": "^3.0.0" }, @@ -6809,17 +5768,15 @@ }, "node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/caching-transform": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, + "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -6832,8 +5789,7 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -6844,17 +5800,15 @@ }, "node_modules/callsites": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.1" @@ -6862,18 +5816,16 @@ }, "node_modules/camelcase": { "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", - "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^7.0.0", "map-obj": "^4.3.0", @@ -6889,9 +5841,8 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -6901,9 +5852,8 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -6913,17 +5863,14 @@ }, "node_modules/camelize": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { "version": "1.0.30001497", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001497.tgz", - "integrity": "sha512-I4/duVK4wL6rAK/aKZl3HXB4g+lIZvaT4VLAn2rCgJ38jVLb0lv2Xug6QuqmxXFVRJMF74SPPWPJ/1Sdm3vCzw==", "dev": true, "funding": [ { @@ -6938,34 +5885,31 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/case": { "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", + "license": "(MIT OR GPL-3.0-or-later)", "engines": { "node": ">= 0.8.0" } }, "node_modules/caseless": { "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "license": "Apache-2.0" }, "node_modules/catering": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cbor": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "nofilter": "^3.1.0" @@ -6976,8 +5920,7 @@ }, "node_modules/chai": { "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "license": "MIT", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", @@ -6993,9 +5936,8 @@ }, "node_modules/chai-as-promised": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, + "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -7005,8 +5947,7 @@ }, "node_modules/chalk": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -7018,8 +5959,7 @@ }, "node_modules/change-case": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "license": "MIT", "dependencies": { "camel-case": "^3.0.0", "constant-case": "^2.0.0", @@ -7043,9 +5983,8 @@ }, "node_modules/charenc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -7053,16 +5992,14 @@ }, "node_modules/check-error": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -7081,8 +6018,7 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -7097,14 +6033,13 @@ }, "node_modules/chokidar": { "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], + "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7123,19 +6058,15 @@ }, "node_modules/chownr": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + "license": "ISC" }, "node_modules/ci-info": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + "license": "MIT" }, "node_modules/cids": { "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -7150,8 +6081,6 @@ }, "node_modules/cids/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -7166,6 +6095,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -7173,9 +6103,7 @@ }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -7183,8 +6111,7 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "license": "MIT", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -7192,14 +6119,12 @@ }, "node_modules/class-is": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" + "license": "MIT" }, "node_modules/classic-level": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -7213,23 +6138,20 @@ }, "node_modules/classnames": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/clean-stack": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/cli-table3": { "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "object-assign": "^4.1.0", @@ -7244,9 +6166,8 @@ }, "node_modules/cli-table3/node_modules/ansi-regex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -7254,9 +6175,8 @@ }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -7264,9 +6184,8 @@ }, "node_modules/cli-table3/node_modules/string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -7278,9 +6197,8 @@ }, "node_modules/cli-table3/node_modules/strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -7291,8 +6209,7 @@ }, "node_modules/cliui": { "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -7301,8 +6218,7 @@ }, "node_modules/cliui/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -7315,8 +6231,7 @@ }, "node_modules/cliui/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -7326,13 +6241,11 @@ }, "node_modules/cliui/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -7347,8 +6260,7 @@ }, "node_modules/clone-response": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -7358,38 +6270,33 @@ }, "node_modules/code-point-at": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/color-convert": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", "dependencies": { "color-name": "1.1.3" } }, "node_modules/color-name": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "license": "MIT" }, "node_modules/colors": { "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7399,14 +6306,12 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + "license": "MIT" }, "node_modules/command-line-args": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.1.0", @@ -7420,9 +6325,8 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.2", @@ -7436,9 +6340,8 @@ }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7446,9 +6349,8 @@ }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -7456,32 +6358,28 @@ }, "node_modules/commander": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/commondir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/concat-map": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "license": "MIT" }, "node_modules/concat-stream": { "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" ], + "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -7492,16 +6390,14 @@ }, "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "core-util-is": "~1.0.0", @@ -7515,9 +6411,8 @@ }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -7525,8 +6420,7 @@ }, "node_modules/constant-case": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "license": "MIT", "dependencies": { "snake-case": "^2.1.0", "upper-case": "^1.1.1" @@ -7534,8 +6428,7 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", "dependencies": { "safe-buffer": "5.2.1" }, @@ -7545,8 +6438,6 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7560,12 +6451,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/content-hash": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", + "license": "ISC", "dependencies": { "cids": "^0.7.1", "multicodec": "^0.5.5", @@ -7574,40 +6465,34 @@ }, "node_modules/content-type": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cookie": { "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + "license": "MIT" }, "node_modules/core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "license": "MIT" }, "node_modules/cors": { "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -7618,17 +6503,15 @@ }, "node_modules/cose-base": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", "dev": true, + "license": "MIT", "dependencies": { "layout-base": "^1.0.0" } }, "node_modules/crc-32": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", "bin": { "crc32": "bin/crc32.njs" }, @@ -7638,8 +6521,7 @@ }, "node_modules/create-hash": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -7650,8 +6532,7 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "license": "MIT", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -7663,23 +6544,20 @@ }, "node_modules/create-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/cross-fetch": { "version": "3.1.6", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", - "integrity": "sha512-riRvo06crlE8HiqOwIpQhxwdOk4fOeR7FVM/wXoxchFEqMNUjvbs3bfo4OTgMEMHzppd4DxFBDbyySj8Cv781g==", + "license": "MIT", "dependencies": { "node-fetch": "^2.6.11" } }, "node_modules/cross-spawn": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -7691,9 +6569,8 @@ }, "node_modules/crypt": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" @@ -7701,8 +6578,7 @@ }, "node_modules/crypto-addr-codec": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.7.tgz", - "integrity": "sha512-X4hzfBzNhy4mAc3UpiXEC/L0jo5E8wAa9unsnA8nNXYzXjCcGk83hfC5avJWCSGT8V91xMnAS9AKMHmjw5+XCg==", + "license": "MIT", "dependencies": { "base-x": "^3.0.8", "big-integer": "1.6.36", @@ -7715,16 +6591,13 @@ }, "node_modules/crypto-addr-codec/node_modules/big-integer": { "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", + "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/crypto-addr-codec/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -7738,13 +6611,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/crypto-random-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -7757,9 +6630,8 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -7769,17 +6641,15 @@ }, "node_modules/css-color-keywords": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", "dev": true, + "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/css-select": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -7793,9 +6663,8 @@ }, "node_modules/css-to-react-native": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "dev": true, + "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -7804,8 +6673,7 @@ }, "node_modules/css-what": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", "engines": { "node": ">= 6" }, @@ -7815,15 +6683,13 @@ }, "node_modules/csstype": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/cytoscape": { "version": "3.25.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", - "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", "dev": true, + "license": "MIT", "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -7834,9 +6700,8 @@ }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", "dev": true, + "license": "MIT", "dependencies": { "cose-base": "^1.0.0" }, @@ -7846,9 +6711,8 @@ }, "node_modules/cytoscape-fcose": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", "dev": true, + "license": "MIT", "dependencies": { "cose-base": "^2.2.0" }, @@ -7858,23 +6722,20 @@ }, "node_modules/cytoscape-fcose/node_modules/cose-base": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "dev": true, + "license": "MIT", "dependencies": { "layout-base": "^2.0.0" } }, "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/d": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "license": "ISC", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -7882,9 +6743,8 @@ }, "node_modules/d3": { "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -7923,9 +6783,8 @@ }, "node_modules/d3-array": { "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, + "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -7935,18 +6794,16 @@ }, "node_modules/d3-axis": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-brush": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7960,9 +6817,8 @@ }, "node_modules/d3-chord": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dev": true, + "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -7972,18 +6828,16 @@ }, "node_modules/d3-color": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-contour": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -7993,9 +6847,8 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dev": true, + "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -8005,18 +6858,16 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -8027,9 +6878,8 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dev": true, + "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -8052,18 +6902,16 @@ }, "node_modules/d3-ease": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-fetch": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dev": true, + "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -8073,9 +6921,8 @@ }, "node_modules/d3-force": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -8087,18 +6934,16 @@ }, "node_modules/d3-format": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -8108,18 +6953,16 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -8129,45 +6972,40 @@ }, "node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-polygon": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-quadtree": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-random": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-scale": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -8181,9 +7019,8 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -8194,18 +7031,16 @@ }, "node_modules/d3-selection": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-shape": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dev": true, + "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -8215,9 +7050,8 @@ }, "node_modules/d3-time": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, + "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -8227,9 +7061,8 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, + "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -8239,18 +7072,16 @@ }, "node_modules/d3-timer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, + "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -8267,9 +7098,8 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, + "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -8283,9 +7113,8 @@ }, "node_modules/dagre-d3-es": { "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", "dev": true, + "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -8293,8 +7122,7 @@ }, "node_modules/dashdash": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" }, @@ -8304,21 +7132,17 @@ }, "node_modules/dayjs": { "version": "1.11.8", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.8.tgz", - "integrity": "sha512-LcgxzFoWMEPO7ggRv1Y2N31hUf2R0Vj7fuy/m+Bg1K8rr+KAs1AEy4y9jd5DXe8pbHgX+srkHNS7TH6Q6ZhYeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/death": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, "peer": true }, "node_modules/debug": { "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -8333,17 +7157,15 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -8357,25 +7179,22 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decode-uri-component": { "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", "dependencies": { "mimic-response": "^3.1.0" }, @@ -8388,8 +7207,7 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -8399,8 +7217,7 @@ }, "node_modules/deep-eql": { "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "license": "MIT", "dependencies": { "type-detect": "^4.0.0" }, @@ -8410,9 +7227,8 @@ }, "node_modules/deep-extend": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -8420,15 +7236,13 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/default-browser": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, + "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -8444,9 +7258,8 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, + "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -8460,9 +7273,8 @@ }, "node_modules/default-require-extensions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, + "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -8475,17 +7287,15 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -8495,9 +7305,8 @@ }, "node_modules/define-properties": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", "dev": true, + "license": "MIT", "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -8511,33 +7320,29 @@ }, "node_modules/delaunator": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "dev": true, + "license": "ISC", "dependencies": { "robust-predicates": "^3.0.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8545,17 +7350,15 @@ }, "node_modules/detect-indent": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/detect-port": { "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "address": "^1.0.1", @@ -8568,30 +7371,23 @@ }, "node_modules/diff": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/difflib": { "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "peer": true, "dependencies": { "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" } }, "node_modules/dir-glob": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, + "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -8601,8 +7397,7 @@ }, "node_modules/dns-packet": { "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "license": "MIT", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -8612,9 +7407,8 @@ }, "node_modules/doctrine": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8624,8 +7418,7 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -8636,25 +7429,21 @@ } }, "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" + "version": "0.1.2" }, "node_modules/domelementtype": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ] + ], + "license": "BSD-2-Clause" }, "node_modules/domhandler": { "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", "dependencies": { "domelementtype": "^2.3.0" }, @@ -8667,14 +7456,12 @@ }, "node_modules/dompurify": { "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", - "dev": true + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/domutils": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -8686,16 +7473,14 @@ }, "node_modules/dot-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "license": "MIT", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -8703,25 +7488,21 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "license": "MIT" }, "node_modules/electron-to-chromium": { "version": "1.4.425", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.425.tgz", - "integrity": "sha512-wv1NufHxu11zfDbY4fglYQApMswleE9FL/DSeyOyauVXDZ+Kco96JK/tPfBUaDqfRarYp2WH2hJ/5UnVywp9Jg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/elkjs": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", - "dev": true + "dev": true, + "license": "EPL-2.0" }, "node_modules/elliptic": { "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -8734,35 +7515,30 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/emoji-regex": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "license": "MIT" }, "node_modules/encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8773,8 +7549,7 @@ }, "node_modules/enquirer": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1" }, @@ -8784,8 +7559,7 @@ }, "node_modules/entities": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", "engines": { "node": ">=0.12" }, @@ -8795,25 +7569,22 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", "dev": true, + "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", "available-typed-arrays": "^1.0.5", @@ -8849,457 +7620,142 @@ "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "peer": true - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "license": "MIT", + "peer": true }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], + "node_modules/es-set-tostringtag": { + "version": "2.0.1", "dev": true, - "optional": true, - "os": [ - "linux" - ], + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" } }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], + "node_modules/es-shim-unscopables": { + "version": "1.0.0", "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "has": "^1.0.3" } }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], + "node_modules/es-to-primitive": { + "version": "1.2.1", "dev": true, - "optional": true, - "os": [ - "openbsd" - ], + "license": "MIT", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, "engines": { - "node": ">=12" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], + "node_modules/es5-ext": { + "version": "0.10.62", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, "engines": { - "node": ">=12" + "node": ">=0.10" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], + "node_modules/es6-error": { + "version": "4.1.1", "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "license": "MIT" + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "license": "MIT", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "license": "MIT" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" } }, - "node_modules/esbuild-windows-64": { + "node_modules/esbuild": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], "dev": true, - "optional": true, - "os": [ - "win32" - ], + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" } }, - "node_modules/esbuild-windows-arm64": { + "node_modules/esbuild-darwin-64": { "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, + "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": ">=12" @@ -9307,30 +7763,26 @@ }, "node_modules/escalade": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "license": "MIT" }, "node_modules/escape-string-regexp": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/escodegen": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "dependencies": { "esprima": "^2.7.1", @@ -9351,9 +7803,8 @@ }, "node_modules/escodegen/node_modules/esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -9365,8 +7816,6 @@ }, "node_modules/escodegen/node_modules/estraverse": { "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, "peer": true, "engines": { @@ -9375,9 +7824,8 @@ }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -9389,9 +7837,8 @@ }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "deep-is": "~0.1.3", @@ -9407,8 +7854,6 @@ }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "peer": true, "engines": { @@ -9417,8 +7862,6 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "peer": true, @@ -9431,9 +7874,8 @@ }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -9444,9 +7886,8 @@ }, "node_modules/eslint": { "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -9501,9 +7942,8 @@ }, "node_modules/eslint-config-prettier": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, + "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9513,9 +7953,8 @@ }, "node_modules/eslint-import-resolver-node": { "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.11.0", @@ -9524,18 +7963,16 @@ }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, + "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", @@ -9559,9 +7996,8 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/globby": { "version": "13.1.4", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", - "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", "dev": true, + "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.2.11", @@ -9578,18 +8014,16 @@ }, "node_modules/eslint-import-resolver-typescript/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/eslint-import-resolver-typescript/node_modules/slash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -9599,9 +8033,8 @@ }, "node_modules/eslint-module-utils": { "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -9616,18 +8049,16 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, + "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, + "license": "MIT", "dependencies": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", @@ -9654,18 +8085,16 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -9675,15 +8104,13 @@ }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-utils": "^3.0.0", "ramda": "^0.27.1" @@ -9697,18 +8124,16 @@ }, "node_modules/eslint-plugin-no-only-tests": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", - "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, + "license": "MIT", "engines": { "node": ">=5.0.0" } }, "node_modules/eslint-plugin-prettier": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, + "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -9727,9 +8152,8 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9739,18 +8163,16 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.3.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", - "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", "dev": true, + "license": "MIT", "peerDependencies": { "eslint": ">=7" } }, "node_modules/eslint-scope": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -9761,9 +8183,8 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -9779,27 +8200,24 @@ }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, "node_modules/eslint/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -9812,9 +8230,8 @@ }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -9828,9 +8245,8 @@ }, "node_modules/eslint/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -9840,15 +8256,13 @@ }, "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -9858,9 +8272,8 @@ }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -9873,18 +8286,16 @@ }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/globals": { "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -9897,18 +8308,16 @@ }, "node_modules/eslint/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9918,9 +8327,8 @@ }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -9930,9 +8338,8 @@ }, "node_modules/espree": { "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", @@ -9944,18 +8351,16 @@ }, "node_modules/espree/node_modules/eslint-visitor-keys": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/esprima": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, + "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" @@ -9966,9 +8371,8 @@ }, "node_modules/esquery": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -9978,18 +8382,16 @@ }, "node_modules/esquery/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esrecurse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -9999,43 +8401,38 @@ }, "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/esutils": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/etag": { "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/eth-ens-namehash": { "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "license": "ISC", "dependencies": { "idna-uts46-hx": "^2.3.1", "js-sha3": "^0.5.7" @@ -10043,14 +8440,12 @@ }, "node_modules/eth-ens-namehash/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/eth-gas-reporter": { "version": "0.2.25", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.25.tgz", - "integrity": "sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.0-beta.146", @@ -10080,9 +8475,8 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-colors": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10090,9 +8484,8 @@ }, "node_modules/eth-gas-reporter/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10100,16 +8493,14 @@ }, "node_modules/eth-gas-reporter/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/chokidar": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "anymatch": "~3.1.1", @@ -10129,9 +8520,8 @@ }, "node_modules/eth-gas-reporter/node_modules/cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "string-width": "^3.1.0", @@ -10141,9 +8531,8 @@ }, "node_modules/eth-gas-reporter/node_modules/colors": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.1.90" @@ -10151,10 +8540,8 @@ }, "node_modules/eth-gas-reporter/node_modules/debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -10162,9 +8549,8 @@ }, "node_modules/eth-gas-reporter/node_modules/diff": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -10172,16 +8558,14 @@ }, "node_modules/eth-gas-reporter/node_modules/emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/ethers": { "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "aes-js": "3.0.0", @@ -10197,9 +8581,8 @@ }, "node_modules/eth-gas-reporter/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^3.0.0" @@ -10210,9 +8593,8 @@ }, "node_modules/eth-gas-reporter/node_modules/flat": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "is-buffer": "~2.0.3" @@ -10223,11 +8605,8 @@ }, "node_modules/eth-gas-reporter/node_modules/fsevents": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -10239,9 +8618,8 @@ }, "node_modules/eth-gas-reporter/node_modules/glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -10257,9 +8635,8 @@ }, "node_modules/eth-gas-reporter/node_modules/hash.js": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "inherits": "^2.0.3", @@ -10268,9 +8645,8 @@ }, "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -10278,16 +8654,14 @@ }, "node_modules/eth-gas-reporter/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/js-yaml": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -10299,9 +8673,8 @@ }, "node_modules/eth-gas-reporter/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^3.0.0", @@ -10313,9 +8686,8 @@ }, "node_modules/eth-gas-reporter/node_modules/log-symbols": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2" @@ -10326,9 +8698,8 @@ }, "node_modules/eth-gas-reporter/node_modules/minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -10339,9 +8710,8 @@ }, "node_modules/eth-gas-reporter/node_modules/mkdirp": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5" @@ -10352,9 +8722,8 @@ }, "node_modules/eth-gas-reporter/node_modules/mocha": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", - "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-colors": "3.2.3", @@ -10396,16 +8765,14 @@ }, "node_modules/eth-gas-reporter/node_modules/ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/object.assign": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.1.2", @@ -10419,9 +8786,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -10435,9 +8801,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.0.0" @@ -10448,9 +8813,8 @@ }, "node_modules/eth-gas-reporter/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -10458,9 +8822,8 @@ }, "node_modules/eth-gas-reporter/node_modules/readdirp": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "picomatch": "^2.0.4" @@ -10471,23 +8834,20 @@ }, "node_modules/eth-gas-reporter/node_modules/scrypt-js": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/setimmediate": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/eth-gas-reporter/node_modules/string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "emoji-regex": "^7.0.1", @@ -10500,9 +8860,8 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -10513,9 +8872,8 @@ }, "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -10523,9 +8881,8 @@ }, "node_modules/eth-gas-reporter/node_modules/supports-color": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -10536,17 +8893,13 @@ }, "node_modules/eth-gas-reporter/node_modules/uuid": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true, "peer": true }, "node_modules/eth-gas-reporter/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -10557,9 +8910,8 @@ }, "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -10572,16 +8924,14 @@ }, "node_modules/eth-gas-reporter/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/eth-gas-reporter/node_modules/yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cliui": "^5.0.0", @@ -10598,9 +8948,8 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -10609,9 +8958,8 @@ }, "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "flat": "^4.1.0", @@ -10624,8 +8972,7 @@ }, "node_modules/eth-lib": { "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -10637,13 +8984,11 @@ }, "node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/eth-lib/node_modules/ws": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "license": "MIT", "dependencies": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -10652,16 +8997,14 @@ }, "node_modules/ethereum-bloom-filters": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", + "license": "MIT", "dependencies": { "js-sha3": "^0.8.0" } }, "node_modules/ethereum-cryptography": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "license": "MIT", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -10671,8 +9014,7 @@ }, "node_modules/ethereum-ens": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", - "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", + "license": "LGPL-3.0", "dependencies": { "bluebird": "^3.4.7", "eth-ens-namehash": "^2.0.0", @@ -10684,13 +9026,11 @@ }, "node_modules/ethereum-ens/node_modules/js-sha3": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + "license": "MIT" }, "node_modules/ethereumjs-abi": { "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -10698,13 +9038,11 @@ }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/ethereumjs-util": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -10717,21 +9055,18 @@ }, "node_modules/ethereumjs-util/node_modules/@types/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/ethereumjs-util/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -10752,8 +9087,6 @@ }, "node_modules/ethers": { "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "funding": [ { "type": "individual", @@ -10764,6 +9097,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/abi": "5.7.0", "@ethersproject/abstract-provider": "5.7.0", @@ -10799,8 +9133,6 @@ }, "node_modules/ethers/node_modules/@ethersproject/address": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -10811,6 +9143,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -10821,8 +9154,7 @@ }, "node_modules/ethjs-unit": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -10834,13 +9166,11 @@ }, "node_modules/ethjs-unit/node_modules/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "license": "MIT" }, "node_modules/ethjs-util": { "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -10852,13 +9182,11 @@ }, "node_modules/eventemitter3": { "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" + "license": "MIT" }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "license": "MIT", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" @@ -10866,9 +9194,8 @@ }, "node_modules/execa": { "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -10889,9 +9216,8 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -10901,8 +9227,7 @@ }, "node_modules/express": { "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -10942,8 +9267,7 @@ }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -10965,24 +9289,21 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -10992,18 +9313,15 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -11016,8 +9334,7 @@ }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -11030,8 +9347,6 @@ }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -11045,38 +9360,34 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/ext": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "license": "ISC", "dependencies": { "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "license": "ISC" }, "node_modules/extend": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "license": "MIT" }, "node_modules/extsprintf": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" - ] + ], + "license": "MIT" }, "node_modules/fast-check": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", - "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", + "license": "MIT", "dependencies": { "pure-rand": "^5.0.1" }, @@ -11090,20 +9401,17 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "license": "MIT" }, "node_modules/fast-diff": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/fast-glob": { "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "dev": true, + "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -11117,29 +9425,25 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "license": "MIT" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, + "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, + "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -11149,9 +9453,8 @@ }, "node_modules/file-type": { "version": "18.5.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz", - "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", "dev": true, + "license": "MIT", "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -11166,8 +9469,7 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -11177,8 +9479,7 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -11194,22 +9495,19 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, + "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -11224,9 +9522,8 @@ }, "node_modules/find-replace": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.0.1" @@ -11237,8 +9534,7 @@ }, "node_modules/find-up": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "license": "MIT", "dependencies": { "locate-path": "^2.0.0" }, @@ -11248,17 +9544,15 @@ }, "node_modules/flat": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, + "license": "MIT", "dependencies": { "flatted": "^3.1.0", "rimraf": "^3.0.2" @@ -11269,20 +9563,18 @@ }, "node_modules/flatted": { "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -11294,17 +9586,15 @@ }, "node_modules/for-each": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "license": "MIT", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, + "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -11315,16 +9605,14 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/form-data": { "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -11336,34 +9624,28 @@ }, "node_modules/form-data-encoder": { "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" + "license": "MIT" }, "node_modules/forwarded": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fp-ts": { "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" + "license": "MIT" }, "node_modules/fresh": { "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/fromentries": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -11378,12 +9660,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/fs-extra": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -11395,29 +9677,24 @@ }, "node_modules/fs-minipass": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "license": "ISC", "dependencies": { "minipass": "^2.6.0" } }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "license": "ISC" }, "node_modules/fsevents": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -11428,14 +9705,12 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "license": "MIT" }, "node_modules/function.prototype.name": { "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", @@ -11451,47 +9726,41 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" + "license": "MIT" }, "node_modules/functions-have-names": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -11504,18 +9773,16 @@ }, "node_modules/get-package-type": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-port": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -11523,9 +9790,8 @@ }, "node_modules/get-stdin": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -11535,8 +9801,7 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -11546,9 +9811,8 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -11562,9 +9826,8 @@ }, "node_modules/get-tsconfig": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.0.tgz", - "integrity": "sha512-lgbo68hHTQnFddybKbbs/RDRJnJT5YyGy2kQzVwbq+g67X73i+5MVTval34QxGkOe9X5Ujf1UYpCaphLyltjEg==", "dev": true, + "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -11574,17 +9837,15 @@ }, "node_modules/getpass": { "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/ghost-testrpc": { "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -11596,8 +9857,7 @@ }, "node_modules/glob": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -11615,8 +9875,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -11626,8 +9885,7 @@ }, "node_modules/global": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "license": "MIT", "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -11635,9 +9893,8 @@ }, "node_modules/global-modules": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "global-prefix": "^3.0.0" @@ -11648,9 +9905,8 @@ }, "node_modules/global-prefix": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ini": "^1.3.5", @@ -11663,9 +9919,8 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -11676,18 +9931,16 @@ }, "node_modules/globals": { "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, + "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -11700,9 +9953,8 @@ }, "node_modules/globby": { "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, + "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -11720,17 +9972,15 @@ }, "node_modules/globby/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/gopd": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -11740,8 +9990,7 @@ }, "node_modules/got": { "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.6.0", "@szmarczak/http-timer": "^5.0.1", @@ -11766,35 +10015,30 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "license": "ISC" }, "node_modules/grapheme-splitter": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/graphemer": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/growl": { "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4.x" } }, "node_modules/handlebars": { "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5", @@ -11814,17 +10058,14 @@ }, "node_modules/har-schema": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", + "license": "MIT", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -11835,17 +10076,15 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/hardhat": { "version": "2.18.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", - "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", + "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -11914,9 +10153,8 @@ }, "node_modules/hardhat-gas-reporter": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-uniq": "1.0.3", @@ -11929,29 +10167,25 @@ }, "node_modules/hardhat/node_modules/ansi-colors": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/hardhat/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + "license": "Python-2.0" }, "node_modules/hardhat/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/hardhat/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -11961,8 +10195,7 @@ }, "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -11974,16 +10207,14 @@ }, "node_modules/hardhat/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hardhat/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -11993,16 +10224,14 @@ }, "node_modules/hardhat/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/hardhat/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -12015,8 +10244,7 @@ }, "node_modules/hardhat/node_modules/minimatch": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -12026,8 +10254,7 @@ }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "license": "MIT", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -12065,8 +10292,7 @@ }, "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12080,13 +10306,11 @@ }, "node_modules/hardhat/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/hardhat/node_modules/nanoid": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12096,8 +10320,7 @@ }, "node_modules/hardhat/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -12110,8 +10333,7 @@ }, "node_modules/hardhat/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -12124,16 +10346,14 @@ }, "node_modules/hardhat/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/hardhat/node_modules/resolve": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "license": "MIT", "dependencies": { "path-parse": "^1.0.6" }, @@ -12143,16 +10363,14 @@ }, "node_modules/hardhat/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/hardhat/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12165,21 +10383,18 @@ }, "node_modules/hardhat/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/hardhat/node_modules/workerpool": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + "license": "Apache-2.0" }, "node_modules/has": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.1" }, @@ -12189,26 +10404,23 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -12218,8 +10430,7 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12229,8 +10440,7 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12240,8 +10450,7 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -12254,8 +10463,7 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -12267,8 +10475,6 @@ }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -12282,17 +10488,16 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/hash-test-vectors": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", - "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" + "license": "MIT" }, "node_modules/hash.js": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -12300,9 +10505,8 @@ }, "node_modules/hasha": { "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -12316,25 +10520,22 @@ }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/he": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.3" @@ -12342,27 +10543,23 @@ }, "node_modules/heap": { "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/highlight.js": { "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "license": "BSD-3-Clause", "engines": { "node": "*" } }, "node_modules/highlightjs-solidity": { "version": "2.0.6", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", - "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" + "license": "MIT" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -12371,24 +10568,21 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/hosted-git-info": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -12398,23 +10592,19 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/htmlparser2": { "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -12422,6 +10612,7 @@ "url": "https://github.com/sponsors/fb55" } ], + "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -12431,9 +10622,8 @@ }, "node_modules/http-basic": { "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "caseless": "^0.12.0", @@ -12447,13 +10637,11 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + "license": "BSD-2-Clause" }, "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -12467,14 +10655,12 @@ }, "node_modules/http-https": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" + "license": "ISC" }, "node_modules/http-response-object": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/node": "^10.0.3" @@ -12482,15 +10668,13 @@ }, "node_modules/http-response-object/node_modules/@types/node": { "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/http-signature": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -12503,8 +10687,7 @@ }, "node_modules/http2-wrapper": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -12515,8 +10698,7 @@ }, "node_modules/http2-wrapper/node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -12526,8 +10708,7 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", "dependencies": { "agent-base": "6", "debug": "4" @@ -12538,18 +10719,16 @@ }, "node_modules/human-signals": { "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -12559,8 +10738,7 @@ }, "node_modules/idna-uts46-hx": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", + "license": "MIT", "dependencies": { "punycode": "2.1.0" }, @@ -12570,16 +10748,13 @@ }, "node_modules/idna-uts46-hx/node_modules/punycode": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/ieee754": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -12593,21 +10768,20 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immer": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", - "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -12615,14 +10789,12 @@ }, "node_modules/immutable": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", - "integrity": "sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==" + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, + "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -12636,34 +10808,30 @@ }, "node_modules/import-lazy": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -12671,21 +10839,18 @@ }, "node_modules/inherits": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "license": "ISC" }, "node_modules/ini": { "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/internal-slot": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, + "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -12697,18 +10862,16 @@ }, "node_modules/internmap": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/interpret": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 0.10" @@ -12716,32 +10879,28 @@ }, "node_modules/invert-kv": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/io-ts": { "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", + "license": "MIT", "dependencies": { "fp-ts": "^1.0.0" } }, "node_modules/ipaddr.js": { "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/is-arguments": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12755,9 +10914,8 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -12769,14 +10927,12 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "license": "MIT" }, "node_modules/is-bigint": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, + "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -12786,8 +10942,7 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -12797,9 +10952,8 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -12813,8 +10967,6 @@ }, "node_modules/is-buffer": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "funding": [ { "type": "github", @@ -12829,14 +10981,14 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/is-callable": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12846,8 +10998,7 @@ }, "node_modules/is-core-module": { "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "license": "MIT", "dependencies": { "has": "^1.0.3" }, @@ -12857,9 +11008,8 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -12872,9 +11022,8 @@ }, "node_modules/is-docker": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -12887,29 +11036,25 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-function": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" + "license": "MIT" }, "node_modules/is-generator-function": { "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -12922,8 +11067,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -12933,8 +11077,7 @@ }, "node_modules/is-hex-prefixed": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", + "license": "MIT", "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -12942,9 +11085,8 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -12960,17 +11102,15 @@ }, "node_modules/is-lower-case": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "license": "MIT", "dependencies": { "lower-case": "^1.1.0" } }, "node_modules/is-negative-zero": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -12980,17 +11120,15 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13003,27 +11141,24 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -13037,9 +11172,8 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -13049,9 +11183,8 @@ }, "node_modules/is-stream": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -13061,9 +11194,8 @@ }, "node_modules/is-string": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, + "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -13076,9 +11208,8 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -13091,8 +11222,7 @@ }, "node_modules/is-typed-array": { "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -13109,13 +11239,11 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -13125,22 +11253,19 @@ }, "node_modules/is-upper-case": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "license": "MIT", "dependencies": { "upper-case": "^1.1.0" } }, "node_modules/is-utf8": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + "license": "MIT" }, "node_modules/is-weakref": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -13150,18 +11275,16 @@ }, "node_modules/is-windows": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, + "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -13171,9 +11294,8 @@ }, "node_modules/is-wsl/node_modules/is-docker": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, + "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -13186,35 +11308,30 @@ }, "node_modules/isarray": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isstream": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "license": "MIT" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -13224,9 +11341,8 @@ }, "node_modules/istanbul-lib-instrument": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -13239,18 +11355,16 @@ }, "node_modules/istanbul-lib-instrument/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, + "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -13265,9 +11379,8 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13277,9 +11390,8 @@ }, "node_modules/istanbul-lib-report": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^3.0.0", @@ -13291,18 +11403,16 @@ }, "node_modules/istanbul-lib-report/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13312,9 +11422,8 @@ }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -13326,9 +11435,8 @@ }, "node_modules/istanbul-reports": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -13339,14 +11447,12 @@ }, "node_modules/jju": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-sdsl": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -13354,20 +11460,17 @@ }, "node_modules/js-sha3": { "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -13378,14 +11481,12 @@ }, "node_modules/jsbn": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "license": "MIT" }, "node_modules/jsesc": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -13395,47 +11496,39 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, + "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -13445,14 +11538,12 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/jsonfile": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", "dependencies": { "universalify": "^2.0.0" }, @@ -13462,9 +11553,8 @@ }, "node_modules/jsonschema": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": "*" @@ -13472,8 +11562,7 @@ }, "node_modules/jsprim": { "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "license": "MIT", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -13486,15 +11575,13 @@ }, "node_modules/just-extend": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keccak": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.3.tgz", - "integrity": "sha512-JZrLIAJWuZxKbCilMpNz5Vj7Vtb4scDG3dMXLOsbzBmQGyjwE61BbW7bJkfKKCShXiQZt3T6sBgALRtmd+nZaQ==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -13506,53 +11593,45 @@ }, "node_modules/keyv": { "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/khroma": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", "dev": true }, "node_modules/kind-of": { "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klaw": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.9" } }, "node_modules/kleur": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/layout-base": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lcid": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", + "license": "MIT", "dependencies": { "invert-kv": "^1.0.0" }, @@ -13562,8 +11641,7 @@ }, "node_modules/level": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", + "license": "MIT", "dependencies": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -13578,16 +11656,14 @@ }, "node_modules/level-supports": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", + "license": "MIT", "engines": { "node": ">=12" } }, "node_modules/level-transcoder": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", + "license": "MIT", "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -13598,9 +11674,8 @@ }, "node_modules/levn": { "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -13611,15 +11686,13 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -13632,17 +11705,15 @@ }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/locate-path": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "license": "MIT", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -13653,67 +11724,56 @@ }, "node_modules/lodash": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.assign": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.get": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.isequal": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "license": "MIT" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/log-symbols": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "license": "MIT", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -13727,8 +11787,7 @@ }, "node_modules/log-symbols/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -13741,8 +11800,7 @@ }, "node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -13756,8 +11814,7 @@ }, "node_modules/log-symbols/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -13767,21 +11824,18 @@ }, "node_modules/log-symbols/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "node_modules/log-symbols/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/log-symbols/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -13791,9 +11845,8 @@ }, "node_modules/loose-envify": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, + "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -13803,29 +11856,25 @@ }, "node_modules/loupe": { "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "license": "MIT", "dependencies": { "get-func-name": "^2.0.0" } }, "node_modules/lower-case": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + "license": "MIT" }, "node_modules/lower-case-first": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "license": "MIT", "dependencies": { "lower-case": "^1.1.2" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -13835,28 +11884,24 @@ }, "node_modules/lru_map": { "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" + "license": "MIT" }, "node_modules/lru-cache": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lunr": { "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/make-dir": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -13869,24 +11914,21 @@ }, "node_modules/make-dir/node_modules/semver": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true + "devOptional": true, + "license": "ISC" }, "node_modules/map-obj": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -13896,16 +11938,14 @@ }, "node_modules/markdown-table": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/marked": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, + "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -13915,16 +11955,14 @@ }, "node_modules/mcl-wasm": { "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", + "license": "BSD-3-Clause", "engines": { "node": ">=8.9.0" } }, "node_modules/md5.js": { "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -13933,16 +11971,14 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/memory-level": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", + "license": "MIT", "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -13954,17 +11990,14 @@ }, "node_modules/memorystream": { "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "engines": { "node": ">= 0.10.0" } }, "node_modules/meow": { "version": "11.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", - "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^8.0.2", @@ -13988,9 +12021,8 @@ }, "node_modules/meow/node_modules/decamelize": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -14000,9 +12032,8 @@ }, "node_modules/meow/node_modules/find-up": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -14016,9 +12047,8 @@ }, "node_modules/meow/node_modules/hosted-git-info": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14028,9 +12058,8 @@ }, "node_modules/meow/node_modules/locate-path": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -14043,9 +12072,8 @@ }, "node_modules/meow/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -14055,9 +12083,8 @@ }, "node_modules/meow/node_modules/p-limit": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -14070,9 +12097,8 @@ }, "node_modules/meow/node_modules/p-locate": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -14085,9 +12111,8 @@ }, "node_modules/meow/node_modules/parse-json": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -14103,18 +12128,16 @@ }, "node_modules/meow/node_modules/path-exists": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/meow/node_modules/read-pkg": { "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -14130,9 +12153,8 @@ }, "node_modules/meow/node_modules/read-pkg-up": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", @@ -14147,9 +12169,8 @@ }, "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -14159,9 +12180,8 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -14174,9 +12194,8 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -14186,9 +12205,8 @@ }, "node_modules/meow/node_modules/type-fest": { "version": "3.11.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.11.1.tgz", - "integrity": "sha512-aCuRNRERRVh33lgQaJRlUxZqzfhzwTrsE98Mc3o3VXqmiaQdHacgUtJ0esp+7MvZ92qhtzKPeusaX6vIEcoreA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, @@ -14198,24 +12216,21 @@ }, "node_modules/meow/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/meow/node_modules/yargs-parser": { "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/meow/node_modules/yocto-queue": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.20" }, @@ -14225,29 +12240,25 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "license": "MIT" }, "node_modules/merge-stream": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/merge2": { "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/mermaid": { "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", - "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", "dev": true, + "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^6.0.0", "@khanacademy/simple-markdown": "^0.8.6", @@ -14270,9 +12281,8 @@ }, "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", - "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", "dev": true, + "license": "MIT", "dependencies": { "@types/react": ">=16.0.0" }, @@ -14283,9 +12293,8 @@ }, "node_modules/mermaid/node_modules/react": { "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14298,9 +12307,8 @@ }, "node_modules/mermaid/node_modules/react-dom": { "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14314,9 +12322,8 @@ }, "node_modules/mermaid/node_modules/scheduler": { "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -14325,26 +12332,23 @@ }, "node_modules/mermaid/node_modules/uuid": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/methods": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/micromatch": { "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, + "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -14355,8 +12359,7 @@ }, "node_modules/mime": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -14366,16 +12369,14 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -14385,9 +12386,8 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -14397,43 +12397,36 @@ }, "node_modules/mimic-response": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/min-document": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { "dom-walk": "^0.1.0" } }, "node_modules/min-indent": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + "license": "ISC" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" + "license": "MIT" }, "node_modules/minimatch": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14443,17 +12436,15 @@ }, "node_modules/minimist": { "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -14465,8 +12456,7 @@ }, "node_modules/minipass": { "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "license": "ISC", "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -14474,16 +12464,14 @@ }, "node_modules/minizlib": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "license": "MIT", "dependencies": { "minipass": "^2.9.0" } }, "node_modules/mkdirp": { "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "license": "MIT", "dependencies": { "minimist": "^1.2.6" }, @@ -14493,9 +12481,7 @@ }, "node_modules/mkdirp-promise": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", + "license": "ISC", "dependencies": { "mkdirp": "*" }, @@ -14505,17 +12491,15 @@ }, "node_modules/mnemonist": { "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", + "license": "MIT", "dependencies": { "obliterator": "^2.0.0" } }, "node_modules/mocha": { "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, + "license": "MIT", "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -14556,24 +12540,21 @@ }, "node_modules/mocha/node_modules/ansi-colors": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -14588,15 +12569,13 @@ }, "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mocha/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -14606,9 +12585,8 @@ }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -14622,18 +12600,16 @@ }, "node_modules/mocha/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -14643,9 +12619,8 @@ }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -14658,9 +12633,8 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -14670,15 +12644,13 @@ }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -14691,9 +12663,8 @@ }, "node_modules/mocha/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -14706,18 +12677,16 @@ }, "node_modules/mocha/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -14730,27 +12699,22 @@ }, "node_modules/mock-fs": { "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" + "license": "MIT" }, "node_modules/module-error": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", + "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "license": "MIT" }, "node_modules/multibase": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -14758,8 +12722,6 @@ }, "node_modules/multibase/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -14774,6 +12736,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -14781,17 +12744,14 @@ }, "node_modules/multicodec": { "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "varint": "^5.0.0" } }, "node_modules/multihashes": { "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", + "license": "MIT", "dependencies": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -14800,8 +12760,6 @@ }, "node_modules/multihashes/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -14816,6 +12774,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -14823,9 +12782,7 @@ }, "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", + "license": "MIT", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -14833,19 +12790,16 @@ }, "node_modules/nano-base32": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", - "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" + "license": "MIT" }, "node_modules/nano-json-stream-parser": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14855,25 +12809,21 @@ }, "node_modules/napi-macros": { "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" + "license": "MIT" }, "node_modules/natural-compare": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/ndjson": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", + "license": "BSD-3-Clause", "dependencies": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.5", @@ -14890,29 +12840,25 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/next-tick": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "license": "ISC" }, "node_modules/nise": { "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", @@ -14923,49 +12869,43 @@ }, "node_modules/nise/node_modules/@sinonjs/commons": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/no-case": { "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "license": "MIT", "dependencies": { "lower-case": "^1.1.1" } }, "node_modules/node-addon-api": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" + "license": "MIT" }, "node_modules/node-emoji": { "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.21" @@ -14973,9 +12913,8 @@ }, "node_modules/node-environment-flags": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", "dev": true, + "license": "Apache-2.0", "peer": true, "dependencies": { "object.getownpropertydescriptors": "^2.0.3", @@ -14984,9 +12923,8 @@ }, "node_modules/node-environment-flags/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "license": "ISC", "peer": true, "bin": { "semver": "bin/semver" @@ -14994,8 +12932,7 @@ }, "node_modules/node-fetch": { "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "license": "MIT", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -15013,8 +12950,7 @@ }, "node_modules/node-gyp-build": { "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -15023,9 +12959,8 @@ }, "node_modules/node-preload": { "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, + "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -15035,29 +12970,25 @@ }, "node_modules/node-releases": { "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nofilter": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "license": "MIT", "engines": { "node": ">=12.19" } }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/nopt": { "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "abbrev": "1" @@ -15068,9 +12999,8 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -15083,16 +13013,14 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -15102,9 +13030,8 @@ }, "node_modules/npm-run-path": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -15117,9 +13044,8 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -15129,8 +13055,7 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", "dependencies": { "boolbase": "^1.0.0" }, @@ -15140,16 +13065,14 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/number-to-bn": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", + "license": "MIT", "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -15161,14 +13084,12 @@ }, "node_modules/number-to-bn/node_modules/bn.js": { "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" + "license": "MIT" }, "node_modules/nyc": { "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -15207,9 +13128,8 @@ }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, + "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -15218,9 +13138,8 @@ }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -15231,9 +13150,8 @@ }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -15243,9 +13161,8 @@ }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -15258,9 +13175,8 @@ }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -15270,9 +13186,8 @@ }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -15282,42 +13197,37 @@ }, "node_modules/nyc/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/nyc/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, + "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -15337,9 +13247,8 @@ }, "node_modules/nyc/node_modules/yargs-parser": { "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, + "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -15350,42 +13259,37 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "license": "Apache-2.0", "engines": { "node": "*" } }, "node_modules/object-assign": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -15401,9 +13305,8 @@ }, "node_modules/object.getownpropertydescriptors": { "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array.prototype.reduce": "^1.0.5", @@ -15421,9 +13324,8 @@ }, "node_modules/object.values": { "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -15438,21 +13340,18 @@ }, "node_modules/obliterator": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + "license": "MIT" }, "node_modules/oboe": { "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", + "license": "BSD", "dependencies": { "http-https": "^1.0.0" } }, "node_modules/on-finished": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -15462,17 +13361,15 @@ }, "node_modules/once": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -15485,9 +13382,8 @@ }, "node_modules/open": { "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, + "license": "MIT", "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -15503,9 +13399,8 @@ }, "node_modules/open-cli": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", - "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", "dev": true, + "license": "MIT", "dependencies": { "file-type": "^18.2.1", "get-stdin": "^9.0.0", @@ -15525,9 +13420,8 @@ }, "node_modules/optionator": { "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, + "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -15542,15 +13436,13 @@ }, "node_modules/ordinal": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/os-locale": { "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", + "license": "MIT", "dependencies": { "lcid": "^1.0.0" }, @@ -15560,24 +13452,21 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/p-cancelable": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "license": "MIT", "dependencies": { "p-try": "^1.0.0" }, @@ -15587,8 +13476,7 @@ }, "node_modules/p-locate": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "license": "MIT", "dependencies": { "p-limit": "^1.1.0" }, @@ -15598,8 +13486,7 @@ }, "node_modules/p-map": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -15612,17 +13499,15 @@ }, "node_modules/p-try": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/package-hash": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, + "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -15635,22 +13520,19 @@ }, "node_modules/pako": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "license": "(MIT AND Zlib)" }, "node_modules/param-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/parent-module": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, + "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -15660,21 +13542,17 @@ }, "node_modules/parse-cache-control": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", "dev": true, "peer": true }, "node_modules/parse-headers": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" + "license": "MIT" }, "node_modules/parse-json": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, + "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -15685,8 +13563,7 @@ }, "node_modules/parse5": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", "dependencies": { "entities": "^4.4.0" }, @@ -15696,8 +13573,7 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "license": "MIT", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -15708,16 +13584,14 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "license": "MIT", "dependencies": { "camel-case": "^3.0.0", "upper-case-first": "^1.1.0" @@ -15725,72 +13599,63 @@ }, "node_modules/path-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "license": "MIT" }, "node_modules/path-to-regexp": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, + "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, "node_modules/path-type": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "license": "MIT", "engines": { "node": "*" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "license": "MIT", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -15804,9 +13669,8 @@ }, "node_modules/peek-readable": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.16" }, @@ -15817,19 +13681,16 @@ }, "node_modules/performance-now": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "license": "MIT" }, "node_modules/picocolors": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -15839,25 +13700,22 @@ }, "node_modules/pify": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pinkie": { "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -15867,9 +13725,8 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -15879,9 +13736,8 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -15892,9 +13748,8 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -15904,9 +13759,8 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -15919,9 +13773,8 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -15931,27 +13784,24 @@ }, "node_modules/pkg-dir/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pkg-up": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -15961,8 +13811,6 @@ }, "node_modules/postcss": { "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -15978,6 +13826,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -15989,14 +13838,11 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "funding": [ { @@ -16004,6 +13850,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -16013,18 +13860,16 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -16034,9 +13879,8 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, + "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -16046,9 +13890,8 @@ }, "node_modules/prettier-plugin-solidity": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", "dev": true, + "license": "MIT", "dependencies": { "@solidity-parser/parser": "^0.16.0", "semver": "^7.3.8", @@ -16063,33 +13906,29 @@ }, "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.0.tgz", - "integrity": "sha512-ESipEcHyRHg4Np4SqBCfcXwyxxna1DgFVz69bgpLV8vzl/NP1DtcKsJ4dJZXWQhY/Z4J2LeKBiOkOVZn9ct33Q==", "dev": true, + "license": "MIT", "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, "node_modules/process": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "license": "MIT", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/process-on-spawn": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, + "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -16099,18 +13938,16 @@ }, "node_modules/progress": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "asap": "~2.0.6" @@ -16118,8 +13955,7 @@ }, "node_modules/prompts": { "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -16130,9 +13966,8 @@ }, "node_modules/prop-types": { "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.4.0", @@ -16142,15 +13977,13 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/proxy-addr": { "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -16161,13 +13994,11 @@ }, "node_modules/psl": { "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "license": "MIT" }, "node_modules/pump": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -16175,16 +14006,13 @@ }, "node_modules/punycode": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", "funding": [ { "type": "individual", @@ -16194,19 +14022,18 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ] + ], + "license": "MIT" }, "node_modules/purecss": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", - "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/qs": { "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "side-channel": "^1.0.4" @@ -16220,8 +14047,7 @@ }, "node_modules/query-string": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "license": "MIT", "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -16233,8 +14059,6 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -16248,13 +14072,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/quick-lru": { "version": "6.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.1.tgz", - "integrity": "sha512-S27GBT+F0NTRiehtbrgaSE1idUAJ5bX8dPAQTdylEyNlrdcH5X4Lz7Edz3DYzecbsCluD5zO8ZNEe04z3D3u6Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -16264,30 +14088,26 @@ }, "node_modules/ramda": { "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -16300,8 +14120,7 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16311,9 +14130,8 @@ }, "node_modules/react": { "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", - "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.1.0", @@ -16325,9 +14143,8 @@ }, "node_modules/react-dom": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -16338,34 +14155,30 @@ }, "node_modules/react-dom/node_modules/scheduler": { "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/react-is": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/react-refresh": { "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.0.tgz", - "integrity": "sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==", "dev": true, + "license": "MIT", "dependencies": { "@remix-run/router": "1.6.0" }, @@ -16378,9 +14191,8 @@ }, "node_modules/react-router-dom": { "version": "6.11.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.0.tgz", - "integrity": "sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==", "dev": true, + "license": "MIT", "dependencies": { "@remix-run/router": "1.6.0", "react-router": "6.11.0" @@ -16395,9 +14207,8 @@ }, "node_modules/react-tooltip": { "version": "5.21.4", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.4.tgz", - "integrity": "sha512-LZsllEbiu63zNwuCalq3gIFcBu2Xf0I0fMg7uuF7/5ROo5//uHe8Sum7v9L1Rtp6IozcoU9YAjkNUZdrxutsNg==", "dev": true, + "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" @@ -16409,9 +14220,8 @@ }, "node_modules/read-pkg": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, + "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -16423,9 +14233,8 @@ }, "node_modules/read-pkg-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" @@ -16436,15 +14245,13 @@ }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -16454,9 +14261,8 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, + "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -16466,17 +14272,15 @@ }, "node_modules/read-pkg/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/readable-stream": { "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -16488,9 +14292,8 @@ }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, + "license": "MIT", "dependencies": { "readable-stream": "^3.6.0" }, @@ -16504,8 +14307,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -16515,8 +14317,6 @@ }, "node_modules/rechoir": { "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "peer": true, "dependencies": { @@ -16528,9 +14328,8 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimatch": "^3.0.5" @@ -16541,9 +14340,8 @@ }, "node_modules/redent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -16557,9 +14355,8 @@ }, "node_modules/redent/node_modules/indent-string": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -16569,9 +14366,8 @@ }, "node_modules/reduce-flatten": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -16579,14 +14375,12 @@ }, "node_modules/regenerator-runtime": { "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "license": "MIT" }, "node_modules/regexp.prototype.flags": { "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", @@ -16601,9 +14395,8 @@ }, "node_modules/regexpp": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -16613,9 +14406,8 @@ }, "node_modules/release-zalgo": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, + "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -16625,9 +14417,8 @@ }, "node_modules/req-cwd": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "req-from": "^2.0.0" @@ -16638,9 +14429,8 @@ }, "node_modules/req-from": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "resolve-from": "^3.0.0" @@ -16651,9 +14441,8 @@ }, "node_modules/req-from/node_modules/resolve-from": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -16661,9 +14450,7 @@ }, "node_modules/request": { "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "license": "Apache-2.0", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -16692,9 +14479,8 @@ }, "node_modules/request-promise-core": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "lodash": "^4.17.19" @@ -16708,10 +14494,8 @@ }, "node_modules/request-promise-native": { "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "request-promise-core": "1.1.4", @@ -16727,47 +14511,40 @@ }, "node_modules/request/node_modules/qs": { "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.6" } }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "license": "MIT", "bin": { "uuid": "bin/uuid" } }, "node_modules/require-directory": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/resolve": { "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "license": "MIT", "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -16782,31 +14559,27 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + "license": "MIT" }, "node_modules/resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "license": "MIT", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -16816,17 +14589,15 @@ }, "node_modules/responselike/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/reusify": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, + "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -16834,9 +14605,8 @@ }, "node_modules/rimraf": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -16849,8 +14619,7 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "license": "MIT", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -16858,16 +14627,13 @@ }, "node_modules/ripemd160-min": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", - "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", "engines": { "node": ">=8" } }, "node_modules/rlp": { "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", + "license": "MPL-2.0", "dependencies": { "bn.js": "^5.2.0" }, @@ -16877,15 +14643,13 @@ }, "node_modules/robust-predicates": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "dev": true + "dev": true, + "license": "Unlicense" }, "node_modules/rollup": { "version": "3.24.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.24.0.tgz", - "integrity": "sha512-OgraHOIg2YpHQTjl0/ymWfFNBEyPucB7lmhXrQUh38qNOegxLapSPFs9sNr0qKR75awW41D93XafoR2QfhBdUQ==", "dev": true, + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -16899,9 +14663,8 @@ }, "node_modules/run-applescript": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, + "license": "MIT", "dependencies": { "execa": "^5.0.0" }, @@ -16914,9 +14677,8 @@ }, "node_modules/run-applescript/node_modules/execa": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, + "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -16937,27 +14699,24 @@ }, "node_modules/run-applescript/node_modules/human-signals": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, + "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/run-applescript/node_modules/mimic-fn": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-applescript/node_modules/npm-run-path": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -16967,9 +14726,8 @@ }, "node_modules/run-applescript/node_modules/onetime": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, + "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -16982,17 +14740,14 @@ }, "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-parallel": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -17008,14 +14763,13 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/run-parallel-limit": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "funding": [ { "type": "github", @@ -17030,26 +14784,24 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rustbn.js": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + "license": "(MIT OR Apache-2.0)" }, "node_modules/rw": { "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/safe-array-concat": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "call-bind": "^1.0.2", @@ -17066,21 +14818,18 @@ }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -17092,14 +14841,12 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "license": "MIT" }, "node_modules/sc-istanbul": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "abbrev": "1.0.x", @@ -17123,9 +14870,8 @@ }, "node_modules/sc-istanbul/node_modules/esprima": { "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, + "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -17137,9 +14883,8 @@ }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "inflight": "^1.0.4", @@ -17154,9 +14899,8 @@ }, "node_modules/sc-istanbul/node_modules/has-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -17164,16 +14908,14 @@ }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^1.0.0" @@ -17184,9 +14926,8 @@ }, "node_modules/sc-istanbul/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -17197,14 +14938,12 @@ }, "node_modules/scrypt-js": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + "license": "MIT" }, "node_modules/secp256k1": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -17216,9 +14955,8 @@ }, "node_modules/semver": { "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -17231,9 +14969,8 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, + "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -17243,14 +14980,12 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/send": { "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -17272,26 +15007,22 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "license": "MIT" }, "node_modules/sentence-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -17324,16 +15055,14 @@ }, "node_modules/serialize-javascript": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -17346,8 +15075,7 @@ }, "node_modules/servify": { "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", + "license": "MIT", "dependencies": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -17361,23 +15089,19 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "license": "ISC" }, "node_modules/setimmediate": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "license": "MIT" }, "node_modules/setprototypeof": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "license": "ISC" }, "node_modules/sha.js": { "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "license": "(MIT AND BSD-3-Clause)", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -17388,9 +15112,8 @@ }, "node_modules/sha1": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "charenc": ">= 0.0.1", @@ -17402,23 +15125,20 @@ }, "node_modules/sha3": { "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", + "license": "MIT", "dependencies": { "buffer": "6.0.3" } }, "node_modules/shallowequal": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/shebang-command": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -17428,18 +15148,16 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shelljs": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "glob": "^7.0.0", @@ -17455,9 +15173,8 @@ }, "node_modules/shiki": { "version": "0.14.2", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.2.tgz", - "integrity": "sha512-ltSZlSLOuSY0M0Y75KA+ieRaZ0Trf5Wl3gutE7jzLuIcWxLp5i/uEnLoQWNvgKXQ5OMpGkJnVMRLAuzjc0LJ2A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", @@ -17467,8 +15184,7 @@ }, "node_modules/side-channel": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -17480,14 +15196,11 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/simple-concat": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -17501,12 +15214,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/simple-get": { "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", + "license": "MIT", "dependencies": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -17515,8 +15228,7 @@ }, "node_modules/simple-get/node_modules/decompress-response": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", + "license": "MIT", "dependencies": { "mimic-response": "^1.0.0" }, @@ -17526,30 +15238,26 @@ }, "node_modules/sisteransi": { "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + "license": "MIT" }, "node_modules/slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/snake-case": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/solc": { "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", + "license": "MIT", "dependencies": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -17570,13 +15278,11 @@ }, "node_modules/solc/node_modules/commander": { "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + "license": "MIT" }, "node_modules/solc/node_modules/fs-extra": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -17587,16 +15293,14 @@ }, "node_modules/solc/node_modules/jsonfile": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/solc/node_modules/rimraf": { "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -17606,16 +15310,14 @@ }, "node_modules/solc/node_modules/semver": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/solc/node_modules/tmp": { "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" }, @@ -17625,15 +15327,13 @@ }, "node_modules/solidity-comments-extractor": { "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/solidity-coverage": { "version": "0.8.2", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.2.tgz", - "integrity": "sha512-cv2bWb7lOXPE9/SSleDO6czkFiMHgP4NXPj+iW9W7iEKLBk7Cj0AGBiNmGX3V1totl9wjPrT0gHmABZKZt65rQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", @@ -17666,9 +15366,8 @@ }, "node_modules/solidity-coverage/node_modules/ansi-colors": { "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -17676,9 +15375,8 @@ }, "node_modules/solidity-coverage/node_modules/ansi-regex": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -17686,9 +15384,8 @@ }, "node_modules/solidity-coverage/node_modules/chokidar": { "version": "3.3.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", - "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "anymatch": "~3.1.1", @@ -17708,9 +15405,8 @@ }, "node_modules/solidity-coverage/node_modules/cliui": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "string-width": "^3.1.0", @@ -17720,10 +15416,8 @@ }, "node_modules/solidity-coverage/node_modules/debug": { "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ms": "^2.1.1" @@ -17731,9 +15425,8 @@ }, "node_modules/solidity-coverage/node_modules/diff": { "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "engines": { "node": ">=0.3.1" @@ -17741,16 +15434,14 @@ }, "node_modules/solidity-coverage/node_modules/emoji-regex": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/solidity-coverage/node_modules/find-up": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "locate-path": "^3.0.0" @@ -17761,9 +15452,8 @@ }, "node_modules/solidity-coverage/node_modules/flat": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.1.tgz", - "integrity": "sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==", "dev": true, + "license": "BSD-3-Clause", "peer": true, "dependencies": { "is-buffer": "~2.0.3" @@ -17774,9 +15464,8 @@ }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -17789,11 +15478,8 @@ }, "node_modules/solidity-coverage/node_modules/fsevents": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "deprecated": "\"Please update to latest v2.3 or v2.2\"", "dev": true, - "hasInstallScript": true, + "license": "MIT", "optional": true, "os": [ "darwin" @@ -17805,9 +15491,8 @@ }, "node_modules/solidity-coverage/node_modules/glob": { "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -17823,9 +15508,8 @@ }, "node_modules/solidity-coverage/node_modules/globby": { "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/glob": "^7.1.1", @@ -17843,9 +15527,8 @@ }, "node_modules/solidity-coverage/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 4" @@ -17853,9 +15536,8 @@ }, "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -17863,9 +15545,8 @@ }, "node_modules/solidity-coverage/node_modules/js-yaml": { "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "argparse": "^1.0.7", @@ -17877,9 +15558,8 @@ }, "node_modules/solidity-coverage/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -17887,9 +15567,8 @@ }, "node_modules/solidity-coverage/node_modules/locate-path": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-locate": "^3.0.0", @@ -17901,9 +15580,8 @@ }, "node_modules/solidity-coverage/node_modules/log-symbols": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "chalk": "^2.4.2" @@ -17914,9 +15592,8 @@ }, "node_modules/solidity-coverage/node_modules/minimatch": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -17927,9 +15604,8 @@ }, "node_modules/solidity-coverage/node_modules/mkdirp": { "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5" @@ -17940,9 +15616,8 @@ }, "node_modules/solidity-coverage/node_modules/mocha": { "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-colors": "3.2.3", @@ -17984,16 +15659,14 @@ }, "node_modules/solidity-coverage/node_modules/ms": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/solidity-coverage/node_modules/object.assign": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "define-properties": "^1.1.2", @@ -18007,9 +15680,8 @@ }, "node_modules/solidity-coverage/node_modules/p-limit": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-try": "^2.0.0" @@ -18023,9 +15695,8 @@ }, "node_modules/solidity-coverage/node_modules/p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "p-limit": "^2.0.0" @@ -18036,9 +15707,8 @@ }, "node_modules/solidity-coverage/node_modules/p-try": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -18046,9 +15716,8 @@ }, "node_modules/solidity-coverage/node_modules/pify": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -18056,9 +15725,8 @@ }, "node_modules/solidity-coverage/node_modules/readdirp": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", - "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "picomatch": "^2.0.4" @@ -18069,9 +15737,8 @@ }, "node_modules/solidity-coverage/node_modules/string-width": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "emoji-regex": "^7.0.1", @@ -18084,9 +15751,8 @@ }, "node_modules/solidity-coverage/node_modules/strip-ansi": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^4.1.0" @@ -18097,9 +15763,8 @@ }, "node_modules/solidity-coverage/node_modules/strip-json-comments": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -18107,9 +15772,8 @@ }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -18120,9 +15784,8 @@ }, "node_modules/solidity-coverage/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -18130,9 +15793,8 @@ }, "node_modules/solidity-coverage/node_modules/which": { "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -18143,9 +15805,8 @@ }, "node_modules/solidity-coverage/node_modules/wrap-ansi": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^3.2.0", @@ -18158,16 +15819,14 @@ }, "node_modules/solidity-coverage/node_modules/y18n": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", "dev": true, + "license": "ISC", "peer": true }, "node_modules/solidity-coverage/node_modules/yargs": { "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "cliui": "^5.0.0", @@ -18184,9 +15843,8 @@ }, "node_modules/solidity-coverage/node_modules/yargs-parser": { "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "camelcase": "^5.0.0", @@ -18195,9 +15853,8 @@ }, "node_modules/solidity-coverage/node_modules/yargs-unparser": { "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "flat": "^4.1.0", @@ -18210,25 +15867,22 @@ }, "node_modules/source-map": { "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -18236,9 +15890,8 @@ }, "node_modules/spawn-wrap": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -18253,8 +15906,7 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -18262,13 +15914,11 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -18276,27 +15926,23 @@ }, "node_modules/spdx-license-ids": { "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "license": "CC0-1.0" }, "node_modules/split2": { "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "license": "ISC", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/sshpk": { "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "license": "MIT", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -18319,13 +15965,11 @@ }, "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "license": "Unlicense" }, "node_modules/stacktrace-parser": { "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "license": "MIT", "dependencies": { "type-fest": "^0.7.1" }, @@ -18335,25 +15979,22 @@ }, "node_modules/stacktrace-parser/node_modules/type-fest": { "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/stealthy-require": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==", "dev": true, + "license": "ISC", "peer": true, "engines": { "node": ">=0.10.0" @@ -18361,32 +16002,26 @@ }, "node_modules/streamsearch": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", "engines": { "node": ">=10.0.0" } }, "node_modules/strict-uri-encode": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -18400,28 +16035,26 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/string-argv": { "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-format": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true, + "license": "WTFPL OR MIT", "peer": true }, "node_modules/string-width": { "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -18433,9 +16066,8 @@ }, "node_modules/string.prototype.trim": { "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -18450,9 +16082,8 @@ }, "node_modules/string.prototype.trimend": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -18464,9 +16095,8 @@ }, "node_modules/string.prototype.trimstart": { "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -18478,8 +16108,7 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -18489,18 +16118,16 @@ }, "node_modules/strip-bom": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -18510,8 +16137,7 @@ }, "node_modules/strip-hex-prefix": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", + "license": "MIT", "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -18522,9 +16148,8 @@ }, "node_modules/strip-indent": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -18537,8 +16162,7 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -18548,9 +16172,8 @@ }, "node_modules/strtok3": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", "dev": true, + "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0" @@ -18565,9 +16188,8 @@ }, "node_modules/styled-components": { "version": "5.3.10", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", - "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -18595,14 +16217,12 @@ }, "node_modules/stylis": { "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/supports-color": { "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", "dependencies": { "has-flag": "^3.0.0" }, @@ -18612,8 +16232,7 @@ }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -18623,8 +16242,7 @@ }, "node_modules/swap-case": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "license": "MIT", "dependencies": { "lower-case": "^1.1.1", "upper-case": "^1.1.1" @@ -18632,8 +16250,7 @@ }, "node_modules/swarm-js": { "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", + "license": "MIT", "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -18650,8 +16267,7 @@ }, "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "license": "MIT", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -18661,8 +16277,6 @@ }, "node_modules/swarm-js/node_modules/buffer": { "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -18677,6 +16291,7 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -18684,16 +16299,14 @@ }, "node_modules/swarm-js/node_modules/cacheable-lookup": { "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "license": "MIT", "engines": { "node": ">=10.6.0" } }, "node_modules/swarm-js/node_modules/fs-extra": { "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -18702,8 +16315,7 @@ }, "node_modules/swarm-js/node_modules/got": { "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "license": "MIT", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -18726,8 +16338,7 @@ }, "node_modules/swarm-js/node_modules/http2-wrapper": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "license": "MIT", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -18738,32 +16349,28 @@ }, "node_modules/swarm-js/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/p-cancelable": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/quick-lru": { "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -18773,17 +16380,15 @@ }, "node_modules/swarm-js/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", "engines": { "node": ">= 4.0.0" } }, "node_modules/sync-request": { "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "http-response-object": "^3.0.1", @@ -18796,9 +16401,8 @@ }, "node_modules/sync-rpc": { "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "get-port": "^3.1.0" @@ -18806,9 +16410,8 @@ }, "node_modules/synckit": { "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, + "license": "MIT", "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -18822,15 +16425,13 @@ }, "node_modules/synckit/node_modules/tslib": { "version": "2.5.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", - "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", - "dev": true + "dev": true, + "license": "0BSD" }, "node_modules/table": { "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -18844,9 +16445,8 @@ }, "node_modules/table-layout": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.1", @@ -18860,9 +16460,8 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -18870,9 +16469,8 @@ }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -18880,9 +16478,8 @@ }, "node_modules/table/node_modules/ajv": { "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -18896,9 +16493,8 @@ }, "node_modules/table/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -18911,9 +16507,8 @@ }, "node_modules/table/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -18923,21 +16518,18 @@ }, "node_modules/table/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/slice-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -18952,17 +16544,15 @@ }, "node_modules/tapable": { "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "license": "ISC", "dependencies": { "chownr": "^1.1.4", "fs-minipass": "^1.2.7", @@ -18978,8 +16568,6 @@ }, "node_modules/tar/node_modules/safe-buffer": { "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -18993,22 +16581,21 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "MIT" }, "node_modules/temp-dir": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/tempy": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.0.0.tgz", - "integrity": "sha512-B2I9X7+o2wOaW4r/CWMkpOO9mdiTRCxXNgob6iGvPmfPWgH/KyUD6Uy5crtWBxIBe3YrNZKR2lSzv1JJKWD4vA==", "dev": true, + "license": "MIT", "dependencies": { "is-stream": "^3.0.0", "temp-dir": "^2.0.0", @@ -19024,9 +16611,8 @@ }, "node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, + "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -19036,9 +16622,8 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -19048,9 +16633,8 @@ }, "node_modules/test-exclude": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, + "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -19061,22 +16645,17 @@ } }, "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." + "version": "0.0.1" }, "node_modules/text-table": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/then-request": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", @@ -19097,31 +16676,27 @@ }, "node_modules/then-request/node_modules/@types/node": { "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/through2": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "license": "MIT", "dependencies": { "readable-stream": "3" } }, "node_modules/timed-out": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/title-case": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "license": "MIT", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.0.3" @@ -19129,9 +16704,8 @@ }, "node_modules/titleize": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -19141,17 +16715,15 @@ }, "node_modules/to-fast-properties": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -19161,17 +16733,15 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/token-types": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", "dev": true, + "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -19186,8 +16756,7 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -19198,14 +16767,12 @@ }, "node_modules/tr46": { "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "license": "MIT" }, "node_modules/trim-newlines": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" }, @@ -19215,9 +16782,8 @@ }, "node_modules/ts-command-line-args": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "chalk": "^4.1.0", @@ -19231,9 +16797,8 @@ }, "node_modules/ts-command-line-args/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-convert": "^2.0.1" @@ -19247,9 +16812,8 @@ }, "node_modules/ts-command-line-args/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-styles": "^4.1.0", @@ -19264,9 +16828,8 @@ }, "node_modules/ts-command-line-args/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "color-name": "~1.1.4" @@ -19277,16 +16840,14 @@ }, "node_modules/ts-command-line-args/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/ts-command-line-args/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -19294,9 +16855,8 @@ }, "node_modules/ts-command-line-args/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "has-flag": "^4.0.0" @@ -19307,18 +16867,16 @@ }, "node_modules/ts-dedent": { "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.10" } }, "node_modules/ts-essentials": { "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, + "license": "MIT", "peer": true, "peerDependencies": { "typescript": ">=3.7.0" @@ -19326,9 +16884,8 @@ }, "node_modules/ts-node": { "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, + "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -19369,9 +16926,8 @@ }, "node_modules/ts-node/node_modules/acorn": { "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "devOptional": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -19381,18 +16937,16 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "devOptional": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -19402,9 +16956,8 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, + "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -19414,28 +16967,24 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "license": "0BSD" }, "node_modules/tsort": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" + "license": "MIT" }, "node_modules/tsutils": { "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, + "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -19448,8 +16997,7 @@ }, "node_modules/tunnel-agent": { "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -19459,24 +17007,20 @@ }, "node_modules/tweetnacl": { "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + "license": "Unlicense" }, "node_modules/tweetnacl-util": { "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" + "license": "Unlicense" }, "node_modules/type": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "license": "ISC" }, "node_modules/type-check": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, + "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -19486,16 +17030,14 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19505,8 +17047,7 @@ }, "node_modules/type-is": { "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -19517,9 +17058,8 @@ }, "node_modules/typechain": { "version": "8.3.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", - "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -19542,9 +17082,8 @@ }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -19557,9 +17096,8 @@ }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -19578,9 +17116,8 @@ }, "node_modules/typechain/node_modules/jsonfile": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, + "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -19588,9 +17125,8 @@ }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, + "license": "MIT", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -19601,9 +17137,8 @@ }, "node_modules/typechain/node_modules/universalify": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" @@ -19611,9 +17146,8 @@ }, "node_modules/typed-array-length": { "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -19625,24 +17159,21 @@ }, "node_modules/typedarray": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typedoc": { "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", "dev": true, + "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "marked": "^4.2.12", @@ -19661,18 +17192,16 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -19685,9 +17214,8 @@ }, "node_modules/typescript": { "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19698,9 +17226,8 @@ }, "node_modules/typical": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -19708,9 +17235,8 @@ }, "node_modules/uglify-js": { "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, + "license": "BSD-2-Clause", "optional": true, "peer": true, "bin": { @@ -19722,14 +17248,12 @@ }, "node_modules/ultron": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + "license": "MIT" }, "node_modules/unbox-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -19742,13 +17266,11 @@ }, "node_modules/underscore": { "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + "license": "MIT" }, "node_modules/undici": { "version": "5.22.1", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.22.1.tgz", - "integrity": "sha512-Ji2IJhFXZY0x/0tVBXeQwgPlLWw13GVzpsWPQ3rV50IFMMof2I55PZZxtm4P6iNq+L5znYN9nSTAq0ZyE6lSJw==", + "license": "MIT", "dependencies": { "busboy": "^1.6.0" }, @@ -19758,9 +17280,8 @@ }, "node_modules/unique-string": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -19773,33 +17294,28 @@ }, "node_modules/universalify": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "license": "MIT", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "dev": true, "funding": [ { @@ -19815,6 +17331,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -19828,35 +17345,30 @@ }, "node_modules/upper-case": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + "license": "MIT" }, "node_modules/upper-case-first": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "license": "MIT", "dependencies": { "upper-case": "^1.1.1" } }, "node_modules/uri-js": { "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-set-query": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" + "license": "MIT" }, "node_modules/utf-8-validate": { "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -19866,13 +17378,11 @@ }, "node_modules/utf8": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" + "license": "MIT" }, "node_modules/util": { "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -19883,41 +17393,35 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "license": "MIT" }, "node_modules/utils-merge": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true + "devOptional": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -19925,33 +17429,29 @@ }, "node_modules/validator": { "version": "13.9.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.9.0.tgz", - "integrity": "sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/varint": { "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" + "license": "MIT" }, "node_modules/vary": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/verror": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], + "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -19960,9 +17460,8 @@ }, "node_modules/vite": { "version": "4.3.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", - "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, + "license": "MIT", "dependencies": { "esbuild": "^0.17.5", "postcss": "^8.4.23", @@ -20008,9 +17507,8 @@ }, "node_modules/vite-plugin-singlefile": { "version": "0.13.5", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz", - "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==", "dev": true, + "license": "MIT", "dependencies": { "micromatch": "^4.0.5" }, @@ -20022,44 +17520,11 @@ "vite": ">=3.2.0" } }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz", - "integrity": "sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.17.19", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.19.tgz", - "integrity": "sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/vite/node_modules/esbuild": { "version": "0.17.19", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.19.tgz", - "integrity": "sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==", "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -20093,27 +17558,23 @@ }, "node_modules/vscode-oniguruma": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/vscode-textmate": { "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/web-worker": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/web3": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", "hasInstallScript": true, + "license": "LGPL-3.0", "dependencies": { "web3-bzz": "1.10.0", "web3-core": "1.10.0", @@ -20129,9 +17590,8 @@ }, "node_modules/web3-bzz": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", "hasInstallScript": true, + "license": "LGPL-3.0", "dependencies": { "@types/node": "^12.12.6", "got": "12.1.0", @@ -20143,13 +17603,11 @@ }, "node_modules/web3-bzz/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "license": "MIT" }, "node_modules/web3-core": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", + "license": "LGPL-3.0", "dependencies": { "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", @@ -20165,8 +17623,7 @@ }, "node_modules/web3-core-helpers": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", - "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", + "license": "LGPL-3.0", "dependencies": { "web3-eth-iban": "1.10.0", "web3-utils": "1.10.0" @@ -20177,8 +17634,7 @@ }, "node_modules/web3-core-method": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", + "license": "LGPL-3.0", "dependencies": { "@ethersproject/transactions": "^5.6.2", "web3-core-helpers": "1.10.0", @@ -20192,8 +17648,7 @@ }, "node_modules/web3-core-promievent": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", - "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "license": "LGPL-3.0", "dependencies": { "eventemitter3": "4.0.4" }, @@ -20203,8 +17658,7 @@ }, "node_modules/web3-core-requestmanager": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", + "license": "LGPL-3.0", "dependencies": { "util": "^0.12.5", "web3-core-helpers": "1.10.0", @@ -20218,8 +17672,7 @@ }, "node_modules/web3-core-subscriptions": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", + "license": "LGPL-3.0", "dependencies": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.10.0" @@ -20230,13 +17683,11 @@ }, "node_modules/web3-core/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "license": "MIT" }, "node_modules/web3-eth": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", + "license": "LGPL-3.0", "dependencies": { "web3-core": "1.10.0", "web3-core-helpers": "1.10.0", @@ -20257,8 +17708,7 @@ }, "node_modules/web3-eth-abi": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", - "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", + "license": "LGPL-3.0", "dependencies": { "@ethersproject/abi": "^5.6.3", "web3-utils": "1.10.0" @@ -20269,8 +17719,7 @@ }, "node_modules/web3-eth-accounts": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", + "license": "LGPL-3.0", "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", @@ -20289,8 +17738,7 @@ }, "node_modules/web3-eth-accounts/node_modules/eth-lib": { "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", + "license": "MIT", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -20299,13 +17747,11 @@ }, "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "license": "MIT" }, "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -20326,8 +17772,7 @@ }, "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -20341,16 +17786,14 @@ }, "node_modules/web3-eth-accounts/node_modules/uuid": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/web3-eth-contract": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", + "license": "LGPL-3.0", "dependencies": { "@types/bn.js": "^5.1.1", "web3-core": "1.10.0", @@ -20367,8 +17810,7 @@ }, "node_modules/web3-eth-ens": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", + "license": "LGPL-3.0", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", @@ -20385,8 +17827,7 @@ }, "node_modules/web3-eth-iban": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", - "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "license": "LGPL-3.0", "dependencies": { "bn.js": "^5.2.1", "web3-utils": "1.10.0" @@ -20397,8 +17838,7 @@ }, "node_modules/web3-eth-personal": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", + "license": "LGPL-3.0", "dependencies": { "@types/node": "^12.12.6", "web3-core": "1.10.0", @@ -20413,13 +17853,11 @@ }, "node_modules/web3-eth-personal/node_modules/@types/node": { "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + "license": "MIT" }, "node_modules/web3-net": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", + "license": "LGPL-3.0", "dependencies": { "web3-core": "1.10.0", "web3-core-method": "1.10.0", @@ -20431,8 +17869,7 @@ }, "node_modules/web3-providers-http": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", + "license": "LGPL-3.0", "dependencies": { "abortcontroller-polyfill": "^1.7.3", "cross-fetch": "^3.1.4", @@ -20445,8 +17882,7 @@ }, "node_modules/web3-providers-ipc": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", + "license": "LGPL-3.0", "dependencies": { "oboe": "2.1.5", "web3-core-helpers": "1.10.0" @@ -20457,8 +17893,7 @@ }, "node_modules/web3-providers-ws": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", + "license": "LGPL-3.0", "dependencies": { "eventemitter3": "4.0.4", "web3-core-helpers": "1.10.0", @@ -20470,9 +17905,8 @@ }, "node_modules/web3-shh": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", "hasInstallScript": true, + "license": "LGPL-3.0", "dependencies": { "web3-core": "1.10.0", "web3-core-method": "1.10.0", @@ -20485,8 +17919,7 @@ }, "node_modules/web3-utils": { "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "license": "LGPL-3.0", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -20502,8 +17935,7 @@ }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "license": "MIT", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -20524,8 +17956,7 @@ }, "node_modules/web3-utils/node_modules/ethereumjs-util": { "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "license": "MPL-2.0", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -20539,13 +17970,11 @@ }, "node_modules/webidl-conversions": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + "license": "BSD-2-Clause" }, "node_modules/websocket": { "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "license": "Apache-2.0", "dependencies": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -20560,21 +17989,18 @@ }, "node_modules/websocket/node_modules/debug": { "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/websocket/node_modules/ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "license": "MIT" }, "node_modules/whatwg-url": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -20582,9 +18008,8 @@ }, "node_modules/which": { "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -20597,9 +18022,8 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, + "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -20613,14 +18037,12 @@ }, "node_modules/which-module": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/which-typed-array": { "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", @@ -20638,9 +18060,8 @@ }, "node_modules/wide-align": { "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, + "license": "ISC", "peer": true, "dependencies": { "string-width": "^1.0.2 || 2" @@ -20648,9 +18069,8 @@ }, "node_modules/wide-align/node_modules/ansi-regex": { "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -20658,9 +18078,8 @@ }, "node_modules/wide-align/node_modules/is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -20668,9 +18087,8 @@ }, "node_modules/wide-align/node_modules/string-width": { "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -20682,9 +18100,8 @@ }, "node_modules/wide-align/node_modules/strip-ansi": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -20695,8 +18112,7 @@ }, "node_modules/window-size": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", + "license": "MIT", "bin": { "window-size": "cli.js" }, @@ -20706,25 +18122,22 @@ }, "node_modules/word-wrap": { "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, + "license": "MIT", "peer": true }, "node_modules/wordwrapjs": { "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, + "license": "MIT", "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", @@ -20736,9 +18149,8 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, + "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -20746,15 +18158,13 @@ }, "node_modules/workerpool": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/wrap-ansi": { "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -20766,9 +18176,8 @@ }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -20781,9 +18190,8 @@ }, "node_modules/wrap-ansi/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -20793,20 +18201,17 @@ }, "node_modules/wrap-ansi/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/wrappy": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "license": "ISC" }, "node_modules/write-file-atomic": { "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -20816,8 +18221,7 @@ }, "node_modules/ws": { "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -20836,8 +18240,7 @@ }, "node_modules/xhr": { "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", + "license": "MIT", "dependencies": { "global": "~4.4.0", "is-function": "^1.0.1", @@ -20847,8 +18250,7 @@ }, "node_modules/xhr-request": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", + "license": "MIT", "dependencies": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -20861,53 +18263,46 @@ }, "node_modules/xhr-request-promise": { "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", + "license": "MIT", "dependencies": { "xhr-request": "^1.1.0" } }, "node_modules/xmlhttprequest": { "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/xtend": { "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "license": "MIT", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yaeti": { "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "license": "MIT", "engines": { "node": ">=0.10.32" } }, "node_modules/yallist": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + "license": "ISC" }, "node_modules/yargs": { "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "license": "MIT", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -20923,16 +18318,14 @@ }, "node_modules/yargs-parser": { "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "license": "MIT", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -20945,8 +18338,7 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -20956,8 +18348,7 @@ }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -20967,25 +18358,22 @@ }, "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/yn": { "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", "engines": { "node": ">=10" }, @@ -20995,9 +18383,8 @@ }, "node_modules/z-schema": { "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", "dev": true, + "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", @@ -21015,9 +18402,8 @@ }, "node_modules/z-schema/node_modules/commander": { "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, + "license": "MIT", "optional": true, "engines": { "node": "^12.20.0 || >=14" @@ -21047,7 +18433,7 @@ "@types/fs-extra": "^9.0.13", "@types/mocha": "9.1.1", "@types/ndjson": "2.0.1", - "@types/node": "12.20.25", + "@types/node": "16.11.7", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", @@ -21070,30 +18456,26 @@ }, "packages/core/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "packages/core/node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", - "dev": true + "version": "16.11.7", + "dev": true, + "license": "MIT" }, "packages/core/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "license": "MIT" }, "packages/core/node_modules/cbor": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.0.tgz", - "integrity": "sha512-87cFgOKxjUOnGpNeQMBVER4Mc/rZAk9xC+Ygfx5FLCAUt/tpVHphuZC5fJmp/KSDsEsBEDIPtEt0YbD/GFQw8Q==", + "license": "MIT", "dependencies": { "nofilter": "^3.1.0" }, @@ -21103,8 +18485,6 @@ }, "packages/core/node_modules/ethers": { "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.0.tgz", - "integrity": "sha512-pxt5hK82RNwcTX2gOZP81t6qVPVspnkpeivwEgQuK9XUvbNtghBnT8GNIb/gPh+WnVSfi8cXC9XlfT8sqc6D6w==", "funding": [ { "type": "individual", @@ -21115,6 +18495,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.9.2", "@noble/hashes": "1.1.2", @@ -21130,18 +18511,15 @@ }, "packages/core/node_modules/ethers/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "license": "MIT" }, "packages/core/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "license": "0BSD" }, "packages/core/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -21184,7 +18562,7 @@ "@types/lodash.flattendeep": "^4.4.7", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", - "@types/node": "12.20.25", + "@types/node": "16.11.7", "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "4.31.2", @@ -21217,20 +18595,18 @@ }, "packages/hardhat-plugin/node_modules/@noble/hashes": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ] + ], + "license": "MIT" }, "packages/hardhat-plugin/node_modules/@nomicfoundation/hardhat-ethers": { "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^4.1.1", "lodash.isequal": "^4.5.0" @@ -21242,36 +18618,32 @@ }, "packages/hardhat-plugin/node_modules/@sinonjs/commons": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^1.7.0" } }, "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "lodash.get": "^4.4.2", @@ -21279,20 +18651,17 @@ } }, "packages/hardhat-plugin/node_modules/@types/node": { - "version": "12.20.25", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.25.tgz", - "integrity": "sha512-hcTWqk7DR/HrN9Xe7AlJwuCaL13Vcd9/g/T54YrJz4Q3ESM5mr33YCzW2bOfzSIc3aZMeGBvbLGvgN6mIJ0I5Q==", - "dev": true + "version": "16.11.7", + "dev": true, + "license": "MIT" }, "packages/hardhat-plugin/node_modules/aes-js": { "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "license": "MIT" }, "packages/hardhat-plugin/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -21305,8 +18674,7 @@ }, "packages/hardhat-plugin/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -21320,8 +18688,7 @@ }, "packages/hardhat-plugin/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -21331,14 +18698,12 @@ }, "packages/hardhat-plugin/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "license": "MIT" }, "packages/hardhat-plugin/node_modules/dagre-d3-es": { "version": "7.0.9", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", - "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "dev": true, + "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -21346,14 +18711,11 @@ }, "packages/hardhat-plugin/node_modules/dompurify": { "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", - "dev": true + "dev": true, + "license": "(MPL-2.0 OR Apache-2.0)" }, "packages/hardhat-plugin/node_modules/ethers": { "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.0.tgz", - "integrity": "sha512-pxt5hK82RNwcTX2gOZP81t6qVPVspnkpeivwEgQuK9XUvbNtghBnT8GNIb/gPh+WnVSfi8cXC9XlfT8sqc6D6w==", "funding": [ { "type": "individual", @@ -21364,6 +18726,7 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], + "license": "MIT", "dependencies": { "@adraffy/ens-normalize": "1.9.2", "@noble/hashes": "1.1.2", @@ -21379,22 +18742,19 @@ }, "packages/hardhat-plugin/node_modules/ethers/node_modules/@types/node": { "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "license": "MIT" }, "packages/hardhat-plugin/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", "engines": { "node": ">=8" } }, "packages/hardhat-plugin/node_modules/mermaid": { "version": "9.4.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", - "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", "dev": true, + "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^6.0.0", "cytoscape": "^3.23.0", @@ -21416,9 +18776,8 @@ }, "packages/hardhat-plugin/node_modules/sinon": { "version": "14.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", - "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^9.1.2", @@ -21434,8 +18793,7 @@ }, "packages/hardhat-plugin/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -21445,22 +18803,19 @@ }, "packages/hardhat-plugin/node_modules/tslib": { "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "license": "0BSD" }, "packages/hardhat-plugin/node_modules/uuid": { "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", "dev": true, + "license": "MIT", "bin": { "uuid": "dist/bin/uuid" } }, "packages/hardhat-plugin/node_modules/ws": { "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -21512,9 +18867,8 @@ }, "packages/ui/node_modules/@eslint/eslintrc": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, + "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -21535,9 +18889,8 @@ }, "packages/ui/node_modules/@humanwhocodes/config-array": { "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -21549,9 +18902,8 @@ }, "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.59.9", @@ -21583,9 +18935,8 @@ }, "packages/ui/node_modules/@typescript-eslint/parser": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "5.59.9", "@typescript-eslint/types": "5.59.9", @@ -21610,9 +18961,8 @@ }, "packages/ui/node_modules/@typescript-eslint/scope-manager": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.9", "@typescript-eslint/visitor-keys": "5.59.9" @@ -21627,9 +18977,8 @@ }, "packages/ui/node_modules/@typescript-eslint/types": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", "dev": true, + "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -21640,9 +18989,8 @@ }, "packages/ui/node_modules/@typescript-eslint/typescript-estree": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "5.59.9", "@typescript-eslint/visitor-keys": "5.59.9", @@ -21667,9 +19015,8 @@ }, "packages/ui/node_modules/@typescript-eslint/visitor-keys": { "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", "dev": true, + "license": "MIT", "dependencies": { "@typescript-eslint/types": "5.59.9", "eslint-visitor-keys": "^3.3.0" @@ -21684,9 +19031,8 @@ }, "packages/ui/node_modules/acorn": { "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -21696,18 +19042,16 @@ }, "packages/ui/node_modules/ansi-colors": { "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "packages/ui/node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -21720,24 +19064,21 @@ }, "packages/ui/node_modules/argparse": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "dev": true, + "license": "Python-2.0" }, "packages/ui/node_modules/brace-expansion": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "packages/ui/node_modules/chalk": { "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -21751,9 +19092,8 @@ }, "packages/ui/node_modules/color-convert": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -21763,15 +19103,13 @@ }, "packages/ui/node_modules/color-name": { "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "packages/ui/node_modules/escape-string-regexp": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -21781,9 +19119,8 @@ }, "packages/ui/node_modules/eslint": { "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", @@ -21837,9 +19174,8 @@ }, "packages/ui/node_modules/eslint-scope": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -21853,9 +19189,8 @@ }, "packages/ui/node_modules/eslint-visitor-keys": { "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, + "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -21865,9 +19200,8 @@ }, "packages/ui/node_modules/espree": { "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", @@ -21882,18 +19216,16 @@ }, "packages/ui/node_modules/estraverse": { "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "packages/ui/node_modules/find-up": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -21907,9 +19239,8 @@ }, "packages/ui/node_modules/glob-parent": { "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, + "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -21919,9 +19250,8 @@ }, "packages/ui/node_modules/globals": { "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", "dev": true, + "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -21934,27 +19264,24 @@ }, "packages/ui/node_modules/has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "packages/ui/node_modules/ignore": { "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, "packages/ui/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -21964,9 +19291,8 @@ }, "packages/ui/node_modules/locate-path": { "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -21979,9 +19305,8 @@ }, "packages/ui/node_modules/mocha": { "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -22019,9 +19344,8 @@ }, "packages/ui/node_modules/mocha/node_modules/minimatch": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -22031,9 +19355,8 @@ }, "packages/ui/node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -22046,15 +19369,13 @@ }, "packages/ui/node_modules/ms": { "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "packages/ui/node_modules/nanoid": { "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -22064,9 +19385,8 @@ }, "packages/ui/node_modules/p-limit": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, + "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -22079,9 +19399,8 @@ }, "packages/ui/node_modules/p-locate": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -22094,18 +19413,16 @@ }, "packages/ui/node_modules/path-exists": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "packages/ui/node_modules/react": { "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dev": true, + "license": "MIT", "dependencies": { "loose-envify": "^1.1.0" }, @@ -22115,9 +19432,8 @@ }, "packages/ui/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -22127,9 +19443,8 @@ }, "packages/ui/node_modules/type-fest": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -22139,9 +19454,8 @@ }, "packages/ui/node_modules/typescript": { "version": "5.1.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", - "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -22152,9 +19466,8 @@ }, "packages/ui/node_modules/workerpool": { "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true + "dev": true, + "license": "Apache-2.0" } } } diff --git a/packages/core/package.json b/packages/core/package.json index 5a1f861503..fec8f96779 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -53,7 +53,7 @@ "@types/fs-extra": "^9.0.13", "@types/mocha": "9.1.1", "@types/ndjson": "2.0.1", - "@types/node": "12.20.25", + "@types/node": "16.11.7", "@typescript-eslint/eslint-plugin": "4.31.2", "@typescript-eslint/parser": "4.31.2", "chai": "^4.3.4", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 62012339fc..3c3c605a66 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -44,7 +44,7 @@ "@types/lodash.flattendeep": "^4.4.7", "@types/mermaid": "^9.1.0", "@types/mocha": "^9.0.0", - "@types/node": "12.20.25", + "@types/node": "16.11.7", "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", "@typescript-eslint/eslint-plugin": "4.31.2", From 0749be4beb6d7a540fa64cdf324d2da66f9da943 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 11:57:17 +0100 Subject: [PATCH 1037/1302] chore: remove serialize-error dep Our restructuring of error handling means we no longer pass error objects as results to messages. We can remove this dep. Resolves #523. --- package-lock.json | 28 +------------------ packages/core/package.json | 3 +- .../journal/utils/deserialize-replacer.ts | 6 ---- .../journal/utils/serialize-replacer.ts | 6 ---- 4 files changed, 2 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 33fc769487..b7e336cbef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15028,31 +15028,6 @@ "upper-case-first": "^1.1.2" } }, - "node_modules/serialize-error": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz", - "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/serialize-error/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/serialize-javascript": { "version": "6.0.0", "license": "BSD-3-Clause", @@ -18421,8 +18396,7 @@ "fs-extra": "^10.0.0", "immer": "10.0.2", "lodash": "4.17.21", - "ndjson": "2.0.0", - "serialize-error": "8.1.0" + "ndjson": "2.0.0" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", diff --git a/packages/core/package.json b/packages/core/package.json index fec8f96779..a024163eb0 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -81,7 +81,6 @@ "fs-extra": "^10.0.0", "immer": "10.0.2", "lodash": "4.17.21", - "ndjson": "2.0.0", - "serialize-error": "8.1.0" + "ndjson": "2.0.0" } } diff --git a/packages/core/src/internal/journal/utils/deserialize-replacer.ts b/packages/core/src/internal/journal/utils/deserialize-replacer.ts index 8d553ace78..ee463aa6c4 100644 --- a/packages/core/src/internal/journal/utils/deserialize-replacer.ts +++ b/packages/core/src/internal/journal/utils/deserialize-replacer.ts @@ -1,5 +1,3 @@ -import { deserializeError } from "serialize-error"; - /** * When JSON.parsing journal messages deserialize, this defines the replacer. */ @@ -12,10 +10,6 @@ export function deserializeReplacer(_key: string, value: unknown) { return BigInt(value.value); } - if (typeof value === "object" && value !== null && "message" in value) { - return deserializeError(value); - } - return value; } diff --git a/packages/core/src/internal/journal/utils/serialize-replacer.ts b/packages/core/src/internal/journal/utils/serialize-replacer.ts index 125d50c2ce..fc48ddcd30 100644 --- a/packages/core/src/internal/journal/utils/serialize-replacer.ts +++ b/packages/core/src/internal/journal/utils/serialize-replacer.ts @@ -1,5 +1,3 @@ -import { serializeError } from "serialize-error"; - /** * When stringifying messages to the journal, this defines the replacer. */ @@ -16,10 +14,6 @@ export function serializeReplacer(_key: string, value: unknown) { return { _kind: "bigint", value: value.toString(10) }; } - if (value instanceof Error) { - return serializeError(new Error(value.message)); - } - if (value instanceof Object && !(value instanceof Array)) { const obj: any = value; return Object.keys(obj) From 88e6497ce42f2cd5aa192ab8fab7bed837b19d18 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 9 Oct 2023 16:48:00 +0100 Subject: [PATCH 1038/1302] chore: bring HH versions into line --- package-lock.json | 15060 ++++++++++++++++++++--------------- packages/core/package.json | 2 +- 2 files changed, 8850 insertions(+), 6212 deletions(-) diff --git a/package-lock.json b/package-lock.json index b7e336cbef..212ac8272b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,1539 +38,1472 @@ "prettier-plugin-solidity": "1.1.3" } }, - "examples/complete/node_modules/@noble/hashes": { - "version": "1.1.2", + "examples/ens": { + "name": "@nomicfoundation/ignition-ens-example", + "version": "0.4.0", + "dependencies": { + "@ensdomains/ens-contracts": "0.0.11" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-toolbox": "3.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } + }, + "examples/sample": { + "name": "@nomicfoundation/ignition-sample-example", + "version": "0.4.0", + "devDependencies": { + "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-toolbox": "3.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } + }, + "examples/ts-sample": { + "name": "@nomicfoundation/ignition-ts-sample-example", + "version": "0.4.0", + "devDependencies": { + "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-toolbox": "3.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "peer": true + "engines": { + "node": ">=0.10.0" + } }, - "examples/complete/node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", + "node_modules/@adraffy/ens-normalize": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", + "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" + "engines": { + "node": ">=6.0.0" } }, - "examples/complete/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/complete/node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", - "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.2.0", - "typescript": ">=4.5.0" + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, - "examples/complete/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" + "engines": { + "node": ">=4" } }, - "examples/complete/node_modules/@typechain/hardhat": { - "version": "8.0.3", + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.1" + "color-name": "1.1.3" } }, - "examples/complete/node_modules/@types/node": { - "version": "18.15.13", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true }, - "examples/complete/node_modules/aes-js": { - "version": "4.0.0-beta.5", + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", - "peer": true + "engines": { + "node": ">=0.8.0" + } }, - "examples/complete/node_modules/ethers": { - "version": "6.7.1", + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, - "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "examples/complete/node_modules/fs-extra": { - "version": "9.1.0", + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "examples/complete/node_modules/tslib": { - "version": "2.4.0", - "dev": true, - "license": "0BSD", - "peer": true - }, - "examples/complete/node_modules/ws": { - "version": "8.5.0", + "node_modules/@babel/compat-data": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, - "license": "MIT", - "peer": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=6.9.0" } }, - "examples/ens": { - "name": "@nomicfoundation/ignition-ens-example", - "version": "0.4.0", + "node_modules/@babel/core": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", + "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "dev": true, "dependencies": { - "@ensdomains/ens-contracts": "0.0.11" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.0", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" }, - "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", - "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "examples/ens/node_modules/@noble/hashes": { - "version": "1.1.2", + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "peer": true + "bin": { + "semver": "bin/semver.js" + } }, - "examples/ens/node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" + "engines": { + "node": ">=6.9.0" } }, - "examples/ens/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" - }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" - } - }, - "examples/ens/node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.2.0", - "typescript": ">=4.5.0" - } - }, - "examples/ens/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/ens/node_modules/@typechain/hardhat": { - "version": "8.0.3", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "fs-extra": "^9.1.0" + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, - "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.1" + "engines": { + "node": ">=6.9.0" } }, - "examples/ens/node_modules/@types/node": { - "version": "18.15.13", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "MIT", - "peer": true + "bin": { + "semver": "bin/semver.js" + } }, - "examples/ens/node_modules/aes-js": { - "version": "4.0.0-beta.5", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, - "license": "MIT", - "peer": true + "engines": { + "node": ">=6.9.0" + } }, - "examples/ens/node_modules/ethers": { - "version": "6.7.1", + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/fs-extra": { - "version": "9.1.0", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "examples/ens/node_modules/tslib": { - "version": "2.4.0", + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, - "license": "0BSD", - "peer": true + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } }, - "examples/ens/node_modules/ws": { - "version": "8.5.0", + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, - "license": "MIT", - "peer": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, "engines": { - "node": ">=10.0.0" + "node": ">=6.9.0" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "examples/sample": { - "name": "@nomicfoundation/ignition-sample-example", - "version": "0.4.0", - "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", - "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" + "@babel/core": "^7.0.0" } }, - "examples/sample/node_modules/@noble/hashes": { - "version": "1.1.2", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "peer": true + "engines": { + "node": ">=6.9.0" + } }, - "examples/sample/node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" + "engines": { + "node": ">=6.9.0" } }, - "examples/sample/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" + "@babel/types": "^7.22.5" }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/sample/node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, - "license": "MIT", - "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.2.0", - "typescript": ">=4.5.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/sample/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", + "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.0", + "@babel/types": "^7.23.0" }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" + "engines": { + "node": ">=6.9.0" } }, - "examples/sample/node_modules/@typechain/hardhat": { - "version": "8.0.3", + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "fs-extra": "^9.1.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" }, - "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.1" + "engines": { + "node": ">=6.9.0" } }, - "examples/sample/node_modules/@types/node": { - "version": "18.15.13", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", - "peer": true - }, - "examples/sample/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "dev": true, - "license": "MIT", - "peer": true - }, - "examples/sample/node_modules/ethers": { - "version": "6.7.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=4" } }, - "examples/sample/node_modules/fs-extra": { - "version": "9.1.0", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" + "node": ">=4" } }, - "examples/sample/node_modules/tslib": { - "version": "2.4.0", + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, - "license": "0BSD", - "peer": true + "dependencies": { + "color-name": "1.1.3" + } }, - "examples/sample/node_modules/ws": { - "version": "8.5.0", + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "MIT", - "peer": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "examples/ts-sample": { - "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.4.0", - "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", - "@nomicfoundation/hardhat-toolbox": "3.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" + "node": ">=0.8.0" } }, - "examples/ts-sample/node_modules/@noble/hashes": { - "version": "1.1.2", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "peer": true + "engines": { + "node": ">=4" + } }, - "examples/ts-sample/node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" + "has-flag": "^3.0.0" }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" + "engines": { + "node": ">=4" } }, - "examples/ts-sample/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" + "bin": { + "parser": "bin/babel-parser.js" }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" + "engines": { + "node": ">=6.0.0" } }, - "examples/ts-sample/node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, - "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.2.0", - "typescript": ">=4.5.0" + "@babel/core": "^7.0.0-0" } }, - "examples/ts-sample/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" + "@babel/core": "^7.0.0-0" } }, - "examples/ts-sample/node_modules/@typechain/hardhat": { - "version": "8.0.3", + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "fs-extra": "^9.1.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.1" + "@babel/core": "^7.0.0-0" } }, - "examples/ts-sample/node_modules/@types/node": { - "version": "18.15.13", - "dev": true, - "license": "MIT", - "peer": true + "node_modules/@babel/runtime": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } }, - "examples/ts-sample/node_modules/aes-js": { - "version": "4.0.0-beta.5", + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, - "license": "MIT", - "peer": true + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } }, - "examples/ts-sample/node_modules/ethers": { - "version": "6.7.1", + "node_modules/@babel/traverse": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", + "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "peer": true, "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { - "node": ">=14.0.0" + "node": ">=6.9.0" } }, - "examples/ts-sample/node_modules/fs-extra": { - "version": "9.1.0", + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "examples/ts-sample/node_modules/tslib": { - "version": "2.4.0", - "dev": true, - "license": "0BSD", - "peer": true + "node_modules/@braintree/sanitize-url": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", + "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", + "dev": true }, - "examples/ts-sample/node_modules/ws": { - "version": "8.5.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "node_modules/@chainsafe/as-sha256": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", + "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.9.2", - "license": "MIT" + "node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", + "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } }, - "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "dev": true, - "license": "Apache-2.0", + "node_modules/@chainsafe/ssz": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", + "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.4.2", + "case": "^1.6.3" } }, - "node_modules/@babel/code-frame": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, "dependencies": { - "@babel/highlight": "^7.22.5" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" } }, - "node_modules/@babel/compat-data": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/core": { - "version": "7.22.5", + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", "dev": true, - "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", - "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "@emotion/memoize": "^0.8.1" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "dev": true }, - "node_modules/@babel/generator": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@emotion/stylis": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", + "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", + "dev": true + }, + "node_modules/@emotion/unitless": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", + "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", + "dev": true + }, + "node_modules/@ensdomains/address-encoder": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", + "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", "dependencies": { - "@babel/types": "^7.22.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" + "bech32": "^1.1.3", + "blakejs": "^1.1.0", + "bn.js": "^4.11.8", + "bs58": "^4.0.1", + "crypto-addr-codec": "^0.1.7", + "nano-base32": "^1.0.1", + "ripemd160": "^2.0.2" } }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@ensdomains/buffer": { + "version": "0.0.13", + "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", + "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "@nomiclabs/hardhat-truffle5": "^2.0.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", + "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", + "deprecated": "Please use @ensdomains/ens-contracts", "dependencies": { - "@babel/compat-data": "^7.22.5", - "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "bluebird": "^3.5.2", + "eth-ens-namehash": "^2.0.8", + "solc": "^0.4.20", + "testrpc": "0.0.1", + "web3-utils": "^1.0.0-beta.31" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node_modules/@ensdomains/ens-contracts": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", + "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", + "dependencies": { + "@ensdomains/buffer": "^0.0.13", + "@ensdomains/solsha1": "0.0.3", + "@openzeppelin/contracts": "^4.1.0", + "dns-packet": "^5.3.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.22.5", - "@babel/types": "^7.22.5" - }, + "node_modules/@ensdomains/ens/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dependencies": { - "@babel/types": "^7.22.5" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/fs-extra": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } + "node_modules/@ensdomains/ens/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dependencies": { - "@babel/types": "^7.22.5" + "number-is-nan": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@ensdomains/ens/node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dependencies": { - "@babel/types": "^7.22.5" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" + "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/helpers": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dependencies": { - "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", - "@babel/types": "^7.22.5" + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/highlight": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/parser": { - "version": "7.22.5", - "dev": true, - "license": "MIT", - "bin": { - "parser": "bin/babel-parser.js" - }, + "node_modules/@ensdomains/ens/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=0.10.0" } }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/require-from-string": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", + "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ensdomains/ens/node_modules/require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" + }, + "node_modules/@ensdomains/ens/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "bin": { + "rimraf": "bin.js" } }, - "node_modules/@babel/runtime": { - "version": "7.22.5", - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@ensdomains/ens/node_modules/solc": { + "version": "0.4.26", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", + "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "fs-extra": "^0.30.0", + "memorystream": "^0.3.1", + "require-from-string": "^1.1.0", + "semver": "^5.3.0", + "yargs": "^4.7.1" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "solcjs": "solcjs" } }, - "node_modules/@babel/template": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/traverse": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", "dependencies": { - "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.5", - "@babel/helper-function-name": "^7.22.5", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", - "@babel/types": "^7.22.5", - "debug": "^4.1.0", - "globals": "^11.1.0" + "ansi-regex": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@babel/types": { - "version": "7.22.5", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" + "is-utf8": "^0.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=0.10.0" } }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "license": "Apache-2.0" + "node_modules/@ensdomains/ens/node_modules/which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "license": "Apache-2.0", + "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "license": "Apache-2.0", + "node_modules/@ensdomains/ens/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" + }, + "node_modules/@ensdomains/ens/node_modules/yargs": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", + "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "lodash.assign": "^4.0.3", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.1", + "which-module": "^1.0.0", + "window-size": "^0.2.0", + "y18n": "^3.2.1", + "yargs-parser": "^2.4.1" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "devOptional": true, - "license": "MIT", + "node_modules/@ensdomains/ens/node_modules/yargs-parser": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", + "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" + "camelcase": "^3.0.0", + "lodash.assign": "^4.0.6" } }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "devOptional": true, - "license": "MIT", + "node_modules/@ensdomains/ensjs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", + "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@babel/runtime": "^7.4.4", + "@ensdomains/address-encoder": "^0.1.7", + "@ensdomains/ens": "0.4.5", + "@ensdomains/resolver": "0.2.4", + "content-hash": "^2.5.2", + "eth-ens-namehash": "^2.0.8", + "ethers": "^5.0.13", + "js-sha3": "^0.8.0" } }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "dev": true, - "license": "MIT", + "node_modules/@ensdomains/ensjs/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@emotion/memoize": "^0.8.1" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@ensdomains/address-encoder": { - "version": "0.1.9", - "license": "BSD", + "node_modules/@ensdomains/ensjs/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/@ensdomains/buffer": { - "version": "0.0.13", - "dependencies": { - "@nomiclabs/hardhat-truffle5": "^2.0.0" - } + "node_modules/@ensdomains/resolver": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", + "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", + "deprecated": "Please use @ensdomains/ens-contracts" }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "license": "CC0-1.0", + "node_modules/@ensdomains/solsha1": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", + "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" + "hash-test-vectors": "^1.3.2" } }, - "node_modules/@ensdomains/ens-contracts": { - "version": "0.0.11", - "license": "MIT", - "dependencies": { - "@ensdomains/buffer": "^0.0.13", - "@ensdomains/solsha1": "0.0.3", - "@openzeppelin/contracts": "^4.1.0", - "dns-packet": "^5.3.0" + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "license": "MIT", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "license": "MIT", + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "license": "ISC", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/find-up": { - "version": "1.1.2", - "license": "MIT", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "license": "ISC" - }, - "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { - "version": "2.8.9", - "license": "ISC" - }, - "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/load-json-file": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { - "version": "2.5.0", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/parse-json": { - "version": "2.2.0", - "license": "MIT", - "dependencies": { - "error-ex": "^1.2.0" - }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/path-exists": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/path-type": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/pify": { - "version": "2.3.0", - "license": "MIT", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/read-pkg": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/require-from-string": { - "version": "1.2.1", - "license": "MIT", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/require-main-filename": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/@ensdomains/ens/node_modules/rimraf": { - "version": "2.7.1", - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "license": "MIT", - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/strip-bom": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "is-utf8": "^0.2.0" - }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/@ensdomains/ens/node_modules/which-module": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "license": "ISC" - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "license": "MIT", - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "license": "ISC", - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/@ensdomains/ensjs": { - "version": "2.1.0", - "license": "ISC", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4" - }, - "node_modules/@ensdomains/solsha1": { - "version": "0.0.3", - "dependencies": { - "hash-test-vectors": "^1.3.2" + "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.17.19", + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" @@ -1578,8 +1511,9 @@ }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1591,9 +1525,10 @@ } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -1602,17 +1537,19 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.1.1", @@ -1629,9 +1566,10 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -1644,8 +1582,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -1654,16 +1593,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ethereumjs/common": { "version": "2.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", "dependencies": { "crc-32": "^1.2.0", "ethereumjs-util": "^7.1.1" @@ -1671,7 +1612,9 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1692,7 +1635,8 @@ }, "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -1704,9 +1648,21 @@ "node": ">=10.0.0" } }, + "node_modules/@ethereumjs/rlp": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", + "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@ethereumjs/tx": { "version": "3.3.2", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", "dependencies": { "@ethereumjs/common": "^2.5.0", "ethereumjs-util": "^7.1.2" @@ -1714,7 +1670,9 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1735,7 +1693,8 @@ }, "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -1747,19 +1706,80 @@ "node": ">=10.0.0" } }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" + "node_modules/@ethereumjs/util": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", + "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", + "dependencies": { + "@ethereumjs/rlp": "^4.0.1", + "ethereum-cryptography": "^2.0.0", + "micro-ftch": "^0.3.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "dependencies": { + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", + "dependencies": { + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" + } + }, + "node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1774,6 +1794,8 @@ }, "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1784,7 +1806,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1795,6 +1816,8 @@ }, "node_modules/@ethersproject/abstract-provider": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -1805,7 +1828,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1818,6 +1840,8 @@ }, "node_modules/@ethersproject/abstract-signer": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -1828,7 +1852,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -1839,6 +1862,8 @@ }, "node_modules/@ethersproject/address": { "version": "5.6.1", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", + "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", "funding": [ { "type": "individual", @@ -1849,7 +1874,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.6.2", "@ethersproject/bytes": "^5.6.1", @@ -1860,6 +1884,8 @@ }, "node_modules/@ethersproject/base64": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -1870,13 +1896,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0" } }, "node_modules/@ethersproject/basex": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -1887,7 +1914,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/properties": "^5.7.0" @@ -1895,6 +1921,8 @@ }, "node_modules/@ethersproject/bignumber": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "funding": [ { "type": "individual", @@ -1905,7 +1933,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -1914,6 +1941,8 @@ }, "node_modules/@ethersproject/bytes": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -1924,13 +1953,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -1941,13 +1971,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0" } }, "node_modules/@ethersproject/contracts": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -1958,7 +1989,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", @@ -1974,6 +2004,8 @@ }, "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -1984,7 +2016,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -1995,6 +2026,8 @@ }, "node_modules/@ethersproject/hash": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -2005,7 +2038,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -2020,6 +2052,8 @@ }, "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2030,7 +2064,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2041,6 +2074,8 @@ }, "node_modules/@ethersproject/hdnode": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -2051,7 +2086,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/basex": "^5.7.0", @@ -2069,6 +2103,8 @@ }, "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", "funding": [ { "type": "individual", @@ -2079,7 +2115,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-signer": "^5.7.0", "@ethersproject/address": "^5.7.0", @@ -2098,6 +2133,8 @@ }, "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2108,7 +2145,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2117,8 +2153,15 @@ "@ethersproject/rlp": "^5.7.0" } }, + "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, "node_modules/@ethersproject/keccak256": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -2129,7 +2172,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" @@ -2137,6 +2179,8 @@ }, "node_modules/@ethersproject/logger": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -2146,11 +2190,12 @@ "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } - ], - "license": "MIT" + ] }, "node_modules/@ethersproject/networks": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -2161,13 +2206,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/pbkdf2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", "funding": [ { "type": "individual", @@ -2178,7 +2224,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/sha2": "^5.7.0" @@ -2186,6 +2231,8 @@ }, "node_modules/@ethersproject/properties": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", "funding": [ { "type": "individual", @@ -2196,13 +2243,14 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/providers": { "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", "funding": [ { "type": "individual", @@ -2213,7 +2261,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -2239,6 +2286,8 @@ }, "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2249,7 +2298,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2258,8 +2306,30 @@ "@ethersproject/rlp": "^5.7.0" } }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@ethersproject/random": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -2270,7 +2340,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -2278,6 +2347,8 @@ }, "node_modules/@ethersproject/rlp": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "funding": [ { "type": "individual", @@ -2288,7 +2359,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0" @@ -2296,6 +2366,8 @@ }, "node_modules/@ethersproject/sha2": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -2306,7 +2378,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -2315,6 +2386,8 @@ }, "node_modules/@ethersproject/signing-key": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "funding": [ { "type": "individual", @@ -2325,7 +2398,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/logger": "^5.7.0", @@ -2337,6 +2409,8 @@ }, "node_modules/@ethersproject/solidity": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", "funding": [ { "type": "individual", @@ -2347,7 +2421,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2359,6 +2432,8 @@ }, "node_modules/@ethersproject/strings": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "funding": [ { "type": "individual", @@ -2369,7 +2444,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -2378,6 +2452,8 @@ }, "node_modules/@ethersproject/transactions": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", "funding": [ { "type": "individual", @@ -2388,7 +2464,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/address": "^5.7.0", "@ethersproject/bignumber": "^5.7.0", @@ -2403,6 +2478,8 @@ }, "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2413,7 +2490,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2424,6 +2500,8 @@ }, "node_modules/@ethersproject/units": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", "funding": [ { "type": "individual", @@ -2434,7 +2512,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", @@ -2443,6 +2520,8 @@ }, "node_modules/@ethersproject/wallet": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -2453,7 +2532,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", @@ -2474,6 +2552,8 @@ }, "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -2484,7 +2564,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bignumber": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2495,6 +2574,8 @@ }, "node_modules/@ethersproject/web": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "funding": [ { "type": "individual", @@ -2505,7 +2586,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/base64": "^5.7.0", "@ethersproject/bytes": "^5.7.0", @@ -2516,6 +2596,8 @@ }, "node_modules/@ethersproject/wordlists": { "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "funding": [ { "type": "individual", @@ -2526,7 +2608,6 @@ "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { "@ethersproject/bytes": "^5.7.0", "@ethersproject/hash": "^5.7.0", @@ -2535,37 +2616,50 @@ "@ethersproject/strings": "^5.7.0" } }, + "node_modules/@fastify/busboy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", + "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "engines": { + "node": ">=14" + } + }, "node_modules/@floating-ui/core": { "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", "dev": true, - "license": "MIT", "dependencies": { "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/dom": { "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", "dev": true, - "license": "MIT", "dependencies": { "@floating-ui/core": "^1.4.2", "@floating-ui/utils": "^0.1.3" } }, "node_modules/@floating-ui/utils": { - "version": "0.1.4", - "dev": true, - "license": "MIT" + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", + "dev": true }, "node_modules/@fontsource/roboto": { "version": "5.0.8", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", + "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==", + "dev": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", "debug": "^4.1.1", @@ -2577,708 +2671,2090 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/nyc-config-typescript": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", + "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "nyc": ">=15" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "devOptional": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "devOptional": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@metamask/eth-sig-util": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", + "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", + "dependencies": { + "ethereumjs-abi": "^0.6.8", + "ethereumjs-util": "^6.2.1", + "ethjs-util": "^0.1.6", + "tweetnacl": "^1.0.3", + "tweetnacl-util": "^0.15.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.34.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", + "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.26.4", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2", + "@rushstack/rig-package": "0.3.18", + "@rushstack/ts-command-line": "4.13.2", + "colors": "~1.2.1", + "lodash": "~4.17.15", + "resolve": "~1.22.1", + "semver": "~7.3.0", + "source-map": "~0.6.1", + "typescript": "~4.8.4" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", + "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.55.2" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", + "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", + "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", + "dev": true + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", + "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", + "dev": true, + "dependencies": { + "@microsoft/tsdoc": "0.14.2", + "ajv": "~6.12.6", + "jju": "~1.4.0", + "resolve": "~1.19.0" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/curves/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", + "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@noble/secp256k1": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", + "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", + "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", + "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-ethash": "3.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "abstract-level": "^1.0.3", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "level": "^8.0.0", + "lru-cache": "^5.1.1", + "memory-level": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", + "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", + "dependencies": { + "@nomicfoundation/ethereumjs-util": "9.0.2", + "crc-32": "^1.2.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", + "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "abstract-level": "^1.0.3", + "bigint-crypto-utils": "^3.0.23", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", + "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", + "dependencies": { + "@ethersproject/providers": "^5.7.1", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", + "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", + "bin": { + "rlp": "bin/rlp" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", + "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "ethers": "^5.7.1", + "js-sdsl": "^4.1.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", + "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "@types/readable-stream": "^2.3.13", + "ethereum-cryptography": "0.1.3", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", + "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", + "dependencies": { + "@chainsafe/ssz": "^0.9.2", + "@ethersproject/providers": "^5.7.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", + "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", + "dependencies": { + "@chainsafe/ssz": "^0.10.0", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "ethereum-cryptography": "0.1.3" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", + "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", + "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "dependencies": { + "@chainsafe/as-sha256": "^0.3.1", + "@chainsafe/persistent-merkle-tree": "^0.5.0" + } + }, + "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", + "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.2", + "@nomicfoundation/ethereumjs-blockchain": "7.0.2", + "@nomicfoundation/ethereumjs-common": "4.0.2", + "@nomicfoundation/ethereumjs-evm": "2.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-statemanager": "2.0.2", + "@nomicfoundation/ethereumjs-trie": "6.0.2", + "@nomicfoundation/ethereumjs-tx": "5.0.2", + "@nomicfoundation/ethereumjs-util": "9.0.2", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "mcl-wasm": "^0.7.1", + "rustbn.js": "~0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/hardhat-chai-matchers": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", + "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/chai-as-promised": "^7.1.3", + "chai-as-promised": "^7.1.1", + "deep-eql": "^4.0.1", + "ordinal": "^1.0.3" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "chai": "^4.2.0", + "ethers": "^6.1.0", + "hardhat": "^2.9.4" + } + }, + "node_modules/@nomicfoundation/hardhat-ethers": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", + "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash.isequal": "^4.5.0" + }, + "peerDependencies": { + "ethers": "^6.1.0", + "hardhat": "^2.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-ignition": { + "resolved": "packages/hardhat-plugin", + "link": true + }, + "node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", + "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", + "dev": true, + "peer": true, + "dependencies": { + "ethereumjs-util": "^7.1.4" + }, + "peerDependencies": { + "hardhat": "^2.9.5" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dev": true, + "peer": true, + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", + "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", + "dev": true, + "peerDependencies": { + "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", + "@nomicfoundation/hardhat-ethers": "^3.0.0", + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^1.0.0", + "@typechain/ethers-v6": "^0.4.0", + "@typechain/hardhat": "^8.0.0", + "@types/chai": "^4.2.0", + "@types/mocha": ">=9.1.0", + "@types/node": ">=12.0.0", + "chai": "^4.2.0", + "ethers": "^6.4.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typechain": "^8.2.0", + "typescript": ">=4.5.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", + "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", + "dev": true, + "peer": true, + "dependencies": { + "@ethersproject/abi": "^5.1.2", + "@ethersproject/address": "^5.0.2", + "cbor": "^8.1.0", + "chalk": "^2.4.2", + "debug": "^4.1.1", + "lodash.clonedeep": "^4.5.0", + "semver": "^6.3.0", + "table": "^6.8.0", + "undici": "^5.14.0" + }, + "peerDependencies": { + "hardhat": "^2.0.4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "peer": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "peer": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@nomicfoundation/ignition-complete-example": { + "resolved": "examples/complete", + "link": true + }, + "node_modules/@nomicfoundation/ignition-core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@nomicfoundation/ignition-ens-example": { + "resolved": "examples/ens", + "link": true + }, + "node_modules/@nomicfoundation/ignition-sample-example": { + "resolved": "examples/sample", + "link": true + }, + "node_modules/@nomicfoundation/ignition-ts-sample-example": { + "resolved": "examples/ts-sample", + "link": true + }, + "node_modules/@nomicfoundation/ignition-ui": { + "resolved": "packages/ui", + "link": true + }, + "node_modules/@nomicfoundation/solidity-analyzer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", + "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", + "engines": { + "node": ">= 12" + }, + "optionalDependencies": { + "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", + "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", + "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", + "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", + "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", + "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", + "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", + "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", + "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", + "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", + "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", + "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", + "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", + "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", + "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", + "dev": true + }, + "node_modules/@nomiclabs/hardhat-truffle5": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", + "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", + "dependencies": { + "@nomiclabs/truffle-contract": "^4.2.23", + "@types/chai": "^4.2.0", + "chai": "^4.2.0", + "ethereumjs-util": "^7.1.4", + "fs-extra": "^7.0.1" + }, + "peerDependencies": { + "@nomiclabs/hardhat-web3": "^2.0.0", + "hardhat": "^2.6.4", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", + "dependencies": { + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/@nomiclabs/hardhat-web3": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", + "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", + "peer": true, + "dependencies": { + "@types/bignumber.js": "^5.0.0" + }, + "peerDependencies": { + "hardhat": "^2.0.0", + "web3": "^1.0.0-beta.36" + } + }, + "node_modules/@nomiclabs/truffle-contract": { + "version": "4.5.10", + "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", + "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", + "dependencies": { + "@ensdomains/ensjs": "^2.0.1", + "@truffle/blockchain-utils": "^0.1.3", + "@truffle/contract-schema": "^3.4.7", + "@truffle/debug-utils": "^6.0.22", + "@truffle/error": "^0.1.0", + "@truffle/interface-adapter": "^0.5.16", + "bignumber.js": "^7.2.1", + "ethereum-ens": "^0.8.0", + "ethers": "^4.0.0-beta.1", + "source-map-support": "^0.5.19" + }, + "peerDependencies": { + "web3": "^1.2.1", + "web3-core-helpers": "^1.2.1", + "web3-core-promievent": "^1.2.1", + "web3-eth-abi": "^1.2.1", + "web3-utils": "^1.2.1" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "dev": true, - "license": "BSD-3-Clause" + "node_modules/@nomiclabs/truffle-contract/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", + "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", + "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@openzeppelin/contracts": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", + "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", "dev": true, - "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/unts" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@pkgr/utils/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true + }, + "node_modules/@remix-run/router": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", + "integrity": "sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==", "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, "engines": { - "node": ">=8" + "node": ">=14" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.0.2.tgz", + "integrity": "sha512-xDvk1pT4vaPU2BOLy0MqHMdYZyntqpaBf8RhBiezlqG9OjY8F50TyctHo8znigYKd+QCFhCmlmXHOL/LoaOl3w==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } + "optional": true, + "os": [ + "android" + ], + "peer": true }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.0.2.tgz", + "integrity": "sha512-lqCglytY3E6raze27DD9VQJWohbwCxzqs9aSHcj5X/8hJpzZfNdbsr4Ja9Hqp6iPyF53+5PtPx0pKRlkSvlHZg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "android" + ], + "peer": true }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.0.2.tgz", + "integrity": "sha512-nkBKItS6E6CCzvRwgiKad+j+1ibmL7SIInj7oqMWmdkCjiSX6VeVZw2mLlRKIUL+JjsBgpATTfo7BiAXc1v0jA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "darwin" + ], + "peer": true }, - "node_modules/@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.0.2.tgz", + "integrity": "sha512-vX2C8xvWPIbpEgQht95+dY6BReKAvtDgPDGi0XN0kWJKkm4WdNmq5dnwscv/zxvi+n6jUTBhs6GtpkkWT4q8Gg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "nyc": ">=15" - } + "optional": true, + "os": [ + "darwin" + ], + "peer": true }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.0.2.tgz", + "integrity": "sha512-DVFIfcHOjgmeHOAqji4xNz2wczt1Bmzy9MwBZKBa83SjBVO/i38VHDR+9ixo8QpBOiEagmNw12DucG+v55tCrg==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.0.2.tgz", + "integrity": "sha512-GCK/a9ItUxPI0V5hQEJjH4JtOJO90GF2Hja7TO+EZ8rmkGvEi8/ZDMhXmcuDpQT7/PWrTT9RvnG8snMd5SrhBQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.0.2.tgz", + "integrity": "sha512-cLuBp7rOjIB1R2j/VazjCmHC7liWUur2e9mFflLJBAWCkrZ+X0+QwHLvOQakIwDymungzAKv6W9kHZnTp/Mqrg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.0.2.tgz", + "integrity": "sha512-Zqw4iVnJr2naoyQus0yLy7sLtisCQcpdMKUCeXPBjkJtpiflRime/TMojbnl8O3oxUAj92mxr+t7im/RbgA20w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "devOptional": true, - "license": "MIT" + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.0.2.tgz", + "integrity": "sha512-jJRU9TyUD/iMqjf8aLAp7XiN3pIj5v6Qcu+cdzBfVTKDD0Fvua4oUoK8eVJ9ZuKBEQKt3WdlcwJXFkpmMLk6kg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.0.2.tgz", + "integrity": "sha512-ZkS2NixCxHKC4zbOnw64ztEGGDVIYP6nKkGBfOAxEPW71Sji9v8z3yaHNuae/JHPwXA+14oDefnOuVfxl59SmQ==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } + "optional": true, + "os": [ + "win32" + ], + "peer": true + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.0.2.tgz", + "integrity": "sha512-3SKjj+tvnZ0oZq2BKB+fI+DqYI83VrRzk7eed8tJkxeZ4zxJZcLSE8YDQLYGq1tZAnAX+H076RHHB4gTZXsQzw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.0.2.tgz", + "integrity": "sha512-MBdJIOxRauKkry7t2q+rTHa3aWjVez2eioWg+etRVS3dE4tChhmt5oqZYr48R6bPmcwEhxQr96gVRfeQrLbqng==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "license": "ISC", - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } + "optional": true, + "os": [ + "win32" + ], + "peer": true }, - "node_modules/@microsoft/api-extractor": { - "version": "7.34.4", + "node_modules/@rushstack/node-core-library": { + "version": "3.55.2", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", + "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", "dev": true, - "license": "MIT", "dependencies": { - "@microsoft/api-extractor-model": "7.26.4", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2", - "@rushstack/rig-package": "0.3.18", - "@rushstack/ts-command-line": "4.13.2", "colors": "~1.2.1", - "lodash": "~4.17.15", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", "resolve": "~1.22.1", "semver": "~7.3.0", - "source-map": "~0.6.1", - "typescript": "~4.8.4" + "z-schema": "~5.0.2" }, - "bin": { - "api-extractor": "bin/api-extractor" + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.26.4", + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" } }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.8.4", + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", + "node_modules/@rushstack/node-core-library/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT" + "engines": { + "node": ">= 4.0.0" + } }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", + "node_modules/@rushstack/rig-package": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", + "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", "dev": true, - "license": "MIT", "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" } }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", + "node_modules/@rushstack/ts-command-line": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", + "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", "dev": true, - "license": "MIT", "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "colors": "~1.2.1", + "string-argv": "~0.3.1" + } + }, + "node_modules/@scure/base": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", + "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/hashes": { - "version": "1.2.0", + "node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT" + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", + "node_modules/@scure/bip32/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } - ], - "license": "MIT" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" - }, - "engines": { - "node": ">=14" - } + ] }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", + "node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "license": "MIT", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" - } + "node_modules/@scure/bip39/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "license": "MPL-2.0", + "node_modules/@sentry/core": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", + "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", - "ethereum-cryptography": "0.1.3" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "license": "MPL-2.0", + "node_modules/@sentry/hub": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", + "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "license": "MPL-2.0", - "bin": { - "rlp": "bin/rlp" + "node_modules/@sentry/minimal": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", + "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", + "dependencies": { + "@sentry/hub": "5.30.0", + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "license": "MPL-2.0", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "license": "MPL-2.0", + "node_modules/@sentry/node": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", + "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "readable-stream": "^3.6.0" + "@sentry/core": "5.30.0", + "@sentry/hub": "5.30.0", + "@sentry/tracing": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "license": "MPL-2.0", + "node_modules/@sentry/tracing": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", + "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3" + "@sentry/hub": "5.30.0", + "@sentry/minimal": "5.30.0", + "@sentry/types": "5.30.0", + "@sentry/utils": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/@sentry/tracing/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sentry/types": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", + "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", + "engines": { + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "license": "MPL-2.0", + "node_modules/@sentry/utils": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", + "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "ethereum-cryptography": "0.1.3" + "@sentry/types": "5.30.0", + "tslib": "^1.9.3" }, "engines": { - "node": ">=14" + "node": ">=6" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "license": "Apache-2.0", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "license": "Apache-2.0", + "node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "type-detect": "4.0.8" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "node_modules/@sinonjs/fake-timers": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", + "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "license": "MPL-2.0", + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" + "type-detect": "4.0.8" } }, - "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", + "node_modules/@sinonjs/samsam": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", + "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", + "dev": true, "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, - "node_modules/@nomicfoundation/hardhat-ignition": { - "resolved": "packages/hardhat-plugin", - "link": true + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.8", + "node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "ethereumjs-util": "^7.1.4" + "antlr4ts": "^0.5.0-alpha.4" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dependencies": { + "defer-to-connect": "^2.0.1" }, - "peerDependencies": { - "hardhat": "^2.9.5" + "engines": { + "node": ">=14.16" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", + "dev": true + }, + "node_modules/@truffle/abi-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", + "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", + "dependencies": { + "change-case": "3.0.2", + "fast-check": "3.1.1", + "web3-utils": "1.10.0" + }, + "engines": { + "node": "^16.20 || ^18.16 || >=20" + } + }, + "node_modules/@truffle/abi-utils/node_modules/ethereum-cryptography": { "version": "0.1.3", - "dev": true, - "license": "MIT", - "peer": true, + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3297,11 +4773,10 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { + "node_modules/@truffle/abi-utils/node_modules/ethereumjs-util": { "version": "7.1.5", - "dev": true, - "license": "MPL-2.0", - "peer": true, + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -3313,116 +4788,76 @@ "node": ">=10.0.0" } }, - "node_modules/@nomicfoundation/hardhat-verify": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "peer": true, + "node_modules/@truffle/abi-utils/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" }, - "peerDependencies": { - "hardhat": "^2.0.4" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" + "node_modules/@truffle/blockchain-utils": { + "version": "0.1.9", + "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", + "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomicfoundation/ignition-complete-example": { - "resolved": "examples/complete", - "link": true - }, - "node_modules/@nomicfoundation/ignition-core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ens-example": { - "resolved": "examples/ens", - "link": true - }, - "node_modules/@nomicfoundation/ignition-sample-example": { - "resolved": "examples/sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ts-sample-example": { - "resolved": "examples/ts-sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ui": { - "resolved": "packages/ui", - "link": true - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">= 12" + "node_modules/@truffle/codec": { + "version": "0.17.3", + "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", + "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", + "dependencies": { + "@truffle/abi-utils": "^1.0.3", + "@truffle/compile-common": "^0.9.8", + "big.js": "^6.0.3", + "bn.js": "^5.1.3", + "cbor": "^5.2.0", + "debug": "^4.3.1", + "lodash": "^4.17.21", + "semver": "^7.5.4", + "utf8": "^3.0.0", + "web3-utils": "1.10.0" }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "node_modules/@truffle/codec/node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { - "node": ">= 10" + "node": "*" } }, - "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.7", - "license": "MIT", + "node_modules/@truffle/codec/node_modules/cbor": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", + "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", "dependencies": { - "@nomiclabs/truffle-contract": "^4.2.23", - "@types/chai": "^4.2.0", - "chai": "^4.2.0", - "ethereumjs-util": "^7.1.4", - "fs-extra": "^7.0.1" + "bignumber.js": "^9.0.1", + "nofilter": "^1.0.4" }, - "peerDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "hardhat": "^2.6.4", - "web3": "^1.0.0-beta.36" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { + "node_modules/@truffle/codec/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3441,9 +4876,10 @@ "setimmediate": "^1.0.5" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { + "node_modules/@truffle/codec/node_modules/ethereumjs-util": { "version": "7.1.5", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { "@types/bn.js": "^5.1.0", "bn.js": "^5.1.2", @@ -3455,560 +4891,685 @@ "node": ">=10.0.0" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@truffle/codec/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/codec/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@truffle/codec/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "dependencies": { + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@truffle/codec/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@truffle/compile-common": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", + "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "@truffle/error": "^0.2.2", + "colors": "1.4.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "node_modules/@truffle/compile-common/node_modules/@truffle/error": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", + "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", + "node_modules/@truffle/compile-common/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "engines": { - "node": ">= 4.0.0" + "node": ">=0.1.90" } }, - "node_modules/@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "license": "MIT", - "peer": true, + "node_modules/@truffle/contract-schema": { + "version": "3.4.16", + "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", + "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", "dependencies": { - "@types/bignumber.js": "^5.0.0" + "ajv": "^6.10.0", + "debug": "^4.3.1" }, - "peerDependencies": { - "hardhat": "^2.0.0", - "web3": "^1.0.0-beta.36" + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomiclabs/truffle-contract": { - "version": "4.5.10", - "license": "MIT", + "node_modules/@truffle/debug-utils": { + "version": "6.0.57", + "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", + "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", "dependencies": { - "@ensdomains/ensjs": "^2.0.1", - "@truffle/blockchain-utils": "^0.1.3", - "@truffle/contract-schema": "^3.4.7", - "@truffle/debug-utils": "^6.0.22", - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.16", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19" + "@truffle/codec": "^0.17.3", + "@trufflesuite/chromafi": "^3.0.0", + "bn.js": "^5.1.3", + "chalk": "^2.4.2", + "debug": "^4.3.1", + "highlightjs-solidity": "^2.0.6" }, - "peerDependencies": { - "web3": "^1.2.1", - "web3-core-helpers": "^1.2.1", - "web3-core-promievent": "^1.2.1", - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" + "engines": { + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bignumber.js": { - "version": "7.2.1", - "license": "MIT", + "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { - "node": "*" + "node": ">=4" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { - "version": "4.0.49", - "license": "MIT", + "node_modules/@truffle/debug-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { - "version": "1.1.3", - "license": "MIT", + "node_modules/@truffle/debug-utils/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "color-name": "1.1.3" } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { - "version": "0.5.7", - "license": "MIT" + "node_modules/@truffle/debug-utils/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { - "version": "2.0.4", - "license": "MIT" + "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { - "version": "1.0.4", - "license": "MIT" + "node_modules/@truffle/debug-utils/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } }, - "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1" + "node_modules/@truffle/debug-utils/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/@openzeppelin/contracts": { - "version": "4.7.3", - "license": "MIT" + "node_modules/@truffle/error": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" }, - "node_modules/@pkgr/utils": { - "version": "2.4.1", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter": { + "version": "0.5.37", + "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", + "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.2.12", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.5.0" + "bn.js": "^5.1.3", + "ethers": "^4.0.32", + "web3": "1.10.0" }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" + "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.5.3", - "dev": true, - "license": "0BSD" + "node_modules/@truffle/interface-adapter/node_modules/@types/node": { + "version": "12.20.55", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, - "node_modules/@remix-run/router": { - "version": "1.6.0", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, + "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", "engines": { - "node": ">=14" + "node": "*" } }, - "node_modules/@rushstack/node-core-library": { - "version": "3.55.2", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.3.0", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node-fetch": "^2.6.12" } }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "bn.js": "^4.11.6", + "elliptic": "^6.4.0", + "xhr-request-promise": "^0.1.2" } }, - "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } + "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/@rushstack/rig-package": { - "version": "0.3.18", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.13.2", - "dev": true, - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "node_modules/@scure/base": { - "version": "1.1.1", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", + "dependencies": { + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" + } }, - "node_modules/@scure/bip32": { - "version": "1.1.5", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/ethers": { + "version": "4.0.49", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", + "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "aes-js": "3.0.0", + "bn.js": "^4.11.9", + "elliptic": "6.5.4", + "hash.js": "1.1.3", + "js-sha3": "0.5.7", + "scrypt-js": "2.0.4", + "setimmediate": "1.0.4", + "uuid": "2.0.1", + "xmlhttprequest": "1.8.0" } }, - "node_modules/@scure/bip39": { - "version": "1.1.1", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@truffle/interface-adapter/node_modules/hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.0" } }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" + }, + "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", + "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" + }, + "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", + "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" + }, + "node_modules/@truffle/interface-adapter/node_modules/uuid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", + "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." + }, + "node_modules/@truffle/interface-adapter/node_modules/web3": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", + "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", + "hasInstallScript": true, "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "web3-bzz": "1.10.0", + "web3-core": "1.10.0", + "web3-eth": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-shh": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", + "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", + "hasInstallScript": true, "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "@types/node": "^12.12.6", + "got": "12.1.0", + "swarm-js": "^0.1.40" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/web3-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", + "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "@types/bn.js": "^5.1.1", + "@types/node": "^12.12.6", + "bignumber.js": "^9.0.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-requestmanager": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", + "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" + "web3-eth-iban": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", + "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" + "@ethersproject/transactions": "^5.6.2", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", + "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", + "dependencies": { + "eventemitter3": "4.0.4" + }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "license": "BSD-3-Clause", + "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", + "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" + "util": "^0.12.5", + "web3-core-helpers": "1.10.0", + "web3-providers-http": "1.10.0", + "web3-providers-ipc": "1.10.0", + "web3-providers-ws": "1.10.0" }, "engines": { - "node": ">=6" + "node": ">=8.0.0" } }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", + "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", + "dependencies": { + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0" }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "dev": true, - "license": "(Unlicense OR Apache-2.0)" - }, - "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "dev": true, - "license": "MIT", - "peer": true, + "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", + "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-accounts": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-eth-ens": "1.10.0", + "web3-eth-iban": "1.10.0", + "web3-eth-personal": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", + "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", "dependencies": { - "defer-to-connect": "^2.0.1" + "@ethersproject/abi": "^5.6.3", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=14.16" + "node": ">=8.0.0" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@truffle/abi-utils": { - "version": "1.0.1", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", + "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", + "@ethereumjs/common": "2.5.0", + "@ethereumjs/tx": "3.3.2", + "eth-lib": "0.2.8", + "ethereumjs-util": "^7.1.5", + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", "web3-utils": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.8", - "license": "MIT" + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, - "node_modules/@truffle/codec": { - "version": "0.15.2", - "license": "MIT", - "dependencies": { - "@truffle/abi-utils": "^1.0.1", - "@truffle/compile-common": "^0.9.6", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "7.3.7", - "utf8": "^3.0.0", - "web3-utils": "1.10.0" + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@truffle/codec/node_modules/cbor": { - "version": "5.2.0", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", + "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" + "@types/bn.js": "^5.1.1", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", + "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", "dependencies": { - "yallist": "^4.0.0" + "content-hash": "^2.5.2", + "eth-ens-namehash": "2.0.8", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-promievent": "1.10.0", + "web3-eth-abi": "1.10.0", + "web3-eth-contract": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", + "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", + "dependencies": { + "bn.js": "^5.2.1", + "web3-utils": "1.10.0" + }, "engines": { - "node": ">=8" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "7.3.7", - "license": "ISC", + "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", + "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@types/node": "^12.12.6", + "web3-core": "1.10.0", + "web3-core-helpers": "1.10.0", + "web3-core-method": "1.10.0", + "web3-net": "1.10.0", + "web3-utils": "1.10.0" }, "engines": { - "node": ">=10" + "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/@truffle/compile-common": { - "version": "0.9.6", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-net": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", + "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", "dependencies": { - "@truffle/error": "^0.2.1", - "colors": "1.4.0" - } - }, - "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.2.1", - "license": "MIT" - }, - "node_modules/@truffle/compile-common/node_modules/colors": { - "version": "1.4.0", - "license": "MIT", + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-utils": "1.10.0" + }, "engines": { - "node": ">=0.1.90" + "node": ">=8.0.0" } }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.14", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", + "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" + "abortcontroller-polyfill": "^1.7.3", + "cross-fetch": "^3.1.4", + "es6-promise": "^4.2.8", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.51", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", + "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", "dependencies": { - "@truffle/codec": "^0.15.2", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" + "oboe": "2.1.5", + "web3-core-helpers": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/error": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.34", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", + "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.10.0" + "eventemitter3": "4.0.4", + "web3-core-helpers": "1.10.0", + "websocket": "^1.0.32" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/ethers": { - "version": "4.0.49", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", + "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", + "hasInstallScript": true, "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "web3-core": "1.10.0", + "web3-core-method": "1.10.0", + "web3-core-subscriptions": "1.10.0", + "web3-net": "1.10.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/hash.js": { - "version": "1.1.3", - "license": "MIT", + "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "bn.js": "^5.2.1", + "ethereum-bloom-filters": "^1.0.6", + "ethereumjs-util": "^7.1.0", + "ethjs-unit": "0.1.6", + "number-to-bn": "1.7.0", + "randombytes": "^2.1.0", + "utf8": "3.0.0" + }, + "engines": { + "node": ">=8.0.0" } }, - "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { - "version": "0.5.7", - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1" - }, "node_modules/@trufflesuite/chromafi": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", + "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", "dependencies": { "camelcase": "^4.1.0", "chalk": "^2.3.2", @@ -4022,21 +5583,77 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { "node": ">=4" } }, "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dependencies": { "ansi-regex": "^3.0.0" }, @@ -4046,54 +5663,164 @@ }, "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { "node": ">=4" } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true + }, + "node_modules/@typechain/ethers-v6": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", + "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", + "dev": true, + "peer": true, + "dependencies": { + "lodash": "^4.17.15", + "ts-essentials": "^7.0.1" + }, + "peerDependencies": { + "ethers": "6.x", + "typechain": "^8.3.1", + "typescript": ">=4.7.0" + } + }, + "node_modules/@typechain/hardhat": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", + "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", + "dev": true, + "peer": true, + "dependencies": { + "fs-extra": "^9.1.0" + }, + "peerDependencies": { + "@typechain/ethers-v6": "^0.4.3", + "ethers": "^6.1.0", + "hardhat": "^2.9.9", + "typechain": "^8.3.1" + } + }, + "node_modules/@typechain/hardhat/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "peer": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } }, - "node_modules/@types/argparse": { - "version": "1.0.38", + "node_modules/@types/babel__traverse": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", + "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", "dev": true, - "license": "MIT" + "dependencies": { + "@babel/types": "^7.20.7" + } }, "node_modules/@types/bignumber.js": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", + "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", + "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", "peer": true, "dependencies": { "bignumber.js": "*" } }, "node_modules/@types/bn.js": { - "version": "5.1.1", - "license": "MIT", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", + "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/cacheable-request": { "version": "6.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", @@ -4102,21 +5829,24 @@ } }, "node_modules/@types/chai": { - "version": "4.3.5", - "license": "MIT" + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==" }, "node_modules/@types/chai-as-promised": { - "version": "7.1.5", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", + "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", "dev": true, - "license": "MIT", "dependencies": { "@types/chai": "*" } }, "node_modules/@types/concat-stream": { "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", + "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -4124,8 +5854,9 @@ }, "node_modules/@types/d3": { "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", + "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/d3-axis": "*", @@ -4160,210 +5891,243 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.5", - "dev": true, - "license": "MIT" + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.8.tgz", + "integrity": "sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==", + "dev": true }, "node_modules/@types/d3-axis": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.4.tgz", + "integrity": "sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.4.tgz", + "integrity": "sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { - "version": "3.0.2", - "dev": true, - "license": "MIT" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.4.tgz", + "integrity": "sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg==", + "dev": true }, "node_modules/@types/d3-color": { - "version": "3.1.0", - "dev": true, - "license": "MIT" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.1.tgz", + "integrity": "sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg==", + "dev": true }, "node_modules/@types/d3-contour": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.4.tgz", + "integrity": "sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-array": "*", "@types/geojson": "*" } }, "node_modules/@types/d3-delaunay": { - "version": "6.0.1", - "dev": true, - "license": "MIT" + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz", + "integrity": "sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A==", + "dev": true }, "node_modules/@types/d3-dispatch": { - "version": "3.0.2", - "dev": true, - "license": "MIT" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz", + "integrity": "sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw==", + "dev": true }, "node_modules/@types/d3-drag": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.4.tgz", + "integrity": "sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { - "version": "3.0.1", - "dev": true, - "license": "MIT" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.4.tgz", + "integrity": "sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA==", + "dev": true }, "node_modules/@types/d3-ease": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "dev": true }, "node_modules/@types/d3-fetch": { - "version": "3.0.2", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.4.tgz", + "integrity": "sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.4", - "dev": true, - "license": "MIT" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.6.tgz", + "integrity": "sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw==", + "dev": true }, "node_modules/@types/d3-format": { - "version": "3.0.1", - "dev": true, - "license": "MIT" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.2.tgz", + "integrity": "sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA==", + "dev": true }, "node_modules/@types/d3-geo": { - "version": "3.0.3", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.5.tgz", + "integrity": "sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { - "version": "3.1.2", - "dev": true, - "license": "MIT" + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz", + "integrity": "sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ==", + "dev": true }, "node_modules/@types/d3-interpolate": { - "version": "3.0.1", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz", + "integrity": "sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "dev": true }, "node_modules/@types/d3-polygon": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", + "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "dev": true }, "node_modules/@types/d3-quadtree": { - "version": "3.0.2", - "dev": true, - "license": "MIT" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz", + "integrity": "sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg==", + "dev": true }, "node_modules/@types/d3-random": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "dev": true }, "node_modules/@types/d3-scale": { - "version": "4.0.3", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.5.tgz", + "integrity": "sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "dev": true }, "node_modules/@types/d3-selection": { - "version": "3.0.5", - "dev": true, - "license": "MIT" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.7.tgz", + "integrity": "sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==", + "dev": true }, "node_modules/@types/d3-shape": { - "version": "3.1.1", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.3.tgz", + "integrity": "sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.0", - "dev": true, - "license": "MIT" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.1.tgz", + "integrity": "sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==", + "dev": true }, "node_modules/@types/d3-time-format": { - "version": "4.0.0", - "dev": true, - "license": "MIT" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.1.tgz", + "integrity": "sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q==", + "dev": true }, "node_modules/@types/d3-timer": { "version": "3.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "dev": true }, "node_modules/@types/d3-transition": { - "version": "3.0.3", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.5.tgz", + "integrity": "sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "3.0.3", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.5.tgz", + "integrity": "sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", "@types/d3-selection": "*" } }, "node_modules/@types/debug": { - "version": "4.1.8", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", + "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", "dev": true, - "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/dompurify": { "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", + "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", "dev": true, - "license": "MIT", "dependencies": { "@types/trusted-types": "*" } }, "node_modules/@types/form-data": { "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "*" @@ -4371,21 +6135,24 @@ }, "node_modules/@types/fs-extra": { "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/geojson": { - "version": "7946.0.10", - "dev": true, - "license": "MIT" + "version": "7946.0.11", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", + "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==", + "dev": true }, "node_modules/@types/glob": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/minimatch": "*", @@ -4393,137 +6160,159 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "license": "MIT" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", + "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==" }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "dev": true, - "license": "MIT" + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/lodash": { "version": "4.14.189", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", + "dev": true }, "node_modules/@types/lodash.flattendeep": { "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.7.tgz", + "integrity": "sha512-1h6GW/AeZw/Wej6uxrqgmdTDZX1yFS39lRsXYkg+3kWvOWWrlGCI6H7lXxlUHOzxDT4QeYGmgPpQ3BX9XevzOg==", "dev": true, - "license": "MIT", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/lru-cache": { "version": "5.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, "node_modules/@types/mermaid": { "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", + "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", "dev": true, - "license": "MIT", "dependencies": { "mermaid": "*" } }, "node_modules/@types/minimatch": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "dev": true, - "license": "MIT" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "dev": true }, "node_modules/@types/mocha": { "version": "9.1.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, "node_modules/@types/ms": { - "version": "0.7.31", - "dev": true, - "license": "MIT" + "version": "0.7.32", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", + "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==", + "dev": true }, "node_modules/@types/ndjson": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", + "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "@types/through": "*" } }, "node_modules/@types/node": { - "version": "20.2.5", - "license": "MIT" + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "dev": true, - "license": "MIT" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", + "dev": true }, "node_modules/@types/pbkdf2": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", + "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/prettier": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/prompts": { - "version": "2.4.4", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.5.tgz", + "integrity": "sha512-TvrzGMCwARi2qqXcD7VmvMvfMP3F7JRQpeEHECK0oufRNZInoBqzd8v/1zksKFE5XW8OOGto/5FsDT8lnpvGRA==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*", "kleur": "^3.0.3" } }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "dev": true, - "license": "MIT" + "version": "15.7.8", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", + "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "dev": true }, "node_modules/@types/qs": { - "version": "6.9.7", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/@types/react": { - "version": "18.2.9", + "version": "18.2.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.26.tgz", + "integrity": "sha512-ZaMtQo/fasHwMSRTED+u4Cjnkl0uuqEFJ2rKF0DQXji1v24DaNdSe9am4ldiDKFD/MpzbyS8UEOceh1/Oiw89g==", "dev": true, - "license": "MIT", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -4531,62 +6320,71 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.4", + "version": "18.2.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.11.tgz", + "integrity": "sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg==", "dev": true, - "license": "MIT", "dependencies": { "@types/react": "*" } }, "node_modules/@types/readable-stream": { "version": "2.3.15", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", "dependencies": { "@types/node": "*", "safe-buffer": "~5.1.1" } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "license": "MIT", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz", + "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.3", - "dev": true, - "license": "MIT" + "version": "0.16.4", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", + "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "dev": true }, "node_modules/@types/secp256k1": { - "version": "4.0.3", - "license": "MIT", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", + "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.0", - "dev": true, - "license": "MIT" + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.15", + "version": "10.0.19", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", + "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", "dev": true, - "license": "MIT", "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "dev": true, - "license": "MIT" + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", + "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", + "dev": true }, "node_modules/@types/styled-components": { "version": "5.1.26", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", + "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", "dev": true, - "license": "MIT", "dependencies": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -4594,22 +6392,25 @@ } }, "node_modules/@types/through": { - "version": "0.0.30", + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.31.tgz", + "integrity": "sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==", "dev": true, - "license": "MIT", "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { - "version": "2.0.3", - "dev": true, - "license": "MIT" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", + "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/experimental-utils": "4.31.2", "@typescript-eslint/scope-manager": "4.31.2", @@ -4638,8 +6439,9 @@ }, "node_modules/@typescript-eslint/experimental-utils": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, - "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", "@typescript-eslint/scope-manager": "4.31.2", @@ -4661,8 +6463,9 @@ }, "node_modules/@typescript-eslint/parser": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/scope-manager": "4.31.2", "@typescript-eslint/types": "4.31.2", @@ -4687,8 +6490,9 @@ }, "node_modules/@typescript-eslint/scope-manager": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2" @@ -4702,12 +6506,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4728,9 +6533,10 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4740,12 +6546,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4766,11 +6573,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4782,9 +6590,10 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4794,8 +6603,9 @@ }, "node_modules/@typescript-eslint/types": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true, - "license": "MIT", "engines": { "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, @@ -4806,8 +6616,9 @@ }, "node_modules/@typescript-eslint/typescript-estree": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "@typescript-eslint/types": "4.31.2", "@typescript-eslint/visitor-keys": "4.31.2", @@ -4831,16 +6642,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -4856,12 +6668,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4872,9 +6685,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4884,12 +6698,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4910,11 +6725,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4926,9 +6742,10 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4938,8 +6755,9 @@ }, "node_modules/@typescript-eslint/visitor-keys": { "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, - "license": "MIT", "dependencies": { "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" @@ -4954,17 +6772,20 @@ }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true }, "node_modules/@vitejs/plugin-react": { - "version": "4.0.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", + "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/core": "^7.21.4", - "@babel/plugin-transform-react-jsx-self": "^7.21.0", - "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "@babel/core": "^7.22.20", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "@types/babel__core": "^7.20.2", "react-refresh": "^0.14.0" }, "engines": { @@ -4976,17 +6797,20 @@ }, "node_modules/abbrev": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", + "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, "node_modules/abstract-level": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", + "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", "dependencies": { "buffer": "^6.0.3", "catering": "^2.1.0", @@ -5002,7 +6826,8 @@ }, "node_modules/accepts": { "version": "1.3.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -5013,8 +6838,9 @@ }, "node_modules/acorn": { "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5024,24 +6850,27 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/address": { "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 10.0.0" @@ -5049,18 +6878,21 @@ }, "node_modules/adm-zip": { "version": "0.4.16", - "license": "MIT", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", "engines": { "node": ">=0.3.0" } }, "node_modules/aes-js": { - "version": "3.0.0", - "license": "MIT" + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" }, "node_modules/agent-base": { "version": "6.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dependencies": { "debug": "4" }, @@ -5070,7 +6902,8 @@ }, "node_modules/aggregate-error": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -5081,7 +6914,8 @@ }, "node_modules/ajv": { "version": "6.12.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -5095,8 +6929,9 @@ }, "node_modules/amdefine": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", "dev": true, - "license": "BSD-3-Clause OR MIT", "optional": true, "peer": true, "engines": { @@ -5105,14 +6940,16 @@ }, "node_modules/ansi-colors": { "version": "4.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "engines": { "node": ">=6" } }, "node_modules/ansi-escapes": { "version": "4.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dependencies": { "type-fest": "^0.21.3" }, @@ -5125,34 +6962,42 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "engines": { "node": ">=8" } }, "node_modules/ansi-sequence-parser": { - "version": "1.1.0", - "dev": true, - "license": "MIT" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true }, "node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/antlr4ts": { "version": "0.5.0-alpha.4", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", + "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", + "dev": true }, "node_modules/anymatch": { "version": "3.1.3", - "license": "ISC", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5163,8 +7008,9 @@ }, "node_modules/append-transform": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", "dev": true, - "license": "MIT", "dependencies": { "default-require-extensions": "^3.0.0" }, @@ -5174,26 +7020,30 @@ }, "node_modules/archy": { "version": "1.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true }, "node_modules/arg": { "version": "4.1.3", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true }, "node_modules/argparse": { "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, - "license": "MIT", "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-back": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", + "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" @@ -5201,8 +7051,9 @@ }, "node_modules/array-buffer-byte-length": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-array-buffer": "^3.0.1" @@ -5213,17 +7064,19 @@ }, "node_modules/array-flatten": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.6", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -5235,29 +7088,32 @@ }, "node_modules/array-union": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/array-uniq": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -5267,17 +7123,19 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.reduce": { - "version": "1.0.5", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -5288,65 +7146,75 @@ }, "node_modules/arrify": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/asap": { "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/asn1": { "version": "0.2.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", "dependencies": { "safer-buffer": "~2.1.0" } }, "node_modules/assert-plus": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "engines": { "node": ">=0.8" } }, "node_modules/assertion-error": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "engines": { "node": "*" } }, "node_modules/astral-regex": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/async": { "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/async-limiter": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "node_modules/asynckit": { "version": "0.4.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/at-least-node": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", "dev": true, - "license": "ISC", "peer": true, "engines": { "node": ">= 4.0.0" @@ -5354,7 +7222,8 @@ }, "node_modules/available-typed-arrays": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", "engines": { "node": ">= 0.4" }, @@ -5364,23 +7233,38 @@ }, "node_modules/aws-sign2": { "version": "0.7.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "engines": { "node": "*" } }, "node_modules/aws4": { "version": "1.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dev": true, + "peer": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "node_modules/babel-plugin-styled-components": { - "version": "2.1.3", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "babel-plugin-syntax-jsx": "^6.18.0", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", "lodash": "^4.17.21", "picomatch": "^2.3.1" }, @@ -5388,24 +7272,23 @@ "styled-components": ">= 2" } }, - "node_modules/babel-plugin-syntax-jsx": { - "version": "6.18.0", - "dev": true, - "license": "MIT" - }, "node_modules/balanced-match": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "3.0.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", + "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", "dependencies": { "safe-buffer": "^5.0.1" } }, "node_modules/base64-js": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "funding": [ { "type": "github", @@ -5419,35 +7302,39 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dependencies": { "tweetnacl": "^0.14.3" } }, "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { "version": "0.14.5", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/bech32": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", "dev": true, - "license": "Unlicense", "engines": { "node": ">=0.6" } }, "node_modules/big.js": { "version": "6.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", + "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", "engines": { "node": "*" }, @@ -5458,40 +7345,47 @@ }, "node_modules/bigint-crypto-utils": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", + "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", "engines": { "node": ">=14.0.0" } }, "node_modules/bignumber.js": { - "version": "9.1.0", - "license": "MIT", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", + "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", "engines": { "node": "*" } }, "node_modules/binary-extensions": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { "node": ">=8" } }, "node_modules/blakejs": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", + "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" }, "node_modules/bluebird": { "version": "3.7.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/bn.js": { "version": "5.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { "version": "1.20.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5513,14 +7407,16 @@ }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/body-parser/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5530,11 +7426,13 @@ }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/body-parser/node_modules/qs": { "version": "6.11.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -5547,12 +7445,14 @@ }, "node_modules/boolbase": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/bplist-parser": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", "dev": true, - "license": "MIT", "dependencies": { "big-integer": "^1.6.44" }, @@ -5562,7 +7462,8 @@ }, "node_modules/brace-expansion": { "version": "1.1.11", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5570,7 +7471,8 @@ }, "node_modules/braces": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { "fill-range": "^7.0.1" }, @@ -5580,11 +7482,13 @@ }, "node_modules/brorand": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, "node_modules/browser-level": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", + "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.1", @@ -5594,11 +7498,13 @@ }, "node_modules/browser-stdout": { "version": "1.3.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify-aes": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -5609,7 +7515,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.7", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5625,12 +7533,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -5641,14 +7548,16 @@ }, "node_modules/bs58": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", + "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", "dependencies": { "base-x": "^3.0.2" } }, "node_modules/bs58check": { "version": "2.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", + "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", "dependencies": { "bs58": "^4.0.0", "create-hash": "^1.1.0", @@ -5657,6 +7566,8 @@ }, "node_modules/buffer": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "funding": [ { "type": "github", @@ -5671,7 +7582,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" @@ -5679,20 +7589,24 @@ }, "node_modules/buffer-from": { "version": "1.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-to-arraybuffer": { "version": "0.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", + "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" }, "node_modules/buffer-xor": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/bufferutil": { "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -5702,8 +7616,9 @@ }, "node_modules/bundle-name": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, - "license": "MIT", "dependencies": { "run-applescript": "^5.0.0" }, @@ -5714,32 +7629,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/busboy": { - "version": "1.6.0", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, "node_modules/bytes": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { "node": ">= 0.8" } }, "node_modules/cacheable-lookup": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", + "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", "engines": { "node": ">=10.6.0" } }, "node_modules/cacheable-request": { "version": "7.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -5755,7 +7664,8 @@ }, "node_modules/cacheable-request/node_modules/get-stream": { "version": "5.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "dependencies": { "pump": "^3.0.0" }, @@ -5768,15 +7678,17 @@ }, "node_modules/cacheable-request/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/caching-transform": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", "dev": true, - "license": "MIT", "dependencies": { "hasha": "^5.0.0", "make-dir": "^3.0.0", @@ -5789,7 +7701,8 @@ }, "node_modules/call-bind": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -5800,15 +7713,17 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camel-case": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.1" @@ -5816,16 +7731,18 @@ }, "node_modules/camelcase": { "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/camelcase-keys": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", + "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", "dev": true, - "license": "MIT", "dependencies": { "camelcase": "^7.0.0", "map-obj": "^4.3.0", @@ -5841,8 +7758,9 @@ }, "node_modules/camelcase-keys/node_modules/camelcase": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -5852,8 +7770,9 @@ }, "node_modules/camelcase-keys/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -5863,14 +7782,17 @@ }, "node_modules/camelize": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001497", + "version": "1.0.30001546", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", + "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", "dev": true, "funding": [ { @@ -5885,50 +7807,52 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/case": { "version": "1.6.3", - "license": "(MIT OR GPL-3.0-or-later)", + "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", + "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", "engines": { "node": ">= 0.8.0" } }, "node_modules/caseless": { "version": "0.12.0", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/catering": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", + "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", "engines": { "node": ">=6" } }, "node_modules/cbor": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "peer": true, + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", + "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", "dependencies": { "nofilter": "^3.1.0" }, "engines": { - "node": ">=12.19" + "node": ">=16" } }, "node_modules/chai": { - "version": "4.3.7", - "license": "MIT", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -5936,8 +7860,9 @@ }, "node_modules/chai-as-promised": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", "dev": true, - "license": "WTFPL", "dependencies": { "check-error": "^1.0.2" }, @@ -5946,20 +7871,24 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/change-case": { "version": "3.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", "dependencies": { "camel-case": "^3.0.0", "constant-case": "^2.0.0", @@ -5983,23 +7912,29 @@ }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" } }, "node_modules/check-error": { - "version": "1.0.2", - "license": "MIT", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } }, "node_modules/cheerio": { "version": "1.0.0-rc.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -6018,7 +7953,8 @@ }, "node_modules/cheerio-select": { "version": "2.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", "dependencies": { "boolbase": "^1.0.0", "css-select": "^5.1.0", @@ -6033,13 +7969,14 @@ }, "node_modules/chokidar": { "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "funding": [ { "type": "individual", "url": "https://paulmillr.com/funding/" } ], - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -6058,15 +7995,19 @@ }, "node_modules/chownr": { "version": "1.1.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/ci-info": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "node_modules/cids": { "version": "0.7.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", + "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "buffer": "^5.5.0", "class-is": "^1.1.0", @@ -6081,6 +8022,8 @@ }, "node_modules/cids/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -6095,7 +8038,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -6103,7 +8045,9 @@ }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", + "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "buffer": "^5.6.0", "varint": "^5.0.0" @@ -6111,7 +8055,8 @@ }, "node_modules/cipher-base": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -6119,12 +8064,14 @@ }, "node_modules/class-is": { "version": "1.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", + "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, "node_modules/classic-level": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", + "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "abstract-level": "^1.0.2", "catering": "^2.1.0", @@ -6138,20 +8085,23 @@ }, "node_modules/classnames": { "version": "2.3.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "dev": true }, "node_modules/clean-stack": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "engines": { "node": ">=6" } }, "node_modules/cli-table3": { "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "object-assign": "^4.1.0", @@ -6166,8 +8116,9 @@ }, "node_modules/cli-table3/node_modules/ansi-regex": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -6175,8 +8126,9 @@ }, "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -6184,8 +8136,9 @@ }, "node_modules/cli-table3/node_modules/string-width": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "is-fullwidth-code-point": "^2.0.0", @@ -6197,8 +8150,9 @@ }, "node_modules/cli-table3/node_modules/strip-ansi": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ansi-regex": "^3.0.0" @@ -6209,58 +8163,18 @@ }, "node_modules/cliui": { "version": "7.0.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/cliui/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clone-response": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -6270,33 +8184,41 @@ }, "node_modules/code-point-at": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "engines": { "node": ">=0.10.0" } }, "node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colors": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", + "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -6306,12 +8228,14 @@ }, "node_modules/command-exists": { "version": "1.2.9", - "license": "MIT" + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "node_modules/command-line-args": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", + "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.1.0", @@ -6325,8 +8249,9 @@ }, "node_modules/command-line-usage": { "version": "6.1.3", + "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", + "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.2", @@ -6338,19 +8263,99 @@ "node": ">=8.0.0" } }, + "node_modules/command-line-usage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/command-line-usage/node_modules/array-back": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" } }, + "node_modules/command-line-usage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/command-line-usage/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/command-line-usage/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -6358,28 +8363,32 @@ }, "node_modules/commander": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true, - "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/commondir": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true }, "node_modules/concat-map": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "engines": [ "node >= 0.8" ], - "license": "MIT", "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -6390,14 +8399,16 @@ }, "node_modules/concat-stream/node_modules/isarray": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/concat-stream/node_modules/readable-stream": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "core-util-is": "~1.0.0", @@ -6411,8 +8422,9 @@ }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "safe-buffer": "~5.1.0" @@ -6420,7 +8432,8 @@ }, "node_modules/constant-case": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", "dependencies": { "snake-case": "^2.1.0", "upper-case": "^1.1.1" @@ -6428,7 +8441,8 @@ }, "node_modules/content-disposition": { "version": "0.5.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dependencies": { "safe-buffer": "5.2.1" }, @@ -6438,6 +8452,8 @@ }, "node_modules/content-disposition/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -6451,12 +8467,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/content-hash": { "version": "2.5.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", + "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", "dependencies": { "cids": "^0.7.1", "multicodec": "^0.5.5", @@ -6465,34 +8481,40 @@ }, "node_modules/content-type": { "version": "1.0.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "engines": { "node": ">= 0.6" } }, "node_modules/convert-source-map": { - "version": "1.9.0", - "dev": true, - "license": "MIT" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { "version": "0.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "engines": { "node": ">= 0.6" } }, "node_modules/cookie-signature": { "version": "1.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/core-util-is": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" }, "node_modules/cors": { "version": "2.8.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", "dependencies": { "object-assign": "^4", "vary": "^1" @@ -6503,15 +8525,17 @@ }, "node_modules/cose-base": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", "dev": true, - "license": "MIT", "dependencies": { "layout-base": "^1.0.0" } }, "node_modules/crc-32": { "version": "1.2.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", "bin": { "crc32": "bin/crc32.njs" }, @@ -6521,7 +8545,8 @@ }, "node_modules/create-hash": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dependencies": { "cipher-base": "^1.0.1", "inherits": "^2.0.1", @@ -6532,7 +8557,8 @@ }, "node_modules/create-hmac": { "version": "1.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dependencies": { "cipher-base": "^1.0.3", "create-hash": "^1.1.0", @@ -6544,20 +8570,23 @@ }, "node_modules/create-require": { "version": "1.1.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true }, "node_modules/cross-fetch": { - "version": "3.1.6", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", "dependencies": { - "node-fetch": "^2.6.11" + "node-fetch": "^2.6.12" } }, "node_modules/cross-spawn": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -6569,16 +8598,18 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { "node": "*" } }, "node_modules/crypto-addr-codec": { - "version": "0.1.7", - "license": "MIT", + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", + "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", "dependencies": { "base-x": "^3.0.8", "big-integer": "1.6.36", @@ -6591,13 +8622,16 @@ }, "node_modules/crypto-addr-codec/node_modules/big-integer": { "version": "1.6.36", - "license": "Unlicense", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", + "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", "engines": { "node": ">=0.6" } }, "node_modules/crypto-addr-codec/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -6611,13 +8645,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/crypto-random-string": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^1.0.1" }, @@ -6630,8 +8664,9 @@ }, "node_modules/crypto-random-string/node_modules/type-fest": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -6641,15 +8676,17 @@ }, "node_modules/css-color-keywords": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", "dev": true, - "license": "ISC", "engines": { "node": ">=4" } }, "node_modules/css-select": { "version": "5.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", @@ -6663,8 +8700,9 @@ }, "node_modules/css-to-react-native": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "dev": true, - "license": "MIT", "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -6673,7 +8711,8 @@ }, "node_modules/css-what": { "version": "6.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "engines": { "node": ">= 6" }, @@ -6683,13 +8722,15 @@ }, "node_modules/csstype": { "version": "3.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true }, "node_modules/cytoscape": { - "version": "3.25.0", + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", + "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", "dev": true, - "license": "MIT", "dependencies": { "heap": "^0.2.6", "lodash": "^4.17.21" @@ -6700,8 +8741,9 @@ }, "node_modules/cytoscape-cose-bilkent": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", "dev": true, - "license": "MIT", "dependencies": { "cose-base": "^1.0.0" }, @@ -6711,8 +8753,9 @@ }, "node_modules/cytoscape-fcose": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", "dev": true, - "license": "MIT", "dependencies": { "cose-base": "^2.2.0" }, @@ -6722,20 +8765,23 @@ }, "node_modules/cytoscape-fcose/node_modules/cose-base": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", "dev": true, - "license": "MIT", "dependencies": { "layout-base": "^2.0.0" } }, "node_modules/cytoscape-fcose/node_modules/layout-base": { "version": "2.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true }, "node_modules/d": { "version": "1.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dependencies": { "es5-ext": "^0.10.50", "type": "^1.0.1" @@ -6743,8 +8789,9 @@ }, "node_modules/d3": { "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -6783,8 +8830,9 @@ }, "node_modules/d3-array": { "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dev": true, - "license": "ISC", "dependencies": { "internmap": "1 - 2" }, @@ -6794,16 +8842,18 @@ }, "node_modules/d3-axis": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-brush": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dev": true, - "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -6817,8 +8867,9 @@ }, "node_modules/d3-chord": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dev": true, - "license": "ISC", "dependencies": { "d3-path": "1 - 3" }, @@ -6828,16 +8879,18 @@ }, "node_modules/d3-color": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-contour": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "^3.2.0" }, @@ -6847,8 +8900,9 @@ }, "node_modules/d3-delaunay": { "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dev": true, - "license": "ISC", "dependencies": { "delaunator": "5" }, @@ -6858,16 +8912,18 @@ }, "node_modules/d3-dispatch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-drag": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dev": true, - "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -6878,8 +8934,9 @@ }, "node_modules/d3-dsv": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dev": true, - "license": "ISC", "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -6902,16 +8959,18 @@ }, "node_modules/d3-ease": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=12" } }, "node_modules/d3-fetch": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dev": true, - "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" }, @@ -6921,8 +8980,9 @@ }, "node_modules/d3-force": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dev": true, - "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -6934,16 +8994,18 @@ }, "node_modules/d3-format": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-geo": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -6953,16 +9015,18 @@ }, "node_modules/d3-hierarchy": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-interpolate": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dev": true, - "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -6972,40 +9036,45 @@ }, "node_modules/d3-path": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-polygon": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-quadtree": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-random": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-scale": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -7019,8 +9088,9 @@ }, "node_modules/d3-scale-chromatic": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dev": true, - "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -7031,16 +9101,18 @@ }, "node_modules/d3-selection": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-shape": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dev": true, - "license": "ISC", "dependencies": { "d3-path": "^3.1.0" }, @@ -7050,8 +9122,9 @@ }, "node_modules/d3-time": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dev": true, - "license": "ISC", "dependencies": { "d3-array": "2 - 3" }, @@ -7061,8 +9134,9 @@ }, "node_modules/d3-time-format": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dev": true, - "license": "ISC", "dependencies": { "d3-time": "1 - 3" }, @@ -7072,16 +9146,18 @@ }, "node_modules/d3-timer": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/d3-transition": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dev": true, - "license": "ISC", "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -7098,8 +9174,9 @@ }, "node_modules/d3-zoom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dev": true, - "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -7112,9 +9189,10 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.10", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", + "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", "dev": true, - "license": "MIT", "dependencies": { "d3": "^7.8.2", "lodash-es": "^4.17.21" @@ -7122,7 +9200,8 @@ }, "node_modules/dashdash": { "version": "1.14.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dependencies": { "assert-plus": "^1.0.0" }, @@ -7131,18 +9210,22 @@ } }, "node_modules/dayjs": { - "version": "1.11.8", - "dev": true, - "license": "MIT" + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", + "dev": true }, "node_modules/death": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", + "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", "dev": true, "peer": true }, "node_modules/debug": { "version": "4.3.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -7157,15 +9240,17 @@ }, "node_modules/decamelize": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "engines": { "node": ">=0.10.0" } }, "node_modules/decamelize-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, - "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -7179,22 +9264,25 @@ }, "node_modules/decamelize-keys/node_modules/map-obj": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/decode-uri-component": { "version": "0.2.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "engines": { "node": ">=0.10" } }, "node_modules/decompress-response": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", "dependencies": { "mimic-response": "^3.1.0" }, @@ -7207,7 +9295,8 @@ }, "node_modules/decompress-response/node_modules/mimic-response": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "engines": { "node": ">=10" }, @@ -7217,7 +9306,8 @@ }, "node_modules/deep-eql": { "version": "4.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dependencies": { "type-detect": "^4.0.0" }, @@ -7227,8 +9317,9 @@ }, "node_modules/deep-extend": { "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4.0.0" @@ -7236,13 +9327,15 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/default-browser": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, - "license": "MIT", "dependencies": { "bundle-name": "^3.0.0", "default-browser-id": "^3.0.0", @@ -7258,8 +9351,9 @@ }, "node_modules/default-browser-id": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, - "license": "MIT", "dependencies": { "bplist-parser": "^0.2.0", "untildify": "^4.0.0" @@ -7273,8 +9367,9 @@ }, "node_modules/default-require-extensions": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, - "license": "MIT", "dependencies": { "strip-bom": "^4.0.0" }, @@ -7287,15 +9382,31 @@ }, "node_modules/defer-to-connect": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "engines": { "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7304,10 +9415,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, - "license": "MIT", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -7320,29 +9433,33 @@ }, "node_modules/delaunator": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", "dev": true, - "license": "ISC", "dependencies": { "robust-predicates": "^3.0.0" } }, "node_modules/delayed-stream": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "engines": { "node": ">=0.4.0" } }, "node_modules/depd": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "engines": { "node": ">= 0.8" } }, "node_modules/destroy": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7350,15 +9467,17 @@ }, "node_modules/detect-indent": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", "engines": { "node": ">=4" } }, "node_modules/detect-port": { "version": "1.5.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", + "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "address": "^1.0.1", @@ -7371,23 +9490,30 @@ }, "node_modules/diff": { "version": "5.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "engines": { "node": ">=0.3.1" } }, "node_modules/difflib": { "version": "0.2.4", + "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", + "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", "dev": true, "peer": true, "dependencies": { "heap": ">= 0.2.0" + }, + "engines": { + "node": "*" } }, "node_modules/dir-glob": { "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, - "license": "MIT", "dependencies": { "path-type": "^4.0.0" }, @@ -7396,8 +9522,9 @@ } }, "node_modules/dns-packet": { - "version": "5.6.0", - "license": "MIT", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -7407,8 +9534,9 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -7418,7 +9546,8 @@ }, "node_modules/dom-serializer": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", @@ -7429,21 +9558,25 @@ } }, "node_modules/dom-walk": { - "version": "0.1.2" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "node_modules/domelementtype": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/fb55" } - ], - "license": "BSD-2-Clause" + ] }, "node_modules/domhandler": { "version": "5.0.3", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dependencies": { "domelementtype": "^2.3.0" }, @@ -7455,13 +9588,15 @@ } }, "node_modules/dompurify": { - "version": "2.4.5", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)" + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", + "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", + "dev": true }, "node_modules/domutils": { "version": "3.1.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", @@ -7473,14 +9608,16 @@ }, "node_modules/dot-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/ecc-jsbn": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dependencies": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -7488,21 +9625,25 @@ }, "node_modules/ee-first": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.425", - "dev": true, - "license": "ISC" + "version": "1.4.544", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz", + "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==", + "dev": true }, "node_modules/elkjs": { "version": "0.8.2", - "dev": true, - "license": "EPL-2.0" + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", + "dev": true }, "node_modules/elliptic": { "version": "6.5.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -7515,30 +9656,35 @@ }, "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/encodeurl": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } }, "node_modules/end-of-stream": { "version": "1.4.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dependencies": { "once": "^1.4.0" } }, "node_modules/enhanced-resolve": { - "version": "5.14.1", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7548,10 +9694,12 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "license": "MIT", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" @@ -7559,7 +9707,8 @@ }, "node_modules/entities": { "version": "4.5.0", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "engines": { "node": ">=0.12" }, @@ -7569,30 +9718,34 @@ }, "node_modules/env-paths": { "version": "2.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", "engines": { "node": ">=6" } }, "node_modules/error-ex": { "version": "1.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { - "version": "1.21.2", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, - "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -7607,155 +9760,467 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "peer": true + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" + "node": ">=12" } }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es-to-primitive": { - "version": "1.2.1", + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=12" } }, - "node_modules/es5-ext": { - "version": "0.10.62", - "hasInstallScript": true, - "license": "ISC", - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=0.10" + "node": ">=12" } }, - "node_modules/es6-error": { - "version": "4.1.1", + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/es6-promise": { - "version": "4.2.8", - "license": "MIT" + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "license": "ISC", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/esbuild": { + "node_modules/esbuild-sunos-64": { "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" } }, - "node_modules/esbuild-darwin-64": { + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", "optional": true, "os": [ - "darwin" + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" ], "engines": { "node": ">=12" @@ -7763,26 +10228,33 @@ }, "node_modules/escalade": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } }, "node_modules/escape-html": { "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "dependencies": { "esprima": "^2.7.1", @@ -7803,8 +10275,9 @@ }, "node_modules/escodegen/node_modules/esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -7816,6 +10289,8 @@ }, "node_modules/escodegen/node_modules/estraverse": { "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", "dev": true, "peer": true, "engines": { @@ -7824,8 +10299,9 @@ }, "node_modules/escodegen/node_modules/levn": { "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2", @@ -7837,8 +10313,9 @@ }, "node_modules/escodegen/node_modules/optionator": { "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "deep-is": "~0.1.3", @@ -7854,6 +10331,8 @@ }, "node_modules/escodegen/node_modules/prelude-ls": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", "dev": true, "peer": true, "engines": { @@ -7862,6 +10341,8 @@ }, "node_modules/escodegen/node_modules/source-map": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", "dev": true, "optional": true, "peer": true, @@ -7874,8 +10355,9 @@ }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "prelude-ls": "~1.1.2" @@ -7886,8 +10368,9 @@ }, "node_modules/eslint": { "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "7.12.11", "@eslint/eslintrc": "^0.4.3", @@ -7942,8 +10425,9 @@ }, "node_modules/eslint-config-prettier": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", + "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7952,36 +10436,38 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", "dev": true, - "license": "ISC", "dependencies": { "debug": "^4.3.4", "enhanced-resolve": "^5.12.0", "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" + "is-glob": "^4.0.3" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -7990,51 +10476,15 @@ "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" }, "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/globby": { - "version": "13.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/ignore": { - "version": "5.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/eslint-import-resolver-typescript/node_modules/slash": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "eslint": "*", + "eslint-plugin-import": "*" } }, "node_modules/eslint-module-utils": { "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, - "license": "MIT", "dependencies": { "debug": "^3.2.7" }, @@ -8049,16 +10499,18 @@ }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, - "license": "MIT", "dependencies": { "array-includes": "^3.1.3", "array.prototype.flat": "^1.2.4", @@ -8085,16 +10537,18 @@ }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.0.0" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -8104,13 +10558,15 @@ }, "node_modules/eslint-plugin-import/node_modules/ms": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", + "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-utils": "^3.0.0", "ramda": "^0.27.1" @@ -8124,16 +10580,18 @@ }, "node_modules/eslint-plugin-no-only-tests": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", + "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", "dev": true, - "license": "MIT", "engines": { "node": ">=5.0.0" } }, "node_modules/eslint-plugin-prettier": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", + "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, @@ -8152,8 +10610,9 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -8163,16 +10622,18 @@ }, "node_modules/eslint-plugin-react-refresh": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", + "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", "dev": true, - "license": "MIT", "peerDependencies": { "eslint": ">=7" } }, "node_modules/eslint-scope": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -8183,8 +10644,9 @@ }, "node_modules/eslint-utils": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^2.0.0" }, @@ -8200,80 +10662,27 @@ }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10" } }, "node_modules/eslint/node_modules/@babel/code-frame": { "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/highlight": "^7.10.4" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/eslint-utils": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-visitor-keys": "^1.1.0" }, @@ -8286,16 +10695,18 @@ }, "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=4" } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -8306,29 +10717,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -8338,641 +10731,451 @@ }, "node_modules/espree": { "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "license": "ISC", - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "license": "MIT" - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.25", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.0.0-beta.146", - "@solidity-parser/parser": "^0.14.0", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^4.0.40", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^7.1.1", - "req-cwd": "^2.0.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "3.2.3", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-regex": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/bn.js": { - "version": "4.12.0", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.3.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/cliui": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/colors": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/eth-gas-reporter/node_modules/debug": { - "version": "3.2.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ms": "^2.1.1" + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/diff": { - "version": "3.5.0", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "license": "BSD-3-Clause", - "peer": true, "engines": { - "node": ">=0.3.1" + "node": ">=4" } }, - "node_modules/eth-gas-reporter/node_modules/emoji-regex": { - "version": "7.0.3", + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, - "license": "MIT", - "peer": true + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "4.0.49", + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "3.0.0", + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/flat": { - "version": "4.1.1", + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-3-Clause", - "peer": true, "dependencies": { - "is-buffer": "~2.0.3" + "estraverse": "^5.2.0" }, - "bin": { - "flat": "cli.js" + "engines": { + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/fsevents": { - "version": "2.1.3", + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "7.1.3", + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, "engines": { - "node": "*" + "node": ">=4.0" } }, - "node_modules/eth-gas-reporter/node_modules/hash.js": { - "version": "1.1.3", + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/eth-gas-reporter/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peer": true, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "engines": { - "node": ">=4" + "node": ">= 0.6" + } + }, + "node_modules/eth-ens-namehash": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", + "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", + "dependencies": { + "idna-uts46-hx": "^2.3.1", + "js-sha3": "^0.5.7" } }, - "node_modules/eth-gas-reporter/node_modules/js-sha3": { + "node_modules/eth-ens-namehash/node_modules/js-sha3": { "version": "0.5.7", - "dev": true, - "license": "MIT", - "peer": true + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "3.13.1", + "node_modules/eth-gas-reporter": { + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", + "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "@solidity-parser/parser": "^0.14.0", + "axios": "^1.5.1", + "cli-table3": "^0.5.0", + "colors": "1.4.0", + "ethereum-cryptography": "^1.0.3", + "ethers": "^5.7.2", + "fs-readdir-recursive": "^1.1.0", + "lodash": "^4.17.14", + "markdown-table": "^1.1.3", + "mocha": "^10.2.0", + "req-cwd": "^2.0.0", + "sha1": "^1.1.1", + "sync-request": "^6.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "peerDependencies": { + "@codechecks/client": "^0.1.0" + }, + "peerDependenciesMeta": { + "@codechecks/client": { + "optional": true + } } }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "3.0.0", + "node_modules/eth-gas-reporter/node_modules/@ethersproject/address": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "peer": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/eth-gas-reporter/node_modules/log-symbols": { - "version": "3.0.0", + "node_modules/eth-gas-reporter/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "license": "MIT", "peer": true, - "dependencies": { - "chalk": "^2.4.2" - }, "engines": { - "node": ">=8" + "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "3.0.4", + "node_modules/eth-gas-reporter/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } + "peer": true }, - "node_modules/eth-gas-reporter/node_modules/mkdirp": { - "version": "0.5.5", + "node_modules/eth-gas-reporter/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "balanced-match": "^1.0.0" } }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "7.2.0", + "node_modules/eth-gas-reporter/node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, - "license": "MIT", "peer": true, - "dependencies": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "node": ">=0.1.90" } }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/object.assign": { - "version": "4.1.0", + "node_modules/eth-gas-reporter/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", "dev": true, - "license": "MIT", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "peer": true, "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/eth-gas-reporter/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "p-try": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "3.0.0", + "node_modules/eth-gas-reporter/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "p-limit": "^2.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eth-gas-reporter/node_modules/readdirp": { - "version": "3.2.0", + "node_modules/eth-gas-reporter/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "picomatch": "^2.0.4" + "p-locate": "^5.0.0" }, "engines": { - "node": ">= 8" - } - }, - "node_modules/eth-gas-reporter/node_modules/scrypt-js": { - "version": "2.0.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/setimmediate": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/string-width": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" + "node": ">=10" }, - "engines": { - "node": ">=6" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "ansi-regex": "^4.1.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": ">=10" } }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "6.0.0", + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" }, "engines": { - "node": ">=6" + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" } }, - "node_modules/eth-gas-reporter/node_modules/uuid": { - "version": "2.0.1", + "node_modules/eth-gas-reporter/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "peer": true }, - "node_modules/eth-gas-reporter/node_modules/which": { - "version": "1.3.1", + "node_modules/eth-gas-reporter/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "license": "ISC", "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, "bin": { - "which": "bin/which" + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/wrap-ansi": { - "version": "5.1.0", + "node_modules/eth-gas-reporter/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/yargs": { - "version": "13.3.2", + "node_modules/eth-gas-reporter/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eth-gas-reporter/node_modules/yargs-parser": { - "version": "13.1.2", + "node_modules/eth-gas-reporter/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "ISC", "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "engines": { + "node": ">=8" } }, - "node_modules/eth-gas-reporter/node_modules/yargs-unparser": { - "version": "1.6.0", + "node_modules/eth-gas-reporter/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/eth-gas-reporter/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "peer": true + }, "node_modules/eth-lib": { "version": "0.1.29", - "license": "MIT", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", + "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", @@ -8984,11 +11187,13 @@ }, "node_modules/eth-lib/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/eth-lib/node_modules/ws": { "version": "3.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", "dependencies": { "async-limiter": "~1.0.0", "safe-buffer": "~5.1.0", @@ -8997,14 +11202,16 @@ }, "node_modules/ethereum-bloom-filters": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", + "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", "dependencies": { "js-sha3": "^0.8.0" } }, "node_modules/ethereum-cryptography": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dependencies": { "@noble/hashes": "1.2.0", "@noble/secp256k1": "1.7.1", @@ -9012,9 +11219,21 @@ "@scure/bip39": "1.1.1" } }, + "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, "node_modules/ethereum-ens": { "version": "0.8.0", - "license": "LGPL-3.0", + "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", + "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", "dependencies": { "bluebird": "^3.4.7", "eth-ens-namehash": "^2.0.0", @@ -9026,11 +11245,13 @@ }, "node_modules/ethereum-ens/node_modules/js-sha3": { "version": "0.5.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", + "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" }, "node_modules/ethereumjs-abi": { "version": "0.6.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", + "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", "dependencies": { "bn.js": "^4.11.8", "ethereumjs-util": "^6.0.0" @@ -9038,11 +11259,13 @@ }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util": { "version": "6.2.1", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", "dependencies": { "@types/bn.js": "^4.11.3", "bn.js": "^4.11.0", @@ -9055,18 +11278,22 @@ }, "node_modules/ethereumjs-util/node_modules/@types/bn.js": { "version": "4.11.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dependencies": { "@types/node": "*" } }, "node_modules/ethereumjs-util/node_modules/bn.js": { "version": "4.12.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -9086,75 +11313,41 @@ } }, "node_modules/ethers": { - "version": "5.7.2", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/ethers/node_modules/@ethersproject/address": { - "version": "5.7.0", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", + "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", "funding": [ { "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + "url": "https://github.com/sponsors/ethers-io/" }, { "type": "individual", "url": "https://www.buymeacoffee.com/ricmoo" } ], - "license": "MIT", "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" + "@adraffy/ens-normalize": "1.9.2", + "@noble/hashes": "1.1.2", + "@noble/secp256k1": "1.7.1", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" } }, + "node_modules/ethers/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, "node_modules/ethjs-unit": { "version": "0.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", + "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", "dependencies": { "bn.js": "4.11.6", "number-to-bn": "1.7.0" @@ -9166,11 +11359,13 @@ }, "node_modules/ethjs-unit/node_modules/bn.js": { "version": "4.11.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/ethjs-util": { "version": "0.1.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", + "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", "dependencies": { "is-hex-prefixed": "1.0.0", "strip-hex-prefix": "1.0.0" @@ -9182,20 +11377,23 @@ }, "node_modules/eventemitter3": { "version": "4.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" }, "node_modules/evp_bytestokey": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dependencies": { "md5.js": "^1.3.4", "safe-buffer": "^5.1.1" } }, "node_modules/execa": { - "version": "7.1.1", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.1", @@ -9216,8 +11414,9 @@ }, "node_modules/execa/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9227,7 +11426,8 @@ }, "node_modules/express": { "version": "4.18.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -9267,7 +11467,8 @@ }, "node_modules/express/node_modules/body-parser": { "version": "1.20.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -9289,21 +11490,24 @@ }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } }, "node_modules/express/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/express/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -9313,15 +11517,18 @@ }, "node_modules/express/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/express/node_modules/qs": { "version": "6.11.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { "side-channel": "^1.0.4" }, @@ -9334,7 +11541,8 @@ }, "node_modules/express/node_modules/raw-body": { "version": "2.5.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -9347,6 +11555,8 @@ }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -9360,34 +11570,38 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/ext": { "version": "1.7.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", "dependencies": { "type": "^2.7.2" } }, "node_modules/ext/node_modules/type": { "version": "2.7.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/extend": { "version": "3.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/extsprintf": { "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "engines": [ "node >=0.6.0" - ], - "license": "MIT" + ] }, "node_modules/fast-check": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", + "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", "dependencies": { "pure-rand": "^5.0.1" }, @@ -9401,17 +11615,20 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.3.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -9425,25 +11642,29 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -9453,8 +11674,9 @@ }, "node_modules/file-type": { "version": "18.5.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz", + "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", "dev": true, - "license": "MIT", "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0", @@ -9469,7 +11691,8 @@ }, "node_modules/fill-range": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9479,7 +11702,8 @@ }, "node_modules/finalhandler": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -9495,19 +11719,22 @@ }, "node_modules/finalhandler/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", "dev": true, - "license": "MIT", "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -9522,8 +11749,9 @@ }, "node_modules/find-replace": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", + "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^3.0.1" @@ -9534,7 +11762,8 @@ }, "node_modules/find-up": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dependencies": { "locate-path": "^2.0.0" }, @@ -9544,37 +11773,42 @@ }, "node_modules/flat": { "version": "5.0.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", "bin": { "flat": "cli.js" } }, "node_modules/flat-cache": { - "version": "3.0.4", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", "dev": true, - "license": "MIT", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flatted": { - "version": "3.2.7", - "dev": true, - "license": "ISC" + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9586,15 +11820,17 @@ }, "node_modules/for-each": { "version": "0.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/foreground-child": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", "dev": true, - "license": "ISC", "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^3.0.2" @@ -9605,47 +11841,57 @@ }, "node_modules/forever-agent": { "version": "0.6.1", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "engines": { "node": "*" } }, "node_modules/form-data": { - "version": "2.3.3", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "peer": true, "dependencies": { "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", + "combined-stream": "^1.0.8", "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.12" + "node": ">= 6" } }, "node_modules/form-data-encoder": { "version": "1.7.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", + "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, "node_modules/forwarded": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", "engines": { "node": ">= 0.6" } }, "node_modules/fp-ts": { "version": "1.19.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", + "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" }, "node_modules/fresh": { "version": "0.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "engines": { "node": ">= 0.6" } }, "node_modules/fromentries": { "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", "dev": true, "funding": [ { @@ -9660,12 +11906,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/fs-extra": { "version": "10.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -9677,24 +11923,29 @@ }, "node_modules/fs-minipass": { "version": "1.2.7", - "license": "ISC", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", "dependencies": { "minipass": "^2.6.0" } }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "license": "MIT", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "optional": true, "os": [ "darwin" @@ -9705,17 +11956,19 @@ }, "node_modules/function-bind": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { - "version": "1.1.5", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -9726,41 +11979,47 @@ }, "node_modules/functional-red-black-tree": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" }, "node_modules/functions-have-names": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", - "license": "ISC", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-func-name": { - "version": "2.0.0", - "license": "MIT", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "engines": { "node": "*" } }, "node_modules/get-intrinsic": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -9773,16 +12032,18 @@ }, "node_modules/get-package-type": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.0.0" } }, "node_modules/get-port": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -9790,8 +12051,9 @@ }, "node_modules/get-stdin": { "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -9801,7 +12063,8 @@ }, "node_modules/get-stream": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "engines": { "node": ">=10" }, @@ -9811,8 +12074,9 @@ }, "node_modules/get-symbol-description": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.1" @@ -9825,9 +12089,10 @@ } }, "node_modules/get-tsconfig": { - "version": "4.6.0", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", "dev": true, - "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, @@ -9837,15 +12102,17 @@ }, "node_modules/getpass": { "version": "0.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dependencies": { "assert-plus": "^1.0.0" } }, "node_modules/ghost-testrpc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", + "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "chalk": "^2.4.2", @@ -9855,9 +12122,88 @@ "testrpc-sc": "index.js" } }, + "node_modules/ghost-testrpc/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "peer": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/ghost-testrpc/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, + "peer": true + }, + "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ghost-testrpc/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ghost-testrpc/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/glob": { "version": "7.2.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9875,7 +12221,8 @@ }, "node_modules/glob-parent": { "version": "5.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dependencies": { "is-glob": "^4.0.1" }, @@ -9885,7 +12232,8 @@ }, "node_modules/global": { "version": "4.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", "dependencies": { "min-document": "^2.19.0", "process": "^0.11.10" @@ -9893,8 +12241,9 @@ }, "node_modules/global-modules": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "global-prefix": "^3.0.0" @@ -9905,8 +12254,9 @@ }, "node_modules/global-prefix": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "ini": "^1.3.5", @@ -9919,8 +12269,9 @@ }, "node_modules/global-prefix/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -9931,16 +12282,18 @@ }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/globalthis": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", "dev": true, - "license": "MIT", "dependencies": { "define-properties": "^1.1.3" }, @@ -9953,8 +12306,9 @@ }, "node_modules/globby": { "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, - "license": "MIT", "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -9972,15 +12326,17 @@ }, "node_modules/globby/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/gopd": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -9990,7 +12346,8 @@ }, "node_modules/got": { "version": "12.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", + "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", "dependencies": { "@sindresorhus/is": "^4.6.0", "@szmarczak/http-timer": "^5.0.1", @@ -10015,34 +12372,33 @@ }, "node_modules/graceful-fs": { "version": "4.2.11", - "license": "ISC" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/growl": { "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4.x" } }, "node_modules/handlebars": { - "version": "4.7.7", + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.0", + "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -10058,14 +12414,17 @@ }, "node_modules/har-schema": { "version": "2.0.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", "engines": { "node": ">=4" } }, "node_modules/har-validator": { "version": "5.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -10076,15 +12435,17 @@ }, "node_modules/hard-rejection": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/hardhat": { "version": "2.18.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", + "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -10153,8 +12514,9 @@ }, "node_modules/hardhat-gas-reporter": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", + "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-uniq": "1.0.3", @@ -10167,35 +12529,74 @@ }, "node_modules/hardhat/node_modules/ansi-colors": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "engines": { "node": ">=6" } }, + "node_modules/hardhat/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/hardhat/node_modules/argparse": { "version": "2.0.1", - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/hardhat/node_modules/brace-expansion": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } }, - "node_modules/hardhat/node_modules/escape-string-regexp": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=10" + "node_modules/hardhat/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, + "node_modules/hardhat/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/hardhat/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/hardhat/node_modules/fs-extra": { "version": "7.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -10205,16 +12606,10 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/hardhat/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/hardhat/node_modules/js-yaml": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { "argparse": "^2.0.1" }, @@ -10224,14 +12619,16 @@ }, "node_modules/hardhat/node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/hardhat/node_modules/locate-path": { "version": "6.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dependencies": { "p-locate": "^5.0.0" }, @@ -10244,7 +12641,8 @@ }, "node_modules/hardhat/node_modules/minimatch": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -10254,7 +12652,8 @@ }, "node_modules/hardhat/node_modules/mocha": { "version": "10.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -10292,7 +12691,8 @@ }, "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -10304,13 +12704,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/hardhat/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/hardhat/node_modules/nanoid": { "version": "3.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -10320,7 +12736,8 @@ }, "node_modules/hardhat/node_modules/p-limit": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10333,7 +12750,8 @@ }, "node_modules/hardhat/node_modules/p-locate": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dependencies": { "p-limit": "^3.0.2" }, @@ -10346,14 +12764,16 @@ }, "node_modules/hardhat/node_modules/path-exists": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "engines": { "node": ">=8" } }, "node_modules/hardhat/node_modules/resolve": { "version": "1.17.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dependencies": { "path-parse": "^1.0.6" }, @@ -10362,65 +12782,95 @@ } }, "node_modules/hardhat/node_modules/semver": { - "version": "6.3.0", - "license": "ISC", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, "node_modules/hardhat/node_modules/supports-color": { - "version": "8.1.1", - "license": "MIT", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" } }, "node_modules/hardhat/node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, - "node_modules/hardhat/node_modules/workerpool": { - "version": "6.2.1", - "license": "Apache-2.0" - }, + "node_modules/hardhat/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" + }, + "node_modules/hardhat/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/has": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "engines": { "node": ">= 0.4.0" } }, "node_modules/has-bigints": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -10430,7 +12880,8 @@ }, "node_modules/has-proto": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", "engines": { "node": ">= 0.4" }, @@ -10440,7 +12891,8 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -10450,7 +12902,8 @@ }, "node_modules/has-tostringtag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { "has-symbols": "^1.0.2" }, @@ -10463,7 +12916,8 @@ }, "node_modules/hash-base": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", "dependencies": { "inherits": "^2.0.4", "readable-stream": "^3.6.0", @@ -10475,6 +12929,8 @@ }, "node_modules/hash-base/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -10488,16 +12944,17 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/hash-test-vectors": { "version": "1.3.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", + "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" }, "node_modules/hash.js": { "version": "1.1.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -10505,8 +12962,9 @@ }, "node_modules/hasha": { "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^2.0.0", "type-fest": "^0.8.0" @@ -10520,22 +12978,25 @@ }, "node_modules/hasha/node_modules/type-fest": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } }, "node_modules/he": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "bin": { "he": "bin/he" } }, "node_modules/header-case": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.1.3" @@ -10543,23 +13004,27 @@ }, "node_modules/heap": { "version": "0.2.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "dev": true }, "node_modules/highlight.js": { "version": "10.7.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", "engines": { "node": "*" } }, "node_modules/highlightjs-solidity": { "version": "2.0.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", + "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" }, "node_modules/hmac-drbg": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -10568,21 +13033,24 @@ }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/hoist-non-react-statics/node_modules/react-is": { "version": "16.13.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true }, "node_modules/hosted-git-info": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", + "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^7.5.1" }, @@ -10592,19 +13060,23 @@ }, "node_modules/hosted-git-info/node_modules/lru-cache": { "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true }, "node_modules/htmlparser2": { "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -10612,7 +13084,6 @@ "url": "https://github.com/sponsors/fb55" } ], - "license": "MIT", "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", @@ -10622,8 +13093,9 @@ }, "node_modules/http-basic": { "version": "8.1.3", + "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", + "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "caseless": "^0.12.0", @@ -10637,11 +13109,13 @@ }, "node_modules/http-cache-semantics": { "version": "4.1.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http-errors": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10655,12 +13129,14 @@ }, "node_modules/http-https": { "version": "1.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", + "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" }, "node_modules/http-response-object": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/node": "^10.0.3" @@ -10668,13 +13144,15 @@ }, "node_modules/http-response-object/node_modules/@types/node": { "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/http-signature": { "version": "1.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -10687,7 +13165,8 @@ }, "node_modules/http2-wrapper": { "version": "2.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -10698,7 +13177,8 @@ }, "node_modules/http2-wrapper/node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -10708,7 +13188,8 @@ }, "node_modules/https-proxy-agent": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -10719,16 +13200,18 @@ }, "node_modules/human-signals": { "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=14.18.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -10738,7 +13221,8 @@ }, "node_modules/idna-uts46-hx": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", + "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", "dependencies": { "punycode": "2.1.0" }, @@ -10748,13 +13232,16 @@ }, "node_modules/idna-uts46-hx/node_modules/punycode": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", "engines": { "node": ">=6" } }, "node_modules/ieee754": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "funding": [ { "type": "github", @@ -10768,33 +13255,36 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "BSD-3-Clause" + ] }, "node_modules/ignore": { "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/immer": { "version": "10.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", + "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" } }, "node_modules/immutable": { - "version": "4.3.0", - "license": "MIT" + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -10808,30 +13298,34 @@ }, "node_modules/import-lazy": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "engines": { "node": ">=8" } }, "node_modules/inflight": { "version": "1.0.6", - "license": "ISC", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -10839,18 +13333,21 @@ }, "node_modules/inherits": { "version": "2.0.4", - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", "dev": true, - "license": "ISC", "peer": true }, "node_modules/internal-slot": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", "dev": true, - "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.0", "has": "^1.0.3", @@ -10862,16 +13359,18 @@ }, "node_modules/internmap": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/interpret": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 0.10" @@ -10879,28 +13378,32 @@ }, "node_modules/invert-kv": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/io-ts": { "version": "1.10.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", + "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", "dependencies": { "fp-ts": "^1.0.0" } }, "node_modules/ipaddr.js": { "version": "1.9.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "engines": { "node": ">= 0.10" } }, "node_modules/is-arguments": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10914,8 +13417,9 @@ }, "node_modules/is-array-buffer": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.2.0", @@ -10927,12 +13431,14 @@ }, "node_modules/is-arrayish": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", "dev": true, - "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" }, @@ -10942,7 +13448,8 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -10952,8 +13459,9 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -10967,6 +13475,8 @@ }, "node_modules/is-buffer": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "funding": [ { "type": "github", @@ -10981,14 +13491,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/is-callable": { "version": "1.2.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "engines": { "node": ">= 0.4" }, @@ -10997,8 +13507,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "license": "MIT", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dependencies": { "has": "^1.0.3" }, @@ -11008,8 +13519,9 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11022,8 +13534,9 @@ }, "node_modules/is-docker": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -11036,25 +13549,29 @@ }, "node_modules/is-extglob": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "engines": { "node": ">=8" } }, "node_modules/is-function": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", + "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" }, "node_modules/is-generator-function": { "version": "1.0.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11067,7 +13584,8 @@ }, "node_modules/is-glob": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dependencies": { "is-extglob": "^2.1.1" }, @@ -11077,7 +13595,8 @@ }, "node_modules/is-hex-prefixed": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", + "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", "engines": { "node": ">=6.5.0", "npm": ">=3" @@ -11085,8 +13604,9 @@ }, "node_modules/is-inside-container": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, @@ -11102,15 +13622,17 @@ }, "node_modules/is-lower-case": { "version": "1.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", "dependencies": { "lower-case": "^1.1.0" } }, "node_modules/is-negative-zero": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -11120,15 +13642,17 @@ }, "node_modules/is-number": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11141,24 +13665,27 @@ }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-plain-obj": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-regex": { "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" @@ -11172,8 +13699,9 @@ }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -11183,8 +13711,9 @@ }, "node_modules/is-stream": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11194,8 +13723,9 @@ }, "node_modules/is-string": { "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", "dev": true, - "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" }, @@ -11208,8 +13738,9 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, - "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" }, @@ -11221,14 +13752,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "license": "MIT", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -11239,11 +13767,13 @@ }, "node_modules/is-typedarray": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" }, "node_modules/is-unicode-supported": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "engines": { "node": ">=10" }, @@ -11253,19 +13783,22 @@ }, "node_modules/is-upper-case": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", "dependencies": { "upper-case": "^1.1.0" } }, "node_modules/is-utf8": { "version": "0.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" }, "node_modules/is-weakref": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2" }, @@ -11275,16 +13808,18 @@ }, "node_modules/is-windows": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-wsl": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, - "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, @@ -11294,8 +13829,9 @@ }, "node_modules/is-wsl/node_modules/is-docker": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, - "license": "MIT", "bin": { "is-docker": "cli.js" }, @@ -11307,31 +13843,36 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "dev": true, - "license": "MIT" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/isstream": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-hook": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "append-transform": "^2.0.0" }, @@ -11341,8 +13882,9 @@ }, "node_modules/istanbul-lib-instrument": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.7.5", "@istanbuljs/schema": "^0.1.2", @@ -11354,17 +13896,19 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/istanbul-lib-processinfo": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", "dev": true, - "license": "ISC", "dependencies": { "archy": "^1.0.0", "cross-spawn": "^7.0.3", @@ -11379,8 +13923,9 @@ }, "node_modules/istanbul-lib-processinfo/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -11389,41 +13934,72 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { + "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, - "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, - "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": ">=8" + "node": ">=10" } }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", @@ -11434,9 +14010,10 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" @@ -11447,12 +14024,14 @@ }, "node_modules/jju": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true }, "node_modules/js-sdsl": { "version": "4.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", + "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", "funding": { "type": "opencollective", "url": "https://opencollective.com/js-sdsl" @@ -11460,17 +14039,20 @@ }, "node_modules/js-sha3": { "version": "0.8.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/js-tokens": { "version": "4.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true }, "node_modules/js-yaml": { "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -11481,12 +14063,14 @@ }, "node_modules/jsbn": { "version": "0.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" }, "node_modules/jsesc": { "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true, - "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, @@ -11496,39 +14080,47 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true }, "node_modules/json-schema": { "version": "0.4.0", - "license": "(AFL-2.1 OR BSD-3-Clause)" + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -11538,12 +14130,14 @@ }, "node_modules/jsonc-parser": { "version": "3.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true }, "node_modules/jsonfile": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { "universalify": "^2.0.0" }, @@ -11553,8 +14147,9 @@ }, "node_modules/jsonschema": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": "*" @@ -11562,7 +14157,8 @@ }, "node_modules/jsprim": { "version": "1.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", "dependencies": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -11575,13 +14171,15 @@ }, "node_modules/just-extend": { "version": "4.2.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true }, "node_modules/keccak": { - "version": "3.0.3", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", + "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-addon-api": "^2.0.0", "node-gyp-build": "^4.2.0", @@ -11592,46 +14190,54 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "license": "MIT", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/khroma": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", "dev": true }, "node_modules/kind-of": { "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/klaw": { "version": "1.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", "optionalDependencies": { "graceful-fs": "^4.1.9" } }, "node_modules/kleur": { "version": "3.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "engines": { "node": ">=6" } }, "node_modules/layout-base": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true }, "node_modules/lcid": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dependencies": { "invert-kv": "^1.0.0" }, @@ -11641,7 +14247,8 @@ }, "node_modules/level": { "version": "8.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", + "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", "dependencies": { "browser-level": "^1.0.1", "classic-level": "^1.2.0" @@ -11656,14 +14263,16 @@ }, "node_modules/level-supports": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", + "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", "engines": { "node": ">=12" } }, "node_modules/level-transcoder": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", + "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", "dependencies": { "buffer": "^6.0.3", "module-error": "^1.0.1" @@ -11674,8 +14283,9 @@ }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -11686,13 +14296,15 @@ }, "node_modules/lines-and-columns": { "version": "1.2.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true }, "node_modules/load-json-file": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", "dev": true, - "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", @@ -11705,15 +14317,17 @@ }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/locate-path": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" @@ -11724,56 +14338,67 @@ }, "node_modules/lodash": { "version": "4.17.21", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash-es": { "version": "4.17.21", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true }, "node_modules/lodash.assign": { "version": "4.2.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" }, "node_modules/lodash.camelcase": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.clonedeep": { "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/lodash.flattendeep": { "version": "4.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true }, "node_modules/lodash.get": { "version": "4.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true }, "node_modules/lodash.isequal": { "version": "4.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", + "dev": true }, "node_modules/lodash.merge": { "version": "4.6.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.truncate": { "version": "4.4.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true }, "node_modules/log-symbols": { "version": "4.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -11785,68 +14410,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/loose-envify": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, - "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -11856,25 +14424,29 @@ }, "node_modules/loupe": { "version": "2.3.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", "dependencies": { "get-func-name": "^2.0.0" } }, "node_modules/lower-case": { "version": "1.1.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" }, "node_modules/lower-case-first": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", "dependencies": { "lower-case": "^1.1.2" } }, "node_modules/lowercase-keys": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -11884,24 +14456,28 @@ }, "node_modules/lru_map": { "version": "0.3.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { "version": "5.1.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/lunr": { "version": "2.3.9", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", + "dev": true }, "node_modules/make-dir": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, - "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -11913,22 +14489,25 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/make-error": { "version": "1.3.6", - "devOptional": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "devOptional": true }, "node_modules/map-obj": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -11938,14 +14517,16 @@ }, "node_modules/markdown-table": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/marked": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "dev": true, - "license": "MIT", "bin": { "marked": "bin/marked.js" }, @@ -11955,14 +14536,16 @@ }, "node_modules/mcl-wasm": { "version": "0.7.9", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", + "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", "engines": { "node": ">=8.9.0" } }, "node_modules/md5.js": { "version": "1.3.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1", @@ -11971,14 +14554,16 @@ }, "node_modules/media-typer": { "version": "0.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "engines": { "node": ">= 0.6" } }, "node_modules/memory-level": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", + "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", "dependencies": { "abstract-level": "^1.0.0", "functional-red-black-tree": "^1.0.1", @@ -11990,14 +14575,17 @@ }, "node_modules/memorystream": { "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", "engines": { "node": ">= 0.10.0" } }, "node_modules/meow": { "version": "11.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", + "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", "dev": true, - "license": "MIT", "dependencies": { "@types/minimist": "^1.2.2", "camelcase-keys": "^8.0.2", @@ -12021,8 +14609,9 @@ }, "node_modules/meow/node_modules/decamelize": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", + "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -12032,8 +14621,9 @@ }, "node_modules/meow/node_modules/find-up": { "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" @@ -12047,8 +14637,9 @@ }, "node_modules/meow/node_modules/hosted-git-info": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -12058,8 +14649,9 @@ }, "node_modules/meow/node_modules/locate-path": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^6.0.0" }, @@ -12072,8 +14664,9 @@ }, "node_modules/meow/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -12083,8 +14676,9 @@ }, "node_modules/meow/node_modules/p-limit": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^1.0.0" }, @@ -12097,8 +14691,9 @@ }, "node_modules/meow/node_modules/p-locate": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^4.0.0" }, @@ -12111,8 +14706,9 @@ }, "node_modules/meow/node_modules/parse-json": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -12128,16 +14724,18 @@ }, "node_modules/meow/node_modules/path-exists": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/meow/node_modules/read-pkg": { "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, - "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^3.0.2", @@ -12153,8 +14751,9 @@ }, "node_modules/meow/node_modules/read-pkg-up": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^6.3.0", "read-pkg": "^7.1.0", @@ -12169,8 +14768,9 @@ }, "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -12180,8 +14780,9 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -12194,8 +14795,9 @@ }, "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -12204,9 +14806,10 @@ } }, "node_modules/meow/node_modules/type-fest": { - "version": "3.11.1", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=14.16" }, @@ -12216,21 +14819,24 @@ }, "node_modules/meow/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/meow/node_modules/yargs-parser": { "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/meow/node_modules/yocto-queue": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", "dev": true, - "license": "MIT", "engines": { "node": ">=12.20" }, @@ -12240,35 +14846,38 @@ }, "node_modules/merge-descriptors": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true }, "node_modules/merge2": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/mermaid": { - "version": "10.1.0", + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", + "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", "dev": true, - "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^6.0.0", - "@khanacademy/simple-markdown": "^0.8.6", "cytoscape": "^3.23.0", "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-fcose": "^2.1.0", "d3": "^7.4.0", - "dagre-d3-es": "7.0.10", + "dagre-d3-es": "7.0.9", "dayjs": "^1.11.7", - "dompurify": "2.4.5", + "dompurify": "2.4.3", "elkjs": "^0.8.2", "khroma": "^2.0.0", "lodash-es": "^4.17.21", @@ -12279,76 +14888,37 @@ "web-worker": "^1.2.0" } }, - "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { - "version": "0.8.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": ">=16.0.0" - }, - "peerDependencies": { - "react": "16.14.0", - "react-dom": "16.14.0" - } - }, - "node_modules/mermaid/node_modules/react": { - "version": "16.14.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mermaid/node_modules/react-dom": { - "version": "16.14.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/mermaid/node_modules/scheduler": { - "version": "0.19.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, "node_modules/mermaid/node_modules/uuid": { - "version": "9.0.0", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "license": "MIT", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/methods": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "engines": { "node": ">= 0.6" } }, + "node_modules/micro-ftch": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", + "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" + }, "node_modules/micromatch": { "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, - "license": "MIT", "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -12359,7 +14929,8 @@ }, "node_modules/mime": { "version": "1.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "bin": { "mime": "cli.js" }, @@ -12369,14 +14940,16 @@ }, "node_modules/mime-db": { "version": "1.52.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { "mime-db": "1.52.0" }, @@ -12386,8 +14959,9 @@ }, "node_modules/mimic-fn": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -12397,36 +14971,43 @@ }, "node_modules/mimic-response": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", "engines": { "node": ">=4" } }, "node_modules/min-document": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", "dependencies": { "dom-walk": "^0.1.0" } }, "node_modules/min-indent": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/minimalistic-assert": { "version": "1.0.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" }, "node_modules/minimatch": { "version": "3.1.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12436,15 +15017,17 @@ }, "node_modules/minimist": { "version": "1.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minimist-options": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, - "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -12456,7 +15039,8 @@ }, "node_modules/minipass": { "version": "2.9.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", "dependencies": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -12464,14 +15048,16 @@ }, "node_modules/minizlib": { "version": "1.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", "dependencies": { "minipass": "^2.9.0" } }, "node_modules/mkdirp": { "version": "0.5.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dependencies": { "minimist": "^1.2.6" }, @@ -12481,7 +15067,9 @@ }, "node_modules/mkdirp-promise": { "version": "5.0.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", + "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", + "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", "dependencies": { "mkdirp": "*" }, @@ -12491,15 +15079,17 @@ }, "node_modules/mnemonist": { "version": "0.38.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", + "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", "dependencies": { "obliterator": "^2.0.0" } }, "node_modules/mocha": { "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, - "license": "MIT", "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -12540,21 +15130,24 @@ }, "node_modules/mocha/node_modules/ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/mocha/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, - "license": "MIT", "dependencies": { "ms": "2.1.2" }, @@ -12569,24 +15162,15 @@ }, "node_modules/mocha/node_modules/debug/node_modules/ms": { "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12598,18 +15182,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mocha/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -12619,8 +15196,9 @@ }, "node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -12633,8 +15211,9 @@ }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12644,13 +15223,15 @@ }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/mocha/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -12663,8 +15244,9 @@ }, "node_modules/mocha/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -12677,16 +15259,18 @@ }, "node_modules/mocha/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -12699,22 +15283,27 @@ }, "node_modules/mock-fs": { "version": "4.14.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", + "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, "node_modules/module-error": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", + "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", "engines": { "node": ">=10" } }, "node_modules/ms": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multibase": { "version": "0.6.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", + "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -12722,6 +15311,8 @@ }, "node_modules/multibase/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -12736,7 +15327,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12744,14 +15334,17 @@ }, "node_modules/multicodec": { "version": "0.5.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", + "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "varint": "^5.0.0" } }, "node_modules/multihashes": { "version": "0.4.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", + "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", "dependencies": { "buffer": "^5.5.0", "multibase": "^0.7.0", @@ -12760,6 +15353,8 @@ }, "node_modules/multihashes/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -12774,7 +15369,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -12782,7 +15376,9 @@ }, "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", + "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", + "deprecated": "This module has been superseded by the multiformats module", "dependencies": { "base-x": "^3.0.8", "buffer": "^5.5.0" @@ -12790,16 +15386,19 @@ }, "node_modules/nano-base32": { "version": "1.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", + "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" }, "node_modules/nano-json-stream-parser": { "version": "0.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", + "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" }, "node_modules/nanoid": { "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -12809,21 +15408,25 @@ }, "node_modules/napi-macros": { "version": "2.2.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", + "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/natural-compare-lite": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true }, "node_modules/ndjson": { "version": "2.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", + "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", "dependencies": { "json-stringify-safe": "^5.0.1", "minimist": "^1.2.5", @@ -12840,25 +15443,29 @@ }, "node_modules/negotiator": { "version": "0.6.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "engines": { "node": ">= 0.6" } }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/next-tick": { "version": "1.1.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nise": { "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^2.0.0", "@sinonjs/fake-timers": "^10.0.2", @@ -12867,72 +15474,51 @@ "path-to-regexp": "^1.7.0" } }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.2.0", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "type-detect": "4.0.8" } }, "node_modules/no-case": { "version": "2.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dependencies": { "lower-case": "^1.1.1" } }, "node_modules/node-addon-api": { "version": "2.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", + "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" }, "node_modules/node-emoji": { "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "lodash": "^4.17.21" } }, - "node_modules/node-environment-flags": { - "version": "1.0.6", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, - "node_modules/node-environment-flags/node_modules/semver": { - "version": "5.7.1", - "dev": true, - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, "node_modules/node-fetch": { - "version": "2.6.11", - "license": "MIT", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dependencies": { "whatwg-url": "^5.0.0" }, @@ -12949,8 +15535,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.0", - "license": "MIT", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", + "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -12959,8 +15546,9 @@ }, "node_modules/node-preload": { "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", "dev": true, - "license": "MIT", "dependencies": { "process-on-spawn": "^1.0.0" }, @@ -12969,26 +15557,30 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "dev": true, - "license": "MIT" + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true }, "node_modules/nofilter": { "version": "3.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "engines": { "node": ">=12.19" } }, "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "dev": true }, "node_modules/nopt": { "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "abbrev": "1" @@ -12999,8 +15591,9 @@ }, "node_modules/normalize-package-data": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", + "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^5.0.0", "is-core-module": "^2.8.1", @@ -13013,14 +15606,16 @@ }, "node_modules/normalize-path": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "engines": { "node": ">=0.10.0" } }, "node_modules/normalize-url": { "version": "6.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", "engines": { "node": ">=10" }, @@ -13030,8 +15625,9 @@ }, "node_modules/npm-run-path": { "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^4.0.0" }, @@ -13044,8 +15640,9 @@ }, "node_modules/npm-run-path/node_modules/path-key": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -13055,7 +15652,8 @@ }, "node_modules/nth-check": { "version": "2.1.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dependencies": { "boolbase": "^1.0.0" }, @@ -13065,14 +15663,16 @@ }, "node_modules/number-is-nan": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/number-to-bn": { "version": "1.7.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", + "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", "dependencies": { "bn.js": "4.11.6", "strip-hex-prefix": "1.0.0" @@ -13084,12 +15684,14 @@ }, "node_modules/number-to-bn/node_modules/bn.js": { "version": "4.11.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" }, "node_modules/nyc": { "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", @@ -13128,18 +15730,26 @@ }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, - "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^6.2.0" } }, + "node_modules/nyc/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13150,8 +15760,9 @@ }, "node_modules/nyc/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13161,8 +15772,9 @@ }, "node_modules/nyc/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13175,8 +15787,9 @@ }, "node_modules/nyc/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13186,8 +15799,9 @@ }, "node_modules/nyc/node_modules/p-map": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, - "license": "MIT", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13197,37 +15811,56 @@ }, "node_modules/nyc/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/nyc/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, - "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { "node": ">=8" } }, "node_modules/nyc/node_modules/y18n": { "version": "4.0.3", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true }, "node_modules/nyc/node_modules/yargs": { "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "dev": true, - "license": "MIT", "dependencies": { "cliui": "^6.0.0", "decamelize": "^1.2.0", @@ -13247,8 +15880,9 @@ }, "node_modules/nyc/node_modules/yargs-parser": { "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", "dev": true, - "license": "ISC", "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" @@ -13259,37 +15893,42 @@ }, "node_modules/oauth-sign": { "version": "0.9.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "engines": { "node": "*" } }, "node_modules/object-assign": { "version": "4.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.12.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -13303,33 +15942,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "array.prototype.reduce": "^1.0.5", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "safe-array-concat": "^1.0.0" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.values": { - "version": "1.1.6", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -13340,18 +15961,21 @@ }, "node_modules/obliterator": { "version": "2.0.4", - "license": "MIT" + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" }, "node_modules/oboe": { "version": "2.1.5", - "license": "BSD", + "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", + "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", "dependencies": { "http-https": "^1.0.0" } }, "node_modules/on-finished": { "version": "2.4.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dependencies": { "ee-first": "1.1.1" }, @@ -13361,15 +15985,17 @@ }, "node_modules/once": { "version": "1.4.0", - "license": "ISC", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^4.0.0" }, @@ -13382,8 +16008,9 @@ }, "node_modules/open": { "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "license": "MIT", "dependencies": { "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", @@ -13399,8 +16026,9 @@ }, "node_modules/open-cli": { "version": "7.2.0", + "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", + "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", "dev": true, - "license": "MIT", "dependencies": { "file-type": "^18.2.1", "get-stdin": "^9.0.0", @@ -13419,16 +16047,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, - "license": "MIT", "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -13436,13 +16065,15 @@ }, "node_modules/ordinal": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", + "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/os-locale": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dependencies": { "lcid": "^1.0.0" }, @@ -13452,21 +16083,24 @@ }, "node_modules/os-tmpdir": { "version": "1.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "engines": { "node": ">=0.10.0" } }, "node_modules/p-cancelable": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", "engines": { "node": ">=12.20" } }, "node_modules/p-limit": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { "p-try": "^1.0.0" }, @@ -13476,7 +16110,8 @@ }, "node_modules/p-locate": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dependencies": { "p-limit": "^1.1.0" }, @@ -13486,7 +16121,8 @@ }, "node_modules/p-map": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dependencies": { "aggregate-error": "^3.0.0" }, @@ -13499,15 +16135,17 @@ }, "node_modules/p-try": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", "engines": { "node": ">=4" } }, "node_modules/package-hash": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", "dev": true, - "license": "ISC", "dependencies": { "graceful-fs": "^4.1.15", "hasha": "^5.0.0", @@ -13520,19 +16158,22 @@ }, "node_modules/pako": { "version": "1.0.11", - "license": "(MIT AND Zlib)" + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, "node_modules/param-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -13542,17 +16183,21 @@ }, "node_modules/parse-cache-control": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", "dev": true, "peer": true }, "node_modules/parse-headers": { "version": "2.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", + "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "node_modules/parse-json": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, - "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" @@ -13563,7 +16208,8 @@ }, "node_modules/parse5": { "version": "7.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dependencies": { "entities": "^4.4.0" }, @@ -13573,7 +16219,8 @@ }, "node_modules/parse5-htmlparser2-tree-adapter": { "version": "7.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", "dependencies": { "domhandler": "^5.0.2", "parse5": "^7.0.0" @@ -13584,14 +16231,16 @@ }, "node_modules/parseurl": { "version": "1.3.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "engines": { "node": ">= 0.8" } }, "node_modules/pascal-case": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", "dependencies": { "camel-case": "^3.0.0", "upper-case-first": "^1.1.0" @@ -13599,63 +16248,78 @@ }, "node_modules/path-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/path-exists": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { "node": ">=4" } }, "node_modules/path-is-absolute": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", - "license": "MIT" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, - "license": "MIT", "dependencies": { "isarray": "0.0.1" } }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, "node_modules/path-type": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pathval": { "version": "1.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", "engines": { "node": "*" } }, "node_modules/pbkdf2": { "version": "3.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dependencies": { "create-hash": "^1.1.2", "create-hmac": "^1.1.4", @@ -13669,8 +16333,9 @@ }, "node_modules/peek-readable": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", + "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", "dev": true, - "license": "MIT", "engines": { "node": ">=14.16" }, @@ -13681,16 +16346,19 @@ }, "node_modules/performance-now": { "version": "2.1.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "engines": { "node": ">=8.6" }, @@ -13700,22 +16368,25 @@ }, "node_modules/pify": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pinkie": { "version": "2.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "engines": { "node": ">=0.10.0" } }, "node_modules/pinkie-promise": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dependencies": { "pinkie": "^2.0.0" }, @@ -13725,8 +16396,9 @@ }, "node_modules/pkg-dir": { "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, @@ -13736,8 +16408,9 @@ }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -13748,8 +16421,9 @@ }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -13759,8 +16433,9 @@ }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, - "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, @@ -13773,8 +16448,9 @@ }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -13784,24 +16460,27 @@ }, "node_modules/pkg-dir/node_modules/p-try": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pkg-dir/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/pkg-up": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.1.0" }, @@ -13810,7 +16489,9 @@ } }, "node_modules/postcss": { - "version": "8.4.24", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -13826,7 +16507,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", @@ -13838,11 +16518,14 @@ }, "node_modules/postcss-value-parser": { "version": "4.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true }, "node_modules/postcss/node_modules/nanoid": { "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "dev": true, "funding": [ { @@ -13850,7 +16533,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13860,16 +16542,18 @@ }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true, - "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, @@ -13879,8 +16563,9 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -13890,8 +16575,9 @@ }, "node_modules/prettier-plugin-solidity": { "version": "1.1.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", + "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", "dev": true, - "license": "MIT", "dependencies": { "@solidity-parser/parser": "^0.16.0", "semver": "^7.3.8", @@ -13905,30 +16591,34 @@ } }, "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.0", + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, - "license": "MIT", "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } }, "node_modules/process": { "version": "0.11.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", "engines": { "node": ">= 0.6.0" } }, "node_modules/process-nextick-args": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/process-on-spawn": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", "dev": true, - "license": "MIT", "dependencies": { "fromentries": "^1.2.0" }, @@ -13938,16 +16628,18 @@ }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.4.0" } }, "node_modules/promise": { "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "asap": "~2.0.6" @@ -13955,7 +16647,8 @@ }, "node_modules/prompts": { "version": "2.4.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" @@ -13966,8 +16659,9 @@ }, "node_modules/prop-types": { "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "loose-envify": "^1.4.0", @@ -13977,13 +16671,15 @@ }, "node_modules/prop-types/node_modules/react-is": { "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/proxy-addr": { "version": "2.0.7", - "license": "MIT", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -13992,13 +16688,22 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "peer": true + }, "node_modules/psl": { "version": "1.9.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" }, "node_modules/pump": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -14006,13 +16711,16 @@ }, "node_modules/punycode": { "version": "2.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", + "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", "funding": [ { "type": "individual", @@ -14022,18 +16730,19 @@ "type": "opencollective", "url": "https://opencollective.com/fast-check" } - ], - "license": "MIT" + ] }, "node_modules/purecss": { "version": "2.2.0", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", + "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", + "dev": true }, "node_modules/qs": { "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "side-channel": "^1.0.4" @@ -14047,7 +16756,8 @@ }, "node_modules/query-string": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "dependencies": { "decode-uri-component": "^0.2.0", "object-assign": "^4.1.0", @@ -14059,6 +16769,8 @@ }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "funding": [ { "type": "github", @@ -14072,13 +16784,13 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/quick-lru": { - "version": "6.1.1", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", + "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14088,26 +16800,30 @@ }, "node_modules/ramda": { "version": "0.27.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true }, "node_modules/randombytes": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/range-parser": { "version": "1.2.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { "version": "2.5.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -14120,7 +16836,8 @@ }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", - "license": "MIT", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -14129,13 +16846,12 @@ } }, "node_modules/react": { - "version": "17.0.2", + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" + "loose-envify": "^1.1.0" }, "engines": { "node": ">=0.10.0" @@ -14143,8 +16859,9 @@ }, "node_modules/react-dom": { "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", "dev": true, - "license": "MIT", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" @@ -14153,32 +16870,27 @@ "react": "^18.2.0" } }, - "node_modules/react-dom/node_modules/scheduler": { - "version": "0.23.0", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-is": { "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/react-refresh": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-router": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.0.tgz", + "integrity": "sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==", "dev": true, - "license": "MIT", "dependencies": { "@remix-run/router": "1.6.0" }, @@ -14191,8 +16903,9 @@ }, "node_modules/react-router-dom": { "version": "6.11.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.0.tgz", + "integrity": "sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==", "dev": true, - "license": "MIT", "dependencies": { "@remix-run/router": "1.6.0", "react-router": "6.11.0" @@ -14206,9 +16919,10 @@ } }, "node_modules/react-tooltip": { - "version": "5.21.4", + "version": "5.21.5", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.5.tgz", + "integrity": "sha512-ey70qf6pBGi4U6xpyNlZAHobAhlo2dfxmImR2Bzd/DbLTsAYWz3TEaK+RMFuUZMq6hSPRbUHQSkP2rHBq4uFVg==", "dev": true, - "license": "MIT", "dependencies": { "@floating-ui/dom": "^1.0.0", "classnames": "^2.3.0" @@ -14220,8 +16934,9 @@ }, "node_modules/read-pkg": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, - "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", @@ -14233,8 +16948,9 @@ }, "node_modules/read-pkg-up": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", "dev": true, - "license": "MIT", "dependencies": { "find-up": "^2.0.0", "read-pkg": "^3.0.0" @@ -14245,13 +16961,15 @@ }, "node_modules/read-pkg/node_modules/hosted-git-info": { "version": "2.8.9", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true }, "node_modules/read-pkg/node_modules/normalize-package-data": { "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -14261,8 +16979,9 @@ }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, - "license": "MIT", "dependencies": { "pify": "^3.0.0" }, @@ -14271,16 +16990,18 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/readable-stream": { "version": "3.6.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -14292,8 +17013,9 @@ }, "node_modules/readable-web-to-node-stream": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", "dev": true, - "license": "MIT", "dependencies": { "readable-stream": "^3.6.0" }, @@ -14307,7 +17029,8 @@ }, "node_modules/readdirp": { "version": "3.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dependencies": { "picomatch": "^2.2.1" }, @@ -14317,6 +17040,8 @@ }, "node_modules/rechoir": { "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, "peer": true, "dependencies": { @@ -14328,8 +17053,9 @@ }, "node_modules/recursive-readdir": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "minimatch": "^3.0.5" @@ -14340,8 +17066,9 @@ }, "node_modules/redent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", "dev": true, - "license": "MIT", "dependencies": { "indent-string": "^5.0.0", "strip-indent": "^4.0.0" @@ -14355,8 +17082,9 @@ }, "node_modules/redent/node_modules/indent-string": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -14366,25 +17094,28 @@ }, "node_modules/reduce-flatten": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", + "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -14395,8 +17126,9 @@ }, "node_modules/regexpp": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -14406,8 +17138,9 @@ }, "node_modules/release-zalgo": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", "dev": true, - "license": "ISC", "dependencies": { "es6-error": "^4.0.1" }, @@ -14417,8 +17150,9 @@ }, "node_modules/req-cwd": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", + "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "req-from": "^2.0.0" @@ -14429,8 +17163,9 @@ }, "node_modules/req-from": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", + "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "resolve-from": "^3.0.0" @@ -14441,8 +17176,9 @@ }, "node_modules/req-from/node_modules/resolve-from": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=4" @@ -14450,7 +17186,9 @@ }, "node_modules/request": { "version": "2.88.2", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -14477,76 +17215,64 @@ "node": ">= 6" } }, - "node_modules/request-promise-core": { - "version": "1.1.4", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "lodash": "^4.17.19" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "request": "^2.34" - } - }, - "node_modules/request-promise-native": { - "version": "1.0.9", - "dev": true, - "license": "ISC", - "peer": true, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dependencies": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" }, "engines": { - "node": ">=0.12.0" - }, - "peerDependencies": { - "request": "^2.34" + "node": ">= 0.12" } }, "node_modules/request/node_modules/qs": { "version": "6.5.3", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", "engines": { "node": ">=0.6" } }, "node_modules/request/node_modules/uuid": { "version": "3.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } }, "node_modules/require-directory": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-from-string": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "engines": { "node": ">=0.10.0" } }, "node_modules/require-main-filename": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "license": "MIT", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -14559,27 +17285,31 @@ }, "node_modules/resolve-alpn": { "version": "1.2.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, - "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", "dependencies": { "lowercase-keys": "^2.0.0" }, @@ -14589,15 +17319,17 @@ }, "node_modules/responselike/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -14605,8 +17337,9 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -14619,7 +17352,8 @@ }, "node_modules/ripemd160": { "version": "2.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" @@ -14627,13 +17361,16 @@ }, "node_modules/ripemd160-min": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", + "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", "engines": { "node": ">=8" } }, "node_modules/rlp": { "version": "2.2.7", - "license": "MPL-2.0", + "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", + "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", "dependencies": { "bn.js": "^5.2.0" }, @@ -14643,28 +17380,44 @@ }, "node_modules/robust-predicates": { "version": "3.0.2", - "dev": true, - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true }, "node_modules/rollup": { - "version": "3.24.0", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.0.2.tgz", + "integrity": "sha512-MCScu4usMPCeVFaiLcgMDaBQeYi1z6vpWxz0r0hq0Hv77Y2YuOTZldkuNJ54BdYBH3e+nkrk6j0Rre/NLDBYzg==", "dev": true, - "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.0.2", + "@rollup/rollup-android-arm64": "4.0.2", + "@rollup/rollup-darwin-arm64": "4.0.2", + "@rollup/rollup-darwin-x64": "4.0.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.0.2", + "@rollup/rollup-linux-arm64-gnu": "4.0.2", + "@rollup/rollup-linux-arm64-musl": "4.0.2", + "@rollup/rollup-linux-x64-gnu": "4.0.2", + "@rollup/rollup-linux-x64-musl": "4.0.2", + "@rollup/rollup-win32-arm64-msvc": "4.0.2", + "@rollup/rollup-win32-ia32-msvc": "4.0.2", + "@rollup/rollup-win32-x64-msvc": "4.0.2", "fsevents": "~2.3.2" } }, "node_modules/run-applescript": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, - "license": "MIT", "dependencies": { "execa": "^5.0.0" }, @@ -14677,8 +17430,9 @@ }, "node_modules/run-applescript/node_modules/execa": { "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, - "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14699,24 +17453,27 @@ }, "node_modules/run-applescript/node_modules/human-signals": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/run-applescript/node_modules/mimic-fn": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-applescript/node_modules/npm-run-path": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, @@ -14726,8 +17483,9 @@ }, "node_modules/run-applescript/node_modules/onetime": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, - "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, @@ -14740,14 +17498,17 @@ }, "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -14763,13 +17524,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/run-parallel-limit": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", + "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", "funding": [ { "type": "github", @@ -14784,28 +17546,29 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/rustbn.js": { "version": "0.2.0", - "license": "(MIT OR Apache-2.0)" + "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", + "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" }, "node_modules/rw": { "version": "1.3.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true }, "node_modules/safe-array-concat": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -14816,20 +17579,16 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safe-array-concat/node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/safe-buffer": { "version": "5.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex-test": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", @@ -14841,12 +17600,14 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sc-istanbul": { "version": "0.4.6", + "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", + "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "abbrev": "1.0.x", @@ -14870,8 +17631,9 @@ }, "node_modules/sc-istanbul/node_modules/esprima": { "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", "dev": true, - "license": "BSD-2-Clause", "peer": true, "bin": { "esparse": "bin/esparse.js", @@ -14883,8 +17645,9 @@ }, "node_modules/sc-istanbul/node_modules/glob": { "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "inflight": "^1.0.4", @@ -14899,8 +17662,9 @@ }, "node_modules/sc-istanbul/node_modules/has-flag": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=0.10.0" @@ -14908,14 +17672,16 @@ }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/sc-istanbul/node_modules/supports-color": { "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "has-flag": "^1.0.0" @@ -14926,8 +17692,9 @@ }, "node_modules/sc-istanbul/node_modules/which": { "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "isexe": "^2.0.0" @@ -14936,14 +17703,25 @@ "which": "bin/which" } }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/scrypt-js": { "version": "3.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/secp256k1": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", + "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "elliptic": "^6.5.4", "node-addon-api": "^2.0.0", @@ -14955,8 +17733,9 @@ }, "node_modules/semver": { "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -14969,8 +17748,9 @@ }, "node_modules/semver/node_modules/lru-cache": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, - "license": "ISC", "dependencies": { "yallist": "^4.0.0" }, @@ -14980,12 +17760,14 @@ }, "node_modules/semver/node_modules/yallist": { "version": "4.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/send": { "version": "0.18.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -15007,22 +17789,26 @@ }, "node_modules/send/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/sentence-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", "dependencies": { "no-case": "^2.2.0", "upper-case-first": "^1.1.2" @@ -15030,14 +17816,16 @@ }, "node_modules/serialize-javascript": { "version": "6.0.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/serve-static": { "version": "1.15.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -15050,7 +17838,8 @@ }, "node_modules/servify": { "version": "0.1.12", - "license": "MIT", + "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", + "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", "dependencies": { "body-parser": "^1.16.0", "cors": "^2.8.1", @@ -15064,19 +17853,37 @@ }, "node_modules/set-blocking": { "version": "2.0.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } }, "node_modules/setimmediate": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/setprototypeof": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", - "license": "(MIT AND BSD-3-Clause)", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" @@ -15087,8 +17894,9 @@ }, "node_modules/sha1": { "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", + "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "charenc": ">= 0.0.1", @@ -15100,20 +17908,23 @@ }, "node_modules/sha3": { "version": "2.1.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", + "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", "dependencies": { "buffer": "6.0.3" } }, "node_modules/shallowequal": { "version": "1.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "dev": true }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -15123,16 +17934,18 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/shelljs": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "dependencies": { "glob": "^7.0.0", @@ -15147,9 +17960,10 @@ } }, "node_modules/shiki": { - "version": "0.14.2", + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", + "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", "dev": true, - "license": "MIT", "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", @@ -15159,7 +17973,8 @@ }, "node_modules/side-channel": { "version": "1.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -15171,11 +17986,14 @@ }, "node_modules/signal-exit": { "version": "3.0.7", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true }, "node_modules/simple-concat": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "funding": [ { "type": "github", @@ -15189,12 +18007,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/simple-get": { "version": "2.8.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", + "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", "dependencies": { "decompress-response": "^3.3.0", "once": "^1.3.1", @@ -15203,7 +18021,8 @@ }, "node_modules/simple-get/node_modules/decompress-response": { "version": "3.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", "dependencies": { "mimic-response": "^1.0.0" }, @@ -15211,28 +18030,67 @@ "node": ">=4" } }, + "node_modules/sinon": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", + "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^9.1.2", + "@sinonjs/samsam": "^7.0.1", + "diff": "^5.0.0", + "nise": "^5.1.2", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, "node_modules/sisteransi": { "version": "1.0.5", - "license": "MIT" + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" }, "node_modules/slash": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/snake-case": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", "dependencies": { "no-case": "^2.2.0" } }, "node_modules/solc": { "version": "0.7.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", + "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", "dependencies": { "command-exists": "^1.2.8", "commander": "3.0.2", @@ -15253,11 +18111,13 @@ }, "node_modules/solc/node_modules/commander": { "version": "3.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/solc/node_modules/fs-extra": { "version": "0.30.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", + "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^2.1.0", @@ -15268,14 +18128,16 @@ }, "node_modules/solc/node_modules/jsonfile": { "version": "2.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/solc/node_modules/rimraf": { "version": "2.7.1", - "license": "ISC", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dependencies": { "glob": "^7.1.3" }, @@ -15284,35 +18146,28 @@ } }, "node_modules/solc/node_modules/semver": { - "version": "5.7.1", - "license": "ISC", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } }, - "node_modules/solc/node_modules/tmp": { - "version": "0.0.33", - "license": "MIT", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/solidity-comments-extractor": { "version": "0.0.7", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", + "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", + "dev": true }, "node_modules/solidity-coverage": { - "version": "0.8.2", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz", + "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.14.1", + "@solidity-parser/parser": "^0.16.0", "chalk": "^2.4.2", "death": "^1.1.0", "detect-port": "^1.3.0", @@ -15323,7 +18178,7 @@ "globby": "^10.0.1", "jsonschema": "^1.2.4", "lodash": "^4.17.15", - "mocha": "7.1.2", + "mocha": "10.2.0", "node-emoji": "^1.10.0", "pify": "^4.0.1", "recursive-readdir": "^2.2.2", @@ -15339,108 +18194,120 @@ "hardhat": "^2.11.0" } }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "3.2.3", + "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", + "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", "dev": true, - "license": "MIT", "peer": true, - "engines": { - "node": ">=6" + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" } }, - "node_modules/solidity-coverage/node_modules/ansi-regex": { + "node_modules/solidity-coverage/node_modules/ansi-colors": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.3.0", + "node_modules/solidity-coverage/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.2.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.1.1" + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/cliui": { - "version": "5.0.0", + "node_modules/solidity-coverage/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "peer": true + }, + "node_modules/solidity-coverage/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" + "balanced-match": "^1.0.0" } }, - "node_modules/solidity-coverage/node_modules/debug": { - "version": "3.2.6", + "node_modules/solidity-coverage/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "ms": "^2.1.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/diff": { - "version": "3.5.0", + "node_modules/solidity-coverage/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "license": "BSD-3-Clause", "peer": true, "engines": { - "node": ">=0.3.1" + "node": ">=0.8.0" } }, - "node_modules/solidity-coverage/node_modules/emoji-regex": { - "version": "7.0.3", + "node_modules/solidity-coverage/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "peer": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/solidity-coverage/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/solidity-coverage/node_modules/find-up": { - "version": "3.0.0", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "locate-path": "^3.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/flat": { - "version": "4.1.1", - "dev": true, - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "is-buffer": "~2.0.3" + "node": ">=10" }, - "bin": { - "flat": "cli.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -15451,40 +18318,11 @@ "node": ">=6 <7 || >=8" } }, - "node_modules/solidity-coverage/node_modules/fsevents": { - "version": "2.1.3", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/solidity-coverage/node_modules/glob": { - "version": "7.1.3", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/solidity-coverage/node_modules/globby": { "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/glob": "^7.1.1", @@ -15502,30 +18340,22 @@ }, "node_modules/solidity-coverage/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4" } }, - "node_modules/solidity-coverage/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "3.13.1", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -15533,331 +18363,233 @@ }, "node_modules/solidity-coverage/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "3.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/log-symbols": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "chalk": "^2.4.2" + "node": ">=10" }, - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "3.0.4", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" - } - }, - "node_modules/solidity-coverage/node_modules/mkdirp": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" + "node": ">=10" } }, "node_modules/solidity-coverage/node_modules/mocha": { - "version": "7.1.2", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "ansi-colors": "3.2.3", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", - "mocha": "bin/mocha" + "mocha": "bin/mocha.js" }, "engines": { - "node": ">= 8.10.0" + "node": ">= 14.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/mochajs" } }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/solidity-coverage/node_modules/object.assign": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "p-try": "^2.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/pify": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/readdirp": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/solidity-coverage/node_modules/string-width": { - "version": "3.1.0", + "node_modules/solidity-coverage/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } + "peer": true }, - "node_modules/solidity-coverage/node_modules/strip-ansi": { - "version": "5.2.0", + "node_modules/solidity-coverage/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", "dev": true, - "license": "MIT", "peer": true, - "dependencies": { - "ansi-regex": "^4.1.0" + "bin": { + "nanoid": "bin/nanoid.cjs" }, "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/strip-json-comments": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "6.0.0", + "node_modules/solidity-coverage/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "has-flag": "^3.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/node_modules/universalify": { - "version": "0.1.2", + "node_modules/solidity-coverage/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "peer": true, + "dependencies": { + "p-limit": "^3.0.2" + }, "engines": { - "node": ">= 4.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/solidity-coverage/node_modules/which": { - "version": "1.3.1", + "node_modules/solidity-coverage/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "ISC", "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "engines": { + "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/wrap-ansi": { - "version": "5.1.0", + "node_modules/solidity-coverage/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, - "license": "MIT", "peer": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - }, "engines": { "node": ">=6" } }, - "node_modules/solidity-coverage/node_modules/y18n": { - "version": "4.0.3", - "dev": true, - "license": "ISC", - "peer": true - }, - "node_modules/solidity-coverage/node_modules/yargs": { - "version": "13.3.2", + "node_modules/solidity-coverage/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/yargs-parser": { - "version": "13.1.2", + "node_modules/solidity-coverage/node_modules/supports-color/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "ISC", "peer": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "engines": { + "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/yargs-unparser": { - "version": "1.6.0", + "node_modules/solidity-coverage/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "peer": true, - "dependencies": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, "engines": { - "node": ">=6" + "node": ">= 4.0.0" } }, + "node_modules/solidity-coverage/node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true, + "peer": true + }, "node_modules/source-map": { "version": "0.6.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", - "license": "MIT", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -15865,8 +18597,9 @@ }, "node_modules/spawn-wrap": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", "dev": true, - "license": "ISC", "dependencies": { "foreground-child": "^2.0.0", "is-windows": "^1.0.2", @@ -15881,7 +18614,8 @@ }, "node_modules/spdx-correct": { "version": "3.2.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -15889,35 +18623,41 @@ }, "node_modules/spdx-exceptions": { "version": "2.3.0", - "license": "CC-BY-3.0" + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "license": "CC0-1.0" + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" }, "node_modules/split2": { "version": "3.2.2", - "license": "ISC", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", "dependencies": { "readable-stream": "^3.0.0" } }, "node_modules/sprintf-js": { "version": "1.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true }, "node_modules/sshpk": { "version": "1.17.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -15940,11 +18680,13 @@ }, "node_modules/sshpk/node_modules/tweetnacl": { "version": "0.14.5", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "node_modules/stacktrace-parser": { "version": "0.1.10", - "license": "MIT", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", "dependencies": { "type-fest": "^0.7.1" }, @@ -15954,49 +18696,40 @@ }, "node_modules/stacktrace-parser/node_modules/type-fest": { "version": "0.7.1", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", "engines": { "node": ">=8" } }, "node_modules/statuses": { "version": "2.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "engines": { "node": ">= 0.8" } }, - "node_modules/stealthy-require": { - "version": "1.1.1", - "dev": true, - "license": "ISC", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/strict-uri-encode": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/string_decoder": { "version": "1.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dependencies": { "safe-buffer": "~5.2.0" } }, "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -16010,26 +18743,28 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/string-argv": { "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.6.19" } }, "node_modules/string-format": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", + "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", "dev": true, - "license": "WTFPL OR MIT", "peer": true }, "node_modules/string-width": { "version": "4.2.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -16040,13 +18775,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -16056,26 +18792,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -16083,7 +18821,8 @@ }, "node_modules/strip-ansi": { "version": "6.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -16093,16 +18832,18 @@ }, "node_modules/strip-bom": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16112,7 +18853,8 @@ }, "node_modules/strip-hex-prefix": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", + "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", "dependencies": { "is-hex-prefixed": "1.0.0" }, @@ -16123,8 +18865,9 @@ }, "node_modules/strip-indent": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", "dev": true, - "license": "MIT", "dependencies": { "min-indent": "^1.0.1" }, @@ -16137,7 +18880,8 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "engines": { "node": ">=8" }, @@ -16147,8 +18891,9 @@ }, "node_modules/strtok3": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", + "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", "dev": true, - "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0" @@ -16163,8 +18908,9 @@ }, "node_modules/styled-components": { "version": "5.3.10", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", + "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.0.0", "@babel/traverse": "^7.4.5", @@ -16190,14 +18936,20 @@ "react-is": ">= 16.8.0" } }, - "node_modules/stylis": { - "version": "4.2.0", + "node_modules/styled-components/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "license": "MIT" + "engines": { + "node": ">=4" + } }, - "node_modules/supports-color": { + "node_modules/styled-components/node_modules/supports-color": { "version": "5.5.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -16205,9 +18957,27 @@ "node": ">=4" } }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==", + "dev": true + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "engines": { "node": ">= 0.4" }, @@ -16217,7 +18987,8 @@ }, "node_modules/swap-case": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", "dependencies": { "lower-case": "^1.1.1", "upper-case": "^1.1.1" @@ -16225,7 +18996,8 @@ }, "node_modules/swarm-js": { "version": "0.1.42", - "license": "MIT", + "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", + "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", "dependencies": { "bluebird": "^3.5.0", "buffer": "^5.0.5", @@ -16242,7 +19014,8 @@ }, "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { "version": "4.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { "defer-to-connect": "^2.0.0" }, @@ -16252,6 +19025,8 @@ }, "node_modules/swarm-js/node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -16266,7 +19041,6 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -16274,14 +19048,16 @@ }, "node_modules/swarm-js/node_modules/cacheable-lookup": { "version": "5.0.4", - "license": "MIT", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", "engines": { "node": ">=10.6.0" } }, "node_modules/swarm-js/node_modules/fs-extra": { "version": "4.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", + "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", "dependencies": { "graceful-fs": "^4.1.2", "jsonfile": "^4.0.0", @@ -16290,7 +19066,8 @@ }, "node_modules/swarm-js/node_modules/got": { "version": "11.8.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", @@ -16313,7 +19090,8 @@ }, "node_modules/swarm-js/node_modules/http2-wrapper": { "version": "1.0.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" @@ -16324,28 +19102,32 @@ }, "node_modules/swarm-js/node_modules/jsonfile": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/p-cancelable": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", "engines": { "node": ">=8" } }, "node_modules/swarm-js/node_modules/quick-lru": { "version": "5.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "engines": { "node": ">=10" }, @@ -16355,15 +19137,17 @@ }, "node_modules/swarm-js/node_modules/universalify": { "version": "0.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { "node": ">= 4.0.0" } }, "node_modules/sync-request": { "version": "6.1.0", + "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", + "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "http-response-object": "^3.0.1", @@ -16376,8 +19160,9 @@ }, "node_modules/sync-rpc": { "version": "1.3.6", + "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", + "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "get-port": "^3.1.0" @@ -16385,8 +19170,9 @@ }, "node_modules/synckit": { "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", "dev": true, - "license": "MIT", "dependencies": { "@pkgr/utils": "^2.3.1", "tslib": "^2.5.0" @@ -16399,14 +19185,16 @@ } }, "node_modules/synckit/node_modules/tslib": { - "version": "2.5.3", - "dev": true, - "license": "0BSD" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "dev": true }, "node_modules/table": { "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -16420,8 +19208,9 @@ }, "node_modules/table-layout": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", + "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "array-back": "^4.0.1", @@ -16435,8 +19224,9 @@ }, "node_modules/table-layout/node_modules/array-back": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", + "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -16444,8 +19234,9 @@ }, "node_modules/table-layout/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -16453,8 +19244,9 @@ }, "node_modules/table/node_modules/ajv": { "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -16466,68 +19258,25 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true }, "node_modules/tapable": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar": { "version": "4.4.19", - "license": "ISC", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", "dependencies": { "chownr": "^1.1.4", "fs-minipass": "^1.2.7", @@ -16543,6 +19292,8 @@ }, "node_modules/tar/node_modules/safe-buffer": { "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "funding": [ { "type": "github", @@ -16556,24 +19307,25 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/temp-dir": { - "version": "2.0.0", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/tempy": { - "version": "3.0.0", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", + "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", "dev": true, - "license": "MIT", "dependencies": { "is-stream": "^3.0.0", - "temp-dir": "^2.0.0", + "temp-dir": "^3.0.0", "type-fest": "^2.12.2", "unique-string": "^3.0.0" }, @@ -16586,8 +19338,9 @@ }, "node_modules/tempy/node_modules/is-stream": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -16597,8 +19350,9 @@ }, "node_modules/tempy/node_modules/type-fest": { "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=12.20" }, @@ -16608,8 +19362,9 @@ }, "node_modules/test-exclude": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, - "license": "ISC", "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", @@ -16620,17 +19375,22 @@ } }, "node_modules/testrpc": { - "version": "0.0.1" + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", + "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", + "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/then-request": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", + "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/concat-stream": "^1.6.0", @@ -16651,27 +19411,46 @@ }, "node_modules/then-request/node_modules/@types/node": { "version": "8.10.66", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", + "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", "dev": true, - "license": "MIT", "peer": true }, + "node_modules/then-request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "peer": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, "node_modules/through2": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", "dependencies": { "readable-stream": "3" } }, "node_modules/timed-out": { "version": "4.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", "engines": { "node": ">=0.10.0" } }, "node_modules/title-case": { "version": "2.1.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", "dependencies": { "no-case": "^2.2.0", "upper-case": "^1.0.3" @@ -16679,8 +19458,9 @@ }, "node_modules/titleize": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16688,17 +19468,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, "node_modules/to-fast-properties": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/to-regex-range": { "version": "5.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dependencies": { "is-number": "^7.0.0" }, @@ -16708,15 +19501,17 @@ }, "node_modules/toidentifier": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "engines": { "node": ">=0.6" } }, "node_modules/token-types": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", + "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", "dev": true, - "license": "MIT", "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" @@ -16731,7 +19526,8 @@ }, "node_modules/tough-cookie": { "version": "2.5.0", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -16742,12 +19538,14 @@ }, "node_modules/tr46": { "version": "0.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/trim-newlines": { "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -16757,8 +19555,9 @@ }, "node_modules/ts-command-line-args": { "version": "2.5.1", + "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", + "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "chalk": "^4.1.0", @@ -16770,88 +19569,20 @@ "write-markdown": "dist/write-markdown.js" } }, - "node_modules/ts-command-line-args/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/ts-command-line-args/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/ts-command-line-args/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/ts-command-line-args/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-command-line-args/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/ts-dedent": { "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.10" } }, "node_modules/ts-essentials": { "version": "7.0.3", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", + "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", "dev": true, - "license": "MIT", "peer": true, "peerDependencies": { "typescript": ">=3.7.0" @@ -16859,8 +19590,9 @@ }, "node_modules/ts-node": { "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", "devOptional": true, - "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -16900,9 +19632,10 @@ } }, "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.2", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "devOptional": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -16912,16 +19645,18 @@ }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "devOptional": true, - "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/tsconfig-paths": { "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, - "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", @@ -16931,8 +19666,9 @@ }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, @@ -16942,24 +19678,28 @@ }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "1.14.1", - "license": "0BSD" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsort": { "version": "0.0.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", + "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" }, "node_modules/tsutils": { "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "license": "MIT", "dependencies": { "tslib": "^1.8.1" }, @@ -16970,9 +19710,16 @@ "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" } }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/tunnel-agent": { "version": "0.6.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dependencies": { "safe-buffer": "^5.0.1" }, @@ -16982,20 +19729,24 @@ }, "node_modules/tweetnacl": { "version": "1.0.3", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" }, "node_modules/tweetnacl-util": { "version": "0.15.1", - "license": "Unlicense" + "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "node_modules/type": { "version": "1.2.0", - "license": "ISC" + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -17005,14 +19756,16 @@ }, "node_modules/type-detect": { "version": "4.0.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", - "license": "(MIT OR CC0-1.0)", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "engines": { "node": ">=10" }, @@ -17022,7 +19775,8 @@ }, "node_modules/type-is": { "version": "1.6.18", - "license": "MIT", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17033,8 +19787,9 @@ }, "node_modules/typechain": { "version": "8.3.1", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", + "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "@types/prettier": "^2.1.1", @@ -17057,8 +19812,9 @@ }, "node_modules/typechain/node_modules/fs-extra": { "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "graceful-fs": "^4.1.2", @@ -17071,8 +19827,9 @@ }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, - "license": "ISC", "peer": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -17091,8 +19848,9 @@ }, "node_modules/typechain/node_modules/jsonfile": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "dev": true, - "license": "MIT", "peer": true, "optionalDependencies": { "graceful-fs": "^4.1.6" @@ -17100,8 +19858,9 @@ }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", "dev": true, - "license": "MIT", "peer": true, "bin": { "mkdirp": "bin/cmd.js" @@ -17112,17 +19871,70 @@ }, "node_modules/typechain/node_modules/universalify": { "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">= 4.0.0" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "for-each": "^0.3.3", @@ -17134,21 +19946,24 @@ }, "node_modules/typedarray": { "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dependencies": { "is-typedarray": "^1.0.0" } }, "node_modules/typedoc": { "version": "0.23.28", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", + "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "lunr": "^2.3.9", "marked": "^4.2.12", @@ -17167,16 +19982,18 @@ }, "node_modules/typedoc/node_modules/brace-expansion": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } }, "node_modules/typedoc/node_modules/minimatch": { "version": "7.4.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -17189,8 +20006,9 @@ }, "node_modules/typescript": { "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "devOptional": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17201,8 +20019,9 @@ }, "node_modules/typical": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -17210,8 +20029,9 @@ }, "node_modules/uglify-js": { "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "peer": true, "bin": { @@ -17223,12 +20043,14 @@ }, "node_modules/ultron": { "version": "1.1.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" }, "node_modules/unbox-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", "dev": true, - "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "has-bigints": "^1.0.2", @@ -17241,13 +20063,15 @@ }, "node_modules/underscore": { "version": "1.13.6", - "license": "MIT" + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.22.1", - "license": "MIT", + "version": "5.25.4", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.25.4.tgz", + "integrity": "sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==", "dependencies": { - "busboy": "^1.6.0" + "@fastify/busboy": "^2.0.0" }, "engines": { "node": ">=14.0" @@ -17255,8 +20079,9 @@ }, "node_modules/unique-string": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", "dev": true, - "license": "MIT", "dependencies": { "crypto-random-string": "^4.0.0" }, @@ -17269,28 +20094,33 @@ }, "node_modules/universalify": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "engines": { "node": ">= 10.0.0" } }, "node_modules/unpipe": { "version": "1.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "engines": { "node": ">= 0.8" } }, "node_modules/untildify": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -17306,7 +20136,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -17320,30 +20149,35 @@ }, "node_modules/upper-case": { "version": "1.1.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" }, "node_modules/upper-case-first": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", "dependencies": { "upper-case": "^1.1.1" } }, "node_modules/uri-js": { "version": "4.4.1", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-set-query": { "version": "1.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", + "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" }, "node_modules/utf-8-validate": { "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", "hasInstallScript": true, - "license": "MIT", "dependencies": { "node-gyp-build": "^4.3.0" }, @@ -17353,11 +20187,13 @@ }, "node_modules/utf8": { "version": "3.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" }, "node_modules/util": { "version": "0.12.5", - "license": "MIT", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -17368,65 +20204,75 @@ }, "node_modules/util-deprecate": { "version": "1.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/utils-merge": { "version": "1.0.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { "node": ">= 0.4.0" } }, "node_modules/uuid": { "version": "8.3.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", + "dev": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true }, "node_modules/validate-npm-package-license": { "version": "3.0.4", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/validator": { - "version": "13.9.0", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", + "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.10" } }, "node_modules/varint": { "version": "5.0.2", - "license": "MIT" + "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", + "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" }, "node_modules/vary": { "version": "1.1.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "engines": { "node": ">= 0.8" } }, "node_modules/verror": { "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "engines": [ "node >=0.6.0" ], - "license": "MIT", "dependencies": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -17434,13 +20280,14 @@ } }, "node_modules/vite": { - "version": "4.3.9", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", + "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", "dev": true, - "license": "MIT", "dependencies": { - "esbuild": "^0.17.5", - "postcss": "^8.4.23", - "rollup": "^3.21.0" + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" }, "bin": { "vite": "bin/vite.js" @@ -17448,12 +20295,16 @@ "engines": { "node": "^14.18.0 || >=16.0.0" }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@types/node": ">= 14", "less": "*", + "lightningcss": "^1.21.0", "sass": "*", "stylus": "*", "sugarss": "*", @@ -17466,6 +20317,9 @@ "less": { "optional": true }, + "lightningcss": { + "optional": true + }, "sass": { "optional": true }, @@ -17482,8 +20336,9 @@ }, "node_modules/vite-plugin-singlefile": { "version": "0.13.5", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz", + "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==", "dev": true, - "license": "MIT", "dependencies": { "micromatch": "^4.0.5" }, @@ -17495,11 +20350,44 @@ "vite": ">=3.2.0" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/esbuild": { - "version": "0.17.19", + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -17507,66 +20395,87 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.19", - "@esbuild/android-arm64": "0.17.19", - "@esbuild/android-x64": "0.17.19", - "@esbuild/darwin-arm64": "0.17.19", - "@esbuild/darwin-x64": "0.17.19", - "@esbuild/freebsd-arm64": "0.17.19", - "@esbuild/freebsd-x64": "0.17.19", - "@esbuild/linux-arm": "0.17.19", - "@esbuild/linux-arm64": "0.17.19", - "@esbuild/linux-ia32": "0.17.19", - "@esbuild/linux-loong64": "0.17.19", - "@esbuild/linux-mips64el": "0.17.19", - "@esbuild/linux-ppc64": "0.17.19", - "@esbuild/linux-riscv64": "0.17.19", - "@esbuild/linux-s390x": "0.17.19", - "@esbuild/linux-x64": "0.17.19", - "@esbuild/netbsd-x64": "0.17.19", - "@esbuild/openbsd-x64": "0.17.19", - "@esbuild/sunos-x64": "0.17.19", - "@esbuild/win32-arm64": "0.17.19", - "@esbuild/win32-ia32": "0.17.19", - "@esbuild/win32-x64": "0.17.19" + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/vite/node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" } }, "node_modules/vscode-oniguruma": { "version": "1.7.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true }, "node_modules/vscode-textmate": { "version": "8.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true }, "node_modules/web-worker": { "version": "1.2.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "dev": true }, "node_modules/web3": { - "version": "1.10.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.2.tgz", + "integrity": "sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" + "web3-bzz": "1.10.2", + "web3-core": "1.10.2", + "web3-eth": "1.10.2", + "web3-eth-personal": "1.10.2", + "web3-net": "1.10.2", + "web3-shh": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.10.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.2.tgz", + "integrity": "sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { "@types/node": "^12.12.6", "got": "12.1.0", @@ -17578,52 +20487,57 @@ }, "node_modules/web3-bzz/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-core": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.2.tgz", + "integrity": "sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==", "dependencies": { "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" + "web3-core-helpers": "1.10.2", + "web3-core-method": "1.10.2", + "web3-core-requestmanager": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", + "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", "dependencies": { - "web3-eth-iban": "1.10.0", - "web3-utils": "1.10.0" + "web3-eth-iban": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.2.tgz", + "integrity": "sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==", "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" + "web3-core-helpers": "1.10.2", + "web3-core-promievent": "1.10.2", + "web3-core-subscriptions": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", + "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -17632,25 +20546,27 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.2.tgz", + "integrity": "sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==", "dependencies": { "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" + "web3-core-helpers": "1.10.2", + "web3-providers-http": "1.10.2", + "web3-providers-ipc": "1.10.2", + "web3-providers-ws": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.2.tgz", + "integrity": "sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" + "web3-core-helpers": "1.10.2" }, "engines": { "node": ">=8.0.0" @@ -17658,169 +20574,157 @@ }, "node_modules/web3-core/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" + }, + "node_modules/web3-core/node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } }, "node_modules/web3-eth": { - "version": "1.10.0", - "license": "LGPL-3.0", - "dependencies": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.2.tgz", + "integrity": "sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==", + "dependencies": { + "web3-core": "1.10.2", + "web3-core-helpers": "1.10.2", + "web3-core-method": "1.10.2", + "web3-core-subscriptions": "1.10.2", + "web3-eth-abi": "1.10.2", + "web3-eth-accounts": "1.10.2", + "web3-eth-contract": "1.10.2", + "web3-eth-ens": "1.10.2", + "web3-eth-iban": "1.10.2", + "web3-eth-personal": "1.10.2", + "web3-net": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", + "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.0" + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.2.tgz", + "integrity": "sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==", "dependencies": { "@ethereumjs/common": "2.5.0", "@ethereumjs/tx": "3.3.2", + "@ethereumjs/util": "^8.1.0", "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" + "scrypt-js": "^3.0.1", + "uuid": "^9.0.0", + "web3-core": "1.10.2", + "web3-core-helpers": "1.10.2", + "web3-core-method": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, + "node_modules/web3-eth-accounts/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, "node_modules/web3-eth-accounts/node_modules/eth-lib": { "version": "0.2.8", - "license": "MIT", + "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", + "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", "dependencies": { "bn.js": "^4.11.6", "elliptic": "^6.4.0", "xhr-request-promise": "^0.1.2" } }, - "node_modules/web3-eth-accounts/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT" - }, - "node_modules/web3-eth-accounts/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/web3-eth-accounts/node_modules/ethereumjs-util": { - "version": "7.1.5", - "license": "MPL-2.0", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.0", - "license": "MIT", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } }, "node_modules/web3-eth-contract": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.2.tgz", + "integrity": "sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==", "dependencies": { "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" + "web3-core": "1.10.2", + "web3-core-helpers": "1.10.2", + "web3-core-method": "1.10.2", + "web3-core-promievent": "1.10.2", + "web3-core-subscriptions": "1.10.2", + "web3-eth-abi": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.2.tgz", + "integrity": "sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" + "web3-core": "1.10.2", + "web3-core-helpers": "1.10.2", + "web3-core-promievent": "1.10.2", + "web3-eth-abi": "1.10.2", + "web3-eth-contract": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", + "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.10.0" + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-personal": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.2.tgz", + "integrity": "sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==", "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" + "web3-core": "1.10.2", + "web3-core-helpers": "1.10.2", + "web3-core-method": "1.10.2", + "web3-net": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" @@ -17828,50 +20732,55 @@ }, "node_modules/web3-eth-personal/node_modules/@types/node": { "version": "12.20.55", - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", + "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-net": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.2.tgz", + "integrity": "sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==", "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" + "web3-core": "1.10.2", + "web3-core-method": "1.10.2", + "web3-utils": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.2.tgz", + "integrity": "sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==", "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", + "abortcontroller-polyfill": "^1.7.5", + "cross-fetch": "^4.0.0", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" + "web3-core-helpers": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.2.tgz", + "integrity": "sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==", "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" + "web3-core-helpers": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.2.tgz", + "integrity": "sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", + "web3-core-helpers": "1.10.2", "websocket": "^1.0.32" }, "engines": { @@ -17879,26 +20788,29 @@ } }, "node_modules/web3-shh": { - "version": "1.10.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.2.tgz", + "integrity": "sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==", "hasInstallScript": true, - "license": "LGPL-3.0", "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" + "web3-core": "1.10.2", + "web3-core-method": "1.10.2", + "web3-core-subscriptions": "1.10.2", + "web3-net": "1.10.2" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.10.0", - "license": "LGPL-3.0", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", + "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==", "dependencies": { + "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", + "ethereum-cryptography": "^2.1.2", "ethjs-unit": "0.1.6", "number-to-bn": "1.7.0", "randombytes": "^2.1.0", @@ -17908,48 +20820,62 @@ "node": ">=8.0.0" } }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "license": "MIT", + "node_modules/web3-utils/node_modules/@noble/hashes": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", + "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", + "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@noble/curves": "~1.1.0", + "@noble/hashes": "~1.3.1", + "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/web3-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "license": "MPL-2.0", + "node_modules/web3-utils/node_modules/@scure/bip39": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" + "@noble/hashes": "~1.3.0", + "@scure/base": "~1.1.0" }, - "engines": { - "node": ">=10.0.0" + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/ethereum-cryptography": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", + "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "dependencies": { + "@noble/curves": "1.1.0", + "@noble/hashes": "1.3.1", + "@scure/bip32": "1.3.1", + "@scure/bip39": "1.2.1" } }, "node_modules/webidl-conversions": { "version": "3.0.1", - "license": "BSD-2-Clause" + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, "node_modules/websocket": { "version": "1.0.34", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", "dependencies": { "bufferutil": "^4.0.1", "debug": "^2.2.0", @@ -17964,18 +20890,21 @@ }, "node_modules/websocket/node_modules/debug": { "version": "2.6.9", - "license": "MIT", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dependencies": { "ms": "2.0.0" } }, "node_modules/websocket/node_modules/ms": { "version": "2.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/whatwg-url": { "version": "5.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -17983,8 +20912,9 @@ }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -17997,8 +20927,9 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", "dev": true, - "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -18012,19 +20943,20 @@ }, "node_modules/which-module": { "version": "2.0.1", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "license": "MIT", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18033,61 +20965,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/window-size": { "version": "0.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", + "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", "bin": { "window-size": "cli.js" }, @@ -18096,23 +20977,27 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true, - "license": "MIT", "peer": true }, "node_modules/wordwrapjs": { "version": "4.0.1", + "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", + "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", "dev": true, - "license": "MIT", "peer": true, "dependencies": { "reduce-flatten": "^2.0.0", @@ -18124,8 +21009,9 @@ }, "node_modules/wordwrapjs/node_modules/typical": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", + "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", "dev": true, - "license": "MIT", "peer": true, "engines": { "node": ">=8" @@ -18133,60 +21019,36 @@ }, "node_modules/workerpool": { "version": "6.2.0", - "dev": true, - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true }, "node_modules/wrap-ansi": { - "version": "6.2.0", - "dev": true, - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, "node_modules/wrappy": { "version": "1.0.2", - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, - "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -18195,10 +21057,11 @@ } }, "node_modules/ws": { - "version": "7.4.6", - "license": "MIT", + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -18215,7 +21078,8 @@ }, "node_modules/xhr": { "version": "2.6.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", + "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", "dependencies": { "global": "~4.4.0", "is-function": "^1.0.1", @@ -18225,7 +21089,8 @@ }, "node_modules/xhr-request": { "version": "1.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", + "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", "dependencies": { "buffer-to-arraybuffer": "^0.0.5", "object-assign": "^4.1.1", @@ -18238,46 +21103,53 @@ }, "node_modules/xhr-request-promise": { "version": "0.1.3", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", + "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", "dependencies": { "xhr-request": "^1.1.0" } }, "node_modules/xmlhttprequest": { "version": "1.8.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", "engines": { "node": ">=0.4.0" } }, "node_modules/xtend": { "version": "4.0.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", "engines": { "node": ">=0.4" } }, "node_modules/y18n": { "version": "5.0.8", - "license": "ISC", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "engines": { "node": ">=10" } }, "node_modules/yaeti": { "version": "0.0.6", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", "engines": { "node": ">=0.10.32" } }, "node_modules/yallist": { "version": "3.1.1", - "license": "ISC" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yargs": { "version": "16.2.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -18293,14 +21165,16 @@ }, "node_modules/yargs-parser": { "version": "20.2.4", - "license": "ISC", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", "engines": { "node": ">=10" } }, "node_modules/yargs-unparser": { "version": "2.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -18313,7 +21187,8 @@ }, "node_modules/yargs-unparser/node_modules/camelcase": { "version": "6.3.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { "node": ">=10" }, @@ -18323,7 +21198,8 @@ }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "engines": { "node": ">=10" }, @@ -18333,22 +21209,25 @@ }, "node_modules/yargs-unparser/node_modules/is-plain-obj": { "version": "2.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "engines": { "node": ">=8" } }, "node_modules/yn": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "devOptional": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "engines": { "node": ">=10" }, @@ -18358,8 +21237,9 @@ }, "node_modules/z-schema": { "version": "5.0.5", + "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", + "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", "dev": true, - "license": "MIT", "dependencies": { "lodash.get": "^4.4.2", "lodash.isequal": "^4.5.0", @@ -18377,8 +21257,9 @@ }, "node_modules/z-schema/node_modules/commander": { "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", "dev": true, - "license": "MIT", "optional": true, "engines": { "node": "^12.20.0 || >=14" @@ -18419,95 +21300,79 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.17.1", + "hardhat": "^2.18.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", "rimraf": "3.0.2", - "ts-node": "10.9.1", - "typescript": "^4.7.4" - } - }, - "packages/core/node_modules/@noble/hashes": { - "version": "1.1.2", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" + "ts-node": "10.9.1", + "typescript": "^4.7.4" + } }, - "packages/core/node_modules/@types/node": { - "version": "16.11.7", + "packages/core/node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, - "license": "MIT" - }, - "packages/core/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "license": "MIT" - }, - "packages/core/node_modules/cbor": { - "version": "9.0.0", - "license": "MIT", "dependencies": { - "nofilter": "^3.1.0" + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" }, "engines": { - "node": ">=16" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, - "packages/core/node_modules/ethers": { - "version": "6.7.0", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", + "packages/core/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=14.0.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/core/node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "license": "MIT" - }, - "packages/core/node_modules/tslib": { - "version": "2.4.0", - "license": "0BSD" + "packages/core/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } }, - "packages/core/node_modules/ws": { - "version": "8.5.0", - "license": "MIT", + "packages/core/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=12" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "packages/hardhat-plugin": { @@ -18567,243 +21432,70 @@ "hardhat": "^2.18.0" } }, - "packages/hardhat-plugin/node_modules/@noble/hashes": { - "version": "1.1.2", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "packages/hardhat-plugin/node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" - }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" - } - }, - "packages/hardhat-plugin/node_modules/@sinonjs/commons": { - "version": "2.0.0", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "packages/hardhat-plugin/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "packages/hardhat-plugin/node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "packages/hardhat-plugin/node_modules/@types/node": { - "version": "16.11.7", + "packages/hardhat-plugin/node_modules/eslint-import-resolver-typescript": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", + "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", "dev": true, - "license": "MIT" - }, - "packages/hardhat-plugin/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "license": "MIT" - }, - "packages/hardhat-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "packages/hardhat-plugin/node_modules/chalk": { - "version": "4.1.2", - "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "get-tsconfig": "^4.5.0", + "globby": "^13.1.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "synckit": "^0.8.5" }, "engines": { - "node": ">=10" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "packages/hardhat-plugin/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "packages/hardhat-plugin/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "packages/hardhat-plugin/node_modules/dagre-d3-es": { - "version": "7.0.9", - "dev": true, - "license": "MIT", - "dependencies": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "packages/hardhat-plugin/node_modules/dompurify": { - "version": "2.4.3", - "dev": true, - "license": "(MPL-2.0 OR Apache-2.0)" - }, - "packages/hardhat-plugin/node_modules/ethers": { - "version": "6.7.0", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "packages/hardhat-plugin/node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "license": "MIT" - }, - "packages/hardhat-plugin/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "packages/hardhat-plugin/node_modules/mermaid": { - "version": "9.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.9", - "dayjs": "^1.11.7", - "dompurify": "2.4.3", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "packages/hardhat-plugin/node_modules/sinon": { - "version": "14.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" } }, - "packages/hardhat-plugin/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", + "packages/hardhat-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/hardhat-plugin/node_modules/tslib": { - "version": "2.4.0", - "license": "0BSD" - }, - "packages/hardhat-plugin/node_modules/uuid": { - "version": "9.0.0", + "packages/hardhat-plugin/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">= 4" } }, - "packages/hardhat-plugin/node_modules/ws": { - "version": "8.5.0", - "license": "MIT", + "packages/hardhat-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "node": ">=12" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "packages/ui": { @@ -18840,13 +21532,14 @@ } }, "packages/ui/node_modules/@eslint/eslintrc": { - "version": "2.0.3", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -18862,9 +21555,10 @@ } }, "packages/ui/node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", @@ -18875,16 +21569,17 @@ } }, "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -18908,13 +21603,14 @@ } }, "packages/ui/node_modules/@typescript-eslint/parser": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -18934,12 +21630,13 @@ } }, "packages/ui/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -18950,9 +21647,10 @@ } }, "packages/ui/node_modules/@typescript-eslint/types": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -18962,12 +21660,13 @@ } }, "packages/ui/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -18988,11 +21687,12 @@ } }, "packages/ui/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "5.59.9", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -19004,9 +21704,10 @@ } }, "packages/ui/node_modules/acorn": { - "version": "8.8.2", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -19014,104 +21715,50 @@ "node": ">=0.4.0" } }, - "packages/ui/node_modules/ansi-colors": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "packages/ui/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "packages/ui/node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "packages/ui/node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "packages/ui/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "packages/ui/node_modules/color-convert": { - "version": "2.0.1", + "packages/ui/node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", "dev": true, - "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "d3": "^7.8.2", + "lodash-es": "^4.17.21" } }, - "packages/ui/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "packages/ui/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "packages/ui/node_modules/dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", + "dev": true }, "packages/ui/node_modules/eslint": { - "version": "8.42.0", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.51.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -19121,7 +21768,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -19131,9 +21777,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -19147,9 +21792,10 @@ } }, "packages/ui/node_modules/eslint-scope": { - "version": "7.2.0", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -19162,9 +21808,10 @@ } }, "packages/ui/node_modules/eslint-visitor-keys": { - "version": "3.4.1", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -19173,11 +21820,12 @@ } }, "packages/ui/node_modules/espree": { - "version": "9.5.2", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -19190,16 +21838,18 @@ }, "packages/ui/node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "packages/ui/node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -19213,8 +21863,9 @@ }, "packages/ui/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -19223,9 +21874,10 @@ } }, "packages/ui/node_modules/globals": { - "version": "13.20.0", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -19236,26 +21888,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/ui/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "packages/ui/node_modules/ignore": { "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, "packages/ui/node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -19265,8 +21911,9 @@ }, "packages/ui/node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -19277,90 +21924,80 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/ui/node_modules/mocha": { - "version": "10.2.0", + "packages/ui/node_modules/mermaid": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", + "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "@braintree/sanitize-url": "^6.0.0", + "@khanacademy/simple-markdown": "^0.8.6", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "2.4.5", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, - "packages/ui/node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", + "packages/ui/node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", + "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", "dev": true, - "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "@types/react": ">=16.0.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "react": "16.14.0", + "react-dom": "16.14.0" } }, - "packages/ui/node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", + "packages/ui/node_modules/mermaid/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">=0.10.0" } }, - "packages/ui/node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "packages/ui/node_modules/nanoid": { - "version": "3.3.3", + "packages/ui/node_modules/mermaid/node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "dev": true, - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "peerDependencies": { + "react": "^16.14.0" } }, "packages/ui/node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -19373,8 +22010,9 @@ }, "packages/ui/node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -19387,38 +22025,29 @@ }, "packages/ui/node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, - "packages/ui/node_modules/react": { - "version": "18.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/ui/node_modules/supports-color": { - "version": "7.2.0", + "packages/ui/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dev": true, - "license": "MIT", + "peer": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "packages/ui/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -19427,9 +22056,10 @@ } }, "packages/ui/node_modules/typescript": { - "version": "5.1.3", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, - "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -19438,10 +22068,18 @@ "node": ">=14.17" } }, - "packages/ui/node_modules/workerpool": { - "version": "6.2.1", + "packages/ui/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, - "license": "Apache-2.0" + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } } } } diff --git a/packages/core/package.json b/packages/core/package.json index a024163eb0..678038a145 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -65,7 +65,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.17.1", + "hardhat": "^2.18.0", "mocha": "^9.1.3", "nyc": "15.1.0", "prettier": "2.4.1", From 64768ec09845aa00daa2b2dec001bc36996fe4cc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 9 Oct 2023 10:58:01 -0400 Subject: [PATCH 1039/1302] replace purple rocket png with optimized version --- packages/ui/src/assets/purple-rocket.png | Bin 950444 -> 34667 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packages/ui/src/assets/purple-rocket.png b/packages/ui/src/assets/purple-rocket.png index d58df0040d9e38bd568e124687de194fb8f1d891..374f63939793ca1d6b59c8a568fee7f805dfe993 100644 GIT binary patch literal 34667 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%0D@0O2@Bj66ug%!ivi<^sJhadow1 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 literal 950444 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
  • doI9nH)2{E$lX zGO4Yiq4~f)^(GWCZ4Vk5kq-X(z?d>%C59-Y^rYM;4|K}gRi*Y-kW!D%8;Cpxc*vf` zZ}jZY)PI*;;pszK|4(w!w9Mo)k$x6KL1Yt}fP@>GD6<`qr^S*NSKmq-Na#xeO8~pk zr~*%Knne?@*>;osfi)oB>Yf-U9 zi0{Rf%*fm7KAt9SZ`x->nWwQ@zey-F0S6+8tc9!LOJGId15yXyw@@)U(J0yXZ^e6PY4ltuOv?v+z8E|C&HboF zy{&Ql)4tTtulm9+%a2|TUI1qMYrv>@U@B!~ne(Ip)%>-m42UrcK3Z92WrB#o@A65Rs37b2A>@ct`8w_|5CoHHdB3kxcVVzVvmZI3DAQ?vFDy;{-1+kAbMXvKK zasim$HNg9yJ9#Ksi=+ch0>2kpkPj)RrcCdekE3E|f?oA3Ge}8E$z%^5Mq$)-D zLrzhIb9VOvDbn0uqe*T!x7oVF>&1&5+`)|dzdde#^8u88yK|lH3J2_1LiafmF!BLD z0Aw&#m)Jl96u|r4Zgl7d3X(@qGtDR~U}6PEYVNtovW1-(rKhgWnqN;vgLaQx)J70i zQxNTf;u}86nz)AIV#mfDO$&)(4GRhBJf>IlZFXL?{{@nxW|0cOs8a$+hd{Em;&Nr< zACLSm`Q^a}2#66o=)gS300o;2@JPlCW6n}=L1O$M4@2m>3eD~n#y?jsMi^D^RN=3m zsru3`LMnN)*fcd$Gr8S9KTzC!<%8SCSZph}K@S-O$nOGGz=mw(jy1qSEfncxl2@m0 zN>U2_hc%=P#4No?NI($QyhG8FpM08BI6;F)#9Eb&Kzj>IW{k0+0Ba#2DDZ}b4*Zeh zUX(x$qtRQ1h>x=JFHd*PH7m`iP!Su2D`}a50S&Ekf`i0 zO#$27jmlAhFC9lDBw=6&=fHA8%UNJ$%rL0&-e?IG_A9BFF?@@ahm6L*`P-# zHsus;YXwFjw`>Iq{2~GE*+apU0M)Hg9;lApc~vt8FK{^e@zd{Xp>tHBL-f43J>)q1 z-6Pn}lP?^Y=&|k%`-P#H0s79lCogy`j;5RXFyg)+NPf0c1AQ|g+vsNN#{bzQ2xOUn z=dVx5MoO%?=YuC8pz8(rK$pA8$PeRiU=W}Nf))=@@c!*!C*{vuz2ZQB$i^0vq4Yy` zP_@JXdkL>_0-=9NgDZ;EEm_^#l?9vBxD7L-pn5Rfh{%s7v~cbhdL#`O`pA0G&PTNiIp|H zXr8ATfOAU#IWK`+?0D_^2o7VAkx?TI#^^1238OpT{LXpb^E}V_#~+rpSmR#zzW3hO^|>A` zeN9c)SEumAHl%^a`AD>&5}0@QX%kt(5;Wj81M1k9F1`R-KeeE2fO7&)9QEn#h#e0l z?}#7{`vf$SbYFt7;FYxB)I8h{bv={OP*^+Oo1#c$hnF7-M>iU|I+~EGZQm4G3Kz$d z3MdeHo{th&iphkr?q+25JUJ7e!u^Ot2n20l6z zWK^m-tI{ZOzjxTa5?tzx*Rr;9%?FP^UUbP?yx{9O^$$M<8Y{xr(vb8YRN4ZcBOt5R zkC@9w)OuuXbwb1lUw9*agQ7U|b+S}{mr9CRsZwdegsJ(6RVfCjrC&k@h~>tMc|O4r zVkC4xBqr|{jiUG732P%iM(!k_Tx%?LtEZrXU#Z?F>rWSqh>S;&n{b~h|br%y8ya3SOjk^tr| zvw8!Ag^LRgV2~aEy}OULNg=a)?uOR8ztbiLH-Nys8p@$pn~4RUcx|B%X$O11$Ja>I zC`nyBM=61yIUbv=`RC6MOTvFC8?!q{)iB!E>E{)QR_y{v+)!Zu0U4!k5C5OH81c00 zM8B&MbI#yu8=w%lJ~`Q6>NsC7O1fI@iX^?h0=8?ELUsW@J`Vt*oU5nzP5KsH+jXK> zd0dThX zp!UqUJ|Vn$q?jVYB&k3C)(>D1kj|4*=z2qz0L7&y?@+!2ujsHFZ+>+I>yvSxigADc z5mS_B?{gj+)E6(L(#7ZCu%lEvwBAd~gn>)L(?8jxqF`<^Gp+IQ%f7jZKC$}N;_vRK{g_+I8%h8R+`9kH-|HS`)` zF|}oO$irTjTmpLv8m9uP>u6PB_ifQD(hrWb5w+Ozhbh*Q9OQI2s2G$-8g zaFBgQ-sVj6j!ashxNI~2HG}{-j-Y)Ap zZ;=c5uEQVt6kqZdRJVvZ{z}oyf*{mFyT?K{2nN@jB&Bzb2~XD7^zWB+t#e z)g&wK9+Gddtoy zgvnW9Xe!=&nbJ-6Wc4G*buaYa#DG3m5393rndl6_S~qBq+d%+)geGU|V`h3x8!Qsu<{LgMqApzII>QVD7~CbLVe4OWn2< zqUK0;i#5kFFrc%rMq*F*Ndb)RQ_8iqHQx zoZalXT9DP{NZ#`unXyboTU`c5|6=C&sZ}7q`p^_P*KEl+e(3gchTy-cq%1!|H{VYp ze5dT|n*H_a%-An{R26PpIjJLuo94ICuK+dOH<_Z8i{@m}VQ5 zgE{E|&duaJ{l1a8>cc>?^&Ov8CN$26u;N9UUCdN#w+mEiC*!yM3dLq70|~XqI@i&T z>3J+UgsRV^K_D5P`Wh`!m~l@!Cl_nzEdAnx0b4~a`sjouQWKU8v>lpt^w~r&KEnne zLs~z>D9jr;G z0y*x5dhZ!=l=dM1PwQuy^BJ?E)pqXFoe%(Np~xuK>Bwh`nQaku%Iop!%BR(|`tV1?wkV zm@CmZ#X6K2NxmU!g(QS-63GaYj1sJ^?OHc0sv8(^nMKc0+R#w}O3mJMcF+Bom5#^3 zIM=zF-4XS}zWL2b5B0f@S5v&53deD41@AHf2WkR;Or6Vn#||&e5%UgsKP7P;x!XCj zP;V@<2i!TQs$kr1xd>X3pIX&LwgT8(nVT=v4J-Em$iM%1;AduFWDBIqo{6&(v6yXB zys0SqE&yi&TH`_cCG1wM7pEeZf=o=JcM#26>bGklPXx3gq#r#UywheT=4O9*S|lRG z&42f@_y4)noZ4QzM$O&=F14+*v$OMp(5q9+x$~{rVW3qQyWRtg`;;IP0|VgiY#rMi3~Z?eBApXfZK>`<5Q zvXALjBfDTjWU|0!<=0igH}od?>H_p?DDYcQ^{aWu!I7U$-mm5H6%(sW&W=)K`de3< zR0&&4^v}yip)MRPP!;4Rmt-M01@xFGOViebMwOuAS29>bYRHW8X@hrO?W+wS&3vd~ zQ|cA&DvrmE%XIu0Lv|J;A!9btRl%|sv$?!yNo3Zwe3PE!CS!Szq!|s% z&jIfd)>*ngNf1tOV->l0tXU(?D$V;NyV=eF-E>R0))bB#e|VN;^h4a$YF|-weP_j+ zMDSd*t%GsD?bn8w=#gR`t%thdSfsE>MiwCd8Y5Ys#%F|=vca55R2lMaW^C~|2?%4L zU3m=C{3kCpj`{SF*Il-N(My=UYkm>_!zJUlE$(W0_+G8Bl|ZSX>K`hE@KcPCk3wN( z_>@axT^+zFU;?PhF3LwXzPhi?+{b`A=}1Ks$_iu%xSpIDe;fU<+go#Bv!Z)?MGbZ_ zUX2f%vuU!5ZHA5vpastIRt!-yZ`c#s#H!- zQaet8w_M1{-r=yDbHx~bHZW=Ru({)s7ACISMg4oBIEgxli2w&7AY95*D`EK))i* zgKl?+F;4JUEz$p&Vp53Z#+DKoQJ(9CDo2!sLWZrqVBRFePQF+Lh30;)I*|2!25?UaW_MIXtn%35p!=NZgKt!L7-XhZnrp79dczh-MqRC!?Dp zo5uxhe0$n@_?%B%rEmh(ExVO$58Pds44ckRR4NM9nsH&V4^QU+h5YIdhbs&rRYzjQb>E@`eJH*CS`TCVedHN+h8@@u&rJ z;Z@zdyd+aS?Nb-*ck6{ErkV3jKy-uakD5ewbQF79dz#P9uwLVu3i-TV7z zY&P$i*1HqRTUO^Yfj`>jy5|u7`9)v9a)tT0S{Vr_7ORgwv+1*4zaSd~`KMbOz7Gls zX>9Xc8%jO3K247DqbU^Ny&d~slf=Vbo0M+KPa%BK+dk)Q|58+!XWIfpf%Lbw4!^U% ze_B8XU%y7h6O$D&syT>;%_`y}RnWC&`s-Y;OQ_!i^2uJiMfn(cZ=1aF z>VXl_^mg?U#*J+fERIACr1kDY_OPD8jbG0*Go#!CS>ccu6MAn7(;CAhr(F?0$(hX` zuQs6Pz0pmpb;K$8!P9?wS=S*qu}gv=ReR2C>bD-9zg4yEVeF;s>SorYZq#W$VmPjW z6=hq_h{hrbOvQC)P}Io#mZPmMvzCYQx5WbVd_|;u9Zgmzv(O=-uX&55=y^NU0VAvL zDchbN-XOQx@`gQ|v-b37E| zP$cR4YtwnicoJ|&I@t8+&UR>C?f%>c$B!rHlS(Sf?|`itkrOQ#qdrf^Leg9Ht^ga) zZG8-y&=C9WOnC?k-HvNg)^F>&eMOE9I%aS4McUoj4?1 z({Ch*W{It{lo{Z3R=@2F#A9A;utF^BNDfV`NZ6#A%noPipaS0$SV@}VC5tn8V46Hy zVYQI|40CTZc{;?HA}IzO=r#I*0a!$ZX93tTXZU0I4_3En%&;DmIXWVq(I?xU^woI* zgZ-Yu@hQswTtrYH@PqF35;+jtjHA#z_y5S25KvNsYjkY5pFJQ^#sn-)11mfB4!sAW z0W;{^mDP}^$gMKakT^Q)TqEoN;vSd^NP$r$tC)_B3meFZo=CS|zO&-4F-|=c=NoD~ z^qm=y$`w2DM8Tdi8jEH4t>yUwGvH)9)+mUcw*UO*BK^!=-p6geyIfcM+}Cs+*O$A1 z1W8@+b22}9rcPQh}@8 z0O&6N;Vl2EgaRl_m5{ypE?=JeasbW}?GcY--{}j?+=VXxOt4|<#@dAM(|pX~n&V^7 z@MlQ+a28_`yG?;zl6QNhRB3~erq2FnZ`3f~O%?!TXAiSidEU8aH4{{K_OY!q7Lw~x zm8OTypp^p0e-M6dCXkFD$zWUGEDS16!TC+v+=C3yPt<2o@bd#v77KIs=M52Ix zWtPO-qmy5U#zU{y&6za4?^}q{WzX8Q$|p(3a{;TJk-$Sn?|q&b4e@U|lFzq)G`3UA z*K?a~+zsFQPVc$TuP77o1{6rM$|_M%(iHr3;kbfg4NU;3o6-r?CS_Qq^-BMH<2 z)4dw${fYc*AN@5NfpglC$89)aqQW$xvKQC;L@Sj}O{9~b4quLO34vfab_k`2TOjaf zYS2rz1nDn&1L8m*d4YecP|)2X)4K?<)(jN%;0@v|sIyGJiQgPTbNgfIlkpcS1qRP#DEL7)NAhX^Et_@&U0_Luq@XL5^bv=ygI;t`_ zzw#W%+$T!4jok~13nh%vwKZ}uS=KQyFw%G$oXIcZ#tM%j$Ib>7<}U!jTQu>Lq4O8F$nP39W z8LR`-Gw%|_x<4RQ8i+laenw09mKL$oSTo5x1SVq1)??&aU0JQ`o>;>-(`6JGW^c71 zm06lZ;3T%5Xw+NN$S*&{H(`QLjjEh;s+c)X-f*Js#u>RwAZcIIwy~m0xaReZFvi*H z<>EbA&WrpOMTW@B09)?dpZOMcxRR|+%*etpH2!gaKJrS58MPLy0b+R!dq?0eP+fYr z)wAZC0`sF>aqZ{tC8nBx$$B+RfP^F%VHK=IDW-K#wux_cjDzd#D7_M}jojca)VT{B zJ<|~3eU&3iVpNjk49a9yL`fOZ>g(VT?euNPfYJ@dq=rDU zV=nZv_s&e?z1>Hoj%$Z<01x6R$&efnY#RCmNNeWT0)9bZS~p--kL3=DyS|#cRsc9y z>cA2R?k*AuOfu4MeM;kkD3rL8h1xW+&ms&Mfn^RWK!uxb)EJXi{>3{~&2=8ks7$;2 zlOlsMug@gg-N2ybYk9td)BfY1wi@?E$t5+!9{>N@;b+LQK_AiVVyz7vKo*?}*B+^OUB zm{CU0g~L0WjP26K7UVQpv)$>i_A@#*UwfDK9TUL>WG0{~-cj$KLK1x5$Ja$f*3OT) z3MUmPfdR4{R|86^CQT>$C$!)+jqRA#D`)g}t2#3WN}RFb#!cV^;i%|RJ^rBO)F>TikN9e1GsVLMI!rr(mhq} z!{(y2yO~B#)dG$ha8ce=`npr%oz_Dx;G+$8?VV$-i5$U+(mPahzp?R4O`(kat0DHH zeOsQyE4JO)2ERIjuNP(@z&7Qp&#eJ4)DPZ$-kc~hMH0Wh>2;2^SAjEbMW;cDQ!cAF z%hmQMy*erYol+XTk&)4V(glDVj3rFR)xD5&?3{I*1zs!@S)p~yeP|j&ADh)obJg3a zkZ1u2OzccP0_NzVoZgH4SKA6c`!|(~#fo`nFk0_2y>H09`8ZPdb!OH7>hX_dAfvGH|7N_QEOm138t4ybvv38F4%>|_1+xI4SfsUaB{&NhOsMeeptHKcc~ZSI+?}xvp+$>45os{>ye581mRYj(4OO? zT5D3*TfZw_Ve6;8N&$Db1yh)Gbt)Nzp9elu_d+O{%G}eIH3>R}>}uyD!+*W1mxoy6_syCpsS={n&AkF5XGY)`>55Dw7~Zq6K+xMeX&6{BcE~SVc+m2 z)^sj}eP-U~%D8i8f~$KPc&mx1`&?%QfDlg`No&K^F%#3VtuWGeH)AW=o63>99XuFC zV$$I8tmaromiG^NJ7u(D{eXxE!C!5K79a8zCW`OE1OQB;O>^$T@wSv%?w}qMz0-8q z{UuU$DLL%dmLDJPf!1b@++K!)BRB^%{5Vic-7a$qcfy)y8ivCy2w&pHloI7&00h;yj~~*I4jf_;8l= zr!1nmq_fcm&2?T$wMJ{sue55Nuqk(}6!LQ^EiTGtTj6uwf;4iwt;Nx0nP8*~K*_`a z6L`-O1vo`#&y)xn2s+4D2~D)TKEs?;T_1HU{+opXsEwcpm1(~e0&%$Ku3`7=kDmfu z`Zs~QR0z`(E>C7t;OcutiNKysk}$78@`V=y@60^3sWGWk0{X~u?fhZkdzJ%kZ$A2I z-_HQCc}5@QRQ$I`z9?csM$I|zcMHw~X%V`+U-VGrvL}}Na_wK-Y1O~6t2v1QfL*RM z6U&%=&rWMWlF2<^d2@S))#{rXkV$X4uiM;q@2X41htfq>bW8f1ZlQZf)8q1{8NFC9 z$9CbR2_R*AGK80Cy72+dC51og<4;}&Fy8|{etoCITc2Z+Kicq37c$}QPREQw*$~~m zxDtM2xzdka-JR_8Y}JuBvu4c3#Ku3t&^&_>`AEiJJ`*5q&`%em*A+{;TAEBhcv9~2 zyiVZ5G zv`FA$g`;=b-JJ;_a7h=LCRVe9FBJ)sNW$u2tGuR((M!KoKXG!hl=N?y z8?@I&da~C;yWfAi0FK0d_A;vb&`8|!;s~h6S64c<$>^0!FhC#j7 z3HDU>%ry(?d%!rMgEg{kRd?$p4;sD67B z7Ls?3XlI(1n1)HK>H&Ee{J$P3Y7%;DP$bumkPumir;*8llfwv#5aEXGaeqjtDZ7N# z12Gl$)Pp}CibT1NtM2_cr=_(nvYD@QxS84S%ITv-kbaoZIaBG98HygYJbWB@GOgo@ zmgV4hAShcZL?&>>H@mubOJi&aL--3G#R0%FZc%=qy))UU9({cFn?tru>C4)vPfNco zVfq}|K(GOI7}(P_^QI%~<}5U-;PH+GIoQ&IsL9APqksxh4}TW-W2oABjN%h3f4DT^ zPXbN-2NndoINqS$K%tPmUEzyvGn1L z7CZ(-n8Wvs*>!`fxCly0x<_m7s-w4pRXAAP5mb=A72O19vKwl@KA25SvI0*?ZWob( z8gJG{Z6PxtA2*U#xl`r(P-ThxYJuC`-~Tm0%lZ0M&%nT~`W`RQztPNg3{1x7aV+4m zZQbh*;BZ^y=m4GtdfEU;|3noN!}F@Oau07Q8|NZxPVrAN2sGQ^p1K3O60qVTwPOA)q6QHujO8Lz9-qh?HUc!>&E}p>=vZ6lNZ!5i5 zsKj)AitHPi;Dwo*Wit_wafFF44`zoJ4CWp55GV$5O|Z2tmol(ctJ`kaK`UE%*vB+P zHHA_H2(+}5e}U|*61s38i?Cm875aKUvVor&jVV3PrDqDQ=-kIguWXHzSqIcZuZ&6O zz|X!jnW0EO0yuOILMz|j)|t*%*^g%+12LhIH@Au?%#?RW?z&!8*BwI0SYr!HN=bc4 z4PB4d_5*0Zc{^B51EOBTWvz}dAhhA@8ylZFmQ1efs zWaucTzBZxK``7n*j2^R8D-_VV;=TeA6a+}IRpTMyG>tckHvDR;WI1aC_IlFaMU91w zO(nvvbJ|p#Q#qP{d5*eeS?$TK{&@RCPPj}q-qiNluXL}F+K@;wekIh%;nvv3Y)KC8 z4pYCij)~m&t(~x}3QsG-0Xh&z%6Cah;jtbZI0q~X7iVf;IjK2!xwtdOOfvcCjjR@N z@@24Hs6(;mBJE^*^F6r{}az5NRl>Sr5 z(4PQAol5MdF6iWGiK{yEz&2$7w!IIH?c6Y*7$5tM!H;&6Hg2xsgBu!3w$BQmpo|qT zmMwm6hT_5VgrEEiHzP|dfOXp9B0xYzH1m4W0boUwo@;jVX(~^%*z61EPT zzt`K7(DYn6dPrqY5EXpeV-~ioD9E{B6KlS8hY~oeno{BS>EAIX)2yTXbZ8chM{MiE zB`2IUoe2?C(v%QFij-K_o=+3*D;1j^Zehlih1(SurL#iaT41J$pK<6f-x%)D-gm3+tYs4c)FX}UGtmBlXWNgX2Gyn=^GzmoFr^0^#)HhMv4cBX7J-k z2s?c|e>F-)`vmXqCDAiv9rY@o=lxIZda_-~9fBfOLIFhEOLK+RAhFGtb=3kTHQR|I zOp>0J@XB-10}A2tekKmi+XG=dgcUE(NowAo+jly?*6(VU?#iTlkjgpWdkh@C_)*9D ztOoF6?^=Pf9uk2wS8_+1q{bq08aUO1MTh3RDp8N*bpC9jr+>L9lr-i^?GorB!!c(J za&yER(1tH%t?l|$-cDe98VjV>I~UMXTI&kM)NWvSJv215w>rokbh?u9pQG0v4CGT& zgBAo(cx`-sn^ShoyqyIUjVz*hg6*wpzf^K0hPW;#J-GQ#{DN@?V2{hpwIYOi=8@xe zOdBh`-T~s5(mMW%tQml^dD{hg9U#rtL3dx63g%ngMZ)g#zrXCJRu~Ff)oZ`K<1itG zKkB&rE7Ng047hox#6!+o=9B__eUv#99(efrGPks}WIh(KA^^=y=p6<)DT7{6d0pPW z71NAJ9cWJ-KC^9hIvD@UxgOJOp4!w@S*-Qt+N=NqxVpGd|LNvHuxxpR^`D=x&qWlg z8&2+g5ONS(uQ9C&dyr;W0;sMw^GBD$fj@_b_2Qmj{j0Ndexi5xdEV0l-ndWknzT`U zWvomV0mIf6(kx*UBm)EzhL#ietEJzDJ7q1ix&9qF+8c}P3`njw-Afl`Avq+0A32d5 zfTR}(p|dg7?Z_*;XCy-8$9hQi)w6(}#-#a5aj8b^$YEnJbEb2qj5QqhJ^R>d{4NXR7BJ^J*`S`vP*zs_bx9RsGt_KrgWSjN+>>w1 zjYQdHFU{t_6hET;84T-uLXKVV;x=2miB|ZQg)!7c4EYN%Dos!u-tf-2lFSGbwn*2z zq%N{bnyFjTg{}^1cZx)r!|^SX=7$|mf+Yvubj;lgz2x|fEH9QmvNNBvIWekg8E%FS z)#->Mg*u&{wX+yP!59@oSiSOW=TXgxKz`kQiE``7(`@lus1dxXsE%h&>rO`vmjLpPw5bFQleUV4iwIb1y0zzmH!^(^# z%Z`vsx6td;wd>QdCo1RP9Xc+zMzKh@5~_EA)5YRtS76Y$(eF0No7~OuD@+$Q!AInN ziVJTM*iUtc%f|kX$l`vpXIBAoNBz3bympFxpySjo0R=3d3!lH%pUULoOWAqlykJWQ z(lp|Bfl1kyeG&ddDCyE>6HoBNv*c2nOTIgTujJAE3#KEc*8JQh=BZEh^rA=Sgfc4UR!kZDv%R~G(=XRvQl}Ar&?6|bOVoFO zKjs+7i}j41IGaf2Il`aG6^o7PA&PbSV;&42s7PH@U>gtN1wn|lPK5ua-Crk5Ofzyj z5PRAvgoBQtwi~E7CdS6As22mW4~~hOU$wN2<5fd-R^0NPD}Dq3ccL4yefEdJ-n15-jOHC;3h+^jD>t9aSwdN0B$2M*P7&k^`^qzoN5-_5ZsNjUoTUXAAlftu!Kj>8{vO?Qye zRysL(Xa60??<1c+P{ZFwK?!2WZOh@e86u^zamO6~rxZRqmvK*)wX}n5Q?HRHc-#M!Ban4+`X#M`BPJ2r6a5s3W~5^3{o7_jErlDf$o< z7B!w^9O?ROI%CHxaC<)zkQECfo%WgM$`iz%W%k6_)i3P3v0VJuU&=!s%Y5owwLZU` zc(o0_^CEWXiF3PBcEx-lI1D`#p zesA(4Y@aAom$jtNGw5IolBByTE6>3@Xr#$Ntx62LMaBl-UN1iyx&`LHf5XqtLnfs3 zpk2nNIU|zi+l!7H0}TN!jIC}x0nftCuJfp8c4>0g#0nopSgF-80kFM*_g3a__0pcj zd4-=|a0#ToW^c6DiauGj<~(lHk~lfI2;^>#Mr>Z`PXxVfDA`PH|6_)%$Sw9XKS^*2 z|EROJS?Oh7Rrz<$Kppu-$J`Fu@L5>zMQhTT2Vtw1OmAE4&e0K&{!!JFDygpxh*1SU zN5obPvsVgp!14y|flcCqmT(8c`c!BxKcEHd;zxCE^P!&si`lgUYAofpDEgPhk}N4` z&Vn{?^ZePRRyDtt1Y3fid|sumudk)JkI!{7{}l4Rb-$U>`W3bTyiW7~J^3Q3C!Ahv z-WR$jj6T@Uk#P&T8qcu2C;<{I2E{`Ur`)&;3JQiqw`Xn`(=1QpB;JEx9?Fw#6e<*#4YJBZv_V8KY1%C;m+iZA_i1hiNFjukU zPxSh=M}?krX(Fxldnr-Teh*9&Oa&-i8YD+zKD>>YFywxw*_T2@N^4FTOV@g!X}oH) z@Ln}tdtgnjxQJ@$>6`oMJPT&~X7z!T_BSRzQ~Rm$EN8igRdTNPW;e6LpxV1_#ytm2 zO)V)ZZ}$;`Tj*oE?`)_TrE+haI&lfr+a%R-*=Dy|7Pa02>bZ0oh!X2lQ0_8z{K;Kj zk|y8qW*v)G-vyHyJq$_m@uQdXEkbja0~-=D7Aviey!V%ekN3_Ps^{%24hQEEZ(=QVyk!%=q|FEend}`?RXr{9JE+gJL?q+!6N5ZvkZ^Fd$a;E)^ zdb{{Y2iuIuibeV7$FhL!Ost#Dtby$h$XbO-$NK~&IxtvWm$}&!d0Do!v?PA);~QFF zH{}cx7FwDApzwd1h<_zD)~#&(j#TdeFu!blQ30GOBg@NBV4E|ia*0y`=A=(T@GW!0 zwTc<>-w6T(11E7fY95Tr$2IP8%n&@Q&JPZc&~!xc|a9oPxx6{I#nmx z7^L1!z}}4mSLdi{c;)I>4)Gp{(U65R;|=3Vw{yf^ zjTk$uA%F-c84*tyTXTh&3-V1d;dv=m;Ge3Ay<{ov8M1edX>Pa`dQSpVHeo1{Au~bX zE3V%He5TTK%p8Q6 z^Jwfs6?-3f&D~gSY|B3T?WOD{zlQv?>g%-8YbWi$+WU@JC%h-SSFjQ(mZTS(x$pfx zw(yE=Ah7*xS8~R#Q3m_4h^}}Hz#*H+=BMc+r*B3%Zau*THhvN3f?~p5)9qM*H=9Qn zp*c5)XuH_o%Qq_=i#8Hk^p6D?X0ce|#H1ukK<>9I(-Iii@o4PtJ7vhWnH%8<=l^LI zfFfExYFK8VpT6=*1U&|{tCw44RqbcP*MFZ}|Ml&-I;tvY4fKVkYViTZlVBiEx5P?~ zuE!*Fbeo& z>q}d0c4D4bMgpP;p0ZSSm`IP(BH|_+`I_=ZgM`xa8V02jr?PPV=IwBMFsDiNIsmx? zvGTv}w9SRf4@%_N0!RY2fY|$#*>9~NtmW_X$`cN2h%?)(uIer!^Q*m0jl`PqXwcjp zhF5ZN5xKkvjTK-ktP+-n{Xt@n@1)g?-}79(6;eH?brf;$dxjF{Ap8>Bhc>*1hPMPe zvPvr;Jiw4C1KSk@eQOG@#C5nKB}uSm*RxeWRm$if)s=4CMy6h4Y$St8;PIyo3OgT( zL1sLXm0^N(;Rz42L9dDIrRLX-7x#Nul}}H|Zr^@3utwly5m5?CiO^((u{|dFMnXkB zp-cKgf{20ac$F41DK-hAg4i<0addijP{!b(Hl2=iwv5IsNU+ex>&u;czQH5+GB=Pj zEU+8o=`!@_93mMsN7)Kl%xY#5UNUE!XV_CFaXY{6$jDp@N%`|^ZlO^cQHUQ#>{5ER z%>Oa}*+NN_xH(1QhWxxKk92!9Mc>UiGRGK;Tl97j9;WUh+GvRIlvpZ#(Z@RK=K zs8`oaIxB^IpKV*(XG!fRDjF4>iE=|tJk>_LHOdu;X*mk%O_qa-r_5K8r}C2{hHI(( z^W8LczF}04JV5ZfTviT}82k>W`D{n%!Kt+ae(b5TzmTm5@qA>8DTt)-zua!dkwTy8 zD~?J9-<$&@Y6r{Uqw&zQ^N#EDj`Jg6;Sm z3NrbOT0-i3l)D=G7%3vu?LGuUFI4Hp^`#g?jbFs`*k+y7%3?1a^im^K$2Es*sXTDq z6=Yta3fHVEpfoN}vRV_q!R@PuNqMATs4Ed(k?}Pe_4fI@NJ;2?R&-DfTsxUie#i0- z`I1OiP_~uwaIzh}+T>Yueg5Zx@%!%0FRbLBGHFT{CPbI9bJf#LQZBLei-$c0&z@Me z&Mt^CM8Zj5=@9uS%~bT5xpDPA*w2kfbe-JHEvX^xMNE*c_O8%>g**D*YI$`a--$Sy z-d24yM{DXG&NVEeSuXyZ3lyEo+jwC9_KSE##>hA{DRM8J`Oz1 zru)QUBd^d2gh$BEP1?K85|ufxKvi*P)IS2`bmo@4LeY9ia=zn=qV3$t_rB~S7h*8q z9GcyN#qo(M1Y(!1=gbfKXM6&E1oKtoip)wW7P4pyh+gqv&5t=)B_suuGJm|@0B>>E zdQ1|x8`tlE3UkXUh_$*UQcJr#V`;3hUuk*g%gxV>06*-_N0>>v>btVpxw9Go4Aq+| zxx2mn9>0SN4fY5)`xDf7m?Og7#>;n$g!aES2FkX=Z`8^$n_H`^tLuR6BDTu1;|l+e zY$gumi;eYV7#ST-1&Ptp&^Wre(E?p*YCpfNncs~t8sEvm^OAUD2k$r_%a>oB; zZ@g3X(qyI=`oxTneMYpkh`>Q-T??|*Sa7i_$;@3@aq?Aw8y59-ShUx*{37sKu)+Rs z34u_pcv^Z4^T$E3bxXm?Pa0+~NK-M+-Q(UdIR=UPI^gN=UZ~i9zeL61 zvbkQetzL+X@^F0@?xoaz?*StD_zC#c(&3}l@+a*r%TpxuyV)I-`p`T|tZfo%s7Ghh zCUX+c!4=pvfp&bSU5a7H*A3r$_>9&3)cWw;#eAYO^f)XnuKStZ6^T4ubk6qGi~e29 zqua%cwHsVpuT(akaD4AGR4mrHEDQYG+h@WtLk&x|Fs{PDSKWhIch!&Bp|2SMA%eZH z8-8Q`BhF=ldq<{V$tmn%hwUXB*>XmOyqu$K{Gc zLGbb4!(o+zHGeVu@$vfKzl;wbK3q_nMhl$8_0LB31ctrsTY^Xo2JUGKDPU{2=_ZSZ zuL2ccJ5s`H5eJj$B|~7W#n6M+JxZ5#L@$2>hQvAi0aVBjW8D?`$*de)5;N|^{E@9R9;zf>%Uzq zAFfxOvsknvIKE899DLlJRhNlrGMB(mJ2@7_Htj2L>>=((9Cae3_-J-#L#2mWc>Oz( zXs1YdbJgkWU=yAmSJ*FLDcf4FnrIfHOQin;-stFo35WoHF$Xa&}1 zXFIjg+23?p%p@8if!w{Pibb6@-8%xPvWU>5fO_S&*pK(4M9`fB7EhRZGa)WiFi`u_ zzN}fi(C3J?N=f@3;l_%#qs`pL%g)fGK4s;d3-3>)C~YCg)4ktEo0t3SLwTdd##1qA z4s|BY$QJzZ-rinaWMt1U08A#dzm>Wic`!u$->Pz^)aNvbUVfK>^5+{1r{BL1w_hBf z3$Dk2id=`OvJ@9c)$;K3)9mZ(o5W&!T%aumF|;VUC%J9Rn(21D#t+Lg*q;z=B;m)E zR5lo1%ZB1omn%~%ipkB4&L*v^80K~=wd`l+{OC<&I)Q+F4e!d4?ffvuq>O(+xEG->(&O zkGckP>#Y8I*f7k#^uP2WM7v+iiC$sm&W0hUHTd{w(4_cmUF{DzVo#E;hO8!3-d_th7-C`fQqr1TYq{fDSThLr&Z-_LdGH1bVz+EevAsGyTjtGB-?X4Sb(0ayNGZ0>-lCDyUlsfJ` zs-gZ_OV!B)Yx=U&;Bo2wh)Snn0$dJ#Z|K_k7S#@l^ZY{+Bz~_kT?Ca#<^)CGBnB${E_7M&@j8TILqy z1s?!+VOy<8>g8oHD)d@eS63I9%p?~(Ws(VghPEm!_D5he;y*K?1YkAa86x~lp0ziU zo6Yq}gkzJ!Tpw{`aK9^yYqQVB(vV+7iNeg5r4B$w)g_hfu$=VC;v;7@ELez6IpZgc z^}!dGXaZX`J#8MH#lB=Zt|DdvkSXpFFZeD|3OH3OVoJKlPakZa1$sWs1OdB9YY&cm zg_$q`xxf6xEF{a)!C7)Ioui&(1$sv1t=T&V)Xhzqy3rXcR<1a8%o@Y=K!#tM`Iz;x>^o?(Dx~`PTM!uyWo|NRIs} zJKvp8Y5(s@12JwIbPr@np25Bx*nA!rkJ~FcwSIL0_>yw7zS{zsdCGlW^3>VQT#IM@ zYFjHQYyQbE;;h8NddbytzB8Cy&)(zR*t8pivK|)Xw7O4EPe7kKy{6`p7tk9 zP(&Gv|7yC8BF=0een)e5*L2q$YWOBRs)k43q)N`Gv)7S&kR*onCy0cc>e-Q|vWe^u znl1YBnTYXGI|-^^&#mSAB?@k34)OnzLX44hLJF-o=B&%n_tML53EWiUqhBj?C>W(l z{T=t3fT=x#RhN^c_nbf;!bU2JoqRB=LhECb$xf3 z*{<--nArUEPF$Se-RvfV?LE!yqI05R79NG01+i>xUWj*owY#iEyN?c=ro0TCEC@Q0 z&FD$m`r)1}j%@S1(YfT>;USgZO1jonpilObDNh)&RXjPQE+lr{7oWm$2s*?F(+2n#n@W-$9P1(`%wp&O*TL6I({LsA4m=@?QFhVGCd z1qDHAkWflg8fNH}5~N{(p;H(_z@g)P{IB({bb?v=>`|Ss%SWt+m zk8ECIO*_5eo5bru*H;n}seBA6%7T&79lxYjR#jL3I7e*%WvHFy3fv5)P^IvQ_~oOK zBjcViugcz!PA#Q??D@1|NQ^K`Ya>|xN7+Yz?|-`&&OG}4w3uQZqjPY1ryVuu^3Vej zfd(+^=;006hF>{a`kmeq1{RmU>4Mv+cU`6{E?JC4xnWOGtuRd3F`9F6q^Y-XapZ!b z2lejJQx0wF(#A@IJC7Rn6CA&UE*MgdOKt%2a$CT`4RRz;;dU=n@ise4WE&Uz->=@2 zR%DF;HO$v3;lZd*yTJ2vU8iG@aiQ=QBvJ;TfX7p+M*r?!Bzcqd^v^zo^6ea>4>CQBi1Nm+5;BLKQ8es4>DBGs2H~35QqPI3sNLJ-sD6_q#asj5(@t z;;F@{rgQRI{fn!Ce3UA}ktX7!yKqrVjYG78q80m$G~M@@h4v08_paCP<$b5h*#Q~T zN(*iV1CTCBX{$`-t&1S7N*c8ekuz>8UX}TlsM8yvg&wyyb{wx@=!TzK7`re%?{mYF~U-O#A7oL3xNZEDHR${rqcaC1Gvmok6^8MA-=pI7Zcy-PU_%(o|x0s6j*P*a&hqxQVxtUE2{E?;*a@K5<$*-G)cm5 z`Dv|ae!*yJO8)9?Up$5*^|a6zTbJG$MAj&EbjW$kgN)-$iRFSU444HBhDYWii$yv7 zDGf~HT-o#g8cZp1?Xw*?!4>elLFsYHT9J>5f}BLN95SC6KIRwXqlvltSs+9O7h8s? z&nmm%!RlBkDD=Xr?ttc^3^+PQK{m76Y(GS0g88?C7=CIzfBm}Ka*&3v`srL^fN29h zdHG8uc_s$^w=b;Y62Z9E^0nRm!S3(6*OO#|21~h&aiG0D>{$9WhtS`os}py=B^Ge7 zQr^ub-0Sb+4$kG0E{y|4G>?`Fhb>3EXf8<3Cqgr+@9g(1sXp7Vr*EdMyzqM-CYP@q zhOv(s;WaWmapkGRG*GuHRR$D~5t@6!o6fD(P0#POZFg-tm=9NaIEBJkqm$jQ*HjSi z;Q5osqFp!XvgB*;o-5Nr3VENY{Idk$q^29RMD+{{I=uxJa>oTdxW}dk~Rkj zU@?X}CXQw|a>bKL9ln`cLFpxedVuCaWpf7)SmXSx`2pZ}0S{JGZLI{TBT$|kgsjN2 zKsmYAAc$T}@Ni7~p{1*LB+Ss#V=g*N&#Y0GmnD^_IayIC-k^~OC;3*FETRs3(C^F3 zDgu^JNjv7{gg6k)_T^J&9#tUOT)yD%Ly77MJtFhLS|q9PD5q;bE)m?UWqBL)ZlJD1 zz(jz!Kmg2XxlBvwTxjrBYDPey@GH#akah;lMm{B$a4bAYPMPg&;hfRij+@rD*DL+D zLsVkvgSBT%0PYV%h)vcv4$HQlPV_X4{=kd5-Q>)hX7i#CgC3eRj@_F}mJVEZuZ}$r zSbIptv<(;HKAQZl{LurYVWG+l)ZelZAHyit8djC0wr{wZLtZg^Fud!BdAhzkfgA|1 z`^z3RkK_Nr_SGZ`_iIJBzE9yvhzje9A`r||%3bL>#$)^VqzcLZo(Hc;GPz9UgSa|Q z$gTh$=l6t2ud4L8T?M)&idgLMqe=YJtmugNf=YdlkD3*S?Ns}Lgnc5_F`b^56rI5* z%-*8tO$kzG-hx#1r_{ogq;*fKgpIUV?Am-1a(e(>mgoZySOVEK$D`f#g2Eq-Q+z&B z-IL^fTV3z>?a=jgaoACPL>;Wd%_0~5GieElM+tjrLH~Fjm}kF!+nb-?YAVpb05;Kk z9^d#ED_61AuiaWl0$gkq!dh~7U;uAGZ{u`KXkTs`wwW{`OCI&Q85F6e!qV_dx*rZX z9JZ?tK3iTvHp_*y4<3yHsuog=KnO=osOp7g+$TV|Ftgrne@!;=BvQqZGjG! zrW_ka?VVa&_D7t^(F}itkivhdHRQEO`xUjvQd^Jj!=A-OHX!O0=gjSFZuNRE?7M4M zP{x4zbqJb=x8mD~deyd%NeHr4W{OHl_$6rsBu49RmkI-OOdhLzA>rAaBLtBbH15p@ zhIp6ikns{Zav7xKJQC!ffpeB0SNe_`G$**DKTOO%rjCD_XDh~R>mk)F7MX^mfRpoK`~ms(DG z-zc{{rDZ0p0i{MSd@F{0n8aC-$9=M|d-a=uTRyy|W9_wEL%4jG8!?Xyn3`DoWmGlk!fE;f;tO8|W`0Wxx9mvAC2-CP;#STUBc<-b zBIj(=YAS0eMIZM3qV)_b{Pc{xghjh8DYr*Kh|X9Jm9O8@R_y`sRI)xsKq@aK22;S$IC@xRsk9e9fGD1z|dWCB2E z72rE)yFRgK3C0q?c=1ADkh*Y;Q2ow2z>!~Q5KZFdM3q;RqJ38mGGtnpdO~=HO)3wB zQ$EUi)0wFB+CGixda|1t15RzSlD4!2t>|1rsb$0S;P*ERi+75&2nA7*&OWPZK-5FLio?*2t(IY z!^nEFuK}*&gXGp4Yqq3neec_5cYfC#ze{_jVti{I^xk{p5$3`MHH=+S`0^Jj?Y!yV zF`sy-x$sr`+!v`3DD&$sLjXJ{@u6!_BXGVqpW~mOTOeUAMyj!Xo)tv2&4`$B5bEwFK38A>zJ*{S{K#6%F$9g8%_WA zQBYO;?aA-oXUB&QM~RfH*;z_6Q0K+}T(O-fh)ZjL`a!#b#d$&*gEr2^w^7m;rIA14 zACG(8jsBZQ^~w+vl`V!=b_RU(XPY@5e@^x+055)IR&{MHjqgb4MKEQ(^p|GX>YU_Z zoDx!x1M#TF{c`cS|HQfr+M(EWd@2oD5%!{v{9*0Mp%Xr|qxVu>+>}bz7Q>}U`_zJz19NGy#DGrB5g$7 zUABxbn)g6;WqA+Zk(qyb72=s@jMTGsEuP0IlEUEBRcCye8f}#uO1%5BV!pcmRb4dhE{76+ zc5b$pg!=Lpcb6PBN^PFpV7}Rrg-i@k)*;l*GH`T=zN3iTjd2Fket6&K=n*bzNjjX- zxgWS^d5ivS!*=yUhBE6sJ;41KF(=$v^=oG3e-4GdP95r$HBwX&b94_kT>;)WhUVr$D4&oW@A(=GAg8&vjDPwS>-AXv) zHX`m7pVmj!xavAOzRnvvOC3foatR5*8s+8h9}DXtSL#OWbBd@wJM{W@LH6c{F-6X;cv3%hmrL|3~GiX zX5YjTqrQm2OVFg8dQn><$0e^TuAg-d@@2kF^c(Zea9JDuQr*#@q{r6k6|~NtTly6i zo8zqxKp4NV=glvB?M{dX6dkTn%S^vG8&!6PIma_0l2Bu0*-46@PPvgwS!AofW8y(a zlWqP1@Tjomn`=Qfg^z2qwSxOg`pJ&bJX1h5EN9}>V7l=!TuLq;xVDScd=PvFQwog7 zgC(ihyCthjKN}EfSfli;ng&6)vM?E7<65+zr$j?0I}Q#B!n(`N&o}LZfNuPhUStk) zL{4$%)bm(Ju}%TB<{QnKtPwG`q;9?53+~w){Le}rK_jh*4A{iwLEPa%Kv+=yK$)La z{?X;;0{-?zIx4+HgmM>`09m|;dl$1@Oa1_9#XK41=VztlHn@aLKvcWlt=u**bd{?Q z`p}1Bto|Oyo{uQ~yebWYPn`Z$4j*FBEv=DIdhTpkrdf`O7dYFwnCR*?#*P zSkbS+b-D~_FNwpCj{|bdl`yc z-pG%5`S{TA&;vADpwggj8h~E|A6qU~KqI4xDj{6eqlqjThz&o;KC9PjSk<;RlH8ST zzqQmi@vxtNEqou)RNYf1RgF9w0z;f(F(NU2vAqo)s*rS2=4T0DdLG>mxY`l#G!~m; zmCIgF;HWd1OXw5>HFBSmwTvQCiQt~18Ig-l47gm$bv4At+Oe&Deq3;xUIL67QL@g^{*EH-#YRbSL-^I}h{ZvlSjH6X^NmR8{Z!H1P{`~3vHX8T( zJ~2Z+>y&0C!l#FI>EUB+H^#~+(FeEor&%nvWB&OL_dBu+h~w>epQcg|O0DcLHJI@V z46-`Ra`vu;4LM1y2eGwyuJJ3`i71LtIlK;{S)RUsV^ywue{w|6>ip7_y}=LF0;8;K zb4Ne;?rKGoi6Ob0GgrGezffNxXmuUyI?;F?R>3%D9X2kN=n`hdoZ#+?u|n7yUF%)e z+E^1T`(=ip6i--lV3%K&dQli`uh=%$r#1A=boQ~l2swFD+X5PW87iL@np3hZ1*fof z2me=|2EZhkIooUK(Dr?s+93eG^g3nvk=v=!EF_#o`SZa7nENNwtxZi`$fZ|6Ck6?i z^%vN0;yxEB?ijN5-s7cPCBe3(Y`{_~17{KO(4`HSqx6RBz1oo?UyH?QG2-D+2xoEF z@ZG9Q(~_<kqgmes5RA zd~jvmzxI{O#6fE?MzycqkDJoFl;kVt`?=UHI`*28^4|6mue|E%#X!tu3+^U@5kh!; z!0Qo2P7%?UR1$dO`-XtuM_!)M_Qi`tNtCoR6YgBqRFE{jIy^PKpLqKupvTw_&$Dg; z;8VPbQKNix>Lk$67*x+v7_A^o_FQy^L)ikeZ9x_>cIRh(1RkRsXwR4JnM-|>?jutX zpo|6QYo0F0SoyDg;Q zPY>{S#lQc11B=KJ;}h$3_$qV?s0MGRUjErhpBg5n!Ld)xAJDpSr7!X@kM1Z)lHm>fSBh{r$E z$$4U~{J66|twR`|k{m6cVLIf!E5au`lM59$<7RjHJ`Ja&TB9Z{mn1C4*3sbL#9esg zY~yCRbVIwDMeB(+@d^0Ub(h5@TB2-WiTp zkbsmPV;HI2@0Up`AWnvCis0TGiBIFBey!ue<*45J;Fg=sBwbel7G}3-OkrybwX(?b z4LI0Jhe6H292#Wb>Z_a9m5FzBDCSg)2MEuEvBnf|x_sAcc!fT2Rj*gzHjBLwt1183 zCW^eLXVQi^I55(uH^qFdJa|xxnO`_%S$sY$-53em-pBDd7)Q3TwR_#bPO^Z3i z$;q}2>SPa{S5kvW+wM~pq=ma@ml){4Knv%gKjoU`dVs)mn*#7C{Q`V!0jhDjq53U8 z5&voW4jXk!(5{=F4Q^euC^sI-7{u5BhfjVb3iASPO2|q5#;Fub&yqIz)C?wy0s_U(Gro|T zWKyb*zsoaWM9Jy$>gDn>17s;gdwzS}B|RMo;YR4^1U&)4_}{gQ3~U4+TrUmFHxpZK z_~Ai5Rtt~IMRF3}qM0pdUkxHUtL`pL^Mo676B0N^k+kA9#GTL}Z;7E%A1}M(AS%Qf ztI&Nr^7&>8`B(D2n)>v>iS~{^i9b^xZ*zj$tim=rHWkDeN!iObv0EV2oaoZu`JCj# z+Fmb{JB62w3s00(;}z`}sowpi?|2EHbnH5}mznSraH79AjhMr!VIF)gAwtZ*MvL$1 z<9>DcVhHRI?Rn~$R7S~b4#Rf$SZ%9KIYy2P`u0`a8BUpgIBshE#!U1A_8{e7;U_K^ zyKnt4KPO6C_)MptYZ%SJwkly;3&D9MSLo$6gikO!sD|PSV~+A8cW-j~U0d<(V{nu7 z$TT13M0_nbDsbsX4GLI%XE;( zo4~H!a+vs7UBzOBqDvE>y`D?+P9r8HgWns*?3cbaI46(m=y0HL%&B};wTja$pmxkFLup{JG7dFPp?uHH zF!{SAo!xzF=uvQt`b)xXj;|AsM`LXhBBy`iuyS*(oT!P;5Cs`d?k9@NqrPTjxh{$b<@Q(s~0jzFVf)hAmha!8Vb&|zRatLtTNj5!}Lm-io12C z^}DeHfq%)%yq`bg@JGKUv5V7!WmY2gFE2A?VkVdy%9ZPS5;62Wxvm^t z-=f*>n8uqdld5wy%)+ZVNnHsF1t5^yGds5%#U4zJ7EW@k zD8ABdeZvsSVC96DsVS;^DQDZ9QP1l^#PyA=}Q`R&lu8A@pi^~D+ zm#l4Pt0eyz?LZP+{SI4v&SSor+1Y>Ey0auP{f=Tdx=8e9QJV2I*tg2{Xb#ch zax|V++EyV5L#ZRSTU`?DxJ8;NTMX`tip74?jv}?VZ*C7J=7nP$d{U&0v z7-&$$2`ord*Au-Wu?&fw-!`=*P`q!H2n2Ll;L_blF`V{_-G@V1tXtp@@7+&>t?Ve-tEUGwc4wO7*%pE+ARNdh%H@TbF?isLu8H*J_5m+T|ouzeEAoTEA`3O85%RuS~@G0cAa`HKY!MA@*k zt1jwA0y6QDiItV#$pU`I=0O0u9)-B(uy#s_pu`Evvv0NjH(*NiS%-+Tv$4^RCH;4JvFGXM(7|nH#aOa$m{U!#?j^haI7T_ zewKeP&Zw*0OF!bJTsz~VDhRAH4mUDvRsomf{eKO^7>w(kM^wUXF_b_Yrsw8Hv3JdD z^r1v=fsih!L2BhBAF20v)lo11Qj5J#&!A~~!I6tOF~pTU=VzG(YW-J8woCb^S-6&R z90VR=eB$+j8)S>;&zWmnu0=*|N4Ry(PrcQn$)_cGMtDj(61vMhrJ9TerqDZYRF!q` zJ`u%NsY0G;)5Z$@q5?rd?>-#Mf+12ug1(kl!siE1EkgBJMCW^-AhyjcmMF>) zUvWw2?@DV)UAe%G*$Wegfg*xFUg0%`nHtW3T8Oa)0zi_k)B39nah@>}$$4tOOfK&5 z#o65>ln?x{GP_2lc;k?uS^D7J0r+j1N;+c^H$QAStGX=M9#bvjy6gW(t_4n*_x0%k zo`>^N?2R+T!$O+0P{8>QQ}^i4O+2&Y?|Oc_&1jwznVxVNkeYIB#8|Xl8nhK+?AnF> z;90BV)tbHR6!xZPUvcyJLGPLvQ1l6eM0EvzTr|Ei%P|gV*$u<}G*wPQd?S|LK5_x$ z@Ii-|+>}U$fvnI01!zoN`PJE6v7nw!=2>5;RN7LhQrN|uNeZ&8WkwFUPm4|iZxMKt-#o@7JiPcyuAk464(GBnL6O`@Im&-)*6rABNosv0^#Fi>9(16 zU@*m?Di3p(uJGH>e|h}bUuaJ54O!d_dRJJ;&BDS0+$}^8Pef%0YsmI$6^&662^Xi< zDPKyi4x11g*qXWTgL0*1?}C?WW%U%en!}es2ORx8QDelGbSGc)K(OeT#Mt-mB#$gP z^++A;I0lrHQPX(J>E18x+wW~HWH1oD?+QMrC61JQgQLaEtqsnijwVnSDo3$G>*et} z%p(Z<)gz;#?kI(dy*4zu17Jd)Yf&#>Fj2~Y1T`9)l+8*g?TFt~OHwPS);e3zxnCL-f^v{s=d8Iub=DL)k(Oy+ymAeJ{PKy9SKu#l;^~}ecmMtYXlLVA~ zZGSNJFn=z}v|Si#NfFEH#!czV`o#;+S)r59PQd?ek>S=A>Yk%Fv1M4L0%loX@n8YQ;oN~o>rfTo`ly~=hnjLX z@^M#(Gu{WF3AN_E#y)iaI;5kJpGfh1j8H#+EAT?u&cnq1p_mqLG7pGHMHij`PV=wi zURfz?{iOUO`2+4Be%V%ck=EsO91xNHb0bnfLETf3Wj-T?KjnfvpNM_R9!rS?f_=nwwM*DFvL#R2dePWqVygmCms`7o!E9xgoFbS% z=xt1m=!UsF^33l^dTS>7YklP&?W+f{V1(ZEGY?b) zjD!VUcbzjw@8QvY+kS|4AlDlpM=pvZ?io0&7`5RF=CqOA6+G?wN(KC zQi77$m3j{ky+&ofK|j2WX49)`=6kNUbRZsqU!h+PYeHM&7EP>%9VkIL^8ysU9BU!#Ac9f5>*YtLz z-wg~MRCQd6=(~^9Fj8DDhzXMF($nOA8{*z-Q50UrH>dhY-94#Xb-3TFE zIudAj{-572u`fn60*@S`Uza{ONrKSPaOlqd6z|Y2lO4bld0{Y7fyba~P8fpeh5H(y z2-Hb~*6atmEX%)7myglL39?kCLonC+5N=Y_?w}U*5)L1J0%1G92Ck!^K|1^{uQBh+ z1z(@}FN3cNl<$C^m8gJ<(>CnE;emaMChQ|3BZeLN9;|!@ywv&EFTdfB$aRwgVbSdzyHVrn-*Kga3+7 z+(?%T>2elZI+y2P9RqIl${Td}rN`}l`wi;$;@=KO0VbRKi+=U@nKiuOhU0lq%}r6Kbjt zJk^v10$ujC2XbX)Xav!dk9@-IWeFEGfak%nK5cIaqoSRC(Nz9Q$&B`?CcDnfy%0x5elRz{{d)JKLXpL0Cpr0%#zge7`QiCuIEH*j4QbfO*<8sh?lyAY3CWG~(27?V6Zvh|%{JFNHrAn6hqpeS zo_|Do|1g*Pz27=NCEvvP&rIzl$56-?&Wwr9^*TUC#ol87@4P*u2tVs)lX&rO>SkqS zUHSc+aH!?5;cGrmnqxfB9to_kfd$bT@HhfCfkOGp=_1HrPhsw@TNG`BVg^wLGDu3A3m+gjDfxgN1S1 zMkNt_7*z&Ux-kd|S*^}sdKgHob(DGFc$wDz5#5Dz@hLF)K@@no?qR*HfTJ>wsDQ0< zzc)A*{K2wd08=+0{^XA+2grNtaOn z$sx$8Z7TXLF-A|wGFe=INoZ4i2>fKW!)3TTdG_4JoC0;0Z|mQ2g82UZcE6aC>)ErY zQntnCE?)!g;n^-LxN`ST_Y=xGZ&6F1idE(^&&RBVIryl&)pbv6t6bpSvx#af4<00u zVSCrqyWe|CrZIdU{TpGHjENAH!!x^AtDM|PHH~AG$b&mB#`!CvRRQXe|L1IgFo`|s z&)GJFzto;(mp?O+_rs5Un(?4X8Y5Ya#DzvxW>CP8AxtJdvYt_|(}y{3aV6?baFTzl zZDr0NXVU2z){eS28B>{N210w;<8v@*%&rYFfQun@PN{cQK2d+47Bn6d)bWc8t?L*Y zqXOJ=?;U4jfl^8nDe(NmKd|u$GIZI7&&26zwKQmko^(;_0O4bp;x>Ztv0~nJHJ`?( zLLZ$d-1;ZRP^>oXF>xqXwjF#c^RRN68$T7?3ahkl>iq`GS#S)&ZtJF8bt5FLE+4fl z$`JyPDB!}H^=W1g%IuNGmJX_!vAZ6*|y%mXJ?-JI;3zZwRu$S zswKLk2>Q-Wc5%W3WO&3zNXuzC=#K7wO=LT7-SSF>4VXQ-{S{i9_;sH5`;}eA1 z0h|#6u`(O8aIR?aDUbaUK}o7js`vBAv{Y(-L=B}VIwEQ--x5@Y_pbeNZ~Z22#{O*D zm^_M{v9`xq>3Ac#(3fRgea|yFiMiof*wV{63MB?^w|5cjBAZM@i7Fl`rF=|%-rOpw z7JT~wy0gT1ghbSYHPn*QRe2F0Zg#4pkDN5UH=KX29=%D*OFBFoAT2F5V%gj3mxz*- z(&AC;_<3LJO~~?cS;E}P%J;IT;UH0I)0{NsYPl5ber1t1gE2ndk5Thzd#zf$Ryr+a z!uz`cNRQeQP%7-&vvb-~S%phL4Ops?sxU`WA~H84=jRUkU5RT10x@;$=4yhHQbpJITUAKy z*iT9uhYfC9psbE0>&x$XEcw0yuAc$uxv^<>8#V**!qm&2($Z3Z!gG|dbOk)37k%v4 zXZ*J|oIeggiux1J$o>mm*6w1zsZLmZ`tM?T^E><+KmiZ5-(cDo?KeXo=8glYjHxMF zAe5#XdNTV0$XNm>q4EbFW;RN;-_`)H^5_Vt*aBYaz<~+;WjL6{zNTPb?RiUoww|K@ z2dH%bmZHcEJhM$xMY*qB-D@%Z^31mBOUbvoVTNz@gQ( zt^IDnD*mvaLpy=YNx-d2Wu@@%g8&<+<^-ar$r5P%@Pvz!+Uitvx25zQ2l;vZ7+eIx zvhdroODvUx)eJ~u(3A3v6AHQ`A7X1(OVQQ~pFTmVWkDWgt!_T-!|J`kz9e`Q6y4p; zy1Ty*kW%o<@Z^3VRos_MjBZLs0_rcsj{C-!$}^TA?b+jq+^xBv^Zvs-<|u#iME10H zOo*j5d))5~KRg;&xdVSI?!RTFB%$t6d3xxgZy!tc#wDe#wwrc#niZNV@-Gs!Q76t{ zMHVwcKN8rJ)(AE_YT^n;Hmxin1jEZA$O{T_1t1r&UAXNy-*5aRDFTr4HONZ2<@j z@ToV4wNwIUHaq(oV5>eG(0>)le*IhX-(#G&^=~{f+%Y!Dmi=OaUgvC!J0PBanlCxY z{~;jDvj>Y(LT-4xfi4;kBjO)V6qVfUcWSh@fP|y52@}O$d46<;L@wXg!IE*L3AP{y z+)S?@F{H}lQt*$G;B(Dh1qR1^+RNhNjF*H`ghO45PKgk8A^|Ebp&*D>RDDlY?;Wk8 z4!7*p#WA*Y*BHBEuOPpOjHQ_ZSgN_10dwLIz7~xk$1m@W24y2)J0F{h^T7~J?nK~o zUAUmUT^E(bfCwS&te9|^r@>TfsfOE|{@%s~O%}9b)V|yl6tEEfz&8}#w+bKCsOXM# zdo0nc;G(9Ar<}~G0`bYRjY_L-Wn6Wn+x^8%OoOL^$guw+y| z6K_1Nh7{m6e)KL)$FudZXQOWoJ%;(2b2F4_aO4n*gW85zN&hf5U3y zWB`47QR*Up;g(dfH!gjGo|{Beu$lf}0UHS3S7@mabhN(Pr*w1p;*x;iR`cgNZLQg- zVCSt6*Z;a|GRtrljm{+u)->Gyl39|!`8%P1nkcpns0mb5fTv&dXmb-E=(7YcF`a5C z+y$UB_20|`{3Fox>u464^?vICuyfNWr25yY)R)A*wmne_Y)|p1Y+J280#~OyUo14& zjTC))^@)8eQRJfeCNaFa|B2GLRSC}*Yd zX+0vA`}JpXW@lZ8Xm@`-FmGP-={&T)tqWsf5_s*8R}6ZNquR*fprP`O8nZzLDds4m zT<;*a7+2qI>ZYqP*TyAZ?AvYeiD!7sM6N~<^rm0C8lhA$*23kkAe;R~VaS8ax%n`Q zk!?j>DB<{`aB*PT;{|T%Atur)>kWI8xa_D+oLRR~N<~U^&N(&&2aR1Ez>mBC&jCx;(Z906CugxhiC2 zlOOU5%!Df9jlb96DyMI`qs+B8L2i3%7fWGIsAqdgveNQ0j3x%R@$j7<#F>3P0r~}J z47_sz0`AkNKL{d`A~OI+lbOGI`PIQsYUAVV?mU;yYH%I3XtHS~AxbwsC+E)A7I#ai zAN<^o9)JSK%FF+-t0p{BQillge&F%iD~rtO@dj`Q^zM7i;p&+dHj8OafQ@>?eGv8B zgFfL~Ml~6z_W&K4fdwbsG*gVuArx<{De|W9NzpsIxQxgRmzw4xkGWUq@u>+9U6e5j zae+QbK^)E*4`05krDzEW3roz+Wu0#i|L#;fYr*-0Uj6TfIAQRoqEy_`Yh4-We}YM! z)OqU0Qn0~c2Me>a+kj(7PT}Fh4*|$giOUiDKvKlr-5oG@ zsCw4Qj{v7^6%zS6Dhd}65Fq+_@|}R2A20@JVfYtrR2A~%B}@#YV>7KfC3hB?fYm7< zyJuuj4{4=e#Ht?FmvvhY%Z-StRmYBzMo#EXL&R~sQ#syGac{48xN}AH$oIJ^_Wk;$ z=$=l0wtBC3FoU}DP{Gh0PMuZ!TX0(yEcI-|^Pvpk!rrVfqpeC$t#Q3yXUktVbn zK@hX|Yko9|V&3i#>kq4Ik0c9#HcP33Sew5i^b2<`6SoE(#HB%cud;)KI?WJQEV|CX zUlQy@0}ZzU?(;19E&YdMnm(a_?Fi(WqqlMTsS_n7l0_*UIC#zUeYa=_=N2;m$Qf+( z6WeohUnntClk%{9APgGhsC%(##{7 zH%>QpHAz$c#8XjeWNGavE4TEhY|~W8jiV0O^Z{^+Kh46?KxK$odM5*J@#KAv`8KAe zfTe)!zp3a53)BR^)wD00^WYLasejo1Ll10uDaI1*ulT(kHG)P*Kl)Y;{dFsmA;$!lS7TDLEFE2wCa-S>} zxm*|$20c+RX_ua!pbXplh7eNa_uQv_Tf03zqkp{1ph_ zRmjpofEEM%xdBu`sFS6QjhY~y6Zzt^>etWR!XiKSq?Df$ zz1c*0qy#zxS$lSUo}8oJl!2KhJ~1o5X^itY>&c){OEMi780yS0&9MSX6V(zYiP$Zi z+xK#7(EOXFGOUKe7afPL2nydNb_S)BT2X7^7*=5kon(n1xSy#(9Htyp)Ir&ij&^9L zh1Z-s5z+AI=d}v+`77rWA%W+Ht2?Tz8{bG;f@**Ks$oI`Ie-$7iZYi9mym$;5Y(Q7 zXjJ((cQqceH{uz7vaE+?NlH1BF1M6Kb?=#pQFN22d?I@GW&lM>qc6bahP z<81mYpUHMkl-johDt7Yc4|#fv^o?gl3f%AOe07 z36Wu_HeHqz0_r>K^pW#8UpFOiDM_u2ts4$K#aJk(=^!E6RE6pSnu7Px)LSxh()B_S zpOYKfs2XJTJ^k(t=4e$a;p8z?^!3-ay^}#_+33WT%vvr>$1YJZIx+qH5 zAUD5o60(S>*t;4{L)_xF5@X&3D!OsKb)7h#n21KYh2gTQe-bw1o@Qo}o6N92DZ@8Gu z(rv}Fpwc;j4+RPg))U)z01T2KE!6#c4o0LOGfq++t^Bd#=H>WkA`H#L{bWrEwS?xA zhNYx6r`F!r|5&l-Gk=SyV{@DF$`I9vC_<3OIkfubURFdk&^ZxjG6dmK zF+*Se%Ek-zJ7Rja4&$IC^z{JFMOhV(n)6f59TzT@st;@sl8iV;A%^(Lnb`pqJ9c&j z+;kb`JXgZIhbLB^GIin<_hQDszvm<{jHIN7rzJpVw&w4*i&rT&(RDWRca^^uX7RD# z3L0pmc&?D#&6T>iKq!SBCs9&VD;{L_W0yA4GR3u@kR zerd8KjRhFVvgmp%1h&$}jP+wP##kcvmvPF#y0<)=O>#1xM2-?77Q6KIKga4_kI6TN zL?G2<2Ij(~^ue6&sh3h_l_)N4>h&PP`0KOu{l!!B*$Pd)o00wSJJ>X6VTnGX2 zJWyMZD&(g3{2Bu4=6Zr^d>fA^(cWY6R_bRQN@L3APd$C3| z0%GvjiSK;OX7O;J-@Ws>!`p?uk8OkdUMr}k;uTMMdbuFr!(ZrO7|GvPQ?^T`??1vh zI%WnDg9;=K2s;E4{i-2iY7Dr7yNWLep`H6)0k~_wQxm~2K2=0lF%^+QY;+MWU77e5 zw9d{_)34AG+zb}zCu0)(>rx)fmVvE(r7PLJ?hv1Nw}QJXkjQho#`?idqzY{2(ac7o zLV3H42Kg2@&R&|js*usA*(jZ@S;3E_xGj(4M(DxTNDnYqa!9NO7lRr8Ie zx;0*}^;!>+il$(*W2Snhm`-M1DBsH%K3nVUU|4bQ0-2l0C5u!xt=M<9mDDLbNyXQ} z{Z0Y}fRy)*EG->mmDty?IRu%HzYhVSQ3{~vayN6@*K0yDMhySaQ)R*k`H}AGIo`&q zU#mX)=!=U}#L{`i6%6`q57|;atmuLXLPXS8_`Eb(EIGEYV7@4F{aUFf(*_$tT8T_% zNJT7FoVYia{0^2%3|nde_`5;G0oa^IGwW4hzeUG$s|$?&k^{v>2WycYl<{TuAiwb|45t$HXV2HzTVjlxSegwytkmw5&VIb z_8u){>v-_#&$#ywXP82!&9#XtsHNSGrpufOy?a$~ptyX!QyS=^Y8;A4T=aqmIC1gZ5;v%~!d2Sq$)_7lU>B`D+>ikU5(=YrAWYzY`#dlH&+j-mcJN{^ z_Tsv)`y1!^Ift4xTTnY~yL*7O0RQ#YVZqLP%rAmwBA3gyxiK7kuIt&BYnruQ!Gt1Yury)kP)pe#7{iGwM-0xp%XY~OsXBvTmQVv@k`WvR?UmG2$|2pO;!17cemc$HEgW$K8I#Lfjt7HX*(icXO$N+4yUC^d0b8qW zqt0W`H8Hbks2^>pA0Gr=q17(QMn54p+ZJ0WS!SmnRFc#XcwkN%1sp$>+XtWpTvRc$ z(J1`WImx-{v$8@*7JMhVv9ePD>qhg}yYc}5-|eo_%!ZMP;2Sa+ca)Ds-$oG`__liw{#y~a@f4Xm)b@$}=@05(nAuEG4EfpdJW}EDm|E8bIlDwn_~_dx^^@=1jL1goJJdE_b>xF`JRtaN z;md4VY-1|tBt-%>+$KUyoxP}rER%zfOBuRBw!Y>{F>qT?0!tmhHB~c}`7nUFrsU#xB>MZeK(4Ht9!QYMK-T1ApEZJy6{3wKzcF#%+o1EfQe2bwHdn&ewzmBcnVKRDUk^f~Z{{+Ave7!!hiELHJ$*BM48a*8W2$ z(!oCCy3lX)L`qibsZKRDC=Lrif=BAVrV45}J8A5KBJV;KCdYZna#yg83^9n!o;u}gE02SoEZ>qxHhrBZ`OHo{v5Ah_5=}2?#8{{y^4E2B0 zH-aI9v@_)L+5fWnXubKkx?C84KoDrHw7TdXx&-(is^Uo7>wdM9AEz8!iT# zZ@y-LEI;}~l*RTKx7xw;GW*QQ*d-v*%#8KNPF9VVKzaJt)GDmUTv3UOi6>Un{NUn? zvHH(gQW0gjl=-3DTLr1=Tt$@5PfU5z1p*kzULvOKK*Uom5f0+)eW?e63(r0h&2PIU z&{NqMFp&`QKBW!eppT47AXag-L-l-pbz|6Rmo-oVv>+avl1L5DwUT_4A(x7N{N%Q> z1G2&0uMUw2D!)~b5~WLAL?NQINye_k&Jh*1AI=W6zgbL!e?Bh6y|@d~KC1Z!XI^Y> ztb|Bb1GAme1%(+>^k7!=hwY#CoNHJPs5Vh_{Ho%E1fyzOh2(T7E)8vvKQwS{h%#zp z?z!U+H{@`6!@r*lPWqnc(Yd*o_;?|kq1Vp~BYb9lN`30jfeg_&oS&+XEnZJJX>zMY4_tZ|TIkIv#eNOFxzoi%`_rZ&0mhmxzDXn}oExrEz|VyB ze7yy980GY<0a62FE*?2KYDeD($aC`YENpFga*P7Bh8_*$RxP_BYqRIW*TjQAN-wUy z618NV7Cy>(T}hty0DxHlN72HJccDogg+=EwW4^?i>^ovL11Kj;j$13oWeRFFR}U=I z=inH$ztNRn-bH5xO0g!hR6B|QJ8Oo7ZY#Sw;mA(~KVoHFvQrw>mD)^Eo&(n3(r2*yD$HG3teCxf zqUhEq@chNNdg?`*F}(#Cdws5(1Vo-yCZb$ z;T1oslqzg%%<&d;nnK0M+aUX`jvb^k;mgN@6!7$Q*u5H#as;J^JsrAs0-7zm!WqKc zXPjSMN{7XVz3F z_RrcVm1SDL>R^e+TQ0Tbe?N+W=iQDQBv!l!n?fl08*?+L&XYu^N)3uRl}9Ykauk@f z=Z-*3iHji3w;5{ODY*HD@9V=+V>VuEbLj$F_P=gGc>?6JAl`iAi$_uP_=*L{(QkYDFKT-JBh-O)h|Fw#V+5A~#)Ab(qhwL$zm%*4v{a2o;W^ znz)qIVpRl$lj|Y$E6qILf<`e;V($9aO4wogMFdM7IU59)(Ibk_nNUCsT)C;~T)&-B zo?mX@U4*y6+)S7Hyty^WtTnip)Q~KtIIsa@M+uFhCk0oiQB+b|eOTt&+(cBQYOpI% zQ+*+xc!|!J*w(sx!vCsgrdv>`@6$a}^!KcRML#fY9}pZRm>@SQ2AX(sW0)@i_8bX z9vfq>S@ZsN{j|t1<4`ksB9F%fmE?(kjvb-~oRL!Fsz$HI_oV5L-h=3I-LVBQ zeogjH=!#Fv)3d?%fqllI=H~D6`5}W`NNIHS0!4-fQHf|Qqmbes3EAuoq)?wzo_VJ$ zEqP1S@U0jMb|!gnnbb#8szq{QW}tl%nv=+W{wUU2sQL0)TVNl_69@)jL*Z{Z^a!N4 z)e;y>7UFf3H9uOy8%CheRuDaows4=Kkh4u^GF*6U$Q-5{G6gQ@HgBPo48DK7tsXWJ zBsKI(#pmxIVVR4cTr8}tQS5f=I%Gf+)?`!A^SZGWl5OYYd%pP_4w!Q%qdXMqXiI!K zp+hwg5OCq%V{>$?OZg7bj_=TCXb&7(yhCWXL)8dB3&_DM%`jC87ieFM*IwJ5tcyJ} z;mP=odnwkjI6ss07xT?%Z53eu6&?dDb_FKYxyd+{L)bZbAA0}yq`hPkB?ks8N>FKz zqnw33=0d7;35l~RmnuycXJ=LuQ)3w*Z0+jj-@kuX2F?c#&Ihc60s{rwy#+;GjCmn5 z1Mb@NykjCi8U1oi4w+~iHwR6H)!&t%)xlYJc>t}Y)ek{z*6yk}$F8BS+1!vqlYqX# z^GjTNAkQn*))2NRB|({LmiETfsGwcc*AO6BIL=>eiR7jT`}<|v8!N>ys9~FR+LFGn zaS3(N2oxXlkUT^VULoLg!dlcT=?lJQX$sY0uyg3sdYzlj1|J>i)m25W<&$XY^g5-j zcV>i-AgqY(?{Rnx>X}t=bn&{m5gD6dD!40noXb?8>Iqhe6p#}eN&-IVRAADfm{Aam zH5Yiu7hyC=%9_p4fO4jj%g$5FQVHcBaF!_pYW% zba1+qDNkks&O~nYkZX*>iWp&+V6H@_q%|K!Nc^htFabvXk_=f=!!}PP`E&QJ@CG+y zM$asYMG^D3cmMl)Ti9i*tEAzuv(u)%qYwXNlexm@d=G95AeegWz#gwZ zP&cEd8A%0t|Aj2G8jmJFr{@5EnC?hKe%j|7PYMbrmioL2-Jm|Ue>&RDuT4+;iT&f!E|M0?sf|oS z!U=^V#Ndm4oTX)I#1(|>cO1m1zWc$g_BIxKNg_o+v~TVybc>n4Pc|nHjsfu!7bzOp zr7R-&vY(MM#%bPV*S41mhl+5hB@r&zQDh3Akg@AP5>u662K!4c>ZAe07QDsUyWlKT zLhTcHL=C>ioD#CJdCzItYwwfrxABA8zjjV;{?{=8!DY7T&b^6=R$J$-BbIfAPg_*6 z#^fJ+TQ4hB@J*zim$k2Ke_fFFx{weM{v=a!4+SeA8+=sfYtP{6gj_V;!@k>s+uc_L zuCI9A4q*d@BwRT;ac+l5k~6j&OTktNutAi>Gv$s7l7*14E5(s*m+)jUQ0T}qqI}iJ zm6mJ};OWjd;;kA`ZK-xOLuJAZNYb zD0mTt8(rI-TKlf^eUE?Wuq&spCKApT{8yM&Cg9%~1Luc&5SP0te~FXPp$Klcw0YBb zN&Id4_hYmE9m_Y|kc)=*`_f+NUJ|(Xm3wG0OsB-m*Oz($GN{q|{hY7FUqB$?JH7JkQi-{_n-dcg zH@|$D@D>shB4ani85EEi}t#8}mqjaMn_0%=AEjSfxfEP#~a!H8pBiL#RuYyS{7 z@S1-!0nTq87otP_3HB2fnIPzzxb^g-TF!15sEB)|Rlc8m%|RK_b+#JwEc11;Pyr;cA3B zZf~Ec#PO&WnN=Pi-09XsUk(^5l!0B7XtTHpVeBA2(j@+dMuJ>wq}P`DQhU6mGSN+y za6v~ls>$yf*e2z6%}If7fA4yHzxVx(>Yi41RptgR5dVjkAPTJ>-uO`SHaT%_p?SZL zH}riY`~9|Um})Wz{M)*}mUVadlO3#%xm`;Rja*Vh2lUZ>ddp)Uh3vxe)bnt%qSq-S`|M7Xj_q?>RSya zT(5E^@D+~rXvgHveGEFVb#YZ!aa9@>_;c4kzw>uXl)Zyv$F=(T-(=Gjw{9sWF%wlA zgMTvc<>h~<=k>KU;Prq9bX26rYz%Lh1Q^~tAx%u%dX&gXBd-Ed&=UI(urgTN(uTlQ z{s|Lvhvj@umF}G87ojh*zGnxYZ?1Iu;`eqhwl^;>{0>jPy9am%CRgd+FH?EC2saSA zM`voEB~MCFOb<}d8NYHgM?hMy!k7^mPO5w^>g}QG3q*6liOVG;34zT-2e$Y31 z_mq-aSt$|JOJqeyJgYgy{+U!XlR)gLj52!+@UG4yx6(npe$Y*v#PXu^tJY#j0XuJ` zMQns|gOdn#zm{U(AT+Mb3@4b=5OJpQ_L?}@^ZUh-SQbeanh+!VnMKSvK9)exzf?QF zk$}e<9Xc zGjVOsE4{h7tAb5$%I#ZRTqw0lx<$zufK>{hlxkIQ;KKhXXjL<(b)`wYCkuFLrT5 zfL2%bVmrG!=+6ZXTUx!^-l3Pa)z16EG_4rfmjYu_&IFRHy9MfJSS-=3v_U61FtQ96 zM@DdJrvZg?$N4J;24@-0xyg4&roj&$D=s!vp)9`IPR)ONTOy7wc2V_DkFC94+KjBL z>_m%Tce2A4UczAnWMqxvS`QUc!LcdGyKpfIrlMZIwZtRP2#yY9Pf`G74ow-B6QRv+ zPUvxd^z^O8`>DR-8y9}fgiWKo;dNTls?OVC}PU&(bHS9|J9NyCCsB>D)lmbdT^8FQ#bWt4;$+!3-MClLeyF zt)Z-lJDN=s8XpWk{xeO2=Gdss{=TJVFqkVEzT{ap8jWm5CEO#!bwcut3LD@S{e*U2`2 zU2IYfi$K*@jOO-n2i~T9QsRaX7|rjhmpi+}3hCfTPGe&w{&c?CavIZ)&K}vnmT&pZ z)(YQg9REG{koNmc>YGOr8(HFUGsK9s&E(|9@ib=>+F#QVf4M*P83nO2u}9}}Z3F~P z2$*cS01zYJa)Cg-Oq0MxUENh-r*apgT-@J4$cLFZh^VEHI-06T+EE(pSo!X zZUW_BY>+=k%}()(EQPoruGUnwh>vT4l+2o)3$!jxb?1>fN5WfDk~Yh@=dt$Uy#Yyb zD(n;7b+6*}s#V$pOKS~9M`?LgCO}?(KC)&u%0j&p#me9k5^LK$~Q{Ut!ANO^%m_D6OG#cc`yGQoem5dxwNv< zO_|~qB_BT?m@d^k-dhlr4){Y2WT*mR*~4`dKqd|%K2y6w&!UC@*SS-xZ1!iW()#lh zQZnX3rI^Ex^n?HGX264Aq|!5gIQ_QQu8`?$m&7k%C8~q|#Vi4bHTRA{dbw~oEgvkD zFrqEyEzj_AVTE#%q$cSt!MaN;@wb9|W`hXkzgipcGPdgjJ1+%J>6 z(t$iwfjp@=aZiCaW4nIe>dPuhI-BedowGBX9gXHB{Xj|9Oi4}@x_Vllo*3Lt8D$p^ zNx3cWP?L7*=Cb}ijYzwKdyQ*e6;fFFgrGkBAs9hgvFRf~P;qGs?$iHc|F@IuET(yk zB#NGRP*R)3yg)VH(;Z@%mXSalA@|`KHH0Zx~V&5)O~3BqYmemH1+!HVSy2S)3^CqZ4fh zH_fZY=q{I+*!*UhPFI6=uG1>hqwg9Ss%UiT-uMxFe>tK4rVeotUqWfO6_}r)`>XK! zrWoM6;gXjAe0=mOBD{~VjXZXQ5E{>dqNeZ*pPjW`_$Cb*$Mt z>WcWD*}_?gW%#_~7H#)vud(>8HL=_4^A#2D`do*R_xZo!@U+>Zi7Pd!QAnRkV@M^m zxDKB(8}bqY&VV7npJ4R&dS!emC(oWPV?$R|xq1^_kDbZ@!Z0oxyX?Q}ml) zM~s*URtt!zLp^fNp86fx6BvZ;8uR^tZP#_NH1Z7ut)tsbwthc6bW*La{M!an$d@=x zsZ^EkuhTNwnELh>y><9&QCD+LU(6u?0xjTpv7-BIIr&@=RhAA+7TVv6gZ>qvSC{xd zfS2Gc+x4Fz$w!ZF2(z`nP-sWR3j;8*(y=$czFJAk06>nG>Xb#IBgz=v`0&%m_5V?Z zamT4!#AVieCBfo$ceZ8*-mP@_;|qbdU0O=2P0~fg>#8{cN%w&vAF4;!R$Oz`l&ATFHKvMw?iI?(o*`r`NkK^it| zyc2k19%S=`IySFa zI2-5|dnSRtB=WPVhPg*JY2CZbH;=3c?!6mabSDVw+3x)QKKGh2YOswex&a5?Xh5A_ zhPDK%`#h!rMMbuZSB`|V7Sk}TGdcU#Y1?;*TJg84b|C~0ZPK0-?aWGpVZlX)F8%Md` z6Al3kqeGGp9|GK)n?GQ|^)%g4L#X5&`DN8PSxOyE=4)s4&YLEK=Zi84O%uLF_f0w~ zfY#_i>fBktEUu+|rS*jlBd?R=GrbkTwdVbRp!8Z)UE7`n>KwDE?J|aTI~1i-N4YSM zRqaovRhPG;Juxu;T~wM5Ao2QVH31w@{~XN!{CQvP0A09l`ApQ`^mh<|0(-o@FBO3Q zJhu}dgIQi)ez>wKyJWqc(+z$S9(`ceO7Jg;82LXRs}iDy+(?c2pLbp|+)NuQf4ABZ z_$&P1(G2{xz1)NQ>~7JJ2!nAue_-}s-}Yq<%O}XDi}}FI@8en2tp?5RwnEADI3eMH@_H`Sd! zLwlOg%~bhiF!|;cvS=2(A?udV0t|-gK1c!TN5eYBr&s1KedCKp?9R||~2Lmq8T z*`3twRPbtxj(4QDf}MFy3^8JVDi1G+47BZ{3K4@>)aVkoTkxXJKJzo1r(j}PeTC#c zgY3_sQkF^NRt9eu#0J*a2}z=#^Ly!xGukF7$2L_{ej(IyDBvedn~O_g`XmN_!fuDr zJ%a{7&3rPjFkWZh3Bxs$_~6KS3y@QWfR<$xJGlqnZRaYH0VC0>l6y! ze~z#L75!>Y)qOe3c=-KK4_g)m$#JFxm5`T&LV%%=Be=>+3(B0-b!sbZw{1x6c&67B z$0Wbl?HGbVtS4NoUF8kND~N2T|q?5pFcg`sBQy#SvNB&8_Tz^H;5S zN9pl+a_OMI(ENZCvJ>f>`^Sj%+h1f2u|}rNCWftuUk^E`SkGlnWlktDh!x=CJXFUu zq|ykzn}|hS>|?$ds9R#r{xVf#FHFr=JT)A#3fX6Nb1jW!D|fMN>UhvZiTFUZICN25 zQT_Y^U0ivnzJsY6L#HmFg9iwF>iPTZ03Z1XnQ6OED9KG$q>GD?B)iW|Q?~lh7+1h; z02rzQ@cT`_qlG#Xq}tvrTwSdk19CU2p1Y8NrtGe+|3GVH3z;e-gcWOqJ&H$@vDor= z6B9x~e-8HkE-ai6tOJMEu!5Y7cC#aAO6+M8Oeu-bK8x68p>?+4%%MhZYW}gasd^Ov zkKX{!>{IQCbdpYhK&t!A!jb~`epU%H-S?6LdlSY>x5cVhvp@r*bDRhkD9q`aD+7&O z{29M3&v!O<^9J(dyDbRAU9yd5eii@YL-hzg$G_v7>awv5lu+3EQ+a$SX6HF-Ik=vyeCBgG9@o;yozMVCSPf9_a?=*uI* z;}nyqPg3Bl9M;0sdp_37K{FXG^&J%y#KyVq@K7 z3pyFOc}j3wv>tk3OZ9(TuX__VPI2%>*x*kfi|ix+Yuog6J=p;K!SWCQ{A&via(igB z!e2afw|fcDmRlS6_!jI!QqM=K%?^0jRQNvX7-{wxhTP~j{fJ+)FQ0Mf%kEV$IqYE$ zUq1E;P#t`)Jj-#lXNGxoaG`c1d$tL{l&}6?DGtP-`AvVYJ#hZirFnI6B2&P5#b4Zz zhdHMoXNsHEwdtlt(uSlEsV{~U<9e;RdLDdy0_b%$SB#xmtm<%_AQJ^bQi7;ZbGn`3 z8_X#;z;NRJm&gaQFBW2QqTef)QM@R7uL|J>iy$_^Fd{<2_Gh)JVOsE#2zI3O7dLi~ z&19~)yU*21JvPscDrSs6y2p;aY5YZhS1A)r&AafV=L5@v`_U|%Yn)!!!%U=A{ zU;mv6`JeqzdcJN0_Hj#8A(d@9Js{gvkYKT!-(9 zYYZYITh&|%=MT6IpW*fU597Q-2^a2Uk0YrY!e%ZWd~x)i=3s*pT31N4q}r^3qW9fK zd0)nU;6FaQKB6)0S{V59h4i02Ni+E3IWWj(AK2(o2kr{(gV5bUi-0c<DOg(TfUuZ$q%V_U3P_gIRuOBd!d))VXi?-sMVmyL@7Pr8uW; zb6@n-WCu_QwZ+NJou1yl1|o~=7bpN*z!Q2F(!aR!S)h*6(;6KN@xh-81YP4-H@3#o zC8eYaT{_RjAJ4Cv@u!yuQmcbV#SIe@Rvi~2|5JZ5#l_PgH9&bGI5~qQ>9)?6zsKk2 zST94o_lQuDP` z`2f5;5LFh^Y#PRqW*5^Dl`UN>e(|L#JmZhGdU9CFgj=VK?_d8tgXz?_En#)ISGX%& zuG$RStrhXw6Wz0hPr>ilDsi4Z593B&MU9<6v0Jys2Ph-Nkh;`i?9U1Ko{7LjfuQa1s$YV2G zRGdGJZ_3Vghy}JV(`WWs{xKF@)b~dsEq%JSca^vCDa7-x&>r>KZ5tI zn1-EG!SmBI)amPJ6qMSo$NFb~Sc^u~;%Z&}<-f_iH#r=>B+hV{C*CpTE!$)WSsiz)12tE7if0PkT)1t9XMtMZsdiyc3#Q9tW&=>kTsGiRL%ZkWbCbZeUv z=D`!@BPSsK$p&+}l2%>zwxkY^?kE>B*;o-b#a(umzeOJ!V%WMQ3#x8*V&@35lkUlr zE-fvsEw_39`Tj=e2sdZ8vAcVN;=>31F~He1;?R+kHt2B*_r zhX&V`^6}sCvu}~c4lt2Tr9;vPT_sg1NTwnlPG=~CFvL8M7>A^DN!1C2GQM? z?v6`(p0jNqV8)bQO={K!3&3sNSnV`j2eyyDCMX5_eq{oE%Y-ZnO^nUE)f&A7arpf%Cr$ICls!z*HIq(2vht!q>rio1vqy5$e6#vZAP!WPzS z!a$iXH^<=iaU-ly`udgT&4KeYdOP zBTHP>bXDYg=b_ISD5jic-SR34@C0j&-u&IlKDonhPQh zppXI;wk7Hr84gYZBK=DvQj+ZW$97KC5|ovy%%s9xq-pRQ`qhMACTMfaihM3nQD)aR zjOCuM`}$~DrF}x!0Fo-u;4hGVVd^vNa%tT8?)>XZq* zo>f0z6Hke)WiL|)NB``VfWQTlF=s~?X800X`f6o1suNzPiO(9{+f{uowYWIC!ma%WzUgGV2Y=4Nra z`2qcM-=vptj93*ufHk-2+sQ%j_0{p}CdVzI!#eax{=}+y<|m=@^o5ttFm1sPd{+na zo8-2|9ZyPjG0t6&lVPDsJZs-su#G)-umXCyyAl1Ntgw$tbdKauvXB1ubz6bxfCSvP z)T=fZQ3GB^+Xt=%pTcrkU?ik0(iSvfB4qaK$@?TA9cHSmDDIP#gd#$5hC14uiU?*Y zlvqk(L$dbk!pp~TCuAkb%zJl?HLZyPzS^p0Y-KcH=8aB4?D> zV%uFGQG6Gn1vr@?ls%GrebD7T$su(&KS{^bN5}X<=OafWD=tmZ*OjH>aATnXs?Nwk zPUQD_i!RgrTo*U8E|1CWDz0JTI*eVVz|57>%TD znf|TC;)<=86TgKHZ|2Jc`q^Ck_I>P9R`JO=W$~7wf{s#cD@KL3JC_ZV0Dq(`s%N8X z)3F(EY3>Y5Bd0b#I_~o(ON-qbq|E#@5mD2Pf-UoaEy&J3fMd9jA_Rg5q)VN2=I+$% zf8c{7%CGwrV#5_;JNV2csS^n83PBe4g?mFz3+_V}AKDshQ%Obo(J1|R{rik;H{m3;tu5Z?XpP|CrU9@8QxJ#KPT~Lv;=BE5Y{io6 zYJOOve}}C19Kr>2s*0t&u3BZxn!0caW+SaWYzqs+90Z!T3a+`&;eS?vECcc4!A%5j zyNU$bmVPv)wxRs>*bWxifb5|ex91oy)`oqTUu6REDYWD59IL569s=Qmz~70qkX|Iy zzrcVaVB->SeR=lh3V-P4>q`c*o@`i$4>&Yha1?1Ig(m7`9pzjYHL_0bS2nHqVgG&L zMYDtr;q@S&(eC|r{jNYyPh9yAA=A#wy@fY`w&C2T@k`NHhSZY~-7(l?$9#zZtuwjl0E6-N_qEvRo5bN$j9s7W z5%L8R4J9aCphm0ax_ee{$&A+M@#P=)7v35H7gO3*Tc!YTwph%T@kIY*4|pl%z0s< zaxo`TMKT0D?z93)JRCxf_H~~l*&Iqou#k6?4tc#oFfv0?1*uVp2)P{ghidTUY@`^I z#Wga7QAmh@wB0YyQiQL@kgsBnxV%v=jlh?R{)X0TZF(wwE{Hf7d55s{lVoYw0FotpZ3WjWYT6AXT$E9r^bXGWcys9|woJ0M}VhIJD{T>AY-= z@Z%UaKauVgv0f_}T#X{>i9&*93VBF_r~Hk3+zj_*2@F`K@q5>k z?WP@S&6lDB`(Dz#^kxPyHhoTUve%c2?oR$)H{qlCZw>-Pdv_%rA*dW!1V?xOq?4JA zm1D2FJv?7j&=#B@>>C9bu7BFS1_l%Vn3n&`+F(XjeH8F_hP=YYndFQAt-3Zj9S{Ol z^`3aOY)b$*&slj4LqbL6p7`qSSpwR9@!$;(uaZvX=5uX_S=Aj9>}uOZeX=ylZhfl> zluQ#em;jd(RJLYYfETWe(OF(qbrHHNeLC@W5K8}48{CS;wHj{~Hx9bD z^#5C#Y>v?VgCzhh0n!Gr7SFhk?EXZM)4q{ZuKFNpN=Ih-=fds6sQ$l)JX2VanwOK7 zD@w-ZdAoT2=hfh=y#b8uK9pe z8BA6IR^-&TrpEJ{%7c;y+$+!nupv@Kusd4wE=X6QfUBZL%k71e^62?*q2WJyIvX@WG$s=vgd%$q|BNab&^#L-a{bzi{- zB}ar)nDS&N;6@ckCtJ6xZB*O+Mw;8L`1QK|P_n)U4T`Bz;^_EIZATJfzqs_q88I9! z`K@j2PX5P_>41x!J)m-klof|v8eH#;Z{QGFb>&wHiKf{BMe5Fvw=LRu}E+0Pfb2xLfH>hlDK_B%jSHn@)i&T1fj@Cr~sGOn+| z2VHsHT%jBB(PUpHxcU{w2JcW3PNmR1yRB@M&`-g!>;^ldC8Vn1j-qEUzGdzjrUP;Dp81UP#ac%O8cPK4J1rjkI`q@D8(ls1ejJ$G-XplCpW(&G*0k)>y6e)G zzFahpLIL4CpYwrg$ntK}7OG9cSryaJu|K^vQFZRcHyyk?p&`NNo$aD-4P<&?Msav) znr>MSKnn!m5zhlmO(7@JLl(8&^|lj7z`pQbBqM;i0r8hh7#*K4RL=MxcAWjXT3OKq zF@RE1f-wYNL;iF4>;DOQ6R9m^$LiY_{BQ?jdetjeJ3sQ-+I`ME@6cK4F zd|pb5#daIt{CV+?-W@VY$um3%g*Owvy6iVp-EVk|$t*NaXneFW8~pl%9Yx)?oC(rH z{y=W5Y9!&>Kb;JjysAzY@0WG4Sz|BqEloo0ISF&t-8z%2bCE3lQGld+8tv)7jROXu z{FzA42T#%}YYc6nun=W#y8;1HE2!%)j`Fe{rU!%^AN#i&&}#b7C>n;f2UNe^Qx>P# z`d$p8?`fB@&)<^LV$=xgfrCgQ{A$J}CIq9sEj9HMCRn>jk)cYDT0%&vsoBltDkW*P zUdt)=Q7a^M!_%PsWF;HWLVa@)!;P6OV4NUq+Wz`@?`cHo1bv>&%jT^6#wHHqKjH?! zyf+Yh?0Qr_;vnXzL}NjZv&Zb+aO#%{_db9!M7g_3R=u{7!IU{C6b8-)x{ClE7D0&} zMk=*=^{n=C41S#Q2qAhCGJuJ>!yLS498IbpZ{;(4FLfWVW6)AhnHqIdY;aQ}0-b<=Y1jta#yT7Q3G)}?o@?$mP42z!w!YB+Tg z&C|4fteINMxP6Q7+oxd#6zP4s)Ci5$1#w=zN&*IFV@E~wYb~pY0g=H8 z+4$qHJU{gLZ+)3Kb9HkI1(13GA@M_sA*rW(Ust)fQzz63>v&==srQ@u;;L9>~Aj-QndZuTRJs(D-WR%M57BUPk-_ zh63Pa-q&CdqF*{w?F8u3W$-iAK{&hM>osPOo|D(53vf1b`7xpd(EeOxlB@o~rL zhQ*ZVC^D9B?N+7><#+trcqiL=^#{-PHbtb2#A8G99;Cq6ri#S9I3=dYm92%~AWH6Q z*4>fuw6d4B@=w3oOw!AKJxz@18>d`Zd0$2Y9fQokKmv? zSvE+BEt5E?HuV8Ju`;<%r~s50Lhp2Mhp2Du1!sIQSEWc1bwVEM3vI2KmQ}Y(ACws$ zAA#WH+|y*zegX`(Yrb&t&qBu2{r~KgJ_zz_9sFhcFi)obQCqbsZ^bMkP3mD(nD*vJ zuy!r?ZrVjLHGB{p7Kz5M;~ccjF|0pdWeDAl4qH_;jRVbh+hd|M6+*X?0=F+(ueTqq zFSOo@FcPWjxZjXD#H#xy?RMSRg~TQ?A?BDkq=>+NY>;8RlnSO%c)$To!KloYez8dPM-iGp%Q9P`3KO!Dr0v0CDKhD_kY zu0)C&@-QA~FOgzB(qn(^f#+j~q1jwWUgnp*K}4Cb$*mD%DVUn>+3d`%-5+(OE##C? zvO?6pHN4^EX*fu9f!$@%;pKgs&HGY8o_Q7>Z)>wkf$|yJb-4zGak8+ex#CYz?Wc>5 z|5lx^9tl)$75n3a8J5C#g@~GJ-LnzPRai?q3H3S8%l+0g2xj2}YR&YIH%7I+3Xjab z#vCZ%_EFuYfR6*QD%fpqbW!4U_Lh(R|MH<+q#IM6s|Q0txC(3OzzT2)WBUV9`uD=6eV zPl9Mu>R+c_)Qaj6b-(n=mq;-i{uN-!xz-gZ)d~Z*-Yt>~_R?_3t^j0rtLD^M=)ag< z6lQy2#PhB}pcyk_S=T%Hoq0{$x@*kH3SX6}u|;h_*vwSHJmmE_dlHDH{v~an2SrOo zIrvb#{77z?R31w5LRWR9V~}4oBq{c1T5uoOg#t)PqJ!*(aMmGj^9}tCCqNdMhqeGW zbvzLXIY5pT@r#5B#Vv5=>qKj^(~^h{u2{xW z;k>Sx<6qMhLZ-aqHaFfB4_Z{!8Vje9E9SK!97cnH1ia8xp-J(WH1l$Dr>_sfsBei* zgMVZ<7d%cQfa!Dk22diLm`>xpDE%phQq1zq!s;3beA3vfH1CA8uoRJv)ycBNOc;l? zB=O^Q6%l}}(J4HuSmUOI^1iLeEoeMUQ6Y9j-=dYLrc21p)yn!76_tfrDa~oA@b{EN z7${MWo+&PxcxUqb>suo1`EHLtQ^22}TZAtA8ec^b)CV#ZP%1EQ4D!n{#&Nz&w56>d zgRWk~2W;Pc(fas6L*t&!!NLL)fJ{k(@ewRP;x#&b_GU@`k9*CVcs!tfVvJh%zC0{h z4Z>7)o9Z#OeVZP5;e5Y~a=hZlYGiFYCE=2;nO>)$Beu`va0`XpLf2)Vc%P#y&00^y zW=ve3>zTBbpnh4-T`kO3o8Yr`ErdPF^09Ku3r@r!K!yL$AN6ky#-o|{53@fEi00QP z)z0n?$X;#8%3KHk6}tX?j6dwS#!egAc99&>iT==04F2U#j`+{TudL3;4SMoK?DdDA zFrkxZ19ZUkPJRCB`N^2j;ds^dbCf;td-=6nllGm6mN`UR1a>b=LyCEcPc;%Mf@ zdEyuB1g}++dW`;runq}l2)vn7<@*!uVf1zZBbYhJfmnKAzMmEG?efO8GuWa@ z{RI{na_xU=viDCGLLpGYza1=`8V!Anev;47 z2DwmS(Sh*=g%XIq8rd-66Y}Glw1FLNMn>kaP6{e+u6ciXXMX+31&5_~TKd$UU=7k`(EZZjn*}hY+cuRC-`YK^QuuX8-|}5)cq1loIJ0N?-t` z5u^qfQbOtOI*;!gV#Sxa2}$%5y(=eqZ`_h+{~Rlf43RlODAA|}}svwK)~esWT+ zN^1R&#s@6u=K*P?y{%2Tr=Lg`jBk8ZtZ?zR^NixLn-AlbxFLmHv-(zg3x(h`@z+;Q z?cbV4TdCaF_ev?!@U<}5vUF|nW)|K@Zvz6Zo3X`DO^wcqW0fu**nM=}_b{IuN2UVA zq%(|Ok{fJ!*3QD0J-f^Umr`Cj1Is@1|LH>Talqm3#l`-h5kzO5ZYcQQIS<$d0O)X7 z4rj~N)LH0h;q}4B!+(hD-RraK3#)5?VDM=Lp8$-)*AXui1w(EB_q693F{7CHQw&av zSAJPxDR#ZJI+7i7IHLEk`DkOcnt)D6p zia9uxzVgfb6qwZG_awbc_B5V4PL_#M@*|r~i2s|zGxF*_na_gC9~0l3=o=}4D@3)@ zSX7@poxk~wU)X@FiOV8{IPD{&!~^{aNWBs&*}Cal790I98m?&JQ&2er!sTAp0I3Fz zbQ(JsAIjoh?B5A42WzmXZ_scwS5H;gD@qge7pT*B;_u=#DRye_P%*LawTGb2+vr{1 z&RIfvCEEILF*|F|V*0dWQzfVzykdW}BPvJJ24zyTJ72V!JZGGK_R4;TQMYcC!23$0 zN*S9Mv7g=NHfKc$(WL$}u3Xk>?J?l1IsRRi524D5kq*6dG}&D1qph6D{tjgWuhKBZ zp?+x~qF zBiH`89@P&zTg-i(PHIA)GV)?dwmmo8^NXCRVeXeuB4J^qjL%yYu0bM3uh*v^fe3-X z$ySst4f8)H`p?V<^`X~FKY#v|WV`XMKq%Re^*H>j_Q5y3(R{|KEdw~}dGI-G>n75^ z4sD5S^#f0=t){osjnR+)s&&I(7WZYtL9H31cw(q;ZE>mIRPR)6X%i|5A2fw21$^1I zGw%yat$a&!i^P!rzMHvai_=dXo-}1BS%cvD3=uSvuFocHDg}LfQv3MgyKF;Fc0O^$ zN1nDVv@JJnf4f|qyPTN|-TR4myI%QylsPB0f2%X?j~Y*^0Vn1EZ^9>w`S6N{$7ThL zvaM)vi@6$e@jWdD_QNZ&oS`SXOJmE=0$#dnEcP&j2yYW)jtO*RWwM4f81S-A8lb5` zvH~@%CBnxSo4LuUqLO7Gi~Of#Ly`18$W1}5I<_J*y_+gLd{pbIa*6)dTEd!VK-{&zy&||`0^LE&q=K=cC+28fS!|Nn zh%fQF0rI?SaGXl9DX2vR2Yg6gS(7z8l15{{Z@UWp-Dew3Pt!b zT{nA0#vjHs8Dc@t9DSp7^d!2TW8x9%@U!4&M?M4v%A=6`<0TRf79@ z2!xnXkhZXG1H1TQ8bUHiUZ@oo0Vd_I2whmN@rdPun*OQbw3;=>NDbPJDV9V>c?Zyi zl@p0oOUUVv&8J8^KSjBaj*jaM(h*Add~F~v>7v{OS(WO0_I6+c)%}0gu@C0QRTIZJ zu&TiVLzyDUUhx-aB1!!jZEN4S`)Hp09ia%iL=tj){iFvNG8o`s<~fch^w!N=3p87lTT%|QUWb@*|h3iP`jI6bb z@IHSM@O$A8%?QFjDz7V*NI%PUYE5kiniojA>UO*@A#Z2M^-Vqp zIe;Cg#z7RIu$*L)M^wo+UreB^=m{darx2Rjm~NyNP7S*ZAJsJI zimes0XpWA_dQb`c5p8M+g~|>5u9^w)L9`?by}D{U0;@s7V(|H$T8a!TtaQAZdi&AV z5A=Q;wb!m*admQri z)%X2Bbgk#}5DAGVc}3WT1@3=)-UohL$xzpmsxLqL4{;K$5`;d09*9J2VK(t)9_z?diF9xVpNUYhI_@!WOG;MMWIG{VG91*+$py>3yangzLcnKKzolIzrXh z{w{=9c63Osh4|Gf;8XM8E-r6rJU`i86e44Wb<)3K&y~@n1NL;zCDZb8@4ol&SF9^r zJ@(&7*NN=x#|d=BBqAwXbiaz37%L{6OIzQ+*5^>#33Mnk{F;m){gB(wxOAvv>(J79 zM2@ea`iNW$N784OZ3i$fwCESQrINW!2pn!6-cLUQtj;UWPyAb4d4$o2Ky4&|X#1l_ zUHLIq(wqhucUeFNI?+6RTFLK5IB#Z@=oEjTh_bvlHv=b`LL0`9Ufx4y6#dR&#zyRtju8xUxURpF)aDj4NWy?OB65w@fs%6OXmYXBtMA z`dqQz;Gm}hF3qC_Um7nAV;jwRyd(bhHZpLO3Y&deyK zO3@x1k`YfZL;oPdB}-?=FLQMLG$EAE8eZhBch-Ao5{^ zl3p|A!eKmeM~W6zS4r)#0-E*)#Y93D$pDN&i~wzCI72vk>`dw2?T@o`8gytuMh*Jc zZTeiyq`Y(quc>VK^N8OO=P26&8f~zMh?RnQ+DF-Ht{adFW~NZ!KHzQydaN9%`1bu| zFQ;Q@R{eT9i11Y=%pUr1&MMypLbMz(FZ)*&Gf^FgHXt$(316rrQCVPGzGB1JpYOMa zpLIUXdB}Q;KLK2UHaI#fsa2$=yerL2vZY0HSDMsJ`-=*qmgeP=beo$}eSCI^CE77| zf8Xn0AgA?gtQ;WY_pVo2p%==v zYV(oWBPoR;p(UYifCFI0tFdjU0SF$e#DRnNmC3gGq|EeMh1`K$^m zw>Q1I+Q0Siy71prWXu_IvJl?a*LNuxx5%seDlkoqxdFsdOOh+E!uBJhv4O9+7Sgwt zR0I#}n~0qN`Q|6{t;@a<`vOTZnyWz{u8$Br)34Fj<+6LuY@1-u{N^(jAt@+8!ktk( z8(F4lgYz>FT&GVg@P^T6A`z~NGi6G?m#+J*o7(|+1tx;0lma{|43C)N3cFMMB(tvx zl_}Ib-pIdBcuuUsLh6Km+KRw)vhc_kK`0a|34Ar(nLp~Vh9y%XNtYnX{vU{d+yiUoHZ|RJZbBdywprzcRG>&hn5d9aAWHA5voSk%M6<~Y5^=HH z-U%a0?djRM)37VdoOh3@%e9|EotLRoGD12bZ)VRAkw8~t{e`W&FhVq`dz@}vR3$~A zTPjCTH1OoN>|$Xyvlgo$GT~23gE_;|wo0Y_J|pAWUG$anP2N6&_#3&DdOT&R?j+gcDYtJqBgF28%ko`1#aN-+}fewc~Een z&qW>8=uwUg5g?%Y%fgDgV{+*xRklgm58@3M)6pHA1bHTXaF%ZJqO50}7nOh7er#iDDJsH{gx(%jv+8d-8DZW6{gJ=O^o2^?R(r(c4eeBV|#x4BTq zIo;uD4_pxb(Wm8RUlJT|&4_Gkd(gb3cQjcxuwBOxL5r>E*Oh;*;V-rezR6W$4q(Tq zf&*BNMQ~u!;Nf`}tR-V@vv(MwbqSQBQM5|&%IPh(Z3wO`)$vT9dFIS6@yN8P62;>%l&)zPB)fL z4n{gUIwXMENSSo^F6{uQJu$8P*~|`dqlKu+9~?Zit*d! z-`lOHD;dWRPnVKNvO|te(aBQxT79%Bi3xxYiA0ZeQ=J96XF_~DPPJaaP-*Hl@=Bq) zAv-wr5fW5kb%O*E{)?<$aP2$dHey?r9dKMPG$739P3Ccg>8I!1RCWdv zbe?LXQ}3cb59w=})6@-hd&OD^mE4W}T){bxVRs1{5-Ef9GbeY21zDXeZl!&ijRBL} zr!LXA^^rV~#7R{X(dLa5yr&Ik%V8~K{2oiE!jeSf@t7{xI$}YC2S%6};gTcOLu044 zkJVJeXUpJ(Aq; z#=3*t*0j9HzoZC-LW6o)LOikx#?9T`mX-e-PzGkSm;wH75*&jAw%+5DDYUK1YhPu;3kpE7RWOL4y-8-Jvn5FJGhz^sg!_jh-dV|T z`@OT{t~%9qy=iO?T$wMLDX_Hw&q;Yi_AD3NPlaSfj3nzfD0OVt+PA>-km_XY)FN^+=OWa$hU6Zg^sEzDHRm z*XKQRjj$R>F0S{WCCWvgdS{&T>g{LH-PD{)5+6mT`BI^w)H?oq#1EYu*W!^$qE-%1 z&MFkF9-qvN4<0TqgyQyV#qMsUZ(xFP4@0DuFZpf#^wbgbQF%vH6BZ0R(Z zZTnexscK|pbC~YUza<3h)7FR@c$6#U1H?GQs{cqYmx#1oij}>ZE>7FD?8U7y!vi`M zuleNEp_?ib2eN@5W>@m)q5*WWk=f^d-REOq$CB>VVKbC5jVJ}Y!hUUP%6d$ll$S7Q zUTy*Fvgcy3LRG=wnvoD!#C#`DKWC!%hBis(8TMHMq(k%R>ZPzRr5QN?wxHN2a$ibq zXt>zOsMFUo-KCv_FH{|#8kL)&=AmP_{0KCGXOE_Eg6&g^o_vS0WZ8;LosUZ@I?=XV zZy0`?-1elS_Z{j}dg zqEMf>b5YBDk||J3^2?eXj4uPn)JKQwjCFHhAWB$98PRpBrNL>HE;^inN?bC)sS5N) zxCaEh`3HIcWTFW?9&aM^yPWmYw2HsQmth38mHK$?Ovk||AMg|SFvVe@@yl2jn=6bd z{;(QpZamAc`5K8^MVjp*kBiPQWi{~CHJ|b9Tdtm=4X@{5NTkRyKf<>8V`GW(Ok?j< zehbF7vh+e0ztSb1jZvCCT1|XT+DDbWuChPK@JUVkWN+4re!4b-nwt8M)$NKEaJg|{OVHHHl@itG)7mr~{7!^b0;T8cOVNuCGl0HT%+osy49+)o=LE>j zqa?Gt9GjN1Wzan5Vmu_Ersd;}@alK3-h9~fEp2uQr?TgZ=Dv-(nGh^pEvzLMZ-e{3E7)-Bn`MY=&>0?grsRTmOw@|K;p6X3rX!yU_n!)j zPnql+;>GqtrqxY%zI}I^*%6e1t8zVk31YY3xi2CzKcyC8f$eclpa}c3r)~Rir^JOK z?yVrGj*ldfNr~&j%;3DCxNudIe5=8@F@jzESh)7gYNYNxV_0Hj*?!rf{n?!>!`y_(hH<`$SH-9QyNh z%cxN+Z5Fw5z*o_M!ObIuk;qR}xkD%^qd`*#fMk8s{l-sE2tvW)E{XD1NvFIC}QB3~^=t z?U(S&`qEiAcDh2Ga|qK?T2{=i<#y_IKh8F$lin-D1L!0G#{2V5R=1134&2;{#5;yi z8kGxBfe6OMVr*iy8TmiXP3JqMweHk~?-+O>lGZCil-Vr#+oj{hIKbdw4p^jTGUk-7 zjA#k;DCoKWy`h9%d>oa6%%ss~jA(OJ7+rHv%Ag|apJAS?gpgG$M%xK=&6?O|R-b=zqvXv5q^dp4 z%$NCFzK@xT*$FuOZ~%|Z!-EwBc?*^KEji8at<%zaV-35zB0x-9^<9%CgbL>P=)BM5OuPzCsi8bAX=Fjy)lZDgTn;GtK#1NR6vs(^qfGls#Yxz&UnyRPr zF(cUdMJ(e*5%5h)?W2`NQ;=rdcPykI-?wpwKvZ8 z$w#i$VUTd&Bn5ca=Ydw_VySb?sa|()`8GxN`2__RH{ris5c&fEO?_b*x)^(SzTJAg zl<7BnI)8959vYu_p-8JpTw&)hrY&;e@jqKB8QWYU^Br!87a>9gE8SOB{lms1u-T#+ zV_80Ta=Kbg^6>Ivzq!2ia^(QO-I5ssSRQ(8lv1M}lO*Rk^;{5`Ke^+szL%Q`YD#gTPEiGK}^Cdp+#h$|9Vn< zKu%2oS&umVG3K@V%oJ+Tz1_34*o;4r`$2wbe~Pe8+`(Ex*#n6*{wOk@It!N zf*mUIDyUgKnTai%C4nY^R}A%d3FPoL$k0YvUWkhF?$d?wWK|bQbwG^!VgzYYPmVFO zfm9Q-EhcC}6TtMQlFs3xTewtnM6CXufM$NxAsf8kf}1C$ahJ*1REi)ugVLC$~`eu{80({%)iTNxhU}?!nN}`@E2~A?>prqD;zZ1^xw@$ z0UhbvLLl86C zs#1^liYTv16f-QHKs!+iqHwp$FTJKi}&;_>N4J__t zLvKEi(@eNwNO3~GaG-$q0oTFiUGE!Uv@0GFA;u z;Zko^y=+ZN$WDCH1qM$!%E*EMNp)WJ9u_w$5c6K+=z?201#Qa<2oIoG>D^<{PV zv6QnrScJ-!G#rdow~?&cFj+N8Pw4>`^(u|| zg&9eYDgg7vyyt0C=HJO(R}fUQNx|wqR>uVUrW*?>LX8a*#qe}9Nott{8+_>90JlM@6a9yQD>+WH=2O#1ITG(FZc-ofwnsio&41Ln^9x? zvK(cHosYw7q-M+56`fsjTo= zW$G2PoRqT4kPnkBe-Y4Igb85huwN;su9O`NF`v2YK723Cp6z&?&1S2V4G<;&)tggu zC}4rX^q*G}{h=@Qt!0zKsATzFWCl}%50H}@LN+R;Y)&nNU`k^!@5$i^OZ;Jz2#l4h zUi%bQ{1gZa5@BkWo%ZXp%C9^tga%|mZW-HhM8xfulYL! z#t0*GiT38r|IrAEp{#tOw{OuR_+4IpO}-De7}x?_Wv6F@gIS6fM;V+PA-k)`b)gr# zYfC>yihGQ$f-^#nH~oImiO{L4-tu#`mehPl0UjWp;$|6B!$~0&t9zup?1@g)Y4a*t zH8u3R2(~d~2ppzt5A~)0~Y46BNpvueMAdP%|M}* zQ|JL#Q>fD$BcU_ZAgGK059&0|6 z+l%S#-Q-*j0+~?4NFmL9UKi%2b=tU3&fQv~@(J{y2}!1qn0qn5`Xos)dt`iOeF?qj z5L&KUcDZ&O8HILa-;QeJ6ZziYkzmwaR?xus6S3`Mk~qXiy$p5BblrU+7)*8Ef$3_mDozvlcE`1|Dp#ayd>x}tocEu}c8=$58;)DHh7}uuq zZL@LApH~?*w&qP!y_@%c${kiBbt1BNh!kn9C7E_sOU;1~1i!58%oE`x>q9 z4K1tg2qzjyRPPA<_b9$9DAjLBP%)9bB@OOp=zk8H8!(=9o(no%WaYd#`qgm_;GIJM z6hDsF%X--Ku_X1aceADDduORvymaj^{2XZOqu)KpCK4XKBJmK0w$(3>7^+3v#R!t3 z7=bV_^Vip=q;CknJc^Q0N{FI=Jw-QJC9dDIaeyi#K`MggIhRzSID(N*CP(|*&Zknf z;0psf6R^q9#r%Rf|q> z4xg*_1PX`~1ilw6vxdsEKM{jcGPR}L6QMLABW*+2h6gZrMBCn)7sa@k@syGFRK(~l z3_XHi$yq^VzpmUwOu;7l1`qCmZqw=;Tia7mqSKI8=~^mn0zz$Y^`84>#LSQx6BFVp z9QM$xgiz9>VI#XItdpNG3f6u9aek3VcPAPBO;qn}d?M^EUH$Wut7AqGJ|p$>z&6cG zD*DE-5A~yTE3v#wOUy5G6`zRi)cJjVxZkwpY#HXHS}s@zhq)`V?wo_<21xU=+OnX$2DbMprHVovcUGQ{W9>&bPf zW}x5cOA0IEs6Q`HrX6C?hUETPK#3+#`%48`KruH5yavZnmzS4%iM&_Cj{AlbnF1ce z;SHfG|B)#+-NyHV*lFJ(R%l~Bgq^1RJl%Tni6i8!2j>=Y)q|tv48Gc&d7K>@xc=+8 zm7bMCt4@^$9HTG;rQn+kKieEQAs)O=E1|G$>lj)f=`E~GGhbObpO0|74X=<)-q7B|I#n>Rw@vJE z-R_XM`<(PEO6?bgvV351!=73t0Q;^x)`tKU zYpWzhc(=wTx?78fv`11L`hkWxlF3jiq7r$l{RKX;LW<$Lg;raD5V+Xi8SfUKOK`TJ(D|ZH_sT zF{f-N7r%tAb{16am{qmffkNP)gM1m8ftw;nC-rs?Uq-2`HQ z67g~IoK(Y0UcjJCEDzY25fy}M>)4vb;<&}|Iqaj|c<93Pe6blyMed%iAr zHF&+5&3VxZXm;xxU7VrQ8E`S;p?AD-(So0)Ik=f`h^qEW%CkcsF^_)6zPCgq+(^(P z{ZRt-5X>RY=qGl-v=!!wPB!3DS|E%!Nhca_Bu+t9(-uw~YkC4~-`dr}u4JJ~qXH|W zG<3;Qv{}nP`uXT@+l@xjgQ*X`s)WDjf4Z&euK*b`24KfeKeSS8%pNoZd){;fI-p1O zd=PRq{ID*5l#FQ8Pw{Mt*=uyiJ^ zj1ZQN;YaZiKB7@c4X8F`VGW`PVFPc3$PIy3S~0p%r0RJ6E40^dtVfT}BVGWMflFfo=+;aD<)1YQOf)F=&I zLKy8MBU>CX$zmd($i(N2?-q~%?uzwd9A82o-LI z$swrJkxNj75Il}hwl6PV_YS?>tzhZOxUBsZrK^<7*4pwBYi0Wt>wqaY2-|OQvHgm0 z5M@hab&>FJ2xC95kdT~^FSVdrYJg(+?VS7m!k=S-8@x==l_PcW7`a*mkSCpP@}mYS zn*e@G2XH8V7M!X-))0Ef+e2*LdgF_1k7y0L0l&o9+p_H16VbTYdo)9=FgD_ijzHqJ z9ul9N=i7VN0ylKzmE5JPcC|Ac2AVIMgYJ8535T*yOpKP5RSx^~Pn{vmPw_v);Zvhy zSMJy1%i|-``Q@prb#j`PV^(W{`%)G_)A7p1ZyO%~3$U~^Ki?-G$4UPy1|-8o82~-j zbNSEO@DlbxoV@MLZCM^}U210e=bg@j**|B`R-=sFLeF+{<&;i$_8+vK;;3(goGqMw zF?lP0GmxPt0t-y%5Uu0-fE)^HTH~H-^QmhqOxvZR)N(@M2t#cl%3v_2q zvgoF4hF51V6SzZ7))mmxbjTbv_C}7a%Oxd?xKQ?-8th}T8m#k``h0!*$0&qL{pje! zgFX!?FaQuLMa9JtzgjeTg6`=I7`Xq@p~MKQj-bynh2ITET)x`sJ@ z=Jq_TZ1&dSmE&I5pIy`-LK5rgA0aBI{{hX_XB5kOJ8`Pg7%j+8nuw^I&17R8hLpFj z{SD{@Y(fJsTpq9uuWx_08I06kU|vF5Ls-vw!Y9Q~NkB%=EUC}PPOwglWYSvf*Hz;wi&< zo?tQ>Aa0W`yi{?8g>1RW$vc}9IvO~vGrs()5v5+tG*EV&sYW3Ga$vFVaJkY}mxPWA zr$;^e5@rV>Q6Y9Y!IwU$;3{o$NXBK;G{|JM%0WM&GR>c#NX9PYRXqEcfA zPd(Q$@|;e^@gIB;P%MtO=ekx`h4_=mB0H>CZ3UASjUPy(8?G#Ah_#CQ#9a=IDRMDA z>18;%%AMH>;wl;BHe_OI@9eDIc?A=wsffhS!R;fQ)^VreIhCa`1)K2J4g~<8acHHu z4ZCdaX>MBO@JkB3D)ZSGc7uf=ou8OzBiFaZ=Ni|XSm~P%^b|?Wla}7h2}EGs<(E2g zZG8d)0{q?GfkG#RGbzoa>_lF(PJ{A{^FI~;5izbDVkmCsO9Nv5rolGN?%A~5eOM`1EAP_+#$OoSHww**@3xqv7L8NHPN%^f>ZWZ6LTmCPK^&`6^)q)>=njgwA`z+#Bu8%@~EXQSaTASOayF z#=2zM?}X<^9wlUsO!8qaE5K`XsTJO*kJ!{YAQSpRnpjqJ(&>d%U1A;Y#O`Pdt$dF+E?Y_!lz(2_zvgYX>^{JtZJ^ESJGbx ze_1V=dNZ+l7&s$M?y`vB2UY&4?%fK4kq?^_d{5IGKp*+bY|}e>t&)c+DM>XY(?yPC zL2#NkI*3{u(ObmDA1f^+Ij-Gf^jcrin>v8Iq+vkai|W5|0yu|(>mFbI=h_y=6VY!D zHNow-;*eF8EithzU*YAxL`XcUtU$U6n)rM{6$m?Kg&Jks)LF)`6%3 zP!`<3aVrCUB~x1|v<(ZDt8FS4!w>ti7nl8cg;65iZiTPngZ>7%I`!e7{S^1{cMj+* zvI2mIKnU466<&4LS@pK_r2tJ$jvUJ@UmTvC+iIkQ_kN+OvH}Q#l zR8Qq-vw|UMsk{kdsJT6gD?Oh-bXTkwVuLVL1*qzOm^O3h(8Ws+jZ-a?t@VXA@wXpt zHXWGOmy3tbi2u%X`WN{C(16^P1u%nLONSrZqqOv`$VBPztz0TOo%nmiEH~o z=`Y*$!dg<#6DT<>gczvN(1y3^27vQZT%$woh56Oy&4PCN{@N2wnT|V+kwhA35jdLM z1JO<*BSD`4YaSsO%w6goMk7vz=Ucu96@Pyi{~}s+c(Y9aH#XW4ZDi_h`S&l5`6E6kKoGH05%EX=7UW zGM<&#pWkX941Sx^mJ!eZ8#wl-BBJAbc4NGasq7EMI{DfzlgTQDDK;gIU1JMniBUdL z$l2s$?Dc@g)%HDwG(Nh)KxADxWFp4APvl;U2s%2=I9cd2PcYk#A!Lm^Li%GNE1ypb;&IdG-UR;fPl;*4S0)hxeLniS(!S2vNu z*q$b_P~ftc1HjlZvflYK<9cv>##XJ|YF)u%y|$IB$n(^|K;v}y{umO^w0R$cUu!6O zxX^NT7cp{o0i%~0yPn-uGY-h901&9lHcRJtbfImbI5#)99Qe^%Oway-CIT#&z>Tz(GLs#wGon&sl4rXf~>pI?GQC$h>?}@%bfIYMim3j45>L{9U!~- z@@S@=srIZ-8~AnmCknTXD+t8d_18ga#qsMJ1J-i^py}|xvuwkSJqJ{K?(Fv;k=aNg z+7LOT-}y-T=?KC;3Ibfvwn*==k!Z0GJs9n;(*3d%X5G^cev+}cjaplXofS))6HW3S zX^8yWoS%s5?Kk&TabdMJZ97z@uVq(c68f;u`Tt5}4=OWE)s0L{O~l@6nm`FF+P|!z z&8H+FgNU5VwmTMg6-(bXXSHLtZ5cf|Jtb|uoXIdL?p9b(b?sdPzRZ&RR_a8wC6xHkT}G&#(W+{_tp!+E`YSr3Gu{euAish(b3JO{ALX=S?++3dTO z{p&wQ?DOoA14AaUhy*FfK8osyEa(&Y;m+z{>UQYvWZm|~(VSAy;(mNcDE_ zb#H}ASofm@IeJ*@u^$g9?G3d z=_r^`AOz%61%7^dPd)zyn&C|S*Y$bu2j{c`ak8PK1WsMc^+d=gw+u?E^&IMymA==D zFFS4x4jmr8zXHG^;Z9i!WS-!+^R-Xp@Jj?0W9Q-pQi83UAWMHxWwxWeUAy*78U-|V9g+P5HhNDHCfHtmKe~UYA(R0!_je|+uJJlo^MpjQIaxpN$`P^_rNzzy7kk! zh@Rz$Pht%XO%REErUeR>_FHtuYlI;ztESmuig$)n^f>f=QG%w5FDRr~n3f^snj}N- z;4FGZ_%@7ofOPz)J&=v}>bDxgyAO(@+&`Y~|J0PH0e{^aBuTBtap3&K-5H+BwowQic6|)i$6tE^He>3L-=0fx|OF;ey{UW z`X*UI-*w6v+2-lkE3&f3uyNj2{lTVzwbjNgYo8-TT5E`#)7RD_b|h{Qx$KJ$f`@qL z&l&xM1-ne)o*Ds#4qIceO+a@Bw%PWz?AHaC@MWLi#2yG|Po!b@=pLRBtYd^54R8E(+5?s6o&crY4A(G*YBFr~I zIA2h<5qLO{Qsrjbdi*Q_DnYMrlO2gw#!6Qe*8NCtwu6YG%-0^03YadmY^GrnGSTQ? zosjl^gtaKvq@`j<)I9RnnBnC>jwNLxO3)>6!=va7ssSa3YMtABu^S>@b^#T(lrEuW zqlXAr&perwcr#h`tW7yYeGI96ZoaN?ox`;ZbnHKX^2o@Oj~_qIpPVrL>({0v&d>H?KibKM zu>(F4?{zHD;ps4wKD^yn+R{vQ@papcU}37)dB2cKvUu*{TEHLJq3_rvaTahqpScD( zI6B$hN|+dngZDY_2jc>ovYt(4nXU!vOOylWx~z2VVZ49A8p}R@*rnJuqa1cQ`qbAr z_%L`uOEBjRcTTN3TNlvqeRgo*9r9-@b9-yLdA|pMI;IAW^w_g?X_5Z&9NXN~`>$F0 zQqR8Mj44T7Yd0e8=)}T7e6zbuuAN7lbpOx-Wr}j=pd0QD16}M}0oK!V=)8}&)KY0Oq zlV{#y2`22%pq$qaz+N#TOpS~_3-()}1%c*iz@jgCYbcWTaTTTDtuUZp$A#McCA_DA zERcSO45XQekoqtW+~0veiM{lxG)x;c>)Z<~1h~ylzP;Rq0DxUW1w%w{`LUqWIEv9q7Pza)$i zpzENum4+lHzx#gU+ilGK>PW;dGm5n;ex}C@wQYI4P~fa(t5+J?y&D3TGVv3w^6Lj6RtTW%B! zQy~tK4g|TIk2;w8XdG7F3@}%juunLhPfO`@PtWOkDwFzILhN@WghAY!_qZ(rxJ6dP zyTdy%Rl^@AtdKt7xeeg;hq)m%BC$-?cHl>zXpS*-)7~+N|wnLZdH9~b5`NPy&Nz<{)IB6%-`_k zo|o=~|9~Klf1_uH##{)-ZoV4GUZ$JWLNwF8+#LqqlG_&xi-9I(Jb6W(K+c}*HwOoY zjXWFB&Pi2)DGO$OF&~LrD&TtV1FfU#23F^?n{y7O11>p4HlCPStax`)r`U56;*r>2Rzec#W# zZz&Z!49Hm9-fJ%1#?&^6!BPhgFRvymgC>g^szf^g(j0)k$j-D{s&kzQ2mo?ule@nb z3P*aDG#MUgON&e$90}C?S5_&M{2>}m3+9oEDH;#@D&-|-UQ`!ycC=T@$9OcT+{A;m#}enEwrU;sH9Ca zQ?`uV*h44I4VLdJ{9q>$#@CFP_!Ouk>5fv0fsl}KtBH8)Ie*VGP2+LRZU&PwXnoB zNYJM8e3gsu%%hu0I8){m%A0A$3L-dmy$&N)V`hR}v2Zgwa3#r(n8pCt1KAp}+-|a0 z5F_mcNDkOI70an~zY8~)33cuSblBb9J3tSW2SD2bFrqsANzP_EigXPn z-I7uR3t~#b zZZ|dRx?&WkGDlMM|AK$3g1*= zgSRBujOn9#TgSp|)>+5Y-M*J0Khx%<)+U&lnI=GHZ%8FdWRC|bsm?;GvQEfH{vKa5 zrO285k)U@`lsi#sH`G>p6)3bZR$$n^D5yg) ze^HOqn!prI-&e%kc6>>q(T?9h=Cs0$yh#y!paO!Ya(%>M$2w+}IN35(XG1O~ozbaK zP~rDqb1i{PckkXU_%2`1k-Ia_Q=~=iWq*0tI494PGi!6~s0Jj$uCOV?7=}vo3<{KA~Tk%liE~0b<2J~NCxqS0Z z9Vzpjot;_*E<_0A_Gaoub%(|YX3N>}nH|7=TZgnZ_O+r|$s*VO{NZh?4_yD^f4Udw zbvc~%JTmX+3%n`d?td%zAJZx}Sbre)&Y%E}wtU-5nt+n20B_Ia<|j?Y&6k~+@?Tds zKcn&4uC{FNe!5;N-dL@+&baU1uN2Q!{9(&>m4w)0`jaz<0C$4q(~n%r%hVrgV4st* zRuARyh=$GL^*sNao+-k2(4y&7 zw?K>08g+52(W$$hwDdeo6Zn|azed}Us!IGI#XEXWpqR~5N|GLWI=gqOX7#`Dzkm1y zQ=L2ayUaupn`*KQA~Ojh+qMB=83>rVZB5;0W?@O5ZD4O|B+EX_QGBYM!%GA-CJN93 zoha1_ADA@D-cV?%B0&$ZJX1)4dg-)EWXH}HQEMkR)?8{USxMJ!pQEl<+n$%xye2{i zCyx-S;B~KwCu+Lh`p@?CHmE7eS}{h_vx*RmO<;B~sFb)5`X(-??7sL7Thu{EDq+W- zH;WX5lW9y0Qgmd~S&#C|#Vf{#mPUwHA5GpMHY6OGwtrMyqnpgdIwjjCl46X>=szMC zc^>KV8&^oQ{g9Y;#|0^Z?D1eF6XDB`MU6m7GthT5Fn%kViUG`+&smrwwA~(cxpOmd z;$&KHNxQ~PEMJ#fynWG|DY6a0yg}_3zH+iY{KiE z)5C+-qF^+@RNQHr!me4qxV=gk(KxIF)|xl6g;#}^7hmjvA@Y4R1seKM=p=o) z8z0O%oHy=6A!q&u$o?Z-c`5W%pZ)3KA#Mkp^I1Fpiav)ZaejixtXgHTaQiQ-Rvd71 zkaMaGJXKudLgGnJl0YXivDo#qUhvm)jP*l`uXu`7A8;+QeBp4_w~~FPwx9jrnBX*V z5Uqru=u>`&zh!-@-7+9TF^mI2H@%kp8-rj$(q;YV_Wn)4L7a(U({umNnrQ!bz>2(&{m*g;c$f zD!ur{xNl5X?X4@Qv znDx4vLGal_Z9?}ZQtP(LQ5PF@ubeK-fk}942#4TneA(Vp(LZ(IHJw-ZKRvx%2u`MA z&4os?rHJny!yGaiH^c~V zS}_3aAyesH4($7zlc3h~MTwv@5jkd202~J_!&PCYKtf@BqsDl3@p1@%^6$C_!Y^0F zB$sSACD7o}9+rzPsAy3BMPp&0hR`({Y=ZQxL13B=CFZG`4u9ph072s8hpUdW3okWa z1d9RB_@39nZ6Ok=TJ30nydJG>HgUn;Ab#xqsNSNV=ML06_bfy_79RekygR$Wim}iEZV7FZ7-1Is$2T zL@Z&bz=FTcPFc;zn<^)}k#fu1Q+5pT#H?BKUHoGtem?kBcHVI`=dJSH6s03q=9kqL``d}qrS;fm#t(qPy z$+llV3Gn^>Y5QXH9O2IE3Q`hmHBDlK>G$IuXHa-fjdztb$WJvk7y~C*xvVIp;z2tw z6g7}_2WEFB9b)tNng=di?S{}o3ow(VMB6=(nPm>xXUI}^BkHqV9%&GSQd28qmPOO& zG1M8@0lB!8lZ37rOnHuSemo0bjKqHv*~t#b*o1= z9~^U{Q1*#HTT$4_v)F(*K9>?iOQy()KUZlM@7Ajbfx$bc?vk=|0QPGg@)APk51j57 zuiurv?@3ZeR8;Plb$(VuVZaR}sM<+<8+}x~yjSy{3;)j@>A5NU0**Nsy)t}#QYUQR zwATmA$JJ<**vF}|;=x)7(*pdsqw97j85R>^xuNUn2b*LgrUbjs*`*Y19))*SZrgfT z^?LG@jWpc>TmWB%k;o?ea5bLlQ{37X3Y6~4W*jZl)TGF`U$s-KPP-&6dSP$ej?_vj zhqy-?c-So)I7;-wCyCB3G8F>K0u&|XezScx8Vt*uc8vbXhK zAi;{?jKn*=}pzG0OS>L*gEvu>FX!X~(-m z4}B2uReZNJwcEekWbjw;;pBFfi>$uP8DI#QzgYARPBS(cPMqY(Q|3xivQ&KVCZ9l< zgwx5DrxUNo?s5pvEr~+|*lsB)kI5Ab@#T-3)&x9WZtIg@?dv9D7!e*ZwMc1J)O76X z6p14vuXs4$X=YYHi-W|IBbKXH%5(qVDfRPE_c1Dyl-3*(S?gG(qf4c}*vO;V@+8wF zv=5v{Hb;=&2(L{teE`*we>C+)Xk@DjS(Pgm1N~ETRBBAMGvKi(ZjVcLF$T>wH`*Md z)p$T+&h+@~POsO-(a)cE$jHenTU$->q>4|q5gD-UOUXD9W-_&g*mzQwixupm+^+B+ z8>5SqGx@T|NJvgC zz4%E$et;QOPgd!9SZn6B&{HLtexKr7ZF%&7pA_g+;{As$$GUqm){-Dk{s<@BidoY* z+)WgsIL|Tgj$%Q!W1=s7oF%quSoJWsVK}}N>sQ3lf_Aawsw#~H`!h?M&u>jl724QJ zge+4IdJZCjRrXuinX3&9zq~S8tsQjy7I*gr_m`zrnrU#$*B%HHY=mG-Tp;f;zD;U) z@c=zra1i;ztz@@fbH~li6CfX{s=Et#w16P+kIOi=N1lPkHqO>-Uf{;1Yo05z+cMJ^ zWh~JwE-F*HvFajdx5@p=|3 z`Ub;_Q)eEHeENP73E)qb=6l&%efH1Dj}rG18k^r& zSHECpW#!PIR2*~orpj*A9@Ep$b~bzSLk85%%}-~CZ|9vgI1$)*GDwMpFCInoV zU`h~Jfr7BdaiuL!Rdu@H>hp+&JKAz*nf;K-Ox(Tb6;)HvQgCbrzl;c63!xbKmZi=! zjjg`uHL+p;+dxV|ST~tB;-3E;a_{~iqN1b{>|1v`D4-EOH*>`htOQ! zwKO_4`qKDP@k4p@tll&mkwdp|k!L4om6MsV7M5XdDufjvz<-F#PgucaA&$zf^f)eI{Y;QS0{8)K6s%+@tX4-CnFsn#I)1spgHxLI{n=A@ z8~q}(k*-?h$`^BlD-0kcfuYE|kGW!6yk@mHQw$aQ!ZxCdy=;YNR|6QWuhgC9FI5{p zW@RN8gL;avTNAl07nb)U5%38}d(E_#vZ00?{q-7MO_|K<1_E12B^PSR(clC`&`wor5&3LezaU#Cy6(Dc z9m$AA+-#4TVz2D@s!6$i;j!**I{E|=vujb~(njMZa4iAug}~F@<^e$E4Gi>gJ@ZZA zTKJ+O6TSS^cKznjfAQtF>?K-`xkOY?6Ywa1k5aF-`WgT=I5 z@6Q~Jd=ltQ)q9;@uFrJ-bioh3$?IZlKzCO+T3h|@uq z$ji4i!Uorxh+0~qY)b!~+TdSeV{0L}b_mw?i{zun?K7pK%&gm-Z>hN4Vz}N?JRO>C zKqMCUG2Wh*QGG((^=y(kgQCdoaP@8SHNq20w?a%lJ;C9jd`a~NeL`;uivbgZEisv? z1nS9Oe8=``?P{muby6~FSmDQJ&sfw++c9DqB8;)Ztnbx;L`7%rxs17#d8Yh*#E2`Y z=j+aXbE+duD&}SRb3NOsb0lJ!x5n>$aIR4RD~i{79l6H7aMTD!o+?h z9j@JFri{PFNI#`K4SPo@!X-u+e@BxE14$Zn^{Xgj{ZcewsNZZXxqrV3{_&^lY)Q)< z9A#2kXA9y84t~-lZbmLbVoEitK5p0aY!WQo!1=xPihDX9Gpb2$U-)h(GSKZ1C!6rc zVDgX9%P`f}%re3twod#6M~LU+BN{wSOcNg#ngo)_C(dXy&eOtuM*IWz?FrJR-59#2 zQ78u1^?uj}-}Fo*KGQ|BPyBr&dwhMq8bJC(lnjR!qD;A7omfDyRq|sNClrYiO}c2y z|M>o;$m{f-1*MsR4{jj`hqXKOczJyx0?-sSr4*5>j}`hrU(LP!16%Kdl`jg)_e2=E z|7Cd&4&3?&Nv#b!a%_%ac1z-uE-nd{1S3Bs;B{NlFM{P>jU4s1gafqVMsl$om!>CP z;Gm|7hSD;`?hwLySLYNhQFo1K-Se35#BMqq9q^2hB6eoEpBpVmupBj(BYeH2A`l}o z*bA%FgUV&D}yy4WgUPAe`5&E--c$c|WyOrmsSwiKo}19aE_lQ$A@_4dNh);~0Q`AI-@s(dvp z)k9CpeiVlZ1{u{0&7q@fV_T(#S5AFtt8cNV&(R;vlZA4HFnxz4Z}6skLj;}+8>j$M zlaD&RoqU3l@LQnKw+)1??EE~Yh8DtGw4#wPC}i!kb_bWIfz3nQyUE~Ocmtq(?n`$# zaprsNNW=-kvMPOx+y#Y_JeRMD08PI3;Hd zzWn>AdwjdFfB3BGtU7N-#>TwQqAnmnZwLHa`Shq(ox%~q;<=y>|7BjODpI?DXh2KbcnS`U|g;FGUJ zun`Z}H}+LA#>Sex60AOLd39}2=|bwS9z-=*x}|clz&ffiPTjdQidU_cpyXAymn!{r zb|TWm2H2SJ7Ub0K;&@Lwye z$MvX&Y{|%%aR3vO;$3Hqd|#0zp1}5k6=YHkS*r;06nn0} zsdJs94ex5`SB4&oc6|YoLjbajWAl3PP-ih(Xz%y>7kmnN;Kl#FvVsHTDho87&#TJu zRxVlS1kJi_2lb!HiktLQ|5_sU>E)b!X;F(Wl1UX6$T>8lq`#*_&a#iFq8T ze!iMss}{jCNRcB5`G?m8ZX2rrO7Q%;)Tr)B?B_qxl5wV8Zu!9AKQeqx{69|H+CtI$ zQM??#Lx#__tgjZ=_tt|?uTzC?mb`B-W`IMv^WkZ*-_@a=TRLf<^1XLy9Pip+f`yYA zs2f3vU=^4K6$zd~Opm4d-51Kr1YREkYQg-ZdE#P@yu-Ot&&u@rqPca?Nw%EgJS#h- zO)Xdv?TU`fn(tlLx0$`27kYq^1J53E@8R8rK}N50!PF|8SStIy*2D-irzbxC6g3;U z%^EJkS1g5u14UoRPhFBMD~pI~j={f}FDL9SvE@r;Y7hc;3KcL_FR<&>7$=G<4H-11 z)(vX6>s_HrkBjlMPX~}7f zv?a-*%(E10?ypQ$_L)4o+1&t9gAyArwcV=LBeq8dWGe22J~gM1CI20vU6H5Ep-DNo zeor@AufEZceSn6jR=$jIOQ7BFF+7`?B%%$5+hZBl-iE3{Q3pAJaESBoh+5&G_@toA ze`W+ok`m8AMm=0A-oq;?_Iw|8`P+5iRCLrD45ar!Hc&YU-p?>-8&Mw75bcC#;|%S# z=kWvV_;^@&T=zzVDeg-=RKe@YO&9!4d1zJaoh>55$Qh-^c-)cC7PEd-K{8H{uVA}) zufh6Ab6Niqk^S=IXUTh>Hpe{=nK>m#hq$%D4P73jXF#&Y_v`R%1k0nAPcvG+=@5ch z*K?!dca_GWje|64#3OyycBCs(A*6Y{paO<(F#gp%h5_#V-}W)xp_MFYUje1Iclr|pAqON+JJ5!v)T!?2i*_8mNvn^$Sj-BowuTSW)$pk z{0dX8^x}3equf#5bMog)rL^5y(H=77=H|NKZBsx|dC=zJ`Fn;h$I^8yYPW=@iqF5i z2->N|yo)Svy}3Hs!G7A?+Y6?C`twwU*|flZw)*w0{C_1M(}MItg1kGGOJLDB+w!SX zA=8qZrE2ovtKJdWv!!eD;M3#gy_T~B*T+ISya{e%`DwV}#IMR!jCcf@=uaPZg1Vv- zaXJqO{1fltL7Pfg8O^#=K70{Na(7aF0e8cDBmSUSF=eE3&{m%|weOH-%7KtZ=#E<0 zc)tjM!TpDHNleUhZ)mYK@wJ?q&L2D9X;+W{vBlV@5~>jFJ7-3Th)&b@syf=(*R1g$ zxoGl8pm5w5i3nYD=(c2YpI8l&ET`;6qMYZ+d2v%Z95OH7-UH&np#&?JLzgCa+M-P7 z@+dB2wDD=VGZqxbv)?89ehcM{=*ZnQYW|2EY~(qAW7;uVilMupy4X%{3NqFcK&T~B z>sVCQcQ`zb)N!O%jYNC>MxQ*D_Tc z1)HYt({G#5pGYEsaiGmu2m#<4ecY=bgQF4VIXlNFlsw>bX*ZJV*&QeAIzA+|Zgy4o zeE3%;#jyFsSN+f126=H=1DPmWZ`o<0Jjr5nAsH{tDqus>D(+1IPKs$Q_$#oP}$jcg5%Iza?9GdRX4~ z(vw93>s9Dr?6S{tfsW6xM6-{Bp*017hT4><^u(6&Bc@V<^jwRG1swSRB1uL0EC{{t zZFC_K?}Vw!9P^rg?vl|$_Ddpp(vxlP+n3_K%z&9%Qp6L#V(8!F00eSwgP|aIxJ;t9 zHW<^`DT7SVZ@Tz7g=xB|*_qxM(`>C$zQ-RZ&iZ}`fd8y}@6Mg?0sxc54UdaSSIL0% z!XiczyvL7Dh5n0sxSnKK7f8Do+WxigOwx1%)9U~C_a1BDRcG+Ub?Xzqy>Zz9|Gmu( zcUjXkD+&!<6_vtKvmrC|VjN=ADaW84-cAt9n-Dcdkl2rtcR;YbM6U>u))Ri${%!2_ zD^);_fCK7~+yiW`0j=S--c*Ch$1wxIdse&F8M`!z{+e`VF|U+V8D!?ydAB zSn%H+9d_ zAqY2R2g-pR{`>A6=DlgMl4I;=-uQJX;Aq#TW@?|=+0|u2|+fqVYWQsG-JYvyCOhbB_JC%A}Eqs8gI?N($L}X%1n~pOi~$?5M>dIN1cWYSl{9-^pb^(ujmrJgq3p=DulziP>%7uiIy~&QpoFvr{_Jt z2ASWYE!L&wAB(?ZYeV;f)~_}1Nl3)k$sb)z$oXkC5EtxYS=o!x z3JlKjiqKWPS?_o2;2~E}X;^A33tO^aS)zU)!5eepMcQx<{3%DJGLm<5Ro|my4z8q@ zqRUU+q*|jrgn>E9ADAtLYTW^nS4JTdrJzbe(z=?@4aPLbN5Yv3h3y(69T#hcIW#)g znrwO3lwCEU!kdy_)bY4_(V;4D=4*af8)YNLCbnFfydM@gsxD0FAx>}oW(%uk$MzBm zk*4#`?#5o=drcPw#k*xy06(E9tLd!qzNsG5>?{_C+J!g@T{?seY#Ur9{v#RZE1k9W zrOx^BBWdXi8I^?R&pMY*FY)mQmMZXH-zNOe37(uTPAtrU*yl3JFd7L4da}k(^={7& z_F8Xx-v?bDH!TDmtelLzH{JaZXYp21nJYe?SJJx!XV%_^(TF^#lcbcy!#szWRDz_F@f&Y^G08iYG)LOLL1stMXFab=eB)wL`|RIdi}n0$ z2mecNU;bvkyu4IStRZsd%xt4&y7Q#wFn6|0yqtB=jb(A}V~ioJ=>~3s=WT)Cl4RdW z{sS4Ioq}&n{(WsrVm3PLv(@GU{6)@JFil)OWBlk&88_z6#GuEc8{@ty{2=-%iZK;w zoEBf#ADvIEWg8EFv{ueUKGg<&t+9AR0Sx0nof44A0Nz>q3}+PQ6PLsu>p=PZqz=I5 z<|NVSP&;e)f}qU@HgOwB#e<+KF29eM@AYFiuDV)4w#A>Oraw%J@Y=@i6{jnr8#^4h zb80*MisHHWx$Mb4P{8jbh&`or%))@63>ml9ZgNp7M%U_bk;4(`N=!SL=c%pzR zy>#=MUj0Qo5f>H3!=f7A6A^>@~npzdqeE!N9x%U3~SrwX>=>K4be*s-{4M_AYu&}ZQNifE? zFpx!7|8&h!%F`zQbAwy@9}a9Q89%J%ca-=uP~rKQ@nH5AVCg+Om%Z7=yuVo*UkE&& zqGJmV9G23^S>}y>#$^q8fUh`spY34O>4Q}JVhvb z#LR=htP$VrR7wJqx`aL@uQ-n0HP%=|Pmk-mav_}0z}8BD*5`PW#-!Qr&3OPB2cJRx zFZn{(EYDu!jhl$X-xW9LexJZkBYWVZLa*?hnSy}elFe=Fg>1>VJKc9^kEjQ_K{J~~ z>FHsG}GVzJ!$^ zymDaOe1wz}#Lf_P-~XeT>9wMjnSR*UibYu_yQ=m{8U9q6KLkJxv66vA*^UgJ*bK}u zh7x7N6Axo5iR}-G57023f+S1iu{m?#Y^KvH>KcwH7L+nP<~kVicO?}r}Wyotk? zE{5>U8?9&lMODjUeDg|3TM3^yAi_jhCu%|bDw&!IPg~}#hvQW6e<R?^sq`N;&&7OLjp0bt7s7S7hGrq|yARsn>Z--6KlQo!Ehs2t z+G|%6i7|Q9253nCq$9@&+vSVr1Zx*tD!k`o1sllA{fpx-WPhBi3tu;EJk`*oUOm&QJJM=zr4x-9x-_Id|I4YD|i+2W$tT z@4gpW2)z2!y%2m7$#!!yz91X4yzxG@_j`f@J7xNhaE^EEuy!XXS@9}bxL2U#kb zaK7M1yzM&ZCv;wDiLEyJ@=s$1d_x2t(3)zVkO&pd%H;R;Jhg4CZ!4U1%fh~6?wTRN zW1Cosz@oruTq<|ZniN}%l+j5Etim1ix#F+l$V;2|Ww=U;63WTcaAt)9`+J^?cj<1J zDl(h}pll9-GZVc*pKO5tulQ{YK2NhVkT;1)s>xy{$$oHMZS~tyY|>P<1C}Qe346{Gu)oaz_dZT* zC;F*&OnOv>v0`89Yx>%*Nq$m>^7wor`;rRgHTwHHB$4+H-C_>7B6LN@Bq5GU)L=zC zZ5%rUxQ=#W0!C{Vk&MF&Eff*BI~8jSRa7)HH)xfYbWOdQOJZS~iX~t085#403oxmr z(@+XKwZG~FaaoGm>34q=?}>X2vntjBtu!vknUI$oN`-5TP7Fwj8H{uHLVq*uKmhRJ zBY3jorFSGrabtPEmVb(n`1^UH3DRrwG7Z5$EbWlrO2Qr#?|MaRldF7d(ZQmRkj9wu z9(`KD&X(^S=me6dU}~w{KAaSOCA1A-{5)#t;1Eqis0vimSFhrXWXmd2vn=hqz5{B8 zfYz-f>4v!BEJa@i#{=HM2O5THL^!n6YLb0HSDPb|Ge&FYC?lGH_FV$hc( z$NryyS+^e#}oxx8!{=;igK382JzM@Hg* z((Fm>?QC~V;i^~~ zUcVIj1hfuWxlxP@GkoclkBYJ)T**ktwT{87hJ=%%3Jo|lbVzuh%*;EMRS#>)8zXXS zLik8(#K~Eti$=cFr6}YrA zo5KAR|d+{?gGUj zNsLKmkw?x-tmNZ6J;Bsyf3T{ zM3OtIOQ**lF^1B{nK0Gfey?tW({>ln>Md5{lsJLR z{~=Hal)yD3*?KKS(Na?ctwW-m&)oC36~v&8K|rz;4USnl+4mdAU6~wkfbKW8V8<4? zb_5q!1XmxfVrgpTyq^Ek6&k(b@TSAozV`;xH;o~Si%Uy2mTiofypXooGp9!>$WOq9 z>t6YNQ=>*d1mY9Vd2)PmlS%miEEZtYJkq1?H?1d15SK<%2ZeczDFR7p`$XojS{CVW67EqtpQOpZLpBJxNdP`BeAN~Px2ie zcB**9c0A*_^+2>rfL{*5j#E}v=IZJB#&#ro33v;D!eZ+urY3!J#B$jZKxj?Oe%oTg zZ*=Aq=@Wo$`{akv@Qg$fg4g0}nIKc_q9PhENFsqOqR7+{wPT_=4V|(@ELXn>8`Gc? zW3@rV0ZkzW%Uj@E+J)E`VwSCOR5Yw9D$Oh?Yc z1PQmsHR?;|52vD8^d(&--JgLenHT%&I!%tjT*4$=(%T{n$(CY@oN#>|7Oy|Hn55OVTAw4`@lEzQ?QfK)|BV-Un#9Ee_M;T{aCQO>DXEH z*6XJ)8Z(nx2W&Ano0~w9#EkA~*-pJmCN^#a{alhYBcB#EBtnG~vik2k@XwA=U0q!s z_df1Py5`*l121QbF|i%+d@JO?&YFc8r%_Sx9g*=QQq9`6%V^(|VOzGF{hQXS)aSp> zk8iIdFGqswWhnVr3x6t-E#KpIM@4ZZ4QsD3knjtOSgoWM8ydI8hp4|$KP{w>!BfUh zxmQpVs*9&&u=tV&j}OE90QZ%C&X8a_+MP7rAa#t0L8wwpwB#>@r=OyLQHP4`Ez^vvcT!_NmiS`48R(cKWBiM}+zJtVeDAWWptSa;|8po*B4AR8zxzPXahmJN>U zwg>^r;Vr8eWYnDnn#kTiXZd=39@w;rdPbG=;uaCt%xL+LnM$M0C2&qmWJKY_oj|$U z&Dh~xk6VmW8v6**pzWQtBXHFucS@=#oH}ZSG4E}gg|XQaBTE?*^Tt$*MtaLzv#8He zBI?{@V2WoX5)f^isJ@WK3RG^s*-Wc2%3PR4F&{n(({58Op;xYwFQ%SBg^$J35P;sn zKZJ=5ESj;dtm^1t95++wg`pH)QnE|~`p2Lz6+TW31TiEAu_h-pdf*;;OD|NR<*;F! zxXh?=Wz^&GIxA?Z3S-PeE*Rt1+|TLbJ9(Q-retmCEc5%jk?|?HTj?E22BzC?+)?3h zC(|xoYhp1o`ZuJY`B#>vzwPgqzYtF180Z)xG{CcxsxYBCOzv{P9kh)Z;O}v;7B(d) z!Q3H<)7oc=;jyjvcVx@^Ns#yRYmy$2TrHrEX2T-g`7}u8_PI6B5cpm|^E!|4k1yvh zjEoS-jf}P`Q^N2nKDfX72fF1CpKWT(thKS&Vl|HK<>XY#Zu-RI-I3rE-0DM<;>H8pj;_vSB` zuCA^U0mjEjVdBR4l50IH30}ywhD)%@|GXPR>bV>eTy69r_H1oWO}<8cy1Bu6%U<>-pcX0MN;7*IGWfLatp%Y?XoS~dVKP@#0)5^GQj`RJ zEX6ZQn7JpAY6B@{Xj>6IEsS5sovt8`D$x1^QDnY`PS0GxCU;ela(D?wvr2^&MNu2N8d{Pyw?eqNtKBKh4nQ}iNDb7s#Oew+RFzzNz zoVk=?6@8i-lKm2s+wuf{JDX2$5(ojukY`3CNENRX^PQ&4?6XcDT~FKo8V*rr*|bOq zAKdWki;cU=tWLfMzn>Dq%60j-_x1p*!{XtgyJb~jZI54b53pf!sO7V!TRZY)h{0*Y zi>DIoBwMB33}k>v-*~eul3ot4yI5{c9!(AGU+bRU6?piU6Q?3$^Q1M8myaRVFJFY2 zR5)9+;vx973mpXjI>)TS(kzgvv#+0)iK*5Pa-EHdskh3^zRHd z1rkJolIfbQYU5Ts1>5a&tsMV-DMp-)tsv^5waPJT_n4SP$LEjzuGc14f6oKV^#Sjj zt=scR%#+K-%*26DYl$Iq(Re=az%cGX6nFHUTp8gejuUh zQrSk~7neH3;L5+s&2@jnA(TUWY0TH>aLAVk{eTy))b0o<5WY2Vc0FF+NM>q!#WvtN zeRD%iM+clNr-IH|*-6{RhI>hXpv?0!=XUo&vNPDkz z<+h@Y#;BKOdH2s0Q$9>fl6|}l(pfV2_{1j}-)bx88TAbJMT^V3&+zQ^RjcrH_9*a( zj5Q<%@2GHr+ZDYuViRcYcaJ-b;pm(>H8mB4`pmn3u~lvv9NbFcPWx1wK^@s(Y$1`E z+_t;A%1s;nl<-f)C%^c7X*;7j9>Q=zC6^aBg@>C$Oc@s(a|8XT+nvM`2HIEpEU`K@ZU-Ztth1hfAj1f25UyN>CXf z>DB7(k@T)48VDQ&;TYxAZ^LAF`J`}0Do6>|P!)r}wH{%-(w-XuoYeI2cgfM;1lh=( zm;VqaT{Kv0#4?hKoB2HZ7;oM_$;bBUrom8P+Cap8N&iPdbk`_J1&1*BsZFnr_RCUp z9s(>qy@J*(q&|az55MZ8Hg)*w#~hOQQoawaaaahvv+WBXj z_DyXyWqwV&2FNFX5OGvj+S0fOv{N6H52gCCAOa1`IS04)3J^PXd@iXHyB8lvCsWYN z2Wn$Alh~v${0oA|H8be-e8iC$(nW1y;vsex<0){p2R8xhsM?iYt2zFgr)6bjZ%?+j zw}D=|&XK#z2i06EhhjU>+-q@z{}Rn~$G6l`ckU?4t6x%jG>u-tMuxDh*L$B@FNJP* zmLJMqcbhT9Q$F7AAsH`1dXIxY8BX$r#y;ecwR;=A9lEjM!MhLn3M9bvq;xML zkG`X{(-vQ=V#;hay#e>#+z%mPUz-B?T#S|tsU;D;6);g73w$t-OEy3yKvXRBq@VLp z{eK`hNvS6tRuArlErNKDc|x{GRBWQx#57^5`Out*$ivvx&l5w!_L*We_eY#E`@~Yf z5$5=R5^xI;4tB`YfXME%2T@-g9znSvCk({Ge1%SbA}Js$%pp?u<&0$s*+1*-f(*l0 zzVhp%YQ1I)UtP09Q`7IiNFYckZtS$Adpfy%IFKqdKsegpuhKt!1Udp*!5IWi6izoc ziMEazL8=H1Q|GUrw&dmu-Nw5Ho2JT1r_l57!wRnu@G@Jbh|B9rJ4k+q*kI-ZG7Z$L z1TOlx$Z70CuX|8bw^Q8AZB&OGV(&bSQ8rA+B@7k8v4BFM1?mj?>I7}nICq#7BS7}>9!kGhGYV|$V^_x! zy{bWNBtzZcWW6n(86-!1+BBPOJFQWZmR-is*m5hv`ehXn=JZmG21>j8MkVdcPgqRI zw?Z4xk~<}ia#HoB7L!- zn!<%9kjKNBUn>I=@bY`l=X;SYVqia{bwq33@rJ~fpXQVP*UN56h9^h2Olf8?< z8a0-tlX0|Vqgt>;@=VtX@-S~eFF5N^?&n7VYBn~ub#l|->o3vRI@u>OGFNsF(gS4a zN!GNfft+FMga7$b*zk-)1UQB9x-34??9#kj@H_B0`8D!faN#`l_HsP(cJ=n``h4=p zNys$AieBR>GpUNaVOzWC&nWXKbA5o6;3Xd|ui9lFx?~l8;6Wb76_JDz(S??fNazZ` zGiEnkO-V0~wQdq=Q_35aO6t#vm)jCgGGJfFB{H-aA_fwOZ;2J1If7g(BLBg+PP(Py z$jL<*-c$6tiC4N1*uBL6x!toU$Kn)XYndA1A`|0JF%eeJP5CmJCA1mK!@{&G@nCz%c$kD zlSpLs6BS}!mx?r-O~X)e-oko?9)C$J0x^>(QSsPUh*_V+F4 zPkMP4x57$9N@V2vKhw|-(pZRor8lQqTy3ORh<&P7yI@VJ%}p!E!yYEnlO^jJ_=|~N z)a+6W0I5wd=AS%ughNr{AN*tz- zguO`xFflVU!kMCiws?Aac+qd#+|%Jp6m9`A?SH7p5AJWXF{ic<1EEBqIX42&1Hj<` zKpt8TDkC)UC~4iL8`~O^FYj$S_Qd=2;OlU6W@tMSWr#&zsO2J#Fm*1_vkXudGS~%+ zSygzEfeaE4DMD^EZO(ST2ez+|cQvN)oY5gsi0d)Dm*@f{6TSv=?qqK4Z%NJ0%zEK< zMd|a#*-FRrhbkCdd=yZUo;@szEPdmbL&2|1S)pII$HCWsn{T&nkG6me!0(xjfx824U7bG6 zq>2KO@lj?Ubp;7b+-PQbsipC$pb+J8a6&spXFpEZPx^k?`EB*-7i0ofKl|Z$Gq@ZGE9&}soA)RaT$A4J1@UNQu-RF9-x452? zmi{rd$FsKEQwqQjwIf1a_aQmNq3h1>`mVhv$X+Zo4;`P)gMr= zo~EmtTU>PX|3lSZxHbL0al`oN78In@AOz{|vS<?hP}SoZro%|*B;zO1D$xHOl^fY& z`0#Buix^iIix1QZ<0;VI5MQiHYT}0-`f?6W3@2H@^QF~N$b0zYTI)iGhI-pW-<+~# z3KGyk*l%i69DX)(eG>N(=aaY27#uScVKnsQBrA!6>Jodu(tjzgtJ>>9sV?U8>UKY#7CG;s-^d+J%LNvD6`hdNjk14QNQgdm{Xxl%I`p=S2*+rsu94xmhE7biG1{U;Cu-}8H zWa`s=(sRl$r7N&5VW1>W@74m-X5kM$g(a6T9z#RYx<&D264&Gg!Oew;}#FR=;-JSjbf%@@1Y-ftu9$ohY)iH;_9`*8Sk-y zc2}j`7Kl0LGbL%8=si+}Cv9DPv>iuCpZcmCn>}a-9v1Q%@zBrMxqXLyDH@T?hgI{ z`tacUO%`C&!_>X!(J_LrdQV;8<)ZS&W`w|KHx*7YwgCR*xYMLE{+7zi9z3PA^o()4 zjPYghs8?8jNa^WSUhosS4J;w@MD~glkaJ0mxDH`!bmGFI6ZqO9(}rP0@jN&Mx>|LL zm3j*$BsvWt*4%$91XFy{es7El9HQEyrF;+9md?w?r6uKaZOr*|bq{e-k5QP~?1Hvj z80`gXC*>QOW*zp6zvRZIc*_X77j_*le7z*p28AiwV%vV{`lh=m3GaYq;)LWITO~s2 z*9%q41hm3Qk_1^78eK78g0PTFC8YCe~GqbeG_WGHp!b~ z@NeJTZQx4>{>8;5yB!+`ZM`4U*pXD|s#d^NovCT`NAV_kpDDk$lB^WS_88y7u9p}p z;Nj1)N^K z%**ZqpZyHcrS)aJc|V39q3%nHdiW*y6k&9lx(_Jvp=6luhR|AbYu3{BZ%!fZMy_@o zN8N{Td9fGRO@=y@}+=qbF*FC&zbX6Kod$oF(}2ffcV zm+T5nS!WRM44_0*btEkA=f{3xJ{fG(g5OpyA0K>LZFP6M^=t82!K@)7xuB?kJ#s$G z+a2E{X4P-UM-OXn7aHdflrs-sWWNx5hHT_c^Nmr5oPoDvELe3>7Je6dnbT+i-nTNR9?qS~UvLkm4Axa&*6VFgz7pa z*>|7NhdmUh5to$iM^|?xzz$JE02J)TpZC;NhPU**^%N^4)^H`-evtMpH$_FU+XhzG z0R@oXMk$q|*T?)teJzl|(jll*b$5KssZUAYTy>BpEe0egKOewO`3tTDJ7C2hYD;P4 z*KwQ8Q#Lo2SM7*=1dd*+!Lw07{;;o#t~x(y5b%yS!51yQ?v6hG?nx0h1U>Jr|5HVA z0C%7n_N0;WRN~f8l(RwA`#KZ)j})<%p?he;yP%M+z_JHjn#RkLPou->GN*0 zVQ1!<4%2T~ZQ4=fp=hiH8!b5Cn~@k1ZDoN@qbbrPHjSsuoU!%``H8@R#$uv;-C@6} zruPEF?X==(QSpMN+<7$LtvDPVhPNbF7m|#WYWMiDn z|Ic9?b7SpaBA@oQE;2bJ(=1y)1Ewz?W8@xOTnmvymA@r)8JM}nXjM3K<^{{dAZHaf zEzgTWbRDx>HKUf0#ZpDSCF<2#u%qVet;BjQNbN=cK7BxtX(73yjpd^kv*~g=ydt?) zQ?E*EldcQSF6UnnG93NDz!qoOU&p)-vnOGgg-@ zdig-w-%Nr<)$7+w$0VXz!yL!LfTwfvyB}x~N12PPqR`YwVV>3oE`#h%TD<|g4wX_d zPHYL}kXBI`#X@5bfg&5ZftjW~s&V4}@S-i7dgfvIn9Noe{GcmM4~+U>#B!lSj%2G1{3Eo!xHx< z&Zx?vzlZ)yNFT`-JJsxH288danCJlXF)Q!~T>{aNd`{_$;@)pyy+Av=O1 zKsDsQv_S}#(>swR#P+@EZG+zVhWh9G>;rBDLB8UF`{jpxzBFc4)zE6l*@Itnk~Fm# zx3V0}2Gb1hB_`?gk>ix?dEs^7Tb82z1jt1)6e2NKq+@g|@DRPda6C;n`sMx*a^35JTN;0Sm)ffFDC(?)H^Ku1y`!kQPZWU@t-bKl1_I=9|yj{R+b%Yh`g~ zM~GFuj;qX_<5dq0iyXj?{|oN)JNhXn+X}fp-%_qVu^hFPRvHl};%}fd$Bx0NA<0+3 z{?4kL(9WZ!p_*Dx^yMAVWTwGNG@*81g>E%%KCKttj*6n#OuLUJuBu!NVb(LMclN?s z6`{(J#H!A22_iXG@j?~-bfP!dk@`<*7!7oR1Y$yp-+}OU)Wjj;DC?;^)7NID<+u5%zh`1>PSv{_OwC_MOS3Tg&${X zm{jQBQ~lbeuftnLj^8eyxJc3_1a-J@!%;k9xVE zk@{-6x-B>N<412cvTj1+(f)lKTubQ%mZtW$YfnVFMym|@-HVGuUzTaZPe@sBnIOpS zH4n)4GPL9Hk^-05e>gk)lGP zF|E{yI3a7mxf!ZP=;lJLZN>kau5R3Kh1jC$LTs$XrH>>7_8^~hV`HU1bMt~=F3N0; z3Gc89*L?KElJW^woI;9>W+kkqW0Iesswp>Ja(9jA;DuIEm66pLJDeK4sDRUN+tHUl?hAODKhH?- zNhlgUyv0uSMz$}|2d{qdBO{B+(63_w+j_d9SyACc98YB8`KWhr^_|}-o11+*Cb!+i z|6X$K9&Y(pG_elZK3y+srPL8qo zYfOaUm3^|ygls!|^X2DKev%&tycPw{fzU21@W?h}<`_bEP^6N4-DP_4I$P;VD3%jKW ztY?0vmi`*{17DFab(W~8o~y{S{%*V?3Jk81zp9FhPxvbO?}7`izr@zeTQNvklu zRcl*&DNOWMV~~@dYsF)eNnmwY9__NyQtbv3!m>1GLFbweN%)G|7NDs0N$<(GtHLI>V7T)dcYmr z9x1&XnB?+@)3u`>scC}P@}Bt^KmTJe;8(t(SWZqN+r zml6|D<+=WI%F}ETPcmWXM_SzFD9akt)`KY*hU*YgQg+KVQggc2g$7dFT7mWRv3xqo z>VUSSOtRYU5r3}ks37_D$H+n)+%hBa3d4}`eF-}gV~fgVlzQJU;SguF)(VLNDy^?p z_0;;+64WH|>2{C!rX1S?xoY(tEA&YD%yh-2oN5ek&>~v%^0_Q*eA~?)9%R)WL6jW8 z8#vpwJ;4cx;PN=9n008OROv}jps8tHZQ?EQ9%{HJx>XpAuJ7Ci^Sr!}QY*ZCx9|HM z$Okqtviy^VBG8Gth=wzSy96zDijp<5;UNOsuJczq9jYRhw&5&wE#!jNHc<`FpFwUP zmHn(ffVPj=eGO4B^-L`jg6q|`Ml~Rr$wTManhre=EqxYS4@CN+0!L4cO}c_^|Ab$n z?txv+hr#~dPg>&QJGdrPdsn9W zdqVQZTAO||D5eMmOU;>j1#p(+$upJKQ9dx^q1|BQ|0UC8X`!CGjdY68)@U90l~p8Q zlNpAOQ%gP0ANJ#=y$Iz?eEj8Vu-^lMR*LsDdI&feiUMf`4A zcTa0~>ykX2EUPutSyXGun4zI+y5f0SnZoQ_oyUESeKq>nv!&gZ?EE>Pl#374-PXNY zY4XW9{*&*iNc|a7(go^=v)J<6aY~Fh9iY_N44lo6o+d z8S!nEqJLDk2+Wu`f~-=gk!dE1P115RYR{)|N-5y2VF`pS1D$?=&Rg&&+5L<>!pvv~ zd;rJGp$f)|_EmS)XV?Dx!JggKLA7`m1N!Gn zmis-u`@g^bOB@(Iy&;&q`r;`Iv;>_0X$f`d!>>K;b02E)_kMOfn>aT_-v4fkjW)a6 z9QkyAjk^0c$#Oq51e@y2Pq}`c9m6yArNY`k7et>Fk86i5Ax82hbADptkF_xsg+Wvu zrBd03?Tx#G>tZs$66V*p$)apPt&-|24gM97gC`o$k*^14h_(T|X9j8B z0URmswo4tB3Sk1VjiMxtjaqttc?%q*79I3LdpFk? zB$VM|Q~I#xtk81oCsv%rTi>uMu@3vkw!U{qhIW0&VI{GQ-*!n8*a(9iJCW_&<#QH8rX4RY2wKrN>K`9Ak&bZrd!}9 zZS)(0j4AaDJhTP6%fK93$&|v|eXhhC(GCVn-3lXq`f^UI`ybs=eQgybdx>^YLNK;@ zUn+GiF1QN&kf|f>EHAFEv=QGR-UZHdmU$S0t~?b*gt#0M+=d=tsH?56(g`j+yxp}+ z{O7+X6%1`v^2ZFC=H2OMCLMMPLa!|^d**7{z|2{;d60dU+Enc%?LWXZuU}L{w)r0I zcU-Pw{@h;5{rfxmZN0jlN6IR03Erlt^` zJb7bE_*YS$kaFTZH(8~y^;5ROeQD2kFjj4bY3Q%8XO#+CtVPhJg%)BmDtciZDBNkz z5lpT4Q$$CXjoS%?I|Hy;q%Eu6GaNA6?5C5-i5SdEs@ zi%q#Ag8d5WMe}#*XfRDYBpxe*jk#3-sT=qSDae(*FLB}>q4?t8MYH#j(3MZ9-_A!} zsmzyOEIFjZBiq$yGa~28@Xw1BK4jLAmO0dv!tM9SvTVs_$TDV15RXM;$?C$A(&Y^} zH(Flj3T@yiC3~hmS4wlYmQWguB$`SVP%G}XUc%M^_des#zYPZoQBX5VjhoSoP@BEzIK0U&iH&m~*Mvd!*yEXln3hPqgYc+ZgyTBdVJJ!n>#!(4pk+5Kgq2ULY+4c2BL`S_?`^GMM=Dt?b21 zG}_%FKYP{JMDttipF0ad-QYb_>Ltzj^g3?5U2X5dCEB*BRz%and3Ci(E&n43IId9& zUZoRYW>`_RP^-24Vd_QgcKUSCP79|FLiXD1xs3Ic>_PB+XAH#m=-0(6M?^lrgw1tb z&sXP3`~6)5#IJptqjiCU64i880OBK+{6C0KxU%X1T`gdQE{UoF>z*8Xyzjc7CPKYw0tNK!$kxmeTa}GmDy9;n*M0*8uE!hX2i!u11w1 z#*%1ISX@Z9^UWIqzk_S32nKDg z-d9-FJi>Hh1Xjb^D3eV7?hlT6duRIP;jkl$zUZ<@`l)KLWZ-CAHvAUa@3k|@NoS1% z_3y*VA$io9O(L)=*k#V2EgnXFVTpLcmq7>x9D5p z`8|8`bx54Q?YFN&CmQKkOImNO-jR4=Mb&#or57`*_vQCMb?__I#dGSuTZ*03pHSRb7C9xCrz%OtlzN(TOG zJ36{8PFiqX|9IZdI-3-zG|-hcutz-4gk#ce1L{aj&_|ZmK_#!x$bM0_1wTMWIVWza zHVR$DJ*<~Y^L@*5p7Rp|R@o#fEL`f;%)41QlQl9uU%!Nvca^=cuN279mf)2tls9~G|Mp@zSORaN ztC{b1&E&dnZ=wfAwsa=-KUm{&`%kLyx1BubkvFlG?rDJArz*1x5+++2W{JlbBr9!L zqBo00sJJ-6-Lcw_%HB__z^2I$1P}O=<^p1qA&E+p7pKb(xE9F!Ct8G=B z7TtKfv(2&xMQ;;*tG}|eU|SJw0h7%;O&OFx?)pWamA;b*DY2veB}x?@Ih3>QKyrml zVyq%?H9;W%II7Rei;nu8x~xW|is<~*nr9I9jw~uwFNrD|d@V9P*IjW|+|!IrgPlTT zA?dn|;(a#g$G{v)SG_v;|0c+jR-!WGQoft7#z6Q2j<(zUEbT=1(Gad2tk zJ{6fgWQ+pP;Qa!^ejTHaM$sVLaqQ&Gj3-khR9CoRngV%KNsm8lT;bYC0BQR}UZO+J zF5L$}?!L94Lhg3XB^Wr;JG%TbkG#=}hWD_|Xd}XS3|nk=3%^9F+%o}k6JNDX;ti$~ zDgTc$Y~u87gO{5OhO&iX-h2#>9|&!)yvaxM>QI-`t9nyO7(261(Px_btu2~e5r=5D zci-MEQU$zzx2w6Cxa-|je8Kq~?}*2Si){5S4?tHE z$N^rKOFn>X&2yieim@kc{Oim9beicuvB7^s;19(D!6$=_*7Ze2>qWY-G`@0JkY7W< z{g@_m*X6cc;MIj43&ay$-X$#yf6T6xIjlcPJJ#JpHvOC=dAxToElv^nF$k967D;VRNbh_ZN&|#t)yvsT&b?%I258? z7T%i0IQ%U{q)LP3#~^zKv^^+G&R@-+sFgz0#+4<+XCSh(DIP*G_Fd^$;Q;$zQCG*W z`%&J1Y2fv{hkwA-lPz6bmoRH+)%jARKqiu(Ok2fSlws~0(fqWqNS1oIdZR-9QvUn+ z7HTfCLQv^5_&1_#dF8DGoIg!jxh)HincB}20qKE~LW-!s z4_K{>4C`W)t@#h+*Z4&c#S%aM21tD}*=D8xk*n1kCqjNvoUtv6frlp}jGH~A)#{`* zIsfs${Ku|fTD(gzfiGzbOZMTXt=4?ROQ)$El3?UQ%i#i1=t_pK3-Q+Aog3xST{ZPR z%nI{@%6I-gH%uMkztUbCSn2^ek6LO;jE9~m?Y{$vP*I)Bq`F!s+q{Wd$?H4${o;Wo z%KE3aMmxqudFt1BDS=E%dn}SwQ46^W!Lpt zw6EO#&hn?co8xkZZA}`22I|QCI1=l)6wuQL6T-r?6viQhtlIh1twd~E8_!2Q!W<-C zNxV$n#Mb5x@glJmNfo7d^{!qdw`IqicQ(YuYzkqh)X1-qqR?ti-!Clu?3tsm{!ci! zj$>BR@WgLJIFdL+<=c9wKz7d2z2jI+C5L(~ZFdKq(SKgTJiBj*-U>jt`U zqoi`GR0;}1oUriP$~Uggmd(pvt+>$@q{o(IScO`-o$Flr^kIE24AI>$yAt$SBA5Q; zieZow+ljD)jD`8+tcvKpI&-nJ+8V^|!j1Z@S8j(2eF%wV$sX~?#@#9hDJXLp{kN~I zGpvR3{A^bFMie99uEj~=?4(m+2?N5AucCZ7cGzJg)-54xnV~-oqT+a-Jzjf>JE3gb z?PMw+LuwoMrR+@sJA30)5s{5P45Q>ZF#G<$2`Exk7{1 zYUlNJ0%lhU^VEBs@BYQM*nF{)v*tO##Zb*KNy%|RO1Gn+2PzPjlZuoXmQPJ5Xh7Vu z@B2^%T`u)eujJ)wHfMln_Q#{H`<`{*Re#KSc=(l_VvG=|k-`$UHQ4Tdco>^EG4w9I z+*(iuA8ozs_sOLNj&GNw;aLJqI7hLs7WP6kXllt zi-52taX%H6NYa6#J%eFZqM;(Soq4N*K`N&pRx*)sheup?byrk5Fw<^Sl$lbsF}EI; zr{VKr*~{nwHFLjb^>mu7SGRKc?IX-5?*euzj2eCk+B!^qiP=fw8&XOZ2`i< ze8cIDdIl$7HAM#u}bdKs-Y`~*M(OI2XUtW zZF`Ny?_LDsZx|Me8TV_o^^cMsOWw33==SJoMaAQlT(sRbTRd_$d{4#s<;U#futV8Y z@6c)zFOwaosc(4Qvd-}X!({#ot-FT{Curhb_tWAafWRnZGi_7qhRfP$BX((PJQCZw zS2W2tS-w(VcP8eP3UaZ+?cVG&)0K(MP3qi7?8TWZE1tIm6UHpk)OQ?7u-RCdeNwbB z{$#c(@jNZ<#jGz&%=v6*o=zTlqnx$T@SxuA)61WYhpR6nBqgQ)8@|~PS*(jMA(9VpU^tQo1w8Zw zh&#`O1GS`5yv!;B-aq7M$g$7u5wxyWFg=knE?Oj1Sc$;jS5cMpJB3l2!a~3w!ENJS zKhvKk9%@cr`5*iGHQ_3*78FhHf-e`mIh5g;YR)egi8!yeZCYko3M7q|3J-k_d?qU` zT#3yYRo)R=G<_FZh+GPaBR$VR4l#)9$m$m74PCnI&wd+a!1+~reNd|MWpprO>fAwI`v1SYum5Y2aKX_P)R_)?Osm@0h@(O#ePq(ht36LA2 z(DRB;%Pbd{);*OZZYKW@nwaF%5owL*E&kveC%I?gDAQoZW^=?5CJ9yf)s_xiM#%NjIwkJ`ka1b3-T@i_NUycM$#!FP zT4b}W4&I)dpg2;+3gwFfGp@~*3!U8HN*&F{e!SF>?FJN3{gft-g{Sx;&3@` zIsb^kKQ!L-#|-z|T3o&t@~18exj*}GfZA0^R__+k*QYdYD^x!k;6sPYSt$8-O*8P| zt}xo!=Sl&>5oAZxInG7%Yg3c;MzXSh)XUqFMm~BJJeKs?j8xutvhw8u7$#s8r7;}S z-da-W6~s=$VF?k<->-TkW{iOHPYG#}GS!@_Cz)Z@R?aMnFid1qe=eXEch1}8QT8TLr^4;}G}dMBaq zK5Z>d0S0{>vlLkhtah`-YIrR&NHWW>OzGGYX6$TnxJlp^78UUtClX(z^4HE|(Fr`= z2|PH!wx*fa<2ArJW3gxJy1fkl{M(@g;#MWAOgqAWD+IhBz2p(ymQUe0l@3{x+++(H zwm->_N!juFo5(j0o#v_kV1td{n28kZPZ2)6NE$7Lf&gP#dc@D4NG z3x-Za)RYBhFseDGu+Xb;w1C=$WYG!pQY0#R2emz`C)>#Cf|B@>vz*%bf0SGxd9xM| zo2$h8e;C)`dkpG+7l5rbCANz}8#_6eOYZ+Wc$(FesDE?k*Ps_-A2<$RbIr|zU*^f0 z2LA24jJ=e*-Dx8*3%vOUpFNsNn94O%o68b}da$#0i-+IZnd%V;!aK9Z)r>!|;hyyJ z0?t0;~Xkxi}nL7`;Tpa&!$$&?BX!i-H!!#zcuSl=sr2!CB!^Pa}` zp|E%87v1iC#<+*|SDOW_cY@V+?>{Dfi*#$8UZ@8A84|9!( zw*^kz@j-FydxkvPou)Xv4vboYHf7bc@{6L`hQ$cE{0A#dn+q3#5nkk3e)_sB`lJ&Z z%Z;<=%nh53a4FL;qrXjfu@@qTysM=TqN_llLUnP9$?+v0qiIX5rua<9(wZ00|il>rdjPY3g61Eb9yYwz^e&{*MA2^N-T2O^4;i8owFPIAkc(jB_a$G_g@x zvSiCOkcG}C^@q6djEAA7xH6ocpD_^Tlut`6ywUEu*I%8ZC5LDtIkf#PFEcv@xfm>M z4qVxN64mGD2}YtWly-7w5mQRfbthfJF-9x_i7bNDmRGm83zux`PrUDs>NyIZ!u3j< zNNc-}K8@dH+(B;{$5>QV&kN0ps+`_(?E-423Awvu#94iMt6s z?-OirTmS!xa1yGQk2wm(g^8c|3{!O#Ikt8LEK2)bOk8(V%YM2$q{#~kzAvB3TlG7e zuMZ#CEh|Bg@zs6ZMjg>jPO z^Op0gxYrxYOHUJ?C1JJBVG}m2mc6tOUq?E6aN7${m$1J7`HNe}BebzyzVg58qZ=v| z^#f33kc<~mju(9Zs?OTzH}3z~4q#W;g9lqcKFx4MXo!C@?EDCujv=5Yuh}dBbkr`% zH#8n6)7*vWm|)x6Y>8@8 zBXScok#iyWK7~n8p(wr~nM@5Egw-SMD?f#CV|^gDQl)}^(2)K*I4N{opBOc$qdG4LIFPT z9c#AivuK8_E!oNGrjzF&<#;2mYmUSyR9LX>K3GY99(}J^i;B;O8+i3fz5$S%GiMhr31)=+W$@6U&#fZUo5)@14)bXe6&_}Kt`K0 zFtrW+->K~?@^f02(1f79Y0?kMvVnQd$J-s5;t1|9sbm9o@=s86b4zX{F#&|?Msv$3+t-d0n+nV<)magj6HDNvVC;W{6>5~p@&BbhkK#ASsP zwI!D}O@t4Qk3qM~AZ@BJzb-fO+w!iQ?O?*op#{;Rs;+5W^e=39n7LcXd-OxKDp^Ed zih@IYnG3H!u`7*p8|ikS%-yjGW)^tgPCtIZk^*6cYw_>6Dh2LQW^ zA^uTYm*AMjk@;UVE*AFLijXz4p{O__vl}PP9qFOT4=ABG|E{d$GP3HxF{GtJk1t;6 z*p(rb)`0W9Jgl4iMpJ>ovn2E)XK>s9 z+#$Tr70UKS@L5#RCG+0^x7)WBBr z_?N=lO4C$lOiOyurhl!L7UbH$DHPe56l>soEMcoqNo{%Gx6Jp(4?t<*!H9GR|KbXqot7bI3eT+j6%Gc8QSTB*#KWt{ZfNG)o0D5`-2e%RS+ zxos5#fl6amenu|{ZqTu&F@H*kSw#6xT1rMQYz0|Pc|*L(CJ=VTC?9SBw%p&31H84~ z{s0j)OD_9wt^N`fe4m&yvf%`>Q+^gn@zeJZ)$)Hm8$oP8oF?dwNh5F^7tSZNQ7wL* z{`Z(_;I*^Kp~-x=+2?u~gxQQ`(Cn1TE*ByGN@qpP!+}3&SZyrjKZlD96B(2cWJ`+0 z_BUl6^8lb2>1~QIZ&tlz!QYQ{+WuvxNmaMu@E`jb(W=;UY`h%DgObdHXk%1?Z7@nH zVNr@d#TGbmJe(Sp)t%lt%cppPh*{&Mxs&X$XB|F=hf4rk4Ba zoF7JP1X-p*WDQTJ-Du>5Hk-(AOYy`khmeAI{cLB%oDUB`%e;v%x3|yP>vYDZcPAI@Ob(f0!23(JaXk$X`a}>gND1h8Y>EnrpCk zpI~#-ng3kT{@>+!J577(;_IE_G}-Ah1bo|U_CORr({l5}G!I^%cEEw_DontKSMmD# z@Hw=h(?jlKW@pg5(AK%*gg7j;6#u6pAr(#N&X%sR3|Cc%3 zwByxQ;Vl@J=LsK#R_wm+NOSG*YY#ZWR8PwOJL_{r-QG+kuHM|Nzu~Z((yMnY6bk*i z-45cw4`IkNCJ`$=AAcqFiyAv~Sc~fUmmmDcUdGyk4oUCQRvzv}`wNI?M=Q6J z5Q&3YalOB3bH=vEBicy*&^ZVlE~^-zi6AX};}Z4-0J~1j+(M#!1$h+iQ+0;L>HBp% zov4sJ)U@jMu(NsyT%PC3(iR=20h@C6#~fois#zd0b9O%~QAgSOW|4d9jfiR~__j*` zX;AT`KVfQ=7kTJV>8Y@?CgItjS9E)B^o4_2FlI=xs}!;^ly)>LBRr+0MKyb*Sg_F1 zeR~i&13}(J*CNGU8Z#aGY3#-|KAqS5giN70tk;q&p1F~wH8gu`rZ$w+0H}LjDMiB{ zUo(F}$<5_L{S_~+^QcPH=VkhfwAxJPC-v{K3GdhoQuV75tWUBgY$v3S+E35&?yvIX zI)TX4uE(#AV`3&hzqL%wi~OHjQZ%!Z#XavYatj|TMgxsUt}Ez1 zg}f^W6Pwu8b+zACzkVM1eTSVAZ;JLQ*6R>RTb{r=k%RkloNihICo`_8F>L?jpTnN~ zJ>3#Gvl|h5TJ{BDj+dW>br`m~K(eFd~e#O=Gt3Ce8yh?4-{+f!&sy3;`#OOb1|`$s3=4 z6t#7&sMK9?QmeS@Y$`llhgkJbv78vkH%h=YP*qy13mi6PW|^HQTy!%Cfo#R|t}h45 z%iFTPPF82jwSPKqZ8|*D$DUUixBOt1_H#R4M%`VE0oD<*U}*`7E5>e5dZm{)71sZE zcoL#2WSEQ*#L~6@tn_gbKSarNB9Kkp^iT&-b_K^AJsnoKJB^kWRK8;LDC&c3vOVx~e{=H%Z;X2F3p28NdIqL%I`>ZCc)=A$KL`B!N~z)rZkfOgG#s*P zY>($CGupDozJ&k&lc^CUEsj0iyJ-Td@JzxF}4%eEoALtXn|>#1t+Yw)k?IO`uxjz3hGVg5D$gy z5agEH=?!VzgT*4*(g3Tg8%>^eWzGi0l7l8SGb1aE0PXiZ1jPC+9Sm7}RO^9J*<`{iOX&f&DonA31J@F^R(q76n$S{jL<3WUJ3;vl^g1730nVK2yUY9A z`}2RdfGB(iUTGA(^*#8FGB*g2TG5UCzr4ey9s9G#9Ff37rRUV@>pt98;WGH2&(+`T zsXV!xSr*ygzax2_0jF)%d1eNk6~%?(6e-S=P;p!$w@3VJ7NulP@|EcY__R2bjEdI7 zvDgCz^12& z;r+A31-GbgQUM1)eggH&v|rP!(F6@!rr>(BO4dP5pD z@3ZWKoZ$kdj?^z{-?FA3AIBg{t&FK3#TA+lHD?3jxgKbI7DXm{DJ}*JJEvbhJvPm& zt0nVLi-%iHVx}N6oUYw9Q;RG~#yRzlDin4!HWih6{2|UZo+xr`TQZ)8eC|BRc1A z70t3UScFu}q**q{5i4!)>HJ@f6n{g7OZ=J0RqFNn^<{rF86AX4CA7Q=GG&66AAeeimw5L-!``@R z882;GVurvu*f{`tqXUL33jX^oYdBC5KlPcc;A(fNqaYlINqK6is9++J6IGsk{Or4r zlzZMyHY2nF#iUg-huW}-TK}l}M$p?FdMf)!LB_SHXfMBsNH2Gc zBu`5d3gsce3L4x8GrB0tiW*LmHd)vJI7vA}k%?N$*M>Y6(ck(;gpvr~iw_h5Qdq(I z&JH<{Gmt^}xG}5bXg%MMjiJwyA2y@VazfoIk3U6a*LQf$2~mxImXZ|v-BSMjMdiLW z+b1F76wNXmAN!9BbMDEppp_45#@S2!yYA|KN2>&N0m>43+T?M}MJ7G23jRVd^(*b_ z{7fnPYg5_X z7eGk(A2j*Pw z1|Z_*0ZV6-^vmWNOO+to0Gjf9c9tV?U>H~ZRE_k^*0e-lDq9B}p^^6Yr~T=3z4gUi*} z<0_XiKV)K>_ZXk53}2#YeM!jalkRJj<2K#(MYtmDx92r3%QPI}RTB?&n_}Kk zek3olmiJ90NG3q}IF>+WIHyS|M~tXb(p`Z+ zvFzC92uNbK!&%zgi5ou!%2flv#p?!;%E)Dq#h zcE*GjSsOX)RwLUs`o$8oHdv)MFQ4gbV}6x+6J(uEORo2Q1rBG_PLVZwl<(`6Fq%aH zHk5i)N$xxJavwjiEnribn{#8^g;{;C6Rh05?~>-}(GO*@Ca_cbzIYU`G-$L#z>{WpE#>tGf9PwQeu*@*JXoJ|{Pw=+sGr9L(66mzrVYWU ztH86fCC8*1xhC#m&$|KUoV*8zBBUeOAMXjx`Fmzd2e_8VEY6fGAac-l+#cm7=VT3B z9(5`2B?81YB3r>?-tlju;g>9rR-t2Bt3i8HtAX;f+?MyGl_ovq>2eK~*Qh^rFetO$rZp z>uc_NC_1dv$F}gHLhse@V&N#^;5yVjb}Y`^h4;o%susH+S!R{HDF@6Peh9|90h~I= zr9m0xCI5l!bE2Nj(60Uq=HK!D2zbgciA@T#EU-e!nN)s|{B&50qL5$0sef6D80z2(LG`(R zW1yt;j?^qpDc#a>^;Gc$rI6YA23vF%gQ=cZt3XA1O)e1DRTe zd^_uu>GZ?%mUJH?*y~07ug-Skb@OUWJon{`kjH6`nffL!BPEc!S_-IQ-6PA#rKWrV z*RCH+qB}7NAV3{_*?sAGz4V@pjw>{G``i(vO)#B%EH?dhT=z+#+&``izzzs6{gnAm z;ul*2XIhD^R%`K1RJTk8cNqSBS1$a5J3I*AeKmI-hW@^d7RceQH|}*@5bXXcZXr6R zO7$6}%kfm7v4^B}u!j}crol3;Ye02!P(E0M_!W|XHiCS*x>}TD z+#d|r6Lo;CSX~_VTbDe=WU`~oz+JGOw_?rfVvTh3DV#bBH(YgwwwUBkj*FG=v=ENdx!z4`SqVlnf>w!)tjx$Uj{lJ?yCt6Iyne5O^v}QXQ`fcqxuIW( zw}oQp5oY0^fPh;A7Vj>6zvF5*_M7x6+(hejP{4f|;&qb{o4zAhY7a3~{dZ*M&@=e(J%yq|pug8!5fj(xjj&iRx$m zTLkSyaO!EK*-Vkrogca>uV>3PDbWs*DQ2H0UDXi8N0No)QNHxH_milBkOLqk#6OLf zk(clL`STX=5jE^G0eraZ9PfrQj;6F=N4>8-COqz2g_xuh48lD@4y+b5bKoJO!?v`$-w68TvIqk3~aT-*UB1m$SUnL6a>_n>~W&`bPGxIKSA=+<+s1 z8arI}<8SGvRNQ_1|8Dc?2Y#W`Tgt{j7v=i+ENu!q$B{+_NVn7sjRlT|@|qRh z75F=sfr(IXhu-)d{52;xY#U)DL4uD9jyiPDa0GEX0gVYAXydKdMQ!Hj(4 zF~M8M!J}L95g7(<$e|%rrqIcvSy~GrKO(8V=K(r zmTe_FUH)6;&@0VCK3~<;N%Hn>`~@ODP&%A^@8d7iGBgdP@2w?z8Yo}k0r4X#=X%&- zGz!l6ZCX_}eI?J4G!0q&=(0X6s6%F>K_&+wG28e!sD**8Hy!V8Run-`~R!b@O}8k_n+~pR^|%2TK{Y;^(*_s)#0VQ+p@!DG4F(&9&=zp zplxapQ43dNF5HT6P=jfcc+-y(EMtTuV6B-Ez7;Xc%7Z|*L(*X3Ox^L;-pk=hs;$U}2(&7A9ao;JYX%Y`&gP0Z_WsLf;Q>wG1m!z8rc$hgvc zFMwbk&ZD#uTpL9U+tSP1P4g; zfVgXE-~gR69pu147AUucX=AEdms_kGRi5Zu^lg(X_ZvuxZT)1PTy-CqRUWPFFQLfp zyIZW)OM6i274z6wuB0jSLNEkoFpT;P23tb~oX-ysmIXrFacMipcBd`)lhX;G@=h@s zIlIvLX6(YB2kzc@MPgqlwrG)QQh}H{9(NR;vG1!DGE-lUzDzBzIYj*0(ukD4wji>q zjX$WsuF@~XFOQpb=$(x~=C_;ecNCfq5s#*^X;pQ$z{I`CfiGHoxY730VDG$q5{DDa zoKwugmr#KVn*h!ys-f4R0l@YEX-^>3?0C+7y&nE|>mLG1bhsW^qDnz`wgD+=-1t8O z%=)MDpFDQ$vt%aqw$=5f=-AF~h$mMVejzCkg8$n=#(nkkSQ_zn<4;D`ctyF%ai^7U z<}v@UYNDni=@vtDglJj@Tjg-?B7MuPWM4a8qH*7J`@~Ozy~ISU@aGIg?DvJ>O@t4d z;LLs;F7Q|r6KE~-76SoKk9L`9KVp%oq0?l8qF2ZKF8kj28@eeq@ThROr@pZ8$Amki6{>I!H06Gem|P>(i)mN zNaD4EB;wGpnpIa1ySybgYp4SRd`?OrFe;+O)nb|^tKu&YK!xbJ znmJ(e{`*t9`+W2%AVuPVujZ+0BRe20o&PU6vFWL=Z{RDMuY9aI>o@P_WecnJ1c(-N z1&~MKf4@mP0syVQKTsmqN0%w3t2J+=N*{}5Nc8eMvZ<5jMLH9V5wmWSUM$d)GMo9l z0WuZFq;EIfN0vukZ83m~3Fx!+BPJ*GRLV&Kj-35kbrAiGRkEg_{!T!z#EaQt|78_( z-uv~hvLdr7@SsUP2VnvrPVs)C3~U^$o@aY^ytdNP>PN24=kdCq+qw&EYOWDPQ4;C) zZ+43w0*}yEwoYj_(_O%#1^m`H8-E(nUfqwQsdtxR;UxMwj;70kZ z)GK%kCYj7H!!1H2TPmAzjdIN?sHqqJMSa(|ebvIt4ve_5d5763{FQLRuW@}bg>tFB z$@pgJQ}63FI=91Xy`cl+>3piQ6cKzKd}?3fb^1GC8rT3F#yJf@6W>_@;t!G|95~!t z(*Iz)@eDan?iarGpC^pty+hYelSoIwaV0lB&z)CYlP#GnqoyLN@|{{$*}>xINt>Mr}^9W7avcw zI^8P*sX5=TDzxXgXQ+PvF4#0%qo{+P!gRoN5l9M3JuO@JL%zuFt%Q>{K&jo+NGM_{ zX)?=B*k(t4D>tYrr}$W6sCLlLrJl`yz$oSl+;b!RN_Tj5$40HP5zd&byUM^u?!0QnDIV#M_UgtD zjLs6;;&%(&2KIOOS_$4KWJk8EidsyTXz}Cmi-G)k0J_*|axDs2ajn_7tun_3nWSaIW z;E}UEx0Q-1(ix!to6g=1#dw_-SLeaoZRkgIG~8{S!S`KSJk(+)y7(PF7bs>rI&~jR zz6L`OchWIPCnNM3rNCjhnj;z$`Y=0l5d;s#8kfKxi5Bp95hW z5c8HD79TSv7^SVCF*k)6w&)a8amim>|2bH%vFtp?WQ`vx;Eonf54(fIS|3#myG$h{ zX9x~!Y;=lR-}Iw;$ws7>GdK71RlZMTG8H*E?Pd_!o7S~0e?Q(r63vuKct+H;(4fHs zYRC{Dz}&Z3=pt3NC;6aD87k>iPmm1=8n(m2KjazPau3&KQO)8K@j^kITyf;QiGEBk9ToW zZ^MGbp`!8of5O(<=Tryt-4|z2($Bc+{bR){mQuQ1)`TCI@Yj9U)vsiEc%zWOWk4nH zik})OW2@Am`_VKNSd(tOm=GGe+a26wc-yJCno4Lwq8BV>`)KNv^dH;84N!!bz;Fz?Ju$ia+k_;$u zzi|CKyGJ6}4>4k-GmkX>uKd2T=>Rg{>d%7mhvVtE z^Dn0qFQ>NujXmFHDh#i`vWCzWa#=2%;tyC zzen*i-wwOOuxmLY`OBBTrk+Y`7vysbjqj;=q(?9aI^M0XROM4Aw*d9EIE@mMktnUH z0=F7QB!~3)k<`oTolYMDiJo_eP%<6xqqm7MbitQZGdCK> z=XT>QelJP+F*LppaOSlIdJ)ZbLdszL_lZz;nfGS5z!T2dx+08`5PuzqR&bY8^O{{9H3jpb0Y zzG?i51kNpacfX;fhD-6um98o9u60+ZjX~sWPpQiT3ml0IORxXj&5$m_8w|&~sb#Qz z84kmJbviwbow4q>2wB$E#Qp`k;ar*sw{xoj+8?eo99R1E`eGa~WxCE)Up^=Q!x=$> z)TQda|G!++g~+>-FS12z^-pG}AC}MIS}pcWw@Y(c#w^`d6kwg9f4_as@`T}M=vufG zg9A1f*0UOd`F$7Y*VF5w?AHW=z}-+&jUQuggg&xY2Jo8`QmZuPx4FNHO{SXfDcI_L zuKa+4KSxU2gQ)yYdZs8>8|l!;_#ao_1&BNegnHx5tooEHPbcoO_K<+89IO8fXQZ{O zOnqHeudaQop&y(=dh^7Mzzc<3eN5&X2o+??)@+6|mk6y14KoB;TM4ges}1UY?QuPU zKZ|(TPSmd2NYiFD^*!YG)9X8ZH6l_U$O$Z^G4&{7X*cCE^8@ej?m!h=Sfz6|*V!xT zugJv~p>1s+e6L2C#~dk$r+D-iQ0D+BMA~z)^iulF0534BaXZf6c3Hub;p5_Wb^>Z* z_b4JFKej=J8++{tV#dgyYr{9W8{6#ny{|+2tUM@-Xx@TrMVl3Y?b%HygKFmI))`)i z7~rYl7PqnCf|)g1sgXbRZi(rqwq!idYKhHBHl`#R+7GVE{^y0?p8 zF??!iQnsqM8-~zd(tBiU>!%i8eA1=<@%j(cTMWrlynj_V%o6LfTdl~V&$3i|h~ zept(^>-eXobX>6Wlaj1cy#$nN~Q%ztJl;$*Qnei1Pq>4(z^W&=`#^hR1OqKF!9spOxfwc z`h+0qc-+S5(M!{`7Hs}8-i?qrI?30TQH#T-HwEs>)t*Oo+FT$UYfx(n1o`-cb%d8; z;e-sYhh6V>4K&Y5lHT53O*TI9PR`&_Sw({%dj)_NID8!CTVj9dx8)AO1)IWyxkvcZ>ayEbS!o z^@2-v3t=ie!|ok)d&|vjL7|-RLq+D~;*)bMtq>#O1WakJMu3qw1^h$9+7YKm=X+Oxg)hET zv2x}73hn5rc#b`pP2v`=&h0kRsvy}k%hXg7B_+@%G;_3~N8zkRBgsZGDaiSH9@Bz- zHll8iQ?G62Mv5sxi56p?i>|aXd^sI)_aiF4+xSwb@vfQA;OSOB)5$!lU7Vfz31D3T zq^aPYcTp-t&)myM+IpS{>+arVH&J$QwQ6@6b`j-`NDKfs0#d@PTuXG@dkTja>mN)v zfb4k{3$a!1Z8q{;Hpk70Z!!&ROS+7;bQ?ms5?r~Yl$K#mXI$8y3MVf(UbH%@YIt)$kid7mUYst4#+oHZq{z(7=GjBT_65kgJYL z7TJiLVO;sD)~PE@b~Kzxy))@=AZuAs?ZE0x-|BeWdP%?c85|Jjchc0~a(ku#W`(F3 zg(_V^=mW`%xLh##H_zM6M6bO$j*{X7}nTBzIa=Jq17bU)Z!9ak^Ei7-Ck zCJGVDxm^7Pk)nBv=!E(q)bsVj`*H3C-fL)#00(|Wy2N(fQH>+6vBh(wC_mK(3j{C? za3nor+`*`-uI(jJDr~m7;3A=@20-AP7EXIH%ekJb!XIPZ`>!qOH{8++jZ{RNRi<<=5&3vP)u+pE<=T_VYyj z=~pvXtLCz%`-J@}!zU#LJx8b}P>#t2%MmXdve_i2?s`mC&6S*zKcu3vu*fiRrAb5V z-ykOSig0!5iflRc71@aH@On*E@3xZ$sZkA|Y-MDTA?U|OI)rg8jlq;G)W*}?N3i;W zrrlJu<|Ar<(}D-t^t57Bf9$4{afbvuBaThs%vqhFRE!3I?3vW;-`GTHAS5!>4u<}A2Ecunc} z6}Ozlg*?1o%)HJq(@60QC>9bpy%%*M+BgsFTVa~VKQWD;;WV<_-L=L_e0S6 zrBKfL>8GH}^Qj~}5IBJSo!MUP#&0^Vq7*~g5&l;;zMYRe9n7*m&__`WeNZAu6aC}( zJ>oejkw-7F%=+3Ih=pE0n!b&oJt(p>JHnSR-YxQ-IAE+usK_wB7>P00t+l?%x*ro` z)#cpc=0W9Eeu)_VJTFBfs+&IOX0AmIy6pvGU?)zDd+;zg`pJjCZ8TLARz$M0(MZyw z41!T&QEMxYx7&lq%dfVZS6cZlqW(;y;!Nnd8pViPLb979X7hF)Eib^lTIe=RT7I%G znh7^jbxk^UieDsx!Was3CDf2Z`NRQmw*k=}rL z*+H{{eU0U;V&)^o15W{xK#~(a`Yh|evUk+rO>aHo$w8*)PhQi0q~WaA&f#Dg zM=t>}gfni~@kySDA|Bi8SP%-32XwmIgy;4_dK;8p_*4?Ctcq|EqlX zBf2(i2oLeDQPxzbq;6KOzKf;Uy%K`^_gz?^F9h697@90T!6ogQBZM<2)SL6Wh=o~? zGJcs`on5gHGK3K?a0+_qba%?nlScyDnQxrAhvf_a_8VP~xV z+dT(4RaMK=GcV_rEi40_Y<`gWzIbn3fBLm=0h5z})sAZ-@{bHyX0LH1lC)+f{@kj7 zz17F}C9JDs4f)FJu#fu9mKM4JvzePSNHxO7F&n03Ugm_4r{RD~`ym9U4b&rl1kfVc z79rNCY#)NG6gZh13jo5QPOjrT98Et_)}2FwgYZh8U&eG1tUR{}edD+2Quw>w1XJC8 zDcg~5|eNWbZi%mxsD*G z>x{af`#Tk-HFP#XXH6pd!Wkl&inBHFR4QM#rQki>DoS3RUyzv!U^T#eeDoAT|Nj0S zevx|pQ>Ug2yBM#M;K^!B#ruwRljT3(P=W47?3M|U$@3DX`u0gOtzuf~931jjW$^lW z7CHoIID?^o%;_A!fMQy?)b8+r^$WkCWkJ#Je^ocm( zgYf~HTSJ6gt}>tdg+qe2z`>F<975cD#?287fbb_UOD&s#UDPZ1aOF}5ASrUoY+I`F zkIQWPh<`|4Y3sK7&(1~sX-qPUMw#EP=&j^CTD#A5B4ZUC!^e9m#|=p#0CVX;;p&z5 zAs{Gpou3-6c4B`mBz^9;k&ShbbtD;oO(Ag3luWFIA#@aKwHHnL2v5l#{s6QLu8{Mk zEzna10nH3O!L#a7(~|54&>^4*%*l?ZoFi>^LKQ=3>%}a1n;uH08`#H17Mj^X^x%8pbHbT07_C3!4aRIhYK$l=`SJ9BcY&kl_#m&?v^Wczm`W-oKKKCrVsIgi?ZDjYH-EBRPiTV`eWBqDz(xc`S%;_w12Nle!*9s#1yL*q8ZZOE*VK7;qk%6 zc40A`nf4=cKa?dZvQ9VI^u6QujE2@)RE`k&Yww;oMd!#2j`uCqXiib*mdDTUSUWiO zg38zg7^6K9)l9F@$79PZ>I9p*3gwM(t0p>!lB2W8d3x5A zg~`CH&^&%~;CEBLZ;{#cdi8Y?5ZQQm{c1IA&m?ydc|aki08U^A+7zD_0A&?l4zj5` z2KwO}6IaiQF}BbLu$@b}6So^fj9;W@=wRcl@Dtcj5d^<+$v<>GkHePV_UCe=4(mwU z`}3y`5qP+A#C`pTyBh$-VY!n&{cWKCMG-;s1EM4O`Qp}pjG?zx5!0Q{5AC#o{k-HR zZ6ng!;73Yu)#|GY)NseDLU6!!$5WjH1>jlD5rI^A=3dr5YB$Q)DOQDyR+H2AvNBq& zO{An)QYA1iitkO7{+Zsq_2K?=hr2O@Y4)T$uLX$!dxbJTkupWhli9KjQayFG86{Un ziL6`Q#x|yAP6f1V1dFmB{ZGD<_$u&@5;{*KZ=6y#iq?!egYD6I6<}~VP%T%sLFgJ3 z`J{&Dm@3UEI-w^!XmB)EDbs%NXr#xC!v-#>%Pc!2?)gm!xbsjlT1qbk3;T=-Hw{3X zI{v6e4i^qwwt9_*>#maF;!g23-HVq(8?cOLDlX_nE1ks&al~KD@`LU7V~Wmo2Yi+So@Sa`bkQajWF`7oXD z82`hebEy@1An?Is*`Qmk2oi6^lHs|cy$J+^m>=_{pjBq>l)X_6}FdR+}CxC7-nj zoS{67J@_C_eN~ooavPjiS6?0qoBM;%DKp1U-;`r1_f=IzU9OJXKIV^|aft$h}*lp{`Y&+8TC*^(ohm!?*G#8fvc3C zt|6|rdOD^3oo8-=`$1lp5emOoF>r>s#QovW;Zh92Y`#DKyho8U>zXIPo1YlPvcME& z4>F;XpNS&)7xZ={jLY*O&s6>mL}KpOQw-TGel`2i|M$)$A7AyC(I`g~_;VT;ZwDl|$l@p9WjNEUyUxH1_E{3OO$H`crfp>5hkWHC6O}Ag`^jQ&`$Z>Q+2>A}6?~ zg&`>t?HPDt!%`N16u*CV9D61=oEFsqsDZHU?UqZ-rqo1}<2xyR>cGz)WrzoFtTTzf z#ZJve`?iF`ydFn^ywd3JzqZ-VHAwdV$&$d7@P~GfFk*80NqxY61RI&2I%9lG)xbq> zRAB8N2CFCRVR1a$^gTO7qcC}WSRP~_y%aYzaCF+#+Y*@|9Gg-5t7M^>&iSkYgoeXJ ziFdH4o|TH&^1#(&?)Q+1PLaNA*CB*gC0)^|x|Wx4DK{pCSRgEcJ)`Zyos>Rq}6Ib&@>L zBr2k*H2|I^WvQDk#!wdudu6MoHy&TfLFQ$|X9U@c^pq<^js0z^pwAlC%%L{OHAval zh&^T_MlvRLwJzmi=J`P?w`oGjm%0sEy6w*BDfe5}q+@L29jqq#p9dQ}em3m7MLjdN zd6d^YKxr353YJ++E0v?06RupyQ!=e>BAJGh`Gza{3!eP;nK z%tl>&4bHn${BqAMN!gcDRr7#~iF-9>^ z5y3Cfm7b+5KX8TK79B$}M%V@^OEyocI<0K(F#bT|5i!|A3P#u>-Zh$2?jI>Nr#cL2 z)Io2BusxhT_+4=tricx)TC6f%5kZIP5OjkNU<~azTge}?Xeiz~%THikNKkqJv&;8cz z;+G4J*g&&?syUSJw@b)J;H~a^strKg6Y}O@?%WSxwlGWlC6L!X(Cs=fN;nPKV;stQ z#9S|ZLLoHCGSraj4$;+GVAz{Vb4PHBcQ2V`*FWb3 zlgfp&_y>82jEvD{5Kvh09P~d4ob=hLneU9#%Jl0R7Ogsqp@m?6I%$m{+qSY5qg;ct zF&)FRdv;Fu6>HN^^izdfaMa6a*ORWn33`gVdzL^r*vcpE!Jym(R4Af=d#^E@& zakE~D-?IYJ!|F`uKv*WigHK!(402)=Fywb~Dbyz_cbOg~O{tt1q1UGNIl_qQz~bVzEyQ=F4tM`6OxqyW~xliBB%vaidUSM{3PR zQR(rw+d%O!ywA?W=8=#X|7hubN~YMvoE&dj@GE+i*7uHhluXegnKyH2wlv)~Rw6V? z%uc+{RzrvD6@DcD0|8@ix>j}eI(2pFL7I<85O;Oa@Z$He<{&6qeTJe&@CK1BUt{E@ z$KGk->o-ujoN+8!G%^$Unlp!uH3lRzo@+FQ`ODiyvZ!jMs>{BWdY9NMZkEH83{$H+ z_nO{@>^`1ea3&R2_%PGKza0#=;d!VJ$rK^Ih4O6_0ck7mf+J?QEunjygq5~9i{g~4 zI(pTF?-RZd;%emLY?i0fqUDQav^J$tJQn2xcWvwDp5&O6-e8CLaWu$IUm@Jpb;{i9 zz z@q2HC5K^k#5gPE!O6`g)vEvd80|TIk83!aaXMn6-e&_L++;zY@GUeJhb2AH2C)~t8 z44#KVfMU4+d_GYs8ox|#G!oirb(TM@nRTf*{=R#@ySH<(i9_yvLIhp;z|Q)Qlkke6 zK;9ScS>jBZ1b?}+nR_$z<7hTL+i)6Gm-fl6PV?gLN-{n>8OFagYj3sP zf1C8_bSSTIu#}#ch=onY7G%pq<5b0CKvV9j2CQ6^DQ2I4NEUfe^U%h;Y@K$v7xVRQ ztp*n8r4EUK!+7q|Xki4_-E$I&*a5BFz_l`ms&bRWrA>7-bE1Fpm2z4l!AKjy;~>EH zBA)&@(s?(=&`H4$b8q};ELwWFLHNLnTxCAq3HV8gm<6q4tx>@?h2~|NP}e95S8HsG zSC$fhbGvSS182M`-BnYWT?fuvj;XgJdY*Ce{g>MTH3>6kw$*1~U<02o z)hs~Oh5b&wX2MWe)DWG=H4b+l6pu}%`JR3`Ye}mr$M)sR#mVRFPgU!8fkV!koVj86 zSq}6#0;1gnw!0H@+8x0Ktz z1Vs+1bdhbzm|5s-^t^B}5(Jbvkrhd;{LlToiftFzOl_^!N2L- zZHWb@z!Xh0A!!vDwQDyil#uBtEB?00o=CJM)&}bzEbPYeoNRvt+KK_=y$&FiuG@08 z=GwxL^13B(?Hme+KM>>HQ=t?E0m5eqi?~gKIXt)-6EJ?fndqiw6TE(k(Vsl6qVm6H z{}sHqm>AqLW2*Ly%LuD%HOH+UsJKQBTHF~EXB6(^%rUU{duV67Esi(j z7M1ZfRbF#*P3rJk4DKSeU8<#BVx8>B@8$QLn@7;8!diFt7BQ<=x|DUc;6DUAx;hiO z`SjB?8E5$K*Icdx5M3X&f+D}TF?;fPQ%*79^1~JPbrrl8P#|`82(EK|zdByt2|s-K zlw0Pg1=b^&nK>zI$MN9$f&E2&Sib%_0zg#2noB{J_jN242M&I~HqSU2VdpAm=h;Cv@YOmmwK0VGQ1q3cA6AEa(TNl+^xw3UhT^CSXtV0#jN}K z3ZDwJpLO-(KAgLh!$~iD~=1|9_B^^T$aR409iq*gs^hnM|tAw!2BW=y{&_ zHN1;QC*gK}g~Cq%{ZyR~k5+B#jC(4;E{?Vg3&I1B;|~igP4lbXG!~Ux*^dQ%rwZti zS+ArK1(mSL07q#as65RVFu<%*9F`G(dz+C&{dqG;I-b7Gm^{UiJ~^6PRMZe4P)_sp zseFF$@Jn0~yZZ2$Kqf00*?@5T-5$tDbFJFbt&z6_HarP16vK3^*^ZJZQ36q)WKs2V zG>w!?B5;V=e%Y^~rq5Hg$iS}BSm#Uf)FIL%{{zXyYeIW#tAl@a+1ihKOtmRD9={P} zp=TqDCi0h?YT6}z!t)C$m*o!j_zQ=e)U`L;vmH-;t4S{5Gd>6?jSt~_hSBB-1Do;b zKXv)k8d8brk-DQaG@CXG3+fOL`1*~N)Na+JrDd+9iJzv-EC==ML(cf+7{PsBa&WUf z>*53zp}Koy1v>9@dX!67_b9hi_VXv$Z5L~k5Q|(f-8p}mVdT?V zoQG5R2f-EwHW34tTtxLS`Y{DAb&g;y?Z^^{9JXA<0HI@OX>5s`#GO!At#%#sM_3e8 zLHCn)buv<$HVp4?p2(dJ;v2k3D7hBI(vg`Cm z*_yZl$3*~>4^+fwcKU7~>;lmmw9es57yce{z9qRX>AM|o>C`TOELixzikPD$CVyqK znLYw9dT|4Ev{vyJ`Z3JDt*p9QWUm5k534fyULm4mIA@74G7HC^Ti5BUGScA#OAJ!3)7pKEEpE#4z!Y<7<^gm`B zvIstYXl-L>kgR%Me)mCF-xHDNNq7C)9*WUv?n>!L1WiGz7sBYSyB`39Sj5p~SV;)tf1dO{?Qdq?XdNy(qY;cCb++aqJ|7Q_|e*vaBIpup=$j=J17iTEiw#;sI6UyY+#e&J42RZcu`ceR(t#h@6bp+EO znLa)zsjp+XN~5K-d5G^jiU&$tl6En!XS#UYoBk8zP#jL8L^=avml6Z!4(ZO)JJ@Ls z9}yaUcd*jc0Z8&>sTLuarc^pQI>qthi=a&VQ{bhe_&?soc|Uno0>_u{t(?Dya<6 z$zaB|`#~SH-qz)c{Q`ZMtCt<-F={q1Qx~9zr?gH88}$(r52qay2E8mCRA(|?=ryA! z8tinbe&)`7q2_KaoLpMX>wILyIxNc?9f>T0!?75l!zE_5xFb;qx2DrTo-A^{FT@09 z&^l6vo9rgmpG9haP`RB@`dl%n3q+LJzDoWk=*CAZZf)(+%y_$H@R)gnIa`x@O=xJj z(;H%FVuKkRBchZj=esm^oAP8>hsCU z=yrfO^G^L(+~Zgx|AOe74#6uN^Rp#Mp)kb%BkC;M+KjfXjYIKL+^JC93&pLp6e;dr zT!K3UEv_x@F2#ccg1fr}30hnN#X|8nd!KWi_e1_c)|%@XbBudXnVX*eL(Nd7|0ZV4 zgrB`D)^>GQl1!rT+p%y+nsE?jAM>Kp>=?~_)Bl*aB1(yNeWEn$BU?%9aeSLiCQU`p zS)W8Ym0g30XR}j8Xg8AJxW8A~y~>0rc1Q9@tHe)*>2Y;TJZO%%y8;3wnR#)t?3{*c zbi4YG6qa9!2>xrm(D?qt2bBskhH-y&E08Aoxk@jd$pVs(&Ow31e89 zOpm+IJ)8cw<|S6_fO{C96ZpLRUNbLiqXW67Z>^0lK>DSxkOG20W5@kU;%Hg&%K0qd zY(OAuBJ=*{EUy#!)Xp<*^Mn^IJ0K!?!K0V{$RURDe>&qsRTz2ySJY4aRKe_VO6*4S zc;dBO^XIOR&Q{$jC(bD$uPNk@YqCOgpL?-+@|%v1Np4L7^0t|aY0&a<0h3f(4qS_D zhhV&-!hS#b@zrJ~`t;zNsZV{F_7r@xfD<*EH)(F$aqQmVu}IHQyy4EU9O|STUa(&C zKXM#Kf5Q_ERqU<27VBNQM8#@bXOdNYlX= zemM4!A#tjw)_TyekUCHMYOg-oxBX#`j)DEAM)*90r~v^$Aj8jet`?b3(zS4=E;<82W>CO4)Xil4k%ojHH9nxT0R0V*hFbpvKRcSr zhFWo1`09;*#*wIwfB8z9Bvgn=9P}W%_`P^)G4ayTW8j3S0T_t(Gq~f~0W?^K{ zFi+F^BF=hha^3&w6#lHLo0Yv0mT}nbTV9% z;Ghm-Z~6fxi6(8-9*kP#{Sn$Dq6|iQ*6`y&ZHZ8N2**~0*#rm4TJHwqcvCM*NXYjO z)W~Q%Ue%6p>V&YiJE2i_6UtZ+_fK9NYu+-BvBX`f=v5APZBoK{fF#xdIHtfdLl5a> z%&`g@M6~&dT`}f{w3Zq*ZX0D~x@TN)Ej8sK@KyZ_x6W>q#XPT6W28rNYd^|IDm(PO zD)J04>*MmCBY@S`^tT^;e^skXk0rAYqCvTmy(0JtP}<#^jeDt0zAGj`k@CETT7ndSB>zh|%M+#3KCv^ulkgJ4)1!L|;Y?zbdX zN{1$IRnuvX6h+SocH<7|&}8n95OWdUsdx7Q8!ems7>27!p$AmUE8q zgrk_l739x5!q zJigKOxyNVyf$S`5+gS8aMzS=@&ya8NlN_)0+nvcA(Lki!^sj~`nr#0+m)WQPf0-G@ z=##vcW5lc>b@}zfw}@Zs7~k~OI}g3;%~h>`>Q!}CDet(YHV;$I7yk&o7Y`q^woi96%7?>G?`iX&9*+(+%ii;z;w&ej&(#?R%V$1p-vv^F}Yrz7%Z?-;dB zkh)T5=QeW7G2Mn7UfX>Piubu+bY!;qK4=5(RM+llk3-Fn2BSqN5Jf{tWgMDJCws?+ zwSIR*hzdn6^Y1=t<(cTn2acb1`m-7YC`sPgf&fQ`r4j{vpn6un2!#ES-n$ZRtD9-T z@H<|p%00q_<80U2@DQXxEVltWhL8@As!t|yhxb;+el$>$QjDh6YeHU+dw@ii6Gd$9G#3u){CRmLRtQ~K_;hx5el%HY`DoDYd3S*n6LIv z?NWWB!PEImYso8@p@KhcDHvYzVmb&}tXWNvs0LV7s$PJ;N(0{u=5jS9E*zjl_MkS{ z^sqPO`X9a+EOC$6uctFX{*Cb`3cRlB1W7U9$O|BAA>;Htcy!3iP_z?E8weW7u(Vz3 zCbM|PFfJ6g{xeQ@iyh4O$=B?6vfZ2qJ^!SjJ>~|T2HgD3@s`I%m%owhce-{mI|X;b zT?T2V73g=aPn49QzYIiYO4cqZvmytXgG6l|D7;rX%>d61*y^J4=+{?Yhb7SA9@DZn zWyFIx`bha+4A0X@cTU9Eg#Au8cU7Z=>Hc z_&eBo0i}rq!9yHQU)y#X9v%04Hg9G+WYGFo#MPSh^C^mq@!BRr|I)f5e?w94p%ZaR1#S! zW`3VcH!BoyvdIJ-T0-PQ?qprZr)$CEwupJ>q212Q!q;O^}FH=P$egCMI@ z`yBOOWnq_st>Sgf2We=giCFFJANM|!PQ!Cwqw`X=Y=Q15)&Cfvqi&_6ma8zPP=2~u z#0tzY>oZ9CHaIA$%6}FagG}=A%B-tBvCUQqynn$(<^oY$wkjdaY|0d(@hDjtu3XSJ z?)YeAWMDL}qous4Q+c;?JGQ$puzYcZ{2iQ}{P}ybds`(^WDAsr{8A85aH*zxqm2Ky z`vn$G2>Q5xgy6YRwMMB+p+Mjkk8lH*gd?*nx*KxcGJf-wS1vb&SOonImNLey)$e*P zZLXK3jZqnj7;-C8t5BLWc`uvP>|2iI=aIFe_&nZ&oI3nK<>k*_b;XI&_LyJe&L_2y z34vg0ip>Gx-zcrJDIdWEWz(4y5cuW8m%Db;$nu)5lGuQ71KwlY#Y>OsO zl59yf@4u;y!O&PIruyR%(RszGsj*g*ZWSU=sy8-mx%u&a-e?Bhb`y*%ab;s2ZdT&9 z)rspNOG*|jW3EG&5g>vJq&GPqL8M^uoWC8G`**6q?)k6k!ZqO!q^xSD=uZsW4_@}d z?|yf-!IU_2T9$vPn!jrOteOCo@Qc{F85>-Im2s!$)~|`@@v?~apX$T}52h9T|y5EKG|$sEo4;h7O8P=hibF`4a44IMho%?RSK~gWa~7P zZRDg#iunrr-0keTgLG5swS`&#=-VqrlMEF1kDSwDf8kdu6^{Nb{0#_FOn@A&KJ@&6uZv_V1=>c z!2cb+u22;1UV8LkS5K_?Tn#N>Ktdj|CQM{L5EQ4HW_Qz0^>FRT&{*~SFd9~RSS3Hn zY=KzPIGQbrE{0&Cp%;-G>-)(hQSSx`6%wx7RTGRi5&eNz;#q8Q^8;V`wwz`8w}5{z zC#_*G5ttAU?;l6+t}Q#=hk3xI7s0BMw20%}KcHUsz$XjF#3n*!Yl=H2sj$VIxKRbY8w1j=RSC7s=usyIo+YN^G62fGJ{dmLfP3!~;WKHiSs{-EQV zL|>%KO2^A2OT+V#)JGjb2=CH->U@g(I-CkTg4<6?0OC^U3b~QlD_>cF@~-kB?0q%& zROe$|ZJZ?dR5hT4^r#i;I63w~&Z6Nwe4v#zJ4@lMw%Z#58XC z@}IPCKfc5*IW%+75CRN8R(-IJ&7qgZyHN@>!ZE1&Rtb?&d$iZWm(nLb<_LS&=E zYWn!6uC)dDOM*n^ZCu-)nl{PNDb2{pBrFR~A0yUIJ)LDMBeF`%4;xiS+rC9L+GBfA zE42-yTpcg+{e_%?tirb6DnES<8@;zhnXM-O0 zdp(`n^BiW?T&R0dRQs&{ z_>HbKlXIG2xzXI9FjvtMWq)=uTWZSvh4$GoU@_&M-8b(ZuSl+-zEsgnB66JfHTrfV zbT5HIJtU*c9c-TJA%fzTOGQ;a_7Oe(+}*x7s+zMz;8qIj$h83{%M@iFHsrU+9_e=Z zg{6d4FiV-D6IJR4`(N-gt5!j4`yGB8(CuQVHUcBt-95?lhJ~iw!G~y~?sj zkvYwsh<f~fnC(y_Bxj`~8@MeZWWnC-~)S_0qKvsJD>1)nd>C5^0>;cW~<;LFP>;qTr@;~xp zBZiunx9&d9A0E({ zV5h)0L{g!@6C3PYhrR}Td)L_|slrQTtq}Hx0zupgee<^5*+QXe}2~LSE*er?q zJ@ye}N;UEYa_?3^zVfdn+r^n=k12kb!>%+gg6^bG!q!HWLcIVcBg#Zx6?ht-=ZLq> z@#)Q?aBzWXP*Th^1!+N~RM3A6k-7Yp08I#jwda>zG&Sq}a6@=_Pjm=O7yhyQC zc2D^6OJ;DERC|!NsEbFN2;{}~uU-7t=EMr!;WyLz&CY>s>A3Q;8ppOTF2B6AGvB|< zt%WigKjUD1ISCs7DJ_#P8|MXpjiH)? z+;$}9&a-r7-kKsP2Si%I4}Hp$QD6LlB*8DHtsh%WeXt$&2+Vt2f<6t(E}A1NFRE+f zYT1B-L*Uv%(PY7^e+eM7gIfkyV~r_{`}sv|a#*afc0yqBO6%2q02OFLtIsa?fkriS#t(b^O;o;P3w+9HfDQ%oeF({TC0j zOTnn1lO5^8V$4#lBDjAvxqOoqVe$l`Qo`-aOq64{-i zuBtCfQqalhkPq4+pwuYNm{&?1jq%{mtF8#$zP{Tz+8P*HC>rRQIoa*ma#vHT*W#TJ zv>dVI9dS3tA>|ML&Xt&kUuepr5dNJlk%CrlvK!NuE8R+Jf>Kba4wI6r`vCLBlMID7 z>gGH2RD4}t#IyC;RM)%aIB}CJ8kCF-zcXsB5+4>l^{;FU%M!p-y|bLtCf{rB$L6j! zM=u70T+Zdx4^toDOz%k|Z_tSuBQfOnxJFX_`HPJ*zM=(pccU_3p*QZPa(1VZA32}j zqmJ$U)S|Cr7(yK_AfOchYM}P`Fr+kvM7C+k9*@G)C^N}T`=nsOIs>@< zT%T*g`nRu%7pbiix((gWT~YNM#0h04IP z)WvqX@^*DN1ib};i;BfT<8@hqpV~0wZ9{Jw_C@y`y$TLYzfH5rB2a>PBYiT(K$rOx z^dRH|#(tc_jh1c#^ikiGHxDu}gKYb~ad=C-M4~iSE+Dn_!E=$Nm+()N6aF^FAK(2z z-EA`tj#c|h2~R#R;xr?xptg@~j0x-2XY{wS0qTt0?_!ma(ilc#a`4g8C%%PccA=BH zM6=IQk#ypM=Oa<}_N?!VzXho-s=T9<-9_At6~z|_{08<}Mx3Fb9LIaqHH$v`0>vgp zWLIB1p8snYl(8in#HGw>7JgX~UGPDg_0x6^XuS%wENGOWfbC==vmq;BTpZJF10x5( zPL&h}WOc~jl1>{O-FQFjNS%?^>4s36KmG!2pi+fY%LcjOh^5W$m|EAYdK(fpY1NF= z^015$|D8bH{59F)^aqiLyB~ol*)~T0Z%SjhU)e*>i2my3N$v3G)j5gFFGkbgIU&o?UT0r&8YuB%zaKvf0c zz_@)0;pK9uQX2ZS_^|Yo2~#nSFVqo!4gY2Gv^N*w6!@@zFM0pBV`}5>DwO*yJD|wSlRKs}>s$+>8WH@#^JGr$t(3bv+MYWpTD%}fqf-C_IM`5xAAOw!=D-%Lfe zB5p`uO?^VEcuq6cT(qymP`F-)meu5>qlR@i`tl6wV^w*t*8d@oCJ5!Ug8r=ntoXnh z8%k~WVU`U`V&H4fWhg984OWujlnOt$>gWLLH46zH?;XM`AV3!o(ANV5=@2v6=+t#| zs?wPlv09+5PJ{V2I9}N`Xn`%eS(>R+)d>%NCd4Xsa-B3c%un^mp7+0-Rh1}4^GU4K z3X5Kqu}-NdcnGonprxvSU2DkT#OSuYzgZO%am>i&wx40YB!yBdI{P~RK(wIEddG3* z_b`o6`|P^#Rv6J#W!pFW`DS!L+wA*ar-_@xin_mC{vI{eId3uIq~Z%&#d-JzYxxCx zw1repqBaEs@TKV76`qsTxyEITBL3nwELYuh)U-L{M{5!Vu^#?4_7JJurupk!#4VLt z(ox-IMuBrEUaU7sk&p^3f>V zD^D%(OOhh)y;s4S<@>esex2_XZg&E&zls)D5*d3HoLZJ(q$+@;#UTK3%CgltPNAoV z7i7+Ttf-FB$WMpC8MVc|U!Qw=2yyM zBg{KQ>WVY&6%Bf^xkxG6ID_RWYU7QQEtzo>RIcRQz1O zpU9hm))PM2EbB8nMUqWDo7CWPuqv+U`9gj7V)sa>5m3>gF-Bv*0czYmHow&uDdDz^ zO)y$4ja@Xng*>q?I1N96IycIybX7)93-}c85i@z{HL{ipcP+IF*YtLatbo)piU@WE z0LruS!RxPl?qeY`J2ReHLKiJ6)2ZMyTv%l@9e*T0jnb@Dnd!fNKQ2pX`+l?6s4T4*XaUna`pkvn)3w9m=pVm&_bAX#=hXcg~IHOi4YrwZDr&b5XeteA>^@MbQ z3<0$@T!K1j6j|E~w?{S|jz?B7n{f4%%%tzi<3ShejepKZ#*Jb}aEx8uFDdCPn0dlZ6`Y22bomt1vO;v!q4DqRbRSHH)8?XZmj1NvlaNdiz~ zi37}r=+#d%D7@%pgF;*R)RSm-=-xaUx_*_S`rQfb_j8mNuGn z5{1>T=mb8b%^}~X0Y#WnP6iKxN>y2r(*gvOlav1-`?>ZeNXNyHM9Ak|adJ+4yJz1!{2;7+!&M1Eo~2e@U{z1K=`=|n+W4eX z9A|p0`TJC{%{PrSH_;zRQILy(L`O9(cFhIy)>-;#o7@F5E02zHtA&&b=puzqCG3mP z(Z2QNQOa%m)6szqV&IPrV%NW*D|_lX)UNc~u}@QtRYk@^O7-!mwntb6becb`LYq-p zH6;dCDS-MU`m-SlC!C6tl7P}4C99&adUlEUlKc}45rW$7+ez>p>kCR$`?mS`8;r>p z2Ct^8G#itN&<8nDu`f7Jr5dMRCGWp;{unNVza}I4bFmce7~;>3VmcnlBO5AAEovSr zY+$@Z-qd8McbwYT0QJkz#|AkZfA6IpK&43z*S zs#??yt%Lr8Zd+tlT%I-Fdy|h~eR3CdHeWiUic!Yhpo-(WgQq117Fy2nT}Cc+`R{vH z%!)Y_P6EsMvu{61)it)nCSV*4KKAZ@E!u%c*gC7uco5u>Q?UaF1qqe+F1nkLz&loF z8ymh8u*Z69iT{0Mwpm|8H1OhEh;3Sf;*aILe<^4*=oeBcK>xLtoG2WvYTky1#57Xr zYEtcEg3Qu$Q_556(pqg2OX`GvaKz3le3R z=WtBZj@n&uKL5hYz|}LXl17!k${YQN+dH^+m9rHG4{fb1h0VQ#t=Bf-u~O7s?pFWC7WoI zxx(Y@)nmj;pE-Bhb3H6PzKC_`kL6hQESHPE@Wuc<8OHp*n!u@dwbdhL!~b$(A@JVm z8Qy>#iced}F59l^iX%6BxG+jqr!{hB` zv&7Toer>>A&!P%!;*aijOU>2Gi3MI#t8!K01G!jz1MCs`P}N}RI*Wp8Idi%h_w`n4 z>Xad}Tw~(amOSWBMr>7LsbtI|vjqO7ZWm4LL0a}VEU&8@)jt(4#9I5#&`%{;EhZ$y z=XSYXA2e;Ve@USDa=l&T1FW!atlD2_&0U1g6oS8e!5gRG=OF)Zw2j;FhQJ72OS#+% z*Y_L!6^SNhWhBQ-K##7$pfJZ|q_c>qHqmjI$h*QXjD{?|)Q%uQJd}P5@w{t51d16G zh=kSQpp!)S-=F35Cc-_+IZnad3*R-q40MzY$MeTH6N*ZMdA8#1#CR&xx{EF{)DJ;n zmJ&>xSlWn8qpi{ph)iDp1+f1BST{Y@y4uWAU%MI`0vqfWARpvg8T<}0G;gz;79`K| zh`F{4U2v_|t^_pc0VuMr5#CLPCVHHULX%TzI@wF?cKcB^ zMJi`;l_^ptyO&;}OU>^$gR9JlTr-NmH=EEqZwQHckL14~4*x+~2Ry-g|7~YO<)7mK zCnBpM9xvVU%VA5sptxT2@Y8fJp0t_XU%?1GuC;=8I_G|1+KQjSw?M|IjR$|rN&6Oa#(#C1biI6SL?wOavs7w^9}~q+?G6E- z$HmsDSzQSoQKm6{@3*IaucS~Q;)%3Z9&{#|C!M7O+OY8patKtE%xLXW}31rhG*%Q*?T@lp_&& z_e!-);DDHs_9g*J9Wzi!G5cwDC~1lGq6BCdQhfN2=JJ6qG)i`3$n;dRqXZz_&Gx9N zfZTYpOw6AN|C5*(l)WB(?Bp2Fd96~|;Qoz9F|RbIzT*nG@o?VRbKH%y>HF(0`3iqo zbw$wPQun@CaA)=m-EGJ{WrfKrZhQe-oIuDFj5?j-dIf}U$UPNI zu$GX#Qd3-%?8z~exL)8IbV^OZ&BYctNZAO0wSA^BuUmFN8uo90m*uW>J|bW@&)dk> z>_;S8^RfBMmoE(bm*)1>;v7Fb6UT=C=a?4v(iBZg0dx>YhmX5%M4e*5$8E{LTPSwm z!`1tQPD6=4WguVQS1lc#@$qotyAzBrcTvr`}nDv-0-@>(gYwFahetc(Qt=>HyS zRVSj*neSWvdH31g!^HMl)z+hey`!elu@S0mYuN-XZ{$|IkE+!!PY$2m0oy+NLYNc1 z-g?w&Gv&7Fq79=N9KZ0MS09%UEW=;79m~5| z)r4#gY(B{Vu5iGW?QctY{X0G&`Wrph!C*U@qAX}RnAe6Trj*x)8eOm(%u9GsL$eQo z@nlv@Hvnwg0KWmTjx+{TWo6*F-z(ti74ppLA|DKb{MX;5#t4$p*3QmM`)-# z=t^~1IOlSl=!`6y^xC0#U0Sfv7M6Dr&DmZNJX3t%mgcC#nxIY zR7JT1Sfbs_DFq;3zmCi?iArl;sJwK`A78#@z9IZVi`NV=K&Jkjl}690 zxKpv*eJxCI1zm@78|8j0E5H=sUrWoDN+h=qULvE_k08He~8J zQVP0KVY|;3a`hR!I76@5@j6^JnN4$Km=jK|(JcGZ*Yat${*V9tyt#wHi$dil_O;aB zRbH6u;*q!Cq4eB5NR`da4mdQMQnLtY#b3)yKB2K2a}UgBrr0w(Shv}55rc9Gi)$S7 z2{O9|LY$e;J$QgiRLx2LUB1^95Tuds*1)ObdP^nXB57l-#btYHFx@H2#z0F;bcGmO zSpGAi)D0u{t#xvf7LVo!dpFC=7N5Iw9g14uQ?t{?(+Rgp*VD2|XTa%IC!}zqu;NgD zVu5Vl4mD0Vl8jBuTzf*T68F<+m%dZJe4k7(YC1UVby%t(j*IlNw9zX=m$sPPC^Js< zlSg324&b@7E0nAG7hpaGl0T;=3}b)R8_5Y~|(qm()Io^PHcH zXl+s`v#+c6mfOLXdX`oVturYr^G(JRwVMu}#Ym!hLWM%!u|D^4h5n+)+L1o2^}Q)F%frx3qnOp}LD zwimCWV=|=3tZ2z#^%GlSA9%7FW)8m>M3H#T`(bwwbNTB`P~#(Ic#F3C*czQ%z1#`z zlp=|o>ndo2ec7C*y^OmjB8~CJIt7yr3r0TZ0OD1w%Hnre!PAV1sA~`7tv1k|d5N$Y zZ|hR1tYgtI()r7z!&AwwsSvRQX~?)7uWl4wHwF!-wBTE#m-9&|z-_yx(EwONZ)klq<#mZR+Mcrt+c=XnFgaOi6&)R|@;y}zg zMGV8iB3A$X-hXg3^>=g)cnwmY(kIw8Jr-yhKK+1u#z2Svz5e|% zv7P=XUh>StUOC+x42W5qRBe(&u1ie#(UW$`|QD`pbf}_#-<*t3hM?X z2Kz!6h6i?Spx;uLO6xE9eezF7_TA&KFDn{OcGh=5c_;lYR)EQ9R)dp*WXdQtwGPD9 zHL&EObcgjZ*Z1VqFII)qNg*rkC`Ix8{@^O*+t)}OjUTebeIm=L^LCfUsr@{H!q|K3 z#=|J^d#v!HK7;A0G#4j!zF%VKLsFC;fUK$24vO%;w(+~4(HRrn@PGJM%`M^WeDhRR z#+?gn=op>w_pC}F%fK`xvjhIfkno(5*9y~LEEoG%5A9_;?&D%<#v$k3Ydtk)vJQm` z@Ido-p#x9m+Z12X8WX7ONT$bVJNT$4gv|-xQGCMtEcYR~^A975fh&cY;zg^7Pd5g+ zyVV++4Ob#JDc(1??<0>?uN_`6+7%?5HM6`*$4QM;7Vn$WlH(+$F43%HUtlYVRgeDa zBk((Wu|VA@)^wM`i)6}hm#OxLD$X=#bP`)o%<@2qM`~YaKh7K#!w?izlu*!Orr zREJWRb=4-6sZRGbCGt{vS$A+LOGKRLG zx6Z=kJC#%aCYqbdpm_W7*)A~@#x&%^`6O9lP>C#4qrgPW(j5q0Hs}Zg08y`7B zJpkFhmxRh_LsCkOJrrXzElKTksuVf*--bQmu8HpQQ>5~we-1}J)i>rG+T%bD$p z3jLCKrup9gJ8!R|^lC_jTJ3~9K@w~0z7N+IlR|l7tv5)CXX9xvX{c7>&d$%=Px_K- zPxJUykiDjEe(9U>tDgpx(QFh6$&KjA{dLigPMEvqfxjvqkFx@P3M}-x#tc&Lmkc=; zyhkVU(%W>x&Q4$JU*V=_xaC2+5c$}nEcn8?w%dNUJ(e^S{nMr3Po;d!ilyO85IUfS z6kA(la}Om4we8n3Nhld=Ch1gUdQ>E8$m=6$n#&mU-#|@&!1MlXzB77oXAk}9W`-0a zHW@H5x-5@-q{J&XE8f7(TTYCiw{}z80S`}14`Dg>Rxh|+8sl|d0^5RW33-rf2Rw6b zF}9k!HZ<*ZO`w4MZI~Nc)ph=lqPuHGY&if^)E4kSlEYSpPi zwUUbMgKRas=4iw>RqB-)FBGXbYO=*y;Q}Ijx4MiiGm@Rp+^t&;f{e54ae1_F)XqGw zS5i8?YG@hK(#r|gQSJjSr}>TF)`sS-fdzKZZnvZTMf(!`UgODuYaTQ~b4Qrw~2UhnrU|5)E99iH<4P>u@%;JYo~x%`5D zp(oXw5t2X_yzb{q*{YLv-WUW}Q+~@yk9!d&_pcM(bcbdr=bPb2GTYj-S-Yty;>Gvrp(^5u!C8!>8&cWF;|J$2ikhe zgUnwr39wW73Ghh3V)0bCIomo9yaIWjp8j6vDKQ>YA2G__w9t9ydOIg(4&Gbw9!IF> z{(549l`iErd_8@!eQa34AKtlGW7NRi^>A@}T-)_D^4}Mu`1QO-;M>Allqw>g8%7nj z|D9FxZHBC{d_H^Qs;NwaGLu^4TjYsx3ViBmmVErvhg~cF@ZH1DFMfN4-abq?n0?+o zHbY`iiJNEf@~^Lmv=_yP@Jm81seQdeE<0+JBxL7cQ)Z|c=r5kwS0$r9@(o-Wxa3SH}L9k7t2d_CMSA_8m{6w`m?&_2Nc9hRww6$t1v??p7uRFVB ziREJ_gC(ByJHT3ITf`>qDl;L&YWH9auibZEvIQDUgXv&ukrQ;ye%_N zAbH*(obxD3DgHI7xSjx@5ca||7g}mm11AUio}$+E9raG)wq;`ubLm5 z)y?XMXz5>|9FQmPOoBhEI2ioHcODp6@mwD|7<`#_S*D)(G0FuWq%w$mGpL*W{58mS z|GX8?QxR-Eb_Jhcyx4>_gZ782 zIJwsq@?*IrQFIco)0KA>xY19<)(BlMcPwO6^@bQC;?d7n$jWJs3wHFg@WhE1#V6kT zlzP{lZm(rNaqZ@zi4TnqFYB%dVeX}lV&0jv-1rU0g9Pc>gqnc|ln-1xe0Pe|B3Okk{I7TD@0#^IFG_i+Mzzrdj8V0w! zQYd@%)I4GZLd3em3Si$=hSQ8?9gT$1vy{X%4=iS?XBFFqpRhE+mrPD|mF~4pBB%BN zutHmE6e%sO7T4Wq;3;Gu>eTLXGqz~#_jofUezWRSV+grm4dO@P938Wy-C<1HL2)N? zO$dUXFMDK(*5|k~!5Z(jh*5~#*jseIt%ev99#Px3W7oFv zP^WHyuxleqjnmL=QN#qo{E3Y1&?ts`K8N4nk~)n{#$f(HAu!Tvm8(MYe=~C|<$1!* z_Rc;p{moR-K5rD|!%z;F(5kw%!}dI4MtYuoHtbLT*2DG& z6}Yvz#)eJNu z7bU_xuE(NhU9@?ZKoE|}1-908Q~?QE*9{SwR=dz&|K-6Q73HXpp`(j1z+u!eCl9K* zgjOe`cj((vbiPG0LCkms7^z^c?J!3ZTQmx0Qp|Kw!C>6L8T)hdSN%&c&mr`*$H>3t ze0A>U4--L~jRYTamDGwAf4vW77K&1|tdm#`RH~bLZJ`l{MQ?Y)InH(9s`8xl+n+=? z2lsxmehZE(#eReF7R!AWTY+`{L$D2q|5jkIMa)#b%GJI~Qb^bc&0Vi|TQ!i($qF%) za};J+j;wh6fMGPWVu#y44$ne+6LA$EJpX&QILK3BS!0xLE(N{s{%Cn|UDx$dV%M;~ zHrd^HuRX<)Cd3rts^DCPQBb;4pD+P>Qm2yjpthf4qSHW_ls*9O%HQLU!e&)-f;%Agd;gB4U2xO>N9M)v2jriom6 zZWCEzu2W;UWt|5E`|PHO-UME(*arrj4^V7~3k%N@Al^AC{((ZS9SB$CIE8$nds#OKH(6FUNsMV zWinHs4f;v@Y5ehv_#`~zrP6MT0{Nc$5Ow?#6s)4}h)pHa8b9F1=R~23 zj5gC&CoZCgfkkQ}9|8*-ZE= zq$>bqh}toQ!DCAkBv{xR2WLK2&W{XE^}53=ZZ z>N|b(*RYP74~?C(m)Rc%Tc+_Q(Qq8S5RiyelGz^Dz+iqWY>(}KL1=+dI1S4j{YxoP zj$ccC>y5EwN-b3|n}lgfLk?>ayn5^$9aO5f6X_tjy|%fuKe(EvNKM7DHiqsVzgis7 zzRZhJ*d@wk$J?}G0cJM4(<^zr+NDq&UEuZVU#zd8mM$gRhw`q;dMeo-gFGpZ zLx1lghs8B;MAmDxWqc(0>1(rc2N7%2b26|*g8kaBH9*QXJ9b$zIbeA3R}Lf~+RPEx zQ_&M`O}GiLrf;>yv_ptAsML`r*kTjj}a9Wofdn$ zsC)D~ZNL6&^$6IRt*WkP*FKIx93A=J_io>hwcT`yJRd%CPps3j)SVEskh`p#u8RtKm;mg_4DALv~p-yp_C>EpZY ziIh1X6KwHcUuJo4Mu%_88=DOpk#^;)G%0=4n}%a4*2OhZl2^W@ElV**(KVj}A27}g zx5eBis4L;Z+7rUmVlv{Q=*>0C8V9JmgAvdt!=jXg2!nzO_HipT_ea6%{FKjHZRwEF zzB1DK7Kw3c`jvOIi{N9-a8c|Rn<257ddaHH@6}quf4}(C4jjzwI6y$!G4zxG z4i{9TtV+`&q8KD1DD(&dqOg-4fKsc-Fb2iaVYZ??*GX@{?VH47!4@}bCnfQWQ=`9f z!#z!gx!!*$2U`P0!}NrSU^xAQ+Zy)0$Wopr`$ZX_<7?{U>p?G&$G!zT7wzRmEkxm# zFFv!h2Z`cEHL?naiu~}AKVB0>6p6_KbnIdbvk03^UO0YB8S`Bod^EVr-OD-piIlVO z_e%3NDE#9rP13byc|A6g8)fs%ZA$~V4`VuT74PQS?^pDHtv(e1-l+Y6MmG@ z@KwxXy9I(o^XyQV_`6(>vU^FiU5>IN`vPwFH-JaKvlu4#FNgGx`($jeZzuofvBUsL zul|25on=FmUE76+Mrou|5a|@88&SGTI;6Y1rAuJwmTrcgp<6<_Vd(Dec*o~{Kfo{8 zv#)cnbFE`3XI$QRc&@BKcx_KIR}9*p&&um~PW@dScdxp3W_N<((lOMFsM1T{;{UBF zi3OD?C_O5nZLJdl{jYPL|MCtqok4%}4k3+r>%C2l5t4^PY&J_nFh^g)_O62mX{K)~ z>iKAY_ZhxB9$8U;a|Y=Dpv_$~%hJ1Zp^Xydia0rsEJ_zu@0v$}jz_9RBsHz$5g@r7 z@;g9xK6ur^U>Rvef(m!j55Kfom2?@2n3j_>-3>#cH2u)}^q%+44%x&*cV#m5?j6iL7ck{zpDb zcQ$let-Kq?)sYKSJL*Fw97sf!dFO)YV(uCuvsQJ3mSaiC(=@4fq#M`;2h>7C#1hj~ z=Vr*<#B_6-Rv-wV?)0GVk554!7t_KD!hx$=F)*U4KikjnG0!=E#T>9n6_m^INv8E~ z@#MScz20>0bmr2$nZNPNf}}2uVD>|v`znGbyGn<}pv)Fdp{_Y8K->ZoTKer#A)~;$ zXqM8HDp-LvBo(~DQXc+%pDr3{SaCi8$ScEx4cWL9e(VAz)-eJfW*XobP|PYp78xu= zTRr@S1IP^SEzro!&MK#8)jW1!Q{a>+FB z{1=73L4=<&b_z=%PD^(F=5c^PlBTO|uc=+x4@-(q?5?sv&o0~3S0@l;c(@o#z&b(cD z*+wLzo>5UO`xM&9G`g$0#C>1i#-Q~sAQg;b_{uMg4SIh8(jm8KSecr$+%tZCV|r8- zaY4d;|GGUDVf+eVz)2l^9I)cG|31;To~Z1Jg-U9i1Hpc)QsmD_s-JNi1(J+v{*L7{ z;oX-VJircLA4R}xf)y52m(nQ`F}2u-^%sFFw)4G@P6AswLK{_sM|Lzo?q}c zU+G_|kd2U~!u?Gdd|NC?0qk%AXrjelzs?p;6!@Tq_&u$xftdp4!*oh4PI?%cYx(UB zw>t)^)4cTjm}{#Ays<;i_O;or1Yl;EfCV8$!`0I)MUQ1RR1+!fh$r)1FcT;qsg)zB zm`x%(7ElvkVmX&Lih$Cdsm}eU50bpEv9u&5M z4(NIhT&v87FwlD3g2NGf4Xqbbr@6cQ-h07s)#WYN9LkS(y<3m^HXGykA=1DYuTMM+ z(h7vopFzRCs)l0pQQg0OsfsJQt?h~4g)k^lt?ahGJm;sL1~Bx!+asIyRdK){{XK!u z$nX%hrbqJHRPbT+o&7s3kp;qz*~JDnNi-vf@1qr66uAtW*J9T_Dh3fsrPHcLHYHhtnlu;jRmt$I+N$-VQV z#FAsj=tl=Z#57fMlN*egy6G3yAB>UWmQ|pki-zbAg}bqt zv6;52iyt*l#)(#nF~P?s+{HP3kNpIUq-AsCtJ5y3m$7{#Qj`7j!(xNAf9lw-fmP+)7ncAq%Duw&{~q0xAoh$Q65*Aq zV@}v}qoFP=16EDrdUL>IkSTPzwzNHXgFchFt7a4^^Ot?$s>Nr3Q8VGfsv-&X4`HNt$Cc_&+Mf7UK5;t=SY5yb7xe|2ApDGTkV?mqP}B014RYsWhIp~pm_UbKc{Z; zSkiIm9rjmly!9EiEnzF;p*+cB}W>Ha*(Zorxr zpUI}%5hqOXJ;~!HV(d^G1wL#|4zPPr+Hc?8kxq&L?W~~A+p<2MCg`vc(XFL#Vj|x6 zX2F~XCR9D8j0sfRTWm8k-b|9xXxlK*>&6c{fi)!HywJLp+@t#8;| zKLoQW8u&l`?Q<@l+KIF}kda`hZSXGCqckbnEtx@=u|(8t1L%2k&aPzYaA12&A^)O% z>@tF@3|L2W`P2JlkeZoc{K^Qm1VJ5clf&DhkG)Gkty2lfEcCYNXxg!OE=21+2W}=j zF7n#-PpMX;9Dn#>0-Gg(OJT&uCum=`#QHkz`+&A~RH7K}D-g10oX$!}<3=7+Et)G1 zRfnI>fTK0ifl2}^Gx;n61l4mMLH|NDEgW8#fK6$kU4Y}Loqf#&%V@kk^Ad%TBwuIMu&U9`QrnWot7ZOiG6`fC2*FZ5@j7GBvb??xqzr-4Ukt|+_ zLP?vX5aG1T0d{bn4(p?A+6=#b1FXo$XG+THD}q$0T7x`x__3!^JlftMKZeQ3NN$eI z{oFPqYn#%uuvci4_0bumwrtDrS>a2m5da@AKk2-F3Id)+rVCFj5#v|A36449xxox} znf!PyzX|x(p{J`JkmeJu7b=J(MYo|y^JP6Zrkd;A^RRZqc>3XV^&Ge_T~02G?yTw% zAB-f>sD&o`j8yA2r<{>lyzyQGd&5m${ z-1VBgt-p$|>V6+m@So5*@s(D1DD-RLnT+N)1%Y&?n_Yt`BctuM!9wAs`D{_0}G8Ux~Zyn z*bvJCpP7N3|5BsC<5NQ%Y&&QR+rNhlRJUFXp}3#4UOX1(_&vawVfvoB>PbRBwR!*C zQvJ8%Kn=0YH&kAj)djH#nJ~X@ZJa+`+jj{1zFfT=EFO%EjBAwjlaa96owV|cSDKfU z1bL_p9qc$g{V*g?nLu#v41<(fPmJU zE!~B^CJGElBbf!P%W(P zAG|ztthc5mhSKLQMC6C&CJaTX7(Wys{p6k8A^Dd@m+XNdTBhG1BRJ!VKq2uhFRJBt*1 z=pTucuCB`#|0$7A9Fg5bH7Knk^+ z`r$IyqjUHLQswBh(VwI87Df*eU24>_Z&Z>o0*xCwode#S@c$BCju|Fk(>a$(IG(FE z7_i|+8}LE53+CbY<{0oz(5Nt0rO0NuX`gq5rSR{JBkD!$K4saI+F;<~aOa%w+D+o3 zZo=?h#@nrpdR38a@3*EK92s>~@;ODs@J$kpx z`2M)l{QvpxtI$C@s}T2vvi^-S&#~8kyxE*e>3F$&QQgJj;jBZ>Qy*7K)r7qlmOZ-| zLbTOu$lA*GU2%h6EqO|JP#?a;J3`@&$OS*ZMFZf8&jBA-iV>+L4@}n?HEFu~Y@w7ng?co@o0JX6fFr2No>m>7j~l6MRMcUa$fE0_;-S(q_E50AAp2 zsXM%N{aDJq+xngO3_DHhA>grt&n|H5c2p<{%@+GW0ibnEQzzt#PJ6KKG>7EKibej! zZKOC!OI_AP*JkNNB{-kL&>8-$V5xc!MX8I=*7BcUQ5@(}xIkMw-brFdAXvr#mPC&e z;*1=6@ARW4=L@zQxf@#lK=@`#d!5&8!;$!KJ@iIaXgQD6w#k>1UWRgE=tmd3;r2^~ z-FQ0wEbJCvQnguf-s?l4)LA5dFv2O`Gt&bk%`*1(Rr*+jEL32k<;}RpeAjc;hZrf- zU#x)B27mTGUtx(rdLjhIhgy8!Z~i#gqJova%{tlZ*rSIzN(5~CJ?>uZ(E2I6B7|dN z_08Km2ZMN0jBhj4P!J1qoY{HoD9!k)1)!M1ZpXylUCH94M`#Z1XjsrH8@@q#c@cCN z*3BmyMlCQM?5Wm8UpqVdlz`_|uo)IE{s+gsf|uN>t-9-Oj>s*=x0{eAoWqVk#TKyC_q697|)ii9gEll90> z9{&JrkeAI-byX}KQz8Kf)c91`hOTLsKIJ`NH1th-CHG6Pt^%E8`TGwtAN5Hx3c1N! zUWpkEMwd)HCw(7_*p4%dSAjl!OxLq`vXkxVU@RnEw}zt=;AI1lr>72V1@Q z`NNPmiU$zk55Eycg#O&p{&&*<^j0)QvSo7{pgMz4Dnani6 zD50PY26Bkf)TaN57H)49;k8a>oiN8?w^tVL%#s>}~pvG;sP z^$pR*)L!eUs<=+JXPPCTKcrso(c!Loj-t&h&L(!L5=HZoJ!SK1q^(s>nNO(g3{)xc z;dBv~av5~}!w7NjfFQYX-Z&8)pjAJ}FCIhjBC~e)Tgk_aCFc z(y4pb)O*<^Vp;#9%a{|>2uJLmC_R8K zZjstmua9AE08Gv{uUL{B96-A$|C9iE1=_eAT*fOLI2r<}st+PT0H&s<>D zRhn#yDioQL#J+_hfiXG#^_U5; z05<>AeSH64_n`)rYjpiq(WT7aF4hU2YrntiB0YURNKEN?*z0PT*(}m1qO~mfL<|bUS&=b=jk~h8sVRl3-wNf0!rq z6IXHL6oY1z@E;V(_q{yFg|#Wb%DBGA~H z%Mw?fch7!e0TAUIybaW50yN?_w>|G3*U%+w0ri`LRfO8em%@@=B1464kD6d`fsdfs z$@_}wxChZD8ffs(s;9FIzD2^qH9sM7UxwLtSV0QbDS{8=0m!@8J3lvZH?*3w+Ga(@ z_fqDn-~ILxaQoJHS|su1H!lz;V`RdP_)g9bjcqzrLoZoq3F9fD8$Vk*8+cFT;9lTx#Bq@ykRy3oj8phT*SD#oT6d9 za?fHid>GXhsK-1xJ$q6>LYXtEAeqXvWOK0~py4%)6tv)JNsG~l=4|q7Da)=FcL;5K zA_oo+CNSSzMX=iUz6&!9w=55+k`*@xE9^w2A@BD$6?;LRGs()SM>2(2Gu?gKZD1Px z&&0$;?A@EABXo0f^LZOmA`>OJ@jCF**byP-aZ_Qm^Z6gsowZV?N4TF(#w7_atPO)| zof*R-hz_@Kxe}j{vx+;H$*|j_i_hAzaGc!aky<8C&rcZ|lU?K&a%6dc?&!wHbwWs0 zpcmd_APQUIm`Z9`9zRfYPRUnhU&hpr@R@UVRP|!(K&U~%SPTB)@DxP(fvM-}cN#>)Zbhkmr+$Vj=NH6|T%>1)|1g5pzz%rIPFrdenu>WBt zkN@isQ}xr$-rn9j!0w31bf+TBVg6rs*^kC}t};kWQiGgx^9F`X8r^@6`j^wvtoFSc z7|Z7KZ{=$wE&R--&LtrUOSG3W(wC8~{Wyg3ROu?`o!`tuM$*|#=ax=Kr*l#* z_;IuqO&!VTt89p5=R_dk!L{+q39CUdooEA*pOfZ=!qk_|2!=A>Dyp$ahteFFJ| zk2^ewlkeAgCfJcpp1w%#$V+_Uru)n=*$ZGZoLIEXoh;V9FWfW{D9UpY^wKO(gD!Ep zoY}OxsD6OO2jVC7&~OuXqfeDIB{my#0Wd}Kn7o-MZ<4qv$~l*a2Js)|^O(cRAI?wl zREimk6op9UE;#4l+r1sY~LYPJ#Q7E z!W$|7fm?mmgHLK5RHXeEaklRSVmM&14px;l;Nunz77o%u9`^hTri)|=U$#!fJi1c^j6i8VF<11Fk6eoc_d2Akt$&f) zc6LmelbkT!^^D~GDZxc`)1d=~!>sAvM%Y(q1CDJGb{#Ce4WFw<$`uvD)=dxpvNx?* z6`{MYa*rxRN6`$;ez}ojh+ZZWlIFtMC_;8@wI)m`+8(l>8$}F!LmnEFOFeKc@s;P% zs1LAIkoBO^m)xA%c;4R1zSSkp<5asr#|VD7Z8R-?_bo?x1=bhjKe*ui2Q{JAC~-0^mdvaJw2L zQog^7i#Qi{Oh{gsdSV?+En9bb0tc%YLW=c4Ot>l&rg6Sfp-18g#5H|5z3F>1;5d{5 z0hg_U4GNZ_YTcFPV9Z=Jk?v&W8T|T5B>*~SdQo5lfvcVgC>80Jdv|i|?XSj$7s@ztE%bDHwfX$^{In9rIuvoIn5MB?8&p-&)V@r-_^6xYws+#n-dpj_0i?tg-B!&n(kE zMP&!54e9wBoFg;vN$L4IlSAvH*q1Y7&I{fr{3o3_%~z@x#zY-N-$^7i{rXabyO;!W z%Zj82RBL#E1wsF-WENn zSd=m+a$c;zs?fJxTw?3Vy>vL_E-wJXg!7qRU1&oPVUkmK{9A0R18*9wsdFv?!i9i)%984xd!)4%T> zW}fN3H=PR1g1+kYmA5T_2eD0ferp#{)I#qEP$24`3m;II4!c^&4WxdfwAT8s4~-mCuDxQ4Y<-!RN!|wzK#A2T#-;c;O7KgV zC?FtT_&mPo*XN#hTkTkIYh6kvL?m{!9k^1m@g~udF+---`m;f zwA#M~%7}ywk;@vqjlq6R#)f&6)E6?B_lyE5*RFX=C8K4d3S-EpgF zU>43O zq{7S3U;9tT>tpjfug+<`-^u9k-AOa|t894a)qV^Q$6SGJep>!>nTZ&J%*uh2_}{hJ zH)%Qbzh`sb3cp_NcRXD;8Fbta82DebK709@YCtQ@4pPmm0wZ@yrpZ{3#4)~6z1b)) z10tghM3Ix9H5@=W*btb`s)w2wf9Z99vqqh#??;voJv%c#{$#Ob zi~fd1#rG?3#d=&AAMOS4b`X+Dmdk3nyU=7g2QwGjjNr~}#MjB=7-rG6sB8%eK@-<*e^LpM{EBI)?UxaJni-TszAZ6&0#%*QQL-m}!v4t7y5Fdif z?LNIMHoERJz*o$+eL85h_*|ve@%EzTx+@sP<7^F1ZmHAa_(7B}y&To>H90OCfv_qs zSWAY1OFlR%D#|cJu($LO(lnkvEqTC$Y~{Rq8&XjSyGpeVKA4@r@adm+Yy~t1@?2Dp zWN)9x1)ZF0EOJ)&8*za{zD2kqsYEg&+fS4OOMeUFJ~k0)5B3jFS0ZkQ+K?nBw1c>p z29hT~e@0o8x&Cu43-Ql+QLrUqbVsF#O%mB||4`giP_CAf=OptW>zZnHtE7|sqa-@- zhOEw&Uc)|JME_3i0v347&;RgvHKk~;@4tC6_j=?1Y~bJQygSNPF5}-hg0<9W3#+RB zXBj)C{!i}^4FRe5s=;a1bp1VET>dU>cLK|DhMhj`Yr=jd>yN9g9_N3SdAXw=n%lo> z|IJl4sZwB9b;f4=g(PK({jS1w%9t9TH`zmK=yNqfz@8wqRp?9YxI!lbPW^tc${&KX zf-BZ}oIMB6TvZzf3Uv-#ybQjfE*wN0YyyJM`SUCD*>|d3ZXFUsHE;QP zysEd=WK+Td$z>AY03m#{qbv%wRBf_*bK%`|C?yf-SI5z)`&ueDj_*HwFTt!gX{oO( zFm;N`1J7QqEErWtYN#TLx=YD(t)Rkj4^!MIaoNQ|1xo7U>Ew(d{R@FrCcc~fmgY@y zwgK$O`5cQe4X6ZIM8LzYmx-j|(;>5cgV*;1A)NcMkL?6*`jFllb_;M{Bh;`#&v?o% z*Sz@sMII{ZNrQh$mFx#mc)(DY5_XA>I*F?uER?KlNhr`XOQJp#qU(@ntovkz%k~F7 z_t&S%)wYlx!M*6F!5Gh{rNZ<0$i!99i9X*l8%m>KUU^?l8vF1pe@h-S0OMn`i7~$PL zlnXI{($Xhi&Jl2IJ6I<1*zYCVaiII+wp;Se` zFc5l;TryFN0huJz44OT*RKV*2sInt<5DCM9!=lYSR`pmV)P+JSUKVWv0a=yoCJ+Z3 zSM>~+fC%ppt$^(XJ(SMXFjkOwLe?CPUL~Fa87XeFLV;ZwT!O$FK zclpPj)4Sg*P|-kXH=i~{32H#P!Wn>vBW_8fQxnc5>VTz98s^Zx3{tR!qM{ZI(H#(eK!_&H!jX+fZc46@FVNl zwP$ChG7;TIRYt4Pv+`<#DZ4^v4hke@!MH)ss6p>{1Cv@5XZ?J~mysza&)u-urtma5={FCkF?zbs|HQ)}Wjr%@ zXCAvTKS(3CLFC+pz_dr4BWEVkc38p?V)-k7RN2nn|5G5t_I0P`kaMx=37iT?pelZw z5f6M2B+<0m-?$`00rF$%7RePQPi;>Ju2BEAcV8<2Y^>=->-{N!4vpgt`p}-*`VX>2 zb{;UkML7_j0jijviE^C8G@!*y00=0utkJIqX;+SGhw7BH1i^OipW8TN$#P~FSGvvn zi7Mu-u|0{Rg`bk@LC}3`sH)ihG*{_M-m@p$k)GlP@3Y$2azcy=#ehVkd_05g1I_+z z!^c~p6k3$u{iCHIbe5sdKsJDa_UoGg`_`8Sd)Sik=5*)sez!mMvaD<|3sc~aSo=3V05q6v3x&24 zN-wF#aT&w{{SqaxR0zIZE3eCWK6j^VdoC97yEy21By4IfjaAsuEQbhD6Cp{G;LpGo zj=xEw39`)sa&se~LG-o=k|dG!&a_b{?;s&#h~Ff6@<+PfqyP~}?22Uxpw!4`bS3YC z4pYV23j6sO$L#aotjR|<>iq%0slZ)3hS89hxK-yd(Q3id-zk+Dej7{tB(ATZ=~Rat zsZzkB3w0+wTqx~7qp?g#Arz2LTWZr!b6oxcfa@*v)cx#4zIHHCnMBy6+GHRTC831v zimfVG8(5X|#z@|sr`K3Z0>EqgoXaP=F`kY$2d?{re3zO`9%grDB3#R)X?MFJV%{3) zt~wkB53YH4-kHhhc-c?7nX!y_S7e5WrN>yX3s{%Hcw-?SRSE5^x2``X@p_^EnP=#R z=Ey+J2jz|Hu%N0t$wQYk!c)WJ(KOyG^J_*DzstHDccpbsKIt3qZ{}+v??eKFDC~BS z+(HM$mrL>Vn9n$|oWp2cg#UMc@;E$usM`+V4Ol% z6P=qGw)=K0ErD$!N`A^@m!wgUNeG?Sxu?zDL6d%2|*vk+e;}w#1s1X=yZd*Pf=@XgASZTPvUTqgE8bTdY2|8*Cv0V zT0Vy^S`V!%k)qGUr-8JXk6;VN`j-@Uznkrj=M?|vXY1fo zJkjeBB}uer#?>Umx{$x@&=zZ3&NqsgXse|wl`;l_IkJbL%ily}AZ%NCQX**I_ym)~ z0Z4U7o~a|!*+i&AZriSo$c|f8slHcqQKbwu?oG80?@Yc&GhJ643(NA3*_t9>RKFX@ z?mjY7qQrI=C%^hL1VEn$3CIuU(P4{C>n9(Ly*EgXQ}7;hMx0F3jPDD4Xy#L<%C7P$%7&PnRRx2$Rh%3+lIkmgkr^(8U;Fn> zN|+o=x0^bPAXQL~-N3S+W)|rLQGM{R1gSG1g?M-ymvH!FG>87c$xp3T2UF^7)&v;h z5@)EY>}^yZwJ3DHoadIW8Uri@WbVa!1*7k9}$_4hkRIuFy z@o!%#K)#w?#Lalx9AOl)Bz@+xD=t_nt`42td6D4;P6GQof4#UkF6w3#?U5{ssJ$+G zL^PhCpF3VA&gr+jM&-OdJ;VNXJG@}-s8y6RjDTY!ociFW5C88+59exB|DuL79i-!( z*wkF-ySyUs=yY8Ni_Q)=tv=3}SNq*BZL>TcAKj%3mDUUYwo=XCc$<_ic1WTPmPqe< zU-+~Ig+Hn(f#qIl>B|fkscVyzZjySeQC=KRUqgX1&8qzIHnhEAGz)#h5{4LVbGpX|c&wcjfI$#aG_y*^ZhjkM6Y-7?F+x!{=K&t~pi&^np( zc2gi?O;Wwafg<;iJq%W`-tiu&4JGfwcKYc# zeQ(+`*)31b=7=ETSjU$s8^d}2o!zd=L%Q24NRZp^yPcY~@0G51&Wy!-%j+_RR3m99sd zNxXCZbhCM}5g~TsdWx6qgxgcu(M;u;O1rfDk~N^BYDn$=O!pA%2?X)kZFVy-tETeQ zw%ExAqQDbgv+2RYuy| z(f5so#c7a9H>;wAeG8$kv)U+b_A9M#tXW{JTCcYLMoV3YSLlKbvbBwt3(F0BvJ+6n zNGuHoIf;rwQ&Yz`1bG||8?=__44PTyB%qw8YFgj$G8ZUPIqvgt-rfxMls2=OESWIa zD!LXQQ$ISd@fF`n=N@4z5qmYW*V|fsH!&6j^%k3Uz*i@VpLNMWabr*H{Bpe(gM;W+* z!eJK*&=k^v#}i7@Db=I2-v*PtSd?ik9+!MN88Gd$9oB^V4==Ru|K$HF;twNhu6W+U zHa<i5233Q~#o( zt;d~YhVW36>aLEWII!0gEL_F>hEz-?sp5xVj9c1O?tJ&wNS_;v;&T7h&L&*S&pHv4 zyNLR1X$8%o!IBM&jt-n%OyG`-5aU&t3M)O=RWsfnISWwsURoM zTHK?{USd$#iG0gfR9+_o1OkKD5exBvv#g!m^})S>R2E=RFhoWmpqv4)T;@d461jX^ zhKmJ-@&YIQY~Uu()^PyehD_e?E(x}K-d?}WnfT@CMV^Y``5~9IU+ziof&<~pb8|fv zF!FX6Bx*j_B=RRWp|O`u2N8(fi6f=``M#nNC^)$E4#^SjmLzNqXJ0^ zWDsB@GQRJA<1&oEz520GRYAXiGVo-}e$?@h2tg($iGU+oVPRI9I3=9VCuMo6 zA8d#cL@mNDkp=}LBvIe>@*rNH<-9tcZ*)XJ*Ks~=*)C%BM48xNt(RHt|5OKsMyhCT?4~%4JNqX?6BPe64E5lQ#);b_`=mS)r4d3+d&m45vW; zZ5IX09^d1YVmpavy`VramqdqbBly1V+1tnY%up-(2HS&c zQv0YZ6sNgQ(!~us=GmTRp0_7Z*s0&mT7}K{ho`fy&o}{`)K*w9qSh<@f5SZ`bAOxk zcewf*jMe(eHj~l6Z8Oi;V=J%61NI%SIWSi9#N(~KkXI|;td+95mx3diHnpg1>rlW3 zubkA!P;0@gBhRlPe4do37&1>oZVB9NrcPSPZj;gsx_>^KNw5JV(3^N)YNL#i7L@KN zB%p%f;p^mUg8AYt$`+2;-`Q2MQct|{BIG^aPlZ*c+!oz`3%9PV`beHKcI)tm6E#YJ z;X}NCy@Mcbo%f~zf>k@Gb&&YUsiQAWoOSa%)Hl;c?BB7OQ<=5v`WBf%wvFtKl6v-; zkp;Er?%B!?E4Pu$5*U&zmm1)CFqK)=shm?Pw^g7@Py0SQN9p!x@Fxeog6P5tw_gIC6uSK{N_~lU%QU8- zHW>P$-VX}U z-}jza$0P}i5zvOA2_26YKeKbfF5vqwqmg7p%JLH-qR{py2|m{y;5DD7+(uG-;C~iM9L43oiEP3=7hP>e3Hp z#kXIxdt2P)`U6sYl1Gd8U#Nr%Ym4U-l9Ldmz%JD1AT35F&9OY+$7xp!|1$H)xkEfa z3X`+dYyZ-w36JLJuSys_qU?24NIb7f)lU&*S@PG(E6j#rLFnV@uPTnT1p6{y6I1T1kQnHC`O-fEK=MOkKfy;N>^JN-+kptv`s zu^wav1IV17Y@W!!{I^%q#{JcO27)!J^5U~NQfZK2w51i0O=VvijF8-9h;3F!EUMSe zYXi?2_KR@?Zswn4r_PH4m=6RS4~&DU=FBX~Wgf#WZWig_DjdCc{EGRVEc>C_t0zqWIu7cz;JWme&8WoVy*p1>EOL&RmW z(qq_LupEsNpX#Gig}#I#yXG!K$G{N)vp^=tbG4Tbl?6Toc$hTgU_Mf$br_= zT$-0@e$umJ?tlN+-2U~&-~a4j_2sUw(q33VBzx0JeJnPj1Q}4{SYH2bdBYgqIrs`J zPUs0Z z7JR+2;{UvSG(hQYq|94cH#Ue)`(n2gOib=_WfJXkrOptAPQ=1&YvdV~#5d5l!=Ygo zQO1u2ibAU4&ke1S7mukiwkXS0M=^&Gf$Z$+zYNL#^*?+<~}R-Thm?QLijp3?d%^`wV9RZ)cB=`kX84Gm6$cYHeBcW;}s zzV0{@>p)OEKA?0L(g2=x$uesLTRPe(BzvrC-_IVSdTk(0%B(@F@fuFAx=~OQcQ_Q zN&ifZ_Fb2xn`0(L_}DPN;w9N#?R&ByrAP5{72<^^fpPoO3r~L%=8U&fG6}H45w~nB zO@`NBvCAC4mU6u42KI~QKf@eGo2C^kp$DpEu=RJ+D1ITAz%3mDe}DhW^z(irS7w)z z0D6*Yt)~ohU=rBu9% zJ;cvG05SgsBN2Z6Pi}aDGuF-zF9}*lioP8AymYe?tVr2*d5?m1()M~X;J)I2JEdce zm0`kFCo{IIrjABG8(_pvimmw`2}O`Aa7`ohbS?hTWfY|u_+>=WmQ^flv4a~@23mrSp_x17sRuFAuXjnkk|~X&Dwq_C3A8VALiX;q zXlSqO$l@GMTk#nPeXqRttYRB9dLq$Qr!qbWk-Q45-5uNutfi9TN0!M~F9KaGZv9z) z_eXKWu`j>t{pMY1W8n<_pS%PF!A==#1aInK$*bRe$U4rkuHK=h&Tp$Ix{MFSH@&KL zMcs7uzM@?N1_^&D2k`X;Ex<5OASHy$b)F4Uf(hu zl}`@8QKakfUg7#1*v@w8MQcy-;bAu!Zzq|ydLp!n(%sFpAMT!$)E(;%Qm61j(@;(a zp`Cy6!?iccVbix^p@W+C=P;?V%?kmnemMMydo6a5LWgJEIZ6DJ)k}9#K@P|`agT&s z)N8dhfC7B>;`h=M0e?Lv(}P1kj!p7rZD~g4O0Dnh(f>36;AoWN!$Po(*d@PD$gmd- zqX$_N8W(JW=InL#N15FJ>|~nTm1cuYm}iKaG;MSizgni9w-ccP1q(LaC?14qKaOot zRj;`)Z@FM53H4PmsPNCpKLby}&Ue3F)HKh1M1HxUIvwkb4G*ccNo>ovouFTfG3W{I zggvmj%N?5xq_UXYU|pM9>aecP-w`pn=d4QHD1aCmjgE-YRaP_G8N6iuCAO2UKJ6OW zl~$^>Y$8cE%<}T_fnd6aPRGN6V!PL74A0A1HyT^3_vOxCtoqrwf7~n)y#J=bQ)Zh= z6(#&8w=M!6{E2@m7|SV-$m1RsEYDv4`q-xV`Vhuu?|VI%znOTiIx~}as8-I$#n=fL zc@dZ74#3)8F~GR=My!{3Z$_k|L^d9HDQ}8}*t#VoE*UjUX1Mp~x!5C1#xp@s&xYyS z2YTf9P_%U_0*6)p*mgb#=*)P=5MqtIOr+~}rNqx;Y|qP^OLWxx`L13=)(%Xapl;Ql zsm~j(B2EmK*ByxtR~+bH`4m=z!L5lYJyI@@Hf+@?B`42K^TdW<&$98C5EUZJY;G^@ zyoX}S;{RkBd*$s`DU$7=7Imj00cF$-`J9yJ(SN^bF8cmsERJK*J&^K+v&SF`a|0q!Yz zv@(J1xNJYsqS5zsMeN+R>x~VI{7*C)fX67Y>7jhDI-go+tP&xuST0S#vyt7{7lNS< zlU=*>4~=kC>4ChC{STpQ7C0yTi_y9heBtp^OJQzRP?{~^f}!R!3mB>@YYrZz?#9e5YX_-^UG??5`}M~fQl$>GJUwiy#! z!P74~w^E&FT-`)+*pPnG62Vs1T9ZElb~M@sn}4c{;$eQAya~VFU9;7-OE))wF%lk{ zk4_~vK$-qQrLVD?{$2 za=J+{% z+c^!pFUGXpu3gr-3wxg~d7pMX?q^~7J>FN=q3n2krBknrwJajQwAMZ}R;xvz`|?u; zJhLe+IE~6G|DM9mt0)zx8W~IJOvKe6GlTK{1&JgUdkC*L`up+US7wR%{*UMA5u1Wj zfS}&UdSg^q*8_UF9|jLApVtnL6BK=AdG*;@Rt^eU*_F%kbE;{U|Bt1!jEd^*yYSFT zE8QjCf`oJ^ij;(Oj&wRSLnENH(he!z-3j5TZf8=rTy-nk{Di!Tg+%{NNsN%Ra8uNv{@(a%Inv>CSBCk~?x8s-e^PswTZ z9Vw|^^RKC7XaaupBkMH3nUVE6_Rp0mfH+}Y4!PL4#n1&LN~eF zVGd@0sB!%1{PWJ$I_~Q4gkt76wpRSrpt2lyy_AY9x{IsxQqy9#=sp-LO=mtVt5=f9 z@p$6B$2-=8ULSpRxEt%&;0n|Vx^L4P*861!9et&l%aY0;iHI zKbUk9q&U@{Bd(3wj4k?Kpgmt@vg3JA+K&C~FyGmIXbx-Za62LEHGv!R$Z!(xH$@&F z(UC#H(gXaB>Q>&nHS_(EhSeI)&6Y&z{31$Vr(j|sSQ4HCujMX&#g`ktX{<#O!9Umd z)T3tFti|XGWUZyu!iQy@vPe9>wVPsFC8Am^B}tae@9i9()~z;Aj%NFhKOh9d1HJ)m zn*cIt^_4|cG6BEFk^dHd#_LH-r2jniN-_s>gNCX~LuO*O^?3@%=Eyxyn*J4=05`O_ zI1_j%Tf60$R-H90QH}9Lm&AGQ8rQ&(P6L;5p$$m#iOxm59lrilOO7j1*eQaT(an_{t$qgsWs5S(0QK6Mg3INlHn zZY-tU?wDVCA&x!9Hzy~IrOl}S)v#ytqKefh9Pq+BKwG!#Q^V4VDxRZgOG=)alPZT_ z{HfhMCEeQ~UM z&FFab$C!$eKl~Crv=`qYgMH?&1NO&2)o@QnM#g}SApjPF0oIUza<`2QbU@kLQoja> zA%+J$xt85mUB%E9a<`sALtXGwjeEy&Q7V00@pqEVy5bs@#zfJ##*e_R?hVi9BifkhJMXng98S&4!^;j0HXBkjiv>JGU_e7rmcvl z3(E&%Rw^dU@p4`6XVzsHEp3F#1LO5;SM_ui3okWc2?@M8K8&rmJJ5q35b*`|#}CfA zr=K}q%ZOV2OF1@U<#!eyq9-Tby zYe{z%wJMU1R^U(}#aPETJ2v(#O%}@$9dp1PrRh{GxDvtz=(dI|f;J%yXf6|PY{u^r zLw1ewNXtGyis5&RV$BPAtiKdU7+?lI(|fMhaECgS5N)mC8}BIKlWT2K(hWFIFT(fu zF*@-*8T`ly-HnqW;wl&tr^)cNiP!-Fj1}b?dk!V435iQ6Zjy2Zr?QylbX+aR4lSy` z#y;C764c{cK+TYf59@Qm$;G$!G zbJM0eeo6}9>FB;=laN&RQW>1LL6N$qo2Cxo8k$}Qok``!8(|=|N0Kj?23!Vn35qJwe~a9PFzlhGS`OX^SDIHD~)T zI<}0#G{26wSiz9iD6g~$!TXT{+Qv6*yJwBFbu^R86L@W%i!u`oY~s3%81jW!Zq7tq z)Z5sY=Cw!m#s=(+YzOf1p7$*63pCeTl+8_M?#P@pXaQm`!b)=3d3Jw zn{0pZ%PeNyHeh;I2xp?Ep^@n%GB7Z>CdB5J#_lhqZLa>o`7a;6P9IR#a3v0`VBlmR zrhteD-nKZgjby4B0SDtbUTN+Auz}d?x8MdgKAX)mk?_+WE=;_xSK2lbO$;8n z`;%y9uEFxMFA~SqT&>v;OA#w#|I3G`E=aGfTUm9$AY^A4F?#w(|NKBU_Q?2D_-f&? z*Kyq_?6m9)MN}PZ;!W^@+|Sv=Rmr3MBS|@GgTHuYxk`s6cH$&Ms+`YWr0;M6EP6~h}b?jYVUyFFK45WLU2`LkqR8N`;!GcfM zFjmY)RtnO3!0Lgl%q?=(1BlW^L1qt8^dGsXY4Qm3 z)1E8apSkw>KnmKx!$8~JzzqxlMV_Be)cs@R<@vhb-(HMFMUf)(_Wn7Y3Do~faY_4Q zR}wf)(!uR-5z#PFdeE{NbTQI;yFCU!x<~YuwO$peI{4glbb*s}T`#sVht2^Rc5y{{ ztxOIFA$xU+zKPr(h0QBDAi%3|B|jQF&Bm}ECF87%i6FEw{-9$0=axLiNV(*<11Afq z5;-a+qKH)87A&clA%~ZHMz%-&2g-KPw%6fnaRpB7C7^Jbsxx6&>MLtxwkLDD88Ag_ z8TkT;=57zosXN~a!^E6kCi+!Zp#0rlCSQAiz zTWI!oWilp=wv(-%5F1r~#aE2?Etb)4;o0z1<54nI?|ABqjh2rEK^Pl!w_jndoXZEp z$`Wk1E>u47eHA_F>=;Q0MnBiiJia7V$lzf=UFt=(Ah&)7E=xgs z-xgBw`g~eG6LT=A-NpF(`gxcrlsB#?MS4-(X$dPS2j>UgPEx76$fBmieZ{+0Ja;@d zACjFHS0=JiV~0AsJ=(ZbkvsjOuU~iC2?d3%?Ap{o7|4@8?%-R5kri(fkFuZG&Fs03 zP$h~MzosSC3%BnJ=Kf0)E$TQh34et_b;@xFY4`(Jj#N}tPqxRH#J#Tx0h^L!`Z`eQ z0zw;qRIn1LU3mgMgNiqb6#nApwA}3)^0afP@A$^L?GBj+SX9;D_o_8kKzhd$c7JlZ z7cXhpQ*a1ax<3UR?01tR>OLRfdDW)))scpYJ@f8BkJlJ~9xrX8aumm}r>HUhD(5~o zPGej&*FD{fAil!!mkv*s@B>xgL}hw16rua*6#b7VG}Ho>y5EfyUb?K8GFI#|I}`Q+IYlfvM@vzj}aqNEReFBY4qhq zJ3f-C$x8Hx^~H{72g*rKU7L<>T|9Q<`b>6^a1xf_vFVfBc9+kA`fPrD_8^;w+@IFH zK}Ebx!c&0*4Ry>aBgqHfr}@U*mO}?vl*Vqlo<~WxVZlTnb{+57mXeqLI!kHb*I%yK zGmc z_AyjQ5hjJrSEW*q9!-rR4YNDySlSyJ;?BUPzecQtE^(9Ni)Z>( zrKN(tTv4nz6u>XRwCY;vz@7MM*r=W;#;iDj)Xi9 zFr^qt)9E={0#V2qjU0EaKfg|O6M-JSvJ#%vuz+M(eIQ|L%N>+em zM-+?R3YWwI^JD4+HC)&bCh&nD2zhY!E;X1Xg1&ovtRMII#vDT2u*{qc;rW}x9?ZnH zNh8J@C6jBA286?k%3b2+u%qOudp5X$YXON^Qly;uMnBap^|%HQF``>=zZ$@Gz?1T+ z@G*wF!At3$YffhuvER~7TdPFjh)fXPyl$|AMqCU@dP1zzUZ}Dwm-?(7K_UfuRsd(V z{6Dse9kPeYQM?rpy%-wsh_DiU!cz-oMHD|5(VB+_(8J6aLc3nV? zaWutKfTx>(rnv7(l-IbnU#%gDHb+U^^1UyB&?0O%!ECK`*k>W}@Td-rKe#YkrGY)4 z0>6W>uFDB_$Mm_gWXb(E0IHk8!Ts8HjX7lx4@iZ?k}*t*{EyR)H#1%Q zQYTnFAF$J+-hLf$@_&GJ7c)ep+vucpl0ce%KJlWioex!}@xy5&}Pyjp@#prTZgiiB)=arOL^qZF8vf zI=9Tv$7!ZqWqk=h#0MkQ9_h6gmiEs0S~njdS^Mn!!{45Q_#EF^I?oVDvQfCq`(;c| z04y1pQ;t5ZcV#sV@1f;+=}ag6TP!W^6Cg#;FSO~!nPJY%5a5wA5>!5YrA*{sI{g}C z_;i_(^C!{ABWS77$qoG?4@h*0SFOgHG9@(?BMAzmc>}^O+nLf;0LIe^P&>bD_LB@E zoB=iO*_ks};s>Dm{u(@zB)UyD+oZ!KyZ=`A8!M@n)t-S=Uxi3FPTLFSd*n8yqVek) zJd`}@a`v6SsffH;0}k7;1MnuEOp}ja^c;USn2unPfnBC;{6Rh4pw=&>Hu7RDZiN3{ z?us<$Kw}(GJXUKD*BXfVXq)H4ojpTOaqpFt1!^9^h!~FmWzj1~Au6C^Is;~Em5tD= zp%EjWizz7}GpEY0(d%MY+tsjauTklndoMoa{@uEm?aHOi zBrjLC_On?o0!Us7{&M`SPna#iut=J@19_L_PEU$g0i>_r)AO?*kB?W@VeQ#1yL%G#v6l_ z-OIIuvkj9lPD3m`zt))KFcM7q20e)|UnY=mS~VS~Lh_Hyj(snJkJ>XqDng(>?F^|& z;#2zZqKJ=dwI7nV0RjOvm7#=K>g*ipdBm)`_)E`0q^eoA3Rf|Gi&r+Y0n2%3)Wd_N zp2f%b8P?uENpa$~(DbL@-R<|W|3-!rFX8WA&RF!~YYC-t_R$@!rXcEy4jU5^bZ01g z>cO&|j0On&w>*g-fPod3T?2s%SYmCge}CoBs|7!;7^t$Rf2}NX0OCV^;AjK7E!w{% z_oxaO#0aC_$Ty_CL?a78>KSHUULG)30JOm);%B%3+C;SZdMzAqNaXLmj)OuVfpc~t z>+9f@l$3wdxw9K;J)i^qpzD%nS;mhEyh!Xw#mqm}EZh`MUNN5BIJ^s?p9L;xB;-qX zUc!%D&I@h)3}tTclRyAh0~kp&BIg823O7%c4x)XSugWdAk#UuZ1Oy?sHE}#cv0nFE z{qLpHvk!73qWP^}yV&L3=0+5;9}B7^wvNSlDJ6n-by|8iURpcvY#LCcA8j=MYC5uo z3uXVf*RyT)JlncFr~|U0O6r#GCV+j)ebYa-mch)$9D~E5j4$qg6^uLc0*5~*AE`-W z-=I6W%h7(vspYb-@8u;Bi@H?oWl_QKrgd zsxL7czQD28*M!J_y?YbNqCc#nnX4j{mD)10D9CR`lb*6!tGey=2hsYK=#cq-dzz?} zKsSk8x2Ctj9!rzaf$A5v7XwbsZ`*#!=Po3aE@8?!LXdr-*5MQLp+Q+Ai-w*JB&$bQ zC0hLnKg!dt6~ip^(`A|}(jFJWneMoQwf27}UWf`&^6TsKZ>)=Ydwep9I@MZQKnG}A zRoXEfSb_o&2SGxyYMHA_aQD3Qvz2Ke$Gr=;#|wD?^}GL<1huy}Q}*a7nZB&8XkRlOs)mDg z)A66~XE{J;iKAN)#p~@?7-+Eq^GXT4bh97icyzzx=i`lNG4}D^3vcs*8YE}!ewNJh z1cEzW&7yr^!7Q@s;A1SWC{M_oQ>Lsg%zPKbm8p-5x1H-dCZ3M&Wk=ES;ME_AeVF<#3mPi4u^uwt`=#`xpj17P>XHG=3gbiH4N+*2n{)Hw&ddtcLyirTE>PxKpn}Qr2f{-SOUx&$7mnBG zUj%}k(eadDkf-c9;i?w)u$Z18W?K)1uiCA6l!xUI?}PKpLRre>$#&k^Epvkhsnn#2 zvxp_lD!Fa0-0`#V=ZMiJ-<$V<1!>BBsovD)T>M(Qf$8PnRcHr#=<)(#P^qPZuLLoU zXtypix!qdBtx7TlJ1E;$A{Yk|0tQ*O3@jxZrWWNGTvufIKSIS(Ma^aSbzdky1GI%` z=bDNg9I|K`*1yW7DV|-d?dQ4)i0M#=dc=TzT8!4$)=+^9T|`Vw4j@VwVgtH|t`hw^ zr@d)z1Av1YM_|$$o{-$-sY?1jRuzm3$T@%k_tu#xfNOK#|G9js=u|KidfPaY2&FY? zIM?tu!2g9fjY`!(Id48xv{u}Vm~zKnp#*k;qOTm;jo*(q=03EFGBxcTQ{HZn}-Gc&rhO9l|cE{6m_nTr@ZQ^ZLb<5tqh<|fIWJlfr*lw>--C1uN z%%=HdhT-{A5&dz+rQ)!8`KMfja4%XzCgEKa6)_!}T6Hs}(KjFU-&A%5eTZcV z2@c0y82M>?1PRgqtIz(;no4nU|?qOF57dIpqM$z4~NnX~FilzgxX{@GY3Q|ncVq9rlG(>9C zykt-JC4UB;|J>^%$Q$Wqa!OJ1`Ig$nj%RNcvG@67o*jw2!QcO+*KqXwgK%Iy&lb8}*MrNav_?a6Rwo31Jry2z6F4 zNaIpsS-Lj^r+m`KG1Ow9{Y{;|RsvJRMSI~A9yW|q^obKEsb9l+~yidg_JTk+!w_8FJ|uz``hP0CQf@y4kvGw zXqYsR%=c-?)Sz$31pRR>4%_W|<4aaa}9Cbefjb>2wso-fYwoui%p9pO94 z2`o8(s0Og)m$S8ZTx_fX1nKUrx4e&=#(r1hAAsxt0F+3lsdbU`O^@+4U^%^G`_GlZ zN<6_u^5YZVC5Qe!s$L^p=rV8F7jk<^_c&wezJ!!YU%K7CGNvBc$!@Im2#cGdFKVCe z^q@g+(2e#so-@vv{jKglj;_UN#o~|mxkBKo4fc#Pn!jnT!eh&Ibi{DRO&jJG!gm|~ z!<>cPM2C?LbIrWV?O6t=EoOC4F#e(3&Dc#t>xa3<;TLKL#l=6=>HA>JyR;78wrHKM35}Vo}0s4bg5EGX_sa@|Qc^*eHjhu82SIysn*lrx!% zjETc9)zf+`VPBa)dWVjs7*9Cb$EM&PE! z-=((y>TjS30lA5PS@!}a-tBupk)QeOe{mG`UKbpt#%)pS>+6I)3?cm$JfgWT7RSau z9uJyt5kh3dqsluF0jPm z*5|X&%T`5(%h#tr{{5P&j>_%K$GOC0O7Aw$vizyZp5jW0JzAAtwA5i9-sP1y&?+I6 z0oII<_~FwZ;Xo*7bVC~b8dC(L>V*9J*`G~kGxx-{DxoPl+Y30R!zb`IHT*}N<-X3g zK51TUf9Eb~F%_SE#U}Ig7Alo9%66!OS)rgyj+oQ#h$`-3h{pMx-{`7*tYR~SU78%F zG5fY~7UE$w5j2j<+2^M~97f+bb$B5*pxo+DRTj4PT|V>Ru5}5$ALAuK=-%kp>J1d_ zUxM94&n-mfW}~dIn%vL&E~y6(>{PFOun=F5b|+EyQzja1kY_IHSCz_!tg4ZQ`m;Nd ze^5O$gi*EEZsN5 z=i@TXmgZ6`oow%v7JzQ^-<}9assrE{aWK^T^ZEo~k{6ief2KhF9o zC=s_#gJ--CX{fjS6lkBtz`xZTRA$IC!mc6@c;|#Rn8h!B(qB%v$O*-}Z0*8g*_|B! z4y(8FC(pAoTZvd4sljsLmo&x&0N9xda3Xoo#u~s9dPZXI8}8-&G*0oSoUI~ytwZeS zs{U!GymutxQ*c0EZ9BbM5<>mAfL2oyS@w7#CFy-oGqcnJw4aWaRdWc?FbXxPtk~aZ z#sAG@JW(r(lrge62n`j&$?7Tt zBrO2~7d-OZGYBx=I zXyzOsI<3YKqhhP7b6l^cY8!UwtmeaAX83Xw^?6O=P#&;}PTX5E_*Rs1)sn9^vS#y{lNNk`{>NzmGZKxd&Bpgm9N!xBUcND z#|KlkQs0MFlbz=^Lq8!R52DGJf`?TZ8)i$11R4pBGCvfquN(e+)-twHhVFbNJW%7T zV{4b43gJt94G!DMlSNG8Oe_1NNM8U?QC*?@ExqR}UG@_@5szHG0V{o+Juy?sA~c;y zl&l)ga`hN2mW4emY_(4-mRTw8hjv18K*^DNXj6lIJf#<2f>i_Tw*dhhFh-HMf7t;v zZC1ZnJdRPH+*_=`R2YAA@S*bM_{F_W%9%Nf;e_RNkj16JGgRqvZ=x5M%m zN7yWppAqJoN`Mf%Aope@oB=UL32!=!v0V|+w%}3jOJgT=#NFLI&Ak}7r?suC@WP#A zdWmtZdT{pho*5*ZvlueI*$>zDyEHO0S&sV>^8q$t%)zUj$B^34oTwaYn{EKbJ)oKp zPDpH^X04ly0wcbQa7BtQgkSVA!hnErAu3>6npwyJy_mn4;(fRjxfS_h-YwX!_N`HA#MCFh3sUM25P6rdNpKOuib=bwci1b%bQ`Z`<2H2D!cWex=Hqp_fRC;VfhV#D#5sPT8qeDKgDYJ1mL6{a7s zf22wzQ?U|2>hrjj$KS9_`Qwm08&9xdB0@;&%+3sO%%&~=L{g6mh^9F>=1LU0hh=lq z+3ts8|6N>wR5vKSRQF&vC2(_fjte5XKVF}8T=7i9m z+9`RMxLnuv;!9fg9X|_(Ul)#avmT0nJjM*(FJQjn9C9`Uq&iwk`{2XXu0TD0IsYwhpTvK3~{mqTVCJxNCm^_@tjvQ_~mgfOb(l!xy9pD0z#_Q&#yTI0^YT` zr<+Mns*cs0<{pE-C;v$4aXY`Vqf0I)ut#$)gMB9)9$B!hi}7y!(~Hx1<~!OIT;C{Z z+#JnF6%!F&z=)_do6U@Ylsh*f5C zl1oB!;;C9YU~Jd69clcyXeX4vM+w~cDFWR*0Ue?Qd-VjNCI$=IJD0@h2>OHB8$qnt z^<_EE(L8uayT+mWdxd!(IahL21vztkl=jTV$i7+E-{%sEmVY%o3nS%xn9>_+L8t4^ z#Y4H(7iw(@`-8@%M~wscYiog6>9WtRk%?WI+q@Nc%5rEvO^)3;OxhLJ~T%X zI`ZsCj8MUY2ysxG(eYxFJKzDh;cb1GF}~ZQGxELJG)_xNxx;Ap0l^Ck@&EY;UjKLe zpPLQWg%uZqT)QceE>$nfByMePE*07u9&eG4h;Rg8YKi4+OxB(utJ8WTz*e*xh~&51 z135^*0!XrI@BmbqZn>$B4mrF%36n(2;b%67rlzPR`9O!yx4!nweuw8NMu>ZE_YtvA z2BScpqS~bAE^1KwB=eIbk;}=GQs>O`Rv(%_#E)}^JGG)EG?m|LUh4kA$&Hr?Tg+|_ zM~bm*!ao0A6gu46yMHf)*77NuOQB5y94wb6xudMXW52LvEt(i>dac7j2hc;tV;vBk zwK}Q`bt-mcKJKQR0!){wuEKu7P~pQ2{?PTXEmDRsK3jNqo(rj0VqY&^!8 zm-Ki%vvk6@1yu7tCa*NX4P)-T!Q4v3Ys)PQ)ED0m=u#KkYfNC$hSr7wkTuV_v+YP2 z_fa=#-q7azZV7OI#P>r8ABX%TTBZ8Yar?WBFQygM9$y-1U>L>5Yc2x&i)@?9gCjKO zxX7&fM(Z?2rAX|=+_s2~^V4@X%`x+<&(4utZX1&QWoM^kBur3C5pOC`@MrJEfrt0;hB%BY}~ zKBA>*(Lt^r4JD`2L=QI?<2lZs_%{RS8$IEfPvzf9gn^R?uPm`$V7VPOHG%5=-JnZC z-SHkiVZ?Wsn46+MSE5nv0oq&-$N+$iI`_8gHS%6Tl^m^?C0#kZd_^@dK$kA3o1o! zbMKI~Kn}?jiT1vgp`A1s40k+4%M>;sxAX}f5s!E2M~`=8ZP%NCN#+>K_8@VvIah80 zfCaq!FQrQ&M-~Ahly`2$7(T8mptB!4r$h^n9({4ve@fI&xVT-~-VjwRE zpjx4@_&=R~oT=r`hY(q+?^6^7uaYLvL=&W zYE!RnvzWEBr&zw6G*-G>r}zfzSp_cd`DEq{xfq0CE|;x3h)3cq>rMD=&7hJCs_byb z*3T!`CkzBS8Kp{>>%Uws_Kx4-rVwdh4S1^)4vZm~B?fskwwOB@6!^^!GL0wBvsYxy+gLb)?F?LXLMrK2wnwSJ?2D zFQk}FqyOn4a^EJ^PSU% zOn`UX&hQeMi8f<+8*h6-1yGNwCVChnR&aDwl-EujoLg_5te$@Xt@jI;E*Q5~nTk}Z zXphn!jyc;u$PjYq{RyiK4rs7q9E4#1EMJpMmtk7{o>U`2fah>6U;|KPDNM zZoi*AAsxySE5N7@fk22zNhtucb*~E>wh!a|dE1Yry`K)L+2J4HJ;TNt8Sqid;nIrA z^?T8g$pu#v+}(K4tR}Mea&wmt^E5Ys?!&E#Y5s#K46+ky$L5Kt+9K3TSdC7S_g6>X z=o7%sS0ofzOrMV%5R3EMcT{>zy3e^KxH!^;_4G`t(NZ{{`l~EW#)O&yk_3Qk1LX8p z-`oK8%04hVl#;x=8S#5K1cso#LxbsjXY2xXRdf45+}vqa-2aS-moaWFA3v+{n|35P zmLv|P_AaL^BjM2Ww)+Q1N$5qFlrJ<(RQoJz&XrMpWm+~?R+&VaCp*ww7N^|_2TY-r z(-CIyLQTlZ9!&=gHKU+YX((eBilB5$<6I(&%X&(3SLcDc&-X!?-y()UE(Yxvb>8k& z6P<&9?1*6u#V2ddcM-d{ZD8rOR~Co--<}ULm%UY}5EMm24J0!mkVd-bj${YGYL|Z7 ztly|BwZMIME=^_Yc6a8Ry-<=p@Nc~E>YV?SV13(w@ zeqXFnoxwgQB9Ngm`y*M|KOo^@svV1Ad^2sTL%h>t!WTZim9bDI^(Igko{-yjWoQ(T zgQerMKKx43f=8Ub#!i}c<2LU#zSYfg*xgvH2MBv`s=s?+>e>Ew2lW(9^V*lBi+6Y` z2`_sp1Q-s)EE;R6VdUrIOv(P)C2a7L3&fFw_)|4}7^psY_O9Ut$kOjH;?^_0tH{z_ ziNsy}fJIu9pxJq;uHfp?sFTO<2aU7cF8v^rD6{!UKpO`Wua_%n&m3>32F1}7! zEj^sRa^?7j_uN&8oecSjeSQZyX)CDx>9A^j?q2K9V(sEOTQOQY?tqX7&NxOOeOQg>=3X>i+x;rk`2PH=?QW%JWXaD--(EFJ zb@E54wTcq1oW46hKOV6by~ke^3>J)WhjFv9-!)WrLzv1{7&2Mo0)vy(uZA*;(+dXl zRQqrK@Zp5-Fnt7;;Y65JqWL>;%tXA38}!^(aWj0RkVhwa?eXk*T#g@We>I6cpCJ&k&3b24RaJl zMcdo^kC|Z+vG4ar4)!h5zx5Jbja!D9s$8lz&nd)3hwg97;<}I~4s4GfF1!D(snO>W z&eIXLwAu$xPKny>b-iSh)u|tZ>izV?k#3;#orHd{(r%Nc!g6iVE>)4^jxjdiK22H( zz-xUaa^f`9dCCK=zftfVj|Jj0-R_r`>Be!DC7H|4Mf0phG)8=XEfkF=|G7E(2t5=@ z%srl#TWsb&B@JvBPG`9N+dqujw2|D#8bM}xB&0!-JLB-k^ za@Zmw8s#fkrsstC3H9C{Z6Vu~Pgp5~n&j3PtSR^JS5aj;=#ZX^De4P5X%UuowL&`g zPvbmsf&9HPfO@=oF5{Jh8LbrPdCPML)0U--OX*MJ@7|%IblbxN{{cNqjYLsq|7pU> z$Q&4)QEE_wChj0yVRd%6ZaIU*)47@Cf1&_o%qHY}Rh0nH{jCDO3f!uoa=j8DYq9GH z7%|eAh-0X91A>(g2$-O~15y(7L9%zaTZ3UOCQ_r_#2T)N>UAo=%NwH83d3Xb>3^8M=i#DuaU8?HqVeGDu@r5$X)8 z0Re;--XI8)Wuppc0@?_`#=9!K?CpGZmi~CR=ZCEGLw5bEP(GAgAQi`i<*OzB0gYz= zt5KesRebu>h+3|e0UOXd>tA=|J@mOtEPL1l1mYV*(T}G?X9(l6GRdi>;;r4U9Gc}; zD3!yo5y}{2;=dJrEii=Xp4`lDzx=BAN?g-wOP+|Ij<85+4RZ<^jqjdPPC zf&*ZU64RVlcP7q@n8Px06Y@OhLw9(WH?Rxu3pz4Ds#J^|J<0pc&gX6kJ)QI1xg1&D z;T+I?@?i`-X$AEvRz4X$a0F*Bb;(^&O$>1@X^fK`zK}ge(3F(x97p-0zy=>s1YDQ2 zPkovIZ&HCQ#fhv^4GDcUGqD)75CCm^!h6EAT`$<6>Ai?&V@yuk zvRwZx5Mx;iB7n1qwsEb3lYVVuBby8r*a*>k=R1x&zrmFY8P5YdVB2x_5lb{UyV`XT zioo;^XKy_FZ=g@AbJD>x0hzvRJN-KigGUThxdx9tyUCpHic1VM%t<2IdFaH>=6I3e zN53C6s32fptA&Uf<@X`;^vbcEj(-m;z)ozBl72aEY&ojSN+uR3lbg0Pj@454iSD#* zXTxHCo_i&AzODf9Uy3cK^+hLTcd#HnB!({fe}0FTjQU0eVfm(8Amyf>>Ea50 zTf1McYAwPWS_2hF)b=Ri#-;a2H78zVOv}jYPID#TQ*;Iy?}^HI28#N6s$@Fwbn|fU z@R}!(g*q%SvVk)0xBVPvk(3b{=QE87EZm=-_R6D8a!N&-#c*D>xXtAAJ!R>g|}fNBJDAXJE%` za)YZ_W-=?I9Z=cNYxE*hftoi=T3Y04Lk5*ek3RCrub1u0w8m=Myip;D{zfDSK?7pwF$(eiee>vP8ey)-s^0)jlgWH}f9swKieNawjX?&RjgO zIZSqP^D4xXe*wpuwR3LacU%zT_j_{87{eF#KhHrn?0vrcDi~>7{x|ud_7>22A&vGu z2VIUyUfM2Es|B>j>`o7}tu*Zdv@GsfUbjzET8<}WikyI|isl=8TI1k?KAUnsU(dgC zIM+V#YTsKjlpn8F-z}}S5Z~WTC>;e|(>3_O0w@^wE+~N_b?@ReSD}WMmIxgn-m$y-icgE28FqE1%E@*wLX*tYUk8TM`mowkI#M@+_zJuOlR2s7kQ@U`(|rpk?2PvOp~?A;X=WKp!v-EC1a{IFxj zd%W=55`4RP$4PJjXa*wqMIq~RNl?(ne}AOcs=>q&^mcZ(II=r*Jo35BLmqh_?*UQhw=G!i3F&2Nh1(vjD@A$} z5rXVeG@sNo8KRb+f)cng$n(ib@hF>mdP>XfXH0}f`@4ry_n0P=vML1#8eJS2yI#(1 zS&bVcc~pU7K9A?qe|V6ejW<&^d&L}+p-*2dH5WZDCteehQ5uT5;G>`_XNfFDG969U zW2H6?{%AE6yQLivZPr7rR+m(ew&|B|g)%gBvApXaw5OR))nBk0jLMJCDrpin@o_vV z5M(ZSc4Wtyr#j9b3ZcNY0AS#2vz6OXkE1BF`6G6fbRQ|}>X1B*U2e4>mkyB*-b<|y zr5KD&`6K7DO_01Gf%W(~sh$)0Vk+iE+pAADg{fC<6?mUKB6?xS{EIp({SbzFHJpbQ z$EVTlv~g~uY@YJOax`?Db>ozJoSN}aoXqi5h2-Bn5pp7f>n9d-_XUG5zSx(MX1l^rAy9B;VjUHl9Btd2YE<-qiv3kXy5XR> zjuE!=`ZB7MdvCq}8$Z>R5z*(CpMJ<1x~J9t4*xbPhzGQlF1og8T(#5Od`)wW*H!TY=JK5?|*YZ3)9hRd{jVcoAJM}aNr8(A`LeQZx8s_f%;YGoOklP^I7j6 zi1>$O^0>R^Z+*D6^*-q)yS`qJK3VBN6Zbl21HrGwiDtNsq`7BuPsJpR<8R%!>#A*w z9pCkuqZl>%{Y~R1e}$n=5HFnIQ0yz`8FE|r+1UpAzE{#M=O*t`p+F^vU+7IQv5%ZJ z#NQE!z&J`$&Vlrt+cUnK+ zFGmkhGAZQoqxTswBD~w38uDp$t!(zJ9%a?ai7HT!PnTyWwDpgVPQ=oA$%7jtv{Lw{ zNZ-yn=v7&{gSHO*m5oGK{4F-=E(fU#Mop^R1TH!Tn}6nl;<<@J(C1Bh((D%u&rb#1 zSOOZGJgNu|?&P@}F0sR(iv0Xt;7Tv_L;VrnnBO7eINQgsrhH;SrXGmG=ekONOB&Bw z^yqg9jQbtnf3Jf5Fe;m7^nP*;{4^h^Z22tK%J#)#WJy32nQ~^~cPaIl;%vcE*S8_` z{ovX`_ow;$y>YVV7tJ7SHh)kbvsiL+_JEO%&{JY;vdZtg;TTL`e^o)^rE*K%C2)hb z3#iSK_oCq%{YmYHi(k7dPcbi{7wCh+I_wW@WGps+@FROZ&t(^=-M)E&YO?$;Uh@fG zjmsp|%JZ+aX-la~g#b!^g`}5M=gIYAfNA-7mrz_Mmzr?kk{SzKM`bi^Mhi|p!N*@r zFeMZ5!rl&NFVy~p;Gk(nfJsVd<;8Kg93fd{rrfeidk4OlWY^r*Q(C*$&W0Om!#Y=x z_S#D!{K2;(U{qo=0yheObHp=cQmY7@ck@C$_uROo_Ce-wlZNArI#;G9YXc=iRM3F` zGo5e{WHY4M`nNFM%F2^a7IH82M*e5;<(OaS*DZbDfabRfJDCwI+k@R(6y#`Qig@4f ze6Di4E)hXO1XMbg6qfE>8YHC~Q7P%}66x+(mhSFYSa^T_-x)r@ z&cN{D-gD1$&J&19*ZTHs^sk|aNFSxNNdpmXWasho_jxm6klEY`VJ3R<#w0502@6sc0WwxGReK2SO$~#z zO3)!W0d~qBA8XjBHm8!giAL-#MyYC#AXhivgkv&^}0Q+gSHr#7UJp^DAhF2_gEwfyB1taD)=#v%J`*LiO#6rrNA|AaMkSCRVF zFn>hCO{;#5CANN;LZep;W7*Q{yg9YR-obtd2TY6Y`1Qe?0j?k_ObMS^^I7{U)5Z11 zw>xzke;z6&&&{!|Y<}|mnOiu;cAh7Wq!_xq)3&+t5)EqRIMF&QylBJ2cScL!Ts)>3 zyRx|{ravZP1=63@MJEV0?!@%579ajjrcm*0_53KHuDhbLgcE1FtBubQs6WRFGDKE5vPjDK`#v z&}cjn_ke$&E-V`jO<4m?$=SsKolg??ViM*o8B?&Q5!Cxq(0=cDqKB#I5}A5bDd9X3 zwd*_Mq#!(kG>Slb*3#>bg`-X4JTlbVDKDk*aD9Z9Y;b9MWPdIvMqT1YN zO1AE%bXKKwyYBbIcSUAeTgNlY#=0@yV($H4s_&}UkpU=!eZh1A!ue*{R@*qF3X9cy z6w(~MjaAFDLAer^22P=ij81d!WgPS9U7NLCvp3^|wYOHWWBpI@)XwDSh*l&bka8%V zZk;2=sZs1vGracXkeMQbPzZBZ%*4SO<65pIj@v_1*h0NVyiGjqUKL| zFl;3^EGwS{)eMny5Z-|eCi{h|BEy#b1IF2{=Ly6-^#8{E*j~gi*~^j5F7ok>&@e20 z(c@*J{t9`G%EP(oT-@Rbh%6zOb8a~j&_;@*jnyZZKY9#4B;@eF5D{NIw(Y-8X?2_& zd(zlCKu%IC`~ee@x9*#@q0jPlJH$F_S?FC_?qYtoQ-s+W*HV-COWS&JsAzkT!Do)ELVwwkueeZQ{}?ftOJ)x zERNXHO;pSd=p7dC$f@3u;5w;}a~9u=PHhrxYUv4={3Nlya$)HmjdtXkdJNVuHXQ`H4#mXE7#Y!G$B5(7#R3C_RH$Cod{?I`gq637Q}9 z_Tf+J-~hYD-hd_{_g(x;woC@oc8@Biy08eQ+ZMLMcxi^E#vVw9X!+w^XwiF-U%qpp zXWvvQF0MNClw8n>@aTShJ5$OvP?{Y^7&DxdY`?92S7N1>Enh@7Kl%z0FdA|`f|28y z^d}_aX^XZxu&mh}3aC2$#X!MT@p%+$^Tod44Hl!_5W!{Q#U_z}&#MoTo9Y=|E1;11 z#{o+duC1=cLgK)2>4J?cyzHw6Umco^rmd`3=@NY{dPNN8&+>`ZzL_{=i%dX-wgclxCVUs2wZT& z2&?9>M($a0E{LuLk zg4P5@sm=%|rov<1Y@6iY$97*e3YF2XFR0Vj4VHbdpdo)l6yC|^lm!0l8>FT@qANEtTXsOZ6|tisgBR5Ihp&_KqgM4x`IgBwO@1R*TGD+!)z2^Vc37baS(3j`+UBY^W1sQnU$6nOeE-qKpf9c*0U96 z99^7Dk57F&3(Xkt=kuSwD=s`Z5r@TQa)3v2c+Z?0J5tH;0>tQN#A&? zX7=PA{mb>paMaYSKo_Qd`hK!8w#_1HS~MMS)7G!FKu=9CSCLpME2F<7jW8zI_Dri; zS0*AhNxc4E)K{x`GINy8d;4PlIUW_ecNwI%#(7@^%QR-*?b~slP%3yZW2k#0{w#qvPB(;@}xahseifiyt7U>zeVK;3T%*0#l~*C1b#oP!lLi zEb)cfIF8Z-!wdDp*MyR@3!!$MuYUfhpLKQ>oqK9--HPx6F9Fj(W`D>0L69cY?CEau z#kA!ug`C2De30%d0LnI@lD=J0#Ae{FaEy}K5dKKu7v(({;aUV2{SytO8J58+8wrXvA;8Kg+L5La1N&f_DF>}z!X>Z4C4Q}^$vm%D4!*~z&5Zv=Tr%^$OW<%w zzq+a2L?m_r9cheXh5P+NGSdh%Pwl=!=hfG^38V_+^y7U+-i`B{Zi`QD+bhBgAI>YX z%yANa57ZRc^%L;jQodqv)4Gb_f|qf{JVZSd%8aA$p-wLsrPtd=l^@H!U@H`-)UeD! zHR^3~Q6>!3pL`RS5o`<+AGNBjNKLMT#GflNpRO**VYYtFg$dvTIw{b~#Q_x-3yU@f zX@k=(&d|6C5a+}NS-u9Y2*HsMW(t=9>NmX=+g8J$`%R#aOiPCr)tzq5_$I`^?t$x2 zU0uD>UyM?+L3&pXu=N4K-a5eO2Xd=l8G5W@=r_4M0h+E=LDMYDN^LVj5046iR?Ju9 zhx({8;N6~y*hBW+)K|^<_FUQ-X!X4dkdaE!%e3Fy)m!YFIeIxobsi)cJy)vp>H~U# zL7oc>+Nqkcjh?*|?~_E`xKxrPXVf&WhD(ih?ca-P`p37SoA$cceAlab7b)?VIMsW1 zf=R#KuT@&A&G~FgPx@w((!S+%FvZYoHzl(B3=E|~yZeCaeY>CZ-)qnkmsfXu6JC$J zysU?bFZ?lKrk^0*LwvPH-zXJ~S=l?MvG+afzKth8+`(sGaqc}AD?x~nbT zC_hH-oz4x$w!CmX1~qy$Ux-=IOAs@rxg+@=udnjmFD}je?)xBJLSs8VbE>(mDl1BP z_a)k{v+dSb!}D$iId(z266zYqB0V?as|=TGd!)4~3bC^TLnm`9cOTrTa`G@H=!8Ql zj!aXfmbr;^Xq8Ru>{7ahiwvwO8C~Bs4H~ddWPJV_`!v<$UDDu882X9S+0dz=7q~M& zteXVrgDhbz6jIlj{j-31S6#R)Z4#=Kp1MXk(Wb7SGT!U=2vT+gYZ1f$1P!Kv1UhBNbK0=FJIQ`F!u z*7<+Hao)sob@X8C-@0C8W{~@m53}rP!HwPeVhIts1dC0cqoC#>!KNsu)*cC0SBkok z8jVR6*=f-`8@I$Oa)x3Sg4lf@Pf@2MKIiZ(<%fmW2P2+f5c|I7D}$k^eAzES3x>k@ zb^EGoj_ihYz(`0<>Z72*kAx(1(tTF)t6rQr*t+j z62J@urFD&|&afQq0Fa%qYk3oKli&huxy2SwV)vuP&f@a6ufU0VqE)8f2^jJL5t!A= zD7ZR4s@$l;OoFLNK_e0nzpP@}T>Y9bcw+DV$6N4aTA-#ToqG(YV4RTo?}R%f64Y5 zAH2*7U9PK0K`phMUUr@~<=K9%ZOD~%1$+OKLA7P%MZFPR)W4xwHsfmIhy8-Qvm(~k zGdw)JdI#cnST1P+H_odP=<_1lV9M_dk<`Z(yQ7u!S>SqD;2jMnCy7N!*A}+2u4t+a z{8zuH961sB_3lUSjlZ4z+*K?D4)f3slX%W>VGQ)6I-$-%%Uebk#szht2{6P^Opx4e>1PdV^Yz z6M^rfzm7F6EiV0wYTCQgRV*hxRP!W$RZk}VpgDxu5rR(nCofsD*hNiuPxe}ici=hP zSNj~h)pbm`r#8CduT}VZr@Dw5zNwBwMKLei(76B63+rvCROu#RzPWWOG?acG^LY5(lYk|h%%{Ivgr2}kAo!CWI9p;KET&HX4`S}AcKm884T zwGcj>cMXxcjiiMMf2XLEd4n@#mK3`7y@SWi6?G?Qd#WGpTCSTqrqb>?6rH+FUL^~% zHlw;`aXuKzgczs(PVu2Q1C__S#aPlDe-EXw>`PoKnLvfJdW$4$umczBg&7PDtMXyR=x=5py_yKYEr3f+zdBu zhKG{HJiC&y9dq>9oQtLuJ{e#yUjZDJI&8{YL;ux&z*2|)ZADE^=m=AXZu~t$2=ln- z3|C;J*G^Rn|Ht0pgy4lveXolubq1;)6I)(ZaY6F6&Yn2SV`5vQSi!~CmBBA~0Uh|s z&Zb+k@v63D&z^8^T{?bVU0RiS$&vG(T=xi5PKjx=qp1FG-dQ^cG(4O3h6hc;Lp&|J z*IaBjvkS3G*+XlTh;-S&^DT zRndp0&w2*Z&@?X?ZQh;*QriVv1KGB`d%kJg=R#J5?I8Su!$Mek3h{LkNgBllWmHh1 zJz1|?Ap=rZwvFR1iwoDcx=>owZ`&y=v#jM__l{wKOZfNmL1NWa6@tHN8JiFbT(o*< zg88f+hhO(pZZD>u_t(ioVr`#*>O&Iot5|zbU9ax(g3$&=E3cWuf( ztbqK%CE07?xwCh;BAU53yKX^X#R)7yX3H>s86U|H(m(Q`Il({ltF9x4$U@z#q7fgP zMbb7yoN?8m*WUdcGs!&Wa69V>K0F#3nSh*rR&$s?E4?f|Z`Q|({VN|19@ z&fvix*6@_W`FR~^;~TqGp?Bpd)gF&rB)BbC3pO{Mgnm!}Os@Yk*U3{(0VYUjDl-r% zjFq#t-_+dwRNo6)0}8(9(nNw!tcU6<_fMW@QUDbl4%R>%lCfLvxmz8iVs2=f58YB{ ze0gkyh$z@Y^i}31Fka;388T6W!PRx;m^8|V8k54VQbXh7^|afGf=LAygV&cS`%{G9 zdTbNPcATOmB_uY0o8}ITb^Lq)fZO{I;2vy63j6tP4kU2{v#l#f=j$_JdhhSeDecyk zlr|-sGj2YfcV^dXlimgPepko9XlSF}2$+vfBQ_tV^bP0CaVIH)m?%V!b%+EvDfGd?k;BSpuX+| zB@lLjHfYLc9{tkd#Q%H@=G2+cGmc-7c9{P9a;fq2?PW5(t?VE1iS*}r{ry@_5+gPd zIB#qwERhYT8sZXY-*dM1K3eK&1fbvjDWHX$4a;caDXO6rJ({A1%LKN9lsi zH{!4JV+JQ_P0xV+%%W4XUox+1h&tW)-1qrvn9qE8`jau?0w_qjC*NC+>t z9Ka(0F5gl~Wh)qxW0IpFCB#(pRfj3j8z@1DY=@NJf1gp5Ww7`rflo2k^VGL7mFx%0 zv?LbEOX`9H$%d!RX2~hG6?%XChx!s^)r6&Vs0U&0`lH`lc*-u0&s-jgT=LF(TAVM@ zC^XtfMbY0+&dSs_KLm@^B}-;*PEqPEGkf^SAXlVYB1pz{I0Jsum%hK6T3Wxv} zfxuD!mn^Z;6HVy>NCF-1t`3O|W!DbAcyMf2T)jSO;;QK-^BHV47hItkl-?G*E&)N_ zXBQo6AlM2&SC@Wv8(xZEiZA1(7A)G$2J00OIG-Cb#@fyDI9o`NuaG$MR)*LHb}k;DkFM5w3TL{qmfa zE5s>FdFvG*!f5h5PZ^bTzg!2r6gc^h*SCNQ|N7sU)4zJczLfqg%>F>#eF5&_b9`~L zst~(`+#|eRZhJia34^g*eVyk_&Nm{HQx>RsBUc(!!nnkYdG@E;xzAi1HN3UH421(Y zEnQ{OyEv}a5=^+0vx$o!&_K;3kox{I!dPh)-g9`Zy<|{!|o$WnQDttQkPcbO~r`C}!r=8Zdzoh<19u zMnd3}!KcW)o~nG!J5*Ek>et-AZhr|O6oc!KC ziUvtkr#`-Y?t^w7Zg!Y4Z6o8fY|#BtxSsLQVKqHr72hfhx4*K6Z;7A-@EyJU`kk`U z59g||DDp0LTC|^LrFv$e%aj!GvUHCfU&Xa;CP>bzC&w7oLI1ul^|Hi-Rq-|6PY`#U z*UpxIbgrpLsFS5-0>Pk6!h5cli6>eF_-uWxP1M=%I!!?W)!Kz%;{EijyngjzIpGU+ zOih>U9a9}pF@L!z_(wU*yT-!VZ>jJg*{vr(_9tWi&bmU%XhF}m{)GmxB2$>7?bD^Yoe{vfp#4*1dLm*rtAxj%u)jU=dyj&zNA_IQDEW;EW!Tp5o z^~3X;KIr#PQS#cVfk2usithHCYd)!Nud7YuLz%9>;b_vZIllpe6bdd@~_3(z@w z&xXj^o%f{c?UjIquqx6(!1tk`Jj6>@@HRnv7XmY_)dkcHeM?Q31BlCYaU*J4+D8O1 zenoBq)^E}hVq#v40>d=_uEE>?u0cW-TpJ9X(eEOdum3y@W+Yq9f;R@&`8pL>z&agM2Bn=WWi10IVSKdliBi4 zV-A%_bLZf$D{N(FfNPH@OcV8$8Gl4EfK6~dp7u3}%Exham1}KCm$`l~@_s*1Oa!0J zCEEO3Sg4Ryza91y$0|(U)I@?xUensRrE%_@Ua`Vrk|5KWx*ehLF%}xRLN&wK#iO{d zRS3L^SH_7u7;&JpB1&_4-j#qaBJo!?MH~~C#)Y4U2B$$zR1|v5M4~x1gSE*Mz`1=b ztgLZHHngcy{a_f{D2LQd$s|3?5yz_Kd}o8MOvd}(F1TdIv(?L2==303R8xH7oGp>Xy?}fxBz!Hg`%sgVeOWp>exn6SFaSV%3jsFXGVwLFafT z;qv*dMzHkLy{0M~8R6GY8-4YK%5sK+< zr}8enigk_+ap?U~bo6A4gxvE{9sCAWG3KZX$~>XqeQnwLsdj*;Bn+!SG}e*;niqhS zBqHG;a}6}|RP+H%WZ}ofW^WL`^0sQoQ^1pS%z3+DeG#*5^oA^i#H({RX zqB1Jm?49L}o5O4j{-t+1m#Rq#vqit8AE#!Kmbb0_`zWj;gi;-K(!Gzen`)rkm4P91Ttv2BK@&UN0 zho@QMg#RqL{iUU(9=Z>;3~!O+mckEPX04T&$uK`lLWC;d zo`yW1rS(1AXf2oWxas14xLFyV#DY;GMXAYQ0)IILt;SL@(F1dD7WhCF_e9@R-lJ3M zw6C><)B?Z&6Xq8UaVOZKd4s=T5wN)iD!w98*8L%i)`i~HBc~Sda-%Qq>>@J9aiR}R zB+)N|?#0pwwu2xYzM~_S_Gp*Bn_i~cy?{z6)|XDA&qX5D^6XE+2EL_pJ=V~m+;C(i zjbkx$)5yHxsSD*)Zb>Cgv%BFf=(T4=ia}*tuG}Z1P0obbLc8`1J-xXToKhS6alQ(u zAVpqWhi9Y$55;8xSO_#Xgrjjc+5P9t=M}fJ$d5_g%Qy5~GhuODzedk+hoWILTTWg_ zyA?QPlE2tQ?2})M7jAvG(xj?iE24rpL-w8z>R6-!QBGAAQvudtrINip*&P#-CC${S z*wMT)YohE4{%0m6L<2F7(!YSvp2bRcya} z)_InR2rb~EZ@iky`hAyL&(kr`#UB&>PH!z{j^<5gqi*aV+ws(goUxL`IgP+_O}7^T zhg2W%$(2tlZJun+*ir-pWGHBHh9MJ*>i=@xgiGR^l*c<$z1#MTO{T@W2?u; z9ubc3GS;Y`4d=+ntaf&0Fh-yL1G8b6BK)@Ea+d#*C?~7_DDNjj{TO4xSW+6mmjD)K zspNnGAu#?Fk&yTcv{4SgvO&MiM|7^3-u1~;;(|TS-=vsn8Cc>F3Ye7B24`dXYW8Bs z2YfYB3e(r?y;7SlNOrgL95tQ%*lff&D&I4nS)*B}QmbC-Zv!?RX`=`(+04+iC~c`c z+g=dQ1HXs&91OcgZRSj9iF4U2^wkk${OlU*duhepc4O)eKm}k2aPuE7-UdEdD+g>5 z8%G!FM6J^;2>&4lrvDHF+q{b{sAgu(*nP$bCNbagaG1j4e(Za(qwp`#CaYW;xs|NL zT~^~Ze^i&O3sM+F1EItC!=oaP`=GAJ8v$u1L#T9bk5?m^_A6p5cMb`}n|sQPepXWw zp_N)!^5B-FzewH!adOJG2AHf%xV#8**y%>Wl{{xk?*D;MSLqAMfL2su%cR0>Cs3vv z`iNKt%btjhSCHlov91%l2gWiCeb~K!gMnA}7kvt2*qJXu=$)p91$nXm`qQ`552hl) zUS0*CXld0l7C4sr&cxWYUP+ax7opRXpnRy8?}@qs@#h{{KNj!^1(7`5j8%&)=!Q1- z?G2p9f)UT6vc8s6nv{tvuvSAmK`@>rNRhs)oK1pTl1mfyc~flkl9HYbf_p}JM7%c` z@6SuC3efyYE^OZUVhg42>N%_pD;;o;?CE8F(vmc>Asgt|@LlGmtmN-gP+*^dh5#s; zk@^HnZK*%SE3e59&)c7la>=n~jy5vgzm6-3oce%INS~V1dblZz zb}j)*Cj%lA&SqRx76ecgY_1Zo2R#Z4*aGG}q?!vvoK5WDb!0d%)mR8UoxERm00NJy za_bB;2}VKzoVo@+4zbNjcEhr@{)NM)??0_6E_`DF0ZoCL+M?@t&_YlUno&$-X(zP3 z{2ZFb+4SB|4j>CQWXmjHchA)UoeAJA2vFdF!>>9SOxAeDg2*dH*S+wiy^6FflZg?H zH{$ z>TTz4<2_b-XQOtULjy#NPc{=u`CL2%sb#k~BaD5U#RW&}eXDuu@-PIg3Q_t|t$MHo zh{jfO13L(?EICrCqAI6ytHn#|3q%a0-Eea||8N(D&Ts%rFkRio?y-*z7+C2m9lC*r z2JZ-xf8Unpn7<8vc^pxNh=O7g!H}`P9&6^K#JqGhrn(fbhm)}@K60|0d&v15n1-7B zsvL|7&{d04Mdz{5VUzTk;$VIIh4&X@a^UlR9aYcFFl4GXkpQX7Nk(t`mPu_Xu*=@l z69fC{SwDV)%;>WXvZJ_@bR%thaP3>%L?l?!Q3of7doFl{K9YFss92H-?f)9#;*TN}BhG~?4mBnaD(81RoS=i6% z{Fdlg|AUx%4DaD|_qj?`;r>hzHbB9ahtLfxaY8ZiyEke`wfK&u7Dc_5S^SzT! z6op73J+$%2qe(Fqa4c+>p?KP;CTB$v)YBlH;CX0$Y}mM^5+P$?O8X!uF^k^uwYiO4 z(^AqSdi%YV+Vw19CFKQejPG6n26=%0;j86O#z;X}q<#T*g zjtIsXb5kLq1^vEb3I6sC{`=^s>uJ0H*>??`StB_yLdVD)UUi-iq~gVr<{SaOg`if4 z$P45cZY_a1GAXPv)eSEg6?+xuHC!Z=oi!!pqsYSpOZ$3LlSD;@aD#4$^_;M?f?)S8Wa4FqQVG$CR_G(A_=JYva0_2xrdx9q#wUXd~rdp3&rIQ!1J zBc$M{R-fCmt?60A_D5iz^thD-pn~~9?$!$!@M7FAkX75I=NFT-rL^9^_-|=YZg^0} z|2JPAzy_}Fhxf4ab$e;)*1OBF<@=jR!ZyF-i~ZrO;d=O`ooZMQm#!RVtwlg63C{*J z{M>^{u@Lnp;%%lgf|lXzn{dSVDFHw5U^|3LG74KdLX}Gn(bGMu{1h7L>PzQnBy1JTEpZ z4k}`MiSgral^7o9{>wnUR)g*o{DpYmryhnJWp+{~rshh&{Z%vul{RCIS9oSFHmdMk zYlVs+`K;rlD~xiRD;$J`99*weTVug(--F1#OsdIP7&&uvWX+1W!9*o5%TMPj|8TlC z4Zq?{K{1$G+v^RdCw1{wy4M$ytbB0TBoL!uPwWMC4s>qlt}YZW6*!7=HJHcV0$) zBU4D50EZmN6BYTRePU=(rP!bjsXBd=$swHMp~=|SZy#vAVQ8l9SEW`ainBLk%i1{~ z5N&74+d5}7`SidT^W#nckEa&lXjH%#VY80p*YbbGKhu3_gDzN9KRM~pjV#-D@H--z z*WpU;tgeHk8%JV3*GR@BAW%{u)W0PbchL@c){zmUW6Fh8DF5THSC6Mc3+-wiJz4 zR*Gq5e>&D~YJ|jX(^j*MYE^?{>>6V>yqr(;_W83&WIU``OdtUL`UW_?yGwu(r^0dD z-4U&!Kk_nXxxo*qmBMX=D6vi_e!1|E?mzsG@3UF1dyvm>T!SZ7A?{r&y&p4roCEj0 zSrtC^NA`xfw;?rd|b-s^4FG9J$w$0v)b z(+?+j@exjZKhNVR8to_w@m$MM=Hi%R+bLdpTI`x4s#x{<({#DTXA``pb{Sl?HGXQ9 zXjt)lVE(M~fFk3x{&S)B)o-dbR7I}5Pg9gS?k^(8kjLkr_&%ACnEl;#EP&~C>8CI% zWZ$||{EE2MNy027BBWVV@_~_!$k2SRk3c z=o+Oglzkrg*hsqD#Wp82+ap>xEwffVr!mPdG?Q;jQ9OFhvR zbCGhf7iL-ez?!t|YS6HSGX}S-_qp7gegKf_Zu2o5c>{M}M&2q5+dr%U6DeA1Dk=%) zA2H!qxg=L-!tDP6R^3Wi7D}OcWYCe%zlwZ#`g1gA35f{8l73htyk7FYxSbS7J~1jN z73Hggcq^mtv!G4|M(O>+gQ8U}!9HDKY`i`K$SsjHK-aP_ECS2^QQZt8e1iY~J+5-~ zn@Nsw?e(Mv>9vN2bd_~#oJ(T#WH80Yo@X_0wmyQ`8A{Bdt`N8;M`-BS9qSwy?$0Ed zwAa&}bOAD5p4Ve5PAv=RZ|I14ElLg9BouK!ZK^<@p=u2j3brjBe?G9F#%k1EQnVzP z*i|K`ZbL@IGxi61(BLthXk2EzbBT`hNDfPFq-oh2`#e&tk$ywk#T@=#$;I5&jPb7K zh1lDg=J6>p4G{y1(Vtzi9x-KlSGICxOd491yk(Xi#OZb&sk#;ocM?GV;UhPyQc!lwo z@2-17f+wa%Zk|bcrpbVnihAj@m6B$IV;+U=rd5H;71plO3YhGUkL1%JH|!m*7r}2> z#mA+Oj35AFL<4#~5u?dX14%vFTXmV1>IDdU$FHb ztgvu+?RBcgE*(_VZC7m3%w!PTifzv?r;_CN=VHm2`Op%8xBnQ4IoWGhs{LiXVff0F zrk)Zup))!`knG!sT^}uE_&&VKEm1Z08^B3ytPAV2`>z-CqM z!CbM&$}I50w;+|Zywcl?kCL0$*C#`jSt2U>$8A9Q&a^JO$MazK1T_p9A4C2onovz6 zwC?BO2hezK>84h~gh*?d{<5WC4hY(#dog36U~WT#q#ZN{xai&@%)!@Uwe$)i64?z!1DKD_|p=q0km9TeHxR zi94dy>*Q^7@*eiVrhdW_VzldB+6G2`oD{uw2fu%)e4s*$a-N(*+`Y^p<+L0KUC^HL z<+EH=jqVo}ik?qCE{4R;YZg1JS}rYtFnKL|_q^39&6_d(H$9ew^F$WGUa4?O;$}FY z#_10dy#u5IcE>HJTeJ3nVTAn=7473iH>v&o10bE0dRqGL0(j4(!GW$D$GsILgG7?n zW&daaak_OgZW((lb#pTwd+d8M>>b7p#mQvIJkjN8Q|-dW9apYI(+r<4)`CMdRMm^EK9z6 zr_AY;C3p0iC}K(Om!s&x>%iXy!YDKS2JWu^G`%Guru?(c*75qZtCZr?RQbNVq7567 zAV-PtEAtGh#aGegi>SA=J&nmWDQomuq zMkil_vUC?C|Jc`PW%16l&%~{h{T(v5@Kl@6vsp1s|AT6!k5PIV{HiXpn!XN;0mG&< zNLV2L%U>!SGMJ69>D-Hhlc8-dXd9_hWUoBMogu>!8;=At2Y*w7i+z z1L(uiR|=z*QjZ~{ecUff}i=-;gGv8YC z6t-w5f!jYjVkYb!yY_7`REh!yK{o&|v)LVJ%U72lk;{({VeZR!yQO;Ek9v~=Mm*>9 zz>3zK`~80_+E0JPZOF{VPAC2q`}M=q1n&Z%*q=h90CDu9f+Eq4Cre2$CKWwd2qhopgd07wa89%mUPF@X^=`S7`*Yzx zAv6b0wnkaPp}HpvqFaNIl3AmJS!jA17b|(oexSd5@IQfpv7&>ME!G&we=iP!Pn^3Oc#N6*MYL(Z za=uz)A;6ExEg=er{g@m@$j(6_wcgZ|xlg-=2Sx1bua5_Fzu-s`?|;4IL#^wo{hrA^ zn$e|=6^C0l&mM$Le9?zCq8NKL-SJd#H`Cuk(TviW(#<8`q!`OkE2C=+k4!HwAJnh z9@hFJhl7D{+)@5%{liE_ikF|d)mlUVCpt;ABmOhbVuNtj zyz0K$d@WBqcvDUJnT}AbHoIB>Jh^B>_BaW1xDI4xkYNCtKLnfqt6heMY=Q`|{=(kD z+|6g4J-)&}w7?D~pfM|ynJ3?zI+wSfH1S$qGtuNW`!utie@enO#aY1ZP0J9}zkC3EOVevjVbOWKj%}L2gY{bG$*PA)ZwItKR&=u8 zQT%|#;K!l>fr%Ygj{lA{W z30g76;?Kt}9c?4l6elmocz#uIrK5JfqE_eoYL@d9JO8TRZHc5G-yfBEofqIgp~rE# zX2(9*@}D*bwa^g!u3JCQ{mvpeipo*PMvp!tBFCf`Zp`U7(P$s8Xq0G5vgc5c)`XxIM;;nUe4E2i}re-Pef>54Ku zB<^?xQzbsHfkY-G5CaWyW>(Jn>3T2d2g{CAWryiFK@Svah|iXu9N#_fqNk{h6+ljL z7Gm@HbL@gE%d!z_Irs-k^hPsw&4icI?nRwl5Jkhl<@?UE%9`7@#?2Y1E*BW7vDZFv z%VV)EZ%dxQJ16`ggG0A;r-YKy-7THc-7$2hbcb~Q zx6kkWyhn2|Cv&j(J=cA$wZ6;MJIbK`rm}#=R(X-j?N~WrSeL(EV8_zhG;*i1epWwi zZ;8FA9kO>lTkbZQm$!ldfkLQ{5k+X{CP$_u*?S1R(@uH@CNI4cn|gs*h%dc1w{b6OH*l zBLUoqF!A)=F@|pKWwjI5WGbC3O9(w1xHOBG-O@dcJTk3EYdLG-%pC^U8=jregzI+2?==j zjf;I=+#R=4_O|k!-D(F*BJ=I3IjczA%p34%Biyp27jE?#xdeyq6BcPDhx_L0#UNdE zJ>!`HW5Q+g(bXrO=0O}55is0;Eca&!laae%r6g5HR%lNU7}munC3zPVwl^|AF=IN} zaj-Hv@PT88V4G48Ux>s|v2s^_Q*(b7n=?2j7m;l#5l~S6!RB}}sG2};G$&BZ#G_C9 z)ctMWde6w8pr{+2=hF2%1yev7Rss6GHjc*oLblz%Lz1g>B5cuha9Epm{>@Q?A=cZ$ zU_03(0;+iHQhhd=OKI#O)>q^ijP)I?3g-LkQkZ#tEg=dgFY0$J^OfjMI|7?a?U@bQ zZtE2N`H$rt><0)#U-E_nAvp9c)7A^-Dp-o9)m)3Nn*>WB+%RN-mGIABBP=Yve#;&i z)S1Le0izud7HD2s@vC>E{!k*m=qE?~SrUYC_IbH&;rV?=&A<?QO*EscjQPjin0s^1w5bm#JDmuub(J88{}K1@CuJ#7JeS+;f0 zqcOiGAUt@MR_K8Y{-+Tw%D?|_-9l{qarxGJ#_i_ezGp1MUR2oQtZN{8-Q#Ytaex79 z+`cU9D(Qi{aV0=MI|wmS2RzAKZIxJ+2;}fT7*lHY(krBaco?0*XXPU+IgKPX9zo-F z;K@8&d{!wI66UnGn5mM?X>_{GAXl;ZfNbac_eQZYA@uQhMOB^;I{1+i;qXKCfEi8L zpl+fF%^1M~ve0IM|K zjCa7bT{tQ}>&1DXc{J-q-A3tNCSJY@vc z_j|p7O5vbXyenk9IHwH$s5=w9hY2hkF^org!#8^)q=XyV86a72dzJZ;Homb)5BFW} zn(QF{-s$VoAGQLg)k9QSM}JGM4(>Pmf8K_qSt0p6ASROpFmHs`J=HOSO2k#})yO}X z>_m#K)+rqdmDd@0$Kd`IBX4ye%f)XrpaG3it+}qf%(kM8z6Bq?KXyj%+7ZLTSfZSC8fBHF$?V)jm;Up4yRlizV8UyW6}5)Kc%Gtl++@Dg2c;KcN`_763FfOJ7jj` z*Iw!Tdc>n-K1hajxxc7>7_E0fZyu|rQx??N3t!?in^*UOl0npV=B|9^FIlaoZ>i`& zx;1%MymRDEhrL4j>18vaPOq2VK$P^fz*?fB=*;UM?i0wcKdpJ4+4?mzTW?fg}VS#IGi>Kq&d9)#qj2Gp6$P<9Cfk$F;UQtcQ5VNQSI2tfKf*4^GTM{ zn$O+EG>{Fv*zRB4I-NS5Y3Rk^p7|oq#8oFI&pHa*)#(r|%dnNturltcZMxWf|MrJ{ z#UlXC6l@WX##8`SVzRSUvM2qG_4dz-`pB8s|U{gOh`}j4oFztTc+ZX*OLM3 zHdfEPyqFayM@tB{aCwk;CI6X*d6z${EkC?(;03=yFrZ8xqc>alS z8*O2|AD{71?jB3SDpA7|g1{r5;0X9jazkW{%=e3pVd)rSc8%74YeQ#*yIw23mk2~I zRemC5NOrd_dj!^d;mLxh8$FsKSRKWx<#&XZ3CZvA^)Kc11Mw_Q!(NH4kcRmswF)+fOX4%|`x=3!+w;I84TG+#y>?@k33V?HQ^7eF6&4K^t2T}+r|xh#n$f#>4W!KeWoFa)Dd{`3 z1e%3+hCTJU^wP%~ykxN7k*+_fB15r7aMW~GMSpz59M&L$`xe>qj+6R&!Zmy=f;F+w z(1YO2siep&{&RQQB&Mnv{U(Weg}#ii`Zwt|7Uv74EJ2EAiyezM3|SX^H1c`3U#+${ z#SO56`AK{=s8)ZFW;igmZj+766)j6H_%kD1UhO|%%&nrh?ke-G+JIStNV0SKF*?8L z-22k=^UnAp7zC!Eu*Y%;!}AIp2X>Y@u!fL4I8P}cI$-tvp^%f1rI6<*9)EvM<+Iln z#mu}D@{Iy+O-(4Z8|DRnlbME*DY0Z)x;nVd6PJ@-;HmqzNmkc$hrBVzB(E;%Zz8wl zD#M{v>BS&MgL_7DU~L)ipX<)QpNhU7UMVP>eT(T!SZL~+L)Fi#<6!WUabzz+EHtXJ z5xNqa*s9#;A(4k{sH5Xkjx@i-vCkL5;LRY2(F+oc+z;5`>iwWxK)(*z)pSXc#wOy3 zhVyZ3*VVQLM+Bds6#fKvGjd_Kv+mT{ro~UYkcGVi8Ja15;RiT7d}2&);5o!I!|&gJ z9Z{myad0l&SSt}H>V z27;PCJEfTLd758qJ-voC)=g=BwqXFYDm~&k2XH-j%=MKH%6+mR)3w_qzt+=RotB-I zd|RP(>R#0stNWQH_CW!keiU$}X!rPQ_PS(UDf|Ku&w!D;?)u>Q40c-_!2tK8^mw`+@+!rSMyZ6GVF z<9hq=^+?gW9jlwQl`Rxecw=>NLM139BDBda7XyJdkbsIKSrJ~Yzi%wEb1=ZbAv)8` z*)<%KY=XVmO%9z~n@hgV>|i(;#TXxc_gkM=%)nIncmGV)PnuZ=-#GY>%aP!Y36y{6 zGNe%I|W#MrZv5JC9LoNcr!^@jehTyd5;OJceQX$ z;{43JaKXEyCU=*#I6sv$ z>XB!RJ2Q9rz41;K^7)R1uzN-BH+qOyR`!cmtUH#q^4fU`o6P}aGPcna+lZE^S};U{ z@F)ff5Lo{m;df*7y?Qjte$58_eE-t;RW1x55#>*4G~Z={WC?{rtCmk3935e+ zFhGBRaJcPquI=&+O;R(wp=Yqgvh>O$Td-R(zInkmOe#%eI3EiCf+fH`v zx|!9kL$+kooEmf5LpWtOw_X61s6_x5&cs!RMg zhWU!SK#NIojpd>JCtfG?a+S-8F=)#_H_b`asvQgnknvA}$-KM>m|$Knif-3mC!u!h z?a#`<7cVq8!mw4VfWCiR!1~{VUGoQAVfz>dggo4*VdTj>+1V> zEbnDndz7^DGvHc`hMgA9N|(^8b9vlD7x^lNf_3m)4ia1yJYRCSe^_#P%Vd)2%vGXeItiFYXacx4$9WLA;m2l-+&jG@*-0$L{nli7|wRUA^DP@!{isoCFCZgpx0M zNH5+7JwLAUc*S@eTwaMGtwN^mh-y}H9`jCNzaTJ02hLD?CB-1iJ2jkLDTE}N_z?C^ z3C!DJ_UYA7ookftIX2|Dg>rOE+iT);C@X^UA=-@T33P$2zdE=l zgFeIb8tknh^YqiARqwdW;#SBLfiqzFJzn^m>oGCFyP$%p+ZCGM@B#fo&PVeBH7pQI zYo3IuXrrJI7wD0`yiuvOqB5{#Y;SuP&%Bcr_=7-Ba88SW(Ol`de>n4#pv-G>lsV(y zTw5Nqqht&Lp99aYKVM2S1Pg8mt!Z{QVI!#LmO#$)N8CWP?_sY(#P4No6`voQ!F@%`Vs+tRf*xJ|~Nm4i&r>i8iBohmCIfQQQg$-jXx&J^e z?8e#(E8x6hYzwX0En4_Pih@yj&iVX8ds%q8aOQ@oE@N7&)t%ki#u8mxtxeR_%mm2sE(hU7);XDVehb+Isb z$^2(ra6ZI#e_5Zh|9OH=OBF4Q*cq16w`ISAI{=ur;o#wqQDQhQ+l; z#Li=a*1vlV!3acWUr8!lROx$!2QOMsL|z($BwiNZC`ejF23*ASxx3F0hEQQ{p&lDP zMmZ!vyp_!eu;Tc{OhZ;PGiLQU@T`0Rds@ z_z=Gx(VF_^c4qKar^QznhGX*sxdcSam#O;&R%J(B6z5NJ(k6}_M@WpCA3-wV<`x3D z6twWszzB6`hO+!uCC2=BTz}G9n(96+0sEq*Dm*p=Y!KSj%YoO}OYBL1{w*Uvsq3=w zI|SsTOX9(vHNbL^bC!{2zs&03>G`AL%)!wU6&uJ1MIv>MvKHFSyMSGD@E$4x>Ujc) z!VBOA=qeXfUIBh_(b)C&y;Wv0_kt>%KX*!6rRGPwy@gwjLG@)V>!MV$`wM=M;nYyO zZgChX<@|AJWVCL(`9UqeibGjziRVmIbmSucj$v;hM~qIXHA?!pqESswVXfw#u7}g| zJJGDYE3NVjtDU5&o#hWNJ4?mU)@Q5jXTbUg$f+zf)K_-+w!WObKA&|w0Z!lO*9U;l z{^SQ#lRw#q?K7FJu?03HwT;I71LgSfFWPy*eYEC%?m8VheYkJ?I}a5R^gBB!+7lIe z?%5rS6Fs$Ch}%Whvm&m|4k6|;3nj)06Zf;l`<)OBV3sdCskT7I zAa<_WKfzBFu&M5gYFt?0w0V4UTm@4FYY`Bl%RB~yxy+<}2}9fhs{;o?iL~qlG2i-5 zE#0A1!J!(zC)izhnU#$m?A1#KV?(6w(EA=IoOz@{o|ohSux%0o86yd@*c&)Gp`+gw zlbJaJL$%VU#XF2ncNJ8>pfpQSZvKu4jfZJYkbbO9Bw&;m4{b=eq}>d^F`sLeN8BIv zt*%qCuQ)GoMlxsh^rUJPU$Tkc9bEmCVyLWJ8bJW_(^Fs8Ygyc&-j6qwV}ICKl(LuA zVrbl_cLd?pSI$Qg!TtS)z>B=Bx7p-u!NQ{wL{Kx0p`_ z_$>t|E=IBMvo`;jJJF({`$zsgI|Un8JKc~Rfh!hstf61mMEe&{C2i(NoD(OI#E$IJ zAIT?s8o!1!6KxGp78tsXl5V`I&60hXUM`6Q^#?aR1Ztg#vm#`Vv`NFt3#S{4 zvQ9|t4}NIqF(H$zluP7L_^v2DM6OWn7@3dWJV(#EN$Q4yJA1g@>^nqArqnBcE>FZU zQ&b^m1M?xG$!-%4lyj)U>}Ms4T^Ws7dlFMawy`Y>HADXC$+8}bfdba>owrfYo1tRo zGhuon-}Nay#t$n#I;(jn>^O9lbx&=Bf=&;w{Mi7iO4jX5fz12#Vm{zRCJi;nxBLra z+o$V_qq4qu4AmFt8^&A}Ef}4yvW3=P-hc>37!!;XSqe|c zCWS~jQwZocB9=l#LJ9@0V3S;Ywv)Yo zU}Cr+c2aCnnvYs@C-H+hDz#WL76deWOE9_9tk}Jxwh!cExX%P_wdA09G0YhZkZUF% z-=tQ^^HmwxadbSqFvZ%fy%O>LfDPO1*C-5#E!Vu^&uXWlc;3(^rz3T%Bvq2x2in)T z-+$^wVyyK5t=fhM1T1?E*4i(2)39FWUmuJ*?k}SKo|G#)ULGn_3-8f8b*8zzl3V`& zOUAfp=UFSbT;Fni>Ob#o>r>Ew9{tisze1xfr~tr91tj-^7?@J1tU zJ2Ar!s!^8`?E>=zD4fkn2?~rMI++-C)Io9F8v}xpliH#R>kH4{Hfl|SXo)9rNR{SI zhyjw`wjZ$?gnt`rJ61b2t`ZS@lD2io8Zx?G(8&3hecmI1!Q4&dtHz=tc-nvCUO45> z8OUqL$|!_q;SUcRsp0qj?O$0g^C%DvEHghrs7gDZu^HlwiT5z4)u(O`h7$p;$VQs| zlrUpK)cRi@tm$+Me;QdcJya^|6nEz(4T5%BQ;4I75eMSvY@&#-2x9mf@P*w_$VZcM z^1bn4O1|GxMHst(!!3J*eR4|maVo+)x2xX;u2cx#fPiRv^v?C7=OI8FG|&LrA4%YL*75q%D0)BO_jLQu!%)O)w{j;v&6Ndm z|5AS9Jeb;cY|7^HpH(O6XZulP^@{6WOVCN&NxiRav@%8cnXlK`_VZ(wsOMgI^x3M& zqwC)%*Ht#mCOT@MvjHa{0!4+lQ}s&~Lb4Y-$t@D7U-`Kc|8DC z0~|X<64u0od@;)nXm#7Zy@Qe@v2N`AO723R9Nut{ho*fXap8@-@Dh-7IoPtdv-~n{ z9IZ^|KUk$ORBp=zN%=k8ir8C9sqrEWX~2{uj}L$g#)F(B2d+{{F|J0)fEnMM@Jj?u z;0)ufuB^XVp*x?5)9KL{wnL<5U+?C?GgV%g;dNd!^9e%ITsK{Qh=Gj_4CTR7L^WRy zrY)}+7nLL+uu+@yZ<@R1fd`sDPn5+bWzoZPw!V#mhj5B`&Gro=Up&)zMB;}8XLgrmC zXXyRgo1zK7AAo@TQb~?SKV}U87v-y~Y4q=J4mpMqg5yqF2(=@z{}O#ab;CBh z4x9MgPkl^|&^PhvT}5Ew4W=G0*p>A^q9HzX^c+$cl0LxH{YNf@Cd@m zm#;3t+1xFi<_n7WRW&`HZw;LJ-ERiDQFveM-)%3~5;U_^hAF~X72{OuTLmVi_#-!< z5149G34mZk7?uB3bDvk%-Ahk|fq3u}y#SpnWA!0emblKMiX9D5xQM5_tG-rh!(s1t z<&g3+qN{1*3aavT8`Gy+T|!8 zsJ&im!tB&zzr}osYZ1}b_7^y=>bk#SJU)~^e!vvwWNw+C4ALqO2>rC?*>M6EN3p`B z3fD7{HNax@+#k;U$p}Kz_&Y&Ya$3Aiem%-K9pA`6$cV?(U}OA;XLq*nuZB1fn75%* zEKv|`kEx&hMkFar_42jVOsKZ%rr-CY!Lc7j=GTh`Y{?b*wM_n)S@2wNM%WgO$RP7} z`C*V=wnB5i+b90YxsxLUcQK;N)K9A>x#0rHEaJ1O!Yi}h$UF#3QR1`Oq3#%jK{ZW; zO^hj^&H|AH-_%m08a8s$I<*Q>M)?7$kLb0zM}k7@{F4civoyWI&|bLP$vpdW;7Gpm z!J-blW(YDUmmrbjm-=?%ie|0$yIQxRN}r6@bXP@dAdU71d8=wPZW$3=Bz4p63gOfH zoyvgbm5SKy4VkkRS)Jzg`YWeH)yK%e+Z~8~8HUv(YpfY&Hfd0-)9|m^$6V8cGXeEM z>60gs?45K^g@cUuwVJ0ZPX!N=J6Vve_?K#DkL8);)Ec9X9ZE~?LGFGag3^9w9Ptmg zaFQWtpZ*l>cNYrvy^PCxIz|$8KQaOc=2xMB0mHZhdCBm`(fGgfxrm_U2;H;Jb(!Mo z=tb9Wj?BJ&b?te#c0jcKbu#bv)bDbCeEQLR-YxAV#%7sVSJhgVYrEBiY=IkR*VCOQ zdFX;9B`j_9=S&Y7be&mnzuTm%KUXGn+^)Kw;WOnbk@9IBG9r$n|Vslkg7&isku1|;ptp}osh!HbySQ-zY zbY&u@Q>VA*4pY1LP5^ z2xJOo@_|*cN9u`2ZpFHEC zS+V24PkIz(NsW{s7SRDZ8FLxa$W@MIqbu}p48o`DXu`LftSP$aN_zf~PGLeV(NuG& zFPnpX(nAPvt3FAwBe8~5L=`N%kSQrCRUdh#r)LI3q{ep(EyciB!;ko&vJ-=3L@cv3 zSDen!c&Z7>!=fCyk|=(Yp@1b)3pX5OzJx-=DaT1L@5%r^*nTL413THM(VAyw`2Eld z4`HoSR6Deqh% zCvu%7X~ava?xRmh{J$~d?SGH)9=$SNnDuzCk>=Zi-V@0ds(sU{d<}!&as_!_YQ8zl`B2b)indH1aZ%Y zZejzE8B+vO?>|TuE|tQA2BwRxb!sSrp5X=u$ysYUGI8%qBlg0xsv~-Nq8wrsx`N0+ zH7~!qhDuMqmtWVpJQu77e z!_9_E4|_|TMT%B_5YyBmd4xYcDB~`3LM7UjsK=+Q3J1+Lwn$kS9Y%cfR}= z?@(r1xeZCyWv9sAvtHG4^S;?XKJ8H^f4=*LMc#V55f|!~>FeX@^XTklBCsXoRN|6@ zStTXUGU&Azf|B*RSxvPK8?ZpxpB5oT1;YR0&%*3^WwQz&34APEk))p~OGsWNzG@1$7h(?0fP z!4B?N{!PpZgMrgBhoxJb%@Kwim8f@rgRrUUUTbCCT62wmH>;K9~4CVb+ z@ZtNI7(Gq5{!T*XZc>Ai%dQ{y<50XLX2g!-O>oxI1vXaGX^eb=njq4lzX(%M=!x3Y zn|YTq;RwZPPR_yY9D*x8xxe3zsCw4Jha{tn^%_`=0n!(cep@(k-G3y{| z2jfuQu92IGq}e-by*xv4{C6v?4GVRw&_KvZ?=){^+QKib7^JCllpKr?4!<510h&O> zp#C5)qTjB6zHSP{b9X__Dpa?rDL%@G3mR{$wlg}U1!qf8{R@$3;5ZF7%t`c>^nQ2l zBG=`W^(OI3;h-!-xnPSfgZsH&XerLMECP_Yt}U?)LHo^^K(Irq7m%SA{}sjoSiP4= zKljIzMn6vgK41ip1%1CncmNkh{P4atL12aNf%w0X1aJ8o(MFG*%puykVQ=f?;PiB8 z-u%q(=8^5x_oc;apy-x&o>#e+-ve05VeJI0N*B)&|z2{th=@t za`j}`s;jx1Qj+nN$)s_piyL5_CGvEp>|tNY-a*i1uF6IruA{_qGW|mdaP>CZ7$DCy z>G?J{BNH1eoonont*RCwl$soyx%)tqxSa1p>IyVD@89!w1ejP;GCp1oWxA8R89sMu z?-hi@L{piiYmmXzqp6w6<{#7QHsKy*%Iy(CZ|Nz$8C|w+Wl6`fwQ<`0v`!lk-e;Ea z;W?3Qfq;VC!9U}io!8fsrPuh0rdm0n=lEo!Zu`5OMqRsaJb&P>1I9!_aZSBO^G*ns zN&c7>qyyU^`H%GiD;|P*-f($lR7e02Y~z<%_x^tE5t`wGorEo3qE;fo`OAn z*^d2l%J8v}ZHiiUx5K0Lha}SlbXbk`(Wh(opgEBeLOG}^KhH}MoN7Uu+#WL)hX3hvSi1rX9QP4~@Uf`84- z+RVUhvS6aP=IRsOm{78b08OKPlVeU)gDtML4Vwq>(Xxt`^6ju6i>LGy^iG@1_ zZs>B0+yA{S&~m7$R1%ST(!^SAidoE@z^TPLmFQt0f1)uZxVNC)V%R&bnie^088x1o z0T~z&GcSMQ2fLvAMU=Ti;nmbY7a2WRJLE=CP1 z=l}i62faqSjHmNZ(TC~(y4C&w?GK_Y-Us_zg_h)RCVg@0fP-Fe@L$?mG-IKHchuth z7>u6&(YV{dGQ)Dqy7$dVbjMTA^KJXX`AbG&{LBB_nCrm=3@(&ReH*NTz%zSSj{xz<)*IBX(JI z-;5!{FCLR}b!T+F_v<7wnv7(>%vp|=#V{3rkuf1SVA#;#PUPI$g8)RUWhhHlc8}z- z=SL_ejm{5$v4KHuDgS`Ks5HTOk{NVStlj2i1Lsfd*#Zume5h~OCWk!$)Ekyf54vjQ z+m_P{e>xLcs`oeulmrjSd!U?S0YO+zHgXcz!aLXjg$%d`kp2QqV}p@o4FF>C(jTw- z3|E4_YlWr2dYq+ahN+3Pljux+pTL&LjU=FY!%q9nK&(uCP&J@ZR}1Bo9-O@6P0|02 z<$%zecj{w2bGOE~M(MU@q0(LDlS}Nhty_KPHPS%?*_y01W4*aE8LJb<&fKHsD!(RO zfA3NK0K9*z>!Bf(hGonMr+EX)vP3jy{0doX7TEx;*F%m6-%W6leWtXvaVp^&j2Nz# zR_K?(0z{k3hJ-r02~L8*IndOKErvHMs*Cl5)jb=kOMn1&#gKa2-h#%GDAK4>R|h}O z7|R~Dm~&|>|FvIY^QdJU|8;VWTU3UctAR;t^iIZ-R;d;_iQBO!`)pJ}D+q8J0D2H; z1K>)wKOFu#YH>UBy$7t5&qpL~QGUMHO-vMZwvS<94N`UgTx26||5JqCSNqtL=5EmG z>E~reyA`#x6k(08cf4-$x{1E7Y7N|qzU)3shcd{>lh&i@{$@uLnduJ1w@?W07sw{j z4uSQCbzF?Yo(hi=x4RdXh5R1k;{+X<<%CS$3OcunhmtW1aIxeR(CID%MoR!9gP==j z2WCd8gc;h7dy?Y98%1^!$7dhu!X3n-E7@XpQ1Z|5N4s$nOKFxM3*V6wCi^%w5IR_S z)$E*eEAcqYm6o80qCUhh^U#u2Ecp1=S=JfG(r0%mxsWL|esF3;Oaflnv?K{&Dwb62 zO-*A<|1N0u{P*_6_;$XHk0mQ+9r#~Q`2v|0BMyJV<8H^jA!|05Ci zMDbQRV;!9k3zB%@k+1Yut}!)!kMl+Q_EI)0Xow-dCls$OhHice z-tg=1OpXBud`6S62rYft zm+f4qWbLp=?VD`=CS=4irWub$zrMxVp7FCN&?C zqxfBSz+VIt%u$UMNu_<{8{I3Zh0h#Ug=#zfkDCh8PyV**8hULOc`{TI&8Wog{7tiO zz;s#CH`0}SoHe}SyhXw9Y6W0Hsn{bGZI>V2|Qf1)Sq{@C?jZf`fk zZS7^TT(8mBI-*Hg>gXRZ(y+bdKVqaB3J1ELp=0!~mcOefr)6HZn*-5n9j}wX^M8M` zH(=!LaMr(ja9X@+x}2R8g071VG^7Q&B0z{^{Ddc-`+JA#!acyJo;YzT!B~prg=u74(3?S}p;K!nAsSt& z9b-D_=xH>&f&aGq1NY!ashZrrjJ}9@->@L3nBl!WPB9yKTPQEfbrD`C`fsy6 zryR$bOg5mmrhb&9jaQCV7!K!Y^08B;$gu-)>qFT*KnN~1?O|rqRo+U*DvW$J?nArh zZn%VlUvqU-8WHJ&WI7N_-ek6{YYh9>d)uIfM7?wyfOb_WpFaAqg@bZwd6@2vAQx41 zpB~#wqa>C|;>dFNM5L4Sp&-s*z6Gv%pPGr|6fLZ;aePC-K z`m3X3;A+JHpjMWLc2En5RJcFi_yE;WIEU0RCS7RQpy@hFYA(e$t}E`w+GB3R=j6Jh-XB=jVsL1)AmN%pmK9hz~_e&2@gItMWV1*D_;k zss;nYDSErp`2-L?4A`VDN74P}*IZk;DEVurlwtM!tCCagx~yJ~kv3>8 z5y=BPk^pi(Wi$zd!RH^%ZSwP>5;8s{q<^d62`zP$ytmA-(n&=2S2>9%c>f_d(88J zW*RPL;WyZQ0kVw%Mo1t9b2xzd{3qg~o8$mcK?E?+~*876TNv7^U%>JWz0_`CFmz(j%AUUoIbsI6C(7%Y*wlbNNX*}ex0ene0` zo4d2OdxLSaAOBT1kyV#xM!VMdeZ?8O0m`S36B!{^@5C(%<_8!v@h6Sp+L>}z7l5YE z{al+K0a(nf<+5OoyZ*%@t2Y`{Xb3c%SjuxiUGQ;nz>$9bXqYm~LY6r^{3!W`&AYxp z{?kfJg5ktJ8`{b)A#{1H^LjpNyfkRUbkVZ{Cis1@f)exWy^?P884&CCkLFolmR+J2 zxTEY)@s#MVRbh=M?9Z{{I&tN6b!UEG;E(&v-zeV1^cV=d6HC}`Z9wNb_{vUD!R^9G zmmt@+^i#u8V!=RgV5EGZWE?3#Y|{(*D@W_c?KP_e2}zs)AA*{QE;(DjdtDBrz`dQ( zBP&KfK0j0r-SBI0K*>24e*s6ou(15YpBG2LLuWa|SAPisDwrm*OB#G*v%0Qp3c6>) zD>XB=0|%;uYQ}d=_wv^j^}(`hOiAlDh&~(Glh7EYbeu#eyfjmXJg825Awr#>c zO+EU*mA*AUBAFj@C3s0vdIpEI?@-0W92w?qlz~?Ia=WZtG!9%U3C~;w%jWg!Y)M)@ z=_18!b^(zF5bmXAX=*582fumGEn!EAOPELW6^&KO(8Z`(HKq#RUwHeq3nQ&0ILA|7 zY4dZpHId(^JK3@%{DSc`%&fa6-Ozr2MD5Ya|iUeZnumj*dtwQ{oC zi(f5(lIo7v|D|q#jsZdw|IXm8P}B|SZ#}E&9H8$r+Yf-;XTCJP-rV{< zOaj5yT8h@|IcTMR(i(5I`iQVP+%^p2OPimF2lQ~7< z!wP&{pEVQ)8x8FiRE-oT9SX3v!2oExO*q)rE4e>=53|9X%c7b~o;eM!u1=~4qZ3g| z@ej$NVZgVv1qnO+=g+UhZ3?j?YztP&Dg&~Xq}rJ5^claAKE)>R!{@?1YaqugG5r3J z$S#R%K`)T+CY7Y5ju^S~yCXioWI1!^eX~K7BIe9?u7!LP_ZNPB*<3fN8UBHgRCJt% zbgm%NIC}0TPT5JcC_0CCbhSf$XZQJwhOqnr%(_f4O)F5a5W0XLLx-YY|3eW@f26Vs-q0`Ue2BHG7exm z2|lXG=qHT%Dec>vr+z@!>2ExmoMdz(?1izEJVT@UmE^U})fZ(D4@)4$#>BD!%E%&l zI6B(L)#Ist1qX9Je#7}0B$jq((Ce|Mdi`kP>ywcR%HuFtYq}VVE4k|XWpRhWTz5h1 zFE=oRx33Vzf%V{v_mRLR?R|8ZSmZjZ*cks>#nePwceYpP#wRBX9x46ELE4@_q7V9~uRpMgAfnv`$5g)Mttb zR0}Aba|Hr+0ENpFL;}#KF~*@vz~2D=RkcYvNy#pK(4S^)GHNVKqY8lCx-Y(7|5W5oNkPd$ zd+|(Xwg`{L9NyKai*nag>(df zZ@$8y7U--M>hQV^&1wU-HXYt4v&*7>Ks_J@Gr&h3ZT-(tyz?0MpE8QNX|Ud%yOUXY z12krydf(n`Rc5w6_EDU!-ap+Mt=;{}^Gd>RF>Tp+TVE(G&yqNX8xG*_R@}7RAa=GC zLZjW$xF8QEXt^T3syiDxZ*{n+^!TqSes^|H?f*d|q0j5Yip$OO51z2hIRyy#b-l1? zToy1q>@bvj*cub@3V7bKA=m@z$|msO_%5(_oBrqA^PbWiqYB8xo0JTfuZe28ZpHEq z{Ye*}Ml@X2+Lz}Ay|=FkmtwouFCOv@>uBPj`73o9BY%!@v2|+bR+%cV%y`wTk{-j} zs1et>WePTO3KLV63SfOuh6YLp>GtC3%Q5pTCr2&7aeVZ||FBK!!u#WtjkPv0kzs=O zG&+W_P`SMPyV))2iz!0rPAz3#t%NKW9oWS~;SD@Lj+aYTnPgKd8PT%0G|>r7HE`P;%03X_qP}dS=dT zWH8A{u;d&1sa5unpvb>GkJ^tUN$xJN`#z=^5??`NmX39#{~Xe1K0^tAbVb5)_BY5} zQZKOY6v&_NIW?>Y3w)}acgnWxi8fnkM3qli%#&sR^k$<{-5#_Q11VJ=A*(p8tzC#lc|M?Ifnjm{~E+qS9^T z^?Z0dN-E??mnDeb!^sWIF78R;2!N5d`xY=7|FgC%+TbEHpS%@zWoeEwR!9%&6A91Z z$Cm;hiWka>Ra7XWv~C}KvUCEM+@fSp4p?JXBf4)Z2VL@uxv*}h!wH$TY>VqnacGkJ z>v-;V4*hHYgA%=RlX<@C`}5wkA>zvqSYIbwHCESHugkm6*rdW{sm0VIewH67yo%l_ zIUuaHFSA=WCvvP{Ns|AMI|JBQR=v*JZrAMB0HrBw?f2K`MqqW>4juh}L%q>|%gIo* z+quqe2dI{fy^)BQ^UYjPG)3EE7u(BKzy0e07H`&yU`t)qh?%iwT{mjDrjQc}7x`%{ z60JX4ey7bOQw99xnk08v=j8_v_~=pcHX;JH8qSFJ<;_;nzHvL4Eo}6%fE>gTv*5R6 zU`tK#QMVu$C54&zpZ$+Ed%keCpj`fqcY%72;qn+_g$iZr%c|Ik zOWGC+7Puszka8d#5xlVHpiTT0oRK5L$E6$qJpe+ zX9YsbH3iVLQb*U-x8y?J`k?W(fJPtsXYpfZ-N)a#%<@0bY5xXS`4}~>wSlq{%sOMq04e|b~1$sav z%KS`gx_<1}ipNDbdxJGfjHBf0W^^L0Yo19;Ug1h_GSrwh#BX`%#-~EEqIf?dg?}5x zHYXhxME9MYLT`91e@y^naMdphHLnJ7&;5h|O53ibr>hIb(ECD~ofF?S90`j83~V%O z*J!CoxE4-Y$ZZHCsjhsk<`UdnVnb6VSruyd(oXkUqnfmA$Se7fIQYxPmc3E04B(R! zu9EUipz-aokp*>-1FMFlVZxyBdT8~BzbCpn^;_I*e^lE!sb&4AV{Kzeur zdfuD?SPv<+X>F9lwxAhnZ@+OW#qY&HPq}e3y&UXZ`l zw;6A&1IZXo(RFRUaQ;Hvl=6%ql+L$H@1-f zaZ%DkSLwxcFxSFATmQ=}=3((#1L2M2xBnyQtfH#w+9-TzkQ9_oY3c3;X;Hen8xGxw z0!m7EcOSaDySux)^WT2|H8*E4*4}%qx!(Ca{jb+dp_;0NN3};R%-`qig=8}sNpbjG zt>)C1^7n_;=ADRmlfxy`8O-7!&=_ZW?StH?WyMei4-Nv&<=Deiq>_#n_a@3T@F((A zsgjv*QX;qoMm*eN7c+O`+9|D;8qf+8rf75H%!M0d+y(M7eQOl`$D)>Z&-aTm=8fIb zV-kky$al%cK^C1imT2s*wA53m*7#L+Uv(v@$xXIUb;BnK1j4ihQACzzMDtzdjm**KpDb4l<`3>Zc)+>JiChn z)%e)V6oxlC8Fv|G?po35OI4d}&?4$>{rnLl!>Y8$aRDI4!^F+v;ke>=OEaO*BWpr*k zm`AIlDbt2(bW`qK?qAK4SkyJ&S}0gFLry|&bdYb&xRY9WrE$ms_vz-2U+>^4#er8f z9r8-dmli~cYn49f&Y!O*%W09o*SFjJ3T+1k>xN9afL<>#4!CT8y#k&?x5t3GHGn5+ z*Y+}`Rj2#fvojPgWV>{W`?h|dSAS5KaH zZ?9&)^)EMlYuXk~rVE#o^!+`9HY3o0Mx@`be{H%l{byCWI{4iJ^f4-y*~uM_L25wC zF;v{utK%<~SS;b-gUXhE8wjiC{SxX7yXtKdU7IbIO245iY zQ5rcH#B0$s-dk2CH!Dyu@z8$ir4~68cqzdZRQc!j;mY#xIvG3Hwbz(NH$Fzb*WZLw zpwTuARp_V9=y<>{Vz_?!4}F5UnTp85vIVO#{v z&=`b1mrj_EGtQb3ao=J=o_QT1=lV9;$8Unhqp&U%SM3YXA-Y*9 z3$Zyw?INLhbG4{Pi2|_SEv_4s19~vgvR8fhE6C$gZg=M0lk2QnBDP*b(t=K1C)UzU z{65)5h^&57*vllCOh!}+`~8vxoq9jsiyKgD1EYM>gccMORPTO8)mR1t0(zxZ*Dr-3 z151qKwch7WQ|EDs5N*bZJ9q%zH;gjX{cEPAX1|FDwxEx@m6LHZk2G}qy*YizhuB5U zIu+FYZ5u8Gs@;RVA0?WJN(a4{2iHdEcQO`MM&Pd+WACK;oMtEYtH+>U^Q==o7suF^ zt>9yPjb%}_9SCPh-d$ArY-X)Jeaw){a8R1+TjQAbXeOs%8ciomj8PS^azQFyr*kV$c={Mg8!>yJ+S@%hD*G$ zjH_bVF#_iF0hk4hP-x?6d0IGY^E!)O^YPgWK|d2{doZoDw3bEIY=sWi)_N9oNe#(z0_QApW*H)uo}z_@JGB*nLGt*;=UyX#P%?4K-fL}=m1CKr zu>H#^l2<$?NSJ0?PcEFG2w%IOk~5z}+B@m*bOVLsvcFw2UtiJBV_hrac~T<6FqZm$HPPQqgPX!?HxbIm)Fz-rce--QT42>;PCFgIh zODAh)wX#urOhQ-P;!-xUD4_ie@^kapqyl<%!(~j~_t>(0*2j1**F2mpa6@9n+d1FM z731f1eyWH;56}DgLdufwJ?mBUwoaJABkYO z=X~VbD+=ZHM~qJO?lrQ{9($@b=;*YJAaEFQ@>NFJQh53)z6P3_@Fct=TC^vrDZXP{ z%dab1rXd1+r@zui>Qyzc0am`bj#Gkp-wt^EI2SuIkI&@Q*RD`(g4!O;_6y94kyJswrP3lEET>8K&u2h1pyto)!I zBv*LSKz)03MBL3`(h4=h$9K(tYq8f^;cuLhcR*ki$C->R36LUc+^lsXOugl8I1!V8 zdIEG_%}E1@tNiH$B2kqMit5)J?^4~G7mjuwm0fL5D^_@^Jwm#$5y))`5edPTl5@Ic zy7ri|K<_9K!y=vAq1Q~G^E@1Apo^@5Y5)S58m#8Z7WiCGOMsd!!rebCRYeIxH_8BL6u#guFc>NhA$ws#~hf;x|0UUos_4cs7` zrl7)$En|+paF5P%C7n_7VHAQ{O#I0I#oPa6=g@zj50d?Ll3O zlk>rl*-_`<;^NtTv4CUo1Y0WyzG5GkOtSL)!QuTY?8eN{XdL4gMgoQY7p6b(AgWcT zph-dvC3LoCcv0>MDfd0T0(iBw94gmE{4ChX#%n@rGEm+{qW~x_iqcw=*j3GK2&75p z5Djm^e~~rRYbvs>7@fD(VUZPL@&$#X=upTg{Ix|2x?84APf0G+{YzFgJ*uBfI&WOr z=ujNON)P?HBK`-`Xgw~vyr4C3`uE&$}@+lW!fnR#9RRd12F77GrSdzEqF73o|%sIxHttx8Jw z3kYSPypP$t-V+~=${=5_{;xsllQCo4C)5esl^?Mvuoa8WL?tHtcgtY1>Q0<=U;iic zQ-C+(p-}q~4IN!f3a-6lZp9YCieWJhVuAytC~-q31!}UTLSs`HXjybY%ux!Sg1aF# zBfq{FRn*P)HmvfGD6c->e{f2H5q9?Oy&i)~F?wW*GP6zHtM)BKchmS}Vb;W;Rg&7M) z(-M+FsoKjBIBS2jxl_q^I!FOQW5jN*^GhX?JHH8zUe{OZFP8A76PbW6$=Zf7a8$2f zW0oSf`lDd0tD2Rc(KUxAR=(Cu{M{}kO@+!wr95&wj!&#^4Ll)h1kdJi!l_Wj7 zCWX&nJpu9GRcFs@h`HDzI^m?^Y(@&~U?i)wjV$`3nsW4I;1=T6rsuzwf{2VeZbD zb>TTJFSVlxRT25=f9fX$`ewF^cv5GuDU3N1se0@fY>4Zb`{}?AA6EW7j0z9l>Pawo zf&Zo{Y~v{BZ*a1Z9AA1!y{=v-i!=`Z0>6{Z9xbTK&m=P^om0_!QkSWtE!1dZe?rUSOM5TQ1Yo5Mc91{bkZd-6@Q!T=x~ z58YAyN1IBpZ)5A8?%V{0T2;I_w4I&`w%l#M_&)jiJdKjP?PM>l`P|;Sr*MT(5{>^+ zRiA{WtLmJjuec7$d=E1GqyL8%1pRO@D3Wmdd&uk<-}61oyrv(8PuW${(IZ2xOGp}@ zUf$HqICSwY2Ew*A`>bF6MPvZx$t7BeK2;()rWU#{oR>*7ok^1xd`PD*<1FRZuRCjG z+ZU>EXWIEeEi3R29SjtjoB6c0ru#M~zk=AMN2aPpm=ZG~F#83V#-<}djYf(?YO=*b zNITqhhxhtJHhs7ilmt^=nP(ssRhO+e@AzAVj)u4G_3Ts0$XW?SB-Dykx`p2=F!bhV z3aTK(@O2JazPPhZnWIa?$AX1iFftME3v8eX`j;*^;rJfQWeWlgo44GaxsXz=?m=~X ztBD({6ldy+T`1n#ia7sXxB0`WKs6NBCR*>6RA(A!(?|=#pC4(=>0^d~sWrF?^0bP8 zo-zLEcRkVR*Pi9_(5C5MqF4P7r&&gr83wdIN|^Jo|7dn__W&`YKG(}fpzd0xK+7+f zD)=C5kbj2g)^=ljQN*lEC%rWG*U!+p!TR*Pv3^iAV)&E z+!gcr!iT0`JQ{s;_11q+WtV(?gAr^Ga);KD&K)~J@u>9E7BSZ{0u0da}}(;|0~a8{DgP8$rb&swH0UcNVnDNL$h1Ylzff_K0P)v zkUasyDx7@B2GO-Ub;kG(ws_$ILkr-I-n7Dq)RBQ>NY{}Asn4x(Nk`7TWbb(`2Hh#H zvY4w^nGFX7@rnb!X5(l~H;U^`u>*ZrU}ki#TyGDc#(Lk~F4+lrT$Pe| z{gX@o%VW3FfpF;oJt91uxW=Yw<-hXz^TU5MS)9Kz9k8 zJE7+p>NB6$C8qFnfX)WDn4l6OQ6(-btEoRjtUp6P&WX%k*^b*KpCrH*CDHp+R`cFH z;hgB6z$Y-h0EuSOAI{HyiG(T!+fSm8@Aw$I$p=-|JK{+KjTCzi* z6;xX*wfUujNPB%1@L7gqGK-E~2ju_MB1jKeO2ZiKUy|=m!%3mcCFm}6cL~zU{=o`* zNnXsA`Sy(yH#)a}=wrP`5^f&||7&V*S!4LIywOZqqt0^euNzbn5ynEBiDE6ael2 zzG_f#Nekd@f%c3NN*RPg%Rl+BUcm$tYU#D|0dvH{>p_r;vVI4Q_DEEiU$g^)$09(= zX0hqZ)LhU--7~(_DfRd3#bb5_5g(bN4huMe4G9{y2G@QXFqcB3x3aPh726lPxQs7_Ria!*OZEUhl) ztB(ZPog%ruYQz9@`0t`U5me$CCmiRPQwAs3P+?}s+#(_;GzNq*m5hyhPPnHD-FD^pYXZkOBAG``?%Kd0htMHw|SPq2G;WlH^T&{#OPNM>Xb_Bw|Z(-!ah zBMvSUt4yqY3zrqs@V855a%0SjUOBXOZ(r0`3mx-D8z6#Z3v8<4f>d)pP>q;JO&0is zgoNiOOLa{^@U%5hT;6&+@lQ=P_OFBcR;JtX_>`U9^)$3&2^_#+KU+VeV$+v@;P&T8zVXOy6JnGtBY_AiccCknI!x+1l-dBYy4eE z?=KzuOzae_gn&;ddm4ybMpwFlg#pHb(O|=Ah@U02d?gz4`!2byb+ASa!rt|M_8t$r* zY{_tzpC&Os8^fDJ(&M^kJa!&xTHb%*4dc)FVkr(8J$mX;=!E;(8%N%qJ92Gkv@nm# zDO-vphdt4xwPR!!A`dF^>TRU(go&yB?cC$SI#~O8ex@nVBd6@33k4$YRNRO>y;H3N zza~kMbZD0{&@*N-m6^@K>GdP^1v>Ra-+;7y>JOKrI;`R-gKylRAl?rYl1mCVX)TO~ zI{5zkDsExEH&Z`orqUmki(s|BQp&BZef+%!oGEgT?c5^>ZNC<@<0|9trXzz&zM7Bn zBO3C}>nMwSF7kMP@>ZXvzxui}=p|pj@*jinNVH}vUAboZzWvltB4t{jZb?gj8!NJd zeiy#*ZF+;+&j*C2TSHPcqB3AGia(rM$s=k^insT=7ghShVUbbjlzmu52$F3QbRkC- zy5(=HV2^M^{cg{`)EC}c1d}Qk+5uqd8Ou+dJ$`2#fKHCMGy-q4vK;wh|D$Y5eznG5ff56WCwfjkcTB z=g@Wn)DSx2&j3^L*y-ya5hrVnIb|P#fCj zlGZP4;u^DEALx?$gGCoO{E-0{o?-)iJ4iMI9xDNHwy*J|hi}eyJll0ONSxVx;#&wM z10*L`D<_QO{#p~^n}|!!__(~0#=`ay&U#px-m~0BE~(xGeSbcG$AqegcOwkFJb`5n zhN7^;ZxKt@n2+yEh0x#;P<@7( zg)3em(#k{zMKKDQshw_DygD2uYdb?oH|rGM=erETEe;Llj}2L4CSUsgrCOsd`TG~B zyvX0SuvI^_b5zJt<-#J=e>8GvT5-qClo4DN=g8l{?r&RGc+YBKPRUI3Q}28y0hsS2 zDI$vzGtkC@1r-k@wdv+SL|;U0F4O7`|EP~$4Co@kqD(PkVltY{g59Kepwh1C?mb+i zJ!o`ciw2y{P`BC?PK`-M}Yb9EOHsURG6Zdn`zK$$kQ+qTTAaBqs=t5 zQ->HP*^2>^OXb3eiE2R+6+G|hifg$ritN@zUMhBaz5CM6=+I33j%KDkID6?r_MXJ#NU1_0qmpn2u zHYA|IIC*e?{WE(z@ahSUaI>c514X^QiNZ>-Domzj6GyQcU-m#nYkXhNjM8#$?HaY6 zxEk#l;|PTxO~dx-;MC06fHy|!W~EeN`CNn1eID9x!UbJ&%kt?ME_XpHKP=h;RYz$b zX}gN(EE{LCLdJ;n{Hvo356{=>3@**6{68+CB0998Y^mDg9MgQTNce|&ocRq_i$+b~ zYwaS%pt2ka=opl^iK&J)+iHbsEjO)7GaWGl{j+mRCfqcGwyEsbX^SV_1rR}TM(^TS zsMFu?z5`4;YbDNo&C+608t(=htuKXpsWzAl|JeJV>#)KmsXX{3b`>zw1I8sA1qdW! zVoB*51?Nh&SJ6-6V1WWX69rESMduSqwfI-KLdEx!h3D`5Lh6ccbAjQA$a&lh77vmR z_Fms01T9E(Sq|i)i*>)y!Ugaw_AvFz(6WGEd+mav0Zm4auEd%$Y{3;Y@;V0K_N6%sJyei*Xh52W}675-_}Xk(d@5#Ql~D z$pKOOGp1eMdD{~^%xwBA30T6P)1l>eT+zs9hZXQ1X_a4Bj7NZAPz_cq(+&Wv8cBJOI@^`S=k*hy zs|hq7+8W%ib`|Van;(*Kfa{Lp?Ck8S8Ow(M$_{$!|Ka_CA<3@cKz~XUovIdr-BADu z-IIOy?+nsJ@_dvYF7$LaR_;oDyYGj#7>FZ2o56t!48JOd%(9c7B_iK~g2^XQ?yR9> zX};d>)J0|NjtCO51PoA&e_ofuM(n9r&fEjW{<5~v>D1%?rLWT@8mbGUs#$}mP))E zAr?XQJn4clhDU?jjj)nK5WApHbme=EvNaQpN}kS54L(T3H3MW&e;{q|WW!O~s;WJu zouEoyosHBVL;c@V)3~1I$X?A1LRWK~PXDbmwEJ?VbA%T++94wL&U%L*W-?&_GM%tm z$EH*yJE$+r9|hC@@wXi08y8LAu#iG*(30!?LRL!@zA3S8oqVRduT(;0sENDBTy#8|9 zi$c}fo@lezzbX8__>e1mO@+vyNh5F~&NJ*Y{?bpF5e%?eb$j(nZ@)Sx;2|HApg`~_ z<4=@}gW6nIA~GXpw2cF9__QBl>_5>?k2p_fq7AHE0SF9v+*rFsBFXnmaM zOWDTdwX{JkHJo8AI`7xV5<TGA~L2 z`tG^{qrIf5^U84j~oGx3AHh@|+edhsZ)C1{aMs2cT|34y#zV%#gqV6uepq3mrl zhwZGCpVJ19!9p75eRnes1|Apm1?Hhf#FA$CRq>MYN{njAtO5DEz?s|1{T+Inf!Ty! zfr^agBf1-cSsG1-Cv~FGt-n0Cb*M(mdoc>MK`^#1Tz`TcvhfI=3YGCPoR=)hbJqqu zSJigO&jUa_^krzdMQIiropHfX{x60`*w{c{@8J}dc`eH*(8Ldai=XE=Va1I*(HO;^ zywx(@Gk#GZ0?VicS3kzjysdUV=%?z@r`n71JG5>vqcp&6U!dFR-%!_)(am{;BErZl z6O&PvR+~!Kk#J1l+jERrNV0Fq8DVk>^S};H;tx(9WJ3LrL10u?$K*$GmZL*iAsKU{ zhR09!EndT2L^XqP&gmY3=(G42kCu#X&t}U2l0Htl{OfkH%YM3tVFx}7^ztE8vaK`J z=>U}2^65BeWpF*P&GL4p%7r&|UU-Zt+!^T5!1a7J=+%zo~$GEaweR(`4;qGU%*8^gOwKfo-1p(Yt9G?eDq_>=R zB9rK}dL3LiHXMhtJV}fLM~64izmX5GGs9AjW53gn%q^Y6c0w<=2k33D*Q=gwPjkLP zuQNh#kB<*?W|GCd?z{Nx=JFvDQ=1t&1`CW3bL?}gLS%tUU5`(+{f70VNFc)DP3{Z* z@YZ}=U21*WRDIr6tPQdy;+7NrhM=9*ksyZbIuuQO`lVQ8h(46YciqnG-;$YM6cIgB z7@+cg(*>6$f3l`uAE;q$@0H&+nS7V}Rd&Qo<%~%oW}5xW-!%Qm>bzv-L0iLEzM0%g zlXYGJMKq=L4y0>Q3%GN({^H}m^nzLsu?LqUCGZhqu)M4jCG_(gj43y=yqjC*W8rGH z-N=@IOa|QusZ45&3cADO&;+{lNmfaBr-&;8l3%{Lh}VPi-;+;ke6VNjGw*G%`OU=% z&I}ne>(P@*;7|E9=aIUSd6o`c4ONK%gBIrzlGrgTq75bG_<~3-D$0KU4BiOKn8UT~ zh*!8!S^Hdl^MJ*?i_AsUR{KlUkKTi-w{aj3+6X^NBh{OFI zu=oa?Q1eZr@0 zX0bdz@BC!N%=qjZLpZlI%&7f~|HM87;Y$J?I!>>?ZNstX%kK}vrF9DuJsdh-`fNv{ zY)Yo7zR~VoL?rZp5zwTaEGoR=IpN7>KtMD5t}28JiL^WAgZUS6sPKNK1@M>vf=3w8 ztptJg%<|WxvFZ@t!_=DL!X)IOLL8gQz~i$^#E%UYV%{D{BCJ}t&~ZZ&h%cnbxid?) z9-i+wXWLhC*}bqm#T^rp<9Q^51mo_!rTeBKklG@mbfsO~_9sDLzW2!vMRE2p>x2j< zHEZHUy7b2V|3%)}Vgp6!zwc3ZdTO0+z2eNXM{7J<|r;zO|vZY8lZ6x_W#^M3>^O ziVeFuCsV6-B=o+q5zc|!A6viBH50o+ECP+lb$XB;6O40eEL65>G$KC-lV+Lcau|RJkj$e8lVcv9_9zeWEKDwc%_`%Ggw@sBLx3Ef3W7+UBmr@;c&~!laA9a96YZhV`=D*mTc8}+oK@YR^g__fG z*jQL&CwKl7vX&~qyUWU#webZ`a^*eIki4#?kf(jpt(oob6sy%>ird07-#Efw9w1@v zD{Z3S>{WH$>VSloC`&BNN^m9Htm118*{ySo-)GUb-XM|hzUo0=(<|1$Q44!~+ed{m zo=7I*1qTwP8w}-FxFH_3G_OC2jpAH99+oEeckx{#aaSH=b4HUHs7y6n(bi^>;i2o^ zf%uWyZ}jId@BzI7?%ksooo+`Iy6{wF1nq&*B$x+RJn74h80Ui`KhPff^HJ;|>Qm;!#UjK6bp@ygeu z^2C0KfVx`rPhg1Zj0kJx*~3L9+RVGEr8bI<>P8yj!O=ce_R_X5LS>r%?-ufJL#S>2 zJ_dio`7neR5Hm_XON3Rfje7Xh8c{Kq=h2-!>#ys&N<>U-2vOH>(e2U<8Ed;IT)M%} z&(DW?WsH}lkAo;UKWmwWBP)M?TB?<>d$dPm?`=<@lFqjIII#vNwRaL3a$1gQo&<9u zV`1sdOl4%@tRv&CGo@735Yrmxi}u{K55dPJtZITqlC@EV2{aO}P}MCn8eDByldYAj zksp}VYz$fCm|+ClBrnY>9po<-xwK5p6}Fy<;U)m2-<$Gg$EW8S;MRL{G?nko1GvBV zM=lC!^8^|ccj#znv;Q$YpZoq(u6xG%EY&T8k$Y$II!;akuIfmhmjZx_Xnw@$^DAKL z2#bDFVAMHCvqImGj8o4N0g|B#OSB40^zj5v5L5*@)sG>6@E@WbAM?1no zX`$L3+OCV+JN_csL&c&Q?qEWDZKMrBoObX_gfnlcTy$&SAEOOUV-!~kO%ISZjE?v> zj;8TG7w=M@NiaAkKw(043pW?3LhpX}FVmD0i=Mlj9@b3dk&o8R>zIA%)ytt*dw+qQ zzwO0pI!|?(Dhh);hm&W|U&j$@bEo#BEmJV&NM>wnl1KT}Gx}hlSZ@|9d!g6`uT~ct z`OiyS${eDQ3Am#)=KE6Z#v?Pd(DVhY8557xqdp`)Sd{p)|nQFeNmZbNL3CDglTQc?%u{$)4d14 zgs!dYbNruJi+zx9!$2a2WS}3&uu(sxzRSv5IWoye+~n2Ohr1T-Zkd%B66`X}*yN<^DxVk7rr;nMr`jD@|slTe_`h1T!7 z)*zO#V+YM|1-hJy@l1S1^AG1Bq90HSX>#&HvYs8}hy63V&G#X1bf8vwRD0=+&T8$# zad-fR^r_Y_^u+OaF-UQX+puZHuxbGW0(fiBY-9XYFNbPvmlJBO&$+%nC&=YKZ@;P2 z?kBP%1TTUA^WHE=`F@{0O5eG!DL3?r(Y-6O4a>B$iZjBE~jjEYV_K{cjEDEt^ zQPkJV-O09J>|q%xPG*>uU$}7AzzpgXbgC<4U#m@H4Opa&F0Ao!62H#(#v__6ej-K) zkr;iUo<0&Q$;(B#2$9EU3LS}I1nnl3S?+ANvFXc~n05cr9jb{73B6~Q_*zAV$zql@ ztO9$K=dL)0_=j-Z6=$CF4srqjw)k)%UARkB=M<{y0f@%QdB5WZAn`0+L-oOp=Gs37 zks5RU=H8IaK60z8A#V!BuLn&Gr93CEql z$yF+uw!3!ogc0tCD(+Bd@oK*)8>+Y=>yvip;(`{`U(ubc*J#CD!l&j72WgUz{2^S9Uy6#cu#v@3oymcJy4-C@TB0P!>) zFbMEs8xk_2dS#Vl3LUoRG=V~wi>$QSO!3WQoqz-zmPnSI6v$@a57nJqf`N`hS%_V7; zH|bMd+AEB7Yf+&!fRMK0LtD%p>&?;}BY3NPxcGXe1yHY?EONXan+Y{}ZiR8#`T#NX z!aQbo`tkMUwD?kUfsPuG!V2kd)rLioh+8>907pK_5MsS(d@{(qcX9%YJ>OeUxaGJ z5tBm~2sWhS?;&?qXxz#*pK3eXLVL; z_F~tm@T~S6I*~JT3`!mXp3nl>&oN@}Bs(fGqwm?Xqd#z|U+r?epS=VlmE^(340Kt~ z>U_W>96pt0Yh?|i3VlYZ{NR$myM~D|*3W}g#7wOrF{YRer zLW=KbxeE1z?k5o_Ym+@&cVR_^zuPzs@g_2)>gQI!=QZAW8KO`l8xA5*dnvwxoK!A?Ec0)?qVTRxu@50uP$r+#x9 z(1?ekF9#^^-ht0m28TA4AKg@iz_Dcud!rhB#F)mz$1vtQ4bp^Y=uCIe80X!TKVEcq zk0c#(J1xo>CpB?UvKz<#KEffJL4eG+9NjEAeM0PzQn!aX?MG-dZPqTZ6Y2mM?z0 zp#%+m=16b>?Li>khxSeLx%F(uM0Tk*`oemnbQt~CKsg2Z{-Tcrm?*m`U-RBeb$vYn z9*4oZbdSSA6743JllajFPf$4X9d7uBkko(Ql(4Rfr3U!2n^nDy4k4afVC@Swy!9%) z?J4LzEugP?Z}cM6mD$xbsqFDmH=S`#XE+T`8ng#_Bl*k2FespCeS z-2_lgQk67fe|>QXrE%5hNW$4WNHjv?3}XGNp}El+pyb79G6BBC;R>g%+@VjWTp3Q! zHqS+ega1AiT|`mrZ3Ip{2$uH-`MX$8&bLZq+i`AVa5$`0IJx%fQ)$8cb}- zNFIbV)Ijx^vwSgcmGDe{GDMnmMwgFh99T;dxZ`4ifM@n zE-ByW`;{4mh3is~7)uCJfuP@C-A;RJUuH)piO+k-q(St}*!nczY})WKb~`!B+dn>} z<(3aq2DPui-oC>d@+z8xKCsznI`5QrW!|x%U|_zCszYzEHbP2(1T?JKCco(}rHnklIB5LEytD##Ft@CGEwb9}}!P8okSB4eU>( zhxxHLA?hyurvqFq1BBN>Wy z`OJOy3SL53;<9UY-3k$UUTtf=eidrDQ}?aaDzC@_91isMz2`D^dyD6DwFd9Ec^D8) zc6#1VK_q>4B12T6C{5mf6%JSjbJ{$2o?rfIM5Gj_$q`HWFNDwy?qHBMqv{F$q$|` z8|2FQRfxGL$RT^FzhO9Nu$i}|NMXk7Gq^DOT4LfeGX^*Vx{-C*eJiNeiyrZXc6%`KT{D&fJclVX{!f)JG~TK)i9}^x+TR--x+om}AYhx2l+F-D8jMzyqj`O< zAb9E|q2CTk23d!Baf2)@J7O ztY^fEZ96a(5W>_NeB%-3KzK3HN3tuUTu!lVI*sA6Q6YBAnbJvP@TDFl-%i7cSE3l&Bg|9**$atSB(X< zzZMpuGmn>;u+Q>`nnQJQw-^N)vnP?PmN)7}XJo7-pU=oDPlv`HZ_0M)1gopU@b9WA z!G3M%#Qg081Hb?APdI^o<1O$|-ITv=0mr@P0H7B0qBX_t3OWvtYXFWeZ;;M^n=ZQ# zNqNra&6nA}F_Jz8o~_1&WP^L5WP)`MiqPY&6GSc`lxFRqI?KY5$F$3=l zR$v~kdUE0=_F~)uV<=*t>zow@_Iyj2StC#rOGMxP4?N0rE2-bp8z z7SXF+846ctXW$v$4C2<9Epdk9RSX0e;?es6(C09{pACgw)Oa@XcWY*jgmyQda!w|T zdyongw)`??PiebRF?&Wtz0_et&*u&JboHn7{2YWpONbi$RgaaiYQ;pq`h*!94M6TH z{*9It0nV(X$`^-nl>38X>y88O>foF7BMjb!cPpx8YaMm|GT?=i=2*}#Lw9~K8#^F0 z-bEh0is6-K{X8^%&)Rx z7aLpCQRA9O2)qUL&SAqhQ9R!yNtv;f&1qsPb7GbaYfT8_oRLV}_^E?#uzp>M*u%N# z?kdV~h5sG5fGSeRiwRWR2vIq7HaD%~&$5n}&SvL* zLhi~qYmd~#n7s{ebE~r>_eBrcCYB+1vyD3SjzK-#E3%OqtGV+|Gd&QSQPqO}HTkI! zf8W68W`Jaeg}X3%U7Iemu*IEq#NTYE@-<6e9iod6vbtg$)OuF+sFk5L)gYi2!Zqi@ zv7+UE=U?lQJUx`mCxl~$RKYNFP+3X*_>kNS*}KbKi?5yKd?R*FrK`I2L=!)S$*%F3 z9n?I`H+cX%7Y;NitZJ@;cNjag`8X-V)z|*;{c<2=K?&%M<`E@ENli&PHxqhVIN>{M zz8aWoy{++m9X1oZx&yNF2Q|~yjh3})8_%ErJu)5tJu>-dTg>&d9O06_sX-U+x6g~a z)>peszV}0OK9?`)Uc0+ZTxAnHHPlB+mh+h;ffeRZnO3UYI;mN?XlU|{g<|!1ChdM2 zU!ZArMG*q3xgAhyksZNdA7K%4N?4QSFVD|$E!x|St~2?*$Q+D!W{L&WXl06Et%y|& z2ng%I)qiMV5yp-&)hM3kydx#hmJLjzHBPuFE|6h1yHdNrOQ>=GxB#|?1JA}uFWhBp zIsUcf3Uee}caq|{iAv6?xx~1v^9JLk#Qa_1qSOErksfl7k<$}SW(_DywG|g@Y4o!i zP4`N9e3EArki9k=+CJ8rxyu;DAg15eFKCVIzsj>59^OGvbNuY;Yldfm)Eme`%khUR z6h1*SA=%Fxx{}v05kuJc1RijPd&G@Wr|#Uy`|ixkzQtX2=Pbq;?k!aLyA`&*v#vG4 z;ejXa$`c4)S11179kvnN!48|jr@e0I3YEtey4uA-6pXhTVO}s|5N&%ND;zrPnkkrb z(%)@=0r`^+>qwL;!ya$3oG9f``ZxeEJYx=5{ex52ouVG zLE$@k6Ghsp?Ky>8+3LjR&U2{arJQ{6J)jaRf$p#%ExC3DlQ|u^hMQ4Wy+mOP|DKn^ zHykVJ#;OT-&TFoE*n*8MOeu(Yk-lfwY$s0`dq2-@wVvF5;bGESWPvzIG6kn}O=frf ztBC#(fE@h?pKv>K0HnDJwq8G;?#>LFJyfQoh=C|;A132(*i=$)q1>iW71Hac=}FfX zO{11~*lhrMTDf4WWlnzHnqahp>d9M=uw{=?uYGbSkJrSKrS*qTkYZ+sWSDfE! zEB`IjfY{&)^;@RHuJDeDF;8{b)1mFutnhwHiEO0P>66`OJ%-bi(5LGriaM{;fCdv{ z*8BylPG%Iq5_pv?5N_mV&mR7~9j$O%-h4TjYUlg3^!9iI?DNk49emyv*heJ0n5|Wd zXWsAr3jh#MBr`lw(gm3{h3@Ha9|kf>1n(}!gxt5(ggoAA(0wjDkoUMoNm^vo)XJ<7 zjh4ewk&aBmoIQWgt>A}QZNPGW4*8A4$i(F_dMtQ`8j6Vg`zQ3s4~f^E`gwgAqj~jW ziC}nWemG{Q z%k0rkg%rrt8eSO>$rb!nf>R-fmW+%wHjw7Vc@9@}q4$n>u$Qr`u?<+*33{f8rlL z=AYp;KuAwpxkcpB8C$d^iN_O0HTDZ7AUDLh9W_96pYiuJKoui8{|sRQFI9zRnvabr zt2*`3Ot$TpQcH(sPFrOQE22%tuSX*=qH88o3{>KS#DvWIa(;|bGAz_=N%%Rb3TW`I zWPbuf?9O?X&>@7+aLtFk0)iAMsGg{enL!gA@I8cX4$2yS%xbAU9CS(!3tfh%ve-*2 z$^j-7ZB%E5x@_S$T6RfHu_MX0BF6LGV;r_~Q7}DXh1W0X1?R-*<~0RB6B4~(skNoZ zaGJRH6F0vCJ(y`lDYGHwLCgM1C;MZWrd5vbwX`P}TL6Lx-zGSs_?nycl-)SkgNBdr z=oR&D_)EP0=1tD;m>uz^ykJ$AU29Zye$BBHG-@qvIhaTs2kKWXzMkQmQ1fx$Wa%Ky zdOXGs`uYoKnxoEJ8Ii{(LH*^%n3wAJNpUa&v_zNcZD5rtI+poP?uZAQ%~FHt1=E8Q z7iqiVp=Y}W22CnWmc;(V2u!xCALh_4g$6jfQvV5Q2JWY*T2+hpTfK-G5#Tki3zhDw z`yM=tlXlHJw6ghkWj81*+{`zvm1@C&;^?JpuWPp+zeUzBw6|=lexGi0lDv-AP z1L%cyza_B|zZh}QYBS|Z1Q(GEmJYHf0{@we_zsKxF=N3cyZkBVVC_=k*ttaiu3=oY z!wZs_=KEFN%K~bU7r9$<{dM-^a_@9mUkP89Y9R}l&n4%B1dny=*5t2$dl&s) zH~n5)lzksB->(V~&=;S{&9;P=U;?V4=IeC>Hwk504b~s${JpjQ@-{Yyb_)jzTzOKX z&n+ZJnvBCGlHg(IusOa5laZ@rR|1XB4y7V}`(&sEqhJJUCFIeSR@BNf)G|L>^KSb4 zR9k`Z8y!JI^jNk8yGLz(QP!=5G5Lrz2=t?isdFHYR%exbcKQOm3E3=3HZd|0RAsg0 z;p2~43EuJqh>!Aa-0ySj0!&L{c5`mvU5u_+z)81qry$0884EiH^@Hc30)9yasTnTn zcG2tK9X<@7RgS)a;Q_ z7ksntRZr966tel=vuNMRZ7RDY<`)cl6Y|{@_b@MYFWXmq*W5-o307UB#4*V1DF}zGBRh8Jd$_o(|U+ zTuU`Sqlw9+{X)+IBr^F6SMoneo33ZsQ37zSDHH~$-p#CiuY1Lof6UR}vGrhHr;Uhz z%DUUR3R4qQ)3fHwOc5G5pKkIk^mPSuP^rqS#P_mCcS{D}S*&Qd;Lb!5N)IG4XCswUL z=}|N4Y)RY|-93ekWdZc7eVfHxN(b1y*R>=KcWpvD{hK+=t6RC+! zZ!!1W3wm1zZ9Y$3NA(t?lto_VUjD`9LHw@h{jOdn{a&v{pca6S$}nq22iq1|UeM(a zInO`6T9-ePT7YbOXqO*(QmE~6t6{aX`Qfq3@A)J}#QUzdxap2Z)52zDLBOh63{HHt z-Xa4-Q@L`-*$3ewvgUld1g6vjW9LKsR=Qyts*=0;yE^#gV0*&|2O2Fjf|-+(GTdmd zZ_rqh>~jtW^5?@x>@l*w;A9Q0redv6q|oysHN$b|E?C}Va^K)6HP|KQ_ust>JgW!m zvbEXEBxtZ08-B8iU$-HY9&|afqGvec+EUaJD{U)0SotZOhUfPe?0vE4E5M&HVVF$e zR6a4;?en&2*r5VWdoIaQTR&7UjOxjlbU8?EmLmU1uGbJ2_hi5}uBj-#RFmN@RuL}F zRQztby4ol&4J#8l$dx+0>=surXNCd3_U-@D${worGuK+$8peUnjn(@2y-{w~0SxP2 zEsi5)F%pUOi7HY&W~tP5z<^^7nSA~aGa|Z}B~Hg?PlEKZ-`LQd*8n=}0MZf$#IO@a zrwNf&yBm=Q7dyERiCW)&C!kGU1r`fm97_{eS+Es8b!aBkot@V^d=?eENG3bTN zcM+lfr|Tc<`^s+SxvVa2K)8Rt7ZjB8qw!>xlI=VbAvg!Z*kt`Vbo^+Kgi zfd>4jQ~gvUBKZ2bh?SVmZ-FyejVRuiRZpA8ANN41%d-DbV^9}3)ZN2V1^LU>L{-_Z zBd0U^#)IN{qKZ-%%kUd%XmVUEmew%7qi%wTc@VWs7mIWB6GAF*CjrzrSf3h56z$la za)LnTG@M=E(xnXn4t<)=Ym{EC;FQ;co)+^>yV3qDNvn;cR%LG#CJQ?_6l?mF&u74Al0A>W4$@`;*woH|YpW?{X&}JAf;8*Gq(I^~PSZrc?A!a|@w?b((>9FW zoa8%KZyW9m8((Nf&BLgH@4fWq^McnuAwr}LO5JTjGZ)_Yqjy=%Hb{-mIDox=e;nXj z2OUb;(Kfol5z_`FNWPwHQB`X%7iTA(ub0vW_j~KgKY!m{wp;J=HH|ODQs)?nOQ36v zzoRdEpV`P%o`E4i&ST&o2A)+ zRO_<*vXs&%_wP2)&`uF@WMJFA6en{~dB{T$4MV(b8Mc0pMeySD_mxsGCbtjSgcPAO z45fVUh3`=O1dgJ1x1XCIJqm)ZWMlBNFq(DGw4E=b|ZeAnB{1Cs?GioWBKIcV1ZGfIMM%*eOmlXBm-^PTxbm1KwMFpui8ut4v}<~ z?>@T~jzNF!Ewutr8Ekb;X6>4Updqe5J&&Pv2td^%P3{w17l!HJTO)h+zE#Psk$mvW zQ{B*#3)#9=NaYE8Gjru?H0lKUX|Of4*?5?)NsRmy z;7*aQ5b;@QWf}Hl&=o9*mZxxH90w9I_X0n*DJ+NejQMz+jY4?7dp=`m;N%=C8r zZD=`&bzT^36c*&flpS!Kd)6pR^4p7(W`&Zh)}5~rZ+{_g7Xu{r-jLGbpN|CRFM}IT z<5ms)t)TzfJ+go89tMVwNUP&wQ(yB8@7>&4_w6-wWZJmDhh(?izAA6}8G+rr+ONy- zppzLa8gxZ6P%+ht$bx`%JczvqJ?5u!h{aQD1<=*wh#Kl1ez|JNz~34MaiC%Y3uwKx z9D<_^b_DuxbFRW+;LfM67qkvNKUz$;U_i&PuXR#kh=fGZL4~#e=6qIm(l8Rg!K-+8 zehd{D9k3A>?syNm^LJNK)Zt@l)-JKM8^fVc7cqT_V6{lONAv@N{JsN}#eI)LL6d9y zNrv)THILGpAp0-!Mjx8erlX`7!3;xVDFELH1I+)zZ-D;>pt{x0Le9n2!8<4>=J`lS{KK#jxH~6L-Y7s zfp-GsNkrl5&o=C6(ecjEk^{+wOTSMP^%Pd^$PvNB^NvlnX(cIcGIiUU}DPLl-e-F zMnV{_#>}Z(^{5RG+#oxh*E%!)Cn4E~(CM79)aAjXf4<#ZJ&oh4($ZKCP z^BW6ysV?u)W2#q|gq5I|`3XSA{ec-NilhAvnt2mqb%kxcZYL71>65@NKv9SOC%Z%@ z0i`2QK_$LbY>0}GFcK&pLp*r9{ zR&`pMe0yVEVCe?#a0m9pvCp%8LD7cF9{rb}l_%eH&NxwpVe_L@ zG`TI`YmdAdzYswd%g+Mc!Sd?)i#NzYtv&jdB3!)5vLT2 zy|o9B7h6)h`WfYo)??=Ewyt(Vtw>a6*cc|5lPul$$euClW|Nd`;rAbRsFQ(Rll#S1 zz}tvsNA1H3Q~Gxm?#R6U)IbRZq|eU(DS(}{+sMu_+c{f80#_aT)7g=5 zB77LV5OQy)xAE1^wwHb=n(#1Fac3{m*xsqbV=Q5mkBmu`TsBjw=hmjZx=Gq0j*pt+CB0jmko#)317~Tnm*Ygt6QKXY z2d#w!`;%^V5$f#EfNCzMq~!9Cak7sZ7%tWeO`@sMdfp!x*?)XnNq4ENFsF<0@c*(H zhw$6OkGZ=xq)?;b_=zaV%Ggxurr_Zf+L!Xe>Js@LT zgU9luRmq^?>`Ay;mCy%Kr7+SFIQhdX<&n!8(!4Io>Z~vc{6+X5qs|-Me-#P_X91Y0#J{(Xse? z;QU~DrTr+RX~$>Q&%ekw7$bNk^H#{_^RQs>GH>v5SZ45YeD@P-3*u*TU;yVX^I1Ce z-xQ^T^RH~(B9gW5PB$55I@><&K^66ux(tXx+hv4u$KMljzl)LaJ9}XlN67Pt`vJ*@ z2Nk*K;jg3WGmYkzpN8|5(+w_BB%#6K7}(Y^2ZPvvtP`G_Xu9GF?e zGqtJ_FuoaTUXhOo_RRXnA-anMD;6^NcP0~;XW(g!6EnHNLV6JyyRF8%BWS7Um*SZX z_g#fxsNe0RjFP=9iXW@k@@Xae#+|HAcNdjfDS_AY4HP&iYjbh;Q6! zYa8ZVW7XmPgh;<9SED2*SV~a*QHq~)5ORW58G14vg+Y+f}nEryFf}A;+Q#%5ttc^{S8VI(C5fe;D!f;hcRhG)+fgLmb2Jf|k zO$LX!k_$oo^DKdO#tqQW?W+tpg zkWqxujq{lqb&)ZQ0FVx`;c9GgPc+x45U;pG(g`BlInF&)E)20FYw(Z3V_L6Ofb9iU zCwJB9ryTAC;S^|0MF>{$O&zB;oNMvw49wS1RBJs(U8d;uXfe&=m}CpM$_&PQdl?8= zu1~vvyH9*jFbZ2E5fy<@j02})jg8)6ZmCz<)BXkY#t7>nnHiqpFeJnpTCPyoVsLw$ zb6`MsEAq!>t_>iVvBM|*>p!g+W%D1-K6iFc-BCdPL2Lg!pbX8t#e;Qt>~qd1r_LL@ zeZ&`YZFQXWkSMhFK4l<|MH>Bux*#F|gp^+}#=39BXFqCHwW0y;e5zbZgy2)*G?yjf z5MGkRX2{-w@5K7jBjvBi<9#cA?h1uyHaXuUOjnV3F%|37&x%V|JDR}{WFHsIui7IO zo>trqJivZob1s#>4T2afnmgZ3E5|s#rFp%*`uM&+K%N%$y-p{xpNE_Lo{Rk+i#I!= zqJ*FMfdOnYs-eRK>C1mYdU7!Jlu&4YSH9cDpP_53wWt`(jMx6U49v~ur`L71_51$u zMG@b-{7J$4``4TGAU$~mRXqMh|B`8v6O%eqwx2Ma-yQXvvw0j% zrfE=}l=!{|?81K@A!qzd9OZJh<#zaj(Ys^}6aqO}WZ*5FqAb{j(AjaQFHqdipwmh2 zp``I8NTOnFn*J`ie8^B2i7XfHqbKM+4@Z^)w;?8~C0 z>2|N4%{hwQFIvqUD4X7(rd=Zum6CBtD_t$Sdt@XdI4tNtiiTXzy)#lIl}lyX;oPI+ zMtUR)Wh?fla;?BTCJJR-Z@x&~qkOFDHqyH3XC~a^E0V9IrdtTqp!xw$nMd+)hjfpJ z8!Z{miu6qw0M2q-mA0Bav^?>E(|*m7lYnsPpLPy(wc>+PXPQloz&euLVS9r04=R7N zPjn9@6i;@fET=o|BAFyLDhS&{gk(spz6haXb8fb_Y<)Qo>-v>Wg3#z=PB)kM@qO6X zr(y-BoO)d}y5(Yxgb1hQdi?`^6ZS8=-woE^A=fYDa23u?atuE5-(-|!fBmU7(PT29 zkg1)#MN`PfG9N-^lChw8U?!{95M1H?BLkIcHd?fen>dxpa~2f_cg%_;aghqno{N1v zBf=uT3KNK_d6BPzwAS4j_W$fYkMmQ2p;+;fMV9uAu#&yFT{CVKb?| z`^9t+&sm$_6I0U$)MvNCVBLHB_Nj?{b#24>wMT7~1sH}PbwaGGoxS7i5{N-cTr;!X zOo%FiQ=b%(UYXkC_?y?+@X%HLU?OuLKtec>SrL`jZ41h2i4Em2{2UVpH?|%nVB@9} z>D%>7sJm5fw?I2TAOBB~y)JBN)tcdh-1G+}|9a+I=D=}+SXavQpvZ5zX}`?a4fxMb z^Tgf?|0Hb9`BfYwaNzQRelylC$z8o~Phq^OZ6_P0o#RD3P%RJ%uGgBh3sy)kP1P8< z+N-xyH6xm=G+5R!rRro}8mUbvM|lKIY5j#c*a;t}>@vh(L}lJD(m>^yb-N@&4G%(& zQz?*b=BSF>Bie7^smUCEdFdaKSD*K08P}=30sJ{9LI}H}e)h=_uvB3gZ}u1rZ`(K}3*gz@GWBija39 z6{Ph};2mcJ_8*-6DeIzZMAF~RKTIYVax+6QV)J<)S;`q$40u4XV2kuGV+G8Y9#vuOj{X4qV|Ep?B|wl(qkl25jPfvo`HWkrCQ z*(Zqhct?MTjBv_=k)4Oq$`M7Zg@0AlX(rRL;kA5n&yJJf43b3s51`qfA#CF;rbiUp zFohDFUnx^xuQtu21VR>^Cb4HuLPL^#(_*q7yM&gAn~@{;dK(e%lLJHifmJYou8lcL z;c5o4aOj(_o%2Wgo_Lvh$ImnJw*`|f$%70Q%o{z*rvfME65E(C9#ZTHO?Ka)p#a{54xXMkx{lHgzt`=kr@o)=6W=?E<2xLD44P zrmt9Y+$>7U3l`~!8(x201z57v<|plzm94O>hi4j#>`@DocaoqHOoe>r29GV^2j0Bl z2N0k918Y(zrp;MUp}faV%diP&UyS;F*}54$nZ3^Mb-EGe*5Q1j$+LOCm%=0Bb{^!V zY;$h2@ba*fbN9K=qFHS9qt+)TXGJ(^3?%|GY*zLlY&R~X9Yycp5M~E>6cYy!<+9%4 ztd#2QfTFi>x;H!)_^%gJ2D?!(eN3D*8X@~VSw3b}A(nu%U5LwXDTsze2@1O=L#*7k z^9d`<2Ugs27puRxXxcHO;*n~#7HKwXvJ4mX5L&$D#B>9OiniqvmaQEQ*4;#pj31_s zR5Y9*rH3VDT*!58_|?aRRT>0y;JQLAEL*B;Q~JOjgL<)Spn90+^23g>{{$h}i7VyA z%?fPYFt9wmw!w$Vn%6ydFPR2kcbU>PMXaH?kuM*tp#94|x{vcyaxazJS%ivpU+GJc zkBpPD<M2nD1VX97RTD{h#=grDu5`y@ z<$Kr-eE)fcrr|YC1_6tSX z$8ZEzX1(v?HkdFC9Mk0XCJs*u3=^cqO4TV!gZuoxdcW7FSnH4Ht_F0aoF3MoMpWby zy(o}RLb3^J0bP7EDga~r5fV&8XWGq%U~h!+LNQhM=gUF7Gr?v*%wG1Kb0jQQQHl_u zTI`JbO}*^QV=1dgmAHI)ifED#*n#Bw#w>zJy>jh|$-kevj#LGdT?DfSDXS})tt%t> z_^e_*E5~R>`H@gDhrvfn@xV^TNTGttrIz^ba{t#T;Xa@itw95+&z$`utCO+XUy{?sqpjovk+yI_JJudoLuI z%1?DQ{R{6OELv9Jv+GXmqC!`ytIfNy%BO-N_w%|mN1X`6?KE~z;+U;1j492rXnte4@aG5CZJLISfMgj=l!x- zlw<(9rh56wWq|GL>f6LT7;$|l>|f*!T! z4VWuUl=SO*_hiECP!w!KM1-hC2mT-tt-U;w0UBOSMDbXn(&Ej$cB)J7N5A|QnMc0j z-L5fSrU3msyh6ls&hSy3s#+MAti_LCQ5umQ>dBNE50--fS;*yNKB>}M-FAKcEUvGx z?VVl8O*sb&JS?agAsl&=$;keBXpg==77>A(Y2-%vIvV@s(KRxI#J@qh;JzYMb$Dr1Cfhn z8da^g{JpN$vC;%VF{F2GEf&Iov@{c%?O3S?z$+#GG(bfWpIXxJ37=hGUHiN)6Tl_MQIJ<%3!e2qautorfi!U$W>8jwBZu?+4~ zmq*mS4#Bgt8h+Z?xxI>Fgd9jtocy>B4E`135iUV-WjMj&ekX?gFxG`kX(x(brHPwk zcf{6|XpTWQ-ra7hf=7OfXNk~-EQ7aojF#gzJ^!6NKgJ2Bbz|`9YmTjs;MEZIyVTVD z$uY++*HyTst{AwXuAGi@4m7w*V(ZmL+fSGf;6SQo^@7V`tI}-5b0JyzSqj<5;Rm1G z1!3^zh->LSn217qbhU9E2-M|otXdl_V%-02!}lbdGBbJeBryWw_YD`6KNWKOQ+p#~ z(!uDLqH;TR`>QbF{OY3cgnzwUgKcgck?V-Yg8(3Z^gEnfC<@;nTnTdo|!_Iy9rwI;%MN*7(5;p7sq zKN(V!DR$g3b5Ix64$+VSuj>xwnAYSZAbqs7D&3=g`7qMw`r#K^wh5)p!Rg#7raxXI zTlZWi8E$xj3u)|$RZFw(0Xd((@8PeiNnsE z`Foi`H3FKat7-^+4jlB0>EDdFgrsQ(gR1qiSH!Ct2TWI=)$B;Y|3#Zv+7L9RhmQ!0 zA{a3W55t~ktYa35wXsy~cEnvUNTy3l;D`3!~-N=eN#rp!ZDj`^no_?%D}ntjuCH1W@&yqkA z$P|bOT^|z{uM-!Ssg<{W>hh29gVo)6?QE3|DSw~AABxnq8W=+Pv((n0{(h727-SReZLo&0MQSp z%T2;5cckIX!D}XS!p`W-xFzGAm~4NSZNGl)5;VU94bC-qqX50*<(`~oPU|Z_%CdQ| zV?D}#HO`YCiE(0|j-Ql1nDf_O;acuT)-)$^6fUp+7}))s_?WX${CE9BKKmHG0-Pu{VrRD*Z?9dm zC{zRchP;YNtWwI!nbu-WMI3)a9*ig>dg5}UIo@E4{;}ff z3yE?}4Xh==$e5QWgh%(UWx!&*-Eg|%2}u>x)0Qndap)drZG+J-ODn86qSjI^UT%cs zc}{Z^JS--5l^mv}+icV3^rTK?;oYwRFpB`gl#zN5hhsP*QJzIL)asGi@{@2?9+x4K zM=Oij*60y#nU{>YZ`YiZQ6iUhsS~GghBMN2oL@UHf0|>?rK7^grPl5SUDAfD7iIUw zoiw%()OoBpo06H5LK)nL-;eJakqD{%kIcToTBNodBYEUePs|p03>dZR=b!M`+eSba zT5GNI+ZbFElVslrLjlGw;f{yXnADF(!FN#k@bWdiMp#yKD0#J!1xQ)9gJ-?I;;si9 zm?G3MmvVbkr<~xrd49E~+Q~<=shnRnDn2D~-D0z*%rq&S<&!RG<+M0p>QPyg?{lrF zy^(u8)A4L-Q|OpAka%C+*ilB?P8wr$9>lKHw93+UxBHK9zy9yM>Jd6dWxTy!jk5V6 zb&0^-1G+qBKmNZE|KI+&c584tVES>xfP`mv_BYb1=7gQ#^UkTkrti(d6HoTHE3B$1Ueh)yEje5TB9~ut8mlr2pss50!3@pP+ zaw|JToQLze5Crv5a#;3nFI3D%`0EU?!zYth${4JlQDv`HvXV2Lu^DU!SX|%&J6ryA z&>XdzjmsPutWueh$O%qFD+kS&wH;VdrXc)sjKVl!?SXm`?9Mp;vWZR1r!1Syi&-8w zVc3)8){9JbHh*&b`=;CQt=5NE)>LQgz$nBlzCX{gRt$^zSC3XP5z$}TE)Ga?GsrY9 zB41}{>1aL*cE%&4I7#_rsG7S?Se~Azawa(hmCdWp+S8fn0Bggk8pLsxQ5P?ehV-rg zZsmwq4s>fsysZ~ww6v9niQlRSCVQ%bp`J*_TL-239w@G7Wh^LP{Xj3pQqL(5B$vbA z|J>bax0@+W1A$$#T>*G!(Ah=e2gHE~@|vF|{A(Up$7s2upD~yQpH^oEjFLZa#Sz>^pd(m zr`+Ux{PBp8VuAI?PzPr|3e&karEN^-q zAyAyn*QFc5GFZX*69Z$~>rx844-p+4OG_dui2f82D>wLR> znLpc}Xn}D6atog5Mtq$$TCc3JTQNbA;QL02%6HnJX1zexkr)WjFwqUz zmCBqxzpTv17FYteHfh@ZR}xQv^9Gv5L|otTzB#3Y__On zzF735@v7PW5E>WNlRmmc#ClALcnC()NaW_r@6*t|)ahGPoM33tpvY^+Chn24VAY0< z6!B92RBy7AEWHXLT~O6cRQYjJXOptRkkhB z&ekOjXRWT2MLiS9bFI=Ca3I_~@Wt)wdmBc)^m3)g!}hx-^^`>Eq12WQVf;g@uuotM zmPCO1BS8k(m0B1u@JJBLLEYO_Ue{>NU&>$A^Rr4{?Z7#&tu7R__gm%N z^RJeKE9)pHEB}r7V3!*e1>q9|qPoEsRcbKZxS;}!oy#sRx_#E!hwXlSjLrwW!VWQq z6hh0+;mTGom#%;=U73FYD1%LmXVuLbVm*lYy{_tyk0Y~8hP*j+46>Ik;#{Y^T8w6c zndF?vEDtMMPVvnKHgF~%*Cs+b_~&*=RnH}^*dUocH*CA3&6P)RbIRL8l>PIzTWjTuwAm}3f7qD!|DX!$e^3Psfc-Xz z`de6>visiPQ{5{V(loKzcD+%-=6h8aW6=6AN)ogFw71bJvWe{(dL5h$Y%S_-J%avs z6~ihmyY%s|fdrHM*j2e|eyNKZgU$yhG`EF3gKt(nx16Z*}HNifo`k`x$TlDQ)+ zKZI*rfr7M$y(;Tt=GZ_Up52|f>$0|XC=}$aF~=nD0wsk*LcX|Ta+^v$ppR7?$#A;| zJ^E%H+y0V=`GPHUf*9Vf*#0wOsw)#xj%cZHP?2@~DQS?Teeb~nmG1RhYfd7~wN_%J zU@9V-cR(BuRM)#$$_YZsNBC4q06$H8>bxNn`vF%eag7D}`dhX52HIbhKaR(2zh0~*%33&kyqgSs6s3JlC%&wQYSJay@MBBT*xd}^LDYX z&76`|q2n4;YUB}=%9K$rOGNAaAyu3(LqL=X&Fjk z)>R%Z=sVkEG-2@FGa&|#b@d*s?Tzj5!Ow(M5tkhthgSNxI17njN^slC_1q2mb-0nC zkejFH5Bi_(RJPI1x9qEgirl(#H?$%B8(ty3itow(w%)VLT)9n@PJ|i_nZzk>SQ%kZ zoWXfE@HX5x)IU8MvAkqvnv%(Ll73jEbg3Htbmt+Hg`ucc2I+9DRv+l#yc=#R$Zzr3 z;jAU)JlEw`Haw1(?9kaJ0uDnF&_I%A=lX<4VMi{SJ&*wlB7tQ-V76sJ9utC>nm;!5?Kf7dRvq;tpWAjPz4lF4 zKCKGQ<7VaKWF?s4tC10cpJOJing_=t0`*uOyc;u)Ep}1bYWUf5E01TqVy*vX1_N9L zLn-%W8(E+UDDS9L4O$5Z2na*vyF^gy8Tm zgTus|IhTwzIutOuj4Ew!`?cd;D#viT#`hgdyq`>jaj7Qu9WBx&cD+H(Er~^R5LMx) z5rKN8unCxbI+ITxqmG|6&5mXY|0r`d?lrMQ@CgElLt%Q^4VzYtey?9$Pl|MUz1;BF zy$(b13K75SjLqjW=;Hbk4zl+9b2FTwMf$=2bce8i3n#dN>#QJiq=SATIgm(h$WpZi$@zXPZ(U~^-O&-7zfG2V(p{y=1-WsRLq`ENWW4W{NTAp(c#9}Dy< zs-T>euPs_9BUEWac}jIb^|}Cb0G62s$T3tf_8m+RLo*1#YZrPj{RH#En?sK14~^oe zvD4K0WL?cfu34tMgTLn~sA+Mx^~JAHnGo!mQ98ri zH7!gffDAgD<*!-5vitP${0LjsFulNTKkn4BX&i$T>QPT8cakK7Zl80cqFkR%Ry;Ep z?CxMsx$cc!S#%`I`qT1EC$J^ye8D>2Yg+}403azr~eRvTDtLJh|>xIG`cV3LP%SH01HR@6oLZjf@W>PpX)F#gx zIb1g$EW6?J;&gUB#VcQ{&;4S0_4si=X*4a(G}7E z=nBLx@ClM%$kXNU_Mg)~2d}51T{8(dy+zYLJl}1d6VIJE!=RoRF6D7)t`TDv9KRy2Vk=qD2 zKnt_7tc_R|GZTae*-T(z19XK2jB2;)x;7e5lf8Er6>K4D#NYoqHO5$Uys%dZ`N6eP z+#<;TMJ8UyG-H9q6nm?fzAQ{dTI6==mS72;gq?M&85<4BD(`x2=(n?;l5B(}hVw5M zfze@!!md2{KZvpjk45eW0tLD=9ZE7J>DvBGok4yVJ@Hsl4op=c82j#cShg{BvXk4Q zc4$W)yLEU#B%o1ez5*<#X@9Z+LR^vP#zn1iv*sdB6;vT6{ZyRaX)XWCi!LN+)A zl+l6xkN`%0a5Q~i&1uVWUJx$lu`SJD3UkPu#HE?7I)Q>*o06iXmazbO)|SyZB^Yz4 zL@|SzRt!`;Nk4=m2(CQ27^02|=EdDPa}{uDr!f6qXmIqS`_nKwT+6)!&ZX!3(PY6s zy*}M1^M>pe%Nie7Sx8|=%8IFMC?DTJkM6^hzwzn4FrT$0X2mt7&)=zLd6(ssO`N&4 z;$r!65-!K&EA1Z!){vIn!sjP$HQm4#`CakXJ+U8PXn-Gv&*rt7ve3E+ls|NPJ&fsi z*tPeCmLZ?VqvB3CC#Od>e|zldv;P$#9;o>J`V(p6hJ~==d{BCD{Gz8G#gR|xq(J0m6lXvmOKpP(uL2kL#I^C2H0U45X%fz z>=a4%@OYRSv}DC&)eaNYef%12qCUfkMjv@oJWh2ZT8>O{=$4Ddlyuy!kh+jH87B5C zCfBb^OqAhl=CV+nlGFus|H3ZMOsPb8VUJxJNhx#}Msk<|6GE0GW$rTHfj{}yo+Py@aJktv?gZnpWeda!C-nU0i8*;u<%McRpf{g zGV06UNHfq_C>W-7f#57$!1Y=}e48KDVv}I1+bnw@a0DGN=;;T|0s;J3edkKFN<-2E zw|zZc9OqYr%6p68E$u_?_dja0U2VpPyHrq@Q^Ouo5vQ}CKVHitGi5=vL*4+kMCv69J=CUw?T z%C(FE=CZ=qv7$aaBp!V}pmqO!uhOHN&*gColP8!kCCoMI9pG%*(QqDKJN8ompnu2# zc*P;fFKs(88U)!;SdZB+U70`u+S z{9o$*d8I}fxqx(2_}Vn*Ka)K-Ug+)ax#QNf!0n&Z2Y$@gmhC*h)7L03=;3Yzroro0 z3b~NaZZC=EW1Ze=UT$*W|IzeTL2-6n*LBmlL(t#^5AN=P;1CGbH16&McMI-rK|^q- zu^_?S-QC^o>-%~C|GZDGs;=5=?>W~P<6uOIVct1ZV?9sab`$}CX8`;)Lq<6HqurQ-`~;U=g04u#dI};RdIZ>EC9_T ztZRdxyp|1r5I8QmY+V?>1*j#$B{JP5aV94AP1RVdjqhsA)82xL(iqo!# z#a>Xc;e!j|t9pzQG7z+>A^zcTiXf)-fJ~h7DLA8KfyJV)n;FJTItIV zu7E8h)<_ZWU-*>fO2m68V1EzFxf8oM)MYj9IDr$RgQqyOL=Kd%DYf4eXkQx@Iwn2`{EBe(D1i=GGVSmh*6KdOoLB*Huy|%${A44 zqWyK)J!^Q_S82uj`-Xi)rtW1e^k}#J>?;(|=2(|FXgfrS-&*Goio}LrOp`|cs>C8u z@+nqw1Cg`LsJ7W?S6(VT*&8E3G*aNVw^@LyXoE(>7x8FH@d7zfnOF@8<*sQ&?v1+k&q8uwfe@uY3`i`U#nz8Q$`L+VeNB{V<@u{NjPKDD75hCvuuURbfDJS;D zq!t?&SA~F9lnMBrg_!hNb}J(I6JtAx0eJ_!Qyy^gC)lsmFxLne z!W#n3#W0T!ERWq%o&yF~I0P)nolXazlfa*MY!ikV9Kn|;zLtY@r5tH{GS3?R7-na+ z6l1?xrm<)S$}HtbIsUNCkG-lte58Fkbo8>5(568irB&QbcAk5S8;r6f_`GQ${4ZXf zV;mnaalq(YXV7A&*Z-=KdsvfZ)Wu}mUU}#~`1Pa*#-H}8_G8{oai%cLKypHC#HW)b5oJ}_? zKi`BkU$g!w@)ZDOvE`mYh%?JDYwyoPhJZy783=>&A7_X2N6riBp~!nTZokxL5zJ_{ zp;LOHfnjnJT)V`RqEd^$ZRo-~(F}WW_It3J)3Ha&nw?W@Xi)huWd}?(KADt7upwcm zK~_#qVEQB%>{26qMYp?MhO}WVfbMcr@Q`sAPSy6=GK+{BJaiv-b(gFg6x#4|-!)KF z-@t)cI!@{12qmywRUC>vZBjlm!AwXV>oc0`cbKM4t5=-vyVQQ6QY zDk#{)hIW$ScHhg|;rRUiMI8G>j` z3}FR%A7hW1x0TSj==(-bn7xqu{h4)>ulIGx^7&ee$Qr3;$=gi!6bj>dAb{)3L6+n^ zUwM|KJg)ahE$mlbBr6|0yVzd_$*>~%Tfh>EK!dvxl#AJp76PMQsjBF56<(%boQ1+$FW z8&cSxhKHsqjbJo7zwXUmQ?y2U%HPJ+mZ4ZUIqU0OAxIX(`5>{Kp)>ij@v`CUd}2V4 zV#ne-kX)ixpOlHX`T}jZ?4BXeM>1LtdM}}m@FkD)ppVpi_x*0!ud!ZmJIw#ta8R#W7P2ulkyUn)D6AKvS*Mt>ukxw-pZv!VsLoK}0P z_*2F~&sVDc=5Jum{1Q@@2bi$~m@{KoyYa~c*c!x3q|n$`wgaUuC2tFA+~IF&Bt)$i zbkI^cSA25pD%Vk~2H*aIPm zrXj90U&FszR?bkGd;d8yN1)yNRmMcdpYlsB4UDq2Fy$d%CAl6Fzdo=J5+o{Y0Md(A+ZQ|v#Xby?i_{h8%_oPS`S?>)tt$r`L(uY8** z>9cHK$Z|pAE#1F8rsaQ>EKv4$_!jS7rV=}Gbg~fr#C2ULimkdK>02FZ-c^?A`OQ<> zm~{uP37Q?r(KQnGq2rWD{81g8GhWVunG=6PZV+QS+UA#Uq92tne^u=ZiI*>v%v4{@ zoSl&M89&r(r%ZGQ{xZ>yU{aFdRf>s+eNl;*tz;g#Ft)=^g=Up3fK~cql8y8oKV%v8 z$Yo4p1nXLXk7-sxAr`x4mQE}})fY#V`Sn+{D1E4NB`nyRn>~ook`Wg4F`)IBlY&W1 zlh>A5I!lkg*Qx>KzS1sSjCYW=!^4(X^O=)vQn55v716nWhUnwtLg`^O(+`$&h|rKr z<2ozM(AAHM%2dT4^fN02_WHi5@agidtx-(RL*PF>SvC!P&iz(~vg2U`=p(T(hhG~- zhwUGu@ULGUwqv0J*|(?F|L#$uKF4MHk85?~BG1{0iHYRw*Zlw<#c3$L=)dGv9Gcv& z*HzzQg2U7!C$kMY6SvJCULIdhGk^HGzDG9sx*Qi}igsKt1l^NWYR*i}?g1)jc;NXGu z$c~6cY##2PxJD*{J+Nav)Bfo8j(g*dB3V7ZdXx81Dkr$Xn`$l{@HJuAaB=d2d}PPfs4ivCwNdI(`di&hf$J+M{AQ%TGHgPVWA-EE85qNUbXR$E(KRH+X#~q$ z9^~=~gjQ-Y1e$eN(bVpQ-vH^p3JjQ&Wc@b~IB@Co?;^&P-R~Mlva+5?{VM*p%iM4M zBFtv&e_|wg@3noX?GBnZ4TJ5RXnjCl!AwcJV3IJKfXdnQ*LkZ?=Q<}wt8ES6l=q#p zlMZbiC=%BCCVT5+ja6~`X_Y4l1H7w$1BEuEo6Y{o5DOigZ=IcqjAb~3b#C+a;77-;``?Yi=_EHnT?rdMf4K#Pd0gEm0)lLw&iDyuGfyq-vMz3!Cf z!T`KNt!IL{FkptpQZ+h}chX-PMnBouPQeBq@FZuKh|)i-h84`f1}X$NNfrz zbu1tD`^-R~V&Q9>JIn1o{`|F+>QHl#5EOGgmgowXgob)4U zl#nQjvj>bGdJ*2S_PH=P(Yw^lAb3hz8%VR%IIFw78=KC4gD@tAsdtn(d+_;%z3<@( z&ueVYOY{jXV@O)x_hu8l?8Fz(i}Kq?b7Y~}D`TZfq!adZUef^&@~3T85spgJH$@Sf zMBnn=YrdGJeU0Pfrwx~}U&jJ~;JP}_sAY7wSASo^9{u{UWFc1(LjY0=M70rq1n6@6 zq>|Ni8+Y#P->RVY*7!;XhRw8UDQYZD<}JC0@RTNN`s#o7($84hPe4udv9w-K-HPx% z;meus1@k{s9CwT_>1)py@yYk^^Kb~7oXkrgn^!bcWI@*!m)?y3$_q{2^Ti0oY+sCU zj<39z{e3FS{jY@kw#EpB3qq^xuZ;fC`mM7|-G5?^XPp1$RC+Yu;{jgi;fr(hIOw=B zuDb%|OIQ4`_dT2!^>|O#e?9h6UhVKWMhVCWC4n4pHU+?P5B{)QZazq4e`>Bn{aAP& zSiQ3*0Kt>#lJYlbybGU5b%~c{^Om-(()AX%AJ`3VqhV^Qt&J3dCG5jqW`7|2^oeUG zuK=U0QEIu~(vZ$Y65kIbN*|lN+Y}2JTEHnDO{sswXF^`taJfbgGGUgFXhH3tmNv8wbPef-~oLQDc?x>Jc5&92N+%&(Y3-f)zH zx$dg!_);`kt~vd~bs^iSMCv{8=2GHNZCzkO6x?)-MmN!I`r1o8Kpzs%IVDe|acnYX z${L)|XqKEkN*M9V++s}6ohU!(Xfp(JczG2k9&vZcMg_C&UB2%lDtcCNm50=y!e)!8 z&NDy5uU24*rD*9>=2$Kw)sJ?86pDI_7?d4$5BszUY&AsPN2ou6vD$W5GH8WM8(X}z z56QgC4K?ABX{bN65>^`eAlme$Fr|naiRV@FsuUHll_1Uay_0V6FH3ZEle@rdNrI?~ zf;x}#+I}PLINkX4jbK7eyS_?58&H72DF5KfQc02E3xA$*Q$11x+rr}GH260Ybvdv* z4FUBr5tXAbyX(q#SjulqWczm6cRo_*hR*ua9BapIh5hTsf7a;M%41)+jcr3hp0e4a|9fkUg$7=4Il=K?zdBT2 z`t}NoLc6vE{at?@-S%JPdDq%6p}4cBH*??1>mOCq2)4&0+|(M)Ffol#BL~j`7&dIf zcn*8U)gL@9Q=v|kqoP7+zjV7~?oUVA5vu5Kw?@Oeycw#2FN#vkab!MGshz}M$ZbI% z0pspYR&)GgvPlatYdf7E>4%PZENEVx+a{z0B$*b#MJ7J5VtHenOJ_%*6a0*j8N!uB zld*gg7c{F|V^GKPjCCv{R$H$wmb9Nit(;p+mY^vWsZ+$1dNIVgO!dUToOWZdJ-As| za!9m%&?{qoUBgxv%u`ecmy`6Z69#A8g{1)I5D}{%;j)@}nhQ{(S~AceWaL8SBS=JK4z`WqnVHJ@x$aRO6`? zk-n5!cR-S!XuGdUh349XwT?vC++T?))@1EQsq6kORA|TpNmgCJqIT*lu^NbE%Lrll zc2z1!;KJ31EWs2&O4*{r=0I&FDUJ;5(3ilDk=SWvY$K~5<1AfWUND#r77_GbAS)4) z@bIQAT%$Ao?e9q&Y3bVt)uAS!`iJxPA{Qc!RG{UBY z_YLguE|gfcId{W&;*OiZ=hn3gZb-zxmB@iw+F(Qf>?12b&B{#ePdka&y^D#zm-Yc8 zfnr!i(Gxe~WwQjZM{g8iGz>~pFpzr6)Z}=WhMezyWihxc2*dA5>CSMX#T=m`pzs#C zTprhqmq7(AKU6*jn25fvO|knpKJMT3m`S^Td#ftLngz52-T6%?Sgpyq3?eSj8FIa&r48tDbxY-PKoWq zh1T=Z!@(7713)v@d+i!(-1z$E8$=`Q^c-LMhmGvJEUSr9Yvu#_s zn`T-PH>?7>U)y1!G@0^c4BcrcU4{fI0+uR?6m;~!atQ09?E8RMeNv)@u4O?mY+l%l zVsNf}8}){9SB8z;&w&Fra(BPk_8+yw$?6nkgf5B$6C?} zWtE=g_Z4WjQ#nsohM0f=Y`_sxe5u=GLz7XpS8mEm^+29NY!k_OY7I$V)__uNt|Km8 z2LJuh(cUP2!I{7U44G_NVf5Mf;$LWd`nWz6Wg4jw%=h+wR2z)#OxQlK^&cWm)zU1Is|*q#g|q8^d1R6VYfFDd);%w zHz#9D+EpHhPv7R-u>{8iF$yoFi%?Tu)%c~{Zs9856w4XGbCQYN6%lPj_<)Ycb`{R_ zj*KOqs1y7BNuL~pbp1jNSBz%w41zT+8qg~iE}NYP!zvRS8GcMkf^bvuTY`7wsOx@5 zSMx%2k!s_d)7NzfbXnn$=N*+y$^Xb7lbdpLp5z8C=ZJ7hF^3uee)d|{ptiXy9$!| znD>)!2zLyXKUU`)uk(mvjxkm3Pld=u$itgB%D)ymH&{3CT^q0F_)HDb$sd;2}NKVH!VXc9q%Em-kUF{O@Hso{=OameS5C*y)9ek7Z!e{ z1CYb;iQ4(Q{Wl=~2gkjqKob(^6m$oF9UqU?d0*;Xy=GnYyze6>f7y8*e|<7P7rnel ze7272u>4&x_6@ED9ck0dakgHI8=YuAzo_~EF^t&l0Zw>}h^-P6ZVc`M+n65z`$b^$ zn~8$hcda?u2wc8MoD1oJad-lx&?79ulkQ%p4QTJM)2=CK-vDol8+}d@>fLdefm7+~ z8!zYtL%L!`6Uu(7aK==#>*swm|IjPVK*<=BGIZDQpe6Z1j1nZ9)@_BDpPd$vB;jbv zT1i+wr>X>@CEfi?_mq-}Ym3Rlp49n$B1bNnw4oXeIEnkaQ0TN>=g79Sa<^<2dCNVS z%jiv_7z;eZOUHf_Am*7SX7vjG0Ye#?loZA{fMt19+&BtvADafk(z7N5tk4)B>Yg1=WpUrzPY!D8nx8(`eMMC9%0 z^YpiPw17c0jSE5SPu8DEL;e9g(0n7aMf>ge!uHXL$N*MG1dXpjNe$Y^pfG?d-HF_E zSpA&De7ELTSBE4R4ReY#rYms(WJ8s5kLorFQQJcV{=$g{z~WD^6(|Jc%T`wRE8MN- zFFvJR=O6o-9{2_0dU}W)GsXE!&Q~H-H3y69RP5|wyIS^s_S1jqdDFFWD#Uu%v6$iX zqUMyf{zF&1czM2wIYl2CqTp zx1ts2k*<{wM`IG&n#!56x!+6Bwt&TBW?1GvMglx_5&H#3s_TD%H=aytF1tg5up&+r z#8vGz(F+PLBo)r4#_TY)P%Zp|nE(A{Wn@CGuH0^|ImKG6qjzrDjxPt98l#d~VVI40 z2Vf3o;x_6A(a{qyq2X4?H5vWZINt={+yGa!w?zW%J#j>_n)OQH zP;_cgY4T;>XAz{$2o;<8Lf)ccz&PPXDC|yh<4#QZ!iI+OTbg|1Y;aI^j~HUB6K6fa z6-~x!N>7f41js}U1GKA(a_i2!aBGfra4^^F1eS3>-iuF2nr0+U7H2a$mu7Linm%8E zA5-J~^mWb>ElW=zf1xeX?^ z>-|g)&9mPQ?De5hoFCi;jDOhwC%d}m`Y(qQr*J^+!$W%;G!*Qphd5vMww^;1Yywfw z`|H0?htJAue_h|9)flha8zR>ZaY2FlFBaI|SruStr_c?Vf`Ubg&!5Wrr!0z>M4bDR z@KYW4I|Vbonhaw}r|#qt8!cHM3=~;&W4KKh#`7?4tKrD& zS(?oxVLWJdDdS(mh9OU&`~FYUnRzBCFZkpsC(fdFuka+4^qXc5vk*<9}vi*$|dk@~{{EIT`*B$rHp8!|m9$5T3z z*W1Zkp z`l~Gq7*e)J4bp2RMl*j z=@d?oi2d*@(U1m3t0C{rOi4>n-^kPAI?%O8SYNy3yI;*zLmd6X*e&*0Nu!K_e3ff% zR+dR7D@*?2b{fSw8=6*yMwe=nWeuo;o9U5HGzMAHArbVo;y7m=40=T2Oq?A=G~wl+5mFiS)Fk_+!_ZQEkP%_80x z95oI-y%yZUdvqV3mXg6kgt0pPJap8;eaCjW1=BnyL%mZX@* z>rE8(2EH!MgnA2W{C=ln&rMJqs5$xHo33$D@1rxQMed=l!!|=rz;@o^DURh~!d0t5 z*P&rT`Y)vRWFJY9uY3>ZH+yx8Hm?^xoP-gw%w#@yvBtYS(qrGPc5pb*V#-Q8&!Hv? zeFF~8ad&vcz$gwiGCarYrX#lM2pi;dq?BJIEpBMShW!1@6yY50Wh6K3;@RQU>77>bAS>xB1y|=91==!xRR4S>HPSf|+!jMmEsE_t-}6yvyD|cu;?Xp8zFnJZ_MeK5@iybsd`!$4 z8%~bLpL>9i&Of+pgcwomiA2S{%~PyXe3?sGUk9mMnhk#ku0n4oLEKG5sT9j(v`9)@ z7`^P$M~>`5oo4R-(d+rP&ur%=4)n8Kd*_B5rg(c9o|Fr^sK4W|8fF3jfVe&9%Us06Rqv7|OQo;M6~r^e!5qdX!G9;~v7 zalvq^U-l`vUQ1n*!^M{E= zQwjbg2~6GC$<)mI+2DWOxOT-=_PaIp85dHu4Zh>oP435lhjw{?*JjzYU@t1Jp4y`- z6;;V(3Via3h~qIuNg3O^pPLH{cW`q<7#DuwLm+S6Mq+*1+lUc=IbMpMZkb)OaY@}M zY4)tH%AN{d@K>~U?f^bV? zq@r+pzC>DrseTn0&b#w5!}m@Kz|y}9i0n>!OuNgCyCpfER`*b7;o%6$?Ee&vgwWaX2cLtefDs>1cRxP&nA}Fc{r*_czU{r|UeEVjf6Z&} z4e>{1jJc#&AYKIo{+8?lYG({3(NGLZvK$TFmdHnvLpBu8Ck}<_O0|Z4fU*!ypj}|N;L!_B1;T3Qjmz=*tLHe)l?j^BWJpXmQ`2R>kB#jPcM6s8#=|B`z2!G{bHr4I)G1_lurI!uW6_V&$A?oa?R}(NJ<_ek^ z&TISuTNGu5Xi2@QVStH8K|;*7)kFMP(=}95vOFQ7TJLqrQhh8wFfq-fFugjBff7gKX%oMBpDwlFvGF4QIfRjjQ}o@3 zFSG_0`KnFEH^U*nCm#MTMmJ+&MMBYnTr%{!H{Q1l z8>D__6#%#M$FnwBS&OI#C!%a_BsCRZHBMw7XZ0LjAb?k zSd)P237-Hw3ts*oxF)?mj$a7fDi7M+;e_*A_@Z@q$&>oGM~DV+2oyP{m|^fFi=X?c zmq>XBwiKsX7aZ0+0G0<#yMDjc?;dk^mptH0xaq>~E6s3#0`JKP2s#0Q1Wl%E#w0<@ zk&X%i<`@n?+V!l{HBy#(Iym$y-b~w5^3F&I%XjPG`0l&LiIB>B6QAZxo)veqBQ=MQ zIUMf;ruY|!kC#3GgzH6~0mm!nMQtf2nTdX-ZAIrCblkmAmbsxI3-y~@Yp+?|CV`&2 zq5I=*>iJskMq49Dmei(503;n+b#MH{BN&i?0+X6`bsQDjt;Q$ z@*tOtr-u2vOAc9cnsxn`~HJy>2`mY#2phvmI6Y)YXmdb{x*8m z#CQ0mfY?n4gO4*|{LgH`h!>7?CzNEaQgUCQd$7RZO)X&W))NQ_lICQq2Y@4`l3!971`Q8+X|eqV|8Vh%j&YgSFl71# z)wB2xUz(ucLqhc^*hI|B#Ca}lbPRqn<(!S1Z2~2^E#~Kd-NNilh@~s@hq45mcWfPY z$lq9}`g@G*tPHd8)x-k%REs;MW50(8`Oph$d-rK&^+V5Bbzyc@c}K?%ghWM9ks{hv zvHIeW`rVH?_NvdbVDC+A`9R(Z_2QdLo=hLk;Q+Z+ihZ6#_*Z^m~)NzVb? zS(v%{a24j5Zyv1_F{6OKfcU0^M_}d~CC@fLxCxneZ%iDa_@Zsdi!MF|*w7#Wms1qRUl zw7wmjM(Rvf{#j7mH8NH1=rLfa~5S+2R?>6i0ysl-N+=~IjL5+yEHMpjc<`WnUHaHgUt5Noht^Ik{ ztE$PXYz%ROD+AYzzz3>VSFG<)&Ucs0o{~@t-`sylT1B*~5S@YWH8`;{u6OwI{5Zn` z@Du!CS^IUX6<8nU%MviNbP2h3c5p);IE!qpQf3(hft-i=I8z}1Nr(F8_5EJocsnkm z_1kXebo}0-Xo2^Qot+(XsL^;th)dD=e_NjYP!`VL$bhg(m=&OR$X8#d6^z{V)%7;V z_x9zg)u+p^tln33m{se~4|jiv1)K6Q=eDwaWZ3b0lVQucep)g?Nv&gpC9uI8uH>RsBjLuIpamwSz6VZp;bJ zyB7vX%PX#&R7ibA@Agx&U)rs(rO?W!9^Bp28H#Bz^5-C)CsZa#oVZbooG$!AcZ>U} z%gj>#v$!0=Z4rJ@7Bh3*hpY`5qmY6|7mH`@(l3P1@^8%8tk$dijeZEO(W1sihhHyE zPGJAZ5)|DiFp#EmelRg+fLKN#NVV7*&g#|nx+FTO9x`Q544CM*YBC^IXLH(jfP74_ zHMLT#v>^(=78Pl56=XBRt4!@dG~~jK=)3em1Q$~x$^fwi7t!iV}%yBcbennk=sBSiOJ6dNqHh#X)rI9;A^Q9s=-X#7w zBY8XpUbspC7g98y`KY~voas5b!>_ZhrE#bvQ4u!Hhh34cs*ip*W%%^%BhyP}RPsV< zg{k@N6a=f7&B*GK-f!!zzYdX|p%69?^AicM8b|-n<{dRm*D4#_!Lkcs+gDMxGg0?& z!5?S-;nkqrjepz@4i_SPJ2hhS{LtC1=Gg0`QPN?w)1+M1r<$!XGaEb5loi0%)f4iB zo0-qv&nUi0#q+LkujMSzhD$-Ez#F{`+gZ+Zw+0^b5_Q$45RakbMJyLEGb4os>S-P) z_obqb!p)qCp>XhKj>1VJkDwEmMO!Q@F;@q`IrTecjqo}HYKwbld}hZ+liBb25w~sV z1J1w?Tq-WPHXlwTCx+*2bA_He_f2=(Z89MB^8MC_*7&Q>M_w}IT1TwVWm3gSf40W| zt35w;^h0Ycg3x{I$bG2Ca_rgfZQt(=GxvFA|LyJO=EhucdW9-~_5Z5Rgw+2%xoB-T zx)`__ha2NQ`2HS2+16qD2 z<`F-pU+|AlBdO_SNpfVNBhKy(k231g>&BInVPg_W@LM#A#-3V;{_!Q|qOXJ@u{>Kz z2#%a!flT;*0bS6hpET4F(Dlm|`e#I8w3_VvWf*8&BNf8ZmnY?n@DR9An-;0j@>vCJ z;s|VIdrG)2pIELOD-bbJmvO=|I!+ZUWui~#>j>FTtlZsG2OyL^ZP3WM{f#fzpLR+s z;Hj`n9Qlk_lY=a^tgfur>+~x-1~L7kWso3i z{%$&5JM9R?>e5~e7Qumt6l2oerHJDd2g3~(d)Q6+J}ya5Vfv`xln|DNOK|vXB;08C zVIr1Hh57b}n`jLa_{6~qp)Wk5+Pr*hZ0m~gDjx^}!^S}uOrTFPauF#z#i52sbVW#2 zb#dJPhG9~FtNWL+3@~W#s|L4VsHCDs%U?um0klUlVdkkVXvK=|N_MG0&qrUv_;_Iw zW8%31r7t|9y6*iqYJ_cQOt>iyQ=D1x<1hxPxC7T7b3^s(ur|r-hh3m4ahO~BQJty3 zY5cQw^i*I>hQmqU;y*>{uMNf#8c9`{(QxodNEqV)Dc1M_M=FZ`lep+pHa{{D&D2Z`$9VE6{-O3gie0@{#$Y zk}}SstV!DNsAlEC3>;$@S^mG*S}jsB^xL$qhhTdTJi9=BPm?RW#gX)U-5Z8C?(Q{R ztIy`mKJS#3dVaXE!ee>GlGBYBR9(-Lo&PpO{y}b#QheGt*n>7V`}1>>=2wTrMYQig zoqw)FTWZ*1KXT`m`tIN89f?kdbgo=oe~4p_O}!^YeJotvX?_}$ieS8Kzo%epX@sfn zK6KAGMpn^>kSxo9*|Zo}4UsB8D!B=k&smqx(;c*6KwV{P&+gGE7g|1_SPvYO2%Mkv zBI=-FVH(|hiKGdrrIM*(UxZ#K(X=v`$>&T^+n+xVG=k%lKw+e@}}jh*rY1Y->G=fBlJ z7LJdWzfA1TZfO_dXkge>*KKsM2|Pfo{A34GR>DcVnYvg@=VoN0q8C1RWWyE?n-n8)srLbSiz^Gv7Xn2}zpCd>btz<; zi!V{m#&rF(|J-dl3)}xvORS|-ATvajX8fm#x}ZLm;PE7PMspu|%IRmxBgp6HTe+{3 z>rj3cAkpcmA};xK(OX1K_ju)lwz^g^NlXSy06IT28?50#(GMLo62>dcSnwO4&+x%G`vROhSnB&xqBGjz@{@9! zfLbv&Y5cI6FJzDWu&*c5QnHALc-HYf5)m9T{#E`sAALO6;KR{tJk^VoYZWPB8-EWF zd(kczOgPPs1}FD`(Q1XPDeyfXC%I_8&&qc)wPo+IIx+Rmx=AJQq6Jvy4jBAy%$zYm zIky$Q-k#=57g}^3VsNRD`~mTm7s&ZHJd^?%d)2=)N-!SwAfo35Epj3$> zSN5}l!h*~BSw5)wMDvg|76GWeu@BjsK9n(H7a&R?k$&(={kQmDsLC zq7`A4?s(5ZBy7QH#8RMD78DL8XelWv*LE;^*fiZ~V20PMj@Fv7|tC7?TTyA;#r$IRC~4f4>edL%9Fezfg5#MM^B6dXTX!iMw)a(L{k}_?kFydC>4vsSPtGcu z-Zu82{uuq2ga6))-k{rjx00WpkUAl(KHN|O1GH!A^Iy;O*T(C{fL9pyyvNP>y?N{W zn5gf=UbMdV%hI!`?>XnaNQbj++re^*4v61i7s|x4qksmvrN<;owA$iWQe`Z800prQ z+;}NnkoyNdn+)1Bfk77Nssm^rDF??O(K@fKgW2>?FF1ekm304Tl#vCG=~%HFyNpNXJBXDb{dV^^837ZM>8V zkw-86*X8sAw|V|Braq~9;zCB^tNPt8hwGG#WfNlydbSFg(*Xa_RPWsc$pJRp2qR9Z#;E&|C2j@*CGR~?8p%?UoJOVKwt~gsIGCJ8*zlnxUERs=OpcPI#r=|g?7~SF z`KZErN1hma2_a>W&N&qBX>rOj;P(j5_CrA)K7y)BmRxQ+Hg|*@vt4QCr4}>S-#f%x z0|OFsY_lAAZK}nrv&d9Ibyu|U)>u3le;T4QQwjq36B&xculj`&Z+J09VglL#@Yqfj z+)Zp#p5W24vH79f;XG4UgrfksM7r-6|UN{58*4NZG;*{ZNz6Rz@b)wH?zWI@stj`k2m`P~?>`VJ%L`%PGC`u9ZW z`k6+Asc~P$H>?BeNlX*aBPFq#khvjknDZVwh!M$F83@OT4c(xcPQ0=uvQEAmlrp#0 z?3C2kk5H~_Hi*hfJGmuXFq|J^{i}GJsIy{MO#*Ut>&~wkG|tU$*8dtvl8Z0_)$E>6 zOT2?bocn!o(sW>dIq#AIHLW?4*_uYqYuSD#}!R> zf1wxF_opGoD(`own(FoI{>t-+H+d&iRRw+Dg)Rva*8X>Em5161-N@e{otWSw`qBLXN`y-d?M67@3JISYhCW)z z=)ySob8sk$!2EyDyxR!qk;%&7ED!-UP|mm=*X2+`gab$cI`2ho^c`)_0CD}p8o`gx z^k4>qsS7iJUlb9}Z#XNFVJVWXAq47kotO-x;+2*N z5mdAzB+x>qad4kO4+GX&F6MSQv><#RDSseEc?`oW^y6wEoTbWS`TgxP8ziO$ zN!^)k>FoiHDt|jc=|>YI*fD3Lyo(2kBoHz{$KilUTb_|T1f8`N$5Xe_`R5{9CH zmj9m#^aZ~04M-Ku=O|W9h}O~Eb6hwn8=Hvv-T-+swsHl;X_GhOLkTIedP@h?EnFbJEhy-*KnedZ*5BX3;6WlfA zST-jqo~m^)22;;}k+S;@&_{%u4J$8JBd)fo)8-gltZmAI_ap)UU#8l;|C_3IQ+gWW zi-G2xpJNADPpv8ltOdS(GdD2#XrKFLb-0&jfNZtjd772Q{VGqEi@(P*YpB2EvspXw zppw>FCDP#N@tb^Q_#glGP>#Q#YWbNh)vcIzX#HkE2(~~TgCg!zNp_mw4%E0 z_j;uH_i2?t-}@2~;ES+<;lE95@!w9O3i{W)XTcBdBp~eN7<^8Hv-}60U z^7og-@zwW(HJsP>x1IX^Vo6Dsv)HqpPt&ei+`29eVh%A~CxC{F2salvf70-sy>$t} zsyHP(n~HUCN#)1Sk-N1lfy4}A{v)4dVo;;vnvp`h+JjP`9|6w1t>`?h=%J2c$Dk}X zI=(}tiEoi9M0{982t<4hZ4@7n;sIE2L?063bK|=}mMR~3UwLv-2$E*T=RNfk)y* z{Us*fbJXbDDkGu$hpB{8Xm>8swdqu(P-Tj#)!7eCTJ?B@a+k8~3xm8iK~WMU5^crLtm@s?u0p!m(9S!(ba{m8~Nx-vLSHwR|^p=W7PIrQ@9-ygm>L zeqMtScI)Dp&o$<>5woqzya+H+96|Deg->JL4l&LYB)rg?nXtpvrtd!xWeV2WAEC8i zVd~T&_=~EA0A1YZ)tq7YJlud#*$Yx)!c7;8)-s{}P5Wr#5R+)*HrAL&kky&i$4J{K zX;|53Z!|ZTwlc;2bAP8rb?{4Zk?LjES0pvtKV`zg=LD;Ojy!*tsH8`7Kq=?#FyYA?_UyS zJOyS!qFo6fe3T6@}K z{p5iXTA&9~O?D z^(tI;MFzU{`R83pmm1YCOjoIA$icHPng5#R+8eI94Hzjv9XhDS$3a?Gtgb9iNzV8( zI(dlHk%u3y7Tbo-a}ka}kRhjXGK`Q8XMyaXEcx~Qn8oc}4OVCWAF?qZ$kbQBfn;dy zDd1o)s_}iSOAi?egSuGT9!h3>dAT0H*MA(+JbRfWf1Uj61CBZDF<0-H_s@oit{3ozs{I5{j0QfMKwHBr4pOupJu}ji> z8+Mqhss7Ozk6P<1Vu~n!Br71VK5be!Y1}OJ+jpoHKt99Iz-JcZTKh#AMoW*Y$3%;~ zSa#2phdQ`4yObAkWW78rfZRtK0Wj4h%Y#Ww43r6KAP19{ zMtTMOLomynlrIcWmNO&wl8z9pv@kyi-y^s{)9hXMH=&nF7Ekgy^9?HkN4r;K$sbOw zk`FKLPNr&ONh$;8v(#e(ORqvhpzkn&6o=BuCpI-YIL@^ zJVaC2sn;vUkkV#!E8<-T;)h31-CV~^%` zFcILIkPD9ec$nX&eQpKiHhUumwhvaz@rBrmUcz-BqgKW$nNFU4Gqml7b}M@-?CwolPFQXjE-Q?)J= z+048xd3x`|gTnPXtQ*=klV==91-EH)JjO6=bDzDg2@e4b#I?YbIkZ%BH5L1o`oRj`5kXZnp_yd+dk){019sm_?B1#avw+$BhW9@V9SS`*H99@!YU%c8_ z*(dL1;p$xZhXC0nnU>N?D19)Oze~9+D3{}Q901TU(=-h~`Q(%R7ryX?JMX;n&cD6= z_S=8=>Z`B*?RvfbF@PHYcFwsY%sqxsL2kz4QL9=k9%Q>zaSCYuDUR3x`G)NPxbY8#X|5x@k_h?ep}U6&JSRFSJ}>nnaQ7n5S-pWtBDw3`EOn zsW}6SH60gmMSe1p z*@Z~>5@jI)`mFieob11;H3Sx?eixd`)JT7eEJ=$NX~h;yP|&uok(W%L;jqRGNZT$( zIpO*wZ$9$sA(qNfzm()EZh=jFsegFrf$X;_lWhHgQtM?Y92}Y(gEbF z64Ita3+c_ZZVFP9j>Q$hT*r7e`$qFKZ6wraYwo?}51_R|N{5lCnPQs%54) zQ>(g~EIBZZ_Z^52PbT$>|A;=w^d(CDPVz!U2c-_Da#yaT6Wtg0J~RDsDdYgoK>0oK z6BOXoIWAeQ{)Gc!zVxit*U6oMK#62^=Do)lH%@EfW^qm1q3=fw!xke5!^r4|0T&lL z+6o37lV{;WcP%u)BALoBziejC<%-9ZuIR z9=&#ortQ#l9mc*_pwe|MhG7IK_|p{~g$G$q9{>rs6N^yq!|3;;-@i$ko{JjMPjh2x z?vwS}XqqLff&jbI`+PWTskL36u-o#CA8=~8?w!wP6#?`A= zHQr{k!Dh3`!4-vfrTV_d!?QDtK3MEtxpD=4-{a)uL@gVoZ`lpg#L{&MAgb&JYS;YU zmQdHiTq}csX#v&JXG+}>1?yzn-%6`pnNw{2YS#miv-Z8L?>=~Y2=JZDzdUc}nQ}#d=k2%O{^?t9z4do5yzs)`Hcj&*03Rd3++ndo$8ZeC@OvMQK=-#i@ZcT1U-2+L zx;x)}c60mT>-Rsp_l4WPzV*VrkM3T-xOsnt9l4cn(Q&k`r5xtAjYH=ewDIOQSpvr8 zt|LTq2Sl_G@rqM;1hdc}VvRvW@pWs4BWD0senTlpEVr(VU`Q=srrQ?Nbtb&Dy_Z2 zr{F^_tF< zsxb-&l5umal#6YPxX7{zj5T(uKQta`e6h(*!MZ6ZrIG`aSM+6(Z7XEfRVfcCQ%O>` z;TJ{Oy+DVeUMZf1y0*O;Nm|az6)1Ea`Yx^CC&6dX_yFnnJ8;JZ3ykxQ+!P*`(}1hlM@iRwSico2M+#} zT^t?)p4g4(hYdFV3|rn{#1`-)&^ARuI>3V*;(LPZm`t@1Ke)DrfPuIMZc+9b@^KX4 zY~z5&MIDGgUjbH#z)N5EMh;R7XvcBGr>sm1zoO4sieQNZqQx=*n9ZGZBF#XX{nRFM zFfg~6qZ{NFyhT?E=_x`GO3<%tnmsHmz`=5El6jUATrBd<>QjEocWH2u#ijgfop$2G zmD6z|Yb`3*=BZxu??~wo`#nwDgHnVE%$u&jPIdG)hA59Cny0AJG+AQ$I;j<33>sd~O+mq1tVJY1f?!j3pe z%5U#IhJFY-bU<*?lZTufbpd3Z9#$skV)ktF+WDVXkebye%sIuF@B3`IPDRfmfTyT;Ewr zSBrZYSuYEQ=k!s7&xgX~xpBtKnd^;GPtvBgoo!k_^qIez--r~B7ld+n~k+*e+C zjyge~W|P4bBgv^Sj~txEVfkar5D8_kMNzwR^w1 z^|=Qh-hFIy`)uvcdun`(c64wYP%OxSoI}?*bge_zHt5>;>QHteGdK1W08Ie20*AsU zK^zjYE}R8UfyLjRqE;v#vJfRM8sr5~5h1MmMIKq`ChJsP=F2^Gym<#PJTV5}V>j&3 z4?Wm>bWMkKyTVDk#;S=9C@4Z_20)=MPU;8s4vd6gLjK85D#zcHUVoLEXdJQfOAAY> z8#BSd2N0}qtg@z8r?ClTgN+p;=|2fX3UrVgQ6%uKT9pl}*w!(%R%!_&iY^?b{Ys`H z<+&`if^RLu=36Y9W6eaP8b_^0jm5FlGZvQWmKIgUo?K;0-(n2u-$tg?j+|PC0DV1L z^Rn$`A5AFwjJ~AhXaYA3acNN446*>yWMiG=uuddwJs8Q2M4?aZ2Nn`DILnL8_~Wdc z1dnY#a)t~4w0VE9^-2yIq)!^{mN)W~kziy&(vQ#^YcyH5WSR3cSQ$9JLOaHJB|Ze9 z5d(s|g^TeFn{k7t*$RzKBgZ&WCUNK-OOOX^GFPQ(Az5haMrb84Gf>x=g<<#&1$7__ zuTCSuCoz&1uuG7|Wym+PY?C|<;7w&1c-ENTav1=Ca)T&w%K%E7re!_{rcEN&f<}`j zEpi|0<{V(o5g~K^U;>G=?(86nSK~RgVYX2w()G>^J=<255_JyJPcHPJU(y>Q(tsKK zR8f*l!BE$wxoHAf>#|vxTY?5DYkDq0E75_?nkaADvcz<4%JUOll!DHx0Aa0fmM2ofP!e!S7tHy0Vq8}KW%?1x1p5g4_ z8P0DL9{lua_?uU-I)4nS-F38l4J*2W7N_A}lEeE)4h=>OSbGoNFvgE}c=!Ll!uGE| zM*Et>ZnwiD*RH@dEttYRogagxFnh)*;0=^nOWOY1G)?FORww4u!kXHrZQoL#Wk=8E z1{9D;np0q{Pd6?K4)viFa&SBYHOq4oU^P>hrF_yupL`B!9KdZ0I!(aTZi2SmZd1Q^ z0d`9J2o$qmSH7Q|oJ?dAOWo;%6`nnA>tc0bbz%Xu$lmuow%e_aS2nW zyROR~LWuP(5oHe{Sa z_S&^;KkT~hVmb*f$nc{@Wbf*cDOQJ^iTHpH!nT>`2K6R-@Ezp-S=-l z{qV;9)BbGRG^3-|11&o^jM37If-fu=t#jKZzM32F_oCli#UF{Gr69-54JJjHA(oIV z3rtx|NkaKI{gWF(aa@x!f?;c-9oY?YhICDOW`Rq=-NJ6z#V71Q*K{~(*EnfcXj~g0 ztS&6$O`t5)IcT9lx#kxt5{qTAN()xFtg-@BUT3zC(S9g{xUXfInxjTb$*s*;$Z{2In)K@Fw%$-J+{2TcDTUK@6fgb zh`O*qBWn$69!10lTO2nMvMyMt(4)ZI66%(gx_XSPD~9-%M9k7fR|&46xUp6aYMonH ze99+LntV9PqsJu~W0H^7UE<07YG9~UYq>M$O(;1B*=yti zESu&N6?KSr#1f2H$cqFpG~YrDg&74Hls+%N)u=sQnJf(Uqk&E!kYj}X&qi!^11>JM zxY%rQ@7{f!KX{1qo2TgCdkTDOjqc%foQ{v9^ViYwDI8X4(7`if44!u3h_Ip)gwh*q z&(E;^=pjD*e?Nnh)7yCLX`s=!$-3a)VPt^wO|3u)RNK0zhg1&XjTFw#&+0OMS|Fdr zDcvD(-ZnsRXOXo7%e54fP0{i;o_-d$MVXxC?_BP9Ei-ZFV5oC$0=HoRAQ7RBpR4ss zEnBU7g57SXWn1gSzVG#zfL-h6zyen(UjS(7pVrn-@|=UAxqn}um2dy7dj$cy(r;?| zwPlNLB>vpPC-1#l_1X=#4uPrr+It_Mw8yO#bD7T^?5zRa@_bF!IRHHOxilt!6QFC) z*ZP0ikK|L}f7uVEUkS)9^U=2hQoj7uQ%?=Ayz7~DY^2sNE zxLU0~BBJvn%sqxSN-0*&L4P^sa&Y7k&^63)Oco`fO(H}A5YT1Z;EaN%Y+(J@EZSueV?<>silIsm zmdnU2q=D34h;`1W2u(!}eKF}Oi(B|TW+Y%CiLGs^i^;=t23h2grnKWES^8Q_<5Y_M z#wLAOiyJhlaL%rg+^LMxg++Qu zBprY=r3r+VP0d&eRc)9}z9eR`K+QbW*!Iff)np?| za~MTO`WDvKfUcE`8JWB(UQi6V+y#UMxC&5J8V-*Qcp(KZcbKUxCBd;Kw2L%g=fj>mcUwp!XwAPgVgSj$>4X1K{9X zd@xu*zDx&TcprD9Z`@Qb2SBL|I1wgLSH@p(g%SG#EI?1+C-BbXW8Ez*T|$<^1Y#k8 zdTJO%O+Frx`fd(&!(D(q7DNs4y0*oYD_1hN1{P)s1QW0|jw8;`&nGaqgtJ!uIrvuA zQ)M$iQsfYrEXM@ciVPx$%~K#A0QH$$meKdU{+3PSWNxwW(5AKeDdB0Y-b-NA>SG@i zF3**gsB=)aY?rz6YqBl@=Oq|h{w|NzAoV_&Th_JASNiDE@$$hz*{=5C0W<5v0swsV z>eb<|C&55N2R>#zUqV~;)dPwVyiBW6Btn&t>|kKq`O;ZorUbbm_& z_d`2whAaKq?wQS<^H&~xc=ro;e|`JK`ybwZ?EJ=q)$ZN}H3MPg+pq%i9Q?&PLfbmD z4Pn(b=mh3QXyPcqp8!%O_Lcw)vXjMoT3d^BaRHY80P!KqvK-DVJi|?9xG0t`#KdY* za+7s45sU>R6n+Ju6a44)e!w_}8?DYcteX|q?Ha9Xg1ZH_Wu$sCd_ad$FH(X7;H7Sn zHpzk(A`>U?t+o4avB(Td)acSd^9&`Yn}Y;TS!=I_Be=eZb%<$Gxdu`d(%7bh;zV!G z0Hx30ynHL0EN%k?lg-wqA9k^))(v-*~Wx&4hY-b6d8jS2G5Ahv-jA)WWp#Yug+ z!qI9y#SafOIQBKkDJ_t-XD|aK3-5STE$j&(kC6xTyhV>KF2*gIwg;Ru(25aUw-~i3 zECR+@MmR2jlN8`ujp#8FcpF4y01YMJ8`8%%R&_Cm!bXZjq@M!o^)1wZ`R$>DhQZo@iKiBiA%3vn9V3L=jUKyxz-F_&8;n&+c}+&Du!LTdPJX(^|+%p3=q=N7Yz>VUeYe8|v9})`xBl(h&tCn6B%v zTCLD^UApc@OHI4ET4~8E?i{S^h$YxMX}jW@WRK6m+Zw=}`#lG6tqzx9@nzxdTwZf| zF9F_KUH8God}XOgFpC#@4fWW zOaGszo_gwkc3t<8bM9!Fdkn{L44*0-f$nc%7$0uj*!yd%v+#ZHH6D2H72_mGWUOX;`BX zEEes_cZ*Fqf)|O-Oc8Fmtc-a3tvXQ10;pwZ`Zou2A-YF0_cK07ZG8!GffeL1r&6;~ zDk&XI@Px93aBj~mw!NcfZTkcnr5gPp_03Q(U$j!vYgU&CEmJ=Wz%(dYdwY!Sk!leB zN$Xxtu-??&Zbqjy5XJ)5t-uNlkju$Qcao2cA%?MRH?@L-(zGZ~nUz6~$*ZPZ#LV-u zaT17z_6whtVbT<1UGz|wC#B;;l2C56ZYt8HwlcNI8ZC#q8b~&GH1n9wVU%Pi7!Vp? z&m{&N;Kv@lzrc3fV(WWc=|)f!H*?J;O9~{wjoUY;$}dMkt}mvalC|z(TY}qUaVRb9uh}@U@bW@$uE3rMpbsf zMHzNKF-cSPM;hnjqSX9X);@J0SHfJYHvuuKH%h|EPb+^0C1>0!l*dC|%yCGMk0V%~ zJ;^m{29mN&R10-X>7c*M_*vfMs%6dA6-I{g$tsWyl~Ql)qs6(Ya}c|-DV%)BZz+f3 zV?oZ(m-?{dI@ePvaLT6!V#1=|=q|moG^wxsokL~2;Z&SSGhl~Ij{$VX{}ejZ0gBDv zT3Ze=K6}RCfnoHx*z9n2c7}%!&vEzm9o)OU!|h)_iEG2-=!Pe;zIYTT{dIKy3Y=fT zk8&~a+P}h%lL0Jxco0X(%ML4A1MV?kAPn~gY~T0z+5huN{D0Yd(?3aWhp$fJ(# zo{OB}O_3C7N|s286e(-h`|KaTmLEN`B-@g09lSXQIrr699hr!I0Yo5x%&Kn6k}dgD zAbYAR6GtF`L;~N847~pT-o~Wq(f8raqIK89`#y|)fcC?ruHY_0Hbo11r>ySZ6y}!U zEO-XQ`wg2J3qjvZ7zMQy+SRsk8E0S_Oq9W3D@zGJZU0Q4N$#=DpPX~xz6VTSA|lk4 z112qINI+J=u6?cFmTlvdKv(h*%U=1j7P4coH$5myd0Icc7U-6rRuA$$yvsWwN~b~AKBw_O!`jW_c%R01v7J1 zRsAckyz=xXKl#aLAAIn^FaGv#|Mnj*U%vcrlgZ>Z5uFgx4(9H{F6_b|6?Q=PuPpe* z$^l%%`~7~ozP5OD`ufwapS=Fy`rYRref{8I{dCdr%2VwFpoH&1R7H?WXc`w?EkwV$ zvWZt@D@4)Ck0`l#M7b!5i`R(c!ufDK7+A)HY!MR&VkVMO?=v2q;;H@7{DYf(|c`aYyD70-7wi6A?x6Jph@l|Tn7~xj3Xbt%#kV8f) z2Qp`p#%;~@{6IIk>xf}r=hQ!v+C%;#w#vp?y5Us=b1Z?+glbuTYo6@&Y(h_|O>!(6 zVK9l6vWYun8c74$Fi_SZgfXky&7ssi<<~;&HYEhlWCGh~1@U04P>)zgiQvHK5FQq- zu<93B`xQLaaOeRv;aZV_lv&#_y#+w<#DQOc;sb^4!4bs`DMjXBiCb=l1^|_lec4Da zJ%<2z3Gti(av@HPYtl*_Cl{t2yIndT(gwY=Y-BYCa$&*25av=jPDE7np*j^fs&8*Ea%@@f39 zlw&B{SQ;BAx6rkkl{P8M8iT)xvDx%NslVuAAeRdknQ}~Eu5}@j-FLV79d=P(=3rqz zq8}TA1^Mv!=raOS*U{rPjMt2wR50sNs+&j4 z+&bPm92`|T50E!{?8d68cT}jk!31+KeDJAz^8~m4=@R&ZyJ#mKZQH_CRlKM?de0#8 zAoi%@#&M1a>@1*xT2^j?U)w-b8E4Q|Wr!F2Se`_z{*W^`n+QSyA?`upZ69ux8MyymV9J6@}6eUW2Yc1fFv~Am}I|Gq< z+qF|#=Ssd7Pz!vM-xlJ^vB_kD>2!*Ng9GgC?O`&Rpss6`eYFY?H=aCsg2Tf@9335L znWv|xSglrS-P^Wp2BFLLJgZ-w1#{1n&o(GKX7N0x+fAR_fT|9tQ0wc| z0RRA1+yJd(BmKqZV%W%N}Ujq>M_$@28<&(jrC(=(JPya=|mz)EG0qw`zlC^rP?`-oO3L# zLD})}EBQ4>)*`80q?~e5FVM9F_5!<{Xd;3Eg|uZ|)Uk&(yUK$?cae!xsk!xak~4o5 zJECA+Fq`^FztUd9Sx%;h>cP-NTb|&E={6lL5dJF+-8iWt{esuL<2_) zLJD_@uJ<@O4I7_5eE0zO?%v1Yy&9_rd)Vh0_UT#7mRB%cT|~WZL4AvgTM$>l0+%XO zRD%)UK#2Fc-qtscm0$v~L+fU!-2_-L7AHqIu6x|zDPH>FA?iyEkV92h@O_8A>)^X! zt;=HJS=9<{LjU5>Upx)0P`ByYw#V4_jbS8DEmI(F2J1~A1S{RRF=TiMz{oDYazbKm z{&qt(3o@C5D;$NpMSYp`-;yRvPlU<=ptQMHT{D`t!PHM7^FD#7CDauQS7{sZZ)^OG zYQENTl!(;QwH)V42xtA|T2~Ji-rDa?(1&*zv>~0^KqFm3f|}pYy<6tB1btGZ;@q`k+AiP*qj>fTHUuLVN-zIK2{Ou=S!=*}Ri117D72C7r! zc`CFl9j9tS(NQ>LwG!G$esHF)gk3`k&ZZ^FHtN90loqtZ#fLHitvN@0I9#g`qW`m^ zTB7?93@D>vnYuLfsZ`0^Xa`c;p^Ju8lC&%5YASNdu9$F?l5WJxNL?^MPsP-{xqPiB zsqO(Ffqkg;yxH+7>4rIjs3~W&fl1ciLcF02p-uuhC~jV;7F8NQ;^<;Bt(LEBQy6he zz`98r+HpB+`r+JN>N*@>km*AnQsiemrC$!g6-l(~N^#kP*`xDothxmj-3gZ63QgT7 zXcey&j$;%#88?cxHgWKy3t${lZx6N(GBych6VMwzk%3(O8#_i}ERu(Rq4`GAVbkxZ z;xMoz*^+7TnPaVc6Bc~rJD$!nkDRkr)9-{) zAG%w9>v&>;E9Cl*pJGX>_YMQjQx@4hH*2S}fUeYGB#s2{|sj9XVG>SP_L(;z6N{^#}&eU1O#z!;W@pF5qdPmI1ER@ z+E&I=j`xeo6Iz~Nj}NeT*x{(JaMxXd`@uuh6GGkA!Sc~n=sO4RJM`*e!K?pT--kCX zf;Ig&18U{@49K1lHUYEH-z1OmGUfiRn}y0mFDn4)9_jNq>Vjb)RO%bH&nBRizT1bb zB9pzQnS!NmQ&;e93jo<`=(g?xzs8`N_@M2&4yUK5YAG%-SUx9{NwCf~E(I3Sxz8EpjK53Fh;;{_XGYV}E~NErZ*(MccNROeP9t1@MX0?$f7Fv0ksSTCK2J ztrYkPh_-GfN~`5fLpPk;2IAASCR|6l*tKYjb#Z~Sy`Z~xbA+k8btM@`f0 zVD2vL!Y=%$!w%^Fm4vQaJM?|co!|HC{_5(<=^ICPp1k?+s|T+Eq)D%bqG% zqj41`bsML`9qOt^-H3H=jmlNJ&}SI;$*VLgTNbJotZcXzuMI@K=Cw4^$+}J; z2N(hh^*Ym%bA3t>Yg>*NRFZjY1!%Q8j7x~BFW^NP*OB!-4Wx>Ab1YS#2eO2?KyDA6 z16W&r-o`dPFw9>dSwbyT)d^O9jeYLHR44WuosJ7o zQy_uV0WwV%u1q{9AL5&Wg|`ZE<7Q?8bW4z1x@Z`OeU!#MN*kuh@nl(zanU=~fl98;3dpr`AdFp`EFLuvK*xENJ%fjGJ<{;p$ZzMw&~8{R zMOl-al`b$1@N$=rF52kOJ zvPu|javU5Fa8_=0G^mf&pZ4QIU(oAdLmP%h9IaN(fY#H+5{E~}xc}e*Zhv(fUww5Chqw1JIh|o%U&h7e z6--tKsFr)E`~=R|AXGA=3hf^C-vy^nAW(Q)NcCL-E^d;>I^&GD8Aihm=CqIX(FsnE zk8sjXaN9kH=e~CvL_PY7(Ztu;yAD{dmPmK?Fc)Gl`mP68topY)vidn!TM$Omq=x`Q zotHuS3XPpN?XCW~)66K(lZWXAXq8roRzC4nOGH`xu;H9e%Cmku_V9-}L0zCtR;b2T zt@S%<%eQ(J7YPE##M-rV#o(Mn(=>&;@;0)*paoplb#MzI09PPw+qRg^W@?4IzrT-* z7cb)C#fzEmULr!%GzzS%s?vOj2yNS{Kiz1hsUWblQno-n*CmhEY18L7g}G;e<83;% z-_HWK+vNRI0NwJ>_UldZ0vJ4G*p#0H`+%SX?*jCTzRTpQ{@JV7p1%Ly`=9^a-~HV` zefZ&rKRq}&_}AHN`W1j9+WE}ggO052uhI8&zwDmrj+fuMf9L*N zUwwJ=jeB3+xpwsUa9+8pYMPpAuEXxZ?Ql%C>rF={kNfDrxi{#XDRxXax8H-Hqj~oltB`JJ{6Q!;4-fXIst|99J0EDuYDfWT1XwtPD zhOJcAr}P(VUW<(NL!rMAyvi8AjFci}4KZwhq9#vujgYrwZrN*P1ei;G4zKZ~IWCTr zAs#0hf@2z{3*a?@VAx6eAYTv9J$k=}=M@^a2ms2t_)tK=qQE5z=D!r%z+Nj1)9%}} zE~Q&b{{muVfAP54)XZ6sx-ngXb>d5xJwTO#f+n539-qOmOs7fCO>jir%ebMoGqsa@J;+SqBR;qD0*t}8M8PGSVCbi`#NVfSobDj;fM7(zNo-}M4O7+@{iTKacs-K7lF!$?olRYfhYKVR zM50KW#@k%3%@DSfYa1XOYj%5HJ_m3j${LO%+}E|7A&?kNFKGz?f=jF3Ggj*k%!Ima z(e)n7<5S$edl$EF-^IPV_weBG2@W65u}2qiVfq{na21pO0Chh{?Wd@G1IINgsz4xk z_OUNi07%_v$vu|=Pz1-|- z*0>hXj=`@m{mJWDZs27>T5#j$AWKW<9J;o{bUGbaLR!mR3&gBEVp%IL4dl;4VDG(J z>Xty%rWYBBl7+5V+FF+i0&?f`IcBpNX0sXQ^Ldu9K;bn0In;HH)oO)1ckbZEjT`vv zv(K{4;Q(Z=AFMpK&SPzN9=N;d*jU)qcejDvZQyg0T$`?yKNjYm7ruT|n7d71a!%S% z9w0~`6w7NOQj2T=eCg8V{@ZW9`ShLdzw`MAAAInOZ@v1hpAyk;0DJ{t=QDQ~c3~I( zq+thi|H4Dpbq>@!-*r=7_LtX(i&vNTj=uZo#{IYNetG-lCwCrRSRXB$IX5(^YE-?Q zAOn>P?iZS>LS0p;DnMuO(N||$w}xemXBewp7om&19-n&w9ZW)Gfyw~j!>ijRgc-B^ zj3Jwl834#;dm>FiFh}C#6XA8{uJ6%z9SG6ggsah14QeM|f)PNA<4D0sp{^{AgS3oP zpZ3au~1c6O!-m=skx*0 z5F=6ydHpoS;VgB;LtwML8>=j-BnQs?A&MO78ZFLI>TOAHoTVOX=iKy{P3+uyskmxK zgH{jxB?x*+jzz;BXkX{LO=2mVR282w)uMnsgRukCkV^=hk`v zP?r?uGu}v4H$&Jd?P0D9%HeJ*HvxEx3CCp(q4fP*<_U6YKwJU~SpBJPq3xv)Lb%K~ zeP)LkS^m;4)-u`FLuDAdzlK3kzglarvqEVZruE%WjP1|b<6OEX&H@YyB77Rd?W_NO z3*_+GwJ1O%{NtI_Lf2I_;A)(l9O2=k$GCp|CT`xki3d*)adfxEmF5EWt82K@ynwy+ zvuL{mRQ&{%Z$Mn5;u?sq7SdHkp&tU-8%v1eW|(7ofEmF~H}qLX^e@W}j%!S-1GLo) z%cCV$%R`)Sg-`eZfAigAum>(&zKHNJqXKh}-h1eSXpV9~#wI_|_gSE7v|S3<3!8x0 zSo*WhvFG?I6YC(vun%l$kY-fI4gGXe{X=o7FJ&-S=eNkt3or!$>U*?pn{CP_aCNm> z4Ir=GsLr|!5vxaemEA&QNh_`sB$Sr9B|H{?xw1*wWHM2BD?nFZZ`-y5C};t)`13tJ zKE}Q=(XA=b8279*w*llsg z+I(AGHUZyn5`U~5xdyEDxEM;URx5N}$Fuof_uTW(KYjnb_rG}Wz4w0cz3+YRANCLS ze^XV}O(NRC++Em(UHFrS9nk$t53Ale*R?qAF0P+0UOM^w(c4cyyZ_z8|G4wU>XRo| z+b4cnca@vE1~mYW9-hLE=S>~0QmYDee7%)8O=_4DiV4R6_5t)Hh?$@-LtY0?`9yM2 z;4=o3fWdt2q!7rHBe;r5YZp@b_{U(Zx(*A!#j`r z)h#LleBXmBW4+^{ZX#F~yirnxor2e*T(XE393$|e+_*^=g`%T`qK57locfeYWn1{A z>pycWP3r|o#kSE+m=Z{nm&X|Z*aff@lq*$>KrMmYtT5GwX-iJvjU^M?Ym?Qlcl!O2QBE03nof>(yGYAkPIYJ0zRfj z;k(xbkkuivSR;wWfG_G{wdLc27Yf(BIy)BqbF4{Rj2RiE3kK-J3V$GRjbL(phc@J_ zp5Z#QP8T9XQ8lsJUFB_t?3+O?=7EB3;naIm(mc1Z>jD5A7f?5<$di>hB&tB@n8Dnm zrV2z(^Ya9tBDk8c@~3#*-@{?`2#0)#{bmg`E#RssqmRHdv;hYNhfOjZg=;Q?rtr{= zw2PN+7POWWry2QLsW zP3?FbePyOapg_y~LWK4$87esIysR5{sc<@`q1{ULTZvdb!t^j}>$LEEF zzEAQoiA5#SWmB0xE`5nZ-w}}8_a1%M$37yPodKSEc)5;Tg}Nqm-ea{`;>MRZ@aZR? z;KAKTc>47e^ZvVdp?V${`v7uh-32sinOh-1*WhXaa3FSIfwS5^QeW|L%V1C1f22+_ zcOX=7Zi0qtR6GsWkN0?n8tivhv3k6~dbPyurw{Smdmp1;F5sFPsKTr9UEhO!_>+5W zCGg&-@mj$nVI!=P?{>4X(RMD~(0i}B~5yrZmg|_4fzV{huRj^CB zd|CaX9$W=57aLwuabFe@1;R%8Do5eXz`ePSX?@=ZcUG|sv3%SF(1<9rvbE`~^(!-D zGMVT&EN&XCMXc1@T4>5vYdM1<*dimIyMy~o|Vck!Fw z{028~-qbSetN4;$eC=Ax;j+KjunpLj*41Ni#`4|-anFLJ=auoSG~X2H+Fu;X^;0HhW{DTjE^vgHic;g=q zE*$)3I+@(8>-uPKZ@z=MyRZwp@Fx#Dp!*jb*2gPHUGIqffj?TlxV(S#*3&QVefQq) zZoPT@<--^Hdnfyq=epsF8iaXZPafnPswPE(r0sO18H(RVE>c}c-C{GEwgD61!=`6c)o^eD{KocR0;mSo-3m|FPjI+C zhMO$FRDtTS`6M}jd)5hlP@Pv0D?BVbsEUgLtw-7zure2_7{W55Wv+ATAGfNaWv)Yj zwql)25&FhB;h2M~0E*p%J;gUQ5)3Q<90;xwYhftl4c&qZ-?p(eCA}lKD&8$T1JMuT zCV#l2M8f1ffVFbQE`moc`O(}c^}Ki>uLd))O`JeAVrMjCp+3|L{dJQyaAr+Pa$gDe zn=B2BK?WpZ z6Uyu4``kZi^4A#$1R`|N^*~MG!FI_Xx-sd?yd>0h4Q9Yc zD_09*?M7%NXdRQM?|Uql%Pg(L6KE?Ilmc{RbF!{W98Jpax(-!UDa;k-8EB9z4L8Uw(;?KKcmv?%f--g}_|djBU&h>(+-tMlYqV$Bv)p`xsQ+25rlD zXUQ-Ic+dL14FH!ww$#}sdCE{iaQoY~Zz+rPx$=QP1iJj}v(NUgzWS}hci(;Yiy!{* zhrf99&2Rto>eZ{iY1{T@T{lPb`D_PscVQQH;m;CwK=&^=IENbS=l${end67YuO8lh z{Px}JU%z$h^Xo64K0LnIb?c@IOZf2G7=>4&>#D+}Y0%U)nrP7_e)qC9NrVWxs6$-O zQUYcIwX8Lbg|(1HKGIr94K)pD5zM9#Fai^WDhR+dSRzRjV>cN=nz~zz30YS1#PH1M ze2?XNjXoY1qpr$Ts2!n-6E=tVdb2LDY(3>Bp7cVxtVnZVu@Dkqq@c~n?qs1Ft6VmK zyt*%NAQc}MH)4&Hfu1O<>c=!_)RO2t9hIdLz~ptoCHmDE%vnt-{!6xqC}V0}8xpK@ zq94hLVtj2o0Y!pfX^@+3Yt?fWAs&&<#|AP|(J^}XevPhMVZC0V z;~q6Ufzv3wS2)0_wLodx{_ZpniHTj_1^FTvx` zXPpavXQ#6%m>FH~qs4RxCDfIC%X^W;U9DC)IXO}JmdhoU%Vh>jyRO4xvA}AzLf`kg zNn6)-Sgls-OIJW{UDs%u2Gi*jbzO)4QrDVJbfEXwD9@uukMQeX{~G`HZ~umyH*aFG zSg5tI_*ey?E*K=Ox~7QrJ`Y6Q)NW@1+eDpHbR5vy_b0~0cG9ph8=H;M#!edBcG9%5 zZQHhO+qR8wdd_**caw`*D{IZo-t+7~evj+m6bI}(0kN!PocGvB1WI{Iue_{i zABB@(6$MRJJw3vEj@ygTVq;o5nV%G&(3g2D`xh}n&&e>>E8ewA{<#d)Oh?Vq;VK?l zgm#PnfmKtpRO8A)kK?#(krEmy zZAt}eF|*ON_)9IJ$XI6sh2@@7v*X(V!rAhx$>!;DLqe1P_E^I{qg^=8Ut5tu*R)Yv>j{iCw&E z;P*n6egb;NOsE=sdpMXhqtbQQ~qFrmR6a`@o`wPTHM zSXu(Q8=8DR`T0Md4BtTHt-(v5PY+NgsGBRez-$gpP4F5dSWH=Xy(DncuDZ;+lt$L> z#1DSrWVKRXxanWGbwuV107ZRfd8Ho-jWm~b?djT=QC8&iF3jsef-}SYVg;Ye(?#p0 z_w&Z<<>wA)dGmvSPV2*(%}PV_GTZt8(tnwJXTBF8Nm(u-B8jk8;HvcF`TqK(e6W%D zeSBPC&Gr4_epNM--<>5>b=G}S_Ny;!VJkF;QxcnO$`;R}wO&qW#rIi9YAw3B^Bs`| zPJ{5GIN=Pn0Y^V5sHXVx!?6^WCP~2&G9@CkCn3R_8VpEq$XRstr4a)bIhJrn9pgx+ z#vU`smhe)A)+$^r!cJAWu3)+~>Txx+MmrLMM=5q#YfV0WcS;q_hFXR48V>(N+HYf z-B{rDs7A%37$5YY!5wRh2v}IAp&~Uctn8MGeZwaWlO{ z$%@r3Hnq(~px7lvL`2Bl+10|+Z{P%6suPeRBk|VTJkIT^elix9O)KvXuxinzs|3^Xnr@$aST@mJrY^y%gm#J7PB&O zN6Mt87AryzG)y6>Di}zlbXW(B4$jEIfHugsPm7iRBlP4yj|~%m}J%}6EA_p3L)`r1SLYT^bQWDMGseE3D3)V zPuu`51TH*d1C?ZwVFleLc>j6oO8 zHrHnwou)S|23egRZzsfYbK>~SoB@n)_1(JG2QWMu?_?3o&Uy__^LBzePp*}XkH~hd zLQF1YfTHQaXR=)X0EzGvO_>+2Kd_-Zfvu-dZ^+hua7kmvORK36N7F8}cV1^T8LZ1o zqqIB+NzK%nqibdFA+MhtewLa6BS`}qnkqDDh(XeSl1Csl zhUDzGS$@YP1S3cOGv#5U&<_u9bW=j|6|8vqd>duc2B2VVQlK`@trCA>i?w6 z+kes}5V(H4g4*=^@wM%wf`N#*^ZMu@ptJe$`JBVX$NluVKR5P0L`yq22QJn)*@vqAY`pK?}y$?dWw6w2kO3z-&Qll>XYvBz-h_RtLp{D_<#& zw*ojq(4|1b<;qj^sTE~Gj})YkyJ#CMxvV-`C>qjN;z;_5xKbi+q{E1%8B=9eC39fJ z9JbSX1fWUfrkVPN0C7U&|8w$Bm1veVc(gMMej+QpQ!FG;aOl0Z zu4CT{J}TUv8$w*BsuYw`8~$LDP5TWkmfb#p5F@{h%N_q*{(ex%YlLUBflxQwiLwCUJiO7T&yzur9f6@xZX zTeM=?D^#c!7rtc|C61)eBfe1ErGYgLzi{Zj1#8NCnqml0$YOHp7gw0pYdStIW_GJAF1|NEa3G*fl*3cd_o{8!7OP zk?C_oZS7M7P0z5k@&U!m`iaF*&!`_^qVVWZ^onbqkuv~^dGghyW(IMF)1h%SCuhl9 z|2sk?aV}*@bMn0*P2_FNr?#&`?(banq{CDaY_5fu*hWRl zcsWOiA{7D|Vj_BS+D|>oJR^-7d%Ssi>&&MY5Km|{Xf*{%6-v~Kf?90Dx}TZliX|Nl zeikJ$+rtljcfvdhU@k4JT0$SMp$?jtV#NLls>O#Q8%*oJLUn2! zAO$q?rG&sNVizMDL-ksHN1FEHmQJwd8^w%6hiwH*}e9oa^W<@gR zji^T2vYZlvfu1yRDD9|W7EndV+V$l4jnHg7W?WgANzWz-UhU363Jt}wrJ7Ab{!)=Gy4JT2#tU@ zIGlmDMA*l;S-vUSZhC{Kr(FqCj(<&k8QaBy$1U6!>Nw*o@-)GGkv1?GdRi1W0yfx1 z{z}<}Sas7q?A{$ptHt-(65P#TOZl*YE&_$4N9*bAO|5fft^h>U_}!fUGKTo;hd0LM z;;+529n>E2c>S2Db(?eA1NL?H=H3H$wy&f9qK9b@syTX|;A~w4@M8<7_h0wwoCpKr z7Y3;T^=b!VEqfXF^WyQt_qORYdJG4K?2h>VL{`|Q7%sjpPJd)^q z`v7&5?|OoOoz^Q42aeoa$>YYQ(;=Xk;lHFIZqGmIAh6?<(DTysvM}QL=Ee2-WV>8q zv;B3r{8H=lQC`=>@%AIXBzHKk!c3*!RH3_{qn7~8NzBwjc$Ra{E?ZX_!CsCk=ZrMV zfP@=Bp9ec@E6>o)8d!(*JBUnQk)&&oK`TBFFuX|F-DXUTtt1DC@GV-?P`XJN|5`@} zNxP$i1qFGxW;kD7bUNn-k&18yQf`-^ck=V%aEoUif@^zzsEQfqwj zO33dbcD?-!lIvfdMfq?Zaht)&Bzy*AI``;}LMDaC5-Z$`ilnvlikL9YRmO!)Av_J_ zY!mg_d1rkP`(PbeELdjTOA>w(TjEPAciR~zWx4p3xK$|0SGL6Mg8#zY(ZDf~Qq3CY zFAb7b6AqAoiDW;)H9TPTrhBGN;?%(B|O8-qf*$^bc?tkhg)}4h-1avYdi6>tY|2c^@dFy7!c0 zqEi@?V@8l+7{Jra=vuQ9Vj!EEs&N!;$j&z{3U%x=@1Dp5O=c0`kncinF8F zrE!Ajn$uGCDg==tupe-a2#IEi3Z1H>8p;gSJIDf0jq!rhnVF2mN-KG5TlXv?MZo$%jld#(K%GIsx4o9A|Glk>Kd zR(fZcd3&%qv&8!3^b;;#MwYl^y`JY&?F79Hk4C#G{(i-;89sq=0m2-j5D#rmV|s_( z_5?UlB&2UN20z!b#DVhkG!<3ep1xF%d?l2YY4dY6rDip*M0H@G(Y!}f<@(~_N9%Aw zWHVCL^`p8z8z1s$wcTL0_1ayyfBnPI9TR|N7h;cB&|N_;P-{4*;SBk>Rd|szvzQj< z0Po+7V7#9l{?rC_=Gq@nv!C=dh3QidZVt7g{@r5xdV4#&MHEy(aD7-dng1+Tn;GF6 zKD@ib_-7?_ew=phfI!}u)*Eeq3*|FQQiDLjri#<9G0;CWxn7e#JUp;$Hs@QW3Ldg+ zN8B%0dvsG4wZg4rKm{~*uURoYMEXq}QrE7DP7bWs{Y_OcX{fDA=devh9Q2tnOD_$KJNb5sC;}p;5e*3{=bpI?cc}{B{(+m*wNq8IW)#t z9)V>e(EhyD>cZdhJdoJ=ez!cIJL@*;^v!{Oyo7p6;!|I=XlJiT#Rd2WcvF>hZ`TX* z0-%#2AaMHAG&7DyDEf2hdgFN4Esb`FKEFi?gDLWU^>+Hf%--SFuZ!cCUKiNR>;9nT zV&Ui&nSnc@oHQrv+dR?DB}{?8C<=Q#S2J-ytt9%DCu+4Kww597)Fihe2jo+4Sb zAp1T*GuOhRC--jh2k>hfXSPqS@^{b}2|VzHfF|j$joMCWd}%|i2C$T`awNspu||ou zk$u)4R$mc+Ju``NsEZl-2KoLd-_F2EawU2s$hRr~yVZAf*>>-g=^_+PwMY{Z^?S=f z?&su3O=D1Yk>=*8s;@?%2VR;}qZ_@uS&H7amX0h7jrMaZK`0BO*RHB%vtf*CFExYf zFy_(*ThD?M=I3<|#!!j!c3k2cB|M{WD@_mbZiJA&4X=%h$AVanRwjt}NIR`>g7iMF zv)JGby~b6j6amu?O>IM|_e+G`Ohe#>5;mr(lgE7+T0#JNEMot8T-WkGHc*?gg- z0=QhM4OXaulogvP@-20$r~02zQrU-QsDlFeR8<`+#bJ_kur`XHa*s08jqR5M0y%q> zBB#1XvnO;dtxHd~`Xa6Ii+XTlH4fFp?u_qaYKD;qD*iC66Q~$7E3P+u??KE=RqI*(oUU{=++nRSX=>J(X0yp8L6cLWF8EyMbjnfU>< z_HxGW`&Oaj4z}5H!;rz{iu)Qnsz#5y9;0CR8_VHm5+tqKAm98ezyN=dyPV81qrheK!Jah3=XAYdc}qZ8Sz_HG;8$vn0{tE`#zgPiP_Ossm-bgfJ!D*K7sJ z&8Vm;E#MA70r`aH4UebUA7!mjG`pP({_=-f&<;=&f9p%%;MU^x$^)UULTrwoJtOAL zG1+ZG@k^OmQwq90`4?G;d0l-OJD$Kl-zGo9bV0y>*O$BE5%N?c$#$qCxxycy41;}0 zyfvI-dBlL@`=H>`%_GhjUul|^QT(8#rVYg4>J82-BvX~a26W@#4d!zmefgykZR1@& zQ^bOKa;rx964#=@=NnK0)IpZ7@Oj!L{=9jA-24n~F!Nq-I3HiObY{z(bYc2$_;K`~ z{Qw2ISx$(`W$(Dv?qm1-bXOjnx%qrC_<7UXXzlIz9(3VaFCe5nNyVDd1byTYWx@$> zja6V3B&nHeMR0;wL=)UXx*mLpu&49Q@KyfijM!AV#Q4VS|Px18&d6RMcTf zqevT|J8EOc!dsHMi7~#M#;Z2>q-D(JMEoKJtw(MjEYaL`Y!7_oTN%lAMv5<0;0g}u z5!D5QYi3HuF6#P1%pNF(Wl>foN=Kd#VhZP==gK~Fq}O)-dPZf5`P-;{5ZIrrmamk+ z3ehaD-qqEB6EO7jSN5DT_A$y!OKn6rsdlYSs}<|2K>Ld}FwCGsrK>To5>g29D-((0 zYc{y4Z`g*x`7TH1T|Bl;f||GmMr19YH3fra^gNW~PwKpJA(7@Xqbet=Xbpje=xY)B zMX?hqxL=g53y^MHA%t1J^By#sBQ+H0YLyg08)@W5 zYnS3P7~i#d+O>W*^cFNUa7pRHOG?8Yh(ri2$3T4r@%!Y>wrilStEv!m>fCe-I9-x7N~bnO=c`f z?uG{LqD?GM-ZXhdb*)M0rHr!rCSKzeYb}X}J>Jyxk0`&TMuaEteoMr>2*JbY+BxYy=we<=2U;HF2x0-l$n$oy|tiItrX zD*|Vi=kM;^=~|gGloD2}7oPv67Whd2n<#v{#_GvZ(67QS-%6<-kv2OXm(LqJ-azjS z&_3$)Q0s0hOI&MFN#$H9f?W+BmB^`g zc)vN^C7-z}OqMi;UWGKuVm~itN?#BkXQLF->ChV9jG6XKPavQRpCqYVAXY3-ifEjy z&p+`yrCwQ-7Hg=5Gf#35ICF?f44g36%~e_|qVcG@a0vpc+9(I`r=Y$~6o=f~a8LDI zNA~kC;rJJ!C~6nQD41$2xx-PYDt|pu&_g1f$gMpjLo)+7=-66yRwUMZtO;u{hL06F zLxPncUc}6Oc|a#%HDl^TZo5i4na4VDmu*d*BbS3!cMiE#@U5l}?X>d?ncM}`-U{=} zA8oYbZKOjJ#OW+GB=i~c=_WP6O+%F3_e^n;d(?Rx3EVHpVF(8GK#5%SWAtLSnOwmp zxtKNu&K#QRYV``7Wrc~}TQrN#t{MSx)$*yIfD*jDw1?NTYbYTOX+r~7saY}UZBaXMqMk+xaneFdl# zcf^~&*L0rYo%b7hFy}Q9L)+!?-x8O#DlN;7Wqfer*B2HWzzo;q8Du)MZ#?E2t^G|L z$HaKBxyMfvS9E6MXCeqgW8>&O=}!i|iT_&Kgiew7YXZ*}zLJ-Q|0(hrcg@)z{_8R}s3*LK+?v2+muv7B`?bt4 zn>NC(5ljScNGf59lV{wp2IwN!}6+z6(` zhwW`DYbM@RHfs$mZljaY-ji&e7pQ>S>^H?(%u4h6bx24^*iLLOlxu>li2po5 z4z2EzL-0AQw?KQpx&%IU1$Ht&jx%i?9YL@Yke>i`zf7y=0^*-wGiY^fZ0HaSB>Jb4pCAVtH3oMP7uVd$8phbY^ z!NU@C4vVMXIAmu9K%r}i%Z}Fo#!a8kcioQL37${e{hNH<%k%L{`NG-U2CLSViph;J z!+$jk=j}-pP|T^5%P~~>+;_#nXS(t=Q7)6H(`olnx6SK)Q^4!~_QHu7s=kA-XcWwlnNZHo@Lp3Ev%Y>7A_ zy<;k@3)Be`HZFguJZFrz5f&KAQ2?X|;VCrllv#&NwtD9(0iXf8zN!L!tc`n*16&Y6 zcg#`7-M5>d9CjRy)=a~<7yzs8WlxibK#t!o$tMcObSFZoFPYmiH0u)*MC7o+Vd=;0 z485pLr}>&zEr_cwT40@)keUY*8#d#-V4QL$yh-P1|A*d<3U{wn#9lZmVzA{YkCDZV zs@eA{s+S=g=qg=3k#<$yV1ue!shnpp^iz1JWMRK0-q0K~Z6%{C+A|o)Yc-ot?`aMU zQC%2v7bY@iqMAxSL_MLtAHB-}dsM?tc#+bC#|dzx87CVelP`vqft0tPd#A>FM^*6z zk3?6%Br(4VI3X*-STCsV!8J7!F*jI{ww~R`68*c7jG6|?!HuLGIDoMWS-J-DJZ0YM z6!9#0BsE&IxM;}*O$70Rr4;X|cvWx-Q^j8(9QZpjsDqKfjld45^7w}8m}@Rs9*zq& z5(Z$6Ay`RA_6Rgq2C!l{fMNZq^=F8L6#OM@y(EM7%c-hQT#N#=i$6K|>iPu>zKjuS zSS6a3ubr9QrTvY!`lFhV=y`_x#R`XK2XlC4avVbZG_jFRd6mpL$TL_Xp15l&Tv+)I zPLj3F3Sk7J^GSV~(z3=Bs7Ec(f#~`KyV~}6lxt+0!7vfD6JQS2V^?*+d3pNM#LDxi zN7-cTKPaEEv)v2x)VTSH=kv69s>XX_XLbXw)A82my4{1{wAA6tB@ntYxy=K!S-$H! zq=$6jsrAMfKC<1Ru1IKfRU9cHfA*jl>4i(i$15`ko`#rdMnw5YgxedCOKxRD>UuJ* zA0E#$P{S?S=mOc;Df(JAcvsSEUK3a;UsWMLeZv9K+)%#P>Wts+5~(R>4Zj>9#xuAE zXk#ZtC$x0H^@n{s|0TGo2LMQ1y-!Ki1^!76I{&_Q*ShHc2V9i)k`6KJ9yi;9G00}Gr@Q{m6^2J*_c zX^JlS)9YL#H(s|~6eEB`f6!-|+~Ltd$i*JZZ?aD}i?P%NiDH(`;vrq|7@p$ryuS?X zg6qDhC!rKlcdChu#Qf0laZyarDJKtTtlw}^dnCj<#XKqKZUcod5l@a{{ELLOoAs)V zDeJjB<))_bXaiZh2_cn~ATD=Y{J6ovYGZRu)WfK%GLA)lT71`-semPl&bO2HeM;rx z$ysQXRJzr_p>$xP%aIaPii)a+sy-3Jx-k2apy^hu9a=2?Ht;iUY{-20SV*`;R9#0V zkrdMiuPDyB7v9?>pLht|3_x|;Xdk}F^+O4FFHJqFuMN$zu701c+=-rqSxLQl-)st5 zVw947VNPVZ#$rb6lwCzfT!Xg&s#!gG&>OMAZKz(5Qh*j{qNn=WqLwakPeqQjcSm^u zHd|wSrl8wN_99L3;=0~fE%RpCH1z>8L8X2CF&Vqnx|+Ee##{lueKV6Upj~_`%GOvxH0>V}L)Z=O@s)lY{J&#O`l8Mj@NaN`H^gr@tg=USrVH6KVqTrHz*8Y1FwCU?ohN{eaWYLj&-_t>Gd-2 z!v8rhvH5YcDd6@oJ*9ZuT!|ph_ynQaL&@MDh&yTww zHFUm()&zr+9u3e0P$uv4JN5;o05uARyEZE-GYO(N61Qg=omzMfw}MOm(Rm7>^!x93 zy8Dc|>-$DtPQB=%0(c36m|a+W&{FvP-8|x75jD}2+9nD>ZZji7ml`%PI|Kj`%Bfhh zF99etS)-{p&p53QmqT>6qJR(9Fx^~0RS8fPs-O<*zLx!6O@H{?fI8RVm;`m_x2bV7 ze02?Bk1CEUCu9plzKCyg1u06Jb%=4dJ@oM&7D?9hUk1^u9JvByn}!Fv9g`ItIL)ol zUs=0eZ~bKuUdHO&PZ(Z@J$ooMfEN3;epQ@44may;{ObBoI?@&BeUS_bc)`=MatFVF#auKkf$OP<;QVQ) z1=d9rQF4UFzu`8v*SmG2_N=eD^eX#DxBnHcW{A6;CKkQxk4m#=2xfXtX~gtpdQQg_ z7`Dn4%%IwwJXm8NUT~57z{fRF+v%MSn{90yR7D1qPrKWxcn=7tMOSHMd#dH9w??1D z%dU2fX7}*Bi_-N$b|3C)-tYU1U5Wr~pmGtGkd-!>7H6u?2e&KPH;`Bmp- z4bxRsIldzrO^fTU#ViG|*>P#->iP#XM0noMtAdhGpx~N(TqK~R1a$cAK=;bN{oj(3w^W<=@tt*-&G(mo0L4!4e~gt~kUsJ0#Gkpjwz(;g zB16fO^dF#_59+_xb}Bengb+Qe?p@(&qC7F-=Xm+1&+|cI=f_k2VB-bxU8wTv*uz?$ zxk7+~LsHVBa!^6>6gy^$3cJuOZ}u-}RDgo#dxE;I#bT@_Iz`clt%4vfwkDSGu>Xbu z5ftuqliFmIwAhHSXhJORNOXO=mo_H!fTG&i*Nl*Tw~Oi%Zb!QuRn+VXt*cy3HS~9{Zt|V7xg-T8Yl?Zn;i(w zl`=PV+nT4*aq*-)3n00eCutKWC2-1#9EBZ>WxEqTZTU?lDfN>}Vw#lIWtGV{f!h?f zR7zExphO%&F!A+4l@uSVe5qwP{xZr;KS9yH!1s^rhJg>Cix5jTpK^`!**zv{F*np zn*H;j2EStTdMbcRP`fKNIMU8RaXe3TX@R5(J$bSKbi~cMM)|EMDecvgEV3)wvl5ojCdV7j}0v>n{U5|IrtNKt4`mW1&xtP|AF0{3KEAr9I;6Z7Rur1E&!u z;~nAXE!|ZMVu>|Gi^+aHSQcsbw!M(7ZHZc4GeX`eXOc^v`c6DWC*Yi(L_Za7hHvJ{$LB^c&rn zW(mN+mH53Vd032}N;)ba2eUL1*f|zVWmK(?B=p5rt1ZX@3}X4IB|46hjZp}Xk{lQm z0$>L~qFTG6xKFB;^&G%C)eV&Aga#FqC^m0#BpT?n*hW4_K@1i4!;wyr79&&1S8-L5 zmcu~R!BzFX0Bax(Kte_w zhb4Dvf?0_`weSw)p5rbL#6~WHqy@VK5Iu*K{I@^!!foJPPrEt;=5q?kx|jwN15>im za*`4ZA&wyGBv)XN6To&SI70ucH(h!i4P4&u%?)G})g?OMRDVr7L7!ByB~QDx7=H-9 zh22!5VMs^d4=NY^Zzk+pXnc`EA8qY(CV32V=T2#KW#0&s)f#w`Nrh8a*ZKquqp0hc zB}ATG!;>;-6m;(P^)(en#x%YWA0dp%^84jS{6Y4{;d6KN4l?oy`Nk;ZR7oQIwg`_= zRi)weGyqHw4Tk5}*>k>T94yWGT)u?=YuIVqM*^=>C+BP-0XBuwO&hI~XvR!<8?l&N z`u$eQ?K=SjIa>XS>v2c!Vx=hk0K;D&qSB#Tz(zRAMB(iSB2Kdt0|jB?JWe11TW>;Gzk5s~JJe!_Unus3jxzLzd>< zYfj`T7y}P7 z=;aVufxX$h%{3C+E3($+0YUtJ!TR=*Dc~nyZr9!Jn~2mAkjUT-GdZT)?d^r=!~tU$ zIv~4UBqWCU2QI^FiUA@!pyiCH!T~!3IgH%C_>KZg@FlY^z9v8# zCgP%jm)Bj#F#HGIG0y2Qb4&Y=sea70essrIdB1?cqKdMvS#-|9rn@^OTj>KHUoS`8 zntZ-S0{j3+P!R_?n#=gr&ob>VXX61Xog>2#?W6iG6xxjU7wKyDmY4kNt_^sL ziQiJSXM@n%t?wFhGI>^NZ4gfx@WEeMopzeno*xIFh-&&WPMj?wpO}vMj%YlB0gNoz*GS z(raTF-Nh?2QErua_Pu%T>_OP#V0+HQL*L7@7%T9{()QWWB{Uo7q`%8$O)sn*lZp~? z#<}eYvd4eT0)y9}kgH)A{(_3#xdVafrd*u_C>)K7g|f&7CvHuRd}57H6)ag8r{cPe zx#@4p!!!LsuTTuIX&Q6LOyjZR*LkflF@!SuJHoOl17lLr~r9vX^ zEL#)@q;BF#58Jy$S+bGWkZDigp(w*!Vm zT3#;i5Y0!M?OTDhzVgTm!{@1O124=;9Zx96v(BKyhmEc^zJLT|!45Dxh$;v-7-4&S z%mGg5c=x@#Y!_KSzbI$o(?s_{76J8Ec*I3)9bOe za;EQfUYz%uW#T}W6gBv;9XC*y*g*f~+0i(*QH7qbt%~N4YKAk! z^F=Mo*U-!t^NJ2xD`Sym=^yL;5De^s>rY+5vq=Zt%bdywcrl7#fR~d4GpMospQ@xY;lKAflJ3w*mlfR*_97C>d*a=r zI}9rn&t-b~Q5;39iNAZ79kXoty>)}ZFS9&{+}?CKpe#0>4LOGEXKo=HPPqx=$xdL` z(M|XyGI0>l>Sa!#_o(#@>HF_d2_|xd|1`|2Zjde zf9LHnWRt>n*4fr!bXqGH1O*YwFqlo7rLg1<+2p?y~ zRLA=v`+A|qpL)Y5zhVRKz%g%!uqA~e(7%J!`y$mKxbXmW`dj2BFsyjG9vU?N151g$ zuC{ZL1>UZ9K{zLmPLR&<+P|@}K?Uk(M1l^v`TzI{jLe`erH`F$d*!s@g@@1i-t{!T zeC4Lk?P+91=gqu?uGR^X{3`A|TQ)qX?--zf3O-g&I+i|Hv4-_tkQ-Go zyds^XQ?MD~n99^cj17+?bHlwBwE?qE45~g+?W*cnDRj~sXWbk8-FOHql=LSO*r9}; zoE3w8^H8-P!$sO^E-f(jlHon8gIWnCzC7zY*LefO5P(;Tu<*?d^P-(KyGX7o1^E|G8PHnG;vVB5jL-<_rhEeKOdky5{-Z0i+>8_LXC| z@OoW?aoVnQa1u^cvG!5U7>x~5q>%Txut#(T_6YPN2|;L+UXjMAR5IcH9%4nudp$s< zLrv7TmR!h@JCAr@t!B5B0Wtr0$UT00>Tq2_Bq!xateay!;!2yG>BX&kcH04P*D`|f zQ6yc+Dld({YbPTI(a)3N=StRbD*mHjT@4HmtCO_AXf~HBX4Ge@4D|C_ranr#2tm)WO-N!g6C*g`V>=K?hI3 zzF0>Q5;QtBF9rQj-_`rl%|%`+9+8@g$$%}Tcj^V+5ra(@-fKpHXoU(;tTi!t9;=3IfXptb1fpL^!D`guqN3q^B)Aj zs4!>poM$%QximwfhjV5%WBp$Wvi!lTI3XRGLVB}#8>4C?C(imztAwpc;(N09Bl}oS zDY`${OtHZnV;lS)XV1398+D9~G?FZCiSVV*Tr?vr(~NyaDNU_bX@)RMwW^`lA!#SU zlMbO$4O;}{Q)&f|lhRVV?A^S7cs1^~N(vlC&krO%)FXH0t)JNeAf{|Uw8fLm=dCSY zU9bE3d5_EX&npl?se2FvO*#2&w%;F_Jh*)(KBzqo82(k0GI{uas$cX!)ek7r$?LTC zif7R=#HYjC{CNi|Ky^I7EE0R!oj+hN9wwf?yX(jn=i?y;@dcHRK!wgW2(uPX$q=M0 zKpl}*b;-;?at017LPqWXlIc+UEVTdr`Im{3XHuAo1cd?)#e3;SRy2#y*JfnVm=T^zSSOUl{<*4I_{iEARalzr{};(L3;8F%x;&Cr9CB*l<@ z+8j<9ed?gO95KrR%8Vcm8y&<#jG6|MHAdMirlqPw$}jWkRC6O1o@xU6(d6OZha*?- zV$wUfUM6sNkXOUy?`WSb@mIB3wN5Pvr7~dfFn;T6kTE#ecUQ7F2c+(NlljQLQO}pD zXKPK+zeV>dHt`r|Mw0~Y-KGPd*6P*lj@svGRm7r~y_F(t4t*qp}nGvh2cbtK!k5&aE^b$Eag7+-GPca+ zI8cbMqD1YYgfkLMK<#cE!-vWt=WRSy5udscYThkf^PGMIU9YAF z13OqlrlS_LEDOw|5311t*mI=Q-ko0q9_`;jpr<#tmg_^if4{xHuZ##X&gc(D!P)Jf zovZ0o=1T29D!tNpEBd?nJK0wwc029vc!m`mcX%ObdjmI= zO5K?fwqeNS-+vX^VI4P%G}b+xVS4PhIcTxtEh7i9az)5W?`XXI>NICNb^^~R^ACJQ z_Htlw4_{XX(lI*6DUB&%0e^ntiJj33$Qh9vdZ1_cELdvEW_{|<;VzxSHY`yH=szvKN&?_<8t zy_{$7X8UOuDANB#3}C#g=zsk}T$mmm-a8%R-N$7rkX1#}JqWF* z_5J0){KNBpM;vN-Ze|H(W-B807a-ikMl+&%+eMKiA40d2E{t$|hHjO~Z4^*Agc?ET zG+2B2m{lyU2Or?AU1|E9Oh>MIw$m*qoh3FZX|yC|7wChmAWV*Ay(5yXiEg~;qUn;; z{R>lv;YS%wYneT&gZYaRt`_?c4nkCqbw5VhH%3uzS4qeY^l;XUNVu<_@ZOD4rZ7Qf z`*n8$G=bQaZLPi6JCpr1eNxP(7j)gS3r1sP7tp~))=>C5{L>{;!7%n)X;_t3tCnAq z|5DlD^}*05Qb8dlt;hW!j!f;7DgCutYR}RKoB__Y^s298)rrH5h{>8hPpu|&HV6KK z8KsmXGL2={cuV8{ZLw(OgmhtEBMS1&3=K3{E{XFA<XLUfDjp?o>}i`eAJBu<%?zg|YB9?PoG zPM+kyDBnvavYuXpwqH~tl0o@A)?|y_=q>6yDJA;}@7QIYoy}OMQ#tDqmkU7|cHcfy zFVuIj4{E(#6w~>9xAA@-GyV}pfJ-&AlW|Jt?r3jVnXZg#rt!wAPKicp3luugq^Ha%$;)S65#S9va0JsZPp`pH{!Tg^8P9$UgkaTK{sy#5 z1Nw0)p`k5K3-z|YmePyBk-5e`!6TBjZO=2mrzY3$T{B}^bq9r5(|X73jKNOmW=?RD z!;(2eu0E!&y&4K#GYine`bo+^U1Q2X*6xPxZpGjP^Yq;p5`pXRr!O&I%PH8YcFUi) zezW;wsf2aJdnFeRHV=+7?wyFx$_97}1!;Zgb}FlpUz43ANXGmKt_-$)UoRG4FMB?B z!ocN0n1-Im;qi>%?d0c{5ckvj$JSO(iKXlRQVe_lr5JEw{&nqhw7l2%w0gF?TRMC` z#k}f!zmLak`+1sPU&*XvD9fUvv>Bj@2w(KWS}a(`L;yB3h1HXBtuD8*!G!77D_#7^aQRVN257lAXk165Xm=PW|? zQO@bTlwNdF&))^Uttj%1|7i*z$G9s%1H{w+!2F50ENmNUxj~Yj%9aflb^2YbL7IvYkoOB zA7M>#Cs`zFSkxk^S@=F8I&X+EGq1Cz;gBq#)KF|JG~QJ>8R!1AR8%*>5$DIK3mHyV z8~Jp!qN5~9m4Jw{;xtc43l3|0`O`)JPl9^CG(AvVx1)E`;h%BQQDLUhY>g{mH36S5 znrK`2@vf0(4Z^}-C=K{)uWpC=;RO}jF}g#`;RC$oFFU&K zWpnI;UL-~}WJW~M4&qn=OssAwiR#4T5}I`CZD5#M(wKNbwWi$~yz7P*(!rMzh#*QdNCMe_TItsZA;7~qYO;Bk~Cpwnj?#A8`;!h{RD&#cjD ztAFX}c^wOS1PfM#ygzd;Ki}quWItaG{61T5pWmjPd3FD~H2n{vic9?87BNXBF__kK z_SMa|=JIWEC}?1r_~Qe#Oyu)&?-ZuLou}wkew4)1G$&;&5k3B;#0H!?7F}1jSgS=K z;0aYNg9`C|$xMY1WR0K@b~9rVbHo?6+?sYsoO<9e9FrZ#@F&eUpsRQGJ4()NB6k96 zwW}~XlKO@m5Jy0`|Ev24HoJrk^EA4|$ZQ73%$*Uqq*SU7H)m#EexyvG@M0hf%N)Cjw5?wR?IB2#bu zl9onwsOT#pj1HseU5Ug|ad)frM6Iob3a15>4?4bR2ZBu^2iKGu4ZYDzgWxWD^%3AM z2!^?0*d*;7Iz#m*%u0IY-NLset52C_v0rX+?A_Acj)`sONX@+2?{cY{rmtd#wt&MU z?MP)6{C%5m#}>|(jK?=h+94E%`$Gyq0T<`1&f#&Ux(8Wz`oRE%?3WcBsvs6!odfmQ ze)nR3&KMZ{N~cksO?R`9_Sk-pkV%mAtMpZ?puJA2{i zrb(`ZkYe*MA*@r+Dk)_9?qxMvIUs+YPGX9v>K)?TDBIr23?iG%I7C2o;|0;o8KyDQ{{>b&CHAmyEFfx1VfUf; z2Hn{>D4LqdsybnTU&*WWU!-73hXgDC{gr0n0Hl>$U^R~@7oWJ05VSt8sGohXt!Lyz z2CA=XpIUCbGM9;+IG{=e4Qu8 zv3X$&;+J-YE0L1dR-<}J9Y1Hlvdwdf zA@Zy*X1bRiUT2j;vroEKpO2cFfm!9Ul?|We3^*DMR=R6G{BjHe?e|r zK96YIFH0@HzK1s{@J{A#<>mj!aj!rCgOtJ1*WHNyrkalZMci)dWfDP>45s&SbKhd1a0oPw*lY_3J23>i=RUaP zvfl;;tI$z!m6AjY&22XzN3b$vy6JiQvDh&U5t> zfkIc*r1IgS@;Pv8U%By0ywL~}D%;-eD9|5M7$pinV~6l`^m}A9XLxo$s!2dEaD3)0 z{4Gq&Yy?@<3=;owc*OHr1Oja^U+%_3ju6 zkg0In*B4P@F1O0ZXWO83@lduO<8l3nkn^#2g_&`y7L7!~x7p@RKMb8)Y+F_7PMS*Oi+Qce@JOe@lic z2TA*TdEMU75bYtL%Lh=`BNV9E!K2;CjSq9+qswo0@bxiUFtB zMD5VOh!U>YfvlWaEu^-PSETmW+wtGE^OItW!_-aVr!rv;#@-5z%YHPhD6?r=Ao0fw z@wu@WlZDO>|I}|g$4+Er^Ul-Zm+78FK(!Ja=BkMXoiarSZb4Pt6M$Uerr}0GT_Xj4 z;e}L+;6HfB(_2f+)xkf=iV@V;MN^%Oo8!1<6dMva(8;M(21_{6bp2Ow|R&Dv4ift3%~in z^771*X(ix(i8XPGa1{1xp|QX$7^ut>Yir|8AiWaii@x6GjDnrnw_!I8B|G(alYS&I z@XV3Riy-l)$C?1=I;SssAFu&roEuZCbcBc7fAXr#w_NN zA_irlb@`kTe=Fe2uqCi1L7U%Rj}cs=_bO(oTqygq^5UI3=%RAn6X22oq-DG z8WK|U$jY}B6!c+x<{ERsnH7j*EV`gS(5+bp+`M{hKY}-l0KI99y4vqxTDmuwceM37 zux{7$etVqf_u;4C?tI$PaC$Ip!m9QEcO>h}gXecb#yf}O_c=AME<%^f?`#!?LoG`q z6D|Mze2-&lKEN)Gg;&L6wqF%AzshOO+2o+vcBy3z_jx#rsgn% z2)-u?YONd!5*>C{zR;)2xCfY07#U{KkUzOeWb+UG$XG0qkuBk#;!@Z!(i$WhBi2W( z4@db|jwj$%`O1+BQoG8VAd*)z)^17v%R%W9(_H?A{;YB`96;HZdme;Y#y;HoWdke9 z3&O1~v!F!8cWS0HH&2T|bA>$X=c@Oi)W+LXOaTKTI%ghTNHZ2*Mgfwlnh_dhWVh)m zmgyPvIF4rWN%mW0lpx=q7JKps(tXB2ywC!;Vu~=N-&CrEKLrthXl)faAcKO87e@=R zGzQ5e4o^t#`OkTL5#Qee^K%Yn>*oYW-}8CR9=&2R;?{Uxyd@dKzu)aopJ~PLYW!#|fe9I;#gF zq$o>sT+!t5Ex>8$QqgliXPm<75FZW`=M>2WrTeJ$4JUCpFOB0k1Vf_jZs@VK2TpG6 z5R$OSupIe2uCF!RGn*+d{jL+(WamSoJ^Xb-zZZK44_E$dj^K_)a{OR?noq~a4oX^S3Tu@Ti zCA3*JFh_WjOf$llG;d%zlWz#wBNjLv9|P*?3E*2M-W}Vd*w_Q4Wzo62UaINj_#tUL z>WvINc*r?GR9nqe1qp@h4DeA0$83F#zEoy(4kxu&WT-!tN5Hqb&>zp0D=gws>3md* zi&a0d3{dllzQ2S2AOYz1;QDgSxbCcCOpGCzQN5-!9s~G++%GsSjQP;*ggiwx%((M0 z_X$%zwm*Ra!vp(;z48ZZDyZnyC@%MPFh^$`rdbX4rAkD^gP2-8Q*+^f)z7r}w>{fH zyY)&>Q@xZpu09GvCseZ>q%4Ujq+pDaakou>Zc&|UpP%E@%Z6ZpGGiL8;sX22TDLr3 zDqMUA3?5x!<*kRop~uci$&4Lj_)K7@7GLb3K*ffg%CyH#^Q`*XSHM~OQtO@yI4kr+ ztysNn;t*ru^e;G5Y*lgjaq&n5F7e$yuD}t3k2kQqO=vx9#*Z&g{_=;~|JC>!xZoOp z2J5Zesn4!D@5R)u?Wc21t{~6zzod1v?e5RRWhS9ck4sU%dW(mOP|9jac?h$mX+u^U z<{Zv+IXZS5nDTtgAO3rwqk02qj1uV{fVi~C)j0-wt>!?h0wABW1vxn4TRgy!Gb7IQ z%lGa=doibP854;K6F6AKvGo*JH2##@MGm#__gnvU@G6(Vd7tzEnN0(gWd~LEFxoDs zN*5ff_N(vK!B9H?TIfyrZjliFeL*{`SW3b2{i0D$f$R4EP+tZ+@mY4n99?d~BEJqVkWJB?FF_60w*GAgQQ z?Ks{tvx%Q(b?ux|3GsG{NHL%LuNFf@#MIcqKapL!p9oHLyNxh99-ujNnj3T@IA z_udR>Boo%Cj2U<)={E0uL{>xvuljopx0`1_l)A4744xKZ+xmO}^4?xGG>IX+`TL5G zXmc~V0{>gjX}HyJsPiFWb3;Ixfl!*{VBK&eUj_) zQOT=i^(){~cm;au0q(M^e`CyK4}7CP5Aj`o>}+*_tNAdyp63fc&yTj_&zT`4TwkHQ z8CSymi~lHQ`ZoXF@T%bN`K~s-8~OalKmWt0*Y*CiRe0(9@T$1g`Z-ip0oq@%+|SA4 zVq^bNDC%BpG58}tm@mVm*^_hW$(5Iz7(iw zAh~QzrB5+VIMn0uB>Y{KXagdhC64)NKQ+*#_71DrPi7Ax@{Z|NbI4Q>Q!T0pLRc;! z5&mq5eQCn12#y!+IO_X}ooXOqMat`6C(Z~_UYE*HMJ(@iF!jA8By{n2nHR{uS9@}e zbGkD9&k1(3Q$S*mhPY6R3XN+}r|72G_QSUkVT%P!d})l*REp7lijyz^Iu)`N$mHBh zUdT{>1lh-X$B@CJun_8Ytyr(6Hfy4`Ia*lT<0>E1;6@wwB(E{-!j1)(thBLQhm5wz zxA;5}fbUGNyH$ks?hxHe83H(`Y}r3Skvu!w(4Ojto72QFGmFG~zyI2ITgGooc9bvs?GoMF)q2%W#i9ll3U6X1&g$mFYoC(9FM!- ztb0oVD|D*i-jkiK`*r|lk==W4k^8_l($TNNiuc5s$;Rt+@3F_?lCaXQIxRlR^BJr| zTn-3k3z|7XKzP&GI}~&Mgz30KZrj7Z<&bME%_2U8H!;8KF(n4;{_=C{K|+H>3-~Wr zZB5K(hAu}9Z4iRI_PJbY#}o}y*1h}%W)nF;sAY3iFf&^PDWYot)_h3TeZjT)sO^qr=#`UvaZjXb!v{fs5xX z7MFOpY50qkBaZFj4cSJQPXMgr(LsT5?=^b$fB3Pz2cn%8JT?q8#SHT~xsxm=*RTRs zV!&4e0Ab=M%hihSGO2@8J%6`@nqx@_qZ6tn%>=roYjSnKIRVq5DLxnXVUCf1SCEsE zmA+3%?m(?g62WvcYV|5y{{S7R zxKv`v8n3ChPr)oWQ+jqm2ozH6wDHJIIqI~WQ9WvY8=kj@Y&Ry+7*-}}Y6F7W6$-q; zg#$ef_+xPNk)qMlW7L0nK9o%p>UO^F?*fnb|JU5p_)nWY zgWlflwDB0r=Qr#29#yfh_)`ik&-?MCs>4q2^I!s3-R<9nA~@;W{#%AEre=fpZ;BY3 zWzhD9Wk@^51XC~qhm$zHTDE~HTcuoRqx2M&cKs--^?<)#gY-=8PilU-etbO5o#7e4 zZxfa*6Is>n^o)#fl{Wtvt)I`Li!mv95a4y53omA`R*Rf<-mplWtClE0-NNtehHvwk zTwOnyKmx1hvR6vgKmJIfh7A_`PgY(80wmJ{W+}dEe@(k}Pn2m4ps9>xIm|kOCv=pt z8Hh8f$Ud{;5KZV2Y9DAT`!k|HyKU7zO ztGI}uyhh1&V?k`JyYnZK`;Oi2#$P6**m&Bc_ImtsEy}2cggnJ^Mx%ucaOmC}jUe%l z-ZAbmLZ{}>r2YI`ytlBW0~)?i19Fgy-TBY1%i4b$SI*(nUbPkbpqraiabQy6Se59! zrasBz1Wg{}IH7+v|LiU~G?=qO-6lHv!TCG|h5=!39UYtS(~xdb0+5UNS(`FmhbYr4 z@?7!E4*cUxz3YsRq&tv+lI^C^DHS#|ga;hVTohx(3MhcWQJ_$|?Z6+R!R^&^>?q(;-u0_f&+lL4Yb#8{B&X@s(}8W<;M?I8 ztVG~T-6lp#8ridfYR@`ICV6QVjECsu2?MwDz^l4lU0okHDdq~@pYNA`?*os%PnTdB z>(Pw9_vw)Sl=*EOc*Upi)VbLr)AN6ed^MclMZP>zXI+h?M<>YK-RYioeyz^;tLdN? zTm7EOt}vm_V@LK7lAUVj=}wjk?K zHyv!Th%wi!o{{k0Sf;S#X-4|XZ=zoF78Ak!dWlYf4z5+R;xKiTO(^70M}3SZAI-RAh_qI zAVWTB&p?KOJL3wZXB#>x%WLbcjcLpw=P``sJMIfrJ&IH-eGry>&0w5EA`SLlAxtG> zHHl4f=aJbVfqZ{*E-{7DMrbtaW{I6^Utw3@3Ad*0^>EJ80#qsU12cJb#21K^+DCFr zLCsTXX$VMX-xx;7O~F{Q17J9Cl)_3UuvHtrjXY|Y+*mp{u2f{^S&fNGc9zyJRLgW31kV(B*UGd zh|QlkWrI8vUQ^w3jx-@4-hpCrTvT)1if2q?-?K$)7uUx$`gSwbcy-(fxAA_;1@g zQpzpY=q#_#+Yuk`_V{Y@&QzzY#!ydRbl=>5BVQEBzgGYXwd@SBs~%Nq(wD0hbmw|{b#*bu4w01IRaYO=DI~5e|zYw-7XMvSUiUFoh zk?mFvS5M!vp=d|o3G*cAj1kcyzT)Tg)_r0m*lL#UNbO}1x}Ey&W`Uy$xx+$4XHC+4 z4}7wIk{j{DdkNE7=SAO5>V23xaBcnDjF*+#{U&@AykCwSoX^7#&Fs15dsJ4lXV9Sg zdExxQ`y$t$fD15$W4$>jjM{Mf69=|t8H9|CG%HYncIQ*WNHC4)Hz^iq zb3B6-``N(!nAN)^Z}3c?ZuR+{JNM;BJ11v1_S_@*dIyJrPd|<>F0#8pZ%YS?%X>47t4?T+bkKrn8w1hV{z*Le*B4ualaICjd2LNtI| zhDk%?;oUCmXgzjhMWOj?3s)l7`B_Gtm;p zd5q%R#$$>?OPJrYFyR36#1N@+z_@<>Q~Ag)G2E72KjOHTba`n|V>fagx0%z{U%9Mr4e^U5(aUH<2rUA+_w{wXf5w^l%}AsY zw3)2O71l${Ja|AZl!8StCg>2@g>FQ$+B+-6{ajX0(-3MQ<&H86sm%r##y7&$-9z}! z0}k1eSH`G_{==)F?U0%Ah;^vzLZWhwHt0w?Tpd{MLB+2V{m(mM)&6cO=7qy72H8Jo zk#^WcDWjAM{iNo;k7vYw(Os18g!pmrrU~)UU&|sct_9Q`#K#)+(Eke?KiBV{Vi@}C zD06wS-x|+iEbv;*$ix$)m&Sh7U-3DIUS|w7oxl!xv=r>XT~a1#*gUsxWGv~D;!^(R zBhFGz%Q;obJB14QlaQ%mk-K%-%1z9xxGo!ZnGf#;xvnu-ykze#vgvY4(#)tzhKN4Y z2ZsElYsNpBiGh(NxOHn}o7MK02dgcn_jci<@MTcmMz{H$oaQ_R+7lz{C2(&mW(2&t zqq_0BhhB;XL|tOq8$W>IU+9cBKhwC9duK&GtKhcRn7u;AR@_0?VR$;3r)aX9C3OG_ zr8_UEd=;Q+#t7?(oOYNT*zS}sT%^N`7Ca>wGw%%QYBth&xRz%ap8pDd71aJVt~?W? ze;_hq@rz!3qdD1AovilER>Z0Dn3>WrUh z^S2Y@T2}$0uV7>I*7o+LzVGv4;p3Lq<#3$e+rFR2MbonH!<*C0C+OqjBdy`|Zm!5i z!$sF_Ro(vo2M?!-$uD#Tqn)Y~r+pPC8e80O}k6KsU_PrU)S^oFAo~E(fLNr-Z zP3eMZHh+=!`aH@qR_+@3hqEn5$PvJD>-L8n>3bHW)bju+Ssx5d9KV4&Q&NSmou^3i#n6AoTXcStBb&R{z_xzlHk`G28WrQK zOF+mR9u%t%CC5`{EL`{F?XjtDfJ_u69-#fGoL%IxdVvONYx z8FbMpaS6QpS0Gl%9$5qc)zl?)hpE&i>zS!wmPAqjstaojg=LPgO_H3UR8*ESt4(%_$?oeMU9sQ`DPD zQBU6mw3bj!@q*fTD%}iMVhHWEWsO6-1QFYew^nzEK)(ly?hw3mvpNs;I;Ot4VQC^0 z0oN14;Es#D@gXRPVQN`B)e4AN3Dd100N|0(bGbSo0(var1<|S!*eGe!*ViHTJSA5OQ-->#RZxrZ0 zbI*RxWgrPgP?w8l#DB@yp?Shha|}{*EZu+GJtrcX?3O%MsI5kun<5&xBsRKyhAGhy zP9g==G_&FkM%BLHttis~p)n7LuLKOymqB&Qv$E_&9@S zGmknO?z}#kczsi_5kJV>{P1Tgi@*0!6RPmzCg6tdM~!T#9vuGpX1#L30kLo+7nFj3 z^A%AUaFlJ0vQ@mS91+}xXwxz3(xyFkQv15e%uK85yX=x7Q4JUbuLpEr&OJgPLiM$P zqk|;Bt@o?S%axX!Qe9F%zF$@R6RIsBHtOt}{-)Xm7ZQIyU3R~{_I$qTcY)6$p{yD6Pu8p{TRF;w z5u0`A|78w7RsUNcj)1J;gUgq^e4M*o^quSKcK5!^sS)hCzWABvd;K<6NcGyNw~V>0 zf+BesZECA)IL~RZhUlW&w^)SJ1o7>DmZ3Hneav~C5o74HLKJ-^X|~Dc$d7%ukUtOd z_h_cVm}z#oDr8%IwCrmtUX%!QnK%qkjZUJ$|99o2CMsJhh$B`}(M4)45|~*os;X92 zfhd3YcTJvR$AreZF1bvkboJGu@H35^+nK^%l+Jc7=62s(qgQGs~4 zU1);5sg|ZX|Ck}B4?LprE47?-gH02vdOk@!n~0s3#h*d#0C6S6DUuq)Gchb;h4h@2 zMAzbX2}i_kdx~le{Ys#rT6b#;9{CA5qu`e}7)lydVwm}x2~TKbAA9IY3tq|oiFr{I zXZ$#2Ua}Z!j>4r&c{qq8 zCi&HX9cTcorP7_EZfCJ!81mbgi`53WqUm{`MF<)S|; zU$A+5U~A!TLLT|aypvpwH{Tc!uy@0nvZ?TV!ax&Rq?IXteXrBQ7Tt{>duixQt;`a1{N-n^t&sbq?n~ZegziUyd#ZrL+6z^tu zQp1zZ5-}-NF03+Ey(kTauWEs}2lvnEI znE)1y9fkvXm)<{gX3QGjnZi0uaKw<`XkxB3?ZQXkMHn+aMDJR%HE)CSUe|*&+P7Z)r&>)q)47hfTJTvn^7~F!`X2 z-fGcpk8DoGtEU5qTtWW+Wk2`G4t*k{XLl6s#`J3#Ap6W-{{b!IUyV9_{l3a>|D~xp zrP}d(6=GE5rmvo&9qEFDGF%4J!()Fv4+l8e23J3bUwuMoH`u(SBlE&;jH1^V16FXZ30LHUkxD_F;s4+KGN>-p~`t;U{A3n?Qb^ocW2 zPQ_cr64fWpa-0F@INeB^m#;*id+i;5{Z{(|@X^49D)e+U022DRj`Mqd0f8w*#j

    `WO}54G&kA{Z9~mmmHpJgD#%FnhoW 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%0Al*z$HGeN3@9j{~ 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ཕ_@~aPfG-eGhfS?WSR4jI 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 From 78d28cb789da87a025c2f1640ea45439fc99911b Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 9 Oct 2023 19:49:41 +0000 Subject: [PATCH 1040/1302] Remove /docs/ as its now in HH's repo --- CONTRIBUTING.md | 103 ++++++++- README.md | 21 +- docs/configuration.md | 39 ---- docs/creating-modules-for-deployment.md | 285 ------------------------ docs/design.md | 244 -------------------- docs/distributable-deployments.md | 132 ----------- docs/explanation.md | 100 --------- docs/getting-started-guide.md | 188 ---------------- docs/images/visualize-1.png | Bin 135968 -> 0 bytes docs/images/visualize-2.png | Bin 34127 -> 0 bytes docs/manual.md | 63 ------ docs/publish.md | 34 --- docs/running-a-deployment.md | 137 ------------ docs/using-ignition-in-hardhat-tests.md | 39 ---- package.json | 4 +- packages/hardhat-plugin/README.md | 2 +- 16 files changed, 103 insertions(+), 1288 deletions(-) delete mode 100644 docs/configuration.md delete mode 100644 docs/creating-modules-for-deployment.md delete mode 100644 docs/design.md delete mode 100644 docs/distributable-deployments.md delete mode 100644 docs/explanation.md delete mode 100644 docs/getting-started-guide.md delete mode 100644 docs/images/visualize-1.png delete mode 100644 docs/images/visualize-2.png delete mode 100644 docs/manual.md delete mode 100644 docs/publish.md delete mode 100644 docs/running-a-deployment.md delete mode 100644 docs/using-ignition-in-hardhat-tests.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 86e34c36cf..70e7dbaac6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,12 +15,6 @@ There are two packages: - [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments - [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library -## Design - -An overview of the [design of the deploy process is explained here](./docs/design.md). - -An outline of our plans for [distributable deployments is here](./docs/distributable-deployments.md) - ## Setup Ignition is a `typescript` project managed by `npm`. @@ -71,4 +65,99 @@ npm run clean ## Publish -To publish the **Ignition** packages to npm follow the [publishing instructions](./docs/publish.md). +To publish ignition: + +1. git fetch, Checkout out `development`, then ensure your branch is up to date `git pull --ff-only` +2. Perform a clean install and build (will lose all uncommitted changes) git clean -fdx ., npm install, npm run build +3. Run a full check, stopping on failure: `npm run fullcheck` +4. Confirm the commits represent the features for the release +5. Create a release branch `git checkout -b release/yyyy-mm-dd` +6. Update the `CHANGELOG.md` under `./packages/core`. +7. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. +8. Update the `CHANGELOG.md` under `./packages/ui`. +9. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` +10. Update the version of dependencies: + +- cores version in hardhat-ui deps +- cores and uis versions in hardhat-ignition devDeps and peerDeps +- examples version of hardhat-ignition + +11. Commit the version update `git commit`: + +``` +chore: bump version to vX.X.X + +Update the packages versions and changelogs for the `X.X.X - +yyyy-mm-dd` release. +``` + +12. Push the release branch and open a pull request on `main`, the PR description should match the changelogs +13. On a successful check, `rebase merge` the release branch into `main` +14. Switch to main branch and pull the latest changes +15. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +16. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui` and `@nomicfoundation/hardhat-ignition` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition` +17. Create a release on github off of the pushed tag + +## Manual testing + +> To knock off the rough edges + +### Tests + +--- + +#### **Try and deploy a module that doesn't exist** + +--- + +##### _Arrange_ + +Setup ignition in a new hardhat project based on the getting started guide. + +##### _Act_ + +Run a deploy with a module that doesn't exist + +##### _Assert_ + +Check that a sensible error message is displayed + +--- + +#### **Try and run a module with a validation error** + +--- + +##### _Arrange_ + +Setup ignition in a new hardhat project based on the getting started guide. + +Tweak the module so that it has a problem that will be caught by validation (ADD_MORE_DETAILS_HERE). + +##### _Act_ + +Run a deploy with a invalid module + +##### _Assert_ + +Check that a sensible error message is displayed + +--- + +#### **Deploy to Sepolia testnet** + +--- + +##### _Arrange_ + +Ensure you have an infura/alchemy RPC endpoint set up for Sepolia as well as an ETH address with Sepolia ETH that you don't mind pasting the privkey in plaintext for. I used metamask + +Setup the network settings in the `hardhat.config.js` of the example you want to test + +##### _Act_ + +Run a deploy/test from the example directory you set up + +##### _Assert_ + +Check that deployment was successful, or results match expected (for instance, on-hold for multisig) diff --git a/README.md b/README.md index f506037db5..4194fd790c 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,11 @@ # Hardhat Ignition -> **WARNING**: This repository is **highly experimental**, and is under **active development**. Any code or binaries produced from this project **should not be used in any production or critical workloads**. The API is preliminary, **the API will change**. - Hardhat Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. -Join our [Hardhat Support Discord server](https://hardhat.org/discord) to stay up to date on new releases, plugins and tutorials. +Join our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases, plugins and tutorials. ## Installation @@ -30,22 +28,11 @@ import "@nomicfoundation/hardhat-ignition"; ## Getting Started -See our [Getting started guide](./docs/getting-started-guide.md) for a worked example of **Hardhat Ignition usage**. +See our [Getting started guide](https://hardhat.org/hardhat-ignition/getting-started) for a worked example of **Hardhat Ignition usage**. ## Documentation -- [Getting started](./docs/getting-started-guide.md) -- [Explanation](./docs/explanation.md) -- [Creating Modules for Deployments](./docs/creating-modules-for-deployment.md) - - [Deploying a Contract](./docs/creating-modules-for-deployment.md#deploying-a-contract) - - [Calling contract methods](./docs/creating-modules-for-deployment.md#calling-contract-methods) - - [Network Accounts Management](./docs/creating-modules-for-deployment.md#network-accounts-management) - - [Including modules within modules](./docs/creating-modules-for-deployment.md#including-modules-within-modules) - - [Module Parameters](./docs/creating-modules-for-deployment.md#module-parameters) -- [Using Hardhat Ignition in _Hardhat_ tests](./docs/using-ignition-in-hardhat-tests.md) -- [Running a deployment](./docs/running-a-deployment.md) - - [Visualizing your deployment with the `visualize` task](./docs/running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) - - [Executing the deployment](./docs/running-a-deployment.md#executing-the-deployment) +To learn more about Hardhat Ignition, please visit [our website](https://hardhat.org/hardhat-ignition). ### Examples @@ -63,6 +50,6 @@ Go to [CONTRIBUTING.md](./CONTRIBUTING.md) to learn about how to set up Hardhat ## Feedback, help and news -[Hardhat Support Discord server](https://hardhat.org/discord): for questions and feedback. +[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. [Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index cf44696fef..0000000000 --- a/docs/configuration.md +++ /dev/null @@ -1,39 +0,0 @@ -[going to leave this doc for future reference since some things need to be circled back to] - -Config options: - -Global config: - -- maxRetries: number -- gasPriceIncrementPerRetry: BigNumber - - Increments gasPrice if legacy tx - - Increments maxPriorityFeePerGas otherwise - - ** proposal ** currently incrementing maxFeePerGas as well, but maybe should remove that. - - ?? Can we even send London style tx’s currently? -- gasLimit: BigNumber -- gasPrice: BigNumber -- OR -- maxFeePerGas: BigNumber -- maxPriorityFeePerGas: BigNumber -- - -- interactive: boolean - - Allows user to confirm each tx before it’s sent - - Probably a later feature -- noCompile: boolean - - Allow user to deploy without running compilation task first? -- ui: boolean - - Allow user to deploy without the cli ui? - - If we add this, we still need to add cli output of the new addresses -- Freeze: boolean - - Lets user “freeze” a deployed module according to resumability rules (see resumability doc - much still TBD) - - Requires journaling - -Per-tx config: - -- gasLimit: BigNumber -- gasPrice: BigNumber -- OR -- maxFeePerGas: BigNumber -- maxPriorityFeePerGas: BigNumber -- ** should not be able to mix and match legacy and London tx fields ** -- ** per-tx config takes precedence if given ** diff --git a/docs/creating-modules-for-deployment.md b/docs/creating-modules-for-deployment.md deleted file mode 100644 index 9f14b92134..0000000000 --- a/docs/creating-modules-for-deployment.md +++ /dev/null @@ -1,285 +0,0 @@ -# Creating Modules for Deployments - ---- - -### Table of Contents - -- Creating Modules for Deployments -- [Deploying a Contract](./creating-modules-for-deployment.md#deploying-a-contract) - - [Constructor arguments](./creating-modules-for-deployment.md#constructor-arguments) - - [Adding an endowment of _Eth_](./creating-modules-for-deployment.md#adding-an-endowment-of-eth) - - [Dependencies between contracts](./creating-modules-for-deployment.md#dependencies-between-contracts) - - [Retrieving an artifact](./creating-modules-for-deployment.md#retrieving-an-artifact) - - [Deploying from an artifact](./creating-modules-for-deployment.md#deploying-from-an-artifact) - - [Using an existing contract](./creating-modules-for-deployment.md#using-an-existing-contract) - - [Linking libraries](./creating-modules-for-deployment.md#linking-libraries) -- [Calling contract methods](./creating-modules-for-deployment.md#calling-contract-methods) - - [Transferring _Eth_ as part of a call](./creating-modules-for-deployment.md#transferring-eth-as-part-of-a-call) - - [Transferring _Eth_ outside of a call](./creating-modules-for-deployment.md#transferring-eth-outside-of-a-call) - - [Using the results of statically calling a contract method](./creating-modules-for-deployment.md#using-the-results-of-statically-calling-a-contract-method) - - [Waiting for on-chain events](./creating-modules-for-deployment.md#waiting-for-on-chain-events) -- [Network Accounts Management](./creating-modules-for-deployment.md#network-accounts-management) -- [Including modules within modules](./creating-modules-for-deployment.md#including-modules-within-modules) -- [Module Parameters](./creating-modules-for-deployment.md#module-parameters) - ---- - -An **Ignition** deployment is composed of modules. A module is a special javascript/typescript function that encapsulates several on-chain transactions (e.g. deploy a contract, invoke a contract function etc). - -For example, this is a minimal module `MyModule` that deploys an instance of a `Token` contract and exposes it to any consumer of `MyModule`: - -```javascript -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); - -module.exports = buildModule("MyModule", (m) => { - const token = m.contract("Token"); - - return { token }; -}); -``` - -Modules can be deployed directly at the cli (with `npx hardhat ignition deploy MyModule.js`), within Hardhat mocha tests (see [Ignition in Tests](./using-ignition-in-hardhat-tests.md)) or consumed by other Modules to allow for complex deployments. - -During a deployment, **Ignition** uses the module to generate an execution plan of the transactions to run and the order in which to run them based on their dependencies. A module uses the injected `DeploymentBuilder` to specify the on-chain transactions that will _eventually_ be run, and how they interdepend on each other. - -## Deploying a contract - -Ignition is aware of the contracts within the `./contracts` **Hardhat** folder. Ignition can deploy any compilable local contract by name: - -```tsx -const token = m.contract("Token"); -``` - -`token` here is called a **contract future**. It represents the contract that will _eventually_ be deployed. - -### Constructor arguments - -In **Solidity** contracts may have constructor arguments that need satisfied on deployment. This can be done by passing an `args` array as the second parameter: - -```tsx -const token = m.contract("Token", ["My Token", "TKN", 18]); -``` - -### Adding an endowment of _Eth_ - -The deployed contract can be given an endowment of _Eth_ by passing the value of the endowment under the options object: - -```tsx -const token = m.contract("Token", [], { - value: BigInt(ethers.utils.parseUnits("1").toString()), -}); -``` - -### Dependencies between contracts - -If a contract needs the address of another contract as a constructor argument, the contract future can be used: - -```tsx -const a = m.contract("A"); -const b = m.contract("B", [a]); -``` - -You can think of this as `b` being the equivalent of a promise of an address, although **_futures are not promises_**. - -If a contract does not directly depend through arguments on another contract, a dependency (don't deploy `b` until `a` is successfully deployed) can still be created using the `after` array of options: - -```tsx -const a = m.contract("A"); -const b = m.contract("B", [], { - after: [a], -}); -``` - -### Deploying from an artifact - -To allow you to use your own mechanism for getting the contract artifact, `contract` supports passing an `Artifact` as the second parameter: - -```javascript -const artifact = hre.artifacts.readArtifactSync("Foo"); - -const userModule = buildModule("MyModule", (m) => { - m.contract("Foo", artifact, [0]); -}); -``` - -### Using an existing contract - -A user might need to execute a method in a contract that wasn't deployed by Ignition. An existing contract can be leveraged by passing an address and artifact: - -```tsx -const uniswap = m.contractAt("UniswapRouter", "0x0...", artifact); - -m.call(uniswap, "swap", [ - /*...*/ -]); -``` - -### Linking libraries - -A library can be deployed and linked to a contract by passing the libraries contract future as a named entry under the libraries option: - -```tsx -const safeMath = m.library("SafeMath"); -const contract = m.contract("Contract", [], { - libraries: { - SafeMath: safeMath, - }, -}); -``` - -A library is deployed in the same way as a contract. - -## Calling contract methods - -Not all contract configuration happens via the constructor. To configure a contract through a call to a contract method: - -```tsx -const token = m.contract("Token"); -const exchange = m.contract("Exchange"); - -m.call(exchange, "addToken", [token]); -``` - -### Transferring _Eth_ as part of a call - -Similar to `ethers`, a call can transfer `Eth` by passing a `value` under the options: - -```tsx -m.call(exchange, "deposit", [], { - value: BigInt(ethers.utils.parseUnits("1").toString()), -}); -``` - -### Transferring _Eth_ outside of a call - -It's also possible to transfer `Eth` to a given address via a regular Ethereum transaction: - -```tsx -m.sendETH(exchange, { - value: ethers.utils.parseUnits("1"), -}); -``` - -### Using the results of statically calling a contract method - -A contract might need the result of some other contract method as an input: - -```tsx -const token = m.contract("Token"); -const totalSupply = m.staticCall(token, "totalSupply"); - -const someContract = m.contract("ContractName", [totalSupply]); -``` - -In this example, `totalSupply` is called a **deferred value**. Similar to how a contract future is a contract that will eventually be deployed, a deferred value is some value that will eventually be available. That means **you can't do this**: - -```tsx -if (totalSupply > 0) { - ... -} -``` - -Because `totalSupply` is not a number, it is a future. - -## Waiting for on-chain events - -A deployment can be put `on-hold` until an on-chain event has been emitted (for instance a timelock or multisig approval): - -```tsx -const multisig = m.contract("Multisig", []); - -const call = m.call(multisig, "authorize"); - -const authorizerEventArg = m.readEventArgument( - call, - "AuthorizedBy", // Event name - "Authorizer" // Event arg name -); - -m.call(multisig, "execute", [authorizerEventArg]); -``` - -The `event` during deployment will check whether an event matching the given filter args has been emitted. If it has, the deployment will continue, if not the deployment will pause and listen for the event for a [configurable](./running-a-deployment.md#configuration-options) period of time. If the event has not been detected within this listening period, the deployment stops in the `on-hold` condition. A further run of the deployment will recheck the `event` condition. - -Upon execution, the `EventFuture` will be resolved to the values of the requested parameter emitted by the given event. You can then use that value in tests or other modules as expected. - -## Network Accounts Management - -All accounts configured for the current network can be accessed from within an **Ignition** module via `m.getAccount(index)`: - -```tsx -module.exports = buildModule("Multisig", (m) => { - const owner = m.getAccount(0); -}); -``` - -You can then use these addresses anywhere you normally would, such as constructor or function args. Additionally, you can pass them as a value to the `from` option in order to specify which account you would like a specific transaction sent from: - -```tsx -module.exports = buildModule("Multisig", (m) => { - const owner = m.getAccount(0); - const alsoAnOwner = m.getAccount(1); - const notAnOwner = m.getAccount(2); - - const multisig = m.contract("Multisig", [owner, alsoAnOwner], { - from: owner, - }); - - const value = BigInt(ethers.utils.parseUnits("100").toString()); - const fund = m.send("fund", multisig, value, undefined, { from: notAnOwner }); - - const call = m.call(multisig, "authorize", [], { from: alsoAnOwner }); -}); -``` - -Note that if `from` is not provided, **Ignition** will default to sending transactions using the first configured account (`accounts[0]`). - -## Including modules within modules - -Modules can be deployed and consumed within other modules via `m.useModule(...)`: - -```tsx -module.exports = buildModule("`TEST` registrar", (m) => { - // ... - - const { ens, resolver, reverseRegistrar } = m.useModule(setupENSRegistry); - - // Setup registrar - const registrar = m.contract("FIFSRegistrar", [ens, tldHash]); - - // ... - - return { ens, resolver, registrar, reverseRegistrar }; -}); -``` - -Calls to `useModule` memoize the results object. - -Only contract or library types can be returned when building a module. - -## Module parameters - -Modules can have parameters that are accessed using the `DeploymentBuilder` object: - -```tsx -const symbol = m.getParameter("tokenSymbol"); -const name = m.getParameter("tokenName"); - -const token = m.contract("Token", { - args: [symbol, name, 1_000_000], -}); -``` - -When a module is deployed, the proper parameters must be provided. If they are not available, the deployment won't be executed and will error. - -You can use optional params by providing default values: - -```tsx -const symbol = m.getParameter("tokenSymbol", "TKN"); -``` - ---- - -Next, let's take a look at using an **Ignition** module within _Hardhat_ tests: - -[Using Ignition in _Hardhat_ tests](./using-ignition-in-hardhat-tests.md) diff --git a/docs/design.md b/docs/design.md deleted file mode 100644 index 3eac54b942..0000000000 --- a/docs/design.md +++ /dev/null @@ -1,244 +0,0 @@ -# Design - -## Overview - -Ignition allows users to describe complex deployments and execute them on-chain. - -```mermaid -flowchart LR - 0[User Module] - subgraph Ignition - 1[Build Deployment Graph] - 2[Validate Deployment Graph] - 3[Transform to Execution Graph] - 4[Execute] - end - 0 --> 1 - 1 --> 2 - 2 --> 3 - 3 --> 4 -``` - -Ignition expresses a deployment as a dependency graph of on-chain transactions, that is, contract deployments and contract calls. Deployments and calls can be dependent on each other. A call to a contract requires that that contract first be deployed; the call should not be invoked until the contract deploy has completed entirely and successfully. - -Ignition provides the **deployment api** (a js based dsl) so users can succinctly describe a dependency graph of contract deploys and calls. - -To deploy on-chain Ignition takes a `Module` specified via the **deployment api** and constructs the `ExecutionGraph` (the dependency graph of on-chain transactions). The final generation of the `ExecutionGraph` is a multi-step process of construction, validation and simplification that leverages a temporary intermediary representation (the `DeploymentGraph`). - -The `ExecutionGraph` is passed to the execution engine which submits the transactions on-chain, ordering them and batching them based on the dependency constraints of the `ExecutionGraph`. - -## Building an `ExecutionGraph` from a Module - -The user describes the dependency graph as a `Module`, a utility function that takes a graph builder as its first argument. The user can express the on-chain transactions and their dependencies by calls on the graph builder. - -```javascript -const subgraph = buildSubgraph("Subgraph", (m) => { - const f = m.contract("F"); - - m.call(f, "G"); - - return { f }; -}); - -module.exports = buildModule("Example", (m) => { - const a = m.contract("A"); - - const bCall = m.call(a, "B"); - - m.call(a, "E", { - after: [bCall], - }); - - const { subgraph: sub } = m.useSubgraph(subgraph, { - after: [a], - }); - - m.call(a, "D", { - after: [sub], - }); - - m.contract("C", { - after: [sub], - }); - - return { a }; -}); -``` - -Ignition uses the `Module` to construct a `DeploymentGraph`. The `DeploymentGraph` matches closely with the high level **api** and contains constructs that are **Hardhat** specific (i.e. "Deploy the 'A' Hardhat contract"). - -```mermaid -flowchart BT - A:::contract - B(B):::ccall - C:::contract - D(D):::ccall - E(E):::ccall - - subgraph sub - direction RL - F:::contract - G(G):::ccall - G -->|calls| F - end - - B -- calls --> A - sub -.->|after| A - D -.->|after| sub - C -.->|after| sub - E -->|after| B - D -->|calls| A - E -->|calls| A - - classDef contract fill:#7eb0d5,stroke:darkgray; - classDef ccall fill:#b2e061,stroke:darkgray; -``` - -During construction of the `DeploymentGraph`, subgraphs are collapsed down to a single level. A vertex that depends on subgraph, is altered to depend on all the vertexes of a subgraph. Similarly the vertexes of a subgraph are altered to depend on all the dependencies of that subgraph. - -```mermaid -flowchart BT - A:::contract - B(B):::ccall - C:::contract - D(D):::ccall - E(E):::ccall - F:::contract - G(G):::ccall - - B -- calls --> A - F -->|after| A - G -->|after| A - G -->|calls| F - D -->|after| F - D -->|after| G - C -->|after| F - C -->|after| G - - E -->|after| B - D -->|calls| A - E -->|calls| A - - classDef contract fill:#7eb0d5,stroke:darkgray; - classDef ccall fill:#b2e061,stroke:darkgray; -``` - -This `DeploymentGraph` is validated (i.e. are all named hardhat contracts within the hardhat project; do all the calls have the right number of arguments etc). The validation attempts to ensure the `DeploymentGraph` can be transformed into an `ExecutionGraph` without error and to reduce the chance of an on-chain errors during execution. Validation checks do not take into account on-chain state, only enforcing that the deployment makes sense internally. - -A valid `DeploymentGraph` is then reduced to remove unnecessary edges (**NOTE: currently only a partial reduction, to remove subgraph virtual nodes**). - -```mermaid -flowchart BT - A:::contract - B(B):::ccall - C:::contract - D(D):::ccall - E(E):::ccall - F:::contract - G(G):::ccall - - B -- calls --> A - F -->|after| A - G -->|calls| F - D -->|after| G - C -->|after| G - E -->|after| B - - - classDef contract fill:#7eb0d5,stroke:darkgray; - classDef ccall fill:#b2e061,stroke:darkgray; -``` - -The reduced `DeploymentGraph` will contain lots of **Hardhat** specific references. Ignition transforms the `DeploymentGraph` into an `ExecutionGraph` that is designed for use by the execution engine without any reference to **Hardhat**. The edge structure is copied across but each **Hardhat** specific vertex (an on-chain transaction) is translated into an agnostic equivalent. For instance, a deploy hardhat contract `Foo` instruction, will be transformed by reading the **Hardhat** artifact for `Foo` and passing along an agnostic `Deploy this artifact` instruction. - -Validated, simplified and converted to the agnostic `ExecutionGraph` representation, the execution engine can now run the deployment. - -## Execution - -The execution engine is responsible for submitting transactions to the blockchain. It takes the `ExecutionGraph` as input and uses the vertexes to determine which transactions should be sent, and uses the edges to determine how the transactions are ordered and batched. - -More than one transaction can be submitted to the Ethereum chain at once. A **dependency** in this context means that the previous transaction must have completed successfully on chain before the dependent transaction can be submitted. - -To simplify user reasoning about the order of execution, the execution engine groups into batches. A batch is the next set of transactions to submit. Batches are submitted until there is an error or all transactions are complete. - -```javascript -let unstarted = getVertexesFrom(executionGraph); -let onHold = []; -let errors = []; -let completed = []; - -let buildBatch = (unstarted, completed) => - unstarted.filter((v) => - allDependenciesCompleted(v, executionGraph, completed) - ); - -while (unstarted.length > 0) { - const batch = buildBatch(unstarted.concat(onHold), completed); - - const { - errors: batchErrors, - completed: batchCompleted, - onhold: batchOnhold, - } = await executeBatch(batch); - - onHold = batchOnHold; - removeFrom(unstarted, batchCompleted); - addTo(completed, batchCompleted); - - addTo(errors, batchErrors); - if (errors.length > 0) { - break; - } -} -``` - -A batch is constructed by looking at all unstarted or on-hold vertexes and using the `ExecutionGraph` to determine if all their dependencies have been met (executed successfully). - -The execution engine will wait until all the transactions in a batch have completed or failed or been designated on-hold or timed out. Once the batch is complete, either the deployment finishes as complete because all transactions are complete, as error because there was an error, as on-hold because there was an on-hold result but no errors or timeouts. - -A policy governs how to deal with timed-out transactions. By default if a timed-out transaction fails to complete `x` times (once per batch) it becomes a failure. - -Either the entire graph of transactions will eventually succeed, in which case the deployment was a success. Or a transaction will fail or be stopped from completing, leading to a failed deployment. - -It follows from this that different runs of the same deployment (`ExecutionGraph`) may lead to different batchings. But assuming each transaction completes on the first attempt, the example above would give a batching like the following: - -```mermaid -flowchart BT - A:::contract - B(B):::ccall - C:::contract - D(D):::ccall - E(E):::ccall - F:::contract - G(G):::ccall - - B -- calls --> A - F -->|after| A - G -->|calls| F - D -->|after| G - C -->|after| G - E -->|after| B - - subgraph batch1 - A - end - - subgraph batch2 - B - F - end - - subgraph batch3 - E - G - end - - subgraph batch4 - D - C - end - - - classDef contract fill:#7eb0d5,stroke:darkgray; - classDef ccall fill:#b2e061,stroke:darkgray; -``` diff --git a/docs/distributable-deployments.md b/docs/distributable-deployments.md deleted file mode 100644 index d1577235b2..0000000000 --- a/docs/distributable-deployments.md +++ /dev/null @@ -1,132 +0,0 @@ -# Distributable Deployments - -Ignition is intended to allow packaging and distribution of deployment logic. The goal is: - -- the composing of deployment logic to create complex systems -- to allow the distribution of complex contract systems for local testing -- to allow third parties to easily use your deployed contracts and accompanying deployment logic in their own deployment -- multi-targeting of different chains -- deployments should be verifiable -- Deployed contracts should be usable with frontend development frameworks through typescript types - -A verifiable deployment is one where: - -- every internal contract deploy can show the providence of the underlying bytecode back to the source code and constructor args -- every used or depended on external contract is known and has providence -- the external contract code used in the internal contract code matches the code in the external contracts providence - -Demonstrating the providence of bytecode (whether deployed or ready to deploy) means reproducing the bytecode from source with the correct solc version (and build?), solc settings, library references and contract name. If deployed on-chain, the constructor args will be needed as well. - -## Current status - -Ignition allows for the definition of deployment logic through a javascript dsl api. A single unit of deployment logic is a Module. A user can compose modules together to build more complex modules. There is no mechanism for distributing Modules or the artifacts (bytecode + metadata + abi) that they use. - -## Proposal - -Have ignition modules generate a `Deployment artifact`, which will consist of: - -- the chain the deployment is against -- contract artifacts - code + solc version + solc settings + library references + contract name = reproducible bytecode + abi -- registry - key/value pairs where the human readable name (i.e. "uniswap/SwapRouter") points to one of the reproducible contract artifacts -- execution graph - the Ignition execution graph but changed from the current implementation so that vertexes contain not the bytecode + abi but a name that can be resolved through the registry -- module parameters - config settings (not sure on this one - maybe they are integrated into the execution graph) - -Ignition can verify the `Deployment artifact` by checking that the bytecode and abi of each contract has providence. The check that the compiled code uses the external contracts code will be done by hardhat during compile. - -Ignition can deploy the `Deployment artifact` and generates a `Deployment Result` as it progresses, this consists of: - -- the journal - giving a log of the deployment execution -- the deployed contracts list - the address and pointer to the contract artifact of successful deploys -- typing information to make the contracts usable in frontend development - -The module api will be modified to support checking registered deployed contract lists, to enable: - -```js -buildModule((m) => { - if (m.alreadyDeployed("uniswap/SwapRouter")) { - return m.contractAt("uniswap/SwapRouter"); - } else { - // ... lots of steps - } -}); -``` - -With the above in place we can distribute a deployment (via npm or some other mechanism): - -- contract artifacts -- deployed contract list -- js module function(s) - a default setup of the system, and optional setups for specific test scenarios - -A consumer of the distributable deployment will: - -- register the contract artifacts + deployed contract lists with ignition under hardhat.config -- use exported js module functions in their own js module -- import deployed solidity code via nifty custom import resolution i.e. `import { instance as uniswapRouter } from "ignition://uniswap/SwapRouter";` - -### Deployment artifact - -```mermaid -graph LR - subgraph Deployment Artifact - - subgraph AA[Contract A artifacts] - subgraph input[Solc inputs] - direction LR - - cont[contract name] - solidity[solidity files] - end - subgraph output[Solc outputs] - abi - bytecode - end - end - - subgraph BB[Contract B artifacts] - subgraph inputB[Solc inputs] - contb[contract name] - solidityb[solidity files] - end - subgraph outputB[Solc outputs] - abib[abi] - bytecodeb[bytecode] - end - end - - subgraph registry[Registry] - direction LR - A[Contract A] --> AA - B[Contract B] --> BB - end - - subgraph E[Execution Graph] - direction TB - - deployA{Deploy A} --> deployB{Deploy B} - - deployA -.-> A - deployB -.-> B - end - - end -``` - -## NPM package - -We may look at other distribution mechanisms but we want to support distribution via npm as a baseline. We should define a good default package layout to support turning a hh project into a distributable deployment of both code artifacts and deployment logic. - -## Development flow - -- Setup your contracts - - Install any contracts you leverage by adding a package via npm - - Register the external systems in the ignition registry via hardhat config - - write an ignition module for that leverages the imported (via npm) external systems ignition js module, include your own contract deploys in this ignition module - - write hh tests using ignition to setup the external contracts and your own contracts on the hh node -- Deploy your contracts - - use ignition to generate an ignition deployment artifact (including all the data required to deploy/verify/setup in tests your system) - - run the deployment on each chain you are deploying to - - rerun on failures - - recreate the deployment artifact if needed. - - commit your successfully deployed contract list and the deployment artifact to the repo -- Distribute your contracts - - push the repo to npm including the deployment artifact and the deployment result's deployed contract list diff --git a/docs/explanation.md b/docs/explanation.md deleted file mode 100644 index fe5918dcd4..0000000000 --- a/docs/explanation.md +++ /dev/null @@ -1,100 +0,0 @@ -# Explanation - -> This document explains what Ignition is, what it is used for, and the building blocks that make it up. - -Ignition is an infrastructure-as-code system to both deploy and distribute smart contract systems. - -When working with Ignition you define how your smart contracts should be deployed, and let it be in charge of the execution. This means that Ignition will be responsible for sending your transactions, managing gas, handling errors and restarts, and other situations that can appear when deploying a complex system. - -Ignition can be used to deploy a complex smart contract system and will support the deployment with: planning tools, visualisations of the running deployment and the capability to restart partial or failed deployments. - -Specifying a deployment through Ignition provides the option to leverage that specification in Hardhat tests, simplifying test setup. It is a goal of Ignition to enable the distribution of Ignition deployments to allow Solidity developers to quickly create in their tests complex on-chain scenarios (e.g. testing your contract's interaction with [Maker during an emergency shutdown](https://docs.makerdao.com/smart-contract-modules/shutdown)), that are not possible through forking tests. - -> NOTE: This initial release focuses on deploying your local contracts, and not on distributing them. Deployment distribution is not part of this initial prototype. - -## Understanding the Module API - -Ignition achieves a separation of _what is to be deployed_ from _how it will be deployed_ through a `Future`-orientated declarative api called the **Module API**. In contrast to the procedural approach used in most deployment scripts, a declarative API allows Ignition to statically analyse a deployment without running it. That analysis supports: improved validation, resuming partial deployments and efficient grouping and processing of transactions. - -### What is a Module? - -Deployments in Ignition are organized by modules. A module is a set of related smart contracts to be deployed and potentially some contract calls that need to be run on them (e.g. calling an `initialize()` function). - -A module is built by calling the `buildModule` function and passing it a unique name and a callback, the `moduleDefinition`. A common pattern is building one module per file and exporting it. - -```tsx -module.exports = buildModule("CounterModule", (m) => { - const initialCounterValue = 123; - - const counter = m.contract("Counter", [initialCounterValue]); - - return { counter }; -}); -``` - -The `moduleDefinition` callback receives a `moduleBuilder` object, which is used to define the different on-chain `Action`s that are needed to complete the deployment of the module, and returns the contracts it wants to export. - -`moduleBuilder` methods don’t execute any `Action`, they record the intent and its relationship to other `Actions` and return a `Future` that represents the eventual result of its execution. - -In the above example, when we call `m.contract`, we create a contract deployment `Action`, and get a `Future` that represents its eventual result, the address the contract is deployed to. - -`Actions` can depend on other `Action`'s results. We do this by using an `Action`'s `Future` as an argument to a subsequent `moduleBuilder` method. For example, here we define two `Actions`. One that deploys a contract, and another one that initializes it. - -```tsx -module.exports = buildModule("ContractWithInitModule", (m) => { - const c = m.contract("ContractWithInitModule"); - - m.call(c, "init", [123]); - - return { c }; -}); -``` - -You can create complex graphs of `Actions` like this. - -## How modules get executed - -Deploying a module goes through several stages: - -```mermaid -flowchart LR - 0[Module] - subgraph Ignition - 1[Validate Module] - 2[Build Action Graph] - 3[Execute] - end - 0 --> 1 - 1 --> 2 - 2 --> 3 -``` - -Ignition first runs validation checks on the module to increase the likelyhood that it will execute on-chain (e.g. that all contract calls match methods available on the contracts abi). - -A valid module is then analysed to build a graph of `Actions` to be executed. Tracing the flow of `Futures` between `Actions` in the module, allows Ignition to understand each `Action`'s dependencies, which in turn will control the order of execution. - -The graph of `Actions` is then run by Ignition's execution engine, which proceeds through the dependencies of the graph, batching those `Actions` whose dependencies have successfully completed. `Actions` in a batch are run in parallel. - -Most actions get executed by submitting a transaction; though not every action results in a transaction. An action may lead to the submission of multiple transactions because of errors or gas management. The retrying of transactions is handled by the Ignition execution engine and is transparent to the user. - -Executing an Action successfully _resolves_ its associated `Future`. Because an action is not run until all its dependencies have completed, any `Futures` it depends upon will have been resolved to an appropriate value (e.g. the address of a newly deployed contract) before it is run. - -The execution is complete when all actions have been run successfully. - -### Handling errors and restarting - -Ignition keeps a journal of the execution. When a deployment fails, you can rerun the deployment. Ignition will rebuild the previous state based on the journal, and will retry the failed transaction and proceed from there. Previous successful `Actions` will not be resubmitted. - -The Module API allows for waiting on an Ethereum `Event`, in this case the deployment will halt as _on hold_ if the `Event` has not occurred. Rerunning the Module will restart from the `Event` check. - -### Modifying your Modules between deployments (TBD) - -You can modify your deployments between Ignition runs, for instance, when dealing with errors. This allows you to incrementally grow your system. - -Ignition will reconcile your modified Module with the `Actions` that are recorded in the journal from previous runs. If it determines that an `Action` has already been run, then it will not be rerun. If the Module has diverged too far for Ignition to safely make an assessment of whether an `Action` has been previously run, then it will alert the user. - -The tracking and reconciling of `Actions` in previous runs is done automatically, but you can identify an `Action` explicity with an `id` to eliminate ambiguity. - -Next, dig deeper into defining modules: - -[Creating modules for deployment](./creating-modules-for-deployment.md) diff --git a/docs/getting-started-guide.md b/docs/getting-started-guide.md deleted file mode 100644 index 1d80ca8c24..0000000000 --- a/docs/getting-started-guide.md +++ /dev/null @@ -1,188 +0,0 @@ -# Getting Started - ---- - -### Table of Contents - -- [Setup](./getting-started-guide.md#setup) -- [Writing your first deployment module](./getting-started-guide.md#writing-your-first-deployment-module) -- [Deploying the module](./getting-started-guide.md#deploying-the-module) -- [Getting info about previous deployments](./getting-started-guide.md#getting-info-about-previous-deployments) -- [Using the module within **Hardhat** tests](./getting-started-guide.md#using-the-module-within-hardhat-tests) - ---- - -## Setup - -This guide assumes you are starting with the Hardhat Javascript project as covered in -the [Hardhat quick start](https://hardhat.org/hardhat-runner/docs/getting-started#quick-start). - -```shell -$ npx hardhat -888 888 888 888 888 -888 888 888 888 888 -888 888 888 888 888 -8888888888 8888b. 888d888 .d88888 88888b. 8888b. 888888 -888 888 "88b 888P" d88" 888 888 "88b "88b 888 -888 888 .d888888 888 888 888 888 888 .d888888 888 -888 888 888 888 888 Y88b 888 888 888 888 888 Y88b. -888 888 "Y888888 888 "Y88888 888 888 "Y888888 "Y888 - -👷 Welcome to Hardhat v2.17.0 👷‍ - -? What do you want to do? … -❯ Create a JavaScript project - Create a TypeScript project - Create an empty hardhat.config.js - Quit -``` - -Add **Ignition** to your **Hardhat** project by installing the plugin: - -```bash -npm install --save-dev @nomicfoundation/hardhat-ignition -``` - -Modify your `hardhat.config.js` file, to include **Ignition**: - -```javascript -require("@nomicfoundation/hardhat-toolbox"); -// ... -require("@nomicfoundation/hardhat-ignition"); -``` - -Create an `./ignition` folder in your project root, with a `modules` subfolder to contain your deployment modules. - -```bash -mkdir ./ignition -mkdir ./ignition/modules -``` - -## Writing Your First Deployment Module - -Add a deployment module under the `./ignition/modules` folder for the example `Lock.sol` contract: - -```js -// ./ignition/modules/LockModule.js -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); - -const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); -const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; -const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; - -const ONE_GWEI = BigInt(hre.ethers.parseUnits("1", "gwei")); - -module.exports = buildModule("LockModule", (m) => { - const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); - const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); - - const lock = m.contract("Lock", [unlockTime], { - value: lockedAmount, - }); - - return { lock }; -}); -``` - -### Deploying the Module - -Run the `deploy` task to test the module against an ephemeral **Hardhat** node (using the default `unlockTime`): - -```bash -npx hardhat ignition deploy LockModule -``` - -A file containing module parameters, indexed by the `ModuleId` used in `buildModule`, can be passed as a flag at -the command line: - -```json -// ignition/modules/LockModule.config.json -{ - "LockModule": { - "unlockTime": 4102491600 - } -} -``` - -```bash -npx hardhat ignition deploy --parameters ignition/modules/LockModule.config.json LockModule -``` - -To deploy against a specific network pass it on the command line, for instance to deploy against -a local **Hardhat** node: - -```bash -npx hardhat node -# in another terminal -npx hardhat ignition deploy LockModule --network localhost -``` - -Running against a non-ephemeral network will generate a `deployment` stored under `./ignition/deployments`. The -deployment identified by an `id` that can be passed at the command line: - -```bash -npx hardhat ignition deploy LockModule --network localhost --id dev-deploy -``` - -If no `id` is provided a default is generated based on the `chainId` e.g. _network-31337_ for the localhost -network. - -### Getting Info About Previous Deployments - -Run the `status` task to display info about your successfully deployed contracts within a deployment: - -```bash -npx hardhat ignition status --id dev-deploy -# Deployed Addresses -# ================== - -# LockModule:Lock 0x5FbDB2315678afecb367f032d93F642f64180aa3 -``` - -### Using the Module Within Hardhat Tests - -Ignition modules can be used in **Hardhat** tests to simplify test setup. In the Hardhat quick start guide -the `./test/Lock.js` test file can be leverage **Ignition** by updating the `deployOneYearLockFixture` fixture: - -```js -... -const { expect } = require("chai"); -const LockModule = require("../ignition/modules/LockModule"); - -... - - async function deployOneYearLockFixture() { - const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; - const ONE_GWEI = 1_000_000_000; - - const lockedAmount = BigInt(ONE_GWEI); - const unlockTime = (await time.latest()) + ONE_YEAR_IN_SECS; - - // Contracts are deployed using the first signer/account by default - const [owner, otherAccount] = await ethers.getSigners(); - - const { lock } = await ignition.deploy(LockModule, { - parameters: { - LockModule: { - unlockTime, - lockedAmount, - }, - }, - }); - - return { lock, unlockTime, lockedAmount, owner, otherAccount }; - } -``` - -The **Hardhat** test command will automatically include the `ignition` object within the scope of test files -when running tests: - -```sh -npx hardhat test -``` - ---- - -Next, get a better understanding of the motivations of **Ignition** and how it sets out to achieve them: - -[Explanation](./explanation.md) diff --git a/docs/images/visualize-1.png b/docs/images/visualize-1.png deleted file mode 100644 index 2b252ea46d9868d60d80c398454445503e9713e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135968 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 diff --git a/docs/manual.md b/docs/manual.md deleted file mode 100644 index ab80c2c35b..0000000000 --- a/docs/manual.md +++ /dev/null @@ -1,63 +0,0 @@ -# Manual Test Doc - -> To knock off the rough edges - -## Tests - ---- - -### **Try and deploy a module that doesn't exist** - ---- - -#### _Arrange_ - -Setup ignition in a new hardhat project based on the getting started guide. - -#### _Act_ - -Run a deploy with a module that doesn't exist - -#### _Assert_ - -Check that a sensible error message is displayed - ---- - -### **Try and run a module with a validation error** - ---- - -#### _Arrange_ - -Setup ignition in a new hardhat project based on the getting started guide. - -Tweak the module so that it has a problem that will be caught by validation (ADD_MORE_DETAILS_HERE). - -#### _Act_ - -Run a deploy with a invalid module - -#### _Assert_ - -Check that a sensible error message is displayed - ---- - -### **Deploy to Sepolia testnet** - ---- - -#### _Arrange_ - -Ensure you have an infura/alchemy RPC endpoint set up for Sepolia as well as an ETH address with Sepolia ETH that you don't mind pasting the privkey in plaintext for. I used metamask - -Setup the network settings in the `hardhat.config.js` of the example you want to test - -#### _Act_ - -Run a deploy/test from the example directory you set up - -#### _Assert_ - -Check that deployment was successful, or results match expected (for instance, on-hold for multisig) diff --git a/docs/publish.md b/docs/publish.md deleted file mode 100644 index e7814f35e8..0000000000 --- a/docs/publish.md +++ /dev/null @@ -1,34 +0,0 @@ -# Publish Ignition - -To publish ignition: - -1. git fetch, Checkout out `development`, then ensure your branch is up to date `git pull --ff-only` -2. Perform a clean install and build (will lose all uncommitted changes) git clean -fdx ., npm install, npm run build -3. Run a full check, stopping on failure: `npm run fullcheck` -4. Confirm the commits represent the features for the release -5. Create a release branch `git checkout -b release/yyyy-mm-dd` -6. Update the `CHANGELOG.md` under `./packages/core`. -7. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. -8. Update the `CHANGELOG.md` under `./packages/ui`. -9. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` -10. Update the version of dependencies: - -- cores version in hardhat-ui deps -- cores version in hardhat-ignition devDeps and peerDeps -- examples version of hardhat-ignition - -11. Commit the version update `git commit`: - -``` -chore: bump version to vX.X.X - -Update the packages versions and changelogs for the `X.X.X - -yyyy-mm-dd` release. -``` - -12. Push the release branch and open a pull request on `main`, the PR description should match the changelogs -13. On a successful check, `rebase merge` the release branch into `main` -14. Switch to main branch and pull the latest changes -15. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -16. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui` and `@nomicfoundation/hardhat-ignition` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition` -17. Create a release on github off of the pushed tag diff --git a/docs/running-a-deployment.md b/docs/running-a-deployment.md deleted file mode 100644 index 4288f15a75..0000000000 --- a/docs/running-a-deployment.md +++ /dev/null @@ -1,137 +0,0 @@ -# Running a deployment - ---- - -### Table of Contents - -- [Visualizing your deployment with the `visualize` task](./running-a-deployment.md#visualizing-your-deployment-with-the-visualize-task) -- [Executing the deployment](./running-a-deployment.md#executing-the-deployment) - - [Configuration options](./running-a-deployment.md#configuration-options) -- [Source control for deployments](./running-a-deployment.md#source-control-for-deployments) - - ---- - -Once you have built and tested your deployment module, it is time to deploy it! Start by making sure you understand exactly what will be executed on chain. - -## Visualizing your deployment with the `visualize` task - -**Ignition** adds a `visualize` task to the cli, that will generate a HTML report showing a _dry run_ of the deployment - the contract deploys and contract calls. - -The `visualize` task takes one argument, the module to visualize. For example, using the `ENS.js` module from our [ENS example project](../examples/ens/README.md): - -```bash -npx hardhat ignition visualize ENS -``` - -Running `visualize` will generate the report based on the given module (in this case `ENS.js`), it will then open the report in your system's default browser: - -![Main visualize output](images/visualize-1.png) - -The report summarises the contract that will be deployed and the contract calls that will be made. - -It shows the dependency graph as it will be executed by Ignition (where a dependency will not be run until all its dependents have successfully completed). - -If something in your deployment isn't behaving the way you expected, the `visualize` task can be an extremely helpful tool for debugging and verifying that your and **Ignition**'s understanding of the deployment are the same. - -## Executing the deployment - -Deploying a module is done using the **Ignition** deploy task: - -```sh -npx hardhat ignition deploy LockModule -``` - -Module parameters, indexed by `ModuleId`, can be passed as a `json` string to the `parameters` flag: - -```sh -npx hardhat ignition deploy --parameters "{\"LockModule\": {\"unlockTime\":4102491600,\"lockedAmount\":2000000000}}" LockModule.js -``` - -By default the deploy task will deploy to an ephemeral Hardhat network. To target a network from your Hardhat config, you can pass its name to the network flag: - -```sh -npx hardhat ignition deploy LockModule.js --network mainnet -``` - -### Configuration options - -There are configurable options you can add to your Hardhat config file to adjust the way **Ignition** runs the deployment: - -```tsx -export interface DeployConfig { - blockPollingInterval: number; - timeBeforeBumpingFees: number; - maxFeeBumps: number; - requiredConfirmations: number; -} -``` - -These can be set within Hardhat config under the `ignition` property: - -```tsx -const { ethers } = require("ethers"); - -module.exports = { - ignition: { - blockPollingInterval: 1_000, - timeBeforeBumpingFees: 3 * 60 * 1_000, - maxFeeBumps: 4, - requiredConfirmations: 5, - }, -}; -``` - ---- - -#### `blockPollingInterval` - -The value of `blockPollingInterval` is the time in milliseconds between checks that a new block has been minted. The default value is 1000 milliseconds (aka 1 second). - ---- - -#### `timeBeforeBumpingFees` - -The value of `timeBeforeBumpingFees` sets the time in milliseconds to wait for a transaction to be confirmed on-chain before bumping its fee. The default is 3mins. - ---- - -#### `maxFeeBumps` - -The value of `maxFeeBumps` determines the number of times the transaction will have its fee bumped before Ignition fails it as a timeout. The default is four. - ---- - -#### `requiredConfirmations` - -The value of `requiredConfirmations` is the number of blocks after a transaction has been confirmed to wait before Ignition will consider the transaction as complete. This provides control over block re-org risk. The default number of confirmations is five. - ---- - -## Source control for deployments - -Ignition creates several files when a deployment is run. You may want to commit some or all of these files to source control. - -While committing the entire `deployments` directory is the recommended approach, there are some reasons why you may want to commit only some of the files: namely, repo bloat. The `deployments` directory can grow quite large, especially if you are deploying to multiple networks. At the very least, you should commit the `deployed_addresses.json` file found within each deployment directory. This file contains the addresses of all contracts deployed by the module. - -You should make sure to store the rest of the files if you want to resume a deployment later. - -Future versions of Ignition will make the `deployments` file system structure lighter, and friendlier to versioning. - - diff --git a/docs/using-ignition-in-hardhat-tests.md b/docs/using-ignition-in-hardhat-tests.md deleted file mode 100644 index 8427eeaa16..0000000000 --- a/docs/using-ignition-in-hardhat-tests.md +++ /dev/null @@ -1,39 +0,0 @@ -# Using Ignition in _Hardhat_ tests - -**Ignition** can be used in **Hardhat** tests to simplify test setup, as **Ignition** modules can capture complex deployments of contract systems, which is a common problem when creating test fixtures. - -## The Ignition object - -Requiring **Ignition** within your `hardhat.config.{ts,js}` will automatically inject the `ignition` object as a global variable within **Hardhat** test files. - -The `ignition` object exposes a `deploy` method, that takes a Module as the first argument and an optional configuration object as the second argument. Module parameters can be passed under the `parameters` property of the options object, indexed by the `ModuleId`: - -```js -it("should allow setting the start count for new counters", async function () { - const CounterModule = buildModule("Counter", (m) => { - const startCount = m.getOptionalParam("startCount", 0); - - const counter = m.contract("Counter", { args: [startCount] }); - - return { counter }; - }); - - const { counter } = await ignition.deploy(CounterModule, { - parameters: { - Counter: { - startCount: 42, - }, - }, - }); - - assert.equal(await counter.count(), 42); -}); -``` - -The `ignition.deploy` method automatically converts any `ContractFuture`s returned from the passed module into `ether`'s contract objects, so they can be manipulated and invoked. - ---- - -Next learn how to run a deployment: - -[Running a deployment](./running-a-deployment.md) diff --git a/package.json b/package.json index 12fb772e0f..02d4dbd008 100644 --- a/package.json +++ b/package.json @@ -12,9 +12,9 @@ "scripts": { "build": "npm run build -w packages", "lint": "npm run lint --workspaces", - "postlint": "prettier --check *.{md,json} ./docs/*.md ./config/**/*.{js,json}", + "postlint": "prettier --check *.{md,json} ./config/**/*.{js,json}", "lint:fix": "npm run lint:fix --workspaces", - "postlint:fix": "prettier --write *.{md,json} ./docs/*.md ./config/**/*.{js,json}", + "postlint:fix": "prettier --write *.{md,json} ./config/**/*.{js,json}", "test": "npm run test -w packages && npm run test:integrations -w packages/core", "test:coverage": "npm run test:coverage -w packages", "test:examples": "npm run test -w examples --if-present", diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 0793fbe54f..0e7e2b0cd5 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -32,4 +32,4 @@ This plugin provides the `deploy` and `visualize` tasks. ## Usage -Please see the [getting started guide](../../docs/getting-started-guide.md) +Please see the [getting started guide](https://hardhat.org/hardhat-ignition) From 5d6fc7a4058ff6e7d13733833dd2ab68ea1897bd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 9 Oct 2023 17:58:07 -0400 Subject: [PATCH 1041/1302] fixed weird escaping in arguments list --- .../ui/src/utils/argumentTypeToString.tsx | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) diff --git a/packages/ui/src/utils/argumentTypeToString.tsx b/packages/ui/src/utils/argumentTypeToString.tsx index fbfb67fbba..215afdda27 100644 --- a/packages/ui/src/utils/argumentTypeToString.tsx +++ b/packages/ui/src/utils/argumentTypeToString.tsx @@ -6,33 +6,25 @@ import { } from "@nomicfoundation/ignition-core/ui-helpers"; export function argumentTypeToString(argument: ArgumentType): string { - return JSON.stringify( - argument, - (_key, value) => { - if (typeof value === "bigint") { - return ``; - } + if (typeof argument === "bigint") { + return ``; + } - if (isFuture(value)) { - return ``; - } + if (isFuture(argument)) { + return ``; + } - if (isRuntimeValue(value)) { - if (value.type === RuntimeValueType.ACCOUNT) { - return ``; - } + if (isRuntimeValue(argument)) { + if (argument.type === RuntimeValueType.ACCOUNT) { + return ``; + } - return ``; - } + return ``; + } - return value; - }, - 2 - ); + return JSON.stringify(argument, null, 2); } From fe9c8a8adff03bfd3207e617eb2ff1b7dbedcdb3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 10 Oct 2023 11:23:54 -0400 Subject: [PATCH 1042/1302] update nav URLs --- packages/ui/src/components/socials/index.tsx | 2 +- .../pages/visualization-overview/visualization-overview.tsx | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/ui/src/components/socials/index.tsx b/packages/ui/src/components/socials/index.tsx index 2dc9b6c7f8..07454b5e82 100644 --- a/packages/ui/src/components/socials/index.tsx +++ b/packages/ui/src/components/socials/index.tsx @@ -9,7 +9,7 @@ export enum SocialsEnum { } const SOCIALS_LINKS = { - [SocialsEnum.GITHUB]: "https://github.com/NomicFoundation/hardhat-ignition", + [SocialsEnum.GITHUB]: "https://hardhat.org/ignition", [SocialsEnum.TWITTER]: "https://twitter.com/HardhatHQ", [SocialsEnum.DISCORD]: "https://hardhat.org/ignition-discord", }; diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx index 4394b24ffe..9d4db679f7 100644 --- a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx +++ b/packages/ui/src/pages/visualization-overview/visualization-overview.tsx @@ -24,10 +24,7 @@ export const VisualizationOverview: React.FC<{ - + DOCUMENTATION From 361e2775cf8dc302518318ddbc2088b17fbc71a3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 10 Oct 2023 11:35:06 -0400 Subject: [PATCH 1043/1302] fix jumping to linked future that is already open --- .../components/execution-batches.tsx | 16 +++++++--------- .../components/future-batch.tsx | 12 ++++++------ 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx index 8f53b7ad8b..cb6b83a776 100644 --- a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx +++ b/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx @@ -41,17 +41,15 @@ export const ExecutionBatches: React.FC<{ const [toggleState, setToggledInternal] = useState(toggleMap); - const setToggled = (id: string) => { - const newToggleStatus = !toggleState[id]; - - if (newToggleStatus) { + const setToggled = (id: string, newToggleState: boolean) => { + if (newToggleState) { scrollRefMap.current[id].current?.scrollIntoView({ behavior: "smooth", block: "center", }); } - const newState = { ...toggleState, [id]: newToggleStatus }; + const newState = { ...toggleState, [id]: newToggleState }; setToggledInternal(newState); }; @@ -125,10 +123,10 @@ const BatchesTooltip: React.FC = () => (


  • - The sequence order shown for each batch doesn't reflect the final execution order. - The exact order is determined once they're run. However, this - specific order isn't relevant to the process, allowing for - simultaneous execution. + The sequence order shown for each batch doesn't reflect the final + execution order. The exact order is determined once they're run. + However, this specific order isn't relevant to the process, + allowing for simultaneous execution.
    diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index a93d04b9c8..7313bac66e 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -14,7 +14,7 @@ export const FutureBatch: React.FC<{ batch: Future[]; index: number; toggleState: Record; - setToggled: (id: string) => void; + setToggled: (id: string, newToggleState: boolean) => void; setCurrentlyHovered: (id: string) => void; setHoveredFuture: (id: string) => void; scrollRefMap: Record>; @@ -91,7 +91,7 @@ const FutureBtn = styled.div<{ isLibrary: boolean; toggled: boolean }>` const FutureBlock: React.FC<{ future: Future; toggleState: Record; - setToggled: (id: string) => void; + setToggled: (id: string, newToggleState: boolean) => void; setCurrentlyHovered: (id: string) => void; setHoveredFuture: (id: string) => void; classKey: string; @@ -124,7 +124,7 @@ const FutureBlock: React.FC<{ className={`${className} ${classKey}`} isLibrary={isLibrary} toggled={toggled} - onClick={() => setToggled(futureId)} + onClick={() => setToggled(futureId, !toggled)} > void; + setToggled: (id: string, newToggleState: boolean) => void; setHoveredFuture: (id: string) => void; }> = ({ className, future, setToggled, setHoveredFuture }) => { switch (future.type) { @@ -324,7 +324,7 @@ const FutureDetailsSection: React.FC<{ }; const Argument: React.FC<{ - setToggled: (id: string) => void; + setToggled: (id: string, newToggleState: boolean) => void; setHoveredFuture: (id: string) => void; arg: ArgumentType; }> = ({ setToggled, arg, setHoveredFuture }) => { @@ -337,7 +337,7 @@ const Argument: React.FC<{ cursor: "pointer", }} className="future-argument" - onClick={() => setToggled(arg.id)} + onClick={() => setToggled(arg.id, true)} onMouseEnter={() => setHoveredFuture(arg.id)} onMouseLeave={() => setHoveredFuture("")} > From b0110a36b31a8cd1000f156181e23c280fa1fccc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 10 Oct 2023 11:53:09 -0400 Subject: [PATCH 1044/1302] hide module diagram if module has only one future --- .../components/deployment-flow.tsx | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index b3fb7eed62..00e9cce549 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -50,31 +50,43 @@ export const DeploymentFlow: React.FC<{ Deployment flow - - Visualize batches - {batches.map((_, i) => ( - setCurrentlyHovered(`batch-${i}`)} - onMouseLeave={() => setCurrentlyHovered("")} - isCurrentlyHovered={currentlyHovered === `batch-${i}`} + {batches.length > 1 ? ( +
    + + Visualize batches + {batches.map((_, i) => ( + setCurrentlyHovered(`batch-${i}`)} + onMouseLeave={() => setCurrentlyHovered("")} + isCurrentlyHovered={currentlyHovered === `batch-${i}`} + > + Batch #{i + 1} + + ))} + + + - Batch #{i + 1} - - ))} - - - - - + + +
    + ) : ( + + A module diagram will show once you have more than 1 future. + + )}
    ); }; +const SingleFutureNotice = styled.div` + padding-top: 1rem; +`; + const VisualizeDiv = styled.div` font-weight: 700; padding: 1.5rem; From 3384565a6c4d5ae273d7eed5262a90068c12aa8e Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 11 Oct 2023 10:46:03 +0100 Subject: [PATCH 1045/1302] refactor: restructure warning message --- .../components/deployment-flow.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 00e9cce549..6aabdab077 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -6,10 +6,10 @@ import { import React, { useState } from "react"; import { Tooltip } from "react-tooltip"; import styled, { css } from "styled-components"; +import { TooltipIcon } from "../../../assets/TooltipIcon"; import { Mermaid } from "../../../components/mermaid"; import { getAllFuturesForModule } from "../../../queries/futures"; import { toEscapedId } from "../../../utils/to-escaped-id"; -import { TooltipIcon } from "../../../assets/TooltipIcon"; export const DeploymentFlow: React.FC<{ ignitionModule: IgnitionModule>; @@ -50,7 +50,11 @@ export const DeploymentFlow: React.FC<{ Deployment flow - {batches.length > 1 ? ( + {futures.length <= 1 ? ( + + A module diagram will show once you have more than 1 future. + + ) : (
    Visualize batches @@ -74,10 +78,6 @@ export const DeploymentFlow: React.FC<{
    - ) : ( - - A module diagram will show once you have more than 1 future. - )}
    ); From 6088ac53cf539892b2c78cccf0940a876226b2f3 Mon Sep 17 00:00:00 2001 From: Zoey Date: Wed, 11 Oct 2023 06:21:19 -0400 Subject: [PATCH 1046/1302] handle error thrown by status task (#541) Use a whitelist to determine whether a code `IgnitionError` should be rethrown as a Hardhat plugin error. This list can be added to as more Ignition errors are identified as being better displayed as HH errors. We intend to extend the HH error code mechanism to give Ignition even more control over the display of errors in HH. This change only adds this rethrow for status and the unrecognised deployment entry currently. Fixes #527. --- packages/hardhat-plugin/src/index.ts | 18 ++++++++++++++---- .../src/utils/shouldBeHardhatPluginError.ts | 12 ++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index dd2d0f6f94..9fe405fc73 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,16 +1,17 @@ -import type { +import { DeploymentParameters, + IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; - import "@nomicfoundation/hardhat-ethers"; import chalk from "chalk"; import { readdirSync } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; -import { lazyObject } from "hardhat/plugins"; +import { NomicLabsHardhatPluginError, lazyObject } from "hardhat/plugins"; import path from "path"; import "./type-extensions"; +import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -247,7 +248,16 @@ ignitionScope id ); - const statusResult = await status(deploymentDir); + let statusResult: StatusResult; + try { + statusResult = await status(deploymentDir); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + } + + throw e; + } if (statusResult.started.length > 0) { console.log(""); diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts new file mode 100644 index 0000000000..9522f5572e --- /dev/null +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -0,0 +1,12 @@ +import { IgnitionError } from "@nomicfoundation/ignition-core"; + +/* + This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. + */ +const whitelist = ["800"]; + +export function shouldBeHardhatPluginError(error: IgnitionError): boolean { + const code = error.message.match(/IGN([0-9]+):/)![1]; + + return whitelist.includes(code); +} From 2ea32d500efed419c7e0061e1df0bf4440bea24c Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 10 Oct 2023 20:12:47 +0100 Subject: [PATCH 1047/1302] remove support for module file names in tasks We are removing support for invoking a module just by giving its file name. Instead the tasks will work in terms of a full or relative path to the module file. Users prefer this for autocomplete reasons anyway, but it removes confusion as to whether it is the `ModuleId` or filename that is in use here. Resolves #527. --- examples/complete/README.md | 2 +- examples/ens/README.md | 4 +- examples/sample/README.md | 2 +- examples/ts-sample/README.md | 2 +- .../internal/reconciliation/chainId.ts | 2 +- packages/hardhat-plugin/src/index.ts | 31 ++++-------- packages/hardhat-plugin/src/load-module.ts | 47 ++----------------- packages/hardhat-plugin/test/load-module.ts | 45 ++++-------------- packages/hardhat-plugin/test/plan/index.ts | 2 +- 9 files changed, 30 insertions(+), 107 deletions(-) diff --git a/examples/complete/README.md b/examples/complete/README.md index bc1240ad89..60159b0d93 100644 --- a/examples/complete/README.md +++ b/examples/complete/README.md @@ -7,7 +7,7 @@ This is a contrived example project, intended mostly to ensure working end-to-en To run the Ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat ignition deploy CompleteModule.js +npx hardhat ignition deploy ./ignition/modules/CompleteModule.js ``` ## Test diff --git a/examples/ens/README.md b/examples/ens/README.md index a86427d0f9..5fd01e9b0b 100644 --- a/examples/ens/README.md +++ b/examples/ens/README.md @@ -7,7 +7,7 @@ This Hardhat project is an example of using ignition to deploy the ENS system of To run the Ignition deploy against the ephemeral Hardhat network: ```shell -npx hardhat ignition deploy ENS.js +npx hardhat ignition deploy ./ignition/modules/ENS.js ``` To run a deploy of ENS with a test registrar against the local node: @@ -15,7 +15,7 @@ To run a deploy of ENS with a test registrar against the local node: ```shell npx hardhat node # In another terminal -npx hardhat ignition deploy test-registrar.js --network localhost +npx hardhat ignition deploy ./ignition/modules/test-registrar.js --network localhost ``` ## Test diff --git a/examples/sample/README.md b/examples/sample/README.md index abb79ade36..b8764c1aa2 100644 --- a/examples/sample/README.md +++ b/examples/sample/README.md @@ -7,7 +7,7 @@ This project is Hardhat's sample project enhanced with Hardhat Ignition. To run the Ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat ignition deploy LockModule.js +npx hardhat ignition deploy ./ignition/modules/LockModule.js ``` ## Test diff --git a/examples/ts-sample/README.md b/examples/ts-sample/README.md index ae0cd503f1..da79e56370 100644 --- a/examples/ts-sample/README.md +++ b/examples/ts-sample/README.md @@ -8,7 +8,7 @@ Ignition. To run the Ignition deploy against the ephemeral Hardhat network: ```shell -npx hardhat ignition deploy LockModule +npx hardhat ignition deploy ./ignition/modules/LockModule ``` ## Test diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts index af9e820fdd..888eb4be84 100644 --- a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts +++ b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts @@ -14,7 +14,7 @@ describe("chainId reconciliation", function () { this.hre.run( { scope: "ignition", task: "deploy" }, { - moduleNameOrPath: "./ignition/modules/LockModule.js", + modulePath: "./ignition/modules/LockModule.js", } ), /Previous chain id: 123\. Current chain id: 31337/ diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 9fe405fc73..dc9a1bd67f 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -62,10 +62,7 @@ extendEnvironment((hre) => { ignitionScope .task("deploy") - .addPositionalParam( - "moduleNameOrPath", - "The name of the module file within the Ignition modules directory, or a path to the module file" - ) + .addPositionalParam("modulePath", "The path to the module file to deploy") .addOptionalParam( "parameters", "A relative path to a JSON file to use for the module parameters," @@ -75,11 +72,11 @@ ignitionScope .setAction( async ( { - moduleNameOrPath, + modulePath, parameters: parametersInput, id: givenDeploymentId, }: { - moduleNameOrPath: string; + modulePath: string; parameters?: string; id: string; }, @@ -117,10 +114,7 @@ ignitionScope await hre.run("compile", { quiet: true }); - const userModule = loadModule( - hre.config.paths.ignition, - moduleNameOrPath - ); + const userModule = loadModule(hre.config.paths.ignition, modulePath); if (userModule === undefined) { console.warn("No Ignition modules found"); @@ -174,17 +168,11 @@ ignitionScope ignitionScope .task("visualize") .addFlag("noOpen", "Disables opening report in browser") - .addPositionalParam( - "moduleNameOrPath", - "The name of the module file within the Ignition modules directory, or a path to the module file" - ) + .addPositionalParam("modulePath", "The path to the module file to visualize") .setDescription("Visualize a module as an HTML report") .setAction( async ( - { - noOpen = false, - moduleNameOrPath, - }: { noOpen: boolean; moduleNameOrPath: string }, + { noOpen = false, modulePath }: { noOpen: boolean; modulePath: string }, hre ) => { const { IgnitionModuleSerializer, batches } = await import( @@ -199,10 +187,7 @@ ignitionScope await hre.run("compile", { quiet: true }); - const userModule = loadModule( - hre.config.paths.ignition, - moduleNameOrPath - ); + const userModule = loadModule(hre.config.paths.ignition, modulePath); if (userModule === undefined) { console.warn("No Ignition modules found"); @@ -344,7 +329,7 @@ ignitionScope ignitionScope .task("wipe") .addParam("id", "The id of the deployment that has the future to wipe") - .addParam("future", "The id of the future within the deploment to wipe") + .addParam("future", "The id of the future to wipe") .setDescription("Reset a deployment's future to allow rerunning") .setAction( async ( diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 7477263658..f8838723cf 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -10,7 +10,7 @@ const MODULES_FOLDER = "modules"; export function loadModule( ignitionDirectory: string, - moduleNameOrPath: string + modulePath: string ): IgnitionModule | undefined { const fullModulesDirectoryName = path.resolve( ignitionDirectory, @@ -38,22 +38,19 @@ export function loadModule( debug(`Loading user modules from '${fullModulesDirectoryName}'`); - const fullpathToModule = resolveFullPathToModule( - fullModulesDirectoryName, - moduleNameOrPath - ); + const fullpathToModule = path.resolve(modulePath); - if (fullpathToModule === undefined) { + if (!pathExistsSync(fullpathToModule)) { throw new HardhatPluginError( "hardhat-ignition", - `Could not find module ${moduleNameOrPath}` + `Could not find a module file at the path: ${modulePath}` ); } if (!isInModuleDirectory(fullModulesDirectoryName, fullpathToModule)) { throw new HardhatPluginError( "hardhat-ignition", - `The referenced module ${moduleNameOrPath} is outside the module directory ${shortModulesDirectoryName}` + `The referenced module file ${modulePath} is outside the module directory ${shortModulesDirectoryName}` ); } @@ -64,40 +61,6 @@ export function loadModule( return module.default ?? module; } -function resolveFullPathToModule( - modulesDirectory: string, - moduleNameOrPath: string -): string | undefined { - const pathToModule = path.resolve(moduleNameOrPath); - if (pathExistsSync(pathToModule)) { - return pathToModule; - } - - const relativeToModules = path.resolve(modulesDirectory, moduleNameOrPath); - if (pathExistsSync(relativeToModules)) { - return relativeToModules; - } - - const relativeToModulesWithJsExtension = path.resolve( - modulesDirectory, - `${moduleNameOrPath}.js` - ); - if (pathExistsSync(relativeToModulesWithJsExtension)) { - return relativeToModulesWithJsExtension; - } - - const relativeToModulesWithTsExtension = path.resolve( - modulesDirectory, - `${moduleNameOrPath}.ts` - ); - - if (pathExistsSync(relativeToModulesWithTsExtension)) { - return relativeToModulesWithTsExtension; - } - - return undefined; -} - function isInModuleDirectory(modulesDirectory: string, modulePath: string) { const resolvedModulesDirectory = path.resolve(modulesDirectory); const moduleRelativeToModuleDir = path.relative( diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index b80f378225..eadd00bd19 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -8,40 +8,22 @@ import { useEphemeralIgnitionProject } from "./use-ignition-project"; describe("loadModule", function () { useEphemeralIgnitionProject("user-modules"); - it("should return the module given the module name", () => { - const module = loadModule("ignition", "TestModule"); - - if (module === undefined) { - assert.fail("Module was not loaded"); - } - - assert.equal(module.id, "testing123"); - }); - - it("should return the module given the module name and extension", () => { - const module = loadModule("ignition", "TestModule.js"); - - if (module === undefined) { - assert.fail("Module was not loaded"); - } - - assert.equal(module.id, "testing123"); - }); - - it("should throw if the module name does not exist", () => { - assert.throws(() => loadModule("ignition", "Fake")); - }); - - it("should throw if the module name with extension does not exist", () => { - assert.throws(() => loadModule("ignition", "Fake.js")); + it("should throw if given a user module directory that does not exist", async () => { + assert.throws( + () => loadModule("/fake", "AFile.js"), + `Ignition directory /fake not found.` + ); }); it("should throw if the full path to the module does not exist", () => { - assert.throws(() => loadModule("ignition", "./ignition/Fake.js")); + assert.throws( + () => loadModule("ignition", "./ignition/modules/Fake.js"), + "Could not find a module file at the path: ./ignition/modules/Fake.js" + ); }); it("should throw if the full path to the module is outside the module directory", () => { - const unixErrorMessage = `The referenced module ./hardhat.config.js is outside the module directory ignition/modules`; + const unixErrorMessage = `The referenced module file ./hardhat.config.js is outside the module directory ignition/modules`; const expectedErrorMessage = process.platform === "win32" @@ -53,11 +35,4 @@ describe("loadModule", function () { expectedErrorMessage ); }); - - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadModule("/fake", "AFile.js"), - `Ignition directory /fake not found.` - ); - }); }); diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 56da130774..9d3a085e13 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -20,7 +20,7 @@ describe("visualize", () => { }, { noOpen: true, - moduleNameOrPath: "MyModule.js", + modulePath: "./ignition/modules/MyModule.js", } ); From 5a285ef3e300e898f74f89cdcd47ab148f3dc63f Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 10 Oct 2023 23:10:54 +0100 Subject: [PATCH 1048/1302] feat: expose `buildModule` on its own entry point We re-export `buildModule` in `hardhat-ignition` from a `modules` entry point to avoid clashes with Hardhat plugin setup. Now to setup a module you need to import: ``` import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; ``` Resolves #540. --- examples/complete/ignition/modules/CompleteModule.js | 2 +- examples/ens/ignition/modules/ENS.js | 2 +- examples/ens/ignition/modules/test-registrar.js | 2 +- examples/sample/ignition/modules/LockModule.js | 2 +- examples/ts-sample/ignition/modules/LockModule.ts | 2 +- .../ignition/modules/LockModule.js | 2 +- packages/hardhat-plugin/package.json | 11 +++++++++++ packages/hardhat-plugin/src/index.ts | 10 ---------- packages/hardhat-plugin/src/modules.ts | 1 + 9 files changed, 18 insertions(+), 16 deletions(-) create mode 100644 packages/hardhat-plugin/src/modules.ts diff --git a/examples/complete/ignition/modules/CompleteModule.js b/examples/complete/ignition/modules/CompleteModule.js index 668aaa2968..ef8bef318a 100644 --- a/examples/complete/ignition/modules/CompleteModule.js +++ b/examples/complete/ignition/modules/CompleteModule.js @@ -1,5 +1,5 @@ // ./ignition/CompleteModule.js -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const withLibArtifact = require("../../libArtifacts/ContractWithLibrary.json"); const libArtifact = require("../../libArtifacts/BasicLibrary.json"); diff --git a/examples/ens/ignition/modules/ENS.js b/examples/ens/ignition/modules/ENS.js index 3d817ab9ae..b13f265c0a 100644 --- a/examples/ens/ignition/modules/ENS.js +++ b/examples/ens/ignition/modules/ENS.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const namehash = require("eth-ens-namehash"); const ethers = hre.ethers; diff --git a/examples/ens/ignition/modules/test-registrar.js b/examples/ens/ignition/modules/test-registrar.js index 30d036824f..3bc04803e9 100644 --- a/examples/ens/ignition/modules/test-registrar.js +++ b/examples/ens/ignition/modules/test-registrar.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const namehash = require("eth-ens-namehash"); const setupENSRegistry = require("./ENS"); diff --git a/examples/sample/ignition/modules/LockModule.js b/examples/sample/ignition/modules/LockModule.js index b2f59882bd..4f800dc975 100644 --- a/examples/sample/ignition/modules/LockModule.js +++ b/examples/sample/ignition/modules/LockModule.js @@ -1,5 +1,5 @@ // ./ignition/LockModule.js -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; diff --git a/examples/ts-sample/ignition/modules/LockModule.ts b/examples/ts-sample/ignition/modules/LockModule.ts index cc64bd5d8f..1f4ddf6f33 100644 --- a/examples/ts-sample/ignition/modules/LockModule.ts +++ b/examples/ts-sample/ignition/modules/LockModule.ts @@ -1,4 +1,4 @@ -import { buildModule } from "@nomicfoundation/hardhat-ignition"; +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; import hre from "hardhat"; const currentTimestampInSeconds = Math.round( diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js index 6ed59e1929..e9152d832d 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js @@ -1,4 +1,4 @@ -const { buildModule } = require("@nomicfoundation/hardhat-ignition"); +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3c3c605a66..c3dffaf55d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -17,6 +17,17 @@ ], "main": "dist/src/index.js", "types": "dist/src/index.d.ts", + "exports": { + ".": "./dist/src/index.js", + "./modules": "./dist/src/modules.js" + }, + "typesVersions": { + "*": { + "modules": [ + "./dist/src/modules.d.ts" + ] + } + }, "scripts": { "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index dc9a1bd67f..2868991a23 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -21,16 +21,6 @@ const ignitionScope = scope( "Deploy your smart contracts using Hardhat Ignition" ); -// this is ugly, but it's fast :) -// discussion: https://github.com/NomicFoundation/hardhat-ignition/pull/483 -export const buildModule: typeof import("@nomicfoundation/ignition-core").buildModule = - (...args) => { - const { buildModule: coreBuildModule } = - require("@nomicfoundation/ignition-core") as typeof import("@nomicfoundation/ignition-core"); - - return coreBuildModule(...args); - }; - extendConfig((config, userConfig) => { /* setup path configs */ const userPathsConfig = userConfig.paths ?? {}; diff --git a/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-plugin/src/modules.ts new file mode 100644 index 0000000000..840e207281 --- /dev/null +++ b/packages/hardhat-plugin/src/modules.ts @@ -0,0 +1 @@ +export { buildModule } from "@nomicfoundation/ignition-core"; From c3cc886d9c7e736d19b48e46247c80d7bef6f967 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 12 Oct 2023 10:27:44 +0100 Subject: [PATCH 1049/1302] improvement: change `id` to `deployment-id` in tasks (#539) Tasks that accept a deployment id have had their param renamed to the more explicit `deployment-id`. In `wipe` and `status` the `deployment-id` has been made positional. Updates `future` to `future-id` in the wipe task as well for consistency, and it has become positional as well. Resolves #538. --- packages/hardhat-plugin/src/index.ts | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 2868991a23..fc388f44bc 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,9 +1,9 @@ +import "@nomicfoundation/hardhat-ethers"; import { DeploymentParameters, IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; -import "@nomicfoundation/hardhat-ethers"; import chalk from "chalk"; import { readdirSync } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; @@ -57,18 +57,18 @@ ignitionScope "parameters", "A relative path to a JSON file to use for the module parameters," ) - .addOptionalParam("id", "set the deployment id") + .addOptionalParam("deploymentId", "Set the id of the deployment") .setDescription("Deploy a module to the specified network") .setAction( async ( { modulePath, parameters: parametersInput, - id: givenDeploymentId, + deploymentId: givenDeploymentId, }: { modulePath: string; parameters?: string; - id: string; + deploymentId: string; }, hre ) => { @@ -212,15 +212,15 @@ ignitionScope ignitionScope .task("status") - .addParam("id", "The id of the deployment to show") + .addPositionalParam("deploymentId", "The id of the deployment to show") .setDescription("Show the current status of a deployment") - .setAction(async ({ id }: { id: string }, hre) => { + .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { const { status } = await import("@nomicfoundation/ignition-core"); const deploymentDir = path.join( hre.config.paths.ignition, "deployments", - id + deploymentId ); let statusResult: StatusResult; @@ -238,7 +238,7 @@ ignitionScope console.log(""); console.log( chalk.bold( - `⛔ Deployment ${id} has not fully completed, there are futures have started but not finished` + `⛔ Deployment ${deploymentId} has not fully completed, there are futures have started but not finished` ) ); console.log(""); @@ -257,7 +257,7 @@ ignitionScope statusResult.held.length > 0 ) { console.log(""); - console.log(chalk.bold(toErrorResultHeading(id, statusResult))); + console.log(chalk.bold(toErrorResultHeading(deploymentId, statusResult))); console.log(""); if (statusResult.timedOut.length > 0) { @@ -301,7 +301,7 @@ ignitionScope } console.log(""); - console.log(chalk.bold(`🚀 Deployment ${id} Complete `)); + console.log(chalk.bold(`🚀 Deployment ${deploymentId} Complete `)); console.log(""); if (Object.values(statusResult.contracts).length === 0) { @@ -318,15 +318,15 @@ ignitionScope ignitionScope .task("wipe") - .addParam("id", "The id of the deployment that has the future to wipe") - .addParam("future", "The id of the future to wipe") + .addPositionalParam( + "deploymentId", + "The id of the deployment with the future to wipe" + ) + .addPositionalParam("futureId", "The id of the future to wipe") .setDescription("Reset a deployment's future to allow rerunning") .setAction( async ( - { - deployment: deploymentId, - future: futureId, - }: { deployment: string; future: string }, + { deploymentId, futureId }: { deploymentId: string; futureId: string }, hre ) => { const { wipe } = await import("@nomicfoundation/ignition-core"); From f78b55c7d9b54ac1aac26cee4fdaa168ee285ba2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 11 Oct 2023 23:14:04 -0400 Subject: [PATCH 1050/1302] add error rethrowing to all plugin tasks --- packages/hardhat-plugin/src/index.ts | 52 +++++++++++++++---- .../src/utils/shouldBeHardhatPluginError.ts | 2 +- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index fc388f44bc..3056c91af0 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -11,7 +11,6 @@ import { NomicLabsHardhatPluginError, lazyObject } from "hardhat/plugins"; import path from "path"; import "./type-extensions"; -import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -79,8 +78,10 @@ ignitionScope "./hardhat-artifact-resolver" ); const { loadModule } = await import("./load-module"); - const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); + const { shouldBeHardhatPluginError } = await import( + "./utils/shouldBeHardhatPluginError" + ); const chainId = Number( await hre.network.provider.request({ @@ -150,6 +151,10 @@ ignitionScope accounts, }); } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + } + throw e; } } @@ -171,6 +176,9 @@ ignitionScope const { loadModule } = await import("./load-module"); const { open } = await import("./utils/open"); + const { shouldBeHardhatPluginError } = await import( + "./utils/shouldBeHardhatPluginError" + ); const { writeVisualization } = await import( "./visualization/write-visualization" ); @@ -184,17 +192,25 @@ ignitionScope process.exit(0); } - const serializedIgnitionModule = - IgnitionModuleSerializer.serialize(userModule); + try { + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(userModule); - const batchInfo = batches(userModule); + const batchInfo = batches(userModule); - await writeVisualization( - { module: serializedIgnitionModule, batches: batchInfo }, - { - cacheDir: hre.config.paths.cache, + await writeVisualization( + { module: serializedIgnitionModule, batches: batchInfo }, + { + cacheDir: hre.config.paths.cache, + } + ); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); } - ); + + throw e; + } if (!noOpen) { const indexFile = path.join( @@ -216,6 +232,9 @@ ignitionScope .setDescription("Show the current status of a deployment") .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { const { status } = await import("@nomicfoundation/ignition-core"); + const { shouldBeHardhatPluginError } = await import( + "./utils/shouldBeHardhatPluginError" + ); const deploymentDir = path.join( hre.config.paths.ignition, @@ -334,6 +353,9 @@ ignitionScope const { HardhatArtifactResolver } = await import( "./hardhat-artifact-resolver" ); + const { shouldBeHardhatPluginError } = await import( + "./utils/shouldBeHardhatPluginError" + ); const deploymentDir = path.join( hre.config.paths.ignition, @@ -341,7 +363,15 @@ ignitionScope deploymentId ); - await wipe(deploymentDir, new HardhatArtifactResolver(hre), futureId); + try { + await wipe(deploymentDir, new HardhatArtifactResolver(hre), futureId); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + } + + throw e; + } console.log(`${futureId} state has been cleared`); } diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index 9522f5572e..a2d195b212 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -3,7 +3,7 @@ import { IgnitionError } from "@nomicfoundation/ignition-core"; /* This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. */ -const whitelist = ["800"]; +const whitelist = ["600", "601", "800"]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { const code = error.message.match(/IGN([0-9]+):/)![1]; From 5fc8124ff608878283af06e76de568a2b9e473b2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 12 Oct 2023 11:26:29 +0100 Subject: [PATCH 1051/1302] improvement: include error 602 in whitelist This is the error if during a wipe, the future can't be cleared because it has dependents that have state. --- .../hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index a2d195b212..03766372bb 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -1,9 +1,9 @@ import { IgnitionError } from "@nomicfoundation/ignition-core"; -/* +/* This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. */ -const whitelist = ["600", "601", "800"]; +const whitelist = ["600", "601", "602", "800"]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { const code = error.message.match(/IGN([0-9]+):/)![1]; From 6179a146fc1748e97ebb933f7f3d83dc7b277338 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 12 Oct 2023 12:02:30 -0400 Subject: [PATCH 1052/1302] add rules for whitelisting errors and applied them to current errors --- packages/core/src/errors-list.ts | 6 +++ .../src/utils/shouldBeHardhatPluginError.ts | 52 +++++++++++++++++-- 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 8bdc8a8fcf..70d45902f2 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -70,6 +70,12 @@ export const ERROR_RANGES: { }, }; +/** + * DEV NOTE: + * + * When adding errors, please apply the hardhat-plugin rules + * and add the new error code to the whitelist if needed. + */ export const ERRORS = { GENERAL: { ASSERTION_ERROR: { diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index 03766372bb..ab26acb009 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -1,9 +1,53 @@ -import { IgnitionError } from "@nomicfoundation/ignition-core"; +import type { IgnitionError } from "@nomicfoundation/ignition-core"; -/* - This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. +/** + * This is a whitelist of error codes that should be rethrown as NomicLabsHardhatPluginError. + * + * The rules for adding an error code to this list are: + * - If an exception is used to tell the user that they did something wrong, it should be added. + * - If an exception is used to indicate some failure and terminate the current process/deployment, that shouldn't be added. + * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ -const whitelist = ["600", "601", "602", "800"]; +const whitelist = [ + "200", + "201", + "202", + "203", + "403", + "404", + "405", + "600", + "601", + "602", + "700", + "701", + "702", + "703", + "704", + "705", + "706", + "707", + "708", + "709", + "710", + "711", + "712", + "713", + "714", + "715", + "716", + "717", + "718", + "719", + "720", + "721", + "722", + "723", + "724", + "725", + "726", + "800", +]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { const code = error.message.match(/IGN([0-9]+):/)![1]; From 734a3c1a6127dba3ef615ef9802de01480578822 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 12 Oct 2023 12:34:41 -0400 Subject: [PATCH 1053/1302] catch IgnitionErrors inside load-module --- packages/hardhat-plugin/src/load-module.ts | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index f8838723cf..3430d4a513 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,9 +1,14 @@ -import { IgnitionModule } from "@nomicfoundation/ignition-core"; +import { IgnitionError, IgnitionModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; import { existsSync, pathExistsSync } from "fs-extra"; -import { HardhatPluginError } from "hardhat/plugins"; +import { + HardhatPluginError, + NomicLabsHardhatPluginError, +} from "hardhat/plugins"; import path from "path"; +import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; + const debug = setupDebug("hardhat-ignition:modules"); const MODULES_FOLDER = "modules"; @@ -56,7 +61,16 @@ export function loadModule( debug(`Loading module file '${fullpathToModule}'`); - const module = require(fullpathToModule); + let module; + try { + module = require(fullpathToModule); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + } + + throw e; + } return module.default ?? module; } From 3e276b0407c17367016f0d42b508716f3baf0b30 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Thu, 12 Oct 2023 23:08:05 +0000 Subject: [PATCH 1054/1302] Make ignition-core a dependency --- package-lock.json | 3 +-- packages/hardhat-plugin/package.json | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 212ac8272b..ef3987eba5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21380,6 +21380,7 @@ "version": "0.4.0", "license": "MIT", "dependencies": { + "@nomicfoundation/ignition-core": "^0.4.0", "@nomicfoundation/ignition-ui": "^0.4.0", "chalk": "^4.0.0", "debug": "^4.3.2", @@ -21390,7 +21391,6 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/ignition-core": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -21428,7 +21428,6 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/ignition-core": "^0.4.0", "hardhat": "^2.18.0" } }, diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index c3dffaf55d..c43b181991 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -44,7 +44,6 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/ignition-core": "^0.4.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/d3": "7.4.0", @@ -82,10 +81,10 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/ignition-core": "^0.4.0", "hardhat": "^2.18.0" }, "dependencies": { + "@nomicfoundation/ignition-core": "^0.4.0", "@nomicfoundation/ignition-ui": "^0.4.0", "chalk": "^4.0.0", "debug": "^4.3.2", From 1bd1f4fbfd00a51ae9059055625f5a911b4dde2b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 10 Oct 2023 14:28:13 -0400 Subject: [PATCH 1055/1302] update pretty-print text UI --- .../hardhat-plugin/src/ui/helpers/display-batch.ts | 10 +++++----- .../src/ui/helpers/display-deploying-module-panel.ts | 10 ++-------- .../src/ui/helpers/display-deployment-complete.ts | 11 +++-------- .../src/ui/helpers/display-separator.ts | 3 --- .../src/ui/helpers/display-starting-message.ts | 2 +- .../hardhat-plugin/src/ui/pretty-event-handler.ts | 3 --- 6 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 packages/hardhat-plugin/src/ui/helpers/display-separator.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts index 008f132442..bcec95f19e 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts @@ -42,19 +42,19 @@ export function displayBatch(state: UiState): void { function _futureStatus(future: UiFuture): string { switch (future.status.type) { case UiFutureStatusType.UNSTARTED: { - return ` 🔄 ${future.futureId} running ...`; + return ` Executing ${future.futureId}...`; } case UiFutureStatusType.SUCCESS: { - return ` ✅ ${future.futureId} success`; + return ` Executed ${future.futureId}`; } case UiFutureStatusType.PENDING: { - return ` ⏳ ${future.futureId} timed out`; + return ` ${future.futureId} timed out`; } case UiFutureStatusType.ERRORED: { - return ` ⛔ ${future.futureId} failed`; + return ` ${future.futureId} failed`; } case UiFutureStatusType.HELD: { - return ` ⏳ ${future.futureId} held`; + return ` ${future.futureId} held`; } } } diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts index 09a0053601..2919e4b392 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts @@ -2,18 +2,12 @@ import chalk from "chalk"; import { UiState } from "../types"; -import { displaySeparator } from "./display-separator"; - export function displayDeployingModulePanel(state: UiState) { process.stdout.clearLine(0); process.stdout.cursorTo(0); console.log(""); - console.log( - chalk.bold( - `Deploying module ${chalk.italic(state.moduleName ?? "unknown")}` - ) - ); + console.log(`Hardhat Ignition 🚀`); console.log(""); - displaySeparator(); + console.log(chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)); console.log(""); } diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts index 3fb9ad15be..2a3af0cb4f 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts @@ -44,20 +44,15 @@ function _displaySuccessfulDeployment( result: SuccessfulDeploymentResult ) { console.log(""); - console.log( - chalk.bold( - `🚀 Deployment Complete for module ${chalk.italic( - state.moduleName ?? "unknown" - )}` - ) - ); + console.log(`[ ${state.moduleName ?? "unknown"} ] successfully deployed 🚀`); console.log(""); - console.log("Deployed Addresses"); + console.log(chalk.bold("Deployed Addresses")); console.log(""); for (const contract of Object.values(result.contracts)) { console.log(`${contract.id} - ${contract.address}`); } + console.log(""); } function _displayValidationErrors( diff --git a/packages/hardhat-plugin/src/ui/helpers/display-separator.ts b/packages/hardhat-plugin/src/ui/helpers/display-separator.ts deleted file mode 100644 index b29d3f973a..0000000000 --- a/packages/hardhat-plugin/src/ui/helpers/display-separator.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function displaySeparator() { - console.log("─".repeat(Math.min(process.stdout.columns ?? 80))); -} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts b/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts index bdc2f9fc6f..58e8b4342a 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts @@ -7,6 +7,6 @@ import { UiState } from "../types"; */ export function displayStartingMessage(state: UiState) { process.stdout.write( - `Ignition starting for module ${state.moduleName ?? "unknown"}...` + `Hardhat Ignition starting for [ ${state.moduleName ?? "unknown"} ]...` ); } diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 884b044764..b2e4746235 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -36,7 +36,6 @@ import { import { displayBatch, redisplayBatch } from "./helpers/display-batch"; import { displayDeployingModulePanel } from "./helpers/display-deploying-module-panel"; import { displayDeploymentComplete } from "./helpers/display-deployment-complete"; -import { displaySeparator } from "./helpers/display-separator"; import { displayStartingMessage } from "./helpers/display-starting-message"; import { UiBatches, @@ -340,8 +339,6 @@ export class PrettyEventHandler implements ExecutionEventListener { if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { redisplayBatch(this.state); - - displaySeparator(); } displayDeploymentComplete(this.state, event); From 47405c959da9936b922fa4535dab941a8c9a06fe Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 10 Oct 2023 16:58:45 -0400 Subject: [PATCH 1056/1302] update wording for timed out future --- packages/hardhat-plugin/src/ui/helpers/display-batch.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts index bcec95f19e..aa005197a9 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts @@ -48,7 +48,7 @@ function _futureStatus(future: UiFuture): string { return ` Executed ${future.futureId}`; } case UiFutureStatusType.PENDING: { - return ` ${future.futureId} timed out`; + return ` Timed out ${future.futureId}`; } case UiFutureStatusType.ERRORED: { return ` ${future.futureId} failed`; From 52bc8f9d6c335fe31026bbaa2f7826729a567503 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 11 Oct 2023 13:44:32 +0100 Subject: [PATCH 1057/1302] feat: update failed and held text Add a test of batch display as well. --- .../src/ui/helpers/calculate-batch-display.ts | 38 ++++ .../calculate-deploying-module-panel.ts | 11 ++ .../src/ui/helpers/display-batch.ts | 60 ------- .../helpers/display-deploying-module-panel.ts | 13 -- .../ui/helpers/display-deployment-complete.ts | 1 - .../src/ui/pretty-event-handler.ts | 40 ++++- .../ui/helpers/calculate-batch-display.ts | 166 ++++++++++++++++++ 7 files changed, 248 insertions(+), 81 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts delete mode 100644 packages/hardhat-plugin/src/ui/helpers/display-batch.ts delete mode 100644 packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts new file mode 100644 index 0000000000..c13c6caa31 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -0,0 +1,38 @@ +import { UiFuture, UiFutureStatusType, UiState } from "../types"; + +export function calculateBatchDisplay(state: UiState): { + text: string; + height: number; +} { + const batch = state.batches[state.currentBatch - 1]; + const height = batch.length + 1; + + let text = `Batch #${state.currentBatch}\n`; + + text += batch + .sort((a, b) => a.futureId.localeCompare(b.futureId)) + .map(_futureStatus) + .join("\n"); + + return { text, height }; +} + +function _futureStatus(future: UiFuture): string { + switch (future.status.type) { + case UiFutureStatusType.UNSTARTED: { + return ` Executing ${future.futureId}...`; + } + case UiFutureStatusType.SUCCESS: { + return ` Executed ${future.futureId}`; + } + case UiFutureStatusType.PENDING: { + return ` Timed out ${future.futureId}`; + } + case UiFutureStatusType.ERRORED: { + return ` Failed ${future.futureId}`; + } + case UiFutureStatusType.HELD: { + return ` Held ${future.futureId}`; + } + } +} diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts new file mode 100644 index 0000000000..694e98f84b --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -0,0 +1,11 @@ +import chalk from "chalk"; + +import { UiState } from "../types"; + +export function calculateDeployingModulePanel(state: UiState): string { + return ` +Hardhat Ignition 🚀 + +${chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)} +`; +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts b/packages/hardhat-plugin/src/ui/helpers/display-batch.ts deleted file mode 100644 index aa005197a9..0000000000 --- a/packages/hardhat-plugin/src/ui/helpers/display-batch.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { UiFuture, UiFutureStatusType, UiState } from "../types"; - -export function redisplayBatch(state: UiState): void { - if (state.currentBatch === 0) { - return; - } - - const batch = state.batches[state.currentBatch - 1]; - const panelHeight = batch.length + 3; - - process.stdout.moveCursor(0, -panelHeight); - process.stdout.clearScreenDown(); - - displayBatch(state); -} - -/** - * Display the current batch. - * - * @param state - the UI state - * @param clearCurrent - whether to write over the current batch - */ -export function displayBatch(state: UiState): void { - if (state.currentBatch === 0) { - return; - } - - const batch = state.batches[state.currentBatch - 1]; - - console.log(`Batch #${state.currentBatch}`); - console.log(""); - - for (const future of batch.sort((a, b) => - a.futureId.localeCompare(b.futureId) - )) { - console.log(_futureStatus(future)); - } - - console.log(""); -} - -function _futureStatus(future: UiFuture): string { - switch (future.status.type) { - case UiFutureStatusType.UNSTARTED: { - return ` Executing ${future.futureId}...`; - } - case UiFutureStatusType.SUCCESS: { - return ` Executed ${future.futureId}`; - } - case UiFutureStatusType.PENDING: { - return ` Timed out ${future.futureId}`; - } - case UiFutureStatusType.ERRORED: { - return ` ${future.futureId} failed`; - } - case UiFutureStatusType.HELD: { - return ` ${future.futureId} held`; - } - } -} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts deleted file mode 100644 index 2919e4b392..0000000000 --- a/packages/hardhat-plugin/src/ui/helpers/display-deploying-module-panel.ts +++ /dev/null @@ -1,13 +0,0 @@ -import chalk from "chalk"; - -import { UiState } from "../types"; - -export function displayDeployingModulePanel(state: UiState) { - process.stdout.clearLine(0); - process.stdout.cursorTo(0); - console.log(""); - console.log(`Hardhat Ignition 🚀`); - console.log(""); - console.log(chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)); - console.log(""); -} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts index 2a3af0cb4f..af37be3449 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts @@ -52,7 +52,6 @@ function _displaySuccessfulDeployment( for (const contract of Object.values(result.contracts)) { console.log(`${contract.id} - ${contract.address}`); } - console.log(""); } function _displayValidationErrors( diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index b2e4746235..8efb46260b 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -33,8 +33,8 @@ import { WipeApplyEvent, } from "@nomicfoundation/ignition-core"; -import { displayBatch, redisplayBatch } from "./helpers/display-batch"; -import { displayDeployingModulePanel } from "./helpers/display-deploying-module-panel"; +import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; +import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; import { displayDeploymentComplete } from "./helpers/display-deployment-complete"; import { displayStartingMessage } from "./helpers/display-starting-message"; import { @@ -85,19 +85,27 @@ export class PrettyEventHandler implements ExecutionEventListener { chainId: event.chainId, }; - displayDeployingModulePanel(this.state); + this._clearCurrentLine(); + console.log(calculateDeployingModulePanel(this.state)); } public beginNextBatch(_event: BeginNextBatchEvent): void { // rerender the previous batch - redisplayBatch(this.state); + if (this.state.currentBatch > 0) { + this._redisplayCurrentBatch(); + } this.state = { ...this.state, currentBatch: this.state.currentBatch + 1, }; - displayBatch(this.state); + if (this.state.currentBatch === 0) { + return; + } + + // render the new batch + console.log(calculateBatchDisplay(this.state).text); } public wipeApply(event: WipeApplyEvent): void { @@ -152,7 +160,7 @@ export class PrettyEventHandler implements ExecutionEventListener { batches: this._applyUpdateToBatchFuture(updatedFuture), }; - redisplayBatch(this.state); + this._redisplayCurrentBatch(); } public callExecutionStateInitialize( @@ -338,7 +346,7 @@ export class PrettyEventHandler implements ExecutionEventListener { }; if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { - redisplayBatch(this.state); + this._redisplayCurrentBatch(); } displayDeploymentComplete(this.state, event); @@ -461,4 +469,22 @@ export class PrettyEventHandler implements ExecutionEventListener { return null; } + + private _redisplayCurrentBatch() { + const { height, text: batch } = calculateBatchDisplay(this.state); + + this._clearUpToHeight(height); + + console.log(batch); + } + + private _clearCurrentLine(): void { + process.stdout.clearLine(0); + process.stdout.cursorTo(0); + } + + private _clearUpToHeight(height: number) { + process.stdout.moveCursor(0, -height); + process.stdout.clearScreenDown(); + } } diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts new file mode 100644 index 0000000000..5955a64c1d --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -0,0 +1,166 @@ +import { assert } from "chai"; + +import { calculateBatchDisplay } from "../../../src/ui/helpers/calculate-batch-display"; +import { + UiFuture, + UiFutureStatusType, + UiState, + UiStateDeploymentStatus, +} from "../../../src/ui/types"; + +const exampleState: UiState = { + status: UiStateDeploymentStatus.DEPLOYING, + chainId: 31337, + moduleName: "ExampleModule", + batches: [], + currentBatch: 1, + result: null, + warnings: [], +}; + +describe("ui - calculate batch display", () => { + it("should render a batch with a single running future", () => { + const expectedText = testFormat` + Batch #1 + Executing ExampleModule#Token...`; + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + ], + 2, + expectedText + ); + }); + + it("should render a batch with a single completed future", () => { + const expectedText = testFormat` + Batch #1 + Executed ExampleModule#Token`; + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.SUCCESS, + }, + futureId: "ExampleModule#Token", + }, + ], + 2, + expectedText + ); + }); + + it("should render a batch with a single failed future", () => { + const expectedText = testFormat` + Batch #1 + Failed ExampleModule#Token`; + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.ERRORED, + message: "The transaction reverted", + }, + futureId: "ExampleModule#Token", + }, + ], + 2, + expectedText + ); + }); + + it("should render a batch with a single held future", () => { + const expectedText = testFormat` + Batch #1 + Held ExampleModule#Token`; + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.HELD, + heldId: 1, + reason: "Waiting for multisig signoff", + }, + futureId: "ExampleModule#Token", + }, + ], + 2, + expectedText + ); + }); + + it("should render a complex batch in multiple states", () => { + const expectedText = testFormat` + Batch #1 + Failed ExampleModule#Dex + Held ExampleModule#ENS + Executed ExampleModule#Router + Executing ExampleModule#Token...`; + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + { + status: { + type: UiFutureStatusType.ERRORED, + message: "The transaction reverted", + }, + futureId: "ExampleModule#Dex", + }, + { + status: { + type: UiFutureStatusType.SUCCESS, + }, + futureId: "ExampleModule#Router", + }, + { + status: { + type: UiFutureStatusType.HELD, + heldId: 1, + reason: "Waiting for multisig signoff", + }, + futureId: "ExampleModule#ENS", + }, + ], + 5, + expectedText + ); + }); +}); + +function assertBatchText( + batch: UiFuture[], + expectedHeight: number, + expectedText: string +) { + const { text: actualText, height } = calculateBatchDisplay({ + ...exampleState, + batches: [batch], + }); + + assert.equal(height, expectedHeight); + assert.equal(actualText, expectedText); +} + +function testFormat(expected: TemplateStringsArray): string { + return expected + .toString() + .substring(1) // Remove the first newline + .split("\n") + .map((line) => line.substring(6)) // remove prefix whitespace + .join("\n"); +} From f548f24804ce4f0e037f92db04ef928675034759 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 11 Oct 2023 15:17:49 +0100 Subject: [PATCH 1058/1302] small text tweaks --- .../src/ui/helpers/calculate-batch-display.ts | 2 +- .../src/ui/helpers/display-deployment-complete.ts | 15 +++++++++------ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts index c13c6caa31..514b286b0e 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -26,7 +26,7 @@ function _futureStatus(future: UiFuture): string { return ` Executed ${future.futureId}`; } case UiFutureStatusType.PENDING: { - return ` Timed out ${future.futureId}`; + return ` Pending ${future.futureId}`; } case UiFutureStatusType.ERRORED: { return ` Failed ${future.futureId}`; diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts index af37be3449..e9b60491ef 100644 --- a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts +++ b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts @@ -137,21 +137,24 @@ function _displayExecutionErrors( ) { console.log(""); console.log( - chalk.bold( - `⛔ Execution failed for module ${chalk.italic( - state.moduleName ?? "unknown" - )}` - ) + // [ ${state.moduleName ?? "unknown"} ] successfully deployed + chalk.bold(`[ ${chalk.italic(state.moduleName ?? "unknown")} ] failed ⛔`) ); console.log(""); if (result.timedOut.length > 0) { - console.log(chalk.yellow("Timed out:")); + console.log( + chalk.yellow("Transaction remains unconfirmed after fee bump:") + ); console.log(""); for (const { futureId } of Object.values(result.timedOut)) { console.log(` - ${futureId}`); } + console.log(""); + console.log( + "Consider increasing the fee in your config.\nCheck out the docs to learn more: " + ); } if (result.failed.length > 0) { From 0cbde6e23a8d2966e14db4ddd9f669fd86a56493 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 11 Oct 2023 16:58:21 +0100 Subject: [PATCH 1059/1302] feat: update deployment complete displays Update the deployment complete displays for error messages as well. Adds some tests to allow us to iterate quickly. --- .../src/ui/helpers/calculate-batch-display.ts | 4 +- .../calculate-deployment-complete-display.ts | 173 ++++++++++++ .../ui/helpers/display-deployment-complete.ts | 179 ------------ .../src/ui/pretty-event-handler.ts | 5 +- .../ui/helpers/calculate-batch-display.ts | 25 +- .../calculate-deployment-complete-display.ts | 265 ++++++++++++++++++ ...-deployment-result-to-exception-message.ts | 21 ++ 7 files changed, 480 insertions(+), 192 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts delete mode 100644 packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts index 514b286b0e..a811982dc1 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -5,7 +5,7 @@ export function calculateBatchDisplay(state: UiState): { height: number; } { const batch = state.batches[state.currentBatch - 1]; - const height = batch.length + 1; + const height = batch.length + 2; let text = `Batch #${state.currentBatch}\n`; @@ -14,6 +14,8 @@ export function calculateBatchDisplay(state: UiState): { .map(_futureStatus) .join("\n"); + text += "\n"; + return { text, height }; } diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts new file mode 100644 index 0000000000..ada652645c --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -0,0 +1,173 @@ +import { + DeploymentCompleteEvent, + DeploymentResultType, + ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + SuccessfulDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; + +export function calculateDeploymentCompleteDisplay( + event: DeploymentCompleteEvent, + { moduleName: givenModuleName }: { moduleName: string | null } +): string { + const moduleName = givenModuleName ?? "unknown"; + + switch (event.result.type) { + case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { + return _displaySuccessfulDeployment(event.result, { moduleName }); + } + case DeploymentResultType.VALIDATION_ERROR: { + return _displayValidationErrors(event.result, { moduleName }); + } + case DeploymentResultType.RECONCILIATION_ERROR: { + return _displayReconciliationErrors(event.result, { moduleName }); + } + case DeploymentResultType.PREVIOUS_RUN_ERROR: { + return _displayPreviousRunErrors(event.result, { moduleName }); + } + case DeploymentResultType.EXECUTION_ERROR: { + return _displayExecutionErrors(event.result, { moduleName }); + } + } +} + +function _displaySuccessfulDeployment( + result: SuccessfulDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = ` +[ ${moduleName} ] successfully deployed 🚀 + +${chalk.bold("Deployed Addresses")} + +`; + + const deployedContracts = Object.values(result.contracts); + + if (deployedContracts.length > 0) { + text += deployedContracts + .map((contract) => `${contract.id} - ${contract.address}`) + .join("\n"); + } else { + text += `${chalk.italic("No contracts were deployed")}`; + } + + return text; +} + +function _displayValidationErrors( + result: ValidationErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = ` +[ ${moduleName} ] validation failed ⛔ + +`; + + text += Object.entries(result.errors) + .map(([futureId, errors]) => { + let futureSection = `${futureId} errors:\n`; + + futureSection += errors.map((error) => ` - ${error}`).join("\n"); + + return futureSection; + }) + .join("\n\n"); + + return text; +} + +function _displayReconciliationErrors( + result: ReconciliationErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = ` +[ ${moduleName} ] reconciliation failed ⛔ + +`; + + text += Object.entries(result.errors) + .map(([futureId, errors]) => { + let errorSection = `${futureId} errors:\n`; + + errorSection += errors.map((error) => ` - ${error}`).join("\n"); + + return errorSection; + }) + .join("\n\n"); + + return text; +} + +function _displayPreviousRunErrors( + result: PreviousRunErrorDeploymentResult, + { moduleName }: { moduleName: string } +): string { + let text = `\n[ ${moduleName} ] deployment cancelled ⛔\n\n`; + + text += `These futures failed or timed out on a previous run:\n`; + + text += Object.keys(result.errors) + .map((futureId) => ` - ${futureId}`) + .join("\n"); + + text += `\n\nUse the ${chalk.italic( + "wipe" + )} task to reset them.\nCheck out the docs to learn more: `; + + return text; +} + +function _displayExecutionErrors( + result: ExecutionErrorDeploymentResult, + { moduleName }: { moduleName: string } +) { + const sections: string[] = []; + + let text = `\n[ ${moduleName} ] failed ⛔\n\n`; + + if (result.timedOut.length > 0) { + let timedOutSection = `Transaction remains unconfirmed after fee bump:\n`; + + timedOutSection += Object.values(result.timedOut) + .map(({ futureId }) => ` - ${futureId}`) + .join("\n"); + + timedOutSection += + "\n\nConsider increasing the fee in your config.\nCheck out the docs to learn more: "; + + sections.push(timedOutSection); + } + + if (result.failed.length > 0) { + let failedSection = `Failures:\n`; + + failedSection += Object.values(result.failed) + .map( + ({ futureId, networkInteractionId, error }) => + ` - ${futureId}/${networkInteractionId}: ${error}` + ) + .join("\n"); + + sections.push(failedSection); + } + + if (result.held.length > 0) { + let heldSection = `Held:\n`; + + heldSection += Object.values(result.held) + .map( + ({ futureId, heldId, reason }) => ` - ${futureId}/${heldId}: ${reason}` + ) + .join("\n"); + + sections.push(heldSection); + } + + text += sections.join("\n\n"); + + return text; +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts b/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts deleted file mode 100644 index e9b60491ef..0000000000 --- a/packages/hardhat-plugin/src/ui/helpers/display-deployment-complete.ts +++ /dev/null @@ -1,179 +0,0 @@ -import { - DeploymentCompleteEvent, - DeploymentResultType, - ExecutionErrorDeploymentResult, - PreviousRunErrorDeploymentResult, - ReconciliationErrorDeploymentResult, - SuccessfulDeploymentResult, - ValidationErrorDeploymentResult, -} from "@nomicfoundation/ignition-core"; -import chalk from "chalk"; - -import { UiState } from "../types"; - -export function displayDeploymentComplete( - state: UiState, - event: DeploymentCompleteEvent -) { - switch (event.result.type) { - case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { - _displaySuccessfulDeployment(state, event.result); - break; - } - case DeploymentResultType.VALIDATION_ERROR: { - _displayValidationErrors(state, event.result); - break; - } - case DeploymentResultType.RECONCILIATION_ERROR: { - _displayReconciliationErrors(state, event.result); - break; - } - case DeploymentResultType.PREVIOUS_RUN_ERROR: { - _displayPreviousRunErrors(state, event.result); - break; - } - case DeploymentResultType.EXECUTION_ERROR: { - _displayExecutionErrors(state, event.result); - break; - } - } -} - -function _displaySuccessfulDeployment( - state: UiState, - result: SuccessfulDeploymentResult -) { - console.log(""); - console.log(`[ ${state.moduleName ?? "unknown"} ] successfully deployed 🚀`); - console.log(""); - console.log(chalk.bold("Deployed Addresses")); - console.log(""); - - for (const contract of Object.values(result.contracts)) { - console.log(`${contract.id} - ${contract.address}`); - } -} - -function _displayValidationErrors( - state: UiState, - result: ValidationErrorDeploymentResult -) { - console.log(""); - console.log( - chalk.bold( - `⛔ Validation failed for module ${chalk.italic( - state.moduleName ?? "unknown" - )}` - ) - ); - console.log(""); - - for (const [futureId, errors] of Object.entries(result.errors)) { - console.log(`${chalk.bold(futureId)} errors:`); - console.log(""); - - for (const error of errors) { - console.log(` - ${error}`); - } - - console.log(""); - } -} - -function _displayReconciliationErrors( - state: UiState, - result: ReconciliationErrorDeploymentResult -) { - console.log(""); - console.log( - chalk.bold( - `⛔ Reconciliation failed for module ${chalk.italic( - state.moduleName ?? "unknown" - )}` - ) - ); - console.log(""); - - for (const [futureId, errors] of Object.entries(result.errors)) { - console.log(`${chalk.bold(futureId)} errors:`); - console.log(""); - - for (const error of errors) { - console.log(` - ${error}`); - } - - console.log(""); - } -} - -function _displayPreviousRunErrors( - state: UiState, - result: PreviousRunErrorDeploymentResult -) { - console.log(""); - console.log( - chalk.bold( - `⛔ Deployment cancelled due to failed or timed out futures on a previous run of module ${chalk.italic( - state.moduleName ?? "unknown" - )}` - ) - ); - console.log(""); - console.log( - `These futures will need to be rerun; use the ${chalk.italic( - "wipe" - )} task to reset them:` - ); - console.log(""); - - for (const [futureId] of Object.entries(result.errors)) { - console.log(` - ${futureId}`); - } -} - -function _displayExecutionErrors( - state: UiState, - result: ExecutionErrorDeploymentResult -) { - console.log(""); - console.log( - // [ ${state.moduleName ?? "unknown"} ] successfully deployed - chalk.bold(`[ ${chalk.italic(state.moduleName ?? "unknown")} ] failed ⛔`) - ); - console.log(""); - - if (result.timedOut.length > 0) { - console.log( - chalk.yellow("Transaction remains unconfirmed after fee bump:") - ); - console.log(""); - - for (const { futureId } of Object.values(result.timedOut)) { - console.log(` - ${futureId}`); - } - console.log(""); - console.log( - "Consider increasing the fee in your config.\nCheck out the docs to learn more: " - ); - } - - if (result.failed.length > 0) { - console.log(chalk.red("Failures:")); - console.log(""); - - for (const { futureId, networkInteractionId, error } of Object.values( - result.failed - )) { - console.log(` - ${futureId}/${networkInteractionId}: ${error}`); - } - } - - if (result.held.length > 0) { - console.log(chalk.yellow("Held:")); - console.log(""); - - for (const { futureId, heldId, reason } of Object.values(result.held)) { - console.log(` - ${futureId}/${heldId}: ${reason}`); - } - } -} diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 8efb46260b..ef7d73eadb 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -35,7 +35,7 @@ import { import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; -import { displayDeploymentComplete } from "./helpers/display-deployment-complete"; +import { calculateDeploymentCompleteDisplay } from "./helpers/calculate-deployment-complete-display"; import { displayStartingMessage } from "./helpers/display-starting-message"; import { UiBatches, @@ -347,9 +347,10 @@ export class PrettyEventHandler implements ExecutionEventListener { if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { this._redisplayCurrentBatch(); + this._clearUpToHeight(1); } - displayDeploymentComplete(this.state, event); + console.log(calculateDeploymentCompleteDisplay(event, this.state)); } public reconciliationWarnings(event: ReconciliationWarningsEvent): void { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 5955a64c1d..55f8f1e7e7 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -22,7 +22,8 @@ describe("ui - calculate batch display", () => { it("should render a batch with a single running future", () => { const expectedText = testFormat` Batch #1 - Executing ExampleModule#Token...`; + Executing ExampleModule#Token... + `; assertBatchText( [ @@ -33,7 +34,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#Token", }, ], - 2, + 3, expectedText ); }); @@ -41,7 +42,8 @@ describe("ui - calculate batch display", () => { it("should render a batch with a single completed future", () => { const expectedText = testFormat` Batch #1 - Executed ExampleModule#Token`; + Executed ExampleModule#Token + `; assertBatchText( [ @@ -52,7 +54,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#Token", }, ], - 2, + 3, expectedText ); }); @@ -60,7 +62,8 @@ describe("ui - calculate batch display", () => { it("should render a batch with a single failed future", () => { const expectedText = testFormat` Batch #1 - Failed ExampleModule#Token`; + Failed ExampleModule#Token + `; assertBatchText( [ @@ -72,7 +75,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#Token", }, ], - 2, + 3, expectedText ); }); @@ -80,7 +83,8 @@ describe("ui - calculate batch display", () => { it("should render a batch with a single held future", () => { const expectedText = testFormat` Batch #1 - Held ExampleModule#Token`; + Held ExampleModule#Token + `; assertBatchText( [ @@ -93,7 +97,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#Token", }, ], - 2, + 3, expectedText ); }); @@ -104,7 +108,8 @@ describe("ui - calculate batch display", () => { Failed ExampleModule#Dex Held ExampleModule#ENS Executed ExampleModule#Router - Executing ExampleModule#Token...`; + Executing ExampleModule#Token... + `; assertBatchText( [ @@ -136,7 +141,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#ENS", }, ], - 5, + 6, expectedText ); }); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts new file mode 100644 index 0000000000..210c02f211 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -0,0 +1,265 @@ +import { + DeploymentCompleteEvent, + DeploymentResultType, + ExecutionErrorDeploymentResult, + ExecutionEventType, + PreviousRunErrorDeploymentResult, + ReconciliationErrorDeploymentResult, + ValidationErrorDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateDeploymentCompleteDisplay } from "../../../src/ui/helpers/calculate-deployment-complete-display"; + +describe("ui - calculate deployment complete display", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0x0011223344556677889900112233445566778899"; + + describe("successful deployment", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + + [ MyModule ] successfully deployed 🚀 + + ${chalk.bold("Deployed Addresses")} + + MyModule#Token - 0x1F98431c8aD98523631AE4a59f267346ea31F984 + MyModule#AnotherToken - 0x0011223344556677889900112233445566778899`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + }, + }, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + + it("should render a sucessful deployment with no contracts", () => { + const expectedText = testFormat(` + + [ MyModule ] successfully deployed 🚀 + + ${chalk.bold("Deployed Addresses")} + + ${chalk.italic("No contracts were deployed")}`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: {}, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("validation failures", () => { + it("should render multiple validation errors on multiple futures", () => { + const expectedText = testFormat(` + + [ MyModule ] validation failed ⛔ + + MyModule:MyContract errors: + - The number of params does not match the constructor + - The name of the contract is invalid + + MyModule:AnotherContract errors: + - No library provided`); + + const result: ValidationErrorDeploymentResult = { + type: DeploymentResultType.VALIDATION_ERROR, + errors: { + "MyModule:MyContract": [ + "The number of params does not match the constructor", + "The name of the contract is invalid", + ], + "MyModule:AnotherContract": ["No library provided"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("reconciliation errors", () => { + it("should render a multiple reconciliation errors on multiple futures", () => { + const expectedText = testFormat(` + + [ MyModule ] reconciliation failed ⛔ + + MyModule:MyContract errors: + - The params don't match + - The value doesn't match + + MyModule:AnotherContract errors: + - The artifact bytecode has changed`); + + const result: ReconciliationErrorDeploymentResult = { + type: DeploymentResultType.RECONCILIATION_ERROR, + errors: { + "MyModule:MyContract": [ + "The params don't match", + "The value doesn't match", + ], + "MyModule:AnotherContract": ["The artifact bytecode has changed"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("previous run errors", () => { + it("should render a multiple previous run errors on multiple futures", () => { + const expectedText = testFormat(` + + [ MyModule ] deployment cancelled ⛔ + + These futures failed or timed out on a previous run: + - MyModule:MyContract + - MyModule:AnotherContract + + Use the ${chalk.italic("wipe")} task to reset them. + Check out the docs to learn more: `); + + const result: PreviousRunErrorDeploymentResult = { + type: DeploymentResultType.PREVIOUS_RUN_ERROR, + errors: { + "MyModule:MyContract": ["The previous run failed"], + "MyModule:AnotherContract": ["The previous run timed out"], + }, + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + }); + + describe("execution errors", () => { + it("should render an execution failure with multiple of each problem type", () => { + const expectedText = testFormat(` + + [ MyModule ] failed ⛔ + + Transaction remains unconfirmed after fee bump: + - MyModule:MyContract1 + - MyModule:AnotherContract1 + + Consider increasing the fee in your config. + Check out the docs to learn more: + + Failures: + - MyModule:MyContract3/1: Reverted with reason x + - MyModule:AnotherContract3/3: Reverted with reason y + + Held: + - MyModule:MyContract2/1: Vote is not complete + - MyModule:AnotherContract2/3: Server timed out`); + + const result: ExecutionErrorDeploymentResult = { + type: DeploymentResultType.EXECUTION_ERROR, + started: [], + timedOut: [ + { futureId: "MyModule:MyContract1", networkInteractionId: 1 }, + { futureId: "MyModule:AnotherContract1", networkInteractionId: 3 }, + ], + held: [ + { + futureId: "MyModule:MyContract2", + heldId: 1, + reason: "Vote is not complete", + }, + { + futureId: "MyModule:AnotherContract2", + heldId: 3, + reason: "Server timed out", + }, + ], + failed: [ + { + futureId: "MyModule:MyContract3", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule:AnotherContract3", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: [], + }; + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + }); + + assert.equal(actualText, expectedText); + }); + }); +}); + +function testFormat(expected: string): string { + return expected + .toString() + .substring(1) // Remove the first newline + .split("\n") + .map((line) => line.substring(8)) // remove prefix whitespace + .join("\n"); +} diff --git a/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts index 5af59e6927..4323e8317b 100644 --- a/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts +++ b/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts @@ -1,6 +1,7 @@ import { DeploymentResultType, ExecutionErrorDeploymentResult, + PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, ValidationErrorDeploymentResult, } from "@nomicfoundation/ignition-core"; @@ -57,6 +58,26 @@ describe("display error deployment result", () => { }); }); + describe("previous run", () => { + it("should display a previous run error", () => { + const result: PreviousRunErrorDeploymentResult = { + type: DeploymentResultType.PREVIOUS_RUN_ERROR, + errors: { + "MyModule:MyContract": ["The previous run failed"], + "MyModule:AnotherContract": ["The previous run timed out"], + }, + }; + + assert.equal( + errorDeploymentResultToExceptionMessage(result), + `The deployment wasn't run because of the following errors in a previous run: + + * MyModule:MyContract: The previous run failed + * MyModule:AnotherContract: The previous run timed out` + ); + }); + }); + describe("execution", () => { it("should display an execution error with timeouts", () => { const result: ExecutionErrorDeploymentResult = { From b62e748bb2a5a9367cb9edbe5cfee122630bf9ff Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 13 Oct 2023 10:16:35 +0100 Subject: [PATCH 1060/1302] fix: timeout display (#546) Redisplay batches on every future init and complete event. Not all events were triggering a redisplay of the batch, now both init and complete events do. Init events where overwriting the batch init for futures, and setting them to pending (aka timeout). The fix is to set them to unstarted (the same as the batch init). This fixes the flash of pending/timed out displayed for futures. Fixes #545. --- .../src/ui/helpers/calculate-batch-display.ts | 2 +- .../src/ui/pretty-event-handler.ts | 161 ++++++------------ packages/hardhat-plugin/src/ui/types.ts | 8 +- 3 files changed, 61 insertions(+), 110 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts index a811982dc1..fa3f578bc7 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -27,7 +27,7 @@ function _futureStatus(future: UiFuture): string { case UiFutureStatusType.SUCCESS: { return ` Executed ${future.futureId}`; } - case UiFutureStatusType.PENDING: { + case UiFutureStatusType.TIMEDOUT: { return ` Pending ${future.futureId}`; } case UiFutureStatusType.ERRORED: { diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index ef7d73eadb..c74fbbb7e3 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -42,6 +42,7 @@ import { UiFuture, UiFutureErrored, UiFutureHeld, + UiFutureStatus, UiFutureStatusType, UiFutureSuccess, UiState, @@ -134,155 +135,65 @@ export class PrettyEventHandler implements ExecutionEventListener { public deploymentExecutionStateInitialize( event: DeploymentExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.PENDING, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusInitializedAndRedisplayBatch(event); } public deploymentExecutionStateComplete( event: DeploymentExecutionStateCompleteEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: this._getFutureStatusFromEventResult(event.result), - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; - - this._redisplayCurrentBatch(); + this._setFutureStatusCompleteAndRedisplayBatch(event); } public callExecutionStateInitialize( event: CallExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.PENDING, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusInitializedAndRedisplayBatch(event); } public callExecutionStateComplete( event: CallExecutionStateCompleteEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: this._getFutureStatusFromEventResult(event.result), - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusCompleteAndRedisplayBatch(event); } public staticCallExecutionStateInitialize( event: StaticCallExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.PENDING, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusInitializedAndRedisplayBatch(event); } public staticCallExecutionStateComplete( event: StaticCallExecutionStateCompleteEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: this._getFutureStatusFromEventResult(event.result), - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusCompleteAndRedisplayBatch(event); } public sendDataExecutionStateInitialize( event: SendDataExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.PENDING, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusInitializedAndRedisplayBatch(event); } public sendDataExecutionStateComplete( event: SendDataExecutionStateCompleteEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: this._getFutureStatusFromEventResult(event.result), - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusCompleteAndRedisplayBatch(event); } public contractAtExecutionStateInitialize( event: ContractAtExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.SUCCESS, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); } public readEventArgumentExecutionStateInitialize( event: ReadEventArgExecutionStateInitializeEvent ): void { - const updatedFuture: UiFuture = { - futureId: event.futureId, - status: { - type: UiFutureStatusType.SUCCESS, - }, - }; - - this.state = { - ...this.state, - batches: this._applyUpdateToBatchFuture(updatedFuture), - }; + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); } public batchInitialize(event: BatchInitializeEvent): void { @@ -367,6 +278,46 @@ export class PrettyEventHandler implements ExecutionEventListener { }; } + private _setFutureStatusInitializedAndRedisplayBatch({ + futureId, + }: { + futureId: string; + }) { + this._setFutureStatusAndRedisplayBatch(futureId, { + type: UiFutureStatusType.UNSTARTED, + }); + } + + private _setFutureStatusCompleteAndRedisplayBatch({ + futureId, + result, + }: { + futureId: string; + result: ExecutionEventResult; + }) { + this._setFutureStatusAndRedisplayBatch( + futureId, + this._getFutureStatusFromEventResult(result) + ); + } + + private _setFutureStatusAndRedisplayBatch( + futureId: string, + status: UiFutureStatus + ) { + const updatedFuture: UiFuture = { + futureId, + status, + }; + + this.state = { + ...this.state, + batches: this._applyUpdateToBatchFuture(updatedFuture), + }; + + this._redisplayCurrentBatch(); + } + private _applyUpdateToBatchFuture(updatedFuture: UiFuture): UiBatches { const batches: UiBatches = []; @@ -461,7 +412,7 @@ export class PrettyEventHandler implements ExecutionEventListener { const f: UiFuture = { futureId, status: { - type: UiFutureStatusType.PENDING, + type: UiFutureStatusType.TIMEDOUT, }, }; diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 864c3d2b85..d9e3d00734 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -3,7 +3,7 @@ import { DeploymentResult } from "@nomicfoundation/ignition-core"; export enum UiFutureStatusType { UNSTARTED = "UNSTARTED", SUCCESS = "SUCCESS", - PENDING = "PENDING", + TIMEDOUT = "TIMEDOUT", ERRORED = "ERRORED", HELD = "HELD", } @@ -23,8 +23,8 @@ export interface UiFutureSuccess { result?: string; } -export interface UiFuturePending { - type: UiFutureStatusType.PENDING; +export interface UiFutureTimedOut { + type: UiFutureStatusType.TIMEDOUT; } export interface UiFutureErrored { @@ -41,7 +41,7 @@ export interface UiFutureHeld { export type UiFutureStatus = | UiFutureUnstarted | UiFutureSuccess - | UiFuturePending + | UiFutureTimedOut | UiFutureErrored | UiFutureHeld; From f6a8dfe9225c9a3ad98b6ddf6ca0d9c5451c46bf Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 13 Oct 2023 16:40:28 +0100 Subject: [PATCH 1061/1302] feat/update status UI (#548) Update the different status displays to match the new styling of deploy. The status display has been separated out from the console logging, so that the display can be brought under test. Resolves #550 --- packages/hardhat-plugin/src/index.ts | 115 +---------- .../calculate-deployment-complete-display.ts | 26 ++- .../calculate-deployment-status-display.ts | 100 ++++++++++ .../calculate-deployment-complete-display.ts | 30 +-- .../calculate-deployment-status-display.ts | 185 ++++++++++++++++++ 5 files changed, 323 insertions(+), 133 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3056c91af0..472fe28948 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -4,13 +4,13 @@ import { IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; -import chalk from "chalk"; import { readdirSync } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { NomicLabsHardhatPluginError, lazyObject } from "hardhat/plugins"; import path from "path"; import "./type-extensions"; +import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -253,86 +253,7 @@ ignitionScope throw e; } - if (statusResult.started.length > 0) { - console.log(""); - console.log( - chalk.bold( - `⛔ Deployment ${deploymentId} has not fully completed, there are futures have started but not finished` - ) - ); - console.log(""); - - for (const futureId of Object.values(statusResult.started)) { - console.log(` - ${futureId}`); - } - - console.log(""); - return; - } - - if ( - statusResult.timedOut.length > 0 || - statusResult.failed.length > 0 || - statusResult.held.length > 0 - ) { - console.log(""); - console.log(chalk.bold(toErrorResultHeading(deploymentId, statusResult))); - console.log(""); - - if (statusResult.timedOut.length > 0) { - console.log(chalk.yellow("There are timed-out futures:")); - console.log(""); - - for (const { futureId } of Object.values(statusResult.timedOut)) { - console.log(` - ${futureId}`); - } - - console.log(""); - } - - if (statusResult.failed.length > 0) { - console.log(chalk.red("There are failed futures")); - console.log(""); - - for (const { futureId, networkInteractionId, error } of Object.values( - statusResult.failed - )) { - console.log(` - ${futureId}/${networkInteractionId}: ${error}`); - } - - console.log(""); - } - - if (statusResult.held.length > 0) { - console.log(chalk.yellow("There are futures that the strategy held:")); - console.log(""); - - for (const { futureId, heldId, reason } of Object.values( - statusResult.held - )) { - console.log(` - ${futureId}/${heldId}: ${reason}`); - } - - console.log(""); - } - - return; - } - - console.log(""); - console.log(chalk.bold(`🚀 Deployment ${deploymentId} Complete `)); - console.log(""); - - if (Object.values(statusResult.contracts).length === 0) { - console.log(chalk.italic("No contracts were deployed")); - } else { - console.log("Deployed Addresses"); - console.log(""); - - for (const contract of Object.values(statusResult.contracts)) { - console.log(`${contract.id} - ${contract.address}`); - } - } + console.log(calculateDeploymentStatusDisplay(deploymentId, statusResult)); }); ignitionScope @@ -412,35 +333,3 @@ function resolveParametersString(paramString: string): DeploymentParameters { process.exit(0); } } - -function toErrorResultHeading( - deploymentId: string, - statusResult: StatusResult -): string { - const didTimeout = statusResult.timedOut.length > 0; - const didFailed = statusResult.failed.length > 0; - const didHeld = statusResult.held.length > 0; - - let reasons = ""; - if (didTimeout && didFailed && didHeld) { - reasons = "timeouts, failures and holds"; - } else if (didTimeout && didFailed) { - reasons = "timeouts and failures"; - } else if (didFailed && didHeld) { - reasons = "failures and holds"; - } else if (didTimeout && didHeld) { - reasons = "timeouts and holds"; - } else if (didTimeout) { - reasons = "timeouts"; - } else if (didFailed) { - reasons = "failures"; - } else if (didHeld) { - reasons = "holds"; - } - - return chalk.bold( - `⛔ Deployment ${deploymentId} did ${chalk.bold( - "not" - )} complete as there were ${reasons}` - ); -} diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts index ada652645c..31cc990582 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -65,11 +65,13 @@ function _displayValidationErrors( let text = ` [ ${moduleName} ] validation failed ⛔ +The module contains futures that would fail to execute: + `; text += Object.entries(result.errors) .map(([futureId, errors]) => { - let futureSection = `${futureId} errors:\n`; + let futureSection = `${futureId}:\n`; futureSection += errors.map((error) => ` - ${error}`).join("\n"); @@ -77,6 +79,8 @@ function _displayValidationErrors( }) .join("\n\n"); + text += `\n\nUpdate the invalid futures and rerun the deployment.`; + return text; } @@ -87,11 +91,13 @@ function _displayReconciliationErrors( let text = ` [ ${moduleName} ] reconciliation failed ⛔ +The module contains changes to executed futures: + `; text += Object.entries(result.errors) .map(([futureId, errors]) => { - let errorSection = `${futureId} errors:\n`; + let errorSection = `${futureId}:\n`; errorSection += errors.map((error) => ` - ${error}`).join("\n"); @@ -99,6 +105,8 @@ function _displayReconciliationErrors( }) .join("\n\n"); + text += `\n\nConsider modifying your module to remove the inconsistencies with deployed futures.`; + return text; } @@ -114,9 +122,7 @@ function _displayPreviousRunErrors( .map((futureId) => ` - ${futureId}`) .join("\n"); - text += `\n\nUse the ${chalk.italic( - "wipe" - )} task to reset them.\nCheck out the docs to learn more: `; + text += `\n\nUse the ${chalk.italic("wipe")} task to reset them.`; return text; } @@ -130,20 +136,19 @@ function _displayExecutionErrors( let text = `\n[ ${moduleName} ] failed ⛔\n\n`; if (result.timedOut.length > 0) { - let timedOutSection = `Transaction remains unconfirmed after fee bump:\n`; + let timedOutSection = `Transactions remain unconfirmed after fee bump:\n`; timedOutSection += Object.values(result.timedOut) .map(({ futureId }) => ` - ${futureId}`) .join("\n"); - timedOutSection += - "\n\nConsider increasing the fee in your config.\nCheck out the docs to learn more: "; + timedOutSection += "\n\nConsider increasing the fee in your config."; sections.push(timedOutSection); } if (result.failed.length > 0) { - let failedSection = `Failures:\n`; + let failedSection = `Futures failed during execution:\n`; failedSection += Object.values(result.failed) .map( @@ -152,6 +157,9 @@ function _displayExecutionErrors( ) .join("\n"); + failedSection += + "\n\nConsider addressing the cause of the errors and rerunning the deployment."; + sections.push(failedSection); } diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts new file mode 100644 index 0000000000..843f4e976e --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts @@ -0,0 +1,100 @@ +import { StatusResult } from "@nomicfoundation/ignition-core"; +import chalk from "chalk"; + +export function calculateDeploymentStatusDisplay( + deploymentId: string, + statusResult: StatusResult +): string { + if (statusResult.started.length > 0) { + return _calculateStartedButUnfinished(deploymentId, statusResult); + } + + if ( + statusResult.timedOut.length > 0 || + statusResult.failed.length > 0 || + statusResult.held.length > 0 + ) { + return _calculateFailed(deploymentId, statusResult); + } + + return _calculateSuccess(deploymentId, statusResult); +} + +function _calculateSuccess(deploymentId: string, statusResult: StatusResult) { + let successText = `\n[ ${deploymentId} ] successfully deployed 🚀\n\n`; + + if (Object.values(statusResult.contracts).length === 0) { + successText += chalk.italic("No contracts were deployed"); + } else { + successText += `${chalk.bold("Deployed Addresses")}\n\n`; + + successText += Object.values(statusResult.contracts) + .map((contract) => `${contract.id} - ${contract.address}`) + .join("\n"); + } + + return successText; +} + +function _calculateStartedButUnfinished( + deploymentId: string, + statusResult: StatusResult +) { + let startedText = `\n[ ${deploymentId} ] has futures that have started but not finished ⛔\n\n`; + + startedText += Object.values(statusResult.started) + .map((futureId) => ` - ${futureId}`) + .join("\n"); + + return startedText; +} + +function _calculateFailed(deploymentId: string, statusResult: StatusResult) { + let failedExecutionText = `\n[ ${deploymentId} ] failed ⛔\n`; + + const sections: string[] = []; + + if (statusResult.timedOut.length > 0) { + let timedOutSection = `\nTransactions remain unconfirmed after fee bump:\n`; + + timedOutSection += Object.values(statusResult.timedOut) + .map(({ futureId }) => ` - ${futureId}`) + .join("\n"); + + timedOutSection += "\n\nConsider increasing the fee in your config."; + + sections.push(timedOutSection); + } + + if (statusResult.failed.length > 0) { + let failedSection = `\nFutures failed during execution:\n`; + + failedSection += Object.values(statusResult.failed) + .map( + ({ futureId, networkInteractionId, error }) => + ` - ${futureId}/${networkInteractionId}: ${error}` + ) + .join("\n"); + + failedSection += + "\n\nConsider addressing the cause of the errors and rerunning the deployment."; + + sections.push(failedSection); + } + + if (statusResult.held.length > 0) { + let heldSection = `\nFutures where held by the strategy:\n`; + + heldSection += Object.values(statusResult.held) + .map( + ({ futureId, heldId, reason }) => ` - ${futureId}/${heldId}: ${reason}` + ) + .join("\n"); + + sections.push(heldSection); + } + + failedExecutionText += sections.join("\n"); + + return failedExecutionText; +} diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index 210c02f211..bff11fadb1 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -84,12 +84,16 @@ describe("ui - calculate deployment complete display", () => { [ MyModule ] validation failed ⛔ - MyModule:MyContract errors: + The module contains futures that would fail to execute: + + MyModule:MyContract: - The number of params does not match the constructor - The name of the contract is invalid - MyModule:AnotherContract errors: - - No library provided`); + MyModule:AnotherContract: + - No library provided + + Update the invalid futures and rerun the deployment.`); const result: ValidationErrorDeploymentResult = { type: DeploymentResultType.VALIDATION_ERROR, @@ -121,12 +125,16 @@ describe("ui - calculate deployment complete display", () => { [ MyModule ] reconciliation failed ⛔ - MyModule:MyContract errors: + The module contains changes to executed futures: + + MyModule:MyContract: - The params don't match - The value doesn't match - MyModule:AnotherContract errors: - - The artifact bytecode has changed`); + MyModule:AnotherContract: + - The artifact bytecode has changed + + Consider modifying your module to remove the inconsistencies with deployed futures.`); const result: ReconciliationErrorDeploymentResult = { type: DeploymentResultType.RECONCILIATION_ERROR, @@ -162,8 +170,7 @@ describe("ui - calculate deployment complete display", () => { - MyModule:MyContract - MyModule:AnotherContract - Use the ${chalk.italic("wipe")} task to reset them. - Check out the docs to learn more: `); + Use the ${chalk.italic("wipe")} task to reset them.`); const result: PreviousRunErrorDeploymentResult = { type: DeploymentResultType.PREVIOUS_RUN_ERROR, @@ -192,17 +199,18 @@ describe("ui - calculate deployment complete display", () => { [ MyModule ] failed ⛔ - Transaction remains unconfirmed after fee bump: + Transactions remain unconfirmed after fee bump: - MyModule:MyContract1 - MyModule:AnotherContract1 Consider increasing the fee in your config. - Check out the docs to learn more: - Failures: + Futures failed during execution: - MyModule:MyContract3/1: Reverted with reason x - MyModule:AnotherContract3/3: Reverted with reason y + Consider addressing the cause of the errors and rerunning the deployment. + Held: - MyModule:MyContract2/1: Vote is not complete - MyModule:AnotherContract2/3: Server timed out`); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts new file mode 100644 index 0000000000..c6d750e1b1 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -0,0 +1,185 @@ +import { StatusResult } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateDeploymentStatusDisplay } from "../../../src/ui/helpers/calculate-deployment-status-display"; + +describe("ui - calculate deployment status display", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0x0011223344556677889900112233445566778899"; + + const exampleStatusResult = { + started: [], + timedOut: [], + held: [], + failed: [], + successful: [], + contracts: {}, + }; + + describe("successful deployment", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + + [ deployment-01 ] successfully deployed 🚀 + + ${chalk.bold("Deployed Addresses")} + + MyModule#Token - 0x1F98431c8aD98523631AE4a59f267346ea31F984 + MyModule#AnotherToken - 0x0011223344556677889900112233445566778899`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + successful: ["MyModule#Token", "MyModule#AnotherToken"], + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + }, + }, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + + it("should render a sucessful deployment with no deploys", () => { + const expectedText = testFormat(` + + [ deployment-01 ] successfully deployed 🚀 + + ${chalk.italic("No contracts were deployed")}`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + successful: ["MyModule#a_call"], + contracts: {}, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); + + describe("failed deployment", () => { + it("should render an execution failure with multiple of each problem type", () => { + const expectedText = testFormat(` + + [ deployment-01 ] failed ⛔ + + Transactions remain unconfirmed after fee bump: + - MyModule:MyContract1 + - MyModule:AnotherContract1 + + Consider increasing the fee in your config. + + Futures failed during execution: + - MyModule:MyContract3/1: Reverted with reason x + - MyModule:AnotherContract3/3: Reverted with reason y + + Consider addressing the cause of the errors and rerunning the deployment. + + Futures where held by the strategy: + - MyModule:MyContract2/1: Vote is not complete + - MyModule:AnotherContract2/3: Server timed out`); + + const statusResult: StatusResult = { + started: [], + timedOut: [ + { futureId: "MyModule:MyContract1", networkInteractionId: 1 }, + { futureId: "MyModule:AnotherContract1", networkInteractionId: 3 }, + ], + held: [ + { + futureId: "MyModule:MyContract2", + heldId: 1, + reason: "Vote is not complete", + }, + { + futureId: "MyModule:AnotherContract2", + heldId: 3, + reason: "Server timed out", + }, + ], + failed: [ + { + futureId: "MyModule:MyContract3", + networkInteractionId: 1, + error: "Reverted with reason x", + }, + { + futureId: "MyModule:AnotherContract3", + networkInteractionId: 3, + error: "Reverted with reason y", + }, + ], + successful: ["MyModule#Token", "MyModule#AnotherToken"], + contracts: { + "MyModule#Token": { + id: "MyModule#Token", + address: exampleAddress, + contractName: "Token", + }, + "MyModule#AnotherToken": { + id: "MyModule#AnotherToken", + address: differentAddress, + contractName: "AnotherToken", + }, + }, + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); + + describe("deployment with started but unfinished futures (e.g. simulation errors)", () => { + it("should render a sucessful deployment", () => { + const expectedText = testFormat(` + + [ deployment-01 ] has futures that have started but not finished ⛔ + + - MyModule#Token + - MyModule#AnotherToken`); + + const statusResult: StatusResult = { + ...exampleStatusResult, + started: ["MyModule#Token", "MyModule#AnotherToken"], + }; + + const actualText = calculateDeploymentStatusDisplay( + "deployment-01", + statusResult + ); + + assert.equal(actualText, expectedText); + }); + }); +}); + +function testFormat(expected: string): string { + return expected + .toString() + .substring(1) // Remove the first newline + .split("\n") + .map((line) => line.substring(8)) // remove prefix whitespace + .join("\n"); +} From 933b1e9aecc32ebd8121eba8f163f10d6302ab0d Mon Sep 17 00:00:00 2001 From: John Kane Date: Sun, 15 Oct 2023 14:25:01 +0100 Subject: [PATCH 1062/1302] feat: update the default deployment id template The template changes from `network-` to `chain-`. There is now also a validation test against the user provided deployment id to ensure it matches our rules. Specifically that it starts with an upper or lowercase letter, and then only includes alpha numerics, underscores or dashes. Resolves #551. --- .../deployed_addresses.json | 0 .../journal.jsonl | 0 packages/hardhat-plugin/src/index.ts | 5 ++- .../src/utils/resolve-deployment-id.ts | 43 +++++++++++++++++++ .../test/utils/resolve-deployment-id.ts | 28 ++++++++++++ 5 files changed, 74 insertions(+), 2 deletions(-) rename packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/{network-31337 => chain-31337}/deployed_addresses.json (100%) rename packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/{network-31337 => chain-31337}/journal.jsonl (100%) create mode 100644 packages/hardhat-plugin/src/utils/resolve-deployment-id.ts create mode 100644 packages/hardhat-plugin/test/utils/resolve-deployment-id.ts diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/network-31337/deployed_addresses.json b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/network-31337/deployed_addresses.json rename to packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/network-31337/journal.jsonl b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/network-31337/journal.jsonl rename to packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 472fe28948..b600241d82 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -11,6 +11,7 @@ import path from "path"; import "./type-extensions"; import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; +import { resolveDeploymentId } from "./utils/resolve-deployment-id"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -67,7 +68,7 @@ ignitionScope }: { modulePath: string; parameters?: string; - deploymentId: string; + deploymentId: string | undefined; }, hre ) => { @@ -128,7 +129,7 @@ ignitionScope method: "eth_accounts", })) as string[]; - const deploymentId = givenDeploymentId ?? `network-${chainId}`; + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); const deploymentDir = hre.network.name === "hardhat" diff --git a/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts b/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts new file mode 100644 index 0000000000..ad9aaf2504 --- /dev/null +++ b/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts @@ -0,0 +1,43 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +/** + * A regex that captures Ignitions rules for deployment-ids, specifically + * that they can only contain alphanumerics, dashes and underscores, + * and that they start with a letter. + */ +const ignitionDeploymentIdRegex = /^[a-zA-Z][a-zA-Z0-9_\-]*$/; + +/** + * Determine the deploymentId, using either the user provided id, + * throwing if it is invalid, or generating one from the chainId + * if none was provided. + * + * @param givenDeploymentId - the user provided deploymentId if + * they provided one undefined otherwise + * @param chainId - the chainId of the network being deployed to + * + * @returns the deploymentId + */ +export function resolveDeploymentId( + givenDeploymentId: string | undefined, + chainId: number +) { + if ( + givenDeploymentId !== undefined && + !_isValidDeploymentIdentifier(givenDeploymentId) + ) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `The deployment-id "${givenDeploymentId}" contains banned characters, ids can only contain alphanumerics, dashes or underscores` + ); + } + + return givenDeploymentId ?? `chain-${chainId}`; +} + +/** + * Determine if the given identifier the rules for a valid deployment id. + * */ +export function _isValidDeploymentIdentifier(identifier: string): boolean { + return ignitionDeploymentIdRegex.test(identifier); +} diff --git a/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts b/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts new file mode 100644 index 0000000000..8532411add --- /dev/null +++ b/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts @@ -0,0 +1,28 @@ +import { assert } from "chai"; + +import { resolveDeploymentId } from "../../src/utils/resolve-deployment-id"; + +describe("deploy id rules", () => { + const exampleChainId = 31337; + + it("should use the user provided id if one is provided", () => { + const deploymentId = resolveDeploymentId( + "my-deployment-id", + exampleChainId + ); + + assert.equal(deploymentId, "my-deployment-id"); + }); + + it("should generate a default id based on the chainId if the user provided no deploymentId", () => { + const deploymentId = resolveDeploymentId(undefined, exampleChainId); + + assert.equal(deploymentId, "chain-31337"); + }); + + it("should throw if the user provided an invalid deploymentId", () => { + assert.throws(() => { + resolveDeploymentId("deployment/test", exampleChainId); + }, /The deployment-id "deployment\/test" contains banned characters, ids can only contain alphanumerics, dashes or underscores/); + }); +}); From 7448290d9a385834c14b2d1594f256df12bbbb95 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Oct 2023 09:58:54 +0100 Subject: [PATCH 1063/1302] improvement: remove blank line from start of deploy The blank line is also removed from status displays. Resolves #554. --- .../ui/helpers/calculate-deploying-module-panel.ts | 3 +-- .../calculate-deployment-complete-display.ts | 13 +++++-------- .../helpers/calculate-deployment-status-display.ts | 6 +++--- .../hardhat-plugin/src/ui/pretty-event-handler.ts | 1 - .../calculate-deployment-complete-display.ts | 6 ------ .../helpers/calculate-deployment-status-display.ts | 4 ---- 6 files changed, 9 insertions(+), 24 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts index 694e98f84b..5066120a81 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -3,8 +3,7 @@ import chalk from "chalk"; import { UiState } from "../types"; export function calculateDeployingModulePanel(state: UiState): string { - return ` -Hardhat Ignition 🚀 + return `Hardhat Ignition 🚀 ${chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)} `; diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts index 31cc990582..0e2cbd1be1 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -38,8 +38,7 @@ function _displaySuccessfulDeployment( result: SuccessfulDeploymentResult, { moduleName }: { moduleName: string } ): string { - let text = ` -[ ${moduleName} ] successfully deployed 🚀 + let text = `[ ${moduleName} ] successfully deployed 🚀 ${chalk.bold("Deployed Addresses")} @@ -62,8 +61,7 @@ function _displayValidationErrors( result: ValidationErrorDeploymentResult, { moduleName }: { moduleName: string } ): string { - let text = ` -[ ${moduleName} ] validation failed ⛔ + let text = `[ ${moduleName} ] validation failed ⛔ The module contains futures that would fail to execute: @@ -88,8 +86,7 @@ function _displayReconciliationErrors( result: ReconciliationErrorDeploymentResult, { moduleName }: { moduleName: string } ): string { - let text = ` -[ ${moduleName} ] reconciliation failed ⛔ + let text = `[ ${moduleName} ] reconciliation failed ⛔ The module contains changes to executed futures: @@ -114,7 +111,7 @@ function _displayPreviousRunErrors( result: PreviousRunErrorDeploymentResult, { moduleName }: { moduleName: string } ): string { - let text = `\n[ ${moduleName} ] deployment cancelled ⛔\n\n`; + let text = `[ ${moduleName} ] deployment cancelled ⛔\n\n`; text += `These futures failed or timed out on a previous run:\n`; @@ -133,7 +130,7 @@ function _displayExecutionErrors( ) { const sections: string[] = []; - let text = `\n[ ${moduleName} ] failed ⛔\n\n`; + let text = `[ ${moduleName} ] failed ⛔\n\n`; if (result.timedOut.length > 0) { let timedOutSection = `Transactions remain unconfirmed after fee bump:\n`; diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts index 843f4e976e..637a8006d4 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts @@ -21,7 +21,7 @@ export function calculateDeploymentStatusDisplay( } function _calculateSuccess(deploymentId: string, statusResult: StatusResult) { - let successText = `\n[ ${deploymentId} ] successfully deployed 🚀\n\n`; + let successText = `[ ${deploymentId} ] successfully deployed 🚀\n\n`; if (Object.values(statusResult.contracts).length === 0) { successText += chalk.italic("No contracts were deployed"); @@ -40,7 +40,7 @@ function _calculateStartedButUnfinished( deploymentId: string, statusResult: StatusResult ) { - let startedText = `\n[ ${deploymentId} ] has futures that have started but not finished ⛔\n\n`; + let startedText = `[ ${deploymentId} ] has futures that have started but not finished ⛔\n\n`; startedText += Object.values(statusResult.started) .map((futureId) => ` - ${futureId}`) @@ -50,7 +50,7 @@ function _calculateStartedButUnfinished( } function _calculateFailed(deploymentId: string, statusResult: StatusResult) { - let failedExecutionText = `\n[ ${deploymentId} ] failed ⛔\n`; + let failedExecutionText = `[ ${deploymentId} ] failed ⛔\n`; const sections: string[] = []; diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index c74fbbb7e3..9c3f8c0336 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -258,7 +258,6 @@ export class PrettyEventHandler implements ExecutionEventListener { if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { this._redisplayCurrentBatch(); - this._clearUpToHeight(1); } console.log(calculateDeploymentCompleteDisplay(event, this.state)); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index bff11fadb1..b87cd6eae2 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -19,7 +19,6 @@ describe("ui - calculate deployment complete display", () => { describe("successful deployment", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - [ MyModule ] successfully deployed 🚀 ${chalk.bold("Deployed Addresses")} @@ -55,7 +54,6 @@ describe("ui - calculate deployment complete display", () => { it("should render a sucessful deployment with no contracts", () => { const expectedText = testFormat(` - [ MyModule ] successfully deployed 🚀 ${chalk.bold("Deployed Addresses")} @@ -81,7 +79,6 @@ describe("ui - calculate deployment complete display", () => { describe("validation failures", () => { it("should render multiple validation errors on multiple futures", () => { const expectedText = testFormat(` - [ MyModule ] validation failed ⛔ The module contains futures that would fail to execute: @@ -122,7 +119,6 @@ describe("ui - calculate deployment complete display", () => { describe("reconciliation errors", () => { it("should render a multiple reconciliation errors on multiple futures", () => { const expectedText = testFormat(` - [ MyModule ] reconciliation failed ⛔ The module contains changes to executed futures: @@ -163,7 +159,6 @@ describe("ui - calculate deployment complete display", () => { describe("previous run errors", () => { it("should render a multiple previous run errors on multiple futures", () => { const expectedText = testFormat(` - [ MyModule ] deployment cancelled ⛔ These futures failed or timed out on a previous run: @@ -196,7 +191,6 @@ describe("ui - calculate deployment complete display", () => { describe("execution errors", () => { it("should render an execution failure with multiple of each problem type", () => { const expectedText = testFormat(` - [ MyModule ] failed ⛔ Transactions remain unconfirmed after fee bump: diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index c6d750e1b1..6fbcf17750 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -20,7 +20,6 @@ describe("ui - calculate deployment status display", () => { describe("successful deployment", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - [ deployment-01 ] successfully deployed 🚀 ${chalk.bold("Deployed Addresses")} @@ -55,7 +54,6 @@ describe("ui - calculate deployment status display", () => { it("should render a sucessful deployment with no deploys", () => { const expectedText = testFormat(` - [ deployment-01 ] successfully deployed 🚀 ${chalk.italic("No contracts were deployed")}`); @@ -78,7 +76,6 @@ describe("ui - calculate deployment status display", () => { describe("failed deployment", () => { it("should render an execution failure with multiple of each problem type", () => { const expectedText = testFormat(` - [ deployment-01 ] failed ⛔ Transactions remain unconfirmed after fee bump: @@ -154,7 +151,6 @@ describe("ui - calculate deployment status display", () => { describe("deployment with started but unfinished futures (e.g. simulation errors)", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - [ deployment-01 ] has futures that have started but not finished ⛔ - MyModule#Token From f695a6b57e84ff436867e87f1b0d22fd3065c0fb Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Oct 2023 11:43:24 +0100 Subject: [PATCH 1064/1302] improvement: display warning on ephemeral network Display a warning message in the `deploy` task. It indicates that deployment is against an ephemeral network. The implementation is to add extra information to the start run event, specifically the `deploymentDir`, which then allows the UI event handler to determine if the deployment is ephemeral. This means injecting that information down throught the `deploy`/`deployer` barrier. This is not ideal, but I think it is legitimate to assume the UI should have access to all the passed in config. Resolves #553. --- packages/core/src/deploy.ts | 1 + packages/core/src/internal/deployer.ts | 15 +++++--- packages/core/src/types/execution-events.ts | 1 + .../ui/helpers/calculate-starting-message.ts | 30 ++++++++++++++++ .../ui/helpers/display-starting-message.ts | 12 ------- .../src/ui/pretty-event-handler.ts | 6 ++-- packages/hardhat-plugin/src/ui/types.ts | 1 + .../ui/helpers/calculate-batch-display.ts | 1 + .../ui/helpers/calculate-starting-message.ts | 34 +++++++++++++++++++ 9 files changed, 83 insertions(+), 18 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts delete mode 100644 packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index d8aa3d73d3..90860a9093 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -117,6 +117,7 @@ export async function deploy< const deployer = new Deployer( resolvedConfig, + deploymentDir, executionStrategy, jsonRpcClient, artifactResolver, diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index f44f00c13e..5c128ffaff 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -47,6 +47,7 @@ import { findStatus } from "./views/find-status"; export class Deployer { constructor( private readonly _config: DeployConfig, + private readonly _deploymentDir: string | undefined, private readonly _executionStrategy: ExecutionStrategy, private readonly _jsonRpcClient: JsonRpcClient, private readonly _artifactResolver: ArtifactResolver, @@ -74,7 +75,8 @@ export class Deployer { defaultSender: string ): Promise { let deploymentState = await this._getOrInitializeDeploymentState( - ignitionModule.id + ignitionModule.id, + this._deploymentDir ); const contracts = @@ -217,13 +219,14 @@ export class Deployer { } private async _getOrInitializeDeploymentState( - moduleId: string + moduleId: string, + deploymentDir: string | undefined ): Promise { const chainId = await this._jsonRpcClient.getChainId(); const deploymentState = await loadDeploymentState(this._deploymentLoader); if (deploymentState === undefined) { - this._emitDeploymentStartEvent(moduleId); + this._emitDeploymentStartEvent(moduleId, deploymentDir); return initializeDeploymentState(chainId, this._deploymentLoader); } @@ -236,7 +239,10 @@ export class Deployer { return deploymentState; } - private _emitDeploymentStartEvent(moduleId: string): void { + private _emitDeploymentStartEvent( + moduleId: string, + deploymentDir: string | undefined + ): void { if (this._executionEventListener === undefined) { return; } @@ -244,6 +250,7 @@ export class Deployer { this._executionEventListener.deploymentStart({ type: ExecutionEventType.DEPLOYMENT_START, moduleName: moduleId, + deploymentDir: deploymentDir ?? undefined, }); } diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 91d478de8e..ecc19467c7 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -75,6 +75,7 @@ export enum ExecutionEventType { export interface DeploymentStartEvent { type: ExecutionEventType.DEPLOYMENT_START; moduleName: string; + deploymentDir: string | undefined; } /** diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts new file mode 100644 index 0000000000..a199fe6f56 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts @@ -0,0 +1,30 @@ +import chalk from "chalk"; + +/** + * Display the temporary starting message. Note this does not print a newline. + * + * @param state - the UI state + */ +export function calculateStartingMessage({ + moduleName, + deploymentDir, +}: { + moduleName: string | null; + deploymentDir: string | undefined | null; +}): string { + const warningMessage = chalk.yellow( + chalk.bold( + `You are running Hardhat Ignition against an in-process instance of Hardhat Network. +This will execute the deployment, but the results will be lost. +You can use --network to deploy to a different network.` + ) + ); + + const startingMessage = `Hardhat Ignition starting for [ ${ + moduleName ?? "unknown" + } ]...`; + + return deploymentDir === undefined + ? `${warningMessage}\n\n${startingMessage}` + : startingMessage; +} diff --git a/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts b/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts deleted file mode 100644 index 58e8b4342a..0000000000 --- a/packages/hardhat-plugin/src/ui/helpers/display-starting-message.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { UiState } from "../types"; - -/** - * Display the temporary starting message. Note this does not print a newline. - * - * @param state - the UI state - */ -export function displayStartingMessage(state: UiState) { - process.stdout.write( - `Hardhat Ignition starting for [ ${state.moduleName ?? "unknown"} ]...` - ); -} diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 9c3f8c0336..72e9c5c333 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -36,7 +36,7 @@ import { import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; import { calculateDeploymentCompleteDisplay } from "./helpers/calculate-deployment-complete-display"; -import { displayStartingMessage } from "./helpers/display-starting-message"; +import { calculateStartingMessage } from "./helpers/calculate-starting-message"; import { UiBatches, UiFuture, @@ -54,6 +54,7 @@ export class PrettyEventHandler implements ExecutionEventListener { status: UiStateDeploymentStatus.UNSTARTED, chainId: null, moduleName: null, + deploymentDir: null, batches: [], currentBatch: 0, result: null, @@ -75,9 +76,10 @@ export class PrettyEventHandler implements ExecutionEventListener { ...this.state, status: UiStateDeploymentStatus.DEPLOYING, moduleName: event.moduleName, + deploymentDir: event.deploymentDir, }; - displayStartingMessage(this.state); + process.stdout.write(calculateStartingMessage(this.state)); } public runStart(event: RunStartEvent): void { diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index d9e3d00734..0c2e5066bb 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -56,6 +56,7 @@ export interface UiState { status: UiStateDeploymentStatus; chainId: number | null; moduleName: string | null; + deploymentDir: string | undefined | null; batches: UiBatches; currentBatch: number; result: DeploymentResult | null; diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 55f8f1e7e7..289bc40dfd 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -12,6 +12,7 @@ const exampleState: UiState = { status: UiStateDeploymentStatus.DEPLOYING, chainId: 31337, moduleName: "ExampleModule", + deploymentDir: "/users/example", batches: [], currentBatch: 1, result: null, diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts new file mode 100644 index 0000000000..1eb12ba144 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts @@ -0,0 +1,34 @@ +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateStartingMessage } from "../../../src/ui/helpers/calculate-starting-message"; + +describe("ui - calculate starting message display", () => { + it("should display the starting message", () => { + const expectedText = `Hardhat Ignition starting for [ MyModule ]...`; + + const actualText = calculateStartingMessage({ + moduleName: "MyModule", + deploymentDir: "/users/example", + }); + + assert.equal(actualText, expectedText); + }); + + it("should display the warning for an ephemeral network", () => { + const warningMessage = `You are running Hardhat Ignition against an in-process instance of Hardhat Network. +This will execute the deployment, but the results will be lost. +You can use --network to deploy to a different network.`; + + const expectedText = `${chalk.yellow( + chalk.bold(warningMessage) + )}\n\nHardhat Ignition starting for [ MyModule ]...`; + + const actualText = calculateStartingMessage({ + moduleName: "MyModule", + deploymentDir: undefined, + }); + + assert.equal(actualText, expectedText); + }); +}); From f72d1279159171576107373855c2e211b8621153 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 18:51:33 +0000 Subject: [PATCH 1065/1302] Define call ids based on the entire id of the contract --- packages/core/src/internal/module-builder.ts | 6 ++-- .../src/internal/utils/future-id-builders.ts | 26 +++++++++++++--- .../core/test/utils/future-id-builders.ts | 31 +++++++++++++++++-- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index e81aa16b7f..c015066615 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -494,7 +494,8 @@ class IgnitionModuleBuilderImplementation< const futureId = toCallFutureId( this._module.id, options.id, - contractFuture.contractName, + contractFuture.module.id, + contractFuture.id, functionName ); @@ -562,7 +563,8 @@ class IgnitionModuleBuilderImplementation< const futureId = toCallFutureId( this._module.id, options.id, - contractFuture.contractName, + contractFuture.module.id, + contractFuture.id, functionName ); diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index 0768e1b360..965ee5338a 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -4,6 +4,12 @@ */ const MODULE_SEPERATOR = "#"; +/** + * The separator in ids that depend on futures that belong to a submodule. + * This separator is used to split the submodule and the rest of the dependency's id. + */ +const SUBMODULE_SEPARATOR = "-"; + /** * The seperator in ids that indicated different subparts of the future key. */ @@ -43,13 +49,25 @@ export function toDeploymentFutureId( export function toCallFutureId( moduleId: string, userProvidedId: string | undefined, - contractName: string, + contractModuleId: string, + contractId: string, functionName: string ) { - const futureKey = - userProvidedId ?? `${contractName}${SUBKEY_SEPERATOR}${functionName}`; + if (userProvidedId !== undefined) { + return `${moduleId}${MODULE_SEPERATOR}${userProvidedId}`; + } - return `${moduleId}${MODULE_SEPERATOR}${futureKey}`; + // If the contract belongs to the call's module, we just need to add the function name + if (moduleId === contractModuleId) { + return `${contractId}${SUBKEY_SEPERATOR}${functionName}`; + } + + // We replace the MODULE_SEPARATOR for SUBMODULE_SEPARATOR + const submoduleContractId = `${contractModuleId}${SUBMODULE_SEPARATOR}${contractId.substring( + contractModuleId.length + MODULE_SEPERATOR.length + )}`; + + return `${moduleId}${MODULE_SEPERATOR}${submoduleContractId}${SUBKEY_SEPERATOR}${functionName}`; } /** diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index 74dcfaa9a0..7556a3d418 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -25,16 +25,41 @@ describe("future id rules", () => { }); describe("call ids", () => { - it("the fallback id should be built based on the contractName and function name", () => { + it("the fallback id should be built based on the contract id and function name if they belong to the same module", () => { assert.equal( - toCallFutureId("MyModule", undefined, "MyContract", "MyFunction"), + toCallFutureId( + "MyModule", + undefined, + "MyModule", + "MyModule#MyContract", + "MyFunction" + ), "MyModule#MyContract.MyFunction" ); }); + it("should name a call to a future coming from a module representing the submodule relationship, and including namespaced by module id", () => { + assert.equal( + toCallFutureId( + "MyModule", + undefined, + "Submodule", + "Submodule#MyContract", + "MyFunction" + ), + "MyModule#Submodule-MyContract.MyFunction" + ); + }); + it("namespaces the user provided id to the module", () => { assert.equal( - toCallFutureId("MyModule", "MyId", "MyContract", "MyFunction"), + toCallFutureId( + "MyModule", + "MyId", + "MyModule", + "MyModule#MyContract", + "MyFunction" + ), "MyModule#MyId" ); }); From 214892bf008adcacef27fbd432b56feab4fe4553 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Oct 2023 12:27:55 +0100 Subject: [PATCH 1066/1302] feat: change contractAt signature Switch the `artifact` version of `contractAt` to: ```js m.contractAt(name, artifact, address) ``` This brings it into line with other artifact based signatures. Resolves #557. --- .../ignition/modules/CompleteModule.js | 2 +- packages/core/src/internal/module-builder.ts | 44 +++++++++++++------ packages/core/src/types/module-builder.ts | 2 +- packages/core/test/contractAtFromArtifact.ts | 38 ++++++++-------- .../core/test/ignition-module-serializer.ts | 10 ++--- .../futures/reconcileArtifactContractAt.ts | 8 ++-- packages/core/test/validations/id-rules.ts | 6 +-- packages/hardhat-plugin/test/events.ts | 2 +- .../deploy-contract-at-from-artifact.ts | 2 +- .../hardhat-plugin/test/existing-contract.ts | 6 +-- packages/hardhat-plugin/test/static-calls.ts | 4 +- packages/ui/test/to-mermaid.ts | 2 +- 12 files changed, 72 insertions(+), 54 deletions(-) diff --git a/examples/complete/ignition/modules/CompleteModule.js b/examples/complete/ignition/modules/CompleteModule.js index ef8bef318a..5e5e60221f 100644 --- a/examples/complete/ignition/modules/CompleteModule.js +++ b/examples/complete/ignition/modules/CompleteModule.js @@ -23,8 +23,8 @@ module.exports = buildModule("CompleteModule", (m) => { }); const duplicateWithLib = m.contractAt( "ContractWithLibrary", - withLib, withLibArtifact, + withLib, { id: "ContractWithLibrary2" } ); diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index e81aa16b7f..0120750840 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -18,24 +18,24 @@ import { AccountRuntimeValue, AddressResolvableFuture, ArgumentType, + CallableContractFuture, ContractAtFuture, + ContractCallFuture, ContractDeploymentFuture, - LibraryDeploymentFuture, - CallableContractFuture, ContractFuture, FutureType, IgnitionModule, IgnitionModuleResult, + LibraryDeploymentFuture, ModuleParameterRuntimeValue, ModuleParameterType, ModuleParameters, NamedArtifactContractAtFuture, - ContractCallFuture, NamedArtifactContractDeploymentFuture, NamedArtifactLibraryDeploymentFuture, - StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, + StaticCallFuture, } from "../types/module"; import { CallOptions, @@ -610,20 +610,25 @@ class IgnitionModuleBuilderImplementation< ): NamedArtifactContractAtFuture; public contractAt( contractName: string, + artifact: Artifact, address: | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - artifact: Artifact, options?: ContractAtOptions ): ContractAtFuture; public contractAt( contractName: ContractNameT, - address: + addressOrArtifact: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | Artifact, + optionsOrAddress?: + | ContractAtOptions | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - artifactOrOptions?: Artifact | ContractAtOptions, options?: ContractAtOptions ) { if (typeof contractName !== "string") { @@ -633,19 +638,32 @@ class IgnitionModuleBuilderImplementation< ); } - if (isArtifactType(artifactOrOptions)) { + if (isArtifactType(addressOrArtifact)) { + if ( + !( + typeof optionsOrAddress === "string" || + isFuture(optionsOrAddress) || + isModuleParameterRuntimeValue(optionsOrAddress) + ) + ) { + this._throwErrorWithStackTrace( + `Invalid parameter "address" provided to contractAt "${contractName}" in module "${this._module.id}"`, + this.contractAt + ); + } + return this._contractAtFromArtifact( contractName, - address, - artifactOrOptions, + addressOrArtifact, + optionsOrAddress, options ); } return this._namedArtifactContractAt( contractName, - address, - artifactOrOptions + addressOrArtifact, + optionsOrAddress as ContractAtOptions ); } @@ -692,11 +710,11 @@ class IgnitionModuleBuilderImplementation< private _contractAtFromArtifact( contractName: string, + artifact: Artifact, address: | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - artifact: Artifact, options: ContractAtOptions = {} ): ContractAtFuture { const futureId = toDeploymentFutureId( diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index be41530165..5555459a8d 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -185,11 +185,11 @@ export interface IgnitionModuleBuilder { contractAt( contractName: string, + artifact: Artifact, address: | string | AddressResolvableFuture | ModuleParameterRuntimeValue, - artifact: Artifact, options?: ContractAtOptions ): ContractAtFuture; diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 20b22a6d05..62ea7af630 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -23,7 +23,7 @@ describe("contractAtFromArtifact", () => { it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0xtest", fakeArtifact); + const contract1 = m.contractAt("Contract1", fakeArtifact, "0xtest"); return { contract1 }; }); @@ -53,7 +53,7 @@ describe("contractAtFromArtifact", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractAt("Another", "0xtest", fakeArtifact, { + const another = m.contractAt("Another", fakeArtifact, "0xtest", { after: [example], }); @@ -74,7 +74,7 @@ describe("contractAtFromArtifact", () => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); - const another = m.contractAt("Another", call, fakeArtifact); + const another = m.contractAt("Another", fakeArtifact, call); return { example, another }; }); @@ -96,11 +96,11 @@ describe("contractAtFromArtifact", () => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); const paramWithoutDefault = m.getParameter("addressWithoutDefault"); - const withDefault = m.contractAt("C", paramWithDefault, fakeArtifact); + const withDefault = m.contractAt("C", fakeArtifact, paramWithDefault); const withoutDefault = m.contractAt( "C2", - paramWithoutDefault, - fakeArtifact + fakeArtifact, + paramWithoutDefault ); return { withDefault, withoutDefault }; @@ -129,14 +129,14 @@ describe("contractAtFromArtifact", () => { const moduleWithSameContractTwice = buildModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0x123", fakeArtifact, + "0x123", { id: "first" } ); const sameContract2 = m.contractAt( "SameContract", - "0x123", fakeArtifact, + "0x123", { id: "second", } @@ -162,13 +162,13 @@ describe("contractAtFromArtifact", () => { buildModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0x123", - fakeArtifact + fakeArtifact, + "0x123" ); const sameContract2 = m.contractAt( "SameContract", - "0x123", - fakeArtifact + fakeArtifact, + "0x123" ); return { sameContract1, sameContract2 }; @@ -183,16 +183,16 @@ describe("contractAtFromArtifact", () => { buildModule("Module1", (m) => { const sameContract1 = m.contractAt( "SameContract", - "0x123", fakeArtifact, + "0x123", { id: "same", } ); const sameContract2 = m.contractAt( "SameContract", - "0x123", fakeArtifact, + "0x123", { id: "same", } @@ -211,11 +211,11 @@ describe("contractAtFromArtifact", () => { assert.throws( () => buildModule("Module1", (m) => { - const another = m.contractAt("Another", 42 as any, fakeArtifact); + const another = m.contractAt("Another", fakeArtifact, 42 as any); return { another }; }), - /Invalid address given/ + /Invalid parameter "address" provided to contractAt "Another" in module "Module1"/ ); }); }); @@ -223,7 +223,7 @@ describe("contractAtFromArtifact", () => { it("should not validate a missing module parameter", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); - const another = m.contractAt("Another", p, fakeArtifact); + const another = m.contractAt("Another", fakeArtifact, p); return { another }; }); @@ -248,7 +248,7 @@ describe("contractAtFromArtifact", () => { it("should validate a missing module parameter if a default parameter is present", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", "0x1234"); - const another = m.contractAt("Another", p, fakeArtifact); + const another = m.contractAt("Another", fakeArtifact, p); return { another }; }); @@ -272,7 +272,7 @@ describe("contractAtFromArtifact", () => { it("should not validate a module parameter of the wrong type", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 123 as unknown as string); - const another = m.contractAt("Another", p, fakeArtifact); + const another = m.contractAt("Another", fakeArtifact, p); return { another }; }); diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts index 85850bcfef..6a88e6da13 100644 --- a/packages/core/test/ignition-module-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -165,7 +165,7 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); return { contract1 }; }); @@ -175,9 +175,9 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with a future address", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); + const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); const call = m.staticCall(contract1, "getAddress"); - const contract2 = m.contractAt("Contract2", call, fakeArtifact); + const contract2 = m.contractAt("Contract2", fakeArtifact, call); return { contract1, contract2 }; }); @@ -187,8 +187,8 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with dependency", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0", fakeArtifact); - const contract2 = m.contractAt("Contract2", "0x0", fakeArtifact, { + const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); + const contract2 = m.contractAt("Contract2", fakeArtifact, "0x0", { after: [contract1], }); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts index ca8e5bbec6..9f65af581b 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts @@ -69,7 +69,7 @@ describe("Reconciliation - artifact contract at", () => { it("should reconcile when using an address string", async () => { const submoduleDefinition = buildModule("Submodule", (m) => { - const contract1 = m.contractAt("Contract1", exampleAddress, mockArtifact); + const contract1 = m.contractAt("Contract1", mockArtifact, exampleAddress); return { contract1 }; }); @@ -97,7 +97,7 @@ describe("Reconciliation - artifact contract at", () => { const example = m.contract("Example"); const call = m.staticCall(example, "getAddress"); - const another = m.contractAt("Another", call, mockArtifact); + const another = m.contractAt("Another", mockArtifact, call); return { another }; }); @@ -143,8 +143,8 @@ describe("Reconciliation - artifact contract at", () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAt( "ContractChanged", - exampleAddress, mockArtifact, + exampleAddress, { id: "Factory", } @@ -179,8 +179,8 @@ describe("Reconciliation - artifact contract at", () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contractAt( "Contract1", - exampleAddress, mockArtifact, + exampleAddress, { id: "Factory", } diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index b2428735da..0ec38ffeec 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -122,8 +122,8 @@ describe("id rules", () => { buildModule("MyModule", (m) => { const myContractAt = m.contractAt( "MyContract", - exampleAddress, fakeArtifact, + exampleAddress, { id: "MyContractAt:v2", } @@ -218,8 +218,8 @@ describe("id rules", () => { buildModule("MyModule", (m) => { const myContractAt = m.contractAt( "MyContractAt:v2", - exampleAddress, - fakeArtifact + fakeArtifact, + exampleAddress ); return { myContractAt }; diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/events.ts index c61ff3ef13..e20f613299 100644 --- a/packages/hardhat-plugin/test/events.ts +++ b/packages/hardhat-plugin/test/events.ts @@ -48,7 +48,7 @@ describe("events", () => { "fooAddress" ); - const foo = m.contractAt("Foo", newAddress, artifact); + const foo = m.contractAt("Foo", artifact, newAddress); return { fooFactory, foo }; }); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts index 5e81e72ce0..fb934be77e 100644 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts +++ b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts @@ -38,7 +38,7 @@ describe.skip("execution - deploy contractAt from artifact", function () { const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); const contractAtModuleDefinition = buildModule("FooModule", (m) => { - const atFoo = m.contractAt("AtFoo", fooAddress, fooArtifact); + const atFoo = m.contractAt("AtFoo", fooArtifact, fooAddress); return { atFoo }; }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/existing-contract.ts index 890762fee1..53e549cf2e 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/existing-contract.ts @@ -31,11 +31,11 @@ describe("existing contract", () => { await firstResult.usesContract.getAddress(); const secondModuleDefinition = buildModule("SecondModule", (m) => { - const bar = m.contractAt("Bar", barAddress, barArtifact); + const bar = m.contractAt("Bar", barArtifact, barAddress); const usesContract = m.contractAt( "UsesContract", - usesContractAddress, - usesContractArtifact + usesContractArtifact, + usesContractAddress ); m.call(usesContract, "setAddress", [bar]); diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/static-calls.ts index 8c34694a6e..891522b683 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/static-calls.ts @@ -44,7 +44,7 @@ describe("static calls", () => { after: [createCall], }); - const foo = m.contractAt("Foo", newAddress, artifact); + const foo = m.contractAt("Foo", artifact, newAddress); return { fooFactory, foo }; }); @@ -167,7 +167,7 @@ describe("static calls", () => { after: [createCall], }); - const foo = m.contractAt("Foo", nonAddress, artifact); + const foo = m.contractAt("Foo", artifact, nonAddress); return { fooFactory, foo }; }); diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 62c0fc2e58..d22a828e09 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -205,8 +205,8 @@ describe("to-mermaid", () => { }); const duplicateWithLib = m.contractAt( "ContractWithLibrary", - withLib, withLibArtifact, + withLib, { id: "ContractWithLibrary2" } ); From ebd11c97cf4a295ff62f64f91a4273665e22a6db Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 20:10:02 +0000 Subject: [PATCH 1067/1302] Update validation errors --- packages/core/src/internal/module-builder.ts | 37 ++++++++++---------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index e81aa16b7f..9262543f86 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -903,7 +903,7 @@ class IgnitionModuleBuilderImplementation< } this._throwErrorWithStackTrace( - `The id "${id}" contains banned characters, ids can only contain alphanumerics or underscores`, + `The id "${id}" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character.`, func ); } @@ -912,12 +912,13 @@ class IgnitionModuleBuilderImplementation< contractName: string, func: (...[]: any[]) => any ) { + // TODO: This doesn't support FQNs if (isValidSolidityIdentifier(contractName)) { return; } this._throwErrorWithStackTrace( - `The contract "${contractName}" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs`, + `The contract name "${contractName}" is invalid, make sure you use a valid identifier.`, func ); } @@ -931,7 +932,7 @@ class IgnitionModuleBuilderImplementation< } this._throwErrorWithStackTrace( - `The event "${eventName}" contains banned characters, event names can only contain alphanumerics, underscores or dollar signs`, + `The event name "${eventName}" is invalid, make sure you use a valid identifier.`, func ); } @@ -945,7 +946,7 @@ class IgnitionModuleBuilderImplementation< } this._throwErrorWithStackTrace( - `The function name "${functionName}" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs`, + `The function name "${functionName}" is invalid, make sure you use a valid identifier.`, func ); } @@ -965,7 +966,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueContractId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contract("MyContract", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contract(..., { id: "MyUniqueId"})\``, this.contract ); } @@ -973,7 +974,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactContractId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contract("MyContract", artifact, [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contract(..., { id: "MyUniqueId"})\``, this.contract ); } @@ -981,7 +982,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueLibraryId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.library("MyLibrary", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.library(..., { id: "MyUniqueId"})\``, this.library ); } @@ -989,7 +990,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueArtifactLibraryId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.library("MyLibrary", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.library(..., { id: "MyUniqueId"})\``, this.library ); } @@ -997,7 +998,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueCallId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.call(myContract, "myFunction", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.call(..., { id: "MyUniqueId"})\``, this.call ); } @@ -1005,7 +1006,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueStaticCallId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.staticCall(myContract, "myFunction", [], { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.staticCall(..., { id: "MyUniqueId"})\``, this.staticCall ); } @@ -1013,7 +1014,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueContractAtId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", artifact, { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contractAt(..., { id: "MyUniqueId"})\``, this.contractAt ); } @@ -1021,7 +1022,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueContractAtFromArtifactId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.contractAt("MyContract", "0x123...", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contractAt(..., { id: "MyUniqueId"})\``, this.contractAt ); } @@ -1029,7 +1030,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueReadEventArgumentId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.readEventArgument(myContract, "MyEvent", "eventArg", { id: "MyId"})\``, + `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.readEventArgument(..., { id: "MyUniqueId"})\``, this.readEventArgument ); } @@ -1037,7 +1038,7 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueSendId(futureId: string) { return this._assertUniqueFutureId( futureId, - `Duplicated id ${futureId} found in module ${this._module.id}, ensure the id passed is unique \`m.send("MyId", "0xabcd")\``, + `Duplicated id ${futureId} found in module ${this._module.id}. Make sure the id passed as first argument to \`m.send\` is unique.`, this.send ); } @@ -1049,7 +1050,7 @@ class IgnitionModuleBuilderImplementation< for (const [libraryName, libraryFuture] of Object.entries(libraries)) { if (!isContractFuture(libraryFuture)) { this._throwErrorWithStackTrace( - `Given library '${libraryName}' is not a valid Future`, + `The value you provided for the library '${libraryName}' is not a valid Future or it doesn't represent a contract`, func ); } @@ -1072,7 +1073,7 @@ class IgnitionModuleBuilderImplementation< typeof value !== "bigint" ) { this._throwErrorWithStackTrace( - `Given value option '${value}' is not a \`bigint\``, + `Invalid option "value" received. It should be a bigint, a module parameter, or a value obtained from an event or static call.`, func ); } @@ -1088,7 +1089,7 @@ class IgnitionModuleBuilderImplementation< from !== undefined ) { this._throwErrorWithStackTrace( - `Invalid type for given option "from": ${typeof from}`, + `Invalid type for option "from": ${typeof from}`, func ); } @@ -1133,7 +1134,7 @@ class IgnitionModuleBuilderImplementation< } this._throwErrorWithStackTrace( - `The argument "${nameOrIndex}" contains banned characters, argument names can only contain alphanumerics, underscores or dollar signs`, + `The argument "${nameOrIndex}" is expected to have a valid name, but it's invalid.`, func ); } From 80464602018834d4211396c57de353c9bfbbde0d Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 20:22:31 +0000 Subject: [PATCH 1068/1302] Update error messages and delete an unnecessary error --- packages/core/src/errors-list.ts | 33 +++++++++---------- .../internal/execution/execution-engine.ts | 8 +++-- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 70d45902f2..afb7f60f6a 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -31,7 +31,7 @@ export const ERROR_RANGES: { INTERNAL: { min: 100, max: 199, - title: "Internal Ignition errors", + title: "Internal Hardaht Ignition errors", }, MODULE: { min: 200, @@ -80,11 +80,13 @@ export const ERRORS = { GENERAL: { ASSERTION_ERROR: { number: 1, - message: "Internal Ignition invariant was violated: %description%", + message: + "Internal Hardhat Ignition invariant was violated: %description%", }, UNSUPPORTED_DECODE: { number: 2, - message: "Ignition can't decode ethers.js value of type %type%: %value%", + message: + "Hardhat Ignition can't decode ethers.js value of type %type%: %value%", }, }, INTERNAL: { @@ -111,11 +113,11 @@ export const ERRORS = { INVALID_MODULE_ID_CHARACTERS: { number: 201, message: - 'The moduleId "%moduleId%" contains banned characters, ids can only contain alphanumerics or underscores', + 'The moduleId "%moduleId%" is invalid. Module ids can only have alphanumerics and underscore, and they must start with an alphanumeric.', }, INVALID_MODULE_DEFINITION_FUNCTION: { number: 202, - message: "Module definition function must be a function", + message: "Module definition function must be a function.", }, ASYNC_MODULE_DEFINITION_FUNCTION: { number: 203, @@ -138,14 +140,10 @@ export const ERRORS = { }, }, EXECUTION: { - FUTURE_NOT_FOUND: { - number: 400, - message: "Could not locate future id from batching", - }, DROPPED_TRANSACTION: { number: 401, message: - "Error while executing %futureId%: all the transactions of its network interaction %networkInteractionId% were dropped. Please try rerunning Ignition.", + "Error while executing %futureId%: all the transactions of its network interaction %networkInteractionId% were dropped. Please try rerunning Hardhat Ignition.", }, INVALID_JSON_RPC_RESPONSE: { number: 402, @@ -154,12 +152,12 @@ export const ERRORS = { WAITING_FOR_CONFIRMATIONS: { number: 403, message: - "You have sent transactions from %sender%. Please wait until they get %requiredConfirmations% confirmations before running Ignition again.", + "You have sent transactions from %sender% and they interfer with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", }, WAITING_FOR_NONCE: { number: 404, message: - "You have sent transactions from %sender% with nonce %nonce%. Please wait until they get %requiredConfirmations% confirmations before running Ignition again.", + "You have sent transactions from %sender% with nonce %nonce% and it interfers with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", }, INVALID_NONCE: { number: 405, @@ -181,18 +179,19 @@ export const ERRORS = { }, NO_STATE_FOR_FUTURE: { number: 601, - message: "Cannot wipe %futureId% as no state recorded against it", + message: + "Cannot wipe %futureId% as it has no previous execution recorded", }, DEPENDENT_FUTURES: { number: 602, - message: `Cannot wipe %futureId% as there are dependent futures that have already started: %dependents%`, + message: `Cannot wipe %futureId% as there are dependent futures that have previous executions recorded. Consider wiping these first: %dependents%`, }, }, VALIDATION: { INVALID_DEFAULT_SENDER: { number: 700, message: - "Default sender %defaultSender% is not part of the provided accounts", + "Default sender %defaultSender% is not part of the configured accounts.", }, MISSING_EMITTER: { number: 701, @@ -216,12 +215,12 @@ export const ERRORS = { INVALID_STATIC_CALL: { number: 705, message: - "Function %functionName% in contract %contractName% is not 'pure' or 'view' and cannot be statically called", + "Function %functionName% in contract %contractName% is not 'pure' or 'view' and should not be statically called", }, INDEXED_EVENT_ARG: { number: 706, message: - "Indexed argument %argument% of event %eventName% of contract %contractName% is not stored in the receipt, but its hash is, so you can't read it.", + "Indexed argument %argument% of event %eventName% of contract %contractName% is not stored in the receipt (its hash is stored instead), so you can't read it.", }, INVALID_OVERLOAD_NAME: { number: 707, diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index a14d5f3692..e246eacbe8 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -12,6 +12,7 @@ import { IgnitionModuleResult, } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; +import { assertIgnitionInvariant } from "../utils/assertions"; import { getFuturesFromModule } from "../utils/get-futures-from-module"; import { getPendingNonceAndSender } from "../views/execution-state/get-pending-nonce-and-sender"; import { hasExecutionSucceeded } from "../views/has-execution-succeeded"; @@ -238,9 +239,10 @@ export class ExecutionEngine { private _lookupFuture(futures: Future[], futureId: string): Future { const future = futures.find((f) => f.id === futureId); - if (future === undefined) { - throw new IgnitionError(ERRORS.EXECUTION.FUTURE_NOT_FOUND); - } + assertIgnitionInvariant( + future !== undefined, + `Future ${futureId} not found` + ); return future; } From abf93581dba69bae51d80a5165dc1f78887951ac Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:45:22 +0000 Subject: [PATCH 1069/1302] Expose errorNumber in IgnitionError --- packages/core/src/errors.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index e4dd8f27f6..b08a63b8e3 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -20,6 +20,15 @@ export class CustomError extends Error { * @alpha */ export class IgnitionError extends CustomError { + // We store the error descriptor as private field to avoid + // interferring with Node's default error formatting. + // We can use getters to access any private field without + // interferring with it. + // + // Disabling this rule as private fields don't use `private` + // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility + #errorDescriptor: ErrorDescriptor; + constructor( errorDescriptor: ErrorDescriptor, messageArguments: Record = {}, @@ -32,6 +41,12 @@ export class IgnitionError extends CustomError { ); super(prefix + formattedMessage, cause); + + this.#errorDescriptor = errorDescriptor; + } + + public get errorNumber(): number { + return this.#errorDescriptor.number; } } From 6d6b1119c1e6d0121af26bc8f7db5d8beb76194e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:45:50 +0000 Subject: [PATCH 1070/1302] Don't pass an error cause if its undefined --- packages/core/src/errors.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index b08a63b8e3..6514734217 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -8,7 +8,7 @@ import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; */ export class CustomError extends Error { constructor(message: string, cause?: Error) { - super(message, { cause }); + super(message, cause !== undefined ? { cause } : undefined); this.name = this.constructor.name; } } From bf91cf786d4dab5baf20ef3423db4bef2464d11e Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:47:02 +0000 Subject: [PATCH 1071/1302] Use the IgnitionError#errorNumber property in the plugin --- .../src/utils/shouldBeHardhatPluginError.ts | 45 ++----------------- 1 file changed, 4 insertions(+), 41 deletions(-) diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index ab26acb009..88ef24ad54 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -9,48 +9,11 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ const whitelist = [ - "200", - "201", - "202", - "203", - "403", - "404", - "405", - "600", - "601", - "602", - "700", - "701", - "702", - "703", - "704", - "705", - "706", - "707", - "708", - "709", - "710", - "711", - "712", - "713", - "714", - "715", - "716", - "717", - "718", - "719", - "720", - "721", - "722", - "723", - "724", - "725", - "726", - "800", + 200, 201, 202, 203, 403, 404, 405, 600, 601, 602, 700, 701, 702, 703, 704, + 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, + 720, 721, 722, 723, 724, 725, 726, 800, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { - const code = error.message.match(/IGN([0-9]+):/)![1]; - - return whitelist.includes(code); + return whitelist.includes(error.errorNumber); } From 283495850adb6317f4d9eefaf4a535ac48f93c30 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:53:53 +0000 Subject: [PATCH 1072/1302] Don't wrap errors thrown by the ModuleBuilder --- packages/hardhat-plugin/src/load-module.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 3430d4a513..72747f69af 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -65,8 +65,25 @@ export function loadModule( try { module = require(fullpathToModule); } catch (e) { - if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + if (e instanceof IgnitionError) { + /** + * Errors thrown from within ModuleBuilder use this errorNumber. + * + * They have a stack trace that's useful to the user, so we display it here, instead of + * wrapping the error in a NomicLabsHardhatPluginError. + */ + if (e.errorNumber === 702) { + console.error(e); + + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Module validation failed." + ); + } + + if (shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } } throw e; From 612fb832864a255acdb668ec5291b2eea28b69bc Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:54:07 +0000 Subject: [PATCH 1073/1302] Provide parent errors when creating NomicLabsHardhatPluginErrors --- packages/hardhat-plugin/src/index.ts | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index b600241d82..67f48388fd 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -153,7 +153,11 @@ ignitionScope }); } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); } throw e; @@ -207,7 +211,11 @@ ignitionScope ); } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); } throw e; @@ -248,7 +256,7 @@ ignitionScope statusResult = await status(deploymentDir); } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); } throw e; @@ -289,7 +297,11 @@ ignitionScope await wipe(deploymentDir, new HardhatArtifactResolver(hre), futureId); } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message); + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); } throw e; From f588a070d58b3f9aa6b68c450db70bafb4ce7ab5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Oct 2023 20:33:05 +0100 Subject: [PATCH 1074/1302] improvement: update the text for status and completion * update the status text for success * update text of timed out futures * update the failed text * update status text for started futures * don't expose strategy level information This also updates the identifiers in the tests. --- .../calculate-deployment-complete-display.ts | 13 ++--- .../calculate-deployment-status-display.ts | 21 ++++---- .../calculate-deployment-complete-display.ts | 52 +++++++++---------- .../calculate-deployment-status-display.ts | 24 +++++---- 4 files changed, 52 insertions(+), 58 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts index 0e2cbd1be1..fb4e40e67a 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -133,7 +133,7 @@ function _displayExecutionErrors( let text = `[ ${moduleName} ] failed ⛔\n\n`; if (result.timedOut.length > 0) { - let timedOutSection = `Transactions remain unconfirmed after fee bump:\n`; + let timedOutSection = `Futures with transactions unconfirmed after maximum fee bumps:\n`; timedOutSection += Object.values(result.timedOut) .map(({ futureId }) => ` - ${futureId}`) @@ -148,14 +148,11 @@ function _displayExecutionErrors( let failedSection = `Futures failed during execution:\n`; failedSection += Object.values(result.failed) - .map( - ({ futureId, networkInteractionId, error }) => - ` - ${futureId}/${networkInteractionId}: ${error}` - ) + .map(({ futureId, error }) => ` - ${futureId}: ${error}`) .join("\n"); failedSection += - "\n\nConsider addressing the cause of the errors and rerunning the deployment."; + "\n\nTo learn how to handle these errors: https://hardhat.org/ignition-errors"; sections.push(failedSection); } @@ -164,9 +161,7 @@ function _displayExecutionErrors( let heldSection = `Held:\n`; heldSection += Object.values(result.held) - .map( - ({ futureId, heldId, reason }) => ` - ${futureId}/${heldId}: ${reason}` - ) + .map(({ futureId, reason }) => ` - ${futureId}: ${reason}`) .join("\n"); sections.push(heldSection); diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts index 637a8006d4..41fe770921 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts @@ -21,7 +21,7 @@ export function calculateDeploymentStatusDisplay( } function _calculateSuccess(deploymentId: string, statusResult: StatusResult) { - let successText = `[ ${deploymentId} ] successfully deployed 🚀\n\n`; + let successText = `Deployment ${deploymentId} was successful\n\n`; if (Object.values(statusResult.contracts).length === 0) { successText += chalk.italic("No contracts were deployed"); @@ -40,22 +40,24 @@ function _calculateStartedButUnfinished( deploymentId: string, statusResult: StatusResult ) { - let startedText = `[ ${deploymentId} ] has futures that have started but not finished ⛔\n\n`; + let startedText = `Deployment ${deploymentId} has futures that have started but not completed\n\n`; startedText += Object.values(statusResult.started) .map((futureId) => ` - ${futureId}`) .join("\n"); + startedText += "\n\nPlease rerun your deployment."; + return startedText; } function _calculateFailed(deploymentId: string, statusResult: StatusResult) { - let failedExecutionText = `[ ${deploymentId} ] failed ⛔\n`; + let failedExecutionText = `Deployment ${deploymentId} failed\n`; const sections: string[] = []; if (statusResult.timedOut.length > 0) { - let timedOutSection = `\nTransactions remain unconfirmed after fee bump:\n`; + let timedOutSection = `\nFutures with transactions unconfirmed after maximum fee bumps:\n`; timedOutSection += Object.values(statusResult.timedOut) .map(({ futureId }) => ` - ${futureId}`) @@ -70,14 +72,11 @@ function _calculateFailed(deploymentId: string, statusResult: StatusResult) { let failedSection = `\nFutures failed during execution:\n`; failedSection += Object.values(statusResult.failed) - .map( - ({ futureId, networkInteractionId, error }) => - ` - ${futureId}/${networkInteractionId}: ${error}` - ) + .map(({ futureId, error }) => ` - ${futureId}: ${error}`) .join("\n"); failedSection += - "\n\nConsider addressing the cause of the errors and rerunning the deployment."; + "\n\nTo learn how to handle these errors: https://hardhat.org/ignition-errors"; sections.push(failedSection); } @@ -86,9 +85,7 @@ function _calculateFailed(deploymentId: string, statusResult: StatusResult) { let heldSection = `\nFutures where held by the strategy:\n`; heldSection += Object.values(statusResult.held) - .map( - ({ futureId, heldId, reason }) => ` - ${futureId}/${heldId}: ${reason}` - ) + .map(({ futureId, reason }) => ` - ${futureId}: ${reason}`) .join("\n"); sections.push(heldSection); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index b87cd6eae2..5109cb8b7d 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -83,11 +83,11 @@ describe("ui - calculate deployment complete display", () => { The module contains futures that would fail to execute: - MyModule:MyContract: + MyModule#MyContract: - The number of params does not match the constructor - The name of the contract is invalid - MyModule:AnotherContract: + MyModule#AnotherContract: - No library provided Update the invalid futures and rerun the deployment.`); @@ -95,11 +95,11 @@ describe("ui - calculate deployment complete display", () => { const result: ValidationErrorDeploymentResult = { type: DeploymentResultType.VALIDATION_ERROR, errors: { - "MyModule:MyContract": [ + "MyModule#MyContract": [ "The number of params does not match the constructor", "The name of the contract is invalid", ], - "MyModule:AnotherContract": ["No library provided"], + "MyModule#AnotherContract": ["No library provided"], }, }; @@ -123,11 +123,11 @@ describe("ui - calculate deployment complete display", () => { The module contains changes to executed futures: - MyModule:MyContract: + MyModule#MyContract: - The params don't match - The value doesn't match - MyModule:AnotherContract: + MyModule#AnotherContract: - The artifact bytecode has changed Consider modifying your module to remove the inconsistencies with deployed futures.`); @@ -135,11 +135,11 @@ describe("ui - calculate deployment complete display", () => { const result: ReconciliationErrorDeploymentResult = { type: DeploymentResultType.RECONCILIATION_ERROR, errors: { - "MyModule:MyContract": [ + "MyModule#MyContract": [ "The params don't match", "The value doesn't match", ], - "MyModule:AnotherContract": ["The artifact bytecode has changed"], + "MyModule#AnotherContract": ["The artifact bytecode has changed"], }, }; @@ -162,16 +162,16 @@ describe("ui - calculate deployment complete display", () => { [ MyModule ] deployment cancelled ⛔ These futures failed or timed out on a previous run: - - MyModule:MyContract - - MyModule:AnotherContract + - MyModule#MyContract + - MyModule#AnotherContract Use the ${chalk.italic("wipe")} task to reset them.`); const result: PreviousRunErrorDeploymentResult = { type: DeploymentResultType.PREVIOUS_RUN_ERROR, errors: { - "MyModule:MyContract": ["The previous run failed"], - "MyModule:AnotherContract": ["The previous run timed out"], + "MyModule#MyContract": ["The previous run failed"], + "MyModule#AnotherContract": ["The previous run timed out"], }, }; @@ -193,49 +193,49 @@ describe("ui - calculate deployment complete display", () => { const expectedText = testFormat(` [ MyModule ] failed ⛔ - Transactions remain unconfirmed after fee bump: - - MyModule:MyContract1 - - MyModule:AnotherContract1 + Futures with transactions unconfirmed after maximum fee bumps: + - MyModule#MyContract1 + - MyModule#AnotherContract1 Consider increasing the fee in your config. Futures failed during execution: - - MyModule:MyContract3/1: Reverted with reason x - - MyModule:AnotherContract3/3: Reverted with reason y + - MyModule#MyContract3: Reverted with reason x + - MyModule#AnotherContract3: Reverted with reason y - Consider addressing the cause of the errors and rerunning the deployment. + To learn how to handle these errors: https://hardhat.org/ignition-errors Held: - - MyModule:MyContract2/1: Vote is not complete - - MyModule:AnotherContract2/3: Server timed out`); + - MyModule#MyContract2: Vote is not complete + - MyModule#AnotherContract2: Server timed out`); const result: ExecutionErrorDeploymentResult = { type: DeploymentResultType.EXECUTION_ERROR, started: [], timedOut: [ - { futureId: "MyModule:MyContract1", networkInteractionId: 1 }, - { futureId: "MyModule:AnotherContract1", networkInteractionId: 3 }, + { futureId: "MyModule#MyContract1", networkInteractionId: 1 }, + { futureId: "MyModule#AnotherContract1", networkInteractionId: 3 }, ], held: [ { - futureId: "MyModule:MyContract2", + futureId: "MyModule#MyContract2", heldId: 1, reason: "Vote is not complete", }, { - futureId: "MyModule:AnotherContract2", + futureId: "MyModule#AnotherContract2", heldId: 3, reason: "Server timed out", }, ], failed: [ { - futureId: "MyModule:MyContract3", + futureId: "MyModule#MyContract3", networkInteractionId: 1, error: "Reverted with reason x", }, { - futureId: "MyModule:AnotherContract3", + futureId: "MyModule#AnotherContract3", networkInteractionId: 3, error: "Reverted with reason y", }, diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index 6fbcf17750..e366de0ebe 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -20,7 +20,7 @@ describe("ui - calculate deployment status display", () => { describe("successful deployment", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - [ deployment-01 ] successfully deployed 🚀 + Deployment deployment-01 was successful ${chalk.bold("Deployed Addresses")} @@ -54,7 +54,7 @@ describe("ui - calculate deployment status display", () => { it("should render a sucessful deployment with no deploys", () => { const expectedText = testFormat(` - [ deployment-01 ] successfully deployed 🚀 + Deployment deployment-01 was successful ${chalk.italic("No contracts were deployed")}`); @@ -76,23 +76,23 @@ describe("ui - calculate deployment status display", () => { describe("failed deployment", () => { it("should render an execution failure with multiple of each problem type", () => { const expectedText = testFormat(` - [ deployment-01 ] failed ⛔ + Deployment deployment-01 failed - Transactions remain unconfirmed after fee bump: + Futures with transactions unconfirmed after maximum fee bumps: - MyModule:MyContract1 - MyModule:AnotherContract1 Consider increasing the fee in your config. Futures failed during execution: - - MyModule:MyContract3/1: Reverted with reason x - - MyModule:AnotherContract3/3: Reverted with reason y + - MyModule:MyContract3: Reverted with reason x + - MyModule:AnotherContract3: Reverted with reason y - Consider addressing the cause of the errors and rerunning the deployment. + To learn how to handle these errors: https://hardhat.org/ignition-errors Futures where held by the strategy: - - MyModule:MyContract2/1: Vote is not complete - - MyModule:AnotherContract2/3: Server timed out`); + - MyModule:MyContract2: Vote is not complete + - MyModule:AnotherContract2: Server timed out`); const statusResult: StatusResult = { started: [], @@ -151,10 +151,12 @@ describe("ui - calculate deployment status display", () => { describe("deployment with started but unfinished futures (e.g. simulation errors)", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - [ deployment-01 ] has futures that have started but not finished ⛔ + Deployment deployment-01 has futures that have started but not completed - MyModule#Token - - MyModule#AnotherToken`); + - MyModule#AnotherToken + + Please rerun your deployment.`); const statusResult: StatusResult = { ...exampleStatusResult, From d3552f876ed2766cb976672c4e6bde68cd4046b7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 17 Oct 2023 13:52:45 +0100 Subject: [PATCH 1075/1302] test: update tests to match error message changes --- .../internal/execution/execution-engine.ts | 2 - packages/core/test/call.ts | 6 +-- packages/core/test/contract.ts | 6 +-- packages/core/test/contractFromArtifact.ts | 6 +-- .../get-nonce-sync-messages.ts | 12 +++--- packages/core/test/library.ts | 4 +- packages/core/test/libraryFromArtifact.ts | 4 +- packages/core/test/send.ts | 4 +- packages/core/test/staticCall.ts | 4 +- packages/core/test/validations/id-rules.ts | 42 +++++++++---------- packages/core/test/wipe.ts | 4 +- 11 files changed, 46 insertions(+), 48 deletions(-) diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index e246eacbe8..d176bdb2e8 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -1,5 +1,3 @@ -import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index baad0b3ba0..adbd79bf47 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -14,8 +14,8 @@ import { FutureType } from "../src/types/module"; import { assertInstanceOf, - setupMockArtifactResolver, assertValidationError, + setupMockArtifactResolver, } from "./helpers"; describe("call", () => { @@ -438,7 +438,7 @@ describe("call", () => { return { another }; }), - /Given value option '42' is not a `bigint`/ + /IGN702: Module validation failed with reason: Invalid option "value" received. It should be a bigint, a module parameter, or a value obtained from an event or static call./ ); }); @@ -451,7 +451,7 @@ describe("call", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index ebfda63faf..a3ddc8bc8d 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -481,7 +481,7 @@ describe("contract", () => { return { another }; }), - /Given value option '42' is not a `bigint`/ + /IGN702: Module validation failed with reason: Invalid option "value" received. It should be a bigint, a module parameter, or a value obtained from an event or static call./ ); }); @@ -493,7 +493,7 @@ describe("contract", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); @@ -510,7 +510,7 @@ describe("contract", () => { return { another, test }; }), - /Given library 'Call' is not a valid Future/ + /IGN702: Module validation failed with reason: The value you provided for the library 'Call' is not a valid Future or it doesn't represent a contract/ ); }); }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 636aa4c273..1ebf42c61c 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -436,7 +436,7 @@ describe("contractFromArtifact", () => { return { another }; }), - /Given value option '42' is not a `bigint`/ + /IGN702: Module validation failed with reason: Invalid option "value" received. It should be a bigint, a module parameter, or a value obtained from an event or static call./ ); }); @@ -450,7 +450,7 @@ describe("contractFromArtifact", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); @@ -467,7 +467,7 @@ describe("contractFromArtifact", () => { return { another, test }; }), - /Given library 'Call' is not a valid Future/ + /IGN702: Module validation failed with reason: The value you provided for the library 'Call' is not a valid Future or it doesn't represent a contract/ ); }); diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index 84d3ff58a3..8cafa4fff6 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -118,7 +118,7 @@ describe("execution - getNonceSyncMessages", () => { }, }, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]}. Please wait until they get 5 confirmations before running Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -141,7 +141,7 @@ describe("execution - getNonceSyncMessages", () => { }, }, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]}. Please wait until they get 5 confirmations before running Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -219,7 +219,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber: 3, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]}. Please wait until they get 5 confirmations before running Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); }); @@ -431,7 +431,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16. Please wait until they get 5 confirmations before running Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -459,7 +459,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30. Please wait until they get 5 confirmations before running Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -511,7 +511,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11. Please wait until they get 5 confirmations before running Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index 519393f2ee..bc347a7929 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -215,7 +215,7 @@ describe("library", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); @@ -232,7 +232,7 @@ describe("library", () => { return { another, test }; }), - /Given library 'Call' is not a valid Future/ + /IGN702: Module validation failed with reason: The value you provided for the library 'Call' is not a valid Future or it doesn't represent a contract/ ); }); }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 30db7f4d20..1e07106429 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -214,7 +214,7 @@ describe("libraryFromArtifact", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); @@ -231,7 +231,7 @@ describe("libraryFromArtifact", () => { return { another, test }; }), - /Given library 'Call' is not a valid Future/ + /IGN702: Module validation failed with reason: The value you provided for the library 'Call' is not a valid Future or it doesn't represent a contract/ ); }); }); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 9dc6e13e96..8731ac592e 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -272,7 +272,7 @@ describe("send", () => { return { another }; }), - /Given value option '42' is not a `bigint`/ + /IGN702: Module validation failed with reason: Invalid option "value" received. It should be a bigint, a module parameter, or a value obtained from an event or static call./ ); }); @@ -298,7 +298,7 @@ describe("send", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 4901a3a1a4..61944d6903 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -453,7 +453,7 @@ describe("static call", () => { return { another }; }), - /Invalid type for given option "from": number/ + /IGN702: Module validation failed with reason: Invalid type for option "from": number/ ); }); @@ -699,7 +699,7 @@ describe("static call", () => { {}, [] ), - "Function inc in contract Another is not 'pure' or 'view' and cannot be statically called" + "Function inc in contract Another is not 'pure' or 'view' and should not be statically called" ); }); diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index b2428735da..6af59f3db1 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -14,7 +14,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The moduleId "MyModule:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN201: The moduleId "MyModule:v2" is invalid. Module ids can only have alphanumerics and underscore, and they must start with an alphanumeric./); }); }); @@ -29,7 +29,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The id "MyContract:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyContract:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in contractFromArtifact ids", () => { @@ -46,7 +46,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The id "MyContractFromArtifact:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyContractFromArtifact:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in library ids", () => { @@ -58,7 +58,7 @@ describe("id rules", () => { return { library }; }); - }, /The id "MyLibrary:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyLibrary:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in libraryFromArtifact ids", () => { @@ -74,7 +74,7 @@ describe("id rules", () => { return { myLibraryFromArtifact }; }); - }, /The id "MyLibraryFromArtifact:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyLibraryFromArtifact:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in call ids", () => { @@ -88,7 +88,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The id "MyCall:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyCall:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in static call ids", () => { @@ -102,7 +102,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The id "MyStaticCall:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyStaticCall:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in contractAt ids", () => { @@ -114,7 +114,7 @@ describe("id rules", () => { return { myContractAt }; }); - }, /The id "MyContractAt:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyContractAt:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in contractAtFromArtifact ids", () => { @@ -131,7 +131,7 @@ describe("id rules", () => { return { myContractAt }; }); - }, /The id "MyContractAt:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyContractAt:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in readEventArgument ids", () => { @@ -145,7 +145,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The id "MyReadEventArgument:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MyReadEventArgument:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); it("should not allow non-alphanumerics in send id", () => { @@ -155,7 +155,7 @@ describe("id rules", () => { return {}; }); - }, /The id "MySend:v2" contains banned characters, ids can only contain alphanumerics or underscores/); + }, /IGN702: Module validation failed with reason: The id "MySend:v2" is invalid. Ids can only contain alphanumerics or underscores, and they must start with an alphanumeric character./); }); }); @@ -167,7 +167,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The contract "MyContract:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in contractFromArtifact contract name", () => { @@ -177,7 +177,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The contract "MyContract:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in library contract names", () => { @@ -187,7 +187,7 @@ describe("id rules", () => { return { library }; }); - }, /The contract "MyLibrary:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyLibrary:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in libraryFromArtifact contract names", () => { @@ -200,7 +200,7 @@ describe("id rules", () => { return { myLibraryFromArtifact }; }); - }, /The contract "MyLibraryFromArtifact:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyLibraryFromArtifact:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in contractAt contract names", () => { @@ -210,7 +210,7 @@ describe("id rules", () => { return { myContractAt }; }); - }, /The contract "MyContract:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in contractAtFromArtifact contract names", () => { @@ -224,7 +224,7 @@ describe("id rules", () => { return { myContractAt }; }); - }, /The contract "MyContractAt:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The contract name "MyContractAt:v2" is invalid, make sure you use a valid identifier./); }); }); @@ -238,7 +238,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The function name "config:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The function name "config:v2" is invalid, make sure you use a valid identifier./); }); it("should not allow non-alphanumerics in static call ids", () => { @@ -250,7 +250,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The function name "config:v2" contains banned characters, contract names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The function name "config:v2" is invalid, make sure you use a valid identifier./); }); it("should allow ethers style function specification", () => { @@ -276,7 +276,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The event "MyEvent:v2" contains banned characters, event names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The event name "MyEvent:v2" is invalid, make sure you use a valid identifier./); }); it("should allow ethers sytle event specification", () => { @@ -302,7 +302,7 @@ describe("id rules", () => { return { myContract }; }); - }, /The argument "MyArg:v2" contains banned characters, argument names can only contain alphanumerics, underscores or dollar signs/); + }, /IGN702: Module validation failed with reason: The argument "MyArg:v2" is expected to have a valid name, but it's invalid./); }); }); }); diff --git a/packages/core/test/wipe.ts b/packages/core/test/wipe.ts index f8d0497416..85a40343b3 100644 --- a/packages/core/test/wipe.ts +++ b/packages/core/test/wipe.ts @@ -101,7 +101,7 @@ describe("wipe", () => { const wiper = new Wiper(deploymentLoader); await assert.isRejected( wiper.wipe("Module1:Nonexistant"), - "Cannot wipe Module1:Nonexistant as no state recorded against it" + "IGN601: Cannot wipe Module1:Nonexistant as it has no previous execution recorded" ); }); @@ -134,7 +134,7 @@ describe("wipe", () => { await assert.isRejected( wiper.wipe(contract1Id), - `Cannot wipe ${contract1Id} as there are dependent futures that have already started: ${contract2Id}` + `IGN602: Cannot wipe ${contract1Id} as there are dependent futures that have previous executions recorded. Consider wiping these first: ${contract2Id}` ); }); }); From c0eef2777d16dba5b37bad87a69f913e174c2ea3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 17 Oct 2023 14:24:49 +0100 Subject: [PATCH 1076/1302] fix: update typo --- packages/core/src/errors-list.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index afb7f60f6a..847c81088a 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -31,7 +31,7 @@ export const ERROR_RANGES: { INTERNAL: { min: 100, max: 199, - title: "Internal Hardaht Ignition errors", + title: "Internal Hardhat Ignition errors", }, MODULE: { min: 200, From 8bca01510cb63939aa8ab129b0f021ac2a88f28f Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 17 Oct 2023 14:28:02 +0100 Subject: [PATCH 1077/1302] fix: spelling of interfer to interfere --- packages/core/src/errors-list.ts | 4 ++-- .../nonce-management/get-nonce-sync-messages.ts | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 847c81088a..5246ad7ba4 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -152,12 +152,12 @@ export const ERRORS = { WAITING_FOR_CONFIRMATIONS: { number: 403, message: - "You have sent transactions from %sender% and they interfer with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", + "You have sent transactions from %sender% and they interfere with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", }, WAITING_FOR_NONCE: { number: 404, message: - "You have sent transactions from %sender% with nonce %nonce% and it interfers with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", + "You have sent transactions from %sender% with nonce %nonce% and it interferes with Hardhat Ignition. Please wait until they get %requiredConfirmations% confirmations before running Hardhat Ignition again.", }, INVALID_NONCE: { number: 405, diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index 8cafa4fff6..341af46015 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -118,7 +118,7 @@ describe("execution - getNonceSyncMessages", () => { }, }, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfere with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -141,7 +141,7 @@ describe("execution - getNonceSyncMessages", () => { }, }, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfere with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -219,7 +219,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber: 3, }, - `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfer with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN403: You have sent transactions from ${exampleAccounts[1]} and they interfere with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); }); @@ -431,7 +431,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 16 and it interferes with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -459,7 +459,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 30 and it interferes with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); @@ -511,7 +511,7 @@ describe("execution - getNonceSyncMessages", () => { }, latestBlockNumber, }, - `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11 and it interfers with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` + `IGN404: You have sent transactions from ${exampleAccounts[1]} with nonce 11 and it interferes with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again.` ); }); From e187d7ff2356756c056a81a240410248a416b8a7 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Tue, 17 Oct 2023 20:17:00 +0000 Subject: [PATCH 1078/1302] Change submodule separator --- packages/core/src/internal/utils/future-id-builders.ts | 2 +- packages/core/test/utils/future-id-builders.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index 965ee5338a..be8ffe31a4 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -8,7 +8,7 @@ const MODULE_SEPERATOR = "#"; * The separator in ids that depend on futures that belong to a submodule. * This separator is used to split the submodule and the rest of the dependency's id. */ -const SUBMODULE_SEPARATOR = "-"; +const SUBMODULE_SEPARATOR = "~"; /** * The seperator in ids that indicated different subparts of the future key. diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index 7556a3d418..5673afa0dc 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -47,7 +47,7 @@ describe("future id rules", () => { "Submodule#MyContract", "MyFunction" ), - "MyModule#Submodule-MyContract.MyFunction" + "MyModule#Submodule~MyContract.MyFunction" ); }); From 32e504f90c7928be553417bef5e34c9547475f0c Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:25:09 +0000 Subject: [PATCH 1079/1302] Update contract name validation to support FQNs --- packages/core/src/internal/module-builder.ts | 6 +- .../internal/utils/identifier-validators.ts | 24 ++++ packages/core/test/validations/id-rules.ts | 124 ++++++++++++++++-- 3 files changed, 139 insertions(+), 15 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 99e49fb55c..0c58d8a550 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -72,6 +72,7 @@ import { toSendDataFutureId, } from "./utils/future-id-builders"; import { + isValidContractName, isValidFunctionOrEventName, isValidIgnitionIdentifier, isValidSolidityIdentifier, @@ -932,13 +933,12 @@ class IgnitionModuleBuilderImplementation< contractName: string, func: (...[]: any[]) => any ) { - // TODO: This doesn't support FQNs - if (isValidSolidityIdentifier(contractName)) { + if (isValidContractName(contractName)) { return; } this._throwErrorWithStackTrace( - `The contract name "${contractName}" is invalid, make sure you use a valid identifier.`, + `The contract name "${contractName}" is invalid.`, func ); } diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index f7c812720e..6d1f93fb7c 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -49,3 +49,27 @@ export function isValidSolidityIdentifier(identifier: string): boolean { export function isValidFunctionOrEventName(functionName: string): boolean { return functionNameRegex.test(functionName); } + +/** + * Returns true if a contract name (either bare - e.g. `MyContract` - or fully + * qualified - e.g. `contracts/MyContract.sol:MyContract`) is valid. + * + * In the case of FQNs, we only validate the contract name part. + * + * The reason to validate the contract name is that we want to use them in + * future ids, and those need to be compatible with most common file systems + * (including Windows!). + * + * We don't validate the entire FQN, as we'll only use its bare name to + * derive ids. + * + * @param contractName A bare or FQN contract name to validate. + * @returns true if the contract name is valid. + */ +export function isValidContractName(contractName: string): boolean { + if (contractName.includes(":")) { + contractName = contractName.split(":").at(-1)!; + } + + return isValidSolidityIdentifier(contractName); +} diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index 6516ff36f4..c7917a7a27 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -163,68 +163,168 @@ describe("id rules", () => { it("should not allow non-alphanumerics in contract name", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContract = m.contract("MyContract:v2"); + const myContract = m.contract("MyContract#v2"); return { myContract }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyContract#v2" is invalid/); }); it("should not allow non-alphanumerics in contractFromArtifact contract name", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContract = m.contract("MyContract:v2", fakeArtifact); + const myContract = m.contract("MyContract#v2", fakeArtifact); return { myContract }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyContract#v2" is invalid/); }); it("should not allow non-alphanumerics in library contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const library = m.library("MyLibrary:v2"); + const library = m.library("MyLibrary#v2"); return { library }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyLibrary:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyLibrary#v2" is invalid/); }); it("should not allow non-alphanumerics in libraryFromArtifact contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { const myLibraryFromArtifact = m.library( - "MyLibraryFromArtifact:v2", + "MyLibraryFromArtifact#v2", fakeArtifact ); return { myLibraryFromArtifact }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyLibraryFromArtifact:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyLibraryFromArtifact#v2" is invalid/); }); it("should not allow non-alphanumerics in contractAt contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { - const myContractAt = m.contractAt("MyContract:v2", exampleAddress); + const myContractAt = m.contractAt("MyContract#v2", exampleAddress); return { myContractAt }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyContract:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyContract#v2" is invalid/); }); it("should not allow non-alphanumerics in contractAtFromArtifact contract names", () => { assert.throws(() => { buildModule("MyModule", (m) => { const myContractAt = m.contractAt( - "MyContractAt:v2", + "MyContractAt#v2", fakeArtifact, exampleAddress ); return { myContractAt }; }); - }, /IGN702: Module validation failed with reason: The contract name "MyContractAt:v2" is invalid, make sure you use a valid identifier./); + }, /The contract name "MyContractAt#v2" is invalid/); + }); + + describe("With Fully Qualified Names", () => { + it("should allow non-alphanumerics in the source name", () => { + assert.doesNotThrow(() => { + buildModule("MyModule", (m) => { + m.contract("sourceName.sol:MyContract"); + m.contract("asd/sourceName.sol:MyContract2"); + m.contractAt("sourceName.sol:MyContractAt", "0x1234"); + m.library("sourceName.sol:MyLibrary"); + + return {}; + }); + }); + }); + + it("should throw if the FQN has no contract name", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myContract = m.contract("sourceName.sol:"); + + return { myContract }; + }); + }, /The contract name "sourceName.sol:" is invalid/); + }); + + describe("All the same validations should apply, but to the contract name part of the FQN", () => { + it("should not allow non-alphanumerics in contract name", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myContract = m.contract("sourceName.sol:MyContract#v2"); + + return { myContract }; + }); + }, /The contract name "sourceName.sol:MyContract#v2" is invalid/); + }); + + it("should not allow non-alphanumerics in contractFromArtifact contract name", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myContract = m.contract( + "sourceName.sol:MyContract#v2", + fakeArtifact + ); + + return { myContract }; + }); + }, /The contract name "sourceName.sol:MyContract#v2" is invalid/); + }); + + it("should not allow non-alphanumerics in library contract names", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const library = m.library("sourceName.sol:MyLibrary#v2"); + + return { library }; + }); + }, /The contract name "sourceName.sol:MyLibrary#v2" is invalid/); + }); + + it("should not allow non-alphanumerics in libraryFromArtifact contract names", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myLibraryFromArtifact = m.library( + "sourceName.sol:MyLibraryFromArtifact#v2", + fakeArtifact + ); + + return { myLibraryFromArtifact }; + }); + }, /The contract name "sourceName.sol:MyLibraryFromArtifact#v2" is invalid/); + }); + + it("should not allow non-alphanumerics in contractAt contract names", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myContractAt = m.contractAt( + "sourceName.sol:MyContract#v2", + exampleAddress + ); + + return { myContractAt }; + }); + }, /The contract name "sourceName.sol:MyContract#v2" is invalid/); + }); + + it("should not allow non-alphanumerics in contractAtFromArtifact contract names", () => { + assert.throws(() => { + buildModule("MyModule", (m) => { + const myContractAt = m.contractAt( + "sourceName.sol:MyContractAt#v2", + fakeArtifact, + exampleAddress + ); + + return { myContractAt }; + }); + }, /The contract name "sourceName.sol:MyContractAt#v2" is invalid/); + }); + }); }); }); From ff1236118d4e2b656d7a4f5d216e7a3a3bb896c2 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 16 Oct 2023 21:34:12 +0000 Subject: [PATCH 1080/1302] Update ids generation logic --- packages/core/src/internal/module-builder.ts | 14 ++++----- .../src/internal/utils/future-id-builders.ts | 29 +++++++++++++++---- .../internal/utils/identifier-validators.ts | 3 ++ .../core/test/utils/future-id-builders.ts | 6 ++-- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 0c58d8a550..17ca37cecd 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -67,7 +67,7 @@ import { resolveArgsToFutures } from "./utils"; import { assertIgnitionInvariant } from "./utils/assertions"; import { toCallFutureId, - toDeploymentFutureId, + toContractFutureId, toReadEventArgumentFutureId, toSendDataFutureId, } from "./utils/future-id-builders"; @@ -255,7 +255,7 @@ class IgnitionModuleBuilderImplementation< args: ArgumentType[] = [], options: ContractOptions = {} ): NamedArtifactContractDeploymentFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, contractName @@ -310,7 +310,7 @@ class IgnitionModuleBuilderImplementation< args: ArgumentType[] = [], options: ContractOptions = {} ): ContractDeploymentFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, contractName @@ -392,7 +392,7 @@ class IgnitionModuleBuilderImplementation< libraryName: LibraryNameT, options: LibraryOptions = {} ): NamedArtifactLibraryDeploymentFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, libraryName @@ -434,7 +434,7 @@ class IgnitionModuleBuilderImplementation< artifact: Artifact, options: LibraryOptions = {} ): LibraryDeploymentFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, libraryName @@ -678,7 +678,7 @@ class IgnitionModuleBuilderImplementation< | ModuleParameterRuntimeValue, options: ContractAtOptions = {} ): NamedArtifactContractAtFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, contractName @@ -720,7 +720,7 @@ class IgnitionModuleBuilderImplementation< | ModuleParameterRuntimeValue, options: ContractAtOptions = {} ): ContractAtFuture { - const futureId = toDeploymentFutureId( + const futureId = toContractFutureId( this._module.id, options.id, contractName diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index be8ffe31a4..a3d7f4f14c 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -16,23 +16,40 @@ const SUBMODULE_SEPARATOR = "~"; const SUBKEY_SEPERATOR = "."; /** - * Construct the future id for a contract or library deployment, namespaced by the + * Construct the future id for a contract, contractAt or library, namespaced by the * moduleId. * + * This method supports both bare contract names (e.g. `MyContract`) and fully + * qualified names (e.g. `contracts/MyModule.sol:MyContract`). + * + * If a fully qualified name is used, the id is only direvied from its contract + * name, ignoring its source name part. The reason is that ids need to be + * compatible with most common file systems (including Windows!), and the source + * name may have incompatible characters. + * * @param moduleId - the id of the module the future is part of * @param userProvidedId - the overriding id provided by the user (it will still * be namespaced) - * @param contractOrLibraryName - the contract or library name as a fallback + * @param contractOrLibraryName - the contract or library name, either a bare name + * or a fully qualified name. * @returns the future id */ -export function toDeploymentFutureId( +export function toContractFutureId( moduleId: string, userProvidedId: string | undefined, contractOrLibraryName: string ) { - return `${moduleId}${MODULE_SEPERATOR}${ - userProvidedId ?? contractOrLibraryName - }`; + // IMPORTANT: Keep in sync with src/internal/utils/identifier-validators.ts#isValidContractName + + if (userProvidedId !== undefined) { + return `${moduleId}${MODULE_SEPERATOR}${userProvidedId}`; + } + + const contractName = contractOrLibraryName.includes(":") + ? contractOrLibraryName.split(":").at(-1)! + : contractOrLibraryName; + + return `${moduleId}${MODULE_SEPERATOR}${contractName}`; } /** diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index 6d1f93fb7c..28399c7866 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -67,6 +67,9 @@ export function isValidFunctionOrEventName(functionName: string): boolean { * @returns true if the contract name is valid. */ export function isValidContractName(contractName: string): boolean { + // IMPORTANT: Keep in sync with src/internal/utils/future-id-builders.ts#toContractFutureId + + // Is it an FQN? if (contractName.includes(":")) { contractName = contractName.split(":").at(-1)!; } diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/core/test/utils/future-id-builders.ts index 5673afa0dc..8f123935b0 100644 --- a/packages/core/test/utils/future-id-builders.ts +++ b/packages/core/test/utils/future-id-builders.ts @@ -2,7 +2,7 @@ import { assert } from "chai"; import { toCallFutureId, - toDeploymentFutureId, + toContractFutureId, toReadEventArgumentFutureId, toSendDataFutureId, } from "../../src/internal/utils/future-id-builders"; @@ -11,14 +11,14 @@ describe("future id rules", () => { describe("contract, library, contractAt ids", () => { it("the fallback id should be built based on the contract or library name", () => { assert.equal( - toDeploymentFutureId("MyModule", undefined, "MyContract"), + toContractFutureId("MyModule", undefined, "MyContract"), "MyModule#MyContract" ); }); it("namespaces to the module a user provided id", () => { assert.equal( - toDeploymentFutureId("MyModule", "MyId", "MyContract"), + toContractFutureId("MyModule", "MyId", "MyContract"), "MyModule#MyId" ); }); From 1602af5ad2bb7cc894ea626779f461d377d50897 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 18 Oct 2023 06:35:22 -0300 Subject: [PATCH 1081/1302] Better duplicated id errors (#569) It splits the errors into two cases, with different messages: - An autogenerated id is duplicated. - An id provided by the user is duplicated. It also changes the wording, so that we use the full id ("Module#autoId") only in the autogenerated case, and just the id ("userProvidedId") when the user provides it. This change is because the user may not recognize that "Module#userProvidedId" refers to the string they provided, as it has been changed. Moves the `add future id to the builder` (used for checking duplicates across modules and submodules) out from the assertion method and into each api action. When a future is added to the module, we consider it safe to add the future id to the list of previously seen future ids. --------- Co-authored-by: John Kane --- packages/core/src/internal/module-builder.ts | 126 +++++-------------- packages/core/test/call.ts | 6 +- packages/core/test/contract.ts | 6 +- packages/core/test/contractAt.ts | 6 +- packages/core/test/contractAtFromArtifact.ts | 6 +- packages/core/test/contractFromArtifact.ts | 6 +- packages/core/test/library.ts | 6 +- packages/core/test/libraryFromArtifact.ts | 6 +- packages/core/test/readEventArgument.ts | 38 ++++++ packages/core/test/send.ts | 4 +- packages/core/test/staticCall.ts | 6 +- 11 files changed, 106 insertions(+), 110 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 17ca37cecd..ef6b7a6398 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -267,7 +267,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.contract); this._assertValidContractName(contractName, this.contract); - this._assertUniqueContractId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.contract); this._assertValidLibraries(options.libraries, this.contract); this._assertValidValue(options.value, this.contract); this._assertValidFrom(options.from, this.contract); @@ -300,6 +300,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -321,7 +322,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.contract); this._assertValidContractName(contractName, this.contract); - this._assertUniqueArtifactContractId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.contract); this._assertValidLibraries(options.libraries, this.contract); this._assertValidValue(options.value, this.contract); this._assertValidFrom(options.from, this.contract); @@ -356,6 +357,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -403,7 +405,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.library); this._assertValidContractName(libraryName, this.library); - this._assertUniqueLibraryId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.library); this._assertValidLibraries(options.libraries, this.library); this._assertValidFrom(options.from, this.library); /* validation end */ @@ -425,6 +427,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -444,7 +447,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.library); this._assertValidContractName(libraryName, this.library); - this._assertUniqueArtifactLibraryId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.library); this._assertValidLibraries(options.libraries, this.library); this._assertValidFrom(options.from, this.library); this._assertValidArtifact(artifact, this.library); @@ -468,6 +471,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -505,7 +509,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.call); this._assertValidFunctionName(functionName, this.call); - this._assertUniqueCallId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.call); this._assertValidValue(options.value, this.call); this._assertValidFrom(options.from, this.call); this._assertValidCallableContract(contractFuture, this.call); @@ -536,6 +540,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -573,7 +578,7 @@ class IgnitionModuleBuilderImplementation< this._assertValidId(options.id, this.staticCall); this._assertValidFunctionName(functionName, this.staticCall); this._assertValidNameOrIndex(nameOrIndex, this.staticCall); - this._assertUniqueStaticCallId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.staticCall); this._assertValidFrom(options.from, this.staticCall); this._assertValidCallableContract(contractFuture, this.staticCall); /* validation end */ @@ -599,6 +604,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -687,7 +693,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.contractAt); this._assertValidContractName(contractName, this.contractAt); - this._assertUniqueContractAtId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.contractAt); this._assertValidAddress(address, this.contractAt); /* validation end */ @@ -707,6 +713,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -729,7 +736,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(options.id, this.contractAt); this._assertValidContractName(contractName, this.contractAt); - this._assertUniqueContractAtFromArtifactId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.contractAt); this._assertValidAddress(address, this.contractAt); this._assertValidArtifact(artifact, this.contractAt); /* validation end */ @@ -751,6 +758,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -803,7 +811,7 @@ class IgnitionModuleBuilderImplementation< this._assertValidId(options.id, this.readEventArgument); this._assertValidEventName(eventName, this.readEventArgument); this._assertValidNameOrIndex(nameOrIndex, this.readEventArgument); - this._assertUniqueReadEventArgumentId(futureId); + this._assertUniqueFutureId(futureId, options.id, this.readEventArgument); /* validation end */ const future = new ReadEventArgumentFutureImplementation( @@ -822,6 +830,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -845,7 +854,7 @@ class IgnitionModuleBuilderImplementation< /* validation start */ this._assertValidId(id, this.send); - this._assertUniqueSendId(futureId); + this._assertUniqueFutureId(futureId, id, this.send); this._assertValidAddress(to, this.send); this._assertValidValue(val, this.send); this._assertValidData(data, this.send); @@ -870,6 +879,7 @@ class IgnitionModuleBuilderImplementation< } this._module.futures.add(future); + this._futureIds.add(futureId); return future; } @@ -973,93 +983,25 @@ class IgnitionModuleBuilderImplementation< private _assertUniqueFutureId( futureId: string, - message: string, - func: (...[]: any[]) => any + userProvidedId: string | undefined, + futureConstructor: (...[]: any[]) => any ) { - if (this._futureIds.has(futureId)) { - this._throwErrorWithStackTrace(message, func); + if (!this._futureIds.has(futureId)) { + return; } - this._futureIds.add(futureId); - } - - private _assertUniqueContractId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contract(..., { id: "MyUniqueId"})\``, - this.contract - ); - } - - private _assertUniqueArtifactContractId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contract(..., { id: "MyUniqueId"})\``, - this.contract - ); - } - - private _assertUniqueLibraryId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.library(..., { id: "MyUniqueId"})\``, - this.library - ); - } - - private _assertUniqueArtifactLibraryId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.library(..., { id: "MyUniqueId"})\``, - this.library - ); - } - - private _assertUniqueCallId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.call(..., { id: "MyUniqueId"})\``, - this.call - ); - } - - private _assertUniqueStaticCallId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.staticCall(..., { id: "MyUniqueId"})\``, - this.staticCall - ); - } - - private _assertUniqueContractAtId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contractAt(..., { id: "MyUniqueId"})\``, - this.contractAt - ); - } - - private _assertUniqueContractAtFromArtifactId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.contractAt(..., { id: "MyUniqueId"})\``, - this.contractAt - ); - } + if (userProvidedId !== undefined) { + this._throwErrorWithStackTrace( + `The future id "${userProvidedId}" is already used, please provide a different one.`, + futureConstructor + ); + } - private _assertUniqueReadEventArgumentId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. You can fix this by providing a unique id in as an option, like this \`m.readEventArgument(..., { id: "MyUniqueId"})\``, - this.readEventArgument - ); - } + this._throwErrorWithStackTrace( + `The autogenerated future id ("${futureId}") is already used. Please provide a unique id, as shown below: - private _assertUniqueSendId(futureId: string) { - return this._assertUniqueFutureId( - futureId, - `Duplicated id ${futureId} found in module ${this._module.id}. Make sure the id passed as first argument to \`m.send\` is unique.`, - this.send +m.${futureConstructor.name}(..., { id: "MyUniqueId"})`, + futureConstructor ); } diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index adbd79bf47..4480ae0bfe 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -409,7 +409,9 @@ describe("call", () => { return { sameContract1 }; }), - /Duplicated id Module1#SameContract.test found in module Module1/ + `The autogenerated future id ("Module1#SameContract.test") is already used. Please provide a unique id, as shown below: + +m.call(..., { id: "MyUniqueId"})` ); }); @@ -422,7 +424,7 @@ describe("call", () => { m.call(sameContract1, "test", [], { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1#first found in module Module1/ + 'The future id "first" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index a3ddc8bc8d..19ea860884 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -449,7 +449,9 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.contract(..., { id: "MyUniqueId"})` ); }); @@ -466,7 +468,7 @@ describe("contract", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 04b2cdcf6c..73bf8c81d0 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -161,7 +161,9 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.contractAt(..., { id: "MyUniqueId"})` ); }); @@ -188,7 +190,7 @@ describe("contractAt", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 62ea7af630..64ff21b70d 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -173,7 +173,9 @@ describe("contractAtFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.contractAt(..., { id: "MyUniqueId"})` ); }); @@ -200,7 +202,7 @@ describe("contractAtFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 1ebf42c61c..b1b03a2ca6 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -402,7 +402,9 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.contract(..., { id: "MyUniqueId"})` ); }); @@ -419,7 +421,7 @@ describe("contractFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index bc347a7929..88191fdb18 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -183,7 +183,9 @@ describe("library", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.library(..., { id: "MyUniqueId"})` ); }); @@ -200,7 +202,7 @@ describe("library", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 1e07106429..13f43ba379 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -180,7 +180,9 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#SameContract found in module Module1/ + `The autogenerated future id ("Module1#SameContract") is already used. Please provide a unique id, as shown below: + +m.library(..., { id: "MyUniqueId"})` ); }); @@ -197,7 +199,7 @@ describe("libraryFromArtifact", () => { return { sameContract1, sameContract2 }; }), - /Duplicated id Module1#same found in module Module1/ + 'The future id "same" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 8648d844a6..3d6a7e24bc 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -189,6 +189,44 @@ describe("Read event argument", () => { assert.include(futuresIds, "Module1#Example.EventName.arg1.0"); assert.include(futuresIds, "Module1#second"); }); + + it("should throw if the same read event arguennet is done twice without differentiating ids", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const example = m.contract("Example"); + + m.readEventArgument(example, "EventName", "arg1"); + m.readEventArgument(example, "EventName", "arg1"); + + return {}; + }), + `IGN702: Module validation failed with reason: The autogenerated future id ("Module1#Example.EventName.arg1.0") is already used. Please provide a unique id, as shown below: + +m.readEventArgument(..., { id: "MyUniqueId"})` + ); + }); + + it("should throw if a read event argument tries to pass the same id twice", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const example = m.contract("Example"); + + m.readEventArgument(example, "EventName", "arg1", { + id: "ReadEvent1", + }); + m.readEventArgument(example, "EventName", "arg1", { + id: "ReadEvent1", + }); + + m.send("first", "0xtest", 0n, "test"); + m.send("first", "0xtest", 0n, "test"); + return {}; + }), + `IGN702: Module validation failed with reason: The future id "ReadEvent1" is already used, please provide a different one.` + ); + }); }); describe("validation", () => { diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 8731ac592e..599bde1c5b 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -244,7 +244,7 @@ describe("send", () => { return {}; }), - /Duplicated id Module1#test_send found in module Module1/ + 'The future id "test_send" is already used, please provide a different one.' ); }); @@ -256,7 +256,7 @@ describe("send", () => { m.send("first", "0xtest", 0n, "test"); return {}; }), - /Duplicated id Module1#first found in module Module1/ + 'The future id "first" is already used, please provide a different one.' ); }); }); diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 61944d6903..d62d7d6d90 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -424,7 +424,9 @@ describe("static call", () => { return { sameContract1 }; }), - /Duplicated id Module1#SameContract.test found in module Module1/ + `The autogenerated future id ("Module1#SameContract.test") is already used. Please provide a unique id, as shown below: + +m.staticCall(..., { id: "MyUniqueId"})` ); }); @@ -437,7 +439,7 @@ describe("static call", () => { m.staticCall(sameContract1, "test", [], 0, { id: "first" }); return { sameContract1 }; }), - /Duplicated id Module1#first found in module Module1/ + 'The future id "first" is already used, please provide a different one.' ); }); }); From 2405ffb8db36230b9806d25a012f81db2c063dee Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 16 Oct 2023 22:28:47 +0100 Subject: [PATCH 1082/1302] fix: display of Deployment starting panel on reruns Our display of the deployment starting panel is dependent on the `RUN_START` event. This event was being triggered only once for a deployment, on initialization of the deployment state, on the very first run of the deployment. The panel was not being displayed on subsequent runs. Several moves have been made to fix this: 1. The original run start has been renamed to `DEPLOYMENT_INITIALIZE` and only has responsibility for setting the `chainId`. It is only ever run as the first message in a new deployment. 2. The execution engine is no longer invoked if there are no batches to run (i.e. no uncompleted futures). 3. A new `RUN_START` that is UI only has been added to the deployer. If there is a batch to execute, and the execution engine is being invoked, we trigger the new `RUN_START`. 4. The deployment initialize event in the state reducer only sets the `chainId` (rather than clearing executionStates as well). The UI for displaying the execution panel has been shifted to the new run start event. These changes gives us the correct UI combinations: - Show Deploying panel on fresh deploy - Only show complete on rerun with no new futures - Show Deploying panel on rerun with new futures Fixes #566. --- packages/core/src/internal/deployer.ts | 76 +++++---- .../execution/deployment-state-helpers.ts | 6 +- .../reducers/deployment-state-reducer.ts | 4 +- .../src/internal/execution/types/messages.ts | 7 +- .../journal/utils/emitExecutionEvent.ts | 6 +- .../core/src/internal/journal/utils/log.ts | 2 +- packages/core/src/types/execution-events.ts | 29 +++- .../deployments/chain-31337/journal.jsonl | 4 +- .../execution/reducers/start-a-new-run.ts | 2 +- .../src/ui/pretty-event-handler.ts | 14 +- .../src/ui/verbose-event-handler.ts | 160 ++++++------------ .../rerun-with-new-contract-deploy.ts | 74 ++++++++ 12 files changed, 215 insertions(+), 169 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 5c128ffaff..bc95cfb415 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -74,10 +74,9 @@ export class Deployer { accounts: string[], defaultSender: string ): Promise { - let deploymentState = await this._getOrInitializeDeploymentState( - ignitionModule.id, - this._deploymentDir - ); + this._emitDeploymentStartEvent(ignitionModule.id, this._deploymentDir); + + let deploymentState = await this._getOrInitializeDeploymentState(); const contracts = getFuturesFromModule(ignitionModule).filter(isContractFuture); @@ -167,26 +166,30 @@ export class Deployer { this._emitDeploymentBatchEvent(batches); - const executionEngine = new ExecutionEngine( - this._deploymentLoader, - this._artifactResolver, - this._executionStrategy, - this._jsonRpcClient, - this._executionEventListener, - this._config.requiredConfirmations, - this._config.timeBeforeBumpingFees, - this._config.maxFeeBumps, - this._config.blockPollingInterval - ); + if (this._hasBatchesToExecute(batches)) { + this._emitRunStartEvent(); + + const executionEngine = new ExecutionEngine( + this._deploymentLoader, + this._artifactResolver, + this._executionStrategy, + this._jsonRpcClient, + this._executionEventListener, + this._config.requiredConfirmations, + this._config.timeBeforeBumpingFees, + this._config.maxFeeBumps, + this._config.blockPollingInterval + ); - deploymentState = await executionEngine.executeModule( - deploymentState, - ignitionModule, - batches, - accounts, - deploymentParameters, - defaultSender - ); + deploymentState = await executionEngine.executeModule( + deploymentState, + ignitionModule, + batches, + accounts, + deploymentParameters, + defaultSender + ); + } const result = await this._getDeploymentResult( deploymentState, @@ -218,16 +221,11 @@ export class Deployer { }; } - private async _getOrInitializeDeploymentState( - moduleId: string, - deploymentDir: string | undefined - ): Promise { + private async _getOrInitializeDeploymentState(): Promise { const chainId = await this._jsonRpcClient.getChainId(); const deploymentState = await loadDeploymentState(this._deploymentLoader); if (deploymentState === undefined) { - this._emitDeploymentStartEvent(moduleId, deploymentDir); - return initializeDeploymentState(chainId, this._deploymentLoader); } @@ -276,6 +274,16 @@ export class Deployer { }); } + private _emitRunStartEvent(): void { + if (this._executionEventListener === undefined) { + return; + } + + this._executionEventListener.runStart({ + type: ExecutionEventType.RUN_START, + }); + } + private _emitDeploymentCompleteEvent(result: DeploymentResult): void { if (this._executionEventListener === undefined) { return; @@ -303,4 +311,14 @@ export class Deployer { ...status, }; } + + /** + * Determine if an execution run is necessary. + * + * @param batches - the batches to be executed + * @returns if there are batches to be executed + */ + private _hasBatchesToExecute(batches: string[][]) { + return batches.length > 0; + } } diff --git a/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/core/src/internal/execution/deployment-state-helpers.ts index 243073d3c7..4b4fac4420 100644 --- a/packages/core/src/internal/execution/deployment-state-helpers.ts +++ b/packages/core/src/internal/execution/deployment-state-helpers.ts @@ -4,9 +4,9 @@ import { deploymentStateReducer } from "./reducers/deployment-state-reducer"; import { DeploymentState } from "./types/deployment-state"; import { ExecutionResultType } from "./types/execution-result"; import { + DeploymentInitializeMessage, JournalMessage, JournalMessageType, - RunStartMessage, } from "./types/messages"; /** @@ -37,8 +37,8 @@ export async function initializeDeploymentState( chainId: number, deploymentLoader: DeploymentLoader ): Promise { - const message: RunStartMessage = { - type: JournalMessageType.RUN_START, + const message: DeploymentInitializeMessage = { + type: JournalMessageType.DEPLOYMENT_INITIALIZE, chainId, }; diff --git a/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts b/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts index 185d38ae72..e5e86aac75 100644 --- a/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts +++ b/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts @@ -26,10 +26,10 @@ export function deploymentStateReducer( return state; } - if (action.type === JournalMessageType.RUN_START) { + if (action.type === JournalMessageType.DEPLOYMENT_INITIALIZE) { return { + ...state, chainId: action.chainId, - executionStates: {}, }; } diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index c41f9b35b1..da9b0e15f5 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -18,7 +18,7 @@ import { } from "./jsonrpc"; export type JournalMessage = - | RunStartMessage + | DeploymentInitializeMessage | WipeExecutionStateMessage | DeploymentExecutionStateInitializeMessage | DeploymentExecutionStateCompleteMessage @@ -46,6 +46,7 @@ export type JournalMessage = * be sure to update UiEventType accordingly */ export enum JournalMessageType { + DEPLOYMENT_INITIALIZE = "DEPLOYMENT_INITIALIZE", RUN_START = "RUN_START", WIPE_APPLY = "WIPE_APPLY", DEPLOYMENT_EXECUTION_STATE_INITIALIZE = "DEPLOYMENT_EXECUTION_STATE_INITIALIZE", @@ -68,8 +69,8 @@ export enum JournalMessageType { ONCHAIN_INTERACTION_TIMEOUT = "ONCHAIN_INTERACTION_TIMEOUT", } -export interface RunStartMessage { - type: JournalMessageType.RUN_START; +export interface DeploymentInitializeMessage { + type: JournalMessageType.DEPLOYMENT_INITIALIZE; chainId: number; } diff --git a/packages/core/src/internal/journal/utils/emitExecutionEvent.ts b/packages/core/src/internal/journal/utils/emitExecutionEvent.ts index db7c4b12aa..429d7313f4 100644 --- a/packages/core/src/internal/journal/utils/emitExecutionEvent.ts +++ b/packages/core/src/internal/journal/utils/emitExecutionEvent.ts @@ -26,9 +26,9 @@ export function emitExecutionEvent( executionEventListener: ExecutionEventListener ): void { switch (message.type) { - case JournalMessageType.RUN_START: { - executionEventListener.runStart({ - type: ExecutionEventType.RUN_START, + case JournalMessageType.DEPLOYMENT_INITIALIZE: { + executionEventListener.deploymentInitialize({ + type: ExecutionEventType.DEPLOYMENT_INITIALIZE, chainId: message.chainId, }); break; diff --git a/packages/core/src/internal/journal/utils/log.ts b/packages/core/src/internal/journal/utils/log.ts index d5d32b47f6..3d6660d395 100644 --- a/packages/core/src/internal/journal/utils/log.ts +++ b/packages/core/src/internal/journal/utils/log.ts @@ -8,7 +8,7 @@ import { formatSolidityParameter } from "../../formatters"; export function logJournalableMessage(message: JournalMessage): void { switch (message.type) { - case JournalMessageType.RUN_START: + case JournalMessageType.DEPLOYMENT_INITIALIZE: console.log(`Deployment started`); break; diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index ecc19467c7..7fb61c0620 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -7,7 +7,7 @@ import { DeploymentResult } from "./deploy"; * @beta */ export type ExecutionEvent = - | RunStartEvent + | DeploymentInitializeEvent | WipeApplyEvent | DeploymentExecutionStateInitializeEvent | DeploymentExecutionStateCompleteEvent @@ -39,7 +39,6 @@ export type ExecutionEvent = * @beta */ export enum ExecutionEventType { - RUN_START = "RUN_START", WIPE_APPLY = "WIPE_APPLY", DEPLOYMENT_EXECUTION_STATE_INITIALIZE = "DEPLOYMENT_EXECUTION_STATE_INITIALIZE", DEPLOYMENT_EXECUTION_STATE_COMPLETE = "DEPLOYMENT_EXECUTION_STATE_COMPLETE", @@ -59,9 +58,11 @@ export enum ExecutionEventType { ONCHAIN_INTERACTION_DROPPED = "ONCHAIN_INTERACTION_DROPPED", ONCHAIN_INTERACTION_REPLACED_BY_USER = "ONCHAIN_INTERACTION_REPLACED_BY_USER", ONCHAIN_INTERACTION_TIMEOUT = "ONCHAIN_INTERACTION_TIMEOUT", - BATCH_INITIALIZE = "BATCH_INITIALIZE", DEPLOYMENT_START = "DEPLOYMENT_START", + DEPLOYMENT_INITIALIZE = "DEPLOYMENT_INITIALIZE", RECONCILIATION_WARNINGS = "RECONCILIATION_WARNINGS", + BATCH_INITIALIZE = "BATCH_INITIALIZE", + RUN_START = "RUN_START", BEGIN_NEXT_BATCH = "BEGIN_NEXT_BATCH", DEPLOYMENT_COMPLETE = "DEPLOYMENT_COMPLETE", SET_MODULE_ID = "SET_MODULE_ID", @@ -79,12 +80,12 @@ export interface DeploymentStartEvent { } /** - * An event indicating a new run has started. + * An event indicating a new deployment has been initialized. * * @beta */ -export interface RunStartEvent { - type: ExecutionEventType.RUN_START; +export interface DeploymentInitializeEvent { + type: ExecutionEventType.DEPLOYMENT_INITIALIZE; chainId: number; } @@ -98,6 +99,15 @@ export interface BatchInitializeEvent { batches: string[][]; } +/** + * An event indicating that the deployment is commenencing an execution run. + * + * @beta + */ +export interface RunStartEvent { + type: ExecutionEventType.RUN_START; +} + /** * An event indicating that the execution engine has moved onto * the next batch. @@ -422,7 +432,6 @@ export interface ExecutionEventHeld { * @beta */ export interface ExecutionEventTypeMap { - [ExecutionEventType.RUN_START]: RunStartEvent; [ExecutionEventType.WIPE_APPLY]: WipeApplyEvent; [ExecutionEventType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE]: DeploymentExecutionStateInitializeEvent; [ExecutionEventType.DEPLOYMENT_EXECUTION_STATE_COMPLETE]: DeploymentExecutionStateCompleteEvent; @@ -442,11 +451,13 @@ export interface ExecutionEventTypeMap { [ExecutionEventType.ONCHAIN_INTERACTION_DROPPED]: OnchainInteractionDroppedEvent; [ExecutionEventType.ONCHAIN_INTERACTION_REPLACED_BY_USER]: OnchainInteractionReplacedByUserEvent; [ExecutionEventType.ONCHAIN_INTERACTION_TIMEOUT]: OnchainInteractionTimeoutEvent; - [ExecutionEventType.BATCH_INITIALIZE]: BatchInitializeEvent; [ExecutionEventType.DEPLOYMENT_START]: DeploymentStartEvent; + [ExecutionEventType.DEPLOYMENT_INITIALIZE]: DeploymentInitializeEvent; + [ExecutionEventType.RECONCILIATION_WARNINGS]: ReconciliationWarningsEvent; + [ExecutionEventType.BATCH_INITIALIZE]: BatchInitializeEvent; + [ExecutionEventType.RUN_START]: RunStartEvent; [ExecutionEventType.BEGIN_NEXT_BATCH]: BeginNextBatchEvent; [ExecutionEventType.DEPLOYMENT_COMPLETE]: DeploymentCompleteEvent; - [ExecutionEventType.RECONCILIATION_WARNINGS]: ReconciliationWarningsEvent; [ExecutionEventType.SET_MODULE_ID]: SetModuleIdEvent; } diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl index 3904c19613..2cfa12c559 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl @@ -1,7 +1,7 @@ -{"chainId":123,"type":"RUN_START"} +{"chainId":123,"type":"DEPLOYMENT_INITIALIZE"} {"artifactId":"LockModule:Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule:Lock","futureType":"NAMED_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} {"futureId":"LockModule:Lock","networkInteraction":{"data":"0x60806040526040516105a23803806105a2833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b6103d3806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b93925050505600000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} {"futureId":"LockModule:Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d"},"type":"TRANSACTION_SEND"} {"futureId":"LockModule:Lock","hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d","networkInteractionId":1,"receipt":{"blockHash":"0xf35aacce8d5fc6276fc544712013691b75fd980178c2a58e63bc37ee1cd76371","blockNumber":1,"contractAddress":"0x5fbdb2315678afecb367f032d93f642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"LockModule:Lock","result":{"address":"0x5fbdb2315678afecb367f032d93f642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file +{"futureId":"LockModule:Lock","result":{"address":"0x5fbdb2315678afecb367f032d93f642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} diff --git a/packages/core/test/execution/reducers/start-a-new-run.ts b/packages/core/test/execution/reducers/start-a-new-run.ts index a1befb2292..6b473aa441 100644 --- a/packages/core/test/execution/reducers/start-a-new-run.ts +++ b/packages/core/test/execution/reducers/start-a-new-run.ts @@ -13,7 +13,7 @@ describe("DeploymentStateReducer", () => { initialState = deploymentStateReducer(undefined); updatedState = deploymentStateReducer(initialState, { - type: JournalMessageType.RUN_START, + type: JournalMessageType.DEPLOYMENT_INITIALIZE, chainId: 31337, }); }); diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 72e9c5c333..8a1a1c496b 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -7,6 +7,7 @@ import { DeploymentCompleteEvent, DeploymentExecutionStateCompleteEvent, DeploymentExecutionStateInitializeEvent, + DeploymentInitializeEvent, DeploymentParameters, DeploymentResult, DeploymentResultType, @@ -82,12 +83,14 @@ export class PrettyEventHandler implements ExecutionEventListener { process.stdout.write(calculateStartingMessage(this.state)); } - public runStart(event: RunStartEvent): void { + public deploymentInitialize(event: DeploymentInitializeEvent): void { this.state = { ...this.state, chainId: event.chainId, }; + } + public runStart(_event: RunStartEvent): void { this._clearCurrentLine(); console.log(calculateDeployingModulePanel(this.state)); } @@ -249,8 +252,6 @@ export class PrettyEventHandler implements ExecutionEventListener { ): void {} public deploymentComplete(event: DeploymentCompleteEvent): void { - const originalStatus = this.state.status; - this.state = { ...this.state, status: UiStateDeploymentStatus.COMPLETE, @@ -258,8 +259,13 @@ export class PrettyEventHandler implements ExecutionEventListener { batches: this._applyResultToBatches(this.state.batches, event.result), }; - if (originalStatus !== UiStateDeploymentStatus.UNSTARTED) { + // If batches where executed, rerender the last batch + if (this.state.currentBatch > 0) { this._redisplayCurrentBatch(); + } else { + // Otherwise only the completion panel will be shown so clear + // the Starting Ignition line. + this._clearCurrentLine(); } console.log(calculateDeploymentCompleteDisplay(event, this.state)); diff --git a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts index dd93e7120e..ca34006334 100644 --- a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts @@ -7,6 +7,7 @@ import { DeploymentCompleteEvent, DeploymentExecutionStateCompleteEvent, DeploymentExecutionStateInitializeEvent, + DeploymentInitializeEvent, DeploymentStartEvent, ExecutionEventListener, ExecutionEventNetworkInteractionType, @@ -29,29 +30,20 @@ import { TransactionSendEvent, WipeApplyEvent, } from "@nomicfoundation/ignition-core"; -import chalk from "chalk"; export class VerboseEventHandler implements ExecutionEventListener { - public runStart(event: RunStartEvent): void { - console.log( - chalk.inverse(`Deployment started for chainId: ${event.chainId}`) - ); + public deploymentInitialize(event: DeploymentInitializeEvent): void { + console.log(`Deployment initialized for chainId: ${event.chainId}`); } public wipeApply(event: WipeApplyEvent): void { - console.log( - chalk.bold(`Removing the execution of future ${event.futureId}`) - ); + console.log(`Removing the execution of future ${event.futureId}`); } public deploymentExecutionStateInitialize( event: DeploymentExecutionStateInitializeEvent ): void { - console.log( - chalk.blueBright( - `Starting to execute the deployment future ${event.futureId}` - ) - ); + console.log(`Starting to execute the deployment future ${event.futureId}`); } public deploymentExecutionStateComplete( @@ -60,25 +52,19 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - chalk.bgBlue.bold( - `Successfully completed the execution of deployment future ${ - event.futureId - } with address ${event.result.result ?? "undefined"}` - ) + `Successfully completed the execution of deployment future ${ + event.futureId + } with address ${event.result.result ?? "undefined"}` ); } case ExecutionEventResultType.ERROR: { return console.log( - chalk.bgRed.bold( - `Execution of future ${event.futureId} failed with reason: ${event.result.error}` - ) + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` ); } case ExecutionEventResultType.HELD: { return console.log( - chalk.bgYellow.bold( - `Execution of future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` - ) + `Execution of future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` ); } } @@ -87,9 +73,7 @@ export class VerboseEventHandler implements ExecutionEventListener { public callExecutionStateInitialize( event: CallExecutionStateInitializeEvent ): void { - console.log( - chalk.cyanBright(`Starting to execute the call future ${event.futureId}`) - ); + console.log(`Starting to execute the call future ${event.futureId}`); } public callExecutionStateComplete( @@ -98,23 +82,17 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - chalk.bgCyan.bold( - `Successfully completed the execution of call future ${event.futureId}` - ) + `Successfully completed the execution of call future ${event.futureId}` ); } case ExecutionEventResultType.ERROR: { return console.log( - chalk.bgRed.bold( - `Execution of call future ${event.futureId} failed with reason: ${event.result.error}` - ) + `Execution of call future ${event.futureId} failed with reason: ${event.result.error}` ); } case ExecutionEventResultType.HELD: { return console.log( - chalk.bgYellow.bold( - `Execution of call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` - ) + `Execution of call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` ); } } @@ -123,11 +101,7 @@ export class VerboseEventHandler implements ExecutionEventListener { public staticCallExecutionStateInitialize( event: StaticCallExecutionStateInitializeEvent ): void { - console.log( - chalk.cyanBright( - `Starting to execute the static call future ${event.futureId}` - ) - ); + console.log(`Starting to execute the static call future ${event.futureId}`); } public staticCallExecutionStateComplete( @@ -136,25 +110,19 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - chalk.bgCyan.bold( - `Successfully completed the execution of static call future ${ - event.futureId - } with result ${event.result.result ?? "undefined"}` - ) + `Successfully completed the execution of static call future ${ + event.futureId + } with result ${event.result.result ?? "undefined"}` ); } case ExecutionEventResultType.ERROR: { return console.log( - chalk.bgRed.bold( - `Execution of static call future ${event.futureId} failed with reason: ${event.result.error}` - ) + `Execution of static call future ${event.futureId} failed with reason: ${event.result.error}` ); } case ExecutionEventResultType.HELD: { return console.log( - chalk.bgYellow.bold( - `Execution of static call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` - ) + `Execution of static call future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` ); } } @@ -163,11 +131,7 @@ export class VerboseEventHandler implements ExecutionEventListener { public sendDataExecutionStateInitialize( event: SendDataExecutionStateInitializeEvent ): void { - console.log( - chalk.magentaBright( - `Started to execute the send data future ${event.futureId}` - ) - ); + console.log(`Started to execute the send data future ${event.futureId}`); } public sendDataExecutionStateComplete( @@ -176,25 +140,19 @@ export class VerboseEventHandler implements ExecutionEventListener { switch (event.result.type) { case ExecutionEventResultType.SUCCESS: { return console.log( - chalk.bgMagenta.bold( - `Successfully completed the execution of send data future ${ - event.futureId - } in tx ${event.result.result ?? "undefined"}` - ) + `Successfully completed the execution of send data future ${ + event.futureId + } in tx ${event.result.result ?? "undefined"}` ); } case ExecutionEventResultType.ERROR: { return console.log( - chalk.bgRed.bold( - `Execution of future ${event.futureId} failed with reason: ${event.result.error}` - ) + `Execution of future ${event.futureId} failed with reason: ${event.result.error}` ); } case ExecutionEventResultType.HELD: { return console.log( - chalk.bgYellow.bold( - `Execution of send future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` - ) + `Execution of send future ${event.futureId}/${event.result.heldId} held with reason: ${event.result.reason}` ); } } @@ -203,20 +161,16 @@ export class VerboseEventHandler implements ExecutionEventListener { public contractAtExecutionStateInitialize( event: ContractAtExecutionStateInitializeEvent ): void { - console.log( - chalk.gray.bold(`Executed contract at future ${event.futureId}`) - ); + console.log(`Executed contract at future ${event.futureId}`); } public readEventArgumentExecutionStateInitialize( event: ReadEventArgExecutionStateInitializeEvent ): void { console.log( - chalk.green.dim( - `Executed read event argument future ${event.futureId} with result ${ - event.result.result ?? "undefined" - }` - ) + `Executed read event argument future ${event.futureId} with result ${ + event.result.result ?? "undefined" + }` ); } @@ -228,42 +182,32 @@ export class VerboseEventHandler implements ExecutionEventListener { ExecutionEventNetworkInteractionType.ONCHAIN_INTERACTION ) { console.log( - chalk.dim( - `New onchain interaction requested for future ${event.futureId}` - ) + `New onchain interaction requested for future ${event.futureId}` ); } else { - console.log( - chalk.dim(`New static call requested for future ${event.futureId}`) - ); + console.log(`New static call requested for future ${event.futureId}`); } } public transactionSend(event: TransactionSendEvent): void { console.log( - chalk.dim( - `Transaction ${event.hash} sent for onchain interaction of future ${event.futureId}` - ) + `Transaction ${event.hash} sent for onchain interaction of future ${event.futureId}` ); } public transactionConfirm(event: TransactionConfirmEvent): void { - console.log(chalk.dim(`Transaction ${event.hash} confirmed`)); + console.log(`Transaction ${event.hash} confirmed`); } public staticCallComplete(event: StaticCallCompleteEvent): void { - console.log( - chalk.dim(`Static call completed for future ${event.futureId}`) - ); + console.log(`Static call completed for future ${event.futureId}`); } public onchainInteractionBumpFees( event: OnchainInteractionBumpFeesEvent ): void { console.log( - chalk.dim( - `A transaction with higher fees will be sent for onchain interaction of future ${event.futureId}` - ) + `A transaction with higher fees will be sent for onchain interaction of future ${event.futureId}` ); } @@ -271,9 +215,7 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionDroppedEvent ): void { console.log( - chalk.dim( - `Transactions for onchain interaction of future ${event.futureId} has been dropped and will be resent` - ) + `Transactions for onchain interaction of future ${event.futureId} has been dropped and will be resent` ); } @@ -281,9 +223,7 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionReplacedByUserEvent ): void { console.log( - chalk.dim( - `Transactions for onchain interaction of future ${event.futureId} has been replaced by the user and the onchain interaction exection will start again` - ) + `Transactions for onchain interaction of future ${event.futureId} has been replaced by the user and the onchain interaction exection will start again` ); } @@ -291,32 +231,26 @@ export class VerboseEventHandler implements ExecutionEventListener { event: OnchainInteractionTimeoutEvent ): void { console.log( - chalk.dim( - `Onchain interaction of future ${event.futureId} failed due to being resent too many times and not having confirmed` - ) + `Onchain interaction of future ${event.futureId} failed due to being resent too many times and not having confirmed` ); } public batchInitialize(event: BatchInitializeEvent): void { console.log( - chalk.greenBright.bold( - `Starting execution for batches: ${JSON.stringify(event.batches)}` - ) + `Starting execution for batches: ${JSON.stringify(event.batches)}` ); } public deploymentStart(_event: DeploymentStartEvent): void { - console.log( - chalk.yellowBright.bold(`Starting execution for new deployment`) - ); + console.log(`Starting execution for new deployment`); } public beginNextBatch(_event: BeginNextBatchEvent): void { - console.log(chalk.greenBright.bold(`Starting execution for next batch`)); + console.log(`Starting execution for next batch`); } public deploymentComplete(_event: DeploymentCompleteEvent): void { - console.log(chalk.bgGreen.bold(`Deployment complete`)); + console.log(`Deployment complete`); } public reconciliationWarnings(event: ReconciliationWarningsEvent): void { @@ -328,8 +262,10 @@ export class VerboseEventHandler implements ExecutionEventListener { } public setModuleId(event: SetModuleIdEvent): void { - console.log( - chalk.yellowBright(`Starting validation for module: ${event.moduleName}`) - ); + console.log(`Starting validation for module: ${event.moduleName}`); + } + + public runStart(_event: RunStartEvent): void { + console.log("Execution run starting"); } } diff --git a/packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts b/packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts new file mode 100644 index 0000000000..aa4f14eaa4 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts @@ -0,0 +1,74 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../use-ignition-project"; + +import { mineBlock } from "./helpers"; + +/** + * Run an initial deploy, that deploys a contract. The module is modified + * to add an additional dependent contract. On the second run only one contract + * is deployed. + */ +describe("execution - rerun with new contract deploy", () => { + useFileIgnitionProject("minimal", "rerun-with-new-contract-deploy"); + + it("should deploy only one contract on second run", async function () { + const moduleDefinition = buildModule("BarModule", (m) => { + const bar = m.contract("Bar"); + + return { + bar, + }; + }); + + // Start the deploy + const { bar: originalBar } = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo1 + await c.mineBlock(1); + } + ); + + const firstRunBarAddress = (await originalBar.getAddress()).toLowerCase(); + + // Further blocks with no pending transactions + await mineBlock(this.hre); + await mineBlock(this.hre); + + const updatedModuleDefinition = buildModule("BarModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [bar]); + + return { + bar, + usesContract, + }; + }); + + // Rerun the deployment + const result = await this.runControlledDeploy( + updatedModuleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo2 + await c.mineBlock(1); + } + ); + + const usedAddress = ( + await result.usesContract.contractAddress() + ).toLowerCase(); + + const secondRunBarAddress = (await result.bar.getAddress()).toLowerCase(); + + // The BarModule#Bar contract has not been redeployed if + // it shares the same address. + assert.equal(firstRunBarAddress, secondRunBarAddress); + assert.equal(usedAddress, secondRunBarAddress); + }); +}); From 6f5e806c8e839243e747e2d7d207de439ced4e20 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 17 Oct 2023 12:57:21 +0100 Subject: [PATCH 1083/1302] fix: display reconciliation warnings Add the reconciliation warnings to the deploying panel. Refactor the test format utility used in display tests as well. Fixes #567 --- .../calculate-deploying-module-panel.ts | 16 ++++- .../ui/helpers/calculate-batch-display.ts | 31 ++++------ ...alculate-deploying-module-panel-display.ts | 58 +++++++++++++++++++ .../calculate-deployment-complete-display.ts | 11 +--- .../calculate-deployment-status-display.ts | 11 +--- .../test/ui/helpers/test-format.ts | 18 ++++++ 6 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts create mode 100644 packages/hardhat-plugin/test/ui/helpers/test-format.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts index 5066120a81..84f03d8f4c 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -3,8 +3,22 @@ import chalk from "chalk"; import { UiState } from "../types"; export function calculateDeployingModulePanel(state: UiState): string { - return `Hardhat Ignition 🚀 + let deployingMessage = `Hardhat Ignition 🚀 ${chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)} `; + + if (state.warnings.length > 0) { + deployingMessage += `\n${chalk.yellow( + "Warning - previously executed futures are not in the module:" + )}\n`; + + deployingMessage += state.warnings + .map((futureId) => chalk.yellow(` - ${futureId}`)) + .join("\n"); + + deployingMessage += "\n"; + } + + return deployingMessage; } diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 289bc40dfd..7cd582cb7f 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -8,6 +8,8 @@ import { UiStateDeploymentStatus, } from "../../../src/ui/types"; +import { testFormat } from "./test-format"; + const exampleState: UiState = { status: UiStateDeploymentStatus.DEPLOYING, chainId: 31337, @@ -21,10 +23,10 @@ const exampleState: UiState = { describe("ui - calculate batch display", () => { it("should render a batch with a single running future", () => { - const expectedText = testFormat` + const expectedText = testFormat(` Batch #1 Executing ExampleModule#Token... - `; + `); assertBatchText( [ @@ -41,10 +43,10 @@ describe("ui - calculate batch display", () => { }); it("should render a batch with a single completed future", () => { - const expectedText = testFormat` + const expectedText = testFormat(` Batch #1 Executed ExampleModule#Token - `; + `); assertBatchText( [ @@ -61,10 +63,10 @@ describe("ui - calculate batch display", () => { }); it("should render a batch with a single failed future", () => { - const expectedText = testFormat` + const expectedText = testFormat(` Batch #1 Failed ExampleModule#Token - `; + `); assertBatchText( [ @@ -82,10 +84,10 @@ describe("ui - calculate batch display", () => { }); it("should render a batch with a single held future", () => { - const expectedText = testFormat` + const expectedText = testFormat(` Batch #1 Held ExampleModule#Token - `; + `); assertBatchText( [ @@ -104,13 +106,13 @@ describe("ui - calculate batch display", () => { }); it("should render a complex batch in multiple states", () => { - const expectedText = testFormat` + const expectedText = testFormat(` Batch #1 Failed ExampleModule#Dex Held ExampleModule#ENS Executed ExampleModule#Router Executing ExampleModule#Token... - `; + `); assertBatchText( [ @@ -161,12 +163,3 @@ function assertBatchText( assert.equal(height, expectedHeight); assert.equal(actualText, expectedText); } - -function testFormat(expected: TemplateStringsArray): string { - return expected - .toString() - .substring(1) // Remove the first newline - .split("\n") - .map((line) => line.substring(6)) // remove prefix whitespace - .join("\n"); -} diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts new file mode 100644 index 0000000000..a28b4c80f9 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -0,0 +1,58 @@ +import { assert } from "chai"; +import chalk from "chalk"; + +import { calculateDeployingModulePanel } from "../../../src/ui/helpers/calculate-deploying-module-panel"; +import { UiState, UiStateDeploymentStatus } from "../../../src/ui/types"; + +import { testFormat } from "./test-format"; + +describe("ui - calculate starting message display", () => { + const exampleState: UiState = { + status: UiStateDeploymentStatus.UNSTARTED, + chainId: 31337, + moduleName: "ExampleModule", + deploymentDir: "/users/example", + batches: [], + currentBatch: 0, + result: null, + warnings: [], + }; + + it("should display the deploying module message", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel(exampleState); + + assert.equal(actualText, expectedText); + }); + + it("should display reconciliation warnings", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + + ${chalk.yellow( + "Warning - previously executed futures are not in the module:" + )} + ${chalk.yellow(" - MyModule#Contract1")} + ${chalk.yellow(" - MyModule#Contract1.call1")} + ${chalk.yellow(" - MyModule#Contract2")} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + warnings: [ + "MyModule#Contract1", + "MyModule#Contract1.call1", + "MyModule#Contract2", + ], + }); + + assert.equal(actualText, expectedText); + }); +}); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index 5109cb8b7d..38c5df8c6f 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -12,6 +12,8 @@ import chalk from "chalk"; import { calculateDeploymentCompleteDisplay } from "../../../src/ui/helpers/calculate-deployment-complete-display"; +import { testFormat } from "./test-format"; + describe("ui - calculate deployment complete display", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0x0011223344556677889900112233445566778899"; @@ -256,12 +258,3 @@ describe("ui - calculate deployment complete display", () => { }); }); }); - -function testFormat(expected: string): string { - return expected - .toString() - .substring(1) // Remove the first newline - .split("\n") - .map((line) => line.substring(8)) // remove prefix whitespace - .join("\n"); -} diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index e366de0ebe..259a84928e 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -4,6 +4,8 @@ import chalk from "chalk"; import { calculateDeploymentStatusDisplay } from "../../../src/ui/helpers/calculate-deployment-status-display"; +import { testFormat } from "./test-format"; + describe("ui - calculate deployment status display", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0x0011223344556677889900112233445566778899"; @@ -172,12 +174,3 @@ describe("ui - calculate deployment status display", () => { }); }); }); - -function testFormat(expected: string): string { - return expected - .toString() - .substring(1) // Remove the first newline - .split("\n") - .map((line) => line.substring(8)) // remove prefix whitespace - .join("\n"); -} diff --git a/packages/hardhat-plugin/test/ui/helpers/test-format.ts b/packages/hardhat-plugin/test/ui/helpers/test-format.ts new file mode 100644 index 0000000000..6bc238a42f --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/test-format.ts @@ -0,0 +1,18 @@ +/** + * Formats a multiline string to make appear closer to the command line + * when inside a test file. The first line is ignored, and the whitespace + * at the start of the line is removed. + */ +export function testFormat(expected: string): string { + const lines = expected + .toString() + .substring(1) // Remove the first newline + .split("\n"); + + // calcualte the length of the whitespace prefix based on the first line + const whitespacePrefixLength = lines[0].search(/\S/); + + return lines + .map((line) => line.substring(whitespacePrefixLength)) // strip prefix whitespace + .join("\n"); +} From 37728210df8622d6ed039c81c8f07e439456fceb Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 18 Oct 2023 14:38:03 +0000 Subject: [PATCH 1084/1302] Update the repository in the package.json's --- packages/core/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index 678038a145..eea2632d6a 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -4,7 +4,7 @@ "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", - "repository": "github:nomicfoundation/ignition", + "repository": "github:NomicFoundation/hardhat-ignition", "keywords": [ "ethereum", "smart-contracts", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index c43b181991..2700906b70 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -4,7 +4,7 @@ "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", - "repository": "github:nomicfoundation/ignition", + "repository": "github:NomicFoundation/hardhat-ignition", "keywords": [ "ethereum", "smart-contracts", From d2ea000dfe93c1b40b53f0e18f97ec135141ee07 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 18 Oct 2023 14:53:12 +0000 Subject: [PATCH 1085/1302] Add a hint to the module validation error --- packages/hardhat-plugin/src/load-module.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 72747f69af..16f9a05e27 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -77,7 +77,7 @@ export function loadModule( throw new NomicLabsHardhatPluginError( "hardhat-ignition", - "Module validation failed." + "Module validation failed. Check the stack trace above to identify the issue and its source code location." ); } From e61462730c48b5be8371e2a15240ebdcaa61e103 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 19 Oct 2023 10:56:45 +0100 Subject: [PATCH 1086/1302] fix: display wrong chainId correctly Move the deployment start event to after the state initialization where the chainId check is. This works, but I suspect we should consider dealing with unknown exceptions occuring during UI processing. The chainId check now throws an Ignition error from a new `DEPLOY` range of errors. This error has been added to the whitelist (we don't need to see the stack trace). Fixes #571. --- packages/core/src/errors-list.ts | 11 +++++++++++ packages/core/src/internal/deployer.ts | 18 ++++++++++++------ .../new-api/internal/reconciliation/chainId.ts | 2 +- .../src/utils/shouldBeHardhatPluginError.ts | 2 +- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 5246ad7ba4..50c317f1d3 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -68,6 +68,11 @@ export const ERROR_RANGES: { max: 899, title: "Status errors", }, + DEPLOY: { + min: 900, + max: 999, + title: "Deploy errors", + }, }; /** @@ -324,6 +329,12 @@ export const ERRORS = { "Cannot get status for nonexistant deployment at %deploymentDir%", }, }, + DEPLOY: { + CHANGED_CHAINID: { + number: 900, + message: `The deployment's chain cannot be changed between runs. The deployment was previously run against the chain %previousChainId%, but the current network is the chain %currentChainId%.`, + }, + }, }; /** diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index bc95cfb415..b1b5be9476 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -1,5 +1,7 @@ import type { IgnitionModule, IgnitionModuleResult } from "../types/module"; +import { IgnitionError } from "../errors"; +import { ERRORS } from "../errors-list"; import { isContractFuture } from "../type-guards"; import { ArtifactResolver } from "../types/artifact"; import { @@ -74,10 +76,10 @@ export class Deployer { accounts: string[], defaultSender: string ): Promise { - this._emitDeploymentStartEvent(ignitionModule.id, this._deploymentDir); - let deploymentState = await this._getOrInitializeDeploymentState(); + this._emitDeploymentStartEvent(ignitionModule.id, this._deploymentDir); + const contracts = getFuturesFromModule(ignitionModule).filter(isContractFuture); @@ -229,10 +231,14 @@ export class Deployer { return initializeDeploymentState(chainId, this._deploymentLoader); } - assertIgnitionInvariant( - deploymentState.chainId === chainId, - `Trying to continue deployment in a different chain. Previous chain id: ${deploymentState.chainId}. Current chain id: ${chainId}` - ); + // TODO: this should be moved out, it is not obvious that a significant + // check is being done in an init method + if (deploymentState.chainId !== chainId) { + throw new IgnitionError(ERRORS.DEPLOY.CHANGED_CHAINID, { + previousChainId: deploymentState.chainId, + currentChainId: chainId, + }); + } return deploymentState; } diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts index 888eb4be84..a1048cf756 100644 --- a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts +++ b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts @@ -17,7 +17,7 @@ describe("chainId reconciliation", function () { modulePath: "./ignition/modules/LockModule.js", } ), - /Previous chain id: 123\. Current chain id: 31337/ + /The deployment's chain cannot be changed between runs. The deployment was previously run against the chain 123, but the current network is the chain 31337./ ); }); }); diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index 88ef24ad54..a6c4d8bbeb 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -11,7 +11,7 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; const whitelist = [ 200, 201, 202, 203, 403, 404, 405, 600, 601, 602, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 800, + 720, 721, 722, 723, 724, 725, 726, 800, 900, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { From 7f2f87af164d2d5ff96e2e6f0746ca2f8c5e61f1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 19 Oct 2023 17:51:39 +0100 Subject: [PATCH 1087/1302] fix: stop future senders clearing out pending trans The future senders update the account to nonce+transactions list in such away that existing pending transactions for the account are untouched. No test has been added, but the case has been covered by enhancing the example module to include an unexecuted future in the module. Fixes #574. --- .../get-nonce-sync-messages.ts | 4 +++- .../get-nonce-sync-messages.ts | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts index 5d80f25e29..d74d3f08e3 100644 --- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts @@ -291,7 +291,9 @@ function createMapFromSenderToNonceAndTransactions( ); for (const futureSender of futureSenders) { - pendingTransactionsPerAccount[futureSender] = []; + if (pendingTransactionsPerAccount[futureSender] === undefined) { + pendingTransactionsPerAccount[futureSender] = []; + } } for (const pendingTransactions of Object.values( diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index 341af46015..c7446aa7ed 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -53,7 +53,18 @@ describe("execution - getNonceSyncMessages", () => { beforeEach(() => { exampleModule = buildModule("Example", (m) => { - m.contract("MyContract", [], { from: exampleAccounts[1] }); + const myContract = m.contract("MyContract", [], { + from: exampleAccounts[1], + }); + + // A follow on contract deploy using the same sender. + // This was added, due to a bug where the presence + // of futures with the same sender cleared the + // pending transactions. See issue #574. + m.contract("AnotherContract", [], { + from: exampleAccounts[1], + after: [myContract], + }); return {}; }); @@ -623,6 +634,11 @@ describe("execution - getNonceSyncMessages", () => { id: "Example#MyContract", status: ExecutionStatus.SUCCESS, }, + "Example#AnotherContract": { + ...exampleDeploymentState, + id: "Example#AnotherContract", + status: ExecutionStatus.SUCCESS, + }, }, }, transactionCountEntries: { From 0adb6ff5bbc371a0af792aff2a2c7f08064a3f9a Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 19 Oct 2023 19:01:05 +0100 Subject: [PATCH 1088/1302] fix: update nonce storage on getNewNonce Update the nonce storage to record based on sender. Fixes #576 --- .../json-rpc-nonce-manager.ts | 5 +- .../test/execution/rerun-after-kill.ts | 68 +++++++++++++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 packages/hardhat-plugin/test/execution/rerun-after-kill.ts diff --git a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts index 7db279c27b..ad0fa4f460 100644 --- a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts +++ b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts @@ -47,8 +47,9 @@ export class JsonRpcNonceManager implements NonceManager { }); } - // The nonce hasn't been used yet, but we update as it will be immediately used. - this._maxUsedNonce[expectedNonce] = expectedNonce; + // The nonce hasn't been used yet, but we update as + // it will be immediately used. + this._maxUsedNonce[sender] = expectedNonce; return expectedNonce; } diff --git a/packages/hardhat-plugin/test/execution/rerun-after-kill.ts b/packages/hardhat-plugin/test/execution/rerun-after-kill.ts new file mode 100644 index 0000000000..825134c812 --- /dev/null +++ b/packages/hardhat-plugin/test/execution/rerun-after-kill.ts @@ -0,0 +1,68 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../use-ignition-project"; + +/** + * Run an initial deploy that deploys multiple contracts, one contract per batch. + * Kill the process on the first transaction being submitted. + * Restart the deployment and ensure that the deployment is completed with + * all contracts deployed. + * + * This covers a bug in the nonce mangement code: see #576 + */ +describe("execution - rerun after kill", () => { + useFileIgnitionProject("minimal", "rerun-after-kill"); + + it("should pickup deployment and run contracts to completion", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo1 = m.contract("Foo", [], { id: "foo1" }); + const foo2 = m.contract("Foo", [], { id: "foo2" }); + const foo3 = m.contract("Foo", [], { id: "foo3" }); + const foo4 = m.contract("Foo", [], { id: "foo4" }); + const foo5 = m.contract("Foo", [], { id: "foo5" }); + + return { + foo1, + foo2, + foo3, + foo4, + foo5, + }; + }); + + // Start the deploy + await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo1 + await c.waitForPendingTxs(1); + + c.exitDeploy(); + } + ); + + // Rerun the deployment + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // this block shound include deployment of foo2 + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + await c.mineBlock(1); + } + ); + + assert.equal(await result.foo1.x(), Number(1)); + assert.equal(await result.foo2.x(), Number(1)); + assert.equal(await result.foo3.x(), Number(1)); + assert.equal(await result.foo4.x(), Number(1)); + assert.equal(await result.foo5.x(), Number(1)); + }); +}); From 4dcef44db887972ffd8c6ce7fa024807cb97895b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 18 Oct 2023 17:55:55 +0100 Subject: [PATCH 1089/1302] docs: update the README.md files Each of the `README.md` docs in the repo has been updated. - Root README.md The root `README.md` is now a symlink to the `./packages/hardhat-plugin/README.md` file. This matches Hardhat's approach. - The plugin README.md * Add a banner image - the image has been uploaded to github usercontent * Update the intro text based on the docs site overview page * the examples have been removed * the getting started and docs section have been amalgamated * the docs section links out to our documentation website * The contributing guide is now a link to github (so we can symlink without issue) - core README.md * Add standard sections, including a basic usage example - ui README.md * Add standard sections, and warning never to use this package. --- CONTRIBUTING.md | 3 +- README.md | 56 +---------------------------- packages/core/README.md | 60 +++++++++++++++++++++++++++++-- packages/hardhat-plugin/README.md | 39 ++++++++++++++------ packages/ui/README.md | 19 ++++++++-- 5 files changed, 107 insertions(+), 70 deletions(-) mode change 100644 => 120000 README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 70e7dbaac6..646e2afdf9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,10 +10,11 @@ If you find a bug or want to propose a new feature, please open an issue. Pull r This repository is a monorepo handled with `npm` workspaces. -There are two packages: +There are three packages: - [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments - [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library +- [**ui**](./packages/ui/README.md) - containing the UI for the visualize report ## Setup diff --git a/README.md b/README.md deleted file mode 100644 index 4194fd790c..0000000000 --- a/README.md +++ /dev/null @@ -1,55 +0,0 @@ -[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) - -# Hardhat Ignition - -Hardhat Ignition is **Hardhat**'s deployment solution. It is a **Hardhat** plugin that allows you to create declarative deployments that can be reproduced across different networks. - -Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. - -Join our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases, plugins and tutorials. - -## Installation - -```bash -npm install --save-dev @nomicfoundation/hardhat-ignition -``` - -And add the following statement to your `hardhat.config.js`: - -```js -require("@nomicfoundation/hardhat-ignition"); -``` - -Or, if you are using TypeScript, add this to your `hardhat.config.ts`: - -```js -import "@nomicfoundation/hardhat-ignition"; -``` - -## Getting Started - -See our [Getting started guide](https://hardhat.org/hardhat-ignition/getting-started) for a worked example of **Hardhat Ignition usage**. - -## Documentation - -To learn more about Hardhat Ignition, please visit [our website](https://hardhat.org/hardhat-ignition). - -### Examples - -This repo contains example projects that show **Hardhat Ignition** features in context (under `./examples`): - -- [Sample](./examples/sample) - the **Hardhat** starter project enhanced with Hardhat Ignition -- [Typescript Sample](./examples/ts-sample) - the **Hardhat** typescript starter project enhanced with Hardhat Ignition -- [ENS](./examples/ens) - deploy ENS and its registry for local testing - -## Contributing - -Contributions are always welcome! Feel free to open any issue or send a pull request. - -Go to [CONTRIBUTING.md](./CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. - -## Feedback, help and news - -[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. - -[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/README.md b/README.md new file mode 120000 index 0000000000..243e14c164 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +./packages/hardhat-plugin/README.md \ No newline at end of file diff --git a/packages/core/README.md b/packages/core/README.md index 513c7d8b69..b3779c32b2 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,3 +1,59 @@ -# Ignition-core +# Hardhat Ignition Core -The core logic of **Ignition** including the execution engine and user facing api. +The core logic of Hardhat Ignition, including the execution engine and Module api. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/ignition-core +``` + +## Usage + +```js +const { buildModule, deploy } = require("@nomicfoundation/ignition-core"); +// ... + +const ignitionModule = buildModule("Example", (m) => { + const lock = m.contract("Lock", [TEN_YEARS_IN_FUTURE]); + + return { lock }; +}); + +const accounts = await hre.network.provider.request({ + method: "eth_accounts", +}); + +const result = await deploy({ + ignitionModule, + accounts, + provider: hre.network.provider, + artifactResolver: { + loadArtifact: function (contractName) { + return hre.artifacts.readArtifact(contractName); + }, + getBuildInfo: function (contractName) { + // not needed for ephemeral deployments + return undefined; + }, + }, +}); + +console.log(result); +``` + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. + +[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 0e7e2b0cd5..f70d6e224b 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -1,12 +1,15 @@ +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) -# hardhat-ignition +--- -Hardhat plugin for orchestrating deployments. +# Hardhat Ignition -## What +Hardhat Ignition is a [declarative](https://en.wikipedia.org/wiki/Declarative_programming) system for deploying smart contracts on Ethereum. It enables you to describe smart contract instances, identify their dependencies, and establish the operations to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on creating the desired contract functionality and outcomes instead of getting caught up in the deployment details. -This plugin brings **Ignition** to your **Hardhat** project, allowing you to orchestrate complex deployments to **mainnet**, to a local **Hardhat node** or within tests. +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. ## Installation @@ -14,22 +17,38 @@ This plugin brings **Ignition** to your **Hardhat** project, allowing you to orc npm install --save-dev @nomicfoundation/hardhat-ignition ``` -And add the following statement to your `hardhat.config.js`: +Import the plugin in your `hardhat.config.js``: ```js require("@nomicfoundation/hardhat-ignition"); ``` -Or, if you are using TypeScript, add this to your `hardhat.config.ts`: +Or if you are using TypeScript, in your `hardhat.config.ts``: ```js import "@nomicfoundation/hardhat-ignition"; ``` -## Tasks +## Documentation + +On [Hardhat Ignition's website](https://hardhat.org/hardhat-ignition) you will find guides for: + +- [Getting started](https://hardhat.org/hardhat-ignition/getting-started) +- [Creating Modules](https://hardhat.org/hardhat-ignition/creating-modules) +- [Deploying a module](https://hardhat.org/hardhat-ignition/deploy) +- [Visualizing your module](https://hardhat.org/hardhat-ignition/visualize) +- [Handling errors](https://hardhat.org/hardhat-ignition/error-handling) +- [Modifying an existing module](https://hardhat.org/hardhat-ignition/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/hardhat-ignition/tests) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. -This plugin provides the `deploy` and `visualize` tasks. +## Feedback, help and news -## Usage +[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. -Please see the [getting started guide](https://hardhat.org/hardhat-ignition) +[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/packages/ui/README.md b/packages/ui/README.md index d8fe4f7b86..0d900492ff 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -1,6 +1,10 @@ -# Ignition Visualize UI +# Hardhat Ignition Visualize UI -The website used in Ignitions `visualize` task for visualising a deployment. +> Warning: this package is used internally within Hardhat Ignition, and is +> not intended to be used directly. + +The website used in Hardhat Ignition's `visualize` task for visualising +a deployment. ## Development @@ -18,3 +22,14 @@ to overwrite this example deployment, update the module in npm run regenerate-deployment-example ``` +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. + +[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) From 3a3b7503df5db8190390f92c6f09eb213a9e87ed Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 18:50:15 +0000 Subject: [PATCH 1090/1302] Remove most content for core's readme --- packages/core/README.md | 56 ++++------------------------------------- 1 file changed, 5 insertions(+), 51 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index b3779c32b2..344d76bde4 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -1,59 +1,13 @@ -# Hardhat Ignition Core - -The core logic of Hardhat Ignition, including the execution engine and Module api. - -Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. - -Join the Hardhat Ignition channel of our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. - -## Installation - -```bash -npm install --save-dev @nomicfoundation/ignition-core -``` - -## Usage +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) -```js -const { buildModule, deploy } = require("@nomicfoundation/ignition-core"); -// ... +--- -const ignitionModule = buildModule("Example", (m) => { - const lock = m.contract("Lock", [TEN_YEARS_IN_FUTURE]); - - return { lock }; -}); - -const accounts = await hre.network.provider.request({ - method: "eth_accounts", -}); - -const result = await deploy({ - ignitionModule, - accounts, - provider: hre.network.provider, - artifactResolver: { - loadArtifact: function (contractName) { - return hre.artifacts.readArtifact(contractName); - }, - getBuildInfo: function (contractName) { - // not needed for ephemeral deployments - return undefined; - }, - }, -}); - -console.log(result); -``` - -## Contributing - -Contributions are always welcome! Feel free to open any issue or send a pull request. +# Hardhat Ignition Core -Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. +The core logic of [Hardhat Ignition](https://hardhat.org/ignition). Read [this guide](https://hardhat.org/ignition/docs/getting-started) to learn how to use it. ## Feedback, help and news -[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. [Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) From fe8812faaba76898f7eda4d475d5d577452861d5 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 18:57:00 +0000 Subject: [PATCH 1091/1302] Align the description with the current version of the docs --- packages/core/package.json | 1 + packages/hardhat-plugin/README.md | 2 +- packages/hardhat-plugin/package.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index eea2632d6a..0663a3c789 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -5,6 +5,7 @@ "author": "Nomic Foundation", "homepage": "https://hardhat.org", "repository": "github:NomicFoundation/hardhat-ignition", + "description": "Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", "keywords": [ "ethereum", "smart-contracts", diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index f70d6e224b..685578068c 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -5,7 +5,7 @@ # Hardhat Ignition -Hardhat Ignition is a [declarative](https://en.wikipedia.org/wiki/Declarative_programming) system for deploying smart contracts on Ethereum. It enables you to describe smart contract instances, identify their dependencies, and establish the operations to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on creating the desired contract functionality and outcomes instead of getting caught up in the deployment details. +Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 2700906b70..38f480d52d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -4,6 +4,7 @@ "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", + "description": "Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", "repository": "github:NomicFoundation/hardhat-ignition", "keywords": [ "ethereum", From ac5aaf78594276b099f81cd1ceb073c4cc2a2cd8 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 19:01:58 +0000 Subject: [PATCH 1092/1302] Update links --- packages/hardhat-plugin/README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 685578068c..e9dbdde9f2 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -33,13 +33,13 @@ import "@nomicfoundation/hardhat-ignition"; On [Hardhat Ignition's website](https://hardhat.org/hardhat-ignition) you will find guides for: -- [Getting started](https://hardhat.org/hardhat-ignition/getting-started) -- [Creating Modules](https://hardhat.org/hardhat-ignition/creating-modules) -- [Deploying a module](https://hardhat.org/hardhat-ignition/deploy) -- [Visualizing your module](https://hardhat.org/hardhat-ignition/visualize) -- [Handling errors](https://hardhat.org/hardhat-ignition/error-handling) -- [Modifying an existing module](https://hardhat.org/hardhat-ignition/modifications) -- [Using Hardhat Ignition in your tests](https://hardhat.org/hardhat-ignition/tests) +- [Getting started](https://hardhat.org/ignition/docs/getting-started) +- [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) +- [Deploying a module](https://hardhat.org/ignition/docs/guides/deploy) +- [Visualizing your module](https://hardhat.org/ignition/docs/guides/visualize) +- [Handling errors](https://hardhat.org/ignition/docs/guides/error-handling) +- [Modifying an existing module](https://hardhat.org/ignition/docs/guides/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/ignition/docs/guides/tests) ## Contributing From 82a262141553a2fa9a312ba651b31947aee15d67 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 19:03:39 +0000 Subject: [PATCH 1093/1302] Fix one more link --- packages/hardhat-plugin/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index e9dbdde9f2..c58f1a6ce1 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -31,7 +31,7 @@ import "@nomicfoundation/hardhat-ignition"; ## Documentation -On [Hardhat Ignition's website](https://hardhat.org/hardhat-ignition) you will find guides for: +On [Hardhat Ignition's website](https://hardhat.org/ignition) you will find guides for: - [Getting started](https://hardhat.org/ignition/docs/getting-started) - [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) From 9b59a92597c83193b417c92c6aabbc19f9fdc773 Mon Sep 17 00:00:00 2001 From: John Kane Date: Sun, 22 Oct 2023 20:24:09 +0100 Subject: [PATCH 1094/1302] docs: make discored link text consistent --- packages/hardhat-plugin/README.md | 2 +- packages/ui/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index c58f1a6ce1..7e2523b850 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -49,6 +49,6 @@ Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob ## Feedback, help and news -[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. [Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) diff --git a/packages/ui/README.md b/packages/ui/README.md index 0d900492ff..fb786ec499 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -30,6 +30,6 @@ Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob ## Feedback, help and news -[Hardhat Support Discord server](https://hardhat.org/ignition-discord): for questions and feedback. +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. [Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) From 86d2b7729f12f0a40ddbff8dc0c3610fd68c9290 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 19:28:00 +0000 Subject: [PATCH 1095/1302] Update twitter and discord links --- packages/core/README.md | 2 +- packages/hardhat-plugin/README.md | 4 ++-- packages/ui/README.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/core/README.md b/packages/core/README.md index 344d76bde4..a626452685 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -10,4 +10,4 @@ The core logic of [Hardhat Ignition](https://hardhat.org/ignition). Read [this g [Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. -[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 7e2523b850..6f773903f0 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -9,7 +9,7 @@ Hardhat Ignition is a declarative system for deploying smart contracts on Ethere Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. -Join the Hardhat Ignition channel of our [Hardhat Support Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. +Join the Hardhat Ignition channel of our [Hardhat Community Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. ## Installation @@ -51,4 +51,4 @@ Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob [Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. -[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/ui/README.md b/packages/ui/README.md index fb786ec499..83f349333d 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -32,4 +32,4 @@ Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob [Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. -[Follow Hardhat on Twitter.](https://twitter.com/HardhatHQ) +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. From b9a60ee6c7ff8a49d736176329ebf5da47a69f51 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Sun, 22 Oct 2023 18:37:34 -0300 Subject: [PATCH 1096/1302] Small mermaid fixes (#578) * Swap mermaid flowchart direction * Escape some missing mermaid ids * Escape more special characters for mermaid and avoid clashes * Update tests * Fix toEscapedId * refactor: remove unneeded character The replacement included an unneeded character. For consistency all the replacements are now variations of `_`. --------- Co-authored-by: John Kane --- packages/ui/src/utils/to-escaped-id.ts | 10 ++- packages/ui/src/utils/to-mermaid.ts | 34 ++++++-- packages/ui/test/to-mermaid.ts | 114 ++++++++++++------------- 3 files changed, 91 insertions(+), 67 deletions(-) diff --git a/packages/ui/src/utils/to-escaped-id.ts b/packages/ui/src/utils/to-escaped-id.ts index b0ff5a2691..94271b0d37 100644 --- a/packages/ui/src/utils/to-escaped-id.ts +++ b/packages/ui/src/utils/to-escaped-id.ts @@ -3,8 +3,10 @@ */ export function toEscapedId(id: string): string { return id - .replace("(", "_") - .replace(")", "_") - .replace(",", "_") - .replace(" ", "_"); + .replaceAll("(", "__") + .replaceAll(")", "___") + .replaceAll(",", "____") + .replaceAll("~", "_____") + .replaceAll("#", "______") + .replaceAll(" ", "_______"); } diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 3887563d80..26254f6547 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -44,7 +44,7 @@ export function toMermaid( ), ].join("\n"); - return `flowchart TB\n\n${toEscapedId( + return `flowchart BT\n\n${toEscapedId( ignitionModule.id )}\n\n${subgraphSections}${ futureDependencies === "" ? "" : "\n\n" + futureDependencies @@ -73,18 +73,40 @@ function prettyPrintModule( .join(`\n${lineIndent}`); if (futures.length > 0) { - const inner = `${lineIndent}subgraph ${module.id}Inner[ ]\n${lineIndent} direction TB\n\n${lineIndent}${futureList}\n${lineIndent}end\n\nstyle ${module.id}Inner fill:none,stroke:none`; + const inner = `${lineIndent}subgraph ${toEscapedId( + module.id + )}Inner[ ]\n${lineIndent} direction BT\n\n${lineIndent}${futureList}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Inner fill:none,stroke:none`; - const title = `${lineIndent}subgraph ${module.id}Padding["[ ${module.id} ]"]\n${lineIndent} direction TB\n\n${lineIndent}${inner}\n${lineIndent}end\n\nstyle ${module.id}Padding fill:none,stroke:none`; + const title = `${lineIndent}subgraph ${toEscapedId(module.id)}Padding["[ ${ + module.id + } ]"]\n${lineIndent} direction BT\n\n${lineIndent}${inner}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Padding fill:none,stroke:none`; - const outer = `${lineIndent}subgraph ${module.id}[ ]\n${lineIndent} direction TB\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${module.id} fill:#fbfbfb,stroke:#e5e6e7`; + const outer = `${lineIndent}subgraph ${toEscapedId( + module.id + )}[ ]\n${lineIndent} direction BT\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )} fill:#fbfbfb,stroke:#e5e6e7`; return outer; } - const title = `${lineIndent}subgraph ${module.id}Padding["[ ${module.id} ]"]\n${lineIndent} direction TB\n\n${lineIndent}end\n\nstyle ${module.id}Padding fill:none,stroke:none`; + const title = `${lineIndent}subgraph ${toEscapedId( + module.id + )}Padding["[ ${ + module.id + } ]"]\n${lineIndent} direction BT\n\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )}Padding fill:none,stroke:none`; - return `${lineIndent}subgraph ${module.id}[ ]\n${lineIndent} direction TB\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${module.id} fill:#fbfbfb,stroke:#e5e6e7`; + return `${lineIndent}subgraph ${toEscapedId( + module.id + )}[ ]\n${lineIndent} direction BT\n\n${lineIndent}${title}\n${lineIndent}end\n\nstyle ${toEscapedId( + module.id + )} fill:#fbfbfb,stroke:#e5e6e7`; } function toLabel(f: Future): string { diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index d22a828e09..38d157fbf3 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -16,20 +16,20 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart TB + flowchart BT Module subgraph Module[ ] - direction TB + direction BT subgraph ModulePadding["[ Module ]"] - direction TB + direction BT subgraph ModuleInner[ ] - direction TB + direction BT - Module#Contract1["Deploy Contract1"]:::futureNode + Module______Contract1["Deploy Contract1"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -52,20 +52,20 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart TB + flowchart BT Test_registrar subgraph Test_registrar[ ] - direction TB + direction BT subgraph Test_registrarPadding["[ Test_registrar ]"] - direction TB + direction BT subgraph Test_registrarInner[ ] - direction TB + direction BT - Test_registrar#Contract1["Deploy Contract1"]:::futureNode + Test_registrar______Contract1["Deploy Contract1"]:::futureNode end style Test_registrarInner fill:none,stroke:none @@ -104,20 +104,20 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart TB + flowchart BT Module subgraph Module[ ] - direction TB + direction BT subgraph ModulePadding["[ Module ]"] - direction TB + direction BT subgraph ModuleInner[ ] - direction TB + direction BT - Module#Contract3["Deploy Contract3"]:::futureNode + Module______Contract3["Deploy Contract3"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -128,15 +128,15 @@ describe("to-mermaid", () => { style Module fill:#fbfbfb,stroke:#e5e6e7 subgraph Submodule1[ ] - direction TB + direction BT subgraph Submodule1Padding["[ Submodule1 ]"] - direction TB + direction BT subgraph Submodule1Inner[ ] - direction TB + direction BT - Submodule1#Contract1["Deploy Contract1"]:::futureNode + Submodule1______Contract1["Deploy Contract1"]:::futureNode end style Submodule1Inner fill:none,stroke:none @@ -147,15 +147,15 @@ describe("to-mermaid", () => { style Submodule1 fill:#fbfbfb,stroke:#e5e6e7 subgraph Submodule2[ ] - direction TB + direction BT subgraph Submodule2Padding["[ Submodule2 ]"] - direction TB + direction BT subgraph Submodule2Inner[ ] - direction TB + direction BT - Submodule2#Contract2["Deploy Contract2"]:::futureNode + Submodule2______Contract2["Deploy Contract2"]:::futureNode end style Submodule2Inner fill:none,stroke:none @@ -166,8 +166,8 @@ describe("to-mermaid", () => { style Submodule2 fill:#fbfbfb,stroke:#e5e6e7 - Module#Contract3 --> Submodule1#Contract1 - Module#Contract3 --> Submodule2#Contract2 + Module______Contract3 --> Submodule1______Contract1 + Module______Contract3 --> Submodule2______Contract2 Module -.-> Submodule1 Module -.-> Submodule2`; @@ -223,29 +223,29 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart TB + flowchart BT Module subgraph Module[ ] - direction TB + direction BT subgraph ModulePadding["[ Module ]"] - direction TB + direction BT subgraph ModuleInner[ ] - direction TB - - Module#BasicContract["Deploy BasicContract"]:::futureNode - Module#BasicLibrary["Deploy library BasicLibrary"]:::futureNode - Module#BasicLibrary2["Deploy library from artifact BasicLibrary"]:::futureNode - Module#ContractWithLibrary["Deploy from artifact ContractWithLibrary"]:::futureNode - Module#BasicContract.basicFunction["Call BasicContract.basicFunction"]:::futureNode - Module#BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"]:::futureNode - Module#ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"]:::futureNode - Module#BasicContract2["Existing contract BasicContract (Module#BasicContract)"]:::futureNode - Module#ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"]:::futureNode - Module#test_send["Send data to Module#BasicContract2"]:::futureNode + direction BT + + Module______BasicContract["Deploy BasicContract"]:::futureNode + Module______BasicLibrary["Deploy library BasicLibrary"]:::futureNode + Module______BasicLibrary2["Deploy library from artifact BasicLibrary"]:::futureNode + Module______ContractWithLibrary["Deploy from artifact ContractWithLibrary"]:::futureNode + Module______BasicContract.basicFunction["Call BasicContract.basicFunction"]:::futureNode + Module______BasicContract.BasicEvent.eventArg.0["Read event from future Module#BasicContract.basicFunction (event BasicEvent argument eventArg)"]:::futureNode + Module______ContractWithLibrary.readonlyFunction["Static call ContractWithLibrary.readonlyFunction"]:::futureNode + Module______BasicContract2["Existing contract BasicContract (Module#BasicContract)"]:::futureNode + Module______ContractWithLibrary2["Existing contract from artifact ContractWithLibrary (Module#ContractWithLibrary)"]:::futureNode + Module______test_send["Send data to Module#BasicContract2"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -256,14 +256,14 @@ describe("to-mermaid", () => { style Module fill:#fbfbfb,stroke:#e5e6e7 - Module#ContractWithLibrary --> Module#BasicLibrary - Module#BasicContract.basicFunction --> Module#BasicContract - Module#BasicContract.BasicEvent.eventArg.0 --> Module#BasicContract.basicFunction - Module#ContractWithLibrary.readonlyFunction --> Module#ContractWithLibrary - Module#ContractWithLibrary.readonlyFunction --> Module#BasicContract.BasicEvent.eventArg.0 - Module#BasicContract2 --> Module#BasicContract - Module#ContractWithLibrary2 --> Module#ContractWithLibrary - Module#test_send --> Module#BasicContract2`; + Module______ContractWithLibrary --> Module______BasicLibrary + Module______BasicContract.basicFunction --> Module______BasicContract + Module______BasicContract.BasicEvent.eventArg.0 --> Module______BasicContract.basicFunction + Module______ContractWithLibrary.readonlyFunction --> Module______ContractWithLibrary + Module______ContractWithLibrary.readonlyFunction --> Module______BasicContract.BasicEvent.eventArg.0 + Module______BasicContract2 --> Module______BasicContract + Module______ContractWithLibrary2 --> Module______ContractWithLibrary + Module______test_send --> Module______BasicContract2`; assertDiagram(moduleDefinition, expectedResult); }); @@ -279,22 +279,22 @@ describe("to-mermaid", () => { }); const expectedResult = testFormat` - flowchart TB + flowchart BT Module subgraph Module[ ] - direction TB + direction BT subgraph ModulePadding["[ Module ]"] - direction TB + direction BT subgraph ModuleInner[ ] - direction TB + direction BT - Module#ens["Deploy ens"]:::futureNode - Module#ens.setAddr_bytes32_address_["Call ens.setAddr(bytes32,address)"]:::futureNode - Module#ens.getAddr_bytes32_address_["Static call ens.getAddr(bytes32,address)"]:::futureNode + Module______ens["Deploy ens"]:::futureNode + Module______ens.setAddr__bytes32____address___["Call ens.setAddr(bytes32,address)"]:::futureNode + Module______ens.getAddr__bytes32____address___["Static call ens.getAddr(bytes32,address)"]:::futureNode end style ModuleInner fill:none,stroke:none @@ -305,8 +305,8 @@ describe("to-mermaid", () => { style Module fill:#fbfbfb,stroke:#e5e6e7 - Module#ens.setAddr_bytes32_address_ --> Module#ens - Module#ens.getAddr_bytes32_address_ --> Module#ens`; + Module______ens.setAddr__bytes32____address___ --> Module______ens + Module______ens.getAddr__bytes32____address___ --> Module______ens`; assertDiagram(moduleDefinition, expectedResult); }); From fdf2a3590b9ae236382332277b9171f35d26bff6 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 23 Oct 2023 10:53:32 -0300 Subject: [PATCH 1097/1302] Add a message when a deployment is being resumed (#582) --- packages/core/src/internal/deployer.ts | 36 ++++++++++++++--- packages/core/src/types/execution-events.ts | 1 + packages/hardhat-plugin/package.json | 7 ++++ .../calculate-deploying-module-panel.ts | 16 +++++++- .../src/ui/helpers/cwd-relative-path.ts | 12 ++++++ .../src/ui/pretty-event-handler.ts | 2 + packages/hardhat-plugin/src/ui/types.ts | 1 + packages/hardhat-plugin/test/setup.ts | 1 + .../ui/helpers/calculate-batch-display.ts | 1 + ...alculate-deploying-module-panel-display.ts | 39 +++++++++++++++++++ 10 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index b1b5be9476..65aa4327d6 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -76,9 +76,16 @@ export class Deployer { accounts: string[], defaultSender: string ): Promise { - let deploymentState = await this._getOrInitializeDeploymentState(); + const deployment = await this._getOrInitializeDeploymentState(); - this._emitDeploymentStartEvent(ignitionModule.id, this._deploymentDir); + const isResumed = deployment.isResumed; + let deploymentState = deployment.deploymentState; + + this._emitDeploymentStartEvent( + ignitionModule.id, + this._deploymentDir, + isResumed + ); const contracts = getFuturesFromModule(ignitionModule).filter(isContractFuture); @@ -223,12 +230,27 @@ export class Deployer { }; } - private async _getOrInitializeDeploymentState(): Promise { + /** + * Fetches the existing deployment state or initializes a new one. + * + * @returns An object with the deployment state and a boolean indicating + * if the deployment is being resumed (i.e. the deployment state is not + * new). + */ + private async _getOrInitializeDeploymentState(): Promise<{ + deploymentState: DeploymentState; + isResumed: boolean; + }> { const chainId = await this._jsonRpcClient.getChainId(); const deploymentState = await loadDeploymentState(this._deploymentLoader); if (deploymentState === undefined) { - return initializeDeploymentState(chainId, this._deploymentLoader); + const newState = await initializeDeploymentState( + chainId, + this._deploymentLoader + ); + + return { deploymentState: newState, isResumed: false }; } // TODO: this should be moved out, it is not obvious that a significant @@ -240,12 +262,13 @@ export class Deployer { }); } - return deploymentState; + return { deploymentState, isResumed: true }; } private _emitDeploymentStartEvent( moduleId: string, - deploymentDir: string | undefined + deploymentDir: string | undefined, + isResumed: boolean ): void { if (this._executionEventListener === undefined) { return; @@ -255,6 +278,7 @@ export class Deployer { type: ExecutionEventType.DEPLOYMENT_START, moduleName: moduleId, deploymentDir: deploymentDir ?? undefined, + isResumed, }); } diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 7fb61c0620..64111807d2 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -77,6 +77,7 @@ export interface DeploymentStartEvent { type: ExecutionEventType.DEPLOYMENT_START; moduleName: string; deploymentDir: string | undefined; + isResumed: boolean; } /** diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 38f480d52d..20c62f1e7d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -18,6 +18,13 @@ ], "main": "dist/src/index.js", "types": "dist/src/index.d.ts", + "files": [ + "dist/src/", + "src/", + "LICENSE", + "README.md", + "CHANGELOG.md" + ], "exports": { ".": "./dist/src/index.js", "./modules": "./dist/src/modules.js" diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts index 84f03d8f4c..ed183624e8 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -2,10 +2,24 @@ import chalk from "chalk"; import { UiState } from "../types"; +import { pathFromCwd } from "./cwd-relative-path"; + export function calculateDeployingModulePanel(state: UiState): string { let deployingMessage = `Hardhat Ignition 🚀 -${chalk.bold(`Deploying [ ${state.moduleName ?? "unknown"} ]`)} +`; + + if (state.isResumed === true) { + deployingMessage += `${chalk.bold( + `Resuming existing deployment from ${pathFromCwd(state.deploymentDir!)}` + )} + +`; + } + + deployingMessage += `${chalk.bold( + `Deploying [ ${state.moduleName ?? "unknown"} ]` + )} `; if (state.warnings.length > 0) { diff --git a/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts b/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts new file mode 100644 index 0000000000..ed6eeee013 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts @@ -0,0 +1,12 @@ +import path from "path"; +import process from "process"; + +export function pathFromCwd(thePath: string): string { + const cwd = process.cwd(); + + if (thePath.startsWith(cwd)) { + return `.${path.sep}${path.relative(process.cwd(), thePath)}`; + } + + return thePath; +} diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 8a1a1c496b..36421f5a74 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -60,6 +60,7 @@ export class PrettyEventHandler implements ExecutionEventListener { currentBatch: 0, result: null, warnings: [], + isResumed: null, }; constructor(private _deploymentParams: DeploymentParameters = {}) {} @@ -78,6 +79,7 @@ export class PrettyEventHandler implements ExecutionEventListener { status: UiStateDeploymentStatus.DEPLOYING, moduleName: event.moduleName, deploymentDir: event.deploymentDir, + isResumed: event.isResumed, }; process.stdout.write(calculateStartingMessage(this.state)); diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 0c2e5066bb..ea7ba79ed8 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -61,6 +61,7 @@ export interface UiState { currentBatch: number; result: DeploymentResult | null; warnings: string[]; + isResumed: boolean | null; } export interface AddressMap { diff --git a/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-plugin/test/setup.ts index 69cdaf24d5..83ca4a5922 100644 --- a/packages/hardhat-plugin/test/setup.ts +++ b/packages/hardhat-plugin/test/setup.ts @@ -4,6 +4,7 @@ import chaiAsPromised from "chai-as-promised"; import sinon from "sinon"; chai.use(chaiAsPromised); +chai.config.truncateThreshold = 1000; afterEach(() => { sinon.restore(); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 7cd582cb7f..25f3bf8050 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -19,6 +19,7 @@ const exampleState: UiState = { currentBatch: 1, result: null, warnings: [], + isResumed: false, }; describe("ui - calculate batch display", () => { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index a28b4c80f9..c0afbe2d18 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -1,5 +1,6 @@ import { assert } from "chai"; import chalk from "chalk"; +import path from "path"; import { calculateDeployingModulePanel } from "../../../src/ui/helpers/calculate-deploying-module-panel"; import { UiState, UiStateDeploymentStatus } from "../../../src/ui/types"; @@ -16,6 +17,7 @@ describe("ui - calculate starting message display", () => { currentBatch: 0, result: null, warnings: [], + isResumed: null, }; it("should display the deploying module message", () => { @@ -55,4 +57,41 @@ describe("ui - calculate starting message display", () => { assert.equal(actualText, expectedText); }); + + it("should display a message when the deployment is being resumed and the path is not in the CWD", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Resuming existing deployment from /users/example`)} + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + isResumed: true, + }); + + assert.equal(actualText, expectedText); + }); + + it("should display a message when the deployment is being resumed and the path is not in the CWD", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold( + `Resuming existing deployment from .${path.sep}ignition${path.sep}deployments${path.sep}foo` + )} + + ${chalk.bold(`Deploying [ ExampleModule ]`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + isResumed: true, + deploymentDir: `${process.cwd()}/ignition/deployments/foo`, + }); + + assert.equal(actualText, expectedText); + }); }); From 0f52cdf88d44e8729d8ccf9dc3c3afd2fa27a780 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 23 Oct 2023 15:40:52 +0000 Subject: [PATCH 1098/1302] Pass the `gas` field to `eth_call` requests. --- packages/core/src/internal/execution/jsonrpc-client.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 32573b710e..a7e8ca779a 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -21,6 +21,7 @@ export interface CallParams { from: string; nonce?: number; fees?: NetworkFees; + gasLimit?: bigint; } /** @@ -259,6 +260,10 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { callParams.nonce !== undefined ? numberToJsonRpcQuantity(callParams.nonce) : undefined, + gas: + callParams.gasLimit !== undefined + ? bigIntToJsonRpcQuantity(callParams.gasLimit) + : undefined, ...jsonRpcEncodeNetworkFees(callParams.fees), }; From 838ce0f2add6072d273ab07d3305ba0d1eb02b20 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 6 Oct 2023 18:38:23 +0100 Subject: [PATCH 1099/1302] chore: bump version to v0.11.0 Update the packages versions and changelogs for the `0.11.0 - 2023-10-23` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- package-lock.json | 243 +++++++++++++-------------- packages/core/.npmignore | 2 + packages/core/CHANGELOG.md | 21 +++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 32 ++++ packages/hardhat-plugin/package.json | 6 +- packages/ui/CHANGELOG.md | 7 + packages/ui/package.json | 4 +- 12 files changed, 196 insertions(+), 137 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 5a53374909..cc99373b0f 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.4.0", + "version": "0.11.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 5610b495e8..dfaaa3f3b1 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.4.0", + "version": "0.11.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index b417bb3ad3..efa0fb33d6 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.4.0", + "version": "0.11.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 26a7318571..f24836d26b 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.4.0", + "version": "0.11.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index ef3987eba5..af7c665ae7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.4.0", + "version": "0.11.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -40,12 +40,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.4.0", + "version": "0.11.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -53,9 +53,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.4.0", + "version": "0.11.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -63,9 +63,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.4.0", + "version": "0.11.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.4.0", + "@nomicfoundation/hardhat-ignition": "^0.11.0", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -81,9 +81,9 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.9.2.tgz", - "integrity": "sha512-0h+FrQDqe2Wn+IIGFkTCd4aAwTJ+7834Ek1COohCyV26AXhwQ7WQaz+4F/nLOeVl/3BtWHOHLPsq46V8YB46Eg==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -183,18 +183,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", - "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.0.tgz", - "integrity": "sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -202,10 +202,10 @@ "@babel/generator": "^7.23.0", "@babel/helper-compilation-targets": "^7.22.15", "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.0", + "@babel/helpers": "^7.23.2", "@babel/parser": "^7.23.0", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -408,13 +408,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.1.tgz", - "integrity": "sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.0", + "@babel/traverse": "^7.23.2", "@babel/types": "^7.23.0" }, "engines": { @@ -564,9 +564,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", - "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -589,9 +589,9 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.0.tgz", - "integrity": "sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.22.13", @@ -1614,7 +1614,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1672,7 +1671,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -1719,6 +1717,17 @@ "node": ">=14" } }, + "node_modules/@ethereumjs/util/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", @@ -2954,20 +2963,20 @@ } }, "node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", + "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.2" }, "funding": { "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/curves/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "node_modules/@noble/hashes": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", + "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", "engines": { "node": ">= 16" }, @@ -2975,17 +2984,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@noble/hashes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.1.2.tgz", - "integrity": "sha512-KYRCASVTv6aeUi1tsF8/vpyR7zpfs3FUzy2Jqm+MU+LmUKhQ0y2FpfwqkCcxSg2ua4GALJd8k2R76WxwZGbQpA==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/@noble/secp256k1": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", @@ -3075,7 +3073,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3168,7 +3165,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3216,7 +3212,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3257,7 +3252,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3326,7 +3320,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3411,7 +3404,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3450,7 +3442,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3503,7 +3494,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3549,7 +3539,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -3622,7 +3611,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dev": true, "peer": true, "dependencies": { @@ -4028,7 +4016,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -4754,7 +4741,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -4857,7 +4843,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -5129,7 +5114,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -5829,9 +5813,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", - "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==" + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==" }, "node_modules/@types/chai-as-promised": { "version": "7.1.6", @@ -6160,9 +6144,9 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-YIQtIg4PKr7ZyqNPZObpxfHsHEmuB8dXCxd6qVcGuQVDK2bpsF7bYNnBJ4Nn7giuACZg+WewExgrtAJ3XnA4Xw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz", + "integrity": "sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==", "dev": true, "dependencies": { "@types/react": "*", @@ -6286,9 +6270,9 @@ "peer": true }, "node_modules/@types/prompts": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.5.tgz", - "integrity": "sha512-TvrzGMCwARi2qqXcD7VmvMvfMP3F7JRQpeEHECK0oufRNZInoBqzd8v/1zksKFE5XW8OOGto/5FsDT8lnpvGRA==", + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.6.tgz", + "integrity": "sha512-hIwnDhvsTV6XwAPo1zNy2MTelR0JmCxklIRsVxwROHLGaf6LfB+sGDkB9n+aqV4gXDz8z5MnlAz4CEC9wQDRsw==", "dev": true, "dependencies": { "@types/node": "*", @@ -6309,9 +6293,9 @@ "peer": true }, "node_modules/@types/react": { - "version": "18.2.26", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.26.tgz", - "integrity": "sha512-ZaMtQo/fasHwMSRTED+u4Cjnkl0uuqEFJ2rKF0DQXji1v24DaNdSe9am4ldiDKFD/MpzbyS8UEOceh1/Oiw89g==", + "version": "18.2.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", + "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6320,9 +6304,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.11.tgz", - "integrity": "sha512-zq6Dy0EiCuF9pWFW6I6k6W2LdpUixLE4P6XjXU1QHLfak3GPACQfLwEuHzY5pOYa4hzj1d0GxX/P141aFjZsyg==", + "version": "18.2.13", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", + "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", "dev": true, "dependencies": { "@types/react": "*" @@ -7790,9 +7774,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001546", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001546.tgz", - "integrity": "sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==", + "version": "1.0.30001547", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", + "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", "dev": true, "funding": [ { @@ -9389,9 +9373,9 @@ } }, "node_modules/define-data-property": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", - "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", @@ -9629,9 +9613,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.544", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.544.tgz", - "integrity": "sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==", + "version": "1.4.553", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.553.tgz", + "integrity": "sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==", "dev": true }, "node_modules/elkjs": { @@ -11293,7 +11277,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "deprecated": "Upgrade to ethereum-cryptography@2.0 for security and reduced package size", "dependencies": { "@types/pbkdf2": "^3.0.0", "@types/secp256k1": "^4.0.1", @@ -11313,9 +11296,9 @@ } }, "node_modules/ethers": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.7.1.tgz", - "integrity": "sha512-qX5kxIFMfg1i+epfgb0xF4WM7IqapIIu50pOJ17aebkxxa4BacW5jFrQRmCJpDEg2ZK2oNtR5QjrQ1WDBF29dA==", + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.0.tgz", + "integrity": "sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==", "funding": [ { "type": "individual", @@ -11327,9 +11310,9 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.9.2", - "@noble/hashes": "1.1.2", - "@noble/secp256k1": "1.7.1", + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", "@types/node": "18.15.13", "aes-js": "4.0.0-beta.5", "tslib": "2.4.0", @@ -11955,9 +11938,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.6", @@ -12443,9 +12429,9 @@ } }, "node_modules/hardhat": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.0.tgz", - "integrity": "sha512-Com3SPFgk6v73LlE3rypuh32DYxOWvNbVBm5xfPUEzGVEW54Fcc4j3Uq7j6COj7S8Jc27uNihLFsveHYM0YJkQ==", + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.1.tgz", + "integrity": "sha512-b55rW7Ka+fvJeg6oWuBTXoYQEUurevCCankjGNTwczwD3GnkhV9GEei7KUT+9IKmWx3lC+zyxlFxeDbg0gUoHw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -14198,9 +14184,9 @@ } }, "node_modules/khroma": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", "dev": true }, "node_modules/kind-of": { @@ -14423,11 +14409,11 @@ } }, "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", "dependencies": { - "get-func-name": "^2.0.0" + "get-func-name": "^2.0.1" } }, "node_modules/lower-case": { @@ -17268,9 +17254,9 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.6", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", - "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -17960,9 +17946,9 @@ } }, "node_modules/shiki": { - "version": "0.14.4", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.4.tgz", - "integrity": "sha512-IXCRip2IQzKwxArNNq1S+On4KPML3Yyn8Zzs/xRgcgOWIr8ntIK3IKzjFPfjy/7kt9ZMjc+FItfqHRBg8b6tNQ==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", + "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", "dev": true, "dependencies": { "ansi-sequence-parser": "^1.1.0", @@ -20067,9 +20053,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.25.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.25.4.tgz", - "integrity": "sha512-450yJxT29qKMf3aoudzFpIciqpx6Pji3hEWaXqXmanbXF58LTAGCKxcJjxMXWu3iG+Mudgo3ZUfDB6YDFd/dAw==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", + "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -20820,6 +20806,17 @@ "node": ">=8.0.0" } }, + "node_modules/web3-utils/node_modules/@noble/curves": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", + "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "dependencies": { + "@noble/hashes": "1.3.1" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/web3-utils/node_modules/@noble/hashes": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", @@ -21267,7 +21264,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.4.0", + "version": "0.11.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21377,11 +21374,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.4.0", + "version": "0.11.0", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", + "@nomicfoundation/ignition-core": "^0.11.0", + "@nomicfoundation/ignition-ui": "^0.11.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", @@ -21499,10 +21496,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.4.0", + "version": "0.11.0", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-core": "^0.11.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/.npmignore b/packages/core/.npmignore index c72bb8c108..7de3b8a149 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -8,6 +8,8 @@ coverage/ .prettierrc !dist dist/test +dist/test-integrations test/ src/ temp +test-integrations/ diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index a9ee9b9ed2..8b4f80f01d 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.0 - 2023-10-23 + +First public launch 🚀 + +### Added + +- Expand Module API so value and from support staticCall/readEventArg as values ([#455](https://github.com/NomicFoundation/hardhat-ignition/issues/455)) +- Support fully qualified contract names ([#563](https://github.com/NomicFoundation/hardhat-ignition/pull/563)) + +### Changed + +- The `contractAt` signature overload for artifact has been changed to match other artifact overload signatures ([#557](https://github.com/NomicFoundation/hardhat-ignition/issues/557)) + +### Fixed + +- Fixed nonce check failure on rerun ([#506](https://github.com/NomicFoundation/hardhat-ignition/issues/506)) +- Ensure future's senders meet nonce sync checks ([#411](https://github.com/NomicFoundation/hardhat-ignition/issues/411)) +- Show all deployed contracts at the end of a deployment ([#480](https://github.com/NomicFoundation/hardhat-ignition/issues/480)) +- Rerun blocked by sent transactions message IGN403 ([#574](https://github.com/NomicFoundation/hardhat-ignition/issues/574)) +- Rerun over multiple batches trigger error IGN405 ([#576](https://github.com/NomicFoundation/hardhat-ignition/issues/576)) + ## 0.4.0 - 2023-09-15 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 0663a3c789..a3987e8c60 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.4.0", + "version": "0.11.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 7f612ed681..db353ba6cc 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,38 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.0 - 2023-10-23 + +First public launch 🚀 + +### Added + +- Display batching information in the visualize report ([#494](https://github.com/NomicFoundation/hardhat-ignition/issues/494)) +- Update styling of visualize report ([#493](https://github.com/NomicFoundation/hardhat-ignition/issues/493)) +- Expand Module API so value and from support staticCall/readEventArg as values ([#455](https://github.com/NomicFoundation/hardhat-ignition/issues/455)) +- Support fully qualified contract names ([#563](https://github.com/NomicFoundation/hardhat-ignition/pull/563)) + +### Changed + +- More compact command-line UI ([#495](https://github.com/NomicFoundation/hardhat-ignition/issues/495)) +- Ignition tasks are now scoped e.g. `npx hardhat ignition deploy` ([#442](https://github.com/NomicFoundation/hardhat-ignition/issues/442)) +- The `ignition-info` task has been renamed to `status`, and now shows the status of the current deployment not just the successes ([#496](https://github.com/NomicFoundation/hardhat-ignition/issues/496)) +- Modules now have to be inside a `modules` subfolder within the `./ignition` folder ([#511](https://github.com/NomicFoundation/hardhat-ignition/issues/511)) +- Import of `buildModule` now from `@nomicfoundation/hardhat-ignition/modules` ([#540](https://github.com/NomicFoundation/hardhat-ignition/issues/540)) +- A warning is displayed if you are running against an in-process hardhat network ([#553](https://github.com/NomicFoundation/hardhat-ignition/issues/553)) +- The default deployment id is now `chain-` ([#551](https://github.com/NomicFoundation/hardhat-ignition/issues/551)) +- The `contractAt` signature overload for artifact has been changed to match other artifact overload signatures ([#557](https://github.com/NomicFoundation/hardhat-ignition/issues/557)) + +### Fixed + +- Improve loading times for other non-ignition hh tasks, when Ignition is included ([#13](https://github.com/NomicFoundation/hardhat-ignition/issues/13)) +- Only open visualization report if supported ([#504](https://github.com/NomicFoundation/hardhat-ignition/issues/504)) +- Fixed nonce check failure on rerun ([#506](https://github.com/NomicFoundation/hardhat-ignition/issues/506)) +- Ensure future's senders meet nonce sync checks ([#411](https://github.com/NomicFoundation/hardhat-ignition/issues/411)) +- Show all deployed contracts at the end of a deployment ([#480](https://github.com/NomicFoundation/hardhat-ignition/issues/480)) +- Rerun blocked by sent transactions message IGN403 ([#574](https://github.com/NomicFoundation/hardhat-ignition/issues/574)) +- Rerun over multiple batches trigger error IGN405 ([#576](https://github.com/NomicFoundation/hardhat-ignition/issues/576)) + ## 0.4.0 - 2023-09-15 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 20c62f1e7d..70c3c554f4 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.4.0", + "version": "0.11.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -92,8 +92,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.4.0", - "@nomicfoundation/ignition-ui": "^0.4.0", + "@nomicfoundation/ignition-core": "^0.11.0", + "@nomicfoundation/ignition-ui": "^0.11.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 015829aa36..f4a3a43e42 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.0 - 2023-10-23 + +### Added + +- Display batching information in the visualize report ([#494](https://github.com/NomicFoundation/hardhat-ignition/issues/494)) +- Update styling of visualize report ([#493](https://github.com/NomicFoundation/hardhat-ignition/issues/493)) + ## 0.4.0 - 2023-09-15 ### Changed diff --git a/packages/ui/package.json b/packages/ui/package.json index e5d521831a..b0d9809cde 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.4.0", + "version": "0.11.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.4.0", + "@nomicfoundation/ignition-core": "^0.11.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From 3278b782851e567f68798953daae3d6db27da7d2 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 26 Oct 2023 12:01:28 +0100 Subject: [PATCH 1100/1302] fix: remove the trailing comma in the task param desc --- packages/hardhat-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 67f48388fd..05cc917ec9 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -55,7 +55,7 @@ ignitionScope .addPositionalParam("modulePath", "The path to the module file to deploy") .addOptionalParam( "parameters", - "A relative path to a JSON file to use for the module parameters," + "A relative path to a JSON file to use for the module parameters" ) .addOptionalParam("deploymentId", "Set the id of the deployment") .setDescription("Deploy a module to the specified network") From ec9054881f9f5e2ff9805a4ca574b47a21cf2d2a Mon Sep 17 00:00:00 2001 From: Zoey Date: Fri, 27 Oct 2023 05:17:40 -0400 Subject: [PATCH 1101/1302] removed missing modules folder error (#605) We are going to rely on only the module not found check, and the module should be in expected modules folder check. The specific checks for the `ignition` folder and the `./ignition/modules` folder have been removed. Fixes #602 --------- Co-authored-by: John Kane --- packages/hardhat-plugin/src/load-module.ts | 16 +--------------- packages/hardhat-plugin/test/load-module.ts | 7 ------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/load-module.ts index 16f9a05e27..49ade76a7a 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/load-module.ts @@ -1,6 +1,6 @@ import { IgnitionError, IgnitionModule } from "@nomicfoundation/ignition-core"; import setupDebug from "debug"; -import { existsSync, pathExistsSync } from "fs-extra"; +import { pathExistsSync } from "fs-extra"; import { HardhatPluginError, NomicLabsHardhatPluginError, @@ -27,20 +27,6 @@ export function loadModule( MODULES_FOLDER ); - if (!existsSync(ignitionDirectory)) { - throw new HardhatPluginError( - "hardhat-ignition", - `Ignition directory ${ignitionDirectory} not found.` - ); - } - - if (!existsSync(fullModulesDirectoryName)) { - throw new HardhatPluginError( - "hardhat-ignition", - `Ignition modules directory ${shortModulesDirectoryName} not found.` - ); - } - debug(`Loading user modules from '${fullModulesDirectoryName}'`); const fullpathToModule = path.resolve(modulePath); diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/load-module.ts index eadd00bd19..d684b95ef3 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/load-module.ts @@ -8,13 +8,6 @@ import { useEphemeralIgnitionProject } from "./use-ignition-project"; describe("loadModule", function () { useEphemeralIgnitionProject("user-modules"); - it("should throw if given a user module directory that does not exist", async () => { - assert.throws( - () => loadModule("/fake", "AFile.js"), - `Ignition directory /fake not found.` - ); - }); - it("should throw if the full path to the module does not exist", () => { assert.throws( () => loadModule("ignition", "./ignition/modules/Fake.js"), From 37cb58724266942544baa33fd9170f9a66eff50a Mon Sep 17 00:00:00 2001 From: Zoey Date: Fri, 27 Oct 2023 10:28:01 -0400 Subject: [PATCH 1102/1302] Checksum deployed addresses (#606) Rpc-client now returns objects where if a property is an ethereum address, it will be checksum formatted. Also adds a comparator util to avoid the danger of address comparison failing depending on whether they are checksumed or not. Fixes #600 --------- Co-authored-by: John Kane --- packages/core/src/internal/execution/abi.ts | 5 +++- .../src/internal/execution/jsonrpc-client.ts | 9 ++++-- .../src/internal/execution/utils/address.ts | 29 +++++++++++++++++++ packages/hardhat-plugin/test/status.ts | 4 +-- 4 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 packages/core/src/internal/execution/utils/address.ts diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index 05ec30aa5d..b85659fe07 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -27,6 +27,7 @@ import { SuccessfulEvmExecutionResult, } from "./types/evm-execution"; import { TransactionReceipt } from "./types/jsonrpc"; +import { equalAddresses } from "./utils/address"; const REVERT_REASON_SIGNATURE = "0x08c379a0"; const PANIC_CODE_SIGNATURE = "0x4e487b71"; @@ -362,7 +363,9 @@ export function getEventArgumentFromReceipt( eventIndex: number, nameOrIndex: string | number ): EvmValue { - const emitterLogs = receipt.logs.filter((l) => l.address === emitterAddress); + const emitterLogs = receipt.logs.filter((l) => + equalAddresses(l.address, emitterAddress) + ); const { ethers } = require("ethers") as typeof import("ethers"); const iface = new ethers.Interface(emitterArtifact.abi); diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index a7e8ca779a..630a904ace 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -10,6 +10,7 @@ import { TransactionReceipt, TransactionReceiptStatus, } from "./types/jsonrpc"; +import { toChecksumFormat } from "./utils/address"; /** * The params to make an `eth_call`. @@ -537,7 +538,10 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { return { blockHash: response.blockHash, blockNumber: jsonRpcQuantityToNumber(response.blockNumber), - contractAddress, + contractAddress: + contractAddress === undefined + ? undefined + : toChecksumFormat(contractAddress), status, logs: formatReceiptLogs(method, response), }; @@ -611,6 +615,7 @@ function assertResponseType( }); } } + function formatReceiptLogs(method: string, response: object): TransactionLog[] { const formattedLogs: TransactionLog[] = []; @@ -660,7 +665,7 @@ function formatReceiptLogs(method: string, response: object): TransactionLog[] { ); formattedLogs.push({ - address: rawLog.address, + address: toChecksumFormat(rawLog.address), logIndex: jsonRpcQuantityToNumber(rawLog.logIndex), data: rawLog.data, topics: rawLog.topics, diff --git a/packages/core/src/internal/execution/utils/address.ts b/packages/core/src/internal/execution/utils/address.ts new file mode 100644 index 0000000000..e1ad52922d --- /dev/null +++ b/packages/core/src/internal/execution/utils/address.ts @@ -0,0 +1,29 @@ +import { getAddress, isAddress } from "ethers"; + +import { assertIgnitionInvariant } from "../../utils/assertions"; + +/** + * Returns a normalized and checksumed address for the given address. + * + * @param address - the address to reformat + * @returns checksumed address + */ +export function toChecksumFormat(address: string) { + assertIgnitionInvariant( + isAddress(address), + `Expected ${address} to be an address` + ); + + return getAddress(address); +} + +/** + * Determine if two addresses are equal ignoring case (which is a consideration + * because of checksumming). + */ +export function equalAddresses( + leftAddress: string, + rightAddress: string +): boolean { + return toChecksumFormat(leftAddress) === toChecksumFormat(rightAddress); +} diff --git a/packages/hardhat-plugin/test/status.ts b/packages/hardhat-plugin/test/status.ts index 0eb77b7cfb..efc95887c2 100644 --- a/packages/hardhat-plugin/test/status.ts +++ b/packages/hardhat-plugin/test/status.ts @@ -48,7 +48,7 @@ describe("status", function () { "FooModule#Foo": { id: "FooModule#Foo", contractName: "Foo", - address: "0x5fbdb2315678afecb367f032d93f642f64180aa3", + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", }, }, }); @@ -87,7 +87,7 @@ describe("status", function () { "FooModule#Foo": { id: "FooModule#Foo", contractName: "Foo", - address: "0x5fbdb2315678afecb367f032d93f642f64180aa3", + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", }, }, }); From 395dff02756dffd1670d729a0bddd1a5fb71695a Mon Sep 17 00:00:00 2001 From: Zoey Date: Fri, 27 Oct 2023 10:33:40 -0400 Subject: [PATCH 1103/1302] Changed the rendered text for previously successful depoyment (#593) On a rerun, where there have been no futures executed we now show a clearer message that allows the user to understand that nothing new was executed. Fixes #586 --------- Co-authored-by: John Kane --- .../calculate-deployment-complete-display.ts | 40 +++++++++++-- .../src/ui/helpers/was-anything-executed.ts | 11 ++++ .../src/ui/pretty-event-handler.ts | 3 +- .../calculate-deployment-complete-display.ts | 59 +++++++++++++++++++ 4 files changed, 107 insertions(+), 6 deletions(-) create mode 100644 packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts index fb4e40e67a..d8035d1771 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -9,15 +9,31 @@ import { } from "@nomicfoundation/ignition-core"; import chalk from "chalk"; +import { UiState } from "../types"; + +import { pathFromCwd } from "./cwd-relative-path"; +import { wasAnythingExecuted } from "./was-anything-executed"; + export function calculateDeploymentCompleteDisplay( event: DeploymentCompleteEvent, - { moduleName: givenModuleName }: { moduleName: string | null } + uiState: Pick< + UiState, + "moduleName" | "isResumed" | "batches" | "deploymentDir" + > ): string { - const moduleName = givenModuleName ?? "unknown"; + const moduleName = uiState.moduleName ?? "unknown"; + const isResumed = uiState.isResumed ?? false; switch (event.result.type) { case DeploymentResultType.SUCCESSFUL_DEPLOYMENT: { - return _displaySuccessfulDeployment(event.result, { moduleName }); + const isRerunWithNoChanges: boolean = + isResumed && !wasAnythingExecuted(uiState); + + return _displaySuccessfulDeployment(event.result, { + moduleName, + isRerunWithNoChanges, + deploymentDir: uiState.deploymentDir, + }); } case DeploymentResultType.VALIDATION_ERROR: { return _displayValidationErrors(event.result, { moduleName }); @@ -36,9 +52,23 @@ export function calculateDeploymentCompleteDisplay( function _displaySuccessfulDeployment( result: SuccessfulDeploymentResult, - { moduleName }: { moduleName: string } + { + moduleName, + isRerunWithNoChanges, + deploymentDir, + }: { + moduleName: string; + isRerunWithNoChanges: boolean; + deploymentDir: string | null | undefined; + } ): string { - let text = `[ ${moduleName} ] successfully deployed 🚀 + const fillerText = isRerunWithNoChanges + ? `Nothing new to deploy based on previous execution stored in ${pathFromCwd( + deploymentDir ?? "Not provided" + )}` + : `successfully deployed 🚀`; + + let text = `[ ${moduleName} ] ${fillerText} ${chalk.bold("Deployed Addresses")} diff --git a/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts b/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts new file mode 100644 index 0000000000..f81919113d --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts @@ -0,0 +1,11 @@ +import { UiState } from "../types"; + +/** + * Was anything executed during the deployment. We determine this based + * on whether the batcher indicates that there was at least one batch. + */ +export function wasAnythingExecuted({ + batches, +}: Pick): boolean { + return batches.length > 0; +} diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 36421f5a74..d30f33b73e 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -38,6 +38,7 @@ import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; import { calculateDeploymentCompleteDisplay } from "./helpers/calculate-deployment-complete-display"; import { calculateStartingMessage } from "./helpers/calculate-starting-message"; +import { wasAnythingExecuted } from "./helpers/was-anything-executed"; import { UiBatches, UiFuture, @@ -262,7 +263,7 @@ export class PrettyEventHandler implements ExecutionEventListener { }; // If batches where executed, rerender the last batch - if (this.state.currentBatch > 0) { + if (wasAnythingExecuted(this.state)) { this._redisplayCurrentBatch(); } else { // Otherwise only the completion panel will be shown so clear diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index 38c5df8c6f..9e4d314661 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -11,6 +11,7 @@ import { assert } from "chai"; import chalk from "chalk"; import { calculateDeploymentCompleteDisplay } from "../../../src/ui/helpers/calculate-deployment-complete-display"; +import { UiBatches, UiFutureStatusType } from "../../../src/ui/types"; import { testFormat } from "./test-format"; @@ -18,6 +19,20 @@ describe("ui - calculate deployment complete display", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0x0011223344556677889900112233445566778899"; + const exampleMultipleBatches: UiBatches = [ + [ + { + status: { + type: UiFutureStatusType.SUCCESS, + result: "0x0", + }, + futureId: "MyModule#MyContract1", + }, + ], + ]; + + const exampleNoBatches: UiBatches = []; + describe("successful deployment", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` @@ -49,6 +64,9 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", }); assert.equal(actualText, expectedText); @@ -72,6 +90,35 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", + }); + + assert.equal(actualText, expectedText); + }); + + it("should render a resumed deployment with no new deployments", () => { + const expectedText = testFormat(` + [ MyModule ] Nothing new to deploy based on previous execution stored in test + + ${chalk.bold("Deployed Addresses")} + + ${chalk.italic("No contracts were deployed")}`); + + const event: DeploymentCompleteEvent = { + type: ExecutionEventType.DEPLOYMENT_COMPLETE, + result: { + type: DeploymentResultType.SUCCESSFUL_DEPLOYMENT, + contracts: {}, + }, + }; + + const actualText = calculateDeploymentCompleteDisplay(event, { + moduleName: "MyModule", + isResumed: true, + batches: exampleNoBatches, + deploymentDir: "test", }); assert.equal(actualText, expectedText); @@ -112,6 +159,9 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", }); assert.equal(actualText, expectedText); @@ -152,6 +202,9 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", }); assert.equal(actualText, expectedText); @@ -184,6 +237,9 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", }); assert.equal(actualText, expectedText); @@ -252,6 +308,9 @@ describe("ui - calculate deployment complete display", () => { const actualText = calculateDeploymentCompleteDisplay(event, { moduleName: "MyModule", + isResumed: false, + batches: exampleMultipleBatches, + deploymentDir: "", }); assert.equal(actualText, expectedText); From 6fe17b1fb9112c171af95dbf51b876a26548429c Mon Sep 17 00:00:00 2001 From: Zoey Date: Fri, 27 Oct 2023 12:30:04 -0400 Subject: [PATCH 1104/1302] Add fee bumping messaging to the UI (#604) Against the cli, when there is a fee bump we now display that as text against the future. The current number of the fee bump is shown against the configured max fee bumps. There is also some tweaks to timed out text in the cli display. Fixes #587 --------- Co-authored-by: John Kane --- examples/sample/scripts/bump.js | 118 ++++++++++++++++++ packages/core/src/internal/deployer.ts | 7 +- packages/core/src/types/execution-events.ts | 1 + .../src/ui/helpers/calculate-batch-display.ts | 17 ++- .../calculate-deployment-complete-display.ts | 4 +- .../calculate-deployment-status-display.ts | 4 +- .../src/ui/pretty-event-handler.ts | 15 ++- packages/hardhat-plugin/src/ui/types.ts | 2 + .../ui/helpers/calculate-batch-display.ts | 31 ++++- ...alculate-deploying-module-panel-display.ts | 2 + .../calculate-deployment-complete-display.ts | 4 +- .../calculate-deployment-status-display.ts | 4 +- 12 files changed, 188 insertions(+), 21 deletions(-) create mode 100644 examples/sample/scripts/bump.js diff --git a/examples/sample/scripts/bump.js b/examples/sample/scripts/bump.js new file mode 100644 index 0000000000..314787730a --- /dev/null +++ b/examples/sample/scripts/bump.js @@ -0,0 +1,118 @@ +const { + setNextBlockBaseFeePerGas, + mine, +} = require("@nomicfoundation/hardhat-network-helpers"); + +/** + * This is a script that can be used to manually test the fee bumping mechanism in Hardhat Ignition. + * + * Steps to use: + * 1. Edit hardhat.config.js to adjust Hardhat Ignition's configuration, depending on what you want to test. + * Ex: + * ``` + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, + ignition: { + maxFeeBumps: 3, + timeBeforeBumpingFees: 50, + blockPollingInterval: 100, + }, + ``` + * 2. Run `npx hardhat node` in one terminal. + * 3. Run `npx hardhat run ./scripts/bump.js --network localhost` in another terminal. + * 4. Wait for the script to ask you to start the deployment. + * 5. Run `npx hardhat ignition deploy ./ignition/modules/LockModule.js --network localhost` in another terminal. + */ +async function main() { + await ethers.provider.send("evm_setAutomine", [false]); + + // eslint-disable-next-line no-console + console.log( + "Script has started. Please open another terminal and start the deployment now..." + ); + + // wait for one tx to be added to the mempool + await waitForPendingTxs(1); + + // eslint-disable-next-line no-console + console.log( + "Transaction detected, increasing block fee and mining a block..." + ); + + // bump the fee of the next block + await setNextBlockBaseFeePerGas(10_000_000_000n); + + // mine the block + await mine(1); + + // wait + await sleep(1000); + + // bump the fee of the next block + await setNextBlockBaseFeePerGas(100_000_000_000n); + + // mine the block + await mine(1); + + // wait + await sleep(1000); + + // bump the fee of the next block + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + + // mine the block + await mine(1); + + // wait + await sleep(1000); + + // bump the fee of the next block + await setNextBlockBaseFeePerGas(10_000_000_000_000n); + + // mine the block + await mine(1); + + // wait + await sleep(1000); + + // bump the fee of the next block + await setNextBlockBaseFeePerGas(100_000_000_000_000n); + + // mine the block + await mine(1); + + // wait + await sleep(1000); + + // eslint-disable-next-line no-console + console.log("Script finished"); +} + +/* Helpers */ + +const sleep = (timeout) => new Promise((res) => setTimeout(res, timeout)); + +/** + * Wait until there are at least `expectedCount` transactions in the mempool + */ +async function waitForPendingTxs(expectedCount) { + while (true) { + const pendingBlock = await network.provider.send("eth_getBlockByNumber", [ + "pending", + false, + ]); + + if (pendingBlock.transactions.length >= expectedCount) { + return; + } + + await sleep(50); + } +} + +main(); diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 65aa4327d6..371536c6a2 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -84,7 +84,8 @@ export class Deployer { this._emitDeploymentStartEvent( ignitionModule.id, this._deploymentDir, - isResumed + isResumed, + this._config.maxFeeBumps ); const contracts = @@ -268,7 +269,8 @@ export class Deployer { private _emitDeploymentStartEvent( moduleId: string, deploymentDir: string | undefined, - isResumed: boolean + isResumed: boolean, + maxFeeBumps: number ): void { if (this._executionEventListener === undefined) { return; @@ -279,6 +281,7 @@ export class Deployer { moduleName: moduleId, deploymentDir: deploymentDir ?? undefined, isResumed, + maxFeeBumps, }); } diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 64111807d2..0bf6cbb2f1 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -78,6 +78,7 @@ export interface DeploymentStartEvent { moduleName: string; deploymentDir: string | undefined; isResumed: boolean; + maxFeeBumps: number; } /** diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts index fa3f578bc7..9d4b5520ce 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -11,7 +11,7 @@ export function calculateBatchDisplay(state: UiState): { text += batch .sort((a, b) => a.futureId.localeCompare(b.futureId)) - .map(_futureStatus) + .map((v) => _futureStatus(v, state.gasBumps, state.maxFeeBumps)) .join("\n"); text += "\n"; @@ -19,16 +19,25 @@ export function calculateBatchDisplay(state: UiState): { return { text, height }; } -function _futureStatus(future: UiFuture): string { +function _futureStatus( + future: UiFuture, + gasBumps: Record, + maxFeeBumps: number +): string { switch (future.status.type) { case UiFutureStatusType.UNSTARTED: { - return ` Executing ${future.futureId}...`; + const gas = gasBumps[future.futureId]; + return ` Executing ${future.futureId}${ + gas !== undefined + ? ` - bumping gas fee (${gas}/${maxFeeBumps})...` + : "..." + }`; } case UiFutureStatusType.SUCCESS: { return ` Executed ${future.futureId}`; } case UiFutureStatusType.TIMEDOUT: { - return ` Pending ${future.futureId}`; + return ` Timed out ${future.futureId}`; } case UiFutureStatusType.ERRORED: { return ` Failed ${future.futureId}`; diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts index d8035d1771..dfb457d6ac 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts @@ -163,14 +163,12 @@ function _displayExecutionErrors( let text = `[ ${moduleName} ] failed ⛔\n\n`; if (result.timedOut.length > 0) { - let timedOutSection = `Futures with transactions unconfirmed after maximum fee bumps:\n`; + let timedOutSection = `Futures timed out with transactions unconfirmed after maximum fee bumps:\n`; timedOutSection += Object.values(result.timedOut) .map(({ futureId }) => ` - ${futureId}`) .join("\n"); - timedOutSection += "\n\nConsider increasing the fee in your config."; - sections.push(timedOutSection); } diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts index 41fe770921..f0edec0a05 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts @@ -57,14 +57,12 @@ function _calculateFailed(deploymentId: string, statusResult: StatusResult) { const sections: string[] = []; if (statusResult.timedOut.length > 0) { - let timedOutSection = `\nFutures with transactions unconfirmed after maximum fee bumps:\n`; + let timedOutSection = `\nFutures timed out with transactions unconfirmed after maximum fee bumps:\n`; timedOutSection += Object.values(statusResult.timedOut) .map(({ futureId }) => ` - ${futureId}`) .join("\n"); - timedOutSection += "\n\nConsider increasing the fee in your config."; - sections.push(timedOutSection); } diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index d30f33b73e..6def3977b1 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -62,6 +62,8 @@ export class PrettyEventHandler implements ExecutionEventListener { result: null, warnings: [], isResumed: null, + maxFeeBumps: 0, + gasBumps: {}, }; constructor(private _deploymentParams: DeploymentParameters = {}) {} @@ -81,6 +83,7 @@ export class PrettyEventHandler implements ExecutionEventListener { moduleName: event.moduleName, deploymentDir: event.deploymentDir, isResumed: event.isResumed, + maxFeeBumps: event.maxFeeBumps, }; process.stdout.write(calculateStartingMessage(this.state)); @@ -239,8 +242,16 @@ export class PrettyEventHandler implements ExecutionEventListener { public staticCallComplete(_event: StaticCallCompleteEvent): void {} public onchainInteractionBumpFees( - _event: OnchainInteractionBumpFeesEvent - ): void {} + event: OnchainInteractionBumpFeesEvent + ): void { + if (this._uiState.gasBumps[event.futureId] === undefined) { + this._uiState.gasBumps[event.futureId] = 0; + } + + this._uiState.gasBumps[event.futureId] += 1; + + this._redisplayCurrentBatch(); + } public onchainInteractionDropped( _event: OnchainInteractionDroppedEvent diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index ea7ba79ed8..6fabc5c2a6 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -62,6 +62,8 @@ export interface UiState { result: DeploymentResult | null; warnings: string[]; isResumed: boolean | null; + maxFeeBumps: number; + gasBumps: Record; } export interface AddressMap { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 25f3bf8050..e5e80573ef 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -20,6 +20,8 @@ const exampleState: UiState = { result: null, warnings: [], isResumed: false, + maxFeeBumps: 0, + gasBumps: {}, }; describe("ui - calculate batch display", () => { @@ -84,6 +86,26 @@ describe("ui - calculate batch display", () => { ); }); + it("should render a batch with a single timed out future", () => { + const expectedText = testFormat(` + Batch #1 + Timed out ExampleModule#Token + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.TIMEDOUT, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText + ); + }); + it("should render a batch with a single held future", () => { const expectedText = testFormat(` Batch #1 @@ -111,6 +133,7 @@ describe("ui - calculate batch display", () => { Batch #1 Failed ExampleModule#Dex Held ExampleModule#ENS + Timed out ExampleModule#Registry Executed ExampleModule#Router Executing ExampleModule#Token... `); @@ -136,6 +159,12 @@ describe("ui - calculate batch display", () => { }, futureId: "ExampleModule#Router", }, + { + status: { + type: UiFutureStatusType.TIMEDOUT, + }, + futureId: "ExampleModule#Registry", + }, { status: { type: UiFutureStatusType.HELD, @@ -145,7 +174,7 @@ describe("ui - calculate batch display", () => { futureId: "ExampleModule#ENS", }, ], - 6, + 7, expectedText ); }); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index c0afbe2d18..b5c4cf0b5f 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -18,6 +18,8 @@ describe("ui - calculate starting message display", () => { result: null, warnings: [], isResumed: null, + maxFeeBumps: 0, + gasBumps: {}, }; it("should display the deploying module message", () => { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts index 9e4d314661..5e59cc92a5 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts @@ -251,12 +251,10 @@ describe("ui - calculate deployment complete display", () => { const expectedText = testFormat(` [ MyModule ] failed ⛔ - Futures with transactions unconfirmed after maximum fee bumps: + Futures timed out with transactions unconfirmed after maximum fee bumps: - MyModule#MyContract1 - MyModule#AnotherContract1 - Consider increasing the fee in your config. - Futures failed during execution: - MyModule#MyContract3: Reverted with reason x - MyModule#AnotherContract3: Reverted with reason y diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index 259a84928e..b226bbb67f 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -80,12 +80,10 @@ describe("ui - calculate deployment status display", () => { const expectedText = testFormat(` Deployment deployment-01 failed - Futures with transactions unconfirmed after maximum fee bumps: + Futures timed out with transactions unconfirmed after maximum fee bumps: - MyModule:MyContract1 - MyModule:AnotherContract1 - Consider increasing the fee in your config. - Futures failed during execution: - MyModule:MyContract3: Reverted with reason x - MyModule:AnotherContract3: Reverted with reason y From 5a54ac58643cbf3b87d6adf9086b08710b3fc944 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 30 Oct 2023 11:49:34 +0000 Subject: [PATCH 1105/1302] chore: bump version to v0.11.1 Update the packages versions and changelogs for the `0.11.1 - 2023-10-30` release. --- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- package-lock.json | 28 ++++++++++++++-------------- packages/core/CHANGELOG.md | 10 ++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 12 ++++++++++++ packages/hardhat-plugin/package.json | 6 +++--- packages/ui/package.json | 4 ++-- 10 files changed, 50 insertions(+), 28 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index cc99373b0f..15cda97550 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.11.0", + "version": "0.11.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index dfaaa3f3b1..ac876b328b 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.11.0", + "version": "0.11.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index efa0fb33d6..d02fac96b0 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.11.0", + "version": "0.11.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index f24836d26b..62016d388e 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.11.0", + "version": "0.11.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index af7c665ae7..549de87209 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.11.0", + "version": "0.11.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -40,12 +40,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.11.0", + "version": "0.11.1", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -53,9 +53,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.11.0", + "version": "0.11.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -63,9 +63,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.11.0", + "version": "0.11.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.0", + "@nomicfoundation/hardhat-ignition": "^0.11.1", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -21264,7 +21264,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21374,11 +21374,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.0", - "@nomicfoundation/ignition-ui": "^0.11.0", + "@nomicfoundation/ignition-core": "^0.11.1", + "@nomicfoundation/ignition-ui": "^0.11.1", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", @@ -21496,10 +21496,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.0", + "version": "0.11.1", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.0", + "@nomicfoundation/ignition-core": "^0.11.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8b4f80f01d..5df058ad1c 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.1 - 2023-10-30 + +### Added + +- Give visual indication that there was a gas bump in `deploy` task ([#587](https://github.com/NomicFoundation/hardhat-ignition/issues/587)) + +### Changed + +- When displaying an Ethereum Address at the cli, show in checksum format ([#600](https://github.com/NomicFoundation/hardhat-ignition/issues/600)) + ## 0.11.0 - 2023-10-23 First public launch 🚀 diff --git a/packages/core/package.json b/packages/core/package.json index a3987e8c60..46d709274b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index db353ba6cc..f80c707cb8 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.1 - 2023-10-30 + +### Added + +- Give visual indication that there was a gas bump in `deploy` task ([#587](https://github.com/NomicFoundation/hardhat-ignition/issues/587)) + +### Changed + +- When displaying an Ethereum Address at the cli, show in checksum format ([#600](https://github.com/NomicFoundation/hardhat-ignition/issues/600)) +- Show a better message when no futures were executed during a rerun ([#586](https://github.com/NomicFoundation/hardhat-ignition/issues/586)) +- Less confusing message for no modules folder error ([#602](https://github.com/NomicFoundation/hardhat-ignition/issues/602)) + ## 0.11.0 - 2023-10-23 First public launch 🚀 diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 70c3c554f4..9098cc9c4c 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.0", + "version": "0.11.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -92,8 +92,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.0", - "@nomicfoundation/ignition-ui": "^0.11.0", + "@nomicfoundation/ignition-core": "^0.11.1", + "@nomicfoundation/ignition-ui": "^0.11.1", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index b0d9809cde..ca7f437526 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.0", + "version": "0.11.1", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.0", + "@nomicfoundation/ignition-core": "^0.11.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From 3cc5cf381bc74c14f66bccf4a288d736a9949499 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 30 Oct 2023 10:23:14 -0700 Subject: [PATCH 1106/1302] upgrade typescript to v5 --- package-lock.json | 27 +++++++-------------------- package.json | 2 +- packages/core/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 4 files changed, 10 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index 549de87209..8520449d11 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "open-cli": "7.2.0", "prettier": "2.4.1", "typedoc": "0.23.28", - "typescript": "^4.7.4" + "typescript": "^5.0.2" }, "workspaces": { "packages": [ @@ -19991,16 +19991,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/typical": { @@ -21303,7 +21303,7 @@ "prettier": "2.4.1", "rimraf": "3.0.2", "ts-node": "10.9.1", - "typescript": "^4.7.4" + "typescript": "^5.0.2" } }, "packages/core/node_modules/eslint-import-resolver-typescript": { @@ -21421,7 +21421,7 @@ "rimraf": "3.0.2", "sinon": "^14.0.0", "ts-node": "10.9.1", - "typescript": "^4.7.4" + "typescript": "^5.0.2" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -22051,19 +22051,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "packages/ui/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "packages/ui/node_modules/uuid": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", diff --git a/package.json b/package.json index 02d4dbd008..7d28dfe4b6 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,6 @@ "open-cli": "7.2.0", "prettier": "2.4.1", "typedoc": "0.23.28", - "typescript": "^4.7.4" + "typescript": "^5.0.2" } } diff --git a/packages/core/package.json b/packages/core/package.json index 46d709274b..118ffe4812 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -72,7 +72,7 @@ "prettier": "2.4.1", "rimraf": "3.0.2", "ts-node": "10.9.1", - "typescript": "^4.7.4" + "typescript": "^5.0.2" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 9098cc9c4c..d360558c67 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -85,7 +85,7 @@ "rimraf": "3.0.2", "sinon": "^14.0.0", "ts-node": "10.9.1", - "typescript": "^4.7.4" + "typescript": "^5.0.2" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", From 8c324492ea857b7b6d419b03f5e625c0f9f8b16f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 31 Oct 2023 10:14:00 -0700 Subject: [PATCH 1107/1302] validate that module id's are not duplicated --- packages/core/src/build-module.ts | 11 +++++++++++ packages/core/src/errors-list.ts | 5 +++++ packages/core/src/internal/module-builder.ts | 11 ++++++----- packages/core/test/validations/id-rules.ts | 16 ++++++++++++++++ 4 files changed, 38 insertions(+), 5 deletions(-) diff --git a/packages/core/src/build-module.ts b/packages/core/src/build-module.ts index 6963c18e1a..ab460cde26 100644 --- a/packages/core/src/build-module.ts +++ b/packages/core/src/build-module.ts @@ -47,5 +47,16 @@ export function buildModule< moduleDefintionFunction, }); + const duplicateModuleIds = [ + ignitionModule.id, + ...Array.from(ignitionModule.submodules).map((submodule) => submodule.id), + ].filter((id, index, array) => array.indexOf(id) !== index); + + if (duplicateModuleIds.length > 0) { + throw new IgnitionError(ERRORS.MODULE.DUPLICATE_MODULE_ID, { + duplicateModuleIds: duplicateModuleIds.join(", "), + }); + } + return ignitionModule; } diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 50c317f1d3..6b81e0889e 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -129,6 +129,11 @@ export const ERRORS = { message: "The callback passed to 'buildModule' for %moduleDefinitionId% returns a Promise; async callbacks are not allowed in 'buildModule'.", }, + DUPLICATE_MODULE_ID: { + number: 204, + message: + "The following module ids are duplicated: %duplicateModuleIds%. Please make sure all module ids are unique.", + }, }, SERIALIZATION: { INVALID_FUTURE_ID: { diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index ef6b7a6398..f967ab84a0 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -900,11 +900,12 @@ class IgnitionModuleBuilderImplementation< "Trying to use `undefined` as submodule. Make sure you don't have a circular dependency of modules." ); - // Some things that should be done here: - // - Keep track of the submodule - // - return the submodule's results - // - this._module.submodules.add(ignitionSubmodule); + if (this._module.submodules) + // Some things that should be done here: + // - Keep track of the submodule + // - return the submodule's results + // + this._module.submodules.add(ignitionSubmodule); return ignitionSubmodule.results; } diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index c7917a7a27..ef2a7acfe0 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -16,6 +16,22 @@ describe("id rules", () => { }); }, /IGN201: The moduleId "MyModule:v2" is invalid. Module ids can only have alphanumerics and underscore, and they must start with an alphanumeric./); }); + + it("should not allow duplicate module ids", () => { + const MyModule = buildModule("MyModule", (m) => { + const myContract = m.contract("MyContract"); + + return { myContract }; + }); + + assert.throws(() => { + buildModule("MyModule", (m) => { + const { myContract } = m.useModule(MyModule); + + return { myContract }; + }); + }, /IGN204: The following module ids are duplicated: MyModule\. Please make sure all module ids are unique\./); + }); }); // Windows is not going to allow these characters in filenames From 5154b33ac4442d5e7517c5e0a8a4b25e9d6e4209 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 31 Oct 2023 10:56:47 -0700 Subject: [PATCH 1108/1302] remove accidentally included line --- packages/core/src/internal/module-builder.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index f967ab84a0..ef6b7a6398 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -900,12 +900,11 @@ class IgnitionModuleBuilderImplementation< "Trying to use `undefined` as submodule. Make sure you don't have a circular dependency of modules." ); - if (this._module.submodules) - // Some things that should be done here: - // - Keep track of the submodule - // - return the submodule's results - // - this._module.submodules.add(ignitionSubmodule); + // Some things that should be done here: + // - Keep track of the submodule + // - return the submodule's results + // + this._module.submodules.add(ignitionSubmodule); return ignitionSubmodule.results; } From 0729aa57bd07022c636b9b87e405f3a6c475c9fc Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 1 Nov 2023 09:43:33 +0000 Subject: [PATCH 1109/1302] feat: add duplicate id error to whitelist Give a clean display of the new duplicate id error. --- packages/core/src/build-module.ts | 22 ++++++++++++++----- .../src/utils/shouldBeHardhatPluginError.ts | 6 ++--- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/packages/core/src/build-module.ts b/packages/core/src/build-module.ts index ab460cde26..5d1a4b9bd6 100644 --- a/packages/core/src/build-module.ts +++ b/packages/core/src/build-module.ts @@ -47,16 +47,28 @@ export function buildModule< moduleDefintionFunction, }); + _checkForDuplicateModuleIds(ignitionModule); + + return ignitionModule; +} + +/** + * Check to ensure that there are no duplicate module ids among the root + * module and its submodules. + */ +function _checkForDuplicateModuleIds( + ignitionModule: IgnitionModule> +): void { const duplicateModuleIds = [ ignitionModule.id, ...Array.from(ignitionModule.submodules).map((submodule) => submodule.id), ].filter((id, index, array) => array.indexOf(id) !== index); - if (duplicateModuleIds.length > 0) { - throw new IgnitionError(ERRORS.MODULE.DUPLICATE_MODULE_ID, { - duplicateModuleIds: duplicateModuleIds.join(", "), - }); + if (duplicateModuleIds.length === 0) { + return; } - return ignitionModule; + throw new IgnitionError(ERRORS.MODULE.DUPLICATE_MODULE_ID, { + duplicateModuleIds: duplicateModuleIds.join(", "), + }); } diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index a6c4d8bbeb..c6b2cb2f0b 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -9,9 +9,9 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ const whitelist = [ - 200, 201, 202, 203, 403, 404, 405, 600, 601, 602, 700, 701, 702, 703, 704, - 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, - 720, 721, 722, 723, 724, 725, 726, 800, 900, + 200, 201, 202, 203, 204, 403, 404, 405, 600, 601, 602, 700, 701, 702, 703, + 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, + 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { From 5fb9cb451bf3948c183fbd2071ca5a4c59d5e4a1 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 31 Oct 2023 09:30:26 -0700 Subject: [PATCH 1110/1302] record contractAt addresses to json file --- .../future-processor/future-processor.ts | 15 ++++++++ .../future-processor/named-contract-deploy.ts | 37 ++++++++++++++++++- 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index 40cebccbec..bf4ec4f482 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -96,6 +96,13 @@ export class FutureProcessor { exState !== undefined, `Invalid initialization message for future ${future.id}: it didn't create its execution state` ); + + if ( + initMessage.type === + JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE + ) { + await this._recordDeployedAddressIfNeeded(initMessage); + } } while (!isExecutionStateComplete(exState)) { @@ -148,6 +155,14 @@ export class FutureProcessor { lastAppliedMessage.futureId, lastAppliedMessage.result.address ); + } else if ( + lastAppliedMessage.type === + JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE + ) { + await this._deploymentLoader.recordDeployedAddress( + lastAppliedMessage.futureId, + lastAppliedMessage.contractAddress + ); } } diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/core/test/execution/future-processor/named-contract-deploy.ts index 8f82a9ccf3..13abec7747 100644 --- a/packages/core/test/execution/future-processor/named-contract-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-deploy.ts @@ -1,6 +1,9 @@ import { assert } from "chai"; -import { NamedArtifactContractDeploymentFuture } from "../../../src"; +import { + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, +} from "../../../src"; import { TransactionParams } from "../../../src/internal/execution/jsonrpc-client"; import { deploymentStateReducer } from "../../../src/internal/execution/reducers/deployment-state-reducer"; import { ExecutionResultType } from "../../../src/internal/execution/types/execution-result"; @@ -9,7 +12,10 @@ import { ExecutionStatus, } from "../../../src/internal/execution/types/execution-state"; import { TransactionReceiptStatus } from "../../../src/internal/execution/types/jsonrpc"; -import { NamedContractDeploymentFutureImplementation } from "../../../src/internal/module"; +import { + NamedContractAtFutureImplementation, + NamedContractDeploymentFutureImplementation, +} from "../../../src/internal/module"; import { assertIgnitionInvariant } from "../../../src/internal/utils/assertions"; import { exampleAccounts } from "../../helpers"; @@ -79,5 +85,32 @@ describe("future processor", () => { address: exampleAddress, }); }); + + it("should record the address of a contractAt future", async () => { + // Arrange + const fakeModule = {} as any; + + const deploymentFuture: NamedArtifactContractAtFuture = + new NamedContractAtFutureImplementation( + "MyModule:TestContract", + fakeModule, + "TestContract", + exampleAddress + ); + + const { processor, storedDeployedAddresses } = setupFutureProcessor( + (() => {}) as any, + {} + ); + + // Act + await processor.processFuture(deploymentFuture, initialDeploymentState); + + // Assert + assert.equal( + storedDeployedAddresses["MyModule:TestContract"], + exampleAddress + ); + }); }); }); From f627fc3b9d7a3fdfe22a35e9680c88441b9303f2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 2 Nov 2023 03:48:36 -0400 Subject: [PATCH 1111/1302] break out test into its own file --- .../named-contract-at-deploy.ts | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 packages/core/test/execution/future-processor/named-contract-at-deploy.ts diff --git a/packages/core/test/execution/future-processor/named-contract-at-deploy.ts b/packages/core/test/execution/future-processor/named-contract-at-deploy.ts new file mode 100644 index 0000000000..fd56b00e9a --- /dev/null +++ b/packages/core/test/execution/future-processor/named-contract-at-deploy.ts @@ -0,0 +1,42 @@ +import { assert } from "chai"; + +import { NamedArtifactContractAtFuture } from "../../../src"; +import { deploymentStateReducer } from "../../../src/internal/execution/reducers/deployment-state-reducer"; +import { NamedContractAtFutureImplementation } from "../../../src/internal/module"; + +import { setupFutureProcessor } from "./utils"; + +const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + +describe("future processor", () => { + const initialDeploymentState = deploymentStateReducer(undefined); + + describe("deploying a named contractAt", () => { + it("should record the address of a contractAt future", async () => { + // Arrange + const fakeModule = {} as any; + + const deploymentFuture: NamedArtifactContractAtFuture = + new NamedContractAtFutureImplementation( + "MyModule:TestContract", + fakeModule, + "TestContract", + exampleAddress + ); + + const { processor, storedDeployedAddresses } = setupFutureProcessor( + (() => {}) as any, + {} + ); + + // Act + await processor.processFuture(deploymentFuture, initialDeploymentState); + + // Assert + assert.equal( + storedDeployedAddresses["MyModule:TestContract"], + exampleAddress + ); + }); + }); +}); From 9ce56940aeb7e06bb4464f0baf68c4956e4af5bc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 2 Nov 2023 11:33:02 -0400 Subject: [PATCH 1112/1302] remove extraneous test --- .../future-processor/named-contract-deploy.ts | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/core/test/execution/future-processor/named-contract-deploy.ts index 13abec7747..9fa393717c 100644 --- a/packages/core/test/execution/future-processor/named-contract-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-deploy.ts @@ -85,32 +85,5 @@ describe("future processor", () => { address: exampleAddress, }); }); - - it("should record the address of a contractAt future", async () => { - // Arrange - const fakeModule = {} as any; - - const deploymentFuture: NamedArtifactContractAtFuture = - new NamedContractAtFutureImplementation( - "MyModule:TestContract", - fakeModule, - "TestContract", - exampleAddress - ); - - const { processor, storedDeployedAddresses } = setupFutureProcessor( - (() => {}) as any, - {} - ); - - // Act - await processor.processFuture(deploymentFuture, initialDeploymentState); - - // Assert - assert.equal( - storedDeployedAddresses["MyModule:TestContract"], - exampleAddress - ); - }); }); }); From c43e0c5204b3270470af892f057e17178665e620 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 2 Nov 2023 12:30:08 -0400 Subject: [PATCH 1113/1302] remove if check --- .../execution/future-processor/future-processor.ts | 7 +------ .../future-processor/named-contract-deploy.ts | 10 ++-------- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index bf4ec4f482..eb1e4046d8 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -97,12 +97,7 @@ export class FutureProcessor { `Invalid initialization message for future ${future.id}: it didn't create its execution state` ); - if ( - initMessage.type === - JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE - ) { - await this._recordDeployedAddressIfNeeded(initMessage); - } + await this._recordDeployedAddressIfNeeded(initMessage); } while (!isExecutionStateComplete(exState)) { diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/core/test/execution/future-processor/named-contract-deploy.ts index 9fa393717c..8f82a9ccf3 100644 --- a/packages/core/test/execution/future-processor/named-contract-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-deploy.ts @@ -1,9 +1,6 @@ import { assert } from "chai"; -import { - NamedArtifactContractAtFuture, - NamedArtifactContractDeploymentFuture, -} from "../../../src"; +import { NamedArtifactContractDeploymentFuture } from "../../../src"; import { TransactionParams } from "../../../src/internal/execution/jsonrpc-client"; import { deploymentStateReducer } from "../../../src/internal/execution/reducers/deployment-state-reducer"; import { ExecutionResultType } from "../../../src/internal/execution/types/execution-result"; @@ -12,10 +9,7 @@ import { ExecutionStatus, } from "../../../src/internal/execution/types/execution-state"; import { TransactionReceiptStatus } from "../../../src/internal/execution/types/jsonrpc"; -import { - NamedContractAtFutureImplementation, - NamedContractDeploymentFutureImplementation, -} from "../../../src/internal/module"; +import { NamedContractDeploymentFutureImplementation } from "../../../src/internal/module"; import { assertIgnitionInvariant } from "../../../src/internal/utils/assertions"; import { exampleAccounts } from "../../helpers"; From ac2d2e24fcdf53b4559e28268c228e769e384887 Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 6 Nov 2023 12:19:46 -0500 Subject: [PATCH 1114/1302] Allow sending to AccountRuntimeValue (#623) Support account runtime values in the `to` parameter of the send API. Also add validation for send `to` addresses being addresses. Sharpen the validation so that a string passed as the to address that does not meet the requirements of being an ethereum address fails `buildModule` validation. This required updating the tests. At the same time a sharper address comparison was added to the send from/to test - which is what prompted the addition of the more general address valid address check. Fixes #618 --------- Co-authored-by: John Kane --- .../core/src/ignition-module-serializer.ts | 8 +- .../helpers/build-initialize-message-for.ts | 6 +- .../helpers/future-resolvers.ts | 25 ++++++ .../src/internal/execution/utils/address.ts | 9 +- packages/core/src/internal/module-builder.ts | 48 ++++++++++- packages/core/src/internal/module.ts | 3 +- .../futures/reconcileSendData.ts | 7 +- packages/core/src/types/module-builder.ts | 6 +- packages/core/src/types/module.ts | 6 +- packages/core/src/types/serialization.ts | 6 +- packages/core/test/contractAt.ts | 47 ++++------ packages/core/test/contractAtFromArtifact.ts | 17 ++-- .../core/test/ignition-module-serializer.ts | 77 ++++++++++++++--- packages/core/test/readEventArgument.ts | 4 +- .../futures/reconcileSendData.ts | 21 +++++ packages/core/test/send.ts | 86 +++++++++++++++---- packages/core/test/validations/id-rules.ts | 2 +- 17 files changed, 297 insertions(+), 81 deletions(-) diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index 5e8898cbc9..b55c59636b 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -21,9 +21,11 @@ import { } from "./internal/topological-order"; import { replaceWithinArg } from "./internal/utils/replace-within-arg"; import { + isAccountRuntimeValue, isAddressResolvableFuture, isContractFuture, isFuture, + isModuleParameterRuntimeValue, isRuntimeValue, } from "./type-guards"; import { @@ -319,8 +321,10 @@ export class IgnitionModuleSerializer { ), to: isFuture(future.to) ? this._convertFutureToFutureToken(future.to) - : isRuntimeValue(future.to) + : isModuleParameterRuntimeValue(future.to) ? this._serializeModuleParamterRuntimeValue(future.to) + : isAccountRuntimeValue(future.to) + ? this._serializeAccountRuntimeValue(future.to) : future.to, value: isRuntimeValue(future.value) ? this._serializeModuleParamterRuntimeValue(future.value) @@ -836,6 +840,8 @@ export class IgnitionModuleDeserializer { ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.to ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus + : this._isSerializedAccountRuntimeValue(serializedFuture.to) + ? this._deserializeAccountRuntimeValue(serializedFuture.to) : serializedFuture.to, this._isSerializedModuleParameterRuntimeValue(serializedFuture.value) ? (this._deserializeModuleParameterRuntimeValue( diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 74c6f0dec8..9dc540f642 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -20,6 +20,7 @@ import { resolveFutureFrom, resolveLibraries, resolveReadEventArgumentResult, + resolveSendToAddress, resolveValue, } from "./future-resolvers"; @@ -194,10 +195,11 @@ export async function buildInitializeMessageFor( future, strategy, { - to: resolveAddressLike( + to: resolveSendToAddress( future.to, deploymentState, - deploymentParameters + deploymentParameters, + accounts ), value: resolveValue( future.value, diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts index b63ae092c0..657150c4ba 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts @@ -1,6 +1,7 @@ import { isAddress } from "ethers"; import { + isAccountRuntimeValue, isFuture, isModuleParameterRuntimeValue, } from "../../../../type-guards"; @@ -152,6 +153,30 @@ export function resolveAddressForContractFuture( return findAddressForContractFuture(deploymentState, contract.id); } +/** + * Resolve a SendDataFuture's "to" field to a valid ethereum address. + */ +export function resolveSendToAddress( + to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | AccountRuntimeValue, + deploymentState: DeploymentState, + deploymentParameters: DeploymentParameters, + accounts: string[] +): string { + if (typeof to === "string") { + return to; + } + + if (isAccountRuntimeValue(to)) { + return resolveAccountRuntimeValue(to, accounts); + } + + return resolveAddressLike(to, deploymentState, deploymentParameters); +} + /** * Resolve the given address like to a valid ethereum address. Futures * will be resolved to their result then runtime checked to ensure diff --git a/packages/core/src/internal/execution/utils/address.ts b/packages/core/src/internal/execution/utils/address.ts index e1ad52922d..7ef0c65803 100644 --- a/packages/core/src/internal/execution/utils/address.ts +++ b/packages/core/src/internal/execution/utils/address.ts @@ -1,7 +1,14 @@ -import { getAddress, isAddress } from "ethers"; +import { isAddress as ethersIsAddress, getAddress } from "ethers"; import { assertIgnitionInvariant } from "../../utils/assertions"; +/** + * Is the string a valid ethereum address? + */ +export function isAddress(address: string): boolean { + return ethersIsAddress(address); +} + /** * Returns a normalized and checksumed address for the given address. * diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index ef6b7a6398..611b5fa470 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -48,6 +48,7 @@ import { StaticCallOptions, } from "../types/module-builder"; +import { equalAddresses, isAddress } from "./execution/utils/address"; import { AccountRuntimeValueImplementation, ArtifactContractAtFutureImplementation, @@ -837,7 +838,11 @@ class IgnitionModuleBuilderImplementation< public send( id: string, - to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, + to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | AccountRuntimeValue, value?: bigint | ModuleParameterRuntimeValue, data?: string, options: SendDataOptions = {} @@ -859,6 +864,7 @@ class IgnitionModuleBuilderImplementation< this._assertValidValue(val, this.send); this._assertValidData(data, this.send); this._assertValidFrom(options.from, this.send); + this._assertUniqueToAndFrom(to, options.from, this.send); /* validation end */ const future = new SendDataFutureImplementation( @@ -1105,15 +1111,21 @@ m.${futureConstructor.name}(..., { id: "MyUniqueId"})`, address: | string | AddressResolvableFuture - | ModuleParameterRuntimeValue, + | ModuleParameterRuntimeValue + | AccountRuntimeValue, func: (...[]: any[]) => any ) { + if (typeof address === "string" && !isAddress(address)) { + return this._throwErrorWithStackTrace(`Invalid address given`, func); + } + if ( typeof address !== "string" && !isModuleParameterRuntimeValue(address) && + !isAccountRuntimeValue(address) && !isAddressResolvableFuture(address) ) { - this._throwErrorWithStackTrace(`Invalid address given`, func); + return this._throwErrorWithStackTrace(`Invalid address given`, func); } } @@ -1125,4 +1137,34 @@ m.${futureConstructor.name}(..., { id: "MyUniqueId"})`, this._throwErrorWithStackTrace(`Invalid data given`, func); } } + + private _assertUniqueToAndFrom( + to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | AccountRuntimeValue, + from: string | AccountRuntimeValue | undefined, + func: (...[]: any[]) => any + ) { + if ( + typeof to === "string" && + typeof from === "string" && + equalAddresses(to, from) + ) { + this._throwErrorWithStackTrace( + `The "to" and "from" addresses are the same`, + func + ); + } else if ( + isAccountRuntimeValue(to) && + isAccountRuntimeValue(from) && + to.accountIndex === from.accountIndex + ) { + this._throwErrorWithStackTrace( + `The "to" and "from" addresses are the same`, + func + ); + } + } } diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index 6931cbd105..44c8ec22e8 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -242,7 +242,8 @@ export class SendDataFutureImplementation public readonly to: | string | AddressResolvableFuture - | ModuleParameterRuntimeValue, + | ModuleParameterRuntimeValue + | AccountRuntimeValue, public readonly value: bigint | ModuleParameterRuntimeValue, public readonly data: string | undefined, public readonly from: string | AccountRuntimeValue | undefined diff --git a/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts index bb74949b96..4586ebefd8 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts @@ -1,5 +1,5 @@ import { SendDataFuture } from "../../../types/module"; -import { resolveAddressLike } from "../../execution/future-processor/helpers/future-resolvers"; +import { resolveSendToAddress } from "../../execution/future-processor/helpers/future-resolvers"; import { SendDataExecutionState } from "../../execution/types/execution-state"; import { compare } from "../helpers/compare"; import { reconcileData } from "../helpers/reconcile-data"; @@ -12,10 +12,11 @@ export function reconcileSendData( executionState: SendDataExecutionState, context: ReconciliationContext ): ReconciliationFutureResult { - const resolvedAddress = resolveAddressLike( + const resolvedAddress = resolveSendToAddress( future.to, context.deploymentState, - context.deploymentParameters + context.deploymentParameters, + context.accounts ); let result = compare( diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index 5555459a8d..55c873f6f3 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -206,7 +206,11 @@ export interface IgnitionModuleBuilder { send( id: string, - to: string | AddressResolvableFuture | ModuleParameterRuntimeValue, + to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | AccountRuntimeValue, value?: bigint | ModuleParameterRuntimeValue, data?: string, options?: SendDataOptions diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 9f0a738534..d38d2b3d3f 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -312,7 +312,11 @@ export interface SendDataFuture { id: string; module: IgnitionModule; dependencies: Set; - to: string | AddressResolvableFuture | ModuleParameterRuntimeValue; + to: + | string + | AddressResolvableFuture + | ModuleParameterRuntimeValue + | AccountRuntimeValue; value: bigint | ModuleParameterRuntimeValue; data: string | undefined; from: string | AccountRuntimeValue | undefined; diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 237f22b3ed..87087daff5 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -201,7 +201,11 @@ export interface SerializedReadEventArgumentFuture */ export interface SerializedSendDataFuture extends BaseSerializedFuture { type: FutureType.SEND_DATA; - to: string | FutureToken | SerializedModuleParameterRuntimeValue; + to: + | string + | FutureToken + | SerializedModuleParameterRuntimeValue + | SerializedAccountRuntimeValue; value: SerializedBigInt | SerializedModuleParameterRuntimeValue; data: string | undefined; from: string | SerializedAccountRuntimeValue | undefined; diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 73bf8c81d0..06b9a2497d 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -14,6 +14,8 @@ import { } from "./helpers"; describe("contractAt", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const fakeArtifact: Artifact = { abi: [], contractName: "", @@ -23,7 +25,7 @@ describe("contractAt", () => { it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0xtest"); + const contract1 = m.contractAt("Contract1", exampleAddress); return { contract1 }; }); @@ -40,7 +42,7 @@ describe("contractAt", () => { // Stores the address assert.deepStrictEqual( moduleWithContractFromArtifact.results.contract1.address, - "0xtest" + exampleAddress ); // 1 contract future @@ -53,7 +55,7 @@ describe("contractAt", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractAt("Another", "0xtest", { + const another = m.contractAt("Another", exampleAddress, { after: [example], }); @@ -123,20 +125,12 @@ describe("contractAt", () => { describe("passing id", () => { it("should be able to deploy the same contract twice by passing an id", () => { const moduleWithSameContractTwice = buildModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0x123", - - { id: "first" } - ); - const sameContract2 = m.contractAt( - "SameContract", - "0x123", - - { - id: "second", - } - ); + const sameContract1 = m.contractAt("SameContract", exampleAddress, { + id: "first", + }); + const sameContract2 = m.contractAt("SameContract", exampleAddress, { + id: "second", + }); return { sameContract1, sameContract2 }; }); @@ -156,8 +150,8 @@ describe("contractAt", () => { assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractAt("SameContract", "0x123"); - const sameContract2 = m.contractAt("SameContract", "0x123"); + const sameContract1 = m.contractAt("SameContract", exampleAddress); + const sameContract2 = m.contractAt("SameContract", exampleAddress); return { sameContract1, sameContract2 }; }), @@ -171,14 +165,9 @@ m.contractAt(..., { id: "MyUniqueId"})` assert.throws( () => buildModule("Module1", (m) => { - const sameContract1 = m.contractAt( - "SameContract", - "0x123", - - { - id: "same", - } - ); + const sameContract1 = m.contractAt("SameContract", exampleAddress, { + id: "same", + }); const sameContract2 = m.contractAt( "SameContract", "0x123", @@ -212,7 +201,7 @@ m.contractAt(..., { id: "MyUniqueId"})` it("should not validate an invalid artifact", async () => { const module = buildModule("Module1", (m) => { - const another = m.contractAt("Another", ""); + const another = m.contractAt("Another", exampleAddress); return { another }; }); @@ -223,7 +212,7 @@ m.contractAt(..., { id: "MyUniqueId"})` await validateNamedContractAt( future as any, setupMockArtifactResolver({ - Another: {} as any, + Another: { _kind: "invalid artifact" } as any, }), {}, [] diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 64ff21b70d..6e5c536fe0 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -14,6 +14,9 @@ import { } from "./helpers"; describe("contractAtFromArtifact", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + const fakeArtifact: Artifact = { abi: [], contractName: "", @@ -23,7 +26,7 @@ describe("contractAtFromArtifact", () => { it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", fakeArtifact, "0xtest"); + const contract1 = m.contractAt("Contract1", fakeArtifact, exampleAddress); return { contract1 }; }); @@ -40,7 +43,7 @@ describe("contractAtFromArtifact", () => { // Stores the address assert.deepStrictEqual( moduleWithContractFromArtifact.results.contract1.address, - "0xtest" + exampleAddress ); // 1 contract future @@ -53,7 +56,7 @@ describe("contractAtFromArtifact", () => { it("should be able to pass an after dependency", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contractAt("Another", fakeArtifact, "0xtest", { + const another = m.contractAt("Another", fakeArtifact, exampleAddress, { after: [example], }); @@ -130,13 +133,13 @@ describe("contractAtFromArtifact", () => { const sameContract1 = m.contractAt( "SameContract", fakeArtifact, - "0x123", + exampleAddress, { id: "first" } ); const sameContract2 = m.contractAt( "SameContract", fakeArtifact, - "0x123", + differentAddress, { id: "second", } @@ -163,7 +166,7 @@ describe("contractAtFromArtifact", () => { const sameContract1 = m.contractAt( "SameContract", fakeArtifact, - "0x123" + exampleAddress ); const sameContract2 = m.contractAt( "SameContract", @@ -186,7 +189,7 @@ m.contractAt(..., { id: "MyUniqueId"})` const sameContract1 = m.contractAt( "SameContract", fakeArtifact, - "0x123", + exampleAddress, { id: "same", } diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts index 6a88e6da13..4ba0bfba37 100644 --- a/packages/core/test/ignition-module-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -20,6 +20,9 @@ import { } from "../src/types/module"; describe("stored deployment serializer", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + describe("contract", () => { it("should serialize a contract deployment", () => { const module = buildModule("Module1", (m) => { @@ -121,7 +124,7 @@ describe("stored deployment serializer", () => { describe("contractAt", () => { it("should serialize a contractAt", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0"); + const contract1 = m.contractAt("Contract1", exampleAddress); return { contract1 }; }); @@ -131,7 +134,7 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with a future address", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0"); + const contract1 = m.contractAt("Contract1", exampleAddress); const call = m.staticCall(contract1, "getAddress"); const contract2 = m.contractAt("Contract2", call); @@ -143,8 +146,8 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with dependency", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", "0x0"); - const contract2 = m.contractAt("Contract2", "0x0", { + const contract1 = m.contractAt("Contract1", exampleAddress); + const contract2 = m.contractAt("Contract2", differentAddress, { after: [contract1], }); @@ -165,7 +168,11 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); + const contract1 = m.contractAt( + "Contract1", + fakeArtifact, + exampleAddress + ); return { contract1 }; }); @@ -175,7 +182,11 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with a future address", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); + const contract1 = m.contractAt( + "Contract1", + fakeArtifact, + exampleAddress + ); const call = m.staticCall(contract1, "getAddress"); const contract2 = m.contractAt("Contract2", fakeArtifact, call); @@ -187,10 +198,19 @@ describe("stored deployment serializer", () => { it("should serialize a contractAt with dependency", () => { const module = buildModule("Module1", (m) => { - const contract1 = m.contractAt("Contract1", fakeArtifact, "0x0"); - const contract2 = m.contractAt("Contract2", fakeArtifact, "0x0", { - after: [contract1], - }); + const contract1 = m.contractAt( + "Contract1", + fakeArtifact, + exampleAddress + ); + const contract2 = m.contractAt( + "Contract2", + fakeArtifact, + differentAddress, + { + after: [contract1], + } + ); return { contract1, contract2 }; }); @@ -402,6 +422,43 @@ describe("stored deployment serializer", () => { }); }); + describe("send", () => { + it("should serialize a send", () => { + const module = buildModule("Module1", (m) => { + m.send("test_send", exampleAddress, 12n, "example_data"); + + return {}; + }); + + assertSerializableModuleIn(module); + }); + + it("should serialize a send with dependencies", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + m.send("test_send", contract1, 0n, undefined, { after: [contract2] }); + + return {}; + }); + + assertSerializableModuleIn(module); + }); + + it("should serialize a send where the to is from an account", () => { + const module = buildModule("Module1", (m) => { + const givenAccount = m.getAccount(3); + + m.send("test_send", givenAccount, 12n, "example_data"); + + return {}; + }); + + assertSerializableModuleIn(module); + }); + }); + describe("useModule", () => { it("should serialize a deployment leveraging useModule", () => { const submodule = buildModule("Submodule", (m) => { diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 3d6a7e24bc..0a20503dda 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -9,6 +9,8 @@ import { validateReadEventArgument } from "../src/internal/validation/futures/va import { assertValidationError, setupMockArtifactResolver } from "./helpers"; describe("Read event argument", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + describe("creating modules with it", () => { it("should support reading arguments from all the futures that can emit them", () => { const fakeArtifact: Artifact = { @@ -235,7 +237,7 @@ m.readEventArgument(..., { id: "MyUniqueId"})` assert.throws( () => buildModule("Module1", (m) => { - const send = m.send("id", "test", 42n); + const send = m.send("id", exampleAddress, 42n); m.readEventArgument(send, "SomeEvent", "someArg"); diff --git a/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/core/test/reconciliation/futures/reconcileSendData.ts index 6303f36582..4a304a0a94 100644 --- a/packages/core/test/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/reconciliation/futures/reconcileSendData.ts @@ -99,6 +99,27 @@ describe("Reconciliation - send data", () => { ); }); + it("should reconcile between `to` and an account value", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const givenAccount = m.getAccount(2); + + m.send("test_send", givenAccount, 0n, "example_data"); + + return {}; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState({ + ...exampleSendState, + id: "Module#test_send", + status: ExecutionStatus.STARTED, + to: exampleAccounts[2], + data: "example_data", + }) + ); + }); + it("should find changes to the to address unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { m.send("test_send", differentAddress, 0n, "example_data"); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 599bde1c5b..200ac0c908 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -18,9 +18,12 @@ import { } from "./helpers"; describe("send", () => { + const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + it("should be able to setup a send", () => { const moduleWithASingleContract = buildModule("Module1", (m) => { - m.send("test_send", "0xtest", 0n, "test-data"); + m.send("test_send", exampleAddress, 0n, "test-data"); return {}; }); @@ -77,7 +80,7 @@ describe("send", () => { it("should be able to pass one contract as an after dependency of a send", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - m.send("test_send", "0xtest", 0n, "", { after: [example] }); + m.send("test_send", exampleAddress, 0n, "", { after: [example] }); return { example }; }); @@ -102,7 +105,7 @@ describe("send", () => { it("should be able to pass a value", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - m.send("test_send", "0xtest", 42n, ""); + m.send("test_send", exampleAddress, 42n, ""); return {}; }); @@ -122,7 +125,7 @@ describe("send", () => { it("Should be able to pass a ModuleParameterRuntimeValue as a value option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - m.send("test_send", "0xtest", m.getParameter("value"), ""); + m.send("test_send", exampleAddress, m.getParameter("value"), ""); return {}; }); @@ -145,7 +148,7 @@ describe("send", () => { it("should be able to pass a string as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - m.send("test_send", "0xtest", 0n, "", { from: "0x2" }); + m.send("test_send", exampleAddress, 0n, "", { from: differentAddress }); return {}; }); @@ -160,12 +163,12 @@ describe("send", () => { assert.fail("Not a send data future"); } - assert.equal(sendFuture.from, "0x2"); + assert.equal(sendFuture.from, differentAddress); }); it("Should be able to pass an AccountRuntimeValue as from option", () => { const moduleWithDependentContracts = buildModule("Module1", (m) => { - m.send("test_send", "0xtest", 0n, "", { from: m.getAccount(1) }); + m.send("test_send", exampleAddress, 0n, "", { from: m.getAccount(1) }); return {}; }); @@ -184,6 +187,27 @@ describe("send", () => { assert.equal(sendFuture.from.accountIndex, 1); }); + it("Should be able to pass an AccountRuntimeValue as address", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + m.send("test_send", m.getAccount(1), 0n, ""); + + return {}; + }); + + assert.isDefined(moduleWithDependentContracts); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#test_send" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assertInstanceOf(sendFuture.to, AccountRuntimeValueImplementation); + assert.equal(sendFuture.to.accountIndex, 1); + }); + it("Should be able to pass a module param as address", () => { const module = buildModule("Module", (m) => { const paramWithDefault = m.getParameter("addressWithDefault", "0x000000"); @@ -215,8 +239,8 @@ describe("send", () => { describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwice = buildModule("Module1", (m) => { - m.send("first", "0xtest", 0n, "test"); - m.send("second", "0xtest", 0n, "test"); + m.send("first", exampleAddress, 0n, "test"); + m.send("second", exampleAddress, 0n, "test"); return {}; }); @@ -239,8 +263,8 @@ describe("send", () => { assert.throws( () => buildModule("Module1", (m) => { - m.send("test_send", "0xtest", 0n, "test"); - m.send("test_send", "0xtest", 0n, "test"); + m.send("test_send", exampleAddress, 0n, "test"); + m.send("test_send", exampleAddress, 0n, "test"); return {}; }), @@ -252,8 +276,8 @@ describe("send", () => { assert.throws( () => buildModule("Module1", (m) => { - m.send("first", "0xtest", 0n, "test"); - m.send("first", "0xtest", 0n, "test"); + m.send("first", exampleAddress, 0n, "test"); + m.send("first", exampleAddress, 0n, "test"); return {}; }), 'The future id "first" is already used, please provide a different one.' @@ -268,7 +292,7 @@ describe("send", () => { () => buildModule("Module1", (m) => { const another = m.contract("Another", []); - m.send("id", "test", 42 as any); + m.send("id", exampleAddress, 42 as any); return { another }; }), @@ -281,7 +305,7 @@ describe("send", () => { () => buildModule("Module1", (m) => { const another = m.contract("Another", []); - m.send("id", "test", 0n, 42 as any); + m.send("id", exampleAddress, 0n, 42 as any); return { another }; }), @@ -316,6 +340,30 @@ describe("send", () => { /Invalid address given/ ); }); + + it("should not validate a `to` as a string that is not an address", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + m.send("id", "0xnot-an-address", 0n, ""); + + return {}; + }), + /Invalid address given/ + ); + }); + + it("should not allow the from and to address to be the same", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + m.send("id", m.getAccount(1), 0n, "", { from: m.getAccount(1) }); + + return {}; + }), + /The "to" and "from" addresses are the same/ + ); + }); }); it("should not validate a missing module parameter", async () => { @@ -361,7 +409,7 @@ describe("send", () => { it("should not validate a module parameter of the wrong type for value", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); - m.send("id", "0xasdf", p, ""); + m.send("id", exampleAddress, p, ""); return {}; }); @@ -384,7 +432,7 @@ describe("send", () => { it("should validate a module parameter of the correct type for value", async () => { const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 42n); - m.send("id", "0xasdf", p, ""); + m.send("id", exampleAddress, p, ""); return {}; }); @@ -401,7 +449,7 @@ describe("send", () => { it("should not validate a negative account index", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); - m.send("id", "0xasdf", 0n, "", { from: account }); + m.send("id", exampleAddress, 0n, "", { from: account }); return {}; }); @@ -424,7 +472,7 @@ describe("send", () => { it("should not validate an account index greater than the number of available accounts", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(1); - m.send("id", "0xasdf", 0n, "", { from: account }); + m.send("id", exampleAddress, 0n, "", { from: account }); return {}; }); diff --git a/packages/core/test/validations/id-rules.ts b/packages/core/test/validations/id-rules.ts index ef2a7acfe0..1cf228768a 100644 --- a/packages/core/test/validations/id-rules.ts +++ b/packages/core/test/validations/id-rules.ts @@ -249,7 +249,7 @@ describe("id rules", () => { buildModule("MyModule", (m) => { m.contract("sourceName.sol:MyContract"); m.contract("asd/sourceName.sol:MyContract2"); - m.contractAt("sourceName.sol:MyContractAt", "0x1234"); + m.contractAt("sourceName.sol:MyContractAt", exampleAddress); m.library("sourceName.sol:MyLibrary"); return {}; From 1b79dcd760c1697a8ba196c2d90dc0a4d9c5a61a Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 6 Nov 2023 20:53:03 +0000 Subject: [PATCH 1115/1302] chore: bump version to v0.11.2 Update the packages versions and changelogs for the `0.11.2 - 2023-11-06` release. --- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- package-lock.json | 28 ++++++++++++++-------------- packages/core/CHANGELOG.md | 10 ++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 11 +++++++++++ packages/hardhat-plugin/package.json | 6 +++--- packages/ui/package.json | 4 ++-- 10 files changed, 49 insertions(+), 28 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 15cda97550..e603b185e8 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.11.1", + "version": "0.11.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index ac876b328b..7017ad28a2 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.11.1", + "version": "0.11.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index d02fac96b0..5f9222b9b8 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.11.1", + "version": "0.11.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 62016d388e..b079a8c9fe 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.11.1", + "version": "0.11.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 8520449d11..899606e889 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.11.1", + "version": "0.11.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -40,12 +40,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.11.1", + "version": "0.11.2", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -53,9 +53,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.11.1", + "version": "0.11.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -63,9 +63,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.11.1", + "version": "0.11.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.1", + "@nomicfoundation/hardhat-ignition": "^0.11.2", "@nomicfoundation/hardhat-toolbox": "3.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -21264,7 +21264,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.11.1", + "version": "0.11.2", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21374,11 +21374,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.1", + "version": "0.11.2", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.1", - "@nomicfoundation/ignition-ui": "^0.11.1", + "@nomicfoundation/ignition-core": "^0.11.2", + "@nomicfoundation/ignition-ui": "^0.11.2", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", @@ -21496,10 +21496,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.1", + "version": "0.11.2", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.1", + "@nomicfoundation/ignition-core": "^0.11.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 5df058ad1c..1a76b68e8a 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.2 - 2023-11-06 + +### Added + +- Support account values in _send_ `to` in Module API ([#618](https://github.com/NomicFoundation/hardhat-ignition/issues/618)) + +### Fixed + +- Fix `ContractAt`s being recorded to `deployed_addresses.json` ([#607](https://github.com/NomicFoundation/hardhat-ignition/issues/607)) + ## 0.11.1 - 2023-10-30 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 118ffe4812..a30fb71a8d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.11.1", + "version": "0.11.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index f80c707cb8..10be2a77e4 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.11.2 - 2023-11-06 + +### Added + +- Support account values in _send_ `to` in Module API ([#618](https://github.com/NomicFoundation/hardhat-ignition/issues/618)) +- Validation check for duplicate module ids ([#608](https://github.com/NomicFoundation/hardhat-ignition/issues/608)) + +### Fixed + +- Fix `ContractAt`s being recorded to `deployed_addresses.json` ([#607](https://github.com/NomicFoundation/hardhat-ignition/issues/607)) + ## 0.11.1 - 2023-10-30 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index d360558c67..6d2578ed62 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.1", + "version": "0.11.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -92,8 +92,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.1", - "@nomicfoundation/ignition-ui": "^0.11.1", + "@nomicfoundation/ignition-core": "^0.11.2", + "@nomicfoundation/ignition-ui": "^0.11.2", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index ca7f437526..0b663e81f4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.1", + "version": "0.11.2", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.1", + "@nomicfoundation/ignition-core": "^0.11.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From 806a94b3b037a996c7164376af9a472bc0a71988 Mon Sep 17 00:00:00 2001 From: Zoey Date: Thu, 9 Nov 2023 11:18:59 -0500 Subject: [PATCH 1116/1302] Catch base fee error and rethrow as ignition error (#624) * catch base fee error and rethrow as ignition error * add error to whitelist and add integration test * test: update test description --------- Co-authored-by: John Kane --- packages/core/src/errors-list.ts | 5 ++++ .../src/internal/execution/jsonrpc-client.ts | 4 +++ .../internal/new-execution/jsonrpc-client.ts | 29 +++++++++++++++++++ .../src/utils/shouldBeHardhatPluginError.ts | 6 ++-- 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index 6b81e0889e..d518be2eb1 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -174,6 +174,11 @@ export const ERRORS = { message: "The next nonce for %sender% should be %expectedNonce%, but is %pendingCount%. Please make sure not to send transactions from %sender% while running this deployment and try again.", }, + BASE_FEE_EXCEEDS_GAS_LIMIT: { + number: 406, + message: + "The configured base fee exceeds the block gas limit. Please reduce the configured base fee or increase the block gas limit.", + }, }, RECONCILIATION: { INVALID_EXECUTION_STATUS: { diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 630a904ace..cecf475730 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -311,6 +311,10 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { customErrorReported: false, }; } + + if (error.message.includes("base fee exceeds gas limit")) { + throw new IgnitionError(ERRORS.EXECUTION.BASE_FEE_EXCEEDS_GAS_LIMIT); + } } throw error; diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 4364de6c81..6c05212a35 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -260,6 +260,35 @@ describe("JSON-RPC client", function () { assert.isFalse(result1.customErrorReported); }); + it("Should rethrow an IgnitionError if the error message indicates an incorrectly configured base gas fee versus the node's block gas limit", async function () { + class MockProvider { + public async request(req: { method: string; _: any[] }) { + if (req.method === "eth_call") { + throw new Error("base fee exceeds gas limit"); + } + + assertIgnitionInvariant( + false, + `Unimplemented mock for ${req.method}` + ); + } + } + + const mockClient = new EIP1193JsonRpcClient(new MockProvider()); + + await assert.isRejected( + mockClient.call( + { + data: "0x", + value: 0n, + from: this.accounts[0], + }, + "latest" + ), + /IGN406\: The configured base fee exceeds the block gas limit\. Please reduce the configured base fee or increase the block gas limit\./ + ); + }); + it("Should return customErrorReported true when the server reports a custom error", async function () { const { artifact, address } = await deployContract(this); diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index c6b2cb2f0b..eb427e0929 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -9,9 +9,9 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ const whitelist = [ - 200, 201, 202, 203, 204, 403, 404, 405, 600, 601, 602, 700, 701, 702, 703, - 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, - 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, + 200, 201, 202, 203, 204, 403, 404, 405, 406, 600, 601, 602, 700, 701, 702, + 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { From 5b73211d6f2c44db3f93e63108ef871fe2af71e8 Mon Sep 17 00:00:00 2001 From: Zoey Date: Tue, 5 Dec 2023 11:44:36 -0500 Subject: [PATCH 1117/1302] Added `verify` task (#632) Adds a verify task to `hardhat-plugin`. Also add a `--verify` parameter to the `deploy` task, which triggers a verification after a successful deploy. Only Etherscan is supported. Verification is done on a deployment (so only file based deployments). It reads the deployment state and resolves the `chainid` and the list of futures that were successful contract deployments (so no contractAts). The execution state provides the contructor args/libraries/artifact that were used to deploy and so are exactly what is needed for verification. The `verify` task leverages the `hardhat-verify` plugin. It is pulled in as a peer dependency. The exact same config as is used in `hardhat-verify` is used for HH Ignition verify. Resolves #630 --------- Co-authored-by: John Kane Co-authored-by: Patricio Palladino --- examples/complete/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/package.json | 2 +- package-lock.json | 1429 ++++--- packages/core/.prettierignore | 2 + packages/core/src/errors-list.ts | 22 + packages/core/src/index.ts | 2 + packages/core/src/internal/chain-config.ts | 269 ++ .../file-deployment-loader.ts | 20 + packages/core/src/internal/execution/abi.ts | 22 +- .../views/find-execution-states-by-type.ts | 14 + packages/core/src/types/artifact.ts | 1 + packages/core/src/types/verify.ts | 47 + packages/core/src/verify.ts | 166 + packages/core/test/call.ts | 85 +- packages/core/test/contract.ts | 70 +- packages/core/test/contractAt.ts | 10 +- packages/core/test/contractAtFromArtifact.ts | 10 +- packages/core/test/contractFromArtifact.ts | 24 +- packages/core/test/helpers.ts | 1 + .../core/test/ignition-module-serializer.ts | 31 +- packages/core/test/libraryFromArtifact.ts | 9 +- .../artifacts/LockModule#UUUUU.dbg.json | 4 + .../libraries/artifacts/LockModule#UUUUU.json | 37 + .../artifacts/LockModule#WAAIT.dbg.json | 4 + .../libraries/artifacts/LockModule#WAAIT.json | 29 + .../254cc89254e61cb6a9bf2c74f13055f1.json | 2681 ++++++++++++ .../verify/libraries/deployed_addresses.json | 4 + .../test/mocks/verify/libraries/journal.jsonl | 12 + .../mocks/verify/no-contracts/journal.jsonl | 2 + .../artifacts/LockModule#Lock.dbg.json | 4 + .../success/artifacts/LockModule#Lock.json | 74 + .../a119b7bb4b3dd21e4ae94d5054092087.json | 3792 +++++++++++++++++ .../verify/success/deployed_addresses.json | 3 + .../test/mocks/verify/success/journal.jsonl | 7 + .../unsupported-chain/deployed_addresses.json | 3 + .../verify/unsupported-chain/journal.jsonl | 7 + packages/core/test/readEventArgument.ts | 21 +- packages/core/test/reconciliation/helpers.ts | 1 + .../core/test/reconciliation/reconciler.ts | 5 + packages/core/test/staticCall.ts | 94 +- packages/core/test/types/deployment-loader.ts | 4 +- packages/core/test/useModule.ts | 26 +- packages/core/test/verify.ts | 128 + packages/hardhat-plugin/package.json | 1 + packages/hardhat-plugin/src/index.ts | 127 +- .../src/utils/getApiKeyAndUrls.ts | 22 + .../src/utils/shouldBeHardhatPluginError.ts | 2 +- .../src/utils/verifyEtherscanContract.ts | 37 + .../verify-no-api-key/hardhat.config.js | 15 + .../test/verify/getApiKeyAndUrls.ts | 83 + packages/hardhat-plugin/test/verify/index.ts | 35 + .../test/verify/verifyEtherscanContract.ts | 56 + packages/ui/test/to-mermaid.ts | 1 + 55 files changed, 8571 insertions(+), 992 deletions(-) create mode 100644 packages/core/src/internal/chain-config.ts create mode 100644 packages/core/src/internal/views/find-execution-states-by-type.ts create mode 100644 packages/core/src/types/verify.ts create mode 100644 packages/core/src/verify.ts create mode 100644 packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json create mode 100644 packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json create mode 100644 packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json create mode 100644 packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json create mode 100644 packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json create mode 100644 packages/core/test/mocks/verify/libraries/deployed_addresses.json create mode 100644 packages/core/test/mocks/verify/libraries/journal.jsonl create mode 100644 packages/core/test/mocks/verify/no-contracts/journal.jsonl create mode 100644 packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json create mode 100644 packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json create mode 100644 packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json create mode 100644 packages/core/test/mocks/verify/success/deployed_addresses.json create mode 100644 packages/core/test/mocks/verify/success/journal.jsonl create mode 100644 packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json create mode 100644 packages/core/test/mocks/verify/unsupported-chain/journal.jsonl create mode 100644 packages/core/test/verify.ts create mode 100644 packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts create mode 100644 packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts create mode 100644 packages/hardhat-plugin/test/verify/index.ts create mode 100644 packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts diff --git a/examples/complete/package.json b/examples/complete/package.json index e603b185e8..abebaa6b93 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } diff --git a/examples/ens/package.json b/examples/ens/package.json index 7017ad28a2..91fc213b99 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" }, diff --git a/examples/sample/package.json b/examples/sample/package.json index 5f9222b9b8..d8501dbf74 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index b079a8c9fe..5c28c2daac 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } diff --git a/package-lock.json b/package-lock.json index 899606e889..1589061dd1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "version": "0.11.2", "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } @@ -46,7 +46,7 @@ }, "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } @@ -56,7 +56,7 @@ "version": "0.11.2", "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } @@ -66,7 +66,7 @@ "version": "0.11.2", "devDependencies": { "@nomicfoundation/hardhat-ignition": "^0.11.2", - "@nomicfoundation/hardhat-toolbox": "3.0.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } @@ -99,12 +99,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.13", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", - "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.22.13", + "@babel/highlight": "^7.23.4", "chalk": "^2.4.2" }, "engines": { @@ -183,30 +183,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz", - "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", - "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", + "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-compilation-targets": "^7.22.15", - "@babel/helper-module-transforms": "^7.23.0", - "@babel/helpers": "^7.23.2", - "@babel/parser": "^7.23.0", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.5", + "@babel/parser": "^7.23.5", "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0", + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -231,12 +231,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", + "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.23.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -329,9 +329,9 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", - "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", @@ -381,9 +381,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -399,32 +399,32 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", - "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz", - "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", + "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", "dev": true, "dependencies": { "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.2", - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.23.5", + "@babel/types": "^7.23.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", - "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -507,9 +507,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", - "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -519,9 +519,9 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", - "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -534,9 +534,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", - "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", + "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -549,9 +549,9 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", - "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", + "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" @@ -564,9 +564,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", + "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -589,19 +589,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", + "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/generator": "^7.23.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.0", - "@babel/types": "^7.23.0", + "@babel/parser": "^7.23.5", + "@babel/types": "^7.23.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -610,12 +610,12 @@ } }, "node_modules/@babel/types": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", - "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", + "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, @@ -1537,9 +1537,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", - "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -1593,21 +1593,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", + "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", "dependencies": { "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" + "ethereumjs-util": "^7.1.5" } }, "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { @@ -1659,12 +1659,12 @@ } }, "node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", + "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" } }, "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { @@ -2626,17 +2626,17 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.0.0.tgz", - "integrity": "sha512-JUFJad5lv7jxj926GPgymrWQxxjPYuJNiNjNMzqT+HiuP6Vl3dk5xzG+8sTX96np0ZAluvaMzPsjhHZ5rNuNQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", + "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", "engines": { "node": ">=14" } }, "node_modules/@floating-ui/core": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", - "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.1.tgz", + "integrity": "sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw==", "dev": true, "dependencies": { "@floating-ui/utils": "^0.1.3" @@ -2855,9 +2855,9 @@ "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", - "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3577,9 +3577,9 @@ } }, "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.4.tgz", - "integrity": "sha512-k9qbLoY7qn6C6Y1LI0gk2kyHXil2Tauj4kGzQ8pgxYXIGw8lWn8tuuL72E11CrlKaXRUvOgF0EXrv/msPI2SbA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz", + "integrity": "sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -3649,35 +3649,34 @@ } }, "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-3.0.0.tgz", - "integrity": "sha512-MsteDXd0UagMksqm9KvcFG6gNKYNa3GGNCy73iQ6bEasEgg2v8Qjl6XA5hjs8o5UD5A3153B6W2BIVJ8SxYUtA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", + "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", "dev": true, "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", "@nomicfoundation/hardhat-ethers": "^3.0.0", "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^1.0.0", - "@typechain/ethers-v6": "^0.4.0", - "@typechain/hardhat": "^8.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@typechain/ethers-v6": "^0.5.0", + "@typechain/hardhat": "^9.0.0", "@types/chai": "^4.2.0", "@types/mocha": ">=9.1.0", - "@types/node": ">=12.0.0", + "@types/node": ">=16.0.0", "chai": "^4.2.0", "ethers": "^6.4.0", "hardhat": "^2.11.0", "hardhat-gas-reporter": "^1.0.8", "solidity-coverage": "^0.8.1", "ts-node": ">=8.0.0", - "typechain": "^8.2.0", + "typechain": "^8.3.0", "typescript": ">=4.5.0" } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-1.1.1.tgz", - "integrity": "sha512-9QsTYD7pcZaQFEA3tBb/D/oCStYDiEVDN7Dxeo/4SCyHRSm86APypxxdOMEPlGmXsAvd+p1j/dTODcpxb8aztA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.1.tgz", + "integrity": "sha512-TuJrhW5p9x92wDRiRhNkGQ/wzRmOkfCLkoRg8+IRxyeLigOALbayQEmkNiGWR03vGlxZS4znXhKI7y97JwZ6Og==", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -3698,7 +3697,6 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "peer": true, "dependencies": { "color-convert": "^1.9.0" @@ -3711,7 +3709,6 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "dev": true, "peer": true, "dependencies": { "nofilter": "^3.1.0" @@ -3724,7 +3721,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "peer": true, "dependencies": { "ansi-styles": "^3.2.1", @@ -3739,7 +3735,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "peer": true, "dependencies": { "color-name": "1.1.3" @@ -3749,14 +3744,12 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, "peer": true }, "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "peer": true, "engines": { "node": ">=0.8.0" @@ -3766,7 +3759,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "peer": true, "engines": { "node": ">=4" @@ -3776,7 +3768,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "peer": true, "bin": { "semver": "bin/semver.js" @@ -3786,7 +3777,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "peer": true, "dependencies": { "has-flag": "^3.0.0" @@ -4212,9 +4202,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.0.2.tgz", - "integrity": "sha512-xDvk1pT4vaPU2BOLy0MqHMdYZyntqpaBf8RhBiezlqG9OjY8F50TyctHo8znigYKd+QCFhCmlmXHOL/LoaOl3w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", + "integrity": "sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==", "cpu": [ "arm" ], @@ -4226,9 +4216,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.0.2.tgz", - "integrity": "sha512-lqCglytY3E6raze27DD9VQJWohbwCxzqs9aSHcj5X/8hJpzZfNdbsr4Ja9Hqp6iPyF53+5PtPx0pKRlkSvlHZg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz", + "integrity": "sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==", "cpu": [ "arm64" ], @@ -4240,9 +4230,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.0.2.tgz", - "integrity": "sha512-nkBKItS6E6CCzvRwgiKad+j+1ibmL7SIInj7oqMWmdkCjiSX6VeVZw2mLlRKIUL+JjsBgpATTfo7BiAXc1v0jA==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz", + "integrity": "sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==", "cpu": [ "arm64" ], @@ -4254,9 +4244,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.0.2.tgz", - "integrity": "sha512-vX2C8xvWPIbpEgQht95+dY6BReKAvtDgPDGi0XN0kWJKkm4WdNmq5dnwscv/zxvi+n6jUTBhs6GtpkkWT4q8Gg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz", + "integrity": "sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==", "cpu": [ "x64" ], @@ -4268,9 +4258,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.0.2.tgz", - "integrity": "sha512-DVFIfcHOjgmeHOAqji4xNz2wczt1Bmzy9MwBZKBa83SjBVO/i38VHDR+9ixo8QpBOiEagmNw12DucG+v55tCrg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz", + "integrity": "sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==", "cpu": [ "arm" ], @@ -4282,9 +4272,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.0.2.tgz", - "integrity": "sha512-GCK/a9ItUxPI0V5hQEJjH4JtOJO90GF2Hja7TO+EZ8rmkGvEi8/ZDMhXmcuDpQT7/PWrTT9RvnG8snMd5SrhBQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz", + "integrity": "sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==", "cpu": [ "arm64" ], @@ -4296,9 +4286,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.0.2.tgz", - "integrity": "sha512-cLuBp7rOjIB1R2j/VazjCmHC7liWUur2e9mFflLJBAWCkrZ+X0+QwHLvOQakIwDymungzAKv6W9kHZnTp/Mqrg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz", + "integrity": "sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==", "cpu": [ "arm64" ], @@ -4310,9 +4300,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.0.2.tgz", - "integrity": "sha512-Zqw4iVnJr2naoyQus0yLy7sLtisCQcpdMKUCeXPBjkJtpiflRime/TMojbnl8O3oxUAj92mxr+t7im/RbgA20w==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", + "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", "cpu": [ "x64" ], @@ -4324,9 +4314,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.0.2.tgz", - "integrity": "sha512-jJRU9TyUD/iMqjf8aLAp7XiN3pIj5v6Qcu+cdzBfVTKDD0Fvua4oUoK8eVJ9ZuKBEQKt3WdlcwJXFkpmMLk6kg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz", + "integrity": "sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==", "cpu": [ "x64" ], @@ -4338,9 +4328,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.0.2.tgz", - "integrity": "sha512-ZkS2NixCxHKC4zbOnw64ztEGGDVIYP6nKkGBfOAxEPW71Sji9v8z3yaHNuae/JHPwXA+14oDefnOuVfxl59SmQ==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz", + "integrity": "sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==", "cpu": [ "arm64" ], @@ -4352,9 +4342,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.0.2.tgz", - "integrity": "sha512-3SKjj+tvnZ0oZq2BKB+fI+DqYI83VrRzk7eed8tJkxeZ4zxJZcLSE8YDQLYGq1tZAnAX+H076RHHB4gTZXsQzw==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz", + "integrity": "sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==", "cpu": [ "ia32" ], @@ -4366,9 +4356,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.0.2.tgz", - "integrity": "sha512-MBdJIOxRauKkry7t2q+rTHa3aWjVez2eioWg+etRVS3dE4tChhmt5oqZYr48R6bPmcwEhxQr96gVRfeQrLbqng==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz", + "integrity": "sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==", "cpu": [ "x64" ], @@ -5069,6 +5059,24 @@ "node": "^16.20 || ^18.16 || >=20" } }, + "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/common": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", + "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.1" + } + }, + "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/tx": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", + "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", + "dependencies": { + "@ethereumjs/common": "^2.5.0", + "ethereumjs-util": "^7.1.2" + } + }, "node_modules/@truffle/interface-adapter/node_modules/@types/node": { "version": "12.20.55", "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", @@ -5689,9 +5697,9 @@ "devOptional": true }, "node_modules/@typechain/ethers-v6": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.4.3.tgz", - "integrity": "sha512-TrxBsyb4ryhaY9keP6RzhFCviWYApcLCIRMPyWaKp2cZZrfaM3QBoxXTnw/eO4+DAY3l+8O0brNW0WgeQeOiDA==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", + "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", "dev": true, "peer": true, "dependencies": { @@ -5700,24 +5708,24 @@ }, "peerDependencies": { "ethers": "6.x", - "typechain": "^8.3.1", + "typechain": "^8.3.2", "typescript": ">=4.7.0" } }, "node_modules/@typechain/hardhat": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-8.0.3.tgz", - "integrity": "sha512-MytSmJJn+gs7Mqrpt/gWkTCOpOQ6ZDfRrRT2gtZL0rfGe4QrU4x9ZdW15fFbVM/XTa+5EsKiOMYXhRABibNeng==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", + "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", "dev": true, "peer": true, "dependencies": { "fs-extra": "^9.1.0" }, "peerDependencies": { - "@typechain/ethers-v6": "^0.4.3", + "@typechain/ethers-v6": "^0.5.1", "ethers": "^6.1.0", "hardhat": "^2.9.9", - "typechain": "^8.3.1" + "typechain": "^8.3.2" } }, "node_modules/@typechain/hardhat/node_modules/fs-extra": { @@ -5743,9 +5751,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", - "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -5756,18 +5764,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", - "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", - "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -5775,9 +5783,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.2.tgz", - "integrity": "sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5794,9 +5802,9 @@ } }, "node_modules/@types/bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { "@types/node": "*" } @@ -5813,14 +5821,14 @@ } }, "node_modules/@types/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-yW/qTM4mRBBcsA9Xw9FbcImYtFPY7sgr+G/O5RDYVmxiy9a+pE5FyoFUi8JYCZY5nicj8atrr1pcfPiYpeNGOA==" + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", + "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==" }, "node_modules/@types/chai-as-promised": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.6.tgz", - "integrity": "sha512-cQLhk8fFarRVZAXUQV1xEnZgMoPxqKojBvRkqPCKPQCzEhpbbSKl1Uu75kDng7k5Ln6LQLUmNBjLlFthCgm1NA==", + "version": "7.1.8", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", + "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", "dev": true, "dependencies": { "@types/chai": "*" @@ -5875,45 +5883,45 @@ } }, "node_modules/@types/d3-array": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.8.tgz", - "integrity": "sha512-2xAVyAUgaXHX9fubjcCbGAUOqYfRJN1em1EKR2HfzWBpObZhwfnZKvofTN4TplMqJdFQao61I+NVSai/vnBvDQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", + "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", "dev": true }, "node_modules/@types/d3-axis": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.4.tgz", - "integrity": "sha512-ySnjI/7qm+J602VjcejXcqs1hEuu5UBbGaJGp+Cn/yKVc1iS3JueLVpToGdQsS2sqta7tqA/kG4ore/+LH90UA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-brush": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.4.tgz", - "integrity": "sha512-Kg5uIsdJNMCs5lTqeZFsTKqj9lBvpiFRDkYN3j2CDlPhonNDg9/gXVpv1E/MKh3tEqArryIj9o6RBGE/MQe+6Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-chord": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.4.tgz", - "integrity": "sha512-p4PvN1N+7GL3Y/NI9Ug1TKwowUV6h664kmxL79ctp1HRYCk1mhP0+SXhjRsoWXCdnJfbLLLmpV99rt8dMrHrzg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", "dev": true }, "node_modules/@types/d3-color": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.1.tgz", - "integrity": "sha512-CSAVrHAtM9wfuLJ2tpvvwCU/F22sm7rMHNN+yh9D6O6hyAms3+O0cgMpC1pm6UEUMOntuZC8bMt74PteiDUdCg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", "dev": true }, "node_modules/@types/d3-contour": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.4.tgz", - "integrity": "sha512-B0aeX8Xg3MNUglULxqDvlgY1SVXuN2xtEleYSAY0iMhl/SMVT7snzgAveejjwM3KaWuNXIoXEJ7dmXE8oPq/jA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", "dev": true, "dependencies": { "@types/d3-array": "*", @@ -5921,168 +5929,168 @@ } }, "node_modules/@types/d3-delaunay": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.2.tgz", - "integrity": "sha512-WplUJ/OHU7eITneDqNnzK+2pgR+WDzUHG6XAUVo+oWHPQq74VcgUdw8a4ODweaZzF56OVYK+x9GxCyuq6hSu1A==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "dev": true }, "node_modules/@types/d3-dispatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.4.tgz", - "integrity": "sha512-NApHpGHRNxUy7e2Lfzl/cwOucmn4Xdx6FdmXzAoomo8T81LyGmlBjjko/vP0TVzawlvEFLDq8OCRLulW6DDzKw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", + "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", "dev": true }, "node_modules/@types/d3-drag": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.4.tgz", - "integrity": "sha512-/t53K1erTuUbP7WIX9SE0hlmytpTYRbIthlhbGkBHzCV5vPO++7yrk8OlisWPyIJO5TGowTmqCtGH2tokY5T/g==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-dsv": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.4.tgz", - "integrity": "sha512-YxfUVJ55HxR8oq88136w09mBMPNhgH7PZjteq72onWXWOohGif/cLQnQv8V4A5lEGjXF04LhwSTpmzpY9wyVyA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", "dev": true }, "node_modules/@types/d3-ease": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", - "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", "dev": true }, "node_modules/@types/d3-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.4.tgz", - "integrity": "sha512-RleYajubALkGjrvatxWhlygfvB1KNF0Uzz9guRUeeA+M/2B7l8rxObYdktaX9zU1st04lMCHjZWe4vbl+msH2Q==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", "dev": true, "dependencies": { "@types/d3-dsv": "*" } }, "node_modules/@types/d3-force": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.6.tgz", - "integrity": "sha512-G9wbOvCxkNlLrppoHLZ6oFpbm3z7ibfkXwLD8g5/4Aa7iTEV0Z7TQ0OL8UxAtvdOhCa2VZcSuqn1NQqyCEqmiw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", + "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==", "dev": true }, "node_modules/@types/d3-format": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.2.tgz", - "integrity": "sha512-9oQWvKk2qVBo49FQq8yD/et8Lx0W5Ac2FdGSOUecqOFKqh0wkpyHqf9Qc7A06ftTR+Lz13Pi3jHIQis0aCueOA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", + "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", "dev": true }, "node_modules/@types/d3-geo": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.0.5.tgz", - "integrity": "sha512-ysEEU93Wv9p2UZBxTK3kUP7veHgyhTA0qYtI7bxK5EMXb3JxGv0D4IH54PxprAF26n+uHci24McVmzwIdLgvgQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", "dev": true, "dependencies": { "@types/geojson": "*" } }, "node_modules/@types/d3-hierarchy": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.4.tgz", - "integrity": "sha512-wrvjpRFdmEu6yAqgjGy8MSud9ggxJj+I9XLuztLeSf/E0j0j6RQYtxH2J8U0Cfbgiw9ZDHyhpmaVuWhxscYaAQ==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz", + "integrity": "sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==", "dev": true }, "node_modules/@types/d3-interpolate": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.2.tgz", - "integrity": "sha512-zAbCj9lTqW9J9PlF4FwnvEjXZUy75NQqPm7DMHZXuxCFTpuTrdK2NMYGQekf4hlasL78fCYOLu4EE3/tXElwow==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", "dev": true, "dependencies": { "@types/d3-color": "*" } }, "node_modules/@types/d3-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", - "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", + "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==", "dev": true }, "node_modules/@types/d3-polygon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.0.tgz", - "integrity": "sha512-D49z4DyzTKXM0sGKVqiTDTYr+DHg/uxsiWDAkNrwXYuiZVd9o9wXZIo+YsHkifOiyBkmSWlEngHCQme54/hnHw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", "dev": true }, "node_modules/@types/d3-quadtree": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.3.tgz", - "integrity": "sha512-GDWaR+rGEk4ToLQSGugYnoh9AYYblsg/8kmdpa1KAJMwcdZ0v8rwgnldURxI5UrzxPlCPzF7by/Tjmv+Jn21Dg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", "dev": true }, "node_modules/@types/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-IIE6YTekGczpLYo/HehAy3JGF1ty7+usI97LqraNa8IiDur+L44d0VOjAvFQWJVdZOJHukUJw+ZdZBlgeUsHOQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", "dev": true }, "node_modules/@types/d3-scale": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.5.tgz", - "integrity": "sha512-w/C++3W394MHzcLKO2kdsIn5KKNTOqeQVzyPSGPLzQbkPw/jpeaGtSRlakcKevGgGsjJxGsbqS0fPrVFDbHrDA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", + "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", "dev": true, "dependencies": { "@types/d3-time": "*" } }, "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-dsoJGEIShosKVRBZB0Vo3C8nqSDqVGujJU6tPznsBJxNJNwMF8utmS83nvCBKQYPpjCzaaHcrf66iTRpZosLPw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", + "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", "dev": true }, "node_modules/@types/d3-selection": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.7.tgz", - "integrity": "sha512-qoj2O7KjfqCobmtFOth8FMvjwMVPUAAmn6xiUbLl1ld7vQCPgffvyV5BBcEFfqWdilAUm+3zciU/3P3vZrUMlg==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", + "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", "dev": true }, "node_modules/@types/d3-shape": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.3.tgz", - "integrity": "sha512-cHMdIq+rhF5IVwAV7t61pcEXfEHsEsrbBUPkFGBwTXuxtTAkBBrnrNA8++6OWm3jwVsXoZYQM8NEekg6CPJ3zw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", + "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", "dev": true, "dependencies": { "@types/d3-path": "*" } }, "node_modules/@types/d3-time": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.1.tgz", - "integrity": "sha512-5j/AnefKAhCw4HpITmLDTPlf4vhi8o/dES+zbegfPb7LaGfNyqkLxBR6E+4yvTAgnJLmhe80EXFMzUs38fw4oA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", + "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", "dev": true }, "node_modules/@types/d3-time-format": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.1.tgz", - "integrity": "sha512-Br6EFeu9B1Zrem7KaYbr800xCmEDyq8uE60kEU8rWhC/XpFYX6ocGMZuRJDQfFCq6SyakQxNHFqIfJbFLf4x6Q==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", + "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", "dev": true }, "node_modules/@types/d3-timer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", - "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", "dev": true }, "node_modules/@types/d3-transition": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.5.tgz", - "integrity": "sha512-dcfjP6prFxj3ziFOJrnt4W2P0oXNj/sGxsJXH8286sHtVZ4qWGbjuZj+RRCYx4YZ4C0izpeE8OqXVCtoWEtzYg==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", + "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", "dev": true, "dependencies": { "@types/d3-selection": "*" } }, "node_modules/@types/d3-zoom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.5.tgz", - "integrity": "sha512-mIefdTLtxuWUWTbBupCUXPAXVPmi8/Uwrq41gQpRh0rD25GMU1ku+oTELqNY2NuuiI0F3wXC5e1liBQi7YS7XQ==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", "dev": true, "dependencies": { "@types/d3-interpolate": "*", @@ -6090,9 +6098,9 @@ } }, "node_modules/@types/debug": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.9.tgz", - "integrity": "sha512-8Hz50m2eoS56ldRlepxSBa6PWEVCtzUo/92HgLc2qTMnotJNIm7xP+UZhyWoYsyOdd5dxZ+NZLb24rsKyFs2ow==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { "@types/ms": "*" @@ -6127,9 +6135,9 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.11", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.11.tgz", - "integrity": "sha512-L7A0AINMXQpVwxHJ4jxD6/XjZ4NDufaRlUJHjNIFKYUFBH1SvOW+neaqb0VTRSLW5suSrSu19ObFEFnfNcr+qg==", + "version": "7946.0.13", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz", + "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==", "dev": true }, "node_modules/@types/glob": { @@ -6144,9 +6152,9 @@ } }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.3.tgz", - "integrity": "sha512-Wny3a2UXn5FEA1l7gc6BbpoV5mD1XijZqgkp4TRgDCDL5r3B5ieOFGUX5h3n78Tr1MEG7BfvoM8qeztdvNU0fw==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dev": true, "dependencies": { "@types/react": "*", @@ -6154,14 +6162,14 @@ } }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", - "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" }, "node_modules/@types/json-schema": { - "version": "7.0.13", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", - "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -6185,9 +6193,9 @@ "dev": true }, "node_modules/@types/lodash.flattendeep": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.7.tgz", - "integrity": "sha512-1h6GW/AeZw/Wej6uxrqgmdTDZX1yFS39lRsXYkg+3kWvOWWrlGCI6H7lXxlUHOzxDT4QeYGmgPpQ3BX9XevzOg==", + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.9.tgz", + "integrity": "sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==", "dev": true, "dependencies": { "@types/lodash": "*" @@ -6216,9 +6224,9 @@ "peer": true }, "node_modules/@types/minimist": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.3.tgz", - "integrity": "sha512-ZYFzrvyWUNhaPomn80dsMNgMeXxNWZBdkuG/hWlUvXvbdUH8ZERNBGXnU87McuGcWDsyzX2aChCv/SVN348k3A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/mocha": { @@ -6228,9 +6236,9 @@ "dev": true }, "node_modules/@types/ms": { - "version": "0.7.32", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz", - "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==", + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", "dev": true }, "node_modules/@types/ndjson": { @@ -6249,15 +6257,15 @@ "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" }, "node_modules/@types/normalize-package-data": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", - "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.0.tgz", - "integrity": "sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dependencies": { "@types/node": "*" } @@ -6270,9 +6278,9 @@ "peer": true }, "node_modules/@types/prompts": { - "version": "2.4.6", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.6.tgz", - "integrity": "sha512-hIwnDhvsTV6XwAPo1zNy2MTelR0JmCxklIRsVxwROHLGaf6LfB+sGDkB9n+aqV4gXDz8z5MnlAz4CEC9wQDRsw==", + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz", + "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", "dev": true, "dependencies": { "@types/node": "*", @@ -6280,22 +6288,22 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.8", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.8.tgz", - "integrity": "sha512-kMpQpfZKSCBqltAJwskgePRaYRFukDkm1oItcAbC3gNELR20XIBcN9VRgg4+m8DKsTfkWeA4m4Imp4DDuWy7FQ==", + "version": "15.7.11", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", + "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.8", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", - "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", + "version": "6.9.10", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", + "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", "dev": true, "peer": true }, "node_modules/@types/react": { - "version": "18.2.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.28.tgz", - "integrity": "sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==", + "version": "18.2.42", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz", + "integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -6304,9 +6312,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.13", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.13.tgz", - "integrity": "sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==", + "version": "18.2.17", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", + "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", "dev": true, "dependencies": { "@types/react": "*" @@ -6322,46 +6330,46 @@ } }, "node_modules/@types/responselike": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.1.tgz", - "integrity": "sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/scheduler": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.4.tgz", - "integrity": "sha512-2L9ifAGl7wmXwP4v3pN4p2FLhD0O1qsJpvKmNin5VA8+UvNVb447UDaAEV6UdrkA+m/Xs58U1RFps44x6TFsVQ==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", + "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", "dev": true }, "node_modules/@types/secp256k1": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.4.tgz", - "integrity": "sha512-oN0PFsYxDZnX/qSJ5S5OwaEDTYfekhvaM5vqui2bu1AA39pKofmgL104Q29KiOXizXS2yLjSzc5YdTyMKdcy4A==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dependencies": { "@types/node": "*" } }, "node_modules/@types/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "version": "7.5.6", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", + "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.19", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.19.tgz", - "integrity": "sha512-MWZNGPSchIdDfb5FL+VFi4zHsHbNOTQEgjqFQk7HazXSXwUU9PAX3z9XBqb3AJGYr9YwrtCtaSMsT3brYsN/jQ==", + "version": "10.0.20", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", + "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", - "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", + "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true }, "node_modules/@types/styled-components": { @@ -6376,18 +6384,18 @@ } }, "node_modules/@types/through": { - "version": "0.0.31", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.31.tgz", - "integrity": "sha512-LpKpmb7FGevYgXnBXYs6HWnmiFyVG07Pt1cnbgM1IhEacITTiUaBXXvOR3Y50ksaJWGSfhbEvQFivQEFGCC55w==", + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/trusted-types": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.4.tgz", - "integrity": "sha512-IDaobHimLQhjwsQ/NMwRVfa/yL7L/wriQPMhw1ZJall0KX6E1oxk29XMDeilW5qTIg5aoiqf5Udy8U/51aNoQQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { @@ -6760,23 +6768,29 @@ "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", "dev": true }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/@vitejs/plugin-react": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.1.0.tgz", - "integrity": "sha512-rM0SqazU9iqPUraQ2JlIvReeaxOoRj6n+PzB1C0cBzIbd8qP336nC39/R9yPi3wVcah7E7j/kdU1uCUqMEU4OQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", + "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", "dev": true, "dependencies": { - "@babel/core": "^7.22.20", - "@babel/plugin-transform-react-jsx-self": "^7.22.5", - "@babel/plugin-transform-react-jsx-source": "^7.22.5", - "@types/babel__core": "^7.20.2", + "@babel/core": "^7.23.5", + "@babel/plugin-transform-react-jsx-self": "^7.23.3", + "@babel/plugin-transform-react-jsx-source": "^7.23.3", + "@types/babel__core": "^7.20.5", "react-refresh": "^0.14.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.2.0" + "vite": "^4.2.0 || ^5.0.0" } }, "node_modules/abbrev": { @@ -6842,9 +6856,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", + "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", "devOptional": true, "engines": { "node": ">=0.4.0" @@ -7172,7 +7186,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7229,9 +7242,9 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", - "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", "dev": true, "peer": true, "dependencies": { @@ -7307,9 +7320,9 @@ "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { - "version": "1.6.51", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", - "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", "dev": true, "engines": { "node": ">=0.6" @@ -7499,9 +7512,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -7518,9 +7531,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, "bin": { @@ -7587,9 +7600,9 @@ "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" }, "node_modules/bufferutil": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", - "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", "hasInstallScript": true, "dependencies": { "node-gyp-build": "^4.3.0" @@ -7684,12 +7697,13 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7774,9 +7788,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001547", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001547.tgz", - "integrity": "sha512-W7CrtIModMAxobGhz8iXmDfuJiiKg1WADMO/9x7/CLNin5cpSbuBjooyoIUVB5eyCc36QuTVlkVa1iB2S5+/eA==", + "version": "1.0.30001566", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", + "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", "dev": true, "funding": [ { @@ -8711,9 +8725,9 @@ "dev": true }, "node_modules/cytoscape": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", - "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.27.0.tgz", + "integrity": "sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==", "dev": true, "dependencies": { "heap": "^0.2.6", @@ -9376,7 +9390,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.2.1", "gopd": "^1.0.1", @@ -9613,9 +9626,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.553", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.553.tgz", - "integrity": "sha512-HiRdtyKS2+VhiXvjhMvvxiMC33FJJqTA5EB2YHgFZW6v7HkK4Q9Ahv2V7O2ZPgAjw+MyCJVMQvigj13H8t+wvA==", + "version": "1.4.603", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz", + "integrity": "sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==", "dev": true }, "node_modules/elkjs": { @@ -9717,26 +9730,26 @@ } }, "node_modules/es-abstract": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", - "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.1", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -9746,7 +9759,7 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "regexp.prototype.flags": "^1.5.1", @@ -9760,7 +9773,7 @@ "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -9770,26 +9783,26 @@ } }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -11296,9 +11309,9 @@ } }, "node_modules/ethers": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.8.0.tgz", - "integrity": "sha512-zrFbmQRlraM+cU5mE4CZTLBurZTs2gdp2ld0nG/f3ecBK+x6lZ69KSxBqZ4NjclxwfTxl5LeNufcBbMsTdY53Q==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.0.tgz", + "integrity": "sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==", "funding": [ { "type": "individual", @@ -11608,9 +11621,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -11656,9 +11669,9 @@ } }, "node_modules/file-type": { - "version": "18.5.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.5.0.tgz", - "integrity": "sha512-yvpl5U868+V6PqXHMmsESpg6unQ5GfnPssl4dxdJudBrr9qy7Fddt7EVX1VLlddFfe8Gj9N7goCZH22FXuSQXQ==", + "version": "18.7.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz", + "integrity": "sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==", "dev": true, "dependencies": { "readable-web-to-node-stream": "^3.0.2", @@ -11763,9 +11776,9 @@ } }, "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { "flatted": "^3.2.9", @@ -11773,7 +11786,7 @@ "rimraf": "^3.0.2" }, "engines": { - "node": ">=12.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/flatted": { @@ -12003,14 +12016,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12311,9 +12324,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -12429,9 +12442,9 @@ } }, "node_modules/hardhat": { - "version": "2.18.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.18.1.tgz", - "integrity": "sha512-b55rW7Ka+fvJeg6oWuBTXoYQEUurevCCankjGNTwczwD3GnkhV9GEei7KUT+9IKmWx3lC+zyxlFxeDbg0gUoHw==", + "version": "2.19.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.1.tgz", + "integrity": "sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -12831,6 +12844,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -12853,12 +12867,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12971,6 +12984,17 @@ "node": ">=8" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -13150,9 +13174,9 @@ } }, "node_modules/http2-wrapper": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", - "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" @@ -13330,13 +13354,13 @@ "peer": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -13493,11 +13517,11 @@ } }, "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -13846,9 +13870,9 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -14349,7 +14373,6 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "dev": true, "peer": true }, "node_modules/lodash.flattendeep": { @@ -14378,8 +14401,7 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" }, "node_modules/log-symbols": { "version": "4.1.0", @@ -15448,9 +15470,9 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nise": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", - "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", + "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -15521,9 +15543,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.1.tgz", - "integrity": "sha512-24vnklJmyRS8ViBNI8KbtK/r/DmXQMRiOMXTNz2nrTnAYUwjmEEbnnpB/+kt+yWRv73bPsSPRFddrcIbAxSiMQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", + "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -15543,9 +15565,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/nofilter": { @@ -15894,9 +15916,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -15911,13 +15933,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -16475,9 +16497,9 @@ } }, "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -16494,7 +16516,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -16509,9 +16531,9 @@ "dev": true }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -16577,9 +16599,9 @@ } }, "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", + "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", "dev": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" @@ -16696,9 +16718,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -16905,9 +16927,9 @@ } }, "node_modules/react-tooltip": { - "version": "5.21.5", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.21.5.tgz", - "integrity": "sha512-ey70qf6pBGi4U6xpyNlZAHobAhlo2dfxmImR2Bzd/DbLTsAYWz3TEaK+RMFuUZMq6hSPRbUHQSkP2rHBq4uFVg==", + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.25.0.tgz", + "integrity": "sha512-/eGhmlwbHlJrVoUe75fb58rJfAy9aZnTvQAK9ZUPM0n9mmBGpEk13vDPiQVCeUuax+fBej+7JPsUXlhzaySc7w==", "dev": true, "dependencies": { "@floating-ui/dom": "^1.0.0", @@ -17371,9 +17393,9 @@ "dev": true }, "node_modules/rollup": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.0.2.tgz", - "integrity": "sha512-MCScu4usMPCeVFaiLcgMDaBQeYi1z6vpWxz0r0hq0Hv77Y2YuOTZldkuNJ54BdYBH3e+nkrk6j0Rre/NLDBYzg==", + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.6.1.tgz", + "integrity": "sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==", "dev": true, "peer": true, "bin": { @@ -17384,18 +17406,18 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.0.2", - "@rollup/rollup-android-arm64": "4.0.2", - "@rollup/rollup-darwin-arm64": "4.0.2", - "@rollup/rollup-darwin-x64": "4.0.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.0.2", - "@rollup/rollup-linux-arm64-gnu": "4.0.2", - "@rollup/rollup-linux-arm64-musl": "4.0.2", - "@rollup/rollup-linux-x64-gnu": "4.0.2", - "@rollup/rollup-linux-x64-musl": "4.0.2", - "@rollup/rollup-win32-arm64-msvc": "4.0.2", - "@rollup/rollup-win32-ia32-msvc": "4.0.2", - "@rollup/rollup-win32-x64-msvc": "4.0.2", + "@rollup/rollup-android-arm-eabi": "4.6.1", + "@rollup/rollup-android-arm64": "4.6.1", + "@rollup/rollup-darwin-arm64": "4.6.1", + "@rollup/rollup-darwin-x64": "4.6.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.6.1", + "@rollup/rollup-linux-arm64-gnu": "4.6.1", + "@rollup/rollup-linux-arm64-musl": "4.6.1", + "@rollup/rollup-linux-x64-gnu": "4.6.1", + "@rollup/rollup-linux-x64-musl": "4.6.1", + "@rollup/rollup-win32-arm64-msvc": "4.6.1", + "@rollup/rollup-win32-ia32-msvc": "4.6.1", + "@rollup/rollup-win32-x64-msvc": "4.6.1", "fsevents": "~2.3.2" } }, @@ -17842,6 +17864,20 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-function-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", @@ -18020,6 +18056,7 @@ "version": "14.0.2", "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", + "deprecated": "16.1.1", "dev": true, "dependencies": { "@sinonjs/commons": "^2.0.0", @@ -18052,7 +18089,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -18181,9 +18217,9 @@ } }, "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.1.tgz", - "integrity": "sha512-PdhRFNhbTtu3x8Axm0uYpqOy/lODYQK+MlYSgqIsq2L8SFYEHJPHNUiOTAJbDGzNjjr1/n9AcIayxafR/fWmYw==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", + "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", "dev": true, "peer": true, "dependencies": { @@ -18325,9 +18361,9 @@ } }, "node_modules/solidity-coverage/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "peer": true, "engines": { @@ -18641,9 +18677,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -19155,13 +19191,13 @@ } }, "node_modules/synckit": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", - "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", + "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", "dev": true, "dependencies": { - "@pkgr/utils": "^2.3.1", - "tslib": "^2.5.0" + "@pkgr/utils": "^2.4.2", + "tslib": "^2.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" @@ -19180,7 +19216,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -19232,7 +19267,6 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -19247,8 +19281,7 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/tapable": { "version": "2.2.1", @@ -19618,9 +19651,9 @@ } }, "node_modules/ts-node/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "devOptional": true, "bin": { "acorn": "bin/acorn" @@ -19772,9 +19805,9 @@ } }, "node_modules/typechain": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.1.tgz", - "integrity": "sha512-fA7clol2IP/56yq6vkMTR+4URF1nGjV82Wx6Rf09EsqD4tkzMAvEaqYxVFCavJm/1xaRga/oD55K+4FtuXwQOQ==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", "dev": true, "peer": true, "dependencies": { @@ -20053,9 +20086,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.26.3.tgz", - "integrity": "sha512-H7n2zmKEWgOllKkIUkLvFmsJQj062lSm3uA4EYApG8gLuiOM0/go9bIoC3HVaSnfg4xunowDE2i9p8drkXuvDw==", + "version": "5.28.2", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", + "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -20079,9 +20112,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { "node": ">= 10.0.0" } @@ -20266,9 +20299,9 @@ } }, "node_modules/vite": { - "version": "4.4.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz", - "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", + "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -20440,27 +20473,27 @@ "dev": true }, "node_modules/web3": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.2.tgz", - "integrity": "sha512-DAtZ3a3ruPziE80uZ3Ob0YDZxt6Vk2un/F5BcBrxO70owJ9Z1Y2+loZmbh1MoAmoLGjA/SUSHeUtid3fYmBaog==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.3.tgz", + "integrity": "sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==", "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.10.2", - "web3-core": "1.10.2", - "web3-eth": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-shh": "1.10.2", - "web3-utils": "1.10.2" + "web3-bzz": "1.10.3", + "web3-core": "1.10.3", + "web3-eth": "1.10.3", + "web3-eth-personal": "1.10.3", + "web3-net": "1.10.3", + "web3-shh": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.2.tgz", - "integrity": "sha512-vLOfDCj6198Qc7esDrCKeFA/M3ZLbowsaHQ0hIL4NmIHoq7lU8aSRTa5AI+JBh8cKN1gVryJsuW2ZCc5bM4I4Q==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.3.tgz", + "integrity": "sha512-XDIRsTwekdBXtFytMpHBuun4cK4x0ZMIDXSoo1UVYp+oMyZj07c7gf7tNQY5qZ/sN+CJIas4ilhN25VJcjSijQ==", "hasInstallScript": true, "dependencies": { "@types/node": "^12.12.6", @@ -20477,53 +20510,53 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-core": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.2.tgz", - "integrity": "sha512-qTn2UmtE8tvwMRsC5pXVdHxrQ4uZ6jiLgF5DRUVtdi7dPUmX18Dp9uxKfIfhGcA011EAn8P6+X7r3pvi2YRxBw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.3.tgz", + "integrity": "sha512-Vbk0/vUNZxJlz3RFjAhNNt7qTpX8yE3dn3uFxfX5OHbuon5u65YEOd3civ/aQNW745N0vGUlHFNxxmn+sG9DIw==", "dependencies": { "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-requestmanager": "1.10.2", - "web3-utils": "1.10.2" + "web3-core-helpers": "1.10.3", + "web3-core-method": "1.10.3", + "web3-core-requestmanager": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.2.tgz", - "integrity": "sha512-1JfaNtox6/ZYJHNoI+QVc2ObgwEPeGF+YdxHZQ7aF5605BmlwM1Bk3A8xv6mg64jIRvEq1xX6k9oG6x7p1WgXQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.3.tgz", + "integrity": "sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==", "dependencies": { - "web3-eth-iban": "1.10.2", - "web3-utils": "1.10.2" + "web3-eth-iban": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.2.tgz", - "integrity": "sha512-gG6ES+LOuo01MJHML4gnEt702M8lcPGMYZoX8UjZzmEebGrPYOY9XccpCrsFgCeKgQzM12SVnlwwpMod1+lcLg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.3.tgz", + "integrity": "sha512-VZ/Dmml4NBmb0ep5PTSg9oqKoBtG0/YoMPei/bq/tUdlhB2dMB79sbeJPwx592uaV0Vpk7VltrrrBv5hTM1y4Q==", "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-utils": "1.10.2" + "web3-core-helpers": "1.10.3", + "web3-core-promievent": "1.10.3", + "web3-core-subscriptions": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.2.tgz", - "integrity": "sha512-Qkkb1dCDOU8dZeORkcwJBQRAX+mdsjx8LqFBB+P4W9QgwMqyJ6LXda+y1XgyeEVeKEmY1RCeTq9Y94q1v62Sfw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.3.tgz", + "integrity": "sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -20532,27 +20565,27 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.2.tgz", - "integrity": "sha512-nlLeNJUu6fR+ZbJr2k9Du/nN3VWwB4AJPY4r6nxUODAmykgJq57T21cLP/BEk6mbiFQYGE9TrrPhh4qWxQEtAw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.3.tgz", + "integrity": "sha512-VT9sKJfgM2yBOIxOXeXiDuFMP4pxzF6FT+y8KTLqhDFHkbG3XRe42Vm97mB/IvLQCJOmokEjl3ps8yP1kbggyw==", "dependencies": { "util": "^0.12.5", - "web3-core-helpers": "1.10.2", - "web3-providers-http": "1.10.2", - "web3-providers-ipc": "1.10.2", - "web3-providers-ws": "1.10.2" + "web3-core-helpers": "1.10.3", + "web3-providers-http": "1.10.3", + "web3-providers-ipc": "1.10.3", + "web3-providers-ws": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.2.tgz", - "integrity": "sha512-MiWcKjz4tco793EPPPLc/YOJmYUV3zAfxeQH/UVTfBejMfnNvmfwKa2SBKfPIvKQHz/xI5bV2TF15uvJEucU7w==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.3.tgz", + "integrity": "sha512-KW0Mc8sgn70WadZu7RjQ4H5sNDJ5Lx8JMI3BWos+f2rW0foegOCyWhRu33W1s6ntXnqeBUw5rRCXZRlA3z+HNA==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2" + "web3-core-helpers": "1.10.3" }, "engines": { "node": ">=8.0.0" @@ -20572,54 +20605,54 @@ } }, "node_modules/web3-eth": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.2.tgz", - "integrity": "sha512-s38rhrntyhGShmXC4R/aQtfkpcmev9c7iZwgb9CDIBFo7K8nrEJvqIOyajeZTxnDIiGzTJmrHxiKSadii5qTRg==", - "dependencies": { - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-accounts": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-eth-ens": "1.10.2", - "web3-eth-iban": "1.10.2", - "web3-eth-personal": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.3.tgz", + "integrity": "sha512-Uk1U2qGiif2mIG8iKu23/EQJ2ksB1BQXy3wF3RvFuyxt8Ft9OEpmGlO7wOtAyJdoKzD5vcul19bJpPcWSAYZhA==", + "dependencies": { + "web3-core": "1.10.3", + "web3-core-helpers": "1.10.3", + "web3-core-method": "1.10.3", + "web3-core-subscriptions": "1.10.3", + "web3-eth-abi": "1.10.3", + "web3-eth-accounts": "1.10.3", + "web3-eth-contract": "1.10.3", + "web3-eth-ens": "1.10.3", + "web3-eth-iban": "1.10.3", + "web3-eth-personal": "1.10.3", + "web3-net": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.2.tgz", - "integrity": "sha512-pY4fQUio7W7ZRSLf+vsYkaxJqaT/jHcALZjIxy+uBQaYAJ3t6zpQqMZkJB3Dw7HUODRJ1yI0NPEFGTnkYf/17A==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz", + "integrity": "sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ==", "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.2" + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.2.tgz", - "integrity": "sha512-6/HhCBYAXN/f553/SyxS9gY62NbLgpD1zJpENcvRTDpJN3Znvli1cmpl5Q3ZIUJkvHnG//48EWfWh0cbb3fbKQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.3.tgz", + "integrity": "sha512-8MipGgwusDVgn7NwKOmpeo3gxzzd+SmwcWeBdpXknuyDiZSQy9tXe+E9LeFGrmys/8mLLYP79n3jSbiTyv+6pQ==", "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", + "@ethereumjs/common": "2.6.5", + "@ethereumjs/tx": "3.5.2", "@ethereumjs/util": "^8.1.0", "eth-lib": "0.2.8", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" + "web3-core": "1.10.3", + "web3-core-helpers": "1.10.3", + "web3-core-method": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" @@ -20653,64 +20686,64 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.2.tgz", - "integrity": "sha512-CZLKPQRmupP/+OZ5A/CBwWWkBiz5B/foOpARz0upMh1yjb0dEud4YzRW2gJaeNu0eGxDLsWVaXhUimJVGYprQw==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.3.tgz", + "integrity": "sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==", "dependencies": { "@types/bn.js": "^5.1.1", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-utils": "1.10.2" + "web3-core": "1.10.3", + "web3-core-helpers": "1.10.3", + "web3-core-method": "1.10.3", + "web3-core-promievent": "1.10.3", + "web3-core-subscriptions": "1.10.3", + "web3-eth-abi": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.2.tgz", - "integrity": "sha512-kTQ42UdNHy4BQJHgWe97bHNMkc3zCMBKKY7t636XOMxdI/lkRdIjdE5nQzt97VjQvSVasgIWYKRAtd8aRaiZiQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.3.tgz", + "integrity": "sha512-hR+odRDXGqKemw1GFniKBEXpjYwLgttTES+bc7BfTeoUyUZXbyDHe5ifC+h+vpzxh4oS0TnfcIoarK0Z9tFSiQ==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-promievent": "1.10.2", - "web3-eth-abi": "1.10.2", - "web3-eth-contract": "1.10.2", - "web3-utils": "1.10.2" + "web3-core": "1.10.3", + "web3-core-helpers": "1.10.3", + "web3-core-promievent": "1.10.3", + "web3-eth-abi": "1.10.3", + "web3-eth-contract": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.2.tgz", - "integrity": "sha512-y8+Ii2XXdyHQMFNL2NWpBnXe+TVJ4ryvPlzNhObRRnIo4O4nLIXS010olLDMayozDzoUlmzCmBZJYc9Eev1g7A==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.3.tgz", + "integrity": "sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==", "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.10.2" + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-personal": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.2.tgz", - "integrity": "sha512-+vEbJsPUJc5J683y0c2aN645vXC+gPVlFVCQu4IjPvXzJrAtUfz26+IZ6AUOth4fDJPT0f1uSLS5W2yrUdw9BQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.3.tgz", + "integrity": "sha512-avrQ6yWdADIvuNQcFZXmGLCEzulQa76hUOuVywN7O3cklB4nFc/Gp3yTvD3bOAaE7DhjLQfhUTCzXL7WMxVTsw==", "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.10.2", - "web3-core-helpers": "1.10.2", - "web3-core-method": "1.10.2", - "web3-net": "1.10.2", - "web3-utils": "1.10.2" + "web3-core": "1.10.3", + "web3-core-helpers": "1.10.3", + "web3-core-method": "1.10.3", + "web3-net": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" @@ -20722,51 +20755,51 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-net": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.2.tgz", - "integrity": "sha512-w9i1t2z7dItagfskhaCKwpp6W3ylUR88gs68u820y5f8yfK5EbPmHc6c2lD8X9ZrTnmDoeOpIRCN/RFPtZCp+g==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.3.tgz", + "integrity": "sha512-IoSr33235qVoI1vtKssPUigJU9Fc/Ph0T9CgRi15sx+itysmvtlmXMNoyd6Xrgm9LuM4CIhxz7yDzH93B79IFg==", "dependencies": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-utils": "1.10.2" + "web3-core": "1.10.3", + "web3-core-method": "1.10.3", + "web3-utils": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.2.tgz", - "integrity": "sha512-G8abKtpkyKGpRVKvfjIF3I4O/epHP7mxXWN8mNMQLkQj1cjMFiZBZ13f+qI77lNJN7QOf6+LtNdKrhsTGU72TA==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.3.tgz", + "integrity": "sha512-6dAgsHR3MxJ0Qyu3QLFlQEelTapVfWNTu5F45FYh8t7Y03T1/o+YAkVxsbY5AdmD+y5bXG/XPJ4q8tjL6MgZHw==", "dependencies": { "abortcontroller-polyfill": "^1.7.5", "cross-fetch": "^4.0.0", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.2" + "web3-core-helpers": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.2.tgz", - "integrity": "sha512-lWbn6c+SgvhLymU8u4Ea/WOVC0Gqs7OJUvauejWz+iLycxeF0xFNyXnHVAi42ZJDPVI3vnfZotafoxcNNL7Sug==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.3.tgz", + "integrity": "sha512-vP5WIGT8FLnGRfswTxNs9rMfS1vCbMezj/zHbBe/zB9GauBRTYVrUo2H/hVrhLg8Ut7AbsKZ+tCJ4mAwpKi2hA==", "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.10.2" + "web3-core-helpers": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.2.tgz", - "integrity": "sha512-3nYSiP6grI5GvpkSoehctSywfCTodU21VY8bUtXyFHK/IVfDooNtMpd5lVIMvXVAlaxwwrCfjebokaJtKH2Iag==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.3.tgz", + "integrity": "sha512-/filBXRl48INxsh6AuCcsy4v5ndnTZ/p6bl67kmO9aK1wffv7CT++DrtclDtVMeDGCgB3van+hEf9xTAVXur7Q==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.2", + "web3-core-helpers": "1.10.3", "websocket": "^1.0.32" }, "engines": { @@ -20774,24 +20807,24 @@ } }, "node_modules/web3-shh": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.2.tgz", - "integrity": "sha512-UP0Kc3pHv9uULFu0+LOVfPwKBSJ6B+sJ5KflF7NyBk6TvNRxlpF3hUhuaVDCjjB/dDUR6T0EQeg25FA2uzJbag==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.3.tgz", + "integrity": "sha512-cAZ60CPvs9azdwMSQ/PSUdyV4PEtaW5edAZhu3rCXf6XxQRliBboic+AvwUvB6j3eswY50VGa5FygfVmJ1JVng==", "hasInstallScript": true, "dependencies": { - "web3-core": "1.10.2", - "web3-core-method": "1.10.2", - "web3-core-subscriptions": "1.10.2", - "web3-net": "1.10.2" + "web3-core": "1.10.3", + "web3-core-method": "1.10.3", + "web3-core-subscriptions": "1.10.3", + "web3-net": "1.10.3" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.2.tgz", - "integrity": "sha512-TdApdzdse5YR+5GCX/b/vQnhhbj1KSAtfrDtRW7YS0kcWp1gkJsN62gw6GzCaNTeXookB7UrLtmDUuMv65qgow==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", + "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", "dependencies": { "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", @@ -20945,12 +20978,12 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", - "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0" @@ -21352,9 +21385,9 @@ } }, "packages/core/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -21425,6 +21458,7 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-verify": "^2.0.1", "hardhat": "^2.18.0" } }, @@ -21474,9 +21508,9 @@ } }, "packages/hardhat-plugin/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -21528,9 +21562,9 @@ } }, "packages/ui/node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -21551,12 +21585,12 @@ } }, "packages/ui/node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -21564,6 +21598,12 @@ "node": ">=10.10.0" } }, + "packages/ui/node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", @@ -21700,9 +21740,9 @@ } }, "packages/ui/node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -21734,18 +21774,19 @@ "dev": true }, "packages/ui/node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -21885,9 +21926,9 @@ } }, "packages/ui/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" diff --git a/packages/core/.prettierignore b/packages/core/.prettierignore index c7bbcc3481..494507c078 100644 --- a/packages/core/.prettierignore +++ b/packages/core/.prettierignore @@ -5,3 +5,5 @@ /temp /test-integrations/fixture-projects/*/artifacts /test-integrations/fixture-projects/*/cache +/test/mocks/verify/*/artifacts +/test/mocks/verify/*/build-info diff --git a/packages/core/src/errors-list.ts b/packages/core/src/errors-list.ts index d518be2eb1..0d00a48a68 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/errors-list.ts @@ -73,6 +73,11 @@ export const ERROR_RANGES: { max: 999, title: "Deploy errors", }, + VERIFY: { + min: 1000, + max: 1099, + title: "Verify errors", + }, }; /** @@ -345,6 +350,23 @@ export const ERRORS = { message: `The deployment's chain cannot be changed between runs. The deployment was previously run against the chain %previousChainId%, but the current network is the chain %currentChainId%.`, }, }, + VERIFY: { + UNINITIALIZED_DEPLOYMENT: { + number: 1000, + message: + "Cannot verify contracts for nonexistant deployment at %deploymentDir%", + }, + NO_CONTRACTS_DEPLOYED: { + number: 1001, + message: + "Cannot verify deployment %deploymentDir% as no contracts were deployed", + }, + UNSUPPORTED_CHAIN: { + number: 1002, + message: + "Verification not natively supported for chainId %chainId%. Please use a custom chain configuration to add support.", + }, + }, }; /** diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 820c4575f7..4d260e19f4 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -15,4 +15,6 @@ export * from "./types/module-builder"; export * from "./types/provider"; export * from "./types/serialization"; export * from "./types/status"; +export * from "./types/verify"; +export { getVerificationInformation } from "./verify"; export { wipe } from "./wipe"; diff --git a/packages/core/src/internal/chain-config.ts b/packages/core/src/internal/chain-config.ts new file mode 100644 index 0000000000..9149c7c5a3 --- /dev/null +++ b/packages/core/src/internal/chain-config.ts @@ -0,0 +1,269 @@ +import type { ChainConfig } from "../types/verify"; + +// See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-155.md#list-of-chain-ids +export const builtinChains: ChainConfig[] = [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }, + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }, + { + network: "optimisticEthereum", + chainId: 10, + urls: { + apiURL: "https://api-optimistic.etherscan.io/api", + browserURL: "https://optimistic.etherscan.io/", + }, + }, + { + network: "bsc", + chainId: 56, + urls: { + apiURL: "https://api.bscscan.com/api", + browserURL: "https://bscscan.com", + }, + }, + { + network: "sokol", + chainId: 77, + urls: { + apiURL: "https://blockscout.com/poa/sokol/api", + browserURL: "https://blockscout.com/poa/sokol", + }, + }, + { + network: "bscTestnet", + chainId: 97, + urls: { + apiURL: "https://api-testnet.bscscan.com/api", + browserURL: "https://testnet.bscscan.com", + }, + }, + { + network: "xdai", + chainId: 100, + urls: { + apiURL: "https://api.gnosisscan.io/api", + browserURL: "https://gnosisscan.io", + }, + }, + { + network: "gnosis", + chainId: 100, + urls: { + apiURL: "https://api.gnosisscan.io/api", + browserURL: "https://gnosisscan.io", + }, + }, + { + network: "heco", + chainId: 128, + urls: { + apiURL: "https://api.hecoinfo.com/api", + browserURL: "https://hecoinfo.com", + }, + }, + { + network: "polygon", + chainId: 137, + urls: { + apiURL: "https://api.polygonscan.com/api", + browserURL: "https://polygonscan.com", + }, + }, + { + network: "opera", + chainId: 250, + urls: { + apiURL: "https://api.ftmscan.com/api", + browserURL: "https://ftmscan.com", + }, + }, + { + network: "hecoTestnet", + chainId: 256, + urls: { + apiURL: "https://api-testnet.hecoinfo.com/api", + browserURL: "https://testnet.hecoinfo.com", + }, + }, + { + network: "optimisticGoerli", + chainId: 420, + urls: { + apiURL: "https://api-goerli-optimism.etherscan.io/api", + browserURL: "https://goerli-optimism.etherscan.io/", + }, + }, + { + network: "polygonZkEVM", + chainId: 1101, + urls: { + apiURL: "https://api-zkevm.polygonscan.com/api", + browserURL: "https://zkevm.polygonscan.com", + }, + }, + { + network: "moonbeam", + chainId: 1284, + urls: { + apiURL: "https://api-moonbeam.moonscan.io/api", + browserURL: "https://moonbeam.moonscan.io", + }, + }, + { + network: "moonriver", + chainId: 1285, + urls: { + apiURL: "https://api-moonriver.moonscan.io/api", + browserURL: "https://moonriver.moonscan.io", + }, + }, + { + network: "moonbaseAlpha", + chainId: 1287, + urls: { + apiURL: "https://api-moonbase.moonscan.io/api", + browserURL: "https://moonbase.moonscan.io/", + }, + }, + { + network: "polygonZkEVMTestnet", + chainId: 1442, + urls: { + apiURL: "https://api-testnet-zkevm.polygonscan.com/api", + browserURL: "https://testnet-zkevm.polygonscan.com", + }, + }, + { + network: "ftmTestnet", + chainId: 4002, + urls: { + apiURL: "https://api-testnet.ftmscan.com/api", + browserURL: "https://testnet.ftmscan.com", + }, + }, + { + network: "base", + chainId: 8453, + urls: { + apiURL: "https://api.basescan.org/api", + browserURL: "https://basescan.org/", + }, + }, + { + network: "chiado", + chainId: 10200, + urls: { + apiURL: "https://blockscout.chiadochain.net/api", + browserURL: "https://blockscout.chiadochain.net", + }, + }, + { + network: "arbitrumOne", + chainId: 42161, + urls: { + apiURL: "https://api.arbiscan.io/api", + browserURL: "https://arbiscan.io/", + }, + }, + { + network: "avalancheFujiTestnet", + chainId: 43113, + urls: { + apiURL: "https://api-testnet.snowtrace.io/api", + browserURL: "https://testnet.snowtrace.io/", + }, + }, + { + network: "avalanche", + chainId: 43114, + urls: { + apiURL: "https://api.snowtrace.io/api", + browserURL: "https://snowtrace.io/", + }, + }, + { + network: "polygonMumbai", + chainId: 80001, + urls: { + apiURL: "https://api-testnet.polygonscan.com/api", + browserURL: "https://mumbai.polygonscan.com/", + }, + }, + { + network: "baseGoerli", + chainId: 84531, + urls: { + apiURL: "https://api-goerli.basescan.org/api", + browserURL: "https://goerli.basescan.org/", + }, + }, + { + network: "arbitrumTestnet", + chainId: 421611, + urls: { + apiURL: "https://api-testnet.arbiscan.io/api", + browserURL: "https://testnet.arbiscan.io/", + }, + }, + { + network: "arbitrumGoerli", + chainId: 421613, + urls: { + apiURL: "https://api-goerli.arbiscan.io/api", + browserURL: "https://goerli.arbiscan.io/", + }, + }, + { + network: "sepolia", + chainId: 11155111, + urls: { + apiURL: "https://api-sepolia.etherscan.io/api", + browserURL: "https://sepolia.etherscan.io", + }, + }, + { + network: "aurora", + chainId: 1313161554, + urls: { + apiURL: "https://explorer.mainnet.aurora.dev/api", + browserURL: "https://explorer.mainnet.aurora.dev", + }, + }, + { + network: "auroraTestnet", + chainId: 1313161555, + urls: { + apiURL: "https://explorer.testnet.aurora.dev/api", + browserURL: "https://explorer.testnet.aurora.dev", + }, + }, + { + network: "harmony", + chainId: 1666600000, + urls: { + apiURL: "https://ctrver.t.hmny.io/verify", + browserURL: "https://explorer.harmony.one", + }, + }, + { + network: "harmonyTest", + chainId: 1666700000, + urls: { + apiURL: "https://ctrver.t.hmny.io/verify?network=testnet", + browserURL: "https://explorer.pops.one", + }, + }, +]; diff --git a/packages/core/src/internal/deployment-loader/file-deployment-loader.ts b/packages/core/src/internal/deployment-loader/file-deployment-loader.ts index d364d21fad..e1c8dbc659 100644 --- a/packages/core/src/internal/deployment-loader/file-deployment-loader.ts +++ b/packages/core/src/internal/deployment-loader/file-deployment-loader.ts @@ -117,6 +117,26 @@ export class FileDeploymentLoader implements DeploymentLoader { ); } + public async readBuildInfo(futureId: string): Promise { + await this._initialize(); + + const debugInfoFilePath = path.join( + this._paths.artifactsDir, + `${futureId}.dbg.json` + ); + + const json = JSON.parse((await readFile(debugInfoFilePath)).toString()); + + const buildInfoPath = path.resolve( + this._paths.artifactsDir, + json.buildInfo + ); + + const buildInfo = JSON.parse((await readFile(buildInfoPath)).toString()); + + return buildInfo; + } + public async loadArtifact(futureId: string): Promise { await this._initialize(); diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index b85659fe07..1e1a27d49e 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -44,6 +44,21 @@ const PANIC_CODE_NAMES: { [key: number]: string | undefined } = { [0x51]: "UNINITIALIZED_FUNCTION_CALL", }; +/** + * Encodes the constructor arguments for a deployment. + */ +export function encodeDeploymentArguments( + artifact: Artifact, + args: SolidityParameterType[] +): string { + const { ethers } = require("ethers") as typeof import("ethers"); + const iface = new ethers.Interface(artifact.abi); + + const encodedArgs = iface.encodeDeploy(args); + + return encodedArgs.slice(2); +} + /** * Links the libraries in the artifact's deployment bytecode, encodes the constructor * arguments and returns the result, which can be used as the `data` field of a @@ -54,13 +69,10 @@ export function encodeArtifactDeploymentData( args: SolidityParameterType[], libraries: { [libraryName: string]: string } ): string { - const { ethers } = require("ethers") as typeof import("ethers"); - const iface = new ethers.Interface(artifact.abi); - const linkedBytecode = linkLibraries(artifact, libraries); - const encodedArgs = iface.encodeDeploy(args); + const encodedArgs = encodeDeploymentArguments(artifact, args); - return linkedBytecode + encodedArgs.slice(2); + return linkedBytecode + encodedArgs; } /** diff --git a/packages/core/src/internal/views/find-execution-states-by-type.ts b/packages/core/src/internal/views/find-execution-states-by-type.ts new file mode 100644 index 0000000000..47d0fb4f5e --- /dev/null +++ b/packages/core/src/internal/views/find-execution-states-by-type.ts @@ -0,0 +1,14 @@ +import { MapExStateTypeToExState } from "../execution/type-helpers"; +import { DeploymentState } from "../execution/types/deployment-state"; +import { ExecutionSateType } from "../execution/types/execution-state"; + +export function findExecutionStatesByType( + exStateType: ExStateT, + deployment: DeploymentState +): Array> { + const exStates = Object.values(deployment.executionStates).filter( + (exs) => exs.type === exStateType + ); + + return exStates as Array>; +} diff --git a/packages/core/src/types/artifact.ts b/packages/core/src/types/artifact.ts index b5f6246526..5e2e56f4cf 100644 --- a/packages/core/src/types/artifact.ts +++ b/packages/core/src/types/artifact.ts @@ -5,6 +5,7 @@ */ export interface Artifact { contractName: string; + sourceName: string; bytecode: string; abi: any[]; linkReferences: Record< diff --git a/packages/core/src/types/verify.ts b/packages/core/src/types/verify.ts new file mode 100644 index 0000000000..49b4f6447f --- /dev/null +++ b/packages/core/src/types/verify.ts @@ -0,0 +1,47 @@ +/** + * The configuration info needed to verify a contract on Etherscan on a given chain. + * + * @beta + */ +export interface ChainConfig { + network: string; + chainId: number; + urls: { + apiURL: string; + browserURL: string; + }; +} + +/** + * A map of source names to library names to their addresses. + * Used to verify contracts with libraries that cannot be derived from the bytecode. + * i.e. contracts that use libraries in their constructor + * + * @beta + */ +export interface SourceToLibraryToAddress { + [sourceName: string]: { + [libraryName: string]: string; + }; +} + +/** + * The information required to verify a contract on Etherscan. + * + * @beta + */ +export interface VerifyInfo { + address: string; + compilerVersion: string; + sourceCode: string; + name: string; + args: string; +} + +/** + * The result of requesting the verification info for a deployment. + * It returns the chainConfig followed by an array of VerifyInfo objects, one for each contract to be verified. + * + * @beta + */ +export type VerifyResult = [ChainConfig, VerifyInfo]; diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts new file mode 100644 index 0000000000..482de0bf64 --- /dev/null +++ b/packages/core/src/verify.ts @@ -0,0 +1,166 @@ +import { IgnitionError } from "./errors"; +import { ERRORS } from "./errors-list"; +import { builtinChains } from "./internal/chain-config"; +import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { encodeDeploymentArguments } from "./internal/execution/abi"; +import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; +import { DeploymentState } from "./internal/execution/types/deployment-state"; +import { ExecutionResultType } from "./internal/execution/types/execution-result"; +import { + DeploymentExecutionState, + ExecutionSateType, + ExecutionStatus, +} from "./internal/execution/types/execution-state"; +import { assertIgnitionInvariant } from "./internal/utils/assertions"; +import { findExecutionStatesByType } from "./internal/views/find-execution-states-by-type"; +import { Artifact, BuildInfo } from "./types/artifact"; +import { + ChainConfig, + SourceToLibraryToAddress, + VerifyResult, +} from "./types/verify"; + +/** + * Retrieve the information required to verify all contracts from a deployment on Etherscan. + * + * @param deploymentDir - the file directory of the deployment + * @param customChains - an array of custom chain configurations + * + * @beta + */ +export async function* getVerificationInformation( + deploymentDir: string, + customChains: ChainConfig[] = [] +): AsyncGenerator { + const deploymentLoader = new FileDeploymentLoader(deploymentDir); + + const deploymentState = await loadDeploymentState(deploymentLoader); + + if (deploymentState === undefined) { + throw new IgnitionError(ERRORS.VERIFY.UNINITIALIZED_DEPLOYMENT, { + deploymentDir, + }); + } + + const chainConfig = resolveChainConfig(deploymentState, customChains); + + const deploymentExStates = findExecutionStatesByType( + ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, + deploymentState + ).filter((exState) => exState.status === ExecutionStatus.SUCCESS); + + if (deploymentExStates.length === 0) { + throw new IgnitionError(ERRORS.VERIFY.NO_CONTRACTS_DEPLOYED, { + deploymentDir, + }); + } + + for (const exState of deploymentExStates) { + const verifyInfo = await convertExStateToVerifyInfo( + exState, + deploymentLoader + ); + + const verifyResult: VerifyResult = [chainConfig, verifyInfo]; + + yield verifyResult; + } +} + +function resolveChainConfig( + deploymentState: DeploymentState, + customChains: ChainConfig[] +) { + // implementation note: + // if a user has set a custom chain with the same chainId as a builtin chain, + // the custom chain will be used instead of the builtin chain + const chainConfig = [...customChains, ...builtinChains].find( + (c) => c.chainId === deploymentState.chainId + ); + + if (chainConfig === undefined) { + throw new IgnitionError(ERRORS.VERIFY.UNSUPPORTED_CHAIN, { + chainId: deploymentState.chainId, + }); + } + + return chainConfig; +} + +async function convertExStateToVerifyInfo( + exState: DeploymentExecutionState, + deploymentLoader: FileDeploymentLoader +) { + const [buildInfo, artifact] = await Promise.all([ + deploymentLoader.readBuildInfo(exState.artifactId), + deploymentLoader.loadArtifact(exState.artifactId), + ]); + + const { contractName, constructorArgs, libraries } = exState; + + assertIgnitionInvariant( + exState.result !== undefined && + exState.result.type === ExecutionResultType.SUCCESS, + `Deployment execution state ${exState.id} should have a successful result to retrieve address` + ); + + const verifyInfo = { + address: exState.result.address, + compilerVersion: buildInfo.solcLongVersion.startsWith("v") + ? buildInfo.solcLongVersion + : `v${buildInfo.solcLongVersion}`, + sourceCode: prepareInputBasedOn(buildInfo, artifact, libraries), + name: `${artifact.sourceName}:${contractName}`, + args: encodeDeploymentArguments(artifact, constructorArgs), + }; + + return verifyInfo; +} + +function prepareInputBasedOn( + buildInfo: BuildInfo, + artifact: Artifact, + libraries: Record +): string { + const sourceToLibraryAddresses = resolveLibraryInfoForArtifact( + artifact, + libraries + ); + + if (sourceToLibraryAddresses === null) { + return JSON.stringify(buildInfo.input); + } + + const { input } = buildInfo; + input.settings.libraries = sourceToLibraryAddresses; + + return JSON.stringify(input); +} + +function resolveLibraryInfoForArtifact( + artifact: Artifact, + libraries: Record +): SourceToLibraryToAddress | null { + const sourceToLibraryToAddress: SourceToLibraryToAddress = {}; + + for (const [sourceName, refObj] of Object.entries(artifact.linkReferences)) { + for (const [libName] of Object.entries(refObj)) { + sourceToLibraryToAddress[sourceName] ??= {}; + + const libraryAddress = libraries[libName]; + + assertIgnitionInvariant( + libraryAddress !== undefined, + `Could not find address for library ${libName}` + ); + + sourceToLibraryToAddress[sourceName][libName] = libraryAddress; + } + } + + if (Object.entries(sourceToLibraryToAddress).length === 0) { + return null; + } + + return sourceToLibraryToAddress; +} diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index 4480ae0bfe..d43cb456a4 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -15,6 +15,7 @@ import { FutureType } from "../src/types/module"; import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; @@ -511,15 +512,13 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a non-existant function", async () => { - const fakeArtifact: Artifact = { - abi: [], + const fakerArtifact: Artifact = { + ...fakeArtifact, contractName: "Another", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "test"); return { another }; @@ -541,7 +540,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -557,13 +557,10 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "inc", [1, 2]); return { another }; @@ -585,7 +582,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate an overloaded call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -620,12 +618,10 @@ m.call(..., { id: "MyUniqueId"})` }, ], contractName: "Another", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "inc(bool,uint256)", [1, 2, 3]); return { another }; @@ -647,13 +643,6 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); @@ -679,13 +668,6 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a module parameter of the wrong type for value", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const p = m.getParameter("p", false as unknown as bigint); @@ -711,7 +693,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should validate a module parameter of the correct type for value", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -721,15 +704,12 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { const p = m.getParameter("p", 42n); - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "test", [], { value: p }); return { another }; @@ -750,7 +730,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -766,15 +747,12 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { const p = m.getParameter("p", true); - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "test", [p]); return { another }; @@ -795,13 +773,6 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const p = m.getParameter("p"); @@ -829,7 +800,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -845,15 +817,12 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { const p = m.getParameter("p", true); - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.call(another, "test", [ [123, { really: { deeply: { nested: [p] } } }], ]); @@ -876,7 +845,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -892,13 +862,10 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); const account = m.getAccount(-1); m.call(another, "inc", [1], { from: account }); @@ -921,7 +888,8 @@ m.call(..., { id: "MyUniqueId"})` }); it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -937,13 +905,10 @@ m.call(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); const account = m.getAccount(1); m.call(another, "inc", [1], { from: account }); diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 19ea860884..a5eda6d37e 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -17,6 +17,7 @@ import { FutureType } from "../src/types/module"; import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; @@ -540,13 +541,6 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate an incorrect number of constructor args", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const contract1 = m.contract("Test", [1, 2, 3]); @@ -567,7 +561,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -581,9 +576,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -598,7 +590,7 @@ m.contract(..., { id: "MyUniqueId"})` assertValidationError( await validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ), @@ -607,7 +599,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate a module parameter of the wrong type for value", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -615,9 +608,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -632,7 +622,7 @@ m.contract(..., { id: "MyUniqueId"})` assertValidationError( await validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ), @@ -641,7 +631,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should validate a module parameter of the correct type for value", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -649,9 +640,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -666,7 +654,7 @@ m.contract(..., { id: "MyUniqueId"})` await assert.isFulfilled( validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ) @@ -674,7 +662,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -688,9 +677,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -705,7 +691,7 @@ m.contract(..., { id: "MyUniqueId"})` await assert.isFulfilled( validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ) @@ -713,7 +699,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -727,9 +714,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -746,7 +730,7 @@ m.contract(..., { id: "MyUniqueId"})` assertValidationError( await validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ), @@ -755,7 +739,8 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -769,9 +754,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -788,7 +770,7 @@ m.contract(..., { id: "MyUniqueId"})` await assert.isFulfilled( validateNamedContractDeployment( future as any, - setupMockArtifactResolver({ Test: fakeArtifact }), + setupMockArtifactResolver({ Test: fakerArtifact }), {}, [] ) @@ -796,13 +778,6 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); const contract1 = m.contract("Test", [], { from: account }); @@ -824,13 +799,6 @@ m.contract(..., { id: "MyUniqueId"})` }); it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const account = m.getAccount(1); const contract1 = m.contract("Test", [], { from: account }); diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 06b9a2497d..60f0d8e58a 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { Artifact, FutureType } from "../src"; +import { FutureType } from "../src"; import { buildModule } from "../src/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; @@ -10,19 +10,13 @@ import { validateNamedContractAt } from "../src/internal/validation/futures/vali import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; describe("contractAt", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", exampleAddress); diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 6e5c536fe0..9619482aab 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { Artifact, FutureType } from "../src"; +import { FutureType } from "../src"; import { buildModule } from "../src/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; @@ -10,6 +10,7 @@ import { validateArtifactContractAt } from "../src/internal/validation/futures/v import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; @@ -17,13 +18,6 @@ describe("contractAtFromArtifact", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should be able to setup a contract at a given address", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { const contract1 = m.contractAt("Contract1", fakeArtifact, exampleAddress); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index b1b03a2ca6..176e5265b7 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -14,17 +14,11 @@ import { validateArtifactContractDeployment } from "../src/internal/validation/f import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; describe("contractFromArtifact", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should be able to deploy with a contract based on an artifact", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1", fakeArtifact, [ @@ -531,6 +525,7 @@ m.contract(..., { id: "MyUniqueId"})` it("should validate a missing module parameter if a default parameter is present", async () => { const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -544,9 +539,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -572,6 +564,7 @@ m.contract(..., { id: "MyUniqueId"})` it("should not validate a module parameter of the wrong type for value", async () => { const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -579,9 +572,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -610,6 +600,7 @@ m.contract(..., { id: "MyUniqueId"})` it("should validate a module parameter of the correct type for value", async () => { const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -617,9 +608,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -672,6 +660,7 @@ m.contract(..., { id: "MyUniqueId"})` it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -685,9 +674,6 @@ m.contract(..., { id: "MyUniqueId"})` type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { diff --git a/packages/core/test/helpers.ts b/packages/core/test/helpers.ts index 1e4809fbe9..bb4842b581 100644 --- a/packages/core/test/helpers.ts +++ b/packages/core/test/helpers.ts @@ -29,6 +29,7 @@ export function assertInstanceOf( export const fakeArtifact: Artifact = { abi: [], contractName: "", + sourceName: "", bytecode: "", linkReferences: {}, }; diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts index 4ba0bfba37..16ba67d941 100644 --- a/packages/core/test/ignition-module-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -1,7 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { Artifact } from "../src"; import { buildModule } from "../src/build-module"; import { IgnitionModuleDeserializer, @@ -19,6 +18,8 @@ import { IgnitionModuleResult, } from "../src/types/module"; +import { fakeArtifact } from "./helpers"; + describe("stored deployment serializer", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; @@ -87,13 +88,6 @@ describe("stored deployment serializer", () => { }); describe("contractFromArtifact", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should serialize a contractFromArtifact deployment", () => { const module = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1", fakeArtifact, []); @@ -159,13 +153,6 @@ describe("stored deployment serializer", () => { }); describe("contractAtFromArtifact", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should serialize a contractAt", () => { const module = buildModule("Module1", (m) => { const contract1 = m.contractAt( @@ -220,13 +207,6 @@ describe("stored deployment serializer", () => { }); describe("library", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should serialize a library deployment", () => { const module = buildModule("Module1", (m) => { const library1 = m.library("Library1"); @@ -289,13 +269,6 @@ describe("stored deployment serializer", () => { }); describe("libraryFromArtifact", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should serialize a libraryFromArtifact deployment", () => { const module = buildModule("Module1", (m) => { const library1 = m.library("Contract1", fakeArtifact); diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index 13f43ba379..d63d214c2d 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -1,7 +1,6 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { Artifact } from "../src"; import { buildModule } from "../src/build-module"; import { AccountRuntimeValueImplementation, @@ -13,17 +12,11 @@ import { validateArtifactLibraryDeployment } from "../src/internal/validation/fu import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; describe("libraryFromArtifact", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - it("should be able to deploy with a library based on an artifact", () => { const moduleWithContractFromArtifact = buildModule("Module1", (m) => { const library1 = m.library("Library1", fakeArtifact); diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json new file mode 100644 index 0000000000..acf2feda46 --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/254cc89254e61cb6a9bf2c74f13055f1.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json new file mode 100644 index 0000000000..5ef725ccaa --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json @@ -0,0 +1,37 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "UUUUU", + "sourceName": "contracts/Lib.sol", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "bf", + "type": "uint256" + } + ], + "name": "yu", + "type": "event" + }, + { + "inputs": [], + "name": "cn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x61023a610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c8063856c67f414610045578063a3a79ad71461006e575b600080fd5b81801561005157600080fd5b5061006c60048036038101906100679190610120565b61008c565b005b6100766100d8565b604051610083919061015c565b60405180910390f35b7fbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd256100b56100d8565b826100c091906101a6565b6040516100cd91906101e9565b60405180910390a150565b6000641cbe86ba4d905090565b600080fd5b6000819050919050565b6100fd816100ea565b811461010857600080fd5b50565b60008135905061011a816100f4565b92915050565b600060208284031215610136576101356100e5565b5b60006101448482850161010b565b91505092915050565b610156816100ea565b82525050565b6000602082019050610171600083018461014d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b1826100ea565b91506101bc836100ea565b92508282019050808211156101d4576101d3610177565b5b92915050565b6101e3816100ea565b82525050565b60006020820190506101fe60008301846101da565b9291505056fea2646970667358221220c15d1d30c7e4fcaa2bcd8092153ba13d28b770b6e90531af7317221cc4a474dd64736f6c63430008130033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c8063856c67f414610045578063a3a79ad71461006e575b600080fd5b81801561005157600080fd5b5061006c60048036038101906100679190610120565b61008c565b005b6100766100d8565b604051610083919061015c565b60405180910390f35b7fbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd256100b56100d8565b826100c091906101a6565b6040516100cd91906101e9565b60405180910390a150565b6000641cbe86ba4d905090565b600080fd5b6000819050919050565b6100fd816100ea565b811461010857600080fd5b50565b60008135905061011a816100f4565b92915050565b600060208284031215610136576101356100e5565b5b60006101448482850161010b565b91505092915050565b610156816100ea565b82525050565b6000602082019050610171600083018461014d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b1826100ea565b91506101bc836100ea565b92508282019050808211156101d4576101d3610177565b5b92915050565b6101e3816100ea565b82525050565b60006020820190506101fe60008301846101da565b9291505056fea2646970667358221220c15d1d30c7e4fcaa2bcd8092153ba13d28b770b6e90531af7317221cc4a474dd64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json new file mode 100644 index 0000000000..acf2feda46 --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/254cc89254e61cb6a9bf2c74f13055f1.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json new file mode 100644 index 0000000000..a28710391b --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json @@ -0,0 +1,29 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "WAAIT", + "sourceName": "contracts/Lock.sol", + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5073__$e1bfcf6041ff8ba6df21245bab8ae07a55$__63856c67f473__$e1bfcf6041ff8ba6df21245bab8ae07a55$__63a3a79ad76040518163ffffffff1660e01b8152600401602060405180830381865af4158015610074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100989190610124565b6040518263ffffffff1660e01b81526004016100b49190610160565b60006040518083038186803b1580156100cc57600080fd5b505af41580156100e0573d6000803e3d6000fd5b5050505061017b565b600080fd5b6000819050919050565b610101816100ee565b811461010c57600080fd5b50565b60008151905061011e816100f8565b92915050565b60006020828403121561013a576101396100e9565b5b60006101488482850161010f565b91505092915050565b61015a816100ee565b82525050565b60006020820190506101756000830184610151565b92915050565b603f806101896000396000f3fe6080604052600080fdfea2646970667358221220cb2ee4f824d599c1f160d9867571f972f7aaf7ab2f13b22e78324469179161ce64736f6c63430008130033", + "deployedBytecode": "0x6080604052600080fdfea2646970667358221220cb2ee4f824d599c1f160d9867571f972f7aaf7ab2f13b22e78324469179161ce64736f6c63430008130033", + "linkReferences": { + "contracts/Lib.sol": { + "UUUUU": [ + { + "length": 20, + "start": 19 + }, + { + "length": 20, + "start": 45 + } + ] + } + }, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json b/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json new file mode 100644 index 0000000000..f4881fb1c8 --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json @@ -0,0 +1,2681 @@ +{ + "id": "254cc89254e61cb6a9bf2c74f13055f1", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/Lib.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\nlibrary UUUUU {\n function bn(uint ba) public {\n emit yu(ba + cn());\n }\n\n function cn() public pure returns (uint256) {\n return 123455584845;\n }\n\n event yu(uint bf);\n}\n" + }, + "contracts/Lock.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\nimport \"./Lib.sol\";\n\ncontract WAAIT {\n constructor() {\n UUUUU.bn(UUUUU.cn());\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/Lib.sol": { + "ast": { + "absolutePath": "contracts/Lib.sol", + "exportedSymbols": { + "UUUUU": [ + 27 + ] + }, + "id": 28, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "UUUUU", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 27, + "linearizedBaseContracts": [ + 27 + ], + "name": "UUUUU", + "nameLocation": "72:5:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 13, + "nodeType": "Block", + "src": "110:29:0", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 10, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 7, + "name": "ba", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "124:2:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "id": 8, + "name": "cn", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "129:2:0", + "typeDescriptions": { + "typeIdentifier": "t_function_internal_pure$__$returns$_t_uint256_$", + "typeString": "function () pure returns (uint256)" + } + }, + "id": 9, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "129:4:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "124:9:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 6, + "name": "yu", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 26, + "src": "121:2:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 11, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "121:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 12, + "nodeType": "EmitStatement", + "src": "116:18:0" + } + ] + }, + "functionSelector": "856c67f4", + "id": 14, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "bn", + "nameLocation": "91:2:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 4, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "mutability": "mutable", + "name": "ba", + "nameLocation": "99:2:0", + "nodeType": "VariableDeclaration", + "scope": 14, + "src": "94:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "94:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "93:9:0" + }, + "returnParameters": { + "id": 5, + "nodeType": "ParameterList", + "parameters": [], + "src": "110:0:0" + }, + "scope": 27, + "src": "82:57:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 21, + "nodeType": "Block", + "src": "187:30:0", + "statements": [ + { + "expression": { + "hexValue": "313233343535353834383435", + "id": 19, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "200:12:0", + "typeDescriptions": { + "typeIdentifier": "t_rational_123455584845_by_1", + "typeString": "int_const 123455584845" + }, + "value": "123455584845" + }, + "functionReturnParameters": 18, + "id": 20, + "nodeType": "Return", + "src": "193:19:0" + } + ] + }, + "functionSelector": "a3a79ad7", + "id": 22, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "cn", + "nameLocation": "152:2:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 15, + "nodeType": "ParameterList", + "parameters": [], + "src": "154:2:0" + }, + "returnParameters": { + "id": 18, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 17, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 22, + "src": "178:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 16, + "name": "uint256", + "nodeType": "ElementaryTypeName", + "src": "178:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "177:9:0" + }, + "scope": 27, + "src": "143:74:0", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "bbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd25", + "id": 26, + "name": "yu", + "nameLocation": "227:2:0", + "nodeType": "EventDefinition", + "parameters": { + "id": 25, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24, + "indexed": false, + "mutability": "mutable", + "name": "bf", + "nameLocation": "235:2:0", + "nodeType": "VariableDeclaration", + "scope": 26, + "src": "230:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 23, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "230:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "229:9:0" + }, + "src": "221:18:0" + } + ], + "scope": 28, + "src": "64:177:0", + "usedErrors": [] + } + ], + "src": "39:203:0" + }, + "id": 0 + }, + "contracts/Lock.sol": { + "ast": { + "absolutePath": "contracts/Lock.sol", + "exportedSymbols": { + "UUUUU": [ + 27 + ], + "WAAIT": [ + 43 + ] + }, + "id": 44, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 29, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:1" + }, + { + "absolutePath": "contracts/Lib.sol", + "file": "./Lib.sol", + "id": 30, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 44, + "sourceUnit": 28, + "src": "140:19:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "WAAIT", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 43, + "linearizedBaseContracts": [ + 43 + ], + "name": "WAAIT", + "nameLocation": "170:5:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 41, + "nodeType": "Block", + "src": "194:31:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 36, + "name": "UUUUU", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 27, + "src": "209:5:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UUUUU_$27_$", + "typeString": "type(library UUUUU)" + } + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "215:2:1", + "memberName": "cn", + "nodeType": "MemberAccess", + "referencedDeclaration": 22, + "src": "209:8:1", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$__$returns$_t_uint256_$", + "typeString": "function () pure returns (uint256)" + } + }, + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "209:10:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 33, + "name": "UUUUU", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 27, + "src": "200:5:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_UUUUU_$27_$", + "typeString": "type(library UUUUU)" + } + }, + "id": 35, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "206:2:1", + "memberName": "bn", + "nodeType": "MemberAccess", + "referencedDeclaration": 14, + "src": "200:8:1", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 39, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "200:20:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 40, + "nodeType": "ExpressionStatement", + "src": "200:20:1" + } + ] + }, + "id": 42, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 31, + "nodeType": "ParameterList", + "parameters": [], + "src": "191:2:1" + }, + "returnParameters": { + "id": 32, + "nodeType": "ParameterList", + "parameters": [], + "src": "194:0:1" + }, + "scope": 43, + "src": "180:45:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 44, + "src": "161:66:1", + "usedErrors": [] + } + ], + "src": "39:189:1" + }, + "id": 1 + } + }, + "contracts": { + "contracts/Lib.sol": { + "UUUUU": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "bf", + "type": "uint256" + } + ], + "name": "yu", + "type": "event" + }, + { + "inputs": [], + "name": "cn", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "61023a610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c8063856c67f414610045578063a3a79ad71461006e575b600080fd5b81801561005157600080fd5b5061006c60048036038101906100679190610120565b61008c565b005b6100766100d8565b604051610083919061015c565b60405180910390f35b7fbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd256100b56100d8565b826100c091906101a6565b6040516100cd91906101e9565b60405180910390a150565b6000641cbe86ba4d905090565b600080fd5b6000819050919050565b6100fd816100ea565b811461010857600080fd5b50565b60008135905061011a816100f4565b92915050565b600060208284031215610136576101356100e5565b5b60006101448482850161010b565b91505092915050565b610156816100ea565b82525050565b6000602082019050610171600083018461014d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b1826100ea565b91506101bc836100ea565b92508282019050808211156101d4576101d3610177565b5b92915050565b6101e3816100ea565b82525050565b60006020820190506101fe60008301846101da565b9291505056fea2646970667358221220c15d1d30c7e4fcaa2bcd8092153ba13d28b770b6e90531af7317221cc4a474dd64736f6c63430008130033", + "opcodes": "PUSH2 0x23A PUSH2 0x53 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x46 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x856C67F4 EQ PUSH2 0x45 JUMPI DUP1 PUSH4 0xA3A79AD7 EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x67 SWAP2 SWAP1 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x8C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0xD8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x15C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH32 0xBBD59F58682E05B023D29551ECA4F8EF7FB7413F5DC80469DDEF4D332586FD25 PUSH2 0xB5 PUSH2 0xD8 JUMP JUMPDEST DUP3 PUSH2 0xC0 SWAP2 SWAP1 PUSH2 0x1A6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCD SWAP2 SWAP1 PUSH2 0x1E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH5 0x1CBE86BA4D SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFD DUP2 PUSH2 0xEA JUMP JUMPDEST DUP2 EQ PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x11A DUP2 PUSH2 0xF4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x136 JUMPI PUSH2 0x135 PUSH2 0xE5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x144 DUP5 DUP3 DUP6 ADD PUSH2 0x10B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x156 DUP2 PUSH2 0xEA JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x171 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x14D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1B1 DUP3 PUSH2 0xEA JUMP JUMPDEST SWAP2 POP PUSH2 0x1BC DUP4 PUSH2 0xEA JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x1D4 JUMPI PUSH2 0x1D3 PUSH2 0x177 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1E3 DUP2 PUSH2 0xEA JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1FE PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1DA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 0x5D SAR ADDRESS 0xC7 0xE4 0xFC 0xAA 0x2B 0xCD DUP1 SWAP3 ISZERO EXTCODESIZE LOG1 RETURNDATASIZE 0x28 0xB7 PUSH17 0xB6E90531AF7317221CC4A474DD64736F6C PUSH4 0x43000813 STOP CALLER ", + "sourceMap": "64:177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@bn_14": { + "entryPoint": 140, + "id": 14, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@cn_22": { + "entryPoint": 216, + "id": 22, + "parameterSlots": 0, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 267, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 288, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 474, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 333, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 348, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 489, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 422, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 234, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 375, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 229, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 244, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2133:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:2" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:2" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:2" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:2", + "type": "" + } + ], + "src": "545:139:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "756:263:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "802:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "804:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "804:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "804:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "777:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "786:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "773:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "773:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "798:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "769:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "769:32:2" + }, + "nodeType": "YulIf", + "src": "766:119:2" + }, + { + "nodeType": "YulBlock", + "src": "895:117:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "910:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "924:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "914:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "939:63:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "974:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "985:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "970:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "970:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "994:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "949:20:2" + }, + "nodeType": "YulFunctionCall", + "src": "949:53:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "939:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "726:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "737:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "749:6:2", + "type": "" + } + ], + "src": "690:329:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1098:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1115:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1138:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1120:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1120:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1108:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1108:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1108:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1086:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1093:3:2", + "type": "" + } + ], + "src": "1025:126:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1263:132:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1273:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1285:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1296:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1281:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1281:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1273:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1361:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1374:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1385:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1370:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1370:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1309:51:2" + }, + "nodeType": "YulFunctionCall", + "src": "1309:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1309:79:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1235:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1247:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1258:4:2", + "type": "" + } + ], + "src": "1157:238:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1429:152:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1446:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1449:77:2", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1439:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1439:88:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1439:88:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1543:1:2", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1546:4:2", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1536:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1536:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1536:15:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1567:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1570:4:2", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1560:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1560:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1560:15:2" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "1401:180:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1631:147:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1641:25:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1664:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1646:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1646:20:2" + }, + "variableNames": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1641:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1675:25:2", + "value": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1698:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1680:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1680:20:2" + }, + "variableNames": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1675:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1709:16:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1720:1:2" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1723:1:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1716:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1716:9:2" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1709:3:2" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1749:22:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "1751:16:2" + }, + "nodeType": "YulFunctionCall", + "src": "1751:18:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1751:18:2" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1741:1:2" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1744:3:2" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1738:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "1738:10:2" + }, + "nodeType": "YulIf", + "src": "1735:36:2" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "1618:1:2", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "1621:1:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "1627:3:2", + "type": "" + } + ], + "src": "1587:191:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1849:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1866:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1889:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1871:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1871:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1859:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1859:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1859:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1837:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1844:3:2", + "type": "" + } + ], + "src": "1784:118:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2006:124:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2016:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2028:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2039:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2024:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2024:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2016:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2096:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2109:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2120:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2105:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2105:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "2052:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "2052:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2052:71:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1978:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1990:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2001:4:2", + "type": "" + } + ], + "src": "1908:222:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n function checked_add_t_uint256(x, y) -> sum {\n x := cleanup_t_uint256(x)\n y := cleanup_t_uint256(y)\n sum := add(x, y)\n\n if gt(x, sum) { panic_error_0x11() }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c8063856c67f414610045578063a3a79ad71461006e575b600080fd5b81801561005157600080fd5b5061006c60048036038101906100679190610120565b61008c565b005b6100766100d8565b604051610083919061015c565b60405180910390f35b7fbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd256100b56100d8565b826100c091906101a6565b6040516100cd91906101e9565b60405180910390a150565b6000641cbe86ba4d905090565b600080fd5b6000819050919050565b6100fd816100ea565b811461010857600080fd5b50565b60008135905061011a816100f4565b92915050565b600060208284031215610136576101356100e5565b5b60006101448482850161010b565b91505092915050565b610156816100ea565b82525050565b6000602082019050610171600083018461014d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b1826100ea565b91506101bc836100ea565b92508282019050808211156101d4576101d3610177565b5b92915050565b6101e3816100ea565b82525050565b60006020820190506101fe60008301846101da565b9291505056fea2646970667358221220c15d1d30c7e4fcaa2bcd8092153ba13d28b770b6e90531af7317221cc4a474dd64736f6c63430008130033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x40 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x856C67F4 EQ PUSH2 0x45 JUMPI DUP1 PUSH4 0xA3A79AD7 EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 DUP1 ISZERO PUSH2 0x51 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x6C PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x67 SWAP2 SWAP1 PUSH2 0x120 JUMP JUMPDEST PUSH2 0x8C JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0xD8 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x15C JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH32 0xBBD59F58682E05B023D29551ECA4F8EF7FB7413F5DC80469DDEF4D332586FD25 PUSH2 0xB5 PUSH2 0xD8 JUMP JUMPDEST DUP3 PUSH2 0xC0 SWAP2 SWAP1 PUSH2 0x1A6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xCD SWAP2 SWAP1 PUSH2 0x1E9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 PUSH5 0x1CBE86BA4D SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFD DUP2 PUSH2 0xEA JUMP JUMPDEST DUP2 EQ PUSH2 0x108 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x11A DUP2 PUSH2 0xF4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x136 JUMPI PUSH2 0x135 PUSH2 0xE5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x144 DUP5 DUP3 DUP6 ADD PUSH2 0x10B JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x156 DUP2 PUSH2 0xEA JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x171 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x14D JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x1B1 DUP3 PUSH2 0xEA JUMP JUMPDEST SWAP2 POP PUSH2 0x1BC DUP4 PUSH2 0xEA JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x1D4 JUMPI PUSH2 0x1D3 PUSH2 0x177 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x1E3 DUP2 PUSH2 0xEA JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x1FE PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1DA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xC1 0x5D SAR ADDRESS 0xC7 0xE4 0xFC 0xAA 0x2B 0xCD DUP1 SWAP3 ISZERO EXTCODESIZE LOG1 RETURNDATASIZE 0x28 0xB7 PUSH17 0xB6E90531AF7317221CC4A474DD64736F6C PUSH4 0x43000813 STOP CALLER ", + "sourceMap": "64:177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82:57;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;143:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;82:57;121:13;129:4;:2;:4::i;:::-;124:2;:9;;;;:::i;:::-;121:13;;;;;;:::i;:::-;;;;;;;;82:57;:::o;143:74::-;178:7;200:12;193:19;;143:74;:::o;88:117:2:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1120:24;1138:5;1120:24;:::i;:::-;1115:3;1108:37;1025:126;;:::o;1157:238::-;1258:4;1296:2;1285:9;1281:18;1273:26;;1309:79;1385:1;1374:9;1370:17;1361:6;1309:79;:::i;:::-;1157:238;;;;:::o;1401:180::-;1449:77;1446:1;1439:88;1546:4;1543:1;1536:15;1570:4;1567:1;1560:15;1587:191;1627:3;1646:20;1664:1;1646:20;:::i;:::-;1641:25;;1680:20;1698:1;1680:20;:::i;:::-;1675:25;;1723:1;1720;1716:9;1709:16;;1744:3;1741:1;1738:10;1735:36;;;1751:18;;:::i;:::-;1735:36;1587:191;;;;:::o;1784:118::-;1871:24;1889:5;1871:24;:::i;:::-;1866:3;1859:37;1784:118;;:::o;1908:222::-;2001:4;2039:2;2028:9;2024:18;2016:26;;2052:71;2120:1;2109:9;2105:17;2096:6;2052:71;:::i;:::-;1908:222;;;;:::o" + }, + "methodIdentifiers": { + "bn(uint256)": "856c67f4", + "cn()": "a3a79ad7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bf\",\"type\":\"uint256\"}],\"name\":\"yu\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"cn\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lib.sol\":\"UUUUU\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lib.sol\":{\"keccak256\":\"0xa603982d3548357d3f670ef1e530ec4c88b2366e7c63083d7300aa1acb41c69e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://8501dd49427e34bbe12af6be9b9d8a27e68be1c2738ed8fe5ef426a1280626d3\",\"dweb:/ipfs/QmfTfRDYPhnZqRHECEiBEhddcgL9TdJGUjAs4jYMiPLYQx\"]}},\"version\":1}" + } + }, + "contracts/Lock.sol": { + "WAAIT": { + "abi": [ + { + "inputs": [], + "stateMutability": "nonpayable", + "type": "constructor" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_42": { + "entryPoint": null, + "id": 42, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 271, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 292, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 337, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 352, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 238, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 233, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 248, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1424:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:2" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:2" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:2", + "type": "" + } + ], + "src": "545:143:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:274:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "817:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "819:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "819:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "819:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "792:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "801:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "788:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "788:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "813:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "784:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "784:32:2" + }, + "nodeType": "YulIf", + "src": "781:119:2" + }, + { + "nodeType": "YulBlock", + "src": "910:128:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "925:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "939:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "929:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "954:74:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1000:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1011:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "996:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "996:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1020:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "964:31:2" + }, + "nodeType": "YulFunctionCall", + "src": "964:64:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "954:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "741:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "752:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "764:6:2", + "type": "" + } + ], + "src": "694:351:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1124:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1141:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1164:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1146:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1146:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1134:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1134:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1134:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1112:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1119:3:2", + "type": "" + } + ], + "src": "1051:126:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1289:132:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1299:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1311:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1322:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1307:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1307:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1299:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1387:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1400:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1411:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1396:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1396:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1335:51:2" + }, + "nodeType": "YulFunctionCall", + "src": "1335:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1335:79:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1261:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1273:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1284:4:2", + "type": "" + } + ], + "src": "1183:238:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": { + "contracts/Lib.sol": { + "UUUUU": [ + { + "length": 20, + "start": 19 + }, + { + "length": 20, + "start": 45 + } + ] + } + }, + "object": "608060405234801561001057600080fd5b5073__$e1bfcf6041ff8ba6df21245bab8ae07a55$__63856c67f473__$e1bfcf6041ff8ba6df21245bab8ae07a55$__63a3a79ad76040518163ffffffff1660e01b8152600401602060405180830381865af4158015610074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100989190610124565b6040518263ffffffff1660e01b81526004016100b49190610160565b60006040518083038186803b1580156100cc57600080fd5b505af41580156100e0573d6000803e3d6000fd5b5050505061017b565b600080fd5b6000819050919050565b610101816100ee565b811461010c57600080fd5b50565b60008151905061011e816100f8565b92915050565b60006020828403121561013a576101396100e9565b5b60006101488482850161010f565b91505092915050565b61015a816100ee565b82525050565b60006020820190506101756000830184610151565b92915050565b603f806101896000396000f3fe6080604052600080fdfea2646970667358221220cb2ee4f824d599c1f160d9867571f972f7aaf7ab2f13b22e78324469179161ce64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH20 0x0 PUSH4 0x856C67F4 PUSH20 0x0 PUSH4 0xA3A79AD7 PUSH1 0x40 MLOAD DUP2 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x74 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x98 SWAP2 SWAP1 PUSH2 0x124 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xB4 SWAP2 SWAP1 PUSH2 0x160 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0xCC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xE0 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH2 0x17B JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x101 DUP2 PUSH2 0xEE JUMP JUMPDEST DUP2 EQ PUSH2 0x10C JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x11E DUP2 PUSH2 0xF8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x13A JUMPI PUSH2 0x139 PUSH2 0xE9 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x148 DUP5 DUP3 DUP6 ADD PUSH2 0x10F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x15A DUP2 PUSH2 0xEE JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x175 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x151 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x3F DUP1 PUSH2 0x189 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCB 0x2E 0xE4 0xF8 0x24 0xD5 SWAP10 0xC1 CALL PUSH1 0xD9 DUP7 PUSH22 0x71F972F7AAF7AB2F13B22E78324469179161CE64736F PUSH13 0x63430008130033000000000000 ", + "sourceMap": "161:66:1:-:0;;;180:45;;;;;;;;;;200:5;:8;209:5;:8;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;200:20;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;161:66;;88:117:2;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:351::-;764:6;813:2;801:9;792:7;788:23;784:32;781:119;;;819:79;;:::i;:::-;781:119;939:1;964:64;1020:7;1011:6;1000:9;996:22;964:64;:::i;:::-;954:74;;910:128;694:351;;;;:::o;1051:126::-;1146:24;1164:5;1146:24;:::i;:::-;1141:3;1134:37;1051:126;;:::o;1183:238::-;1284:4;1322:2;1311:9;1307:18;1299:26;;1335:79;1411:1;1400:9;1396:17;1387:6;1335:79;:::i;:::-;1183:238;;;;:::o;161:66:1:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": {}, + "generatedSources": [], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600080fdfea2646970667358221220cb2ee4f824d599c1f160d9867571f972f7aaf7ab2f13b22e78324469179161ce64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xCB 0x2E 0xE4 0xF8 0x24 0xD5 SWAP10 0xC1 CALL PUSH1 0xD9 DUP7 PUSH22 0x71F972F7AAF7AB2F13B22E78324469179161CE64736F PUSH13 0x63430008130033000000000000 ", + "sourceMap": "161:66:1:-:0;;;;;" + }, + "methodIdentifiers": {} + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lock.sol\":\"WAAIT\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lib.sol\":{\"keccak256\":\"0xa603982d3548357d3f670ef1e530ec4c88b2366e7c63083d7300aa1acb41c69e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://8501dd49427e34bbe12af6be9b9d8a27e68be1c2738ed8fe5ef426a1280626d3\",\"dweb:/ipfs/QmfTfRDYPhnZqRHECEiBEhddcgL9TdJGUjAs4jYMiPLYQx\"]},\"contracts/Lock.sol\":{\"keccak256\":\"0xd5a5a86500a2d95801a5f0a0d20ff3d97fc4c99d6775cb10f4960f7979bc41c4\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://fe81231f68068bf4ef391ac34c7642467046c9b05d99f231eb41db10c760fc9e\",\"dweb:/ipfs/QmSv2WJtuzFT6EsNiukMCi2sWTVPJ4orMVKJF22zEL6x1p\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/libraries/deployed_addresses.json b/packages/core/test/mocks/verify/libraries/deployed_addresses.json new file mode 100644 index 0000000000..392de44876 --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/deployed_addresses.json @@ -0,0 +1,4 @@ +{ + "LockModule#UUUUU": "0x0B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F", + "LockModule#WAAIT": "0xb55CE3EEF69AE60CadcF500b3c696351E92216f4" +} diff --git a/packages/core/test/mocks/verify/libraries/journal.jsonl b/packages/core/test/mocks/verify/libraries/journal.jsonl new file mode 100644 index 0000000000..93714cf38d --- /dev/null +++ b/packages/core/test/mocks/verify/libraries/journal.jsonl @@ -0,0 +1,12 @@ + +{"chainId":11155111,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#UUUUU","constructorArgs":[],"contractName":"UUUUU","dependencies":[],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#UUUUU","futureType":"NAMED_ARTIFACT_LIBRARY_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#UUUUU","networkInteraction":{"data":"0x61023a610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100405760003560e01c8063856c67f414610045578063a3a79ad71461006e575b600080fd5b81801561005157600080fd5b5061006c60048036038101906100679190610120565b61008c565b005b6100766100d8565b604051610083919061015c565b60405180910390f35b7fbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd256100b56100d8565b826100c091906101a6565b6040516100cd91906101e9565b60405180910390a150565b6000641cbe86ba4d905090565b600080fd5b6000819050919050565b6100fd816100ea565b811461010857600080fd5b50565b60008135905061011a816100f4565b92915050565b600060208284031215610136576101356100e5565b5b60006101448482850161010b565b91505092915050565b610156816100ea565b82525050565b6000602082019050610171600083018461014d565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101b1826100ea565b91506101bc836100ea565b92508282019050808211156101d4576101d3610177565b5b92915050565b6101e3816100ea565b82525050565b60006020820190506101fe60008301846101da565b9291505056fea2646970667358221220c15d1d30c7e4fcaa2bcd8092153ba13d28b770b6e90531af7317221cc4a474dd64736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#UUUUU","networkInteractionId":1,"nonce":20,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1194885894"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xf645bc9bbbb2d7a595b985877a0665da1a75688e246aef8bdebf16ba39e64874"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#UUUUU","hash":"0xf645bc9bbbb2d7a595b985877a0665da1a75688e246aef8bdebf16ba39e64874","networkInteractionId":1,"receipt":{"blockHash":"0xf4ea82d7d514e41cf2e7bc7e2b7aefb7816674646340f54ab939b0489dd49dca","blockNumber":4792250,"contractAddress":"0x0B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#UUUUU","result":{"address":"0x0B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#WAAIT","constructorArgs":[],"contractName":"WAAIT","dependencies":["LockModule#UUUUU"],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#WAAIT","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{"UUUUU":"0x0B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F"},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#WAAIT","networkInteraction":{"data":"0x608060405234801561001057600080fd5b50730B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F63856c67f4730B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F63a3a79ad76040518163ffffffff1660e01b8152600401602060405180830381865af4158015610074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100989190610124565b6040518263ffffffff1660e01b81526004016100b49190610160565b60006040518083038186803b1580156100cc57600080fd5b505af41580156100e0573d6000803e3d6000fd5b5050505061017b565b600080fd5b6000819050919050565b610101816100ee565b811461010c57600080fd5b50565b60008151905061011e816100f8565b92915050565b60006020828403121561013a576101396100e9565b5b60006101488482850161010f565b91505092915050565b61015a816100ee565b82525050565b60006020820190506101756000830184610151565b92915050565b603f806101896000396000f3fe6080604052600080fdfea2646970667358221220cb2ee4f824d599c1f160d9867571f972f7aaf7ab2f13b22e78324469179161ce64736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#WAAIT","networkInteractionId":1,"nonce":21,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1223984020"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x0465663b8bd048aa61f5eb89bf0bc2ac2457a93304c404482fa1e7155f981344"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#WAAIT","hash":"0x0465663b8bd048aa61f5eb89bf0bc2ac2457a93304c404482fa1e7155f981344","networkInteractionId":1,"receipt":{"blockHash":"0xe5f75498ddfd0c6e2f72096c3f6abc52dbb0d521c465ac4c017ab159add6910d","blockNumber":4792255,"contractAddress":"0xb55CE3EEF69AE60CadcF500b3c696351E92216f4","logs":[{"address":"0xb55CE3EEF69AE60CadcF500b3c696351E92216f4","data":"0x000000000000000000000000000000000000000000000000000000397d0d749a","logIndex":14,"topics":["0xbbd59f58682e05b023d29551eca4f8ef7fb7413f5dc80469ddef4d332586fd25"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#WAAIT","result":{"address":"0xb55CE3EEF69AE60CadcF500b3c696351E92216f4","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/no-contracts/journal.jsonl b/packages/core/test/mocks/verify/no-contracts/journal.jsonl new file mode 100644 index 0000000000..4ae1fb88fa --- /dev/null +++ b/packages/core/test/mocks/verify/no-contracts/journal.jsonl @@ -0,0 +1,2 @@ + +{"chainId":1,"type":"DEPLOYMENT_INITIALIZE"} diff --git a/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json b/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json new file mode 100644 index 0000000000..cc601cb6fb --- /dev/null +++ b/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/a119b7bb4b3dd21e4ae94d5054092087.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json b/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json new file mode 100644 index 0000000000..81cc1e2c3b --- /dev/null +++ b/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json @@ -0,0 +1,74 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Lock", + "sourceName": "contracts/Lock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json new file mode 100644 index 0000000000..b757a976d6 --- /dev/null +++ b/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json @@ -0,0 +1,3792 @@ +{ + "id": "a119b7bb4b3dd21e4ae94d5054092087", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/Lock.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract Lock {\n uint public unlockTime;\n address payable public owner;\n\n event Withdrawal(uint amount, uint when);\n\n constructor(uint _unlockTime) payable {\n require(\n block.timestamp < _unlockTime,\n \"Unlock time should be in the future\"\n );\n\n unlockTime = _unlockTime;\n owner = payable(msg.sender);\n }\n\n function withdraw() public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n require(block.timestamp >= unlockTime, \"You can't withdraw yet\");\n require(msg.sender == owner, \"You aren't the owner\");\n\n emit Withdrawal(address(this).balance, block.timestamp);\n\n owner.transfer(address(this).balance);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/Lock.sol": { + "ast": { + "absolutePath": "contracts/Lock.sol", + "exportedSymbols": { + "Lock": [ + 78 + ] + }, + "id": 79, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Lock", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 78, + "linearizedBaseContracts": [ + 78 + ], + "name": "Lock", + "nameLocation": "149:4:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "251c1aa3", + "id": 3, + "mutability": "mutable", + "name": "unlockTime", + "nameLocation": "170:10:0", + "nodeType": "VariableDeclaration", + "scope": 78, + "src": "158:22:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "158:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "8da5cb5b", + "id": 5, + "mutability": "mutable", + "name": "owner", + "nameLocation": "207:5:0", + "nodeType": "VariableDeclaration", + "scope": 78, + "src": "184:28:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + "typeName": { + "id": 4, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "184:15:0", + "stateMutability": "payable", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "bf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93", + "id": 11, + "name": "Withdrawal", + "nameLocation": "223:10:0", + "nodeType": "EventDefinition", + "parameters": { + "id": 10, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nameLocation": "239:6:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "234:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "234:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9, + "indexed": false, + "mutability": "mutable", + "name": "when", + "nameLocation": "252:4:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "247:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "247:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "233:24:0" + }, + "src": "217:41:0" + }, + { + "body": { + "id": 36, + "nodeType": "Block", + "src": "300:170:0", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 20, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 17, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "321:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "327:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "321:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 19, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "339:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "321:29:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574757265", + "id": 21, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "358:37:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + }, + "value": "Unlock time should be in the future" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + } + ], + "id": 16, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "306:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 22, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "306:95:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 23, + "nodeType": "ExpressionStatement", + "src": "306:95:0" + }, + { + "expression": { + "id": 26, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "408:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 25, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "421:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "408:24:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 27, + "nodeType": "ExpressionStatement", + "src": "408:24:0" + }, + { + "expression": { + "id": 34, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 28, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "438:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 31, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "454:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 32, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "458:6:0", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "454:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 30, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "446:8:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 29, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "446:8:0", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 33, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "446:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "438:27:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 35, + "nodeType": "ExpressionStatement", + "src": "438:27:0" + } + ] + }, + "id": 37, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13, + "mutability": "mutable", + "name": "_unlockTime", + "nameLocation": "279:11:0", + "nodeType": "VariableDeclaration", + "scope": 37, + "src": "274:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "274:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "273:18:0" + }, + "returnParameters": { + "id": 15, + "nodeType": "ParameterList", + "parameters": [], + "src": "300:0:0" + }, + "scope": 78, + "src": "262:208:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 76, + "nodeType": "Block", + "src": "501:437:0", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 44, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 41, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "713:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 42, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "719:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "713:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 43, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "732:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "713:29:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "id": 45, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "744:24:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + }, + "value": "You can't withdraw yet" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + } + ], + "id": 40, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "705:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 46, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "705:64:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 47, + "nodeType": "ExpressionStatement", + "src": "705:64:0" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 52, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 49, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "783:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "787:6:0", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "783:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 51, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "797:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "783:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "id": 53, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "804:22:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + }, + "value": "You aren't the owner" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + } + ], + "id": 48, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "775:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 54, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "775:52:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 55, + "nodeType": "ExpressionStatement", + "src": "775:52:0" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 59, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "858:4:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + ], + "id": 58, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "850:7:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 57, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "850:7:0", + "typeDescriptions": {} + } + }, + "id": 60, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "850:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "864:7:0", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "850:21:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 62, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "873:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "879:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "873:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 56, + "name": "Withdrawal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11, + "src": "839:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "839:50:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 65, + "nodeType": "EmitStatement", + "src": "834:55:0" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 71, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "919:4:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + ], + "id": 70, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "911:7:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 69, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "911:7:0", + "typeDescriptions": {} + } + }, + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "911:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 73, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "925:7:0", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "911:21:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 66, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "896:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 68, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "902:8:0", + "memberName": "transfer", + "nodeType": "MemberAccess", + "src": "896:14:0", + "typeDescriptions": { + "typeIdentifier": "t_function_transfer_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 74, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "896:37:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 75, + "nodeType": "ExpressionStatement", + "src": "896:37:0" + } + ] + }, + "functionSelector": "3ccfd60b", + "id": 77, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "483:8:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 38, + "nodeType": "ParameterList", + "parameters": [], + "src": "491:2:0" + }, + "returnParameters": { + "id": 39, + "nodeType": "ParameterList", + "parameters": [], + "src": "501:0:0" + }, + "scope": 78, + "src": "474:464:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 79, + "src": "140:800:0", + "usedErrors": [] + } + ], + "src": "39:902:0" + }, + "id": 0 + } + }, + "contracts": { + "contracts/Lock.sol": { + "Lock": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_37": { + "entryPoint": null, + "id": 37, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 240, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack": { + "entryPoint": 381, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 416, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 285, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 186, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 181, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413": { + "entryPoint": 302, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 196, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2248:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:1", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:1" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:1" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:1", + "type": "" + } + ], + "src": "7:75:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:1" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:1" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:1", + "type": "" + } + ], + "src": "334:77:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:1" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:1" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:1" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:1" + }, + "nodeType": "YulIf", + "src": "470:63:1" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:1", + "type": "" + } + ], + "src": "417:122:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:1", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:1" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:1" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:1" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:1" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:1" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:1" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:1", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:1", + "type": "" + } + ], + "src": "545:143:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:274:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "817:83:1", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "819:77:1" + }, + "nodeType": "YulFunctionCall", + "src": "819:79:1" + }, + "nodeType": "YulExpressionStatement", + "src": "819:79:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "792:7:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "801:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "788:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "788:23:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "813:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "784:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "784:32:1" + }, + "nodeType": "YulIf", + "src": "781:119:1" + }, + { + "nodeType": "YulBlock", + "src": "910:128:1", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "925:15:1", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "939:1:1", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "929:6:1", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "954:74:1", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1000:9:1" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1011:6:1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "996:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "996:22:1" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1020:7:1" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "964:31:1" + }, + "nodeType": "YulFunctionCall", + "src": "964:64:1" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "954:6:1" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "741:9:1", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "752:7:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "764:6:1", + "type": "" + } + ], + "src": "694:351:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1147:73:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1164:3:1" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1169:6:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1157:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1157:19:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1157:19:1" + }, + { + "nodeType": "YulAssignment", + "src": "1185:29:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1204:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1209:4:1", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1200:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1200:14:1" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1185:11:1" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1119:3:1", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1124:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1135:11:1", + "type": "" + } + ], + "src": "1051:169:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1332:116:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1354:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1362:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1350:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1350:14:1" + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1366:34:1", + "type": "", + "value": "Unlock time should be in the fut" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1343:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1343:58:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1343:58:1" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1422:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1430:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1418:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1418:15:1" + }, + { + "hexValue": "757265", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1435:5:1", + "type": "", + "value": "ure" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1411:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1411:30:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1411:30:1" + } + ] + }, + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1324:6:1", + "type": "" + } + ], + "src": "1226:222:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1600:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1610:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1676:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1681:2:1", + "type": "", + "value": "35" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1617:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "1617:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1610:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1782:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulIdentifier", + "src": "1693:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "1693:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1693:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "1795:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1806:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1811:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1802:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1802:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1795:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1588:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1596:3:1", + "type": "" + } + ], + "src": "1454:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1997:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2007:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2019:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2030:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2015:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2015:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2007:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2054:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2065:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2050:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2050:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2073:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2079:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2069:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2069:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2043:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2043:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2043:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "2099:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2233:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2107:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "2107:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2099:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1977:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1992:4:1", + "type": "" + } + ], + "src": "1826:419:1" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(memPtr) {\n\n mstore(add(memPtr, 0), \"Unlock time should be in the fut\")\n\n mstore(add(memPtr, 32), \"ure\")\n\n }\n\n function abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 35)\n store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(pos)\n end := add(pos, 64)\n }\n\n function abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x5D8 CODESIZE SUB DUP1 PUSH2 0x5D8 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x25 SWAP2 SWAP1 PUSH2 0xF0 JUMP JUMPDEST DUP1 TIMESTAMP LT PUSH2 0x67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5E SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP CALLER PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP PUSH2 0x1C0 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xCD DUP2 PUSH2 0xBA JUMP JUMPDEST DUP2 EQ PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xEA DUP2 PUSH2 0xC4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106 JUMPI PUSH2 0x105 PUSH2 0xB5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x114 DUP5 DUP3 DUP6 ADD PUSH2 0xDB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x556E6C6F636B2074696D652073686F756C6420626520696E2074686520667574 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7572650000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18A PUSH1 0x23 DUP4 PUSH2 0x11D JUMP JUMPDEST SWAP2 POP PUSH2 0x195 DUP3 PUSH2 0x12E JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1B9 DUP2 PUSH2 0x17D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x409 DUP1 PUSH2 0x1CF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:0:-:0;;;262:208;;;;;;;;;;;;;;;;;;;;;:::i;:::-;339:11;321:15;:29;306:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;421:11;408:10;:24;;;;454:10;438:5;;:27;;;;;;;;;;;;;;;;;;262:208;140:800;;88:117:1;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:351::-;764:6;813:2;801:9;792:7;788:23;784:32;781:119;;;819:79;;:::i;:::-;781:119;939:1;964:64;1020:7;1011:6;1000:9;996:22;964:64;:::i;:::-;954:74;;910:128;694:351;;;;:::o;1051:169::-;1135:11;1169:6;1164:3;1157:19;1209:4;1204:3;1200:14;1185:29;;1051:169;;;;:::o;1226:222::-;1366:34;1362:1;1354:6;1350:14;1343:58;1435:5;1430:2;1422:6;1418:15;1411:30;1226:222;:::o;1454:366::-;1596:3;1617:67;1681:2;1676:3;1617:67;:::i;:::-;1610:74;;1693:93;1782:3;1693:93;:::i;:::-;1811:2;1806:3;1802:12;1795:19;;1454:366;;;:::o;1826:419::-;1992:4;2030:2;2019:9;2015:18;2007:26;;2079:9;2073:4;2069:20;2065:1;2054:9;2050:17;2043:47;2107:131;2233:4;2107:131;:::i;:::-;2099:139;;1826:419;;;:::o;140:800:0:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@owner_5": { + "entryPoint": 523, + "id": 5, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@unlockTime_3": { + "entryPoint": 140, + "id": 3, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@withdraw_77": { + "entryPoint": 146, + "id": 77, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_encode_t_address_payable_to_t_address_payable_fromStack": { + "entryPoint": 663, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack": { + "entryPoint": 763, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack": { + "entryPoint": 871, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 571, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed": { + "entryPoint": 678, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 798, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 906, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 938, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 705, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_address_payable": { + "entryPoint": 645, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 613, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 561, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8": { + "entryPoint": 722, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a": { + "entryPoint": 830, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:3550:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:1", + "type": "" + } + ], + "src": "7:77:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:1" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:1" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:1", + "type": "" + } + ], + "src": "90:118:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:1" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:1", + "type": "" + } + ], + "src": "214:222:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "487:81:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "497:65:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "512:5:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "519:42:1", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "508:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "508:54:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "497:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "469:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "479:7:1", + "type": "" + } + ], + "src": "442:126:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "627:51:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "637:35:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "666:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "648:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "648:24:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "637:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_address_payable", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "609:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "619:7:1", + "type": "" + } + ], + "src": "574:104:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "765:61:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "782:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "813:5:1" + } + ], + "functionName": { + "name": "cleanup_t_address_payable", + "nodeType": "YulIdentifier", + "src": "787:25:1" + }, + "nodeType": "YulFunctionCall", + "src": "787:32:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "775:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "775:45:1" + }, + "nodeType": "YulExpressionStatement", + "src": "775:45:1" + } + ] + }, + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "753:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "760:3:1", + "type": "" + } + ], + "src": "684:142:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "946:140:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "956:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "968:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "979:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "964:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "964:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "956:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1052:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1065:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1076:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1061:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1061:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulIdentifier", + "src": "992:59:1" + }, + "nodeType": "YulFunctionCall", + "src": "992:87:1" + }, + "nodeType": "YulExpressionStatement", + "src": "992:87:1" + } + ] + }, + "name": "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "918:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "930:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "941:4:1", + "type": "" + } + ], + "src": "832:254:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1188:73:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1205:3:1" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1210:6:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1198:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1198:19:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1198:19:1" + }, + { + "nodeType": "YulAssignment", + "src": "1226:29:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1245:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1250:4:1", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1241:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1241:14:1" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1226:11:1" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1160:3:1", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1165:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1176:11:1", + "type": "" + } + ], + "src": "1092:169:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1373:66:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1395:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1403:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1391:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1391:14:1" + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1407:24:1", + "type": "", + "value": "You can't withdraw yet" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1384:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1384:48:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1384:48:1" + } + ] + }, + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1365:6:1", + "type": "" + } + ], + "src": "1267:172:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1591:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1601:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1667:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1672:2:1", + "type": "", + "value": "22" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1608:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "1608:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1601:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1773:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulIdentifier", + "src": "1684:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "1684:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1684:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "1786:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1797:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1793:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1793:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1786:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1579:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1587:3:1", + "type": "" + } + ], + "src": "1445:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1988:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1998:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2010:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2021:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2006:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2006:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1998:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2045:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2056:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2041:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2041:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2064:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2070:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2060:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2060:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2034:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2034:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2034:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "2090:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2224:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2098:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "2098:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2090:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1968:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1983:4:1", + "type": "" + } + ], + "src": "1817:419:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2348:64:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2370:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2378:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2366:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2366:14:1" + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "kind": "string", + "nodeType": "YulLiteral", + "src": "2382:22:1", + "type": "", + "value": "You aren't the owner" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2359:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2359:46:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2359:46:1" + } + ] + }, + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "2340:6:1", + "type": "" + } + ], + "src": "2242:170:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2564:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2574:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2640:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2645:2:1", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2581:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "2581:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2574:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2746:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulIdentifier", + "src": "2657:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "2657:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2657:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "2759:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2770:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2775:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2766:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2766:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2759:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "2552:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2560:3:1", + "type": "" + } + ], + "src": "2418:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2961:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2971:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2983:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2994:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2979:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2979:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2971:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3018:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3029:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3014:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3014:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3037:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3043:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3033:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3033:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3007:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "3007:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3007:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "3063:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3197:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "3071:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "3071:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3063:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2941:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2956:4:1", + "type": "" + } + ], + "src": "2790:419:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3341:206:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3351:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3363:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3374:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3359:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3359:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3351:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3431:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3444:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3455:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3440:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3440:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3387:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "3387:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3387:71:1" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3512:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3525:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3536:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3521:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3521:18:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3468:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "3468:72:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3468:72:1" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3305:9:1", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3317:6:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3325:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3336:4:1", + "type": "" + } + ], + "src": "3215:332:1" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address_payable(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function abi_encode_t_address_payable_to_t_address_payable_fromStack(value, pos) {\n mstore(pos, cleanup_t_address_payable(value))\n }\n\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_payable_to_t_address_payable_fromStack(value0, add(headStart, 0))\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(memPtr) {\n\n mstore(add(memPtr, 0), \"You can't withdraw yet\")\n\n }\n\n function abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 22)\n store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(memPtr) {\n\n mstore(add(memPtr, 0), \"You aren't the owner\")\n\n }\n\n function abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 20)\n store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value1, add(headStart, 32))\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;474:464;;;:::i;:::-;;184:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158:22;;;;:::o;474:464::-;732:10;;713:15;:29;;705:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;797:5;;;;;;;;;;;783:19;;:10;:19;;;775:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;839:50;850:21;873:15;839:50;;;;;;;:::i;:::-;;;;;;;;896:5;;;;;;;;;;;:14;;:37;911:21;896:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;474:464::o;184:28::-;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:126::-;479:7;519:42;512:5;508:54;497:65;;442:126;;;:::o;574:104::-;619:7;648:24;666:5;648:24;:::i;:::-;637:35;;574:104;;;:::o;684:142::-;787:32;813:5;787:32;:::i;:::-;782:3;775:45;684:142;;:::o;832:254::-;941:4;979:2;968:9;964:18;956:26;;992:87;1076:1;1065:9;1061:17;1052:6;992:87;:::i;:::-;832:254;;;;:::o;1092:169::-;1176:11;1210:6;1205:3;1198:19;1250:4;1245:3;1241:14;1226:29;;1092:169;;;;:::o;1267:172::-;1407:24;1403:1;1395:6;1391:14;1384:48;1267:172;:::o;1445:366::-;1587:3;1608:67;1672:2;1667:3;1608:67;:::i;:::-;1601:74;;1684:93;1773:3;1684:93;:::i;:::-;1802:2;1797:3;1793:12;1786:19;;1445:366;;;:::o;1817:419::-;1983:4;2021:2;2010:9;2006:18;1998:26;;2070:9;2064:4;2060:20;2056:1;2045:9;2041:17;2034:47;2098:131;2224:4;2098:131;:::i;:::-;2090:139;;1817:419;;;:::o;2242:170::-;2382:22;2378:1;2370:6;2366:14;2359:46;2242:170;:::o;2418:366::-;2560:3;2581:67;2645:2;2640:3;2581:67;:::i;:::-;2574:74;;2657:93;2746:3;2657:93;:::i;:::-;2775:2;2770:3;2766:12;2759:19;;2418:366;;;:::o;2790:419::-;2956:4;2994:2;2983:9;2979:18;2971:26;;3043:9;3037:4;3033:20;3029:1;3018:9;3014:17;3007:47;3071:131;3197:4;3071:131;:::i;:::-;3063:139;;2790:419;;;:::o;3215:332::-;3336:4;3374:2;3363:9;3359:18;3351:26;;3387:71;3455:1;3444:9;3440:17;3431:6;3387:71;:::i;:::-;3468:72;3536:2;3525:9;3521:18;3512:6;3468:72;:::i;:::-;3215:332;;;;;:::o" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "unlockTime()": "251c1aa3", + "withdraw()": "3ccfd60b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"when\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lock.sol\":\"Lock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lock.sol\":{\"keccak256\":\"0x290d672235b22ec4740c076ad0108b37f5d3073810f5c7d502d90c72591ee9dc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3d74a8be6305243875a1e4bb2c8fcbd29672aa20a3781595cfbee6b743358b6b\",\"dweb:/ipfs/QmVWAacJB7wL7fBhAyvyqJLWDCEL9vMfwEeR3ydxtsprLf\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/success/deployed_addresses.json b/packages/core/test/mocks/verify/success/deployed_addresses.json new file mode 100644 index 0000000000..c9458b58bc --- /dev/null +++ b/packages/core/test/mocks/verify/success/deployed_addresses.json @@ -0,0 +1,3 @@ +{ + "LockModule#Lock": "0x5FbDB2315678afecb367f032d93F642f64180aa3" +} diff --git a/packages/core/test/mocks/verify/success/journal.jsonl b/packages/core/test/mocks/verify/success/journal.jsonl new file mode 100644 index 0000000000..960fcf146b --- /dev/null +++ b/packages/core/test/mocks/verify/success/journal.jsonl @@ -0,0 +1,7 @@ + +{"chainId":1,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Lock","hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e","networkInteractionId":1,"receipt":{"blockHash":"0xb4d7a7cb1e9c67a4fa86f0ff358243f756201a7e2200f45b9c1b0d97c251151a","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json b/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json new file mode 100644 index 0000000000..c9458b58bc --- /dev/null +++ b/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json @@ -0,0 +1,3 @@ +{ + "LockModule#Lock": "0x5FbDB2315678afecb367f032d93F642f64180aa3" +} diff --git a/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl b/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl new file mode 100644 index 0000000000..f86e188c8e --- /dev/null +++ b/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl @@ -0,0 +1,7 @@ + +{"chainId":123456789,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Lock","hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e","networkInteractionId":1,"receipt":{"blockHash":"0xb4d7a7cb1e9c67a4fa86f0ff358243f756201a7e2200f45b9c1b0d97c251151a","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/readEventArgument.ts b/packages/core/test/readEventArgument.ts index 0a20503dda..a59b2bdc63 100644 --- a/packages/core/test/readEventArgument.ts +++ b/packages/core/test/readEventArgument.ts @@ -6,20 +6,17 @@ import { buildModule } from "../src/build-module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; import { validateReadEventArgument } from "../src/internal/validation/futures/validateReadEventArgument"; -import { assertValidationError, setupMockArtifactResolver } from "./helpers"; +import { + assertValidationError, + fakeArtifact, + setupMockArtifactResolver, +} from "./helpers"; describe("Read event argument", () => { const exampleAddress = "0x1F98431c8aD98523631AE4a59f267346ea31F984"; describe("creating modules with it", () => { it("should support reading arguments from all the futures that can emit them", () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const mod = buildModule("Module1", (m) => { const contract = m.contract("Contract"); const contractFromArtifact = m.contract( @@ -286,15 +283,13 @@ m.readEventArgument(..., { id: "MyUniqueId"})` }); it("should not validate a non-existant event", async () => { - const fakeArtifact: Artifact = { - abi: [], + const fakerArtifact: Artifact = { + ...fakeArtifact, contractName: "Another", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.readEventArgument(another, "test", "arg"); return { another }; diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/core/test/reconciliation/helpers.ts index fc2dd54d8c..4b3d91388e 100644 --- a/packages/core/test/reconciliation/helpers.ts +++ b/packages/core/test/reconciliation/helpers.ts @@ -21,6 +21,7 @@ export const twoAddress = "0x2222222222222222222222222222222222222222"; export const mockArtifact = { contractName: "Contract1", + sourceName: "", bytecode: "0x", linkReferences: {}, abi: [], diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 437da16460..1f3474c716 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -434,6 +434,7 @@ describe("Reconciliation", () => { abi: [], bytecode: "0xaaaaaa", contractName: "Contract1", + sourceName: "", linkReferences: {}, }, }; @@ -468,6 +469,7 @@ describe("Reconciliation", () => { abi: [], bytecode: "0xaaaaaa", contractName: "Contract1", + sourceName: "", linkReferences: {}, }, }; @@ -477,6 +479,7 @@ describe("Reconciliation", () => { abi: [], bytecode: "0xbbbbbb", contractName: "Contract1", + sourceName: "", linkReferences: {}, }, }; @@ -525,6 +528,7 @@ describe("Reconciliation", () => { abi: [], bytecode: mainnetWethBytecode, contractName: "Contract1", + sourceName: "", linkReferences: {}, }, }; @@ -534,6 +538,7 @@ describe("Reconciliation", () => { abi: [], bytecode: mainnetWethWithModifiedMetadata, contractName: "Contract1", + sourceName: "", linkReferences: {}, }, }; diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index d62d7d6d90..7fc7161896 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -16,6 +16,7 @@ import { FutureType } from "../src/types/module"; import { assertInstanceOf, assertValidationError, + fakeArtifact, setupMockArtifactResolver, } from "./helpers"; @@ -526,15 +527,13 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a non-existant function", async () => { - const fakeArtifact: Artifact = { - abi: [], + const fakerArtifact: Artifact = { + ...fakeArtifact, contractName: "Another", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "test"); return { another }; @@ -556,7 +555,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a static call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -572,13 +572,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "inc", [1, 2]); return { another }; @@ -600,7 +597,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate an overloaded call with wrong number of arguments", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -635,12 +633,10 @@ m.staticCall(..., { id: "MyUniqueId"})` }, ], contractName: "Another", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "inc(bool,uint256)", [1, 2, 3]); return { another }; @@ -662,7 +658,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a non-readonly function", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -678,13 +675,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "inc", [1]); return { another }; @@ -706,7 +700,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a nameOrIndex that is invalid (nonexistent name)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -722,13 +717,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "inc", [], "a"); return { another }; @@ -750,7 +742,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a nameOrIndex that is invalid (out of range)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [], @@ -766,13 +759,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); m.staticCall(another, "inc", [], 2); return { another }; @@ -794,13 +784,6 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p"); @@ -825,7 +808,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -841,9 +825,6 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -861,7 +842,7 @@ m.staticCall(..., { id: "MyUniqueId"})` await assert.isFulfilled( validateNamedStaticCall( future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), + setupMockArtifactResolver({ Another: fakerArtifact }), {}, [] ) @@ -869,13 +850,6 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a missing module parameter (deeply nested)", async () => { - const fakeArtifact: Artifact = { - abi: [], - contractName: "", - bytecode: "", - linkReferences: {}, - }; - const module = buildModule("Module1", (m) => { const another = m.contract("Another", []); const p = m.getParameter("p"); @@ -902,7 +876,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -918,9 +893,6 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { @@ -940,7 +912,7 @@ m.staticCall(..., { id: "MyUniqueId"})` await assert.isFulfilled( validateNamedStaticCall( future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), + setupMockArtifactResolver({ Another: fakerArtifact }), {}, [] ) @@ -948,7 +920,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate a negative account index", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -964,13 +937,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); const account = m.getAccount(-1); m.staticCall(another, "inc", [1], 0, { from: account }); @@ -993,7 +963,8 @@ m.staticCall(..., { id: "MyUniqueId"})` }); it("should not validate an account index greater than the number of available accounts", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -1009,13 +980,10 @@ m.staticCall(..., { id: "MyUniqueId"})` type: "function", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const module = buildModule("Module1", (m) => { - const another = m.contract("Another", fakeArtifact, []); + const another = m.contract("Another", fakerArtifact, []); const account = m.getAccount(1); m.staticCall(another, "inc", [1], 0, { from: account }); diff --git a/packages/core/test/types/deployment-loader.ts b/packages/core/test/types/deployment-loader.ts index b270d5458b..2507e2d643 100644 --- a/packages/core/test/types/deployment-loader.ts +++ b/packages/core/test/types/deployment-loader.ts @@ -12,7 +12,9 @@ describe("DeploymentLoaderImpls", function () { it("Shouldn't have any property apart from the ones defined in the Deployment loader interface", function () { const _implementation: ExactInterface< DeploymentLoader, - FileDeploymentLoader + // we omit readBuildInfo as it is a known addition to file deployment loader + // above the DeploylmentLoader interface + Omit > = new FileDeploymentLoader("./example"); assert.isDefined(_implementation); diff --git a/packages/core/test/useModule.ts b/packages/core/test/useModule.ts index 9f3520d68d..c39b7b08fa 100644 --- a/packages/core/test/useModule.ts +++ b/packages/core/test/useModule.ts @@ -5,7 +5,7 @@ import { Artifact, DeploymentResultType } from "../src"; import { buildModule } from "../src/build-module"; import { validate } from "../src/internal/validation/validate"; -import { setupMockArtifactResolver } from "./helpers"; +import { fakeArtifact, setupMockArtifactResolver } from "./helpers"; describe("useModule", () => { it("should be able to use a submodule", () => { @@ -73,7 +73,8 @@ describe("useModule", () => { describe("validation", () => { it("should validate nested module parameters", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -87,9 +88,6 @@ describe("useModule", () => { type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const submodule = buildModule("Submodule1", (m) => { @@ -133,9 +131,9 @@ describe("useModule", () => { validate( moduleWithSubmodule, setupMockArtifactResolver({ - Contract1: fakeArtifact, - Contract2: fakeArtifact, - Contract3: fakeArtifact, + Contract1: fakerArtifact, + Contract2: fakerArtifact, + Contract3: fakerArtifact, }), moduleParams, [] @@ -144,7 +142,8 @@ describe("useModule", () => { }); it("should not validate missing module parameters is deeply nested submodules", async () => { - const fakeArtifact: Artifact = { + const fakerArtifact: Artifact = { + ...fakeArtifact, abi: [ { inputs: [ @@ -158,9 +157,6 @@ describe("useModule", () => { type: "constructor", }, ], - contractName: "", - bytecode: "", - linkReferences: {}, }; const submodule = buildModule("Submodule1", (m) => { @@ -200,9 +196,9 @@ describe("useModule", () => { const result = await validate( moduleWithSubmodule, setupMockArtifactResolver({ - Contract1: fakeArtifact, - Contract2: fakeArtifact, - Contract3: fakeArtifact, + Contract1: fakerArtifact, + Contract2: fakerArtifact, + Contract3: fakerArtifact, }), moduleParams, [] diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts new file mode 100644 index 0000000000..ee59ad52e2 --- /dev/null +++ b/packages/core/test/verify.ts @@ -0,0 +1,128 @@ +import { assert } from "chai"; +import path from "path"; + +import { VerifyResult, getVerificationInformation } from "../src"; + +describe("verify", () => { + it("should not verify an unitialized deployment", async () => { + await assert.isRejected( + getVerificationInformation("test").next(), + /IGN1000: Cannot verify contracts for nonexistant deployment at test/ + ); + }); + + it("should not verify a deployment that did not deploy any contracts", async () => { + const deploymentDir = path.join( + __dirname, + "mocks", + "verify", + "no-contracts" + ); + + await assert.isRejected( + getVerificationInformation(deploymentDir).next(), + /IGN1001: Cannot verify deployment/ + ); + }); + + it("should not verify a deployment deployed to an unsupported chain", async () => { + const deploymentDir = path.join( + __dirname, + "mocks", + "verify", + "unsupported-chain" + ); + + await assert.isRejected( + getVerificationInformation(deploymentDir).next(), + /IGN1002: Verification not natively supported for chainId 123456789\. Please use a custom chain configuration to add support\./ + ); + }); + + it("should yield a verify result", async () => { + const expectedResult: VerifyResult = [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }, + { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + compilerVersion: "v0.8.19+commit.7dd6d404", + sourceCode: `{"language":"Solidity","sources":{"contracts/Lock.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.9;\\n\\n// Uncomment this line to use console.log\\n// import \\"hardhat/console.sol\\";\\n\\ncontract Lock {\\n uint public unlockTime;\\n address payable public owner;\\n\\n event Withdrawal(uint amount, uint when);\\n\\n constructor(uint _unlockTime) payable {\\n require(\\n block.timestamp < _unlockTime,\\n \\"Unlock time should be in the future\\"\\n );\\n\\n unlockTime = _unlockTime;\\n owner = payable(msg.sender);\\n }\\n\\n function withdraw() public {\\n // Uncomment this line, and the import of \\"hardhat/console.sol\\", to print a log in your terminal\\n // console.log(\\"Unlock time is %o and block timestamp is %o\\", unlockTime, block.timestamp);\\n\\n require(block.timestamp >= unlockTime, \\"You can't withdraw yet\\");\\n require(msg.sender == owner, \\"You aren't the owner\\");\\n\\n emit Withdrawal(address(this).balance, block.timestamp);\\n\\n owner.transfer(address(this).balance);\\n }\\n}\\n"}},"settings":{"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}}`, + name: "contracts/Lock.sol:Lock", + args: "00000000000000000000000000000000000000000000000000000000767d1650", + }, + ]; + + const deploymentDir = path.join(__dirname, "mocks", "verify", "success"); + + const result = (await getVerificationInformation(deploymentDir).next()) + .value; + + assert.deepEqual(result, expectedResult); + }); + + it("should yield a verify result with a custom chain", async () => { + const expectedResult: VerifyResult = [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "overridden", + browserURL: "also overridden", + }, + }, + { + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + compilerVersion: "v0.8.19+commit.7dd6d404", + sourceCode: `{"language":"Solidity","sources":{"contracts/Lock.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.9;\\n\\n// Uncomment this line to use console.log\\n// import \\"hardhat/console.sol\\";\\n\\ncontract Lock {\\n uint public unlockTime;\\n address payable public owner;\\n\\n event Withdrawal(uint amount, uint when);\\n\\n constructor(uint _unlockTime) payable {\\n require(\\n block.timestamp < _unlockTime,\\n \\"Unlock time should be in the future\\"\\n );\\n\\n unlockTime = _unlockTime;\\n owner = payable(msg.sender);\\n }\\n\\n function withdraw() public {\\n // Uncomment this line, and the import of \\"hardhat/console.sol\\", to print a log in your terminal\\n // console.log(\\"Unlock time is %o and block timestamp is %o\\", unlockTime, block.timestamp);\\n\\n require(block.timestamp >= unlockTime, \\"You can't withdraw yet\\");\\n require(msg.sender == owner, \\"You aren't the owner\\");\\n\\n emit Withdrawal(address(this).balance, block.timestamp);\\n\\n owner.transfer(address(this).balance);\\n }\\n}\\n"}},"settings":{"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}}`, + name: "contracts/Lock.sol:Lock", + args: "00000000000000000000000000000000000000000000000000000000767d1650", + }, + ]; + + const deploymentDir = path.join(__dirname, "mocks", "verify", "success"); + + const result = ( + await getVerificationInformation(deploymentDir, [ + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "overridden", + browserURL: "also overridden", + }, + }, + ]).next() + ).value; + + assert.deepEqual(result, expectedResult); + }); + + it("should yield a verify result for contract with libraries", async () => { + const librariesResult = { + "contracts/Lib.sol": { + UUUUU: "0x0B014cb3B1AF9F45123195B37538Fb9dB6F5eF5F", + }, + }; + + const deploymentDir = path.join(__dirname, "mocks", "verify", "libraries"); + + let success: boolean = false; + for await (const [, info] of getVerificationInformation(deploymentDir)) { + if (info.name === "contracts/Lock.sol:WAAIT") { + const librariesOutput = JSON.parse(info.sourceCode).settings.libraries; + + assert.deepEqual(librariesOutput, librariesResult); + success = true; + break; + } + } + + assert.isTrue(success); + }); +}); diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 6d2578ed62..44ca6f673a 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -89,6 +89,7 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-verify": "^2.0.1", "hardhat": "^2.18.0" }, "dependencies": { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 05cc917ec9..ce17dca25d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,4 +1,6 @@ import "@nomicfoundation/hardhat-ethers"; +import "@nomicfoundation/hardhat-verify"; +import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; import { DeploymentParameters, IgnitionError, @@ -11,7 +13,10 @@ import path from "path"; import "./type-extensions"; import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; +import { getApiKeyAndUrls } from "./utils/getApiKeyAndUrls"; import { resolveDeploymentId } from "./utils/resolve-deployment-id"; +import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; +import { verifyEtherscanContract } from "./utils/verifyEtherscanContract"; /* ignition config defaults */ const IGNITION_DIR = "ignition"; @@ -58,6 +63,7 @@ ignitionScope "A relative path to a JSON file to use for the module parameters" ) .addOptionalParam("deploymentId", "Set the id of the deployment") + .addFlag("verify", "Verify the deployment on Etherscan") .setDescription("Deploy a module to the specified network") .setAction( async ( @@ -65,13 +71,16 @@ ignitionScope modulePath, parameters: parametersInput, deploymentId: givenDeploymentId, + verify, }: { modulePath: string; parameters?: string; deploymentId: string | undefined; + verify: boolean; }, hre ) => { + const { default: chalk } = await import("chalk"); const { default: Prompt } = await import("prompts"); const { deploy } = await import("@nomicfoundation/ignition-core"); @@ -80,9 +89,19 @@ ignitionScope ); const { loadModule } = await import("./load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); - const { shouldBeHardhatPluginError } = await import( - "./utils/shouldBeHardhatPluginError" - ); + + if (verify) { + if ( + hre.config.etherscan === undefined || + hre.config.etherscan.apiKey === undefined || + hre.config.etherscan.apiKey === "" + ) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No etherscan API key configured" + ); + } + } const chainId = Number( await hre.network.provider.request({ @@ -141,7 +160,7 @@ ignitionScope const executionEventListener = new PrettyEventHandler(); try { - await deploy({ + const result = await deploy({ config: hre.config.ignition, provider: hre.network.provider, executionEventListener, @@ -151,6 +170,17 @@ ignitionScope deploymentParameters: parameters ?? {}, accounts, }); + + if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { + console.log(""); + console.log(chalk.bold("Verifying deployed contracts")); + console.log(""); + + await hre.run( + { scope: "ignition", task: "verify" }, + { deploymentId } + ); + } } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { throw new NomicLabsHardhatPluginError( @@ -181,9 +211,7 @@ ignitionScope const { loadModule } = await import("./load-module"); const { open } = await import("./utils/open"); - const { shouldBeHardhatPluginError } = await import( - "./utils/shouldBeHardhatPluginError" - ); + const { writeVisualization } = await import( "./visualization/write-visualization" ); @@ -241,9 +269,6 @@ ignitionScope .setDescription("Show the current status of a deployment") .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { const { status } = await import("@nomicfoundation/ignition-core"); - const { shouldBeHardhatPluginError } = await import( - "./utils/shouldBeHardhatPluginError" - ); const deploymentDir = path.join( hre.config.paths.ignition, @@ -283,9 +308,6 @@ ignitionScope const { HardhatArtifactResolver } = await import( "./hardhat-artifact-resolver" ); - const { shouldBeHardhatPluginError } = await import( - "./utils/shouldBeHardhatPluginError" - ); const deploymentDir = path.join( hre.config.paths.ignition, @@ -311,6 +333,85 @@ ignitionScope } ); +ignitionScope + .task("verify") + .addPositionalParam("deploymentId", "The id of the deployment to verify") + .setDescription( + "Verify contracts from a deployment against the configured block explorers" + ) + .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { + const { getVerificationInformation } = await import( + "@nomicfoundation/ignition-core" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + if ( + hre.config.etherscan === undefined || + hre.config.etherscan.apiKey === undefined || + hre.config.etherscan.apiKey === "" + ) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No etherscan API key configured" + ); + } + + try { + for await (const [ + chainConfig, + contractInfo, + ] of getVerificationInformation( + deploymentDir, + hre.config.etherscan.customChains + )) { + const apiKeyAndUrls = getApiKeyAndUrls( + hre.config.etherscan.apiKey, + chainConfig + ); + + const instance = new Etherscan(...apiKeyAndUrls); + + console.log( + `Verifying contract "${contractInfo.name}" for network ${chainConfig.network}...` + ); + + const result = await verifyEtherscanContract(instance, contractInfo); + + if (result.type === "success") { + console.log( + `Successfully verified contract "${contractInfo.name}" for network ${chainConfig.network}:\n - ${result.contractURL}` + ); + console.log(""); + } else { + if (/already verified/gi.test(result.reason.message)) { + const contractURL = instance.getContractUrl(contractInfo.address); + console.log( + `Contract ${contractInfo.name} already verified on network ${chainConfig.network}:\n - ${contractURL}` + ); + console.log(""); + continue; + } else { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + result.reason.message + ); + } + } + } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + }); + function resolveParametersFromModuleName( moduleName: string, ignitionPath: string diff --git a/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts b/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts new file mode 100644 index 0000000000..4b34e8feaa --- /dev/null +++ b/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts @@ -0,0 +1,22 @@ +import type { ChainConfig } from "@nomicfoundation/hardhat-verify/types"; + +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export function getApiKeyAndUrls( + etherscanApiKey: string | Record, + chainConfig: ChainConfig +): [apiKey: string, apiUrl: string, webUrl: string] { + const apiKey: string = + typeof etherscanApiKey === "string" + ? etherscanApiKey + : etherscanApiKey[chainConfig.network]; + + if (apiKey === undefined) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + `No etherscan API key configured for network ${chainConfig.network}` + ); + } + + return [apiKey, chainConfig.urls.apiURL, chainConfig.urls.browserURL]; +} diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index eb427e0929..eda849cd5f 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -11,7 +11,7 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; const whitelist = [ 200, 201, 202, 203, 204, 403, 404, 405, 406, 600, 601, 602, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { diff --git a/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts b/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts new file mode 100644 index 0000000000..d43f861e63 --- /dev/null +++ b/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts @@ -0,0 +1,37 @@ +import type { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; +import type { VerifyInfo } from "@nomicfoundation/ignition-core"; + +export async function verifyEtherscanContract( + etherscanInstance: Etherscan, + { address, compilerVersion, sourceCode, name, args }: VerifyInfo +): Promise< + { type: "success"; contractURL: string } | { type: "failure"; reason: Error } +> { + try { + const { message: guid } = await etherscanInstance.verify( + address, + sourceCode, + name, + compilerVersion, + args + ); + + const verificationStatus = await etherscanInstance.getVerificationStatus( + guid + ); + + if (verificationStatus.isSuccess()) { + const contractURL = etherscanInstance.getContractUrl(address); + return { type: "success", contractURL }; + } else { + // todo: what case would cause verification status not to succeed without throwing? + return { type: "failure", reason: new Error(verificationStatus.message) }; + } + } catch (e) { + if (e instanceof Error) { + return { type: "failure", reason: e }; + } else { + throw e; + } + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js new file mode 100644 index 0000000000..8eb8897a69 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, + etherscan: { + apiKey: "", + }, +}; diff --git a/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts b/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts new file mode 100644 index 0000000000..1761ba53d5 --- /dev/null +++ b/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts @@ -0,0 +1,83 @@ +import { assert } from "chai"; + +import { getApiKeyAndUrls } from "../../src/utils/getApiKeyAndUrls"; + +describe("getApiKeyAndUrls", function () { + it("should return the correct API URLs when given a string", function () { + const apiKeyList = getApiKeyAndUrls("testApiKey", { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + }); + + assert.deepEqual(apiKeyList, [ + "testApiKey", + "https://api.etherscan.io/api", + "https://etherscan.io", + ]); + }); + + it("should return the correct API URLs when given an apiKey object", function () { + const apiKeyList = getApiKeyAndUrls( + { + goerli: "goerliApiKey", + sepolia: "sepoliaApiKey", + }, + { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + } + ); + + assert.deepEqual(apiKeyList, [ + "goerliApiKey", + "https://api-goerli.etherscan.io/api", + "https://goerli.etherscan.io", + ]); + }); + + it("should return the correct API URLs when given a string and the network is not mainnet", function () { + const apiKeyList = getApiKeyAndUrls("goerliApiKey", { + network: "goerli", + chainId: 5, + urls: { + apiURL: "https://api-goerli.etherscan.io/api", + browserURL: "https://goerli.etherscan.io", + }, + }); + + assert.deepEqual(apiKeyList, [ + "goerliApiKey", + "https://api-goerli.etherscan.io/api", + "https://goerli.etherscan.io", + ]); + }); + + it("should throw when given an object and a nonexistent network name", function () { + assert.throws( + () => + getApiKeyAndUrls( + { + goerli: "goerliApiKey", + sepolia: "sepoliaApiKey", + }, + { + network: "mainnet", + chainId: 1, + urls: { + apiURL: "https://api.etherscan.io/api", + browserURL: "https://etherscan.io", + }, + } + ), + /No etherscan API key configured for network mainnet/ + ); + }); +}); diff --git a/packages/hardhat-plugin/test/verify/index.ts b/packages/hardhat-plugin/test/verify/index.ts new file mode 100644 index 0000000000..28f50e15e0 --- /dev/null +++ b/packages/hardhat-plugin/test/verify/index.ts @@ -0,0 +1,35 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../use-ignition-project"; + +describe("verify", function () { + describe("when there is no etherscan API key configured", function () { + useEphemeralIgnitionProject("verify-no-api-key"); + + it("should throw in the verify task", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "verify" }, + { + deploymentId: "test", + } + ), + /No etherscan API key configured/ + ); + }); + + it("should throw in the deploy task", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "any", + verify: true, + } + ), + /No etherscan API key configured/ + ); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts b/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts new file mode 100644 index 0000000000..f671205826 --- /dev/null +++ b/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts @@ -0,0 +1,56 @@ +import type { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; + +import { assert } from "chai"; + +import { verifyEtherscanContract } from "../../src/utils/verifyEtherscanContract"; + +describe("verifyEtherscanContract", function () { + let etherscanInstance: any; + const contractInfo = { + address: "0x123", + compilerVersion: "v0.8.0", + sourceCode: "sourceCode", + name: "name", + args: "args", + }; + + beforeEach(function () { + etherscanInstance = { + verify: async () => ({ message: "guid" }), + getVerificationStatus: async () => ({ + isSuccess: () => true, + message: "message", + }), + getContractUrl: () => "url", + }; + }); + + it("should return a success object when verification succeeds", async function () { + const result = await verifyEtherscanContract( + etherscanInstance as Etherscan, + contractInfo + ); + + assert.deepEqual(result, { + type: "success", + contractURL: "url", + }); + }); + + it("should return a failure object when verification is not successful", async function () { + etherscanInstance.getVerificationStatus = async () => ({ + isSuccess: () => false, + message: "message", + }); + + const result = await verifyEtherscanContract( + etherscanInstance as Etherscan, + contractInfo + ); + + assert.deepEqual(result, { + type: "failure", + reason: new Error("message"), + }); + }); +}); diff --git a/packages/ui/test/to-mermaid.ts b/packages/ui/test/to-mermaid.ts index 38d157fbf3..6b1b758d35 100644 --- a/packages/ui/test/to-mermaid.ts +++ b/packages/ui/test/to-mermaid.ts @@ -179,6 +179,7 @@ describe("to-mermaid", () => { const fakeArtifact: Artifact = { abi: [], contractName: "", + sourceName: "", bytecode: "", linkReferences: {}, }; From dcb8b715c14d822fa664d8b993d1c063c7cfa25d Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Dec 2023 10:25:37 +0000 Subject: [PATCH 1118/1302] chore: bump version to v0.12.0 Update the packages versions and changelogs for the `0.12.0 - 2023-12-05` release. --- examples/complete/package.json | 4 +-- examples/ens/package.json | 4 +-- examples/sample/package.json | 4 +-- examples/ts-sample/package.json | 4 +-- package-lock.json | 52 ++++++++++++++-------------- packages/core/CHANGELOG.md | 10 ++++++ packages/core/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 10 ++++++ packages/hardhat-plugin/package.json | 6 ++-- packages/ui/package.json | 4 +-- 10 files changed, 60 insertions(+), 40 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index abebaa6b93..3498bd2c97 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.11.2", + "version": "0.12.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 91fc213b99..9b51c618a0 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.11.2", + "version": "0.12.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index d8501dbf74..995ef6d74d 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.11.2", + "version": "0.12.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 5c28c2daac..f5d55172a6 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.11.2", + "version": "0.12.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 1589061dd1..6248946fe8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.11.2", + "version": "0.12.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -40,12 +40,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.11.2", + "version": "0.12.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -53,9 +53,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.11.2", + "version": "0.12.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -63,9 +63,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.11.2", + "version": "0.12.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.11.2", + "@nomicfoundation/hardhat-ignition": "^0.12.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -3595,9 +3595,9 @@ "link": true }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", - "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", + "integrity": "sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==", "dev": true, "peer": true, "dependencies": { @@ -3674,9 +3674,9 @@ } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.1.tgz", - "integrity": "sha512-TuJrhW5p9x92wDRiRhNkGQ/wzRmOkfCLkoRg8+IRxyeLigOALbayQEmkNiGWR03vGlxZS4znXhKI7y97JwZ6Og==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.2.tgz", + "integrity": "sha512-SXmLPHrfh801m0Dj/8v4stAM6OI0tFktDlWe1pn3k43bCCjn5TGqcVy7hCtauG8/AlQWNZhR+01qTovSSVTvXQ==", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -9626,9 +9626,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.603", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.603.tgz", - "integrity": "sha512-Dvo5OGjnl7AZTU632dFJtWj0uJK835eeOVQIuRcmBmsFsTNn3cL05FqOyHAfGQDIoHfLhyJ1Tya3PJ0ceMz54g==", + "version": "1.4.604", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.604.tgz", + "integrity": "sha512-JAJ4lyLJYudlgJPYJicimU9R+qZ/3iyeyQS99bfT7PWi7psYWeN84lPswTjpHxQueU34PKxM/IJzQS6poYlovQ==", "dev": true }, "node_modules/elkjs": { @@ -12442,9 +12442,9 @@ } }, "node_modules/hardhat": { - "version": "2.19.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.1.tgz", - "integrity": "sha512-bsWa63g1GB78ZyMN08WLhFElLPA+J+pShuKD1BFO2+88g3l+BL3R07vj9deIi9dMbssxgE714Gof1dBEDGqnCw==", + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.2.tgz", + "integrity": "sha512-CRU3+0Cc8Qh9UpxKd8cLADDPes7ZDtKj4dTK+ERtLBomEzhRPLWklJn4VKOwjre9/k8GNd/e9DYxpfuzcxbXPQ==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -21297,7 +21297,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.11.2", + "version": "0.12.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -21407,11 +21407,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.2", + "version": "0.12.0", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.2", - "@nomicfoundation/ignition-ui": "^0.11.2", + "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-ui": "^0.12.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", @@ -21530,10 +21530,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.2", + "version": "0.12.0", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.2", + "@nomicfoundation/ignition-core": "^0.12.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 1a76b68e8a..daff5c42e8 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.12.0 - 2023-12-05 + +### Added + +- Add support for verification, see our [verification guide](https://hardhat.org/ignition/docs/guides/verify) for more information ([#630](https://github.com/NomicFoundation/hardhat-ignition/issues/630)) + +### Changed + +- Improved the error for fee exceeding block gas limit ([#594](https://github.com/NomicFoundation/hardhat-ignition/issues/594)) + ## 0.11.2 - 2023-11-06 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index a30fb71a8d..d0d6bf2769 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.11.2", + "version": "0.12.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 10be2a77e4..0f9cac9b6a 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.12.0 - 2023-12-05 + +### Added + +- Add support for verification, see our [verification guide](https://hardhat.org/ignition/docs/guides/verify) for more information ([#630](https://github.com/NomicFoundation/hardhat-ignition/issues/630)) + +### Changed + +- Improved the error for fee exceeding block gas limit ([#594](https://github.com/NomicFoundation/hardhat-ignition/issues/594)) + ## 0.11.2 - 2023-11-06 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 44ca6f673a..14de2d02b1 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.11.2", + "version": "0.12.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -93,8 +93,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.11.2", - "@nomicfoundation/ignition-ui": "^0.11.2", + "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-ui": "^0.12.0", "chalk": "^4.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 0b663e81f4..e2e2ff7616 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.11.2", + "version": "0.12.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.11.2", + "@nomicfoundation/ignition-core": "^0.12.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From c5470e46d98ea5134260626c599b255be448eff5 Mon Sep 17 00:00:00 2001 From: Zoey Date: Wed, 6 Dec 2023 10:03:37 -0500 Subject: [PATCH 1119/1302] Viem support (#612) Add a `hardhat-plugin-ethers` package and a `hardhat-plugin-viem` package. They both extend the existing `hardhat-plugin` package but they are responsible for adding the `IgnitionHelper` for scripts/tests that is set on `hre.ignition`. The integration tests remain against `hardhat-plugin` but have been rework to be `viem` based. A `TestIgnitionHelper` has been added that has some `viem` machinery. This is duplicated from `hardhat-viem` rather than using it directly to avoid the dangers of `hardhat-plugin` having `hardhat-viem`/`hardhat-plugin-viem` deps. If a user loads only the `hardhat-ignition` plugin but not ethers/viem and trys to use `hre.ignition` an error is thrown reporting that they need one of the ethers/viem plugins. A viem sample project has been added as well and the CONTRIBUTING.md guide updated. ## Enhance deploy return types using HH viem type generation Use an enhanced typed for the return result of `hre.ignition.deploy` that is based on contracts returned from the result. This is done in two ways: * pull the type information from HH-viem's code generation during compile of the type information for the contract (under artifacts) * enhance the Ignition `Artifact` type to carry a full Abi type, which can then be passed to viem for conversion into a sophisticated contract type The artifact type is now base on `AbiType`, which underlies `viem`. Because the tests are dependent on artifact metadata generated by Hardhat-viem on a compile. We now trigger a HH compile on the fixture projects before a build of the `hardhat-plugin-viem` package. Use an abi type of `readonly any[] | any[]` for abi on artifacts. We can pass the full const abi type as a term. Resolves #603, #616 --------- Co-authored-by: John Kane --- .gitignore | 3 - CONTRIBUTING.md | 26 +- examples/complete/hardhat.config.js | 2 +- examples/ens/hardhat.config.js | 2 +- examples/sample/hardhat.config.js | 2 +- examples/ts-sample/hardhat.config.ts | 2 +- examples/viem-sample/.eslintrc.js | 17 + examples/viem-sample/.gitignore | 13 + examples/viem-sample/.prettierignore | 5 + examples/viem-sample/README.md | 19 + examples/viem-sample/contracts/Lock.sol | 34 + examples/viem-sample/hardhat.config.ts | 10 + .../ignition/modules/LockModule.ts | 23 + examples/viem-sample/package.json | 18 + examples/viem-sample/test/Lock.ts | 164 + examples/viem-sample/tsconfig.json | 10 + package-lock.json | 5262 +++++------------ package.json | 45 +- packages/core/.eslintrc.js | 2 +- packages/core/package.json | 26 +- packages/core/src/types/artifact.ts | 11 +- packages/core/src/types/module-builder.ts | 20 +- packages/core/src/types/module.ts | 14 +- .../ignition/modules/LockModule.js | 2 +- packages/core/test/build-module.ts | 25 + packages/core/test/call.ts | 4 +- packages/core/test/execution/abi.ts | 2 +- packages/hardhat-plugin-ethers/.eslintrc.js | 8 + packages/hardhat-plugin-ethers/.gitignore | 1 + packages/hardhat-plugin-ethers/.mocharc.json | 6 + packages/hardhat-plugin-ethers/.npmignore | 14 + packages/hardhat-plugin-ethers/.nycrc | 19 + .../hardhat-plugin-ethers/.prettierignore | 9 + packages/hardhat-plugin-ethers/CHANGELOG.md | 5 + packages/hardhat-plugin-ethers/README.md | 56 + packages/hardhat-plugin-ethers/package.json | 55 + .../src/ethers-ignition-helper.ts} | 71 +- packages/hardhat-plugin-ethers/src/index.ts | 28 + .../src/type-extensions.ts | 7 + .../hardhat-plugin-ethers/test/.eslintrc.js | 15 + .../test/deploy-with-ethers-result.ts | 112 + .../test/fixture-projects/.gitignore | 3 + .../minimal/contracts/Contracts.sol | 222 + .../minimal/hardhat.config.js | 12 + .../minimal/ignition/modules/MyModule.js | 13 + .../with-fake-helper/hardhat.config.js | 13 + .../with-fake-helper/index.js | 7 + .../test/ignition-helper-exclusivity.ts | 23 + packages/hardhat-plugin-ethers/test/setup.ts | 11 + .../externally-loaded-contract.ts | 94 + packages/hardhat-plugin-ethers/tsconfig.json | 9 + packages/hardhat-plugin-viem/.eslintrc.js | 8 + packages/hardhat-plugin-viem/.gitignore | 1 + packages/hardhat-plugin-viem/.mocharc.json | 7 + packages/hardhat-plugin-viem/.npmignore | 14 + packages/hardhat-plugin-viem/.nycrc | 19 + packages/hardhat-plugin-viem/.prettierignore | 9 + packages/hardhat-plugin-viem/CHANGELOG.md | 5 + packages/hardhat-plugin-viem/README.md | 56 + packages/hardhat-plugin-viem/package.json | 56 + .../scripts/compile-test-fixture-projects.ts | 33 + ...nition-module-results-to-viem-contracts.ts | 57 + packages/hardhat-plugin-viem/src/index.ts | 28 + .../src/type-extensions.ts | 7 + .../src/viem-ignition-helper.ts | 230 + .../hardhat-plugin-viem/test/.eslintrc.js | 15 + .../test/fixture-projects/.gitignore | 3 + .../minimal/contracts/Contracts.sol | 30 + .../minimal/hardhat.config.js | 12 + .../minimal/ignition/modules/MyModule.js | 13 + .../with-fake-helper/hardhat.config.js | 13 + .../with-fake-helper/index.js | 7 + .../test/ignition-helper-exclusivity.ts | 23 + packages/hardhat-plugin-viem/test/setup.ts | 11 + .../externally-loaded-contract.ts | 94 + .../test/test-helpers/use-ignition-project.ts | 28 + .../hardhat-plugin-viem/test/use-module.ts | 32 + .../viem-instances/artifact-contract-at.ts | 109 + .../artifact-deployment-contract.ts | 103 + .../test/viem-instances/named-contract-at.ts | 103 + .../named-deployment-contract.ts | 103 + .../hardhat-plugin-viem/test/viem-results.ts | 80 + packages/hardhat-plugin-viem/tsconfig.json | 9 + packages/hardhat-plugin/README.md | 18 +- packages/hardhat-plugin/package.json | 44 +- packages/hardhat-plugin/src/helpers.ts | 2 + packages/hardhat-plugin/src/index.ts | 28 +- .../hardhat-plugin/src/type-extensions.ts | 8 - .../src/{ => utils}/load-module.ts | 2 +- packages/hardhat-plugin/test/config.ts | 6 +- .../multiple-batch-contract-deploy.ts | 31 +- .../error-on-pending-user-transactions.ts | 77 + ...-with-replaced-pending-user-transaction.ts | 32 +- .../error-on-transaction-dropped.ts | 6 +- .../error-on-user-transaction-sent.ts | 36 +- ...rerun-with-dropped-ignition-transaction.ts | 9 +- ...with-now-complete-ignition-transactions.ts | 30 +- ...erun-with-pending-ignition-transactions.ts | 28 +- ...ith-replaced-confirmed-user-transaction.ts | 43 +- .../rerun/rerun-a-deploy-that-timed-out.ts | 127 + .../rerun}/rerun-after-kill.ts | 12 +- .../rerun}/rerun-with-new-contract-deploy.ts | 11 +- .../deploy/timeouts/deploy-run-times-out.ts | 55 + .../hardhat-plugin/test/error-handling.ts | 26 - .../deploy-contract-at-from-artifact.ts | 56 - .../test/execution/deploy-contract-at.ts | 51 - .../deploy-contract-from-artifact.ts | 34 - .../test/execution/deploy-contract.ts | 34 - .../error-on-pending-user-transactions.ts | 57 - .../timeouts/deploy-run-times-out.ts | 40 - .../timeouts/rerun-a-deploy-that-timed-out.ts | 51 - .../test/ignition-helper-guard.ts | 21 + .../test/{ => module-api}/calls.ts | 60 +- .../test/{ => module-api}/contracts.ts | 78 +- .../test/{ => module-api}/events.ts | 24 +- .../{ => module-api}/existing-contract.ts | 19 +- .../test/{ => module-api}/libraries.ts | 39 +- .../test/{ => module-api}/params.ts | 20 +- .../test/{ => module-api}/static-calls.ts | 36 +- .../test/{ => module-api}/use-module.ts | 20 +- packages/hardhat-plugin/test/plan/index.ts | 2 +- packages/hardhat-plugin/test/status.ts | 139 - ...-pending-transactions-from-memory-pool.ts} | 7 - .../test/test-helpers/get-balance-for.ts | 16 + .../test/test-helpers/mine-block.ts | 5 + .../hardhat-plugin/test/test-helpers/sleep.ts | 2 + .../test/test-helpers/test-ignition-helper.ts | 199 + .../test/{ => test-helpers}/type-helper.ts | 0 .../use-ignition-project.ts | 30 +- .../wait-for-pending-txs.ts} | 0 .../test/{ => utils}/load-module.ts | 5 +- packages/hardhat-plugin/test/verify/index.ts | 2 +- packages/ui/package.json | 9 - 133 files changed, 4963 insertions(+), 4618 deletions(-) create mode 100644 examples/viem-sample/.eslintrc.js create mode 100644 examples/viem-sample/.gitignore create mode 100644 examples/viem-sample/.prettierignore create mode 100644 examples/viem-sample/README.md create mode 100644 examples/viem-sample/contracts/Lock.sol create mode 100644 examples/viem-sample/hardhat.config.ts create mode 100644 examples/viem-sample/ignition/modules/LockModule.ts create mode 100644 examples/viem-sample/package.json create mode 100644 examples/viem-sample/test/Lock.ts create mode 100644 examples/viem-sample/tsconfig.json create mode 100644 packages/core/test/build-module.ts create mode 100644 packages/hardhat-plugin-ethers/.eslintrc.js create mode 100644 packages/hardhat-plugin-ethers/.gitignore create mode 100644 packages/hardhat-plugin-ethers/.mocharc.json create mode 100644 packages/hardhat-plugin-ethers/.npmignore create mode 100644 packages/hardhat-plugin-ethers/.nycrc create mode 100644 packages/hardhat-plugin-ethers/.prettierignore create mode 100644 packages/hardhat-plugin-ethers/CHANGELOG.md create mode 100644 packages/hardhat-plugin-ethers/README.md create mode 100644 packages/hardhat-plugin-ethers/package.json rename packages/{hardhat-plugin/src/ignition-helper.ts => hardhat-plugin-ethers/src/ethers-ignition-helper.ts} (83%) create mode 100644 packages/hardhat-plugin-ethers/src/index.ts create mode 100644 packages/hardhat-plugin-ethers/src/type-extensions.ts create mode 100644 packages/hardhat-plugin-ethers/test/.eslintrc.js create mode 100644 packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js create mode 100644 packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts create mode 100644 packages/hardhat-plugin-ethers/test/setup.ts create mode 100644 packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts create mode 100644 packages/hardhat-plugin-ethers/tsconfig.json create mode 100644 packages/hardhat-plugin-viem/.eslintrc.js create mode 100644 packages/hardhat-plugin-viem/.gitignore create mode 100644 packages/hardhat-plugin-viem/.mocharc.json create mode 100644 packages/hardhat-plugin-viem/.npmignore create mode 100644 packages/hardhat-plugin-viem/.nycrc create mode 100644 packages/hardhat-plugin-viem/.prettierignore create mode 100644 packages/hardhat-plugin-viem/CHANGELOG.md create mode 100644 packages/hardhat-plugin-viem/README.md create mode 100644 packages/hardhat-plugin-viem/package.json create mode 100644 packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts create mode 100644 packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts create mode 100644 packages/hardhat-plugin-viem/src/index.ts create mode 100644 packages/hardhat-plugin-viem/src/type-extensions.ts create mode 100644 packages/hardhat-plugin-viem/src/viem-ignition-helper.ts create mode 100644 packages/hardhat-plugin-viem/test/.eslintrc.js create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/.gitignore create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js create mode 100644 packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts create mode 100644 packages/hardhat-plugin-viem/test/setup.ts create mode 100644 packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts create mode 100644 packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts create mode 100644 packages/hardhat-plugin-viem/test/use-module.ts create mode 100644 packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts create mode 100644 packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts create mode 100644 packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts create mode 100644 packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts create mode 100644 packages/hardhat-plugin-viem/test/viem-results.ts create mode 100644 packages/hardhat-plugin-viem/tsconfig.json create mode 100644 packages/hardhat-plugin/src/helpers.ts rename packages/hardhat-plugin/src/{ => utils}/load-module.ts (96%) rename packages/hardhat-plugin/test/{execution => deploy}/multiple-batch-contract-deploy.ts (69%) create mode 100644 packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts (62%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/error-on-transaction-dropped.ts (83%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/error-on-user-transaction-sent.ts (51%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/rerun-with-dropped-ignition-transaction.ts (81%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/rerun-with-now-complete-ignition-transactions.ts (79%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/rerun-with-pending-ignition-transactions.ts (81%) rename packages/hardhat-plugin/test/{execution => deploy}/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts (64%) create mode 100644 packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts rename packages/hardhat-plugin/test/{execution => deploy/rerun}/rerun-after-kill.ts (85%) rename packages/hardhat-plugin/test/{execution => deploy/rerun}/rerun-with-new-contract-deploy.ts (85%) create mode 100644 packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts delete mode 100644 packages/hardhat-plugin/test/error-handling.ts delete mode 100644 packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts delete mode 100644 packages/hardhat-plugin/test/execution/deploy-contract-at.ts delete mode 100644 packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts delete mode 100644 packages/hardhat-plugin/test/execution/deploy-contract.ts delete mode 100644 packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts delete mode 100644 packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts delete mode 100644 packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts create mode 100644 packages/hardhat-plugin/test/ignition-helper-guard.ts rename packages/hardhat-plugin/test/{ => module-api}/calls.ts (68%) rename packages/hardhat-plugin/test/{ => module-api}/contracts.ts (68%) rename packages/hardhat-plugin/test/{ => module-api}/events.ts (76%) rename packages/hardhat-plugin/test/{ => module-api}/existing-contract.ts (69%) rename packages/hardhat-plugin/test/{ => module-api}/libraries.ts (75%) rename packages/hardhat-plugin/test/{ => module-api}/params.ts (83%) rename packages/hardhat-plugin/test/{ => module-api}/static-calls.ts (80%) rename packages/hardhat-plugin/test/{ => module-api}/use-module.ts (76%) delete mode 100644 packages/hardhat-plugin/test/status.ts rename packages/hardhat-plugin/test/{execution/helpers.ts => test-helpers/clear-pending-transactions-from-memory-pool.ts} (78%) create mode 100644 packages/hardhat-plugin/test/test-helpers/get-balance-for.ts create mode 100644 packages/hardhat-plugin/test/test-helpers/mine-block.ts create mode 100644 packages/hardhat-plugin/test/test-helpers/sleep.ts create mode 100644 packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts rename packages/hardhat-plugin/test/{ => test-helpers}/type-helper.ts (100%) rename packages/hardhat-plugin/test/{ => test-helpers}/use-ignition-project.ts (85%) rename packages/hardhat-plugin/test/{helpers.ts => test-helpers/wait-for-pending-txs.ts} (100%) rename packages/hardhat-plugin/test/{ => utils}/load-module.ts (86%) diff --git a/.gitignore b/.gitignore index 88af4e11ec..b5328776b2 100644 --- a/.gitignore +++ b/.gitignore @@ -92,9 +92,6 @@ out .nuxt dist -# Typedocs documentation files -typedocs/ - # Gatsby files .cache/ # Comment in the public line in if your project uses Gatsby and not Next.js diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 646e2afdf9..4fd4144cbc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -10,10 +10,12 @@ If you find a bug or want to propose a new feature, please open an issue. Pull r This repository is a monorepo handled with `npm` workspaces. -There are three packages: +There are five packages: - [**core**](./packages/core/README.md) - containing the ignition library for orchestrating deployments - [**hardhat-plugin**](./packages/hardhat-plugin/README.md) - containing the Hardhat plugin wrapper for the core library +- [**hardhat-plugin-ethers**](./packages/hardhat-plugin-ethers/README.md) - containing the Hardhat plugin extension to add ethers support to hardhat-plugin +- [**hardhat-plugin-viem**](./packages/hardhat-plugin-viem/README.md) - containing the Hardhat plugin extension to add viem support to hardhat-plugin - [**ui**](./packages/ui/README.md) - containing the UI for the visualize report ## Setup @@ -75,15 +77,17 @@ To publish ignition: 5. Create a release branch `git checkout -b release/yyyy-mm-dd` 6. Update the `CHANGELOG.md` under `./packages/core`. 7. Update the `CHANGELOG.md` under `./packages/hardhat-plugin`. -8. Update the `CHANGELOG.md` under `./packages/ui`. -9. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` -10. Update the version of dependencies: +8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-ethers`. +9. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-viem`. +10. Update the `CHANGELOG.md` under `./packages/ui`. +11. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` +12. Update the version of dependencies: - cores version in hardhat-ui deps - cores and uis versions in hardhat-ignition devDeps and peerDeps - examples version of hardhat-ignition -11. Commit the version update `git commit`: +13. Commit the version update `git commit`: ``` chore: bump version to vX.X.X @@ -92,12 +96,12 @@ Update the packages versions and changelogs for the `X.X.X - yyyy-mm-dd` release. ``` -12. Push the release branch and open a pull request on `main`, the PR description should match the changelogs -13. On a successful check, `rebase merge` the release branch into `main` -14. Switch to main branch and pull the latest changes -15. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -16. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui` and `@nomicfoundation/hardhat-ignition` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition` -17. Create a release on github off of the pushed tag +14. Push the release branch and open a pull request on `main`, the PR description should match the changelogs +15. On a successful check, `rebase merge` the release branch into `main` +16. Switch to main branch and pull the latest changes +17. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +18. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-viem` +19. Create a release on github off of the pushed tag ## Manual testing diff --git a/examples/complete/hardhat.config.js b/examples/complete/hardhat.config.js index 13d2a0f3fa..ec2874b5c6 100644 --- a/examples/complete/hardhat.config.js +++ b/examples/complete/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@nomicfoundation/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition-ethers"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { diff --git a/examples/ens/hardhat.config.js b/examples/ens/hardhat.config.js index 35757a331b..bd5542556b 100644 --- a/examples/ens/hardhat.config.js +++ b/examples/ens/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@nomicfoundation/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition-ethers"); /** * @type import('hardhat/config').HardhatUserConfig diff --git a/examples/sample/hardhat.config.js b/examples/sample/hardhat.config.js index e2073ce58b..c0eacc6fda 100644 --- a/examples/sample/hardhat.config.js +++ b/examples/sample/hardhat.config.js @@ -1,5 +1,5 @@ require("@nomicfoundation/hardhat-toolbox"); -require("@nomicfoundation/hardhat-ignition"); +require("@nomicfoundation/hardhat-ignition-ethers"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { diff --git a/examples/ts-sample/hardhat.config.ts b/examples/ts-sample/hardhat.config.ts index 007372f697..db43b056fd 100644 --- a/examples/ts-sample/hardhat.config.ts +++ b/examples/ts-sample/hardhat.config.ts @@ -1,6 +1,6 @@ import type { HardhatUserConfig } from "hardhat/config"; -import "@nomicfoundation/hardhat-ignition"; +import "@nomicfoundation/hardhat-ignition-ethers"; import "@nomicfoundation/hardhat-toolbox"; const config: HardhatUserConfig = { diff --git a/examples/viem-sample/.eslintrc.js b/examples/viem-sample/.eslintrc.js new file mode 100644 index 0000000000..b22007961e --- /dev/null +++ b/examples/viem-sample/.eslintrc.js @@ -0,0 +1,17 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: "./tsconfig.json", + tsConfigRootDir: "./", + }, + plugins: ["eslint-plugin-import", "@typescript-eslint"], + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/viem-sample/.gitignore b/examples/viem-sample/.gitignore new file mode 100644 index 0000000000..2b8069dd92 --- /dev/null +++ b/examples/viem-sample/.gitignore @@ -0,0 +1,13 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + +ignition/deployments + diff --git a/examples/viem-sample/.prettierignore b/examples/viem-sample/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/viem-sample/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/viem-sample/README.md b/examples/viem-sample/README.md new file mode 100644 index 0000000000..ca7e075aaf --- /dev/null +++ b/examples/viem-sample/README.md @@ -0,0 +1,19 @@ +# Hardhat Viem Sample for Hardhat Ignition + +This project is Hardhat's viem sample project enhanced with Hardhat Ignition. + +## Deploying + +To run the Ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat ignition deploy ./ignition/modules/LockModule.js +``` + +## Test + +To run the hardhat tests using Ignition: + +```shell +npm run test +``` diff --git a/examples/viem-sample/contracts/Lock.sol b/examples/viem-sample/contracts/Lock.sol new file mode 100644 index 0000000000..9e0e189d9e --- /dev/null +++ b/examples/viem-sample/contracts/Lock.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/examples/viem-sample/hardhat.config.ts b/examples/viem-sample/hardhat.config.ts new file mode 100644 index 0000000000..9ca2baa5a9 --- /dev/null +++ b/examples/viem-sample/hardhat.config.ts @@ -0,0 +1,10 @@ +import type { HardhatUserConfig } from "hardhat/types"; + +import "@nomicfoundation/hardhat-toolbox-viem"; +import "@nomicfoundation/hardhat-ignition-viem"; + +const config: HardhatUserConfig = { + solidity: "0.8.19", +}; + +export default config; diff --git a/examples/viem-sample/ignition/modules/LockModule.ts b/examples/viem-sample/ignition/modules/LockModule.ts new file mode 100644 index 0000000000..20e3818d4d --- /dev/null +++ b/examples/viem-sample/ignition/modules/LockModule.ts @@ -0,0 +1,23 @@ +import { buildModule } from "@nomicfoundation/hardhat-ignition/modules"; +import { parseEther } from "viem"; + +const currentTimestampInSeconds = Math.round( + new Date(2023, 0, 1).valueOf() / 1000 +); +const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; + +const ONE_GWEI = parseEther("1", "gwei"); + +const LockModule = buildModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); + + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); + + return { lock }; +}); + +export default LockModule; diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json new file mode 100644 index 0000000000..3659857750 --- /dev/null +++ b/examples/viem-sample/package.json @@ -0,0 +1,18 @@ +{ + "name": "@nomicfoundation/ignition-viem-sample-example", + "private": true, + "version": "0.12.0", + "scripts": { + "test": "hardhat test", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx,ts,tsx}\" \"test/**/*.{js,jsx,ts,tsx}\"", + "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ignition-viem": "^0.12.0", + "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } +} diff --git a/examples/viem-sample/test/Lock.ts b/examples/viem-sample/test/Lock.ts new file mode 100644 index 0000000000..332dd3bf87 --- /dev/null +++ b/examples/viem-sample/test/Lock.ts @@ -0,0 +1,164 @@ +import { + time, + loadFixture, +} from "@nomicfoundation/hardhat-toolbox-viem/network-helpers"; +import { expect, assert } from "chai"; +import hre from "hardhat"; + +import LockModule from "../ignition/modules/LockModule"; + +describe("Lock", function () { + // We define a fixture to reuse the same setup in every test. + // We use loadFixture to run this setup once, snapshot that state, + // and reset Hardhat Network to that snapshot in every test. + async function deployOneYearLockFixture() { + const ONE_YEAR_IN_SECS = 365 * 24 * 60 * 60; + const ONE_GWEI = 1_000_000_000; + + const lockedAmount = BigInt(ONE_GWEI); + const unlockTime = BigInt((await time.latest()) + ONE_YEAR_IN_SECS); + + // Contracts are deployed using the first signer/account by default + const [owner, otherAccount] = await hre.viem.getWalletClients(); + + const { lock } = await hre.ignition.deploy(LockModule, { + parameters: { + LockModule: { + unlockTime, + lockedAmount, + }, + }, + }); + + return { lock, unlockTime, lockedAmount, owner, otherAccount }; + } + + describe("Deployment", function () { + it("Should set the right unlockTime", async function () { + const { lock, unlockTime } = await loadFixture(deployOneYearLockFixture); + + expect(await lock.read.unlockTime()).to.equal(unlockTime); + }); + + it("Should set the right owner", async function () { + const { lock, owner } = await loadFixture(deployOneYearLockFixture); + + expect((await lock.read.owner()).toLowerCase()).to.equal( + owner.account.address + ); + }); + + it("Should receive and store the funds to lock", async function () { + const { lock, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + const client = await hre.viem.getPublicClient(); + + expect(await client.getBalance({ address: lock.address })).to.equal( + lockedAmount + ); + }); + + it("Should fail if the unlockTime is not in the future", async function () { + // We don't use the fixture here because we want a different deployment + const LockArtifact = require("../artifacts/contracts/Lock.sol/Lock.json"); + const latestTime = await time.latest(); + + const [client] = await hre.viem.getWalletClients(); + + await expect( + client.deployContract({ + abi: LockArtifact.abi, + bytecode: LockArtifact.bytecode, + args: [latestTime], + value: 1n, + account: client.account.address, + }) + ).to.be.rejectedWith("Unlock time should be in the future"); + }); + }); + + describe("Withdrawals", function () { + describe("Validations", function () { + it("Should revert with the right error if called too soon", async function () { + const { lock } = await loadFixture(deployOneYearLockFixture); + + await expect(lock.write.withdraw()).to.be.rejectedWith( + "You can't withdraw yet" + ); + }); + + it("Should revert with the right error if called from another account", async function () { + const { lock, unlockTime, otherAccount } = await loadFixture( + deployOneYearLockFixture + ); + + // We can increase the time in Hardhat Network + await time.increaseTo(unlockTime); + + await expect( + lock.write.withdraw({ account: otherAccount.account.address }) + ).to.be.rejectedWith("You aren't the owner"); + }); + + it("Shouldn't fail if the unlockTime has arrived and the owner calls it", async function () { + const { lock, unlockTime } = await loadFixture( + deployOneYearLockFixture + ); + + // Transactions are sent using the first signer by default + await time.increaseTo(unlockTime); + + await expect(lock.write.withdraw()).not.to.be.rejected; + }); + }); + + describe("Events", function () { + it("Should emit an event on withdrawals", async function () { + const LockArtifact = hre.artifacts.readArtifactSync("Lock"); + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + const client = await hre.viem.getPublicClient(); + + await lock.write.withdraw(); + + const logs = await client.getContractEvents({ + address: lock.address, + abi: LockArtifact.abi, + eventName: "Withdrawal", + }); + + expect(logs[0].args.amount).to.equal(lockedAmount); + }); + }); + + describe("Transfers", function () { + it("Should transfer the funds to the owner", async function () { + const { lock, unlockTime, lockedAmount } = await loadFixture( + deployOneYearLockFixture + ); + + await time.increaseTo(unlockTime); + + const client = await hre.viem.getPublicClient(); + + const lockBalanceBefore = await client.getBalance({ + address: lock.address, + }); + + await lock.write.withdraw(); + + const lockBalanceAfter = await client.getBalance({ + address: lock.address, + }); + + expect(lockBalanceAfter).to.equal(lockBalanceBefore - lockedAmount); + }); + }); + }); +}); diff --git a/examples/viem-sample/tsconfig.json b/examples/viem-sample/tsconfig.json new file mode 100644 index 0000000000..e5f1a64007 --- /dev/null +++ b/examples/viem-sample/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "es2020", + "module": "commonjs", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/package-lock.json b/package-lock.json index 6248946fe8..457fd23d48 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,23 +7,49 @@ "name": "root", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "devDependencies": { - "@microsoft/api-extractor": "7.34.4", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "eslint": "^7.32.0", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@microsoft/api-extractor": "7.38.3", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/lodash": "4.14.189", + "@types/lodash.flattendeep": "^4.4.7", + "@types/mocha": "9.1.1", + "@types/ndjson": "2.0.1", + "@types/node": "16.11.7", + "@types/prompts": "^2.4.2", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "esbuild": "^0.15.9", + "eslint": "^8.38.0", "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-import": "2.24.2", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", + "hardhat": "^2.18.0", + "mocha": "^9.1.3", + "nyc": "15.1.0", "open-cli": "7.2.0", - "prettier": "2.4.1", - "typedoc": "0.23.28", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", "typescript": "^5.0.2" }, "workspaces": { "packages": [ - "packages/*", + "packages/core", + "packages/ui", + "packages/hardhat-plugin", + "packages/hardhat-plugin-ethers", + "packages/hardhat-plugin-viem", "examples/*" ] } @@ -71,6 +97,16 @@ "prettier-plugin-solidity": "1.1.3" } }, + "examples/viem-sample": { + "name": "@nomicfoundation/ignition-viem-sample-example", + "version": "0.12.0", + "devDependencies": { + "@nomicfoundation/hardhat-ignition-viem": "^0.12.0", + "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -221,6 +257,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -609,6 +651,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/types": { "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", @@ -831,21 +882,6 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@ensdomains/ens/node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -857,17 +893,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "node_modules/@ensdomains/ens/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ensdomains/ens/node_modules/path-exists": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", @@ -996,17 +1021,6 @@ "node": ">=0.10.0" } }, - "node_modules/@ensdomains/ens/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ensdomains/ens/node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", @@ -1524,18 +1538,6 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", @@ -1546,50 +1548,26 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/js": { @@ -1610,43 +1588,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/common/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@ethereumjs/common/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@ethereumjs/rlp": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", @@ -1667,43 +1608,6 @@ "ethereumjs-util": "^7.1.5" } }, - "node_modules/@ethereumjs/tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@ethereumjs/tx/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@ethereumjs/util": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", @@ -1752,18 +1656,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", @@ -2634,9 +2526,9 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.1.tgz", - "integrity": "sha512-QgcKYwzcc8vvZ4n/5uklchy8KVdjJwcOeI+HnnTNclJjs2nYsy23DOCf+sSV1kBwD9yDAoVKCkv/gEPzgQU3Pw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", "dev": true, "dependencies": { "@floating-ui/utils": "^0.1.3" @@ -2665,14 +2557,14 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" @@ -2692,9 +2584,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2726,6 +2618,19 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -2765,24 +2670,6 @@ "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -2884,51 +2771,65 @@ "node": ">=12.0.0" } }, - "node_modules/@microsoft/api-extractor": { - "version": "7.34.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.34.4.tgz", - "integrity": "sha512-HOdcci2nT40ejhwPC3Xja9G+WSJmWhCUKKryRfQYsmE9cD+pxmBaKBKCbuS9jUcl6bLLb4Gz+h7xEN5r0QiXnQ==", - "dev": true, + "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", "dependencies": { - "@microsoft/api-extractor-model": "7.26.4", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2", - "@rushstack/rig-package": "0.3.18", - "@rushstack/ts-command-line": "4.13.2", + "@types/node": "*" + } + }, + "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", + "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", + "dependencies": { + "@types/bn.js": "^4.11.3", + "bn.js": "^4.11.0", + "create-hash": "^1.1.2", + "elliptic": "^6.5.2", + "ethereum-cryptography": "^0.1.3", + "ethjs-util": "0.1.6", + "rlp": "^2.2.3" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.38.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.38.3.tgz", + "integrity": "sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw==", + "dev": true, + "dependencies": { + "@microsoft/api-extractor-model": "7.28.2", + "@microsoft/tsdoc": "0.14.2", + "@microsoft/tsdoc-config": "~0.16.1", + "@rushstack/node-core-library": "3.61.0", + "@rushstack/rig-package": "0.5.1", + "@rushstack/ts-command-line": "4.17.1", "colors": "~1.2.1", "lodash": "~4.17.15", "resolve": "~1.22.1", - "semver": "~7.3.0", + "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "~4.8.4" + "typescript": "~5.0.4" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.26.4.tgz", - "integrity": "sha512-PDCgCzXDo+SLY5bsfl4bS7hxaeEtnXj7XtuzEE+BtALp7B5mK/NrS2kHWU69pohgsRmEALycQdaQPXoyT2i5MQ==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz", + "integrity": "sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.55.2" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" + "@rushstack/node-core-library": "3.61.0" } }, "node_modules/@microsoft/tsdoc": { @@ -3069,28 +2970,6 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -3161,28 +3040,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-common": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", @@ -3208,28 +3065,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-evm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", @@ -3248,28 +3083,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-evm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-rlp": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", @@ -3316,28 +3129,6 @@ "@ethersproject/rlp": "^5.7.0" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -3400,28 +3191,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-trie/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-tx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", @@ -3438,28 +3207,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-tx/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-util": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", @@ -3490,28 +3237,6 @@ "@chainsafe/persistent-merkle-tree": "^0.5.0" } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/ethereumjs-vm": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", @@ -3535,28 +3260,6 @@ "node": ">=14" } }, - "node_modules/@nomicfoundation/ethereumjs-vm/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", @@ -3594,12 +3297,19 @@ "resolved": "packages/hardhat-plugin", "link": true }, + "node_modules/@nomicfoundation/hardhat-ignition-ethers": { + "resolved": "packages/hardhat-plugin-ethers", + "link": true + }, + "node_modules/@nomicfoundation/hardhat-ignition-viem": { + "resolved": "packages/hardhat-plugin-viem", + "link": true + }, "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", - "integrity": "sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", + "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", "dev": true, - "peer": true, "dependencies": { "ethereumjs-util": "^7.1.4" }, @@ -3607,51 +3317,10 @@ "hardhat": "^2.9.5" } }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomicfoundation/hardhat-network-helpers/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", - "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", + "node_modules/@nomicfoundation/hardhat-toolbox": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", + "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", "dev": true, "peerDependencies": { "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", @@ -3673,6 +3342,31 @@ "typescript": ">=4.5.0" } }, + "node_modules/@nomicfoundation/hardhat-toolbox-viem": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox-viem/-/hardhat-toolbox-viem-2.0.0.tgz", + "integrity": "sha512-1bxTaC+PcbdctwgP/AvmKJGQTeLoT2kJtAfaDvt5PbL3esZ1EO+pfoBkpliP3DJSNESLSqAjVN1yIFxoLJmiBg==", + "dev": true, + "dependencies": { + "chai-as-promised": "^7.1.1" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.6", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typescript": "~5.0.4", + "viem": "^1.15.1" + } + }, "node_modules/@nomicfoundation/hardhat-verify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.2.tgz", @@ -3785,6 +3479,21 @@ "node": ">=4" } }, + "node_modules/@nomicfoundation/hardhat-viem": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-1.0.1.tgz", + "integrity": "sha512-zylTUNLf4SqWGCiJVhoCVus4+h1xkSQl78QdjPBfnZQHsW4Ik9NjGGflIdov43pmPiJOzL8Ry7F2hjWe5bqqwQ==", + "dev": true, + "dependencies": { + "abitype": "^0.9.8", + "lodash.memoize": "^4.1.2" + }, + "peerDependencies": { + "hardhat": "^2.17.0", + "typescript": "~5.0.0", + "viem": "^1.15.1" + } + }, "node_modules/@nomicfoundation/ignition-complete-example": { "resolved": "examples/complete", "link": true @@ -3809,6 +3518,10 @@ "resolved": "packages/ui", "link": true }, + "node_modules/@nomicfoundation/ignition-viem-sample-example": { + "resolved": "examples/viem-sample", + "link": true + }, "node_modules/@nomicfoundation/solidity-analyzer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", @@ -4002,72 +3715,6 @@ "web3": "^1.0.0-beta.36" } }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@nomiclabs/hardhat-truffle5/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/@nomiclabs/hardhat-web3": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", @@ -4166,32 +3813,6 @@ "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" }, - "node_modules/@pkgr/utils": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", - "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "fast-glob": "^3.3.0", - "is-glob": "^4.0.3", - "open": "^9.1.0", - "picocolors": "^1.0.0", - "tslib": "^2.6.0" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@pkgr/utils/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/@remix-run/router": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", @@ -4370,9 +3991,9 @@ "peer": true }, "node_modules/@rushstack/node-core-library": { - "version": "3.55.2", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.55.2.tgz", - "integrity": "sha512-SaLe/x/Q/uBVdNFK5V1xXvsVps0y7h1sN7aSJllQyFbugyOaxhNRF25bwEDnicARNEjJw0pk0lYnJQ9Kr6ev0A==", + "version": "3.61.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz", + "integrity": "sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==", "dev": true, "dependencies": { "colors": "~1.2.1", @@ -4380,7 +4001,7 @@ "import-lazy": "~4.0.0", "jju": "~1.4.0", "resolve": "~1.22.1", - "semver": "~7.3.0", + "semver": "~7.5.4", "z-schema": "~5.0.2" }, "peerDependencies": { @@ -4392,42 +4013,10 @@ } } }, - "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/@rushstack/rig-package": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.18.tgz", - "integrity": "sha512-SGEwNTwNq9bI3pkdd01yCaH+gAsHqs0uxfGvtw9b0LJXH52qooWXnrFTRRLG1aL9pf+M2CARdrA9HLHJys3jiQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.1.tgz", + "integrity": "sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==", "dev": true, "dependencies": { "resolve": "~1.22.1", @@ -4435,9 +4024,9 @@ } }, "node_modules/@rushstack/ts-command-line": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.13.2.tgz", - "integrity": "sha512-bCU8qoL9HyWiciltfzg7GqdfODUeda/JpI0602kbN5YH22rzTxyqYvv7aRLENCM7XCQ1VRs7nMkEqgJUOU8Sag==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", + "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", "dev": true, "dependencies": { "@types/argparse": "1.0.38", @@ -4455,58 +4044,30 @@ } }, "node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", + "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.2.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.2" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip32/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", + "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", "dependencies": { - "@noble/hashes": "~1.2.0", + "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@scure/bip39/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/@sentry/core": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", @@ -4727,43 +4288,6 @@ "node": "^16.20 || ^18.16 || >=20" } }, - "node_modules/@truffle/abi-utils/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/abi-utils/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@truffle/abi-utils/node_modules/web3-utils": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", @@ -4829,80 +4353,18 @@ "node": ">=6.0.0" } }, - "node_modules/@truffle/codec/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/codec/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@truffle/codec/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/codec/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", + "node_modules/@truffle/codec/node_modules/nofilter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", + "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@truffle/codec/node_modules/web3-utils": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", + "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", "dependencies": { "bn.js": "^5.2.1", "ethereum-bloom-filters": "^1.0.6", @@ -4916,11 +4378,6 @@ "node": ">=8.0.0" } }, - "node_modules/@truffle/codec/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/@truffle/compile-common": { "version": "0.9.8", "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", @@ -5118,62 +4575,6 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereum-cryptography/node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@truffle/interface-adapter/node_modules/ethers": { "version": "4.0.49", "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", @@ -5744,6 +5145,29 @@ "node": ">=10" } }, + "node_modules/@typechain/hardhat/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@typechain/hardhat/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@types/argparse": { "version": "1.0.38", "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", @@ -5844,395 +5268,117 @@ "@types/node": "*" } }, - "node_modules/@types/d3": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.0.tgz", - "integrity": "sha512-jIfNVK0ZlxcuRDKtRS/SypEyOQ6UHaFQBKv032X45VvxSJ6Yi5G9behy9h6tNTHTDGh5Vq+KbmBjUWLgY4meCA==", - "dev": true, - "dependencies": { - "@types/d3-array": "*", - "@types/d3-axis": "*", - "@types/d3-brush": "*", - "@types/d3-chord": "*", - "@types/d3-color": "*", - "@types/d3-contour": "*", - "@types/d3-delaunay": "*", - "@types/d3-dispatch": "*", - "@types/d3-drag": "*", - "@types/d3-dsv": "*", - "@types/d3-ease": "*", - "@types/d3-fetch": "*", - "@types/d3-force": "*", - "@types/d3-format": "*", - "@types/d3-geo": "*", - "@types/d3-hierarchy": "*", - "@types/d3-interpolate": "*", - "@types/d3-path": "*", - "@types/d3-polygon": "*", - "@types/d3-quadtree": "*", - "@types/d3-random": "*", - "@types/d3-scale": "*", - "@types/d3-scale-chromatic": "*", - "@types/d3-selection": "*", - "@types/d3-shape": "*", - "@types/d3-time": "*", - "@types/d3-time-format": "*", - "@types/d3-timer": "*", - "@types/d3-transition": "*", - "@types/d3-zoom": "*" - } - }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "dev": true - }, - "node_modules/@types/d3-axis": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", - "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "dependencies": { - "@types/d3-selection": "*" + "@types/ms": "*" } }, - "node_modules/@types/d3-brush": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", - "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "node_modules/@types/form-data": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", + "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", "dev": true, + "peer": true, "dependencies": { - "@types/d3-selection": "*" + "@types/node": "*" } }, - "node_modules/@types/d3-chord": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", - "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", - "dev": true - }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", - "dev": true - }, - "node_modules/@types/d3-contour": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", - "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "node_modules/@types/fs-extra": { + "version": "9.0.13", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", + "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", "dev": true, "dependencies": { - "@types/d3-array": "*", - "@types/geojson": "*" + "@types/node": "*" } }, - "node_modules/@types/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", - "dev": true - }, - "node_modules/@types/d3-dispatch": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", - "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", - "dev": true - }, - "node_modules/@types/d3-drag": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", - "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", "dev": true, + "peer": true, "dependencies": { - "@types/d3-selection": "*" + "@types/minimatch": "*", + "@types/node": "*" } }, - "node_modules/@types/d3-dsv": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", - "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", - "dev": true - }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "dev": true - }, - "node_modules/@types/d3-fetch": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", - "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dev": true, "dependencies": { - "@types/d3-dsv": "*" + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" } }, - "node_modules/@types/d3-force": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.9.tgz", - "integrity": "sha512-IKtvyFdb4Q0LWna6ymywQsEYjK/94SGhPrMfEr1TIc5OBeziTi+1jcCvttts8e0UWZIxpasjnQk9MNk/3iS+kA==", + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, - "node_modules/@types/d3-format": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", - "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, - "node_modules/@types/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", - "dev": true, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "@types/geojson": "*" + "@types/node": "*" } }, - "node_modules/@types/d3-hierarchy": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.6.tgz", - "integrity": "sha512-qlmD/8aMk5xGorUvTUWHCiumvgaUXYldYjNVOWtYoTYY/L+WwIEAmJxUmTgr9LoGNG0PPAOmqMDJVDPc7DOpPw==", + "node_modules/@types/lodash": { + "version": "4.14.189", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", + "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", "dev": true }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "node_modules/@types/lodash.flattendeep": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.9.tgz", + "integrity": "sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==", "dev": true, "dependencies": { - "@types/d3-color": "*" + "@types/lodash": "*" } }, - "node_modules/@types/d3-path": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.2.tgz", - "integrity": "sha512-WAIEVlOCdd/NKRYTsqCpOMHQHemKBEINf8YXMYOtXH0GA7SY0dqMB78P3Uhgfy+4X+/Mlw2wDtlETkN6kQUCMA==", - "dev": true + "node_modules/@types/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" }, - "node_modules/@types/d3-polygon": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", - "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", - "dev": true + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "peer": true }, - "node_modules/@types/d3-quadtree": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", - "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "node_modules/@types/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, - "node_modules/@types/d3-random": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", - "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", - "dev": true - }, - "node_modules/@types/d3-scale": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", - "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", - "dev": true, - "dependencies": { - "@types/d3-time": "*" - } - }, - "node_modules/@types/d3-scale-chromatic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.0.3.tgz", - "integrity": "sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==", - "dev": true - }, - "node_modules/@types/d3-selection": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.10.tgz", - "integrity": "sha512-cuHoUgS/V3hLdjJOLTT691+G2QoqAjCVLmr4kJXR4ha56w1Zdu8UUQ5TxLRqudgNjwXeQxKMq4j+lyf9sWuslg==", - "dev": true - }, - "node_modules/@types/d3-shape": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", - "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", - "dev": true, - "dependencies": { - "@types/d3-path": "*" - } - }, - "node_modules/@types/d3-time": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.3.tgz", - "integrity": "sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==", - "dev": true - }, - "node_modules/@types/d3-time-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", - "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", - "dev": true - }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "dev": true - }, - "node_modules/@types/d3-transition": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.8.tgz", - "integrity": "sha512-ew63aJfQ/ms7QQ4X7pk5NxQ9fZH/z+i24ZfJ6tJSfqxJMrYLiK01EAs2/Rtw/JreGUsS3pLPNV644qXFGnoZNQ==", - "dev": true, - "dependencies": { - "@types/d3-selection": "*" - } - }, - "node_modules/@types/d3-zoom": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", - "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", - "dev": true, - "dependencies": { - "@types/d3-interpolate": "*", - "@types/d3-selection": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/dompurify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", - "dev": true, - "dependencies": { - "@types/trusted-types": "*" - } - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/geojson": { - "version": "7946.0.13", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.13.tgz", - "integrity": "sha512-bmrNrgKMOhM3WsafmbGmC+6dsF2Z308vLFsQ3a/bT8X8Sv5clVYpPars/UPq+sAaJP+5OoLAYgwbkS5QEJdLUQ==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.189", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", - "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", - "dev": true - }, - "node_modules/@types/lodash.flattendeep": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.9.tgz", - "integrity": "sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==", - "dev": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - }, - "node_modules/@types/mermaid": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/@types/mermaid/-/mermaid-9.2.0.tgz", - "integrity": "sha512-AlvLWYer6u4BkO4QzMkHo0t9RkvVIgqggVZmO+5snUiuX2caTKqtdqygX6GeE1VQa/TnXw9WoH0spcmHtG0inQ==", - "deprecated": "This is a stub types definition. mermaid provides its own type definitions, so you do not need this installed.", - "dev": true, - "dependencies": { - "mermaid": "*" - } - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "peer": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", "dev": true }, "node_modules/@types/ms": { @@ -6329,6 +5475,11 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/@types/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -6392,36 +5543,33 @@ "@types/node": "*" } }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", - "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "4.31.2", - "@typescript-eslint/scope-manager": "4.31.2", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "regexpp": "^3.1.0", - "semver": "^7.3.5", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -6430,49 +5578,44 @@ } }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", - "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", + "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/utils": "5.62.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", - "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "4.31.2", - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/typescript-estree": "4.31.2", - "debug": "^4.3.1" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -6481,16 +5624,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", - "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -6524,7 +5667,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", @@ -6537,7 +5680,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "5.62.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", @@ -6564,14 +5707,20 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/utils": { "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6579,183 +5728,22 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", - "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", - "dev": true, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", - "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "4.31.2", - "@typescript-eslint/visitor-keys": "4.31.2", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.31.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", - "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "4.31.2", - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", @@ -6800,6 +5788,29 @@ "dev": true, "peer": true }, + "node_modules/abitype": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", + "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/abortcontroller-polyfill": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", @@ -6835,10 +5846,10 @@ } }, "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -6856,9 +5867,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz", - "integrity": "sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", + "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", "devOptional": true, "engines": { "node": ">=0.4.0" @@ -6958,6 +5969,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -6966,12 +5988,6 @@ "node": ">=8" } }, - "node_modules/ansi-sequence-parser": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", - "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", - "dev": true - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -7103,6 +6119,25 @@ "node": ">=0.10.0" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", @@ -7121,6 +6156,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", @@ -7186,6 +6239,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "peer": true, "engines": { "node": ">=8" } @@ -7410,17 +6464,6 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -7991,6 +7034,17 @@ "fsevents": "~2.3.2" } }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -8360,13 +7414,9 @@ } }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/commondir": { "version": "1.0.1", @@ -8418,6 +7468,13 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/concat-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "peer": true + }, "node_modules/concat-stream/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8448,25 +7505,6 @@ "node": ">= 0.6" } }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/content-hash": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", @@ -8486,9 +7524,9 @@ } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, "node_modules/cookie": { @@ -8626,25 +7664,6 @@ "node": ">=0.6" } }, - "node_modules/crypto-addr-codec/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/crypto-random-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", @@ -8955,6 +7974,27 @@ "node": ">=12" } }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", @@ -9187,9 +8227,9 @@ } }, "node_modules/dagre-d3-es": { - "version": "7.0.9", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.9.tgz", - "integrity": "sha512-rYR4QfVmy+sR44IBDvVtcAmOReGBvRCWDpO2QjYwqgh9yijw6eSHBqaPG/LIOEy7aBsniLvtMW6pg19qJhq60w==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", "dev": true, "dependencies": { "d3": "^7.8.2", @@ -9585,9 +8625,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.3.tgz", - "integrity": "sha512-q6QaLcakcRjebxjg8/+NP+h0rPfatOgOzc46Fst9VAA3jF2ApfKBNKMzdP4DYTqtUMXSCd5pRS/8Po/OmoCHZQ==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", "dev": true }, "node_modules/domutils": { @@ -9626,9 +8666,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.604", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.604.tgz", - "integrity": "sha512-JAJ4lyLJYudlgJPYJicimU9R+qZ/3iyeyQS99bfT7PWi7psYWeN84lPswTjpHxQueU34PKxM/IJzQS6poYlovQ==", + "version": "1.4.605", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.605.tgz", + "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg==", "dev": true }, "node_modules/elkjs": { @@ -10364,57 +9404,55 @@ } }, "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", "dev": true, "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -10504,41 +9542,43 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.24.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", - "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.3", - "array.prototype.flat": "^1.2.4", - "debug": "^2.6.9", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.6.2", - "find-up": "^2.0.0", - "has": "^1.0.3", - "is-core-module": "^2.6.0", - "minimatch": "^3.0.4", - "object.values": "^1.1.4", - "pkg-up": "^2.0.0", - "read-pkg-up": "^3.0.0", - "resolve": "^1.20.0", - "tsconfig-paths": "^3.11.0" + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" }, "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" } }, "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "dependencies": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import/node_modules/doctrine": { @@ -10553,11 +9593,14 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, "node_modules/eslint-plugin-mocha": { "version": "9.0.0", @@ -10657,7 +9700,7 @@ "eslint": ">=5" } }, - "node_modules/eslint-visitor-keys": { + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", @@ -10666,87 +9709,58 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "type-fest": "^0.20.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4.0" } }, "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -10898,6 +9912,54 @@ "@ethersproject/rlp": "^5.7.0" } }, + "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, "node_modules/eth-gas-reporter/node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -10908,13 +9970,6 @@ "node": ">=6" } }, - "node_modules/eth-gas-reporter/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, "node_modules/eth-gas-reporter/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -10935,6 +9990,19 @@ "node": ">=0.1.90" } }, + "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "dev": true, + "peer": true, + "dependencies": { + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" + } + }, "node_modules/eth-gas-reporter/node_modules/ethers": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", @@ -10984,69 +10052,23 @@ "@ethersproject/wordlists": "5.7.0" } }, - "node_modules/eth-gas-reporter/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "node_modules/eth-gas-reporter/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "peer": true, "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "brace-expansion": "^2.0.1" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eth-gas-reporter/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "node_modules/eth-gas-reporter/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "peer": true, "dependencies": { @@ -11104,48 +10126,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/eth-gas-reporter/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eth-gas-reporter/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, "node_modules/eth-gas-reporter/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -11187,6 +10167,11 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/eth-lib/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, "node_modules/eth-lib/node_modules/ws": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", @@ -11206,27 +10191,27 @@ } }, "node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", + "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" + "@types/pbkdf2": "^3.0.0", + "@types/secp256k1": "^4.0.1", + "blakejs": "^1.1.0", + "browserify-aes": "^1.2.0", + "bs58check": "^2.1.2", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "hash.js": "^1.1.7", + "keccak": "^3.0.0", + "pbkdf2": "^3.0.17", + "randombytes": "^2.1.0", + "safe-buffer": "^5.1.2", + "scrypt-js": "^3.0.0", + "secp256k1": "^4.0.1", + "setimmediate": "^1.0.5" } }, - "node_modules/ethereum-cryptography/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, "node_modules/ethereum-ens": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", @@ -11254,12 +10239,20 @@ "ethereumjs-util": "^6.0.0" } }, + "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { + "version": "4.11.6", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", + "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/ethereumjs-abi/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, - "node_modules/ethereumjs-util": { + "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", @@ -11273,39 +10266,19 @@ "rlp": "^2.2.3" } }, - "node_modules/ethereumjs-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/ethereumjs-util/node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", + "node_modules/ethereumjs-util": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", + "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" + "@types/bn.js": "^5.1.0", + "bn.js": "^5.1.2", + "create-hash": "^1.1.2", + "ethereum-cryptography": "^0.1.3", + "rlp": "^2.2.4" + }, + "engines": { + "node": ">=10.0.0" } }, "node_modules/ethers": { @@ -11500,17 +10473,6 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -11549,25 +10511,6 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -11636,6 +10579,18 @@ "node": ">=8.6.0" } }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -11757,14 +10712,19 @@ } }, "node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { - "locate-path": "^2.0.0" + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat": { @@ -11905,16 +10865,16 @@ ] }, "node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, "engines": { - "node": ">=12" + "node": ">=6 <7 || >=8" } }, "node_modules/fs-minipass": { @@ -12219,14 +11179,15 @@ } }, "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "is-glob": "^4.0.3" }, "engines": { - "node": ">= 6" + "node": ">=10.13.0" } }, "node_modules/global": { @@ -12280,12 +11241,18 @@ } }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -12323,15 +11290,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globby/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -12526,14 +11484,56 @@ "hardhat": "^2.0.2" } }, - "node_modules/hardhat/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, + "node_modules/hardhat/node_modules/@noble/hashes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", + "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ] + }, + "node_modules/hardhat/node_modules/@scure/bip32": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", + "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@noble/secp256k1": "~1.7.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/@scure/bip39": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", + "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "@noble/hashes": "~1.2.0", + "@scure/base": "~1.1.0" + } + }, + "node_modules/hardhat/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, "node_modules/hardhat/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", @@ -12545,11 +11545,6 @@ "node": ">=4" } }, - "node_modules/hardhat/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, "node_modules/hardhat/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -12592,50 +11587,38 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "node_modules/hardhat/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "node_modules/hardhat/node_modules/ethereum-cryptography": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", + "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" + "@noble/hashes": "1.2.0", + "@noble/secp256k1": "1.7.1", + "@scure/bip32": "1.1.5", + "@scure/bip39": "1.1.1" } }, - "node_modules/hardhat/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/hardhat/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", "dependencies": { - "argparse": "^2.0.1" + "locate-path": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/hardhat/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "engines": { + "node": ">=4" } }, "node_modules/hardhat/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", "dependencies": { - "p-locate": "^5.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/hardhat/node_modules/minimatch": { @@ -12703,6 +11686,56 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hardhat/node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/mocha/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hardhat/node_modules/mocha/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -12734,39 +11767,41 @@ } }, "node_modules/hardhat/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dependencies": { - "yocto-queue": "^0.1.0" + "p-try": "^1.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/hardhat/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", "dependencies": { - "p-limit": "^3.0.2" + "p-limit": "^1.1.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" + } + }, + "node_modules/hardhat/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "engines": { + "node": ">=4" } }, "node_modules/hardhat/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/hardhat/node_modules/resolve": { @@ -12807,14 +11842,6 @@ "node": ">=4" } }, - "node_modules/hardhat/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/hardhat/node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -12840,15 +11867,6 @@ } } }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -12926,25 +11944,6 @@ "node": ">=4" } }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/hash-test-vectors": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", @@ -13218,12 +12217,11 @@ } }, "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" @@ -13268,9 +12266,9 @@ ] }, "node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -13864,6 +12862,20 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isows": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", + "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "ws": "*" + } + }, "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -13957,18 +12969,6 @@ "node": ">=10" } }, - "node_modules/istanbul-lib-report/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/istanbul-lib-report/node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -13984,27 +12984,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -14059,18 +13038,21 @@ "dev": true }, "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -14093,12 +13075,6 @@ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, - "node_modules/json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -14138,19 +13114,10 @@ "node": ">=6" } }, - "node_modules/jsonc-parser": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", - "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", - "dev": true - }, "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", "optionalDependencies": { "graceful-fs": "^4.1.6" } @@ -14311,39 +13278,63 @@ "dev": true }, "node_modules/load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dependencies": { "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dependencies": { + "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/load-json-file/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dependencies": { + "is-utf8": "^0.2.0" + }, "engines": { - "node": ">=4" + "node": ">=0.10.0" } }, "node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { @@ -14393,6 +13384,12 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -14401,7 +13398,8 @@ "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "peer": true }, "node_modules/log-symbols": { "version": "4.1.0", @@ -14475,12 +13473,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lunr": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", - "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", - "dev": true - }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -14530,18 +13522,6 @@ "dev": true, "peer": true }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "dev": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/mcl-wasm": { "version": "0.7.9", "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", @@ -14627,273 +13607,125 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "node_modules/meow/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "node_modules/meow/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" } }, - "node_modules/meow/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 8" } }, - "node_modules/meow/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "node_modules/mermaid": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", + "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@braintree/sanitize-url": "^6.0.0", + "@khanacademy/simple-markdown": "^0.8.6", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "2.4.5", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.2", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" } }, - "node_modules/meow/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { + "version": "0.8.6", + "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", + "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", "dev": true, "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@types/react": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "16.14.0", + "react-dom": "16.14.0" } }, - "node_modules/meow/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "node_modules/mermaid/node_modules/react": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", + "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", "dev": true, + "peer": true, "dependencies": { - "p-limit": "^4.0.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, - "node_modules/meow/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "node_modules/mermaid/node_modules/react-dom": { + "version": "16.14.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", + "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", "dev": true, + "peer": true, "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2", + "scheduler": "^0.19.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "react": "^16.14.0" } }, - "node_modules/meow/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/meow/node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/meow/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.4.3.tgz", - "integrity": "sha512-TLkQEtqhRSuEHSE34lh5bCa94KATCyluAXmFnNI2PRZwOpXFeqiJWwZl+d2CcemE1RS6QbbueSSq9QIg8Uxcyw==", + "node_modules/mermaid/node_modules/scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", "dev": true, + "peer": true, "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.9", - "dayjs": "^1.11.7", - "dompurify": "2.4.3", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" } }, "node_modules/mermaid/node_modules/uuid": { @@ -15145,12 +13977,6 @@ "node": ">=6" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -15174,49 +14000,6 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -15235,45 +14018,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, - "node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -15747,12 +14491,6 @@ "wrap-ansi": "^6.2.0" } }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, "node_modules/nyc/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -15817,24 +14555,6 @@ "node": ">=8" } }, - "node_modules/nyc/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -15950,10 +14670,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", @@ -15967,11 +14687,40 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obliterator": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", + "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" + }, "node_modules/oboe": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", @@ -16106,25 +14855,33 @@ } }, "node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { - "p-try": "^1.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { - "p-limit": "^1.1.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { @@ -16142,11 +14899,12 @@ } }, "node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/package-hash": { @@ -16202,16 +14960,21 @@ "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" }, "node_modules/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "dependencies": { + "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse5": { @@ -16263,11 +15026,12 @@ } }, "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/path-is-absolute": { @@ -16375,12 +15139,13 @@ } }, "node_modules/pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true, + "peer": true, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/pinkie": { @@ -16466,36 +15231,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", - "integrity": "sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==", - "dev": true, - "dependencies": { - "find-up": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss": { "version": "8.4.32", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", @@ -16558,15 +15293,18 @@ } }, "node_modules/prettier": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", - "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" }, "engines": { "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/prettier-linter-helpers": { @@ -16634,15 +15372,6 @@ "node": ">=8" } }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/promise": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", @@ -16740,12 +15469,6 @@ } ] }, - "node_modules/purecss": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/purecss/-/purecss-2.2.0.tgz", - "integrity": "sha512-jEPrAALLgE+InDARWdPDt0AkZ1Bi0yXxHj4BOwWImq06sGIDe5CagPyS6Z9WGyEgMuZonrrhinInJ80nAHTIUA==", - "dev": true - }, "node_modules/qs": { "version": "6.11.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", @@ -16842,17 +15565,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -16941,116 +15653,236 @@ } }, "node_modules/read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", + "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", "dev": true, "dependencies": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/read-pkg-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", - "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", + "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", "dev": true, "dependencies": { - "find-up": "^2.0.0", - "read-pkg": "^3.0.0" + "find-up": "^6.3.0", + "read-pkg": "^7.1.0", + "type-fest": "^2.5.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "pify": "^3.0.0" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "dev": true, "dependencies": { - "readable-stream": "^3.6.0" + "p-limit": "^4.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, "engines": { - "node": ">=8.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dev": true, + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, "peer": true, "dependencies": { "resolve": "^1.1.6" @@ -17132,18 +15964,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -17588,9 +16408,23 @@ } }, "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safe-regex-test": { "version": "1.0.0", @@ -17678,6 +16512,34 @@ "node": ">=0.10.0" } }, + "node_modules/sc-istanbul/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "peer": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "peer": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/sc-istanbul/node_modules/resolve": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", @@ -17740,10 +16602,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -17758,7 +16619,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -17769,8 +16629,7 @@ "node_modules/semver/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/send": { "version": "0.18.0", @@ -17981,18 +16840,6 @@ "node": ">=4" } }, - "node_modules/shiki": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.5.tgz", - "integrity": "sha512-1gCAYOcmCFONmErGTrS1fjzJLA7MGZmKzrBNX7apqSwhyITJg2O102uFzXUeBxNnEkDA9vHIKLyeKq0V083vIw==", - "dev": true, - "dependencies": { - "ansi-sequence-parser": "^1.1.0", - "jsonc-parser": "^3.2.0", - "vscode-oniguruma": "^1.7.0", - "vscode-textmate": "^8.0.0" - } - }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -18089,6 +16936,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -18131,11 +16979,6 @@ "node": ">=8.0.0" } }, - "node_modules/solc/node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, "node_modules/solc/node_modules/fs-extra": { "version": "0.30.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", @@ -18249,13 +17092,6 @@ "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "peer": true - }, "node_modules/solidity-coverage/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -18308,23 +17144,6 @@ "dev": true, "peer": true }, - "node_modules/solidity-coverage/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/solidity-coverage/node_modules/fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", @@ -18360,96 +17179,47 @@ "node": ">=8" } }, - "node_modules/solidity-coverage/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "node_modules/solidity-coverage/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", "dev": true, "peer": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, "engines": { - "node": ">= 4" + "node": ">=10" } }, - "node_modules/solidity-coverage/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/solidity-coverage/node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", "dev": true, "peer": true, "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/solidity-coverage/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solidity-coverage/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" }, "bin": { "_mocha": "bin/_mocha", @@ -18499,58 +17269,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/solidity-coverage/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/solidity-coverage/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/solidity-coverage/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/solidity-coverage/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -18574,16 +17292,6 @@ "node": ">=4" } }, - "node_modules/solidity-coverage/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/solidity-coverage/node_modules/workerpool": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", @@ -18748,25 +17456,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-argv": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", @@ -19122,14 +17811,6 @@ "node": ">=10.19.0" } }, - "node_modules/swarm-js/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/swarm-js/node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -19157,14 +17838,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/swarm-js/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/sync-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", @@ -19190,32 +17863,11 @@ "get-port": "^3.1.0" } }, - "node_modules/synckit": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.6.tgz", - "integrity": "sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA==", - "dev": true, - "dependencies": { - "@pkgr/utils": "^2.4.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/synckit/node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true - }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "peer": true, "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -19267,6 +17919,7 @@ "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -19281,7 +17934,8 @@ "node_modules/table/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "peer": true }, "node_modules/tapable": { "version": "2.2.1", @@ -19309,25 +17963,6 @@ "node": ">=4.5" } }, - "node_modules/tar/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/temp-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", @@ -19650,18 +18285,6 @@ } } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -19782,9 +18405,10 @@ } }, "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -19829,21 +18453,6 @@ "typescript": ">=4.3.0" } }, - "node_modules/typechain/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, "node_modules/typechain/node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -19865,16 +18474,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/typechain/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/typechain/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -19888,16 +18487,6 @@ "node": ">=10" } }, - "node_modules/typechain/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/typed-array-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", @@ -19978,62 +18567,17 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typedoc": { - "version": "0.23.28", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", - "integrity": "sha512-9x1+hZWTHEQcGoP7qFmlo4unUoVJLB0H/8vfO/7wqTnZxg4kPuji9y3uRzEu0ZKez63OJAUmiGhUrtukC6Uj3w==", - "dev": true, - "dependencies": { - "lunr": "^2.3.9", - "marked": "^4.2.12", - "minimatch": "^7.1.3", - "shiki": "^0.14.1" - }, + "node_modules/typescript": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "devOptional": true, "bin": { - "typedoc": "bin/typedoc" + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": ">= 14.14" - }, - "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x" - } - }, - "node_modules/typedoc/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/typedoc/node_modules/minimatch": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz", - "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" + "node": ">=12.20" } }, "node_modules/typical": { @@ -20112,11 +18656,11 @@ } }, "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "engines": { - "node": ">= 10.0.0" + "node": ">= 4.0.0" } }, "node_modules/unpipe": { @@ -20242,12 +18786,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", - "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -20298,6 +18836,55 @@ "extsprintf": "^1.2.0" } }, + "node_modules/viem": { + "version": "1.19.11", + "resolved": "https://registry.npmjs.org/viem/-/viem-1.19.11.tgz", + "integrity": "sha512-dbsXEWDBZkByuzJXAs/e01j7dpUJ5ICF5WcyntFwf8Y97n5vnC/91lAleSa6DA5V4WJvYZbhDpYeTctsMAQnhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "0.9.8", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/viem/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/vite": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", @@ -20454,18 +19041,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/vscode-oniguruma": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", - "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", - "dev": true - }, - "node_modules/vscode-textmate": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", - "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", - "dev": true - }, "node_modules/web-worker": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", @@ -20874,18 +19449,6 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/web3-utils/node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", @@ -21310,99 +19873,41 @@ "ndjson": "2.0.0" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.13", - "@types/mocha": "9.1.1", - "@types/ndjson": "2.0.1", - "@types/node": "16.11.7", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", - "mocha": "^9.1.3", - "nyc": "15.1.0", - "prettier": "2.4.1", - "rimraf": "3.0.2", - "ts-node": "10.9.1", - "typescript": "^5.0.2" + "hardhat": "^2.18.0" } }, - "packages/core/node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", - "dev": true, + "packages/core/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "node": ">=12" } }, - "packages/core/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, + "packages/core/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "universalify": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/core/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "packages/core/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, + "packages/core/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0" } }, "packages/hardhat-plugin": { @@ -21414,118 +19919,88 @@ "@nomicfoundation/ignition-ui": "^0.12.0", "chalk": "^4.0.0", "debug": "^4.3.2", - "ethers": "^6.7.0", "fs-extra": "^10.0.0", "prompts": "^2.4.2" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-network-helpers": "1.0.9", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/d3": "7.4.0", - "@types/debug": "^4.1.7", - "@types/dompurify": "2.4.0", - "@types/fs-extra": "^9.0.13", - "@types/lodash": "4.14.189", - "@types/lodash.flattendeep": "^4.4.7", - "@types/mermaid": "^9.1.0", - "@types/mocha": "^9.0.0", - "@types/node": "16.11.7", - "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "esbuild": "^0.15.9", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-prettier": "4.0.0", "hardhat": "^2.18.0", - "mermaid": "^9.1.7", - "mocha": "^9.1.1", - "nyc": "15.1.0", - "prettier": "2.4.1", - "purecss": "^2.1.0", - "rimraf": "3.0.2", - "sinon": "^14.0.0", - "ts-node": "10.9.1", - "typescript": "^5.0.2" + "viem": "^1.18.1" }, "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/hardhat-verify": "^2.0.1", "hardhat": "^2.18.0" } }, - "packages/hardhat-plugin/node_modules/eslint-import-resolver-typescript": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz", - "integrity": "sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "get-tsconfig": "^4.5.0", - "globby": "^13.1.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "synckit": "^0.8.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" + "packages/hardhat-plugin-ethers": { + "name": "@nomicfoundation/hardhat-ignition-ethers", + "version": "0.12.0", + "license": "MIT", + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/sinon": "^10.0.13" }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.12.0", + "ethers": "^6.7.0", + "hardhat": "^2.18.0" + } + }, + "packages/hardhat-plugin-viem": { + "name": "@nomicfoundation/hardhat-ignition-viem", + "version": "0.12.0", + "license": "MIT", + "devDependencies": { + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/sinon": "^10.0.13" }, "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" + "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/ignition-core": "^0.12.0", + "hardhat": "^2.18.0", + "viem": "^1.18.1" } }, - "packages/hardhat-plugin/node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", - "dev": true, + "packages/hardhat-plugin/node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "packages/hardhat-plugin/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" + "packages/hardhat-plugin/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "packages/hardhat-plugin/node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", - "dev": true, + "packages/hardhat-plugin/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 10.0.0" } }, "packages/ui": { @@ -21539,571 +20014,18 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/styled-components": "5.1.26", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", "@vitejs/plugin-react": "^4.0.0", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "mermaid": "10.1.0", - "mocha": "^9.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "6.11.0", "react-tooltip": "^5.21.4", - "rimraf": "3.0.2", "styled-components": "5.3.10", - "ts-node": "10.9.1", - "typescript": "^5.0.2", "vite": "^4.3.2", "vite-plugin-singlefile": "0.13.5" } - }, - "packages/ui/node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "packages/ui/node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "packages/ui/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/ui/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/ui/node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/ui/node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/ui/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "packages/ui/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "packages/ui/node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "packages/ui/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "packages/ui/node_modules/dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", - "dev": true, - "dependencies": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "packages/ui/node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", - "dev": true - }, - "packages/ui/node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "packages/ui/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "packages/ui/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "packages/ui/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "packages/ui/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "packages/ui/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/mermaid": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", - "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", - "dev": true, - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "@khanacademy/simple-markdown": "^0.8.6", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "2.4.5", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "packages/ui/node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", - "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", - "dev": true, - "dependencies": { - "@types/react": ">=16.0.0" - }, - "peerDependencies": { - "react": "16.14.0", - "react-dom": "16.14.0" - } - }, - "packages/ui/node_modules/mermaid/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "packages/ui/node_modules/mermaid/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "packages/ui/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "packages/ui/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "packages/ui/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "packages/ui/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } } } } diff --git a/package.json b/package.json index 7d28dfe4b6..5243ce538f 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,11 @@ "private": true, "workspaces": { "packages": [ - "packages/*", + "packages/core", + "packages/ui", + "packages/hardhat-plugin", + "packages/hardhat-plugin-ethers", + "packages/hardhat-plugin-viem", "examples/*" ] }, @@ -20,22 +24,43 @@ "test:examples": "npm run test -w examples --if-present", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", "fullcheck": "npm run build && npm run lint && npm run test:coverage && npm run test:examples", - "typedocs": "typedoc --entryPointStrategy packages --out ./typedocs ./packages/core && open-cli ./typedocs/index.html", "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { - "@microsoft/api-extractor": "7.34.4", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "eslint": "^7.32.0", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", + "@microsoft/api-extractor": "7.38.3", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.5", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/lodash": "4.14.189", + "@types/lodash.flattendeep": "^4.4.7", + "@types/mocha": "9.1.1", + "@types/ndjson": "2.0.1", + "@types/node": "16.11.7", + "@types/prompts": "^2.4.2", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "esbuild": "^0.15.9", + "eslint": "^8.38.0", "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-import": "2.24.2", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", + "hardhat": "^2.18.0", + "mocha": "^9.1.3", + "nyc": "15.1.0", "open-cli": "7.2.0", - "prettier": "2.4.1", - "typedoc": "0.23.28", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", "typescript": "^5.0.2" } } diff --git a/packages/core/.eslintrc.js b/packages/core/.eslintrc.js index 4285f9e252..a68848ebfe 100644 --- a/packages/core/.eslintrc.js +++ b/packages/core/.eslintrc.js @@ -4,5 +4,5 @@ module.exports = { project: `${__dirname}/tsconfig.json`, sourceType: "module", }, - ignorePatterns: [".eslintrc.js"], + ignorePatterns: [".eslintrc.js", "./dist/**/*", "./node_modules/**/*"], }; diff --git a/packages/core/package.json b/packages/core/package.json index d0d6bf2769..2bc435d9f6 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -46,33 +46,9 @@ "prepack": "npm run build" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.13", - "@types/mocha": "9.1.1", - "@types/ndjson": "2.0.1", - "@types/node": "16.11.7", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", - "mocha": "^9.1.3", - "nyc": "15.1.0", - "prettier": "2.4.1", - "rimraf": "3.0.2", - "ts-node": "10.9.1", - "typescript": "^5.0.2" + "hardhat": "^2.18.0" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/core/src/types/artifact.ts b/packages/core/src/types/artifact.ts index 5e2e56f4cf..abfe6ad078 100644 --- a/packages/core/src/types/artifact.ts +++ b/packages/core/src/types/artifact.ts @@ -1,13 +1,20 @@ +/** + * The type of the contract artifact's ABI. + * + * @beta + */ +export type Abi = readonly any[] | any[]; + /** * An compilation artifact representing a smart contract. * * @beta */ -export interface Artifact { +export interface Artifact { contractName: string; sourceName: string; bytecode: string; - abi: any[]; + abi: AbiT; linkReferences: Record< string, Record> diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index 55c873f6f3..761359cbc1 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -1,4 +1,4 @@ -import { Artifact } from "./artifact"; +import { Abi, Artifact } from "./artifact"; import { AccountRuntimeValue, AddressResolvableFuture, @@ -141,23 +141,23 @@ export interface IgnitionModuleBuilder { options?: ContractOptions ): NamedArtifactContractDeploymentFuture; - contract( + contract( contractName: string, - artifact: Artifact, + artifact: Artifact, args?: ArgumentType[], options?: ContractOptions - ): ContractDeploymentFuture; + ): ContractDeploymentFuture; library( libraryName: LibraryNameT, options?: LibraryOptions ): NamedArtifactLibraryDeploymentFuture; - library( + library( libraryName: string, - artifact: Artifact, + artifact: Artifact, options?: LibraryOptions - ): LibraryDeploymentFuture; + ): LibraryDeploymentFuture; call( contractFuture: CallableContractFuture, @@ -183,15 +183,15 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): NamedArtifactContractAtFuture; - contractAt( + contractAt( contractName: string, - artifact: Artifact, + artifact: Artifact, address: | string | AddressResolvableFuture | ModuleParameterRuntimeValue, options?: ContractAtOptions - ): ContractAtFuture; + ): ContractAtFuture; readEventArgument( futureToReadFrom: diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index d38d2b3d3f..8dc30761d1 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -1,4 +1,4 @@ -import { Artifact } from "./artifact"; +import { Abi, Artifact } from "./artifact"; /** * Base argument type that smart contracts can receive in their constructors @@ -149,13 +149,13 @@ export interface NamedArtifactContractDeploymentFuture< * * @beta */ -export interface ContractDeploymentFuture { +export interface ContractDeploymentFuture { type: FutureType.CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; contractName: string; - artifact: Artifact; + artifact: Artifact; constructorArgs: ArgumentType[]; libraries: Record>; value: @@ -189,13 +189,13 @@ export interface NamedArtifactLibraryDeploymentFuture< * * @beta */ -export interface LibraryDeploymentFuture { +export interface LibraryDeploymentFuture { type: FutureType.LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; dependencies: Set; contractName: string; - artifact: Artifact; + artifact: Artifact; libraries: Record>; from: string | AccountRuntimeValue | undefined; } @@ -267,7 +267,7 @@ export interface NamedArtifactContractAtFuture { * * @beta */ -export interface ContractAtFuture { +export interface ContractAtFuture { type: FutureType.CONTRACT_AT; id: string; module: IgnitionModule; @@ -277,7 +277,7 @@ export interface ContractAtFuture { | string | AddressResolvableFuture | ModuleParameterRuntimeValue; - artifact: Artifact; + artifact: Artifact; } /** diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js index e9152d832d..fca85a0ced 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js @@ -4,7 +4,7 @@ const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; -const ONE_GWEI = BigInt(hre.ethers.parseUnits("1", "gwei")); +const ONE_GWEI = 1_000_000_000n; module.exports = buildModule("LockModule", (m) => { const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); diff --git a/packages/core/test/build-module.ts b/packages/core/test/build-module.ts new file mode 100644 index 0000000000..bcc01dae29 --- /dev/null +++ b/packages/core/test/build-module.ts @@ -0,0 +1,25 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../src/build-module"; + +describe("buildModule", () => { + describe("error handling", () => { + it("should error on passing async callback", async function () { + assert.throws( + () => buildModule("AsyncModule", (async () => {}) as any), + /The callback passed to 'buildModule' for AsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./ + ); + }); + + it("should error on module throwing an exception", async function () { + assert.throws( + () => + buildModule("AsyncModule", () => { + throw new Error("User thrown error"); + }), + /User thrown error/ + ); + }); + }); +}); diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index d43cb456a4..82b3280d92 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -858,7 +858,7 @@ m.call(..., { id: "MyUniqueId"})` ], name: "inc", outputs: [], - stateMutability: "public", + stateMutability: "payable", type: "function", }, ], @@ -901,7 +901,7 @@ m.call(..., { id: "MyUniqueId"})` ], name: "inc", outputs: [], - stateMutability: "public", + stateMutability: "payable", type: "function", }, ], diff --git a/packages/core/test/execution/abi.ts b/packages/core/test/execution/abi.ts index a3c029ffb0..7d0697a780 100644 --- a/packages/core/test/execution/abi.ts +++ b/packages/core/test/execution/abi.ts @@ -475,7 +475,7 @@ describe("abi", () => { describe("Error decoding", () => { function decode( contractName: keyof typeof staticCallResultFixtures, - functionName: keyof typeof staticCallResultFixtures[typeof contractName] + functionName: keyof (typeof staticCallResultFixtures)[typeof contractName] ) { const decoded = decodeError( staticCallResultFixtures[contractName][functionName].returnData, diff --git a/packages/hardhat-plugin-ethers/.eslintrc.js b/packages/hardhat-plugin-ethers/.eslintrc.js new file mode 100644 index 0000000000..4285f9e252 --- /dev/null +++ b/packages/hardhat-plugin-ethers/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/tsconfig.json`, + sourceType: "module", + }, + ignorePatterns: [".eslintrc.js"], +}; diff --git a/packages/hardhat-plugin-ethers/.gitignore b/packages/hardhat-plugin-ethers/.gitignore new file mode 100644 index 0000000000..849ddff3b7 --- /dev/null +++ b/packages/hardhat-plugin-ethers/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/hardhat-plugin-ethers/.mocharc.json b/packages/hardhat-plugin-ethers/.mocharc.json new file mode 100644 index 0000000000..3c924036ae --- /dev/null +++ b/packages/hardhat-plugin-ethers/.mocharc.json @@ -0,0 +1,6 @@ +{ + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts", + "timeout": 20000, + "exit": true +} diff --git a/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-plugin-ethers/.npmignore new file mode 100644 index 0000000000..77b73f35d4 --- /dev/null +++ b/packages/hardhat-plugin-ethers/.npmignore @@ -0,0 +1,14 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc +!dist +dist/test +src/ +test/ +esbuild.js diff --git a/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-plugin-ethers/.nycrc new file mode 100644 index 0000000000..c573ff2ac1 --- /dev/null +++ b/packages/hardhat-plugin-ethers/.nycrc @@ -0,0 +1,19 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": false, + "statements": 50, + "branches": 30, + "functions": 42, + "lines": 50, + "all": true, + "include": [ + "src/**/*.ts" + ], + "reporter": [ + "html", + "lcov", + "text", + "text-summary" + ], + "report-dir": "coverage" +} diff --git a/packages/hardhat-plugin-ethers/.prettierignore b/packages/hardhat-plugin-ethers/.prettierignore new file mode 100644 index 0000000000..4ae5fe88f4 --- /dev/null +++ b/packages/hardhat-plugin-ethers/.prettierignore @@ -0,0 +1,9 @@ +/node_modules +/dist +/test/fixture-projects/*/artifacts +/test/fixture-projects/*/cache +/coverage +/.nyc_output +/test/fixture-projects/*/deployments/*/artifacts +/test/fixture-projects/*/deployments/*/build-info + diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md new file mode 100644 index 0000000000..41ae03a279 --- /dev/null +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). diff --git a/packages/hardhat-plugin-ethers/README.md b/packages/hardhat-plugin-ethers/README.md new file mode 100644 index 0000000000..5d0862da2d --- /dev/null +++ b/packages/hardhat-plugin-ethers/README.md @@ -0,0 +1,56 @@ +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +--- + +# Hardhat Ignition with Ethers + +> **Note:** This package includes support for [Ethers](https://docs.ethers.org/v5/). To use Hardhat Ignition with Viem instead, see the [Hardhat Ignition Viem plugin](https://www.npmjs.com/search?q=%40nomicfoundation%2Fhardhat-ignition-viem). + +Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Community Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-ignition-ethers +``` + +Import the plugin in your `hardhat.config.js``: + +```js +require("@nomicfoundation/hardhat-ignition-ethers"); +``` + +Or if you are using TypeScript, in your `hardhat.config.ts``: + +```js +import "@nomicfoundation/hardhat-ignition-ethers"; +``` + +## Documentation + +On [Hardhat Ignition's website](https://hardhat.org/ignition) you will find guides for: + +- [Getting started](https://hardhat.org/ignition/docs/getting-started) +- [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) +- [Deploying a module](https://hardhat.org/ignition/docs/guides/deploy) +- [Visualizing your module](https://hardhat.org/ignition/docs/guides/visualize) +- [Handling errors](https://hardhat.org/ignition/docs/guides/error-handling) +- [Modifying an existing module](https://hardhat.org/ignition/docs/guides/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/ignition/docs/guides/tests) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. + +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json new file mode 100644 index 0000000000..27ac0460af --- /dev/null +++ b/packages/hardhat-plugin-ethers/package.json @@ -0,0 +1,55 @@ +{ + "name": "@nomicfoundation/hardhat-ignition-ethers", + "version": "0.12.0", + "license": "MIT", + "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "description": "The Ethers extension to Hardhat Ignition. Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", + "repository": "github:NomicFoundation/hardhat-ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment", + "ethers" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist/src/", + "src/", + "LICENSE", + "README.md", + "CHANGELOG.md" + ], + "scripts": { + "build": "tsc --build", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:build": "tsc --project ./test/", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", + "prepack": "npm run build" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/sinon": "^10.0.13" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.12.0", + "ethers": "^6.7.0", + "hardhat": "^2.18.0" + } +} diff --git a/packages/hardhat-plugin/src/ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts similarity index 83% rename from packages/hardhat-plugin/src/ignition-helper.ts rename to packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index be215a8389..e5f25f1c66 100644 --- a/packages/hardhat-plugin/src/ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -1,7 +1,8 @@ -import type { Contract } from "ethers"; - import { - deploy, + HardhatArtifactResolver, + errorDeploymentResultToExceptionMessage, +} from "@nomicfoundation/hardhat-ignition/helpers"; +import { DeployConfig, DeploymentParameters, DeploymentResultType, @@ -9,22 +10,34 @@ import { Future, IgnitionModule, IgnitionModuleResult, - isContractFuture, NamedArtifactContractAtFuture, NamedArtifactContractDeploymentFuture, SuccessfulDeploymentResult, + deploy, + isContractFuture, } from "@nomicfoundation/ignition-core"; +import { Contract } from "ethers"; import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; -import { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; - -export type DeployedContract = { - [contractName in ContractNameT]: Contract; +export type IgnitionModuleResultsTToEthersContracts< + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> = { + [contract in keyof IgnitionModuleResultsT]: IgnitionModuleResultsT[contract] extends + | NamedArtifactContractDeploymentFuture + | NamedArtifactContractAtFuture + ? TypeChainEthersContractByName + : Contract; }; -export class IgnitionHelper { +// TODO: Make this work to have support for TypeChain +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export type TypeChainEthersContractByName = Contract; + +export class EthersIgnitionHelper { + public type = "ethers"; + private _provider: EIP1193Provider; private _deploymentDir: string | undefined; @@ -88,17 +101,22 @@ export class IgnitionHelper { if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { const message = errorDeploymentResultToExceptionMessage(result); - throw new HardhatPluginError("hardhat-ignition", message); + throw new HardhatPluginError("hardhat-ignition-viem", message); } - return this._toEthersContracts(ignitionModule, result); + return EthersIgnitionHelper._toEthersContracts( + this._hre, + ignitionModule, + result + ); } - private async _toEthersContracts< + private static async _toEthersContracts< ModuleIdT extends string, ContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult >( + hre: HardhatRuntimeEnvironment, ignitionModule: IgnitionModule< ModuleIdT, ContractNameT, @@ -117,6 +135,7 @@ export class IgnitionHelper { async ([name, contractFuture]) => [ name, await this._getContract( + hre, contractFuture, result.contracts[contractFuture.id] ), @@ -126,7 +145,8 @@ export class IgnitionHelper { ); } - private async _getContract( + private static async _getContract( + hre: HardhatRuntimeEnvironment, future: Future, deployedContract: { address: string } ): Promise { @@ -138,30 +158,17 @@ export class IgnitionHelper { } if ("artifact" in future) { - return this._hre.ethers.getContractAt( - future.artifact.abi, + return hre.ethers.getContractAt( + // The abi meets the abi spec and we assume we can convert to + // an acceptable Ethers abi + future.artifact.abi as any[], deployedContract.address ); } - return this._hre.ethers.getContractAt( + return hre.ethers.getContractAt( future.contractName, deployedContract.address ); } } - -export type IgnitionModuleResultsTToEthersContracts< - ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult -> = { - [contract in keyof IgnitionModuleResultsT]: IgnitionModuleResultsT[contract] extends - | NamedArtifactContractDeploymentFuture - | NamedArtifactContractAtFuture - ? TypeChainEthersContractByName - : Contract; -}; - -// TODO: Make this work to have support for TypeChain -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export type TypeChainEthersContractByName = Contract; diff --git a/packages/hardhat-plugin-ethers/src/index.ts b/packages/hardhat-plugin-ethers/src/index.ts new file mode 100644 index 0000000000..8fe895bae0 --- /dev/null +++ b/packages/hardhat-plugin-ethers/src/index.ts @@ -0,0 +1,28 @@ +import "@nomicfoundation/hardhat-ethers"; +import "@nomicfoundation/hardhat-ignition"; +import { extendEnvironment } from "hardhat/config"; +import { HardhatPluginError, lazyObject } from "hardhat/plugins"; + +import "./type-extensions"; + +/** + * Add an `ignition` object to the HRE. + */ +extendEnvironment((hre) => { + if ( + hre.ignition !== undefined && + hre.ignition.type !== "stub" && + hre.ignition.type !== "ethers" + ) { + throw new HardhatPluginError( + "hardhat-ignition-ethers", + `Found ${hre.ignition.type} and ethers, but only one Hardhat Ignition extension plugin can be used at a time.` + ); + } + + hre.ignition = lazyObject(() => { + const { EthersIgnitionHelper } = require("./ethers-ignition-helper"); + + return new EthersIgnitionHelper(hre); + }); +}); diff --git a/packages/hardhat-plugin-ethers/src/type-extensions.ts b/packages/hardhat-plugin-ethers/src/type-extensions.ts new file mode 100644 index 0000000000..fc7f3e65bd --- /dev/null +++ b/packages/hardhat-plugin-ethers/src/type-extensions.ts @@ -0,0 +1,7 @@ +import { EthersIgnitionHelper } from "./ethers-ignition-helper"; + +declare module "hardhat/types/runtime" { + export interface HardhatRuntimeEnvironment { + ignition: EthersIgnitionHelper; + } +} diff --git a/packages/hardhat-plugin-ethers/test/.eslintrc.js b/packages/hardhat-plugin-ethers/test/.eslintrc.js new file mode 100644 index 0000000000..757fe8a3ca --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts b/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts new file mode 100644 index 0000000000..827c13fca6 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts @@ -0,0 +1,112 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +import { externallyLoadedContractArtifact } from "./test-helpers/externally-loaded-contract"; + +const fixtureProjectName = "minimal"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment; + } +} + +describe("deploy with ethers result", () => { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "./fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); + + it("should get return ethers result from deploy", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const fooAt = m.contractAt("Foo", foo, { id: "FooAt" }); + + return { foo, fooAt }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.foo.x(), 1n); + assert.equal(await result.fooAt.x(), 1n); + }); + + it("should get return a deployed contract as an ethers contract instance", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.foo.x(), 1n); + }); + + it("should get return a contractAt as an ethers contract instance", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const contractAtFoo = m.contractAt("Foo", foo, { id: "ContractAtFoo" }); + + return { contractAtFoo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.contractAtFoo.x(), 1n); + }); + + it("should return a contract loaded from an arbitrary artifact as an ethers instance", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const externallyLoadedContract = m.contract( + "ExternallyLoadedContract", + externallyLoadedContractArtifact, + [], + { id: "ExternallyLoadedContract" } + ); + + return { externallyLoadedContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isTrue(await result.externallyLoadedContract.isExternallyLoaded()); + }); + + it("should differentiate between different contracts in the type system", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isTrue(await result.foo.isFoo()); + assert.isTrue(await result.bar.isBar()); + + // A function on the abi will not be defined on the ethers contract, + // but more importantly this should how up as a type error. + + // TODO: add @ts-expect-error when we have typescript support + assert.isUndefined(result.foo.isBar); + assert.isUndefined(result.bar.isFoo); + }); +}); diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore b/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore new file mode 100644 index 0000000000..f1462f7a56 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol new file mode 100644 index 0000000000..5b1ae2d7d1 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol @@ -0,0 +1,222 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} + +contract StaticCallValue { + function getValue() public pure returns (uint256) { + return 42; + } +} + +contract EventArgValue { + event EventValue(uint256 value); + + constructor() { + emit EventValue(42); + } +} + +contract PassingValue { + constructor() payable {} + + function deposit() public payable {} +} + +contract TupleReturn { + bool public arg1Captured; + bool public arg2Captured; + + function getTuple() public pure returns (bool arg1, uint256 arg2) { + return (true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} + +contract TupleEmitter { + bool public arg1Captured; + bool public arg2Captured; + + event TupleEvent(bool arg1, uint256 arg2); + + function emitTuple() public { + emit TupleEvent(true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} + +contract CaptureArraysContract { + bool public arraysCaptured; + + constructor() { + arraysCaptured = false; + } + + function recordArrays( + uint256[] memory first, + string[] memory second, + bool[] memory third + ) public returns (uint256 output) { + arraysCaptured = true; + + require(first.length == 3, "Wrong number of args on first arg"); + require(first[0] == 1, "First value is wrong"); + require(first[1] == 2, "Second value is wrong"); + require(first[2] == 3, "Third value is wrong"); + + require(second.length == 3, "Wrong number of args on second arg"); + require( + keccak256(abi.encodePacked(second[0])) == + keccak256(abi.encodePacked("a")), + "First value is wrong" + ); + require( + keccak256(abi.encodePacked(second[1])) == + keccak256(abi.encodePacked("b")), + "Second value is wrong" + ); + require( + keccak256(abi.encodePacked(second[2])) == + keccak256(abi.encodePacked("c")), + "Third value is wrong" + ); + + require(third.length == 3, "Wrong number of args on third arg"); + require(third[0] == true, "First value is wrong"); + require(third[1] == false, "Second value is wrong"); + require(third[2] == true, "Third value is wrong"); + + return 1; + } +} + +contract CaptureComplexObjectContract { + bool public complexArgCaptured; + + constructor() { + complexArgCaptured = false; + } + + struct SubComplex { + string sub; + } + + struct Complex { + bool firstBool; + uint256[] secondArray; + SubComplex thirdSubcomplex; + } + + function testComplexObject( + Complex memory complexArg + ) public returns (uint256 output) { + complexArgCaptured = true; + + require(complexArg.firstBool, "bad first bool"); + + require(complexArg.secondArray.length == 3, "bad second array"); + require(complexArg.secondArray[0] == 1, "First value is wrong"); + require(complexArg.secondArray[1] == 2, "Second value is wrong"); + require(complexArg.secondArray[2] == 3, "Third value is wrong"); + + require( + keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == + keccak256(abi.encodePacked("sub")), + "The complex sub object property is wrong" + ); + + return 1; + } +} + +contract SendDataEmitter { + event SendDataEvent(bool arg); + + bool public wasEmitted; + + receive() external payable { + emit SendDataEvent(true); + } + + function validateEmitted(bool arg) public { + wasEmitted = true; + + require(arg == true, "arg is wrong"); + } +} diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js new file mode 100644 index 0000000000..791b28f337 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js new file mode 100644 index 0000000000..f00a750bde --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js new file mode 100644 index 0000000000..7865980390 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js @@ -0,0 +1,13 @@ +require("./index"); +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js new file mode 100644 index 0000000000..22bcf35c34 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js @@ -0,0 +1,7 @@ +const { extendEnvironment } = require("hardhat/config"); + +extendEnvironment((hre) => { + hre.ignition = { + type: "viem", + }; +}); diff --git a/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts b/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts new file mode 100644 index 0000000000..5673c2bdc0 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts @@ -0,0 +1,23 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import path from "path"; + +describe("ignition helper mutual exclusivity", () => { + before(function () { + process.chdir( + path.join(__dirname, "./fixture-projects", "with-fake-helper") + ); + }); + + after(function () { + resetHardhatContext(); + }); + + it("should error when loaded in conjunction with hardhat-ignition-viem", async function () { + assert.throws( + () => require("hardhat"), + /Found viem and ethers, but only one Hardhat Ignition extension plugin can be used at a time\./ + ); + }); +}); diff --git a/packages/hardhat-plugin-ethers/test/setup.ts b/packages/hardhat-plugin-ethers/test/setup.ts new file mode 100644 index 0000000000..83ca4a5922 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/setup.ts @@ -0,0 +1,11 @@ +/* eslint-disable import/no-unused-modules */ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; + +chai.use(chaiAsPromised); +chai.config.truncateThreshold = 1000; + +afterEach(() => { + sinon.restore(); +}); diff --git a/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts new file mode 100644 index 0000000000..4a705cbd02 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts @@ -0,0 +1,94 @@ +/** + * This is the artifact of a contract that is not part of the compilation output. + * + * Based on the following Solidity: + * + * ``` + contract ExternallyLoadedContract { + bool public isExternallyLoaded = true; + uint256 public x = 1; + + function buildMessage( + string memory message + ) public pure returns (string memory) { + return string.concat("A message: ", message); + } + + function inc() public returns (uint256) { + x++; + return x; + } + } + * ``` + */ +export const externallyLoadedContractArtifact = { + _format: "hh-sol-artifact-1", + contractName: "ExternallyLoadedContract", + sourceName: "contracts/Contracts.sol", + abi: [ + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buildMessage", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isExternallyLoaded", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x608060405260016000806101000a81548160ff0219169083151502179055506001805534801561002e57600080fd5b506105208061003e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + deployedBytecode: + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + linkReferences: {}, + deployedLinkReferences: {}, +} as const; diff --git a/packages/hardhat-plugin-ethers/tsconfig.json b/packages/hardhat-plugin-ethers/tsconfig.json new file mode 100644 index 0000000000..3952ad5604 --- /dev/null +++ b/packages/hardhat-plugin-ethers/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "composite": true, + "jsx": "react-jsx" + }, + "references": [{ "path": "../core" }, { "path": "../hardhat-plugin" }] +} diff --git a/packages/hardhat-plugin-viem/.eslintrc.js b/packages/hardhat-plugin-viem/.eslintrc.js new file mode 100644 index 0000000000..4f618a51d0 --- /dev/null +++ b/packages/hardhat-plugin-viem/.eslintrc.js @@ -0,0 +1,8 @@ +module.exports = { + extends: [`${__dirname}/../../config/eslint/eslintrc.js`], + parserOptions: { + project: `${__dirname}/tsconfig.json`, + sourceType: "module", + }, + ignorePatterns: [".eslintrc.js", "**/fixture-projects/**/*"], +}; diff --git a/packages/hardhat-plugin-viem/.gitignore b/packages/hardhat-plugin-viem/.gitignore new file mode 100644 index 0000000000..849ddff3b7 --- /dev/null +++ b/packages/hardhat-plugin-viem/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/hardhat-plugin-viem/.mocharc.json b/packages/hardhat-plugin-viem/.mocharc.json new file mode 100644 index 0000000000..f1a1008fdf --- /dev/null +++ b/packages/hardhat-plugin-viem/.mocharc.json @@ -0,0 +1,7 @@ +{ + "require": "ts-node/register/transpile-only", + "file": "./test/setup.ts", + "timeout": 20000, + "exit": true, + "ignore": ["**/fixture-projects/**/*"] +} diff --git a/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-plugin-viem/.npmignore new file mode 100644 index 0000000000..77b73f35d4 --- /dev/null +++ b/packages/hardhat-plugin-viem/.npmignore @@ -0,0 +1,14 @@ +coverage/ +.nyc_output/ +*.tsbuildinfo +**/.eslintrc.js +post-build.js +.mocharc.json +.nycrc +.prettierignore +.prettierrc +!dist +dist/test +src/ +test/ +esbuild.js diff --git a/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-plugin-viem/.nycrc new file mode 100644 index 0000000000..c573ff2ac1 --- /dev/null +++ b/packages/hardhat-plugin-viem/.nycrc @@ -0,0 +1,19 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": false, + "statements": 50, + "branches": 30, + "functions": 42, + "lines": 50, + "all": true, + "include": [ + "src/**/*.ts" + ], + "reporter": [ + "html", + "lcov", + "text", + "text-summary" + ], + "report-dir": "coverage" +} diff --git a/packages/hardhat-plugin-viem/.prettierignore b/packages/hardhat-plugin-viem/.prettierignore new file mode 100644 index 0000000000..4ae5fe88f4 --- /dev/null +++ b/packages/hardhat-plugin-viem/.prettierignore @@ -0,0 +1,9 @@ +/node_modules +/dist +/test/fixture-projects/*/artifacts +/test/fixture-projects/*/cache +/coverage +/.nyc_output +/test/fixture-projects/*/deployments/*/artifacts +/test/fixture-projects/*/deployments/*/build-info + diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md new file mode 100644 index 0000000000..41ae03a279 --- /dev/null +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). diff --git a/packages/hardhat-plugin-viem/README.md b/packages/hardhat-plugin-viem/README.md new file mode 100644 index 0000000000..071aab7b97 --- /dev/null +++ b/packages/hardhat-plugin-viem/README.md @@ -0,0 +1,56 @@ +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) + +--- + +# Hardhat Ignition with Viem + +> **Note:** This package includes support for [Viem](https://viem.sh/). To use Hardhat Ignition with Ethers instead, see the [Hardhat Ignition plugin](https://www.npmjs.com/search?q=%40nomicfoundation%2Fhardhat-ignition-ethers). + +Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details. + +Built by the [Nomic Foundation](https://nomic.foundation/) for the Ethereum community. + +Join the Hardhat Ignition channel of our [Hardhat Community Discord server](https://hardhat.org/ignition-discord) to stay up to date on new releases and tutorials. + +## Installation + +```bash +npm install --save-dev @nomicfoundation/hardhat-ignition-viem +``` + +Import the plugin in your `hardhat.config.js``: + +```js +require("@nomicfoundation/hardhat-ignition-viem"); +``` + +Or if you are using TypeScript, in your `hardhat.config.ts``: + +```js +import "@nomicfoundation/hardhat-ignition-viem"; +``` + +## Documentation + +On [Hardhat Ignition's website](https://hardhat.org/ignition) you will find guides for: + +- [Getting started](https://hardhat.org/ignition/docs/getting-started) +- [Creating Modules](https://hardhat.org/ignition/docs/guides/creating-modules) +- [Deploying a module](https://hardhat.org/ignition/docs/guides/deploy) +- [Visualizing your module](https://hardhat.org/ignition/docs/guides/visualize) +- [Handling errors](https://hardhat.org/ignition/docs/guides/error-handling) +- [Modifying an existing module](https://hardhat.org/ignition/docs/guides/modifications) +- [Using Hardhat Ignition in your tests](https://hardhat.org/ignition/docs/guides/tests) + +## Contributing + +Contributions are always welcome! Feel free to open any issue or send a pull request. + +Go to [CONTRIBUTING.md](https://github.com/NomicFoundation/hardhat-ignition/blob/main/CONTRIBUTING.md) to learn about how to set up Hardhat Ignition's development environment. + +## Feedback, help and news + +[Hardhat Ignition on Discord](https://hardhat.org/ignition-discord): for questions and feedback. + +Follow [Hardhat](https://twitter.com/HardhatHQ) and [Nomic Foundation](https://twitter.com/NomicFoundation) on Twitter. diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json new file mode 100644 index 0000000000..ac3cfcf220 --- /dev/null +++ b/packages/hardhat-plugin-viem/package.json @@ -0,0 +1,56 @@ +{ + "name": "@nomicfoundation/hardhat-ignition-viem", + "version": "0.12.0", + "license": "MIT", + "author": "Nomic Foundation", + "homepage": "https://hardhat.org", + "description": "The Viem extension to Hardhat Ignition. Hardhat Ignition is a declarative system for deploying smart contracts on Ethereum. It enables you to define smart contract instances you want to deploy, and any operation you want to run on them. By taking over the deployment and execution, Hardhat Ignition lets you focus on your project instead of getting caught up in the deployment details.", + "repository": "github:NomicFoundation/hardhat-ignition", + "keywords": [ + "ethereum", + "smart-contracts", + "hardhat", + "blockchain", + "dapps", + "tooling", + "solidity", + "deployment", + "viem" + ], + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", + "files": [ + "dist/src/", + "src/", + "LICENSE", + "README.md", + "CHANGELOG.md" + ], + "scripts": { + "prebuild": "ts-node ./scripts/compile-test-fixture-projects.ts", + "build": "tsc --build", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", + "prettier": "prettier \"**/*.{js,ts,md,json}\"", + "test": "mocha --recursive \"test/**/*.ts\"", + "test:debug": "DEBUG='hardhat-ignition-viem:*,ignition:*' npm run test", + "test:coverage": "nyc mocha \"test/**/*.ts\"", + "test:build": "tsc --project ./test/", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", + "prepack": "npm run build" + }, + "devDependencies": { + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@types/chai": "^4.2.22", + "@types/chai-as-promised": "^7.1.4", + "@types/sinon": "^10.0.13" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/ignition-core": "^0.12.0", + "hardhat": "^2.18.0", + "viem": "^1.18.1" + } +} diff --git a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts new file mode 100644 index 0000000000..8f343043a9 --- /dev/null +++ b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts @@ -0,0 +1,33 @@ +import fs from "node:fs"; +import path from "node:path"; + +const main = async () => { + console.log("Running compile on the test fixture projects..."); + + const fixtureProjectNames = fs + .readdirSync(path.join(__dirname, "../test/fixture-projects"), { + withFileTypes: true, + }) + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => dirent.name); + + for (const fixtureProjectName of fixtureProjectNames) { + const fixtureProjectDir = path.join( + __dirname, + "../test/fixture-projects", + fixtureProjectName + ); + + if (fs.existsSync(path.join(fixtureProjectDir, "./artifacts"))) { + return; + } + + process.chdir(fixtureProjectDir); + + const hre = require("hardhat"); + + await hre.run("compile"); + } +}; + +void main(); diff --git a/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts new file mode 100644 index 0000000000..b849a171e6 --- /dev/null +++ b/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts @@ -0,0 +1,57 @@ +import { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; +import { + ContractAtFuture, + ContractDeploymentFuture, + ContractFuture, + IgnitionModuleResult, +} from "@nomicfoundation/ignition-core"; +import { ArtifactsMap } from "hardhat/types"; + +export type IgnitionModuleResultsToViemContracts< + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> = { + [resultKey in keyof IgnitionModuleResultsT]: ToContractType< + IgnitionModuleResultsT, + resultKey + >; +}; + +type ToContractType< + IgnitionModuleResultsT extends IgnitionModuleResult, + ResultKey extends keyof IgnitionModuleResultsT +> = IgnitionModuleResultsT[ResultKey] extends + | ContractDeploymentFuture + | ContractAtFuture + ? GetContractReturnType> + : LookupContractName< + IgnitionModuleResultsT, + ResultKey + > extends keyof ArtifactsMap + ? LookupContractReturnTypeForContractName< + LookupContractName + > + : never; + +type LookupContractReturnTypeForContractName< + ContractName extends keyof ArtifactsMap +> = GetContractReturnType; + +type LookupContractName< + IgnitionModuleResultsT extends IgnitionModuleResult, + ResultsContractKey extends keyof IgnitionModuleResultsT +> = ContractNameOfContractFuture; + +type ContractNameOfContractFuture = + ContractFutureT extends ContractFuture + ? ContractName + : never; + +export type AbiOf = + ContractDeploymentFutureT extends ContractDeploymentFuture< + infer ContractDepploymentAbiT + > + ? ContractDepploymentAbiT + : ContractDeploymentFutureT extends ContractAtFuture + ? ContractAbiT + : never; diff --git a/packages/hardhat-plugin-viem/src/index.ts b/packages/hardhat-plugin-viem/src/index.ts new file mode 100644 index 0000000000..dcb846fcd1 --- /dev/null +++ b/packages/hardhat-plugin-viem/src/index.ts @@ -0,0 +1,28 @@ +import "@nomicfoundation/hardhat-ignition"; +import "@nomicfoundation/hardhat-viem"; +import { extendEnvironment } from "hardhat/config"; +import { HardhatPluginError, lazyObject } from "hardhat/plugins"; + +import "./type-extensions"; + +/** + * Add an `ignition` object to the HRE. + */ +extendEnvironment((hre) => { + if ( + hre.ignition !== undefined && + hre.ignition.type !== "stub" && + hre.ignition.type !== "viem" + ) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Found ${hre.ignition.type} and viem, but only one Hardhat Ignition extension plugin can be used at a time.` + ); + } + + hre.ignition = lazyObject(() => { + const { ViemIgnitionHelper } = require("./viem-ignition-helper"); + + return new ViemIgnitionHelper(hre); + }); +}); diff --git a/packages/hardhat-plugin-viem/src/type-extensions.ts b/packages/hardhat-plugin-viem/src/type-extensions.ts new file mode 100644 index 0000000000..8381d84fab --- /dev/null +++ b/packages/hardhat-plugin-viem/src/type-extensions.ts @@ -0,0 +1,7 @@ +import { ViemIgnitionHelper } from "./viem-ignition-helper"; + +declare module "hardhat/types/runtime" { + export interface HardhatRuntimeEnvironment { + ignition: ViemIgnitionHelper; + } +} diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts new file mode 100644 index 0000000000..fa8a706622 --- /dev/null +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -0,0 +1,230 @@ +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; + +import { + HardhatArtifactResolver, + errorDeploymentResultToExceptionMessage, +} from "@nomicfoundation/hardhat-ignition/helpers"; +import { + ContractAtFuture, + ContractDeploymentFuture, + ContractFuture, + DeployConfig, + DeploymentParameters, + DeploymentResultType, + EIP1193Provider, + Future, + FutureType, + IgnitionModule, + IgnitionModuleResult, + LibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + SuccessfulDeploymentResult, + deploy, + isContractFuture, +} from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { IgnitionModuleResultsToViemContracts } from "./ignition-module-results-to-viem-contracts"; + +export class ViemIgnitionHelper { + public type = "viem"; + + private _provider: EIP1193Provider; + private _deploymentDir: string | undefined; + + constructor( + private _hre: HardhatRuntimeEnvironment, + private _config?: Partial, + provider?: EIP1193Provider, + deploymentDir?: string + ) { + this._provider = provider ?? this._hre.network.provider; + this._deploymentDir = deploymentDir; + } + + public async deploy< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + { + parameters = {}, + config: perDeployConfig = {}, + }: { + parameters?: DeploymentParameters; + config?: Partial; + } = { + parameters: {}, + config: {}, + } + ): Promise< + IgnitionModuleResultsToViemContracts + > { + const accounts = (await this._hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const artifactResolver = new HardhatArtifactResolver(this._hre); + + const resolvedConfig: Partial = { + ...this._config, + ...perDeployConfig, + }; + + const result = await deploy({ + config: resolvedConfig, + provider: this._provider, + deploymentDir: this._deploymentDir, + artifactResolver, + ignitionModule, + deploymentParameters: parameters, + accounts, + }); + + if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { + const message = errorDeploymentResultToExceptionMessage(result); + + throw new HardhatPluginError("hardhat-ignition-viem", message); + } + + return ViemIgnitionHelper._toViemContracts( + this._hre, + ignitionModule, + result + ); + } + + private static async _toViemContracts< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + hre: HardhatRuntimeEnvironment, + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + result: SuccessfulDeploymentResult + ): Promise< + IgnitionModuleResultsToViemContracts + > { + return Object.fromEntries( + await Promise.all( + Object.entries(ignitionModule.results).map( + async ([name, contractFuture]) => [ + name, + await this._getContract( + hre, + contractFuture, + result.contracts[contractFuture.id] + ), + ] + ) + ) + ); + } + + private static async _getContract( + hre: HardhatRuntimeEnvironment, + future: Future, + deployedContract: { address: string } + ): Promise { + if (!isContractFuture(future)) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Expected contract future but got ${future.id} with type ${future.type} instead` + ); + } + + return this._convertContractFutureToViemContract( + hre, + future, + deployedContract + ); + } + + private static async _convertContractFutureToViemContract( + hre: HardhatRuntimeEnvironment, + future: ContractFuture, + deployedContract: { address: string } + ) { + switch (future.type) { + case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: + return this._convertHardhatContractToViemContract( + hre, + future, + deployedContract + ); + case FutureType.CONTRACT_DEPLOYMENT: + case FutureType.LIBRARY_DEPLOYMENT: + case FutureType.CONTRACT_AT: + return this._convertArtifactToViemContract( + hre, + future, + deployedContract + ); + } + } + + private static _convertHardhatContractToViemContract( + hre: HardhatRuntimeEnvironment, + future: + | NamedArtifactContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | NamedArtifactContractAtFuture, + deployedContract: { address: string } + ): Promise { + return hre.viem.getContractAt( + future.contractName, + this._ensureAddressFormat(deployedContract.address) + ); + } + + private static async _convertArtifactToViemContract( + hre: HardhatRuntimeEnvironment, + future: + | ContractDeploymentFuture + | LibraryDeploymentFuture + | ContractAtFuture, + deployedContract: { address: string } + ): Promise { + const publicClient = await hre.viem.getPublicClient(); + const [walletClient] = await hre.viem.getWalletClients(); + + if (walletClient === undefined) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + "No default wallet client found" + ); + } + + const viem = await import("viem"); + const contract = viem.getContract({ + address: this._ensureAddressFormat(deployedContract.address), + abi: future.artifact.abi, + publicClient, + walletClient, + }); + + return contract; + } + + private static _ensureAddressFormat(address: string): `0x${string}` { + if (!address.startsWith("0x")) { + return `0x${address}`; + } + + return `0x${address.slice(2)}`; + } +} diff --git a/packages/hardhat-plugin-viem/test/.eslintrc.js b/packages/hardhat-plugin-viem/test/.eslintrc.js new file mode 100644 index 0000000000..757fe8a3ca --- /dev/null +++ b/packages/hardhat-plugin-viem/test/.eslintrc.js @@ -0,0 +1,15 @@ +module.exports = { + extends: [`${__dirname}/../.eslintrc.js`], + parserOptions: { + project: `${__dirname}/../tsconfig.json`, + sourceType: "module", + }, + rules: { + "import/no-extraneous-dependencies": [ + "error", + { + devDependencies: true, + }, + ], + }, +}; diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore b/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore new file mode 100644 index 0000000000..f1462f7a56 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore @@ -0,0 +1,3 @@ +artifacts/ +cache/ +deployments/ diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol new file mode 100644 index 0000000000..358060a78b --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol @@ -0,0 +1,30 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + event IncEvent(address indexed sender); + + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + emit IncEvent(msg.sender); + } + + function incByPositiveNumber(uint256 n) public returns (uint256) { + require(n > 0, "n must be positive"); + x += n; + return x; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} + +contract Bar { + bool public isBar = true; +} diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js new file mode 100644 index 0000000000..791b28f337 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js new file mode 100644 index 0000000000..f00a750bde --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js @@ -0,0 +1,13 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const bar = m.contract("Bar"); + const usesContract = m.contract("UsesContract", [ + "0x0000000000000000000000000000000000000000", + ]); + + m.call(usesContract, "setAddress", [bar]); + + return { bar, usesContract }; +}); diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js new file mode 100644 index 0000000000..7865980390 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js @@ -0,0 +1,13 @@ +require("./index"); +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js new file mode 100644 index 0000000000..f2c06ffd22 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js @@ -0,0 +1,7 @@ +const { extendEnvironment } = require("hardhat/config"); + +extendEnvironment((hre) => { + hre.ignition = { + type: "ethers", + }; +}); diff --git a/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts b/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts new file mode 100644 index 0000000000..f11b2c5e37 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts @@ -0,0 +1,23 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import path from "path"; + +describe("ignition helper mutual exclusivity", () => { + before(function () { + process.chdir( + path.join(__dirname, "./fixture-projects", "with-fake-helper") + ); + }); + + after(function () { + resetHardhatContext(); + }); + + it("should error when loaded in conjunction with hardhat-ignition-ethers", async function () { + assert.throws( + () => require("hardhat"), + /Found ethers and viem, but only one Hardhat Ignition extension plugin can be used at a time\./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/setup.ts b/packages/hardhat-plugin-viem/test/setup.ts new file mode 100644 index 0000000000..83ca4a5922 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/setup.ts @@ -0,0 +1,11 @@ +/* eslint-disable import/no-unused-modules */ +import chai from "chai"; +import chaiAsPromised from "chai-as-promised"; +import sinon from "sinon"; + +chai.use(chaiAsPromised); +chai.config.truncateThreshold = 1000; + +afterEach(() => { + sinon.restore(); +}); diff --git a/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts new file mode 100644 index 0000000000..4a705cbd02 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts @@ -0,0 +1,94 @@ +/** + * This is the artifact of a contract that is not part of the compilation output. + * + * Based on the following Solidity: + * + * ``` + contract ExternallyLoadedContract { + bool public isExternallyLoaded = true; + uint256 public x = 1; + + function buildMessage( + string memory message + ) public pure returns (string memory) { + return string.concat("A message: ", message); + } + + function inc() public returns (uint256) { + x++; + return x; + } + } + * ``` + */ +export const externallyLoadedContractArtifact = { + _format: "hh-sol-artifact-1", + contractName: "ExternallyLoadedContract", + sourceName: "contracts/Contracts.sol", + abi: [ + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buildMessage", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isExternallyLoaded", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x608060405260016000806101000a81548160ff0219169083151502179055506001805534801561002e57600080fd5b506105208061003e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + deployedBytecode: + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + linkReferences: {}, + deployedLinkReferences: {}, +} as const; diff --git a/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts b/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts new file mode 100644 index 0000000000..42fc434fc0 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts @@ -0,0 +1,28 @@ +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment; + } +} + +export function useIgnitionProject(fixtureProjectName: string) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} diff --git a/packages/hardhat-plugin-viem/test/use-module.ts b/packages/hardhat-plugin-viem/test/use-module.ts new file mode 100644 index 0000000000..b89897e54b --- /dev/null +++ b/packages/hardhat-plugin-viem/test/use-module.ts @@ -0,0 +1,32 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("viem results should work across useModule boundaries", () => { + useIgnitionProject("minimal"); + + it("should only return properties for the properties of the module results", async function () { + const submoduleDefinition = buildModule("Submodule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { foo } = m.useModule(submoduleDefinition); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.equal(await result.foo.read.x(), 1n); + + await result.foo.write.inc(); + await result.foo.write.inc(); + + assert.equal(await result.foo.read.x(), 3n); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts b/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts new file mode 100644 index 0000000000..66d306d513 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts @@ -0,0 +1,109 @@ +import { ContractAtFuture, buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition artifact contractAt to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + externallyLoadedContractAt: ContractAtFuture< + (typeof externallyLoadedContractArtifact)["abi"] + >; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const externallyLoadedContract = m.contract( + "ExternallyLoadedContract", + externallyLoadedContractArtifact, + [] + ); + + const externallyLoadedContractAt = m.contractAt( + "externallyLoadedContractAt", + externallyLoadedContractArtifact, + externallyLoadedContract, + { id: "externallyLoadedContractAt" } + ); + + return { externallyLoadedContractAt }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.externallyLoadedContractAt.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.equal( + result.externallyLoadedContractAt.abi, + externallyLoadedContractArtifact.abi + ); + }); + + it("should allow reading the contract instance", async function () { + assert.equal( + await result.externallyLoadedContractAt.read.buildMessage([ + "Hello World", + ]), + "A message: Hello World" + ); + }); + + it("should allow writing to the contract instance", async function () { + await result.externallyLoadedContractAt.write.inc(); + await result.externallyLoadedContractAt.write.inc(); + await result.externallyLoadedContractAt.write.inc(); + + assert.equal(await result.externallyLoadedContractAt.read.x(), 4n); + }); + + it("should support simulating write function calls", async function () { + const { result: simulationResult } = + await result.externallyLoadedContractAt.simulate.inc(); + + assert.equal(simulationResult, 2n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = + await result.externallyLoadedContractAt.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContractAt.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts b/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts new file mode 100644 index 0000000000..1c0188b307 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts @@ -0,0 +1,103 @@ +import { + ContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition artifact contract to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + externallyLoadedContract: ContractDeploymentFuture< + (typeof externallyLoadedContractArtifact)["abi"] + >; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const externallyLoadedContract = m.contract( + "ExternallyLoadedContract", + externallyLoadedContractArtifact, + [], + { id: "ExternallyLoadedContract" } + ); + + return { externallyLoadedContract }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.externallyLoadedContract.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.equal( + result.externallyLoadedContract.abi, + externallyLoadedContractArtifact.abi + ); + }); + + it("should allow reading the contract instance", async function () { + assert.equal( + await result.externallyLoadedContract.read.buildMessage(["Hello World"]), + "A message: Hello World" + ); + }); + + it("should allow writing to the contract instance", async function () { + await result.externallyLoadedContract.write.inc(); + await result.externallyLoadedContract.write.inc(); + await result.externallyLoadedContract.write.inc(); + + assert.equal(await result.externallyLoadedContract.read.x(), 4n); + }); + + it("should support simulating write function calls", async function () { + const { result: simulationResult } = + await result.externallyLoadedContract.simulate.inc(); + + assert.equal(simulationResult, 2n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.externallyLoadedContract.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.externallyLoadedContract.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts b/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts new file mode 100644 index 0000000000..ac8f723226 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts @@ -0,0 +1,103 @@ +import { + NamedArtifactContractAtFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition named contractAt to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + contractAtFoo: NamedArtifactContractAtFuture<"Foo">; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const contractAtFoo = m.contractAt("Foo", foo, { id: "ContractAtFoo" }); + + return { contractAtFoo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.contractAtFoo.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.isDefined(result.contractAtFoo.abi); + }); + + it("should allow reading the contract instance", async function () { + assert.equal(await result.contractAtFoo.read.x(), 1n); + }); + + it("should allow writing to the contract instance", async function () { + assert.equal(await result.contractAtFoo.read.x(), 1n); + + await result.contractAtFoo.write.inc(); + await result.contractAtFoo.write.inc(); + + assert.equal(await result.contractAtFoo.read.x(), 3n); + }); + + it("should support simulating write function calls", async function () { + const { result: addedNumberResult } = + await result.contractAtFoo.simulate.incByPositiveNumber([2n]); + + assert.equal(addedNumberResult, 3n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.contractAtFoo.estimateGas.inc(); + + assert.isDefined(estimation); + assert(typeof estimation === "bigint"); + }); + + it("should support events", async function () { + await result.contractAtFoo.write.inc(); + + const logs = await result.contractAtFoo.getEvents.IncEvent(); + + assert.equal(logs.length, 1); + assert.equal( + logs[0].args.sender, + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.contractAtFoo.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts b/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts new file mode 100644 index 0000000000..65861373ea --- /dev/null +++ b/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts @@ -0,0 +1,103 @@ +/* eslint-disable import/no-unused-modules */ +import { + NamedArtifactContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("deploy converts ignition named contract to viem instance", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + foo: NamedArtifactContractDeploymentFuture<"Foo">; + } + >; + + beforeEach(async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition); + }); + + it("should provide the address", async function () { + assert.equal( + result.foo.address, + "0x5FbDB2315678afecb367f032d93F642f64180aa3" + ); + }); + + it("should provide the abi", async function () { + assert.isDefined(result.foo.abi); + }); + + it("should allow reading the contract instance", async function () { + assert.equal(await result.foo.read.x(), 1n); + }); + + it("should allow writing to the contract instance", async function () { + assert.equal(await result.foo.read.x(), 1n); + + await result.foo.write.inc(); + await result.foo.write.inc(); + + assert.equal(await result.foo.read.x(), 3n); + }); + + it("should support simulating write function calls", async function () { + const { result: addedNumberResult } = + await result.foo.simulate.incByPositiveNumber([2n]); + + assert.equal(addedNumberResult, 3n); + }); + + it("should support gas estimation of write function calls", async function () { + const estimation = await result.foo.estimateGas.inc(); + assert.isDefined(estimation); + + assert(typeof estimation === "bigint"); + }); + + it("should support events", async function () { + await result.foo.write.inc(); + + const logs = await result.foo.getEvents.IncEvent(); + + assert.equal(logs.length, 1); + assert.equal( + logs[0].args.sender, + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266" + ); + }); + + it("should enforce the type is constrained to the contracts functions", async function () { + await assert.isRejected( + // @ts-expect-error + result.foo.write.nonexistantWrite(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.read.nonexistantRead(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.estimateGas.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error + result.foo.simulate.nonexistantEstimate(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/viem-results.ts b/packages/hardhat-plugin-viem/test/viem-results.ts new file mode 100644 index 0000000000..67e1de8236 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/viem-results.ts @@ -0,0 +1,80 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { externallyLoadedContractArtifact } from "./test-helpers/externally-loaded-contract"; +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("viem results", () => { + useIgnitionProject("minimal"); + + it("should only return properties for the properties of the module results", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isDefined(result.foo); + + // @ts-expect-error - only returned result keys should exist + assert.isUndefined(result.nonexistant); + }); + + it("should differentiate between different contracts in the type system", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + const baz = m.contract("Bas", externallyLoadedContractArtifact); + + return { foo, bar, baz }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + assert.isTrue(await result.foo.read.isFoo()); + assert.isTrue(await result.bar.read.isBar()); + assert.isTrue(await result.baz.read.isExternallyLoaded()); + + // Calling the wrong method on a viem instance should throw, but more + // importantly give a type error. + + // foo shouldn't have bar or baz methods + await assert.isRejected( + // @ts-expect-error - isBar is not a method on Foo + result.foo.read.isBar(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isBar is not a method on Foo + result.foo.read.isExternallyLoaded(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + + // bar shouldn't have foo or baz methods + await assert.isRejected( + // @ts-expect-error - isFoo is not a method on Bar + result.bar.read.isFoo(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isExternallyLoaded is not a method on Bar + result.bar.read.isExternallyLoaded(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + + // baz shouldn't have foo or bar methods + await assert.isRejected( + // @ts-expect-error - isFoo is not a method on the externally loaded contract + result.baz.read.isFoo(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + await assert.isRejected( + // @ts-expect-error - isBar is not a method on the externally loaded contract + result.baz.read.isBar(), + /Make sure you are using the correct ABI and that the function exists on it./ + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/tsconfig.json b/packages/hardhat-plugin-viem/tsconfig.json new file mode 100644 index 0000000000..3952ad5604 --- /dev/null +++ b/packages/hardhat-plugin-viem/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../config/typescript/tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "composite": true, + "jsx": "react-jsx" + }, + "references": [{ "path": "../core" }, { "path": "../hardhat-plugin" }] +} diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 6f773903f0..7fedcbd65c 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -14,19 +14,31 @@ Join the Hardhat Ignition channel of our [Hardhat Community Discord server](http ## Installation ```bash -npm install --save-dev @nomicfoundation/hardhat-ignition +# ethers users +npm install --save-dev @nomicfoundation/hardhat-ignition-ethers + +# viem users +npm install --save-dev @nomicfoundation/hardhat-ignition-viem ``` Import the plugin in your `hardhat.config.js``: ```js -require("@nomicfoundation/hardhat-ignition"); +// ethers users +require("@nomicfoundation/hardhat-ignition-ethers"); + +// viem users +require("@nomicfoundation/hardhat-ignition-viem"); ``` Or if you are using TypeScript, in your `hardhat.config.ts``: ```js -import "@nomicfoundation/hardhat-ignition"; +// ethers users +import "@nomicfoundation/hardhat-ignition-ethers"; + +// viem users +import "@nomicfoundation/hardhat-ignition-viem"; ``` ## Documentation diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 14de2d02b1..1700ef90eb 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -27,12 +27,16 @@ ], "exports": { ".": "./dist/src/index.js", - "./modules": "./dist/src/modules.js" + "./modules": "./dist/src/modules.js", + "./helpers": "./dist/src/helpers.js" }, "typesVersions": { "*": { "modules": [ "./dist/src/modules.d.ts" + ], + "helpers": [ + "./dist/src/helpers.d.ts" ] } }, @@ -46,49 +50,18 @@ "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", - "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments", + "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", "prepack": "npm run build" }, "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomicfoundation/hardhat-ethers": "^3.0.4", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/d3": "7.4.0", - "@types/debug": "^4.1.7", - "@types/dompurify": "2.4.0", - "@types/fs-extra": "^9.0.13", - "@types/lodash": "4.14.189", - "@types/lodash.flattendeep": "^4.4.7", - "@types/mermaid": "^9.1.0", - "@types/mocha": "^9.0.0", - "@types/node": "16.11.7", - "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", - "@typescript-eslint/eslint-plugin": "4.31.2", - "@typescript-eslint/parser": "4.31.2", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "esbuild": "^0.15.9", - "eslint": "^7.32.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "3.5.5", - "eslint-plugin-import": "2.24.2", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-prettier": "4.0.0", + "@nomicfoundation/hardhat-network-helpers": "1.0.9", "hardhat": "^2.18.0", - "mermaid": "^9.1.7", - "mocha": "^9.1.1", - "nyc": "15.1.0", - "prettier": "2.4.1", - "purecss": "^2.1.0", - "rimraf": "3.0.2", - "sinon": "^14.0.0", - "ts-node": "10.9.1", - "typescript": "^5.0.2" + "viem": "^1.18.1" }, "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", "@nomicfoundation/hardhat-verify": "^2.0.1", "hardhat": "^2.18.0" }, @@ -97,7 +70,6 @@ "@nomicfoundation/ignition-ui": "^0.12.0", "chalk": "^4.0.0", "debug": "^4.3.2", - "ethers": "^6.7.0", "fs-extra": "^10.0.0", "prompts": "^2.4.2" } diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts new file mode 100644 index 0000000000..4c17b51c0a --- /dev/null +++ b/packages/hardhat-plugin/src/helpers.ts @@ -0,0 +1,2 @@ +export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; +export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index ce17dca25d..6788baf98c 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -1,4 +1,3 @@ -import "@nomicfoundation/hardhat-ethers"; import "@nomicfoundation/hardhat-verify"; import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; import { @@ -8,7 +7,10 @@ import { } from "@nomicfoundation/ignition-core"; import { readdirSync } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; -import { NomicLabsHardhatPluginError, lazyObject } from "hardhat/plugins"; +import { + HardhatPluginError, + NomicLabsHardhatPluginError, +} from "hardhat/plugins"; import path from "path"; import "./type-extensions"; @@ -45,14 +47,20 @@ extendConfig((config, userConfig) => { }); /** - * Add an `ignition` object to the HRE. + * Add an `ignition` stub to throw */ extendEnvironment((hre) => { - hre.ignition = lazyObject(() => { - const { IgnitionHelper } = require("./ignition-helper"); - - return new IgnitionHelper(hre); - }); + if ((hre as any).ignition === undefined) { + (hre as any).ignition = { + type: "stub", + deploy: () => { + throw new HardhatPluginError( + "hardhat-ignition", + "Please install either `@nomicfoundation/hardhat-ignition-viem` or `@nomicfoundation/hardhat-ignition-ethers` to use Ignition in your Hardhat tests" + ); + }, + }; + } }); ignitionScope @@ -87,7 +95,7 @@ ignitionScope const { HardhatArtifactResolver } = await import( "./hardhat-artifact-resolver" ); - const { loadModule } = await import("./load-module"); + const { loadModule } = await import("./utils/load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); if (verify) { @@ -209,7 +217,7 @@ ignitionScope "@nomicfoundation/ignition-core" ); - const { loadModule } = await import("./load-module"); + const { loadModule } = await import("./utils/load-module"); const { open } = await import("./utils/open"); const { writeVisualization } = await import( diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 1179611234..136c38a5d1 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -4,8 +4,6 @@ import "hardhat/types/runtime"; import { DeployConfig } from "@nomicfoundation/ignition-core"; -import { IgnitionHelper } from "./ignition-helper"; - declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { ignition?: string; @@ -23,9 +21,3 @@ declare module "hardhat/types/config" { ignition: Partial; } } - -declare module "hardhat/types/runtime" { - export interface HardhatRuntimeEnvironment { - ignition: IgnitionHelper; - } -} diff --git a/packages/hardhat-plugin/src/load-module.ts b/packages/hardhat-plugin/src/utils/load-module.ts similarity index 96% rename from packages/hardhat-plugin/src/load-module.ts rename to packages/hardhat-plugin/src/utils/load-module.ts index 49ade76a7a..09c3380843 100644 --- a/packages/hardhat-plugin/src/load-module.ts +++ b/packages/hardhat-plugin/src/utils/load-module.ts @@ -7,7 +7,7 @@ import { } from "hardhat/plugins"; import path from "path"; -import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; +import { shouldBeHardhatPluginError } from "./shouldBeHardhatPluginError"; const debug = setupDebug("hardhat-ignition:modules"); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 88e42c5b0c..6a6679f863 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -3,8 +3,8 @@ import { DeployConfig, buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { KeyListOf } from "./type-helper"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { KeyListOf } from "./test-helpers/type-helper"; +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; describe("config", () => { describe("loading", () => { @@ -55,7 +55,7 @@ describe("config", () => { }); await assert.isRejected( - this.deploy(moduleDefinition, { + this.hre.ignition.deploy(moduleDefinition, { config: { requiredConfirmations: 0, }, diff --git a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts b/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts similarity index 69% rename from packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts rename to packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts index 14ac3a8c51..d92ed7422f 100644 --- a/packages/hardhat-plugin/test/execution/multiple-batch-contract-deploy.ts +++ b/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts @@ -2,9 +2,8 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; - -import { sleep } from "./helpers"; +import { sleep } from "../test-helpers/sleep"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; /** * Deploy a multiple contracts over several batches. @@ -47,7 +46,7 @@ describe("execution - multiple batch contract deploy", function () { }; }); - const deployPromise = this.deploy(moduleDefinition); + const deployPromise = this.hre.ignition.deploy(moduleDefinition); await sleep(300); await this.hre.network.provider.send("evm_mine"); @@ -60,18 +59,18 @@ describe("execution - multiple batch contract deploy", function () { const result = await deployPromise; - const x1 = await result.contract1.x(); - const xA = await result.contractA.x(); - const x2 = await result.contract2.x(); - const xB = await result.contractB.x(); - const x3 = await result.contract3.x(); - const xC = await result.contractC.x(); + const x1 = await result.contract1.read.x(); + const xA = await result.contractA.read.x(); + const x2 = await result.contract2.read.x(); + const xB = await result.contractB.read.x(); + const x3 = await result.contract3.read.x(); + const xC = await result.contractC.read.x(); - assert.equal(x1, Number(1)); - assert.equal(xA, Number(1)); - assert.equal(x2, Number(1)); - assert.equal(xB, Number(1)); - assert.equal(x3, Number(1)); - assert.equal(xC, Number(1)); + assert.equal(x1, 1n); + assert.equal(xA, 1n); + assert.equal(x2, 1n); + assert.equal(xB, 1n); + assert.equal(x3, 1n); + assert.equal(xC, 1n); }); }); diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts new file mode 100644 index 0000000000..eb7481e71e --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts @@ -0,0 +1,77 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { createWalletClient, custom } from "viem"; +import { hardhat } from "viem/chains"; + +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../../test-helpers/wait-for-pending-txs"; + +/** + * For all accounts that will be used during the deployment we check + * to see if there are pending transactions (not from previous runs) + * and error if there are any. + */ +describe("execution - error on pending user transactions", () => { + useFileIgnitionProject( + "minimal", + "error-on-rerun-with-replaced-pending-user-transaction" + ); + + it("should error if a transaction is in flight for an account used in the deploy", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + + // Before deploy, put a valid transaction into the mempool for accounts[2] + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode, + args: [], + account: signer2 as `0x${string}`, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.runControlledDeploy( + moduleDefinition, + async (_c: TestChainHelper) => {} + ), + "IGN403: You have sent transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc and they interfere with Hardhat Ignition. Please wait until they get 1 confirmations before running Hardhat Ignition again." + ); + + // Now mine the user interference transaction + await mineBlock(this.hre); + + // The users interfering transaction completes normally + const outsideFoo = await deployPromise; + assert.equal( + outsideFoo, + "0x5054a9247b1e76c38c899ec541b5e694e998b7f1ac8438defd6973a6609919ea" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts similarity index 62% rename from packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts index 07815222c8..8f69d76834 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -1,11 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { createWalletClient, custom, parseEther } from "viem"; +import { hardhat } from "viem/chains"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -19,7 +21,7 @@ describe("execution - error on rerun with replaced pending user transaction", () "error-on-rerun-with-replaced-pending-user-transaction" ); - it.skip("should error on the second run", async function () { + it("should error on the second run", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); @@ -48,22 +50,34 @@ describe("execution - error on rerun with replaced pending user transaction", () } ); + const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + // Send user interefering deploy transaction, between runs // so it is in mempool, overriding the existing nonce 2 // transaction - const [, , signer2] = await this.hre.ethers.getSigners(); - const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); - void FooFactory.connect(signer2).deploy({ - gasPrice: this.hre.ethers.parseUnits("500", "gwei"), - nonce: 2, // same nonce as foo3 + void walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode, + args: [], + account: signer2 as `0x${string}`, + gasPrice: parseEther("500", "gwei"), + nonce: 2, }); // On the second run, we should detect the user interference // and error await assert.isRejected( - this.deploy(moduleDefinition), - "Pending transaction from user" + this.hre.ignition.deploy(moduleDefinition), + "IGN403: You have sent transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc and they interfere with Hardhat Ignition. Please wait until they get 5 confirmations before running Hardhat Ignition again." ); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts similarity index 83% rename from packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts index 8b02d1e4d0..f555836dee 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-transaction-dropped.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; +} from "../../test-helpers/use-ignition-project"; /** * On running a deploy, if a transaction is dropped from the mempool @@ -14,7 +14,7 @@ import { describe("execution - error on transaction dropped", () => { useFileIgnitionProject("minimal", "error-on-transaction-dropped"); - it.skip("should error on the drop being detected", async function () { + it("should error on the drop being detected", async function () { // Setup a module with two contract deploys (foo1 and foo2) over 2 batches const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); @@ -49,7 +49,7 @@ describe("execution - error on transaction dropped", () => { // Mine further block allowing foo2 to be checked again await c.mineBlock(); }), - "Transaction 0x94508af7099a6684f0a431cabd18015ee38ebf0992daa12bfb8830fae96cd93a (FooModule:Foo2/1) has dropped from mempool" + "IGN401: Error while executing FooModule#Foo2: all the transactions of its network interaction 1 were dropped. Please try rerunning Hardhat Ignition." ); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts similarity index 51% rename from packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts index 47d3501931..4a0c7b3b5a 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts @@ -1,11 +1,13 @@ /* eslint-disable import/no-unused-modules */ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { createWalletClient, custom } from "viem"; +import { hardhat } from "viem/chains"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; +} from "../../test-helpers/use-ignition-project"; /** * On running a deploy, if a transaction is pending and the user @@ -15,7 +17,7 @@ import { describe("execution - error on user transaction sent", () => { useFileIgnitionProject("minimal", "error-on-user-transaction-sent"); - it.skip("should error on the drop being detected", async function () { + it("should error on the drop being detected", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); @@ -42,19 +44,37 @@ describe("execution - error on user transaction sent", () => { // wait for foo1 to be submitted await c.waitForPendingTxs(1); + const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + // Submit user interference transaction to mempool (note a fresh // nonce is used, so no replacement) - const [, , signer2] = await this.hre.ethers.getSigners(); - const FooFactory = await this.hre.ethers.getContractFactory("Foo"); + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); - void FooFactory.connect(signer2).deploy({ - gasPrice: this.hre.ethers.parseUnits("500", "gwei"), + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode, + args: [], + account: signer2 as `0x${string}`, + gasPrice: 500_000_000_000n, }); // Process block 1 with foo1 - await c.mineBlock(2); + await c.mineBlock(1); + + const fooAddress = await deployPromise; + assert.equal( + fooAddress, + "0x99f3e275f941aaef0a8e65dd47479ea8de4de81c993869921f0a902715806737" + ); }), - "A transaction has been submitted on the account 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc outside of the deployment" + "IGN405: The next nonce for 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc should be 1, but is 2. Please make sure not to send transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc while running this deployment and try again." ); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts similarity index 81% rename from packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts index 2163ac8c03..d943fdb18c 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-dropped-ignition-transaction.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts @@ -2,11 +2,12 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { clearPendingTransactionsFromMemoryPool } from "../../test-helpers/clear-pending-transactions-from-memory-pool"; +import { mineBlock } from "../../test-helpers/mine-block"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; -import { clearPendingTransactionsFromMemoryPool, mineBlock } from "../helpers"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that starts but does not finish an on-chain @@ -16,7 +17,7 @@ import { clearPendingTransactionsFromMemoryPool, mineBlock } from "../helpers"; describe("execution - rerun with dropped ignition transactions", () => { useFileIgnitionProject("minimal", "rerun-with-dropped-ignition-transactions"); - it.skip("should deploy successfully on second run", async function () { + it("should deploy successfully on second run", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo", []); @@ -53,6 +54,6 @@ describe("execution - rerun with dropped ignition transactions", () => { } ); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.foo.read.x(), 1n); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts similarity index 79% rename from packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts index c3000d7a2a..b45d53c4f9 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-now-complete-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts @@ -2,11 +2,11 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { mineBlock } from "../../test-helpers/mine-block"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; -import { mineBlock } from "../helpers"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that sumbit but does not confirm several on-chain @@ -19,7 +19,7 @@ describe("execution - rerun with now complete ignition transactions", () => { "rerun-with-now-complete-ignition-transactions" ); - it.skip("should complete the run on the second attempt", async function () { + it("should complete the run on the second attempt", async function () { // Setup a module with 6 foo contracts deployed in pairs of 2 over 3 batches const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); @@ -88,18 +88,18 @@ describe("execution - rerun with now complete ignition transactions", () => { assert.isDefined(result); - const x1 = await result.foo1.x(); - const x2 = await result.foo2.x(); - const x3 = await result.foo3.x(); - const x4 = await result.foo4.x(); - const x5 = await result.foo5.x(); - const x6 = await result.foo6.x(); + const x1 = await result.foo1.read.x(); + const x2 = await result.foo2.read.x(); + const x3 = await result.foo3.read.x(); + const x4 = await result.foo4.read.x(); + const x5 = await result.foo5.read.x(); + const x6 = await result.foo6.read.x(); - assert.equal(x1, Number(1)); - assert.equal(x2, Number(1)); - assert.equal(x3, Number(1)); - assert.equal(x4, Number(1)); - assert.equal(x5, Number(1)); - assert.equal(x6, Number(1)); + assert.equal(x1, 1n); + assert.equal(x2, 1n); + assert.equal(x3, 1n); + assert.equal(x4, 1n); + assert.equal(x5, 1n); + assert.equal(x6, 1n); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts similarity index 81% rename from packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts index 5b633cb794..261a7d0123 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-pending-ignition-transactions.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -15,7 +15,7 @@ import { describe("execution - rerun with pending ignition transactions", () => { useFileIgnitionProject("minimal", "rerun-with-pending-ignition-transactions"); - it.skip("should complete the run on the second attempt", async function () { + it("should complete the run on the second attempt", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const account2 = m.getAccount(2); @@ -85,18 +85,18 @@ describe("execution - rerun with pending ignition transactions", () => { assert.isDefined(result); - const x1 = await result.foo1.x(); - const x2 = await result.foo2.x(); - const x3 = await result.foo3.x(); - const x4 = await result.foo4.x(); - const x5 = await result.foo5.x(); - const x6 = await result.foo6.x(); + const x1 = await result.foo1.read.x(); + const x2 = await result.foo2.read.x(); + const x3 = await result.foo3.read.x(); + const x4 = await result.foo4.read.x(); + const x5 = await result.foo5.read.x(); + const x6 = await result.foo6.read.x(); - assert.equal(x1, Number(1)); - assert.equal(x2, Number(1)); - assert.equal(x3, Number(1)); - assert.equal(x4, Number(1)); - assert.equal(x5, Number(1)); - assert.equal(x6, Number(1)); + assert.equal(x1, 1n); + assert.equal(x2, 1n); + assert.equal(x3, 1n); + assert.equal(x4, 1n); + assert.equal(x5, 1n); + assert.equal(x6, 1n); }); }); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts similarity index 64% rename from packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts rename to packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts index 3a49397d5a..371a8dfb43 100644 --- a/packages/hardhat-plugin/test/execution/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -1,12 +1,15 @@ /* eslint-disable import/no-unused-modules */ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { createWalletClient, custom, parseEther } from "viem"; +import { hardhat } from "viem/chains"; +import { mineBlock } from "../../test-helpers/mine-block"; +import { sleep } from "../../test-helpers/sleep"; import { TestChainHelper, useFileIgnitionProject, -} from "../../use-ignition-project"; -import { mineBlock, sleep } from "../helpers"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that starts but does not finish several on-chain @@ -18,7 +21,10 @@ import { mineBlock, sleep } from "../helpers"; describe("execution - rerun with replaced confirmed user transaction", () => { useFileIgnitionProject( "minimal", - "rerun-with-replaced-confirmed-user-transaction" + "rerun-with-replaced-confirmed-user-transaction", + { + requiredConfirmations: 2, + } ); it.skip("should deploy user interfered transaction on second run", async function () { @@ -48,12 +54,25 @@ describe("execution - rerun with replaced confirmed user transaction", () => { } ); + const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + // Submit a user interfering deploy transaction // to the mempool reusing nonce 2 - const [, , signer2] = await this.hre.ethers.getSigners(); - const FooFactory = await this.hre.ethers.getContractFactory("Foo"); - const userDeployedContractPromise = FooFactory.connect(signer2).deploy({ - gasPrice: this.hre.ethers.parseUnits("500", "gwei"), + const [, , signer2] = (await this.hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const walletClient = createWalletClient({ + chain: hardhat, + transport: custom(this.hre.network.provider), + }); + + const deployPromise = walletClient.deployContract({ + abi: FooArtifact.abi, + bytecode: FooArtifact.bytecode, + args: [], + account: signer2 as `0x${string}`, + gasPrice: parseEther("500", "gwei"), nonce: 2, }); @@ -74,12 +93,12 @@ describe("execution - rerun with replaced confirmed user transaction", () => { assert.isDefined(result); - assert.equal(await result.foo1.x(), Number(1)); - assert.equal(await result.foo2.x(), Number(1)); - assert.equal(await result.foo3.x(), Number(1)); + assert.equal(await result.foo1.read.x(), 1n); + assert.equal(await result.foo2.read.x(), 1n); + assert.equal(await result.foo3.read.x(), 1n); // the user deployed contract is working as well - const userDeployed = await userDeployedContractPromise; - assert.equal(await userDeployed.x(), Number(1)); + const userDeployed = await deployPromise; + assert(userDeployed); }); }); diff --git a/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts new file mode 100644 index 0000000000..122c8dfb19 --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts @@ -0,0 +1,127 @@ +/* eslint-disable import/no-unused-modules */ +import { setNextBlockBaseFeePerGas } from "@nomicfoundation/hardhat-network-helpers"; +import { buildModule, wipe } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { HardhatArtifactResolver } from "../../../src/hardhat-artifact-resolver"; +import { mineBlock } from "../../test-helpers/mine-block"; +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * A run that deploys a contract times out + * + * TODO: Needs to be updated to deal with fee bumps + */ +describe("execution - rerun a deploy that timed out", () => { + useFileIgnitionProject("minimal", "rerun-a-deploy-that-timed-out", { + blockPollingInterval: 50, + timeBeforeBumpingFees: 45, + maxFeeBumps: 2, + requiredConfirmations: 1, + }); + + it("shows an error indicating a wipe is required", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2], but force timeout, + // by not processing any blocks + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }) + ); + + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // Mine the block, confirming foo + await c.mineBlock(1); + }), + `The deployment wasn\'t run because of the following errors in a previous run: + + * FooModule#Foo: The previous run of the future FooModule#Foo timed out, and will need wiped before running again` + ); + }); + + /** + * Perform a run that times out by manipulating the base fee. Reset the base fee + * and wipe the future, the run again. + * + * A new second transaction is submitted that succeeds. + */ + it("should successfully rerun after a timeout (and a wipe)", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2], but force timeout, + // by not processing any blocks + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then never mine the block that will complete it. + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }) + ); + + await setNextBlockBaseFeePerGas(1_000_000n); + await mineBlock(this.hre); + + await wipe( + this.deploymentDir!, + new HardhatArtifactResolver(this.hre), + "FooModule#Foo" + ); + + const result = await this.runControlledDeploy( + moduleDefinition, + async (c: TestChainHelper) => { + // Mine the block, confirming foo + await c.mineBlock(1); + } + ); + + assert.isDefined(result); + assert.equal(await result.foo.read.x(), 1n); + }); +}); diff --git a/packages/hardhat-plugin/test/execution/rerun-after-kill.ts b/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts similarity index 85% rename from packages/hardhat-plugin/test/execution/rerun-after-kill.ts rename to packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts index 825134c812..6fb2bed0ee 100644 --- a/packages/hardhat-plugin/test/execution/rerun-after-kill.ts +++ b/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts @@ -5,7 +5,7 @@ import { assert } from "chai"; import { TestChainHelper, useFileIgnitionProject, -} from "../use-ignition-project"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy that deploys multiple contracts, one contract per batch. @@ -59,10 +59,10 @@ describe("execution - rerun after kill", () => { } ); - assert.equal(await result.foo1.x(), Number(1)); - assert.equal(await result.foo2.x(), Number(1)); - assert.equal(await result.foo3.x(), Number(1)); - assert.equal(await result.foo4.x(), Number(1)); - assert.equal(await result.foo5.x(), Number(1)); + assert.equal(await result.foo1.read.x(), 1n); + assert.equal(await result.foo2.read.x(), 1n); + assert.equal(await result.foo3.read.x(), 1n); + assert.equal(await result.foo4.read.x(), 1n); + assert.equal(await result.foo5.read.x(), 1n); }); }); diff --git a/packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts b/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts similarity index 85% rename from packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts rename to packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts index aa4f14eaa4..323633f64a 100644 --- a/packages/hardhat-plugin/test/execution/rerun-with-new-contract-deploy.ts +++ b/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts @@ -2,12 +2,11 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { mineBlock } from "../../test-helpers/mine-block"; import { TestChainHelper, useFileIgnitionProject, -} from "../use-ignition-project"; - -import { mineBlock } from "./helpers"; +} from "../../test-helpers/use-ignition-project"; /** * Run an initial deploy, that deploys a contract. The module is modified @@ -35,7 +34,7 @@ describe("execution - rerun with new contract deploy", () => { } ); - const firstRunBarAddress = (await originalBar.getAddress()).toLowerCase(); + const firstRunBarAddress = originalBar.address.toLowerCase(); // Further blocks with no pending transactions await mineBlock(this.hre); @@ -61,10 +60,10 @@ describe("execution - rerun with new contract deploy", () => { ); const usedAddress = ( - await result.usesContract.contractAddress() + (await result.usesContract.read.contractAddress()) as string ).toLowerCase(); - const secondRunBarAddress = (await result.bar.getAddress()).toLowerCase(); + const secondRunBarAddress = result.bar.address.toLowerCase(); // The BarModule#Bar contract has not been redeployed if // it shares the same address. diff --git a/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts new file mode 100644 index 0000000000..86391e3898 --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts @@ -0,0 +1,55 @@ +/* eslint-disable import/no-unused-modules */ +import { setNextBlockBaseFeePerGas } from "@nomicfoundation/hardhat-network-helpers"; +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { + TestChainHelper, + useFileIgnitionProject, +} from "../../test-helpers/use-ignition-project"; + +/** + * A run that deploys a contract times out + */ +describe("execution - deploy run times out", () => { + useFileIgnitionProject("minimal", "deploy-run-times-out", { + blockPollingInterval: 50, + timeBeforeBumpingFees: 45, + maxFeeBumps: 2, + requiredConfirmations: 1, + }); + + it("should error naming timed out transactions", async function () { + // Setup a module with a contract deploy on accounts[2] + const moduleDefinition = buildModule("FooModule", (m) => { + const account2 = m.getAccount(2); + + const foo = m.contract("Foo", [], { from: account2 }); + + return { + foo, + }; + }); + + // Deploying the module that uses accounts[2] throws with a warning + await assert.isRejected( + this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { + // wait for the deploy transaction to hit the memory pool, + // but then bump the base fee so that it doesn't get mined, + // with the next block + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(10_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(100_000_000_000n); + await c.mineBlock(); + + await c.waitForPendingTxs(1); + await setNextBlockBaseFeePerGas(1_000_000_000_000n); + await c.mineBlock(); + }), + "The deployment wasn't successful, there were timeouts:\n\nTimed out:\n\n * FooModule#Foo/1" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/error-handling.ts b/packages/hardhat-plugin/test/error-handling.ts deleted file mode 100644 index 1ef33498b3..0000000000 --- a/packages/hardhat-plugin/test/error-handling.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { useEphemeralIgnitionProject } from "./use-ignition-project"; - -describe("module error handling", () => { - useEphemeralIgnitionProject("minimal"); - - it("should error on passing async callback", async function () { - assert.throws( - () => buildModule("AsyncModule", (async () => {}) as any), - /The callback passed to 'buildModule' for AsyncModule returns a Promise; async callbacks are not allowed in 'buildModule'./ - ); - }); - - it("should error on module throwing an exception", async function () { - assert.throws( - () => - buildModule("AsyncModule", () => { - throw new Error("User thrown error"); - }), - /User thrown error/ - ); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts deleted file mode 100644 index fb934be77e..0000000000 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at-from-artifact.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - TestChainHelper, - useEphemeralIgnitionProject, -} from "../use-ignition-project"; - -/** - * Use an existingly deployed contract through the `contractAtFromArtifact` api. - * - * First deploy a working contract, then reuse it from a subsequent module - * with a passed in artifact. - */ -describe.skip("execution - deploy contractAt from artifact", function () { - useEphemeralIgnitionProject("minimal"); - - it("should deploy a contract that is callable", async function () { - // Arrange - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const result = await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - - const fooAddress = await result.foo.getAddress(); - assert.equal(fooAddress, "0x5FbDB2315678afecb367f032d93F642f64180aa3"); - - // Act - const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); - - const contractAtModuleDefinition = buildModule("FooModule", (m) => { - const atFoo = m.contractAt("AtFoo", fooArtifact, fooAddress); - - return { atFoo }; - }); - - const contractAtFromArtifactResult = await this.runControlledDeploy( - contractAtModuleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - - // Assert - assert.equal(await contractAtFromArtifactResult.atFoo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts b/packages/hardhat-plugin/test/execution/deploy-contract-at.ts deleted file mode 100644 index 8d8e248727..0000000000 --- a/packages/hardhat-plugin/test/execution/deploy-contract-at.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - TestChainHelper, - useEphemeralIgnitionProject, -} from "../use-ignition-project"; - -/** - * Use an existingly deployed contract through the `contractAt` api. - * - * First deploy a working contract, then reuse it from a subsequent module. - */ -describe("execution - deploy contract at", function () { - useEphemeralIgnitionProject("minimal"); - - it.skip("should deploy a contract that is callable", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const result = await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - - const fooAddress = await result.foo.getAddress(); - - assert.equal(fooAddress, "0x5FbDB2315678afecb367f032d93F642f64180aa3"); - - const contractAtModuleDefinition = buildModule("FooModule", (m) => { - const foo = m.contractAt("Foo", fooAddress); - - return { foo }; - }); - - const contractAtResult = await this.runControlledDeploy( - contractAtModuleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - - assert.equal(await contractAtResult.foo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts b/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts deleted file mode 100644 index 84fd82a59b..0000000000 --- a/packages/hardhat-plugin/test/execution/deploy-contract-from-artifact.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { waitForPendingTxs } from "../helpers"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; - -import { mineBlock } from "./helpers"; - -/** - * Deploy a contract from an artifact. - */ -describe("execution - deploy contract from artifact", function () { - useEphemeralIgnitionProject("minimal"); - - it("should deploy a contract that is callable", async function () { - const fooArtifact = await this.hre.artifacts.readArtifact("Foo"); - - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo", fooArtifact); - - return { foo }; - }); - - const deployPromise = this.deploy(moduleDefinition); - - await waitForPendingTxs(this.hre, 1, deployPromise); - await mineBlock(this.hre); - - const result = await deployPromise; - - assert.equal(await result.foo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/deploy-contract.ts b/packages/hardhat-plugin/test/execution/deploy-contract.ts deleted file mode 100644 index a2e69bfe72..0000000000 --- a/packages/hardhat-plugin/test/execution/deploy-contract.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { waitForPendingTxs } from "../helpers"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; - -import { mineBlock } from "./helpers"; - -/** - * This is the simplest contract deploy case. - * - * Deploy a single contract with non-problematic network - */ -describe("execution - deploy contract", function () { - useEphemeralIgnitionProject("minimal"); - - it("should deploy a contract that is callable", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const deployPromise = this.deploy(moduleDefinition); - - await waitForPendingTxs(this.hre, 1, deployPromise); - await mineBlock(this.hre); - - const result = await deployPromise; - - assert.equal(await result.foo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts deleted file mode 100644 index 1d77b324a4..0000000000 --- a/packages/hardhat-plugin/test/execution/nonce-checks/error-on-pending-user-transactions.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { waitForPendingTxs } from "../../helpers"; -import { - TestChainHelper, - useFileIgnitionProject, -} from "../../use-ignition-project"; -import { mineBlock } from "../helpers"; - -/** - * For all accounts that will be used during the deployment we check - * to see if there are pending transactions (not from previous runs) - * and error if there are any. - */ -describe("execution - error on pending user transactions", () => { - useFileIgnitionProject( - "minimal", - "error-on-rerun-with-replaced-pending-user-transaction" - ); - - it.skip("should error if a transaction is in flight for an account used in the deploy", async function () { - // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = buildModule("FooModule", (m) => { - const account2 = m.getAccount(2); - - const foo = m.contract("Foo", [], { from: account2 }); - - return { - foo, - }; - }); - - // Before deploy, put a valid transaction into the mempool for accounts[2] - const [, , signer2] = await this.hre.ethers.getSigners(); - const FooFactory = await this.hre.ethers.getContractFactory("Foo"); - const outsideFooPromise = FooFactory.connect(signer2).deploy(); - await waitForPendingTxs(this.hre, 1, outsideFooPromise); - - // Deploying the module that uses accounts[2] throws with a warning - await assert.isRejected( - this.runControlledDeploy( - moduleDefinition, - async (_c: TestChainHelper) => {} - ), - "Pending transactions for account: 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc, please wait for transactions to complete before running a deploy" - ); - - // Now mine the user interference transaction - await mineBlock(this.hre); - - // The users interfering transaction completes normally - const outsideFoo = await outsideFooPromise; - assert.equal(await outsideFoo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts b/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts deleted file mode 100644 index 51c26d7bcb..0000000000 --- a/packages/hardhat-plugin/test/execution/timeouts/deploy-run-times-out.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - TestChainHelper, - useFileIgnitionProject, -} from "../../use-ignition-project"; - -/** - * A run that deploys a contract times out - * - * TODO: Needs to be updated to deal with fee bumps - */ -describe.skip("execution - deploy run times out", () => { - useFileIgnitionProject("minimal", "deploy-run-times-out", {}); - - it("should error naming timed out transactions", async function () { - // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = buildModule("FooModule", (m) => { - const account2 = m.getAccount(2); - - const foo = m.contract("Foo", [], { from: account2 }); - - return { - foo, - }; - }); - - // Deploying the module that uses accounts[2] throws with a warning - await assert.isRejected( - this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { - // wait for the deploy transaction to hit the memory pool, - // but then never mine the block that will complete it. - await c.waitForPendingTxs(1); - }), - "The deployment has been halted due to transaction timeouts:\n 0xc5ed278cdc282e8cf6ffa96234e680592c22a2c0afbdac114616ea02b132091b (FooModule:Foo/1)" - ); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts deleted file mode 100644 index 10d0552348..0000000000 --- a/packages/hardhat-plugin/test/execution/timeouts/rerun-a-deploy-that-timed-out.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - TestChainHelper, - useFileIgnitionProject, -} from "../../use-ignition-project"; - -/** - * A run that deploys a contract times out - * - * TODO: Needs to be updated to deal with fee bumps - */ -describe.skip("execution - rerun a deploy that timed out", () => { - useFileIgnitionProject("minimal", "rerun-a-deploy-that-timed-out"); - - it("should error naming timed out transactions", async function () { - // Setup a module with a contract deploy on accounts[2] - const moduleDefinition = buildModule("FooModule", (m) => { - const account2 = m.getAccount(2); - - const foo = m.contract("Foo", [], { from: account2 }); - - return { - foo, - }; - }); - - // Deploying the module that uses accounts[2], but force timeout, - // by not processing any blocks - await assert.isRejected( - this.runControlledDeploy(moduleDefinition, async (c: TestChainHelper) => { - // wait for the deploy transaction to hit the memory pool, - // but then never mine the block that will complete it. - await c.waitForPendingTxs(1); - }) - ); - - const result = await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - // Mine the block, confirming foo - await c.mineBlock(1); - } - ); - - assert.isDefined(result); - assert.equal(await result.foo.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/ignition-helper-guard.ts b/packages/hardhat-plugin/test/ignition-helper-guard.ts new file mode 100644 index 0000000000..fb7359bbf2 --- /dev/null +++ b/packages/hardhat-plugin/test/ignition-helper-guard.ts @@ -0,0 +1,21 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; + +/** + * A project that only imports `@nomicfoundation/hardhat-ignition` will not add + * a `hre.ignition` property to the Hardhat Runtime Environment. + * We warn that you need to install either the viem or ethers plugin to get + * Ignition support in tests or scripts. + */ +describe("ignition helper guard", () => { + useEphemeralIgnitionProject("minimal"); + + it("should error on attempting to use `hre.ignition` without viem/ethers plugins installed", function () { + assert.throws( + () => (this.hre as any).originalIgnition.deploy(), + /Please install either `@nomicfoundation\/hardhat-ignition-viem` or `@nomicfoundation\/hardhat-ignition-ethers` to use Ignition in your Hardhat tests/ + ); + }); +}); diff --git a/packages/hardhat-plugin/test/calls.ts b/packages/hardhat-plugin/test/module-api/calls.ts similarity index 68% rename from packages/hardhat-plugin/test/calls.ts rename to packages/hardhat-plugin/test/module-api/calls.ts index f12a24e2bf..e18ce6e181 100644 --- a/packages/hardhat-plugin/test/calls.ts +++ b/packages/hardhat-plugin/test/module-api/calls.ts @@ -2,7 +2,8 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { getBalanceFor } from "../test-helpers/get-balance-for"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("calls", () => { useEphemeralIgnitionProject("minimal"); @@ -19,17 +20,15 @@ describe("calls", () => { return { bar, usesContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.bar); assert.isDefined(result.usesContract); - const usedAddress = await result.usesContract.contractAddress(); + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; - assert.equal( - usedAddress.toLowerCase(), - (await result.bar.getAddress()).toLowerCase() - ); + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); }); it("should be able to call contracts with array args", async function () { @@ -45,11 +44,12 @@ describe("calls", () => { return { captureArraysContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.captureArraysContract); - const captureSuceeded = await result.captureArraysContract.arraysCaptured(); + const captureSuceeded = + await result.captureArraysContract.read.arraysCaptured(); assert(captureSuceeded); }); @@ -71,12 +71,12 @@ describe("calls", () => { return { captureComplexObjectContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.captureComplexObjectContract); const captureSuceeded = - await result.captureComplexObjectContract.complexArgCaptured(); + await result.captureComplexObjectContract.read.complexArgCaptured(); assert(captureSuceeded); }); @@ -95,13 +95,13 @@ describe("calls", () => { return { trace }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.trace); - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); + const entry1 = await result.trace.read.entries([0n]); + const entry2 = await result.trace.read.entries([1n]); + const entry3 = await result.trace.read.entries([2n]); assert.deepStrictEqual( [entry1, entry2, entry3], @@ -115,29 +115,27 @@ describe("calls", () => { const passingValue = m.contract("PassingValue"); m.call(passingValue, "deposit", [], { - value: BigInt(this.hre.ethers.parseEther("1").toString()), + value: 1_000_000_000n, }); return { passingValue }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); - assert.equal( - actualInstanceBalance.toString(), - this.hre.ethers.parseEther("1").toString() - ); + assert.equal(actualInstanceBalance, 1_000_000_000n); }); it("should be able to call a contract passing a value via a parameter", async function () { const submoduleDefinition = buildModule("Submodule", (m) => { - const depositValue = m.getParameter("depositValue", BigInt(1000)); + const depositValue = m.getParameter("depositValue", 1000n); const passingValue = m.contract("PassingValue"); @@ -154,24 +152,22 @@ describe("calls", () => { return { passingValue }; }); - const result = await this.deploy(moduleDefinition, { + const result = await this.hre.ignition.deploy(moduleDefinition, { parameters: { Submodule: { - depositValue: BigInt(this.hre.ethers.parseEther("1")), + depositValue: 1_000_000_000n, }, }, }); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); - assert.equal( - actualInstanceBalance.toString(), - this.hre.ethers.parseEther("1").toString() - ); + assert.equal(actualInstanceBalance, 1_000_000_000n); }); }); }); diff --git a/packages/hardhat-plugin/test/contracts.ts b/packages/hardhat-plugin/test/module-api/contracts.ts similarity index 68% rename from packages/hardhat-plugin/test/contracts.ts rename to packages/hardhat-plugin/test/module-api/contracts.ts index b9cd0a5f2c..01dcb3fc3c 100644 --- a/packages/hardhat-plugin/test/contracts.ts +++ b/packages/hardhat-plugin/test/module-api/contracts.ts @@ -2,7 +2,8 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { getBalanceFor } from "../test-helpers/get-balance-for"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("contract deploys", () => { useEphemeralIgnitionProject("minimal"); @@ -14,9 +15,9 @@ describe("contract deploys", () => { return { foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to deploy a contract with arguments", async function () { @@ -26,9 +27,9 @@ describe("contract deploys", () => { return { greeter }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - const greeting = await result.greeter.getGreeting(); + const greeting = await result.greeter.read.getGreeting(); assert.equal(greeting, "Hello World"); }); @@ -40,17 +41,15 @@ describe("contract deploys", () => { return { bar, usesContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.bar); assert.isDefined(result.usesContract); - const usedAddress = await result.usesContract.contractAddress(); + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; - assert.equal( - usedAddress.toLowerCase(), - (await result.bar.getAddress()).toLowerCase() - ); + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); }); it("should be able to deploy contracts without dependencies", async function () { @@ -61,12 +60,12 @@ describe("contract deploys", () => { return { foo, bar }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - const x = await result.foo.x(); - const isBar = await result.bar.isBar(); + const x = await result.foo.read.x(); + const isBar = await result.bar.read.isBar(); - assert.equal(x, Number(1)); + assert.equal(x, 1n); assert.equal(isBar, true); }); @@ -81,9 +80,9 @@ describe("contract deploys", () => { return { greeter }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - const greeting = await result.greeter.getGreeting(); + const greeting = await result.greeter.read.getGreeting(); assert.equal(greeting, "Hello World"); }); @@ -91,32 +90,27 @@ describe("contract deploys", () => { it("should be able to deploy a contract with an endowment", async function () { const moduleDefinition = buildModule("EndowmentModule", (m) => { const passingValue = m.contract("PassingValue", [], { - value: BigInt(this.hre.ethers.parseEther("1").toString()), + value: 1_000_000_000n, }); return { passingValue }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); - assert.equal( - actualInstanceBalance.toString(), - this.hre.ethers.parseEther("1").toString() - ); + assert.equal(actualInstanceBalance, 1_000_000_000n); }); it("should be able to deploy a contract with an endowment via a parameter", async function () { const submoduleDefinition = buildModule("submodule", (m) => { - const endowment = m.getParameter( - "endowment", - BigInt(this.hre.ethers.parseEther("2").toString()) - ); + const endowment = m.getParameter("endowment", 2_000_000_000n); const passingValue = m.contract("PassingValue", [], { value: endowment, @@ -131,18 +125,16 @@ describe("contract deploys", () => { return { passingValue }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); - assert.equal( - actualInstanceBalance.toString(), - this.hre.ethers.parseEther("2").toString() - ); + assert.equal(actualInstanceBalance, 2_000_000_000n); }); it("should be able to deploy a contract with an endowment via a static call", async function () { @@ -164,12 +156,13 @@ describe("contract deploys", () => { return { passingValue }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); assert.equal(actualInstanceBalance.toString(), "42"); @@ -198,12 +191,13 @@ describe("contract deploys", () => { return { passingValue }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result.passingValue); - const actualInstanceBalance = await this.hre.ethers.provider.getBalance( - await result.passingValue.getAddress() + const actualInstanceBalance = await getBalanceFor( + this.hre, + result.passingValue.address ); assert.equal(actualInstanceBalance.toString(), "42"); diff --git a/packages/hardhat-plugin/test/events.ts b/packages/hardhat-plugin/test/module-api/events.ts similarity index 76% rename from packages/hardhat-plugin/test/events.ts rename to packages/hardhat-plugin/test/module-api/events.ts index e20f613299..291d0b4383 100644 --- a/packages/hardhat-plugin/test/events.ts +++ b/packages/hardhat-plugin/test/module-api/events.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("events", () => { useEphemeralIgnitionProject("minimal"); @@ -26,10 +26,10 @@ describe("events", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to use the output of a readEvent in an artifact contract at", async function () { @@ -53,10 +53,10 @@ describe("events", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to read an event from a SendDataFuture", async function () { @@ -74,9 +74,9 @@ describe("events", () => { return { sendEmitter }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.sendEmitter.wasEmitted(), true); + assert.equal(await result.sendEmitter.read.wasEmitted(), true); }); it("should be able to use the output of a readEvent with an indexed tuple result", async function () { @@ -98,9 +98,9 @@ describe("events", () => { return { tupleContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.tupleContract.arg1Captured(), true); - assert.equal(await result.tupleContract.arg2Captured(), true); + assert.equal(await result.tupleContract.read.arg1Captured(), true); + assert.equal(await result.tupleContract.read.arg2Captured(), true); }); }); diff --git a/packages/hardhat-plugin/test/existing-contract.ts b/packages/hardhat-plugin/test/module-api/existing-contract.ts similarity index 69% rename from packages/hardhat-plugin/test/existing-contract.ts rename to packages/hardhat-plugin/test/module-api/existing-contract.ts index 53e549cf2e..2b50dbb73a 100644 --- a/packages/hardhat-plugin/test/existing-contract.ts +++ b/packages/hardhat-plugin/test/module-api/existing-contract.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("existing contract", () => { useEphemeralIgnitionProject("minimal"); @@ -24,11 +24,10 @@ describe("existing contract", () => { return { bar, usesContract }; }); - const firstResult = await this.deploy(firstModuleDefinition); + const firstResult = await this.hre.ignition.deploy(firstModuleDefinition); - const barAddress: string = await firstResult.bar.getAddress(); - const usesContractAddress: string = - await firstResult.usesContract.getAddress(); + const barAddress: string = firstResult.bar.address; + const usesContractAddress: string = firstResult.usesContract.address; const secondModuleDefinition = buildModule("SecondModule", (m) => { const bar = m.contractAt("Bar", barArtifact, barAddress); @@ -43,16 +42,14 @@ describe("existing contract", () => { return { bar, usesContract }; }); - const result = await this.deploy(secondModuleDefinition); + const result = await this.hre.ignition.deploy(secondModuleDefinition); assert.isDefined(result.bar); assert.isDefined(result.usesContract); - const usedAddress = await result.usesContract.contractAddress(); + const usedAddress = + (await result.usesContract.read.contractAddress()) as string; - assert.equal( - usedAddress.toLowerCase(), - (await result.bar.getAddress()).toLowerCase() - ); + assert.equal(usedAddress.toLowerCase(), result.bar.address.toLowerCase()); }); }); diff --git a/packages/hardhat-plugin/test/libraries.ts b/packages/hardhat-plugin/test/module-api/libraries.ts similarity index 75% rename from packages/hardhat-plugin/test/libraries.ts rename to packages/hardhat-plugin/test/module-api/libraries.ts index 146036bda7..5ccefc9c78 100644 --- a/packages/hardhat-plugin/test/libraries.ts +++ b/packages/hardhat-plugin/test/module-api/libraries.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("libraries", () => { useEphemeralIgnitionProject("minimal"); @@ -19,15 +19,13 @@ describe("libraries", () => { return { rubbishMath, dependsOnLib }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result); const contractThatDependsOnLib = result.dependsOnLib; - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( - 1, - 2, - 3 + const libBasedAddtion = await contractThatDependsOnLib.read.addThreeNumbers( + [1, 2, 3] ); assert.equal(libBasedAddtion, 6); @@ -51,15 +49,13 @@ describe("libraries", () => { return { rubbishMath, dependsOnLib }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result); const contractThatDependsOnLib = result.dependsOnLib; - const libBasedAddtion = await contractThatDependsOnLib.addThreeNumbers( - 1, - 2, - 3 + const libBasedAddtion = await contractThatDependsOnLib.read.addThreeNumbers( + [1, 2, 3] ); assert.equal(libBasedAddtion, 6); @@ -72,9 +68,11 @@ describe("libraries", () => { return { rubbishMath }; }); - const libDeployResult = await this.deploy(libraryModuleDefinition); + const libDeployResult = await this.hre.ignition.deploy( + libraryModuleDefinition + ); - const libAddress = await libDeployResult.rubbishMath.getAddress(); + const libAddress = libDeployResult.rubbishMath.address; const moduleDefinition = buildModule("ConsumingLibModule", (m) => { const rubbishMath = m.contractAt("RubbishMath", libAddress); @@ -88,10 +86,10 @@ describe("libraries", () => { return { dependsOnLib }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await libDeployResult.rubbishMath.add(1, 2), 3); - assert.equal(await result.dependsOnLib.addThreeNumbers(1, 2, 3), 6); + assert.equal(await libDeployResult.rubbishMath.read.add([1, 2]), 3); + assert.equal(await result.dependsOnLib.read.addThreeNumbers([1, 2, 3]), 6); }); it("should be able to deploy a library that depends on a library", async function () { @@ -117,16 +115,13 @@ describe("libraries", () => { return { rubbishMath, libDependsOnLib, dependsOnLibThatDependsOnLib }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); assert.isDefined(result); const contractThatDependsOnLibOnLib = result.dependsOnLibThatDependsOnLib; - const libBasedAddtion = await contractThatDependsOnLibOnLib.addThreeNumbers( - 1, - 2, - 3 - ); + const libBasedAddtion = + await contractThatDependsOnLibOnLib.read.addThreeNumbers([1, 2, 3]); assert.equal(libBasedAddtion, 6); }); diff --git a/packages/hardhat-plugin/test/params.ts b/packages/hardhat-plugin/test/module-api/params.ts similarity index 83% rename from packages/hardhat-plugin/test/params.ts rename to packages/hardhat-plugin/test/module-api/params.ts index 6c33254069..9ea00b73ed 100644 --- a/packages/hardhat-plugin/test/params.ts +++ b/packages/hardhat-plugin/test/module-api/params.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("module parameters", () => { useEphemeralIgnitionProject("minimal"); @@ -18,11 +18,11 @@ describe("module parameters", () => { return { foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - const v = await result.foo.x(); + const v = await result.foo.read.x(); - assert.equal(v, Number(43)); + assert.equal(v, 43n); }); it("should be able to override a default number", async function () { @@ -36,7 +36,7 @@ describe("module parameters", () => { return { foo }; }); - const result = await this.deploy(moduleDefinition, { + const result = await this.hre.ignition.deploy(moduleDefinition, { parameters: { WithDefaultModule: { MyNumber: 20, @@ -44,7 +44,7 @@ describe("module parameters", () => { }, }); - assert.equal(await result.foo.x(), Number(21)); + assert.equal(await result.foo.read.x(), 21n); }); it("should be able to retrieve a default string", async function () { @@ -56,9 +56,9 @@ describe("module parameters", () => { return { greeter }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - const v = await result.greeter.getGreeting(); + const v = await result.greeter.read.getGreeting(); assert.equal(v, "Example"); }); @@ -72,7 +72,7 @@ describe("module parameters", () => { return { greeter }; }); - const result = await this.deploy(moduleDefinition, { + const result = await this.hre.ignition.deploy(moduleDefinition, { parameters: { WithDefaultStringModule: { MyString: "NotExample", @@ -80,7 +80,7 @@ describe("module parameters", () => { }, }); - assert.equal(await result.greeter.getGreeting(), "NotExample"); + assert.equal(await result.greeter.read.getGreeting(), "NotExample"); }); }); diff --git a/packages/hardhat-plugin/test/static-calls.ts b/packages/hardhat-plugin/test/module-api/static-calls.ts similarity index 80% rename from packages/hardhat-plugin/test/static-calls.ts rename to packages/hardhat-plugin/test/module-api/static-calls.ts index 891522b683..fd603e5f73 100644 --- a/packages/hardhat-plugin/test/static-calls.ts +++ b/packages/hardhat-plugin/test/module-api/static-calls.ts @@ -2,7 +2,7 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("static calls", () => { useEphemeralIgnitionProject("minimal"); @@ -24,10 +24,10 @@ describe("static calls", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to use the output of a static call in an artifact contract at", async function () { @@ -49,10 +49,10 @@ describe("static calls", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to use the output of a static call function in a contract at (with arg)", async function () { @@ -72,10 +72,10 @@ describe("static calls", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to use the output of a static call function in a contract at (with function signature)", async function () { @@ -101,10 +101,10 @@ describe("static calls", () => { return { fooFactory, foo }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.fooFactory.isDeployed(), true); - assert.equal(await result.foo.x(), Number(1)); + assert.equal(await result.fooFactory.read.isDeployed(), true); + assert.equal(await result.foo.read.x(), 1n); }); it("should be able to use the output of a static call with an indexed tuple result", async function () { @@ -124,10 +124,10 @@ describe("static calls", () => { return { tupleContract }; }); - const result = await this.deploy(moduleDefinition); + const result = await this.hre.ignition.deploy(moduleDefinition); - assert.equal(await result.tupleContract.arg1Captured(), true); - assert.equal(await result.tupleContract.arg2Captured(), true); + assert.equal(await result.tupleContract.read.arg1Captured(), true); + assert.equal(await result.tupleContract.read.arg2Captured(), true); }); it("should not be able to use the output of a non-address static call in a contract at", async function () { @@ -148,7 +148,7 @@ describe("static calls", () => { }); await assert.isRejected( - this.deploy(moduleDefinition), + this.hre.ignition.deploy(moduleDefinition), /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ ); }); @@ -173,7 +173,7 @@ describe("static calls", () => { }); await assert.isRejected( - this.deploy(moduleDefinition), + this.hre.ignition.deploy(moduleDefinition), /Future 'FooModule#FooFactory.nonAddressResult' must be a valid address/ ); }); diff --git a/packages/hardhat-plugin/test/use-module.ts b/packages/hardhat-plugin/test/module-api/use-module.ts similarity index 76% rename from packages/hardhat-plugin/test/use-module.ts rename to packages/hardhat-plugin/test/module-api/use-module.ts index 586047e6f6..27a4894586 100644 --- a/packages/hardhat-plugin/test/use-module.ts +++ b/packages/hardhat-plugin/test/module-api/use-module.ts @@ -2,15 +2,13 @@ import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("useModule", function () { useEphemeralIgnitionProject("minimal"); describe("returning futures from module usage", () => { it("using useModule", async function () { - await this.hre.run("compile", { quiet: true }); - const thirdPartyModule = buildModule("ThirdPartySubmodule", (m) => { const foo = m.contract("Foo"); @@ -25,16 +23,14 @@ describe("useModule", function () { return { foo }; }); - const result = await this.deploy(userModule); + const result = await this.hre.ignition.deploy(userModule); - assert.equal(await result.foo.x(), Number(2)); + assert.equal(await result.foo.read.x(), 2n); }); }); describe("modules depending on other modules contracts", () => { it("should execute all in a module before any that depends on a contract within the module", async function () { - await this.hre.run("compile", { quiet: true }); - const firstSecondAndThirdModule = buildModule( "SecondAndThirdCallModule", (m) => { @@ -65,12 +61,12 @@ describe("useModule", function () { return { trace }; }); - const result = await this.deploy(userModule); + const result = await this.hre.ignition.deploy(userModule); - const entry1 = await result.trace.entries(0); - const entry2 = await result.trace.entries(1); - const entry3 = await result.trace.entries(2); - const entry4 = await result.trace.entries(3); + const entry1 = await result.trace.read.entries([0n]); + const entry2 = await result.trace.read.entries([1n]); + const entry3 = await result.trace.read.entries([2n]); + const entry4 = await result.trace.read.entries([3n]); assert.deepStrictEqual( [entry1, entry2, entry3, entry4], diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-plugin/test/plan/index.ts index 9d3a085e13..af4af6dc63 100644 --- a/packages/hardhat-plugin/test/plan/index.ts +++ b/packages/hardhat-plugin/test/plan/index.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { emptyDirSync, readdir } from "fs-extra"; import path from "path"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("visualize", () => { useEphemeralIgnitionProject("minimal"); diff --git a/packages/hardhat-plugin/test/status.ts b/packages/hardhat-plugin/test/status.ts deleted file mode 100644 index efc95887c2..0000000000 --- a/packages/hardhat-plugin/test/status.ts +++ /dev/null @@ -1,139 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { buildModule, status } from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { - TestChainHelper, - useFileIgnitionProject, -} from "./use-ignition-project"; - -/** - * This is the simplest contract deploy case. - * - * Deploy a single contract with non-problematic network - */ -describe("status", function () { - const emptyResult = { - started: [], - timedOut: [], - held: [], - failed: [], - successful: [], - contracts: {}, - }; - - describe("when there are failed futures", function () { - useFileIgnitionProject("minimal", "status-tests-failed"); - - it("should show successfully deployed contracts", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - - const statusResult = await status(this.deploymentDir!); - - assert.deepStrictEqual(statusResult, { - ...emptyResult, - successful: ["FooModule#Foo"], - contracts: { - "FooModule#Foo": { - id: "FooModule#Foo", - contractName: "Foo", - address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - }, - }, - }); - }); - - it("should show simulation errors as started futures", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - m.call(foo, "incByPositiveNumber", [0]); - - return { foo }; - }); - - let didError = false; - try { - await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - } catch (e) { - didError = true; - } - - assert(didError, "Error deployment didn't happen and its a prerequisite"); - - const statusResult = await status(this.deploymentDir!); - - assert.deepStrictEqual(statusResult, { - ...emptyResult, - successful: ["FooModule#Foo"], - started: ["FooModule#Foo.incByPositiveNumber"], - contracts: { - "FooModule#Foo": { - id: "FooModule#Foo", - contractName: "Foo", - address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - }, - }, - }); - }); - }); - - describe("when there are timed out futures", function () { - useFileIgnitionProject("minimal", "status-tests-timed-out", { - blockPollingInterval: 1_000, - timeBeforeBumpingFees: 0, - maxFeeBumps: 0, - requiredConfirmations: 1, - }); - - it("should show timed out futures", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - let didError = false; - try { - await this.runControlledDeploy( - moduleDefinition, - async (c: TestChainHelper) => { - await c.mineBlock(1); - } - ); - } catch (e) { - didError = true; - } - - assert(didError, "Error deployment didn't happen and its a prerequisite"); - - const statusResult = await status(this.deploymentDir!); - - assert.deepStrictEqual(statusResult, { - ...emptyResult, - timedOut: [ - { - futureId: "FooModule#Foo", - networkInteractionId: 1, - }, - ], - }); - }); - }); -}); diff --git a/packages/hardhat-plugin/test/execution/helpers.ts b/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts similarity index 78% rename from packages/hardhat-plugin/test/execution/helpers.ts rename to packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts index af2e1215aa..04044b50a0 100644 --- a/packages/hardhat-plugin/test/execution/helpers.ts +++ b/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts @@ -1,13 +1,6 @@ import { assert } from "chai"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -export const sleep = (timeout: number) => - new Promise((res) => setTimeout(res, timeout)); - -export function mineBlock(hre: HardhatRuntimeEnvironment): Promise { - return hre.network.provider.send("evm_mine"); -} - export async function clearPendingTransactionsFromMemoryPool( hre: HardhatRuntimeEnvironment ): Promise { diff --git a/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts b/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts new file mode 100644 index 0000000000..8b0caba349 --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts @@ -0,0 +1,16 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +/** + * Get latest balance for an address. + */ +export async function getBalanceFor( + hre: HardhatRuntimeEnvironment, + address: string +): Promise { + const balance = await hre.network.provider.send("eth_getBalance", [ + address, + "latest", + ]); + + return BigInt(balance); +} diff --git a/packages/hardhat-plugin/test/test-helpers/mine-block.ts b/packages/hardhat-plugin/test/test-helpers/mine-block.ts new file mode 100644 index 0000000000..24092427d0 --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/mine-block.ts @@ -0,0 +1,5 @@ +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +export function mineBlock(hre: HardhatRuntimeEnvironment): Promise { + return hre.network.provider.send("evm_mine"); +} diff --git a/packages/hardhat-plugin/test/test-helpers/sleep.ts b/packages/hardhat-plugin/test/test-helpers/sleep.ts new file mode 100644 index 0000000000..d95e4b68e4 --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/sleep.ts @@ -0,0 +1,2 @@ +export const sleep = (timeout: number) => + new Promise((res) => setTimeout(res, timeout)); diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts new file mode 100644 index 0000000000..2faf1d9770 --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -0,0 +1,199 @@ +import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; + +import { + deploy, + DeployConfig, + DeploymentParameters, + DeploymentResultType, + EIP1193Provider, + Future, + IgnitionModule, + IgnitionModuleResult, + isContractFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + SuccessfulDeploymentResult, +} from "@nomicfoundation/ignition-core"; +import { HardhatPluginError } from "hardhat/plugins"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import { createPublicClient, custom, getContract } from "viem"; +import { hardhat } from "viem/chains"; + +import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; +import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; + +export type IgnitionModuleResultsTToViemContracts< + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult +> = { + [contract in keyof IgnitionModuleResultsT]: IgnitionModuleResultsT[contract] extends + | NamedArtifactContractDeploymentFuture + | NamedArtifactContractAtFuture + ? TypeChainViemContractByName + : GetContractReturnType; +}; + +// TODO: Make this work to have support for TypeChain +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export type TypeChainViemContractByName = GetContractReturnType; + +export class TestIgnitionHelper { + public type = "test"; + + private _provider: EIP1193Provider; + private _deploymentDir: string | undefined; + + constructor( + private _hre: HardhatRuntimeEnvironment, + private _config?: Partial, + provider?: EIP1193Provider, + deploymentDir?: string + ) { + this._provider = provider ?? this._hre.network.provider; + this._deploymentDir = deploymentDir; + } + + public async deploy< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + { + parameters = {}, + config: perDeployConfig = {}, + }: { + parameters?: DeploymentParameters; + config?: Partial; + } = { + parameters: {}, + config: {}, + } + ): Promise< + IgnitionModuleResultsTToViemContracts + > { + const accounts = (await this._hre.network.provider.request({ + method: "eth_accounts", + })) as string[]; + + const artifactResolver = new HardhatArtifactResolver(this._hre); + + const resolvedConfig: Partial = { + ...this._config, + ...perDeployConfig, + }; + + const result = await deploy({ + config: resolvedConfig, + provider: this._provider, + deploymentDir: this._deploymentDir, + artifactResolver, + ignitionModule, + deploymentParameters: parameters, + accounts, + }); + + if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { + const message = errorDeploymentResultToExceptionMessage(result); + + throw new HardhatPluginError("hardhat-ignition-test", message); + } + + const publicClient = createPublicClient({ + chain: hardhat, + transport: custom(this._hre.network.provider), + }); + + return this._toViemContracts( + this._hre, + ignitionModule, + result, + publicClient + ); + } + + private async _toViemContracts< + ModuleIdT extends string, + ContractNameT extends string, + IgnitionModuleResultsT extends IgnitionModuleResult + >( + hre: HardhatRuntimeEnvironment, + ignitionModule: IgnitionModule< + ModuleIdT, + ContractNameT, + IgnitionModuleResultsT + >, + result: SuccessfulDeploymentResult, + publicClient: any + ): Promise< + IgnitionModuleResultsTToViemContracts + > { + return Object.fromEntries( + await Promise.all( + Object.entries(ignitionModule.results).map( + async ([name, contractFuture]) => [ + name, + await this._getContract( + hre, + contractFuture, + result.contracts[contractFuture.id], + publicClient + ), + ] + ) + ) + ); + } + + private async _getContract( + hre: HardhatRuntimeEnvironment, + future: Future, + deployedContract: { address: string; contractName: string }, + publicClient: any + ): Promise { + if (!isContractFuture(future)) { + throw new HardhatPluginError( + "hardhat-ignition-viem", + `Expected contract future but got ${future.id} with type ${future.type} instead` + ); + } + + const contract: any = getContract({ + address: this._ensureAddressFormat(deployedContract.address), + abi: await this._loadAbiFromHHArtifactFolder( + hre, + deployedContract.contractName + ), + publicClient, + }); + + return contract; + } + + private _ensureAddressFormat(address: string): `0x${string}` { + if (!address.startsWith("0x")) { + return `0x${address}`; + } + + return `0x${address.slice(2)}`; + } + + private async _loadAbiFromHHArtifactFolder( + hre: HardhatRuntimeEnvironment, + contractName: string + ): Promise { + const artifact = await hre.artifacts.readArtifact(contractName); + + if (artifact === undefined) { + throw new Error( + `Test error: no hardcoded abi for contract ${contractName}` + ); + } + + return artifact.abi; + } +} diff --git a/packages/hardhat-plugin/test/type-helper.ts b/packages/hardhat-plugin/test/test-helpers/type-helper.ts similarity index 100% rename from packages/hardhat-plugin/test/type-helper.ts rename to packages/hardhat-plugin/test/test-helpers/type-helper.ts diff --git a/packages/hardhat-plugin/test/use-ignition-project.ts b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts similarity index 85% rename from packages/hardhat-plugin/test/use-ignition-project.ts rename to packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts index 5dafa55647..d5cf7397e3 100644 --- a/packages/hardhat-plugin/test/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts @@ -1,20 +1,17 @@ import { DeployConfig, IgnitionModule } from "@nomicfoundation/ignition-core"; -import { Contract } from "ethers"; import { ensureDirSync, removeSync } from "fs-extra"; import { resetHardhatContext } from "hardhat/plugins-testing"; import { HardhatRuntimeEnvironment } from "hardhat/types"; import path from "path"; -import { IgnitionHelper } from "../src/ignition-helper"; - -import { clearPendingTransactionsFromMemoryPool } from "./execution/helpers"; -import { waitForPendingTxs } from "./helpers"; +import { clearPendingTransactionsFromMemoryPool } from "./clear-pending-transactions-from-memory-pool"; +import { TestIgnitionHelper } from "./test-ignition-helper"; +import { waitForPendingTxs } from "./wait-for-pending-txs"; declare module "mocha" { interface Context { - hre: HardhatRuntimeEnvironment; + hre: HardhatRuntimeEnvironment & { ignition: TestIgnitionHelper }; deploymentDir: string | undefined; - deploy: HardhatRuntimeEnvironment["ignition"]["deploy"]; runControlledDeploy: ( ignitionModule: IgnitionModule, chainUpdates: (c: TestChainHelper) => Promise @@ -33,7 +30,7 @@ const defaultTestConfig: DeployConfig = { export function useEphemeralIgnitionProject(fixtureProjectName: string) { beforeEach("Load environment", async function () { process.chdir( - path.join(__dirname, "./fixture-projects", fixtureProjectName) + path.join(__dirname, "../fixture-projects", fixtureProjectName) ); const hre = require("hardhat"); @@ -42,11 +39,9 @@ export function useEphemeralIgnitionProject(fixtureProjectName: string) { await hre.run("compile", { quiet: true }); this.hre = hre; + (this.hre as any).originalIgnition = this.hre.ignition; + this.hre.ignition = new TestIgnitionHelper(hre); this.deploymentDir = undefined; - - await hre.run("compile", { quiet: true }); - - this.deploy = this.hre.ignition.deploy.bind(this.hre.ignition); }); afterEach("reset hardhat context", function () { @@ -61,18 +56,19 @@ export function useFileIgnitionProject( ) { beforeEach("Load environment", async function () { process.chdir( - path.join(__dirname, "./fixture-projects", fixtureProjectName) + path.join(__dirname, "../fixture-projects", fixtureProjectName) ); const hre = require("hardhat"); const deploymentDir = path.join( - path.resolve(__dirname, "./fixture-projects/minimal/"), + path.resolve(__dirname, "../fixture-projects/minimal/"), "deployments", deploymentId ); this.hre = hre; + this.hre.ignition = new TestIgnitionHelper(hre); this.deploymentDir = deploymentDir; await hre.run("compile", { quiet: true }); @@ -120,7 +116,7 @@ async function runDeploy( config = {}, }: { hre: HardhatRuntimeEnvironment; config?: Partial }, chainUpdates: (c: TestChainHelper) => Promise = async () => {} -): Promise> { +): Promise> { const { ignitionHelper: ignitionHelper, kill: killFn } = setupIgnitionHelperRiggedToThrow(hre, deploymentDir, config); @@ -151,7 +147,7 @@ function setupIgnitionHelperRiggedToThrow( deploymentDir: string, config: Partial = {} ): { - ignitionHelper: IgnitionHelper; + ignitionHelper: TestIgnitionHelper; kill: () => void; } { let trigger: boolean = false; @@ -171,7 +167,7 @@ function setupIgnitionHelperRiggedToThrow( }, }); - const ignitionHelper = new IgnitionHelper( + const ignitionHelper = new TestIgnitionHelper( hre, config, proxiedProvider, diff --git a/packages/hardhat-plugin/test/helpers.ts b/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts similarity index 100% rename from packages/hardhat-plugin/test/helpers.ts rename to packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts diff --git a/packages/hardhat-plugin/test/load-module.ts b/packages/hardhat-plugin/test/utils/load-module.ts similarity index 86% rename from packages/hardhat-plugin/test/load-module.ts rename to packages/hardhat-plugin/test/utils/load-module.ts index d684b95ef3..75b33bf2bb 100644 --- a/packages/hardhat-plugin/test/load-module.ts +++ b/packages/hardhat-plugin/test/utils/load-module.ts @@ -1,9 +1,8 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { loadModule } from "../src/load-module"; - -import { useEphemeralIgnitionProject } from "./use-ignition-project"; +import { loadModule } from "../../src/utils/load-module"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("loadModule", function () { useEphemeralIgnitionProject("user-modules"); diff --git a/packages/hardhat-plugin/test/verify/index.ts b/packages/hardhat-plugin/test/verify/index.ts index 28f50e15e0..9de5b840e1 100644 --- a/packages/hardhat-plugin/test/verify/index.ts +++ b/packages/hardhat-plugin/test/verify/index.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { useEphemeralIgnitionProject } from "../use-ignition-project"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; describe("verify", function () { describe("when there is no etherscan API key configured", function () { diff --git a/packages/ui/package.json b/packages/ui/package.json index e2e2ff7616..5d293e8b5c 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -22,24 +22,15 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/styled-components": "5.1.26", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/parser": "^5.57.1", "@vitejs/plugin-react": "^4.0.0", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "mermaid": "10.1.0", - "mocha": "^9.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "6.11.0", "react-tooltip": "^5.21.4", - "rimraf": "3.0.2", "styled-components": "5.3.10", - "ts-node": "10.9.1", - "typescript": "^5.0.2", "vite": "^4.3.2", "vite-plugin-singlefile": "0.13.5" } From a6aa6ecd8615ad8d4aa8086da23834ef9c212dce Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 7 Dec 2023 10:52:52 +0000 Subject: [PATCH 1120/1302] chore: cleanup eslint config in examples We were seeing errors on some sample projects eslinting in vscode. This was due to a misconfiguraiont in their eslintrc that was pulling in the tsconfig wrong. Eslint then fell back to the root repo directories tsconfig, which doesn't exist - hence the error. The solution was to remove the failing import and rely on the default. --- examples/complete/.eslintrc.js | 2 +- examples/ens/.eslintrc.js | 2 +- examples/sample/.eslintrc.js | 2 +- examples/ts-sample/.eslintrc.js | 5 ++--- examples/viem-sample/.eslintrc.js | 5 ++--- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/examples/complete/.eslintrc.js b/examples/complete/.eslintrc.js index 8457c86dfe..eca768e2f9 100644 --- a/examples/complete/.eslintrc.js +++ b/examples/complete/.eslintrc.js @@ -10,5 +10,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], }; diff --git a/examples/ens/.eslintrc.js b/examples/ens/.eslintrc.js index 8457c86dfe..eca768e2f9 100644 --- a/examples/ens/.eslintrc.js +++ b/examples/ens/.eslintrc.js @@ -10,5 +10,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], }; diff --git a/examples/sample/.eslintrc.js b/examples/sample/.eslintrc.js index 8457c86dfe..eca768e2f9 100644 --- a/examples/sample/.eslintrc.js +++ b/examples/sample/.eslintrc.js @@ -10,5 +10,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], }; diff --git a/examples/ts-sample/.eslintrc.js b/examples/ts-sample/.eslintrc.js index b22007961e..50509fbed2 100644 --- a/examples/ts-sample/.eslintrc.js +++ b/examples/ts-sample/.eslintrc.js @@ -2,8 +2,7 @@ module.exports = { extends: ["plugin:prettier/recommended"], parser: "@typescript-eslint/parser", parserOptions: { - project: "./tsconfig.json", - tsConfigRootDir: "./", + ecmaVersion: "latest", }, plugins: ["eslint-plugin-import", "@typescript-eslint"], env: { @@ -13,5 +12,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], }; diff --git a/examples/viem-sample/.eslintrc.js b/examples/viem-sample/.eslintrc.js index b22007961e..50509fbed2 100644 --- a/examples/viem-sample/.eslintrc.js +++ b/examples/viem-sample/.eslintrc.js @@ -2,8 +2,7 @@ module.exports = { extends: ["plugin:prettier/recommended"], parser: "@typescript-eslint/parser", parserOptions: { - project: "./tsconfig.json", - tsConfigRootDir: "./", + ecmaVersion: "latest", }, plugins: ["eslint-plugin-import", "@typescript-eslint"], env: { @@ -13,5 +12,5 @@ module.exports = { rules: { "no-console": "error", }, - ignorePatterns: ["post-build.js", "artifacts/*", "cache/*"], + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], }; From f2d9e42f68d0710f7ccf399b515aec2fce7a614f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 7 Dec 2023 13:45:49 +0000 Subject: [PATCH 1121/1302] feat: support changing the default sender in tests Expose default sender as an option through both the viem and ethers Ignition Helper (i.e. `hre.ignition`). Adding the tests, showed a bug in check default senders in account code due to casing differences. Resolves #639. --- packages/core/src/deploy.ts | 37 ++++++++++---- .../src/ethers-ignition-helper.ts | 4 ++ .../test/default-sender.ts | 48 +++++++++++++++++++ .../minimal/contracts/Contracts.sol | 8 ++++ .../test/test-helpers/use-ignition-project.ts | 28 +++++++++++ .../src/viem-ignition-helper.ts | 4 ++ .../test/default-sender.ts | 48 +++++++++++++++++++ .../minimal/contracts/Contracts.sol | 8 ++++ 8 files changed, 175 insertions(+), 10 deletions(-) create mode 100644 packages/hardhat-plugin-ethers/test/default-sender.ts create mode 100644 packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts create mode 100644 packages/hardhat-plugin-viem/test/default-sender.ts diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 90860a9093..e2d38c0d53 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -9,6 +9,7 @@ import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemera import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; import { BasicExecutionStrategy } from "./internal/execution/basic-execution-strategy"; import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; +import { equalAddresses } from "./internal/execution/utils/address"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; import { checkAutominedNetwork } from "./internal/utils/check-automined-network"; import { validate } from "./internal/validation/validate"; @@ -43,7 +44,7 @@ export async function deploy< ignitionModule, deploymentParameters, accounts, - defaultSender, + defaultSender: givenDefaultSender, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -84,15 +85,7 @@ export async function deploy< return validationResult; } - if (defaultSender !== undefined) { - if (!accounts.includes(defaultSender)) { - throw new IgnitionError(ERRORS.VALIDATION.INVALID_DEFAULT_SENDER, { - defaultSender, - }); - } - } else { - defaultSender = getDefaultSender(accounts); - } + const defaultSender = _resolveDefaultSender(givenDefaultSender, accounts); const deploymentLoader = deploymentDir === undefined @@ -132,3 +125,27 @@ export async function deploy< defaultSender ); } + +function _resolveDefaultSender( + givenDefaultSender: string | undefined, + accounts: string[] +): string { + let defaultSender: string; + if (givenDefaultSender !== undefined) { + const isDefaultSenderInAccounts = accounts.some((account) => + equalAddresses(account, givenDefaultSender) + ); + + if (!isDefaultSenderInAccounts) { + throw new IgnitionError(ERRORS.VALIDATION.INVALID_DEFAULT_SENDER, { + givenDefaultSender, + }); + } + + defaultSender = givenDefaultSender; + } else { + defaultSender = getDefaultSender(accounts); + } + + return defaultSender; +} diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index e5f25f1c66..2f32444c20 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -64,12 +64,15 @@ export class EthersIgnitionHelper { { parameters = {}, config: perDeployConfig = {}, + defaultSender = undefined, }: { parameters?: DeploymentParameters; config?: Partial; + defaultSender?: string; } = { parameters: {}, config: {}, + defaultSender: undefined, } ): Promise< IgnitionModuleResultsTToEthersContracts< @@ -96,6 +99,7 @@ export class EthersIgnitionHelper { ignitionModule, deploymentParameters: parameters, accounts, + defaultSender, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin-ethers/test/default-sender.ts b/packages/hardhat-plugin-ethers/test/default-sender.ts new file mode 100644 index 0000000000..100752b682 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/default-sender.ts @@ -0,0 +1,48 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("support changing default sender", () => { + useIgnitionProject("minimal"); + + it("should deploy on the first HH account by default", async function () { + const [defaultAccount] = await this.hre.ethers.getSigners(); + const defaultAccountAddress = defaultAccount.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: undefined, + }); + + assert.equal( + (await result.ownerSender.owner()).toLowerCase(), + defaultAccountAddress.toLowerCase() + ); + }); + + it("should allow changing the default sender that the ignition deployment runs against", async function () { + const [, notTheDefaultAccount] = await this.hre.ethers.getSigners(); + const differentAccountAddress = notTheDefaultAccount.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: differentAccountAddress, + }); + + assert.equal( + (await result.ownerSender.owner()).toLowerCase(), + differentAccountAddress.toLowerCase() + ); + }); +}); diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol index 5b1ae2d7d1..b0567e5527 100644 --- a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol @@ -220,3 +220,11 @@ contract SendDataEmitter { require(arg == true, "arg is wrong"); } } + +contract OwnerSender { + address public owner; + + constructor() { + owner = msg.sender; + } +} diff --git a/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts b/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts new file mode 100644 index 0000000000..42fc434fc0 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts @@ -0,0 +1,28 @@ +import { resetHardhatContext } from "hardhat/plugins-testing"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; + +declare module "mocha" { + interface Context { + hre: HardhatRuntimeEnvironment; + } +} + +export function useIgnitionProject(fixtureProjectName: string) { + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); +} diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index fa8a706622..2096175c08 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -58,12 +58,15 @@ export class ViemIgnitionHelper { { parameters = {}, config: perDeployConfig = {}, + defaultSender = undefined, }: { parameters?: DeploymentParameters; config?: Partial; + defaultSender?: string; } = { parameters: {}, config: {}, + defaultSender: undefined, } ): Promise< IgnitionModuleResultsToViemContracts @@ -87,6 +90,7 @@ export class ViemIgnitionHelper { ignitionModule, deploymentParameters: parameters, accounts, + defaultSender, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin-viem/test/default-sender.ts b/packages/hardhat-plugin-viem/test/default-sender.ts new file mode 100644 index 0000000000..320ca42c04 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/default-sender.ts @@ -0,0 +1,48 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("support changing default sender", () => { + useIgnitionProject("minimal"); + + it("should deploy on the first HH account by default", async function () { + const [defaultAccount] = await this.hre.viem.getWalletClients(); + const defaultAccountAddress = defaultAccount.account.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: undefined, + }); + + assert.equal( + (await result.ownerSender.read.owner()).toLowerCase(), + defaultAccountAddress.toLowerCase() + ); + }); + + it("should allow changing the default sender that the ignition deployment runs against", async function () { + const [, notTheDefaultAccount] = await this.hre.viem.getWalletClients(); + const differentAccountAddress = notTheDefaultAccount.account.address; + + const moduleDefinition = buildModule("Module", (m) => { + const ownerSender = m.contract("OwnerSender"); + + return { ownerSender }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + defaultSender: differentAccountAddress, + }); + + assert.equal( + (await result.ownerSender.read.owner()).toLowerCase(), + differentAccountAddress.toLowerCase() + ); + }); +}); diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol index 358060a78b..84cd328238 100644 --- a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol @@ -28,3 +28,11 @@ contract Foo { contract Bar { bool public isBar = true; } + +contract OwnerSender { + address public owner; + + constructor() { + owner = msg.sender; + } +} From cda273abde47abf981567c3ff6bc817020382f70 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 10 Dec 2023 22:25:39 -0500 Subject: [PATCH 1122/1302] allow overriding default sender from cli --- packages/hardhat-plugin/src/index.ts | 7 +++++++ .../test/deploy/default-sender.ts | 21 +++++++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 packages/hardhat-plugin/test/deploy/default-sender.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 6788baf98c..50bd820ceb 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -71,6 +71,10 @@ ignitionScope "A relative path to a JSON file to use for the module parameters" ) .addOptionalParam("deploymentId", "Set the id of the deployment") + .addOptionalParam( + "defaultSender", + "Set the default sender for the deployment" + ) .addFlag("verify", "Verify the deployment on Etherscan") .setDescription("Deploy a module to the specified network") .setAction( @@ -79,11 +83,13 @@ ignitionScope modulePath, parameters: parametersInput, deploymentId: givenDeploymentId, + defaultSender, verify, }: { modulePath: string; parameters?: string; deploymentId: string | undefined; + defaultSender: string | undefined; verify: boolean; }, hre @@ -177,6 +183,7 @@ ignitionScope ignitionModule: userModule, deploymentParameters: parameters ?? {}, accounts, + defaultSender, }); if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { diff --git a/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-plugin/test/deploy/default-sender.ts new file mode 100644 index 0000000000..e7c81bd08a --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/default-sender.ts @@ -0,0 +1,21 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("default sender", function () { + useEphemeralIgnitionProject("minimal"); + + it("should allow setting default sender via cli", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "ignition/modules/MyModule.js", + defaultSender: "0xtest", + } + ), + /IGN700: Default sender 0xtest is not part of the configured accounts./ + ); + }); +}); From e4f273528b7ca279c82ac2b41769227832cdb35f Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 11 Dec 2023 21:18:04 +0000 Subject: [PATCH 1123/1302] test: add a positive test on default sender Test that changing the default sender leads to a contract being deployed with a different msg.sender. Set it to skipped for the moment until the clearLine fix is in place. --- packages/core/src/deploy.ts | 2 +- .../test/deploy/default-sender.ts | 34 ++++++++++++++++--- .../minimal/contracts/Ownable.sol | 10 ++++++ .../minimal/ignition/modules/OwnModule.js | 8 +++++ 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index e2d38c0d53..82caf6b178 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -138,7 +138,7 @@ function _resolveDefaultSender( if (!isDefaultSenderInAccounts) { throw new IgnitionError(ERRORS.VALIDATION.INVALID_DEFAULT_SENDER, { - givenDefaultSender, + defaultSender: givenDefaultSender, }); } diff --git a/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-plugin/test/deploy/default-sender.ts index e7c81bd08a..b623afb3c1 100644 --- a/packages/hardhat-plugin/test/deploy/default-sender.ts +++ b/packages/hardhat-plugin/test/deploy/default-sender.ts @@ -1,4 +1,5 @@ /* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; @@ -6,16 +7,41 @@ import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-projec describe("default sender", function () { useEphemeralIgnitionProject("minimal"); - it("should allow setting default sender via cli", async function () { + it("should throw if default sender is not in configured accounts", async function () { await assert.isRejected( this.hre.run( { scope: "ignition", task: "deploy" }, { - modulePath: "ignition/modules/MyModule.js", - defaultSender: "0xtest", + modulePath: "ignition/modules/OwnModule.js", + defaultSender: "0x1234567890abcdef1234567890abcdef12345678", } ), - /IGN700: Default sender 0xtest is not part of the configured accounts./ + /IGN700: Default sender 0x1234567890abcdef1234567890abcdef12345678 is not part of the configured accounts./ ); }); + + it.skip("should allow setting default sender via cli", async function () { + const secondAccountAddress = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "ignition/modules/OwnModule.js", + defaultSender: secondAccountAddress, + } + ); + + const existingModule = buildModule("ExistingModule", (m) => { + const bar = m.contractAt( + "Ownable", + "0x8464135c8F25Da09e49BC8782676a84730C318bC" + ); + + return { bar }; + }); + + const result = await this.hre.ignition.deploy(existingModule); + + assert.equal(await result.bar.read.owner(), secondAccountAddress); + }); }); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol new file mode 100644 index 0000000000..7c4c829625 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Ownable { + address public owner; + + constructor() { + owner = msg.sender; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js new file mode 100644 index 0000000000..b124b9d11f --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("OwnModule", (m) => { + const ownable = m.contract("Ownable"); + + return { ownable }; +}); From 2694593b12a97de915215351e3fc2a607b4d4dc1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 12 Dec 2023 13:24:56 +0000 Subject: [PATCH 1124/1302] chore: bump version to v0.13.0 Update the packages versions and changelogs for the `0.13.0 - 2023-12-13` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/viem-sample/package.json | 4 +- package-lock.json | 44 ++++++++++----------- packages/core/CHANGELOG.md | 10 +++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 7 ++++ packages/hardhat-plugin-ethers/package.json | 6 +-- packages/hardhat-plugin-viem/CHANGELOG.md | 7 ++++ packages/hardhat-plugin-viem/package.json | 6 +-- packages/hardhat-plugin/CHANGELOG.md | 11 ++++++ packages/hardhat-plugin/package.json | 6 +-- packages/ui/package.json | 4 +- 15 files changed, 79 insertions(+), 44 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 3498bd2c97..2224e77351 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.12.0", + "version": "0.13.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 9b51c618a0..ead3736db5 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.12.0", + "version": "0.13.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 995ef6d74d..a278956443 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.12.0", + "version": "0.13.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index f5d55172a6..a884d67804 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.12.0", + "version": "0.13.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 3659857750..566b1fd9a8 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.12.0", + "version": "0.13.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.12.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 457fd23d48..72206ac7a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.12.0", + "version": "0.13.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -66,12 +66,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.12.0", + "version": "0.13.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -79,9 +79,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.12.0", + "version": "0.13.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -89,9 +89,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.12.0", + "version": "0.13.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -99,9 +99,9 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.12.0", + "version": "0.13.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.12.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -19860,7 +19860,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -19912,11 +19912,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.12.0", - "@nomicfoundation/ignition-ui": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-ui": "^0.13.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -19937,7 +19937,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -19947,15 +19947,15 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.12.0", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/hardhat-ignition": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^1.0.0", @@ -19964,9 +19964,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition": "^0.13.0", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", "hardhat": "^2.18.0", "viem": "^1.18.1" } @@ -20005,10 +20005,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.12.0", + "version": "0.13.0", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index daff5c42e8..f3442147f3 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.0 - 2023-12-13 + +### Added + +- Enhance types around artifacts and ABIs to better support `Viem` type inference ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) + +### Fixed + +- Fix bug with default sender account not being recognised due to case sensitivity ([#640](https://github.com/NomicFoundation/hardhat-ignition/pull/640)) + ## 0.12.0 - 2023-12-05 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 2bc435d9f6..0a3d80442f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 41ae03a279..cd826eadee 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -3,3 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## 0.13.0 - 2023-12-13 + +### Added + +- Add `@nomicfoundation/hardhat-plugin-ethers` package, that adds an `ignition` object to the Hardhat Runtime Environment that supports deploying Ignition modules and returning deployed contracts as [Ethers](https://docs.ethers.org) contract instances ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) +- Add support for setting the default sender account from tests and scripts ([#639](https://github.com/NomicFoundation/hardhat-ignition/issues/639)) diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 27ac0460af..b230a810bf 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -47,8 +47,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.12.0", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/hardhat-ignition": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 41ae03a279..05c64b2686 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -3,3 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). + +## 0.13.0 - 2023-12-13 + +### Added + +- Add `@nomicfoundation/hardhat-plugin-viem` package, that adds an `ignition` object to the Hardhat Runtime Environment that supports deploying Ignition modules and returning deployed contracts as [Viem](https://viem.sh/) contract instances, see the our [Viem guide](https://hardhat.org/ignition/docs/guides/viem) for more details ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) +- Add support for setting the default sender account from tests and scripts ([#639](https://github.com/NomicFoundation/hardhat-ignition/issues/639)) diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index ac3cfcf220..c2773e980e 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -47,9 +47,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.12.0", + "@nomicfoundation/hardhat-ignition": "^0.13.0", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", "hardhat": "^2.18.0", "viem": "^1.18.1" } diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 0f9cac9b6a..4996c9b4db 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.0 - 2023-12-13 + +### Added + +- Add support for setting the default sender account from tests and scripts ([#639](https://github.com/NomicFoundation/hardhat-ignition/issues/639)) +- Add support for setting the default sender from the cli ([#620](https://github.com/NomicFoundation/hardhat-ignition/issues/620)) + +### Changed + +- Split out `ethers` support from `@nomicfoundation/hardhat-plugin`, to allow opting for either **ethers** or **Viem** in tests and scripts. If you were using `hre.ignition.deploy(...)` in tests or scripts you will need to install, and require in your Hardhat config, the `@nomicfoundation/hardhat-plugin-ethers` package. For more details on our [Viem support see our guide](https://hardhat.org/ignition/docs/guides/viem). ([#612](https://github.com/NomicFoundation/hardhat-ignition/pull/612)) + ## 0.12.0 - 2023-12-05 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 1700ef90eb..84d8c13bc4 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.12.0", + "version": "0.13.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -66,8 +66,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.12.0", - "@nomicfoundation/ignition-ui": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-ui": "^0.13.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 5d293e8b5c..2d95366e0c 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.12.0", + "version": "0.13.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.12.0", + "@nomicfoundation/ignition-core": "^0.13.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From fed5503d5e80b093d61607a29d1e95262fd4b1c2 Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 18 Dec 2023 01:07:17 -0500 Subject: [PATCH 1125/1302] Use readline in place of process.stdout (#654) * use readline in place of process.stdout * add test for CI deployment * remove redundant CI task * test: bring back skipped test Bring back the default sender test that previously failed due to tty issues. * test: update test text --------- Co-authored-by: John Kane --- .github/workflows/ci.yml | 9 ----- .../ci-success/contracts/Lock.sol | 34 +++++++++++++++++++ .../ci-success/hardhat.config.js | 14 ++++++++ .../ci-success/ignition/modules/LockModule.js | 18 ++++++++++ .../new-api/ci/basic-success.ts | 23 +++++++++++++ .../src/ui/pretty-event-handler.ts | 9 ++--- .../test/deploy/default-sender.ts | 2 +- 7 files changed, 95 insertions(+), 14 deletions(-) create mode 100644 packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol create mode 100644 packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js create mode 100644 packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js create mode 100644 packages/core/test-integrations/new-api/ci/basic-success.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ab5d8db55f..760e09edc6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,9 +23,6 @@ jobs: run: npm run build - name: Run tests run: npm run test - - name: Run integration tests - working-directory: packages/core - run: npm run test:integrations - name: Run tests in examples run: npm run test:examples @@ -44,9 +41,6 @@ jobs: run: npm run build - name: Run tests run: npm run test - - name: Run integration tests - working-directory: packages/core - run: npm run test:integrations - name: Run tests in examples run: npm run test:examples @@ -68,9 +62,6 @@ jobs: run: npm run build - name: Run tests run: npm run test - - name: Run integration tests - working-directory: packages/core - run: npm run test:integrations - name: Run tests in examples run: npm run test:examples diff --git a/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol b/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol new file mode 100644 index 0000000000..9e0e189d9e --- /dev/null +++ b/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol @@ -0,0 +1,34 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js b/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js new file mode 100644 index 0000000000..c76e2c9b8d --- /dev/null +++ b/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js @@ -0,0 +1,14 @@ +require("@nomicfoundation/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: { + version: "0.8.19", + settings: { + metadata: { + // We disable the metadata to keep the fixtures more stables + appendCBOR: false, + }, + }, + }, +}; diff --git a/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js b/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js new file mode 100644 index 0000000000..fca85a0ced --- /dev/null +++ b/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js @@ -0,0 +1,18 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +const currentTimestampInSeconds = Math.round(new Date(2023, 0, 1) / 1000); +const TEN_YEAR_IN_SECS = 10 * 365 * 24 * 60 * 60; +const TEN_YEARS_IN_FUTURE = currentTimestampInSeconds + TEN_YEAR_IN_SECS; + +const ONE_GWEI = 1_000_000_000n; + +module.exports = buildModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime", TEN_YEARS_IN_FUTURE); + const lockedAmount = m.getParameter("lockedAmount", ONE_GWEI); + + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); + + return { lock }; +}); diff --git a/packages/core/test-integrations/new-api/ci/basic-success.ts b/packages/core/test-integrations/new-api/ci/basic-success.ts new file mode 100644 index 0000000000..245fb2a522 --- /dev/null +++ b/packages/core/test-integrations/new-api/ci/basic-success.ts @@ -0,0 +1,23 @@ +import { assert } from "chai"; + +import { useHardhatProject } from "../../helpers/hardhat-projects"; + +// This test exists to ensure Ignition succeeds in a CI environment. +// This is a test that the UI, runs even in constrained terminal environments. +// It should always pass locally. +describe("Running deployment in CI environment", function () { + this.timeout(60000); + + useHardhatProject("ci-success"); + + it("should succeed with UI in a CI environment", async function () { + await assert.isFulfilled( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/LockModule.js", + } + ) + ); + }); +}); diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 6def3977b1..f3f98ffea7 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -33,6 +33,7 @@ import { TransactionSendEvent, WipeApplyEvent, } from "@nomicfoundation/ignition-core"; +import readline from "readline"; import { calculateBatchDisplay } from "./helpers/calculate-batch-display"; import { calculateDeployingModulePanel } from "./helpers/calculate-deploying-module-panel"; @@ -452,12 +453,12 @@ export class PrettyEventHandler implements ExecutionEventListener { } private _clearCurrentLine(): void { - process.stdout.clearLine(0); - process.stdout.cursorTo(0); + readline.clearLine(process.stdout, 0); + readline.cursorTo(process.stdout, 0); } private _clearUpToHeight(height: number) { - process.stdout.moveCursor(0, -height); - process.stdout.clearScreenDown(); + readline.moveCursor(process.stdout, 0, -height); + readline.clearScreenDown(process.stdout); } } diff --git a/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-plugin/test/deploy/default-sender.ts index b623afb3c1..6247eb7e71 100644 --- a/packages/hardhat-plugin/test/deploy/default-sender.ts +++ b/packages/hardhat-plugin/test/deploy/default-sender.ts @@ -20,7 +20,7 @@ describe("default sender", function () { ); }); - it.skip("should allow setting default sender via cli", async function () { + it("should allow setting default sender via cli", async function () { const secondAccountAddress = "0x70997970C51812dc3A010C7d01b50e0d17dc79C8"; await this.hre.run( From 2e89f35b6d6afbef98c79ee4cc7123b538b187ed Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 18 Dec 2023 09:03:54 -0500 Subject: [PATCH 1126/1302] Add --reset flag to deploy task (#651) Add `--reset` flag that will clear the deployment state, allowing for a completely fresh rerun. If reset is being done against a local hardhat node, it will be run immediately. If reset is being done against a real network, a confirmation prompt is shown. --- .../scripts/compile-test-fixture-projects.ts | 4 -- packages/hardhat-plugin/src/index.ts | 45 +++++++++++++++---- packages/hardhat-plugin/test/deploy/reset.ts | 40 +++++++++++++++++ .../reset-flag/contracts/Contracts.sol | 20 +++++++++ .../reset-flag/hardhat.config.js | 14 ++++++ .../reset-flag/ignition/modules/FirstPass.js | 9 ++++ .../reset-flag/ignition/modules/SecondPass.js | 14 ++++++ .../fixture-projects/reset-flag/journal.jsonl | 7 +++ .../test/test-helpers/use-ignition-project.ts | 5 ++- 9 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 packages/hardhat-plugin/test/deploy/reset.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl diff --git a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts index 8f343043a9..09132287d1 100644 --- a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts +++ b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts @@ -18,10 +18,6 @@ const main = async () => { fixtureProjectName ); - if (fs.existsSync(path.join(fixtureProjectDir, "./artifacts"))) { - return; - } - process.chdir(fixtureProjectDir); const hre = require("hardhat"); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 50bd820ceb..dfdb3b3864 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -5,7 +5,7 @@ import { IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; -import { readdirSync } from "fs-extra"; +import { readdirSync, rm } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { HardhatPluginError, @@ -75,6 +75,7 @@ ignitionScope "defaultSender", "Set the default sender for the deployment" ) + .addFlag("reset", "Wipes the existing deployment state before deploying") .addFlag("verify", "Verify the deployment on Etherscan") .setDescription("Deploy a module to the specified network") .setAction( @@ -84,12 +85,14 @@ ignitionScope parameters: parametersInput, deploymentId: givenDeploymentId, defaultSender, + reset, verify, }: { modulePath: string; parameters?: string; deploymentId: string | undefined; defaultSender: string | undefined; + reset: boolean; verify: boolean; }, hre @@ -123,6 +126,13 @@ ignitionScope }) ); + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); + + const deploymentDir = + hre.network.name === "hardhat" + ? undefined + : path.join(hre.config.paths.ignition, "deployments", deploymentId); + if (chainId !== 31337) { const prompt = await Prompt({ type: "confirm", @@ -135,6 +145,32 @@ ignitionScope console.log("Deploy cancelled"); return; } + + if (reset) { + const resetPrompt = await Prompt({ + type: "confirm", + name: "resetConfirmation", + message: `Confirm reset of deployment "${deploymentId}" on chain ${chainId}?`, + initial: false, + }); + + if (resetPrompt.resetConfirmation !== true) { + console.log("Deploy cancelled"); + return; + } + } + } + + if (reset) { + if (deploymentDir === undefined) { + console.warn( + "Deploy cancelled: Cannot reset deployment on ephemeral Hardhat network" + ); + + process.exit(0); + } else { + await rm(deploymentDir, { recursive: true, force: true }); + } } await hre.run("compile", { quiet: true }); @@ -162,13 +198,6 @@ ignitionScope method: "eth_accounts", })) as string[]; - const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); - - const deploymentDir = - hre.network.name === "hardhat" - ? undefined - : path.join(hre.config.paths.ignition, "deployments", deploymentId); - const artifactResolver = new HardhatArtifactResolver(hre); const executionEventListener = new PrettyEventHandler(); diff --git a/packages/hardhat-plugin/test/deploy/reset.ts b/packages/hardhat-plugin/test/deploy/reset.ts new file mode 100644 index 0000000000..b7155c1294 --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/reset.ts @@ -0,0 +1,40 @@ +import { status } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useFileIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("reset flag", function () { + useFileIgnitionProject("reset-flag", "custom-reset-id"); + + it("should reset a deployment", async function () { + this.hre.network.name = "something-else"; + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/FirstPass.js", + deploymentId: "custom-reset-id", + reset: true, + } + ); + + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/SecondPass.js", + deploymentId: "custom-reset-id", + reset: true, + } + ); + + const result = await status(this.deploymentDir!); + + // ResetModule#B will only be in the success list if the second + // run ran without any reconciliation errors - so the retry + // cleared the first pass + assert( + result.successful.includes("ResetModule#B"), + "Retry did not clear first pass, so second pass failed" + ); + }); +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol new file mode 100644 index 0000000000..c821b2d0d9 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +contract Foo { + function isFoo() public pure returns (bool) { + return true; + } +} + +contract Bar { + function isBar() public pure returns (bool) { + return true; + } +} + +contract Baz { + function isBaz() public pure returns (bool) { + return true; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js new file mode 100644 index 0000000000..c76e2c9b8d --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js @@ -0,0 +1,14 @@ +require("@nomicfoundation/hardhat-ignition"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: { + version: "0.8.19", + settings: { + metadata: { + // We disable the metadata to keep the fixtures more stables + appendCBOR: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js b/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js new file mode 100644 index 0000000000..e69d05696f --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js @@ -0,0 +1,9 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("ResetModule", (m) => { + const a = m.contract("Foo", [], { + id: "A", + }); + + return { a }; +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js b/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js new file mode 100644 index 0000000000..fdf765ce38 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js @@ -0,0 +1,14 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("ResetModule", (m) => { + // Same id as first pass but a different contract + const a = m.contract("Bar", [], { + id: "A", + }); + + const b = m.contract("Baz", [], { + id: "B", + }); + + return { a, b }; +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl b/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl new file mode 100644 index 0000000000..9598589a9b --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl @@ -0,0 +1,7 @@ + +{"chainId":31337,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#resetFutureId","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#resetFutureId","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#resetFutureId","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#resetFutureId","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2750000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x1a3eb512e21fc849f8e8733b250ce49b61178c9c4a670063f969db59eda4a59f"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#resetFutureId","hash":"0x1a3eb512e21fc849f8e8733b250ce49b61178c9c4a670063f969db59eda4a59f","networkInteractionId":1,"receipt":{"blockHash":"0xd742dbff894385ce6cbe737508ce91c181d0b65c7faaa5a7078fde68070c16e5","blockNumber":2,"contractAddress":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#resetFutureId","result":{"address":"0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts index d5cf7397e3..6a77dc0da0 100644 --- a/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts @@ -62,7 +62,10 @@ export function useFileIgnitionProject( const hre = require("hardhat"); const deploymentDir = path.join( - path.resolve(__dirname, "../fixture-projects/minimal/"), + path.resolve( + __dirname, + `../fixture-projects/${fixtureProjectName}/ignition` + ), "deployments", deploymentId ); From 2cb8659a38e3eaf622e60676ec90b047fa82d633 Mon Sep 17 00:00:00 2001 From: Marian F <153533002+marianfe-n@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:42:51 +0100 Subject: [PATCH 1127/1302] repository: add devcontainer support. (#657) * repo infrastructure: add devcontainer support. Adding .devcontainer support for the repository. Tested by creating a new named container in vscode based off of this branch, and verifying: npm install npm run build npm run test * chore: fix linting for readme --------- Co-authored-by: John Kane --- .devcontainer/devcontainer.json | 11 +++++++++++ packages/hardhat-plugin/README.md | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000000..5e4e7c36d2 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,11 @@ +{ + "name": "Hardhat Ignition", + "image": "mcr.microsoft.com/devcontainers/base:bullseye", + "features": { + "ghcr.io/devcontainers/features/node:1": { + "version": "18" /* Keep in sync with the oldest version of Node.js that Hardhat supports */ + }, + }, + /* installs npm dependencies on the new container. */ + "postCreateCommand": "npm install" +} \ No newline at end of file diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-plugin/README.md index 7fedcbd65c..8c405ab605 100644 --- a/packages/hardhat-plugin/README.md +++ b/packages/hardhat-plugin/README.md @@ -1,5 +1,5 @@ ![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) -[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) +[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/NomicFoundation/hardhat-ignition.git) --- From 8569b649d811326fc4a202175a132d1486134928 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Dec 2023 00:42:36 -0500 Subject: [PATCH 1128/1302] chore: bump version to v0.13.1 Update the packages versions and changelogs for the `0.13.1 - 2023-12-19` release. --- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/viem-sample/package.json | 4 ++-- package-lock.json | 20 ++++++++++---------- packages/core/CHANGELOG.md | 11 +++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 11 +++++++++++ packages/hardhat-plugin-ethers/package.json | 6 +++--- packages/hardhat-plugin-viem/CHANGELOG.md | 11 +++++++++++ packages/hardhat-plugin-viem/package.json | 6 +++--- packages/hardhat-plugin/CHANGELOG.md | 11 +++++++++++ packages/hardhat-plugin/package.json | 6 +++--- packages/ui/package.json | 4 ++-- 15 files changed, 76 insertions(+), 32 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 2224e77351..da4c714431 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.13.0", + "version": "0.13.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index ead3736db5..7f4e1296c5 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.13.0", + "version": "0.13.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index a278956443..3c630a0d80 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.13.0", + "version": "0.13.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index a884d67804..23cacccb10 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.13.0", + "version": "0.13.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 566b1fd9a8..5a88d0e259 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.13.0", + "version": "0.13.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.1", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 72206ac7a3..e0e0528546 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,7 +56,7 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.13.0", + "version": "0.13.1", "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", @@ -66,7 +66,7 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.13.0", + "version": "0.13.1", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, @@ -79,7 +79,7 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.13.0", + "version": "0.13.1", "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", @@ -89,7 +89,7 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.13.0", + "version": "0.13.1", "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", @@ -99,7 +99,7 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.13.0", + "version": "0.13.1", "devDependencies": { "@nomicfoundation/hardhat-ignition-viem": "^0.13.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", @@ -19860,7 +19860,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -19912,7 +19912,7 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "dependencies": { "@nomicfoundation/ignition-core": "^0.13.0", @@ -19937,7 +19937,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -19955,7 +19955,7 @@ }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^1.0.0", @@ -20005,7 +20005,7 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.0", + "version": "0.13.1", "devDependencies": { "@fontsource/roboto": "^5.0.8", "@nomicfoundation/ignition-core": "^0.13.0", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index f3442147f3..42210cba9c 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.1 - 2023-12-19 + +### Added + +- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) + ## 0.13.0 - 2023-12-13 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 0a3d80442f..666c5b9649 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index cd826eadee..d5faa91942 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.1 - 2023-12-19 + +### Added + +- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) + ## 0.13.0 - 2023-12-13 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index b230a810bf..c5a2fa051f 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -47,8 +47,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.0", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/hardhat-ignition": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.1", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 05c64b2686..21a403273b 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.1 - 2023-12-19 + +### Added + +- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) + ## 0.13.0 - 2023-12-13 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index c2773e980e..240a827063 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -47,9 +47,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.0", + "@nomicfoundation/hardhat-ignition": "^0.13.1", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", "hardhat": "^2.18.0", "viem": "^1.18.1" } diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 4996c9b4db..4606b5636e 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.1 - 2023-12-19 + +### Added + +- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) + +### Fixed + +- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) + ## 0.13.0 - 2023-12-13 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 84d8c13bc4..10c7d46ad6 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.0", + "version": "0.13.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -66,8 +66,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.0", - "@nomicfoundation/ignition-ui": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-ui": "^0.13.1", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 2d95366e0c..68865c21c8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.0", + "version": "0.13.1", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -16,7 +16,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From a8c2900b98eb86c59eeb3cd734f9983556ad4c57 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 19 Dec 2023 09:52:30 +0000 Subject: [PATCH 1129/1302] chore: update changelog text Some small tweaks to the changelog text. --- CONTRIBUTING.md | 2 +- package-lock.json | 24 ++++++++++----------- packages/core/CHANGELOG.md | 5 ----- packages/hardhat-plugin-ethers/CHANGELOG.md | 5 ++--- packages/hardhat-plugin-viem/CHANGELOG.md | 5 ++--- packages/hardhat-plugin/CHANGELOG.md | 5 ++--- 6 files changed, 19 insertions(+), 27 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4fd4144cbc..1fdefcb893 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -100,7 +100,7 @@ yyyy-mm-dd` release. 15. On a successful check, `rebase merge` the release branch into `main` 16. Switch to main branch and pull the latest changes 17. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -18. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-viem` +18. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-ethers -w @nomicfoundation/hardhat-ignition-viem` 19. Create a release on github off of the pushed tag ## Manual testing diff --git a/package-lock.json b/package-lock.json index e0e0528546..42a115afc5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "name": "@nomicfoundation/ignition-complete-example", "version": "0.13.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -71,7 +71,7 @@ "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -81,7 +81,7 @@ "name": "@nomicfoundation/ignition-sample-example", "version": "0.13.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -91,7 +91,7 @@ "name": "@nomicfoundation/ignition-ts-sample-example", "version": "0.13.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -101,7 +101,7 @@ "name": "@nomicfoundation/ignition-viem-sample-example", "version": "0.13.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.1", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -19915,8 +19915,8 @@ "version": "0.13.1", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.0", - "@nomicfoundation/ignition-ui": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-ui": "^0.13.1", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -19947,8 +19947,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.0", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/hardhat-ignition": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.1", "ethers": "^6.7.0", "hardhat": "^2.18.0" } @@ -19964,9 +19964,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.0", + "@nomicfoundation/hardhat-ignition": "^0.13.1", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", "hardhat": "^2.18.0", "viem": "^1.18.1" } @@ -20008,7 +20008,7 @@ "version": "0.13.1", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.0", + "@nomicfoundation/ignition-core": "^0.13.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 42210cba9c..2ddc2a9dd0 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -6,11 +6,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 0.13.1 - 2023-12-19 -### Added - -- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) -- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) - ### Fixed - Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index d5faa91942..755bc87673 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -8,12 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added -- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) -- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#649](https://github.com/NomicFoundation/hardhat-ignition/issues/649)) ### Fixed -- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) +- Fix bug with `process.stdout` being used in a non-tty context ([#644](https://github.com/NomicFoundation/hardhat-ignition/issues/644)) ## 0.13.0 - 2023-12-13 diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 21a403273b..d7aeb5cb75 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -8,12 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added -- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) -- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#649](https://github.com/NomicFoundation/hardhat-ignition/issues/649)) ### Fixed -- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) +- Fix bug with `process.stdout` being used in a non-tty context ([#644](https://github.com/NomicFoundation/hardhat-ignition/issues/644)) ## 0.13.0 - 2023-12-13 diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 4606b5636e..46a6e36584 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -8,12 +8,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ### Added -- Repo now supports .devcontainer for VSCode ([#657](https://github.com/NomicFoundation/hardhat-ignition/pull/657)) -- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#651](https://github.com/NomicFoundation/hardhat-ignition/pull/651)) +- New flag `--reset` for `ignition deploy` to wipe the existing deployment state before running ([#649](https://github.com/NomicFoundation/hardhat-ignition/issues/649)) ### Fixed -- Fix bug with `process.stdout` being used in a non-tty context ([#654](https://github.com/NomicFoundation/hardhat-ignition/pull/654)) +- Fix bug with `process.stdout` being used in a non-tty context ([#644](https://github.com/NomicFoundation/hardhat-ignition/issues/644)) ## 0.13.0 - 2023-12-13 From c7c0de2d2706b3eab272925af88ba78d585b4401 Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 8 Jan 2024 08:56:53 -0500 Subject: [PATCH 1130/1302] Add sections regarding branching and merge flow to contributing doc (#660) --- CONTRIBUTING.md | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1fdefcb893..b24586e00d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,7 +4,7 @@ This document contains some tips on how to collaborate in this project. ## Filing an issue -If you find a bug or want to propose a new feature, please open an issue. Pull requests are welcome, but we recommend you discuss it in an issue first, especially for big changes. This will increase the odds that we can accept your PR. +If you find a bug or want to propose a new feature, please [open an issue](https://github.com/nomicfoundation/hardhat-ignition/issues/new). Pull requests are welcome, but we recommend you discuss it in an issue first, especially for big changes. This will increase the odds that we can accept your PR. ## Project Structure @@ -60,12 +60,26 @@ npm run lint ## Clean -If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from clean: +If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from a clean slate: ```shell npm run clean ``` +## Branching + +We work on two branches, [main](https://github.com/nomicfoundation/hardhat-ignition/tree/main) and [development](https://github.com/nomicfoundation/hardhat-ignition/tree/development). + +The development branch is the default branch. It's where we merge all pull requests and is the branch that all contributing PRs should be based on. + +The main branch is meant to be kept in sync with the latest released version of each package. It's where we publish new releases from, and should only be merged into when a new release is being made. + +### Documentation + +Ignition's documentation lives inside the [main Hardhat repo](https://github.com/nomicfoundation/hardhat/tree/main). If your change requires a documentation change, please submit a separate PR to the Hardhat repo, following their contributing guidelines, and link to it from your PR. + +If you are working purely on the documentation, not as a result of a technical change, you should submit a PR to the Hardhat repo directly. + ## Publish To publish ignition: From 21fc7b8ffde6b26dc578735f5f331b1c7b98478d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 5 Jan 2024 01:38:29 -0500 Subject: [PATCH 1131/1302] fix: retry checking mempool to deal with propagation In Infura and Alchemy we sometimes see transaction check errors due to submitted transactions not propagating through the all the services nodes before the subsequent checks. This fix adds a retry for the subsequent checks. The retry operates over 10s. Fixes #665, #633. --- .../handlers/monitor-onchain-interaction.ts | 74 ++++++- .../helpers/network-interaction-execution.ts | 189 +++++++++++++++++- 2 files changed, 253 insertions(+), 10 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts index 2f9638ae30..0ab19dfb2f 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts @@ -1,3 +1,5 @@ +import setupDebug from "debug"; + import { IgnitionError } from "../../../../errors"; import { ERRORS } from "../../../../errors-list"; import { assertIgnitionInvariant } from "../../../utils/assertions"; @@ -8,13 +10,24 @@ import { DeploymentExecutionState, SendDataExecutionState, } from "../../types/execution-state"; +import { Transaction } from "../../types/jsonrpc"; import { JournalMessageType, OnchainInteractionBumpFeesMessage, OnchainInteractionTimeoutMessage, TransactionConfirmMessage, } from "../../types/messages"; -import { NetworkInteractionType } from "../../types/network-interaction"; +import { + NetworkInteractionType, + OnchainInteraction, +} from "../../types/network-interaction"; + +const debug = setupDebug("hardhat-ignition:onchain-interaction-monitor"); + +export interface GetTransactionRetryConfig { + maxRetries: number; + retryInterval: number; +} /** * Checks the transactions of the latest network interaction of the execution state, @@ -51,7 +64,11 @@ export async function monitorOnchainInteraction( transactionTrackingTimer: TransactionTrackingTimer, requiredConfirmations: number, millisecondBeforeBumpingFees: number, - maxFeeBumps: number + maxFeeBumps: number, + getTransactionRetryConfig: GetTransactionRetryConfig = { + maxRetries: 10, + retryInterval: 1000, + } ): Promise< | TransactionConfirmMessage | OnchainInteractionBumpFeesMessage @@ -75,14 +92,13 @@ export async function monitorOnchainInteraction( `No transaction found in OnchainInteraction ${exState.id}/${lastNetworkInteraction.id} when trying to check its transactions` ); - const transactions = await Promise.all( - lastNetworkInteraction.transactions.map((tx) => - jsonRpcClient.getTransaction(tx.hash) - ) + const transaction = await _getTransactionWithRetry( + jsonRpcClient, + lastNetworkInteraction, + getTransactionRetryConfig, + exState.id ); - const transaction = transactions.find((tx) => tx !== undefined); - // We do not try to recover from dopped transactions mid-execution if (transaction === undefined) { throw new IgnitionError(ERRORS.EXECUTION.DROPPED_TRANSACTION, { @@ -141,3 +157,45 @@ export async function monitorOnchainInteraction( networkInteractionId: lastNetworkInteraction.id, }; } + +async function _getTransactionWithRetry( + jsonRpcClient: JsonRpcClient, + onchainInteraction: OnchainInteraction, + retryConfig: GetTransactionRetryConfig, + futureId: string +): Promise { + let transaction: Transaction | undefined; + + // Small retry loop for up to X seconds to handle blockchain nodes + // that are slow to propagate transactions. + // See https://github.com/NomicFoundation/hardhat-ignition/issues/665 + for (let i = 0; i < retryConfig.maxRetries; i++) { + debug( + `Retrieving transaction for interaction ${futureId}/${ + onchainInteraction.id + } from mempool (attempt ${i + 1}/${retryConfig.maxRetries})` + ); + + const transactions = await Promise.all( + onchainInteraction.transactions.map((tx) => + jsonRpcClient.getTransaction(tx.hash) + ) + ); + + transaction = transactions.find((tx) => tx !== undefined); + + if (transaction !== undefined) { + break; + } + + debug( + `Transaction lookup for ${futureId}/${onchainInteraction.id} not found in mempool, waiting ${retryConfig.retryInterval} seconds before retrying` + ); + + await new Promise((resolve) => + setTimeout(resolve, retryConfig.retryInterval) + ); + } + + return transaction; +} diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 20524cc266..6c80ac2e9e 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -1,23 +1,37 @@ import { assert } from "chai"; +import { + GetTransactionRetryConfig, + monitorOnchainInteraction, +} from "../../../../src/internal/execution/future-processor/handlers/monitor-onchain-interaction"; import { runStaticCall } from "../../../../src/internal/execution/future-processor/helpers/network-interaction-execution"; import { - JsonRpcClient, + Block, CallParams, EstimateGasParams, + JsonRpcClient, TransactionParams, - Block, } from "../../../../src/internal/execution/jsonrpc-client"; +import { TransactionTrackingTimer } from "../../../../src/internal/execution/transaction-tracking-timer"; +import { + DeploymentExecutionState, + ExecutionSateType, + ExecutionStatus, +} from "../../../../src/internal/execution/types/execution-state"; import { NetworkFees, RawStaticCallResult, Transaction, TransactionReceipt, + TransactionReceiptStatus, } from "../../../../src/internal/execution/types/jsonrpc"; +import { JournalMessageType } from "../../../../src/internal/execution/types/messages"; import { NetworkInteractionType, StaticCall, } from "../../../../src/internal/execution/types/network-interaction"; +import { FutureType } from "../../../../src/types/module"; +import { exampleAccounts } from "../../../helpers"; class StubJsonRpcClient implements JsonRpcClient { public async getChainId(): Promise { @@ -31,6 +45,7 @@ class StubJsonRpcClient implements JsonRpcClient { public async getLatestBlock(): Promise { throw new Error("Mock not implemented."); } + public async getBalance( _address: string, _blockTag: "latest" | "pending" @@ -122,6 +137,133 @@ describe("Network interactions", () => { }); }); + describe("monitorOnchainInteraction", () => { + const requiredConfirmations = 1; + const millisecondBeforeBumpingFees = 1; + const maxFeeBumps = 1; + + const testGetTransactionRetryConfig: GetTransactionRetryConfig = { + maxRetries: 10, + retryInterval: 1, + }; + + let mockClient: MockGetTransactionJsonRpcClient; + let fakeTransactionTrackingTimer: FakeTransactionTrackingTimer; + + const exampleDeploymentExecutionState: DeploymentExecutionState = { + id: "test", + type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + status: ExecutionStatus.STARTED, + dependencies: new Set(), + artifactId: "./artifact.json", + contractName: "Contract1", + value: 0n, + constructorArgs: [], + libraries: {}, + from: exampleAccounts[0], + networkInteractions: [], + }; + + beforeEach(() => { + mockClient = new MockGetTransactionJsonRpcClient(); + fakeTransactionTrackingTimer = new FakeTransactionTrackingTimer(); + }); + + it("Should succeed even if transaction takes time to propagate to the mempool", async () => { + const deploymentExecutionState: DeploymentExecutionState = { + ...exampleDeploymentExecutionState, + networkInteractions: [ + { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: exampleAccounts[1], + value: 0n, + data: "0x", + shouldBeResent: true, + transactions: [ + { + hash: "0x1234", + fees: { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }, + }, + ], + }, + ], + }; + + mockClient.callToFindResult = 4; + mockClient.result = { + hash: "0x1234", + fees: { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }, + }; + + const message = await monitorOnchainInteraction( + deploymentExecutionState, + mockClient, + fakeTransactionTrackingTimer, + requiredConfirmations, + millisecondBeforeBumpingFees, + maxFeeBumps, + testGetTransactionRetryConfig + ); + + if (message === undefined) { + return assert.fail("No message returned from monitoring"); + } + + assert.isDefined(message); + assert.equal(message.type, JournalMessageType.TRANSACTION_CONFIRM); + assert.equal(message.futureId, deploymentExecutionState.id); + }); + + it("Should error when no transaction in the mempool even after awaiting propagation", async () => { + const deploymentExecutionState: DeploymentExecutionState = { + ...exampleDeploymentExecutionState, + networkInteractions: [ + { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: exampleAccounts[1], + value: 0n, + data: "0x", + shouldBeResent: true, + transactions: [ + { + hash: "0x1234", + fees: { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }, + }, + ], + }, + ], + }; + + await assert.isRejected( + monitorOnchainInteraction( + deploymentExecutionState, + mockClient, + fakeTransactionTrackingTimer, + requiredConfirmations, + millisecondBeforeBumpingFees, + maxFeeBumps, + testGetTransactionRetryConfig + ), + /IGN401: Error while executing test: all the transactions of its network interaction 1 were dropped\. Please try rerunning Hardhat Ignition\./ + ); + + assert.equal(mockClient.calls, 10); + }); + }); + describe("sendTransactionForOnchainInteraction", () => { describe("First transaction", () => { it("Should allocate a nonce for the onchain interaction's sender", async () => { @@ -180,3 +322,46 @@ describe("Network interactions", () => { }); }); }); + +class MockGetTransactionJsonRpcClient extends StubJsonRpcClient { + public calls: number = 0; + public callToFindResult: number = Number.MAX_SAFE_INTEGER; + public result: Omit | undefined = undefined; + + public async getTransaction( + _txHash: string + ): Promise | undefined> { + if (this.calls === this.callToFindResult) { + return this.result; + } + + this.calls += 1; + + return undefined; + } + + public async getLatestBlock(): Promise { + return { + hash: "0xblockhas", + number: 34, + }; + } + + public async getTransactionReceipt( + _txHash: string + ): Promise { + return { + blockHash: "0xblockhash", + blockNumber: 34, + contractAddress: "0xcontractaddress", + logs: [], + status: TransactionReceiptStatus.SUCCESS, + }; + } +} + +class FakeTransactionTrackingTimer extends TransactionTrackingTimer { + public getTransactionTrackingTime(_txHash: string): number { + return 0; + } +} From 44ed175798893883659fdcb992a9f8bdee9a16ff Mon Sep 17 00:00:00 2001 From: Zoey Date: Tue, 16 Jan 2024 05:27:09 -0500 Subject: [PATCH 1132/1302] Add jsdoc comments for all module builder and ignition helper functions (#674) Add doc comments to the public module API to provide better intellisense to users writing modules. Resolves #642 --- .../src/internal/execution/jsonrpc-client.ts | 9 +- .../execution/types/execution-strategy.ts | 2 +- packages/core/src/types/module-builder.ts | 307 +++++++++++++++++- .../src/ethers-ignition-helper.ts | 9 + .../src/viem-ignition-helper.ts | 8 + 5 files changed, 329 insertions(+), 6 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index cecf475730..00b0955a35 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -78,7 +78,8 @@ export interface JsonRpcClient { * Returns the balance of an account. * * @param address The account's address. - * @param blockTag Weather if we should fetch the latest block balance or the pending balance. + * @param blockTag Whether we should fetch the latest block balance or the + * pending balance. */ getBalance: ( address: string, @@ -88,7 +89,8 @@ export interface JsonRpcClient { /** * Performs an `eth_call` JSON-RPC request, and returns the result or an error * object with the return data and a boolean indicating if the request failed - * with an error message that telling that the call failed with a custom error. + * with an error message that telling that the call failed with a custom + * error. * * @param callParams The params for the call. * @param blockTag The block tag to use for the call. @@ -121,7 +123,8 @@ export interface JsonRpcClient { * Returns the transaction count of an account. * * @param address The account's address. - * @param blockTag The block to use for the count. If "pending", the mempool is taken into account. + * @param blockTag The block to use for the count. If "pending", the mempool + * is taken into account. */ getTransactionCount: ( address: string, diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index c00c94702f..d89746313d 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -155,7 +155,7 @@ export type StaticCallStrategyGenerator = AsyncGenerator< * * Execution strategies are also use to resume a partial execution, hence, they must be * prepared to receive the results of their requests immediately. This affects to the - * process of requestsing `OnchainInteraction`s, which differs weather if the request + * process of requestsing `OnchainInteraction`s, which differs whether if the request * has already being resolved or not. See below for more details. * * There are two types of request, which follow a different protocol: diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index 761359cbc1..dee18f613f 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -28,14 +28,33 @@ import { * @beta */ export interface ContractOptions { + /** + * The future id. + */ id?: string; + + /** + * The futures to execute before this one. + */ after?: Future[]; + + /** + * The libraries to link to the contract. + */ libraries?: Record>; + + /** + * The value in wei to send with the transaction. + */ value?: | bigint | ModuleParameterRuntimeValue | StaticCallFuture | ReadEventArgumentFuture; + + /** + * The account to send the transaction from. + */ from?: string | AccountRuntimeValue; } @@ -45,9 +64,24 @@ export interface ContractOptions { * @beta */ export interface LibraryOptions { + /** + * The future id. + */ id?: string; + + /** + * The futures to execute before this one. + */ after?: Future[]; + + /** + * The libraries to link to the contract. + */ libraries?: Record>; + + /** + * The account to send the transaction from. + */ from?: string | AccountRuntimeValue; } @@ -57,13 +91,28 @@ export interface LibraryOptions { * @beta */ export interface CallOptions { + /** + * The future id. + */ id?: string; + + /** + * The futures to execute before this one. + */ after?: Future[]; + + /** + * The value in wei to send with the transaction. + */ value?: | bigint | ModuleParameterRuntimeValue | StaticCallFuture | ReadEventArgumentFuture; + + /** + * The account to send the transaction from. + */ from?: string | AccountRuntimeValue; } @@ -73,8 +122,19 @@ export interface CallOptions { * @beta */ export interface StaticCallOptions { + /** + * The future id. + */ id?: string; + + /** + * The futures to execute before this one. + */ after?: Future[]; + + /** + * The account to send the transaction from. + */ from?: string | AccountRuntimeValue; } @@ -84,7 +144,14 @@ export interface StaticCallOptions { * @beta */ export interface ContractAtOptions { + /** + * The future id. + */ id?: string; + + /** + * The futures to execute before this one. + */ after?: Future[]; } @@ -100,8 +167,8 @@ export interface ReadEventArgumentOptions { id?: string; /** - * The contract that emitted the event. If omitted the contract associated with - * the future you are reading the event from will be used. + * The contract that emitted the event. If omitted the contract associated + * with the future you are reading the event from will be used. */ emitter?: ContractFuture; @@ -118,7 +185,14 @@ export interface ReadEventArgumentOptions { * @beta */ export interface SendDataOptions { + /** + * The futures to execute before this one. + */ after?: Future[]; + + /** + * The account to send the transaction from. + */ from?: string | AccountRuntimeValue; } @@ -128,19 +202,72 @@ export interface SendDataOptions { * @beta */ export interface IgnitionModuleBuilder { + /** + * Returns an account runtime value representing the + * Hardhat account the underlying transactions for a + * future will be sent from. + * + * @param accountIndex - The index of the account to return + * + * @example + * ``` + * const owner = m.getAccount(1); + * const myContract = m.contract("MyContract", { from: owner }); + * // can also be used anywhere an address is expected + * m.send("sendToOwner", owner, { value: 100 }); + * ``` + */ getAccount(accountIndex: number): AccountRuntimeValue; + /** + * A parameter whose value can be set at deployment. + * + * @param parameterName - The name of the parameter + * @param defaultValue - The default value to use if the parameter is not + * provided + * + * @example + * ``` + * const amount = m.getParameter("amount", 100); + * const myContract = m.contract("MyContract", { value: amount }); + * ``` + */ getParameter( parameterName: string, defaultValue?: ParamTypeT ): ModuleParameterRuntimeValue; + /** + * Deploy a contract. + * + * @param contractName - The name of the contract to deploy + * @param args - The arguments to pass to the contract constructor + * @param options - The options for the deployment + * + * @example + * ``` + * const myContract = m.contract("MyContract", [], { value: 100 }); + * ``` + */ contract( contractName: ContractNameT, args?: ArgumentType[], options?: ContractOptions ): NamedArtifactContractDeploymentFuture; + /** + * Deploy a contract. + * + * @param contractName - The name of the contract to deploy + * @param artifact - The artifact of the contract to deploy + * @param args - The arguments to pass to the contract constructor + * @param options - The options for the deployment + * + * @example + * ``` + * const myContract = m.contract("MyContract", [], { value: 100 }); + * ``` + */ contract( contractName: string, artifact: Artifact, @@ -148,17 +275,60 @@ export interface IgnitionModuleBuilder { options?: ContractOptions ): ContractDeploymentFuture; + /** + * Deploy a library. + * + * @param libraryName - The name of the library to deploy + * @param options - The options for the deployment + * + * @example + * ``` + * const owner = m.getAccount(1); + * const myLibrary = m.library("MyLibrary", { from: owner } ); + * ``` + */ library( libraryName: LibraryNameT, options?: LibraryOptions ): NamedArtifactLibraryDeploymentFuture; + /** + * Deploy a library. + * + * @param libraryName - The name of the library to deploy + * @param artifact - The artifact of the library to deploy + * @param options - The options for the deployment + * + * @example + * ``` + * const owner = m.getAccount(1); + * const myLibrary = m.library( + * "MyLibrary", + * myLibraryArtifact, + * { from: owner } + * ); + * ``` + */ library( libraryName: string, artifact: Artifact, options?: LibraryOptions ): LibraryDeploymentFuture; + /** + * Call a contract function. + * + * @param contractFuture - The contract to call + * @param functionName - The name of the function to call + * @param args - The arguments to pass to the function + * @param options - The options for the call + * + * @example + * ``` + * const myContract = m.contract("MyContract"); + * const myContractCall = m.call(myContract, "updateCounter", [100]); + * ``` + */ call( contractFuture: CallableContractFuture, functionName: FunctionNameT, @@ -166,6 +336,30 @@ export interface IgnitionModuleBuilder { options?: CallOptions ): ContractCallFuture; + /** + * Statically call a contract function and return the result. + * + * This allows you to read data from a contract without sending a transaction. + * This is only supported for functions that are marked as `view` or `pure`, + * or variables marked `public`. + * + * @param contractFuture - The contract to call + * @param functionName - The name of the function to call + * @param args - The arguments to pass to the function + * @param nameOrIndex - The name or index of the return argument to read + * @param options - The options for the call + * + * @example + * ``` + * const myContract = m.contract("MyContract"); + * const counter = m.staticCall( + * myContract, + * "getCounterAndOwner", + * [], + * "counter" + * ); + * ``` + */ staticCall( contractFuture: CallableContractFuture, functionName: FunctionNameT, @@ -174,6 +368,22 @@ export interface IgnitionModuleBuilder { options?: StaticCallOptions ): StaticCallFuture; + /** + * Create a future for an existing deployed contract so that it can be + * referenced in subsequent futures. + * + * The resulting future can be used anywhere a contract future or address + * is expected. + * + * @param contractName - The name of the contract + * @param address - The address of the contract + * @param options - The options for the instance + * + * @example + * ``` + * const myContract = m.contractAt("MyContract", "0x1234..."); + * ``` + */ contractAt( contractName: ContractNameT, address: @@ -183,6 +393,27 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): NamedArtifactContractAtFuture; + /** + * Create a future for an existing deployed contract so that it can be + * referenced in subsequent futures. + * + * The resulting future can be used anywhere a contract future or address is + * expected. + * + * @param contractName - The name of the contract + * @param artifact - The artifact of the contract + * @param address - The address of the contract + * @param options - The options for the instance + * + * @example + * ``` + * const myContract = m.contractAt( + * "MyContract", + * myContractArtifact, + * "0x1234..." + * ); + * ``` + */ contractAt( contractName: string, artifact: Artifact, @@ -193,6 +424,35 @@ export interface IgnitionModuleBuilder { options?: ContractAtOptions ): ContractAtFuture; + /** + * Read an event argument from a contract. + * + * The resulting value can be used wherever a value of the same type is + * expected i.e. contract function arguments, `send` value, etc. + * + * @param futureToReadFrom - The future to read the event from + * @param eventName - The name of the event + * @param nameOrIndex - The name or index of the event argument to read + * @param options - The options for the event + * + * @example + * ``` + * const myContract = m.contract("MyContract"); + * // assuming the event is emitted by the constructor of MyContract + * const owner = m.readEventArgument(myContract, "ContractCreated", "owner"); + * + * // or, if the event is emitted during a function call: + * const myContractCall = m.call(myContract, "updateCounter", [100]); + * const counter = m.readEventArgument( + * myContractCall, + * "CounterUpdated", + * "counter", + * { + * emitter: myContract + * } + * ); + * ``` + */ readEventArgument( futureToReadFrom: | NamedArtifactContractDeploymentFuture @@ -204,6 +464,28 @@ export interface IgnitionModuleBuilder { options?: ReadEventArgumentOptions ): ReadEventArgumentFuture; + /** + * Send an arbitrary transaction. + * + * Can be used to transfer ether and/or send raw data to an address. + * + * @param id - A custom id for the Future + * @param to - The address to send the transaction to + * @param value - The amount of wei to send + * @param data - The data to send + * @param options - The options for the transaction + * + * @example + * ``` + * const myContract = m.contract("MyContract"); + * m.send("sendToMyContract", myContract, 100); + * + * // you can also send to an address directly + * const owner = m.getAccount(1); + * const otherAccount = m.getAccount(2); + * m.send("sendToOwner", owner, 100, undefined, { from: otherAccount }); + * ``` + */ send( id: string, to: @@ -216,6 +498,27 @@ export interface IgnitionModuleBuilder { options?: SendDataOptions ): SendDataFuture; + /** + * Allows you to deploy then use the results of another module within this + * module. + * + * @param ignitionSubmodule - The submodule to use + * + * @example + * ``` + * const otherModule = buildModule("otherModule", (m) => { + * const myContract = m.contract("MyContract"); + * + * return { myContract }; + * }); + * + * const mainModule = buildModule("mainModule", (m) => { + * const { myContract } = m.useModule(otherModule); + * + * const myContractCall = m.call(myContract, "updateCounter", [100]); + * }); + * ``` + */ useModule< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index 2f32444c20..a3fef768b8 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -51,6 +51,15 @@ export class EthersIgnitionHelper { this._deploymentDir = deploymentDir; } + /** + * Deploys the given Ignition module and returns the results of the module as + * Ethers contract instances. + * + * @param ignitionModule - The Ignition module to deploy. + * @param options - The options to use for the deployment. + * @returns Ethers contract instances for each contract returned by the + * module. + */ public async deploy< ModuleIdT extends string, ContractNameT extends string, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 2096175c08..4fae696cac 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -45,6 +45,14 @@ export class ViemIgnitionHelper { this._deploymentDir = deploymentDir; } + /** + * Deploys the given Ignition module and returns the results of the module + * as Viem contract instances. + * + * @param ignitionModule - The Ignition module to deploy. + * @param options - The options to use for the deployment. + * @returns Viem contract instances for each contract returned by the module. + */ public async deploy< ModuleIdT extends string, ContractNameT extends string, From 354a2ca74840b2d38180a683c5523cf35653ec7c Mon Sep 17 00:00:00 2001 From: Zoey Date: Thu, 18 Jan 2024 09:56:46 -0500 Subject: [PATCH 1133/1302] Made all errors internal (#678) * moved errors to internal * chore: remove alpha/beta tags from internal * fix api extractor tags * refactor: remove unneeded intermediary function --------- Co-authored-by: John Kane --- packages/core/src/build-module.ts | 2 +- packages/core/src/deploy.ts | 2 +- packages/core/src/errors.ts | 40 +++++-------------- .../core/src/ignition-module-serializer.ts | 2 +- packages/core/src/index.ts | 2 +- packages/core/src/internal/deployer.ts | 2 +- .../core/src/{ => internal}/errors-list.ts | 14 +------ packages/core/src/internal/execution/abi.ts | 2 +- .../handlers/monitor-onchain-interaction.ts | 2 +- .../src/internal/execution/jsonrpc-client.ts | 2 +- .../core/src/internal/execution/libraries.ts | 2 +- .../get-nonce-sync-messages.ts | 2 +- .../json-rpc-nonce-manager.ts | 2 +- packages/core/src/internal/module-builder.ts | 2 +- .../src/internal/reconciliation/reconciler.ts | 2 +- .../core/src/internal/utils/assertions.ts | 2 +- .../futures/validateArtifactContractAt.ts | 2 +- .../validateArtifactContractDeployment.ts | 2 +- .../futures/validateNamedContractAt.ts | 2 +- .../futures/validateNamedContractCall.ts | 2 +- .../validateNamedContractDeployment.ts | 2 +- .../futures/validateNamedLibraryDeployment.ts | 2 +- .../futures/validateNamedStaticCall.ts | 2 +- .../futures/validateReadEventArgument.ts | 2 +- .../validation/futures/validateSendData.ts | 2 +- .../core/src/internal/validation/utils.ts | 2 +- packages/core/src/internal/wiper.ts | 2 +- packages/core/src/status.ts | 2 +- packages/core/src/types/errors.ts | 11 +++++ packages/core/src/verify.ts | 2 +- 30 files changed, 49 insertions(+), 70 deletions(-) rename packages/core/src/{ => internal}/errors-list.ts (97%) create mode 100644 packages/core/src/types/errors.ts diff --git a/packages/core/src/build-module.ts b/packages/core/src/build-module.ts index 5d1a4b9bd6..30f37a30f2 100644 --- a/packages/core/src/build-module.ts +++ b/packages/core/src/build-module.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "./errors"; -import { ERRORS } from "./errors-list"; +import { ERRORS } from "./internal/errors-list"; import { ModuleConstructor } from "./internal/module-builder"; import { isValidIgnitionIdentifier } from "./internal/utils/identifier-validators"; import { IgnitionModule, IgnitionModuleResult } from "./types/module"; diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 82caf6b178..62ba6b886f 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "./errors"; -import { ERRORS } from "./errors-list"; import { DEFAULT_AUTOMINE_REQUIRED_CONFIRMATIONS, defaultConfig, @@ -7,6 +6,7 @@ import { import { Deployer } from "./internal/deployer"; import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemeral-deployment-loader"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { ERRORS } from "./internal/errors-list"; import { BasicExecutionStrategy } from "./internal/execution/basic-execution-strategy"; import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; import { equalAddresses } from "./internal/execution/utils/address"; diff --git a/packages/core/src/errors.ts b/packages/core/src/errors.ts index 6514734217..c3fe574728 100644 --- a/packages/core/src/errors.ts +++ b/packages/core/src/errors.ts @@ -1,10 +1,11 @@ -import { ERRORS, ErrorDescriptor, getErrorCode } from "./errors-list"; +import { ERRORS, getErrorCode } from "./internal/errors-list"; +import { ErrorDescriptor } from "./types/errors"; /** * Base error class extended by all custom errors. * Placeholder to allow us to customize error output formatting in the future. * - * @alpha + * @beta */ export class CustomError extends Error { constructor(message: string, cause?: Error) { @@ -17,7 +18,7 @@ export class CustomError extends Error { * All exceptions intentionally thrown with Ignition-core * extend this class. * - * @alpha + * @beta */ export class IgnitionError extends CustomError { // We store the error descriptor as private field to avoid @@ -35,9 +36,10 @@ export class IgnitionError extends CustomError { cause?: Error ) { const prefix = `${getErrorCode(errorDescriptor)}: `; - const formattedMessage = applyErrorMessageTemplate( + const formattedMessage = _applyErrorMessageTemplate( errorDescriptor.message, - messageArguments + messageArguments, + false ); super(prefix + formattedMessage, cause); @@ -53,7 +55,7 @@ export class IgnitionError extends CustomError { /** * This class is used to throw errors from Ignition plugins made by third parties. * - * @alpha + * @beta */ export class IgnitionPluginError extends CustomError { public static isIgnitionPluginError( @@ -80,7 +82,7 @@ export class IgnitionPluginError extends CustomError { * This class is used to throw errors from *core* Ignition plugins. * If you are developing a third-party plugin, use IgnitionPluginError instead. * - * @alpha + * @beta */ export class NomicIgnitionPluginError extends IgnitionPluginError { public static isNomicIgnitionPluginError( @@ -96,30 +98,6 @@ export class NomicIgnitionPluginError extends IgnitionPluginError { private readonly _isNomicIgnitionPluginError = true; } -/** - * This function applies error messages templates like this: - * - * - Template is a string which contains a variable tags. A variable tag is a - * a variable name surrounded by %. Eg: %plugin1% - * - A variable name is a string of alphanumeric ascii characters. - * - Every variable tag is replaced by its value. - * - %% is replaced by %. - * - Values can't contain variable tags. - * - If a variable is not present in the template, but present in the values - * object, an error is thrown. - * - * @param template - The template string. - * @param values - A map of variable names to their values. - * - * @alpha - */ -export function applyErrorMessageTemplate( - template: string, - values: { [templateVar: string]: any } -): string { - return _applyErrorMessageTemplate(template, values, false); -} - function _applyErrorMessageTemplate( template: string, values: { [templateVar: string]: any }, diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index b55c59636b..bc7112df16 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "./errors"; -import { ERRORS } from "./errors-list"; +import { ERRORS } from "./internal/errors-list"; import { AccountRuntimeValueImplementation, ArtifactContractAtFutureImplementation, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 4d260e19f4..dbbe347f56 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -2,13 +2,13 @@ export { batches } from "./batches"; export { buildModule } from "./build-module"; export { deploy } from "./deploy"; export * from "./errors"; -export { ErrorDescriptor } from "./errors-list"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export { status } from "./status"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; +export * from "./types/errors"; export * from "./types/execution-events"; export * from "./types/module"; export * from "./types/module-builder"; diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 371536c6a2..b8c25ce03b 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -1,7 +1,6 @@ import type { IgnitionModule, IgnitionModuleResult } from "../types/module"; import { IgnitionError } from "../errors"; -import { ERRORS } from "../errors-list"; import { isContractFuture } from "../type-guards"; import { ArtifactResolver } from "../types/artifact"; import { @@ -20,6 +19,7 @@ import { import { Batcher } from "./batcher"; import { DeploymentLoader } from "./deployment-loader/types"; +import { ERRORS } from "./errors-list"; import { initializeDeploymentState, loadDeploymentState, diff --git a/packages/core/src/errors-list.ts b/packages/core/src/internal/errors-list.ts similarity index 97% rename from packages/core/src/errors-list.ts rename to packages/core/src/internal/errors-list.ts index 0d00a48a68..b8cbb08cf8 100644 --- a/packages/core/src/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -1,16 +1,6 @@ -export const ERROR_PREFIX = "IGN"; +import { ErrorDescriptor } from "../types/errors"; -/** - * ErrorDescriptor is a type that describes an error. - * It's used to generate error codes and messages. - * - * @beta - */ -export interface ErrorDescriptor { - number: number; - // Message can use templates. See applyErrorMessageTemplate - message: string; -} +export const ERROR_PREFIX = "IGN"; export function getErrorCode(error: ErrorDescriptor): string { return `${ERROR_PREFIX}${error.number}`; diff --git a/packages/core/src/internal/execution/abi.ts b/packages/core/src/internal/execution/abi.ts index 1e1a27d49e..3e80188eb8 100644 --- a/packages/core/src/internal/execution/abi.ts +++ b/packages/core/src/internal/execution/abi.ts @@ -8,9 +8,9 @@ import type { } from "ethers"; import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { Artifact } from "../../types/artifact"; import { ArgumentType, SolidityParameterType } from "../../types/module"; +import { ERRORS } from "../errors-list"; import { assertIgnitionInvariant } from "../utils/assertions"; import { linkLibraries } from "./libraries"; diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts index 0ab19dfb2f..a0528271df 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts @@ -1,7 +1,7 @@ import setupDebug from "debug"; import { IgnitionError } from "../../../../errors"; -import { ERRORS } from "../../../../errors-list"; +import { ERRORS } from "../../../errors-list"; import { assertIgnitionInvariant } from "../../../utils/assertions"; import { JsonRpcClient } from "../../jsonrpc-client"; import { TransactionTrackingTimer } from "../../transaction-tracking-timer"; diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 00b0955a35..280fe36d75 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -1,6 +1,6 @@ import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { EIP1193Provider } from "../../types/provider"; +import { ERRORS } from "../errors-list"; import { NetworkFees, diff --git a/packages/core/src/internal/execution/libraries.ts b/packages/core/src/internal/execution/libraries.ts index c686cf76e2..4782de3844 100644 --- a/packages/core/src/internal/execution/libraries.ts +++ b/packages/core/src/internal/execution/libraries.ts @@ -14,8 +14,8 @@ */ import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { Artifact } from "../../types/artifact"; +import { ERRORS } from "../errors-list"; import { assertIgnitionInvariant } from "../utils/assertions"; /** diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts index d74d3f08e3..d9f95c3d87 100644 --- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts @@ -1,7 +1,6 @@ import uniq from "lodash/uniq"; import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isArtifactContractAtFuture, isNamedContractAtFuture, @@ -12,6 +11,7 @@ import { IgnitionModule, IgnitionModuleResult, } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { getFuturesFromModule } from "../../utils/get-futures-from-module"; import { getPendingOnchainInteraction } from "../../views/execution-state/get-pending-onchain-interaction"; import { resolveFutureFrom } from "../future-processor/helpers/future-resolvers"; diff --git a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts index ad0fa4f460..de39f5e2d1 100644 --- a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts +++ b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; +import { ERRORS } from "../../errors-list"; import { JsonRpcClient } from "../jsonrpc-client"; /** diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 611b5fa470..b9e52d6465 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -1,7 +1,6 @@ import { inspect } from "util"; import { IgnitionError } from "../errors"; -import { ERRORS } from "../errors-list"; import { isAccountRuntimeValue, isAddressResolvableFuture, @@ -48,6 +47,7 @@ import { StaticCallOptions, } from "../types/module-builder"; +import { ERRORS } from "./errors-list"; import { equalAddresses, isAddress } from "./execution/utils/address"; import { AccountRuntimeValueImplementation, diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index beead0a014..f1d9043095 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -1,9 +1,9 @@ import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { ArtifactResolver } from "../../types/artifact"; import { DeploymentParameters } from "../../types/deploy"; import { Future, IgnitionModule } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; +import { ERRORS } from "../errors-list"; import { DeploymentState } from "../execution/types/deployment-state"; import { ExecutionState, diff --git a/packages/core/src/internal/utils/assertions.ts b/packages/core/src/internal/utils/assertions.ts index a413355b03..5a5408654c 100644 --- a/packages/core/src/internal/utils/assertions.ts +++ b/packages/core/src/internal/utils/assertions.ts @@ -1,5 +1,5 @@ import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; +import { ERRORS } from "../errors-list"; export function assertIgnitionInvariant( invariant: boolean, diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts index 8f3e479447..4408fff9eb 100644 --- a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts @@ -1,9 +1,9 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isModuleParameterRuntimeValue } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractAtFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; export async function validateArtifactContractAt( future: ContractAtFuture, diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts index 70e9dec0e1..c374007e35 100644 --- a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -7,6 +6,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractDeploymentFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { diff --git a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts index 8d17fcd89a..6e09a5d544 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isArtifactType, isModuleParameterRuntimeValue, @@ -7,6 +6,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactContractAtFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; export async function validateNamedContractAt( future: NamedArtifactContractAtFuture, diff --git a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts index 553beb60ee..fba50d507d 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isArtifactType, @@ -8,6 +7,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractCallFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateArtifactFunction } from "../../execution/abi"; import { retrieveNestedRuntimeValues, diff --git a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts index 44803e267b..8894178de8 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isArtifactType, @@ -8,6 +7,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactContractDeploymentFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { diff --git a/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts index c8ddb35cd5..ff0ba2c27f 100644 --- a/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts @@ -1,9 +1,9 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactLibraryDeploymentFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateLibraryNames } from "../../execution/libraries"; import { validateAccountRuntimeValue } from "../utils"; diff --git a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts index d4009d2f03..f3306d6765 100644 --- a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isArtifactType, @@ -8,6 +7,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { StaticCallFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateArtifactFunction, validateFunctionArgumentParamType, diff --git a/packages/core/src/internal/validation/futures/validateReadEventArgument.ts b/packages/core/src/internal/validation/futures/validateReadEventArgument.ts index 85d178b68f..d4f72573e6 100644 --- a/packages/core/src/internal/validation/futures/validateReadEventArgument.ts +++ b/packages/core/src/internal/validation/futures/validateReadEventArgument.ts @@ -1,9 +1,9 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isArtifactType } from "../../../type-guards"; import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ReadEventArgumentFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateArtifactEventArgumentParams } from "../../execution/abi"; export async function validateReadEventArgument( diff --git a/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/core/src/internal/validation/futures/validateSendData.ts index f4d45dfe1c..9a941117bd 100644 --- a/packages/core/src/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/internal/validation/futures/validateSendData.ts @@ -1,5 +1,4 @@ import { IgnitionError } from "../../../errors"; -import { ERRORS } from "../../../errors-list"; import { isAccountRuntimeValue, isModuleParameterRuntimeValue, @@ -7,6 +6,7 @@ import { import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { SendDataFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; import { validateAccountRuntimeValue } from "../utils"; export async function validateSendData( diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts index b60773ab90..a19ffc23d8 100644 --- a/packages/core/src/internal/validation/utils.ts +++ b/packages/core/src/internal/validation/utils.ts @@ -1,11 +1,11 @@ import { IgnitionError } from "../../errors"; -import { ERRORS } from "../../errors-list"; import { isFuture, isRuntimeValue } from "../../type-guards"; import { AccountRuntimeValue, ArgumentType, RuntimeValue, } from "../../types/module"; +import { ERRORS } from "../errors-list"; export function validateAccountRuntimeValue( arv: AccountRuntimeValue, diff --git a/packages/core/src/internal/wiper.ts b/packages/core/src/internal/wiper.ts index ef2d20e647..c9ea92ceff 100644 --- a/packages/core/src/internal/wiper.ts +++ b/packages/core/src/internal/wiper.ts @@ -1,7 +1,7 @@ import { IgnitionError } from "../errors"; -import { ERRORS } from "../errors-list"; import { DeploymentLoader } from "./deployment-loader/types"; +import { ERRORS } from "./errors-list"; import { applyNewMessage, loadDeploymentState, diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index 133c39d2fa..7ec89f2d86 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -1,6 +1,6 @@ import { IgnitionError } from "./errors"; -import { ERRORS } from "./errors-list"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { ERRORS } from "./internal/errors-list"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; import { findStatus } from "./internal/views/find-status"; diff --git a/packages/core/src/types/errors.ts b/packages/core/src/types/errors.ts new file mode 100644 index 0000000000..a2854d2a5f --- /dev/null +++ b/packages/core/src/types/errors.ts @@ -0,0 +1,11 @@ +/** + * ErrorDescriptor is a type that describes an error. + * It's used to generate error codes and messages. + * + * @beta + */ +export interface ErrorDescriptor { + number: number; + // Message can use templates. See applyErrorMessageTemplate + message: string; +} diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index 482de0bf64..adcb9630a4 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -1,7 +1,7 @@ import { IgnitionError } from "./errors"; -import { ERRORS } from "./errors-list"; import { builtinChains } from "./internal/chain-config"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { ERRORS } from "./internal/errors-list"; import { encodeDeploymentArguments } from "./internal/execution/abi"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { DeploymentState } from "./internal/execution/types/deployment-state"; From 74a83a1d310239886cfa44794db3e3055829a5e6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Jan 2024 11:47:41 +0000 Subject: [PATCH 1134/1302] chore: cleanup coverage Rework test coverage in `fullcheck` and apply it in github actions. --- .github/workflows/ci.yml | 6 +++--- packages/core/.nycrc | 19 ++++++------------- packages/hardhat-plugin-ethers/.nycrc | 21 +++++++-------------- packages/hardhat-plugin-viem/.nycrc | 21 +++++++-------------- packages/hardhat-plugin/.nycrc | 21 +++++++-------------- packages/ui/.nycrc | 12 ++++++++++++ packages/ui/package.json | 1 + 7 files changed, 43 insertions(+), 58 deletions(-) create mode 100644 packages/ui/.nycrc diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 760e09edc6..1564b4616f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test + run: npm run test:coverage - name: Run tests in examples run: npm run test:examples @@ -40,7 +40,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test + run: npm run test:coverage - name: Run tests in examples run: npm run test:examples @@ -61,7 +61,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test + run: npm run test:coverage - name: Run tests in examples run: npm run test:examples diff --git a/packages/core/.nycrc b/packages/core/.nycrc index a511180e39..05a77b2bcf 100644 --- a/packages/core/.nycrc +++ b/packages/core/.nycrc @@ -1,19 +1,12 @@ { "extends": "@istanbuljs/nyc-config-typescript", "check-coverage": true, - "statements": 35, - "branches": 25, - "functions": 30, - "lines": 35, + "statements": 80, + "branches": 65, + "functions": 75, + "lines": 75, "all": true, - "include": [ - "src/**/*.ts" - ], - "reporter": [ - "html", - "lcov", - "text", - "text-summary" - ], + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], "report-dir": "coverage" } diff --git a/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-plugin-ethers/.nycrc index c573ff2ac1..e427e0b37f 100644 --- a/packages/hardhat-plugin-ethers/.nycrc +++ b/packages/hardhat-plugin-ethers/.nycrc @@ -1,19 +1,12 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "check-coverage": false, - "statements": 50, - "branches": 30, - "functions": 42, - "lines": 50, + "check-coverage": true, + "statements": 90, + "branches": 85, + "functions": 100, + "lines": 90, "all": true, - "include": [ - "src/**/*.ts" - ], - "reporter": [ - "html", - "lcov", - "text", - "text-summary" - ], + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], "report-dir": "coverage" } diff --git a/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-plugin-viem/.nycrc index c573ff2ac1..d17e98940f 100644 --- a/packages/hardhat-plugin-viem/.nycrc +++ b/packages/hardhat-plugin-viem/.nycrc @@ -1,19 +1,12 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "check-coverage": false, - "statements": 50, - "branches": 30, - "functions": 42, - "lines": 50, + "check-coverage": true, + "statements": 85, + "branches": 80, + "functions": 100, + "lines": 85, "all": true, - "include": [ - "src/**/*.ts" - ], - "reporter": [ - "html", - "lcov", - "text", - "text-summary" - ], + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], "report-dir": "coverage" } diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-plugin/.nycrc index c573ff2ac1..0f9e436c71 100644 --- a/packages/hardhat-plugin/.nycrc +++ b/packages/hardhat-plugin/.nycrc @@ -1,19 +1,12 @@ { "extends": "@istanbuljs/nyc-config-typescript", - "check-coverage": false, - "statements": 50, - "branches": 30, - "functions": 42, - "lines": 50, + "check-coverage": true, + "statements": 70, + "branches": 50, + "functions": 60, + "lines": 70, "all": true, - "include": [ - "src/**/*.ts" - ], - "reporter": [ - "html", - "lcov", - "text", - "text-summary" - ], + "include": ["src/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], "report-dir": "coverage" } diff --git a/packages/ui/.nycrc b/packages/ui/.nycrc new file mode 100644 index 0000000000..d4e4aca7eb --- /dev/null +++ b/packages/ui/.nycrc @@ -0,0 +1,12 @@ +{ + "extends": "@istanbuljs/nyc-config-typescript", + "check-coverage": false, + "statements": 10, + "branches": 10, + "functions": 10, + "lines": 10, + "all": true, + "include": ["src/**/*.ts", "test/**/*.ts"], + "reporter": ["html", "lcov", "text", "text-summary"], + "report-dir": "coverage" +} diff --git a/packages/ui/package.json b/packages/ui/package.json index 68865c21c8..aa8e1befe9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -7,6 +7,7 @@ "dev": "vite --force", "build": "tsc && vite build", "test": "mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", + "test:coverage": "nyc mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", "regenerate-deployment-example": "node ./scripts/generate-example-deployment-json.js", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", From 51fc4fb388600eef4aa27fb26aa3e68a54308c0c Mon Sep 17 00:00:00 2001 From: Zoey Date: Thu, 25 Jan 2024 12:28:56 -0500 Subject: [PATCH 1135/1302] =?UTF-8?q?Add=20the=20ability=20to=20use=20Acco?= =?UTF-8?q?untRuntimeValues=20as=20default=20values=20for=20mod=E2=80=A6?= =?UTF-8?q?=20(#679)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Allow Ignition modules to specify module parameters where the default value is an account runtime value: ``` const owner = m.getParameter('owner', m.getAccount(0)); ``` The module parameter type has been expanded to included Account Runtime Values, but user facing usages have been swapped for `SolidityParameterType`. Tests have been added around reconciliation, validation and serialization. Resolves #673 --- .../core/src/ignition-module-serializer.ts | 24 +++-- .../helpers/build-initialize-message-for.ts | 12 ++- .../helpers/future-resolvers.ts | 20 ++++- .../helpers/reconcile-address.ts | 3 +- .../helpers/reconcile-contract.ts | 3 +- .../reconciliation/helpers/reconcile-value.ts | 5 +- .../utils/resolve-module-parameter.ts | 37 +++++--- .../validateArtifactContractDeployment.ts | 3 +- .../futures/validateNamedContractCall.ts | 3 +- .../validateNamedContractDeployment.ts | 3 +- .../futures/validateNamedStaticCall.ts | 3 +- .../core/src/internal/validation/utils.ts | 22 ++++- packages/core/src/types/module.ts | 4 +- packages/core/test/call.ts | 87 +++++++++++++++++++ packages/core/test/contract.ts | 75 ++++++++++++++++ packages/core/test/contractFromArtifact.ts | 79 +++++++++++++++++ packages/core/test/getParameter.ts | 26 +++++- .../core/test/ignition-module-serializer.ts | 11 +++ .../core/test/reconciliation/reconciler.ts | 47 ++++++++++ packages/core/test/staticCall.ts | 87 +++++++++++++++++++ .../core/test/utils/replace-within-arg.ts | 16 +++- .../minimal/contracts/Owner.sol | 14 +++ .../hardhat-plugin/test/module-api/params.ts | 46 ++++++++++ 23 files changed, 590 insertions(+), 40 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index bc7112df16..ceb475f8f5 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -804,7 +804,7 @@ export class IgnitionModuleDeserializer { ) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.address - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : serializedFuture.address, serializedFuture.artifact ); @@ -839,7 +839,7 @@ export class IgnitionModuleDeserializer { : this._isSerializedModuleParameterRuntimeValue(serializedFuture.to) ? (this._deserializeModuleParameterRuntimeValue( serializedFuture.to - ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid valus + ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._isSerializedAccountRuntimeValue(serializedFuture.to) ? this._deserializeAccountRuntimeValue(serializedFuture.to) : serializedFuture.to, @@ -897,10 +897,24 @@ export class IgnitionModuleDeserializer { ): ModuleParameterRuntimeValue { let defaultValue: ModuleParameterType | undefined; if (serialized.defaultValue !== undefined) { - // We cast here because we receive an `unknow`, but we known it came from serializing a ModuleParameterType - defaultValue = this._jsonParseWithBigint( + // We cast here because we receive an `unknown`, but we known it came from + // serializing a ModuleParameterType + const parsedDefaultValue = this._jsonParseWithBigint( serialized.defaultValue - ) as ModuleParameterType; + ); + + if ( + typeof parsedDefaultValue === "object" && + parsedDefaultValue !== null && + "accountIndex" in parsedDefaultValue && + typeof parsedDefaultValue.accountIndex === "number" + ) { + defaultValue = new AccountRuntimeValueImplementation( + parsedDefaultValue.accountIndex + ); + } else { + defaultValue = parsedDefaultValue as ModuleParameterType; + } } return new ModuleParameterRuntimeValueImplementation( diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 9dc540f642..09b810cd8e 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -55,7 +55,8 @@ export async function buildInitializeMessageFor( value: resolveValue( future.value, deploymentParameters, - deploymentState + deploymentState, + accounts ), from: resolveFutureFrom(future.from, accounts, defaultSender), } @@ -103,7 +104,8 @@ export async function buildInitializeMessageFor( value: resolveValue( future.value, deploymentParameters, - deploymentState + deploymentState, + accounts ), from: resolveFutureFrom(future.from, accounts, defaultSender), } @@ -150,7 +152,8 @@ export async function buildInitializeMessageFor( contractAddress: resolveAddressLike( future.address, deploymentState, - deploymentParameters + deploymentParameters, + accounts ), artifactId: future.id, } @@ -204,7 +207,8 @@ export async function buildInitializeMessageFor( value: resolveValue( future.value, deploymentParameters, - deploymentState + deploymentState, + accounts ), data: future.data ?? "0x", from: resolveFutureFrom(future.from, accounts, defaultSender), diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts index 657150c4ba..cae1c658d1 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts @@ -42,7 +42,8 @@ export function resolveValue( | StaticCallFuture | ReadEventArgumentFuture, deploymentParameters: DeploymentParameters, - deploymentState: DeploymentState + deploymentState: DeploymentState, + accounts: string[] ): bigint { if (typeof givenValue === "bigint") { return givenValue; @@ -54,6 +55,7 @@ export function resolveValue( } else { result = resolveModuleParameter(givenValue, { deploymentParameters, + accounts, }); } @@ -85,7 +87,10 @@ export function resolveArgs( return resolveAccountRuntimeValue(arv, accounts); }, moduleParameterRuntimeValue: (mprv) => { - return resolveModuleParameter(mprv, { deploymentParameters }); + return resolveModuleParameter(mprv, { + deploymentParameters, + accounts, + }); }, }); @@ -174,7 +179,12 @@ export function resolveSendToAddress( return resolveAccountRuntimeValue(to, accounts); } - return resolveAddressLike(to, deploymentState, deploymentParameters); + return resolveAddressLike( + to, + deploymentState, + deploymentParameters, + accounts + ); } /** @@ -188,7 +198,8 @@ export function resolveAddressLike( | AddressResolvableFuture | ModuleParameterRuntimeValue, deploymentState: DeploymentState, - deploymentParameters: DeploymentParameters + deploymentParameters: DeploymentParameters, + accounts: string[] ): string { if (typeof addressLike === "string") { return addressLike; @@ -197,6 +208,7 @@ export function resolveAddressLike( if (isModuleParameterRuntimeValue(addressLike)) { const addressFromParam = resolveModuleParameter(addressLike, { deploymentParameters, + accounts, }); assertIgnitionInvariant( diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts index 23e16d0528..b3873187fc 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts @@ -19,7 +19,8 @@ export function reconcileAddress( const resolvedAddress = resolveAddressLike( future.address, context.deploymentState, - context.deploymentParameters + context.deploymentParameters, + context.accounts ); return compare(future, "Address", exState.contractAddress, resolvedAddress); diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts index c1292106b0..bb4b854927 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts @@ -19,7 +19,8 @@ export function reconcileContract( const resolvedAddress = resolveAddressLike( future.contract, context.deploymentState, - context.deploymentParameters + context.deploymentParameters, + context.accounts ); return compare( diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts index f5a46b9c35..b883d9ebe8 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts @@ -1,6 +1,6 @@ import { - ContractDeploymentFuture, ContractCallFuture, + ContractDeploymentFuture, NamedArtifactContractDeploymentFuture, SendDataFuture, } from "../../../types/module"; @@ -32,7 +32,8 @@ export function reconcileValue( const resolvedValue = resolveValue( future.value, context.deploymentParameters, - context.deploymentState + context.deploymentState, + context.accounts ); return compare(future, "Value", exState.value, resolvedValue); diff --git a/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/core/src/internal/utils/resolve-module-parameter.ts index be216af466..0ff3cbff37 100644 --- a/packages/core/src/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/internal/utils/resolve-module-parameter.ts @@ -1,22 +1,25 @@ +import { isAccountRuntimeValue } from "../../type-guards"; import { DeploymentParameters } from "../../types/deploy"; import { ModuleParameterRuntimeValue, ModuleParameterType, + SolidityParameterType, } from "../../types/module"; +import { resolveAccountRuntimeValue } from "../execution/future-processor/helpers/future-resolvers"; import { assertIgnitionInvariant } from "./assertions"; export function resolveModuleParameter( moduleParamRuntimeValue: ModuleParameterRuntimeValue, - context: { deploymentParameters: DeploymentParameters } -): ModuleParameterType { + context: { deploymentParameters: DeploymentParameters; accounts: string[] } +): SolidityParameterType { if (context.deploymentParameters === undefined) { assertIgnitionInvariant( moduleParamRuntimeValue.defaultValue !== undefined, `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` ); - return moduleParamRuntimeValue.defaultValue; + return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); } const moduleParameters = @@ -28,19 +31,33 @@ export function resolveModuleParameter( `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` ); - return moduleParamRuntimeValue.defaultValue; + return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); } const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; if (moduleParamValue === undefined) { - assertIgnitionInvariant( - moduleParamRuntimeValue.defaultValue !== undefined, - `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` - ); - - return moduleParamRuntimeValue.defaultValue; + return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); } return moduleParamValue; } + +function _resolveDefaultValue( + moduleParamRuntimeValue: ModuleParameterRuntimeValue, + accounts: string[] +): SolidityParameterType { + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); + + if (isAccountRuntimeValue(moduleParamRuntimeValue.defaultValue)) { + return resolveAccountRuntimeValue( + moduleParamRuntimeValue.defaultValue, + accounts + ); + } + + return moduleParamRuntimeValue.defaultValue; +} diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts index c374007e35..d45f7ee3a2 100644 --- a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts @@ -10,6 +10,7 @@ import { ERRORS } from "../../errors-list"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { + filterToAccountRuntimeValues, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -41,7 +42,7 @@ export async function validateArtifactContractDeployment( const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ - ...runtimeValues.filter(isAccountRuntimeValue), + ...filterToAccountRuntimeValues(runtimeValues), ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; diff --git a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts index fba50d507d..31e081b622 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts @@ -10,6 +10,7 @@ import { ContractCallFuture } from "../../../types/module"; import { ERRORS } from "../../errors-list"; import { validateArtifactFunction } from "../../execution/abi"; import { + filterToAccountRuntimeValues, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -52,7 +53,7 @@ export async function validateNamedContractCall( const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ - ...runtimeValues.filter(isAccountRuntimeValue), + ...filterToAccountRuntimeValues(runtimeValues), ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; diff --git a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts index 8894178de8..f10b72b86d 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts @@ -11,6 +11,7 @@ import { ERRORS } from "../../errors-list"; import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { + filterToAccountRuntimeValues, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -52,7 +53,7 @@ export async function validateNamedContractDeployment( const runtimeValues = retrieveNestedRuntimeValues(future.constructorArgs); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ - ...runtimeValues.filter(isAccountRuntimeValue), + ...filterToAccountRuntimeValues(runtimeValues), ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; diff --git a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts index f3306d6765..4d41d063dd 100644 --- a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts @@ -13,6 +13,7 @@ import { validateFunctionArgumentParamType, } from "../../execution/abi"; import { + filterToAccountRuntimeValues, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -64,7 +65,7 @@ export async function validateNamedStaticCall( const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); const accountParams = [ - ...runtimeValues.filter(isAccountRuntimeValue), + ...filterToAccountRuntimeValues(runtimeValues), ...(isAccountRuntimeValue(future.from) ? [future.from] : []), ]; diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts index a19ffc23d8..527b228d3a 100644 --- a/packages/core/src/internal/validation/utils.ts +++ b/packages/core/src/internal/validation/utils.ts @@ -1,5 +1,9 @@ import { IgnitionError } from "../../errors"; -import { isFuture, isRuntimeValue } from "../../type-guards"; +import { + isAccountRuntimeValue, + isFuture, + isRuntimeValue, +} from "../../type-guards"; import { AccountRuntimeValue, ArgumentType, @@ -29,6 +33,22 @@ export function validateAccountRuntimeValue( return errors; } +export function filterToAccountRuntimeValues( + runtimeValues: RuntimeValue[] +): AccountRuntimeValue[] { + return runtimeValues + .map((rv) => { + if (isAccountRuntimeValue(rv)) { + return rv; + } else if (isAccountRuntimeValue(rv.defaultValue)) { + return rv.defaultValue; + } else { + return undefined; + } + }) + .filter((rv): rv is AccountRuntimeValue => rv !== undefined); +} + export function retrieveNestedRuntimeValues( args: ArgumentType[] ): RuntimeValue[] { diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 8dc30761d1..2b603d88f4 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -344,7 +344,7 @@ export type SolidityParameterType = * * @beta */ -export type ModuleParameterType = SolidityParameterType; +export type ModuleParameterType = SolidityParameterType | AccountRuntimeValue; /** * The different runtime values supported by Ignition. @@ -395,7 +395,7 @@ export interface ModuleParameterRuntimeValue< * @beta */ export interface ModuleParameters { - [parameterName: string]: ModuleParameterType; + [parameterName: string]: SolidityParameterType; } /** diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index 82b3280d92..8991329d2d 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -844,6 +844,93 @@ m.call(..., { id: "MyUniqueId"})` ); }); + it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + + const another = m.contract("Another", fakerArtifact, []); + m.call(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(-1)); + + const another = m.contract("Another", fakerArtifact, []); + m.call(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + "Account index cannot be a negative number" + ); + }); + it("should not validate a negative account index", async () => { const fakerArtifact: Artifact = { ...fakeArtifact, diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index a5eda6d37e..99861efad8 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -777,6 +777,81 @@ m.contract(..., { id: "MyUniqueId"})` ); }); + it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "p", + type: "address", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + const contract1 = m.contract("Test", [p]); + + return { contract1 }; + }); + + const [future] = getFuturesFromModule(module); + + await assert.isFulfilled( + validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "p", + type: "address", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(-1)); + const contract1 = m.contract("Test", [p]); + + return { contract1 }; + }); + + const [future] = getFuturesFromModule(module); + + assertValidationError( + await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + "Account index cannot be a negative number" + ); + }); + it("should not validate a negative account index", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index 176e5265b7..e42917a3a7 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -699,6 +699,85 @@ m.contract(..., { id: "MyUniqueId"})` ); }); + it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "p", + type: "address", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + const contract1 = m.contract("Test", fakerArtifact, [p]); + + return { contract1 }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); + + await assert.isFulfilled( + validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "p", + type: "address", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(-1)); + const contract1 = m.contract("Test", fakerArtifact, [p]); + + return { contract1 }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); + + assertValidationError( + await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + "Account index cannot be a negative number" + ); + }); + it("should not validate a negative account index", async () => { const module = buildModule("Module1", (m) => { const account = m.getAccount(-1); diff --git a/packages/core/test/getParameter.ts b/packages/core/test/getParameter.ts index 2f5bea215b..7af27fc3dd 100644 --- a/packages/core/test/getParameter.ts +++ b/packages/core/test/getParameter.ts @@ -3,7 +3,7 @@ import { assert } from "chai"; import { buildModule } from "../src/build-module"; import { ModuleParameterRuntimeValueImplementation } from "../src/internal/module"; -import { ModuleParameterType } from "../src/types/module"; +import { SolidityParameterType } from "../src/types/module"; import { assertInstanceOf } from "./helpers"; @@ -61,7 +61,7 @@ describe("getParameter", () => { }); it("Should accept arrays as deafult", () => { - const defaultValue: ModuleParameterType = [1, "dos", 3n, false]; + const defaultValue: SolidityParameterType = [1, "dos", 3n, false]; const mod = buildModule("MyModule", (m) => { const p = m.getParameter("p", defaultValue); @@ -77,7 +77,7 @@ describe("getParameter", () => { }); it("Should accept objects as deafult", () => { - const defaultValue: ModuleParameterType = { a: 1, b: "dos", c: 3n }; + const defaultValue: SolidityParameterType = { a: 1, b: "dos", c: 3n }; const mod = buildModule("MyModule", (m) => { const p = m.getParameter("p", defaultValue); @@ -93,7 +93,7 @@ describe("getParameter", () => { }); it("Should accept complex combinations as default", () => { - const defaultValue: ModuleParameterType = { + const defaultValue: SolidityParameterType = { arr: [123, { a: [{ o: true }] }], }; const mod = buildModule("MyModule", (m) => { @@ -109,5 +109,23 @@ describe("getParameter", () => { assert.equal(param.name, "p"); assert.deepEqual(param.defaultValue, defaultValue); }); + + it("should accept account runtime values as default", () => { + const mod = buildModule("MyModule", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + + const contract = m.contract("Contract", [p]); + + return { contract }; + }); + + const param = mod.results.contract.constructorArgs[0]; + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.deepEqual(param.defaultValue, { + accountIndex: 1, + type: "ACCOUNT", + }); + }); }); }); diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts index 16ba67d941..ad8eb0be68 100644 --- a/packages/core/test/ignition-module-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -622,6 +622,17 @@ describe("stored deployment serializer", () => { assertSerializableModuleIn(module); }); + + it("should support ModuleParameterRuntimeValue with AccountRuntimeValue default value as arguments", () => { + const module = buildModule("Module", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + const contract1 = m.contract("Contract1", [p]); + + return { contract1 }; + }); + + assertSerializableModuleIn(module); + }); }); }); diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 1f3474c716..3e0b523b5d 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -219,6 +219,53 @@ describe("Reconciliation", () => { }, ]); }); + + it("should reconcile an unchanged ModuleParameter", async () => { + const moduleDefinition = buildModule("Module1", (m) => { + const accountParam3 = m.getParameter("account3", m.getAccount(3)); + const contract1 = m.contract("Contract1", [accountParam3]); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: [exampleAccounts[3]], + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, []); + }); + + it("should flag as unreconsiliable a changed ModuleParameter where the history indicates a different account", async () => { + const moduleDefinition = buildModule("Module1", (m) => { + const accountParam2 = m.getParameter("account2", m.getAccount(2)); + const contract1 = m.contract("Contract1", [accountParam2]); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: [exampleAccounts[3]], + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module1#Contract1", + failure: `Argument at index 0 has been changed`, + }, + ]); + }); }); describe("dependencies", () => { diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 7fc7161896..771477d552 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -919,6 +919,93 @@ m.staticCall(..., { id: "MyUniqueId"})` ); }); + it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "pure", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + + const another = m.contract("Another", fakerArtifact, []); + m.staticCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); + + await assert.isFulfilled( + validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "pure", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(-1)); + + const another = m.contract("Another", fakerArtifact, []); + m.staticCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL + ); + + assertValidationError( + await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + "Account index cannot be a negative number" + ); + }); + it("should not validate a negative account index", async () => { const fakerArtifact: Artifact = { ...fakeArtifact, diff --git a/packages/core/test/utils/replace-within-arg.ts b/packages/core/test/utils/replace-within-arg.ts index e714d700a5..dfb744ccf2 100644 --- a/packages/core/test/utils/replace-within-arg.ts +++ b/packages/core/test/utils/replace-within-arg.ts @@ -1,7 +1,11 @@ /* eslint-disable import/no-unused-modules */ import { assert } from "chai"; -import { ArgumentType, SolidityParameterType } from "../../src"; +import { + ArgumentType, + SolidityParameterType, + isAccountRuntimeValue, +} from "../../src"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, @@ -25,7 +29,15 @@ describe("Arg resolution", () => { _kind: "ModuleParameterRuntimeValue", moduleId: mprv.moduleId, name: mprv.name, - defaultValue: mprv.defaultValue ?? "na", + defaultValue: + mprv.defaultValue === undefined + ? "na" + : isAccountRuntimeValue(mprv.defaultValue) + ? { + _kind: "AccountRuntimeValue", + accountIndex: mprv.defaultValue.accountIndex, + } + : mprv.defaultValue, }), bigint: (bi) => `${bi.toString()}n`, future: (f) => ({ _kind: "FutureToken", futureId: f.id }), diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol new file mode 100644 index 0000000000..67f06f801c --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract Owner { + address public owner; + + constructor() { + owner = msg.sender; + } + + function setOwner(address _owner) public { + owner = _owner; + } +} diff --git a/packages/hardhat-plugin/test/module-api/params.ts b/packages/hardhat-plugin/test/module-api/params.ts index 9ea00b73ed..d76c90bb16 100644 --- a/packages/hardhat-plugin/test/module-api/params.ts +++ b/packages/hardhat-plugin/test/module-api/params.ts @@ -82,6 +82,52 @@ describe("module parameters", () => { assert.equal(await result.greeter.read.getGreeting(), "NotExample"); }); + + it("should be able to retrieve a default AccountRuntimeValue", async function () { + const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => { + const newOwner = m.getParameter("newOwner", m.getAccount(1)); + + const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) }); + + m.call(ownerContract, "setOwner", [newOwner]); + + return { ownerContract }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition); + + const v = (await result.ownerContract.read.owner()) as string; + + const accounts = await this.hre.network.provider.send("eth_accounts"); + + assert.equal(v.toLowerCase(), accounts[1]); + }); + + it("should be able to override a default AccountRuntimeValue", async function () { + const moduleDefinition = buildModule("WithDefaultAccountModule", (m) => { + const newOwner = m.getParameter("newOwner", m.getAccount(1)); + + const ownerContract = m.contract("Owner", [], { from: m.getAccount(0) }); + + m.call(ownerContract, "setOwner", [newOwner]); + + return { ownerContract }; + }); + + const accounts = await this.hre.network.provider.send("eth_accounts"); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + parameters: { + WithDefaultAccountModule: { + newOwner: accounts[2], + }, + }, + }); + + const v = (await result.ownerContract.read.owner()) as string; + + assert.equal(v.toLowerCase(), accounts[2]); + }); }); describe("params validation", () => { From d8889a5e5e3b6b1d277dfa8937395e161367e871 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 25 Jan 2024 18:09:25 +0000 Subject: [PATCH 1136/1302] chore: bump version to v0.13.2 Update the packages versions and changelogs for the `0.13.2 - 2024-01-25` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/viem-sample/package.json | 4 +- package-lock.json | 44 ++++++++++----------- packages/core/.npmignore | 3 +- packages/core/CHANGELOG.md | 11 ++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/.npmignore | 1 - packages/hardhat-plugin-ethers/CHANGELOG.md | 11 ++++++ packages/hardhat-plugin-ethers/package.json | 13 ++---- packages/hardhat-plugin-viem/.npmignore | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 11 ++++++ packages/hardhat-plugin-viem/package.json | 13 ++---- packages/hardhat-plugin/.npmignore | 1 - packages/hardhat-plugin/CHANGELOG.md | 11 ++++++ packages/hardhat-plugin/package.json | 13 ++---- packages/ui/package.json | 4 +- 19 files changed, 91 insertions(+), 69 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index da4c714431..9e02198806 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.13.1", + "version": "0.13.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 7f4e1296c5..29b3b5f128 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.13.1", + "version": "0.13.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 3c630a0d80..8eac6c8fd0 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.13.1", + "version": "0.13.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 23cacccb10..d9660d810f 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.13.1", + "version": "0.13.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 5a88d0e259..bf6d28fb4d 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.13.1", + "version": "0.13.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.1", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.2", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 42a115afc5..29a90c3bbf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.13.1", + "version": "0.13.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -66,12 +66,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.13.1", + "version": "0.13.2", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -79,9 +79,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.13.1", + "version": "0.13.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -89,9 +89,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.13.1", + "version": "0.13.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -99,9 +99,9 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.13.1", + "version": "0.13.2", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.1", + "@nomicfoundation/hardhat-ignition-viem": "^0.13.2", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -19860,7 +19860,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -19912,11 +19912,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.1", - "@nomicfoundation/ignition-ui": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-ui": "^0.13.2", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -19937,7 +19937,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -19947,15 +19947,15 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.1", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/hardhat-ignition": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.13.2", "ethers": "^6.7.0", "hardhat": "^2.18.0" } }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^1.0.0", @@ -19964,9 +19964,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.1", + "@nomicfoundation/hardhat-ignition": "^0.13.2", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", "hardhat": "^2.18.0", "viem": "^1.18.1" } @@ -20005,10 +20005,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.1", + "version": "0.13.2", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/.npmignore b/packages/core/.npmignore index 7de3b8a149..be9a7c521f 100644 --- a/packages/core/.npmignore +++ b/packages/core/.npmignore @@ -6,10 +6,11 @@ coverage/ .nycrc .prettierignore .prettierrc +src/ !dist +!dist/src dist/test dist/test-integrations test/ -src/ temp test-integrations/ diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 2ddc2a9dd0..ca2145391a 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + ## 0.13.1 - 2023-12-19 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 666c5b9649..f82c747edb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-plugin-ethers/.npmignore index 77b73f35d4..ecceab5f3a 100644 --- a/packages/hardhat-plugin-ethers/.npmignore +++ b/packages/hardhat-plugin-ethers/.npmignore @@ -7,7 +7,6 @@ post-build.js .nycrc .prettierignore .prettierrc -!dist dist/test src/ test/ diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 755bc87673..76a4944cb9 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + ## 0.13.1 - 2023-12-19 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index c5a2fa051f..b8c1b7be1e 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -19,13 +19,6 @@ ], "main": "dist/src/index.js", "types": "dist/src/index.d.ts", - "files": [ - "dist/src/", - "src/", - "LICENSE", - "README.md", - "CHANGELOG.md" - ], "scripts": { "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", @@ -47,8 +40,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.1", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/hardhat-ignition": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.13.2", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-plugin-viem/.npmignore index 77b73f35d4..05c3ff7c9f 100644 --- a/packages/hardhat-plugin-viem/.npmignore +++ b/packages/hardhat-plugin-viem/.npmignore @@ -7,8 +7,8 @@ post-build.js .nycrc .prettierignore .prettierrc -!dist dist/test src/ test/ +scripts/ esbuild.js diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index d7aeb5cb75..e50b2a239f 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + ## 0.13.1 - 2023-12-19 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 240a827063..850311f313 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -19,13 +19,6 @@ ], "main": "dist/src/index.js", "types": "dist/src/index.d.ts", - "files": [ - "dist/src/", - "src/", - "LICENSE", - "README.md", - "CHANGELOG.md" - ], "scripts": { "prebuild": "ts-node ./scripts/compile-test-fixture-projects.ts", "build": "tsc --build", @@ -47,9 +40,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.1", + "@nomicfoundation/hardhat-ignition": "^0.13.2", "@nomicfoundation/hardhat-viem": "^1.0.0", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", "hardhat": "^2.18.0", "viem": "^1.18.1" } diff --git a/packages/hardhat-plugin/.npmignore b/packages/hardhat-plugin/.npmignore index 77b73f35d4..ecceab5f3a 100644 --- a/packages/hardhat-plugin/.npmignore +++ b/packages/hardhat-plugin/.npmignore @@ -7,7 +7,6 @@ post-build.js .nycrc .prettierignore .prettierrc -!dist dist/test src/ test/ diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 46a6e36584..e7714cce3c 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.13.2 - 2024-01-25 + +### Fixed + +- Add memory pool lookup retry to reduce errors from slow propogation ([#667](https://github.com/NomicFoundation/hardhat-ignition/pull/667)) + +### Added + +- Improve Module API typescript doc comments to enhance intellisense experience ([#642](https://github.com/NomicFoundation/hardhat-ignition/issues/642)) +- Support module parameters taking accounts as the default value ([673](https://github.com/NomicFoundation/hardhat-ignition/issues/673)) + ## 0.13.1 - 2023-12-19 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 10c7d46ad6..77e53836cf 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.1", + "version": "0.13.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -18,13 +18,6 @@ ], "main": "dist/src/index.js", "types": "dist/src/index.d.ts", - "files": [ - "dist/src/", - "src/", - "LICENSE", - "README.md", - "CHANGELOG.md" - ], "exports": { ".": "./dist/src/index.js", "./modules": "./dist/src/modules.js", @@ -66,8 +59,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.1", - "@nomicfoundation/ignition-ui": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-ui": "^0.13.2", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index aa8e1befe9..d1238b8f45 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.1", + "version": "0.13.2", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -17,7 +17,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.1", + "@nomicfoundation/ignition-core": "^0.13.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From 81efbb998bf144ef9e3e53161dfba1f9141ad5ac Mon Sep 17 00:00:00 2001 From: Zoey Date: Mon, 19 Feb 2024 18:23:43 -0500 Subject: [PATCH 1137/1302] Add reviver function to parse bigint notation (#698) Support module parameter files containing `bigint` values. Encode them as strings matching /d+n/ format. Update exit codes for failed runs of the deployed task to be non-zero. This was picked up in setting up integration tests for the module parameter file. Fixes #663 --------- Co-authored-by: John Kane --- packages/hardhat-plugin/src/index.ts | 51 +++++++---- .../hardhat-plugin/src/utils/bigintReviver.ts | 16 ++++ .../fixture-projects/lock/contracts/Lock.sol | 38 +++++++++ .../fixture-projects/lock/hardhat.config.js | 12 +++ .../lock/ignition/modules/Lock.ts | 15 ++++ .../parameters-bigints-as-strings.json | 6 ++ .../modules/parameters-too-large.json | 5 ++ .../lock/ignition/modules/parameters.json | 5 ++ .../hardhat-plugin/test/module-parameters.ts | 84 +++++++++++++++++++ .../test/utils/bigintReviver.ts | 19 +++++ 10 files changed, 235 insertions(+), 16 deletions(-) create mode 100644 packages/hardhat-plugin/src/utils/bigintReviver.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json create mode 100644 packages/hardhat-plugin/test/module-parameters.ts create mode 100644 packages/hardhat-plugin/test/utils/bigintReviver.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index dfdb3b3864..0bfdeb8ffe 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -5,7 +5,7 @@ import { IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; -import { readdirSync, rm } from "fs-extra"; +import { readFile, readdirSync, rm } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { HardhatPluginError, @@ -15,6 +15,7 @@ import path from "path"; import "./type-extensions"; import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; +import { bigintReviver } from "./utils/bigintReviver"; import { getApiKeyAndUrls } from "./utils/getApiKeyAndUrls"; import { resolveDeploymentId } from "./utils/resolve-deployment-id"; import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; @@ -167,7 +168,7 @@ ignitionScope "Deploy cancelled: Cannot reset deployment on ephemeral Hardhat network" ); - process.exit(0); + process.exit(1); } else { await rm(deploymentDir, { recursive: true, force: true }); } @@ -179,17 +180,17 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); - process.exit(0); + process.exit(1); } let parameters: DeploymentParameters | undefined; if (parametersInput === undefined) { - parameters = resolveParametersFromModuleName( + parameters = await resolveParametersFromModuleName( userModule.id, hre.config.paths.ignition ); } else if (parametersInput.endsWith(".json")) { - parameters = resolveParametersFromFileName(parametersInput); + parameters = await resolveParametersFromFileName(parametersInput); } else { parameters = resolveParametersString(parametersInput); } @@ -225,6 +226,10 @@ ignitionScope { deploymentId } ); } + + if (result.type !== "SUCCESSFUL_DEPLOYMENT") { + process.exit(1); + } } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { throw new NomicLabsHardhatPluginError( @@ -266,7 +271,7 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); - process.exit(0); + process.exit(1); } try { @@ -456,10 +461,10 @@ ignitionScope } }); -function resolveParametersFromModuleName( +async function resolveParametersFromModuleName( moduleName: string, ignitionPath: string -): DeploymentParameters | undefined { +): Promise { const files = readdirSync(ignitionPath); const configFilename = `${moduleName}.config.json`; @@ -468,26 +473,40 @@ function resolveParametersFromModuleName( : undefined; } -function resolveParametersFromFileName(fileName: string): DeploymentParameters { +async function resolveParametersFromFileName( + fileName: string +): Promise { const filepath = path.resolve(process.cwd(), fileName); return resolveConfigPath(filepath); } -function resolveConfigPath(filepath: string): DeploymentParameters { +async function resolveConfigPath( + filepath: string +): Promise { try { - return require(filepath); - } catch { + const rawFile = await readFile(filepath); + + return JSON.parse(rawFile.toString(), bigintReviver); + } catch (e) { + if (e instanceof NomicLabsHardhatPluginError) { + throw e; + } + console.warn(`Could not parse parameters from ${filepath}`); - process.exit(0); + process.exit(1); } } function resolveParametersString(paramString: string): DeploymentParameters { try { - return JSON.parse(paramString); - } catch { + return JSON.parse(paramString, bigintReviver); + } catch (e) { + if (e instanceof NomicLabsHardhatPluginError) { + throw e; + } + console.warn(`Could not parse JSON parameters`); - process.exit(0); + process.exit(1); } } diff --git a/packages/hardhat-plugin/src/utils/bigintReviver.ts b/packages/hardhat-plugin/src/utils/bigintReviver.ts new file mode 100644 index 0000000000..11bb67e3e9 --- /dev/null +++ b/packages/hardhat-plugin/src/utils/bigintReviver.ts @@ -0,0 +1,16 @@ +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export function bigintReviver(key: string, value: any): any { + if (typeof value === "string" && /^\d+n$/.test(value)) { + return BigInt(value.slice(0, -1)); + } + + if (typeof value === "number" && value > Number.MAX_SAFE_INTEGER) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Parameter "${key}" exceeds maximum safe integer size. Encode the value as a string using bigint notation: \`$\{value\}n\`` + ); + } + + return value; +} diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol b/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol new file mode 100644 index 0000000000..122a274464 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// Uncomment this line to use console.log +// import "hardhat/console.sol"; + +contract Lock { + uint public unlockTime; + address payable public owner; + + event Withdrawal(uint amount, uint when); + + constructor(uint _unlockTime) payable { + require( + block.timestamp < _unlockTime, + "Unlock time should be in the future" + ); + + unlockTime = _unlockTime; + owner = payable(msg.sender); + } + + function test() public { + emit Withdrawal(address(this).balance, block.timestamp); + } + + function withdraw() public { + // Uncomment this line, and the import of "hardhat/console.sol", to print a log in your terminal + // console.log("Unlock time is %o and block timestamp is %o", unlockTime, block.timestamp); + + require(block.timestamp >= unlockTime, "You can't withdraw yet"); + require(msg.sender == owner, "You aren't the owner"); + + emit Withdrawal(address(this).balance, block.timestamp); + + owner.transfer(address(this).balance); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js new file mode 100644 index 0000000000..791b28f337 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts new file mode 100644 index 0000000000..8b88fea646 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts @@ -0,0 +1,15 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; + +const LockModule = buildModule("LockModule", (m) => { + const unlockTime = m.getParameter("unlockTime"); + const lockedAmount = m.getParameter("lockedAmount", 1_000_000_000n); + + const lock = m.contract("Lock", [unlockTime], { + value: lockedAmount, + }); + + return { lock }; +}); + +// eslint-disable-next-line import/no-default-export +export default LockModule; diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json new file mode 100644 index 0000000000..f84de04388 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json @@ -0,0 +1,6 @@ +{ + "LockModule": { + "unlockTime": "1893499200000n", + "lockedAmount": "2000000000000n" + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json new file mode 100644 index 0000000000..0fe07f2b2a --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json @@ -0,0 +1,5 @@ +{ + "LockModule": { + "unlockTime": 1893499200000000000 + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json new file mode 100644 index 0000000000..914e9c7c4e --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json @@ -0,0 +1,5 @@ +{ + "LockModule": { + "unlockTime": 1893499200000 + } +} diff --git a/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-plugin/test/module-parameters.ts new file mode 100644 index 0000000000..e8ad354ddd --- /dev/null +++ b/packages/hardhat-plugin/test/module-parameters.ts @@ -0,0 +1,84 @@ +/* eslint-disable import/no-unused-modules */ + +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; + +describe("module parameters", () => { + describe("a standard hardhat project", () => { + useEphemeralIgnitionProject("lock"); + + it("should run if provided with a valid module parameters file", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters.json", + } + ); + }); + + it("should run if provided with a valid module parameters file encoding a bigint as a string", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-bigints-as-strings.json", + } + ); + }); + + it("should fail if the module path is invalid", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/nonexistant.ts", + } + ), + /Could not find a module file at the path: .\/ignition\/modules\/nonexistant.ts/ + ); + }); + + it("should fail if the module parameters path is invalid", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/nonexistant.ts", + parameters: "./ignition/modules/nonexistant.json", + } + ), + /Could not find a module file at the path: .\/ignition\/modules\/nonexistant.ts/ + ); + }); + + it("should fail if parameters file number is larger than allowed", async function () { + await assert.isRejected( + this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-too-large.json", + } + ), + /Parameter "unlockTime" exceeds maximum safe integer size. Encode the value as a string using bigint notation: `\${value}n`/ + ); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/utils/bigintReviver.ts b/packages/hardhat-plugin/test/utils/bigintReviver.ts new file mode 100644 index 0000000000..029094e9bd --- /dev/null +++ b/packages/hardhat-plugin/test/utils/bigintReviver.ts @@ -0,0 +1,19 @@ +import { assert } from "chai"; + +import { bigintReviver } from "../../src/utils/bigintReviver"; + +describe("bigintReviver", function () { + it('should convert number strings ending with "n" to BigInt', function () { + assert.deepEqual(JSON.parse('{"a":"1n"}', bigintReviver), { a: BigInt(1) }); + }); + + it("should throw if a number is bigger than Number.MAX_SAFE_INTEGER", function () { + assert.throws(() => { + JSON.parse('{"a":9007199254740992}', bigintReviver); + }, `Parameter "a" exceeds maximum safe integer size. Encode the value as a string using bigint notation: \`$\{value\}n\``); + }); + + it("should not convert regular numbers", function () { + assert.deepEqual(JSON.parse('{"a":1}', bigintReviver), { a: 1 }); + }); +}); From 68c27b88e518a490558028f3b1d748194b40e8a5 Mon Sep 17 00:00:00 2001 From: Zoey Date: Wed, 21 Feb 2024 05:51:27 -0500 Subject: [PATCH 1138/1302] chore(hardhat-ignition-viem): upgrade to viem@2 (#697) Update `hardhat-ignition-viem` to use `viem@2`, this requires updating the version of `hardhat-viem` used to `2.0.0` to get its `viem@2` version. Resolves #692 --- package-lock.json | 2958 +++++++++-------- packages/hardhat-plugin-viem/package.json | 6 +- .../src/viem-ignition-helper.ts | 6 +- packages/hardhat-plugin/package.json | 2 +- .../test/test-helpers/test-ignition-helper.ts | 21 +- 5 files changed, 1550 insertions(+), 1443 deletions(-) diff --git a/package-lock.json b/package-lock.json index 29a90c3bbf..74949b74cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -107,6 +107,157 @@ "prettier-plugin-solidity": "1.1.3" } }, + "examples/viem-sample/node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", + "dev": true, + "peer": true + }, + "examples/viem-sample/node_modules/@nomicfoundation/hardhat-toolbox-viem": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox-viem/-/hardhat-toolbox-viem-2.0.0.tgz", + "integrity": "sha512-1bxTaC+PcbdctwgP/AvmKJGQTeLoT2kJtAfaDvt5PbL3esZ1EO+pfoBkpliP3DJSNESLSqAjVN1yIFxoLJmiBg==", + "dev": true, + "dependencies": { + "chai-as-promised": "^7.1.1" + }, + "peerDependencies": { + "@nomicfoundation/hardhat-network-helpers": "^1.0.0", + "@nomicfoundation/hardhat-verify": "^2.0.0", + "@nomicfoundation/hardhat-viem": "^1.0.0", + "@types/chai": "^4.2.0", + "@types/chai-as-promised": "^7.1.6", + "@types/mocha": ">=9.1.0", + "@types/node": ">=16.0.0", + "chai": "^4.2.0", + "hardhat": "^2.11.0", + "hardhat-gas-reporter": "^1.0.8", + "solidity-coverage": "^0.8.1", + "ts-node": ">=8.0.0", + "typescript": "~5.0.4", + "viem": "^1.15.1" + } + }, + "examples/viem-sample/node_modules/@nomicfoundation/hardhat-viem": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-1.0.4.tgz", + "integrity": "sha512-6coot+y0y6d75DG33zAdgXlktNp1MRy2B3vDjqlRBaubqlocYak+BSyryiv76F9JuLLgNSxkxTIZCd24h9gKcQ==", + "dev": true, + "peer": true, + "dependencies": { + "abitype": "^0.9.8", + "lodash.memoize": "^4.1.2" + }, + "peerDependencies": { + "hardhat": "^2.17.0", + "typescript": "~5.0.0", + "viem": "^1.15.1" + } + }, + "examples/viem-sample/node_modules/abitype": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", + "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peer": true, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "examples/viem-sample/node_modules/viem": { + "version": "1.21.4", + "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.4.tgz", + "integrity": "sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wevm" + } + ], + "peer": true, + "dependencies": { + "@adraffy/ens-normalize": "1.10.0", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@scure/bip32": "1.3.2", + "@scure/bip39": "1.2.1", + "abitype": "0.9.8", + "isows": "1.0.3", + "ws": "8.13.0" + }, + "peerDependencies": { + "typescript": ">=5.0.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "examples/viem-sample/node_modules/viem/node_modules/abitype": { + "version": "0.9.8", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", + "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peer": true, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.19.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, + "examples/viem-sample/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -117,9 +268,9 @@ } }, "node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" }, "node_modules/@ampproject/remapping": { "version": "2.2.1", @@ -228,21 +379,21 @@ } }, "node_modules/@babel/core": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.5.tgz", - "integrity": "sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", + "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-compilation-targets": "^7.22.15", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.5", - "@babel/parser": "^7.23.5", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5", + "@babel/helpers": "^7.23.9", + "@babel/parser": "^7.23.9", + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -273,12 +424,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -300,14 +451,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", - "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.15", - "browserslist": "^4.21.9", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -315,6 +466,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -450,14 +610,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.5.tgz", - "integrity": "sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.5", - "@babel/types": "^7.23.5" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" @@ -549,9 +709,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", + "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -606,9 +766,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.5.tgz", - "integrity": "sha512-NdUTHcPe4C99WxPub+K9l9tK5/lV4UXIoaHSYgzco9BCyjKAAwzdBI+wWtYqHt7LJdbo74ZjRPJgzVweq1sz0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -617,34 +777,34 @@ } }, "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", + "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", + "@babel/generator": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -661,9 +821,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", + "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -680,29 +840,6 @@ "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", "dev": true }, - "node_modules/@chainsafe/as-sha256": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@chainsafe/as-sha256/-/as-sha256-0.3.1.tgz", - "integrity": "sha512-hldFFYuf49ed7DAakWVXSJODuq3pzJEguD8tQ7h+sGkM18vja+OFoJI9krnGmgzyuZC2ETX0NOIcCTy31v2Mtg==" - }, - "node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.4.2.tgz", - "integrity": "sha512-lLO3ihKPngXLTus/L7WHKaw9PnNJWizlOF1H9NNzHP6Xvh82vzg9F2bzkXhYIFshMZ2gTCEz8tq6STe7r5NDfQ==", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" - } - }, - "node_modules/@chainsafe/ssz": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.9.4.tgz", - "integrity": "sha512-77Qtg2N1ayqs4Bg/wvnWfg5Bta7iy7IRh8XqXh7oNMeP2HBbBwx8m6yTpA8p0EHItWPEBkgZd5S5/LSlp3GXuQ==", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.4.2", - "case": "^1.6.3" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1571,9 +1708,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", + "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1622,20 +1759,20 @@ } }, "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.3" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", "engines": { "node": ">= 16" }, @@ -1644,27 +1781,39 @@ } }, "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "dependencies": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" } }, "node_modules/@ethersproject/abi": { @@ -2526,28 +2675,28 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", + "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", "dev": true, "dependencies": { - "@floating-ui/utils": "^0.1.3" + "@floating-ui/utils": "^0.2.1" } }, "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", + "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", "dev": true, "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" } }, "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", + "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", "dev": true }, "node_modules/@fontsource/roboto": { @@ -2557,13 +2706,13 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -2584,9 +2733,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", "dev": true }, "node_modules/@istanbuljs/load-nyc-config": { @@ -2605,6 +2754,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -2718,9 +2876,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "devOptional": true, "engines": { "node": ">=6.0.0" @@ -2742,9 +2900,9 @@ "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", + "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2932,338 +3090,213 @@ } }, "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.2.tgz", - "integrity": "sha512-hSe6CuHI4SsSiWWjHDIzWhSiAVpzMUcDRpWYzN0T9l8/Rz7xNn3elwVOJ/tAyS0LqL6vitUD78Uk7lQDXZun7Q==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1" + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", + "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-block/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.2.tgz", - "integrity": "sha512-8UUsSXJs+MFfIIAKdh3cG16iNmWzWC/91P40sazNvrqhhdR/RtGDlFk2iFTGbBAZPs2+klZVzhRX8m2wvuvz3w==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-ethash": "3.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", + "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-ethash": "3.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "level": "^8.0.0", - "lru-cache": "^5.1.1", - "memory-level": "^1.0.0" + "lru-cache": "^10.0.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.2.tgz", - "integrity": "sha512-I2WGP3HMGsOoycSdOTSqIaES0ughQTueOsddJ36aYVpI3SN8YSusgRFLwzDJwRFVIYDKx/iJz0sQ5kBHVgdDwg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.2", - "crc-32": "^1.2.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" } }, "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.2.tgz", - "integrity": "sha512-8PfoOQCcIcO9Pylq0Buijuq/O73tmMVURK0OqdjhwqcGHYC2PwhbajDh7GZ55ekB0Px197ajK3PQhpKoiI/UPg==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "abstract-level": "^1.0.3", - "bigint-crypto-utils": "^3.0.23", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", + "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "bigint-crypto-utils": "^3.2.2", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.2.tgz", - "integrity": "sha512-rBLcUaUfANJxyOx9HIdMX6uXGin6lANCulIm/pjMgRqfiCRMZie3WKYxTSd8ZE/d+qT+zTedBF4+VHTdTSePmQ==", - "dependencies": { - "@ethersproject/providers": "^5.7.1", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", + "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@types/debug": "^4.1.9", "debug": "^4.3.3", "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.2.tgz", - "integrity": "sha512-QwmemBc+MMsHJ1P1QvPl8R8p2aPvvVcKBbvHnQOKBpBztEo0omN0eaob6FeZS/e3y9NSe+mfu3nNFBHszqkjTA==", - "bin": { - "rlp": "bin/rlp" + "rustbn-wasm": "^0.2.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.2.tgz", - "integrity": "sha512-dlKy5dIXLuDubx8Z74sipciZnJTRSV/uHG48RSijhgm1V7eXYFC567xgKtsKiVZB1ViTP9iFL4B6Je0xD6X2OA==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "ethers": "^5.7.1", - "js-sdsl": "^4.1.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@nomicfoundation/ethereumjs-statemanager/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "bin": { + "rlp": "bin/rlp.cjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-statemanager": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", + "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "debug": "^4.3.3", + "ethereum-cryptography": "0.1.3", + "js-sdsl": "^4.1.4", + "lru-cache": "^10.0.0" + }, + "peerDependencies": { + "@nomicfoundation/ethereumjs-verkle": "0.0.2" + }, + "peerDependenciesMeta": { + "@nomicfoundation/ethereumjs-verkle": { + "optional": true + } } }, "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.2.tgz", - "integrity": "sha512-yw8vg9hBeLYk4YNg5MrSJ5H55TLOv2FSWUTROtDtTMMmDGROsAu+0tBjiNGTnKRi400M6cEzoFfa89Fc5k8NTQ==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", + "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "@types/readable-stream": "^2.3.13", "ethereum-cryptography": "0.1.3", + "lru-cache": "^10.0.0", "readable-stream": "^3.6.0" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.2.tgz", - "integrity": "sha512-T+l4/MmTp7VhJeNloMkM+lPU3YMUaXdcXgTGCf8+ZFvV9NYZTRLFekRwlG6/JMmVfIfbrW+dRRJ9A6H5Q/Z64g==", - "dependencies": { - "@chainsafe/ssz": "^0.9.2", - "@ethersproject/providers": "^5.7.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", + "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", + "dependencies": { + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.2.tgz", - "integrity": "sha512-4Wu9D3LykbSBWZo8nJCnzVIYGvGCuyiYLIJa9XXNVt1q1jUzHdB+sJvx95VGCpPkCT+IbLecW6yfzy3E1bQrwQ==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dependencies": { - "@chainsafe/ssz": "^0.10.0", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" - } - }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/persistent-merkle-tree": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@chainsafe/persistent-merkle-tree/-/persistent-merkle-tree-0.5.0.tgz", - "integrity": "sha512-l0V1b5clxA3iwQLXP40zYjyZYospQLZXzBVIhhr9kDg/1qHZfzzHw0jj4VPBijfYCArZDlPkRi1wZaV2POKeuw==", - "dependencies": { - "@chainsafe/as-sha256": "^0.3.1" + "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, - "node_modules/@nomicfoundation/ethereumjs-util/node_modules/@chainsafe/ssz": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@chainsafe/ssz/-/ssz-0.10.2.tgz", - "integrity": "sha512-/NL3Lh8K+0q7A3LsiFq09YXS9fPE+ead2rr7vM2QK8PLzrNsw3uqrif9bpRX5UxgeRjM+vYi+boCM3+GM4ovXg==", + "node_modules/@nomicfoundation/ethereumjs-verkle": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", + "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", "dependencies": { - "@chainsafe/as-sha256": "^0.3.1", - "@chainsafe/persistent-merkle-tree": "^0.5.0" + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "lru-cache": "^10.0.0", + "rust-verkle-wasm": "^0.0.1" + }, + "engines": { + "node": ">=18" } }, "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.2.tgz", - "integrity": "sha512-Bj3KZT64j54Tcwr7Qm/0jkeZXJMfdcAtRBedou+Hx0dPOSIgqaIr0vvLwP65TpHbak2DmAq+KJbW2KNtIoFwvA==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", + "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", + "dependencies": { + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "mcl-wasm": "^0.7.1", - "rustbn.js": "~0.2.0" + "ethereum-cryptography": "0.1.3" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.2.tgz", - "integrity": "sha512-9Wu9mRtkj0U9ohgXYFbB/RQDa+PcEdyBm2suyEtsJf3PqzZEEjLUZgWnMjlFhATMk/fp3BjmnYVPrwl+gr8oEw==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz", + "integrity": "sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==", "dev": true, "peer": true, "dependencies": { @@ -3342,35 +3375,10 @@ "typescript": ">=4.5.0" } }, - "node_modules/@nomicfoundation/hardhat-toolbox-viem": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox-viem/-/hardhat-toolbox-viem-2.0.0.tgz", - "integrity": "sha512-1bxTaC+PcbdctwgP/AvmKJGQTeLoT2kJtAfaDvt5PbL3esZ1EO+pfoBkpliP3DJSNESLSqAjVN1yIFxoLJmiBg==", - "dev": true, - "dependencies": { - "chai-as-promised": "^7.1.1" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", - "@nomicfoundation/hardhat-viem": "^1.0.0", - "@types/chai": "^4.2.0", - "@types/chai-as-promised": "^7.1.6", - "@types/mocha": ">=9.1.0", - "@types/node": ">=16.0.0", - "chai": "^4.2.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typescript": "~5.0.4", - "viem": "^1.15.1" - } - }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.2.tgz", - "integrity": "sha512-SXmLPHrfh801m0Dj/8v4stAM6OI0tFktDlWe1pn3k43bCCjn5TGqcVy7hCtauG8/AlQWNZhR+01qTovSSVTvXQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.4.tgz", + "integrity": "sha512-B8ZjhOrmbbRWqJi65jvQblzjsfYktjqj2vmOm+oc2Vu8drZbT2cjeSCRHZKbS7lOtfW78aJZSFvw+zRLCiABJA==", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -3480,9 +3488,9 @@ } }, "node_modules/@nomicfoundation/hardhat-viem": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-1.0.1.tgz", - "integrity": "sha512-zylTUNLf4SqWGCiJVhoCVus4+h1xkSQl78QdjPBfnZQHsW4Ik9NjGGflIdov43pmPiJOzL8Ry7F2hjWe5bqqwQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-2.0.0.tgz", + "integrity": "sha512-ilXQKTc1jWHqJ66fAN6TIyCRyormoChOn1yQTCGoBQ+G6QcVCu5FTaGL2r0KUOY4IkTohtphK+UXQrKcxQX5Yw==", "dev": true, "dependencies": { "abitype": "^0.9.8", @@ -3491,7 +3499,31 @@ "peerDependencies": { "hardhat": "^2.17.0", "typescript": "~5.0.0", - "viem": "^1.15.1" + "viem": "^2.7.6" + } + }, + "node_modules/@nomicfoundation/hardhat-viem/node_modules/abitype": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", + "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } } }, "node_modules/@nomicfoundation/ignition-complete-example": { @@ -3809,9 +3841,9 @@ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.3.tgz", - "integrity": "sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==" + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", + "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" }, "node_modules/@remix-run/router": { "version": "1.6.0", @@ -3823,9 +3855,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.6.1.tgz", - "integrity": "sha512-0WQ0ouLejaUCRsL93GD4uft3rOmB8qoQMU05Kb8CmMtMBe7XUDLAltxVZI1q6byNqEtU7N1ZX1Vw5lIpgulLQA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", + "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", "cpu": [ "arm" ], @@ -3837,9 +3869,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.6.1.tgz", - "integrity": "sha512-1TKm25Rn20vr5aTGGZqo6E4mzPicCUD79k17EgTLAsXc1zysyi4xXKACfUbwyANEPAEIxkzwue6JZ+stYzWUTA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", + "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", "cpu": [ "arm64" ], @@ -3851,9 +3883,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.6.1.tgz", - "integrity": "sha512-cEXJQY/ZqMACb+nxzDeX9IPLAg7S94xouJJCNVE5BJM8JUEP4HeTF+ti3cmxWeSJo+5D+o8Tc0UAWUkfENdeyw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", + "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", "cpu": [ "arm64" ], @@ -3865,9 +3897,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.6.1.tgz", - "integrity": "sha512-LoSU9Xu56isrkV2jLldcKspJ7sSXmZWkAxg7sW/RfF7GS4F5/v4EiqKSMCFbZtDu2Nc1gxxFdQdKwkKS4rwxNg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", + "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", "cpu": [ "x64" ], @@ -3879,9 +3911,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.6.1.tgz", - "integrity": "sha512-EfI3hzYAy5vFNDqpXsNxXcgRDcFHUWSx5nnRSCKwXuQlI5J9dD84g2Usw81n3FLBNsGCegKGwwTVsSKK9cooSQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", + "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", "cpu": [ "arm" ], @@ -3893,9 +3925,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.6.1.tgz", - "integrity": "sha512-9lhc4UZstsegbNLhH0Zu6TqvDfmhGzuCWtcTFXY10VjLLUe4Mr0Ye2L3rrtHaDd/J5+tFMEuo5LTCSCMXWfUKw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", + "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", "cpu": [ "arm64" ], @@ -3907,9 +3939,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.6.1.tgz", - "integrity": "sha512-FfoOK1yP5ksX3wwZ4Zk1NgyGHZyuRhf99j64I5oEmirV8EFT7+OhUZEnP+x17lcP/QHJNWGsoJwrz4PJ9fBEXw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", + "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", "cpu": [ "arm64" ], @@ -3920,10 +3952,24 @@ ], "peer": true }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", + "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.6.1.tgz", - "integrity": "sha512-DNGZvZDO5YF7jN5fX8ZqmGLjZEXIJRdJEdTFMhiyXqyXubBa0WVLDWSNlQ5JR2PNgDbEV1VQowhVRUh+74D+RA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", + "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", "cpu": [ "x64" ], @@ -3935,9 +3981,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.6.1.tgz", - "integrity": "sha512-RkJVNVRM+piYy87HrKmhbexCHg3A6Z6MU0W9GHnJwBQNBeyhCJG9KDce4SAMdicQnpURggSvtbGo9xAWOfSvIQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", + "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", "cpu": [ "x64" ], @@ -3949,9 +3995,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.6.1.tgz", - "integrity": "sha512-v2FVT6xfnnmTe3W9bJXl6r5KwJglMK/iRlkKiIFfO6ysKs0rDgz7Cwwf3tjldxQUrHL9INT/1r4VA0n9L/F1vQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", + "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", "cpu": [ "arm64" ], @@ -3963,9 +4009,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.6.1.tgz", - "integrity": "sha512-YEeOjxRyEjqcWphH9dyLbzgkF8wZSKAKUkldRY6dgNR5oKs2LZazqGB41cWJ4Iqqcy9/zqYgmzBkRoVz3Q9MLw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", + "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", "cpu": [ "ia32" ], @@ -3977,9 +4023,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.6.1.tgz", - "integrity": "sha512-0zfTlFAIhgz8V2G8STq8toAjsYYA6eci1hnXuyOTUFnymrtJwnS6uGKiv3v5UrPZkBlamLvrLV2iiaeqCKzb0A==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", + "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", "cpu": [ "x64" ], @@ -4036,9 +4082,9 @@ } }, "node_modules/@scure/base": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.3.tgz", - "integrity": "sha512-/+SgoRjLq7Xlf0CWuLHq2LUZeL/w65kfzAPG5NH9pcmBhs+nunQTn4gvdwgMTIXnt9b2C/1SeL2XiysZEyIC9Q==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", + "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -5188,9 +5234,9 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.7", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", - "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" @@ -5207,9 +5253,9 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.20.4", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", - "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", "dev": true, "dependencies": { "@babel/types": "^7.20.7" @@ -5272,11 +5318,17 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, "dependencies": { "@types/ms": "*" } }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + }, "node_modules/@types/form-data": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", @@ -5384,8 +5436,7 @@ "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/ndjson": { "version": "2.0.1", @@ -5440,16 +5491,16 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.10", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz", - "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==", + "version": "6.9.11", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", + "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", "dev": true, "peer": true }, "node_modules/@types/react": { - "version": "18.2.42", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.42.tgz", - "integrity": "sha512-c1zEr96MjakLYus/wPnuWDo1/zErfdU9rNsIGmE+NV71nx88FG9Ttgo5dqorXTu/LImX2f63WBP986gJkMPNbA==", + "version": "18.2.57", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.57.tgz", + "integrity": "sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -5458,9 +5509,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.17", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.17.tgz", - "integrity": "sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==", + "version": "18.2.19", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", + "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", "dev": true, "dependencies": { "@types/react": "*" @@ -5503,9 +5554,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", + "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", "dev": true }, "node_modules/@types/sinon": { @@ -5789,18 +5840,15 @@ "peer": true }, "node_modules/abitype": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", - "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, "peerDependencies": { "typescript": ">=5.0.4", - "zod": "^3 >=3.19.1" + "zod": "^3 >=3.22.0" }, "peerDependenciesMeta": { "typescript": { @@ -5816,23 +5864,6 @@ "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" }, - "node_modules/abstract-level": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/abstract-level/-/abstract-level-1.0.3.tgz", - "integrity": "sha512-t6jv+xHy+VYwc4xqZMn2Pa9DjcdzvzZmQGRjTFc8spIbRGHgBrEKbPq+rYXc7CCo0lxgYvSgKVg9qZAhpVQSjA==", - "dependencies": { - "buffer": "^6.0.3", - "catering": "^2.1.0", - "is-buffer": "^2.0.5", - "level-supports": "^4.0.0", - "level-transcoder": "^1.0.1", - "module-error": "^1.0.1", - "queue-microtask": "^1.2.3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -5846,9 +5877,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "devOptional": true, "bin": { "acorn": "bin/acorn" @@ -5867,24 +5898,14 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz", - "integrity": "sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "devOptional": true, "engines": { "node": ">=0.4.0" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/adm-zip": { "version": "0.4.16", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", @@ -5947,6 +5968,14 @@ "node": ">=0.4.2" } }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -6064,13 +6093,16 @@ } }, "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6119,17 +6151,36 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "node_modules/array.prototype.filter": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", + "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", + "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -6175,17 +6226,18 @@ } }, "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", "dev": true, "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", "is-shared-array-buffer": "^1.0.2" }, "engines": { @@ -6272,9 +6324,12 @@ } }, "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -6296,13 +6351,13 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", + "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", "dev": true, "peer": true, "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.4", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6488,6 +6543,27 @@ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bplist-parser": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", @@ -6525,17 +6601,6 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" }, - "node_modules/browser-level": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browser-level/-/browser-level-1.0.1.tgz", - "integrity": "sha512-XECYKJ+Dbzw0lbydyQuJzwNXtOpbMSq737qxJN11sIRTErOMShvDpbzTlgju7orJKvx4epULolZAuJGLzCmWRQ==", - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.1", - "module-error": "^1.0.2", - "run-parallel-limit": "^1.1.0" - } - }, "node_modules/browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -6555,9 +6620,9 @@ } }, "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -6574,8 +6639,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", "update-browserslist-db": "^1.0.13" }, @@ -6605,9 +6670,9 @@ } }, "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -6624,7 +6689,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.2.1" + "ieee754": "^1.1.13" } }, "node_modules/buffer-from": { @@ -6740,13 +6805,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6771,12 +6841,14 @@ } }, "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=6" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camelcase-keys": { @@ -6831,9 +6903,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001588", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", + "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", "dev": true, "funding": [ { @@ -6850,31 +6922,15 @@ } ] }, - "node_modules/case": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/case/-/case-1.6.3.tgz", - "integrity": "sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==", - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/catering": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/catering/-/catering-2.1.1.tgz", - "integrity": "sha512-K7Qy8O9p76sL3/3m7/zLKbRkyOlSZAgzEaLhyj2mXS8PsCud2Eo4hAb8aLtZqHh0QGqLcb9dlJSu6lHRVENm1w==", - "engines": { - "node": ">=6" - } + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "node_modules/cbor": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.1.tgz", - "integrity": "sha512-/TQOWyamDxvVIv+DY9cOLNuABkoyz8K/F3QE56539pGVYohx0+MEA1f4lChFTX79dBTBS7R1PF6ovH7G+VtBfQ==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", + "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", "dependencies": { "nofilter": "^3.1.0" }, @@ -6883,9 +6939,9 @@ } }, "node_modules/chai": { - "version": "4.3.10", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", - "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", @@ -7009,15 +7065,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "extraneous": true, "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -7030,6 +7081,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -7038,6 +7092,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "extraneous": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -7072,29 +7127,6 @@ "npm": ">=3.0.0" } }, - "node_modules/cids/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/cids/node_modules/multicodec": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", @@ -7119,26 +7151,10 @@ "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" }, - "node_modules/classic-level": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/classic-level/-/classic-level-1.3.0.tgz", - "integrity": "sha512-iwFAJQYtqRTRM0F6L8h4JCt00ZSGdOyqh7yVrhhjrOpFhmBjNlRUey64MCiyo6UmQHMJ+No3c81nujPv+n9yrg==", - "hasInstallScript": true, - "dependencies": { - "abstract-level": "^1.0.2", - "catering": "^2.1.0", - "module-error": "^1.0.1", - "napi-macros": "^2.2.2", - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/classnames": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", - "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", "dev": true }, "node_modules/clean-stack": { @@ -7149,6 +7165,17 @@ "node": ">=6" } }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-table3": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", @@ -7738,15 +7765,15 @@ } }, "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "dev": true }, "node_modules/cytoscape": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.27.0.tgz", - "integrity": "sha512-pPZJilfX9BxESwujODz5pydeGi+FBrXq1rcaB1mfhFXXFJ9GjE6CNndAk+8jPzoXGD+16LtSS4xlYEIUiW4Abg==", + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz", + "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==", "dev": true, "dependencies": { "heap": "^0.2.6", @@ -8427,16 +8454,19 @@ } }, "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -8469,12 +8499,12 @@ } }, "node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", "dev": true, "dependencies": { - "robust-predicates": "^3.0.0" + "robust-predicates": "^3.0.2" } }, "node_modules/delayed-stream": { @@ -8510,21 +8540,6 @@ "node": ">=4" } }, - "node_modules/detect-port": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz", - "integrity": "sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==", - "dev": true, - "peer": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -8666,9 +8681,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.605", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.605.tgz", - "integrity": "sha512-V52j+P5z6cdRqTjPR/bYNxx7ETCHIkm5VIGuyCy3CMrfSnbEpIlLnk5oHmZo7gYvDfh2TfHeanB6rawyQ23ktg==", + "version": "1.4.677", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz", + "integrity": "sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==", "dev": true }, "node_modules/elkjs": { @@ -8770,50 +8785,52 @@ } }, "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", + "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.7", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.2", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", + "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.1", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.0", + "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", + "typed-array-buffer": "^1.0.1", "typed-array-byte-length": "^1.0.0", "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8822,15 +8839,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -9264,9 +9306,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "engines": { "node": ">=6" } @@ -9404,15 +9446,15 @@ } }, "node_modules/eslint": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.55.0.tgz", - "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "version": "8.56.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", + "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.55.0", + "@eslint/js": "8.56.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -9980,6 +10022,34 @@ "balanced-match": "^1.0.0" } }, + "node_modules/eth-gas-reporter/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/eth-gas-reporter/node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -10052,6 +10122,39 @@ "@ethersproject/wordlists": "5.7.0" } }, + "node_modules/eth-gas-reporter/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eth-gas-reporter/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/eth-gas-reporter/node_modules/minimatch": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", @@ -10066,9 +10169,9 @@ } }, "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "peer": true, "dependencies": { @@ -10079,13 +10182,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -10100,10 +10202,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/eth-gas-reporter/node_modules/ms": { @@ -10113,19 +10211,6 @@ "dev": true, "peer": true }, - "node_modules/eth-gas-reporter/node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/eth-gas-reporter/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10282,9 +10367,9 @@ } }, "node_modules/ethers": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.0.tgz", - "integrity": "sha512-pmfNyQzc2mseLe91FnT2vmNaTt8dDzhxZ/xItAV7uGsF4dI4ek2ufMu3rAkgQETL/TIs0GS5A+U05g9QyWnv3Q==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", + "integrity": "sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==", "funding": [ { "type": "individual", @@ -10296,7 +10381,7 @@ } ], "dependencies": { - "@adraffy/ens-normalize": "1.10.0", + "@adraffy/ens-normalize": "1.10.1", "@noble/curves": "1.2.0", "@noble/hashes": "1.3.2", "@types/node": "18.15.13", @@ -10603,9 +10688,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -10750,15 +10835,15 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.0.tgz", + "integrity": "sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", - "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "version": "1.15.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", + "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", "funding": [ { "type": "individual", @@ -10936,11 +11021,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==" - }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", @@ -10976,15 +11056,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { + "es-errors": "^1.3.0", "function-bind": "^1.1.2", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", "hasown": "^2.0.0" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -11032,13 +11116,14 @@ } }, "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -11241,9 +11326,9 @@ } }, "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -11400,22 +11485,23 @@ } }, "node_modules/hardhat": { - "version": "2.19.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.19.2.tgz", - "integrity": "sha512-CRU3+0Cc8Qh9UpxKd8cLADDPes7ZDtKj4dTK+ERtLBomEzhRPLWklJn4VKOwjre9/k8GNd/e9DYxpfuzcxbXPQ==", + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", + "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.2", - "@nomicfoundation/ethereumjs-blockchain": "7.0.2", - "@nomicfoundation/ethereumjs-common": "4.0.2", - "@nomicfoundation/ethereumjs-evm": "2.0.2", - "@nomicfoundation/ethereumjs-rlp": "5.0.2", - "@nomicfoundation/ethereumjs-statemanager": "2.0.2", - "@nomicfoundation/ethereumjs-trie": "6.0.2", - "@nomicfoundation/ethereumjs-tx": "5.0.2", - "@nomicfoundation/ethereumjs-util": "9.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.2", + "@nomicfoundation/ethereumjs-block": "5.0.4", + "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/ethereumjs-common": "4.0.4", + "@nomicfoundation/ethereumjs-evm": "2.0.4", + "@nomicfoundation/ethereumjs-rlp": "5.0.4", + "@nomicfoundation/ethereumjs-statemanager": "2.0.4", + "@nomicfoundation/ethereumjs-trie": "6.0.4", + "@nomicfoundation/ethereumjs-tx": "5.0.4", + "@nomicfoundation/ethereumjs-util": "9.0.4", + "@nomicfoundation/ethereumjs-verkle": "0.0.2", + "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -11423,6 +11509,7 @@ "adm-zip": "^0.4.16", "aggregate-error": "^3.0.0", "ansi-escapes": "^4.3.0", + "boxen": "^5.1.2", "chalk": "^2.4.2", "chokidar": "^3.4.0", "ci-info": "^2.0.0", @@ -11470,9 +11557,9 @@ } }, "node_modules/hardhat-gas-reporter": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.9.tgz", - "integrity": "sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", + "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", "dev": true, "peer": true, "dependencies": { @@ -11574,6 +11661,32 @@ "node": ">=0.8.0" } }, + "node_modules/hardhat/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/hardhat/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -11609,6 +11722,17 @@ "node": ">=4" } }, + "node_modules/hardhat/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/hardhat/node_modules/locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -11633,9 +11757,9 @@ } }, "node_modules/hardhat/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -11644,13 +11768,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -11665,10 +11788,6 @@ }, "engines": { "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" } }, "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { @@ -11686,6 +11805,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hardhat/node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/hardhat/node_modules/mocha/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -11755,17 +11892,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/hardhat/node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/hardhat/node_modules/p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", @@ -11885,20 +12011,20 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "engines": { "node": ">= 0.4" }, @@ -11918,11 +12044,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -11984,9 +12110,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", + "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", "dependencies": { "function-bind": "^1.1.2" }, @@ -12266,9 +12392,9 @@ ] }, "node_modules/ignore": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", - "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" @@ -12284,9 +12410,9 @@ } }, "node_modules/immutable": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", - "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==" + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -12352,12 +12478,12 @@ "peer": true }, "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2", + "es-errors": "^1.3.0", "hasown": "^2.0.0", "side-channel": "^1.0.4" }, @@ -12424,14 +12550,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12481,28 +12609,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-buffer": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", - "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "engines": { - "node": ">=4" - } - }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -12637,9 +12743,9 @@ } }, "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -12706,12 +12812,15 @@ } }, "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12760,11 +12869,11 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dependencies": { - "which-typed-array": "^1.1.11" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -12999,9 +13108,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", - "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -13147,9 +13256,9 @@ } }, "node_modules/just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", "dev": true }, "node_modules/keccak": { @@ -13222,42 +13331,6 @@ "node": ">=0.10.0" } }, - "node_modules/level": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/level/-/level-8.0.0.tgz", - "integrity": "sha512-ypf0jjAk2BWI33yzEaaotpq7fkOPALKAgDBxggO6Q9HGX2MRXn0wbP1Jn/tJv1gtL867+YOjOB49WaUF3UoJNQ==", - "dependencies": { - "browser-level": "^1.0.1", - "classic-level": "^1.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/level" - } - }, - "node_modules/level-supports": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/level-supports/-/level-supports-4.0.1.tgz", - "integrity": "sha512-PbXpve8rKeNcZ9C1mUicC9auIYFyGpkV9/i6g76tLgANwWhtG2v7I4xNBUlkn3lE2/dZF3Pi0ygYGtLc4RXXdA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/level-transcoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/level-transcoder/-/level-transcoder-1.0.1.tgz", - "integrity": "sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==", - "dependencies": { - "buffer": "^6.0.3", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -13466,11 +13539,11 @@ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" } }, "node_modules/make-dir": { @@ -13522,14 +13595,6 @@ "dev": true, "peer": true }, - "node_modules/mcl-wasm": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/mcl-wasm/-/mcl-wasm-0.7.9.tgz", - "integrity": "sha512-iJIUcQWA88IJB/5L15GnJVnSQJmf/YaxxV6zRavv83HILHaJQb6y0iFyDMdDO0gN8X37tdxmAOrH/P8B6RB8sQ==", - "engines": { - "node": ">=8.9.0" - } - }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -13548,19 +13613,6 @@ "node": ">= 0.6" } }, - "node_modules/memory-level": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/memory-level/-/memory-level-1.0.0.tgz", - "integrity": "sha512-UXzwewuWeHBz5krr7EvehKcmLFNoXxGcvuYhC41tRnkrTbJohtS7kVn9akmgirtRygg+f7Yjsfi8Uu5SGSQ4Og==", - "dependencies": { - "abstract-level": "^1.0.0", - "functional-red-black-tree": "^1.0.1", - "module-error": "^1.0.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -13977,6 +14029,33 @@ "node": ">=6" } }, + "node_modules/mocha/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -14000,6 +14079,18 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mocha/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/mocha/node_modules/minimatch": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", @@ -14038,14 +14129,6 @@ "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" }, - "node_modules/module-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/module-error/-/module-error-1.0.2.tgz", - "integrity": "sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==", - "engines": { - "node": ">=10" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14061,29 +14144,6 @@ "buffer": "^5.5.0" } }, - "node_modules/multibase/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/multicodec": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", @@ -14103,29 +14163,6 @@ "varint": "^5.0.0" } }, - "node_modules/multihashes/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/multihashes/node_modules/multibase": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", @@ -14158,11 +14195,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-macros": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.2.2.tgz", - "integrity": "sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==" - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -14214,34 +14246,34 @@ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" }, "node_modules/nise": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz", - "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", "dev": true, "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^10.0.2", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" } }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "type-detect": "4.0.8" } }, - "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", - "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", + "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", "dev": true, "dependencies": { - "type-detect": "4.0.8" + "@sinonjs/commons": "^3.0.0" } }, "node_modules/no-case": { @@ -14287,9 +14319,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.7.1.tgz", - "integrity": "sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", + "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -14376,9 +14408,9 @@ } }, "node_modules/npm-run-path": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", + "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -14480,6 +14512,15 @@ "node": ">=8.9" } }, + "node_modules/nyc/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/nyc/node_modules/cliui": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", @@ -14688,15 +14729,16 @@ } }, "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", + "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" + "array.prototype.filter": "^1.0.3", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.0.0" } }, "node_modules/object.values": { @@ -15057,18 +15099,9 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "dependencies": { - "isarray": "0.0.1" - } - }, - "node_modules/path-to-regexp/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", + "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", "dev": true }, "node_modules/path-type": { @@ -15231,10 +15264,18 @@ "node": ">=8" } }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { - "version": "8.4.32", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", - "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", + "version": "8.4.35", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", + "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", "dev": true, "funding": [ { @@ -15502,6 +15543,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, "funding": [ { "type": "github", @@ -15639,12 +15681,12 @@ } }, "node_modules/react-tooltip": { - "version": "5.25.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.25.0.tgz", - "integrity": "sha512-/eGhmlwbHlJrVoUe75fb58rJfAy9aZnTvQAK9ZUPM0n9mmBGpEk13vDPiQVCeUuax+fBej+7JPsUXlhzaySc7w==", + "version": "5.26.3", + "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz", + "integrity": "sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==", "dev": true, "dependencies": { - "@floating-ui/dom": "^1.0.0", + "@floating-ui/dom": "^1.6.1", "classnames": "^2.3.0" }, "peerDependencies": { @@ -15943,19 +15985,20 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -16213,11 +16256,14 @@ "dev": true }, "node_modules/rollup": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.6.1.tgz", - "integrity": "sha512-jZHaZotEHQaHLgKr8JnQiDT1rmatjgKlMekyksz+yk9jt/8z9quNjnKNRoaM0wd9DC2QKXjmWWuDYtM3jfF8pQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", + "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", "dev": true, "peer": true, + "dependencies": { + "@types/estree": "1.0.5" + }, "bin": { "rollup": "dist/bin/rollup" }, @@ -16226,18 +16272,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.6.1", - "@rollup/rollup-android-arm64": "4.6.1", - "@rollup/rollup-darwin-arm64": "4.6.1", - "@rollup/rollup-darwin-x64": "4.6.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.6.1", - "@rollup/rollup-linux-arm64-gnu": "4.6.1", - "@rollup/rollup-linux-arm64-musl": "4.6.1", - "@rollup/rollup-linux-x64-gnu": "4.6.1", - "@rollup/rollup-linux-x64-musl": "4.6.1", - "@rollup/rollup-win32-arm64-msvc": "4.6.1", - "@rollup/rollup-win32-ia32-msvc": "4.6.1", - "@rollup/rollup-win32-x64-msvc": "4.6.1", + "@rollup/rollup-android-arm-eabi": "4.12.0", + "@rollup/rollup-android-arm64": "4.12.0", + "@rollup/rollup-darwin-arm64": "4.12.0", + "@rollup/rollup-darwin-x64": "4.12.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", + "@rollup/rollup-linux-arm64-gnu": "4.12.0", + "@rollup/rollup-linux-arm64-musl": "4.12.0", + "@rollup/rollup-linux-riscv64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-gnu": "4.12.0", + "@rollup/rollup-linux-x64-musl": "4.12.0", + "@rollup/rollup-win32-arm64-msvc": "4.12.0", + "@rollup/rollup-win32-ia32-msvc": "4.12.0", + "@rollup/rollup-win32-x64-msvc": "4.12.0", "fsevents": "~2.3.2" } }, @@ -16326,40 +16373,18 @@ }, "node_modules/run-applescript/node_modules/strip-final-newline": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "node_modules/run-parallel-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/run-parallel-limit/-/run-parallel-limit-1.1.0.tgz", - "integrity": "sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==", + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, "funding": [ { "type": "github", @@ -16378,10 +16403,18 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rustbn.js": { + "node_modules/rust-verkle-wasm": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", + "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==" + }, + "node_modules/rustbn-wasm": { "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn.js/-/rustbn.js-0.2.0.tgz", - "integrity": "sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA==" + "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", + "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", + "dependencies": { + "@scure/base": "^1.1.1" + } }, "node_modules/rw": { "version": "1.3.3", @@ -16390,13 +16423,13 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", + "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.5", + "get-intrinsic": "^1.2.2", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -16427,15 +16460,18 @@ ] }, "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -16724,28 +16760,31 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", + "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", + "define-data-property": "^1.1.2", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.3", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "dependencies": { - "define-data-property": "^1.0.1", + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16795,6 +16834,29 @@ "buffer": "6.0.3" } }, + "node_modules/sha3/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/shallowequal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", @@ -16841,13 +16903,17 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", + "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17025,17 +17091,16 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.5.tgz", - "integrity": "sha512-6C6N6OV2O8FQA0FWA95FdzVH+L16HU94iFgg5wAFZ29UpLFkgNI/DRR2HotG1bC0F4gAc/OMs2BJI44Q/DYlKQ==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.7.tgz", + "integrity": "sha512-RzcPuNsIqVGq5F8rjQZPdI2EVdsRU7w2f1Uk1UY567n9eNcg5LSEQ3Q1WFoy9bi/2AD5SYbYK9SS/Nwh2oYbNw==", "dev": true, "peer": true, "dependencies": { "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.16.0", + "@solidity-parser/parser": "^0.18.0", "chalk": "^2.4.2", "death": "^1.1.0", - "detect-port": "^1.3.0", "difflib": "^0.2.4", "fs-extra": "^8.1.0", "ghost-testrpc": "^0.0.2", @@ -17043,7 +17108,7 @@ "globby": "^10.0.1", "jsonschema": "^1.2.4", "lodash": "^4.17.15", - "mocha": "10.2.0", + "mocha": "^10.2.0", "node-emoji": "^1.10.0", "pify": "^4.0.1", "recursive-readdir": "^2.2.2", @@ -17060,14 +17125,11 @@ } }, "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", - "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", + "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", "dev": true, - "peer": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } + "peer": true }, "node_modules/solidity-coverage/node_modules/ansi-colors": { "version": "4.1.1", @@ -17127,6 +17189,34 @@ "node": ">=0.8.0" } }, + "node_modules/solidity-coverage/node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "peer": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/solidity-coverage/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -17159,6 +17249,19 @@ "node": ">=6 <7 || >=8" } }, + "node_modules/solidity-coverage/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "peer": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/solidity-coverage/node_modules/globby": { "version": "10.0.2", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", @@ -17193,9 +17296,9 @@ } }, "node_modules/solidity-coverage/node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", + "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", "dev": true, "peer": true, "dependencies": { @@ -17206,13 +17309,12 @@ "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.2.0", + "glob": "8.1.0", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", "minimatch": "5.0.1", "ms": "2.1.3", - "nanoid": "3.3.3", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", @@ -17227,10 +17329,26 @@ }, "engines": { "node": ">= 14.0.0" + } + }, + "node_modules/solidity-coverage/node_modules/mocha/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "peer": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { @@ -17256,19 +17374,6 @@ "dev": true, "peer": true }, - "node_modules/solidity-coverage/node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "peer": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/solidity-coverage/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -17352,9 +17457,9 @@ } }, "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", @@ -17366,9 +17471,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", - "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==" + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", + "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" }, "node_modules/split2": { "version": "3.2.2", @@ -17669,9 +17774,9 @@ } }, "node_modules/stylis": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", - "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", + "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==", "dev": true }, "node_modules/supports-color": { @@ -17734,29 +17839,6 @@ "node": ">=10" } }, - "node_modules/swarm-js/node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, "node_modules/swarm-js/node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -18295,9 +18377,9 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", @@ -18408,7 +18490,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -18488,29 +18569,30 @@ } }, "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -18520,16 +18602,17 @@ } }, "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -18539,14 +18622,20 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", + "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -18630,9 +18719,9 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" }, "node_modules/undici": { - "version": "5.28.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz", - "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==", + "version": "5.28.3", + "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", + "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", "dependencies": { "@fastify/busboy": "^2.0.0" }, @@ -18837,9 +18926,9 @@ } }, "node_modules/viem": { - "version": "1.19.11", - "resolved": "https://registry.npmjs.org/viem/-/viem-1.19.11.tgz", - "integrity": "sha512-dbsXEWDBZkByuzJXAs/e01j7dpUJ5ICF5WcyntFwf8Y97n5vnC/91lAleSa6DA5V4WJvYZbhDpYeTctsMAQnhA==", + "version": "2.7.11", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.11.tgz", + "integrity": "sha512-qlEPF9YOgPVqjTyom73TVAekAYrIe68megO07u55p7pKWgLt0i9KD6Mrmiw7pd7oHh86vIppcygwQMDNGX1YAw==", "funding": [ { "type": "github", @@ -18852,7 +18941,7 @@ "@noble/hashes": "1.3.2", "@scure/bip32": "1.3.2", "@scure/bip39": "1.2.1", - "abitype": "0.9.8", + "abitype": "1.0.0", "isows": "1.0.3", "ws": "8.13.0" }, @@ -18865,6 +18954,11 @@ } } }, + "node_modules/viem/node_modules/@adraffy/ens-normalize": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", + "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" + }, "node_modules/viem/node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", @@ -18886,9 +18980,9 @@ } }, "node_modules/vite": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.1.tgz", - "integrity": "sha512-AXXFaAJ8yebyqzoNB9fu2pHoo/nWX+xZlaRwoeYUxEqBO+Zj4msE5G+BhGBll9lYEKv9Hfks52PAF2X7qDYXQA==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", + "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -19042,33 +19136,33 @@ } }, "node_modules/web-worker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", - "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", + "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", "dev": true }, "node_modules/web3": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.3.tgz", - "integrity": "sha512-DgUdOOqC/gTqW+VQl1EdPxrVRPB66xVNtuZ5KD4adVBtko87hkgM8BTZ0lZ8IbUfnQk6DyjcDujMiH3oszllAw==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.4.tgz", + "integrity": "sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==", "hasInstallScript": true, "dependencies": { - "web3-bzz": "1.10.3", - "web3-core": "1.10.3", - "web3-eth": "1.10.3", - "web3-eth-personal": "1.10.3", - "web3-net": "1.10.3", - "web3-shh": "1.10.3", - "web3-utils": "1.10.3" + "web3-bzz": "1.10.4", + "web3-core": "1.10.4", + "web3-eth": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-shh": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-bzz": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.3.tgz", - "integrity": "sha512-XDIRsTwekdBXtFytMpHBuun4cK4x0ZMIDXSoo1UVYp+oMyZj07c7gf7tNQY5qZ/sN+CJIas4ilhN25VJcjSijQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.4.tgz", + "integrity": "sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==", "hasInstallScript": true, "dependencies": { "@types/node": "^12.12.6", @@ -19085,53 +19179,53 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-core": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.3.tgz", - "integrity": "sha512-Vbk0/vUNZxJlz3RFjAhNNt7qTpX8yE3dn3uFxfX5OHbuon5u65YEOd3civ/aQNW745N0vGUlHFNxxmn+sG9DIw==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz", + "integrity": "sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==", "dependencies": { "@types/bn.js": "^5.1.1", "@types/node": "^12.12.6", "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-requestmanager": "1.10.3", - "web3-utils": "1.10.3" + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-requestmanager": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-helpers": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.3.tgz", - "integrity": "sha512-Yv7dQC3B9ipOc5sWm3VAz1ys70Izfzb8n9rSiQYIPjpqtJM+3V4EeK6ghzNR6CO2es0+Yu9CtCkw0h8gQhrTxA==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz", + "integrity": "sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==", "dependencies": { - "web3-eth-iban": "1.10.3", - "web3-utils": "1.10.3" + "web3-eth-iban": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-method": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.3.tgz", - "integrity": "sha512-VZ/Dmml4NBmb0ep5PTSg9oqKoBtG0/YoMPei/bq/tUdlhB2dMB79sbeJPwx592uaV0Vpk7VltrrrBv5hTM1y4Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz", + "integrity": "sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==", "dependencies": { "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-utils": "1.10.3" + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-promievent": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.3.tgz", - "integrity": "sha512-HgjY+TkuLm5uTwUtaAfkTgRx/NzMxvVradCi02gy17NxDVdg/p6svBHcp037vcNpkuGeFznFJgULP+s2hdVgUQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz", + "integrity": "sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==", "dependencies": { "eventemitter3": "4.0.4" }, @@ -19140,27 +19234,27 @@ } }, "node_modules/web3-core-requestmanager": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.3.tgz", - "integrity": "sha512-VT9sKJfgM2yBOIxOXeXiDuFMP4pxzF6FT+y8KTLqhDFHkbG3XRe42Vm97mB/IvLQCJOmokEjl3ps8yP1kbggyw==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz", + "integrity": "sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==", "dependencies": { "util": "^0.12.5", - "web3-core-helpers": "1.10.3", - "web3-providers-http": "1.10.3", - "web3-providers-ipc": "1.10.3", - "web3-providers-ws": "1.10.3" + "web3-core-helpers": "1.10.4", + "web3-providers-http": "1.10.4", + "web3-providers-ipc": "1.10.4", + "web3-providers-ws": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-core-subscriptions": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.3.tgz", - "integrity": "sha512-KW0Mc8sgn70WadZu7RjQ4H5sNDJ5Lx8JMI3BWos+f2rW0foegOCyWhRu33W1s6ntXnqeBUw5rRCXZRlA3z+HNA==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz", + "integrity": "sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.3" + "web3-core-helpers": "1.10.4" }, "engines": { "node": ">=8.0.0" @@ -19180,43 +19274,43 @@ } }, "node_modules/web3-eth": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.3.tgz", - "integrity": "sha512-Uk1U2qGiif2mIG8iKu23/EQJ2ksB1BQXy3wF3RvFuyxt8Ft9OEpmGlO7wOtAyJdoKzD5vcul19bJpPcWSAYZhA==", - "dependencies": { - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-eth-accounts": "1.10.3", - "web3-eth-contract": "1.10.3", - "web3-eth-ens": "1.10.3", - "web3-eth-iban": "1.10.3", - "web3-eth-personal": "1.10.3", - "web3-net": "1.10.3", - "web3-utils": "1.10.3" + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.4.tgz", + "integrity": "sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==", + "dependencies": { + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-accounts": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-eth-ens": "1.10.4", + "web3-eth-iban": "1.10.4", + "web3-eth-personal": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-abi": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.3.tgz", - "integrity": "sha512-O8EvV67uhq0OiCMekqYsDtb6FzfYzMXT7VMHowF8HV6qLZXCGTdB/NH4nJrEh2mFtEwVdS6AmLFJAQd2kVyoMQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz", + "integrity": "sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==", "dependencies": { "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.3" + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-accounts": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.3.tgz", - "integrity": "sha512-8MipGgwusDVgn7NwKOmpeo3gxzzd+SmwcWeBdpXknuyDiZSQy9tXe+E9LeFGrmys/8mLLYP79n3jSbiTyv+6pQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz", + "integrity": "sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==", "dependencies": { "@ethereumjs/common": "2.6.5", "@ethereumjs/tx": "3.5.2", @@ -19224,10 +19318,10 @@ "eth-lib": "0.2.8", "scrypt-js": "^3.0.1", "uuid": "^9.0.0", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-utils": "1.10.3" + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" @@ -19261,64 +19355,64 @@ } }, "node_modules/web3-eth-contract": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.3.tgz", - "integrity": "sha512-Y2CW61dCCyY4IoUMD4JsEQWrILX4FJWDWC/Txx/pr3K/+fGsBGvS9kWQN5EsVXOp4g7HoFOfVh9Lf7BmVVSRmg==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz", + "integrity": "sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==", "dependencies": { "@types/bn.js": "^5.1.1", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-utils": "1.10.3" + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-ens": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.3.tgz", - "integrity": "sha512-hR+odRDXGqKemw1GFniKBEXpjYwLgttTES+bc7BfTeoUyUZXbyDHe5ifC+h+vpzxh4oS0TnfcIoarK0Z9tFSiQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz", + "integrity": "sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==", "dependencies": { "content-hash": "^2.5.2", "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-promievent": "1.10.3", - "web3-eth-abi": "1.10.3", - "web3-eth-contract": "1.10.3", - "web3-utils": "1.10.3" + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-promievent": "1.10.4", + "web3-eth-abi": "1.10.4", + "web3-eth-contract": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-iban": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.3.tgz", - "integrity": "sha512-ZCfOjYKAjaX2TGI8uif5ah+J3BYFuo+47JOIV1RIz2l7kD9VfnxvRH5UiQDRyMALQC7KFd2hUqIEtHklapNyKA==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz", + "integrity": "sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==", "dependencies": { "bn.js": "^5.2.1", - "web3-utils": "1.10.3" + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-eth-personal": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.3.tgz", - "integrity": "sha512-avrQ6yWdADIvuNQcFZXmGLCEzulQa76hUOuVywN7O3cklB4nFc/Gp3yTvD3bOAaE7DhjLQfhUTCzXL7WMxVTsw==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz", + "integrity": "sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==", "dependencies": { "@types/node": "^12.12.6", - "web3-core": "1.10.3", - "web3-core-helpers": "1.10.3", - "web3-core-method": "1.10.3", - "web3-net": "1.10.3", - "web3-utils": "1.10.3" + "web3-core": "1.10.4", + "web3-core-helpers": "1.10.4", + "web3-core-method": "1.10.4", + "web3-net": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" @@ -19330,51 +19424,51 @@ "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, "node_modules/web3-net": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.3.tgz", - "integrity": "sha512-IoSr33235qVoI1vtKssPUigJU9Fc/Ph0T9CgRi15sx+itysmvtlmXMNoyd6Xrgm9LuM4CIhxz7yDzH93B79IFg==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.4.tgz", + "integrity": "sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==", "dependencies": { - "web3-core": "1.10.3", - "web3-core-method": "1.10.3", - "web3-utils": "1.10.3" + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-utils": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-http": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.3.tgz", - "integrity": "sha512-6dAgsHR3MxJ0Qyu3QLFlQEelTapVfWNTu5F45FYh8t7Y03T1/o+YAkVxsbY5AdmD+y5bXG/XPJ4q8tjL6MgZHw==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz", + "integrity": "sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==", "dependencies": { "abortcontroller-polyfill": "^1.7.5", "cross-fetch": "^4.0.0", "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.3" + "web3-core-helpers": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ipc": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.3.tgz", - "integrity": "sha512-vP5WIGT8FLnGRfswTxNs9rMfS1vCbMezj/zHbBe/zB9GauBRTYVrUo2H/hVrhLg8Ut7AbsKZ+tCJ4mAwpKi2hA==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz", + "integrity": "sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==", "dependencies": { "oboe": "2.1.5", - "web3-core-helpers": "1.10.3" + "web3-core-helpers": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-providers-ws": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.3.tgz", - "integrity": "sha512-/filBXRl48INxsh6AuCcsy4v5ndnTZ/p6bl67kmO9aK1wffv7CT++DrtclDtVMeDGCgB3van+hEf9xTAVXur7Q==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz", + "integrity": "sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==", "dependencies": { "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.3", + "web3-core-helpers": "1.10.4", "websocket": "^1.0.32" }, "engines": { @@ -19382,24 +19476,24 @@ } }, "node_modules/web3-shh": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.3.tgz", - "integrity": "sha512-cAZ60CPvs9azdwMSQ/PSUdyV4PEtaW5edAZhu3rCXf6XxQRliBboic+AvwUvB6j3eswY50VGa5FygfVmJ1JVng==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.4.tgz", + "integrity": "sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==", "hasInstallScript": true, "dependencies": { - "web3-core": "1.10.3", - "web3-core-method": "1.10.3", - "web3-core-subscriptions": "1.10.3", - "web3-net": "1.10.3" + "web3-core": "1.10.4", + "web3-core-method": "1.10.4", + "web3-core-subscriptions": "1.10.4", + "web3-net": "1.10.4" }, "engines": { "node": ">=8.0.0" } }, "node_modules/web3-utils": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.3.tgz", - "integrity": "sha512-OqcUrEE16fDBbGoQtZXWdavsPzbGIDc5v3VrRTZ0XrIpefC/viZ1ZU9bGEemazyS0catk/3rkOOxpzTfY+XsyQ==", + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", + "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", "dependencies": { "@ethereumjs/util": "^8.1.0", "bn.js": "^5.2.1", @@ -19415,20 +19509,20 @@ } }, "node_modules/web3-utils/node_modules/@noble/curves": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.1.0.tgz", - "integrity": "sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", + "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", "dependencies": { - "@noble/hashes": "1.3.1" + "@noble/hashes": "1.3.3" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/web3-utils/node_modules/@noble/hashes": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.1.tgz", - "integrity": "sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", "engines": { "node": ">= 16" }, @@ -19437,27 +19531,39 @@ } }, "node_modules/web3-utils/node_modules/@scure/bip32": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.1.tgz", - "integrity": "sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", + "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", "dependencies": { - "@noble/curves": "~1.1.0", - "@noble/hashes": "~1.3.1", - "@scure/base": "~1.1.0" + "@noble/curves": "~1.3.0", + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/web3-utils/node_modules/@scure/bip39": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", + "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", + "dependencies": { + "@noble/hashes": "~1.3.2", + "@scure/base": "~1.1.4" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.2.tgz", - "integrity": "sha512-Z5Ba0T0ImZ8fqXrJbpHcbpAvIswRte2wGNR/KePnu8GbbvgJ47lMxT/ZZPG6i9Jaht4azPDop4HaM00J0J59ug==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", + "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", "dependencies": { - "@noble/curves": "1.1.0", - "@noble/hashes": "1.3.1", - "@scure/bip32": "1.3.1", - "@scure/bip39": "1.2.1" + "@noble/curves": "1.3.0", + "@noble/hashes": "1.3.3", + "@scure/bip32": "1.3.3", + "@scure/bip39": "1.2.2" } }, "node_modules/webidl-conversions": { @@ -19541,15 +19647,15 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", + "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", + "available-typed-arrays": "^1.0.6", + "call-bind": "^1.0.5", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "has-tostringtag": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -19558,6 +19664,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/window-size": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", @@ -19778,17 +19895,6 @@ "node": ">=10" } }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/yargs-unparser/node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -19928,7 +20034,7 @@ "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", "hardhat": "^2.18.0", - "viem": "^1.18.1" + "viem": "^2.7.6" }, "peerDependencies": { "@nomicfoundation/hardhat-verify": "^2.0.1", @@ -19958,17 +20064,17 @@ "version": "0.13.2", "license": "MIT", "devDependencies": { - "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/hardhat-viem": "^2.0.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.13.2", - "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/hardhat-viem": "^2.0.0", "@nomicfoundation/ignition-core": "^0.13.2", "hardhat": "^2.18.0", - "viem": "^1.18.1" + "viem": "^2.7.6" } }, "packages/hardhat-plugin/node_modules/fs-extra": { diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 850311f313..087b14fe56 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -34,16 +34,16 @@ "prepack": "npm run build" }, "devDependencies": { - "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/hardhat-viem": "^2.0.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.13.2", - "@nomicfoundation/hardhat-viem": "^1.0.0", + "@nomicfoundation/hardhat-viem": "^2.0.0", "@nomicfoundation/ignition-core": "^0.13.2", "hardhat": "^2.18.0", - "viem": "^1.18.1" + "viem": "^2.7.6" } } diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 4fae696cac..6934dd373b 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -225,8 +225,10 @@ export class ViemIgnitionHelper { const contract = viem.getContract({ address: this._ensureAddressFormat(deployedContract.address), abi: future.artifact.abi, - publicClient, - walletClient, + client: { + public: publicClient, + wallet: walletClient, + }, }); return contract; diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 77e53836cf..616744536b 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -52,7 +52,7 @@ "@types/sinon": "^10.0.13", "@nomicfoundation/hardhat-network-helpers": "1.0.9", "hardhat": "^2.18.0", - "viem": "^1.18.1" + "viem": "^2.7.6" }, "peerDependencies": { "@nomicfoundation/hardhat-verify": "^2.0.1", diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 2faf1d9770..525041e096 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -10,8 +10,6 @@ import { IgnitionModule, IgnitionModuleResult, isContractFuture, - NamedArtifactContractAtFuture, - NamedArtifactContractDeploymentFuture, SuccessfulDeploymentResult, } from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; @@ -26,16 +24,17 @@ export type IgnitionModuleResultsTToViemContracts< ContractNameT extends string, IgnitionModuleResultsT extends IgnitionModuleResult > = { - [contract in keyof IgnitionModuleResultsT]: IgnitionModuleResultsT[contract] extends - | NamedArtifactContractDeploymentFuture - | NamedArtifactContractAtFuture - ? TypeChainViemContractByName - : GetContractReturnType; + [contract in keyof IgnitionModuleResultsT]: TypeChainViemContractByName; }; -// TODO: Make this work to have support for TypeChain -// eslint-disable-next-line @typescript-eslint/no-unused-vars -export type TypeChainViemContractByName = GetContractReturnType; +// TODO: This is a very permissive type to maintain the existing tests. +// We should work it up to the equivalent of the Viem Ignition helper. +// That implies solving how we get post compile type information for contracts. +export interface TypeChainViemContractByName { + address: string; + read: any; + write: any; +} export class TestIgnitionHelper { public type = "test"; @@ -168,7 +167,7 @@ export class TestIgnitionHelper { hre, deployedContract.contractName ), - publicClient, + client: { public: publicClient }, }); return contract; From 2ed0de289483c9591d6560ecca8e00a6bee566b0 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 21 Feb 2024 11:13:17 +0000 Subject: [PATCH 1139/1302] chore: bump version to v0.14.0 Update the packages versions and changelogs for the `0.14.0 - 2024-02-21` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/viem-sample/package.json | 4 +- package-lock.json | 44 ++++++++++----------- packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/package.json | 6 +-- packages/hardhat-plugin-viem/CHANGELOG.md | 10 +++++ packages/hardhat-plugin-viem/package.json | 6 +-- packages/hardhat-plugin/CHANGELOG.md | 6 +++ packages/hardhat-plugin/package.json | 6 +-- packages/ui/package.json | 4 +- 13 files changed, 60 insertions(+), 44 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 9e02198806..45e8e9912e 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.13.2", + "version": "0.14.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index 29b3b5f128..8fa7f4c6ee 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.13.2", + "version": "0.14.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 8eac6c8fd0..efe6cbac63 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.13.2", + "version": "0.14.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index d9660d810f..cd6aaf1c52 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.13.2", + "version": "0.14.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index bf6d28fb4d..9e6b6ef590 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.13.2", + "version": "0.14.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.2", + "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/package-lock.json b/package-lock.json index 74949b74cb..9d90ef3ba7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.13.2", + "version": "0.14.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -66,12 +66,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.13.2", + "version": "0.14.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -79,9 +79,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.13.2", + "version": "0.14.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -89,9 +89,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.13.2", + "version": "0.14.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.2", + "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -99,9 +99,9 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.13.2", + "version": "0.14.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.13.2", + "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -19966,7 +19966,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -20018,11 +20018,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.2", - "@nomicfoundation/ignition-ui": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-ui": "^0.14.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -20043,7 +20043,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -20053,15 +20053,15 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.2", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/hardhat-ignition": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.14.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^2.0.0", @@ -20070,9 +20070,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.2", + "@nomicfoundation/hardhat-ignition": "^0.14.0", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", "hardhat": "^2.18.0", "viem": "^2.7.6" } @@ -20111,10 +20111,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.2", + "version": "0.14.0", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/package.json b/packages/core/package.json index f82c747edb..81f8950a48 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index b8c1b7be1e..84f211a9c0 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -40,8 +40,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.13.2", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/hardhat-ignition": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.14.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index e50b2a239f..637cc3f2b2 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,16 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.14.0 - 2024-02-21 + +### Added + +- Support BigInt values in Module Parameter files by encoding them as strings with the format /d+n/ ([#663](https://github.com/NomicFoundation/hardhat-ignition/issues/663)) + +### Changed + +- Upgrade to `viem@2`, a breaking change for scripts or tests that leverage viem contract instances returned from an Ignition deploy call, see [the viem@2 migration guide for more details](https://viem.sh/docs/migration-guide#2xx-breaking-changes) ([#692](https://github.com/NomicFoundation/hardhat-ignition/issues/692)) + ## 0.13.2 - 2024-01-25 ### Fixed diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 087b14fe56..be13be513b 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -40,9 +40,9 @@ "@types/sinon": "^10.0.13" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.13.2", + "@nomicfoundation/hardhat-ignition": "^0.14.0", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", "hardhat": "^2.18.0", "viem": "^2.7.6" } diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index e7714cce3c..eaad8fce19 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.14.0 - 2024-02-21 + +### Added + +- Support BigInt values in Module Parameter files by encoding them as strings with the format /d+n/ ([#663](https://github.com/NomicFoundation/hardhat-ignition/issues/663)) + ## 0.13.2 - 2024-01-25 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 616744536b..c37d2540d1 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.13.2", + "version": "0.14.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -59,8 +59,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.13.2", - "@nomicfoundation/ignition-ui": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-ui": "^0.14.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index d1238b8f45..3a064f6d69 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.13.2", + "version": "0.14.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -17,7 +17,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.13.2", + "@nomicfoundation/ignition-core": "^0.14.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From d1c99b548b9097b7ccbd3b79d359aea6715925e5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 2 Nov 2023 10:57:42 +0000 Subject: [PATCH 1140/1302] feat: add create2 strategy A POC create2 strategy based on `createX`. --- .vscode/launch.json | 13 + package-lock.json | 36 - packages/core/src/deploy.ts | 35 +- .../execution/basic-execution-strategy.ts | 4 + .../execution/create2-execution-strategy.ts | 308 ++++++ .../internal/execution/execution-engine.ts | 2 + .../execution/execution-strategy-helpers.ts | 4 +- .../helpers/network-interaction-execution.ts | 3 +- .../execution/strategy/createx-artifact.ts | 903 ++++++++++++++++++ .../execution/types/execution-strategy.ts | 2 + .../src/ethers-ignition-helper.ts | 4 + packages/hardhat-plugin/src/index.ts | 11 + .../deploy/deploy-contract-with-create2.ts | 41 + .../test/test-helpers/test-ignition-helper.ts | 3 + 14 files changed, 1325 insertions(+), 44 deletions(-) create mode 100644 packages/core/src/internal/execution/create2-execution-strategy.ts create mode 100644 packages/core/src/internal/execution/strategy/createx-artifact.ts create mode 100644 packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 699209ed53..87373af96f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,6 +1,19 @@ { "version": "0.2.0", "configurations": [ + { + "name": "Debug ignition deploy in samples", + "request": "launch", + "program": "${workspaceFolder}/node_modules/hardhat/internal/cli/cli.js", + "skipFiles": ["/**"], + "type": "node", + "cwd": "${workspaceFolder}/examples/sample", + "args": [ + "ignition", + "deploy", + "${workspaceFolder}/examples/sample/ignition/modules/LockModule.js" + ] + }, { "name": "New Modules", "internalConsoleOptions": "openOnSessionStart", diff --git a/package-lock.json b/package-lock.json index 9d90ef3ba7..1617ce6926 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7064,42 +7064,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "extraneous": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "extraneous": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 62ba6b886f..b25d7d1930 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -6,8 +6,10 @@ import { import { Deployer } from "./internal/deployer"; import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemeral-deployment-loader"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { DeploymentLoader } from "./internal/deployment-loader/types"; import { ERRORS } from "./internal/errors-list"; import { BasicExecutionStrategy } from "./internal/execution/basic-execution-strategy"; +import { Create2ExecutionStrategy } from "./internal/execution/create2-execution-strategy"; import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; import { equalAddresses } from "./internal/execution/utils/address"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; @@ -45,6 +47,7 @@ export async function deploy< deploymentParameters, accounts, defaultSender: givenDefaultSender, + strategy = "basic", }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -59,6 +62,7 @@ export async function deploy< deploymentParameters: DeploymentParameters; accounts: string[]; defaultSender?: string; + strategy?: "basic" | "create2"; }): Promise { if (executionEventListener !== undefined) { executionEventListener.setModuleId({ @@ -87,17 +91,20 @@ export async function deploy< const defaultSender = _resolveDefaultSender(givenDefaultSender, accounts); - const deploymentLoader = + const deploymentLoader: DeploymentLoader = deploymentDir === undefined ? new EphemeralDeploymentLoader(artifactResolver, executionEventListener) : new FileDeploymentLoader(deploymentDir, executionEventListener); - const executionStrategy = new BasicExecutionStrategy((artifactId) => - deploymentLoader.loadArtifact(artifactId) - ); - const jsonRpcClient = new EIP1193JsonRpcClient(provider); + const executionStrategy = setupStrategy( + strategy, + deploymentLoader, + provider, + accounts + ); + const isAutominedNetwork = await checkAutominedNetwork(provider); const resolvedConfig: DeployConfig = { @@ -149,3 +156,21 @@ function _resolveDefaultSender( return defaultSender; } + +function setupStrategy( + strategyName: "basic" | "create2", + deploymentLoader: DeploymentLoader, + provider: EIP1193Provider, + accounts: string[] +) { + switch (strategyName) { + case "basic": + return new BasicExecutionStrategy((artifactId) => + deploymentLoader.loadArtifact(artifactId) + ); + case "create2": + return new Create2ExecutionStrategy(provider, accounts, (artifactId) => + deploymentLoader.loadArtifact(artifactId) + ); + } +} diff --git a/packages/core/src/internal/execution/basic-execution-strategy.ts b/packages/core/src/internal/execution/basic-execution-strategy.ts index 7664ec31ee..8243999701 100644 --- a/packages/core/src/internal/execution/basic-execution-strategy.ts +++ b/packages/core/src/internal/execution/basic-execution-strategy.ts @@ -35,6 +35,10 @@ export class BasicExecutionStrategy implements ExecutionStrategy { constructor(private readonly _loadArtifact: LoadArtifactFunction) {} + public async init(): Promise { + // Nothing to do + } + public async *executeDeployment( executionState: DeploymentExecutionState ): DeploymentStrategyGenerator { diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts new file mode 100644 index 0000000000..c906437066 --- /dev/null +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -0,0 +1,308 @@ +import { ethers } from "ethers"; + +import { EIP1193Provider } from "../../types/provider"; +import { assertIgnitionInvariant } from "../utils/assertions"; + +import { + decodeArtifactCustomError, + decodeArtifactFunctionCallResult, + encodeArtifactDeploymentData, + encodeArtifactFunctionCall, + executeOnchainInteractionRequest, + executeStaticCallRequest, + getEventArgumentFromReceipt, + getStaticCallExecutionStateResultValue, +} from "./execution-strategy-helpers"; +import { sendTransactionForOnchainInteraction } from "./future-processor/helpers/network-interaction-execution"; +import { EIP1193JsonRpcClient } from "./jsonrpc-client"; +import { createxArtifact } from "./strategy/createx-artifact"; +import { ExecutionResultType } from "./types/execution-result"; +import { + CallExecutionState, + DeploymentExecutionState, + SendDataExecutionState, + StaticCallExecutionState, +} from "./types/execution-state"; +import { + CallStrategyGenerator, + DeploymentStrategyGenerator, + ExecutionStrategy, + LoadArtifactFunction, + OnchainInteractionResponseType, + SendDataStrategyGenerator, + StaticCallStrategyGenerator, +} from "./types/execution-strategy"; +import { + NetworkInteractionType, + OnchainInteraction, +} from "./types/network-interaction"; + +const _existingDeployedAddresses: { [key: number]: string } = { + 11155111: "0xE398fcc3f8aBa19CAA6687B9eF7473673A12E6E0", // not the official version + 31337: "0x5FbDB2315678afecb367f032d93F642f64180aa3", // assumes deployed from HH account 0 +}; + +/** + * The most basic execution strategy, which sends a single transaction + * for each deployment, call, and send data, and a single static call + * per static call execution. + */ +export class Create2ExecutionStrategy implements ExecutionStrategy { + public readonly name: string = "create2"; + private _createXAddress: string = + "0xE398fcc3f8aBa19CAA6687B9eF7473673A12E6E0"; + + constructor( + private readonly _provider: EIP1193Provider, + private readonly _accounts: string[], + private readonly _loadArtifact: LoadArtifactFunction + ) {} + + public async init(): Promise { + const client = new EIP1193JsonRpcClient(this._provider); + const chainId = await client.getChainId(); + + const existingDeployedAddress = _existingDeployedAddresses[chainId]; + + // if there is an existing deployment, nothing more needs done + if (existingDeployedAddress !== undefined) { + const result = await this._provider.request({ + method: "eth_getCode", + params: [existingDeployedAddress], + }); + + assertIgnitionInvariant( + chainId === 31337 || result !== "0x", + "CreateX not deployed at expected address" + ); + + if (result !== "0x") { + this._createXAddress = existingDeployedAddress; + + return; + } + } + + // No createX factory found, deploy one + const defaultAccount = this._accounts.at(0); + + assertIgnitionInvariant(defaultAccount !== undefined, "No accounts found"); + + const nextNonce = await client.getTransactionCount( + defaultAccount, + "pending" + ); + + const onchainInteraction: OnchainInteraction = { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: undefined, + data: createxArtifact.bytecode, + value: 0n, + transactions: [], + shouldBeResent: false, + }; + + const sendResult = await sendTransactionForOnchainInteraction( + client, + defaultAccount, + onchainInteraction, + async (_sender: string) => { + return nextNonce; + }, + // HACK: assuming no decode is required + async () => undefined + ); + + assertIgnitionInvariant( + sendResult.type === "TRANSACTION", + "CreateX deployment failed" + ); + + while (true) { + const receipt = await client.getTransactionReceipt( + sendResult.transaction.hash + ); + + if (receipt !== undefined) { + assertIgnitionInvariant( + receipt?.contractAddress !== undefined, + "CreateX deployment should have an address" + ); + + this._createXAddress = receipt.contractAddress; + break; + } + + await new Promise((res) => setTimeout(res, 200)); + } + } + + public async *executeDeployment( + executionState: DeploymentExecutionState + ): DeploymentStrategyGenerator { + const artifact = await this._loadArtifact(executionState.artifactId); + const salt = ethers.id("test"); + + const bytecodeToDeploy = encodeArtifactDeploymentData( + artifact, + executionState.constructorArgs, + executionState.libraries + ); + + const transactionOrResult = yield* executeOnchainInteractionRequest( + executionState.id, + { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: this._createXAddress, + data: encodeArtifactFunctionCall( + createxArtifact, + "deployCreate2(bytes32,bytes)", + [salt, bytecodeToDeploy] + ), + value: executionState.value, + }, + + (returnData) => + decodeArtifactFunctionCallResult( + createxArtifact, + "deployCreate2(bytes32,bytes)", + returnData + ), + (returnData) => decodeArtifactCustomError(createxArtifact, returnData) + ); + + if ( + transactionOrResult.type !== + OnchainInteractionResponseType.SUCCESSFUL_TRANSACTION + ) { + return transactionOrResult; + } + + const deployedAddress = getEventArgumentFromReceipt( + transactionOrResult.transaction.receipt, + createxArtifact, + this._createXAddress, + "ContractCreation", + 0, + "newContract" + ); + + assertIgnitionInvariant( + typeof deployedAddress === "string", + "Deployed event should return a string addr property" + ); + + return { + type: ExecutionResultType.SUCCESS, + address: deployedAddress, + }; + } + + public async *executeCall( + executionState: CallExecutionState + ): CallStrategyGenerator { + const artifact = await this._loadArtifact(executionState.artifactId); + + const transactionOrResult = yield* executeOnchainInteractionRequest( + executionState.id, + { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: executionState.contractAddress, + data: encodeArtifactFunctionCall( + artifact, + executionState.functionName, + executionState.args + ), + value: executionState.value, + }, + + (returnData) => + decodeArtifactFunctionCallResult( + artifact, + executionState.functionName, + returnData + ), + (returnData) => decodeArtifactCustomError(artifact, returnData) + ); + + if ( + transactionOrResult.type !== + OnchainInteractionResponseType.SUCCESSFUL_TRANSACTION + ) { + return transactionOrResult; + } + + return { + type: ExecutionResultType.SUCCESS, + }; + } + + public async *executeSendData( + executionState: SendDataExecutionState + ): SendDataStrategyGenerator { + const transactionOrResult = yield* executeOnchainInteractionRequest( + executionState.id, + { + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + to: executionState.to, + data: executionState.data, + value: executionState.value, + } + ); + + if ( + transactionOrResult.type !== + OnchainInteractionResponseType.SUCCESSFUL_TRANSACTION + ) { + return transactionOrResult; + } + + return { + type: ExecutionResultType.SUCCESS, + }; + } + + public async *executeStaticCall( + executionState: StaticCallExecutionState + ): StaticCallStrategyGenerator { + const artifact = await this._loadArtifact(executionState.artifactId); + + const decodedResultOrError = yield* executeStaticCallRequest( + { + id: 1, + type: NetworkInteractionType.STATIC_CALL, + to: executionState.contractAddress, + from: executionState.from, + data: encodeArtifactFunctionCall( + artifact, + executionState.functionName, + executionState.args + ), + value: 0n, + }, + (returnData) => + decodeArtifactFunctionCallResult( + artifact, + executionState.functionName, + returnData + ), + (returnData) => decodeArtifactCustomError(artifact, returnData) + ); + + if (decodedResultOrError.type === ExecutionResultType.STATIC_CALL_ERROR) { + return decodedResultOrError; + } + + return { + type: ExecutionResultType.SUCCESS, + value: getStaticCallExecutionStateResultValue( + executionState, + decodedResultOrError + ), + }; + } +} diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index d176bdb2e8..16a87966e6 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -98,6 +98,8 @@ export class ExecutionEngine { const futures = getFuturesFromModule(module); + await this._executionStrategy.init(); + for (const batch of batches) { this._emitBeginNextBatchEvent(); diff --git a/packages/core/src/internal/execution/execution-strategy-helpers.ts b/packages/core/src/internal/execution/execution-strategy-helpers.ts index 05326aaec3..cda307f942 100644 --- a/packages/core/src/internal/execution/execution-strategy-helpers.ts +++ b/packages/core/src/internal/execution/execution-strategy-helpers.ts @@ -9,11 +9,11 @@ import { assertIgnitionInvariant } from "../utils/assertions"; import { decodeError } from "./abi"; import { + EvmExecutionResultTypes, + InvalidResultError, RevertWithCustomError, RevertWithInvalidData, - InvalidResultError, SuccessfulEvmExecutionResult, - EvmExecutionResultTypes, } from "./types/evm-execution"; import { ExecutionResultType, diff --git a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts index 4707aa7330..7701e13f0a 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts @@ -126,6 +126,7 @@ export async function sendTransactionForOnchainInteraction( value: onchainInteraction.value, nonce, fees, + gasLimit: undefined, }; let gasLimit: bigint; @@ -139,7 +140,7 @@ export async function sendTransactionForOnchainInteraction( // too broad and make the assertion below fail. We could try to catch only // estimation errors. const failedEstimateGasSimulationResult = await client.call( - estimateGasPrams, + estimateGasPrams, // TODO: we need to set a gas limit here, or the simulation could fail due to a lack of funds "pending" ); diff --git a/packages/core/src/internal/execution/strategy/createx-artifact.ts b/packages/core/src/internal/execution/strategy/createx-artifact.ts new file mode 100644 index 0000000000..e7864ac177 --- /dev/null +++ b/packages/core/src/internal/execution/strategy/createx-artifact.ts @@ -0,0 +1,903 @@ +import { Artifact } from "../../../types/artifact"; + +export const createxArtifact: Artifact = { + contractName: "CreateX", + sourceName: "CreateX.sol:CreateX", + abi: [ + { + inputs: [ + { + internalType: "address", + name: "emitter", + type: "address", + }, + ], + name: "FailedContractCreation", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "emitter", + type: "address", + }, + { + internalType: "bytes", + name: "revertData", + type: "bytes", + }, + ], + name: "FailedContractInitialisation", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "emitter", + type: "address", + }, + { + internalType: "bytes", + name: "revertData", + type: "bytes", + }, + ], + name: "FailedEtherTransfer", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "emitter", + type: "address", + }, + ], + name: "InvalidNonceValue", + type: "error", + }, + { + inputs: [ + { + internalType: "address", + name: "emitter", + type: "address", + }, + ], + name: "InvalidSalt", + type: "error", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newContract", + type: "address", + }, + { + indexed: true, + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + ], + name: "ContractCreation", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newContract", + type: "address", + }, + ], + name: "ContractCreation", + type: "event", + }, + { + anonymous: false, + inputs: [ + { + indexed: true, + internalType: "address", + name: "newContract", + type: "address", + }, + { + indexed: true, + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + ], + name: "Create3ProxyContractCreation", + type: "event", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "initCodeHash", + type: "bytes32", + }, + ], + name: "computeCreate2Address", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes32", + name: "initCodeHash", + type: "bytes32", + }, + { + internalType: "address", + name: "deployer", + type: "address", + }, + ], + name: "computeCreate2Address", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "address", + name: "deployer", + type: "address", + }, + ], + name: "computeCreate3Address", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + ], + name: "computeCreate3Address", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + ], + name: "computeCreateAddress", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "deployer", + type: "address", + }, + { + internalType: "uint256", + name: "nonce", + type: "uint256", + }, + ], + name: "computeCreateAddress", + outputs: [ + { + internalType: "address", + name: "computedAddress", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + ], + name: "deployCreate", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + ], + name: "deployCreate2", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + ], + name: "deployCreate2", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + { + internalType: "address", + name: "refundAddress", + type: "address", + }, + ], + name: "deployCreate2AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + ], + name: "deployCreate2AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + { + internalType: "address", + name: "refundAddress", + type: "address", + }, + ], + name: "deployCreate2AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + ], + name: "deployCreate2AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "address", + name: "implementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "deployCreate2Clone", + outputs: [ + { + internalType: "address", + name: "proxy", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "deployCreate2Clone", + outputs: [ + { + internalType: "address", + name: "proxy", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + ], + name: "deployCreate3", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + ], + name: "deployCreate3", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + ], + name: "deployCreate3AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + ], + name: "deployCreate3AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes32", + name: "salt", + type: "bytes32", + }, + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + { + internalType: "address", + name: "refundAddress", + type: "address", + }, + ], + name: "deployCreate3AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + { + internalType: "address", + name: "refundAddress", + type: "address", + }, + ], + name: "deployCreate3AndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + ], + name: "deployCreateAndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "bytes", + name: "initCode", + type: "bytes", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + { + components: [ + { + internalType: "uint256", + name: "constructorAmount", + type: "uint256", + }, + { + internalType: "uint256", + name: "initCallAmount", + type: "uint256", + }, + ], + internalType: "struct CreateX.Values", + name: "values", + type: "tuple", + }, + { + internalType: "address", + name: "refundAddress", + type: "address", + }, + ], + name: "deployCreateAndInit", + outputs: [ + { + internalType: "address", + name: "newContract", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + { + inputs: [ + { + internalType: "address", + name: "implementation", + type: "address", + }, + { + internalType: "bytes", + name: "data", + type: "bytes", + }, + ], + name: "deployCreateClone", + outputs: [ + { + internalType: "address", + name: "proxy", + type: "address", + }, + ], + stateMutability: "payable", + type: "function", + }, + ], + bytecode: + "0x60a06040523060805234801561001457600080fd5b50608051612d956100d860003960008181610603015281816107050152818161082b015281816108d50152818161127f01528181611375015281816113e00152818161141f015281816114a7015281816115b3015281816117d20152818161183d0152818161187c0152818161190401528181611ac501528181611c7801528181611ce301528181611d2201528181611daa01528181611fe901528181612206015281816122f2015281816123a4015281816123fd01526124d90152612d956000f3fe60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d36600461286c565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d93660046128eb565b6103e6565b6101a26101ec366004612932565b610452565b6101a26101ff366004612932565b6104de565b6101a2610212366004612990565b610539565b34801561022357600080fd5b506101a26102323660046129e7565b6106fe565b6101a2610245366004612a00565b61072a565b6101a2610258366004612a00565b6107bb565b34801561026957600080fd5b506101a2610278366004612a75565b6107c9565b34801561028957600080fd5b506101a26102983660046129e7565b610823565b3480156102a957600080fd5b506101a26102b8366004612aa1565b61084f565b6101a26102cb366004612932565b611162565b6101a26102de366004612acb565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612b03565b611276565b6101a2610311366004612b25565b6112a3565b6101a26103243660046128eb565b611505565b6101a2610337366004612ba0565b6116f1565b6101a261034a366004612a00565b611964565b34801561035b57600080fd5b506101a261036a366004612c30565b6119ed565b6101a261037d366004612ba0565b611a17565b6101a2610390366004612b25565b611e0c565b6101a26103a336600461286c565b611e95565b6101a26103b6366004612b25565b611ea4565b6101a26103c9366004612acb565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f591506104088261232a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f38161232a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612c80565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f38282896123d4565b505050509392505050565b60006104d87f00000000000000000000000000000000000000000000000000000000000000008361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f00000000000000000000000000000000000000000000000000000000000000006107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612c9c565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f00000000000000000000000000000000000000000000000000000000000000006119ed565b60008451602086018451f090506112b98161232a565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612c80565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612c80565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a68186612456565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f591506117148261232a565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612c80565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612c80565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc8186612456565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612c80565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612c80565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d28282886123d4565b50505092915050565b60008060006120e98461250a565b9092509050600082600281111561210257612102612d59565b1480156121205750600081600281111561211e5761211e612d59565b145b1561215e5760408051336020820152469181019190915260608101859052608001604051602081830303815290604052805190602001209250612323565b600082600281111561217257612172612d59565b1480156121905750600181600281111561218e5761218e612d59565b145b156121b0576121a9338560009182526020526040902090565b9250612323565b60008260028111156121c4576121c4612d59565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b600182600281111561224757612247612d59565b1480156122655750600081600281111561226357612263612d59565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612d59565b1480156122b0575060028160028111156122ae576122ae612d59565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b8392505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff81161580612362575073ffffffffffffffffffffffffffffffffffffffff81163b155b156123d1576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b50565b8215806123f6575073ffffffffffffffffffffffffffffffffffffffff81163b155b15612451577f0000000000000000000000000000000000000000000000000000000000000000826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612ceb565b505050565b811580612477575073ffffffffffffffffffffffffffffffffffffffff8116155b80612497575073ffffffffffffffffffffffffffffffffffffffff81163b155b15612506576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b5050565b600080606083901c3314801561256757508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561257757506000905080915091565b606083901c331480156125b157507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b156125c25750600090506001915091565b33606084901c036125d95750600090506002915091565b606083901c15801561263257508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126435750600190506000915091565b606083901c15801561267c57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561268c57506001905080915091565b606083901c6126a15750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036126fc5750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127385750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261278357600080fd5b813567ffffffffffffffff8082111561279e5761279e612743565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156127e4576127e4612743565b816040528381528660208588010111156127fd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006040828403121561282f57600080fd5b6040516040810181811067ffffffffffffffff8211171561285257612852612743565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561288257600080fd5b84359350602085013567ffffffffffffffff808211156128a157600080fd5b6128ad88838901612772565b945060408701359150808211156128c357600080fd5b506128d087828801612772565b9250506128e0866060870161281d565b905092959194509250565b600080604083850312156128fe57600080fd5b82359150602083013567ffffffffffffffff81111561291c57600080fd5b61292885828601612772565b9150509250929050565b60006020828403121561294457600080fd5b813567ffffffffffffffff81111561295b57600080fd5b6107b384828501612772565b803573ffffffffffffffffffffffffffffffffffffffff8116811461298b57600080fd5b919050565b6000806000606084860312156129a557600080fd5b833592506129b560208501612967565b9150604084013567ffffffffffffffff8111156129d157600080fd5b6129dd86828701612772565b9150509250925092565b6000602082840312156129f957600080fd5b5035919050565b600080600060808486031215612a1557600080fd5b833567ffffffffffffffff80821115612a2d57600080fd5b612a3987838801612772565b94506020860135915080821115612a4f57600080fd5b50612a5c86828701612772565b925050612a6c856040860161281d565b90509250925092565b60008060408385031215612a8857600080fd5b82359150612a9860208401612967565b90509250929050565b60008060408385031215612ab457600080fd5b612abd83612967565b946020939093013593505050565b60008060408385031215612ade57600080fd5b612ae783612967565b9150602083013567ffffffffffffffff81111561291c57600080fd5b60008060408385031215612b1657600080fd5b50508035926020909101359150565b60008060008060a08587031215612b3b57600080fd5b843567ffffffffffffffff80821115612b5357600080fd5b612b5f88838901612772565b95506020870135915080821115612b7557600080fd5b50612b8287828801612772565b935050612b92866040870161281d565b91506128e060808601612967565b600080600080600060c08688031215612bb857600080fd5b85359450602086013567ffffffffffffffff80821115612bd757600080fd5b612be389838a01612772565b95506040880135915080821115612bf957600080fd5b50612c0688828901612772565b935050612c16876060880161281d565b9150612c2460a08701612967565b90509295509295909350565b600080600060608486031215612c4557600080fd5b8335925060208401359150612a6c60408501612967565b60005b83811015612c77578181015183820152602001612c5f565b50506000910152565b60008251612c92818460208701612c5c565b9190910192915050565b67ffffffffffffffff828116828216039080821115612ce4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612d26816060850160208701612c5c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000816000a", + linkReferences: {}, +}; diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index d89746313d..a8e3e8e034 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -216,6 +216,8 @@ export interface ExecutionStrategy { */ name: string; + init: () => Promise; + /** * Executes a deployment execution state. */ diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index a3fef768b8..f9dcbc84f5 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -74,14 +74,17 @@ export class EthersIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, + strategy = "basic", }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; + strategy?: "basic" | "create2"; } = { parameters: {}, config: {}, defaultSender: undefined, + strategy: "basic", } ): Promise< IgnitionModuleResultsTToEthersContracts< @@ -109,6 +112,7 @@ export class EthersIgnitionHelper { deploymentParameters: parameters, accounts, defaultSender, + strategy, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 0bfdeb8ffe..3bb1a68433 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -76,6 +76,7 @@ ignitionScope "defaultSender", "Set the default sender for the deployment" ) + .addOptionalParam("strategy", "Set the deployment strategy to use", "basic") .addFlag("reset", "Wipes the existing deployment state before deploying") .addFlag("verify", "Verify the deployment on Etherscan") .setDescription("Deploy a module to the specified network") @@ -88,6 +89,7 @@ ignitionScope defaultSender, reset, verify, + strategy: strategyName, }: { modulePath: string; parameters?: string; @@ -95,6 +97,7 @@ ignitionScope defaultSender: string | undefined; reset: boolean; verify: boolean; + strategy: "basic" | "create2"; }, hre ) => { @@ -108,6 +111,13 @@ ignitionScope const { loadModule } = await import("./utils/load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); + if (strategyName !== "basic" && strategyName !== "create2") { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Invalid strategy name, must be either 'basic' or 'create2'" + ); + } + if (verify) { if ( hre.config.etherscan === undefined || @@ -214,6 +224,7 @@ ignitionScope deploymentParameters: parameters ?? {}, accounts, defaultSender, + strategy: strategyName, }); if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { diff --git a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts new file mode 100644 index 0000000000..76cdb7bf5e --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts @@ -0,0 +1,41 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../test-helpers/mine-block"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; + +/** + * This is the simplest contract deploy case. + * + * Deploy a single contract with non-problematic network + */ +describe("execution - deploy contract with create2", function () { + useEphemeralIgnitionProject("minimal"); + + // eslint-disable-next-line no-only-tests/no-only-tests + it("should deploy a contract that is callable via create2", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + "0x41DA93903Ad107d382fc63d30289477255280AA7" + ); + + assert.equal(await result.foo.read.x(), Number(1)); + }); +}); diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 525041e096..000ae8a6f7 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -65,9 +65,11 @@ export class TestIgnitionHelper { { parameters = {}, config: perDeployConfig = {}, + strategy = "basic", }: { parameters?: DeploymentParameters; config?: Partial; + strategy?: "basic" | "create2"; } = { parameters: {}, config: {}, @@ -94,6 +96,7 @@ export class TestIgnitionHelper { ignitionModule, deploymentParameters: parameters, accounts, + strategy, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { From b1a7ab412e12427a97018ee1244bc8e51558a1f3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 3 Jan 2024 22:34:55 -0500 Subject: [PATCH 1141/1302] update CreateX to v0.1.0 --- packages/core/src/deploy.ts | 12 +- .../execution/create2-execution-strategy.ts | 172 +++++++++++------- .../execution/strategy/createx-artifact.ts | 3 + .../deploy/deploy-contract-with-create2.ts | 2 +- 4 files changed, 110 insertions(+), 79 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index b25d7d1930..6b28c8781e 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -98,12 +98,7 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider); - const executionStrategy = setupStrategy( - strategy, - deploymentLoader, - provider, - accounts - ); + const executionStrategy = setupStrategy(strategy, deploymentLoader, provider); const isAutominedNetwork = await checkAutominedNetwork(provider); @@ -160,8 +155,7 @@ function _resolveDefaultSender( function setupStrategy( strategyName: "basic" | "create2", deploymentLoader: DeploymentLoader, - provider: EIP1193Provider, - accounts: string[] + provider: EIP1193Provider ) { switch (strategyName) { case "basic": @@ -169,7 +163,7 @@ function setupStrategy( deploymentLoader.loadArtifact(artifactId) ); case "create2": - return new Create2ExecutionStrategy(provider, accounts, (artifactId) => + return new Create2ExecutionStrategy(provider, (artifactId) => deploymentLoader.loadArtifact(artifactId) ); } diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index c906437066..a29e825824 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -13,9 +13,8 @@ import { getEventArgumentFromReceipt, getStaticCallExecutionStateResultValue, } from "./execution-strategy-helpers"; -import { sendTransactionForOnchainInteraction } from "./future-processor/helpers/network-interaction-execution"; import { EIP1193JsonRpcClient } from "./jsonrpc-client"; -import { createxArtifact } from "./strategy/createx-artifact"; +import { createxArtifact, presignedTx } from "./strategy/createx-artifact"; import { ExecutionResultType } from "./types/execution-result"; import { CallExecutionState, @@ -32,14 +31,68 @@ import { SendDataStrategyGenerator, StaticCallStrategyGenerator, } from "./types/execution-strategy"; -import { - NetworkInteractionType, - OnchainInteraction, -} from "./types/network-interaction"; +import { NetworkInteractionType } from "./types/network-interaction"; + +// v0.1.0 +const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; const _existingDeployedAddresses: { [key: number]: string } = { - 11155111: "0xE398fcc3f8aBa19CAA6687B9eF7473673A12E6E0", // not the official version - 31337: "0x5FbDB2315678afecb367f032d93F642f64180aa3", // assumes deployed from HH account 0 + 1: CREATE_X_ADDRESS, + 10: CREATE_X_ADDRESS, + 25: CREATE_X_ADDRESS, + 42: CREATE_X_ADDRESS, + 56: CREATE_X_ADDRESS, + 97: CREATE_X_ADDRESS, + 100: CREATE_X_ADDRESS, + 122: CREATE_X_ADDRESS, + 123: CREATE_X_ADDRESS, + 137: CREATE_X_ADDRESS, + 169: CREATE_X_ADDRESS, + 250: CREATE_X_ADDRESS, + 288: CREATE_X_ADDRESS, + 314: CREATE_X_ADDRESS, + 338: CREATE_X_ADDRESS, + 999: CREATE_X_ADDRESS, + 1101: CREATE_X_ADDRESS, + 1284: CREATE_X_ADDRESS, + 1285: CREATE_X_ADDRESS, + 1287: CREATE_X_ADDRESS, + 1442: CREATE_X_ADDRESS, + 2888: CREATE_X_ADDRESS, + 4002: CREATE_X_ADDRESS, + 4201: CREATE_X_ADDRESS, + 5000: CREATE_X_ADDRESS, + 5001: CREATE_X_ADDRESS, + 7700: CREATE_X_ADDRESS, + 7701: CREATE_X_ADDRESS, + 8453: CREATE_X_ADDRESS, + 9000: CREATE_X_ADDRESS, + 9001: CREATE_X_ADDRESS, + 10200: CREATE_X_ADDRESS, + 17000: CREATE_X_ADDRESS, + 42161: CREATE_X_ADDRESS, + 42170: CREATE_X_ADDRESS, + 42220: CREATE_X_ADDRESS, + 43113: CREATE_X_ADDRESS, + 43114: CREATE_X_ADDRESS, + 44787: CREATE_X_ADDRESS, + 59140: CREATE_X_ADDRESS, + 59144: CREATE_X_ADDRESS, + 80001: CREATE_X_ADDRESS, + 84532: CREATE_X_ADDRESS, + 314159: CREATE_X_ADDRESS, + 421614: CREATE_X_ADDRESS, + 534351: CREATE_X_ADDRESS, + 534352: CREATE_X_ADDRESS, + 3441005: CREATE_X_ADDRESS, + 7777777: CREATE_X_ADDRESS, + 11155111: CREATE_X_ADDRESS, + 11155420: CREATE_X_ADDRESS, + 68840142: CREATE_X_ADDRESS, + 1313161554: CREATE_X_ADDRESS, + 1313161555: CREATE_X_ADDRESS, + 1666600000: CREATE_X_ADDRESS, + 1666700000: CREATE_X_ADDRESS, }; /** @@ -49,12 +102,10 @@ const _existingDeployedAddresses: { [key: number]: string } = { */ export class Create2ExecutionStrategy implements ExecutionStrategy { public readonly name: string = "create2"; - private _createXAddress: string = - "0xE398fcc3f8aBa19CAA6687B9eF7473673A12E6E0"; + private _createXAddress: string = CREATE_X_ADDRESS; constructor( private readonly _provider: EIP1193Provider, - private readonly _accounts: string[], private readonly _loadArtifact: LoadArtifactFunction ) {} @@ -66,75 +117,58 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { // if there is an existing deployment, nothing more needs done if (existingDeployedAddress !== undefined) { - const result = await this._provider.request({ - method: "eth_getCode", - params: [existingDeployedAddress], + this._createXAddress = existingDeployedAddress; + + return; + } else if (chainId === 31337) { + // No createX factory found because we're on a local hardhat node + // deploy one using presigned tx from CreateX + await this._provider.request({ + method: "hardhat_setBalance", + params: [ + "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", + "0x58D15E176280000", + ], }); - assertIgnitionInvariant( - chainId === 31337 || result !== "0x", - "CreateX not deployed at expected address" - ); + const txHash = (await this._provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + })) as string; - if (result !== "0x") { - this._createXAddress = existingDeployedAddress; + assertIgnitionInvariant(txHash !== "0x", "CreateX deployment failed"); - return; - } - } - - // No createX factory found, deploy one - const defaultAccount = this._accounts.at(0); - - assertIgnitionInvariant(defaultAccount !== undefined, "No accounts found"); - - const nextNonce = await client.getTransactionCount( - defaultAccount, - "pending" - ); + while (true) { + const receipt = await client.getTransactionReceipt(txHash); - const onchainInteraction: OnchainInteraction = { - id: 1, - type: NetworkInteractionType.ONCHAIN_INTERACTION, - to: undefined, - data: createxArtifact.bytecode, - value: 0n, - transactions: [], - shouldBeResent: false, - }; + if (receipt !== undefined) { + assertIgnitionInvariant( + receipt?.contractAddress !== undefined, + "CreateX deployment should have an address" + ); - const sendResult = await sendTransactionForOnchainInteraction( - client, - defaultAccount, - onchainInteraction, - async (_sender: string) => { - return nextNonce; - }, - // HACK: assuming no decode is required - async () => undefined - ); + this._createXAddress = receipt.contractAddress; + return; + } - assertIgnitionInvariant( - sendResult.type === "TRANSACTION", - "CreateX deployment failed" - ); + await new Promise((res) => setTimeout(res, 200)); + } + } else { + // No createX factory found, but we're not on a local chain + // check if someone else has deployed CreateX on this chain + const result = await this._provider.request({ + method: "eth_getCode", + params: [existingDeployedAddress], + }); - while (true) { - const receipt = await client.getTransactionReceipt( - sendResult.transaction.hash + assertIgnitionInvariant( + result !== "0x", + "CreateX not deployed on current network" ); - if (receipt !== undefined) { - assertIgnitionInvariant( - receipt?.contractAddress !== undefined, - "CreateX deployment should have an address" - ); - - this._createXAddress = receipt.contractAddress; - break; - } + this._createXAddress = existingDeployedAddress; - await new Promise((res) => setTimeout(res, 200)); + return; } } diff --git a/packages/core/src/internal/execution/strategy/createx-artifact.ts b/packages/core/src/internal/execution/strategy/createx-artifact.ts index e7864ac177..033633cc48 100644 --- a/packages/core/src/internal/execution/strategy/createx-artifact.ts +++ b/packages/core/src/internal/execution/strategy/createx-artifact.ts @@ -1,5 +1,8 @@ import { Artifact } from "../../../types/artifact"; +export const presignedTx = + "0xf92f698085174876e800832dc6c08080b92f1660a06040523060805234801561001457600080fd5b50608051612e3e6100d860003960008181610603015281816107050152818161082b015281816108d50152818161127f01528181611375015281816113e00152818161141f015281816114a7015281816115b3015281816117d20152818161183d0152818161187c0152818161190401528181611ac501528181611c7801528181611ce301528181611d2201528181611daa01528181611fe901528181612206015281816122f20152818161244d015281816124a601526125820152612e3e6000f3fe60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f00000000000000000000000000000000000000000000000000000000000000008361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f00000000000000000000000000000000000000000000000000000000000000006107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f00000000000000000000000000000000000000000000000000000000000000006119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f0000000000000000000000000000000000000000000000000000000000000000826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a1ca005f70bf8a1493291468f36ef23b05eb3a4f1807f6b4022942a4104b7537bfc36a029528c0c29546c81e7d78b0277ef87031541bdc96427b246ecedb6d74cd3ed62"; + export const createxArtifact: Artifact = { contractName: "CreateX", sourceName: "CreateX.sol:CreateX", diff --git a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts index 76cdb7bf5e..fe4c2cc714 100644 --- a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts +++ b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts @@ -33,7 +33,7 @@ describe("execution - deploy contract with create2", function () { assert.equal( result.foo.address, - "0x41DA93903Ad107d382fc63d30289477255280AA7" + "0x4b7DcD8BCc106E5Cd7e89837A24BF27cca252C39" ); assert.equal(await result.foo.read.x(), Number(1)); From 53aad4cf44bda8494a66b41e00c8b16a34658b34 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 3 Jan 2024 23:06:42 -0500 Subject: [PATCH 1142/1302] use enum for strategy types --- packages/core/src/deploy.ts | 11 ++++---- packages/core/src/types/deploy.ts | 17 ++++++++++++ .../src/ethers-ignition-helper.ts | 7 ++--- packages/hardhat-plugin/src/index.ts | 26 +++++++++++++------ .../deploy/deploy-contract-with-create2.ts | 7 +++-- .../test/test-helpers/test-ignition-helper.ts | 5 ++-- 6 files changed, 53 insertions(+), 20 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 6b28c8781e..22a49b10b2 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -20,6 +20,7 @@ import { DeployConfig, DeploymentParameters, DeploymentResult, + DeploymentStrategyType, } from "./types/deploy"; import { ExecutionEventListener, @@ -47,7 +48,7 @@ export async function deploy< deploymentParameters, accounts, defaultSender: givenDefaultSender, - strategy = "basic", + strategy = DeploymentStrategyType.BASIC, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -62,7 +63,7 @@ export async function deploy< deploymentParameters: DeploymentParameters; accounts: string[]; defaultSender?: string; - strategy?: "basic" | "create2"; + strategy?: DeploymentStrategyType; }): Promise { if (executionEventListener !== undefined) { executionEventListener.setModuleId({ @@ -153,16 +154,16 @@ function _resolveDefaultSender( } function setupStrategy( - strategyName: "basic" | "create2", + strategyName: DeploymentStrategyType, deploymentLoader: DeploymentLoader, provider: EIP1193Provider ) { switch (strategyName) { - case "basic": + case DeploymentStrategyType.BASIC: return new BasicExecutionStrategy((artifactId) => deploymentLoader.loadArtifact(artifactId) ); - case "create2": + case DeploymentStrategyType.CREATE2: return new Create2ExecutionStrategy(provider, (artifactId) => deploymentLoader.loadArtifact(artifactId) ); diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 4cb8b7f5f2..dd7f7f3a55 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -208,3 +208,20 @@ export interface SuccessfulDeploymentResult { export interface DeploymentParameters { [moduleId: string]: ModuleParameters; } + +/** + * An enumeration of the different types of deployment strategies. + * + * @beta + */ +export enum DeploymentStrategyType { + /** + * The basic deployment strategy. + */ + BASIC = "basic", + + /** + * The create2 deployment strategy. + */ + CREATE2 = "create2", +} diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index f9dcbc84f5..e151f41558 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -6,6 +6,7 @@ import { DeployConfig, DeploymentParameters, DeploymentResultType, + DeploymentStrategyType, EIP1193Provider, Future, IgnitionModule, @@ -74,17 +75,17 @@ export class EthersIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, - strategy = "basic", + strategy = DeploymentStrategyType.BASIC, }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; - strategy?: "basic" | "create2"; + strategy?: DeploymentStrategyType; } = { parameters: {}, config: {}, defaultSender: undefined, - strategy: "basic", + strategy: DeploymentStrategyType.BASIC, } ): Promise< IgnitionModuleResultsTToEthersContracts< diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 3bb1a68433..c806640a8d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -2,6 +2,7 @@ import "@nomicfoundation/hardhat-verify"; import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; import { DeploymentParameters, + DeploymentStrategyType, IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; @@ -89,7 +90,7 @@ ignitionScope defaultSender, reset, verify, - strategy: strategyName, + strategy, }: { modulePath: string; parameters?: string; @@ -97,7 +98,7 @@ ignitionScope defaultSender: string | undefined; reset: boolean; verify: boolean; - strategy: "basic" | "create2"; + strategy: string; }, hre ) => { @@ -111,12 +112,7 @@ ignitionScope const { loadModule } = await import("./utils/load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); - if (strategyName !== "basic" && strategyName !== "create2") { - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - "Invalid strategy name, must be either 'basic' or 'create2'" - ); - } + const strategyName = resolveStrategyName(strategy); if (verify) { if ( @@ -521,3 +517,17 @@ function resolveParametersString(paramString: string): DeploymentParameters { process.exit(1); } } + +function resolveStrategyName(strategy: string): DeploymentStrategyType { + switch (strategy) { + case "basic": + return DeploymentStrategyType.BASIC; + case "create2": + return DeploymentStrategyType.CREATE2; + default: + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Invalid strategy name, must be either 'basic' or 'create2'" + ); + } +} diff --git a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts index fe4c2cc714..388eb30f48 100644 --- a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts +++ b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts @@ -1,5 +1,8 @@ /* eslint-disable import/no-unused-modules */ -import { buildModule } from "@nomicfoundation/ignition-core"; +import { + DeploymentStrategyType, + buildModule, +} from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { mineBlock } from "../test-helpers/mine-block"; @@ -23,7 +26,7 @@ describe("execution - deploy contract with create2", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: "create2", + strategy: DeploymentStrategyType.CREATE2, }); await waitForPendingTxs(this.hre, 1, deployPromise); diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 000ae8a6f7..815d03f641 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -5,6 +5,7 @@ import { DeployConfig, DeploymentParameters, DeploymentResultType, + DeploymentStrategyType, EIP1193Provider, Future, IgnitionModule, @@ -65,11 +66,11 @@ export class TestIgnitionHelper { { parameters = {}, config: perDeployConfig = {}, - strategy = "basic", + strategy = DeploymentStrategyType.BASIC, }: { parameters?: DeploymentParameters; config?: Partial; - strategy?: "basic" | "create2"; + strategy?: DeploymentStrategyType; } = { parameters: {}, config: {}, From 1a22f1c04500a1e23fdf29a09cf3dd8a89e9fad3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 5 Jan 2024 03:02:00 -0500 Subject: [PATCH 1143/1302] update UI to display strategy info --- packages/core/src/deploy.ts | 5 +++++ packages/core/src/types/execution-events.ts | 17 +++++++++++++++-- .../helpers/calculate-deploying-module-panel.ts | 4 +++- .../src/ui/pretty-event-handler.ts | 9 +++++++++ packages/hardhat-plugin/src/ui/types.ts | 6 +++++- .../src/ui/verbose-event-handler.ts | 5 +++++ .../test/ui/helpers/calculate-batch-display.ts | 1 + .../calculate-deploying-module-panel-display.ts | 10 ++++++---- 8 files changed, 49 insertions(+), 8 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 22a49b10b2..eb0b403587 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -70,6 +70,11 @@ export async function deploy< type: ExecutionEventType.SET_MODULE_ID, moduleName: ignitionModule.id, }); + + executionEventListener.setStrategy({ + type: ExecutionEventType.SET_STRATEGY, + strategy, + }); } const validationResult = await validate( diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 0bf6cbb2f1..a858862f07 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -1,4 +1,4 @@ -import { DeploymentResult } from "./deploy"; +import { DeploymentResult, DeploymentStrategyType } from "./deploy"; /** * Events emitted by the execution engine to allow tracking @@ -31,7 +31,8 @@ export type ExecutionEvent = | DeploymentStartEvent | ReconciliationWarningsEvent | BeginNextBatchEvent - | SetModuleIdEvent; + | SetModuleIdEvent + | SetStrategyEvent; /** * The types of diagnostic events emitted during a deploy. @@ -66,6 +67,7 @@ export enum ExecutionEventType { BEGIN_NEXT_BATCH = "BEGIN_NEXT_BATCH", DEPLOYMENT_COMPLETE = "DEPLOYMENT_COMPLETE", SET_MODULE_ID = "SET_MODULE_ID", + SET_STRATEGY = "SET_STRATEGY", } /** @@ -366,6 +368,16 @@ export interface SetModuleIdEvent { moduleName: string; } +/** + * An event indicating the type of strategy being used. + * + * @beta + */ +export interface SetStrategyEvent { + type: ExecutionEventType.SET_STRATEGY; + strategy: DeploymentStrategyType; +} + /** * The types of network interactions that can be requested by a future. * @@ -461,6 +473,7 @@ export interface ExecutionEventTypeMap { [ExecutionEventType.BEGIN_NEXT_BATCH]: BeginNextBatchEvent; [ExecutionEventType.DEPLOYMENT_COMPLETE]: DeploymentCompleteEvent; [ExecutionEventType.SET_MODULE_ID]: SetModuleIdEvent; + [ExecutionEventType.SET_STRATEGY]: SetStrategyEvent; } /** diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts index ed183624e8..d6854ed8b7 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -18,7 +18,9 @@ export function calculateDeployingModulePanel(state: UiState): string { } deployingMessage += `${chalk.bold( - `Deploying [ ${state.moduleName ?? "unknown"} ]` + `Deploying [ ${state.moduleName ?? "unknown"} ] with strategy < ${ + state.strategy ?? "unknown" + } >` )} `; diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index f3f98ffea7..84c4ecbda6 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -26,6 +26,7 @@ import { SendDataExecutionStateCompleteEvent, SendDataExecutionStateInitializeEvent, SetModuleIdEvent, + SetStrategyEvent, StaticCallCompleteEvent, StaticCallExecutionStateCompleteEvent, StaticCallExecutionStateInitializeEvent, @@ -65,6 +66,7 @@ export class PrettyEventHandler implements ExecutionEventListener { isResumed: null, maxFeeBumps: 0, gasBumps: {}, + strategy: null, }; constructor(private _deploymentParams: DeploymentParameters = {}) {} @@ -300,6 +302,13 @@ export class PrettyEventHandler implements ExecutionEventListener { }; } + public setStrategy(event: SetStrategyEvent): void { + this.state = { + ...this.state, + strategy: event.strategy, + }; + } + private _setFutureStatusInitializedAndRedisplayBatch({ futureId, }: { diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 6fabc5c2a6..c7a4567864 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -1,4 +1,7 @@ -import { DeploymentResult } from "@nomicfoundation/ignition-core"; +import { + DeploymentResult, + DeploymentStrategyType, +} from "@nomicfoundation/ignition-core"; export enum UiFutureStatusType { UNSTARTED = "UNSTARTED", @@ -64,6 +67,7 @@ export interface UiState { isResumed: boolean | null; maxFeeBumps: number; gasBumps: Record; + strategy: DeploymentStrategyType | null; } export interface AddressMap { diff --git a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts index ca34006334..dfe31acf21 100644 --- a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts @@ -23,6 +23,7 @@ import { SendDataExecutionStateCompleteEvent, SendDataExecutionStateInitializeEvent, SetModuleIdEvent, + SetStrategyEvent, StaticCallCompleteEvent, StaticCallExecutionStateCompleteEvent, StaticCallExecutionStateInitializeEvent, @@ -265,6 +266,10 @@ export class VerboseEventHandler implements ExecutionEventListener { console.log(`Starting validation for module: ${event.moduleName}`); } + public setStrategy(event: SetStrategyEvent): void { + console.log(`Starting execution with strategy: ${event.strategy}`); + } + public runStart(_event: RunStartEvent): void { console.log("Execution run starting"); } diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index e5e80573ef..6dbea878ce 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -22,6 +22,7 @@ const exampleState: UiState = { isResumed: false, maxFeeBumps: 0, gasBumps: {}, + strategy: null, }; describe("ui - calculate batch display", () => { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index b5c4cf0b5f..01eb0b7fc5 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -1,3 +1,4 @@ +import { DeploymentStrategyType } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import chalk from "chalk"; import path from "path"; @@ -20,13 +21,14 @@ describe("ui - calculate starting message display", () => { isResumed: null, maxFeeBumps: 0, gasBumps: {}, + strategy: DeploymentStrategyType.BASIC, }; it("should display the deploying module message", () => { const expectedText = testFormat(` Hardhat Ignition 🚀 - ${chalk.bold(`Deploying [ ExampleModule ]`)} + ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} `); const actualText = calculateDeployingModulePanel(exampleState); @@ -38,7 +40,7 @@ describe("ui - calculate starting message display", () => { const expectedText = testFormat(` Hardhat Ignition 🚀 - ${chalk.bold(`Deploying [ ExampleModule ]`)} + ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} ${chalk.yellow( "Warning - previously executed futures are not in the module:" @@ -66,7 +68,7 @@ describe("ui - calculate starting message display", () => { ${chalk.bold(`Resuming existing deployment from /users/example`)} - ${chalk.bold(`Deploying [ ExampleModule ]`)} + ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} `); const actualText = calculateDeployingModulePanel({ @@ -85,7 +87,7 @@ describe("ui - calculate starting message display", () => { `Resuming existing deployment from .${path.sep}ignition${path.sep}deployments${path.sep}foo` )} - ${chalk.bold(`Deploying [ ExampleModule ]`)} + ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} `); const actualText = calculateDeployingModulePanel({ From d9de7efd253b46518b58cb0fd5bfdae7d5e3512c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 7 Jan 2024 21:43:54 -0500 Subject: [PATCH 1144/1302] add tests for strategies and create2 --- .../execution/create2-execution-strategy.ts | 4 +- .../deploy/deploy-contract-with-create2.ts | 44 ----- .../error-on-pending-user-transactions.ts | 2 +- .../error-on-user-transaction-sent.ts | 2 +- .../create2-known-chain-id/contracts/Foo.sol | 22 +++ .../create2-known-chain-id/hardhat.config.js | 16 ++ .../ignition/modules/MyModule.js | 8 + .../contracts/Foo.sol | 22 +++ .../hardhat.config.js | 16 ++ .../ignition/modules/MyModule.js | 8 + .../minimal/contracts/Contracts.sol | 12 ++ .../hardhat-plugin/test/strategies/create2.ts | 150 +++++++++++++++++ .../hardhat-plugin/test/strategies/index.ts | 159 ++++++++++++++++++ .../test/test-helpers/createX-tx.ts | 2 + 14 files changed, 419 insertions(+), 48 deletions(-) delete mode 100644 packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js create mode 100644 packages/hardhat-plugin/test/strategies/create2.ts create mode 100644 packages/hardhat-plugin/test/strategies/index.ts create mode 100644 packages/hardhat-plugin/test/test-helpers/createX-tx.ts diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index a29e825824..fb15d8f390 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -158,7 +158,7 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { // check if someone else has deployed CreateX on this chain const result = await this._provider.request({ method: "eth_getCode", - params: [existingDeployedAddress], + params: [CREATE_X_ADDRESS], }); assertIgnitionInvariant( @@ -166,7 +166,7 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { "CreateX not deployed on current network" ); - this._createXAddress = existingDeployedAddress; + this._createXAddress = CREATE_X_ADDRESS; return; } diff --git a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts b/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts deleted file mode 100644 index 388eb30f48..0000000000 --- a/packages/hardhat-plugin/test/deploy/deploy-contract-with-create2.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* eslint-disable import/no-unused-modules */ -import { - DeploymentStrategyType, - buildModule, -} from "@nomicfoundation/ignition-core"; -import { assert } from "chai"; - -import { mineBlock } from "../test-helpers/mine-block"; -import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; -import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; - -/** - * This is the simplest contract deploy case. - * - * Deploy a single contract with non-problematic network - */ -describe("execution - deploy contract with create2", function () { - useEphemeralIgnitionProject("minimal"); - - // eslint-disable-next-line no-only-tests/no-only-tests - it("should deploy a contract that is callable via create2", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, - }); - - await waitForPendingTxs(this.hre, 1, deployPromise); - await mineBlock(this.hre); - - const result = await deployPromise; - - assert.equal( - result.foo.address, - "0x4b7DcD8BCc106E5Cd7e89837A24BF27cca252C39" - ); - - assert.equal(await result.foo.read.x(), Number(1)); - }); -}); diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts index eb7481e71e..35b336cbb7 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts @@ -71,7 +71,7 @@ describe("execution - error on pending user transactions", () => { const outsideFoo = await deployPromise; assert.equal( outsideFoo, - "0x5054a9247b1e76c38c899ec541b5e694e998b7f1ac8438defd6973a6609919ea" + "0xb25a64557ee3b3592c0a2a6d8b37594c878edb6b588949417bdaa04bec2e1420" ); }); }); diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts index 4a0c7b3b5a..54bbd357d3 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts @@ -71,7 +71,7 @@ describe("execution - error on user transaction sent", () => { const fooAddress = await deployPromise; assert.equal( fooAddress, - "0x99f3e275f941aaef0a8e65dd47479ea8de4de81c993869921f0a902715806737" + "0x4bda2fa32866d86ef74f8cb2e50640b0a7ce00d9ee6c103cc2b66a2a8885e432" ); }), "IGN405: The next nonce for 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc should be 1, but is 2. Please make sure not to send transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc while running this deployment and try again." diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol new file mode 100644 index 0000000000..992dab4f1d --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js new file mode 100644 index 0000000000..4b67cc0a66 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js @@ -0,0 +1,16 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + chainId: 1, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js new file mode 100644 index 0000000000..11dd2c6589 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol new file mode 100644 index 0000000000..992dab4f1d --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js new file mode 100644 index 0000000000..186e6f152e --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js @@ -0,0 +1,16 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + networks: { + hardhat: { + mining: { + auto: false, + }, + chainId: 88888, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js new file mode 100644 index 0000000000..11dd2c6589 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index 5b1ae2d7d1..ed0292844a 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -58,9 +58,17 @@ contract StaticCallValue { contract EventArgValue { event EventValue(uint256 value); + bool public argWasValidated; + constructor() { emit EventValue(42); } + + function validateEmitted(uint256 arg) public { + argWasValidated = true; + + require(arg == 42, "arg is wrong"); + } } contract PassingValue { @@ -214,6 +222,10 @@ contract SendDataEmitter { emit SendDataEvent(true); } + function emitEvent() public { + emit SendDataEvent(true); + } + function validateEmitted(bool arg) public { wasEmitted = true; diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts new file mode 100644 index 0000000000..8e42ab62d5 --- /dev/null +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -0,0 +1,150 @@ +/* eslint-disable import/no-unused-modules */ +import { + DeploymentStrategyType, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { presignedTx } from "../test-helpers/createX-tx"; +import { mineBlock } from "../test-helpers/mine-block"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; + +describe("create2", function () { + describe("preexisting createX contract", function () { + describe("known chain ID", function () { + useEphemeralIgnitionProject("create2-known-chain-id"); + + it("should deploy a contract using a createX contract from the known list", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await this.hre.network.provider.request({ + method: "hardhat_setBalance", + params: [ + "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", + "0x58D15E176280000", + ], + }); + + await this.hre.network.provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + "0xD0413777977a4060eEBbb10aEA136576376755D9" + ); + + assert.equal(this.hre.network.config.chainId, 1); + assert.equal(await result.foo.read.x(), Number(1)); + }); + }); + + describe("unknown chain ID", function () { + useEphemeralIgnitionProject("create2-unknown-chain-id"); + + it("should deploy a contract using a createX contract not on the known list", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await this.hre.network.provider.request({ + method: "hardhat_setBalance", + params: [ + "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", + "0x58D15E176280000", + ], + }); + + await this.hre.network.provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + "0xD0413777977a4060eEBbb10aEA136576376755D9" + ); + + assert.equal(this.hre.network.config.chainId, 88888); + assert.equal(await result.foo.read.x(), Number(1)); + }); + }); + }); + + describe("no preexisting createX contract", function () { + describe("hardhat network", function () { + useEphemeralIgnitionProject("minimal"); + + it("should deploy a contract using create2 on hardhat network", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + "0xFF5085c5C29fA69357643d371E42341A35B78d8e" + ); + + assert.equal(this.hre.network.config.chainId, 31337); + assert.equal(await result.foo.read.x(), Number(1)); + }); + }); + + describe("non hardhat network", function () { + useEphemeralIgnitionProject("create2-unknown-chain-id"); + + it("should throw when no createX contract exists on the network", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + assert.equal(this.hre.network.config.chainId, 88888); + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }), + /IGN1: Internal Hardhat Ignition invariant was violated: CreateX not deployed on current network/ + ); + }); + }); + }); +}); diff --git a/packages/hardhat-plugin/test/strategies/index.ts b/packages/hardhat-plugin/test/strategies/index.ts new file mode 100644 index 0000000000..12f2490c76 --- /dev/null +++ b/packages/hardhat-plugin/test/strategies/index.ts @@ -0,0 +1,159 @@ +import { + DeploymentStrategyType, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { mineBlock } from "../test-helpers/mine-block"; +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; +import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; + +const strategies = ["basic", "create2"]; + +describe("strategies", function () { + strategies.forEach((strategy) => { + describe(strategy, function () { + useEphemeralIgnitionProject("minimal"); + + it("should deploy a contract", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(1)); + }); + + it("should deploy multiple contracts", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + const bar = m.contract("Bar"); + + return { foo, bar }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 2, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + assert.isDefined(result.bar.address); + + assert.equal(await result.foo.read.x(), Number(1)); + assert.equal(await result.bar.read.isBar(), true); + }); + + it("should call a contract function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + m.call(foo, "inc"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(2)); + }); + + it("should read an event emitted from a constructor", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("EventArgValue"); + + const arg = m.readEventArgument(foo, "EventValue", "value"); + + m.call(foo, "validateEmitted", [arg]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.argWasValidated(), true); + }); + + it("should read an event emitted from a function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("SendDataEmitter"); + + const eventCall = m.call(foo, "emitEvent"); + + const arg = m.readEventArgument(eventCall, "SendDataEvent", "arg", { + emitter: foo, + }); + + m.call(foo, "validateEmitted", [arg]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.wasEmitted(), true); + }); + }); + }); +}); + +function strategyNameToType(strategyName: string): DeploymentStrategyType { + switch (strategyName) { + case "basic": + return DeploymentStrategyType.BASIC; + case "create2": + return DeploymentStrategyType.CREATE2; + default: + throw new Error(`Unknown strategy name: ${strategyName}`); + } +} diff --git a/packages/hardhat-plugin/test/test-helpers/createX-tx.ts b/packages/hardhat-plugin/test/test-helpers/createX-tx.ts new file mode 100644 index 0000000000..2df94f2a7a --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/createX-tx.ts @@ -0,0 +1,2 @@ +export const presignedTx = + "0xf92f698085174876e800832dc6c08080b92f1660a06040523060805234801561001457600080fd5b50608051612e3e6100d860003960008181610603015281816107050152818161082b015281816108d50152818161127f01528181611375015281816113e00152818161141f015281816114a7015281816115b3015281816117d20152818161183d0152818161187c0152818161190401528181611ac501528181611c7801528181611ce301528181611d2201528181611daa01528181611fe901528181612206015281816122f20152818161244d015281816124a601526125820152612e3e6000f3fe60806040526004361061018a5760003560e01c806381503da1116100d6578063d323826a1161007f578063e96deee411610059578063e96deee414610395578063f5745aba146103a8578063f9664498146103bb57600080fd5b8063d323826a1461034f578063ddda0acb1461036f578063e437252a1461038257600080fd5b80639c36a286116100b05780639c36a28614610316578063a7db93f214610329578063c3fe107b1461033c57600080fd5b806381503da1146102d0578063890c283b146102e357806398e810771461030357600080fd5b80632f990e3f116101385780636cec2536116101125780636cec25361461027d57806374637a7a1461029d5780637f565360146102bd57600080fd5b80632f990e3f1461023757806331a7c8c81461024a57806342d654fc1461025d57600080fd5b806327fe18221161016957806327fe1822146101f15780632852527a1461020457806328ddd0461461021757600080fd5b8062d84acb1461018f57806326307668146101cb57806326a32fc7146101de575b600080fd5b6101a261019d366004612915565b6103ce565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b6101a26101d9366004612994565b6103e6565b6101a26101ec3660046129db565b610452565b6101a26101ff3660046129db565b6104de565b6101a2610212366004612a39565b610539565b34801561022357600080fd5b506101a2610232366004612a90565b6106fe565b6101a2610245366004612aa9565b61072a565b6101a2610258366004612aa9565b6107bb565b34801561026957600080fd5b506101a2610278366004612b1e565b6107c9565b34801561028957600080fd5b506101a2610298366004612a90565b610823565b3480156102a957600080fd5b506101a26102b8366004612b4a565b61084f565b6101a26102cb3660046129db565b611162565b6101a26102de366004612b74565b6111e8565b3480156102ef57600080fd5b506101a26102fe366004612bac565b611276565b6101a2610311366004612bce565b6112a3565b6101a2610324366004612994565b611505565b6101a2610337366004612c49565b6116f1565b6101a261034a366004612aa9565b611964565b34801561035b57600080fd5b506101a261036a366004612cd9565b6119ed565b6101a261037d366004612c49565b611a17565b6101a2610390366004612bce565b611e0c565b6101a26103a3366004612915565b611e95565b6101a26103b6366004612bce565b611ea4565b6101a26103c9366004612b74565b611f2d565b60006103dd8585858533611a17565b95945050505050565b6000806103f2846120db565b90508083516020850134f59150610408826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a35092915050565b60006104d86104d260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b836103e6565b92915050565b600081516020830134f090506104f3816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a2919050565b600080610545856120db565b905060008460601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152826037826000f593505073ffffffffffffffffffffffffffffffffffffffff8316610635576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001660048201526024015b60405180910390fd5b604051829073ffffffffffffffffffffffffffffffffffffffff8516907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808473ffffffffffffffffffffffffffffffffffffffff1634876040516106a19190612d29565b60006040518083038185875af1925050503d80600081146106de576040519150601f19603f3d011682016040523d82523d6000602084013e6106e3565b606091505b50915091506106f382828961247d565b505050509392505050565b60006104d87f00000000000000000000000000000000000000000000000000000000000000008361084f565b60006107b36107aa60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b85858533611a17565b949350505050565b60006107b3848484336112a3565b60006040518260005260ff600b53836020527f21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f6040526055600b20601452806040525061d694600052600160345350506017601e20919050565b60006104d8827f00000000000000000000000000000000000000000000000000000000000000006107c9565b600060607f9400000000000000000000000000000000000000000000000000000000000000610887600167ffffffffffffffff612d45565b67ffffffffffffffff16841115610902576040517f3c55ab3b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b836000036109c7576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f800000000000000000000000000000000000000000000000000000000000000060368201526037015b6040516020818303038152906040529150611152565b607f8411610a60576040517fd60000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b16602283015260f886901b1660368201526037016109b1565b60ff8411610b1f576040517fd70000000000000000000000000000000000000000000000000000000000000060208201527fff0000000000000000000000000000000000000000000000000000000000000080831660218301527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606088901b1660228301527f8100000000000000000000000000000000000000000000000000000000000000603683015260f886901b1660378201526038016109b1565b61ffff8411610bff576040517fd80000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f820000000000000000000000000000000000000000000000000000000000000060368201527fffff00000000000000000000000000000000000000000000000000000000000060f086901b1660378201526039016109b1565b62ffffff8411610ce0576040517fd90000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f830000000000000000000000000000000000000000000000000000000000000060368201527fffffff000000000000000000000000000000000000000000000000000000000060e886901b166037820152603a016109b1565b63ffffffff8411610dc2576040517fda0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f840000000000000000000000000000000000000000000000000000000000000060368201527fffffffff0000000000000000000000000000000000000000000000000000000060e086901b166037820152603b016109b1565b64ffffffffff8411610ea5576040517fdb0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f850000000000000000000000000000000000000000000000000000000000000060368201527fffffffffff00000000000000000000000000000000000000000000000000000060d886901b166037820152603c016109b1565b65ffffffffffff8411610f89576040517fdc0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f860000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffff000000000000000000000000000000000000000000000000000060d086901b166037820152603d016109b1565b66ffffffffffffff841161106e576040517fdd0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f870000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffff0000000000000000000000000000000000000000000000000060c886901b166037820152603e016109b1565b6040517fde0000000000000000000000000000000000000000000000000000000000000060208201527fff00000000000000000000000000000000000000000000000000000000000000821660218201527fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606087901b1660228201527f880000000000000000000000000000000000000000000000000000000000000060368201527fffffffffffffffff00000000000000000000000000000000000000000000000060c086901b166037820152603f0160405160208183030381529060405291505b5080516020909101209392505050565b60006104d86111e260408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b83611505565b600061126f61126860408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b8484610539565b9392505050565b600061126f83837f00000000000000000000000000000000000000000000000000000000000000006119ed565b60008451602086018451f090506112b9816123d3565b60405173ffffffffffffffffffffffffffffffffffffffff8216907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808273ffffffffffffffffffffffffffffffffffffffff168560200151876040516113279190612d29565b60006040518083038185875af1925050503d8060008114611364576040519150601f19603f3d011682016040523d82523d6000602084013e611369565b606091505b5091509150816113c9577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001631156114fb578373ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611495576040519150601f19603f3d011682016040523d82523d6000602084013e61149a565b606091505b509092509050816114fb577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b5050949350505050565b600080611511846120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff81166115e0576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a361162c83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1634876040516116569190612d29565b60006040518083038185875af1925050503d8060008114611693576040519150601f19603f3d011682016040523d82523d6000602084013e611698565b606091505b505090506116a681866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a25050505092915050565b6000806116fd876120db565b9050808651602088018651f59150611714826123d3565b604051819073ffffffffffffffffffffffffffffffffffffffff8416907fb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f790600090a36000808373ffffffffffffffffffffffffffffffffffffffff168660200151886040516117849190612d29565b60006040518083038185875af1925050503d80600081146117c1576040519150601f19603f3d011682016040523d82523d6000602084013e6117c6565b606091505b509150915081611826577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611958578473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d80600081146118f2576040519150601f19603f3d011682016040523d82523d6000602084013e6118f7565b606091505b50909250905081611958577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b50505095945050505050565b60006107b36119e460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b858585336116f1565b6000604051836040820152846020820152828152600b8101905060ff815360559020949350505050565b600080611a23876120db565b905060006040518060400160405280601081526020017f67363d3d37363d34f03d5260086018f30000000000000000000000000000000081525090506000828251602084016000f5905073ffffffffffffffffffffffffffffffffffffffff8116611af2576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b604051839073ffffffffffffffffffffffffffffffffffffffff8316907f2feea65dd4e9f9cbd86b74b7734210c59a1b2981b5b137bd0ee3e208200c906790600090a3611b3e83610823565b935060008173ffffffffffffffffffffffffffffffffffffffff1687600001518a604051611b6c9190612d29565b60006040518083038185875af1925050503d8060008114611ba9576040519150601f19603f3d011682016040523d82523d6000602084013e611bae565b606091505b50509050611bbc81866124ff565b60405173ffffffffffffffffffffffffffffffffffffffff8616907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a260608573ffffffffffffffffffffffffffffffffffffffff1688602001518a604051611c299190612d29565b60006040518083038185875af1925050503d8060008114611c66576040519150601f19603f3d011682016040523d82523d6000602084013e611c6b565b606091505b50909250905081611ccc577f0000000000000000000000000000000000000000000000000000000000000000816040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163115611dfe578673ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163160405160006040518083038185875af1925050503d8060008114611d98576040519150601f19603f3d011682016040523d82523d6000602084013e611d9d565b606091505b50909250905081611dfe577f0000000000000000000000000000000000000000000000000000000000000000816040517fc2b3f44500000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050505095945050505050565b60006103dd611e8c60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b868686866116f1565b60006103dd85858585336116f1565b60006103dd611f2460408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b86868686611a17565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f092505073ffffffffffffffffffffffffffffffffffffffff8216612016576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b60405173ffffffffffffffffffffffffffffffffffffffff8316907f4db17dd5e4732fb6da34a148104a592783ca119a1e7bb8829eba6cbadef0b51190600090a26000808373ffffffffffffffffffffffffffffffffffffffff1634866040516120809190612d29565b60006040518083038185875af1925050503d80600081146120bd576040519150601f19603f3d011682016040523d82523d6000602084013e6120c2565b606091505b50915091506120d282828861247d565b50505092915050565b60008060006120e9846125b3565b9092509050600082600281111561210257612102612e02565b1480156121205750600081600281111561211e5761211e612e02565b145b1561215e57604080513360208201524691810191909152606081018590526080016040516020818303038152906040528051906020012092506123cc565b600082600281111561217257612172612e02565b1480156121905750600181600281111561218e5761218e612e02565b145b156121b0576121a9338560009182526020526040902090565b92506123cc565b60008260028111156121c4576121c4612e02565b03612233576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b600182600281111561224757612247612e02565b1480156122655750600081600281111561226357612263612e02565b145b1561227e576121a9468560009182526020526040902090565b600182600281111561229257612292612e02565b1480156122b0575060028160028111156122ae576122ae612e02565b145b1561231f576040517f13b3a2a100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b61239a60408051437fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101406020830152419282019290925260608101919091524260808201524460a08201524660c08201523360e08201526000906101000160405160208183030381529060405280519060200120905090565b84036123a657836123c9565b604080516020810186905201604051602081830303815290604052805190602001205b92505b5050919050565b73ffffffffffffffffffffffffffffffffffffffff8116158061240b575073ffffffffffffffffffffffffffffffffffffffff81163b155b1561247a576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b50565b82158061249f575073ffffffffffffffffffffffffffffffffffffffff81163b155b156124fa577f0000000000000000000000000000000000000000000000000000000000000000826040517fa57ca23900000000000000000000000000000000000000000000000000000000815260040161062c929190612d94565b505050565b811580612520575073ffffffffffffffffffffffffffffffffffffffff8116155b80612540575073ffffffffffffffffffffffffffffffffffffffff81163b155b156125af576040517fc05cee7a00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016600482015260240161062c565b5050565b600080606083901c3314801561261057508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b1561262057506000905080915091565b606083901c3314801561265a57507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561266b5750600090506001915091565b33606084901c036126825750600090506002915091565b606083901c1580156126db57508260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000145b156126ec5750600190506000915091565b606083901c15801561272557507fff00000000000000000000000000000000000000000000000000000000000000601484901a60f81b16155b1561273557506001905080915091565b606083901c61274a5750600190506002915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167f0100000000000000000000000000000000000000000000000000000000000000036127a55750600290506000915091565b8260141a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166000036127e15750600290506001915091565b506002905080915091565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f83011261282c57600080fd5b813567ffffffffffffffff80821115612847576128476127ec565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561288d5761288d6127ec565b816040528381528660208588010111156128a657600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000604082840312156128d857600080fd5b6040516040810181811067ffffffffffffffff821117156128fb576128fb6127ec565b604052823581526020928301359281019290925250919050565b60008060008060a0858703121561292b57600080fd5b84359350602085013567ffffffffffffffff8082111561294a57600080fd5b6129568883890161281b565b9450604087013591508082111561296c57600080fd5b506129798782880161281b565b92505061298986606087016128c6565b905092959194509250565b600080604083850312156129a757600080fd5b82359150602083013567ffffffffffffffff8111156129c557600080fd5b6129d18582860161281b565b9150509250929050565b6000602082840312156129ed57600080fd5b813567ffffffffffffffff811115612a0457600080fd5b6107b38482850161281b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a3457600080fd5b919050565b600080600060608486031215612a4e57600080fd5b83359250612a5e60208501612a10565b9150604084013567ffffffffffffffff811115612a7a57600080fd5b612a868682870161281b565b9150509250925092565b600060208284031215612aa257600080fd5b5035919050565b600080600060808486031215612abe57600080fd5b833567ffffffffffffffff80821115612ad657600080fd5b612ae28783880161281b565b94506020860135915080821115612af857600080fd5b50612b058682870161281b565b925050612b1585604086016128c6565b90509250925092565b60008060408385031215612b3157600080fd5b82359150612b4160208401612a10565b90509250929050565b60008060408385031215612b5d57600080fd5b612b6683612a10565b946020939093013593505050565b60008060408385031215612b8757600080fd5b612b9083612a10565b9150602083013567ffffffffffffffff8111156129c557600080fd5b60008060408385031215612bbf57600080fd5b50508035926020909101359150565b60008060008060a08587031215612be457600080fd5b843567ffffffffffffffff80821115612bfc57600080fd5b612c088883890161281b565b95506020870135915080821115612c1e57600080fd5b50612c2b8782880161281b565b935050612c3b86604087016128c6565b915061298960808601612a10565b600080600080600060c08688031215612c6157600080fd5b85359450602086013567ffffffffffffffff80821115612c8057600080fd5b612c8c89838a0161281b565b95506040880135915080821115612ca257600080fd5b50612caf8882890161281b565b935050612cbf87606088016128c6565b9150612ccd60a08701612a10565b90509295509295909350565b600080600060608486031215612cee57600080fd5b8335925060208401359150612b1560408501612a10565b60005b83811015612d20578181015183820152602001612d08565b50506000910152565b60008251612d3b818460208701612d05565b9190910192915050565b67ffffffffffffffff828116828216039080821115612d8d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5092915050565b73ffffffffffffffffffffffffffffffffffffffff831681526040602082015260008251806040840152612dcf816060850160208701612d05565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016060019392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fdfea164736f6c6343000817000a1ca005f70bf8a1493291468f36ef23b05eb3a4f1807f6b4022942a4104b7537bfc36a029528c0c29546c81e7d78b0277ef87031541bdc96427b246ecedb6d74cd3ed62"; From e44c3cfe69b3459ac9315a93582514131ec42bcb Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 12 Jan 2024 10:57:46 +0000 Subject: [PATCH 1145/1302] test: rework arg check This might be voodoo, but I preferred the check against a number rather than a boolean in the previous validation, so brought into the later test. --- .../nonce-checks/error-on-pending-user-transactions.ts | 2 +- .../nonce-checks/error-on-user-transaction-sent.ts | 2 +- .../fixture-projects/minimal/contracts/Contracts.sol | 10 +++++----- packages/hardhat-plugin/test/strategies/create2.ts | 2 +- packages/hardhat-plugin/test/strategies/index.ts | 3 +++ 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts index 35b336cbb7..0c6b0bf22e 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts @@ -71,7 +71,7 @@ describe("execution - error on pending user transactions", () => { const outsideFoo = await deployPromise; assert.equal( outsideFoo, - "0xb25a64557ee3b3592c0a2a6d8b37594c878edb6b588949417bdaa04bec2e1420" + "0x6fc05e1e8096486e2d1915422156881dae8cfab3b6b3c3b10d601ede86064728" ); }); }); diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts index 54bbd357d3..70ce8527d9 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts @@ -71,7 +71,7 @@ describe("execution - error on user transaction sent", () => { const fooAddress = await deployPromise; assert.equal( fooAddress, - "0x4bda2fa32866d86ef74f8cb2e50640b0a7ce00d9ee6c103cc2b66a2a8885e432" + "0xb7c46c5649eb7605fe06c888cdbd6aa9239a24d24cd57cebf6fb1f8b56c0987f" ); }), "IGN405: The next nonce for 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc should be 1, but is 2. Please make sure not to send transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc while running this deployment and try again." diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol index ed0292844a..3087c4fbea 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol @@ -214,21 +214,21 @@ contract CaptureComplexObjectContract { } contract SendDataEmitter { - event SendDataEvent(bool arg); + event SendDataEvent(uint256 arg); bool public wasEmitted; receive() external payable { - emit SendDataEvent(true); + emit SendDataEvent(42); } function emitEvent() public { - emit SendDataEvent(true); + emit SendDataEvent(42); } - function validateEmitted(bool arg) public { + function validateEmitted(uint256 arg) public { wasEmitted = true; - require(arg == true, "arg is wrong"); + require(arg == 42, "arg is wrong"); } } diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 8e42ab62d5..1eb1778a91 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -119,7 +119,7 @@ describe("create2", function () { assert.equal( result.foo.address, - "0xFF5085c5C29fA69357643d371E42341A35B78d8e" + "0xAfF5D98121a6dc830E77cf0DE34ec13d736baBFd" ); assert.equal(this.hre.network.config.chainId, 31337); diff --git a/packages/hardhat-plugin/test/strategies/index.ts b/packages/hardhat-plugin/test/strategies/index.ts index 12f2490c76..65fdedc4f8 100644 --- a/packages/hardhat-plugin/test/strategies/index.ts +++ b/packages/hardhat-plugin/test/strategies/index.ts @@ -63,6 +63,7 @@ describe("strategies", function () { it("should call a contract function", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("Foo"); + m.call(foo, "inc"); return { foo }; @@ -90,6 +91,7 @@ describe("strategies", function () { const arg = m.readEventArgument(foo, "EventValue", "value"); + // will revert if the event argument is not equal to 42 m.call(foo, "validateEmitted", [arg]); return { foo }; @@ -121,6 +123,7 @@ describe("strategies", function () { emitter: foo, }); + // will revert if the event argument is not equal to 42 m.call(foo, "validateEmitted", [arg]); return { foo }; From 8718685a4075e8bd90f53fa82788bb076e654833 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 12 Jan 2024 11:32:58 +0000 Subject: [PATCH 1146/1302] test: split the contracts file This is a refactor to avoid having to change lots of tests when you tweak a single contract. I updated the contract loader as well in passing in some of the older tests. --- .../externally-loaded-contract.ts | 2 +- .../externally-loaded-contract.ts | 2 +- .../error-on-pending-user-transactions.ts | 6 +- ...-with-replaced-pending-user-transaction.ts | 4 +- .../error-on-user-transaction-sent.ts | 6 +- ...ith-replaced-confirmed-user-transaction.ts | 4 +- .../minimal/contracts/Bar.sol | 6 + .../contracts/CaptureArraysContract.sol | 47 ++++ .../CaptureComplexObjectContract.sol | 41 +++ .../minimal/contracts/Contracts.sol | 234 ------------------ .../minimal/contracts/EventArgValue.sol | 24 ++ .../minimal/contracts/Factory.sol | 2 +- .../minimal/contracts/Foo.sol | 21 ++ .../minimal/contracts/Greeter.sol | 14 ++ .../minimal/contracts/SendDataEmitter.sol | 22 ++ .../minimal/contracts/StaticCallValue.sol | 8 + .../minimal/contracts/TupleEmitter.sol | 29 +++ .../minimal/contracts/TupleReturn.sol | 27 ++ .../minimal/contracts/UsesContract.sol | 14 ++ .../hardhat-plugin/test/strategies/create2.ts | 2 +- 20 files changed, 267 insertions(+), 248 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol delete mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol diff --git a/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts index 4a705cbd02..cd8f2a6172 100644 --- a/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts +++ b/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts @@ -24,7 +24,7 @@ export const externallyLoadedContractArtifact = { _format: "hh-sol-artifact-1", contractName: "ExternallyLoadedContract", - sourceName: "contracts/Contracts.sol", + sourceName: "contracts/Foo.sol", abi: [ { inputs: [ diff --git a/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts index 4a705cbd02..cd8f2a6172 100644 --- a/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts +++ b/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts @@ -24,7 +24,7 @@ export const externallyLoadedContractArtifact = { _format: "hh-sol-artifact-1", contractName: "ExternallyLoadedContract", - sourceName: "contracts/Contracts.sol", + sourceName: "contracts/Foo.sol", abi: [ { inputs: [ diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts index 0c6b0bf22e..460c582b59 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts @@ -34,7 +34,7 @@ describe("execution - error on pending user transactions", () => { }; }); - const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); // Before deploy, put a valid transaction into the mempool for accounts[2] const [, , signer2] = (await this.hre.network.provider.request({ @@ -48,7 +48,7 @@ describe("execution - error on pending user transactions", () => { const deployPromise = walletClient.deployContract({ abi: FooArtifact.abi, - bytecode: FooArtifact.bytecode, + bytecode: FooArtifact.bytecode as `0x${string}`, args: [], account: signer2 as `0x${string}`, }); @@ -71,7 +71,7 @@ describe("execution - error on pending user transactions", () => { const outsideFoo = await deployPromise; assert.equal( outsideFoo, - "0x6fc05e1e8096486e2d1915422156881dae8cfab3b6b3c3b10d601ede86064728" + "0x3d0ac80b8daf180b4d03e0ff107caa7089b5494cdbd81ba9d7619cc4d710caae" ); }); }); diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts index 8f69d76834..3d3ec36546 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts @@ -50,7 +50,7 @@ describe("execution - error on rerun with replaced pending user transaction", () } ); - const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); // Send user interefering deploy transaction, between runs // so it is in mempool, overriding the existing nonce 2 @@ -66,7 +66,7 @@ describe("execution - error on rerun with replaced pending user transaction", () void walletClient.deployContract({ abi: FooArtifact.abi, - bytecode: FooArtifact.bytecode, + bytecode: FooArtifact.bytecode as `0x${string}`, args: [], account: signer2 as `0x${string}`, gasPrice: parseEther("500", "gwei"), diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts index 70ce8527d9..ba5f88e346 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts @@ -44,7 +44,7 @@ describe("execution - error on user transaction sent", () => { // wait for foo1 to be submitted await c.waitForPendingTxs(1); - const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); // Submit user interference transaction to mempool (note a fresh // nonce is used, so no replacement) @@ -59,7 +59,7 @@ describe("execution - error on user transaction sent", () => { const deployPromise = walletClient.deployContract({ abi: FooArtifact.abi, - bytecode: FooArtifact.bytecode, + bytecode: FooArtifact.bytecode as `0x${string}`, args: [], account: signer2 as `0x${string}`, gasPrice: 500_000_000_000n, @@ -71,7 +71,7 @@ describe("execution - error on user transaction sent", () => { const fooAddress = await deployPromise; assert.equal( fooAddress, - "0xb7c46c5649eb7605fe06c888cdbd6aa9239a24d24cd57cebf6fb1f8b56c0987f" + "0x9154ff20c97a7ebf9d2ebbb3f8b7e24bf99caee050a24c50f1162492c0b6af79" ); }), "IGN405: The next nonce for 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc should be 1, but is 2. Please make sure not to send transactions from 0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc while running this deployment and try again." diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts index 371a8dfb43..5d5b00e8fd 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts @@ -54,7 +54,7 @@ describe("execution - rerun with replaced confirmed user transaction", () => { } ); - const FooArtifact = require("../../fixture-projects/minimal/artifacts/contracts/Contracts.sol/Foo.json"); + const FooArtifact = this.hre.artifacts.readArtifactSync("Foo"); // Submit a user interfering deploy transaction // to the mempool reusing nonce 2 @@ -69,7 +69,7 @@ describe("execution - rerun with replaced confirmed user transaction", () => { const deployPromise = walletClient.deployContract({ abi: FooArtifact.abi, - bytecode: FooArtifact.bytecode, + bytecode: FooArtifact.bytecode as `0x${string}`, args: [], account: signer2 as `0x${string}`, gasPrice: parseEther("500", "gwei"), diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol new file mode 100644 index 0000000000..1ee84c4f40 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol @@ -0,0 +1,6 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Bar { + bool public isBar = true; +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol new file mode 100644 index 0000000000..7cc2e4871f --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol @@ -0,0 +1,47 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract CaptureArraysContract { + bool public arraysCaptured; + + constructor() { + arraysCaptured = false; + } + + function recordArrays( + uint256[] memory first, + string[] memory second, + bool[] memory third + ) public returns (uint256 output) { + arraysCaptured = true; + + require(first.length == 3, "Wrong number of args on first arg"); + require(first[0] == 1, "First value is wrong"); + require(first[1] == 2, "Second value is wrong"); + require(first[2] == 3, "Third value is wrong"); + + require(second.length == 3, "Wrong number of args on second arg"); + require( + keccak256(abi.encodePacked(second[0])) == + keccak256(abi.encodePacked("a")), + "First value is wrong" + ); + require( + keccak256(abi.encodePacked(second[1])) == + keccak256(abi.encodePacked("b")), + "Second value is wrong" + ); + require( + keccak256(abi.encodePacked(second[2])) == + keccak256(abi.encodePacked("c")), + "Third value is wrong" + ); + + require(third.length == 3, "Wrong number of args on third arg"); + require(third[0] == true, "First value is wrong"); + require(third[1] == false, "Second value is wrong"); + require(third[2] == true, "Third value is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol new file mode 100644 index 0000000000..698c71207f --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract CaptureComplexObjectContract { + bool public complexArgCaptured; + + constructor() { + complexArgCaptured = false; + } + + struct SubComplex { + string sub; + } + + struct Complex { + bool firstBool; + uint256[] secondArray; + SubComplex thirdSubcomplex; + } + + function testComplexObject( + Complex memory complexArg + ) public returns (uint256 output) { + complexArgCaptured = true; + + require(complexArg.firstBool, "bad first bool"); + + require(complexArg.secondArray.length == 3, "bad second array"); + require(complexArg.secondArray[0] == 1, "First value is wrong"); + require(complexArg.secondArray[1] == 2, "Second value is wrong"); + require(complexArg.secondArray[2] == 3, "Third value is wrong"); + + require( + keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == + keccak256(abi.encodePacked("sub")), + "The complex sub object property is wrong" + ); + + return 1; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol deleted file mode 100644 index 3087c4fbea..0000000000 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Contracts.sol +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-License-Identifier: GPL-3.0 -pragma solidity >=0.7.0 <0.9.0; -pragma experimental ABIEncoderV2; - -contract Foo { - bool public isFoo = true; - uint256 public x = 1; - - function inc() public { - x++; - } - - function incByPositiveNumber(uint256 n) public { - require(n > 0, "n must be positive"); - x += n; - } - - function incTwoNumbers(uint256 first, uint256 second) public { - x += first; - x += second; - } -} - -contract Bar { - bool public isBar = true; -} - -contract UsesContract { - address public contractAddress; - - constructor(address _contract) { - contractAddress = _contract; - } - - function setAddress(address _contract) public { - contractAddress = _contract; - } -} - -contract Greeter { - string private _greeting; - - constructor(string memory greeting) { - _greeting = greeting; - } - - function getGreeting() public view returns (string memory) { - return _greeting; - } -} - -contract StaticCallValue { - function getValue() public pure returns (uint256) { - return 42; - } -} - -contract EventArgValue { - event EventValue(uint256 value); - - bool public argWasValidated; - - constructor() { - emit EventValue(42); - } - - function validateEmitted(uint256 arg) public { - argWasValidated = true; - - require(arg == 42, "arg is wrong"); - } -} - -contract PassingValue { - constructor() payable {} - - function deposit() public payable {} -} - -contract TupleReturn { - bool public arg1Captured; - bool public arg2Captured; - - function getTuple() public pure returns (bool arg1, uint256 arg2) { - return (true, 1234); - } - - function verifyArg1(bool arg) public returns (uint256 output) { - arg1Captured = true; - - require(arg == true, "arg1 is wrong"); - - return 1; - } - - function verifyArg2(uint256 arg) public returns (uint256 output) { - arg2Captured = true; - - require(arg == 1234, "arg2 is wrong"); - - return 1; - } -} - -contract TupleEmitter { - bool public arg1Captured; - bool public arg2Captured; - - event TupleEvent(bool arg1, uint256 arg2); - - function emitTuple() public { - emit TupleEvent(true, 1234); - } - - function verifyArg1(bool arg) public returns (uint256 output) { - arg1Captured = true; - - require(arg == true, "arg1 is wrong"); - - return 1; - } - - function verifyArg2(uint256 arg) public returns (uint256 output) { - arg2Captured = true; - - require(arg == 1234, "arg2 is wrong"); - - return 1; - } -} - -contract CaptureArraysContract { - bool public arraysCaptured; - - constructor() { - arraysCaptured = false; - } - - function recordArrays( - uint256[] memory first, - string[] memory second, - bool[] memory third - ) public returns (uint256 output) { - arraysCaptured = true; - - require(first.length == 3, "Wrong number of args on first arg"); - require(first[0] == 1, "First value is wrong"); - require(first[1] == 2, "Second value is wrong"); - require(first[2] == 3, "Third value is wrong"); - - require(second.length == 3, "Wrong number of args on second arg"); - require( - keccak256(abi.encodePacked(second[0])) == - keccak256(abi.encodePacked("a")), - "First value is wrong" - ); - require( - keccak256(abi.encodePacked(second[1])) == - keccak256(abi.encodePacked("b")), - "Second value is wrong" - ); - require( - keccak256(abi.encodePacked(second[2])) == - keccak256(abi.encodePacked("c")), - "Third value is wrong" - ); - - require(third.length == 3, "Wrong number of args on third arg"); - require(third[0] == true, "First value is wrong"); - require(third[1] == false, "Second value is wrong"); - require(third[2] == true, "Third value is wrong"); - - return 1; - } -} - -contract CaptureComplexObjectContract { - bool public complexArgCaptured; - - constructor() { - complexArgCaptured = false; - } - - struct SubComplex { - string sub; - } - - struct Complex { - bool firstBool; - uint256[] secondArray; - SubComplex thirdSubcomplex; - } - - function testComplexObject( - Complex memory complexArg - ) public returns (uint256 output) { - complexArgCaptured = true; - - require(complexArg.firstBool, "bad first bool"); - - require(complexArg.secondArray.length == 3, "bad second array"); - require(complexArg.secondArray[0] == 1, "First value is wrong"); - require(complexArg.secondArray[1] == 2, "Second value is wrong"); - require(complexArg.secondArray[2] == 3, "Third value is wrong"); - - require( - keccak256(abi.encodePacked(complexArg.thirdSubcomplex.sub)) == - keccak256(abi.encodePacked("sub")), - "The complex sub object property is wrong" - ); - - return 1; - } -} - -contract SendDataEmitter { - event SendDataEvent(uint256 arg); - - bool public wasEmitted; - - receive() external payable { - emit SendDataEvent(42); - } - - function emitEvent() public { - emit SendDataEvent(42); - } - - function validateEmitted(uint256 arg) public { - wasEmitted = true; - - require(arg == 42, "arg is wrong"); - } -} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol new file mode 100644 index 0000000000..11bdb0a6ce --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract EventArgValue { + event EventValue(uint256 value); + + bool public argWasValidated; + + constructor() { + emit EventValue(42); + } + + function validateEmitted(uint256 arg) public { + argWasValidated = true; + + require(arg == 42, "arg is wrong"); + } +} + +contract PassingValue { + constructor() payable {} + + function deposit() public payable {} +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol index 691fa00ed9..c5d27b1d5b 100644 --- a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol @@ -2,7 +2,7 @@ pragma solidity >=0.7.0 <0.9.0; pragma experimental ABIEncoderV2; -import "./Contracts.sol"; +import "./Foo.sol"; contract FooFactory { event Deployed(address indexed fooAddress); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol new file mode 100644 index 0000000000..197a16b176 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Foo { + bool public isFoo = true; + uint256 public x = 1; + + function inc() public { + x++; + } + + function incByPositiveNumber(uint256 n) public { + require(n > 0, "n must be positive"); + x += n; + } + + function incTwoNumbers(uint256 first, uint256 second) public { + x += first; + x += second; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol new file mode 100644 index 0000000000..ac1942abe4 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract Greeter { + string private _greeting; + + constructor(string memory greeting) { + _greeting = greeting; + } + + function getGreeting() public view returns (string memory) { + return _greeting; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol new file mode 100644 index 0000000000..bf78a7361b --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract SendDataEmitter { + event SendDataEvent(uint256 arg); + + bool public wasEmitted; + + receive() external payable { + emit SendDataEvent(42); + } + + function emitEvent() public { + emit SendDataEvent(42); + } + + function validateEmitted(uint256 arg) public { + wasEmitted = true; + + require(arg == 42, "arg is wrong"); + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol new file mode 100644 index 0000000000..11b5f3b1d0 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol @@ -0,0 +1,8 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract StaticCallValue { + function getValue() public pure returns (uint256) { + return 42; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol new file mode 100644 index 0000000000..b9f98c5cb7 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol @@ -0,0 +1,29 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract TupleEmitter { + bool public arg1Captured; + bool public arg2Captured; + + event TupleEvent(bool arg1, uint256 arg2); + + function emitTuple() public { + emit TupleEvent(true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol new file mode 100644 index 0000000000..c7e224e6fc --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.7.0 <0.9.0; + +contract TupleReturn { + bool public arg1Captured; + bool public arg2Captured; + + function getTuple() public pure returns (bool arg1, uint256 arg2) { + return (true, 1234); + } + + function verifyArg1(bool arg) public returns (uint256 output) { + arg1Captured = true; + + require(arg == true, "arg1 is wrong"); + + return 1; + } + + function verifyArg2(uint256 arg) public returns (uint256 output) { + arg2Captured = true; + + require(arg == 1234, "arg2 is wrong"); + + return 1; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol new file mode 100644 index 0000000000..a1b14aabe2 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract UsesContract { + address public contractAddress; + + constructor(address _contract) { + contractAddress = _contract; + } + + function setAddress(address _contract) public { + contractAddress = _contract; + } +} diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 1eb1778a91..6b1a00d47b 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -119,7 +119,7 @@ describe("create2", function () { assert.equal( result.foo.address, - "0xAfF5D98121a6dc830E77cf0DE34ec13d736baBFd" + "0x160Fae6Ab2dbd1204533d7858BE281eb4d45BB15" ); assert.equal(this.hre.network.config.chainId, 31337); From e1f34a5181c6f92dc4302d2e5d11036100183ae1 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 12 Jan 2024 16:13:57 +0000 Subject: [PATCH 1147/1302] test: rework test so every deployed contract has same address I initially just changed the test, but then realised that the Foo contract changes across projects. Instead we now pull in the artifact so the same bytecode is used across the create2 tests. --- .../execution/create2-execution-strategy.ts | 5 + .../hardhat-plugin/test/strategies/create2.ts | 117 +++++++----------- .../externally-loaded-contract.ts | 94 ++++++++++++++ .../test/test-helpers/test-ignition-helper.ts | 3 + 4 files changed, 149 insertions(+), 70 deletions(-) create mode 100644 packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index fb15d8f390..786f29a958 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -147,6 +147,11 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { "CreateX deployment should have an address" ); + assertIgnitionInvariant( + receipt.contractAddress === CREATE_X_ADDRESS, + `CreateX deployment should have the expected address ${CREATE_X_ADDRESS}, instead it is ${receipt.contractAddress}` + ); + this._createXAddress = receipt.contractAddress; return; } diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 6b1a00d47b..3df1bb25a6 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -4,78 +4,61 @@ import { buildModule, } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; import { presignedTx } from "../test-helpers/createX-tx"; +import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; import { mineBlock } from "../test-helpers/mine-block"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; describe("create2", function () { - describe("preexisting createX contract", function () { - describe("known chain ID", function () { - useEphemeralIgnitionProject("create2-known-chain-id"); + const EXPECTED_FOO_CREATE2_ADDRESS = + "0xc95c2ba05118C1b0D2e9DEC8802c358483F87FBA"; - it("should deploy a contract using a createX contract from the known list", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); + const moduleDefinition = buildModule("FooModule", (m) => { + // Use a known bytecode to ensure the same address is generated + // via create2 + const foo = m.contract("Foo", externallyLoadedContractArtifact); - return { foo }; - }); + return { foo }; + }); - await this.hre.network.provider.request({ - method: "hardhat_setBalance", - params: [ - "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", - "0x58D15E176280000", - ], - }); + describe("preexisting createX contract", function () { + describe("on known network list", function () { + useEphemeralIgnitionProject("create2-known-chain-id"); - await this.hre.network.provider.request({ - method: "eth_sendRawTransaction", - params: [presignedTx], - }); + [ + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", + "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", + "0x90F79bf6EB2c4f870365E785982E1f101E93b906", + ].forEach((accountAddress) => { + it(`should deploy a contract from account <${accountAddress}> using the createX factory to the expected address`, async function () { + await deployCreateXFactory(this.hre); - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, - }); + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + defaultSender: accountAddress, + }); - await waitForPendingTxs(this.hre, 1, deployPromise); - await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); - const result = await deployPromise; + const result = await deployPromise; - assert.equal( - result.foo.address, - "0xD0413777977a4060eEBbb10aEA136576376755D9" - ); + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); - assert.equal(this.hre.network.config.chainId, 1); - assert.equal(await result.foo.read.x(), Number(1)); + assert.equal(this.hre.network.config.chainId, 1); + assert.equal(await result.foo.read.x(), Number(1)); + }); }); }); - describe("unknown chain ID", function () { + describe("not on known network list", function () { useEphemeralIgnitionProject("create2-unknown-chain-id"); it("should deploy a contract using a createX contract not on the known list", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - - await this.hre.network.provider.request({ - method: "hardhat_setBalance", - params: [ - "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", - "0x58D15E176280000", - ], - }); - - await this.hre.network.provider.request({ - method: "eth_sendRawTransaction", - params: [presignedTx], - }); + await deployCreateXFactory(this.hre); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, @@ -86,10 +69,7 @@ describe("create2", function () { const result = await deployPromise; - assert.equal( - result.foo.address, - "0xD0413777977a4060eEBbb10aEA136576376755D9" - ); + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); assert.equal(this.hre.network.config.chainId, 88888); assert.equal(await result.foo.read.x(), Number(1)); @@ -102,12 +82,6 @@ describe("create2", function () { useEphemeralIgnitionProject("minimal"); it("should deploy a contract using create2 on hardhat network", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, }); @@ -117,10 +91,7 @@ describe("create2", function () { const result = await deployPromise; - assert.equal( - result.foo.address, - "0x160Fae6Ab2dbd1204533d7858BE281eb4d45BB15" - ); + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); assert.equal(this.hre.network.config.chainId, 31337); assert.equal(await result.foo.read.x(), Number(1)); @@ -131,12 +102,6 @@ describe("create2", function () { useEphemeralIgnitionProject("create2-unknown-chain-id"); it("should throw when no createX contract exists on the network", async function () { - const moduleDefinition = buildModule("FooModule", (m) => { - const foo = m.contract("Foo"); - - return { foo }; - }); - assert.equal(this.hre.network.config.chainId, 88888); await assert.isRejected( this.hre.ignition.deploy(moduleDefinition, { @@ -148,3 +113,15 @@ describe("create2", function () { }); }); }); + +async function deployCreateXFactory(hre: HardhatRuntimeEnvironment) { + await hre.network.provider.request({ + method: "hardhat_setBalance", + params: ["0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", "0x58D15E176280000"], + }); + + await hre.network.provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + }); +} diff --git a/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts new file mode 100644 index 0000000000..cd8f2a6172 --- /dev/null +++ b/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts @@ -0,0 +1,94 @@ +/** + * This is the artifact of a contract that is not part of the compilation output. + * + * Based on the following Solidity: + * + * ``` + contract ExternallyLoadedContract { + bool public isExternallyLoaded = true; + uint256 public x = 1; + + function buildMessage( + string memory message + ) public pure returns (string memory) { + return string.concat("A message: ", message); + } + + function inc() public returns (uint256) { + x++; + return x; + } + } + * ``` + */ +export const externallyLoadedContractArtifact = { + _format: "hh-sol-artifact-1", + contractName: "ExternallyLoadedContract", + sourceName: "contracts/Foo.sol", + abi: [ + { + inputs: [ + { + internalType: "string", + name: "message", + type: "string", + }, + ], + name: "buildMessage", + outputs: [ + { + internalType: "string", + name: "", + type: "string", + }, + ], + stateMutability: "pure", + type: "function", + }, + { + inputs: [], + name: "inc", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [], + name: "isExternallyLoaded", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "x", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + bytecode: + "0x608060405260016000806101000a81548160ff0219169083151502179055506001805534801561002e57600080fd5b506105208061003e6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + deployedBytecode: + "0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630c55699c14610051578063371303c01461006f578063ae78e06b1461008d578063c4a5693d146100ab575b600080fd5b6100596100db565b6040516100669190610156565b60405180910390f35b6100776100e1565b6040516100849190610156565b60405180910390f35b610095610103565b6040516100a2919061018c565b60405180910390f35b6100c560048036038101906100c09190610301565b610114565b6040516100d291906103c9565b60405180910390f35b60015481565b6000600160008154809291906100f69061041a565b9190505550600154905090565b60008054906101000a900460ff1681565b60608160405160200161012791906104c4565b6040516020818303038152906040529050919050565b6000819050919050565b6101508161013d565b82525050565b600060208201905061016b6000830184610147565b92915050565b60008115159050919050565b61018681610171565b82525050565b60006020820190506101a1600083018461017d565b92915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61020e826101c5565b810181811067ffffffffffffffff8211171561022d5761022c6101d6565b5b80604052505050565b60006102406101a7565b905061024c8282610205565b919050565b600067ffffffffffffffff82111561026c5761026b6101d6565b5b610275826101c5565b9050602081019050919050565b82818337600083830152505050565b60006102a461029f84610251565b610236565b9050828152602081018484840111156102c0576102bf6101c0565b5b6102cb848285610282565b509392505050565b600082601f8301126102e8576102e76101bb565b5b81356102f8848260208601610291565b91505092915050565b600060208284031215610317576103166101b1565b5b600082013567ffffffffffffffff811115610335576103346101b6565b5b610341848285016102d3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610384578082015181840152602081019050610369565b60008484015250505050565b600061039b8261034a565b6103a58185610355565b93506103b5818560208601610366565b6103be816101c5565b840191505092915050565b600060208201905081810360008301526103e38184610390565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006104258261013d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610457576104566103eb565b5b600182019050919050565b7f41206d6573736167653a20000000000000000000000000000000000000000000815250565b600081905092915050565b600061049e8261034a565b6104a88185610488565b93506104b8818560208601610366565b80840191505092915050565b60006104cf82610462565b600b820191506104df8284610493565b91508190509291505056fea2646970667358221220d6f949c606fe2cf1b3274ef889cd952363a9558f9f5027ee18f03fe4c4cbaee864736f6c63430008130033", + linkReferences: {}, + deployedLinkReferences: {}, +} as const; diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 815d03f641..de1f30d2e5 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -67,10 +67,12 @@ export class TestIgnitionHelper { parameters = {}, config: perDeployConfig = {}, strategy = DeploymentStrategyType.BASIC, + defaultSender = undefined, }: { parameters?: DeploymentParameters; config?: Partial; strategy?: DeploymentStrategyType; + defaultSender?: string; } = { parameters: {}, config: {}, @@ -97,6 +99,7 @@ export class TestIgnitionHelper { ignitionModule, deploymentParameters: parameters, accounts, + defaultSender, strategy, }); From 747c48193fbd668f94a13d0a25d1fc464c03e2a3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 12 Jan 2024 17:29:51 +0000 Subject: [PATCH 1148/1302] test: add tests around endowments via create2 --- .../create2-known-chain-id/contracts/Foo.sol | 2 + .../contracts/Unpayable.sol | 10 ++++ .../hardhat-plugin/test/strategies/create2.ts | 51 ++++++++++++++++++- 3 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol index 992dab4f1d..821ff9cd70 100644 --- a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol +++ b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol @@ -6,6 +6,8 @@ contract Foo { bool public isFoo = true; uint256 public x = 1; + constructor() payable {} + function inc() public { x++; } diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol new file mode 100644 index 0000000000..d038ce117b --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol @@ -0,0 +1,10 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Unpayable { + bool public isUnpayable = true; + + // intentionally not payable + constructor() {} +} diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 3df1bb25a6..d1612835ad 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -28,14 +28,16 @@ describe("create2", function () { describe("on known network list", function () { useEphemeralIgnitionProject("create2-known-chain-id"); + beforeEach(async function () { + await deployCreateXFactory(this.hre); + }); + [ "0x70997970C51812dc3A010C7d01b50e0d17dc79C8", "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC", "0x90F79bf6EB2c4f870365E785982E1f101E93b906", ].forEach((accountAddress) => { it(`should deploy a contract from account <${accountAddress}> using the createX factory to the expected address`, async function () { - await deployCreateXFactory(this.hre); - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, defaultSender: accountAddress, @@ -52,6 +54,51 @@ describe("create2", function () { assert.equal(await result.foo.read.x(), Number(1)); }); }); + + it(`should support endowing eth to the deployed contract`, async function () { + const deployPromise = this.hre.ignition.deploy( + buildModule("ValueModule", (m) => { + const foo = m.contract("Foo", [], { + value: 1_000_000_000n, + }); + + return { foo }; + }), + { + strategy: DeploymentStrategyType.CREATE2, + } + ); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + const balance = await this.hre.network.provider.request({ + method: "eth_getBalance", + params: [result.foo.address, "latest"], + }); + + assert.equal(balance, 1_000_000_000n); + }); + + it(`should throw if you attempt to endow when the constructor isn't payable`, async function () { + await assert.isRejected( + this.hre.ignition.deploy( + buildModule("ValueModule", (m) => { + const foo = m.contract("Unpayable", [], { + value: 1_000_000_000n, + }); + + return { foo }; + }), + { + strategy: DeploymentStrategyType.CREATE2, + } + ), + /Simulating the transaction failed with error: Reverted with custom error FailedContractCreation/ + ); + }); }); describe("not on known network list", function () { From 4eed676f76f99389356cb955383e4042ee125b78 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 15 Jan 2024 14:21:58 +0000 Subject: [PATCH 1149/1302] feat: update the strategy ui display Don't show basic, but do show the strategy if it is something else. --- .../calculate-deploying-module-panel.ts | 14 ++++++++--- ...alculate-deploying-module-panel-display.ts | 23 +++++++++++++++---- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts index d6854ed8b7..638b1b8b99 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts @@ -18,9 +18,9 @@ export function calculateDeployingModulePanel(state: UiState): string { } deployingMessage += `${chalk.bold( - `Deploying [ ${state.moduleName ?? "unknown"} ] with strategy < ${ - state.strategy ?? "unknown" - } >` + `Deploying [ ${state.moduleName ?? "unknown"} ]${_calculateStrategySuffix( + state + )}` )} `; @@ -38,3 +38,11 @@ export function calculateDeployingModulePanel(state: UiState): string { return deployingMessage; } + +function _calculateStrategySuffix(state: UiState) { + if (state.strategy === "basic") { + return ""; + } + + return ` with strategy ${state.strategy ?? "unknown"}`; +} diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index 01eb0b7fc5..c63b67f7db 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -28,7 +28,7 @@ describe("ui - calculate starting message display", () => { const expectedText = testFormat(` Hardhat Ignition 🚀 - ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} + ${chalk.bold(`Deploying [ ExampleModule ]`)} `); const actualText = calculateDeployingModulePanel(exampleState); @@ -36,11 +36,26 @@ describe("ui - calculate starting message display", () => { assert.equal(actualText, expectedText); }); + it("should include the strategy if it is something other than basic", () => { + const expectedText = testFormat(` + Hardhat Ignition 🚀 + + ${chalk.bold(`Deploying [ ExampleModule ] with strategy create2`)} + `); + + const actualText = calculateDeployingModulePanel({ + ...exampleState, + strategy: DeploymentStrategyType.CREATE2, + }); + + assert.equal(actualText, expectedText); + }); + it("should display reconciliation warnings", () => { const expectedText = testFormat(` Hardhat Ignition 🚀 - ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} + ${chalk.bold(`Deploying [ ExampleModule ]`)} ${chalk.yellow( "Warning - previously executed futures are not in the module:" @@ -68,7 +83,7 @@ describe("ui - calculate starting message display", () => { ${chalk.bold(`Resuming existing deployment from /users/example`)} - ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} + ${chalk.bold(`Deploying [ ExampleModule ]`)} `); const actualText = calculateDeployingModulePanel({ @@ -87,7 +102,7 @@ describe("ui - calculate starting message display", () => { `Resuming existing deployment from .${path.sep}ignition${path.sep}deployments${path.sep}foo` )} - ${chalk.bold(`Deploying [ ExampleModule ] with strategy < basic >`)} + ${chalk.bold(`Deploying [ ExampleModule ]`)} `); const actualText = calculateDeployingModulePanel({ From bbcb9b7bef6fdce0fd6142fa66f8ef3dfe972d82 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 11:10:23 +0000 Subject: [PATCH 1150/1302] improvement: add check that bytecode matches createX expected CreateX advises checking the bytecode hash of the factories deployed bytecode before use. This has been added as an assertion. --- .../src/internal/execution/create2-execution-strategy.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index 786f29a958..1b3ad6e60a 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -35,6 +35,8 @@ import { NetworkInteractionType } from "./types/network-interaction"; // v0.1.0 const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; +const CREATE_X_DEPLOYED_BYTECODE_HASH = + "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f"; const _existingDeployedAddresses: { [key: number]: string } = { 1: CREATE_X_ADDRESS, @@ -167,10 +169,15 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { }); assertIgnitionInvariant( - result !== "0x", + typeof result === "string" && result !== "0x", "CreateX not deployed on current network" ); + assertIgnitionInvariant( + ethers.keccak256(result) === CREATE_X_DEPLOYED_BYTECODE_HASH, + "Deployed CreateX bytecode does not match expected bytecode" + ); + this._createXAddress = CREATE_X_ADDRESS; return; From 9cfc6de14f9d2d3b9abd6673ae25d7d14e8e9d38 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 12:15:16 +0000 Subject: [PATCH 1151/1302] test: add further strategy tests --- .../hardhat-plugin/test/strategies/index.ts | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/packages/hardhat-plugin/test/strategies/index.ts b/packages/hardhat-plugin/test/strategies/index.ts index 65fdedc4f8..072e0db5c3 100644 --- a/packages/hardhat-plugin/test/strategies/index.ts +++ b/packages/hardhat-plugin/test/strategies/index.ts @@ -85,6 +85,85 @@ describe("strategies", function () { assert.equal(await result.foo.read.x(), Number(2)); }); + it("should static call a contract function", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + const firstInc = m.call(foo, "inc", [], { id: "inc1" }); + const secondInc = m.call(foo, "inc", [], { + id: "inc2", + after: [firstInc], + }); + + const counter = m.staticCall(foo, "x", [], 0, { + id: "inc3", + after: [secondInc], + }); + + m.call(foo, "incByPositiveNumber", [counter]); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: strategyNameToType(strategy), + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.isDefined(result.foo.address); + + assert.equal(await result.foo.read.x(), Number(6)); + }); + + it("should support using existing contracts", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const deployPromise = this.hre.ignition.deploy(moduleDefinition); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + const fooAddress = result.foo.address; + + const contractAtDefinition = buildModule("ContractAtModule", (m) => { + const contractAtFoo = m.contractAt("Foo", fooAddress); + + m.call(contractAtFoo, "inc"); + + return { contractAtFoo }; + }); + + const contractAtPromise = this.hre.ignition.deploy( + contractAtDefinition, + { + strategy: strategyNameToType(strategy), + } + ); + + await waitForPendingTxs(this.hre, 1, contractAtPromise); + await mineBlock(this.hre); + + const contractAtResult = await contractAtPromise; + + assert.equal(await contractAtResult.contractAtFoo.read.x(), Number(2)); + }); + it("should read an event emitted from a constructor", async function () { const moduleDefinition = buildModule("FooModule", (m) => { const foo = m.contract("EventArgValue"); From bb335c90204038a9ab01ae9fbcd02aa4e68c8c0b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 12:23:41 +0000 Subject: [PATCH 1152/1302] test: rename strategy tests --- .../strategies/{index.ts => generic-strategy-constraints.ts} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename packages/hardhat-plugin/test/strategies/{index.ts => generic-strategy-constraints.ts} (99%) diff --git a/packages/hardhat-plugin/test/strategies/index.ts b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts similarity index 99% rename from packages/hardhat-plugin/test/strategies/index.ts rename to packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts index 072e0db5c3..34e24825bf 100644 --- a/packages/hardhat-plugin/test/strategies/index.ts +++ b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts @@ -10,7 +10,7 @@ import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; const strategies = ["basic", "create2"]; -describe("strategies", function () { +describe("strategies - generic constraints", function () { strategies.forEach((strategy) => { describe(strategy, function () { useEphemeralIgnitionProject("minimal"); From 3c5b79175f8090b5861e0ec4d702e00c72a42c1e Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 12:34:55 +0000 Subject: [PATCH 1153/1302] refactor: pull out init structure as subfunctions --- .../execution/create2-execution-strategy.ts | 146 +++++------------- 1 file changed, 42 insertions(+), 104 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index 1b3ad6e60a..ff3ffbff86 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -38,65 +38,6 @@ const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; const CREATE_X_DEPLOYED_BYTECODE_HASH = "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f"; -const _existingDeployedAddresses: { [key: number]: string } = { - 1: CREATE_X_ADDRESS, - 10: CREATE_X_ADDRESS, - 25: CREATE_X_ADDRESS, - 42: CREATE_X_ADDRESS, - 56: CREATE_X_ADDRESS, - 97: CREATE_X_ADDRESS, - 100: CREATE_X_ADDRESS, - 122: CREATE_X_ADDRESS, - 123: CREATE_X_ADDRESS, - 137: CREATE_X_ADDRESS, - 169: CREATE_X_ADDRESS, - 250: CREATE_X_ADDRESS, - 288: CREATE_X_ADDRESS, - 314: CREATE_X_ADDRESS, - 338: CREATE_X_ADDRESS, - 999: CREATE_X_ADDRESS, - 1101: CREATE_X_ADDRESS, - 1284: CREATE_X_ADDRESS, - 1285: CREATE_X_ADDRESS, - 1287: CREATE_X_ADDRESS, - 1442: CREATE_X_ADDRESS, - 2888: CREATE_X_ADDRESS, - 4002: CREATE_X_ADDRESS, - 4201: CREATE_X_ADDRESS, - 5000: CREATE_X_ADDRESS, - 5001: CREATE_X_ADDRESS, - 7700: CREATE_X_ADDRESS, - 7701: CREATE_X_ADDRESS, - 8453: CREATE_X_ADDRESS, - 9000: CREATE_X_ADDRESS, - 9001: CREATE_X_ADDRESS, - 10200: CREATE_X_ADDRESS, - 17000: CREATE_X_ADDRESS, - 42161: CREATE_X_ADDRESS, - 42170: CREATE_X_ADDRESS, - 42220: CREATE_X_ADDRESS, - 43113: CREATE_X_ADDRESS, - 43114: CREATE_X_ADDRESS, - 44787: CREATE_X_ADDRESS, - 59140: CREATE_X_ADDRESS, - 59144: CREATE_X_ADDRESS, - 80001: CREATE_X_ADDRESS, - 84532: CREATE_X_ADDRESS, - 314159: CREATE_X_ADDRESS, - 421614: CREATE_X_ADDRESS, - 534351: CREATE_X_ADDRESS, - 534352: CREATE_X_ADDRESS, - 3441005: CREATE_X_ADDRESS, - 7777777: CREATE_X_ADDRESS, - 11155111: CREATE_X_ADDRESS, - 11155420: CREATE_X_ADDRESS, - 68840142: CREATE_X_ADDRESS, - 1313161554: CREATE_X_ADDRESS, - 1313161555: CREATE_X_ADDRESS, - 1666600000: CREATE_X_ADDRESS, - 1666700000: CREATE_X_ADDRESS, -}; - /** * The most basic execution strategy, which sends a single transaction * for each deployment, call, and send data, and a single static call @@ -115,51 +56,8 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { const client = new EIP1193JsonRpcClient(this._provider); const chainId = await client.getChainId(); - const existingDeployedAddress = _existingDeployedAddresses[chainId]; - - // if there is an existing deployment, nothing more needs done - if (existingDeployedAddress !== undefined) { - this._createXAddress = existingDeployedAddress; - - return; - } else if (chainId === 31337) { - // No createX factory found because we're on a local hardhat node - // deploy one using presigned tx from CreateX - await this._provider.request({ - method: "hardhat_setBalance", - params: [ - "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", - "0x58D15E176280000", - ], - }); - - const txHash = (await this._provider.request({ - method: "eth_sendRawTransaction", - params: [presignedTx], - })) as string; - - assertIgnitionInvariant(txHash !== "0x", "CreateX deployment failed"); - - while (true) { - const receipt = await client.getTransactionReceipt(txHash); - - if (receipt !== undefined) { - assertIgnitionInvariant( - receipt?.contractAddress !== undefined, - "CreateX deployment should have an address" - ); - - assertIgnitionInvariant( - receipt.contractAddress === CREATE_X_ADDRESS, - `CreateX deployment should have the expected address ${CREATE_X_ADDRESS}, instead it is ${receipt.contractAddress}` - ); - - this._createXAddress = receipt.contractAddress; - return; - } - - await new Promise((res) => setTimeout(res, 200)); - } + if (chainId === 31337) { + await this._deployCreateXFactory(client); } else { // No createX factory found, but we're not on a local chain // check if someone else has deployed CreateX on this chain @@ -351,4 +249,44 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { ), }; } + + private async _deployCreateXFactory(client: EIP1193JsonRpcClient) { + // No createX factory found because we're on a local hardhat node + // deploy one using presigned tx from CreateX + await this._provider.request({ + method: "hardhat_setBalance", + params: [ + "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", + "0x58D15E176280000", + ], + }); + + const txHash = (await this._provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + })) as string; + + assertIgnitionInvariant(txHash !== "0x", "CreateX deployment failed"); + + while (true) { + const receipt = await client.getTransactionReceipt(txHash); + + if (receipt !== undefined) { + assertIgnitionInvariant( + receipt?.contractAddress !== undefined, + "CreateX deployment should have an address" + ); + + assertIgnitionInvariant( + receipt.contractAddress === CREATE_X_ADDRESS, + `CreateX deployment should have the expected address ${CREATE_X_ADDRESS}, instead it is ${receipt.contractAddress}` + ); + + this._createXAddress = receipt.contractAddress; + return; + } + + await new Promise((res) => setTimeout(res, 200)); + } + } } From ca42f64e1efd5467ed83f20a04c8a067500b32f3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 12:45:10 +0000 Subject: [PATCH 1154/1302] refactor: remove factory address as propert For CreateX the address should always be the same, allowing it to vary is a mistake. --- .../src/internal/execution/create2-execution-strategy.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index ff3ffbff86..1605b7b125 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -45,7 +45,6 @@ const CREATE_X_DEPLOYED_BYTECODE_HASH = */ export class Create2ExecutionStrategy implements ExecutionStrategy { public readonly name: string = "create2"; - private _createXAddress: string = CREATE_X_ADDRESS; constructor( private readonly _provider: EIP1193Provider, @@ -76,8 +75,6 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { "Deployed CreateX bytecode does not match expected bytecode" ); - this._createXAddress = CREATE_X_ADDRESS; - return; } } @@ -99,7 +96,7 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { { id: 1, type: NetworkInteractionType.ONCHAIN_INTERACTION, - to: this._createXAddress, + to: CREATE_X_ADDRESS, data: encodeArtifactFunctionCall( createxArtifact, "deployCreate2(bytes32,bytes)", @@ -127,7 +124,7 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { const deployedAddress = getEventArgumentFromReceipt( transactionOrResult.transaction.receipt, createxArtifact, - this._createXAddress, + CREATE_X_ADDRESS, "ContractCreation", 0, "newContract" @@ -282,7 +279,6 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { `CreateX deployment should have the expected address ${CREATE_X_ADDRESS}, instead it is ${receipt.contractAddress}` ); - this._createXAddress = receipt.contractAddress; return; } From 74a820d2e0aa4b4fb8059a6f13d0296312c3f142 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 13:19:22 +0000 Subject: [PATCH 1155/1302] refactor: move set balance into client --- .../execution/create2-execution-strategy.ts | 17 +++++++----- .../src/internal/execution/jsonrpc-client.ts | 27 +++++++++++++++++++ .../helpers/network-interaction-execution.ts | 7 +++++ .../test/execution/future-processor/utils.ts | 4 +++ 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index 1605b7b125..f6b7c711dd 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -37,6 +37,8 @@ import { NetworkInteractionType } from "./types/network-interaction"; const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; const CREATE_X_DEPLOYED_BYTECODE_HASH = "0xbd8a7ea8cfca7b4e5f5041d7d4b17bc317c5ce42cfbc42066a00cf26b43eb53f"; +const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = + "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5"; /** * The most basic execution strategy, which sends a single transaction @@ -247,16 +249,17 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { }; } + /** + * Within the context of a local development Hardhat chain, deploy + * the CreateX factory contract using a presigned transaction. + */ private async _deployCreateXFactory(client: EIP1193JsonRpcClient) { // No createX factory found because we're on a local hardhat node // deploy one using presigned tx from CreateX - await this._provider.request({ - method: "hardhat_setBalance", - params: [ - "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5", - "0x58D15E176280000", - ], - }); + await client.setBalance( + CREATE_X_PRESIGNED_DEPLOYER_ADDRESS, + 400000000000000000n + ); const txHash = (await this._provider.request({ method: "eth_sendRawTransaction", diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 280fe36d75..9f94eb973a 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -86,6 +86,16 @@ export interface JsonRpcClient { blockTag: "latest" | "pending" ) => Promise; + /** + * Update the balance of the account. Only relevant for local development + * chains. + * + * @param address The account's address. + * @param balance The balance to set the account to. + * @returns Whether the update was applied. + */ + setBalance: (address: string, balance: bigint) => Promise; + /** * Performs an `eth_call` JSON-RPC request, and returns the result or an error * object with the return data and a boolean indicating if the request failed @@ -250,6 +260,23 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { return jsonRpcQuantityToBigInt(balance); } + public async setBalance(address: string, balance: bigint): Promise { + const balanceHex = bigIntToJsonRpcQuantity(balance); + + const returnedBalance = await this._provider.request({ + method: "hardhat_setBalance", + params: [address, balanceHex], + }); + + assertResponseType( + "hardhat_setBalance", + returnedBalance, + typeof returnedBalance === "boolean" + ); + + return returnedBalance; + } + public async call( callParams: CallParams, blockTag: "latest" | "pending" diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 6c80ac2e9e..08c566883c 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -53,6 +53,13 @@ class StubJsonRpcClient implements JsonRpcClient { throw new Error("Mock not implemented."); } + public async setBalance( + _address: string, + _balance: bigint + ): Promise { + throw new Error("Mock not implemented."); + } + public async call( _callParams: CallParams, _blockTag: "latest" | "pending" diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index c2fc9ecd4e..60ba4a039c 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -125,6 +125,10 @@ class MockJsonRpcClient implements JsonRpcClient { throw new Error("Method not implemented."); } + public setBalance(_address: string, _balance: bigint): Promise { + throw new Error("Method not implemented."); + } + public async call( _callParams: CallParams, _blockTag: "latest" | "pending" From 986ee4afca24f5124cf0b5e8b57100a765d2d21b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 15:50:50 +0000 Subject: [PATCH 1156/1302] refactor: pull out raw transaction Add the raw transaction call to the client api. --- .../execution/create2-execution-strategy.ts | 5 +--- .../src/internal/execution/jsonrpc-client.ts | 24 +++++++++++++++++++ .../helpers/network-interaction-execution.ts | 4 ++++ .../test/execution/future-processor/utils.ts | 4 ++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index f6b7c711dd..378ab36d73 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -261,10 +261,7 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { 400000000000000000n ); - const txHash = (await this._provider.request({ - method: "eth_sendRawTransaction", - params: [presignedTx], - })) as string; + const txHash = await client.sendRawTransaction(presignedTx); assertIgnitionInvariant(txHash !== "0x", "CreateX deployment failed"); diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 9f94eb973a..6daf1ba21c 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -129,6 +129,15 @@ export interface JsonRpcClient { */ sendTransaction: (transactionParams: TransactionParams) => Promise; + /** + * Sends a presigned raw transaction to the Ethereum network and returns + * its hash, if the transaction is valid and accepted in the node's mempool. + * + * @param presignedTx the presigned transaction to send + * @returns the hash of the transaction. + */ + sendRawTransaction: (presignedTx: string) => Promise; + /** * Returns the transaction count of an account. * @@ -418,6 +427,21 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { } } + public async sendRawTransaction(presignedTx: string): Promise { + const response = await this._provider.request({ + method: "eth_sendRawTransaction", + params: [presignedTx], + }); + + assertResponseType( + "eth_sendRawTransaction", + response, + typeof response === "string" + ); + + return response; + } + public async getTransactionCount( address: string, blockTag: number | "latest" | "pending" diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 08c566883c..7c574dfabf 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -79,6 +79,10 @@ class StubJsonRpcClient implements JsonRpcClient { throw new Error("Mock not implemented."); } + public async sendRawTransaction(_presignedTx: string): Promise { + throw new Error("Method not implemented."); + } + public async getTransactionCount( _address: string, _blockTag: number | "latest" | "pending" diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index 60ba4a039c..aa64d03d5d 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -152,6 +152,10 @@ class MockJsonRpcClient implements JsonRpcClient { return this._sendTransaction(transactionParams); } + public async sendRawTransaction(_presignedTx: string): Promise { + throw new Error("Method not implemented."); + } + public getTransactionCount( _address: string, _blockTag: number | "latest" | "pending" From f25187b5e2af5fa714756ac2fb8b0f8bc1d9f555 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 16:10:57 +0000 Subject: [PATCH 1157/1302] refactor: move getCode to client --- .../execution/create2-execution-strategy.ts | 19 ++++++++-------- .../src/internal/execution/jsonrpc-client.ts | 22 +++++++++++++++++++ .../helpers/network-interaction-execution.ts | 4 ++++ .../test/execution/future-processor/utils.ts | 4 ++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index 378ab36d73..e98534b3f9 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -47,28 +47,27 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = */ export class Create2ExecutionStrategy implements ExecutionStrategy { public readonly name: string = "create2"; + private readonly client: EIP1193JsonRpcClient; constructor( - private readonly _provider: EIP1193Provider, + provider: EIP1193Provider, private readonly _loadArtifact: LoadArtifactFunction - ) {} + ) { + this.client = new EIP1193JsonRpcClient(provider); + } public async init(): Promise { - const client = new EIP1193JsonRpcClient(this._provider); - const chainId = await client.getChainId(); + const chainId = await this.client.getChainId(); if (chainId === 31337) { - await this._deployCreateXFactory(client); + await this._deployCreateXFactory(this.client); } else { // No createX factory found, but we're not on a local chain // check if someone else has deployed CreateX on this chain - const result = await this._provider.request({ - method: "eth_getCode", - params: [CREATE_X_ADDRESS], - }); + const result = await this.client.getCode(CREATE_X_ADDRESS); assertIgnitionInvariant( - typeof result === "string" && result !== "0x", + result !== "0x", "CreateX not deployed on current network" ); diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 6daf1ba21c..0961e5a919 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -168,6 +168,17 @@ export interface JsonRpcClient { getTransactionReceipt: ( txHash: string ) => Promise; + + /** + * Returns the deployed bytecode of the contract at the given address. + * + * If the address is not a contract or it does not have bytecode the returned + * result will be "0x". + * + * @param address the address of the contract + * @returns the deployed bytecode of the contract + */ + getCode: (address: string) => Promise; } /** @@ -604,6 +615,17 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { logs: formatReceiptLogs(method, response), }; } + + public async getCode(address: string): Promise { + const result = await this._provider.request({ + method: "eth_getCode", + params: [address], + }); + + assertResponseType("eth_getCode", result, typeof result === "string"); + + return result; + } } /** diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 7c574dfabf..909869d45b 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -101,6 +101,10 @@ class StubJsonRpcClient implements JsonRpcClient { ): Promise { throw new Error("Mock not implemented."); } + + public async getCode(_address: string): Promise { + throw new Error("Method not implemented."); + } } describe("Network interactions", () => { diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index aa64d03d5d..e99bda51d3 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -184,4 +184,8 @@ class MockJsonRpcClient implements JsonRpcClient { return this._transactions[txHash]; } + + public async getCode(_address: string): Promise { + throw new Error("Method not implemented."); + } } From 5ffa21086f5913fcd9782699c76d0b0aa7c0aefa Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 16:36:27 +0000 Subject: [PATCH 1158/1302] refactor: rename the test fixture projects --- .../contracts/Foo.sol | 0 .../contracts/Unpayable.sol | 0 .../hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../contracts/Foo.sol | 0 .../hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../hardhat-plugin/test/strategies/create2.ts | 46 ++++++++++++------- 8 files changed, 30 insertions(+), 16 deletions(-) rename packages/hardhat-plugin/test/fixture-projects/{create2-known-chain-id => create2-exists-chain}/contracts/Foo.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-known-chain-id => create2-exists-chain}/contracts/Unpayable.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-known-chain-id => create2-exists-chain}/hardhat.config.js (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-known-chain-id => create2-exists-chain}/ignition/modules/MyModule.js (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-unknown-chain-id => create2-not-exists-chain}/contracts/Foo.sol (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-unknown-chain-id => create2-not-exists-chain}/hardhat.config.js (100%) rename packages/hardhat-plugin/test/fixture-projects/{create2-unknown-chain-id => create2-not-exists-chain}/ignition/modules/MyModule.js (100%) diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Foo.sol rename to packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol b/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/contracts/Unpayable.sol rename to packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/hardhat.config.js rename to packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-known-chain-id/ignition/modules/MyModule.js rename to packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/contracts/Foo.sol rename to packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/hardhat.config.js rename to packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-unknown-chain-id/ignition/modules/MyModule.js rename to packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index d1612835ad..12d3523ffd 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -12,7 +12,7 @@ import { mineBlock } from "../test-helpers/mine-block"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; -describe("create2", function () { +describe.only("create2", function () { const EXPECTED_FOO_CREATE2_ADDRESS = "0xc95c2ba05118C1b0D2e9DEC8802c358483F87FBA"; @@ -25,8 +25,8 @@ describe("create2", function () { }); describe("preexisting createX contract", function () { - describe("on known network list", function () { - useEphemeralIgnitionProject("create2-known-chain-id"); + describe("non hardhat network", function () { + useEphemeralIgnitionProject("create2-exists-chain"); beforeEach(async function () { await deployCreateXFactory(this.hre); @@ -101,25 +101,39 @@ describe("create2", function () { }); }); - describe("not on known network list", function () { - useEphemeralIgnitionProject("create2-unknown-chain-id"); - - it("should deploy a contract using a createX contract not on the known list", async function () { - await deployCreateXFactory(this.hre); + describe("hardhat network", function () { + useEphemeralIgnitionProject("minimal"); - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + it.skip("should deploy use an existing create2 factory to deploy the given contract", async function () { + // Run create2 once deploying the factory + const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, }); - await waitForPendingTxs(this.hre, 1, deployPromise); + await waitForPendingTxs(this.hre, 1, firstDeployPromise); await mineBlock(this.hre); - const result = await deployPromise; + await firstDeployPromise; - assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); + // Run a second deploy, this time leveraging the existing create2 factory + const secondDeployPromise = this.hre.ignition.deploy( + buildModule("Second", (m) => { + const bar = m.contract("Bar"); - assert.equal(this.hre.network.config.chainId, 88888); - assert.equal(await result.foo.read.x(), Number(1)); + return { bar }; + }), + { + strategy: DeploymentStrategyType.CREATE2, + } + ); + + await waitForPendingTxs(this.hre, 1, secondDeployPromise); + await mineBlock(this.hre); + + const secondDeployResult = await secondDeployPromise; + + assert.equal(secondDeployResult.bar.address, "0x0123"); + assert(await secondDeployResult.bar.read.isBar()); }); }); }); @@ -128,7 +142,7 @@ describe("create2", function () { describe("hardhat network", function () { useEphemeralIgnitionProject("minimal"); - it("should deploy a contract using create2 on hardhat network", async function () { + it("should deploy a create2 factory then use it to deploy the given contract", async function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, }); @@ -146,7 +160,7 @@ describe("create2", function () { }); describe("non hardhat network", function () { - useEphemeralIgnitionProject("create2-unknown-chain-id"); + useEphemeralIgnitionProject("create2-not-exists-chain"); it("should throw when no createX contract exists on the network", async function () { assert.equal(this.hre.network.config.chainId, 88888); From 221890f10a25d951d5dd563c0a9cd6a53fa78610 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 16:47:42 +0000 Subject: [PATCH 1159/1302] fix: on HH network check for createX as well In the case where createX factory has previously been deployed against 31337, then init should not try and redeploy the createX factory. --- .../execution/create2-execution-strategy.ts | 29 ++++++++++--------- .../hardhat-plugin/test/strategies/create2.ts | 13 ++++++--- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index e98534b3f9..25f1369012 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -1,5 +1,6 @@ import { ethers } from "ethers"; +import { NomicIgnitionPluginError } from "../../errors"; import { EIP1193Provider } from "../../types/provider"; import { assertIgnitionInvariant } from "../utils/assertions"; @@ -57,20 +58,11 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { } public async init(): Promise { - const chainId = await this.client.getChainId(); - - if (chainId === 31337) { - await this._deployCreateXFactory(this.client); - } else { - // No createX factory found, but we're not on a local chain - // check if someone else has deployed CreateX on this chain - const result = await this.client.getCode(CREATE_X_ADDRESS); - - assertIgnitionInvariant( - result !== "0x", - "CreateX not deployed on current network" - ); + // No createX factory found, but we're not on a local chain + // check if someone else has deployed CreateX on this chain + const result = await this.client.getCode(CREATE_X_ADDRESS); + if (result !== "0x") { assertIgnitionInvariant( ethers.keccak256(result) === CREATE_X_DEPLOYED_BYTECODE_HASH, "Deployed CreateX bytecode does not match expected bytecode" @@ -78,6 +70,17 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { return; } + + const chainId = await this.client.getChainId(); + + if (chainId === 31337) { + await this._deployCreateXFactory(this.client); + } else { + throw new NomicIgnitionPluginError( + "create2", + `CreateX not deployed on current network ${chainId}` + ); + } } public async *executeDeployment( diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 12d3523ffd..c10487e168 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -12,9 +12,11 @@ import { mineBlock } from "../test-helpers/mine-block"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; -describe.only("create2", function () { +describe("create2", function () { const EXPECTED_FOO_CREATE2_ADDRESS = "0xc95c2ba05118C1b0D2e9DEC8802c358483F87FBA"; + const EXPECTED_BAR_CREATE2_ADDRESS = + "0x3175cBAd3Ab8afCDf7f90c2Acf7fD3E11304310B"; const moduleDefinition = buildModule("FooModule", (m) => { // Use a known bytecode to ensure the same address is generated @@ -104,7 +106,7 @@ describe.only("create2", function () { describe("hardhat network", function () { useEphemeralIgnitionProject("minimal"); - it.skip("should deploy use an existing create2 factory to deploy the given contract", async function () { + it("should deploy use an existing create2 factory to deploy the given contract", async function () { // Run create2 once deploying the factory const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, @@ -132,7 +134,10 @@ describe.only("create2", function () { const secondDeployResult = await secondDeployPromise; - assert.equal(secondDeployResult.bar.address, "0x0123"); + assert.equal( + secondDeployResult.bar.address, + EXPECTED_BAR_CREATE2_ADDRESS + ); assert(await secondDeployResult.bar.read.isBar()); }); }); @@ -168,7 +173,7 @@ describe.only("create2", function () { this.hre.ignition.deploy(moduleDefinition, { strategy: DeploymentStrategyType.CREATE2, }), - /IGN1: Internal Hardhat Ignition invariant was violated: CreateX not deployed on current network/ + /CreateX not deployed on current network 88888/ ); }); }); From 4b4e0041dc356fdd51e2aa10dfcd939dc020fc08 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 17 Jan 2024 17:00:46 +0000 Subject: [PATCH 1160/1302] test: rework the structure of the tests Remove a layer from the describes. --- .../hardhat-plugin/test/strategies/create2.ts | 112 +++++++++--------- 1 file changed, 53 insertions(+), 59 deletions(-) diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index c10487e168..904b515edf 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -26,8 +26,8 @@ describe("create2", function () { return { foo }; }); - describe("preexisting createX contract", function () { - describe("non hardhat network", function () { + describe("non-hardhat network", function () { + describe("preexisting createX contract", function () { useEphemeralIgnitionProject("create2-exists-chain"); beforeEach(async function () { @@ -103,79 +103,73 @@ describe("create2", function () { }); }); - describe("hardhat network", function () { - useEphemeralIgnitionProject("minimal"); - - it("should deploy use an existing create2 factory to deploy the given contract", async function () { - // Run create2 once deploying the factory - const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, - }); + describe("no preexisting createX contract", function () { + useEphemeralIgnitionProject("create2-not-exists-chain"); - await waitForPendingTxs(this.hre, 1, firstDeployPromise); - await mineBlock(this.hre); + it("should throw when no createX contract exists on the network", async function () { + assert.equal(this.hre.network.config.chainId, 88888); + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }), + /CreateX not deployed on current network 88888/ + ); + }); + }); + }); - await firstDeployPromise; + describe("hardhat network", function () { + useEphemeralIgnitionProject("minimal"); - // Run a second deploy, this time leveraging the existing create2 factory - const secondDeployPromise = this.hre.ignition.deploy( - buildModule("Second", (m) => { - const bar = m.contract("Bar"); + it("should deploy a createX factory then use it to deploy the given contract", async function () { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }); - return { bar }; - }), - { - strategy: DeploymentStrategyType.CREATE2, - } - ); + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); - await waitForPendingTxs(this.hre, 1, secondDeployPromise); - await mineBlock(this.hre); + const result = await deployPromise; - const secondDeployResult = await secondDeployPromise; + assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); - assert.equal( - secondDeployResult.bar.address, - EXPECTED_BAR_CREATE2_ADDRESS - ); - assert(await secondDeployResult.bar.read.isBar()); - }); + assert.equal(this.hre.network.config.chainId, 31337); + assert.equal(await result.foo.read.x(), Number(1)); }); - }); - describe("no preexisting createX contract", function () { - describe("hardhat network", function () { - useEphemeralIgnitionProject("minimal"); + it("should use an existing createX factory to deploy the given contract", async function () { + // Run create2 once deploying the factory + const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: DeploymentStrategyType.CREATE2, + }); - it("should deploy a create2 factory then use it to deploy the given contract", async function () { - const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, - }); + await waitForPendingTxs(this.hre, 1, firstDeployPromise); + await mineBlock(this.hre); - await waitForPendingTxs(this.hre, 1, deployPromise); - await mineBlock(this.hre); + await firstDeployPromise; - const result = await deployPromise; + // Run a second deploy, this time leveraging the existing create2 factory + const secondDeployPromise = this.hre.ignition.deploy( + buildModule("Second", (m) => { + const bar = m.contract("Bar"); - assert.equal(result.foo.address, EXPECTED_FOO_CREATE2_ADDRESS); + return { bar }; + }), + { + strategy: DeploymentStrategyType.CREATE2, + } + ); - assert.equal(this.hre.network.config.chainId, 31337); - assert.equal(await result.foo.read.x(), Number(1)); - }); - }); + await waitForPendingTxs(this.hre, 1, secondDeployPromise); + await mineBlock(this.hre); - describe("non hardhat network", function () { - useEphemeralIgnitionProject("create2-not-exists-chain"); + const secondDeployResult = await secondDeployPromise; - it("should throw when no createX contract exists on the network", async function () { - assert.equal(this.hre.network.config.chainId, 88888); - await assert.isRejected( - this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, - }), - /CreateX not deployed on current network 88888/ - ); - }); + assert.equal( + secondDeployResult.bar.address, + EXPECTED_BAR_CREATE2_ADDRESS + ); + assert(await secondDeployResult.bar.read.isBar()); }); }); }); From 6c3c788118beb80d9968949407a7a5e24ed78554 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 18 Jan 2024 11:25:43 +0000 Subject: [PATCH 1161/1302] refactor: rework if conditional --- .../execution/create2-execution-strategy.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/internal/execution/create2-execution-strategy.ts index 25f1369012..3ed12c0fad 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/internal/execution/create2-execution-strategy.ts @@ -58,10 +58,10 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { } public async init(): Promise { - // No createX factory found, but we're not on a local chain - // check if someone else has deployed CreateX on this chain + // Check if CreateX is deployed on the current network const result = await this.client.getCode(CREATE_X_ADDRESS); + // If CreateX factory is deployed (and bytecode matches) then nothing to do if (result !== "0x") { assertIgnitionInvariant( ethers.keccak256(result) === CREATE_X_DEPLOYED_BYTECODE_HASH, @@ -73,14 +73,16 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { const chainId = await this.client.getChainId(); - if (chainId === 31337) { - await this._deployCreateXFactory(this.client); - } else { + // Otherwise if we're not on a local hardhat node, throw an error + if (chainId !== 31337) { throw new NomicIgnitionPluginError( "create2", `CreateX not deployed on current network ${chainId}` ); } + + // On a local hardhat node, deploy the CreateX factory + await this._deployCreateXFactory(this.client); } public async *executeDeployment( @@ -256,8 +258,8 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { * the CreateX factory contract using a presigned transaction. */ private async _deployCreateXFactory(client: EIP1193JsonRpcClient) { - // No createX factory found because we're on a local hardhat node - // deploy one using presigned tx from CreateX + // The account that will deploy the CreateX factory needs to be funded + // first await client.setBalance( CREATE_X_PRESIGNED_DEPLOYER_ADDRESS, 400000000000000000n From 1a3a86c2522aced14be536c5ef981f3de60afe0b Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 13:02:08 +0000 Subject: [PATCH 1162/1302] chore: lessen core coverage constraint --- packages/core/.nycrc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/.nycrc b/packages/core/.nycrc index 05a77b2bcf..4f55366420 100644 --- a/packages/core/.nycrc +++ b/packages/core/.nycrc @@ -1,9 +1,9 @@ { "extends": "@istanbuljs/nyc-config-typescript", "check-coverage": true, - "statements": 80, + "statements": 75, "branches": 65, - "functions": 75, + "functions": 70, "lines": 75, "all": true, "include": ["src/**/*.ts"], From c25ffa615f00a37801d16b1cd392b79a1f7e879b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 14 Feb 2024 04:10:12 -0500 Subject: [PATCH 1163/1302] add configuration options for strategies --- .../basic-execution-strategy.ts | 37 +++++++++--- .../create2-execution-strategy.ts | 57 +++++++++++++------ packages/core/src/deploy.ts | 29 ++-------- packages/core/src/index.ts | 2 + .../internal/execution/execution-engine.ts | 2 - .../execution/types/execution-strategy.ts | 2 +- packages/core/src/types/deploy.ts | 25 ++++---- packages/core/src/types/execution-events.ts | 4 +- .../named-contract-at-deploy.ts | 2 +- .../future-processor/named-contract-deploy.ts | 2 +- .../test/execution/future-processor/utils.ts | 13 ++--- .../src/ethers-ignition-helper.ts | 17 ++++-- .../src/viem-ignition-helper.ts | 14 ++++- packages/hardhat-plugin/src/helpers.ts | 1 + packages/hardhat-plugin/src/index.ts | 22 ++----- .../hardhat-plugin/src/type-extensions.ts | 10 +++- packages/hardhat-plugin/src/ui/types.ts | 7 +-- .../src/utils/resolveStrategy.ts | 35 ++++++++++++ .../hardhat-plugin/test/strategies/create2.ts | 23 ++++---- .../generic-strategy-constraints.ts | 32 +++-------- .../test/test-helpers/test-ignition-helper.ts | 14 +++-- ...alculate-deploying-module-panel-display.ts | 5 +- 22 files changed, 206 insertions(+), 149 deletions(-) rename packages/core/src/{internal/execution => }/basic-execution-strategy.ts (82%) rename packages/core/src/{internal/execution => }/create2-execution-strategy.ts (83%) create mode 100644 packages/hardhat-plugin/src/utils/resolveStrategy.ts diff --git a/packages/core/src/internal/execution/basic-execution-strategy.ts b/packages/core/src/basic-execution-strategy.ts similarity index 82% rename from packages/core/src/internal/execution/basic-execution-strategy.ts rename to packages/core/src/basic-execution-strategy.ts index 8243999701..be0c09e1b2 100644 --- a/packages/core/src/internal/execution/basic-execution-strategy.ts +++ b/packages/core/src/basic-execution-strategy.ts @@ -6,14 +6,14 @@ import { executeOnchainInteractionRequest, executeStaticCallRequest, getStaticCallExecutionStateResultValue, -} from "./execution-strategy-helpers"; -import { ExecutionResultType } from "./types/execution-result"; +} from "./internal/execution/execution-strategy-helpers"; +import { ExecutionResultType } from "./internal/execution/types/execution-result"; import { CallExecutionState, DeploymentExecutionState, SendDataExecutionState, StaticCallExecutionState, -} from "./types/execution-state"; +} from "./internal/execution/types/execution-state"; import { CallStrategyGenerator, DeploymentStrategyGenerator, @@ -22,26 +22,35 @@ import { OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, -} from "./types/execution-strategy"; -import { NetworkInteractionType } from "./types/network-interaction"; +} from "./internal/execution/types/execution-strategy"; +import { NetworkInteractionType } from "./internal/execution/types/network-interaction"; +import { assertIgnitionInvariant } from "./internal/utils/assertions"; /** * The most basic execution strategy, which sends a single transaction * for each deployment, call, and send data, and a single static call * per static call execution. + * + * @beta */ -export class BasicExecutionStrategy implements ExecutionStrategy { +export class BasicStrategy implements ExecutionStrategy { public readonly name: string = "basic"; + private _loadArtifact: LoadArtifactFunction | undefined; - constructor(private readonly _loadArtifact: LoadArtifactFunction) {} + constructor() {} - public async init(): Promise { - // Nothing to do + public async init(_loadArtifact: LoadArtifactFunction): Promise { + this._loadArtifact = _loadArtifact; } public async *executeDeployment( executionState: DeploymentExecutionState ): DeploymentStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); const transactionOrResult = yield* executeOnchainInteractionRequest( @@ -87,6 +96,11 @@ export class BasicExecutionStrategy implements ExecutionStrategy { public async *executeCall( executionState: CallExecutionState ): CallStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); const transactionOrResult = yield* executeOnchainInteractionRequest( @@ -153,6 +167,11 @@ export class BasicExecutionStrategy implements ExecutionStrategy { public async *executeStaticCall( executionState: StaticCallExecutionState ): StaticCallStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); const decodedResultOrError = yield* executeStaticCallRequest( diff --git a/packages/core/src/internal/execution/create2-execution-strategy.ts b/packages/core/src/create2-execution-strategy.ts similarity index 83% rename from packages/core/src/internal/execution/create2-execution-strategy.ts rename to packages/core/src/create2-execution-strategy.ts index 3ed12c0fad..d852b658e0 100644 --- a/packages/core/src/internal/execution/create2-execution-strategy.ts +++ b/packages/core/src/create2-execution-strategy.ts @@ -1,9 +1,6 @@ import { ethers } from "ethers"; -import { NomicIgnitionPluginError } from "../../errors"; -import { EIP1193Provider } from "../../types/provider"; -import { assertIgnitionInvariant } from "../utils/assertions"; - +import { NomicIgnitionPluginError } from "./errors"; import { decodeArtifactCustomError, decodeArtifactFunctionCallResult, @@ -13,16 +10,19 @@ import { executeStaticCallRequest, getEventArgumentFromReceipt, getStaticCallExecutionStateResultValue, -} from "./execution-strategy-helpers"; -import { EIP1193JsonRpcClient } from "./jsonrpc-client"; -import { createxArtifact, presignedTx } from "./strategy/createx-artifact"; -import { ExecutionResultType } from "./types/execution-result"; +} from "./internal/execution/execution-strategy-helpers"; +import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; +import { + createxArtifact, + presignedTx, +} from "./internal/execution/strategy/createx-artifact"; +import { ExecutionResultType } from "./internal/execution/types/execution-result"; import { CallExecutionState, DeploymentExecutionState, SendDataExecutionState, StaticCallExecutionState, -} from "./types/execution-state"; +} from "./internal/execution/types/execution-state"; import { CallStrategyGenerator, DeploymentStrategyGenerator, @@ -31,8 +31,10 @@ import { OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, -} from "./types/execution-strategy"; -import { NetworkInteractionType } from "./types/network-interaction"; +} from "./internal/execution/types/execution-strategy"; +import { NetworkInteractionType } from "./internal/execution/types/network-interaction"; +import { assertIgnitionInvariant } from "./internal/utils/assertions"; +import { EIP1193Provider } from "./types/provider"; // v0.1.0 const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; @@ -45,19 +47,23 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = * The most basic execution strategy, which sends a single transaction * for each deployment, call, and send data, and a single static call * per static call execution. + * + * @beta */ -export class Create2ExecutionStrategy implements ExecutionStrategy { +export class Create2Strategy implements ExecutionStrategy { public readonly name: string = "create2"; private readonly client: EIP1193JsonRpcClient; + private readonly salt: string; + private _loadArtifact: LoadArtifactFunction | undefined; - constructor( - provider: EIP1193Provider, - private readonly _loadArtifact: LoadArtifactFunction - ) { + constructor(provider: EIP1193Provider, options: { salt: string }) { this.client = new EIP1193JsonRpcClient(provider); + this.salt = options.salt; } - public async init(): Promise { + public async init(_loadArtifact: LoadArtifactFunction): Promise { + this._loadArtifact = _loadArtifact; + // Check if CreateX is deployed on the current network const result = await this.client.getCode(CREATE_X_ADDRESS); @@ -88,8 +94,13 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { public async *executeDeployment( executionState: DeploymentExecutionState ): DeploymentStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); - const salt = ethers.id("test"); + const salt = ethers.id(this.salt); const bytecodeToDeploy = encodeArtifactDeploymentData( artifact, @@ -150,6 +161,11 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { public async *executeCall( executionState: CallExecutionState ): CallStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); const transactionOrResult = yield* executeOnchainInteractionRequest( @@ -216,6 +232,11 @@ export class Create2ExecutionStrategy implements ExecutionStrategy { public async *executeStaticCall( executionState: StaticCallExecutionState ): StaticCallStrategyGenerator { + assertIgnitionInvariant( + this._loadArtifact !== undefined, + "loadArtifact not initialized" + ); + const artifact = await this._loadArtifact(executionState.artifactId); const decodedResultOrError = yield* executeStaticCallRequest( diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index eb0b403587..4c350f5ec9 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -8,8 +8,6 @@ import { EphemeralDeploymentLoader } from "./internal/deployment-loader/ephemera import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; import { DeploymentLoader } from "./internal/deployment-loader/types"; import { ERRORS } from "./internal/errors-list"; -import { BasicExecutionStrategy } from "./internal/execution/basic-execution-strategy"; -import { Create2ExecutionStrategy } from "./internal/execution/create2-execution-strategy"; import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; import { equalAddresses } from "./internal/execution/utils/address"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; @@ -48,7 +46,7 @@ export async function deploy< deploymentParameters, accounts, defaultSender: givenDefaultSender, - strategy = DeploymentStrategyType.BASIC, + strategy: executionStrategy, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -63,7 +61,7 @@ export async function deploy< deploymentParameters: DeploymentParameters; accounts: string[]; defaultSender?: string; - strategy?: DeploymentStrategyType; + strategy: DeploymentStrategyType; }): Promise { if (executionEventListener !== undefined) { executionEventListener.setModuleId({ @@ -73,7 +71,7 @@ export async function deploy< executionEventListener.setStrategy({ type: ExecutionEventType.SET_STRATEGY, - strategy, + strategy: executionStrategy.name, }); } @@ -104,7 +102,9 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider); - const executionStrategy = setupStrategy(strategy, deploymentLoader, provider); + await executionStrategy.init((artifactId) => + deploymentLoader.loadArtifact(artifactId) + ); const isAutominedNetwork = await checkAutominedNetwork(provider); @@ -157,20 +157,3 @@ function _resolveDefaultSender( return defaultSender; } - -function setupStrategy( - strategyName: DeploymentStrategyType, - deploymentLoader: DeploymentLoader, - provider: EIP1193Provider -) { - switch (strategyName) { - case DeploymentStrategyType.BASIC: - return new BasicExecutionStrategy((artifactId) => - deploymentLoader.loadArtifact(artifactId) - ); - case DeploymentStrategyType.CREATE2: - return new Create2ExecutionStrategy(provider, (artifactId) => - deploymentLoader.loadArtifact(artifactId) - ); - } -} diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index dbbe347f56..f1bde0a5bc 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,7 @@ export { batches } from "./batches"; +export { BasicStrategy } from "./basic-execution-strategy"; export { buildModule } from "./build-module"; +export { Create2Strategy } from "./create2-execution-strategy"; export { deploy } from "./deploy"; export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index 16a87966e6..d176bdb2e8 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -98,8 +98,6 @@ export class ExecutionEngine { const futures = getFuturesFromModule(module); - await this._executionStrategy.init(); - for (const batch of batches) { this._emitBeginNextBatchEvent(); diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index a8e3e8e034..fbe8b39908 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -216,7 +216,7 @@ export interface ExecutionStrategy { */ name: string; - init: () => Promise; + init: (_loadArtifact: LoadArtifactFunction) => Promise; /** * Executes a deployment execution state. diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index dd7f7f3a55..76f8b48329 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -1,3 +1,6 @@ +import { BasicStrategy } from "../basic-execution-strategy"; +import { Create2Strategy } from "../create2-execution-strategy"; + import { ModuleParameters } from "./module"; /** @@ -210,18 +213,20 @@ export interface DeploymentParameters { } /** - * An enumeration of the different types of deployment strategies. + * The different types of deployment strategies. * * @beta */ -export enum DeploymentStrategyType { - /** - * The basic deployment strategy. - */ - BASIC = "basic", +export type DeploymentStrategyType = Create2Strategy | BasicStrategy; - /** - * The create2 deployment strategy. - */ - CREATE2 = "create2", +/** + * The config options for the deployment strategies. + * + * @beta + */ +export interface StrategyConfig { + basic: {}; + create2: { + salt: string; + }; } diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index a858862f07..0909472fde 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -1,4 +1,4 @@ -import { DeploymentResult, DeploymentStrategyType } from "./deploy"; +import { DeploymentResult } from "./deploy"; /** * Events emitted by the execution engine to allow tracking @@ -375,7 +375,7 @@ export interface SetModuleIdEvent { */ export interface SetStrategyEvent { type: ExecutionEventType.SET_STRATEGY; - strategy: DeploymentStrategyType; + strategy: string; } /** diff --git a/packages/core/test/execution/future-processor/named-contract-at-deploy.ts b/packages/core/test/execution/future-processor/named-contract-at-deploy.ts index fd56b00e9a..d64552676f 100644 --- a/packages/core/test/execution/future-processor/named-contract-at-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-at-deploy.ts @@ -24,7 +24,7 @@ describe("future processor", () => { exampleAddress ); - const { processor, storedDeployedAddresses } = setupFutureProcessor( + const { processor, storedDeployedAddresses } = await setupFutureProcessor( (() => {}) as any, {} ); diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/core/test/execution/future-processor/named-contract-deploy.ts index 8f82a9ccf3..c0704f8e4f 100644 --- a/packages/core/test/execution/future-processor/named-contract-deploy.ts +++ b/packages/core/test/execution/future-processor/named-contract-deploy.ts @@ -38,7 +38,7 @@ describe("future processor", () => { exampleAccounts[0] ); - const { processor, storedDeployedAddresses } = setupFutureProcessor( + const { processor, storedDeployedAddresses } = await setupFutureProcessor( async (_transactionParams: TransactionParams) => { return exampleTxHash; }, diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index e99bda51d3..6503445024 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -1,4 +1,4 @@ -import { BasicExecutionStrategy } from "../../../src/internal/execution/basic-execution-strategy"; +import { BasicStrategy } from "../../../src/basic-execution-strategy"; import { FutureProcessor } from "../../../src/internal/execution/future-processor/future-processor"; import { Block, @@ -24,13 +24,13 @@ import { setupMockDeploymentLoader, } from "../../helpers"; -export function setupFutureProcessor( +export async function setupFutureProcessor( sendTransaction: (transactionParams: TransactionParams) => Promise, transactions: { [key: string]: TransactionReceipt } -): { +): Promise<{ processor: FutureProcessor; storedDeployedAddresses: { [key: string]: string }; -} { +}> { const storedDeployedAddresses: { [key: string]: string } = {}; const mockDeploymentLoader = setupMockDeploymentLoader( @@ -40,9 +40,8 @@ export function setupFutureProcessor( const mockArtifactResolver = setupMockArtifactResolver(); - const basicExecutionStrategy = new BasicExecutionStrategy( - mockDeploymentLoader.loadArtifact - ); + const basicExecutionStrategy = new BasicStrategy(); + await basicExecutionStrategy.init(mockDeploymentLoader.loadArtifact); const mockJsonRpcClient = setupMockJsonRpcClient( sendTransaction, diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index e151f41558..027cd13366 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -1,18 +1,19 @@ import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, + resolveStrategy, } from "@nomicfoundation/hardhat-ignition/helpers"; import { DeployConfig, DeploymentParameters, DeploymentResultType, - DeploymentStrategyType, EIP1193Provider, Future, IgnitionModule, IgnitionModuleResult, NamedArtifactContractAtFuture, NamedArtifactContractDeploymentFuture, + StrategyConfig, SuccessfulDeploymentResult, deploy, isContractFuture, @@ -64,7 +65,8 @@ export class EthersIgnitionHelper { public async deploy< ModuleIdT extends string, ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" >( ignitionModule: IgnitionModule< ModuleIdT, @@ -75,17 +77,20 @@ export class EthersIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, - strategy = DeploymentStrategyType.BASIC, + strategy: strategyName, + strategyConfig, }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; - strategy?: DeploymentStrategyType; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; } = { parameters: {}, config: {}, defaultSender: undefined, - strategy: DeploymentStrategyType.BASIC, + strategy: undefined, + strategyConfig: undefined, } ): Promise< IgnitionModuleResultsTToEthersContracts< @@ -104,6 +109,8 @@ export class EthersIgnitionHelper { ...perDeployConfig, }; + const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const result = await deploy({ config: resolvedConfig, provider: this._provider, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 6934dd373b..f8dee6f1e5 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -3,6 +3,7 @@ import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types" import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, + resolveStrategy, } from "@nomicfoundation/hardhat-ignition/helpers"; import { ContractAtFuture, @@ -20,6 +21,7 @@ import { NamedArtifactContractAtFuture, NamedArtifactContractDeploymentFuture, NamedArtifactLibraryDeploymentFuture, + StrategyConfig, SuccessfulDeploymentResult, deploy, isContractFuture, @@ -56,7 +58,8 @@ export class ViemIgnitionHelper { public async deploy< ModuleIdT extends string, ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" >( ignitionModule: IgnitionModule< ModuleIdT, @@ -67,14 +70,20 @@ export class ViemIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, + strategy: strategyName, + strategyConfig, }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; } = { parameters: {}, config: {}, defaultSender: undefined, + strategy: undefined, + strategyConfig: undefined, } ): Promise< IgnitionModuleResultsToViemContracts @@ -90,6 +99,8 @@ export class ViemIgnitionHelper { ...perDeployConfig, }; + const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const result = await deploy({ config: resolvedConfig, provider: this._provider, @@ -99,6 +110,7 @@ export class ViemIgnitionHelper { deploymentParameters: parameters, accounts, defaultSender, + strategy, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts index 4c17b51c0a..aa58d40919 100644 --- a/packages/hardhat-plugin/src/helpers.ts +++ b/packages/hardhat-plugin/src/helpers.ts @@ -1,2 +1,3 @@ export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; +export { resolveStrategy } from "./utils/resolveStrategy"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index c806640a8d..bac30f65d8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -2,7 +2,6 @@ import "@nomicfoundation/hardhat-verify"; import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; import { DeploymentParameters, - DeploymentStrategyType, IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; @@ -90,7 +89,7 @@ ignitionScope defaultSender, reset, verify, - strategy, + strategy: strategyName, }: { modulePath: string; parameters?: string; @@ -111,8 +110,9 @@ ignitionScope ); const { loadModule } = await import("./utils/load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); + const { resolveStrategy } = await import("./utils/resolveStrategy"); - const strategyName = resolveStrategyName(strategy); + const strategy = resolveStrategy(strategyName, hre); if (verify) { if ( @@ -220,7 +220,7 @@ ignitionScope deploymentParameters: parameters ?? {}, accounts, defaultSender, - strategy: strategyName, + strategy, }); if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { @@ -517,17 +517,3 @@ function resolveParametersString(paramString: string): DeploymentParameters { process.exit(1); } } - -function resolveStrategyName(strategy: string): DeploymentStrategyType { - switch (strategy) { - case "basic": - return DeploymentStrategyType.BASIC; - case "create2": - return DeploymentStrategyType.CREATE2; - default: - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - "Invalid strategy name, must be either 'basic' or 'create2'" - ); - } -} diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 136c38a5d1..bfeaa8bde8 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -2,7 +2,7 @@ import "hardhat/types/config"; import "hardhat/types/runtime"; -import { DeployConfig } from "@nomicfoundation/ignition-core"; +import { DeployConfig, StrategyConfig } from "@nomicfoundation/ignition-core"; declare module "hardhat/types/config" { export interface ProjectPathsUserConfig { @@ -14,10 +14,14 @@ declare module "hardhat/types/config" { } export interface HardhatUserConfig { - ignition?: Partial; + ignition?: Partial & { + strategyConfig?: Partial; + }; } export interface HardhatConfig { - ignition: Partial; + ignition: Partial & { + strategyConfig?: Partial; + }; } } diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index c7a4567864..52eada52da 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -1,7 +1,4 @@ -import { - DeploymentResult, - DeploymentStrategyType, -} from "@nomicfoundation/ignition-core"; +import { DeploymentResult } from "@nomicfoundation/ignition-core"; export enum UiFutureStatusType { UNSTARTED = "UNSTARTED", @@ -67,7 +64,7 @@ export interface UiState { isResumed: boolean | null; maxFeeBumps: number; gasBumps: Record; - strategy: DeploymentStrategyType | null; + strategy: string | null; } export interface AddressMap { diff --git a/packages/hardhat-plugin/src/utils/resolveStrategy.ts b/packages/hardhat-plugin/src/utils/resolveStrategy.ts new file mode 100644 index 0000000000..4574d0ca3c --- /dev/null +++ b/packages/hardhat-plugin/src/utils/resolveStrategy.ts @@ -0,0 +1,35 @@ +import type { + DeploymentStrategyType, + StrategyConfig, +} from "@nomicfoundation/ignition-core"; +import type { HardhatRuntimeEnvironment } from "hardhat/types"; + +export function resolveStrategy( + strategyName: string = "basic", + hre: HardhatRuntimeEnvironment, + strategyConfigOverride: StrategyConfig[keyof StrategyConfig] = {} +): DeploymentStrategyType { + const { BasicStrategy, Create2Strategy } = + require("@nomicfoundation/ignition-core") as typeof import("@nomicfoundation/ignition-core"); + + const { NomicLabsHardhatPluginError } = + require("hardhat/plugins") as typeof import("hardhat/plugins"); + + switch (strategyName) { + case "basic": + return new BasicStrategy(); + case "create2": + const salt = + "salt" in strategyConfigOverride + ? strategyConfigOverride.salt + : hre.config.ignition.strategyConfig?.create2?.salt ?? + "default-ignition-salt"; + + return new Create2Strategy(hre.network.provider, { salt }); + default: + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Invalid strategy name, must be either 'basic' or 'create2'" + ); + } +} diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 904b515edf..044404ac0c 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -1,8 +1,5 @@ /* eslint-disable import/no-unused-modules */ -import { - DeploymentStrategyType, - buildModule, -} from "@nomicfoundation/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -14,9 +11,9 @@ import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; describe("create2", function () { const EXPECTED_FOO_CREATE2_ADDRESS = - "0xc95c2ba05118C1b0D2e9DEC8802c358483F87FBA"; + "0xA666fE62aA1fD2A7e7C08F81Eba3f55F459A9002"; const EXPECTED_BAR_CREATE2_ADDRESS = - "0x3175cBAd3Ab8afCDf7f90c2Acf7fD3E11304310B"; + "0xF44091a604c7Ed92441Ea695c0f41C522466b4D3"; const moduleDefinition = buildModule("FooModule", (m) => { // Use a known bytecode to ensure the same address is generated @@ -41,7 +38,7 @@ describe("create2", function () { ].forEach((accountAddress) => { it(`should deploy a contract from account <${accountAddress}> using the createX factory to the expected address`, async function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", defaultSender: accountAddress, }); @@ -67,7 +64,7 @@ describe("create2", function () { return { foo }; }), { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", } ); @@ -95,7 +92,7 @@ describe("create2", function () { return { foo }; }), { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", } ), /Simulating the transaction failed with error: Reverted with custom error FailedContractCreation/ @@ -110,7 +107,7 @@ describe("create2", function () { assert.equal(this.hre.network.config.chainId, 88888); await assert.isRejected( this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", }), /CreateX not deployed on current network 88888/ ); @@ -123,7 +120,7 @@ describe("create2", function () { it("should deploy a createX factory then use it to deploy the given contract", async function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -140,7 +137,7 @@ describe("create2", function () { it("should use an existing createX factory to deploy the given contract", async function () { // Run create2 once deploying the factory const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", }); await waitForPendingTxs(this.hre, 1, firstDeployPromise); @@ -156,7 +153,7 @@ describe("create2", function () { return { bar }; }), { - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", } ); diff --git a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts index 34e24825bf..824ade79dc 100644 --- a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts +++ b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts @@ -1,14 +1,11 @@ -import { - DeploymentStrategyType, - buildModule, -} from "@nomicfoundation/ignition-core"; +import { StrategyConfig, buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { mineBlock } from "../test-helpers/mine-block"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; -const strategies = ["basic", "create2"]; +const strategies: Array = ["basic", "create2"]; describe("strategies - generic constraints", function () { strategies.forEach((strategy) => { @@ -23,7 +20,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -45,7 +42,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 2, deployPromise); @@ -70,7 +67,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -106,7 +103,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -152,7 +149,7 @@ describe("strategies - generic constraints", function () { const contractAtPromise = this.hre.ignition.deploy( contractAtDefinition, { - strategy: strategyNameToType(strategy), + strategy, } ); @@ -177,7 +174,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -209,7 +206,7 @@ describe("strategies - generic constraints", function () { }); const deployPromise = this.hre.ignition.deploy(moduleDefinition, { - strategy: strategyNameToType(strategy), + strategy, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -228,14 +225,3 @@ describe("strategies - generic constraints", function () { }); }); }); - -function strategyNameToType(strategyName: string): DeploymentStrategyType { - switch (strategyName) { - case "basic": - return DeploymentStrategyType.BASIC; - case "create2": - return DeploymentStrategyType.CREATE2; - default: - throw new Error(`Unknown strategy name: ${strategyName}`); - } -} diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index de1f30d2e5..64be482e15 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -5,12 +5,12 @@ import { DeployConfig, DeploymentParameters, DeploymentResultType, - DeploymentStrategyType, EIP1193Provider, Future, IgnitionModule, IgnitionModuleResult, isContractFuture, + StrategyConfig, SuccessfulDeploymentResult, } from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; @@ -19,6 +19,7 @@ import { createPublicClient, custom, getContract } from "viem"; import { hardhat } from "viem/chains"; import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; +import { resolveStrategy } from "../../src/helpers"; import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; export type IgnitionModuleResultsTToViemContracts< @@ -56,7 +57,8 @@ export class TestIgnitionHelper { public async deploy< ModuleIdT extends string, ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" >( ignitionModule: IgnitionModule< ModuleIdT, @@ -66,12 +68,14 @@ export class TestIgnitionHelper { { parameters = {}, config: perDeployConfig = {}, - strategy = DeploymentStrategyType.BASIC, + strategy: strategyName, + strategyConfig, defaultSender = undefined, }: { parameters?: DeploymentParameters; config?: Partial; - strategy?: DeploymentStrategyType; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; defaultSender?: string; } = { parameters: {}, @@ -91,6 +95,8 @@ export class TestIgnitionHelper { ...perDeployConfig, }; + const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const result = await deploy({ config: resolvedConfig, provider: this._provider, diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index c63b67f7db..0615beb4e1 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -1,4 +1,3 @@ -import { DeploymentStrategyType } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import chalk from "chalk"; import path from "path"; @@ -21,7 +20,7 @@ describe("ui - calculate starting message display", () => { isResumed: null, maxFeeBumps: 0, gasBumps: {}, - strategy: DeploymentStrategyType.BASIC, + strategy: "basic", }; it("should display the deploying module message", () => { @@ -45,7 +44,7 @@ describe("ui - calculate starting message display", () => { const actualText = calculateDeployingModulePanel({ ...exampleState, - strategy: DeploymentStrategyType.CREATE2, + strategy: "create2", }); assert.equal(actualText, expectedText); From 2a142ead72cef40899f45685f818c4607e8b1895 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 15 Feb 2024 03:02:46 -0500 Subject: [PATCH 1164/1302] add reconciliation rules for strategy name and config --- packages/core/src/basic-execution-strategy.ts | 3 +- .../core/src/create2-execution-strategy.ts | 11 +-- packages/core/src/internal/deployer.ts | 8 ++- .../internal/execution/execution-engine.ts | 8 ++- .../future-processor/future-processor.ts | 8 ++- .../helpers/build-initialize-message-for.ts | 35 +++++++--- .../reducers/helpers/initializers.ts | 6 ++ .../execution/types/execution-state.ts | 1 + .../execution/types/execution-strategy.ts | 5 ++ .../src/internal/execution/types/messages.ts | 6 ++ .../futures/reconcileArtifactContractAt.ts | 6 ++ .../reconcileArtifactContractDeployment.ts | 6 ++ .../reconcileArtifactLibraryDeployment.ts | 6 ++ .../futures/reconcileNamedContractAt.ts | 6 ++ .../futures/reconcileNamedContractCall.ts | 6 ++ .../reconcileNamedContractDeployment.ts | 6 ++ .../reconcileNamedLibraryDeployment.ts | 6 ++ .../futures/reconcileNamedStaticCall.ts | 6 ++ .../futures/reconcileReadEventArgument.ts | 6 ++ .../futures/reconcileSendData.ts | 6 ++ .../helpers/reconcile-strategy.ts | 70 +++++++++++++++++++ .../src/internal/reconciliation/reconciler.ts | 6 +- .../core/src/internal/reconciliation/types.ts | 2 + 23 files changed, 202 insertions(+), 27 deletions(-) create mode 100644 packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts diff --git a/packages/core/src/basic-execution-strategy.ts b/packages/core/src/basic-execution-strategy.ts index be0c09e1b2..038bff5efb 100644 --- a/packages/core/src/basic-execution-strategy.ts +++ b/packages/core/src/basic-execution-strategy.ts @@ -34,7 +34,8 @@ import { assertIgnitionInvariant } from "./internal/utils/assertions"; * @beta */ export class BasicStrategy implements ExecutionStrategy { - public readonly name: string = "basic"; + public readonly name = "basic" as const; + public readonly config: {} = {}; private _loadArtifact: LoadArtifactFunction | undefined; constructor() {} diff --git a/packages/core/src/create2-execution-strategy.ts b/packages/core/src/create2-execution-strategy.ts index d852b658e0..ab28f7fcc0 100644 --- a/packages/core/src/create2-execution-strategy.ts +++ b/packages/core/src/create2-execution-strategy.ts @@ -51,14 +51,15 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = * @beta */ export class Create2Strategy implements ExecutionStrategy { - public readonly name: string = "create2"; + public readonly name = "create2" as const; private readonly client: EIP1193JsonRpcClient; - private readonly salt: string; private _loadArtifact: LoadArtifactFunction | undefined; - constructor(provider: EIP1193Provider, options: { salt: string }) { + constructor( + provider: EIP1193Provider, + public readonly config: { salt: string } + ) { this.client = new EIP1193JsonRpcClient(provider); - this.salt = options.salt; } public async init(_loadArtifact: LoadArtifactFunction): Promise { @@ -100,7 +101,7 @@ export class Create2Strategy implements ExecutionStrategy { ); const artifact = await this._loadArtifact(executionState.artifactId); - const salt = ethers.id(this.salt); + const salt = ethers.id(this.config.salt); const bytecodeToDeploy = encodeArtifactDeploymentData( artifact, diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index b8c25ce03b..0a558dd0e4 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -8,6 +8,7 @@ import { DeploymentParameters, DeploymentResult, DeploymentResultType, + DeploymentStrategyType, ExecutionErrorDeploymentResult, PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, @@ -34,7 +35,6 @@ import { ExecutionState, ExecutionStatus, } from "./execution/types/execution-state"; -import { ExecutionStrategy } from "./execution/types/execution-strategy"; import { Reconciler } from "./reconciliation/reconciler"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; @@ -50,7 +50,7 @@ export class Deployer { constructor( private readonly _config: DeployConfig, private readonly _deploymentDir: string | undefined, - private readonly _executionStrategy: ExecutionStrategy, + private readonly _executionStrategy: DeploymentStrategyType, private readonly _jsonRpcClient: JsonRpcClient, private readonly _artifactResolver: ArtifactResolver, private readonly _deploymentLoader: DeploymentLoader, @@ -115,7 +115,9 @@ export class Deployer { accounts, this._deploymentLoader, this._artifactResolver, - defaultSender + defaultSender, + this._executionStrategy.name, + this._executionStrategy.config ); if (reconciliationResult.reconciliationFailures.length > 0) { diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index d176bdb2e8..30c5cdeccd 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -1,5 +1,8 @@ import { ArtifactResolver } from "../../types/artifact"; -import { DeploymentParameters } from "../../types/deploy"; +import { + DeploymentParameters, + DeploymentStrategyType, +} from "../../types/deploy"; import { ExecutionEventListener, ExecutionEventType, @@ -24,7 +27,6 @@ import { getNonceSyncMessages } from "./nonce-management/get-nonce-sync-messages import { JsonRpcNonceManager } from "./nonce-management/json-rpc-nonce-manager"; import { TransactionTrackingTimer } from "./transaction-tracking-timer"; import { DeploymentState } from "./types/deployment-state"; -import { ExecutionStrategy } from "./types/execution-strategy"; /** * This class is used to execute a module to completion, returning the new @@ -34,7 +36,7 @@ export class ExecutionEngine { constructor( private readonly _deploymentLoader: DeploymentLoader, private readonly _artifactResolver: ArtifactResolver, - private readonly _executionStrategy: ExecutionStrategy, + private readonly _executionStrategy: DeploymentStrategyType, private readonly _jsonRpcClient: JsonRpcClient, private readonly _executionEventListener: | ExecutionEventListener diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index eb1e4046d8..2a841b3c6c 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -1,5 +1,8 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { DeploymentParameters } from "../../../types/deploy"; +import { + DeploymentParameters, + DeploymentStrategyType, +} from "../../../types/deploy"; import { Future } from "../../../types/module"; import { DeploymentLoader } from "../../deployment-loader/types"; import { assertIgnitionInvariant } from "../../utils/assertions"; @@ -17,7 +20,6 @@ import { SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; -import { ExecutionStrategy } from "../types/execution-strategy"; import { JournalMessage, JournalMessageType } from "../types/messages"; import { monitorOnchainInteraction } from "./handlers/monitor-onchain-interaction"; @@ -40,7 +42,7 @@ export class FutureProcessor { constructor( private readonly _deploymentLoader: DeploymentLoader, private readonly _artifactResolver: ArtifactResolver, - private readonly _executionStrategy: ExecutionStrategy, + private readonly _executionStrategy: DeploymentStrategyType, private readonly _jsonRpcClient: JsonRpcClient, private readonly _transactionTrackingTimer: TransactionTrackingTimer, private readonly _nonceManager: NonceManager, diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 09b810cd8e..ac1f3c6045 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -1,4 +1,7 @@ -import { DeploymentParameters } from "../../../../types/deploy"; +import { + DeploymentParameters, + DeploymentStrategyType, +} from "../../../../types/deploy"; import { Future, FutureType } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; import { DeploymentState } from "../../types/deployment-state"; @@ -27,7 +30,7 @@ import { export async function buildInitializeMessageFor( future: Future, deploymentState: DeploymentState, - strategy: { name: string }, + strategy: DeploymentStrategyType, deploymentParameters: DeploymentParameters, deploymentLoader: DeploymentLoader, accounts: string[], @@ -40,7 +43,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { futureType: future.type, artifactId: future.id, @@ -69,7 +73,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.DEPLOYMENT_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { futureType: future.type, artifactId: future.id, @@ -87,7 +92,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { args: resolveArgs( future.args, @@ -118,7 +124,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { args: resolveArgs( future.args, @@ -145,7 +152,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { futureType: future.type, contractName: future.contractName, @@ -177,7 +185,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { artifactId: future.emitter.id, eventName: future.eventName, @@ -196,7 +205,8 @@ export async function buildInitializeMessageFor( _extendBaseInitWith( JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE, future, - strategy, + strategy.name, + strategy.config, { to: resolveSendToAddress( future.to, @@ -226,18 +236,21 @@ function _extendBaseInitWith< >( messageType: MessageT, future: FutureT, - strategy: { name: string }, + strategy: string, + strategyConfig: Record, extension: ExtensionT ): { type: MessageT; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; } & ExtensionT { return { type: messageType, futureId: future.id, - strategy: strategy.name, + strategy, + strategyConfig, dependencies: [...future.dependencies].map((f) => f.id), ...extension, }; diff --git a/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/core/src/internal/execution/reducers/helpers/initializers.ts index cbee26b036..17c57d80eb 100644 --- a/packages/core/src/internal/execution/reducers/helpers/initializers.ts +++ b/packages/core/src/internal/execution/reducers/helpers/initializers.ts @@ -26,6 +26,7 @@ export function initialiseDeploymentExecutionStateFrom( type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: action.futureType, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), artifactId: action.artifactId, @@ -48,6 +49,7 @@ export function initialiseStaticCallExecutionStateFrom( type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, futureType: FutureType.STATIC_CALL, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), artifactId: action.artifactId, @@ -70,6 +72,7 @@ export function initialiseSendDataExecutionStateFrom( type: ExecutionSateType.SEND_DATA_EXECUTION_STATE, futureType: FutureType.SEND_DATA, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), to: action.to, @@ -91,6 +94,7 @@ export function initialiseReadEventArgumentExecutionStateFrom( type: ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE, futureType: FutureType.READ_EVENT_ARGUMENT, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.SUCCESS, dependencies: new Set(action.dependencies), artifactId: action.artifactId, @@ -113,6 +117,7 @@ export function initialiseContractAtExecutionStateFrom( type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, futureType: action.futureType, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.SUCCESS, dependencies: new Set(action.dependencies), artifactId: action.artifactId, @@ -131,6 +136,7 @@ export function initialiseCallExecutionStateFrom( type: ExecutionSateType.CALL_EXECUTION_STATE, futureType: FutureType.CONTRACT_CALL, strategy: action.strategy, + strategyConfig: action.strategyConfig, status: ExecutionStatus.STARTED, dependencies: new Set(action.dependencies), artifactId: action.artifactId, diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 39a5366737..0f70a74483 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -55,6 +55,7 @@ interface BaseExecutionState< type: ExecutionStateT; futureType: FutureTypeT; strategy: string; // For example, "basic" | "create2". This needs to be string if we want custom ones. + strategyConfig: Record; status: ExecutionStatus; dependencies: Set; } diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index fbe8b39908..a4429f748d 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -216,6 +216,11 @@ export interface ExecutionStrategy { */ name: string; + /** + * The configuration options for the strategy. + */ + config: {}; + init: (_loadArtifact: LoadArtifactFunction) => Promise; /** diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index da9b0e15f5..f28b113883 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -79,6 +79,7 @@ export interface DeploymentExecutionStateInitializeMessage { futureId: string; futureType: DeploymentExecutionStateFutureTypes; strategy: string; + strategyConfig: Record; dependencies: string[]; artifactId: string; contractName: string; @@ -98,6 +99,7 @@ export interface CallExecutionStateInitializeMessage { type: JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; artifactId: string; contractAddress: string; @@ -117,6 +119,7 @@ export interface StaticCallExecutionStateInitializeMessage { type: JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; artifactId: string; contractAddress: string; @@ -136,6 +139,7 @@ export interface SendDataExecutionStateInitializeMessage { type: JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; to: string; data: string; @@ -154,6 +158,7 @@ export interface ContractAtExecutionStateInitializeMessage { futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT | FutureType.CONTRACT_AT; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; artifactId: string; contractName: string; @@ -164,6 +169,7 @@ export interface ReadEventArgExecutionStateInitializeMessage { type: JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; + strategyConfig: Record; dependencies: string[]; artifactId: string; eventName: string; diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts index 82182cc8de..d79e35c59b 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts @@ -3,6 +3,7 @@ import { ContractAtExecutionState } from "../../execution/types/execution-state" import { reconcileAddress } from "../helpers/reconcile-address"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileArtifactContractAt( @@ -25,5 +26,10 @@ export async function reconcileArtifactContractAt( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts index 33abd0ac89..d1be9b9489 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -5,6 +5,7 @@ import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileLibraries } from "../helpers/reconcile-libraries"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; @@ -43,6 +44,11 @@ export async function reconcileArtifactContractDeployment( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true, }; diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 0bcaebf581..4b7771ec98 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -4,6 +4,7 @@ import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileLibraries } from "../helpers/reconcile-libraries"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileArtifactLibraryDeployment( @@ -31,5 +32,10 @@ export async function reconcileArtifactLibraryDeployment( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts index fbe46daa08..62169e0460 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts @@ -3,6 +3,7 @@ import { ContractAtExecutionState } from "../../execution/types/execution-state" import { reconcileAddress } from "../helpers/reconcile-address"; import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileNamedContractAt( @@ -25,5 +26,10 @@ export async function reconcileNamedContractAt( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts index 02f2195c9e..8b1090d0d8 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts @@ -4,6 +4,7 @@ import { reconcileArguments } from "../helpers/reconcile-arguments"; import { reconcileContract } from "../helpers/reconcile-contract"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileFunctionName } from "../helpers/reconcile-function-name"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; @@ -37,5 +38,10 @@ export function reconcileNamedContractCall( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts index 5d34bcd121..ce4e879cf9 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -5,6 +5,7 @@ import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileLibraries } from "../helpers/reconcile-libraries"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; @@ -43,6 +44,11 @@ export async function reconcileNamedContractDeployment( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true, }; diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts index 41400165a9..237b5e89c6 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -4,6 +4,7 @@ import { reconcileArtifacts } from "../helpers/reconcile-artifacts"; import { reconcileContractName } from "../helpers/reconcile-contract-name"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileLibraries } from "../helpers/reconcile-libraries"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export async function reconcileNamedLibraryDeployment( @@ -31,5 +32,10 @@ export async function reconcileNamedLibraryDeployment( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts index a816fd53fd..295e31e746 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts @@ -5,6 +5,7 @@ import { reconcileArguments } from "../helpers/reconcile-arguments"; import { reconcileContract } from "../helpers/reconcile-contract"; import { reconcileFrom } from "../helpers/reconcile-from"; import { reconcileFunctionName } from "../helpers/reconcile-function-name"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export function reconcileNamedStaticCall( @@ -32,6 +33,11 @@ export function reconcileNamedStaticCall( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + result = compare( future, "Argument name or index", diff --git a/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts index ff5f6e6e25..441b0ddecc 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts @@ -2,6 +2,7 @@ import { ReadEventArgumentFuture } from "../../../types/module"; import { resolveAddressForContractFuture } from "../../execution/future-processor/helpers/future-resolvers"; import { ReadEventArgumentExecutionState } from "../../execution/types/execution-state"; import { compare } from "../helpers/compare"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; export function reconcileReadEventArgument( @@ -55,5 +56,10 @@ export function reconcileReadEventArgument( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts b/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts index 4586ebefd8..411e096945 100644 --- a/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts @@ -4,6 +4,7 @@ import { SendDataExecutionState } from "../../execution/types/execution-state"; import { compare } from "../helpers/compare"; import { reconcileData } from "../helpers/reconcile-data"; import { reconcileFrom } from "../helpers/reconcile-from"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; import { reconcileValue } from "../helpers/reconcile-value"; import { ReconciliationContext, ReconciliationFutureResult } from "../types"; @@ -44,5 +45,10 @@ export function reconcileSendData( return result; } + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + return { success: true }; } diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts new file mode 100644 index 0000000000..f098c95b4d --- /dev/null +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts @@ -0,0 +1,70 @@ +import { + ContractAtFuture, + ContractCallFuture, + ContractDeploymentFuture, + LibraryDeploymentFuture, + NamedArtifactContractAtFuture, + NamedArtifactContractDeploymentFuture, + NamedArtifactLibraryDeploymentFuture, + ReadEventArgumentFuture, + SendDataFuture, + StaticCallFuture, +} from "../../../types/module"; +import { + CallExecutionState, + ContractAtExecutionState, + DeploymentExecutionState, + ReadEventArgumentExecutionState, + SendDataExecutionState, + StaticCallExecutionState, +} from "../../execution/types/execution-state"; +import { + ReconciliationContext, + ReconciliationFutureResultFailure, +} from "../types"; +import { fail } from "../utils"; + +export function reconcileStrategy( + future: + | NamedArtifactContractDeploymentFuture + | ContractDeploymentFuture + | NamedArtifactLibraryDeploymentFuture + | LibraryDeploymentFuture + | NamedArtifactContractAtFuture + | ContractAtFuture + | ContractCallFuture + | StaticCallFuture + | SendDataFuture + | ReadEventArgumentFuture, + exState: + | DeploymentExecutionState + | CallExecutionState + | StaticCallExecutionState + | ContractAtExecutionState + | SendDataExecutionState + | ReadEventArgumentExecutionState, + context: ReconciliationContext +): ReconciliationFutureResultFailure | undefined { + const storedStrategyName = exState.strategy; + const newStrategyName = context.strategy; + + if (storedStrategyName !== newStrategyName) { + return fail( + future, + `Strategy changed from "${storedStrategyName}" to "${newStrategyName}"` + ); + } + + const storedStrategyConfig = exState.strategyConfig; + const newStrategyConfig = context.strategyConfig; + + const isEqual = require("lodash/isEqual") as typeof import("lodash/isEqual"); + if (!isEqual(storedStrategyConfig, newStrategyConfig)) { + return fail( + future, + `Strategy config changed from ${JSON.stringify( + storedStrategyConfig + )} to ${JSON.stringify(newStrategyConfig)}` + ); + } +} diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index f1d9043095..061f64cb8a 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -32,7 +32,9 @@ export class Reconciler { accounts: string[], deploymentLoader: DeploymentLoader, artifactResolver: ArtifactResolver, - defaultSender: string + defaultSender: string, + strategy: string, + strategyConfig: Record ): Promise { const reconciliationFailures = await this._reconcileEachFutureInModule( module, @@ -43,6 +45,8 @@ export class Reconciler { deploymentLoader, artifactResolver, defaultSender, + strategy, + strategyConfig, }, [ reconcileCurrentAndPreviousTypeMatch, diff --git a/packages/core/src/internal/reconciliation/types.ts b/packages/core/src/internal/reconciliation/types.ts index a7f62bb2c3..317a15f67a 100644 --- a/packages/core/src/internal/reconciliation/types.ts +++ b/packages/core/src/internal/reconciliation/types.ts @@ -35,6 +35,8 @@ export interface ReconciliationContext { artifactResolver: ArtifactResolver; deploymentLoader: DeploymentLoader; defaultSender: string; + strategy: string; + strategyConfig: Record; } export type ReconciliationCheck = ( From 17fba63831ed21aae6e4c53d2bc22fc82a0bb02d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 15 Feb 2024 03:59:38 -0500 Subject: [PATCH 1165/1302] add tests for reconciliation and config --- packages/core/test/batcher.ts | 1 + .../helpers/build-initialize-message-for.ts | 20 ++++- .../helpers/network-interaction-execution.ts | 1 + .../get-nonce-sync-messages.ts | 2 + .../test/execution/reducers/running-a-call.ts | 1 + .../running-a-named-contract-deploy.ts | 1 + .../running-a-named-library-deploy.ts | 1 + .../reducers/running-a-read-event-arg.ts | 1 + .../reducers/running-a-static-call.ts | 1 + .../execution/reducers/running-contract-at.ts | 1 + .../execution/reducers/running-send-data.ts | 1 + .../futures/reconcileArtifactContractAt.ts | 71 +++++++++++++++ .../reconcileArtifactContractDeployment.ts | 57 ++++++++++++ .../reconcileArtifactLibraryDeployment.ts | 61 +++++++++++++ .../futures/reconcileNamedContractAt.ts | 61 +++++++++++++ .../futures/reconcileNamedContractCall.ts | 82 ++++++++++++++++++ .../reconcileNamedContractDeployment.ts | 57 ++++++++++++ .../reconcileNamedLibraryDeployment.ts | 55 ++++++++++++ .../futures/reconcileNamedStaticCall.ts | 82 ++++++++++++++++++ .../futures/reconcileReadEventArgument.ts | 86 +++++++++++++++++++ .../futures/reconcileSendData.ts | 51 +++++++++++ packages/core/test/reconciliation/helpers.ts | 8 +- .../core/test/reconciliation/reconciler.ts | 1 + packages/core/test/wipe.ts | 2 + packages/hardhat-plugin/test/config.ts | 14 ++- .../with-config/hardhat.config.js | 5 ++ .../hardhat-plugin/test/strategies/create2.ts | 24 ++++++ 27 files changed, 742 insertions(+), 6 deletions(-) diff --git a/packages/core/test/batcher.ts b/packages/core/test/batcher.ts index dd86c49c75..8d2c25d753 100644 --- a/packages/core/test/batcher.ts +++ b/packages/core/test/batcher.ts @@ -17,6 +17,7 @@ describe("batcher", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index a5c0a72dec..403807b6f6 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -67,7 +67,7 @@ import { describe("buildInitializeMessageFor", () => { const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; const libraryAddress = "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"; - const basicStrategy = { name: "basic" } as any; + const basicStrategy = { name: "basic", config: {} } as any; let namedContractDeployment: NamedArtifactContractDeploymentFuture; let anotherNamedContractDeployment: NamedArtifactContractDeploymentFuture; @@ -342,6 +342,10 @@ describe("buildInitializeMessageFor", () => { assert.equal(message.strategy, "basic"); }); + it("should record the strategy config", () => { + assert.deepEqual(message.strategyConfig, {}); + }); + it("should copy across the dependencies", async () => { assert.deepStrictEqual(message.dependencies, [ "MyModule:AnotherContract", @@ -392,6 +396,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:ArtifactContract", futureType: FutureType.CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], artifactId: "MyModule:ArtifactContract", constructorArgs: [ @@ -431,6 +436,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedLibrary", futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, dependencies: ["MyModule:SafeMath"], artifactId: "MyModule:NamedLibrary", constructorArgs: [], @@ -463,6 +469,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:ArtifactLibrary", futureType: FutureType.LIBRARY_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, dependencies: ["MyModule:SafeMath"], artifactId: "MyModule:ArtifactLibrary", constructorArgs: [], @@ -565,6 +572,7 @@ describe("buildInitializeMessageFor", () => { type: JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:Call", strategy: "basic", + strategyConfig: {}, dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], artifactId: "MyModule:AnotherContract", contractAddress: differentAddress, @@ -598,6 +606,7 @@ describe("buildInitializeMessageFor", () => { type: JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:StaticCall", strategy: "basic", + strategyConfig: {}, dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], artifactId: "MyModule:AnotherContract", contractAddress: differentAddress, @@ -632,6 +641,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:NamedContractAt", contractAddress: differentAddress, @@ -659,6 +669,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:ArtifactContractAt", futureType: FutureType.CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:ArtifactContractAt", contractAddress: differentAddress, @@ -697,6 +708,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:NamedContractAt", contractAddress: differentAddress, @@ -727,6 +739,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:NamedContractAt", contractAddress: differentAddress, @@ -773,6 +786,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:SecondNamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:SecondNamedContractAt", contractAddress: differentAddress, @@ -818,6 +832,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:NamedContractAt", contractName: "NamedContractAt", @@ -866,6 +881,7 @@ describe("buildInitializeMessageFor", () => { futureId: "MyModule:NamedContractAt", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:NamedContractAt", contractName: "NamedContractAt", @@ -895,6 +911,7 @@ describe("buildInitializeMessageFor", () => { type: JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:ReadEventArg", strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "MyModule:AnotherContract", eventName: "event1", @@ -927,6 +944,7 @@ describe("buildInitializeMessageFor", () => { type: JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE, futureId: "MyModule:SendData", strategy: "basic", + strategyConfig: {}, dependencies: [], to: exampleAccounts[4], data: "fake-data", diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 909869d45b..755773efb6 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -170,6 +170,7 @@ describe("Network interactions", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), artifactId: "./artifact.json", diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts index c7446aa7ed..d9420f5237 100644 --- a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts @@ -40,6 +40,7 @@ describe("execution - getNonceSyncMessages", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -796,6 +797,7 @@ function setupDeploymentStateBasedOnExampleModuleWithOneTranWith( type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], diff --git a/packages/core/test/execution/reducers/running-a-call.ts b/packages/core/test/execution/reducers/running-a-call.ts index cac7e88321..347bb697b1 100644 --- a/packages/core/test/execution/reducers/running-a-call.ts +++ b/packages/core/test/execution/reducers/running-a-call.ts @@ -41,6 +41,7 @@ describe("DeploymentStateReducer", () => { type: JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE, futureId: "Call1", strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "Contract1", contractAddress: exampleAddress, diff --git a/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts b/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts index 3d98ae8c8e..b029e10ebb 100644 --- a/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts +++ b/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts @@ -43,6 +43,7 @@ describe("DeploymentStateReducer", () => { futureId: "future1", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "future1", contractName: "MyContract", diff --git a/packages/core/test/execution/reducers/running-a-named-library-deploy.ts b/packages/core/test/execution/reducers/running-a-named-library-deploy.ts index 4e0bf15d70..fbc8b30550 100644 --- a/packages/core/test/execution/reducers/running-a-named-library-deploy.ts +++ b/packages/core/test/execution/reducers/running-a-named-library-deploy.ts @@ -36,6 +36,7 @@ describe("DeploymentStateReducer", () => { futureId: "future1", futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "future1", contractName: "MyLibrary", diff --git a/packages/core/test/execution/reducers/running-a-read-event-arg.ts b/packages/core/test/execution/reducers/running-a-read-event-arg.ts index b9366517d4..d072562bbb 100644 --- a/packages/core/test/execution/reducers/running-a-read-event-arg.ts +++ b/packages/core/test/execution/reducers/running-a-read-event-arg.ts @@ -26,6 +26,7 @@ describe("DeploymentStateReducer", () => { type: JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE, futureId: "ReadEventArg1", strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "ReadEventArg1", eventName: "event1", diff --git a/packages/core/test/execution/reducers/running-a-static-call.ts b/packages/core/test/execution/reducers/running-a-static-call.ts index fc59bd81df..563ae73278 100644 --- a/packages/core/test/execution/reducers/running-a-static-call.ts +++ b/packages/core/test/execution/reducers/running-a-static-call.ts @@ -34,6 +34,7 @@ describe("DeploymentStateReducer", () => { type: JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE, futureId: "StaticCall1", strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "Contract1", contractAddress: exampleAddress, diff --git a/packages/core/test/execution/reducers/running-contract-at.ts b/packages/core/test/execution/reducers/running-contract-at.ts index 3119fa4833..693dcbbf71 100644 --- a/packages/core/test/execution/reducers/running-contract-at.ts +++ b/packages/core/test/execution/reducers/running-contract-at.ts @@ -29,6 +29,7 @@ describe("DeploymentStateReducer", () => { futureId: "ContractAt1", futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, dependencies: [], artifactId: "ContractAt1", contractName: "ContractAt1", diff --git a/packages/core/test/execution/reducers/running-send-data.ts b/packages/core/test/execution/reducers/running-send-data.ts index 49e7cb1c08..b1639572c1 100644 --- a/packages/core/test/execution/reducers/running-send-data.ts +++ b/packages/core/test/execution/reducers/running-send-data.ts @@ -40,6 +40,7 @@ describe("DeploymentStateReducer", () => { type: JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE, futureId: "SendData1", strategy: "basic", + strategyConfig: {}, dependencies: [], to: exampleAddress, data: "fake-data", diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts index 9f65af581b..02504e5032 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts @@ -28,6 +28,7 @@ describe("Reconciliation - artifact contract at", () => { type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, futureType: FutureType.CONTRACT_AT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), contractName: "Contract1", @@ -40,6 +41,7 @@ describe("Reconciliation - artifact contract at", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), artifactId: "Example", @@ -56,6 +58,7 @@ describe("Reconciliation - artifact contract at", () => { type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, futureType: FutureType.STATIC_CALL, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), contractAddress: exampleAddress, @@ -208,4 +211,72 @@ describe("Reconciliation - artifact contract at", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contractAt( + "Contract1", + mockArtifact, + exampleAddress, + { + id: "Factory", + } + ); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleContractAtState, + id: "Module#Factory", + futureType: FutureType.CONTRACT_AT, + status: ExecutionStatus.STARTED, + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Factory", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contractAt( + "Contract1", + mockArtifact, + exampleAddress, + { + id: "Factory", + } + ); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleContractAtState, + id: "Module#Factory", + futureType: FutureType.CONTRACT_AT, + status: ExecutionStatus.STARTED, + strategyConfig: { + salt: "value", + }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Factory", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts index fa69810688..af5d9e9d73 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -26,6 +26,7 @@ describe("Reconciliation - artifact contract", () => { futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -254,4 +255,60 @@ describe("Reconciliation - artifact contract", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", mockArtifact, [], { + id: "Example", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + futureType: FutureType.CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", mockArtifact, [], { + id: "Example", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + futureType: FutureType.CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + strategyConfig: { salt: "value" }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts index 0244f7e08c..51dcc0a84b 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts @@ -26,6 +26,7 @@ describe("Reconciliation - artifact library", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -186,4 +187,64 @@ describe("Reconciliation - artifact library", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const library1 = m.library("Library1", mockArtifact, { + id: "Example", + }); + + return { contract1: library1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + futureType: FutureType.LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library1", + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const library1 = m.library("Library1", mockArtifact, { + id: "Example", + }); + + return { contract1: library1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + futureType: FutureType.LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library1", + strategyConfig: { + salt: "value", + }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts index 8b717ca65a..47bd207286 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts @@ -27,6 +27,7 @@ describe("Reconciliation - named contract at", () => { type: ExecutionSateType.CONTRACT_AT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), contractName: "Contract1", @@ -39,6 +40,7 @@ describe("Reconciliation - named contract at", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -55,6 +57,7 @@ describe("Reconciliation - named contract at", () => { type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, futureType: FutureType.STATIC_CALL, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -194,4 +197,62 @@ describe("Reconciliation - named contract at", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contractAt("Contract1", exampleAddress, { + id: "Factory", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleContractAtState, + id: "Module#Factory", + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Factory", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contractAt("Contract1", exampleAddress, { + id: "Factory", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleContractAtState, + id: "Module#Factory", + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT, + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + strategyConfig: { salt: "value" }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Factory", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index 88cc138e84..b54cfda657 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -28,6 +28,7 @@ describe("Reconciliation - named contract call", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -44,6 +45,7 @@ describe("Reconciliation - named contract call", () => { type: ExecutionSateType.CALL_EXECUTION_STATE, futureType: FutureType.CONTRACT_CALL, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -330,4 +332,84 @@ describe("Reconciliation - named contract call", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleContractCallState, + id: "Module#config", + futureType: FutureType.CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + strategy: "create2", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleContractCallState, + id: "Module#config", + futureType: FutureType.CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + strategyConfig: { salt: "value" }, + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts index 3ba19a6b04..84ec7ed58d 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -26,6 +26,7 @@ describe("Reconciliation - named contract", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -290,4 +291,60 @@ describe("Reconciliation - named contract", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategyConfig: { salt: "value" }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts index f0cdcdb4c1..32934071ad 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts @@ -26,6 +26,7 @@ describe("Reconciliation - named library", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -181,4 +182,58 @@ describe("Reconciliation - named library", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const library = m.library("Library", { id: "Library" }); + + return { library }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Library", + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library", + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Library", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const library = m.library("Library", { id: "Library" }); + + return { library }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Library", + futureType: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT, + status: ExecutionStatus.STARTED, + contractName: "Library", + strategyConfig: { salt: "value" }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Library", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index e8892a5483..2b3412b7db 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -28,6 +28,7 @@ describe("Reconciliation - named static call", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -44,6 +45,7 @@ describe("Reconciliation - named static call", () => { type: ExecutionSateType.STATIC_CALL_EXECUTION_STATE, futureType: FutureType.STATIC_CALL, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -425,4 +427,84 @@ describe("Reconciliation - named static call", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [], 0, { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleStaticCallState, + id: "Module#config", + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + functionName: "function1", + strategy: "create2", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [], 0, { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleStaticCallState, + id: "Module#config", + status: ExecutionStatus.STARTED, + contractAddress: exampleAddress, + functionName: "function1", + strategyConfig: { salt: "value" }, + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts index ffb6b4b281..5797a0e13e 100644 --- a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts +++ b/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts @@ -27,6 +27,7 @@ describe("Reconciliation - read event argument", () => { type: ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE, futureType: FutureType.READ_EVENT_ARGUMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), artifactId: "./artifact.json", @@ -43,6 +44,7 @@ describe("Reconciliation - read event argument", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -355,4 +357,88 @@ describe("Reconciliation - read event argument", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "event1", "argument1", { + id: "ReadEvent", + }); + + return { contract }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract", + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleReadArgState, + id: "Module#ReadEvent", + status: ExecutionStatus.STARTED, + strategy: "create2", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#ReadEvent", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract = m.contract("Contract"); + + m.readEventArgument(contract, "event1", "argument1", { + id: "ReadEvent", + }); + + return { contract }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract", + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleReadArgState, + id: "Module#ReadEvent", + status: ExecutionStatus.STARTED, + strategyConfig: { salt: "value" }, + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#ReadEvent", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/core/test/reconciliation/futures/reconcileSendData.ts index 4a304a0a94..edbda9fd9c 100644 --- a/packages/core/test/reconciliation/futures/reconcileSendData.ts +++ b/packages/core/test/reconciliation/futures/reconcileSendData.ts @@ -24,6 +24,7 @@ describe("Reconciliation - send data", () => { type: ExecutionSateType.SEND_DATA_EXECUTION_STATE, futureType: FutureType.SEND_DATA, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], @@ -222,4 +223,54 @@ describe("Reconciliation - send data", () => { }, ]); }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + m.send("test_send", exampleAddress, 0n, "example_data"); + + return {}; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleSendState, + id: "Module#test_send", + status: ExecutionStatus.STARTED, + strategy: "create2", + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#test_send", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + m.send("test_send", exampleAddress, 0n, "example_data"); + + return {}; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleSendState, + id: "Module#test_send", + status: ExecutionStatus.STARTED, + strategyConfig: { salt: "value" }, + }) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#test_send", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); }); diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/core/test/reconciliation/helpers.ts index 4b3d91388e..bf57b0b2b1 100644 --- a/packages/core/test/reconciliation/helpers.ts +++ b/packages/core/test/reconciliation/helpers.ts @@ -126,7 +126,9 @@ export async function reconcile( deploymentState: DeploymentState, deploymentLoader: DeploymentLoader = new MockDeploymentLoader(), artifactLoader: ArtifactResolver = new MockArtifactResolver(), - deploymentParameters: DeploymentParameters = {} + deploymentParameters: DeploymentParameters = {}, + strategy: string = "basic", + strategyConfig: Record = {} ): Promise { const reconiliationResult = Reconciler.reconcile( ignitionModule, @@ -135,7 +137,9 @@ export async function reconcile( exampleAccounts, deploymentLoader, artifactLoader, - getDefaultSender(exampleAccounts) + getDefaultSender(exampleAccounts), + strategy, + strategyConfig ); return reconiliationResult; diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 3e0b523b5d..580380962f 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -27,6 +27,7 @@ describe("Reconciliation", () => { type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, strategy: "basic", + strategyConfig: {}, status: ExecutionStatus.STARTED, dependencies: new Set(), networkInteractions: [], diff --git a/packages/core/test/wipe.ts b/packages/core/test/wipe.ts index 85a40343b3..69a369b336 100644 --- a/packages/core/test/wipe.ts +++ b/packages/core/test/wipe.ts @@ -36,6 +36,7 @@ describe("wipe", () => { from: exampleAddress, libraries: {}, strategy: "basic", + strategyConfig: {}, value: 0n, }; @@ -51,6 +52,7 @@ describe("wipe", () => { from: exampleAddress, libraries: {}, strategy: "basic", + strategyConfig: {}, value: 0n, }; diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index 6a6679f863..b5e565c822 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -1,7 +1,8 @@ /* eslint-disable import/no-unused-modules */ -import { DeployConfig, buildModule } from "@nomicfoundation/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { HardhatConfig } from "hardhat/types"; import { KeyListOf } from "./test-helpers/type-helper"; import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; @@ -10,7 +11,7 @@ describe("config", () => { describe("loading", () => { useEphemeralIgnitionProject("with-config"); - let loadedOptions: Partial; + let loadedOptions: Partial; beforeEach(function () { loadedOptions = this.hre.config.ignition; @@ -32,11 +33,18 @@ describe("config", () => { assert.equal(loadedOptions.maxFeeBumps, 2); }); + it("should apply strategyConfig", async function () { + assert.deepStrictEqual(loadedOptions.strategyConfig, { + create2: { salt: "custom-salt" }, + }); + }); + it("should only have known config", () => { - const configOptions: KeyListOf = [ + const configOptions: KeyListOf = [ "blockPollingInterval", "maxFeeBumps", "requiredConfirmations", + "strategyConfig", "timeBeforeBumpingFees", ]; diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index a9b844c9ec..73d80cfc70 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -13,5 +13,10 @@ module.exports = { blockPollingInterval: 100, timeBeforeBumpingFees: 60 * 1000, maxFeeBumps: 2, + strategyConfig: { + create2: { + salt: "custom-salt", + }, + }, }, }; diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 044404ac0c..a26e762c7c 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -14,6 +14,8 @@ describe("create2", function () { "0xA666fE62aA1fD2A7e7C08F81Eba3f55F459A9002"; const EXPECTED_BAR_CREATE2_ADDRESS = "0xF44091a604c7Ed92441Ea695c0f41C522466b4D3"; + const EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS = + "0x50eB50b4b4D5222c3C3B89b9Bb37BD903a359425"; const moduleDefinition = buildModule("FooModule", (m) => { // Use a known bytecode to ensure the same address is generated @@ -98,6 +100,28 @@ describe("create2", function () { /Simulating the transaction failed with error: Reverted with custom error FailedContractCreation/ ); }); + + it("should deploy with a custom salt", async function () { + const deployPromise = this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: "custom-salt", + }, + }); + + await waitForPendingTxs(this.hre, 1, deployPromise); + await mineBlock(this.hre); + + const result = await deployPromise; + + assert.equal( + result.foo.address, + EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS + ); + + assert.equal(this.hre.network.config.chainId, 1); + assert.equal(await result.foo.read.x(), Number(1)); + }); }); describe("no preexisting createX contract", function () { From 872925df30a14cd0af724ce5cfcc56a67d88f14a Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 16 Feb 2024 16:53:36 +0000 Subject: [PATCH 1166/1302] refactor: limit exposing of strategy types We are going to limit the types exposed by the two exported strategies. Our intent to expand release full Strategy support. In the meantime we are limiting the types exposed. A hack has been put in place that exports reduced versions of the BasicStrategy and the Create2Strategy, but then sneakly replaces the implementation with alternate classes. There are simpler hacks, but this one works with API Extractor. --- package-lock.json | 41 ++++++++++++------- package.json | 2 +- packages/core/src/basic-execution-strategy.ts | 25 ++++++++++- .../core/src/create2-execution-strategy.ts | 30 +++++++++++--- packages/core/src/deploy.ts | 5 ++- packages/core/src/index.ts | 2 +- packages/core/src/internal/deployer.ts | 6 +-- .../internal/execution/execution-engine.ts | 8 ++-- .../future-processor/future-processor.ts | 8 ++-- .../helpers/build-initialize-message-for.ts | 8 ++-- .../test/execution/future-processor/utils.ts | 3 +- 11 files changed, 94 insertions(+), 44 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1617ce6926..1a60cfa33b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,7 +8,7 @@ "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", - "@microsoft/api-extractor": "7.38.3", + "@microsoft/api-extractor": "7.40.1", "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", @@ -2957,15 +2957,15 @@ } }, "node_modules/@microsoft/api-extractor": { - "version": "7.38.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.38.3.tgz", - "integrity": "sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw==", + "version": "7.40.1", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.40.1.tgz", + "integrity": "sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==", "dev": true, "dependencies": { - "@microsoft/api-extractor-model": "7.28.2", + "@microsoft/api-extractor-model": "7.28.9", "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.61.0", + "@rushstack/node-core-library": "3.66.0", "@rushstack/rig-package": "0.5.1", "@rushstack/ts-command-line": "4.17.1", "colors": "~1.2.1", @@ -2973,21 +2973,34 @@ "resolve": "~1.22.1", "semver": "~7.5.4", "source-map": "~0.6.1", - "typescript": "~5.0.4" + "typescript": "5.3.3" }, "bin": { "api-extractor": "bin/api-extractor" } }, "node_modules/@microsoft/api-extractor-model": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.2.tgz", - "integrity": "sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==", + "version": "7.28.9", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.9.tgz", + "integrity": "sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==", "dev": true, "dependencies": { "@microsoft/tsdoc": "0.14.2", "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.61.0" + "@rushstack/node-core-library": "3.66.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" } }, "node_modules/@microsoft/tsdoc": { @@ -4037,9 +4050,9 @@ "peer": true }, "node_modules/@rushstack/node-core-library": { - "version": "3.61.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.61.0.tgz", - "integrity": "sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==", + "version": "3.66.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.66.0.tgz", + "integrity": "sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==", "dev": true, "dependencies": { "colors": "~1.2.1", diff --git a/package.json b/package.json index 5243ce538f..28a18c1160 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", - "@microsoft/api-extractor": "7.38.3", + "@microsoft/api-extractor": "7.40.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/debug": "^4.1.7", diff --git a/packages/core/src/basic-execution-strategy.ts b/packages/core/src/basic-execution-strategy.ts index 038bff5efb..e3542d12ff 100644 --- a/packages/core/src/basic-execution-strategy.ts +++ b/packages/core/src/basic-execution-strategy.ts @@ -33,12 +33,25 @@ import { assertIgnitionInvariant } from "./internal/utils/assertions"; * * @beta */ -export class BasicStrategy implements ExecutionStrategy { +export class BasicStrategy { + public readonly name = "basic" as const; + constructor() {} +} + +/** + * The implementation of basic strategy. + */ +class BasicStrategyImplementation + extends BasicStrategy + implements ExecutionStrategy +{ public readonly name = "basic" as const; public readonly config: {} = {}; private _loadArtifact: LoadArtifactFunction | undefined; - constructor() {} + constructor() { + super(); + } public async init(_loadArtifact: LoadArtifactFunction): Promise { this._loadArtifact = _loadArtifact; @@ -210,3 +223,11 @@ export class BasicStrategy implements ExecutionStrategy { }; } } + +// TODO: Remove this hack once we are fully exposing our Strategy API. +// We don't want to export all of the internal types and the API Extractor +// is harsh. So we define a reduced Create2Strategy class and type, but +// override the implementation. The reduced class is exported in a way +// API extractor will accept, while the richer implementation will +// actually be used. +(this as any).BasicStrategy = BasicStrategyImplementation; diff --git a/packages/core/src/create2-execution-strategy.ts b/packages/core/src/create2-execution-strategy.ts index ab28f7fcc0..72f8e6794c 100644 --- a/packages/core/src/create2-execution-strategy.ts +++ b/packages/core/src/create2-execution-strategy.ts @@ -50,16 +50,28 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = * * @beta */ -export class Create2Strategy implements ExecutionStrategy { +export class Create2Strategy { public readonly name = "create2" as const; + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + constructor(provider: EIP1193Provider, config: { salt: string }) {} +} + +/** + * The create2 strategy. + */ +class Create2StrategyImplementation + extends Create2Strategy + implements ExecutionStrategy +{ + public declare readonly config: { salt: string }; private readonly client: EIP1193JsonRpcClient; private _loadArtifact: LoadArtifactFunction | undefined; - constructor( - provider: EIP1193Provider, - public readonly config: { salt: string } - ) { + constructor(provider: EIP1193Provider, config: { salt: string }) { + super(provider, config); this.client = new EIP1193JsonRpcClient(provider); + this.config = config; } public async init(_loadArtifact: LoadArtifactFunction): Promise { @@ -312,3 +324,11 @@ export class Create2Strategy implements ExecutionStrategy { } } } + +// TODO: Remove this hack once we are fully exposing our Strategy API. +// We don't want to export all of the internal types and the API Extractor +// is harsh. So we define a reduced Create2Strategy class and type, but +// override the implementation. The reduced class is exported in a way +// API extractor will accept, while the richer implementation will +// actually be used. +(this as any).Create2Strategy = Create2StrategyImplementation; diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 4c350f5ec9..c9c3844f93 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -9,6 +9,7 @@ import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployme import { DeploymentLoader } from "./internal/deployment-loader/types"; import { ERRORS } from "./internal/errors-list"; import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; +import { ExecutionStrategy } from "./internal/execution/types/execution-strategy"; import { equalAddresses } from "./internal/execution/utils/address"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; import { checkAutominedNetwork } from "./internal/utils/check-automined-network"; @@ -46,7 +47,7 @@ export async function deploy< deploymentParameters, accounts, defaultSender: givenDefaultSender, - strategy: executionStrategy, + strategy, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -63,6 +64,8 @@ export async function deploy< defaultSender?: string; strategy: DeploymentStrategyType; }): Promise { + const executionStrategy: ExecutionStrategy = strategy as ExecutionStrategy; + if (executionEventListener !== undefined) { executionEventListener.setModuleId({ type: ExecutionEventType.SET_MODULE_ID, diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index f1bde0a5bc..8158c9d90a 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,5 +1,5 @@ -export { batches } from "./batches"; export { BasicStrategy } from "./basic-execution-strategy"; +export { batches } from "./batches"; export { buildModule } from "./build-module"; export { Create2Strategy } from "./create2-execution-strategy"; export { deploy } from "./deploy"; diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 0a558dd0e4..1aaa7837ad 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -8,7 +8,6 @@ import { DeploymentParameters, DeploymentResult, DeploymentResultType, - DeploymentStrategyType, ExecutionErrorDeploymentResult, PreviousRunErrorDeploymentResult, ReconciliationErrorDeploymentResult, @@ -35,6 +34,7 @@ import { ExecutionState, ExecutionStatus, } from "./execution/types/execution-state"; +import { ExecutionStrategy } from "./execution/types/execution-strategy"; import { Reconciler } from "./reconciliation/reconciler"; import { assertIgnitionInvariant } from "./utils/assertions"; import { getFuturesFromModule } from "./utils/get-futures-from-module"; @@ -43,14 +43,12 @@ import { findStatus } from "./views/find-status"; /** * Run an Igntition deployment. - * - * @beta */ export class Deployer { constructor( private readonly _config: DeployConfig, private readonly _deploymentDir: string | undefined, - private readonly _executionStrategy: DeploymentStrategyType, + private readonly _executionStrategy: ExecutionStrategy, private readonly _jsonRpcClient: JsonRpcClient, private readonly _artifactResolver: ArtifactResolver, private readonly _deploymentLoader: DeploymentLoader, diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index 30c5cdeccd..d176bdb2e8 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -1,8 +1,5 @@ import { ArtifactResolver } from "../../types/artifact"; -import { - DeploymentParameters, - DeploymentStrategyType, -} from "../../types/deploy"; +import { DeploymentParameters } from "../../types/deploy"; import { ExecutionEventListener, ExecutionEventType, @@ -27,6 +24,7 @@ import { getNonceSyncMessages } from "./nonce-management/get-nonce-sync-messages import { JsonRpcNonceManager } from "./nonce-management/json-rpc-nonce-manager"; import { TransactionTrackingTimer } from "./transaction-tracking-timer"; import { DeploymentState } from "./types/deployment-state"; +import { ExecutionStrategy } from "./types/execution-strategy"; /** * This class is used to execute a module to completion, returning the new @@ -36,7 +34,7 @@ export class ExecutionEngine { constructor( private readonly _deploymentLoader: DeploymentLoader, private readonly _artifactResolver: ArtifactResolver, - private readonly _executionStrategy: DeploymentStrategyType, + private readonly _executionStrategy: ExecutionStrategy, private readonly _jsonRpcClient: JsonRpcClient, private readonly _executionEventListener: | ExecutionEventListener diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index 2a841b3c6c..eb1e4046d8 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -1,8 +1,5 @@ import { ArtifactResolver } from "../../../types/artifact"; -import { - DeploymentParameters, - DeploymentStrategyType, -} from "../../../types/deploy"; +import { DeploymentParameters } from "../../../types/deploy"; import { Future } from "../../../types/module"; import { DeploymentLoader } from "../../deployment-loader/types"; import { assertIgnitionInvariant } from "../../utils/assertions"; @@ -20,6 +17,7 @@ import { SendDataExecutionState, StaticCallExecutionState, } from "../types/execution-state"; +import { ExecutionStrategy } from "../types/execution-strategy"; import { JournalMessage, JournalMessageType } from "../types/messages"; import { monitorOnchainInteraction } from "./handlers/monitor-onchain-interaction"; @@ -42,7 +40,7 @@ export class FutureProcessor { constructor( private readonly _deploymentLoader: DeploymentLoader, private readonly _artifactResolver: ArtifactResolver, - private readonly _executionStrategy: DeploymentStrategyType, + private readonly _executionStrategy: ExecutionStrategy, private readonly _jsonRpcClient: JsonRpcClient, private readonly _transactionTrackingTimer: TransactionTrackingTimer, private readonly _nonceManager: NonceManager, diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index ac1f3c6045..1e0a89d841 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -1,10 +1,8 @@ -import { - DeploymentParameters, - DeploymentStrategyType, -} from "../../../../types/deploy"; +import { DeploymentParameters } from "../../../../types/deploy"; import { Future, FutureType } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; import { DeploymentState } from "../../types/deployment-state"; +import { ExecutionStrategy } from "../../types/execution-strategy"; import { CallExecutionStateInitializeMessage, ContractAtExecutionStateInitializeMessage, @@ -30,7 +28,7 @@ import { export async function buildInitializeMessageFor( future: Future, deploymentState: DeploymentState, - strategy: DeploymentStrategyType, + strategy: ExecutionStrategy, deploymentParameters: DeploymentParameters, deploymentLoader: DeploymentLoader, accounts: string[], diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index 6503445024..d29b2cb587 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -9,6 +9,7 @@ import { } from "../../../src/internal/execution/jsonrpc-client"; import { NonceManager } from "../../../src/internal/execution/nonce-management/json-rpc-nonce-manager"; import { TransactionTrackingTimer } from "../../../src/internal/execution/transaction-tracking-timer"; +import { ExecutionStrategy } from "../../../src/internal/execution/types/execution-strategy"; import { NetworkFees, RawStaticCallResult, @@ -40,7 +41,7 @@ export async function setupFutureProcessor( const mockArtifactResolver = setupMockArtifactResolver(); - const basicExecutionStrategy = new BasicStrategy(); + const basicExecutionStrategy = new BasicStrategy() as ExecutionStrategy; await basicExecutionStrategy.init(mockDeploymentLoader.loadArtifact); const mockJsonRpcClient = setupMockJsonRpcClient( From e5c2a8c005e82d3773040307b05c927291f15a96 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 15:37:21 +0000 Subject: [PATCH 1167/1302] refactor: improve doc strings against strategies --- packages/core/src/basic-execution-strategy.ts | 13 ++++--- .../core/src/create2-execution-strategy.ts | 35 +++++++++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/packages/core/src/basic-execution-strategy.ts b/packages/core/src/basic-execution-strategy.ts index e3542d12ff..0c1238947e 100644 --- a/packages/core/src/basic-execution-strategy.ts +++ b/packages/core/src/basic-execution-strategy.ts @@ -27,9 +27,9 @@ import { NetworkInteractionType } from "./internal/execution/types/network-inter import { assertIgnitionInvariant } from "./internal/utils/assertions"; /** - * The most basic execution strategy, which sends a single transaction - * for each deployment, call, and send data, and a single static call - * per static call execution. + * The basic execution strategy, which sends a single transaction + * for each contract deployment, call, and send data, and a single static call + * for each static call execution. * * @beta */ @@ -39,7 +39,12 @@ export class BasicStrategy { } /** - * The implementation of basic strategy. + * The Basic strategy. + * + * The BasicStrategyImplementation is internal. It will be properly exposed + * in the Core API with the full Strategy API. + * + * @private */ class BasicStrategyImplementation extends BasicStrategy diff --git a/packages/core/src/create2-execution-strategy.ts b/packages/core/src/create2-execution-strategy.ts index 72f8e6794c..1dd264efb7 100644 --- a/packages/core/src/create2-execution-strategy.ts +++ b/packages/core/src/create2-execution-strategy.ts @@ -44,9 +44,33 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = "0xeD456e05CaAb11d66C4c797dD6c1D6f9A7F352b5"; /** - * The most basic execution strategy, which sends a single transaction - * for each deployment, call, and send data, and a single static call - * per static call execution. + * The create2 strategy extends the basic strategy, for deployment it replaces + * a deployment transaction with a call to the CreateX factory contract + * with a user provided salt. + * + * If deploying to the local Hardhat node, the CreateX factory will be + * deployed if it does not exist. If the CreateX factory is not currently + * available on the remote network, an error will be thrown halting the + * deployment. + * + * Futures that perform calls or send data remain single transactions, and + * static calls remain a single static call. + * + * The strategy requires a salt is provided in the Hardhat config. The same + * salt will be used for all calls to CreateX. + * + * @example + * { + * ..., + * ignition: { + * strategyConfig: { + * create2: { + * salt: "my-salt" + * } + * } + * }, + * ... + * } * * @beta */ @@ -59,6 +83,11 @@ export class Create2Strategy { /** * The create2 strategy. + * + * The Create2StrategyImplementation is internal. It will be properly exposed + * in the Core API with the full Strategy API. + * + * @private */ class Create2StrategyImplementation extends Create2Strategy From ba117ae7b9f71ec6b20cbc52e47473940e494a48 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 15:46:28 +0000 Subject: [PATCH 1168/1302] refactor: move strategies under their own folder --- packages/core/src/index.ts | 4 ++-- .../basic-execution-strategy.ts | 12 +++++------ .../create2-execution-strategy.ts | 20 +++++++++---------- packages/core/src/types/deploy.ts | 4 ++-- .../test/execution/future-processor/utils.ts | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) rename packages/core/src/{ => strategies}/basic-execution-strategy.ts (93%) rename packages/core/src/{ => strategies}/create2-execution-strategy.ts (93%) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 8158c9d90a..b65b689bb9 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,12 +1,12 @@ -export { BasicStrategy } from "./basic-execution-strategy"; export { batches } from "./batches"; export { buildModule } from "./build-module"; -export { Create2Strategy } from "./create2-execution-strategy"; export { deploy } from "./deploy"; export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export { status } from "./status"; +export { BasicStrategy } from "./strategies/basic-execution-strategy"; +export { Create2Strategy } from "./strategies/create2-execution-strategy"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; diff --git a/packages/core/src/basic-execution-strategy.ts b/packages/core/src/strategies/basic-execution-strategy.ts similarity index 93% rename from packages/core/src/basic-execution-strategy.ts rename to packages/core/src/strategies/basic-execution-strategy.ts index 0c1238947e..c22bf99dd2 100644 --- a/packages/core/src/basic-execution-strategy.ts +++ b/packages/core/src/strategies/basic-execution-strategy.ts @@ -6,14 +6,14 @@ import { executeOnchainInteractionRequest, executeStaticCallRequest, getStaticCallExecutionStateResultValue, -} from "./internal/execution/execution-strategy-helpers"; -import { ExecutionResultType } from "./internal/execution/types/execution-result"; +} from "../internal/execution/execution-strategy-helpers"; +import { ExecutionResultType } from "../internal/execution/types/execution-result"; import { CallExecutionState, DeploymentExecutionState, SendDataExecutionState, StaticCallExecutionState, -} from "./internal/execution/types/execution-state"; +} from "../internal/execution/types/execution-state"; import { CallStrategyGenerator, DeploymentStrategyGenerator, @@ -22,9 +22,9 @@ import { OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, -} from "./internal/execution/types/execution-strategy"; -import { NetworkInteractionType } from "./internal/execution/types/network-interaction"; -import { assertIgnitionInvariant } from "./internal/utils/assertions"; +} from "../internal/execution/types/execution-strategy"; +import { NetworkInteractionType } from "../internal/execution/types/network-interaction"; +import { assertIgnitionInvariant } from "../internal/utils/assertions"; /** * The basic execution strategy, which sends a single transaction diff --git a/packages/core/src/create2-execution-strategy.ts b/packages/core/src/strategies/create2-execution-strategy.ts similarity index 93% rename from packages/core/src/create2-execution-strategy.ts rename to packages/core/src/strategies/create2-execution-strategy.ts index 1dd264efb7..4440ad74f1 100644 --- a/packages/core/src/create2-execution-strategy.ts +++ b/packages/core/src/strategies/create2-execution-strategy.ts @@ -1,6 +1,6 @@ import { ethers } from "ethers"; -import { NomicIgnitionPluginError } from "./errors"; +import { NomicIgnitionPluginError } from "../errors"; import { decodeArtifactCustomError, decodeArtifactFunctionCallResult, @@ -10,19 +10,19 @@ import { executeStaticCallRequest, getEventArgumentFromReceipt, getStaticCallExecutionStateResultValue, -} from "./internal/execution/execution-strategy-helpers"; -import { EIP1193JsonRpcClient } from "./internal/execution/jsonrpc-client"; +} from "../internal/execution/execution-strategy-helpers"; +import { EIP1193JsonRpcClient } from "../internal/execution/jsonrpc-client"; import { createxArtifact, presignedTx, -} from "./internal/execution/strategy/createx-artifact"; -import { ExecutionResultType } from "./internal/execution/types/execution-result"; +} from "../internal/execution/strategy/createx-artifact"; +import { ExecutionResultType } from "../internal/execution/types/execution-result"; import { CallExecutionState, DeploymentExecutionState, SendDataExecutionState, StaticCallExecutionState, -} from "./internal/execution/types/execution-state"; +} from "../internal/execution/types/execution-state"; import { CallStrategyGenerator, DeploymentStrategyGenerator, @@ -31,10 +31,10 @@ import { OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, -} from "./internal/execution/types/execution-strategy"; -import { NetworkInteractionType } from "./internal/execution/types/network-interaction"; -import { assertIgnitionInvariant } from "./internal/utils/assertions"; -import { EIP1193Provider } from "./types/provider"; +} from "../internal/execution/types/execution-strategy"; +import { NetworkInteractionType } from "../internal/execution/types/network-interaction"; +import { assertIgnitionInvariant } from "../internal/utils/assertions"; +import { EIP1193Provider } from "../types/provider"; // v0.1.0 const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 76f8b48329..75c1c6c3f3 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -1,5 +1,5 @@ -import { BasicStrategy } from "../basic-execution-strategy"; -import { Create2Strategy } from "../create2-execution-strategy"; +import { BasicStrategy } from "../strategies/basic-execution-strategy"; +import { Create2Strategy } from "../strategies/create2-execution-strategy"; import { ModuleParameters } from "./module"; diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index d29b2cb587..6f269abb1c 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -1,4 +1,3 @@ -import { BasicStrategy } from "../../../src/basic-execution-strategy"; import { FutureProcessor } from "../../../src/internal/execution/future-processor/future-processor"; import { Block, @@ -19,6 +18,7 @@ import { import { getDefaultSender } from "../../../src/internal/execution/utils/get-default-sender"; import { MemoryJournal } from "../../../src/internal/journal/memory-journal"; import { assertIgnitionInvariant } from "../../../src/internal/utils/assertions"; +import { BasicStrategy } from "../../../src/strategies/basic-execution-strategy"; import { exampleAccounts, setupMockArtifactResolver, From fa245ca80754064aaf446bf916dadbc4f1d68a9a Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 15:53:26 +0000 Subject: [PATCH 1169/1302] refactor: rename the strategy files to match classes --- packages/core/src/index.ts | 4 ++-- .../{basic-execution-strategy.ts => basic-strategy.ts} | 0 .../{create2-execution-strategy.ts => create2-strategy.ts} | 0 packages/core/src/types/deploy.ts | 4 ++-- packages/core/test/execution/future-processor/utils.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename packages/core/src/strategies/{basic-execution-strategy.ts => basic-strategy.ts} (100%) rename packages/core/src/strategies/{create2-execution-strategy.ts => create2-strategy.ts} (100%) diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index b65b689bb9..57a2795ced 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,8 +5,8 @@ export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export { status } from "./status"; -export { BasicStrategy } from "./strategies/basic-execution-strategy"; -export { Create2Strategy } from "./strategies/create2-execution-strategy"; +export { BasicStrategy } from "./strategies/basic-strategy"; +export { Create2Strategy } from "./strategies/create2-strategy"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; diff --git a/packages/core/src/strategies/basic-execution-strategy.ts b/packages/core/src/strategies/basic-strategy.ts similarity index 100% rename from packages/core/src/strategies/basic-execution-strategy.ts rename to packages/core/src/strategies/basic-strategy.ts diff --git a/packages/core/src/strategies/create2-execution-strategy.ts b/packages/core/src/strategies/create2-strategy.ts similarity index 100% rename from packages/core/src/strategies/create2-execution-strategy.ts rename to packages/core/src/strategies/create2-strategy.ts diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 75c1c6c3f3..d04789f3bc 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -1,5 +1,5 @@ -import { BasicStrategy } from "../strategies/basic-execution-strategy"; -import { Create2Strategy } from "../strategies/create2-execution-strategy"; +import { BasicStrategy } from "../strategies/basic-strategy"; +import { Create2Strategy } from "../strategies/create2-strategy"; import { ModuleParameters } from "./module"; diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index 6f269abb1c..b1dc30c6c4 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -18,7 +18,7 @@ import { import { getDefaultSender } from "../../../src/internal/execution/utils/get-default-sender"; import { MemoryJournal } from "../../../src/internal/journal/memory-journal"; import { assertIgnitionInvariant } from "../../../src/internal/utils/assertions"; -import { BasicStrategy } from "../../../src/strategies/basic-execution-strategy"; +import { BasicStrategy } from "../../../src/strategies/basic-strategy"; import { exampleAccounts, setupMockArtifactResolver, From c2f2bb1449feca3d369851b9e7a369ea7cfd63d9 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 16:49:46 +0000 Subject: [PATCH 1170/1302] refactor: limit strategy constructors to only config We should assume that strategies are being newed up programmatically in scripts. Hence the constructor should be simple - only the config. We will inject other key services via init. --- packages/core/src/deploy.ts | 4 +- .../execution/types/execution-strategy.ts | 7 ++- .../core/src/strategies/basic-strategy.ts | 43 ++++++++----- .../core/src/strategies/create2-strategy.ts | 63 +++++++++++-------- .../test/execution/future-processor/utils.ts | 6 +- .../src/utils/resolveStrategy.ts | 2 +- 6 files changed, 75 insertions(+), 50 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index c9c3844f93..b6ff269031 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -105,9 +105,7 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider); - await executionStrategy.init((artifactId) => - deploymentLoader.loadArtifact(artifactId) - ); + await executionStrategy.init(deploymentLoader, jsonRpcClient); const isAutominedNetwork = await checkAutominedNetwork(provider); diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index a4429f748d..6809d844a4 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -1,4 +1,6 @@ import { Artifact } from "../../../types/artifact"; +import { DeploymentLoader } from "../../deployment-loader/types"; +import { JsonRpcClient } from "../jsonrpc-client"; import { CallExecutionResult, @@ -221,7 +223,10 @@ export interface ExecutionStrategy { */ config: {}; - init: (_loadArtifact: LoadArtifactFunction) => Promise; + init: ( + deploymentLoader: DeploymentLoader, + jsonRpcClient: JsonRpcClient + ) => Promise; /** * Executes a deployment execution state. diff --git a/packages/core/src/strategies/basic-strategy.ts b/packages/core/src/strategies/basic-strategy.ts index c22bf99dd2..b833f3dd8d 100644 --- a/packages/core/src/strategies/basic-strategy.ts +++ b/packages/core/src/strategies/basic-strategy.ts @@ -1,3 +1,4 @@ +import { DeploymentLoader } from "../internal/deployment-loader/types"; import { decodeArtifactCustomError, decodeArtifactFunctionCallResult, @@ -7,6 +8,7 @@ import { executeStaticCallRequest, getStaticCallExecutionStateResultValue, } from "../internal/execution/execution-strategy-helpers"; +import { JsonRpcClient } from "../internal/execution/jsonrpc-client"; import { ExecutionResultType } from "../internal/execution/types/execution-result"; import { CallExecutionState, @@ -18,7 +20,6 @@ import { CallStrategyGenerator, DeploymentStrategyGenerator, ExecutionStrategy, - LoadArtifactFunction, OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, @@ -35,7 +36,11 @@ import { assertIgnitionInvariant } from "../internal/utils/assertions"; */ export class BasicStrategy { public readonly name = "basic" as const; - constructor() {} + public readonly config: Record; + + constructor() { + this.config = {}; + } } /** @@ -51,26 +56,30 @@ class BasicStrategyImplementation implements ExecutionStrategy { public readonly name = "basic" as const; - public readonly config: {} = {}; - private _loadArtifact: LoadArtifactFunction | undefined; + private _deploymentLoader: DeploymentLoader | undefined; constructor() { super(); } - public async init(_loadArtifact: LoadArtifactFunction): Promise { - this._loadArtifact = _loadArtifact; + public async init( + deploymentLoader: DeploymentLoader, + _jsonRpcClient: JsonRpcClient + ): Promise { + this._deploymentLoader = deploymentLoader; } public async *executeDeployment( executionState: DeploymentExecutionState ): DeploymentStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined, + "Strategy not initialized" ); - const artifact = await this._loadArtifact(executionState.artifactId); + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId + ); const transactionOrResult = yield* executeOnchainInteractionRequest( executionState.id, @@ -116,11 +125,13 @@ class BasicStrategyImplementation executionState: CallExecutionState ): CallStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined, + "Strategy not initialized" ); - const artifact = await this._loadArtifact(executionState.artifactId); + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId + ); const transactionOrResult = yield* executeOnchainInteractionRequest( executionState.id, @@ -187,11 +198,13 @@ class BasicStrategyImplementation executionState: StaticCallExecutionState ): StaticCallStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined, + "Strategy not initialized" ); - const artifact = await this._loadArtifact(executionState.artifactId); + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId + ); const decodedResultOrError = yield* executeStaticCallRequest( { diff --git a/packages/core/src/strategies/create2-strategy.ts b/packages/core/src/strategies/create2-strategy.ts index 4440ad74f1..9e5db8204f 100644 --- a/packages/core/src/strategies/create2-strategy.ts +++ b/packages/core/src/strategies/create2-strategy.ts @@ -1,6 +1,7 @@ import { ethers } from "ethers"; import { NomicIgnitionPluginError } from "../errors"; +import { DeploymentLoader } from "../internal/deployment-loader/types"; import { decodeArtifactCustomError, decodeArtifactFunctionCallResult, @@ -11,7 +12,7 @@ import { getEventArgumentFromReceipt, getStaticCallExecutionStateResultValue, } from "../internal/execution/execution-strategy-helpers"; -import { EIP1193JsonRpcClient } from "../internal/execution/jsonrpc-client"; +import { JsonRpcClient } from "../internal/execution/jsonrpc-client"; import { createxArtifact, presignedTx, @@ -27,14 +28,12 @@ import { CallStrategyGenerator, DeploymentStrategyGenerator, ExecutionStrategy, - LoadArtifactFunction, OnchainInteractionResponseType, SendDataStrategyGenerator, StaticCallStrategyGenerator, } from "../internal/execution/types/execution-strategy"; import { NetworkInteractionType } from "../internal/execution/types/network-interaction"; import { assertIgnitionInvariant } from "../internal/utils/assertions"; -import { EIP1193Provider } from "../types/provider"; // v0.1.0 const CREATE_X_ADDRESS = "0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed"; @@ -76,9 +75,11 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = */ export class Create2Strategy { public readonly name = "create2" as const; + public readonly config: { salt: string }; - // eslint-disable-next-line @typescript-eslint/no-unused-vars - constructor(provider: EIP1193Provider, config: { salt: string }) {} + constructor(config: { salt: string }) { + this.config = config; + } } /** @@ -93,21 +94,22 @@ class Create2StrategyImplementation extends Create2Strategy implements ExecutionStrategy { - public declare readonly config: { salt: string }; - private readonly client: EIP1193JsonRpcClient; - private _loadArtifact: LoadArtifactFunction | undefined; + private _deploymentLoader: DeploymentLoader | undefined; + private _jsonRpcClient: JsonRpcClient | undefined; - constructor(provider: EIP1193Provider, config: { salt: string }) { - super(provider, config); - this.client = new EIP1193JsonRpcClient(provider); - this.config = config; + constructor(config: { salt: string }) { + super(config); } - public async init(_loadArtifact: LoadArtifactFunction): Promise { - this._loadArtifact = _loadArtifact; + public async init( + deploymentLoader: DeploymentLoader, + jsonRpcClient: JsonRpcClient + ): Promise { + this._deploymentLoader = deploymentLoader; + this._jsonRpcClient = jsonRpcClient; // Check if CreateX is deployed on the current network - const result = await this.client.getCode(CREATE_X_ADDRESS); + const result = await this._jsonRpcClient.getCode(CREATE_X_ADDRESS); // If CreateX factory is deployed (and bytecode matches) then nothing to do if (result !== "0x") { @@ -119,7 +121,7 @@ class Create2StrategyImplementation return; } - const chainId = await this.client.getChainId(); + const chainId = await this._jsonRpcClient.getChainId(); // Otherwise if we're not on a local hardhat node, throw an error if (chainId !== 31337) { @@ -130,18 +132,21 @@ class Create2StrategyImplementation } // On a local hardhat node, deploy the CreateX factory - await this._deployCreateXFactory(this.client); + await this._deployCreateXFactory(this._jsonRpcClient); } public async *executeDeployment( executionState: DeploymentExecutionState ): DeploymentStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, + "Strategy not initialized" + ); + + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId ); - const artifact = await this._loadArtifact(executionState.artifactId); const salt = ethers.id(this.config.salt); const bytecodeToDeploy = encodeArtifactDeploymentData( @@ -204,11 +209,13 @@ class Create2StrategyImplementation executionState: CallExecutionState ): CallStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, + "Strategy not initialized" ); - const artifact = await this._loadArtifact(executionState.artifactId); + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId + ); const transactionOrResult = yield* executeOnchainInteractionRequest( executionState.id, @@ -275,11 +282,13 @@ class Create2StrategyImplementation executionState: StaticCallExecutionState ): StaticCallStrategyGenerator { assertIgnitionInvariant( - this._loadArtifact !== undefined, - "loadArtifact not initialized" + this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, + "Strategy not initialized" ); - const artifact = await this._loadArtifact(executionState.artifactId); + const artifact = await this._deploymentLoader.loadArtifact( + executionState.artifactId + ); const decodedResultOrError = yield* executeStaticCallRequest( { @@ -320,7 +329,7 @@ class Create2StrategyImplementation * Within the context of a local development Hardhat chain, deploy * the CreateX factory contract using a presigned transaction. */ - private async _deployCreateXFactory(client: EIP1193JsonRpcClient) { + private async _deployCreateXFactory(client: JsonRpcClient) { // The account that will deploy the CreateX factory needs to be funded // first await client.setBalance( diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index b1dc30c6c4..bdc8430754 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -41,14 +41,14 @@ export async function setupFutureProcessor( const mockArtifactResolver = setupMockArtifactResolver(); - const basicExecutionStrategy = new BasicStrategy() as ExecutionStrategy; - await basicExecutionStrategy.init(mockDeploymentLoader.loadArtifact); - const mockJsonRpcClient = setupMockJsonRpcClient( sendTransaction, transactions ); + const basicExecutionStrategy = new BasicStrategy() as ExecutionStrategy; + await basicExecutionStrategy.init(mockDeploymentLoader, mockJsonRpcClient); + const transactionTrackingTimer = new TransactionTrackingTimer(); const mockNonceManager = setupMockNonceManager(); diff --git a/packages/hardhat-plugin/src/utils/resolveStrategy.ts b/packages/hardhat-plugin/src/utils/resolveStrategy.ts index 4574d0ca3c..3118673773 100644 --- a/packages/hardhat-plugin/src/utils/resolveStrategy.ts +++ b/packages/hardhat-plugin/src/utils/resolveStrategy.ts @@ -25,7 +25,7 @@ export function resolveStrategy( : hre.config.ignition.strategyConfig?.create2?.salt ?? "default-ignition-salt"; - return new Create2Strategy(hre.network.provider, { salt }); + return new Create2Strategy({ salt }); default: throw new NomicLabsHardhatPluginError( "hardhat-ignition", From 185aa7e3f0fca3e1edb15393c2248a9112f8e8dc Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 21:23:39 +0000 Subject: [PATCH 1171/1302] feat: throw if salt is not provided in config If the user does not provide a salt we throw. We do not want the unexpected behaviour of a fallback default value. --- packages/core/src/types/deploy.ts | 2 +- .../src/utils/resolveStrategy.ts | 18 ++++--- .../create2-bad-config/contracts/Foo.sol | 7 +++ .../create2-bad-config/hardhat.config.js | 15 ++++++ .../ignition/modules/MyModule.js | 8 ++++ .../hardhat-plugin/test/strategies/create2.ts | 47 +++++++++++++++++-- .../generic-strategy-constraints.ts | 18 ++++++- .../strategies/only-built-in-strategies.ts | 20 ++++++++ 8 files changed, 123 insertions(+), 12 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js create mode 100644 packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index d04789f3bc..3fcc3b585a 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -225,7 +225,7 @@ export type DeploymentStrategyType = Create2Strategy | BasicStrategy; * @beta */ export interface StrategyConfig { - basic: {}; + basic: Record; create2: { salt: string; }; diff --git a/packages/hardhat-plugin/src/utils/resolveStrategy.ts b/packages/hardhat-plugin/src/utils/resolveStrategy.ts index 3118673773..3bd326c282 100644 --- a/packages/hardhat-plugin/src/utils/resolveStrategy.ts +++ b/packages/hardhat-plugin/src/utils/resolveStrategy.ts @@ -19,13 +19,19 @@ export function resolveStrategy( case "basic": return new BasicStrategy(); case "create2": - const salt = - "salt" in strategyConfigOverride - ? strategyConfigOverride.salt - : hre.config.ignition.strategyConfig?.create2?.salt ?? - "default-ignition-salt"; + const create2Config = { + ...hre.config.ignition.strategyConfig?.create2, + ...strategyConfigOverride, + }; - return new Create2Strategy({ salt }); + if (typeof create2Config.salt !== "string") { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "The create2 strategy requires a salt to be set under 'ignition.strategyConfig.create2.salt' in the Hardhat config" + ); + } + + return new Create2Strategy({ salt: create2Config.salt }); default: throw new NomicLabsHardhatPluginError( "hardhat-ignition", diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol new file mode 100644 index 0000000000..33c8ffdf30 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; +} diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js new file mode 100644 index 0000000000..bb4b83c260 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js @@ -0,0 +1,15 @@ +require("../../../src/index"); + +/** + * @type import('hardhat/config').HardhatUserConfig + */ +module.exports = { + solidity: "0.8.19", + ignition: { + strategyConfig: { + create2: { + salt: undefined, // Missing salt + }, + }, + }, +}; diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js new file mode 100644 index 0000000000..11dd2c6589 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("MyModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index a26e762c7c..66eab069d8 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -6,14 +6,17 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { presignedTx } from "../test-helpers/createX-tx"; import { externallyLoadedContractArtifact } from "../test-helpers/externally-loaded-contract"; import { mineBlock } from "../test-helpers/mine-block"; -import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; +import { + useEphemeralIgnitionProject, + useFileIgnitionProject, +} from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; describe("create2", function () { const EXPECTED_FOO_CREATE2_ADDRESS = - "0xA666fE62aA1fD2A7e7C08F81Eba3f55F459A9002"; + "0x82841cfc6e85e9A9FBED28FC4A236eb58D56E5b6"; const EXPECTED_BAR_CREATE2_ADDRESS = - "0xF44091a604c7Ed92441Ea695c0f41C522466b4D3"; + "0x2aCB60e63b99511B0B598e1498825c716b19769C"; const EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS = "0x50eB50b4b4D5222c3C3B89b9Bb37BD903a359425"; @@ -42,6 +45,9 @@ describe("create2", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", defaultSender: accountAddress, + strategyConfig: { + salt: "test-salt", + }, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -67,6 +73,9 @@ describe("create2", function () { }), { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, } ); @@ -95,6 +104,9 @@ describe("create2", function () { }), { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, } ), /Simulating the transaction failed with error: Reverted with custom error FailedContractCreation/ @@ -132,6 +144,9 @@ describe("create2", function () { await assert.isRejected( this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, }), /CreateX not deployed on current network 88888/ ); @@ -145,6 +160,9 @@ describe("create2", function () { it("should deploy a createX factory then use it to deploy the given contract", async function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -162,6 +180,9 @@ describe("create2", function () { // Run create2 once deploying the factory const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, }); await waitForPendingTxs(this.hre, 1, firstDeployPromise); @@ -178,6 +199,9 @@ describe("create2", function () { }), { strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, } ); @@ -193,6 +217,23 @@ describe("create2", function () { assert(await secondDeployResult.bar.read.isBar()); }); }); + + describe("config", function () { + useFileIgnitionProject("create2-bad-config", "attempt-bad-config"); + + it("should throw if a non-recognized strategy is specified", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/MyModule.js", + strategy: "create2", + } + ), + /The create2 strategy requires a salt to be set under 'ignition.strategyConfig.create2.salt' in the Hardhat config/ + ); + }); + }); }); async function deployCreateXFactory(hre: HardhatRuntimeEnvironment) { diff --git a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts index 824ade79dc..02954d1c30 100644 --- a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts +++ b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts @@ -1,11 +1,18 @@ -import { StrategyConfig, buildModule } from "@nomicfoundation/ignition-core"; +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { mineBlock } from "../test-helpers/mine-block"; import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; -const strategies: Array = ["basic", "create2"]; +const strategies = ["basic", "create2"] as const; + +const exampleConfig = { + basic: {}, + create2: { + salt: "test-salt", + }, +} as const; describe("strategies - generic constraints", function () { strategies.forEach((strategy) => { @@ -21,6 +28,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -43,6 +51,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 2, deployPromise); @@ -68,6 +77,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -104,6 +114,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -150,6 +161,7 @@ describe("strategies - generic constraints", function () { contractAtDefinition, { strategy, + strategyConfig: exampleConfig[strategy], } ); @@ -175,6 +187,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 1, deployPromise); @@ -207,6 +220,7 @@ describe("strategies - generic constraints", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy, + strategyConfig: exampleConfig[strategy], }); await waitForPendingTxs(this.hre, 1, deployPromise); diff --git a/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts b/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts new file mode 100644 index 0000000000..0c0ce70461 --- /dev/null +++ b/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts @@ -0,0 +1,20 @@ +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("strategies - only built in strategies", function () { + useEphemeralIgnitionProject("minimal"); + + it("should throw if a non-recognized strategy is specified", async function () { + await assert.isRejected( + this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/MyModule.js", + strategy: "non-recognized-strategy", + } + ), + /Invalid strategy name, must be either 'basic' or 'create2'/ + ); + }); +}); From 728bb0f872bd273869531fca0bd7567766d0f1e4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 21:44:31 +0000 Subject: [PATCH 1172/1302] refactor: push execution strategy init down We want the strategy to initialize only if execution is about to commence, so after all pre-execution validations and checks. --- packages/core/src/deploy.ts | 2 -- packages/core/src/internal/execution/execution-engine.ts | 5 +++++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index b6ff269031..9b3b97c91f 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -105,8 +105,6 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider); - await executionStrategy.init(deploymentLoader, jsonRpcClient); - const isAutominedNetwork = await checkAutominedNetwork(provider); const resolvedConfig: DeployConfig = { diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index d176bdb2e8..29aeb677b9 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -74,6 +74,11 @@ export class ExecutionEngine { defaultSender ); + await this._executionStrategy.init( + this._deploymentLoader, + this._jsonRpcClient + ); + const transactionTrackingTimer = new TransactionTrackingTimer(); const nonceManager = new JsonRpcNonceManager( From 00f98f94bda06889cf8b0a035643b92c93b190e7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 22:25:10 +0000 Subject: [PATCH 1173/1302] refactor: tighten interal config types These can likely be cleaner, but they are internal and will need to change for the Strategy API in the future anyway. --- .../future-processor/helpers/build-initialize-message-for.ts | 4 ++-- .../core/src/internal/execution/types/execution-strategy.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 1e0a89d841..600034a8df 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -235,13 +235,13 @@ function _extendBaseInitWith< messageType: MessageT, future: FutureT, strategy: string, - strategyConfig: Record, + strategyConfig: Record, extension: ExtensionT ): { type: MessageT; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: Record; dependencies: string[]; } & ExtensionT { return { diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/core/src/internal/execution/types/execution-strategy.ts index 6809d844a4..9fa560088a 100644 --- a/packages/core/src/internal/execution/types/execution-strategy.ts +++ b/packages/core/src/internal/execution/types/execution-strategy.ts @@ -221,7 +221,7 @@ export interface ExecutionStrategy { /** * The configuration options for the strategy. */ - config: {}; + config: Record | Record; init: ( deploymentLoader: DeploymentLoader, From fb9ce49ebf8743a910097c89d31cf1aac9d2a680 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 22:40:53 +0000 Subject: [PATCH 1174/1302] test: correct wrong test name --- .../create2-bad-config/ignition/modules/MyModule.js | 1 - .../user-modules/ignition/modules/TestModule.js | 1 - .../fixture-projects/with-config/ignition/modules/MyModule.js | 1 - .../with-invalid-config/ignition/modules/MyModule.js | 1 - packages/hardhat-plugin/test/strategies/create2.ts | 2 +- 5 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js index 11dd2c6589..88f3faf68d 100644 --- a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-unused-modules const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js index 9403fd43db..5e46fcd608 100644 --- a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-unused-modules module.exports = { id: "testing123", moduleDefintionFunction: () => {}, diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js index 9f13f90ace..49cddf0034 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-unused-modules const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js b/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js index 9f13f90ace..49cddf0034 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-unused-modules const { buildModule } = require("@nomicfoundation/ignition-core"); module.exports = buildModule("MyModule", (m) => { diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 66eab069d8..3fc7591789 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -221,7 +221,7 @@ describe("create2", function () { describe("config", function () { useFileIgnitionProject("create2-bad-config", "attempt-bad-config"); - it("should throw if a non-recognized strategy is specified", async function () { + it("should throw if salt is not defined in Hardhat config", async function () { await assert.isRejected( this.hre.run( { scope: "ignition", task: "deploy" }, From 41d0b32cbbfc9f0ff4f375e770231e8540a015ae Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 22:46:20 +0000 Subject: [PATCH 1175/1302] refactor: narrow execution state Number and string cover our current use case so lets narrow and expand later when the Strategy API lands. --- packages/core/src/internal/execution/types/execution-state.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 0f70a74483..941044ab21 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -55,7 +55,7 @@ interface BaseExecutionState< type: ExecutionStateT; futureType: FutureTypeT; strategy: string; // For example, "basic" | "create2". This needs to be string if we want custom ones. - strategyConfig: Record; + strategyConfig: Record; status: ExecutionStatus; dependencies: Set; } From 193e3d31f27da1b68595e4ba89474b245ea383cf Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 22:57:57 +0000 Subject: [PATCH 1176/1302] refactor: narrow strategy config type in reconciliation --- packages/core/src/internal/reconciliation/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/internal/reconciliation/types.ts b/packages/core/src/internal/reconciliation/types.ts index 317a15f67a..a76f52e0c2 100644 --- a/packages/core/src/internal/reconciliation/types.ts +++ b/packages/core/src/internal/reconciliation/types.ts @@ -36,7 +36,7 @@ export interface ReconciliationContext { deploymentLoader: DeploymentLoader; defaultSender: string; strategy: string; - strategyConfig: Record; + strategyConfig: Record; } export type ReconciliationCheck = ( From 50d4d867d69ec358adcc27cd351d8ce0cdf30cef Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 23:08:47 +0000 Subject: [PATCH 1177/1302] refactor: tweak resolveStrategy signature --- packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts | 2 +- packages/hardhat-plugin-viem/src/viem-ignition-helper.ts | 2 +- packages/hardhat-plugin/src/index.ts | 2 +- packages/hardhat-plugin/src/utils/resolveStrategy.ts | 2 +- .../hardhat-plugin/test/test-helpers/test-ignition-helper.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index 027cd13366..4d7622441b 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -109,7 +109,7 @@ export class EthersIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); const result = await deploy({ config: resolvedConfig, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index f8dee6f1e5..48fbceaec4 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -99,7 +99,7 @@ export class ViemIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); const result = await deploy({ config: resolvedConfig, diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index bac30f65d8..72d18a953e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -112,7 +112,7 @@ ignitionScope const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); const { resolveStrategy } = await import("./utils/resolveStrategy"); - const strategy = resolveStrategy(strategyName, hre); + const strategy = resolveStrategy(hre, strategyName); if (verify) { if ( diff --git a/packages/hardhat-plugin/src/utils/resolveStrategy.ts b/packages/hardhat-plugin/src/utils/resolveStrategy.ts index 3bd326c282..b13397adac 100644 --- a/packages/hardhat-plugin/src/utils/resolveStrategy.ts +++ b/packages/hardhat-plugin/src/utils/resolveStrategy.ts @@ -5,8 +5,8 @@ import type { import type { HardhatRuntimeEnvironment } from "hardhat/types"; export function resolveStrategy( - strategyName: string = "basic", hre: HardhatRuntimeEnvironment, + strategyName: string = "basic", strategyConfigOverride: StrategyConfig[keyof StrategyConfig] = {} ): DeploymentStrategyType { const { BasicStrategy, Create2Strategy } = diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 64be482e15..0f9ca066b4 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -95,7 +95,7 @@ export class TestIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(strategyName, this._hre, strategyConfig); + const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); const result = await deploy({ config: resolvedConfig, From 9d8dd350594d6cc9d03c9ceaa17d8e787b29c5c7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 4 Mar 2024 23:24:05 +0000 Subject: [PATCH 1178/1302] refactor: improve strategy assertion messages --- packages/core/src/strategies/basic-strategy.ts | 6 +++--- packages/core/src/strategies/create2-strategy.ts | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/core/src/strategies/basic-strategy.ts b/packages/core/src/strategies/basic-strategy.ts index b833f3dd8d..dadff77936 100644 --- a/packages/core/src/strategies/basic-strategy.ts +++ b/packages/core/src/strategies/basic-strategy.ts @@ -74,7 +74,7 @@ class BasicStrategyImplementation ): DeploymentStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( @@ -126,7 +126,7 @@ class BasicStrategyImplementation ): CallStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( @@ -199,7 +199,7 @@ class BasicStrategyImplementation ): StaticCallStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( diff --git a/packages/core/src/strategies/create2-strategy.ts b/packages/core/src/strategies/create2-strategy.ts index 9e5db8204f..cb671cc624 100644 --- a/packages/core/src/strategies/create2-strategy.ts +++ b/packages/core/src/strategies/create2-strategy.ts @@ -140,7 +140,7 @@ class Create2StrategyImplementation ): DeploymentStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( @@ -210,7 +210,7 @@ class Create2StrategyImplementation ): CallStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( @@ -283,7 +283,7 @@ class Create2StrategyImplementation ): StaticCallStrategyGenerator { assertIgnitionInvariant( this._deploymentLoader !== undefined && this._jsonRpcClient !== undefined, - "Strategy not initialized" + `Strategy ${this.name} not initialized` ); const artifact = await this._deploymentLoader.loadArtifact( From 41b44593776af4ff72e2e7fe0299ffe031006f53 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 5 Mar 2024 10:44:32 +0000 Subject: [PATCH 1179/1302] refactor: share one stored strategy config type This is internal and is recorded down to the journal and used in reconciliation. --- .../helpers/build-initialize-message-for.ts | 5 +++-- .../internal/execution/types/execution-state.ts | 8 +++++++- .../src/internal/execution/types/messages.ts | 17 ++++++++++------- .../src/internal/reconciliation/reconciler.ts | 3 ++- .../core/src/internal/reconciliation/types.ts | 7 +++++-- packages/core/test/reconciliation/helpers.ts | 7 +++++-- 6 files changed, 32 insertions(+), 15 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index 600034a8df..ba8e31fedb 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -2,6 +2,7 @@ import { DeploymentParameters } from "../../../../types/deploy"; import { Future, FutureType } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; import { DeploymentState } from "../../types/deployment-state"; +import { PassedStrategyConfig } from "../../types/execution-state"; import { ExecutionStrategy } from "../../types/execution-strategy"; import { CallExecutionStateInitializeMessage, @@ -235,13 +236,13 @@ function _extendBaseInitWith< messageType: MessageT, future: FutureT, strategy: string, - strategyConfig: Record, + strategyConfig: PassedStrategyConfig, extension: ExtensionT ): { type: MessageT; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; } & ExtensionT { return { diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 941044ab21..5b7fc7e20e 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -42,6 +42,12 @@ export enum ExecutionSateType { SEND_DATA_EXECUTION_STATE = "SEND_DATA_EXECUTION_STATE", } +/** + * The Strategy configuration that the user has provided in the run + * the future is started. Used to reconcile the future on subsequent runs. + */ +export type PassedStrategyConfig = Record; + /** * The base interface for all execution states. * @@ -55,7 +61,7 @@ interface BaseExecutionState< type: ExecutionStateT; futureType: FutureTypeT; strategy: string; // For example, "basic" | "create2". This needs to be string if we want custom ones. - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; status: ExecutionStatus; dependencies: Set; } diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index f28b113883..5199303ec2 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -6,7 +6,10 @@ import { SendDataExecutionResult, StaticCallExecutionResult, } from "./execution-result"; -import { DeploymentExecutionStateFutureTypes } from "./execution-state"; +import { + DeploymentExecutionStateFutureTypes, + PassedStrategyConfig, +} from "./execution-state"; import { OnchainInteractionRequest, StaticCallRequest, @@ -79,7 +82,7 @@ export interface DeploymentExecutionStateInitializeMessage { futureId: string; futureType: DeploymentExecutionStateFutureTypes; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; artifactId: string; contractName: string; @@ -99,7 +102,7 @@ export interface CallExecutionStateInitializeMessage { type: JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; artifactId: string; contractAddress: string; @@ -119,7 +122,7 @@ export interface StaticCallExecutionStateInitializeMessage { type: JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; artifactId: string; contractAddress: string; @@ -139,7 +142,7 @@ export interface SendDataExecutionStateInitializeMessage { type: JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; to: string; data: string; @@ -158,7 +161,7 @@ export interface ContractAtExecutionStateInitializeMessage { futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT | FutureType.CONTRACT_AT; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; artifactId: string; contractName: string; @@ -169,7 +172,7 @@ export interface ReadEventArgExecutionStateInitializeMessage { type: JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; dependencies: string[]; artifactId: string; eventName: string; diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index 061f64cb8a..54919eb030 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -8,6 +8,7 @@ import { DeploymentState } from "../execution/types/deployment-state"; import { ExecutionState, ExecutionStatus, + PassedStrategyConfig, } from "../execution/types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; @@ -34,7 +35,7 @@ export class Reconciler { artifactResolver: ArtifactResolver, defaultSender: string, strategy: string, - strategyConfig: Record + strategyConfig: PassedStrategyConfig ): Promise { const reconciliationFailures = await this._reconcileEachFutureInModule( module, diff --git a/packages/core/src/internal/reconciliation/types.ts b/packages/core/src/internal/reconciliation/types.ts index a76f52e0c2..f8e086b7b9 100644 --- a/packages/core/src/internal/reconciliation/types.ts +++ b/packages/core/src/internal/reconciliation/types.ts @@ -3,7 +3,10 @@ import { DeploymentParameters } from "../../types/deploy"; import { Future } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; import { DeploymentState } from "../execution/types/deployment-state"; -import { ExecutionState } from "../execution/types/execution-state"; +import { + ExecutionState, + PassedStrategyConfig, +} from "../execution/types/execution-state"; export interface ReconciliationFailure { futureId: string; @@ -36,7 +39,7 @@ export interface ReconciliationContext { deploymentLoader: DeploymentLoader; defaultSender: string; strategy: string; - strategyConfig: Record; + strategyConfig: PassedStrategyConfig; } export type ReconciliationCheck = ( diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/core/test/reconciliation/helpers.ts index bf57b0b2b1..0668d6eb86 100644 --- a/packages/core/test/reconciliation/helpers.ts +++ b/packages/core/test/reconciliation/helpers.ts @@ -8,7 +8,10 @@ import { } from "../../src"; import { DeploymentLoader } from "../../src/internal/deployment-loader/types"; import { DeploymentState } from "../../src/internal/execution/types/deployment-state"; -import { ExecutionState } from "../../src/internal/execution/types/execution-state"; +import { + ExecutionState, + PassedStrategyConfig, +} from "../../src/internal/execution/types/execution-state"; import { JournalMessage } from "../../src/internal/execution/types/messages"; import { getDefaultSender } from "../../src/internal/execution/utils/get-default-sender"; import { Reconciler } from "../../src/internal/reconciliation/reconciler"; @@ -128,7 +131,7 @@ export async function reconcile( artifactLoader: ArtifactResolver = new MockArtifactResolver(), deploymentParameters: DeploymentParameters = {}, strategy: string = "basic", - strategyConfig: Record = {} + strategyConfig: PassedStrategyConfig = {} ): Promise { const reconiliationResult = Reconciler.reconcile( ignitionModule, From 824e11b5c3fa5f3b23f97db5c3bebbeda6526bd5 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 09:54:12 +0000 Subject: [PATCH 1180/1302] refactor: change name to ConcreteExecutionConfig --- .../helpers/build-initialize-message-for.ts | 6 +++--- .../internal/execution/types/execution-state.ts | 4 ++-- .../core/src/internal/execution/types/messages.ts | 14 +++++++------- .../core/src/internal/reconciliation/reconciler.ts | 4 ++-- packages/core/src/internal/reconciliation/types.ts | 4 ++-- packages/core/test/reconciliation/helpers.ts | 4 ++-- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index ba8e31fedb..c2b006361a 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -2,7 +2,7 @@ import { DeploymentParameters } from "../../../../types/deploy"; import { Future, FutureType } from "../../../../types/module"; import { DeploymentLoader } from "../../../deployment-loader/types"; import { DeploymentState } from "../../types/deployment-state"; -import { PassedStrategyConfig } from "../../types/execution-state"; +import { ConcreteExecutionConfig } from "../../types/execution-state"; import { ExecutionStrategy } from "../../types/execution-strategy"; import { CallExecutionStateInitializeMessage, @@ -236,13 +236,13 @@ function _extendBaseInitWith< messageType: MessageT, future: FutureT, strategy: string, - strategyConfig: PassedStrategyConfig, + strategyConfig: ConcreteExecutionConfig, extension: ExtensionT ): { type: MessageT; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; } & ExtensionT { return { diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 5b7fc7e20e..820eaf71ca 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -46,7 +46,7 @@ export enum ExecutionSateType { * The Strategy configuration that the user has provided in the run * the future is started. Used to reconcile the future on subsequent runs. */ -export type PassedStrategyConfig = Record; +export type ConcreteExecutionConfig = Record; /** * The base interface for all execution states. @@ -61,7 +61,7 @@ interface BaseExecutionState< type: ExecutionStateT; futureType: FutureTypeT; strategy: string; // For example, "basic" | "create2". This needs to be string if we want custom ones. - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; status: ExecutionStatus; dependencies: Set; } diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index 5199303ec2..0655a74d98 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -7,8 +7,8 @@ import { StaticCallExecutionResult, } from "./execution-result"; import { + ConcreteExecutionConfig, DeploymentExecutionStateFutureTypes, - PassedStrategyConfig, } from "./execution-state"; import { OnchainInteractionRequest, @@ -82,7 +82,7 @@ export interface DeploymentExecutionStateInitializeMessage { futureId: string; futureType: DeploymentExecutionStateFutureTypes; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; artifactId: string; contractName: string; @@ -102,7 +102,7 @@ export interface CallExecutionStateInitializeMessage { type: JournalMessageType.CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; artifactId: string; contractAddress: string; @@ -122,7 +122,7 @@ export interface StaticCallExecutionStateInitializeMessage { type: JournalMessageType.STATIC_CALL_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; artifactId: string; contractAddress: string; @@ -142,7 +142,7 @@ export interface SendDataExecutionStateInitializeMessage { type: JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; to: string; data: string; @@ -161,7 +161,7 @@ export interface ContractAtExecutionStateInitializeMessage { futureType: FutureType.NAMED_ARTIFACT_CONTRACT_AT | FutureType.CONTRACT_AT; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; artifactId: string; contractName: string; @@ -172,7 +172,7 @@ export interface ReadEventArgExecutionStateInitializeMessage { type: JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE; futureId: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; dependencies: string[]; artifactId: string; eventName: string; diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/core/src/internal/reconciliation/reconciler.ts index 54919eb030..0b1e0afe37 100644 --- a/packages/core/src/internal/reconciliation/reconciler.ts +++ b/packages/core/src/internal/reconciliation/reconciler.ts @@ -6,9 +6,9 @@ import { DeploymentLoader } from "../deployment-loader/types"; import { ERRORS } from "../errors-list"; import { DeploymentState } from "../execution/types/deployment-state"; import { + ConcreteExecutionConfig, ExecutionState, ExecutionStatus, - PassedStrategyConfig, } from "../execution/types/execution-state"; import { AdjacencyList } from "../utils/adjacency-list"; import { AdjacencyListConverter } from "../utils/adjacency-list-converter"; @@ -35,7 +35,7 @@ export class Reconciler { artifactResolver: ArtifactResolver, defaultSender: string, strategy: string, - strategyConfig: PassedStrategyConfig + strategyConfig: ConcreteExecutionConfig ): Promise { const reconciliationFailures = await this._reconcileEachFutureInModule( module, diff --git a/packages/core/src/internal/reconciliation/types.ts b/packages/core/src/internal/reconciliation/types.ts index f8e086b7b9..9f803475e4 100644 --- a/packages/core/src/internal/reconciliation/types.ts +++ b/packages/core/src/internal/reconciliation/types.ts @@ -4,8 +4,8 @@ import { Future } from "../../types/module"; import { DeploymentLoader } from "../deployment-loader/types"; import { DeploymentState } from "../execution/types/deployment-state"; import { + ConcreteExecutionConfig, ExecutionState, - PassedStrategyConfig, } from "../execution/types/execution-state"; export interface ReconciliationFailure { @@ -39,7 +39,7 @@ export interface ReconciliationContext { deploymentLoader: DeploymentLoader; defaultSender: string; strategy: string; - strategyConfig: PassedStrategyConfig; + strategyConfig: ConcreteExecutionConfig; } export type ReconciliationCheck = ( diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/core/test/reconciliation/helpers.ts index 0668d6eb86..7884681653 100644 --- a/packages/core/test/reconciliation/helpers.ts +++ b/packages/core/test/reconciliation/helpers.ts @@ -9,8 +9,8 @@ import { import { DeploymentLoader } from "../../src/internal/deployment-loader/types"; import { DeploymentState } from "../../src/internal/execution/types/deployment-state"; import { + ConcreteExecutionConfig, ExecutionState, - PassedStrategyConfig, } from "../../src/internal/execution/types/execution-state"; import { JournalMessage } from "../../src/internal/execution/types/messages"; import { getDefaultSender } from "../../src/internal/execution/utils/get-default-sender"; @@ -131,7 +131,7 @@ export async function reconcile( artifactLoader: ArtifactResolver = new MockArtifactResolver(), deploymentParameters: DeploymentParameters = {}, strategy: string = "basic", - strategyConfig: PassedStrategyConfig = {} + strategyConfig: ConcreteExecutionConfig = {} ): Promise { const reconiliationResult = Reconciler.reconcile( ignitionModule, From 53295bcdb692514b58741d4d7c50f011adfdbfc7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 11:47:50 +0000 Subject: [PATCH 1181/1302] refactor: don't expose strategies from core We switch to a pattern of passing both config and strategy name into core. The intention is to include strategy initializers in core's `deploy` signature. This will allow us to support command line usage, while also providing programmatic support. --- packages/core/src/deploy.ts | 15 ++- packages/core/src/index.ts | 2 - packages/core/src/internal/errors-list.ts | 21 ++++ .../core/src/strategies/basic-strategy.ts | 34 +----- .../core/src/strategies/create2-strategy.ts | 31 +----- .../core/src/strategies/resolve-strategy.ts | 40 +++++++ packages/core/src/types/deploy.ts | 10 -- .../test/execution/future-processor/utils.ts | 3 +- .../src/ethers-ignition-helper.ts | 30 ++++- .../create2/contracts/Foo.sol | 7 ++ .../create2/hardhat.config.js | 12 ++ .../create2/modules/FooModule.js | 8 ++ .../test/strategies/helper-invocation.ts | 103 ++++++++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- .../scripts/compile-test-fixture-project.ts | 24 ++++ .../scripts/compile-test-fixture-projects.ts | 29 ----- .../src/viem-ignition-helper.ts | 30 ++++- .../create2/contracts/Baz.sol | 7 ++ .../create2/hardhat.config.js | 12 ++ .../create2/modules/BazModule.js | 8 ++ .../test/strategies/helper-invocation.ts | 88 +++++++++++++++ packages/hardhat-plugin/src/helpers.ts | 1 - packages/hardhat-plugin/src/index.ts | 16 ++- .../src/utils/resolveStrategy.ts | 41 ------- .../hardhat-plugin/test/strategies/create2.ts | 2 +- .../test/test-helpers/test-ignition-helper.ts | 15 +-- 26 files changed, 425 insertions(+), 166 deletions(-) create mode 100644 packages/core/src/strategies/resolve-strategy.ts create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js create mode 100644 packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js create mode 100644 packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts create mode 100644 packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts delete mode 100644 packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js create mode 100644 packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js create mode 100644 packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts delete mode 100644 packages/hardhat-plugin/src/utils/resolveStrategy.ts diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 9b3b97c91f..3f8c135f09 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -14,12 +14,13 @@ import { equalAddresses } from "./internal/execution/utils/address"; import { getDefaultSender } from "./internal/execution/utils/get-default-sender"; import { checkAutominedNetwork } from "./internal/utils/check-automined-network"; import { validate } from "./internal/validation/validate"; +import { resolveStrategy } from "./strategies/resolve-strategy"; import { ArtifactResolver } from "./types/artifact"; import { DeployConfig, DeploymentParameters, DeploymentResult, - DeploymentStrategyType, + StrategyConfig, } from "./types/deploy"; import { ExecutionEventListener, @@ -36,7 +37,8 @@ import { EIP1193Provider } from "./types/provider"; export async function deploy< ModuleIdT extends string, ContractNameT extends string, - IgnitionModuleResultsT extends IgnitionModuleResult + IgnitionModuleResultsT extends IgnitionModuleResult, + StrategyT extends keyof StrategyConfig = "basic" >({ config = {}, artifactResolver, @@ -48,6 +50,7 @@ export async function deploy< accounts, defaultSender: givenDefaultSender, strategy, + strategyConfig, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -62,9 +65,13 @@ export async function deploy< deploymentParameters: DeploymentParameters; accounts: string[]; defaultSender?: string; - strategy: DeploymentStrategyType; + strategy?: StrategyT; + strategyConfig?: StrategyConfig[StrategyT]; }): Promise { - const executionStrategy: ExecutionStrategy = strategy as ExecutionStrategy; + const executionStrategy: ExecutionStrategy = resolveStrategy( + strategy, + strategyConfig + ); if (executionEventListener !== undefined) { executionEventListener.setModuleId({ diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 57a2795ced..dbbe347f56 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,8 +5,6 @@ export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export { status } from "./status"; -export { BasicStrategy } from "./strategies/basic-strategy"; -export { Create2Strategy } from "./strategies/create2-strategy"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; diff --git a/packages/core/src/internal/errors-list.ts b/packages/core/src/internal/errors-list.ts index b8cbb08cf8..4f740ff2c0 100644 --- a/packages/core/src/internal/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -68,6 +68,11 @@ export const ERROR_RANGES: { max: 1099, title: "Verify errors", }, + STRATEGIES: { + min: 1100, + max: 1199, + title: "Strategy errors", + }, }; /** @@ -357,6 +362,22 @@ export const ERRORS = { "Verification not natively supported for chainId %chainId%. Please use a custom chain configuration to add support.", }, }, + STRATEGIES: { + UNKNOWN_STRATEGY: { + number: 1100, + message: + "Unknown strategy %strategyName%, must be either 'basic' or 'create2'", + }, + MISSING_CONFIG: { + number: 1101, + message: "No strategy config passed for strategy '%strategyName%'", + }, + MISSING_CONFIG_PARAM: { + number: 1102, + message: + "Missing required strategy configuration parameter '%requiredParam%' for the strategy '%strategyName%'", + }, + }, }; /** diff --git a/packages/core/src/strategies/basic-strategy.ts b/packages/core/src/strategies/basic-strategy.ts index dadff77936..5cb942a4a6 100644 --- a/packages/core/src/strategies/basic-strategy.ts +++ b/packages/core/src/strategies/basic-strategy.ts @@ -32,34 +32,16 @@ import { assertIgnitionInvariant } from "../internal/utils/assertions"; * for each contract deployment, call, and send data, and a single static call * for each static call execution. * - * @beta + * @private */ -export class BasicStrategy { - public readonly name = "basic" as const; +export class BasicStrategy implements ExecutionStrategy { + public readonly name: string = "basic"; public readonly config: Record; - constructor() { - this.config = {}; - } -} - -/** - * The Basic strategy. - * - * The BasicStrategyImplementation is internal. It will be properly exposed - * in the Core API with the full Strategy API. - * - * @private - */ -class BasicStrategyImplementation - extends BasicStrategy - implements ExecutionStrategy -{ - public readonly name = "basic" as const; private _deploymentLoader: DeploymentLoader | undefined; constructor() { - super(); + this.config = {}; } public async init( @@ -241,11 +223,3 @@ class BasicStrategyImplementation }; } } - -// TODO: Remove this hack once we are fully exposing our Strategy API. -// We don't want to export all of the internal types and the API Extractor -// is harsh. So we define a reduced Create2Strategy class and type, but -// override the implementation. The reduced class is exported in a way -// API extractor will accept, while the richer implementation will -// actually be used. -(this as any).BasicStrategy = BasicStrategyImplementation; diff --git a/packages/core/src/strategies/create2-strategy.ts b/packages/core/src/strategies/create2-strategy.ts index cb671cc624..08860cee6b 100644 --- a/packages/core/src/strategies/create2-strategy.ts +++ b/packages/core/src/strategies/create2-strategy.ts @@ -73,32 +73,15 @@ const CREATE_X_PRESIGNED_DEPLOYER_ADDRESS = * * @beta */ -export class Create2Strategy { - public readonly name = "create2" as const; +export class Create2Strategy implements ExecutionStrategy { + public readonly name: string = "create2"; public readonly config: { salt: string }; - constructor(config: { salt: string }) { - this.config = config; - } -} - -/** - * The create2 strategy. - * - * The Create2StrategyImplementation is internal. It will be properly exposed - * in the Core API with the full Strategy API. - * - * @private - */ -class Create2StrategyImplementation - extends Create2Strategy - implements ExecutionStrategy -{ private _deploymentLoader: DeploymentLoader | undefined; private _jsonRpcClient: JsonRpcClient | undefined; constructor(config: { salt: string }) { - super(config); + this.config = config; } public async init( @@ -362,11 +345,3 @@ class Create2StrategyImplementation } } } - -// TODO: Remove this hack once we are fully exposing our Strategy API. -// We don't want to export all of the internal types and the API Extractor -// is harsh. So we define a reduced Create2Strategy class and type, but -// override the implementation. The reduced class is exported in a way -// API extractor will accept, while the richer implementation will -// actually be used. -(this as any).Create2Strategy = Create2StrategyImplementation; diff --git a/packages/core/src/strategies/resolve-strategy.ts b/packages/core/src/strategies/resolve-strategy.ts new file mode 100644 index 0000000000..540b8ab830 --- /dev/null +++ b/packages/core/src/strategies/resolve-strategy.ts @@ -0,0 +1,40 @@ +import { IgnitionError } from "../errors"; +import { ERRORS } from "../internal/errors-list"; +import { ExecutionStrategy } from "../internal/execution/types/execution-strategy"; +import { StrategyConfig } from "../types/deploy"; + +import { BasicStrategy } from "./basic-strategy"; +import { Create2Strategy } from "./create2-strategy"; + +export function resolveStrategy( + strategyName: StrategyT | undefined, + strategyConfig: StrategyConfig[StrategyT] | undefined +): ExecutionStrategy { + if (strategyName === undefined) { + return new BasicStrategy(); + } + + switch (strategyName) { + case "basic": + return new BasicStrategy(); + case "create2": + if (strategyConfig === undefined) { + throw new IgnitionError(ERRORS.STRATEGIES.MISSING_CONFIG, { + strategyName, + }); + } + + if (typeof strategyConfig.salt !== "string") { + throw new IgnitionError(ERRORS.STRATEGIES.MISSING_CONFIG_PARAM, { + strategyName, + requiredParam: "salt", + }); + } + + return new Create2Strategy({ salt: strategyConfig.salt }); + default: + throw new IgnitionError(ERRORS.STRATEGIES.UNKNOWN_STRATEGY, { + strategyName, + }); + } +} diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index 3fcc3b585a..a3c404b41d 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -1,6 +1,3 @@ -import { BasicStrategy } from "../strategies/basic-strategy"; -import { Create2Strategy } from "../strategies/create2-strategy"; - import { ModuleParameters } from "./module"; /** @@ -212,13 +209,6 @@ export interface DeploymentParameters { [moduleId: string]: ModuleParameters; } -/** - * The different types of deployment strategies. - * - * @beta - */ -export type DeploymentStrategyType = Create2Strategy | BasicStrategy; - /** * The config options for the deployment strategies. * diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index bdc8430754..a71b8183e3 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -8,7 +8,6 @@ import { } from "../../../src/internal/execution/jsonrpc-client"; import { NonceManager } from "../../../src/internal/execution/nonce-management/json-rpc-nonce-manager"; import { TransactionTrackingTimer } from "../../../src/internal/execution/transaction-tracking-timer"; -import { ExecutionStrategy } from "../../../src/internal/execution/types/execution-strategy"; import { NetworkFees, RawStaticCallResult, @@ -46,7 +45,7 @@ export async function setupFutureProcessor( transactions ); - const basicExecutionStrategy = new BasicStrategy() as ExecutionStrategy; + const basicExecutionStrategy = new BasicStrategy(); await basicExecutionStrategy.init(mockDeploymentLoader, mockJsonRpcClient); const transactionTrackingTimer = new TransactionTrackingTimer(); diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index 4d7622441b..a14462d600 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -1,7 +1,6 @@ import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, - resolveStrategy, } from "@nomicfoundation/hardhat-ignition/helpers"; import { DeployConfig, @@ -77,7 +76,7 @@ export class EthersIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, - strategy: strategyName, + strategy, strategyConfig, }: { parameters?: DeploymentParameters; @@ -109,7 +108,12 @@ export class EthersIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); + const resolvedStrategyConfig = + EthersIgnitionHelper._resolveStrategyConfig( + this._hre, + strategy, + strategyConfig + ); const result = await deploy({ config: resolvedConfig, @@ -121,6 +125,7 @@ export class EthersIgnitionHelper { accounts, defaultSender, strategy, + strategyConfig: resolvedStrategyConfig, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { @@ -196,4 +201,23 @@ export class EthersIgnitionHelper { deployedContract.address ); } + + private static _resolveStrategyConfig( + hre: HardhatRuntimeEnvironment, + strategyName: StrategyT | undefined, + strategyConfig: StrategyConfig[StrategyT] | undefined + ): StrategyConfig[StrategyT] | undefined { + if (strategyName === undefined) { + return undefined; + } + + if (strategyConfig === undefined) { + const fromHardhatConfig = + hre.config.ignition?.strategyConfig?.[strategyName]; + + return fromHardhatConfig; + } + + return strategyConfig; + } } diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol new file mode 100644 index 0000000000..33c8ffdf30 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Foo { + bool public isFoo = true; +} diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js new file mode 100644 index 0000000000..a94fc3c6ea --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + ignition: { + strategyConfig: { + create2: { + salt: "a-random-salt", + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js new file mode 100644 index 0000000000..3936934a65 --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("FooModule", (m) => { + const foo = m.contract("Foo"); + + return { foo }; +}); diff --git a/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts b/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts new file mode 100644 index 0000000000..8c6e3e24ac --- /dev/null +++ b/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts @@ -0,0 +1,103 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; +import { resetHardhatContext } from "hardhat/plugins-testing"; +import path from "path"; + +describe("strategies - invocation via helper", () => { + describe("no Hardhat config setup", () => { + const fixtureProjectName = "minimal"; + + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); + + it("should execute create2 when passed config programmatically via helper", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, + }); + + assert.equal( + await result.foo.getAddress(), + "0xDF310a91C604d3d525A999df6E01A8fFb3AEc406" + ); + }); + + it("should error on create2 when passed bad config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: undefined as any, + }, + }), + /IGN1102: Missing required strategy configuration parameter 'salt' for the strategy 'create2'/ + ); + }); + }); + + describe("Hardhat config setup with create2 config", () => { + const fixtureProjectName = "create2"; + + beforeEach("Load environment", async function () { + process.chdir( + path.join(__dirname, "../fixture-projects", fixtureProjectName) + ); + + const hre = require("hardhat"); + + await hre.network.provider.send("evm_setAutomine", [true]); + await hre.run("compile", { quiet: true }); + + this.hre = hre; + }); + + afterEach("reset hardhat context", function () { + resetHardhatContext(); + }); + + it("should execute create2 with the helper loading the Hardhat config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + const result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + }); + + assert.equal( + await result.foo.getAddress(), + "0xDD35866eA6cdfC26eaaBb36b9C70A63d23992125" + ); + }); + }); +}); diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index be13be513b..8adaa8be3d 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -20,7 +20,7 @@ "main": "dist/src/index.js", "types": "dist/src/index.d.ts", "scripts": { - "prebuild": "ts-node ./scripts/compile-test-fixture-projects.ts", + "prebuild": "ts-node ./scripts/compile-test-fixture-project.ts create2 && ts-node ./scripts/compile-test-fixture-project.ts minimal", "build": "tsc --build", "lint": "npm run prettier -- --check && npm run eslint", "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", diff --git a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts new file mode 100644 index 0000000000..b784b73c83 --- /dev/null +++ b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts @@ -0,0 +1,24 @@ +import path from "node:path"; + +const main = async (projectToBuild: string) => { + console.log("Running compile on the test fixture project - ", projectToBuild); + + const fixtureProjectDir = path.join( + __dirname, + "../test/fixture-projects", + projectToBuild + ); + + process.chdir(fixtureProjectDir); + + const hre = require("hardhat"); + + await hre.run("compile", { quiet: true }); +}; + +const project = process.argv[2]; + +void main(project).catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts b/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts deleted file mode 100644 index 09132287d1..0000000000 --- a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-projects.ts +++ /dev/null @@ -1,29 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; - -const main = async () => { - console.log("Running compile on the test fixture projects..."); - - const fixtureProjectNames = fs - .readdirSync(path.join(__dirname, "../test/fixture-projects"), { - withFileTypes: true, - }) - .filter((dirent) => dirent.isDirectory()) - .map((dirent) => dirent.name); - - for (const fixtureProjectName of fixtureProjectNames) { - const fixtureProjectDir = path.join( - __dirname, - "../test/fixture-projects", - fixtureProjectName - ); - - process.chdir(fixtureProjectDir); - - const hre = require("hardhat"); - - await hre.run("compile"); - } -}; - -void main(); diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 48fbceaec4..bd267cdd41 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -3,7 +3,6 @@ import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types" import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, - resolveStrategy, } from "@nomicfoundation/hardhat-ignition/helpers"; import { ContractAtFuture, @@ -70,7 +69,7 @@ export class ViemIgnitionHelper { parameters = {}, config: perDeployConfig = {}, defaultSender = undefined, - strategy: strategyName, + strategy, strategyConfig, }: { parameters?: DeploymentParameters; @@ -99,7 +98,12 @@ export class ViemIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); + const resolvedStrategyConfig = + ViemIgnitionHelper._resolveStrategyConfig( + this._hre, + strategy, + strategyConfig + ); const result = await deploy({ config: resolvedConfig, @@ -111,6 +115,7 @@ export class ViemIgnitionHelper { accounts, defaultSender, strategy, + strategyConfig: resolvedStrategyConfig, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { @@ -253,4 +258,23 @@ export class ViemIgnitionHelper { return `0x${address.slice(2)}`; } + + private static _resolveStrategyConfig( + hre: HardhatRuntimeEnvironment, + strategyName: StrategyT | undefined, + strategyConfig: StrategyConfig[StrategyT] | undefined + ): StrategyConfig[StrategyT] | undefined { + if (strategyName === undefined) { + return undefined; + } + + if (strategyConfig === undefined) { + const fromHardhatConfig = + hre.config.ignition?.strategyConfig?.[strategyName]; + + return fromHardhatConfig; + } + + return strategyConfig; + } } diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol b/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol new file mode 100644 index 0000000000..7904b5189c --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol @@ -0,0 +1,7 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Baz { + bool public isBaz = true; +} diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js new file mode 100644 index 0000000000..a94fc3c6ea --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js @@ -0,0 +1,12 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", + ignition: { + strategyConfig: { + create2: { + salt: "a-random-salt", + }, + }, + }, +}; diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js b/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js new file mode 100644 index 0000000000..a4b19a9b66 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js @@ -0,0 +1,8 @@ +// eslint-disable-next-line import/no-unused-modules +const { buildModule } = require("@nomicfoundation/ignition-core"); + +module.exports = buildModule("BazModule", (m) => { + const foo = m.contract("Baz"); + + return { foo }; +}); diff --git a/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts b/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts new file mode 100644 index 0000000000..58c5323527 --- /dev/null +++ b/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts @@ -0,0 +1,88 @@ +/* eslint-disable import/no-unused-modules */ +import { + NamedArtifactContractDeploymentFuture, + buildModule, +} from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module-results-to-viem-contracts"; +import { useIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("strategies - invocation via helper", () => { + describe("no Hardhat config setup", () => { + useIgnitionProject("minimal"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + foo: NamedArtifactContractDeploymentFuture<"Foo">; + } + >; + + it("should execute create2 when passed config programmatically via helper", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: "test-salt", + }, + }); + + assert.equal( + result.foo.address, + "0xA851627726C4Cc6150AE804Bcb2BF43BBFC1B3AD" + ); + }); + + it("should error on create2 when passed bad config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const foo = m.contract("Foo"); + + return { foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + strategyConfig: { + salt: undefined as any, + }, + }), + /IGN1102: Missing required strategy configuration parameter 'salt' for the strategy 'create2'/ + ); + }); + }); + + describe("Hardhat config setup with create2 config", () => { + useIgnitionProject("create2"); + + let result: IgnitionModuleResultsToViemContracts< + string, + { + baz: NamedArtifactContractDeploymentFuture<"Baz">; + } + >; + + it("should execute create2 with the helper loading the Hardhat config", async function () { + const moduleDefinition = buildModule("Module", (m) => { + const baz = m.contract("Baz"); + + return { baz }; + }); + + result = await this.hre.ignition.deploy(moduleDefinition, { + strategy: "create2", + }); + + assert.equal( + result.baz.address, + "0x6ad123c48167C25Dc3EfC8320A5Ae3BE72B67419" + ); + }); + }); +}); diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts index aa58d40919..4c17b51c0a 100644 --- a/packages/hardhat-plugin/src/helpers.ts +++ b/packages/hardhat-plugin/src/helpers.ts @@ -1,3 +1,2 @@ export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; -export { resolveStrategy } from "./utils/resolveStrategy"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 72d18a953e..7b1090cb74 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -110,9 +110,6 @@ ignitionScope ); const { loadModule } = await import("./utils/load-module"); const { PrettyEventHandler } = await import("./ui/pretty-event-handler"); - const { resolveStrategy } = await import("./utils/resolveStrategy"); - - const strategy = resolveStrategy(hre, strategyName); if (verify) { if ( @@ -180,6 +177,14 @@ ignitionScope } } + if (strategyName !== "basic" && strategyName !== "create2") { + require("hardhat/plugins") as typeof import("hardhat/plugins"); + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + "Invalid strategy name, must be either 'basic' or 'create2'" + ); + } + await hre.run("compile", { quiet: true }); const userModule = loadModule(hre.config.paths.ignition, modulePath); @@ -209,6 +214,8 @@ ignitionScope const executionEventListener = new PrettyEventHandler(); + const strategyConfig = hre.config.ignition.strategyConfig?.[strategyName]; + try { const result = await deploy({ config: hre.config.ignition, @@ -220,7 +227,8 @@ ignitionScope deploymentParameters: parameters ?? {}, accounts, defaultSender, - strategy, + strategy: strategyName, + strategyConfig, }); if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { diff --git a/packages/hardhat-plugin/src/utils/resolveStrategy.ts b/packages/hardhat-plugin/src/utils/resolveStrategy.ts deleted file mode 100644 index b13397adac..0000000000 --- a/packages/hardhat-plugin/src/utils/resolveStrategy.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { - DeploymentStrategyType, - StrategyConfig, -} from "@nomicfoundation/ignition-core"; -import type { HardhatRuntimeEnvironment } from "hardhat/types"; - -export function resolveStrategy( - hre: HardhatRuntimeEnvironment, - strategyName: string = "basic", - strategyConfigOverride: StrategyConfig[keyof StrategyConfig] = {} -): DeploymentStrategyType { - const { BasicStrategy, Create2Strategy } = - require("@nomicfoundation/ignition-core") as typeof import("@nomicfoundation/ignition-core"); - - const { NomicLabsHardhatPluginError } = - require("hardhat/plugins") as typeof import("hardhat/plugins"); - - switch (strategyName) { - case "basic": - return new BasicStrategy(); - case "create2": - const create2Config = { - ...hre.config.ignition.strategyConfig?.create2, - ...strategyConfigOverride, - }; - - if (typeof create2Config.salt !== "string") { - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - "The create2 strategy requires a salt to be set under 'ignition.strategyConfig.create2.salt' in the Hardhat config" - ); - } - - return new Create2Strategy({ salt: create2Config.salt }); - default: - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - "Invalid strategy name, must be either 'basic' or 'create2'" - ); - } -} diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 3fc7591789..19524cc0a3 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -230,7 +230,7 @@ describe("create2", function () { strategy: "create2", } ), - /The create2 strategy requires a salt to be set under 'ignition.strategyConfig.create2.salt' in the Hardhat config/ + /IGN1102: Missing required strategy configuration parameter 'salt' for the strategy 'create2'/ ); }); }); diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts index 0f9ca066b4..36d4498e9e 100644 --- a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts +++ b/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts @@ -1,5 +1,3 @@ -import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types"; - import { deploy, DeployConfig, @@ -15,11 +13,15 @@ import { } from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; -import { createPublicClient, custom, getContract } from "viem"; +import { + createPublicClient, + custom, + getContract, + GetContractReturnType, +} from "viem"; import { hardhat } from "viem/chains"; import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; -import { resolveStrategy } from "../../src/helpers"; import { errorDeploymentResultToExceptionMessage } from "../../src/utils/error-deployment-result-to-exception-message"; export type IgnitionModuleResultsTToViemContracts< @@ -95,8 +97,6 @@ export class TestIgnitionHelper { ...perDeployConfig, }; - const strategy = resolveStrategy(this._hre, strategyName, strategyConfig); - const result = await deploy({ config: resolvedConfig, provider: this._provider, @@ -106,7 +106,8 @@ export class TestIgnitionHelper { deploymentParameters: parameters, accounts, defaultSender, - strategy, + strategy: strategyName, + strategyConfig, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { From 573b7a3ada2b2be154e3a016de6dbad29c202e59 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 17:28:40 +0000 Subject: [PATCH 1182/1302] fix: only reconcile strategy if the future is incomplete We reconcile all futures. But as strategy is set per run, it does not make sense to reconcile already complete futures based on strategy name or strategy config. --- .../helpers/reconcile-strategy.ts | 12 ++ .../core/test/reconciliation/reconciler.ts | 121 ++++++++++++++++++ 2 files changed, 133 insertions(+) diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts index f098c95b4d..09cdf022a8 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts @@ -14,6 +14,7 @@ import { CallExecutionState, ContractAtExecutionState, DeploymentExecutionState, + ExecutionStatus, ReadEventArgumentExecutionState, SendDataExecutionState, StaticCallExecutionState, @@ -45,6 +46,17 @@ export function reconcileStrategy( | ReadEventArgumentExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { + /** + * If the execution was successful, we don't need to reconcile the strategy. + * + * The strategy is set per run, so reconciling already completed futures + * would lead to a false positive. We only want to reconcile futures that + * will be run again. + */ + if (exState.status === ExecutionStatus.SUCCESS) { + return undefined; + } + const storedStrategyName = exState.strategy; const newStrategyName = context.strategy; diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index 580380962f..c2e8ce67b4 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -605,4 +605,125 @@ describe("Reconciliation", () => { assertNoWarningsOrErrors(reconciliationResult); }); }); + + describe("strategies", () => { + it("should reconcile changes to strategy config if the future is already complete", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example", + }); + + return { contract1 }; + }); + + const deploymentState = createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + strategy: "create2", + strategyConfig: { salt: "value" }, + }); + + await assertSuccessReconciliation(moduleDefinition, deploymentState); + }); + + it("should fail reconciliation on changes to the strategy (name) if the future is started but uncompleted", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example1", + }); + + const contract2 = m.contract("Contract", [], { + id: "Example2", + }); + + return { contract1, contract2 }; + }); + + // Future Example1 is fine as it has completed, but running + // with the basic strategy against the started but + // unfinished Example2 should fail + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Example1", + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + strategy: "create2", + strategyConfig: {}, + }, + { + ...exampleDeploymentState, + id: "Module#Example2", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategy: "create2", + strategyConfig: {}, + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example2", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should fail reconciliation on changes to strategy config if the future is started but uncompleted", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract", [], { + id: "Example1", + }); + + const contract2 = m.contract("Contract", [], { + id: "Example2", + }); + + return { contract1, contract2 }; + }); + + // Future Example1 is fine as it has completed, but running + // with the basic strategy against the started but + // unfinished Example2 should fail + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Example1", + status: ExecutionStatus.SUCCESS, + contractName: "Contract", + strategy: "create2", + strategyConfig: { salt: "value" }, + }, + { + ...exampleDeploymentState, + id: "Module#Example2", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategy: "create2", + strategyConfig: { salt: "value" }, + } + ), + undefined, + undefined, + {}, + "create2", + { salt: "another-value" } + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Example2", + failure: + 'Strategy config changed from {"salt":"value"} to {"salt":"another-value"}', + }, + ]); + }); + }); }); From 1a564ce61099d4cbc46a0e1ccffb9fb0ff4bc914 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 17:48:49 +0000 Subject: [PATCH 1183/1302] fix: deal with deployments started in previous versions A journal from the previous version will have a strategy name but not a config. That means any deployment restarted with an in flight transaction will fail as the comparison would have been between undefined and the new basic strategy config `{}`. Instead, we now convert `undefined` for strategy config into `{}`. All future versions of Ignition will have that property defined. We know it is equivalent to `{}` as only the basic strategy was allowed originally. --- .../helpers/reconcile-strategy.ts | 2 +- .../core/test/reconciliation/reconciler.ts | 74 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts index 09cdf022a8..67f796e137 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts @@ -67,7 +67,7 @@ export function reconcileStrategy( ); } - const storedStrategyConfig = exState.strategyConfig; + const storedStrategyConfig = exState.strategyConfig ?? {}; const newStrategyConfig = context.strategyConfig; const isEqual = require("lodash/isEqual") as typeof import("lodash/isEqual"); diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/core/test/reconciliation/reconciler.ts index c2e8ce67b4..33c34c2e64 100644 --- a/packages/core/test/reconciliation/reconciler.ts +++ b/packages/core/test/reconciliation/reconciler.ts @@ -725,5 +725,79 @@ describe("Reconciliation", () => { }, ]); }); + + it("should pass reconciliation if the previous version did not support strategies, and the new run uses basic", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract = m.contract("Contract", [], { + id: "Example", + }); + + return { contract }; + }); + + // Future Example1 is fine as it has completed, but running + // with the basic strategy against the started but + // unfinished Example2 should fail + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategy: "basic", + strategyConfig: undefined as any, // This will be the case for the previous version of Ignition + }), + undefined, + undefined, + {}, + "basic", + {} + ); + + assert.deepStrictEqual(reconiliationResult, { + reconciliationFailures: [], + missingExecutedFutures: [], + }); + }); + + it("should fail reconciliation if the previous version did not support strategies, and the new run uses basic", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract = m.contract("Contract", [], { + id: "Example", + }); + + return { contract }; + }); + + // Future Example1 is fine as it has completed, but running + // with the basic strategy against the started but + // unfinished Example2 should fail + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Example", + status: ExecutionStatus.STARTED, + contractName: "Contract", + strategy: "basic", + strategyConfig: undefined as any, // This will be the case for the previous version of Ignition + }), + undefined, + undefined, + {}, + "create2", + { + salt: "my-salt", + } + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + failure: 'Strategy changed from "basic" to "create2"', + futureId: "Module#Example", + }, + ]); + }); }); }); From 5fd16a81be52e5f61ce8d3806241e6d5fb56a053 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 18:47:24 +0000 Subject: [PATCH 1184/1302] fix: don't hash the salt before passing it on We where using `ethers.id` to hash the salt and force it to be 32bytes long. We only need to ensure that it is 32bytes long. We now pass the salt through cleanly, but have a strategy config validation that enforces a 32 byte length. --- packages/core/src/internal/errors-list.ts | 5 ++++ .../core/src/strategies/create2-strategy.ts | 4 +-- .../core/src/strategies/resolve-strategy.ts | 16 +++++++++++ .../hardhat-plugin/test/strategies/create2.ts | 27 +++++++++++-------- 4 files changed, 38 insertions(+), 14 deletions(-) diff --git a/packages/core/src/internal/errors-list.ts b/packages/core/src/internal/errors-list.ts index 4f740ff2c0..2181eec712 100644 --- a/packages/core/src/internal/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -377,6 +377,11 @@ export const ERRORS = { message: "Missing required strategy configuration parameter '%requiredParam%' for the strategy '%strategyName%'", }, + INVALID_CONFIG_PARAM: { + number: 1102, + message: + "Strategy configuration parameter '%paramName%' for the strategy '%strategyName%' is invalid: %reason%", + }, }, }; diff --git a/packages/core/src/strategies/create2-strategy.ts b/packages/core/src/strategies/create2-strategy.ts index 08860cee6b..bf002bdea4 100644 --- a/packages/core/src/strategies/create2-strategy.ts +++ b/packages/core/src/strategies/create2-strategy.ts @@ -130,8 +130,6 @@ export class Create2Strategy implements ExecutionStrategy { executionState.artifactId ); - const salt = ethers.id(this.config.salt); - const bytecodeToDeploy = encodeArtifactDeploymentData( artifact, executionState.constructorArgs, @@ -147,7 +145,7 @@ export class Create2Strategy implements ExecutionStrategy { data: encodeArtifactFunctionCall( createxArtifact, "deployCreate2(bytes32,bytes)", - [salt, bytecodeToDeploy] + [this.config.salt, bytecodeToDeploy] ), value: executionState.value, }, diff --git a/packages/core/src/strategies/resolve-strategy.ts b/packages/core/src/strategies/resolve-strategy.ts index 540b8ab830..79e974a23c 100644 --- a/packages/core/src/strategies/resolve-strategy.ts +++ b/packages/core/src/strategies/resolve-strategy.ts @@ -31,6 +31,14 @@ export function resolveStrategy( }); } + if (hexStringLengthInBytes(strategyConfig.salt) !== 32) { + throw new IgnitionError(ERRORS.STRATEGIES.INVALID_CONFIG_PARAM, { + strategyName, + paramName: "salt", + reason: "The salt must be 32 bytes in length", + }); + } + return new Create2Strategy({ salt: strategyConfig.salt }); default: throw new IgnitionError(ERRORS.STRATEGIES.UNKNOWN_STRATEGY, { @@ -38,3 +46,11 @@ export function resolveStrategy( }); } } + +function hexStringLengthInBytes(hexString: string) { + const normalizedHexString = hexString.startsWith("0x") + ? hexString.substring(2) + : hexString; + + return normalizedHexString.length / 2; +} diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-plugin/test/strategies/create2.ts index 19524cc0a3..193aa01b68 100644 --- a/packages/hardhat-plugin/test/strategies/create2.ts +++ b/packages/hardhat-plugin/test/strategies/create2.ts @@ -13,12 +13,17 @@ import { import { waitForPendingTxs } from "../test-helpers/wait-for-pending-txs"; describe("create2", function () { + const example32ByteSalt = + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + const anotherExample32ByteSalt = + "0xabcde67890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + const EXPECTED_FOO_CREATE2_ADDRESS = - "0x82841cfc6e85e9A9FBED28FC4A236eb58D56E5b6"; + "0xA901a97D596320CC5b4E61f6B315F6128fAfF10B"; const EXPECTED_BAR_CREATE2_ADDRESS = - "0x2aCB60e63b99511B0B598e1498825c716b19769C"; + "0x5985C19bc6ba6f9b3f9350Ba6c8156c8A9876E1a"; const EXPECTED_CUSTOM_SALT_FOO_CREATE2_ADDRESS = - "0x50eB50b4b4D5222c3C3B89b9Bb37BD903a359425"; + "0x2FbECc7173383C5878FF8EC336da0775CbF77fF7"; const moduleDefinition = buildModule("FooModule", (m) => { // Use a known bytecode to ensure the same address is generated @@ -46,7 +51,7 @@ describe("create2", function () { strategy: "create2", defaultSender: accountAddress, strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }); @@ -74,7 +79,7 @@ describe("create2", function () { { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, } ); @@ -105,7 +110,7 @@ describe("create2", function () { { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, } ), @@ -117,7 +122,7 @@ describe("create2", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "custom-salt", + salt: anotherExample32ByteSalt, }, }); @@ -145,7 +150,7 @@ describe("create2", function () { this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }), /CreateX not deployed on current network 88888/ @@ -161,7 +166,7 @@ describe("create2", function () { const deployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }); @@ -181,7 +186,7 @@ describe("create2", function () { const firstDeployPromise = this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }); @@ -200,7 +205,7 @@ describe("create2", function () { { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, } ); From 70df54ec098181e6502225c3fb3623f98dc1545d Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 6 Mar 2024 18:59:21 +0000 Subject: [PATCH 1185/1302] test: tweak helper tests --- .../test/fixture-projects/create2/hardhat.config.js | 2 +- .../test/strategies/helper-invocation.ts | 9 ++++++--- .../test/fixture-projects/create2/hardhat.config.js | 2 +- .../test/strategies/helper-invocation.ts | 9 ++++++--- .../test/strategies/generic-strategy-constraints.ts | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js index a94fc3c6ea..ddccd293ab 100644 --- a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js +++ b/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js @@ -5,7 +5,7 @@ module.exports = { ignition: { strategyConfig: { create2: { - salt: "a-random-salt", + salt: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890aaaaaa", }, }, }, diff --git a/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts b/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts index 8c6e3e24ac..16ef7111e2 100644 --- a/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts +++ b/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts @@ -4,6 +4,9 @@ import { resetHardhatContext } from "hardhat/plugins-testing"; import path from "path"; describe("strategies - invocation via helper", () => { + const example32ByteSalt = + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + describe("no Hardhat config setup", () => { const fixtureProjectName = "minimal"; @@ -34,13 +37,13 @@ describe("strategies - invocation via helper", () => { const result = await this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }); assert.equal( await result.foo.getAddress(), - "0xDF310a91C604d3d525A999df6E01A8fFb3AEc406" + "0x647fB9ef6cd97537C553f6cC3c7f60395f81b410" ); }); @@ -96,7 +99,7 @@ describe("strategies - invocation via helper", () => { assert.equal( await result.foo.getAddress(), - "0xDD35866eA6cdfC26eaaBb36b9C70A63d23992125" + "0x8C1c4E6Fd637C7aa7165F19beFeAEab5E53095Bf" ); }); }); diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js index a94fc3c6ea..ddccd293ab 100644 --- a/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js +++ b/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js @@ -5,7 +5,7 @@ module.exports = { ignition: { strategyConfig: { create2: { - salt: "a-random-salt", + salt: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890aaaaaa", }, }, }, diff --git a/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts b/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts index 58c5323527..c4cb7660d0 100644 --- a/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts +++ b/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts @@ -9,6 +9,9 @@ import { IgnitionModuleResultsToViemContracts } from "../../src/ignition-module- import { useIgnitionProject } from "../test-helpers/use-ignition-project"; describe("strategies - invocation via helper", () => { + const example32ByteSalt = + "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef"; + describe("no Hardhat config setup", () => { useIgnitionProject("minimal"); @@ -29,13 +32,13 @@ describe("strategies - invocation via helper", () => { result = await this.hre.ignition.deploy(moduleDefinition, { strategy: "create2", strategyConfig: { - salt: "test-salt", + salt: example32ByteSalt, }, }); assert.equal( result.foo.address, - "0xA851627726C4Cc6150AE804Bcb2BF43BBFC1B3AD" + "0x9318a275A28F46CA742f84402226E27463cA8050" ); }); @@ -81,7 +84,7 @@ describe("strategies - invocation via helper", () => { assert.equal( result.baz.address, - "0x6ad123c48167C25Dc3EfC8320A5Ae3BE72B67419" + "0x8EFE40FAEF47066689Cb06b561F5EC63F9DeA616" ); }); }); diff --git a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts index 02954d1c30..e74f0b7101 100644 --- a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts +++ b/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts @@ -10,7 +10,7 @@ const strategies = ["basic", "create2"] as const; const exampleConfig = { basic: {}, create2: { - salt: "test-salt", + salt: "0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef", }, } as const; From 8d601bf5c071b1f24c57502aa473476849bcfd84 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Wed, 6 Mar 2024 17:31:05 -0300 Subject: [PATCH 1186/1302] Update packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts --- .../src/internal/reconciliation/helpers/reconcile-strategy.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts index 67f796e137..9f1d5de8f1 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts @@ -67,6 +67,8 @@ export function reconcileStrategy( ); } + // We may have an `undefined` strategy config when reading a journal, as + // some previous versions of Ignition didn't set this property const storedStrategyConfig = exState.strategyConfig ?? {}; const newStrategyConfig = context.strategyConfig; From 1939b582429b2c55576eaba62dc4e570cebf7b4f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 7 Mar 2024 18:12:05 +0000 Subject: [PATCH 1187/1302] fix: add strategy errors to whitelist Don't show the stacktrace, show a cleaner HH style error. --- .../hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index eda849cd5f..716266f56b 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -11,7 +11,8 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; const whitelist = [ 200, 201, 202, 203, 204, 403, 404, 405, 406, 600, 601, 602, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, + 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, 1101, + 1102, 1103, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { From d8f3d278422f63b5e8883701668772bd8f22b78a Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 11 Mar 2024 10:40:51 +0000 Subject: [PATCH 1188/1302] fix: use Hardhat 2.20.0 for dev, but keep peer deps the same The Ignition test suite fails on an EDR bug in `v2.21.0`, for dev dependencies we are going to use `2.20.0` until the bug is resolved. The peer dep bound will remain. The test failures are not in Ignition usage, but in our test setup (which is complicated and generates edge cases that EDR is resolving). --- examples/complete/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/package.json | 2 +- examples/viem-sample/package.json | 2 +- package-lock.json | 605 +++++++++++--------- package.json | 2 +- packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/package.json | 3 +- packages/hardhat-plugin-viem/package.json | 3 +- packages/hardhat-plugin/package.json | 2 +- 11 files changed, 332 insertions(+), 295 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 45e8e9912e..958efbdda1 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ens/package.json b/examples/ens/package.json index 8fa7f4c6ee..dc35c55ec5 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" }, "dependencies": { diff --git a/examples/sample/package.json b/examples/sample/package.json index efe6cbac63..fe86d5f512 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index cd6aaf1c52..2ec5f76c64 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 9e6b6ef590..58fec9fc3d 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/package-lock.json b/package-lock.json index 1a60cfa33b..46d95c24ec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "mocha": "^9.1.3", "nyc": "15.1.0", "open-cli": "7.2.0", @@ -60,7 +60,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -73,7 +73,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -83,7 +83,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -93,7 +93,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -103,7 +103,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -273,13 +273,13 @@ "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" }, "node_modules/@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -379,9 +379,9 @@ } }, "node_modules/@babel/core": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz", - "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", + "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -389,11 +389,11 @@ "@babel/generator": "^7.23.6", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.9", - "@babel/parser": "^7.23.9", - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/helpers": "^7.24.0", + "@babel/parser": "^7.24.0", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -550,9 +550,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -610,14 +610,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", - "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", + "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", "dev": true, "dependencies": { - "@babel/template": "^7.23.9", - "@babel/traverse": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -709,9 +709,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", + "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -766,9 +766,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", - "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", + "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -777,23 +777,23 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", + "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", @@ -802,8 +802,8 @@ "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -821,9 +821,9 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", @@ -863,9 +863,9 @@ } }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", - "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dev": true, "dependencies": { "@emotion/memoize": "^0.8.1" @@ -1708,9 +1708,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.56.0.tgz", - "integrity": "sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2667,9 +2667,9 @@ } }, "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", + "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", "engines": { "node": ">=14" } @@ -2700,9 +2700,9 @@ "dev": true }, "node_modules/@fontsource/roboto": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.8.tgz", - "integrity": "sha512-XxPltXs5R31D6UZeLIV1td3wTXU3jzd3f2DLsXI8tytMGBkIsGcc9sIyiupRtA8y73HAhuSCeweOoBqf6DbWCA==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.12.tgz", + "integrity": "sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==", "dev": true }, "node_modules/@humanwhocodes/config-array": { @@ -2862,14 +2862,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -2885,9 +2885,9 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2900,9 +2900,9 @@ "devOptional": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz", - "integrity": "sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -3854,9 +3854,9 @@ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." }, "node_modules/@openzeppelin/contracts": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.5.tgz", - "integrity": "sha512-ZK+W5mVhRppff9BE6YdR8CC52C8zAvsVAiWhEtQ5+oNxFE6h1WdeWo+FJSF8KKvtxxVYZ7MTP/5KoVpAU3aSWg==" + "version": "4.9.6", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", + "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" }, "node_modules/@remix-run/router": { "version": "1.6.0", @@ -3868,9 +3868,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", + "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", "cpu": [ "arm" ], @@ -3882,9 +3882,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", + "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", "cpu": [ "arm64" ], @@ -3896,9 +3896,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", + "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", "cpu": [ "arm64" ], @@ -3910,9 +3910,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", + "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", "cpu": [ "x64" ], @@ -3924,9 +3924,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", + "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", "cpu": [ "arm" ], @@ -3938,9 +3938,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", + "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", "cpu": [ "arm64" ], @@ -3952,9 +3952,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", + "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", "cpu": [ "arm64" ], @@ -3966,9 +3966,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", + "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", "cpu": [ "riscv64" ], @@ -3980,9 +3980,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", + "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", "cpu": [ "x64" ], @@ -3994,9 +3994,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", + "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", "cpu": [ "x64" ], @@ -4008,9 +4008,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", + "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", "cpu": [ "arm64" ], @@ -4022,9 +4022,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", + "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", "cpu": [ "ia32" ], @@ -4036,9 +4036,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", + "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", "cpu": [ "x64" ], @@ -4338,6 +4338,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "change-case": "3.0.2", "fast-check": "3.1.1", @@ -4368,6 +4369,7 @@ "version": "0.1.9", "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "engines": { "node": "^16.20 || ^18.16 || >=20" } @@ -4376,6 +4378,7 @@ "version": "0.17.3", "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "@truffle/abi-utils": "^1.0.3", "@truffle/compile-common": "^0.9.8", @@ -4441,6 +4444,7 @@ "version": "0.9.8", "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "@truffle/error": "^0.2.2", "colors": "1.4.0" @@ -4453,6 +4457,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "engines": { "node": "^16.20 || ^18.16 || >=20" } @@ -4469,6 +4474,7 @@ "version": "3.4.16", "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "ajv": "^6.10.0", "debug": "^4.3.1" @@ -4481,6 +4487,7 @@ "version": "6.0.57", "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "@truffle/codec": "^0.17.3", "@trufflesuite/chromafi": "^3.0.0", @@ -4560,12 +4567,14 @@ "node_modules/@truffle/error": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==" + "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." }, "node_modules/@truffle/interface-adapter": { "version": "0.5.37", "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dependencies": { "bn.js": "^5.1.3", "ethers": "^4.0.32", @@ -5304,9 +5313,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.11", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.11.tgz", - "integrity": "sha512-qQR1dr2rGIHYlJulmr8Ioq3De0Le9E4MJ5AiaeAETJJpndT1uUNHsGFK3L/UIu+rbkQSdj8J/w2bCsBZc/Y5fQ==" + "version": "4.3.12", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", + "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==" }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", @@ -5504,16 +5513,16 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", + "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", "dev": true, "peer": true }, "node_modules/@types/react": { - "version": "18.2.57", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.57.tgz", - "integrity": "sha512-ZvQsktJgSYrQiMirAN60y4O/LRevIV8hUzSOSNB6gfR3/o3wCBFQx3sPwIYtuDMeiVgsSS3UzCV26tEzgnfvQw==", + "version": "18.2.64", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz", + "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -5522,9 +5531,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "version": "18.2.21", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz", + "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==", "dev": true, "dependencies": { "@types/react": "*" @@ -5567,9 +5576,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.7", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz", - "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/sinon": { @@ -6916,9 +6925,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001588", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001588.tgz", - "integrity": "sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==", + "version": "1.0.30001597", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", + "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", "dev": true, "funding": [ { @@ -7077,6 +7086,42 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "extraneous": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "extraneous": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -7800,12 +7845,15 @@ "dev": true }, "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", + "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "^0.10.64", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/d3": { @@ -8658,9 +8706,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.677", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.677.tgz", - "integrity": "sha512-erDa3CaDzwJOpyvfKhOiJjBVNnMM0qxHq47RheVVwsSQrgBA9ZSGV9kdaOfZDPXcHzhG7lBxhj6A7KvfLJBd6Q==", + "version": "1.4.699", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", + "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", "dev": true }, "node_modules/elkjs": { @@ -8710,9 +8758,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", + "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8762,18 +8810,18 @@ } }, "node_modules/es-abstract": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.4.tgz", - "integrity": "sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==", + "version": "1.22.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", + "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.6", + "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.2", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", @@ -8781,15 +8829,15 @@ "globalthis": "^1.0.3", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.1", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", "hasown": "^2.0.1", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", @@ -8802,10 +8850,10 @@ "string.prototype.trim": "^1.2.8", "string.prototype.trimend": "^1.0.7", "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.1", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.5", "unbox-primitive": "^1.0.2", "which-typed-array": "^1.1.14" }, @@ -8882,13 +8930,14 @@ } }, "node_modules/es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "version": "0.10.64", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", + "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", "hasInstallScript": true, "dependencies": { "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.3", + "esniff": "^2.0.1", "next-tick": "^1.1.0" }, "engines": { @@ -8917,12 +8966,15 @@ "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", + "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" + "d": "^1.0.2", + "ext": "^1.7.0" + }, + "engines": { + "node": ">=0.12" } }, "node_modules/esbuild": { @@ -9423,16 +9475,16 @@ } }, "node_modules/eslint": { - "version": "8.56.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.56.0.tgz", - "integrity": "sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.56.0", - "@humanwhocodes/config-array": "^0.11.13", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -9535,9 +9587,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -9765,6 +9817,20 @@ "node": ">=4.0" } }, + "node_modules/esniff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", + "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", + "dependencies": { + "d": "^1.0.1", + "es5-ext": "^0.10.62", + "event-emitter": "^0.3.5", + "type": "^2.7.2" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -10406,6 +10472,15 @@ "npm": ">=3" } }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, "node_modules/eventemitter3": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", @@ -10456,13 +10531,13 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.18.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", + "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.5.0", @@ -10496,29 +10571,6 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, "node_modules/express/node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -10559,20 +10611,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/express/node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/ext": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", @@ -10581,11 +10619,6 @@ "type": "^2.7.2" } }, - "node_modules/ext/node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -10812,9 +10845,9 @@ } }, "node_modules/flatted": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.0.tgz", - "integrity": "sha512-noqGuLw158+DuD9UPRKHpJ2hGxpFyDlYYrfM0mWt4XhT4n0lwzTLh70Tkdyy4kyTmyTT9Bv7bWAJqw7cgkEXDg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/follow-redirects": { @@ -11110,9 +11143,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -11462,9 +11495,9 @@ } }, "node_modules/hardhat": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.1.tgz", - "integrity": "sha512-q75xDQiQtCZcTMBwjTovrXEU5ECr49baxr4/OBkIu/ULTPzlB20yk1dRWNmD2IFbAeAeXggaWvQAdpiScaHtPw==", + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.0.tgz", + "integrity": "sha512-TtWZ4mKOH5YA+PCDAGAjG7Gub2NA+egAX7RIHq5XnGrEALNXAbyP3S0I9vOE1MWCgZhn+XOFUNfDuHgkBOPoRw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", @@ -12087,9 +12120,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dependencies": { "function-bind": "^1.1.2" }, @@ -14385,9 +14418,9 @@ } }, "node_modules/npm-run-path": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.2.0.tgz", - "integrity": "sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", "dev": true, "dependencies": { "path-key": "^4.0.0" @@ -15488,13 +15521,13 @@ ] }, "node_modules/qs": { - "version": "6.11.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", - "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", + "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", "dev": true, "peer": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -16233,9 +16266,9 @@ "dev": true }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", + "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", "dev": true, "peer": true, "dependencies": { @@ -16249,19 +16282,19 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.12.1", + "@rollup/rollup-android-arm64": "4.12.1", + "@rollup/rollup-darwin-arm64": "4.12.1", + "@rollup/rollup-darwin-x64": "4.12.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", + "@rollup/rollup-linux-arm64-gnu": "4.12.1", + "@rollup/rollup-linux-arm64-musl": "4.12.1", + "@rollup/rollup-linux-riscv64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-gnu": "4.12.1", + "@rollup/rollup-linux-x64-musl": "4.12.1", + "@rollup/rollup-win32-arm64-msvc": "4.12.1", + "@rollup/rollup-win32-ia32-msvc": "4.12.1", + "@rollup/rollup-win32-x64-msvc": "4.12.1", "fsevents": "~2.3.2" } }, @@ -16400,13 +16433,13 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz", - "integrity": "sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", - "get-intrinsic": "^1.2.2", + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -16737,16 +16770,16 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -16880,11 +16913,11 @@ } }, "node_modules/side-channel": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.5.tgz", - "integrity": "sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dependencies": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.4", "object-inspect": "^1.13.1" @@ -17068,9 +17101,9 @@ "dev": true }, "node_modules/solidity-coverage": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.7.tgz", - "integrity": "sha512-RzcPuNsIqVGq5F8rjQZPdI2EVdsRU7w2f1Uk1UY567n9eNcg5LSEQ3Q1WFoy9bi/2AD5SYbYK9SS/Nwh2oYbNw==", + "version": "0.8.11", + "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.11.tgz", + "integrity": "sha512-yy0Yk+olovBbXn0Me8BWULmmv7A69ZKkP5aTOJGOO8u61Tu2zS989erfjtFlUjDnfWtxRAVkd8BsQD704yLWHw==", "dev": true, "peer": true, "dependencies": { @@ -18439,9 +18472,9 @@ "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" }, "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" }, "node_modules/type-check": { "version": "0.4.0", @@ -18903,9 +18936,9 @@ } }, "node_modules/viem": { - "version": "2.7.11", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.11.tgz", - "integrity": "sha512-qlEPF9YOgPVqjTyom73TVAekAYrIe68megO07u55p7pKWgLt0i9KD6Mrmiw7pd7oHh86vIppcygwQMDNGX1YAw==", + "version": "2.7.22", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.22.tgz", + "integrity": "sha512-R/d9AkWXkhiNF4Gk4/A389LSO5PGDdHUBFDKIUkhrdLTDpOhKzbNln6qDry3kYUcmH7lErx3C2eA6rajnc0s9A==", "funding": [ { "type": "github", @@ -19624,15 +19657,15 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -19958,7 +19991,7 @@ "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "hardhat": "^2.18.0" + "hardhat": "2.20.0" } }, "packages/core/node_modules/fs-extra": { @@ -20010,7 +20043,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "viem": "^2.7.6" }, "peerDependencies": { @@ -20026,7 +20059,8 @@ "@nomicfoundation/hardhat-ethers": "^3.0.4", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13" + "@types/sinon": "^10.0.13", + "hardhat": "2.20.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -20044,7 +20078,8 @@ "@nomicfoundation/hardhat-viem": "^2.0.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13" + "@types/sinon": "^10.0.13", + "hardhat": "2.20.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.14.0", diff --git a/package.json b/package.json index 28a18c1160..973b3ff01e 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "mocha": "^9.1.3", "nyc": "15.1.0", "open-cli": "7.2.0", diff --git a/packages/core/package.json b/packages/core/package.json index 81f8950a48..a09e8ae7cc 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "hardhat": "^2.18.0" + "hardhat": "2.20.0" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 84f211a9c0..7e0743707f 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -36,7 +36,8 @@ "@nomicfoundation/hardhat-ethers": "^3.0.4", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13" + "@types/sinon": "^10.0.13", + "hardhat": "2.20.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 8adaa8be3d..c73d4a20f4 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -37,7 +37,8 @@ "@nomicfoundation/hardhat-viem": "^2.0.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13" + "@types/sinon": "^10.0.13", + "hardhat": "2.20.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.14.0", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index c37d2540d1..b7ab6428dc 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -51,7 +51,7 @@ "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", "@nomicfoundation/hardhat-network-helpers": "1.0.9", - "hardhat": "^2.18.0", + "hardhat": "2.20.0", "viem": "^2.7.6" }, "peerDependencies": { From 6a2bf9fba8cc2e4c64f8a65efbf8051f43e2fa0e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 7 Mar 2024 13:13:23 +0000 Subject: [PATCH 1189/1302] chore: bump version to v0.15.0 Update the packages versions and changelogs for the `0.15.0 - 2024-03-13` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/viem-sample/hardhat.config.ts | 3 +- examples/viem-sample/package.json | 8 +- examples/viem-sample/test/Lock.ts | 7 +- package-lock.json | 285 +++++--------------- packages/core/CHANGELOG.md | 6 + packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 6 + packages/hardhat-plugin-ethers/package.json | 6 +- packages/hardhat-plugin-viem/CHANGELOG.md | 6 + packages/hardhat-plugin-viem/package.json | 6 +- packages/hardhat-plugin/CHANGELOG.md | 6 + packages/hardhat-plugin/package.json | 6 +- packages/ui/package.json | 4 +- 17 files changed, 127 insertions(+), 240 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 958efbdda1..1dfa514d9a 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.14.0", + "version": "0.15.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index dc35c55ec5..9b6a7483d4 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.14.0", + "version": "0.15.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index fe86d5f512..8802b05cf2 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.14.0", + "version": "0.15.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 2ec5f76c64..698407dd26 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.14.0", + "version": "0.15.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/hardhat.config.ts b/examples/viem-sample/hardhat.config.ts index 9ca2baa5a9..c5835f79f4 100644 --- a/examples/viem-sample/hardhat.config.ts +++ b/examples/viem-sample/hardhat.config.ts @@ -1,7 +1,8 @@ import type { HardhatUserConfig } from "hardhat/types"; -import "@nomicfoundation/hardhat-toolbox-viem"; +import "@nomicfoundation/hardhat-chai-matchers"; import "@nomicfoundation/hardhat-ignition-viem"; +import "@nomicfoundation/hardhat-viem"; const config: HardhatUserConfig = { solidity: "0.8.19", diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 58fec9fc3d..d4ce19781b 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.14.0", + "version": "0.15.0", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,8 +10,10 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", - "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.15.0", + "@nomicfoundation/hardhat-network-helpers": "1.0.10", + "@nomicfoundation/hardhat-viem": "2.0.0", + "chai": "4.4.1", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } diff --git a/examples/viem-sample/test/Lock.ts b/examples/viem-sample/test/Lock.ts index 332dd3bf87..757527f691 100644 --- a/examples/viem-sample/test/Lock.ts +++ b/examples/viem-sample/test/Lock.ts @@ -1,8 +1,5 @@ -import { - time, - loadFixture, -} from "@nomicfoundation/hardhat-toolbox-viem/network-helpers"; -import { expect, assert } from "chai"; +import { loadFixture, time } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; import hre from "hardhat"; import LockModule from "../ignition/modules/LockModule"; diff --git a/package-lock.json b/package-lock.json index 46d95c24ec..7c5dc82988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.14.0", + "version": "0.15.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" @@ -66,12 +66,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.14.0", + "version": "0.15.0", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" @@ -79,9 +79,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.14.0", + "version": "0.15.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" @@ -89,9 +89,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.14.0", + "version": "0.15.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.14.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" @@ -99,163 +99,26 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.14.0", + "version": "0.15.0", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.14.0", - "@nomicfoundation/hardhat-toolbox-viem": "2.0.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.15.0", + "@nomicfoundation/hardhat-network-helpers": "1.0.10", + "@nomicfoundation/hardhat-viem": "2.0.0", + "chai": "4.4.1", "hardhat": "2.20.0", "prettier-plugin-solidity": "1.1.3" } }, - "examples/viem-sample/node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==", - "dev": true, - "peer": true - }, - "examples/viem-sample/node_modules/@nomicfoundation/hardhat-toolbox-viem": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox-viem/-/hardhat-toolbox-viem-2.0.0.tgz", - "integrity": "sha512-1bxTaC+PcbdctwgP/AvmKJGQTeLoT2kJtAfaDvt5PbL3esZ1EO+pfoBkpliP3DJSNESLSqAjVN1yIFxoLJmiBg==", - "dev": true, - "dependencies": { - "chai-as-promised": "^7.1.1" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", - "@nomicfoundation/hardhat-viem": "^1.0.0", - "@types/chai": "^4.2.0", - "@types/chai-as-promised": "^7.1.6", - "@types/mocha": ">=9.1.0", - "@types/node": ">=16.0.0", - "chai": "^4.2.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typescript": "~5.0.4", - "viem": "^1.15.1" - } - }, - "examples/viem-sample/node_modules/@nomicfoundation/hardhat-viem": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-1.0.4.tgz", - "integrity": "sha512-6coot+y0y6d75DG33zAdgXlktNp1MRy2B3vDjqlRBaubqlocYak+BSyryiv76F9JuLLgNSxkxTIZCd24h9gKcQ==", - "dev": true, - "peer": true, - "dependencies": { - "abitype": "^0.9.8", - "lodash.memoize": "^4.1.2" - }, - "peerDependencies": { - "hardhat": "^2.17.0", - "typescript": "~5.0.0", - "viem": "^1.15.1" - } - }, - "examples/viem-sample/node_modules/abitype": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", - "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "peer": true, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "examples/viem-sample/node_modules/viem": { - "version": "1.21.4", - "resolved": "https://registry.npmjs.org/viem/-/viem-1.21.4.tgz", - "integrity": "sha512-BNVYdSaUjeS2zKQgPs+49e5JKocfo60Ib2yiXOWBT6LuVxY1I/6fFX3waEtpXvL1Xn4qu+BVitVtMh9lyThyhQ==", + "examples/viem-sample/node_modules/@nomicfoundation/hardhat-network-helpers": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", + "integrity": "sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "peer": true, "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "0.9.8", - "isows": "1.0.3", - "ws": "8.13.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "examples/viem-sample/node_modules/viem/node_modules/abitype": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.8.tgz", - "integrity": "sha512-puLifILdm+8sjyss4S+fsUN09obiT1g2YW6CtcQF+QDzxR0euzgEB29MZujC6zMk2a6SVmtttq1fc6+YFA7WYQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "peer": true, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.19.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "examples/viem-sample/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.0.0" + "ethereumjs-util": "^7.1.4" }, "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "hardhat": "^2.9.5" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -3515,30 +3378,6 @@ "viem": "^2.7.6" } }, - "node_modules/@nomicfoundation/hardhat-viem/node_modules/abitype": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", - "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, "node_modules/@nomicfoundation/ignition-complete-example": { "resolved": "examples/complete", "link": true @@ -4308,11 +4147,10 @@ "dev": true }, "node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", + "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", "dev": true, - "peer": true, "dependencies": { "antlr4ts": "^0.5.0-alpha.4" } @@ -5862,12 +5700,16 @@ "peer": true }, "node_modules/abitype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", + "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/wagmi-dev" + } + ], "peerDependencies": { "typescript": ">=5.0.4", "zod": "^3 >=3.22.0" @@ -10045,6 +9887,16 @@ "@scure/base": "~1.1.0" } }, + "node_modules/eth-gas-reporter/node_modules/@solidity-parser/parser": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", + "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", + "dev": true, + "peer": true, + "dependencies": { + "antlr4ts": "^0.5.0-alpha.4" + } + }, "node_modules/eth-gas-reporter/node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -15387,15 +15239,6 @@ "prettier": ">=2.3.0 || >=3.0.0-alpha.0" } }, - "node_modules/prettier-plugin-solidity/node_modules/@solidity-parser/parser": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", - "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -18969,6 +18812,26 @@ "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" }, + "node_modules/viem/node_modules/abitype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", + "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", + "funding": { + "url": "https://github.com/sponsors/wevm" + }, + "peerDependencies": { + "typescript": ">=5.0.4", + "zod": "^3 >=3.22.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "zod": { + "optional": true + } + } + }, "node_modules/viem/node_modules/ws": { "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", @@ -19976,7 +19839,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -20028,11 +19891,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.14.0", - "@nomicfoundation/ignition-ui": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-ui": "^0.15.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -20053,7 +19916,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -20064,15 +19927,15 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.14.0", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/hardhat-ignition": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^2.0.0", @@ -20082,9 +19945,9 @@ "hardhat": "2.20.0" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.14.0", + "@nomicfoundation/hardhat-ignition": "^0.15.0", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", "hardhat": "^2.18.0", "viem": "^2.7.6" } @@ -20123,10 +19986,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.14.0", + "version": "0.15.0", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index ca2145391a..6db0c5b7ab 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + ## 0.13.2 - 2024-01-25 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index a09e8ae7cc..4c2dd82cc8 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 76a4944cb9..f17ef6ad56 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + ## 0.13.2 - 2024-01-25 ### Fixed diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 7e0743707f..699a1b1a1c 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -41,8 +41,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.14.0", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/hardhat-ignition": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.0", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 637cc3f2b2..6cfda2dd8b 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + ## 0.14.0 - 2024-02-21 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index c73d4a20f4..1ef367675e 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -41,9 +41,9 @@ "hardhat": "2.20.0" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.14.0", + "@nomicfoundation/hardhat-ignition": "^0.15.0", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", "hardhat": "^2.18.0", "viem": "^2.7.6" } diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index eaad8fce19..31b8b7dd17 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.0 - 2024-03-13 + +### Added + +- Support `create2` through strategies, for more details see [our `create2` guide](https://hardhat.org/ignition/docs/guides/create2). ([#629](https://github.com/NomicFoundation/hardhat-ignition/issues/629)) + ## 0.14.0 - 2024-02-21 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index b7ab6428dc..2c12fafc32 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.14.0", + "version": "0.15.0", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -59,8 +59,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.14.0", - "@nomicfoundation/ignition-ui": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-ui": "^0.15.0", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 3a064f6d69..7a5bfb96e4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.14.0", + "version": "0.15.0", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -17,7 +17,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.14.0", + "@nomicfoundation/ignition-core": "^0.15.0", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From a05a32fb0beb754f64a814c7537ee4c176b2f1b6 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 12 Mar 2024 02:10:22 -0400 Subject: [PATCH 1190/1302] use only required sources for verification --- package-lock.json | 37 +------------------------------ packages/core/package.json | 1 + packages/core/src/verify.ts | 43 ++++++++++++++++++++++++++++++++----- 3 files changed, 40 insertions(+), 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7c5dc82988..3dfc4db4e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6928,42 +6928,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "extraneous": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "extraneous": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -19843,6 +19807,7 @@ "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", "cbor": "^9.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/core/package.json b/packages/core/package.json index 4c2dd82cc8..619096662c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -52,6 +52,7 @@ }, "dependencies": { "@ethersproject/address": "5.6.1", + "@nomicfoundation/solidity-analyzer": "^0.1.1", "cbor": "^9.0.0", "debug": "^4.3.2", "ethers": "^6.7.0", diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index adcb9630a4..4a2eeeb1c6 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -1,3 +1,6 @@ +import { analyze } from "@nomicfoundation/solidity-analyzer"; +import path from "path"; + import { IgnitionError } from "./errors"; import { builtinChains } from "./internal/chain-config"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; @@ -13,7 +16,7 @@ import { } from "./internal/execution/types/execution-state"; import { assertIgnitionInvariant } from "./internal/utils/assertions"; import { findExecutionStatesByType } from "./internal/views/find-execution-states-by-type"; -import { Artifact, BuildInfo } from "./types/artifact"; +import { Artifact, BuildInfo, CompilerInput } from "./types/artifact"; import { ChainConfig, SourceToLibraryToAddress, @@ -87,6 +90,23 @@ function resolveChainConfig( return chainConfig; } +function getImportSourceNames( + sourceName: string, + buildInfo: BuildInfo +): string[] { + const contractSource = buildInfo.input.sources[sourceName].content; + const { imports } = analyze(contractSource); + + const importSources = imports.map((i) => + path.join(path.dirname(sourceName), i) + ); + + return [ + ...importSources, + ...importSources.flatMap((i) => getImportSourceNames(i, buildInfo)), + ]; +} + async function convertExStateToVerifyInfo( exState: DeploymentExecutionState, deploymentLoader: FileDeploymentLoader @@ -104,12 +124,25 @@ async function convertExStateToVerifyInfo( `Deployment execution state ${exState.id} should have a successful result to retrieve address` ); + const sourceCode = prepareInputBasedOn(buildInfo, artifact, libraries); + + const sourceNames = [ + artifact.sourceName, + ...getImportSourceNames(artifact.sourceName, buildInfo), + ]; + + for (const source of Object.keys(sourceCode.sources)) { + if (!sourceNames.includes(source)) { + delete sourceCode.sources[source]; + } + } + const verifyInfo = { address: exState.result.address, compilerVersion: buildInfo.solcLongVersion.startsWith("v") ? buildInfo.solcLongVersion : `v${buildInfo.solcLongVersion}`, - sourceCode: prepareInputBasedOn(buildInfo, artifact, libraries), + sourceCode: JSON.stringify(sourceCode), name: `${artifact.sourceName}:${contractName}`, args: encodeDeploymentArguments(artifact, constructorArgs), }; @@ -121,20 +154,20 @@ function prepareInputBasedOn( buildInfo: BuildInfo, artifact: Artifact, libraries: Record -): string { +): CompilerInput { const sourceToLibraryAddresses = resolveLibraryInfoForArtifact( artifact, libraries ); if (sourceToLibraryAddresses === null) { - return JSON.stringify(buildInfo.input); + return buildInfo.input; } const { input } = buildInfo; input.settings.libraries = sourceToLibraryAddresses; - return JSON.stringify(input); + return input; } function resolveLibraryInfoForArtifact( From 7df96a425c087eacc674779629fd50b63ab79201 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 12 Mar 2024 23:47:07 -0400 Subject: [PATCH 1191/1302] test min verification input --- .../artifacts/LockModule#TestA.dbg.json | 4 + .../min-input/artifacts/LockModule#TestA.json | 49 + .../artifacts/LockModule#TestB.dbg.json | 4 + .../min-input/artifacts/LockModule#TestB.json | 69 + .../artifacts/LockModule#TestC.dbg.json | 4 + .../min-input/artifacts/LockModule#TestC.json | 53 + .../artifacts/LockModule#TestD.dbg.json | 4 + .../min-input/artifacts/LockModule#TestD.json | 35 + .../5a5467b3a2cddf6ce0f79584095e02d2.json | 6447 +++++++++++++++++ .../verify/min-input/deployed_addresses.json | 6 + .../test/mocks/verify/min-input/journal.jsonl | 22 + packages/core/test/verify.ts | 34 + 12 files changed, 6731 insertions(+) create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json create mode 100644 packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json create mode 100644 packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json create mode 100644 packages/core/test/mocks/verify/min-input/deployed_addresses.json create mode 100644 packages/core/test/mocks/verify/min-input/journal.jsonl diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json new file mode 100644 index 0000000000..73e30e3813 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/5a5467b3a2cddf6ce0f79584095e02d2.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json new file mode 100644 index 0000000000..9bf91a2932 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json @@ -0,0 +1,49 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestA", + "sourceName": "contracts/TestA.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b5060405161025c38038061025c833981810160405281019061003291906100f6565b8173__$9fa3a4b36eea03935ac7879fed7cda438e$__63cad0899b9091836040518363ffffffff1660e01b815260040161006d929190610145565b602060405180830381865af415801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae919061016e565b600081905550505061019b565b600080fd5b6000819050919050565b6100d3816100c0565b81146100de57600080fd5b50565b6000815190506100f0816100ca565b92915050565b6000806040838503121561010d5761010c6100bb565b5b600061011b858286016100e1565b925050602061012c858286016100e1565b9150509250929050565b61013f816100c0565b82525050565b600060408201905061015a6000830185610136565b6101676020830184610136565b9392505050565b600060208284031215610184576101836100bb565b5b6000610192848285016100e1565b91505092915050565b60b3806101a96000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063853255cc14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea2646970667358221220ed8950fa3d7184d2692eb6136b1815845d0f7c330e78b5948e12f2e35fd9b24564736f6c63430008130033", + "deployedBytecode": "0x6080604052348015600f57600080fd5b506004361060285760003560e01c8063853255cc14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea2646970667358221220ed8950fa3d7184d2692eb6136b1815845d0f7c330e78b5948e12f2e35fd9b24564736f6c63430008130033", + "linkReferences": { + "contracts/TestB.sol": { + "TestB": [ + { + "length": 20, + "start": 53 + } + ] + } + }, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json new file mode 100644 index 0000000000..73e30e3813 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/5a5467b3a2cddf6ce0f79584095e02d2.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json new file mode 100644 index 0000000000..83d7b1f6b6 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json @@ -0,0 +1,69 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestB", + "sourceName": "contracts/TestB.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6102ad610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906101a2565b61006a565b60405161006191906101f1565b60405180910390f35b600073__$a77b74ebd34224ac3c3a582e4bc24622f4$__63cad0899b8473__$3fa06892d414312f70326060dfc06e0087$__63cad0899b87876040518363ffffffff1660e01b81526004016100c092919061020c565b602060405180830381865af41580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061024a565b6040518363ffffffff1660e01b815260040161011e92919061020c565b602060405180830381865af415801561013b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015f919061024a565b905092915050565b600080fd5b6000819050919050565b61017f8161016c565b811461018a57600080fd5b50565b60008135905061019c81610176565b92915050565b600080604083850312156101b9576101b8610167565b5b60006101c78582860161018d565b92505060206101d88582860161018d565b9150509250929050565b6101eb8161016c565b82525050565b600060208201905061020660008301846101e2565b92915050565b600060408201905061022160008301856101e2565b61022e60208301846101e2565b9392505050565b60008151905061024481610176565b92915050565b6000602082840312156102605761025f610167565b5b600061026e84828501610235565b9150509291505056fea264697066735822122056e067cbff0f6f4b44115fa7c682e899221992ed439b30cd21e26a9ad4faac2664736f6c63430008130033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906101a2565b61006a565b60405161006191906101f1565b60405180910390f35b600073__$a77b74ebd34224ac3c3a582e4bc24622f4$__63cad0899b8473__$3fa06892d414312f70326060dfc06e0087$__63cad0899b87876040518363ffffffff1660e01b81526004016100c092919061020c565b602060405180830381865af41580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061024a565b6040518363ffffffff1660e01b815260040161011e92919061020c565b602060405180830381865af415801561013b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015f919061024a565b905092915050565b600080fd5b6000819050919050565b61017f8161016c565b811461018a57600080fd5b50565b60008135905061019c81610176565b92915050565b600080604083850312156101b9576101b8610167565b5b60006101c78582860161018d565b92505060206101d88582860161018d565b9150509250929050565b6101eb8161016c565b82525050565b600060208201905061020660008301846101e2565b92915050565b600060408201905061022160008301856101e2565b61022e60208301846101e2565b9392505050565b60008151905061024481610176565b92915050565b6000602082840312156102605761025f610167565b5b600061026e84828501610235565b9150509291505056fea264697066735822122056e067cbff0f6f4b44115fa7c682e899221992ed439b30cd21e26a9ad4faac2664736f6c63430008130033", + "linkReferences": { + "contracts/TestC.sol": { + "TestC": [ + { + "length": 20, + "start": 193 + } + ] + }, + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 220 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/TestC.sol": { + "TestC": [ + { + "length": 20, + "start": 110 + } + ] + }, + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 137 + } + ] + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json new file mode 100644 index 0000000000..73e30e3813 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/5a5467b3a2cddf6ce0f79584095e02d2.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json new file mode 100644 index 0000000000..77824bb077 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json @@ -0,0 +1,53 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestC", + "sourceName": "contracts/TestC.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x610234610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f9190610129565b61006a565b6040516100619190610178565b60405180910390f35b600073__$3fa06892d414312f70326060dfc06e0087$__63cad0899b84846040518363ffffffff1660e01b81526004016100a5929190610193565b602060405180830381865af41580156100c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e691906101d1565b905092915050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080604083850312156101405761013f6100ee565b5b600061014e85828601610114565b925050602061015f85828601610114565b9150509250929050565b610172816100f3565b82525050565b600060208201905061018d6000830184610169565b92915050565b60006040820190506101a86000830185610169565b6101b56020830184610169565b9392505050565b6000815190506101cb816100fd565b92915050565b6000602082840312156101e7576101e66100ee565b5b60006101f5848285016101bc565b9150509291505056fea264697066735822122024415ac821281eba4a04ac4443e09eab95a2381de7e62a3a62fe726c54e8a3d764736f6c63430008130033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f9190610129565b61006a565b6040516100619190610178565b60405180910390f35b600073__$3fa06892d414312f70326060dfc06e0087$__63cad0899b84846040518363ffffffff1660e01b81526004016100a5929190610193565b602060405180830381865af41580156100c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e691906101d1565b905092915050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080604083850312156101405761013f6100ee565b5b600061014e85828601610114565b925050602061015f85828601610114565b9150509250929050565b610172816100f3565b82525050565b600060208201905061018d6000830184610169565b92915050565b60006040820190506101a86000830185610169565b6101b56020830184610169565b9392505050565b6000815190506101cb816100fd565b92915050565b6000602082840312156101e7576101e66100ee565b5b60006101f5848285016101bc565b9150509291505056fea264697066735822122024415ac821281eba4a04ac4443e09eab95a2381de7e62a3a62fe726c54e8a3d764736f6c63430008130033", + "linkReferences": { + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 193 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 110 + } + ] + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json new file mode 100644 index 0000000000..73e30e3813 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/5a5467b3a2cddf6ce0f79584095e02d2.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json new file mode 100644 index 0000000000..bc8c268b24 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TestD", + "sourceName": "contracts/TestD.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101be610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b604051610061919061010a565b60405180910390f35b600081836100789190610154565b905092915050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b600080604083850312156100d2576100d1610080565b5b60006100e0858286016100a6565b92505060206100f1858286016100a6565b9150509250929050565b61010481610085565b82525050565b600060208201905061011f60008301846100fb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061015f82610085565b915061016a83610085565b925082820190508082111561018257610181610125565b5b9291505056fea2646970667358221220132f489f22fe1764834a50b94361c88c1986db1d16da50230adbb6f8364226fe64736f6c63430008130033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b604051610061919061010a565b60405180910390f35b600081836100789190610154565b905092915050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b600080604083850312156100d2576100d1610080565b5b60006100e0858286016100a6565b92505060206100f1858286016100a6565b9150509250929050565b61010481610085565b82525050565b600060208201905061011f60008301846100fb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061015f82610085565b915061016a83610085565b925082820190508082111561018257610181610125565b5b9291505056fea2646970667358221220132f489f22fe1764834a50b94361c88c1986db1d16da50230adbb6f8364226fe64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json b/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json new file mode 100644 index 0000000000..9d81c4d155 --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json @@ -0,0 +1,6447 @@ +{ + "id": "5a5467b3a2cddf6ce0f79584095e02d2", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/TestA.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\n// a;slkdjfalfdsa\npragma solidity ^0.8.9;\n\nimport \"./TestB.sol\";\n\nusing TestB for uint;\n\ncontract TestA {\n uint public sum;\n\n constructor(uint _a, uint _b) {\n sum = _a.sum(_b);\n }\n}\n" + }, + "contracts/TestB.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\n// asdffdsa\npragma solidity ^0.8.9;\n\nimport \"./TestC.sol\";\nimport \"./TestD.sol\";\n\nlibrary TestB {\n function sum(uint a, uint b) public pure returns (uint) {\n return TestC.sum(a, TestD.sum(a, b));\n }\n}\n" + }, + "contracts/TestC.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\nimport \"./TestD.sol\";\n\nlibrary TestC {\n function sum(uint a, uint b) public pure returns (uint) {\n return TestD.sum(a, b);\n }\n}\n" + }, + "contracts/TestD.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\nlibrary TestD {\n function sum(uint a, uint b) public pure returns (uint) {\n return a + b;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/TestA.sol": { + "ast": { + "absolutePath": "contracts/TestA.sol", + "exportedSymbols": { + "TestA": [ + 23 + ], + "TestB": [ + 48 + ], + "TestC": [ + 68 + ], + "TestD": [ + 85 + ] + }, + "id": 24, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "57:23:0" + }, + { + "absolutePath": "contracts/TestB.sol", + "file": "./TestB.sol", + "id": 2, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 24, + "sourceUnit": 49, + "src": "82:21:0", + "symbolAliases": [], + "unitAlias": "" + }, + { + "global": false, + "id": 5, + "libraryName": { + "id": 3, + "name": "TestB", + "nameLocations": [ + "111:5:0" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 48, + "src": "111:5:0" + }, + "nodeType": "UsingForDirective", + "src": "105:21:0", + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "121:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "TestA", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 23, + "linearizedBaseContracts": [ + 23 + ], + "name": "TestA", + "nameLocation": "137:5:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "853255cc", + "id": 7, + "mutability": "mutable", + "name": "sum", + "nameLocation": "159:3:0", + "nodeType": "VariableDeclaration", + "scope": 23, + "src": "147:15:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "147:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "body": { + "id": 21, + "nodeType": "Block", + "src": "197:27:0", + "statements": [ + { + "expression": { + "id": 19, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14, + "name": "sum", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "203:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "id": 17, + "name": "_b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11, + "src": "216:2:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 15, + "name": "_a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "209:2:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 16, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "212:3:0", + "memberName": "sum", + "nodeType": "MemberAccess", + "referencedDeclaration": 47, + "src": "209:6:0", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$attached_to$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "209:10:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "203:16:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 20, + "nodeType": "ExpressionStatement", + "src": "203:16:0" + } + ] + }, + "id": 22, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 12, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 9, + "mutability": "mutable", + "name": "_a", + "nameLocation": "184:2:0", + "nodeType": "VariableDeclaration", + "scope": 22, + "src": "179:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "179:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 11, + "mutability": "mutable", + "name": "_b", + "nameLocation": "193:2:0", + "nodeType": "VariableDeclaration", + "scope": 22, + "src": "188:7:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 10, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "188:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "178:18:0" + }, + "returnParameters": { + "id": 13, + "nodeType": "ParameterList", + "parameters": [], + "src": "197:0:0" + }, + "scope": 23, + "src": "167:57:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 24, + "src": "128:98:0", + "usedErrors": [] + } + ], + "src": "57:170:0" + }, + "id": 0 + }, + "contracts/TestB.sol": { + "ast": { + "absolutePath": "contracts/TestB.sol", + "exportedSymbols": { + "TestB": [ + 48 + ], + "TestC": [ + 68 + ], + "TestD": [ + 85 + ] + }, + "id": 49, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 25, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "51:23:1" + }, + { + "absolutePath": "contracts/TestC.sol", + "file": "./TestC.sol", + "id": 26, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 49, + "sourceUnit": 69, + "src": "76:21:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "absolutePath": "contracts/TestD.sol", + "file": "./TestD.sol", + "id": 27, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 49, + "sourceUnit": 86, + "src": "98:21:1", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "TestB", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 48, + "linearizedBaseContracts": [ + 48 + ], + "name": "TestB", + "nameLocation": "129:5:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 46, + "nodeType": "Block", + "src": "195:47:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 38, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 29, + "src": "218:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "arguments": [ + { + "id": 41, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 29, + "src": "231:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 42, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 31, + "src": "234:1:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 39, + "name": "TestD", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 85, + "src": "221:5:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_TestD_$85_$", + "typeString": "type(library TestD)" + } + }, + "id": 40, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "227:3:1", + "memberName": "sum", + "nodeType": "MemberAccess", + "referencedDeclaration": 84, + "src": "221:9:1", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "221:15:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 36, + "name": "TestC", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 68, + "src": "208:5:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_TestC_$68_$", + "typeString": "type(library TestC)" + } + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "214:3:1", + "memberName": "sum", + "nodeType": "MemberAccess", + "referencedDeclaration": 67, + "src": "208:9:1", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 44, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "208:29:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 35, + "id": 45, + "nodeType": "Return", + "src": "201:36:1" + } + ] + }, + "functionSelector": "cad0899b", + "id": 47, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sum", + "nameLocation": "148:3:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 32, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 29, + "mutability": "mutable", + "name": "a", + "nameLocation": "157:1:1", + "nodeType": "VariableDeclaration", + "scope": 47, + "src": "152:6:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 28, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "152:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 31, + "mutability": "mutable", + "name": "b", + "nameLocation": "165:1:1", + "nodeType": "VariableDeclaration", + "scope": 47, + "src": "160:6:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 30, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "160:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "151:16:1" + }, + "returnParameters": { + "id": 35, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 34, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 47, + "src": "189:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 33, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "189:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "188:6:1" + }, + "scope": 48, + "src": "139:103:1", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 49, + "src": "121:123:1", + "usedErrors": [] + } + ], + "src": "51:194:1" + }, + "id": 1 + }, + "contracts/TestC.sol": { + "ast": { + "absolutePath": "contracts/TestC.sol", + "exportedSymbols": { + "TestC": [ + 68 + ], + "TestD": [ + 85 + ] + }, + "id": 69, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 50, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:2" + }, + { + "absolutePath": "contracts/TestD.sol", + "file": "./TestD.sol", + "id": 51, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 69, + "sourceUnit": 86, + "src": "64:21:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "TestC", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 68, + "linearizedBaseContracts": [ + 68 + ], + "name": "TestC", + "nameLocation": "95:5:2", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 66, + "nodeType": "Block", + "src": "161:33:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "id": 62, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 53, + "src": "184:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "id": 63, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 55, + "src": "187:1:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 60, + "name": "TestD", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 85, + "src": "174:5:2", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_contract$_TestD_$85_$", + "typeString": "type(library TestD)" + } + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "180:3:2", + "memberName": "sum", + "nodeType": "MemberAccess", + "referencedDeclaration": 84, + "src": "174:9:2", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$", + "typeString": "function (uint256,uint256) pure returns (uint256)" + } + }, + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "174:15:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 59, + "id": 65, + "nodeType": "Return", + "src": "167:22:2" + } + ] + }, + "functionSelector": "cad0899b", + "id": 67, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sum", + "nameLocation": "114:3:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 56, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 53, + "mutability": "mutable", + "name": "a", + "nameLocation": "123:1:2", + "nodeType": "VariableDeclaration", + "scope": 67, + "src": "118:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 52, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "118:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 55, + "mutability": "mutable", + "name": "b", + "nameLocation": "131:1:2", + "nodeType": "VariableDeclaration", + "scope": 67, + "src": "126:6:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 54, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "126:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "117:16:2" + }, + "returnParameters": { + "id": 59, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 58, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 67, + "src": "155:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 57, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "155:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "154:6:2" + }, + "scope": 68, + "src": "105:89:2", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 69, + "src": "87:109:2", + "usedErrors": [] + } + ], + "src": "39:158:2" + }, + "id": 2 + }, + "contracts/TestD.sol": { + "ast": { + "absolutePath": "contracts/TestD.sol", + "exportedSymbols": { + "TestD": [ + 85 + ] + }, + "id": 86, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 70, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:3" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "TestD", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 85, + "linearizedBaseContracts": [ + 85 + ], + "name": "TestD", + "nameLocation": "72:5:3", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 83, + "nodeType": "Block", + "src": "138:23:3", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 81, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 79, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 72, + "src": "151:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 80, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 74, + "src": "155:1:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "151:5:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 78, + "id": 82, + "nodeType": "Return", + "src": "144:12:3" + } + ] + }, + "functionSelector": "cad0899b", + "id": 84, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "sum", + "nameLocation": "91:3:3", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 75, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 72, + "mutability": "mutable", + "name": "a", + "nameLocation": "100:1:3", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "95:6:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 71, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "95:4:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 74, + "mutability": "mutable", + "name": "b", + "nameLocation": "108:1:3", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "103:6:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 73, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "103:4:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "94:16:3" + }, + "returnParameters": { + "id": 78, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 77, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 84, + "src": "132:4:3", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 76, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "132:4:3", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "131:6:3" + }, + "scope": 85, + "src": "82:79:3", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 86, + "src": "64:99:3", + "usedErrors": [] + } + ], + "src": "39:125:3" + }, + "id": 3 + } + }, + "contracts": { + "contracts/TestA.sol": { + "TestA": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_b", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_22": { + "entryPoint": null, + "id": 22, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 225, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 366, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256_fromMemory": { + "entryPoint": 246, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 310, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed": { + "entryPoint": 325, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 192, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 187, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 202, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2055:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:4", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:4" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:4" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:4", + "type": "" + } + ], + "src": "7:75:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:4" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:4" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:4", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:4" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:4" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:4", + "type": "" + } + ], + "src": "334:77:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:4" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:4" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:4" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:4" + }, + "nodeType": "YulIf", + "src": "470:63:4" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:4", + "type": "" + } + ], + "src": "417:122:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:4" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:4" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:4", + "type": "" + } + ], + "src": "545:143:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "788:413:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "834:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "836:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "836:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "836:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "809:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "818:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "805:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "805:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "830:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "801:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "801:32:4" + }, + "nodeType": "YulIf", + "src": "798:119:4" + }, + { + "nodeType": "YulBlock", + "src": "927:128:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "942:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "956:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "946:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "971:74:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1017:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1028:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1013:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1013:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1037:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "981:31:4" + }, + "nodeType": "YulFunctionCall", + "src": "981:64:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "971:6:4" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1065:129:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1080:16:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1094:2:4", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1084:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1110:74:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1156:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1167:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1152:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1152:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1176:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "1120:31:4" + }, + "nodeType": "YulFunctionCall", + "src": "1120:64:4" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1110:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "750:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "761:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "773:6:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "781:6:4", + "type": "" + } + ], + "src": "694:507:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1280:53:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1297:3:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1320:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1302:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1302:24:4" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1290:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1290:37:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1290:37:4" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1268:5:4", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1275:3:4", + "type": "" + } + ], + "src": "1207:126:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1473:222:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1483:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1495:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1506:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1491:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1491:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1483:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1571:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1584:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1595:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1580:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1580:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1519:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1519:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1519:79:4" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1660:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1673:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1684:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1669:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1669:18:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1608:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1608:80:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1608:80:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1437:9:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1449:6:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1457:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1468:4:4", + "type": "" + } + ], + "src": "1339:356:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1778:274:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1824:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "1826:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "1826:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1826:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1799:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1808:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1795:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1795:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1820:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1791:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1791:32:4" + }, + "nodeType": "YulIf", + "src": "1788:119:4" + }, + { + "nodeType": "YulBlock", + "src": "1917:128:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1932:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1946:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1936:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1961:74:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2007:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2018:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2003:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2003:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2027:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "1971:31:4" + }, + "nodeType": "YulFunctionCall", + "src": "1971:64:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1961:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1748:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1759:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1771:6:4", + "type": "" + } + ], + "src": "1701:351:4" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256_fromMemory(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value1, add(headStart, 32))\n\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 4, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": { + "contracts/TestB.sol": { + "TestB": [ + { + "length": 20, + "start": 53 + } + ] + } + }, + "object": "608060405234801561001057600080fd5b5060405161025c38038061025c833981810160405281019061003291906100f6565b8173__$9fa3a4b36eea03935ac7879fed7cda438e$__63cad0899b9091836040518363ffffffff1660e01b815260040161006d929190610145565b602060405180830381865af415801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae919061016e565b600081905550505061019b565b600080fd5b6000819050919050565b6100d3816100c0565b81146100de57600080fd5b50565b6000815190506100f0816100ca565b92915050565b6000806040838503121561010d5761010c6100bb565b5b600061011b858286016100e1565b925050602061012c858286016100e1565b9150509250929050565b61013f816100c0565b82525050565b600060408201905061015a6000830185610136565b6101676020830184610136565b9392505050565b600060208284031215610184576101836100bb565b5b6000610192848285016100e1565b91505092915050565b60b3806101a96000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063853255cc14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea2646970667358221220ed8950fa3d7184d2692eb6136b1815845d0f7c330e78b5948e12f2e35fd9b24564736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x25C CODESIZE SUB DUP1 PUSH2 0x25C DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x32 SWAP2 SWAP1 PUSH2 0xF6 JUMP JUMPDEST DUP2 PUSH20 0x0 PUSH4 0xCAD0899B SWAP1 SWAP2 DUP4 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x6D SWAP3 SWAP2 SWAP1 PUSH2 0x145 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x8A JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xAE SWAP2 SWAP1 PUSH2 0x16E JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP POP PUSH2 0x19B JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xD3 DUP2 PUSH2 0xC0 JUMP JUMPDEST DUP2 EQ PUSH2 0xDE JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xF0 DUP2 PUSH2 0xCA JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x10D JUMPI PUSH2 0x10C PUSH2 0xBB JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x11B DUP6 DUP3 DUP7 ADD PUSH2 0xE1 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x12C DUP6 DUP3 DUP7 ADD PUSH2 0xE1 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x13F DUP2 PUSH2 0xC0 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x15A PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x136 JUMP JUMPDEST PUSH2 0x167 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x136 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x184 JUMPI PUSH2 0x183 PUSH2 0xBB JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x192 DUP5 DUP3 DUP6 ADD PUSH2 0xE1 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0xB3 DUP1 PUSH2 0x1A9 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x28 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x853255CC EQ PUSH1 0x2D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x33 PUSH1 0x47 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x3E SWAP2 SWAP1 PUSH1 0x64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5E DUP2 PUSH1 0x4D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x77 PUSH1 0x0 DUP4 ADD DUP5 PUSH1 0x57 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED DUP10 POP STATICCALL RETURNDATASIZE PUSH18 0x84D2692EB6136B1815845D0F7C330E78B594 DUP15 SLT CALLCODE 0xE3 0x5F 0xD9 0xB2 GASLIMIT PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "128:98:0:-:0;;;167:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;209:2;:6;;;;216:2;209:10;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;203:3;:16;;;;167:57;;128:98;;88:117:4;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:507::-;773:6;781;830:2;818:9;809:7;805:23;801:32;798:119;;;836:79;;:::i;:::-;798:119;956:1;981:64;1037:7;1028:6;1017:9;1013:22;981:64;:::i;:::-;971:74;;927:128;1094:2;1120:64;1176:7;1167:6;1156:9;1152:22;1120:64;:::i;:::-;1110:74;;1065:129;694:507;;;;;:::o;1207:126::-;1302:24;1320:5;1302:24;:::i;:::-;1297:3;1290:37;1207:126;;:::o;1339:356::-;1468:4;1506:2;1495:9;1491:18;1483:26;;1519:79;1595:1;1584:9;1580:17;1571:6;1519:79;:::i;:::-;1608:80;1684:2;1673:9;1669:18;1660:6;1608:80;:::i;:::-;1339:356;;;;;:::o;1701:351::-;1771:6;1820:2;1808:9;1799:7;1795:23;1791:32;1788:119;;;1826:79;;:::i;:::-;1788:119;1946:1;1971:64;2027:7;2018:6;2007:9;2003:22;1971:64;:::i;:::-;1961:74;;1917:128;1701:351;;;;:::o;128:98:0:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@sum_7": { + "entryPoint": 71, + "id": 7, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 87, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 100, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 77, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:439:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:4", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:4" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:4" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:4", + "type": "" + } + ], + "src": "7:77:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:4" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:4" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:4" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:4", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:4", + "type": "" + } + ], + "src": "90:118:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:4" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:4" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:4", + "type": "" + } + ], + "src": "214:222:4" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n}\n", + "id": 4, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052348015600f57600080fd5b506004361060285760003560e01c8063853255cc14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea2646970667358221220ed8950fa3d7184d2692eb6136b1815845d0f7c330e78b5948e12f2e35fd9b24564736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH1 0x28 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x853255CC EQ PUSH1 0x2D JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x33 PUSH1 0x47 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH1 0x3E SWAP2 SWAP1 PUSH1 0x64 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x5E DUP2 PUSH1 0x4D JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH1 0x77 PUSH1 0x0 DUP4 ADD DUP5 PUSH1 0x57 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xED DUP10 POP STATICCALL RETURNDATASIZE PUSH18 0x84D2692EB6136B1815845D0F7C330E78B594 DUP15 SLT CALLCODE 0xE3 0x5F 0xD9 0xB2 GASLIMIT PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "128:98:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147:15;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;:::o;7:77:4:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o" + }, + "methodIdentifiers": { + "sum()": "853255cc" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_b\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"sum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TestA.sol\":\"TestA\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/TestA.sol\":{\"keccak256\":\"0xb9f1f96829ed58dccc198684fbb7e8cb3ba3864b439865c7f8a21355411c2da1\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b0d7f353c4377bf8113ec3fb253199a754aa58490bd22f7bff6161f5d86d2e8a\",\"dweb:/ipfs/QmbuV1wTgMGX7thFEovLF4WEdXNjcdiLr7F9XKV77kJpoj\"]},\"contracts/TestB.sol\":{\"keccak256\":\"0xf5b6e17af4867c11f2f48e4e929d091d4156f3c8cdeb1151384efbdb8d3e389e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b3f4989676b428bc34b5d9431863dfdca25d19a5618014c7d3151b71f88e5a9c\",\"dweb:/ipfs/QmZ6BeYewmMFQX9qcKAwGiEuhTfdg2fssetfLjQy6jESF7\"]},\"contracts/TestC.sol\":{\"keccak256\":\"0xf84c6d15c887fe13a516c2340833e6a8497ddac6413cc753f704edad7a71f2da\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://c1bb19fd6492da1b51993000a81a494996529770c9b405950bf7232cdeeab3ac\",\"dweb:/ipfs/QmSvJwVzejz25FavVs4L5txVzCXWf2vt214nVpwfUbMu6Z\"]},\"contracts/TestD.sol\":{\"keccak256\":\"0xad7dc40523312bd056b30ab7adbf5f78e6eba0e74bb8e3db7fd87bd1781bb3fa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://71e154e92c1374772171d59e553514cbed1b8983d65f7726d63f43b02b62e524\",\"dweb:/ipfs/QmbkH6yVP2fg9ZXhz7k48JwbUmM5yWUguGdNx1JMz1h4wN\"]}},\"version\":1}" + } + }, + "contracts/TestB.sol": { + "TestB": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": { + "contracts/TestC.sol": { + "TestC": [ + { + "length": 20, + "start": 193 + } + ] + }, + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 220 + } + ] + } + }, + "object": "6102ad610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906101a2565b61006a565b60405161006191906101f1565b60405180910390f35b600073__$a77b74ebd34224ac3c3a582e4bc24622f4$__63cad0899b8473__$3fa06892d414312f70326060dfc06e0087$__63cad0899b87876040518363ffffffff1660e01b81526004016100c092919061020c565b602060405180830381865af41580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061024a565b6040518363ffffffff1660e01b815260040161011e92919061020c565b602060405180830381865af415801561013b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015f919061024a565b905092915050565b600080fd5b6000819050919050565b61017f8161016c565b811461018a57600080fd5b50565b60008135905061019c81610176565b92915050565b600080604083850312156101b9576101b8610167565b5b60006101c78582860161018d565b92505060206101d88582860161018d565b9150509250929050565b6101eb8161016c565b82525050565b600060208201905061020660008301846101e2565b92915050565b600060408201905061022160008301856101e2565b61022e60208301846101e2565b9392505050565b60008151905061024481610176565b92915050565b6000602082840312156102605761025f610167565b5b600061026e84828501610235565b9150509291505056fea264697066735822122056e067cbff0f6f4b44115fa7c682e899221992ed439b30cd21e26a9ad4faac2664736f6c63430008130033", + "opcodes": "PUSH2 0x2AD PUSH2 0x53 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x46 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x1F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH20 0x0 PUSH4 0xCAD0899B DUP5 PUSH20 0x0 PUSH4 0xCAD0899B DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC0 SWAP3 SWAP2 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x101 SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x13B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x15F SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x17F DUP2 PUSH2 0x16C JUMP JUMPDEST DUP2 EQ PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x19C DUP2 PUSH2 0x176 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B9 JUMPI PUSH2 0x1B8 PUSH2 0x167 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1C7 DUP6 DUP3 DUP7 ADD PUSH2 0x18D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D8 DUP6 DUP3 DUP7 ADD PUSH2 0x18D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x1EB DUP2 PUSH2 0x16C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x206 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1E2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x221 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x1E2 JUMP JUMPDEST PUSH2 0x22E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x244 DUP2 PUSH2 0x176 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x260 JUMPI PUSH2 0x25F PUSH2 0x167 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x26E DUP5 DUP3 DUP6 ADD PUSH2 0x235 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMP 0xE0 PUSH8 0xCBFF0F6F4B44115F 0xA7 0xC6 DUP3 0xE8 SWAP10 0x22 NOT SWAP3 0xED NUMBER SWAP12 ADDRESS 0xCD 0x21 0xE2 PUSH11 0x9AD4FAAC2664736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "121:123:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@sum_47": { + "entryPoint": 106, + "id": 47, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 397, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 565, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 418, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 482, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 497, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed": { + "entryPoint": 524, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 364, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 359, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 374, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2411:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:4", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:4" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:4" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:4", + "type": "" + } + ], + "src": "7:75:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:4" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:4" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:4", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:4" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:4" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:4", + "type": "" + } + ], + "src": "334:77:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:4" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:4" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:4" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:4" + }, + "nodeType": "YulIf", + "src": "470:63:4" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:4", + "type": "" + } + ], + "src": "417:122:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:4" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:4" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:4" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:4", + "type": "" + } + ], + "src": "545:139:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "773:391:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "819:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "821:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "821:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "821:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "794:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "803:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "790:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "790:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "815:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "786:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "786:32:4" + }, + "nodeType": "YulIf", + "src": "783:119:4" + }, + { + "nodeType": "YulBlock", + "src": "912:117:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "927:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "941:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "931:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "956:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "991:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1002:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "987:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "987:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1011:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "966:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "966:53:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "956:6:4" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1039:118:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1054:16:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1068:2:4", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1058:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1084:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1119:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1130:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1115:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1115:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1139:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1094:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "1094:53:4" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1084:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "735:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "746:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "758:6:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "766:6:4", + "type": "" + } + ], + "src": "690:474:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1243:53:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1260:3:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1283:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1265:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1265:24:4" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1253:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1253:37:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1253:37:4" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1231:5:4", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1238:3:4", + "type": "" + } + ], + "src": "1170:126:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1408:132:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1418:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1430:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1441:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1426:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1426:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1418:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1506:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1519:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1530:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1515:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1515:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1454:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1454:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1454:79:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1380:9:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1392:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1403:4:4", + "type": "" + } + ], + "src": "1302:238:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1680:222:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1690:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1702:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1713:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1698:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1698:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1690:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1778:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1791:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1787:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1787:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1726:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1726:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1726:79:4" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1867:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1880:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1891:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1876:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1876:18:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1815:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1815:80:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1815:80:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1644:9:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1656:6:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1664:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1675:4:4", + "type": "" + } + ], + "src": "1546:356:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1971:80:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1981:22:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1996:6:4" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "1990:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "1990:13:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1981:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "2039:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "2012:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "2012:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "2012:33:4" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1949:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1957:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1965:5:4", + "type": "" + } + ], + "src": "1908:143:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2134:274:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2180:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "2182:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "2182:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "2182:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2155:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2164:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2151:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2151:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2176:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2147:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2147:32:4" + }, + "nodeType": "YulIf", + "src": "2144:119:4" + }, + { + "nodeType": "YulBlock", + "src": "2273:128:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2288:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2302:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "2292:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2317:74:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2363:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2374:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2359:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2359:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2383:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "2327:31:4" + }, + "nodeType": "YulFunctionCall", + "src": "2327:64:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2317:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2104:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "2115:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2127:6:4", + "type": "" + } + ], + "src": "2057:351:4" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value1, add(headStart, 32))\n\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 4, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": { + "contracts/TestC.sol": { + "TestC": [ + { + "length": 20, + "start": 110 + } + ] + }, + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 137 + } + ] + } + }, + "object": "73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906101a2565b61006a565b60405161006191906101f1565b60405180910390f35b600073__$a77b74ebd34224ac3c3a582e4bc24622f4$__63cad0899b8473__$3fa06892d414312f70326060dfc06e0087$__63cad0899b87876040518363ffffffff1660e01b81526004016100c092919061020c565b602060405180830381865af41580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061024a565b6040518363ffffffff1660e01b815260040161011e92919061020c565b602060405180830381865af415801561013b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015f919061024a565b905092915050565b600080fd5b6000819050919050565b61017f8161016c565b811461018a57600080fd5b50565b60008135905061019c81610176565b92915050565b600080604083850312156101b9576101b8610167565b5b60006101c78582860161018d565b92505060206101d88582860161018d565b9150509250929050565b6101eb8161016c565b82525050565b600060208201905061020660008301846101e2565b92915050565b600060408201905061022160008301856101e2565b61022e60208301846101e2565b9392505050565b60008151905061024481610176565b92915050565b6000602082840312156102605761025f610167565b5b600061026e84828501610235565b9150509291505056fea264697066735822122056e067cbff0f6f4b44115fa7c682e899221992ed439b30cd21e26a9ad4faac2664736f6c63430008130033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0x1A2 JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x1F1 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH20 0x0 PUSH4 0xCAD0899B DUP5 PUSH20 0x0 PUSH4 0xCAD0899B DUP8 DUP8 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xC0 SWAP3 SWAP2 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xDD JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x101 SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x11E SWAP3 SWAP2 SWAP1 PUSH2 0x20C JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0x13B JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0x15F SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x17F DUP2 PUSH2 0x16C JUMP JUMPDEST DUP2 EQ PUSH2 0x18A JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x19C DUP2 PUSH2 0x176 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1B9 JUMPI PUSH2 0x1B8 PUSH2 0x167 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1C7 DUP6 DUP3 DUP7 ADD PUSH2 0x18D JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x1D8 DUP6 DUP3 DUP7 ADD PUSH2 0x18D JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x1EB DUP2 PUSH2 0x16C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x206 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x1E2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x221 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x1E2 JUMP JUMPDEST PUSH2 0x22E PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x1E2 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x244 DUP2 PUSH2 0x176 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x260 JUMPI PUSH2 0x25F PUSH2 0x167 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x26E DUP5 DUP3 DUP6 ADD PUSH2 0x235 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 JUMP 0xE0 PUSH8 0xCBFF0F6F4B44115F 0xA7 0xC6 DUP3 0xE8 SWAP10 0x22 NOT SWAP3 0xED NUMBER SWAP12 ADDRESS 0xCD 0x21 0xE2 PUSH11 0x9AD4FAAC2664736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "121:123:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;139:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;189:4;208:5;:9;218:1;221:5;:9;231:1;234;221:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;208:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;201:36;;139:103;;;;:::o;88:117:4:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:126::-;1265:24;1283:5;1265:24;:::i;:::-;1260:3;1253:37;1170:126;;:::o;1302:238::-;1403:4;1441:2;1430:9;1426:18;1418:26;;1454:79;1530:1;1519:9;1515:17;1506:6;1454:79;:::i;:::-;1302:238;;;;:::o;1546:356::-;1675:4;1713:2;1702:9;1698:18;1690:26;;1726:79;1802:1;1791:9;1787:17;1778:6;1726:79;:::i;:::-;1815:80;1891:2;1880:9;1876:18;1867:6;1815:80;:::i;:::-;1546:356;;;;;:::o;1908:143::-;1965:5;1996:6;1990:13;1981:22;;2012:33;2039:5;2012:33;:::i;:::-;1908:143;;;;:::o;2057:351::-;2127:6;2176:2;2164:9;2155:7;2151:23;2147:32;2144:119;;;2182:79;;:::i;:::-;2144:119;2302:1;2327:64;2383:7;2374:6;2363:9;2359:22;2327:64;:::i;:::-;2317:74;;2273:128;2057:351;;;;:::o" + }, + "methodIdentifiers": { + "sum(uint256,uint256)": "cad0899b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"sum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TestB.sol\":\"TestB\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/TestB.sol\":{\"keccak256\":\"0xf5b6e17af4867c11f2f48e4e929d091d4156f3c8cdeb1151384efbdb8d3e389e\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://b3f4989676b428bc34b5d9431863dfdca25d19a5618014c7d3151b71f88e5a9c\",\"dweb:/ipfs/QmZ6BeYewmMFQX9qcKAwGiEuhTfdg2fssetfLjQy6jESF7\"]},\"contracts/TestC.sol\":{\"keccak256\":\"0xf84c6d15c887fe13a516c2340833e6a8497ddac6413cc753f704edad7a71f2da\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://c1bb19fd6492da1b51993000a81a494996529770c9b405950bf7232cdeeab3ac\",\"dweb:/ipfs/QmSvJwVzejz25FavVs4L5txVzCXWf2vt214nVpwfUbMu6Z\"]},\"contracts/TestD.sol\":{\"keccak256\":\"0xad7dc40523312bd056b30ab7adbf5f78e6eba0e74bb8e3db7fd87bd1781bb3fa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://71e154e92c1374772171d59e553514cbed1b8983d65f7726d63f43b02b62e524\",\"dweb:/ipfs/QmbkH6yVP2fg9ZXhz7k48JwbUmM5yWUguGdNx1JMz1h4wN\"]}},\"version\":1}" + } + }, + "contracts/TestC.sol": { + "TestC": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": { + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 193 + } + ] + } + }, + "object": "610234610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f9190610129565b61006a565b6040516100619190610178565b60405180910390f35b600073__$3fa06892d414312f70326060dfc06e0087$__63cad0899b84846040518363ffffffff1660e01b81526004016100a5929190610193565b602060405180830381865af41580156100c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e691906101d1565b905092915050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080604083850312156101405761013f6100ee565b5b600061014e85828601610114565b925050602061015f85828601610114565b9150509250929050565b610172816100f3565b82525050565b600060208201905061018d6000830184610169565b92915050565b60006040820190506101a86000830185610169565b6101b56020830184610169565b9392505050565b6000815190506101cb816100fd565b92915050565b6000602082840312156101e7576101e66100ee565b5b60006101f5848285016101bc565b9150509291505056fea264697066735822122024415ac821281eba4a04ac4443e09eab95a2381de7e62a3a62fe726c54e8a3d764736f6c63430008130033", + "opcodes": "PUSH2 0x234 PUSH2 0x53 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x46 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0x129 JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x178 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH20 0x0 PUSH4 0xCAD0899B DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA5 SWAP3 SWAP2 SWAP1 PUSH2 0x193 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xC2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE6 SWAP2 SWAP1 PUSH2 0x1D1 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x106 DUP2 PUSH2 0xF3 JUMP JUMPDEST DUP2 EQ PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x123 DUP2 PUSH2 0xFD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x140 JUMPI PUSH2 0x13F PUSH2 0xEE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x14E DUP6 DUP3 DUP7 ADD PUSH2 0x114 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x15F DUP6 DUP3 DUP7 ADD PUSH2 0x114 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x172 DUP2 PUSH2 0xF3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x18D PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x169 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x1A8 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x169 JUMP JUMPDEST PUSH2 0x1B5 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x169 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x1CB DUP2 PUSH2 0xFD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E7 JUMPI PUSH2 0x1E6 PUSH2 0xEE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1F5 DUP5 DUP3 DUP6 ADD PUSH2 0x1BC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 COINBASE GAS 0xC8 0x21 0x28 0x1E 0xBA 0x4A DIV 0xAC PREVRANDAO NUMBER 0xE0 SWAP15 0xAB SWAP6 LOG2 CODESIZE SAR 0xE7 0xE6 0x2A GASPRICE PUSH3 0xFE726C SLOAD 0xE8 LOG3 0xD7 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "87:109:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@sum_67": { + "entryPoint": 106, + "id": 67, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 276, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 444, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 465, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 297, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 361, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 376, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed": { + "entryPoint": 403, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 243, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 238, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 253, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2411:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:4", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:4" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:4" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:4", + "type": "" + } + ], + "src": "7:75:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:4" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:4" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:4", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:4" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:4" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:4", + "type": "" + } + ], + "src": "334:77:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:4" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:4" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:4" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:4" + }, + "nodeType": "YulIf", + "src": "470:63:4" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:4", + "type": "" + } + ], + "src": "417:122:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:4" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:4" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:4" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:4", + "type": "" + } + ], + "src": "545:139:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "773:391:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "819:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "821:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "821:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "821:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "794:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "803:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "790:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "790:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "815:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "786:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "786:32:4" + }, + "nodeType": "YulIf", + "src": "783:119:4" + }, + { + "nodeType": "YulBlock", + "src": "912:117:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "927:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "941:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "931:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "956:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "991:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1002:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "987:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "987:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1011:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "966:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "966:53:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "956:6:4" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1039:118:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1054:16:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1068:2:4", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1058:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1084:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1119:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1130:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1115:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1115:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1139:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1094:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "1094:53:4" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1084:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "735:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "746:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "758:6:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "766:6:4", + "type": "" + } + ], + "src": "690:474:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1243:53:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1260:3:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1283:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1265:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1265:24:4" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1253:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1253:37:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1253:37:4" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1231:5:4", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1238:3:4", + "type": "" + } + ], + "src": "1170:126:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1408:132:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1418:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1430:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1441:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1426:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1426:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1418:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1506:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1519:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1530:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1515:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1515:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1454:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1454:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1454:79:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1380:9:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1392:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1403:4:4", + "type": "" + } + ], + "src": "1302:238:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1680:222:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1690:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1702:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1713:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1698:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1698:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1690:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1778:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1791:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1787:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1787:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1726:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1726:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1726:79:4" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1867:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1880:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1891:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1876:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1876:18:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1815:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1815:80:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1815:80:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1644:9:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "1656:6:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1664:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1675:4:4", + "type": "" + } + ], + "src": "1546:356:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1971:80:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1981:22:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1996:6:4" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "1990:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "1990:13:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1981:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "2039:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "2012:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "2012:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "2012:33:4" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1949:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1957:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1965:5:4", + "type": "" + } + ], + "src": "1908:143:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2134:274:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2180:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "2182:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "2182:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "2182:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2155:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2164:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2151:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2151:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2176:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "2147:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2147:32:4" + }, + "nodeType": "YulIf", + "src": "2144:119:4" + }, + { + "nodeType": "YulBlock", + "src": "2273:128:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2288:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2302:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "2292:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2317:74:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2363:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2374:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2359:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "2359:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2383:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "2327:31:4" + }, + "nodeType": "YulFunctionCall", + "src": "2327:64:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2317:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2104:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "2115:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "2127:6:4", + "type": "" + } + ], + "src": "2057:351:4" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_library_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value1, add(headStart, 32))\n\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 4, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": { + "contracts/TestD.sol": { + "TestD": [ + { + "length": 20, + "start": 110 + } + ] + } + }, + "object": "73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f9190610129565b61006a565b6040516100619190610178565b60405180910390f35b600073__$3fa06892d414312f70326060dfc06e0087$__63cad0899b84846040518363ffffffff1660e01b81526004016100a5929190610193565b602060405180830381865af41580156100c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e691906101d1565b905092915050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080604083850312156101405761013f6100ee565b5b600061014e85828601610114565b925050602061015f85828601610114565b9150509250929050565b610172816100f3565b82525050565b600060208201905061018d6000830184610169565b92915050565b60006040820190506101a86000830185610169565b6101b56020830184610169565b9392505050565b6000815190506101cb816100fd565b92915050565b6000602082840312156101e7576101e66100ee565b5b60006101f5848285016101bc565b9150509291505056fea264697066735822122024415ac821281eba4a04ac4443e09eab95a2381de7e62a3a62fe726c54e8a3d764736f6c63430008130033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0x129 JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x178 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH20 0x0 PUSH4 0xCAD0899B DUP5 DUP5 PUSH1 0x40 MLOAD DUP4 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xA5 SWAP3 SWAP2 SWAP1 PUSH2 0x193 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xC2 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xE6 SWAP2 SWAP1 PUSH2 0x1D1 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x106 DUP2 PUSH2 0xF3 JUMP JUMPDEST DUP2 EQ PUSH2 0x111 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x123 DUP2 PUSH2 0xFD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x140 JUMPI PUSH2 0x13F PUSH2 0xEE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x14E DUP6 DUP3 DUP7 ADD PUSH2 0x114 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0x15F DUP6 DUP3 DUP7 ADD PUSH2 0x114 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x172 DUP2 PUSH2 0xF3 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x18D PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x169 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x1A8 PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x169 JUMP JUMPDEST PUSH2 0x1B5 PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x169 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x1CB DUP2 PUSH2 0xFD JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1E7 JUMPI PUSH2 0x1E6 PUSH2 0xEE JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1F5 DUP5 DUP3 DUP6 ADD PUSH2 0x1BC JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0x24 COINBASE GAS 0xC8 0x21 0x28 0x1E 0xBA 0x4A DIV 0xAC PREVRANDAO NUMBER 0xE0 SWAP15 0xAB SWAP6 LOG2 CODESIZE SAR 0xE7 0xE6 0x2A GASPRICE PUSH3 0xFE726C SLOAD 0xE8 LOG3 0xD7 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "87:109:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;105:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;155:4;174:5;:9;184:1;187;174:15;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;167:22;;105:89;;;;:::o;88:117:4:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:126::-;1265:24;1283:5;1265:24;:::i;:::-;1260:3;1253:37;1170:126;;:::o;1302:238::-;1403:4;1441:2;1430:9;1426:18;1418:26;;1454:79;1530:1;1519:9;1515:17;1506:6;1454:79;:::i;:::-;1302:238;;;;:::o;1546:356::-;1675:4;1713:2;1702:9;1698:18;1690:26;;1726:79;1802:1;1791:9;1787:17;1778:6;1726:79;:::i;:::-;1815:80;1891:2;1880:9;1876:18;1867:6;1815:80;:::i;:::-;1546:356;;;;;:::o;1908:143::-;1965:5;1996:6;1990:13;1981:22;;2012:33;2039:5;2012:33;:::i;:::-;1908:143;;;;:::o;2057:351::-;2127:6;2176:2;2164:9;2155:7;2151:23;2147:32;2144:119;;;2182:79;;:::i;:::-;2144:119;2302:1;2327:64;2383:7;2374:6;2363:9;2359:22;2327:64;:::i;:::-;2317:74;;2273:128;2057:351;;;;:::o" + }, + "methodIdentifiers": { + "sum(uint256,uint256)": "cad0899b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"sum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TestC.sol\":\"TestC\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/TestC.sol\":{\"keccak256\":\"0xf84c6d15c887fe13a516c2340833e6a8497ddac6413cc753f704edad7a71f2da\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://c1bb19fd6492da1b51993000a81a494996529770c9b405950bf7232cdeeab3ac\",\"dweb:/ipfs/QmSvJwVzejz25FavVs4L5txVzCXWf2vt214nVpwfUbMu6Z\"]},\"contracts/TestD.sol\":{\"keccak256\":\"0xad7dc40523312bd056b30ab7adbf5f78e6eba0e74bb8e3db7fd87bd1781bb3fa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://71e154e92c1374772171d59e553514cbed1b8983d65f7726d63f43b02b62e524\",\"dweb:/ipfs/QmbkH6yVP2fg9ZXhz7k48JwbUmM5yWUguGdNx1JMz1h4wN\"]}},\"version\":1}" + } + }, + "contracts/TestD.sol": { + "TestD": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "sum", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "6101be610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b604051610061919061010a565b60405180910390f35b600081836100789190610154565b905092915050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b600080604083850312156100d2576100d1610080565b5b60006100e0858286016100a6565b92505060206100f1858286016100a6565b9150509250929050565b61010481610085565b82525050565b600060208201905061011f60008301846100fb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061015f82610085565b915061016a83610085565b925082820190508082111561018257610181610125565b5b9291505056fea2646970667358221220132f489f22fe1764834a50b94361c88c1986db1d16da50230adbb6f8364226fe64736f6c63430008130033", + "opcodes": "PUSH2 0x1BE PUSH2 0x53 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x46 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0xBB JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x10A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x78 SWAP2 SWAP1 PUSH2 0x154 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP2 EQ PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xB5 DUP2 PUSH2 0x8F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xD2 JUMPI PUSH2 0xD1 PUSH2 0x80 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xE0 DUP6 DUP3 DUP7 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF1 DUP6 DUP3 DUP7 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x104 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x11F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xFB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15F DUP3 PUSH2 0x85 JUMP JUMPDEST SWAP2 POP PUSH2 0x16A DUP4 PUSH2 0x85 JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x182 JUMPI PUSH2 0x181 PUSH2 0x125 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SGT 0x2F BASEFEE SWAP16 0x22 INVALID OR PUSH5 0x834A50B943 PUSH2 0xC88C NOT DUP7 0xDB SAR AND 0xDA POP 0x23 EXP 0xDB 0xB6 0xF8 CALLDATASIZE TIMESTAMP 0x26 INVALID PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:99:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@sum_84": { + "entryPoint": 106, + "id": 84, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 166, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 187, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 251, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 266, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 340, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 133, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 293, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 128, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 143, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1926:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:4", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:4" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:4" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:4" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:4", + "type": "" + } + ], + "src": "7:75:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:4" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:4" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:4", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:4" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:4" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:4", + "type": "" + } + ], + "src": "334:77:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:4" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:4" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:4" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:4" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:4" + }, + "nodeType": "YulIf", + "src": "470:63:4" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:4", + "type": "" + } + ], + "src": "417:122:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:4", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:4" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:4" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:4" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:4" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:4" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:4" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:4" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:4", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:4", + "type": "" + } + ], + "src": "545:139:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "773:391:4", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "819:83:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "821:77:4" + }, + "nodeType": "YulFunctionCall", + "src": "821:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "821:79:4" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "794:7:4" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "803:9:4" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "790:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "790:23:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "815:2:4", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "786:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "786:32:4" + }, + "nodeType": "YulIf", + "src": "783:119:4" + }, + { + "nodeType": "YulBlock", + "src": "912:117:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "927:15:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "941:1:4", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "931:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "956:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "991:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1002:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "987:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "987:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1011:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "966:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "966:53:4" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "956:6:4" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1039:118:4", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1054:16:4", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1068:2:4", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1058:6:4", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1084:63:4", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1119:9:4" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1130:6:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1115:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1115:22:4" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1139:7:4" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1094:20:4" + }, + "nodeType": "YulFunctionCall", + "src": "1094:53:4" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1084:6:4" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "735:9:4", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "746:7:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "758:6:4", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "766:6:4", + "type": "" + } + ], + "src": "690:474:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1243:53:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1260:3:4" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1283:5:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1265:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1265:24:4" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1253:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1253:37:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1253:37:4" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1231:5:4", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1238:3:4", + "type": "" + } + ], + "src": "1170:126:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1408:132:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1418:26:4", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1430:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1441:2:4", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1426:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1426:18:4" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1418:4:4" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1506:6:4" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1519:9:4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1530:1:4", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1515:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1515:17:4" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1454:51:4" + }, + "nodeType": "YulFunctionCall", + "src": "1454:79:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1454:79:4" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1380:9:4", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1392:6:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1403:4:4", + "type": "" + } + ], + "src": "1302:238:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1574:152:4", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1591:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1594:77:4", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1584:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1584:88:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1584:88:4" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1688:1:4", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1691:4:4", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1681:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1681:15:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1681:15:4" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1712:1:4", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1715:4:4", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1705:6:4" + }, + "nodeType": "YulFunctionCall", + "src": "1705:15:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1705:15:4" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "1546:180:4" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1776:147:4", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1786:25:4", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1809:1:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1791:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1791:20:4" + }, + "variableNames": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1786:1:4" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1820:25:4", + "value": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1843:1:4" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1825:17:4" + }, + "nodeType": "YulFunctionCall", + "src": "1825:20:4" + }, + "variableNames": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1820:1:4" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1854:16:4", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1865:1:4" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1868:1:4" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1861:3:4" + }, + "nodeType": "YulFunctionCall", + "src": "1861:9:4" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1854:3:4" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1894:22:4", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "1896:16:4" + }, + "nodeType": "YulFunctionCall", + "src": "1896:18:4" + }, + "nodeType": "YulExpressionStatement", + "src": "1896:18:4" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1886:1:4" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1889:3:4" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1883:2:4" + }, + "nodeType": "YulFunctionCall", + "src": "1883:10:4" + }, + "nodeType": "YulIf", + "src": "1880:36:4" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "1763:1:4", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "1766:1:4", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "1772:3:4", + "type": "" + } + ], + "src": "1732:191:4" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n function checked_add_t_uint256(x, y) -> sum {\n x := cleanup_t_uint256(x)\n y := cleanup_t_uint256(y)\n sum := add(x, y)\n\n if gt(x, sum) { panic_error_0x11() }\n\n }\n\n}\n", + "id": 4, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b604051610061919061010a565b60405180910390f35b600081836100789190610154565b905092915050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b600080604083850312156100d2576100d1610080565b5b60006100e0858286016100a6565b92505060206100f1858286016100a6565b9150509250929050565b61010481610085565b82525050565b600060208201905061011f60008301846100fb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061015f82610085565b915061016a83610085565b925082820190508082111561018257610181610125565b5b9291505056fea2646970667358221220132f489f22fe1764834a50b94361c88c1986db1d16da50230adbb6f8364226fe64736f6c63430008130033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAD0899B EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0xBB JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0x10A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x78 SWAP2 SWAP1 PUSH2 0x154 JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP2 EQ PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xB5 DUP2 PUSH2 0x8F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xD2 JUMPI PUSH2 0xD1 PUSH2 0x80 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xE0 DUP6 DUP3 DUP7 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xF1 DUP6 DUP3 DUP7 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0x104 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x11F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xFB JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x15F DUP3 PUSH2 0x85 JUMP JUMPDEST SWAP2 POP PUSH2 0x16A DUP4 PUSH2 0x85 JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x182 JUMPI PUSH2 0x181 PUSH2 0x125 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SGT 0x2F BASEFEE SWAP16 0x22 INVALID OR PUSH5 0x834A50B943 PUSH2 0xC88C NOT DUP7 0xDB SAR AND 0xDA POP 0x23 EXP 0xDB 0xB6 0xF8 CALLDATASIZE TIMESTAMP 0x26 INVALID PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:99:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;82:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;132:4;155:1;151;:5;;;;:::i;:::-;144:12;;82:79;;;;:::o;88:117:4:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:126::-;1265:24;1283:5;1265:24;:::i;:::-;1260:3;1253:37;1170:126;;:::o;1302:238::-;1403:4;1441:2;1430:9;1426:18;1418:26;;1454:79;1530:1;1519:9;1515:17;1506:6;1454:79;:::i;:::-;1302:238;;;;:::o;1546:180::-;1594:77;1591:1;1584:88;1691:4;1688:1;1681:15;1715:4;1712:1;1705:15;1732:191;1772:3;1791:20;1809:1;1791:20;:::i;:::-;1786:25;;1825:20;1843:1;1825:20;:::i;:::-;1820:25;;1868:1;1865;1861:9;1854:16;;1889:3;1886:1;1883:10;1880:36;;;1896:18;;:::i;:::-;1880:36;1732:191;;;;:::o" + }, + "methodIdentifiers": { + "sum(uint256,uint256)": "cad0899b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"sum\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/TestD.sol\":\"TestD\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/TestD.sol\":{\"keccak256\":\"0xad7dc40523312bd056b30ab7adbf5f78e6eba0e74bb8e3db7fd87bd1781bb3fa\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://71e154e92c1374772171d59e553514cbed1b8983d65f7726d63f43b02b62e524\",\"dweb:/ipfs/QmbkH6yVP2fg9ZXhz7k48JwbUmM5yWUguGdNx1JMz1h4wN\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/min-input/deployed_addresses.json b/packages/core/test/mocks/verify/min-input/deployed_addresses.json new file mode 100644 index 0000000000..919f5ad45c --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/deployed_addresses.json @@ -0,0 +1,6 @@ +{ + "LockModule#TestD": "0x738809124dB267FD8fa305C208C3Afdb50733b09", + "LockModule#TestC": "0xA1304b2f49DAE40c0400b65dBaFcdBf8af611b84", + "LockModule#TestB": "0x533Ef80A69aE060b8624a2BcD803C61045Cc3EBE", + "LockModule#TestA": "0x113455b0B095f860c17A7aB2C366AE427623d7cE" +} diff --git a/packages/core/test/mocks/verify/min-input/journal.jsonl b/packages/core/test/mocks/verify/min-input/journal.jsonl new file mode 100644 index 0000000000..2f07a3962d --- /dev/null +++ b/packages/core/test/mocks/verify/min-input/journal.jsonl @@ -0,0 +1,22 @@ + +{"chainId":11155111,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#TestD","constructorArgs":[],"contractName":"TestD","dependencies":[],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#TestD","futureType":"NAMED_ARTIFACT_LIBRARY_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#TestD","networkInteraction":{"data":"0x6101be610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b604051610061919061010a565b60405180910390f35b600081836100789190610154565b905092915050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b600080604083850312156100d2576100d1610080565b5b60006100e0858286016100a6565b92505060206100f1858286016100a6565b9150509250929050565b61010481610085565b82525050565b600060208201905061011f60008301846100fb565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061015f82610085565b915061016a83610085565b925082820190508082111561018257610181610125565b5b9291505056fea2646970667358221220132f489f22fe1764834a50b94361c88c1986db1d16da50230adbb6f8364226fe64736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#TestD","networkInteractionId":1,"nonce":35,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1231723314"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x51a5a511faf2ef4a4e1e341d037f73648375f6479c972c13bfc2d7c112e48a88"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#TestD","hash":"0x51a5a511faf2ef4a4e1e341d037f73648375f6479c972c13bfc2d7c112e48a88","networkInteractionId":1,"receipt":{"blockHash":"0xa0bbbd38a11ebda720b9796d8e12e9a4eeb598c9c94788abc2d2ec01319b4610","blockNumber":5468207,"contractAddress":"0x738809124dB267FD8fa305C208C3Afdb50733b09","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#TestD","result":{"address":"0x738809124dB267FD8fa305C208C3Afdb50733b09","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#TestC","constructorArgs":[],"contractName":"TestC","dependencies":["LockModule#TestD"],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#TestC","futureType":"NAMED_ARTIFACT_LIBRARY_DEPLOYMENT","libraries":{"TestD":"0x738809124dB267FD8fa305C208C3Afdb50733b09"},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#TestC","networkInteraction":{"data":"0x610234610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f9190610129565b61006a565b6040516100619190610178565b60405180910390f35b600073738809124dB267FD8fa305C208C3Afdb50733b0963cad0899b84846040518363ffffffff1660e01b81526004016100a5929190610193565b602060405180830381865af41580156100c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100e691906101d1565b905092915050565b600080fd5b6000819050919050565b610106816100f3565b811461011157600080fd5b50565b600081359050610123816100fd565b92915050565b600080604083850312156101405761013f6100ee565b5b600061014e85828601610114565b925050602061015f85828601610114565b9150509250929050565b610172816100f3565b82525050565b600060208201905061018d6000830184610169565b92915050565b60006040820190506101a86000830185610169565b6101b56020830184610169565b9392505050565b6000815190506101cb816100fd565b92915050565b6000602082840312156101e7576101e66100ee565b5b60006101f5848285016101bc565b9150509291505056fea264697066735822122024415ac821281eba4a04ac4443e09eab95a2381de7e62a3a62fe726c54e8a3d764736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#TestC","networkInteractionId":1,"nonce":36,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1234723462"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x0bc7cfa4b5500d808ad8f734300d59c9b7e9c5e1a3aa2ac14568fa1c8901ba12"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#TestC","hash":"0x0bc7cfa4b5500d808ad8f734300d59c9b7e9c5e1a3aa2ac14568fa1c8901ba12","networkInteractionId":1,"receipt":{"blockHash":"0xfaddf2e1ed7e4be907a578b2bec8927e37e6e710620fe93df2dc4631231b468a","blockNumber":5468212,"contractAddress":"0xA1304b2f49DAE40c0400b65dBaFcdBf8af611b84","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#TestC","result":{"address":"0xA1304b2f49DAE40c0400b65dBaFcdBf8af611b84","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#TestB","constructorArgs":[],"contractName":"TestB","dependencies":["LockModule#TestC","LockModule#TestD"],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#TestB","futureType":"NAMED_ARTIFACT_LIBRARY_DEPLOYMENT","libraries":{"TestC":"0xA1304b2f49DAE40c0400b65dBaFcdBf8af611b84","TestD":"0x738809124dB267FD8fa305C208C3Afdb50733b09"},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#TestB","networkInteraction":{"data":"0x6102ad610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cad0899b1461003a575b600080fd5b610054600480360381019061004f91906101a2565b61006a565b60405161006191906101f1565b60405180910390f35b600073A1304b2f49DAE40c0400b65dBaFcdBf8af611b8463cad0899b8473738809124dB267FD8fa305C208C3Afdb50733b0963cad0899b87876040518363ffffffff1660e01b81526004016100c092919061020c565b602060405180830381865af41580156100dd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610101919061024a565b6040518363ffffffff1660e01b815260040161011e92919061020c565b602060405180830381865af415801561013b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015f919061024a565b905092915050565b600080fd5b6000819050919050565b61017f8161016c565b811461018a57600080fd5b50565b60008135905061019c81610176565b92915050565b600080604083850312156101b9576101b8610167565b5b60006101c78582860161018d565b92505060206101d88582860161018d565b9150509250929050565b6101eb8161016c565b82525050565b600060208201905061020660008301846101e2565b92915050565b600060408201905061022160008301856101e2565b61022e60208301846101e2565b9392505050565b60008151905061024481610176565b92915050565b6000602082840312156102605761025f610167565b5b600061026e84828501610235565b9150509291505056fea264697066735822122056e067cbff0f6f4b44115fa7c682e899221992ed439b30cd21e26a9ad4faac2664736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#TestB","networkInteractionId":1,"nonce":37,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1240595674"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xd6cda71da77a8b6f7526d5c667d791670d2ec648cc400e4ee24997520581c8a8"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#TestB","hash":"0xd6cda71da77a8b6f7526d5c667d791670d2ec648cc400e4ee24997520581c8a8","networkInteractionId":1,"receipt":{"blockHash":"0xa93f0c4066297c30a0d33af789b41dfe8eedc08eaff642eed13d6f6f1eeb0103","blockNumber":5468217,"contractAddress":"0x533Ef80A69aE060b8624a2BcD803C61045Cc3EBE","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#TestB","result":{"address":"0x533Ef80A69aE060b8624a2BcD803C61045Cc3EBE","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#TestA","constructorArgs":[1,2],"contractName":"TestA","dependencies":["LockModule#TestB"],"from":"0x224e16b1b84a3c79552dbbc37070c348cacd1197","futureId":"LockModule#TestA","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{"TestB":"0x533Ef80A69aE060b8624a2BcD803C61045Cc3EBE"},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#TestA","networkInteraction":{"data":"0x608060405234801561001057600080fd5b5060405161025c38038061025c833981810160405281019061003291906100f6565b8173533Ef80A69aE060b8624a2BcD803C61045Cc3EBE63cad0899b9091836040518363ffffffff1660e01b815260040161006d929190610145565b602060405180830381865af415801561008a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ae919061016e565b600081905550505061019b565b600080fd5b6000819050919050565b6100d3816100c0565b81146100de57600080fd5b50565b6000815190506100f0816100ca565b92915050565b6000806040838503121561010d5761010c6100bb565b5b600061011b858286016100e1565b925050602061012c858286016100e1565b9150509250929050565b61013f816100c0565b82525050565b600060408201905061015a6000830185610136565b6101676020830184610136565b9392505050565b600060208284031215610184576101836100bb565b5b6000610192848285016100e1565b91505092915050565b60b3806101a96000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063853255cc14602d575b600080fd5b60336047565b604051603e91906064565b60405180910390f35b60005481565b6000819050919050565b605e81604d565b82525050565b6000602082019050607760008301846057565b9291505056fea2646970667358221220ed8950fa3d7184d2692eb6136b1815845d0f7c330e78b5948e12f2e35fd9b24564736f6c6343000813003300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#TestA","networkInteractionId":1,"nonce":38,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1236779328"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xe4229f0fda2b192f5b007c9b7cff48fa630417c7399257f3c66ed8ac70ef0533"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#TestA","hash":"0xe4229f0fda2b192f5b007c9b7cff48fa630417c7399257f3c66ed8ac70ef0533","networkInteractionId":1,"receipt":{"blockHash":"0x48d62854c2b42ef021a9d745a0435dbc6fd1b5c3ceb1c192f70c62ff1bbf8a7b","blockNumber":5468222,"contractAddress":"0x113455b0B095f860c17A7aB2C366AE427623d7cE","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#TestA","result":{"address":"0x113455b0B095f860c17A7aB2C366AE427623d7cE","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts index ee59ad52e2..ba753a7f5e 100644 --- a/packages/core/test/verify.ts +++ b/packages/core/test/verify.ts @@ -125,4 +125,38 @@ describe("verify", () => { assert.isTrue(success); }); + + // The build info for the mock used in this test contains compilation info for "Lock.sol" as well, + // which was not part of the deployment. + // This test ensures that it is not included in the verification info, as well as that the other + // contracts in the deployment are not sent if they are not needed for the requested contract. + it("should yield a verify result containing only the requested contract", async () => { + const expectedResultMap: { [k: string]: string[] } = { + "contracts/TestA.sol:TestA": [ + "contracts/TestA.sol", + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestB.sol:TestB": [ + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestC.sol:TestC": [ + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestD.sol:TestD": ["contracts/TestD.sol"], + }; + + const deploymentDir = path.join(__dirname, "mocks", "verify", "min-input"); + + for await (const [, info] of getVerificationInformation(deploymentDir)) { + const expectedSources = expectedResultMap[info.name]; + const actualSources = Object.keys(JSON.parse(info.sourceCode).sources); + + assert.deepEqual(actualSources, expectedSources); + } + }); }); From abdf1e9b2a663bea984c2a9dbb629c1183f7f22f Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 13 Mar 2024 00:08:40 -0400 Subject: [PATCH 1192/1302] fix for windows --- packages/core/src/verify.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index 4a2eeeb1c6..7ecd929117 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -98,7 +98,7 @@ function getImportSourceNames( const { imports } = analyze(contractSource); const importSources = imports.map((i) => - path.join(path.dirname(sourceName), i) + path.join(path.dirname(sourceName), i).replaceAll("\\", "/") ); return [ From 58830defa5d2d93c1d3e90aa4fe3721f596594a3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 25 Mar 2024 14:25:23 +0000 Subject: [PATCH 1193/1302] fix: provide all params to `eth_getCode` We were previously relying on an implicit blocktag. Fixes #715. --- packages/core/src/internal/execution/jsonrpc-client.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 0961e5a919..8c6dab838b 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -619,7 +619,7 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { public async getCode(address: string): Promise { const result = await this._provider.request({ method: "eth_getCode", - params: [address], + params: [address, "latest"], }); assertResponseType("eth_getCode", result, typeof result === "string"); From ad9e52c1259aeebaf8aee7f9014b90e109e6d61b Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 27 Mar 2024 12:38:46 +0000 Subject: [PATCH 1194/1302] fix: add guard to ganache automine check We previously guarded against a network throwing on getting `hardhat_getAutomine` as an RPC call but not `web3_clientVersion`. There is now a guard around both, and a set of unit tests to cover the currently understood tests. Fixes #721. --- .../internal/utils/check-automined-network.ts | 14 ++-- .../test/utils/check-automined-network.ts | 65 +++++++++++++++++++ 2 files changed, 74 insertions(+), 5 deletions(-) create mode 100644 packages/core/test/utils/check-automined-network.ts diff --git a/packages/core/src/internal/utils/check-automined-network.ts b/packages/core/src/internal/utils/check-automined-network.ts index 64c9f11e4a..edcab2728a 100644 --- a/packages/core/src/internal/utils/check-automined-network.ts +++ b/packages/core/src/internal/utils/check-automined-network.ts @@ -16,12 +16,16 @@ export async function checkAutominedNetwork( // just continue with the next check. } - const isGanache = /ganache/i.test( - (await provider.request({ method: "web3_clientVersion" })) as string - ); + try { + const isGanache = /ganache/i.test( + (await provider.request({ method: "web3_clientVersion" })) as string + ); - if (isGanache) { - return true; + if (isGanache) { + return true; + } + } catch { + // If this method failed we aren't using Ganache } return false; diff --git a/packages/core/test/utils/check-automined-network.ts b/packages/core/test/utils/check-automined-network.ts new file mode 100644 index 0000000000..0903929590 --- /dev/null +++ b/packages/core/test/utils/check-automined-network.ts @@ -0,0 +1,65 @@ +import { assert } from "chai"; + +import { checkAutominedNetwork } from "../../src/internal/utils/check-automined-network"; +import { EIP1193Provider } from "../../src/types/provider"; + +describe("check-automin-network", () => { + it("should confirm a Hardhat network that has automining enabled", async () => + assert.isTrue( + await checkAutominedNetwork(setupMockProvider("hardhat", true)), + "Hardhat network should have automining enabled" + )); + + it("should indicate a Hardhat network that has automining disabled", async () => + assert.isFalse( + await checkAutominedNetwork(setupMockProvider("hardhat", false)), + "Hardhat network should _not_ have automining enabled" + )); + + it("should confirm a ganache network", async () => + assert.isTrue( + await checkAutominedNetwork(setupMockProvider("ganache")), + "Ganache networks should have automining enabled" + )); + + it("should indicate not an automining network for other networks", async () => + assert.isFalse( + await checkAutominedNetwork(setupMockProvider("other")), + "Other network should _not_ have automining enabled" + )); +}); + +function setupMockProvider( + network: "hardhat" | "ganache" | "other", + autominingEnabled = true +): EIP1193Provider { + return { + request: async ({ + method, + }: { + method: "hardhat_getAutomine" | "web3_clientVersion"; + }) => { + if (method === "hardhat_getAutomine") { + if (network === "hardhat") { + return autominingEnabled as boolean; + } + + throw new Error("RPC Method hardhat_getAutomine not supported - TEST"); + } + + if (method === "web3_clientVersion") { + if (network === "ganache") { + return "ganache network"; + } + + if (network === "hardhat") { + return "hardhat network"; + } + + throw new Error("RPC Method web3_clientVersion not supported - TEST"); + } + + throw new Error(`RPC Method ${method as string} not supported - TEST`); + }, + } as any; +} From fbfd4b0880cc54718756a8e76fc8bdd2911822d3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 10 Dec 2023 18:55:30 -0500 Subject: [PATCH 1195/1302] small optimization --- packages/core/src/internal/views/find-status.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/core/src/internal/views/find-status.ts b/packages/core/src/internal/views/find-status.ts index 0f2bfdbe65..a80ecf6527 100644 --- a/packages/core/src/internal/views/find-status.ts +++ b/packages/core/src/internal/views/find-status.ts @@ -16,14 +16,16 @@ import { assertIgnitionInvariant } from "../utils/assertions"; export function findStatus( deploymentState: DeploymentState ): Omit { + const executionStates = Object.values(deploymentState.executionStates); + return { - started: Object.values(deploymentState.executionStates) + started: executionStates .filter((ex) => ex.status === ExecutionStatus.STARTED) .map((ex) => ex.id), - successful: Object.values(deploymentState.executionStates) + successful: executionStates .filter((ex) => ex.status === ExecutionStatus.SUCCESS) .map((ex) => ex.id), - held: Object.values(deploymentState.executionStates) + held: executionStates .filter(canFail) .filter((ex) => ex.status === ExecutionStatus.HELD) .map((ex) => { @@ -43,14 +45,14 @@ export function findStatus( reason: ex.result.reason, }; }), - timedOut: Object.values(deploymentState.executionStates) + timedOut: executionStates .filter(canTimeout) .filter((ex) => ex.status === ExecutionStatus.TIMEOUT) .map((ex) => ({ futureId: ex.id, networkInteractionId: ex.networkInteractions.at(-1)!.id, })), - failed: Object.values(deploymentState.executionStates) + failed: executionStates .filter(canFail) .filter((ex) => ex.status === ExecutionStatus.FAILED) .map((ex) => { From 139105687723d353f2ad83ffb70ee7e833b1266a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 10 Dec 2023 21:58:55 -0500 Subject: [PATCH 1196/1302] added new task to list all deployments --- packages/core/src/index.ts | 2 + packages/core/src/list.ts | 66 ++++++++++++++++++++++++++++ packages/core/src/types/list.ts | 27 ++++++++++++ packages/hardhat-plugin/src/index.ts | 41 +++++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 packages/core/src/list.ts create mode 100644 packages/core/src/types/list.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index dbbe347f56..7633e5d287 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,12 +4,14 @@ export { deploy } from "./deploy"; export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; +export { list } from "./list"; export { status } from "./status"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; export * from "./types/errors"; export * from "./types/execution-events"; +export * from "./types/list"; export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; diff --git a/packages/core/src/list.ts b/packages/core/src/list.ts new file mode 100644 index 0000000000..bf6aaa0a29 --- /dev/null +++ b/packages/core/src/list.ts @@ -0,0 +1,66 @@ +import { readdir } from "fs-extra"; +import { join } from "path"; + +import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; +import { assertIgnitionInvariant } from "./internal/utils/assertions"; +import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; +import { ArtifactResolver } from "./types/artifact"; +import { GenericContractInfo, ListResult } from "./types/list"; + +/** + * Return a list of all deployments in the deployment directory. + * + * @param deploymentDir - the directory of the deployments + * + * @beta + */ +export async function list( + deploymentDir: string, + artifactResolver: ArtifactResolver +): Promise { + const deploymentIds = await readdir(deploymentDir); + + const listResult: ListResult = {}; + + for (const deploymentId of deploymentIds) { + const deploymentLoader = new FileDeploymentLoader( + join(deploymentDir, deploymentId) + ); + const deploymentState = await loadDeploymentState(deploymentLoader); + + assertIgnitionInvariant( + deploymentState !== undefined, + `Uninitialized deployment "${deploymentId}" found in deployment directory` + ); + + const deployedContracts = findDeployedContracts(deploymentState); + + const futures: Array<[string, GenericContractInfo[string]]> = []; + + for (const [futureId, deployedContract] of Object.entries( + deployedContracts + )) { + const artifact = await artifactResolver.loadArtifact( + deployedContract.contractName + ); + + futures.push([ + futureId, + { + contractName: deployedContract.contractName, + sourceName: artifact.sourceName, + address: deployedContract.address, + abi: artifact.abi, + }, + ]); + } + + listResult[deploymentId] = Object.fromEntries([ + ...futures, + ["chainId", deploymentState.chainId], + ]); + } + + return listResult; +} diff --git a/packages/core/src/types/list.ts b/packages/core/src/types/list.ts new file mode 100644 index 0000000000..4cbb255ea7 --- /dev/null +++ b/packages/core/src/types/list.ts @@ -0,0 +1,27 @@ +import { Abi } from "./artifact"; + +/** + * The information of a deployed contract. + * + * @beta + */ +export interface GenericContractInfo { + [futureId: string]: { + contractName: string; + sourceName: string; + address: string; + abi: Abi; + }; +} + +/** + * The result of requesting a list of the deployments. It lists the deployments by their IDs, + * and includes the deployed contracts of each. + * + * @beta + */ +export interface ListResult { + [deploymentId: string]: { + chainId: number; + } & GenericContractInfo; +} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 7b1090cb74..bbe5fd5ffd 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -354,6 +354,47 @@ ignitionScope console.log(calculateDeploymentStatusDisplay(deploymentId, statusResult)); }); +ignitionScope + .task("list") + .setDescription("List all deployments") + .setAction(async (_, hre) => { + const { list } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + + const artifactResolver = new HardhatArtifactResolver(hre); + + const deploymentDir = path.join(hre.config.paths.ignition, "deployments"); + + try { + const listResult = await list(deploymentDir, artifactResolver); + + for (const [deploymentId, { chainId, ...deployment }] of Object.entries( + listResult + )) { + console.log(`Deployment ${deploymentId} (chainId: ${chainId}):\n`); + + for (const [futureId, contract] of Object.entries(deployment)) { + console.log(` Future ${futureId}:`); + console.log(` contractName: ${contract.contractName}`); + console.log(` sourceName: ${contract.sourceName}`); + console.log(` address: ${contract.address}`); + console.log(""); + } + + console.log(""); + } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + }); + ignitionScope .task("wipe") .addPositionalParam( From 814974fea7c9938e18823dcf41978a9919e2f391 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 11 Dec 2023 18:13:56 -0500 Subject: [PATCH 1197/1302] refactor list task into deployments task --- packages/core/src/index.ts | 2 +- packages/core/src/list-deployments.ts | 14 ++++++ packages/core/src/list.ts | 66 --------------------------- packages/hardhat-plugin/src/index.ts | 30 +++--------- 4 files changed, 21 insertions(+), 91 deletions(-) create mode 100644 packages/core/src/list-deployments.ts delete mode 100644 packages/core/src/list.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 7633e5d287..346d21638f 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -4,7 +4,7 @@ export { deploy } from "./deploy"; export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; -export { list } from "./list"; +export { listDeployments } from "./list-deployments"; export { status } from "./status"; export * from "./type-guards"; export * from "./types/artifact"; diff --git a/packages/core/src/list-deployments.ts b/packages/core/src/list-deployments.ts new file mode 100644 index 0000000000..eae2573de9 --- /dev/null +++ b/packages/core/src/list-deployments.ts @@ -0,0 +1,14 @@ +import { readdir } from "fs-extra"; + +/** + * Return a list of all deployments in the deployment directory. + * + * @param deploymentDir - the directory of the deployments + * + * @beta + */ +export async function listDeployments( + deploymentDir: string +): Promise { + return readdir(deploymentDir); +} diff --git a/packages/core/src/list.ts b/packages/core/src/list.ts deleted file mode 100644 index bf6aaa0a29..0000000000 --- a/packages/core/src/list.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { readdir } from "fs-extra"; -import { join } from "path"; - -import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; -import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; -import { assertIgnitionInvariant } from "./internal/utils/assertions"; -import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; -import { ArtifactResolver } from "./types/artifact"; -import { GenericContractInfo, ListResult } from "./types/list"; - -/** - * Return a list of all deployments in the deployment directory. - * - * @param deploymentDir - the directory of the deployments - * - * @beta - */ -export async function list( - deploymentDir: string, - artifactResolver: ArtifactResolver -): Promise { - const deploymentIds = await readdir(deploymentDir); - - const listResult: ListResult = {}; - - for (const deploymentId of deploymentIds) { - const deploymentLoader = new FileDeploymentLoader( - join(deploymentDir, deploymentId) - ); - const deploymentState = await loadDeploymentState(deploymentLoader); - - assertIgnitionInvariant( - deploymentState !== undefined, - `Uninitialized deployment "${deploymentId}" found in deployment directory` - ); - - const deployedContracts = findDeployedContracts(deploymentState); - - const futures: Array<[string, GenericContractInfo[string]]> = []; - - for (const [futureId, deployedContract] of Object.entries( - deployedContracts - )) { - const artifact = await artifactResolver.loadArtifact( - deployedContract.contractName - ); - - futures.push([ - futureId, - { - contractName: deployedContract.contractName, - sourceName: artifact.sourceName, - address: deployedContract.address, - abi: artifact.abi, - }, - ]); - } - - listResult[deploymentId] = Object.fromEntries([ - ...futures, - ["chainId", deploymentState.chainId], - ]); - } - - return listResult; -} diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index bbe5fd5ffd..bfd0643769 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -355,36 +355,18 @@ ignitionScope }); ignitionScope - .task("list") - .setDescription("List all deployments") + .task("deployments") + .setDescription("List all deployment IDs") .setAction(async (_, hre) => { - const { list } = await import("@nomicfoundation/ignition-core"); - - const { HardhatArtifactResolver } = await import( - "./hardhat-artifact-resolver" - ); - - const artifactResolver = new HardhatArtifactResolver(hre); + const { listDeployments } = await import("@nomicfoundation/ignition-core"); const deploymentDir = path.join(hre.config.paths.ignition, "deployments"); try { - const listResult = await list(deploymentDir, artifactResolver); - - for (const [deploymentId, { chainId, ...deployment }] of Object.entries( - listResult - )) { - console.log(`Deployment ${deploymentId} (chainId: ${chainId}):\n`); - - for (const [futureId, contract] of Object.entries(deployment)) { - console.log(` Future ${futureId}:`); - console.log(` contractName: ${contract.contractName}`); - console.log(` sourceName: ${contract.sourceName}`); - console.log(` address: ${contract.address}`); - console.log(""); - } + const deployments = await listDeployments(deploymentDir); - console.log(""); + for (const deploymentId of deployments) { + console.log(deploymentId); } } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { From 455dc3ef1207c3af172d174984f9a20a769ca662 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 11 Dec 2023 18:52:25 -0500 Subject: [PATCH 1198/1302] update core status function to return abi info --- packages/core/src/index.ts | 1 - packages/core/src/status.ts | 25 +++++++++++++++-- packages/core/src/types/list.ts | 27 ------------------- packages/core/src/types/status.ts | 13 ++++++++- packages/hardhat-plugin/src/index.ts | 8 +++++- .../calculate-deployment-status-display.ts | 8 ++++++ 6 files changed, 50 insertions(+), 32 deletions(-) delete mode 100644 packages/core/src/types/list.ts diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 346d21638f..c2e0634141 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -11,7 +11,6 @@ export * from "./types/artifact"; export * from "./types/deploy"; export * from "./types/errors"; export * from "./types/execution-events"; -export * from "./types/list"; export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index 7ec89f2d86..08732529c5 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -4,6 +4,7 @@ import { ERRORS } from "./internal/errors-list"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; import { findStatus } from "./internal/views/find-status"; +import { ArtifactResolver } from "./types/artifact"; import { StatusResult } from "./types/status"; /** @@ -13,7 +14,10 @@ import { StatusResult } from "./types/status"; * * @beta */ -export async function status(deploymentDir: string): Promise { +export async function status( + deploymentDir: string, + artifactResolver: Omit +): Promise { const deploymentLoader = new FileDeploymentLoader(deploymentDir); const deploymentState = await loadDeploymentState(deploymentLoader); @@ -25,7 +29,24 @@ export async function status(deploymentDir: string): Promise { } const futureStatuses = findStatus(deploymentState); - const contracts = findDeployedContracts(deploymentState); + const deployedContracts = findDeployedContracts(deploymentState); + + const contracts: StatusResult["contracts"] = {}; + + for (const [futureId, deployedContract] of Object.entries( + deployedContracts + )) { + const artifact = await artifactResolver.loadArtifact( + deployedContract.contractName + ); + + contracts[futureId] = { + ...deployedContract, + contractName: artifact.contractName, + sourceName: artifact.sourceName, + abi: artifact.abi, + }; + } const statusResult: StatusResult = { ...futureStatuses, diff --git a/packages/core/src/types/list.ts b/packages/core/src/types/list.ts deleted file mode 100644 index 4cbb255ea7..0000000000 --- a/packages/core/src/types/list.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { Abi } from "./artifact"; - -/** - * The information of a deployed contract. - * - * @beta - */ -export interface GenericContractInfo { - [futureId: string]: { - contractName: string; - sourceName: string; - address: string; - abi: Abi; - }; -} - -/** - * The result of requesting a list of the deployments. It lists the deployments by their IDs, - * and includes the deployed contracts of each. - * - * @beta - */ -export interface ListResult { - [deploymentId: string]: { - chainId: number; - } & GenericContractInfo; -} diff --git a/packages/core/src/types/status.ts b/packages/core/src/types/status.ts index f502640420..c1005591a2 100644 --- a/packages/core/src/types/status.ts +++ b/packages/core/src/types/status.ts @@ -1,5 +1,16 @@ +import { Abi } from "./artifact"; import { DeployedContract, ExecutionErrorDeploymentResult } from "./deploy"; +/** + * The information of a deployed contract. + * + * @beta + */ +export interface GenericContractInfo extends DeployedContract { + sourceName: string; + abi: Abi; +} + /** * The result of requesting the status of a deployment. It lists the futures * broken down by their status, and includes the deployed contracts. @@ -9,6 +20,6 @@ import { DeployedContract, ExecutionErrorDeploymentResult } from "./deploy"; export interface StatusResult extends Omit { contracts: { - [key: string]: DeployedContract; + [key: string]: GenericContractInfo; }; } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index bfd0643769..5037e6a0c1 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -334,15 +334,21 @@ ignitionScope .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { const { status } = await import("@nomicfoundation/ignition-core"); + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const deploymentDir = path.join( hre.config.paths.ignition, "deployments", deploymentId ); + const artifactResolver = new HardhatArtifactResolver(hre); + let statusResult: StatusResult; try { - statusResult = await status(deploymentDir); + statusResult = await status(deploymentDir, artifactResolver); } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index b226bbb67f..a938788484 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -37,11 +37,15 @@ describe("ui - calculate deployment status display", () => { id: "MyModule#Token", address: exampleAddress, contractName: "Token", + sourceName: "contracts/Token.sol", + abi: [], }, "MyModule#AnotherToken": { id: "MyModule#AnotherToken", address: differentAddress, contractName: "AnotherToken", + sourceName: "contracts/AnotherToken.sol", + abi: [], }, }, }; @@ -130,11 +134,15 @@ describe("ui - calculate deployment status display", () => { id: "MyModule#Token", address: exampleAddress, contractName: "Token", + sourceName: "contracts/Token.sol", + abi: [], }, "MyModule#AnotherToken": { id: "MyModule#AnotherToken", address: differentAddress, contractName: "AnotherToken", + sourceName: "contracts/AnotherToken.sol", + abi: [], }, }, }; From 40cdfdaf0c555ab7810254676ab68b859d934b68 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 11 Dec 2023 18:56:29 -0500 Subject: [PATCH 1199/1302] handle case with no deployments --- packages/core/src/list-deployments.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/core/src/list-deployments.ts b/packages/core/src/list-deployments.ts index eae2573de9..064b446969 100644 --- a/packages/core/src/list-deployments.ts +++ b/packages/core/src/list-deployments.ts @@ -1,4 +1,4 @@ -import { readdir } from "fs-extra"; +import { readdir, pathExists } from "fs-extra"; /** * Return a list of all deployments in the deployment directory. @@ -10,5 +10,9 @@ import { readdir } from "fs-extra"; export async function listDeployments( deploymentDir: string ): Promise { + if (!(await pathExists(deploymentDir))) { + return []; + } + return readdir(deploymentDir); } From 9c47f054d517e29bea916f6a6f674d4ddc9974bd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 11 Dec 2023 20:36:56 -0500 Subject: [PATCH 1200/1302] added tests --- packages/core/.prettierignore | 3 +- packages/core/test/listDeployments.ts | 38 + .../has-deployments/chain-1/blank | 0 .../has-deployments/chain-2/blank | 0 .../artifacts/LockModule#Lock.dbg.json | 4 + .../success/artifacts/LockModule#Lock.json | 74 + .../a119b7bb4b3dd21e4ae94d5054092087.json | 3792 +++++++++++++++++ .../status/success/deployed_addresses.json | 3 + .../test/mocks/status/success/journal.jsonl | 7 + packages/core/test/status.ts | 52 + 10 files changed, 3971 insertions(+), 2 deletions(-) create mode 100644 packages/core/test/listDeployments.ts create mode 100644 packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank create mode 100644 packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank create mode 100644 packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json create mode 100644 packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json create mode 100644 packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json create mode 100644 packages/core/test/mocks/status/success/deployed_addresses.json create mode 100644 packages/core/test/mocks/status/success/journal.jsonl create mode 100644 packages/core/test/status.ts diff --git a/packages/core/.prettierignore b/packages/core/.prettierignore index 494507c078..faea8b6ace 100644 --- a/packages/core/.prettierignore +++ b/packages/core/.prettierignore @@ -5,5 +5,4 @@ /temp /test-integrations/fixture-projects/*/artifacts /test-integrations/fixture-projects/*/cache -/test/mocks/verify/*/artifacts -/test/mocks/verify/*/build-info +/test/mocks/* diff --git a/packages/core/test/listDeployments.ts b/packages/core/test/listDeployments.ts new file mode 100644 index 0000000000..e6b46ac6f4 --- /dev/null +++ b/packages/core/test/listDeployments.ts @@ -0,0 +1,38 @@ +import { assert } from "chai"; +import path from "path"; + +import { listDeployments } from "../src"; + +describe("listDeployments", () => { + it("should return an empty array if given a directory that doesn't exist", async () => { + const result = await listDeployments("nonexistant"); + + assert.deepEqual(result, []); + }); + + it("should return an empty array if given a directory containing no deployments", async () => { + const deploymentDir = path.join( + __dirname, + "mocks", + "listDeployments", + "no-deployments" + ); + + const result = await listDeployments(deploymentDir); + + assert.deepEqual(result, []); + }); + + it("should return an array of deployment IDs if given a directory containing deployments", async () => { + const deploymentDir = path.join( + __dirname, + "mocks", + "listDeployments", + "has-deployments" + ); + + const result = await listDeployments(deploymentDir); + + assert.deepEqual(result, ["chain-1", "chain-2"]); + }); +}); diff --git a/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank b/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank b/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json b/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json new file mode 100644 index 0000000000..cc601cb6fb --- /dev/null +++ b/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/a119b7bb4b3dd21e4ae94d5054092087.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json b/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json new file mode 100644 index 0000000000..81cc1e2c3b --- /dev/null +++ b/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json @@ -0,0 +1,74 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Lock", + "sourceName": "contracts/Lock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json new file mode 100644 index 0000000000..b757a976d6 --- /dev/null +++ b/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json @@ -0,0 +1,3792 @@ +{ + "id": "a119b7bb4b3dd21e4ae94d5054092087", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/Lock.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract Lock {\n uint public unlockTime;\n address payable public owner;\n\n event Withdrawal(uint amount, uint when);\n\n constructor(uint _unlockTime) payable {\n require(\n block.timestamp < _unlockTime,\n \"Unlock time should be in the future\"\n );\n\n unlockTime = _unlockTime;\n owner = payable(msg.sender);\n }\n\n function withdraw() public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n require(block.timestamp >= unlockTime, \"You can't withdraw yet\");\n require(msg.sender == owner, \"You aren't the owner\");\n\n emit Withdrawal(address(this).balance, block.timestamp);\n\n owner.transfer(address(this).balance);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/Lock.sol": { + "ast": { + "absolutePath": "contracts/Lock.sol", + "exportedSymbols": { + "Lock": [ + 78 + ] + }, + "id": 79, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Lock", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 78, + "linearizedBaseContracts": [ + 78 + ], + "name": "Lock", + "nameLocation": "149:4:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "251c1aa3", + "id": 3, + "mutability": "mutable", + "name": "unlockTime", + "nameLocation": "170:10:0", + "nodeType": "VariableDeclaration", + "scope": 78, + "src": "158:22:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "158:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "8da5cb5b", + "id": 5, + "mutability": "mutable", + "name": "owner", + "nameLocation": "207:5:0", + "nodeType": "VariableDeclaration", + "scope": 78, + "src": "184:28:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + "typeName": { + "id": 4, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "184:15:0", + "stateMutability": "payable", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "bf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93", + "id": 11, + "name": "Withdrawal", + "nameLocation": "223:10:0", + "nodeType": "EventDefinition", + "parameters": { + "id": 10, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nameLocation": "239:6:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "234:11:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "234:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 9, + "indexed": false, + "mutability": "mutable", + "name": "when", + "nameLocation": "252:4:0", + "nodeType": "VariableDeclaration", + "scope": 11, + "src": "247:9:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 8, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "247:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "233:24:0" + }, + "src": "217:41:0" + }, + { + "body": { + "id": 36, + "nodeType": "Block", + "src": "300:170:0", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 20, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 17, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "321:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "327:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "321:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 19, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "339:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "321:29:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574757265", + "id": 21, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "358:37:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + }, + "value": "Unlock time should be in the future" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + } + ], + "id": 16, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "306:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 22, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "306:95:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 23, + "nodeType": "ExpressionStatement", + "src": "306:95:0" + }, + { + "expression": { + "id": 26, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 24, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "408:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 25, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "421:11:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "408:24:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 27, + "nodeType": "ExpressionStatement", + "src": "408:24:0" + }, + { + "expression": { + "id": 34, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 28, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "438:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 31, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "454:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 32, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "458:6:0", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "454:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 30, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "446:8:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 29, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "446:8:0", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 33, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "446:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "438:27:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 35, + "nodeType": "ExpressionStatement", + "src": "438:27:0" + } + ] + }, + "id": 37, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13, + "mutability": "mutable", + "name": "_unlockTime", + "nameLocation": "279:11:0", + "nodeType": "VariableDeclaration", + "scope": 37, + "src": "274:16:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "274:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "273:18:0" + }, + "returnParameters": { + "id": 15, + "nodeType": "ParameterList", + "parameters": [], + "src": "300:0:0" + }, + "scope": 78, + "src": "262:208:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 76, + "nodeType": "Block", + "src": "501:437:0", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 44, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 41, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "713:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 42, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "719:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "713:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 43, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "732:10:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "713:29:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "id": 45, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "744:24:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + }, + "value": "You can't withdraw yet" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + } + ], + "id": 40, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "705:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 46, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "705:64:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 47, + "nodeType": "ExpressionStatement", + "src": "705:64:0" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 52, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 49, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "783:3:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "787:6:0", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "783:10:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 51, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "797:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "783:19:0", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "id": 53, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "804:22:0", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + }, + "value": "You aren't the owner" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + } + ], + "id": 48, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "775:7:0", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 54, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "775:52:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 55, + "nodeType": "ExpressionStatement", + "src": "775:52:0" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 59, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "858:4:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + ], + "id": 58, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "850:7:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 57, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "850:7:0", + "typeDescriptions": {} + } + }, + "id": 60, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "850:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "864:7:0", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "850:21:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 62, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "873:5:0", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "879:9:0", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "873:15:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 56, + "name": "Withdrawal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11, + "src": "839:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 64, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "839:50:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 65, + "nodeType": "EmitStatement", + "src": "834:55:0" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 71, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "919:4:0", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$78", + "typeString": "contract Lock" + } + ], + "id": 70, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "911:7:0", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 69, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "911:7:0", + "typeDescriptions": {} + } + }, + "id": 72, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "911:13:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 73, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "925:7:0", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "911:21:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 66, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "896:5:0", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 68, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "902:8:0", + "memberName": "transfer", + "nodeType": "MemberAccess", + "src": "896:14:0", + "typeDescriptions": { + "typeIdentifier": "t_function_transfer_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 74, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "896:37:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 75, + "nodeType": "ExpressionStatement", + "src": "896:37:0" + } + ] + }, + "functionSelector": "3ccfd60b", + "id": 77, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "483:8:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 38, + "nodeType": "ParameterList", + "parameters": [], + "src": "491:2:0" + }, + "returnParameters": { + "id": 39, + "nodeType": "ParameterList", + "parameters": [], + "src": "501:0:0" + }, + "scope": 78, + "src": "474:464:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 79, + "src": "140:800:0", + "usedErrors": [] + } + ], + "src": "39:902:0" + }, + "id": 0 + } + }, + "contracts": { + "contracts/Lock.sol": { + "Lock": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_37": { + "entryPoint": null, + "id": 37, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 240, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack": { + "entryPoint": 381, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 416, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 285, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 186, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 181, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413": { + "entryPoint": 302, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 196, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2248:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:1", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:1" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:1" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:1", + "type": "" + } + ], + "src": "7:75:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:1" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:1" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:1", + "type": "" + } + ], + "src": "334:77:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:1" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:1" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:1" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:1" + }, + "nodeType": "YulIf", + "src": "470:63:1" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:1", + "type": "" + } + ], + "src": "417:122:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:1", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:1" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:1" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:1" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:1" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:1" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:1" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:1", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:1", + "type": "" + } + ], + "src": "545:143:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:274:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "817:83:1", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "819:77:1" + }, + "nodeType": "YulFunctionCall", + "src": "819:79:1" + }, + "nodeType": "YulExpressionStatement", + "src": "819:79:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "792:7:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "801:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "788:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "788:23:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "813:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "784:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "784:32:1" + }, + "nodeType": "YulIf", + "src": "781:119:1" + }, + { + "nodeType": "YulBlock", + "src": "910:128:1", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "925:15:1", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "939:1:1", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "929:6:1", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "954:74:1", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1000:9:1" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1011:6:1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "996:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "996:22:1" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1020:7:1" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "964:31:1" + }, + "nodeType": "YulFunctionCall", + "src": "964:64:1" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "954:6:1" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "741:9:1", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "752:7:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "764:6:1", + "type": "" + } + ], + "src": "694:351:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1147:73:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1164:3:1" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1169:6:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1157:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1157:19:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1157:19:1" + }, + { + "nodeType": "YulAssignment", + "src": "1185:29:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1204:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1209:4:1", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1200:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1200:14:1" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1185:11:1" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1119:3:1", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1124:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1135:11:1", + "type": "" + } + ], + "src": "1051:169:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1332:116:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1354:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1362:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1350:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1350:14:1" + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1366:34:1", + "type": "", + "value": "Unlock time should be in the fut" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1343:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1343:58:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1343:58:1" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1422:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1430:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1418:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1418:15:1" + }, + { + "hexValue": "757265", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1435:5:1", + "type": "", + "value": "ure" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1411:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1411:30:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1411:30:1" + } + ] + }, + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1324:6:1", + "type": "" + } + ], + "src": "1226:222:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1600:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1610:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1676:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1681:2:1", + "type": "", + "value": "35" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1617:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "1617:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1610:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1782:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulIdentifier", + "src": "1693:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "1693:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1693:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "1795:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1806:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1811:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1802:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1802:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1795:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1588:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1596:3:1", + "type": "" + } + ], + "src": "1454:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1997:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2007:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2019:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2030:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2015:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2015:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2007:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2054:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2065:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2050:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2050:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2073:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2079:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2069:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2069:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2043:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2043:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2043:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "2099:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2233:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2107:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "2107:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2099:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1977:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1992:4:1", + "type": "" + } + ], + "src": "1826:419:1" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(memPtr) {\n\n mstore(add(memPtr, 0), \"Unlock time should be in the fut\")\n\n mstore(add(memPtr, 32), \"ure\")\n\n }\n\n function abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 35)\n store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(pos)\n end := add(pos, 64)\n }\n\n function abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x5D8 CODESIZE SUB DUP1 PUSH2 0x5D8 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x25 SWAP2 SWAP1 PUSH2 0xF0 JUMP JUMPDEST DUP1 TIMESTAMP LT PUSH2 0x67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5E SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP CALLER PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP PUSH2 0x1C0 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xCD DUP2 PUSH2 0xBA JUMP JUMPDEST DUP2 EQ PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xEA DUP2 PUSH2 0xC4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106 JUMPI PUSH2 0x105 PUSH2 0xB5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x114 DUP5 DUP3 DUP6 ADD PUSH2 0xDB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x556E6C6F636B2074696D652073686F756C6420626520696E2074686520667574 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7572650000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18A PUSH1 0x23 DUP4 PUSH2 0x11D JUMP JUMPDEST SWAP2 POP PUSH2 0x195 DUP3 PUSH2 0x12E JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1B9 DUP2 PUSH2 0x17D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x409 DUP1 PUSH2 0x1CF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:0:-:0;;;262:208;;;;;;;;;;;;;;;;;;;;;:::i;:::-;339:11;321:15;:29;306:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;421:11;408:10;:24;;;;454:10;438:5;;:27;;;;;;;;;;;;;;;;;;262:208;140:800;;88:117:1;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:351::-;764:6;813:2;801:9;792:7;788:23;784:32;781:119;;;819:79;;:::i;:::-;781:119;939:1;964:64;1020:7;1011:6;1000:9;996:22;964:64;:::i;:::-;954:74;;910:128;694:351;;;;:::o;1051:169::-;1135:11;1169:6;1164:3;1157:19;1209:4;1204:3;1200:14;1185:29;;1051:169;;;;:::o;1226:222::-;1366:34;1362:1;1354:6;1350:14;1343:58;1435:5;1430:2;1422:6;1418:15;1411:30;1226:222;:::o;1454:366::-;1596:3;1617:67;1681:2;1676:3;1617:67;:::i;:::-;1610:74;;1693:93;1782:3;1693:93;:::i;:::-;1811:2;1806:3;1802:12;1795:19;;1454:366;;;:::o;1826:419::-;1992:4;2030:2;2019:9;2015:18;2007:26;;2079:9;2073:4;2069:20;2065:1;2054:9;2050:17;2043:47;2107:131;2233:4;2107:131;:::i;:::-;2099:139;;1826:419;;;:::o;140:800:0:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@owner_5": { + "entryPoint": 523, + "id": 5, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@unlockTime_3": { + "entryPoint": 140, + "id": 3, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@withdraw_77": { + "entryPoint": 146, + "id": 77, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_encode_t_address_payable_to_t_address_payable_fromStack": { + "entryPoint": 663, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack": { + "entryPoint": 763, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack": { + "entryPoint": 871, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 571, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed": { + "entryPoint": 678, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 798, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 906, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 938, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 705, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_address_payable": { + "entryPoint": 645, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 613, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 561, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8": { + "entryPoint": 722, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a": { + "entryPoint": 830, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:3550:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:1", + "type": "" + } + ], + "src": "7:77:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:1" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:1" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:1", + "type": "" + } + ], + "src": "90:118:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:1" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:1", + "type": "" + } + ], + "src": "214:222:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "487:81:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "497:65:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "512:5:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "519:42:1", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "508:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "508:54:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "497:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "469:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "479:7:1", + "type": "" + } + ], + "src": "442:126:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "627:51:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "637:35:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "666:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "648:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "648:24:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "637:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_address_payable", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "609:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "619:7:1", + "type": "" + } + ], + "src": "574:104:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "765:61:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "782:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "813:5:1" + } + ], + "functionName": { + "name": "cleanup_t_address_payable", + "nodeType": "YulIdentifier", + "src": "787:25:1" + }, + "nodeType": "YulFunctionCall", + "src": "787:32:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "775:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "775:45:1" + }, + "nodeType": "YulExpressionStatement", + "src": "775:45:1" + } + ] + }, + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "753:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "760:3:1", + "type": "" + } + ], + "src": "684:142:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "946:140:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "956:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "968:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "979:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "964:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "964:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "956:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1052:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1065:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1076:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1061:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1061:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulIdentifier", + "src": "992:59:1" + }, + "nodeType": "YulFunctionCall", + "src": "992:87:1" + }, + "nodeType": "YulExpressionStatement", + "src": "992:87:1" + } + ] + }, + "name": "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "918:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "930:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "941:4:1", + "type": "" + } + ], + "src": "832:254:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1188:73:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1205:3:1" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1210:6:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1198:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1198:19:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1198:19:1" + }, + { + "nodeType": "YulAssignment", + "src": "1226:29:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1245:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1250:4:1", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1241:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1241:14:1" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1226:11:1" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1160:3:1", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1165:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1176:11:1", + "type": "" + } + ], + "src": "1092:169:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1373:66:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1395:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1403:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1391:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1391:14:1" + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1407:24:1", + "type": "", + "value": "You can't withdraw yet" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1384:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1384:48:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1384:48:1" + } + ] + }, + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1365:6:1", + "type": "" + } + ], + "src": "1267:172:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1591:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1601:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1667:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1672:2:1", + "type": "", + "value": "22" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1608:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "1608:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1601:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1773:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulIdentifier", + "src": "1684:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "1684:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1684:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "1786:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1797:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1793:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1793:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1786:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1579:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1587:3:1", + "type": "" + } + ], + "src": "1445:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1988:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1998:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2010:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2021:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2006:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2006:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1998:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2045:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2056:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2041:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2041:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2064:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2070:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2060:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2060:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2034:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2034:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2034:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "2090:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2224:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2098:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "2098:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2090:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1968:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1983:4:1", + "type": "" + } + ], + "src": "1817:419:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2348:64:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2370:6:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2378:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2366:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2366:14:1" + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "kind": "string", + "nodeType": "YulLiteral", + "src": "2382:22:1", + "type": "", + "value": "You aren't the owner" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2359:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "2359:46:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2359:46:1" + } + ] + }, + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "2340:6:1", + "type": "" + } + ], + "src": "2242:170:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2564:220:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2574:74:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2640:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2645:2:1", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2581:58:1" + }, + "nodeType": "YulFunctionCall", + "src": "2581:67:1" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2574:3:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2746:3:1" + } + ], + "functionName": { + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulIdentifier", + "src": "2657:88:1" + }, + "nodeType": "YulFunctionCall", + "src": "2657:93:1" + }, + "nodeType": "YulExpressionStatement", + "src": "2657:93:1" + }, + { + "nodeType": "YulAssignment", + "src": "2759:19:1", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2770:3:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2775:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2766:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2766:12:1" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2759:3:1" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "2552:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2560:3:1", + "type": "" + } + ], + "src": "2418:366:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2961:248:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2971:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2983:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2994:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2979:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "2979:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2971:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3018:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3029:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3014:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3014:17:1" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3037:4:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3043:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3033:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3033:20:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3007:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "3007:47:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3007:47:1" + }, + { + "nodeType": "YulAssignment", + "src": "3063:139:1", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3197:4:1" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "3071:124:1" + }, + "nodeType": "YulFunctionCall", + "src": "3071:131:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3063:4:1" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2941:9:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2956:4:1", + "type": "" + } + ], + "src": "2790:419:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3341:206:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3351:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3363:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3374:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3359:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3359:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3351:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3431:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3444:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3455:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3440:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3440:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3387:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "3387:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3387:71:1" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3512:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3525:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3536:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3521:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "3521:18:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3468:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "3468:72:1" + }, + "nodeType": "YulExpressionStatement", + "src": "3468:72:1" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3305:9:1", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3317:6:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3325:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3336:4:1", + "type": "" + } + ], + "src": "3215:332:1" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address_payable(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function abi_encode_t_address_payable_to_t_address_payable_fromStack(value, pos) {\n mstore(pos, cleanup_t_address_payable(value))\n }\n\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_payable_to_t_address_payable_fromStack(value0, add(headStart, 0))\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(memPtr) {\n\n mstore(add(memPtr, 0), \"You can't withdraw yet\")\n\n }\n\n function abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 22)\n store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(memPtr) {\n\n mstore(add(memPtr, 0), \"You aren't the owner\")\n\n }\n\n function abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 20)\n store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value1, add(headStart, 32))\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;474:464;;;:::i;:::-;;184:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158:22;;;;:::o;474:464::-;732:10;;713:15;:29;;705:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;797:5;;;;;;;;;;;783:19;;:10;:19;;;775:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;839:50;850:21;873:15;839:50;;;;;;;:::i;:::-;;;;;;;;896:5;;;;;;;;;;;:14;;:37;911:21;896:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;474:464::o;184:28::-;;;;;;;;;;;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:126::-;479:7;519:42;512:5;508:54;497:65;;442:126;;;:::o;574:104::-;619:7;648:24;666:5;648:24;:::i;:::-;637:35;;574:104;;;:::o;684:142::-;787:32;813:5;787:32;:::i;:::-;782:3;775:45;684:142;;:::o;832:254::-;941:4;979:2;968:9;964:18;956:26;;992:87;1076:1;1065:9;1061:17;1052:6;992:87;:::i;:::-;832:254;;;;:::o;1092:169::-;1176:11;1210:6;1205:3;1198:19;1250:4;1245:3;1241:14;1226:29;;1092:169;;;;:::o;1267:172::-;1407:24;1403:1;1395:6;1391:14;1384:48;1267:172;:::o;1445:366::-;1587:3;1608:67;1672:2;1667:3;1608:67;:::i;:::-;1601:74;;1684:93;1773:3;1684:93;:::i;:::-;1802:2;1797:3;1793:12;1786:19;;1445:366;;;:::o;1817:419::-;1983:4;2021:2;2010:9;2006:18;1998:26;;2070:9;2064:4;2060:20;2056:1;2045:9;2041:17;2034:47;2098:131;2224:4;2098:131;:::i;:::-;2090:139;;1817:419;;;:::o;2242:170::-;2382:22;2378:1;2370:6;2366:14;2359:46;2242:170;:::o;2418:366::-;2560:3;2581:67;2645:2;2640:3;2581:67;:::i;:::-;2574:74;;2657:93;2746:3;2657:93;:::i;:::-;2775:2;2770:3;2766:12;2759:19;;2418:366;;;:::o;2790:419::-;2956:4;2994:2;2983:9;2979:18;2971:26;;3043:9;3037:4;3033:20;3029:1;3018:9;3014:17;3007:47;3071:131;3197:4;3071:131;:::i;:::-;3063:139;;2790:419;;;:::o;3215:332::-;3336:4;3374:2;3363:9;3359:18;3351:26;;3387:71;3455:1;3444:9;3440:17;3431:6;3387:71;:::i;:::-;3468:72;3536:2;3525:9;3521:18;3512:6;3468:72;:::i;:::-;3215:332;;;;;:::o" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "unlockTime()": "251c1aa3", + "withdraw()": "3ccfd60b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"when\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lock.sol\":\"Lock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lock.sol\":{\"keccak256\":\"0x290d672235b22ec4740c076ad0108b37f5d3073810f5c7d502d90c72591ee9dc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3d74a8be6305243875a1e4bb2c8fcbd29672aa20a3781595cfbee6b743358b6b\",\"dweb:/ipfs/QmVWAacJB7wL7fBhAyvyqJLWDCEL9vMfwEeR3ydxtsprLf\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/success/deployed_addresses.json b/packages/core/test/mocks/status/success/deployed_addresses.json new file mode 100644 index 0000000000..c9458b58bc --- /dev/null +++ b/packages/core/test/mocks/status/success/deployed_addresses.json @@ -0,0 +1,3 @@ +{ + "LockModule#Lock": "0x5FbDB2315678afecb367f032d93F642f64180aa3" +} diff --git a/packages/core/test/mocks/status/success/journal.jsonl b/packages/core/test/mocks/status/success/journal.jsonl new file mode 100644 index 0000000000..960fcf146b --- /dev/null +++ b/packages/core/test/mocks/status/success/journal.jsonl @@ -0,0 +1,7 @@ + +{"chainId":1,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Lock","hash":"0x785b3940e12d7876bd3dfc01b906ebd9faf7438a0e35eda5323ac3c6c5ca0b9e","networkInteractionId":1,"receipt":{"blockHash":"0xb4d7a7cb1e9c67a4fa86f0ff358243f756201a7e2200f45b9c1b0d97c251151a","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/status.ts b/packages/core/test/status.ts new file mode 100644 index 0000000000..118823081c --- /dev/null +++ b/packages/core/test/status.ts @@ -0,0 +1,52 @@ +import { assert } from "chai"; +import path from "path"; + +import { Artifact, status } from "../src"; + +import { setupMockArtifactResolver } from "./helpers"; + +describe("status", () => { + it("should return a status result for a successful deployment", async () => { + const expectedResult = { + started: [], + successful: ["LockModule#Lock"], + held: [], + timedOut: [], + failed: [], + contracts: { + "LockModule#Lock": { + id: "LockModule#Lock", + contractName: "ArtifactLock", + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + sourceName: "contracts/ArtifactLock.sol", + abi: ["test"], + }, + }, + }; + + const fakeArtifact: Artifact = { + abi: ["test"], + contractName: "ArtifactLock", + sourceName: "contracts/ArtifactLock.sol", + bytecode: "", + linkReferences: {}, + }; + + const deploymentDir = path.join(__dirname, "mocks", "status", "success"); + + const artifactResolver = setupMockArtifactResolver({ Lock: fakeArtifact }); + + const result = await status(deploymentDir, artifactResolver); + + assert.deepEqual(result, expectedResult); + }); + + it("should throw an error if the deployment is not initialized", async () => { + const artifactResolver = setupMockArtifactResolver(); + + await assert.isRejected( + status("fake", artifactResolver), + /IGN800: Cannot get status for nonexistant deployment at fake/ + ); + }); +}); From 6c5e76d5dd41065dec582e28362da122ec070241 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 8 Jan 2024 14:41:33 +0000 Subject: [PATCH 1201/1302] test: fix to match new status api --- packages/hardhat-plugin/test/deploy/reset.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/test/deploy/reset.ts b/packages/hardhat-plugin/test/deploy/reset.ts index b7155c1294..2615060f12 100644 --- a/packages/hardhat-plugin/test/deploy/reset.ts +++ b/packages/hardhat-plugin/test/deploy/reset.ts @@ -1,6 +1,7 @@ import { status } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; +import { HardhatArtifactResolver } from "../../src/hardhat-artifact-resolver"; import { useFileIgnitionProject } from "../test-helpers/use-ignition-project"; describe("reset flag", function () { @@ -27,7 +28,8 @@ describe("reset flag", function () { } ); - const result = await status(this.deploymentDir!); + const artifactResolver = new HardhatArtifactResolver(this.hre); + const result = await status(this.deploymentDir!, artifactResolver); // ResetModule#B will only be in the success list if the second // run ran without any reconciliation errors - so the retry From 9ea61d60da668fd40d18b132889ce5ab76acf6f4 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 10 Jan 2024 09:45:03 +0000 Subject: [PATCH 1202/1302] docs: update signature doc --- packages/core/src/status.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index 08732529c5..2222dc996b 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -11,6 +11,8 @@ import { StatusResult } from "./types/status"; * Show the status of a deployment. * * @param deploymentDir - the directory of the deployment to get the status of + * @param artifactResolver - the artifact resolver to use when loading artifacts + * for a future * * @beta */ From 15aa847e091accd8b2f61c4266896afb794855a5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 12 Dec 2023 20:51:39 -0500 Subject: [PATCH 1203/1302] wipe deployment state if hardhat-network has been restarted --- packages/hardhat-plugin/src/index.ts | 35 +++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 5037e6a0c1..61f25fb96c 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -5,7 +5,14 @@ import { IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; -import { readFile, readdirSync, rm } from "fs-extra"; +import { + readdirSync, + rm, + pathExists, + writeJSON, + ensureDir, + readFile, +} from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { HardhatPluginError, @@ -163,6 +170,32 @@ ignitionScope return; } } + } else if (deploymentDir !== undefined) { + // since we're on hardhat-network + // check for a previous run of this deploymentId and compare instanceIds + // if they're different, wipe deployment state + const instanceFilePath = path.join( + path.dirname(deploymentDir), + ".hardhat-network-instances.json" + ); + const instanceFileExists = await pathExists(instanceFilePath); + + const instanceFile: { + [deploymentId: string]: string; + } = instanceFileExists ? require(instanceFilePath) : {}; + + const metadata = (await hre.network.provider.request({ + method: "hardhat_metadata", + })) as { instanceId: string }; + + if (instanceFile[deploymentId] !== metadata.instanceId) { + await rm(deploymentDir, { recursive: true, force: true }); + } + + // save current instanceId to instanceFile for future runs + instanceFile[deploymentId] = metadata.instanceId; + await ensureDir(path.dirname(instanceFilePath)); + await writeJSON(instanceFilePath, instanceFile, { spaces: 2 }); } if (reset) { From f4da89480762232ac3709cadfcdd5055596855e9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 12 Dec 2023 23:03:52 -0500 Subject: [PATCH 1204/1302] added environment variables to skip cli confirmations --- .../hardhat.config.js | 6 +++++ .../chain-1337/deployed_addresses.json | 3 +++ .../{chain-31337 => chain-1337}/journal.jsonl | 10 ++++----- .../chain-31337/deployed_addresses.json | 3 --- .../internal/reconciliation/chainId.ts | 5 ++++- packages/hardhat-plugin/src/index.ts | 22 ++++++++++--------- 6 files changed, 30 insertions(+), 19 deletions(-) create mode 100644 packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json rename packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/{chain-31337 => chain-1337}/journal.jsonl (80%) delete mode 100644 packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js index c76e2c9b8d..9a5525a3d5 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js @@ -11,4 +11,10 @@ module.exports = { }, }, }, + networks: { + hardhat: { + // We use a different chain id to avoid triggering the auto-wipe for fixtures + chainId: 1337, + }, + }, }; diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json new file mode 100644 index 0000000000..c9458b58bc --- /dev/null +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json @@ -0,0 +1,3 @@ +{ + "LockModule#Lock": "0x5FbDB2315678afecb367f032d93F642f64180aa3" +} diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl similarity index 80% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl rename to packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl index 2cfa12c559..ec327d94c1 100644 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/journal.jsonl +++ b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl @@ -1,7 +1,7 @@ {"chainId":123,"type":"DEPLOYMENT_INITIALIZE"} -{"artifactId":"LockModule:Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule:Lock","futureType":"NAMED_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} -{"futureId":"LockModule:Lock","networkInteraction":{"data":"0x60806040526040516105a23803806105a2833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b6103d3806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b93925050505600000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} -{"futureId":"LockModule:Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d"},"type":"TRANSACTION_SEND"} -{"futureId":"LockModule:Lock","hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d","networkInteractionId":1,"receipt":{"blockHash":"0xf35aacce8d5fc6276fc544712013691b75fd980178c2a58e63bc37ee1cd76371","blockNumber":1,"contractAddress":"0x5fbdb2315678afecb367f032d93f642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} -{"futureId":"LockModule:Lock","result":{"address":"0x5fbdb2315678afecb367f032d93f642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105a23803806105a2833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b6103d3806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b93925050505600000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"3000000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Lock","hash":"0x6b9830b7fe0d88787e8a757496c71ece7740ba1f10b4ff1be26ab8ec6d8ed61d","networkInteractionId":1,"receipt":{"blockHash":"0xf29283c1f3d6547f3bca166c988a9c4607952c25df251ea04f49eaf6f67827f7","blockNumber":1,"contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0x5FbDB2315678afecb367f032d93F642f64180aa3","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json b/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json deleted file mode 100644 index ea65493e30..0000000000 --- a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-31337/deployed_addresses.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "LockModule:Lock": "0x5fbdb2315678afecb367f032d93f642f64180aa3" -} diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts index a1048cf756..b14bf3a2bc 100644 --- a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts +++ b/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts @@ -9,6 +9,7 @@ describe("chainId reconciliation", function () { it("should halt when running a deployment on a different chain", async function () { this.hre.network.name = "something-else"; + process.env.HARDHAT_IGNITION_CONFIRM_DEPLOYMENT = "true"; await assert.isRejected( this.hre.run( @@ -17,7 +18,9 @@ describe("chainId reconciliation", function () { modulePath: "./ignition/modules/LockModule.js", } ), - /The deployment's chain cannot be changed between runs. The deployment was previously run against the chain 123, but the current network is the chain 31337./ + /The deployment's chain cannot be changed between runs. The deployment was previously run against the chain 123, but the current network is the chain 1337./ ); + + delete process.env.HARDHAT_IGNITION_CONFIRM_DEPLOYMENT; }); }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 61f25fb96c..c4b5d4941b 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -145,19 +145,21 @@ ignitionScope : path.join(hre.config.paths.ignition, "deployments", deploymentId); if (chainId !== 31337) { - const prompt = await Prompt({ - type: "confirm", - name: "networkConfirmation", - message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, - initial: false, - }); + if (process.env.HARDHAT_IGNITION_CONFIRM_DEPLOYMENT === undefined) { + const prompt = await Prompt({ + type: "confirm", + name: "networkConfirmation", + message: `Confirm deploy to network ${hre.network.name} (${chainId})?`, + initial: false, + }); - if (prompt.networkConfirmation !== true) { - console.log("Deploy cancelled"); - return; + if (prompt.networkConfirmation !== true) { + console.log("Deploy cancelled"); + return; + } } - if (reset) { + if (reset && process.env.HARDHAT_IGNITION_CONFIRM_RESET === undefined) { const resetPrompt = await Prompt({ type: "confirm", name: "resetConfirmation", From 020ed78f29ca225a2bbeb332517ebabef9df91ad Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 1 Apr 2024 15:52:58 +0000 Subject: [PATCH 1205/1302] Store the new file in the cache instead --- packages/hardhat-plugin/src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index c4b5d4941b..45c6b84068 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -177,7 +177,7 @@ ignitionScope // check for a previous run of this deploymentId and compare instanceIds // if they're different, wipe deployment state const instanceFilePath = path.join( - path.dirname(deploymentDir), + hre.config.paths.cache, ".hardhat-network-instances.json" ); const instanceFileExists = await pathExists(instanceFilePath); From d2856de0be102e3f37cd46283d2bf673d85a9995 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 1 Apr 2024 12:17:10 -0400 Subject: [PATCH 1206/1302] remove unused coverage test --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 973b3ff01e..6e339bf5c5 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "test:coverage": "npm run test:coverage -w packages", "test:examples": "npm run test -w examples --if-present", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "npm run build && npm run lint && npm run test:coverage && npm run test:examples", + "fullcheck": "npm run build && npm run lint && npm run test:examples", "clean": "npm run clean --workspaces --if-present" }, "devDependencies": { From 1c43a334bfaf07a9583390182c2bf693d5108bf4 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 1 Apr 2024 12:22:47 -0400 Subject: [PATCH 1207/1302] remove coverage in ci --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1564b4616f..760e09edc6 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -22,7 +22,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test:coverage + run: npm run test - name: Run tests in examples run: npm run test:examples @@ -40,7 +40,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test:coverage + run: npm run test - name: Run tests in examples run: npm run test:examples @@ -61,7 +61,7 @@ jobs: - name: Build run: npm run build - name: Run tests - run: npm run test:coverage + run: npm run test - name: Run tests in examples run: npm run test:examples From e6af00c8aeea80fefe281c5252c5ab52e340a290 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 11 Jan 2024 01:28:40 -0500 Subject: [PATCH 1208/1302] add chainId to status output --- packages/core/src/status.ts | 1 + packages/core/src/types/status.ts | 1 + packages/core/test/status.ts | 1 + .../ui/helpers/calculate-deployment-status-display.ts | 6 +++--- .../ui/helpers/calculate-deployment-status-display.ts | 10 ++++++---- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index 2222dc996b..be3a6f9d05 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -52,6 +52,7 @@ export async function status( const statusResult: StatusResult = { ...futureStatuses, + chainId: deploymentState.chainId, contracts, }; diff --git a/packages/core/src/types/status.ts b/packages/core/src/types/status.ts index c1005591a2..a343acc9ee 100644 --- a/packages/core/src/types/status.ts +++ b/packages/core/src/types/status.ts @@ -19,6 +19,7 @@ export interface GenericContractInfo extends DeployedContract { */ export interface StatusResult extends Omit { + chainId: number; contracts: { [key: string]: GenericContractInfo; }; diff --git a/packages/core/test/status.ts b/packages/core/test/status.ts index 118823081c..0f98303f9b 100644 --- a/packages/core/test/status.ts +++ b/packages/core/test/status.ts @@ -13,6 +13,7 @@ describe("status", () => { held: [], timedOut: [], failed: [], + chainId: 1, contracts: { "LockModule#Lock": { id: "LockModule#Lock", diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts index f0edec0a05..49c461e174 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts @@ -21,7 +21,7 @@ export function calculateDeploymentStatusDisplay( } function _calculateSuccess(deploymentId: string, statusResult: StatusResult) { - let successText = `Deployment ${deploymentId} was successful\n\n`; + let successText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) was successful\n\n`; if (Object.values(statusResult.contracts).length === 0) { successText += chalk.italic("No contracts were deployed"); @@ -40,7 +40,7 @@ function _calculateStartedButUnfinished( deploymentId: string, statusResult: StatusResult ) { - let startedText = `Deployment ${deploymentId} has futures that have started but not completed\n\n`; + let startedText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) has futures that have started but not completed\n\n`; startedText += Object.values(statusResult.started) .map((futureId) => ` - ${futureId}`) @@ -52,7 +52,7 @@ function _calculateStartedButUnfinished( } function _calculateFailed(deploymentId: string, statusResult: StatusResult) { - let failedExecutionText = `Deployment ${deploymentId} failed\n`; + let failedExecutionText = `Deployment ${deploymentId} (chainId: ${statusResult.chainId}) failed\n`; const sections: string[] = []; diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts index a938788484..b4f5e3dae1 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts @@ -11,6 +11,7 @@ describe("ui - calculate deployment status display", () => { const differentAddress = "0x0011223344556677889900112233445566778899"; const exampleStatusResult = { + chainId: 1, started: [], timedOut: [], held: [], @@ -22,7 +23,7 @@ describe("ui - calculate deployment status display", () => { describe("successful deployment", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - Deployment deployment-01 was successful + Deployment deployment-01 (chainId: 1) was successful ${chalk.bold("Deployed Addresses")} @@ -60,7 +61,7 @@ describe("ui - calculate deployment status display", () => { it("should render a sucessful deployment with no deploys", () => { const expectedText = testFormat(` - Deployment deployment-01 was successful + Deployment deployment-01 (chainId: 1) was successful ${chalk.italic("No contracts were deployed")}`); @@ -82,7 +83,7 @@ describe("ui - calculate deployment status display", () => { describe("failed deployment", () => { it("should render an execution failure with multiple of each problem type", () => { const expectedText = testFormat(` - Deployment deployment-01 failed + Deployment deployment-01 (chainId: 1) failed Futures timed out with transactions unconfirmed after maximum fee bumps: - MyModule:MyContract1 @@ -99,6 +100,7 @@ describe("ui - calculate deployment status display", () => { - MyModule:AnotherContract2: Server timed out`); const statusResult: StatusResult = { + chainId: 1, started: [], timedOut: [ { futureId: "MyModule:MyContract1", networkInteractionId: 1 }, @@ -159,7 +161,7 @@ describe("ui - calculate deployment status display", () => { describe("deployment with started but unfinished futures (e.g. simulation errors)", () => { it("should render a sucessful deployment", () => { const expectedText = testFormat(` - Deployment deployment-01 has futures that have started but not completed + Deployment deployment-01 (chainId: 1) has futures that have started but not completed - MyModule#Token - MyModule#AnotherToken From 03bbc5b151a05ca6fa3568c6245e36e32356afbc Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 29 Jan 2024 23:21:14 -0500 Subject: [PATCH 1209/1302] revert allocate nonce after simulation fails --- .../future-processor/handlers/send-transaction.ts | 8 ++++++++ .../nonce-management/json-rpc-nonce-manager.ts | 12 ++++++++++++ .../core/test/execution/future-processor/utils.ts | 3 +++ 3 files changed, 23 insertions(+) diff --git a/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts b/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts index c3f7ceb05f..1df9e52227 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts @@ -110,6 +110,14 @@ export async function sendTransaction( } ); + // If the transaction failed during simulation, we need to revert the nonce allocation + if ( + result.type === ExecutionResultType.STRATEGY_SIMULATION_ERROR || + result.type === ExecutionResultType.SIMULATION_ERROR + ) { + nonceManager.revertNonce(exState.from); + } + if (result.type === TRANSACTION_SENT_TYPE) { transactionTrackingTimer.addTransaction(result.transaction.hash); diff --git a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts index de39f5e2d1..db45b2a3c0 100644 --- a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts +++ b/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts @@ -16,6 +16,14 @@ export interface NonceManager { * interrupted. */ getNextNonce(sender: string): Promise; + + /** + * Reverts the last nonce allocation for a given sender. + * + * This method is used when a nonce has been allocated, + * but the transaction fails during simulation and is not sent. + */ + revertNonce(sender: string): void; } /** @@ -53,4 +61,8 @@ export class JsonRpcNonceManager implements NonceManager { return expectedNonce; } + + public revertNonce(sender: string): void { + this._maxUsedNonce[sender] -= 1; + } } diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index a71b8183e3..c37ded4177 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -76,6 +76,9 @@ function setupMockNonceManager(): NonceManager { getNextNonce: async (_sender: string): Promise => { return nonceCount++; }, + revertNonce: (_sender: string): void => { + nonceCount--; + }, }; } From 93c8e28b11b113c248efdf8c8bbf4c3ef4f5d622 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 30 Jan 2024 02:29:11 -0500 Subject: [PATCH 1210/1302] add test to cover case --- .../revert-nonce-on-simulation-error.ts | 34 +++++++++++++++++++ .../minimal/contracts/FailureCalls.sol | 16 +++++++++ 2 files changed, 50 insertions(+) create mode 100644 packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts new file mode 100644 index 0000000000..fecd8b3078 --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts @@ -0,0 +1,34 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../../test-helpers/use-ignition-project"; + +/** + * On running a deploy, if a transaction fails simulation, we should + * revert the allocated nonce and complete the rest of the batch. + * + * This test ensures that the nonce is reverted and the rest of the batch completes + * because the second transaction does not fail the nonce check. + */ +describe("execution - revert nonce on simulation error", () => { + useEphemeralIgnitionProject("minimal"); + + it("should raise the simulation error if there are multiple transactions in a batch and fails simulation", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + // batch 1 + const foo = m.contract("FailureCalls"); + + // batch 2 + m.call(foo, "fails"); + m.call(foo, "doesNotFail"); + + return { foo }; + }); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Simulating the transaction failed with error: Reverted with reason "fails"/ + ); + }); +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol new file mode 100644 index 0000000000..9db5e14ac0 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; + +contract FailureCalls { + bool public success; + + function fails() public { + success = false; + revert("fails"); + } + + function doesNotFail() public { + // modify the state so the function isn't pure/view + success = true; + } +} From 6b53427f762e5004195d6710a12d6a7e119e6670 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 1 Apr 2024 13:41:20 -0300 Subject: [PATCH 1211/1302] Update packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts --- .../deploy/nonce-checks/revert-nonce-on-simulation-error.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts index fecd8b3078..3e9284efc3 100644 --- a/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts +++ b/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts @@ -26,6 +26,8 @@ describe("execution - revert nonce on simulation error", () => { return { foo }; }); + // We check that it doesn't fail because of a nonce validation, + // but because of the actual simulation await assert.isRejected( this.hre.ignition.deploy(moduleDefinition), /Simulating the transaction failed with error: Reverted with reason "fails"/ From f856b8871bc1dd3e7b8dd07859e5792463924aef Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 30 Jan 2024 02:12:04 -0500 Subject: [PATCH 1212/1302] added a test to ensure simulation errors are displayed when account has low ETH --- .../test/deploy/gas-estimation.ts | 27 +++++++++++++++++++ .../minimal/contracts/Fails.sol | 9 +++++++ 2 files changed, 36 insertions(+) create mode 100644 packages/hardhat-plugin/test/deploy/gas-estimation.ts create mode 100644 packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol diff --git a/packages/hardhat-plugin/test/deploy/gas-estimation.ts b/packages/hardhat-plugin/test/deploy/gas-estimation.ts new file mode 100644 index 0000000000..bc8cbdf8aa --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/gas-estimation.ts @@ -0,0 +1,27 @@ +/* eslint-disable import/no-unused-modules */ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("gas estimation", function () { + useEphemeralIgnitionProject("minimal"); + + it("should throw with simulation error if sender account has less ETH than gas estimate", async function () { + const moduleDefinition = buildModule("FooModule", (m) => { + const foo = m.contract("Fails"); + + return { foo }; + }); + + await this.hre.network.provider.send("hardhat_setBalance", [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x1", + ]); + + await assert.isRejected( + this.hre.ignition.deploy(moduleDefinition), + /Simulating the transaction failed with error: Reverted with reason "Constructor failed"/ + ); + }); +}); diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol new file mode 100644 index 0000000000..60f8354fdc --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: GPL-3.0 +pragma solidity >=0.7.0 <0.9.0; +pragma experimental ABIEncoderV2; + +contract Fails { + constructor() { + revert("Constructor failed"); + } +} From 6a4d7c87d50190636b9bc10cb2a2de678c6d3f0d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 4 Feb 2024 23:50:02 -0500 Subject: [PATCH 1213/1302] remove fees before simulation --- .../helpers/network-interaction-execution.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts index 7701e13f0a..50691c1f6d 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts @@ -133,6 +133,11 @@ export async function sendTransactionForOnchainInteraction( try { gasLimit = await client.estimateGas(estimateGasPrams); } catch (error) { + // We remove the fees before simulating the transaction since we weren't able to estimate gas + // and otherwise geth will try to use the block gas limit as `gas`, and most accounts don't + // have enough balance to pay for that. + const { fees: _fees, ...paramsWithoutFees } = estimateGasPrams; + // If the gas estimation failed, we simulate the transaction to get information // about why it failed. // @@ -140,7 +145,7 @@ export async function sendTransactionForOnchainInteraction( // too broad and make the assertion below fail. We could try to catch only // estimation errors. const failedEstimateGasSimulationResult = await client.call( - estimateGasPrams, // TODO: we need to set a gas limit here, or the simulation could fail due to a lack of funds + paramsWithoutFees, "pending" ); From 24b02d9353d0bdb8c2dc856c925eac193db182f5 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 21 Feb 2024 00:45:17 -0500 Subject: [PATCH 1214/1302] add configurable limit for maxFeePerGas --- packages/core/src/deploy.ts | 6 ++++- packages/core/src/internal/errors-list.ts | 4 ++++ .../src/internal/execution/jsonrpc-client.ts | 14 ++++++++++- .../internal/new-execution/jsonrpc-client.ts | 14 +++++++++++ packages/hardhat-plugin/src/index.ts | 10 ++++++++ .../hardhat-plugin/src/type-extensions.ts | 24 +++++++++++++++++++ .../src/utils/shouldBeHardhatPluginError.ts | 8 +++---- 7 files changed, 74 insertions(+), 6 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 3f8c135f09..884d58266c 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -51,6 +51,7 @@ export async function deploy< defaultSender: givenDefaultSender, strategy, strategyConfig, + maxFeePerGasLimit, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -67,6 +68,7 @@ export async function deploy< defaultSender?: string; strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; + maxFeePerGasLimit?: bigint; }): Promise { const executionStrategy: ExecutionStrategy = resolveStrategy( strategy, @@ -110,7 +112,9 @@ export async function deploy< ? new EphemeralDeploymentLoader(artifactResolver, executionEventListener) : new FileDeploymentLoader(deploymentDir, executionEventListener); - const jsonRpcClient = new EIP1193JsonRpcClient(provider); + const jsonRpcClient = new EIP1193JsonRpcClient(provider, { + maxFeePerGasLimit, + }); const isAutominedNetwork = await checkAutominedNetwork(provider); diff --git a/packages/core/src/internal/errors-list.ts b/packages/core/src/internal/errors-list.ts index 2181eec712..96210e61d4 100644 --- a/packages/core/src/internal/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -179,6 +179,10 @@ export const ERRORS = { message: "The configured base fee exceeds the block gas limit. Please reduce the configured base fee or increase the block gas limit.", }, + MAX_FEE_PER_GAS_EXCEEDS_GAS_LIMIT: { + number: 407, + message: "The calculated max fee per gas exceeds the configured limit.", + }, }, RECONCILIATION: { INVALID_EXECUTION_STATUS: { diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 8c6dab838b..d13420f4f7 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -185,7 +185,10 @@ export interface JsonRpcClient { * A JsonRpcClient that uses an EIP-1193 provider to make the calls. */ export class EIP1193JsonRpcClient implements JsonRpcClient { - constructor(private readonly _provider: EIP1193Provider) {} + constructor( + private readonly _provider: EIP1193Provider, + private readonly _config?: { maxFeePerGasLimit?: bigint } + ) {} public async getChainId(): Promise { const response = await this._provider.request({ @@ -208,6 +211,15 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { const maxFeePerGas = latestBlock.baseFeePerGas * 2n + maxPriorityFeePerGas; + if ( + this._config?.maxFeePerGasLimit !== undefined && + maxFeePerGas > this._config.maxFeePerGasLimit + ) { + throw new IgnitionError( + ERRORS.EXECUTION.MAX_FEE_PER_GAS_EXCEEDS_GAS_LIMIT + ); + } + return { maxFeePerGas, maxPriorityFeePerGas, diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 6c05212a35..771959fbcb 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -92,6 +92,20 @@ describe("JSON-RPC client", function () { assert.typeOf(fees.maxPriorityFeePerGas, "bigint"); assert.isTrue(fees.maxFeePerGas > fees.maxPriorityFeePerGas); }); + + it('Should throw if the "maxFeePerGas" exceeds the configured limit', async function () { + const failClient = new EIP1193JsonRpcClient( + this.hre.network.provider, + { + maxFeePerGasLimit: 1n, + } + ); + + await assert.isRejected( + failClient.getNetworkFees(), + /IGN407: The calculated max fee per gas exceeds the configured limit./ + ); + }); }); }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 45c6b84068..2e5c25c081 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -48,6 +48,14 @@ extendConfig((config, userConfig) => { ), }; + Object.keys(config.networks).forEach((networkName) => { + const userNetworkConfig = userConfig.networks?.[networkName] ?? {}; + + config.networks[networkName].ignition = { + maxFeePerGasLimit: userNetworkConfig.ignition?.maxFeePerGasLimit, + }; + }); + /* setup core configs */ const userIgnitionConfig = userConfig.ignition ?? {}; @@ -264,6 +272,8 @@ ignitionScope defaultSender, strategy: strategyName, strategyConfig, + maxFeePerGasLimit: + hre.config.networks[hre.network.name]?.ignition.maxFeePerGasLimit, }); if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index bfeaa8bde8..83e570c73f 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -13,6 +13,30 @@ declare module "hardhat/types/config" { ignition: string; } + export interface HardhatNetworkUserConfig { + ignition?: { + maxFeePerGasLimit?: bigint; + }; + } + + export interface HardhatNetworkConfig { + ignition: { + maxFeePerGasLimit?: bigint; + }; + } + + export interface HttpNetworkUserConfig { + ignition?: { + maxFeePerGasLimit?: bigint; + }; + } + + export interface HttpNetworkConfig { + ignition: { + maxFeePerGasLimit?: bigint; + }; + } + export interface HardhatUserConfig { ignition?: Partial & { strategyConfig?: Partial; diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index 716266f56b..021c6f1345 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -9,10 +9,10 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ const whitelist = [ - 200, 201, 202, 203, 204, 403, 404, 405, 406, 600, 601, 602, 700, 701, 702, - 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, 1101, - 1102, 1103, + 200, 201, 202, 203, 204, 403, 404, 405, 406, 407, 600, 601, 602, 700, 701, + 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, + 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, + 1101, 1102, 1103, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { From 131cd31db8a1ef1437b5d465a8888c65834a9525 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 1 Apr 2024 17:08:35 +0000 Subject: [PATCH 1215/1302] Also check legacy transactions for max fee limit --- .../src/internal/execution/jsonrpc-client.ts | 67 ++++++++++--------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index d13420f4f7..7ba401437d 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -202,38 +202,19 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { } public async getNetworkFees(): Promise { - const latestBlock = await this.getLatestBlock(); - - // We prioritize EIP-1559 fees over legacy gasPrice fees - if (latestBlock.baseFeePerGas !== undefined) { - // Logic copied from ethers v6 - const maxPriorityFeePerGas = 1_000_000_000n; // 1gwei - const maxFeePerGas = - latestBlock.baseFeePerGas * 2n + maxPriorityFeePerGas; - - if ( - this._config?.maxFeePerGasLimit !== undefined && - maxFeePerGas > this._config.maxFeePerGasLimit - ) { - throw new IgnitionError( - ERRORS.EXECUTION.MAX_FEE_PER_GAS_EXCEEDS_GAS_LIMIT - ); - } - - return { - maxFeePerGas, - maxPriorityFeePerGas, - }; + const fees = await this._getNetworkFees(); + const maxFees = "gasPrice" in fees ? fees.gasPrice : fees.maxFeePerGas; + + if ( + this._config?.maxFeePerGasLimit !== undefined && + maxFees > this._config.maxFeePerGasLimit + ) { + throw new IgnitionError( + ERRORS.EXECUTION.MAX_FEE_PER_GAS_EXCEEDS_GAS_LIMIT + ); } - const response = await this._provider.request({ - method: "eth_gasPrice", - params: [], - }); - - assertResponseType("eth_gasPrice", response, typeof response === "string"); - - return { gasPrice: jsonRpcQuantityToBigInt(response) }; + return fees; } public async getLatestBlock(): Promise { @@ -638,6 +619,32 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { return result; } + + private async _getNetworkFees(): Promise { + const latestBlock = await this.getLatestBlock(); + + // We prioritize EIP-1559 fees over legacy gasPrice fees + if (latestBlock.baseFeePerGas !== undefined) { + // Logic copied from ethers v6 + const maxPriorityFeePerGas = 1_000_000_000n; // 1gwei + const maxFeePerGas = + latestBlock.baseFeePerGas * 2n + maxPriorityFeePerGas; + + return { + maxFeePerGas, + maxPriorityFeePerGas, + }; + } + + const response = await this._provider.request({ + method: "eth_gasPrice", + params: [], + }); + + assertResponseType("eth_gasPrice", response, typeof response === "string"); + + return { gasPrice: jsonRpcQuantityToBigInt(response) }; + } } /** From 6a1aa5ad37b80e1d7beab5f846c2cfccffd15ef3 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 23 Feb 2024 01:14:05 -0500 Subject: [PATCH 1216/1302] allow test helpers to write deployments dir --- .../src/ethers-ignition-helper.ts | 29 +++++++++++++++---- .../src/viem-ignition-helper.ts | 29 +++++++++++++++---- packages/hardhat-plugin/src/helpers.ts | 1 + 3 files changed, 49 insertions(+), 10 deletions(-) diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index a14462d600..d6f9bfbfc8 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -1,6 +1,7 @@ import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, + resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; import { DeployConfig, @@ -20,6 +21,7 @@ import { import { Contract } from "ethers"; import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; export type IgnitionModuleResultsTToEthersContracts< ContractNameT extends string, @@ -40,16 +42,13 @@ export class EthersIgnitionHelper { public type = "ethers"; private _provider: EIP1193Provider; - private _deploymentDir: string | undefined; constructor( private _hre: HardhatRuntimeEnvironment, private _config?: Partial, - provider?: EIP1193Provider, - deploymentDir?: string + provider?: EIP1193Provider ) { this._provider = provider ?? this._hre.network.provider; - this._deploymentDir = deploymentDir; } /** @@ -78,18 +77,21 @@ export class EthersIgnitionHelper { defaultSender = undefined, strategy, strategyConfig, + deploymentId: givenDeploymentId = undefined, }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; + deploymentId?: string; } = { parameters: {}, config: {}, defaultSender: undefined, strategy: undefined, strategyConfig: undefined, + deploymentId: undefined, } ): Promise< IgnitionModuleResultsTToEthersContracts< @@ -115,10 +117,27 @@ export class EthersIgnitionHelper { strategyConfig ); + const chainId = Number( + await this._hre.network.provider.request({ + method: "eth_chainId", + }) + ); + + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); + + const deploymentDir = + this._hre.network.name === "hardhat" + ? undefined + : path.join( + this._hre.config.paths.ignition, + "deployments", + deploymentId + ); + const result = await deploy({ config: resolvedConfig, provider: this._provider, - deploymentDir: this._deploymentDir, + deploymentDir, artifactResolver, ignitionModule, deploymentParameters: parameters, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index bd267cdd41..e5b46cb0d6 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -3,6 +3,7 @@ import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types" import { HardhatArtifactResolver, errorDeploymentResultToExceptionMessage, + resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; import { ContractAtFuture, @@ -27,6 +28,7 @@ import { } from "@nomicfoundation/ignition-core"; import { HardhatPluginError } from "hardhat/plugins"; import { HardhatRuntimeEnvironment } from "hardhat/types"; +import path from "path"; import { IgnitionModuleResultsToViemContracts } from "./ignition-module-results-to-viem-contracts"; @@ -34,16 +36,13 @@ export class ViemIgnitionHelper { public type = "viem"; private _provider: EIP1193Provider; - private _deploymentDir: string | undefined; constructor( private _hre: HardhatRuntimeEnvironment, private _config?: Partial, - provider?: EIP1193Provider, - deploymentDir?: string + provider?: EIP1193Provider ) { this._provider = provider ?? this._hre.network.provider; - this._deploymentDir = deploymentDir; } /** @@ -71,18 +70,21 @@ export class ViemIgnitionHelper { defaultSender = undefined, strategy, strategyConfig, + deploymentId: givenDeploymentId = undefined, }: { parameters?: DeploymentParameters; config?: Partial; defaultSender?: string; strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; + deploymentId?: string; } = { parameters: {}, config: {}, defaultSender: undefined, strategy: undefined, strategyConfig: undefined, + deploymentId: undefined, } ): Promise< IgnitionModuleResultsToViemContracts @@ -105,10 +107,27 @@ export class ViemIgnitionHelper { strategyConfig ); + const chainId = Number( + await this._hre.network.provider.request({ + method: "eth_chainId", + }) + ); + + const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); + + const deploymentDir = + this._hre.network.name === "hardhat" + ? undefined + : path.join( + this._hre.config.paths.ignition, + "deployments", + deploymentId + ); + const result = await deploy({ config: resolvedConfig, provider: this._provider, - deploymentDir: this._deploymentDir, + deploymentDir, artifactResolver, ignitionModule, deploymentParameters: parameters, diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts index 4c17b51c0a..459acc79e5 100644 --- a/packages/hardhat-plugin/src/helpers.ts +++ b/packages/hardhat-plugin/src/helpers.ts @@ -1,2 +1,3 @@ export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; +export { resolveDeploymentId } from "./utils/resolve-deployment-id"; From 84422f375805ea2bf21b74809266e3f80cfcf920 Mon Sep 17 00:00:00 2001 From: AbSattar Date: Sun, 10 Mar 2024 03:17:10 +0530 Subject: [PATCH 1217/1302] updated process.exitCode --- examples/ens/scripts/deploy-ens.js | 2 +- packages/hardhat-plugin/src/index.ts | 12 ++++++------ .../src/visualization/write-visualization.ts | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/ens/scripts/deploy-ens.js b/examples/ens/scripts/deploy-ens.js index a6af911a45..48b0e06841 100644 --- a/examples/ens/scripts/deploy-ens.js +++ b/examples/ens/scripts/deploy-ens.js @@ -63,5 +63,5 @@ main() .then(() => process.exit(0)) .catch((error) => { console.error(error); - process.exit(1); + process.exitCode = 1; }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 2e5c25c081..1e4d74ee1e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -214,7 +214,7 @@ ignitionScope "Deploy cancelled: Cannot reset deployment on ephemeral Hardhat network" ); - process.exit(1); + process.exitCode = 1; } else { await rm(deploymentDir, { recursive: true, force: true }); } @@ -234,7 +234,7 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); - process.exit(1); + process.exitCode = 1; } let parameters: DeploymentParameters | undefined; @@ -288,7 +288,7 @@ ignitionScope } if (result.type !== "SUCCESSFUL_DEPLOYMENT") { - process.exit(1); + process.exitCode = 1; } } catch (e) { if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { @@ -331,7 +331,7 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); - process.exit(1); + process.exitCode = 1; } try { @@ -583,7 +583,7 @@ async function resolveConfigPath( } console.warn(`Could not parse parameters from ${filepath}`); - process.exit(1); + process.exitCode = 1; } } @@ -596,6 +596,6 @@ function resolveParametersString(paramString: string): DeploymentParameters { } console.warn(`Could not parse JSON parameters`); - process.exit(1); + process.exitCode = 1; } } diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts index 66cec23689..9fe9dae792 100644 --- a/packages/hardhat-plugin/src/visualization/write-visualization.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -18,7 +18,7 @@ export async function writeVisualization( if (!templateDirExists) { console.warn(`Unable to find template directory: ${templateDir}`); - process.exit(1); + process.exitCode = 1; } const visualizationDir = path.join(cacheDir, "visualization"); From 100e7ed9db9683d6b4102852feb60beb93c80a9f Mon Sep 17 00:00:00 2001 From: AbSattar Date: Sun, 10 Mar 2024 03:58:20 +0530 Subject: [PATCH 1218/1302] added new errors to fix --- packages/hardhat-plugin/src/index.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 1e4d74ee1e..883073d602 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -235,6 +235,7 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); process.exitCode = 1; + return; } let parameters: DeploymentParameters | undefined; @@ -332,7 +333,7 @@ ignitionScope if (userModule === undefined) { console.warn("No Ignition modules found"); process.exitCode = 1; - } + } else { try { const serializedIgnitionModule = @@ -357,6 +358,7 @@ ignitionScope throw e; } + } if (!noOpen) { const indexFile = path.join( @@ -584,6 +586,8 @@ async function resolveConfigPath( console.warn(`Could not parse parameters from ${filepath}`); process.exitCode = 1; + + throw new Error(`Failed to parse parameters from ${filepath}`); } } @@ -597,5 +601,8 @@ function resolveParametersString(paramString: string): DeploymentParameters { console.warn(`Could not parse JSON parameters`); process.exitCode = 1; + + throw new Error("Failed to parse JSON parameters"); + } } From 06c464c12a8394b11f1a58b1471f558e7ef499c1 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Mon, 1 Apr 2024 19:30:17 +0000 Subject: [PATCH 1219/1302] Throw exceptions where appropiate instead. --- packages/hardhat-plugin/src/index.ts | 88 ++++++++++--------- .../src/visualization/write-visualization.ts | 7 +- 2 files changed, 52 insertions(+), 43 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 883073d602..7f15b9e9b8 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -14,10 +14,7 @@ import { readFile, } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; -import { - HardhatPluginError, - NomicLabsHardhatPluginError, -} from "hardhat/plugins"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; import path from "path"; import "./type-extensions"; @@ -70,7 +67,7 @@ extendEnvironment((hre) => { (hre as any).ignition = { type: "stub", deploy: () => { - throw new HardhatPluginError( + throw new NomicLabsHardhatPluginError( "hardhat-ignition", "Please install either `@nomicfoundation/hardhat-ignition-viem` or `@nomicfoundation/hardhat-ignition-ethers` to use Ignition in your Hardhat tests" ); @@ -210,18 +207,16 @@ ignitionScope if (reset) { if (deploymentDir === undefined) { - console.warn( + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", "Deploy cancelled: Cannot reset deployment on ephemeral Hardhat network" ); - - process.exitCode = 1; } else { await rm(deploymentDir, { recursive: true, force: true }); } } if (strategyName !== "basic" && strategyName !== "create2") { - require("hardhat/plugins") as typeof import("hardhat/plugins"); throw new NomicLabsHardhatPluginError( "hardhat-ignition", "Invalid strategy name, must be either 'basic' or 'create2'" @@ -233,9 +228,10 @@ ignitionScope const userModule = loadModule(hre.config.paths.ignition, modulePath); if (userModule === undefined) { - console.warn("No Ignition modules found"); - process.exitCode = 1; - return; + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No Ignition modules found" + ); } let parameters: DeploymentParameters | undefined; @@ -331,34 +327,35 @@ ignitionScope const userModule = loadModule(hre.config.paths.ignition, modulePath); if (userModule === undefined) { - console.warn("No Ignition modules found"); - process.exitCode = 1; + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No Ignition modules found" + ); } else { + try { + const serializedIgnitionModule = + IgnitionModuleSerializer.serialize(userModule); - try { - const serializedIgnitionModule = - IgnitionModuleSerializer.serialize(userModule); - - const batchInfo = batches(userModule); + const batchInfo = batches(userModule); - await writeVisualization( - { module: serializedIgnitionModule, batches: batchInfo }, - { - cacheDir: hre.config.paths.cache, - } - ); - } catch (e) { - if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - e.message, - e + await writeVisualization( + { module: serializedIgnitionModule, batches: batchInfo }, + { + cacheDir: hre.config.paths.cache, + } ); - } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } - throw e; + throw e; + } } - } if (!noOpen) { const indexFile = path.join( @@ -584,10 +581,15 @@ async function resolveConfigPath( throw e; } - console.warn(`Could not parse parameters from ${filepath}`); - process.exitCode = 1; + if (e instanceof Error) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + `Could not parse parameters from ${filepath}`, + e + ); + } - throw new Error(`Failed to parse parameters from ${filepath}`); + throw e; } } @@ -599,10 +601,14 @@ function resolveParametersString(paramString: string): DeploymentParameters { throw e; } - console.warn(`Could not parse JSON parameters`); - process.exitCode = 1; - - throw new Error("Failed to parse JSON parameters"); + if (e instanceof Error) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "Could not parse JSON parameters", + e + ); + } + throw e; } } diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-plugin/src/visualization/write-visualization.ts index 9fe9dae792..1c5c8df308 100644 --- a/packages/hardhat-plugin/src/visualization/write-visualization.ts +++ b/packages/hardhat-plugin/src/visualization/write-visualization.ts @@ -1,5 +1,6 @@ import { SerializedIgnitionModule } from "@nomicfoundation/ignition-core"; import { ensureDir, pathExists, readFile, writeFile } from "fs-extra"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; import path from "path"; export async function writeVisualization( @@ -17,8 +18,10 @@ export async function writeVisualization( const templateDirExists = await pathExists(templateDir); if (!templateDirExists) { - console.warn(`Unable to find template directory: ${templateDir}`); - process.exitCode = 1; + throw new NomicLabsHardhatPluginError( + "@nomicfouncation/hardhat-ignition", + `Unable to find template directory: ${templateDir}` + ); } const visualizationDir = path.join(cacheDir, "visualization"); From 1b828307de69853ae5350c6f02d8777a9f2113a2 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 2 Apr 2024 00:05:03 -0400 Subject: [PATCH 1220/1302] add includeUnrelatedContracts flag and update for global imports --- packages/core/src/verify.ts | 35 ++++--- packages/core/test/verify.ts | 42 +++++++++ packages/hardhat-plugin/src/index.ts | 134 ++++++++++++++++----------- 3 files changed, 143 insertions(+), 68 deletions(-) diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index 7ecd929117..10b50ea0ca 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -33,7 +33,8 @@ import { */ export async function* getVerificationInformation( deploymentDir: string, - customChains: ChainConfig[] = [] + customChains: ChainConfig[] = [], + includeUnrelatedContracts = false ): AsyncGenerator { const deploymentLoader = new FileDeploymentLoader(deploymentDir); @@ -61,7 +62,8 @@ export async function* getVerificationInformation( for (const exState of deploymentExStates) { const verifyInfo = await convertExStateToVerifyInfo( exState, - deploymentLoader + deploymentLoader, + includeUnrelatedContracts ); const verifyResult: VerifyResult = [chainConfig, verifyInfo]; @@ -97,9 +99,13 @@ function getImportSourceNames( const contractSource = buildInfo.input.sources[sourceName].content; const { imports } = analyze(contractSource); - const importSources = imports.map((i) => - path.join(path.dirname(sourceName), i).replaceAll("\\", "/") - ); + const importSources = imports.map((i) => { + if (/^\.\.?[\/|\\]/.test(i)) { + return path.join(path.dirname(sourceName), i).replaceAll("\\", "/"); + } + + return i; + }); return [ ...importSources, @@ -109,7 +115,8 @@ function getImportSourceNames( async function convertExStateToVerifyInfo( exState: DeploymentExecutionState, - deploymentLoader: FileDeploymentLoader + deploymentLoader: FileDeploymentLoader, + includeUnrelatedContracts: boolean = false ) { const [buildInfo, artifact] = await Promise.all([ deploymentLoader.readBuildInfo(exState.artifactId), @@ -126,14 +133,16 @@ async function convertExStateToVerifyInfo( const sourceCode = prepareInputBasedOn(buildInfo, artifact, libraries); - const sourceNames = [ - artifact.sourceName, - ...getImportSourceNames(artifact.sourceName, buildInfo), - ]; + if (!includeUnrelatedContracts) { + const sourceNames = [ + artifact.sourceName, + ...getImportSourceNames(artifact.sourceName, buildInfo), + ]; - for (const source of Object.keys(sourceCode.sources)) { - if (!sourceNames.includes(source)) { - delete sourceCode.sources[source]; + for (const source of Object.keys(sourceCode.sources)) { + if (!sourceNames.includes(source)) { + delete sourceCode.sources[source]; + } } } diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts index ba753a7f5e..e70e75f923 100644 --- a/packages/core/test/verify.ts +++ b/packages/core/test/verify.ts @@ -159,4 +159,46 @@ describe("verify", () => { assert.deepEqual(actualSources, expectedSources); } }); + + it("should yield a verify result containing all available contracts when `includeUnrelatedContracts` is enabled", async () => { + const expectedResultMap: { [k: string]: string[] } = { + "contracts/TestA.sol:TestA": [ + "contracts/TestA.sol", + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestB.sol:TestB": [ + "contracts/TestA.sol", + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestC.sol:TestC": [ + "contracts/TestA.sol", + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + "contracts/TestD.sol:TestD": [ + "contracts/TestA.sol", + "contracts/TestB.sol", + "contracts/TestC.sol", + "contracts/TestD.sol", + ], + }; + + const deploymentDir = path.join(__dirname, "mocks", "verify", "min-input"); + + for await (const [, info] of getVerificationInformation( + deploymentDir, + undefined, + true + )) { + const expectedSources = expectedResultMap[info.name]; + const actualSources = Object.keys(JSON.parse(info.sourceCode).sources); + + assert.deepEqual(actualSources, expectedSources); + } + }); }); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 7f15b9e9b8..83338842ee 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -472,82 +472,106 @@ ignitionScope ignitionScope .task("verify") + .addFlag( + "includeUnrelatedContracts", + "Include all compiled contracts in the verification" + ) .addPositionalParam("deploymentId", "The id of the deployment to verify") .setDescription( "Verify contracts from a deployment against the configured block explorers" ) - .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { - const { getVerificationInformation } = await import( - "@nomicfoundation/ignition-core" - ); - - const deploymentDir = path.join( - hre.config.paths.ignition, - "deployments", - deploymentId - ); + .setAction( + async ( + { + deploymentId, + includeUnrelatedContracts = false, + }: { deploymentId: string; includeUnrelatedContracts: boolean }, + hre + ) => { + const { getVerificationInformation } = await import( + "@nomicfoundation/ignition-core" + ); - if ( - hre.config.etherscan === undefined || - hre.config.etherscan.apiKey === undefined || - hre.config.etherscan.apiKey === "" - ) { - throw new NomicLabsHardhatPluginError( - "@nomicfoundation/hardhat-ignition", - "No etherscan API key configured" + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId ); - } - try { - for await (const [ - chainConfig, - contractInfo, - ] of getVerificationInformation( - deploymentDir, - hre.config.etherscan.customChains - )) { - const apiKeyAndUrls = getApiKeyAndUrls( - hre.config.etherscan.apiKey, - chainConfig + if ( + hre.config.etherscan === undefined || + hre.config.etherscan.apiKey === undefined || + hre.config.etherscan.apiKey === "" + ) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + "No etherscan API key configured" ); + } - const instance = new Etherscan(...apiKeyAndUrls); - - console.log( - `Verifying contract "${contractInfo.name}" for network ${chainConfig.network}...` - ); + try { + for await (const [ + chainConfig, + contractInfo, + ] of getVerificationInformation( + deploymentDir, + hre.config.etherscan.customChains, + includeUnrelatedContracts + )) { + const apiKeyAndUrls = getApiKeyAndUrls( + hre.config.etherscan.apiKey, + chainConfig + ); - const result = await verifyEtherscanContract(instance, contractInfo); + const instance = new Etherscan(...apiKeyAndUrls); - if (result.type === "success") { console.log( - `Successfully verified contract "${contractInfo.name}" for network ${chainConfig.network}:\n - ${result.contractURL}` + `Verifying contract "${contractInfo.name}" for network ${chainConfig.network}...` ); - console.log(""); - } else { - if (/already verified/gi.test(result.reason.message)) { - const contractURL = instance.getContractUrl(contractInfo.address); + + const result = await verifyEtherscanContract(instance, contractInfo); + + if (result.type === "success") { console.log( - `Contract ${contractInfo.name} already verified on network ${chainConfig.network}:\n - ${contractURL}` + `Successfully verified contract "${contractInfo.name}" for network ${chainConfig.network}:\n - ${result.contractURL}` ); console.log(""); - continue; } else { - throw new NomicLabsHardhatPluginError( - "hardhat-ignition", - result.reason.message - ); + if (/already verified/gi.test(result.reason.message)) { + const contractURL = instance.getContractUrl(contractInfo.address); + console.log( + `Contract ${contractInfo.name} already verified on network ${chainConfig.network}:\n - ${contractURL}` + ); + console.log(""); + continue; + } else { + if (!includeUnrelatedContracts) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Verification failed. Please run \`hardhat ignition verify ${deploymentId} --include-unrelated-contracts\` to attempt verifying all contracts.` + ); + } else { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + result.reason.message + ); + } + } } } - } - } catch (e) { - if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { - throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); - } + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + e.message, + e + ); + } - throw e; + throw e; + } } - }); + ); async function resolveParametersFromModuleName( moduleName: string, From 73b7b165e2183820f3b7967f4857a63ef7e6cfae Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 4 Apr 2024 09:48:09 +0100 Subject: [PATCH 1221/1302] chore: revert dev dependency to latest hardhat (#716) * chore: revert dev dependency to latest hardhat EDR now supports all the complicated test setup moves that where required by the Ignition end to end test suite. * Fix package-lock * Regenerate package-lock.json * Update CI workflow * Fix but in JsonRpcClient.call --------- Co-authored-by: Patricio Palladino --- .github/workflows/ci.yml | 12 +- examples/complete/package.json | 2 +- examples/ens/package.json | 2 +- examples/sample/package.json | 2 +- examples/ts-sample/package.json | 2 +- examples/viem-sample/package.json | 2 +- package-lock.json | 1204 +++++++++-------- package.json | 2 +- packages/core/package.json | 2 +- .../src/internal/execution/jsonrpc-client.ts | 10 +- packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/package.json | 2 +- 13 files changed, 632 insertions(+), 614 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 760e09edc6..da5a65a142 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,13 +9,13 @@ on: jobs: test_on_windows: - name: Test Ignition on Windows with Node 16 + name: Test Ignition on Windows with Node 18 runs-on: windows-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 18 cache: npm - name: Install run: npm install @@ -27,13 +27,13 @@ jobs: run: npm run test:examples test_on_macos: - name: Test Ignition on MacOS with Node 16 + name: Test Ignition on MacOS with Node 18 runs-on: macos-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 18 cache: npm - name: Install run: npm install @@ -49,7 +49,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [16, 18, 20.5] + node: [18, 20.5] steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 @@ -72,7 +72,7 @@ jobs: - uses: actions/checkout@v2 - uses: actions/setup-node@v2 with: - node-version: 16 + node-version: 18 cache: npm - name: Install run: npm install diff --git a/examples/complete/package.json b/examples/complete/package.json index 1dfa514d9a..7eeee84f70 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ens/package.json b/examples/ens/package.json index 9b6a7483d4..cafbcee16e 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" }, "dependencies": { diff --git a/examples/sample/package.json b/examples/sample/package.json index 8802b05cf2..aac8fa1061 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index 698407dd26..e2c2995a3d 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index d4ce19781b..4008fb7c47 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -14,7 +14,7 @@ "@nomicfoundation/hardhat-network-helpers": "1.0.10", "@nomicfoundation/hardhat-viem": "2.0.0", "chai": "4.4.1", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } } diff --git a/package-lock.json b/package-lock.json index 3dfc4db4e1..179e6a90b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "mocha": "^9.1.3", "nyc": "15.1.0", "open-cli": "7.2.0", @@ -60,7 +60,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -73,7 +73,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -83,7 +83,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -93,7 +93,7 @@ "devDependencies": { "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -105,7 +105,7 @@ "@nomicfoundation/hardhat-network-helpers": "1.0.10", "@nomicfoundation/hardhat-viem": "2.0.0", "chai": "4.4.1", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" } }, @@ -149,113 +149,42 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", + "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", + "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.1", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.1", + "@babel/parser": "^7.24.1", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -287,14 +216,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", + "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -329,15 +258,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -382,12 +302,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -446,9 +366,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -473,13 +393,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", + "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -487,14 +407,15 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -572,9 +493,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", + "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -584,12 +505,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", - "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -599,12 +520,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -614,12 +535,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -629,9 +550,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", + "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -654,18 +575,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -2773,9 +2694,9 @@ } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@metamask/eth-sig-util": { "version": "4.0.1", @@ -2965,128 +2886,174 @@ "node": ">= 8" } }, - "node_modules/@nomicfoundation/ethereumjs-block": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-block/-/ethereumjs-block-5.0.4.tgz", - "integrity": "sha512-AcyacJ9eX/uPEvqsPiB+WO1ymE+kyH48qGGiGV+YTojdtas8itUTW5dehDSOXEEItWGbbzEJ4PRqnQZlWaPvDw==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "ethereum-cryptography": "0.1.3" + "node_modules/@nomicfoundation/edr": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.3.3.tgz", + "integrity": "sha512-zP+e+3B1nEUx6bW5BPnIzCQbkhmYfdMBJdiVggTqqTfAA82sOkdOG7wsOMcz5qF3fYfx/irNRM1kgc9HVFIbpQ==", + "engines": { + "node": ">= 18" }, + "optionalDependencies": { + "@nomicfoundation/edr-darwin-arm64": "0.3.3", + "@nomicfoundation/edr-darwin-x64": "0.3.3", + "@nomicfoundation/edr-linux-arm64-gnu": "0.3.3", + "@nomicfoundation/edr-linux-arm64-musl": "0.3.3", + "@nomicfoundation/edr-linux-x64-gnu": "0.3.3", + "@nomicfoundation/edr-linux-x64-musl": "0.3.3", + "@nomicfoundation/edr-win32-arm64-msvc": "0.3.3", + "@nomicfoundation/edr-win32-ia32-msvc": "0.3.3", + "@nomicfoundation/edr-win32-x64-msvc": "0.3.3" + } + }, + "node_modules/@nomicfoundation/edr-darwin-arm64": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.3.tgz", + "integrity": "sha512-E9VGsUD+1Ga4mn/5ooHsMi8JEfhZbKP6CXN/BhJ8kXbIC10NqTD1RuhCKGRtYq4vqH/3Nfq25Xg8E8RWOF4KBQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-blockchain": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-blockchain/-/ethereumjs-blockchain-7.0.4.tgz", - "integrity": "sha512-jYsd/kwzbmpnxx86tXsYV8wZ5xGvFL+7/P0c6OlzpClHsbFzeF41KrYA9scON8Rg6bZu3ZTv6JOAgj3t7USUfg==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-ethash": "3.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "lru-cache": "^10.0.0" - }, + "node_modules/@nomicfoundation/edr-darwin-x64": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.3.tgz", + "integrity": "sha512-vkZXZ1ydPg+Ijb2iyqENA+KCkxGTCUWG5itCSliiA0Li2YE7ujDMGhheEpFp1WVlZadviz0bfk1rZXbCqlirpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", - "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.4" + "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.3.tgz", + "integrity": "sha512-gdIg0Yj1qqS9wVuywc5B/+DqKylfUGB6/CQn/shMqwAfsAVAVpchkhy66PR+REEx7fh/GkNctxLlENXPeLzDiA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-ethash": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-ethash/-/ethereumjs-ethash-3.0.4.tgz", - "integrity": "sha512-xvIrwIMl9sSaiYKRem68+O7vYdj7Q2XWv5P7JXiIkn83918QzWHvqbswTRsH7+r6X1UEvdsURRnZbvZszEjAaQ==", - "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "bigint-crypto-utils": "^3.2.2", - "ethereum-cryptography": "0.1.3" - }, + "node_modules/@nomicfoundation/edr-linux-arm64-musl": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.3.tgz", + "integrity": "sha512-AXZ08MFvhNeBZbOBNmz1SJ/DMrMOE2mHEJtaNnsctlxIunjxfrWww4q+WXB34jbr9iaVYYlPsaWe5sueuw6s3Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-evm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-evm/-/ethereumjs-evm-2.0.4.tgz", - "integrity": "sha512-lTyZZi1KpeMHzaO6cSVisR2tjiTTedjo7PcmhI/+GNFo9BmyY6QYzGeSti0sFttmjbEMioHgXxl5yrLNRg6+1w==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@types/debug": "^4.1.9", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "rustbn-wasm": "^0.2.0" - }, + "node_modules/@nomicfoundation/edr-linux-x64-gnu": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.3.tgz", + "integrity": "sha512-xElOs1U+E6lBLtv1mnJ+E8nr2MxZgKiLo8bZAgBboy9odYtmkDVwhMjtsFKSuZbGxFtsSyGRT4cXw3JAbtUDeA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", - "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", - "bin": { - "rlp": "bin/rlp.cjs" - }, + "node_modules/@nomicfoundation/edr-linux-x64-musl": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.3.tgz", + "integrity": "sha512-2Fe6gwm1RAGQ/PfMYiaSba2OrFp8zzYWh+am9lYObOFjV9D+A1zhIzfy0UC74glPks5eV8eY4pBPrVR042m2Nw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=18" + "node": ">= 18" } }, - "node_modules/@nomicfoundation/ethereumjs-statemanager": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-statemanager/-/ethereumjs-statemanager-2.0.4.tgz", - "integrity": "sha512-HPDjeFrxw6llEi+BzqXkZ+KkvFnTOPczuHBtk21hRlDiuKuZz32dPzlhpRsDBGV1b5JTmRDUVqCS1lp3Gghw4Q==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", - "ethereum-cryptography": "0.1.3", - "js-sdsl": "^4.1.4", - "lru-cache": "^10.0.0" - }, - "peerDependencies": { - "@nomicfoundation/ethereumjs-verkle": "0.0.2" - }, - "peerDependenciesMeta": { - "@nomicfoundation/ethereumjs-verkle": { - "optional": true - } + "node_modules/@nomicfoundation/edr-win32-arm64-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.3.tgz", + "integrity": "sha512-8NHyxIsFrl0ufSQ/ErqF2lKIa/gz1gaaa1a2vKkDEqvqCUcPhBTYhA5NHgTPhLETFTnCFr0z+YbctFCyjh4qrA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" } }, - "node_modules/@nomicfoundation/ethereumjs-trie": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-trie/-/ethereumjs-trie-6.0.4.tgz", - "integrity": "sha512-3nSwQiFMvr2VFe/aZUyinuohYvtytUqZCUCvIWcPJ/BwJH6oQdZRB42aNFBJ/8nAh2s3OcroWpBLskzW01mFKA==", + "node_modules/@nomicfoundation/edr-win32-ia32-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.3.tgz", + "integrity": "sha512-0F6hM0kGia4dQVb/kauho9JcP1ozWisY2/She+ISR5ceuhzmAwQJluM0g+0TYDME0LtxBxiMPq/yPiZMQeq31w==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/edr-win32-x64-msvc": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.3.tgz", + "integrity": "sha512-d75q1uaMb6z9i+GQZoblbOfFBvlBnWc+5rB13UWRkCOJSnoYwyFWhGJx5GeM59gC7aIblc5VD9qOAhHuvM9N+w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 18" + } + }, + "node_modules/@nomicfoundation/ethereumjs-common": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", + "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@types/readable-stream": "^2.3.13", - "ethereum-cryptography": "0.1.3", - "lru-cache": "^10.0.0", - "readable-stream": "^3.6.0" + "@nomicfoundation/ethereumjs-util": "9.0.4" + } + }, + "node_modules/@nomicfoundation/ethereumjs-rlp": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", + "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", + "bin": { + "rlp": "bin/rlp.cjs" }, "engines": { "node": ">=18" @@ -3114,59 +3081,24 @@ } } }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", - "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "c-kzg": "^2.1.2" - }, - "peerDependenciesMeta": { - "c-kzg": { - "optional": true - } - } - }, - "node_modules/@nomicfoundation/ethereumjs-verkle": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-verkle/-/ethereumjs-verkle-0.0.2.tgz", - "integrity": "sha512-bjnfZElpYGK/XuuVRmLS3yDvr+cDs85D9oonZ0YUa5A3lgFgokWMp76zXrxX2jVQ0BfHaw12y860n1+iOi6yFQ==", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "lru-cache": "^10.0.0", - "rust-verkle-wasm": "^0.0.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nomicfoundation/ethereumjs-vm": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-vm/-/ethereumjs-vm-7.0.4.tgz", - "integrity": "sha512-gsA4IhmtWHI4BofKy3kio9W+dqZQs5Ji5mLjLYxHCkat+JQBUt5szjRKra2F9nGDJ2XcI/wWb0YWUFNgln4zRQ==", + "node_modules/@nomicfoundation/ethereumjs-util": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", + "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", "dependencies": { - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-blockchain": "7.0.4", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-evm": "2.0.4", "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "debug": "^4.3.3", "ethereum-cryptography": "0.1.3" }, "engines": { "node": ">=18" + }, + "peerDependencies": { + "c-kzg": "^2.1.2" + }, + "peerDependenciesMeta": { + "c-kzg": { + "optional": true + } } }, "node_modules/@nomicfoundation/hardhat-chai-matchers": { @@ -3252,9 +3184,9 @@ } }, "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.4.tgz", - "integrity": "sha512-B8ZjhOrmbbRWqJi65jvQblzjsfYktjqj2vmOm+oc2Vu8drZbT2cjeSCRHZKbS7lOtfW78aJZSFvw+zRLCiABJA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz", + "integrity": "sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA==", "peer": true, "dependencies": { "@ethersproject/abi": "^5.1.2", @@ -3707,9 +3639,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz", - "integrity": "sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", + "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", "cpu": [ "arm" ], @@ -3721,9 +3653,9 @@ "peer": true }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.1.tgz", - "integrity": "sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", + "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", "cpu": [ "arm64" ], @@ -3735,9 +3667,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.1.tgz", - "integrity": "sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", + "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", "cpu": [ "arm64" ], @@ -3749,9 +3681,9 @@ "peer": true }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.1.tgz", - "integrity": "sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", + "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", "cpu": [ "x64" ], @@ -3763,9 +3695,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.1.tgz", - "integrity": "sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", + "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", "cpu": [ "arm" ], @@ -3777,9 +3709,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.1.tgz", - "integrity": "sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", + "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", "cpu": [ "arm64" ], @@ -3791,9 +3723,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.1.tgz", - "integrity": "sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", + "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", "cpu": [ "arm64" ], @@ -3804,10 +3736,24 @@ ], "peer": true }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", + "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.1.tgz", - "integrity": "sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", + "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", "cpu": [ "riscv64" ], @@ -3818,10 +3764,24 @@ ], "peer": true }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", + "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.1.tgz", - "integrity": "sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", + "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", "cpu": [ "x64" ], @@ -3833,9 +3793,9 @@ "peer": true }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.1.tgz", - "integrity": "sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", + "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", "cpu": [ "x64" ], @@ -3847,9 +3807,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.1.tgz", - "integrity": "sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", + "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", "cpu": [ "arm64" ], @@ -3861,9 +3821,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.1.tgz", - "integrity": "sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", + "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", "cpu": [ "ia32" ], @@ -3875,9 +3835,9 @@ "peer": true }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.1.tgz", - "integrity": "sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", + "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", "cpu": [ "x64" ], @@ -3934,9 +3894,9 @@ } }, "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -4980,9 +4940,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "devOptional": true }, "node_modules/@tsconfig/node12": { @@ -5151,9 +5111,9 @@ } }, "node_modules/@types/chai": { - "version": "4.3.12", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.12.tgz", - "integrity": "sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==" + "version": "4.3.14", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", + "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==" }, "node_modules/@types/chai-as-promised": { "version": "7.1.8", @@ -5178,6 +5138,7 @@ "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, "dependencies": { "@types/ms": "*" } @@ -5296,7 +5257,8 @@ "node_modules/@types/ms": { "version": "0.7.34", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "dev": true }, "node_modules/@types/ndjson": { "version": "2.0.1", @@ -5345,52 +5307,37 @@ } }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==", + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", "dev": true }, "node_modules/@types/qs": { - "version": "6.9.12", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.12.tgz", - "integrity": "sha512-bZcOkJ6uWrL0Qb2NAWKa7TBU+mJHPzhx9jjLL1KHF+XpzEcR7EXHvjbHlGtR/IsP1vyPrehuS6XqkmaePy//mg==", + "version": "6.9.14", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", + "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", "dev": true, "peer": true }, "node_modules/@types/react": { - "version": "18.2.64", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.64.tgz", - "integrity": "sha512-MlmPvHgjj2p3vZaxbQgFUQFvD8QiZwACfGqEdDSWou5yISWxDQ4/74nCAwsUiX7UFLKZz3BbVSPj+YxeoGGCfg==", + "version": "18.2.73", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", + "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", "dev": true, "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.21", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.21.tgz", - "integrity": "sha512-gnvBA/21SA4xxqNXEwNiVcP0xSGHh/gi1VhWv9Bl46a0ItbTT5nFY+G9VSQpaG/8N/qdJpJ+vftQ4zflTtnjLw==", + "version": "18.2.23", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", + "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", "dev": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/readable-stream": { - "version": "2.3.15", - "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", - "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", - "dependencies": { - "@types/node": "*", - "safe-buffer": "~5.1.1" - } - }, - "node_modules/@types/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/@types/responselike": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", @@ -5399,12 +5346,6 @@ "@types/node": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", - "dev": true - }, "node_modules/@types/secp256k1": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", @@ -5978,15 +5919,16 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -6015,35 +5957,17 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -6215,13 +6139,13 @@ "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "peer": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -6313,14 +6237,6 @@ "url": "https://opencollective.com/bigjs" } }, - "node_modules/bigint-crypto-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/bigint-crypto-utils/-/bigint-crypto-utils-3.3.0.tgz", - "integrity": "sha512-jOTSb+drvEDxEq6OuUybOAv/xxoh3cuYRUIPyu8sSHQNKM303UQ2R1DAo45o1AkcIXw6fzbaFI1+xGGdaXs2lg==", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/bignumber.js": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", @@ -6330,11 +6246,14 @@ } }, "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/blakejs": { @@ -6767,9 +6686,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001603", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz", + "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==", "dev": true, "funding": [ { @@ -6928,6 +6847,42 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "extraneous": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "extraneous": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -7663,9 +7618,9 @@ } }, "node_modules/d3": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", - "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", "dev": true, "dependencies": { "d3-array": "3", @@ -7898,9 +7853,9 @@ } }, "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", "dev": true, "dependencies": { "d3-array": "2.5.0 - 3" @@ -7983,9 +7938,9 @@ } }, "node_modules/d3-scale-chromatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", - "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", "dev": true, "dependencies": { "d3-color": "1 - 3", @@ -8105,6 +8060,57 @@ "node": ">=0.10" } }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/dayjs": { "version": "1.11.10", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", @@ -8512,9 +8518,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.699", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.699.tgz", - "integrity": "sha512-I7q3BbQi6e4tJJN5CRcyvxhK0iJb34TV8eJQcgh+fR2fQ8miMgZcEInckCo1U9exDHbfz7DLDnFn8oqH/VcRKw==", + "version": "1.4.723", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", + "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==", "dev": true }, "node_modules/elkjs": { @@ -8564,9 +8570,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz", - "integrity": "sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -8616,17 +8622,21 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.1", "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -8637,10 +8647,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -8651,17 +8662,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -8670,12 +8681,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -8695,6 +8700,18 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", @@ -10028,9 +10045,9 @@ } }, "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", - "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "peer": true, "dependencies": { @@ -10347,16 +10364,16 @@ } }, "node_modules/express": { - "version": "4.18.3", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.3.tgz", - "integrity": "sha512-6VyCijWQ+9O7WuVMTRBTl+cjNNIzD5cY5mQ1WM8r/LEkI2u8EYpOotESNwzNlyCn3g+dmjKYI6BmNneSr/FSRw==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -10388,9 +10405,9 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "engines": { "node": ">= 0.6" } @@ -10667,9 +10684,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -11311,23 +11328,16 @@ } }, "node_modules/hardhat": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.20.0.tgz", - "integrity": "sha512-TtWZ4mKOH5YA+PCDAGAjG7Gub2NA+egAX7RIHq5XnGrEALNXAbyP3S0I9vOE1MWCgZhn+XOFUNfDuHgkBOPoRw==", + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.2.tgz", + "integrity": "sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw==", "dependencies": { "@ethersproject/abi": "^5.1.2", "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/ethereumjs-block": "5.0.4", - "@nomicfoundation/ethereumjs-blockchain": "7.0.4", + "@nomicfoundation/edr": "^0.3.1", "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-evm": "2.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-statemanager": "2.0.4", - "@nomicfoundation/ethereumjs-trie": "6.0.4", "@nomicfoundation/ethereumjs-tx": "5.0.4", "@nomicfoundation/ethereumjs-util": "9.0.4", - "@nomicfoundation/ethereumjs-verkle": "0.0.2", - "@nomicfoundation/ethereumjs-vm": "7.0.4", "@nomicfoundation/solidity-analyzer": "^0.1.0", "@sentry/node": "^5.18.1", "@types/bn.js": "^5.1.0", @@ -11583,9 +11593,9 @@ } }, "node_modules/hardhat/node_modules/mocha": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", - "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dependencies": { "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", @@ -12457,6 +12467,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -12952,15 +12977,6 @@ "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.2.tgz", - "integrity": "sha512-dwXFwByc/ajSV6m5bcKAPwe4yDDF6D614pxmIi5odytzxRlwqF6nwoiCek80Ixc7Cvma5awClxrzFtxCQvcM8w==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", @@ -13365,11 +13381,12 @@ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" }, "node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "engines": { - "node": "14 || >=16.14" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/make-dir": { @@ -14538,14 +14555,15 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -14555,27 +14573,28 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -15099,9 +15118,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -15120,7 +15139,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16073,9 +16092,9 @@ "dev": true }, "node_modules/rollup": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.1.tgz", - "integrity": "sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==", + "version": "4.13.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", + "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", "dev": true, "peer": true, "dependencies": { @@ -16089,19 +16108,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.1", - "@rollup/rollup-android-arm64": "4.12.1", - "@rollup/rollup-darwin-arm64": "4.12.1", - "@rollup/rollup-darwin-x64": "4.12.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.1", - "@rollup/rollup-linux-arm64-gnu": "4.12.1", - "@rollup/rollup-linux-arm64-musl": "4.12.1", - "@rollup/rollup-linux-riscv64-gnu": "4.12.1", - "@rollup/rollup-linux-x64-gnu": "4.12.1", - "@rollup/rollup-linux-x64-musl": "4.12.1", - "@rollup/rollup-win32-arm64-msvc": "4.12.1", - "@rollup/rollup-win32-ia32-msvc": "4.12.1", - "@rollup/rollup-win32-x64-msvc": "4.12.1", + "@rollup/rollup-android-arm-eabi": "4.13.2", + "@rollup/rollup-android-arm64": "4.13.2", + "@rollup/rollup-darwin-arm64": "4.13.2", + "@rollup/rollup-darwin-x64": "4.13.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", + "@rollup/rollup-linux-arm64-gnu": "4.13.2", + "@rollup/rollup-linux-arm64-musl": "4.13.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", + "@rollup/rollup-linux-riscv64-gnu": "4.13.2", + "@rollup/rollup-linux-s390x-gnu": "4.13.2", + "@rollup/rollup-linux-x64-gnu": "4.13.2", + "@rollup/rollup-linux-x64-musl": "4.13.2", + "@rollup/rollup-win32-arm64-msvc": "4.13.2", + "@rollup/rollup-win32-ia32-msvc": "4.13.2", + "@rollup/rollup-win32-x64-msvc": "4.13.2", "fsevents": "~2.3.2" } }, @@ -16220,19 +16241,6 @@ "queue-microtask": "^1.2.2" } }, - "node_modules/rust-verkle-wasm": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/rust-verkle-wasm/-/rust-verkle-wasm-0.0.1.tgz", - "integrity": "sha512-BN6fiTsxcd2dCECz/cHtGTt9cdLJR925nh7iAuRcj8ymKw7OOaPmCneQZ7JePOJ/ia27TjEL91VdOi88Yf+mcA==" - }, - "node_modules/rustbn-wasm": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/rustbn-wasm/-/rustbn-wasm-0.2.0.tgz", - "integrity": "sha512-FThvYFNTqrEKGqXuseeg0zR7yROh/6U1617mCHF68OVqrN1tNKRN7Tdwy4WayPVsCmmK+eMxtIZX1qL6JxTkMg==", - "dependencies": { - "@scure/base": "^1.1.1" - } - }, "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", @@ -17113,9 +17121,9 @@ } }, "node_modules/solidity-coverage/node_modules/mocha": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz", - "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", + "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", "dev": true, "peer": true, "dependencies": { @@ -17230,9 +17238,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -17408,14 +17416,15 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -17425,28 +17434,31 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17763,9 +17775,9 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", "peer": true, "dependencies": { "ajv": "^8.0.1", @@ -18439,9 +18451,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { "call-bind": "^1.0.7", @@ -18743,9 +18755,9 @@ } }, "node_modules/viem": { - "version": "2.7.22", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.7.22.tgz", - "integrity": "sha512-R/d9AkWXkhiNF4Gk4/A389LSO5PGDdHUBFDKIUkhrdLTDpOhKzbNln6qDry3kYUcmH7lErx3C2eA6rajnc0s9A==", + "version": "2.9.6", + "resolved": "https://registry.npmjs.org/viem/-/viem-2.9.6.tgz", + "integrity": "sha512-VVFWjGQei2wnWTvAB/xrIf22m6flCwxeBr8LnwejXMTSSi1EORWEswrw2lfKTmw3TlRPSG4uSiQMa/d0l0DKRg==", "funding": [ { "type": "github", @@ -18817,9 +18829,9 @@ } }, "node_modules/vite": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz", - "integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==", + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -19819,7 +19831,7 @@ "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" } }, "packages/core/node_modules/fs-extra": { @@ -19871,7 +19883,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "viem": "^2.7.6" }, "peerDependencies": { @@ -19888,7 +19900,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -19907,7 +19919,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.15.0", diff --git a/package.json b/package.json index 6e339bf5c5..ec35262007 100644 --- a/package.json +++ b/package.json @@ -53,7 +53,7 @@ "eslint-plugin-mocha": "^9.0.0", "eslint-plugin-no-only-tests": "3.1.0", "eslint-plugin-prettier": "4.0.0", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "mocha": "^9.1.3", "nyc": "15.1.0", "open-cli": "7.2.0", diff --git a/packages/core/package.json b/packages/core/package.json index 619096662c..f4b5fae99d 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -48,7 +48,7 @@ "devDependencies": { "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 7ba401437d..10350e77e6 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -325,10 +325,16 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { }; } catch (error) { if (error instanceof Error) { - if ("data" in error && typeof error.data === "string") { + const errorWithData = error as { data?: string | { data?: string } }; + const data = + typeof errorWithData.data === "string" + ? errorWithData.data + : errorWithData.data?.data; + + if (data !== undefined) { return { success: false, - returnData: error.data, + returnData: data, customErrorReported: isCustomErrorError(error), }; } diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 699a1b1a1c..da8d4d8004 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -37,7 +37,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 1ef367675e..a680f9182f 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -38,7 +38,7 @@ "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", - "hardhat": "2.20.0" + "hardhat": "^2.18.0" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "^0.15.0", diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 2c12fafc32..3c1ad4e2fe 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -51,7 +51,7 @@ "@types/chai-as-promised": "^7.1.4", "@types/sinon": "^10.0.13", "@nomicfoundation/hardhat-network-helpers": "1.0.9", - "hardhat": "2.20.0", + "hardhat": "^2.18.0", "viem": "^2.7.6" }, "peerDependencies": { From 2212533d3ff4fd5544ac9a41bebb7118ee84412e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 4 Apr 2024 18:22:11 +0100 Subject: [PATCH 1222/1302] chore: bump version to v0.15.1 Update the packages versions and changelogs for the `0.15.1 - 2024-04-11` release. --- examples/complete/package.json | 4 +- examples/ens/package.json | 4 +- examples/sample/package.json | 4 +- examples/ts-sample/package.json | 4 +- examples/viem-sample/package.json | 4 +- package-lock.json | 80 ++++++--------------- packages/core/CHANGELOG.md | 14 ++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 19 +++++ packages/hardhat-plugin-ethers/package.json | 6 +- packages/hardhat-plugin-viem/CHANGELOG.md | 19 +++++ packages/hardhat-plugin-viem/package.json | 6 +- packages/hardhat-plugin/CHANGELOG.md | 19 +++++ packages/hardhat-plugin/package.json | 6 +- packages/ui/package.json | 4 +- 15 files changed, 115 insertions(+), 80 deletions(-) diff --git a/examples/complete/package.json b/examples/complete/package.json index 7eeee84f70..91711f6325 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.15.0", + "version": "0.15.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index cafbcee16e..a0d94deb00 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.15.0", + "version": "0.15.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index aac8fa1061..410cba5cbc 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.15.0", + "version": "0.15.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index e2c2995a3d..d416a1525b 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.15.0", + "version": "0.15.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 4008fb7c47..8ead476a94 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.15.0", + "version": "0.15.1", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.15.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.15.1", "@nomicfoundation/hardhat-network-helpers": "1.0.10", "@nomicfoundation/hardhat-viem": "2.0.0", "chai": "4.4.1", diff --git a/package-lock.json b/package-lock.json index 179e6a90b4..0b7d3d6e2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,9 +56,9 @@ }, "examples/complete": { "name": "@nomicfoundation/ignition-complete-example", - "version": "0.15.0", + "version": "0.15.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -66,12 +66,12 @@ }, "examples/ens": { "name": "@nomicfoundation/ignition-ens-example", - "version": "0.15.0", + "version": "0.15.1", "dependencies": { "@ensdomains/ens-contracts": "0.0.11" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -79,9 +79,9 @@ }, "examples/sample": { "name": "@nomicfoundation/ignition-sample-example", - "version": "0.15.0", + "version": "0.15.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -89,9 +89,9 @@ }, "examples/ts-sample": { "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.15.0", + "version": "0.15.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" @@ -99,9 +99,9 @@ }, "examples/viem-sample": { "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.15.0", + "version": "0.15.1", "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.15.0", + "@nomicfoundation/hardhat-ignition-viem": "^0.15.1", "@nomicfoundation/hardhat-network-helpers": "1.0.10", "@nomicfoundation/hardhat-viem": "2.0.0", "chai": "4.4.1", @@ -6847,42 +6847,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "extraneous": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "extraneous": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -19815,7 +19779,7 @@ }, "packages/core": { "name": "@nomicfoundation/ignition-core", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "dependencies": { "@ethersproject/address": "5.6.1", @@ -19868,11 +19832,11 @@ }, "packages/hardhat-plugin": { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.0", - "@nomicfoundation/ignition-ui": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", + "@nomicfoundation/ignition-ui": "^0.15.1", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", @@ -19893,7 +19857,7 @@ }, "packages/hardhat-plugin-ethers": { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -19904,15 +19868,15 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.0", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/hardhat-ignition": "^0.15.1", + "@nomicfoundation/ignition-core": "^0.15.1", "ethers": "^6.7.0", "hardhat": "^2.18.0" } }, "packages/hardhat-plugin-viem": { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "devDependencies": { "@nomicfoundation/hardhat-viem": "^2.0.0", @@ -19922,9 +19886,9 @@ "hardhat": "^2.18.0" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.15.0", + "@nomicfoundation/hardhat-ignition": "^0.15.1", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", "hardhat": "^2.18.0", "viem": "^2.7.6" } @@ -19963,10 +19927,10 @@ }, "packages/ui": { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.0", + "version": "0.15.1", "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 6db0c5b7ab..e0b2994a93 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Update `ignition status` core function to display chainId ([#668](https://github.com/NomicFoundation/hardhat-ignition/issues/668)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + ## 0.15.0 - 2024-03-13 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index f4b5fae99d..6428c37deb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index f17ef6ad56..89f419278e 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Support writing and reading from deployments folder within tests and scripts ([#704](https://github.com/NomicFoundation/hardhat-ignition/pull/704)) +- Add `ignition deployments` task to list all the current deployments ([#646](https://github.com/NomicFoundation/hardhat-ignition/issues/646)) + +### Changed + +- Deploying to a cleared local hardhat node ignores previous deployment ([#650](https://github.com/NomicFoundation/hardhat-ignition/issues/650)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + ## 0.15.0 - 2024-03-13 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index da8d4d8004..e73782f8c2 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -41,8 +41,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.0", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/hardhat-ignition": "^0.15.1", + "@nomicfoundation/ignition-core": "^0.15.1", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 6cfda2dd8b..5fd68d94c2 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Support writing and reading from deployments folder within tests and scripts ([#704](https://github.com/NomicFoundation/hardhat-ignition/pull/704)) +- Add `ignition deployments` task to list all the current deployments ([#646](https://github.com/NomicFoundation/hardhat-ignition/issues/646)) + +### Changed + +- Deploying to a cleared local hardhat node ignores previous deployment ([#650](https://github.com/NomicFoundation/hardhat-ignition/issues/650)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + ## 0.15.0 - 2024-03-13 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index a680f9182f..3608f3471b 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -41,9 +41,9 @@ "hardhat": "^2.18.0" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.15.0", + "@nomicfoundation/hardhat-ignition": "^0.15.1", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", "hardhat": "^2.18.0", "viem": "^2.7.6" } diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 31b8b7dd17..90a671ea08 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,25 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.1 - 2024-04-04 + +### Added + +- Add a configurable upper limit for the maxFeePerGas ([#685](https://github.com/NomicFoundation/hardhat-ignition/issues/685)) +- Support writing and reading from deployments folder within tests and scripts ([#704](https://github.com/NomicFoundation/hardhat-ignition/pull/704)) +- Add `ignition deployments` task to list all the current deployments ([#646](https://github.com/NomicFoundation/hardhat-ignition/issues/646)) + +### Changed + +- Deploying to a cleared local hardhat node ignores previous deployment ([#650](https://github.com/NomicFoundation/hardhat-ignition/issues/650)) + +### Fixed + +- More resilent automine check ([#721](https://github.com/NomicFoundation/hardhat-ignition/issues/721)) +- `getCode` usage brought in line with Ethereum RPC standard ([#715](https://github.com/NomicFoundation/hardhat-ignition/issues/715)) +- Fixed unexpected next nonce on revert ([#676](https://github.com/NomicFoundation/hardhat-ignition/issues/676)) +- Reduce sources being passed to etherscan for verification ([#706](https://github.com/NomicFoundation/hardhat-ignition/issues/706)) + ## 0.15.0 - 2024-03-13 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3c1ad4e2fe..11e63a8458 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.0", + "version": "0.15.1", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", @@ -59,8 +59,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.0", - "@nomicfoundation/ignition-ui": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", + "@nomicfoundation/ignition-ui": "^0.15.1", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/package.json b/packages/ui/package.json index 7a5bfb96e4..9b9a55a7c4 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.0", + "version": "0.15.1", "type": "module", "scripts": { "predev": "npm run regenerate-deployment-example", @@ -17,7 +17,7 @@ "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.15.0", + "@nomicfoundation/ignition-core": "^0.15.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", From b394f4164d737144e2d07b21dc1daebe43bec0af Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 15 Apr 2024 11:15:03 +0100 Subject: [PATCH 1223/1302] chore: update publishing to include hiring imprint Add an imprint on the end of any release message, and show a template in the publishing instructions in `./CONTRIBUTING.md`. --- CONTRIBUTING.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b24586e00d..245435aac8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -115,7 +115,13 @@ yyyy-mm-dd` release. 16. Switch to main branch and pull the latest changes 17. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` 18. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-ethers -w @nomicfoundation/hardhat-ignition-viem` -19. Create a release on github off of the pushed tag +19. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: + +```markdown +--- +> 💡 **The Nomic Foundation is hiring! Check [our open positions](https://www.nomic.foundation/jobs).** +--- +``` ## Manual testing From c13d2099d07e2a103acb62c62880221f035b29b9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 22 Apr 2024 21:39:04 -0400 Subject: [PATCH 1224/1302] swap monorepo from npm to pnpm --- .devcontainer/devcontainer.json | 4 +- .github/workflows/ci.yml | 50 +- CONTRIBUTING.md | 37 +- package-lock.json | 19953 ------------------ package.json | 28 +- packages/core/package.json | 10 +- packages/hardhat-plugin-ethers/package.json | 12 +- packages/hardhat-plugin-viem/package.json | 12 +- packages/hardhat-plugin/package.json | 12 +- packages/ui/README.md | 4 +- packages/ui/examples/ComplexModule.js | 6 +- packages/ui/package.json | 12 +- pnpm-lock.yaml | 8744 ++++++++ pnpm-workspace.yaml | 2 + 14 files changed, 8840 insertions(+), 20046 deletions(-) delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 5e4e7c36d2..f52fca86a3 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -6,6 +6,6 @@ "version": "18" /* Keep in sync with the oldest version of Node.js that Hardhat supports */ }, }, - /* installs npm dependencies on the new container. */ - "postCreateCommand": "npm install" + /* installs pnpm dependencies on the new container. */ + "postCreateCommand": "pnpm install" } \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index da5a65a142..45f443fe57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,36 +13,38 @@ jobs: runs-on: windows-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v3 + with: + version: 9 - uses: actions/setup-node@v2 with: node-version: 18 - cache: npm + cache: "pnpm" - name: Install - run: npm install + run: pnpm install - name: Build - run: npm run build + run: pnpm build - name: Run tests - run: npm run test - - name: Run tests in examples - run: npm run test:examples + run: pnpm test test_on_macos: name: Test Ignition on MacOS with Node 18 runs-on: macos-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v3 + with: + version: 9 - uses: actions/setup-node@v2 with: node-version: 18 - cache: npm + cache: "pnpm" - name: Install - run: npm install + run: pnpm install - name: Build - run: npm run build + run: pnpm build - name: Run tests - run: npm run test - - name: Run tests in examples - run: npm run test:examples + run: pnpm test test_on_linux: name: Test Ignition on Ubuntu with Node ${{ matrix.node }} @@ -52,31 +54,35 @@ jobs: node: [18, 20.5] steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v3 + with: + version: 9 - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node }} - cache: npm + cache: "pnpm" - name: Install - run: npm install + run: pnpm install - name: Build - run: npm run build + run: pnpm build - name: Run tests - run: npm run test - - name: Run tests in examples - run: npm run test:examples + run: pnpm test lint: name: Lint the project runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: pnpm/action-setup@v3 + with: + version: 9 - uses: actions/setup-node@v2 with: node-version: 18 - cache: npm + cache: "pnpm" - name: Install - run: npm install + run: pnpm install - name: Build - run: npm run build + run: pnpm build - name: Lint - run: npm run lint + run: pnpm lint diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 245435aac8..a60d89d9a5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,7 +8,7 @@ If you find a bug or want to propose a new feature, please [open an issue](https ## Project Structure -This repository is a monorepo handled with `npm` workspaces. +This repository is a monorepo handled with `pnpm` workspaces. There are five packages: @@ -20,12 +20,12 @@ There are five packages: ## Setup -Ignition is a `typescript` project managed by `npm`. +Ignition is a `typescript` project managed by `pnpm`. -To install the dependencies, run `npm` in the project root: +To install the dependencies, run `pnpm` in the project root: ```shell -npm install +pnpm install ``` ## Building @@ -33,13 +33,13 @@ npm install The packages are written in `typescript` and so require a build step, to build: ```shell -npm run build +pnpm build ``` The **Hardhat** plugin depends on **core**, while developing you may want to run a continuous build with `watch`: ```shell -npm run watch +pnpm watch ``` ## Testing @@ -47,7 +47,7 @@ npm run watch The test suite is written in `mocha`, to run: ```shell -npm run test +pnpm test ``` ## Linting @@ -55,7 +55,7 @@ npm run test Formatting is enforced with `prettier` and code rules with `eslint`, to run both: ```shell -npm run lint +pnpm lint ``` ## Clean @@ -63,7 +63,7 @@ npm run lint If typescript or testing gets into a weird state, `clean` will remove ephemeral folders (i.e. `./dist`, `./coverage` etc) and clear the typescript build info cache, allowing you to start from a clean slate: ```shell -npm run clean +pnpm clean ``` ## Branching @@ -85,8 +85,8 @@ If you are working purely on the documentation, not as a result of a technical c To publish ignition: 1. git fetch, Checkout out `development`, then ensure your branch is up to date `git pull --ff-only` -2. Perform a clean install and build (will lose all uncommitted changes) git clean -fdx ., npm install, npm run build -3. Run a full check, stopping on failure: `npm run fullcheck` +2. Perform a clean install and build (will lose all uncommitted changes) git clean -fdx ., pnpm install, pnpm build +3. Run a full check, stopping on failure: `pnpm fullcheck` 4. Confirm the commits represent the features for the release 5. Create a release branch `git checkout -b release/yyyy-mm-dd` 6. Update the `CHANGELOG.md` under `./packages/core`. @@ -94,7 +94,7 @@ To publish ignition: 8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-ethers`. 9. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-viem`. 10. Update the `CHANGELOG.md` under `./packages/ui`. -11. Update the package versions based on semver: `npm version --no-git-tag-version --workspaces patch #minor #major` +11. Update the package versions based on semver: `pnpm version --no-git-tag-version --workspaces patch #minor #major` 12. Update the version of dependencies: - cores version in hardhat-ui deps @@ -110,12 +110,13 @@ Update the packages versions and changelogs for the `X.X.X - yyyy-mm-dd` release. ``` -14. Push the release branch and open a pull request on `main`, the PR description should match the changelogs -15. On a successful check, `rebase merge` the release branch into `main` -16. Switch to main branch and pull the latest changes -17. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -18. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `npm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-ethers -w @nomicfoundation/hardhat-ignition-viem` -19. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: +14. Deploy to a local verdaccio instance and test each of the `./examples` based on the new version. +15. Push the release branch and open a pull request on `main`, the PR description should match the changelogs +16. On a successful check, `rebase merge` the release branch into `main` +17. Switch to main branch and pull the latest changes +18. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +19. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `pnpm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-ethers -w @nomicfoundation/hardhat-ignition-viem` +20. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: ```markdown --- diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 0b7d3d6e2d..0000000000 --- a/package-lock.json +++ /dev/null @@ -1,19953 +0,0 @@ -{ - "name": "root", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "root", - "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@microsoft/api-extractor": "7.40.1", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.5", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.13", - "@types/lodash": "4.14.189", - "@types/lodash.flattendeep": "^4.4.7", - "@types/mocha": "9.1.1", - "@types/ndjson": "2.0.1", - "@types/node": "16.11.7", - "@types/prompts": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/experimental-utils": "^5.62.0", - "@typescript-eslint/parser": "^5.57.1", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "esbuild": "^0.15.9", - "eslint": "^8.38.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "2.29.0", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", - "mocha": "^9.1.3", - "nyc": "15.1.0", - "open-cli": "7.2.0", - "prettier": "2.8.8", - "rimraf": "3.0.2", - "sinon": "^14.0.0", - "ts-node": "10.9.1", - "typescript": "^5.0.2" - }, - "workspaces": { - "packages": [ - "packages/core", - "packages/ui", - "packages/hardhat-plugin", - "packages/hardhat-plugin-ethers", - "packages/hardhat-plugin-viem", - "examples/*" - ] - } - }, - "examples/complete": { - "name": "@nomicfoundation/ignition-complete-example", - "version": "0.15.1", - "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", - "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, - "examples/ens": { - "name": "@nomicfoundation/ignition-ens-example", - "version": "0.15.1", - "dependencies": { - "@ensdomains/ens-contracts": "0.0.11" - }, - "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", - "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, - "examples/sample": { - "name": "@nomicfoundation/ignition-sample-example", - "version": "0.15.1", - "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", - "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, - "examples/ts-sample": { - "name": "@nomicfoundation/ignition-ts-sample-example", - "version": "0.15.1", - "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", - "@nomicfoundation/hardhat-toolbox": "4.0.0", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, - "examples/viem-sample": { - "name": "@nomicfoundation/ignition-viem-sample-example", - "version": "0.15.1", - "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.15.1", - "@nomicfoundation/hardhat-network-helpers": "1.0.10", - "@nomicfoundation/hardhat-viem": "2.0.0", - "chai": "4.4.1", - "hardhat": "^2.18.0", - "prettier-plugin-solidity": "1.1.3" - } - }, - "examples/viem-sample/node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.10.tgz", - "integrity": "sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==", - "dev": true, - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.24.2", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", - "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", - "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@braintree/sanitize-url": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz", - "integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==", - "dev": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dev": true, - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "dev": true - }, - "node_modules/@emotion/stylis": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz", - "integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==", - "dev": true - }, - "node_modules/@emotion/unitless": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", - "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==", - "dev": true - }, - "node_modules/@ensdomains/address-encoder": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@ensdomains/address-encoder/-/address-encoder-0.1.9.tgz", - "integrity": "sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==", - "dependencies": { - "bech32": "^1.1.3", - "blakejs": "^1.1.0", - "bn.js": "^4.11.8", - "bs58": "^4.0.1", - "crypto-addr-codec": "^0.1.7", - "nano-base32": "^1.0.1", - "ripemd160": "^2.0.2" - } - }, - "node_modules/@ensdomains/address-encoder/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@ensdomains/buffer": { - "version": "0.0.13", - "resolved": "https://registry.npmjs.org/@ensdomains/buffer/-/buffer-0.0.13.tgz", - "integrity": "sha512-8aA+U/e4S54ebPwcge1HHvvpgXLKxPd6EOSegMlrTvBnKB8RwB3OpNyflaikD6KqzIwDaBaH8bvnTrMcfpV7oQ==", - "dependencies": { - "@nomiclabs/hardhat-truffle5": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@ensdomains/ens/-/ens-0.4.5.tgz", - "integrity": "sha512-JSvpj1iNMFjK6K+uVl4unqMoa9rf5jopb8cya5UGBWz23Nw8hSNT7efgUx4BTlAPAgpNlEioUfeTyQ6J9ZvTVw==", - "deprecated": "Please use @ensdomains/ens-contracts", - "dependencies": { - "bluebird": "^3.5.2", - "eth-ens-namehash": "^2.0.8", - "solc": "^0.4.20", - "testrpc": "0.0.1", - "web3-utils": "^1.0.0-beta.31" - } - }, - "node_modules/@ensdomains/ens-contracts": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-contracts/-/ens-contracts-0.0.11.tgz", - "integrity": "sha512-b74OlFcds9eyHy26uE2fGcM+ZCSFtPeRGVbUYWq3NRlf+9t8TIgPwF3rCNwpAFQG0B/AHb4C4hYX2BBJYR1zPg==", - "dependencies": { - "@ensdomains/buffer": "^0.0.13", - "@ensdomains/solsha1": "0.0.3", - "@openzeppelin/contracts": "^4.1.0", - "dns-packet": "^5.3.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/@ensdomains/ens/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" - }, - "node_modules/@ensdomains/ens/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/@ensdomains/ens/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@ensdomains/ens/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==" - }, - "node_modules/@ensdomains/ens/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/@ensdomains/ens/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@ensdomains/ens/node_modules/solc": { - "version": "0.4.26", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.4.26.tgz", - "integrity": "sha512-o+c6FpkiHd+HPjmjEVpQgH7fqZ14tJpXhho+/bQXlXbliLIS/xjXb42Vxh+qQY1WCSTMQ0+a5vR9vi0MfhU6mA==", - "dependencies": { - "fs-extra": "^0.30.0", - "memorystream": "^0.3.1", - "require-from-string": "^1.1.0", - "semver": "^5.3.0", - "yargs": "^4.7.1" - }, - "bin": { - "solcjs": "solcjs" - } - }, - "node_modules/@ensdomains/ens/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==" - }, - "node_modules/@ensdomains/ens/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ensdomains/ens/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==" - }, - "node_modules/@ensdomains/ens/node_modules/yargs": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", - "integrity": "sha512-LqodLrnIDM3IFT+Hf/5sxBnEGECrfdC1uIbgZeJmESCSo4HoCAaKEus8MylXHAkdacGc0ye+Qa+dpkuom8uVYA==", - "dependencies": { - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "lodash.assign": "^4.0.3", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.1", - "which-module": "^1.0.0", - "window-size": "^0.2.0", - "y18n": "^3.2.1", - "yargs-parser": "^2.4.1" - } - }, - "node_modules/@ensdomains/ens/node_modules/yargs-parser": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", - "integrity": "sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==", - "dependencies": { - "camelcase": "^3.0.0", - "lodash.assign": "^4.0.6" - } - }, - "node_modules/@ensdomains/ensjs": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ensjs/-/ensjs-2.1.0.tgz", - "integrity": "sha512-GRbGPT8Z/OJMDuxs75U/jUNEC0tbL0aj7/L/QQznGYKm/tiasp+ndLOaoULy9kKJFC0TBByqfFliEHDgoLhyog==", - "dependencies": { - "@babel/runtime": "^7.4.4", - "@ensdomains/address-encoder": "^0.1.7", - "@ensdomains/ens": "0.4.5", - "@ensdomains/resolver": "0.2.4", - "content-hash": "^2.5.2", - "eth-ens-namehash": "^2.0.8", - "ethers": "^5.0.13", - "js-sha3": "^0.8.0" - } - }, - "node_modules/@ensdomains/ensjs/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ensdomains/ensjs/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/@ensdomains/resolver": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@ensdomains/resolver/-/resolver-0.2.4.tgz", - "integrity": "sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==", - "deprecated": "Please use @ensdomains/ens-contracts" - }, - "node_modules/@ensdomains/solsha1": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@ensdomains/solsha1/-/solsha1-0.0.3.tgz", - "integrity": "sha512-uhuG5LzRt/UJC0Ux83cE2rCKwSleRePoYdQVcqPN1wyf3/ekMzT/KZUF9+v7/AG5w9jlMLCQkUM50vfjr0Yu9Q==", - "dependencies": { - "hash-test-vectors": "^1.3.2" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", - "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", - "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", - "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", - "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", - "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", - "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", - "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", - "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", - "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", - "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", - "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", - "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", - "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", - "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", - "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", - "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", - "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", - "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", - "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", - "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", - "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.6.5.tgz", - "integrity": "sha512-lRyVQOeCDaIVtgfbowla32pzeDv2Obr8oR8Put5RdUBNRGr1VGPGQNGP6elWIpgK3YdpzqTOh4GyUGOureVeeA==", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/rlp": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@ethereumjs/rlp/-/rlp-4.0.1.tgz", - "integrity": "sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==", - "bin": { - "rlp": "bin/rlp" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.5.2.tgz", - "integrity": "sha512-gQDNJWKrSDGu2w7w0PzVXVBNMzb7wwdDOmOqczmhNjqFxFuIbhVJDwiGEnxFNC2/b8ifcZzY7MLcluizohRzNw==", - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/util": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/util/-/util-8.1.0.tgz", - "integrity": "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==", - "dependencies": { - "@ethereumjs/rlp": "^4.0.1", - "ethereum-cryptography": "^2.0.0", - "micro-ftch": "^0.3.1" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip32": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", - "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", - "dependencies": { - "@noble/curves": "~1.3.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/@scure/bip39": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", - "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", - "dependencies": { - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@ethereumjs/util/node_modules/ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "dependencies": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/abi/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-provider": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0" - } - }, - "node_modules/@ethersproject/abstract-signer": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", - "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/address": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.6.1.tgz", - "integrity": "sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.6.2", - "@ethersproject/bytes": "^5.6.1", - "@ethersproject/keccak256": "^5.6.1", - "@ethersproject/logger": "^5.6.0", - "@ethersproject/rlp": "^5.6.1" - } - }, - "node_modules/@ethersproject/base64": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "node_modules/@ethersproject/basex": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "node_modules/@ethersproject/bignumber": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", - "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "node_modules/@ethersproject/bytes": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", - "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/constants": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", - "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", - "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abi": "^5.7.0", - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/transactions": "^5.7.0" - } - }, - "node_modules/@ethersproject/contracts/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", - "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/hash/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/hdnode": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", - "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", - "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/pbkdf2": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "aes-js": "3.0.0", - "scrypt-js": "3.0.1" - } - }, - "node_modules/@ethersproject/json-wallets/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/json-wallets/node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/@ethersproject/keccak256": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", - "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "node_modules/@ethersproject/logger": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", - "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ] - }, - "node_modules/@ethersproject/networks": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", - "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", - "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "node_modules/@ethersproject/properties": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", - "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", - "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/base64": "^5.7.0", - "@ethersproject/basex": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/networks": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/web": "^5.7.0", - "bech32": "1.1.4", - "ws": "7.4.6" - } - }, - "node_modules/@ethersproject/providers/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/providers/node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@ethersproject/random": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", - "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/rlp": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", - "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/sha2": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", - "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/signing-key": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", - "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "bn.js": "^5.2.1", - "elliptic": "6.5.4", - "hash.js": "1.1.7" - } - }, - "node_modules/@ethersproject/solidity": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", - "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/sha2": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/strings": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", - "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", - "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/rlp": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0" - } - }, - "node_modules/@ethersproject/transactions/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/units": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", - "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", - "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/abstract-provider": "^5.7.0", - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/hdnode": "^5.7.0", - "@ethersproject/json-wallets": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/random": "^5.7.0", - "@ethersproject/signing-key": "^5.7.0", - "@ethersproject/transactions": "^5.7.0", - "@ethersproject/wordlists": "^5.7.0" - } - }, - "node_modules/@ethersproject/wallet/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/@ethersproject/web": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", - "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/base64": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@ethersproject/wordlists": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", - "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/hash": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/properties": "^5.7.0", - "@ethersproject/strings": "^5.7.0" - } - }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "engines": { - "node": ">=14" - } - }, - "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", - "dev": true, - "dependencies": { - "@floating-ui/utils": "^0.2.1" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", - "dev": true, - "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", - "dev": true - }, - "node_modules/@fontsource/roboto": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/@fontsource/roboto/-/roboto-5.0.12.tgz", - "integrity": "sha512-x0o17jvgoSSbS9OZnUX2+xJmVRvVCfeaYJjkS7w62iN7CuJWtMf5vJj8LqgC7ibqIkitOHVW+XssRjgrcHn62g==", - "dev": true - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/nyc-config-typescript": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@istanbuljs/nyc-config-typescript/-/nyc-config-typescript-1.0.2.tgz", - "integrity": "sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2" - }, - "engines": { - "node": ">=8" - }, - "peerDependencies": { - "nyc": ">=15" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "devOptional": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "devOptional": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@metamask/eth-sig-util/-/eth-sig-util-4.0.1.tgz", - "integrity": "sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==", - "dependencies": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.40.1", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.40.1.tgz", - "integrity": "sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==", - "dev": true, - "dependencies": { - "@microsoft/api-extractor-model": "7.28.9", - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.66.0", - "@rushstack/rig-package": "0.5.1", - "@rushstack/ts-command-line": "4.17.1", - "colors": "~1.2.1", - "lodash": "~4.17.15", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.3.3" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.28.9", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.28.9.tgz", - "integrity": "sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "@microsoft/tsdoc-config": "~0.16.1", - "@rushstack/node-core-library": "3.66.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz", - "integrity": "sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==", - "dev": true - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.16.2.tgz", - "integrity": "sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==", - "dev": true, - "dependencies": { - "@microsoft/tsdoc": "0.14.2", - "ajv": "~6.12.6", - "jju": "~1.4.0", - "resolve": "~1.19.0" - } - }, - "node_modules/@microsoft/tsdoc-config/node_modules/resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "dev": true, - "dependencies": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/secp256k1": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz", - "integrity": "sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nomicfoundation/edr": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr/-/edr-0.3.3.tgz", - "integrity": "sha512-zP+e+3B1nEUx6bW5BPnIzCQbkhmYfdMBJdiVggTqqTfAA82sOkdOG7wsOMcz5qF3fYfx/irNRM1kgc9HVFIbpQ==", - "engines": { - "node": ">= 18" - }, - "optionalDependencies": { - "@nomicfoundation/edr-darwin-arm64": "0.3.3", - "@nomicfoundation/edr-darwin-x64": "0.3.3", - "@nomicfoundation/edr-linux-arm64-gnu": "0.3.3", - "@nomicfoundation/edr-linux-arm64-musl": "0.3.3", - "@nomicfoundation/edr-linux-x64-gnu": "0.3.3", - "@nomicfoundation/edr-linux-x64-musl": "0.3.3", - "@nomicfoundation/edr-win32-arm64-msvc": "0.3.3", - "@nomicfoundation/edr-win32-ia32-msvc": "0.3.3", - "@nomicfoundation/edr-win32-x64-msvc": "0.3.3" - } - }, - "node_modules/@nomicfoundation/edr-darwin-arm64": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-arm64/-/edr-darwin-arm64-0.3.3.tgz", - "integrity": "sha512-E9VGsUD+1Ga4mn/5ooHsMi8JEfhZbKP6CXN/BhJ8kXbIC10NqTD1RuhCKGRtYq4vqH/3Nfq25Xg8E8RWOF4KBQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-darwin-x64": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-darwin-x64/-/edr-darwin-x64-0.3.3.tgz", - "integrity": "sha512-vkZXZ1ydPg+Ijb2iyqENA+KCkxGTCUWG5itCSliiA0Li2YE7ujDMGhheEpFp1WVlZadviz0bfk1rZXbCqlirpg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-linux-arm64-gnu": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-gnu/-/edr-linux-arm64-gnu-0.3.3.tgz", - "integrity": "sha512-gdIg0Yj1qqS9wVuywc5B/+DqKylfUGB6/CQn/shMqwAfsAVAVpchkhy66PR+REEx7fh/GkNctxLlENXPeLzDiA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-linux-arm64-musl": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-arm64-musl/-/edr-linux-arm64-musl-0.3.3.tgz", - "integrity": "sha512-AXZ08MFvhNeBZbOBNmz1SJ/DMrMOE2mHEJtaNnsctlxIunjxfrWww4q+WXB34jbr9iaVYYlPsaWe5sueuw6s3Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-linux-x64-gnu": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-gnu/-/edr-linux-x64-gnu-0.3.3.tgz", - "integrity": "sha512-xElOs1U+E6lBLtv1mnJ+E8nr2MxZgKiLo8bZAgBboy9odYtmkDVwhMjtsFKSuZbGxFtsSyGRT4cXw3JAbtUDeA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-linux-x64-musl": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-linux-x64-musl/-/edr-linux-x64-musl-0.3.3.tgz", - "integrity": "sha512-2Fe6gwm1RAGQ/PfMYiaSba2OrFp8zzYWh+am9lYObOFjV9D+A1zhIzfy0UC74glPks5eV8eY4pBPrVR042m2Nw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-win32-arm64-msvc": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-arm64-msvc/-/edr-win32-arm64-msvc-0.3.3.tgz", - "integrity": "sha512-8NHyxIsFrl0ufSQ/ErqF2lKIa/gz1gaaa1a2vKkDEqvqCUcPhBTYhA5NHgTPhLETFTnCFr0z+YbctFCyjh4qrA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/edr-win32-ia32-msvc": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-ia32-msvc/-/edr-win32-ia32-msvc-0.3.3.tgz", - "integrity": "sha512-0F6hM0kGia4dQVb/kauho9JcP1ozWisY2/She+ISR5ceuhzmAwQJluM0g+0TYDME0LtxBxiMPq/yPiZMQeq31w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/edr-win32-x64-msvc": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@nomicfoundation/edr-win32-x64-msvc/-/edr-win32-x64-msvc-0.3.3.tgz", - "integrity": "sha512-d75q1uaMb6z9i+GQZoblbOfFBvlBnWc+5rB13UWRkCOJSnoYwyFWhGJx5GeM59gC7aIblc5VD9qOAhHuvM9N+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 18" - } - }, - "node_modules/@nomicfoundation/ethereumjs-common": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-common/-/ethereumjs-common-4.0.4.tgz", - "integrity": "sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==", - "dependencies": { - "@nomicfoundation/ethereumjs-util": "9.0.4" - } - }, - "node_modules/@nomicfoundation/ethereumjs-rlp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-rlp/-/ethereumjs-rlp-5.0.4.tgz", - "integrity": "sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==", - "bin": { - "rlp": "bin/rlp.cjs" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nomicfoundation/ethereumjs-tx": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-tx/-/ethereumjs-tx-5.0.4.tgz", - "integrity": "sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==", - "dependencies": { - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "c-kzg": "^2.1.2" - }, - "peerDependenciesMeta": { - "c-kzg": { - "optional": true - } - } - }, - "node_modules/@nomicfoundation/ethereumjs-util": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@nomicfoundation/ethereumjs-util/-/ethereumjs-util-9.0.4.tgz", - "integrity": "sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==", - "dependencies": { - "@nomicfoundation/ethereumjs-rlp": "5.0.4", - "ethereum-cryptography": "0.1.3" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "c-kzg": "^2.1.2" - }, - "peerDependenciesMeta": { - "c-kzg": { - "optional": true - } - } - }, - "node_modules/@nomicfoundation/hardhat-chai-matchers": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-chai-matchers/-/hardhat-chai-matchers-2.0.6.tgz", - "integrity": "sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==", - "dev": true, - "peer": true, - "dependencies": { - "@types/chai-as-promised": "^7.1.3", - "chai-as-promised": "^7.1.1", - "deep-eql": "^4.0.1", - "ordinal": "^1.0.3" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "chai": "^4.2.0", - "ethers": "^6.1.0", - "hardhat": "^2.9.4" - } - }, - "node_modules/@nomicfoundation/hardhat-ethers": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-ethers/-/hardhat-ethers-3.0.5.tgz", - "integrity": "sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "lodash.isequal": "^4.5.0" - }, - "peerDependencies": { - "ethers": "^6.1.0", - "hardhat": "^2.0.0" - } - }, - "node_modules/@nomicfoundation/hardhat-ignition": { - "resolved": "packages/hardhat-plugin", - "link": true - }, - "node_modules/@nomicfoundation/hardhat-ignition-ethers": { - "resolved": "packages/hardhat-plugin-ethers", - "link": true - }, - "node_modules/@nomicfoundation/hardhat-ignition-viem": { - "resolved": "packages/hardhat-plugin-viem", - "link": true - }, - "node_modules/@nomicfoundation/hardhat-network-helpers": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-network-helpers/-/hardhat-network-helpers-1.0.9.tgz", - "integrity": "sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==", - "dev": true, - "dependencies": { - "ethereumjs-util": "^7.1.4" - }, - "peerDependencies": { - "hardhat": "^2.9.5" - } - }, - "node_modules/@nomicfoundation/hardhat-toolbox": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-toolbox/-/hardhat-toolbox-4.0.0.tgz", - "integrity": "sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==", - "dev": true, - "peerDependencies": { - "@nomicfoundation/hardhat-chai-matchers": "^2.0.0", - "@nomicfoundation/hardhat-ethers": "^3.0.0", - "@nomicfoundation/hardhat-network-helpers": "^1.0.0", - "@nomicfoundation/hardhat-verify": "^2.0.0", - "@typechain/ethers-v6": "^0.5.0", - "@typechain/hardhat": "^9.0.0", - "@types/chai": "^4.2.0", - "@types/mocha": ">=9.1.0", - "@types/node": ">=16.0.0", - "chai": "^4.2.0", - "ethers": "^6.4.0", - "hardhat": "^2.11.0", - "hardhat-gas-reporter": "^1.0.8", - "solidity-coverage": "^0.8.1", - "ts-node": ">=8.0.0", - "typechain": "^8.3.0", - "typescript": ">=4.5.0" - } - }, - "node_modules/@nomicfoundation/hardhat-verify": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-verify/-/hardhat-verify-2.0.5.tgz", - "integrity": "sha512-Tg4zu8RkWpyADSFIgF4FlJIUEI4VkxcvELsmbJn2OokbvH2SnUrqKmw0BBfDrtvP0hhmx8wsnrRKP5DV/oTyTA==", - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@ethersproject/address": "^5.0.2", - "cbor": "^8.1.0", - "chalk": "^2.4.2", - "debug": "^4.1.1", - "lodash.clonedeep": "^4.5.0", - "semver": "^6.3.0", - "table": "^6.8.0", - "undici": "^5.14.0" - }, - "peerDependencies": { - "hardhat": "^2.0.4" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/cbor": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", - "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", - "peer": true, - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=12.19" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "peer": true - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@nomicfoundation/hardhat-verify/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@nomicfoundation/hardhat-viem": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomicfoundation/hardhat-viem/-/hardhat-viem-2.0.0.tgz", - "integrity": "sha512-ilXQKTc1jWHqJ66fAN6TIyCRyormoChOn1yQTCGoBQ+G6QcVCu5FTaGL2r0KUOY4IkTohtphK+UXQrKcxQX5Yw==", - "dev": true, - "dependencies": { - "abitype": "^0.9.8", - "lodash.memoize": "^4.1.2" - }, - "peerDependencies": { - "hardhat": "^2.17.0", - "typescript": "~5.0.0", - "viem": "^2.7.6" - } - }, - "node_modules/@nomicfoundation/ignition-complete-example": { - "resolved": "examples/complete", - "link": true - }, - "node_modules/@nomicfoundation/ignition-core": { - "resolved": "packages/core", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ens-example": { - "resolved": "examples/ens", - "link": true - }, - "node_modules/@nomicfoundation/ignition-sample-example": { - "resolved": "examples/sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ts-sample-example": { - "resolved": "examples/ts-sample", - "link": true - }, - "node_modules/@nomicfoundation/ignition-ui": { - "resolved": "packages/ui", - "link": true - }, - "node_modules/@nomicfoundation/ignition-viem-sample-example": { - "resolved": "examples/viem-sample", - "link": true - }, - "node_modules/@nomicfoundation/solidity-analyzer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer/-/solidity-analyzer-0.1.1.tgz", - "integrity": "sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==", - "engines": { - "node": ">= 12" - }, - "optionalDependencies": { - "@nomicfoundation/solidity-analyzer-darwin-arm64": "0.1.1", - "@nomicfoundation/solidity-analyzer-darwin-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-freebsd-x64": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-arm64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-gnu": "0.1.1", - "@nomicfoundation/solidity-analyzer-linux-x64-musl": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-arm64-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-ia32-msvc": "0.1.1", - "@nomicfoundation/solidity-analyzer-win32-x64-msvc": "0.1.1" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-arm64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-arm64/-/solidity-analyzer-darwin-arm64-0.1.1.tgz", - "integrity": "sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-darwin-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-darwin-x64/-/solidity-analyzer-darwin-x64-0.1.1.tgz", - "integrity": "sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-freebsd-x64": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-freebsd-x64/-/solidity-analyzer-freebsd-x64-0.1.1.tgz", - "integrity": "sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-gnu/-/solidity-analyzer-linux-arm64-gnu-0.1.1.tgz", - "integrity": "sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-arm64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-arm64-musl/-/solidity-analyzer-linux-arm64-musl-0.1.1.tgz", - "integrity": "sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-gnu": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-gnu/-/solidity-analyzer-linux-x64-gnu-0.1.1.tgz", - "integrity": "sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-linux-x64-musl": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-linux-x64-musl/-/solidity-analyzer-linux-x64-musl-0.1.1.tgz", - "integrity": "sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-arm64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-arm64-msvc/-/solidity-analyzer-win32-arm64-msvc-0.1.1.tgz", - "integrity": "sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-ia32-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-ia32-msvc/-/solidity-analyzer-win32-ia32-msvc-0.1.1.tgz", - "integrity": "sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomicfoundation/solidity-analyzer-win32-x64-msvc": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@nomicfoundation/solidity-analyzer-win32-x64-msvc/-/solidity-analyzer-win32-x64-msvc-0.1.1.tgz", - "integrity": "sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nomiclabs/eslint-plugin-hardhat-internal-rules": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@nomiclabs/eslint-plugin-hardhat-internal-rules/-/eslint-plugin-hardhat-internal-rules-1.0.2.tgz", - "integrity": "sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==", - "dev": true - }, - "node_modules/@nomiclabs/hardhat-truffle5": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-truffle5/-/hardhat-truffle5-2.0.7.tgz", - "integrity": "sha512-Pw8451IUZp1bTp0QqCHCYfCHs66sCnyxPcaorapu9mfOV9xnZsVaFdtutnhNEiXdiZwbed7LFKpRsde4BjFwig==", - "dependencies": { - "@nomiclabs/truffle-contract": "^4.2.23", - "@types/chai": "^4.2.0", - "chai": "^4.2.0", - "ethereumjs-util": "^7.1.4", - "fs-extra": "^7.0.1" - }, - "peerDependencies": { - "@nomiclabs/hardhat-web3": "^2.0.0", - "hardhat": "^2.6.4", - "web3": "^1.0.0-beta.36" - } - }, - "node_modules/@nomiclabs/hardhat-web3": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@nomiclabs/hardhat-web3/-/hardhat-web3-2.0.0.tgz", - "integrity": "sha512-zt4xN+D+fKl3wW2YlTX3k9APR3XZgPkxJYf36AcliJn3oujnKEVRZaHu0PhgLjO+gR+F/kiYayo9fgd2L8970Q==", - "peer": true, - "dependencies": { - "@types/bignumber.js": "^5.0.0" - }, - "peerDependencies": { - "hardhat": "^2.0.0", - "web3": "^1.0.0-beta.36" - } - }, - "node_modules/@nomiclabs/truffle-contract": { - "version": "4.5.10", - "resolved": "https://registry.npmjs.org/@nomiclabs/truffle-contract/-/truffle-contract-4.5.10.tgz", - "integrity": "sha512-nF/6InFV+0hUvutyFgsdOMCoYlr//2fJbRER4itxYtQtc4/O1biTwZIKRu+5l2J5Sq6LU2WX7vZHtDgQdhWxIQ==", - "dependencies": { - "@ensdomains/ensjs": "^2.0.1", - "@truffle/blockchain-utils": "^0.1.3", - "@truffle/contract-schema": "^3.4.7", - "@truffle/debug-utils": "^6.0.22", - "@truffle/error": "^0.1.0", - "@truffle/interface-adapter": "^0.5.16", - "bignumber.js": "^7.2.1", - "ethereum-ens": "^0.8.0", - "ethers": "^4.0.0-beta.1", - "source-map-support": "^0.5.19" - }, - "peerDependencies": { - "web3": "^1.2.1", - "web3-core-helpers": "^1.2.1", - "web3-core-promievent": "^1.2.1", - "web3-eth-abi": "^1.2.1", - "web3-utils": "^1.2.1" - } - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/@nomiclabs/truffle-contract/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.6", - "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.9.6.tgz", - "integrity": "sha512-xSmezSupL+y9VkHZJGDoCBpmnB2ogM13ccaYDWqJTfS3dbuHkgjuwDFUmaFauBCboQMGB/S5UqUl2y54X99BmA==" - }, - "node_modules/@remix-run/router": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.0.tgz", - "integrity": "sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==", - "dev": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.2.tgz", - "integrity": "sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.2.tgz", - "integrity": "sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.2.tgz", - "integrity": "sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.2.tgz", - "integrity": "sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.2.tgz", - "integrity": "sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.2.tgz", - "integrity": "sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.2.tgz", - "integrity": "sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.13.2.tgz", - "integrity": "sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==", - "cpu": [ - "ppc64le" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.2.tgz", - "integrity": "sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.13.2.tgz", - "integrity": "sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.2.tgz", - "integrity": "sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.2.tgz", - "integrity": "sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.2.tgz", - "integrity": "sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.2.tgz", - "integrity": "sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.2.tgz", - "integrity": "sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true - }, - "node_modules/@rushstack/node-core-library": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.66.0.tgz", - "integrity": "sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==", - "dev": true, - "dependencies": { - "colors": "~1.2.1", - "fs-extra": "~7.0.1", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "z-schema": "~5.0.2" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.1.tgz", - "integrity": "sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==", - "dev": true, - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz", - "integrity": "sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==", - "dev": true, - "dependencies": { - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "colors": "~1.2.1", - "string-argv": "~0.3.1" - } - }, - "node_modules/@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.2.tgz", - "integrity": "sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==", - "dependencies": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip39": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.1.tgz", - "integrity": "sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sentry/core": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz", - "integrity": "sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/hub": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.30.0.tgz", - "integrity": "sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==", - "dependencies": { - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/minimal": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.30.0.tgz", - "integrity": "sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/node": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.30.0.tgz", - "integrity": "sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==", - "dependencies": { - "@sentry/core": "5.30.0", - "@sentry/hub": "5.30.0", - "@sentry/tracing": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/tracing": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/tracing/-/tracing-5.30.0.tgz", - "integrity": "sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==", - "dependencies": { - "@sentry/hub": "5.30.0", - "@sentry/minimal": "5.30.0", - "@sentry/types": "5.30.0", - "@sentry/utils": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/tracing/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sentry/types": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.30.0.tgz", - "integrity": "sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.30.0.tgz", - "integrity": "sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==", - "dependencies": { - "@sentry/types": "5.30.0", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, - "node_modules/@sinonjs/commons": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", - "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz", - "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^1.7.0" - } - }, - "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", - "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/samsam": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-7.0.1.tgz", - "integrity": "sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", - "dev": true - }, - "node_modules/@solidity-parser/parser": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.16.2.tgz", - "integrity": "sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==", - "dev": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", - "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", - "dependencies": { - "defer-to-connect": "^2.0.1" - }, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==", - "dev": true - }, - "node_modules/@truffle/abi-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@truffle/abi-utils/-/abi-utils-1.0.3.tgz", - "integrity": "sha512-AWhs01HCShaVKjml7Z4AbVREr/u4oiWxCcoR7Cktm0mEvtT04pvnxW5xB/cI4znRkrbPdFQlFt67kgrAjesYkw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "change-case": "3.0.2", - "fast-check": "3.1.1", - "web3-utils": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/abi-utils/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/blockchain-utils": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@truffle/blockchain-utils/-/blockchain-utils-0.1.9.tgz", - "integrity": "sha512-RHfumgbIVo68Rv9ofDYfynjnYZIfP/f1vZy4RoqkfYAO+fqfc58PDRzB1WAGq2U6GPuOnipOJxQhnqNnffORZg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/codec": { - "version": "0.17.3", - "resolved": "https://registry.npmjs.org/@truffle/codec/-/codec-0.17.3.tgz", - "integrity": "sha512-Ko/+dsnntNyrJa57jUD9u4qx9nQby+H4GsUO6yjiCPSX0TQnEHK08XWqBSg0WdmCH2+h0y1nr2CXSx8gbZapxg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "@truffle/abi-utils": "^1.0.3", - "@truffle/compile-common": "^0.9.8", - "big.js": "^6.0.3", - "bn.js": "^5.1.3", - "cbor": "^5.2.0", - "debug": "^4.3.1", - "lodash": "^4.17.21", - "semver": "^7.5.4", - "utf8": "^3.0.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/codec/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/codec/node_modules/cbor": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-5.2.0.tgz", - "integrity": "sha512-5IMhi9e1QU76ppa5/ajP1BmMWZ2FHkhAhjeVKQ/EFCgYSEaeVaoGtL7cxJskf9oCCk+XjzaIdc3IuU/dbA/o2A==", - "dependencies": { - "bignumber.js": "^9.0.1", - "nofilter": "^1.0.4" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@truffle/codec/node_modules/nofilter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-1.0.4.tgz", - "integrity": "sha512-N8lidFp+fCz+TD51+haYdbDGrcBWwuHX40F5+z0qkUjMJ5Tp+rdSuAkMJ9N9eoolDlEVTf6u5icM+cNKkKW2mA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@truffle/codec/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/compile-common": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/@truffle/compile-common/-/compile-common-0.9.8.tgz", - "integrity": "sha512-DTpiyo32t/YhLI1spn84D3MHYHrnoVqO+Gp7ZHrYNwDs86mAxtNiH5lsVzSb8cPgiqlvNsRCU9nm9R0YmKMTBQ==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "@truffle/error": "^0.2.2", - "colors": "1.4.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/compile-common/node_modules/@truffle/error": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.2.2.tgz", - "integrity": "sha512-TqbzJ0O8DHh34cu8gDujnYl4dUl6o2DE4PR6iokbybvnIm/L2xl6+Gv1VC+YJS45xfH83Yo3/Zyg/9Oq8/xZWg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/compile-common/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@truffle/contract-schema": { - "version": "3.4.16", - "resolved": "https://registry.npmjs.org/@truffle/contract-schema/-/contract-schema-3.4.16.tgz", - "integrity": "sha512-g0WNYR/J327DqtJPI70ubS19K1Fth/1wxt2jFqLsPmz5cGZVjCwuhiie+LfBde4/Mc9QR8G+L3wtmT5cyoBxAg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "ajv": "^6.10.0", - "debug": "^4.3.1" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/debug-utils": { - "version": "6.0.57", - "resolved": "https://registry.npmjs.org/@truffle/debug-utils/-/debug-utils-6.0.57.tgz", - "integrity": "sha512-Q6oI7zLaeNLB69ixjwZk2UZEWBY6b2OD1sjLMGDKBGR7GaHYiw96GLR2PFgPH1uwEeLmV4N78LYaQCrDsHbNeA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "@truffle/codec": "^0.17.3", - "@trufflesuite/chromafi": "^3.0.0", - "bn.js": "^5.1.3", - "chalk": "^2.4.2", - "debug": "^4.3.1", - "highlightjs-solidity": "^2.0.6" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/debug-utils/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@truffle/debug-utils/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@truffle/debug-utils/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@truffle/debug-utils/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/debug-utils/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@truffle/error": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@truffle/error/-/error-0.1.1.tgz", - "integrity": "sha512-sE7c9IHIGdbK4YayH4BC8i8qMjoAOeg6nUXUDZZp8wlU21/EMpaG+CLx+KqcIPyR+GSWIW3Dm0PXkr2nlggFDA==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info." - }, - "node_modules/@truffle/interface-adapter": { - "version": "0.5.37", - "resolved": "https://registry.npmjs.org/@truffle/interface-adapter/-/interface-adapter-0.5.37.tgz", - "integrity": "sha512-lPH9MDgU+7sNDlJSClwyOwPCfuOimqsCx0HfGkznL3mcFRymc1pukAR1k17zn7ErHqBwJjiKAZ6Ri72KkS+IWw==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dependencies": { - "bn.js": "^5.1.3", - "ethers": "^4.0.32", - "web3": "1.10.0" - }, - "engines": { - "node": "^16.20 || ^18.16 || >=20" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/common": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@ethereumjs/common/-/common-2.5.0.tgz", - "integrity": "sha512-DEHjW6e38o+JmB/NO3GZBpW4lpaiBpkFgXF6jLcJ6gETBYpEyaA5nTimsWBUJR3Vmtm/didUEbNjajskugZORg==", - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.1" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@ethereumjs/tx": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/@ethereumjs/tx/-/tx-3.3.2.tgz", - "integrity": "sha512-6AaJhwg4ucmwTvw/1qLaZUX5miWrwZ4nLOUsKyb/HtzS3BMw/CasKhdi1ims9mBKeK9sOJCH4qGKOBGyJCeeog==", - "dependencies": { - "@ethereumjs/common": "^2.5.0", - "ethereumjs-util": "^7.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/@truffle/interface-adapter/node_modules/aes-js": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", - "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" - }, - "node_modules/@truffle/interface-adapter/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/cross-fetch": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", - "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/ethers": { - "version": "4.0.49", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-4.0.49.tgz", - "integrity": "sha512-kPltTvWiyu+OktYy1IStSO16i2e7cS9D9OxZ81q2UUaiNPVrm/RTcbxamCXF9VUSKzJIdJV68EAIhTEVBalRWg==", - "dependencies": { - "aes-js": "3.0.0", - "bn.js": "^4.11.9", - "elliptic": "6.5.4", - "hash.js": "1.1.3", - "js-sha3": "0.5.7", - "scrypt-js": "2.0.4", - "setimmediate": "1.0.4", - "uuid": "2.0.1", - "xmlhttprequest": "1.8.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/ethers/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/@truffle/interface-adapter/node_modules/scrypt-js": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-2.0.4.tgz", - "integrity": "sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==" - }, - "node_modules/@truffle/interface-adapter/node_modules/setimmediate": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.4.tgz", - "integrity": "sha512-/TjEmXQVEzdod/FFskf3o7oOAsGhHf2j1dZqRFbDzq4F3mvvxflIIi4Hd3bLQE9y/CpwqfSQam5JakI/mi3Pog==" - }, - "node_modules/@truffle/interface-adapter/node_modules/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-nWg9+Oa3qD2CQzHIP4qKUqwNfzKn8P0LtFhotaCTFchsV7ZfDhAybeip/HZVeMIpZi9JgY1E3nUlwaCmZT1sEg==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details." - }, - "node_modules/@truffle/interface-adapter/node_modules/web3": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.0.tgz", - "integrity": "sha512-YfKY9wSkGcM8seO+daR89oVTcbu18NsVfvOngzqMYGUU0pPSQmE57qQDvQzUeoIOHAnXEBNzrhjQJmm8ER0rng==", - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.10.0", - "web3-core": "1.10.0", - "web3-eth": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-shh": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-bzz": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.0.tgz", - "integrity": "sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==", - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.0.tgz", - "integrity": "sha512-fWySwqy2hn3TL89w5TM8wXF1Z2Q6frQTKHWmP0ppRQorEK8NcHJRfeMiv/mQlSKoTS1F6n/nv2uyZsixFycjYQ==", - "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-requestmanager": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-helpers": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.0.tgz", - "integrity": "sha512-pIxAzFDS5vnbXvfvLSpaA1tfRykAe9adw43YCKsEYQwH0gCLL0kMLkaCX3q+Q8EVmAh+e1jWL/nl9U0de1+++g==", - "dependencies": { - "web3-eth-iban": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-method": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.0.tgz", - "integrity": "sha512-4R700jTLAMKDMhQ+nsVfIXvH6IGJlJzGisIfMKWAIswH31h5AZz7uDUW2YctI+HrYd+5uOAlS4OJeeT9bIpvkA==", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-promievent": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.0.tgz", - "integrity": "sha512-68N7k5LWL5R38xRaKFrTFT2pm2jBNFaM4GioS00YjAKXRQ3KjmhijOMG3TICz6Aa5+6GDWYelDNx21YAeZ4YTg==", - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-requestmanager": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.0.tgz", - "integrity": "sha512-3z/JKE++Os62APml4dvBM+GAuId4h3L9ckUrj7ebEtS2AR0ixyQPbrBodgL91Sv7j7cQ3Y+hllaluqjguxvSaQ==", - "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.0", - "web3-providers-http": "1.10.0", - "web3-providers-ipc": "1.10.0", - "web3-providers-ws": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-core-subscriptions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.0.tgz", - "integrity": "sha512-HGm1PbDqsxejI075gxBc5OSkwymilRWZufIy9zEpnWKNmfbuv5FfHgW1/chtJP6aP3Uq2vHkvTDl3smQBb8l+g==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.0.tgz", - "integrity": "sha512-Z5vT6slNMLPKuwRyKGbqeGYC87OAy8bOblaqRTgg94CXcn/mmqU7iPIlG4506YdcdK3x6cfEDG7B6w+jRxypKA==", - "dependencies": { - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-accounts": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-eth-ens": "1.10.0", - "web3-eth-iban": "1.10.0", - "web3-eth-personal": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-abi": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.0.tgz", - "integrity": "sha512-cwS+qRBWpJ43aI9L3JS88QYPfFcSJJ3XapxOQ4j40v6mk7ATpA8CVK1vGTzpihNlOfMVRBkR95oAj7oL6aiDOg==", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.0.tgz", - "integrity": "sha512-wiq39Uc3mOI8rw24wE2n15hboLE0E9BsQLdlmsL4Zua9diDS6B5abXG0XhFcoNsXIGMWXVZz4TOq3u4EdpXF/Q==", - "dependencies": { - "@ethereumjs/common": "2.5.0", - "@ethereumjs/tx": "3.3.2", - "eth-lib": "0.2.8", - "ethereumjs-util": "^7.1.5", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-contract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.0.tgz", - "integrity": "sha512-MIC5FOzP/+2evDksQQ/dpcXhSqa/2hFNytdl/x61IeWxhh6vlFeSjq0YVTAyIzdjwnL7nEmZpjfI6y6/Ufhy7w==", - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-ens": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.0.tgz", - "integrity": "sha512-3hpGgzX3qjgxNAmqdrC2YUQMTfnZbs4GeLEmy8aCWziVwogbuqQZ+Gzdfrym45eOZodk+lmXyLuAdqkNlvkc1g==", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-promievent": "1.10.0", - "web3-eth-abi": "1.10.0", - "web3-eth-contract": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-iban": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.0.tgz", - "integrity": "sha512-0l+SP3IGhInw7Q20LY3IVafYEuufo4Dn75jAHT7c2aDJsIolvf2Lc6ugHkBajlwUneGfbRQs/ccYPQ9JeMUbrg==", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-eth-personal": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.0.tgz", - "integrity": "sha512-anseKn98w/d703eWq52uNuZi7GhQeVjTC5/svrBWEKob0WZ5kPdo+EZoFN0sp5a5ubbrk/E0xSl1/M5yORMtpg==", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.0", - "web3-core-helpers": "1.10.0", - "web3-core-method": "1.10.0", - "web3-net": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-net": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.0.tgz", - "integrity": "sha512-NLH/N3IshYWASpxk4/18Ge6n60GEvWBVeM8inx2dmZJVmRI6SJIlUxbL8jySgiTn3MMZlhbdvrGo8fpUW7a1GA==", - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-utils": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-http": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.0.tgz", - "integrity": "sha512-eNr965YB8a9mLiNrkjAWNAPXgmQWfpBfkkn7tpEFlghfww0u3I0tktMZiaToJVcL2+Xq+81cxbkpeWJ5XQDwOA==", - "dependencies": { - "abortcontroller-polyfill": "^1.7.3", - "cross-fetch": "^3.1.4", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ipc": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.0.tgz", - "integrity": "sha512-OfXG1aWN8L1OUqppshzq8YISkWrYHaATW9H8eh0p89TlWMc1KZOL9vttBuaBEi96D/n0eYDn2trzt22bqHWfXA==", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-providers-ws": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.0.tgz", - "integrity": "sha512-sK0fNcglW36yD5xjnjtSGBnEtf59cbw4vZzJ+CmOWIKGIR96mP5l684g0WD0Eo+f4NQc2anWWXG74lRc9OVMCQ==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.0", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-shh": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.0.tgz", - "integrity": "sha512-uNUUuNsO2AjX41GJARV9zJibs11eq6HtOe6Wr0FtRUcj8SN6nHeYIzwstAvJ4fXA53gRqFMTxdntHEt9aXVjpg==", - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.10.0", - "web3-core-method": "1.10.0", - "web3-core-subscriptions": "1.10.0", - "web3-net": "1.10.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@truffle/interface-adapter/node_modules/web3-utils": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.0.tgz", - "integrity": "sha512-kSaCM0uMcZTNUSmn5vMEhlo02RObGNRRCkdX0V9UTAU0+lrvn0HSaudyCo6CQzuXUsnuY2ERJGCGPfeWmv19Rg==", - "dependencies": { - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereumjs-util": "^7.1.0", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@trufflesuite/chromafi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@trufflesuite/chromafi/-/chromafi-3.0.0.tgz", - "integrity": "sha512-oqWcOqn8nT1bwlPPfidfzS55vqcIDdpfzo3HbU9EnUmcSTX+I8z0UyUFI3tZQjByVJulbzxHxUGS3ZJPwK/GPQ==", - "dependencies": { - "camelcase": "^4.1.0", - "chalk": "^2.3.2", - "cheerio": "^1.0.0-rc.2", - "detect-indent": "^5.0.0", - "highlight.js": "^10.4.1", - "lodash.merge": "^4.6.2", - "strip-ansi": "^4.0.0", - "strip-indent": "^2.0.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@trufflesuite/chromafi/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/strip-indent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", - "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@trufflesuite/chromafi/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true - }, - "node_modules/@typechain/ethers-v6": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v6/-/ethers-v6-0.5.1.tgz", - "integrity": "sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.2", - "typescript": ">=4.7.0" - } - }, - "node_modules/@typechain/hardhat": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@typechain/hardhat/-/hardhat-9.1.0.tgz", - "integrity": "sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==", - "dev": true, - "peer": true, - "dependencies": { - "fs-extra": "^9.1.0" - }, - "peerDependencies": { - "@typechain/ethers-v6": "^0.5.1", - "ethers": "^6.1.0", - "hardhat": "^2.9.9", - "typechain": "^8.3.2" - } - }, - "node_modules/@typechain/hardhat/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "peer": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typechain/hardhat/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@typechain/hardhat/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "dev": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/bignumber.js": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@types/bignumber.js/-/bignumber.js-5.0.0.tgz", - "integrity": "sha512-0DH7aPGCClywOFaxxjE6UwpN2kQYe9LwuDQMv+zYA97j5GkOMo8e66LYT+a8JYU7jfmUFRZLa9KycxHDsKXJCA==", - "deprecated": "This is a stub types definition for bignumber.js (https://github.com/MikeMcl/bignumber.js/). bignumber.js provides its own type definitions, so you don't need @types/bignumber.js installed!", - "peer": true, - "dependencies": { - "bignumber.js": "*" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" - } - }, - "node_modules/@types/chai": { - "version": "4.3.14", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.14.tgz", - "integrity": "sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==" - }, - "node_modules/@types/chai-as-promised": { - "version": "7.1.8", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz", - "integrity": "sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==", - "dev": true, - "dependencies": { - "@types/chai": "*" - } - }, - "node_modules/@types/concat-stream": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@types/concat-stream/-/concat-stream-1.6.1.tgz", - "integrity": "sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/debug": { - "version": "4.1.12", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", - "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true - }, - "node_modules/@types/form-data": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-0.0.33.tgz", - "integrity": "sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/fs-extra": { - "version": "9.0.13", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz", - "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dev": true, - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.189", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.189.tgz", - "integrity": "sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==", - "dev": true - }, - "node_modules/@types/lodash.flattendeep": { - "version": "4.4.9", - "resolved": "https://registry.npmjs.org/@types/lodash.flattendeep/-/lodash.flattendeep-4.4.9.tgz", - "integrity": "sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==", - "dev": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@types/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true, - "peer": true - }, - "node_modules/@types/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true - }, - "node_modules/@types/ms": { - "version": "0.7.34", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", - "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", - "dev": true - }, - "node_modules/@types/ndjson": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/ndjson/-/ndjson-2.0.1.tgz", - "integrity": "sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/through": "*" - } - }, - "node_modules/@types/node": { - "version": "16.11.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", - "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==" - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", - "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", - "dev": true, - "peer": true - }, - "node_modules/@types/prompts": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/@types/prompts/-/prompts-2.4.9.tgz", - "integrity": "sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==", - "dev": true, - "dependencies": { - "@types/node": "*", - "kleur": "^3.0.3" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", - "dev": true - }, - "node_modules/@types/qs": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", - "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", - "dev": true, - "peer": true - }, - "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/sinon": { - "version": "10.0.20", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.20.tgz", - "integrity": "sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==", - "dev": true, - "dependencies": { - "@types/sinonjs__fake-timers": "*" - } - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.5.tgz", - "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", - "dev": true - }, - "node_modules/@types/styled-components": { - "version": "5.1.26", - "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.26.tgz", - "integrity": "sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==", - "dev": true, - "dependencies": { - "@types/hoist-non-react-statics": "*", - "@types/react": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/through": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.62.0.tgz", - "integrity": "sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.2.1.tgz", - "integrity": "sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.23.5", - "@babel/plugin-transform-react-jsx-self": "^7.23.3", - "@babel/plugin-transform-react-jsx-source": "^7.23.3", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0" - } - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", - "dev": true, - "peer": true - }, - "node_modules/abitype": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-0.9.10.tgz", - "integrity": "sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/abortcontroller-polyfill": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.5.tgz", - "integrity": "sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "devOptional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "devOptional": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/adm-zip": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", - "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", - "engines": { - "node": ">=0.3.0" - } - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/antlr4ts": { - "version": "0.5.0-alpha.4", - "resolved": "https://registry.npmjs.org/antlr4ts/-/antlr4ts-0.5.0-alpha.4.tgz", - "integrity": "sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-back": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz", - "integrity": "sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", - "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "peer": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", - "dev": true, - "peer": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" - }, - "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dev": true, - "peer": true, - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/babel-plugin-styled-components": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", - "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.22.5", - "lodash": "^4.17.21", - "picomatch": "^2.3.1" - }, - "peerDependencies": { - "styled-components": ">= 2" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/base-x": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", - "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/bcrypt-pbkdf/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/big.js": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", - "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", - "engines": { - "node": "*" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/bigjs" - } - }, - "node_modules/bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==", - "engines": { - "node": "*" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.2.1.tgz", - "integrity": "sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", - "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/body-parser/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs58": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", - "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/bs58check/-/bs58check-2.1.2.tgz", - "integrity": "sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/buffer-to-arraybuffer": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz", - "integrity": "sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==" - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==" - }, - "node_modules/bufferutil": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", - "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bundle-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", - "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", - "dev": true, - "dependencies": { - "run-applescript": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cacheable-lookup": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-6.1.0.tgz", - "integrity": "sha512-KJ/Dmo1lDDhmW2XDPMo+9oiy/CeqosPguPCrgcVzKyZrL6pM1gU2GmPY/xo6OQPTUaA/c0kwHuywB4E6nmT9ww==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-8.0.2.tgz", - "integrity": "sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==", - "dev": true, - "dependencies": { - "camelcase": "^7.0.0", - "map-obj": "^4.3.0", - "quick-lru": "^6.1.1", - "type-fest": "^2.13.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelcase-keys/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", - "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001603", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz", - "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" - }, - "node_modules/cbor": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/cbor/-/cbor-9.0.2.tgz", - "integrity": "sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==", - "dependencies": { - "nofilter": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", - "dev": true, - "dependencies": { - "check-error": "^1.0.2" - }, - "peerDependencies": { - "chai": ">= 2.1.2 < 5" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", - "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", - "dependencies": { - "camel-case": "^3.0.0", - "constant-case": "^2.0.0", - "dot-case": "^2.1.0", - "header-case": "^1.0.0", - "is-lower-case": "^1.1.0", - "is-upper-case": "^1.1.0", - "lower-case": "^1.1.1", - "lower-case-first": "^1.0.0", - "no-case": "^2.3.2", - "param-case": "^2.1.0", - "pascal-case": "^2.0.0", - "path-case": "^2.1.0", - "sentence-case": "^2.1.0", - "snake-case": "^2.1.0", - "swap-case": "^1.1.0", - "title-case": "^2.1.0", - "upper-case": "^1.1.1", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", - "dependencies": { - "get-func-name": "^2.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, - "node_modules/cids": { - "version": "0.7.5", - "resolved": "https://registry.npmjs.org/cids/-/cids-0.7.5.tgz", - "integrity": "sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "buffer": "^5.5.0", - "class-is": "^1.1.0", - "multibase": "~0.6.0", - "multicodec": "^1.0.0", - "multihashes": "~0.4.15" - }, - "engines": { - "node": ">=4.0.0", - "npm": ">=3.0.0" - } - }, - "node_modules/cids/node_modules/multicodec": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-1.0.4.tgz", - "integrity": "sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "buffer": "^5.6.0", - "varint": "^5.0.0" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/class-is": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/class-is/-/class-is-1.1.0.tgz", - "integrity": "sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==" - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", - "dev": true - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-table3": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", - "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", - "dev": true, - "peer": true, - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^2.1.1" - }, - "engines": { - "node": ">=6" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/cli-table3/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "peer": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cli-table3/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colors": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz", - "integrity": "sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-exists": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", - "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz", - "integrity": "sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/command-line-usage": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.3.tgz", - "integrity": "sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/command-line-usage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/command-line-usage/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", - "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/concat-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "peer": true - }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true, - "peer": true - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/constant-case": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", - "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", - "dependencies": { - "snake-case": "^2.1.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-hash": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/content-hash/-/content-hash-2.5.2.tgz", - "integrity": "sha512-FvIQKy0S1JaWV10sMsA7TRx8bpU+pqPkhbsfvOJAdjRXvYxEckAwQWGwtRjiaJfh+E0DvcWUGqcdjwMGFjsSdw==", - "dependencies": { - "cids": "^0.7.1", - "multicodec": "^0.5.5", - "multihashes": "^0.4.15" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/cose-base": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", - "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", - "dev": true, - "dependencies": { - "layout-base": "^1.0.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true - }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/crypto-addr-codec": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", - "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", - "dependencies": { - "base-x": "^3.0.8", - "big-integer": "1.6.36", - "blakejs": "^1.1.0", - "bs58": "^4.0.1", - "ripemd160-min": "0.0.6", - "safe-buffer": "^5.2.0", - "sha3": "^2.1.1" - } - }, - "node_modules/crypto-addr-codec/node_modules/big-integer": { - "version": "1.6.36", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.36.tgz", - "integrity": "sha512-t70bfa7HYEA1D9idDbmuv7YbsbVkQ+Hp+8KFSul4aE5e/i1bjCNIRYJZlA8Q8p0r9T8cF/RVvwUgRA//FydEyg==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/crypto-random-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", - "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", - "dev": true, - "dependencies": { - "type-fest": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-random-string/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", - "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", - "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", - "dev": true, - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true - }, - "node_modules/cytoscape": { - "version": "3.28.1", - "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.28.1.tgz", - "integrity": "sha512-xyItz4O/4zp9/239wCcH8ZcFuuZooEeF8KHRmzjDfGdXsj3OG9MFSMA0pJE0uX3uCN/ygof6hHf4L7lst+JaDg==", - "dev": true, - "dependencies": { - "heap": "^0.2.6", - "lodash": "^4.17.21" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/cytoscape-cose-bilkent": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", - "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", - "dev": true, - "dependencies": { - "cose-base": "^1.0.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", - "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", - "dev": true, - "dependencies": { - "cose-base": "^2.2.0" - }, - "peerDependencies": { - "cytoscape": "^3.2.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/cose-base": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", - "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", - "dev": true, - "dependencies": { - "layout-base": "^2.0.0" - } - }, - "node_modules/cytoscape-fcose/node_modules/layout-base": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", - "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", - "dev": true - }, - "node_modules/d": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.2.tgz", - "integrity": "sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==", - "dependencies": { - "es5-ext": "^0.10.64", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "dev": true, - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dev": true, - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "dev": true, - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "dev": true, - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dev": true, - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dev": true, - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/d3-dsv/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "dev": true, - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "dev": true, - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dev": true, - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dev": true, - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dev": true, - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dev": true, - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "dev": true, - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "dev": true, - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/dagre-d3-es": { - "version": "7.0.10", - "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", - "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", - "dev": true, - "dependencies": { - "d3": "^7.8.2", - "lodash-es": "^4.17.21" - } - }, - "node_modules/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", - "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", - "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", - "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==", - "dev": true - }, - "node_modules/death": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/death/-/death-1.1.0.tgz", - "integrity": "sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==", - "dev": true, - "peer": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", - "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/default-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", - "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", - "dev": true, - "dependencies": { - "bundle-name": "^3.0.0", - "default-browser-id": "^3.0.0", - "execa": "^7.1.1", - "titleize": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delaunator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", - "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", - "dev": true, - "dependencies": { - "robust-predicates": "^3.0.2" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", - "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/difflib": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/difflib/-/difflib-0.2.4.tgz", - "integrity": "sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==", - "dev": true, - "peer": true, - "dependencies": { - "heap": ">= 0.2.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==", - "dev": true - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", - "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.723", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", - "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==", - "dev": true - }, - "node_modules/elkjs": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", - "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.16.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", - "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "engines": { - "node": ">=6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", - "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-ext": { - "version": "0.10.64", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.64.tgz", - "integrity": "sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg==", - "hasInstallScript": true, - "dependencies": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "esniff": "^2.0.1", - "next-tick": "^1.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "node_modules/es6-symbol": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.4.tgz", - "integrity": "sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==", - "dependencies": { - "d": "^1.0.2", - "ext": "^1.7.0" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/esbuild": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", - "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.15.18", - "@esbuild/linux-loong64": "0.15.18", - "esbuild-android-64": "0.15.18", - "esbuild-android-arm64": "0.15.18", - "esbuild-darwin-64": "0.15.18", - "esbuild-darwin-arm64": "0.15.18", - "esbuild-freebsd-64": "0.15.18", - "esbuild-freebsd-arm64": "0.15.18", - "esbuild-linux-32": "0.15.18", - "esbuild-linux-64": "0.15.18", - "esbuild-linux-arm": "0.15.18", - "esbuild-linux-arm64": "0.15.18", - "esbuild-linux-mips64le": "0.15.18", - "esbuild-linux-ppc64le": "0.15.18", - "esbuild-linux-riscv64": "0.15.18", - "esbuild-linux-s390x": "0.15.18", - "esbuild-netbsd-64": "0.15.18", - "esbuild-openbsd-64": "0.15.18", - "esbuild-sunos-64": "0.15.18", - "esbuild-windows-32": "0.15.18", - "esbuild-windows-64": "0.15.18", - "esbuild-windows-arm64": "0.15.18" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", - "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", - "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", - "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", - "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", - "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", - "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", - "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", - "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", - "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", - "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", - "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", - "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", - "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", - "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", - "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", - "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", - "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", - "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", - "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.18", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", - "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", - "dev": true, - "peer": true, - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "peer": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "peer": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz", - "integrity": "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-mocha": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-9.0.0.tgz", - "integrity": "sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==", - "dev": true, - "dependencies": { - "eslint-utils": "^3.0.0", - "ramda": "^0.27.1" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-no-only-tests": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.1.0.tgz", - "integrity": "sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==", - "dev": true, - "engines": { - "node": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz", - "integrity": "sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.3.5.tgz", - "integrity": "sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==", - "dev": true, - "peerDependencies": { - "eslint": ">=7" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esniff": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/esniff/-/esniff-2.0.1.tgz", - "integrity": "sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.62", - "event-emitter": "^0.3.5", - "type": "^2.7.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eth-ens-namehash": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/eth-ens-namehash/-/eth-ens-namehash-2.0.8.tgz", - "integrity": "sha512-VWEI1+KJfz4Km//dadyvBBoBeSQ0MHTXPvr8UIXiLW6IanxvAV+DmlZAijZwAyggqGUfwQBeHf7tc9wzc1piSw==", - "dependencies": { - "idna-uts46-hx": "^2.3.1", - "js-sha3": "^0.5.7" - } - }, - "node_modules/eth-ens-namehash/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/eth-gas-reporter": { - "version": "0.2.27", - "resolved": "https://registry.npmjs.org/eth-gas-reporter/-/eth-gas-reporter-0.2.27.tgz", - "integrity": "sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==", - "dev": true, - "peer": true, - "dependencies": { - "@solidity-parser/parser": "^0.14.0", - "axios": "^1.5.1", - "cli-table3": "^0.5.0", - "colors": "1.4.0", - "ethereum-cryptography": "^1.0.3", - "ethers": "^5.7.2", - "fs-readdir-recursive": "^1.1.0", - "lodash": "^4.17.14", - "markdown-table": "^1.1.3", - "mocha": "^10.2.0", - "req-cwd": "^2.0.0", - "sha1": "^1.1.1", - "sync-request": "^6.0.0" - }, - "peerDependencies": { - "@codechecks/client": "^0.1.0" - }, - "peerDependenciesMeta": { - "@codechecks/client": { - "optional": true - } - } - }, - "node_modules/eth-gas-reporter/node_modules/@ethersproject/address": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "peer": true, - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/keccak256": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "@ethersproject/rlp": "^5.7.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/@solidity-parser/parser": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.14.5.tgz", - "integrity": "sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==", - "dev": true, - "peer": true, - "dependencies": { - "antlr4ts": "^0.5.0-alpha.4" - } - }, - "node_modules/eth-gas-reporter/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eth-gas-reporter/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/eth-gas-reporter/node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/eth-gas-reporter/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dev": true, - "peer": true, - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/eth-gas-reporter/node_modules/ethers": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", - "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "peer": true, - "dependencies": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/eth-gas-reporter/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/eth-gas-reporter/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/eth-gas-reporter/node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/eth-gas-reporter/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, - "node_modules/eth-gas-reporter/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/eth-gas-reporter/node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true, - "peer": true - }, - "node_modules/eth-lib": { - "version": "0.1.29", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.1.29.tgz", - "integrity": "sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "nano-json-stream-parser": "^0.1.2", - "servify": "^0.1.12", - "ws": "^3.0.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/eth-lib/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/eth-lib/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/eth-lib/node_modules/ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dependencies": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - }, - "node_modules/ethereum-bloom-filters": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.10.tgz", - "integrity": "sha512-rxJ5OFN3RwjQxDcFP2Z5+Q9ho4eIdEmSc2ht0fCu8Se9nbXjZ7/031uXoUYJ87KHCOdVeiUuwSnoS7hmYAGVHA==", - "dependencies": { - "js-sha3": "^0.8.0" - } - }, - "node_modules/ethereum-cryptography": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz", - "integrity": "sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==", - "dependencies": { - "@types/pbkdf2": "^3.0.0", - "@types/secp256k1": "^4.0.1", - "blakejs": "^1.1.0", - "browserify-aes": "^1.2.0", - "bs58check": "^2.1.2", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "hash.js": "^1.1.7", - "keccak": "^3.0.0", - "pbkdf2": "^3.0.17", - "randombytes": "^2.1.0", - "safe-buffer": "^5.1.2", - "scrypt-js": "^3.0.0", - "secp256k1": "^4.0.1", - "setimmediate": "^1.0.5" - } - }, - "node_modules/ethereum-ens": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/ethereum-ens/-/ethereum-ens-0.8.0.tgz", - "integrity": "sha512-a8cBTF4AWw1Q1Y37V1LSCS9pRY4Mh3f8vCg5cbXCCEJ3eno1hbI/+Ccv9SZLISYpqQhaglP3Bxb/34lS4Qf7Bg==", - "dependencies": { - "bluebird": "^3.4.7", - "eth-ens-namehash": "^2.0.0", - "js-sha3": "^0.5.7", - "pako": "^1.0.4", - "underscore": "^1.8.3", - "web3": "^1.0.0-beta.34" - } - }, - "node_modules/ethereum-ens/node_modules/js-sha3": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.5.7.tgz", - "integrity": "sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==" - }, - "node_modules/ethereumjs-abi": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.8.tgz", - "integrity": "sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==", - "dependencies": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - } - }, - "node_modules/ethereumjs-abi/node_modules/@types/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz", - "integrity": "sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==", - "dependencies": { - "@types/bn.js": "^4.11.3", - "bn.js": "^4.11.0", - "create-hash": "^1.1.2", - "elliptic": "^6.5.2", - "ethereum-cryptography": "^0.1.3", - "ethjs-util": "0.1.6", - "rlp": "^2.2.3" - } - }, - "node_modules/ethereumjs-util": { - "version": "7.1.5", - "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz", - "integrity": "sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==", - "dependencies": { - "@types/bn.js": "^5.1.0", - "bn.js": "^5.1.2", - "create-hash": "^1.1.2", - "ethereum-cryptography": "^0.1.3", - "rlp": "^2.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/ethers": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.11.1.tgz", - "integrity": "sha512-mxTAE6wqJQAbp5QAe/+o+rXOID7Nw91OZXvgpjDa1r4fAbq2Nu314oEZSbjoRLacuCzs7kUC3clEvkCQowffGg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ethers/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/ethjs-unit": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", - "integrity": "sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==", - "dependencies": { - "bn.js": "4.11.6", - "number-to-bn": "1.7.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/ethjs-unit/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - }, - "node_modules/ethjs-util": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", - "integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==", - "dependencies": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "node_modules/eventemitter3": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", - "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/express/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dependencies": { - "type": "^2.7.2" - } - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "engines": [ - "node >=0.6.0" - ] - }, - "node_modules/fast-check": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-3.1.1.tgz", - "integrity": "sha512-3vtXinVyuUKCKFKYcwXhGE6NtGWkqF8Yh3rvMZNzmwz8EPrgoc/v4pDdLHyLnCyCI5MZpZZkDEwFyXyEONOxpA==", - "dependencies": { - "pure-rand": "^5.0.1" - }, - "engines": { - "node": ">=8.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/file-type": { - "version": "18.7.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-18.7.0.tgz", - "integrity": "sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==", - "dev": true, - "dependencies": { - "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0", - "token-types": "^5.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz", - "integrity": "sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dev": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data-encoder": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", - "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fp-ts": { - "version": "1.19.3", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-1.19.3.tgz", - "integrity": "sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==" - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs-minipass": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", - "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", - "dependencies": { - "minipass": "^2.6.0" - } - }, - "node_modules/fs-readdir-recursive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true, - "peer": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "engines": { - "node": "*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-port": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", - "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/get-stdin": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", - "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", - "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/ghost-testrpc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ghost-testrpc/-/ghost-testrpc-0.0.2.tgz", - "integrity": "sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^2.4.2", - "node-emoji": "^1.10.0" - }, - "bin": { - "testrpc-sc": "index.js" - } - }, - "node_modules/ghost-testrpc/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ghost-testrpc/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/ghost-testrpc/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ghost-testrpc/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/ghost-testrpc/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, - "node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "peer": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "peer": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/got": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-12.1.0.tgz", - "integrity": "sha512-hBv2ty9QN2RdbJJMK3hesmSkFTjVIHyIDDbssCKnSmq62edGgImJWD10Eb1k77TiV1bxloxqcFAVK8+9pkhOig==", - "dependencies": { - "@sindresorhus/is": "^4.6.0", - "@szmarczak/http-timer": "^5.0.1", - "@types/cacheable-request": "^6.0.2", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^6.0.4", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "form-data-encoder": "1.7.1", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, - "engines": { - "node": ">=4.x" - } - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "peer": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", - "engines": { - "node": ">=4" - } - }, - "node_modules/har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/hardhat": { - "version": "2.22.2", - "resolved": "https://registry.npmjs.org/hardhat/-/hardhat-2.22.2.tgz", - "integrity": "sha512-0xZ7MdCZ5sJem4MrvpQWLR3R3zGDoHw5lsR+pBFimqwagimIOn3bWuZv69KA+veXClwI1s/zpqgwPwiFrd4Dxw==", - "dependencies": { - "@ethersproject/abi": "^5.1.2", - "@metamask/eth-sig-util": "^4.0.0", - "@nomicfoundation/edr": "^0.3.1", - "@nomicfoundation/ethereumjs-common": "4.0.4", - "@nomicfoundation/ethereumjs-tx": "5.0.4", - "@nomicfoundation/ethereumjs-util": "9.0.4", - "@nomicfoundation/solidity-analyzer": "^0.1.0", - "@sentry/node": "^5.18.1", - "@types/bn.js": "^5.1.0", - "@types/lru-cache": "^5.1.0", - "adm-zip": "^0.4.16", - "aggregate-error": "^3.0.0", - "ansi-escapes": "^4.3.0", - "boxen": "^5.1.2", - "chalk": "^2.4.2", - "chokidar": "^3.4.0", - "ci-info": "^2.0.0", - "debug": "^4.1.1", - "enquirer": "^2.3.0", - "env-paths": "^2.2.0", - "ethereum-cryptography": "^1.0.3", - "ethereumjs-abi": "^0.6.8", - "find-up": "^2.1.0", - "fp-ts": "1.19.3", - "fs-extra": "^7.0.1", - "glob": "7.2.0", - "immutable": "^4.0.0-rc.12", - "io-ts": "1.10.4", - "keccak": "^3.0.2", - "lodash": "^4.17.11", - "mnemonist": "^0.38.0", - "mocha": "^10.0.0", - "p-map": "^4.0.0", - "raw-body": "^2.4.1", - "resolve": "1.17.0", - "semver": "^6.3.0", - "solc": "0.7.3", - "source-map-support": "^0.5.13", - "stacktrace-parser": "^0.1.10", - "tsort": "0.0.1", - "undici": "^5.14.0", - "uuid": "^8.3.2", - "ws": "^7.4.6" - }, - "bin": { - "hardhat": "internal/cli/bootstrap.js" - }, - "peerDependencies": { - "ts-node": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "ts-node": { - "optional": true - }, - "typescript": { - "optional": true - } - } - }, - "node_modules/hardhat-gas-reporter": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/hardhat-gas-reporter/-/hardhat-gas-reporter-1.0.10.tgz", - "integrity": "sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==", - "dev": true, - "peer": true, - "dependencies": { - "array-uniq": "1.0.3", - "eth-gas-reporter": "^0.2.25", - "sha1": "^1.1.1" - }, - "peerDependencies": { - "hardhat": "^2.0.2" - } - }, - "node_modules/hardhat/node_modules/@noble/hashes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.2.0.tgz", - "integrity": "sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ] - }, - "node_modules/hardhat/node_modules/@scure/bip32": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.1.5.tgz", - "integrity": "sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@noble/secp256k1": "~1.7.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/hardhat/node_modules/@scure/bip39": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz", - "integrity": "sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "@noble/hashes": "~1.2.0", - "@scure/base": "~1.1.0" - } - }, - "node_modules/hardhat/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/hardhat/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/hardhat/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/hardhat/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/hardhat/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/hardhat/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/hardhat/node_modules/ethereum-cryptography": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-1.2.0.tgz", - "integrity": "sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==", - "dependencies": { - "@noble/hashes": "1.2.0", - "@noble/secp256k1": "1.7.1", - "@scure/bip32": "1.1.5", - "@scure/bip39": "1.1.1" - } - }, - "node_modules/hardhat/node_modules/find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", - "dependencies": { - "locate-path": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hardhat/node_modules/locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", - "dependencies": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/hardhat/node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "engines": { - "node": ">=8" - } - }, - "node_modules/hardhat/node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/hardhat/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/hardhat/node_modules/p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dependencies": { - "p-try": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", - "dependencies": { - "p-limit": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/resolve": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", - "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", - "dependencies": { - "path-parse": "^1.0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hardhat/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/hardhat/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/hardhat/node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==" - }, - "node_modules/hardhat/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-test-vectors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/hash-test-vectors/-/hash-test-vectors-1.3.2.tgz", - "integrity": "sha512-PKd/fitmsrlWGh3OpKbgNLE04ZQZsvs1ZkuLoQpeIKuwx+6CYVNdW6LaPIS1QAdZvV40+skk0w4YomKnViUnvQ==" - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, - "node_modules/header-case": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", - "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.3" - } - }, - "node_modules/heap": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", - "dev": true - }, - "node_modules/highlight.js": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", - "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", - "engines": { - "node": "*" - } - }, - "node_modules/highlightjs-solidity": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/highlightjs-solidity/-/highlightjs-solidity-2.0.6.tgz", - "integrity": "sha512-DySXWfQghjm2l6a/flF+cteroJqD4gI8GSdL4PtvxZSsAHie8m3yVe2JFoRg03ROKT6hp2Lc/BxXkqerNmtQYg==" - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dev": true, - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", - "dev": true, - "dependencies": { - "lru-cache": "^7.5.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-basic": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/http-basic/-/http-basic-8.1.3.tgz", - "integrity": "sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==", - "dev": true, - "peer": true, - "dependencies": { - "caseless": "^0.12.0", - "concat-stream": "^1.6.2", - "http-response-object": "^3.0.1", - "parse-cache-control": "^1.0.1" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-https": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/http-https/-/http-https-1.0.0.tgz", - "integrity": "sha512-o0PWwVCSp3O0wS6FvNr6xfBCHgt0m1tvPLFOCc2iFDKTRAXhB7m8klDf7ErowFH8POa6dVdGatKU5I1YYwzUyg==" - }, - "node_modules/http-response-object": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", - "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "^10.0.3" - } - }, - "node_modules/http-response-object/node_modules/@types/node": { - "version": "10.17.60", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", - "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==", - "dev": true, - "peer": true - }, - "node_modules/http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/http2-wrapper": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", - "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.2.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/idna-uts46-hx": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/idna-uts46-hx/-/idna-uts46-hx-2.3.1.tgz", - "integrity": "sha512-PWoF9Keq6laYdIRwwCdhTPl60xRqAloYNMQLiyUnG42VjT53oW07BXIRM+NK7eQjzXjAk2gUvX9caRxlnF9TAA==", - "dependencies": { - "punycode": "2.1.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/idna-uts46-hx/node_modules/punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha512-Yxz2kRwT90aPiWEMHVYnEf4+rhwF1tBmmZ4KepCP+Wkium9JxtWnUm1nqGwpiAHr/tnTSeHqr3wb++jgSkXjhA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/immer": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.2.tgz", - "integrity": "sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==" - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "peer": true - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/internmap": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/io-ts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/io-ts/-/io-ts-1.10.4.tgz", - "integrity": "sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==", - "dependencies": { - "fp-ts": "^1.0.0" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", - "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", - "dev": true, - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz", - "integrity": "sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==", - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dev": true, - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-lower-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", - "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", - "dependencies": { - "lower-case": "^1.1.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", - "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", - "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-upper-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", - "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", - "dependencies": { - "upper-case": "^1.1.0" - } - }, - "node_modules/is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-wsl/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isows": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/isows/-/isows-1.0.3.tgz", - "integrity": "sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wagmi-dev" - } - ], - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", - "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", - "dev": true, - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/jsprim": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", - "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/just-extend": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", - "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", - "dev": true - }, - "node_modules/keccak": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/keccak/-/keccak-3.0.4.tgz", - "integrity": "sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/khroma": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", - "optionalDependencies": { - "graceful-fs": "^4.1.9" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/layout-base": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", - "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", - "dev": true - }, - "node_modules/lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dependencies": { - "invert-kv": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dependencies": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/load-json-file/node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true - }, - "node_modules/lodash.assign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true, - "peer": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==", - "peer": true - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "dev": true - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" - }, - "node_modules/lower-case-first": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", - "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", - "dependencies": { - "lower-case": "^1.1.2" - } - }, - "node_modules/lowercase-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", - "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true - }, - "node_modules/map-obj": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", - "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/markdown-table": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", - "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", - "dev": true, - "peer": true - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/meow": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-11.0.0.tgz", - "integrity": "sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.2", - "camelcase-keys": "^8.0.2", - "decamelize": "^6.0.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^4.0.1", - "read-pkg-up": "^9.1.0", - "redent": "^4.0.0", - "trim-newlines": "^4.0.2", - "type-fest": "^3.1.0", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/decamelize": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.0.tgz", - "integrity": "sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", - "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/mermaid": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.1.0.tgz", - "integrity": "sha512-LYekSMNJygI1VnMizAPUddY95hZxOjwZxr7pODczILInO0dhQKuhXeu4sargtnuTwCilSuLS7Uiq/Qn7HTVrmA==", - "dev": true, - "dependencies": { - "@braintree/sanitize-url": "^6.0.0", - "@khanacademy/simple-markdown": "^0.8.6", - "cytoscape": "^3.23.0", - "cytoscape-cose-bilkent": "^4.1.0", - "cytoscape-fcose": "^2.1.0", - "d3": "^7.4.0", - "dagre-d3-es": "7.0.10", - "dayjs": "^1.11.7", - "dompurify": "2.4.5", - "elkjs": "^0.8.2", - "khroma": "^2.0.0", - "lodash-es": "^4.17.21", - "non-layered-tidy-tree-layout": "^2.0.2", - "stylis": "^4.1.2", - "ts-dedent": "^2.2.0", - "uuid": "^9.0.0", - "web-worker": "^1.2.0" - } - }, - "node_modules/mermaid/node_modules/@khanacademy/simple-markdown": { - "version": "0.8.6", - "resolved": "https://registry.npmjs.org/@khanacademy/simple-markdown/-/simple-markdown-0.8.6.tgz", - "integrity": "sha512-mAUlR9lchzfqunR89pFvNI51jQKsMpJeWYsYWw0DQcUXczn/T/V6510utgvm7X0N3zN87j1SvuKk8cMbl9IAFw==", - "dev": true, - "dependencies": { - "@types/react": ">=16.0.0" - }, - "peerDependencies": { - "react": "16.14.0", - "react-dom": "16.14.0" - } - }, - "node_modules/mermaid/node_modules/react": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.14.0.tgz", - "integrity": "sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mermaid/node_modules/react-dom": { - "version": "16.14.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.14.0.tgz", - "integrity": "sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1", - "prop-types": "^15.6.2", - "scheduler": "^0.19.1" - }, - "peerDependencies": { - "react": "^16.14.0" - } - }, - "node_modules/mermaid/node_modules/scheduler": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", - "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/mermaid/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micro-ftch": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/micro-ftch/-/micro-ftch-0.3.1.tgz", - "integrity": "sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==" - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/minipass": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", - "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", - "dependencies": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "node_modules/minizlib": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", - "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", - "dependencies": { - "minipass": "^2.9.0" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/mkdirp-promise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", - "integrity": "sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==", - "deprecated": "This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.", - "dependencies": { - "mkdirp": "*" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mnemonist": { - "version": "0.38.5", - "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.5.tgz", - "integrity": "sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==", - "dependencies": { - "obliterator": "^2.0.0" - } - }, - "node_modules/mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "dependencies": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mocha/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/mock-fs": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/mock-fs/-/mock-fs-4.14.0.tgz", - "integrity": "sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==" - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/multibase": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.6.1.tgz", - "integrity": "sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/multicodec": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/multicodec/-/multicodec-0.5.7.tgz", - "integrity": "sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "varint": "^5.0.0" - } - }, - "node_modules/multihashes": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/multihashes/-/multihashes-0.4.21.tgz", - "integrity": "sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==", - "dependencies": { - "buffer": "^5.5.0", - "multibase": "^0.7.0", - "varint": "^5.0.0" - } - }, - "node_modules/multihashes/node_modules/multibase": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/multibase/-/multibase-0.7.0.tgz", - "integrity": "sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==", - "deprecated": "This module has been superseded by the multiformats module", - "dependencies": { - "base-x": "^3.0.8", - "buffer": "^5.5.0" - } - }, - "node_modules/nano-base32": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nano-base32/-/nano-base32-1.0.1.tgz", - "integrity": "sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==" - }, - "node_modules/nano-json-stream-parser": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/nano-json-stream-parser/-/nano-json-stream-parser-0.1.2.tgz", - "integrity": "sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==" - }, - "node_modules/nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/ndjson": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-2.0.0.tgz", - "integrity": "sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==", - "dependencies": { - "json-stringify-safe": "^5.0.1", - "minimist": "^1.2.5", - "readable-stream": "^3.6.0", - "split2": "^3.0.0", - "through2": "^4.0.0" - }, - "bin": { - "ndjson": "cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node_modules/nise": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", - "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0", - "@sinonjs/fake-timers": "^11.2.2", - "@sinonjs/text-encoding": "^0.7.2", - "just-extend": "^6.2.0", - "path-to-regexp": "^6.2.1" - } - }, - "node_modules/nise/node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", - "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==" - }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "dev": true, - "peer": true, - "dependencies": { - "lodash": "^4.17.21" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", - "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true - }, - "node_modules/nofilter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", - "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", - "engines": { - "node": ">=12.19" - } - }, - "node_modules/non-layered-tidy-tree-layout": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", - "dev": true - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", - "dev": true, - "peer": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", - "dev": true, - "dependencies": { - "hosted-git-info": "^5.0.0", - "is-core-module": "^2.8.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-to-bn": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/number-to-bn/-/number-to-bn-1.7.0.tgz", - "integrity": "sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==", - "dependencies": { - "bn.js": "4.11.6", - "strip-hex-prefix": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/number-to-bn/node_modules/bn.js": { - "version": "4.11.6", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.6.tgz", - "integrity": "sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==" - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/nyc/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/nyc/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nyc/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/nyc/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "engines": { - "node": "*" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", - "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", - "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.values": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", - "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obliterator": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/obliterator/-/obliterator-2.0.4.tgz", - "integrity": "sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==" - }, - "node_modules/oboe": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/oboe/-/oboe-2.1.5.tgz", - "integrity": "sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==", - "dependencies": { - "http-https": "^1.0.0" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", - "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", - "dev": true, - "dependencies": { - "default-browser": "^4.0.0", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open-cli": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/open-cli/-/open-cli-7.2.0.tgz", - "integrity": "sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==", - "dev": true, - "dependencies": { - "file-type": "^18.2.1", - "get-stdin": "^9.0.0", - "meow": "^11.0.0", - "open": "^9.0.0", - "tempy": "^3.0.0" - }, - "bin": { - "open-cli": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/ordinal": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ordinal/-/ordinal-1.0.3.tgz", - "integrity": "sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==", - "dev": true, - "peer": true - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-cancelable": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", - "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", - "engines": { - "node": ">=12.20" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true, - "peer": true - }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", - "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", - "dependencies": { - "camel-case": "^3.0.0", - "upper-case-first": "^1.1.0" - } - }, - "node_modules/path-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", - "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/peek-readable": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0.tgz", - "integrity": "sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-solidity": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/prettier-plugin-solidity/-/prettier-plugin-solidity-1.1.3.tgz", - "integrity": "sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==", - "dev": true, - "dependencies": { - "@solidity-parser/parser": "^0.16.0", - "semver": "^7.3.8", - "solidity-comments-extractor": "^0.0.7" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "prettier": ">=2.3.0 || >=3.0.0-alpha.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "peer": true - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "dev": true, - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "peer": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, - "peer": true - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true, - "peer": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/pure-rand": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-5.0.5.tgz", - "integrity": "sha512-BwQpbqxSCBJVpamI6ydzcKqyFmnd5msMWUGvzXLm1aXvusbbgkbOto/EUPM00hjveJEaJtdbhUjKSzWRhQVkaw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ] - }, - "node_modules/qs": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.0.tgz", - "integrity": "sha512-trVZiI6RMOkO476zLGaBIzszOdFPnCCXHPG9kn0yuS1uz6xdVxPfZdB3vUig9pxPFDM9BRAgz/YUIVQ1/vuiUg==", - "dev": true, - "peer": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", - "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", - "dependencies": { - "decode-uri-component": "^0.2.0", - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/quick-lru": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz", - "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ramda": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", - "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", - "dev": true - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", - "dev": true, - "peer": true - }, - "node_modules/react-refresh": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", - "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.0.tgz", - "integrity": "sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==", - "dev": true, - "dependencies": { - "@remix-run/router": "1.6.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/react-router-dom": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.0.tgz", - "integrity": "sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==", - "dev": true, - "dependencies": { - "@remix-run/router": "1.6.0", - "react-router": "6.11.0" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": ">=16.8", - "react-dom": ">=16.8" - } - }, - "node_modules/react-tooltip": { - "version": "5.26.3", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.26.3.tgz", - "integrity": "sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==", - "dev": true, - "dependencies": { - "@floating-ui/dom": "^1.6.1", - "classnames": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/read-pkg": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-7.1.0.tgz", - "integrity": "sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.1", - "normalize-package-data": "^3.0.2", - "parse-json": "^5.2.0", - "type-fest": "^2.0.0" - }, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-9.1.0.tgz", - "integrity": "sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==", - "dev": true, - "dependencies": { - "find-up": "^6.3.0", - "read-pkg": "^7.1.0", - "type-fest": "^2.5.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dev": true, - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "peer": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/recursive-readdir": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", - "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", - "dev": true, - "peer": true, - "dependencies": { - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/redent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", - "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", - "dev": true, - "dependencies": { - "indent-string": "^5.0.0", - "strip-indent": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/redent/node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz", - "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-cwd/-/req-cwd-2.0.0.tgz", - "integrity": "sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==", - "dev": true, - "peer": true, - "dependencies": { - "req-from": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/req-from/-/req-from-2.0.0.tgz", - "integrity": "sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==", - "dev": true, - "peer": true, - "dependencies": { - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/req-from/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/request/node_modules/qs": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", - "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/request/node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/responselike/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/ripemd160-min": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/ripemd160-min/-/ripemd160-min-0.0.6.tgz", - "integrity": "sha512-+GcJgQivhs6S9qvLogusiTcS9kQUfgR75whKuy5jIhuiOfQuJ8fjqxV6EGD5duH1Y/FawFUMtMhyeq3Fbnib8A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/rlp/-/rlp-2.2.7.tgz", - "integrity": "sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/robust-predicates": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", - "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", - "dev": true - }, - "node_modules/rollup": { - "version": "4.13.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", - "integrity": "sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.13.2", - "@rollup/rollup-android-arm64": "4.13.2", - "@rollup/rollup-darwin-arm64": "4.13.2", - "@rollup/rollup-darwin-x64": "4.13.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.13.2", - "@rollup/rollup-linux-arm64-gnu": "4.13.2", - "@rollup/rollup-linux-arm64-musl": "4.13.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.13.2", - "@rollup/rollup-linux-riscv64-gnu": "4.13.2", - "@rollup/rollup-linux-s390x-gnu": "4.13.2", - "@rollup/rollup-linux-x64-gnu": "4.13.2", - "@rollup/rollup-linux-x64-musl": "4.13.2", - "@rollup/rollup-win32-arm64-msvc": "4.13.2", - "@rollup/rollup-win32-ia32-msvc": "4.13.2", - "@rollup/rollup-win32-x64-msvc": "4.13.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/run-applescript": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", - "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", - "dev": true, - "dependencies": { - "execa": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/run-applescript/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/run-applescript/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/run-applescript/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/run-applescript/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-applescript/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "dev": true - }, - "node_modules/safe-array-concat": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", - "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", - "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sc-istanbul": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/sc-istanbul/-/sc-istanbul-0.4.6.tgz", - "integrity": "sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==", - "dev": true, - "peer": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" - } - }, - "node_modules/sc-istanbul/node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==", - "dev": true, - "peer": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sc-istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/sc-istanbul/node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "peer": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sc-istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==", - "dev": true, - "peer": true - }, - "node_modules/sc-istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/sc-istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "peer": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dev": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", - "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", - "hasInstallScript": true, - "dependencies": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/sentence-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", - "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case-first": "^1.1.2" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/servify": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/servify/-/servify-0.1.12.tgz", - "integrity": "sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==", - "dependencies": { - "body-parser": "^1.16.0", - "cors": "^2.8.1", - "express": "^4.14.0", - "request": "^2.79.0", - "xhr": "^2.3.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/sha1": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/sha1/-/sha1-1.1.1.tgz", - "integrity": "sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==", - "dev": true, - "peer": true, - "dependencies": { - "charenc": ">= 0.0.1", - "crypt": ">= 0.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/sha3": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/sha3/-/sha3-2.1.4.tgz", - "integrity": "sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/sha3/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/shallowequal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", - "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "dev": true - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", - "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", - "dev": true, - "peer": true, - "dependencies": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - }, - "bin": { - "shjs": "bin/shjs" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/simple-get": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.2.tgz", - "integrity": "sha512-Ijd/rV5o+mSBBs4F/x9oDPtTx9Zb6X9brmnXvMW4J7IR15ngi9q5xxqWBKU744jTZiaXtxaPL7uHG6vtN8kUkw==", - "dependencies": { - "decompress-response": "^3.3.0", - "once": "^1.3.1", - "simple-concat": "^1.0.0" - } - }, - "node_modules/simple-get/node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sinon": { - "version": "14.0.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz", - "integrity": "sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==", - "deprecated": "16.1.1", - "dev": true, - "dependencies": { - "@sinonjs/commons": "^2.0.0", - "@sinonjs/fake-timers": "^9.1.2", - "@sinonjs/samsam": "^7.0.1", - "diff": "^5.0.0", - "nise": "^5.1.2", - "supports-color": "^7.2.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/sinon" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "peer": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/snake-case": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", - "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/solc": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/solc/-/solc-0.7.3.tgz", - "integrity": "sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==", - "dependencies": { - "command-exists": "^1.2.8", - "commander": "3.0.2", - "follow-redirects": "^1.12.1", - "fs-extra": "^0.30.0", - "js-sha3": "0.8.0", - "memorystream": "^0.3.1", - "require-from-string": "^2.0.0", - "semver": "^5.5.0", - "tmp": "0.0.33" - }, - "bin": { - "solcjs": "solcjs" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/solc/node_modules/fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" - } - }, - "node_modules/solc/node_modules/jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/solc/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/solc/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/solidity-comments-extractor": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/solidity-comments-extractor/-/solidity-comments-extractor-0.0.7.tgz", - "integrity": "sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==", - "dev": true - }, - "node_modules/solidity-coverage": { - "version": "0.8.11", - "resolved": "https://registry.npmjs.org/solidity-coverage/-/solidity-coverage-0.8.11.tgz", - "integrity": "sha512-yy0Yk+olovBbXn0Me8BWULmmv7A69ZKkP5aTOJGOO8u61Tu2zS989erfjtFlUjDnfWtxRAVkd8BsQD704yLWHw==", - "dev": true, - "peer": true, - "dependencies": { - "@ethersproject/abi": "^5.0.9", - "@solidity-parser/parser": "^0.18.0", - "chalk": "^2.4.2", - "death": "^1.1.0", - "difflib": "^0.2.4", - "fs-extra": "^8.1.0", - "ghost-testrpc": "^0.0.2", - "global-modules": "^2.0.0", - "globby": "^10.0.1", - "jsonschema": "^1.2.4", - "lodash": "^4.17.15", - "mocha": "^10.2.0", - "node-emoji": "^1.10.0", - "pify": "^4.0.1", - "recursive-readdir": "^2.2.2", - "sc-istanbul": "^0.4.5", - "semver": "^7.3.4", - "shelljs": "^0.8.3", - "web3-utils": "^1.3.6" - }, - "bin": { - "solidity-coverage": "plugins/bin.js" - }, - "peerDependencies": { - "hardhat": "^2.11.0" - } - }, - "node_modules/solidity-coverage/node_modules/@solidity-parser/parser": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@solidity-parser/parser/-/parser-0.18.0.tgz", - "integrity": "sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/solidity-coverage/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "peer": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/solidity-coverage/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/chalk/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/solidity-coverage/node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "peer": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/solidity-coverage/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "peer": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/solidity-coverage/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/solidity-coverage/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "peer": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/solidity-coverage/node_modules/globby": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", - "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/solidity-coverage/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/solidity-coverage/node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", - "dev": true, - "peer": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/solidity-coverage/node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/solidity-coverage/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "peer": true - }, - "node_modules/solidity-coverage/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/supports-color/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/solidity-coverage/node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true, - "peer": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", - "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.17.tgz", - "integrity": "sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==" - }, - "node_modules/split2": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", - "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", - "dependencies": { - "readable-stream": "^3.0.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sshpk/node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==", - "dev": true, - "peer": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", - "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", - "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", - "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz", - "integrity": "sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==", - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/strip-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", - "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", - "dev": true, - "dependencies": { - "min-indent": "^1.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strtok3": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0.tgz", - "integrity": "sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==", - "dev": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^5.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/styled-components": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.10.tgz", - "integrity": "sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/traverse": "^7.4.5", - "@emotion/is-prop-valid": "^1.1.0", - "@emotion/stylis": "^0.8.4", - "@emotion/unitless": "^0.7.4", - "babel-plugin-styled-components": ">= 1.12.0", - "css-to-react-native": "^3.0.0", - "hoist-non-react-statics": "^3.0.0", - "shallowequal": "^1.1.0", - "supports-color": "^5.5.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0", - "react-is": ">= 16.8.0" - } - }, - "node_modules/styled-components/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/styled-components/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/stylis": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.1.tgz", - "integrity": "sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==", - "dev": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/swap-case": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", - "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", - "dependencies": { - "lower-case": "^1.1.1", - "upper-case": "^1.1.1" - } - }, - "node_modules/swarm-js": { - "version": "0.1.42", - "resolved": "https://registry.npmjs.org/swarm-js/-/swarm-js-0.1.42.tgz", - "integrity": "sha512-BV7c/dVlA3R6ya1lMlSSNPLYrntt0LUq4YMgy3iwpCIc6rZnS5W2wUoctarZ5pXlpKtxDDf9hNziEkcfrxdhqQ==", - "dependencies": { - "bluebird": "^3.5.0", - "buffer": "^5.0.5", - "eth-lib": "^0.1.26", - "fs-extra": "^4.0.2", - "got": "^11.8.5", - "mime-types": "^2.1.16", - "mkdirp-promise": "^5.0.1", - "mock-fs": "^4.1.0", - "setimmediate": "^1.0.5", - "tar": "^4.0.2", - "xhr-request": "^1.0.1" - } - }, - "node_modules/swarm-js/node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swarm-js/node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/swarm-js/node_modules/fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/swarm-js/node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/swarm-js/node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/swarm-js/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/swarm-js/node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/swarm-js/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/sync-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sync-request/-/sync-request-6.1.0.tgz", - "integrity": "sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==", - "dev": true, - "peer": true, - "dependencies": { - "http-response-object": "^3.0.1", - "sync-rpc": "^1.2.1", - "then-request": "^6.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/sync-rpc": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/sync-rpc/-/sync-rpc-1.3.6.tgz", - "integrity": "sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==", - "dev": true, - "peer": true, - "dependencies": { - "get-port": "^3.1.0" - } - }, - "node_modules/table": { - "version": "6.8.2", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", - "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", - "peer": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz", - "integrity": "sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==", - "dev": true, - "peer": true, - "dependencies": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/table-layout/node_modules/array-back": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz", - "integrity": "sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "peer": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "4.4.19", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", - "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", - "dependencies": { - "chownr": "^1.1.4", - "fs-minipass": "^1.2.7", - "minipass": "^2.9.0", - "minizlib": "^1.3.3", - "mkdirp": "^0.5.5", - "safe-buffer": "^5.2.1", - "yallist": "^3.1.1" - }, - "engines": { - "node": ">=4.5" - } - }, - "node_modules/temp-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", - "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", - "dev": true, - "engines": { - "node": ">=14.16" - } - }, - "node_modules/tempy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tempy/-/tempy-3.1.0.tgz", - "integrity": "sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==", - "dev": true, - "dependencies": { - "is-stream": "^3.0.0", - "temp-dir": "^3.0.0", - "type-fest": "^2.12.2", - "unique-string": "^3.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tempy/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/testrpc": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/testrpc/-/testrpc-0.0.1.tgz", - "integrity": "sha512-afH1hO+SQ/VPlmaLUFj2636QMeDvPCeQMc/9RBMW0IfjNe9gFD9Ra3ShqYkB7py0do1ZcCna/9acHyzTJ+GcNA==", - "deprecated": "testrpc has been renamed to ganache-cli, please use this package from now on." - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/then-request": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", - "integrity": "sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/concat-stream": "^1.6.0", - "@types/form-data": "0.0.33", - "@types/node": "^8.0.0", - "@types/qs": "^6.2.31", - "caseless": "~0.12.0", - "concat-stream": "^1.6.0", - "form-data": "^2.2.0", - "http-basic": "^8.1.1", - "http-response-object": "^3.0.1", - "promise": "^8.0.0", - "qs": "^6.4.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/then-request/node_modules/@types/node": { - "version": "8.10.66", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.66.tgz", - "integrity": "sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==", - "dev": true, - "peer": true - }, - "node_modules/then-request/node_modules/form-data": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", - "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", - "dev": true, - "peer": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/title-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", - "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.0.3" - } - }, - "node_modules/titleize": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", - "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.1.tgz", - "integrity": "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==", - "dev": true, - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/trim-newlines": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", - "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.5.1.tgz", - "integrity": "sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==", - "dev": true, - "peer": true, - "dependencies": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - }, - "bin": { - "write-markdown": "dist/write-markdown.js" - } - }, - "node_modules/ts-dedent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, - "engines": { - "node": ">=6.10" - } - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-7.0.3.tgz", - "integrity": "sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "devOptional": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", - "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tsconfig-paths/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsort": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tsort/-/tsort-0.0.1.tgz", - "integrity": "sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "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" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz", - "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==" - }, - "node_modules/type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typechain": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", - "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/prettier": "^2.1.1", - "debug": "^4.3.1", - "fs-extra": "^7.0.0", - "glob": "7.1.7", - "js-sha3": "^0.8.0", - "lodash": "^4.17.15", - "mkdirp": "^1.0.4", - "prettier": "^2.3.1", - "ts-command-line-args": "^2.2.0", - "ts-essentials": "^7.0.1" - }, - "bin": { - "typechain": "dist/cli/cli.js" - }, - "peerDependencies": { - "typescript": ">=4.3.0" - } - }, - "node_modules/typechain/node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/typechain/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", - "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", - "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true, - "peer": true - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "devOptional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", - "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/underscore": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", - "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" - }, - "node_modules/undici": { - "version": "5.28.3", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.3.tgz", - "integrity": "sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, - "engines": { - "node": ">=14.0" - } - }, - "node_modules/unique-string": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", - "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", - "dev": true, - "dependencies": { - "crypto-random-string": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" - }, - "node_modules/upper-case-first": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", - "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", - "dependencies": { - "upper-case": "^1.1.1" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/url-set-query": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-set-query/-/url-set-query-1.0.0.tgz", - "integrity": "sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==" - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", - "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", - "hasInstallScript": true, - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", - "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==" - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/varint": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/varint/-/varint-5.0.2.tgz", - "integrity": "sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/viem": { - "version": "2.9.6", - "resolved": "https://registry.npmjs.org/viem/-/viem-2.9.6.tgz", - "integrity": "sha512-VVFWjGQei2wnWTvAB/xrIf22m6flCwxeBr8LnwejXMTSSi1EORWEswrw2lfKTmw3TlRPSG4uSiQMa/d0l0DKRg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/wevm" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@scure/bip32": "1.3.2", - "@scure/bip39": "1.2.1", - "abitype": "1.0.0", - "isows": "1.0.3", - "ws": "8.13.0" - }, - "peerDependencies": { - "typescript": ">=5.0.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/viem/node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" - }, - "node_modules/viem/node_modules/abitype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/abitype/-/abitype-1.0.0.tgz", - "integrity": "sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==", - "funding": { - "url": "https://github.com/sponsors/wevm" - }, - "peerDependencies": { - "typescript": ">=5.0.4", - "zod": "^3 >=3.22.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "zod": { - "optional": true - } - } - }, - "node_modules/viem/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", - "dev": true, - "dependencies": { - "esbuild": "^0.18.10", - "postcss": "^8.4.27", - "rollup": "^3.27.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - }, - "peerDependencies": { - "@types/node": ">= 14", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-singlefile": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.5.tgz", - "integrity": "sha512-y/aRGh8qHmw2f1IhaI/C6PJAaov47ESYDvUv1am1YHMhpY+19B5k5Odp8P+tgs+zhfvak6QB1ykrALQErEAo7g==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.5" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "rollup": ">=2.79.0", - "vite": ">=3.2.0" - } - }, - "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", - "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", - "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", - "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/android-arm": "0.18.20", - "@esbuild/android-arm64": "0.18.20", - "@esbuild/android-x64": "0.18.20", - "@esbuild/darwin-arm64": "0.18.20", - "@esbuild/darwin-x64": "0.18.20", - "@esbuild/freebsd-arm64": "0.18.20", - "@esbuild/freebsd-x64": "0.18.20", - "@esbuild/linux-arm": "0.18.20", - "@esbuild/linux-arm64": "0.18.20", - "@esbuild/linux-ia32": "0.18.20", - "@esbuild/linux-loong64": "0.18.20", - "@esbuild/linux-mips64el": "0.18.20", - "@esbuild/linux-ppc64": "0.18.20", - "@esbuild/linux-riscv64": "0.18.20", - "@esbuild/linux-s390x": "0.18.20", - "@esbuild/linux-x64": "0.18.20", - "@esbuild/netbsd-x64": "0.18.20", - "@esbuild/openbsd-x64": "0.18.20", - "@esbuild/sunos-x64": "0.18.20", - "@esbuild/win32-arm64": "0.18.20", - "@esbuild/win32-ia32": "0.18.20", - "@esbuild/win32-x64": "0.18.20" - } - }, - "node_modules/vite/node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", - "dev": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=14.18.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/web-worker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.3.0.tgz", - "integrity": "sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==", - "dev": true - }, - "node_modules/web3": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3/-/web3-1.10.4.tgz", - "integrity": "sha512-kgJvQZjkmjOEKimx/tJQsqWfRDPTTcBfYPa9XletxuHLpHcXdx67w8EFn5AW3eVxCutE9dTVHgGa9VYe8vgsEA==", - "hasInstallScript": true, - "dependencies": { - "web3-bzz": "1.10.4", - "web3-core": "1.10.4", - "web3-eth": "1.10.4", - "web3-eth-personal": "1.10.4", - "web3-net": "1.10.4", - "web3-shh": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-bzz/-/web3-bzz-1.10.4.tgz", - "integrity": "sha512-ZZ/X4sJ0Uh2teU9lAGNS8EjveEppoHNQiKlOXAjedsrdWuaMErBPdLQjXfcrYvN6WM6Su9PMsAxf3FXXZ+HwQw==", - "hasInstallScript": true, - "dependencies": { - "@types/node": "^12.12.6", - "got": "12.1.0", - "swarm-js": "^0.1.40" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-bzz/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/web3-core": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core/-/web3-core-1.10.4.tgz", - "integrity": "sha512-B6elffYm81MYZDTrat7aEhnhdtVE3lDBUZft16Z8awYMZYJDbnykEbJVS+l3mnA7AQTnSDr/1MjWofGDLBJPww==", - "dependencies": { - "@types/bn.js": "^5.1.1", - "@types/node": "^12.12.6", - "bignumber.js": "^9.0.0", - "web3-core-helpers": "1.10.4", - "web3-core-method": "1.10.4", - "web3-core-requestmanager": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-helpers": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core-helpers/-/web3-core-helpers-1.10.4.tgz", - "integrity": "sha512-r+L5ylA17JlD1vwS8rjhWr0qg7zVoVMDvWhajWA5r5+USdh91jRUYosp19Kd1m2vE034v7Dfqe1xYRoH2zvG0g==", - "dependencies": { - "web3-eth-iban": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-method": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core-method/-/web3-core-method-1.10.4.tgz", - "integrity": "sha512-uZTb7flr+Xl6LaDsyTeE2L1TylokCJwTDrIVfIfnrGmnwLc6bmTWCCrm71sSrQ0hqs6vp/MKbQYIYqUN0J8WyA==", - "dependencies": { - "@ethersproject/transactions": "^5.6.2", - "web3-core-helpers": "1.10.4", - "web3-core-promievent": "1.10.4", - "web3-core-subscriptions": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-promievent": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core-promievent/-/web3-core-promievent-1.10.4.tgz", - "integrity": "sha512-2de5WnJQ72YcIhYwV/jHLc4/cWJnznuoGTJGD29ncFQHAfwW/MItHFSVKPPA5v8AhJe+r6y4Y12EKvZKjQVBvQ==", - "dependencies": { - "eventemitter3": "4.0.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-requestmanager": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core-requestmanager/-/web3-core-requestmanager-1.10.4.tgz", - "integrity": "sha512-vqP6pKH8RrhT/2MoaU+DY/OsYK9h7HmEBNCdoMj+4ZwujQtw/Mq2JifjwsJ7gits7Q+HWJwx8q6WmQoVZAWugg==", - "dependencies": { - "util": "^0.12.5", - "web3-core-helpers": "1.10.4", - "web3-providers-http": "1.10.4", - "web3-providers-ipc": "1.10.4", - "web3-providers-ws": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core-subscriptions": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-core-subscriptions/-/web3-core-subscriptions-1.10.4.tgz", - "integrity": "sha512-o0lSQo/N/f7/L76C0HV63+S54loXiE9fUPfHFcTtpJRQNDBVsSDdWRdePbWwR206XlsBqD5VHApck1//jEafTw==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-core/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/web3-core/node_modules/bignumber.js": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", - "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", - "engines": { - "node": "*" - } - }, - "node_modules/web3-eth": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth/-/web3-eth-1.10.4.tgz", - "integrity": "sha512-Sql2kYKmgt+T/cgvg7b9ce24uLS7xbFrxE4kuuor1zSCGrjhTJ5rRNG8gTJUkAJGKJc7KgnWmgW+cOfMBPUDSA==", - "dependencies": { - "web3-core": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-core-method": "1.10.4", - "web3-core-subscriptions": "1.10.4", - "web3-eth-abi": "1.10.4", - "web3-eth-accounts": "1.10.4", - "web3-eth-contract": "1.10.4", - "web3-eth-ens": "1.10.4", - "web3-eth-iban": "1.10.4", - "web3-eth-personal": "1.10.4", - "web3-net": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-abi": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-abi/-/web3-eth-abi-1.10.4.tgz", - "integrity": "sha512-cZ0q65eJIkd/jyOlQPDjr8X4fU6CRL1eWgdLwbWEpo++MPU/2P4PFk5ZLAdye9T5Sdp+MomePPJ/gHjLMj2VfQ==", - "dependencies": { - "@ethersproject/abi": "^5.6.3", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-accounts/-/web3-eth-accounts-1.10.4.tgz", - "integrity": "sha512-ysy5sVTg9snYS7tJjxVoQAH6DTOTkRGR8emEVCWNGLGiB9txj+qDvSeT0izjurS/g7D5xlMAgrEHLK1Vi6I3yg==", - "dependencies": { - "@ethereumjs/common": "2.6.5", - "@ethereumjs/tx": "3.5.2", - "@ethereumjs/util": "^8.1.0", - "eth-lib": "0.2.8", - "scrypt-js": "^3.0.1", - "uuid": "^9.0.0", - "web3-core": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-core-method": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-accounts/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" - }, - "node_modules/web3-eth-accounts/node_modules/eth-lib": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/eth-lib/-/eth-lib-0.2.8.tgz", - "integrity": "sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw==", - "dependencies": { - "bn.js": "^4.11.6", - "elliptic": "^6.4.0", - "xhr-request-promise": "^0.1.2" - } - }, - "node_modules/web3-eth-accounts/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/web3-eth-contract": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-contract/-/web3-eth-contract-1.10.4.tgz", - "integrity": "sha512-Q8PfolOJ4eV9TvnTj1TGdZ4RarpSLmHnUnzVxZ/6/NiTfe4maJz99R0ISgwZkntLhLRtw0C7LRJuklzGYCNN3A==", - "dependencies": { - "@types/bn.js": "^5.1.1", - "web3-core": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-core-method": "1.10.4", - "web3-core-promievent": "1.10.4", - "web3-core-subscriptions": "1.10.4", - "web3-eth-abi": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-ens": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-ens/-/web3-eth-ens-1.10.4.tgz", - "integrity": "sha512-LLrvxuFeVooRVZ9e5T6OWKVflHPFgrVjJ/jtisRWcmI7KN/b64+D/wJzXqgmp6CNsMQcE7rpmf4CQmJCrTdsgg==", - "dependencies": { - "content-hash": "^2.5.2", - "eth-ens-namehash": "2.0.8", - "web3-core": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-core-promievent": "1.10.4", - "web3-eth-abi": "1.10.4", - "web3-eth-contract": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-iban": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-iban/-/web3-eth-iban-1.10.4.tgz", - "integrity": "sha512-0gE5iNmOkmtBmbKH2aTodeompnNE8jEyvwFJ6s/AF6jkw9ky9Op9cqfzS56AYAbrqEFuClsqB/AoRves7LDELw==", - "dependencies": { - "bn.js": "^5.2.1", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-eth-personal/-/web3-eth-personal-1.10.4.tgz", - "integrity": "sha512-BRa/hs6jU1hKHz+AC/YkM71RP3f0Yci1dPk4paOic53R4ZZG4MgwKRkJhgt3/GPuPliwS46f/i5A7fEGBT4F9w==", - "dependencies": { - "@types/node": "^12.12.6", - "web3-core": "1.10.4", - "web3-core-helpers": "1.10.4", - "web3-core-method": "1.10.4", - "web3-net": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-eth-personal/node_modules/@types/node": { - "version": "12.20.55", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", - "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" - }, - "node_modules/web3-net": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-net/-/web3-net-1.10.4.tgz", - "integrity": "sha512-mKINnhOOnZ4koA+yV2OT5s5ztVjIx7IY9a03w6s+yao/BUn+Luuty0/keNemZxTr1E8Ehvtn28vbOtW7Ids+Ow==", - "dependencies": { - "web3-core": "1.10.4", - "web3-core-method": "1.10.4", - "web3-utils": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-http": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-providers-http/-/web3-providers-http-1.10.4.tgz", - "integrity": "sha512-m2P5Idc8hdiO0l60O6DSCPw0kw64Zgi0pMjbEFRmxKIck2Py57RQMu4bxvkxJwkF06SlGaEQF8rFZBmuX7aagQ==", - "dependencies": { - "abortcontroller-polyfill": "^1.7.5", - "cross-fetch": "^4.0.0", - "es6-promise": "^4.2.8", - "web3-core-helpers": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ipc": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-providers-ipc/-/web3-providers-ipc-1.10.4.tgz", - "integrity": "sha512-YRF/bpQk9z3WwjT+A6FI/GmWRCASgd+gC0si7f9zbBWLXjwzYAKG73bQBaFRAHex1hl4CVcM5WUMaQXf3Opeuw==", - "dependencies": { - "oboe": "2.1.5", - "web3-core-helpers": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-providers-ws": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-providers-ws/-/web3-providers-ws-1.10.4.tgz", - "integrity": "sha512-j3FBMifyuFFmUIPVQR4pj+t5ILhAexAui0opgcpu9R5LxQrLRUZxHSnU+YO25UycSOa/NAX8A+qkqZNpcFAlxA==", - "dependencies": { - "eventemitter3": "4.0.4", - "web3-core-helpers": "1.10.4", - "websocket": "^1.0.32" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-shh": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-shh/-/web3-shh-1.10.4.tgz", - "integrity": "sha512-cOH6iFFM71lCNwSQrC3niqDXagMqrdfFW85hC9PFUrAr3PUrIem8TNstTc3xna2bwZeWG6OBy99xSIhBvyIACw==", - "hasInstallScript": true, - "dependencies": { - "web3-core": "1.10.4", - "web3-core-method": "1.10.4", - "web3-core-subscriptions": "1.10.4", - "web3-net": "1.10.4" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/web3-utils/-/web3-utils-1.10.4.tgz", - "integrity": "sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==", - "dependencies": { - "@ethereumjs/util": "^8.1.0", - "bn.js": "^5.2.1", - "ethereum-bloom-filters": "^1.0.6", - "ethereum-cryptography": "^2.1.2", - "ethjs-unit": "0.1.6", - "number-to-bn": "1.7.0", - "randombytes": "^2.1.0", - "utf8": "3.0.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/web3-utils/node_modules/@noble/curves": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.3.0.tgz", - "integrity": "sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==", - "dependencies": { - "@noble/hashes": "1.3.3" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@scure/bip32": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.3.3.tgz", - "integrity": "sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==", - "dependencies": { - "@noble/curves": "~1.3.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/@scure/bip39": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.2.2.tgz", - "integrity": "sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==", - "dependencies": { - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.4" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/web3-utils/node_modules/ethereum-cryptography": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ethereum-cryptography/-/ethereum-cryptography-2.1.3.tgz", - "integrity": "sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==", - "dependencies": { - "@noble/curves": "1.3.0", - "@noble/hashes": "1.3.3", - "@scure/bip32": "1.3.3", - "@scure/bip39": "1.2.2" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/websocket": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", - "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", - "dependencies": { - "bufferutil": "^4.0.1", - "debug": "^2.2.0", - "es5-ext": "^0.10.50", - "typedarray-to-buffer": "^3.1.5", - "utf-8-validate": "^5.0.2", - "yaeti": "^0.0.6" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/websocket/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/websocket/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/window-size": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", - "integrity": "sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==", - "bin": { - "window-size": "cli.js" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "peer": true - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz", - "integrity": "sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==", - "dev": true, - "peer": true, - "dependencies": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/wordwrapjs/node_modules/typical": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz", - "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xhr-request": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/xhr-request/-/xhr-request-1.1.0.tgz", - "integrity": "sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==", - "dependencies": { - "buffer-to-arraybuffer": "^0.0.5", - "object-assign": "^4.1.1", - "query-string": "^5.0.1", - "simple-get": "^2.7.0", - "timed-out": "^4.0.1", - "url-set-query": "^1.0.0", - "xhr": "^2.0.4" - } - }, - "node_modules/xhr-request-promise": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz", - "integrity": "sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg==", - "dependencies": { - "xhr-request": "^1.1.0" - } - }, - "node_modules/xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yaeti": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", - "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", - "engines": { - "node": ">=0.10.32" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs-unparser/node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "packages/core": { - "name": "@nomicfoundation/ignition-core", - "version": "0.15.1", - "license": "MIT", - "dependencies": { - "@ethersproject/address": "5.6.1", - "@nomicfoundation/solidity-analyzer": "^0.1.1", - "cbor": "^9.0.0", - "debug": "^4.3.2", - "ethers": "^6.7.0", - "fs-extra": "^10.0.0", - "immer": "10.0.2", - "lodash": "4.17.21", - "ndjson": "2.0.0" - }, - "devDependencies": { - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.5", - "hardhat": "^2.18.0" - } - }, - "packages/core/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/core/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/core/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/hardhat-plugin": { - "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.1", - "license": "MIT", - "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.1", - "@nomicfoundation/ignition-ui": "^0.15.1", - "chalk": "^4.0.0", - "debug": "^4.3.2", - "fs-extra": "^10.0.0", - "prompts": "^2.4.2" - }, - "devDependencies": { - "@nomicfoundation/hardhat-network-helpers": "1.0.9", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0", - "viem": "^2.7.6" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-verify": "^2.0.1", - "hardhat": "^2.18.0" - } - }, - "packages/hardhat-plugin-ethers": { - "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.1", - "license": "MIT", - "devDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.1", - "@nomicfoundation/ignition-core": "^0.15.1", - "ethers": "^6.7.0", - "hardhat": "^2.18.0" - } - }, - "packages/hardhat-plugin-viem": { - "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.1", - "license": "MIT", - "devDependencies": { - "@nomicfoundation/hardhat-viem": "^2.0.0", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.4", - "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0" - }, - "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.15.1", - "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.15.1", - "hardhat": "^2.18.0", - "viem": "^2.7.6" - } - }, - "packages/hardhat-plugin/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "packages/hardhat-plugin/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "packages/hardhat-plugin/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "packages/ui": { - "name": "@nomicfoundation/ignition-ui", - "version": "0.15.1", - "devDependencies": { - "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.15.1", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.5", - "@types/react": "^18.0.28", - "@types/react-dom": "^18.0.11", - "@types/styled-components": "5.1.26", - "@vitejs/plugin-react": "^4.0.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.3.4", - "mermaid": "10.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-router-dom": "6.11.0", - "react-tooltip": "^5.21.4", - "styled-components": "5.3.10", - "vite": "^4.3.2", - "vite-plugin-singlefile": "0.13.5" - } - } - } -} diff --git a/package.json b/package.json index ec35262007..177adf58c3 100644 --- a/package.json +++ b/package.json @@ -3,28 +3,18 @@ "author": "Nomic Foundation", "license": "SEE LICENSE IN EACH PACKAGE'S LICENSE FILE", "private": true, - "workspaces": { - "packages": [ - "packages/core", - "packages/ui", - "packages/hardhat-plugin", - "packages/hardhat-plugin-ethers", - "packages/hardhat-plugin-viem", - "examples/*" - ] - }, "scripts": { - "build": "npm run build -w packages", - "lint": "npm run lint --workspaces", + "build": "pnpm --recursive build", + "lint": "pnpm --recursive lint", "postlint": "prettier --check *.{md,json} ./config/**/*.{js,json}", - "lint:fix": "npm run lint:fix --workspaces", + "lint:fix": "pnpm --recursive lint:fix", "postlint:fix": "prettier --write *.{md,json} ./config/**/*.{js,json}", - "test": "npm run test -w packages && npm run test:integrations -w packages/core", - "test:coverage": "npm run test:coverage -w packages", - "test:examples": "npm run test -w examples --if-present", + "test": "pnpm --recursive test && pnpm --filter \"./packages/core\" test:integrations", + "test:coverage": "pnpm --recursive test:coverage", + "test:examples": "pnpm --filter \"./examples/*\" test", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "npm run build && npm run lint && npm run test:examples", - "clean": "npm run clean --workspaces --if-present" + "fullcheck": "pnpm build && pnpm lint && pnpm test", + "clean": "pnpm --recursive clean" }, "devDependencies": { "@istanbuljs/nyc-config-typescript": "1.0.2", @@ -38,7 +28,7 @@ "@types/lodash.flattendeep": "^4.4.7", "@types/mocha": "9.1.1", "@types/ndjson": "2.0.1", - "@types/node": "16.11.7", + "@types/node": "^18.0.0", "@types/prompts": "^2.4.2", "@typescript-eslint/eslint-plugin": "^5.57.1", "@typescript-eslint/experimental-utils": "^5.62.0", diff --git a/packages/core/package.json b/packages/core/package.json index 6428c37deb..d0caaeeee7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,19 +31,19 @@ }, "scripts": { "build": "tsc --build", - "lint": "npm run prettier -- --check && npm run eslint && npm run api-extractor", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "lint": "pnpm prettier --check && pnpm eslint && pnpm api-extractor", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\" \"test-integrations/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,ts,md,json}\"", - "preapi-extractor": "npm run build", + "preapi-extractor": "pnpm build", "api-extractor": "api-extractor run --local --verbose", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='ignition:*' npm run test", + "test:debug": "DEBUG='ignition:*' pnpm test", "test:build": "tsc --project ./test/", "test:coverage": "nyc mocha --recursive \"test/**/*.ts\" \"test-integrations/**/*.ts\"", "test:integrations": "mocha --recursive \"test-integrations/**/*.ts\"", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo", - "prepack": "npm run build" + "prepack": "pnpm build" }, "devDependencies": { "@types/chai": "^4.2.22", diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index e73782f8c2..deac3e40a3 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -21,16 +21,16 @@ "types": "dist/src/index.d.ts", "scripts": { "build": "tsc --build", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' pnpm test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", - "prepack": "npm run build" + "prepack": "pnpm build" }, "devDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", @@ -41,8 +41,8 @@ }, "peerDependencies": { "@nomicfoundation/hardhat-ethers": "^3.0.4", - "@nomicfoundation/hardhat-ignition": "^0.15.1", - "@nomicfoundation/ignition-core": "^0.15.1", + "@nomicfoundation/hardhat-ignition": "workspace:^", + "@nomicfoundation/ignition-core": "workspace:^", "ethers": "^6.7.0", "hardhat": "^2.18.0" } diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 3608f3471b..70b71779b1 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -22,16 +22,16 @@ "scripts": { "prebuild": "ts-node ./scripts/compile-test-fixture-project.ts create2 && ts-node ./scripts/compile-test-fixture-project.ts minimal", "build": "tsc --build", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='hardhat-ignition-viem:*,ignition:*' npm run test", + "test:debug": "DEBUG='hardhat-ignition-viem:*,ignition:*' pnpm test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", - "prepack": "npm run build" + "prepack": "pnpm build" }, "devDependencies": { "@nomicfoundation/hardhat-viem": "^2.0.0", @@ -41,9 +41,9 @@ "hardhat": "^2.18.0" }, "peerDependencies": { - "@nomicfoundation/hardhat-ignition": "^0.15.1", + "@nomicfoundation/hardhat-ignition": "workspace:^", "@nomicfoundation/hardhat-viem": "^2.0.0", - "@nomicfoundation/ignition-core": "^0.15.1", + "@nomicfoundation/ignition-core": "workspace:^", "hardhat": "^2.18.0", "viem": "^2.7.6" } diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 11e63a8458..498742e388 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -35,16 +35,16 @@ }, "scripts": { "build": "tsc --build", - "lint": "npm run prettier -- --check && npm run eslint", - "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "lint": "pnpm prettier --check && pnpm eslint", + "lint:fix": "pnpm prettier --write && pnpm eslint --fix", "eslint": "eslint \"src/**/*.{ts,tsx}\" \"test/**/*.{ts,tsx}\"", "prettier": "prettier \"**/*.{js,ts,md,json}\"", "test": "mocha --recursive \"test/**/*.ts\"", - "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' npm run test", + "test:debug": "DEBUG='hardhat-ignition:*,ignition:*' pnpm test", "test:coverage": "nyc mocha \"test/**/*.ts\"", "test:build": "tsc --project ./test/", "clean": "rimraf .nyc_output coverage dist tsconfig.tsbuildinfo ./test/fixture-projects/**/deployments ./test/fixture-projects/**/artifacts", - "prepack": "npm run build" + "prepack": "pnpm build" }, "devDependencies": { "@types/chai": "^4.2.22", @@ -59,8 +59,8 @@ "hardhat": "^2.18.0" }, "dependencies": { - "@nomicfoundation/ignition-core": "^0.15.1", - "@nomicfoundation/ignition-ui": "^0.15.1", + "@nomicfoundation/ignition-core": "workspace:^", + "@nomicfoundation/ignition-ui": "workspace:^", "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", diff --git a/packages/ui/README.md b/packages/ui/README.md index 83f349333d..876f1edd0e 100644 --- a/packages/ui/README.md +++ b/packages/ui/README.md @@ -11,7 +11,7 @@ a deployment. A development server can be run from the root of this package with: ```sh -npm run dev +pnpm dev ``` By default in development the deployment in `./public/deployment.json` is used, @@ -19,7 +19,7 @@ to overwrite this example deployment, update the module in `./examples/ComplexModule.js` and run the regenerate command: ```sh -npm run regenerate-deployment-example +pnpm regenerate-deployment-example ``` ## Contributing diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index 703d41e2c5..e62861232b 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -27,7 +27,11 @@ const balancerDefinition = buildModule("Balancer", (m) => { }); const synthetixDefinition = buildModule("Synthetix", (m) => { - const synthetixCore = m.contractAt("SynthetixCore", "0x0123", fakeArtifact); + const synthetixCore = m.contractAt( + "SynthetixCore", + "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + fakeArtifact + ); const { router } = m.useModule(uniswap); diff --git a/packages/ui/package.json b/packages/ui/package.json index 9b9a55a7c4..76dc3c7104 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -3,7 +3,7 @@ "version": "0.15.1", "type": "module", "scripts": { - "predev": "npm run regenerate-deployment-example", + "predev": "pnpm regenerate-deployment-example", "dev": "vite --force", "build": "tsc && vite build", "test": "mocha --loader=ts-node/esm --recursive \"test/**/*.ts\"", @@ -12,12 +12,12 @@ "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", "clean": "rimraf dist tsconfig.tsbuildinfo", - "prepack": "npm run build" + "prepack": "pnpm build" }, "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", - "@nomicfoundation/ignition-core": "^0.15.1", + "@nomicfoundation/ignition-core": "workspace:^", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", "@types/react": "^18.0.28", @@ -26,13 +26,13 @@ "@vitejs/plugin-react": "^4.0.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", - "mermaid": "10.1.0", + "mermaid": "10.8.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "6.11.0", "react-tooltip": "^5.21.4", "styled-components": "5.3.10", - "vite": "^4.3.2", - "vite-plugin-singlefile": "0.13.5" + "vite": "^5.0.0", + "vite-plugin-singlefile": "^2.0.1" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000..a235cd3204 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,8744 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: 1.0.2 + version: 1.0.2(nyc@15.1.0) + '@microsoft/api-extractor': + specifier: 7.40.1 + version: 7.40.1(@types/node@18.15.13) + '@nomiclabs/eslint-plugin-hardhat-internal-rules': + specifier: ^1.0.2 + version: 1.0.2 + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.5 + version: 7.1.8 + '@types/debug': + specifier: ^4.1.7 + version: 4.1.12 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/lodash': + specifier: 4.14.189 + version: 4.14.189 + '@types/lodash.flattendeep': + specifier: ^4.4.7 + version: 4.4.9 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/ndjson': + specifier: 2.0.1 + version: 2.0.1 + '@types/node': + specifier: ^18.0.0 + version: 18.15.13 + '@types/prompts': + specifier: ^2.4.2 + version: 2.4.9 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/experimental-utils': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.62.0(eslint@8.57.0)(typescript@5.4.5) + chai: + specifier: ^4.3.4 + version: 4.4.1 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.4.1) + esbuild: + specifier: ^0.15.9 + version: 0.15.18 + eslint: + specifier: ^8.38.0 + version: 8.57.0 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.0) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0) + eslint-plugin-import: + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-mocha: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.0) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + eslint-plugin-prettier: + specifier: 4.0.0 + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + mocha: + specifier: ^9.1.3 + version: 9.2.2 + nyc: + specifier: 15.1.0 + version: 15.1.0 + open-cli: + specifier: 7.2.0 + version: 7.2.0 + prettier: + specifier: 2.8.8 + version: 2.8.8 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + sinon: + specifier: ^14.0.0 + version: 14.0.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + typescript: + specifier: ^5.0.2 + version: 5.4.5 + + packages/core: + dependencies: + '@ethersproject/address': + specifier: 5.6.1 + version: 5.6.1 + '@nomicfoundation/solidity-analyzer': + specifier: ^0.1.1 + version: 0.1.1 + cbor: + specifier: ^9.0.0 + version: 9.0.2 + debug: + specifier: ^4.3.2 + version: 4.3.4(supports-color@5.5.0) + ethers: + specifier: ^6.7.0 + version: 6.12.0 + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + immer: + specifier: 10.0.2 + version: 10.0.2 + lodash: + specifier: 4.17.21 + version: 4.17.21 + ndjson: + specifier: 2.0.0 + version: 2.0.0 + devDependencies: + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.5 + version: 7.1.8 + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + + packages/hardhat-plugin: + dependencies: + '@nomicfoundation/hardhat-verify': + specifier: ^2.0.1 + version: 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../core + '@nomicfoundation/ignition-ui': + specifier: workspace:^ + version: link:../ui + chalk: + specifier: ^4.0.0 + version: 4.1.2 + debug: + specifier: ^4.3.2 + version: 4.3.4(supports-color@5.5.0) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + devDependencies: + '@nomicfoundation/hardhat-network-helpers': + specifier: 1.0.9 + version: 1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + viem: + specifier: ^2.7.6 + version: 2.9.25(typescript@5.4.5) + + packages/hardhat-plugin-ethers: + dependencies: + '@nomicfoundation/hardhat-ignition': + specifier: workspace:^ + version: link:../hardhat-plugin + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../core + ethers: + specifier: ^6.7.0 + version: 6.12.0 + devDependencies: + '@nomicfoundation/hardhat-ethers': + specifier: ^3.0.4 + version: 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + + packages/hardhat-plugin-viem: + dependencies: + '@nomicfoundation/hardhat-ignition': + specifier: workspace:^ + version: link:../hardhat-plugin + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../core + viem: + specifier: ^2.7.6 + version: 2.9.25(typescript@5.4.5) + devDependencies: + '@nomicfoundation/hardhat-viem': + specifier: ^2.0.0 + version: 2.0.1(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5)) + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + + packages/ui: + devDependencies: + '@fontsource/roboto': + specifier: ^5.0.8 + version: 5.0.13 + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../core + '@types/chai': + specifier: ^4.2.22 + version: 4.3.14 + '@types/chai-as-promised': + specifier: ^7.1.5 + version: 7.1.8 + '@types/react': + specifier: ^18.0.28 + version: 18.2.79 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.2.25 + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 + '@vitejs/plugin-react': + specifier: ^4.0.0 + version: 4.2.1(vite@5.2.10(@types/node@18.15.13)) + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.0(eslint@8.57.0) + eslint-plugin-react-refresh: + specifier: ^0.3.4 + version: 0.3.5(eslint@8.57.0) + mermaid: + specifier: 10.8.0 + version: 10.8.0 + react: + specifier: ^18.2.0 + version: 18.2.0 + react-dom: + specifier: ^18.2.0 + version: 18.2.0(react@18.2.0) + react-router-dom: + specifier: 6.11.0 + version: 6.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + react-tooltip: + specifier: ^5.21.4 + version: 5.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + styled-components: + specifier: 5.3.10 + version: 5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0) + vite: + specifier: ^5.0.0 + version: 5.2.10(@types/node@18.15.13) + vite-plugin-singlefile: + specifier: ^2.0.1 + version: 2.0.1(rollup@4.16.2)(vite@5.2.10(@types/node@18.15.13)) + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@adraffy/ens-normalize@1.10.0': + resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} + + '@adraffy/ens-normalize@1.10.1': + resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.4': + resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.24.4': + resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.24.0': + resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.4': + resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.2': + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.4': + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.24.1': + resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.1': + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.1': + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.0': + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emotion/is-prop-valid@1.2.2': + resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.15.18': + resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.15.18': + resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ethersproject/abi@5.7.0': + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + + '@ethersproject/abstract-provider@5.7.0': + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + + '@ethersproject/abstract-signer@5.7.0': + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + + '@ethersproject/address@5.6.1': + resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} + + '@ethersproject/address@5.7.0': + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + + '@ethersproject/base64@5.7.0': + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + + '@ethersproject/bignumber@5.7.0': + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + + '@ethersproject/bytes@5.7.0': + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + + '@ethersproject/constants@5.7.0': + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + + '@ethersproject/hash@5.7.0': + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + + '@ethersproject/keccak256@5.7.0': + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + + '@ethersproject/logger@5.7.0': + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + + '@ethersproject/networks@5.7.1': + resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + + '@ethersproject/properties@5.7.0': + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + + '@ethersproject/rlp@5.7.0': + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + + '@ethersproject/signing-key@5.7.0': + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + + '@ethersproject/strings@5.7.0': + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + + '@ethersproject/transactions@5.7.0': + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + + '@ethersproject/web@5.7.1': + resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@floating-ui/core@1.6.0': + resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + + '@floating-ui/dom@1.6.3': + resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + + '@floating-ui/utils@0.2.1': + resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + + '@fontsource/roboto@5.0.13': + resolution: {integrity: sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/nyc-config-typescript@1.0.2': + resolution: {integrity: sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==} + engines: {node: '>=8'} + peerDependencies: + nyc: '>=15' + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@metamask/eth-sig-util@4.0.1': + resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} + engines: {node: '>=12.0.0'} + + '@microsoft/api-extractor-model@7.28.9': + resolution: {integrity: sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==} + + '@microsoft/api-extractor@7.40.1': + resolution: {integrity: sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@noble/curves@1.2.0': + resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + + '@noble/hashes@1.2.0': + resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} + + '@noble/hashes@1.3.2': + resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} + engines: {node: '>= 16'} + + '@noble/secp256k1@1.7.1': + resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nomicfoundation/edr-darwin-arm64@0.3.5': + resolution: {integrity: sha512-gIXUIiPMUy6roLHpNlxf15DumU7/YhffUf7XIB+WUjMecaySfTGyZsTGnCMJZqrDyiYqWPyPKwCV/2u/jqFAUg==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [darwin] + + '@nomicfoundation/edr-darwin-x64@0.3.5': + resolution: {integrity: sha512-0MrpOCXUK8gmplpYZ2Cy0holHEylvWoNeecFcrP2WJ5DLQzrB23U5JU2MvUzOJ7aL76Za1VXNBWi/UeTWdHM+w==} + engines: {node: '>= 18'} + cpu: [x64] + os: [darwin] + + '@nomicfoundation/edr-linux-arm64-gnu@0.3.5': + resolution: {integrity: sha512-aw9f7AZMiY1dZFNePJGKho2k+nEgFgzUAyyukiKfSqUIMXoFXMf1U3Ujv848czrSq9c5XGcdDa2xnEf3daU3xg==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/edr-linux-arm64-musl@0.3.5': + resolution: {integrity: sha512-cVFRQjyABBlsbDj+XTczYBfrCHprZ6YNzN8gGGSqAh+UGIJkAIRomK6ar27GyJLNx3HkgbuDoi/9kA0zOo/95w==} + engines: {node: '>= 18'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/edr-linux-x64-gnu@0.3.5': + resolution: {integrity: sha512-CjOg85DfR1Vt0fQWn5U0qi26DATK9tVzo3YOZEyI0JBsnqvk43fUTPv3uUAWBrPIRg5O5kOc9xG13hSpCBBxBg==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/edr-linux-x64-musl@0.3.5': + resolution: {integrity: sha512-hvX8bBGpBydAVevzK8jsu2FlqVZK1RrCyTX6wGHnltgMuBaoGLHYtNHiFpteOaJw2byYMiORc2bvj+98LhJ0Ew==} + engines: {node: '>= 18'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/edr-win32-x64-msvc@0.3.5': + resolution: {integrity: sha512-IJXjW13DY5UPsx/eG5DGfXtJ7Ydwrvw/BTZ2Y93lRLHzszVpSmeVmlxjZP5IW2afTSgMLaAAsqNw4NhppRGN8A==} + engines: {node: '>= 18'} + cpu: [x64] + os: [win32] + + '@nomicfoundation/edr@0.3.5': + resolution: {integrity: sha512-dPSM9DuI1sr71gqWUMgLo8MjHQWO4+WNDm3iWaT6P4vUFJReZX5qwA5X+3UwIPBry8GvNY084u7yWUvB3/8rqA==} + engines: {node: '>= 18'} + + '@nomicfoundation/ethereumjs-common@4.0.4': + resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + + '@nomicfoundation/ethereumjs-rlp@5.0.4': + resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} + engines: {node: '>=18'} + hasBin: true + + '@nomicfoundation/ethereumjs-tx@5.0.4': + resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/ethereumjs-util@9.0.4': + resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} + engines: {node: '>=18'} + peerDependencies: + c-kzg: ^2.1.2 + peerDependenciesMeta: + c-kzg: + optional: true + + '@nomicfoundation/hardhat-ethers@3.0.5': + resolution: {integrity: sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==} + peerDependencies: + ethers: ^6.1.0 + hardhat: ^2.0.0 + + '@nomicfoundation/hardhat-network-helpers@1.0.9': + resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} + peerDependencies: + hardhat: ^2.9.5 + + '@nomicfoundation/hardhat-verify@2.0.6': + resolution: {integrity: sha512-oKUI5fl8QC8jysE2LUBHE6rObzEmccJcc4b43Ov7LFMlCBZJE27qoqGIsg/++wX7L8Jdga+bkejPxl8NvsecpQ==} + peerDependencies: + hardhat: ^2.0.4 + + '@nomicfoundation/hardhat-viem@2.0.1': + resolution: {integrity: sha512-C7mSg2MiJekWY2xZYYOdbGmA1+hRKIHoSsh/SeY97mPO6nTha7OEeeg+seecxTekLJW1kqryjCdU8ul+L29v3w==} + peerDependencies: + hardhat: ^2.17.0 + typescript: ~5.0.0 + viem: ^2.7.6 + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nomicfoundation/solidity-analyzer@0.1.1': + resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + engines: {node: '>= 12'} + + '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': + resolution: {integrity: sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==} + + '@remix-run/router@1.6.0': + resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.16.2': + resolution: {integrity: sha512-VGodkwtEuZ+ENPz/CpDSl091koMv8ao5jHVMbG1vNK+sbx/48/wVzP84M5xSfDAC69mAKKoEkSo+ym9bXYRK9w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.16.2': + resolution: {integrity: sha512-5/W1xyIdc7jw6c/f1KEtg1vYDBWnWCsLiipK41NiaWGLG93eH2edgE6EgQJ3AGiPERhiOLUqlDSfjRK08C9xFg==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.16.2': + resolution: {integrity: sha512-vOAKMqZSTbPfyPVu1jBiy+YniIQd3MG7LUnqV0dA6Q5tyhdqYtxacTHP1+S/ksKl6qCtMG1qQ0grcIgk/19JEA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.16.2': + resolution: {integrity: sha512-aIJVRUS3Dnj6MqocBMrcXlatKm64O3ITeQAdAxVSE9swyhNyV1dwnRgw7IGKIkDQofatd8UqMSyUxuFEa42EcA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.16.2': + resolution: {integrity: sha512-/bjfUiXwy3P5vYr6/ezv//Yle2Y0ak3a+Av/BKoi76nFryjWCkki8AuVoPR7ZU/ckcvAWFo77OnFK14B9B5JsA==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.16.2': + resolution: {integrity: sha512-S24b+tJHwpq2TNRz9T+r71FjMvyBBApY8EkYxz8Cwi/rhH6h+lu/iDUxyc9PuHf9UvyeBFYkWWcrDahai/NCGw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.16.2': + resolution: {integrity: sha512-UN7VAXLyeyGbCQWiOtQN7BqmjTDw1ON2Oos4lfk0YR7yNhFEJWZiwGtvj9Ay4lsT/ueT04sh80Sg2MlWVVZ+Ug==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.16.2': + resolution: {integrity: sha512-ZBKvz3+rIhQjusKMccuJiPsStCrPOtejCHxTe+yWp3tNnuPWtyCh9QLGPKz6bFNFbwbw28E2T6zDgzJZ05F1JQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.16.2': + resolution: {integrity: sha512-LjMMFiVBRL3wOe095vHAekL4b7nQqf4KZEpdMWd3/W+nIy5o9q/8tlVKiqMbfieDypNXLsxM9fexOxd9Qcklyg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.16.2': + resolution: {integrity: sha512-ohkPt0lKoCU0s4B6twro2aft+QROPdUiWwOjPNTzwTsBK5w+2+iT9kySdtOdq0gzWJAdiqsV4NFtXOwGZmIsHA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.16.2': + resolution: {integrity: sha512-jm2lvLc+/gqXfndlpDw05jKvsl/HKYxUEAt1h5UXcMFVpO4vGpoWmJVUfKDtTqSaHcCNw1his1XjkgR9aort3w==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.16.2': + resolution: {integrity: sha512-oc5/SlITI/Vj/qL4UM+lXN7MERpiy1HEOnrE+SegXwzf7WP9bzmZd6+MDljCEZTdSY84CpvUv9Rq7bCaftn1+g==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.16.2': + resolution: {integrity: sha512-/2VWEBG6mKbS2itm7hzPwhIPaxfZh/KLWrYg20pCRLHhNFtF+epLgcBtwy3m07bl/k86Q3PFRAf2cX+VbZbwzQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.16.2': + resolution: {integrity: sha512-Wg7ANh7+hSilF0lG3e/0Oy8GtfTIfEk1327Bw8juZOMOoKmJLs3R+a4JDa/4cHJp2Gs7QfCDTepXXcyFD0ubBg==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.16.2': + resolution: {integrity: sha512-J/jCDKVMWp0Y2ELnTjpQFYUCUWv1Jr+LdFrJVZtdqGyjDo0PHPa7pCamjHvJel6zBFM3doFFqAr7cmXYWBAbfw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.16.2': + resolution: {integrity: sha512-3nIf+SJMs2ZzrCh+SKNqgLVV9hS/UY0UjT1YU8XQYFGLiUfmHYJ/5trOU1XSvmHjV5gTF/K3DjrWxtyzKKcAHA==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@3.66.0': + resolution: {integrity: sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.1': + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + + '@rushstack/ts-command-line@4.17.1': + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + + '@scure/base@1.1.6': + resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + + '@scure/bip32@1.1.5': + resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + + '@scure/bip32@1.3.2': + resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + + '@scure/bip39@1.1.1': + resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + + '@scure/bip39@1.2.1': + resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + + '@sentry/core@5.30.0': + resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} + engines: {node: '>=6'} + + '@sentry/hub@5.30.0': + resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} + engines: {node: '>=6'} + + '@sentry/minimal@5.30.0': + resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} + engines: {node: '>=6'} + + '@sentry/node@5.30.0': + resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} + engines: {node: '>=6'} + + '@sentry/tracing@5.30.0': + resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} + engines: {node: '>=6'} + + '@sentry/types@5.30.0': + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + engines: {node: '>=6'} + + '@sentry/utils@5.30.0': + resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} + engines: {node: '>=6'} + + '@sinonjs/commons@1.8.6': + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@11.2.2': + resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + + '@sinonjs/fake-timers@9.1.2': + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + + '@sinonjs/samsam@7.0.1': + resolution: {integrity: sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==} + + '@sinonjs/text-encoding@0.7.2': + resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/bn.js@4.11.6': + resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + + '@types/bn.js@5.1.5': + resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + + '@types/chai-as-promised@7.1.8': + resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + + '@types/chai@4.3.14': + resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + + '@types/d3-scale-chromatic@3.0.3': + resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-time@3.0.3': + resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + + '@types/hoist-non-react-statics@3.3.5': + resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/lodash.flattendeep@4.4.9': + resolution: {integrity: sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==} + + '@types/lodash@4.14.189': + resolution: {integrity: sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==} + + '@types/lru-cache@5.1.1': + resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/mocha@9.1.1': + resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/ndjson@2.0.1': + resolution: {integrity: sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==} + + '@types/node@18.15.13': + resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/pbkdf2@3.1.2': + resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + + '@types/prompts@2.4.9': + resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/react-dom@18.2.25': + resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + + '@types/react@18.2.79': + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + + '@types/secp256k1@4.0.6': + resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/sinon@10.0.20': + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + + '@types/sinonjs__fake-timers@8.1.5': + resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + + '@types/styled-components@5.1.26': + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@ungap/promise-all-settled@1.1.2': + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + + '@ungap/structured-clone@1.2.0': + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + + '@vitejs/plugin-react@4.2.1': + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + abitype@0.9.10: + resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + abitype@1.0.0: + resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + adm-zip@0.4.16: + resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} + engines: {node: '>=0.3.0'} + + aes-js@4.0.0-beta.5: + resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + babel-plugin-styled-components@2.1.4: + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.9: + resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + + big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + blakejs@1.2.1: + resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + + bn.js@4.12.0: + resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + boxen@5.1.2: + resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} + engines: {node: '>=10'} + + bplist-parser@0.2.0: + resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} + engines: {node: '>= 5.10.0'} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + browserify-aes@1.2.0: + resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + bs58check@2.1.2: + resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-xor@1.0.3: + resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} + + bundle-name@3.0.0: + resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} + engines: {node: '>=12'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@8.0.2: + resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==} + engines: {node: '>=14.16'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + + caniuse-lite@1.0.30001612: + resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + + cbor@8.1.0: + resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} + engines: {node: '>=12.19'} + + cbor@9.0.2: + resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} + engines: {node: '>=16'} + + chai-as-promised@7.1.1: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + cipher-base@1.0.4: + resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-boxes@2.2.1: + resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} + engines: {node: '>=6'} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + + command-exists@1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + + commander@3.0.2: + resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + + commondir@1.0.1: + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + + create-hash@1.2.0: + resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + + create-hmac@1.1.7: + resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.29.0: + resolution: {integrity: sha512-ADqhlrCKhhQF8s/s3hTpvVAIyWwsfgFI/hD2vhAXc2ndncJFVZaq3/uBkDIhf4RrNwPw93vUarW36x6rFbUk0Q==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.3: + resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + decamelize@6.0.0: + resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@3.0.0: + resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} + engines: {node: '>=12'} + + default-browser@4.0.0: + resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} + engines: {node: '>=14.16'} + + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dompurify@3.0.5: + resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} + + electron-to-chromium@1.4.746: + resolution: {integrity: sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==} + + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + + elliptic@6.5.4: + resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + + elliptic@6.5.5: + resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + + esbuild-android-64@0.15.18: + resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.15.18: + resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.15.18: + resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.15.18: + resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.15.18: + resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.15.18: + resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.15.18: + resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.15.18: + resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.15.18: + resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.15.18: + resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.15.18: + resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.15.18: + resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.15.18: + resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.15.18: + resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.15.18: + resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.15.18: + resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.15.18: + resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.15.18: + resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.15.18: + resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.15.18: + resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.15.18: + resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@8.3.0: + resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + 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==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.29.0: + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-mocha@9.0.0: + resolution: {integrity: sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + + eslint-plugin-prettier@4.0.0: + resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@4.6.0: + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.3.5: + resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} + peerDependencies: + eslint: '>=7' + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@6.12.0: + resolution: {integrity: sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ==} + engines: {node: '>=14.0.0'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-type@18.7.0: + resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} + engines: {node: '>=14.16'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-extra@0.30.0: + resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + hardhat@2.22.3: + resolution: {integrity: sha512-k8JV2ECWNchD6ahkg2BR5wKVxY0OiKot7fuxiIpRK0frRqyOljcR2vKwgWSLw6YIeDcNNA4xybj7Og7NSxr2hA==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@5.2.1: + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.3: + resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@2.4.0: + resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + klaw@1.3.1: + resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@11.0.0: + resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} + engines: {node: '>=14.16'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@10.8.0: + resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} + + minimatch@5.0.1: + resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} + engines: {node: '>=10'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.4.0: + resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + + nise@5.1.9: + resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@4.0.1: + resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open-cli@7.2.0: + resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} + engines: {node: '>=14.16'} + hasBin: true + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + peek-readable@5.0.0: + resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} + engines: {node: '>=14.16'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + + ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.11.0: + resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.11.0: + resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + + react-tooltip@5.26.3: + resolution: {integrity: sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + + react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@9.1.0: + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + read-pkg@7.1.0: + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.16.2: + resolution: {integrity: sha512-sxDP0+pya/Yi5ZtptF4p3avI+uWCIf/OdrfdH2Gbv1kWddLKk0U7WE3PmQokhi5JrektxsK3sK8s4hzAmjqahw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sinon@14.0.2: + resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} + deprecated: 16.1.1 + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + solc@0.7.3: + resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} + engines: {node: '>=8.0.0'} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strtok3@7.0.0: + resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} + engines: {node: '>=14.16'} + + styled-components@5.3.10: + resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + 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' + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + viem@2.9.25: + resolution: {integrity: sha512-W0QOXCsYQppnV89PQP0EnCvfZIEsDYqmpVakLPNrok4Q4B7651M3MV/sYifYcLWv3Mn4KUyMCUlVxlej6CfC/w==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-plugin-singlefile@2.0.1: + resolution: {integrity: sha512-J74tfN6TE4fz0Hp7E1+dmVTmCpyazv4yuIpR6jd22Kq76d2CQDSQx3wDiHX8LT02f922V+YrLhRq2VIk/UYrig==} + engines: {node: '>18.0.0'} + peerDependencies: + rollup: ^4.12.0 + vite: ^5.1.4 + + vite@5.2.10: + resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + + workerpool@6.2.1: + resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.5.0: + resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + 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'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@adraffy/ens-normalize@1.10.0': {} + + '@adraffy/ens-normalize@1.10.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.4': {} + + '@babel/core@7.24.4': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) + '@babel/helpers': 7.24.4 + '@babel/parser': 7.24.4 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1(supports-color@5.5.0) + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.24.4': + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.0 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + + '@babel/helper-plugin-utils@7.24.0': {} + + '@babel/helper-simple-access@7.22.5': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-split-export-declaration@7.22.6': + dependencies: + '@babel/types': 7.24.0 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.22.20': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.4': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1(supports-color@5.5.0) + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.2': + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.4': + dependencies: + '@babel/types': 7.24.0 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4)': + dependencies: + '@babel/core': 7.24.4 + '@babel/helper-plugin-utils': 7.24.0 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + '@babel/traverse@7.24.1(supports-color@5.5.0)': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.4 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + debug: 4.3.4(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.0': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + + '@braintree/sanitize-url@6.0.4': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emotion/is-prop-valid@1.2.2': + dependencies: + '@emotion/memoize': 0.8.1 + + '@emotion/memoize@0.8.1': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.15.18': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.15.18': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.6.1': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@fastify/busboy@2.1.1': {} + + '@floating-ui/core@1.6.0': + dependencies: + '@floating-ui/utils': 0.2.1 + + '@floating-ui/dom@1.6.3': + dependencies: + '@floating-ui/core': 1.6.0 + '@floating-ui/utils': 0.2.1 + + '@floating-ui/utils@0.2.1': {} + + '@fontsource/roboto@5.0.13': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0)': + dependencies: + '@istanbuljs/schema': 0.1.3 + nyc: 15.1.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + '@microsoft/api-extractor-model@7.28.9(@types/node@18.15.13)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.15.13) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.40.1(@types/node@18.15.13)': + dependencies: + '@microsoft/api-extractor-model': 7.28.9(@types/node@18.15.13) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.15.13) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nomicfoundation/edr-darwin-arm64@0.3.5': + optional: true + + '@nomicfoundation/edr-darwin-x64@0.3.5': + optional: true + + '@nomicfoundation/edr-linux-arm64-gnu@0.3.5': + optional: true + + '@nomicfoundation/edr-linux-arm64-musl@0.3.5': + optional: true + + '@nomicfoundation/edr-linux-x64-gnu@0.3.5': + optional: true + + '@nomicfoundation/edr-linux-x64-musl@0.3.5': + optional: true + + '@nomicfoundation/edr-win32-x64-msvc@0.3.5': + optional: true + + '@nomicfoundation/edr@0.3.5': + optionalDependencies: + '@nomicfoundation/edr-darwin-arm64': 0.3.5 + '@nomicfoundation/edr-darwin-x64': 0.3.5 + '@nomicfoundation/edr-linux-arm64-gnu': 0.3.5 + '@nomicfoundation/edr-linux-arm64-musl': 0.3.5 + '@nomicfoundation/edr-linux-x64-gnu': 0.3.5 + '@nomicfoundation/edr-linux-x64-musl': 0.3.5 + '@nomicfoundation/edr-win32-x64-msvc': 0.3.5 + + '@nomicfoundation/ethereumjs-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + debug: 4.3.4(supports-color@5.5.0) + ethers: 6.12.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + + '@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.6.1 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.4(supports-color@5.5.0) + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-viem@2.0.1(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5))': + dependencies: + abitype: 0.9.10(typescript@5.4.5) + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + lodash.memoize: 4.1.2 + typescript: 5.4.5 + viem: 2.9.25(typescript@5.4.5) + transitivePeerDependencies: + - zod + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.1': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + + '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': {} + + '@remix-run/router@1.6.0': {} + + '@rollup/rollup-android-arm-eabi@4.16.2': + optional: true + + '@rollup/rollup-android-arm64@4.16.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.16.2': + optional: true + + '@rollup/rollup-darwin-x64@4.16.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.16.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.16.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.16.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.16.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.16.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.16.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.16.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.16.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.16.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.16.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.16.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.16.2': + optional: true + + '@rushstack/node-core-library@3.66.0(@types/node@18.15.13)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 18.15.13 + + '@rushstack/rig-package@0.5.1': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/ts-command-line@4.17.1': + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + + '@scure/base@1.1.6': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.6 + + '@scure/bip32@1.3.2': + dependencies: + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.6 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.6 + + '@scure/bip39@1.2.1': + dependencies: + '@noble/hashes': 1.3.2 + '@scure/base': 1.1.6 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sinonjs/commons@1.8.6': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@2.0.0': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@11.2.2': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@9.1.2': + dependencies: + '@sinonjs/commons': 1.8.6 + + '@sinonjs/samsam@7.0.1': + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.0.8 + + '@sinonjs/text-encoding@0.7.2': {} + + '@tokenizer/token@0.3.0': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.0 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.4 + '@babel/types': 7.24.0 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.24.0 + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 18.15.13 + + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 18.15.13 + + '@types/chai-as-promised@7.1.8': + dependencies: + '@types/chai': 4.3.14 + + '@types/chai@4.3.14': {} + + '@types/d3-scale-chromatic@3.0.3': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-time@3.0.3': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.5': {} + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 18.15.13 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.2.79 + hoist-non-react-statics: 3.3.2 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/lodash.flattendeep@4.4.9': + dependencies: + '@types/lodash': 4.14.189 + + '@types/lodash@4.14.189': {} + + '@types/lru-cache@5.1.1': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.10 + + '@types/minimist@1.2.5': {} + + '@types/mocha@9.1.1': {} + + '@types/ms@0.7.34': {} + + '@types/ndjson@2.0.1': + dependencies: + '@types/node': 18.15.13 + '@types/through': 0.0.33 + + '@types/node@18.15.13': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 18.15.13 + + '@types/prompts@2.4.9': + dependencies: + '@types/node': 18.15.13 + kleur: 3.0.3 + + '@types/prop-types@15.7.12': {} + + '@types/react-dom@18.2.25': + dependencies: + '@types/react': 18.2.79 + + '@types/react@18.2.79': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 18.15.13 + + '@types/semver@7.5.8': {} + + '@types/sinon@10.0.20': + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + + '@types/sinonjs__fake-timers@8.1.5': {} + + '@types/styled-components@5.1.26': + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.2.79 + csstype: 3.1.3 + + '@types/through@0.0.33': + dependencies: + '@types/node': 18.15.13 + + '@types/unist@2.0.10': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare-lite: 1.4.0 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.4(supports-color@5.5.0) + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.0 + tsutils: 3.21.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/promise-all-settled@1.1.2': {} + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react@4.2.1(vite@5.2.10(@types/node@18.15.13))': + dependencies: + '@babel/core': 7.24.4 + '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.0 + vite: 5.2.10(@types/node@18.15.13) + transitivePeerDependencies: + - supports-color + + abitype@0.9.10(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + abitype@1.0.0(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + adm-zip@0.4.16: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.12.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.1: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + babel-plugin-styled-components@2.1.4(@babel/core@7.24.4)(styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0)): + dependencies: + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.24.3 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0) + transitivePeerDependencies: + - '@babel/core' + + balanced-match@1.0.2: {} + + base-x@3.0.9: + dependencies: + safe-buffer: 5.2.1 + + big-integer@1.6.52: {} + + binary-extensions@2.3.0: {} + + blakejs@1.2.1: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + bplist-parser@0.2.0: + dependencies: + big-integer: 1.6.52 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001612 + electron-to-chromium: 1.4.746 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + + bs58@4.0.1: + dependencies: + base-x: 3.0.9 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 + + bytes@3.1.2: {} + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-keys@8.0.2: + dependencies: + camelcase: 7.0.1 + map-obj: 4.3.0 + quick-lru: 6.1.2 + type-fest: 2.19.0 + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001612: {} + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + + chai-as-promised@7.1.1(chai@4.4.1): + dependencies: + chai: 4.4.1 + check-error: 1.0.3 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities@2.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@2.0.0: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + classnames@2.5.1: {} + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.2.5: {} + + command-exists@1.2.9: {} + + commander@3.0.2: {} + + commander@7.2.0: {} + + commander@9.5.0: + optional: true + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.4.2: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.29.0 + + cytoscape@3.29.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dayjs@1.11.10: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.3(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.4(supports-color@5.5.0): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 5.5.0 + + debug@4.3.4(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + decamelize@6.0.0: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deep-is@0.1.4: {} + + default-browser-id@3.0.0: + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + depd@2.0.0: {} + + dequal@2.0.3: {} + + diff@4.0.2: {} + + diff@5.0.0: {} + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dompurify@3.0.5: {} + + electron-to-chromium@1.4.746: {} + + elkjs@0.9.3: {} + + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + elliptic@6.5.5: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.16.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es6-error@4.1.1: {} + + esbuild-android-64@0.15.18: + optional: true + + esbuild-android-arm64@0.15.18: + optional: true + + esbuild-darwin-64@0.15.18: + optional: true + + esbuild-darwin-arm64@0.15.18: + optional: true + + esbuild-freebsd-64@0.15.18: + optional: true + + esbuild-freebsd-arm64@0.15.18: + optional: true + + esbuild-linux-32@0.15.18: + optional: true + + esbuild-linux-64@0.15.18: + optional: true + + esbuild-linux-arm64@0.15.18: + optional: true + + esbuild-linux-arm@0.15.18: + optional: true + + esbuild-linux-mips64le@0.15.18: + optional: true + + esbuild-linux-ppc64le@0.15.18: + optional: true + + esbuild-linux-riscv64@0.15.18: + optional: true + + esbuild-linux-s390x@0.15.18: + optional: true + + esbuild-netbsd-64@0.15.18: + optional: true + + esbuild-openbsd-64@0.15.18: + optional: true + + esbuild-sunos-64@0.15.18: + optional: true + + esbuild-windows-32@0.15.18: + optional: true + + esbuild-windows-64@0.15.18: + optional: true + + esbuild-windows-arm64@0.15.18: + optional: true + + esbuild@0.15.18: + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-config-prettier@8.3.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0): + dependencies: + debug: 4.3.4(supports-color@5.5.0) + enhanced-resolve: 5.16.0 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.3 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + 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.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-mocha@9.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-utils: 3.0.0(eslint@8.57.0) + ramda: 0.27.2 + + eslint-plugin-no-only-tests@3.1.0: {} + + eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): + dependencies: + eslint: 8.57.0 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.3.0(eslint@8.57.0) + + eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.3.5(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4(supports-color@5.5.0) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + ethereum-cryptography@0.1.3: + dependencies: + '@types/pbkdf2': 3.1.2 + '@types/secp256k1': 4.0.6 + blakejs: 1.2.1 + browserify-aes: 1.2.0 + bs58check: 2.1.2 + create-hash: 1.2.0 + create-hmac: 1.1.7 + hash.js: 1.1.7 + keccak: 3.0.4 + pbkdf2: 3.1.2 + randombytes: 2.1.0 + safe-buffer: 5.2.1 + scrypt-js: 3.0.1 + secp256k1: 4.0.3 + setimmediate: 1.0.5 + + ethereum-cryptography@1.2.0: + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/bip32': 1.1.5 + '@scure/bip39': 1.1.1 + + ethereumjs-abi@0.6.8: + dependencies: + bn.js: 4.12.0 + ethereumjs-util: 6.2.1 + + ethereumjs-util@6.2.1: + dependencies: + '@types/bn.js': 4.11.6 + bn.js: 4.12.0 + create-hash: 1.2.0 + elliptic: 6.5.5 + ethereum-cryptography: 0.1.3 + ethjs-util: 0.1.6 + rlp: 2.2.7 + + ethereumjs-util@7.1.5: + dependencies: + '@types/bn.js': 5.1.5 + bn.js: 5.2.1 + create-hash: 1.2.0 + ethereum-cryptography: 0.1.3 + rlp: 2.2.7 + + ethers@6.12.0: + dependencies: + '@adraffy/ens-normalize': 1.10.1 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@types/node': 18.15.13 + aes-js: 4.0.0-beta.5 + tslib: 2.4.0 + ws: 8.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + ethjs-util@0.1.6: + dependencies: + is-hex-prefixed: 1.0.0 + strip-hex-prefix: 1.0.0 + + evp_bytestokey@1.0.3: + dependencies: + md5.js: 1.3.5 + safe-buffer: 5.2.1 + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@7.2.0: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 4.3.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.3.0: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + file-type@18.7.0: + dependencies: + readable-web-to-node-stream: 3.0.2 + strtok3: 7.0.0 + token-types: 5.0.1 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@3.3.2: + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + + flat@5.0.2: {} + + flatted@3.3.1: {} + + follow-redirects@1.15.6(debug@4.3.4): + optionalDependencies: + debug: 4.3.4(supports-color@5.5.0) + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 3.0.7 + + fp-ts@1.19.3: {} + + fromentries@1.3.2: {} + + fs-extra@0.30.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 2.4.0 + klaw: 1.3.1 + path-is-absolute: 1.0.1 + rimraf: 2.7.1 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-stdin@9.0.0: {} + + get-stream@6.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.3: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.0.1 + once: 1.4.0 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.3: + dependencies: + define-properties: 1.2.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + growl@1.10.5: {} + + hard-rejection@2.1.0: {} + + hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5): + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.3.5 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.1 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 3.6.0 + ci-info: 2.0.0 + debug: 4.3.4(supports-color@5.5.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.5 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.4.0 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.7.3(debug@4.3.4) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + tsort: 0.0.1 + undici: 5.28.4 + uuid: 8.3.2 + ws: 7.5.9 + optionalDependencies: + ts-node: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - bufferutil + - c-kzg + - supports-color + - utf-8-validate + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hash-base@3.1.0: + dependencies: + inherits: 2.0.4 + readable-stream: 3.6.2 + safe-buffer: 5.2.1 + + hash.js@1.1.7: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + he@1.2.0: {} + + hmac-drbg@1.0.1: + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + hosted-git-info@4.1.0: + dependencies: + lru-cache: 6.0.0 + + hosted-git-info@5.2.1: + dependencies: + lru-cache: 7.18.3 + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + human-signals@2.1.0: {} + + human-signals@4.3.1: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + immer@10.0.2: {} + + immutable@4.3.5: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-lazy@4.0.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + internmap@1.0.1: {} + + internmap@2.0.3: {} + + io-ts@1.10.4: + dependencies: + fp-ts: 1.19.3 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-docker@2.2.1: {} + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-hex-prefixed@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@2.1.0: {} + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-typedarray@1.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-windows@1.0.2: {} + + is-wsl@2.2.0: + dependencies: + is-docker: 2.2.1 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + isows@1.0.3(ws@8.13.0): + dependencies: + ws: 8.13.0 + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + + istanbul-lib-instrument@4.0.3: + dependencies: + '@babel/core': 7.24.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.3 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.4(supports-color@5.5.0) + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jju@1.4.0: {} + + js-sha3@0.8.0: {} + + js-tokens@4.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@2.5.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json-stringify-safe@5.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonfile@2.4.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + just-extend@6.2.0: {} + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + khroma@2.1.0: {} + + kind-of@6.0.3: {} + + klaw@1.3.1: + optionalDependencies: + graceful-fs: 4.2.11 + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + layout-base@1.0.2: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + lines-and-columns@1.2.4: {} + + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.clonedeep@4.5.0: {} + + lodash.flattendeep@4.4.0: {} + + lodash.get@4.4.2: {} + + lodash.isequal@4.5.0: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + lru-cache@7.18.3: {} + + lru_map@0.3.3: {} + + make-dir@3.1.0: + dependencies: + semver: 6.3.1 + + make-dir@4.0.0: + dependencies: + semver: 7.6.0 + + make-error@1.3.6: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + md5.js@1.3.5: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + + memorystream@0.3.1: {} + + meow@11.0.0: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 8.0.2 + decamelize: 6.0.0 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 4.0.1 + read-pkg-up: 9.1.0 + redent: 4.0.0 + trim-newlines: 4.1.1 + type-fest: 3.13.1 + yargs-parser: 21.1.1 + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + mermaid@10.8.0: + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.0.3 + cytoscape: 3.29.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.10 + dompurify: 3.0.5 + elkjs: 0.9.3 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.1 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.3.0 + transitivePeerDependencies: + - supports-color + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-symbol@1.1.0: {} + + micromark-util-types@1.1.0: {} + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + min-indent@1.0.1: {} + + minimalistic-assert@1.0.1: {} + + minimalistic-crypto-utils@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@4.2.1: + dependencies: + brace-expansion: 1.1.11 + + minimatch@5.0.1: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + mnemonist@0.38.5: + dependencies: + obliterator: 2.0.4 + + mocha@10.4.0: + dependencies: + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.4(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.0.1 + ms: 2.1.3 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.2.1 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + + mocha@9.2.2: + dependencies: + '@ungap/promise-all-settled': 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.3(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 4.2.1 + ms: 2.1.3 + nanoid: 3.3.1 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + workerpool: 6.2.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + + mri@1.2.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.1: {} + + nanoid@3.3.7: {} + + natural-compare-lite@1.4.0: {} + + natural-compare@1.4.0: {} + + ndjson@2.0.0: + dependencies: + json-stringify-safe: 5.0.1 + minimist: 1.2.8 + readable-stream: 3.6.2 + split2: 3.2.2 + through2: 4.0.2 + + nise@5.1.9: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.2.2 + '@sinonjs/text-encoding': 0.7.2 + just-extend: 6.2.0 + path-to-regexp: 6.2.2 + + node-addon-api@2.0.2: {} + + node-gyp-build@4.8.0: {} + + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.0.0 + + node-releases@2.0.14: {} + + nofilter@3.1.0: {} + + non-layered-tidy-tree-layout@2.0.2: {} + + normalize-package-data@3.0.3: + dependencies: + hosted-git-info: 4.1.0 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + + normalize-package-data@4.0.1: + dependencies: + hosted-git-info: 5.2.1 + is-core-module: 2.13.1 + semver: 7.6.0 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nyc@15.1.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 4.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.0.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + + object-inspect@1.13.1: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + obliterator@2.0.4: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + open-cli@7.2.0: + dependencies: + file-type: 18.7.0 + get-stdin: 9.0.0 + meow: 11.0.0 + open: 9.1.0 + tempy: 3.1.0 + + open@9.1.0: + dependencies: + default-browser: 4.0.0 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 2.2.0 + + optionator@0.9.3: + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + + os-tmpdir@1.0.2: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-map@3.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-try@1.0.0: {} + + p-try@2.2.0: {} + + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + path-exists@3.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-to-regexp@6.2.2: {} + + path-type@4.0.0: {} + + pathval@1.1.1: {} + + pbkdf2@3.1.2: + dependencies: + create-hash: 1.2.0 + create-hmac: 1.1.7 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + peek-readable@5.0.0: {} + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + possible-typed-array-names@1.0.0: {} + + postcss-value-parser@4.2.0: {} + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + + prettier@2.8.8: {} + + process-on-spawn@1.0.0: + dependencies: + fromentries: 1.3.2 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + quick-lru@6.1.2: {} + + ramda@0.27.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@18.2.0(react@18.2.0): + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + + react-is@16.13.1: {} + + react-refresh@0.14.0: {} + + react-router-dom@6.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@remix-run/router': 1.6.0 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-router: 6.11.0(react@18.2.0) + + react-router@6.11.0(react@18.2.0): + dependencies: + '@remix-run/router': 1.6.0 + react: 18.2.0 + + react-tooltip@5.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + dependencies: + '@floating-ui/dom': 1.6.3 + classnames: 2.5.1 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + + react@18.2.0: + dependencies: + loose-envify: 1.4.0 + + read-pkg-up@9.1.0: + dependencies: + find-up: 6.3.0 + read-pkg: 7.1.0 + type-fest: 2.19.0 + + read-pkg@7.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 3.0.3 + parse-json: 5.2.0 + type-fest: 2.19.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readable-web-to-node-stream@3.0.2: + dependencies: + readable-stream: 3.6.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + redent@4.0.0: + dependencies: + indent-string: 5.0.0 + strip-indent: 4.0.0 + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + + require-directory@2.1.1: {} + + require-from-string@2.0.2: {} + + require-main-filename@2.0.0: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.17.0: + dependencies: + path-parse: 1.0.7 + + resolve@1.19.0: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@2.7.1: + dependencies: + glob: 7.2.3 + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + ripemd160@2.0.2: + dependencies: + hash-base: 3.1.0 + inherits: 2.0.4 + + rlp@2.2.7: + dependencies: + bn.js: 5.2.1 + + robust-predicates@3.0.2: {} + + rollup@4.16.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.16.2 + '@rollup/rollup-android-arm64': 4.16.2 + '@rollup/rollup-darwin-arm64': 4.16.2 + '@rollup/rollup-darwin-x64': 4.16.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.16.2 + '@rollup/rollup-linux-arm-musleabihf': 4.16.2 + '@rollup/rollup-linux-arm64-gnu': 4.16.2 + '@rollup/rollup-linux-arm64-musl': 4.16.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.16.2 + '@rollup/rollup-linux-riscv64-gnu': 4.16.2 + '@rollup/rollup-linux-s390x-gnu': 4.16.2 + '@rollup/rollup-linux-x64-gnu': 4.16.2 + '@rollup/rollup-linux-x64-musl': 4.16.2 + '@rollup/rollup-win32-arm64-msvc': 4.16.2 + '@rollup/rollup-win32-ia32-msvc': 4.16.2 + '@rollup/rollup-win32-x64-msvc': 4.16.2 + fsevents: 2.3.3 + + run-applescript@5.0.0: + dependencies: + execa: 5.1.1 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rw@1.3.3: {} + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + scheduler@0.23.0: + dependencies: + loose-envify: 1.4.0 + + scrypt-js@3.0.1: {} + + secp256k1@4.0.3: + dependencies: + elliptic: 6.5.5 + node-addon-api: 2.0.2 + node-gyp-build: 4.8.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.0: + dependencies: + lru-cache: 6.0.0 + + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + + set-blocking@2.0.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setimmediate@1.0.5: {} + + setprototypeof@1.2.0: {} + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + shallowequal@1.1.0: {} + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + signal-exit@3.0.7: {} + + sinon@14.0.2: + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 9.1.2 + '@sinonjs/samsam': 7.0.1 + diff: 5.2.0 + nise: 5.1.9 + supports-color: 7.2.0 + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + solc@0.7.3(debug@4.3.4): + dependencies: + command-exists: 1.2.9 + commander: 3.0.2 + follow-redirects: 1.15.6(debug@4.3.4) + fs-extra: 0.30.0 + js-sha3: 0.8.0 + memorystream: 0.3.1 + require-from-string: 2.0.2 + semver: 5.7.2 + tmp: 0.0.33 + transitivePeerDependencies: + - debug + + source-map-js@1.2.0: {} + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + spdx-license-ids@3.0.17: {} + + split2@3.2.2: + dependencies: + readable-stream: 3.6.2 + + sprintf-js@1.0.3: {} + + stacktrace-parser@0.1.10: + dependencies: + type-fest: 0.7.1 + + statuses@2.0.1: {} + + string-argv@0.3.2: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-hex-prefix@1.0.0: + dependencies: + is-hex-prefixed: 1.0.0 + + strip-indent@4.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strtok3@7.0.0: + dependencies: + '@tokenizer/token': 0.3.0 + peek-readable: 5.0.0 + + styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0): + dependencies: + '@babel/helper-module-imports': 7.24.3 + '@babel/traverse': 7.24.1(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.2.2 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.24.4)(styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0)) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 16.13.1 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + stylis@4.3.1: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + table@6.8.2: + dependencies: + ajv: 8.12.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tapable@2.2.1: {} + + temp-dir@3.0.0: {} + + tempy@3.1.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + through2@4.0.2: + dependencies: + readable-stream: 3.6.2 + + titleize@3.0.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + token-types@5.0.1: + dependencies: + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 + + trim-newlines@4.1.1: {} + + ts-dedent@2.2.0: {} + + ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5): + 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.15.13 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.4.0: {} + + tsort@0.0.1: {} + + tsutils@3.21.0(typescript@5.4.5): + dependencies: + tslib: 1.14.1 + typescript: 5.4.5 + + tweetnacl-util@0.15.1: {} + + tweetnacl@1.0.3: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.7.1: {} + + type-fest@0.8.1: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-fest@3.13.1: {} + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + + typescript@5.3.3: {} + + typescript@5.4.5: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + undici@5.28.4: + dependencies: + '@fastify/busboy': 2.1.1 + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.10 + + universalify@0.1.2: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + untildify@4.0.0: {} + + update-browserslist-db@1.0.13(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + util-deprecate@1.0.2: {} + + uuid@8.3.2: {} + + uuid@9.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + v8-compile-cache-lib@3.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validator@13.11.0: {} + + viem@2.9.25(typescript@5.4.5): + dependencies: + '@adraffy/ens-normalize': 1.10.0 + '@noble/curves': 1.2.0 + '@noble/hashes': 1.3.2 + '@scure/bip32': 1.3.2 + '@scure/bip39': 1.2.1 + abitype: 1.0.0(typescript@5.4.5) + isows: 1.0.3(ws@8.13.0) + ws: 8.13.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + vite-plugin-singlefile@2.0.1(rollup@4.16.2)(vite@5.2.10(@types/node@18.15.13)): + dependencies: + micromatch: 4.0.5 + rollup: 4.16.2 + vite: 5.2.10(@types/node@18.15.13) + + vite@5.2.10(@types/node@18.15.13): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.16.2 + optionalDependencies: + '@types/node': 18.15.13 + fsevents: 2.3.3 + + web-worker@1.3.0: {} + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-module@2.0.1: {} + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + widest-line@3.1.0: + dependencies: + string-width: 4.2.3 + + workerpool@6.2.0: {} + + workerpool@6.2.1: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + ws@7.5.9: {} + + ws@8.13.0: {} + + ws@8.5.0: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@20.2.4: {} + + yargs-parser@21.1.1: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + 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: 20.2.4 + + yn@3.1.1: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + z-schema@5.0.5: + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000..dee51e928d --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - "packages/*" From e84cba34f2a4ca31bb151524e325aac1babcd22c Mon Sep 17 00:00:00 2001 From: Zoey Date: Tue, 30 Apr 2024 05:27:44 -0400 Subject: [PATCH 1225/1302] Integrating hardhat-ledger support (#731) Integrated the new `hardhat-ledger` support for controlling its UI display. Ignition now takes control of displaying the messages from the ledger (e.g. "Connect wallet"). Fixes #720 --- packages/hardhat-plugin/src/index.ts | 75 ++++++++++++++- .../src/ui/helpers/calculate-batch-display.ts | 6 +- .../src/ui/pretty-event-handler.ts | 92 ++++++++++++++++++- packages/hardhat-plugin/src/ui/types.ts | 3 + .../ui/helpers/calculate-batch-display.ts | 33 ++++++- ...alculate-deploying-module-panel-display.ts | 3 + .../test/ui/pretty-event-handler.ts | 72 +++++++++++++++ 7 files changed, 275 insertions(+), 9 deletions(-) create mode 100644 packages/hardhat-plugin/test/ui/pretty-event-handler.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 83338842ee..31c6b40f0d 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -6,12 +6,12 @@ import { StatusResult, } from "@nomicfoundation/ignition-core"; import { + ensureDir, + pathExists, + readFile, readdirSync, rm, - pathExists, writeJSON, - ensureDir, - readFile, } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; @@ -257,6 +257,47 @@ ignitionScope const strategyConfig = hre.config.ignition.strategyConfig?.[strategyName]; try { + const ledgerConnectionStart = () => + executionEventListener.ledgerConnectionStart(); + const ledgerConnectionSuccess = () => + executionEventListener.ledgerConnectionSuccess(); + const ledgerConnectionFailure = () => + executionEventListener.ledgerConnectionFailure(); + const ledgerConfirmationStart = () => + executionEventListener.ledgerConfirmationStart(); + const ledgerConfirmationSuccess = () => + executionEventListener.ledgerConfirmationSuccess(); + const ledgerConfirmationFailure = () => + executionEventListener.ledgerConfirmationFailure(); + + try { + await hre.network.provider.send("hardhat_setLedgerOutputEnabled", [ + false, + ]); + + hre.network.provider.once("connection_start", ledgerConnectionStart); + hre.network.provider.once( + "connection_success", + ledgerConnectionSuccess + ); + hre.network.provider.once( + "connection_failure", + ledgerConnectionFailure + ); + hre.network.provider.on( + "confirmation_start", + ledgerConfirmationStart + ); + hre.network.provider.on( + "confirmation_success", + ledgerConfirmationSuccess + ); + hre.network.provider.on( + "confirmation_failure", + ledgerConfirmationFailure + ); + } catch {} + const result = await deploy({ config: hre.config.ignition, provider: hre.network.provider, @@ -273,6 +314,34 @@ ignitionScope hre.config.networks[hre.network.name]?.ignition.maxFeePerGasLimit, }); + try { + await hre.network.provider.send("hardhat_setLedgerOutputEnabled", [ + true, + ]); + + hre.network.provider.off("connection_start", ledgerConnectionStart); + hre.network.provider.off( + "connection_success", + ledgerConnectionSuccess + ); + hre.network.provider.off( + "connection_failure", + ledgerConnectionFailure + ); + hre.network.provider.off( + "confirmation_start", + ledgerConfirmationStart + ); + hre.network.provider.off( + "confirmation_success", + ledgerConfirmationSuccess + ); + hre.network.provider.off( + "confirmation_failure", + ledgerConfirmationFailure + ); + } catch {} + if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { console.log(""); console.log(chalk.bold("Verifying deployed contracts")); diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts index 9d4b5520ce..f5fcb2d4c8 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts @@ -5,7 +5,7 @@ export function calculateBatchDisplay(state: UiState): { height: number; } { const batch = state.batches[state.currentBatch - 1]; - const height = batch.length + 2; + const height = batch.length + (state.ledgerMessageIsDisplayed ? 4 : 2); let text = `Batch #${state.currentBatch}\n`; @@ -16,6 +16,10 @@ export function calculateBatchDisplay(state: UiState): { text += "\n"; + if (state.ledger) { + text += `\n Ledger: ${state.ledgerMessage}\n`; + } + return { text, height }; } diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 84c4ecbda6..63ff43ab50 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -67,9 +67,15 @@ export class PrettyEventHandler implements ExecutionEventListener { maxFeeBumps: 0, gasBumps: {}, strategy: null, + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, }; - constructor(private _deploymentParams: DeploymentParameters = {}) {} + constructor( + private _deploymentParams: DeploymentParameters = {}, + private _disableOutput = false + ) {} public get state(): UiState { return this._uiState; @@ -309,6 +315,77 @@ export class PrettyEventHandler implements ExecutionEventListener { }; } + public ledgerConnectionStart(): void { + this.state = { + ...this.state, + ledger: true, + ledgerMessage: "Connecting wallet", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: true, + }; + } + + public ledgerConnectionSuccess(): void { + this.state = { + ...this.state, + ledgerMessage: "Wallet connected", + }; + + this._redisplayCurrentBatch(); + } + + public ledgerConnectionFailure(): void { + this.state = { + ...this.state, + ledgerMessage: "Wallet connection failed", + }; + + this._redisplayCurrentBatch(); + } + + public ledgerConfirmationStart(): void { + this.state = { + ...this.state, + ledger: true, + ledgerMessage: "Waiting for confirmation on device", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: true, + }; + } + + public ledgerConfirmationSuccess(): void { + this.state = { + ...this.state, + ledgerMessage: "Transaction approved by device", + }; + + this._redisplayCurrentBatch(); + + this.state = { + ...this.state, + ledger: false, + }; + } + + public ledgerConfirmationFailure(): void { + this.state = { + ...this.state, + ledgerMessage: "Transaction confirmation failed", + }; + + this._redisplayCurrentBatch(); + } + private _setFutureStatusInitializedAndRedisplayBatch({ futureId, }: { @@ -330,6 +407,11 @@ export class PrettyEventHandler implements ExecutionEventListener { futureId, this._getFutureStatusFromEventResult(result) ); + + this.state = { + ...this.state, + ledgerMessageIsDisplayed: false, + }; } private _setFutureStatusAndRedisplayBatch( @@ -454,11 +536,13 @@ export class PrettyEventHandler implements ExecutionEventListener { } private _redisplayCurrentBatch() { - const { height, text: batch } = calculateBatchDisplay(this.state); + if (!this._disableOutput) { + const { height, text: batch } = calculateBatchDisplay(this.state); - this._clearUpToHeight(height); + this._clearUpToHeight(height); - console.log(batch); + console.log(batch); + } } private _clearCurrentLine(): void { diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 52eada52da..40e805e47c 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -65,6 +65,9 @@ export interface UiState { maxFeeBumps: number; gasBumps: Record; strategy: string | null; + ledger: boolean; + ledgerMessage: string; + ledgerMessageIsDisplayed: boolean; } export interface AddressMap { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index 6dbea878ce..f77aa8a1f9 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -23,6 +23,9 @@ const exampleState: UiState = { maxFeeBumps: 0, gasBumps: {}, strategy: null, + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, }; describe("ui - calculate batch display", () => { @@ -179,16 +182,44 @@ describe("ui - calculate batch display", () => { expectedText ); }); + + it("should render a batch when using a ledger device", () => { + const expectedText = testFormat(` + Batch #1 + Executing ExampleModule#Token... + + Ledger: Waiting for confirmation on device + `); + + assertBatchText( + [ + { + status: { + type: UiFutureStatusType.UNSTARTED, + }, + futureId: "ExampleModule#Token", + }, + ], + 3, + expectedText, + { + ledger: true, + ledgerMessage: "Waiting for confirmation on device", + } + ); + }); }); function assertBatchText( batch: UiFuture[], expectedHeight: number, - expectedText: string + expectedText: string, + extraState?: Partial ) { const { text: actualText, height } = calculateBatchDisplay({ ...exampleState, batches: [batch], + ...extraState, }); assert.equal(height, expectedHeight); diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index 0615beb4e1..4fe05ab541 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -21,6 +21,9 @@ describe("ui - calculate starting message display", () => { maxFeeBumps: 0, gasBumps: {}, strategy: "basic", + ledger: false, + ledgerMessage: "", + ledgerMessageIsDisplayed: false, }; it("should display the deploying module message", () => { diff --git a/packages/hardhat-plugin/test/ui/pretty-event-handler.ts b/packages/hardhat-plugin/test/ui/pretty-event-handler.ts new file mode 100644 index 0000000000..b3274d1a28 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/pretty-event-handler.ts @@ -0,0 +1,72 @@ +import { assert } from "chai"; + +import { PrettyEventHandler } from "../../src/ui/pretty-event-handler"; + +describe("ui - pretty event handler", () => { + describe("ledger", () => { + it("should set a message on connection start", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionStart(); + + assert.equal(eventHandler.state.ledgerMessage, "Connecting wallet"); + assert.isTrue(eventHandler.state.ledger); + assert.isTrue(eventHandler.state.ledgerMessageIsDisplayed); + }); + + it("should set a message on connection success", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionSuccess(); + + assert.equal(eventHandler.state.ledgerMessage, "Wallet connected"); + }); + + it("should set a message on connection failure", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConnectionFailure(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Wallet connection failed" + ); + }); + + it("should set a message on confirmation start", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationStart(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Waiting for confirmation on device" + ); + assert.isTrue(eventHandler.state.ledger); + assert.isTrue(eventHandler.state.ledgerMessageIsDisplayed); + }); + + it("should set a message on confirmation success", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationSuccess(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Transaction approved by device" + ); + assert.isFalse(eventHandler.state.ledger); + }); + + it("should set a message on confirmation failure", () => { + const eventHandler = new PrettyEventHandler(undefined, true); + + eventHandler.ledgerConfirmationFailure(); + + assert.equal( + eventHandler.state.ledgerMessage, + "Transaction confirmation failed" + ); + }); + }); +}); From 3a5106bd8aa23362d5c5305cf13a6e7a84e6d06b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 24 Apr 2024 02:20:03 -0400 Subject: [PATCH 1226/1302] feat: support configuring maxPriorityFeePerGas Add a config option for `maxPriorityFeePerGas`, to allow the user to override the internal Ignition heuristic. Resolves #728 --- packages/core/src/deploy.ts | 3 +++ .../core/src/internal/execution/jsonrpc-client.ts | 8 ++++++-- .../internal/new-execution/jsonrpc-client.ts | 13 ++++++++++++- .../src/ethers-ignition-helper.ts | 6 ++++++ .../hardhat-plugin-viem/src/viem-ignition-helper.ts | 6 ++++++ packages/hardhat-plugin/src/index.ts | 4 ++++ packages/hardhat-plugin/src/type-extensions.ts | 4 ++++ 7 files changed, 41 insertions(+), 3 deletions(-) diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index 884d58266c..bed82f4016 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -52,6 +52,7 @@ export async function deploy< strategy, strategyConfig, maxFeePerGasLimit, + maxPriorityFeePerGas, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -69,6 +70,7 @@ export async function deploy< strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; }): Promise { const executionStrategy: ExecutionStrategy = resolveStrategy( strategy, @@ -114,6 +116,7 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider, { maxFeePerGasLimit, + maxPriorityFeePerGas, }); const isAutominedNetwork = await checkAutominedNetwork(provider); diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 10350e77e6..15cceb9ea1 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -187,7 +187,10 @@ export interface JsonRpcClient { export class EIP1193JsonRpcClient implements JsonRpcClient { constructor( private readonly _provider: EIP1193Provider, - private readonly _config?: { maxFeePerGasLimit?: bigint } + private readonly _config?: { + maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; + } ) {} public async getChainId(): Promise { @@ -632,7 +635,8 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { // We prioritize EIP-1559 fees over legacy gasPrice fees if (latestBlock.baseFeePerGas !== undefined) { // Logic copied from ethers v6 - const maxPriorityFeePerGas = 1_000_000_000n; // 1gwei + const maxPriorityFeePerGas = + this._config?.maxPriorityFeePerGas ?? 1_000_000_000n; // 1gwei const maxFeePerGas = latestBlock.baseFeePerGas * 2n + maxPriorityFeePerGas; diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 771959fbcb..160044d0ed 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -82,7 +82,7 @@ describe("JSON-RPC client", function () { describe("getNetworkFees", async function () { describe("With an EIP-1559 network (i.e. Hardhat Network)", function () { - it("Should return information about EIP-159 fees", async function () { + it("Should return information about EIP-1559 fees", async function () { const fees = await client.getNetworkFees(); assert("maxFeePerGas" in fees); @@ -106,6 +106,17 @@ describe("JSON-RPC client", function () { /IGN407: The calculated max fee per gas exceeds the configured limit./ ); }); + + it("Should use the configured maxPriorityFeePerGas", async function () { + const client = new EIP1193JsonRpcClient(this.hre.network.provider, { + maxPriorityFeePerGas: 1n, + }); + const fees = await client.getNetworkFees(); + + assert("maxPriorityFeePerGas" in fees); + + assert.equal(fees.maxPriorityFeePerGas, 1n); + }); }); }); diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index d6f9bfbfc8..944ee05be0 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -145,6 +145,12 @@ export class EthersIgnitionHelper { defaultSender, strategy, strategyConfig: resolvedStrategyConfig, + maxFeePerGasLimit: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxFeePerGasLimit, + maxPriorityFeePerGas: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxPriorityFeePerGas, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index e5b46cb0d6..a2a3558823 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -135,6 +135,12 @@ export class ViemIgnitionHelper { defaultSender, strategy, strategyConfig: resolvedStrategyConfig, + maxFeePerGasLimit: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxFeePerGasLimit, + maxPriorityFeePerGas: + this._hre.config.networks[this._hre.network.name]?.ignition + .maxPriorityFeePerGas, }); if (result.type !== DeploymentResultType.SUCCESSFUL_DEPLOYMENT) { diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 31c6b40f0d..44afb8f829 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -50,6 +50,7 @@ extendConfig((config, userConfig) => { config.networks[networkName].ignition = { maxFeePerGasLimit: userNetworkConfig.ignition?.maxFeePerGasLimit, + maxPriorityFeePerGas: userNetworkConfig.ignition?.maxPriorityFeePerGas, }; }); @@ -312,6 +313,9 @@ ignitionScope strategyConfig, maxFeePerGasLimit: hre.config.networks[hre.network.name]?.ignition.maxFeePerGasLimit, + maxPriorityFeePerGas: + hre.config.networks[hre.network.name]?.ignition + .maxPriorityFeePerGas, }); try { diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index 83e570c73f..c87988ef68 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -16,24 +16,28 @@ declare module "hardhat/types/config" { export interface HardhatNetworkUserConfig { ignition?: { maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; }; } export interface HardhatNetworkConfig { ignition: { maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; }; } export interface HttpNetworkUserConfig { ignition?: { maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; }; } export interface HttpNetworkConfig { ignition: { maxFeePerGasLimit?: bigint; + maxPriorityFeePerGas?: bigint; }; } From d4df70cb4af05853799a62683aa01940d87fb454 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 24 Apr 2024 02:41:12 -0400 Subject: [PATCH 1227/1302] return legacy fees for polygon network deployments --- .../src/internal/execution/jsonrpc-client.ts | 12 +++-- .../internal/new-execution/jsonrpc-client.ts | 44 +++++++++++++++++-- packages/hardhat-plugin/test/config.ts | 14 ++++++ .../with-config/hardhat.config.js | 4 ++ 4 files changed, 66 insertions(+), 8 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 15cceb9ea1..b45c1cef9a 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -630,10 +630,14 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { } private async _getNetworkFees(): Promise { - const latestBlock = await this.getLatestBlock(); - - // We prioritize EIP-1559 fees over legacy gasPrice fees - if (latestBlock.baseFeePerGas !== undefined) { + const [latestBlock, chainId] = await Promise.all([ + this.getLatestBlock(), + this.getChainId(), + ]); + + // We prioritize EIP-1559 fees over legacy gasPrice fees, however, + // polygon (chainId 137) requires legacy gasPrice fees so we skip EIP-1559 logic in that case + if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { // Logic copied from ethers v6 const maxPriorityFeePerGas = this._config?.maxPriorityFeePerGas ?? 1_000_000_000n; // 1gwei diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 160044d0ed..48bd95e738 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -108,15 +108,51 @@ describe("JSON-RPC client", function () { }); it("Should use the configured maxPriorityFeePerGas", async function () { - const client = new EIP1193JsonRpcClient(this.hre.network.provider, { - maxPriorityFeePerGas: 1n, - }); - const fees = await client.getNetworkFees(); + const maxFeeClient = new EIP1193JsonRpcClient( + this.hre.network.provider, + { + maxPriorityFeePerGas: 1n, + } + ); + const fees = await maxFeeClient.getNetworkFees(); assert("maxPriorityFeePerGas" in fees); assert.equal(fees.maxPriorityFeePerGas, 1n); }); + + it("Should use return legacy fees when deploying to polygon network (chainId 137)", async function () { + const polygonClient = new EIP1193JsonRpcClient( + { + request: async (req) => { + if (req.method === "eth_chainId") { + return "0x89"; // 137 + } + + if (req.method === "eth_getBlockByNumber") { + return { + number: "0x0", + hash: "0x0", + }; + } + + if (req.method === "eth_gasPrice") { + return "0x1"; + } + + throw new Error(`Unimplemented mock for ${req.method}`); + }, + }, + { + maxPriorityFeePerGas: 1n, + } + ); + const fees = await polygonClient.getNetworkFees(); + + assert("gasPrice" in fees); + + assert.equal(fees.gasPrice, 1n); + }); }); }); diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index b5e565c822..d4a96b4bd4 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -39,6 +39,20 @@ describe("config", () => { }); }); + it("should apply maxFeePerGasLimit", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.maxFeePerGasLimit, + 2n + ); + }); + + it("should apply maxPriorityFeePerGas", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.maxPriorityFeePerGas, + 3n + ); + }); + it("should only have known config", () => { const configOptions: KeyListOf = [ "blockPollingInterval", diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index 73d80cfc70..c1bfe3856f 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -6,6 +6,10 @@ module.exports = { mining: { auto: false, }, + ignition: { + maxFeePerGasLimit: 2n, + maxPriorityFeePerGas: 3n, + }, }, }, ignition: { From b1183a1d4371760304063e5bae21b5271d9b39e7 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 23 Apr 2024 15:09:32 +0100 Subject: [PATCH 1228/1302] feat: add max priority fee per gas from RPC Before falling back to the default max priority fee (currently 1gwei) attempt to call `eth_maxPriorityFeePerGas` as an RPC call and use that if available. If the user has set a `maxPriorityFeePerGas` in config, that takes priority over the RPC call. Resolves #743 --- .../src/internal/execution/jsonrpc-client.ts | 44 +++++++++++++++- .../internal/new-execution/jsonrpc-client.ts | 50 +++++++++++++++++++ 2 files changed, 92 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index b45c1cef9a..8c83774c0e 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -12,6 +12,8 @@ import { } from "./types/jsonrpc"; import { toChecksumFormat } from "./utils/address"; +const DEFAULT_MAX_PRIORITY_FEE_PER_GAS = 1_000_000_000n; + /** * The params to make an `eth_call`. */ @@ -638,9 +640,9 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { // We prioritize EIP-1559 fees over legacy gasPrice fees, however, // polygon (chainId 137) requires legacy gasPrice fees so we skip EIP-1559 logic in that case if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { + const maxPriorityFeePerGas = await this._resolveMaxPriorityFeePerGas(); + // Logic copied from ethers v6 - const maxPriorityFeePerGas = - this._config?.maxPriorityFeePerGas ?? 1_000_000_000n; // 1gwei const maxFeePerGas = latestBlock.baseFeePerGas * 2n + maxPriorityFeePerGas; @@ -659,6 +661,44 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { return { gasPrice: jsonRpcQuantityToBigInt(response) }; } + + /** + * The max fee per gas is needed in the max fee calculation. + * + * It is resolved from config if present, falling back to + * the `eth_maxPriorityFeePerGas` RPC call if supported by the chain, + * and finally falling back to the default max fee per gas. + * + * @returns a max fee per gas based on the config, RPC call, or default value. + */ + private async _resolveMaxPriorityFeePerGas(): Promise { + if (this._config?.maxPriorityFeePerGas !== undefined) { + return this._config?.maxPriorityFeePerGas; + } + + try { + return await this._getMaxPrioirtyFeePerGas(); + } catch { + // the max priority fee RPC call is not supported by + // this chain + } + + return DEFAULT_MAX_PRIORITY_FEE_PER_GAS; + } + + private async _getMaxPrioirtyFeePerGas(): Promise { + const fee = await this._provider.request({ + method: "eth_maxPriorityFeePerGas", + }); + + assertResponseType( + "eth_maxPriorityFeePerGas", + fee, + typeof fee === "string" + ); + + return jsonRpcQuantityToBigInt(fee); + } } /** diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 48bd95e738..c27bfdc56b 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -153,6 +153,56 @@ describe("JSON-RPC client", function () { assert.equal(fees.gasPrice, 1n); }); + + it("Should use the `maxPriorityFeePerGas` from the node if `eth_maxPriorityFeePerGas` is present (and there is no config)", async function () { + // TODO: Hardhat does not support `eth_maxPriorityFeePerGas` yet, when it does, this + // can be removed. + const proxiedProvider = { + ...this.hre.network.provider, + request: async (req: { method: string }) => { + if (req.method === "eth_maxPriorityFeePerGas") { + return "2000000000"; + } + + return this.hre.network.provider.request(req); + }, + }; + + const maxFeeClient = new EIP1193JsonRpcClient(proxiedProvider, { + maxPriorityFeePerGas: undefined, // no config set for maxPriorityFeePerGas + }); + + const fees = await maxFeeClient.getNetworkFees(); + + assert("maxPriorityFeePerGas" in fees); + + assert.equal(fees.maxPriorityFeePerGas, 2_000_000_000n); + }); + + it("Should default to 1gwei for maxPriorityFeePerGas if `eth_maxPriorityFeePerGas` is not available and no config set", async function () { + const proxiedProvider = { + ...this.hre.network.provider, + request: async (req: { method: string }) => { + if (req.method === "eth_maxPriorityFeePerGas") { + throw new Error( + "Method eth_maxPriorityFeePerGas is not supported" + ); + } + + return this.hre.network.provider.request(req); + }, + }; + + const maxFeeClient = new EIP1193JsonRpcClient(proxiedProvider, { + maxPriorityFeePerGas: undefined, // no config set for maxPriorityFeePerGas + }); + + const fees = await maxFeeClient.getNetworkFees(); + + assert("maxPriorityFeePerGas" in fees); + + assert.equal(fees.maxPriorityFeePerGas, 1_000_000_000n); + }); }); }); From a04a34892014e3bbf2db21e09ff6f67e747c149d Mon Sep 17 00:00:00 2001 From: Jim Zhang Date: Thu, 4 Apr 2024 16:04:52 -0400 Subject: [PATCH 1229/1302] feat: support zero gas fee chains Private chains like besu can be run in a zero gas fee mode. We support this by altering the gas fee calculation to detect whether we are on such a chain and return zeroed values. --- .../src/internal/execution/jsonrpc-client.ts | 9 ++++++ .../internal/new-execution/jsonrpc-client.ts | 31 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 8c83774c0e..d5795edb80 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -640,6 +640,15 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { // We prioritize EIP-1559 fees over legacy gasPrice fees, however, // polygon (chainId 137) requires legacy gasPrice fees so we skip EIP-1559 logic in that case if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { + if (latestBlock.baseFeePerGas === 0n) { + // Support zero gas fee chains, such as a private instances + // of blockchains using Besu. + return { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }; + } + const maxPriorityFeePerGas = await this._resolveMaxPriorityFeePerGas(); // Logic copied from ethers v6 diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index c27bfdc56b..83d4a19ee1 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -154,6 +154,37 @@ describe("JSON-RPC client", function () { assert.equal(fees.gasPrice, 1n); }); + it("Should return zero gas fees when deploying to a network with a zero base fee per gas (e.g. private Besu instances)", async function () { + const besuClient = new EIP1193JsonRpcClient({ + request: async (req) => { + if (req.method === "eth_chainId") { + return "0x42"; + } + + if (req.method === "eth_getBlockByNumber") { + return { + number: "0x0", + hash: "0x0", + baseFeePerGas: "0x0", // Set the base fee to zero + }; + } + + if (req.method === "eth_gasPrice") { + return "0x1"; + } + + throw new Error(`Unimplemented mock for ${req.method}`); + }, + }); + + const fees = await besuClient.getNetworkFees(); + + assert.deepStrictEqual(fees, { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }); + }); + it("Should use the `maxPriorityFeePerGas` from the node if `eth_maxPriorityFeePerGas` is present (and there is no config)", async function () { // TODO: Hardhat does not support `eth_maxPriorityFeePerGas` yet, when it does, this // can be removed. From d748a7db0697fcca611bc5ab23438ad05d3951cd Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 1 May 2024 12:46:51 +0100 Subject: [PATCH 1230/1302] chore: bump version to v0.15.2 Update the packages versions and changelogs for the `0.15.2 - 2024-05-02` release. --- CONTRIBUTING.md | 15 +++++++++++---- examples/complete/package.json | 4 ++-- examples/ens/package.json | 4 ++-- examples/sample/package.json | 4 ++-- examples/ts-sample/package.json | 4 ++-- examples/viem-sample/package.json | 4 ++-- packages/core/CHANGELOG.md | 12 ++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/package.json | 2 +- 15 files changed, 77 insertions(+), 19 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a60d89d9a5..a6732f1807 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -94,14 +94,14 @@ To publish ignition: 8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-ethers`. 9. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-viem`. 10. Update the `CHANGELOG.md` under `./packages/ui`. -11. Update the package versions based on semver: `pnpm version --no-git-tag-version --workspaces patch #minor #major` +11. Update the package versions based on semver (manually) - versions are tkept in sync across our packages. 12. Update the version of dependencies: - cores version in hardhat-ui deps -- cores and uis versions in hardhat-ignition devDeps and peerDeps +- cores and uis versions in hardhat-ignition devDeps - examples version of hardhat-ignition -13. Commit the version update `git commit`: +1. Commit the version update `git commit`: ``` chore: bump version to vX.X.X @@ -115,7 +115,14 @@ yyyy-mm-dd` release. 16. On a successful check, `rebase merge` the release branch into `main` 17. Switch to main branch and pull the latest changes 18. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -19. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : `pnpm publish -w @nomicfoundation/ignition-core -w @nomicfoundation/ignition-ui -w @nomicfoundation/hardhat-ignition -w @nomicfoundation/hardhat-ignition-ethers -w @nomicfoundation/hardhat-ignition-viem` +19. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : + +- `cd packages/core && pnpm publish --no-git-check` +- `cd packages/ui && pnpm publish --no-git-check` +- `cd packages/hardhat-plugin && pnpm publish --no-git-check` +- `cd packages/hardhat-plugin-ethers && pnpm publish --no-git-check` +- `cd packages/hardhat-plugin-viem && pnpm publish --no-git-check` + 20. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: ```markdown diff --git a/examples/complete/package.json b/examples/complete/package.json index 91711f6325..33884eb993 100644 --- a/examples/complete/package.json +++ b/examples/complete/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-complete-example", "private": true, - "version": "0.15.1", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ens/package.json b/examples/ens/package.json index a0d94deb00..8957628cd1 100644 --- a/examples/ens/package.json +++ b/examples/ens/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ens-example", "private": true, - "version": "0.15.1", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/sample/package.json b/examples/sample/package.json index 410cba5cbc..083c78bb74 100644 --- a/examples/sample/package.json +++ b/examples/sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-sample-example", "private": true, - "version": "0.15.1", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/ts-sample/package.json b/examples/ts-sample/package.json index d416a1525b..0f7d63b97c 100644 --- a/examples/ts-sample/package.json +++ b/examples/ts-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-ts-sample-example", "private": true, - "version": "0.15.1", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/viem-sample/package.json b/examples/viem-sample/package.json index 8ead476a94..a828c72c64 100644 --- a/examples/viem-sample/package.json +++ b/examples/viem-sample/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-viem-sample-example", "private": true, - "version": "0.15.1", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,ts,md,json}\" \"ignition/modules/*.{js,ts,md,json}\" \"test/*.{js,ts,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-viem": "^0.15.1", + "@nomicfoundation/hardhat-ignition-viem": "workspace:^", "@nomicfoundation/hardhat-network-helpers": "1.0.10", "@nomicfoundation/hardhat-viem": "2.0.0", "chai": "4.4.1", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index e0b2994a93..d625984a1b 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.2 - 2024-05-02 + +### Added + +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + ## 0.15.1 - 2024-04-04 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index d0caaeeee7..99e8a81acb 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.1", + "version": "0.15.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 89f419278e..49b80a87b8 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.2 - 2024-05-02 + +### Added + +- Improved support for deploying via a Ledger Hardware wallet, [see our guide for details](https://hardhat.org/ignition/docs/guides/ledger) ([#720](https://github.com/NomicFoundation/hardhat-ignition/issues/720)) +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + ## 0.15.1 - 2024-04-04 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index deac3e40a3..b15d7ee1e7 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.1", + "version": "0.15.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 5fd68d94c2..9a1ec40de7 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.2 - 2024-05-02 + +### Added + +- Improved support for deploying via a Ledger Hardware wallet, [see our guide for details](https://hardhat.org/ignition/docs/guides/ledger) ([#720](https://github.com/NomicFoundation/hardhat-ignition/issues/720)) +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + ## 0.15.1 - 2024-04-04 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 70b71779b1..9de88d5851 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.1", + "version": "0.15.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 90a671ea08..4c92c2c0da 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.2 - 2024-05-02 + +### Added + +- Improved support for deploying via a Ledger Hardware wallet, [see our guide for details](https://hardhat.org/ignition/docs/guides/ledger) ([#720](https://github.com/NomicFoundation/hardhat-ignition/issues/720)) +- Support `maxPriorityFeePerGas` as a configuration parameter ([#728](https://github.com/NomicFoundation/hardhat-ignition/issues/728)) +- Use RPC call `eth_maxPriorityFeePerGas` in gas fee calculations when available ([#743](https://github.com/NomicFoundation/hardhat-ignition/issues/743)) +- Support zero gas fee chains (like private Besu chains), thanks @jimthematrix ([#730](https://github.com/NomicFoundation/hardhat-ignition/pull/730)) + +### Fixed + +- Use pre-EIP-1559 transactions for Polygon to avoid dropped transactions ([#735](https://github.com/NomicFoundation/hardhat-ignition/issues/735)) + ## 0.15.1 - 2024-04-04 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 498742e388..2088f7539f 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.1", + "version": "0.15.2", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/package.json b/packages/ui/package.json index 76dc3c7104..a5840622e3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.1", + "version": "0.15.2", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From 5629c7c6db5086a83dfd3b7d7f0fa079e73869c4 Mon Sep 17 00:00:00 2001 From: ilhwan Date: Fri, 10 May 2024 03:51:58 +0900 Subject: [PATCH 1231/1302] Exclude BNB Chain from zero fee configuration in gas fee logic (#755) * fix: Exclude BNB Chain from zero fee configuration in gas fee logic This commit updates the gas fee configuration logic to accommodate the BNB Chain (chainId 56). While the BNB Network supports EIP-1559, it reports a `baseFeePerGas` of zero. This adjustment ensures that transactions on the BNB Chain do not mistakenly receive a max fee configuration of zero, which is not appropriate despite the reported base fee. This change maintains the functionality for other chains such as Polygon (chainId 137) that require legacy gasPrice fees, and excludes only BNB Chain from the zero max fee logic. This is crucial for proper transaction fee handling on networks supporting EIP-1559 but reporting a base fee of zero. --- .../src/internal/execution/jsonrpc-client.ts | 2 +- .../internal/new-execution/jsonrpc-client.ts | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index d5795edb80..db597bc6c9 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -640,7 +640,7 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { // We prioritize EIP-1559 fees over legacy gasPrice fees, however, // polygon (chainId 137) requires legacy gasPrice fees so we skip EIP-1559 logic in that case if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { - if (latestBlock.baseFeePerGas === 0n) { + if (latestBlock.baseFeePerGas === 0n && chainId !== 56) { // Support zero gas fee chains, such as a private instances // of blockchains using Besu. return { diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 83d4a19ee1..28d2f80bcb 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -185,6 +185,41 @@ describe("JSON-RPC client", function () { }); }); + it("Should not return zero gas fees for BNB Chain even with a zero base fee", async function () { + const bnbClient = new EIP1193JsonRpcClient({ + request: async (req) => { + if (req.method === "eth_chainId") { + return "0x38"; // BNB Chain ID + } + + if (req.method === "eth_getBlockByNumber") { + return { + number: "0x0", + hash: "0x0", + baseFeePerGas: "0x0", // Set the base fee to zero, testing the exception + }; + } + + if (req.method === "eth_gasPrice") { + return "0x1"; + } + + throw new Error(`Unimplemented mock for ${req.method}`); + }, + }); + + const fees = await bnbClient.getNetworkFees(); + + assert.notDeepEqual( + fees, + { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }, + "Fees should not be zero due to the specific handling for BNB Chain." + ); + }); + it("Should use the `maxPriorityFeePerGas` from the node if `eth_maxPriorityFeePerGas` is present (and there is no config)", async function () { // TODO: Hardhat does not support `eth_maxPriorityFeePerGas` yet, when it does, this // can be removed. From abd644e9b2486b543bb7520d267beb4636e89fbd Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 9 May 2024 20:12:46 +0100 Subject: [PATCH 1232/1302] test: tweak BNB chain test Add comment and more explicit assertion. --- packages/core/src/internal/execution/jsonrpc-client.ts | 9 ++++++--- .../new-api/internal/new-execution/jsonrpc-client.ts | 8 ++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index db597bc6c9..8b4b08636b 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -638,11 +638,14 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { ]); // We prioritize EIP-1559 fees over legacy gasPrice fees, however, - // polygon (chainId 137) requires legacy gasPrice fees so we skip EIP-1559 logic in that case + // polygon (chainId 137) requires legacy gasPrice fees + // so we skip EIP-1559 logic in that case if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { + // Support zero gas fee chains, such as a private instances + // of blockchains using Besu. We explicitly exclude BNB + // Smartchain (chainId 56) from this logic as it is EIP-1559 + // compliant but only sets a maxPriorityFeePerGas. if (latestBlock.baseFeePerGas === 0n && chainId !== 56) { - // Support zero gas fee chains, such as a private instances - // of blockchains using Besu. return { maxFeePerGas: 0n, maxPriorityFeePerGas: 0n, diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 28d2f80bcb..147ebcdd2e 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -210,13 +210,13 @@ describe("JSON-RPC client", function () { const fees = await bnbClient.getNetworkFees(); - assert.notDeepEqual( + assert.deepStrictEqual( fees, { - maxFeePerGas: 0n, - maxPriorityFeePerGas: 0n, + maxFeePerGas: 1_000_000_000n, + maxPriorityFeePerGas: 1_000_000_000n, }, - "Fees should not be zero due to the specific handling for BNB Chain." + "Both max fee and max priority fee should be 1 gwei, as the base fee is 0 for BNB Chain" ); }); From 96f00ae5b066c4790bef35af92c48933718a4470 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 9 May 2024 21:18:41 -0400 Subject: [PATCH 1233/1302] chore: bump version to 0.15.3 Update the packages versions and changelogs for the `0.15.3 - 2024-05-09` release. --- packages/core/CHANGELOG.md | 6 ++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 6 ++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 6 ++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 6 ++++++ packages/hardhat-plugin/package.json | 2 +- 8 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index d625984a1b..0c33f73e1f 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + ## 0.15.2 - 2024-05-02 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index 99e8a81acb..666eded7c2 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.2", + "version": "0.15.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 49b80a87b8..3453f70987 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + ## 0.15.2 - 2024-05-02 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index b15d7ee1e7..4f6867b6b6 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.2", + "version": "0.15.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 9a1ec40de7..58d904fc62 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + ## 0.15.2 - 2024-05-02 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 9de88d5851..1910d68163 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.2", + "version": "0.15.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 4c92c2c0da..a5d0b824a7 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.3 - 2024-05-09 + +### Fixed + +- Exclude BNB Chain from zero fee configuration in gas fee logic, thanks @magicsih ([#755](https://github.com/NomicFoundation/hardhat-ignition/pull/755)) + ## 0.15.2 - 2024-05-02 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 2088f7539f..d3c142404d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.2", + "version": "0.15.3", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", From 5a751097cec3bb140fb611b4d621fa54d2ac207a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 30 Apr 2024 23:36:28 -0400 Subject: [PATCH 1234/1302] reconcile addresses with mismatched casings --- .gitignore | 3 + .../src/internal/execution/utils/address.ts | 9 +- .../helpers/reconcile-arguments.ts | 9 +- .../reconcileArtifactContractDeployment.ts | 49 + .../futures/reconcileNamedContractCall.ts | 83 + .../reconcileNamedContractDeployment.ts | 47 + .../futures/reconcileNamedStaticCall.ts | 77 + pnpm-lock.yaml | 1452 ++++++++++++++++- pnpm-workspace.yaml | 1 + 9 files changed, 1723 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index b5328776b2..c1c475b6a3 100644 --- a/.gitignore +++ b/.gitignore @@ -139,3 +139,6 @@ dist # Webstorm files .idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/core/src/internal/execution/utils/address.ts b/packages/core/src/internal/execution/utils/address.ts index 7ef0c65803..c28efe4659 100644 --- a/packages/core/src/internal/execution/utils/address.ts +++ b/packages/core/src/internal/execution/utils/address.ts @@ -1,11 +1,12 @@ -import { isAddress as ethersIsAddress, getAddress } from "ethers"; - import { assertIgnitionInvariant } from "../../utils/assertions"; /** * Is the string a valid ethereum address? */ -export function isAddress(address: string): boolean { +export function isAddress(address: any): address is string { + const { isAddress: ethersIsAddress } = + require("ethers") as typeof import("ethers"); + return ethersIsAddress(address); } @@ -21,6 +22,8 @@ export function toChecksumFormat(address: string) { `Expected ${address} to be an address` ); + const { getAddress } = require("ethers") as typeof import("ethers"); + return getAddress(address); } diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts index 071c09529d..d697db7bfb 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts @@ -12,6 +12,7 @@ import { ExecutionSateType, StaticCallExecutionState, } from "../../execution/types/execution-state"; +import { isAddress, equalAddresses } from "../../execution/utils/address"; import { ReconciliationContext, ReconciliationFutureResultFailure, @@ -57,7 +58,13 @@ export function reconcileArguments( for (const [i, futureArg] of futureArgs.entries()) { const exStateArg = exStateArgs[i]; - if (!isEqual(futureArg, exStateArg)) { + // if both args are addresses, we need to compare the checksummed versions + // to ensure case discrepancies are ignored + if (isAddress(futureArg) && isAddress(exStateArg)) { + if (!equalAddresses(futureArg, exStateArg)) { + return fail(future, `Argument at index ${i} has been changed`); + } + } else if (!isEqual(futureArg, exStateArg)) { return fail(future, `Argument at index ${i} has been changed`); } } diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts index af5d9e9d73..34e32aeb99 100644 --- a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts @@ -153,6 +153,55 @@ describe("Reconciliation - artifact contract", () => { ]); }); + it("should reconcile an address arg with entirely different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", mockArtifact, [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Contract1", + futureType: FutureType.CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], + }) + ); + }); + + it("should fail to reconcile an address arg with partially different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", mockArtifact, [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + const reconciliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Contract1", + futureType: FutureType.CONTRACT_DEPLOYMENT, + status: ExecutionStatus.STARTED, + constructorArgs: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], + }) + ); + + assert.deepStrictEqual(reconciliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + it("should find changes to libraries unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts index b54cfda657..e9cccd6c8b 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts @@ -253,6 +253,89 @@ describe("Reconciliation - named contract call", () => { ]); }); + it("should reconcile an address arg with entirely different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call( + contract1, + "function1", + ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], + {} + ); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleContractCallState, + id: "Module#Contract1.function1", + futureType: FutureType.CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], + } + ) + ); + }); + + it("should fail to reconcile an address arg with partially different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.call( + contract1, + "function1", + ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], + {} + ); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleContractCallState, + id: "Module#Contract1.function1", + futureType: FutureType.CONTRACT_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1.function1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + it("should find changes to value unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts index 84ec7ed58d..71e71abe7c 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts @@ -190,6 +190,53 @@ describe("Reconciliation - named contract", () => { ]); }); + it("should reconcile an address arg with entirely different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.STARTED, + constructorArgs: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], + }) + ); + }); + + it("should fail to reconcile an address arg with partially different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1", [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + const reconciliationResult = await reconcile( + moduleDefinition, + createDeploymentState({ + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.STARTED, + constructorArgs: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], + }) + ); + + assert.deepStrictEqual(reconciliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + it("should find changes to libraries unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const safeMath = m.library("SafeMath"); diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts index 2b3412b7db..8547241a44 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts @@ -258,6 +258,83 @@ describe("Reconciliation - named static call", () => { ]); }); + it("should reconcile an address arg with entirely different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleStaticCallState, + id: "Module#Contract1.function1", + futureType: FutureType.STATIC_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], + } + ) + ); + }); + + it("should fail to reconcile an address arg with partially different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.staticCall(contract1, "function1", [ + "0x15d34aaf54267db7d7c367839aaf71a00a2c6a65", + ]); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: exampleAddress, + }, + }, + { + ...exampleStaticCallState, + id: "Module#Contract1.function1", + futureType: FutureType.STATIC_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1.function1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + it("should find changes to from unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a235cd3204..40cc42a76e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,21 @@ importers: specifier: ^5.0.2 version: 5.4.5 + examples/sample: + devDependencies: + '@nomicfoundation/hardhat-ignition-ethers': + specifier: workspace:^ + version: link:../../packages/hardhat-plugin-ethers + '@nomicfoundation/hardhat-toolbox': + specifier: 4.0.0 + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prettier-plugin-solidity: + specifier: 1.1.3 + version: 1.1.3(prettier@2.8.8) + packages/core: dependencies: '@ethersproject/address': @@ -626,6 +641,15 @@ packages: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ethereumjs/rlp@4.0.1': + resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} + engines: {node: '>=14'} + hasBin: true + + '@ethereumjs/util@8.1.0': + resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} + engines: {node: '>=14'} + '@ethersproject/abi@5.7.0': resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} @@ -644,6 +668,9 @@ packages: '@ethersproject/base64@5.7.0': resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + '@ethersproject/basex@5.7.0': + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + '@ethersproject/bignumber@5.7.0': resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} @@ -653,9 +680,18 @@ packages: '@ethersproject/constants@5.7.0': resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + '@ethersproject/contracts@5.7.0': + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + '@ethersproject/hash@5.7.0': resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + '@ethersproject/hdnode@5.7.0': + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + + '@ethersproject/json-wallets@5.7.0': + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + '@ethersproject/keccak256@5.7.0': resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} @@ -665,24 +701,48 @@ packages: '@ethersproject/networks@5.7.1': resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + '@ethersproject/pbkdf2@5.7.0': + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + '@ethersproject/properties@5.7.0': resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + '@ethersproject/providers@5.7.2': + resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + + '@ethersproject/random@5.7.0': + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + '@ethersproject/rlp@5.7.0': resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + '@ethersproject/sha2@5.7.0': + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + '@ethersproject/signing-key@5.7.0': resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + '@ethersproject/solidity@5.7.0': + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + '@ethersproject/strings@5.7.0': resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} '@ethersproject/transactions@5.7.0': resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + '@ethersproject/units@5.7.0': + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + + '@ethersproject/wallet@5.7.0': + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + '@ethersproject/web@5.7.1': resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + '@ethersproject/wordlists@5.7.0': + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} @@ -765,6 +825,9 @@ packages: '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + '@noble/curves@1.3.0': + resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -772,6 +835,14 @@ packages: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} + '@noble/hashes@1.3.3': + resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} + engines: {node: '>= 16'} + + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} @@ -859,6 +930,14 @@ packages: c-kzg: optional: true + '@nomicfoundation/hardhat-chai-matchers@2.0.6': + resolution: {integrity: sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.0 + chai: ^4.2.0 + ethers: ^6.1.0 + hardhat: ^2.9.4 + '@nomicfoundation/hardhat-ethers@3.0.5': resolution: {integrity: sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==} peerDependencies: @@ -870,6 +949,27 @@ packages: peerDependencies: hardhat: ^2.9.5 + '@nomicfoundation/hardhat-toolbox@4.0.0': + resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} + peerDependencies: + '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 + '@nomicfoundation/hardhat-ethers': ^3.0.0 + '@nomicfoundation/hardhat-network-helpers': ^1.0.0 + '@nomicfoundation/hardhat-verify': ^2.0.0 + '@typechain/ethers-v6': ^0.5.0 + '@typechain/hardhat': ^9.0.0 + '@types/chai': ^4.2.0 + '@types/mocha': '>=9.1.0' + '@types/node': '>=16.0.0' + chai: ^4.2.0 + ethers: ^6.4.0 + hardhat: ^2.11.0 + hardhat-gas-reporter: ^1.0.8 + solidity-coverage: ^0.8.1 + ts-node: '>=8.0.0' + typechain: ^8.3.0 + typescript: '>=4.5.0' + '@nomicfoundation/hardhat-verify@2.0.6': resolution: {integrity: sha512-oKUI5fl8QC8jysE2LUBHE6rObzEmccJcc4b43Ov7LFMlCBZJE27qoqGIsg/++wX7L8Jdga+bkejPxl8NvsecpQ==} peerDependencies: @@ -1056,12 +1156,18 @@ packages: '@scure/bip32@1.3.2': resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} + '@scure/bip32@1.3.3': + resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} '@scure/bip39@1.2.1': resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} + '@scure/bip39@1.2.2': + resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} @@ -1111,6 +1217,15 @@ packages: '@sinonjs/text-encoding@0.7.2': resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} + '@solidity-parser/parser@0.14.5': + resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + + '@solidity-parser/parser@0.16.2': + resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} + + '@solidity-parser/parser@0.18.0': + resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} @@ -1126,6 +1241,21 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@typechain/ethers-v6@0.5.1': + resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} + peerDependencies: + ethers: 6.x + typechain: ^8.3.2 + typescript: '>=4.7.0' + + '@typechain/hardhat@9.1.0': + resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} + peerDependencies: + '@typechain/ethers-v6': ^0.5.1 + ethers: ^6.1.0 + hardhat: ^2.9.9 + typechain: ^8.3.2 + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -1153,6 +1283,9 @@ packages: '@types/chai@4.3.14': resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + '@types/concat-stream@1.6.1': + resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + '@types/d3-scale-chromatic@3.0.3': resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} @@ -1168,9 +1301,15 @@ packages: '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + '@types/form-data@0.0.33': + resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/glob@7.2.0': + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hoist-non-react-statics@3.3.5': resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} @@ -1192,6 +1331,9 @@ packages: '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/minimatch@5.1.2': + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} @@ -1204,21 +1346,33 @@ packages: '@types/ndjson@2.0.1': resolution: {integrity: sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==} + '@types/node@10.17.60': + resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + '@types/node@8.10.66': + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + '@types/prettier@2.7.3': + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + '@types/react-dom@18.2.25': resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} @@ -1322,6 +1476,9 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + abbrev@1.0.9: + resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + abitype@0.9.10: resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} peerDependencies: @@ -1362,6 +1519,9 @@ packages: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} + aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} @@ -1379,6 +1539,10 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + amdefine@1.0.1: + resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} + engines: {node: '>=0.4.2'} + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -1394,6 +1558,10 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1406,6 +1574,9 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + antlr4ts@0.5.0-alpha.4: + resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1426,6 +1597,14 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-back@3.1.0: + resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} + engines: {node: '>=6'} + + array-back@4.0.2: + resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} + engines: {node: '>=8'} + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} @@ -1438,6 +1617,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} @@ -1458,6 +1641,9 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} @@ -1465,10 +1651,23 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} + async@1.5.2: + resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: @@ -1480,6 +1679,9 @@ packages: base-x@3.0.9: resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -1491,6 +1693,9 @@ packages: blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} + bn.js@4.11.6: + resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} @@ -1583,6 +1788,9 @@ packages: caniuse-lite@1.0.30001612: resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} @@ -1611,6 +1819,9 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -1639,6 +1850,10 @@ packages: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} + cli-table3@0.5.1: + resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} + engines: {node: '>=6'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -1662,9 +1877,25 @@ packages: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} engines: {node: '>=0.1.90'} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + command-line-args@5.2.1: + resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} + engines: {node: '>=4.0.0'} + + command-line-usage@6.1.3: + resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} + engines: {node: '>=8.0.0'} + commander@3.0.2: resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} @@ -1682,6 +1913,10 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -1692,6 +1927,9 @@ packages: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -1708,6 +1946,9 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} @@ -1888,6 +2129,9 @@ packages: dayjs@1.11.10: resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + death@1.1.0: + resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1937,6 +2181,10 @@ packages: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1967,6 +2215,10 @@ packages: delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} @@ -1987,6 +2239,9 @@ packages: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} + difflib@0.2.4: + resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2204,6 +2459,11 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escodegen@1.8.1: + resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} + engines: {node: '>=0.12.0'} + hasBin: true + eslint-config-prettier@8.3.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true @@ -2314,6 +2574,11 @@ packages: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -2327,6 +2592,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} @@ -2339,12 +2608,26 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + + ethereum-bloom-filters@1.1.0: + resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} + ethereum-cryptography@0.1.3: resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + ethereum-cryptography@2.1.3: + resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} @@ -2355,10 +2638,17 @@ packages: resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} engines: {node: '>=10.0.0'} + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@6.12.0: resolution: {integrity: sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ==} engines: {node: '>=14.0.0'} + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -2409,6 +2699,10 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + find-up@2.1.0: resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} engines: {node: '>=4'} @@ -2452,6 +2746,14 @@ packages: resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} engines: {node: '>=8.0.0'} + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + fp-ts@1.19.3: resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} @@ -2469,6 +2771,17 @@ packages: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2506,6 +2819,10 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + get-stdin@9.0.0: resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} engines: {node: '>=12'} @@ -2521,6 +2838,10 @@ packages: get-tsconfig@4.7.3: resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2529,6 +2850,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -2539,6 +2866,14 @@ packages: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -2551,6 +2886,10 @@ packages: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} engines: {node: '>= 0.4'} + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -2568,10 +2907,20 @@ packages: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} engines: {node: '>=4.x'} + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + hardhat@2.22.3: resolution: {integrity: sha512-k8JV2ECWNchD6ahkg2BR5wKVxY0OiKot7fuxiIpRK0frRqyOljcR2vKwgWSLw6YIeDcNNA4xybj7Og7NSxr2hA==} hasBin: true @@ -2587,6 +2936,10 @@ packages: has-bigints@1.0.2: resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -2629,6 +2982,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} @@ -2646,10 +3002,17 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} + http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -2709,6 +3072,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + internal-slot@1.0.7: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} @@ -2720,6 +3086,10 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + io-ts@1.10.4: resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} @@ -2770,6 +3140,10 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -2857,6 +3231,9 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2954,6 +3331,9 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + just-extend@6.2.0: resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} @@ -2985,6 +3365,10 @@ packages: layout-base@1.0.2: resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -3011,6 +3395,9 @@ packages: lodash-es@4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + lodash.clonedeep@4.5.0: resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} @@ -3079,6 +3466,9 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -3106,6 +3496,9 @@ packages: mermaid@10.8.0: resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} @@ -3173,6 +3566,14 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -3209,6 +3610,15 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mnemonist@0.38.5: resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} @@ -3253,12 +3663,18 @@ packages: engines: {node: '>=10'} hasBin: true + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nise@5.1.9: resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} node-addon-api@2.0.2: resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-gyp-build@4.8.0: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true @@ -3277,6 +3693,10 @@ packages: non-layered-tidy-tree-layout@2.0.2: resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + normalize-package-data@3.0.3: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} @@ -3297,11 +3717,19 @@ packages: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + nyc@15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} engines: {node: '>=8.9'} hasBin: true + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.1: resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} @@ -3348,10 +3776,17 @@ packages: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} + ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -3412,6 +3847,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -3468,6 +3906,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -3483,6 +3925,10 @@ packages: resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -3491,23 +3937,42 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} + prettier-plugin-solidity@1.1.3: + resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} + engines: {node: '>=12'} + peerDependencies: + prettier: '>=2.3.0 || >=3.0.0-alpha.0' + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-on-spawn@1.0.0: resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} engines: {node: '>=8'} + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -3568,6 +4033,9 @@ packages: resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} engines: {node: '>=12.20'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -3580,10 +4048,22 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + redent@4.0.0: resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} engines: {node: '>=12'} + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + regexp.prototype.flags@1.5.2: resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} engines: {node: '>= 0.4'} @@ -3592,6 +4072,14 @@ packages: resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} engines: {node: '>=4'} + req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + + req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3603,6 +4091,10 @@ packages: require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3614,6 +4106,9 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} @@ -3669,6 +4164,9 @@ packages: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3679,6 +4177,10 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + scheduler@0.23.0: resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} @@ -3731,6 +4233,9 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -3742,6 +4247,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} @@ -3769,6 +4279,15 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + solidity-comments-extractor@0.0.7: + resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + + solidity-coverage@0.8.12: + resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + source-map-js@1.2.0: resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} @@ -3776,6 +4295,10 @@ packages: source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3814,6 +4337,13 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -3829,9 +4359,16 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -3879,6 +4416,10 @@ packages: stylis@4.3.1: resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -3895,6 +4436,17 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + + sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + table@6.8.2: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} @@ -3918,6 +4470,10 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} @@ -3949,10 +4505,19 @@ packages: resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} engines: {node: '>=12'} + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + ts-dedent@2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} engines: {node: '>=6.10'} + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + ts-node@10.9.1: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -3991,6 +4556,10 @@ packages: tweetnacl@1.0.3: resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -4027,6 +4596,12 @@ packages: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -4046,6 +4621,9 @@ packages: typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} @@ -4056,6 +4634,19 @@ packages: engines: {node: '>=14.17'} hasBin: true + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} @@ -4095,6 +4686,9 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -4167,6 +4761,10 @@ packages: web-worker@1.3.0: resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + which-boxed-primitive@1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} @@ -4177,6 +4775,10 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -4186,6 +4788,17 @@ packages: resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} engines: {node: '>=8'} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + workerpool@6.2.0: resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} @@ -4206,8 +4819,8 @@ packages: write-file-atomic@3.0.3: resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4218,7 +4831,19 @@ packages: utf-8-validate: optional: true - ws@8.13.0: + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.13.0: resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} engines: {node: '>=10.0.0'} peerDependencies: @@ -4570,6 +5195,14 @@ snapshots: '@eslint/js@8.57.0': {} + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.1.3 + micro-ftch: 0.3.1 + '@ethersproject/abi@5.7.0': dependencies: '@ethersproject/address': 5.7.0 @@ -4620,6 +5253,11 @@ snapshots: dependencies: '@ethersproject/bytes': 5.7.0 + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/bignumber@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -4634,6 +5272,19 @@ snapshots: dependencies: '@ethersproject/bignumber': 5.7.0 + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/hash@5.7.0': dependencies: '@ethersproject/abstract-signer': 5.7.0 @@ -4646,6 +5297,37 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + '@ethersproject/keccak256@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -4657,15 +5339,57 @@ snapshots: dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/properties@5.7.0': dependencies: '@ethersproject/logger': 5.7.0 + '@ethersproject/providers@5.7.2': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + '@ethersproject/signing-key@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -4675,6 +5399,15 @@ snapshots: elliptic: 6.5.4 hash.js: 1.1.7 + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/strings@5.7.0': dependencies: '@ethersproject/bytes': 5.7.0 @@ -4693,6 +5426,30 @@ snapshots: '@ethersproject/rlp': 5.7.0 '@ethersproject/signing-key': 5.7.0 + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + '@ethersproject/web@5.7.1': dependencies: '@ethersproject/base64': 5.7.0 @@ -4701,6 +5458,14 @@ snapshots: '@ethersproject/properties': 5.7.0 '@ethersproject/strings': 5.7.0 + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@fastify/busboy@2.1.1': {} '@floating-ui/core@1.6.0': @@ -4811,10 +5576,18 @@ snapshots: dependencies: '@noble/hashes': 1.3.2 + '@noble/curves@1.3.0': + dependencies: + '@noble/hashes': 1.3.3 + '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} + '@noble/hashes@1.3.3': {} + + '@noble/hashes@1.4.0': {} + '@noble/secp256k1@1.7.1': {} '@nodelib/fs.scandir@2.1.5': @@ -4880,6 +5653,17 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 + '@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@types/chai-as-promised': 7.1.8 + chai: 4.4.1 + chai-as-promised: 7.1.1(chai@4.4.1) + deep-eql: 4.1.3 + ethers: 6.12.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + ordinal: 1.0.3 + '@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': dependencies: debug: 4.3.4(supports-color@5.5.0) @@ -4894,6 +5678,26 @@ snapshots: ethereumjs-util: 7.1.5 hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' + : dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-verify': 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@typechain/ethers-v6': 0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)) + '@types/chai': 4.3.14 + '@types/mocha': 9.1.1 + '@types/node': 18.15.13 + chai: 4.4.1 + ethers: 6.12.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + solidity-coverage: 0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + ts-node: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + typechain: 8.3.2(typescript@5.4.5) + typescript: 5.4.5 + '@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': dependencies: '@ethersproject/abi': 5.7.0 @@ -5052,6 +5856,12 @@ snapshots: '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 + '@scure/bip32@1.3.3': + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.6 + '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 @@ -5062,6 +5872,11 @@ snapshots: '@noble/hashes': 1.3.2 '@scure/base': 1.1.6 + '@scure/bip39@1.2.2': + dependencies: + '@noble/hashes': 1.3.3 + '@scure/base': 1.1.6 + '@sentry/core@5.30.0': dependencies: '@sentry/hub': 5.30.0 @@ -5139,6 +5954,16 @@ snapshots: '@sinonjs/text-encoding@0.7.2': {} + '@solidity-parser/parser@0.14.5': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.16.2': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.18.0': {} + '@tokenizer/token@0.3.0': {} '@tsconfig/node10@1.0.11': {} @@ -5149,6 +5974,22 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)': + dependencies: + ethers: 6.12.0 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.4.5) + typechain: 8.3.2(typescript@5.4.5) + typescript: 5.4.5 + + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + ethers: 6.12.0 + fs-extra: 9.1.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + typechain: 8.3.2(typescript@5.4.5) + '@types/argparse@1.0.38': {} '@types/babel__core@7.20.5': @@ -5186,6 +6027,10 @@ snapshots: '@types/chai@4.3.14': {} + '@types/concat-stream@1.6.1': + dependencies: + '@types/node': 18.15.13 + '@types/d3-scale-chromatic@3.0.3': {} '@types/d3-scale@4.0.8': @@ -5200,10 +6045,19 @@ snapshots: '@types/estree@1.0.5': {} + '@types/form-data@0.0.33': + dependencies: + '@types/node': 18.15.13 + '@types/fs-extra@9.0.13': dependencies: '@types/node': 18.15.13 + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.15.13 + '@types/hoist-non-react-statics@3.3.5': dependencies: '@types/react': 18.2.79 @@ -5225,6 +6079,8 @@ snapshots: dependencies: '@types/unist': 2.0.10 + '@types/minimatch@5.1.2': {} + '@types/minimist@1.2.5': {} '@types/mocha@9.1.1': {} @@ -5236,14 +6092,20 @@ snapshots: '@types/node': 18.15.13 '@types/through': 0.0.33 + '@types/node@10.17.60': {} + '@types/node@18.15.13': {} + '@types/node@8.10.66': {} + '@types/normalize-package-data@2.4.4': {} '@types/pbkdf2@3.1.2': dependencies: '@types/node': 18.15.13 + '@types/prettier@2.7.3': {} + '@types/prompts@2.4.9': dependencies: '@types/node': 18.15.13 @@ -5251,6 +6113,8 @@ snapshots: '@types/prop-types@15.7.12': {} + '@types/qs@6.9.15': {} + '@types/react-dom@18.2.25': dependencies: '@types/react': 18.2.79 @@ -5391,6 +6255,8 @@ snapshots: transitivePeerDependencies: - supports-color + abbrev@1.0.9: {} + abitype@0.9.10(typescript@5.4.5): optionalDependencies: typescript: 5.4.5 @@ -5409,6 +6275,8 @@ snapshots: adm-zip@0.4.16: {} + aes-js@3.0.0: {} + aes-js@4.0.0-beta.5: {} agent-base@6.0.2: @@ -5436,6 +6304,9 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + amdefine@1.0.1: + optional: true + ansi-align@3.0.1: dependencies: string-width: 4.2.3 @@ -5448,6 +6319,8 @@ snapshots: dependencies: type-fest: 0.21.3 + ansi-regex@3.0.1: {} + ansi-regex@5.0.1: {} ansi-styles@3.2.1: @@ -5458,6 +6331,8 @@ snapshots: dependencies: color-convert: 2.0.1 + antlr4ts@0.5.0-alpha.4: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -5477,6 +6352,10 @@ snapshots: argparse@2.0.1: {} + array-back@3.1.0: {} + + array-back@4.0.2: {} + array-buffer-byte-length@1.0.1: dependencies: call-bind: 1.0.7 @@ -5493,6 +6372,8 @@ snapshots: array-union@2.1.0: {} + array-uniq@1.0.3: {} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.7 @@ -5529,14 +6410,30 @@ snapshots: arrify@1.0.1: {} + asap@2.0.6: {} + assertion-error@1.1.0: {} astral-regex@2.0.0: {} + async@1.5.2: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.0.0 + axios@1.6.8: + dependencies: + follow-redirects: 1.15.6(debug@4.3.4) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + babel-plugin-styled-components@2.1.4(@babel/core@7.24.4)(styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0)): dependencies: '@babel/helper-annotate-as-pure': 7.22.5 @@ -5554,12 +6451,16 @@ snapshots: dependencies: safe-buffer: 5.2.1 + bech32@1.1.4: {} + big-integer@1.6.52: {} binary-extensions@2.3.0: {} blakejs@1.2.1: {} + bn.js@4.11.6: {} + bn.js@4.12.0: {} bn.js@5.2.1: {} @@ -5666,6 +6567,8 @@ snapshots: caniuse-lite@1.0.30001612: {} + caseless@0.12.0: {} + cbor@8.1.0: dependencies: nofilter: 3.1.0 @@ -5702,6 +6605,8 @@ snapshots: character-entities@2.0.2: {} + charenc@0.0.2: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -5743,6 +6648,13 @@ snapshots: cli-boxes@2.2.1: {} + cli-table3@0.5.1: + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -5769,8 +6681,28 @@ snapshots: colors@1.2.5: {} + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + command-exists@1.2.9: {} + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + commander@3.0.2: {} commander@7.2.0: {} @@ -5782,12 +6714,21 @@ snapshots: concat-map@0.0.1: {} + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + convert-source-map@1.9.0: {} convert-source-map@2.0.0: {} cookie@0.4.2: {} + core-util-is@1.0.3: {} + cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -5817,6 +6758,8 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypt@0.0.2: {} + crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 @@ -6030,6 +6973,8 @@ snapshots: dayjs@1.11.10: {} + death@1.1.0: {} + debug@3.2.7: dependencies: ms: 2.1.3 @@ -6071,6 +7016,8 @@ snapshots: dependencies: type-detect: 4.0.8 + deep-extend@0.6.0: {} + deep-is@0.1.4: {} default-browser-id@3.0.0: @@ -6107,6 +7054,8 @@ snapshots: dependencies: robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} + depd@2.0.0: {} dequal@2.0.3: {} @@ -6117,6 +7066,10 @@ snapshots: diff@5.2.0: {} + difflib@0.2.4: + dependencies: + heap: 0.2.7 + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -6367,6 +7320,15 @@ snapshots: escape-string-regexp@4.0.0: {} + escodegen@1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + eslint-config-prettier@8.3.0(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -6526,6 +7488,8 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + esprima@2.7.3: {} + esprima@4.0.1: {} esquery@1.5.0: @@ -6536,12 +7500,38 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@1.9.3: {} + estraverse@4.3.0: {} estraverse@5.3.0: {} esutils@2.0.3: {} + eth-gas-reporter@0.2.27: + dependencies: + '@solidity-parser/parser': 0.14.5 + axios: 1.6.8 + cli-table3: 0.5.1 + colors: 1.4.0 + ethereum-cryptography: 1.2.0 + ethers: 5.7.2 + fs-readdir-recursive: 1.1.0 + lodash: 4.17.21 + markdown-table: 1.1.3 + mocha: 10.4.0 + req-cwd: 2.0.0 + sha1: 1.1.1 + sync-request: 6.1.0 + transitivePeerDependencies: + - bufferutil + - debug + - utf-8-validate + + ethereum-bloom-filters@1.1.0: + dependencies: + '@noble/hashes': 1.4.0 + ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 @@ -6567,6 +7557,13 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 + ethereum-cryptography@2.1.3: + dependencies: + '@noble/curves': 1.3.0 + '@noble/hashes': 1.3.3 + '@scure/bip32': 1.3.3 + '@scure/bip39': 1.2.2 + ethereumjs-abi@0.6.8: dependencies: bn.js: 4.12.0 @@ -6590,6 +7587,42 @@ snapshots: ethereum-cryptography: 0.1.3 rlp: 2.2.7 + ethers@5.7.2: + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.2 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.1 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + ethers@6.12.0: dependencies: '@adraffy/ens-normalize': 1.10.1 @@ -6603,6 +7636,11 @@ snapshots: - bufferutil - utf-8-validate + ethjs-unit@0.1.6: + dependencies: + bn.js: 4.11.6 + number-to-bn: 1.7.0 + ethjs-util@0.1.6: dependencies: is-hex-prefixed: 1.0.0 @@ -6677,6 +7715,10 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-replace@3.0.0: + dependencies: + array-back: 3.1.0 + find-up@2.1.0: dependencies: locate-path: 2.0.0 @@ -6719,6 +7761,18 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 3.0.7 + form-data@2.5.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + fp-ts@1.19.3: {} fromentries@1.3.2: {} @@ -6743,6 +7797,21 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@9.1.0: + dependencies: + at-least-node: 1.0.0 + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-readdir-recursive@1.1.0: {} + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -6775,6 +7844,8 @@ snapshots: get-package-type@0.1.0: {} + get-port@3.2.0: {} + get-stdin@9.0.0: {} get-stream@6.0.1: {} @@ -6789,6 +7860,11 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 + ghost-testrpc@0.0.2: + dependencies: + chalk: 2.4.2 + node-emoji: 1.11.0 + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6797,6 +7873,23 @@ snapshots: dependencies: is-glob: 4.0.3 + glob@5.0.15: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + glob@7.1.7: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@7.2.0: dependencies: fs.realpath: 1.0.0 @@ -6823,6 +7916,16 @@ snapshots: minimatch: 5.0.1 once: 1.4.0 + global-modules@2.0.0: + dependencies: + global-prefix: 3.0.0 + + global-prefix@3.0.0: + dependencies: + ini: 1.3.8 + kind-of: 6.0.3 + which: 1.3.1 + globals@11.12.0: {} globals@13.24.0: @@ -6833,6 +7936,17 @@ snapshots: dependencies: define-properties: 1.2.1 + globby@10.0.2: + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + glob: 7.2.3 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -6852,8 +7966,29 @@ snapshots: growl@1.10.5: {} + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + hard-rejection@2.1.0: {} + hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + sha1: 1.1.1 + transitivePeerDependencies: + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5): dependencies: '@ethersproject/abi': 5.7.0 @@ -6910,6 +8045,8 @@ snapshots: has-bigints@1.0.2: {} + has-flag@1.0.0: {} + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -6948,6 +8085,8 @@ snapshots: he@1.2.0: {} + heap@0.2.7: {} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 @@ -6968,6 +8107,13 @@ snapshots: html-escaper@2.0.2: {} + http-basic@8.1.3: + dependencies: + caseless: 0.12.0 + concat-stream: 1.6.2 + http-response-object: 3.0.2 + parse-cache-control: 1.0.1 + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -6976,6 +8122,10 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-response-object@3.0.2: + dependencies: + '@types/node': 10.17.60 + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 @@ -7023,6 +8173,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 @@ -7033,6 +8185,8 @@ snapshots: internmap@2.0.3: {} + interpret@1.4.0: {} + io-ts@1.10.4: dependencies: fp-ts: 1.19.3 @@ -7077,6 +8231,8 @@ snapshots: is-extglob@2.1.1: {} + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-glob@4.0.3: @@ -7142,6 +8298,8 @@ snapshots: dependencies: is-docker: 2.2.1 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} @@ -7242,6 +8400,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonschema@1.4.1: {} + just-extend@6.2.0: {} keccak@3.0.4: @@ -7268,6 +8428,11 @@ snapshots: layout-base@1.0.2: {} + levn@0.3.0: + dependencies: + prelude-ls: 1.1.2 + type-check: 0.3.2 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -7294,6 +8459,8 @@ snapshots: lodash-es@4.17.21: {} + lodash.camelcase@4.3.0: {} + lodash.clonedeep@4.5.0: {} lodash.flattendeep@4.4.0: {} @@ -7349,6 +8516,8 @@ snapshots: map-obj@4.3.0: {} + markdown-table@1.1.3: {} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 @@ -7421,6 +8590,8 @@ snapshots: transitivePeerDependencies: - supports-color + micro-ftch@0.3.1: {} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 @@ -7559,6 +8730,12 @@ snapshots: braces: 3.0.2 picomatch: 2.3.1 + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mimic-fn@2.1.0: {} mimic-fn@4.0.0: {} @@ -7589,6 +8766,12 @@ snapshots: minimist@1.2.8: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mkdirp@1.0.4: {} + mnemonist@0.38.5: dependencies: obliterator: 2.0.4 @@ -7665,6 +8848,8 @@ snapshots: split2: 3.2.2 through2: 4.0.2 + neo-async@2.6.2: {} + nise@5.1.9: dependencies: '@sinonjs/commons': 3.0.1 @@ -7675,6 +8860,10 @@ snapshots: node-addon-api@2.0.2: {} + node-emoji@1.11.0: + dependencies: + lodash: 4.17.21 + node-gyp-build@4.8.0: {} node-preload@0.2.1: @@ -7687,6 +8876,10 @@ snapshots: non-layered-tidy-tree-layout@2.0.2: {} + nopt@3.0.6: + dependencies: + abbrev: 1.0.9 + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 @@ -7711,6 +8904,11 @@ snapshots: dependencies: path-key: 4.0.0 + number-to-bn@1.7.0: + dependencies: + bn.js: 4.11.6 + strip-hex-prefix: 1.0.0 + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 @@ -7743,6 +8941,8 @@ snapshots: transitivePeerDependencies: - supports-color + object-assign@4.1.1: {} + object-inspect@1.13.1: {} object-keys@1.1.1: {} @@ -7802,6 +9002,15 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 2.2.0 + optionator@0.8.3: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.3.0 + prelude-ls: 1.1.2 + type-check: 0.3.2 + word-wrap: 1.2.5 + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -7811,6 +9020,8 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + ordinal@1.0.3: {} + os-tmpdir@1.0.2: {} p-limit@1.3.0: @@ -7868,6 +9079,8 @@ snapshots: dependencies: callsites: 3.1.0 + parse-cache-control@1.0.1: {} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.2 @@ -7909,6 +9122,8 @@ snapshots: picomatch@2.3.1: {} + pify@4.0.1: {} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -7923,25 +9138,46 @@ snapshots: picocolors: 1.0.0 source-map-js: 1.2.0 + prelude-ls@1.1.2: {} + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 + prettier-plugin-solidity@1.1.3(prettier@2.8.8): + dependencies: + '@solidity-parser/parser': 0.16.2 + prettier: 2.8.8 + semver: 7.6.0 + solidity-comments-extractor: 0.0.7 + prettier@2.8.8: {} + process-nextick-args@2.0.1: {} + process-on-spawn@1.0.0: dependencies: fromentries: 1.3.2 + promise@8.3.0: + dependencies: + asap: 2.0.6 + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + proxy-from-env@1.1.0: {} + punycode@2.3.1: {} + qs@6.12.1: + dependencies: + side-channel: 1.0.6 + queue-microtask@1.2.3: {} quick-lru@6.1.2: {} @@ -8005,6 +9241,16 @@ snapshots: parse-json: 5.2.0 type-fest: 2.19.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -8019,11 +9265,21 @@ snapshots: dependencies: picomatch: 2.3.1 + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + + recursive-readdir@2.2.3: + dependencies: + minimatch: 3.1.2 + redent@4.0.0: dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 + reduce-flatten@2.0.0: {} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 @@ -8035,18 +9291,30 @@ snapshots: dependencies: es6-error: 4.1.1 + req-cwd@2.0.0: + dependencies: + req-from: 2.0.0 + + req-from@2.0.0: + dependencies: + resolve-from: 3.0.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} require-main-filename@2.0.0: {} + resolve-from@3.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} resolve-pkg-maps@1.0.0: {} + resolve@1.1.7: {} + resolve@1.17.0: dependencies: path-parse: 1.0.7 @@ -8126,6 +9394,8 @@ snapshots: has-symbols: 1.0.3 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-regex-test@1.0.3: @@ -8136,6 +9406,23 @@ snapshots: safer-buffer@2.1.2: {} + sc-istanbul@0.4.6: + dependencies: + abbrev: 1.0.9 + async: 1.5.2 + escodegen: 1.8.1 + esprima: 2.7.3 + glob: 5.0.15 + handlebars: 4.7.8 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + nopt: 3.0.6 + once: 1.4.0 + resolve: 1.1.7 + supports-color: 3.2.3 + which: 1.3.1 + wordwrap: 1.0.0 + scheduler@0.23.0: dependencies: loose-envify: 1.4.0 @@ -8191,6 +9478,11 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + sha1@1.1.1: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + shallowequal@1.1.0: {} shebang-command@2.0.0: @@ -8199,6 +9491,12 @@ snapshots: shebang-regex@3.0.0: {} + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -8241,6 +9539,31 @@ snapshots: transitivePeerDependencies: - debug + solidity-comments-extractor@0.0.7: {} + + solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)): + dependencies: + '@ethersproject/abi': 5.7.0 + '@solidity-parser/parser': 0.18.0 + chalk: 2.4.2 + death: 1.1.0 + difflib: 0.2.4 + fs-extra: 8.1.0 + ghost-testrpc: 0.0.2 + global-modules: 2.0.0 + globby: 10.0.2 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + jsonschema: 1.4.1 + lodash: 4.17.21 + mocha: 10.4.0 + node-emoji: 1.11.0 + pify: 4.0.1 + recursive-readdir: 2.2.3 + sc-istanbul: 0.4.6 + semver: 7.6.0 + shelljs: 0.8.5 + web3-utils: 1.10.4 + source-map-js@1.2.0: {} source-map-support@0.5.21: @@ -8248,6 +9571,11 @@ snapshots: buffer-from: 1.1.2 source-map: 0.6.1 + source-map@0.2.0: + dependencies: + amdefine: 1.0.1 + optional: true + source-map@0.6.1: {} spawn-wrap@2.0.0: @@ -8287,6 +9615,13 @@ snapshots: string-argv@0.3.2: {} + string-format@2.0.0: {} + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -8312,10 +9647,18 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -8363,6 +9706,10 @@ snapshots: stylis@4.3.1: {} + supports-color@3.2.3: + dependencies: + has-flag: 1.0.0 + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -8377,6 +9724,23 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + sync-request@6.1.0: + dependencies: + http-response-object: 3.0.2 + sync-rpc: 1.3.6 + then-request: 6.0.2 + + sync-rpc@1.3.6: + dependencies: + get-port: 3.2.0 + + table-layout@1.0.2: + dependencies: + array-back: 4.0.2 + deep-extend: 0.6.0 + typical: 5.2.0 + wordwrapjs: 4.0.1 + table@6.8.2: dependencies: ajv: 8.12.0 @@ -8404,6 +9768,20 @@ snapshots: text-table@0.2.0: {} + then-request@6.0.2: + dependencies: + '@types/concat-stream': 1.6.1 + '@types/form-data': 0.0.33 + '@types/node': 8.10.66 + '@types/qs': 6.9.15 + caseless: 0.12.0 + concat-stream: 1.6.2 + form-data: 2.5.1 + http-basic: 8.1.3 + http-response-object: 3.0.2 + promise: 8.3.0 + qs: 6.12.1 + through2@4.0.2: dependencies: readable-stream: 3.6.2 @@ -8429,8 +9807,19 @@ snapshots: trim-newlines@4.1.1: {} + ts-command-line-args@2.5.1: + dependencies: + chalk: 4.1.2 + command-line-args: 5.2.1 + command-line-usage: 6.1.3 + string-format: 2.0.0 + ts-dedent@2.2.0: {} + ts-essentials@7.0.3(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -8471,6 +9860,10 @@ snapshots: tweetnacl@1.0.3: {} + type-check@0.3.2: + dependencies: + prelude-ls: 1.1.2 + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -8491,6 +9884,22 @@ snapshots: type-fest@3.13.1: {} + typechain@8.3.2(typescript@5.4.5): + dependencies: + '@types/prettier': 2.7.3 + debug: 4.3.4(supports-color@5.5.0) + fs-extra: 7.0.1 + glob: 7.1.7 + js-sha3: 0.8.0 + lodash: 4.17.21 + mkdirp: 1.0.4 + prettier: 2.8.8 + ts-command-line-args: 2.5.1 + ts-essentials: 7.0.3(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -8527,10 +9936,19 @@ snapshots: dependencies: is-typedarray: 1.0.0 + typedarray@0.0.6: {} + typescript@5.3.3: {} typescript@5.4.5: {} + typical@4.0.0: {} + + typical@5.2.0: {} + + uglify-js@3.17.4: + optional: true + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 @@ -8568,6 +9986,8 @@ snapshots: dependencies: punycode: 2.3.1 + utf8@3.0.0: {} + util-deprecate@1.0.2: {} uuid@8.3.2: {} @@ -8624,6 +10044,17 @@ snapshots: web-worker@1.3.0: {} + web3-utils@1.10.4: + dependencies: + '@ethereumjs/util': 8.1.0 + bn.js: 5.2.1 + ethereum-bloom-filters: 1.1.0 + ethereum-cryptography: 2.1.3 + ethjs-unit: 0.1.6 + number-to-bn: 1.7.0 + randombytes: 2.1.0 + utf8: 3.0.0 + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 @@ -8642,6 +10073,10 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 @@ -8650,6 +10085,15 @@ snapshots: dependencies: string-width: 4.2.3 + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wordwrapjs@4.0.1: + dependencies: + reduce-flatten: 2.0.0 + typical: 5.2.0 + workerpool@6.2.0: {} workerpool@6.2.1: {} @@ -8675,6 +10119,8 @@ snapshots: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + ws@7.4.6: {} + ws@7.5.9: {} ws@8.13.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dee51e928d..a979af2817 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - "packages/*" + - "examples/sample" From 0c230f6af12e50e70332707f25350348c16b934a Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 8 May 2024 02:32:40 -0400 Subject: [PATCH 1235/1302] display better error messages for insufficient funds --- packages/core/src/internal/errors-list.ts | 13 + .../handlers/send-transaction.ts | 26 +- .../helpers/decode-simulation-result.ts | 52 ++ .../helpers/network-interaction-execution.ts | 41 +- .../helpers/network-interaction-execution.ts | 448 +++++++++++++++++- .../src/utils/shouldBeHardhatPluginError.ts | 8 +- .../test/deploy/rerun/rerun-after-kill.ts | 4 +- 7 files changed, 530 insertions(+), 62 deletions(-) create mode 100644 packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts diff --git a/packages/core/src/internal/errors-list.ts b/packages/core/src/internal/errors-list.ts index 96210e61d4..a0697bdacf 100644 --- a/packages/core/src/internal/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -183,6 +183,19 @@ export const ERRORS = { number: 407, message: "The calculated max fee per gas exceeds the configured limit.", }, + INSUFFICIENT_FUNDS_FOR_TRANSFER: { + number: 408, + message: + "Account %sender% has insufficient funds to transfer %amount% wei", + }, + INSUFFICIENT_FUNDS_FOR_DEPLOY: { + number: 409, + message: "Account %sender% has insufficient funds to deploy the contract", + }, + GAS_ESTIMATION_FAILED: { + number: 410, + message: "Gas estimation failed: %error%", + }, }, RECONCILIATION: { INVALID_EXECUTION_STATUS: { diff --git a/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts b/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts index 1df9e52227..d1805c3e26 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts @@ -12,8 +12,6 @@ import { CallStrategyGenerator, DeploymentStrategyGenerator, ExecutionStrategy, - OnchainInteractionResponseType, - SIMULATION_SUCCESS_SIGNAL_TYPE, } from "../../types/execution-strategy"; import { CallExecutionStateCompleteMessage, @@ -23,6 +21,7 @@ import { TransactionSendMessage, } from "../../types/messages"; import { NetworkInteractionType } from "../../types/network-interaction"; +import { decodeSimulationResult } from "../helpers/decode-simulation-result"; import { createExecutionStateCompleteMessageForExecutionsWithOnchainInteractions } from "../helpers/messages-helpers"; import { TRANSACTION_SENT_TYPE, @@ -87,27 +86,8 @@ export async function sendTransaction( jsonRpcClient, exState.from, lastNetworkInteraction, - async (_sender: string) => nonceManager.getNextNonce(_sender), - async (simulationResult) => { - const response = await strategyGenerator.next({ - type: OnchainInteractionResponseType.SIMULATION_RESULT, - result: simulationResult, - }); - - assertIgnitionInvariant( - response.value.type === SIMULATION_SUCCESS_SIGNAL_TYPE || - response.value.type === - ExecutionResultType.STRATEGY_SIMULATION_ERROR || - response.value.type === ExecutionResultType.SIMULATION_ERROR, - `Invalid response received from strategy after a simulation was run before sending a transaction for ExecutionState ${exState.id}` - ); - - if (response.value.type === SIMULATION_SUCCESS_SIGNAL_TYPE) { - return undefined; - } - - return response.value; - } + nonceManager, + decodeSimulationResult(strategyGenerator, exState) ); // If the transaction failed during simulation, we need to revert the nonce allocation diff --git a/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts b/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts new file mode 100644 index 0000000000..473b015212 --- /dev/null +++ b/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts @@ -0,0 +1,52 @@ +import { assertIgnitionInvariant } from "../../../utils/assertions"; +import { + ExecutionResultType, + SimulationErrorExecutionResult, + StrategySimulationErrorExecutionResult, +} from "../../types/execution-result"; +import { + CallExecutionState, + DeploymentExecutionState, + SendDataExecutionState, +} from "../../types/execution-state"; +import { + CallStrategyGenerator, + DeploymentStrategyGenerator, + OnchainInteractionResponseType, + SIMULATION_SUCCESS_SIGNAL_TYPE, +} from "../../types/execution-strategy"; +import { RawStaticCallResult } from "../../types/jsonrpc"; + +export function decodeSimulationResult( + strategyGenerator: DeploymentStrategyGenerator | CallStrategyGenerator, + exState: + | DeploymentExecutionState + | CallExecutionState + | SendDataExecutionState +) { + return async ( + simulationResult: RawStaticCallResult + ): Promise< + | SimulationErrorExecutionResult + | StrategySimulationErrorExecutionResult + | undefined + > => { + const response = await strategyGenerator.next({ + type: OnchainInteractionResponseType.SIMULATION_RESULT, + result: simulationResult, + }); + + assertIgnitionInvariant( + response.value.type === SIMULATION_SUCCESS_SIGNAL_TYPE || + response.value.type === ExecutionResultType.STRATEGY_SIMULATION_ERROR || + response.value.type === ExecutionResultType.SIMULATION_ERROR, + `Invalid response received from strategy after a simulation was run before sending a transaction for ExecutionState ${exState.id}` + ); + + if (response.value.type === SIMULATION_SUCCESS_SIGNAL_TYPE) { + return undefined; + } + + return response.value; + }; +} diff --git a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts index 50691c1f6d..17d03e6d81 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts @@ -5,8 +5,11 @@ * @file */ +import { IgnitionError } from "../../../../errors"; +import { ERRORS } from "../../../errors-list"; import { assertIgnitionInvariant } from "../../../utils/assertions"; import { JsonRpcClient, TransactionParams } from "../../jsonrpc-client"; +import { NonceManager } from "../../nonce-management/json-rpc-nonce-manager"; import { SimulationErrorExecutionResult, StrategySimulationErrorExecutionResult, @@ -96,7 +99,7 @@ export async function sendTransactionForOnchainInteraction( client: JsonRpcClient, sender: string, onchainInteraction: OnchainInteraction, - getNonce: (sender: string) => Promise, + nonceManager: NonceManager, decodeSimulationResult: ( simulationResult: RawStaticCallResult ) => Promise< @@ -113,7 +116,8 @@ export async function sendTransactionForOnchainInteraction( nonce: number; } > { - const nonce = onchainInteraction.nonce ?? (await getNonce(sender)); + const nonce = + onchainInteraction.nonce ?? (await nonceManager.getNextNonce(sender)); const fees = await getNextTransactionFees(client, onchainInteraction); // TODO: Should we check the balance here? Before or after estimating gas? @@ -140,10 +144,6 @@ export async function sendTransactionForOnchainInteraction( // If the gas estimation failed, we simulate the transaction to get information // about why it failed. - // - // TODO: We are catching every error (e.g. network errors) here, which may be - // too broad and make the assertion below fail. We could try to catch only - // estimation errors. const failedEstimateGasSimulationResult = await client.call( paramsWithoutFees, "pending" @@ -153,12 +153,35 @@ export async function sendTransactionForOnchainInteraction( failedEstimateGasSimulationResult ); + if (decoded !== undefined) { + return decoded; + } + + // this is just for type inference assertIgnitionInvariant( - decoded !== undefined, - "Expected failed simulation after having failed to estimate gas" + error instanceof Error, + "Unexpected error type while resolving failed gas estimation" ); - return decoded; + // If the user has tried to transfer funds (i.e. m.send(...)) and they have insufficient funds + if (/insufficient funds for transfer/.test(error.message)) { + throw new IgnitionError( + ERRORS.EXECUTION.INSUFFICIENT_FUNDS_FOR_TRANSFER, + { sender, amount: estimateGasPrams.value.toString() } + ); + } + // if the user has insufficient funds to deploy the contract they're trying to deploy + else if (/contract creation code storage out of gas/.test(error.message)) { + throw new IgnitionError(ERRORS.EXECUTION.INSUFFICIENT_FUNDS_FOR_DEPLOY, { + sender, + }); + } + // catch-all error for all other errors + else { + throw new IgnitionError(ERRORS.EXECUTION.GAS_ESTIMATION_FAILED, { + error: error.message, + }); + } } const transactionParams: TransactionParams = { diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index 755773efb6..c943c062a5 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -4,7 +4,12 @@ import { GetTransactionRetryConfig, monitorOnchainInteraction, } from "../../../../src/internal/execution/future-processor/handlers/monitor-onchain-interaction"; -import { runStaticCall } from "../../../../src/internal/execution/future-processor/helpers/network-interaction-execution"; +import { decodeSimulationResult } from "../../../../src/internal/execution/future-processor/helpers/decode-simulation-result"; +import { + TRANSACTION_SENT_TYPE, + runStaticCall, + sendTransactionForOnchainInteraction, +} from "../../../../src/internal/execution/future-processor/helpers/network-interaction-execution"; import { Block, CallParams, @@ -12,13 +17,22 @@ import { JsonRpcClient, TransactionParams, } from "../../../../src/internal/execution/jsonrpc-client"; +import { NonceManager } from "../../../../src/internal/execution/nonce-management/json-rpc-nonce-manager"; import { TransactionTrackingTimer } from "../../../../src/internal/execution/transaction-tracking-timer"; +import { EvmExecutionResultTypes } from "../../../../src/internal/execution/types/evm-execution"; +import { + ExecutionResultType, + SimulationErrorExecutionResult, +} from "../../../../src/internal/execution/types/execution-result"; import { + CallExecutionState, DeploymentExecutionState, ExecutionSateType, ExecutionStatus, } from "../../../../src/internal/execution/types/execution-state"; +import { CallStrategyGenerator } from "../../../../src/internal/execution/types/execution-strategy"; import { + EIP1559NetworkFees, NetworkFees, RawStaticCallResult, Transaction, @@ -28,6 +42,7 @@ import { import { JournalMessageType } from "../../../../src/internal/execution/types/messages"; import { NetworkInteractionType, + OnchainInteraction, StaticCall, } from "../../../../src/internal/execution/types/network-interaction"; import { FutureType } from "../../../../src/types/module"; @@ -282,59 +297,442 @@ describe("Network interactions", () => { describe("sendTransactionForOnchainInteraction", () => { describe("First transaction", () => { - it("Should allocate a nonce for the onchain interaction's sender", async () => { - // TODO @alcuadrado - }); + class MockJsonRpcClient extends StubJsonRpcClient { + public async getNetworkFees(): Promise { + return { + maxFeePerGas: 0n, + maxPriorityFeePerGas: 0n, + }; + } + + public async estimateGas( + _transactionParams: EstimateGasParams + ): Promise { + return 0n; + } + + public async call( + _callParams: CallParams, + _blockTag: "latest" | "pending" + ): Promise { + return { + customErrorReported: false, + returnData: "0x", + success: true, + }; + } + + public async sendTransaction( + _transactionParams: TransactionParams + ): Promise { + return "0x1234"; + } + } + + class MockNonceManager implements NonceManager { + public calls: Record = {}; + + public async getNextNonce(_address: string): Promise { + this.calls[_address] = this.calls[_address] ?? 0; + this.calls[_address] += 1; + return this.calls[_address] - 1; + } + + public revertNonce(_sender: string): void { + throw new Error("Method not implemented."); + } + } it("Should use the recommended network fees", async () => { - // TODO @alcuadrado + class LocalMockJsonRpcClient extends MockJsonRpcClient { + public storedFees: EIP1559NetworkFees = {} as EIP1559NetworkFees; + + public async getNetworkFees(): Promise { + return { + maxFeePerGas: 100n, + maxPriorityFeePerGas: 50n, + }; + } + + public async sendTransaction( + _transactionParams: TransactionParams + ): Promise { + this.storedFees = _transactionParams.fees as EIP1559NetworkFees; + return "0x1234"; + } + } + + const client = new LocalMockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ); + + assert.equal(client.storedFees.maxFeePerGas, 100n); + assert.equal(client.storedFees.maxPriorityFeePerGas, 50n); + }); + + describe("When allocating a nonce", () => { + it("Should allocate a nonce when the onchainInteraction doesn't have one", async () => { + const client = new MockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ); + + assert.equal(nonceManager.calls[exampleAccounts[0]], 1); + }); + + it("Should use the onchainInteraction nonce if present", async () => { + class LocalMockJsonRpcClient extends MockJsonRpcClient { + public storedNonce: number | undefined; + + public async sendTransaction( + _transactionParams: TransactionParams + ): Promise { + this.storedNonce = _transactionParams.nonce; + return "0x1234"; + } + } + + const client = new LocalMockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + nonce: 5, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ); + + assert.equal(nonceManager.calls[exampleAccounts[0]], undefined); + assert.equal(client.storedNonce, 5); + }); }); describe("When the gas estimation succeeds", () => { describe("When the simulation fails", () => { it("Should return the decoded simulation error", async () => { - // TODO @alcuadrado + class LocalMockJsonRpcClient extends MockJsonRpcClient { + public async call( + _callParams: CallParams, + _blockTag: "latest" | "pending" + ): Promise { + return { + customErrorReported: true, + returnData: "0x1111", + success: false, + }; + } + } + + const client = new LocalMockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + const mockStrategyGenerator = { + next(): { value: SimulationErrorExecutionResult } { + return { + value: { + type: ExecutionResultType.SIMULATION_ERROR, + error: { + type: EvmExecutionResultTypes.REVERT_WITH_REASON, + message: "mock error", + }, + }, + }; + }, + } as unknown as CallStrategyGenerator; + + const mockExecutionState = { + id: "test", + } as unknown as CallExecutionState; + + const result = await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + decodeSimulationResult(mockStrategyGenerator, mockExecutionState) + ); + + // type casting + if ( + result.type !== ExecutionResultType.SIMULATION_ERROR || + result.error.type !== EvmExecutionResultTypes.REVERT_WITH_REASON + ) { + return assert.fail("Unexpected result type"); + } + + assert.equal(result.error.message, "mock error"); }); }); describe("When the simulation succeeds", () => { it("Should send the transaction and return its hash and nonce", async () => { - // TODO @alcuadrado + const client = new MockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + const result = await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ); + + // type casting + if (result.type !== TRANSACTION_SENT_TYPE) { + return assert.fail("Unexpected result type"); + } + + assert.equal(result.nonce, 0); + assert.equal(result.transaction.hash, "0x1234"); }); }); }); describe("When the gas estimation fails", () => { + class LocalMockJsonRpcClient extends MockJsonRpcClient { + public errorMessage: string = "testing failure case"; + + constructor(_errorMessage?: string) { + super(); + this.errorMessage = _errorMessage ?? this.errorMessage; + } + + public async estimateGas( + _transactionParams: EstimateGasParams + ): Promise { + throw new Error(this.errorMessage); + } + + public async call( + _callParams: CallParams, + _blockTag: "latest" | "pending" + ): Promise { + return { + customErrorReported: true, + returnData: "0x1111", + success: false, + }; + } + } + describe("When the simulation fails", () => { it("Should return the decoded simulation error", async () => { - // TODO @alcuadrado + const client = new LocalMockJsonRpcClient(); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + const mockStrategyGenerator = { + next(): { value: SimulationErrorExecutionResult } { + return { + value: { + type: ExecutionResultType.SIMULATION_ERROR, + error: { + type: EvmExecutionResultTypes.REVERT_WITH_REASON, + message: "mock error", + }, + }, + }; + }, + } as unknown as CallStrategyGenerator; + + const mockExecutionState = { + id: "test", + } as unknown as CallExecutionState; + + const result = await sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + decodeSimulationResult(mockStrategyGenerator, mockExecutionState) + ); + + // type casting + if ( + result.type !== ExecutionResultType.SIMULATION_ERROR || + result.error.type !== EvmExecutionResultTypes.REVERT_WITH_REASON + ) { + return assert.fail("Unexpected result type"); + } + + assert.equal(result.error.message, "mock error"); }); }); describe("When the simulation succeeds", () => { - it("Should hit an invariant violation", async () => { - // TODO @alcuadrado + describe("When there are insufficient funds for a transfer", () => { + it("Should throw an error", async () => { + const client = new LocalMockJsonRpcClient( + "insufficient funds for transfer" + ); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await assert.isRejected( + sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ), + /^IGN408/ + ); + }); }); - }); - }); - }); - describe("Follow up transaction", () => { - it("Should reuse the nonce that the onchain interaction has, and not allocate a new one", async () => { - // TODO @alcuadrado - }); + describe("When there are insufficient funds for a deployment", () => { + it("Should throw an error", async () => { + const client = new LocalMockJsonRpcClient( + "contract creation code storage out of gas" + ); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await assert.isRejected( + sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ), + /^IGN409/ + ); + }); + }); - it("Should bump fees and also take recommended network fees into account", async () => { - // TODO @alcuadrado + describe("When the gas estimation fails for any other reason", () => { + it("Should throw an error", async () => { + const client = new LocalMockJsonRpcClient("unknown error"); + const nonceManager = new MockNonceManager(); + + const onchainInteraction: OnchainInteraction = { + to: exampleAccounts[1], + data: "0x", + value: 0n, + id: 1, + type: NetworkInteractionType.ONCHAIN_INTERACTION, + transactions: [], + shouldBeResent: false, + }; + + await assert.isRejected( + sendTransactionForOnchainInteraction( + client, + exampleAccounts[0], + onchainInteraction, + nonceManager, + async () => undefined + ), + /^IGN410/ + ); + }); + }); + }); }); + }); + }); - it("Should re-estimate the gas limit", async () => { - // TODO @alcuadrado - }); + describe("getNextTransactionFees", () => { + it("Should bump fees and also take recommended network fees into account", async () => { + // TODO @zoeyTM + }); - it("Should run a new simulation", async () => { - // TODO @alcuadrado - }); + it("Should re-estimate the gas limit", async () => { + // TODO @zoeyTM }); }); }); diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts index 021c6f1345..f6f69090ff 100644 --- a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts +++ b/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts @@ -9,10 +9,10 @@ import type { IgnitionError } from "@nomicfoundation/ignition-core"; * - If there's an exception that doesn't fit in either category, let's discuss it and review the categories. */ const whitelist = [ - 200, 201, 202, 203, 204, 403, 404, 405, 406, 407, 600, 601, 602, 700, 701, - 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, - 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, 1001, 1002, - 1101, 1102, 1103, + 200, 201, 202, 203, 204, 403, 404, 405, 406, 407, 408, 409, 600, 601, 602, + 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, + 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 800, 900, 1000, + 1001, 1002, 1101, 1102, 1103, ]; export function shouldBeHardhatPluginError(error: IgnitionError): boolean { diff --git a/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts b/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts index 6fb2bed0ee..01c04dc57d 100644 --- a/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts +++ b/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts @@ -15,7 +15,9 @@ import { * * This covers a bug in the nonce mangement code: see #576 */ -describe("execution - rerun after kill", () => { +describe("execution - rerun after kill", function () { + this.timeout(60000); + useFileIgnitionProject("minimal", "rerun-after-kill"); it("should pickup deployment and run contracts to completion", async function () { From 355112935e732269abf05c8e775a1a146f634c94 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 14 May 2024 17:15:11 -0400 Subject: [PATCH 1236/1302] chore: bump version to v0.15.4 Update the packages versions and changelogs for the `0.15.4 - 2024-05-14` release. --- CONTRIBUTING.md | 37 ++++----- package.json | 4 +- packages/core/CHANGELOG.md | 7 ++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 7 ++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 7 ++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 7 ++ packages/hardhat-plugin/package.json | 2 +- packages/ui/package.json | 2 +- pnpm-lock.yaml | 84 ++++++++++++++++++++- pnpm-workspace.yaml | 3 + 13 files changed, 133 insertions(+), 33 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a6732f1807..100d189a29 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -85,7 +85,10 @@ If you are working purely on the documentation, not as a result of a technical c To publish ignition: 1. git fetch, Checkout out `development`, then ensure your branch is up to date `git pull --ff-only` -2. Perform a clean install and build (will lose all uncommitted changes) git clean -fdx ., pnpm install, pnpm build +2. Perform a clean install and build (will lose all uncommitted changes): + - `git clean -fdx .` + - `pnpm install` + - `pnpm build` 3. Run a full check, stopping on failure: `pnpm fullcheck` 4. Confirm the commits represent the features for the release 5. Create a release branch `git checkout -b release/yyyy-mm-dd` @@ -94,14 +97,8 @@ To publish ignition: 8. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-ethers`. 9. Update the `CHANGELOG.md` under `./packages/hardhat-plugin-viem`. 10. Update the `CHANGELOG.md` under `./packages/ui`. -11. Update the package versions based on semver (manually) - versions are tkept in sync across our packages. -12. Update the version of dependencies: - -- cores version in hardhat-ui deps -- cores and uis versions in hardhat-ignition devDeps -- examples version of hardhat-ignition - -1. Commit the version update `git commit`: +11. Update the package versions based on semver (manually) - versions are kept in sync across our packages. +12. Commit the version update `git commit`: ``` chore: bump version to vX.X.X @@ -110,20 +107,12 @@ Update the packages versions and changelogs for the `X.X.X - yyyy-mm-dd` release. ``` -14. Deploy to a local verdaccio instance and test each of the `./examples` based on the new version. -15. Push the release branch and open a pull request on `main`, the PR description should match the changelogs -16. On a successful check, `rebase merge` the release branch into `main` -17. Switch to main branch and pull the latest changes -18. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` -19. Publish `@nomicfoundation/ignition-core`, `@nomicfoundation/ignition-ui`, `@nomicfoundation/hardhat-ignition` and `@nomicfoundation/hardhat-ignition-viem` : - -- `cd packages/core && pnpm publish --no-git-check` -- `cd packages/ui && pnpm publish --no-git-check` -- `cd packages/hardhat-plugin && pnpm publish --no-git-check` -- `cd packages/hardhat-plugin-ethers && pnpm publish --no-git-check` -- `cd packages/hardhat-plugin-viem && pnpm publish --no-git-check` - -20. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: +13. Push the release branch and open a pull request on `main`, the PR description should match the changelogs +14. On a successful check, `rebase merge` the release branch into `main` +15. Switch to `main` branch and pull the latest changes +16. Git tag the version, `g tag -a v0.x.x -m "v0.x.x"` and push the tag `git push --follow-tags` +17. Publish all workspace packages: `pnpm -r publish --no-git-checks` +18. Create a release on github off of the pushed tag, the release notes should match the changelogs followed by a hiring entry: ```markdown --- @@ -131,6 +120,8 @@ yyyy-mm-dd` release. --- ``` +19. Switch to `development` branch and rebase it on `main` to include the new release. Push the rebased `development` branch + ## Manual testing > To knock off the rough edges diff --git a/package.json b/package.json index 177adf58c3..43c49aed5f 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,11 @@ "postlint": "prettier --check *.{md,json} ./config/**/*.{js,json}", "lint:fix": "pnpm --recursive lint:fix", "postlint:fix": "prettier --write *.{md,json} ./config/**/*.{js,json}", - "test": "pnpm --recursive test && pnpm --filter \"./packages/core\" test:integrations", + "test": "pnpm --filter \"./packages/*\" test && pnpm --filter \"./packages/core\" test:integrations", "test:coverage": "pnpm --recursive test:coverage", "test:examples": "pnpm --filter \"./examples/*\" test", "watch": "tsc --build --watch packages/core packages/hardhat-plugin", - "fullcheck": "pnpm build && pnpm lint && pnpm test", + "fullcheck": "pnpm build && pnpm lint && pnpm test && pnpm test:examples", "clean": "pnpm --recursive clean" }, "devDependencies": { diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0c33f73e1f..b8d33eb94e 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + ## 0.15.3 - 2024-05-09 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 666eded7c2..a78d762833 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.3", + "version": "0.15.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 3453f70987..7b704aef83 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + ## 0.15.3 - 2024-05-09 ### Fixed diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 4f6867b6b6..0f398e4c61 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.3", + "version": "0.15.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 58d904fc62..e94fa99e60 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + ## 0.15.3 - 2024-05-09 ### Fixed diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 1910d68163..0dc7e0bac8 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.3", + "version": "0.15.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index a5d0b824a7..38af98a78f 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.4 - 2024-05-14 + +### Fixed + +- Reconcile address parameters with mismatched casings ([#748](https://github.com/NomicFoundation/hardhat-ignition/pull/748)) +- Display better error messages for insufficient funds ([#754](https://github.com/NomicFoundation/hardhat-ignition/pull/754)) + ## 0.15.3 - 2024-05-09 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index d3c142404d..8e094c10bb 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.3", + "version": "0.15.4", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/package.json b/packages/ui/package.json index a5840622e3..3e48b86ff2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.2", + "version": "0.15.4", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 40cc42a76e..ca98b85a58 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -114,6 +114,21 @@ importers: specifier: ^5.0.2 version: 5.4.5 + examples/complete: + devDependencies: + '@nomicfoundation/hardhat-ignition-ethers': + specifier: workspace:^ + version: link:../../packages/hardhat-plugin-ethers + '@nomicfoundation/hardhat-toolbox': + specifier: 4.0.0 + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prettier-plugin-solidity: + specifier: 1.1.3 + version: 1.1.3(prettier@2.8.8) + examples/sample: devDependencies: '@nomicfoundation/hardhat-ignition-ethers': @@ -121,7 +136,43 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prettier-plugin-solidity: + specifier: 1.1.3 + version: 1.1.3(prettier@2.8.8) + + examples/ts-sample: + devDependencies: + '@nomicfoundation/hardhat-ignition-ethers': + specifier: workspace:^ + version: link:../../packages/hardhat-plugin-ethers + '@nomicfoundation/hardhat-toolbox': + specifier: 4.0.0 + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prettier-plugin-solidity: + specifier: 1.1.3 + version: 1.1.3(prettier@2.8.8) + + examples/viem-sample: + devDependencies: + '@nomicfoundation/hardhat-ignition-viem': + specifier: workspace:^ + version: link:../../packages/hardhat-plugin-viem + '@nomicfoundation/hardhat-network-helpers': + specifier: 1.0.10 + version: 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-viem': + specifier: 2.0.0 + version: 2.0.0(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5)) + chai: + specifier: 4.4.1 + version: 4.4.1 hardhat: specifier: ^2.18.0 version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) @@ -944,6 +995,11 @@ packages: ethers: ^6.1.0 hardhat: ^2.0.0 + '@nomicfoundation/hardhat-network-helpers@1.0.10': + resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} + peerDependencies: + hardhat: ^2.9.5 + '@nomicfoundation/hardhat-network-helpers@1.0.9': resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} peerDependencies: @@ -975,6 +1031,13 @@ packages: peerDependencies: hardhat: ^2.0.4 + '@nomicfoundation/hardhat-viem@2.0.0': + resolution: {integrity: sha512-ilXQKTc1jWHqJ66fAN6TIyCRyormoChOn1yQTCGoBQ+G6QcVCu5FTaGL2r0KUOY4IkTohtphK+UXQrKcxQX5Yw==} + peerDependencies: + hardhat: ^2.17.0 + typescript: ~5.0.0 + viem: ^2.7.6 + '@nomicfoundation/hardhat-viem@2.0.1': resolution: {integrity: sha512-C7mSg2MiJekWY2xZYYOdbGmA1+hRKIHoSsh/SeY97mPO6nTha7OEeeg+seecxTekLJW1kqryjCdU8ul+L29v3w==} peerDependencies: @@ -5673,16 +5736,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': dependencies: ethereumjs-util: 7.1.5 hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) - ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' + ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' : dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-network-helpers': 1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) '@nomicfoundation/hardhat-verify': 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) '@typechain/ethers-v6': 0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)) @@ -5713,6 +5781,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5))': + dependencies: + abitype: 0.9.10(typescript@5.4.5) + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + lodash.memoize: 4.1.2 + typescript: 5.4.5 + viem: 2.9.25(typescript@5.4.5) + transitivePeerDependencies: + - zod + '@nomicfoundation/hardhat-viem@2.0.1(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5))': dependencies: abitype: 0.9.10(typescript@5.4.5) diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a979af2817..258238d003 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,6 @@ packages: - "packages/*" + - "examples/complete" - "examples/sample" + - "examples/ts-sample" + - "examples/viem-sample" From ea66c9543fed36f06f50b0cd27bb0f6be91ea2e6 Mon Sep 17 00:00:00 2001 From: John Kane Date: Fri, 24 May 2024 11:40:23 +0100 Subject: [PATCH 1237/1302] chore: bump the version of the ci actions (#765) * chore: bump the version of the ci actions Bring the versions inline with HH. * chore: removing the add to project ci flow We will leverage github's inbuilt workflows instead. * chore: add Issue templates These templates are based on the Hardhat version. The templates auto-add a triaging label. * chore: remove add label flow This is now dealt with through the issue templates. --- .github/ISSUE_TEMPLATE/bug-report.yml | 24 +++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 5 +++ .github/ISSUE_TEMPLATE/feature-request.yml | 17 +++++++++ .github/ISSUE_TEMPLATE/other-issue.md | 6 ++++ .github/workflows/add-issue-to-project.yml | 16 --------- .github/workflows/add-label-to-new-issue.yml | 38 -------------------- .github/workflows/ci.yml | 18 +++++----- 7 files changed, 61 insertions(+), 63 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/bug-report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/feature-request.yml create mode 100644 .github/ISSUE_TEMPLATE/other-issue.md delete mode 100644 .github/workflows/add-issue-to-project.yml delete mode 100644 .github/workflows/add-label-to-new-issue.yml diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml new file mode 100644 index 0000000000..55976f6350 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -0,0 +1,24 @@ +name: Bug report +description: File a bug report +labels: + - "status:triaging" +body: + - type: textarea + id: what-happened + attributes: + label: "What happened?" + description: "A brief description of what happened and what you expected to happen" + validations: + required: true + - type: textarea + id: reproduction-steps + attributes: + label: "Minimal reproduction steps" + description: "Tell us the minimal steps needed to reproduce the bug" + validations: + required: true + - type: input + id: search-terms + attributes: + label: "Search terms" + description: "Include the search terms you used before opening this issue. This will make it easier for others to find it." diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..d7d2f19f64 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Do you need help? + url: https://hardhat.org/hardhat-runner/docs/guides/getting-help + about: Check our guide on how to get help with Hardhat diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml new file mode 100644 index 0000000000..19b102c78d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -0,0 +1,17 @@ +name: Feature request +description: Suggest a new feature +labels: + - "status:triaging" +body: + - type: textarea + id: feature-description + attributes: + label: "Describe the feature" + description: "A description of what you would like us to add to Hardhat Ignition and your use case for it" + validations: + required: true + - type: input + id: search-terms + attributes: + label: "Search terms" + description: "Include the search terms you used before opening this issue. This will make it easier for others to find it." diff --git a/.github/ISSUE_TEMPLATE/other-issue.md b/.github/ISSUE_TEMPLATE/other-issue.md new file mode 100644 index 0000000000..80ca6f7b59 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/other-issue.md @@ -0,0 +1,6 @@ +--- +name: Other issue +about: Other kind of issue. Please don't use this to ask questions. +labels: + - "status:triaging" +--- diff --git a/.github/workflows/add-issue-to-project.yml b/.github/workflows/add-issue-to-project.yml deleted file mode 100644 index 4db90920e5..0000000000 --- a/.github/workflows/add-issue-to-project.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Add issue to project - -on: - issues: - types: [opened] - pull_request_target: - types: [opened] - -jobs: - add-to-project: - runs-on: ubuntu-latest - steps: - - uses: actions/add-to-project@v0.4.0 - with: - project-url: https://github.com/orgs/NomicFoundation/projects/7 - github-token: ${{ secrets.ADD_TO_PROJECT_PAT }} diff --git a/.github/workflows/add-label-to-new-issue.yml b/.github/workflows/add-label-to-new-issue.yml deleted file mode 100644 index e35f68a2b5..0000000000 --- a/.github/workflows/add-label-to-new-issue.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: Add label to new issue - -on: - issues: - types: [opened] - pull_request: - types: [opened] - -jobs: - label-new-issue: - runs-on: ubuntu-latest - permissions: - issues: write - pull-requests: write - steps: - - uses: actions/github-script@v6 - with: - script: | - const issue = await github.rest.issues.get({ - owner: context.issue.owner, - repo: context.issue.repo, - issue_number: context.issue.number - }); - - const statusLabel = issue.data.labels.find(({ name }) => - name.startsWith("status:") - ); - - if (statusLabel === undefined) { - await github.rest.issues.addLabels({ - owner: context.issue.owner, - repo: context.issue.repo, - issue_number: context.issue.number, - labels: ["status:triaging"] - }); - } else { - console.log(`Issue already has a status: ${statusLabel.name}`); - } diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 45f443fe57..463348f530 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -12,11 +12,11 @@ jobs: name: Test Ignition on Windows with Node 18 runs-on: windows-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: pnpm/action-setup@v3 with: version: 9 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: 18 cache: "pnpm" @@ -31,11 +31,11 @@ jobs: name: Test Ignition on MacOS with Node 18 runs-on: macos-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: pnpm/action-setup@v3 with: version: 9 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: 18 cache: "pnpm" @@ -51,13 +51,13 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [18, 20.5] + node: [18, 20] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: pnpm/action-setup@v3 with: version: 9 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} cache: "pnpm" @@ -72,11 +72,11 @@ jobs: name: Lint the project runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: pnpm/action-setup@v3 with: version: 9 - - uses: actions/setup-node@v2 + - uses: actions/setup-node@v4 with: node-version: 18 cache: "pnpm" From c6a3e8ec4099da431b729c0f88edbdb256fb7394 Mon Sep 17 00:00:00 2001 From: Mukul Kolpe Date: Tue, 28 May 2024 20:32:42 +0530 Subject: [PATCH 1238/1302] Exclude BNB Test Chain from zero fee configuration in gas fee logic (#768) Also exclude BNB Test chain from the zero fee gas fee logic calculation. Resolves #763 --------- Co-authored-by: John Kane --- .../src/internal/execution/jsonrpc-client.ts | 11 ++++-- .../internal/new-execution/jsonrpc-client.ts | 35 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 8b4b08636b..535d470881 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -643,9 +643,14 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { // Support zero gas fee chains, such as a private instances // of blockchains using Besu. We explicitly exclude BNB - // Smartchain (chainId 56) from this logic as it is EIP-1559 - // compliant but only sets a maxPriorityFeePerGas. - if (latestBlock.baseFeePerGas === 0n && chainId !== 56) { + // Smartchain (chainId 56) and its testnet (chainId 97) + // from this logic as it is EIP-1559 compliant but + // only sets a maxPriorityFeePerGas. + if ( + latestBlock.baseFeePerGas === 0n && + chainId !== 56 && + chainId !== 97 + ) { return { maxFeePerGas: 0n, maxPriorityFeePerGas: 0n, diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index 147ebcdd2e..dd80b117cb 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -220,6 +220,41 @@ describe("JSON-RPC client", function () { ); }); + it("Should not return zero gas fees for BNB Test Chain even with a zero base fee", async function () { + const bnbTestClient = new EIP1193JsonRpcClient({ + request: async (req) => { + if (req.method === "eth_chainId") { + return "0x61"; // BNB Test Chain ID + } + + if (req.method === "eth_getBlockByNumber") { + return { + number: "0x0", + hash: "0x0", + baseFeePerGas: "0x0", // Set the base fee to zero, testing the exception + }; + } + + if (req.method === "eth_gasPrice") { + return "0x1"; + } + + throw new Error(`Unimplemented mock for ${req.method}`); + }, + }); + + const fees = await bnbTestClient.getNetworkFees(); + + assert.deepStrictEqual( + fees, + { + maxFeePerGas: 1_000_000_000n, + maxPriorityFeePerGas: 1_000_000_000n, + }, + "Both max fee and max priority fee should be 1 gwei, as the base fee is 0 for BNB Test Chain" + ); + }); + it("Should use the `maxPriorityFeePerGas` from the node if `eth_maxPriorityFeePerGas` is present (and there is no config)", async function () { // TODO: Hardhat does not support `eth_maxPriorityFeePerGas` yet, when it does, this // can be removed. From 527b7da106985745d722d5c6fe3cabc56db02f86 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 3 Jun 2024 00:26:56 -0400 Subject: [PATCH 1239/1302] loosen type restriction for anvil --- packages/core/src/internal/execution/jsonrpc-client.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 535d470881..c71449f35f 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -286,6 +286,11 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { params: [address, balanceHex], }); + // anvil supports this method, but returns `null` instead of a boolean + if (returnedBalance === null) { + return true; + } + assertResponseType( "hardhat_setBalance", returnedBalance, From 65d67c8a995b408a9d8b055b8830376fe2feb384 Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Jun 2024 13:43:08 +0100 Subject: [PATCH 1240/1302] test: add tests to cover setBalance We need two tests, one to cover the standard HH node behaviour and one to cover the anvil behaviour of returning a null rather than a boolean. --- .../internal/new-execution/jsonrpc-client.ts | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index dd80b117cb..ce35d7fbe6 100644 --- a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -697,6 +697,68 @@ describe("JSON-RPC client", function () { }); }); + describe("setBalance", function () { + it("Should allow setting an account balance against a local hardhat node", async function () { + // Arrange + const balanceBefore = await client.getBalance( + this.accounts[19], + "latest" + ); + + assert.equal(balanceBefore, 10000000000000000000000n); + + // Act + await client.setBalance(this.accounts[19], 99999n); + + // Assert + const balanceAfter = await client.getBalance( + this.accounts[19], + "latest" + ); + + assert.equal(balanceAfter, 99999n); + }); + + it("Should allow setting an account balance against an anvil node", async function () { + // Arrange + + // we create a fake anvil client that will + // correctly set a balance but return null rather + // than a boolean. + const fakeAnvilClient = new EIP1193JsonRpcClient({ + request: async (req) => { + if (req.method === "hardhat_setBalance") { + // Apply setBalance + await this.hre.network.provider.request(req); + + // but return null as anvil would + return null; + } + + return this.hre.network.provider.request(req); + }, + }); + + const balanceBefore = await fakeAnvilClient.getBalance( + this.accounts[19], + "latest" + ); + + assert.equal(balanceBefore, 10000000000000000000000n); + + // Act + await fakeAnvilClient.setBalance(this.accounts[19], 99999n); + + // Assert + const balanceAfter = await fakeAnvilClient.getBalance( + this.accounts[19], + "latest" + ); + + assert.equal(balanceAfter, 99999n); + }); + }); + describe("estimateGas", function () { it("Should return the estimate gas if the tx would succeed", async function () { const estimation = await client.estimateGas({ From 2346e65296617acdc2cde3be4ffa0e361b040ae8 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 2 Jun 2024 23:28:57 -0400 Subject: [PATCH 1241/1302] handle circular imports in verify loop --- packages/core/src/verify.ts | 15 ++++++++++++--- packages/core/test/verify.ts | 27 ++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index 10b50ea0ca..c6793d9be5 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -92,10 +92,17 @@ function resolveChainConfig( return chainConfig; } -function getImportSourceNames( +export function getImportSourceNames( sourceName: string, - buildInfo: BuildInfo + buildInfo: BuildInfo, + visited: Record = {} ): string[] { + if (visited[sourceName]) { + return []; + } + + visited[sourceName] = true; + const contractSource = buildInfo.input.sources[sourceName].content; const { imports } = analyze(contractSource); @@ -109,7 +116,9 @@ function getImportSourceNames( return [ ...importSources, - ...importSources.flatMap((i) => getImportSourceNames(i, buildInfo)), + ...importSources.flatMap((i) => + getImportSourceNames(i, buildInfo, visited) + ), ]; } diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts index e70e75f923..e5b20a82ba 100644 --- a/packages/core/test/verify.ts +++ b/packages/core/test/verify.ts @@ -1,7 +1,8 @@ import { assert } from "chai"; import path from "path"; -import { VerifyResult, getVerificationInformation } from "../src"; +import { BuildInfo, VerifyResult, getVerificationInformation } from "../src"; +import { getImportSourceNames } from "../src/verify"; describe("verify", () => { it("should not verify an unitialized deployment", async () => { @@ -201,4 +202,28 @@ describe("verify", () => { assert.deepEqual(actualSources, expectedSources); } }); + + describe("getImportSourceNames", () => { + it("should handle circular imports", () => { + const buildInfo = { + input: { + sources: { + "contracts/A.sol": { + content: 'import "./B.sol";', + }, + "contracts/B.sol": { + content: 'import "./A.sol";', + }, + }, + }, + }; + + const result = getImportSourceNames( + "contracts/A.sol", + buildInfo as unknown as BuildInfo + ); + + assert.deepEqual(result, ["contracts/B.sol", "contracts/A.sol"]); + }); + }); }); From cbf9bae846cd5b822a4d26004ca48eac13ea079f Mon Sep 17 00:00:00 2001 From: John Kane Date: Mon, 3 Jun 2024 14:31:34 +0100 Subject: [PATCH 1242/1302] test: refactor to BuildInfo We are attempting to use `any` and testing casting less. remove superfluous type cast --- packages/core/test/verify.ts | 56 ++++++++++++++++++++++++++++++++---- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts index e5b20a82ba..a756b8a461 100644 --- a/packages/core/test/verify.ts +++ b/packages/core/test/verify.ts @@ -204,9 +204,30 @@ describe("verify", () => { }); describe("getImportSourceNames", () => { + const exampleBuildInfo: BuildInfo = { + _format: "hh-sol-artifact-1", + id: "example", + solcVersion: "0.8.19", + solcLongVersion: "0.8.19+commit.7dd6d404", + input: { + language: "Solidity", + settings: { + optimizer: {}, + outputSelection: {}, + }, + sources: {}, + }, + output: { + contracts: {}, + sources: {}, + }, + }; + it("should handle circular imports", () => { - const buildInfo = { + const buildInfo: BuildInfo = { + ...exampleBuildInfo, input: { + ...exampleBuildInfo.input, sources: { "contracts/A.sol": { content: 'import "./B.sol";', @@ -218,12 +239,37 @@ describe("verify", () => { }, }; - const result = getImportSourceNames( - "contracts/A.sol", - buildInfo as unknown as BuildInfo - ); + const result = getImportSourceNames("contracts/A.sol", buildInfo); assert.deepEqual(result, ["contracts/B.sol", "contracts/A.sol"]); }); + + it("should handle indirect circular imports", () => { + const buildInfo: BuildInfo = { + ...exampleBuildInfo, + input: { + ...exampleBuildInfo.input, + sources: { + "contracts/A.sol": { + content: 'import "./B.sol";', + }, + "contracts/B.sol": { + content: 'import "./C.sol";', + }, + "contracts/C.sol": { + content: 'import "./A.sol";', + }, + }, + }, + }; + + const result = getImportSourceNames("contracts/A.sol", buildInfo); + + assert.deepEqual(result, [ + "contracts/B.sol", + "contracts/C.sol", + "contracts/A.sol", + ]); + }); }); }); From b6e88972352f9ef52e24e04caaaf1d6938c5ea2e Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 4 Jun 2024 00:49:11 -0400 Subject: [PATCH 1243/1302] adjust regex for function and event names --- .../internal/utils/identifier-validators.ts | 4 +++- .../test/validations/identifier-validators.ts | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 packages/core/test/validations/identifier-validators.ts diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index 28399c7866..7d006f464d 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -13,8 +13,10 @@ const solidityIdentifierRegex = /^[a-zA-Z$_][a-zA-Z0-9$_]*$/; /** * A regex capturing the solidity identifier rule but extended to support * the `myfun(uint256,bool)` parameter syntax + * + * This *could* be even stricter, but it works for now and covers obvious mistakes */ -const functionNameRegex = /^[a-zA-Z$_][a-zA-Z0-9$_,()]*$/; +const functionNameRegex = /^[a-zA-Z0-9$_]*(\([a-zA-Z0-9$_,\[\]]*\))?$/; /** * Does the identifier match Ignition's rules for ids. Specifically that they diff --git a/packages/core/test/validations/identifier-validators.ts b/packages/core/test/validations/identifier-validators.ts new file mode 100644 index 0000000000..cef0a5fa6f --- /dev/null +++ b/packages/core/test/validations/identifier-validators.ts @@ -0,0 +1,21 @@ +import { assert } from "chai"; + +import { isValidFunctionOrEventName } from "../../src/internal/utils/identifier-validators"; + +describe("isValidFunctionOrEventName", () => { + it("should return true for valid solidity function names", () => { + assert.isTrue(isValidFunctionOrEventName("myFunction")); + assert.isTrue(isValidFunctionOrEventName("myFunction()")); + assert.isTrue(isValidFunctionOrEventName("myFunction(uint256)")); + assert.isTrue(isValidFunctionOrEventName("myFunction(uint256)")); + assert.isTrue(isValidFunctionOrEventName("myFunction(uint256,bool)")); + assert.isTrue(isValidFunctionOrEventName("myFunction(uint256[],bool)")); + }); + + it("should return false for invalid solidity function names", () => { + assert.isFalse(isValidFunctionOrEventName("myFunction(")); + assert.isFalse(isValidFunctionOrEventName("myFunction(uint)256")); + assert.isFalse(isValidFunctionOrEventName("myFunction(uint256")); + assert.isFalse(isValidFunctionOrEventName("myFunctionuint256)")); + }); +}); From af40dfdcb9d87ce2e3d44b05cec1cb106f119e03 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 5 Jun 2024 10:54:16 -0400 Subject: [PATCH 1244/1302] update regex --- packages/core/src/internal/utils/identifier-validators.ts | 2 +- packages/core/test/validations/identifier-validators.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index 7d006f464d..9ceee0dad2 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -16,7 +16,7 @@ const solidityIdentifierRegex = /^[a-zA-Z$_][a-zA-Z0-9$_]*$/; * * This *could* be even stricter, but it works for now and covers obvious mistakes */ -const functionNameRegex = /^[a-zA-Z0-9$_]*(\([a-zA-Z0-9$_,\[\]]*\))?$/; +const functionNameRegex = /^[a-zA-Z0-9$_]+(\([a-zA-Z0-9$_,\[\]]*\))?$/; /** * Does the identifier match Ignition's rules for ids. Specifically that they diff --git a/packages/core/test/validations/identifier-validators.ts b/packages/core/test/validations/identifier-validators.ts index cef0a5fa6f..da978efca6 100644 --- a/packages/core/test/validations/identifier-validators.ts +++ b/packages/core/test/validations/identifier-validators.ts @@ -17,5 +17,6 @@ describe("isValidFunctionOrEventName", () => { assert.isFalse(isValidFunctionOrEventName("myFunction(uint)256")); assert.isFalse(isValidFunctionOrEventName("myFunction(uint256")); assert.isFalse(isValidFunctionOrEventName("myFunctionuint256)")); + assert.isFalse(isValidFunctionOrEventName("(uint256)")); }); }); From fde57fd59bc8b1f860e38c533250de27599c3634 Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 6 Jun 2024 10:18:51 +0100 Subject: [PATCH 1245/1302] test: tweak to regex The Solidity grammar suggests that the first character of an identifier must be a letter. It is arguable therefore, that we should do that for the args list, but I think this increment in precision is enough. See https://docs.soliditylang.org/en/v0.8.26/grammar.html#a4.SolidityLexer.Identifier --- .../core/src/internal/utils/identifier-validators.ts | 3 ++- packages/core/test/validations/identifier-validators.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/core/src/internal/utils/identifier-validators.ts index 9ceee0dad2..0ae43a557a 100644 --- a/packages/core/src/internal/utils/identifier-validators.ts +++ b/packages/core/src/internal/utils/identifier-validators.ts @@ -16,7 +16,8 @@ const solidityIdentifierRegex = /^[a-zA-Z$_][a-zA-Z0-9$_]*$/; * * This *could* be even stricter, but it works for now and covers obvious mistakes */ -const functionNameRegex = /^[a-zA-Z0-9$_]+(\([a-zA-Z0-9$_,\[\]]*\))?$/; +const functionNameRegex = + /^[a-zA-Z$_][a-zA-Z0-9$_]*(\([a-zA-Z0-9$_,\[\]]*\))?$/; /** * Does the identifier match Ignition's rules for ids. Specifically that they diff --git a/packages/core/test/validations/identifier-validators.ts b/packages/core/test/validations/identifier-validators.ts index da978efca6..8fbc3de3da 100644 --- a/packages/core/test/validations/identifier-validators.ts +++ b/packages/core/test/validations/identifier-validators.ts @@ -4,19 +4,28 @@ import { isValidFunctionOrEventName } from "../../src/internal/utils/identifier- describe("isValidFunctionOrEventName", () => { it("should return true for valid solidity function names", () => { + assert.isTrue(isValidFunctionOrEventName("a")); + assert.isTrue(isValidFunctionOrEventName("aa")); + assert.isTrue(isValidFunctionOrEventName("a1")); assert.isTrue(isValidFunctionOrEventName("myFunction")); assert.isTrue(isValidFunctionOrEventName("myFunction()")); + assert.isTrue(isValidFunctionOrEventName("myFunction123()")); assert.isTrue(isValidFunctionOrEventName("myFunction(uint256)")); assert.isTrue(isValidFunctionOrEventName("myFunction(uint256)")); assert.isTrue(isValidFunctionOrEventName("myFunction(uint256,bool)")); + assert.isTrue(isValidFunctionOrEventName("myFunction(uint256[])")); assert.isTrue(isValidFunctionOrEventName("myFunction(uint256[],bool)")); }); it("should return false for invalid solidity function names", () => { + assert.isFalse(isValidFunctionOrEventName("1")); + assert.isFalse(isValidFunctionOrEventName("11")); + assert.isFalse(isValidFunctionOrEventName("123myFunction")); assert.isFalse(isValidFunctionOrEventName("myFunction(")); assert.isFalse(isValidFunctionOrEventName("myFunction(uint)256")); assert.isFalse(isValidFunctionOrEventName("myFunction(uint256")); assert.isFalse(isValidFunctionOrEventName("myFunctionuint256)")); assert.isFalse(isValidFunctionOrEventName("(uint256)")); + assert.isFalse(isValidFunctionOrEventName("123(uint256)")); }); }); From 2fa3113ab22ac201dacc0ec7d9dbf6f68e93e4c9 Mon Sep 17 00:00:00 2001 From: Patricio Palladino Date: Fri, 7 Jun 2024 22:14:54 +0000 Subject: [PATCH 1246/1302] Add PR review notifications workflows --- .github/workflows/review-requested-slack-notification.yml | 8 ++++++++ .github/workflows/review-submitted-slack-notification.yml | 8 ++++++++ 2 files changed, 16 insertions(+) create mode 100644 .github/workflows/review-requested-slack-notification.yml create mode 100644 .github/workflows/review-submitted-slack-notification.yml diff --git a/.github/workflows/review-requested-slack-notification.yml b/.github/workflows/review-requested-slack-notification.yml new file mode 100644 index 0000000000..0734a8e907 --- /dev/null +++ b/.github/workflows/review-requested-slack-notification.yml @@ -0,0 +1,8 @@ +name: PR review requested Slack notification +on: + pull_request_target: + types: [review_requested] +jobs: + requested: + uses: NomicFoundation/github-actions-workflows/.github/workflows/review-requested-slack-notification.yml@main + secrets: inherit diff --git a/.github/workflows/review-submitted-slack-notification.yml b/.github/workflows/review-submitted-slack-notification.yml new file mode 100644 index 0000000000..71bbd3352b --- /dev/null +++ b/.github/workflows/review-submitted-slack-notification.yml @@ -0,0 +1,8 @@ +name: PR reviewed Slack notification +on: + pull_request_review: + types: [submitted] +jobs: + reviewed: + uses: NomicFoundation/github-actions-workflows/.github/workflows/review-submitted-slack-notification.yml@main + secrets: inherit From 3675d7005e40fadaa982841138343c333db07bc8 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 16 May 2024 01:43:00 -0400 Subject: [PATCH 1247/1302] add function to encode a function call --- examples/complete/contracts/BasicContract.sol | 6 + .../ignition/modules/CompleteModule.js | 4 +- examples/complete/test/Complete.js | 6 + .../core/src/ignition-module-serializer.ts | 44 +- .../future-processor/future-processor.ts | 4 +- .../helpers/build-initialize-message-for.ts | 36 +- .../helpers/future-resolvers.ts | 37 +- .../helpers/save-artifacts-for-future.ts | 1 + .../get-nonce-sync-messages.ts | 9 +- .../reducers/execution-state-reducer.ts | 5 + .../reducers/helpers/initializers.ts | 23 + .../execution/types/execution-state.ts | 23 +- .../src/internal/execution/types/messages.ts | 14 + .../journal/utils/emitExecutionEvent.ts | 11 + .../core/src/internal/journal/utils/log.ts | 6 + packages/core/src/internal/module-builder.ts | 80 +- packages/core/src/internal/module.ts | 24 +- .../reconcileNamedEncodeFunctionCall.ts | 29 + .../helpers/reconcile-arguments.ts | 8 +- .../reconciliation/helpers/reconcile-data.ts | 14 +- .../helpers/reconcile-function-name.ts | 17 +- .../helpers/reconcile-strategy.ts | 4 + ...concile-future-specific-reconciliations.ts | 8 + .../src/internal/utils/future-id-builders.ts | 2 +- .../validateNamedEncodeFunctionCall.ts | 66 ++ .../core/src/internal/validation/validate.ts | 8 + .../get-pending-nonce-and-sender.ts | 3 +- .../get-pending-onchain-interaction.ts | 3 +- .../views/find-result-for-future-by-id.ts | 8 +- packages/core/src/type-guards.ts | 14 + packages/core/src/types/execution-events.ts | 16 + packages/core/src/types/module-builder.ts | 45 +- packages/core/src/types/module.ts | 23 +- packages/core/src/types/serialization.ts | 16 +- packages/core/test/encodeFunctionCall.ts | 754 ++++++++++++++++++ .../helpers/build-initialize-message-for.ts | 76 ++ .../core/test/ignition-module-serializer.ts | 28 + .../reconcileNamedEncodeFunctionCall.ts | 376 +++++++++ packages/core/test/send.ts | 27 + .../src/ui/pretty-event-handler.ts | 9 + .../src/ui/verbose-event-handler.ts | 11 + .../components/future-batch.tsx | 36 +- packages/ui/src/utils/to-mermaid.ts | 2 + 43 files changed, 1907 insertions(+), 29 deletions(-) create mode 100644 packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts create mode 100644 packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts create mode 100644 packages/core/test/encodeFunctionCall.ts create mode 100644 packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/examples/complete/contracts/BasicContract.sol b/examples/complete/contracts/BasicContract.sol index 60ae041399..13d9a672e4 100644 --- a/examples/complete/contracts/BasicContract.sol +++ b/examples/complete/contracts/BasicContract.sol @@ -5,6 +5,8 @@ pragma solidity ^0.8.9; // import "hardhat/console.sol"; contract BasicContract { + uint public savedArg; + event BasicEvent(uint eventArg); receive() external payable {} @@ -15,4 +17,8 @@ contract BasicContract { emit BasicEvent(funcArg); } + + function otherFunction(uint arg) public payable { + savedArg = arg; + } } diff --git a/examples/complete/ignition/modules/CompleteModule.js b/examples/complete/ignition/modules/CompleteModule.js index 5e5e60221f..345e669c1a 100644 --- a/examples/complete/ignition/modules/CompleteModule.js +++ b/examples/complete/ignition/modules/CompleteModule.js @@ -28,7 +28,9 @@ module.exports = buildModule("CompleteModule", (m) => { { id: "ContractWithLibrary2" } ); - m.send("test_send", duplicate, 123n); + const data = m.encodeFunctionCall(duplicate, "otherFunction", [42n]); + + m.send("test_send", duplicate, 123n, data); return { basic, diff --git a/examples/complete/test/Complete.js b/examples/complete/test/Complete.js index 3ccf6ed72b..3c64ac8f37 100644 --- a/examples/complete/test/Complete.js +++ b/examples/complete/test/Complete.js @@ -41,4 +41,10 @@ describe("Complete", function () { expect(await withLib.readonlyFunction(40)).to.equal(42); }); + + it("Should call the otherFunction with 42", async () => { + const { duplicate } = await loadFixture(deployCompleteFixture); + + expect(await duplicate.savedArg()).to.equal(42); + }); }); diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index ceb475f8f5..11808b00b1 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -10,6 +10,7 @@ import { NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, + NamedEncodeFunctionCallFutureImplementation, NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, ReadEventArgumentFutureImplementation, @@ -24,6 +25,7 @@ import { isAccountRuntimeValue, isAddressResolvableFuture, isContractFuture, + isEncodeFunctionCallFuture, isFuture, isModuleParameterRuntimeValue, isRuntimeValue, @@ -35,6 +37,7 @@ import { ContractCallFuture, ContractDeploymentFuture, ContractFuture, + EncodeFunctionCallFuture, Future, FutureType, IgnitionModule, @@ -63,6 +66,7 @@ import { SerializedNamedContractAtFuture, SerializedNamedContractCallFuture, SerializedNamedContractDeploymentFuture, + SerializedNamedEncodeFunctionCallFuture, SerializedNamedLibraryDeploymentFuture, SerializedNamedStaticCallFuture, SerializedReadEventArgumentFuture, @@ -253,6 +257,21 @@ export class IgnitionModuleSerializer { }; return serializedNamedStaticCallFuture; + case FutureType.ENCODE_FUNCTION_CALL: + const serializedEncodeFunctionCallFuture: SerializedNamedEncodeFunctionCallFuture = + { + id: future.id, + moduleId: future.module.id, + type: future.type, + dependencies: Array.from(future.dependencies).map((d) => + this._convertFutureToFutureToken(d) + ), + contract: this._convertFutureToFutureToken(future.contract), + functionName: future.functionName, + args: future.args.map((arg) => context.argReplacer(arg)), + }; + return serializedEncodeFunctionCallFuture; + case FutureType.NAMED_ARTIFACT_CONTRACT_AT: const serializedNamedContractAtFuture: SerializedNamedContractAtFuture = { @@ -329,7 +348,9 @@ export class IgnitionModuleSerializer { value: isRuntimeValue(future.value) ? this._serializeModuleParamterRuntimeValue(future.value) : this._serializeBigint(future.value), - data: future.data, + data: isEncodeFunctionCallFuture(future.data) + ? this._convertFutureToFutureToken(future.data) + : future.data, from: isRuntimeValue(future.from) ? this._serializeAccountRuntimeValue(future.from) : future.from, @@ -771,6 +792,19 @@ export class IgnitionModuleDeserializer { ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from ); + case FutureType.ENCODE_FUNCTION_CALL: + return new NamedEncodeFunctionCallFutureImplementation( + serializedFuture.id, + mod, + serializedFuture.functionName, + this._lookup( + contractFuturesLookup, + serializedFuture.contract.futureId + ), + serializedFuture.args.map((arg) => + this._deserializeArgument(arg, futuresLookup) + ) + ); case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return new NamedContractAtFutureImplementation( serializedFuture.id, @@ -848,7 +882,13 @@ export class IgnitionModuleDeserializer { serializedFuture.value ) as ModuleParameterRuntimeValue) // This is unsafe, but we only serialize valid values : this._deserializedBigint(serializedFuture.value), - serializedFuture.data, + serializedFuture.data === undefined || + typeof serializedFuture.data === "string" + ? serializedFuture.data + : (this._lookup( + futuresLookup, + serializedFuture.data.futureId + ) as EncodeFunctionCallFuture), this._isSerializedAccountRuntimeValue(serializedFuture.from) ? this._deserializeAccountRuntimeValue(serializedFuture.from) : serializedFuture.from diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index eb1e4046d8..32c2ed4219 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -104,7 +104,9 @@ export class FutureProcessor { assertIgnitionInvariant( exState.type !== ExecutionSateType.CONTRACT_AT_EXECUTION_STATE && exState.type !== - ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE, + ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE && + exState.type !== + ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE, `Unexpected ExectutionState ${exState.id} with type ${exState.type} and status ${exState.status}: it should have been immediately completed` ); diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts index c2b006361a..4c456b7338 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts @@ -8,6 +8,7 @@ import { CallExecutionStateInitializeMessage, ContractAtExecutionStateInitializeMessage, DeploymentExecutionStateInitializeMessage, + EncodeFunctionCallExecutionStateInitializeMessage, JournalMessage, JournalMessageType, ReadEventArgExecutionStateInitializeMessage, @@ -19,6 +20,8 @@ import { resolveAddressForContractFuture, resolveAddressLike, resolveArgs, + resolveEncodeFunctionCallResult, + resolveFutureData, resolveFutureFrom, resolveLibraries, resolveReadEventArgumentResult, @@ -145,6 +148,37 @@ export async function buildInitializeMessageFor( return namedStaticCallInit; } + case FutureType.ENCODE_FUNCTION_CALL: { + const args = resolveArgs( + future.args, + deploymentState, + deploymentParameters, + accounts + ); + + const result = await resolveEncodeFunctionCallResult( + future.contract.id, + future.functionName, + args, + deploymentLoader + ); + + const encodeFunctionCallInit: EncodeFunctionCallExecutionStateInitializeMessage = + _extendBaseInitWith( + JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE, + future, + strategy.name, + strategy.config, + { + args, + functionName: future.functionName, + artifactId: future.contract.id, + result, + } + ); + + return encodeFunctionCallInit; + } case FutureType.NAMED_ARTIFACT_CONTRACT_AT: case FutureType.CONTRACT_AT: { const contractAtInit: ContractAtExecutionStateInitializeMessage = @@ -219,7 +253,7 @@ export async function buildInitializeMessageFor( deploymentState, accounts ), - data: future.data ?? "0x", + data: resolveFutureData(future.data, deploymentState), from: resolveFutureFrom(future.from, accounts, defaultSender), } ); diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts index cae1c658d1..54cc84b9dc 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts @@ -1,5 +1,3 @@ -import { isAddress } from "ethers"; - import { isAccountRuntimeValue, isFuture, @@ -11,6 +9,7 @@ import { AddressResolvableFuture, ArgumentType, ContractFuture, + EncodeFunctionCallFuture, Future, ModuleParameterRuntimeValue, ReadEventArgumentFuture, @@ -117,6 +116,25 @@ export function resolveFutureFrom( return resolveAccountRuntimeValue(from, accounts); } +/** + * Resolve a `send` future's data parameter to a string. + */ +export function resolveFutureData( + data: string | EncodeFunctionCallFuture | undefined, + deploymentState: DeploymentState +): string { + if (data === undefined) { + return "0x"; + } + + if (typeof data === "string") { + return data; + } + + // this type coercion is safe because we know the type of data is EncodeFunctionCallFuture + return findResultForFutureById(deploymentState, data.id) as string; +} + /** * Resolves an account runtime value to an address. */ @@ -221,6 +239,7 @@ export function resolveAddressLike( const result = findResultForFutureById(deploymentState, addressLike.id); + const { isAddress } = require("ethers") as typeof import("ethers"); assertIgnitionInvariant( typeof result === "string" && isAddress(result), `Future '${addressLike.id}' must be a valid address` @@ -272,3 +291,17 @@ export async function resolveReadEventArgumentResult( txToReadFrom: confirmedTx.hash, }; } + +export async function resolveEncodeFunctionCallResult( + artifactId: string, + functionName: string, + args: SolidityParameterType[], + deploymentLoader: DeploymentLoader +): Promise { + const artifact = await deploymentLoader.loadArtifact(artifactId); + + const { Interface } = require("ethers") as typeof import("ethers"); + const iface = new Interface(artifact.abi); + + return iface.encodeFunctionData(functionName, args); +} diff --git a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts index e758ba82ad..a468b5179a 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts @@ -30,6 +30,7 @@ export async function saveArtifactsForFuture( ); case FutureType.CONTRACT_CALL: case FutureType.STATIC_CALL: + case FutureType.ENCODE_FUNCTION_CALL: case FutureType.READ_EVENT_ARGUMENT: case FutureType.SEND_DATA: return; diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts index d9f95c3d87..5562236d66 100644 --- a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts +++ b/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts @@ -3,6 +3,7 @@ import uniq from "lodash/uniq"; import { IgnitionError } from "../../../errors"; import { isArtifactContractAtFuture, + isEncodeFunctionCallFuture, isNamedContractAtFuture, isReadEventArgumentFuture, } from "../../../type-guards"; @@ -251,7 +252,9 @@ function createMapFromSenderToNonceAndTransactions( if ( executionState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE || - executionState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE + executionState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE || + executionState.type === + ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE ) { continue; } @@ -342,5 +345,9 @@ function _pickFrom( return null; } + if (isEncodeFunctionCallFuture(future)) { + return null; + } + return resolveFutureFrom(future.from, accounts, defaultSender); } diff --git a/packages/core/src/internal/execution/reducers/execution-state-reducer.ts b/packages/core/src/internal/execution/reducers/execution-state-reducer.ts index 96f1b34c6a..05850d9670 100644 --- a/packages/core/src/internal/execution/reducers/execution-state-reducer.ts +++ b/packages/core/src/internal/execution/reducers/execution-state-reducer.ts @@ -7,6 +7,7 @@ import { ContractAtExecutionStateInitializeMessage, DeploymentExecutionStateCompleteMessage, DeploymentExecutionStateInitializeMessage, + EncodeFunctionCallExecutionStateInitializeMessage, JournalMessage, JournalMessageType, NetworkInteractionRequestMessage, @@ -29,6 +30,7 @@ import { initialiseCallExecutionStateFrom, initialiseContractAtExecutionStateFrom, initialiseDeploymentExecutionStateFrom, + initialiseEncodeFunctionCallExecutionStateFrom, initialiseReadEventArgumentExecutionStateFrom, initialiseSendDataExecutionStateFrom, initialiseStaticCallExecutionStateFrom, @@ -77,6 +79,7 @@ export function executionStateReducer( | SendDataExecutionStateCompleteMessage | ContractAtExecutionStateInitializeMessage | ReadEventArgExecutionStateInitializeMessage + | EncodeFunctionCallExecutionStateInitializeMessage | NetworkInteractionRequestMessage | TransactionSendMessage | TransactionConfirmMessage @@ -99,6 +102,8 @@ export function executionStateReducer( return initialiseContractAtExecutionStateFrom(action); case JournalMessageType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE: return initialiseReadEventArgumentExecutionStateFrom(action); + case JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE: + return initialiseEncodeFunctionCallExecutionStateFrom(action); case JournalMessageType.DEPLOYMENT_EXECUTION_STATE_COMPLETE: return _ensureStateThen( state, diff --git a/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/core/src/internal/execution/reducers/helpers/initializers.ts index 17c57d80eb..e6140d0060 100644 --- a/packages/core/src/internal/execution/reducers/helpers/initializers.ts +++ b/packages/core/src/internal/execution/reducers/helpers/initializers.ts @@ -3,6 +3,7 @@ import { CallExecutionState, ContractAtExecutionState, DeploymentExecutionState, + EncodeFunctionCallExecutionState, ExecutionSateType, ExecutionStatus, ReadEventArgumentExecutionState, @@ -13,6 +14,7 @@ import { CallExecutionStateInitializeMessage, ContractAtExecutionStateInitializeMessage, DeploymentExecutionStateInitializeMessage, + EncodeFunctionCallExecutionStateInitializeMessage, ReadEventArgExecutionStateInitializeMessage, SendDataExecutionStateInitializeMessage, StaticCallExecutionStateInitializeMessage, @@ -128,6 +130,27 @@ export function initialiseContractAtExecutionStateFrom( return contractAtExecutionInitialState; } +export function initialiseEncodeFunctionCallExecutionStateFrom( + action: EncodeFunctionCallExecutionStateInitializeMessage +): EncodeFunctionCallExecutionState { + const encodeFunctionCallExecutionInitialState: EncodeFunctionCallExecutionState = + { + id: action.futureId, + type: ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE, + futureType: FutureType.ENCODE_FUNCTION_CALL, + strategy: action.strategy, + strategyConfig: action.strategyConfig, + status: ExecutionStatus.SUCCESS, + dependencies: new Set(action.dependencies), + artifactId: action.artifactId, + functionName: action.functionName, + args: action.args, + result: action.result, + }; + + return encodeFunctionCallExecutionInitialState; +} + export function initialiseCallExecutionStateFrom( action: CallExecutionStateInitializeMessage ): CallExecutionState { diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index 820eaf71ca..a1cb827d07 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -15,6 +15,7 @@ export type ExecutionState = | DeploymentExecutionState | CallExecutionState | StaticCallExecutionState + | EncodeFunctionCallExecutionState | ContractAtExecutionState | ReadEventArgumentExecutionState | SendDataExecutionState; @@ -37,6 +38,7 @@ export enum ExecutionSateType { DEPLOYMENT_EXECUTION_STATE = "DEPLOYMENT_EXECUTION_STATE", CALL_EXECUTION_STATE = "CALL_EXECUTION_STATE", STATIC_CALL_EXECUTION_STATE = "STATIC_CALL_EXECUTION_STATE", + ENCODE_FUNCTION_CALL_EXECUTION_STATE = "ENCODE_FUNCTION_CALL_EXECUTION_STATE", CONTRACT_AT_EXECUTION_STATE = "CONTRACT_AT_EXECUTION_STATE", READ_EVENT_ARGUMENT_EXECUTION_STATE = "READ_EVENT_ARGUMENT_EXECUTION_STATE", SEND_DATA_EXECUTION_STATE = "SEND_DATA_EXECUTION_STATE", @@ -131,6 +133,25 @@ export interface StaticCallExecutionState result?: StaticCallExecutionResult; } +/** + * An execution state that tracks the execution of an encode function call future. + * + * Encode function call execution states are only stored for reconciliation purposes + * and don't actually lead to any network interaction. + * + * Their execution is immediately completed. + */ +export interface EncodeFunctionCallExecutionState + extends BaseExecutionState< + ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE, + FutureType.ENCODE_FUNCTION_CALL + > { + artifactId: string; + functionName: string; + args: SolidityParameterType[]; + result?: string; +} + /** * An execution state that tracks the execution of an arbitrary send data future. */ @@ -166,7 +187,7 @@ export interface ContractAtExecutionState } /** - * An execution state that tracks the execution of a contract at future. + * An execution state that tracks the execution of a read event argument future. * * Read event argument execution states are only stored for reconciliation * purposes and don't actually lead to any network interaction. diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/core/src/internal/execution/types/messages.ts index 0655a74d98..0f8891195b 100644 --- a/packages/core/src/internal/execution/types/messages.ts +++ b/packages/core/src/internal/execution/types/messages.ts @@ -33,6 +33,7 @@ export type JournalMessage = | SendDataExecutionStateCompleteMessage | ContractAtExecutionStateInitializeMessage | ReadEventArgExecutionStateInitializeMessage + | EncodeFunctionCallExecutionStateInitializeMessage | NetworkInteractionRequestMessage | TransactionSendMessage | TransactionConfirmMessage @@ -62,6 +63,7 @@ export enum JournalMessageType { SEND_DATA_EXECUTION_STATE_COMPLETE = "SEND_DATA_EXECUTION_STATE_COMPLETE", CONTRACT_AT_EXECUTION_STATE_INITIALIZE = "CONTRACT_AT_EXECUTION_STATE_INITIALIZE", READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE = "READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE", + ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE = "ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE", NETWORK_INTERACTION_REQUEST = "NETWORK_INTERACTION_REQUEST", TRANSACTION_SEND = "TRANSACTION_SEND", TRANSACTION_CONFIRM = "TRANSACTION_CONFIRM", @@ -183,6 +185,18 @@ export interface ReadEventArgExecutionStateInitializeMessage { result: SolidityParameterType; } +export interface EncodeFunctionCallExecutionStateInitializeMessage { + type: JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE; + futureId: string; + strategy: string; + strategyConfig: ConcreteExecutionConfig; + dependencies: string[]; + artifactId: string; + functionName: string; + args: SolidityParameterType[]; + result: string; +} + export interface NetworkInteractionRequestMessage { type: JournalMessageType.NETWORK_INTERACTION_REQUEST; futureId: string; diff --git a/packages/core/src/internal/journal/utils/emitExecutionEvent.ts b/packages/core/src/internal/journal/utils/emitExecutionEvent.ts index 429d7313f4..dd5dbfbc7a 100644 --- a/packages/core/src/internal/journal/utils/emitExecutionEvent.ts +++ b/packages/core/src/internal/journal/utils/emitExecutionEvent.ts @@ -85,6 +85,17 @@ export function emitExecutionEvent( }); break; } + case JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE: { + executionEventListener.encodeFunctionCallExecutionStateInitialize({ + type: ExecutionEventType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE, + futureId: message.futureId, + result: { + type: ExecutionEventResultType.SUCCESS, + result: message.result, + }, + }); + break; + } case JournalMessageType.SEND_DATA_EXECUTION_STATE_INITIALIZE: { executionEventListener.sendDataExecutionStateInitialize({ type: ExecutionEventType.SEND_DATA_EXECUTION_STATE_INITIALIZE, diff --git a/packages/core/src/internal/journal/utils/log.ts b/packages/core/src/internal/journal/utils/log.ts index 3d6660d395..ab28aabb0b 100644 --- a/packages/core/src/internal/journal/utils/log.ts +++ b/packages/core/src/internal/journal/utils/log.ts @@ -93,6 +93,12 @@ export function logJournalableMessage(message: JournalMessage): void { ); break; + case JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE: + console.log( + `Executed encode function call future ${message.futureId} with result ${message.result}` + ); + break; + case JournalMessageType.NETWORK_INTERACTION_REQUEST: if ( message.networkInteraction.type === diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index b9e52d6465..626903b484 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -7,6 +7,7 @@ import { isArtifactType, isCallableContractFuture, isContractFuture, + isEncodeFunctionCallFuture, isFuture, isModuleParameterRuntimeValue, isNamedStaticCallFuture, @@ -22,6 +23,7 @@ import { ContractCallFuture, ContractDeploymentFuture, ContractFuture, + EncodeFunctionCallFuture, FutureType, IgnitionModule, IgnitionModuleResult, @@ -40,6 +42,7 @@ import { CallOptions, ContractAtOptions, ContractOptions, + EncodeFunctionCallOptions, IgnitionModuleBuilder, LibraryOptions, ReadEventArgumentOptions, @@ -59,6 +62,7 @@ import { NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, + NamedEncodeFunctionCallFutureImplementation, NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, ReadEventArgumentFutureImplementation, @@ -610,6 +614,68 @@ class IgnitionModuleBuilderImplementation< return future; } + public encodeFunctionCall< + ContractNameT extends string, + FunctionNameT extends string + >( + contractFuture: CallableContractFuture, + functionName: FunctionNameT, + args: ArgumentType[] = [], + options: EncodeFunctionCallOptions = {} + ): EncodeFunctionCallFuture { + if (!Array.isArray(args)) { + this._throwErrorWithStackTrace( + `Invalid parameter "args" provided to encodeFunctionCall "${functionName}" in module "${this._module.id}"`, + this.encodeFunctionCall + ); + } + + if (typeof options !== "object") { + this._throwErrorWithStackTrace( + `Invalid parameter "options" provided to encodeFunctionCall "${functionName}" in module "${this._module.id}"`, + this.encodeFunctionCall + ); + } + + const futureId = toCallFutureId( + this._module.id, + options.id, + contractFuture.module.id, + contractFuture.id, + functionName + ); + + /* validation start */ + this._assertValidId(options.id, this.encodeFunctionCall); + this._assertValidFunctionName(functionName, this.encodeFunctionCall); + this._assertUniqueFutureId(futureId, options.id, this.encodeFunctionCall); + this._assertValidCallableContract(contractFuture, this.encodeFunctionCall); + /* validation end */ + + const future = new NamedEncodeFunctionCallFutureImplementation( + futureId, + this._module, + functionName, + contractFuture, + args + ); + + future.dependencies.add(contractFuture); + + for (const arg of resolveArgsToFutures(args)) { + future.dependencies.add(arg); + } + + for (const afterFuture of options.after ?? []) { + future.dependencies.add(afterFuture); + } + + this._module.futures.add(future); + this._futureIds.add(futureId); + + return future; + } + public contractAt( contractName: ContractNameT, address: @@ -844,7 +910,7 @@ class IgnitionModuleBuilderImplementation< | ModuleParameterRuntimeValue | AccountRuntimeValue, value?: bigint | ModuleParameterRuntimeValue, - data?: string, + data?: string | EncodeFunctionCallFuture, options: SendDataOptions = {} ): SendDataFuture { if (typeof options !== "object") { @@ -880,6 +946,10 @@ class IgnitionModuleBuilderImplementation< future.dependencies.add(to); } + if (isFuture(data)) { + future.dependencies.add(data); + } + for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); } @@ -1130,10 +1200,14 @@ m.${futureConstructor.name}(..., { id: "MyUniqueId"})`, } private _assertValidData( - data: string | undefined, + data: string | EncodeFunctionCallFuture | undefined, func: (...[]: any[]) => any ) { - if (typeof data !== "string" && data !== undefined) { + if ( + typeof data !== "string" && + data !== undefined && + !isEncodeFunctionCallFuture(data) + ) { this._throwErrorWithStackTrace(`Invalid data given`, func); } } diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index 44c8ec22e8..afa58b40cc 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -21,6 +21,7 @@ import { ReadEventArgumentFuture, RuntimeValueType, SendDataFuture, + EncodeFunctionCallFuture, } from "../types/module"; const customInspectSymbol = Symbol.for("util.inspect.custom"); @@ -176,6 +177,24 @@ export class NamedStaticCallFutureImplementation< } } +export class NamedEncodeFunctionCallFutureImplementation< + ContractNameT extends string, + FunctionNameT extends string + > + extends BaseFutureImplementation + implements EncodeFunctionCallFuture +{ + constructor( + public readonly id: string, + public readonly module: IgnitionModuleImplementation, + public readonly functionName: FunctionNameT, + public readonly contract: ContractFuture, + public readonly args: ArgumentType[] + ) { + super(id, FutureType.ENCODE_FUNCTION_CALL, module); + } +} + export class NamedContractAtFutureImplementation extends BaseFutureImplementation implements NamedArtifactContractAtFuture @@ -245,7 +264,10 @@ export class SendDataFutureImplementation | ModuleParameterRuntimeValue | AccountRuntimeValue, public readonly value: bigint | ModuleParameterRuntimeValue, - public readonly data: string | undefined, + public readonly data: + | string + | EncodeFunctionCallFuture + | undefined, public readonly from: string | AccountRuntimeValue | undefined ) { super(id, FutureType.SEND_DATA, module); diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts new file mode 100644 index 0000000000..28c9e7ee96 --- /dev/null +++ b/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts @@ -0,0 +1,29 @@ +import { EncodeFunctionCallFuture } from "../../../types/module"; +import { EncodeFunctionCallExecutionState } from "../../execution/types/execution-state"; +import { reconcileArguments } from "../helpers/reconcile-arguments"; +import { reconcileFunctionName } from "../helpers/reconcile-function-name"; +import { reconcileStrategy } from "../helpers/reconcile-strategy"; +import { ReconciliationContext, ReconciliationFutureResult } from "../types"; + +export function reconcileNamedEncodeFunctionCall( + future: EncodeFunctionCallFuture, + executionState: EncodeFunctionCallExecutionState, + context: ReconciliationContext +): ReconciliationFutureResult { + let result = reconcileFunctionName(future, executionState, context); + if (result !== undefined) { + return result; + } + + result = reconcileArguments(future, executionState, context); + if (result !== undefined) { + return result; + } + + result = reconcileStrategy(future, executionState, context); + if (result !== undefined) { + return result; + } + + return { success: true }; +} diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts index d697db7bfb..25e9e4fb99 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts @@ -4,11 +4,13 @@ import { ContractCallFuture, NamedArtifactContractDeploymentFuture, StaticCallFuture, + EncodeFunctionCallFuture, } from "../../../types/module"; import { resolveArgs } from "../../execution/future-processor/helpers/future-resolvers"; import { CallExecutionState, DeploymentExecutionState, + EncodeFunctionCallExecutionState, ExecutionSateType, StaticCallExecutionState, } from "../../execution/types/execution-state"; @@ -24,11 +26,13 @@ export function reconcileArguments( | NamedArtifactContractDeploymentFuture | ContractDeploymentFuture | StaticCallFuture - | ContractCallFuture, + | ContractCallFuture + | EncodeFunctionCallFuture, exState: | DeploymentExecutionState | CallExecutionState - | StaticCallExecutionState, + | StaticCallExecutionState + | EncodeFunctionCallExecutionState, context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { const unresolvedFutureArgs = isDeploymentFuture(future) diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts index 95ac4c9466..5072495d7f 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts @@ -1,5 +1,6 @@ import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../execution/types/execution-state"; +import { findResultForFutureById } from "../../views/find-result-for-future-by-id"; import { ReconciliationContext, ReconciliationFutureResultFailure, @@ -10,7 +11,16 @@ import { compare } from "./compare"; export function reconcileData( future: SendDataFuture, exState: SendDataExecutionState, - _context: ReconciliationContext + context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { - return compare(future, "Data", exState.data, future.data ?? "0x"); + if (typeof future.data === "string" || future.data === undefined) { + return compare(future, "Data", exState.data, future.data ?? "0x"); + } + + return compare( + future, + "Data", + exState.data, + findResultForFutureById(context.deploymentState, future.data.id) as string + ); } diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts index 023005d9d4..0a592a31ad 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts @@ -1,6 +1,11 @@ -import { ContractCallFuture, StaticCallFuture } from "../../../types/module"; +import { + ContractCallFuture, + EncodeFunctionCallFuture, + StaticCallFuture, +} from "../../../types/module"; import { CallExecutionState, + EncodeFunctionCallExecutionState, StaticCallExecutionState, } from "../../execution/types/execution-state"; import { @@ -11,8 +16,14 @@ import { import { compare } from "./compare"; export function reconcileFunctionName( - future: ContractCallFuture | StaticCallFuture, - exState: CallExecutionState | StaticCallExecutionState, + future: + | ContractCallFuture + | StaticCallFuture + | EncodeFunctionCallFuture, + exState: + | CallExecutionState + | StaticCallExecutionState + | EncodeFunctionCallExecutionState, _context: ReconciliationContext ): ReconciliationFutureResultFailure | undefined { return compare( diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts index 9f1d5de8f1..fdad53ef86 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts @@ -2,6 +2,7 @@ import { ContractAtFuture, ContractCallFuture, ContractDeploymentFuture, + EncodeFunctionCallFuture, LibraryDeploymentFuture, NamedArtifactContractAtFuture, NamedArtifactContractDeploymentFuture, @@ -14,6 +15,7 @@ import { CallExecutionState, ContractAtExecutionState, DeploymentExecutionState, + EncodeFunctionCallExecutionState, ExecutionStatus, ReadEventArgumentExecutionState, SendDataExecutionState, @@ -35,12 +37,14 @@ export function reconcileStrategy( | ContractAtFuture | ContractCallFuture | StaticCallFuture + | EncodeFunctionCallFuture | SendDataFuture | ReadEventArgumentFuture, exState: | DeploymentExecutionState | CallExecutionState | StaticCallExecutionState + | EncodeFunctionCallExecutionState | ContractAtExecutionState | SendDataExecutionState | ReadEventArgumentExecutionState, diff --git a/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts b/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts index 1eb90b1aab..daae5f2925 100644 --- a/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts +++ b/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts @@ -3,6 +3,7 @@ import { CallExecutionState, ContractAtExecutionState, DeploymentExecutionState, + EncodeFunctionCallExecutionState, ExecutionState, ReadEventArgumentExecutionState, SendDataExecutionState, @@ -15,6 +16,7 @@ import { reconcileArtifactLibraryDeployment } from "./futures/reconcileArtifactL import { reconcileNamedContractAt } from "./futures/reconcileNamedContractAt"; import { reconcileNamedContractCall } from "./futures/reconcileNamedContractCall"; import { reconcileNamedContractDeployment } from "./futures/reconcileNamedContractDeployment"; +import { reconcileNamedEncodeFunctionCall } from "./futures/reconcileNamedEncodeFunctionCall"; import { reconcileNamedLibraryDeployment } from "./futures/reconcileNamedLibraryDeployment"; import { reconcileNamedStaticCall } from "./futures/reconcileNamedStaticCall"; import { reconcileReadEventArgument } from "./futures/reconcileReadEventArgument"; @@ -63,6 +65,12 @@ export async function reconcileFutureSpecificReconciliations( executionState as StaticCallExecutionState, context ); + case FutureType.ENCODE_FUNCTION_CALL: + return reconcileNamedEncodeFunctionCall( + future, + executionState as EncodeFunctionCallExecutionState, + context + ); case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return reconcileNamedContractAt( future, diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index a3d7f4f14c..981336b889 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -53,7 +53,7 @@ export function toContractFutureId( } /** - * Construct the future id for a call or static call, namespaced by the moduleId. + * Construct the future id for a call, static call, or encoded function call, namespaced by the moduleId. * * @param moduleId - the id of the module the future is part of * @param userProvidedId - the overriding id provided by the user (it will still diff --git a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts new file mode 100644 index 0000000000..c04eddd00d --- /dev/null +++ b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts @@ -0,0 +1,66 @@ +import { IgnitionError } from "../../../errors"; +import { + isArtifactType, + isModuleParameterRuntimeValue, +} from "../../../type-guards"; +import { ArtifactResolver } from "../../../types/artifact"; +import { DeploymentParameters } from "../../../types/deploy"; +import { EncodeFunctionCallFuture } from "../../../types/module"; +import { ERRORS } from "../../errors-list"; +import { validateArtifactFunction } from "../../execution/abi"; +import { retrieveNestedRuntimeValues } from "../utils"; + +export async function validateNamedEncodeFunctionCall( + future: EncodeFunctionCallFuture, + artifactLoader: ArtifactResolver, + deploymentParameters: DeploymentParameters, + _accounts: string[] +): Promise { + const errors: IgnitionError[] = []; + + /* stage one */ + + const artifact = + "artifact" in future.contract + ? future.contract.artifact + : await artifactLoader.loadArtifact(future.contract.contractName); + + if (!isArtifactType(artifact)) { + errors.push( + new IgnitionError(ERRORS.VALIDATION.INVALID_ARTIFACT, { + contractName: future.contract.contractName, + }) + ); + } else { + errors.push( + ...validateArtifactFunction( + artifact, + future.contract.contractName, + future.functionName, + future.args, + false + ) + ); + } + + /* stage two */ + + const runtimeValues = retrieveNestedRuntimeValues(future.args); + const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + + const missingParams = moduleParams.filter( + (param) => + deploymentParameters[param.moduleId]?.[param.name] === undefined && + param.defaultValue === undefined + ); + + if (missingParams.length > 0) { + errors.push( + new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { + name: missingParams[0].name, + }) + ); + } + + return errors.map((e) => e.message); +} diff --git a/packages/core/src/internal/validation/validate.ts b/packages/core/src/internal/validation/validate.ts index 87341ec636..f3972924ab 100644 --- a/packages/core/src/internal/validation/validate.ts +++ b/packages/core/src/internal/validation/validate.ts @@ -13,6 +13,7 @@ import { validateArtifactLibraryDeployment } from "./futures/validateArtifactLib import { validateNamedContractAt } from "./futures/validateNamedContractAt"; import { validateNamedContractCall } from "./futures/validateNamedContractCall"; import { validateNamedContractDeployment } from "./futures/validateNamedContractDeployment"; +import { validateNamedEncodeFunctionCall } from "./futures/validateNamedEncodeFunctionCall"; import { validateNamedLibraryDeployment } from "./futures/validateNamedLibraryDeployment"; import { validateNamedStaticCall } from "./futures/validateNamedStaticCall"; import { validateReadEventArgument } from "./futures/validateReadEventArgument"; @@ -115,6 +116,13 @@ async function _validateFuture( deploymentParameters, accounts ); + case FutureType.ENCODE_FUNCTION_CALL: + return validateNamedEncodeFunctionCall( + future, + artifactLoader, + deploymentParameters, + accounts + ); case FutureType.READ_EVENT_ARGUMENT: return validateReadEventArgument( future, diff --git a/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts b/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts index fb8aef8985..7c5a0e6080 100644 --- a/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts +++ b/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts @@ -18,7 +18,8 @@ export function getPendingNonceAndSender( ): { nonce: number; sender: string } | undefined { if ( exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE || - exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE + exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE || + exState.type === ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE ) { return undefined; } diff --git a/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts b/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts index 90f9209af2..d5e62514bc 100644 --- a/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts +++ b/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts @@ -22,7 +22,8 @@ export function getPendingOnchainInteraction( if ( exState.type === ExecutionSateType.STATIC_CALL_EXECUTION_STATE || exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE || - exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE + exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE || + exState.type === ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE ) { return undefined; } diff --git a/packages/core/src/internal/views/find-result-for-future-by-id.ts b/packages/core/src/internal/views/find-result-for-future-by-id.ts index 72c2e45308..ee28f3df76 100644 --- a/packages/core/src/internal/views/find-result-for-future-by-id.ts +++ b/packages/core/src/internal/views/find-result-for-future-by-id.ts @@ -19,7 +19,8 @@ export function findResultForFutureById( exState.type === ExecutionSateType.DEPLOYMENT_EXECUTION_STATE || exState.type === ExecutionSateType.STATIC_CALL_EXECUTION_STATE || exState.type === ExecutionSateType.CONTRACT_AT_EXECUTION_STATE || - exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE, + exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE || + exState.type === ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE, `Expected execution state for ${futureId} to be support result lookup, but instead it was ${exState.type}` ); @@ -32,7 +33,10 @@ export function findResultForFutureById( `Expected execution state for ${futureId} to have a result, but it did not` ); - if (exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE) { + if ( + exState.type === ExecutionSateType.READ_EVENT_ARGUMENT_EXECUTION_STATE || + exState.type === ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE + ) { return exState.result; } diff --git a/packages/core/src/type-guards.ts b/packages/core/src/type-guards.ts index e55970fdf6..5deaf88b46 100644 --- a/packages/core/src/type-guards.ts +++ b/packages/core/src/type-guards.ts @@ -7,6 +7,7 @@ import { ContractDeploymentFuture, ContractFuture, DeploymentFuture, + EncodeFunctionCallFuture, FunctionCallFuture, Future, FutureType, @@ -163,6 +164,19 @@ export function isNamedStaticCallFuture( return future.type === FutureType.STATIC_CALL; } +/** + * Returns true if future is of type EncodeFunctionCallFuture\. + * + * @beta + */ +export function isEncodeFunctionCallFuture( + potential: unknown +): potential is EncodeFunctionCallFuture { + return ( + isFuture(potential) && potential.type === FutureType.ENCODE_FUNCTION_CALL + ); +} + /** * Returns true if future is of type ReadEventArgumentFuture. * diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 0909472fde..35c6a84337 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -19,6 +19,7 @@ export type ExecutionEvent = | SendDataExecutionStateCompleteEvent | ContractAtExecutionStateInitializeEvent | ReadEventArgExecutionStateInitializeEvent + | EncodeFunctionCallExecutionStateInitializeEvent | NetworkInteractionRequestEvent | TransactionSendEvent | TransactionConfirmEvent @@ -51,6 +52,7 @@ export enum ExecutionEventType { SEND_DATA_EXECUTION_STATE_COMPLETE = "SEND_DATA_EXECUTION_STATE_COMPLETE", CONTRACT_AT_EXECUTION_STATE_INITIALIZE = "CONTRACT_AT_EXECUTION_STATE_INITIALIZE", READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE = "READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE", + ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE = "ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE", NETWORK_INTERACTION_REQUEST = "NETWORK_INTERACTION_REQUEST", TRANSACTION_SEND = "TRANSACTION_SEND", TRANSACTION_CONFIRM = "TRANSACTION_CONFIRM", @@ -259,6 +261,19 @@ export interface ReadEventArgExecutionStateInitializeEvent { result: ExecutionEventSuccess; } +/** + * An event indicating that a future that represents encoding a function + * call has been initialized, there is no complete event as it initializes + * as complete. + * + * @beta + */ +export interface EncodeFunctionCallExecutionStateInitializeEvent { + type: ExecutionEventType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE; + futureId: string; + result: ExecutionEventSuccess; +} + /** * An event indicating the user has clear the previous execution of a future. * @@ -457,6 +472,7 @@ export interface ExecutionEventTypeMap { [ExecutionEventType.SEND_DATA_EXECUTION_STATE_COMPLETE]: SendDataExecutionStateCompleteEvent; [ExecutionEventType.CONTRACT_AT_EXECUTION_STATE_INITIALIZE]: ContractAtExecutionStateInitializeEvent; [ExecutionEventType.READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE]: ReadEventArgExecutionStateInitializeEvent; + [ExecutionEventType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE]: EncodeFunctionCallExecutionStateInitializeEvent; [ExecutionEventType.NETWORK_INTERACTION_REQUEST]: NetworkInteractionRequestEvent; [ExecutionEventType.TRANSACTION_SEND]: TransactionSendEvent; [ExecutionEventType.TRANSACTION_CONFIRM]: TransactionConfirmEvent; diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index dee18f613f..a4bbd27e4c 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -8,6 +8,7 @@ import { ContractCallFuture, ContractDeploymentFuture, ContractFuture, + EncodeFunctionCallFuture, Future, IgnitionModule, IgnitionModuleResult, @@ -138,6 +139,23 @@ export interface StaticCallOptions { from?: string | AccountRuntimeValue; } +/** + * The options for an `encodeFunctionCall` call. + * + * @beta + */ +export interface EncodeFunctionCallOptions { + /** + * The future id. + */ + id?: string; + + /** + * The futures to execute before this one. + */ + after?: Future[]; +} + /** * The options for a `contractAt` call. * @@ -368,6 +386,31 @@ export interface IgnitionModuleBuilder { options?: StaticCallOptions ): StaticCallFuture; + /** + * Encode a function call. + * + * @param contractFuture - The contract ABI to encode with + * @param functionName - The name of the function + * @param args - The arguments to pass to the function + * @param options - The options for the call + * + * @example + * ``` + * const myContract = m.contract("MyContract"); + * const data = m.encodeFunctionCall(myContract, "updateCounter", [100]); + * m.send("callFunctionOnContract", myContract, 0n, data); + * ``` + */ + encodeFunctionCall< + ContractNameT extends string, + FunctionNameT extends string + >( + contractFuture: CallableContractFuture, + functionName: FunctionNameT, + args?: ArgumentType[], + options?: EncodeFunctionCallOptions + ): EncodeFunctionCallFuture; + /** * Create a future for an existing deployed contract so that it can be * referenced in subsequent futures. @@ -494,7 +537,7 @@ export interface IgnitionModuleBuilder { | ModuleParameterRuntimeValue | AccountRuntimeValue, value?: bigint | ModuleParameterRuntimeValue, - data?: string, + data?: string | EncodeFunctionCallFuture, options?: SendDataOptions ): SendDataFuture; diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 2b603d88f4..55732b36bc 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -13,6 +13,7 @@ export type BaseArgumentType = | boolean | ContractFuture | StaticCallFuture + | EncodeFunctionCallFuture | ReadEventArgumentFuture | RuntimeValue; @@ -38,6 +39,7 @@ export enum FutureType { LIBRARY_DEPLOYMENT = "LIBRARY_DEPLOYMENT", CONTRACT_CALL = "CONTRACT_CALL", STATIC_CALL = "STATIC_CALL", + ENCODE_FUNCTION_CALL = "ENCODE_FUNCTION_CALL", NAMED_ARTIFACT_CONTRACT_AT = "NAMED_ARTIFACT_CONTRACT_AT", CONTRACT_AT = "CONTRACT_AT", READ_EVENT_ARGUMENT = "READ_EVENT_ARGUMENT", @@ -56,6 +58,7 @@ export type Future = | LibraryDeploymentFuture | ContractCallFuture | StaticCallFuture + | EncodeFunctionCallFuture | NamedArtifactContractAtFuture | ContractAtFuture | ReadEventArgumentFuture @@ -244,6 +247,24 @@ export interface StaticCallFuture< from: string | AccountRuntimeValue | undefined; } +/** + * A future representing the encoding of a contract function call + * + * @beta + */ +export interface EncodeFunctionCallFuture< + ContractNameT extends string, + FunctionNameT extends string +> { + type: FutureType.ENCODE_FUNCTION_CALL; + id: string; + module: IgnitionModule; + dependencies: Set; + contract: ContractFuture; + functionName: FunctionNameT; + args: ArgumentType[]; +} + /** * A future representing a previously deployed contract at a known address that belongs to this project. * @@ -318,7 +339,7 @@ export interface SendDataFuture { | ModuleParameterRuntimeValue | AccountRuntimeValue; value: bigint | ModuleParameterRuntimeValue; - data: string | undefined; + data: string | EncodeFunctionCallFuture | undefined; from: string | AccountRuntimeValue | undefined; } diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 87087daff5..025c3c9d70 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -155,6 +155,19 @@ export interface SerializedNamedStaticCallFuture extends BaseSerializedFuture { from: string | SerializedAccountRuntimeValue | undefined; } +/** + * The serialized version of NamedEncodeFunctionCallFuture. + * + * @beta + */ +export interface SerializedNamedEncodeFunctionCallFuture + extends BaseSerializedFuture { + type: FutureType.ENCODE_FUNCTION_CALL; + functionName: string; + contract: FutureToken; + args: SerializedArgumentType[]; +} + /** * The serialized version of NamedContractAtFuture. * @@ -207,7 +220,7 @@ export interface SerializedSendDataFuture extends BaseSerializedFuture { | SerializedModuleParameterRuntimeValue | SerializedAccountRuntimeValue; value: SerializedBigInt | SerializedModuleParameterRuntimeValue; - data: string | undefined; + data: string | FutureToken | undefined; from: string | SerializedAccountRuntimeValue | undefined; } @@ -289,6 +302,7 @@ export type SerializedFuture = | SerializedArtifactLibraryDeploymentFuture | SerializedNamedContractCallFuture | SerializedNamedStaticCallFuture + | SerializedNamedEncodeFunctionCallFuture | SerializedNamedContractAtFuture | SerializedArtifactContractAtFuture | SerializedReadEventArgumentFuture diff --git a/packages/core/test/encodeFunctionCall.ts b/packages/core/test/encodeFunctionCall.ts new file mode 100644 index 0000000000..680ecb4aae --- /dev/null +++ b/packages/core/test/encodeFunctionCall.ts @@ -0,0 +1,754 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { Artifact } from "../src"; +import { buildModule } from "../src/build-module"; +import { + AccountRuntimeValueImplementation, + ModuleParameterRuntimeValueImplementation, + NamedEncodeFunctionCallFutureImplementation, +} from "../src/internal/module"; +import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; +import { validateNamedContractCall } from "../src/internal/validation/futures/validateNamedContractCall"; +import { FutureType } from "../src/types/module"; + +import { + assertInstanceOf, + assertValidationError, + fakeArtifact, + setupMockArtifactResolver, +} from "./helpers"; + +describe("encodeFunctionCall", () => { + it("should be able to setup an encoded function call", () => { + const moduleWithASingleContract = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "test"); + + return { contract1 }; + }); + + assert.isDefined(moduleWithASingleContract); + + // Sets ids based on module id and contract name + assert.equal(moduleWithASingleContract.id, "Module1"); + assert.equal( + moduleWithASingleContract.results.contract1.id, + "Module1#Contract1" + ); + + // 1 contract future & 1 call future + assert.equal(moduleWithASingleContract.futures.size, 2); + assert.equal( + [...moduleWithASingleContract.futures][0].type, + FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT + ); + assert.equal( + [...moduleWithASingleContract.futures][1].type, + FutureType.ENCODE_FUNCTION_CALL + ); + + // No submodules + assert.equal(moduleWithASingleContract.submodules.size, 0); + }); + + it("should be able to pass one contract as an arg dependency to a call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.encodeFunctionCall(example, "test", [another]); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example.test" + ); + + if (!(callFuture instanceof NamedEncodeFunctionCallFutureImplementation)) { + assert.fail("Not a named encode function call future"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + it("should be able to pass one contract as an after dependency of a call", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const another = m.contract("Another"); + + m.encodeFunctionCall(example, "test", [], { after: [another] }); + + return { example, another }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example" + ); + + const anotherFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Another" + ); + + const callFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example.test" + ); + + if (!(callFuture instanceof NamedEncodeFunctionCallFutureImplementation)) { + assert.fail("Not a named encode function call future"); + } + + assert.equal(callFuture.dependencies.size, 2); + assert(callFuture.dependencies.has(exampleFuture!)); + assert(callFuture.dependencies.has(anotherFuture!)); + }); + + describe("Arguments", () => { + it("Should support base values as arguments", () => { + const module = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [1, true, "string", 4n]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assert.deepEqual(future.args, [1, true, "string", 4n]); + }); + + it("Should support arrays as arguments", () => { + const module = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [[1, 2, 3n]]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assert.deepEqual(future.args, [[1, 2, 3n]]); + }); + + it("Should support objects as arguments", () => { + const module = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [{ a: 1, b: [1, 2] }]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assert.deepEqual(future.args, [{ a: 1, b: [1, 2] }]); + }); + + it("Should support futures as arguments", () => { + const module = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [contract1]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assert.equal(future.args[0], module.results.contract1); + }); + + it("should support nested futures as arguments", () => { + const module = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [{ arr: [contract1] }]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assert.equal((future.args[0] as any).arr[0], module.results.contract1); + }); + + it("should support AccountRuntimeValues as arguments", () => { + const module = buildModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [account1]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assertInstanceOf(future.args[0], AccountRuntimeValueImplementation); + assert.equal(future.args[0].accountIndex, 1); + }); + + it("should support nested AccountRuntimeValues as arguments", () => { + const module = buildModule("Module", (m) => { + const account1 = m.getAccount(1); + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [{ arr: [account1] }]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + const account = (future.args[0] as any).arr[0]; + + assertInstanceOf(account, AccountRuntimeValueImplementation); + + assert.equal(account.accountIndex, 1); + }); + + it("should support ModuleParameterRuntimeValue as arguments", () => { + const module = buildModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [p]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + assertInstanceOf( + future.args[0], + ModuleParameterRuntimeValueImplementation + ); + assert.equal(future.args[0].name, "p"); + assert.equal(future.args[0].defaultValue, 123); + }); + + it("should support nested ModuleParameterRuntimeValue as arguments", () => { + const module = buildModule("Module", (m) => { + const p = m.getParameter("p", 123); + const contract1 = m.contract("Contract1"); + m.encodeFunctionCall(contract1, "foo", [{ arr: [p] }]); + + return { contract1 }; + }); + + const future = [...module.futures].find( + ({ type }) => type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertInstanceOf(future, NamedEncodeFunctionCallFutureImplementation); + const param = (future.args[0] as any).arr[0]; + + assertInstanceOf(param, ModuleParameterRuntimeValueImplementation); + assert.equal(param.name, "p"); + assert.equal(param.defaultValue, 123); + }); + }); + + describe("passing id", () => { + it("should be able to call the same function twice by passing an id", () => { + const moduleWithSameCallTwice = buildModule("Module1", (m) => { + const sameContract1 = m.contract("Example"); + + m.encodeFunctionCall(sameContract1, "test", [], { id: "first" }); + m.encodeFunctionCall(sameContract1, "test", [], { id: "second" }); + + return { sameContract1 }; + }); + + assert.equal(moduleWithSameCallTwice.id, "Module1"); + + const callFuture = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1#first" + ); + + const callFuture2 = [...moduleWithSameCallTwice.futures].find( + ({ id }) => id === "Module1#second" + ); + + assert.isDefined(callFuture); + assert.isDefined(callFuture2); + }); + + it("should throw if the same function is called twice without differentiating ids", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.encodeFunctionCall(sameContract1, "test"); + m.encodeFunctionCall(sameContract1, "test"); + + return { sameContract1 }; + }), + `The autogenerated future id ("Module1#SameContract.test") is already used. Please provide a unique id, as shown below: + +m.encodeFunctionCall(..., { id: "MyUniqueId"})` + ); + }); + + it("should throw if a call tries to pass the same id twice", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const sameContract1 = m.contract("SameContract"); + m.encodeFunctionCall(sameContract1, "test", [], { id: "first" }); + m.encodeFunctionCall(sameContract1, "test", [], { id: "first" }); + return { sameContract1 }; + }), + 'The future id "first" is already used, please provide a different one.' + ); + }); + }); + + describe("validation", () => { + describe("module stage", () => { + it("should not validate a non-contract", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const call = m.call(another, "test"); + + m.encodeFunctionCall(call as any, "test"); + + return { another }; + }), + /Invalid contract given/ + ); + }); + + it("should not validate a library", () => { + assert.throws( + () => + buildModule("Module1", (m) => { + const another = m.library("Another"); + + m.encodeFunctionCall(another as any, "test"); + + return { another }; + }), + /Invalid contract given/ + ); + }); + }); + + it("should not validate a non-existant hardhat contract", async () => { + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + m.encodeFunctionCall(another, "test"); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: {} as any }), + {}, + [] + ), + "Artifact for contract 'Another' is invalid" + ); + }); + + it("should not validate a non-existant function", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + contractName: "Another", + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test"); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + "Function 'test' not found in contract Another" + ); + }); + + it("should not validate a call with wrong number of arguments", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "inc", [1, 2]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + "Function inc in contract Another expects 1 arguments but 2 were given" + ); + }); + + it("should not validate an overloaded call with wrong number of arguments", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + { + internalType: "uint256", + name: "n", + type: "uint256", + }, + ], + name: "inc", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + contractName: "Another", + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "inc(bool,uint256)", [1, 2, 3]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver(), + {}, + [] + ), + "Function inc(bool,uint256) in contract Another expects 2 arguments but 3 were given" + ); + }); + + it("should not validate a missing module parameter", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contract("Another", fakeArtifact, []); + m.encodeFunctionCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + "Module parameter 'p' requires a value but was given none" + ); + }); + + it("should validate a missing module parameter if a default parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should not validate a missing module parameter (deeply nested)", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contract("Another", fakeArtifact, []); + m.encodeFunctionCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ), + "Module parameter 'p' requires a value but was given none" + ); + }); + + it("should validate a missing module parameter if a default parameter is present (deeply nested)", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", true); + + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test", [ + [123, { really: { deeply: { nested: [p] } } }], + ]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should validate a module parameter with a default value that is an AccountRuntimeValue", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(1)); + + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + await assert.isFulfilled( + validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] + ) + ); + }); + + it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "address", + name: "b", + type: "address", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p", m.getAccount(-1)); + + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + assertValidationError( + await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ), + "Account index cannot be a negative number" + ); + }); + }); +}); diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index 403807b6f6..0ea6a6faac 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -20,6 +20,7 @@ import { CallExecutionStateInitializeMessage, ContractAtExecutionStateInitializeMessage, DeploymentExecutionStateInitializeMessage, + EncodeFunctionCallExecutionStateInitializeMessage, JournalMessageType, ReadEventArgExecutionStateInitializeMessage, SendDataExecutionStateInitializeMessage, @@ -40,6 +41,7 @@ import { NamedContractAtFutureImplementation, NamedContractCallFutureImplementation, NamedContractDeploymentFutureImplementation, + NamedEncodeFunctionCallFutureImplementation, NamedLibraryDeploymentFutureImplementation, NamedStaticCallFutureImplementation, ReadEventArgumentFutureImplementation, @@ -57,6 +59,7 @@ import { StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, + EncodeFunctionCallFuture, } from "../../../../src/types/module"; import { exampleAccounts, @@ -77,6 +80,7 @@ describe("buildInitializeMessageFor", () => { let artifactLibraryDeployment: LibraryDeploymentFuture; let namedContractCall: ContractCallFuture; let staticCall: StaticCallFuture; + let encodedCall: EncodeFunctionCallFuture; let namedContractAt: NamedArtifactContractAtFuture; let artifactContractAt: ContractAtFuture; let readEventArgument: ReadEventArgumentFuture; @@ -194,6 +198,17 @@ describe("buildInitializeMessageFor", () => { staticCall.dependencies.add(anotherNamedContractDeployment); staticCall.dependencies.add(safeMathLibraryDeployment); + encodedCall = new NamedEncodeFunctionCallFutureImplementation( + "MyModule:EncodeFunctionCall", + fakeModule, + "test", + anotherNamedContractDeployment, + [1n, "b", safeMathLibraryDeployment, { sub: "d" }] + ); + + encodedCall.dependencies.add(anotherNamedContractDeployment); + encodedCall.dependencies.add(safeMathLibraryDeployment); + namedContractAt = new NamedContractAtFutureImplementation( "MyModule:NamedContractAt", fakeModule, @@ -239,6 +254,34 @@ describe("buildInitializeMessageFor", () => { }, ], }, + { + type: "function", + name: "test", + inputs: [ + { + name: "a", + type: "uint256", + }, + { + name: "b", + type: "string", + }, + { + name: "c", + type: "address", + }, + { + name: "d", + type: "tuple", + components: [ + { + name: "sub", + type: "string", + }, + ], + }, + ], + }, ], } ); @@ -619,6 +662,39 @@ describe("buildInitializeMessageFor", () => { }); }); + describe("encode function call state", () => { + let message: EncodeFunctionCallExecutionStateInitializeMessage; + + describe("named library", () => { + beforeEach(async () => { + message = (await buildInitializeMessageFor( + encodedCall, + exampleDeploymentState, + basicStrategy, + {}, + mockDeploymentLoader, + exampleAccounts, + getDefaultSender(exampleAccounts) + )) as EncodeFunctionCallExecutionStateInitializeMessage; + }); + + it("should build an initialize message", async () => { + assert.deepStrictEqual(message, { + type: JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE, + futureId: "MyModule:EncodeFunctionCall", + strategy: "basic", + strategyConfig: {}, + dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], + artifactId: "MyModule:AnotherContract", + functionName: "test", + args: [1n, "b", libraryAddress, { sub: "d" }], + result: + "0xd40c6f1500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000000", + }); + }); + }); + }); + describe("contract at state", () => { let message: ContractAtExecutionStateInitializeMessage; diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/core/test/ignition-module-serializer.ts index ad8eb0be68..ac4a8b9a47 100644 --- a/packages/core/test/ignition-module-serializer.ts +++ b/packages/core/test/ignition-module-serializer.ts @@ -395,6 +395,34 @@ describe("stored deployment serializer", () => { }); }); + describe("encode function call", () => { + it("should serialize a call", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "lock", [1, "a", false]); + + return { contract1 }; + }); + + assertSerializableModuleIn(module); + }); + + it("should serialize a call with dependencies", () => { + const module = buildModule("Module1", (m) => { + const contract1 = m.contract("Contract1"); + const contract2 = m.contract("Contract2"); + + m.encodeFunctionCall(contract2, "lock", [contract1]); + m.encodeFunctionCall(contract2, "unlock", [], { after: [contract1] }); + + return { contract1, contract2 }; + }); + + assertSerializableModuleIn(module); + }); + }); + describe("send", () => { it("should serialize a send", () => { const module = buildModule("Module1", (m) => { diff --git a/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts new file mode 100644 index 0000000000..f7b35eee9f --- /dev/null +++ b/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts @@ -0,0 +1,376 @@ +/* eslint-disable import/no-unused-modules */ +import { assert } from "chai"; + +import { buildModule } from "../../../src/build-module"; +import { ExecutionResultType } from "../../../src/internal/execution/types/execution-result"; +import { + DeploymentExecutionState, + EncodeFunctionCallExecutionState, + ExecutionSateType, + ExecutionStatus, +} from "../../../src/internal/execution/types/execution-state"; +import { FutureType } from "../../../src/types/module"; +import { exampleAccounts } from "../../helpers"; +import { + assertSuccessReconciliation, + createDeploymentState, + reconcile, +} from "../helpers"; + +describe("Reconciliation - named encode function call", () => { + const differentAddress = "0xBA12222222228d8Ba445958a75a0704d566BF2C8"; + + const exampleDeploymentState: DeploymentExecutionState = { + id: "Example", + type: ExecutionSateType.DEPLOYMENT_EXECUTION_STATE, + futureType: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT, + strategy: "basic", + strategyConfig: {}, + status: ExecutionStatus.STARTED, + dependencies: new Set(), + networkInteractions: [], + artifactId: "./artifact.json", + contractName: "Contract1", + value: BigInt("0"), + constructorArgs: [], + libraries: {}, + from: exampleAccounts[0], + }; + + const exampleEncodeFunctionCallState: EncodeFunctionCallExecutionState = { + id: "Example", + type: ExecutionSateType.ENCODE_FUNCTION_CALL_EXECUTION_STATE, + futureType: FutureType.ENCODE_FUNCTION_CALL, + strategy: "basic", + strategyConfig: {}, + status: ExecutionStatus.STARTED, + dependencies: new Set(), + artifactId: "./artifact.json", + functionName: "function", + args: [], + }; + + it("should reconcile unchanged", async () => { + const submoduleDefinition = buildModule("Submodule", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "function1", [1, "a", contract1], {}); + + return { contract1 }; + }); + + const moduleDefinition = buildModule("Module", (m) => { + const { contract1 } = m.useModule(submoduleDefinition); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Submodule#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Submodule#Contract1.function1", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.SUCCESS, + functionName: "function1", + args: [1, "a", differentAddress], + } + ) + ); + }); + + it("should find changes to contract unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract2", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#config", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: + "A dependency from Module#config to Module#Contract1 has been added. The former has started executing before the latter started executing, so this change is incompatible.", + }, + ]); + }); + + it("should find changes to function name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "functionChanged", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#config", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "functionUnchanged", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: + "Function name has been changed from functionUnchanged to functionChanged", + }, + ]); + }); + + it("should find changes to function args unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const ticker = m.getParameter("ticker", "CHANGED"); + + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "function1", [[ticker]], {}); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#Contract1.function1", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: [["UNCHANGED"]], + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1.function1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + + it("should reconcile an address arg with entirely different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall( + contract1, + "function1", + ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], + {} + ); + + return { contract1 }; + }); + + await assertSuccessReconciliation( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#Contract1.function1", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], + } + ) + ); + }); + + it("should fail to reconcile an address arg with partially different casing", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall( + contract1, + "function1", + ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], + {} + ); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#Contract1.function1", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + args: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#Contract1.function1", + failure: "Argument at index 0 has been changed", + }, + ]); + }); + + it("should find changes to strategy name unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#config", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + strategy: "create2", + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy changed from "create2" to "basic"', + }, + ]); + }); + + it("should find changes to strategy config unreconciliable", async () => { + const moduleDefinition = buildModule("Module", (m) => { + const contract1 = m.contract("Contract1"); + + m.encodeFunctionCall(contract1, "function1", [], { id: "config" }); + + return { contract1 }; + }); + + const reconiliationResult = await reconcile( + moduleDefinition, + createDeploymentState( + { + ...exampleDeploymentState, + id: "Module#Contract1", + status: ExecutionStatus.SUCCESS, + result: { + type: ExecutionResultType.SUCCESS, + address: differentAddress, + }, + }, + { + ...exampleEncodeFunctionCallState, + id: "Module#config", + futureType: FutureType.ENCODE_FUNCTION_CALL, + status: ExecutionStatus.STARTED, + functionName: "function1", + strategyConfig: { salt: "value" }, + } + ) + ); + + assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ + { + futureId: "Module#config", + failure: 'Strategy config changed from {"salt":"value"} to {}', + }, + ]); + }); +}); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 200ac0c908..fa79bff988 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -236,6 +236,33 @@ describe("send", () => { assert.equal(futureC2.to.defaultValue, undefined); }); + it("should be able to pass an encode function call future as the 'data' arg for a send", () => { + const moduleWithDependentContracts = buildModule("Module1", (m) => { + const example = m.contract("Example"); + const data = m.encodeFunctionCall(example, "test", []); + m.send("test_send", example, 0n, data); + + return { example }; + }); + + assert.isDefined(moduleWithDependentContracts); + + const exampleFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#Example.test" + ); + + const sendFuture = [...moduleWithDependentContracts.futures].find( + ({ id }) => id === "Module1#test_send" + ); + + if (!(sendFuture instanceof SendDataFutureImplementation)) { + assert.fail("Not a send data future"); + } + + assert.equal(sendFuture.dependencies.size, 2); + assert(sendFuture.dependencies.has(exampleFuture!)); + }); + describe("passing id", () => { it("should be able to call the same function twice by passing an id", () => { const moduleWithSameCallTwice = buildModule("Module1", (m) => { diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index 63ff43ab50..ec503f6f19 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -12,6 +12,7 @@ import { DeploymentResult, DeploymentResultType, DeploymentStartEvent, + EncodeFunctionCallExecutionStateInitializeEvent, ExecutionEventListener, ExecutionEventResult, ExecutionEventResultType, @@ -216,6 +217,14 @@ export class PrettyEventHandler implements ExecutionEventListener { }); } + public encodeFunctionCallExecutionStateInitialize( + event: EncodeFunctionCallExecutionStateInitializeEvent + ): void { + this._setFutureStatusAndRedisplayBatch(event.futureId, { + type: UiFutureStatusType.SUCCESS, + }); + } + public batchInitialize(event: BatchInitializeEvent): void { const batches: UiBatches = []; diff --git a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts index dfe31acf21..ad1491a4f5 100644 --- a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/verbose-event-handler.ts @@ -9,6 +9,7 @@ import { DeploymentExecutionStateInitializeEvent, DeploymentInitializeEvent, DeploymentStartEvent, + EncodeFunctionCallExecutionStateInitializeEvent, ExecutionEventListener, ExecutionEventNetworkInteractionType, ExecutionEventResultType, @@ -175,6 +176,16 @@ export class VerboseEventHandler implements ExecutionEventListener { ); } + public encodeFunctionCallExecutionStateInitialize( + event: EncodeFunctionCallExecutionStateInitializeEvent + ): void { + console.log( + `Executed encode function call future ${event.futureId} with result ${ + event.result.result ?? "undefined" + }` + ); + } + public networkInteractionRequest( event: NetworkInteractionRequestEvent ): void { diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx index 7313bac66e..81567fab5e 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-batch.tsx @@ -159,6 +159,8 @@ function toDisplayText(future: Future): string { return `Call ${future.contract.contractName}.${future.functionName}`; case FutureType.STATIC_CALL: return `Static call ${future.id}`; + case FutureType.ENCODE_FUNCTION_CALL: + return `Encode function call ${future.id}`; case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract ${future.id} (${ typeof future.address === "string" @@ -271,6 +273,25 @@ const FutureDetailsSection: React.FC<{ ); } + case FutureType.ENCODE_FUNCTION_CALL: { + const args = Object.entries(future.args); + return ( + +

    {args.length === 0 ? "No " : null}Arguments

    +
      + {args.map(([, arg], i) => ( +
    • + +
    • + ))} +
    +
    + ); + } case FutureType.NAMED_ARTIFACT_CONTRACT_AT: case FutureType.CONTRACT_AT: { return ( @@ -316,7 +337,20 @@ const FutureDetailsSection: React.FC<{ /> )}

    -

    Data - {future.data}

    +

    + Data -{" "} + {typeof future.data === "string" ? ( + future.data + ) : future.data === undefined ? ( + "0x" + ) : ( + + )} +

    ); } diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 26254f6547..02d681db78 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -123,6 +123,8 @@ function toLabel(f: Future): string { return `Call ${f.contract.contractName}.${f.functionName}`; case FutureType.STATIC_CALL: return `Static call ${f.contract.contractName}.${f.functionName}`; + case FutureType.ENCODE_FUNCTION_CALL: + return `Encoded call ${f.contract.contractName}.${f.functionName}`; case FutureType.NAMED_ARTIFACT_CONTRACT_AT: return `Existing contract ${f.contractName} (${ typeof f.address === "string" From e5f39f7ecd5e0c1d4fabb95f5ba94efee7bdb15b Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 11 Jun 2024 20:25:28 +0100 Subject: [PATCH 1248/1302] chore: add encode function data example to the ui example --- packages/ui/examples/ComplexModule.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index e62861232b..519235d305 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -21,7 +21,8 @@ const balancerDefinition = buildModule("Balancer", (m) => { const { router } = m.useModule(uniswap); - m.call(balancer, "setUniswap", [router]); + const setUniswapData = m.encodeFunctionCall(balancer, "setUniswap", [router]); + m.send("sendSetUniswapCall", balancer, 0n, setUniswapData); return { balancer }; }); From a42e26c9febc12b1a2e5fa49418feef3b9ff5b00 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 11 Jun 2024 21:39:38 +0100 Subject: [PATCH 1249/1302] refactor: remove unneeded nesting in test Looking at our other examples I don't know why they refer to `named library`, I am going to leave them and quietly shut the door behind me. --- .../helpers/build-initialize-message-for.ts | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index 0ea6a6faac..08a460460f 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -49,17 +49,17 @@ import { } from "../../../../src/internal/module"; import { ContractAtFuture, + ContractCallFuture, ContractDeploymentFuture, - LibraryDeploymentFuture, + EncodeFunctionCallFuture, FutureType, + LibraryDeploymentFuture, NamedArtifactContractAtFuture, - ContractCallFuture, NamedArtifactContractDeploymentFuture, NamedArtifactLibraryDeploymentFuture, - StaticCallFuture, ReadEventArgumentFuture, SendDataFuture, - EncodeFunctionCallFuture, + StaticCallFuture, } from "../../../../src/types/module"; import { exampleAccounts, @@ -665,32 +665,30 @@ describe("buildInitializeMessageFor", () => { describe("encode function call state", () => { let message: EncodeFunctionCallExecutionStateInitializeMessage; - describe("named library", () => { - beforeEach(async () => { - message = (await buildInitializeMessageFor( - encodedCall, - exampleDeploymentState, - basicStrategy, - {}, - mockDeploymentLoader, - exampleAccounts, - getDefaultSender(exampleAccounts) - )) as EncodeFunctionCallExecutionStateInitializeMessage; - }); + beforeEach(async () => { + message = (await buildInitializeMessageFor( + encodedCall, + exampleDeploymentState, + basicStrategy, + {}, + mockDeploymentLoader, + exampleAccounts, + getDefaultSender(exampleAccounts) + )) as EncodeFunctionCallExecutionStateInitializeMessage; + }); - it("should build an initialize message", async () => { - assert.deepStrictEqual(message, { - type: JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE, - futureId: "MyModule:EncodeFunctionCall", - strategy: "basic", - strategyConfig: {}, - dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], - artifactId: "MyModule:AnotherContract", - functionName: "test", - args: [1n, "b", libraryAddress, { sub: "d" }], - result: - "0xd40c6f1500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000000", - }); + it("should build an initialize message", async () => { + assert.deepStrictEqual(message, { + type: JournalMessageType.ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE, + futureId: "MyModule:EncodeFunctionCall", + strategy: "basic", + strategyConfig: {}, + dependencies: ["MyModule:AnotherContract", "MyModule:SafeMath"], + artifactId: "MyModule:AnotherContract", + functionName: "test", + args: [1n, "b", libraryAddress, { sub: "d" }], + result: + "0xd40c6f1500000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000080000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e00000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000016200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000016400000000000000000000000000000000000000000000000000000000000000", }); }); }); From 5eb5718e3a9f98e75f57d1875d9610ea948119ec Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 14 Jun 2024 04:22:49 -0400 Subject: [PATCH 1250/1302] update futureId and misc comments --- .../helpers/future-resolvers.ts | 10 +- .../execution/types/execution-state.ts | 2 +- packages/core/src/internal/module-builder.ts | 3 +- .../reconciliation/helpers/reconcile-data.ts | 16 +++- .../src/internal/utils/future-id-builders.ts | 36 +++++++- .../validateNamedEncodeFunctionCall.ts | 15 ++- packages/core/src/types/module-builder.ts | 9 +- packages/core/test/call.ts | 2 +- packages/core/test/encodeFunctionCall.ts | 30 +++--- .../reconcileNamedEncodeFunctionCall.ts | 92 +------------------ packages/core/test/send.ts | 9 +- 11 files changed, 105 insertions(+), 119 deletions(-) diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts index 54cc84b9dc..4b034b7571 100644 --- a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts +++ b/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts @@ -131,8 +131,14 @@ export function resolveFutureData( return data; } - // this type coercion is safe because we know the type of data is EncodeFunctionCallFuture - return findResultForFutureById(deploymentState, data.id) as string; + const result = findResultForFutureById(deploymentState, data.id); + + assertIgnitionInvariant( + typeof result === "string", + "Expected future data to be a string" + ); + + return result; } /** diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/core/src/internal/execution/types/execution-state.ts index a1cb827d07..519f02b473 100644 --- a/packages/core/src/internal/execution/types/execution-state.ts +++ b/packages/core/src/internal/execution/types/execution-state.ts @@ -149,7 +149,7 @@ export interface EncodeFunctionCallExecutionState artifactId: string; functionName: string; args: SolidityParameterType[]; - result?: string; + result: string; } /** diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 626903b484..40d3d7f60a 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -73,6 +73,7 @@ import { assertIgnitionInvariant } from "./utils/assertions"; import { toCallFutureId, toContractFutureId, + toEncodeFunctionCallFutureId, toReadEventArgumentFutureId, toSendDataFutureId, } from "./utils/future-id-builders"; @@ -637,7 +638,7 @@ class IgnitionModuleBuilderImplementation< ); } - const futureId = toCallFutureId( + const futureId = toEncodeFunctionCallFutureId( this._module.id, options.id, contractFuture.module.id, diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts b/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts index 5072495d7f..60f8e5ae9c 100644 --- a/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts +++ b/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts @@ -1,5 +1,6 @@ import { SendDataFuture } from "../../../types/module"; import { SendDataExecutionState } from "../../execution/types/execution-state"; +import { assertIgnitionInvariant } from "../../utils/assertions"; import { findResultForFutureById } from "../../views/find-result-for-future-by-id"; import { ReconciliationContext, @@ -17,10 +18,15 @@ export function reconcileData( return compare(future, "Data", exState.data, future.data ?? "0x"); } - return compare( - future, - "Data", - exState.data, - findResultForFutureById(context.deploymentState, future.data.id) as string + const newData = findResultForFutureById( + context.deploymentState, + future.data.id ); + + assertIgnitionInvariant( + typeof newData === "string", + "Expected data to be a string" + ); + + return compare(future, "Data", exState.data, newData); } diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/core/src/internal/utils/future-id-builders.ts index 981336b889..75fafa8888 100644 --- a/packages/core/src/internal/utils/future-id-builders.ts +++ b/packages/core/src/internal/utils/future-id-builders.ts @@ -53,7 +53,7 @@ export function toContractFutureId( } /** - * Construct the future id for a call, static call, or encoded function call, namespaced by the moduleId. + * Construct the future id for a call or static call, namespaced by the moduleId. * * @param moduleId - the id of the module the future is part of * @param userProvidedId - the overriding id provided by the user (it will still @@ -87,6 +87,40 @@ export function toCallFutureId( return `${moduleId}${MODULE_SEPERATOR}${submoduleContractId}${SUBKEY_SEPERATOR}${functionName}`; } +/** + * Construct the future id for an encoded function call, namespaced by the moduleId. + * + * @param moduleId - the id of the module the future is part of + * @param userProvidedId - the overriding id provided by the user (it will still + * be namespaced) + * @param contractName - the contract or library name that forms part of the + * fallback + * @param functionName - the function name that forms part of the fallback + * @returns the future id + */ +export function toEncodeFunctionCallFutureId( + moduleId: string, + userProvidedId: string | undefined, + contractModuleId: string, + contractId: string, + functionName: string +) { + if (userProvidedId !== undefined) { + return `${moduleId}${MODULE_SEPERATOR}${userProvidedId}`; + } + + if (moduleId === contractModuleId) { + return `${moduleId}${MODULE_SEPERATOR}encodeFunctionCall(${contractId}${SUBKEY_SEPERATOR}${functionName})`; + } + + // We replace the MODULE_SEPARATOR for SUBMODULE_SEPARATOR + const submoduleContractId = `${contractModuleId}${SUBMODULE_SEPARATOR}${contractId.substring( + contractModuleId.length + MODULE_SEPERATOR.length + )}`; + + return `${moduleId}${MODULE_SEPERATOR}encodeFunctionCall(${submoduleContractId}${SUBKEY_SEPERATOR}${functionName})`; +} + /** * Construct the future id for a read event argument future, namespaced by * the moduleId. diff --git a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts index c04eddd00d..25b75a030f 100644 --- a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts @@ -8,13 +8,17 @@ import { DeploymentParameters } from "../../../types/deploy"; import { EncodeFunctionCallFuture } from "../../../types/module"; import { ERRORS } from "../../errors-list"; import { validateArtifactFunction } from "../../execution/abi"; -import { retrieveNestedRuntimeValues } from "../utils"; +import { + filterToAccountRuntimeValues, + retrieveNestedRuntimeValues, + validateAccountRuntimeValue, +} from "../utils"; export async function validateNamedEncodeFunctionCall( future: EncodeFunctionCallFuture, artifactLoader: ArtifactResolver, deploymentParameters: DeploymentParameters, - _accounts: string[] + accounts: string[] ): Promise { const errors: IgnitionError[] = []; @@ -47,6 +51,13 @@ export async function validateNamedEncodeFunctionCall( const runtimeValues = retrieveNestedRuntimeValues(future.args); const moduleParams = runtimeValues.filter(isModuleParameterRuntimeValue); + const accountParams = [...filterToAccountRuntimeValues(runtimeValues)]; + + errors.push( + ...accountParams.flatMap((arv) => + validateAccountRuntimeValue(arv, accounts) + ) + ); const missingParams = moduleParams.filter( (param) => diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index a4bbd27e4c..4a8221af2b 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -387,9 +387,12 @@ export interface IgnitionModuleBuilder { ): StaticCallFuture; /** - * Encode a function call. + * ABI encode a function call, including both the function's name and + * the parameters it is being called with. This is useful when + * sending a raw transaction to invoke a smart contract or + * when invoking a smart contract proxied through an intermediary function. * - * @param contractFuture - The contract ABI to encode with + * @param contractFuture - The contract that the ABI for encoding will be taken from * @param functionName - The name of the function * @param args - The arguments to pass to the function * @param options - The options for the call @@ -398,7 +401,7 @@ export interface IgnitionModuleBuilder { * ``` * const myContract = m.contract("MyContract"); * const data = m.encodeFunctionCall(myContract, "updateCounter", [100]); - * m.send("callFunctionOnContract", myContract, 0n, data); + * m.send("callUpdateCounter", myContract, 0n, data); * ``` */ encodeFunctionCall< diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index 8991329d2d..c57bf154ec 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -887,7 +887,7 @@ m.call(..., { id: "MyUniqueId"})` ); }); - it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { const fakerArtifact: Artifact = { ...fakeArtifact, abi: [ diff --git a/packages/core/test/encodeFunctionCall.ts b/packages/core/test/encodeFunctionCall.ts index 680ecb4aae..98fe0004be 100644 --- a/packages/core/test/encodeFunctionCall.ts +++ b/packages/core/test/encodeFunctionCall.ts @@ -9,7 +9,7 @@ import { NamedEncodeFunctionCallFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; -import { validateNamedContractCall } from "../src/internal/validation/futures/validateNamedContractCall"; +import { validateNamedEncodeFunctionCall } from "../src/internal/validation/futures/validateNamedEncodeFunctionCall"; import { FutureType } from "../src/types/module"; import { @@ -74,7 +74,7 @@ describe("encodeFunctionCall", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1#Example.test" + ({ id }) => id === "Module1#encodeFunctionCall(Module1#Example.test)" ); if (!(callFuture instanceof NamedEncodeFunctionCallFutureImplementation)) { @@ -107,7 +107,7 @@ describe("encodeFunctionCall", () => { ); const callFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1#Example.test" + ({ id }) => id === "Module1#encodeFunctionCall(Module1#Example.test)" ); if (!(callFuture instanceof NamedEncodeFunctionCallFutureImplementation)) { @@ -318,7 +318,7 @@ describe("encodeFunctionCall", () => { return { sameContract1 }; }), - `The autogenerated future id ("Module1#SameContract.test") is already used. Please provide a unique id, as shown below: + `The autogenerated future id ("Module1#encodeFunctionCall(Module1#SameContract.test)") is already used. Please provide a unique id, as shown below: m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); @@ -383,7 +383,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: {} as any }), {}, @@ -411,7 +411,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver(), {}, @@ -453,7 +453,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver(), {}, @@ -514,7 +514,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver(), {}, @@ -539,7 +539,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, @@ -583,7 +583,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); await assert.isFulfilled( - validateNamedContractCall( + validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, @@ -609,7 +609,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, @@ -655,7 +655,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); await assert.isFulfilled( - validateNamedContractCall( + validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, @@ -698,7 +698,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); await assert.isFulfilled( - validateNamedContractCall( + validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Another: fakeArtifact }), {}, @@ -707,7 +707,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); }); - it("should validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { + it("should not validate a module parameter with a default value that is an AccountRuntimeValue for a negative index", async () => { const fakerArtifact: Artifact = { ...fakeArtifact, abi: [ @@ -741,7 +741,7 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` ); assertValidationError( - await validateNamedContractCall( + await validateNamedEncodeFunctionCall( future as any, setupMockArtifactResolver({ Test: fakerArtifact }), {}, diff --git a/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts index f7b35eee9f..82d05cfbb4 100644 --- a/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts +++ b/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts @@ -48,6 +48,7 @@ describe("Reconciliation - named encode function call", () => { artifactId: "./artifact.json", functionName: "function", args: [], + result: "", }; it("should reconcile unchanged", async () => { @@ -79,7 +80,7 @@ describe("Reconciliation - named encode function call", () => { }, { ...exampleEncodeFunctionCallState, - id: "Submodule#Contract1.function1", + id: "Submodule#encodeFunctionCall(Submodule#Contract1.function1)", futureType: FutureType.ENCODE_FUNCTION_CALL, status: ExecutionStatus.SUCCESS, functionName: "function1", @@ -89,7 +90,7 @@ describe("Reconciliation - named encode function call", () => { ); }); - it("should find changes to contract unreconciliable", async () => { + it("should find changes to future dependencies unreconciliable", async () => { const moduleDefinition = buildModule("Module", (m) => { const contract1 = m.contract("Contract1"); @@ -194,7 +195,7 @@ describe("Reconciliation - named encode function call", () => { }, { ...exampleEncodeFunctionCallState, - id: "Module#Contract1.function1", + id: "Module#encodeFunctionCall(Module#Contract1.function1)", futureType: FutureType.ENCODE_FUNCTION_CALL, status: ExecutionStatus.STARTED, functionName: "function1", @@ -205,90 +206,7 @@ describe("Reconciliation - named encode function call", () => { assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ { - futureId: "Module#Contract1.function1", - failure: "Argument at index 0 has been changed", - }, - ]); - }); - - it("should reconcile an address arg with entirely different casing", async () => { - const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contract("Contract1"); - - m.encodeFunctionCall( - contract1, - "function1", - ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], - {} - ); - - return { contract1 }; - }); - - await assertSuccessReconciliation( - moduleDefinition, - createDeploymentState( - { - ...exampleDeploymentState, - id: "Module#Contract1", - status: ExecutionStatus.SUCCESS, - result: { - type: ExecutionResultType.SUCCESS, - address: differentAddress, - }, - }, - { - ...exampleEncodeFunctionCallState, - id: "Module#Contract1.function1", - futureType: FutureType.ENCODE_FUNCTION_CALL, - status: ExecutionStatus.STARTED, - functionName: "function1", - args: ["0x15D34AAF54267DB7D7C367839AAF71A00A2C6A65"], - } - ) - ); - }); - - it("should fail to reconcile an address arg with partially different casing", async () => { - const moduleDefinition = buildModule("Module", (m) => { - const contract1 = m.contract("Contract1"); - - m.encodeFunctionCall( - contract1, - "function1", - ["0x15d34aaf54267db7d7c367839aaf71a00a2c6a65"], - {} - ); - - return { contract1 }; - }); - - const reconiliationResult = await reconcile( - moduleDefinition, - createDeploymentState( - { - ...exampleDeploymentState, - id: "Module#Contract1", - status: ExecutionStatus.SUCCESS, - result: { - type: ExecutionResultType.SUCCESS, - address: differentAddress, - }, - }, - { - ...exampleEncodeFunctionCallState, - id: "Module#Contract1.function1", - futureType: FutureType.ENCODE_FUNCTION_CALL, - status: ExecutionStatus.STARTED, - functionName: "function1", - args: ["0x15d34aaf54267db7D7c367839aaf71a00a2c6a65"], - } - ) - ); - - assert.deepStrictEqual(reconiliationResult.reconciliationFailures, [ - { - futureId: "Module#Contract1.function1", + futureId: "Module#encodeFunctionCall(Module#Contract1.function1)", failure: "Argument at index 0 has been changed", }, ]); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index fa79bff988..2233e567a2 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -5,6 +5,7 @@ import { buildModule } from "../src/build-module"; import { AccountRuntimeValueImplementation, ModuleParameterRuntimeValueImplementation, + NamedEncodeFunctionCallFutureImplementation, SendDataFutureImplementation, } from "../src/internal/module"; import { getFuturesFromModule } from "../src/internal/utils/get-futures-from-module"; @@ -248,7 +249,7 @@ describe("send", () => { assert.isDefined(moduleWithDependentContracts); const exampleFuture = [...moduleWithDependentContracts.futures].find( - ({ id }) => id === "Module1#Example.test" + ({ id }) => id === "Module1#encodeFunctionCall(Module1#Example.test)" ); const sendFuture = [...moduleWithDependentContracts.futures].find( @@ -259,6 +260,12 @@ describe("send", () => { assert.fail("Not a send data future"); } + if ( + !(exampleFuture instanceof NamedEncodeFunctionCallFutureImplementation) + ) { + assert.fail("Not an encode function call future"); + } + assert.equal(sendFuture.dependencies.size, 2); assert(sendFuture.dependencies.has(exampleFuture!)); }); From 1675490fb422929c08a6d8a638902e79d00bb2ba Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 17 Jun 2024 12:31:38 -0400 Subject: [PATCH 1251/1302] chore: bump version to v0.15.5 Update the packages versions and changelogs for the `0.15.5 - 2024-06-17` release. --- packages/core/CHANGELOG.md | 13 +++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 13 +++++++++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/package.json | 2 +- 9 files changed, 57 insertions(+), 5 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index b8d33eb94e..67412a021c 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + ## 0.15.4 - 2024-05-14 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index a78d762833..ad4d4b47ff 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.4", + "version": "0.15.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 7b704aef83..7bacd529a8 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + ## 0.15.4 - 2024-05-14 ### Fixed diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 0f398e4c61..9c33e02c51 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.4", + "version": "0.15.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index e94fa99e60..43f15621cc 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + ## 0.15.4 - 2024-05-14 ### Fixed diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 0dc7e0bac8..0231c5c5d4 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.4", + "version": "0.15.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 38af98a78f..864dd6148c 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.5 - 2024-06-17 + +### Added + +- New function `m.encodeFunctionCall` ([#761](https://github.com/NomicFoundation/hardhat-ignition/pull/761)) + +### Fixed + +- Adjusted regex to allow calling overloaded functions with array parameters ([#774](https://github.com/NomicFoundation/hardhat-ignition/pull/774)) +- Handle anvil response for `hardhat_setBalance` when deploying with create2 ([#773](https://github.com/NomicFoundation/hardhat-ignition/pull/773)) +- Properly resolve `verify` logic when dealing with circular or very deeply nested imports ([#772](https://github.com/NomicFoundation/hardhat-ignition/pull/772)) +- Exclude BNB Test Chain from zero fee configuration in gas fee logic, thanks @MukulKolpe ([#768](https://github.com/NomicFoundation/hardhat-ignition/pull/768)) + ## 0.15.4 - 2024-05-14 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 8e094c10bb..79dae17b1d 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.4", + "version": "0.15.5", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/package.json b/packages/ui/package.json index 3e48b86ff2..bca8a10051 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.4", + "version": "0.15.5", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From 9f39450454ce3559f14e8c35646987f58f8cf220 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 14 Dec 2023 02:31:39 -0500 Subject: [PATCH 1252/1302] add upgradeable proxy sample project --- examples/upgradeable/.eslintrc.js | 14 ++++++ examples/upgradeable/.gitignore | 13 +++++ examples/upgradeable/.prettierignore | 5 ++ examples/upgradeable/README.md | 19 ++++++++ examples/upgradeable/contracts/Box.sol | 20 ++++++++ examples/upgradeable/contracts/Proxies.sol | 5 ++ .../upgradeable/contracts/UpgradedBox.sol | 24 ++++++++++ examples/upgradeable/hardhat.config.js | 7 +++ .../ignition/modules/ProxyModule.js | 48 +++++++++++++++++++ examples/upgradeable/package.json | 21 ++++++++ examples/upgradeable/test/BoxProxy.js | 23 +++++++++ 11 files changed, 199 insertions(+) create mode 100644 examples/upgradeable/.eslintrc.js create mode 100644 examples/upgradeable/.gitignore create mode 100644 examples/upgradeable/.prettierignore create mode 100644 examples/upgradeable/README.md create mode 100644 examples/upgradeable/contracts/Box.sol create mode 100644 examples/upgradeable/contracts/Proxies.sol create mode 100644 examples/upgradeable/contracts/UpgradedBox.sol create mode 100644 examples/upgradeable/hardhat.config.js create mode 100644 examples/upgradeable/ignition/modules/ProxyModule.js create mode 100644 examples/upgradeable/package.json create mode 100644 examples/upgradeable/test/BoxProxy.js diff --git a/examples/upgradeable/.eslintrc.js b/examples/upgradeable/.eslintrc.js new file mode 100644 index 0000000000..eca768e2f9 --- /dev/null +++ b/examples/upgradeable/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/upgradeable/.gitignore b/examples/upgradeable/.gitignore new file mode 100644 index 0000000000..2b8069dd92 --- /dev/null +++ b/examples/upgradeable/.gitignore @@ -0,0 +1,13 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + +ignition/deployments + diff --git a/examples/upgradeable/.prettierignore b/examples/upgradeable/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/upgradeable/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/upgradeable/README.md b/examples/upgradeable/README.md new file mode 100644 index 0000000000..b8764c1aa2 --- /dev/null +++ b/examples/upgradeable/README.md @@ -0,0 +1,19 @@ +# Hardhat Sample for Hardhat Ignition + +This project is Hardhat's sample project enhanced with Hardhat Ignition. + +## Deploying + +To run the Ignition deploy against the ephemeral hardhat network: + +```shell +npx hardhat ignition deploy ./ignition/modules/LockModule.js +``` + +## Test + +To run the hardhat tests using Ignition: + +```shell +npm run test +``` diff --git a/examples/upgradeable/contracts/Box.sol b/examples/upgradeable/contracts/Box.sol new file mode 100644 index 0000000000..0c6cd79983 --- /dev/null +++ b/examples/upgradeable/contracts/Box.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +contract Box { + uint256 private _value; + + // Emitted when the stored value changes + event ValueChanged(uint256 value); + + // Stores a new value in the contract + function store(uint256 value) public { + _value = value; + emit ValueChanged(value); + } + + // Reads the last stored value + function retrieve() public view returns (uint256) { + return _value; + } +} diff --git a/examples/upgradeable/contracts/Proxies.sol b/examples/upgradeable/contracts/Proxies.sol new file mode 100644 index 0000000000..ee3734a870 --- /dev/null +++ b/examples/upgradeable/contracts/Proxies.sol @@ -0,0 +1,5 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/examples/upgradeable/contracts/UpgradedBox.sol b/examples/upgradeable/contracts/UpgradedBox.sol new file mode 100644 index 0000000000..645e8744d8 --- /dev/null +++ b/examples/upgradeable/contracts/UpgradedBox.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +contract UpgradedBox { + uint256 private _value; + + // Emitted when the stored value changes + event ValueChanged(uint256 value); + + // Stores a new value in the contract + function store(uint256 value) public { + _value = value; + emit ValueChanged(value); + } + + // Reads the last stored value + function retrieve() public view returns (uint256) { + return _value; + } + + function version() public pure returns (string memory) { + return "2.0.0"; + } +} diff --git a/examples/upgradeable/hardhat.config.js b/examples/upgradeable/hardhat.config.js new file mode 100644 index 0000000000..4fc38eba56 --- /dev/null +++ b/examples/upgradeable/hardhat.config.js @@ -0,0 +1,7 @@ +require("@nomicfoundation/hardhat-toolbox"); +require("@nomicfoundation/hardhat-ignition-ethers"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.20", +}; diff --git a/examples/upgradeable/ignition/modules/ProxyModule.js b/examples/upgradeable/ignition/modules/ProxyModule.js new file mode 100644 index 0000000000..c33ddcf36c --- /dev/null +++ b/examples/upgradeable/ignition/modules/ProxyModule.js @@ -0,0 +1,48 @@ +// ./ignition/LockModule.js +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +const proxyModule = buildModule("ProxyModule", (m) => { + const proxyAdminOwner = m.getAccount(0); + + const box = m.contract("Box"); + + const proxy = m.contract("TransparentUpgradeableProxy", [ + box, + proxyAdminOwner, + "0x", + ]); + + const proxyAdminAddress = m.readEventArgument( + proxy, + "AdminChanged", + "newAdmin" + ); + + const proxyAdmin = m.contractAt("ProxyAdmin", proxyAdminAddress); + + return { proxyAdmin, proxy }; +}); + +const upgradeModule = buildModule("UpgradeModule", (m) => { + const proxyAdminOwner = m.getAccount(0); + + const { proxyAdmin, proxy } = m.useModule(proxyModule); + + const upgradedBox = m.contract("UpgradedBox"); + + m.call(proxyAdmin, "upgradeAndCall", [proxy, upgradedBox, "0x"], { + from: proxyAdminOwner, + }); + + return { proxyAdmin, proxy }; +}); + +const interactableModule = buildModule("InteractableModule", (m) => { + const { proxy } = m.useModule(upgradeModule); + + const box = m.contractAt("UpgradedBox", proxy); + + return { box }; +}); + +module.exports = interactableModule; diff --git a/examples/upgradeable/package.json b/examples/upgradeable/package.json new file mode 100644 index 0000000000..7cb1955af5 --- /dev/null +++ b/examples/upgradeable/package.json @@ -0,0 +1,21 @@ +{ + "name": "@nomicfoundation/ignition-upgradeable-example", + "private": true, + "version": "0.13.0", + "scripts": { + "test": "hardhat test", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-toolbox": "4.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + }, + "dependencies": { + "@openzeppelin/contracts": "^5.0.1" + } +} diff --git a/examples/upgradeable/test/BoxProxy.js b/examples/upgradeable/test/BoxProxy.js new file mode 100644 index 0000000000..ad5b49afd1 --- /dev/null +++ b/examples/upgradeable/test/BoxProxy.js @@ -0,0 +1,23 @@ +const { + loadFixture, +} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); +const { expect } = require("chai"); +const ProxyModule = require("../ignition/modules/ProxyModule"); + +describe("UpgradedBox", function () { + async function deployFixture() { + const [owner, otherAccount] = await ethers.getSigners(); + + const { box } = await ignition.deploy(ProxyModule); + + return { box, owner, otherAccount }; + } + + describe("Upgrading", function () { + it("Should have upgraded the proxy to UpgradedBox", async function () { + const { box, otherAccount } = await loadFixture(deployFixture); + + expect(await box.connect(otherAccount).version()).to.equal("2.0.0"); + }); + }); +}); From d30fb16e8b5d1c362a0b6af455b8e47cf8bdf6ea Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 17 Dec 2023 23:19:38 -0500 Subject: [PATCH 1253/1302] add comments to the upgradeable proxy example --- examples/upgradeable/contracts/Box.sol | 20 -------- examples/upgradeable/contracts/Demo.sol | 9 ++++ examples/upgradeable/contracts/DemoV2.sol | 9 ++++ examples/upgradeable/contracts/Proxies.sol | 2 + .../upgradeable/contracts/UpgradedBox.sol | 24 --------- .../ignition/modules/ProxyModule.js | 49 ++++++++++++++++--- examples/upgradeable/test/BoxProxy.js | 23 --------- examples/upgradeable/test/ProxyDemo.js | 15 ++++++ 8 files changed, 78 insertions(+), 73 deletions(-) delete mode 100644 examples/upgradeable/contracts/Box.sol create mode 100644 examples/upgradeable/contracts/Demo.sol create mode 100644 examples/upgradeable/contracts/DemoV2.sol delete mode 100644 examples/upgradeable/contracts/UpgradedBox.sol delete mode 100644 examples/upgradeable/test/BoxProxy.js create mode 100644 examples/upgradeable/test/ProxyDemo.js diff --git a/examples/upgradeable/contracts/Box.sol b/examples/upgradeable/contracts/Box.sol deleted file mode 100644 index 0c6cd79983..0000000000 --- a/examples/upgradeable/contracts/Box.sol +++ /dev/null @@ -1,20 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; - -contract Box { - uint256 private _value; - - // Emitted when the stored value changes - event ValueChanged(uint256 value); - - // Stores a new value in the contract - function store(uint256 value) public { - _value = value; - emit ValueChanged(value); - } - - // Reads the last stored value - function retrieve() public view returns (uint256) { - return _value; - } -} diff --git a/examples/upgradeable/contracts/Demo.sol b/examples/upgradeable/contracts/Demo.sol new file mode 100644 index 0000000000..e30433e4c3 --- /dev/null +++ b/examples/upgradeable/contracts/Demo.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// A contrived example of a contract that can be upgraded +contract Demo { + function version() public pure returns (string memory) { + return "1.0.0"; + } +} diff --git a/examples/upgradeable/contracts/DemoV2.sol b/examples/upgradeable/contracts/DemoV2.sol new file mode 100644 index 0000000000..1d5494c66d --- /dev/null +++ b/examples/upgradeable/contracts/DemoV2.sol @@ -0,0 +1,9 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + +// A contrived example of a contract that can be upgraded +contract DemoV2 { + function version() public pure returns (string memory) { + return "2.0.0"; + } +} diff --git a/examples/upgradeable/contracts/Proxies.sol b/examples/upgradeable/contracts/Proxies.sol index ee3734a870..4c4e8c7230 100644 --- a/examples/upgradeable/contracts/Proxies.sol +++ b/examples/upgradeable/contracts/Proxies.sol @@ -1,5 +1,7 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; +// We import these here to force Hardhat to compile them. +// This ensures that their artifacts are available for Hardhat Ignition to use. import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/examples/upgradeable/contracts/UpgradedBox.sol b/examples/upgradeable/contracts/UpgradedBox.sol deleted file mode 100644 index 645e8744d8..0000000000 --- a/examples/upgradeable/contracts/UpgradedBox.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; - -contract UpgradedBox { - uint256 private _value; - - // Emitted when the stored value changes - event ValueChanged(uint256 value); - - // Stores a new value in the contract - function store(uint256 value) public { - _value = value; - emit ValueChanged(value); - } - - // Reads the last stored value - function retrieve() public view returns (uint256) { - return _value; - } - - function version() public pure returns (string memory) { - return "2.0.0"; - } -} diff --git a/examples/upgradeable/ignition/modules/ProxyModule.js b/examples/upgradeable/ignition/modules/ProxyModule.js index c33ddcf36c..805c75291c 100644 --- a/examples/upgradeable/ignition/modules/ProxyModule.js +++ b/examples/upgradeable/ignition/modules/ProxyModule.js @@ -1,48 +1,85 @@ // ./ignition/LockModule.js const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); +/** + * This is the first module that will be run. It deploys the proxy and the + * proxy admin, and returns them so that they can be used by other modules. + */ const proxyModule = buildModule("ProxyModule", (m) => { + // This address is the owner of the ProxyAdmin contract, + // so it will be the only account that can upgrade the proxy when needed. const proxyAdminOwner = m.getAccount(0); - const box = m.contract("Box"); + // This is our contract that will be proxied. + // We will upgrade this contract with a new version later. + const demo = m.contract("Demo"); + // The TransparentUpgradeableProxy contract creates the ProxyAdmin within its constructor. + // To read more about how this proxy is implemented, you can view the source code and comments here: + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v5.0.1/contracts/proxy/transparent/TransparentUpgradeableProxy.sol const proxy = m.contract("TransparentUpgradeableProxy", [ - box, + demo, proxyAdminOwner, "0x", ]); + // We need to get the address of the ProxyAdmin contrac that was created by the TransparentUpgradeableProxy + // so that we can use it to upgrade the proxy later. const proxyAdminAddress = m.readEventArgument( proxy, "AdminChanged", "newAdmin" ); + // Here we use m.contractAt(...) to create a contract instance for the ProxyAdmin that we can interact with. const proxyAdmin = m.contractAt("ProxyAdmin", proxyAdminAddress); + // Return the proxy and proxy admin so that they can be used by other modules. return { proxyAdmin, proxy }; }); +/** + * This is the second module that will be run. It upgrades the proxy to a new + * version of the Demo contract. + */ const upgradeModule = buildModule("UpgradeModule", (m) => { + // Make sure we're account that owns the ProxyAdmin contract. const proxyAdminOwner = m.getAccount(0); + // Get the proxy and proxy admin from the previous module. const { proxyAdmin, proxy } = m.useModule(proxyModule); - const upgradedBox = m.contract("UpgradedBox"); + // This is the new version of the Demo contract that we want to upgrade to. + const demoV2 = m.contract("DemoV2"); - m.call(proxyAdmin, "upgradeAndCall", [proxy, upgradedBox, "0x"], { + // Upgrade the proxy to the new version of the Demo contract. + // This function also accepts a data parameter, which can be used to call a function, + // but we don't need it here so we pass an empty hex string ("0x"). + m.call(proxyAdmin, "upgradeAndCall", [proxy, demoV2, "0x"], { from: proxyAdminOwner, }); + // Return the proxy and proxy admin so that they can be used by other modules. return { proxyAdmin, proxy }; }); +/** + * This is the third and final module that will be run. + * + * It takes the proxy from the previous module and uses it to create a local contract instance + * for the DemoV2 contract. This allows us to interact with the DemoV2 contract via the proxy. + */ const interactableModule = buildModule("InteractableModule", (m) => { + // Get the proxy from the previous module. const { proxy } = m.useModule(upgradeModule); - const box = m.contractAt("UpgradedBox", proxy); + // Create a local contract instance for the DemoV2 contract. + // This line tells Hardhat Ignition to treat the contract at the proxy address as an DemoV2 contract. + // This allows us to call functions on the DemoV2 contract via the proxy. + const demo = m.contractAt("DemoV2", proxy); - return { box }; + // Return the contract instance so that it can be used by other modules or in tests. + return { demo }; }); module.exports = interactableModule; diff --git a/examples/upgradeable/test/BoxProxy.js b/examples/upgradeable/test/BoxProxy.js deleted file mode 100644 index ad5b49afd1..0000000000 --- a/examples/upgradeable/test/BoxProxy.js +++ /dev/null @@ -1,23 +0,0 @@ -const { - loadFixture, -} = require("@nomicfoundation/hardhat-toolbox/network-helpers"); -const { expect } = require("chai"); -const ProxyModule = require("../ignition/modules/ProxyModule"); - -describe("UpgradedBox", function () { - async function deployFixture() { - const [owner, otherAccount] = await ethers.getSigners(); - - const { box } = await ignition.deploy(ProxyModule); - - return { box, owner, otherAccount }; - } - - describe("Upgrading", function () { - it("Should have upgraded the proxy to UpgradedBox", async function () { - const { box, otherAccount } = await loadFixture(deployFixture); - - expect(await box.connect(otherAccount).version()).to.equal("2.0.0"); - }); - }); -}); diff --git a/examples/upgradeable/test/ProxyDemo.js b/examples/upgradeable/test/ProxyDemo.js new file mode 100644 index 0000000000..97c989bf11 --- /dev/null +++ b/examples/upgradeable/test/ProxyDemo.js @@ -0,0 +1,15 @@ +const { expect } = require("chai"); + +const ProxyModule = require("../ignition/modules/ProxyModule"); + +describe("Demo Proxy", function () { + describe("Upgrading", function () { + it("Should have upgraded the proxy to DemoV2", async function () { + const [owner, otherAccount] = await ethers.getSigners(); + + const { demo } = await ignition.deploy(ProxyModule); + + expect(await demo.connect(otherAccount).version()).to.equal("2.0.0"); + }); + }); +}); From 797b2361453210fab70311b993f4508731482303 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 19 Dec 2023 01:15:54 -0500 Subject: [PATCH 1254/1302] update readme --- examples/upgradeable/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/upgradeable/README.md b/examples/upgradeable/README.md index b8764c1aa2..144a05e138 100644 --- a/examples/upgradeable/README.md +++ b/examples/upgradeable/README.md @@ -1,13 +1,13 @@ # Hardhat Sample for Hardhat Ignition -This project is Hardhat's sample project enhanced with Hardhat Ignition. +This project is a basic example of how to use Hardhat Ignition with contract systems that use an upgradeable proxy pattern. ## Deploying To run the Ignition deploy against the ephemeral hardhat network: ```shell -npx hardhat ignition deploy ./ignition/modules/LockModule.js +npx hardhat ignition deploy ./ignition/modules/ProxyModule.js ``` ## Test From 0db55298c3da44fe003744a03f3c6505bcf3b724 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 15 Apr 2024 02:55:11 -0400 Subject: [PATCH 1255/1302] refactor upgrade example --- examples/upgradeable/README.md | 3 + .../ignition/modules/ProxyModule.js | 56 +++++-------------- .../ignition/modules/UpgradeModule.js | 48 ++++++++++++++++ examples/upgradeable/test/ProxyDemo.js | 13 ++++- 4 files changed, 78 insertions(+), 42 deletions(-) create mode 100644 examples/upgradeable/ignition/modules/UpgradeModule.js diff --git a/examples/upgradeable/README.md b/examples/upgradeable/README.md index 144a05e138..2b19eed878 100644 --- a/examples/upgradeable/README.md +++ b/examples/upgradeable/README.md @@ -8,6 +8,9 @@ To run the Ignition deploy against the ephemeral hardhat network: ```shell npx hardhat ignition deploy ./ignition/modules/ProxyModule.js + +# or to deploy the upgrade module +npx hardhat ignition deploy ./ignition/modules/UpgradeModule.js ``` ## Test diff --git a/examples/upgradeable/ignition/modules/ProxyModule.js b/examples/upgradeable/ignition/modules/ProxyModule.js index 805c75291c..8459276ae3 100644 --- a/examples/upgradeable/ignition/modules/ProxyModule.js +++ b/examples/upgradeable/ignition/modules/ProxyModule.js @@ -1,4 +1,3 @@ -// ./ignition/LockModule.js const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); /** @@ -23,7 +22,7 @@ const proxyModule = buildModule("ProxyModule", (m) => { "0x", ]); - // We need to get the address of the ProxyAdmin contrac that was created by the TransparentUpgradeableProxy + // We need to get the address of the ProxyAdmin contract that was created by the TransparentUpgradeableProxy // so that we can use it to upgrade the proxy later. const proxyAdminAddress = m.readEventArgument( proxy, @@ -31,7 +30,7 @@ const proxyModule = buildModule("ProxyModule", (m) => { "newAdmin" ); - // Here we use m.contractAt(...) to create a contract instance for the ProxyAdmin that we can interact with. + // Here we use m.contractAt(...) to create a contract instance for the ProxyAdmin that we can interact with later to upgrade the proxy. const proxyAdmin = m.contractAt("ProxyAdmin", proxyAdminAddress); // Return the proxy and proxy admin so that they can be used by other modules. @@ -39,47 +38,22 @@ const proxyModule = buildModule("ProxyModule", (m) => { }); /** - * This is the second module that will be run. It upgrades the proxy to a new - * version of the Demo contract. + * This is the second module that will be run, and it is also the only module exported from this file. + * It creates a contract instance for the Demo contract using the proxy from the previous module. */ -const upgradeModule = buildModule("UpgradeModule", (m) => { - // Make sure we're account that owns the ProxyAdmin contract. - const proxyAdminOwner = m.getAccount(0); - +const demoModule = buildModule("DemoModule", (m) => { // Get the proxy and proxy admin from the previous module. - const { proxyAdmin, proxy } = m.useModule(proxyModule); - - // This is the new version of the Demo contract that we want to upgrade to. - const demoV2 = m.contract("DemoV2"); - - // Upgrade the proxy to the new version of the Demo contract. - // This function also accepts a data parameter, which can be used to call a function, - // but we don't need it here so we pass an empty hex string ("0x"). - m.call(proxyAdmin, "upgradeAndCall", [proxy, demoV2, "0x"], { - from: proxyAdminOwner, - }); - - // Return the proxy and proxy admin so that they can be used by other modules. - return { proxyAdmin, proxy }; -}); - -/** - * This is the third and final module that will be run. - * - * It takes the proxy from the previous module and uses it to create a local contract instance - * for the DemoV2 contract. This allows us to interact with the DemoV2 contract via the proxy. - */ -const interactableModule = buildModule("InteractableModule", (m) => { - // Get the proxy from the previous module. - const { proxy } = m.useModule(upgradeModule); + const { proxy, proxyAdmin } = m.useModule(proxyModule); - // Create a local contract instance for the DemoV2 contract. - // This line tells Hardhat Ignition to treat the contract at the proxy address as an DemoV2 contract. - // This allows us to call functions on the DemoV2 contract via the proxy. - const demo = m.contractAt("DemoV2", proxy); + // Here we're using m.contractAt(...) a bit differently than we did above. + // While we're still using it to create a contract instance, we're now telling Hardhat Ignition + // to treat the contract at the proxy address as an instance of the Demo contract. + // This allows us to interact with the underlying Demo contract via the proxy from within tests and scripts. + const demo = m.contractAt("Demo", proxy); - // Return the contract instance so that it can be used by other modules or in tests. - return { demo }; + // Return the contract instance, along with the original proxy and proxyAdmin contracts + // so that they can be used by other modules, or in tests and scripts. + return { demo, proxy, proxyAdmin }; }); -module.exports = interactableModule; +module.exports = demoModule; diff --git a/examples/upgradeable/ignition/modules/UpgradeModule.js b/examples/upgradeable/ignition/modules/UpgradeModule.js new file mode 100644 index 0000000000..487dffd9a6 --- /dev/null +++ b/examples/upgradeable/ignition/modules/UpgradeModule.js @@ -0,0 +1,48 @@ +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +const ProxyModule = require("./ProxyModule"); + +/** + * This module upgrades the proxy to a new version of the Demo contract. + */ +const upgradeModule = buildModule("UpgradeModule", (m) => { + // Make sure we're using the account that owns the ProxyAdmin contract. + const proxyAdminOwner = m.getAccount(0); + + // Get the proxy and proxy admin from the previous module. + const { proxyAdmin, proxy } = m.useModule(ProxyModule); + + // This is the new version of the Demo contract that we want to upgrade to. + const demoV2 = m.contract("DemoV2"); + + // Upgrade the proxy to the new version of the Demo contract. + // This function also accepts a data parameter, which can be used to call a function, + // but we don't need it here so we pass an empty hex string ("0x"). + m.call(proxyAdmin, "upgradeAndCall", [proxy, demoV2, "0x"], { + from: proxyAdminOwner, + }); + + // Return the proxy and proxy admin so that they can be used by other modules. + return { proxyAdmin, proxy }; +}); + +/** + * This is the final module that will be run. + * + * It takes the proxy from the previous module and uses it to create a local contract instance + * for the DemoV2 contract. This allows us to interact with the DemoV2 contract via the proxy. + */ +const demoV2Module = buildModule("DemoV2Module", (m) => { + // Get the proxy from the previous module. + const { proxy } = m.useModule(upgradeModule); + + // Create a local contract instance for the DemoV2 contract. + // This line tells Hardhat Ignition to use the DemoV2 ABI for the contract at the proxy address. + // This allows us to call functions on the DemoV2 contract via the proxy. + const demo = m.contractAt("DemoV2", proxy); + + // Return the contract instance so that it can be used by other modules or in tests. + return { demo }; +}); + +module.exports = demoV2Module; diff --git a/examples/upgradeable/test/ProxyDemo.js b/examples/upgradeable/test/ProxyDemo.js index 97c989bf11..409309fd24 100644 --- a/examples/upgradeable/test/ProxyDemo.js +++ b/examples/upgradeable/test/ProxyDemo.js @@ -1,13 +1,24 @@ const { expect } = require("chai"); const ProxyModule = require("../ignition/modules/ProxyModule"); +const UpgradeModule = require("../ignition/modules/UpgradeModule"); describe("Demo Proxy", function () { + describe("Proxy interaction", async function () { + it("Should be interactable via proxy", async function () { + const [owner, otherAccount] = await ethers.getSigners(); + + const { demo } = await ignition.deploy(ProxyModule); + + expect(await demo.connect(otherAccount).version()).to.equal("1.0.0"); + }); + }); + describe("Upgrading", function () { it("Should have upgraded the proxy to DemoV2", async function () { const [owner, otherAccount] = await ethers.getSigners(); - const { demo } = await ignition.deploy(ProxyModule); + const { demo } = await ignition.deploy(UpgradeModule); expect(await demo.connect(otherAccount).version()).to.equal("2.0.0"); }); From 4304f42649b0ad6701bb86000dc729609c6d26bd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 25 Apr 2024 01:48:41 -0400 Subject: [PATCH 1256/1302] update upgradeable example dependency version --- examples/upgradeable/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/upgradeable/package.json b/examples/upgradeable/package.json index 7cb1955af5..69b135ffe3 100644 --- a/examples/upgradeable/package.json +++ b/examples/upgradeable/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.13.0", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" From 69b4852dbc08976f5d215f0ff6c41ec64467f131 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 17 Jun 2024 02:15:01 -0400 Subject: [PATCH 1257/1302] add encodeFunctionCall to upgrade example --- examples/upgradeable/contracts/DemoV2.sol | 6 ++++++ .../upgradeable/ignition/modules/UpgradeModule.js | 15 ++++++++++++--- examples/upgradeable/package.json | 2 +- examples/upgradeable/test/ProxyDemo.js | 8 ++++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/examples/upgradeable/contracts/DemoV2.sol b/examples/upgradeable/contracts/DemoV2.sol index 1d5494c66d..5f31c1cde2 100644 --- a/examples/upgradeable/contracts/DemoV2.sol +++ b/examples/upgradeable/contracts/DemoV2.sol @@ -3,7 +3,13 @@ pragma solidity ^0.8.9; // A contrived example of a contract that can be upgraded contract DemoV2 { + string public name; + function version() public pure returns (string memory) { return "2.0.0"; } + + function setName(string memory _name) public { + name = _name; + } } diff --git a/examples/upgradeable/ignition/modules/UpgradeModule.js b/examples/upgradeable/ignition/modules/UpgradeModule.js index 487dffd9a6..0b12bb2020 100644 --- a/examples/upgradeable/ignition/modules/UpgradeModule.js +++ b/examples/upgradeable/ignition/modules/UpgradeModule.js @@ -15,10 +15,19 @@ const upgradeModule = buildModule("UpgradeModule", (m) => { // This is the new version of the Demo contract that we want to upgrade to. const demoV2 = m.contract("DemoV2"); + // The `upgradeAndCall` function on the ProxyAdmin contract allows us to upgrade the proxy + // and call a function on the new implementation contract in a single transaction. + // To do this, we need to encode the function call data for the function we want to call. + // We'll then pass this encoded data to the `upgradeAndCall` function. + const encodedFunctionCall = m.encodeFunctionCall(demoV2, "setName", [ + "Example Name", + ]); + // Upgrade the proxy to the new version of the Demo contract. - // This function also accepts a data parameter, which can be used to call a function, - // but we don't need it here so we pass an empty hex string ("0x"). - m.call(proxyAdmin, "upgradeAndCall", [proxy, demoV2, "0x"], { + // This function also accepts a data parameter, which accepts encoded function call data. + // We pass the encoded function call data we created above to the `upgradeAndCall` function + // so that the `setName` function is called on the new implementation contract after the upgrade. + m.call(proxyAdmin, "upgradeAndCall", [proxy, demoV2, encodedFunctionCall], { from: proxyAdminOwner, }); diff --git a/examples/upgradeable/package.json b/examples/upgradeable/package.json index 69b135ffe3..7329a8a944 100644 --- a/examples/upgradeable/package.json +++ b/examples/upgradeable/package.json @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.1", + "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/examples/upgradeable/test/ProxyDemo.js b/examples/upgradeable/test/ProxyDemo.js index 409309fd24..d781633085 100644 --- a/examples/upgradeable/test/ProxyDemo.js +++ b/examples/upgradeable/test/ProxyDemo.js @@ -22,5 +22,13 @@ describe("Demo Proxy", function () { expect(await demo.connect(otherAccount).version()).to.equal("2.0.0"); }); + + it("Should have set the name during upgrade", async function () { + const [owner, otherAccount] = await ethers.getSigners(); + + const { demo } = await ignition.deploy(UpgradeModule); + + expect(await demo.connect(otherAccount).name()).to.equal("Example Name"); + }); }); }); From 2521df3ce8a44993b268703fe215bba6fde91237 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jun 2024 14:00:58 +0100 Subject: [PATCH 1258/1302] chore: update upgradeable to latest version --- examples/upgradeable/package.json | 4 +- pnpm-lock.yaml | 88 +++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 1 + 3 files changed, 91 insertions(+), 2 deletions(-) diff --git a/examples/upgradeable/package.json b/examples/upgradeable/package.json index 7329a8a944..44cae00615 100644 --- a/examples/upgradeable/package.json +++ b/examples/upgradeable/package.json @@ -1,7 +1,7 @@ { "name": "@nomicfoundation/ignition-upgradeable-example", "private": true, - "version": "0.13.0", + "version": "0.15.2", "scripts": { "test": "hardhat test", "lint": "npm run prettier -- --check && npm run eslint", @@ -10,7 +10,7 @@ "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" }, "devDependencies": { - "@nomicfoundation/hardhat-ignition-ethers": "^0.15.5", + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", "@nomicfoundation/hardhat-toolbox": "4.0.0", "hardhat": "^2.18.0", "prettier-plugin-solidity": "1.1.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ca98b85a58..f6404fb850 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -159,6 +159,25 @@ importers: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) + examples/upgradeable: + dependencies: + '@openzeppelin/contracts': + specifier: ^5.0.1 + version: 5.0.2 + devDependencies: + '@nomicfoundation/hardhat-ignition-ethers': + specifier: ^0.15.5 + version: 0.15.5(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-toolbox': + specifier: 4.0.0 + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + hardhat: + specifier: ^2.18.0 + version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prettier-plugin-solidity: + specifier: 1.1.3 + version: 1.1.3(prettier@2.8.8) + examples/viem-sample: devDependencies: '@nomicfoundation/hardhat-ignition-viem': @@ -995,6 +1014,21 @@ packages: ethers: ^6.1.0 hardhat: ^2.0.0 + '@nomicfoundation/hardhat-ignition-ethers@0.15.5': + resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} + peerDependencies: + '@nomicfoundation/hardhat-ethers': ^3.0.4 + '@nomicfoundation/hardhat-ignition': ^0.15.5 + '@nomicfoundation/ignition-core': ^0.15.5 + ethers: ^6.7.0 + hardhat: ^2.18.0 + + '@nomicfoundation/hardhat-ignition@0.15.5': + resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==} + peerDependencies: + '@nomicfoundation/hardhat-verify': ^2.0.1 + hardhat: ^2.18.0 + '@nomicfoundation/hardhat-network-helpers@1.0.10': resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} peerDependencies: @@ -1045,6 +1079,12 @@ packages: typescript: ~5.0.0 viem: ^2.7.6 + '@nomicfoundation/ignition-core@0.15.5': + resolution: {integrity: sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q==} + + '@nomicfoundation/ignition-ui@0.15.5': + resolution: {integrity: sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==} + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} engines: {node: '>= 10'} @@ -1112,6 +1152,9 @@ packages: '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': resolution: {integrity: sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==} + '@openzeppelin/contracts@5.0.2': + resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + '@remix-run/router@1.6.0': resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} engines: {node: '>=14'} @@ -2915,9 +2958,11 @@ packages: glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.1.7: resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} @@ -5736,6 +5781,29 @@ snapshots: transitivePeerDependencies: - supports-color + '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/ignition-core': 0.15.5 + ethers: 6.12.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + + '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + dependencies: + '@nomicfoundation/hardhat-verify': 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/ignition-core': 0.15.5 + '@nomicfoundation/ignition-ui': 0.15.5 + chalk: 4.1.2 + debug: 4.3.4(supports-color@5.5.0) + fs-extra: 10.1.0 + hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + prompts: 2.4.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': dependencies: ethereumjs-util: 7.1.5 @@ -5801,6 +5869,24 @@ snapshots: transitivePeerDependencies: - zod + '@nomicfoundation/ignition-core@0.15.5': + dependencies: + '@ethersproject/address': 5.6.1 + '@nomicfoundation/solidity-analyzer': 0.1.1 + cbor: 9.0.2 + debug: 4.3.4(supports-color@5.5.0) + ethers: 6.12.0 + fs-extra: 10.1.0 + immer: 10.0.2 + lodash: 4.17.21 + ndjson: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + '@nomicfoundation/ignition-ui@0.15.5': {} + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': optional: true @@ -5846,6 +5932,8 @@ snapshots: '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': {} + '@openzeppelin/contracts@5.0.2': {} + '@remix-run/router@1.6.0': {} '@rollup/rollup-android-arm-eabi@4.16.2': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 258238d003..7ea18074b6 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -3,4 +3,5 @@ packages: - "examples/complete" - "examples/sample" - "examples/ts-sample" + - "examples/upgradeable" - "examples/viem-sample" From 3b114f05b90b8d23d62462cbffcd4445fd426b8a Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jun 2024 14:45:26 +0100 Subject: [PATCH 1259/1302] chore: update pnpm lock --- pnpm-lock.yaml | 1804 ++++++++++++++++++++++-------------------------- 1 file changed, 836 insertions(+), 968 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f6404fb850..433d1fb147 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,13 +13,13 @@ importers: version: 1.0.2(nyc@15.1.0) '@microsoft/api-extractor': specifier: 7.40.1 - version: 7.40.1(@types/node@18.15.13) + version: 7.40.1(@types/node@18.19.36) '@nomiclabs/eslint-plugin-hardhat-internal-rules': specifier: ^1.0.2 version: 1.0.2 '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 @@ -43,7 +43,7 @@ importers: version: 2.0.1 '@types/node': specifier: ^18.0.0 - version: 18.15.13 + version: 18.19.36 '@types/prompts': specifier: ^2.4.2 version: 2.4.9 @@ -88,7 +88,7 @@ importers: version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) mocha: specifier: ^9.1.3 version: 9.2.2 @@ -109,7 +109,7 @@ importers: version: 14.0.2 ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + version: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) typescript: specifier: ^5.0.2 version: 5.4.5 @@ -121,10 +121,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -136,10 +136,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -151,10 +151,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -166,14 +166,14 @@ importers: version: 5.0.2 devDependencies: '@nomicfoundation/hardhat-ignition-ethers': - specifier: ^0.15.5 - version: 0.15.5(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + specifier: workspace:^ + version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -185,16 +185,16 @@ importers: version: link:../../packages/hardhat-plugin-viem '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.10 - version: 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + version: 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) '@nomicfoundation/hardhat-viem': specifier: 2.0.0 - version: 2.0.0(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5)) + version: 2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5)) chai: specifier: 4.4.1 version: 4.4.1 hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -206,16 +206,16 @@ importers: version: 5.6.1 '@nomicfoundation/solidity-analyzer': specifier: ^0.1.1 - version: 0.1.1 + version: 0.1.2 cbor: specifier: ^9.0.0 version: 9.0.2 debug: specifier: ^4.3.2 - version: 4.3.4(supports-color@5.5.0) + version: 4.3.5(supports-color@5.5.0) ethers: specifier: ^6.7.0 - version: 6.12.0 + version: 6.13.1 fs-extra: specifier: ^10.0.0 version: 10.1.0 @@ -231,19 +231,19 @@ importers: devDependencies: '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) packages/hardhat-plugin: dependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.1 - version: 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + version: 2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) '@nomicfoundation/ignition-core': specifier: workspace:^ version: link:../core @@ -255,7 +255,7 @@ importers: version: 4.1.2 debug: specifier: ^4.3.2 - version: 4.3.4(supports-color@5.5.0) + version: 4.3.5(supports-color@5.5.0) fs-extra: specifier: ^10.0.0 version: 10.1.0 @@ -265,10 +265,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.9 - version: 1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + version: 1.0.9(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -277,10 +277,10 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) viem: specifier: ^2.7.6 - version: 2.9.25(typescript@5.4.5) + version: 2.15.1(typescript@5.4.5) packages/hardhat-plugin-ethers: dependencies: @@ -292,14 +292,14 @@ importers: version: link:../core ethers: specifier: ^6.7.0 - version: 6.12.0 + version: 6.13.1 devDependencies: '@nomicfoundation/hardhat-ethers': specifier: ^3.0.4 - version: 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + version: 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -308,7 +308,7 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) packages/hardhat-plugin-viem: dependencies: @@ -320,14 +320,14 @@ importers: version: link:../core viem: specifier: ^2.7.6 - version: 2.9.25(typescript@5.4.5) + version: 2.15.1(typescript@5.4.5) devDependencies: '@nomicfoundation/hardhat-viem': specifier: ^2.0.0 - version: 2.0.1(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5)) + version: 2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5)) '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -336,7 +336,7 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) packages/ui: devDependencies: @@ -348,25 +348,25 @@ importers: version: link:../core '@types/chai': specifier: ^4.2.22 - version: 4.3.14 + version: 4.3.16 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 '@types/react': specifier: ^18.0.28 - version: 18.2.79 + version: 18.3.3 '@types/react-dom': specifier: ^18.0.11 - version: 18.2.25 + version: 18.3.0 '@types/styled-components': specifier: 5.1.26 version: 5.1.26 '@vitejs/plugin-react': specifier: ^4.0.0 - version: 4.2.1(vite@5.2.10(@types/node@18.15.13)) + version: 4.3.1(vite@5.3.1(@types/node@18.19.36)) eslint-plugin-react-hooks: specifier: ^4.6.0 - version: 4.6.0(eslint@8.57.0) + version: 4.6.2(eslint@8.57.0) eslint-plugin-react-refresh: specifier: ^0.3.4 version: 0.3.5(eslint@8.57.0) @@ -375,32 +375,28 @@ importers: version: 10.8.0 react: specifier: ^18.2.0 - version: 18.2.0 + version: 18.3.1 react-dom: specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) + version: 18.3.1(react@18.3.1) react-router-dom: specifier: 6.11.0 - version: 6.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-tooltip: specifier: ^5.21.4 - version: 5.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + version: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) styled-components: specifier: 5.3.10 - version: 5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0) + version: 5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) vite: specifier: ^5.0.0 - version: 5.2.10(@types/node@18.15.13) + version: 5.3.1(@types/node@18.19.36) vite-plugin-singlefile: specifier: ^2.0.1 - version: 2.0.1(rollup@4.16.2)(vite@5.2.10(@types/node@18.15.13)) + version: 2.0.1(rollup@4.18.0)(vite@5.3.1(@types/node@18.19.36)) packages: - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} @@ -411,117 +407,117 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/code-frame@7.24.2': - resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + '@babel/code-frame@7.24.7': + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.24.4': - resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + '@babel/compat-data@7.24.7': + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} - '@babel/core@7.24.4': - resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==} + '@babel/core@7.24.7': + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} - '@babel/generator@7.24.4': - resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} + '@babel/generator@7.24.7': + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + '@babel/helper-annotate-as-pure@7.24.7': + resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + '@babel/helper-compilation-targets@7.24.7': + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + '@babel/helper-function-name@7.24.7': + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + '@babel/helper-hoist-variables@7.24.7': + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + '@babel/helper-module-imports@7.24.7': + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + '@babel/helper-module-transforms@7.24.7': + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-plugin-utils@7.24.0': - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} + '@babel/helper-plugin-utils@7.24.7': + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + '@babel/helper-simple-access@7.24.7': + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + '@babel/helper-split-export-declaration@7.24.7': + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.24.1': - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + '@babel/helper-string-parser@7.24.7': + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + '@babel/helper-validator-identifier@7.24.7': + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + '@babel/helper-validator-option@7.24.7': + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.24.4': - resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==} + '@babel/helpers@7.24.7': + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.24.2': - resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + '@babel/highlight@7.24.7': + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.24.4': - resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} + '@babel/parser@7.24.7': + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/plugin-syntax-jsx@7.24.1': - resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + '@babel/plugin-syntax-jsx@7.24.7': + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.24.1': - resolution: {integrity: sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==} + '@babel/plugin-transform-react-jsx-self@7.24.7': + resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.24.1': - resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + '@babel/plugin-transform-react-jsx-source@7.24.7': + resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/template@7.24.0': - resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + '@babel/template@7.24.7': + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.24.1': - resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + '@babel/traverse@7.24.7': + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} - '@babel/types@7.24.0': - resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + '@babel/types@7.24.7': + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} '@braintree/sanitize-url@6.0.4': @@ -543,14 +539,14 @@ packages: '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - '@esbuild/aix-ppc64@0.20.2': - resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.20.2': - resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -561,56 +557,56 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.20.2': - resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.20.2': - resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.20.2': - resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.20.2': - resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.20.2': - resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.20.2': - resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.20.2': - resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.20.2': - resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.20.2': - resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -621,74 +617,74 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.20.2': - resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.20.2': - resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.20.2': - resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.20.2': - resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.20.2': - resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.20.2': - resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.20.2': - resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.20.2': - resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.20.2': - resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.20.2': - resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.20.2': - resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.20.2': - resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -699,8 +695,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + '@eslint-community/regexpp@4.10.1': + resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/eslintrc@2.1.4': @@ -817,14 +813,14 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.0': - resolution: {integrity: sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==} + '@floating-ui/core@1.6.2': + resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} - '@floating-ui/dom@1.6.3': - resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} + '@floating-ui/dom@1.6.5': + resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} - '@floating-ui/utils@0.2.1': - resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} + '@floating-ui/utils@0.2.2': + resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} '@fontsource/roboto@5.0.13': resolution: {integrity: sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==} @@ -832,6 +828,7 @@ packages: '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -839,6 +836,7 @@ packages: '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -895,8 +893,8 @@ packages: '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - '@noble/curves@1.3.0': - resolution: {integrity: sha512-t01iSXPuN+Eqzb4eBX0S5oubSqXbK/xXa1Ne18Hj8f9pStxztHCE2gfboSp/dZRLSqfuLpRK2nDXDK+W9puocA==} + '@noble/curves@1.4.0': + resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} @@ -905,10 +903,6 @@ packages: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - '@noble/hashes@1.3.3': - resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} - engines: {node: '>= 16'} - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -928,50 +922,36 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nomicfoundation/edr-darwin-arm64@0.3.5': - resolution: {integrity: sha512-gIXUIiPMUy6roLHpNlxf15DumU7/YhffUf7XIB+WUjMecaySfTGyZsTGnCMJZqrDyiYqWPyPKwCV/2u/jqFAUg==} + '@nomicfoundation/edr-darwin-arm64@0.4.0': + resolution: {integrity: sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg==} engines: {node: '>= 18'} - cpu: [arm64] - os: [darwin] - '@nomicfoundation/edr-darwin-x64@0.3.5': - resolution: {integrity: sha512-0MrpOCXUK8gmplpYZ2Cy0holHEylvWoNeecFcrP2WJ5DLQzrB23U5JU2MvUzOJ7aL76Za1VXNBWi/UeTWdHM+w==} + '@nomicfoundation/edr-darwin-x64@0.4.0': + resolution: {integrity: sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg==} engines: {node: '>= 18'} - cpu: [x64] - os: [darwin] - '@nomicfoundation/edr-linux-arm64-gnu@0.3.5': - resolution: {integrity: sha512-aw9f7AZMiY1dZFNePJGKho2k+nEgFgzUAyyukiKfSqUIMXoFXMf1U3Ujv848czrSq9c5XGcdDa2xnEf3daU3xg==} + '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': + resolution: {integrity: sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ==} engines: {node: '>= 18'} - cpu: [arm64] - os: [linux] - '@nomicfoundation/edr-linux-arm64-musl@0.3.5': - resolution: {integrity: sha512-cVFRQjyABBlsbDj+XTczYBfrCHprZ6YNzN8gGGSqAh+UGIJkAIRomK6ar27GyJLNx3HkgbuDoi/9kA0zOo/95w==} + '@nomicfoundation/edr-linux-arm64-musl@0.4.0': + resolution: {integrity: sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg==} engines: {node: '>= 18'} - cpu: [arm64] - os: [linux] - '@nomicfoundation/edr-linux-x64-gnu@0.3.5': - resolution: {integrity: sha512-CjOg85DfR1Vt0fQWn5U0qi26DATK9tVzo3YOZEyI0JBsnqvk43fUTPv3uUAWBrPIRg5O5kOc9xG13hSpCBBxBg==} + '@nomicfoundation/edr-linux-x64-gnu@0.4.0': + resolution: {integrity: sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA==} engines: {node: '>= 18'} - cpu: [x64] - os: [linux] - '@nomicfoundation/edr-linux-x64-musl@0.3.5': - resolution: {integrity: sha512-hvX8bBGpBydAVevzK8jsu2FlqVZK1RrCyTX6wGHnltgMuBaoGLHYtNHiFpteOaJw2byYMiORc2bvj+98LhJ0Ew==} + '@nomicfoundation/edr-linux-x64-musl@0.4.0': + resolution: {integrity: sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw==} engines: {node: '>= 18'} - cpu: [x64] - os: [linux] - '@nomicfoundation/edr-win32-x64-msvc@0.3.5': - resolution: {integrity: sha512-IJXjW13DY5UPsx/eG5DGfXtJ7Ydwrvw/BTZ2Y93lRLHzszVpSmeVmlxjZP5IW2afTSgMLaAAsqNw4NhppRGN8A==} + '@nomicfoundation/edr-win32-x64-msvc@0.4.0': + resolution: {integrity: sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A==} engines: {node: '>= 18'} - cpu: [x64] - os: [win32] - '@nomicfoundation/edr@0.3.5': - resolution: {integrity: sha512-dPSM9DuI1sr71gqWUMgLo8MjHQWO4+WNDm3iWaT6P4vUFJReZX5qwA5X+3UwIPBry8GvNY084u7yWUvB3/8rqA==} + '@nomicfoundation/edr@0.4.0': + resolution: {integrity: sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw==} engines: {node: '>= 18'} '@nomicfoundation/ethereumjs-common@4.0.4': @@ -1000,35 +980,20 @@ packages: c-kzg: optional: true - '@nomicfoundation/hardhat-chai-matchers@2.0.6': - resolution: {integrity: sha512-Te1Uyo9oJcTCF0Jy9dztaLpshmlpjLf2yPtWXlXuLjMt3RRSmJLm/+rKVTW6gfadAEs12U/it6D0ZRnnRGiICQ==} + '@nomicfoundation/hardhat-chai-matchers@2.0.7': + resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.0 chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 - '@nomicfoundation/hardhat-ethers@3.0.5': - resolution: {integrity: sha512-RNFe8OtbZK6Ila9kIlHp0+S80/0Bu/3p41HUpaRIoHLm6X3WekTd83vob3rE54Duufu1edCiBDxspBzi2rxHHw==} + '@nomicfoundation/hardhat-ethers@3.0.6': + resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==} peerDependencies: ethers: ^6.1.0 hardhat: ^2.0.0 - '@nomicfoundation/hardhat-ignition-ethers@0.15.5': - resolution: {integrity: sha512-W6s1QN9CFxzSVZS6w9Jcj3WLaK32z2FP5MxNU2OKY1Fn9ZzLr+miXbUbWYuRHl6dxrrl6sE8cv33Cybv19pmCg==} - peerDependencies: - '@nomicfoundation/hardhat-ethers': ^3.0.4 - '@nomicfoundation/hardhat-ignition': ^0.15.5 - '@nomicfoundation/ignition-core': ^0.15.5 - ethers: ^6.7.0 - hardhat: ^2.18.0 - - '@nomicfoundation/hardhat-ignition@0.15.5': - resolution: {integrity: sha512-Y5nhFXFqt4owA6Ooag8ZBFDF2RAZElMXViknVIsi3m45pbQimS50ti6FU8HxfRkDnBARa40CIn7UGV0hrelzDw==} - peerDependencies: - '@nomicfoundation/hardhat-verify': ^2.0.1 - hardhat: ^2.18.0 - '@nomicfoundation/hardhat-network-helpers@1.0.10': resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} peerDependencies: @@ -1060,8 +1025,8 @@ packages: typechain: ^8.3.0 typescript: '>=4.5.0' - '@nomicfoundation/hardhat-verify@2.0.6': - resolution: {integrity: sha512-oKUI5fl8QC8jysE2LUBHE6rObzEmccJcc4b43Ov7LFMlCBZJE27qoqGIsg/++wX7L8Jdga+bkejPxl8NvsecpQ==} + '@nomicfoundation/hardhat-verify@2.0.8': + resolution: {integrity: sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==} peerDependencies: hardhat: ^2.0.4 @@ -1072,81 +1037,36 @@ packages: typescript: ~5.0.0 viem: ^2.7.6 - '@nomicfoundation/hardhat-viem@2.0.1': - resolution: {integrity: sha512-C7mSg2MiJekWY2xZYYOdbGmA1+hRKIHoSsh/SeY97mPO6nTha7OEeeg+seecxTekLJW1kqryjCdU8ul+L29v3w==} - peerDependencies: - hardhat: ^2.17.0 - typescript: ~5.0.0 - viem: ^2.7.6 - - '@nomicfoundation/ignition-core@0.15.5': - resolution: {integrity: sha512-FgvuoIXhakRSP524JzNQ4BviyzBBKpsFaOWubPZ4XACLT4/7vGqlJ/7DIn0D2NL2anQ2qs98/BNBY9WccXUX1Q==} - - '@nomicfoundation/ignition-ui@0.15.5': - resolution: {integrity: sha512-ZcE4rIn10qKahR4OqS8rl8NM2Fbg2QYiBXgMgj74ZI0++LlCcZgB5HyaBbX+lsnKHjTXtjYD3b+2mtg7jFbAMQ==} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - resolution: {integrity: sha512-KcTodaQw8ivDZyF+D76FokN/HdpgGpfjc/gFCImdLUyqB6eSWVaZPazMbeAjmfhx3R0zm/NYVzxwAokFKgrc0w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': - resolution: {integrity: sha512-XhQG4BaJE6cIbjAVtzGOGbK3sn1BO9W29uhk9J8y8fZF1DYz0Doj8QDMfpMu+A6TjPDs61lbsmeYodIDnfveSA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': - resolution: {integrity: sha512-GHF1VKRdHW3G8CndkwdaeLkVBi5A9u2jwtlS7SLhBc8b5U/GcoL39Q+1CSO3hYqePNP+eV5YI7Zgm0ea6kMHoA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': - resolution: {integrity: sha512-g4Cv2fO37ZsUENQ2vwPnZc2zRenHyAxHcyBjKcjaSmmkKrFr64yvzeNO8S3GBFCo90rfochLs99wFVGT/0owpg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': - resolution: {integrity: sha512-WJ3CE5Oek25OGE3WwzK7oaopY8xMw9Lhb0mlYuJl/maZVo+WtP36XoQTb7bW/i8aAdHW5Z+BqrHMux23pvxG3w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': - resolution: {integrity: sha512-5WN7leSr5fkUBBjE4f3wKENUy9HQStu7HmWqbtknfXkkil+eNWiBV275IOlpXku7v3uLsXTOKpnnGHJYI2qsdA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': - resolution: {integrity: sha512-KdYMkJOq0SYPQMmErv/63CwGwMm5XHenEna9X9aB8mQmhDBrYrlAOSsIPgFCUSL0hjxE3xHP65/EPXR/InD2+w==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': - resolution: {integrity: sha512-VFZASBfl4qiBYwW5xeY20exWhmv6ww9sWu/krWSesv3q5hA0o1JuzmPHR4LPN6SUZj5vcqci0O6JOL8BPw+APg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - resolution: {integrity: sha512-JnFkYuyCSA70j6Si6cS1A9Gh1aHTEb8kOTBApp/c7NRTFGNMH8eaInKlyuuiIbvYFhlXW4LicqyYuWNNq9hkpQ==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - resolution: {integrity: sha512-HrVJr6+WjIXGnw3Q9u6KQcbZCtk0caVWhCdFADySvRyUxJ8PnzlaP+MhwNE8oyT8OZ6ejHBRrrgjSqDCFXGirw==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} + engines: {node: '>= 12'} - '@nomicfoundation/solidity-analyzer@0.1.1': - resolution: {integrity: sha512-1LMtXj1puAxyFusBgUIy5pZk3073cNXYnXUpuNKFghHbIit/xZgbk0AokpUADbNm3gyD6bFWl3LRFh3dhVdREg==} + '@nomicfoundation/solidity-analyzer@0.1.2': + resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': @@ -1159,83 +1079,83 @@ packages: resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} engines: {node: '>=14'} - '@rollup/rollup-android-arm-eabi@4.16.2': - resolution: {integrity: sha512-VGodkwtEuZ+ENPz/CpDSl091koMv8ao5jHVMbG1vNK+sbx/48/wVzP84M5xSfDAC69mAKKoEkSo+ym9bXYRK9w==} + '@rollup/rollup-android-arm-eabi@4.18.0': + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.16.2': - resolution: {integrity: sha512-5/W1xyIdc7jw6c/f1KEtg1vYDBWnWCsLiipK41NiaWGLG93eH2edgE6EgQJ3AGiPERhiOLUqlDSfjRK08C9xFg==} + '@rollup/rollup-android-arm64@4.18.0': + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.16.2': - resolution: {integrity: sha512-vOAKMqZSTbPfyPVu1jBiy+YniIQd3MG7LUnqV0dA6Q5tyhdqYtxacTHP1+S/ksKl6qCtMG1qQ0grcIgk/19JEA==} + '@rollup/rollup-darwin-arm64@4.18.0': + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.16.2': - resolution: {integrity: sha512-aIJVRUS3Dnj6MqocBMrcXlatKm64O3ITeQAdAxVSE9swyhNyV1dwnRgw7IGKIkDQofatd8UqMSyUxuFEa42EcA==} + '@rollup/rollup-darwin-x64@4.18.0': + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.16.2': - resolution: {integrity: sha512-/bjfUiXwy3P5vYr6/ezv//Yle2Y0ak3a+Av/BKoi76nFryjWCkki8AuVoPR7ZU/ckcvAWFo77OnFK14B9B5JsA==} + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.16.2': - resolution: {integrity: sha512-S24b+tJHwpq2TNRz9T+r71FjMvyBBApY8EkYxz8Cwi/rhH6h+lu/iDUxyc9PuHf9UvyeBFYkWWcrDahai/NCGw==} + '@rollup/rollup-linux-arm-musleabihf@4.18.0': + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.16.2': - resolution: {integrity: sha512-UN7VAXLyeyGbCQWiOtQN7BqmjTDw1ON2Oos4lfk0YR7yNhFEJWZiwGtvj9Ay4lsT/ueT04sh80Sg2MlWVVZ+Ug==} + '@rollup/rollup-linux-arm64-gnu@4.18.0': + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.16.2': - resolution: {integrity: sha512-ZBKvz3+rIhQjusKMccuJiPsStCrPOtejCHxTe+yWp3tNnuPWtyCh9QLGPKz6bFNFbwbw28E2T6zDgzJZ05F1JQ==} + '@rollup/rollup-linux-arm64-musl@4.18.0': + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.16.2': - resolution: {integrity: sha512-LjMMFiVBRL3wOe095vHAekL4b7nQqf4KZEpdMWd3/W+nIy5o9q/8tlVKiqMbfieDypNXLsxM9fexOxd9Qcklyg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.16.2': - resolution: {integrity: sha512-ohkPt0lKoCU0s4B6twro2aft+QROPdUiWwOjPNTzwTsBK5w+2+iT9kySdtOdq0gzWJAdiqsV4NFtXOwGZmIsHA==} + '@rollup/rollup-linux-riscv64-gnu@4.18.0': + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.16.2': - resolution: {integrity: sha512-jm2lvLc+/gqXfndlpDw05jKvsl/HKYxUEAt1h5UXcMFVpO4vGpoWmJVUfKDtTqSaHcCNw1his1XjkgR9aort3w==} + '@rollup/rollup-linux-s390x-gnu@4.18.0': + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.16.2': - resolution: {integrity: sha512-oc5/SlITI/Vj/qL4UM+lXN7MERpiy1HEOnrE+SegXwzf7WP9bzmZd6+MDljCEZTdSY84CpvUv9Rq7bCaftn1+g==} + '@rollup/rollup-linux-x64-gnu@4.18.0': + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.16.2': - resolution: {integrity: sha512-/2VWEBG6mKbS2itm7hzPwhIPaxfZh/KLWrYg20pCRLHhNFtF+epLgcBtwy3m07bl/k86Q3PFRAf2cX+VbZbwzQ==} + '@rollup/rollup-linux-x64-musl@4.18.0': + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.16.2': - resolution: {integrity: sha512-Wg7ANh7+hSilF0lG3e/0Oy8GtfTIfEk1327Bw8juZOMOoKmJLs3R+a4JDa/4cHJp2Gs7QfCDTepXXcyFD0ubBg==} + '@rollup/rollup-win32-arm64-msvc@4.18.0': + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.16.2': - resolution: {integrity: sha512-J/jCDKVMWp0Y2ELnTjpQFYUCUWv1Jr+LdFrJVZtdqGyjDo0PHPa7pCamjHvJel6zBFM3doFFqAr7cmXYWBAbfw==} + '@rollup/rollup-win32-ia32-msvc@4.18.0': + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.16.2': - resolution: {integrity: sha512-3nIf+SJMs2ZzrCh+SKNqgLVV9hS/UY0UjT1YU8XQYFGLiUfmHYJ/5trOU1XSvmHjV5gTF/K3DjrWxtyzKKcAHA==} + '@rollup/rollup-win32-x64-msvc@4.18.0': + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} cpu: [x64] os: [win32] @@ -1253,8 +1173,8 @@ packages: '@rushstack/ts-command-line@4.17.1': resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - '@scure/base@1.1.6': - resolution: {integrity: sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==} + '@scure/base@1.1.7': + resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} @@ -1262,8 +1182,8 @@ packages: '@scure/bip32@1.3.2': resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - '@scure/bip32@1.3.3': - resolution: {integrity: sha512-LJaN3HwRbfQK0X1xFSi0Q9amqOgzQnnDngIt+ZlsBC3Bm7/nE7K0kwshZHyaru79yIVRv/e1mQAjZyuZG6jOFQ==} + '@scure/bip32@1.4.0': + resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} @@ -1271,8 +1191,8 @@ packages: '@scure/bip39@1.2.1': resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - '@scure/bip39@1.2.2': - resolution: {integrity: sha512-HYf9TUXG80beW+hGAt3TRM8wU6pQoYur9iNypTROm42dorCGmLnFe3eWjz3gOq6G62H2WRh0FCzAR1PI+29zIA==} + '@scure/bip39@1.3.0': + resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} @@ -1374,8 +1294,8 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -1386,8 +1306,8 @@ packages: '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - '@types/chai@4.3.14': - resolution: {integrity: sha512-Wj71sXE4Q4AkGdG9Tvq1u/fquNz9EdG4LIJMwVVII7ashjD/8cf8fyIfJAjRr6YcsXnSE8cOGQPq1gqeR8z+3w==} + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} @@ -1458,6 +1378,9 @@ packages: '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} + '@types/node@18.19.36': + resolution: {integrity: sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==} + '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} @@ -1479,11 +1402,11 @@ packages: '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - '@types/react-dom@18.2.25': - resolution: {integrity: sha512-o/V48vf4MQh7juIKZU2QGDfli6p1+OOi5oXx36Hffpc9adsHeXjVp8rHuPkjd8VT8sOJ2Zp05HR7CdpGTIUFUA==} + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - '@types/react@18.2.79': - resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + '@types/react@18.3.3': + resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} @@ -1576,8 +1499,8 @@ packages: '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitejs/plugin-react@4.2.1': - resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + '@vitejs/plugin-react@4.3.1': + resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 @@ -1612,12 +1535,12 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + acorn-walk@8.3.3: + resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + acorn@8.12.0: + resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} engines: {node: '>=0.4.0'} hasBin: true @@ -1642,8 +1565,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.16.0: + resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} @@ -1771,8 +1694,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.6.8: - resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} @@ -1822,8 +1745,8 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} brorand@1.1.0: @@ -1835,8 +1758,8 @@ packages: browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1891,8 +1814,8 @@ packages: camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - caniuse-lite@1.0.30001612: - resolution: {integrity: sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==} + caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} @@ -2074,8 +1997,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.29.0: - resolution: {integrity: sha512-ADqhlrCKhhQF8s/s3hTpvVAIyWwsfgFI/hD2vhAXc2ndncJFVZaq3/uBkDIhf4RrNwPw93vUarW36x6rFbUk0Q==} + cytoscape@3.29.2: + resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -2232,8 +2155,8 @@ packages: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -2264,6 +2187,15 @@ packages: supports-color: optional: true + debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -2283,8 +2215,8 @@ packages: decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -2360,11 +2292,11 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dompurify@3.0.5: - resolution: {integrity: sha512-F9e6wPGtY+8KNMRAVfxeCOHU0/NPWMSENNq4pQctuXRqqdEPW7q3CrLbR5Nse044WwacyjHGOMlvNsBe1y6z9A==} + dompurify@3.1.5: + resolution: {integrity: sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==} - electron-to-chromium@1.4.746: - resolution: {integrity: sha512-jeWaIta2rIG2FzHaYIhSuVWqC6KJYo7oSBX4Jv7g+aVujKztfvdpf+n6MGwZdC5hQXbax4nntykLH2juIQrfPg==} + electron-to-chromium@1.4.805: + resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} @@ -2378,8 +2310,8 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + enhanced-resolve@5.17.0: + resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -2548,8 +2480,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.20.2: - resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true @@ -2638,8 +2570,8 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-hooks@4.6.0: - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 @@ -2731,8 +2663,8 @@ packages: ethereum-cryptography@1.2.0: resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - ethereum-cryptography@2.1.3: - resolution: {integrity: sha512-BlwbIL7/P45W8FGW2r7LGuvoEZ+7PWsniMvQ4p5s2xCyw9tmaDlpfsN9HjAucbF+t/qpVHwZUisgfK24TCW8aA==} + ethereum-cryptography@2.2.0: + resolution: {integrity: sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA==} ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} @@ -2747,8 +2679,8 @@ packages: ethers@5.7.2: resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - ethers@6.12.0: - resolution: {integrity: sha512-zL5NlOTjML239gIvtVJuaSk0N9GQLi1Hom3ZWUszE5lDTQE/IVB62mrPkQ2W1bGcZwVGSLaetQbWNQSvI4rGDQ==} + ethers@6.13.1: + resolution: {integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==} engines: {node: '>=14.0.0'} ethjs-unit@0.1.6: @@ -2797,8 +2729,8 @@ packages: resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} engines: {node: '>=14.16'} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} find-cache-dir@3.3.2: @@ -2941,8 +2873,8 @@ packages: resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} engines: {node: '>= 0.4'} - get-tsconfig@4.7.3: - resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + get-tsconfig@4.7.5: + resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} ghost-testrpc@0.0.2: resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} @@ -2966,13 +2898,16 @@ packages: glob@7.2.0: resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} @@ -2990,8 +2925,8 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} globby@10.0.2: @@ -3029,8 +2964,8 @@ packages: peerDependencies: hardhat: ^2.0.2 - hardhat@2.22.3: - resolution: {integrity: sha512-k8JV2ECWNchD6ahkg2BR5wKVxY0OiKot7fuxiIpRK0frRqyOljcR2vKwgWSLw6YIeDcNNA4xybj7Og7NSxr2hA==} + hardhat@2.22.5: + resolution: {integrity: sha512-9Zq+HonbXCSy6/a13GY1cgHglQRfh4qkzmj1tpPlhxJDwNVnhxlReV6K7hCWFKlOrV13EQwsdcD0rjcaQKWRZw==} hasBin: true peerDependencies: ts-node: '*' @@ -3151,8 +3086,8 @@ packages: immer@10.0.2: resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - immutable@4.3.5: - resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + immutable@4.3.6: + resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -3176,6 +3111,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -3348,8 +3284,8 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isows@1.0.3: - resolution: {integrity: sha512-2cKei4vlmg2cxEjm3wVSqn8pcoRF/LX/wpifuuNquFO4SQmPwarClT+SUCA2lt+l581tTeZIPIZuIDo2jWN1fg==} + isows@1.0.4: + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} peerDependencies: ws: '*' @@ -3670,8 +3606,8 @@ packages: micromark@3.2.0: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} engines: {node: '>=8.6'} mime-db@1.52.0: @@ -3783,8 +3719,8 @@ packages: node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-gyp-build@4.8.0: - resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} hasBin: true node-preload@0.2.1: @@ -3888,8 +3824,8 @@ packages: resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} engines: {node: '>= 0.8.0'} - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} ordinal@1.0.3: @@ -4007,8 +3943,8 @@ packages: resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} engines: {node: '>=14.16'} - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -4098,16 +4034,16 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} - react-dom@18.2.0: - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: - react: ^18.2.0 + react: ^18.3.1 react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} engines: {node: '>=0.10.0'} react-router-dom@6.11.0: @@ -4123,14 +4059,14 @@ packages: peerDependencies: react: '>=16.8' - react-tooltip@5.26.3: - resolution: {integrity: sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==} + react-tooltip@5.27.0: + resolution: {integrity: sha512-JXROcdfCEbCqkAkh8LyTSP3guQ0dG53iY2E2o4fw3D8clKzziMpE6QG6CclDaHELEKTzpMSeAOsdtg0ahoQosw==} peerDependencies: react: '>=16.14.0' react-dom: '>=16.14.0' - react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} read-pkg-up@9.1.0: @@ -4233,10 +4169,12 @@ packages: rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true ripemd160@2.0.2: @@ -4249,8 +4187,8 @@ packages: robust-predicates@3.0.2: resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - rollup@4.16.2: - resolution: {integrity: sha512-sxDP0+pya/Yi5ZtptF4p3avI+uWCIf/OdrfdH2Gbv1kWddLKk0U7WE3PmQokhi5JrektxsK3sK8s4hzAmjqahw==} + rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -4289,8 +4227,8 @@ packages: resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} hasBin: true - scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} scrypt-js@3.0.1: resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} @@ -4312,8 +4250,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} hasBin: true @@ -4424,8 +4362,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.18: + resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} split2@3.2.2: resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} @@ -4521,8 +4459,8 @@ packages: react-dom: '>= 16.8.0' react-is: '>= 16.8.0' - stylis@4.3.1: - resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + stylis@4.3.2: + resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} supports-color@3.2.3: resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} @@ -4750,14 +4688,17 @@ packages: resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} engines: {node: '>=8'} - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + uglify-js@3.18.0: + resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} engines: {node: '>=0.8.0'} hasBin: true unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -4785,8 +4726,8 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + update-browserslist-db@1.0.16: + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4819,12 +4760,12 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} - viem@2.9.25: - resolution: {integrity: sha512-W0QOXCsYQppnV89PQP0EnCvfZIEsDYqmpVakLPNrok4Q4B7651M3MV/sYifYcLWv3Mn4KUyMCUlVxlej6CfC/w==} + viem@2.15.1: + resolution: {integrity: sha512-Vrveen3vDOJyPf8Q8TDyWePG2pTdK6IpSi4P6qlvAP+rXkAeqRvwYBy9AmGm+BeYpCETAyTT0SrCP6458XSt+w==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -4838,8 +4779,8 @@ packages: rollup: ^4.12.0 vite: ^5.1.4 - vite@5.2.10: - resolution: {integrity: sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==} + vite@5.3.1: + resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -4939,8 +4880,8 @@ packages: utf-8-validate: optional: true - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4951,8 +4892,8 @@ packages: utf-8-validate: optional: true - ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -4963,18 +4904,6 @@ packages: utf-8-validate: optional: true - ws@8.5.0: - resolution: {integrity: sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -5031,8 +4960,6 @@ packages: snapshots: - '@aashutoshrathi/word-wrap@1.2.6': {} - '@adraffy/ens-normalize@1.10.0': {} '@adraffy/ens-normalize@1.10.1': {} @@ -5042,151 +4969,158 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/code-frame@7.24.2': + '@babel/code-frame@7.24.7': dependencies: - '@babel/highlight': 7.24.2 - picocolors: 1.0.0 + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 - '@babel/compat-data@7.24.4': {} + '@babel/compat-data@7.24.7': {} - '@babel/core@7.24.4': + '@babel/core@7.24.7': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-compilation-targets': 7.23.6 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4) - '@babel/helpers': 7.24.4 - '@babel/parser': 7.24.4 - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1(supports-color@5.5.0) - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/types': 7.24.7 convert-source-map: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.24.4': + '@babel/generator@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 - '@babel/helper-annotate-as-pure@7.22.5': + '@babel/helper-annotate-as-pure@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 - '@babel/helper-compilation-targets@7.23.6': + '@babel/helper-compilation-targets@7.24.7': dependencies: - '@babel/compat-data': 7.24.4 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.23.0 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.24.7 - '@babel/helper-function-name@7.23.0': + '@babel/helper-function-name@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 - '@babel/helper-hoist-variables@7.22.5': + '@babel/helper-hoist-variables@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 - '@babel/helper-module-imports@7.24.3': + '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4)': + '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-plugin-utils@7.24.0': {} + '@babel/helper-plugin-utils@7.24.7': {} - '@babel/helper-simple-access@7.22.5': + '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/traverse': 7.24.7(supports-color@5.5.0) + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.22.6': + '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 - '@babel/helper-string-parser@7.24.1': {} + '@babel/helper-string-parser@7.24.7': {} - '@babel/helper-validator-identifier@7.22.20': {} + '@babel/helper-validator-identifier@7.24.7': {} - '@babel/helper-validator-option@7.23.5': {} + '@babel/helper-validator-option@7.24.7': {} - '@babel/helpers@7.24.4': + '@babel/helpers@7.24.7': dependencies: - '@babel/template': 7.24.0 - '@babel/traverse': 7.24.1(supports-color@5.5.0) - '@babel/types': 7.24.0 - transitivePeerDependencies: - - supports-color + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 - '@babel/highlight@7.24.2': + '@babel/highlight@7.24.7': dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 - picocolors: 1.0.0 + picocolors: 1.0.1 - '@babel/parser@7.24.4': + '@babel/parser@7.24.7': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 - '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-jsx-self@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.4)': + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': dependencies: - '@babel/core': 7.24.4 - '@babel/helper-plugin-utils': 7.24.0 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 - '@babel/template@7.24.0': + '@babel/template@7.24.7': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - '@babel/traverse@7.24.1(supports-color@5.5.0)': + '@babel/traverse@7.24.7(supports-color@5.5.0)': dependencies: - '@babel/code-frame': 7.24.2 - '@babel/generator': 7.24.4 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 - debug: 4.3.4(supports-color@5.5.0) + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 + debug: 4.3.5(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.24.0': + '@babel/types@7.24.7': dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 '@braintree/sanitize-url@6.0.4': {} @@ -5205,79 +5139,79 @@ snapshots: '@emotion/unitless@0.7.5': {} - '@esbuild/aix-ppc64@0.20.2': + '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/android-arm64@0.20.2': + '@esbuild/android-arm64@0.21.5': optional: true '@esbuild/android-arm@0.15.18': optional: true - '@esbuild/android-arm@0.20.2': + '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-x64@0.20.2': + '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.20.2': + '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-x64@0.20.2': + '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.20.2': + '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.20.2': + '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/linux-arm64@0.20.2': + '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm@0.20.2': + '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-ia32@0.20.2': + '@esbuild/linux-ia32@0.21.5': optional: true '@esbuild/linux-loong64@0.15.18': optional: true - '@esbuild/linux-loong64@0.20.2': + '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-mips64el@0.20.2': + '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-ppc64@0.20.2': + '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.20.2': + '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-s390x@0.20.2': + '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-x64@0.20.2': + '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.20.2': + '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.20.2': + '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.20.2': + '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/win32-arm64@0.20.2': + '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-ia32@0.20.2': + '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-x64@0.20.2': + '@esbuild/win32-x64@0.21.5': optional: true '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': @@ -5285,12 +5219,12 @@ snapshots: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + '@eslint-community/regexpp@4.10.1': {} '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.1 @@ -5308,7 +5242,7 @@ snapshots: '@ethereumjs/util@8.1.0': dependencies: '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.0 micro-ftch: 0.3.1 '@ethersproject/abi@5.7.0': @@ -5576,23 +5510,23 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@floating-ui/core@1.6.0': + '@floating-ui/core@1.6.2': dependencies: - '@floating-ui/utils': 0.2.1 + '@floating-ui/utils': 0.2.2 - '@floating-ui/dom@1.6.3': + '@floating-ui/dom@1.6.5': dependencies: - '@floating-ui/core': 1.6.0 - '@floating-ui/utils': 0.2.1 + '@floating-ui/core': 1.6.2 + '@floating-ui/utils': 0.2.2 - '@floating-ui/utils@0.2.1': {} + '@floating-ui/utils@0.2.2': {} '@fontsource/roboto@5.0.13': {} '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5646,20 +5580,20 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 - '@microsoft/api-extractor-model@7.28.9(@types/node@18.15.13)': + '@microsoft/api-extractor-model@7.28.9(@types/node@18.19.36)': dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.15.13) + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.36) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.40.1(@types/node@18.15.13)': + '@microsoft/api-extractor@7.40.1(@types/node@18.19.36)': dependencies: - '@microsoft/api-extractor-model': 7.28.9(@types/node@18.15.13) + '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.36) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.15.13) + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.36) '@rushstack/rig-package': 0.5.1 '@rushstack/ts-command-line': 4.17.1 colors: 1.2.5 @@ -5684,16 +5618,14 @@ snapshots: dependencies: '@noble/hashes': 1.3.2 - '@noble/curves@1.3.0': + '@noble/curves@1.4.0': dependencies: - '@noble/hashes': 1.3.3 + '@noble/hashes': 1.4.0 '@noble/hashes@1.2.0': {} '@noble/hashes@1.3.2': {} - '@noble/hashes@1.3.3': {} - '@noble/hashes@1.4.0': {} '@noble/secp256k1@1.7.1': {} @@ -5710,36 +5642,29 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@nomicfoundation/edr-darwin-arm64@0.3.5': - optional: true + '@nomicfoundation/edr-darwin-arm64@0.4.0': {} - '@nomicfoundation/edr-darwin-x64@0.3.5': - optional: true + '@nomicfoundation/edr-darwin-x64@0.4.0': {} - '@nomicfoundation/edr-linux-arm64-gnu@0.3.5': - optional: true + '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': {} - '@nomicfoundation/edr-linux-arm64-musl@0.3.5': - optional: true + '@nomicfoundation/edr-linux-arm64-musl@0.4.0': {} - '@nomicfoundation/edr-linux-x64-gnu@0.3.5': - optional: true + '@nomicfoundation/edr-linux-x64-gnu@0.4.0': {} - '@nomicfoundation/edr-linux-x64-musl@0.3.5': - optional: true + '@nomicfoundation/edr-linux-x64-musl@0.4.0': {} - '@nomicfoundation/edr-win32-x64-msvc@0.3.5': - optional: true + '@nomicfoundation/edr-win32-x64-msvc@0.4.0': {} - '@nomicfoundation/edr@0.3.5': - optionalDependencies: - '@nomicfoundation/edr-darwin-arm64': 0.3.5 - '@nomicfoundation/edr-darwin-x64': 0.3.5 - '@nomicfoundation/edr-linux-arm64-gnu': 0.3.5 - '@nomicfoundation/edr-linux-arm64-musl': 0.3.5 - '@nomicfoundation/edr-linux-x64-gnu': 0.3.5 - '@nomicfoundation/edr-linux-x64-musl': 0.3.5 - '@nomicfoundation/edr-win32-x64-msvc': 0.3.5 + '@nomicfoundation/edr@0.4.0': + dependencies: + '@nomicfoundation/edr-darwin-arm64': 0.4.0 + '@nomicfoundation/edr-darwin-x64': 0.4.0 + '@nomicfoundation/edr-linux-arm64-gnu': 0.4.0 + '@nomicfoundation/edr-linux-arm64-musl': 0.4.0 + '@nomicfoundation/edr-linux-x64-gnu': 0.4.0 + '@nomicfoundation/edr-linux-x64-musl': 0.4.0 + '@nomicfoundation/edr-win32-x64-msvc': 0.4.0 '@nomicfoundation/ethereumjs-common@4.0.4': dependencies: @@ -5761,87 +5686,64 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) '@types/chai-as-promised': 7.1.8 chai: 4.4.1 chai-as-promised: 7.1.1(chai@4.4.1) - deep-eql: 4.1.3 - ethers: 6.12.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + deep-eql: 4.1.4 + ethers: 6.13.1 + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) ordinal: 1.0.3 - '@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': dependencies: - debug: 4.3.4(supports-color@5.5.0) - ethers: 6.12.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + debug: 4.3.5(supports-color@5.5.0) + ethers: 6.13.1 + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) lodash.isequal: 4.5.0 transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-ignition-ethers@0.15.5(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/ignition-core@0.15.5)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-ignition': 0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/ignition-core': 0.15.5 - ethers: 6.12.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) - - '@nomicfoundation/hardhat-ignition@0.15.5(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - '@nomicfoundation/hardhat-verify': 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/ignition-core': 0.15.5 - '@nomicfoundation/ignition-ui': 0.15.5 - chalk: 4.1.2 - debug: 4.3.4(supports-color@5.5.0) - fs-extra: 10.1.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) - prompts: 2.4.2 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': dependencies: ethereumjs-util: 7.1.5 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.14)(@types/mocha@9.1.1)(@types/node@18.15.13)(chai@4.4.1)(ethers@6.12.0)(hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' + ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' : dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.6(@nomicfoundation/hardhat-ethers@3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-ethers': 3.0.5(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-verify': 2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - '@typechain/ethers-v6': 0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)) - '@types/chai': 4.3.14 + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)) + '@types/chai': 4.3.16 '@types/mocha': 9.1.1 - '@types/node': 18.15.13 + '@types/node': 18.19.36 chai: 4.4.1 - ethers: 6.12.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - solidity-coverage: 0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)) - ts-node: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + ethers: 6.13.1 + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + solidity-coverage: 0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + ts-node: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) typechain: 8.3.2(typescript@5.4.5) typescript: 5.4.5 - '@nomicfoundation/hardhat-verify@2.0.6(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))': + '@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/address': 5.6.1 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.4(supports-color@5.5.0) - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + debug: 4.3.5(supports-color@5.5.0) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) lodash.clonedeep: 4.5.0 semver: 6.3.1 table: 6.8.2 @@ -5849,86 +5751,46 @@ snapshots: transitivePeerDependencies: - supports-color - '@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5))': - dependencies: - abitype: 0.9.10(typescript@5.4.5) - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) - lodash.memoize: 4.1.2 - typescript: 5.4.5 - viem: 2.9.25(typescript@5.4.5) - transitivePeerDependencies: - - zod - - '@nomicfoundation/hardhat-viem@2.0.1(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.9.25(typescript@5.4.5))': + '@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5))': dependencies: abitype: 0.9.10(typescript@5.4.5) - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) lodash.memoize: 4.1.2 typescript: 5.4.5 - viem: 2.9.25(typescript@5.4.5) + viem: 2.15.1(typescript@5.4.5) transitivePeerDependencies: - zod - '@nomicfoundation/ignition-core@0.15.5': - dependencies: - '@ethersproject/address': 5.6.1 - '@nomicfoundation/solidity-analyzer': 0.1.1 - cbor: 9.0.2 - debug: 4.3.4(supports-color@5.5.0) - ethers: 6.12.0 - fs-extra: 10.1.0 - immer: 10.0.2 - lodash: 4.17.21 - ndjson: 2.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - - '@nomicfoundation/ignition-ui@0.15.5': {} - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-freebsd-x64@0.1.1': + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.1': + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc@0.1.1': + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': optional: true - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.1': - optional: true - - '@nomicfoundation/solidity-analyzer@0.1.1': + '@nomicfoundation/solidity-analyzer@0.1.2': optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.1 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-freebsd-x64': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.1 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-arm64-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-ia32-msvc': 0.1.1 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.1 + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': {} @@ -5936,55 +5798,55 @@ snapshots: '@remix-run/router@1.6.0': {} - '@rollup/rollup-android-arm-eabi@4.16.2': + '@rollup/rollup-android-arm-eabi@4.18.0': optional: true - '@rollup/rollup-android-arm64@4.16.2': + '@rollup/rollup-android-arm64@4.18.0': optional: true - '@rollup/rollup-darwin-arm64@4.16.2': + '@rollup/rollup-darwin-arm64@4.18.0': optional: true - '@rollup/rollup-darwin-x64@4.16.2': + '@rollup/rollup-darwin-x64@4.18.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.16.2': + '@rollup/rollup-linux-arm-gnueabihf@4.18.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.16.2': + '@rollup/rollup-linux-arm-musleabihf@4.18.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.16.2': + '@rollup/rollup-linux-arm64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.16.2': + '@rollup/rollup-linux-arm64-musl@4.18.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.16.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.16.2': + '@rollup/rollup-linux-riscv64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.16.2': + '@rollup/rollup-linux-s390x-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.16.2': + '@rollup/rollup-linux-x64-gnu@4.18.0': optional: true - '@rollup/rollup-linux-x64-musl@4.16.2': + '@rollup/rollup-linux-x64-musl@4.18.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.16.2': + '@rollup/rollup-win32-arm64-msvc@4.18.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.16.2': + '@rollup/rollup-win32-ia32-msvc@4.18.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.16.2': + '@rollup/rollup-win32-x64-msvc@4.18.0': optional: true - '@rushstack/node-core-library@3.66.0(@types/node@18.15.13)': + '@rushstack/node-core-library@3.66.0(@types/node@18.19.36)': dependencies: colors: 1.2.5 fs-extra: 7.0.1 @@ -5994,7 +5856,7 @@ snapshots: semver: 7.5.4 z-schema: 5.0.5 optionalDependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@rushstack/rig-package@0.5.1': dependencies: @@ -6008,40 +5870,40 @@ snapshots: colors: 1.2.5 string-argv: 0.3.2 - '@scure/base@1.1.6': {} + '@scure/base@1.1.7': {} '@scure/bip32@1.1.5': dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.6 + '@scure/base': 1.1.7 '@scure/bip32@1.3.2': dependencies: '@noble/curves': 1.2.0 '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@scure/base': 1.1.7 - '@scure/bip32@1.3.3': + '@scure/bip32@1.4.0': dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@scure/bip39@1.1.1': dependencies: '@noble/hashes': 1.2.0 - '@scure/base': 1.1.6 + '@scure/base': 1.1.7 '@scure/bip39@1.2.1': dependencies: '@noble/hashes': 1.3.2 - '@scure/base': 1.1.6 + '@scure/base': 1.1.7 - '@scure/bip39@1.2.2': + '@scure/bip39@1.3.0': dependencies: - '@noble/hashes': 1.3.3 - '@scure/base': 1.1.6 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 '@sentry/core@5.30.0': dependencies: @@ -6140,62 +6002,62 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)': + '@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)': dependencies: - ethers: 6.12.0 + ethers: 6.13.1 lodash: 4.17.21 ts-essentials: 7.0.3(typescript@5.4.5) typechain: 8.3.2(typescript@5.4.5) typescript: 5.4.5 - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.12.0)(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))': + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))': dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.12.0)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) - ethers: 6.12.0 + '@typechain/ethers-v6': 0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + ethers: 6.13.1 fs-extra: 9.1.0 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) typechain: 8.3.2(typescript@5.4.5) '@types/argparse@1.0.38': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.5 + '@types/babel__traverse': 7.20.6 '@types/babel__generator@7.6.8': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 - '@types/babel__traverse@7.20.5': + '@types/babel__traverse@7.20.6': dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.7 '@types/bn.js@4.11.6': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/bn.js@5.1.5': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/chai-as-promised@7.1.8': dependencies: - '@types/chai': 4.3.14 + '@types/chai': 4.3.16 - '@types/chai@4.3.14': {} + '@types/chai@4.3.16': {} '@types/concat-stream@1.6.1': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/d3-scale-chromatic@3.0.3': {} @@ -6213,20 +6075,20 @@ snapshots: '@types/form-data@0.0.33': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/fs-extra@9.0.13': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/hoist-non-react-statics@3.3.5': dependencies: - '@types/react': 18.2.79 + '@types/react': 18.3.3 hoist-non-react-statics: 3.3.2 '@types/json-schema@7.0.15': {} @@ -6255,44 +6117,48 @@ snapshots: '@types/ndjson@2.0.1': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/through': 0.0.33 '@types/node@10.17.60': {} '@types/node@18.15.13': {} + '@types/node@18.19.36': + dependencies: + undici-types: 5.26.5 + '@types/node@8.10.66': {} '@types/normalize-package-data@2.4.4': {} '@types/pbkdf2@3.1.2': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/prettier@2.7.3': {} '@types/prompts@2.4.9': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 kleur: 3.0.3 '@types/prop-types@15.7.12': {} '@types/qs@6.9.15': {} - '@types/react-dom@18.2.25': + '@types/react-dom@18.3.0': dependencies: - '@types/react': 18.2.79 + '@types/react': 18.3.3 - '@types/react@18.2.79': + '@types/react@18.3.3': dependencies: '@types/prop-types': 15.7.12 csstype: 3.1.3 '@types/secp256k1@4.0.6': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/semver@7.5.8': {} @@ -6305,28 +6171,28 @@ snapshots: '@types/styled-components@5.1.26': dependencies: '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.2.79 + '@types/react': 18.3.3 csstype: 3.1.3 '@types/through@0.0.33': dependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 '@types/unist@2.0.10': {} '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': dependencies: - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare-lite: 1.4.0 - semver: 7.6.0 + semver: 7.6.2 tsutils: 3.21.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -6346,7 +6212,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) eslint: 8.57.0 optionalDependencies: typescript: 5.4.5 @@ -6362,7 +6228,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.4.5) optionalDependencies: @@ -6376,10 +6242,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - semver: 7.6.0 + semver: 7.6.2 tsutils: 3.21.0(typescript@5.4.5) optionalDependencies: typescript: 5.4.5 @@ -6396,7 +6262,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) eslint: 8.57.0 eslint-scope: 5.1.1 - semver: 7.6.0 + semver: 7.6.2 transitivePeerDependencies: - supports-color - typescript @@ -6410,14 +6276,14 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@vitejs/plugin-react@4.2.1(vite@5.2.10(@types/node@18.15.13))': + '@vitejs/plugin-react@4.3.1(vite@5.3.1(@types/node@18.19.36))': dependencies: - '@babel/core': 7.24.4 - '@babel/plugin-transform-react-jsx-self': 7.24.1(@babel/core@7.24.4) - '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.4) + '@babel/core': 7.24.7 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 - vite: 5.2.10(@types/node@18.15.13) + react-refresh: 0.14.2 + vite: 5.3.1(@types/node@18.19.36) transitivePeerDependencies: - supports-color @@ -6431,13 +6297,15 @@ snapshots: optionalDependencies: typescript: 5.4.5 - acorn-jsx@5.3.2(acorn@8.11.3): + acorn-jsx@5.3.2(acorn@8.12.0): dependencies: - acorn: 8.11.3 + acorn: 8.12.0 - acorn-walk@8.3.2: {} + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.0 - acorn@8.11.3: {} + acorn@8.12.0: {} adm-zip@0.4.16: {} @@ -6447,7 +6315,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -6463,7 +6331,7 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.16.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 @@ -6592,24 +6460,25 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 - axios@1.6.8: + axios@1.7.2: dependencies: - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - babel-plugin-styled-components@2.1.4(@babel/core@7.24.4)(styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0)): + babel-plugin-styled-components@2.1.4(@babel/core@7.24.7)(styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): dependencies: - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-module-imports': 7.24.3 - '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) lodash: 4.17.21 picomatch: 2.3.1 - styled-components: 5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0) + styled-components: 5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) transitivePeerDependencies: - '@babel/core' + - supports-color balanced-match@1.0.2: {} @@ -6655,9 +6524,9 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: + braces@3.0.3: dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 brorand@1.1.0: {} @@ -6672,12 +6541,12 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 - browserslist@4.23.0: + browserslist@4.23.1: dependencies: - caniuse-lite: 1.0.30001612 - electron-to-chromium: 1.4.746 + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.805 node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) bs58@4.0.1: dependencies: @@ -6731,7 +6600,7 @@ snapshots: camelize@1.0.1: {} - caniuse-lite@1.0.30001612: {} + caniuse-lite@1.0.30001636: {} caseless@0.12.0: {} @@ -6752,7 +6621,7 @@ snapshots: dependencies: assertion-error: 1.1.0 check-error: 1.0.3 - deep-eql: 4.1.3 + deep-eql: 4.1.4 get-func-name: 2.0.2 loupe: 2.3.7 pathval: 1.1.1 @@ -6780,7 +6649,7 @@ snapshots: chokidar@3.5.3: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6792,7 +6661,7 @@ snapshots: chokidar@3.6.0: dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -6940,12 +6809,12 @@ snapshots: csstype@3.1.3: {} - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.0): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): dependencies: cose-base: 1.0.3 - cytoscape: 3.29.0 + cytoscape: 3.29.2 - cytoscape@3.29.0: {} + cytoscape@3.29.2: {} d3-array@2.12.1: dependencies: @@ -7137,7 +7006,7 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.1 - dayjs@1.11.10: {} + dayjs@1.11.11: {} death@1.1.0: {} @@ -7151,17 +7020,17 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - debug@4.3.4(supports-color@5.5.0): + debug@4.3.4(supports-color@8.1.1): dependencies: ms: 2.1.2 optionalDependencies: - supports-color: 5.5.0 + supports-color: 8.1.1 - debug@4.3.4(supports-color@8.1.1): + debug@4.3.5(supports-color@5.5.0): dependencies: ms: 2.1.2 optionalDependencies: - supports-color: 8.1.1 + supports-color: 5.5.0 decamelize-keys@1.1.1: dependencies: @@ -7178,7 +7047,7 @@ snapshots: dependencies: character-entities: 2.0.2 - deep-eql@4.1.3: + deep-eql@4.1.4: dependencies: type-detect: 4.0.8 @@ -7248,9 +7117,9 @@ snapshots: dependencies: esutils: 2.0.3 - dompurify@3.0.5: {} + dompurify@3.1.5: {} - electron-to-chromium@1.4.746: {} + electron-to-chromium@1.4.805: {} elkjs@0.9.3: {} @@ -7276,7 +7145,7 @@ snapshots: emoji-regex@8.0.0: {} - enhanced-resolve@5.16.0: + enhanced-resolve@5.17.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -7309,7 +7178,7 @@ snapshots: function.prototype.name: 1.1.6 get-intrinsic: 1.2.4 get-symbol-description: 1.0.2 - globalthis: 1.0.3 + globalthis: 1.0.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 has-proto: 1.0.3 @@ -7454,31 +7323,31 @@ snapshots: esbuild-windows-64: 0.15.18 esbuild-windows-arm64: 0.15.18 - esbuild@0.20.2: + esbuild@0.21.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.20.2 - '@esbuild/android-arm': 0.20.2 - '@esbuild/android-arm64': 0.20.2 - '@esbuild/android-x64': 0.20.2 - '@esbuild/darwin-arm64': 0.20.2 - '@esbuild/darwin-x64': 0.20.2 - '@esbuild/freebsd-arm64': 0.20.2 - '@esbuild/freebsd-x64': 0.20.2 - '@esbuild/linux-arm': 0.20.2 - '@esbuild/linux-arm64': 0.20.2 - '@esbuild/linux-ia32': 0.20.2 - '@esbuild/linux-loong64': 0.20.2 - '@esbuild/linux-mips64el': 0.20.2 - '@esbuild/linux-ppc64': 0.20.2 - '@esbuild/linux-riscv64': 0.20.2 - '@esbuild/linux-s390x': 0.20.2 - '@esbuild/linux-x64': 0.20.2 - '@esbuild/netbsd-x64': 0.20.2 - '@esbuild/openbsd-x64': 0.20.2 - '@esbuild/sunos-x64': 0.20.2 - '@esbuild/win32-arm64': 0.20.2 - '@esbuild/win32-ia32': 0.20.2 - '@esbuild/win32-x64': 0.20.2 + '@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 escalade@3.1.2: {} @@ -7509,13 +7378,13 @@ snapshots: eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0): dependencies: - debug: 4.3.4(supports-color@5.5.0) - enhanced-resolve: 5.16.0 + debug: 4.3.5(supports-color@5.5.0) + enhanced-resolve: 5.17.0 eslint: 8.57.0 eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) fast-glob: 3.3.2 - get-tsconfig: 4.7.3 + get-tsconfig: 4.7.5 is-core-module: 2.13.1 is-glob: 4.0.3 transitivePeerDependencies: @@ -7578,7 +7447,7 @@ snapshots: optionalDependencies: eslint-config-prettier: 8.3.0(eslint@8.57.0) - eslint-plugin-react-hooks@4.6.0(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): dependencies: eslint: 8.57.0 @@ -7608,7 +7477,7 @@ snapshots: eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.0 + '@eslint-community/regexpp': 4.10.1 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -7618,7 +7487,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -7642,7 +7511,7 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.3 + optionator: 0.9.4 strip-ansi: 6.0.1 text-table: 0.2.0 transitivePeerDependencies: @@ -7650,8 +7519,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) + acorn: 8.12.0 + acorn-jsx: 5.3.2(acorn@8.12.0) eslint-visitor-keys: 3.4.3 esprima@2.7.3: {} @@ -7677,7 +7546,7 @@ snapshots: eth-gas-reporter@0.2.27: dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.6.8 + axios: 1.7.2 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -7723,12 +7592,12 @@ snapshots: '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.1.3: + ethereum-cryptography@2.2.0: dependencies: - '@noble/curves': 1.3.0 - '@noble/hashes': 1.3.3 - '@scure/bip32': 1.3.3 - '@scure/bip39': 1.2.2 + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/bip32': 1.4.0 + '@scure/bip39': 1.3.0 ethereumjs-abi@0.6.8: dependencies: @@ -7789,7 +7658,7 @@ snapshots: - bufferutil - utf-8-validate - ethers@6.12.0: + ethers@6.13.1: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -7797,7 +7666,7 @@ snapshots: '@types/node': 18.15.13 aes-js: 4.0.0-beta.5 tslib: 2.4.0 - ws: 8.5.0 + ws: 8.17.1 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7851,7 +7720,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.7 fast-json-stable-stringify@2.1.0: {} @@ -7871,7 +7740,7 @@ snapshots: strtok3: 7.0.0 token-types: 5.0.1 - fill-range@7.0.1: + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -7914,9 +7783,9 @@ snapshots: flatted@3.3.1: {} - follow-redirects@1.15.6(debug@4.3.4): + follow-redirects@1.15.6(debug@4.3.5): optionalDependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) for-each@0.3.3: dependencies: @@ -8022,7 +7891,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.4 - get-tsconfig@4.7.3: + get-tsconfig@4.7.5: dependencies: resolve-pkg-maps: 1.0.0 @@ -8098,9 +7967,10 @@ snapshots: dependencies: type-fest: 0.20.2 - globalthis@1.0.3: + globalthis@1.0.4: dependencies: define-properties: 1.2.1 + gopd: 1.0.1 globby@10.0.2: dependencies: @@ -8139,15 +8009,15 @@ snapshots: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.4 + uglify-js: 3.18.0 hard-rejection@2.1.0: {} - hardhat-gas-reporter@1.0.10(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)): + hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)): dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) sha1: 1.1.1 transitivePeerDependencies: - '@codechecks/client' @@ -8155,15 +8025,15 @@ snapshots: - debug - utf-8-validate - hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5): + hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.3.5 + '@nomicfoundation/edr': 0.4.0 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.1 + '@nomicfoundation/solidity-analyzer': 0.1.2 '@sentry/node': 5.30.0 '@types/bn.js': 5.1.5 '@types/lru-cache': 5.1.1 @@ -8174,7 +8044,7 @@ snapshots: chalk: 2.4.2 chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -8183,7 +8053,7 @@ snapshots: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.5 + immutable: 4.3.6 io-ts: 1.10.4 keccak: 3.0.4 lodash: 4.17.21 @@ -8193,15 +8063,15 @@ snapshots: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.7.3(debug@4.3.4) + solc: 0.7.3(debug@4.3.5) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 tsort: 0.0.1 undici: 5.28.4 uuid: 8.3.2 - ws: 7.5.9 + ws: 7.5.10 optionalDependencies: - ts-node: 10.9.1(@types/node@18.15.13)(typescript@5.4.5) + ts-node: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: - bufferutil @@ -8295,7 +8165,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8317,7 +8187,7 @@ snapshots: immer@10.0.2: {} - immutable@4.3.5: {} + immutable@4.3.6: {} import-fresh@3.3.0: dependencies: @@ -8470,9 +8340,9 @@ snapshots: isexe@2.0.0: {} - isows@1.0.3(ws@8.13.0): + isows@1.0.4(ws@8.17.1): dependencies: - ws: 8.13.0 + ws: 8.17.1 istanbul-lib-coverage@3.2.2: {} @@ -8482,7 +8352,7 @@ snapshots: istanbul-lib-instrument@4.0.3: dependencies: - '@babel/core': 7.24.4 + '@babel/core': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -8506,7 +8376,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -8573,7 +8443,7 @@ snapshots: keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.1 readable-stream: 3.6.2 keyv@4.5.4: @@ -8674,7 +8544,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.0 + semver: 7.6.2 make-error@1.3.6: {} @@ -8737,19 +8607,19 @@ snapshots: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.0) + cytoscape: 3.29.2 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.2) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 - dayjs: 1.11.10 - dompurify: 3.0.5 + dayjs: 1.11.11 + dompurify: 3.1.5 elkjs: 0.9.3 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.1 + stylis: 4.3.2 ts-dedent: 2.2.0 uuid: 9.0.1 web-worker: 1.3.0 @@ -8872,7 +8742,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -8891,9 +8761,9 @@ snapshots: transitivePeerDependencies: - supports-color - micromatch@4.0.5: + micromatch@4.0.7: dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 mime-db@1.52.0: {} @@ -9030,7 +8900,7 @@ snapshots: dependencies: lodash: 4.17.21 - node-gyp-build@4.8.0: {} + node-gyp-build@4.8.1: {} node-preload@0.2.1: dependencies: @@ -9050,14 +8920,14 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 normalize-package-data@4.0.1: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.2 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -9177,14 +9047,14 @@ snapshots: type-check: 0.3.2 word-wrap: 1.2.5 - optionator@0.9.3: + optionator@0.9.4: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + word-wrap: 1.2.5 ordinal@1.0.3: {} @@ -9249,7 +9119,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.24.2 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -9284,7 +9154,7 @@ snapshots: peek-readable@5.0.0: {} - picocolors@1.0.0: {} + picocolors@1.0.1: {} picomatch@2.3.1: {} @@ -9301,7 +9171,7 @@ snapshots: postcss@8.4.38: dependencies: nanoid: 3.3.7 - picocolors: 1.0.0 + picocolors: 1.0.1 source-map-js: 1.2.0 prelude-ls@1.1.2: {} @@ -9316,7 +9186,7 @@ snapshots: dependencies: '@solidity-parser/parser': 0.16.2 prettier: 2.8.8 - semver: 7.6.0 + semver: 7.6.2 solidity-comments-extractor: 0.0.7 prettier@2.8.8: {} @@ -9361,36 +9231,36 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@18.2.0(react@18.2.0): + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 + react: 18.3.1 + scheduler: 0.23.2 react-is@16.13.1: {} - react-refresh@0.14.0: {} + react-refresh@0.14.2: {} - react-router-dom@6.11.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-router-dom@6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.6.0 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.11.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.11.0(react@18.3.1) - react-router@6.11.0(react@18.2.0): + react-router@6.11.0(react@18.3.1): dependencies: '@remix-run/router': 1.6.0 - react: 18.2.0 + react: 18.3.1 - react-tooltip@5.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0): + react-tooltip@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@floating-ui/dom': 1.6.3 + '@floating-ui/dom': 1.6.5 classnames: 2.5.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) - react@18.2.0: + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -9500,7 +9370,7 @@ snapshots: rimraf@2.7.1: dependencies: - glob: 7.2.3 + glob: 7.2.0 rimraf@3.0.2: dependencies: @@ -9517,26 +9387,26 @@ snapshots: robust-predicates@3.0.2: {} - rollup@4.16.2: + rollup@4.18.0: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.16.2 - '@rollup/rollup-android-arm64': 4.16.2 - '@rollup/rollup-darwin-arm64': 4.16.2 - '@rollup/rollup-darwin-x64': 4.16.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.16.2 - '@rollup/rollup-linux-arm-musleabihf': 4.16.2 - '@rollup/rollup-linux-arm64-gnu': 4.16.2 - '@rollup/rollup-linux-arm64-musl': 4.16.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.16.2 - '@rollup/rollup-linux-riscv64-gnu': 4.16.2 - '@rollup/rollup-linux-s390x-gnu': 4.16.2 - '@rollup/rollup-linux-x64-gnu': 4.16.2 - '@rollup/rollup-linux-x64-musl': 4.16.2 - '@rollup/rollup-win32-arm64-msvc': 4.16.2 - '@rollup/rollup-win32-ia32-msvc': 4.16.2 - '@rollup/rollup-win32-x64-msvc': 4.16.2 + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 fsevents: 2.3.3 run-applescript@5.0.0: @@ -9589,7 +9459,7 @@ snapshots: which: 1.3.1 wordwrap: 1.0.0 - scheduler@0.23.0: + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -9599,7 +9469,7 @@ snapshots: dependencies: elliptic: 6.5.5 node-addon-api: 2.0.2 - node-gyp-build: 4.8.0 + node-gyp-build: 4.8.1 semver@5.7.2: {} @@ -9609,9 +9479,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.6.0: - dependencies: - lru-cache: 6.0.0 + semver@7.6.2: {} serialize-javascript@6.0.0: dependencies: @@ -9691,11 +9559,11 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - solc@0.7.3(debug@4.3.4): + solc@0.7.3(debug@4.3.5): dependencies: command-exists: 1.2.9 commander: 3.0.2 - follow-redirects: 1.15.6(debug@4.3.4) + follow-redirects: 1.15.6(debug@4.3.5) fs-extra: 0.30.0 js-sha3: 0.8.0 memorystream: 0.3.1 @@ -9707,7 +9575,7 @@ snapshots: solidity-comments-extractor@0.0.7: {} - solidity-coverage@0.8.12(hardhat@2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5)): + solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -9718,7 +9586,7 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.3(ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.4.0 @@ -9726,7 +9594,7 @@ snapshots: pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.6.0 + semver: 7.6.2 shelljs: 0.8.5 web3-utils: 1.10.4 @@ -9756,16 +9624,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.17 + spdx-license-ids: 3.0.18 - spdx-license-ids@3.0.17: {} + spdx-license-ids@3.0.18: {} split2@3.2.2: dependencies: @@ -9852,25 +9720,25 @@ snapshots: '@tokenizer/token': 0.3.0 peek-readable: 5.0.0 - styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0): + styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: - '@babel/helper-module-imports': 7.24.3 - '@babel/traverse': 7.24.1(supports-color@5.5.0) + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/traverse': 7.24.7(supports-color@5.5.0) '@emotion/is-prop-valid': 1.2.2 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.24.4)(styled-components@5.3.10(@babel/core@7.24.4)(react-dom@18.2.0(react@18.2.0))(react-is@16.13.1)(react@18.2.0)) + babel-plugin-styled-components: 2.1.4(@babel/core@7.24.7)(styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) react-is: 16.13.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: - '@babel/core' - stylis@4.3.1: {} + stylis@4.3.2: {} supports-color@3.2.3: dependencies: @@ -9909,7 +9777,7 @@ snapshots: table@6.8.2: dependencies: - ajv: 8.12.0 + ajv: 8.16.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -9986,16 +9854,16 @@ snapshots: dependencies: typescript: 5.4.5 - ts-node@10.9.1(@types/node@18.15.13)(typescript@5.4.5): + ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5): 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.15.13 - acorn: 8.11.3 - acorn-walk: 8.3.2 + '@types/node': 18.19.36 + acorn: 8.12.0 + acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 @@ -10053,7 +9921,7 @@ snapshots: typechain@8.3.2(typescript@5.4.5): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.5(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -10112,7 +9980,7 @@ snapshots: typical@5.2.0: {} - uglify-js@3.17.4: + uglify-js@3.18.0: optional: true unbox-primitive@1.0.2: @@ -10122,6 +9990,8 @@ snapshots: has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + undici-types@5.26.5: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -10142,11 +10012,11 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): + update-browserslist-db@1.0.16(browserslist@4.23.1): dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 - picocolors: 1.0.0 + picocolors: 1.0.1 uri-js@4.4.1: dependencies: @@ -10174,9 +10044,9 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validator@13.11.0: {} + validator@13.12.0: {} - viem@2.9.25(typescript@5.4.5): + viem@2.15.1(typescript@5.4.5): dependencies: '@adraffy/ens-normalize': 1.10.0 '@noble/curves': 1.2.0 @@ -10184,8 +10054,8 @@ snapshots: '@scure/bip32': 1.3.2 '@scure/bip39': 1.2.1 abitype: 1.0.0(typescript@5.4.5) - isows: 1.0.3(ws@8.13.0) - ws: 8.13.0 + isows: 1.0.4(ws@8.17.1) + ws: 8.17.1 optionalDependencies: typescript: 5.4.5 transitivePeerDependencies: @@ -10193,19 +10063,19 @@ snapshots: - utf-8-validate - zod - vite-plugin-singlefile@2.0.1(rollup@4.16.2)(vite@5.2.10(@types/node@18.15.13)): + vite-plugin-singlefile@2.0.1(rollup@4.18.0)(vite@5.3.1(@types/node@18.19.36)): dependencies: - micromatch: 4.0.5 - rollup: 4.16.2 - vite: 5.2.10(@types/node@18.15.13) + micromatch: 4.0.7 + rollup: 4.18.0 + vite: 5.3.1(@types/node@18.19.36) - vite@5.2.10(@types/node@18.15.13): + vite@5.3.1(@types/node@18.19.36): dependencies: - esbuild: 0.20.2 + esbuild: 0.21.5 postcss: 8.4.38 - rollup: 4.16.2 + rollup: 4.18.0 optionalDependencies: - '@types/node': 18.15.13 + '@types/node': 18.19.36 fsevents: 2.3.3 web-worker@1.3.0: {} @@ -10215,7 +10085,7 @@ snapshots: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 ethereum-bloom-filters: 1.1.0 - ethereum-cryptography: 2.1.3 + ethereum-cryptography: 2.2.0 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 @@ -10287,11 +10157,9 @@ snapshots: ws@7.4.6: {} - ws@7.5.9: {} - - ws@8.13.0: {} + ws@7.5.10: {} - ws@8.5.0: {} + ws@8.17.1: {} y18n@4.0.3: {} @@ -10351,6 +10219,6 @@ snapshots: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 - validator: 13.11.0 + validator: 13.12.0 optionalDependencies: commander: 9.5.0 From 257c093998b771db38f16da138b318d9e28b644a Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jun 2024 15:13:21 +0100 Subject: [PATCH 1260/1302] refactor: clean up test Removed an used variable. --- examples/upgradeable/test/ProxyDemo.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/upgradeable/test/ProxyDemo.js b/examples/upgradeable/test/ProxyDemo.js index d781633085..a8a4008168 100644 --- a/examples/upgradeable/test/ProxyDemo.js +++ b/examples/upgradeable/test/ProxyDemo.js @@ -6,7 +6,7 @@ const UpgradeModule = require("../ignition/modules/UpgradeModule"); describe("Demo Proxy", function () { describe("Proxy interaction", async function () { it("Should be interactable via proxy", async function () { - const [owner, otherAccount] = await ethers.getSigners(); + const [, otherAccount] = await ethers.getSigners(); const { demo } = await ignition.deploy(ProxyModule); @@ -16,7 +16,7 @@ describe("Demo Proxy", function () { describe("Upgrading", function () { it("Should have upgraded the proxy to DemoV2", async function () { - const [owner, otherAccount] = await ethers.getSigners(); + const [, otherAccount] = await ethers.getSigners(); const { demo } = await ignition.deploy(UpgradeModule); @@ -24,7 +24,7 @@ describe("Demo Proxy", function () { }); it("Should have set the name during upgrade", async function () { - const [owner, otherAccount] = await ethers.getSigners(); + const [, otherAccount] = await ethers.getSigners(); const { demo } = await ignition.deploy(UpgradeModule); From ed2eda8216c7848a4deecba35c7b29c202b9aed3 Mon Sep 17 00:00:00 2001 From: John Kane Date: Tue, 18 Jun 2024 15:19:11 +0100 Subject: [PATCH 1261/1302] docs: tweak example commmand text --- examples/upgradeable/README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/examples/upgradeable/README.md b/examples/upgradeable/README.md index 2b19eed878..d37963043d 100644 --- a/examples/upgradeable/README.md +++ b/examples/upgradeable/README.md @@ -1,21 +1,24 @@ -# Hardhat Sample for Hardhat Ignition +# Upgradeable Contract Example for Hardhat Ignition This project is a basic example of how to use Hardhat Ignition with contract systems that use an upgradeable proxy pattern. ## Deploying -To run the Ignition deploy against the ephemeral hardhat network: +To deploy the an example proxy contract against the ephemeral Hardhat network: ```shell npx hardhat ignition deploy ./ignition/modules/ProxyModule.js +``` + +To deploy an example of a proxy contract being upgraded against the ephemeral Hardhat network: -# or to deploy the upgrade module +```shell npx hardhat ignition deploy ./ignition/modules/UpgradeModule.js ``` ## Test -To run the hardhat tests using Ignition: +To run the Hardhat tests using Ignition: ```shell npm run test From c0b5a7d18ca9d3312c1394cab3a51a44b83cb076 Mon Sep 17 00:00:00 2001 From: galargh Date: Tue, 6 Aug 2024 13:02:45 +0200 Subject: [PATCH 1262/1302] chore: debug log hardhat ledger communication errors --- packages/hardhat-plugin/src/index.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 44afb8f829..9884410911 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -5,6 +5,7 @@ import { IgnitionError, StatusResult, } from "@nomicfoundation/ignition-core"; +import debug from "debug"; import { ensureDir, pathExists, @@ -33,6 +34,8 @@ const ignitionScope = scope( "Deploy your smart contracts using Hardhat Ignition" ); +const log = debug("hardhat:ignition"); + extendConfig((config, userConfig) => { /* setup path configs */ const userPathsConfig = userConfig.paths ?? {}; @@ -297,7 +300,9 @@ ignitionScope "confirmation_failure", ledgerConfirmationFailure ); - } catch {} + } catch (error) { + log(error); + } const result = await deploy({ config: hre.config.ignition, @@ -344,7 +349,9 @@ ignitionScope "confirmation_failure", ledgerConfirmationFailure ); - } catch {} + } catch (error) { + log(error); + } if (result.type === "SUCCESSFUL_DEPLOYMENT" && verify) { console.log(""); From 911c7efc5076a5b43dae2c5211d6b6cbd02618bc Mon Sep 17 00:00:00 2001 From: iosh Date: Thu, 22 Aug 2024 20:53:53 +0800 Subject: [PATCH 1263/1302] chore:Fix the typo and replace 'this' with the class in a static method --- .../ignition-module-results-to-viem-contracts.ts | 4 ++-- .../src/viem-ignition-helper.ts | 14 ++++++++------ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts index b849a171e6..e6575b48c4 100644 --- a/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts +++ b/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts @@ -49,9 +49,9 @@ type ContractNameOfContractFuture = export type AbiOf = ContractDeploymentFutureT extends ContractDeploymentFuture< - infer ContractDepploymentAbiT + infer ContractDeploymentAbi > - ? ContractDepploymentAbiT + ? ContractDeploymentAbi : ContractDeploymentFutureT extends ContractAtFuture ? ContractAbiT : never; diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index a2a3558823..52c492aa14 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -176,7 +176,7 @@ export class ViemIgnitionHelper { Object.entries(ignitionModule.results).map( async ([name, contractFuture]) => [ name, - await this._getContract( + await ViemIgnitionHelper._getContract( hre, contractFuture, result.contracts[contractFuture.id] @@ -199,7 +199,7 @@ export class ViemIgnitionHelper { ); } - return this._convertContractFutureToViemContract( + return ViemIgnitionHelper._convertContractFutureToViemContract( hre, future, deployedContract @@ -215,7 +215,7 @@ export class ViemIgnitionHelper { case FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT: case FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT: case FutureType.NAMED_ARTIFACT_CONTRACT_AT: - return this._convertHardhatContractToViemContract( + return ViemIgnitionHelper._convertHardhatContractToViemContract( hre, future, deployedContract @@ -223,7 +223,7 @@ export class ViemIgnitionHelper { case FutureType.CONTRACT_DEPLOYMENT: case FutureType.LIBRARY_DEPLOYMENT: case FutureType.CONTRACT_AT: - return this._convertArtifactToViemContract( + return ViemIgnitionHelper._convertArtifactToViemContract( hre, future, deployedContract @@ -241,7 +241,7 @@ export class ViemIgnitionHelper { ): Promise { return hre.viem.getContractAt( future.contractName, - this._ensureAddressFormat(deployedContract.address) + ViemIgnitionHelper._ensureAddressFormat(deployedContract.address) ); } @@ -265,7 +265,9 @@ export class ViemIgnitionHelper { const viem = await import("viem"); const contract = viem.getContract({ - address: this._ensureAddressFormat(deployedContract.address), + address: ViemIgnitionHelper._ensureAddressFormat( + deployedContract.address + ), abi: future.artifact.abi, client: { public: publicClient, From d6132e24cf887beb153ec1da157ebefa271825fe Mon Sep 17 00:00:00 2001 From: erhant Date: Thu, 5 Sep 2024 13:59:41 +0300 Subject: [PATCH 1264/1302] added json5 parser with tests --- packages/hardhat-plugin/package.json | 3 +- packages/hardhat-plugin/src/index.ts | 10 +- .../ignition/modules/parameters-json5.json5 | 16 + .../hardhat-plugin/test/module-parameters.ts | 13 + pnpm-lock.yaml | 11253 +++++++--------- 5 files changed, 5008 insertions(+), 6287 deletions(-) create mode 100644 packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 79dae17b1d..bbf7fd7898 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -64,6 +64,7 @@ "chalk": "^4.0.0", "debug": "^4.3.2", "fs-extra": "^10.0.0", - "prompts": "^2.4.2" + "prompts": "^2.4.2", + "json5": "^2.2.3" } } diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 9884410911..edc74bb667 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -16,6 +16,7 @@ import { } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { parse as json5Parse } from "json5"; import path from "path"; import "./type-extensions"; @@ -244,7 +245,10 @@ ignitionScope userModule.id, hre.config.paths.ignition ); - } else if (parametersInput.endsWith(".json")) { + } else if ( + parametersInput.endsWith(".json") || + parametersInput.endsWith(".json5") + ) { parameters = await resolveParametersFromFileName(parametersInput); } else { parameters = resolveParametersString(parametersInput); @@ -679,7 +683,7 @@ async function resolveConfigPath( try { const rawFile = await readFile(filepath); - return JSON.parse(rawFile.toString(), bigintReviver); + return await json5Parse(rawFile.toString(), bigintReviver); } catch (e) { if (e instanceof NomicLabsHardhatPluginError) { throw e; @@ -699,7 +703,7 @@ async function resolveConfigPath( function resolveParametersString(paramString: string): DeploymentParameters { try { - return JSON.parse(paramString, bigintReviver); + return json5Parse(paramString, bigintReviver); } catch (e) { if (e instanceof NomicLabsHardhatPluginError) { throw e; diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 new file mode 100644 index 0000000000..6a57f6c034 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 @@ -0,0 +1,16 @@ +/** + * comments allowed in json5 + */ + +{ + // no quotes around keys + LockModule: { + // weird multi-line but should pass + unlockTime: "1\ +893\ +499\ +200\ +000n", + lockedAmount: "2000000000000n", + }, +} diff --git a/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-plugin/test/module-parameters.ts index e8ad354ddd..076573f94d 100644 --- a/packages/hardhat-plugin/test/module-parameters.ts +++ b/packages/hardhat-plugin/test/module-parameters.ts @@ -21,6 +21,19 @@ describe("module parameters", () => { ); }); + it("should run if provided with a valid module parameters file in JSON5 format", async function () { + await this.hre.run( + { + scope: "ignition", + task: "deploy", + }, + { + modulePath: "./ignition/modules/Lock.ts", + parameters: "./ignition/modules/parameters-json5.json5", + } + ); + }); + it("should run if provided with a valid module parameters file encoding a bigint as a string", async function () { await this.hre.run( { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 433d1fb147..ec8f82492c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '9.0' +lockfileVersion: '6.0' settings: autoInstallPeers: true @@ -13,13 +13,13 @@ importers: version: 1.0.2(nyc@15.1.0) '@microsoft/api-extractor': specifier: 7.40.1 - version: 7.40.1(@types/node@18.19.36) + version: 7.40.1(@types/node@18.19.45) '@nomiclabs/eslint-plugin-hardhat-internal-rules': specifier: ^1.0.2 version: 1.0.2 '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 @@ -43,19 +43,19 @@ importers: version: 2.0.1 '@types/node': specifier: ^18.0.0 - version: 18.19.36 + version: 18.19.45 '@types/prompts': specifier: ^2.4.2 version: 2.4.9 '@typescript-eslint/eslint-plugin': specifier: ^5.57.1 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5) + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.0)(typescript@5.4.5) + version: 5.62.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/parser': specifier: ^5.57.1 - version: 5.62.0(eslint@8.57.0)(typescript@5.4.5) + version: 5.62.0(eslint@8.57.0)(typescript@5.5.4) chai: specifier: ^4.3.4 version: 4.4.1 @@ -73,10 +73,10 @@ importers: version: 8.3.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.5.5 - version: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0) + version: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.0 - version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) eslint-plugin-mocha: specifier: ^9.0.0 version: 9.0.0(eslint@8.57.0) @@ -85,10 +85,10 @@ importers: version: 3.1.0 eslint-plugin-prettier: specifier: 4.0.0 - version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) + version: 4.0.0(eslint-config-prettier@8.3.0)(eslint@8.57.0)(prettier@2.8.8) hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) mocha: specifier: ^9.1.3 version: 9.2.2 @@ -109,10 +109,10 @@ importers: version: 14.0.2 ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) + version: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) typescript: specifier: ^5.0.2 - version: 5.4.5 + version: 5.5.4 examples/complete: devDependencies: @@ -121,10 +121,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -136,10 +136,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -151,10 +151,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -170,10 +170,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -185,16 +185,16 @@ importers: version: link:../../packages/hardhat-plugin-viem '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.10 - version: 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + version: 1.0.10(hardhat@2.22.9) '@nomicfoundation/hardhat-viem': specifier: 2.0.0 - version: 2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5)) + version: 2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0) chai: specifier: 4.4.1 version: 4.4.1 hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -212,10 +212,10 @@ importers: version: 9.0.2 debug: specifier: ^4.3.2 - version: 4.3.5(supports-color@5.5.0) + version: 4.3.6(supports-color@5.5.0) ethers: specifier: ^6.7.0 - version: 6.13.1 + version: 6.13.2 fs-extra: specifier: ^10.0.0 version: 10.1.0 @@ -231,19 +231,19 @@ importers: devDependencies: '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) packages/hardhat-plugin: dependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.1 - version: 2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + version: 2.0.9(hardhat@2.22.9) '@nomicfoundation/ignition-core': specifier: workspace:^ version: link:../core @@ -255,20 +255,23 @@ importers: version: 4.1.2 debug: specifier: ^4.3.2 - version: 4.3.5(supports-color@5.5.0) + version: 4.3.6(supports-color@5.5.0) fs-extra: specifier: ^10.0.0 version: 10.1.0 + json5: + specifier: ^2.2.3 + version: 2.2.3 prompts: specifier: ^2.4.2 version: 2.4.2 devDependencies: '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.9 - version: 1.0.9(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + version: 1.0.9(hardhat@2.22.9) '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -277,10 +280,10 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) viem: specifier: ^2.7.6 - version: 2.15.1(typescript@5.4.5) + version: 2.20.0(typescript@5.5.4) packages/hardhat-plugin-ethers: dependencies: @@ -292,14 +295,14 @@ importers: version: link:../core ethers: specifier: ^6.7.0 - version: 6.13.1 + version: 6.13.2 devDependencies: '@nomicfoundation/hardhat-ethers': specifier: ^3.0.4 - version: 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) + version: 3.0.7(ethers@6.13.2)(hardhat@2.22.9) '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -308,7 +311,7 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) packages/hardhat-plugin-viem: dependencies: @@ -320,14 +323,14 @@ importers: version: link:../core viem: specifier: ^2.7.6 - version: 2.15.1(typescript@5.4.5) + version: 2.20.0(typescript@5.0.4) devDependencies: '@nomicfoundation/hardhat-viem': specifier: ^2.0.0 - version: 2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5)) + version: 2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0) '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -336,25 +339,25 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + version: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) packages/ui: devDependencies: '@fontsource/roboto': specifier: ^5.0.8 - version: 5.0.13 + version: 5.0.14 '@nomicfoundation/ignition-core': specifier: workspace:^ version: link:../core '@types/chai': specifier: ^4.2.22 - version: 4.3.16 + version: 4.3.17 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 '@types/react': specifier: ^18.0.28 - version: 18.3.3 + version: 18.3.4 '@types/react-dom': specifier: ^18.0.11 version: 18.3.0 @@ -363,7 +366,7 @@ importers: version: 5.1.26 '@vitejs/plugin-react': specifier: ^4.0.0 - version: 4.3.1(vite@5.3.1(@types/node@18.19.36)) + version: 4.3.1(vite@5.4.2) eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.2(eslint@8.57.0) @@ -381,588 +384,1119 @@ importers: version: 18.3.1(react@18.3.1) react-router-dom: specifier: 6.11.0 - version: 6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 6.11.0(react-dom@18.3.1)(react@18.3.1) react-tooltip: specifier: ^5.21.4 - version: 5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 5.28.0(react-dom@18.3.1)(react@18.3.1) styled-components: specifier: 5.3.10 - version: 5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + version: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) vite: specifier: ^5.0.0 - version: 5.3.1(@types/node@18.19.36) + version: 5.4.2(@types/node@18.19.45) vite-plugin-singlefile: specifier: ^2.0.1 - version: 2.0.1(rollup@4.18.0)(vite@5.3.1(@types/node@18.19.36)) + version: 2.0.2(rollup@4.21.0)(vite@5.4.2) packages: - '@adraffy/ens-normalize@1.10.0': + /@adraffy/ens-normalize@1.10.0: resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - '@adraffy/ens-normalize@1.10.1': + /@adraffy/ens-normalize@1.10.1: resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - '@ampproject/remapping@2.3.0': + /@ampproject/remapping@2.3.0: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true - '@babel/code-frame@7.24.7': + /@babel/code-frame@7.24.7: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.0.1 + dev: true - '@babel/compat-data@7.24.7': - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} + dev: true - '@babel/core@7.24.7': - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@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.4 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.4(supports-color@5.5.0) + '@babel/types': 7.25.4 + convert-source-map: 2.0.0 + debug: 4.3.6(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true - '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} + /@babel/generator@7.25.5: + resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.4 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true - '@babel/helper-annotate-as-pure@7.24.7': + /@babel/helper-annotate-as-pure@7.24.7: resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.4 + dev: true - '@babel/helper-compilation-targets@7.24.7': - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} + /@babel/helper-compilation-targets@7.25.2: + resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true - '@babel/helper-module-imports@7.24.7': + /@babel/helper-module-imports@7.24.7(supports-color@5.5.0): resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.4(supports-color@5.5.0) + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + dev: true - '@babel/helper-module-transforms@7.24.7': - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.4(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + dev: true - '@babel/helper-plugin-utils@7.24.7': - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} + /@babel/helper-plugin-utils@7.24.8: + resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} + dev: true - '@babel/helper-simple-access@7.24.7': + /@babel/helper-simple-access@7.24.7: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.4(supports-color@5.5.0) + '@babel/types': 7.25.4 + transitivePeerDependencies: + - supports-color + dev: true - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} + /@babel/helper-string-parser@7.24.8: + resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} + dev: true - '@babel/helper-validator-identifier@7.24.7': + /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} + dev: true - '@babel/helper-validator-option@7.24.7': - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} + /@babel/helper-validator-option@7.24.8: + resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} + dev: true - '@babel/helpers@7.24.7': - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} + /@babel/helpers@7.25.0: + resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + dev: true - '@babel/highlight@7.24.7': + /@babel/highlight@7.24.7: resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + dev: true - '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} + /@babel/parser@7.25.4: + resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.25.4 + dev: true - '@babel/plugin-syntax-jsx@7.24.7': + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true - '@babel/plugin-transform-react-jsx-self@7.24.7': + /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true - '@babel/plugin-transform-react-jsx-source@7.24.7': + /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true - '@babel/template@7.24.7': - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} + /@babel/template@7.25.0: + resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + dev: true - '@babel/traverse@7.24.7': - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} + /@babel/traverse@7.25.4(supports-color@5.5.0): + resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.5 + '@babel/parser': 7.25.4 + '@babel/template': 7.25.0 + '@babel/types': 7.25.4 + debug: 4.3.6(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true - '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} + /@babel/types@7.25.4: + resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: true - '@braintree/sanitize-url@6.0.4': + /@braintree/sanitize-url@6.0.4: resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + dev: true - '@cspotcode/source-map-support@0.8.1': + /@cspotcode/source-map-support@0.8.1: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 - '@emotion/is-prop-valid@1.2.2': - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + /@emotion/is-prop-valid@1.3.0: + resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} + dependencies: + '@emotion/memoize': 0.9.0 + dev: true - '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + /@emotion/memoize@0.9.0: + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + dev: true - '@emotion/stylis@0.8.5': + /@emotion/stylis@0.8.5: resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + dev: true - '@emotion/unitless@0.7.5': + /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + dev: true - '@esbuild/aix-ppc64@0.21.5': + /@esbuild/aix-ppc64@0.21.5: resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] + requiresBuild: true + dev: true + optional: true - '@esbuild/android-arm64@0.21.5': + /@esbuild/android-arm64@0.21.5: resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] + requiresBuild: true + dev: true + optional: true - '@esbuild/android-arm@0.15.18': + /@esbuild/android-arm@0.15.18: resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} cpu: [arm] os: [android] + requiresBuild: true + dev: true + optional: true - '@esbuild/android-arm@0.21.5': + /@esbuild/android-arm@0.21.5: resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] + requiresBuild: true + dev: true + optional: true - '@esbuild/android-x64@0.21.5': + /@esbuild/android-x64@0.21.5: resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] + requiresBuild: true + dev: true + optional: true - '@esbuild/darwin-arm64@0.21.5': + /@esbuild/darwin-arm64@0.21.5: resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + requiresBuild: true + dev: true + optional: true - '@esbuild/darwin-x64@0.21.5': + /@esbuild/darwin-x64@0.21.5: resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + requiresBuild: true + dev: true + optional: true - '@esbuild/freebsd-arm64@0.21.5': + /@esbuild/freebsd-arm64@0.21.5: resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + requiresBuild: true + dev: true + optional: true - '@esbuild/freebsd-x64@0.21.5': + /@esbuild/freebsd-x64@0.21.5: resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-arm64@0.21.5': + /@esbuild/linux-arm64@0.21.5: resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-arm@0.21.5': + /@esbuild/linux-arm@0.21.5: resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-ia32@0.21.5': + /@esbuild/linux-ia32@0.21.5: resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-loong64@0.15.18': + /@esbuild/linux-loong64@0.15.18: resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-loong64@0.21.5': + /@esbuild/linux-loong64@0.21.5: resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-mips64el@0.21.5': + /@esbuild/linux-mips64el@0.21.5: resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-ppc64@0.21.5': + /@esbuild/linux-ppc64@0.21.5: resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-riscv64@0.21.5': + /@esbuild/linux-riscv64@0.21.5: resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-s390x@0.21.5': + /@esbuild/linux-s390x@0.21.5: resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/linux-x64@0.21.5': + /@esbuild/linux-x64@0.21.5: resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@esbuild/netbsd-x64@0.21.5': + /@esbuild/netbsd-x64@0.21.5: resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + requiresBuild: true + dev: true + optional: true - '@esbuild/openbsd-x64@0.21.5': + /@esbuild/openbsd-x64@0.21.5: resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + requiresBuild: true + dev: true + optional: true - '@esbuild/sunos-x64@0.21.5': + /@esbuild/sunos-x64@0.21.5: resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + requiresBuild: true + dev: true + optional: true - '@esbuild/win32-arm64@0.21.5': + /@esbuild/win32-arm64@0.21.5: resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + requiresBuild: true + dev: true + optional: true - '@esbuild/win32-ia32@0.21.5': + /@esbuild/win32-ia32@0.21.5: resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + requiresBuild: true + dev: true + optional: true - '@esbuild/win32-x64@0.21.5': + /@esbuild/win32-x64@0.21.5: resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + requiresBuild: true + dev: true + optional: true - '@eslint-community/eslint-utils@4.4.0': + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true - '@eslint-community/regexpp@4.10.1': - resolution: {integrity: sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==} + /@eslint-community/regexpp@4.11.0: + resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.4: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.6(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true - '@eslint/js@8.57.0': + /@eslint/js@8.57.0: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@ethereumjs/rlp@4.0.1': + /@ethereumjs/rlp@4.0.1: resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} engines: {node: '>=14'} hasBin: true + dev: true - '@ethereumjs/util@8.1.0': + /@ethereumjs/util@8.1.0: resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + dev: true - '@ethersproject/abi@5.7.0': + /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - '@ethersproject/abstract-provider@5.7.0': + /@ethersproject/abstract-provider@5.7.0: resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 - '@ethersproject/abstract-signer@5.7.0': + /@ethersproject/abstract-signer@5.7.0: resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 - '@ethersproject/address@5.6.1': + /@ethersproject/address@5.6.1: resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 - '@ethersproject/address@5.7.0': + /@ethersproject/address@5.7.0: resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 - '@ethersproject/base64@5.7.0': + /@ethersproject/base64@5.7.0: resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 - '@ethersproject/basex@5.7.0': + /@ethersproject/basex@5.7.0: resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: true - '@ethersproject/bignumber@5.7.0': + /@ethersproject/bignumber@5.7.0: resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 - '@ethersproject/bytes@5.7.0': + /@ethersproject/bytes@5.7.0: resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 - '@ethersproject/constants@5.7.0': + /@ethersproject/constants@5.7.0: resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 - '@ethersproject/contracts@5.7.0': + /@ethersproject/contracts@5.7.0: resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: true - '@ethersproject/hash@5.7.0': + /@ethersproject/hash@5.7.0: resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - '@ethersproject/hdnode@5.7.0': + /@ethersproject/hdnode@5.7.0: resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/json-wallets@5.7.0': + /@ethersproject/json-wallets@5.7.0: resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: true - '@ethersproject/keccak256@5.7.0': + /@ethersproject/keccak256@5.7.0: resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 - '@ethersproject/logger@5.7.0': + /@ethersproject/logger@5.7.0: resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - '@ethersproject/networks@5.7.1': + /@ethersproject/networks@5.7.1: resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} + dependencies: + '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2@5.7.0': + /@ethersproject/pbkdf2@5.7.0: resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: true - '@ethersproject/properties@5.7.0': + /@ethersproject/properties@5.7.0: resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 - '@ethersproject/providers@5.7.2': + /@ethersproject/providers@5.7.2: resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: true - '@ethersproject/random@5.7.0': + /@ethersproject/random@5.7.0: resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/rlp@5.7.0': + /@ethersproject/rlp@5.7.0: resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2@5.7.0': + /@ethersproject/sha2@5.7.0: resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: true - '@ethersproject/signing-key@5.7.0': + /@ethersproject/signing-key@5.7.0: resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 - '@ethersproject/solidity@5.7.0': + /@ethersproject/solidity@5.7.0: resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - - '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true + + /@ethersproject/strings@5.7.0: resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 - '@ethersproject/transactions@5.7.0': + /@ethersproject/transactions@5.7.0: resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 - '@ethersproject/units@5.7.0': + /@ethersproject/units@5.7.0: resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: true - '@ethersproject/wallet@5.7.0': + /@ethersproject/wallet@5.7.0: resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: true - '@ethersproject/web@5.7.1': + /@ethersproject/web@5.7.1: resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 - '@ethersproject/wordlists@5.7.0': + /@ethersproject/wordlists@5.7.0: resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: true - '@fastify/busboy@2.1.1': + /@fastify/busboy@2.1.1: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@floating-ui/core@1.6.2': - resolution: {integrity: sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==} + /@floating-ui/core@1.6.7: + resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} + dependencies: + '@floating-ui/utils': 0.2.7 + dev: true - '@floating-ui/dom@1.6.5': - resolution: {integrity: sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==} + /@floating-ui/dom@1.6.10: + resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + dev: true - '@floating-ui/utils@0.2.2': - resolution: {integrity: sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==} + /@floating-ui/utils@0.2.7: + resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} + dev: true - '@fontsource/roboto@5.0.13': - resolution: {integrity: sha512-j61DHjsdUCKMXSdNLTOxcG701FWnF0jcqNNQi2iPCDxU8seN/sMxeh62dC++UiagCWq9ghTypX+Pcy7kX+QOeQ==} + /@fontsource/roboto@5.0.14: + resolution: {integrity: sha512-zHAxlTTm9RuRn9/StwclFJChf3z9+fBrOxC3fw71htjHP1BgXNISwRjdJtAKAmMe5S2BzgpnjkQR93P9EZYI/Q==} + dev: true - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.14: resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.6(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true - '@humanwhocodes/module-importer@1.0.1': + /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + dev: true - '@humanwhocodes/object-schema@2.0.3': + /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + dev: true - '@istanbuljs/load-nyc-config@1.1.0': + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true - '@istanbuljs/nyc-config-typescript@1.0.2': + /@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0): resolution: {integrity: sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==} engines: {node: '>=8'} peerDependencies: nyc: '>=15' + dependencies: + '@istanbuljs/schema': 0.1.3 + nyc: 15.1.0 + dev: true - '@istanbuljs/schema@0.1.3': + /@istanbuljs/schema@0.1.3: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} + dev: true - '@jridgewell/gen-mapping@0.3.5': + /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + dev: true - '@jridgewell/resolve-uri@3.1.2': + /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': + /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} + dev: true - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + /@jridgewell/sourcemap-codec@1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - '@jridgewell/trace-mapping@0.3.25': + /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true - '@jridgewell/trace-mapping@0.3.9': + /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 - '@metamask/eth-sig-util@4.0.1': + /@metamask/eth-sig-util@4.0.1: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 - '@microsoft/api-extractor-model@7.28.9': + /@microsoft/api-extractor-model@7.28.9(@types/node@18.19.45): resolution: {integrity: sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.45) + transitivePeerDependencies: + - '@types/node' + dev: true - '@microsoft/api-extractor@7.40.1': + /@microsoft/api-extractor@7.40.1(@types/node@18.19.45): resolution: {integrity: sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==} hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.45) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.45) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + dev: true - '@microsoft/tsdoc-config@0.16.2': + /@microsoft/tsdoc-config@0.16.2: resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: true - '@microsoft/tsdoc@0.14.2': + /@microsoft/tsdoc@0.14.2: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true - '@noble/curves@1.2.0': + /@noble/curves@1.2.0: resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} + dependencies: + '@noble/hashes': 1.3.2 - '@noble/curves@1.4.0': + /@noble/curves@1.4.0: resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} + dependencies: + '@noble/hashes': 1.4.0 + + /@noble/curves@1.4.2: + resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} + dependencies: + '@noble/hashes': 1.4.0 + dev: true - '@noble/hashes@1.2.0': + /@noble/hashes@1.2.0: resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - '@noble/hashes@1.3.2': + /@noble/hashes@1.3.2: resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - '@noble/hashes@1.4.0': + /@noble/hashes@1.4.0: resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} - '@noble/secp256k1@1.7.1': + /@noble/secp256k1@1.7.1: resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true - '@nodelib/fs.stat@2.0.5': + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} + dev: true - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + dev: true - '@nomicfoundation/edr-darwin-arm64@0.4.0': - resolution: {integrity: sha512-7+rraFk9tCqvfemv9Ita5vTlSBAeO/S5aDKOgGRgYt0JEKZlrX161nDW6UfzMPxWl9GOLEDUzCEaYuNmXseUlg==} + /@nomicfoundation/edr-darwin-arm64@0.5.2: + resolution: {integrity: sha512-Gm4wOPKhbDjGTIRyFA2QUAPfCXA1AHxYOKt3yLSGJkQkdy9a5WW+qtqKeEKHc/+4wpJSLtsGQfpzyIzggFfo/A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-darwin-x64@0.4.0': - resolution: {integrity: sha512-+Hrc0mP9L6vhICJSfyGo/2taOToy1AIzVZawO3lU8Lf7oDQXfhQ4UkZnkWAs9SVu1eUwHUGGGE0qB8644piYgg==} + /@nomicfoundation/edr-darwin-x64@0.5.2: + resolution: {integrity: sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': - resolution: {integrity: sha512-4HUDMchNClQrVRfVTqBeSX92hM/3khCgpZkXP52qrnJPqgbdCxosOehlQYZ65wu0b/kaaZSyvACgvCLSQ5oSzQ==} + /@nomicfoundation/edr-linux-arm64-gnu@0.5.2: + resolution: {integrity: sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-arm64-musl@0.4.0': - resolution: {integrity: sha512-D4J935ZRL8xfnP3zIFlCI9jXInJ0loDUkCTLeCEbOf2uuDumWDghKNQlF1itUS+EHaR1pFVBbuwqq8hVK0dASg==} + /@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.4.0': - resolution: {integrity: sha512-6x7HPy+uN5Cb9N77e2XMmT6+QSJ+7mRbHnhkGJ8jm4cZvWuj2Io7npOaeHQ3YHK+TiQpTnlbkjoOIpEwpY3XZA==} + /@nomicfoundation/edr-linux-x64-gnu@0.5.2: + resolution: {integrity: sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A==} engines: {node: '>= 18'} - '@nomicfoundation/edr-linux-x64-musl@0.4.0': - resolution: {integrity: sha512-3HFIJSXgyubOiaN4MWGXx2xhTnhwlJk0PiSYNf9+L/fjBtcRkb2nM910ZJHTvqCb6OT98cUnaKuAYdXIW2amgw==} + /@nomicfoundation/edr-linux-x64-musl@0.5.2: + resolution: {integrity: sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA==} engines: {node: '>= 18'} - '@nomicfoundation/edr-win32-x64-msvc@0.4.0': - resolution: {integrity: sha512-CP4GsllEfXEz+lidcGYxKe5rDJ60TM5/blB5z/04ELVvw6/CK9eLcYeku7HV0jvV7VE6dADYKSdQyUkvd0El+A==} + /@nomicfoundation/edr-win32-x64-msvc@0.5.2: + resolution: {integrity: sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w==} engines: {node: '>= 18'} - '@nomicfoundation/edr@0.4.0': - resolution: {integrity: sha512-T96DMSogO8TCdbKKctvxfsDljbhFOUKWc9fHJhSeUh71EEho2qR4951LKQF7t7UWEzguVYh/idQr5L/E3QeaMw==} + /@nomicfoundation/edr@0.5.2: + resolution: {integrity: sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw==} engines: {node: '>= 18'} + dependencies: + '@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-common@4.0.4': + /@nomicfoundation/ethereumjs-common@4.0.4: resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg - '@nomicfoundation/ethereumjs-rlp@5.0.4': + /@nomicfoundation/ethereumjs-rlp@5.0.4: resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} engines: {node: '>=18'} hasBin: true - '@nomicfoundation/ethereumjs-tx@5.0.4': + /@nomicfoundation/ethereumjs-tx@5.0.4: resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} engines: {node: '>=18'} peerDependencies: @@ -970,8 +1504,13 @@ packages: peerDependenciesMeta: c-kzg: optional: true + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 - '@nomicfoundation/ethereumjs-util@9.0.4': + /@nomicfoundation/ethereumjs-util@9.0.4: resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} engines: {node: '>=18'} peerDependencies: @@ -979,32 +1518,61 @@ packages: peerDependenciesMeta: c-kzg: optional: true + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-chai-matchers@2.0.7': + /@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.7)(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.9): resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.0 chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.7(ethers@6.13.2)(hardhat@2.22.9) + '@types/chai-as-promised': 7.1.8 + chai: 4.4.1 + chai-as-promised: 7.1.1(chai@4.4.1) + deep-eql: 4.1.4 + ethers: 6.13.2 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + ordinal: 1.0.3 + dev: true - '@nomicfoundation/hardhat-ethers@3.0.6': - resolution: {integrity: sha512-/xzkFQAaHQhmIAYOQmvHBPwL+NkwLzT9gRZBsgWUYeV+E6pzXsBQsHfRYbAZ3XEYare+T7S+5Tg/1KDJgepSkA==} + /@nomicfoundation/hardhat-ethers@3.0.7(ethers@6.13.2)(hardhat@2.22.9): + resolution: {integrity: sha512-pxLWpDiqC208shoz/lMbVFbxcVxE+qIs8qDrwdcubWH99UO1p6uwXakMa36ICRfB/IEToSLDJGSsKhwY84feCQ==} peerDependencies: ethers: ^6.1.0 - hardhat: ^2.0.0 + hardhat: ^2.22.92.0.0 + dependencies: + debug: 4.3.6(supports-color@5.5.0) + ethers: 6.13.2 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + dev: true - '@nomicfoundation/hardhat-network-helpers@1.0.10': + /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.9): resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} peerDependencies: hardhat: ^2.9.5 + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + dev: true - '@nomicfoundation/hardhat-network-helpers@1.0.9': + /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.9): resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} peerDependencies: hardhat: ^2.9.5 + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + dev: true - '@nomicfoundation/hardhat-toolbox@4.0.0': + /@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4): resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} peerDependencies: '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 @@ -1024,412 +1592,738 @@ packages: ts-node: '>=8.0.0' typechain: ^8.3.0 typescript: '>=4.5.0' - - '@nomicfoundation/hardhat-verify@2.0.8': - resolution: {integrity: sha512-x/OYya7A2Kcz+3W/J78dyDHxr0ezU23DKTrRKfy5wDPCnePqnr79vm8EXqX3gYps6IjPBYyGPZ9K6E5BnrWx5Q==} + dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.7)(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.9) + '@nomicfoundation/hardhat-ethers': 3.0.7(ethers@6.13.2)(hardhat@2.22.9) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.9) + '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.9) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.9)(typechain@8.3.2) + '@types/chai': 4.3.17 + '@types/mocha': 9.1.1 + '@types/node': 18.19.45 + chai: 4.4.1 + ethers: 6.13.2 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.9) + solidity-coverage: 0.8.12(hardhat@2.22.9) + ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + dev: true + + /@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.9): + resolution: {integrity: sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ==} peerDependencies: - hardhat: ^2.0.4 + hardhat: ^2.22.72.0.4 + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.6.1 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.6(supports-color@5.5.0) + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color - '@nomicfoundation/hardhat-viem@2.0.0': + /@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0): resolution: {integrity: sha512-ilXQKTc1jWHqJ66fAN6TIyCRyormoChOn1yQTCGoBQ+G6QcVCu5FTaGL2r0KUOY4IkTohtphK+UXQrKcxQX5Yw==} peerDependencies: hardhat: ^2.17.0 typescript: ~5.0.0 viem: ^2.7.6 + dependencies: + abitype: 0.9.10(typescript@5.0.4) + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) + lodash.memoize: 4.1.2 + typescript: 5.0.4 + viem: 2.20.0(typescript@5.0.4) + transitivePeerDependencies: + - zod + dev: true - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2: resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2: resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2: resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2: resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2: resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2: resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2: resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} engines: {node: '>= 12'} + requiresBuild: true + optional: true - '@nomicfoundation/solidity-analyzer@0.1.2': + /@nomicfoundation/solidity-analyzer@0.1.2: resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': + /@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2: resolution: {integrity: sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==} + dev: true - '@openzeppelin/contracts@5.0.2': + /@openzeppelin/contracts@5.0.2: resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} + dev: false - '@remix-run/router@1.6.0': + /@remix-run/router@1.6.0: resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} engines: {node: '>=14'} + dev: true - '@rollup/rollup-android-arm-eabi@4.18.0': - resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + /@rollup/rollup-android-arm-eabi@4.21.0: + resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} cpu: [arm] os: [android] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-android-arm64@4.18.0': - resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + /@rollup/rollup-android-arm64@4.21.0: + resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} cpu: [arm64] os: [android] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-darwin-arm64@4.18.0': - resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + /@rollup/rollup-darwin-arm64@4.21.0: + resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} cpu: [arm64] os: [darwin] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-darwin-x64@4.18.0': - resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + /@rollup/rollup-darwin-x64@4.21.0: + resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} cpu: [x64] os: [darwin] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + /@rollup/rollup-linux-arm-gnueabihf@4.21.0: + resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} cpu: [arm] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + /@rollup/rollup-linux-arm-musleabihf@4.21.0: + resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} cpu: [arm] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-arm64-gnu@4.18.0': - resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + /@rollup/rollup-linux-arm64-gnu@4.21.0: + resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} cpu: [arm64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-arm64-musl@4.18.0': - resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + /@rollup/rollup-linux-arm64-musl@4.21.0: + resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} cpu: [arm64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + /@rollup/rollup-linux-powerpc64le-gnu@4.21.0: + resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} cpu: [ppc64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + /@rollup/rollup-linux-riscv64-gnu@4.21.0: + resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} cpu: [riscv64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-s390x-gnu@4.18.0': - resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + /@rollup/rollup-linux-s390x-gnu@4.21.0: + resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} cpu: [s390x] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-x64-gnu@4.18.0': - resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + /@rollup/rollup-linux-x64-gnu@4.21.0: + resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} cpu: [x64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-linux-x64-musl@4.18.0': - resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + /@rollup/rollup-linux-x64-musl@4.21.0: + resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} cpu: [x64] os: [linux] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-win32-arm64-msvc@4.18.0': - resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + /@rollup/rollup-win32-arm64-msvc@4.21.0: + resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} cpu: [arm64] os: [win32] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-win32-ia32-msvc@4.18.0': - resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + /@rollup/rollup-win32-ia32-msvc@4.21.0: + resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} cpu: [ia32] os: [win32] + requiresBuild: true + dev: true + optional: true - '@rollup/rollup-win32-x64-msvc@4.18.0': - resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + /@rollup/rollup-win32-x64-msvc@4.21.0: + resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} cpu: [x64] os: [win32] + requiresBuild: true + dev: true + optional: true - '@rushstack/node-core-library@3.66.0': + /@rushstack/node-core-library@3.66.0(@types/node@18.19.45): resolution: {integrity: sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true + dependencies: + '@types/node': 18.19.45 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + dev: true - '@rushstack/rig-package@0.5.1': + /@rushstack/rig-package@0.5.1: resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + dev: true - '@rushstack/ts-command-line@4.17.1': + /@rushstack/ts-command-line@4.17.1: resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true - '@scure/base@1.1.7': + /@scure/base@1.1.7: resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} - '@scure/bip32@1.1.5': + /@scure/bip32@1.1.5: resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.7 - '@scure/bip32@1.3.2': - resolution: {integrity: sha512-N1ZhksgwD3OBlwTv3R6KFEcPojl/W4ElJOeCZdi+vuI5QmTFwLq3OFf2zd2ROpKvxFdgZ6hUpb0dx9bVNEwYCA==} - - '@scure/bip32@1.4.0': + /@scure/bip32@1.4.0: resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 - '@scure/bip39@1.1.1': + /@scure/bip39@1.1.1: resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.7 - '@scure/bip39@1.2.1': - resolution: {integrity: sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==} - - '@scure/bip39@1.3.0': + /@scure/bip39@1.3.0: resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.7 - '@sentry/core@5.30.0': + /@sentry/core@5.30.0: resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 - '@sentry/hub@5.30.0': + /@sentry/hub@5.30.0: resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 - '@sentry/minimal@5.30.0': + /@sentry/minimal@5.30.0: resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} engines: {node: '>=6'} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 - '@sentry/node@5.30.0': + /@sentry/node@5.30.0: resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} engines: {node: '>=6'} + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color - '@sentry/tracing@5.30.0': + /@sentry/tracing@5.30.0: resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} engines: {node: '>=6'} - - '@sentry/types@5.30.0': - resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + /@sentry/types@5.30.0: + resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} - '@sentry/utils@5.30.0': + /@sentry/utils@5.30.0: resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 - '@sinonjs/commons@1.8.6': + /@sinonjs/commons@1.8.6: resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true - '@sinonjs/commons@2.0.0': + /@sinonjs/commons@2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + dev: true - '@sinonjs/commons@3.0.1': + /@sinonjs/commons@3.0.1: resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true - '@sinonjs/fake-timers@11.2.2': - resolution: {integrity: sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==} + /@sinonjs/fake-timers@11.3.1: + resolution: {integrity: sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true - '@sinonjs/fake-timers@9.1.2': + /@sinonjs/fake-timers@9.1.2: resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true - '@sinonjs/samsam@7.0.1': + /@sinonjs/samsam@7.0.1: resolution: {integrity: sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==} + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.1.0 + dev: true - '@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==} + dev: true - '@solidity-parser/parser@0.14.5': + /@solidity-parser/parser@0.14.5: resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: true - '@solidity-parser/parser@0.16.2': + /@solidity-parser/parser@0.16.2: resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} + dependencies: + antlr4ts: 0.5.0-alpha.4 + dev: true - '@solidity-parser/parser@0.18.0': + /@solidity-parser/parser@0.18.0: resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} + dev: true - '@tokenizer/token@0.3.0': + /@tokenizer/token@0.3.0: resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + dev: true - '@tsconfig/node10@1.0.11': + /@tsconfig/node10@1.0.11: resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - '@tsconfig/node12@1.0.11': + /@tsconfig/node12@1.0.11: resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - '@tsconfig/node14@1.0.3': + /@tsconfig/node14@1.0.3: resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - '@tsconfig/node16@1.0.4': + /@tsconfig/node16@1.0.4: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@typechain/ethers-v6@0.5.1': + /@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4): resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: ethers: 6.x typechain: ^8.3.2 typescript: '>=4.7.0' + dependencies: + ethers: 6.13.2 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + dev: true - '@typechain/hardhat@9.1.0': + /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.9)(typechain@8.3.2): resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} peerDependencies: '@typechain/ethers-v6': ^0.5.1 ethers: ^6.1.0 hardhat: ^2.9.9 typechain: ^8.3.2 + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) + ethers: 6.13.2 + fs-extra: 9.1.0 + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + dev: true - '@types/argparse@1.0.38': + /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: true - '@types/babel__core@7.20.5': + /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true - '@types/babel__generator@7.6.8': + /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.25.4 + dev: true - '@types/babel__template@7.4.4': + /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.25.4 + '@babel/types': 7.25.4 + dev: true - '@types/babel__traverse@7.20.6': + /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.25.4 + dev: true - '@types/bn.js@4.11.6': + /@types/bn.js@4.11.6: resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} + dependencies: + '@types/node': 18.19.45 - '@types/bn.js@5.1.5': + /@types/bn.js@5.1.5: resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} + dependencies: + '@types/node': 18.19.45 - '@types/chai-as-promised@7.1.8': + /@types/chai-as-promised@7.1.8: resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} + dependencies: + '@types/chai': 4.3.17 + dev: true - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + /@types/chai@4.3.17: + resolution: {integrity: sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==} + dev: true - '@types/concat-stream@1.6.1': + /@types/concat-stream@1.6.1: resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + dependencies: + '@types/node': 18.19.45 + dev: true - '@types/d3-scale-chromatic@3.0.3': + /@types/d3-scale-chromatic@3.0.3: resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} + dev: true - '@types/d3-scale@4.0.8': + /@types/d3-scale@4.0.8: resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + dependencies: + '@types/d3-time': 3.0.3 + dev: true - '@types/d3-time@3.0.3': + /@types/d3-time@3.0.3: resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} + dev: true - '@types/debug@4.1.12': + /@types/debug@4.1.12: resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: true - '@types/estree@1.0.5': + /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true - '@types/form-data@0.0.33': + /@types/form-data@0.0.33: resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} + dependencies: + '@types/node': 18.19.45 + dev: true - '@types/fs-extra@9.0.13': + /@types/fs-extra@9.0.13: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + dependencies: + '@types/node': 18.19.45 + dev: true - '@types/glob@7.2.0': + /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.19.45 + dev: true - '@types/hoist-non-react-statics@3.3.5': + /@types/hoist-non-react-statics@3.3.5: resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + dependencies: + '@types/react': 18.3.4 + hoist-non-react-statics: 3.3.2 + dev: true - '@types/json-schema@7.0.15': + /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true - '@types/json5@0.0.29': + /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true - '@types/lodash.flattendeep@4.4.9': + /@types/lodash.flattendeep@4.4.9: resolution: {integrity: sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==} + dependencies: + '@types/lodash': 4.14.189 + dev: true - '@types/lodash@4.14.189': + /@types/lodash@4.14.189: resolution: {integrity: sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==} + dev: true - '@types/lru-cache@5.1.1': + /@types/lru-cache@5.1.1: resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - '@types/mdast@3.0.15': + /@types/mdast@3.0.15: resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + dependencies: + '@types/unist': 2.0.11 + dev: true - '@types/minimatch@5.1.2': + /@types/minimatch@5.1.2: resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: true - '@types/minimist@1.2.5': + /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true - '@types/mocha@9.1.1': + /@types/mocha@9.1.1: resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + dev: true - '@types/ms@0.7.34': + /@types/ms@0.7.34: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true - '@types/ndjson@2.0.1': + /@types/ndjson@2.0.1: resolution: {integrity: sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==} + dependencies: + '@types/node': 18.19.45 + '@types/through': 0.0.33 + dev: true - '@types/node@10.17.60': + /@types/node@10.17.60: resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} + dev: true - '@types/node@18.15.13': + /@types/node@18.15.13: resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - '@types/node@18.19.36': - resolution: {integrity: sha512-tX1BNmYSWEvViftB26VLNxT6mEr37M7+ldUtq7rlKnv4/2fKYsJIOmqJAjT6h1DNuwQjIKgw3VJ/Dtw3yiTIQw==} + /@types/node@18.19.45: + resolution: {integrity: sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==} + dependencies: + undici-types: 5.26.5 - '@types/node@8.10.66': + /@types/node@8.10.66: resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + dev: true - '@types/normalize-package-data@2.4.4': + /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true - '@types/pbkdf2@3.1.2': + /@types/pbkdf2@3.1.2: resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} + dependencies: + '@types/node': 18.19.45 - '@types/prettier@2.7.3': + /@types/prettier@2.7.3: resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true - '@types/prompts@2.4.9': + /@types/prompts@2.4.9: resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + dependencies: + '@types/node': 18.19.45 + kleur: 3.0.3 + dev: true - '@types/prop-types@15.7.12': + /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: true - '@types/qs@6.9.15': + /@types/qs@6.9.15: resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true - '@types/react-dom@18.3.0': + /@types/react-dom@18.3.0: resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + dependencies: + '@types/react': 18.3.4 + dev: true - '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + /@types/react@18.3.4: + resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + dev: true - '@types/secp256k1@4.0.6': + /@types/secp256k1@4.0.6: resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} + dependencies: + '@types/node': 18.19.45 - '@types/semver@7.5.8': + /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true - '@types/sinon@10.0.20': + /@types/sinon@10.0.20: resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + dev: true - '@types/sinonjs__fake-timers@8.1.5': + /@types/sinonjs__fake-timers@8.1.5: resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + dev: true - '@types/styled-components@5.1.26': + /@types/styled-components@5.1.26: resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.3.4 + csstype: 3.1.3 + dev: true - '@types/through@0.0.33': + /@types/through@0.0.33: resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + dependencies: + '@types/node': 18.19.45 + dev: true - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + /@types/unist@2.0.11: + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + dev: true - '@typescript-eslint/eslint-plugin@5.62.0': + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1439,14 +2333,38 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true - '@typescript-eslint/experimental-utils@5.62.0': + /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true - '@typescript-eslint/parser@5.62.0': + /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1455,12 +2373,26 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true - '@typescript-eslint/scope-manager@5.62.0': + /@typescript-eslint/scope-manager@5.62.0: resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true - '@typescript-eslint/type-utils@5.62.0': + /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1469,12 +2401,23 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.6(supports-color@5.5.0) + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true - '@typescript-eslint/types@5.62.0': + /@typescript-eslint/types@5.62.0: resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@typescript-eslint/typescript-estree@5.62.0': + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1482,33 +2425,76 @@ packages: peerDependenciesMeta: typescript: optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.6(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + dev: true - '@typescript-eslint/utils@5.62.0': + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + dev: true - '@typescript-eslint/visitor-keys@5.62.0': + /@typescript-eslint/visitor-keys@5.62.0: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true - '@ungap/promise-all-settled@1.1.2': + /@ungap/promise-all-settled@1.1.2: resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + dev: true - '@ungap/structured-clone@1.2.0': + /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true - '@vitejs/plugin-react@4.3.1': + /@vitejs/plugin-react@4.3.1(vite@5.4.2): resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.2(@types/node@18.19.45) + transitivePeerDependencies: + - supports-color + dev: true - abbrev@1.0.9: + /abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} + dev: true - abitype@0.9.10: + /abitype@0.9.10(typescript@5.0.4): resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} peerDependencies: typescript: '>=5.0.4' @@ -1518,9 +2504,25 @@ packages: optional: true zod: optional: true + dependencies: + typescript: 5.0.4 + dev: true + + /abitype@1.0.5(typescript@5.0.4): + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + dependencies: + typescript: 5.0.4 - abitype@1.0.0: - resolution: {integrity: sha512-NMeMah//6bJ56H5XRj8QCV4AwuW6hB6zqz2LnhhLdcWVQOsXki6/Pn3APeqxCma62nXIcmZWdu1DlHWS74umVQ==} + /abitype@1.0.5(typescript@5.5.4): + resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' zod: ^3 >=3.22.0 @@ -1529,647 +2531,1141 @@ packages: optional: true zod: optional: true + dependencies: + typescript: 5.5.4 + dev: true - acorn-jsx@5.3.2: + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.12.1 + dev: true - acorn-walk@8.3.3: + /acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.12.1 - acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - adm-zip@0.4.16: + /adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} - aes-js@3.0.0: + /aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: true - aes-js@4.0.0-beta.5: + /aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - agent-base@6.0.2: + /agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color - aggregate-error@3.1.0: + /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 - ajv@6.12.6: + /ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true - ajv@8.16.0: - resolution: {integrity: sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==} + /ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 - amdefine@1.0.1: + /amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} + requiresBuild: true + dev: true + optional: true - ansi-align@3.0.1: + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 - ansi-colors@4.1.1: + /ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} + dev: true - ansi-colors@4.1.3: + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-escapes@4.3.2: + /ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 - ansi-regex@3.0.1: + /ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} + dev: true - ansi-regex@5.0.1: + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-styles@3.2.1: + /ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 - ansi-styles@4.3.0: + /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 - antlr4ts@0.5.0-alpha.4: + /antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} + dev: true - anymatch@3.1.3: + /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 - append-transform@2.0.0: + /append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} engines: {node: '>=8'} + dependencies: + default-require-extensions: 3.0.1 + dev: true - archy@1.0.0: + /archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: true - arg@4.1.3: + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@1.0.10: + /argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true - argparse@2.0.1: + /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-back@3.1.0: + /array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} + dev: true - array-back@4.0.2: + /array-back@4.0.2: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} + dev: true - array-buffer-byte-length@1.0.1: + /array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true - array-includes@3.1.8: + /array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true - array-union@2.1.0: + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + dev: true - array-uniq@1.0.3: + /array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} + dev: true - array.prototype.findlastindex@1.2.5: + /array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true - array.prototype.flat@1.3.2: + /array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true - array.prototype.flatmap@1.3.2: + /array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true - arraybuffer.prototype.slice@1.0.3: + /arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true - arrify@1.0.1: + /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + dev: true - asap@2.0.6: + /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true - assertion-error@1.1.0: + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true - astral-regex@2.0.0: + /astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async@1.5.2: + /async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} + dev: true - asynckit@0.4.0: + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: true - at-least-node@1.0.0: + /at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + dev: true - available-typed-arrays@1.0.7: + /available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true - axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + /axios@1.7.5: + resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} + dependencies: + follow-redirects: 1.15.6(debug@4.3.6) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true - babel-plugin-styled-components@2.1.4: + /babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.10)(supports-color@5.5.0): resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' + dependencies: + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true - balanced-match@1.0.2: + /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} + /base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + dependencies: + safe-buffer: 5.2.1 - bech32@1.1.4: + /bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: true - big-integer@1.6.52: + /big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} + dev: true - binary-extensions@2.3.0: + /binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - blakejs@1.2.1: + /blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - bn.js@4.11.6: + /bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} + dev: true - bn.js@4.12.0: + /bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - bn.js@5.2.1: + /bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - boxen@5.1.2: + /boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 - bplist-parser@0.2.0: + /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} + dependencies: + big-integer: 1.6.52 + dev: true - brace-expansion@1.1.11: + /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 - brace-expansion@2.0.1: + /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 - braces@3.0.3: + /braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 - brorand@1.1.0: + /brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - browser-stdout@1.3.1: + /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - browserify-aes@1.2.0: + /browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 - browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} + /browserslist@4.23.3: + resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + dependencies: + caniuse-lite: 1.0.30001651 + electron-to-chromium: 1.5.13 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + dev: true - bs58@4.0.1: + /bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + dependencies: + base-x: 3.0.10 - bs58check@2.1.2: + /bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 - buffer-from@1.1.2: + /buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer-xor@1.0.3: + /buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - bundle-name@3.0.0: + /bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} + dependencies: + run-applescript: 5.0.0 + dev: true - bytes@3.1.2: + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - caching-transform@4.0.0: + /caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + dev: true - call-bind@1.0.7: + /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true - callsites@3.1.0: + /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + dev: true - camelcase-keys@8.0.2: + /camelcase-keys@8.0.2: resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==} engines: {node: '>=14.16'} + dependencies: + camelcase: 7.0.1 + map-obj: 4.3.0 + quick-lru: 6.1.2 + type-fest: 2.19.0 + dev: true - camelcase@5.3.1: + /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} + dev: true - camelcase@6.3.0: + /camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - camelcase@7.0.1: + /camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} + dev: true - camelize@1.0.1: + /camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: true - caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + /caniuse-lite@1.0.30001651: + resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} + dev: true - caseless@0.12.0: + /caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: true - cbor@8.1.0: + /cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} + dependencies: + nofilter: 3.1.0 - cbor@9.0.2: + /cbor@9.0.2: resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} engines: {node: '>=16'} + dependencies: + nofilter: 3.1.0 + dev: false - chai-as-promised@7.1.1: + /chai-as-promised@7.1.1(chai@4.4.1): resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} peerDependencies: chai: '>= 2.1.2 < 5' + dependencies: + chai: 4.4.1 + check-error: 1.0.3 + dev: true - chai@4.4.1: + /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + dev: true - chalk@2.4.2: + /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 - chalk@4.1.2: + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 - character-entities@2.0.2: + /character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + dev: true - charenc@0.0.2: + /charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + dev: true - check-error@1.0.3: + /check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: true - chokidar@3.5.3: + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true - chokidar@3.6.0: + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 - ci-info@2.0.0: + /ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - cipher-base@1.0.4: + /cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 - classnames@2.5.1: + /classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + dev: true - clean-stack@2.2.0: + /clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - cli-boxes@2.2.1: + /cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - cli-table3@0.5.1: + /cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + dev: true - cliui@6.0.0: + /cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true - cliui@7.0.4: + /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 - color-convert@1.9.3: + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 - color-convert@2.0.1: + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 - color-name@1.1.3: + /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: + /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - colors@1.2.5: + /colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} engines: {node: '>=0.1.90'} + dev: true - colors@1.4.0: + /colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} + dev: true - combined-stream@1.0.8: + /combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: true - command-exists@1.2.9: + /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - command-line-args@5.2.1: + /command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + dev: true - command-line-usage@6.1.3: + /command-line-usage@6.1.3: resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} engines: {node: '>=8.0.0'} + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + dev: true - commander@3.0.2: - resolution: {integrity: sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==} - - commander@7.2.0: + /commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + dev: true - commander@9.5.0: + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + + /commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: true + optional: true - commondir@1.0.1: + /commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + dev: true - concat-map@0.0.1: + /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: + /concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: true - convert-source-map@1.9.0: + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true - convert-source-map@2.0.0: + /convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true - cookie@0.4.2: + /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - core-util-is@1.0.3: + /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true - cose-base@1.0.3: + /cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + dependencies: + layout-base: 1.0.2 + dev: true - create-hash@1.2.0: + /create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 - create-hmac@1.1.7: + /create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 - create-require@1.1.1: + /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.3: + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true - crypt@0.0.2: + /crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + dev: true - crypto-random-string@4.0.0: + /crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} + dependencies: + type-fest: 1.4.0 + dev: true - css-color-keywords@1.0.0: + /css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} + dev: true - css-to-react-native@3.2.0: + /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: true - csstype@3.1.3: + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: true - cytoscape-cose-bilkent@4.1.0: + /cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.2): resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: cytoscape: ^3.2.0 + dependencies: + cose-base: 1.0.3 + cytoscape: 3.30.2 + dev: true - cytoscape@3.29.2: - resolution: {integrity: sha512-2G1ycU28Nh7OHT9rkXRLpCDP30MKH1dXJORZuBhtEhEW7pKwgPi77ImqlCWinouyE1PNepIOGZBOrE84DG7LyQ==} + /cytoscape@3.30.2: + resolution: {integrity: sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==} engines: {node: '>=0.10'} + dev: true - d3-array@2.12.1: + /d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + dependencies: + internmap: 1.0.1 + dev: true - d3-array@3.2.4: + /d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} + dependencies: + internmap: 2.0.3 + dev: true - d3-axis@3.0.0: + /d3-axis@3.0.0: resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} engines: {node: '>=12'} + dev: true - d3-brush@3.0.0: + /d3-brush@3.0.0: resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: true - d3-chord@3.0.1: + /d3-chord@3.0.1: resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: true - d3-color@3.1.0: + /d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} + dev: true - d3-contour@4.0.2: + /d3-contour@4.0.2: resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: true - d3-delaunay@6.0.4: + /d3-delaunay@6.0.4: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} + dependencies: + delaunator: 5.0.1 + dev: true - d3-dispatch@3.0.1: + /d3-dispatch@3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} + dev: true - d3-drag@3.0.0: + /d3-drag@3.0.0: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + dev: true - d3-dsv@3.0.1: + /d3-dsv@3.0.1: resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} engines: {node: '>=12'} hasBin: true + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + dev: true - d3-ease@3.0.1: + /d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} + dev: true - d3-fetch@3.0.1: + /d3-fetch@3.0.1: resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} engines: {node: '>=12'} + dependencies: + d3-dsv: 3.0.1 + dev: true - d3-force@3.0.0: + /d3-force@3.0.0: resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + dev: true - d3-format@3.1.0: + /d3-format@3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} + dev: true - d3-geo@3.1.1: + /d3-geo@3.1.1: resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: true - d3-hierarchy@3.1.2: + /d3-hierarchy@3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} + dev: true - d3-interpolate@3.0.1: + /d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + dev: true - d3-path@1.0.9: + /d3-path@1.0.9: resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + dev: true - d3-path@3.1.0: + /d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} + dev: true - d3-polygon@3.0.1: + /d3-polygon@3.0.1: resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} engines: {node: '>=12'} + dev: true - d3-quadtree@3.0.1: + /d3-quadtree@3.0.1: resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} engines: {node: '>=12'} + dev: true - d3-random@3.0.1: + /d3-random@3.0.1: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} + dev: true - d3-sankey@0.12.3: + /d3-sankey@0.12.3: resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + dev: true - d3-scale-chromatic@3.1.0: + /d3-scale-chromatic@3.1.0: resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} engines: {node: '>=12'} + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + dev: true - d3-scale@4.0.2: + /d3-scale@4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + dev: true - d3-selection@3.0.0: + /d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} + dev: true - d3-shape@1.3.7: + /d3-shape@1.3.7: resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + dependencies: + d3-path: 1.0.9 + dev: true - d3-shape@3.2.0: + /d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} + dependencies: + d3-path: 3.1.0 + dev: true - d3-time-format@4.1.0: + /d3-time-format@4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} + dependencies: + d3-time: 3.1.0 + dev: true - d3-time@3.1.0: + /d3-time@3.1.0: resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + dev: true - d3-timer@3.0.1: + /d3-timer@3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + dev: true - d3-transition@3.0.1: + /d3-transition@3.0.1(d3-selection@3.0.0): resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} engines: {node: '>=12'} peerDependencies: d3-selection: 2 - 3 + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + dev: true - d3-zoom@3.0.0: + /d3-zoom@3.0.0: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + dev: true - d3@7.9.0: + /d3@7.9.0: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + dev: true - dagre-d3-es@7.0.10: + /dagre-d3-es@7.0.10: resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + dev: true - data-view-buffer@1.0.1: + /data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true - data-view-byte-length@1.0.1: + /data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true - data-view-byte-offset@1.0.0: + /data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true - dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + /dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + dev: true - death@1.1.0: + /death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} + dev: true - debug@3.2.7: + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true + dependencies: + ms: 2.1.3 + dev: true - debug@4.3.3: + /debug@4.3.3(supports-color@8.1.1): resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} engines: {node: '>=6.0'} peerDependencies: @@ -2177,348 +3673,657 @@ packages: peerDependenciesMeta: supports-color: optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 + dev: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + /debug@4.3.6(supports-color@5.5.0): + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true + dependencies: + ms: 2.1.2 + supports-color: 5.5.0 - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + /debug@4.3.6(supports-color@8.1.1): + resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true + dependencies: + ms: 2.1.2 + supports-color: 8.1.1 - decamelize-keys@1.1.1: + /decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true - decamelize@1.2.0: + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + dev: true - decamelize@4.0.0: + /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - decamelize@6.0.0: + /decamelize@6.0.0: resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - decode-named-character-reference@1.0.2: + /decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: true - deep-eql@4.1.4: + /deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} + dependencies: + type-detect: 4.1.0 + dev: true - deep-extend@0.6.0: + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + dev: true - deep-is@0.1.4: + /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - default-browser-id@3.0.0: + /default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + dev: true - default-browser@4.0.0: + /default-browser@4.0.0: resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} engines: {node: '>=14.16'} + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + dev: true - default-require-extensions@3.0.1: + /default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} + dependencies: + strip-bom: 4.0.0 + dev: true - define-data-property@1.1.4: + /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true - define-lazy-prop@3.0.0: + /define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} + dev: true - define-properties@1.2.1: + /define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true - delaunator@5.0.1: + /delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + dependencies: + robust-predicates: 3.0.2 + dev: true - delayed-stream@1.0.0: + /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dev: true - depd@2.0.0: + /depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - dequal@2.0.3: + /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + dev: true - diff@4.0.2: + /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - diff@5.0.0: + /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} + dev: true - diff@5.2.0: + /diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - difflib@0.2.4: + /difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} + dependencies: + heap: 0.2.7 + dev: true - dir-glob@3.0.1: + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true - doctrine@2.1.0: + /doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true - doctrine@3.0.0: + /doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true - dompurify@3.1.5: - resolution: {integrity: sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA==} + /dompurify@3.1.6: + resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + dev: true - electron-to-chromium@1.4.805: - resolution: {integrity: sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==} + /electron-to-chromium@1.5.13: + resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} + dev: true - elkjs@0.9.3: + /elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + dev: true - elliptic@6.5.4: + /elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - elliptic@6.5.5: - resolution: {integrity: sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==} + /elliptic@6.5.7: + resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 - emoji-regex@8.0.0: + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} + /enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true - enquirer@2.4.1: + /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 - env-paths@2.2.1: + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - error-ex@1.3.2: + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true - es-abstract@1.23.3: + /es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true - es-define-property@1.0.0: + /es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true - es-errors@1.3.0: + /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} + dev: true - es-object-atoms@1.0.0: + /es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true - es-set-tostringtag@2.0.3: + /es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true - es-shim-unscopables@1.0.2: + /es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true - es-to-primitive@1.2.1: + /es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true - es6-error@4.1.1: + /es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + dev: true - esbuild-android-64@0.15.18: + /esbuild-android-64@0.15.18: resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} cpu: [x64] os: [android] + requiresBuild: true + dev: true + optional: true - esbuild-android-arm64@0.15.18: + /esbuild-android-arm64@0.15.18: resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] + requiresBuild: true + dev: true + optional: true - esbuild-darwin-64@0.15.18: + /esbuild-darwin-64@0.15.18: resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] + requiresBuild: true + dev: true + optional: true - esbuild-darwin-arm64@0.15.18: + /esbuild-darwin-arm64@0.15.18: resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] + requiresBuild: true + dev: true + optional: true - esbuild-freebsd-64@0.15.18: + /esbuild-freebsd-64@0.15.18: resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] + requiresBuild: true + dev: true + optional: true - esbuild-freebsd-arm64@0.15.18: + /esbuild-freebsd-arm64@0.15.18: resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] + requiresBuild: true + dev: true + optional: true - esbuild-linux-32@0.15.18: + /esbuild-linux-32@0.15.18: resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-64@0.15.18: + /esbuild-linux-64@0.15.18: resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} engines: {node: '>=12'} cpu: [x64] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-arm64@0.15.18: + /esbuild-linux-arm64@0.15.18: resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} engines: {node: '>=12'} cpu: [arm64] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-arm@0.15.18: + /esbuild-linux-arm@0.15.18: resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} engines: {node: '>=12'} cpu: [arm] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-mips64le@0.15.18: + /esbuild-linux-mips64le@0.15.18: resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-ppc64le@0.15.18: + /esbuild-linux-ppc64le@0.15.18: resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-riscv64@0.15.18: + /esbuild-linux-riscv64@0.15.18: resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-linux-s390x@0.15.18: + /esbuild-linux-s390x@0.15.18: resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] + requiresBuild: true + dev: true + optional: true - esbuild-netbsd-64@0.15.18: + /esbuild-netbsd-64@0.15.18: resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] + requiresBuild: true + dev: true + optional: true - esbuild-openbsd-64@0.15.18: + /esbuild-openbsd-64@0.15.18: resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] + requiresBuild: true + dev: true + optional: true - esbuild-sunos-64@0.15.18: + /esbuild-sunos-64@0.15.18: resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] + requiresBuild: true + dev: true + optional: true - esbuild-windows-32@0.15.18: + /esbuild-windows-32@0.15.18: resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] + requiresBuild: true + dev: true + optional: true - esbuild-windows-64@0.15.18: + /esbuild-windows-64@0.15.18: resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} engines: {node: '>=12'} cpu: [x64] os: [win32] + requiresBuild: true + dev: true + optional: true - esbuild-windows-arm64@0.15.18: + /esbuild-windows-arm64@0.15.18: resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] + requiresBuild: true + dev: true + optional: true - esbuild@0.15.18: + /esbuild@0.15.18: resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} engines: {node: '>=12'} hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + dev: true - esbuild@0.21.5: + /esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true + requiresBuild: true + 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 + dev: true - escalade@3.1.2: + /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - escape-string-regexp@4.0.0: + /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - escodegen@1.8.1: + /escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} hasBin: true + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + dev: true - eslint-config-prettier@8.3.0: + /eslint-config-prettier@8.3.0(eslint@8.57.0): resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true peerDependencies: eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + dev: true - eslint-import-resolver-node@0.3.9: + /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.15.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true - eslint-import-resolver-typescript@3.6.1: + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0): resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: eslint: '*' eslint-plugin-import: '*' + dependencies: + debug: 4.3.6(supports-color@5.5.0) + enhanced-resolve: 5.17.1 + eslint: 8.57.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.6 + is-core-module: 2.15.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true - eslint-module-utils@2.8.1: + /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -2538,8 +4343,17 @@ packages: optional: true eslint-import-resolver-webpack: optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 3.2.7 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + dev: true - eslint-plugin-import@2.29.0: + /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: @@ -2548,18 +4362,49 @@ packages: peerDependenciesMeta: '@typescript-eslint/parser': optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + 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.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true - eslint-plugin-mocha@9.0.0: + /eslint-plugin-mocha@9.0.0(eslint@8.57.0): resolution: {integrity: sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==} engines: {node: '>=12.0.0'} peerDependencies: eslint: '>=7.0.0' + dependencies: + eslint: 8.57.0 + eslint-utils: 3.0.0(eslint@8.57.0) + ramda: 0.27.2 + dev: true - eslint-plugin-no-only-tests@3.1.0: + /eslint-plugin-no-only-tests@3.1.0: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} + dev: true - eslint-plugin-prettier@4.0.0: + /eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0)(eslint@8.57.0)(prettier@2.8.8): resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -2569,4915 +4414,73 @@ packages: peerDependenciesMeta: eslint-config-prettier: optional: true + dependencies: + eslint: 8.57.0 + eslint-config-prettier: 8.3.0(eslint@8.57.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true - eslint-plugin-react-hooks@4.6.2: + /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.57.0 + dev: true - eslint-plugin-react-refresh@0.3.5: + /eslint-plugin-react-refresh@0.3.5(eslint@8.57.0): resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} peerDependencies: eslint: '>=7' + dependencies: + eslint: 8.57.0 + dev: true - eslint-scope@5.1.1: + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true - eslint-utils@3.0.0: + /eslint-utils@3.0.0(eslint@8.57.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + dev: true - eslint-visitor-keys@2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} + dev: true - eslint-visitor-keys@3.4.3: + /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - eslint@8.57.0: + /eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} - peerDependencies: - '@codechecks/client': ^0.1.0 - peerDependenciesMeta: - '@codechecks/client': - optional: true - - ethereum-bloom-filters@1.1.0: - resolution: {integrity: sha512-J1gDRkLpuGNvWYzWslBQR9cDV4nd4kfvVTE/Wy4Kkm4yb3EYRSlyi0eB/inTsSTTVyA0+HyzHgbr95Fn/Z1fSw==} - - ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} - - ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} - - ethereum-cryptography@2.2.0: - resolution: {integrity: sha512-hsm9JhfytIf8QME/3B7j4bc8V+VdTU+Vas1aJlvIS96ffoNAosudXvGoEvWmc7QZYdkC8mrMJz9r0fcbw7GyCA==} - - ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} - - ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} - - ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} - - ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} - - ethers@6.13.1: - resolution: {integrity: sha512-hdJ2HOxg/xx97Lm9HdCWk949BfYqYWpyw4//78SiwOLgASyfrNszfMUNB2joKjvGUdwhHfaiMMFFwacVVoLR9A==} - engines: {node: '>=14.0.0'} - - ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} - - ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} - - evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} - - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} - - form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - - fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - - fs-extra@0.30.0: - resolution: {integrity: sha512-UvSPKyhMn6LEd/WpUaV9C9t3zATuqoqfWc3QdPhPLb58prN9tqYPlPWi8Krxi44loBoUzlobqZ3+8tGpxxSzwA==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} - - ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} - hasBin: true - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - - global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} - - global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - hardhat-gas-reporter@1.0.10: - resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} - peerDependencies: - hardhat: ^2.0.2 - - hardhat@2.22.5: - resolution: {integrity: sha512-9Zq+HonbXCSy6/a13GY1cgHglQRfh4qkzmj1tpPlhxJDwNVnhxlReV6K7hCWFKlOrV13EQwsdcD0rjcaQKWRZw==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} - - hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} - - hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - - hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - hosted-git-info@5.2.1: - resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - immer@10.0.2: - resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - - immutable@4.3.6: - resolution: {integrity: sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isows@1.0.4: - resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} - peerDependencies: - ws: '*' - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} - - istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} - - istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - - jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - - js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@2.4.0: - resolution: {integrity: sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==} - - jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} - - just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - - keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - klaw@1.3.1: - resolution: {integrity: sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - - lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} - - md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} - - meow@11.0.0: - resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} - engines: {node: '>=14.16'} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - mermaid@10.8.0: - resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} - - micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimatch@5.0.1: - resolution: {integrity: sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==} - engines: {node: '>=10'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} - - mocha@10.4.0: - resolution: {integrity: sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==} - engines: {node: '>= 14.0.0'} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} - - node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - - node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} - - non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - - nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-package-data@4.0.1: - resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} - - nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - open-cli@7.2.0: - resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} - engines: {node: '>=14.16'} - hasBin: true - - open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - - optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} - - peek-readable@5.0.0: - resolution: {integrity: sha512-YtCKvLUOvwtMGmrniQPdO7MwPjgkFBtFIrmfSbYmYuq3tKDV/mcfAhBth1+C3ru7uXIZasc/pHnb+YDYNkkj4A==} - engines: {node: '>=14.16'} - - picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.38: - resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier-plugin-solidity@1.1.3: - resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} - engines: {node: '>=12'} - peerDependencies: - prettier: '>=2.3.0 || >=3.0.0-alpha.0' - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} - - promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.12.1: - resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-lru@6.1.2: - resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} - engines: {node: '>=12'} - - ramda@0.27.2: - resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - - react-router-dom@6.11.0: - resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - - react-router@6.11.0: - resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - - react-tooltip@5.27.0: - resolution: {integrity: sha512-JXROcdfCEbCqkAkh8LyTSP3guQ0dG53iY2E2o4fw3D8clKzziMpE6QG6CclDaHELEKTzpMSeAOsdtg0ahoQosw==} - peerDependencies: - react: '>=16.14.0' - react-dom: '>=16.14.0' - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-pkg-up@9.1.0: - resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - read-pkg@7.1.0: - resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} - engines: {node: '>=12.20'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} - - redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} - - reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} - - req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} - - req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - - resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - - resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} - - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} - - rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true - - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - rollup@4.18.0: - resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - - run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} - hasBin: true - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - - secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - - semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true - - sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} - - shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - sinon@14.0.2: - resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} - deprecated: 16.1.1 - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} - - solc@0.7.3: - resolution: {integrity: sha512-GAsWNAjGzIDg7VxzP6mPjdurby3IkGCjQcM8GFYZT6RyaoUZKmMU6Y7YwG+tFGhv7dwZ8rmR4iwFDrrD99JwqA==} - engines: {node: '>=8.0.0'} - hasBin: true - - solidity-comments-extractor@0.0.7: - resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} - - solidity-coverage@0.8.12: - resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} - hasBin: true - peerDependencies: - hardhat: ^2.11.0 - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.18: - resolution: {integrity: sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==} - - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - - string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} - - strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strtok3@7.0.0: - resolution: {integrity: sha512-pQ+V+nYQdC5H3Q7qBZAz/MO6lwGhoC2gOAjuouGf/VO0m7vQRh8QNMl2Uf6SwAtzZ9bOw3UIeBukEGNJl5dtXQ==} - engines: {node: '>=14.16'} - - styled-components@5.3.10: - resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' - - stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - - supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} - - sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} - - table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} - - table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} - engines: {node: '>=10.0.0'} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - temp-dir@3.0.0: - resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} - engines: {node: '>=14.16'} - - tempy@3.1.0: - resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} - engines: {node: '>=14.16'} - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - - titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} - - trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - - ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-essentials@7.0.3: - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - - tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - 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' - - tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - - tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - - type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - typechain@8.3.2: - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - - typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - - typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - - uglify-js@3.18.0: - resolution: {integrity: sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==} - engines: {node: '>=0.8.0'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} - - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - - update-browserslist-db@1.0.16: - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - - viem@2.15.1: - resolution: {integrity: sha512-Vrveen3vDOJyPf8Q8TDyWePG2pTdK6IpSi4P6qlvAP+rXkAeqRvwYBy9AmGm+BeYpCETAyTT0SrCP6458XSt+w==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - - vite-plugin-singlefile@2.0.1: - resolution: {integrity: sha512-J74tfN6TE4fz0Hp7E1+dmVTmCpyazv4yuIpR6jd22Kq76d2CQDSQx3wDiHX8LT02f922V+YrLhRq2VIk/UYrig==} - engines: {node: '>18.0.0'} - peerDependencies: - rollup: ^4.12.0 - vite: ^5.1.4 - - vite@5.3.1: - resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - - web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - - wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - workerpool@6.2.1: - resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - 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'} - - yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true - -snapshots: - - '@adraffy/ens-normalize@1.10.0': {} - - '@adraffy/ens-normalize@1.10.1': {} - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - - '@babel/code-frame@7.24.7': - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - - '@babel/compat-data@7.24.7': {} - - '@babel/core@7.24.7': - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7(supports-color@5.5.0) - '@babel/types': 7.24.7 - convert-source-map: 2.0.0 - debug: 4.3.5(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.24.7': - dependencies: - '@babel/types': 7.24.7 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - - '@babel/helper-annotate-as-pure@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-compilation-targets@7.24.7': - dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-environment-visitor@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-function-name@7.24.7': - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - - '@babel/helper-hoist-variables@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': - dependencies: - '@babel/traverse': 7.24.7(supports-color@5.5.0) - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.24.7': {} - - '@babel/helper-simple-access@7.24.7': - dependencies: - '@babel/traverse': 7.24.7(supports-color@5.5.0) - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/helper-string-parser@7.24.7': {} - - '@babel/helper-validator-identifier@7.24.7': {} - - '@babel/helper-validator-option@7.24.7': {} - - '@babel/helpers@7.24.7': - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - - '@babel/highlight@7.24.7': - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - '@babel/parser@7.24.7': - dependencies: - '@babel/types': 7.24.7 - - '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.24.7)': - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 - - '@babel/template@7.24.7': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - - '@babel/traverse@7.24.7(supports-color@5.5.0)': - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - debug: 4.3.5(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.24.7': - dependencies: - '@babel/helper-string-parser': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - - '@braintree/sanitize-url@6.0.4': {} - - '@cspotcode/source-map-support@0.8.1': - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - '@emotion/is-prop-valid@1.2.2': - dependencies: - '@emotion/memoize': 0.8.1 - - '@emotion/memoize@0.8.1': {} - - '@emotion/stylis@0.8.5': {} - - '@emotion/unitless@0.7.5': {} - - '@esbuild/aix-ppc64@0.21.5': - optional: true - - '@esbuild/android-arm64@0.21.5': - optional: true - - '@esbuild/android-arm@0.15.18': - optional: true - - '@esbuild/android-arm@0.21.5': - optional: true - - '@esbuild/android-x64@0.21.5': - optional: true - - '@esbuild/darwin-arm64@0.21.5': - optional: true - - '@esbuild/darwin-x64@0.21.5': - optional: true - - '@esbuild/freebsd-arm64@0.21.5': - optional: true - - '@esbuild/freebsd-x64@0.21.5': - optional: true - - '@esbuild/linux-arm64@0.21.5': - optional: true - - '@esbuild/linux-arm@0.21.5': - optional: true - - '@esbuild/linux-ia32@0.21.5': - optional: true - - '@esbuild/linux-loong64@0.15.18': - optional: true - - '@esbuild/linux-loong64@0.21.5': - optional: true - - '@esbuild/linux-mips64el@0.21.5': - optional: true - - '@esbuild/linux-ppc64@0.21.5': - optional: true - - '@esbuild/linux-riscv64@0.21.5': - optional: true - - '@esbuild/linux-s390x@0.21.5': - optional: true - - '@esbuild/linux-x64@0.21.5': - optional: true - - '@esbuild/netbsd-x64@0.21.5': - optional: true - - '@esbuild/openbsd-x64@0.21.5': - optional: true - - '@esbuild/sunos-x64@0.21.5': - optional: true - - '@esbuild/win32-arm64@0.21.5': - optional: true - - '@esbuild/win32-ia32@0.21.5': - optional: true - - '@esbuild/win32-x64@0.21.5': - optional: true - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.10.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.5(supports-color@5.5.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.0': {} - - '@ethereumjs/rlp@4.0.1': {} - - '@ethereumjs/util@8.1.0': - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.2.0 - micro-ftch: 0.3.1 - - '@ethersproject/abi@5.7.0': - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/abstract-provider@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - - '@ethersproject/abstract-signer@5.7.0': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - - '@ethersproject/address@5.6.1': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - - '@ethersproject/address@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - - '@ethersproject/base64@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - - '@ethersproject/basex@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - - '@ethersproject/bignumber@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - - '@ethersproject/bytes@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/constants@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - - '@ethersproject/contracts@5.7.0': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - - '@ethersproject/hash@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/hdnode@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/json-wallets@5.7.0': - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - - '@ethersproject/keccak256@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - - '@ethersproject/logger@5.7.0': {} - - '@ethersproject/networks@5.7.1': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/pbkdf2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - - '@ethersproject/properties@5.7.0': - dependencies: - '@ethersproject/logger': 5.7.0 - - '@ethersproject/providers@5.7.2': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - '@ethersproject/random@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/rlp@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/sha2@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - - '@ethersproject/signing-key@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - - '@ethersproject/solidity@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/strings@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/transactions@5.7.0': - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - - '@ethersproject/units@5.7.0': - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - - '@ethersproject/wallet@5.7.0': - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - - '@ethersproject/web@5.7.1': - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@ethersproject/wordlists@5.7.0': - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - - '@fastify/busboy@2.1.1': {} - - '@floating-ui/core@1.6.2': - dependencies: - '@floating-ui/utils': 0.2.2 - - '@floating-ui/dom@1.6.5': - dependencies: - '@floating-ui/core': 1.6.2 - '@floating-ui/utils': 0.2.2 - - '@floating-ui/utils@0.2.2': {} - - '@fontsource/roboto@5.0.13': {} - - '@humanwhocodes/config-array@0.11.14': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5(supports-color@5.5.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@istanbuljs/load-nyc-config@1.1.0': - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - - '@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0)': - dependencies: - '@istanbuljs/schema': 0.1.3 - nyc: 15.1.0 - - '@istanbuljs/schema@0.1.3': {} - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@jridgewell/trace-mapping@0.3.9': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@metamask/eth-sig-util@4.0.1': - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - - '@microsoft/api-extractor-model@7.28.9(@types/node@18.19.36)': - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.19.36) - transitivePeerDependencies: - - '@types/node' - - '@microsoft/api-extractor@7.40.1(@types/node@18.19.36)': - dependencies: - '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.36) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.19.36) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - - '@microsoft/tsdoc@0.14.2': {} - - '@noble/curves@1.2.0': - dependencies: - '@noble/hashes': 1.3.2 - - '@noble/curves@1.4.0': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.2.0': {} - - '@noble/hashes@1.3.2': {} - - '@noble/hashes@1.4.0': {} - - '@noble/secp256k1@1.7.1': {} - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@nomicfoundation/edr-darwin-arm64@0.4.0': {} - - '@nomicfoundation/edr-darwin-x64@0.4.0': {} - - '@nomicfoundation/edr-linux-arm64-gnu@0.4.0': {} - - '@nomicfoundation/edr-linux-arm64-musl@0.4.0': {} - - '@nomicfoundation/edr-linux-x64-gnu@0.4.0': {} - - '@nomicfoundation/edr-linux-x64-musl@0.4.0': {} - - '@nomicfoundation/edr-win32-x64-msvc@0.4.0': {} - - '@nomicfoundation/edr@0.4.0': - dependencies: - '@nomicfoundation/edr-darwin-arm64': 0.4.0 - '@nomicfoundation/edr-darwin-x64': 0.4.0 - '@nomicfoundation/edr-linux-arm64-gnu': 0.4.0 - '@nomicfoundation/edr-linux-arm64-musl': 0.4.0 - '@nomicfoundation/edr-linux-x64-gnu': 0.4.0 - '@nomicfoundation/edr-linux-x64-musl': 0.4.0 - '@nomicfoundation/edr-win32-x64-msvc': 0.4.0 - - '@nomicfoundation/ethereumjs-common@4.0.4': - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - - '@nomicfoundation/ethereumjs-rlp@5.0.4': {} - - '@nomicfoundation/ethereumjs-tx@5.0.4': - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/ethereumjs-util@9.0.4': - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - - '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - '@types/chai-as-promised': 7.1.8 - chai: 4.4.1 - chai-as-promised: 7.1.1(chai@4.4.1) - deep-eql: 4.1.4 - ethers: 6.13.1 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - ordinal: 1.0.3 - - '@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - debug: 4.3.5(supports-color@5.5.0) - ethers: 6.13.1 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - - '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - - ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)))(@types/chai@4.3.16)(@types/mocha@9.1.1)(@types/node@18.19.36)(chai@4.4.1)(ethers@6.13.1)(hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)' - : dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)))(chai@4.4.1)(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-ethers': 3.0.6(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - '@nomicfoundation/hardhat-verify': 2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5)) - '@types/chai': 4.3.16 - '@types/mocha': 9.1.1 - '@types/node': 18.19.36 - chai: 4.4.1 - ethers: 6.13.1 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - solidity-coverage: 0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)) - ts-node: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) - typechain: 8.3.2(typescript@5.4.5) - typescript: 5.4.5 - - '@nomicfoundation/hardhat-verify@2.0.8(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))': - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.6.1 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.5(supports-color@5.5.0) - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - lodash.clonedeep: 4.5.0 - semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 - transitivePeerDependencies: - - supports-color - - '@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typescript@5.4.5)(viem@2.15.1(typescript@5.4.5))': - dependencies: - abitype: 0.9.10(typescript@5.4.5) - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - lodash.memoize: 4.1.2 - typescript: 5.4.5 - viem: 2.15.1(typescript@5.4.5) - transitivePeerDependencies: - - zod - - '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': - optional: true - - '@nomicfoundation/solidity-analyzer@0.1.2': - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - - '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': {} - - '@openzeppelin/contracts@5.0.2': {} - - '@remix-run/router@1.6.0': {} - - '@rollup/rollup-android-arm-eabi@4.18.0': - optional: true - - '@rollup/rollup-android-arm64@4.18.0': - optional: true - - '@rollup/rollup-darwin-arm64@4.18.0': - optional: true - - '@rollup/rollup-darwin-x64@4.18.0': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.18.0': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.18.0': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.18.0': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.18.0': - optional: true - - '@rollup/rollup-linux-powerpc64le-gnu@4.18.0': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.18.0': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.18.0': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.18.0': - optional: true - - '@rollup/rollup-linux-x64-musl@4.18.0': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.18.0': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.18.0': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.18.0': - optional: true - - '@rushstack/node-core-library@3.66.0(@types/node@18.19.36)': - dependencies: - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - optionalDependencies: - '@types/node': 18.19.36 - - '@rushstack/rig-package@0.5.1': - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - - '@rushstack/ts-command-line@4.17.1': - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - - '@scure/base@1.1.7': {} - - '@scure/bip32@1.1.5': - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.7 - - '@scure/bip32@1.3.2': - dependencies: - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.7 - - '@scure/bip32@1.4.0': - dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 - - '@scure/bip39@1.1.1': - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.7 - - '@scure/bip39@1.2.1': - dependencies: - '@noble/hashes': 1.3.2 - '@scure/base': 1.1.7 - - '@scure/bip39@1.3.0': - dependencies: - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 - - '@sentry/core@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/hub@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/minimal@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sentry/node@5.30.0': - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - - '@sentry/tracing@5.30.0': - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - - '@sentry/types@5.30.0': {} - - '@sentry/utils@5.30.0': - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - - '@sinonjs/commons@1.8.6': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/commons@2.0.0': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/commons@3.0.1': - dependencies: - type-detect: 4.0.8 - - '@sinonjs/fake-timers@11.2.2': - dependencies: - '@sinonjs/commons': 3.0.1 - - '@sinonjs/fake-timers@9.1.2': - dependencies: - '@sinonjs/commons': 1.8.6 - - '@sinonjs/samsam@7.0.1': - dependencies: - '@sinonjs/commons': 2.0.0 - lodash.get: 4.4.2 - type-detect: 4.0.8 - - '@sinonjs/text-encoding@0.7.2': {} - - '@solidity-parser/parser@0.14.5': - dependencies: - antlr4ts: 0.5.0-alpha.4 - - '@solidity-parser/parser@0.16.2': - dependencies: - antlr4ts: 0.5.0-alpha.4 - - '@solidity-parser/parser@0.18.0': {} - - '@tokenizer/token@0.3.0': {} - - '@tsconfig/node10@1.0.11': {} - - '@tsconfig/node12@1.0.11': {} - - '@tsconfig/node14@1.0.3': {} - - '@tsconfig/node16@1.0.4': {} - - '@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5)': - dependencies: - ethers: 6.13.1 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.4.5) - typechain: 8.3.2(typescript@5.4.5) - typescript: 5.4.5 - - '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5))(ethers@6.13.1)(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5))(typechain@8.3.2(typescript@5.4.5))': - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.1)(typechain@8.3.2(typescript@5.4.5))(typescript@5.4.5) - ethers: 6.13.1 - fs-extra: 9.1.0 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) - typechain: 8.3.2(typescript@5.4.5) - - '@types/argparse@1.0.38': {} - - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - - '@types/babel__generator@7.6.8': - dependencies: - '@babel/types': 7.24.7 - - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.24.7 - - '@types/bn.js@4.11.6': - dependencies: - '@types/node': 18.19.36 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 18.19.36 - - '@types/chai-as-promised@7.1.8': - dependencies: - '@types/chai': 4.3.16 - - '@types/chai@4.3.16': {} - - '@types/concat-stream@1.6.1': - dependencies: - '@types/node': 18.19.36 - - '@types/d3-scale-chromatic@3.0.3': {} - - '@types/d3-scale@4.0.8': - dependencies: - '@types/d3-time': 3.0.3 - - '@types/d3-time@3.0.3': {} - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - - '@types/estree@1.0.5': {} - - '@types/form-data@0.0.33': - dependencies: - '@types/node': 18.19.36 - - '@types/fs-extra@9.0.13': - dependencies: - '@types/node': 18.19.36 - - '@types/glob@7.2.0': - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.19.36 - - '@types/hoist-non-react-statics@3.3.5': - dependencies: - '@types/react': 18.3.3 - hoist-non-react-statics: 3.3.2 - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/lodash.flattendeep@4.4.9': - dependencies: - '@types/lodash': 4.14.189 - - '@types/lodash@4.14.189': {} - - '@types/lru-cache@5.1.1': {} - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.10 - - '@types/minimatch@5.1.2': {} - - '@types/minimist@1.2.5': {} - - '@types/mocha@9.1.1': {} - - '@types/ms@0.7.34': {} - - '@types/ndjson@2.0.1': - dependencies: - '@types/node': 18.19.36 - '@types/through': 0.0.33 - - '@types/node@10.17.60': {} - - '@types/node@18.15.13': {} - - '@types/node@18.19.36': - dependencies: - undici-types: 5.26.5 - - '@types/node@8.10.66': {} - - '@types/normalize-package-data@2.4.4': {} - - '@types/pbkdf2@3.1.2': - dependencies: - '@types/node': 18.19.36 - - '@types/prettier@2.7.3': {} - - '@types/prompts@2.4.9': - dependencies: - '@types/node': 18.19.36 - kleur: 3.0.3 - - '@types/prop-types@15.7.12': {} - - '@types/qs@6.9.15': {} - - '@types/react-dom@18.3.0': - dependencies: - '@types/react': 18.3.3 - - '@types/react@18.3.3': - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - - '@types/secp256k1@4.0.6': - dependencies: - '@types/node': 18.19.36 - - '@types/semver@7.5.8': {} - - '@types/sinon@10.0.20': - dependencies: - '@types/sinonjs__fake-timers': 8.1.5 - - '@types/sinonjs__fake-timers@8.1.5': {} - - '@types/styled-components@5.1.26': - dependencies: - '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.3.3 - csstype: 3.1.3 - - '@types/through@0.0.33': - dependencies: - '@types/node': 18.19.36 - - '@types/unist@2.0.10': {} - - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/regexpp': 4.10.1 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - debug: 4.3.5(supports-color@5.5.0) - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.2 - tsutils: 3.21.0(typescript@5.4.5) - optionalDependencies: - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/promise-all-settled@1.1.2': {} - - '@ungap/structured-clone@1.2.0': {} - - '@vitejs/plugin-react@4.3.1(vite@5.3.1(@types/node@18.19.36))': - dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.24.7) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.3.1(@types/node@18.19.36) - transitivePeerDependencies: - - supports-color - - abbrev@1.0.9: {} - - abitype@0.9.10(typescript@5.4.5): - optionalDependencies: - typescript: 5.4.5 - - abitype@1.0.0(typescript@5.4.5): - optionalDependencies: - typescript: 5.4.5 - - acorn-jsx@5.3.2(acorn@8.12.0): - dependencies: - acorn: 8.12.0 - - acorn-walk@8.3.3: - dependencies: - acorn: 8.12.0 - - acorn@8.12.0: {} - - adm-zip@0.4.16: {} - - aes-js@3.0.0: {} - - aes-js@4.0.0-beta.5: {} - - agent-base@6.0.2: - dependencies: - debug: 4.3.5(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.16.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - - amdefine@1.0.1: - optional: true - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@4.1.1: {} - - ansi-colors@4.1.3: {} - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-regex@3.0.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - antlr4ts@0.5.0-alpha.4: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - append-transform@2.0.0: - dependencies: - default-require-extensions: 3.0.1 - - archy@1.0.0: {} - - arg@4.1.3: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-back@3.1.0: {} - - array-back@4.0.2: {} - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array-uniq@1.0.3: {} - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - arrify@1.0.1: {} - - asap@2.0.6: {} - - assertion-error@1.1.0: {} - - astral-regex@2.0.0: {} - - async@1.5.2: {} - - asynckit@0.4.0: {} - - at-least-node@1.0.0: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axios@1.7.2: - dependencies: - follow-redirects: 1.15.6(debug@4.3.5) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - - babel-plugin-styled-components@2.1.4(@babel/core@7.24.7)(styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): - dependencies: - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) - transitivePeerDependencies: - - '@babel/core' - - supports-color - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - bech32@1.1.4: {} - - big-integer@1.6.52: {} - - binary-extensions@2.3.0: {} - - blakejs@1.2.1: {} - - bn.js@4.11.6: {} - - bn.js@4.12.0: {} - - bn.js@5.2.1: {} - - boxen@5.1.2: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - - bplist-parser@0.2.0: - dependencies: - big-integer: 1.6.52 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - brorand@1.1.0: {} - - browser-stdout@1.3.1: {} - - browserify-aes@1.2.0: - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - - browserslist@4.23.1: - dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.805 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58check@2.1.2: - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - - buffer-from@1.1.2: {} - - buffer-xor@1.0.3: {} - - bundle-name@3.0.0: - dependencies: - run-applescript: 5.0.0 - - bytes@3.1.2: {} - - caching-transform@4.0.0: - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - camelcase-keys@8.0.2: - dependencies: - camelcase: 7.0.1 - map-obj: 4.3.0 - quick-lru: 6.1.2 - type-fest: 2.19.0 - - camelcase@5.3.1: {} - - camelcase@6.3.0: {} - - camelcase@7.0.1: {} - - camelize@1.0.1: {} - - caniuse-lite@1.0.30001636: {} - - caseless@0.12.0: {} - - cbor@8.1.0: - dependencies: - nofilter: 3.1.0 - - cbor@9.0.2: - dependencies: - nofilter: 3.1.0 - - chai-as-promised@7.1.1(chai@4.4.1): - dependencies: - chai: 4.4.1 - check-error: 1.0.3 - - chai@4.4.1: - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - character-entities@2.0.2: {} - - charenc@0.0.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - ci-info@2.0.0: {} - - cipher-base@1.0.4: - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - - classnames@2.5.1: {} - - clean-stack@2.2.0: {} - - cli-boxes@2.2.1: {} - - cli-table3@0.5.1: - dependencies: - object-assign: 4.1.1 - string-width: 2.1.1 - optionalDependencies: - colors: 1.4.0 - - cliui@6.0.0: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - colors@1.2.5: {} - - colors@1.4.0: {} - - combined-stream@1.0.8: - dependencies: - delayed-stream: 1.0.0 - - command-exists@1.2.9: {} - - command-line-args@5.2.1: - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - - command-line-usage@6.1.3: - dependencies: - array-back: 4.0.2 - chalk: 2.4.2 - table-layout: 1.0.2 - typical: 5.2.0 - - commander@3.0.2: {} - - commander@7.2.0: {} - - commander@9.5.0: - optional: true - - commondir@1.0.1: {} - - concat-map@0.0.1: {} - - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie@0.4.2: {} - - core-util-is@1.0.3: {} - - cose-base@1.0.3: - dependencies: - layout-base: 1.0.2 - - create-hash@1.2.0: - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - - create-hmac@1.1.7: - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - - create-require@1.1.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypt@0.0.2: {} - - crypto-random-string@4.0.0: - dependencies: - type-fest: 1.4.0 - - css-color-keywords@1.0.0: {} - - css-to-react-native@3.2.0: - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - - csstype@3.1.3: {} - - cytoscape-cose-bilkent@4.1.0(cytoscape@3.29.2): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.29.2 - - cytoscape@3.29.2: {} - - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-axis@3.0.0: {} - - d3-brush@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3-chord@3.0.1: - dependencies: - d3-path: 3.1.0 - - d3-color@3.1.0: {} - - d3-contour@4.0.2: - dependencies: - d3-array: 3.2.4 - - d3-delaunay@6.0.4: - dependencies: - delaunator: 5.0.1 - - d3-dispatch@3.0.1: {} - - d3-drag@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - - d3-dsv@3.0.1: - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - - d3-ease@3.0.1: {} - - d3-fetch@3.0.1: - dependencies: - d3-dsv: 3.0.1 - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-format@3.1.0: {} - - d3-geo@3.1.1: - dependencies: - d3-array: 3.2.4 - - d3-hierarchy@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@1.0.9: {} - - d3-path@3.1.0: {} - - d3-polygon@3.0.1: {} - - d3-quadtree@3.0.1: {} - - d3-random@3.0.1: {} - - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - - d3-scale-chromatic@3.1.0: - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-selection@3.0.0: {} - - d3-shape@1.3.7: - dependencies: - d3-path: 1.0.9 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d3-transition@3.0.1(d3-selection@3.0.0): - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - - d3-zoom@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3@7.9.0: - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.1 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.1.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - - dagre-d3-es@7.0.10: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - dayjs@1.11.11: {} - - death@1.1.0: {} - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.4(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - debug@4.3.5(supports-color@5.5.0): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 5.5.0 - - decamelize-keys@1.1.1: - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - - decamelize@1.2.0: {} - - decamelize@4.0.0: {} - - decamelize@6.0.0: {} - - decode-named-character-reference@1.0.2: - dependencies: - character-entities: 2.0.2 - - deep-eql@4.1.4: - dependencies: - type-detect: 4.0.8 - - deep-extend@0.6.0: {} - - deep-is@0.1.4: {} - - default-browser-id@3.0.0: - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - - default-browser@4.0.0: - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - - default-require-extensions@3.0.1: - dependencies: - strip-bom: 4.0.0 - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-lazy-prop@3.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - delaunator@5.0.1: - dependencies: - robust-predicates: 3.0.2 - - delayed-stream@1.0.0: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - diff@4.0.2: {} - - diff@5.0.0: {} - - diff@5.2.0: {} - - difflib@0.2.4: - dependencies: - heap: 0.2.7 - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - dompurify@3.1.5: {} - - electron-to-chromium@1.4.805: {} - - elkjs@0.9.3: {} - - elliptic@6.5.4: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - elliptic@6.5.5: - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - - emoji-regex@8.0.0: {} - - enhanced-resolve@5.17.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - env-paths@2.2.1: {} - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.1 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - es6-error@4.1.1: {} - - esbuild-android-64@0.15.18: - optional: true - - esbuild-android-arm64@0.15.18: - optional: true - - esbuild-darwin-64@0.15.18: - optional: true - - esbuild-darwin-arm64@0.15.18: - optional: true - - esbuild-freebsd-64@0.15.18: - optional: true - - esbuild-freebsd-arm64@0.15.18: - optional: true - - esbuild-linux-32@0.15.18: - optional: true - - esbuild-linux-64@0.15.18: - optional: true - - esbuild-linux-arm64@0.15.18: - optional: true - - esbuild-linux-arm@0.15.18: - optional: true - - esbuild-linux-mips64le@0.15.18: - optional: true - - esbuild-linux-ppc64le@0.15.18: - optional: true - - esbuild-linux-riscv64@0.15.18: - optional: true - - esbuild-linux-s390x@0.15.18: - optional: true - - esbuild-netbsd-64@0.15.18: - optional: true - - esbuild-openbsd-64@0.15.18: - optional: true - - esbuild-sunos-64@0.15.18: - optional: true - - esbuild-windows-32@0.15.18: - optional: true - - esbuild-windows-64@0.15.18: - optional: true - - esbuild-windows-arm64@0.15.18: - optional: true - - esbuild@0.15.18: - optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 - - esbuild@0.21.5: - 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 - - escalade@3.1.2: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escodegen@1.8.1: - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - - eslint-config-prettier@8.3.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.13.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0): - dependencies: - debug: 4.3.5(supports-color@5.5.0) - enhanced-resolve: 5.17.0 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.5 - is-core-module: 2.13.1 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - dependencies: - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - 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.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.4.5))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.13.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.4.5) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-mocha@9.0.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-utils: 3.0.0(eslint@8.57.0) - ramda: 0.27.2 - - eslint-plugin-no-only-tests@3.1.0: {} - - eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): - dependencies: - eslint: 8.57.0 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 8.3.0(eslint@8.57.0) - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-plugin-react-refresh@0.3.5(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-utils@3.0.0(eslint@8.57.0): - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - - eslint-visitor-keys@2.1.0: {} - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@eslint-community/regexpp': 4.10.1 + '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 '@eslint/js': 8.57.0 '@humanwhocodes/config-array': 0.11.14 @@ -7487,13 +4490,13 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - esquery: 1.5.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -7501,7 +4504,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 @@ -7516,37 +4519,73 @@ snapshots: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - acorn: 8.12.0 - acorn-jsx: 5.3.2(acorn@8.12.0) + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 + dev: true - esprima@2.7.3: {} + /esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + dev: true - esprima@4.0.1: {} + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true - esquery@1.5.0: + /esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true - estraverse@1.9.3: {} + /estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + dev: true - estraverse@4.3.0: {} + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true - eth-gas-reporter@0.2.27: + /eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.2 + axios: 1.7.5 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -7554,7 +4593,7 @@ snapshots: fs-readdir-recursive: 1.1.0 lodash: 4.17.21 markdown-table: 1.1.3 - mocha: 10.4.0 + mocha: 10.7.3 req-cwd: 2.0.0 sha1: 1.1.1 sync-request: 6.1.0 @@ -7562,12 +4601,16 @@ snapshots: - bufferutil - debug - utf-8-validate + dev: true - ethereum-bloom-filters@1.1.0: + /ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} dependencies: '@noble/hashes': 1.4.0 + dev: true - ethereum-cryptography@0.1.3: + /ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} dependencies: '@types/pbkdf2': 3.1.2 '@types/secp256k1': 4.0.6 @@ -7585,44 +4628,53 @@ snapshots: secp256k1: 4.0.3 setimmediate: 1.0.5 - ethereum-cryptography@1.2.0: + /ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - ethereum-cryptography@2.2.0: + /ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} dependencies: - '@noble/curves': 1.4.0 + '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 + dev: true - ethereumjs-abi@0.6.8: + /ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - ethereumjs-util@6.2.1: + /ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} dependencies: '@types/bn.js': 4.11.6 bn.js: 4.12.0 create-hash: 1.2.0 - elliptic: 6.5.5 + elliptic: 6.5.7 ethereum-cryptography: 0.1.3 ethjs-util: 0.1.6 rlp: 2.2.7 - ethereumjs-util@7.1.5: + /ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} dependencies: '@types/bn.js': 5.1.5 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 + dev: true - ethers@5.7.2: + /ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -7657,8 +4709,11 @@ snapshots: transitivePeerDependencies: - bufferutil - utf-8-validate + dev: true - ethers@6.13.1: + /ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} + engines: {node: '>=14.0.0'} dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -7671,22 +4726,31 @@ snapshots: - bufferutil - utf-8-validate - ethjs-unit@0.1.6: + /ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 + dev: true - ethjs-util@0.1.6: + /ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 + bundledDependencies: false - evp_bytestokey@1.0.3: + /evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - execa@5.1.1: + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7697,8 +4761,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 + dev: true - execa@7.2.0: + /execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7709,214 +4776,339 @@ snapshots: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 + dev: true - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: {} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.7 + micromatch: 4.0.8 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true - fast-json-stable-stringify@2.1.0: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - fast-levenshtein@2.0.6: {} + /fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} - fastq@1.17.1: + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true - file-type@18.7.0: + /file-type@18.7.0: + resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} + engines: {node: '>=14.16'} dependencies: readable-web-to-node-stream: 3.0.2 - strtok3: 7.0.0 + strtok3: 7.1.1 token-types: 5.0.1 + dev: true - fill-range@7.1.1: + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-cache-dir@3.3.2: + /find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 + dev: true - find-replace@3.0.0: + /find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} dependencies: array-back: 3.1.0 + dev: true - find-up@2.1.0: + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} dependencies: locate-path: 2.0.0 - find-up@4.1.0: + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: true - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@6.3.0: + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: locate-path: 7.2.0 path-exists: 5.0.0 + dev: true - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 + dev: true - flat@5.0.2: {} + /flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true - flatted@3.3.1: {} + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true - follow-redirects@1.15.6(debug@4.3.5): - optionalDependencies: - debug: 4.3.5(supports-color@5.5.0) + /follow-redirects@1.15.6(debug@4.3.6): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.3.6(supports-color@5.5.0) - for-each@0.3.3: + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} dependencies: is-callable: 1.2.7 + dev: true - foreground-child@2.0.0: + /foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} dependencies: cross-spawn: 7.0.3 signal-exit: 3.0.7 + dev: true - form-data@2.5.1: + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: true - form-data@4.0.0: + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + dev: true - fp-ts@1.19.3: {} - - fromentries@1.3.2: {} + /fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} - fs-extra@0.30.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 2.4.0 - klaw: 1.3.1 - path-is-absolute: 1.0.1 - rimraf: 2.7.1 + /fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + dev: true - fs-extra@10.1.0: + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + dev: false - fs-extra@7.0.1: + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - fs-extra@8.1.0: + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 + dev: true - fs-extra@9.1.0: + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + dev: true - fs-readdir-recursive@1.1.0: {} + /fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + dev: true - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true optional: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true - function.prototype.name@1.1.6: + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 + dev: true - functions-have-names@1.2.3: {} + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true - gensync@1.0.0-beta.2: {} + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true - get-caller-file@2.0.5: {} + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: {} + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true - get-intrinsic@1.2.4: + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 + dev: true - get-package-type@0.1.0: {} + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true - get-port@3.2.0: {} + /get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + dev: true - get-stdin@9.0.0: {} + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true - get-stream@6.0.1: {} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true - get-symbol-description@1.0.2: + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 + dev: true - get-tsconfig@4.7.5: + /get-tsconfig@4.7.6: + resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} dependencies: resolve-pkg-maps: 1.0.0 + dev: true - ghost-testrpc@0.0.2: + /ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true dependencies: chalk: 2.4.2 node-emoji: 1.11.0 + dev: true - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - glob@5.0.15: + /glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - glob@7.1.7: + /glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7924,8 +5116,11 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - glob@7.2.0: + /glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7934,7 +5129,9 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7942,94 +5139,212 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true - glob@8.1.0: + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 5.0.1 + minimatch: 5.1.6 once: 1.4.0 - global-modules@2.0.0: + /global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} dependencies: global-prefix: 3.0.0 + dev: true - global-prefix@3.0.0: + /global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 + dev: true - globals@11.12.0: {} + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true - globals@13.24.0: + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true - globalthis@1.0.4: + /globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} dependencies: define-properties: 1.2.1 gopd: 1.0.1 + dev: true - globby@10.0.2: + /globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.3.2 glob: 7.2.3 - ignore: 5.3.1 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 + dev: true - globby@11.1.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: 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 + dev: true - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 + dev: true - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphemer@1.4.0: {} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true - growl@1.10.5: {} + /growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + dev: true - handlebars@4.7.8: + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true dependencies: minimist: 1.2.8 neo-async: 2.6.2 source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.18.0 + uglify-js: 3.19.2 + dev: true - hard-rejection@2.1.0: {} + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true - hardhat-gas-reporter@1.0.10(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)): + /hardhat-gas-reporter@1.0.10(hardhat@2.22.9): + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 dependencies: array-uniq: 1.0.3 eth-gas-reporter: 0.2.27 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) sha1: 1.1.1 transitivePeerDependencies: - - '@codechecks/client' + - '@codechecks/client' + - bufferutil + - debug + - utf-8-validate + dev: true + + /hardhat@2.22.9(ts-node@10.9.1)(typescript@5.0.4): + resolution: {integrity: sha512-sWiuI/yRdFUPfndIvL+2H18Vs2Gav0XacCFYY5msT5dHOWkhLxESJySIk9j83mXL31aXL8+UMA9OgViFLexklg==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + dependencies: + '@ethersproject/abi': 5.7.0 + '@metamask/eth-sig-util': 4.0.1 + '@nomicfoundation/edr': 0.5.2 + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-tx': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + '@nomicfoundation/solidity-analyzer': 0.1.2 + '@sentry/node': 5.30.0 + '@types/bn.js': 5.1.5 + '@types/lru-cache': 5.1.1 + adm-zip: 0.4.16 + aggregate-error: 3.1.0 + ansi-escapes: 4.3.2 + boxen: 5.1.2 + chalk: 2.4.2 + chokidar: 3.6.0 + ci-info: 2.0.0 + debug: 4.3.6(supports-color@5.5.0) + enquirer: 2.4.1 + env-paths: 2.2.1 + ethereum-cryptography: 1.2.0 + ethereumjs-abi: 0.6.8 + find-up: 2.1.0 + fp-ts: 1.19.3 + fs-extra: 7.0.1 + glob: 7.2.0 + immutable: 4.3.7 + io-ts: 1.10.4 + keccak: 3.0.4 + lodash: 4.17.21 + mnemonist: 0.38.5 + mocha: 10.7.3 + p-map: 4.0.0 + raw-body: 2.5.2 + resolve: 1.17.0 + semver: 6.3.1 + solc: 0.8.26(debug@4.3.6) + source-map-support: 0.5.21 + stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) + tsort: 0.0.1 + typescript: 5.0.4 + undici: 5.28.4 + uuid: 8.3.2 + ws: 7.5.10 + transitivePeerDependencies: - bufferutil - - debug + - c-kzg + - supports-color - utf-8-validate + dev: true - hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5): + /hardhat@2.22.9(ts-node@10.9.1)(typescript@5.5.4): + resolution: {integrity: sha512-sWiuI/yRdFUPfndIvL+2H18Vs2Gav0XacCFYY5msT5dHOWkhLxESJySIk9j83mXL31aXL8+UMA9OgViFLexklg==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.4.0 + '@nomicfoundation/edr': 0.5.2 '@nomicfoundation/ethereumjs-common': 4.0.4 '@nomicfoundation/ethereumjs-tx': 5.0.4 '@nomicfoundation/ethereumjs-util': 9.0.4 @@ -8044,7 +5359,7 @@ snapshots: chalk: 2.4.2 chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -8053,104 +5368,152 @@ snapshots: fp-ts: 1.19.3 fs-extra: 7.0.1 glob: 7.2.0 - immutable: 4.3.6 + immutable: 4.3.7 io-ts: 1.10.4 keccak: 3.0.4 lodash: 4.17.21 mnemonist: 0.38.5 - mocha: 10.4.0 + mocha: 10.7.3 p-map: 4.0.0 raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.7.3(debug@4.3.5) + solc: 0.8.26(debug@4.3.6) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 + ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) tsort: 0.0.1 + typescript: 5.5.4 undici: 5.28.4 uuid: 8.3.2 ws: 7.5.10 - optionalDependencies: - ts-node: 10.9.1(@types/node@18.19.36)(typescript@5.4.5) - typescript: 5.4.5 transitivePeerDependencies: - bufferutil - c-kzg - supports-color - utf-8-validate - has-bigints@1.0.2: {} + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true - has-flag@1.0.0: {} + /has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + dev: true - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-property-descriptors@1.0.2: + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} dependencies: es-define-property: 1.0.0 + dev: true - has-proto@1.0.3: {} + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true - has-tostringtag@1.0.2: + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: true - hash-base@3.1.0: + /hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - hash.js@1.1.7: + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - hasha@5.2.2: + /hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} dependencies: is-stream: 2.0.1 type-fest: 0.8.1 + dev: true - hasown@2.0.2: + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 + dev: true - he@1.2.0: {} + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true - heap@0.2.7: {} + /heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + dev: true - hmac-drbg@1.0.1: + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - hoist-non-react-statics@3.3.2: + /hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} dependencies: react-is: 16.13.1 + dev: true - hosted-git-info@4.1.0: + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 + dev: true - hosted-git-info@5.2.1: + /hosted-git-info@5.2.1: + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: lru-cache: 7.18.3 + dev: true - html-escaper@2.0.2: {} + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true - http-basic@8.1.3: + /http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} dependencies: caseless: 0.12.0 concat-stream: 1.6.2 http-response-object: 3.0.2 parse-cache-control: 1.0.1 + dev: true - http-errors@2.0.0: + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -8158,208 +5521,378 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 - http-response-object@3.0.2: + /http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} dependencies: '@types/node': 10.17.60 + dev: true - https-proxy-agent@5.0.1: + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) transitivePeerDependencies: - supports-color - human-signals@2.1.0: {} + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true - human-signals@4.3.1: {} + /human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + dev: true - iconv-lite@0.4.24: + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true - ieee754@1.2.1: {} + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: true - ignore@5.3.1: {} + /ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + dev: true - immer@10.0.2: {} + /immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + dev: false - immutable@4.3.6: {} + /immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true - import-lazy@4.0.0: {} + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: true - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true - indent-string@4.0.0: {} + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} - indent-string@5.0.0: {} + /indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + dev: true - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.4: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: {} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true - internal-slot@1.0.7: + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 + dev: true - internmap@1.0.1: {} + /internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + dev: true - internmap@2.0.3: {} + /internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + dev: true - interpret@1.4.0: {} + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true - io-ts@1.10.4: + /io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} dependencies: fp-ts: 1.19.3 - is-array-buffer@3.0.4: + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 + dev: true - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true - is-bigint@1.0.4: + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} dependencies: has-bigints: 1.0.2 + dev: true - is-binary-path@2.1.0: + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} dependencies: binary-extensions: 2.3.0 - is-boolean-object@1.1.2: + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: true - is-callable@1.2.7: {} + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true - is-core-module@2.13.1: + /is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} dependencies: hasown: 2.0.2 + dev: true - is-data-view@1.0.1: + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} dependencies: is-typed-array: 1.1.13 + dev: true - is-date-object@1.0.5: + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: true - is-docker@2.2.1: {} + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + dev: true - is-docker@3.0.0: {} + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-fullwidth-code-point@2.0.0: {} + /is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + dev: true - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 - is-hex-prefixed@1.0.0: {} + /is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} - is-inside-container@1.0.0: + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true dependencies: is-docker: 3.0.0 + dev: true - is-negative-zero@2.0.3: {} + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true - is-number-object@1.0.7: + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: true - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true - is-plain-obj@1.1.0: {} + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true - is-plain-obj@2.1.0: {} + /is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} - is-regex@1.1.4: + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + dev: true - is-shared-array-buffer@1.0.3: + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 + dev: true - is-stream@2.0.1: {} + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true - is-stream@3.0.0: {} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - is-string@1.0.7: + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} dependencies: has-tostringtag: 1.0.2 + dev: true - is-symbol@1.0.4: + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} dependencies: has-symbols: 1.0.3 + dev: true - is-typed-array@1.1.13: + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} dependencies: which-typed-array: 1.1.15 + dev: true - is-typedarray@1.0.0: {} + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true - is-unicode-supported@0.1.0: {} + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - is-weakref@1.0.2: + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.7 + dev: true - is-windows@1.0.2: {} + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true - is-wsl@2.2.0: + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} dependencies: is-docker: 2.2.1 + dev: true - isarray@1.0.0: {} + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true - isarray@2.0.5: {} + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true - isows@1.0.4(ws@8.17.1): + /isows@1.0.4(ws@8.17.1): + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} + peerDependencies: + ws: '*' dependencies: ws: 8.17.1 - istanbul-lib-coverage@3.2.2: {} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true - istanbul-lib-hook@3.0.0: + /istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} dependencies: append-transform: 2.0.0 + dev: true - istanbul-lib-instrument@4.0.3: + /istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.7 + '@babel/core': 7.25.2 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 transitivePeerDependencies: - supports-color + dev: true - istanbul-lib-processinfo@2.0.3: + /istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} dependencies: archy: 1.0.0 cross-spawn: 7.0.3 @@ -8367,203 +5900,327 @@ snapshots: p-map: 3.0.0 rimraf: 3.0.2 uuid: 8.3.2 + dev: true - istanbul-lib-report@3.0.1: + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 + dev: true - istanbul-lib-source-maps@4.0.1: + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} dependencies: - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color + dev: true - istanbul-reports@3.1.7: + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 + dev: true - jju@1.4.0: {} + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true - js-sha3@0.8.0: {} + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true - js-yaml@3.14.1: + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 + dev: true - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 - jsesc@2.5.2: {} + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - json-schema-traverse@1.0.0: {} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true - json-stringify-safe@5.0.1: {} + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false - json5@1.0.2: + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true dependencies: minimist: 1.2.8 + dev: true - json5@2.2.3: {} - - jsonfile@2.4.0: - optionalDependencies: - graceful-fs: 4.2.11 + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - jsonfile@4.0.0: + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.11 - jsonfile@6.1.0: + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - jsonschema@1.4.1: {} + /jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + dev: true - just-extend@6.2.0: {} + /just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + dev: true - keccak@3.0.4: + /keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + requiresBuild: true dependencies: node-addon-api: 2.0.2 node-gyp-build: 4.8.1 readable-stream: 3.6.2 - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true - khroma@2.1.0: {} - - kind-of@6.0.3: {} + /khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + dev: true - klaw@1.3.1: - optionalDependencies: - graceful-fs: 4.2.11 + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true - kleur@3.0.3: {} + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} - kleur@4.1.5: {} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true - layout-base@1.0.2: {} + /layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + dev: true - levn@0.3.0: + /levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 + dev: true - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - lines-and-columns@1.2.4: {} + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true - locate-path@2.0.0: + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - locate-path@5.0.0: + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: true - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 - locate-path@7.2.0: + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 + dev: true - lodash-es@4.17.21: {} + /lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true - lodash.camelcase@4.3.0: {} + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true - lodash.clonedeep@4.5.0: {} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - lodash.flattendeep@4.4.0: {} + /lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + dev: true - lodash.get@4.4.2: {} + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true - lodash.isequal@4.5.0: {} + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true - lodash.memoize@4.1.2: {} + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true - lodash.truncate@4.4.2: {} + /lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loose-envify@1.4.0: + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true dependencies: js-tokens: 4.0.0 + dev: true - loupe@2.3.7: + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} dependencies: get-func-name: 2.0.2 + dev: true - lru-cache@5.1.1: + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 + dev: true - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 + dev: true - lru-cache@7.18.3: {} + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: true - lru_map@0.3.3: {} + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - make-dir@3.1.0: + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} dependencies: semver: 6.3.1 + dev: true - make-dir@4.0.0: + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: - semver: 7.6.2 + semver: 7.6.3 + dev: true - make-error@1.3.6: {} + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - map-obj@1.0.1: {} + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true - map-obj@4.3.0: {} + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true - markdown-table@1.1.3: {} + /markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + dev: true - md5.js@1.3.5: + /md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - mdast-util-from-markdown@1.3.1: + /mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} dependencies: '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 + '@types/unist': 2.0.11 decode-named-character-reference: 1.0.2 mdast-util-to-string: 3.2.0 micromark: 3.2.0 @@ -8576,14 +6233,21 @@ snapshots: uvu: 0.5.6 transitivePeerDependencies: - supports-color + dev: true - mdast-util-to-string@3.2.0: + /mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} dependencies: '@types/mdast': 3.0.15 + dev: true - memorystream@0.3.1: {} + /memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} - meow@11.0.0: + /meow@11.0.0: + resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} + engines: {node: '>=14.16'} dependencies: '@types/minimist': 1.2.5 camelcase-keys: 8.0.2 @@ -8597,38 +6261,49 @@ snapshots: trim-newlines: 4.1.1 type-fest: 3.13.1 yargs-parser: 21.1.1 + dev: true - merge-stream@2.0.0: {} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true - merge2@1.4.1: {} + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true - mermaid@10.8.0: + /mermaid@10.8.0: + resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 '@types/d3-scale-chromatic': 3.0.3 - cytoscape: 3.29.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.29.2) + cytoscape: 3.30.2 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.30.2) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.10 - dayjs: 1.11.11 - dompurify: 3.1.5 + dayjs: 1.11.13 + dompurify: 3.1.6 elkjs: 0.9.3 khroma: 2.1.0 lodash-es: 4.17.21 mdast-util-from-markdown: 1.3.1 non-layered-tidy-tree-layout: 2.0.2 - stylis: 4.3.2 + stylis: 4.3.4 ts-dedent: 2.2.0 uuid: 9.0.1 web-worker: 1.3.0 transitivePeerDependencies: - supports-color + dev: true - micro-ftch@0.3.1: {} + /micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + dev: true - micromark-core-commonmark@1.1.0: + /micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -8646,103 +6321,143 @@ snapshots: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true - micromark-factory-destination@1.1.0: + /micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-factory-label@1.1.0: + /micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true - micromark-factory-space@1.1.0: + /micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 + dev: true - micromark-factory-title@1.1.0: + /micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-factory-whitespace@1.1.0: + /micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-util-character@1.2.0: + /micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-util-chunked@1.1.0: + /micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} dependencies: micromark-util-symbol: 1.1.0 + dev: true - micromark-util-classify-character@1.1.0: + /micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-util-combine-extensions@1.1.0: + /micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 + dev: true - micromark-util-decode-numeric-character-reference@1.1.0: + /micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} dependencies: micromark-util-symbol: 1.1.0 + dev: true - micromark-util-decode-string@1.1.0: + /micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 + dev: true - micromark-util-encode@1.1.0: {} + /micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + dev: true - micromark-util-html-tag-name@1.2.0: {} + /micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + dev: true - micromark-util-normalize-identifier@1.1.0: + /micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} dependencies: micromark-util-symbol: 1.1.0 + dev: true - micromark-util-resolve-all@1.1.0: + /micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} dependencies: micromark-util-types: 1.1.0 + dev: true - micromark-util-sanitize-uri@1.2.0: + /micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 + dev: true - micromark-util-subtokenize@1.1.0: + /micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 + dev: true - micromark-util-symbol@1.1.0: {} + /micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + dev: true - micromark-util-types@1.1.0: {} + /micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + dev: true - micromark@3.2.0: + /micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -8760,82 +6475,127 @@ snapshots: uvu: 0.5.6 transitivePeerDependencies: - supports-color + dev: true - micromatch@4.0.7: + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.3 picomatch: 2.3.1 + dev: true - mime-db@1.52.0: {} + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: true - mime-types@2.1.35: + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 + dev: true - mimic-fn@2.1.0: {} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true - mimic-fn@4.0.0: {} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - min-indent@1.0.1: {} + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true - minimalistic-assert@1.0.1: {} + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - minimalistic-crypto-utils@1.0.1: {} + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} - minimatch@3.1.2: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - minimatch@4.2.1: + /minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} dependencies: brace-expansion: 1.1.11 + dev: true - minimatch@5.0.1: + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 - minimist-options@4.1.0: + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 + dev: true - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - mkdirp@0.5.6: + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true dependencies: minimist: 1.2.8 + dev: true - mkdirp@1.0.4: {} + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true - mnemonist@0.38.5: + /mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} dependencies: obliterator: 2.0.4 - mocha@10.4.0: + /mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true dependencies: - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.4(supports-color@8.1.1) - diff: 5.0.0 + chokidar: 3.6.0 + debug: 4.3.6(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 5.0.1 + minimatch: 5.1.6 ms: 2.1.3 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - workerpool: 6.2.1 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - mocha@9.2.2: + /mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true dependencies: '@ungap/promise-all-settled': 1.1.2 ansi-colors: 4.1.1 @@ -8861,91 +6621,154 @@ snapshots: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 + dev: true - mri@1.2.0: {} + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: true - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: {} + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - nanoid@3.3.1: {} + /nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true - natural-compare-lite@1.4.0: {} + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true - ndjson@2.0.0: + /ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true dependencies: json-stringify-safe: 5.0.1 minimist: 1.2.8 readable-stream: 3.6.2 split2: 3.2.2 through2: 4.0.2 + dev: false - neo-async@2.6.2: {} + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true - nise@5.1.9: + /nise@5.1.9: + resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} dependencies: '@sinonjs/commons': 3.0.1 - '@sinonjs/fake-timers': 11.2.2 - '@sinonjs/text-encoding': 0.7.2 + '@sinonjs/fake-timers': 11.3.1 + '@sinonjs/text-encoding': 0.7.3 just-extend: 6.2.0 path-to-regexp: 6.2.2 + dev: true - node-addon-api@2.0.2: {} + /node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} - node-emoji@1.11.0: + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 + dev: true - node-gyp-build@4.8.1: {} + /node-gyp-build@4.8.1: + resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} + hasBin: true - node-preload@0.2.1: + /node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} dependencies: process-on-spawn: 1.0.0 + dev: true - node-releases@2.0.14: {} + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + dev: true - nofilter@3.1.0: {} + /nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} - non-layered-tidy-tree-layout@2.0.2: {} + /non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + dev: true - nopt@3.0.6: + /nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true dependencies: abbrev: 1.0.9 + dev: true - normalize-package-data@3.0.3: + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.13.1 - semver: 7.6.2 + is-core-module: 2.15.1 + semver: 7.6.3 validate-npm-package-license: 3.0.4 + dev: true - normalize-package-data@4.0.1: + /normalize-package-data@4.0.1: + resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: hosted-git-info: 5.2.1 - is-core-module: 2.13.1 - semver: 7.6.2 + is-core-module: 2.15.1 + semver: 7.6.3 validate-npm-package-license: 3.0.4 + dev: true - normalize-path@3.0.0: {} + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} dependencies: path-key: 3.1.1 + dev: true - npm-run-path@5.3.0: + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true - number-to-bn@1.7.0: + /number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 + dev: true - nyc@15.1.0: + /nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 @@ -8976,69 +6799,108 @@ snapshots: yargs: 15.4.1 transitivePeerDependencies: - supports-color + dev: true - object-assign@4.1.1: {} + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true - object-inspect@1.13.1: {} + /object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + dev: true - object-keys@1.1.1: {} + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true - object.assign@4.1.5: + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 + dev: true - object.fromentries@2.0.8: + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 + dev: true - object.groupby@1.0.3: + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 + dev: true - object.values@1.2.0: + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: true - obliterator@2.0.4: {} + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - onetime@5.1.2: + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: true - onetime@6.0.0: + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 + dev: true - open-cli@7.2.0: + /open-cli@7.2.0: + resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} + engines: {node: '>=14.16'} + hasBin: true dependencies: file-type: 18.7.0 get-stdin: 9.0.0 meow: 11.0.0 open: 9.1.0 tempy: 3.1.0 + dev: true - open@9.1.0: + /open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 + dev: true - optionator@0.8.3: + /optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -9046,8 +6908,11 @@ snapshots: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 + dev: true - optionator@0.9.4: + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -9055,96 +6920,167 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 + dev: true - ordinal@1.0.3: {} + /ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + dev: true - os-tmpdir@1.0.2: {} + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} - p-limit@1.3.0: + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} dependencies: p-try: 1.0.0 - p-limit@2.3.0: + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: true - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - yocto-queue: 1.0.0 + yocto-queue: 1.1.1 + dev: true - p-locate@2.0.0: + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} dependencies: p-limit: 1.3.0 - p-locate@4.1.0: + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: true - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 - p-locate@6.0.0: + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 + dev: true - p-map@3.0.0: + /p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} dependencies: aggregate-error: 3.1.0 + dev: true - p-map@4.0.0: + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 - p-try@1.0.0: {} + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} - p-try@2.2.0: {} + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true - package-hash@4.0.0: + /package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} dependencies: graceful-fs: 4.2.11 hasha: 5.2.2 lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 + dev: true - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true - parse-cache-control@1.0.1: {} + /parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + dev: true - parse-json@5.2.0: + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} dependencies: '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: true - path-exists@3.0.0: {} + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - path-exists@5.0.0: {} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - path-is-absolute@1.0.1: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - path-key@3.1.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true - path-key@4.0.0: {} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true - path-parse@1.0.7: {} + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-to-regexp@6.2.2: {} + /path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true - pathval@1.1.1: {} + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true - pbkdf2@3.1.2: + /pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 @@ -9152,132 +7088,238 @@ snapshots: safe-buffer: 5.2.1 sha.js: 2.4.11 - peek-readable@5.0.0: {} + /peek-readable@5.1.4: + resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} + engines: {node: '>=14.16'} + dev: true - picocolors@1.0.1: {} + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + dev: true - picomatch@2.3.1: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - pify@4.0.1: {} + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true - pkg-dir@4.2.0: + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 + dev: true - possible-typed-array-names@1.0.0: {} + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true - postcss-value-parser@4.2.0: {} + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true - postcss@8.4.38: + /postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} + engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.1 source-map-js: 1.2.0 + dev: true - prelude-ls@1.1.2: {} + /prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + dev: true - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - prettier-linter-helpers@1.0.0: + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.3.0 + dev: true - prettier-plugin-solidity@1.1.3(prettier@2.8.8): + /prettier-plugin-solidity@1.1.3(prettier@2.8.8): + resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} + engines: {node: '>=12'} + peerDependencies: + prettier: '>=2.3.0 || >=3.0.0-alpha.0' dependencies: '@solidity-parser/parser': 0.16.2 prettier: 2.8.8 - semver: 7.6.2 + semver: 7.6.3 solidity-comments-extractor: 0.0.7 + dev: true - prettier@2.8.8: {} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true - process-nextick-args@2.0.1: {} + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true - process-on-spawn@1.0.0: + /process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} dependencies: fromentries: 1.3.2 + dev: true - promise@8.3.0: + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} dependencies: asap: 2.0.6 + dev: true - prompts@2.4.2: + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 + dev: false - proxy-from-env@1.1.0: {} + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: true - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true - qs@6.12.1: + /qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} dependencies: side-channel: 1.0.6 + dev: true - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true - quick-lru@6.1.2: {} + /quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + dev: true - ramda@0.27.2: {} + /ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + dev: true - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 - raw-body@2.5.2: + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - react-dom@18.3.1(react@18.3.1): + /react-dom@18.3.1(react@18.3.1): + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 + dev: true - react-is@16.13.1: {} + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true - react-refresh@0.14.2: {} + /react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + dev: true - react-router-dom@6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /react-router-dom@6.11.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' dependencies: '@remix-run/router': 1.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.11.0(react@18.3.1) + dev: true - react-router@6.11.0(react@18.3.1): + /react-router@6.11.0(react@18.3.1): + resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' dependencies: '@remix-run/router': 1.6.0 react: 18.3.1 + dev: true - react-tooltip@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + /react-tooltip@5.28.0(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' dependencies: - '@floating-ui/dom': 1.6.5 + '@floating-ui/dom': 1.6.10 classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) + dev: true - react@18.3.1: + /react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} dependencies: loose-envify: 1.4.0 + dev: true - read-pkg-up@9.1.0: + /read-pkg-up@9.1.0: + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: find-up: 6.3.0 read-pkg: 7.1.0 type-fest: 2.19.0 + dev: true - read-pkg@7.1.0: + /read-pkg@7.1.0: + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 2.19.0 + dev: true - readable-stream@2.3.8: + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9286,163 +7328,253 @@ snapshots: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-web-to-node-stream@3.0.2: + /readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} dependencies: readable-stream: 3.6.2 + dev: true - readdirp@3.6.0: + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 - rechoir@0.6.2: + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} dependencies: resolve: 1.22.8 + dev: true - recursive-readdir@2.2.3: + /recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} dependencies: minimatch: 3.1.2 + dev: true - redent@4.0.0: + /redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 + dev: true - reduce-flatten@2.0.0: {} + /reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + dev: true - regexp.prototype.flags@1.5.2: + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 + dev: true - release-zalgo@1.0.0: + /release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} dependencies: es6-error: 4.1.1 + dev: true - req-cwd@2.0.0: + /req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} dependencies: req-from: 2.0.0 + dev: true - req-from@2.0.0: + /req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} dependencies: resolve-from: 3.0.0 + dev: true - require-directory@2.1.1: {} + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} - require-from-string@2.0.2: {} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - require-main-filename@2.0.0: {} + /require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true - resolve-from@3.0.0: {} + /resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true - resolve-from@5.0.0: {} + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true - resolve-pkg-maps@1.0.0: {} + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true - resolve@1.1.7: {} + /resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + dev: true - resolve@1.17.0: + /resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} dependencies: path-parse: 1.0.7 - resolve@1.19.0: + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 + dev: true - resolve@1.22.8: + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true dependencies: - is-core-module: 2.13.1 + is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true - reusify@1.0.4: {} - - rimraf@2.7.1: - dependencies: - glob: 7.2.0 + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 + dev: true - ripemd160@2.0.2: + /ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} dependencies: hash-base: 3.1.0 inherits: 2.0.4 - rlp@2.2.7: + /rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true dependencies: bn.js: 5.2.1 - robust-predicates@3.0.2: {} + /robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + dev: true - rollup@4.18.0: + /rollup@4.21.0: + resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.18.0 - '@rollup/rollup-android-arm64': 4.18.0 - '@rollup/rollup-darwin-arm64': 4.18.0 - '@rollup/rollup-darwin-x64': 4.18.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 - '@rollup/rollup-linux-arm-musleabihf': 4.18.0 - '@rollup/rollup-linux-arm64-gnu': 4.18.0 - '@rollup/rollup-linux-arm64-musl': 4.18.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 - '@rollup/rollup-linux-riscv64-gnu': 4.18.0 - '@rollup/rollup-linux-s390x-gnu': 4.18.0 - '@rollup/rollup-linux-x64-gnu': 4.18.0 - '@rollup/rollup-linux-x64-musl': 4.18.0 - '@rollup/rollup-win32-arm64-msvc': 4.18.0 - '@rollup/rollup-win32-ia32-msvc': 4.18.0 - '@rollup/rollup-win32-x64-msvc': 4.18.0 + '@rollup/rollup-android-arm-eabi': 4.21.0 + '@rollup/rollup-android-arm64': 4.21.0 + '@rollup/rollup-darwin-arm64': 4.21.0 + '@rollup/rollup-darwin-x64': 4.21.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 + '@rollup/rollup-linux-arm-musleabihf': 4.21.0 + '@rollup/rollup-linux-arm64-gnu': 4.21.0 + '@rollup/rollup-linux-arm64-musl': 4.21.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 + '@rollup/rollup-linux-riscv64-gnu': 4.21.0 + '@rollup/rollup-linux-s390x-gnu': 4.21.0 + '@rollup/rollup-linux-x64-gnu': 4.21.0 + '@rollup/rollup-linux-x64-musl': 4.21.0 + '@rollup/rollup-win32-arm64-msvc': 4.21.0 + '@rollup/rollup-win32-ia32-msvc': 4.21.0 + '@rollup/rollup-win32-x64-msvc': 4.21.0 fsevents: 2.3.3 + dev: true - run-applescript@5.0.0: + /run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} dependencies: execa: 5.1.1 + dev: true - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true - rw@1.3.3: {} + /rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + dev: true - sade@1.8.1: + /sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} dependencies: mri: 1.2.0 + dev: true - safe-array-concat@1.1.2: + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 + dev: true - safe-buffer@5.1.2: {} + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.3: + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 + dev: true - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sc-istanbul@0.4.6: + /sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true dependencies: abbrev: 1.0.9 async: 1.5.2 @@ -9458,36 +7590,66 @@ snapshots: supports-color: 3.2.3 which: 1.3.1 wordwrap: 1.0.0 + dev: true - scheduler@0.23.2: + /scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} dependencies: loose-envify: 1.4.0 + dev: true - scrypt-js@3.0.1: {} + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} - secp256k1@4.0.3: + /secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + requiresBuild: true dependencies: - elliptic: 6.5.5 + elliptic: 6.5.7 node-addon-api: 2.0.2 node-gyp-build: 4.8.1 - semver@5.7.2: {} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true - semver@6.3.1: {} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true - semver@7.5.4: + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 + dev: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: true - semver@7.6.2: {} + /serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true - serialize-javascript@6.0.0: + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 - set-blocking@2.0.0: {} + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true - set-function-length@1.2.2: + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -9495,52 +7657,81 @@ snapshots: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 + dev: true - set-function-name@2.0.2: + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + dev: true - setimmediate@1.0.5: {} + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - setprototypeof@1.2.0: {} + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - sha.js@2.4.11: + /sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - sha1@1.1.1: + /sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} dependencies: charenc: 0.0.2 crypt: 0.0.2 + dev: true - shallowequal@1.1.0: {} + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: true - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true - shelljs@0.8.5: + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 + dev: true - side-channel@1.0.6: + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - object-inspect: 1.13.1 + object-inspect: 1.13.2 + dev: true - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true - sinon@14.0.2: + /sinon@14.0.2: + resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} + deprecated: 16.1.1 dependencies: '@sinonjs/commons': 2.0.0 '@sinonjs/fake-timers': 9.1.2 @@ -9548,34 +7739,49 @@ snapshots: diff: 5.2.0 nise: 5.1.9 supports-color: 7.2.0 + dev: true - sisteransi@1.0.5: {} + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true - slice-ansi@4.0.0: + /slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - solc@0.7.3(debug@4.3.5): + /solc@0.8.26(debug@4.3.6): + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true dependencies: command-exists: 1.2.9 - commander: 3.0.2 - follow-redirects: 1.15.6(debug@4.3.5) - fs-extra: 0.30.0 + commander: 8.3.0 + follow-redirects: 1.15.6(debug@4.3.6) js-sha3: 0.8.0 memorystream: 0.3.1 - require-from-string: 2.0.2 semver: 5.7.2 tmp: 0.0.33 transitivePeerDependencies: - debug - solidity-comments-extractor@0.0.7: {} + /solidity-comments-extractor@0.0.7: + resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + dev: true - solidity-coverage@0.8.12(hardhat@2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5)): + /solidity-coverage@0.8.12(hardhat@2.22.9): + resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -9586,33 +7792,46 @@ snapshots: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.5(ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5))(typescript@5.4.5) + hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) jsonschema: 1.4.1 lodash: 4.17.21 - mocha: 10.4.0 + mocha: 10.7.3 node-emoji: 1.11.0 pify: 4.0.1 recursive-readdir: 2.2.3 sc-istanbul: 0.4.6 - semver: 7.6.2 + semver: 7.6.3 shelljs: 0.8.5 web3-utils: 1.10.4 + dev: true - source-map-js@1.2.0: {} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: true - source-map-support@0.5.21: + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map@0.2.0: + /source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + requiresBuild: true dependencies: amdefine: 1.0.1 + dev: true optional: true - source-map@0.6.1: {} + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - spawn-wrap@2.0.0: + /spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} dependencies: foreground-child: 2.0.0 is-windows: 1.0.2 @@ -9620,189 +7839,301 @@ snapshots: rimraf: 3.0.2 signal-exit: 3.0.7 which: 2.0.2 + dev: true - spdx-correct@3.2.0: + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 + dev: true - spdx-exceptions@2.5.0: {} + /spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + dev: true - spdx-expression-parse@3.0.1: + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.18 + spdx-license-ids: 3.0.20 + dev: true - spdx-license-ids@3.0.18: {} + /spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + dev: true - split2@3.2.2: + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 + dev: false - sprintf-js@1.0.3: {} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true - stacktrace-parser@0.1.10: + /stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} dependencies: type-fest: 0.7.1 - statuses@2.0.1: {} + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} - string-argv@0.3.2: {} + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true - string-format@2.0.0: {} + /string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + dev: true - string-width@2.1.1: + /string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 + dev: true - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.trim@1.2.9: + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 + dev: true - string.prototype.trimend@1.0.8: + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: true - string.prototype.trimstart@1.0.8: + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 + dev: true - string_decoder@1.1.1: + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - strip-ansi@4.0.0: + /strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} dependencies: ansi-regex: 3.0.1 + dev: true - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - strip-bom@3.0.0: {} + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true - strip-bom@4.0.0: {} + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true - strip-final-newline@2.0.0: {} + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true - strip-final-newline@3.0.0: {} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true - strip-hex-prefix@1.0.0: + /strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} dependencies: is-hex-prefixed: 1.0.0 - strip-indent@4.0.0: + /strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} dependencies: min-indent: 1.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - strtok3@7.0.0: + /strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.0.0 + peek-readable: 5.1.4 + dev: true - styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): + /styled-components@5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/traverse': 7.24.7(supports-color@5.5.0) - '@emotion/is-prop-valid': 1.2.2 + '@babel/traverse': 7.25.4(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.24.7)(styled-components@5.3.10(@babel/core@7.24.7)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.10)(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 16.13.1 + react-is: 18.3.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: - '@babel/core' + dev: true - stylis@4.3.2: {} + /stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + dev: true - supports-color@3.2.3: + /supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} dependencies: has-flag: 1.0.0 + dev: true - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@8.1.1: + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true - sync-request@6.1.0: + /sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} dependencies: http-response-object: 3.0.2 sync-rpc: 1.3.6 then-request: 6.0.2 + dev: true - sync-rpc@1.3.6: + /sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} dependencies: get-port: 3.2.0 + dev: true - table-layout@1.0.2: + /table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} dependencies: array-back: 4.0.2 deep-extend: 0.6.0 typical: 5.2.0 wordwrapjs: 4.0.1 + dev: true - table@6.8.2: + /table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} dependencies: - ajv: 8.16.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 strip-ansi: 6.0.1 - tapable@2.2.1: {} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true - temp-dir@3.0.0: {} + /temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + dev: true - tempy@3.1.0: + /tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 type-fest: 2.19.0 unique-string: 3.0.0 + dev: true - test-exclude@6.0.0: + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 + dev: true - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - then-request@6.0.2: + /then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 @@ -9814,114 +8145,205 @@ snapshots: http-basic: 8.1.3 http-response-object: 3.0.2 promise: 8.3.0 - qs: 6.12.1 + qs: 6.13.0 + dev: true - through2@4.0.2: + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 + dev: false - titleize@3.0.0: {} + /titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + dev: true - tmp@0.0.33: + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 - to-fast-properties@2.0.0: {} + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - toidentifier@1.0.1: {} + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} - token-types@5.0.1: + /token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 + dev: true - trim-newlines@4.1.1: {} + /trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + dev: true - ts-command-line-args@2.5.1: + /ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true dependencies: chalk: 4.1.2 command-line-args: 5.2.1 command-line-usage: 6.1.3 string-format: 2.0.0 + dev: true - ts-dedent@2.2.0: {} + /ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true - ts-essentials@7.0.3(typescript@5.4.5): + /ts-essentials@7.0.3(typescript@5.5.4): + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' dependencies: - typescript: 5.4.5 + typescript: 5.5.4 + dev: true - ts-node@10.9.1(@types/node@18.19.36)(typescript@5.4.5): + /ts-node@10.9.1(@types/node@18.19.45)(typescript@5.5.4): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true 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.36 - acorn: 8.12.0 + '@types/node': 18.19.45 + acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.4.5 + typescript: 5.5.4 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfig-paths@3.15.0: + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: true - tslib@1.14.1: {} + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.4.0: {} + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tsort@0.0.1: {} + /tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} - tsutils@3.21.0(typescript@5.4.5): + /tsutils@3.21.0(typescript@5.5.4): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + 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' dependencies: tslib: 1.14.1 - typescript: 5.4.5 + typescript: 5.5.4 + dev: true - tweetnacl-util@0.15.1: {} + /tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} - tweetnacl@1.0.3: {} + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} - type-check@0.3.2: + /type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.1.2 + dev: true - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true - type-detect@4.0.8: {} + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: true - type-fest@0.20.2: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} - type-fest@0.21.3: {} + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} - type-fest@0.7.1: {} + /type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} - type-fest@0.8.1: {} + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true - type-fest@1.4.0: {} + /type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + dev: true - type-fest@2.19.0: {} + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: true - type-fest@3.13.1: {} + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + dev: true - typechain@8.3.2(typescript@5.4.5): + /typechain@8.3.2(typescript@5.5.4): + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' dependencies: '@types/prettier': 2.7.3 - debug: 4.3.5(supports-color@5.5.0) + debug: 4.3.6(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -9929,26 +8351,35 @@ snapshots: mkdirp: 1.0.4 prettier: 2.8.8 ts-command-line-args: 2.5.1 - ts-essentials: 7.0.3(typescript@5.4.5) - typescript: 5.4.5 + ts-essentials: 7.0.3(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - supports-color + dev: true - typed-array-buffer@1.0.2: + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 + dev: true - typed-array-byte-length@1.0.1: + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + dev: true - typed-array-byte-offset@1.0.2: + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -9956,8 +8387,11 @@ snapshots: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 + dev: true - typed-array-length@1.0.6: + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -9965,227 +8399,466 @@ snapshots: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 + dev: true - typedarray-to-buffer@3.1.5: + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: is-typedarray: 1.0.0 + dev: true - typedarray@0.0.6: {} + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true - typescript@5.3.3: {} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true - typescript@5.4.5: {} + /typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true - typical@4.0.0: {} + /typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + dev: true - typical@5.2.0: {} + /typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + dev: true - uglify-js@3.18.0: + /uglify-js@3.19.2: + resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true optional: true - unbox-primitive@1.0.2: + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 + dev: true - undici-types@5.26.5: {} + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.4: + /undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} dependencies: '@fastify/busboy': 2.1.1 - unique-string@3.0.0: + /unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} dependencies: crypto-random-string: 4.0.0 + dev: true - unist-util-stringify-position@3.0.3: + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 2.0.11 + dev: true - universalify@0.1.2: {} + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} - universalify@2.0.1: {} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} - unpipe@1.0.0: {} + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} - untildify@4.0.0: {} + /untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + dev: true - update-browserslist-db@1.0.16(browserslist@4.23.1): + /update-browserslist-db@1.1.0(browserslist@4.23.3): + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.1 + browserslist: 4.23.3 escalade: 3.1.2 picocolors: 1.0.1 + dev: true - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 + dev: true - utf8@3.0.0: {} + /utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + dev: true - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@8.3.2: {} + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true - uuid@9.0.1: {} + /uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + dev: true - uvu@0.5.6: + /uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true dependencies: dequal: 2.0.3 diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 + dev: true - v8-compile-cache-lib@3.0.1: {} + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - validate-npm-package-license@3.0.4: + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + dev: true - validator@13.12.0: {} + /validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + dev: true - viem@2.15.1(typescript@5.4.5): + /viem@2.20.0(typescript@5.0.4): + resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@adraffy/ens-normalize': 1.10.0 - '@noble/curves': 1.2.0 - '@noble/hashes': 1.3.2 - '@scure/bip32': 1.3.2 - '@scure/bip39': 1.2.1 - abitype: 1.0.0(typescript@5.4.5) + '@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) isows: 1.0.4(ws@8.17.1) + typescript: 5.0.4 + webauthn-p256: 0.0.5 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + /viem@2.20.0(typescript@5.5.4): + resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + 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) + isows: 1.0.4(ws@8.17.1) + typescript: 5.5.4 + webauthn-p256: 0.0.5 ws: 8.17.1 - optionalDependencies: - typescript: 5.4.5 transitivePeerDependencies: - bufferutil - utf-8-validate - zod + dev: true - vite-plugin-singlefile@2.0.1(rollup@4.18.0)(vite@5.3.1(@types/node@18.19.36)): + /vite-plugin-singlefile@2.0.2(rollup@4.21.0)(vite@5.4.2): + resolution: {integrity: sha512-Z2ou6HcvED5CF0hM+vcFSaFa+klyS8RyyLxW0PbMRLnMbvzTI6ueWyxdYNFhpuXZgz/aj6+E/dHFTdEcw6gb9w==} + engines: {node: '>18.0.0'} + peerDependencies: + rollup: ^4.18.0 + vite: ^5.3.1 dependencies: - micromatch: 4.0.7 - rollup: 4.18.0 - vite: 5.3.1(@types/node@18.19.36) + micromatch: 4.0.8 + rollup: 4.21.0 + vite: 5.4.2(@types/node@18.19.45) + dev: true - vite@5.3.1(@types/node@18.19.36): + /vite@5.4.2(@types/node@18.19.45): + resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true dependencies: + '@types/node': 18.19.45 esbuild: 0.21.5 - postcss: 8.4.38 - rollup: 4.18.0 + postcss: 8.4.41 + rollup: 4.21.0 optionalDependencies: - '@types/node': 18.19.36 fsevents: 2.3.3 + dev: true - web-worker@1.3.0: {} + /web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + dev: true - web3-utils@1.10.4: + /web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 - ethereum-bloom-filters: 1.1.0 - ethereum-cryptography: 2.2.0 + ethereum-bloom-filters: 1.2.0 + ethereum-cryptography: 2.2.1 ethjs-unit: 0.1.6 number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 + dev: true + + /webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 - which-boxed-primitive@1.0.2: + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 + dev: true - which-module@2.0.1: {} + /which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + dev: true - which-typed-array@1.1.15: + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 + dev: true - which@1.3.1: + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - widest-line@3.1.0: + /widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} dependencies: string-width: 4.2.3 - word-wrap@1.2.5: {} + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true - wordwrap@1.0.0: {} + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true - wordwrapjs@4.0.1: + /wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 + dev: true - workerpool@6.2.0: {} + /workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + dev: true - workerpool@6.2.1: {} + /workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} - wrap-ansi@6.2.0: + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 + dev: true - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@3.0.3: + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 + dev: true - ws@7.4.6: {} + /ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true - ws@7.5.10: {} + /ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - ws@8.17.1: {} + /ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true - y18n@4.0.3: {} + /y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true - y18n@5.0.8: {} + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - yallist@3.1.1: {} + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true - yargs-parser@18.1.3: + /yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} dependencies: camelcase: 5.3.1 decamelize: 1.2.0 + dev: true - yargs-parser@20.2.4: {} + /yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} - yargs-parser@21.1.1: {} + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: true - yargs-unparser@2.0.0: + /yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} dependencies: camelcase: 6.3.0 decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@15.4.1: + /yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -10198,8 +8871,11 @@ snapshots: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 + dev: true - yargs@16.2.0: + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -10209,16 +8885,27 @@ snapshots: y18n: 5.0.8 yargs-parser: 20.2.4 - yn@3.1.1: {} + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yocto-queue@1.0.0: {} + /yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + dev: true - z-schema@5.0.5: + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 validator: 13.12.0 optionalDependencies: commander: 9.5.0 + dev: true From cf2f50570a2c55017f277fad417ebe6b85624684 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 5 Sep 2024 21:59:50 -0400 Subject: [PATCH 1265/1302] fix lockfile --- pnpm-lock.yaml | 11060 ++++++++++++++++++++++++++--------------------- 1 file changed, 6179 insertions(+), 4881 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec8f82492c..bd727a9d1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: '6.0' +lockfileVersion: '9.0' settings: autoInstallPeers: true @@ -13,13 +13,13 @@ importers: version: 1.0.2(nyc@15.1.0) '@microsoft/api-extractor': specifier: 7.40.1 - version: 7.40.1(@types/node@18.19.45) + version: 7.40.1(@types/node@18.19.50) '@nomiclabs/eslint-plugin-hardhat-internal-rules': specifier: ^1.0.2 version: 1.0.2 '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 @@ -43,13 +43,13 @@ importers: version: 2.0.1 '@types/node': specifier: ^18.0.0 - version: 18.19.45 + version: 18.19.50 '@types/prompts': specifier: ^2.4.2 version: 2.4.9 '@typescript-eslint/eslint-plugin': specifier: ^5.57.1 - version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4) + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/experimental-utils': specifier: ^5.62.0 version: 5.62.0(eslint@8.57.0)(typescript@5.5.4) @@ -73,10 +73,10 @@ importers: version: 8.3.0(eslint@8.57.0) eslint-import-resolver-typescript: specifier: ^3.5.5 - version: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) + version: 3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0) eslint-plugin-import: specifier: 2.29.0 - version: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) + version: 2.29.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-mocha: specifier: ^9.0.0 version: 9.0.0(eslint@8.57.0) @@ -85,10 +85,10 @@ importers: version: 3.1.0 eslint-plugin-prettier: specifier: 4.0.0 - version: 4.0.0(eslint-config-prettier@8.3.0)(eslint@8.57.0)(prettier@2.8.8) + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8) hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) mocha: specifier: ^9.1.3 version: 9.2.2 @@ -109,7 +109,7 @@ importers: version: 14.0.2 ts-node: specifier: 10.9.1 - version: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) + version: 10.9.1(@types/node@18.19.50)(typescript@5.5.4) typescript: specifier: ^5.0.2 version: 5.5.4 @@ -121,10 +121,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -136,10 +136,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -151,10 +151,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -170,10 +170,10 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4) + version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -185,16 +185,16 @@ importers: version: link:../../packages/hardhat-plugin-viem '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.10 - version: 1.0.10(hardhat@2.22.9) + version: 1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-viem': specifier: 2.0.0 - version: 2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0) + version: 2.0.0(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typescript@5.5.4)(viem@2.21.2(typescript@5.5.4)) chai: specifier: 4.4.1 version: 4.4.1 hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) prettier-plugin-solidity: specifier: 1.1.3 version: 1.1.3(prettier@2.8.8) @@ -212,7 +212,7 @@ importers: version: 9.0.2 debug: specifier: ^4.3.2 - version: 4.3.6(supports-color@5.5.0) + version: 4.3.7(supports-color@5.5.0) ethers: specifier: ^6.7.0 version: 6.13.2 @@ -231,19 +231,19 @@ importers: devDependencies: '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) packages/hardhat-plugin: dependencies: '@nomicfoundation/hardhat-verify': specifier: ^2.0.1 - version: 2.0.9(hardhat@2.22.9) + version: 2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/ignition-core': specifier: workspace:^ version: link:../core @@ -255,7 +255,7 @@ importers: version: 4.1.2 debug: specifier: ^4.3.2 - version: 4.3.6(supports-color@5.5.0) + version: 4.3.7(supports-color@5.5.0) fs-extra: specifier: ^10.0.0 version: 10.1.0 @@ -268,10 +268,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-network-helpers': specifier: 1.0.9 - version: 1.0.9(hardhat@2.22.9) + version: 1.0.9(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -280,10 +280,10 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) viem: specifier: ^2.7.6 - version: 2.20.0(typescript@5.5.4) + version: 2.21.2(typescript@5.5.4) packages/hardhat-plugin-ethers: dependencies: @@ -299,10 +299,10 @@ importers: devDependencies: '@nomicfoundation/hardhat-ethers': specifier: ^3.0.4 - version: 3.0.7(ethers@6.13.2)(hardhat@2.22.9) + version: 3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -311,7 +311,7 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) packages/hardhat-plugin-viem: dependencies: @@ -323,14 +323,14 @@ importers: version: link:../core viem: specifier: ^2.7.6 - version: 2.20.0(typescript@5.0.4) + version: 2.21.2(typescript@5.5.4) devDependencies: '@nomicfoundation/hardhat-viem': specifier: ^2.0.0 - version: 2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0) + version: 2.0.0(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typescript@5.5.4)(viem@2.21.2(typescript@5.5.4)) '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.4 version: 7.1.8 @@ -339,7 +339,7 @@ importers: version: 10.0.20 hardhat: specifier: ^2.18.0 - version: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) + version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) packages/ui: devDependencies: @@ -351,13 +351,13 @@ importers: version: link:../core '@types/chai': specifier: ^4.2.22 - version: 4.3.17 + version: 4.3.19 '@types/chai-as-promised': specifier: ^7.1.5 version: 7.1.8 '@types/react': specifier: ^18.0.28 - version: 18.3.4 + version: 18.3.5 '@types/react-dom': specifier: ^18.0.11 version: 18.3.0 @@ -366,7 +366,7 @@ importers: version: 5.1.26 '@vitejs/plugin-react': specifier: ^4.0.0 - version: 4.3.1(vite@5.4.2) + version: 4.3.1(vite@5.4.3(@types/node@18.19.50)) eslint-plugin-react-hooks: specifier: ^4.6.0 version: 4.6.2(eslint@8.57.0) @@ -384,1119 +384,583 @@ importers: version: 18.3.1(react@18.3.1) react-router-dom: specifier: 6.11.0 - version: 6.11.0(react-dom@18.3.1)(react@18.3.1) + version: 6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react-tooltip: specifier: ^5.21.4 - version: 5.28.0(react-dom@18.3.1)(react@18.3.1) + version: 5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) styled-components: specifier: 5.3.10 - version: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) + version: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) vite: specifier: ^5.0.0 - version: 5.4.2(@types/node@18.19.45) + version: 5.4.3(@types/node@18.19.50) vite-plugin-singlefile: specifier: ^2.0.1 - version: 2.0.2(rollup@4.21.0)(vite@5.4.2) + version: 2.0.2(rollup@4.21.2)(vite@5.4.3(@types/node@18.19.50)) packages: - /@adraffy/ens-normalize@1.10.0: + '@adraffy/ens-normalize@1.10.0': resolution: {integrity: sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==} - /@adraffy/ens-normalize@1.10.1: + '@adraffy/ens-normalize@1.10.1': resolution: {integrity: sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==} - /@ampproject/remapping@2.3.0: + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@babel/code-frame@7.24.7: + '@babel/code-frame@7.24.7': resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 - dev: true - /@babel/compat-data@7.25.4: + '@babel/compat-data@7.25.4': resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/core@7.25.2: + '@babel/core@7.25.2': resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@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.4 - '@babel/template': 7.25.0 - '@babel/traverse': 7.25.4(supports-color@5.5.0) - '@babel/types': 7.25.4 - convert-source-map: 2.0.0 - debug: 4.3.6(supports-color@5.5.0) - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/generator@7.25.5: - resolution: {integrity: sha512-abd43wyLfbWoxC6ahM8xTkqLpGB2iWBVyuKC9/srhFunCd1SDNrV1s72bBpK4hLj8KLzHBBcOblvLQZBNw9r3w==} + '@babel/generator@7.25.6': + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.25.4 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - /@babel/helper-annotate-as-pure@7.24.7: + '@babel/helper-annotate-as-pure@7.24.7': resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.25.4 - dev: true - /@babel/helper-compilation-targets@7.25.2: + '@babel/helper-compilation-targets@7.25.2': resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.25.4 - '@babel/helper-validator-option': 7.24.8 - browserslist: 4.23.3 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - /@babel/helper-module-imports@7.24.7(supports-color@5.5.0): + '@babel/helper-module-imports@7.24.7': resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.25.4(supports-color@5.5.0) - '@babel/types': 7.25.4 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): + '@babel/helper-module-transforms@7.25.2': resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.4(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-plugin-utils@7.24.8: + '@babel/helper-plugin-utils@7.24.8': resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-simple-access@7.24.7: + '@babel/helper-simple-access@7.24.7': resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.25.4(supports-color@5.5.0) - '@babel/types': 7.25.4 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-string-parser@7.24.8: + '@babel/helper-string-parser@7.24.8': resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-identifier@7.24.7: + '@babel/helper-validator-identifier@7.24.7': resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helper-validator-option@7.24.8: + '@babel/helper-validator-option@7.24.8': resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==} engines: {node: '>=6.9.0'} - dev: true - /@babel/helpers@7.25.0: - resolution: {integrity: sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==} + '@babel/helpers@7.25.6': + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 - dev: true - /@babel/highlight@7.24.7: + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - dev: true - /@babel/parser@7.25.4: - resolution: {integrity: sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==} + '@babel/parser@7.25.6': + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} engines: {node: '>=6.0.0'} hasBin: true - dependencies: - '@babel/types': 7.25.4 - dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): + '@babel/plugin-syntax-jsx@7.24.7': resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - dev: true - /@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2): + '@babel/plugin-transform-react-jsx-self@7.24.7': resolution: {integrity: sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - dev: true - /@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2): + '@babel/plugin-transform-react-jsx-source@7.24.7': resolution: {integrity: sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.25.2 - '@babel/helper-plugin-utils': 7.24.8 - dev: true - /@babel/template@7.25.0: + '@babel/template@7.25.0': resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 - dev: true - /@babel/traverse@7.25.4(supports-color@5.5.0): - resolution: {integrity: sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==} + '@babel/traverse@7.25.6': + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.5 - '@babel/parser': 7.25.4 - '@babel/template': 7.25.0 - '@babel/types': 7.25.4 - debug: 4.3.6(supports-color@5.5.0) - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/types@7.25.4: - resolution: {integrity: sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==} + '@babel/types@7.25.6': + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.8 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 - dev: true - /@braintree/sanitize-url@6.0.4: + '@braintree/sanitize-url@6.0.4': resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} - dev: true - /@cspotcode/source-map-support@0.8.1: + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - /@emotion/is-prop-valid@1.3.0: + '@emotion/is-prop-valid@1.3.0': resolution: {integrity: sha512-SHetuSLvJDzuNbOdtPVbq6yMMMlLoW5Q94uDqJZqy50gcmAjxFkVqmzqSGEFq9gT2iMuIeKV1PXVWmvUhuZLlQ==} - dependencies: - '@emotion/memoize': 0.9.0 - dev: true - /@emotion/memoize@0.9.0: + '@emotion/memoize@0.9.0': resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} - dev: true - /@emotion/stylis@0.8.5: + '@emotion/stylis@0.8.5': resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} - dev: true - /@emotion/unitless@0.7.5: + '@emotion/unitless@0.7.5': resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - dev: true - /@esbuild/aix-ppc64@0.21.5: + '@esbuild/aix-ppc64@0.21.5': resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm64@0.21.5: + '@esbuild/android-arm64@0.21.5': resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.15.18: + '@esbuild/android-arm@0.15.18': resolution: {integrity: sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-arm@0.21.5: + '@esbuild/android-arm@0.21.5': resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} engines: {node: '>=12'} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/android-x64@0.21.5: + '@esbuild/android-x64@0.21.5': resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-arm64@0.21.5: + '@esbuild/darwin-arm64@0.21.5': resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/darwin-x64@0.21.5: + '@esbuild/darwin-x64@0.21.5': resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-arm64@0.21.5: + '@esbuild/freebsd-arm64@0.21.5': resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/freebsd-x64@0.21.5: + '@esbuild/freebsd-x64@0.21.5': resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm64@0.21.5: + '@esbuild/linux-arm64@0.21.5': resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-arm@0.21.5: + '@esbuild/linux-arm@0.21.5': resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ia32@0.21.5: + '@esbuild/linux-ia32@0.21.5': resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.15.18: + '@esbuild/linux-loong64@0.15.18': resolution: {integrity: sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-loong64@0.21.5: + '@esbuild/linux-loong64@0.21.5': resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} engines: {node: '>=12'} cpu: [loong64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-mips64el@0.21.5: + '@esbuild/linux-mips64el@0.21.5': resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-ppc64@0.21.5: + '@esbuild/linux-ppc64@0.21.5': resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-riscv64@0.21.5: + '@esbuild/linux-riscv64@0.21.5': resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-s390x@0.21.5: + '@esbuild/linux-s390x@0.21.5': resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/linux-x64@0.21.5: + '@esbuild/linux-x64@0.21.5': resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@esbuild/netbsd-x64@0.21.5: + '@esbuild/netbsd-x64@0.21.5': resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/openbsd-x64@0.21.5: + '@esbuild/openbsd-x64@0.21.5': resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /@esbuild/sunos-x64@0.21.5: + '@esbuild/sunos-x64@0.21.5': resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-arm64@0.21.5: + '@esbuild/win32-arm64@0.21.5': resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-ia32@0.21.5: + '@esbuild/win32-ia32@0.21.5': resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@esbuild/win32-x64@0.21.5: + '@esbuild/win32-x64@0.21.5': resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.11.0: + '@eslint-community/regexpp@4.11.0': resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - /@eslint/eslintrc@2.1.4: + '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.6(supports-color@5.5.0) - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - /@eslint/js@8.57.0: + '@eslint/js@8.57.0': resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@ethereumjs/rlp@4.0.1: + '@ethereumjs/rlp@4.0.1': resolution: {integrity: sha512-tqsQiBQDQdmPWE1xkkBq4rlSW5QZpLOUJ5RJh2/9fug+q9tnUhuZoVLk7s0scUIKTOzEtR72DFBXI4WiZcMpvw==} engines: {node: '>=14'} hasBin: true - dev: true - /@ethereumjs/util@8.1.0: + '@ethereumjs/util@8.1.0': resolution: {integrity: sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA==} engines: {node: '>=14'} - dependencies: - '@ethereumjs/rlp': 4.0.1 - ethereum-cryptography: 2.2.1 - micro-ftch: 0.3.1 - dev: true - /@ethersproject/abi@5.7.0: + '@ethersproject/abi@5.7.0': resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - /@ethersproject/abstract-provider@5.7.0: + '@ethersproject/abstract-provider@5.7.0': resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - /@ethersproject/abstract-signer@5.7.0: + '@ethersproject/abstract-signer@5.7.0': resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - /@ethersproject/address@5.6.1: + '@ethersproject/address@5.6.1': resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - /@ethersproject/address@5.7.0: + '@ethersproject/address@5.7.0': resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/rlp': 5.7.0 - /@ethersproject/base64@5.7.0: + '@ethersproject/base64@5.7.0': resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - /@ethersproject/basex@5.7.0: + '@ethersproject/basex@5.7.0': resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/properties': 5.7.0 - dev: true - /@ethersproject/bignumber@5.7.0: + '@ethersproject/bignumber@5.7.0': resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - bn.js: 5.2.1 - /@ethersproject/bytes@5.7.0: + '@ethersproject/bytes@5.7.0': resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} - dependencies: - '@ethersproject/logger': 5.7.0 - /@ethersproject/constants@5.7.0: + '@ethersproject/constants@5.7.0': resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - /@ethersproject/contracts@5.7.0: + '@ethersproject/contracts@5.7.0': resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/transactions': 5.7.0 - dev: true - /@ethersproject/hash@5.7.0: + '@ethersproject/hash@5.7.0': resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - /@ethersproject/hdnode@5.7.0: + '@ethersproject/hdnode@5.7.0': resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/json-wallets@5.7.0: + '@ethersproject/json-wallets@5.7.0': resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} - dependencies: - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/pbkdf2': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - aes-js: 3.0.0 - scrypt-js: 3.0.1 - dev: true - /@ethersproject/keccak256@5.7.0: + '@ethersproject/keccak256@5.7.0': resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - js-sha3: 0.8.0 - /@ethersproject/logger@5.7.0: + '@ethersproject/logger@5.7.0': resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} - /@ethersproject/networks@5.7.1: + '@ethersproject/networks@5.7.1': resolution: {integrity: sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==} - dependencies: - '@ethersproject/logger': 5.7.0 - /@ethersproject/pbkdf2@5.7.0: + '@ethersproject/pbkdf2@5.7.0': resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/sha2': 5.7.0 - dev: true - /@ethersproject/properties@5.7.0: + '@ethersproject/properties@5.7.0': resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} - dependencies: - '@ethersproject/logger': 5.7.0 - /@ethersproject/providers@5.7.2: + '@ethersproject/providers@5.7.2': resolution: {integrity: sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/base64': 5.7.0 - '@ethersproject/basex': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/networks': 5.7.1 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/web': 5.7.1 - bech32: 1.1.4 - ws: 7.4.6 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - dev: true - /@ethersproject/random@5.7.0: + '@ethersproject/random@5.7.0': resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/rlp@5.7.0: + '@ethersproject/rlp@5.7.0': resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - /@ethersproject/sha2@5.7.0: + '@ethersproject/sha2@5.7.0': resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - hash.js: 1.1.7 - dev: true - /@ethersproject/signing-key@5.7.0: + '@ethersproject/signing-key@5.7.0': resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - bn.js: 5.2.1 - elliptic: 6.5.4 - hash.js: 1.1.7 - /@ethersproject/solidity@5.7.0: + '@ethersproject/solidity@5.7.0': resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/sha2': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - /@ethersproject/strings@5.7.0: + '@ethersproject/strings@5.7.0': resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - /@ethersproject/transactions@5.7.0: + '@ethersproject/transactions@5.7.0': resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} - dependencies: - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/rlp': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - /@ethersproject/units@5.7.0: + '@ethersproject/units@5.7.0': resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} - dependencies: - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/constants': 5.7.0 - '@ethersproject/logger': 5.7.0 - dev: true - /@ethersproject/wallet@5.7.0: + '@ethersproject/wallet@5.7.0': resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} - dependencies: - '@ethersproject/abstract-provider': 5.7.0 - '@ethersproject/abstract-signer': 5.7.0 - '@ethersproject/address': 5.7.0 - '@ethersproject/bignumber': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/hdnode': 5.7.0 - '@ethersproject/json-wallets': 5.7.0 - '@ethersproject/keccak256': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/random': 5.7.0 - '@ethersproject/signing-key': 5.7.0 - '@ethersproject/transactions': 5.7.0 - '@ethersproject/wordlists': 5.7.0 - dev: true - /@ethersproject/web@5.7.1: + '@ethersproject/web@5.7.1': resolution: {integrity: sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==} - dependencies: - '@ethersproject/base64': 5.7.0 - '@ethersproject/bytes': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - /@ethersproject/wordlists@5.7.0: + '@ethersproject/wordlists@5.7.0': resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} - dependencies: - '@ethersproject/bytes': 5.7.0 - '@ethersproject/hash': 5.7.0 - '@ethersproject/logger': 5.7.0 - '@ethersproject/properties': 5.7.0 - '@ethersproject/strings': 5.7.0 - dev: true - /@fastify/busboy@2.1.1: + '@fastify/busboy@2.1.1': resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - /@floating-ui/core@1.6.7: + '@floating-ui/core@1.6.7': resolution: {integrity: sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==} - dependencies: - '@floating-ui/utils': 0.2.7 - dev: true - /@floating-ui/dom@1.6.10: + '@floating-ui/dom@1.6.10': resolution: {integrity: sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==} - dependencies: - '@floating-ui/core': 1.6.7 - '@floating-ui/utils': 0.2.7 - dev: true - /@floating-ui/utils@0.2.7: + '@floating-ui/utils@0.2.7': resolution: {integrity: sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==} - dev: true - /@fontsource/roboto@5.0.14: + '@fontsource/roboto@5.0.14': resolution: {integrity: sha512-zHAxlTTm9RuRn9/StwclFJChf3z9+fBrOxC3fw71htjHP1BgXNISwRjdJtAKAmMe5S2BzgpnjkQR93P9EZYI/Q==} - dev: true - /@humanwhocodes/config-array@0.11.14: + '@humanwhocodes/config-array@0.11.14': resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.6(supports-color@5.5.0) - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - dev: true - /@humanwhocodes/object-schema@2.0.3: + '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead - dev: true - /@istanbuljs/load-nyc-config@1.1.0: + '@istanbuljs/load-nyc-config@1.1.0': resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - /@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0): + '@istanbuljs/nyc-config-typescript@1.0.2': resolution: {integrity: sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==} engines: {node: '>=8'} peerDependencies: nyc: '>=15' - dependencies: - '@istanbuljs/schema': 0.1.3 - nyc: 15.1.0 - dev: true - /@istanbuljs/schema@0.1.3: + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - dev: true - /@jridgewell/gen-mapping@0.3.5: + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - /@jridgewell/set-array@1.2.1: + '@jridgewell/set-array@1.2.1': resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.5.0: + '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - /@jridgewell/trace-mapping@0.3.25: + '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - dev: true - /@jridgewell/trace-mapping@0.3.9: + '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - /@metamask/eth-sig-util@4.0.1: + '@metamask/eth-sig-util@4.0.1': resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} - dependencies: - ethereumjs-abi: 0.6.8 - ethereumjs-util: 6.2.1 - ethjs-util: 0.1.6 - tweetnacl: 1.0.3 - tweetnacl-util: 0.15.1 - /@microsoft/api-extractor-model@7.28.9(@types/node@18.19.45): + '@microsoft/api-extractor-model@7.28.9': resolution: {integrity: sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.19.45) - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/api-extractor@7.40.1(@types/node@18.19.45): + '@microsoft/api-extractor@7.40.1': resolution: {integrity: sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==} hasBin: true - dependencies: - '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.45) - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.66.0(@types/node@18.19.45) - '@rushstack/rig-package': 0.5.1 - '@rushstack/ts-command-line': 4.17.1 - colors: 1.2.5 - lodash: 4.17.21 - resolve: 1.22.8 - semver: 7.5.4 - source-map: 0.6.1 - typescript: 5.3.3 - transitivePeerDependencies: - - '@types/node' - dev: true - /@microsoft/tsdoc-config@0.16.2: + '@microsoft/tsdoc-config@0.16.2': resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - dev: true - /@microsoft/tsdoc@0.14.2: + '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: true - /@noble/curves@1.2.0: + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} - dependencies: - '@noble/hashes': 1.3.2 - /@noble/curves@1.4.0: + '@noble/curves@1.4.0': resolution: {integrity: sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==} - dependencies: - '@noble/hashes': 1.4.0 - /@noble/curves@1.4.2: + '@noble/curves@1.4.2': resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - dependencies: - '@noble/hashes': 1.4.0 - dev: true - /@noble/hashes@1.2.0: + '@noble/hashes@1.2.0': resolution: {integrity: sha512-FZfhjEDbT5GRswV3C6uvLPHMiVD6lQBmpoX5+eSiPaMTXte/IKqI5dykDxzZB/WBeK/CDuQRBWarPdi3FNY2zQ==} - /@noble/hashes@1.3.2: + '@noble/hashes@1.3.2': resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==} engines: {node: '>= 16'} - /@noble/hashes@1.4.0: + '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} - /@noble/secp256k1@1.7.1: + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@noble/secp256k1@1.7.1': resolution: {integrity: sha512-hOUk6AyBFmqVrv7k5WAw/LpszxVbj9gGN4JRkIX52fdFAj1UA61KXmZDvqVEm+pOyec3+fIeZB02LYa/pWOArw==} - /@nodelib/fs.scandir@2.1.5: + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: + '@nodelib/fs.stat@2.0.5': resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} - dev: true - /@nodelib/fs.walk@1.2.8: + '@nodelib/fs.walk@1.2.8': resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - dev: true - /@nomicfoundation/edr-darwin-arm64@0.5.2: + '@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.2: + '@nomicfoundation/edr-darwin-x64@0.5.2': resolution: {integrity: sha512-ClyABq2dFCsrYEED3/UIO0c7p4H1/4vvlswFlqUyBpOkJccr75qIYvahOSJRM62WgUFRhbSS0OJXFRwc/PwmVg==} engines: {node: '>= 18'} - /@nomicfoundation/edr-linux-arm64-gnu@0.5.2: + '@nomicfoundation/edr-linux-arm64-gnu@0.5.2': resolution: {integrity: sha512-HWMTVk1iOabfvU2RvrKLDgtFjJZTC42CpHiw2h6rfpsgRqMahvIlx2jdjWYzFNy1jZKPTN1AStQ/91MRrg5KnA==} engines: {node: '>= 18'} - /@nomicfoundation/edr-linux-arm64-musl@0.5.2: + '@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.2: + '@nomicfoundation/edr-linux-x64-gnu@0.5.2': resolution: {integrity: sha512-CWVCEdhWJ3fmUpzWHCRnC0/VLBDbqtqTGTR6yyY1Ep3S3BOrHEAvt7h5gx85r2vLcztisu2vlDq51auie4IU1A==} engines: {node: '>= 18'} - /@nomicfoundation/edr-linux-x64-musl@0.5.2: + '@nomicfoundation/edr-linux-x64-musl@0.5.2': resolution: {integrity: sha512-+aJDfwhkddy2pP5u1ISg3IZVAm0dO836tRlDTFWtvvSMQ5hRGqPcWwlsbobhDQsIxhPJyT7phL0orCg5W3WMeA==} engines: {node: '>= 18'} - /@nomicfoundation/edr-win32-x64-msvc@0.5.2: + '@nomicfoundation/edr-win32-x64-msvc@0.5.2': resolution: {integrity: sha512-CcvvuA3sAv7liFNPsIR/68YlH6rrybKzYttLlMr80d4GKJjwJ5OKb3YgE6FdZZnOfP19HEHhsLcE0DPLtY3r0w==} engines: {node: '>= 18'} - /@nomicfoundation/edr@0.5.2: + '@nomicfoundation/edr@0.5.2': resolution: {integrity: sha512-hW/iLvUQZNTVjFyX/I40rtKvvDOqUEyIi96T28YaLfmPL+3LW2lxmYLUXEJ6MI14HzqxDqrLyhf6IbjAa2r3Dw==} engines: {node: '>= 18'} - dependencies: - '@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-common@4.0.4: + '@nomicfoundation/ethereumjs-common@4.0.4': resolution: {integrity: sha512-9Rgb658lcWsjiicr5GzNCjI1llow/7r0k50dLL95OJ+6iZJcVbi15r3Y0xh2cIO+zgX0WIHcbzIu6FeQf9KPrg==} - dependencies: - '@nomicfoundation/ethereumjs-util': 9.0.4 - transitivePeerDependencies: - - c-kzg - /@nomicfoundation/ethereumjs-rlp@5.0.4: + '@nomicfoundation/ethereumjs-rlp@5.0.4': resolution: {integrity: sha512-8H1S3s8F6QueOc/X92SdrA4RDenpiAEqMg5vJH99kcQaCy/a3Q6fgseo75mgWlbanGJXSlAPtnCeG9jvfTYXlw==} engines: {node: '>=18'} hasBin: true - /@nomicfoundation/ethereumjs-tx@5.0.4: + '@nomicfoundation/ethereumjs-tx@5.0.4': resolution: {integrity: sha512-Xjv8wAKJGMrP1f0n2PeyfFCCojHd7iS3s/Ab7qzF1S64kxZ8Z22LCMynArYsVqiFx6rzYy548HNVEyI+AYN/kw==} engines: {node: '>=18'} peerDependencies: @@ -1504,13 +968,8 @@ packages: peerDependenciesMeta: c-kzg: optional: true - dependencies: - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - ethereum-cryptography: 0.1.3 - /@nomicfoundation/ethereumjs-util@9.0.4: + '@nomicfoundation/ethereumjs-util@9.0.4': resolution: {integrity: sha512-sLOzjnSrlx9Bb9EFNtHzK/FJFsfg2re6bsGqinFinH1gCqVfz9YYlXiMWwDM4C/L4ywuHFCYwfKTVr/QHQcU0Q==} engines: {node: '>=18'} peerDependencies: @@ -1518,61 +977,32 @@ packages: peerDependenciesMeta: c-kzg: optional: true - dependencies: - '@nomicfoundation/ethereumjs-rlp': 5.0.4 - ethereum-cryptography: 0.1.3 - /@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.7)(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.9): + '@nomicfoundation/hardhat-chai-matchers@2.0.7': resolution: {integrity: sha512-RQfsiTwdf0SP+DtuNYvm4921X6VirCQq0Xyh+mnuGlTwEFSPZ/o27oQC+l+3Y/l48DDU7+ZcYBR+Fp+Rp94LfQ==} peerDependencies: '@nomicfoundation/hardhat-ethers': ^3.0.0 chai: ^4.2.0 ethers: ^6.1.0 hardhat: ^2.9.4 - dependencies: - '@nomicfoundation/hardhat-ethers': 3.0.7(ethers@6.13.2)(hardhat@2.22.9) - '@types/chai-as-promised': 7.1.8 - chai: 4.4.1 - chai-as-promised: 7.1.1(chai@4.4.1) - deep-eql: 4.1.4 - ethers: 6.13.2 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - ordinal: 1.0.3 - dev: true - /@nomicfoundation/hardhat-ethers@3.0.7(ethers@6.13.2)(hardhat@2.22.9): - resolution: {integrity: sha512-pxLWpDiqC208shoz/lMbVFbxcVxE+qIs8qDrwdcubWH99UO1p6uwXakMa36ICRfB/IEToSLDJGSsKhwY84feCQ==} + '@nomicfoundation/hardhat-ethers@3.0.8': + resolution: {integrity: sha512-zhOZ4hdRORls31DTOqg+GmEZM0ujly8GGIuRY7t7szEk2zW/arY1qDug/py8AEktT00v5K+b6RvbVog+va51IA==} peerDependencies: ethers: ^6.1.0 - hardhat: ^2.22.92.0.0 - dependencies: - debug: 4.3.6(supports-color@5.5.0) - ethers: 6.13.2 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - lodash.isequal: 4.5.0 - transitivePeerDependencies: - - supports-color - dev: true + hardhat: ^2.0.0 - /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.9): + '@nomicfoundation/hardhat-network-helpers@1.0.10': resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==} peerDependencies: hardhat: ^2.9.5 - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - dev: true - /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.9): + '@nomicfoundation/hardhat-network-helpers@1.0.9': resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==} peerDependencies: hardhat: ^2.9.5 - dependencies: - ethereumjs-util: 7.1.5 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - dev: true - /@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7)(@nomicfoundation/hardhat-ethers@3.0.7)(@nomicfoundation/hardhat-network-helpers@1.0.10)(@nomicfoundation/hardhat-verify@2.0.9)(@typechain/ethers-v6@0.5.1)(@typechain/hardhat@9.1.0)(@types/chai@4.3.17)(@types/mocha@9.1.1)(@types/node@18.19.45)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10)(hardhat@2.22.9)(solidity-coverage@0.8.12)(ts-node@10.9.1)(typechain@8.3.2)(typescript@5.5.4): + '@nomicfoundation/hardhat-toolbox@4.0.0': resolution: {integrity: sha512-jhcWHp0aHaL0aDYj8IJl80v4SZXWMS1A2XxXa1CA6pBiFfJKuZinCkO6wb+POAt0LIfXB3gA3AgdcOccrcwBwA==} peerDependencies: '@nomicfoundation/hardhat-chai-matchers': ^2.0.0 @@ -1592,738 +1022,409 @@ packages: ts-node: '>=8.0.0' typechain: ^8.3.0 typescript: '>=4.5.0' - dependencies: - '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.7)(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.9) - '@nomicfoundation/hardhat-ethers': 3.0.7(ethers@6.13.2)(hardhat@2.22.9) - '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.9) - '@nomicfoundation/hardhat-verify': 2.0.9(hardhat@2.22.9) - '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) - '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.9)(typechain@8.3.2) - '@types/chai': 4.3.17 - '@types/mocha': 9.1.1 - '@types/node': 18.19.45 - chai: 4.4.1 - ethers: 6.13.2 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - hardhat-gas-reporter: 1.0.10(hardhat@2.22.9) - solidity-coverage: 0.8.12(hardhat@2.22.9) - ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - typescript: 5.5.4 - dev: true - /@nomicfoundation/hardhat-verify@2.0.9(hardhat@2.22.9): - resolution: {integrity: sha512-7kD8hu1+zlnX87gC+UN4S0HTKBnIsDfXZ/pproq1gYsK94hgCk+exvzXbwR0X2giiY/RZPkqY9oKRi0Uev91hQ==} + '@nomicfoundation/hardhat-verify@2.0.10': + resolution: {integrity: sha512-3zoTZGQhpeOm6piJDdsGb6euzZAd7N5Tk0zPQvGnfKQ0+AoxKz/7i4if12goi8IDTuUGElAUuZyQB8PMQoXA5g==} peerDependencies: - hardhat: ^2.22.72.0.4 - dependencies: - '@ethersproject/abi': 5.7.0 - '@ethersproject/address': 5.6.1 - cbor: 8.1.0 - chalk: 2.4.2 - debug: 4.3.6(supports-color@5.5.0) - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - lodash.clonedeep: 4.5.0 - semver: 6.3.1 - table: 6.8.2 - undici: 5.28.4 - transitivePeerDependencies: - - supports-color + hardhat: ^2.0.4 - /@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.9)(typescript@5.0.4)(viem@2.20.0): + '@nomicfoundation/hardhat-viem@2.0.0': resolution: {integrity: sha512-ilXQKTc1jWHqJ66fAN6TIyCRyormoChOn1yQTCGoBQ+G6QcVCu5FTaGL2r0KUOY4IkTohtphK+UXQrKcxQX5Yw==} peerDependencies: hardhat: ^2.17.0 typescript: ~5.0.0 viem: ^2.7.6 - dependencies: - abitype: 0.9.10(typescript@5.0.4) - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.0.4) - lodash.memoize: 4.1.2 - typescript: 5.0.4 - viem: 2.20.0(typescript@5.0.4) - transitivePeerDependencies: - - zod - dev: true - /@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2: + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2: + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': resolution: {integrity: sha512-fZNmVztrSXC03e9RONBT+CiksSeYcxI1wlzqyr0L7hsQlK1fzV+f04g2JtQ1c/Fe74ZwdV6aQBdd6Uwl1052sw==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2: + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': resolution: {integrity: sha512-3d54oc+9ZVBuB6nbp8wHylk4xh0N0Gc+bk+/uJae+rUgbOBwQSfuGIbAZt1wBXs5REkSmynEGcqx6DutoK0tPA==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2: + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': resolution: {integrity: sha512-iDJfR2qf55vgsg7BtJa7iPiFAsYf2d0Tv/0B+vhtnI16+wfQeTbP7teookbGvAo0eJo7aLLm0xfS/GTkvHIucA==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2: + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': resolution: {integrity: sha512-9dlHMAt5/2cpWyuJ9fQNOUXFB/vgSFORg1jpjX1Mh9hJ/MfZXlDdHQ+DpFCs32Zk5pxRBb07yGvSHk9/fezL+g==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2: + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': resolution: {integrity: sha512-GzzVeeJob3lfrSlDKQw2bRJ8rBf6mEYaWY+gW0JnTDHINA0s2gPR4km5RLIj1xeZZOYz4zRw+AEeYgLRqB2NXg==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2: + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': resolution: {integrity: sha512-Fdjli4DCcFHb4Zgsz0uEJXZ2K7VEO+w5KVv7HmT7WO10iODdU9csC2az4jrhEsRtiR9Gfd74FlG0NYlw1BMdyA==} engines: {node: '>= 12'} - requiresBuild: true - optional: true - /@nomicfoundation/solidity-analyzer@0.1.2: + '@nomicfoundation/solidity-analyzer@0.1.2': resolution: {integrity: sha512-q4n32/FNKIhQ3zQGGw5CvPF6GTvDCpYwIf7bEY/dZTZbgfDsHyjJwURxUJf3VQuuJj+fDIFl4+KkBVbw4Ef6jA==} engines: {node: '>= 12'} - optionalDependencies: - '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 - '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 - '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 - '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 - /@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2: + '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': resolution: {integrity: sha512-x0iaAQXCiDHZw+TEk2gnV7OdBI9OGBtAT5yYab3Bzpoiic4040TcUthEsysXLZTnIouSfZRh6PZh7tJV0dmo/A==} - dev: true - /@openzeppelin/contracts@5.0.2: + '@openzeppelin/contracts@5.0.2': resolution: {integrity: sha512-ytPc6eLGcHHnapAZ9S+5qsdomhjo6QBHTDRRBFfTxXIpsicMhVPouPgmUPebZZZGX7vt9USA+Z+0M0dSVtSUEA==} - dev: false - /@remix-run/router@1.6.0: + '@remix-run/router@1.6.0': resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} engines: {node: '>=14'} - dev: true - /@rollup/rollup-android-arm-eabi@4.21.0: - resolution: {integrity: sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==} + '@rollup/rollup-android-arm-eabi@4.21.2': + resolution: {integrity: sha512-fSuPrt0ZO8uXeS+xP3b+yYTCBUd05MoSp2N/MFOgjhhUhMmchXlpTQrTpI8T+YAwAQuK7MafsCOxW7VrPMrJcg==} cpu: [arm] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-android-arm64@4.21.0: - resolution: {integrity: sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==} + '@rollup/rollup-android-arm64@4.21.2': + resolution: {integrity: sha512-xGU5ZQmPlsjQS6tzTTGwMsnKUtu0WVbl0hYpTPauvbRAnmIvpInhJtgjj3mcuJpEiuUw4v1s4BimkdfDWlh7gA==} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-arm64@4.21.0: - resolution: {integrity: sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==} + '@rollup/rollup-darwin-arm64@4.21.2': + resolution: {integrity: sha512-99AhQ3/ZMxU7jw34Sq8brzXqWH/bMnf7ZVhvLk9QU2cOepbQSVTns6qoErJmSiAvU3InRqC2RRZ5ovh1KN0d0Q==} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-darwin-x64@4.21.0: - resolution: {integrity: sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==} + '@rollup/rollup-darwin-x64@4.21.2': + resolution: {integrity: sha512-ZbRaUvw2iN/y37x6dY50D8m2BnDbBjlnMPotDi/qITMJ4sIxNY33HArjikDyakhSv0+ybdUxhWxE6kTI4oX26w==} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.21.0: - resolution: {integrity: sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==} + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + resolution: {integrity: sha512-ztRJJMiE8nnU1YFcdbd9BcH6bGWG1z+jP+IPW2oDUAPxPjo9dverIOyXz76m6IPA6udEL12reYeLojzW2cYL7w==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm-musleabihf@4.21.0: - resolution: {integrity: sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==} + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + resolution: {integrity: sha512-flOcGHDZajGKYpLV0JNc0VFH361M7rnV1ee+NTeC/BQQ1/0pllYcFmxpagltANYt8FYf9+kL6RSk80Ziwyhr7w==} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-gnu@4.21.0: - resolution: {integrity: sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==} + '@rollup/rollup-linux-arm64-gnu@4.21.2': + resolution: {integrity: sha512-69CF19Kp3TdMopyteO/LJbWufOzqqXzkrv4L2sP8kfMaAQ6iwky7NoXTp7bD6/irKgknDKM0P9E/1l5XxVQAhw==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-arm64-musl@4.21.0: - resolution: {integrity: sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==} + '@rollup/rollup-linux-arm64-musl@4.21.2': + resolution: {integrity: sha512-48pD/fJkTiHAZTnZwR0VzHrao70/4MlzJrq0ZsILjLW/Ab/1XlVUStYyGt7tdyIiVSlGZbnliqmult/QGA2O2w==} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-powerpc64le-gnu@4.21.0: - resolution: {integrity: sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + resolution: {integrity: sha512-cZdyuInj0ofc7mAQpKcPR2a2iu4YM4FQfuUzCVA2u4HI95lCwzjoPtdWjdpDKyHxI0UO82bLDoOaLfpZ/wviyQ==} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-riscv64-gnu@4.21.0: - resolution: {integrity: sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==} + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + resolution: {integrity: sha512-RL56JMT6NwQ0lXIQmMIWr1SW28z4E4pOhRRNqwWZeXpRlykRIlEpSWdsgNWJbYBEWD84eocjSGDu/XxbYeCmwg==} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-s390x-gnu@4.21.0: - resolution: {integrity: sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==} + '@rollup/rollup-linux-s390x-gnu@4.21.2': + resolution: {integrity: sha512-PMxkrWS9z38bCr3rWvDFVGD6sFeZJw4iQlhrup7ReGmfn7Oukrr/zweLhYX6v2/8J6Cep9IEA/SmjXjCmSbrMQ==} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-gnu@4.21.0: - resolution: {integrity: sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==} + '@rollup/rollup-linux-x64-gnu@4.21.2': + resolution: {integrity: sha512-B90tYAUoLhU22olrafY3JQCFLnT3NglazdwkHyxNDYF/zAxJt5fJUB/yBoWFoIQ7SQj+KLe3iL4BhOMa9fzgpw==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-linux-x64-musl@4.21.0: - resolution: {integrity: sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==} + '@rollup/rollup-linux-x64-musl@4.21.2': + resolution: {integrity: sha512-7twFizNXudESmC9oneLGIUmoHiiLppz/Xs5uJQ4ShvE6234K0VB1/aJYU3f/4g7PhssLGKBVCC37uRkkOi8wjg==} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-arm64-msvc@4.21.0: - resolution: {integrity: sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==} + '@rollup/rollup-win32-arm64-msvc@4.21.2': + resolution: {integrity: sha512-9rRero0E7qTeYf6+rFh3AErTNU1VCQg2mn7CQcI44vNUWM9Ze7MSRS/9RFuSsox+vstRt97+x3sOhEey024FRQ==} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-ia32-msvc@4.21.0: - resolution: {integrity: sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==} + '@rollup/rollup-win32-ia32-msvc@4.21.2': + resolution: {integrity: sha512-5rA4vjlqgrpbFVVHX3qkrCo/fZTj1q0Xxpg+Z7yIo3J2AilW7t2+n6Q8Jrx+4MrYpAnjttTYF8rr7bP46BPzRw==} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rollup/rollup-win32-x64-msvc@4.21.0: - resolution: {integrity: sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==} + '@rollup/rollup-win32-x64-msvc@4.21.2': + resolution: {integrity: sha512-6UUxd0+SKomjdzuAcp+HAmxw1FlGBnl1v2yEPSabtx4lBfdXHDVsW7+lQkgz9cNFJGY3AWR7+V8P5BqkD9L9nA==} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /@rushstack/node-core-library@3.66.0(@types/node@18.19.45): + '@rushstack/node-core-library@3.66.0': resolution: {integrity: sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - dependencies: - '@types/node': 18.19.45 - colors: 1.2.5 - fs-extra: 7.0.1 - import-lazy: 4.0.0 - jju: 1.4.0 - resolve: 1.22.8 - semver: 7.5.4 - z-schema: 5.0.5 - dev: true - /@rushstack/rig-package@0.5.1: + '@rushstack/rig-package@0.5.1': resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} - dependencies: - resolve: 1.22.8 - strip-json-comments: 3.1.1 - dev: true - /@rushstack/ts-command-line@4.17.1: + '@rushstack/ts-command-line@4.17.1': resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - dev: true - /@scure/base@1.1.7: - resolution: {integrity: sha512-PPNYBslrLNNUQ/Yad37MHYsNQtK67EhWb6WtSvNLLPo7SdVZgkUjD6Dg+5On7zNwmskf8OX7I7Nx5oN+MIWE0g==} + '@scure/base@1.1.8': + resolution: {integrity: sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==} - /@scure/bip32@1.1.5: + '@scure/bip32@1.1.5': resolution: {integrity: sha512-XyNh1rB0SkEqd3tXcXMi+Xe1fvg+kUIcoRIEujP1Jgv7DqW2r9lg3Ah0NkFaCs9sTkQAQA8kw7xiRXzENi9Rtw==} - dependencies: - '@noble/hashes': 1.2.0 - '@noble/secp256k1': 1.7.1 - '@scure/base': 1.1.7 - /@scure/bip32@1.4.0: + '@scure/bip32@1.4.0': resolution: {integrity: sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==} - dependencies: - '@noble/curves': 1.4.0 - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 - /@scure/bip39@1.1.1: + '@scure/bip39@1.1.1': resolution: {integrity: sha512-t+wDck2rVkh65Hmv280fYdVdY25J9YeEUIgn2LG1WM6gxFkGzcksoDiUkWVpVp3Oex9xGC68JU2dSbUfwZ2jPg==} - dependencies: - '@noble/hashes': 1.2.0 - '@scure/base': 1.1.7 - /@scure/bip39@1.3.0: + '@scure/bip39@1.3.0': resolution: {integrity: sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==} - dependencies: - '@noble/hashes': 1.4.0 - '@scure/base': 1.1.7 - /@sentry/core@5.30.0: + '@scure/bip39@1.4.0': + resolution: {integrity: sha512-BEEm6p8IueV/ZTfQLp/0vhw4NPnT9oWf5+28nvmeUICjP99f4vr2d+qc7AVGDDtwRep6ifR43Yed9ERVmiITzw==} + + '@sentry/core@5.30.0': resolution: {integrity: sha512-TmfrII8w1PQZSZgPpUESqjB+jC6MvZJZdLtE/0hZ+SrnKhW3x5WlYLvTXZpcWePYBku7rl2wn1RZu6uT0qCTeg==} engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - /@sentry/hub@5.30.0: + '@sentry/hub@5.30.0': resolution: {integrity: sha512-2tYrGnzb1gKz2EkMDQcfLrDTvmGcQPuWxLnJKXJvYTQDGLlEvi2tWz1VIHjunmOvJrB5aIQLhm+dcMRwFZDCqQ==} engines: {node: '>=6'} - dependencies: - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - /@sentry/minimal@5.30.0: + '@sentry/minimal@5.30.0': resolution: {integrity: sha512-BwWb/owZKtkDX+Sc4zCSTNcvZUq7YcH3uAVlmh/gtR9rmUvbzAA3ewLuB3myi4wWRAMEtny6+J/FN/x+2wn9Xw==} engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/types': 5.30.0 - tslib: 1.14.1 - /@sentry/node@5.30.0: + '@sentry/node@5.30.0': resolution: {integrity: sha512-Br5oyVBF0fZo6ZS9bxbJZG4ApAjRqAnqFFurMVJJdunNb80brh7a5Qva2kjhm+U6r9NJAB5OmDyPkA1Qnt+QVg==} engines: {node: '>=6'} - dependencies: - '@sentry/core': 5.30.0 - '@sentry/hub': 5.30.0 - '@sentry/tracing': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - /@sentry/tracing@5.30.0: + '@sentry/tracing@5.30.0': resolution: {integrity: sha512-dUFowCr0AIMwiLD7Fs314Mdzcug+gBVo/+NCMyDw8tFxJkwWAKl7Qa2OZxLQ0ZHjakcj1hNKfCQJ9rhyfOl4Aw==} engines: {node: '>=6'} - dependencies: - '@sentry/hub': 5.30.0 - '@sentry/minimal': 5.30.0 - '@sentry/types': 5.30.0 - '@sentry/utils': 5.30.0 - tslib: 1.14.1 - /@sentry/types@5.30.0: + '@sentry/types@5.30.0': resolution: {integrity: sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw==} engines: {node: '>=6'} - /@sentry/utils@5.30.0: + '@sentry/utils@5.30.0': resolution: {integrity: sha512-zaYmoH0NWWtvnJjC9/CBseXMtKHm/tm40sz3YfJRxeQjyzRqNQPgivpd9R/oDJCYj999mzdW382p/qi2ypjLww==} engines: {node: '>=6'} - dependencies: - '@sentry/types': 5.30.0 - tslib: 1.14.1 - /@sinonjs/commons@1.8.6: + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} - dependencies: - type-detect: 4.0.8 - dev: true - /@sinonjs/commons@2.0.0: + '@sinonjs/commons@2.0.0': resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} - dependencies: - type-detect: 4.0.8 - dev: true - /@sinonjs/commons@3.0.1: + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 - dev: true - /@sinonjs/fake-timers@11.3.1: + '@sinonjs/fake-timers@11.3.1': resolution: {integrity: sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - /@sinonjs/fake-timers@9.1.2: + '@sinonjs/fake-timers@9.1.2': resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} - dependencies: - '@sinonjs/commons': 1.8.6 - dev: true - /@sinonjs/samsam@7.0.1: + '@sinonjs/samsam@7.0.1': resolution: {integrity: sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==} - dependencies: - '@sinonjs/commons': 2.0.0 - lodash.get: 4.4.2 - type-detect: 4.1.0 - dev: true - /@sinonjs/text-encoding@0.7.3: + '@sinonjs/text-encoding@0.7.3': resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} - dev: true - /@solidity-parser/parser@0.14.5: + '@solidity-parser/parser@0.14.5': resolution: {integrity: sha512-6dKnHZn7fg/iQATVEzqyUOyEidbn05q7YA2mQ9hC0MMXhhV3/JrsxmFSYZAcr7j1yUP700LLhTruvJ3MiQmjJg==} - dependencies: - antlr4ts: 0.5.0-alpha.4 - dev: true - /@solidity-parser/parser@0.16.2: + '@solidity-parser/parser@0.16.2': resolution: {integrity: sha512-PI9NfoA3P8XK2VBkK5oIfRgKDsicwDZfkVq9ZTBCQYGOP1N2owgY2dyLGyU5/J/hQs8KRk55kdmvTLjy3Mu3vg==} - dependencies: - antlr4ts: 0.5.0-alpha.4 - dev: true - /@solidity-parser/parser@0.18.0: + '@solidity-parser/parser@0.18.0': resolution: {integrity: sha512-yfORGUIPgLck41qyN7nbwJRAx17/jAIXCTanHOJZhB6PJ1iAk/84b/xlsVKFSyNyLXIj0dhppoE0+CRws7wlzA==} - dev: true - /@tokenizer/token@0.3.0: + '@tokenizer/token@0.3.0': resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} - dev: true - /@tsconfig/node10@1.0.11: + '@tsconfig/node10@1.0.11': resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} - /@tsconfig/node12@1.0.11: + '@tsconfig/node12@1.0.11': resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - /@tsconfig/node14@1.0.3: + '@tsconfig/node14@1.0.3': resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - /@tsconfig/node16@1.0.4: + '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - /@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4): + '@typechain/ethers-v6@0.5.1': resolution: {integrity: sha512-F+GklO8jBWlsaVV+9oHaPh5NJdd6rAKN4tklGfInX1Q7h0xPgVLP39Jl3eCulPB5qexI71ZFHwbljx4ZXNfouA==} peerDependencies: ethers: 6.x typechain: ^8.3.2 typescript: '>=4.7.0' - dependencies: - ethers: 6.13.2 - lodash: 4.17.21 - ts-essentials: 7.0.3(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - typescript: 5.5.4 - dev: true - /@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1)(ethers@6.13.2)(hardhat@2.22.9)(typechain@8.3.2): + '@typechain/hardhat@9.1.0': resolution: {integrity: sha512-mtaUlzLlkqTlfPwB3FORdejqBskSnh+Jl8AIJGjXNAQfRQ4ofHADPl1+oU7Z3pAJzmZbUXII8MhOLQltcHgKnA==} peerDependencies: '@typechain/ethers-v6': ^0.5.1 ethers: ^6.1.0 hardhat: ^2.9.9 typechain: ^8.3.2 - dependencies: - '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2)(typescript@5.5.4) - ethers: 6.13.2 - fs-extra: 9.1.0 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - typechain: 8.3.2(typescript@5.5.4) - dev: true - /@types/argparse@1.0.38: + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: true - /@types/babel__core@7.20.5: + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - dev: true - /@types/babel__generator@7.6.8: + '@types/babel__generator@7.6.8': resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.25.4 - dev: true - /@types/babel__template@7.4.4: + '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.25.4 - '@babel/types': 7.25.4 - dev: true - /@types/babel__traverse@7.20.6: + '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - dependencies: - '@babel/types': 7.25.4 - dev: true - /@types/bn.js@4.11.6: + '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} - dependencies: - '@types/node': 18.19.45 - /@types/bn.js@5.1.5: + '@types/bn.js@5.1.5': resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - dependencies: - '@types/node': 18.19.45 - /@types/chai-as-promised@7.1.8: + '@types/chai-as-promised@7.1.8': resolution: {integrity: sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw==} - dependencies: - '@types/chai': 4.3.17 - dev: true - /@types/chai@4.3.17: - resolution: {integrity: sha512-zmZ21EWzR71B4Sscphjief5djsLre50M6lI622OSySTmn9DB3j+C3kWroHfBQWXbOBwbgg/M8CG/hUxDLIloow==} - dev: true + '@types/chai@4.3.19': + resolution: {integrity: sha512-2hHHvQBVE2FiSK4eN0Br6snX9MtolHaTo/batnLjlGRhoQzlCL61iVpxoqO7SfFyOw+P/pwv+0zNHzKoGWz9Cw==} - /@types/concat-stream@1.6.1: + '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} - dependencies: - '@types/node': 18.19.45 - dev: true - /@types/d3-scale-chromatic@3.0.3: + '@types/d3-scale-chromatic@3.0.3': resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - dev: true - /@types/d3-scale@4.0.8: + '@types/d3-scale@4.0.8': resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - dependencies: - '@types/d3-time': 3.0.3 - dev: true - /@types/d3-time@3.0.3: + '@types/d3-time@3.0.3': resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - dev: true - /@types/debug@4.1.12: + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - dependencies: - '@types/ms': 0.7.34 - dev: true - /@types/estree@1.0.5: + '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true - /@types/form-data@0.0.33: + '@types/form-data@0.0.33': resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==} - dependencies: - '@types/node': 18.19.45 - dev: true - /@types/fs-extra@9.0.13: + '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} - dependencies: - '@types/node': 18.19.45 - dev: true - /@types/glob@7.2.0: + '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} - dependencies: - '@types/minimatch': 5.1.2 - '@types/node': 18.19.45 - dev: true - /@types/hoist-non-react-statics@3.3.5: + '@types/hoist-non-react-statics@3.3.5': resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} - dependencies: - '@types/react': 18.3.4 - hoist-non-react-statics: 3.3.2 - dev: true - /@types/json-schema@7.0.15: + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - /@types/json5@0.0.29: + '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - dev: true - /@types/lodash.flattendeep@4.4.9: + '@types/lodash.flattendeep@4.4.9': resolution: {integrity: sha512-Oacs/ZMuMvVWkhMqvj+Spad457Beln5pnkauif+6s65fE2cSL7J7NoMfwkxjuQsOsr4DUCDH/iDbmuZo81Nypw==} - dependencies: - '@types/lodash': 4.14.189 - dev: true - /@types/lodash@4.14.189: + '@types/lodash@4.14.189': resolution: {integrity: sha512-kb9/98N6X8gyME9Cf7YaqIMvYGnBSWqEci6tiettE6iJWH1XdJz/PO8LB0GtLCG7x8dU3KWhZT+lA1a35127tA==} - dev: true - /@types/lru-cache@5.1.1: + '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} - /@types/mdast@3.0.15: + '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - dependencies: - '@types/unist': 2.0.11 - dev: true - /@types/minimatch@5.1.2: + '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} - dev: true - /@types/minimist@1.2.5: + '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true - /@types/mocha@9.1.1: + '@types/mocha@9.1.1': resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - dev: true - /@types/ms@0.7.34: + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true - /@types/ndjson@2.0.1: + '@types/ndjson@2.0.1': resolution: {integrity: sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==} - dependencies: - '@types/node': 18.19.45 - '@types/through': 0.0.33 - dev: true - /@types/node@10.17.60: + '@types/node@10.17.60': resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} - dev: true - /@types/node@18.15.13: + '@types/node@18.15.13': resolution: {integrity: sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==} - /@types/node@18.19.45: - resolution: {integrity: sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==} - dependencies: - undici-types: 5.26.5 + '@types/node@18.19.50': + resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} - /@types/node@8.10.66: + '@types/node@8.10.66': resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} - dev: true - /@types/normalize-package-data@2.4.4: + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true - /@types/pbkdf2@3.1.2: + '@types/pbkdf2@3.1.2': resolution: {integrity: sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==} - dependencies: - '@types/node': 18.19.45 - /@types/prettier@2.7.3: + '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} - dev: true - /@types/prompts@2.4.9: + '@types/prompts@2.4.9': resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - dependencies: - '@types/node': 18.19.45 - kleur: 3.0.3 - dev: true - /@types/prop-types@15.7.12: + '@types/prop-types@15.7.12': resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} - dev: true - /@types/qs@6.9.15: + '@types/qs@6.9.15': resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} - dev: true - /@types/react-dom@18.3.0: + '@types/react-dom@18.3.0': resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - dependencies: - '@types/react': 18.3.4 - dev: true - /@types/react@18.3.4: - resolution: {integrity: sha512-J7W30FTdfCxDDjmfRM+/JqLHBIyl7xUIp9kwK637FGmY7+mkSFSe6L4jpZzhj5QMfLssSDP4/i75AKkrdC7/Jw==} - dependencies: - '@types/prop-types': 15.7.12 - csstype: 3.1.3 - dev: true + '@types/react@18.3.5': + resolution: {integrity: sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==} - /@types/secp256k1@4.0.6: + '@types/secp256k1@4.0.6': resolution: {integrity: sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==} - dependencies: - '@types/node': 18.19.45 - /@types/semver@7.5.8: + '@types/semver@7.5.8': resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - /@types/sinon@10.0.20: + '@types/sinon@10.0.20': resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} - dependencies: - '@types/sinonjs__fake-timers': 8.1.5 - dev: true - /@types/sinonjs__fake-timers@8.1.5: + '@types/sinonjs__fake-timers@8.1.5': resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} - dev: true - /@types/styled-components@5.1.26: + '@types/styled-components@5.1.26': resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} - dependencies: - '@types/hoist-non-react-statics': 3.3.5 - '@types/react': 18.3.4 - csstype: 3.1.3 - dev: true - /@types/through@0.0.33: + '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} - dependencies: - '@types/node': 18.19.45 - dev: true - /@types/unist@2.0.11: + '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - dev: true - /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.57.0)(typescript@5.5.4): + '@typescript-eslint/eslint-plugin@5.62.0': resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2333,38 +1434,14 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6(supports-color@5.5.0) - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + '@typescript-eslint/experimental-utils@5.62.0': resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - eslint: 8.57.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4): + '@typescript-eslint/parser@5.62.0': resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2373,26 +1450,12 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - debug: 4.3.6(supports-color@5.5.0) - eslint: 8.57.0 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/scope-manager@5.62.0: + '@typescript-eslint/scope-manager@5.62.0': resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - /@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + '@typescript-eslint/type-utils@5.62.0': resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2401,23 +1464,12 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.6(supports-color@5.5.0) - eslint: 8.57.0 - tsutils: 3.21.0(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/types@5.62.0: + '@typescript-eslint/types@5.62.0': resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4): + '@typescript-eslint/typescript-estree@5.62.0': resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -2425,76 +1477,33 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.6(supports-color@5.5.0) - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@5.5.4) - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4): + '@typescript-eslint/utils@5.62.0': resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/visitor-keys@5.62.0: + '@typescript-eslint/visitor-keys@5.62.0': resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@ungap/promise-all-settled@1.1.2: + '@ungap/promise-all-settled@1.1.2': resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - dev: true - /@ungap/structured-clone@1.2.0: + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - /@vitejs/plugin-react@4.3.1(vite@5.4.2): + '@vitejs/plugin-react@4.3.1': resolution: {integrity: sha512-m/V2syj5CuVnaxcUJOQRel/Wr31FFXRFlnOoq1TVtkCxsY5veGMTEmpWHndrhB2U8ScHtCQB1e+4hWYExQc6Lg==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.25.2 - '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) - '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.2 - vite: 5.4.2(@types/node@18.19.45) - transitivePeerDependencies: - - supports-color - dev: true - /abbrev@1.0.9: + abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} - dev: true - /abitype@0.9.10(typescript@5.0.4): + abitype@0.9.10: resolution: {integrity: sha512-FIS7U4n7qwAT58KibwYig5iFG4K61rbhAqaQh/UWj8v1Y8mjX3F8TC9gd8cz9yT1TYel9f8nS5NO5kZp2RW0jQ==} peerDependencies: typescript: '>=5.0.4' @@ -2504,24 +1513,8 @@ packages: optional: true zod: optional: true - dependencies: - typescript: 5.0.4 - dev: true - - /abitype@1.0.5(typescript@5.0.4): - resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} - peerDependencies: - typescript: '>=5.0.4' - zod: ^3 >=3.22.0 - peerDependenciesMeta: - typescript: - optional: true - zod: - optional: true - dependencies: - typescript: 5.0.4 - /abitype@1.0.5(typescript@5.5.4): + abitype@1.0.5: resolution: {integrity: sha512-YzDhti7cjlfaBhHutMaboYB21Ha3rXR9QTkNJFzYC4kC8YclaiwPBBBJY8ejFdu2wnJeZCVZSMlQJ7fi8S6hsw==} peerDependencies: typescript: '>=5.0.4' @@ -2531,1141 +1524,648 @@ packages: optional: true zod: optional: true - dependencies: - typescript: 5.5.4 - dev: true - /acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.12.1 - dev: true - /acorn-walk@8.3.3: + acorn-walk@8.3.3: resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} engines: {node: '>=0.4.0'} - dependencies: - acorn: 8.12.1 - /acorn@8.12.1: + acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - /adm-zip@0.4.16: + adm-zip@0.4.16: resolution: {integrity: sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==} engines: {node: '>=0.3.0'} - /aes-js@3.0.0: + aes-js@3.0.0: resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} - dev: true - /aes-js@4.0.0-beta.5: + aes-js@4.0.0-beta.5: resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==} - /agent-base@6.0.2: + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.6(supports-color@5.5.0) - transitivePeerDependencies: - - supports-color - /aggregate-error@3.1.0: + aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - /ajv@6.12.6: + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ajv@8.17.1: + ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.1 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - /amdefine@1.0.1: + amdefine@1.0.1: resolution: {integrity: sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==} engines: {node: '>=0.4.2'} - requiresBuild: true - dev: true - optional: true - /ansi-align@3.0.1: + ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - dependencies: - string-width: 4.2.3 - /ansi-colors@4.1.1: + ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} - dev: true - /ansi-colors@4.1.3: + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - /ansi-escapes@4.3.2: + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - /ansi-regex@3.0.1: + ansi-regex@3.0.1: resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} engines: {node: '>=4'} - dev: true - /ansi-regex@5.0.1: + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - /ansi-styles@3.2.1: + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - /ansi-styles@4.3.0: + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - /antlr4ts@0.5.0-alpha.4: + antlr4ts@0.5.0-alpha.4: resolution: {integrity: sha512-WPQDt1B74OfPv/IMS2ekXAKkTZIHl88uMetg6q3OTqgFxZ/dxDXI0EWLyZid/1Pe6hTftyg5N7gel5wNAGxXyQ==} - dev: true - /anymatch@3.1.3: + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - /append-transform@2.0.0: + append-transform@2.0.0: resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} engines: {node: '>=8'} - dependencies: - default-require-extensions: 3.0.1 - dev: true - /archy@1.0.0: + archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: true - /arg@4.1.3: + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - /argparse@1.0.10: + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - dev: true - /argparse@2.0.1: + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - /array-back@3.1.0: + array-back@3.1.0: resolution: {integrity: sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==} engines: {node: '>=6'} - dev: true - /array-back@4.0.2: + array-back@4.0.2: resolution: {integrity: sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==} engines: {node: '>=8'} - dev: true - /array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.1: resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - dev: true - /array-includes@3.1.8: + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - dev: true - /array-union@2.1.0: + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - dev: true - /array-uniq@1.0.3: + array-uniq@1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} - dev: true - /array.prototype.findlastindex@1.2.5: + array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flat@1.3.2: + array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.2: resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice@1.0.3: + arraybuffer.prototype.slice@1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - dev: true - /arrify@1.0.1: + arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - dev: true - /asap@2.0.6: + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true - /assertion-error@1.1.0: + assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - dev: true - /astral-regex@2.0.0: + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - /async@1.5.2: + async@1.5.2: resolution: {integrity: sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==} - dev: true - /asynckit@0.4.0: + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true - /at-least-node@1.0.0: + at-least-node@1.0.0: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - dev: true - /available-typed-arrays@1.0.7: + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - dependencies: - possible-typed-array-names: 1.0.0 - dev: true - /axios@1.7.5: - resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} - dependencies: - follow-redirects: 1.15.6(debug@4.3.6) - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: true + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} - /babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.10)(supports-color@5.5.0): + babel-plugin-styled-components@2.1.4: resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} peerDependencies: styled-components: '>= 2' - dependencies: - '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) - lodash: 4.17.21 - picomatch: 2.3.1 - styled-components: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1) - transitivePeerDependencies: - - '@babel/core' - - supports-color - dev: true - /balanced-match@1.0.2: + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /base-x@3.0.10: + base-x@3.0.10: resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} - dependencies: - safe-buffer: 5.2.1 - /bech32@1.1.4: + bech32@1.1.4: resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} - dev: true - /big-integer@1.6.52: + big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - dev: true - /binary-extensions@2.3.0: + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - /blakejs@1.2.1: + blakejs@1.2.1: resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==} - /bn.js@4.11.6: + bn.js@4.11.6: resolution: {integrity: sha512-XWwnNNFCuuSQ0m3r3C4LE3EiORltHd9M05pq6FOlVeiophzRbMo50Sbz1ehl8K3Z+jw9+vmgnXefY1hz8X+2wA==} - dev: true - /bn.js@4.12.0: + bn.js@4.12.0: resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==} - /bn.js@5.2.1: + bn.js@5.2.1: resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - /boxen@5.1.2: + boxen@5.1.2: resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==} engines: {node: '>=10'} - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 2.2.1 - string-width: 4.2.3 - type-fest: 0.20.2 - widest-line: 3.1.0 - wrap-ansi: 7.0.0 - /bplist-parser@0.2.0: + bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.52 - dev: true - /brace-expansion@1.1.11: + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - /brace-expansion@2.0.1: + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - /braces@3.0.3: + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - dependencies: - fill-range: 7.1.1 - /brorand@1.1.0: + brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} - /browser-stdout@1.3.1: + browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - /browserify-aes@1.2.0: + browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} - dependencies: - buffer-xor: 1.0.3 - cipher-base: 1.0.4 - create-hash: 1.2.0 - evp_bytestokey: 1.0.3 - inherits: 2.0.4 - safe-buffer: 5.2.1 - /browserslist@4.23.3: + browserslist@4.23.3: resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - dependencies: - caniuse-lite: 1.0.30001651 - electron-to-chromium: 1.5.13 - node-releases: 2.0.18 - update-browserslist-db: 1.1.0(browserslist@4.23.3) - dev: true - /bs58@4.0.1: + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - dependencies: - base-x: 3.0.10 - /bs58check@2.1.2: + bs58check@2.1.2: resolution: {integrity: sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA==} - dependencies: - bs58: 4.0.1 - create-hash: 1.2.0 - safe-buffer: 5.2.1 - /buffer-from@1.1.2: + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - /buffer-xor@1.0.3: + buffer-xor@1.0.3: resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==} - /bundle-name@3.0.0: + bundle-name@3.0.0: resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: true - /bytes@3.1.2: + bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} - /caching-transform@4.0.0: + caching-transform@4.0.0: resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} engines: {node: '>=8'} - dependencies: - hasha: 5.2.2 - make-dir: 3.1.0 - package-hash: 4.0.0 - write-file-atomic: 3.0.3 - dev: true - /call-bind@1.0.7: + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - dev: true - /callsites@3.1.0: + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - dev: true - /camelcase-keys@8.0.2: + camelcase-keys@8.0.2: resolution: {integrity: sha512-qMKdlOfsjlezMqxkUGGMaWWs17i2HoL15tM+wtx8ld4nLrUwU58TFdvyGOz/piNP842KeO8yXvggVQSdQ828NA==} engines: {node: '>=14.16'} - dependencies: - camelcase: 7.0.1 - map-obj: 4.3.0 - quick-lru: 6.1.2 - type-fest: 2.19.0 - dev: true - /camelcase@5.3.1: + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - dev: true - /camelcase@6.3.0: + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - /camelcase@7.0.1: + camelcase@7.0.1: resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} engines: {node: '>=14.16'} - dev: true - /camelize@1.0.1: + camelize@1.0.1: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} - dev: true - /caniuse-lite@1.0.30001651: - resolution: {integrity: sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==} - dev: true + caniuse-lite@1.0.30001657: + resolution: {integrity: sha512-DPbJAlP8/BAXy3IgiWmZKItubb3TYGP0WscQQlVGIfT4s/YlFYVuJgyOsQNP7rJRChx/qdMeLJQJP0Sgg2yjNA==} - /caseless@0.12.0: + caseless@0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} - dev: true - /cbor@8.1.0: + cbor@8.1.0: resolution: {integrity: sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==} engines: {node: '>=12.19'} - dependencies: - nofilter: 3.1.0 - /cbor@9.0.2: + cbor@9.0.2: resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} engines: {node: '>=16'} - dependencies: - nofilter: 3.1.0 - dev: false - /chai-as-promised@7.1.1(chai@4.4.1): + chai-as-promised@7.1.1: resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} peerDependencies: chai: '>= 2.1.2 < 5' - dependencies: - chai: 4.4.1 - check-error: 1.0.3 - dev: true - /chai@4.4.1: + chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} - dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.1.0 - dev: true - /chalk@2.4.2: + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - /chalk@4.1.2: + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - /character-entities@2.0.2: + character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - dev: true - /charenc@0.0.2: + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - dev: true - /check-error@1.0.3: + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - dependencies: - get-func-name: 2.0.2 - dev: true - /chokidar@3.5.3: + chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - dev: true - /chokidar@3.6.0: + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - /ci-info@2.0.0: + ci-info@2.0.0: resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - /cipher-base@1.0.4: + cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} - dependencies: - inherits: 2.0.4 - safe-buffer: 5.2.1 - /classnames@2.5.1: + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} - dev: true - /clean-stack@2.2.0: + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} - /cli-boxes@2.2.1: + cli-boxes@2.2.1: resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} engines: {node: '>=6'} - /cli-table3@0.5.1: + cli-table3@0.5.1: resolution: {integrity: sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==} engines: {node: '>=6'} - dependencies: - object-assign: 4.1.1 - string-width: 2.1.1 - optionalDependencies: - colors: 1.4.0 - dev: true - /cliui@6.0.0: + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 6.2.0 - dev: true - /cliui@7.0.4: + cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - /color-convert@1.9.3: + color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - /color-convert@2.0.1: + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - /color-name@1.1.3: + color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - /color-name@1.1.4: + color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - /colors@1.2.5: + colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} engines: {node: '>=0.1.90'} - dev: true - /colors@1.4.0: + colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} - dev: true - /combined-stream@1.0.8: + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: true - /command-exists@1.2.9: + command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} - /command-line-args@5.2.1: + command-line-args@5.2.1: resolution: {integrity: sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==} engines: {node: '>=4.0.0'} - dependencies: - array-back: 3.1.0 - find-replace: 3.0.0 - lodash.camelcase: 4.3.0 - typical: 4.0.0 - dev: true - /command-line-usage@6.1.3: + command-line-usage@6.1.3: resolution: {integrity: sha512-sH5ZSPr+7UStsloltmDh7Ce5fb8XPlHyoPzTpyyMuYCtervL65+ubVZ6Q61cFtFl62UyJlc8/JwERRbAFPUqgw==} engines: {node: '>=8.0.0'} - dependencies: - array-back: 4.0.2 - chalk: 2.4.2 - table-layout: 1.0.2 - typical: 5.2.0 - dev: true - /commander@7.2.0: + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} - dev: true - /commander@8.3.0: + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - /commander@9.5.0: + commander@9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} - requiresBuild: true - dev: true - optional: true - /commondir@1.0.1: + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} - dev: true - /concat-map@0.0.1: + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - /concat-stream@1.6.2: + concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - dev: true - /convert-source-map@1.9.0: + convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: true - /convert-source-map@2.0.0: + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - /cookie@0.4.2: + cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} - /core-util-is@1.0.3: + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: true - /cose-base@1.0.3: + cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - dependencies: - layout-base: 1.0.2 - dev: true - /create-hash@1.2.0: + create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} - dependencies: - cipher-base: 1.0.4 - inherits: 2.0.4 - md5.js: 1.3.5 - ripemd160: 2.0.2 - sha.js: 2.4.11 - /create-hmac@1.1.7: + create-hmac@1.1.7: resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==} - dependencies: - cipher-base: 1.0.4 - create-hash: 1.2.0 - inherits: 2.0.4 - ripemd160: 2.0.2 - safe-buffer: 5.2.1 - sha.js: 2.4.11 - /create-require@1.1.1: + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - /cross-spawn@7.0.3: + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - /crypt@0.0.2: + crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - dev: true - /crypto-random-string@4.0.0: + crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} - dependencies: - type-fest: 1.4.0 - dev: true - /css-color-keywords@1.0.0: + css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} - dev: true - /css-to-react-native@3.2.0: + css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} - dependencies: - camelize: 1.0.1 - css-color-keywords: 1.0.0 - postcss-value-parser: 4.2.0 - dev: true - /csstype@3.1.3: + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true - /cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.2): + cytoscape-cose-bilkent@4.1.0: resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} peerDependencies: cytoscape: ^3.2.0 - dependencies: - cose-base: 1.0.3 - cytoscape: 3.30.2 - dev: true - /cytoscape@3.30.2: + cytoscape@3.30.2: resolution: {integrity: sha512-oICxQsjW8uSaRmn4UK/jkczKOqTrVqt5/1WL0POiJUT2EKNc9STM4hYFHv917yu55aTBMFNRzymlJhVAiWPCxw==} engines: {node: '>=0.10'} - dev: true - /d3-array@2.12.1: + d3-array@2.12.1: resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - dependencies: - internmap: 1.0.1 - dev: true - /d3-array@3.2.4: + d3-array@3.2.4: resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} engines: {node: '>=12'} - dependencies: - internmap: 2.0.3 - dev: true - /d3-axis@3.0.0: + d3-axis@3.0.0: resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} engines: {node: '>=12'} - dev: true - /d3-brush@3.0.0: + d3-brush@3.0.0: resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: true - /d3-chord@3.0.1: + d3-chord@3.0.1: resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: true - /d3-color@3.1.0: + d3-color@3.1.0: resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} engines: {node: '>=12'} - dev: true - /d3-contour@4.0.2: + d3-contour@4.0.2: resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: true - /d3-delaunay@6.0.4: + d3-delaunay@6.0.4: resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} engines: {node: '>=12'} - dependencies: - delaunator: 5.0.1 - dev: true - /d3-dispatch@3.0.1: + d3-dispatch@3.0.1: resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} engines: {node: '>=12'} - dev: true - /d3-drag@3.0.0: + d3-drag@3.0.0: resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - dev: true - /d3-dsv@3.0.1: + d3-dsv@3.0.1: resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} engines: {node: '>=12'} hasBin: true - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - dev: true - /d3-ease@3.0.1: + d3-ease@3.0.1: resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} engines: {node: '>=12'} - dev: true - /d3-fetch@3.0.1: + d3-fetch@3.0.1: resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} engines: {node: '>=12'} - dependencies: - d3-dsv: 3.0.1 - dev: true - /d3-force@3.0.0: + d3-force@3.0.0: resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - dev: true - /d3-format@3.1.0: + d3-format@3.1.0: resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} engines: {node: '>=12'} - dev: true - /d3-geo@3.1.1: + d3-geo@3.1.1: resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: true - /d3-hierarchy@3.1.2: + d3-hierarchy@3.1.2: resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} engines: {node: '>=12'} - dev: true - /d3-interpolate@3.0.1: + d3-interpolate@3.0.1: resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - dev: true - /d3-path@1.0.9: + d3-path@1.0.9: resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - dev: true - /d3-path@3.1.0: + d3-path@3.1.0: resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} engines: {node: '>=12'} - dev: true - /d3-polygon@3.0.1: + d3-polygon@3.0.1: resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} engines: {node: '>=12'} - dev: true - /d3-quadtree@3.0.1: + d3-quadtree@3.0.1: resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} engines: {node: '>=12'} - dev: true - /d3-random@3.0.1: + d3-random@3.0.1: resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} engines: {node: '>=12'} - dev: true - /d3-sankey@0.12.3: + d3-sankey@0.12.3: resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - dev: true - /d3-scale-chromatic@3.1.0: + d3-scale-chromatic@3.1.0: resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} engines: {node: '>=12'} - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - dev: true - /d3-scale@4.0.2: + d3-scale@4.0.2: resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - dev: true - /d3-selection@3.0.0: + d3-selection@3.0.0: resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} engines: {node: '>=12'} - dev: true - /d3-shape@1.3.7: + d3-shape@1.3.7: resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - dependencies: - d3-path: 1.0.9 - dev: true - /d3-shape@3.2.0: + d3-shape@3.2.0: resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} engines: {node: '>=12'} - dependencies: - d3-path: 3.1.0 - dev: true - /d3-time-format@4.1.0: + d3-time-format@4.1.0: resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} engines: {node: '>=12'} - dependencies: - d3-time: 3.1.0 - dev: true - /d3-time@3.1.0: + d3-time@3.1.0: resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - dev: true - /d3-timer@3.0.1: + d3-timer@3.0.1: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} - dev: true - /d3-transition@3.0.1(d3-selection@3.0.0): + d3-transition@3.0.1: resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} engines: {node: '>=12'} peerDependencies: d3-selection: 2 - 3 - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - dev: true - /d3-zoom@3.0.0: + d3-zoom@3.0.0: resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} engines: {node: '>=12'} - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - dev: true - /d3@7.9.0: + d3@7.9.0: resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} engines: {node: '>=12'} - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.1 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.1.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - dev: true - /dagre-d3-es@7.0.10: + dagre-d3-es@7.0.10: resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - dev: true - /data-view-buffer@1.0.1: + data-view-buffer@1.0.1: resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true - /data-view-byte-length@1.0.1: + data-view-byte-length@1.0.1: resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true - /data-view-byte-offset@1.0.0: + data-view-byte-offset@1.0.0: resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - dev: true - /dayjs@1.11.13: + dayjs@1.11.13: resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - dev: true - /death@1.1.0: + death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} - dev: true - /debug@3.2.7: + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.3 - dev: true - /debug@4.3.3(supports-color@8.1.1): + debug@4.3.3: resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} engines: {node: '>=6.0'} peerDependencies: @@ -3673,658 +2173,346 @@ packages: peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - dev: true - - /debug@4.3.6(supports-color@5.5.0): - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - supports-color: 5.5.0 - /debug@4.3.6(supports-color@8.1.1): - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' peerDependenciesMeta: supports-color: optional: true - dependencies: - ms: 2.1.2 - supports-color: 8.1.1 - /decamelize-keys@1.1.1: + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} - dependencies: - decamelize: 1.2.0 - map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: + decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - dev: true - /decamelize@4.0.0: + decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} - /decamelize@6.0.0: + decamelize@6.0.0: resolution: {integrity: sha512-Fv96DCsdOgB6mdGl67MT5JaTNKRzrzill5OH5s8bjYJXVlcXyPYGyPsUkWyGV5p1TXI5esYIYMMeDJL0hEIwaA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /decode-named-character-reference@1.0.2: + decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - dependencies: - character-entities: 2.0.2 - dev: true - /deep-eql@4.1.4: + deep-eql@4.1.4: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - dependencies: - type-detect: 4.1.0 - dev: true - /deep-extend@0.6.0: + deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: true - /deep-is@0.1.4: + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /default-browser-id@3.0.0: + default-browser-id@3.0.0: resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: true - /default-browser@4.0.0: + default-browser@4.0.0: resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - dev: true - /default-require-extensions@3.0.1: + default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} - dependencies: - strip-bom: 4.0.0 - dev: true - /define-data-property@1.1.4: + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - dev: true - /define-lazy-prop@3.0.0: + define-lazy-prop@3.0.0: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - dev: true - /define-properties@1.2.1: + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - dev: true - /delaunator@5.0.1: + delaunator@5.0.1: resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} - dependencies: - robust-predicates: 3.0.2 - dev: true - /delayed-stream@1.0.0: + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true - /depd@2.0.0: + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - /dequal@2.0.3: + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true - /diff@4.0.2: + diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - /diff@5.0.0: + diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} - dev: true - /diff@5.2.0: + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} - /difflib@0.2.4: + difflib@0.2.4: resolution: {integrity: sha512-9YVwmMb0wQHQNr5J9m6BSj6fk4pfGITGQOOs+D9Fl+INODWFOfvhIU1hNv6GgR1RBoC/9NJcwu77zShxV0kT7w==} - dependencies: - heap: 0.2.7 - dev: true - /dir-glob@3.0.1: + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - /doctrine@2.1.0: + doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dependencies: - esutils: 2.0.3 - dev: true - /doctrine@3.0.0: + doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - /dompurify@3.1.6: + dompurify@3.1.6: resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} - dev: true - /electron-to-chromium@1.5.13: - resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==} - dev: true + electron-to-chromium@1.5.15: + resolution: {integrity: sha512-Z4rIDoImwEJW+YYKnPul4DzqsWVqYetYVN3XqDmRpgV0mjz0hYTaeeh+8/9CL1bk3AHYmF4freW/NTiVoXA2gA==} - /elkjs@0.9.3: + elkjs@0.9.3: resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} - dev: true - /elliptic@6.5.4: + elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - /elliptic@6.5.7: + elliptic@6.5.7: resolution: {integrity: sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==} - dependencies: - bn.js: 4.12.0 - brorand: 1.1.0 - hash.js: 1.1.7 - hmac-drbg: 1.0.1 - inherits: 2.0.4 - minimalistic-assert: 1.0.1 - minimalistic-crypto-utils: 1.0.1 - /emoji-regex@8.0.0: + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - /enhanced-resolve@5.17.1: + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /enquirer@2.4.1: + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - /env-paths@2.2.1: + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - /error-ex@1.3.2: + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - dev: true - /es-abstract@1.23.3: + es-abstract@1.23.3: resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} engines: {node: '>= 0.4'} - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - dev: true - /es-define-property@1.0.0: + es-define-property@1.0.0: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - dev: true - /es-object-atoms@1.0.0: + es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} - dependencies: - es-errors: 1.3.0 - dev: true - /es-set-tostringtag@2.0.3: + es-set-tostringtag@2.0.3: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - dev: true - /es-shim-unscopables@1.0.2: + es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - dependencies: - hasown: 2.0.2 - dev: true - /es-to-primitive@1.2.1: + es-to-primitive@1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - dev: true - /es6-error@4.1.1: + es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - dev: true - /esbuild-android-64@0.15.18: + esbuild-android-64@0.15.18: resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} cpu: [x64] os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-android-arm64@0.15.18: + esbuild-android-arm64@0.15.18: resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} engines: {node: '>=12'} cpu: [arm64] os: [android] - requiresBuild: true - dev: true - optional: true - /esbuild-darwin-64@0.15.18: + esbuild-darwin-64@0.15.18: resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /esbuild-darwin-arm64@0.15.18: + esbuild-darwin-arm64@0.15.18: resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - requiresBuild: true - dev: true - optional: true - /esbuild-freebsd-64@0.15.18: + esbuild-freebsd-64@0.15.18: resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /esbuild-freebsd-arm64@0.15.18: + esbuild-freebsd-arm64@0.15.18: resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-32@0.15.18: + esbuild-linux-32@0.15.18: resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-64@0.15.18: + esbuild-linux-64@0.15.18: resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} engines: {node: '>=12'} cpu: [x64] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-arm64@0.15.18: + esbuild-linux-arm64@0.15.18: resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-arm@0.15.18: + esbuild-linux-arm@0.15.18: resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} engines: {node: '>=12'} cpu: [arm] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-mips64le@0.15.18: + esbuild-linux-mips64le@0.15.18: resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-ppc64le@0.15.18: + esbuild-linux-ppc64le@0.15.18: resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-riscv64@0.15.18: + esbuild-linux-riscv64@0.15.18: resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-linux-s390x@0.15.18: + esbuild-linux-s390x@0.15.18: resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - requiresBuild: true - dev: true - optional: true - /esbuild-netbsd-64@0.15.18: + esbuild-netbsd-64@0.15.18: resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - requiresBuild: true - dev: true - optional: true - /esbuild-openbsd-64@0.15.18: + esbuild-openbsd-64@0.15.18: resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - requiresBuild: true - dev: true - optional: true - /esbuild-sunos-64@0.15.18: + esbuild-sunos-64@0.15.18: resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-32@0.15.18: + esbuild-windows-32@0.15.18: resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-64@0.15.18: + esbuild-windows-64@0.15.18: resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} engines: {node: '>=12'} cpu: [x64] os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild-windows-arm64@0.15.18: + esbuild-windows-arm64@0.15.18: resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - requiresBuild: true - dev: true - optional: true - /esbuild@0.15.18: + esbuild@0.15.18: resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.15.18 - '@esbuild/linux-loong64': 0.15.18 - esbuild-android-64: 0.15.18 - esbuild-android-arm64: 0.15.18 - esbuild-darwin-64: 0.15.18 - esbuild-darwin-arm64: 0.15.18 - esbuild-freebsd-64: 0.15.18 - esbuild-freebsd-arm64: 0.15.18 - esbuild-linux-32: 0.15.18 - esbuild-linux-64: 0.15.18 - esbuild-linux-arm: 0.15.18 - esbuild-linux-arm64: 0.15.18 - esbuild-linux-mips64le: 0.15.18 - esbuild-linux-ppc64le: 0.15.18 - esbuild-linux-riscv64: 0.15.18 - esbuild-linux-s390x: 0.15.18 - esbuild-netbsd-64: 0.15.18 - esbuild-openbsd-64: 0.15.18 - esbuild-sunos-64: 0.15.18 - esbuild-windows-32: 0.15.18 - esbuild-windows-64: 0.15.18 - esbuild-windows-arm64: 0.15.18 - dev: true - /esbuild@0.21.5: + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} hasBin: true - requiresBuild: true - 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 - dev: true - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - /escape-string-regexp@1.0.5: + escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - /escape-string-regexp@4.0.0: + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - /escodegen@1.8.1: + escodegen@1.8.1: resolution: {integrity: sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==} engines: {node: '>=0.12.0'} hasBin: true - dependencies: - esprima: 2.7.3 - estraverse: 1.9.3 - esutils: 2.0.3 - optionator: 0.8.3 - optionalDependencies: - source-map: 0.2.0 - dev: true - /eslint-config-prettier@8.3.0(eslint@8.57.0): + eslint-config-prettier@8.3.0: resolution: {integrity: sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew==} hasBin: true peerDependencies: eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - dev: true - /eslint-import-resolver-node@0.3.9: + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0): - 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: '*' - dependencies: - debug: 4.3.6(supports-color@5.5.0) - enhanced-resolve: 5.17.1 - eslint: 8.57.0 - eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - fast-glob: 3.3.2 - get-tsconfig: 4.7.6 - is-core-module: 2.15.1 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - dev: true + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true - /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + eslint-module-utils@2.10.0: + resolution: {integrity: sha512-/AXiipjFyfLIUj3E4FR5NEGWoGDZHDfcGzWZkwobRc8fwqUAcy9owTk2LIKwNmtYL8Ad9/XfjSXbGHZ9AJWDEg==} engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' @@ -4343,17 +2531,8 @@ packages: optional: true eslint-import-resolver-webpack: optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.0)(eslint@8.57.0) - transitivePeerDependencies: - - supports-color - dev: true - /eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0): + eslint-plugin-import@2.29.0: resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} engines: {node: '>=4'} peerDependencies: @@ -4362,49 +2541,18 @@ packages: peerDependenciesMeta: '@typescript-eslint/parser': optional: true - dependencies: - '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - 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.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - dev: true - /eslint-plugin-mocha@9.0.0(eslint@8.57.0): + eslint-plugin-mocha@9.0.0: resolution: {integrity: sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==} engines: {node: '>=12.0.0'} peerDependencies: eslint: '>=7.0.0' - dependencies: - eslint: 8.57.0 - eslint-utils: 3.0.0(eslint@8.57.0) - ramda: 0.27.2 - dev: true - /eslint-plugin-no-only-tests@3.1.0: + eslint-plugin-no-only-tests@3.1.0: resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} engines: {node: '>=5.0.0'} - dev: true - /eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0)(eslint@8.57.0)(prettier@2.8.8): + eslint-plugin-prettier@4.0.0: resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -4414,70 +2562,4906 @@ packages: peerDependenciesMeta: eslint-config-prettier: optional: true - dependencies: - eslint: 8.57.0 - eslint-config-prettier: 8.3.0(eslint@8.57.0) - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - dev: true - /eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + eslint-plugin-react-hooks@4.6.2: resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.57.0 - dev: true - /eslint-plugin-react-refresh@0.3.5(eslint@8.57.0): + eslint-plugin-react-refresh@0.3.5: resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} peerDependencies: eslint: '>=7' - dependencies: - eslint: 8.57.0 - dev: true - /eslint-scope@5.1.1: + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: + eslint-scope@7.2.2: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - /eslint-utils@3.0.0(eslint@8.57.0): + eslint-utils@3.0.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' - dependencies: - eslint: 8.57.0 - eslint-visitor-keys: 2.1.0 - dev: true - /eslint-visitor-keys@2.1.0: + eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - dev: true - /eslint-visitor-keys@3.4.3: + eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@2.7.3: + resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} + engines: {node: '>=0.10.0'} + hasBin: true + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eth-gas-reporter@0.2.27: + resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} + peerDependencies: + '@codechecks/client': ^0.1.0 + peerDependenciesMeta: + '@codechecks/client': + optional: true + + ethereum-bloom-filters@1.2.0: + resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + + ethereum-cryptography@0.1.3: + resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + + ethereum-cryptography@1.2.0: + resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + + ethereum-cryptography@2.2.1: + resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + + ethereumjs-abi@0.6.8: + resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + + ethereumjs-util@6.2.1: + resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + + ethereumjs-util@7.1.5: + resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} + engines: {node: '>=10.0.0'} + + ethers@5.7.2: + resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + + ethers@6.13.2: + resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} + engines: {node: '>=14.0.0'} + + ethjs-unit@0.1.6: + resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} + engines: {node: '>=6.5.0', npm: '>=3'} + + ethjs-util@0.1.6: + resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} + engines: {node: '>=6.5.0', npm: '>=3'} + + evp_bytestokey@1.0.3: + resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@7.2.0: + resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} + engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-uri@3.0.1: + resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-type@18.7.0: + resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} + engines: {node: '>=14.16'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + + find-replace@3.0.0: + resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} + engines: {node: '>=4.0.0'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + follow-redirects@1.15.8: + resolution: {integrity: sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + + form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + fp-ts@1.19.3: + resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-readdir-recursive@1.1.0: + resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@3.2.0: + resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} + engines: {node: '>=4'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.0: + resolution: {integrity: sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==} + + ghost-testrpc@0.0.2: + resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} + hasBin: true + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.1.7: + resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-modules@2.0.0: + resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} + engines: {node: '>=6'} + + global-prefix@3.0.0: + resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} + engines: {node: '>=6'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@10.0.2: + resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + hardhat-gas-reporter@1.0.10: + resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} + peerDependencies: + hardhat: ^2.0.2 + + hardhat@2.22.10: + resolution: {integrity: sha512-JRUDdiystjniAvBGFmJRsiIZSOP2/6s++8xRDe3TzLeQXlWWHsXBrd9wd3JWFyKXvgMqMeLL5Sz/oNxXKYw9vg==} + hasBin: true + peerDependencies: + ts-node: '*' + typescript: '*' + peerDependenciesMeta: + ts-node: + optional: true + typescript: + optional: true + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@1.0.0: + resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hash-base@3.1.0: + resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} + engines: {node: '>=4'} + + hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + heap@0.2.7: + resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} + + hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + hosted-git-info@5.2.1: + resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-basic@8.1.3: + resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} + engines: {node: '>=6.0.0'} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-response-object@3.0.2: + resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@4.3.1: + resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} + engines: {node: '>=14.18.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + immer@10.0.2: + resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + io-ts@1.10.4: + resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + 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.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-hex-prefixed@1.0.0: + resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} + engines: {node: '>=6.5.0', npm: '>=3'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isows@1.0.4: + resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} + peerDependencies: + ws: '*' + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + + istanbul-lib-instrument@4.0.3: + resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} + engines: {node: '>=8'} + + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonschema@1.4.1: + resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} + + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + + levn@0.3.0: + resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} + engines: {node: '>= 0.8.0'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-table@1.1.3: + resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} + + md5.js@1.3.5: + resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + memorystream@0.3.1: + resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} + engines: {node: '>= 0.10.0'} + + meow@11.0.0: + resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} + engines: {node: '>=14.16'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + mermaid@10.8.0: + resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} + + micro-ftch@0.3.1: + resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + + minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.38.5: + resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + + mocha@10.7.3: + resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} + engines: {node: '>= 14.0.0'} + hasBin: true + + mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + ndjson@2.0.0: + resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} + engines: {node: '>=10'} + hasBin: true + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nise@5.1.9: + resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + hasBin: true + + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + nofilter@3.1.0: + resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} + engines: {node: '>=12.19'} + + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + + nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-package-data@4.0.1: + resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + number-to-bn@1.7.0: + resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} + engines: {node: '>=6.5.0', npm: '>=3'} + + nyc@15.1.0: + resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} + engines: {node: '>=8.9'} + hasBin: true + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.2: + resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + open-cli@7.2.0: + resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} + engines: {node: '>=14.16'} + hasBin: true + + open@9.1.0: + resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} + engines: {node: '>=14.16'} + + optionator@0.8.3: + resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ordinal@1.0.3: + resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-to-regexp@6.2.2: + resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + pbkdf2@3.1.2: + resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} + engines: {node: '>=0.12'} + + peek-readable@5.2.0: + resolution: {integrity: sha512-U94a+eXHzct7vAd19GH3UQ2dH4Satbng0MyYTMaQatL0pvYYL5CTPR25HBhKtecl+4bfu1/i3vC6k0hydO5Vcw==} + engines: {node: '>=14.16'} + + picocolors@1.1.0: + resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.45: + resolution: {integrity: sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.1.2: + resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} + engines: {node: '>= 0.8.0'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier-plugin-solidity@1.1.3: + resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} + engines: {node: '>=12'} + peerDependencies: + prettier: '>=2.3.0 || >=3.0.0-alpha.0' + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-on-spawn@1.0.0: + resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} + engines: {node: '>=8'} + + promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@6.1.2: + resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} + engines: {node: '>=12'} + + ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.11.0: + resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.11.0: + resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + + react-tooltip@5.28.0: + resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-pkg-up@9.1.0: + resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + read-pkg@7.1.0: + resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} + engines: {node: '>=12.20'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readable-web-to-node-stream@3.0.2: + resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} + engines: {node: '>=8'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + recursive-readdir@2.2.3: + resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} + engines: {node: '>=6.0.0'} + + redent@4.0.0: + resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} + engines: {node: '>=12'} + + reduce-flatten@2.0.0: + resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} + engines: {node: '>=6'} + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + + req-cwd@2.0.0: + resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} + engines: {node: '>=4'} + + req-from@2.0.0: + resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} + engines: {node: '>=4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + resolve-from@3.0.0: + resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} + engines: {node: '>=4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.1.7: + resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} + + resolve@1.17.0: + resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + ripemd160@2.0.2: + resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + + rlp@2.2.7: + resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} + hasBin: true + + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.21.2: + resolution: {integrity: sha512-e3TapAgYf9xjdLvKQCkQTnbTKd4a6jwlpQSJJFokHGaX2IVjoEqkIIhiQfqsi0cdwlOD+tQGuOd5AJkc5RngBw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + run-applescript@5.0.0: + resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} + engines: {node: '>=12'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sc-istanbul@0.4.6: + resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} + hasBin: true + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + + secp256k1@4.0.3: + resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} + engines: {node: '>=10.0.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sha1@1.1.1: + resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sinon@14.0.2: + resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} + deprecated: 16.1.1 + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + solc@0.8.26: + resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} + engines: {node: '>=10.0.0'} + hasBin: true + + solidity-comments-extractor@0.0.7: + resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} + + solidity-coverage@0.8.13: + resolution: {integrity: sha512-RiBoI+kF94V3Rv0+iwOj3HQVSqNzA9qm/qDP1ZDXK5IX0Cvho1qiz8hAXTsAo6KOIUeP73jfscq0KlLqVxzGWA==} + hasBin: true + peerDependencies: + hardhat: ^2.11.0 + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.2.0: + resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} + engines: {node: '>=0.8.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stacktrace-parser@0.1.10: + resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} + engines: {node: '>=6'} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + string-format@2.0.0: + resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-hex-prefix@1.0.0: + resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} + engines: {node: '>=6.5.0', npm: '>=3'} + + strip-indent@4.0.0: + resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} + engines: {node: '>=12'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strtok3@7.1.1: + resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} + engines: {node: '>=16'} + + styled-components@5.3.10: + resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + stylis@4.3.4: + resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} + + supports-color@3.2.3: + resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + sync-request@6.1.0: + resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} + engines: {node: '>=8.0.0'} + + sync-rpc@1.3.6: + resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + + table-layout@1.0.2: + resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} + engines: {node: '>=8.0.0'} + + table@6.8.2: + resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} + engines: {node: '>=10.0.0'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + then-request@6.0.2: + resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} + engines: {node: '>=6.0.0'} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + titleize@3.0.0: + resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} + engines: {node: '>=12'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + token-types@5.0.1: + resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} + engines: {node: '>=14.16'} + + trim-newlines@4.1.1: + resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} + engines: {node: '>=12'} + + ts-command-line-args@2.5.1: + resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} + hasBin: true + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-essentials@7.0.3: + resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} + peerDependencies: + typescript: '>=3.7.0' + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tsort@0.0.1: + resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + 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' + + tweetnacl-util@0.15.1: + resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + + tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + type-check@0.3.2: + resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} + engines: {node: '>= 0.8.0'} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.7.1: + resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + typechain@8.3.2: + resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} + hasBin: true + peerDependencies: + typescript: '>=4.3.0' + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} + hasBin: true + + typical@4.0.0: + resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} + engines: {node: '>=8'} + + typical@5.2.0: + resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} + engines: {node: '>=8'} + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@5.28.4: + resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} + engines: {node: '>=14.0'} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + untildify@4.0.0: + resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} + engines: {node: '>=8'} + + update-browserslist-db@1.1.0: + resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + utf8@3.0.0: + resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + uuid@9.0.1: + resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} + hasBin: true + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + + viem@2.21.2: + resolution: {integrity: sha512-gTzwKbmyepEDUBKXs3GslTcg5KXfDIgQfHKNxIV9cs7Xout55F8NvHhNeBGBfuw1Ix4Vz8aCMFGYwX5a64CGFg==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + + vite-plugin-singlefile@2.0.2: + resolution: {integrity: sha512-Z2ou6HcvED5CF0hM+vcFSaFa+klyS8RyyLxW0PbMRLnMbvzTI6ueWyxdYNFhpuXZgz/aj6+E/dHFTdEcw6gb9w==} + engines: {node: '>18.0.0'} + peerDependencies: + rollup: ^4.18.0 + vite: ^5.3.1 + + vite@5.4.3: + resolution: {integrity: sha512-IH+nl64eq9lJjFqU+/yrRnrHPVTlgy42/+IzbOdaFDVlyLgI/wDlf+FCobXLX1cT0X5+7LMyH1mIy2xJdLfo8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + + web3-utils@1.10.4: + resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} + engines: {node: '>=8.0.0'} + + webauthn-p256@0.0.5: + resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + widest-line@3.1.0: + resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} + engines: {node: '>=8'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wordwrapjs@4.0.1: + resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} + engines: {node: '>=8.0.0'} + + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + + ws@7.4.6: + resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-parser@20.2.9: + 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'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + +snapshots: + + '@adraffy/ens-normalize@1.10.0': {} + + '@adraffy/ens-normalize@1.10.1': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.7': + dependencies: + '@babel/highlight': 7.24.7 + picocolors: 1.1.0 + + '@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.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6(supports-color@5.5.0) + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.7(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.25.6': + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.24.7': + dependencies: + '@babel/types': 7.25.6 + + '@babel/helper-compilation-targets@7.25.2': + dependencies: + '@babel/compat-data': 7.25.4 + '@babel/helper-validator-option': 7.24.8 + browserslist: 4.23.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': + dependencies: + '@babel/traverse': 7.25.6(supports-color@5.5.0) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + '@babel/traverse': 7.25.6(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.24.8': {} + + '@babel/helper-simple-access@7.24.7': + dependencies: + '@babel/traverse': 7.25.6(supports-color@5.5.0) + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.24.8': {} + + '@babel/helper-validator-identifier@7.24.7': {} + + '@babel/helper-validator-option@7.24.8': {} + + '@babel/helpers@7.25.6': + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + + '@babel/highlight@7.24.7': + dependencies: + '@babel/helper-validator-identifier': 7.24.7 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.1.0 + + '@babel/parser@7.25.6': + dependencies: + '@babel/types': 7.25.6 + + '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-self@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/plugin-transform-react-jsx-source@7.24.7(@babel/core@7.25.2)': + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + + '@babel/template@7.25.0': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@babel/traverse@7.25.6(supports-color@5.5.0)': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7(supports-color@5.5.0) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.25.6': + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + + '@braintree/sanitize-url@6.0.4': {} + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + + '@emotion/is-prop-valid@1.3.0': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.7.5': {} + + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.15.18': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.15.18': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.11.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@5.5.0) + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.0': {} + + '@ethereumjs/rlp@4.0.1': {} + + '@ethereumjs/util@8.1.0': + dependencies: + '@ethereumjs/rlp': 4.0.1 + ethereum-cryptography: 2.2.1 + micro-ftch: 0.3.1 + + '@ethersproject/abi@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/abstract-provider@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + + '@ethersproject/abstract-signer@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/address@5.6.1': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/address@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + + '@ethersproject/base64@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + + '@ethersproject/basex@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + + '@ethersproject/bignumber@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + + '@ethersproject/bytes@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/constants@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + + '@ethersproject/contracts@5.7.0': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + + '@ethersproject/hash@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/hdnode@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/json-wallets@5.7.0': + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + + '@ethersproject/keccak256@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + + '@ethersproject/logger@5.7.0': {} + + '@ethersproject/networks@5.7.1': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/pbkdf2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + + '@ethersproject/properties@5.7.0': + dependencies: + '@ethersproject/logger': 5.7.0 + + '@ethersproject/providers@5.7.2': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.1 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.1 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@ethersproject/random@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/rlp@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/sha2@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + + '@ethersproject/signing-key@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + + '@ethersproject/solidity@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/strings@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/transactions@5.7.0': + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + + '@ethersproject/units@5.7.0': + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + + '@ethersproject/wallet@5.7.0': + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + + '@ethersproject/web@5.7.1': + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@ethersproject/wordlists@5.7.0': + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + + '@fastify/busboy@2.1.1': {} + + '@floating-ui/core@1.6.7': + dependencies: + '@floating-ui/utils': 0.2.7 + + '@floating-ui/dom@1.6.10': + dependencies: + '@floating-ui/core': 1.6.7 + '@floating-ui/utils': 0.2.7 + + '@floating-ui/utils@0.2.7': {} + + '@fontsource/roboto@5.0.14': {} + + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7(supports-color@5.5.0) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0)': + dependencies: + '@istanbuljs/schema': 0.1.3 + nyc: 15.1.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@metamask/eth-sig-util@4.0.1': + dependencies: + ethereumjs-abi: 0.6.8 + ethereumjs-util: 6.2.1 + ethjs-util: 0.1.6 + tweetnacl: 1.0.3 + tweetnacl-util: 0.15.1 + + '@microsoft/api-extractor-model@7.28.9(@types/node@18.19.50)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.50) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.40.1(@types/node@18.19.50)': + dependencies: + '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.50) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.50) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@noble/curves@1.2.0': + dependencies: + '@noble/hashes': 1.3.2 + + '@noble/curves@1.4.0': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/curves@1.4.2': + dependencies: + '@noble/hashes': 1.4.0 + + '@noble/hashes@1.2.0': {} + + '@noble/hashes@1.3.2': {} + + '@noble/hashes@1.4.0': {} + + '@noble/hashes@1.5.0': {} + + '@noble/secp256k1@1.7.1': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@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/edr@0.5.2': + dependencies: + '@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-common@4.0.4': + dependencies: + '@nomicfoundation/ethereumjs-util': 9.0.4 + transitivePeerDependencies: + - c-kzg + + '@nomicfoundation/ethereumjs-rlp@5.0.4': {} + + '@nomicfoundation/ethereumjs-tx@5.0.4': + dependencies: + '@nomicfoundation/ethereumjs-common': 4.0.4 + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + '@nomicfoundation/ethereumjs-util': 9.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/ethereumjs-util@9.0.4': + dependencies: + '@nomicfoundation/ethereumjs-rlp': 5.0.4 + ethereum-cryptography: 0.1.3 + + '@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': + dependencies: + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + '@types/chai-as-promised': 7.1.8 + chai: 4.4.1 + chai-as-promised: 7.1.1(chai@4.4.1) + deep-eql: 4.1.4 + ethers: 6.13.2 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + ordinal: 1.0.3 + + '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': + dependencies: + debug: 4.3.7(supports-color@5.5.0) + ethers: 6.13.2 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + lodash.isequal: 4.5.0 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + + '@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': + dependencies: + ethereumjs-util: 7.1.5 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + + ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)' + : dependencies: + '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + '@nomicfoundation/hardhat-verify': 2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + '@typechain/hardhat': 9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)) + '@types/chai': 4.3.19 + '@types/mocha': 9.1.1 + '@types/node': 18.19.50 + chai: 4.4.1 + ethers: 6.13.2 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + hardhat-gas-reporter: 1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + solidity-coverage: 0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) + ts-node: 10.9.1(@types/node@18.19.50)(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + + '@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/address': 5.6.1 + cbor: 8.1.0 + chalk: 2.4.2 + debug: 4.3.7(supports-color@5.5.0) + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + lodash.clonedeep: 4.5.0 + semver: 6.3.1 + table: 6.8.2 + undici: 5.28.4 + transitivePeerDependencies: + - supports-color + + '@nomicfoundation/hardhat-viem@2.0.0(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typescript@5.5.4)(viem@2.21.2(typescript@5.5.4))': + dependencies: + abitype: 0.9.10(typescript@5.5.4) + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + lodash.memoize: 4.1.2 + typescript: 5.5.4 + viem: 2.21.2(typescript@5.5.4) + transitivePeerDependencies: + - zod + + '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-darwin-x64@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-arm64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-gnu@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-linux-x64-musl@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer-win32-x64-msvc@0.1.2': + optional: true + + '@nomicfoundation/solidity-analyzer@0.1.2': + optionalDependencies: + '@nomicfoundation/solidity-analyzer-darwin-arm64': 0.1.2 + '@nomicfoundation/solidity-analyzer-darwin-x64': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-arm64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-gnu': 0.1.2 + '@nomicfoundation/solidity-analyzer-linux-x64-musl': 0.1.2 + '@nomicfoundation/solidity-analyzer-win32-x64-msvc': 0.1.2 + + '@nomiclabs/eslint-plugin-hardhat-internal-rules@1.0.2': {} + + '@openzeppelin/contracts@5.0.2': {} + + '@remix-run/router@1.6.0': {} + + '@rollup/rollup-android-arm-eabi@4.21.2': + optional: true + + '@rollup/rollup-android-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.21.2': + optional: true + + '@rollup/rollup-darwin-x64@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.21.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.21.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.21.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.21.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.21.2': + optional: true + + '@rushstack/node-core-library@3.66.0(@types/node@18.19.50)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 18.19.50 + + '@rushstack/rig-package@0.5.1': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/ts-command-line@4.17.1': + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + + '@scure/base@1.1.8': {} + + '@scure/bip32@1.1.5': + dependencies: + '@noble/hashes': 1.2.0 + '@noble/secp256k1': 1.7.1 + '@scure/base': 1.1.8 + + '@scure/bip32@1.4.0': + dependencies: + '@noble/curves': 1.4.0 + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.8 + + '@scure/bip39@1.1.1': + dependencies: + '@noble/hashes': 1.2.0 + '@scure/base': 1.1.8 + + '@scure/bip39@1.3.0': + dependencies: + '@noble/hashes': 1.4.0 + '@scure/base': 1.1.8 + + '@scure/bip39@1.4.0': + dependencies: + '@noble/hashes': 1.5.0 + '@scure/base': 1.1.8 + + '@sentry/core@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/hub@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/minimal@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sentry/node@5.30.0': + dependencies: + '@sentry/core': 5.30.0 + '@sentry/hub': 5.30.0 + '@sentry/tracing': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + '@sentry/tracing@5.30.0': + dependencies: + '@sentry/hub': 5.30.0 + '@sentry/minimal': 5.30.0 + '@sentry/types': 5.30.0 + '@sentry/utils': 5.30.0 + tslib: 1.14.1 + + '@sentry/types@5.30.0': {} + + '@sentry/utils@5.30.0': + dependencies: + '@sentry/types': 5.30.0 + tslib: 1.14.1 + + '@sinonjs/commons@1.8.6': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@2.0.0': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@11.3.1': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@sinonjs/fake-timers@9.1.2': + dependencies: + '@sinonjs/commons': 1.8.6 + + '@sinonjs/samsam@7.0.1': + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.1.0 + + '@sinonjs/text-encoding@0.7.3': {} + + '@solidity-parser/parser@0.14.5': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.16.2': + dependencies: + antlr4ts: 0.5.0-alpha.4 + + '@solidity-parser/parser@0.18.0': {} + + '@tokenizer/token@0.3.0': {} + + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + + '@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)': + dependencies: + ethers: 6.13.2 + lodash: 4.17.21 + ts-essentials: 7.0.3(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + typescript: 5.5.4 + + '@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))': + dependencies: + '@typechain/ethers-v6': 0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + ethers: 6.13.2 + fs-extra: 9.1.0 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + typechain: 8.3.2(typescript@5.5.4) + + '@types/argparse@1.0.38': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.6 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.6 + '@babel/types': 7.25.6 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.6 + + '@types/bn.js@4.11.6': + dependencies: + '@types/node': 18.19.50 + + '@types/bn.js@5.1.5': + dependencies: + '@types/node': 18.19.50 + + '@types/chai-as-promised@7.1.8': + dependencies: + '@types/chai': 4.3.19 + + '@types/chai@4.3.19': {} + + '@types/concat-stream@1.6.1': + dependencies: + '@types/node': 18.19.50 + + '@types/d3-scale-chromatic@3.0.3': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.3 + + '@types/d3-time@3.0.3': {} + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree@1.0.5': {} + + '@types/form-data@0.0.33': + dependencies: + '@types/node': 18.19.50 + + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 18.19.50 + + '@types/glob@7.2.0': + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 18.19.50 + + '@types/hoist-non-react-statics@3.3.5': + dependencies: + '@types/react': 18.3.5 + hoist-non-react-statics: 3.3.2 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/lodash.flattendeep@4.4.9': + dependencies: + '@types/lodash': 4.14.189 + + '@types/lodash@4.14.189': {} + + '@types/lru-cache@5.1.1': {} + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + + '@types/minimatch@5.1.2': {} + + '@types/minimist@1.2.5': {} + + '@types/mocha@9.1.1': {} + + '@types/ms@0.7.34': {} + + '@types/ndjson@2.0.1': + dependencies: + '@types/node': 18.19.50 + '@types/through': 0.0.33 + + '@types/node@10.17.60': {} + + '@types/node@18.15.13': {} + + '@types/node@18.19.50': + dependencies: + undici-types: 5.26.5 + + '@types/node@8.10.66': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/pbkdf2@3.1.2': + dependencies: + '@types/node': 18.19.50 + + '@types/prettier@2.7.3': {} + + '@types/prompts@2.4.9': + dependencies: + '@types/node': 18.19.50 + kleur: 3.0.3 + + '@types/prop-types@15.7.12': {} + + '@types/qs@6.9.15': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.5 + + '@types/react@18.3.5': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/secp256k1@4.0.6': + dependencies: + '@types/node': 18.19.50 + + '@types/semver@7.5.8': {} + + '@types/sinon@10.0.20': + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + + '@types/sinonjs__fake-timers@8.1.5': {} + + '@types/styled-components@5.1.26': + dependencies: + '@types/hoist-non-react-statics': 3.3.5 + '@types/react': 18.3.5 + csstype: 3.1.3 + + '@types/through@0.0.33': + dependencies: + '@types/node': 18.19.50 + + '@types/unist@2.0.11': {} + + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/regexpp': 4.11.0 + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.7(supports-color@5.5.0) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare-lite: 1.4.0 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + eslint: 8.57.0 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + debug: 4.3.7(supports-color@5.5.0) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/type-utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + debug: 4.3.7(supports-color@5.5.0) + eslint: 8.57.0 + tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.5.4)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.7(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.5.4) + optionalDependencies: + typescript: 5.5.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.5.4)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) + eslint: 8.57.0 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/promise-all-settled@1.1.2': {} + + '@ungap/structured-clone@1.2.0': {} + + '@vitejs/plugin-react@4.3.1(vite@5.4.3(@types/node@18.19.50))': + dependencies: + '@babel/core': 7.25.2 + '@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.3(@types/node@18.19.50) + transitivePeerDependencies: + - supports-color + + abbrev@1.0.9: {} + + abitype@0.9.10(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + abitype@1.0.5(typescript@5.5.4): + optionalDependencies: + typescript: 5.5.4 + + acorn-jsx@5.3.2(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + + acorn-walk@8.3.3: + dependencies: + acorn: 8.12.1 + + acorn@8.12.1: {} + + adm-zip@0.4.16: {} + + aes-js@3.0.0: {} + + aes-js@4.0.0-beta.5: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.7(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.0.1 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + amdefine@1.0.1: + optional: true + + ansi-align@3.0.1: + dependencies: + string-width: 4.2.3 + + ansi-colors@4.1.1: {} + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@3.0.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + antlr4ts@0.5.0-alpha.4: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + + arg@4.1.3: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-back@3.1.0: {} + + array-back@4.0.2: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array-uniq@1.0.3: {} + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + asap@2.0.6: {} + + assertion-error@1.1.0: {} + + astral-regex@2.0.0: {} + + async@1.5.2: {} + + asynckit@0.4.0: {} + + at-least-node@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axios@1.7.7: + dependencies: + follow-redirects: 1.15.8(debug@4.3.7) + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + babel-plugin-styled-components@2.1.4(@babel/core@7.25.2)(styled-components@5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.24.7 + '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + bech32@1.1.4: {} + + big-integer@1.6.52: {} + + binary-extensions@2.3.0: {} + + blakejs@1.2.1: {} + + bn.js@4.11.6: {} + + bn.js@4.12.0: {} + + bn.js@5.2.1: {} + + boxen@5.1.2: + dependencies: + ansi-align: 3.0.1 + camelcase: 6.3.0 + chalk: 4.1.2 + cli-boxes: 2.2.1 + string-width: 4.2.3 + type-fest: 0.20.2 + widest-line: 3.1.0 + wrap-ansi: 7.0.0 + + bplist-parser@0.2.0: + dependencies: + big-integer: 1.6.52 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + brorand@1.1.0: {} + + browser-stdout@1.3.1: {} + + browserify-aes@1.2.0: + dependencies: + buffer-xor: 1.0.3 + cipher-base: 1.0.4 + create-hash: 1.2.0 + evp_bytestokey: 1.0.3 + inherits: 2.0.4 + safe-buffer: 5.2.1 + + browserslist@4.23.3: + dependencies: + caniuse-lite: 1.0.30001657 + electron-to-chromium: 1.5.15 + node-releases: 2.0.18 + update-browserslist-db: 1.1.0(browserslist@4.23.3) + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + bs58check@2.1.2: + dependencies: + bs58: 4.0.1 + create-hash: 1.2.0 + safe-buffer: 5.2.1 + + buffer-from@1.1.2: {} + + buffer-xor@1.0.3: {} + + bundle-name@3.0.0: + dependencies: + run-applescript: 5.0.0 + + bytes@3.1.2: {} + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-keys@8.0.2: + dependencies: + camelcase: 7.0.1 + map-obj: 4.3.0 + quick-lru: 6.1.2 + type-fest: 2.19.0 + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelcase@7.0.1: {} + + camelize@1.0.1: {} + + caniuse-lite@1.0.30001657: {} + + caseless@0.12.0: {} + + cbor@8.1.0: + dependencies: + nofilter: 3.1.0 + + cbor@9.0.2: + dependencies: + nofilter: 3.1.0 + + chai-as-promised@7.1.1(chai@4.4.1): + dependencies: + chai: 4.4.1 + check-error: 1.0.3 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + character-entities@2.0.2: {} + + charenc@0.0.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + ci-info@2.0.0: {} + + cipher-base@1.0.4: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + classnames@2.5.1: {} + + clean-stack@2.2.0: {} + + cli-boxes@2.2.1: {} + + cli-table3@0.5.1: + dependencies: + object-assign: 4.1.1 + string-width: 2.1.1 + optionalDependencies: + colors: 1.4.0 + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + colors@1.2.5: {} + + colors@1.4.0: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + command-exists@1.2.9: {} + + command-line-args@5.2.1: + dependencies: + array-back: 3.1.0 + find-replace: 3.0.0 + lodash.camelcase: 4.3.0 + typical: 4.0.0 + + command-line-usage@6.1.3: + dependencies: + array-back: 4.0.2 + chalk: 2.4.2 + table-layout: 1.0.2 + typical: 5.2.0 + + commander@7.2.0: {} + + commander@8.3.0: {} + + commander@9.5.0: + optional: true + + commondir@1.0.1: {} + + concat-map@0.0.1: {} + + concat-stream@1.6.2: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + cookie@0.4.2: {} + + core-util-is@1.0.3: {} + + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + + create-hash@1.2.0: + dependencies: + cipher-base: 1.0.4 + inherits: 2.0.4 + md5.js: 1.3.5 + ripemd160: 2.0.2 + sha.js: 2.4.11 + + create-hmac@1.1.7: + dependencies: + cipher-base: 1.0.4 + create-hash: 1.2.0 + inherits: 2.0.4 + ripemd160: 2.0.2 + safe-buffer: 5.2.1 + sha.js: 2.4.11 + + create-require@1.1.1: {} + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypt@0.0.2: {} + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-color-keywords@1.0.0: {} + + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.30.2): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.30.2 + + cytoscape@3.30.2: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + dayjs@1.11.13: {} + + death@1.1.0: {} + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.3(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.7(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + + debug@4.3.7(supports-color@8.1.1): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decamelize@4.0.0: {} + + decamelize@6.0.0: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + deep-extend@0.6.0: {} + + deep-is@0.1.4: {} + + default-browser-id@3.0.0: + dependencies: + bplist-parser: 0.2.0 + untildify: 4.0.0 + + default-browser@4.0.0: + dependencies: + bundle-name: 3.0.0 + default-browser-id: 3.0.0 + execa: 7.2.0 + titleize: 3.0.0 + + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-lazy-prop@3.0.0: {} + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + diff@4.0.2: {} + + diff@5.0.0: {} + + diff@5.2.0: {} + + difflib@0.2.4: + dependencies: + heap: 0.2.7 + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dompurify@3.1.6: {} + + electron-to-chromium@1.5.15: {} + + elkjs@0.9.3: {} + + elliptic@6.5.4: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + elliptic@6.5.7: + dependencies: + bn.js: 4.12.0 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + + emoji-regex@8.0.0: {} + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.2 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es6-error@4.1.1: {} + + esbuild-android-64@0.15.18: + optional: true + + esbuild-android-arm64@0.15.18: + optional: true + + esbuild-darwin-64@0.15.18: + optional: true + + esbuild-darwin-arm64@0.15.18: + optional: true + + esbuild-freebsd-64@0.15.18: + optional: true + + esbuild-freebsd-arm64@0.15.18: + optional: true + + esbuild-linux-32@0.15.18: + optional: true + + esbuild-linux-64@0.15.18: + optional: true + + esbuild-linux-arm64@0.15.18: + optional: true + + esbuild-linux-arm@0.15.18: + optional: true + + esbuild-linux-mips64le@0.15.18: + optional: true + + esbuild-linux-ppc64le@0.15.18: + optional: true + + esbuild-linux-riscv64@0.15.18: + optional: true + + esbuild-linux-s390x@0.15.18: + optional: true + + esbuild-netbsd-64@0.15.18: + optional: true + + esbuild-openbsd-64@0.15.18: + optional: true + + esbuild-sunos-64@0.15.18: + optional: true + + esbuild-windows-32@0.15.18: + optional: true + + esbuild-windows-64@0.15.18: + optional: true + + esbuild-windows-arm64@0.15.18: + optional: true + + esbuild@0.15.18: + optionalDependencies: + '@esbuild/android-arm': 0.15.18 + '@esbuild/linux-loong64': 0.15.18 + esbuild-android-64: 0.15.18 + esbuild-android-arm64: 0.15.18 + esbuild-darwin-64: 0.15.18 + esbuild-darwin-arm64: 0.15.18 + esbuild-freebsd-64: 0.15.18 + esbuild-freebsd-arm64: 0.15.18 + esbuild-linux-32: 0.15.18 + esbuild-linux-64: 0.15.18 + esbuild-linux-arm: 0.15.18 + esbuild-linux-arm64: 0.15.18 + esbuild-linux-mips64le: 0.15.18 + esbuild-linux-ppc64le: 0.15.18 + esbuild-linux-riscv64: 0.15.18 + esbuild-linux-s390x: 0.15.18 + esbuild-netbsd-64: 0.15.18 + esbuild-openbsd-64: 0.15.18 + esbuild-sunos-64: 0.15.18 + esbuild-windows-32: 0.15.18 + esbuild-windows-64: 0.15.18 + esbuild-windows-arm64: 0.15.18 + + esbuild@0.21.5: + 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 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + escodegen@1.8.1: + dependencies: + esprima: 2.7.3 + estraverse: 1.9.3 + esutils: 2.0.3 + optionator: 0.8.3 + optionalDependencies: + source-map: 0.2.0 + + eslint-config-prettier@8.3.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.15.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@5.5.0) + enhanced-resolve: 5.17.1 + eslint: 8.57.0 + eslint-module-utils: 2.10.0(@typescript-eslint/parser@5.62.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@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) + fast-glob: 3.3.2 + get-tsconfig: 4.8.0 + is-bun-module: 1.1.0 + is-glob: 4.0.3 + optionalDependencies: + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.62.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.10.0(@typescript-eslint/parser@5.62.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@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.62.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.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.62.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 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.10.0(@typescript-eslint/parser@5.62.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@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.57.0)(typescript@5.5.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-mocha@9.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-utils: 3.0.0(eslint@8.57.0) + ramda: 0.27.2 + + eslint-plugin-no-only-tests@3.1.0: {} + + eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8): + dependencies: + eslint: 8.57.0 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.3.0(eslint@8.57.0) + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-plugin-react-refresh@0.3.5(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@3.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint@8.57.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@eslint-community/regexpp': 4.11.0 @@ -4490,7 +7474,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4519,73 +7503,37 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@2.7.3: - resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} - engines: {node: '>=0.10.0'} - hasBin: true - dev: true + esprima@2.7.3: {} - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - dev: true + esprima@4.0.1: {} - /esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + esquery@1.6.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@1.9.3: - resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} - engines: {node: '>=0.10.0'} - dev: true + estraverse@1.9.3: {} - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /eth-gas-reporter@0.2.27: - resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==} - peerDependencies: - '@codechecks/client': ^0.1.0 - peerDependenciesMeta: - '@codechecks/client': - optional: true + eth-gas-reporter@0.2.27: dependencies: '@solidity-parser/parser': 0.14.5 - axios: 1.7.5 + axios: 1.7.7 cli-table3: 0.5.1 colors: 1.4.0 ethereum-cryptography: 1.2.0 @@ -4601,16 +7549,12 @@ packages: - bufferutil - debug - utf-8-validate - dev: true - /ethereum-bloom-filters@1.2.0: - resolution: {integrity: sha512-28hyiE7HVsWubqhpVLVmZXFd4ITeHi+BUu05o9isf0GUpMtzBUi+8/gFrGaGYzvGAJQmJ3JKj77Mk9G98T84rA==} + ethereum-bloom-filters@1.2.0: dependencies: - '@noble/hashes': 1.4.0 - dev: true + '@noble/hashes': 1.5.0 - /ethereum-cryptography@0.1.3: - resolution: {integrity: sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ==} + ethereum-cryptography@0.1.3: dependencies: '@types/pbkdf2': 3.1.2 '@types/secp256k1': 4.0.6 @@ -4628,31 +7572,26 @@ packages: secp256k1: 4.0.3 setimmediate: 1.0.5 - /ethereum-cryptography@1.2.0: - resolution: {integrity: sha512-6yFQC9b5ug6/17CQpCyE3k9eKBMdhyVjzUy1WkiuY/E4vj/SXDBbCw8QEIaXqf0Mf2SnY6RmpDcwlUmBSS0EJw==} + ethereum-cryptography@1.2.0: dependencies: '@noble/hashes': 1.2.0 '@noble/secp256k1': 1.7.1 '@scure/bip32': 1.1.5 '@scure/bip39': 1.1.1 - /ethereum-cryptography@2.2.1: - resolution: {integrity: sha512-r/W8lkHSiTLxUxW8Rf3u4HGB0xQweG2RyETjywylKZSzLWoWAijRz8WCuOtJ6wah+avllXBqZuk29HCCvhEIRg==} + ethereum-cryptography@2.2.1: dependencies: '@noble/curves': 1.4.2 '@noble/hashes': 1.4.0 '@scure/bip32': 1.4.0 '@scure/bip39': 1.3.0 - dev: true - /ethereumjs-abi@0.6.8: - resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + ethereumjs-abi@0.6.8: dependencies: bn.js: 4.12.0 ethereumjs-util: 6.2.1 - /ethereumjs-util@6.2.1: - resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} + ethereumjs-util@6.2.1: dependencies: '@types/bn.js': 4.11.6 bn.js: 4.12.0 @@ -4662,19 +7601,15 @@ packages: ethjs-util: 0.1.6 rlp: 2.2.7 - /ethereumjs-util@7.1.5: - resolution: {integrity: sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg==} - engines: {node: '>=10.0.0'} + ethereumjs-util@7.1.5: dependencies: '@types/bn.js': 5.1.5 bn.js: 5.2.1 create-hash: 1.2.0 ethereum-cryptography: 0.1.3 rlp: 2.2.7 - dev: true - /ethers@5.7.2: - resolution: {integrity: sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==} + ethers@5.7.2: dependencies: '@ethersproject/abi': 5.7.0 '@ethersproject/abstract-provider': 5.7.0 @@ -4709,11 +7644,8 @@ packages: transitivePeerDependencies: - bufferutil - utf-8-validate - dev: true - /ethers@6.13.2: - resolution: {integrity: sha512-9VkriTTed+/27BGuY1s0hf441kqwHJ1wtN2edksEtiRvXx+soxRX3iSXTfFqq2+YwrOqbDoTHjIhQnjJRlzKmg==} - engines: {node: '>=14.0.0'} + ethers@6.13.2: dependencies: '@adraffy/ens-normalize': 1.10.1 '@noble/curves': 1.2.0 @@ -4726,31 +7658,22 @@ packages: - bufferutil - utf-8-validate - /ethjs-unit@0.1.6: - resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-unit@0.1.6: dependencies: bn.js: 4.11.6 number-to-bn: 1.7.0 - dev: true - /ethjs-util@0.1.6: - resolution: {integrity: sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==} - engines: {node: '>=6.5.0', npm: '>=3'} + ethjs-util@0.1.6: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 - bundledDependencies: false - /evp_bytestokey@1.0.3: - resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + evp_bytestokey@1.0.3: dependencies: md5.js: 1.3.5 safe-buffer: 5.2.1 - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4761,11 +7684,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@7.2.0: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4776,339 +7696,208 @@ packages: onetime: 6.0.0 signal-exit: 3.0.7 strip-final-newline: 3.0.0 - dev: true - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.8 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true + fast-json-stable-stringify@2.1.0: {} - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-uri@3.0.1: - resolution: {integrity: sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==} + fast-uri@3.0.1: {} - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-type@18.7.0: - resolution: {integrity: sha512-ihHtXRzXEziMrQ56VSgU7wkxh55iNchFkosu7Y9/S+tXHdKyrGjVK0ujbqNnsxzea+78MaLhN6PGmfYSAv1ACw==} - engines: {node: '>=14.16'} + file-type@18.7.0: dependencies: readable-web-to-node-stream: 3.0.2 strtok3: 7.1.1 token-types: 5.0.1 - dev: true - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - /find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 make-dir: 3.1.0 pkg-dir: 4.2.0 - dev: true - /find-replace@3.0.0: - resolution: {integrity: sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==} - engines: {node: '>=4.0.0'} + find-replace@3.0.0: dependencies: array-back: 3.1.0 - dev: true - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - /find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@6.3.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 - dev: true - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true + flat@5.0.2: {} - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true + flatted@3.3.1: {} - /follow-redirects@1.15.6(debug@4.3.6): - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dependencies: - debug: 4.3.6(supports-color@5.5.0) + follow-redirects@1.15.8(debug@4.3.7): + optionalDependencies: + debug: 4.3.7(supports-color@5.5.0) - /for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.3: dependencies: is-callable: 1.2.7 - dev: true - /foreground-child@2.0.0: - resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} - engines: {node: '>=8.0.0'} + foreground-child@2.0.0: dependencies: cross-spawn: 7.0.3 signal-exit: 3.0.7 - dev: true - /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} + form-data@2.5.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true - /fp-ts@1.19.3: - resolution: {integrity: sha512-H5KQDspykdHuztLTg+ajGN0Z2qUjcEf3Ybxc6hLt0k7/zPkn29XnKnxlBPyW2XIddWrGaJBzBl4VLYOtk39yZg==} + fp-ts@1.19.3: {} - /fromentries@1.3.2: - resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} - dev: true + fromentries@1.3.2: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: false - /fs-extra@7.0.1: - resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 4.0.0 universalify: 0.1.2 - dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-readdir-recursive@1.1.0: - resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} - dev: true + fs-readdir-recursive@1.1.0: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true + function-bind@1.1.2: {} - /function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.6: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 functions-have-names: 1.2.3 - dev: true - /functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - dev: true + functions-have-names@1.2.3: {} - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - dev: true + get-func-name@2.0.2: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.3 has-symbols: 1.0.3 hasown: 2.0.2 - dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - dev: true + get-package-type@0.1.0: {} - /get-port@3.2.0: - resolution: {integrity: sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==} - engines: {node: '>=4'} - dev: true + get-port@3.2.0: {} - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: true + get-stdin@9.0.0: {} - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true + get-stream@6.0.1: {} - /get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + get-symbol-description@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 - dev: true - /get-tsconfig@4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} + get-tsconfig@4.8.0: dependencies: resolve-pkg-maps: 1.0.0 - dev: true - /ghost-testrpc@0.0.2: - resolution: {integrity: sha512-i08dAEgJ2g8z5buJIrCTduwPIhih3DP+hOCTyyryikfV8T0bNvHnGXO67i0DD1H4GBDETTclPy9njZbfluQYrQ==} - hasBin: true + ghost-testrpc@0.0.2: dependencies: chalk: 2.4.2 node-emoji: 1.11.0 - dev: true - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + glob@5.0.15: dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.1.7: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5116,11 +7905,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5129,9 +7915,7 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5139,12 +7923,8 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: true - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -5152,45 +7932,28 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /global-modules@2.0.0: - resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} - engines: {node: '>=6'} + global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - dev: true - /global-prefix@3.0.0: - resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} - engines: {node: '>=6'} + global-prefix@3.0.0: dependencies: ini: 1.3.8 kind-of: 6.0.3 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 gopd: 1.0.1 - dev: true - /globby@10.0.2: - resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} - engines: {node: '>=8'} + globby@10.0.2: dependencies: '@types/glob': 7.2.0 array-union: 2.1.0 @@ -5200,147 +7963,50 @@ packages: ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.4 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - dev: true - - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - dependencies: - minimist: 1.2.8 - neo-async: 2.6.2 - source-map: 0.6.1 - wordwrap: 1.0.0 - optionalDependencies: - uglify-js: 3.19.2 - dev: true - - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true - - /hardhat-gas-reporter@1.0.10(hardhat@2.22.9): - resolution: {integrity: sha512-02N4+So/fZrzJ88ci54GqwVA3Zrf0C9duuTyGt0CFRIh/CdNwbnTgkXkRfojOMLBQ+6t+lBIkgbsOtqMvNwikA==} - peerDependencies: - hardhat: ^2.0.2 - dependencies: - array-uniq: 1.0.3 - eth-gas-reporter: 0.2.27 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) - sha1: 1.1.1 - transitivePeerDependencies: - - '@codechecks/client' - - bufferutil - - debug - - utf-8-validate - dev: true - - /hardhat@2.22.9(ts-node@10.9.1)(typescript@5.0.4): - resolution: {integrity: sha512-sWiuI/yRdFUPfndIvL+2H18Vs2Gav0XacCFYY5msT5dHOWkhLxESJySIk9j83mXL31aXL8+UMA9OgViFLexklg==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true - dependencies: - '@ethersproject/abi': 5.7.0 - '@metamask/eth-sig-util': 4.0.1 - '@nomicfoundation/edr': 0.5.2 - '@nomicfoundation/ethereumjs-common': 4.0.4 - '@nomicfoundation/ethereumjs-tx': 5.0.4 - '@nomicfoundation/ethereumjs-util': 9.0.4 - '@nomicfoundation/solidity-analyzer': 0.1.2 - '@sentry/node': 5.30.0 - '@types/bn.js': 5.1.5 - '@types/lru-cache': 5.1.1 - adm-zip: 0.4.16 - aggregate-error: 3.1.0 - ansi-escapes: 4.3.2 - boxen: 5.1.2 - chalk: 2.4.2 - chokidar: 3.6.0 - ci-info: 2.0.0 - debug: 4.3.6(supports-color@5.5.0) - enquirer: 2.4.1 - env-paths: 2.2.1 - ethereum-cryptography: 1.2.0 - ethereumjs-abi: 0.6.8 - find-up: 2.1.0 - fp-ts: 1.19.3 - fs-extra: 7.0.1 - glob: 7.2.0 - immutable: 4.3.7 - io-ts: 1.10.4 - keccak: 3.0.4 - lodash: 4.17.21 - mnemonist: 0.38.5 - mocha: 10.7.3 - p-map: 4.0.0 - raw-body: 2.5.2 - resolve: 1.17.0 - semver: 6.3.1 - solc: 0.8.26(debug@4.3.6) - source-map-support: 0.5.21 - stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) - tsort: 0.0.1 - typescript: 5.0.4 - undici: 5.28.4 - uuid: 8.3.2 - ws: 7.5.10 + fast-glob: 3.3.2 + ignore: 5.3.2 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + growl@1.10.5: {} + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + + hard-rejection@2.1.0: {} + + hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)): + dependencies: + array-uniq: 1.0.3 + eth-gas-reporter: 0.2.27 + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) + sha1: 1.1.1 transitivePeerDependencies: + - '@codechecks/client' - bufferutil - - c-kzg - - supports-color + - debug - utf-8-validate - dev: true - /hardhat@2.22.9(ts-node@10.9.1)(typescript@5.5.4): - resolution: {integrity: sha512-sWiuI/yRdFUPfndIvL+2H18Vs2Gav0XacCFYY5msT5dHOWkhLxESJySIk9j83mXL31aXL8+UMA9OgViFLexklg==} - hasBin: true - peerDependencies: - ts-node: '*' - typescript: '*' - peerDependenciesMeta: - ts-node: - optional: true - typescript: - optional: true + hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4): dependencies: '@ethersproject/abi': 5.7.0 '@metamask/eth-sig-util': 4.0.1 @@ -5359,7 +8025,7 @@ packages: chalk: 2.4.2 chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -5378,142 +8044,94 @@ packages: raw-body: 2.5.2 resolve: 1.17.0 semver: 6.3.1 - solc: 0.8.26(debug@4.3.6) + solc: 0.8.26(debug@4.3.7) source-map-support: 0.5.21 stacktrace-parser: 0.1.10 - ts-node: 10.9.1(@types/node@18.19.45)(typescript@5.5.4) tsort: 0.0.1 - typescript: 5.5.4 undici: 5.28.4 uuid: 8.3.2 ws: 7.5.10 + optionalDependencies: + ts-node: 10.9.1(@types/node@18.19.50)(typescript@5.5.4) + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - c-kzg - supports-color - utf-8-validate - /has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - dev: true + has-bigints@1.0.2: {} - /has-flag@1.0.0: - resolution: {integrity: sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==} - engines: {node: '>=0.10.0'} - dev: true + has-flag@1.0.0: {} - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.0 - dev: true - /has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.3: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + has-tostringtag@1.0.2: dependencies: has-symbols: 1.0.3 - dev: true - /hash-base@3.1.0: - resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} - engines: {node: '>=4'} + hash-base@3.1.0: dependencies: inherits: 2.0.4 readable-stream: 3.6.2 safe-buffer: 5.2.1 - /hash.js@1.1.7: - resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hash.js@1.1.7: dependencies: inherits: 2.0.4 minimalistic-assert: 1.0.1 - /hasha@5.2.2: - resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} - engines: {node: '>=8'} + hasha@5.2.2: dependencies: is-stream: 2.0.1 type-fest: 0.8.1 - dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hasown@2.0.2: dependencies: function-bind: 1.1.2 - dev: true - /he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + he@1.2.0: {} - /heap@0.2.7: - resolution: {integrity: sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==} - dev: true + heap@0.2.7: {} - /hmac-drbg@1.0.1: - resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hmac-drbg@1.0.1: dependencies: hash.js: 1.1.7 minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 - dev: true - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /hosted-git-info@5.2.1: - resolution: {integrity: sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hosted-git-info@5.2.1: dependencies: lru-cache: 7.18.3 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + html-escaper@2.0.2: {} - /http-basic@8.1.3: - resolution: {integrity: sha512-/EcDMwJZh3mABI2NhGfHOGOeOZITqfkEO4p/xK+l3NpyncIHUQBoMvCSF/b5GqvKtySC2srL/GGG3+EtlqlmCw==} - engines: {node: '>=6.0.0'} + http-basic@8.1.3: dependencies: caseless: 0.12.0 concat-stream: 1.6.2 http-response-object: 3.0.2 parse-cache-control: 1.0.1 - dev: true - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 @@ -5521,366 +8139,203 @@ packages: statuses: 2.0.1 toidentifier: 1.0.1 - /http-response-object@3.0.2: - resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==} + http-response-object@3.0.2: dependencies: '@types/node': 10.17.60 - dev: true - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true + human-signals@2.1.0: {} - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: true + human-signals@4.3.1: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + ieee754@1.2.1: {} - /ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.2: {} - /immer@10.0.2: - resolution: {integrity: sha512-Rx3CqeqQ19sxUtYV9CU911Vhy8/721wRFnJv3REVGWUmoAcIwzifTsdmJte/MV+0/XpM35LZdQMBGkRIoLPwQA==} - dev: false + immer@10.0.2: {} - /immutable@4.3.7: - resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + immutable@4.3.7: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - dev: true + import-lazy@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /indent-string@5.0.0: - resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} - engines: {node: '>=12'} - dev: true + indent-string@5.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + internal-slot@1.0.7: dependencies: es-errors: 1.3.0 hasown: 2.0.2 side-channel: 1.0.6 - dev: true - /internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - dev: true + internmap@1.0.1: {} - /internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - dev: true + internmap@2.0.3: {} - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true + interpret@1.4.0: {} - /io-ts@1.10.4: - resolution: {integrity: sha512-b23PteSnYXSONJ6JQXRAlvJhuw8KOtkqa87W4wDtvMrud/DTJd5X+NpOOI+O/zZwVq6v0VLAaJ+1EDViKEuN9g==} + io-ts@1.10.4: dependencies: fp-ts: 1.19.3 - /is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + is-array-buffer@3.0.4: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 - dev: true - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true + is-arrayish@0.2.1: {} - /is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.0.4: dependencies: has-bigints: 1.0.2 - dev: true - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 - /is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.1.2: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - dev: true + is-bun-module@1.1.0: + dependencies: + semver: 7.6.3 - /is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + is-callable@1.2.7: {} + + is-core-module@2.15.1: dependencies: hasown: 2.0.2 - dev: true - /is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 - dev: true - /is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-date-object@1.0.5: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: true + is-docker@2.2.1: {} - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: true + is-docker@3.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true + is-fullwidth-code-point@2.0.0: {} - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - /is-hex-prefixed@1.0.0: - resolution: {integrity: sha512-WvtOiug1VFrE9v1Cydwm+FnXd3+w9GaeVUss5W4v/SLy3UW00vP+6iNF2SdnfiBoLy4bTqVdkftNGTUeOFVsbA==} - engines: {node: '>=6.5.0', npm: '>=3'} + is-hex-prefixed@1.0.0: {} - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true + is-inside-container@1.0.0: dependencies: is-docker: 3.0.0 - dev: true - /is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - dev: true + is-negative-zero@2.0.3: {} - /is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} + is-plain-obj@2.1.0: {} - /is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 - dev: true - /is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + is-shared-array-buffer@1.0.3: dependencies: call-bind: 1.0.7 - dev: true - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.0.7: dependencies: has-tostringtag: 1.0.2 - dev: true - /is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.0.4: dependencies: has-symbols: 1.0.3 - dev: true - /is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.13: dependencies: which-typed-array: 1.1.15 - dev: true - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - dev: true + is-typedarray@1.0.0: {} - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakref@1.0.2: dependencies: call-bind: 1.0.7 - dev: true - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + is-wsl@2.2.0: dependencies: is-docker: 2.2.1 - dev: true - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: true + isarray@1.0.0: {} - /isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - dev: true + isarray@2.0.5: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: true + isexe@2.0.0: {} - /isows@1.0.4(ws@8.17.1): - resolution: {integrity: sha512-hEzjY+x9u9hPmBom9IIAqdJCwNLax+xrPb51vEPpERoFlIxgmZcHzsT5jKG06nvInKOBGvReAVz80Umed5CczQ==} - peerDependencies: - ws: '*' + isows@1.0.4(ws@8.17.1): dependencies: ws: 8.17.1 - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-hook@3.0.0: - resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} - engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: dependencies: append-transform: 2.0.0 - dev: true - /istanbul-lib-instrument@4.0.3: - resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} - engines: {node: '>=8'} + istanbul-lib-instrument@4.0.3: dependencies: '@babel/core': 7.25.2 '@istanbuljs/schema': 0.1.3 @@ -5888,11 +8343,8 @@ packages: semver: 6.3.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-lib-processinfo@2.0.3: - resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} - engines: {node: '>=8'} + istanbul-lib-processinfo@2.0.3: dependencies: archy: 1.0.0 cross-spawn: 7.0.3 @@ -5900,324 +8352,192 @@ packages: p-map: 3.0.0 rimraf: 3.0.2 uuid: 8.3.2 - dev: true - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: - supports-color - dev: true - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - dev: true - /jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: true + jju@1.4.0: {} - /js-sha3@0.8.0: - resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + js-sha3@0.8.0: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - dev: true - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true + json-parse-even-better-errors@2.3.1: {} - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: false + json-stringify-safe@5.0.1: {} - /json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + json5@1.0.2: dependencies: minimist: 1.2.8 - dev: true - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - /jsonschema@1.4.1: - resolution: {integrity: sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==} - dev: true + jsonschema@1.4.1: {} - /just-extend@6.2.0: - resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} - dev: true + just-extend@6.2.0: {} - /keccak@3.0.4: - resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} - engines: {node: '>=10.0.0'} - requiresBuild: true + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 readable-stream: 3.6.2 - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - dev: true + khroma@2.1.0: {} - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - dev: true + layout-base@1.0.2: {} - /levn@0.3.0: - resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==} - engines: {node: '>= 0.8.0'} + levn@0.3.0: dependencies: prelude-ls: 1.1.2 type-check: 0.3.2 - dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true + lines-and-columns@1.2.4: {} - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - dev: true - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - dev: true + lodash-es@4.17.21: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + lodash.clonedeep@4.5.0: {} - /lodash.flattendeep@4.4.0: - resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} - dev: true + lodash.flattendeep@4.4.0: {} - /lodash.get@4.4.2: - resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: true + lodash.get@4.4.2: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true + lodash.isequal@4.5.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.truncate@4.4.2: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 - dev: true - /loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@2.3.7: dependencies: get-func-name: 2.0.2 - dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - dev: true - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: true + lru-cache@7.18.3: {} - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + lru_map@0.3.3: {} - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - dev: true - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.3 - dev: true - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-error@1.3.6: {} - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /markdown-table@1.1.3: - resolution: {integrity: sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==} - dev: true + markdown-table@1.1.3: {} - /md5.js@1.3.5: - resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + md5.js@1.3.5: dependencies: hash-base: 3.1.0 inherits: 2.0.4 safe-buffer: 5.2.1 - /mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + mdast-util-from-markdown@1.3.1: dependencies: '@types/mdast': 3.0.15 '@types/unist': 2.0.11 @@ -6233,21 +8553,14 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: true - /mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + mdast-util-to-string@3.2.0: dependencies: '@types/mdast': 3.0.15 - dev: true - /memorystream@0.3.1: - resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} - engines: {node: '>= 0.10.0'} + memorystream@0.3.1: {} - /meow@11.0.0: - resolution: {integrity: sha512-Cl0yeeIrko6d94KpUo1M+0X1sB14ikoaqlIGuTH1fW4I+E3+YljL54/hb/BWmVfrV9tTV9zU04+xjw08Fh2WkA==} - engines: {node: '>=14.16'} + meow@11.0.0: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 8.0.2 @@ -6261,19 +8574,12 @@ packages: trim-newlines: 4.1.1 type-fest: 3.13.1 yargs-parser: 21.1.1 - dev: true - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /mermaid@10.8.0: - resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} + mermaid@10.8.0: dependencies: '@braintree/sanitize-url': 6.0.4 '@types/d3-scale': 4.0.8 @@ -6296,14 +8602,10 @@ packages: web-worker: 1.3.0 transitivePeerDependencies: - supports-color - dev: true - /micro-ftch@0.3.1: - resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} - dev: true + micro-ftch@0.3.1: {} - /micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + micromark-core-commonmark@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-factory-destination: 1.1.0 @@ -6321,143 +8623,103 @@ packages: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - dev: true - /micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + micromark-factory-destination@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + micromark-factory-label@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - dev: true - /micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + micromark-factory-space@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-types: 1.1.0 - dev: true - /micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + micromark-factory-title@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + micromark-factory-whitespace@1.1.0: dependencies: micromark-factory-space: 1.1.0 micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + micromark-util-character@1.2.0: dependencies: micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + micromark-util-chunked@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: true - /micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + micromark-util-classify-character@1.1.0: dependencies: micromark-util-character: 1.2.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + micromark-util-combine-extensions@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-types: 1.1.0 - dev: true - /micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + micromark-util-decode-numeric-character-reference@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: true - /micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + micromark-util-decode-string@1.1.0: dependencies: decode-named-character-reference: 1.0.2 micromark-util-character: 1.2.0 micromark-util-decode-numeric-character-reference: 1.1.0 micromark-util-symbol: 1.1.0 - dev: true - /micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - dev: true + micromark-util-encode@1.1.0: {} - /micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - dev: true + micromark-util-html-tag-name@1.2.0: {} - /micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + micromark-util-normalize-identifier@1.1.0: dependencies: micromark-util-symbol: 1.1.0 - dev: true - /micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + micromark-util-resolve-all@1.1.0: dependencies: micromark-util-types: 1.1.0 - dev: true - /micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + micromark-util-sanitize-uri@1.2.0: dependencies: micromark-util-character: 1.2.0 micromark-util-encode: 1.1.0 micromark-util-symbol: 1.1.0 - dev: true - /micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + micromark-util-subtokenize@1.1.0: dependencies: micromark-util-chunked: 1.1.0 micromark-util-symbol: 1.1.0 micromark-util-types: 1.1.0 uvu: 0.5.6 - dev: true - /micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - dev: true + micromark-util-symbol@1.1.0: {} - /micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - dev: true + micromark-util-types@1.1.0: {} - /micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -6475,106 +8737,64 @@ packages: uvu: 0.5.6 transitivePeerDependencies: - supports-color - dev: true - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - dev: true - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: true + mime-db@1.52.0: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - dev: true - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: true + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + minimalistic-assert@1.0.1: {} - /minimalistic-crypto-utils@1.0.1: - resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + minimalistic-crypto-utils@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} + minimatch@4.2.1: dependencies: brace-expansion: 1.1.11 - dev: true - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: true - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@1.0.4: {} - /mnemonist@0.38.5: - resolution: {integrity: sha512-bZTFT5rrPKtPJxj8KSV0WkPyNxl72vQepqqVUAW2ARUpUSF2qXMB6jZj7hW5/k7C1rtpzqbD/IIbJwLXUjCHeg==} + mnemonist@0.38.5: dependencies: obliterator: 2.0.4 - /mocha@10.7.3: - resolution: {integrity: sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A==} - engines: {node: '>= 14.0.0'} - hasBin: true + mocha@10.7.3: dependencies: ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.6.0 - debug: 4.3.6(supports-color@8.1.1) + debug: 4.3.7(supports-color@8.1.1) diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 @@ -6592,10 +8812,7 @@ packages: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 - /mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true + mocha@9.2.2: dependencies: '@ungap/promise-all-settled': 1.1.2 ansi-colors: 4.1.1 @@ -6621,154 +8838,91 @@ packages: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 - dev: true - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: true + mri@1.2.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + ms@2.1.3: {} - /nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.1: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true + nanoid@3.3.7: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true + natural-compare@1.4.0: {} - /ndjson@2.0.0: - resolution: {integrity: sha512-nGl7LRGrzugTtaFcJMhLbpzJM6XdivmbkdlaGcrk/LXg2KL/YBC6z1g70xh0/al+oFuVFP8N8kiWRucmeEH/qQ==} - engines: {node: '>=10'} - hasBin: true + ndjson@2.0.0: dependencies: json-stringify-safe: 5.0.1 minimist: 1.2.8 readable-stream: 3.6.2 split2: 3.2.2 through2: 4.0.2 - dev: false - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /nise@5.1.9: - resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + nise@5.1.9: dependencies: '@sinonjs/commons': 3.0.1 '@sinonjs/fake-timers': 11.3.1 '@sinonjs/text-encoding': 0.7.3 just-extend: 6.2.0 path-to-regexp: 6.2.2 - dev: true - /node-addon-api@2.0.2: - resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + node-addon-api@2.0.2: {} - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: true - /node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true + node-gyp-build@4.8.2: {} - /node-preload@0.2.1: - resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} - engines: {node: '>=8'} + node-preload@0.2.1: dependencies: process-on-spawn: 1.0.0 - dev: true - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - dev: true + node-releases@2.0.18: {} - /nofilter@3.1.0: - resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} - engines: {node: '>=12.19'} + nofilter@3.1.0: {} - /non-layered-tidy-tree-layout@2.0.2: - resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} - dev: true + non-layered-tidy-tree-layout@2.0.2: {} - /nopt@3.0.6: - resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} - hasBin: true + nopt@3.0.6: dependencies: abbrev: 1.0.9 - dev: true - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.15.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 - dev: true - /normalize-package-data@4.0.1: - resolution: {integrity: sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + normalize-package-data@4.0.1: dependencies: hosted-git-info: 5.2.1 is-core-module: 2.15.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - dev: true - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /number-to-bn@1.7.0: - resolution: {integrity: sha512-wsJ9gfSz1/s4ZsJN01lyonwuxA1tml6X1yBDnfpMglypcBRFZZkus26EdPSlqS5GJfYddVZa22p3VNb3z5m5Ig==} - engines: {node: '>=6.5.0', npm: '>=3'} + number-to-bn@1.7.0: dependencies: bn.js: 4.11.6 strip-hex-prefix: 1.0.0 - dev: true - /nyc@15.1.0: - resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} - engines: {node: '>=8.9'} - hasBin: true + nyc@15.1.0: dependencies: '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 @@ -6799,108 +8953,69 @@ packages: yargs: 15.4.1 transitivePeerDependencies: - supports-color - dev: true - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true + object-assign@4.1.1: {} - /object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - dev: true + object-inspect@1.13.2: {} - /object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - dev: true + object-keys@1.1.1: {} - /object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + object.assign@4.1.5: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true - /object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + object.fromentries@2.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + object.groupby@1.0.3: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 - dev: true - /object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + object.values@1.2.0: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + obliterator@2.0.4: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - dev: true - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /open-cli@7.2.0: - resolution: {integrity: sha512-1ANJc8oJ92FiaNZ0o2Hw4WBvDJoXs1P74aFMtpAvlbkIPV4uPcQvDz7V6kMOrsZkmB4tglrHVMlLQaafuUuxXg==} - engines: {node: '>=14.16'} - hasBin: true + open-cli@7.2.0: dependencies: file-type: 18.7.0 get-stdin: 9.0.0 meow: 11.0.0 open: 9.1.0 tempy: 3.1.0 - dev: true - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} + open@9.1.0: dependencies: default-browser: 4.0.0 define-lazy-prop: 3.0.0 is-inside-container: 1.0.0 is-wsl: 2.2.0 - dev: true - /optionator@0.8.3: - resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==} - engines: {node: '>= 0.8.0'} + optionator@0.8.3: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -6908,11 +9023,8 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 word-wrap: 1.2.5 - dev: true - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + optionator@0.9.4: dependencies: deep-is: 0.1.4 fast-levenshtein: 2.0.6 @@ -6920,167 +9032,96 @@ packages: prelude-ls: 1.2.1 type-check: 0.4.0 word-wrap: 1.2.5 - dev: true - /ordinal@1.0.3: - resolution: {integrity: sha512-cMddMgb2QElm8G7vdaa02jhUNbTSrhsgAGUz1OokD83uJTwSUn+nKoNoKVVaRa08yF6sgfO7Maou1+bgLd9rdQ==} - dev: true + ordinal@1.0.3: {} - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + os-tmpdir@1.0.2: {} - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - dev: true - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.1.1 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@3.0.0: - resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} - engines: {node: '>=8'} + p-map@3.0.0: dependencies: aggregate-error: 3.1.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true + p-try@2.2.0: {} - /package-hash@4.0.0: - resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} - engines: {node: '>=8'} + package-hash@4.0.0: dependencies: graceful-fs: 4.2.11 hasha: 5.2.2 lodash.flattendeep: 4.4.0 release-zalgo: 1.0.0 - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - dev: true + parse-cache-control@1.0.1: {} - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - dev: true - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - dev: true + path-to-regexp@6.2.2: {} - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - dev: true + pathval@1.1.1: {} - /pbkdf2@3.1.2: - resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} - engines: {node: '>=0.12'} + pbkdf2@3.1.2: dependencies: create-hash: 1.2.0 create-hmac: 1.1.7 @@ -7088,238 +9129,132 @@ packages: safe-buffer: 5.2.1 sha.js: 2.4.11 - /peek-readable@5.1.4: - resolution: {integrity: sha512-E7mY2VmKqw9jYuXrSWGHFuPCW2SLQenzXLF3amGaY6lXXg4/b3gj5HVM7h8ZjCO/nZS9ICs0Cz285+32FvNd/A==} - engines: {node: '>=14.16'} - dev: true + peek-readable@5.2.0: {} - /picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true + picocolors@1.1.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - dev: true + pify@4.0.1: {} - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - dev: true - /possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - dev: true + possible-typed-array-names@1.0.0: {} - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true + postcss-value-parser@4.2.0: {} - /postcss@8.4.41: - resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} - engines: {node: ^10 || ^12 || >=14} + postcss@8.4.45: dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.0 source-map-js: 1.2.0 - dev: true - /prelude-ls@1.1.2: - resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.1.2: {} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier-plugin-solidity@1.1.3(prettier@2.8.8): - resolution: {integrity: sha512-fQ9yucPi2sBbA2U2Xjh6m4isUTJ7S7QLc/XDDsktqqxYfTwdYKJ0EnnywXHwCGAaYbQNK+HIYPL1OemxuMsgeg==} - engines: {node: '>=12'} - peerDependencies: - prettier: '>=2.3.0 || >=3.0.0-alpha.0' + prettier-plugin-solidity@1.1.3(prettier@2.8.8): dependencies: '@solidity-parser/parser': 0.16.2 prettier: 2.8.8 semver: 7.6.3 solidity-comments-extractor: 0.0.7 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: true + process-nextick-args@2.0.1: {} - /process-on-spawn@1.0.0: - resolution: {integrity: sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==} - engines: {node: '>=8'} + process-on-spawn@1.0.0: dependencies: fromentries: 1.3.2 - dev: true - /promise@8.3.0: - resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + promise@8.3.0: dependencies: asap: 2.0.6 - dev: true - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - dev: false - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true + proxy-from-env@1.1.0: {} - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true + punycode@2.3.1: {} - /qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + qs@6.13.0: dependencies: side-channel: 1.0.6 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-lru@6.1.2: - resolution: {integrity: sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==} - engines: {node: '>=12'} - dev: true + quick-lru@6.1.2: {} - /ramda@0.27.2: - resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} - dev: true + ramda@0.27.2: {} - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - /raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@2.5.2: dependencies: bytes: 3.1.2 http-errors: 2.0.0 iconv-lite: 0.4.24 unpipe: 1.0.0 - /react-dom@18.3.1(react@18.3.1): - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 react: 18.3.1 scheduler: 0.23.2 - dev: true - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: true - /react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - dev: true + react-is@16.13.1: {} - /react-refresh@0.14.2: - resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} - engines: {node: '>=0.10.0'} - dev: true + react-refresh@0.14.2: {} - /react-router-dom@6.11.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' + react-router-dom@6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.6.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) react-router: 6.11.0(react@18.3.1) - dev: true - /react-router@6.11.0(react@18.3.1): - resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} - engines: {node: '>=14'} - peerDependencies: - react: '>=16.8' + react-router@6.11.0(react@18.3.1): dependencies: '@remix-run/router': 1.6.0 react: 18.3.1 - dev: true - /react-tooltip@5.28.0(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==} - peerDependencies: - react: '>=16.14.0' - react-dom: '>=16.14.0' + react-tooltip@5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@floating-ui/dom': 1.6.10 classnames: 2.5.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - dev: true - /react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + react@18.3.1: dependencies: loose-envify: 1.4.0 - dev: true - /read-pkg-up@9.1.0: - resolution: {integrity: sha512-vaMRR1AC1nrd5CQM0PhlRsO5oc2AAigqr7cCrZ/MW/Rsaflz4RlgzkpL4qoU/z1F6wrbd85iFv1OQj/y5RdGvg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + read-pkg-up@9.1.0: dependencies: find-up: 6.3.0 read-pkg: 7.1.0 type-fest: 2.19.0 - dev: true - /read-pkg@7.1.0: - resolution: {integrity: sha512-5iOehe+WF75IccPc30bWTbpdDQLOCc3Uu8bi3Dte3Eueij81yx1Mrufk8qBx/YAbR4uL1FdUr+7BKXDwEtisXg==} - engines: {node: '>=12.20'} + read-pkg@7.1.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 3.0.3 parse-json: 5.2.0 type-fest: 2.19.0 - dev: true - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7328,253 +9263,159 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 - dev: true - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-web-to-node-stream@3.0.2: - resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} - engines: {node: '>=8'} + readable-web-to-node-stream@3.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + rechoir@0.6.2: dependencies: resolve: 1.22.8 - dev: true - /recursive-readdir@2.2.3: - resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==} - engines: {node: '>=6.0.0'} + recursive-readdir@2.2.3: dependencies: minimatch: 3.1.2 - dev: true - /redent@4.0.0: - resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==} - engines: {node: '>=12'} + redent@4.0.0: dependencies: indent-string: 5.0.0 strip-indent: 4.0.0 - dev: true - /reduce-flatten@2.0.0: - resolution: {integrity: sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==} - engines: {node: '>=6'} - dev: true + reduce-flatten@2.0.0: {} - /regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + regexp.prototype.flags@1.5.2: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-errors: 1.3.0 set-function-name: 2.0.2 - dev: true - /release-zalgo@1.0.0: - resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} - engines: {node: '>=4'} + release-zalgo@1.0.0: dependencies: es6-error: 4.1.1 - dev: true - /req-cwd@2.0.0: - resolution: {integrity: sha512-ueoIoLo1OfB6b05COxAA9UpeoscNpYyM+BqYlA7H6LVF4hKGPXQQSSaD2YmvDVJMkk4UDpAHIeU1zG53IqjvlQ==} - engines: {node: '>=4'} + req-cwd@2.0.0: dependencies: req-from: 2.0.0 - dev: true - /req-from@2.0.0: - resolution: {integrity: sha512-LzTfEVDVQHBRfjOUMgNBA+V6DWsSnoeKzf42J7l0xa/B4jyPOuuF5MlNSmomLNGemWTnV2TIdjSSLnEn95fOQA==} - engines: {node: '>=4'} + req-from@2.0.0: dependencies: resolve-from: 3.0.0 - dev: true - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /require-main-filename@2.0.0: - resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} - dev: true + require-main-filename@2.0.0: {} - /resolve-from@3.0.0: - resolution: {integrity: sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==} - engines: {node: '>=4'} - dev: true + resolve-from@3.0.0: {} - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - dev: true + resolve-from@5.0.0: {} - /resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true + resolve-pkg-maps@1.0.0: {} - /resolve@1.1.7: - resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} - dev: true + resolve@1.1.7: {} - /resolve@1.17.0: - resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.17.0: dependencies: path-parse: 1.0.7 - /resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolve@1.19.0: dependencies: is-core-module: 2.15.1 path-parse: 1.0.7 - dev: true - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.15.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true + reusify@1.0.4: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: true - /ripemd160@2.0.2: - resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} + ripemd160@2.0.2: dependencies: hash-base: 3.1.0 inherits: 2.0.4 - /rlp@2.2.7: - resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} - hasBin: true + rlp@2.2.7: dependencies: bn.js: 5.2.1 - /robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - dev: true + robust-predicates@3.0.2: {} - /rollup@4.21.0: - resolution: {integrity: sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + rollup@4.21.2: dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.21.0 - '@rollup/rollup-android-arm64': 4.21.0 - '@rollup/rollup-darwin-arm64': 4.21.0 - '@rollup/rollup-darwin-x64': 4.21.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.21.0 - '@rollup/rollup-linux-arm-musleabihf': 4.21.0 - '@rollup/rollup-linux-arm64-gnu': 4.21.0 - '@rollup/rollup-linux-arm64-musl': 4.21.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.21.0 - '@rollup/rollup-linux-riscv64-gnu': 4.21.0 - '@rollup/rollup-linux-s390x-gnu': 4.21.0 - '@rollup/rollup-linux-x64-gnu': 4.21.0 - '@rollup/rollup-linux-x64-musl': 4.21.0 - '@rollup/rollup-win32-arm64-msvc': 4.21.0 - '@rollup/rollup-win32-ia32-msvc': 4.21.0 - '@rollup/rollup-win32-x64-msvc': 4.21.0 + '@rollup/rollup-android-arm-eabi': 4.21.2 + '@rollup/rollup-android-arm64': 4.21.2 + '@rollup/rollup-darwin-arm64': 4.21.2 + '@rollup/rollup-darwin-x64': 4.21.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.21.2 + '@rollup/rollup-linux-arm-musleabihf': 4.21.2 + '@rollup/rollup-linux-arm64-gnu': 4.21.2 + '@rollup/rollup-linux-arm64-musl': 4.21.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.21.2 + '@rollup/rollup-linux-riscv64-gnu': 4.21.2 + '@rollup/rollup-linux-s390x-gnu': 4.21.2 + '@rollup/rollup-linux-x64-gnu': 4.21.2 + '@rollup/rollup-linux-x64-musl': 4.21.2 + '@rollup/rollup-win32-arm64-msvc': 4.21.2 + '@rollup/rollup-win32-ia32-msvc': 4.21.2 + '@rollup/rollup-win32-x64-msvc': 4.21.2 fsevents: 2.3.3 - dev: true - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} + run-applescript@5.0.0: dependencies: execa: 5.1.1 - dev: true - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - dev: true + rw@1.3.3: {} - /sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} + sade@1.8.1: dependencies: mri: 1.2.0 - dev: true - /safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: true + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-regex: 1.1.4 - dev: true - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /sc-istanbul@0.4.6: - resolution: {integrity: sha512-qJFF/8tW/zJsbyfh/iT/ZM5QNHE3CXxtLJbZsL+CzdJLBsPD7SedJZoUA4d8iAcN2IoMp/Dx80shOOd2x96X/g==} - hasBin: true + sc-istanbul@0.4.6: dependencies: abbrev: 1.0.9 async: 1.5.2 @@ -7590,66 +9431,40 @@ packages: supports-color: 3.2.3 which: 1.3.1 wordwrap: 1.0.0 - dev: true - /scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 - dev: true - /scrypt-js@3.0.1: - resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + scrypt-js@3.0.1: {} - /secp256k1@4.0.3: - resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==} - engines: {node: '>=10.0.0'} - requiresBuild: true + secp256k1@4.0.3: dependencies: elliptic: 6.5.7 node-addon-api: 2.0.2 - node-gyp-build: 4.8.1 + node-gyp-build: 4.8.2 - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true + semver@7.5.4: dependencies: lru-cache: 6.0.0 - dev: true - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - dev: true + semver@7.6.3: {} - /serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.0: dependencies: randombytes: 2.1.0 - dev: true - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: true + set-blocking@2.0.0: {} - /set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -7657,81 +9472,52 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 - dev: true - /set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 - dev: true - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + setimmediate@1.0.5: {} - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + setprototypeof@1.2.0: {} - /sha.js@2.4.11: - resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} - hasBin: true + sha.js@2.4.11: dependencies: inherits: 2.0.4 safe-buffer: 5.2.1 - /sha1@1.1.1: - resolution: {integrity: sha512-dZBS6OrMjtgVkopB1Gmo4RQCDKiZsqcpAQpkV/aaj+FCrCg8r4I4qMkDPQjBgLIxlmu9k4nUbWq6ohXahOneYA==} + sha1@1.1.1: dependencies: charenc: 0.0.2 crypt: 0.0.2 - dev: true - /shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - dev: true + shallowequal@1.1.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - dev: true - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true + shebang-regex@3.0.0: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - dev: true - /side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + side-channel@1.0.6: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.2 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: true + signal-exit@3.0.7: {} - /sinon@14.0.2: - resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} - deprecated: 16.1.1 + sinon@14.0.2: dependencies: '@sinonjs/commons': 2.0.0 '@sinonjs/fake-timers': 9.1.2 @@ -7739,33 +9525,22 @@ packages: diff: 5.2.0 nise: 5.1.9 supports-color: 7.2.0 - dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: false + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true + slash@3.0.0: {} - /slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + slice-ansi@4.0.0: dependencies: ansi-styles: 4.3.0 astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - /solc@0.8.26(debug@4.3.6): - resolution: {integrity: sha512-yiPQNVf5rBFHwN6SIf3TUUvVAFKcQqmSUFeq+fb6pNRCo0ZCgpYOZDi3BVoezCPIAcKrVYd/qXlBLUP9wVrZ9g==} - engines: {node: '>=10.0.0'} - hasBin: true + solc@0.8.26(debug@4.3.7): dependencies: command-exists: 1.2.9 commander: 8.3.0 - follow-redirects: 1.15.6(debug@4.3.6) + follow-redirects: 1.15.8(debug@4.3.7) js-sha3: 0.8.0 memorystream: 0.3.1 semver: 5.7.2 @@ -7773,15 +9548,9 @@ packages: transitivePeerDependencies: - debug - /solidity-comments-extractor@0.0.7: - resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==} - dev: true + solidity-comments-extractor@0.0.7: {} - /solidity-coverage@0.8.12(hardhat@2.22.9): - resolution: {integrity: sha512-8cOB1PtjnjFRqOgwFiD8DaUsYJtVJ6+YdXQtSZDrLGf8cdhhh8xzTtGzVTGeBf15kTv0v7lYPJlV/az7zLEPJw==} - hasBin: true - peerDependencies: - hardhat: ^2.11.0 + solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)): dependencies: '@ethersproject/abi': 5.7.0 '@solidity-parser/parser': 0.18.0 @@ -7792,7 +9561,7 @@ packages: ghost-testrpc: 0.0.2 global-modules: 2.0.0 globby: 10.0.2 - hardhat: 2.22.9(ts-node@10.9.1)(typescript@5.5.4) + hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) jsonschema: 1.4.1 lodash: 4.17.21 mocha: 10.7.3 @@ -7803,35 +9572,22 @@ packages: semver: 7.6.3 shelljs: 0.8.5 web3-utils: 1.10.4 - dev: true - /source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - dev: true + source-map-js@1.2.0: {} - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map@0.2.0: - resolution: {integrity: sha512-CBdZ2oa/BHhS4xj5DlhjWNHcan57/5YuvfdLf17iVmIpd9KRm+DFLmC6nBNj+6Ua7Kt3TmOjDpQT1aTYOQtoUA==} - engines: {node: '>=0.8.0'} - requiresBuild: true + source-map@0.2.0: dependencies: amdefine: 1.0.1 - dev: true optional: true - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /spawn-wrap@2.0.0: - resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} - engines: {node: '>=8'} + spawn-wrap@2.0.0: dependencies: foreground-child: 2.0.0 is-windows: 1.0.2 @@ -7839,258 +9595,162 @@ packages: rimraf: 3.0.2 signal-exit: 3.0.7 which: 2.0.2 - dev: true - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.20 - dev: true - /spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - dev: true + spdx-exceptions@2.5.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 spdx-license-ids: 3.0.20 - dev: true - /spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} - dev: true + spdx-license-ids@3.0.20: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: false - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: true + sprintf-js@1.0.3: {} - /stacktrace-parser@0.1.10: - resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} - engines: {node: '>=6'} + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + statuses@2.0.1: {} - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - dev: true + string-argv@0.3.2: {} - /string-format@2.0.0: - resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} - dev: true + string-format@2.0.0: {} - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} + string-width@2.1.1: dependencies: is-fullwidth-code-point: 2.0.0 strip-ansi: 4.0.0 - dev: true - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.9: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-abstract: 1.23.3 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.7 define-properties: 1.2.1 es-object-atoms: 1.0.0 - dev: true - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - dev: true - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} + strip-ansi@4.0.0: dependencies: ansi-regex: 3.0.1 - dev: true - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-hex-prefix@1.0.0: - resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==} - engines: {node: '>=6.5.0', npm: '>=3'} + strip-hex-prefix@1.0.0: dependencies: is-hex-prefixed: 1.0.0 - /strip-indent@4.0.0: - resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==} - engines: {node: '>=12'} + strip-indent@4.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /strtok3@7.1.1: - resolution: {integrity: sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg==} - engines: {node: '>=16'} + strtok3@7.1.1: dependencies: '@tokenizer/token': 0.3.0 - peek-readable: 5.1.4 - dev: true + peek-readable: 5.2.0 - /styled-components@5.3.10(@babel/core@7.25.2)(react-dom@18.3.1)(react-is@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} - engines: {node: '>=10'} - peerDependencies: - react: '>= 16.8.0' - react-dom: '>= 16.8.0' - react-is: '>= 16.8.0' + styled-components@5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1): dependencies: '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) - '@babel/traverse': 7.25.4(supports-color@5.5.0) + '@babel/traverse': 7.25.6(supports-color@5.5.0) '@emotion/is-prop-valid': 1.3.0 '@emotion/stylis': 0.8.5 '@emotion/unitless': 0.7.5 - babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.10)(supports-color@5.5.0) + babel-plugin-styled-components: 2.1.4(@babel/core@7.25.2)(styled-components@5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1))(supports-color@5.5.0) css-to-react-native: 3.2.0 hoist-non-react-statics: 3.3.2 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-is: 18.3.1 + react-is: 16.13.1 shallowequal: 1.1.0 supports-color: 5.5.0 transitivePeerDependencies: - '@babel/core' - dev: true - /stylis@4.3.4: - resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} - dev: true + stylis@4.3.4: {} - /supports-color@3.2.3: - resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} - engines: {node: '>=0.8.0'} + supports-color@3.2.3: dependencies: has-flag: 1.0.0 - dev: true - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true + supports-preserve-symlinks-flag@1.0.0: {} - /sync-request@6.1.0: - resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} - engines: {node: '>=8.0.0'} + sync-request@6.1.0: dependencies: http-response-object: 3.0.2 sync-rpc: 1.3.6 then-request: 6.0.2 - dev: true - /sync-rpc@1.3.6: - resolution: {integrity: sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==} + sync-rpc@1.3.6: dependencies: get-port: 3.2.0 - dev: true - /table-layout@1.0.2: - resolution: {integrity: sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==} - engines: {node: '>=8.0.0'} + table-layout@1.0.2: dependencies: array-back: 4.0.2 deep-extend: 0.6.0 typical: 5.2.0 wordwrapjs: 4.0.1 - dev: true - /table@6.8.2: - resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} - engines: {node: '>=10.0.0'} + table@6.8.2: dependencies: ajv: 8.17.1 lodash.truncate: 4.4.2 @@ -8098,42 +9758,26 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /temp-dir@3.0.0: - resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} - engines: {node: '>=14.16'} - dev: true + temp-dir@3.0.0: {} - /tempy@3.1.0: - resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} - engines: {node: '>=14.16'} + tempy@3.1.0: dependencies: is-stream: 3.0.0 temp-dir: 3.0.0 type-fest: 2.19.0 unique-string: 3.0.0 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - dev: true - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /then-request@6.0.2: - resolution: {integrity: sha512-3ZBiG7JvP3wbDzA9iNY5zJQcHL4jn/0BWtXIkagfz7QgOL/LqjCEOBQuJNZfu0XYnv5JhKh+cDxCPM4ILrqruA==} - engines: {node: '>=6.0.0'} + then-request@6.0.2: dependencies: '@types/concat-stream': 1.6.1 '@types/form-data': 0.0.33 @@ -8146,96 +9790,53 @@ packages: http-response-object: 3.0.2 promise: 8.3.0 qs: 6.13.0 - dev: true - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: false - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: true + titleize@3.0.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + toidentifier@1.0.1: {} - /token-types@5.0.1: - resolution: {integrity: sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg==} - engines: {node: '>=14.16'} + token-types@5.0.1: dependencies: '@tokenizer/token': 0.3.0 ieee754: 1.2.1 - dev: true - /trim-newlines@4.1.1: - resolution: {integrity: sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==} - engines: {node: '>=12'} - dev: true + trim-newlines@4.1.1: {} - /ts-command-line-args@2.5.1: - resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} - hasBin: true + ts-command-line-args@2.5.1: dependencies: chalk: 4.1.2 command-line-args: 5.2.1 command-line-usage: 6.1.3 string-format: 2.0.0 - dev: true - /ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - dev: true + ts-dedent@2.2.0: {} - /ts-essentials@7.0.3(typescript@5.5.4): - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' + ts-essentials@7.0.3(typescript@5.5.4): dependencies: typescript: 5.5.4 - dev: true - /ts-node@10.9.1(@types/node@18.19.45)(typescript@5.5.4): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.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.45 + '@types/node': 18.19.50 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -8246,104 +9847,58 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + tslib@1.14.1: {} - /tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + tslib@2.4.0: {} - /tsort@0.0.1: - resolution: {integrity: sha512-Tyrf5mxF8Ofs1tNoxA13lFeZ2Zrbd6cKbuH3V+MQ5sb6DtBj5FjrXVsRWT8YvNAQTqNoz66dz1WsbigI22aEnw==} + tsort@0.0.1: {} - /tsutils@3.21.0(typescript@5.5.4): - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - 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' + tsutils@3.21.0(typescript@5.5.4): dependencies: tslib: 1.14.1 typescript: 5.5.4 - dev: true - /tweetnacl-util@0.15.1: - resolution: {integrity: sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==} + tweetnacl-util@0.15.1: {} - /tweetnacl@1.0.3: - resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + tweetnacl@1.0.3: {} - /type-check@0.3.2: - resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==} - engines: {node: '>= 0.8.0'} + type-check@0.3.2: dependencies: prelude-ls: 1.1.2 - dev: true - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true + type-detect@4.0.8: {} - /type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} - dev: true + type-detect@4.1.0: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.7.1: - resolution: {integrity: sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==} - engines: {node: '>=8'} + type-fest@0.7.1: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - dev: true + type-fest@1.4.0: {} - /type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - dev: true + type-fest@2.19.0: {} - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - dev: true + type-fest@3.13.1: {} - /typechain@8.3.2(typescript@5.5.4): - resolution: {integrity: sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==} - hasBin: true - peerDependencies: - typescript: '>=4.3.0' + typechain@8.3.2(typescript@5.5.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.6(supports-color@5.5.0) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 @@ -8355,31 +9910,22 @@ packages: typescript: 5.5.4 transitivePeerDependencies: - supports-color - dev: true - /typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + typed-array-byte-length@1.0.1: dependencies: call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + typed-array-byte-offset@1.0.2: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 @@ -8387,11 +9933,8 @@ packages: gopd: 1.0.1 has-proto: 1.0.3 is-typed-array: 1.1.13 - dev: true - /typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + typed-array-length@1.0.6: dependencies: call-bind: 1.0.7 for-each: 0.3.3 @@ -8399,264 +9942,123 @@ packages: has-proto: 1.0.3 is-typed-array: 1.1.13 possible-typed-array-names: 1.0.0 - dev: true - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - dev: true - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true - - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true + typedarray@0.0.6: {} - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.3.3: {} - /typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.5.4: {} - /typical@4.0.0: - resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} - engines: {node: '>=8'} - dev: true + typical@4.0.0: {} - /typical@5.2.0: - resolution: {integrity: sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==} - engines: {node: '>=8'} - dev: true + typical@5.2.0: {} - /uglify-js@3.19.2: - resolution: {integrity: sha512-S8KA6DDI47nQXJSi2ctQ629YzwOVs+bQML6DAtvy0wgNdpi+0ySpQK0g2pxBq2xfF2z3YCscu7NNA8nXT9PlIQ==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.19.3: optional: true - /unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.0.2: dependencies: call-bind: 1.0.7 has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + undici-types@5.26.5: {} - /undici@5.28.4: - resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} - engines: {node: '>=14.0'} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 - /unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} + unique-string@3.0.0: dependencies: crypto-random-string: 4.0.0 - dev: true - /unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + unist-util-stringify-position@3.0.3: dependencies: '@types/unist': 2.0.11 - dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + universalify@0.1.2: {} - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} + universalify@2.0.1: {} - /unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + unpipe@1.0.0: {} - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: true + untildify@4.0.0: {} - /update-browserslist-db@1.1.0(browserslist@4.23.3): - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 - escalade: 3.1.2 - picocolors: 1.0.1 - dev: true + escalade: 3.2.0 + picocolors: 1.1.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - dev: true - /utf8@3.0.0: - resolution: {integrity: sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==} - dev: true + utf8@3.0.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true + uuid@8.3.2: {} - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: true + uuid@9.0.1: {} - /uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true + uvu@0.5.6: dependencies: dequal: 2.0.3 diff: 5.2.0 kleur: 4.1.5 sade: 1.8.1 - dev: true - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache-lib@3.0.1: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - dev: true - - /validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} - engines: {node: '>= 0.10'} - dev: true - /viem@2.20.0(typescript@5.0.4): - resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true - 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) - isows: 1.0.4(ws@8.17.1) - typescript: 5.0.4 - webauthn-p256: 0.0.5 - ws: 8.17.1 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - zod + validator@13.12.0: {} - /viem@2.20.0(typescript@5.5.4): - resolution: {integrity: sha512-cM4vs81HnSNbfceI1MLkx4pCVzbVjl9xiNSv5SCutYjUyFFOVSPDlEyhpg2iHinxx1NM4Qne3END5eLT8rvUdg==} - peerDependencies: - typescript: '>=5.0.4' - peerDependenciesMeta: - typescript: - optional: true + viem@2.21.2(typescript@5.5.4): 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 + '@scure/bip39': 1.4.0 abitype: 1.0.5(typescript@5.5.4) isows: 1.0.4(ws@8.17.1) - typescript: 5.5.4 webauthn-p256: 0.0.5 ws: 8.17.1 + optionalDependencies: + typescript: 5.5.4 transitivePeerDependencies: - bufferutil - utf-8-validate - zod - dev: true - /vite-plugin-singlefile@2.0.2(rollup@4.21.0)(vite@5.4.2): - resolution: {integrity: sha512-Z2ou6HcvED5CF0hM+vcFSaFa+klyS8RyyLxW0PbMRLnMbvzTI6ueWyxdYNFhpuXZgz/aj6+E/dHFTdEcw6gb9w==} - engines: {node: '>18.0.0'} - peerDependencies: - rollup: ^4.18.0 - vite: ^5.3.1 + vite-plugin-singlefile@2.0.2(rollup@4.21.2)(vite@5.4.3(@types/node@18.19.50)): dependencies: micromatch: 4.0.8 - rollup: 4.21.0 - vite: 5.4.2(@types/node@18.19.45) - dev: true + rollup: 4.21.2 + vite: 5.4.3(@types/node@18.19.50) - /vite@5.4.2(@types/node@18.19.45): - resolution: {integrity: sha512-dDrQTRHp5C1fTFzcSaMxjk6vdpKvT+2/mIdE07Gw2ykehT49O0z/VHS3zZ8iV/Gh8BJJKHWOe5RjaNrW5xf/GA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true + vite@5.4.3(@types/node@18.19.50): dependencies: - '@types/node': 18.19.45 esbuild: 0.21.5 - postcss: 8.4.41 - rollup: 4.21.0 + postcss: 8.4.45 + rollup: 4.21.2 optionalDependencies: + '@types/node': 18.19.50 fsevents: 2.3.3 - dev: true - /web-worker@1.3.0: - resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} - dev: true + web-worker@1.3.0: {} - /web3-utils@1.10.4: - resolution: {integrity: sha512-tsu8FiKJLk2PzhDl9fXbGUWTkkVXYhtTA+SmEFkKft+9BgwLxfCRpU96sWv7ICC8zixBNd3JURVoiR3dUXgP8A==} - engines: {node: '>=8.0.0'} + web3-utils@1.10.4: dependencies: '@ethereumjs/util': 8.1.0 bn.js: 5.2.1 @@ -8666,199 +10068,109 @@ packages: number-to-bn: 1.7.0 randombytes: 2.1.0 utf8: 3.0.0 - dev: true - /webauthn-p256@0.0.5: - resolution: {integrity: sha512-drMGNWKdaixZNobeORVIqq7k5DsRC9FnG201K2QjeOoQLmtSDaSsVZdkg6n5jUALJKcAG++zBPJXmv6hy0nWFg==} + webauthn-p256@0.0.5: dependencies: '@noble/curves': 1.4.0 '@noble/hashes': 1.4.0 - /which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-boxed-primitive@1.0.2: dependencies: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true - /which-module@2.0.1: - resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: true + which-module@2.0.1: {} - /which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.15: dependencies: available-typed-arrays: 1.0.7 call-bind: 1.0.7 for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.2 - dev: true - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - dev: true - /widest-line@3.1.0: - resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} - engines: {node: '>=8'} + widest-line@3.1.0: dependencies: string-width: 4.2.3 - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /wordwrapjs@4.0.1: - resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} - engines: {node: '>=8.0.0'} + wordwrapjs@4.0.1: dependencies: reduce-flatten: 2.0.0 typical: 5.2.0 - dev: true - /workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - dev: true + workerpool@6.2.0: {} - /workerpool@6.5.1: - resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + workerpool@6.5.1: {} - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@3.0.3: dependencies: imurmurhash: 0.1.4 is-typedarray: 1.0.0 signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - dev: true - /ws@7.4.6: - resolution: {integrity: sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - dev: true + ws@7.4.6: {} - /ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@7.5.10: {} - /ws@8.17.1: - resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true + ws@8.17.1: {} - /y18n@4.0.3: - resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: true + y18n@4.0.3: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true + yallist@4.0.0: {} - /yargs-parser@18.1.3: - resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} - engines: {node: '>=6'} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 decamelize: 1.2.0 - dev: true - /yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + yargs-parser@20.2.4: {} - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - dev: true + yargs-parser@21.1.1: {} - /yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} + yargs-unparser@2.0.0: dependencies: camelcase: 6.3.0 decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 - /yargs@15.4.1: - resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} - engines: {node: '>=8'} + yargs@15.4.1: dependencies: cliui: 6.0.0 decamelize: 1.2.0 @@ -8871,41 +10183,27 @@ packages: which-module: 2.0.1 y18n: 4.0.3 yargs-parser: 18.1.3 - dev: true - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 - escalade: 3.1.2 + escalade: 3.2.0 get-caller-file: 2.0.5 require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.4 - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.1.1: {} - /z-schema@5.0.5: - resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} - engines: {node: '>=8.0.0'} - hasBin: true + z-schema@5.0.5: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 validator: 13.12.0 optionalDependencies: commander: 9.5.0 - dev: true From 6476b089de095f6d41c61f33ab0d910a705231ec Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 16 Sep 2024 07:20:36 -0400 Subject: [PATCH 1266/1302] update L2 fees logic --- examples/fee-tester/.eslintrc.js | 14 +++++++ examples/fee-tester/.gitignore | 13 +++++++ examples/fee-tester/.prettierignore | 5 +++ examples/fee-tester/README.md | 1 + examples/fee-tester/contracts/FeeTester.sol | 16 ++++++++ examples/fee-tester/hardhat.config.js | 7 ++++ .../ignition/modules/FeeTesterModule.js | 12 ++++++ examples/fee-tester/package.json | 18 +++++++++ packages/core/src/deploy.ts | 6 +++ packages/core/src/internal/defaultConfig.ts | 1 + packages/core/src/internal/deployer.ts | 10 +++-- .../internal/execution/execution-engine.ts | 6 ++- .../future-processor/future-processor.ts | 7 +++- .../handlers/monitor-onchain-interaction.ts | 10 ++++- .../src/internal/execution/jsonrpc-client.ts | 37 ++++++++++++++++--- packages/core/src/types/deploy.ts | 5 +++ packages/core/src/types/execution-events.ts | 1 + .../helpers/network-interaction-execution.ts | 6 ++- .../test/execution/future-processor/utils.ts | 3 +- packages/hardhat-plugin/src/index.ts | 5 +++ .../hardhat-plugin/src/type-extensions.ts | 8 ++++ .../src/ui/pretty-event-handler.ts | 2 + packages/hardhat-plugin/src/ui/types.ts | 1 + packages/hardhat-plugin/test/config.ts | 16 ++++++++ .../with-config/hardhat.config.js | 3 ++ .../test/test-helpers/use-ignition-project.ts | 1 + .../ui/helpers/calculate-batch-display.ts | 1 + ...alculate-deploying-module-panel-display.ts | 1 + 28 files changed, 199 insertions(+), 17 deletions(-) create mode 100644 examples/fee-tester/.eslintrc.js create mode 100644 examples/fee-tester/.gitignore create mode 100644 examples/fee-tester/.prettierignore create mode 100644 examples/fee-tester/README.md create mode 100644 examples/fee-tester/contracts/FeeTester.sol create mode 100644 examples/fee-tester/hardhat.config.js create mode 100644 examples/fee-tester/ignition/modules/FeeTesterModule.js create mode 100644 examples/fee-tester/package.json diff --git a/examples/fee-tester/.eslintrc.js b/examples/fee-tester/.eslintrc.js new file mode 100644 index 0000000000..eca768e2f9 --- /dev/null +++ b/examples/fee-tester/.eslintrc.js @@ -0,0 +1,14 @@ +module.exports = { + extends: ["plugin:prettier/recommended"], + parserOptions: { + ecmaVersion: "latest", + }, + env: { + es6: true, + node: true, + }, + rules: { + "no-console": "error", + }, + ignorePatterns: [".eslintrc.js", "artifacts/*", "cache/*"], +}; diff --git a/examples/fee-tester/.gitignore b/examples/fee-tester/.gitignore new file mode 100644 index 0000000000..2b8069dd92 --- /dev/null +++ b/examples/fee-tester/.gitignore @@ -0,0 +1,13 @@ +node_modules +.env +coverage +coverage.json +typechain +typechain-types + +#Hardhat files +cache +artifacts + +ignition/deployments + diff --git a/examples/fee-tester/.prettierignore b/examples/fee-tester/.prettierignore new file mode 100644 index 0000000000..6da739a76c --- /dev/null +++ b/examples/fee-tester/.prettierignore @@ -0,0 +1,5 @@ +/node_modules +/artifacts +/cache +/coverage +/.nyc_output diff --git a/examples/fee-tester/README.md b/examples/fee-tester/README.md new file mode 100644 index 0000000000..4fddc8ef3d --- /dev/null +++ b/examples/fee-tester/README.md @@ -0,0 +1 @@ +# Hardhat Fee Tester for Hardhat Ignition diff --git a/examples/fee-tester/contracts/FeeTester.sol b/examples/fee-tester/contracts/FeeTester.sol new file mode 100644 index 0000000000..a76dbdf57c --- /dev/null +++ b/examples/fee-tester/contracts/FeeTester.sol @@ -0,0 +1,16 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.9; + + +contract FeeTester { + address public owner; + + constructor() { + owner = msg.sender; + } + + // arbitrary function to call during fee testing + function deleteOwner() public { + delete owner; + } +} diff --git a/examples/fee-tester/hardhat.config.js b/examples/fee-tester/hardhat.config.js new file mode 100644 index 0000000000..c0eacc6fda --- /dev/null +++ b/examples/fee-tester/hardhat.config.js @@ -0,0 +1,7 @@ +require("@nomicfoundation/hardhat-toolbox"); +require("@nomicfoundation/hardhat-ignition-ethers"); + +/** @type import('hardhat/config').HardhatUserConfig */ +module.exports = { + solidity: "0.8.19", +}; diff --git a/examples/fee-tester/ignition/modules/FeeTesterModule.js b/examples/fee-tester/ignition/modules/FeeTesterModule.js new file mode 100644 index 0000000000..36dc5f22af --- /dev/null +++ b/examples/fee-tester/ignition/modules/FeeTesterModule.js @@ -0,0 +1,12 @@ +// ./ignition/FeeTesterModule.js +const { buildModule } = require("@nomicfoundation/hardhat-ignition/modules"); + +module.exports = buildModule("FeeTesterModule", (m) => { + const feeTester1 = m.contract("FeeTester"); + + m.call(feeTester1, "deleteOwner"); + + const feeTester2 = m.contract("FeeTester", [], { id: "feeTester2" }); + + return { feeTester1, feeTester2 }; +}); diff --git a/examples/fee-tester/package.json b/examples/fee-tester/package.json new file mode 100644 index 0000000000..b3d4080752 --- /dev/null +++ b/examples/fee-tester/package.json @@ -0,0 +1,18 @@ +{ + "name": "@nomicfoundation/ignition-fee-tester-example", + "private": true, + "version": "0.15.2", + "scripts": { + "test": "hardhat test", + "lint": "npm run prettier -- --check && npm run eslint", + "lint:fix": "npm run prettier -- --write && npm run eslint -- --fix", + "eslint": "eslint \"ignition/**/*.{js,jsx}\" \"test/**/*.{js,jsx}\"", + "prettier": "prettier \"*.{js,md,json}\" \"ignition/modules/*.{js,md,json}\" \"test/*.{js,md,json}\" \"contracts/**/*.sol\"" + }, + "devDependencies": { + "@nomicfoundation/hardhat-ignition-ethers": "workspace:^", + "@nomicfoundation/hardhat-toolbox": "4.0.0", + "hardhat": "^2.18.0", + "prettier-plugin-solidity": "1.1.3" + } +} diff --git a/packages/core/src/deploy.ts b/packages/core/src/deploy.ts index bed82f4016..68d81293f6 100644 --- a/packages/core/src/deploy.ts +++ b/packages/core/src/deploy.ts @@ -53,6 +53,8 @@ export async function deploy< strategyConfig, maxFeePerGasLimit, maxPriorityFeePerGas, + gasPrice, + disableFeeBumping, }: { config?: Partial; artifactResolver: ArtifactResolver; @@ -71,6 +73,8 @@ export async function deploy< strategyConfig?: StrategyConfig[StrategyT]; maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; }): Promise { const executionStrategy: ExecutionStrategy = resolveStrategy( strategy, @@ -117,6 +121,7 @@ export async function deploy< const jsonRpcClient = new EIP1193JsonRpcClient(provider, { maxFeePerGasLimit, maxPriorityFeePerGas, + gasPrice, }); const isAutominedNetwork = await checkAutominedNetwork(provider); @@ -126,6 +131,7 @@ export async function deploy< requiredConfirmations: isAutominedNetwork ? DEFAULT_AUTOMINE_REQUIRED_CONFIRMATIONS : config.requiredConfirmations ?? defaultConfig.requiredConfirmations, + disableFeeBumping: disableFeeBumping ?? defaultConfig.disableFeeBumping, ...config, }; diff --git a/packages/core/src/internal/defaultConfig.ts b/packages/core/src/internal/defaultConfig.ts index e357867e40..3d7670ffbf 100644 --- a/packages/core/src/internal/defaultConfig.ts +++ b/packages/core/src/internal/defaultConfig.ts @@ -8,6 +8,7 @@ export const defaultConfig: DeployConfig = { timeBeforeBumpingFees: 3 * 60 * 1_000, maxFeeBumps: 4, requiredConfirmations: 5, + disableFeeBumping: false, }; /** diff --git a/packages/core/src/internal/deployer.ts b/packages/core/src/internal/deployer.ts index 1aaa7837ad..e264e1d03f 100644 --- a/packages/core/src/internal/deployer.ts +++ b/packages/core/src/internal/deployer.ts @@ -83,7 +83,8 @@ export class Deployer { ignitionModule.id, this._deploymentDir, isResumed, - this._config.maxFeeBumps + this._config.maxFeeBumps, + this._config.disableFeeBumping ); const contracts = @@ -188,7 +189,8 @@ export class Deployer { this._config.requiredConfirmations, this._config.timeBeforeBumpingFees, this._config.maxFeeBumps, - this._config.blockPollingInterval + this._config.blockPollingInterval, + this._config.disableFeeBumping ); deploymentState = await executionEngine.executeModule( @@ -270,7 +272,8 @@ export class Deployer { moduleId: string, deploymentDir: string | undefined, isResumed: boolean, - maxFeeBumps: number + maxFeeBumps: number, + disableFeeBumping: boolean ): void { if (this._executionEventListener === undefined) { return; @@ -282,6 +285,7 @@ export class Deployer { deploymentDir: deploymentDir ?? undefined, isResumed, maxFeeBumps, + disableFeeBumping, }); } diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/core/src/internal/execution/execution-engine.ts index 29aeb677b9..f511bae7c1 100644 --- a/packages/core/src/internal/execution/execution-engine.ts +++ b/packages/core/src/internal/execution/execution-engine.ts @@ -42,7 +42,8 @@ export class ExecutionEngine { private readonly _requiredConfirmations: number, private readonly _millisecondBeforeBumpingFees: number, private readonly _maxFeeBumps: number, - private readonly _blockPollingInterval: number + private readonly _blockPollingInterval: number, + private readonly _disableFeeBumping: boolean ) {} /** @@ -98,7 +99,8 @@ export class ExecutionEngine { this._maxFeeBumps, accounts, deploymentParameters, - defaultSender + defaultSender, + this._disableFeeBumping ); const futures = getFuturesFromModule(module); diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/core/src/internal/execution/future-processor/future-processor.ts index 32c2ed4219..293da6f570 100644 --- a/packages/core/src/internal/execution/future-processor/future-processor.ts +++ b/packages/core/src/internal/execution/future-processor/future-processor.ts @@ -49,7 +49,8 @@ export class FutureProcessor { private readonly _maxFeeBumps: number, private readonly _accounts: string[], private readonly _deploymentParameters: DeploymentParameters, - private readonly _defaultSender: string + private readonly _defaultSender: string, + private readonly _disableFeeBumping: boolean ) {} /** @@ -209,7 +210,9 @@ export class FutureProcessor { this._transactionTrackingTimer, this._requiredConfirmations, this._millisecondBeforeBumpingFees, - this._maxFeeBumps + this._maxFeeBumps, + undefined, + this._disableFeeBumping ); } } diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts index a0528271df..b6f7be76b9 100644 --- a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts +++ b/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts @@ -52,6 +52,8 @@ export interface GetTransactionRetryConfig { * of a transaction. * @param maxFeeBumps The maximum number of times we can bump the fees of a transaction * before considering the onchain interaction timed out. + * @param getTransactionRetryConfig This is really only a parameter to help with testing this function + * @param disableFeeBumping Disables fee bumping for all transactions. * @returns A message indicating the result of checking the transactions of the latest * network interaction. */ @@ -68,7 +70,8 @@ export async function monitorOnchainInteraction( getTransactionRetryConfig: GetTransactionRetryConfig = { maxRetries: 10, retryInterval: 1000, - } + }, + disableFeeBumping: boolean ): Promise< | TransactionConfirmMessage | OnchainInteractionBumpFeesMessage @@ -143,7 +146,10 @@ export async function monitorOnchainInteraction( return undefined; } - if (lastNetworkInteraction.transactions.length > maxFeeBumps) { + if ( + disableFeeBumping || + lastNetworkInteraction.transactions.length > maxFeeBumps + ) { return { type: JournalMessageType.ONCHAIN_INTERACTION_TIMEOUT, futureId: exState.id, diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index c71449f35f..17b76d81ce 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -192,6 +192,7 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { private readonly _config?: { maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; } ) {} @@ -643,9 +644,13 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { ]); // We prioritize EIP-1559 fees over legacy gasPrice fees, however, - // polygon (chainId 137) requires legacy gasPrice fees - // so we skip EIP-1559 logic in that case - if (latestBlock.baseFeePerGas !== undefined && chainId !== 137) { + // polygon (chainId 137) and polygon's amoy testnet (chainId 80002) + // both require legacy gasPrice fees so we skip EIP-1559 logic in those cases + if ( + latestBlock.baseFeePerGas !== undefined && + chainId !== 137 && + chainId !== 80002 + ) { // Support zero gas fee chains, such as a private instances // of blockchains using Besu. We explicitly exclude BNB // Smartchain (chainId 56) and its testnet (chainId 97) @@ -674,6 +679,28 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { }; } + /** + * Polygon amoy testnet (chainId 80002) currently has a bug causing the + * `eth_gasPrice` RPC call to return an amount that is way too high. + * We hardcode the gas price for this chain for now until the bug is fixed. + * See: https://github.com/maticnetwork/bor/issues/1213 + * + * Note that at the time of this implementation, the issue was autoclosed by a bot + * as a maintainer had not responded to the issue yet. Users continue to report + * the bug in the issue comments, however. + * + * All of that to say, when evaluating whether this logic is still needed in the future, + * it will likely be required to read through the issue above, rather than relying on the + * status of the github issue itself. + */ + if (chainId === 80002) { + return { gasPrice: 32000000000n }; + } + + if (this._config?.gasPrice !== undefined) { + return { gasPrice: this._config.gasPrice }; + } + const response = await this._provider.request({ method: "eth_gasPrice", params: [], @@ -699,7 +726,7 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { } try { - return await this._getMaxPrioirtyFeePerGas(); + return await this._getMaxPriorityFeePerGas(); } catch { // the max priority fee RPC call is not supported by // this chain @@ -708,7 +735,7 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { return DEFAULT_MAX_PRIORITY_FEE_PER_GAS; } - private async _getMaxPrioirtyFeePerGas(): Promise { + private async _getMaxPriorityFeePerGas(): Promise { const fee = await this._provider.request({ method: "eth_maxPriorityFeePerGas", }); diff --git a/packages/core/src/types/deploy.ts b/packages/core/src/types/deploy.ts index a3c404b41d..a11a10cac5 100644 --- a/packages/core/src/types/deploy.ts +++ b/packages/core/src/types/deploy.ts @@ -28,6 +28,11 @@ export interface DeployConfig { * a transaction to be confirmed during Ignition execution. */ requiredConfirmations: number; + + /** + * Disables fee bumping for all transactions. + */ + disableFeeBumping: boolean; } /** diff --git a/packages/core/src/types/execution-events.ts b/packages/core/src/types/execution-events.ts index 35c6a84337..5d328ee728 100644 --- a/packages/core/src/types/execution-events.ts +++ b/packages/core/src/types/execution-events.ts @@ -83,6 +83,7 @@ export interface DeploymentStartEvent { deploymentDir: string | undefined; isResumed: boolean; maxFeeBumps: number; + disableFeeBumping: boolean; } /** diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts index c943c062a5..3a343fe9a6 100644 --- a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts +++ b/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts @@ -242,7 +242,8 @@ describe("Network interactions", () => { requiredConfirmations, millisecondBeforeBumpingFees, maxFeeBumps, - testGetTransactionRetryConfig + testGetTransactionRetryConfig, + false ); if (message === undefined) { @@ -286,7 +287,8 @@ describe("Network interactions", () => { requiredConfirmations, millisecondBeforeBumpingFees, maxFeeBumps, - testGetTransactionRetryConfig + testGetTransactionRetryConfig, + false ), /IGN401: Error while executing test: all the transactions of its network interaction 1 were dropped\. Please try rerunning Hardhat Ignition\./ ); diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/core/test/execution/future-processor/utils.ts index c37ded4177..26a011ccec 100644 --- a/packages/core/test/execution/future-processor/utils.ts +++ b/packages/core/test/execution/future-processor/utils.ts @@ -64,7 +64,8 @@ export async function setupFutureProcessor( 100, // maxFeeBumps exampleAccounts, {}, - getDefaultSender(exampleAccounts) + getDefaultSender(exampleAccounts), + false // disableFeeBumping ); return { processor, storedDeployedAddresses }; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index edc74bb667..8e38c0017e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -55,6 +55,8 @@ extendConfig((config, userConfig) => { config.networks[networkName].ignition = { maxFeePerGasLimit: userNetworkConfig.ignition?.maxFeePerGasLimit, maxPriorityFeePerGas: userNetworkConfig.ignition?.maxPriorityFeePerGas, + gasPrice: userNetworkConfig.ignition?.gasPrice, + disableFeeBumping: userNetworkConfig.ignition?.disableFeeBumping, }; }); @@ -325,6 +327,9 @@ ignitionScope maxPriorityFeePerGas: hre.config.networks[hre.network.name]?.ignition .maxPriorityFeePerGas, + gasPrice: hre.config.networks[hre.network.name]?.ignition.gasPrice, + disableFeeBumping: + hre.config.networks[hre.network.name]?.ignition.disableFeeBumping, }); try { diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index c87988ef68..e793532601 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -17,6 +17,8 @@ declare module "hardhat/types/config" { ignition?: { maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; }; } @@ -24,6 +26,8 @@ declare module "hardhat/types/config" { ignition: { maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; }; } @@ -31,6 +35,8 @@ declare module "hardhat/types/config" { ignition?: { maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; }; } @@ -38,6 +44,8 @@ declare module "hardhat/types/config" { ignition: { maxFeePerGasLimit?: bigint; maxPriorityFeePerGas?: bigint; + gasPrice?: bigint; + disableFeeBumping?: boolean; }; } diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts index ec503f6f19..a5d7070fe4 100644 --- a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts +++ b/packages/hardhat-plugin/src/ui/pretty-event-handler.ts @@ -66,6 +66,7 @@ export class PrettyEventHandler implements ExecutionEventListener { warnings: [], isResumed: null, maxFeeBumps: 0, + disableFeeBumping: null, gasBumps: {}, strategy: null, ledger: false, @@ -94,6 +95,7 @@ export class PrettyEventHandler implements ExecutionEventListener { deploymentDir: event.deploymentDir, isResumed: event.isResumed, maxFeeBumps: event.maxFeeBumps, + disableFeeBumping: event.disableFeeBumping, }; process.stdout.write(calculateStartingMessage(this.state)); diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-plugin/src/ui/types.ts index 40e805e47c..1eb6a1563d 100644 --- a/packages/hardhat-plugin/src/ui/types.ts +++ b/packages/hardhat-plugin/src/ui/types.ts @@ -64,6 +64,7 @@ export interface UiState { isResumed: boolean | null; maxFeeBumps: number; gasBumps: Record; + disableFeeBumping: boolean | null; strategy: string | null; ledger: boolean; ledgerMessage: string; diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-plugin/test/config.ts index d4a96b4bd4..05cc7a6c2f 100644 --- a/packages/hardhat-plugin/test/config.ts +++ b/packages/hardhat-plugin/test/config.ts @@ -39,6 +39,10 @@ describe("config", () => { }); }); + it("should apply disableFeeBumping at the top level", async function () { + assert.equal(loadedOptions.disableFeeBumping, true); + }); + it("should apply maxFeePerGasLimit", async function () { assert.equal( this.hre.config.networks.hardhat.ignition.maxFeePerGasLimit, @@ -53,9 +57,21 @@ describe("config", () => { ); }); + it("should apply gasPrice", async function () { + assert.equal(this.hre.config.networks.hardhat.ignition.gasPrice, 1n); + }); + + it("should apply disableFeeBumping at the network level", async function () { + assert.equal( + this.hre.config.networks.hardhat.ignition.disableFeeBumping, + false + ); + }); + it("should only have known config", () => { const configOptions: KeyListOf = [ "blockPollingInterval", + "disableFeeBumping", "maxFeeBumps", "requiredConfirmations", "strategyConfig", diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js index c1bfe3856f..1a2ca9a967 100644 --- a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js +++ b/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js @@ -9,6 +9,8 @@ module.exports = { ignition: { maxFeePerGasLimit: 2n, maxPriorityFeePerGas: 3n, + gasPrice: 1n, + disableFeeBumping: false, }, }, }, @@ -22,5 +24,6 @@ module.exports = { salt: "custom-salt", }, }, + disableFeeBumping: true, }, }; diff --git a/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts index 6a77dc0da0..7f2bbceb96 100644 --- a/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts +++ b/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts @@ -25,6 +25,7 @@ const defaultTestConfig: DeployConfig = { timeBeforeBumpingFees: 3 * 60 * 1000, blockPollingInterval: 200, requiredConfirmations: 1, + disableFeeBumping: false, }; export function useEphemeralIgnitionProject(fixtureProjectName: string) { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts index f77aa8a1f9..64559c3242 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts @@ -21,6 +21,7 @@ const exampleState: UiState = { warnings: [], isResumed: false, maxFeeBumps: 0, + disableFeeBumping: false, gasBumps: {}, strategy: null, ledger: false, diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts index 4fe05ab541..3fbbc7adbb 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts @@ -19,6 +19,7 @@ describe("ui - calculate starting message display", () => { warnings: [], isResumed: null, maxFeeBumps: 0, + disableFeeBumping: false, gasBumps: {}, strategy: "basic", ledger: false, From 4adcf6ce1066a192377447f4ddc642e698f8bd9c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 18 Sep 2024 03:31:47 -0400 Subject: [PATCH 1267/1302] top level disableFeeBumping should override network level --- packages/hardhat-plugin/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 8e38c0017e..4e3687cb8a 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -329,6 +329,7 @@ ignitionScope .maxPriorityFeePerGas, gasPrice: hre.config.networks[hre.network.name]?.ignition.gasPrice, disableFeeBumping: + hre.config.ignition.disableFeeBumping ?? hre.config.networks[hre.network.name]?.ignition.disableFeeBumping, }); From f3a5148c3b7cb18d77ed81026012e79ced501709 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 23 Sep 2024 06:42:39 -0400 Subject: [PATCH 1268/1302] implement svg zoom for mermaid diagram visualization --- packages/ui/package.json | 2 +- packages/ui/src/components/mermaid.tsx | 17 +++++ packages/ui/src/main.css | 13 ++++ pnpm-lock.yaml | 88 +++++++++++++++++--------- 4 files changed, 89 insertions(+), 31 deletions(-) diff --git a/packages/ui/package.json b/packages/ui/package.json index bca8a10051..40b59a29c9 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -14,7 +14,6 @@ "clean": "rimraf dist tsconfig.tsbuildinfo", "prepack": "pnpm build" }, - "dependencies": {}, "devDependencies": { "@fontsource/roboto": "^5.0.8", "@nomicfoundation/ignition-core": "workspace:^", @@ -32,6 +31,7 @@ "react-router-dom": "6.11.0", "react-tooltip": "^5.21.4", "styled-components": "5.3.10", + "svg-pan-zoom": "^3.6.1", "vite": "^5.0.0", "vite-plugin-singlefile": "^2.0.1" } diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index 8ef9b7c52c..50bb81e7a9 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -1,11 +1,13 @@ import React, { useEffect, useMemo } from "react"; import styled from "styled-components"; +import svgPanZoom from "svg-pan-zoom"; import { IgnitionModule, IgnitionModuleResult, } from "@nomicfoundation/ignition-core/ui-helpers"; import mermaid from "mermaid"; + import { toMermaid } from "../utils/to-mermaid"; export const Mermaid: React.FC<{ @@ -23,6 +25,7 @@ export const Mermaid: React.FC<{ useEffect(() => { mermaid.initialize({ + maxTextSize: 500000, flowchart: { padding: 50, }, @@ -31,6 +34,20 @@ export const Mermaid: React.FC<{ mermaid.contentLoaded(); }); + // requestAnimationFrame is used to ensure that the svgPanZoom is called after the svg is rendered + useEffect(() => { + requestAnimationFrame(() => { + setTimeout(() => { + svgPanZoom(".mermaid > svg", { + zoomEnabled: true, + controlIconsEnabled: true, + fit: true, + center: true, + }); + }, 0); + }); + }); + return (
    {diagram}
    diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 0a8c0c8e08..13b13163bc 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -45,11 +45,24 @@ body { /* mermaid styles */ +.mermaid { + background: #fbfbfb; +} + .mermaid * { font-family: "Roboto", sans-serif; font-size: 30px; } +.mermaid svg { + height: 300px; + vertical-align: middle; +} + +.mermaid span { + cursor: default; +} + .mermaid rect { rx: 5; ry: 5; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd727a9d1c..5634566435 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,7 +121,7 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 4.0.0(3ldts3gexhakbcnhhpvofqsyj4) hardhat: specifier: ^2.18.0 version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) @@ -136,7 +136,7 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 4.0.0(3ldts3gexhakbcnhhpvofqsyj4) hardhat: specifier: ^2.18.0 version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) @@ -151,7 +151,7 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 4.0.0(3ldts3gexhakbcnhhpvofqsyj4) hardhat: specifier: ^2.18.0 version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) @@ -170,7 +170,7 @@ importers: version: link:../../packages/hardhat-plugin-ethers '@nomicfoundation/hardhat-toolbox': specifier: 4.0.0 - version: 4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4) + version: 4.0.0(3ldts3gexhakbcnhhpvofqsyj4) hardhat: specifier: ^2.18.0 version: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) @@ -212,7 +212,7 @@ importers: version: 9.0.2 debug: specifier: ^4.3.2 - version: 4.3.7(supports-color@5.5.0) + version: 4.3.7(supports-color@8.1.1) ethers: specifier: ^6.7.0 version: 6.13.2 @@ -255,7 +255,7 @@ importers: version: 4.1.2 debug: specifier: ^4.3.2 - version: 4.3.7(supports-color@5.5.0) + version: 4.3.7(supports-color@8.1.1) fs-extra: specifier: ^10.0.0 version: 10.1.0 @@ -391,6 +391,9 @@ importers: styled-components: specifier: 5.3.10 version: 5.3.10(@babel/core@7.25.2)(react-dom@18.3.1(react@18.3.1))(react-is@16.13.1)(react@18.3.1) + svg-pan-zoom: + specifier: ^3.6.1 + version: 3.6.1 vite: specifier: ^5.0.0 version: 5.4.3(@types/node@18.19.50) @@ -2767,6 +2770,7 @@ packages: follow-redirects@1.15.8: resolution: {integrity: sha512-xgrmBhBToVKay1q2Tao5LI26B83UhrB/vM1avwVSDzt8rx3rO6AizBAaF46EgksTVr+rFTQaqZZ9MVBfUe4nig==} engines: {node: '>=4.0'} + deprecated: Browser detection issues fixed in v1.15.9 peerDependencies: debug: '*' peerDependenciesMeta: @@ -4472,6 +4476,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-pan-zoom@3.6.1: + resolution: {integrity: sha512-JaKkGHHfGvRrcMPdJWkssLBeWqM+Isg/a09H7kgNNajT1cX5AztDTNs+C8UzpCxjCTRrG34WbquwaovZbmSk9g==} + sync-request@6.1.0: resolution: {integrity: sha512-8fjNkrNlNCrVc/av+Jn+xxqfCjYaBoHqCsDz6mt030UMxJGr+GSfCV1dQt2gRtlL63+VPidwDVLr7V2OcTSdRw==} engines: {node: '>=8.0.0'} @@ -4990,10 +4997,10 @@ snapshots: '@babel/helpers': 7.25.6 '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.6(supports-color@5.5.0) + '@babel/traverse': 7.25.6 '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -5019,6 +5026,13 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 + '@babel/helper-module-imports@7.24.7': + dependencies: + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-imports@7.24.7(supports-color@5.5.0)': dependencies: '@babel/traverse': 7.25.6(supports-color@5.5.0) @@ -5029,10 +5043,10 @@ snapshots: '@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2)': dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.24.7(supports-color@5.5.0) + '@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.6(supports-color@5.5.0) + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color @@ -5040,7 +5054,7 @@ snapshots: '@babel/helper-simple-access@7.24.7': dependencies: - '@babel/traverse': 7.25.6(supports-color@5.5.0) + '@babel/traverse': 7.25.6 '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color @@ -5088,6 +5102,18 @@ snapshots: '@babel/parser': 7.25.6 '@babel/types': 7.25.6 + '@babel/traverse@7.25.6': + dependencies: + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 + debug: 4.3.7(supports-color@8.1.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/traverse@7.25.6(supports-color@5.5.0)': dependencies: '@babel/code-frame': 7.24.7 @@ -5207,7 +5233,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -5509,7 +5535,7 @@ snapshots: '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -5690,7 +5716,7 @@ snapshots: '@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))': dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) ethers: 6.13.2 hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) lodash.isequal: 4.5.0 @@ -5707,8 +5733,8 @@ snapshots: ethereumjs-util: 7.1.5 hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) - ? '@nomicfoundation/hardhat-toolbox@4.0.0(@nomicfoundation/hardhat-chai-matchers@2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@nomicfoundation/hardhat-verify@2.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(@typechain/hardhat@9.1.0(@typechain/ethers-v6@0.5.1(ethers@6.13.2)(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4))(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4)))(@types/chai@4.3.19)(@types/mocha@9.1.1)(@types/node@18.19.50)(chai@4.4.1)(ethers@6.13.2)(hardhat-gas-reporter@1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4))(solidity-coverage@0.8.13(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typechain@8.3.2(typescript@5.5.4))(typescript@5.5.4)' - : dependencies: + '@nomicfoundation/hardhat-toolbox@4.0.0(3ldts3gexhakbcnhhpvofqsyj4)': + dependencies: '@nomicfoundation/hardhat-chai-matchers': 2.0.7(@nomicfoundation/hardhat-ethers@3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)))(chai@4.4.1)(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-ethers': 3.0.8(ethers@6.13.2)(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) '@nomicfoundation/hardhat-network-helpers': 1.0.10(hardhat@2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4)) @@ -5733,7 +5759,7 @@ snapshots: '@ethersproject/address': 5.6.1 cbor: 8.1.0 chalk: 2.4.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) hardhat: 2.22.10(ts-node@10.9.1(@types/node@18.19.50)(typescript@5.5.4))(typescript@5.5.4) lodash.clonedeep: 4.5.0 semver: 6.3.1 @@ -6172,7 +6198,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.2 @@ -6197,7 +6223,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) eslint: 8.57.0 optionalDependencies: typescript: 5.5.4 @@ -6213,7 +6239,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.5.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.5.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) eslint: 8.57.0 tsutils: 3.21.0(typescript@5.5.4) optionalDependencies: @@ -6227,7 +6253,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -6300,7 +6326,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -7364,7 +7390,7 @@ snapshots: eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.0 eslint-module-utils: 2.10.0(@typescript-eslint/parser@5.62.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@5.62.0(eslint@8.57.0)(typescript@5.5.4))(eslint-plugin-import@2.29.0)(eslint@8.57.0))(eslint@8.57.0) @@ -7474,7 +7500,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -7774,7 +7800,7 @@ snapshots: follow-redirects@1.15.8(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) for-each@0.3.3: dependencies: @@ -8025,7 +8051,7 @@ snapshots: chalk: 2.4.2 chokidar: 3.6.0 ci-info: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) enquirer: 2.4.1 env-paths: 2.2.1 ethereum-cryptography: 1.2.0 @@ -8146,7 +8172,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -8361,7 +8387,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -8719,7 +8745,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -9733,6 +9759,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svg-pan-zoom@3.6.1: {} + sync-request@6.1.0: dependencies: http-response-object: 3.0.2 @@ -9898,7 +9926,7 @@ snapshots: typechain@8.3.2(typescript@5.5.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@8.1.1) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 From dfe0adfa6fdab0a140292cbc1dace74d5a2da4f0 Mon Sep 17 00:00:00 2001 From: Sebastien Guillemot Date: Tue, 24 Sep 2024 12:17:03 +0900 Subject: [PATCH 1269/1302] add writeLocalhostDeployment to deploy command --- packages/hardhat-plugin/src/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 4e3687cb8a..71366f9c46 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -98,6 +98,10 @@ ignitionScope .addOptionalParam("strategy", "Set the deployment strategy to use", "basic") .addFlag("reset", "Wipes the existing deployment state before deploying") .addFlag("verify", "Verify the deployment on Etherscan") + .addFlag( + "writeLocalhostDeployment", + "Write deployment information to disk even when running for in-memory networks" + ) .setDescription("Deploy a module to the specified network") .setAction( async ( @@ -109,6 +113,7 @@ ignitionScope reset, verify, strategy: strategyName, + writeLocalhostDeployment, }: { modulePath: string; parameters?: string; @@ -117,6 +122,7 @@ ignitionScope reset: boolean; verify: boolean; strategy: string; + writeLocalhostDeployment: boolean; }, hre ) => { @@ -152,7 +158,7 @@ ignitionScope const deploymentId = resolveDeploymentId(givenDeploymentId, chainId); const deploymentDir = - hre.network.name === "hardhat" + hre.network.name === "hardhat" && !writeLocalhostDeployment ? undefined : path.join(hre.config.paths.ignition, "deployments", deploymentId); From 0f1912ef1d08ea87abfdb2dfb37cb96d9ab53db0 Mon Sep 17 00:00:00 2001 From: Sebastien Guillemot Date: Wed, 25 Sep 2024 10:21:20 +0900 Subject: [PATCH 1270/1302] address PR feedback --- packages/hardhat-plugin/src/index.ts | 3 +- .../test/deploy/writeLocalhost.ts | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 packages/hardhat-plugin/test/deploy/writeLocalhost.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 71366f9c46..c1b0593bb9 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -100,7 +100,7 @@ ignitionScope .addFlag("verify", "Verify the deployment on Etherscan") .addFlag( "writeLocalhostDeployment", - "Write deployment information to disk even when running for in-memory networks" + "Write deployment information to disk when deploying to the in-memory network" ) .setDescription("Deploy a module to the specified network") .setAction( @@ -161,7 +161,6 @@ ignitionScope hre.network.name === "hardhat" && !writeLocalhostDeployment ? undefined : path.join(hre.config.paths.ignition, "deployments", deploymentId); - if (chainId !== 31337) { if (process.env.HARDHAT_IGNITION_CONFIRM_DEPLOYMENT === undefined) { const prompt = await Prompt({ diff --git a/packages/hardhat-plugin/test/deploy/writeLocalhost.ts b/packages/hardhat-plugin/test/deploy/writeLocalhost.ts new file mode 100644 index 0000000000..1d64e03b56 --- /dev/null +++ b/packages/hardhat-plugin/test/deploy/writeLocalhost.ts @@ -0,0 +1,55 @@ +import { assert } from "chai"; +import { pathExists, removeSync } from "fs-extra"; +import path from "path"; + +import { useEphemeralIgnitionProject } from "../test-helpers/use-ignition-project"; + +const fixtureProjectName = "minimal"; +const deploymentDir = path.join( + path.resolve(__dirname, `../fixture-projects/${fixtureProjectName}/ignition`), + "deployments", + "chain-31337" +); + +describe("localhost deployment flag", function () { + useEphemeralIgnitionProject(fixtureProjectName); + + beforeEach("clean filesystem", async function () { + // make sure nothing is left over from a previous test + removeSync(deploymentDir); + }); + afterEach("clean filesystem", function () { + // cleanup + removeSync(deploymentDir); + }); + + it("true should write deployment to disk", async function () { + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/OwnModule.js", + writeLocalhostDeployment: true, + } + ); + + assert( + await pathExists(deploymentDir), + "Deployment was not written to disk" + ); + }); + + it("false should not write deployment to disk", async function () { + await this.hre.run( + { scope: "ignition", task: "deploy" }, + { + modulePath: "./ignition/modules/OwnModule.js", + writeLocalhostDeployment: false, + } + ); + + assert( + !(await pathExists(deploymentDir)), + "Deployment was not written to disk" + ); + }); +}); From 1459a6f895c27644d5e3547fce78988d61759612 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 25 Sep 2024 04:20:11 -0400 Subject: [PATCH 1271/1302] fix diagram height and button overlap for large batch numbers --- packages/ui/src/components/mermaid.tsx | 2 +- packages/ui/src/main.css | 3 ++- .../visualization-overview/components/deployment-flow.tsx | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/components/mermaid.tsx b/packages/ui/src/components/mermaid.tsx index 50bb81e7a9..44341da19c 100644 --- a/packages/ui/src/components/mermaid.tsx +++ b/packages/ui/src/components/mermaid.tsx @@ -25,7 +25,7 @@ export const Mermaid: React.FC<{ useEffect(() => { mermaid.initialize({ - maxTextSize: 500000, + maxTextSize: 5000000, flowchart: { padding: 50, }, diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 13b13163bc..5d0a72307b 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -47,6 +47,7 @@ body { .mermaid { background: #fbfbfb; + height: 500px; } .mermaid * { @@ -55,7 +56,7 @@ body { } .mermaid svg { - height: 300px; + height: 100%; vertical-align: middle; } diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 6aabdab077..419ab844c7 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -90,6 +90,7 @@ const SingleFutureNotice = styled.div` const VisualizeDiv = styled.div` font-weight: 700; padding: 1.5rem; + width: 100%; `; const FlowTooltip: React.FC = () => ( @@ -165,6 +166,11 @@ const SectionHeader = styled.div` const BatchBtnSection = styled.div` margin-bottom: 40px; text-align: center; + display: inline-flex; + flex-wrap: wrap; + justify-content: center; + row-gap: 1rem; + width: 100%; `; const BatchBtn = styled.span<{ isCurrentlyHovered: boolean }>` @@ -177,6 +183,7 @@ const BatchBtn = styled.span<{ isCurrentlyHovered: boolean }>` background: #ffffff; border: 1px solid #edcf00; cursor: pointer; + white-space: nowrap; ${(props) => props.isCurrentlyHovered && From 7be2762a13dd5a1dd4a6884965101ed0d9dea194 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 26 Sep 2024 01:22:59 -0400 Subject: [PATCH 1272/1302] chore: bump version to v0.15.6 Update the packages versions and changelogs for the `0.15.6 - 2024-09-25` release. --- packages/core/CHANGELOG.md | 14 ++++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/CHANGELOG.md | 14 ++++++++++++++ packages/ui/package.json | 2 +- 10 files changed, 75 insertions(+), 5 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 67412a021c..3125c59700 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + ## 0.15.5 - 2024-06-17 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index ad4d4b47ff..cbad7aa740 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.5", + "version": "0.15.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 7bacd529a8..dda05605b6 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + ## 0.15.5 - 2024-06-17 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 9c33e02c51..c5e8ed19fd 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.5", + "version": "0.15.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 43f15621cc..a21dbc8725 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + ## 0.15.5 - 2024-06-17 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 0231c5c5d4..1cd018828f 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.5", + "version": "0.15.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 864dd6148c..d8cb0f150f 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + ## 0.15.5 - 2024-06-17 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index bbf7fd7898..966e24e332 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.5", + "version": "0.15.6", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index f4a3a43e42..d2329b64e9 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.6 - 2024-09-25 + +### Added + +- Updates to the visualization UI, including the ability to zoom and pan the mermaid diagram ([#810](https://github.com/NomicFoundation/hardhat-ignition/pull/810)) +- `gasPrice` and `disableFeeBumping` config fields added as part of our L2 gas logic update ([#808](https://github.com/NomicFoundation/hardhat-ignition/pull/808)) +- Debug logging for communication errors with Hardhat Ledger ([#792](https://github.com/NomicFoundation/hardhat-ignition/pull/792)) +- JSON5 support for module parameters, thanks @erhant ([#800](https://github.com/NomicFoundation/hardhat-ignition/pull/800)) +- Add `writeLocalhostDeployment` flag to allow saving deployment artifacts when deploying to the ephemeral Hardhat network, thanks @SebastienGllmt ([#816](https://github.com/NomicFoundation/hardhat-ignition/pull/816)) + +### Fixed + +- Replace `this` with the class itself in `ViemIgnitionHelper`, thanks @iosh ([#796](https://github.com/NomicFoundation/hardhat-ignition/pull/796)) + ## 0.11.0 - 2023-10-23 ### Added diff --git a/packages/ui/package.json b/packages/ui/package.json index 40b59a29c9..6ff874ebae 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.5", + "version": "0.15.6", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From c8a3eb800b23d083121e9e24381d40d1d23c8506 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 30 Sep 2024 04:43:01 -0400 Subject: [PATCH 1273/1302] add support for global module parameters --- .../utils/resolve-module-parameter.ts | 3 +- .../hardhat-plugin/test/module-parameters.ts | 37 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/core/src/internal/utils/resolve-module-parameter.ts index 0ff3cbff37..5d4959c0e5 100644 --- a/packages/core/src/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/internal/utils/resolve-module-parameter.ts @@ -23,7 +23,8 @@ export function resolveModuleParameter( } const moduleParameters = - context.deploymentParameters[moduleParamRuntimeValue.moduleId]; + context.deploymentParameters[moduleParamRuntimeValue.moduleId] ?? + context.deploymentParameters.$global; if (moduleParameters === undefined) { assertIgnitionInvariant( diff --git a/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-plugin/test/module-parameters.ts index 076573f94d..4b548bf7cd 100644 --- a/packages/hardhat-plugin/test/module-parameters.ts +++ b/packages/hardhat-plugin/test/module-parameters.ts @@ -1,5 +1,5 @@ /* eslint-disable import/no-unused-modules */ - +import { buildModule } from "@nomicfoundation/ignition-core"; import { assert } from "chai"; import { useEphemeralIgnitionProject } from "./test-helpers/use-ignition-project"; @@ -93,5 +93,40 @@ describe("module parameters", () => { /Parameter "unlockTime" exceeds maximum safe integer size. Encode the value as a string using bigint notation: `\${value}n`/ ); }); + + it("should use a global parameter", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime", 100); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { $global: { unlockTime: 1893499200000 } }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use a module parameter instead of a global parameter if both are present", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime", 100); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { unlockTime: 1893499200000 }, + Test: { unlockTime: 9876543210000 }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 9876543210000); + }); }); }); From ceb65ef96e8539bdb12132ed7dd6597595017407 Mon Sep 17 00:00:00 2001 From: John Kane Date: Wed, 9 Oct 2024 10:37:53 +0100 Subject: [PATCH 1274/1302] fix: fqn resolution of artifacts In the artifact resolver detect whether a FQN is being used to refer to the contract and use Hardhat's own build info resolution method as we can rely on the fqn. This is now covered with an additional integration test for repos with multiple contracts with the same name in different files and an Ignition module where those contracts are referred to by FQNs. Fixes #778. --- .../src/hardhat-artifact-resolver.ts | 21 ++++++++++ .../contracts/Rocket1.sol | 11 ++++++ .../contracts/Rocket2.sol | 11 ++++++ .../hardhat.config.js | 5 +++ .../test/module-api/fully-qualified-names.ts | 39 +++++++++++++++++++ 5 files changed, 87 insertions(+) create mode 100644 packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol create mode 100644 packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js create mode 100644 packages/hardhat-plugin/test/module-api/fully-qualified-names.ts diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts index 2127025310..0b22d18998 100644 --- a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts +++ b/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts @@ -14,6 +14,17 @@ export class HardhatArtifactResolver implements ArtifactResolver { public async getBuildInfo( contractName: string ): Promise { + // If a fully qualified name is used, we can can + // leverage the artifact manager directly to load the build + // info. + if (this._isFullyQualifiedName(contractName)) { + return this._hre.artifacts.getBuildInfo(contractName); + } + + // Otherwise we have only the contract name, and need to + // resolve the artifact for the contract ourselves. + // We can build on the assumption that the contract name + // is unique based on Module validation. const artifactPath = await this._resolvePath(contractName); if (artifactPath === undefined) { @@ -51,4 +62,14 @@ export class HardhatArtifactResolver implements ArtifactResolver { public loadArtifact(contractName: string): Promise { return this._hre.artifacts.readArtifact(contractName); } + + /** + * Returns true if a name is fully qualified, and not just a bare contract name. + * + * This is based on Hardhat's own test for fully qualified names, taken + * from `contract-names.ts` in `hardhat-core` utils. + */ + private _isFullyQualifiedName(contractName: string): boolean { + return contractName.includes(":"); + } } diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol new file mode 100644 index 0000000000..8b11e5648a --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +// This contract name is the same as in `./Rocket2.sol` +contract Rocket { + string public name; + + constructor(string memory _name) { + name = _name; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol new file mode 100644 index 0000000000..e13358a6bc --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.0; + +// This contract name is the same as in `./Rocket1.sol` +contract Rocket { + string public name; + + constructor(string memory _name) { + name = _name; + } +} diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js new file mode 100644 index 0000000000..a59d1ed4d8 --- /dev/null +++ b/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js @@ -0,0 +1,5 @@ +require("../../../src/index"); + +module.exports = { + solidity: "0.8.19", +}; diff --git a/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts b/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts new file mode 100644 index 0000000000..9a3c911809 --- /dev/null +++ b/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts @@ -0,0 +1,39 @@ +import { buildModule } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { useFileIgnitionProject } from "../test-helpers/use-ignition-project"; + +describe("fully qualified names", () => { + describe("where there are multiple contracts with the same name in the project", () => { + useFileIgnitionProject( + "multiple-contracts-with-same-name", + "contract-deploy" + ); + + it("should deploy contracts by referring using fully qualified names", async function () { + const LaunchModule = buildModule("Apollo", (m) => { + const rocket1 = m.contract( + "contracts/Rocket1.sol:Rocket", + ["Rocket 1"], + { + id: "Rocket1", + } + ); + const rocket2 = m.contract( + "contracts/Rocket2.sol:Rocket", + ["Rocket 2"], + { + id: "Rocket2", + } + ); + + return { rocket1, rocket2 }; + }); + + const result = await this.hre.ignition.deploy(LaunchModule); + + assert.equal(await result.rocket1.read.name(), "Rocket 1"); + assert.equal(await result.rocket2.read.name(), "Rocket 2"); + }); + }); +}); From e4b85445124c4589db632d6f4f37612bfc20b217 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 8 Oct 2024 04:28:26 -0400 Subject: [PATCH 1275/1302] add CLI command to list transactions for a given deployment --- examples/complete/contracts/BasicContract.sol | 5 + .../ignition/modules/CompleteModule.js | 4 +- packages/core/src/index.ts | 2 + packages/core/src/internal/errors-list.ts | 12 + .../execution/deployment-state-helpers.ts | 17 + packages/core/src/list-transactions.ts | 144 + packages/core/src/types/list-transactions.ts | 36 + packages/core/test/list-transactions.ts | 103 + .../CompleteModule#BasicContract.dbg.json | 4 + .../CompleteModule#BasicContract.json | 91 + .../CompleteModule#BasicContract2.dbg.json | 4 + .../CompleteModule#BasicContract2.json | 91 + .../CompleteModule#BasicLibrary.dbg.json | 4 + .../CompleteModule#BasicLibrary.json | 30 + .../CompleteModule#BasicLibrary2.json | 30 + .../CompleteModule#ContractWithLibrary.json | 48 + .../CompleteModule#ContractWithLibrary2.json | 48 + .../0957b2d8bc1fe22551b79ef37cafc10a.json | 2420 ++++++++++ .../0fce7e4e9544f4b99b971b3b98da92d2.json | 4076 +++++++++++++++++ .../success/deployed_addresses.json | 8 + .../listTransactions/success/journal.jsonl | 40 + packages/hardhat-plugin/src/index.ts | 45 + .../calculate-list-transactions-display.ts | 57 + 23 files changed, 7318 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/list-transactions.ts create mode 100644 packages/core/src/types/list-transactions.ts create mode 100644 packages/core/test/list-transactions.ts create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json create mode 100644 packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json create mode 100644 packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json create mode 100644 packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json create mode 100644 packages/core/test/mocks/listTransactions/success/deployed_addresses.json create mode 100644 packages/core/test/mocks/listTransactions/success/journal.jsonl create mode 100644 packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts diff --git a/examples/complete/contracts/BasicContract.sol b/examples/complete/contracts/BasicContract.sol index 13d9a672e4..e04f1dd7f8 100644 --- a/examples/complete/contracts/BasicContract.sol +++ b/examples/complete/contracts/BasicContract.sol @@ -6,9 +6,14 @@ pragma solidity ^0.8.9; contract BasicContract { uint public savedArg; + address public sender; event BasicEvent(uint eventArg); + constructor(address _sender) { + sender = _sender; + } + receive() external payable {} function basicFunction(uint funcArg) public { diff --git a/examples/complete/ignition/modules/CompleteModule.js b/examples/complete/ignition/modules/CompleteModule.js index 345e669c1a..8a1aa9b28b 100644 --- a/examples/complete/ignition/modules/CompleteModule.js +++ b/examples/complete/ignition/modules/CompleteModule.js @@ -5,7 +5,9 @@ const withLibArtifact = require("../../libArtifacts/ContractWithLibrary.json"); const libArtifact = require("../../libArtifacts/BasicLibrary.json"); module.exports = buildModule("CompleteModule", (m) => { - const basic = m.contract("BasicContract"); + const acct2 = m.getAccount(2); + + const basic = m.contract("BasicContract", [acct2]); const library = m.library("BasicLibrary"); const libFromArtifact = m.library("BasicLibrary", libArtifact, { id: "BasicLibrary2", diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c2e0634141..0ca5e714f2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -5,12 +5,14 @@ export * from "./errors"; export { IgnitionModuleSerializer } from "./ignition-module-serializer"; export { formatSolidityParameter } from "./internal/formatters"; export { listDeployments } from "./list-deployments"; +export { listTransactions } from "./list-transactions"; export { status } from "./status"; export * from "./type-guards"; export * from "./types/artifact"; export * from "./types/deploy"; export * from "./types/errors"; export * from "./types/execution-events"; +export * from "./types/list-transactions"; export * from "./types/module"; export * from "./types/module-builder"; export * from "./types/provider"; diff --git a/packages/core/src/internal/errors-list.ts b/packages/core/src/internal/errors-list.ts index a0697bdacf..900fbff3fb 100644 --- a/packages/core/src/internal/errors-list.ts +++ b/packages/core/src/internal/errors-list.ts @@ -73,6 +73,11 @@ export const ERROR_RANGES: { max: 1199, title: "Strategy errors", }, + LIST_TRANSACTIONS: { + min: 1200, + max: 1299, + title: "List transactions errors", + }, }; /** @@ -400,6 +405,13 @@ export const ERRORS = { "Strategy configuration parameter '%paramName%' for the strategy '%strategyName%' is invalid: %reason%", }, }, + LIST_TRANSACTIONS: { + UNINITIALIZED_DEPLOYMENT: { + number: 1200, + message: + "Cannot list transactions for nonexistant deployment at %deploymentDir%", + }, + }, }; /** diff --git a/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/core/src/internal/execution/deployment-state-helpers.ts index 4b4fac4420..1b6f197cdd 100644 --- a/packages/core/src/internal/execution/deployment-state-helpers.ts +++ b/packages/core/src/internal/execution/deployment-state-helpers.ts @@ -89,3 +89,20 @@ export function shouldBeJournaled(message: JournalMessage): boolean { return true; } + +/** + * Reads the journal and returns an array of future IDs in the order they were executed. + */ +export async function getExecutionOrder( + deploymentLoader: DeploymentLoader +): Promise { + const futureIds: string[] = []; + + for await (const message of deploymentLoader.readFromJournal()) { + if ("futureId" in message && !futureIds.includes(message.futureId)) { + futureIds.push(message.futureId); + } + } + + return futureIds; +} diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts new file mode 100644 index 0000000000..3ceafe8ee0 --- /dev/null +++ b/packages/core/src/list-transactions.ts @@ -0,0 +1,144 @@ +import type { ArtifactResolver } from "./types/artifact"; + +import { IgnitionError } from "./errors"; +import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; +import { ERRORS } from "./internal/errors-list"; +import { + getExecutionOrder, + loadDeploymentState, +} from "./internal/execution/deployment-state-helpers"; +import { ExecutionResultType } from "./internal/execution/types/execution-result"; +import { + ExecutionSateType, + type CallExecutionState, + type DeploymentExecutionState, + type ExecutionState, + type SendDataExecutionState, +} from "./internal/execution/types/execution-state"; +import { + type Transaction, + TransactionReceiptStatus, +} from "./internal/execution/types/jsonrpc"; +import { assertIgnitionInvariant } from "./internal/utils/assertions"; +import { + type ListTransactionsResult, + TransactionStatus, +} from "./types/list-transactions"; + +/** + * Returns the transactions associated with a deployment. + * + * @param deploymentDir - the directory of the deployment to get the transactions of + * @param artifactResolver - the artifact resolver to use when loading artifacts + * for a future + * + * @beta + */ +export async function listTransactions( + deploymentDir: string, + _artifactResolver: Omit +): Promise { + const deploymentLoader = new FileDeploymentLoader(deploymentDir); + + const deploymentState = await loadDeploymentState(deploymentLoader); + + if (deploymentState === undefined) { + throw new IgnitionError(ERRORS.LIST_TRANSACTIONS.UNINITIALIZED_DEPLOYMENT, { + deploymentDir, + }); + } + + const executionOrder = await getExecutionOrder(deploymentLoader); + const transactions: ListTransactionsResult = []; + + for (const futureId of executionOrder) { + const exState = deploymentState.executionStates[futureId]; + + if (!doesSendTransactions(exState)) { + continue; + } + + for (const networkInteraction of exState.networkInteractions) { + assertIgnitionInvariant( + networkInteraction.type === "ONCHAIN_INTERACTION", + "Expected network interaction to be an onchain interaction" + ); + + for (const transaction of networkInteraction.transactions) { + switch (exState.type) { + case ExecutionSateType.DEPLOYMENT_EXECUTION_STATE: { + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus(transaction), + name: exState.contractName, + address: + transaction.receipt?.status === TransactionReceiptStatus.SUCCESS + ? exState.result?.type === ExecutionResultType.SUCCESS + ? exState.result.address + : undefined + : undefined, + params: exState.constructorArgs, + value: networkInteraction.value, + }); + + break; + } + case ExecutionSateType.CALL_EXECUTION_STATE: { + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus(transaction), + name: exState.functionName, + to: networkInteraction.to, + params: exState.args, + value: networkInteraction.value, + }); + + break; + } + case ExecutionSateType.SEND_DATA_EXECUTION_STATE: { + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus(transaction), + to: networkInteraction.to, + value: networkInteraction.value, + }); + + break; + } + } + } + } + } + + return transactions; +} + +function doesSendTransactions( + exState: ExecutionState +): exState is + | DeploymentExecutionState + | CallExecutionState + | SendDataExecutionState { + return ( + exState.type === ExecutionSateType.DEPLOYMENT_EXECUTION_STATE || + exState.type === ExecutionSateType.CALL_EXECUTION_STATE || + exState.type === ExecutionSateType.SEND_DATA_EXECUTION_STATE + ); +} + +function getTransactionStatus(transaction: Transaction): TransactionStatus { + const status = + transaction.receipt === undefined + ? TransactionStatus.DROPPED + : transaction.receipt.status === TransactionReceiptStatus.SUCCESS + ? TransactionStatus.SUCCESS + : TransactionStatus.FAILURE; + + return status; +} diff --git a/packages/core/src/types/list-transactions.ts b/packages/core/src/types/list-transactions.ts new file mode 100644 index 0000000000..567ae52368 --- /dev/null +++ b/packages/core/src/types/list-transactions.ts @@ -0,0 +1,36 @@ +import type { SolidityParameterType } from "./module"; + +/** + * The status of a transaction. + * + * @beta + */ +export enum TransactionStatus { + SUCCESS = "SUCCESS", + FAILURE = "FAILURE", + DROPPED = "DROPPED", +} + +/** + * The information of a transaction. + * + * @beta + */ +export interface TransactionInfo { + type: string; + status: TransactionStatus; + txHash: string; + from: string; + to?: string; + name?: string; // can be contract name, function name, or undefined, depending on the type + address?: string; + params?: SolidityParameterType[]; + value?: bigint; +} + +/** + * An array of transaction information. + * + * @beta + */ +export type ListTransactionsResult = TransactionInfo[]; diff --git a/packages/core/test/list-transactions.ts b/packages/core/test/list-transactions.ts new file mode 100644 index 0000000000..14e8fbb259 --- /dev/null +++ b/packages/core/test/list-transactions.ts @@ -0,0 +1,103 @@ +import { assert } from "chai"; +import path from "path"; + +import { + listTransactions, + ListTransactionsResult, + TransactionStatus, +} from "../src"; + +import { setupMockArtifactResolver } from "./helpers"; + +describe("listTransactions", () => { + it("should return the transactions associated with a deployment", async () => { + const expected: ListTransactionsResult = [ + { + type: "DEPLOYMENT_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1", + status: TransactionStatus.SUCCESS, + name: "BasicContract", + address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], + value: 0n, + }, + { + type: "DEPLOYMENT_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0xee331a69f69646d8b551a1ee6514760763cb7b1c332dadb2f0d05c730e554a28", + status: TransactionStatus.SUCCESS, + name: "BasicLibrary", + address: "0x1c947344BA932fC7f3D622600dA0199520A67EFd", + params: [], + value: 0n, + }, + { + type: "DEPLOYMENT_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0x6f06b87969f7543887e7cda4b0cf82426b6712a57c915593adf2dd6168f9f283", + status: TransactionStatus.SUCCESS, + name: "BasicLibrary", + address: "0xBdAce15b3211019E272418B8014971c1cefbC8f0", + params: [], + value: 0n, + }, + { + type: "CALL_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0xb7b49d16087ab6351e26b2358ae211e5dac335441f323a28c6c26f0bc0c3a0a3", + status: TransactionStatus.SUCCESS, + name: "basicFunction", + to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: [40], + value: 0n, + }, + { + type: "DEPLOYMENT_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0x7542503401d0ad31f0c8de576c8d524535538c25050bd20f77562ecab25c4c8d", + status: TransactionStatus.SUCCESS, + name: "ContractWithLibrary", + address: "0xD369D9aB22D85C2A12bEabc0B581a419789E3755", + params: [], + value: 0n, + }, + { + type: "SEND_DATA_EXECUTION_STATE", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + txHash: + "0x2870c7d9f84122caba3739be0dc2246343a87d1b216b57002654b3bd413fe8e2", + status: TransactionStatus.SUCCESS, + to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + value: 123n, + }, + ]; + + const deploymentDir = path.join( + __dirname, + "mocks", + "listTransactions", + "success" + ); + + const artifactResolver = setupMockArtifactResolver(); + + const result = await listTransactions(deploymentDir, artifactResolver); + + assert.deepEqual(result, expected); + }); + + it("should throw an error if the deployment is not initialized", async () => { + const artifactResolver = setupMockArtifactResolver(); + + await assert.isRejected( + listTransactions("fake", artifactResolver), + /IGN1200: Cannot list transactions for nonexistant deployment at fake/ + ); + }); +}); diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json new file mode 100644 index 0000000000..c0fd7b8e34 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/0957b2d8bc1fe22551b79ef37cafc10a.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json new file mode 100644 index 0000000000..571a45e156 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json @@ -0,0 +1,91 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BasicContract", + "sourceName": "contracts/BasicContract.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "eventArg", + "type": "uint256" + } + ], + "name": "BasicEvent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "funcArg", + "type": "uint256" + } + ], + "name": "basicFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "arg", + "type": "uint256" + } + ], + "name": "otherFunction", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "savedArg", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610396380380610396833981810160405281019061003291906100dc565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b98161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b6000602082840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b61027e806101186000396000f3fe6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json new file mode 100644 index 0000000000..c0fd7b8e34 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/0957b2d8bc1fe22551b79ef37cafc10a.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json new file mode 100644 index 0000000000..571a45e156 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json @@ -0,0 +1,91 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BasicContract", + "sourceName": "contracts/BasicContract.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "eventArg", + "type": "uint256" + } + ], + "name": "BasicEvent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "funcArg", + "type": "uint256" + } + ], + "name": "basicFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "arg", + "type": "uint256" + } + ], + "name": "otherFunction", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "savedArg", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50604051610396380380610396833981810160405281019061003291906100dc565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b98161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b6000602082840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b61027e806101186000396000f3fe6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "deployedBytecode": "0x6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json new file mode 100644 index 0000000000..594e771d23 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/0fce7e4e9544f4b99b971b3b98da92d2.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json new file mode 100644 index 0000000000..3988eccd97 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json @@ -0,0 +1,30 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BasicLibrary", + "sourceName": "contracts/BasicLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "self", + "type": "uint256" + } + ], + "name": "addTwo", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea264697066735822122082ed7a81ce855fb874f96d949594ec96c01bee23c154e3d112e6d8b6a31f1cc064736f6c63430008110033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea264697066735822122082ed7a81ce855fb874f96d949594ec96c01bee23c154e3d112e6d8b6a31f1cc064736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json new file mode 100644 index 0000000000..d3b813f5aa --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json @@ -0,0 +1,30 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "BasicLibrary", + "sourceName": "contracts/BasicLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "self", + "type": "uint256" + } + ], + "name": "addTwo", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea26469706673582212206a544cfc8f986be3fb0a207e85759e54cc759f3023d890241105de48c3f5db1d64736f6c63430008110033", + "deployedBytecode": "0x73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea26469706673582212206a544cfc8f986be3fb0a207e85759e54cc759f3023d890241105de48c3f5db1d64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json new file mode 100644 index 0000000000..ad330d5928 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json @@ -0,0 +1,48 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ContractWithLibrary", + "sourceName": "contracts/ContractWithLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "num", + "type": "uint256" + } + ], + "name": "readonlyFunction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610217806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "linkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 133 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 101 + } + ] + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json new file mode 100644 index 0000000000..ad330d5928 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json @@ -0,0 +1,48 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ContractWithLibrary", + "sourceName": "contracts/ContractWithLibrary.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "num", + "type": "uint256" + } + ], + "name": "readonlyFunction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b50610217806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033", + "linkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 133 + } + ] + } + }, + "deployedLinkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 101 + } + ] + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json b/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json new file mode 100644 index 0000000000..7e860975c2 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json @@ -0,0 +1,2420 @@ +{ + "id": "0957b2d8bc1fe22551b79ef37cafc10a", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.17", + "solcLongVersion": "0.8.17+commit.8df45f5f", + "input": { + "language": "Solidity", + "sources": { + "contracts/BasicContract.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract BasicContract {\n uint public savedArg;\n address public sender;\n\n event BasicEvent(uint eventArg);\n\n constructor(address _sender) {\n sender = _sender;\n }\n\n receive() external payable {}\n\n function basicFunction(uint funcArg) public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n emit BasicEvent(funcArg);\n }\n\n function otherFunction(uint arg) public payable {\n savedArg = arg;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/BasicContract.sol": { + "ast": { + "absolutePath": "contracts/BasicContract.sol", + "exportedSymbols": { + "BasicContract": [ + 44 + ] + }, + "id": 45, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "BasicContract", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 44, + "linearizedBaseContracts": [ + 44 + ], + "name": "BasicContract", + "nameLocation": "149:13:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "53a57b4a", + "id": 3, + "mutability": "mutable", + "name": "savedArg", + "nameLocation": "179:8:0", + "nodeType": "VariableDeclaration", + "scope": 44, + "src": "167:20:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "167:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "67e404ce", + "id": 5, + "mutability": "mutable", + "name": "sender", + "nameLocation": "206:6:0", + "nodeType": "VariableDeclaration", + "scope": 44, + "src": "191:21:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 4, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "191:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "b532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a2", + "id": 9, + "name": "BasicEvent", + "nameLocation": "223:10:0", + "nodeType": "EventDefinition", + "parameters": { + "id": 8, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 7, + "indexed": false, + "mutability": "mutable", + "name": "eventArg", + "nameLocation": "239:8:0", + "nodeType": "VariableDeclaration", + "scope": 9, + "src": "234:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 6, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "234:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "233:15:0" + }, + "src": "217:32:0" + }, + { + "body": { + "id": 18, + "nodeType": "Block", + "src": "282:27:0", + "statements": [ + { + "expression": { + "id": 16, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 14, + "name": "sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "288:6:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 15, + "name": "_sender", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 11, + "src": "297:7:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "src": "288:16:0", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 17, + "nodeType": "ExpressionStatement", + "src": "288:16:0" + } + ] + }, + "id": 19, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 12, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 11, + "mutability": "mutable", + "name": "_sender", + "nameLocation": "273:7:0", + "nodeType": "VariableDeclaration", + "scope": 19, + "src": "265:15:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "typeName": { + "id": 10, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "265:7:0", + "stateMutability": "nonpayable", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "visibility": "internal" + } + ], + "src": "264:17:0" + }, + "returnParameters": { + "id": 13, + "nodeType": "ParameterList", + "parameters": [], + "src": "282:0:0" + }, + "scope": 44, + "src": "253:56:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 22, + "nodeType": "Block", + "src": "340:2:0", + "statements": [] + }, + "id": 23, + "implemented": true, + "kind": "receive", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 20, + "nodeType": "ParameterList", + "parameters": [], + "src": "320:2:0" + }, + "returnParameters": { + "id": 21, + "nodeType": "ParameterList", + "parameters": [], + "src": "340:0:0" + }, + "scope": 44, + "src": "313:29:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 32, + "nodeType": "Block", + "src": "390:233:0", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "id": 29, + "name": "funcArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 25, + "src": "610:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 28, + "name": "BasicEvent", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 9, + "src": "599:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 30, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "599:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 31, + "nodeType": "EmitStatement", + "src": "594:24:0" + } + ] + }, + "functionSelector": "92b4bb8a", + "id": 33, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "basicFunction", + "nameLocation": "355:13:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 26, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 25, + "mutability": "mutable", + "name": "funcArg", + "nameLocation": "374:7:0", + "nodeType": "VariableDeclaration", + "scope": 33, + "src": "369:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 24, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "369:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "368:14:0" + }, + "returnParameters": { + "id": 27, + "nodeType": "ParameterList", + "parameters": [], + "src": "390:0:0" + }, + "scope": 44, + "src": "346:277:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 42, + "nodeType": "Block", + "src": "675:25:0", + "statements": [ + { + "expression": { + "id": 40, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 38, + "name": "savedArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "681:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 39, + "name": "arg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 35, + "src": "692:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "681:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 41, + "nodeType": "ExpressionStatement", + "src": "681:14:0" + } + ] + }, + "functionSelector": "673b6d91", + "id": 43, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "otherFunction", + "nameLocation": "636:13:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 36, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 35, + "mutability": "mutable", + "name": "arg", + "nameLocation": "655:3:0", + "nodeType": "VariableDeclaration", + "scope": 43, + "src": "650:8:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 34, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "650:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "649:10:0" + }, + "returnParameters": { + "id": 37, + "nodeType": "ParameterList", + "parameters": [], + "src": "675:0:0" + }, + "scope": 44, + "src": "627:73:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 45, + "src": "140:562:0", + "usedErrors": [] + } + ], + "src": "39:664:0" + }, + "id": 0 + } + }, + "contracts": { + "contracts/BasicContract.sol": { + "BasicContract": { + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "eventArg", + "type": "uint256" + } + ], + "name": "BasicEvent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "funcArg", + "type": "uint256" + } + ], + "name": "basicFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "arg", + "type": "uint256" + } + ], + "name": "otherFunction", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "savedArg", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "sender", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_19": { + "entryPoint": null, + "id": 19, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_t_address_fromMemory": { + "entryPoint": 199, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_address_fromMemory": { + "entryPoint": 220, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_address": { + "entryPoint": 158, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 126, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 121, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_address": { + "entryPoint": 176, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1199:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:1", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:1" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:1" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:1", + "type": "" + } + ], + "src": "7:75:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:1" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:1" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:81:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:65:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "404:5:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "411:42:1", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "400:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "400:54:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:1", + "type": "" + } + ], + "src": "334:126:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "511:51:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "521:35:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "550:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "532:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "532:24:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "521:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "493:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "503:7:1", + "type": "" + } + ], + "src": "466:96:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "611:79:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "668:16:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "677:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "680:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "670:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "670:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "670:12:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "634:5:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "659:5:1" + } + ], + "functionName": { + "name": "cleanup_t_address", + "nodeType": "YulIdentifier", + "src": "641:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "641:24:1" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "631:2:1" + }, + "nodeType": "YulFunctionCall", + "src": "631:35:1" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "624:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "624:43:1" + }, + "nodeType": "YulIf", + "src": "621:63:1" + } + ] + }, + "name": "validator_revert_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "604:5:1", + "type": "" + } + ], + "src": "568:122:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "759:80:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "769:22:1", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "784:6:1" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "778:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "778:13:1" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "769:5:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "827:5:1" + } + ], + "functionName": { + "name": "validator_revert_t_address", + "nodeType": "YulIdentifier", + "src": "800:26:1" + }, + "nodeType": "YulFunctionCall", + "src": "800:33:1" + }, + "nodeType": "YulExpressionStatement", + "src": "800:33:1" + } + ] + }, + "name": "abi_decode_t_address_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "737:6:1", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "745:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "753:5:1", + "type": "" + } + ], + "src": "696:143:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "922:274:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "968:83:1", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "970:77:1" + }, + "nodeType": "YulFunctionCall", + "src": "970:79:1" + }, + "nodeType": "YulExpressionStatement", + "src": "970:79:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "943:7:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "952:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "939:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "939:23:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "964:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "935:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "935:32:1" + }, + "nodeType": "YulIf", + "src": "932:119:1" + }, + { + "nodeType": "YulBlock", + "src": "1061:128:1", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1076:15:1", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1090:1:1", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1080:6:1", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1105:74:1", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1151:9:1" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1162:6:1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1147:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1147:22:1" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1171:7:1" + } + ], + "functionName": { + "name": "abi_decode_t_address_fromMemory", + "nodeType": "YulIdentifier", + "src": "1115:31:1" + }, + "nodeType": "YulFunctionCall", + "src": "1115:64:1" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1105:6:1" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_address_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "892:9:1", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "903:7:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "915:6:1", + "type": "" + } + ], + "src": "845:351:1" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function validator_revert_t_address(value) {\n if iszero(eq(value, cleanup_t_address(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_address_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_address(value)\n }\n\n function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_address_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50604051610396380380610396833981810160405281019061003291906100dc565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b98161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b6000602082840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b61027e806101186000396000f3fe6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0x396 CODESIZE SUB DUP1 PUSH2 0x396 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x32 SWAP2 SWAP1 PUSH2 0xDC JUMP JUMPDEST DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP PUSH2 0x109 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0xA9 DUP3 PUSH2 0x7E JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xB9 DUP2 PUSH2 0x9E JUMP JUMPDEST DUP2 EQ PUSH2 0xC4 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xD6 DUP2 PUSH2 0xB0 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xF2 JUMPI PUSH2 0xF1 PUSH2 0x79 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x100 DUP5 DUP3 DUP6 ADD PUSH2 0xC7 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x27E DUP1 PUSH2 0x118 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x43 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x53A57B4A EQ PUSH2 0x4F JUMPI DUP1 PUSH4 0x673B6D91 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x67E404CE EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x92B4BB8A EQ PUSH2 0xC1 JUMPI PUSH2 0x4A JUMP JUMPDEST CALLDATASIZE PUSH2 0x4A JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0xEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x173 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x94 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x8F SWAP2 SWAP1 PUSH2 0x1BF JUMP JUMPDEST PUSH2 0xF0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAB PUSH2 0xFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB8 SWAP2 SWAP1 PUSH2 0x22D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE3 SWAP2 SWAP1 PUSH2 0x1BF JUMP JUMPDEST PUSH2 0x120 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xB532177E7C269FCC7B98812C0FC27F2DD1970AD68F68CEA8C18F0191848377A2 DUP2 PUSH1 0x40 MLOAD PUSH2 0x14F SWAP2 SWAP1 PUSH2 0x173 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x16D DUP2 PUSH2 0x15A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x188 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x164 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19C DUP2 PUSH2 0x15A JUMP JUMPDEST DUP2 EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1B9 DUP2 PUSH2 0x193 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D5 JUMPI PUSH2 0x1D4 PUSH2 0x18E JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1E3 DUP5 DUP3 DUP6 ADD PUSH2 0x1AA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x217 DUP3 PUSH2 0x1EC JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x227 DUP2 PUSH2 0x20C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x242 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x21E JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BASEFEE 0xE0 0xC1 0x26 CALLVALUE 0xEE 0xD4 0xD0 DUP12 SWAP15 0xB7 MSTORE8 ADDMOD DUP1 ADDMOD 0xB3 PUSH21 0xF8C695EF56C03075052E85D43F691F64736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "140:562:0:-:0;;;253:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;297:7;288:6;;:16;;;;;;;;;;;;;;;;;;253:56;140:562;;88:117:1;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:143::-;753:5;784:6;778:13;769:22;;800:33;827:5;800:33;:::i;:::-;696:143;;;;:::o;845:351::-;915:6;964:2;952:9;943:7;939:23;935:32;932:119;;;970:79;;:::i;:::-;932:119;1090:1;1115:64;1171:7;1162:6;1151:9;1147:22;1115:64;:::i;:::-;1105:74;;1061:128;845:351;;;;:::o;140:562:0:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@_23": { + "entryPoint": null, + "id": 23, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@basicFunction_33": { + "entryPoint": 288, + "id": 33, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@otherFunction_43": { + "entryPoint": 240, + "id": 43, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@savedArg_3": { + "entryPoint": 234, + "id": 3, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@sender_5": { + "entryPoint": 250, + "id": 5, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_decode_t_uint256": { + "entryPoint": 426, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 447, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_address_to_t_address_fromStack": { + "entryPoint": 542, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 356, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_address__to_t_address__fromStack_reversed": { + "entryPoint": 557, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 371, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_address": { + "entryPoint": 524, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 492, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 346, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 398, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 403, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1960:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:1", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:1", + "type": "" + } + ], + "src": "7:77:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:1" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:1" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:1", + "type": "" + } + ], + "src": "90:118:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:1" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:1", + "type": "" + } + ], + "src": "214:222:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "482:35:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "492:19:1", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "508:2:1", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "502:5:1" + }, + "nodeType": "YulFunctionCall", + "src": "502:9:1" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "492:6:1" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "475:6:1", + "type": "" + } + ], + "src": "442:75:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "612:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "629:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "632:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "622:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "622:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "622:12:1" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "523:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "735:28:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "752:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "755:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "745:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "745:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "745:12:1" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "646:117:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "812:79:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "869:16:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "878:1:1", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "881:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "871:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "871:12:1" + }, + "nodeType": "YulExpressionStatement", + "src": "871:12:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "835:5:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "860:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "842:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "842:24:1" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "832:2:1" + }, + "nodeType": "YulFunctionCall", + "src": "832:35:1" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "825:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "825:43:1" + }, + "nodeType": "YulIf", + "src": "822:63:1" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "805:5:1", + "type": "" + } + ], + "src": "769:122:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "949:87:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "959:29:1", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "981:6:1" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "968:12:1" + }, + "nodeType": "YulFunctionCall", + "src": "968:20:1" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "959:5:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1024:5:1" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "997:26:1" + }, + "nodeType": "YulFunctionCall", + "src": "997:33:1" + }, + "nodeType": "YulExpressionStatement", + "src": "997:33:1" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "927:6:1", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "935:3:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "943:5:1", + "type": "" + } + ], + "src": "897:139:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1108:263:1", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1154:83:1", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "1156:77:1" + }, + "nodeType": "YulFunctionCall", + "src": "1156:79:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1156:79:1" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1129:7:1" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1138:9:1" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1125:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1125:23:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1150:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1121:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1121:32:1" + }, + "nodeType": "YulIf", + "src": "1118:119:1" + }, + { + "nodeType": "YulBlock", + "src": "1247:117:1", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1262:15:1", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1276:1:1", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1266:6:1", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1291:63:1", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1326:9:1" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1337:6:1" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1322:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1322:22:1" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1346:7:1" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1301:20:1" + }, + "nodeType": "YulFunctionCall", + "src": "1301:53:1" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1291:6:1" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1078:9:1", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1089:7:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1101:6:1", + "type": "" + } + ], + "src": "1042:329:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1422:81:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1432:65:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1447:5:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1454:42:1", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "1443:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1443:54:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "1432:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1404:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "1414:7:1", + "type": "" + } + ], + "src": "1377:126:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1554:51:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1564:35:1", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1593:5:1" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "1575:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "1575:24:1" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "1564:7:1" + } + ] + } + ] + }, + "name": "cleanup_t_address", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1536:5:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "1546:7:1", + "type": "" + } + ], + "src": "1509:96:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1676:53:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1693:3:1" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1716:5:1" + } + ], + "functionName": { + "name": "cleanup_t_address", + "nodeType": "YulIdentifier", + "src": "1698:17:1" + }, + "nodeType": "YulFunctionCall", + "src": "1698:24:1" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1686:6:1" + }, + "nodeType": "YulFunctionCall", + "src": "1686:37:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1686:37:1" + } + ] + }, + "name": "abi_encode_t_address_to_t_address_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1664:5:1", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1671:3:1", + "type": "" + } + ], + "src": "1611:118:1" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1833:124:1", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1843:26:1", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1855:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1866:2:1", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1851:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1851:18:1" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1843:4:1" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1923:6:1" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1936:9:1" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1947:1:1", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1932:3:1" + }, + "nodeType": "YulFunctionCall", + "src": "1932:17:1" + } + ], + "functionName": { + "name": "abi_encode_t_address_to_t_address_fromStack", + "nodeType": "YulIdentifier", + "src": "1879:43:1" + }, + "nodeType": "YulFunctionCall", + "src": "1879:71:1" + }, + "nodeType": "YulExpressionStatement", + "src": "1879:71:1" + } + ] + }, + "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1805:9:1", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1817:6:1", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1828:4:1", + "type": "" + } + ], + "src": "1735:222:1" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function abi_encode_t_address_to_t_address_fromStack(value, pos) {\n mstore(pos, cleanup_t_address(value))\n }\n\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_to_t_address_fromStack(value0, add(headStart, 0))\n\n }\n\n}\n", + "id": 1, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x43 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x53A57B4A EQ PUSH2 0x4F JUMPI DUP1 PUSH4 0x673B6D91 EQ PUSH2 0x7A JUMPI DUP1 PUSH4 0x67E404CE EQ PUSH2 0x96 JUMPI DUP1 PUSH4 0x92B4BB8A EQ PUSH2 0xC1 JUMPI PUSH2 0x4A JUMP JUMPDEST CALLDATASIZE PUSH2 0x4A JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x5B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x64 PUSH2 0xEA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x71 SWAP2 SWAP1 PUSH2 0x173 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x94 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x8F SWAP2 SWAP1 PUSH2 0x1BF JUMP JUMPDEST PUSH2 0xF0 JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xA2 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xAB PUSH2 0xFA JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB8 SWAP2 SWAP1 PUSH2 0x22D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0xCD JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xE8 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xE3 SWAP2 SWAP1 PUSH2 0x1BF JUMP JUMPDEST PUSH2 0x120 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH32 0xB532177E7C269FCC7B98812C0FC27F2DD1970AD68F68CEA8C18F0191848377A2 DUP2 PUSH1 0x40 MLOAD PUSH2 0x14F SWAP2 SWAP1 PUSH2 0x173 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x16D DUP2 PUSH2 0x15A JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x188 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x164 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x19C DUP2 PUSH2 0x15A JUMP JUMPDEST DUP2 EQ PUSH2 0x1A7 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x1B9 DUP2 PUSH2 0x193 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1D5 JUMPI PUSH2 0x1D4 PUSH2 0x18E JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1E3 DUP5 DUP3 DUP6 ADD PUSH2 0x1AA JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x217 DUP3 PUSH2 0x1EC JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x227 DUP2 PUSH2 0x20C JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x242 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x21E JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 BASEFEE 0xE0 0xC1 0x26 CALLVALUE 0xEE 0xD4 0xD0 DUP12 SWAP15 0xB7 MSTORE8 ADDMOD DUP1 ADDMOD 0xB3 PUSH21 0xF8C695EF56C03075052E85D43F691F64736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "140:562:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;167:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;627:73;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;191:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;346:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;167:20;;;;:::o;627:73::-;692:3;681:8;:14;;;;627:73;:::o;191:21::-;;;;;;;;;;;;;:::o;346:277::-;599:19;610:7;599:19;;;;;;:::i;:::-;;;;;;;;346:277;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:96::-;1546:7;1575:24;1593:5;1575:24;:::i;:::-;1564:35;;1509:96;;;:::o;1611:118::-;1698:24;1716:5;1698:24;:::i;:::-;1693:3;1686:37;1611:118;;:::o;1735:222::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1735:222;;;;:::o" + }, + "methodIdentifiers": { + "basicFunction(uint256)": "92b4bb8a", + "otherFunction(uint256)": "673b6d91", + "savedArg()": "53a57b4a", + "sender()": "67e404ce" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eventArg\",\"type\":\"uint256\"}],\"name\":\"BasicEvent\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"funcArg\",\"type\":\"uint256\"}],\"name\":\"basicFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"arg\",\"type\":\"uint256\"}],\"name\":\"otherFunction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"savedArg\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BasicContract.sol\":\"BasicContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/BasicContract.sol\":{\"keccak256\":\"0xdaa3f8902b441f57a3d3dcbf3bc9faaf2e2340bc6b5fe6750fe088db6cb2bc21\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://1c9d6307d9db3b6f77d5742a6a418d8cab153cfd356b8d53966372a6a17d3f0b\",\"dweb:/ipfs/QmeBe5wY8bXfgoC6Cps3kVpC8p3DfnTBVa6VTBFa7BJ6m2\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json b/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json new file mode 100644 index 0000000000..45431d9ee7 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json @@ -0,0 +1,4076 @@ +{ + "id": "0fce7e4e9544f4b99b971b3b98da92d2", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.17", + "solcLongVersion": "0.8.17+commit.8df45f5f", + "input": { + "language": "Solidity", + "sources": { + "contracts/BasicContract.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract BasicContract {\n uint public savedArg;\n\n event BasicEvent(uint eventArg);\n\n receive() external payable {}\n\n function basicFunction(uint funcArg) public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n emit BasicEvent(funcArg);\n }\n\n function otherFunction(uint arg) public payable {\n savedArg = arg;\n }\n}\n" + }, + "contracts/BasicLibrary.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\nlibrary BasicLibrary {\n function addTwo(uint self) public pure returns (uint) {\n return self + 2;\n }\n}\n" + }, + "contracts/ContractWithLibrary.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\nimport \"./BasicLibrary.sol\";\n\nusing BasicLibrary for uint;\n\ncontract ContractWithLibrary {\n function readonlyFunction(uint num) public pure returns (uint) {\n return num.addTwo();\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/BasicContract.sol": { + "ast": { + "absolutePath": "contracts/BasicContract.sol", + "exportedSymbols": { + "BasicContract": [ + 32 + ] + }, + "id": 33, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "BasicContract", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 32, + "linearizedBaseContracts": [ + 32 + ], + "name": "BasicContract", + "nameLocation": "149:13:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "53a57b4a", + "id": 3, + "mutability": "mutable", + "name": "savedArg", + "nameLocation": "179:8:0", + "nodeType": "VariableDeclaration", + "scope": 32, + "src": "167:20:0", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "167:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "b532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a2", + "id": 7, + "name": "BasicEvent", + "nameLocation": "198:10:0", + "nodeType": "EventDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 5, + "indexed": false, + "mutability": "mutable", + "name": "eventArg", + "nameLocation": "214:8:0", + "nodeType": "VariableDeclaration", + "scope": 7, + "src": "209:13:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "209:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "208:15:0" + }, + "src": "192:32:0" + }, + { + "body": { + "id": 10, + "nodeType": "Block", + "src": "255:2:0", + "statements": [] + }, + "id": 11, + "implemented": true, + "kind": "receive", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 8, + "nodeType": "ParameterList", + "parameters": [], + "src": "235:2:0" + }, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [], + "src": "255:0:0" + }, + "scope": 32, + "src": "228:29:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "external" + }, + { + "body": { + "id": 20, + "nodeType": "Block", + "src": "305:233:0", + "statements": [ + { + "eventCall": { + "arguments": [ + { + "id": 17, + "name": "funcArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 13, + "src": "525:7:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 16, + "name": "BasicEvent", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 7, + "src": "514:10:0", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 18, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "514:19:0", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 19, + "nodeType": "EmitStatement", + "src": "509:24:0" + } + ] + }, + "functionSelector": "92b4bb8a", + "id": 21, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "basicFunction", + "nameLocation": "270:13:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 14, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 13, + "mutability": "mutable", + "name": "funcArg", + "nameLocation": "289:7:0", + "nodeType": "VariableDeclaration", + "scope": 21, + "src": "284:12:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 12, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "284:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "283:14:0" + }, + "returnParameters": { + "id": 15, + "nodeType": "ParameterList", + "parameters": [], + "src": "305:0:0" + }, + "scope": 32, + "src": "261:277:0", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 30, + "nodeType": "Block", + "src": "590:25:0", + "statements": [ + { + "expression": { + "id": 28, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 26, + "name": "savedArg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "596:8:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 27, + "name": "arg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 23, + "src": "607:3:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "596:14:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 29, + "nodeType": "ExpressionStatement", + "src": "596:14:0" + } + ] + }, + "functionSelector": "673b6d91", + "id": 31, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "otherFunction", + "nameLocation": "551:13:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 24, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 23, + "mutability": "mutable", + "name": "arg", + "nameLocation": "570:3:0", + "nodeType": "VariableDeclaration", + "scope": 31, + "src": "565:8:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 22, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "565:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "564:10:0" + }, + "returnParameters": { + "id": 25, + "nodeType": "ParameterList", + "parameters": [], + "src": "590:0:0" + }, + "scope": 32, + "src": "542:73:0", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 33, + "src": "140:477:0", + "usedErrors": [] + } + ], + "src": "39:579:0" + }, + "id": 0 + }, + "contracts/BasicLibrary.sol": { + "ast": { + "absolutePath": "contracts/BasicLibrary.sol", + "exportedSymbols": { + "BasicLibrary": [ + 47 + ] + }, + "id": 48, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 34, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:1" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "BasicLibrary", + "contractDependencies": [], + "contractKind": "library", + "fullyImplemented": true, + "id": 47, + "linearizedBaseContracts": [ + 47 + ], + "name": "BasicLibrary", + "nameLocation": "72:12:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 45, + "nodeType": "Block", + "src": "143:26:1", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 41, + "name": "self", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 36, + "src": "156:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "hexValue": "32", + "id": 42, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "number", + "lValueRequested": false, + "nodeType": "Literal", + "src": "163:1:1", + "typeDescriptions": { + "typeIdentifier": "t_rational_2_by_1", + "typeString": "int_const 2" + }, + "value": "2" + }, + "src": "156:8:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 40, + "id": 44, + "nodeType": "Return", + "src": "149:15:1" + } + ] + }, + "functionSelector": "cae57913", + "id": 46, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "addTwo", + "nameLocation": "98:6:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 37, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 36, + "mutability": "mutable", + "name": "self", + "nameLocation": "110:4:1", + "nodeType": "VariableDeclaration", + "scope": 46, + "src": "105:9:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 35, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "105:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "104:11:1" + }, + "returnParameters": { + "id": 40, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 39, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 46, + "src": "137:4:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 38, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "137:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "136:6:1" + }, + "scope": 47, + "src": "89:80:1", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 48, + "src": "64:107:1", + "usedErrors": [] + } + ], + "src": "39:133:1" + }, + "id": 1 + }, + "contracts/ContractWithLibrary.sol": { + "ast": { + "absolutePath": "contracts/ContractWithLibrary.sol", + "exportedSymbols": { + "BasicLibrary": [ + 47 + ], + "ContractWithLibrary": [ + 66 + ] + }, + "id": 67, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 49, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:2" + }, + { + "absolutePath": "contracts/BasicLibrary.sol", + "file": "./BasicLibrary.sol", + "id": 50, + "nameLocation": "-1:-1:-1", + "nodeType": "ImportDirective", + "scope": 67, + "sourceUnit": 48, + "src": "64:28:2", + "symbolAliases": [], + "unitAlias": "" + }, + { + "global": false, + "id": 53, + "libraryName": { + "id": 51, + "name": "BasicLibrary", + "nameLocations": [ + "100:12:2" + ], + "nodeType": "IdentifierPath", + "referencedDeclaration": 47, + "src": "100:12:2" + }, + "nodeType": "UsingForDirective", + "src": "94:28:2", + "typeName": { + "id": 52, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "117:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "ContractWithLibrary", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 66, + "linearizedBaseContracts": [ + 66 + ], + "name": "ContractWithLibrary", + "nameLocation": "133:19:2", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 64, + "nodeType": "Block", + "src": "220:30:2", + "statements": [ + { + "expression": { + "arguments": [], + "expression": { + "argumentTypes": [], + "expression": { + "id": 60, + "name": "num", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 55, + "src": "233:3:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "237:6:2", + "memberName": "addTwo", + "nodeType": "MemberAccess", + "referencedDeclaration": 46, + "src": "233:10:2", + "typeDescriptions": { + "typeIdentifier": "t_function_delegatecall_pure$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$", + "typeString": "function (uint256) pure returns (uint256)" + } + }, + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "233:12:2", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 59, + "id": 63, + "nodeType": "Return", + "src": "226:19:2" + } + ] + }, + "functionSelector": "0689b57e", + "id": 65, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "readonlyFunction", + "nameLocation": "166:16:2", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 56, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 55, + "mutability": "mutable", + "name": "num", + "nameLocation": "188:3:2", + "nodeType": "VariableDeclaration", + "scope": 65, + "src": "183:8:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 54, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "183:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "182:10:2" + }, + "returnParameters": { + "id": 59, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 58, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 65, + "src": "214:4:2", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 57, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "214:4:2", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "213:6:2" + }, + "scope": 66, + "src": "157:93:2", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 67, + "src": "124:128:2", + "usedErrors": [] + } + ], + "src": "39:214:2" + }, + "id": 2 + } + }, + "contracts": { + "contracts/BasicContract.sol": { + "BasicContract": { + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "eventArg", + "type": "uint256" + } + ], + "name": "BasicEvent", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "funcArg", + "type": "uint256" + } + ], + "name": "basicFunction", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "arg", + "type": "uint256" + } + ], + "name": "otherFunction", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "savedArg", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506101c6806100206000396000f3fe6080604052600436106100385760003560e01c806353a57b4a14610044578063673b6d911461006f57806392b4bb8a1461008b5761003f565b3661003f57005b600080fd5b34801561005057600080fd5b506100596100b4565b6040516100669190610117565b60405180910390f35b61008960048036038101906100849190610163565b6100ba565b005b34801561009757600080fd5b506100b260048036038101906100ad9190610163565b6100c4565b005b60005481565b8060008190555050565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a2816040516100f39190610117565b60405180910390a150565b6000819050919050565b610111816100fe565b82525050565b600060208201905061012c6000830184610108565b92915050565b600080fd5b610140816100fe565b811461014b57600080fd5b50565b60008135905061015d81610137565b92915050565b60006020828403121561017957610178610132565b5b60006101878482850161014e565b9150509291505056fea26469706673582212206e9f7ed083b7ba69491f350d1fbdd13154b9f3f71c1da0a8b9df128918bb821f64736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1C6 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x38 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x53A57B4A EQ PUSH2 0x44 JUMPI DUP1 PUSH4 0x673B6D91 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x92B4BB8A EQ PUSH2 0x8B JUMPI PUSH2 0x3F JUMP JUMPDEST CALLDATASIZE PUSH2 0x3F JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59 PUSH2 0xB4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x117 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x84 SWAP2 SWAP1 PUSH2 0x163 JUMP JUMPDEST PUSH2 0xBA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x163 JUMP JUMPDEST PUSH2 0xC4 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH32 0xB532177E7C269FCC7B98812C0FC27F2DD1970AD68F68CEA8C18F0191848377A2 DUP2 PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x117 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x111 DUP2 PUSH2 0xFE JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x12C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x108 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x140 DUP2 PUSH2 0xFE JUMP JUMPDEST DUP2 EQ PUSH2 0x14B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x15D DUP2 PUSH2 0x137 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x179 JUMPI PUSH2 0x178 PUSH2 0x132 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x187 DUP5 DUP3 DUP6 ADD PUSH2 0x14E JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH15 0x9F7ED083B7BA69491F350D1FBDD131 SLOAD 0xB9 RETURN 0xF7 SHR SAR LOG0 0xA8 0xB9 0xDF SLT DUP10 XOR 0xBB DUP3 0x1F PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "140:477:0:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@_11": { + "entryPoint": null, + "id": 11, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@basicFunction_21": { + "entryPoint": 196, + "id": 21, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@otherFunction_31": { + "entryPoint": 186, + "id": 31, + "parameterSlots": 1, + "returnSlots": 0 + }, + "@savedArg_3": { + "entryPoint": 180, + "id": 3, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_decode_t_uint256": { + "entryPoint": 334, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 355, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 264, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 279, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 254, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 306, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 311, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1374:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:3", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:3" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:3" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:3", + "type": "" + } + ], + "src": "7:77:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:3" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:3" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:3" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:3", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:3", + "type": "" + } + ], + "src": "90:118:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:3", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:3" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:3" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:3" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:3" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:3" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:3" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:3", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:3", + "type": "" + } + ], + "src": "214:222:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "482:35:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "492:19:3", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "508:2:3", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "502:5:3" + }, + "nodeType": "YulFunctionCall", + "src": "502:9:3" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "492:6:3" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "475:6:3", + "type": "" + } + ], + "src": "442:75:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "612:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "629:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "632:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "622:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "622:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "622:12:3" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "523:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "735:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "752:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "755:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "745:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "745:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "745:12:3" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "646:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "812:79:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "869:16:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "878:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "881:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "871:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "871:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "871:12:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "835:5:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "860:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "842:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "842:24:3" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "832:2:3" + }, + "nodeType": "YulFunctionCall", + "src": "832:35:3" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "825:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "825:43:3" + }, + "nodeType": "YulIf", + "src": "822:63:3" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "805:5:3", + "type": "" + } + ], + "src": "769:122:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "949:87:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "959:29:3", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "981:6:3" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "968:12:3" + }, + "nodeType": "YulFunctionCall", + "src": "968:20:3" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "959:5:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1024:5:3" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "997:26:3" + }, + "nodeType": "YulFunctionCall", + "src": "997:33:3" + }, + "nodeType": "YulExpressionStatement", + "src": "997:33:3" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "927:6:3", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "935:3:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "943:5:3", + "type": "" + } + ], + "src": "897:139:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1108:263:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "1154:83:3", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "1156:77:3" + }, + "nodeType": "YulFunctionCall", + "src": "1156:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1156:79:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1129:7:3" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1138:9:3" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1125:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1125:23:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1150:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1121:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1121:32:3" + }, + "nodeType": "YulIf", + "src": "1118:119:3" + }, + { + "nodeType": "YulBlock", + "src": "1247:117:3", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1262:15:3", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1276:1:3", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1266:6:3", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1291:63:3", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1326:9:3" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1337:6:3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1322:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1322:22:3" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1346:7:3" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1301:20:3" + }, + "nodeType": "YulFunctionCall", + "src": "1301:53:3" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1291:6:3" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1078:9:3", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1089:7:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1101:6:3", + "type": "" + } + ], + "src": "1042:329:3" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 3, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "6080604052600436106100385760003560e01c806353a57b4a14610044578063673b6d911461006f57806392b4bb8a1461008b5761003f565b3661003f57005b600080fd5b34801561005057600080fd5b506100596100b4565b6040516100669190610117565b60405180910390f35b61008960048036038101906100849190610163565b6100ba565b005b34801561009757600080fd5b506100b260048036038101906100ad9190610163565b6100c4565b005b60005481565b8060008190555050565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a2816040516100f39190610117565b60405180910390a150565b6000819050919050565b610111816100fe565b82525050565b600060208201905061012c6000830184610108565b92915050565b600080fd5b610140816100fe565b811461014b57600080fd5b50565b60008135905061015d81610137565b92915050565b60006020828403121561017957610178610132565b5b60006101878482850161014e565b9150509291505056fea26469706673582212206e9f7ed083b7ba69491f350d1fbdd13154b9f3f71c1da0a8b9df128918bb821f64736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x38 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x53A57B4A EQ PUSH2 0x44 JUMPI DUP1 PUSH4 0x673B6D91 EQ PUSH2 0x6F JUMPI DUP1 PUSH4 0x92B4BB8A EQ PUSH2 0x8B JUMPI PUSH2 0x3F JUMP JUMPDEST CALLDATASIZE PUSH2 0x3F JUMPI STOP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x50 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x59 PUSH2 0xB4 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x66 SWAP2 SWAP1 PUSH2 0x117 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x89 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x84 SWAP2 SWAP1 PUSH2 0x163 JUMP JUMPDEST PUSH2 0xBA JUMP JUMPDEST STOP JUMPDEST CALLVALUE DUP1 ISZERO PUSH2 0x97 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0xB2 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0xAD SWAP2 SWAP1 PUSH2 0x163 JUMP JUMPDEST PUSH2 0xC4 JUMP JUMPDEST STOP JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP POP JUMP JUMPDEST PUSH32 0xB532177E7C269FCC7B98812C0FC27F2DD1970AD68F68CEA8C18F0191848377A2 DUP2 PUSH1 0x40 MLOAD PUSH2 0xF3 SWAP2 SWAP1 PUSH2 0x117 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 POP JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x111 DUP2 PUSH2 0xFE JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x12C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x108 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x140 DUP2 PUSH2 0xFE JUMP JUMPDEST DUP2 EQ PUSH2 0x14B JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x15D DUP2 PUSH2 0x137 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x179 JUMPI PUSH2 0x178 PUSH2 0x132 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x187 DUP5 DUP3 DUP6 ADD PUSH2 0x14E JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH15 0x9F7ED083B7BA69491F350D1FBDD131 SLOAD 0xB9 RETURN 0xF7 SHR SAR LOG0 0xA8 0xB9 0xDF SLT DUP10 XOR 0xBB DUP3 0x1F PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "140:477:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;167:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;542:73;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;261:277;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;167:20;;;;:::o;542:73::-;607:3;596:8;:14;;;;542:73;:::o;261:277::-;514:19;525:7;514:19;;;;;;:::i;:::-;;;;;;;;261:277;:::o;7:77:3:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o" + }, + "methodIdentifiers": { + "basicFunction(uint256)": "92b4bb8a", + "otherFunction(uint256)": "673b6d91", + "savedArg()": "53a57b4a" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"eventArg\",\"type\":\"uint256\"}],\"name\":\"BasicEvent\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"funcArg\",\"type\":\"uint256\"}],\"name\":\"basicFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"arg\",\"type\":\"uint256\"}],\"name\":\"otherFunction\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"savedArg\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BasicContract.sol\":\"BasicContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/BasicContract.sol\":{\"keccak256\":\"0x4b0487815d3bbb1f6918f45cf7c0ceed07a7d8d33793d618e1c9e0eb326dba0f\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://2d5bcacee361cb0e8635f756fb98d92b90a554dccd72cfa576b4011f32571333\",\"dweb:/ipfs/QmXRizHFsYdFyZ3QJntS3jmigaYi3MZnKcB5Y8mpbDt9rR\"]}},\"version\":1}" + } + }, + "contracts/BasicLibrary.sol": { + "BasicLibrary": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "self", + "type": "uint256" + } + ], + "name": "addTwo", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea264697066735822122082ed7a81ce855fb874f96d949594ec96c01bee23c154e3d112e6d8b6a31f1cc064736f6c63430008110033", + "opcodes": "PUSH2 0x1AB PUSH2 0x53 PUSH1 0xB DUP3 DUP3 DUP3 CODECOPY DUP1 MLOAD PUSH1 0x0 BYTE PUSH1 0x73 EQ PUSH2 0x46 JUMPI PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x0 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST ADDRESS PUSH1 0x0 MSTORE PUSH1 0x73 DUP2 MSTORE8 DUP3 DUP2 RETURN INVALID PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAE57913 EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0xBB JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0xF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH2 0x79 SWAP2 SWAP1 PUSH2 0x141 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP2 EQ PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xB5 DUP2 PUSH2 0x8F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD1 JUMPI PUSH2 0xD0 PUSH2 0x80 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDF DUP5 DUP3 DUP6 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xF1 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x10C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xE8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x14C DUP3 PUSH2 0x85 JUMP JUMPDEST SWAP2 POP PUSH2 0x157 DUP4 PUSH2 0x85 JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x16F JUMPI PUSH2 0x16E PUSH2 0x112 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP3 0xED PUSH27 0x81CE855FB874F96D949594EC96C01BEE23C154E3D112E6D8B6A31F SHR 0xC0 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "64:107:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@addTwo_46": { + "entryPoint": 106, + "id": 46, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 166, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 187, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 232, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 247, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 321, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 133, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 274, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 128, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 143, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1781:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:3", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:3", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:3" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:3" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:3" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:3", + "type": "" + } + ], + "src": "7:75:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:3" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:3" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:3", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:3" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:3" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:3", + "type": "" + } + ], + "src": "334:77:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:3" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:3" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:3" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:3" + }, + "nodeType": "YulIf", + "src": "470:63:3" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:3", + "type": "" + } + ], + "src": "417:122:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:3", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:3" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:3" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:3" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:3" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:3" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:3" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:3" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:3", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:3", + "type": "" + } + ], + "src": "545:139:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "756:263:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "802:83:3", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "804:77:3" + }, + "nodeType": "YulFunctionCall", + "src": "804:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "804:79:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "777:7:3" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "786:9:3" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "773:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "773:23:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "798:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "769:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "769:32:3" + }, + "nodeType": "YulIf", + "src": "766:119:3" + }, + { + "nodeType": "YulBlock", + "src": "895:117:3", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "910:15:3", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "924:1:3", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "914:6:3", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "939:63:3", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "974:9:3" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "985:6:3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "970:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "970:22:3" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "994:7:3" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "949:20:3" + }, + "nodeType": "YulFunctionCall", + "src": "949:53:3" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "939:6:3" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "726:9:3", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "737:7:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "749:6:3", + "type": "" + } + ], + "src": "690:329:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1098:53:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1115:3:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1138:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1120:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "1120:24:3" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1108:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1108:37:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1108:37:3" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1086:5:3", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1093:3:3", + "type": "" + } + ], + "src": "1025:126:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1263:132:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1273:26:3", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1285:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1296:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1281:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1281:18:3" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1273:4:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1361:6:3" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1374:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1385:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1370:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1370:17:3" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1309:51:3" + }, + "nodeType": "YulFunctionCall", + "src": "1309:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1309:79:3" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1235:9:3", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1247:6:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1258:4:3", + "type": "" + } + ], + "src": "1157:238:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1429:152:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1446:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1449:77:3", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1439:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1439:88:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1439:88:3" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1543:1:3", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1546:4:3", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1536:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1536:15:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1536:15:3" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1567:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1570:4:3", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1560:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1560:15:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1560:15:3" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "1401:180:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1631:147:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1641:25:3", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1664:1:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1646:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "1646:20:3" + }, + "variableNames": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1641:1:3" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1675:25:3", + "value": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1698:1:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1680:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "1680:20:3" + }, + "variableNames": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1675:1:3" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1709:16:3", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1720:1:3" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1723:1:3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1716:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1716:9:3" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1709:3:3" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1749:22:3", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "1751:16:3" + }, + "nodeType": "YulFunctionCall", + "src": "1751:18:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1751:18:3" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1741:1:3" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1744:3:3" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1738:2:3" + }, + "nodeType": "YulFunctionCall", + "src": "1738:10:3" + }, + "nodeType": "YulIf", + "src": "1735:36:3" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "1618:1:3", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "1621:1:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "1627:3:3", + "type": "" + } + ], + "src": "1587:191:3" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n function checked_add_t_uint256(x, y) -> sum {\n x := cleanup_t_uint256(x)\n y := cleanup_t_uint256(y)\n sum := add(x, y)\n\n if gt(x, sum) { panic_error_0x11() }\n\n }\n\n}\n", + "id": 3, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea264697066735822122082ed7a81ce855fb874f96d949594ec96c01bee23c154e3d112e6d8b6a31f1cc064736f6c63430008110033", + "opcodes": "PUSH20 0x0 ADDRESS EQ PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x4 CALLDATASIZE LT PUSH2 0x35 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0xCAE57913 EQ PUSH2 0x3A JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x54 PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x4F SWAP2 SWAP1 PUSH2 0xBB JUMP JUMPDEST PUSH2 0x6A JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x61 SWAP2 SWAP1 PUSH2 0xF7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 PUSH1 0x2 DUP3 PUSH2 0x79 SWAP2 SWAP1 PUSH2 0x141 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x98 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP2 EQ PUSH2 0xA3 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xB5 DUP2 PUSH2 0x8F JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0xD1 JUMPI PUSH2 0xD0 PUSH2 0x80 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xDF DUP5 DUP3 DUP6 ADD PUSH2 0xA6 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0xF1 DUP2 PUSH2 0x85 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x10C PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xE8 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x14C DUP3 PUSH2 0x85 JUMP JUMPDEST SWAP2 POP PUSH2 0x157 DUP4 PUSH2 0x85 JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x16F JUMPI PUSH2 0x16E PUSH2 0x112 JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 DUP3 0xED PUSH27 0x81CE855FB874F96D949594EC96C01BEE23C154E3D112E6D8B6A31F SHR 0xC0 PUSH5 0x736F6C6343 STOP ADDMOD GT STOP CALLER ", + "sourceMap": "64:107:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;89:80;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;137:4;163:1;156:4;:8;;;;:::i;:::-;149:15;;89:80;;;:::o;88:117:3:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:126::-;1120:24;1138:5;1120:24;:::i;:::-;1115:3;1108:37;1025:126;;:::o;1157:238::-;1258:4;1296:2;1285:9;1281:18;1273:26;;1309:79;1385:1;1374:9;1370:17;1361:6;1309:79;:::i;:::-;1157:238;;;;:::o;1401:180::-;1449:77;1446:1;1439:88;1546:4;1543:1;1536:15;1570:4;1567:1;1560:15;1587:191;1627:3;1646:20;1664:1;1646:20;:::i;:::-;1641:25;;1680:20;1698:1;1680:20;:::i;:::-;1675:25;;1723:1;1720;1716:9;1709:16;;1744:3;1741:1;1738:10;1735:36;;;1751:18;;:::i;:::-;1735:36;1587:191;;;;:::o" + }, + "methodIdentifiers": { + "addTwo(uint256)": "cae57913" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"self\",\"type\":\"uint256\"}],\"name\":\"addTwo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/BasicLibrary.sol\":\"BasicLibrary\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/BasicLibrary.sol\":{\"keccak256\":\"0xa72a9b8f7d1ae9be8365c2cce358b5cf76781bf54d7c6666af19b9aa9bef4320\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://7bb28a90a7872497ada155bd4c3d280fd7c591a3679e875254ef52e8df99a2c9\",\"dweb:/ipfs/QmeJHNu8zCaM2aLcghHiJSN67tH8Q8Qpfr9z3yVBogMHWe\"]}},\"version\":1}" + } + }, + "contracts/ContractWithLibrary.sol": { + "ContractWithLibrary": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "num", + "type": "uint256" + } + ], + "name": "readonlyFunction", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 133 + } + ] + } + }, + "object": "608060405234801561001057600080fd5b50610217806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220a3a849397d571d3d782cdd91156f39592312b69527e5b81a1c01414165a298c964736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x217 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x689B57E EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0x11E JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x15A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 PUSH20 0x0 PUSH4 0xCAE57913 SWAP1 SWAP2 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x9B SWAP2 SWAP1 PUSH2 0x184 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xB8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDC SWAP2 SWAP1 PUSH2 0x1B4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFB DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP2 EQ PUSH2 0x106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x118 DUP2 PUSH2 0xF2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x134 JUMPI PUSH2 0x133 PUSH2 0xE3 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x142 DUP5 DUP3 DUP6 ADD PUSH2 0x109 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x154 DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x16F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x14B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17E DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x199 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x175 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x1AE DUP2 PUSH2 0xF2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CA JUMPI PUSH2 0x1C9 PUSH2 0xE3 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1D8 DUP5 DUP3 DUP6 ADD PUSH2 0x19F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 0xA8 0x49 CODECOPY PUSH30 0x571D3D782CDD91156F39592312B69527E5B81A1C01414165A298C964736F PUSH13 0x63430008110033000000000000 ", + "sourceMap": "124:128:2:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@readonlyFunction_65": { + "entryPoint": 96, + "id": 65, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 265, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 415, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256": { + "entryPoint": 286, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 436, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 331, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack_library": { + "entryPoint": 373, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed": { + "entryPoint": 388, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 346, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 232, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 227, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 242, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2256:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:3", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:3", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:3" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:3" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:3" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:3", + "type": "" + } + ], + "src": "7:75:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:3" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:3" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:3", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:3" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:3" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:3", + "type": "" + } + ], + "src": "334:77:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:3", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:3" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:3" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:3" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:3" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:3" + }, + "nodeType": "YulIf", + "src": "470:63:3" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:3", + "type": "" + } + ], + "src": "417:122:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:3", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:3" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:3" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:3" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:3" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:3" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:3" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:3" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:3", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:3", + "type": "" + } + ], + "src": "545:139:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "756:263:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "802:83:3", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "804:77:3" + }, + "nodeType": "YulFunctionCall", + "src": "804:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "804:79:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "777:7:3" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "786:9:3" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "773:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "773:23:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "798:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "769:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "769:32:3" + }, + "nodeType": "YulIf", + "src": "766:119:3" + }, + { + "nodeType": "YulBlock", + "src": "895:117:3", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "910:15:3", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "924:1:3", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "914:6:3", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "939:63:3", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "974:9:3" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "985:6:3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "970:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "970:22:3" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "994:7:3" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "949:20:3" + }, + "nodeType": "YulFunctionCall", + "src": "949:53:3" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "939:6:3" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "726:9:3", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "737:7:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "749:6:3", + "type": "" + } + ], + "src": "690:329:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1090:53:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1107:3:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1130:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1112:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "1112:24:3" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1100:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1100:37:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1100:37:3" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1078:5:3", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1085:3:3", + "type": "" + } + ], + "src": "1025:118:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1247:124:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1257:26:3", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1269:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1280:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1265:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1265:18:3" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1257:4:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1337:6:3" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1350:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1361:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1346:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1346:17:3" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "1293:43:3" + }, + "nodeType": "YulFunctionCall", + "src": "1293:71:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1293:71:3" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1219:9:3", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1231:6:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1242:4:3", + "type": "" + } + ], + "src": "1149:222:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1450:53:3", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1467:3:3" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1490:5:3" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1472:17:3" + }, + "nodeType": "YulFunctionCall", + "src": "1472:24:3" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1460:6:3" + }, + "nodeType": "YulFunctionCall", + "src": "1460:37:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1460:37:3" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1438:5:3", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1445:3:3", + "type": "" + } + ], + "src": "1377:126:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1615:132:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1625:26:3", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1637:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1648:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1633:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1633:18:3" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1625:4:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1713:6:3" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1726:9:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1737:1:3", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1722:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1722:17:3" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack_library", + "nodeType": "YulIdentifier", + "src": "1661:51:3" + }, + "nodeType": "YulFunctionCall", + "src": "1661:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1661:79:3" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1587:9:3", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1599:6:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1610:4:3", + "type": "" + } + ], + "src": "1509:238:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1816:80:3", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1826:22:3", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1841:6:3" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "1835:5:3" + }, + "nodeType": "YulFunctionCall", + "src": "1835:13:3" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1826:5:3" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1884:5:3" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "1857:26:3" + }, + "nodeType": "YulFunctionCall", + "src": "1857:33:3" + }, + "nodeType": "YulExpressionStatement", + "src": "1857:33:3" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1794:6:3", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1802:3:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1810:5:3", + "type": "" + } + ], + "src": "1753:143:3" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1979:274:3", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "2025:83:3", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "2027:77:3" + }, + "nodeType": "YulFunctionCall", + "src": "2027:79:3" + }, + "nodeType": "YulExpressionStatement", + "src": "2027:79:3" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2000:7:3" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2009:9:3" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "1996:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1996:23:3" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2021:2:3", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "1992:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "1992:32:3" + }, + "nodeType": "YulIf", + "src": "1989:119:3" + }, + { + "nodeType": "YulBlock", + "src": "2118:128:3", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "2133:15:3", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2147:1:3", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "2137:6:3", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "2162:74:3", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2208:9:3" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "2219:6:3" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2204:3:3" + }, + "nodeType": "YulFunctionCall", + "src": "2204:22:3" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "2228:7:3" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "2172:31:3" + }, + "nodeType": "YulFunctionCall", + "src": "2172:64:3" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "2162:6:3" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1949:9:3", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "1960:7:3", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1972:6:3", + "type": "" + } + ], + "src": "1902:351:3" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack_library(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_library_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack_library(value0, add(headStart, 0))\n\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n}\n", + "id": 3, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": { + "contracts/BasicLibrary.sol": { + "BasicLibrary": [ + { + "length": 20, + "start": 101 + } + ] + } + }, + "object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b60008173__$e24d6032859d6fb940f423f951556f4c34$__63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220a3a849397d571d3d782cdd91156f39592312b69527e5b81a1c01414165a298c964736f6c63430008110033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x689B57E EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0x11E JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x15A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 PUSH20 0x0 PUSH4 0xCAE57913 SWAP1 SWAP2 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x9B SWAP2 SWAP1 PUSH2 0x184 JUMP JUMPDEST PUSH1 0x20 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP7 GAS DELEGATECALL ISZERO DUP1 ISZERO PUSH2 0xB8 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP PUSH1 0x40 MLOAD RETURNDATASIZE PUSH1 0x1F NOT PUSH1 0x1F DUP3 ADD AND DUP3 ADD DUP1 PUSH1 0x40 MSTORE POP DUP2 ADD SWAP1 PUSH2 0xDC SWAP2 SWAP1 PUSH2 0x1B4 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xFB DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP2 EQ PUSH2 0x106 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0x118 DUP2 PUSH2 0xF2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x134 JUMPI PUSH2 0x133 PUSH2 0xE3 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x142 DUP5 DUP3 DUP6 ADD PUSH2 0x109 JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x154 DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x16F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x14B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH2 0x17E DUP2 PUSH2 0xE8 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x199 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x175 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0x1AE DUP2 PUSH2 0xF2 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1CA JUMPI PUSH2 0x1C9 PUSH2 0xE3 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x1D8 DUP5 DUP3 DUP6 ADD PUSH2 0x19F JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 LOG3 0xA8 0x49 CODECOPY PUSH30 0x571D3D782CDD91156F39592312B69527E5B81A1C01414165A298C964736F PUSH13 0x63430008110033000000000000 ", + "sourceMap": "124:128:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;157:93;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;214:4;233:3;:10;;;;:12;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;226:19;;157:93;;;:::o;88:117:3:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1472:24;1490:5;1472:24;:::i;:::-;1467:3;1460:37;1377:126;;:::o;1509:238::-;1610:4;1648:2;1637:9;1633:18;1625:26;;1661:79;1737:1;1726:9;1722:17;1713:6;1661:79;:::i;:::-;1509:238;;;;:::o;1753:143::-;1810:5;1841:6;1835:13;1826:22;;1857:33;1884:5;1857:33;:::i;:::-;1753:143;;;;:::o;1902:351::-;1972:6;2021:2;2009:9;2000:7;1996:23;1992:32;1989:119;;;2027:79;;:::i;:::-;1989:119;2147:1;2172:64;2228:7;2219:6;2208:9;2204:22;2172:64;:::i;:::-;2162:74;;2118:128;1902:351;;;;:::o" + }, + "methodIdentifiers": { + "readonlyFunction(uint256)": "0689b57e" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"num\",\"type\":\"uint256\"}],\"name\":\"readonlyFunction\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ContractWithLibrary.sol\":\"ContractWithLibrary\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/BasicLibrary.sol\":{\"keccak256\":\"0xa72a9b8f7d1ae9be8365c2cce358b5cf76781bf54d7c6666af19b9aa9bef4320\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://7bb28a90a7872497ada155bd4c3d280fd7c591a3679e875254ef52e8df99a2c9\",\"dweb:/ipfs/QmeJHNu8zCaM2aLcghHiJSN67tH8Q8Qpfr9z3yVBogMHWe\"]},\"contracts/ContractWithLibrary.sol\":{\"keccak256\":\"0x8ce80dd77898f9cdb269ac1d3273d6f648c0257494a35bcf6a7dc6dd9f9736ba\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://8bae9c4f54c946144c6de277f07f91b8c915ac9344277507ac3172f2929a1f49\",\"dweb:/ipfs/QmecMsGPWnDtmQMFX1f4wQn8mhuyK3u3XnaCSFja6nXaDT\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/listTransactions/success/deployed_addresses.json b/packages/core/test/mocks/listTransactions/success/deployed_addresses.json new file mode 100644 index 0000000000..c2ac2ad373 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/deployed_addresses.json @@ -0,0 +1,8 @@ +{ + "CompleteModule#BasicContract": "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + "CompleteModule#BasicLibrary": "0x1c947344BA932fC7f3D622600dA0199520A67EFd", + "CompleteModule#BasicLibrary2": "0xBdAce15b3211019E272418B8014971c1cefbC8f0", + "CompleteModule#BasicContract2": "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + "CompleteModule#ContractWithLibrary": "0xD369D9aB22D85C2A12bEabc0B581a419789E3755", + "CompleteModule#ContractWithLibrary2": "0xD369D9aB22D85C2A12bEabc0B581a419789E3755" +} diff --git a/packages/core/test/mocks/listTransactions/success/journal.jsonl b/packages/core/test/mocks/listTransactions/success/journal.jsonl new file mode 100644 index 0000000000..f5dd3cc743 --- /dev/null +++ b/packages/core/test/mocks/listTransactions/success/journal.jsonl @@ -0,0 +1,40 @@ + +{"chainId":31337,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"CompleteModule#BasicContract","constructorArgs":["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"],"contractName":"BasicContract","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"CompleteModule#BasicContract","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"CompleteModule#BasicContract","networkInteraction":{"data":"0x26307668729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000003b6608060405234801561001057600080fd5b50604051610396380380610396833981810160405281019061003291906100dc565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050610109565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a98261007e565b9050919050565b6100b98161009e565b81146100c457600080fd5b50565b6000815190506100d6816100b0565b92915050565b6000602082840312156100f2576100f1610079565b5b6000610100848285016100c7565b91505092915050565b61027e806101186000396000f3fe6080604052600436106100435760003560e01c806353a57b4a1461004f578063673b6d911461007a57806367e404ce1461009657806392b4bb8a146100c15761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b506100646100ea565b6040516100719190610173565b60405180910390f35b610094600480360381019061008f91906101bf565b6100f0565b005b3480156100a257600080fd5b506100ab6100fa565b6040516100b8919061022d565b60405180910390f35b3480156100cd57600080fd5b506100e860048036038101906100e391906101bf565b610120565b005b60005481565b8060008190555050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a28160405161014f9190610173565b60405180910390a150565b6000819050919050565b61016d8161015a565b82525050565b60006020820190506101886000830184610164565b92915050565b600080fd5b61019c8161015a565b81146101a757600080fd5b50565b6000813590506101b981610193565b92915050565b6000602082840312156101d5576101d461018e565b5b60006101e3848285016101aa565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610217826101ec565b9050919050565b6102278161020c565b82525050565b6000602082019050610242600083018461021e565b9291505056fea264697066735822122048e0c12634eed4d08b9eb753088008b374f8c695ef56c03075052e85d43f691f64736f6c63430008110033000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb9226600000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#BasicContract","networkInteractionId":1,"nonce":0,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2750000000"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#BasicContract","hash":"0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1","networkInteractionId":1,"receipt":{"blockHash":"0x5f764ccb78af004b771dde189d72a9d349fd2aa84b560ac90931fe08c89dcfbb","blockNumber":2,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x00000000000000000000000074e720c9b362ae3a65ff356ad62866511486bbbc","0xdc43bef9d0efaa64b8649ff96652ff258384fa41f6451a6f05f6921f08d6a37b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#BasicContract","result":{"address":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"CompleteModule#BasicLibrary","constructorArgs":[],"contractName":"BasicLibrary","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"CompleteModule#BasicLibrary","futureType":"NAMED_ARTIFACT_LIBRARY_DEPLOYMENT","libraries":{},"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"CompleteModule#BasicLibrary","networkInteraction":{"data":"0x26307668729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001fe6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea264697066735822122082ed7a81ce855fb874f96d949594ec96c01bee23c154e3d112e6d8b6a31f1cc064736f6c634300081100330000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#BasicLibrary","networkInteractionId":1,"nonce":1,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2568888156"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xee331a69f69646d8b551a1ee6514760763cb7b1c332dadb2f0d05c730e554a28"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#BasicLibrary","hash":"0xee331a69f69646d8b551a1ee6514760763cb7b1c332dadb2f0d05c730e554a28","networkInteractionId":1,"receipt":{"blockHash":"0x305a19a05a5d21db008de80a62e910f1bb8801271c5842998b3fcc30bfdb4d9a","blockNumber":3,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x0000000000000000000000001c947344ba932fc7f3d622600da0199520a67efd","0xdc43bef9d0efaa64b8649ff96652ff258384fa41f6451a6f05f6921f08d6a37b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#BasicLibrary","result":{"address":"0x1c947344BA932fC7f3D622600dA0199520A67EFd","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"CompleteModule#BasicLibrary2","constructorArgs":[],"contractName":"BasicLibrary","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"CompleteModule#BasicLibrary2","futureType":"LIBRARY_DEPLOYMENT","libraries":{},"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"CompleteModule#BasicLibrary2","networkInteraction":{"data":"0x26307668729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001fe6101ab610053600b82828239805160001a607314610046577f4e487b7100000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b30600052607381538281f3fe73000000000000000000000000000000000000000030146080604052600436106100355760003560e01c8063cae579131461003a575b600080fd5b610054600480360381019061004f91906100bb565b61006a565b60405161006191906100f7565b60405180910390f35b60006002826100799190610141565b9050919050565b600080fd5b6000819050919050565b61009881610085565b81146100a357600080fd5b50565b6000813590506100b58161008f565b92915050565b6000602082840312156100d1576100d0610080565b5b60006100df848285016100a6565b91505092915050565b6100f181610085565b82525050565b600060208201905061010c60008301846100e8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061014c82610085565b915061015783610085565b925082820190508082111561016f5761016e610112565b5b9291505056fea26469706673582212206a544cfc8f986be3fb0a207e85759e54cc759f3023d890241105de48c3f5db1d64736f6c634300081100330000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#BasicLibrary2","networkInteractionId":1,"nonce":2,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2375686798"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x6f06b87969f7543887e7cda4b0cf82426b6712a57c915593adf2dd6168f9f283"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#BasicLibrary2","hash":"0x6f06b87969f7543887e7cda4b0cf82426b6712a57c915593adf2dd6168f9f283","networkInteractionId":1,"receipt":{"blockHash":"0x0bbf4721ec67591c0929dad6f9f769bb8b6ed3cbfc4393a466c86ed9a8a51bc3","blockNumber":4,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x000000000000000000000000bdace15b3211019e272418b8014971c1cefbc8f0","0xdc43bef9d0efaa64b8649ff96652ff258384fa41f6451a6f05f6921f08d6a37b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#BasicLibrary2","result":{"address":"0xBdAce15b3211019E272418B8014971c1cefbC8f0","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"args":[40],"artifactId":"CompleteModule#BasicContract","contractAddress":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","dependencies":["CompleteModule#BasicContract"],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","functionName":"basicFunction","futureId":"CompleteModule#BasicContract.basicFunction","strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"CALL_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"CompleteModule#BasicContract.basicFunction","networkInteraction":{"data":"0x92b4bb8a0000000000000000000000000000000000000000000000000000000000000028","id":1,"to":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#BasicContract.basicFunction","networkInteractionId":1,"nonce":3,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2205446750"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0xb7b49d16087ab6351e26b2358ae211e5dac335441f323a28c6c26f0bc0c3a0a3"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#BasicContract.basicFunction","hash":"0xb7b49d16087ab6351e26b2358ae211e5dac335441f323a28c6c26f0bc0c3a0a3","networkInteractionId":1,"receipt":{"blockHash":"0xb35970ed89204452f0bb732ec1d177e4b540e1d63f40fcd13251761d5e5f7763","blockNumber":5,"logs":[{"address":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","data":"0x0000000000000000000000000000000000000000000000000000000000000028","logIndex":0,"topics":["0xb532177e7c269fcc7b98812c0fc27f2dd1970ad68f68cea8c18f0191848377a2"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#BasicContract.basicFunction","result":{"type":"SUCCESS"},"type":"CALL_EXECUTION_STATE_COMPLETE"} +{"artifactId":"CompleteModule#BasicContract2","contractAddress":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","contractName":"BasicContract","dependencies":["CompleteModule#BasicContract"],"futureId":"CompleteModule#BasicContract2","futureType":"NAMED_ARTIFACT_CONTRACT_AT","strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"CompleteModule#ContractWithLibrary","constructorArgs":[],"contractName":"ContractWithLibrary","dependencies":["CompleteModule#BasicLibrary"],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"CompleteModule#ContractWithLibrary","futureType":"CONTRACT_DEPLOYMENT","libraries":{"BasicLibrary":"0x1c947344BA932fC7f3D622600dA0199520A67EFd"},"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"CompleteModule#ContractWithLibrary","networkInteraction":{"data":"0x26307668729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc56500000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000237608060405234801561001057600080fd5b50610217806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630689b57e14610030575b600080fd5b61004a6004803603810190610045919061011e565b610060565b604051610057919061015a565b60405180910390f35b600081731c947344ba932fc7f3d622600da0199520a67efd63cae5791390916040518263ffffffff1660e01b815260040161009b9190610184565b602060405180830381865af41580156100b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100dc91906101b4565b9050919050565b600080fd5b6000819050919050565b6100fb816100e8565b811461010657600080fd5b50565b600081359050610118816100f2565b92915050565b600060208284031215610134576101336100e3565b5b600061014284828501610109565b91505092915050565b610154816100e8565b82525050565b600060208201905061016f600083018461014b565b92915050565b61017e816100e8565b82525050565b60006020820190506101996000830184610175565b92915050565b6000815190506101ae816100f2565b92915050565b6000602082840312156101ca576101c96100e3565b5b60006101d88482850161019f565b9150509291505056fea2646970667358221220c633fa737297b0a691bd22eff28934afa87e280f9bf9fd4a81f88e8748974b5564736f6c63430008110033000000000000000000","id":1,"to":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#ContractWithLibrary","networkInteractionId":1,"nonce":4,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2056273760"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x7542503401d0ad31f0c8de576c8d524535538c25050bd20f77562ecab25c4c8d"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#ContractWithLibrary","hash":"0x7542503401d0ad31f0c8de576c8d524535538c25050bd20f77562ecab25c4c8d","networkInteractionId":1,"receipt":{"blockHash":"0x800e5ccf449539b1e9eda058906a07299e50d436c72eea58cb472bc9dc42fb1d","blockNumber":6,"logs":[{"address":"0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed","data":"0x","logIndex":0,"topics":["0xb8fda7e00c6b06a2b54e58521bc5894fee35f1090e5a3bb6390bfe2b98b497f7","0x000000000000000000000000d369d9ab22d85c2a12beabc0b581a419789e3755","0xdc43bef9d0efaa64b8649ff96652ff258384fa41f6451a6f05f6921f08d6a37b"]}],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#ContractWithLibrary","result":{"address":"0xD369D9aB22D85C2A12bEabc0B581a419789E3755","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"CompleteModule#BasicContract","dependencies":["CompleteModule#BasicContract.basicFunction"],"emitterAddress":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","eventIndex":0,"eventName":"BasicEvent","futureId":"CompleteModule#BasicContract.BasicEvent.eventArg.0","nameOrIndex":"eventArg","result":{"_kind":"bigint","value":"40"},"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"txToReadFrom":"0xb7b49d16087ab6351e26b2358ae211e5dac335441f323a28c6c26f0bc0c3a0a3","type":"READ_EVENT_ARGUMENT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"CompleteModule#ContractWithLibrary2","contractAddress":"0xD369D9aB22D85C2A12bEabc0B581a419789E3755","contractName":"ContractWithLibrary","dependencies":["CompleteModule#ContractWithLibrary"],"futureId":"CompleteModule#ContractWithLibrary2","futureType":"CONTRACT_AT","strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"args":[{"_kind":"bigint","value":"42"}],"artifactId":"CompleteModule#BasicContract2","dependencies":["CompleteModule#BasicContract2"],"functionName":"otherFunction","futureId":"CompleteModule#encodeFunctionCall(CompleteModule#BasicContract2.otherFunction)","result":"0x673b6d91000000000000000000000000000000000000000000000000000000000000002a","strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"ENCODE_FUNCTION_CALL_EXECUTION_STATE_INITIALIZE"} +{"args":[{"_kind":"bigint","value":"40"}],"artifactId":"CompleteModule#ContractWithLibrary","contractAddress":"0xD369D9aB22D85C2A12bEabc0B581a419789E3755","dependencies":["CompleteModule#ContractWithLibrary","CompleteModule#BasicContract.BasicEvent.eventArg.0"],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","functionName":"readonlyFunction","futureId":"CompleteModule#ContractWithLibrary.readonlyFunction","nameOrIndex":0,"strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"type":"STATIC_CALL_EXECUTION_STATE_INITIALIZE"} +{"futureId":"CompleteModule#ContractWithLibrary.readonlyFunction","networkInteraction":{"data":"0x0689b57e0000000000000000000000000000000000000000000000000000000000000028","from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","id":1,"to":"0xD369D9aB22D85C2A12bEabc0B581a419789E3755","type":"STATIC_CALL","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#ContractWithLibrary.readonlyFunction","networkInteractionId":1,"result":{"customErrorReported":false,"returnData":"0x000000000000000000000000000000000000000000000000000000000000002a","success":true},"type":"STATIC_CALL_COMPLETE"} +{"futureId":"CompleteModule#ContractWithLibrary.readonlyFunction","result":{"type":"SUCCESS","value":{"_kind":"bigint","value":"42"}},"type":"STATIC_CALL_EXECUTION_STATE_COMPLETE"} +{"data":"0x673b6d91000000000000000000000000000000000000000000000000000000000000002a","dependencies":["CompleteModule#BasicContract2","CompleteModule#encodeFunctionCall(CompleteModule#BasicContract2.otherFunction)"],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"CompleteModule#test_send","strategy":"create2","strategyConfig":{"salt":"0x729d584e6db2fae1c6f27fee4536b75ef94a91ddae53a9411159b36c1dafc565"},"to":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","type":"SEND_DATA_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"123"}} +{"futureId":"CompleteModule#test_send","networkInteraction":{"data":"0x673b6d91000000000000000000000000000000000000000000000000000000000000002a","id":1,"to":"0x74e720c9B362ae3A65fF356ad62866511486BBBc","type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"123"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"CompleteModule#test_send","networkInteractionId":1,"nonce":5,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"1924440630"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x2870c7d9f84122caba3739be0dc2246343a87d1b216b57002654b3bd413fe8e2"},"type":"TRANSACTION_SEND"} +{"futureId":"CompleteModule#test_send","hash":"0x2870c7d9f84122caba3739be0dc2246343a87d1b216b57002654b3bd413fe8e2","networkInteractionId":1,"receipt":{"blockHash":"0x031962492abb9b013b57c06654b935fa672301daa7500b4ff332f1bfe8bfddfe","blockNumber":7,"logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"CompleteModule#test_send","result":{"type":"SUCCESS"},"type":"SEND_DATA_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index c1b0593bb9..478e3e235e 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -3,6 +3,7 @@ import { Etherscan } from "@nomicfoundation/hardhat-verify/etherscan"; import { DeploymentParameters, IgnitionError, + ListTransactionsResult, StatusResult, } from "@nomicfoundation/ignition-core"; import debug from "debug"; @@ -668,6 +669,50 @@ ignitionScope } ); +ignitionScope + .task("transactions") + .addPositionalParam( + "deploymentId", + "The id of the deployment to show transactions for" + ) + .setDescription("Show all transactions for a given deployment") + .setAction(async ({ deploymentId }: { deploymentId: string }, hre) => { + const { listTransactions } = await import("@nomicfoundation/ignition-core"); + + const { HardhatArtifactResolver } = await import( + "./hardhat-artifact-resolver" + ); + const { calculateListTransactionsDisplay } = await import( + "./ui/helpers/calculate-list-transactions-display" + ); + + const deploymentDir = path.join( + hre.config.paths.ignition, + "deployments", + deploymentId + ); + + const artifactResolver = new HardhatArtifactResolver(hre); + + let listTransactionsResult: ListTransactionsResult; + try { + listTransactionsResult = await listTransactions( + deploymentDir, + artifactResolver + ); + } catch (e) { + if (e instanceof IgnitionError && shouldBeHardhatPluginError(e)) { + throw new NomicLabsHardhatPluginError("hardhat-ignition", e.message, e); + } + + throw e; + } + + console.log( + calculateListTransactionsDisplay(deploymentId, listTransactionsResult) + ); + }); + async function resolveParametersFromModuleName( moduleName: string, ignitionPath: string diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts new file mode 100644 index 0000000000..abf5835049 --- /dev/null +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts @@ -0,0 +1,57 @@ +import { ListTransactionsResult } from "@nomicfoundation/ignition-core"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; + +export function calculateListTransactionsDisplay( + deploymentId: string, + listTransactionsResult: ListTransactionsResult +): string { + let text = `Logging transactions for deployment ${deploymentId}\n\n`; + + for (const [index, transaction] of listTransactionsResult.entries()) { + text += `Transaction ${index + 1}:\n`; + text += ` - Type: ${transactionTypeToDisplayType(transaction.type)}\n`; + text += ` - Status: ${transaction.status}\n`; + text += ` - TxHash: ${transaction.txHash}\n`; + text += ` - From: ${transaction.from}\n`; + + if (transaction.to !== undefined) { + text += ` - To: ${transaction.to}\n`; + } + + if (transaction.name !== undefined) { + text += ` - Name: ${transaction.name}\n`; + } + + if (transaction.address !== undefined) { + text += ` - Address: ${transaction.address}\n`; + } + + if (transaction.params !== undefined) { + text += ` - Params: ${JSON.stringify(transaction.params)}\n`; + } + + if (transaction.value !== undefined) { + text += ` - Value: ${transaction.value}\n`; + } + + text += "\n"; + } + + return text; +} + +function transactionTypeToDisplayType(type: string): string { + switch (type) { + case "DEPLOYMENT_EXECUTION_STATE": + return "Contract Deployment"; + case "CALL_EXECUTION_STATE": + return "Function Call"; + case "SEND_DATA_EXECUTION_STATE": + return "Generic Transaction"; + default: + throw new NomicLabsHardhatPluginError( + "hardhat-ignition", + `Unknown transaction type: ${type}` + ); + } +} From 37a2adc90ad6d44d0a3a2aa4a2aed62883ef6265 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 20 Oct 2024 23:49:05 -0400 Subject: [PATCH 1276/1302] add contractName and pending tx status --- packages/core/src/list-transactions.ts | 50 +++++++++++++++----- packages/core/src/types/list-transactions.ts | 1 + packages/core/test/list-transactions.ts | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts index 3ceafe8ee0..a2e3fe9036 100644 --- a/packages/core/src/list-transactions.ts +++ b/packages/core/src/list-transactions.ts @@ -64,14 +64,20 @@ export async function listTransactions( "Expected network interaction to be an onchain interaction" ); - for (const transaction of networkInteraction.transactions) { + for (const [ + index, + transaction, + ] of networkInteraction.transactions.entries()) { switch (exState.type) { case ExecutionSateType.DEPLOYMENT_EXECUTION_STATE: { transactions.push({ type: exState.type, from: exState.from, txHash: transaction.hash, - status: getTransactionStatus(transaction), + status: getTransactionStatus( + transaction, + index === networkInteraction.transactions.length - 1 + ), name: exState.contractName, address: transaction.receipt?.status === TransactionReceiptStatus.SUCCESS @@ -86,12 +92,19 @@ export async function listTransactions( break; } case ExecutionSateType.CALL_EXECUTION_STATE: { + const artifact = await deploymentLoader.loadArtifact( + exState.artifactId + ); + transactions.push({ type: exState.type, from: exState.from, txHash: transaction.hash, - status: getTransactionStatus(transaction), - name: exState.functionName, + status: getTransactionStatus( + transaction, + index === networkInteraction.transactions.length - 1 + ), + name: `${artifact.contractName}#${exState.functionName}`, to: networkInteraction.to, params: exState.args, value: networkInteraction.value, @@ -104,7 +117,10 @@ export async function listTransactions( type: exState.type, from: exState.from, txHash: transaction.hash, - status: getTransactionStatus(transaction), + status: getTransactionStatus( + transaction, + index === networkInteraction.transactions.length - 1 + ), to: networkInteraction.to, value: networkInteraction.value, }); @@ -132,13 +148,21 @@ function doesSendTransactions( ); } -function getTransactionStatus(transaction: Transaction): TransactionStatus { - const status = - transaction.receipt === undefined - ? TransactionStatus.DROPPED - : transaction.receipt.status === TransactionReceiptStatus.SUCCESS - ? TransactionStatus.SUCCESS - : TransactionStatus.FAILURE; +function getTransactionStatus( + transaction: Transaction, + isFinalTransaction: boolean +): TransactionStatus { + if (transaction.receipt === undefined) { + if (isFinalTransaction) { + return TransactionStatus.PENDING; + } + + return TransactionStatus.DROPPED; + } + + if (transaction.receipt.status === TransactionReceiptStatus.SUCCESS) { + return TransactionStatus.SUCCESS; + } - return status; + return TransactionStatus.FAILURE; } diff --git a/packages/core/src/types/list-transactions.ts b/packages/core/src/types/list-transactions.ts index 567ae52368..81aafa37af 100644 --- a/packages/core/src/types/list-transactions.ts +++ b/packages/core/src/types/list-transactions.ts @@ -9,6 +9,7 @@ export enum TransactionStatus { SUCCESS = "SUCCESS", FAILURE = "FAILURE", DROPPED = "DROPPED", + PENDING = "PENDING", } /** diff --git a/packages/core/test/list-transactions.ts b/packages/core/test/list-transactions.ts index 14e8fbb259..796cf06111 100644 --- a/packages/core/test/list-transactions.ts +++ b/packages/core/test/list-transactions.ts @@ -51,7 +51,7 @@ describe("listTransactions", () => { txHash: "0xb7b49d16087ab6351e26b2358ae211e5dac335441f323a28c6c26f0bc0c3a0a3", status: TransactionStatus.SUCCESS, - name: "basicFunction", + name: "BasicContract#basicFunction", to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: [40], value: 0n, From 7aa47f3fffaba6b355bbd2147ac9be8e95793105 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Tue, 22 Oct 2024 04:21:38 -0400 Subject: [PATCH 1277/1302] add opBNB and its testnet to the BNB exclusions in gas logic --- packages/core/src/internal/execution/jsonrpc-client.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/core/src/internal/execution/jsonrpc-client.ts index 17b76d81ce..cd23f8dab1 100644 --- a/packages/core/src/internal/execution/jsonrpc-client.ts +++ b/packages/core/src/internal/execution/jsonrpc-client.ts @@ -654,12 +654,15 @@ export class EIP1193JsonRpcClient implements JsonRpcClient { // Support zero gas fee chains, such as a private instances // of blockchains using Besu. We explicitly exclude BNB // Smartchain (chainId 56) and its testnet (chainId 97) + // as well as opBNB (chainId 204) and its testnet (chainId 5611) // from this logic as it is EIP-1559 compliant but // only sets a maxPriorityFeePerGas. if ( latestBlock.baseFeePerGas === 0n && chainId !== 56 && - chainId !== 97 + chainId !== 97 && + chainId !== 204 && + chainId !== 5611 ) { return { maxFeePerGas: 0n, From e72e7f466483e29bda1968abd4cc401201d76d96 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 23 Oct 2024 06:49:14 -0400 Subject: [PATCH 1278/1302] read transactions in journal order --- .../execution/deployment-state-helpers.ts | 17 -- packages/core/src/list-transactions.ts | 166 +++++++++--------- 2 files changed, 87 insertions(+), 96 deletions(-) diff --git a/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/core/src/internal/execution/deployment-state-helpers.ts index 1b6f197cdd..4b4fac4420 100644 --- a/packages/core/src/internal/execution/deployment-state-helpers.ts +++ b/packages/core/src/internal/execution/deployment-state-helpers.ts @@ -89,20 +89,3 @@ export function shouldBeJournaled(message: JournalMessage): boolean { return true; } - -/** - * Reads the journal and returns an array of future IDs in the order they were executed. - */ -export async function getExecutionOrder( - deploymentLoader: DeploymentLoader -): Promise { - const futureIds: string[] = []; - - for await (const message of deploymentLoader.readFromJournal()) { - if ("futureId" in message && !futureIds.includes(message.futureId)) { - futureIds.push(message.futureId); - } - } - - return futureIds; -} diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts index a2e3fe9036..74b39154b5 100644 --- a/packages/core/src/list-transactions.ts +++ b/packages/core/src/list-transactions.ts @@ -1,12 +1,11 @@ import type { ArtifactResolver } from "./types/artifact"; +import findLastIndex from "lodash/findLastIndex"; + import { IgnitionError } from "./errors"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; import { ERRORS } from "./internal/errors-list"; -import { - getExecutionOrder, - loadDeploymentState, -} from "./internal/execution/deployment-state-helpers"; +import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { ExecutionResultType } from "./internal/execution/types/execution-result"; import { ExecutionSateType, @@ -19,6 +18,7 @@ import { type Transaction, TransactionReceiptStatus, } from "./internal/execution/types/jsonrpc"; +import { JournalMessageType } from "./internal/execution/types/messages"; import { assertIgnitionInvariant } from "./internal/utils/assertions"; import { type ListTransactionsResult, @@ -48,86 +48,94 @@ export async function listTransactions( }); } - const executionOrder = await getExecutionOrder(deploymentLoader); const transactions: ListTransactionsResult = []; - for (const futureId of executionOrder) { - const exState = deploymentState.executionStates[futureId]; - - if (!doesSendTransactions(exState)) { + for await (const message of deploymentLoader.readFromJournal()) { + if (message.type !== JournalMessageType.TRANSACTION_SEND) { continue; } - for (const networkInteraction of exState.networkInteractions) { - assertIgnitionInvariant( - networkInteraction.type === "ONCHAIN_INTERACTION", - "Expected network interaction to be an onchain interaction" - ); - - for (const [ - index, - transaction, - ] of networkInteraction.transactions.entries()) { - switch (exState.type) { - case ExecutionSateType.DEPLOYMENT_EXECUTION_STATE: { - transactions.push({ - type: exState.type, - from: exState.from, - txHash: transaction.hash, - status: getTransactionStatus( - transaction, - index === networkInteraction.transactions.length - 1 - ), - name: exState.contractName, - address: - transaction.receipt?.status === TransactionReceiptStatus.SUCCESS - ? exState.result?.type === ExecutionResultType.SUCCESS - ? exState.result.address - : undefined - : undefined, - params: exState.constructorArgs, - value: networkInteraction.value, - }); - - break; - } - case ExecutionSateType.CALL_EXECUTION_STATE: { - const artifact = await deploymentLoader.loadArtifact( - exState.artifactId - ); - - transactions.push({ - type: exState.type, - from: exState.from, - txHash: transaction.hash, - status: getTransactionStatus( - transaction, - index === networkInteraction.transactions.length - 1 - ), - name: `${artifact.contractName}#${exState.functionName}`, - to: networkInteraction.to, - params: exState.args, - value: networkInteraction.value, - }); - - break; - } - case ExecutionSateType.SEND_DATA_EXECUTION_STATE: { - transactions.push({ - type: exState.type, - from: exState.from, - txHash: transaction.hash, - status: getTransactionStatus( - transaction, - index === networkInteraction.transactions.length - 1 - ), - to: networkInteraction.to, - value: networkInteraction.value, - }); - - break; - } - } + const exState = deploymentState.executionStates[message.futureId]; + + assertIgnitionInvariant( + doesSendTransactions(exState), + "Expected execution state to be a type that sends transactions" + ); + + const networkInteraction = + exState.networkInteractions[message.networkInteractionId - 1]; + + assertIgnitionInvariant( + networkInteraction.type === "ONCHAIN_INTERACTION", + "Expected network interaction to be an onchain interaction" + ); + + // this seems redundant, but we use it later to determine pending vs dropped status + const lastTxIndex = findLastIndex( + networkInteraction.transactions, + (tx) => tx.hash === message.transaction.hash + ); + + const transaction = networkInteraction.transactions[lastTxIndex]; + + switch (exState.type) { + case ExecutionSateType.DEPLOYMENT_EXECUTION_STATE: { + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus( + transaction, + lastTxIndex === networkInteraction.transactions.length - 1 + ), + name: exState.contractName, + address: + transaction.receipt?.status === TransactionReceiptStatus.SUCCESS + ? exState.result?.type === ExecutionResultType.SUCCESS + ? exState.result.address + : undefined + : undefined, + params: exState.constructorArgs, + value: networkInteraction.value, + }); + + break; + } + case ExecutionSateType.CALL_EXECUTION_STATE: { + const artifact = await deploymentLoader.loadArtifact( + exState.artifactId + ); + + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus( + transaction, + lastTxIndex === networkInteraction.transactions.length - 1 + ), + name: `${artifact.contractName}#${exState.functionName}`, + to: networkInteraction.to, + params: exState.args, + value: networkInteraction.value, + }); + + break; + } + case ExecutionSateType.SEND_DATA_EXECUTION_STATE: { + transactions.push({ + type: exState.type, + from: exState.from, + txHash: transaction.hash, + status: getTransactionStatus( + transaction, + lastTxIndex === networkInteraction.transactions.length - 1 + ), + to: networkInteraction.to, + value: networkInteraction.value, + }); + + break; } } } From 44ebf75ad3d0ef47f6acc7022ceac03f0e8454c0 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 24 Oct 2024 04:03:34 -0400 Subject: [PATCH 1279/1302] chore: bump version to v0.15.7 Update the packages versions and changelogs for the `0.15.7 - 2024-10-24` release. --- packages/core/CHANGELOG.md | 12 ++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 12 ++++++++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 12 ++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 12 ++++++++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/CHANGELOG.md | 12 ++++++++++++ packages/ui/package.json | 2 +- 10 files changed, 65 insertions(+), 5 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 3125c59700..0b4822966b 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + ## 0.15.6 - 2024-09-25 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index cbad7aa740..aa4eac3f59 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.6", + "version": "0.15.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index dda05605b6..02f5787a75 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + ## 0.15.6 - 2024-09-25 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index c5e8ed19fd..f3004591dd 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.6", + "version": "0.15.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index a21dbc8725..09bd8a5329 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + ## 0.15.6 - 2024-09-25 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index 1cd018828f..e5f2941792 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.6", + "version": "0.15.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index d8cb0f150f..0bc1e31049 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + ## 0.15.6 - 2024-09-25 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 966e24e332..47450ab95b 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.6", + "version": "0.15.7", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index d2329b64e9..f5ccbffb90 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.7 - 2024-10-24 + +### Added + +- New CLI command `ignition transactions` to list all transactions sent for a given deployment ID, @zoeyTM ([#821](https://github.com/NomicFoundation/hardhat-ignition/pull/821)) +- Module parameters can now be set at the global level using `$global`, @zoeyTM ([#819](https://github.com/NomicFoundation/hardhat-ignition/pull/819)) + +### Fixed + +- Gas fields are now properly set for Optimistic BNB, @zoeyTM ([#826](https://github.com/NomicFoundation/hardhat-ignition/pull/826)) +- Corrected resolution of artifacts when using fully qualified names in deployment modules, @kanej ([#822](https://github.com/NomicFoundation/hardhat-ignition/pull/822)) + ## 0.15.6 - 2024-09-25 ### Added diff --git a/packages/ui/package.json b/packages/ui/package.json index 6ff874ebae..16c82f2b9d 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.6", + "version": "0.15.7", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From 18ef1bdc9b7b5a829aeaef9aebc7807ce48a406d Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Nov 2024 03:59:57 -0500 Subject: [PATCH 1280/1302] fix serialization of bigints in transacitons command --- packages/core/src/list-transactions.ts | 14 +++++++++----- packages/core/src/types/list-transactions.ts | 2 +- packages/core/test/list-transactions.ts | 12 ++++++------ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts index 74b39154b5..038736ede0 100644 --- a/packages/core/src/list-transactions.ts +++ b/packages/core/src/list-transactions.ts @@ -95,8 +95,10 @@ export async function listTransactions( ? exState.result.address : undefined : undefined, - params: exState.constructorArgs, - value: networkInteraction.value, + params: exState.constructorArgs.map((arg) => + typeof arg === "bigint" ? arg.toString() : arg + ), + value: networkInteraction.value.toString(), }); break; @@ -116,8 +118,10 @@ export async function listTransactions( ), name: `${artifact.contractName}#${exState.functionName}`, to: networkInteraction.to, - params: exState.args, - value: networkInteraction.value, + params: exState.args.map((arg) => + typeof arg === "bigint" ? arg.toString() : arg + ), + value: networkInteraction.value.toString(), }); break; @@ -132,7 +136,7 @@ export async function listTransactions( lastTxIndex === networkInteraction.transactions.length - 1 ), to: networkInteraction.to, - value: networkInteraction.value, + value: networkInteraction.value.toString(), }); break; diff --git a/packages/core/src/types/list-transactions.ts b/packages/core/src/types/list-transactions.ts index 81aafa37af..acda8fec5e 100644 --- a/packages/core/src/types/list-transactions.ts +++ b/packages/core/src/types/list-transactions.ts @@ -26,7 +26,7 @@ export interface TransactionInfo { name?: string; // can be contract name, function name, or undefined, depending on the type address?: string; params?: SolidityParameterType[]; - value?: bigint; + value?: string; } /** diff --git a/packages/core/test/list-transactions.ts b/packages/core/test/list-transactions.ts index 796cf06111..08fd3e68ab 100644 --- a/packages/core/test/list-transactions.ts +++ b/packages/core/test/list-transactions.ts @@ -21,7 +21,7 @@ describe("listTransactions", () => { name: "BasicContract", address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], - value: 0n, + value: "0", }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -32,7 +32,7 @@ describe("listTransactions", () => { name: "BasicLibrary", address: "0x1c947344BA932fC7f3D622600dA0199520A67EFd", params: [], - value: 0n, + value: "0", }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -43,7 +43,7 @@ describe("listTransactions", () => { name: "BasicLibrary", address: "0xBdAce15b3211019E272418B8014971c1cefbC8f0", params: [], - value: 0n, + value: "0", }, { type: "CALL_EXECUTION_STATE", @@ -54,7 +54,7 @@ describe("listTransactions", () => { name: "BasicContract#basicFunction", to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: [40], - value: 0n, + value: "0", }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -65,7 +65,7 @@ describe("listTransactions", () => { name: "ContractWithLibrary", address: "0xD369D9aB22D85C2A12bEabc0B581a419789E3755", params: [], - value: 0n, + value: "0", }, { type: "SEND_DATA_EXECUTION_STATE", @@ -74,7 +74,7 @@ describe("listTransactions", () => { "0x2870c7d9f84122caba3739be0dc2246343a87d1b216b57002654b3bd413fe8e2", status: TransactionStatus.SUCCESS, to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", - value: 123n, + value: "123", }, ]; From c15671df777f3f7cb0426f004acc7acec3abc192 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 21 Nov 2024 01:24:53 -0500 Subject: [PATCH 1281/1302] revert unnecessary changes and add test --- packages/core/src/list-transactions.ts | 14 +++---- packages/core/src/types/list-transactions.ts | 2 +- packages/core/test/list-transactions.ts | 12 +++--- .../calculate-list-transactions-display.ts | 6 ++- .../calculate-list-transactions-display.ts | 38 +++++++++++++++++++ 5 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts index 038736ede0..74b39154b5 100644 --- a/packages/core/src/list-transactions.ts +++ b/packages/core/src/list-transactions.ts @@ -95,10 +95,8 @@ export async function listTransactions( ? exState.result.address : undefined : undefined, - params: exState.constructorArgs.map((arg) => - typeof arg === "bigint" ? arg.toString() : arg - ), - value: networkInteraction.value.toString(), + params: exState.constructorArgs, + value: networkInteraction.value, }); break; @@ -118,10 +116,8 @@ export async function listTransactions( ), name: `${artifact.contractName}#${exState.functionName}`, to: networkInteraction.to, - params: exState.args.map((arg) => - typeof arg === "bigint" ? arg.toString() : arg - ), - value: networkInteraction.value.toString(), + params: exState.args, + value: networkInteraction.value, }); break; @@ -136,7 +132,7 @@ export async function listTransactions( lastTxIndex === networkInteraction.transactions.length - 1 ), to: networkInteraction.to, - value: networkInteraction.value.toString(), + value: networkInteraction.value, }); break; diff --git a/packages/core/src/types/list-transactions.ts b/packages/core/src/types/list-transactions.ts index acda8fec5e..81aafa37af 100644 --- a/packages/core/src/types/list-transactions.ts +++ b/packages/core/src/types/list-transactions.ts @@ -26,7 +26,7 @@ export interface TransactionInfo { name?: string; // can be contract name, function name, or undefined, depending on the type address?: string; params?: SolidityParameterType[]; - value?: string; + value?: bigint; } /** diff --git a/packages/core/test/list-transactions.ts b/packages/core/test/list-transactions.ts index 08fd3e68ab..796cf06111 100644 --- a/packages/core/test/list-transactions.ts +++ b/packages/core/test/list-transactions.ts @@ -21,7 +21,7 @@ describe("listTransactions", () => { name: "BasicContract", address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], - value: "0", + value: 0n, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -32,7 +32,7 @@ describe("listTransactions", () => { name: "BasicLibrary", address: "0x1c947344BA932fC7f3D622600dA0199520A67EFd", params: [], - value: "0", + value: 0n, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -43,7 +43,7 @@ describe("listTransactions", () => { name: "BasicLibrary", address: "0xBdAce15b3211019E272418B8014971c1cefbC8f0", params: [], - value: "0", + value: 0n, }, { type: "CALL_EXECUTION_STATE", @@ -54,7 +54,7 @@ describe("listTransactions", () => { name: "BasicContract#basicFunction", to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: [40], - value: "0", + value: 0n, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -65,7 +65,7 @@ describe("listTransactions", () => { name: "ContractWithLibrary", address: "0xD369D9aB22D85C2A12bEabc0B581a419789E3755", params: [], - value: "0", + value: 0n, }, { type: "SEND_DATA_EXECUTION_STATE", @@ -74,7 +74,7 @@ describe("listTransactions", () => { "0x2870c7d9f84122caba3739be0dc2246343a87d1b216b57002654b3bd413fe8e2", status: TransactionStatus.SUCCESS, to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", - value: "123", + value: 123n, }, ]; diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts index abf5835049..c85765cd1f 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts @@ -27,7 +27,11 @@ export function calculateListTransactionsDisplay( } if (transaction.params !== undefined) { - text += ` - Params: ${JSON.stringify(transaction.params)}\n`; + text += ` - Params: ${JSON.stringify( + transaction.params.map((v) => + typeof v === "bigint" ? v.toString() : v + ) + )}\n`; } if (transaction.value !== undefined) { diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts new file mode 100644 index 0000000000..12b8cda444 --- /dev/null +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts @@ -0,0 +1,38 @@ +import { TransactionStatus } from "@nomicfoundation/ignition-core"; +import { assert } from "chai"; + +import { calculateListTransactionsDisplay } from "../../../src/ui/helpers/calculate-list-transactions-display"; + +describe("calculateListTransactionsDisplay", function () { + it("should serialize a bigint in transaction params", () => { + const result = calculateListTransactionsDisplay("1", [ + { + status: TransactionStatus.SUCCESS, + type: "DEPLOYMENT_EXECUTION_STATE", + txHash: + "0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + name: "BasicContract", + address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: [BigInt(42)], + value: BigInt(10), + }, + ]); + + const expected = `Logging transactions for deployment 1 + +Transaction 1: + - Type: Contract Deployment + - Status: SUCCESS + - TxHash: 0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1 + - From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + - Name: BasicContract + - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc + - Params: ["42"] + - Value: 10 + +`; + + assert.equal(result, expected); + }); +}); From f73f9c1e069193db7ffcb85be8c48008675f1a9e Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 21 Nov 2024 19:32:39 +0000 Subject: [PATCH 1282/1302] fix: add additional validation for global parameters (#832) * fix: add additional validation for global parameters Default values for parameters masked the test cases for our global parameters feature. This commit adds additional tests for parameters without default values and enhances the validations to support Global Parameters as an option. * fix: use global params where other module params exist If there is a parameter defined in Global parameters, and a different parameter defined at the module level, we were failing to find the global parameter. This has been fixed with a more explicit lookup in `resolveModuleParameter`. Two tests have been added to check module param lookup where a different global parameter exists, and global parameter lookup where a different module parameter exists. * refactor: pull out shared validation code Pull out the shared validation resolution code for module/global/default value resolution for module parameters. Fixes #834 --- .../utils/resolve-module-parameter.ts | 37 ++++------ .../futures/validateArtifactContractAt.ts | 9 ++- .../validateArtifactContractDeployment.ts | 13 ++-- .../futures/validateNamedContractAt.ts | 9 ++- .../futures/validateNamedContractCall.ts | 13 ++-- .../validateNamedContractDeployment.ts | 13 ++-- .../validateNamedEncodeFunctionCall.ts | 5 +- .../futures/validateNamedStaticCall.ts | 5 +- .../validation/futures/validateSendData.ts | 21 ++++-- .../core/src/internal/validation/utils.ts | 25 +++++++ packages/core/test/call.ts | 61 +++++++++++++-- packages/core/test/contract.ts | 53 +++++++++++-- packages/core/test/contractAt.ts | 44 ++++++++--- packages/core/test/contractAtFromArtifact.ts | 46 +++++++++--- packages/core/test/contractFromArtifact.ts | 57 ++++++++++++-- packages/core/test/encodeFunctionCall.ts | 61 +++++++++++++-- .../helpers/build-initialize-message-for.ts | 58 +++++++++++++++ packages/core/test/send.ts | 44 ++++++++++- packages/core/test/staticCall.ts | 74 +++++++++++++++++-- .../hardhat-plugin/test/module-parameters.ts | 60 ++++++++++++++- 20 files changed, 595 insertions(+), 113 deletions(-) diff --git a/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/core/src/internal/utils/resolve-module-parameter.ts index 5d4959c0e5..37b0991eb0 100644 --- a/packages/core/src/internal/utils/resolve-module-parameter.ts +++ b/packages/core/src/internal/utils/resolve-module-parameter.ts @@ -13,35 +13,28 @@ export function resolveModuleParameter( moduleParamRuntimeValue: ModuleParameterRuntimeValue, context: { deploymentParameters: DeploymentParameters; accounts: string[] } ): SolidityParameterType { - if (context.deploymentParameters === undefined) { - assertIgnitionInvariant( - moduleParamRuntimeValue.defaultValue !== undefined, - `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` - ); + const potentialParamAtModuleLevel = + context.deploymentParameters?.[moduleParamRuntimeValue.moduleId]?.[ + moduleParamRuntimeValue.name + ]; - return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); + if (potentialParamAtModuleLevel !== undefined) { + return potentialParamAtModuleLevel; } - const moduleParameters = - context.deploymentParameters[moduleParamRuntimeValue.moduleId] ?? - context.deploymentParameters.$global; - - if (moduleParameters === undefined) { - assertIgnitionInvariant( - moduleParamRuntimeValue.defaultValue !== undefined, - `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` - ); + const potentialParamAtGlobalLevel = + context.deploymentParameters?.$global?.[moduleParamRuntimeValue.name]; - return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); + if (potentialParamAtGlobalLevel !== undefined) { + return potentialParamAtGlobalLevel; } - const moduleParamValue = moduleParameters[moduleParamRuntimeValue.name]; - - if (moduleParamValue === undefined) { - return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); - } + assertIgnitionInvariant( + moduleParamRuntimeValue.defaultValue !== undefined, + `No default value provided for module parameter ${moduleParamRuntimeValue.moduleId}/${moduleParamRuntimeValue.name}` + ); - return moduleParamValue; + return _resolveDefaultValue(moduleParamRuntimeValue, context.accounts); } function _resolveDefaultValue( diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts index 4408fff9eb..a8cf5bf11c 100644 --- a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts +++ b/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts @@ -4,6 +4,7 @@ import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { ContractAtFuture } from "../../../types/module"; import { ERRORS } from "../../errors-list"; +import { resolvePotentialModuleParameterValueFrom } from "../utils"; export async function validateArtifactContractAt( future: ContractAtFuture, @@ -16,9 +17,11 @@ export async function validateArtifactContractAt( /* stage two */ if (isModuleParameterRuntimeValue(future.address)) { - const param = - deploymentParameters[future.address.moduleId]?.[future.address.name] ?? - future.address.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.address + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts index d45f7ee3a2..20f6d4dc79 100644 --- a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts @@ -11,6 +11,7 @@ import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { filterToAccountRuntimeValues, + resolvePotentialModuleParameterValueFrom, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -54,8 +55,8 @@ export async function validateArtifactContractDeployment( const missingParams = moduleParams.filter( (param) => - deploymentParameters[param.moduleId]?.[param.name] === undefined && - param.defaultValue === undefined + resolvePotentialModuleParameterValueFrom(deploymentParameters, param) === + undefined ); if (missingParams.length > 0) { @@ -67,9 +68,11 @@ export async function validateArtifactContractDeployment( } if (isModuleParameterRuntimeValue(future.value)) { - const param = - deploymentParameters[future.value.moduleId]?.[future.value.name] ?? - future.value.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.value + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts index 6e09a5d544..909247664d 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractAt.ts @@ -7,6 +7,7 @@ import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { NamedArtifactContractAtFuture } from "../../../types/module"; import { ERRORS } from "../../errors-list"; +import { resolvePotentialModuleParameterValueFrom } from "../utils"; export async function validateNamedContractAt( future: NamedArtifactContractAtFuture, @@ -31,9 +32,11 @@ export async function validateNamedContractAt( /* stage two */ if (isModuleParameterRuntimeValue(future.address)) { - const param = - deploymentParameters[future.address.moduleId]?.[future.address.name] ?? - future.address.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.address + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts index 31e081b622..34fa9f395e 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractCall.ts @@ -11,6 +11,7 @@ import { ERRORS } from "../../errors-list"; import { validateArtifactFunction } from "../../execution/abi"; import { filterToAccountRuntimeValues, + resolvePotentialModuleParameterValueFrom, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -65,8 +66,8 @@ export async function validateNamedContractCall( const missingParams = moduleParams.filter( (param) => - deploymentParameters[param.moduleId]?.[param.name] === undefined && - param.defaultValue === undefined + resolvePotentialModuleParameterValueFrom(deploymentParameters, param) === + undefined ); if (missingParams.length > 0) { @@ -78,9 +79,11 @@ export async function validateNamedContractCall( } if (isModuleParameterRuntimeValue(future.value)) { - const param = - deploymentParameters[future.value.moduleId]?.[future.value.name] ?? - future.value.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.value + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts index f10b72b86d..6a74f1705f 100644 --- a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts +++ b/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts @@ -12,6 +12,7 @@ import { validateContractConstructorArgsLength } from "../../execution/abi"; import { validateLibraryNames } from "../../execution/libraries"; import { filterToAccountRuntimeValues, + resolvePotentialModuleParameterValueFrom, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -65,8 +66,8 @@ export async function validateNamedContractDeployment( const missingParams = moduleParams.filter( (param) => - deploymentParameters[param.moduleId]?.[param.name] === undefined && - param.defaultValue === undefined + resolvePotentialModuleParameterValueFrom(deploymentParameters, param) === + undefined ); if (missingParams.length > 0) { @@ -78,9 +79,11 @@ export async function validateNamedContractDeployment( } if (isModuleParameterRuntimeValue(future.value)) { - const param = - deploymentParameters[future.value.moduleId]?.[future.value.name] ?? - future.value.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.value + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts index 25b75a030f..27a78c75a2 100644 --- a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts @@ -10,6 +10,7 @@ import { ERRORS } from "../../errors-list"; import { validateArtifactFunction } from "../../execution/abi"; import { filterToAccountRuntimeValues, + resolvePotentialModuleParameterValueFrom, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -61,8 +62,8 @@ export async function validateNamedEncodeFunctionCall( const missingParams = moduleParams.filter( (param) => - deploymentParameters[param.moduleId]?.[param.name] === undefined && - param.defaultValue === undefined + resolvePotentialModuleParameterValueFrom(deploymentParameters, param) === + undefined ); if (missingParams.length > 0) { diff --git a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts index 4d41d063dd..653aaabb46 100644 --- a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts +++ b/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts @@ -14,6 +14,7 @@ import { } from "../../execution/abi"; import { filterToAccountRuntimeValues, + resolvePotentialModuleParameterValueFrom, retrieveNestedRuntimeValues, validateAccountRuntimeValue, } from "../utils"; @@ -77,8 +78,8 @@ export async function validateNamedStaticCall( const missingParams = moduleParams.filter( (param) => - deploymentParameters[param.moduleId]?.[param.name] === undefined && - param.defaultValue === undefined + resolvePotentialModuleParameterValueFrom(deploymentParameters, param) === + undefined ); if (missingParams.length > 0) { diff --git a/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/core/src/internal/validation/futures/validateSendData.ts index 9a941117bd..5aab5045e3 100644 --- a/packages/core/src/internal/validation/futures/validateSendData.ts +++ b/packages/core/src/internal/validation/futures/validateSendData.ts @@ -7,7 +7,10 @@ import { ArtifactResolver } from "../../../types/artifact"; import { DeploymentParameters } from "../../../types/deploy"; import { SendDataFuture } from "../../../types/module"; import { ERRORS } from "../../errors-list"; -import { validateAccountRuntimeValue } from "../utils"; +import { + resolvePotentialModuleParameterValueFrom, + validateAccountRuntimeValue, +} from "../utils"; export async function validateSendData( future: SendDataFuture, @@ -31,9 +34,11 @@ export async function validateSendData( ); if (isModuleParameterRuntimeValue(future.to)) { - const param = - deploymentParameters[future.to.moduleId]?.[future.to.name] ?? - future.to.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.to + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { @@ -52,9 +57,11 @@ export async function validateSendData( } if (isModuleParameterRuntimeValue(future.value)) { - const param = - deploymentParameters[future.value.moduleId]?.[future.value.name] ?? - future.value.defaultValue; + const param = resolvePotentialModuleParameterValueFrom( + deploymentParameters, + future.value + ); + if (param === undefined) { errors.push( new IgnitionError(ERRORS.VALIDATION.MISSING_MODULE_PARAMETER, { diff --git a/packages/core/src/internal/validation/utils.ts b/packages/core/src/internal/validation/utils.ts index 527b228d3a..f52f596894 100644 --- a/packages/core/src/internal/validation/utils.ts +++ b/packages/core/src/internal/validation/utils.ts @@ -4,13 +4,38 @@ import { isFuture, isRuntimeValue, } from "../../type-guards"; +import { DeploymentParameters } from "../../types/deploy"; import { AccountRuntimeValue, ArgumentType, + ModuleParameterRuntimeValue, RuntimeValue, + SolidityParameterType, } from "../../types/module"; import { ERRORS } from "../errors-list"; +/** + * Given the deployment parameters and a ModuleParameterRuntimeValue, + * resolve the value for the ModuleParameterRuntimeValue. + * + * The logic runs, use the specific module parameter if available, + * fall back to a globally defined parameter, then finally use + * the default value. It is possible that the ModuleParameterRuntimeValue + * has no default value, in which case this function will return undefined. + */ +export function resolvePotentialModuleParameterValueFrom( + deploymentParameters: DeploymentParameters, + moduleRuntimeValue: ModuleParameterRuntimeValue +): SolidityParameterType | undefined { + return ( + deploymentParameters[moduleRuntimeValue.moduleId]?.[ + moduleRuntimeValue.name + ] ?? + deploymentParameters.$global?.[moduleRuntimeValue.name] ?? + moduleRuntimeValue.defaultValue + ); +} + export function validateAccountRuntimeValue( arv: AccountRuntimeValue, accounts: string[] diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index c57bf154ec..568e6b644b 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -762,14 +762,61 @@ m.call(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.CONTRACT_CALL ); - await assert.isFulfilled( - validateNamedContractCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) + const result = await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] ); + + assert.deepEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contract("Another", fakerArtifact, []); + m.call(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_CALL + ); + + const result = await validateNamedContractCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + { + $global: { + p: true, + }, + }, + [] + ); + + assert.deepEqual(result, []); }); it("should not validate a missing module parameter (deeply nested)", async () => { diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 99861efad8..8de703491b 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -688,14 +688,53 @@ m.contract(..., { id: "MyUniqueId"})` const [future] = getFuturesFromModule(module); - await assert.isFulfilled( - validateNamedContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ) + const result = await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] + ); + + assert.deepEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", [p]); + + return { contract1 }; + }); + + const [future] = getFuturesFromModule(module); + + const result = await validateNamedContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + { + $global: { p: 123 }, + }, + [] ); + + assert.deepEqual(result, []); }); it("should not validate a missing module parameter (deeply nested)", async () => { diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 60f0d8e58a..4bc328abe8 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -252,16 +252,42 @@ m.contractAt(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); - await assert.isFulfilled( - validateNamedContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ) + const result = await validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ); + + assert.deepStrictEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const another = m.contractAt("Another", p); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.NAMED_ARTIFACT_CONTRACT_AT ); + + const result = await validateNamedContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + { + $global: { p: "0x1234" }, + }, + [] + ); + + assert.deepStrictEqual(result, []); }); it("should not validate a module parameter of the wrong type", async () => { diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 9619482aab..79ffa04a23 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -256,16 +256,44 @@ m.contractAt(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.CONTRACT_AT ); - await assert.isFulfilled( - validateArtifactContractAt( - future as any, - setupMockArtifactResolver({ - Another: fakeArtifact, - }), - {}, - [] - ) + const result = await validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + {}, + [] + ); + + assert.deepStrictEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const another = m.contractAt("Another", fakeArtifact, p); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_AT ); + + const result = await validateArtifactContractAt( + future as any, + setupMockArtifactResolver({ + Another: fakeArtifact, + }), + { + $global: { + p: "0x1234", + }, + }, + [] + ); + + assert.deepStrictEqual(result, []); }); it("should not validate a module parameter of the wrong type", async () => { diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index e42917a3a7..bf938c39c4 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -552,14 +552,57 @@ m.contract(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.CONTRACT_DEPLOYMENT ); - await assert.isFulfilled( - validateArtifactContractDeployment( - future as any, - setupMockArtifactResolver({ Test: fakerArtifact }), - {}, - [] - ) + const result = await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + {}, + [] ); + + assert.deepStrictEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "p", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + const contract1 = m.contract("Test", fakerArtifact, [p]); + + return { contract1 }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.CONTRACT_DEPLOYMENT + ); + + const result = await validateArtifactContractDeployment( + future as any, + setupMockArtifactResolver({ Test: fakerArtifact }), + { + $global: { + p: 123, + }, + }, + [] + ); + + assert.deepStrictEqual(result, []); }); it("should not validate a module parameter of the wrong type for value", async () => { diff --git a/packages/core/test/encodeFunctionCall.ts b/packages/core/test/encodeFunctionCall.ts index 98fe0004be..3d240913fa 100644 --- a/packages/core/test/encodeFunctionCall.ts +++ b/packages/core/test/encodeFunctionCall.ts @@ -582,14 +582,61 @@ m.encodeFunctionCall(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.ENCODE_FUNCTION_CALL ); - await assert.isFulfilled( - validateNamedEncodeFunctionCall( - future as any, - setupMockArtifactResolver({ Another: fakeArtifact }), - {}, - [] - ) + const result = await validateNamedEncodeFunctionCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + {}, + [] ); + + assert.deepStrictEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + + const another = m.contract("Another", fakerArtifact, []); + m.encodeFunctionCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.ENCODE_FUNCTION_CALL + ); + + const result = await validateNamedEncodeFunctionCall( + future as any, + setupMockArtifactResolver({ Another: fakeArtifact }), + { + $global: { + p: true, + }, + }, + [] + ); + + assert.deepStrictEqual(result, []); }); it("should not validate a missing module parameter (deeply nested)", async () => { diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts index 08a460460f..c54e639c48 100644 --- a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts +++ b/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts @@ -555,6 +555,64 @@ describe("buildInitializeMessageFor", () => { }); }); + describe("resolves value when module parameter is a global parameter", () => { + beforeEach(async () => { + namedContractDeployment.value = + new ModuleParameterRuntimeValueImplementation( + "MyModule", + "passedValue", + undefined + ); + + message = (await buildInitializeMessageFor( + namedContractDeployment, + exampleDeploymentState, + basicStrategy, + { + $global: { + passedValue: BigInt(99), + }, + }, + mockDeploymentLoader, + exampleAccounts, + getDefaultSender(exampleAccounts) + )) as DeploymentExecutionStateInitializeMessage; + }); + + it("should record the value", async () => { + assert.deepStrictEqual(message.value, BigInt(99)); + }); + }); + + describe("resolves to default value for module parameter when no deployment parameters have been given", () => { + const expectedDefaultValue = BigInt(100); + + beforeEach(async () => { + namedContractDeployment.value = + new ModuleParameterRuntimeValueImplementation( + "MyModule", + "passedValue", + expectedDefaultValue + ); + + const deploymentParameters = undefined as any; + + message = (await buildInitializeMessageFor( + namedContractDeployment, + exampleDeploymentState, + basicStrategy, + deploymentParameters, + mockDeploymentLoader, + exampleAccounts, + getDefaultSender(exampleAccounts) + )) as DeploymentExecutionStateInitializeMessage; + }); + + it("should record the default value", async () => { + assert.deepStrictEqual(message.value, expectedDefaultValue); + }); + }); + describe("resolves from when runtime account used", () => { beforeEach(async () => { namedContractDeployment.from = new AccountRuntimeValueImplementation(1); diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index 2233e567a2..b61b6868b2 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -435,9 +435,40 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}, []) + const result = await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] ); + + assert.deepStrictEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const module = buildModule("Module1", (m) => { + const p = m.getParameter("p"); + m.send("id", p, 0n, ""); + + return {}; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.SEND_DATA + ); + + const result = await validateSendData( + future as any, + setupMockArtifactResolver(), + { + $global: { + p: "0x123", + }, + }, + [] + ); + + assert.deepStrictEqual(result, []); }); it("should not validate a module parameter of the wrong type for value", async () => { @@ -475,9 +506,14 @@ describe("send", () => { (v) => v.type === FutureType.SEND_DATA ); - await assert.isFulfilled( - validateSendData(future as any, setupMockArtifactResolver(), {}, []) + const result = await validateSendData( + future as any, + setupMockArtifactResolver(), + {}, + [] ); + + assert.deepStrictEqual(result, []); }); it("should not validate a negative account index", async () => { diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 771477d552..1ce966d63c 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -820,7 +820,13 @@ m.staticCall(..., { id: "MyUniqueId"})` }, ], name: "test", - outputs: [], + outputs: [ + { + internalType: "bool", + name: "result", + type: "bool", + }, + ], stateMutability: "view", type: "function", }, @@ -839,14 +845,66 @@ m.staticCall(..., { id: "MyUniqueId"})` (v) => v.type === FutureType.STATIC_CALL ); - await assert.isFulfilled( - validateNamedStaticCall( - future as any, - setupMockArtifactResolver({ Another: fakerArtifact }), - {}, - [] - ) + const result = await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakerArtifact }), + {}, + [] + ); + + assert.deepEqual(result, []); + }); + + it("should validate a missing module parameter if a global parameter is present", async () => { + const fakerArtifact: Artifact = { + ...fakeArtifact, + abi: [ + { + inputs: [ + { + internalType: "bool", + name: "b", + type: "bool", + }, + ], + name: "test", + outputs: [ + { + internalType: "bool", + name: "result", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, + ], + }; + + const module = buildModule("Module1", (m) => { + const another = m.contract("Another", []); + const p = m.getParameter("p"); + m.staticCall(another, "test", [p]); + + return { another }; + }); + + const future = getFuturesFromModule(module).find( + (v) => v.type === FutureType.STATIC_CALL ); + + const result = await validateNamedStaticCall( + future as any, + setupMockArtifactResolver({ Another: fakerArtifact }), + { + $global: { + p: "0x1234", + }, + }, + [] + ); + + assert.deepEqual(result, []); }); it("should not validate a missing module parameter (deeply nested)", async () => { diff --git a/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-plugin/test/module-parameters.ts index 4b548bf7cd..5e476c4bd0 100644 --- a/packages/hardhat-plugin/test/module-parameters.ts +++ b/packages/hardhat-plugin/test/module-parameters.ts @@ -94,7 +94,23 @@ describe("module parameters", () => { ); }); - it("should use a global parameter", async function () { + it("should use a global parameter if no module parameter is available", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("unlockTime"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { $global: { unlockTime: 1893499200000 } }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use a global parameter instead of the default value", async function () { const ignitionModule = buildModule("Test", (m) => { const unlockTime = m.getParameter("unlockTime", 100); @@ -110,6 +126,48 @@ describe("module parameters", () => { assert.equal(await result.lock.read.unlockTime(), 1893499200000); }); + it("should use the module parameter even if global parameters exist but not that specific parameter", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("moduleLevelParam"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { globalLevelParam: "should-not-be-read" }, + Test: { + moduleLevelParam: 1893499200000, + }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + + it("should use the global parameter even if module parameters exist but not that specific parameter", async function () { + const ignitionModule = buildModule("Test", (m) => { + const unlockTime = m.getParameter("globalLevelParam"); + + const lock = m.contract("Lock", [unlockTime]); + + return { lock }; + }); + + const result = await this.hre.ignition.deploy(ignitionModule, { + parameters: { + $global: { globalLevelParam: 1893499200000 }, + Test: { + moduleLevelParam: "should-not-be-read", + }, + }, + }); + + assert.equal(await result.lock.read.unlockTime(), 1893499200000); + }); + it("should use a module parameter instead of a global parameter if both are present", async function () { const ignitionModule = buildModule("Test", (m) => { const unlockTime = m.getParameter("unlockTime", 100); From 25284d04badf95dc7393df056afc35cfdaec8c6f Mon Sep 17 00:00:00 2001 From: John Kane Date: Thu, 21 Nov 2024 20:03:32 +0000 Subject: [PATCH 1283/1302] refactor: switch to replacer function for transaction list display To ensure we work with nested parameters we use a replacer function on stringify, rather than swapping out individual params. --- .../calculate-list-transactions-display.ts | 19 +++++++-- .../calculate-list-transactions-display.ts | 41 ++++++++++++++++++- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts index c85765cd1f..4527234fec 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts @@ -1,5 +1,6 @@ import { ListTransactionsResult } from "@nomicfoundation/ignition-core"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { stringify } from "json5"; export function calculateListTransactionsDisplay( deploymentId: string, @@ -27,10 +28,9 @@ export function calculateListTransactionsDisplay( } if (transaction.params !== undefined) { - text += ` - Params: ${JSON.stringify( - transaction.params.map((v) => - typeof v === "bigint" ? v.toString() : v - ) + text += ` - Params: ${stringify( + transaction.params, + transactionDisplaySerializeReplacer )}\n`; } @@ -59,3 +59,14 @@ function transactionTypeToDisplayType(type: string): string { ); } } + +export function transactionDisplaySerializeReplacer( + _key: string, + value: unknown +) { + if (typeof value === "bigint") { + return `${value}n`; + } + + return value; +} diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts index 12b8cda444..4e8fd6f488 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts @@ -28,7 +28,46 @@ Transaction 1: - From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 - Name: BasicContract - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc - - Params: ["42"] + - Params: ['42n'] + - Value: 10 + +`; + + assert.equal(result, expected); + }); + + it("should serialize bigints in nested transaction params", () => { + const result = calculateListTransactionsDisplay("1", [ + { + status: TransactionStatus.SUCCESS, + type: "DEPLOYMENT_EXECUTION_STATE", + txHash: + "0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1", + from: "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + name: "BasicContract", + address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", + params: [ + 1, + 2, + "A", + "B", + [BigInt(42), BigInt(43)], + { sub: { a: BigInt(44) } }, + ], + value: BigInt(10), + }, + ]); + + const expected = `Logging transactions for deployment 1 + +Transaction 1: + - Type: Contract Deployment + - Status: SUCCESS + - TxHash: 0x65c7c0850d014fe44aced2249b3b3523c3a29e5e40b6388b6d84b28c0345b9e1 + - From: 0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266 + - Name: BasicContract + - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc + - Params: [1,2,'A','B',['42n','43n'],{sub:{a:'44n'}}] - Value: 10 `; From bca332d5812a7d384bcc4671c5fffca208ca64fe Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 22 Nov 2024 00:33:02 -0500 Subject: [PATCH 1284/1302] format value field to match bignumber formatting in params --- .../src/ui/helpers/calculate-list-transactions-display.ts | 2 +- .../test/ui/helpers/calculate-list-transactions-display.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts index 4527234fec..78b6bb717f 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts @@ -35,7 +35,7 @@ export function calculateListTransactionsDisplay( } if (transaction.value !== undefined) { - text += ` - Value: ${transaction.value}\n`; + text += ` - Value: '${transaction.value}n'\n`; } text += "\n"; diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts index 4e8fd6f488..d1c950e954 100644 --- a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts @@ -29,7 +29,7 @@ Transaction 1: - Name: BasicContract - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc - Params: ['42n'] - - Value: 10 + - Value: '10n' `; @@ -68,7 +68,7 @@ Transaction 1: - Name: BasicContract - Address: 0x74e720c9B362ae3A65fF356ad62866511486BBBc - Params: [1,2,'A','B',['42n','43n'],{sub:{a:'44n'}}] - - Value: 10 + - Value: '10n' `; From 4498a33c22af360231badc1d1023be58e7b11e12 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 22 Nov 2024 02:54:48 -0500 Subject: [PATCH 1285/1302] chore: bump version to v0.15.8 Update the packages versions and changelogs for the `0.15.8 - 2024-11-22` release. --- packages/core/CHANGELOG.md | 7 +++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 7 +++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 7 +++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 7 +++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/CHANGELOG.md | 7 +++++++ packages/ui/package.json | 2 +- 10 files changed, 40 insertions(+), 5 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0b4822966b..8538d1f3e9 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + ## 0.15.7 - 2024-10-24 ### Added diff --git a/packages/core/package.json b/packages/core/package.json index aa4eac3f59..84f89d174c 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.7", + "version": "0.15.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index 02f5787a75..f52c0beb89 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + ## 0.15.7 - 2024-10-24 ### Added diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index f3004591dd..3f6aa0980b 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.7", + "version": "0.15.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 09bd8a5329..877d637f33 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + ## 0.15.7 - 2024-10-24 ### Added diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index e5f2941792..ac13da444d 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.7", + "version": "0.15.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 0bc1e31049..8ef9618be4 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + ## 0.15.7 - 2024-10-24 ### Added diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 47450ab95b..3456085101 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.7", + "version": "0.15.8", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index f5ccbffb90..2a270bec08 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.8 - 2024-11-22 + +### Fixed + +- `transactions` command now properly serializes `bigint` values, @zoeyTM ([#837](https://github.com/NomicFoundation/hardhat-ignition/pull/837)) +- Additional validations added for global parameters, @kanej ([#832](https://github.com/NomicFoundation/hardhat-ignition/pull/832)) + ## 0.15.7 - 2024-10-24 ### Added diff --git a/packages/ui/package.json b/packages/ui/package.json index 16c82f2b9d..0f335ae3d3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.7", + "version": "0.15.8", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From df38b4d7ee10e5bab60a254ad09698320d00e202 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Fri, 1 Nov 2024 01:41:35 -0400 Subject: [PATCH 1286/1302] allow ignition modules as a dependency for futures --- .../core/src/ignition-module-serializer.ts | 59 ++++++++++++++----- packages/core/src/internal/batcher.ts | 23 +++++++- packages/core/src/internal/module-builder.ts | 40 +++++++++++++ packages/core/src/internal/module.ts | 2 +- .../utils/adjacency-list-converter.ts | 13 ++-- packages/core/src/types/module-builder.ts | 28 ++++----- packages/core/src/types/module.ts | 22 +++---- packages/core/src/types/serialization.ts | 2 +- packages/core/test/batcher.ts | 10 +++- packages/core/test/call.ts | 10 +++- packages/core/test/contract.ts | 12 +++- packages/core/test/contractAt.ts | 10 +++- packages/core/test/contractAtFromArtifact.ts | 10 +++- packages/core/test/contractFromArtifact.ts | 10 +++- packages/core/test/encodeFunctionCall.ts | 12 +++- packages/core/test/library.ts | 10 +++- packages/core/test/libraryFromArtifact.ts | 10 +++- packages/core/test/send.ts | 12 +++- packages/core/test/staticCall.ts | 10 +++- packages/core/test/types/module.ts | 2 +- packages/ui/examples/ComplexModule.js | 12 +++- packages/ui/src/main.css | 6 ++ .../components/deployment-flow.tsx | 13 +++- packages/ui/src/utils/to-mermaid.ts | 7 ++- 24 files changed, 269 insertions(+), 76 deletions(-) diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/core/src/ignition-module-serializer.ts index 11808b00b1..a04b0fe62b 100644 --- a/packages/core/src/ignition-module-serializer.ts +++ b/packages/core/src/ignition-module-serializer.ts @@ -136,7 +136,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, constructorArgs: future.constructorArgs.map((arg) => @@ -161,7 +163,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, artifact: future.artifact, @@ -187,7 +191,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, from: isRuntimeValue(future.from) @@ -204,7 +210,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, artifact: future.artifact, @@ -222,7 +230,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, @@ -245,7 +255,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, @@ -264,7 +276,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contract: this._convertFutureToFutureToken(future.contract), functionName: future.functionName, @@ -279,7 +293,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, address: isFuture(future.address) @@ -298,7 +314,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), contractName: future.contractName, artifact: future.artifact, @@ -318,7 +336,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), futureToReadFrom: this._convertFutureToFutureToken( future.futureToReadFrom @@ -336,7 +356,9 @@ export class IgnitionModuleSerializer { moduleId: future.module.id, type: future.type, dependencies: Array.from(future.dependencies).map((d) => - this._convertFutureToFutureToken(d) + isFuture(d) + ? this._convertFutureToFutureToken(d) + : this._convertModuleToModuleToken(d) ), to: isFuture(future.to) ? this._convertFutureToFutureToken(future.to) @@ -475,7 +497,14 @@ export class IgnitionModuleDeserializer { ); for (const dependencyId of serializedFuture.dependencies) { - const dependency = this._lookup(futuresLookup, dependencyId.futureId); + let dependency: Future | IgnitionModule; + + if (dependencyId._kind === "FutureToken") { + dependency = this._lookup(futuresLookup, dependencyId.futureId); + } else { + dependency = this._lookup(modulesLookup, dependencyId.moduleId); + } + future.dependencies.add(dependency); } @@ -548,8 +577,10 @@ export class IgnitionModuleDeserializer { for (const serializedFuture of serializedFutures) { for (const dependencyToken of serializedFuture.dependencies) { - const dependency = serializedFuturesMap[dependencyToken.futureId]; - graph.get(dependency)!.add(serializedFuture); + if (dependencyToken._kind === "FutureToken") { + const dependency = serializedFuturesMap[dependencyToken.futureId]; + graph.get(dependency)!.add(serializedFuture); + } } } diff --git a/packages/core/src/internal/batcher.ts b/packages/core/src/internal/batcher.ts index 3c4ef0b90d..ef5264ae72 100644 --- a/packages/core/src/internal/batcher.ts +++ b/packages/core/src/internal/batcher.ts @@ -130,7 +130,28 @@ export class Batcher { ): boolean { const dependencies = batchState.adjacencyList.getDependenciesFor(futureId); - return [...dependencies].every( + return [...dependencies].every((depId) => { + if (/#/.test(depId)) { + return batchState.visitState[depId] === VisitStatus.VISITED; + } + + return this._checkModuleDependencyIsComplete(depId, batchState); + }); + } + + /** + * This is needed because moduleIds are not present in the visit state + * causing an infinite loop when checking whether a depenedency is visited if that dependency is a module. + */ + private static _checkModuleDependencyIsComplete( + moduleId: string, + batchState: BatchState + ) { + const dependencies = Object.keys(batchState.visitState).filter((futureId) => + futureId.startsWith(moduleId) + ); + + return dependencies.every( (depId) => batchState.visitState[depId] === VisitStatus.VISITED ); } diff --git a/packages/core/src/internal/module-builder.ts b/packages/core/src/internal/module-builder.ts index 40d3d7f60a..5dd313193c 100644 --- a/packages/core/src/internal/module-builder.ts +++ b/packages/core/src/internal/module-builder.ts @@ -299,6 +299,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } for (const libraryFuture of Object.values(options.libraries)) { @@ -356,6 +360,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } for (const libraryFuture of Object.values(options.libraries)) { @@ -426,6 +434,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } for (const libraryFuture of Object.values(options.libraries)) { @@ -470,6 +482,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } for (const libraryFuture of Object.values(options.libraries)) { @@ -543,6 +559,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } this._module.futures.add(future); @@ -607,6 +627,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } this._module.futures.add(future); @@ -669,6 +693,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } this._module.futures.add(future); @@ -774,6 +802,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } if (isFuture(address)) { @@ -819,6 +851,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } if (isFuture(address)) { @@ -953,6 +989,10 @@ class IgnitionModuleBuilderImplementation< for (const afterFuture of options.after ?? []) { future.dependencies.add(afterFuture); + + if (!isFuture(afterFuture)) { + this._module.submodules.add(afterFuture); + } } this._module.futures.add(future); diff --git a/packages/core/src/internal/module.ts b/packages/core/src/internal/module.ts index afa58b40cc..7ce4820f06 100644 --- a/packages/core/src/internal/module.ts +++ b/packages/core/src/internal/module.ts @@ -27,7 +27,7 @@ import { const customInspectSymbol = Symbol.for("util.inspect.custom"); abstract class BaseFutureImplementation { - public readonly dependencies: Set = new Set(); + public readonly dependencies: Set = new Set(); constructor( public readonly id: string, diff --git a/packages/core/src/internal/utils/adjacency-list-converter.ts b/packages/core/src/internal/utils/adjacency-list-converter.ts index e2993f4412..7a10ebfcd4 100644 --- a/packages/core/src/internal/utils/adjacency-list-converter.ts +++ b/packages/core/src/internal/utils/adjacency-list-converter.ts @@ -1,3 +1,4 @@ +import { isFuture } from "../../type-guards"; import { Future } from "../../types/module"; import { AdjacencyList } from "./adjacency-list"; @@ -12,11 +13,13 @@ export class AdjacencyListConverter { for (const dependency of future.dependencies) { dependencyGraph.addDependency({ from: future.id, to: dependency.id }); - this._optionallyAddDependenciesSubmoduleSiblings( - dependencyGraph, - future, - dependency - ); + if (isFuture(dependency)) { + this._optionallyAddDependenciesSubmoduleSiblings( + dependencyGraph, + future, + dependency + ); + } } } diff --git a/packages/core/src/types/module-builder.ts b/packages/core/src/types/module-builder.ts index 4a8221af2b..4daad36618 100644 --- a/packages/core/src/types/module-builder.ts +++ b/packages/core/src/types/module-builder.ts @@ -35,9 +35,9 @@ export interface ContractOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; /** * The libraries to link to the contract. @@ -71,9 +71,9 @@ export interface LibraryOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; /** * The libraries to link to the contract. @@ -98,9 +98,9 @@ export interface CallOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; /** * The value in wei to send with the transaction. @@ -129,9 +129,9 @@ export interface StaticCallOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; /** * The account to send the transaction from. @@ -151,9 +151,9 @@ export interface EncodeFunctionCallOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; } /** @@ -168,9 +168,9 @@ export interface ContractAtOptions { id?: string; /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; } /** @@ -204,9 +204,9 @@ export interface ReadEventArgumentOptions { */ export interface SendDataOptions { /** - * The futures to execute before this one. + * The futures or Ignition modules to execute before this one. */ - after?: Future[]; + after?: Array; /** * The account to send the transaction from. diff --git a/packages/core/src/types/module.ts b/packages/core/src/types/module.ts index 55732b36bc..45160b1542 100644 --- a/packages/core/src/types/module.ts +++ b/packages/core/src/types/module.ts @@ -134,7 +134,7 @@ export interface NamedArtifactContractDeploymentFuture< type: FutureType.NAMED_ARTIFACT_CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: ContractNameT; constructorArgs: ArgumentType[]; libraries: Record>; @@ -156,7 +156,7 @@ export interface ContractDeploymentFuture { type: FutureType.CONTRACT_DEPLOYMENT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: string; artifact: Artifact; constructorArgs: ArgumentType[]; @@ -180,7 +180,7 @@ export interface NamedArtifactLibraryDeploymentFuture< type: FutureType.NAMED_ARTIFACT_LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: LibraryNameT; libraries: Record>; from: string | AccountRuntimeValue | undefined; @@ -196,7 +196,7 @@ export interface LibraryDeploymentFuture { type: FutureType.LIBRARY_DEPLOYMENT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: string; artifact: Artifact; libraries: Record>; @@ -215,7 +215,7 @@ export interface ContractCallFuture< type: FutureType.CONTRACT_CALL; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; @@ -239,7 +239,7 @@ export interface StaticCallFuture< type: FutureType.STATIC_CALL; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contract: ContractFuture; functionName: FunctionNameT; nameOrIndex: string | number; @@ -259,7 +259,7 @@ export interface EncodeFunctionCallFuture< type: FutureType.ENCODE_FUNCTION_CALL; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contract: ContractFuture; functionName: FunctionNameT; args: ArgumentType[]; @@ -274,7 +274,7 @@ export interface NamedArtifactContractAtFuture { type: FutureType.NAMED_ARTIFACT_CONTRACT_AT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: ContractNameT; address: | string @@ -292,7 +292,7 @@ export interface ContractAtFuture { type: FutureType.CONTRACT_AT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; contractName: string; address: | string @@ -311,7 +311,7 @@ export interface ReadEventArgumentFuture { type: FutureType.READ_EVENT_ARGUMENT; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; futureToReadFrom: | NamedArtifactContractDeploymentFuture | ContractDeploymentFuture @@ -332,7 +332,7 @@ export interface SendDataFuture { type: FutureType.SEND_DATA; id: string; module: IgnitionModule; - dependencies: Set; + dependencies: Set; to: | string | AddressResolvableFuture diff --git a/packages/core/src/types/serialization.ts b/packages/core/src/types/serialization.ts index 025c3c9d70..72289b6750 100644 --- a/packages/core/src/types/serialization.ts +++ b/packages/core/src/types/serialization.ts @@ -64,7 +64,7 @@ export interface ModuleToken { export interface BaseSerializedFuture { id: string; type: FutureType; - dependencies: FutureToken[]; + dependencies: Array; moduleId: string; } diff --git a/packages/core/test/batcher.ts b/packages/core/test/batcher.ts index 8d2c25d753..e735708e1f 100644 --- a/packages/core/test/batcher.ts +++ b/packages/core/test/batcher.ts @@ -40,9 +40,14 @@ describe("batcher", () => { }); it("should batch through dependencies", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const ignitionModule = buildModule("Module1", (m) => { const contract1 = m.contract("Contract1"); - const contract2 = m.contract("Contract2"); + const contract2 = m.contract("Contract2", [], { after: [otherModule] }); const contract3 = m.contract("Contract3", [contract1, contract2]); @@ -58,7 +63,8 @@ describe("batcher", () => { }); assertBatching({ ignitionModule }, [ - ["Module1#Contract1", "Module1#Contract2"], + ["Module1#Contract1", "Module2#Example"], + ["Module1#Contract2"], ["Module1#Contract3"], ["Module1#Contract4", "Module1#Contract5"], ]); diff --git a/packages/core/test/call.ts b/packages/core/test/call.ts index 568e6b644b..6dd4debead 100644 --- a/packages/core/test/call.ts +++ b/packages/core/test/call.ts @@ -87,11 +87,16 @@ describe("call", () => { }); it("should be able to pass one contract as an after dependency of a call", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contract("Another"); - m.call(example, "test", [], { after: [another] }); + m.call(example, "test", [], { after: [another, otherModule] }); return { example, another }; }); @@ -114,9 +119,10 @@ describe("call", () => { assert.fail("Not a named contract deployment"); } - assert.equal(callFuture.dependencies.size, 2); + assert.equal(callFuture.dependencies.size, 3); assert(callFuture.dependencies.has(exampleFuture!)); assert(callFuture.dependencies.has(anotherFuture!)); + assert(callFuture.dependencies.has(otherModule!)); }); it("should be able to pass value as an option", () => { diff --git a/packages/core/test/contract.ts b/packages/core/test/contract.ts index 8de703491b..395447ef36 100644 --- a/packages/core/test/contract.ts +++ b/packages/core/test/contract.ts @@ -78,9 +78,16 @@ describe("contract", () => { }); it("should be able to pass one contract as an after dependency of another", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - const another = m.contract("Another", [], { after: [example] }); + const another = m.contract("Another", [], { + after: [example, otherModule], + }); return { example, another }; }); @@ -101,8 +108,9 @@ describe("contract", () => { assert.fail("Not a named contract deployment"); } - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule!)); }); it("should be able to pass a library as a dependency of a contract", () => { diff --git a/packages/core/test/contractAt.ts b/packages/core/test/contractAt.ts index 4bc328abe8..aacfb2308a 100644 --- a/packages/core/test/contractAt.ts +++ b/packages/core/test/contractAt.ts @@ -47,10 +47,15 @@ describe("contractAt", () => { }); it("should be able to pass an after dependency", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contractAt("Another", exampleAddress, { - after: [example], + after: [example, otherModule], }); return { example, another }; @@ -61,8 +66,9 @@ describe("contractAt", () => { const exampleFuture = moduleWithDependentContracts.results.example; const anotherFuture = moduleWithDependentContracts.results.another; - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule)); }); it("should be able to pass a static call future as the address", () => { diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/core/test/contractAtFromArtifact.ts index 79ffa04a23..fe24838603 100644 --- a/packages/core/test/contractAtFromArtifact.ts +++ b/packages/core/test/contractAtFromArtifact.ts @@ -48,10 +48,15 @@ describe("contractAtFromArtifact", () => { }); it("should be able to pass an after dependency", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contractAt("Another", fakeArtifact, exampleAddress, { - after: [example], + after: [example, otherModule], }); return { example, another }; @@ -62,8 +67,9 @@ describe("contractAtFromArtifact", () => { const exampleFuture = moduleWithDependentContracts.results.example; const anotherFuture = moduleWithDependentContracts.results.another; - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule)); }); it("should be able to pass a static call future as the address", () => { diff --git a/packages/core/test/contractFromArtifact.ts b/packages/core/test/contractFromArtifact.ts index bf938c39c4..024588200f 100644 --- a/packages/core/test/contractFromArtifact.ts +++ b/packages/core/test/contractFromArtifact.ts @@ -70,10 +70,15 @@ describe("contractFromArtifact", () => { }); it("should be able to pass an after dependency", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contract("Another", fakeArtifact, [], { - after: [example], + after: [example, otherModule], }); return { example, another }; @@ -84,8 +89,9 @@ describe("contractFromArtifact", () => { const exampleFuture = moduleWithDependentContracts.results.example; const anotherFuture = moduleWithDependentContracts.results.another; - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule)); }); it("should be able to pass a library as a dependency of a contract", () => { diff --git a/packages/core/test/encodeFunctionCall.ts b/packages/core/test/encodeFunctionCall.ts index 3d240913fa..6dc23cea2f 100644 --- a/packages/core/test/encodeFunctionCall.ts +++ b/packages/core/test/encodeFunctionCall.ts @@ -87,11 +87,18 @@ describe("encodeFunctionCall", () => { }); it("should be able to pass one contract as an after dependency of a call", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contract("Another"); - m.encodeFunctionCall(example, "test", [], { after: [another] }); + m.encodeFunctionCall(example, "test", [], { + after: [another, otherModule], + }); return { example, another }; }); @@ -114,9 +121,10 @@ describe("encodeFunctionCall", () => { assert.fail("Not a named encode function call future"); } - assert.equal(callFuture.dependencies.size, 2); + assert.equal(callFuture.dependencies.size, 3); assert(callFuture.dependencies.has(exampleFuture!)); assert(callFuture.dependencies.has(anotherFuture!)); + assert(callFuture.dependencies.has(otherModule!)); }); describe("Arguments", () => { diff --git a/packages/core/test/library.ts b/packages/core/test/library.ts index 88191fdb18..6ec758db0c 100644 --- a/packages/core/test/library.ts +++ b/packages/core/test/library.ts @@ -45,9 +45,14 @@ describe("library", () => { }); it("should be able to pass one library as an after dependency of another", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.library("Example"); - const another = m.library("Another", { after: [example] }); + const another = m.library("Another", { after: [example, otherModule] }); return { example, another }; }); @@ -68,8 +73,9 @@ describe("library", () => { assert.fail("Not a named library deployment"); } - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule!)); }); it("should be able to pass a library as a dependency of a library", () => { diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/core/test/libraryFromArtifact.ts index d63d214c2d..c5dfe33750 100644 --- a/packages/core/test/libraryFromArtifact.ts +++ b/packages/core/test/libraryFromArtifact.ts @@ -41,10 +41,15 @@ describe("libraryFromArtifact", () => { }); it("should be able to pass an after dependency", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.library("Example"); const another = m.library("Another", fakeArtifact, { - after: [example], + after: [example, otherModule], }); return { example, another }; @@ -55,8 +60,9 @@ describe("libraryFromArtifact", () => { const exampleFuture = moduleWithDependentContracts.results.example; const anotherFuture = moduleWithDependentContracts.results.another; - assert.equal(anotherFuture.dependencies.size, 1); + assert.equal(anotherFuture.dependencies.size, 2); assert(anotherFuture.dependencies.has(exampleFuture!)); + assert(anotherFuture.dependencies.has(otherModule!)); }); it("should be able to pass a library as a dependency of a library", () => { diff --git a/packages/core/test/send.ts b/packages/core/test/send.ts index b61b6868b2..ee2846ca6a 100644 --- a/packages/core/test/send.ts +++ b/packages/core/test/send.ts @@ -79,9 +79,16 @@ describe("send", () => { }); it("should be able to pass one contract as an after dependency of a send", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); - m.send("test_send", exampleAddress, 0n, "", { after: [example] }); + m.send("test_send", exampleAddress, 0n, "", { + after: [example, otherModule], + }); return { example }; }); @@ -100,8 +107,9 @@ describe("send", () => { assert.fail("Not a send data future"); } - assert.equal(sendFuture.dependencies.size, 1); + assert.equal(sendFuture.dependencies.size, 2); assert(sendFuture.dependencies.has(exampleFuture!)); + assert(sendFuture.dependencies.has(otherModule!)); }); it("should be able to pass a value", () => { diff --git a/packages/core/test/staticCall.ts b/packages/core/test/staticCall.ts index 1ce966d63c..3da0fb56a6 100644 --- a/packages/core/test/staticCall.ts +++ b/packages/core/test/staticCall.ts @@ -88,11 +88,16 @@ describe("static call", () => { }); it("should be able to pass one contract as an after dependency of a static call", () => { + const otherModule = buildModule("Module2", (m) => { + const example = m.contract("Example"); + return { example }; + }); + const moduleWithDependentContracts = buildModule("Module1", (m) => { const example = m.contract("Example"); const another = m.contract("Another"); - m.staticCall(example, "test", [], 0, { after: [another] }); + m.staticCall(example, "test", [], 0, { after: [another, otherModule] }); return { example, another }; }); @@ -115,9 +120,10 @@ describe("static call", () => { assert.fail("Not a named contract deployment"); } - assert.equal(callFuture.dependencies.size, 2); + assert.equal(callFuture.dependencies.size, 3); assert(callFuture.dependencies.has(exampleFuture!)); assert(callFuture.dependencies.has(anotherFuture!)); + assert(callFuture.dependencies.has(otherModule!)); }); it("should be able to pass its result into another call", () => { diff --git a/packages/core/test/types/module.ts b/packages/core/test/types/module.ts index 3adbad4654..0eb14c6ae4 100644 --- a/packages/core/test/types/module.ts +++ b/packages/core/test/types/module.ts @@ -17,7 +17,7 @@ interface BaseFuture { id: string; type: FutureType; module: IgnitionModule; - dependencies: Set; + dependencies: Set; } interface BaseRuntimeValue { diff --git a/packages/ui/examples/ComplexModule.js b/packages/ui/examples/ComplexModule.js index 519235d305..64db7dd2e3 100644 --- a/packages/ui/examples/ComplexModule.js +++ b/packages/ui/examples/ComplexModule.js @@ -2,8 +2,18 @@ import { buildModule } from "@nomicfoundation/ignition-core"; const fakeArtifact = ["fake artifact"]; +const fakeModuleDependency = buildModule("FakeModule", (m) => { + const contract = m.contract("FakeContract", [1, 2, 3]); + + m.call(contract, "initialize", [4, 5, 6]); + + return {}; +}); + const uniswap = buildModule("Uniswap", (m) => { - const router = m.contract("UniswapRouter", [1, 2, 3]); + const router = m.contract("UniswapRouter", [1, 2, 3], { + after: [fakeModuleDependency], + }); m.call(router, "configure", [3, 4, 5]); diff --git a/packages/ui/src/main.css b/packages/ui/src/main.css index 5d0a72307b..f46bfd0033 100644 --- a/packages/ui/src/main.css +++ b/packages/ui/src/main.css @@ -43,6 +43,12 @@ body { max-width: 391px !important; } +span.future-to-module-arrow { + font-weight: 900 !important; + font-size: medium !important; + letter-spacing: -2px; +} + /* mermaid styles */ .mermaid { diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 419ab844c7..23c13e8b9c 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -100,12 +100,19 @@ const FlowTooltip: React.FC = () => (
    Diagram reference
    - Future to future dependency + Future to future dependency         - ---> + + -----------> + +
    + Future to module dependency      + + ----> +
    Module to module dependency     - - - -> + - - ->
    ); diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/ui/src/utils/to-mermaid.ts index 02d681db78..f37dcfd87d 100644 --- a/packages/ui/src/utils/to-mermaid.ts +++ b/packages/ui/src/utils/to-mermaid.ts @@ -22,12 +22,15 @@ export function toMermaid( ...new Set( getAllFuturesForModule(ignitionModule) .flatMap((f) => - Array.from(f.dependencies).map((d) => [ + Array.from(f.dependencies).map<[string, string, boolean]>((d) => [ toEscapedId(f.id), toEscapedId(d.id), + /#/.test(d.id), ]) ) - .map(([from, to]) => `${from} --> ${to}`) + .map( + ([from, to, isFuture]) => `${from} ${isFuture ? "-->" : "==>"} ${to}` + ) ), ].join("\n"); From 53c0ee4a2f55a1e1421937b2551f19d78b17ea50 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 20 Nov 2024 01:45:32 -0500 Subject: [PATCH 1287/1302] fix existing library bug and add comment for known issue --- .../components/deployment-flow.tsx | 7 +++++++ .../visualization-overview/components/future-header.tsx | 9 --------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx index 23c13e8b9c..99f6f5871f 100644 --- a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx +++ b/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx @@ -93,6 +93,13 @@ const VisualizeDiv = styled.div` width: 100%; `; +// TODO: when we added the future-to-module dependency, we created a non-ideal situation where +// a module-to-module dependency arrow still gets added to the mermaid graph, even if the dependant module +// is only used as a future-to-module dependency. This is because the dependant module has to get added to the +// parent module as a submodule, and we currently don't have a way of distinguishing at this point in the code between +// a submodule that is exclusively used as a future-to-module dependency (i.e. in { after: [...] }) +// and a submodule that is used as a module-to-module dependency (i.e. in m.useModule(...)). +// This is a known issue that we have decided to revisit at a later point in time because the solution is not trivial. const FlowTooltip: React.FC = () => ( diff --git a/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/ui/src/pages/visualization-overview/components/future-header.tsx index 211991dd6b..ccbe4753a4 100644 --- a/packages/ui/src/pages/visualization-overview/components/future-header.tsx +++ b/packages/ui/src/pages/visualization-overview/components/future-header.tsx @@ -8,15 +8,6 @@ export const FutureHeader: React.FC<{ setCurrentlyHovered: (id: string) => void; future: Future; }> = ({ isLibrary, toggled, displayText, setCurrentlyHovered, future }) => { - if (isLibrary) { - return ( - -
    - {displayText} - - ); - } - return ( {isLibrary ?
    : } From 02d4b6f06106fd19aed3631de21e89289436a7f7 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 15 Dec 2024 04:18:27 -0500 Subject: [PATCH 1288/1302] add comment regarding testing for module id --- packages/core/src/internal/batcher.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/internal/batcher.ts b/packages/core/src/internal/batcher.ts index ef5264ae72..26bb2348da 100644 --- a/packages/core/src/internal/batcher.ts +++ b/packages/core/src/internal/batcher.ts @@ -131,6 +131,7 @@ export class Batcher { const dependencies = batchState.adjacencyList.getDependenciesFor(futureId); return [...dependencies].every((depId) => { + // We distinguish between module and future ids here, as the future's always have `#` and the modules don't. if (/#/.test(depId)) { return batchState.visitState[depId] === VisitStatus.VISITED; } From a1e6fab879586dfc8cce0a2f304e1f9123931d2c Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 11 Dec 2024 06:52:26 -0500 Subject: [PATCH 1289/1302] handle errors when verifying external artifacts --- packages/core/src/types/verify.ts | 3 +- packages/core/src/verify.ts | 33 +- .../artifacts/LockModule#Basic.json | 35 + .../artifacts/LockModule#Basic2.json | 35 + .../artifacts/LockModule#Lock.dbg.json | 4 + .../artifacts/LockModule#Lock.json | 74 + .../647c95b5130e7afe0806dc404d889d09.json | 5180 +++++++++++++++++ .../deployed_addresses.json | 5 + .../verify/external-artifacts/journal.jsonl | 13 + packages/core/test/verify.ts | 55 +- packages/hardhat-plugin/src/index.ts | 8 + 11 files changed, 5436 insertions(+), 9 deletions(-) create mode 100644 packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json create mode 100644 packages/core/test/mocks/verify/external-artifacts/journal.jsonl diff --git a/packages/core/src/types/verify.ts b/packages/core/src/types/verify.ts index 49b4f6447f..c3d1caa51b 100644 --- a/packages/core/src/types/verify.ts +++ b/packages/core/src/types/verify.ts @@ -41,7 +41,8 @@ export interface VerifyInfo { /** * The result of requesting the verification info for a deployment. * It returns the chainConfig followed by an array of VerifyInfo objects, one for each contract to be verified. + * Alternatively, it returns null and the contract name if the contract used external artifacts that could not be resolved for verification. * * @beta */ -export type VerifyResult = [ChainConfig, VerifyInfo]; +export type VerifyResult = [ChainConfig, VerifyInfo] | [null, name: string]; diff --git a/packages/core/src/verify.ts b/packages/core/src/verify.ts index c6793d9be5..aaa1db5d92 100644 --- a/packages/core/src/verify.ts +++ b/packages/core/src/verify.ts @@ -20,6 +20,7 @@ import { Artifact, BuildInfo, CompilerInput } from "./types/artifact"; import { ChainConfig, SourceToLibraryToAddress, + VerifyInfo, VerifyResult, } from "./types/verify"; @@ -66,6 +67,11 @@ export async function* getVerificationInformation( includeUnrelatedContracts ); + if (typeof verifyInfo === "string") { + yield [null, verifyInfo]; + continue; + } + const verifyResult: VerifyResult = [chainConfig, verifyInfo]; yield verifyResult; @@ -126,11 +132,28 @@ async function convertExStateToVerifyInfo( exState: DeploymentExecutionState, deploymentLoader: FileDeploymentLoader, includeUnrelatedContracts: boolean = false -) { - const [buildInfo, artifact] = await Promise.all([ - deploymentLoader.readBuildInfo(exState.artifactId), - deploymentLoader.loadArtifact(exState.artifactId), - ]); +): Promise { + let result: [BuildInfo, Artifact]; + + try { + result = await Promise.all([ + deploymentLoader.readBuildInfo(exState.artifactId), + deploymentLoader.loadArtifact(exState.artifactId), + ]); + } catch (e) { + assertIgnitionInvariant( + e instanceof Error && "code" in e && e.code === "ENOENT", + `Unexpected error loading build info or artifact for deployment execution state ${ + exState.id + }: ${e as any}` + ); + + // if the artifact cannot be found, we cannot verify the contract + // we return the contract name so the recipient can know which contract could not be verified + return exState.artifactId; + } + + const [buildInfo, artifact] = result; const { contractName, constructorArgs, libraries } = exState; diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json new file mode 100644 index 0000000000..e7e8a72dab --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Basic", + "sourceName": "contracts/Basic.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json new file mode 100644 index 0000000000..e7e8a72dab --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Basic", + "sourceName": "contracts/Basic.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json new file mode 100644 index 0000000000..09d8c22f30 --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/647c95b5130e7afe0806dc404d889d09.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json new file mode 100644 index 0000000000..81cc1e2c3b --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json @@ -0,0 +1,74 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Lock", + "sourceName": "contracts/Lock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json new file mode 100644 index 0000000000..7a19774201 --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json @@ -0,0 +1,5180 @@ +{ + "id": "647c95b5130e7afe0806dc404d889d09", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/Basic.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ncontract Basic {\n function add(uint a, uint b) public pure returns (uint) {\n return a + b;\n }\n}" + }, + "contracts/Lock.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract Lock {\n uint public unlockTime;\n address payable public owner;\n\n event Withdrawal(uint amount, uint when);\n\n constructor(uint _unlockTime) payable {\n require(\n block.timestamp < _unlockTime,\n \"Unlock time should be in the future\"\n );\n\n unlockTime = _unlockTime;\n owner = payable(msg.sender);\n }\n\n function withdraw() public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n require(block.timestamp >= unlockTime, \"You can't withdraw yet\");\n require(msg.sender == owner, \"You aren't the owner\");\n\n emit Withdrawal(address(this).balance, block.timestamp);\n\n owner.transfer(address(this).balance);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/Basic.sol": { + "ast": { + "absolutePath": "contracts/Basic.sol", + "exportedSymbols": { + "Basic": [ + 16 + ] + }, + "id": 17, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Basic", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 16, + "linearizedBaseContracts": [ + 16 + ], + "name": "Basic", + "nameLocation": "73:5:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 14, + "nodeType": "Block", + "src": "139:23:0", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "152:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 11, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "156:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "152:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9, + "id": 13, + "nodeType": "Return", + "src": "145:12:0" + } + ] + }, + "functionSelector": "771602f7", + "id": 15, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "add", + "nameLocation": "92:3:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "mutability": "mutable", + "name": "a", + "nameLocation": "101:1:0", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "96:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "96:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "mutability": "mutable", + "name": "b", + "nameLocation": "109:1:0", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "104:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "104:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "95:16:0" + }, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "133:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "133:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "132:6:0" + }, + "scope": 16, + "src": "83:79:0", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 17, + "src": "64:100:0", + "usedErrors": [] + } + ], + "src": "39:125:0" + }, + "id": 0 + }, + "contracts/Lock.sol": { + "ast": { + "absolutePath": "contracts/Lock.sol", + "exportedSymbols": { + "Lock": [ + 95 + ] + }, + "id": 96, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 18, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:1" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Lock", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 95, + "linearizedBaseContracts": [ + 95 + ], + "name": "Lock", + "nameLocation": "149:4:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "251c1aa3", + "id": 20, + "mutability": "mutable", + "name": "unlockTime", + "nameLocation": "170:10:1", + "nodeType": "VariableDeclaration", + "scope": 95, + "src": "158:22:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 19, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "158:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "8da5cb5b", + "id": 22, + "mutability": "mutable", + "name": "owner", + "nameLocation": "207:5:1", + "nodeType": "VariableDeclaration", + "scope": 95, + "src": "184:28:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + "typeName": { + "id": 21, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "184:15:1", + "stateMutability": "payable", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "bf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93", + "id": 28, + "name": "Withdrawal", + "nameLocation": "223:10:1", + "nodeType": "EventDefinition", + "parameters": { + "id": 27, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nameLocation": "239:6:1", + "nodeType": "VariableDeclaration", + "scope": 28, + "src": "234:11:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 23, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "234:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 26, + "indexed": false, + "mutability": "mutable", + "name": "when", + "nameLocation": "252:4:1", + "nodeType": "VariableDeclaration", + "scope": 28, + "src": "247:9:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 25, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "247:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "233:24:1" + }, + "src": "217:41:1" + }, + { + "body": { + "id": 53, + "nodeType": "Block", + "src": "300:170:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 34, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "321:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 35, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "327:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "321:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 36, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "339:11:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "321:29:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574757265", + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "358:37:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + }, + "value": "Unlock time should be in the future" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + } + ], + "id": 33, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "306:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 39, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "306:95:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 40, + "nodeType": "ExpressionStatement", + "src": "306:95:1" + }, + { + "expression": { + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 41, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 20, + "src": "408:10:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 42, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "421:11:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "408:24:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 44, + "nodeType": "ExpressionStatement", + "src": "408:24:1" + }, + { + "expression": { + "id": 51, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 45, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "438:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 48, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "454:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 49, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "458:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "454:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 47, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "446:8:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 46, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "446:8:1", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "446:19:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "438:27:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 52, + "nodeType": "ExpressionStatement", + "src": "438:27:1" + } + ] + }, + "id": 54, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 31, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 30, + "mutability": "mutable", + "name": "_unlockTime", + "nameLocation": "279:11:1", + "nodeType": "VariableDeclaration", + "scope": 54, + "src": "274:16:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 29, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "274:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "273:18:1" + }, + "returnParameters": { + "id": 32, + "nodeType": "ParameterList", + "parameters": [], + "src": "300:0:1" + }, + "scope": 95, + "src": "262:208:1", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 93, + "nodeType": "Block", + "src": "501:437:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 58, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "713:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 59, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "719:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "713:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 60, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 20, + "src": "732:10:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "713:29:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "744:24:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + }, + "value": "You can't withdraw yet" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + } + ], + "id": 57, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "705:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "705:64:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 64, + "nodeType": "ExpressionStatement", + "src": "705:64:1" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 69, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 66, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "783:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "787:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "783:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 68, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "797:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "783:19:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "id": 70, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "804:22:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + }, + "value": "You aren't the owner" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + } + ], + "id": 65, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "775:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 71, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "775:52:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 72, + "nodeType": "ExpressionStatement", + "src": "775:52:1" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 76, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "858:4:1", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + ], + "id": 75, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "850:7:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 74, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "850:7:1", + "typeDescriptions": {} + } + }, + "id": 77, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "850:13:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "864:7:1", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "850:21:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 79, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "873:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 80, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "879:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "873:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 73, + "name": "Withdrawal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 28, + "src": "839:10:1", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 81, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "839:50:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 82, + "nodeType": "EmitStatement", + "src": "834:55:1" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 88, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "919:4:1", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + ], + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "911:7:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 86, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "911:7:1", + "typeDescriptions": {} + } + }, + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "911:13:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "925:7:1", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "911:21:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 83, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "896:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 85, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "902:8:1", + "memberName": "transfer", + "nodeType": "MemberAccess", + "src": "896:14:1", + "typeDescriptions": { + "typeIdentifier": "t_function_transfer_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 91, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "896:37:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 92, + "nodeType": "ExpressionStatement", + "src": "896:37:1" + } + ] + }, + "functionSelector": "3ccfd60b", + "id": 94, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "483:8:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 55, + "nodeType": "ParameterList", + "parameters": [], + "src": "491:2:1" + }, + "returnParameters": { + "id": 56, + "nodeType": "ParameterList", + "parameters": [], + "src": "501:0:1" + }, + "scope": 95, + "src": "474:464:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 96, + "src": "140:800:1", + "usedErrors": [] + } + ], + "src": "39:902:1" + }, + "id": 1 + } + }, + "contracts": { + "contracts/Basic.sol": { + "Basic": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x771602F7 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0xB1 JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x100 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x14A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x8E DUP2 PUSH2 0x7B JUMP JUMPDEST DUP2 EQ PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xAB DUP2 PUSH2 0x85 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8 JUMPI PUSH2 0xC7 PUSH2 0x76 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xD6 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE7 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA DUP2 PUSH2 0x7B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x115 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155 DUP3 PUSH2 0x7B JUMP JUMPDEST SWAP2 POP PUSH2 0x160 DUP4 PUSH2 0x7B JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x178 JUMPI PUSH2 0x177 PUSH2 0x11B JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0x797C 0xF7 CALLER SWAP11 PUSH11 0x42CE6913940BCE208AAE17 CALLER 0xBA 0xE5 LOG1 DUP1 0xFC 0xB7 AND EQ EQ 0x2A 0xCD SWAP1 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:100:0:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@add_15": { + "entryPoint": 96, + "id": 15, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 156, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 177, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 241, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 256, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 330, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 123, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 283, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 118, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 133, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1902:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:2" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:2" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:2" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:2", + "type": "" + } + ], + "src": "545:139:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "773:391:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "819:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "821:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "821:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "821:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "794:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "803:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "790:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "790:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "815:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "786:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "786:32:2" + }, + "nodeType": "YulIf", + "src": "783:119:2" + }, + { + "nodeType": "YulBlock", + "src": "912:117:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "927:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "941:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "931:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "956:63:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "991:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1002:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "987:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "987:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1011:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "966:20:2" + }, + "nodeType": "YulFunctionCall", + "src": "966:53:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "956:6:2" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1039:118:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1054:16:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1068:2:2", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1058:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1084:63:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1119:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1130:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1115:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1115:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1139:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1094:20:2" + }, + "nodeType": "YulFunctionCall", + "src": "1094:53:2" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1084:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "735:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "746:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "758:6:2", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "766:6:2", + "type": "" + } + ], + "src": "690:474:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1235:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1252:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1275:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1257:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1257:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1245:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1245:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1245:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1223:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1230:3:2", + "type": "" + } + ], + "src": "1170:118:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1392:124:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1402:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1414:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1425:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1410:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1410:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1402:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1482:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1495:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1506:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1491:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1491:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "1438:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "1438:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1438:71:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1364:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1376:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1387:4:2", + "type": "" + } + ], + "src": "1294:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1550:152:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1567:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1570:77:2", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1560:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1560:88:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1560:88:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1664:1:2", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1667:4:2", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1657:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1657:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1657:15:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1688:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1691:4:2", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1681:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1681:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1681:15:2" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "1522:180:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1752:147:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1762:25:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1785:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1767:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1767:20:2" + }, + "variableNames": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1762:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1796:25:2", + "value": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1819:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1801:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1801:20:2" + }, + "variableNames": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1796:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1830:16:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1841:1:2" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1844:1:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1837:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1837:9:2" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1830:3:2" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1870:22:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "1872:16:2" + }, + "nodeType": "YulFunctionCall", + "src": "1872:18:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1872:18:2" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1862:1:2" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1865:3:2" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1859:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "1859:10:2" + }, + "nodeType": "YulIf", + "src": "1856:36:2" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "1739:1:2", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "1742:1:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "1748:3:2", + "type": "" + } + ], + "src": "1708:191:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n function checked_add_t_uint256(x, y) -> sum {\n x := cleanup_t_uint256(x)\n y := cleanup_t_uint256(y)\n sum := add(x, y)\n\n if gt(x, sum) { panic_error_0x11() }\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x771602F7 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0xB1 JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x100 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x14A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x8E DUP2 PUSH2 0x7B JUMP JUMPDEST DUP2 EQ PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xAB DUP2 PUSH2 0x85 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8 JUMPI PUSH2 0xC7 PUSH2 0x76 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xD6 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE7 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA DUP2 PUSH2 0x7B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x115 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155 DUP3 PUSH2 0x7B JUMP JUMPDEST SWAP2 POP PUSH2 0x160 DUP4 PUSH2 0x7B JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x178 JUMPI PUSH2 0x177 PUSH2 0x11B JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0x797C 0xF7 CALLER SWAP11 PUSH11 0x42CE6913940BCE208AAE17 CALLER 0xBA 0xE5 LOG1 DUP1 0xFC 0xB7 AND EQ EQ 0x2A 0xCD SWAP1 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:100:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;133:4;156:1;152;:5;;;;:::i;:::-;145:12;;83:79;;;;:::o;88:117:2:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:118::-;1257:24;1275:5;1257:24;:::i;:::-;1252:3;1245:37;1170:118;;:::o;1294:222::-;1387:4;1425:2;1414:9;1410:18;1402:26;;1438:71;1506:1;1495:9;1491:17;1482:6;1438:71;:::i;:::-;1294:222;;;;:::o;1522:180::-;1570:77;1567:1;1560:88;1667:4;1664:1;1657:15;1691:4;1688:1;1681:15;1708:191;1748:3;1767:20;1785:1;1767:20;:::i;:::-;1762:25;;1801:20;1819:1;1801:20;:::i;:::-;1796:25;;1844:1;1841;1837:9;1830:16;;1865:3;1862:1;1859:10;1856:36;;;1872:18;;:::i;:::-;1856:36;1708:191;;;;:::o" + }, + "methodIdentifiers": { + "add(uint256,uint256)": "771602f7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Basic.sol\":\"Basic\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Basic.sol\":{\"keccak256\":\"0x8566787d8567b5b7d85a887905bf5d0c5104be4f83488ba9e7e1e5b10e9af8cf\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://46cb6c6cebfef5738350ad9cfc0c3b1c9407f4e9b58a8219c36fb5c17c41ce1a\",\"dweb:/ipfs/Qmf5tnzv7HDJtPeaRsBWh3AYRH12Ezrn7C6UVScevo36Ht\"]}},\"version\":1}" + } + }, + "contracts/Lock.sol": { + "Lock": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_54": { + "entryPoint": null, + "id": 54, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 240, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack": { + "entryPoint": 381, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 416, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 285, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 186, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 181, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413": { + "entryPoint": 302, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 196, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2248:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:2" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:2" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:2", + "type": "" + } + ], + "src": "545:143:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:274:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "817:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "819:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "819:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "819:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "792:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "801:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "788:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "788:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "813:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "784:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "784:32:2" + }, + "nodeType": "YulIf", + "src": "781:119:2" + }, + { + "nodeType": "YulBlock", + "src": "910:128:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "925:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "939:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "929:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "954:74:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1000:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1011:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "996:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "996:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1020:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "964:31:2" + }, + "nodeType": "YulFunctionCall", + "src": "964:64:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "954:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "741:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "752:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "764:6:2", + "type": "" + } + ], + "src": "694:351:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1147:73:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1164:3:2" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1169:6:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1157:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1157:19:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1157:19:2" + }, + { + "nodeType": "YulAssignment", + "src": "1185:29:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1204:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1209:4:2", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1200:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1200:14:2" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1185:11:2" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1119:3:2", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1124:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1135:11:2", + "type": "" + } + ], + "src": "1051:169:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1332:116:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1354:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1362:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1350:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1350:14:2" + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1366:34:2", + "type": "", + "value": "Unlock time should be in the fut" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1343:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1343:58:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1343:58:2" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1422:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1430:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1418:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1418:15:2" + }, + { + "hexValue": "757265", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1435:5:2", + "type": "", + "value": "ure" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1411:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1411:30:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1411:30:2" + } + ] + }, + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1324:6:2", + "type": "" + } + ], + "src": "1226:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1600:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1610:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1676:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1681:2:2", + "type": "", + "value": "35" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1617:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "1617:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1610:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1782:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulIdentifier", + "src": "1693:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "1693:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1693:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "1795:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1806:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1811:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1802:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1802:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1795:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1588:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1596:3:2", + "type": "" + } + ], + "src": "1454:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1997:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2007:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2019:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2030:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2015:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2015:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2007:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2054:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2065:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2050:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2050:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2073:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2079:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2069:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2069:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2043:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2043:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2043:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "2099:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2233:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2107:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "2107:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2099:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1977:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1992:4:2", + "type": "" + } + ], + "src": "1826:419:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(memPtr) {\n\n mstore(add(memPtr, 0), \"Unlock time should be in the fut\")\n\n mstore(add(memPtr, 32), \"ure\")\n\n }\n\n function abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 35)\n store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(pos)\n end := add(pos, 64)\n }\n\n function abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x5D8 CODESIZE SUB DUP1 PUSH2 0x5D8 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x25 SWAP2 SWAP1 PUSH2 0xF0 JUMP JUMPDEST DUP1 TIMESTAMP LT PUSH2 0x67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5E SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP CALLER PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP PUSH2 0x1C0 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xCD DUP2 PUSH2 0xBA JUMP JUMPDEST DUP2 EQ PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xEA DUP2 PUSH2 0xC4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106 JUMPI PUSH2 0x105 PUSH2 0xB5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x114 DUP5 DUP3 DUP6 ADD PUSH2 0xDB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x556E6C6F636B2074696D652073686F756C6420626520696E2074686520667574 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7572650000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18A PUSH1 0x23 DUP4 PUSH2 0x11D JUMP JUMPDEST SWAP2 POP PUSH2 0x195 DUP3 PUSH2 0x12E JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1B9 DUP2 PUSH2 0x17D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x409 DUP1 PUSH2 0x1CF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:1:-:0;;;262:208;;;;;;;;;;;;;;;;;;;;;:::i;:::-;339:11;321:15;:29;306:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;421:11;408:10;:24;;;;454:10;438:5;;:27;;;;;;;;;;;;;;;;;;262:208;140:800;;88:117:2;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:351::-;764:6;813:2;801:9;792:7;788:23;784:32;781:119;;;819:79;;:::i;:::-;781:119;939:1;964:64;1020:7;1011:6;1000:9;996:22;964:64;:::i;:::-;954:74;;910:128;694:351;;;;:::o;1051:169::-;1135:11;1169:6;1164:3;1157:19;1209:4;1204:3;1200:14;1185:29;;1051:169;;;;:::o;1226:222::-;1366:34;1362:1;1354:6;1350:14;1343:58;1435:5;1430:2;1422:6;1418:15;1411:30;1226:222;:::o;1454:366::-;1596:3;1617:67;1681:2;1676:3;1617:67;:::i;:::-;1610:74;;1693:93;1782:3;1693:93;:::i;:::-;1811:2;1806:3;1802:12;1795:19;;1454:366;;;:::o;1826:419::-;1992:4;2030:2;2019:9;2015:18;2007:26;;2079:9;2073:4;2069:20;2065:1;2054:9;2050:17;2043:47;2107:131;2233:4;2107:131;:::i;:::-;2099:139;;1826:419;;;:::o;140:800:1:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@owner_22": { + "entryPoint": 523, + "id": 22, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@unlockTime_20": { + "entryPoint": 140, + "id": 20, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@withdraw_94": { + "entryPoint": 146, + "id": 94, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_encode_t_address_payable_to_t_address_payable_fromStack": { + "entryPoint": 663, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack": { + "entryPoint": 763, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack": { + "entryPoint": 871, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 571, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed": { + "entryPoint": 678, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 798, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 906, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 938, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 705, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_address_payable": { + "entryPoint": 645, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 613, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 561, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8": { + "entryPoint": 722, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a": { + "entryPoint": 830, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:3550:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:2", + "type": "" + } + ], + "src": "7:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:2", + "type": "" + } + ], + "src": "90:118:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:2", + "type": "" + } + ], + "src": "214:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "487:81:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "497:65:2", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "512:5:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "519:42:2", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "508:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "508:54:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "497:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "469:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "479:7:2", + "type": "" + } + ], + "src": "442:126:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "627:51:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "637:35:2", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "666:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "648:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "648:24:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "637:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_address_payable", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "609:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "619:7:2", + "type": "" + } + ], + "src": "574:104:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "765:61:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "782:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "813:5:2" + } + ], + "functionName": { + "name": "cleanup_t_address_payable", + "nodeType": "YulIdentifier", + "src": "787:25:2" + }, + "nodeType": "YulFunctionCall", + "src": "787:32:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "775:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "775:45:2" + }, + "nodeType": "YulExpressionStatement", + "src": "775:45:2" + } + ] + }, + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "753:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "760:3:2", + "type": "" + } + ], + "src": "684:142:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "946:140:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "956:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "968:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "979:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "964:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "964:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "956:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1052:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1065:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1076:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1061:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1061:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulIdentifier", + "src": "992:59:2" + }, + "nodeType": "YulFunctionCall", + "src": "992:87:2" + }, + "nodeType": "YulExpressionStatement", + "src": "992:87:2" + } + ] + }, + "name": "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "918:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "930:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "941:4:2", + "type": "" + } + ], + "src": "832:254:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1188:73:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1205:3:2" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1210:6:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1198:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1198:19:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1198:19:2" + }, + { + "nodeType": "YulAssignment", + "src": "1226:29:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1245:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1250:4:2", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1241:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1241:14:2" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1226:11:2" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1160:3:2", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1165:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1176:11:2", + "type": "" + } + ], + "src": "1092:169:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1373:66:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1395:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1403:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1391:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1391:14:2" + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1407:24:2", + "type": "", + "value": "You can't withdraw yet" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1384:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1384:48:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1384:48:2" + } + ] + }, + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1365:6:2", + "type": "" + } + ], + "src": "1267:172:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1591:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1601:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1667:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1672:2:2", + "type": "", + "value": "22" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1608:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "1608:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1601:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1773:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulIdentifier", + "src": "1684:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "1684:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1684:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "1786:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1797:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1793:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1793:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1786:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1579:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1587:3:2", + "type": "" + } + ], + "src": "1445:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1988:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1998:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2010:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2021:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2006:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2006:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1998:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2045:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2056:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2041:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2041:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2064:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2070:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2060:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2060:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2034:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2034:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2034:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "2090:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2224:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2098:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "2098:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2090:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1968:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1983:4:2", + "type": "" + } + ], + "src": "1817:419:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2348:64:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2370:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2378:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2366:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2366:14:2" + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "kind": "string", + "nodeType": "YulLiteral", + "src": "2382:22:2", + "type": "", + "value": "You aren't the owner" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2359:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2359:46:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2359:46:2" + } + ] + }, + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "2340:6:2", + "type": "" + } + ], + "src": "2242:170:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2564:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2574:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2640:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2645:2:2", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2581:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "2581:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2574:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2746:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulIdentifier", + "src": "2657:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "2657:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2657:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "2759:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2770:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2775:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2766:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2766:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2759:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "2552:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2560:3:2", + "type": "" + } + ], + "src": "2418:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2961:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2971:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2983:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2994:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2979:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2979:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2971:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3018:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3029:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3014:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3014:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3037:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3043:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3033:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3033:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3007:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "3007:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3007:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "3063:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3197:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "3071:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "3071:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3063:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2941:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2956:4:2", + "type": "" + } + ], + "src": "2790:419:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3341:206:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3351:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3363:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3374:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3359:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3359:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3351:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3431:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3444:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3455:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3440:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3440:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3387:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "3387:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3387:71:2" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3512:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3525:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3536:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3521:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3521:18:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3468:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "3468:72:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3468:72:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3305:9:2", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3317:6:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3325:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3336:4:2", + "type": "" + } + ], + "src": "3215:332:2" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address_payable(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function abi_encode_t_address_payable_to_t_address_payable_fromStack(value, pos) {\n mstore(pos, cleanup_t_address_payable(value))\n }\n\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_payable_to_t_address_payable_fromStack(value0, add(headStart, 0))\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(memPtr) {\n\n mstore(add(memPtr, 0), \"You can't withdraw yet\")\n\n }\n\n function abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 22)\n store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(memPtr) {\n\n mstore(add(memPtr, 0), \"You aren't the owner\")\n\n }\n\n function abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 20)\n store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value1, add(headStart, 32))\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;474:464;;;:::i;:::-;;184:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158:22;;;;:::o;474:464::-;732:10;;713:15;:29;;705:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;797:5;;;;;;;;;;;783:19;;:10;:19;;;775:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;839:50;850:21;873:15;839:50;;;;;;;:::i;:::-;;;;;;;;896:5;;;;;;;;;;;:14;;:37;911:21;896:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;474:464::o;184:28::-;;;;;;;;;;;;;:::o;7:77:2:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:126::-;479:7;519:42;512:5;508:54;497:65;;442:126;;;:::o;574:104::-;619:7;648:24;666:5;648:24;:::i;:::-;637:35;;574:104;;;:::o;684:142::-;787:32;813:5;787:32;:::i;:::-;782:3;775:45;684:142;;:::o;832:254::-;941:4;979:2;968:9;964:18;956:26;;992:87;1076:1;1065:9;1061:17;1052:6;992:87;:::i;:::-;832:254;;;;:::o;1092:169::-;1176:11;1210:6;1205:3;1198:19;1250:4;1245:3;1241:14;1226:29;;1092:169;;;;:::o;1267:172::-;1407:24;1403:1;1395:6;1391:14;1384:48;1267:172;:::o;1445:366::-;1587:3;1608:67;1672:2;1667:3;1608:67;:::i;:::-;1601:74;;1684:93;1773:3;1684:93;:::i;:::-;1802:2;1797:3;1793:12;1786:19;;1445:366;;;:::o;1817:419::-;1983:4;2021:2;2010:9;2006:18;1998:26;;2070:9;2064:4;2060:20;2056:1;2045:9;2041:17;2034:47;2098:131;2224:4;2098:131;:::i;:::-;2090:139;;1817:419;;;:::o;2242:170::-;2382:22;2378:1;2370:6;2366:14;2359:46;2242:170;:::o;2418:366::-;2560:3;2581:67;2645:2;2640:3;2581:67;:::i;:::-;2574:74;;2657:93;2746:3;2657:93;:::i;:::-;2775:2;2770:3;2766:12;2759:19;;2418:366;;;:::o;2790:419::-;2956:4;2994:2;2983:9;2979:18;2971:26;;3043:9;3037:4;3033:20;3029:1;3018:9;3014:17;3007:47;3071:131;3197:4;3071:131;:::i;:::-;3063:139;;2790:419;;;:::o;3215:332::-;3336:4;3374:2;3363:9;3359:18;3351:26;;3387:71;3455:1;3444:9;3440:17;3431:6;3387:71;:::i;:::-;3468:72;3536:2;3525:9;3521:18;3512:6;3468:72;:::i;:::-;3215:332;;;;;:::o" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "unlockTime()": "251c1aa3", + "withdraw()": "3ccfd60b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"when\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lock.sol\":\"Lock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lock.sol\":{\"keccak256\":\"0x290d672235b22ec4740c076ad0108b37f5d3073810f5c7d502d90c72591ee9dc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3d74a8be6305243875a1e4bb2c8fcbd29672aa20a3781595cfbee6b743358b6b\",\"dweb:/ipfs/QmVWAacJB7wL7fBhAyvyqJLWDCEL9vMfwEeR3ydxtsprLf\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json b/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json new file mode 100644 index 0000000000..cf3df4fbf2 --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json @@ -0,0 +1,5 @@ +{ + "LockModule#Basic2": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "LockModule#Basic": "0x2B6cBd0e0a2AE9Ed5e084B4366E4f4b59E464094", + "LockModule#Lock": "0x8f19334E79b16112E2D74E9Bc2246cB3cbA3cfaa" +} diff --git a/packages/core/test/mocks/verify/external-artifacts/journal.jsonl b/packages/core/test/mocks/verify/external-artifacts/journal.jsonl new file mode 100644 index 0000000000..a0b0a6acbb --- /dev/null +++ b/packages/core/test/mocks/verify/external-artifacts/journal.jsonl @@ -0,0 +1,13 @@ + +{"chainId":11155111,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#Basic","constructorArgs":[],"contractName":"Basic","dependencies":[],"from":"0xff9cc424f113627738390361033d139271006619","futureId":"LockModule#Basic","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#Basic","networkInteraction":{"data":"0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Basic","networkInteractionId":1,"nonce":2,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2073789887"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1638611"}},"hash":"0x682b2bfda8e76c7695491d5378edfd7aeba6be24c49a4f9096daaa3f4e9998f2"},"type":"TRANSACTION_SEND"} +{"artifactId":"LockModule#Basic2","contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","contractName":"Basic2","dependencies":[],"futureId":"LockModule#Basic2","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xff9cc424f113627738390361033d139271006619","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":3,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2073789887"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1638611"}},"hash":"0x3e7e2d599c58beb63d59e67288b4a9d3d5233cd71b42eea0c9ec6fc92021b3fd"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Basic","hash":"0x682b2bfda8e76c7695491d5378edfd7aeba6be24c49a4f9096daaa3f4e9998f2","networkInteractionId":1,"receipt":{"blockHash":"0x5c7af0b416f0d7592aec53c91d6f08320fe873b2fb76ad236c06f51eb9fd93d5","blockNumber":7256389,"contractAddress":"0x2B6cBd0e0a2AE9Ed5e084B4366E4f4b59E464094","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Basic","result":{"address":"0x2B6cBd0e0a2AE9Ed5e084B4366E4f4b59E464094","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"futureId":"LockModule#Lock","hash":"0x3e7e2d599c58beb63d59e67288b4a9d3d5233cd71b42eea0c9ec6fc92021b3fd","networkInteractionId":1,"receipt":{"blockHash":"0x5c7af0b416f0d7592aec53c91d6f08320fe873b2fb76ad236c06f51eb9fd93d5","blockNumber":7256389,"contractAddress":"0x8f19334E79b16112E2D74E9Bc2246cB3cbA3cfaa","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0x8f19334E79b16112E2D74E9Bc2246cB3cbA3cfaa","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/verify.ts b/packages/core/test/verify.ts index a756b8a461..1fa0767b67 100644 --- a/packages/core/test/verify.ts +++ b/packages/core/test/verify.ts @@ -67,6 +67,45 @@ describe("verify", () => { assert.deepEqual(result, expectedResult); }); + it("should yield a null verify result for a contract with external artifacts", async () => { + const expectedResult1: VerifyResult = [null, "LockModule#Basic"]; + + const expectedResult2: VerifyResult = [ + { + network: "sepolia", + chainId: 11155111, + urls: { + apiURL: "https://api-sepolia.etherscan.io/api", + browserURL: "https://sepolia.etherscan.io", + }, + }, + { + address: "0x8f19334E79b16112E2D74E9Bc2246cB3cbA3cfaa", + compilerVersion: "v0.8.19+commit.7dd6d404", + sourceCode: `{"language":"Solidity","sources":{"contracts/Lock.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.9;\\n\\n// Uncomment this line to use console.log\\n// import \\"hardhat/console.sol\\";\\n\\ncontract Lock {\\n uint public unlockTime;\\n address payable public owner;\\n\\n event Withdrawal(uint amount, uint when);\\n\\n constructor(uint _unlockTime) payable {\\n require(\\n block.timestamp < _unlockTime,\\n \\"Unlock time should be in the future\\"\\n );\\n\\n unlockTime = _unlockTime;\\n owner = payable(msg.sender);\\n }\\n\\n function withdraw() public {\\n // Uncomment this line, and the import of \\"hardhat/console.sol\\", to print a log in your terminal\\n // console.log(\\"Unlock time is %o and block timestamp is %o\\", unlockTime, block.timestamp);\\n\\n require(block.timestamp >= unlockTime, \\"You can't withdraw yet\\");\\n require(msg.sender == owner, \\"You aren't the owner\\");\\n\\n emit Withdrawal(address(this).balance, block.timestamp);\\n\\n owner.transfer(address(this).balance);\\n }\\n}\\n"}},"settings":{"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}}}}`, + name: "contracts/Lock.sol:Lock", + args: "00000000000000000000000000000000000000000000000000000000767d1650", + }, + ]; + + const deploymentDir = path.join( + __dirname, + "mocks", + "verify", + "external-artifacts" + ); + + const generator = getVerificationInformation(deploymentDir); + + const result1 = (await generator.next()).value; + + assert.deepEqual(result1, expectedResult1); + + const result2: VerifyResult = await (await generator.next()).value; + + assert.deepEqual(result2, expectedResult2); + }); + it("should yield a verify result with a custom chain", async () => { const expectedResult: VerifyResult = [ { @@ -114,7 +153,11 @@ describe("verify", () => { const deploymentDir = path.join(__dirname, "mocks", "verify", "libraries"); let success: boolean = false; - for await (const [, info] of getVerificationInformation(deploymentDir)) { + for await (const [chainInfo, info] of getVerificationInformation( + deploymentDir + )) { + assert(chainInfo !== null); + if (info.name === "contracts/Lock.sol:WAAIT") { const librariesOutput = JSON.parse(info.sourceCode).settings.libraries; @@ -153,7 +196,11 @@ describe("verify", () => { const deploymentDir = path.join(__dirname, "mocks", "verify", "min-input"); - for await (const [, info] of getVerificationInformation(deploymentDir)) { + for await (const [contractInfo, info] of getVerificationInformation( + deploymentDir + )) { + assert(contractInfo !== null); + const expectedSources = expectedResultMap[info.name]; const actualSources = Object.keys(JSON.parse(info.sourceCode).sources); @@ -191,11 +238,13 @@ describe("verify", () => { const deploymentDir = path.join(__dirname, "mocks", "verify", "min-input"); - for await (const [, info] of getVerificationInformation( + for await (const [contractInfo, info] of getVerificationInformation( deploymentDir, undefined, true )) { + assert(contractInfo !== null); + const expectedSources = expectedResultMap[info.name]; const actualSources = Object.keys(JSON.parse(info.sourceCode).sources); diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 478e3e235e..133df4e0ea 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -614,6 +614,14 @@ ignitionScope hre.config.etherscan.customChains, includeUnrelatedContracts )) { + if (chainConfig === null) { + console.log( + `Could not resolve contract artifacts for contract "${contractInfo}". Skipping verification.` + ); + console.log(""); + continue; + } + const apiKeyAndUrls = getApiKeyAndUrls( hre.config.etherscan.apiKey, chainConfig From 5a28517d22b5427115f96558206a67a26790ea6b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 4 Dec 2024 04:37:40 -0500 Subject: [PATCH 1290/1302] fallback artifact resolver for external artifacts --- packages/core/src/status.ts | 18 +- .../artifacts/LockModule#Basic.json | 35 + .../artifacts/LockModule#Basic2.json | 35 + .../artifacts/LockModule#Lock.dbg.json | 4 + .../artifacts/LockModule#Lock.json | 74 + .../647c95b5130e7afe0806dc404d889d09.json | 5180 +++++++++++++++++ .../external-artifact/deployed_addresses.json | 5 + .../status/external-artifact/journal.jsonl | 13 + packages/core/test/status.ts | 55 + 9 files changed, 5415 insertions(+), 4 deletions(-) create mode 100644 packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json create mode 100644 packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json create mode 100644 packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json create mode 100644 packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json create mode 100644 packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json create mode 100644 packages/core/test/mocks/status/external-artifact/deployed_addresses.json create mode 100644 packages/core/test/mocks/status/external-artifact/journal.jsonl diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index be3a6f9d05..a4c18b0cd4 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -4,7 +4,7 @@ import { ERRORS } from "./internal/errors-list"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; import { findStatus } from "./internal/views/find-status"; -import { ArtifactResolver } from "./types/artifact"; +import { Abi, Artifact, ArtifactResolver } from "./types/artifact"; import { StatusResult } from "./types/status"; /** @@ -38,9 +38,19 @@ export async function status( for (const [futureId, deployedContract] of Object.entries( deployedContracts )) { - const artifact = await artifactResolver.loadArtifact( - deployedContract.contractName - ); + let artifact: Artifact; + + try { + artifact = await artifactResolver.loadArtifact( + deployedContract.contractName + ); + } catch (e) { + if (e instanceof Error && /HH700/g.test(e.message)) { + artifact = await deploymentLoader.loadArtifact(deployedContract.id); + } else { + throw e; + } + } contracts[futureId] = { ...deployedContract, diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json new file mode 100644 index 0000000000..e7e8a72dab --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Basic", + "sourceName": "contracts/Basic.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json new file mode 100644 index 0000000000..e7e8a72dab --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json @@ -0,0 +1,35 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Basic", + "sourceName": "contracts/Basic.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "bytecode": "0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json new file mode 100644 index 0000000000..09d8c22f30 --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../build-info/647c95b5130e7afe0806dc404d889d09.json" +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json new file mode 100644 index 0000000000..81cc1e2c3b --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json @@ -0,0 +1,74 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Lock", + "sourceName": "contracts/Lock.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json new file mode 100644 index 0000000000..7a19774201 --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json @@ -0,0 +1,5180 @@ +{ + "id": "647c95b5130e7afe0806dc404d889d09", + "_format": "hh-sol-build-info-1", + "solcVersion": "0.8.19", + "solcLongVersion": "0.8.19+commit.7dd6d404", + "input": { + "language": "Solidity", + "sources": { + "contracts/Basic.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\ncontract Basic {\n function add(uint a, uint b) public pure returns (uint) {\n return a + b;\n }\n}" + }, + "contracts/Lock.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.9;\n\n// Uncomment this line to use console.log\n// import \"hardhat/console.sol\";\n\ncontract Lock {\n uint public unlockTime;\n address payable public owner;\n\n event Withdrawal(uint amount, uint when);\n\n constructor(uint _unlockTime) payable {\n require(\n block.timestamp < _unlockTime,\n \"Unlock time should be in the future\"\n );\n\n unlockTime = _unlockTime;\n owner = payable(msg.sender);\n }\n\n function withdraw() public {\n // Uncomment this line, and the import of \"hardhat/console.sol\", to print a log in your terminal\n // console.log(\"Unlock time is %o and block timestamp is %o\", unlockTime, block.timestamp);\n\n require(block.timestamp >= unlockTime, \"You can't withdraw yet\");\n require(msg.sender == owner, \"You aren't the owner\");\n\n emit Withdrawal(address(this).balance, block.timestamp);\n\n owner.transfer(address(this).balance);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": false, + "runs": 200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata" + ], + "": [ + "ast" + ] + } + } + } + }, + "output": { + "sources": { + "contracts/Basic.sol": { + "ast": { + "absolutePath": "contracts/Basic.sol", + "exportedSymbols": { + "Basic": [ + 16 + ] + }, + "id": 17, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 1, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:0" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Basic", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 16, + "linearizedBaseContracts": [ + 16 + ], + "name": "Basic", + "nameLocation": "73:5:0", + "nodeType": "ContractDefinition", + "nodes": [ + { + "body": { + "id": 14, + "nodeType": "Block", + "src": "139:23:0", + "statements": [ + { + "expression": { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 12, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "id": 10, + "name": "a", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 3, + "src": "152:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "+", + "rightExpression": { + "id": 11, + "name": "b", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 5, + "src": "156:1:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "152:5:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "functionReturnParameters": 9, + "id": 13, + "nodeType": "Return", + "src": "145:12:0" + } + ] + }, + "functionSelector": "771602f7", + "id": 15, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "add", + "nameLocation": "92:3:0", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 6, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 3, + "mutability": "mutable", + "name": "a", + "nameLocation": "101:1:0", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "96:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 2, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "96:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 5, + "mutability": "mutable", + "name": "b", + "nameLocation": "109:1:0", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "104:6:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 4, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "104:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "95:16:0" + }, + "returnParameters": { + "id": 9, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 8, + "mutability": "mutable", + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "VariableDeclaration", + "scope": 15, + "src": "133:4:0", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 7, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "133:4:0", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "132:6:0" + }, + "scope": 16, + "src": "83:79:0", + "stateMutability": "pure", + "virtual": false, + "visibility": "public" + } + ], + "scope": 17, + "src": "64:100:0", + "usedErrors": [] + } + ], + "src": "39:125:0" + }, + "id": 0 + }, + "contracts/Lock.sol": { + "ast": { + "absolutePath": "contracts/Lock.sol", + "exportedSymbols": { + "Lock": [ + 95 + ] + }, + "id": 96, + "license": "UNLICENSED", + "nodeType": "SourceUnit", + "nodes": [ + { + "id": 18, + "literals": [ + "solidity", + "^", + "0.8", + ".9" + ], + "nodeType": "PragmaDirective", + "src": "39:23:1" + }, + { + "abstract": false, + "baseContracts": [], + "canonicalName": "Lock", + "contractDependencies": [], + "contractKind": "contract", + "fullyImplemented": true, + "id": 95, + "linearizedBaseContracts": [ + 95 + ], + "name": "Lock", + "nameLocation": "149:4:1", + "nodeType": "ContractDefinition", + "nodes": [ + { + "constant": false, + "functionSelector": "251c1aa3", + "id": 20, + "mutability": "mutable", + "name": "unlockTime", + "nameLocation": "170:10:1", + "nodeType": "VariableDeclaration", + "scope": 95, + "src": "158:22:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 19, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "158:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "public" + }, + { + "constant": false, + "functionSelector": "8da5cb5b", + "id": 22, + "mutability": "mutable", + "name": "owner", + "nameLocation": "207:5:1", + "nodeType": "VariableDeclaration", + "scope": 95, + "src": "184:28:1", + "stateVariable": true, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + }, + "typeName": { + "id": 21, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "184:15:1", + "stateMutability": "payable", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "visibility": "public" + }, + { + "anonymous": false, + "eventSelector": "bf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b93", + "id": 28, + "name": "Withdrawal", + "nameLocation": "223:10:1", + "nodeType": "EventDefinition", + "parameters": { + "id": 27, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 24, + "indexed": false, + "mutability": "mutable", + "name": "amount", + "nameLocation": "239:6:1", + "nodeType": "VariableDeclaration", + "scope": 28, + "src": "234:11:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 23, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "234:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + }, + { + "constant": false, + "id": 26, + "indexed": false, + "mutability": "mutable", + "name": "when", + "nameLocation": "252:4:1", + "nodeType": "VariableDeclaration", + "scope": 28, + "src": "247:9:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 25, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "247:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "233:24:1" + }, + "src": "217:41:1" + }, + { + "body": { + "id": 53, + "nodeType": "Block", + "src": "300:170:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 37, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 34, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "321:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 35, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "327:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "321:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": "<", + "rightExpression": { + "id": 36, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "339:11:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "321:29:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574757265", + "id": 38, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "358:37:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + }, + "value": "Unlock time should be in the future" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "typeString": "literal_string \"Unlock time should be in the future\"" + } + ], + "id": 33, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "306:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 39, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "306:95:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 40, + "nodeType": "ExpressionStatement", + "src": "306:95:1" + }, + { + "expression": { + "id": 43, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 41, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 20, + "src": "408:10:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "id": 42, + "name": "_unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 30, + "src": "421:11:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "408:24:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "id": 44, + "nodeType": "ExpressionStatement", + "src": "408:24:1" + }, + { + "expression": { + "id": 51, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftHandSide": { + "id": 45, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "438:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "nodeType": "Assignment", + "operator": "=", + "rightHandSide": { + "arguments": [ + { + "expression": { + "id": 48, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "454:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 49, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "458:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "454:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_address", + "typeString": "address" + } + ], + "id": 47, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "446:8:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_payable_$", + "typeString": "type(address payable)" + }, + "typeName": { + "id": 46, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "446:8:1", + "stateMutability": "payable", + "typeDescriptions": {} + } + }, + "id": 50, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "446:19:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "438:27:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 52, + "nodeType": "ExpressionStatement", + "src": "438:27:1" + } + ] + }, + "id": 54, + "implemented": true, + "kind": "constructor", + "modifiers": [], + "name": "", + "nameLocation": "-1:-1:-1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 31, + "nodeType": "ParameterList", + "parameters": [ + { + "constant": false, + "id": 30, + "mutability": "mutable", + "name": "_unlockTime", + "nameLocation": "279:11:1", + "nodeType": "VariableDeclaration", + "scope": 54, + "src": "274:16:1", + "stateVariable": false, + "storageLocation": "default", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "typeName": { + "id": 29, + "name": "uint", + "nodeType": "ElementaryTypeName", + "src": "274:4:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "visibility": "internal" + } + ], + "src": "273:18:1" + }, + "returnParameters": { + "id": 32, + "nodeType": "ParameterList", + "parameters": [], + "src": "300:0:1" + }, + "scope": 95, + "src": "262:208:1", + "stateMutability": "payable", + "virtual": false, + "visibility": "public" + }, + { + "body": { + "id": 93, + "nodeType": "Block", + "src": "501:437:1", + "statements": [ + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + "id": 61, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 58, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "713:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 59, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "719:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "713:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "nodeType": "BinaryOperation", + "operator": ">=", + "rightExpression": { + "id": 60, + "name": "unlockTime", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 20, + "src": "732:10:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + "src": "713:29:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "id": 62, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "744:24:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + }, + "value": "You can't withdraw yet" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "typeString": "literal_string \"You can't withdraw yet\"" + } + ], + "id": 57, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "705:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 63, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "705:64:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 64, + "nodeType": "ExpressionStatement", + "src": "705:64:1" + }, + { + "expression": { + "arguments": [ + { + "commonType": { + "typeIdentifier": "t_address", + "typeString": "address" + }, + "id": 69, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "leftExpression": { + "expression": { + "id": 66, + "name": "msg", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -15, + "src": "783:3:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_message", + "typeString": "msg" + } + }, + "id": 67, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "787:6:1", + "memberName": "sender", + "nodeType": "MemberAccess", + "src": "783:10:1", + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "nodeType": "BinaryOperation", + "operator": "==", + "rightExpression": { + "id": 68, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "797:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "src": "783:19:1", + "typeDescriptions": { + "typeIdentifier": "t_bool", + "typeString": "bool" + } + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "id": 70, + "isConstant": false, + "isLValue": false, + "isPure": true, + "kind": "string", + "lValueRequested": false, + "nodeType": "Literal", + "src": "804:22:1", + "typeDescriptions": { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + }, + "value": "You aren't the owner" + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_bool", + "typeString": "bool" + }, + { + "typeIdentifier": "t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "typeString": "literal_string \"You aren't the owner\"" + } + ], + "id": 65, + "name": "require", + "nodeType": "Identifier", + "overloadedDeclarations": [ + -18, + -18 + ], + "referencedDeclaration": -18, + "src": "775:7:1", + "typeDescriptions": { + "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$", + "typeString": "function (bool,string memory) pure" + } + }, + "id": 71, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "775:52:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 72, + "nodeType": "ExpressionStatement", + "src": "775:52:1" + }, + { + "eventCall": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 76, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "858:4:1", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + ], + "id": 75, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "850:7:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 74, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "850:7:1", + "typeDescriptions": {} + } + }, + "id": 77, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "850:13:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 78, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "864:7:1", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "850:21:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + }, + { + "expression": { + "id": 79, + "name": "block", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -4, + "src": "873:5:1", + "typeDescriptions": { + "typeIdentifier": "t_magic_block", + "typeString": "block" + } + }, + "id": 80, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "879:9:1", + "memberName": "timestamp", + "nodeType": "MemberAccess", + "src": "873:15:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + }, + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "id": 73, + "name": "Withdrawal", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 28, + "src": "839:10:1", + "typeDescriptions": { + "typeIdentifier": "t_function_event_nonpayable$_t_uint256_$_t_uint256_$returns$__$", + "typeString": "function (uint256,uint256)" + } + }, + "id": 81, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "839:50:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 82, + "nodeType": "EmitStatement", + "src": "834:55:1" + }, + { + "expression": { + "arguments": [ + { + "expression": { + "arguments": [ + { + "id": 88, + "name": "this", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": -28, + "src": "919:4:1", + "typeDescriptions": { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_contract$_Lock_$95", + "typeString": "contract Lock" + } + ], + "id": 87, + "isConstant": false, + "isLValue": false, + "isPure": true, + "lValueRequested": false, + "nodeType": "ElementaryTypeNameExpression", + "src": "911:7:1", + "typeDescriptions": { + "typeIdentifier": "t_type$_t_address_$", + "typeString": "type(address)" + }, + "typeName": { + "id": 86, + "name": "address", + "nodeType": "ElementaryTypeName", + "src": "911:7:1", + "typeDescriptions": {} + } + }, + "id": 89, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "typeConversion", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "911:13:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_address", + "typeString": "address" + } + }, + "id": 90, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "925:7:1", + "memberName": "balance", + "nodeType": "MemberAccess", + "src": "911:21:1", + "typeDescriptions": { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + } + ], + "expression": { + "argumentTypes": [ + { + "typeIdentifier": "t_uint256", + "typeString": "uint256" + } + ], + "expression": { + "id": 83, + "name": "owner", + "nodeType": "Identifier", + "overloadedDeclarations": [], + "referencedDeclaration": 22, + "src": "896:5:1", + "typeDescriptions": { + "typeIdentifier": "t_address_payable", + "typeString": "address payable" + } + }, + "id": 85, + "isConstant": false, + "isLValue": false, + "isPure": false, + "lValueRequested": false, + "memberLocation": "902:8:1", + "memberName": "transfer", + "nodeType": "MemberAccess", + "src": "896:14:1", + "typeDescriptions": { + "typeIdentifier": "t_function_transfer_nonpayable$_t_uint256_$returns$__$", + "typeString": "function (uint256)" + } + }, + "id": 91, + "isConstant": false, + "isLValue": false, + "isPure": false, + "kind": "functionCall", + "lValueRequested": false, + "nameLocations": [], + "names": [], + "nodeType": "FunctionCall", + "src": "896:37:1", + "tryCall": false, + "typeDescriptions": { + "typeIdentifier": "t_tuple$__$", + "typeString": "tuple()" + } + }, + "id": 92, + "nodeType": "ExpressionStatement", + "src": "896:37:1" + } + ] + }, + "functionSelector": "3ccfd60b", + "id": 94, + "implemented": true, + "kind": "function", + "modifiers": [], + "name": "withdraw", + "nameLocation": "483:8:1", + "nodeType": "FunctionDefinition", + "parameters": { + "id": 55, + "nodeType": "ParameterList", + "parameters": [], + "src": "491:2:1" + }, + "returnParameters": { + "id": 56, + "nodeType": "ParameterList", + "parameters": [], + "src": "501:0:1" + }, + "scope": 95, + "src": "474:464:1", + "stateMutability": "nonpayable", + "virtual": false, + "visibility": "public" + } + ], + "scope": 96, + "src": "140:800:1", + "usedErrors": [] + } + ], + "src": "39:902:1" + }, + "id": 1 + } + }, + "contracts": { + "contracts/Basic.sol": { + "Basic": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "a", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "b", + "type": "uint256" + } + ], + "name": "add", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": {}, + "generatedSources": [], + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH2 0x1B4 DUP1 PUSH2 0x20 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x771602F7 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0xB1 JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x100 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x14A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x8E DUP2 PUSH2 0x7B JUMP JUMPDEST DUP2 EQ PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xAB DUP2 PUSH2 0x85 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8 JUMPI PUSH2 0xC7 PUSH2 0x76 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xD6 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE7 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA DUP2 PUSH2 0x7B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x115 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155 DUP3 PUSH2 0x7B JUMP JUMPDEST SWAP2 POP PUSH2 0x160 DUP4 PUSH2 0x7B JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x178 JUMPI PUSH2 0x177 PUSH2 0x11B JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0x797C 0xF7 CALLER SWAP11 PUSH11 0x42CE6913940BCE208AAE17 CALLER 0xBA 0xE5 LOG1 DUP1 0xFC 0xB7 AND EQ EQ 0x2A 0xCD SWAP1 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:100:0:-:0;;;;;;;;;;;;;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@add_15": { + "entryPoint": 96, + "id": 15, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_t_uint256": { + "entryPoint": 156, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256t_uint256": { + "entryPoint": 177, + "id": null, + "parameterSlots": 2, + "returnSlots": 2 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 241, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 256, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "checked_add_t_uint256": { + "entryPoint": 330, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 123, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "panic_error_0x11": { + "entryPoint": 283, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 118, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 133, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:1902:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "597:87:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "607:29:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "629:6:2" + } + ], + "functionName": { + "name": "calldataload", + "nodeType": "YulIdentifier", + "src": "616:12:2" + }, + "nodeType": "YulFunctionCall", + "src": "616:20:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "607:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "672:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "645:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "645:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "645:33:2" + } + ] + }, + "name": "abi_decode_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "575:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "583:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "591:5:2", + "type": "" + } + ], + "src": "545:139:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "773:391:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "819:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "821:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "821:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "821:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "794:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "803:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "790:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "790:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "815:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "786:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "786:32:2" + }, + "nodeType": "YulIf", + "src": "783:119:2" + }, + { + "nodeType": "YulBlock", + "src": "912:117:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "927:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "941:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "931:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "956:63:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "991:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1002:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "987:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "987:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1011:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "966:20:2" + }, + "nodeType": "YulFunctionCall", + "src": "966:53:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "956:6:2" + } + ] + } + ] + }, + { + "nodeType": "YulBlock", + "src": "1039:118:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "1054:16:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1068:2:2", + "type": "", + "value": "32" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "1058:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1084:63:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1119:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1130:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1115:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1115:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1139:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256", + "nodeType": "YulIdentifier", + "src": "1094:20:2" + }, + "nodeType": "YulFunctionCall", + "src": "1094:53:2" + }, + "variableNames": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "1084:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "735:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "746:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "758:6:2", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "766:6:2", + "type": "" + } + ], + "src": "690:474:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1235:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1252:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "1275:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1257:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1257:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1245:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1245:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1245:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "1223:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1230:3:2", + "type": "" + } + ], + "src": "1170:118:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1392:124:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1402:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1414:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1425:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1410:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1410:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1402:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1482:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1495:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1506:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1491:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1491:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "1438:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "1438:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1438:71:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1364:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "1376:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1387:4:2", + "type": "" + } + ], + "src": "1294:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1550:152:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1567:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1570:77:2", + "type": "", + "value": "35408467139433450592217433187231851964531694900788300625387963629091585785856" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1560:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1560:88:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1560:88:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1664:1:2", + "type": "", + "value": "4" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1667:4:2", + "type": "", + "value": "0x11" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1657:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1657:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1657:15:2" + }, + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1688:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1691:4:2", + "type": "", + "value": "0x24" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "1681:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1681:15:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1681:15:2" + } + ] + }, + "name": "panic_error_0x11", + "nodeType": "YulFunctionDefinition", + "src": "1522:180:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1752:147:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1762:25:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1785:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1767:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1767:20:2" + }, + "variableNames": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1762:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1796:25:2", + "value": { + "arguments": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1819:1:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "1801:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "1801:20:2" + }, + "variableNames": [ + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1796:1:2" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "1830:16:2", + "value": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1841:1:2" + }, + { + "name": "y", + "nodeType": "YulIdentifier", + "src": "1844:1:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1837:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1837:9:2" + }, + "variableNames": [ + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1830:3:2" + } + ] + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1870:22:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "panic_error_0x11", + "nodeType": "YulIdentifier", + "src": "1872:16:2" + }, + "nodeType": "YulFunctionCall", + "src": "1872:18:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1872:18:2" + } + ] + }, + "condition": { + "arguments": [ + { + "name": "x", + "nodeType": "YulIdentifier", + "src": "1862:1:2" + }, + { + "name": "sum", + "nodeType": "YulIdentifier", + "src": "1865:3:2" + } + ], + "functionName": { + "name": "gt", + "nodeType": "YulIdentifier", + "src": "1859:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "1859:10:2" + }, + "nodeType": "YulIf", + "src": "1856:36:2" + } + ] + }, + "name": "checked_add_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "x", + "nodeType": "YulTypedName", + "src": "1739:1:2", + "type": "" + }, + { + "name": "y", + "nodeType": "YulTypedName", + "src": "1742:1:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "sum", + "nodeType": "YulTypedName", + "src": "1748:3:2", + "type": "" + } + ], + "src": "1708:191:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256(offset, end) -> value {\n value := calldataload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256t_uint256(headStart, dataEnd) -> value0, value1 {\n if slt(sub(dataEnd, headStart), 64) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n {\n\n let offset := 32\n\n value1 := abi_decode_t_uint256(add(headStart, offset), dataEnd)\n }\n\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function panic_error_0x11() {\n mstore(0, 35408467139433450592217433187231851964531694900788300625387963629091585785856)\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n\n function checked_add_t_uint256(x, y) -> sum {\n x := cleanup_t_uint256(x)\n y := cleanup_t_uint256(y)\n sum := add(x, y)\n\n if gt(x, sum) { panic_error_0x11() }\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x2B JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x771602F7 EQ PUSH2 0x30 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4A PUSH1 0x4 DUP1 CALLDATASIZE SUB DUP2 ADD SWAP1 PUSH2 0x45 SWAP2 SWAP1 PUSH2 0xB1 JUMP JUMPDEST PUSH2 0x60 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x57 SWAP2 SWAP1 PUSH2 0x100 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 DUP2 DUP4 PUSH2 0x6E SWAP2 SWAP1 PUSH2 0x14A JUMP JUMPDEST SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x8E DUP2 PUSH2 0x7B JUMP JUMPDEST DUP2 EQ PUSH2 0x99 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 CALLDATALOAD SWAP1 POP PUSH2 0xAB DUP2 PUSH2 0x85 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0xC8 JUMPI PUSH2 0xC7 PUSH2 0x76 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0xD6 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP3 POP POP PUSH1 0x20 PUSH2 0xE7 DUP6 DUP3 DUP7 ADD PUSH2 0x9C JUMP JUMPDEST SWAP2 POP POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xFA DUP2 PUSH2 0x7B JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x115 PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0xF1 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x4E487B7100000000000000000000000000000000000000000000000000000000 PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH1 0x0 PUSH2 0x155 DUP3 PUSH2 0x7B JUMP JUMPDEST SWAP2 POP PUSH2 0x160 DUP4 PUSH2 0x7B JUMP JUMPDEST SWAP3 POP DUP3 DUP3 ADD SWAP1 POP DUP1 DUP3 GT ISZERO PUSH2 0x178 JUMPI PUSH2 0x177 PUSH2 0x11B JUMP JUMPDEST JUMPDEST SWAP3 SWAP2 POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 PUSH2 0x797C 0xF7 CALLER SWAP11 PUSH11 0x42CE6913940BCE208AAE17 CALLER 0xBA 0xE5 LOG1 DUP1 0xFC 0xB7 AND EQ EQ 0x2A 0xCD SWAP1 0xD0 PUSH5 0x736F6C6343 STOP ADDMOD SGT STOP CALLER ", + "sourceMap": "64:100:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;83:79;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;133:4;156:1;152;:5;;;;:::i;:::-;145:12;;83:79;;;;:::o;88:117:2:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:474::-;758:6;766;815:2;803:9;794:7;790:23;786:32;783:119;;;821:79;;:::i;:::-;783:119;941:1;966:53;1011:7;1002:6;991:9;987:22;966:53;:::i;:::-;956:63;;912:117;1068:2;1094:53;1139:7;1130:6;1119:9;1115:22;1094:53;:::i;:::-;1084:63;;1039:118;690:474;;;;;:::o;1170:118::-;1257:24;1275:5;1257:24;:::i;:::-;1252:3;1245:37;1170:118;;:::o;1294:222::-;1387:4;1425:2;1414:9;1410:18;1402:26;;1438:71;1506:1;1495:9;1491:17;1482:6;1438:71;:::i;:::-;1294:222;;;;:::o;1522:180::-;1570:77;1567:1;1560:88;1667:4;1664:1;1657:15;1691:4;1688:1;1681:15;1708:191;1748:3;1767:20;1785:1;1767:20;:::i;:::-;1762:25;;1801:20;1819:1;1801:20;:::i;:::-;1796:25;;1844:1;1841;1837:9;1830:16;;1865:3;1862:1;1859:10;1856:36;;;1872:18;;:::i;:::-;1856:36;1708:191;;;;:::o" + }, + "methodIdentifiers": { + "add(uint256,uint256)": "771602f7" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"a\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"b\",\"type\":\"uint256\"}],\"name\":\"add\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Basic.sol\":\"Basic\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Basic.sol\":{\"keccak256\":\"0x8566787d8567b5b7d85a887905bf5d0c5104be4f83488ba9e7e1e5b10e9af8cf\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://46cb6c6cebfef5738350ad9cfc0c3b1c9407f4e9b58a8219c36fb5c17c41ce1a\",\"dweb:/ipfs/Qmf5tnzv7HDJtPeaRsBWh3AYRH12Ezrn7C6UVScevo36Ht\"]}},\"version\":1}" + } + }, + "contracts/Lock.sol": { + "Lock": { + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "_unlockTime", + "type": "uint256" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "when", + "type": "uint256" + } + ], + "name": "Withdrawal", + "type": "event" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address payable", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "unlockTime", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "withdraw", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "evm": { + "bytecode": { + "functionDebugData": { + "@_54": { + "entryPoint": null, + "id": 54, + "parameterSlots": 1, + "returnSlots": 0 + }, + "abi_decode_t_uint256_fromMemory": { + "entryPoint": 219, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_decode_tuple_t_uint256_fromMemory": { + "entryPoint": 240, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack": { + "entryPoint": 381, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 416, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "allocate_unbounded": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 285, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 186, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db": { + "entryPoint": null, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b": { + "entryPoint": 181, + "id": null, + "parameterSlots": 0, + "returnSlots": 0 + }, + "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413": { + "entryPoint": 302, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "validator_revert_t_uint256": { + "entryPoint": 196, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:2248:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "47:35:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "57:19:2", + "value": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "73:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "67:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "67:9:2" + }, + "variableNames": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "57:6:2" + } + ] + } + ] + }, + "name": "allocate_unbounded", + "nodeType": "YulFunctionDefinition", + "returnVariables": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "40:6:2", + "type": "" + } + ], + "src": "7:75:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "177:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "194:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "197:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "187:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "187:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "187:12:2" + } + ] + }, + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulFunctionDefinition", + "src": "88:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "300:28:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "317:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "320:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "310:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "310:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "310:12:2" + } + ] + }, + "name": "revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db", + "nodeType": "YulFunctionDefinition", + "src": "211:117:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "379:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "389:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "400:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "389:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "361:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "371:7:2", + "type": "" + } + ], + "src": "334:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "460:79:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "517:16:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "526:1:2", + "type": "", + "value": "0" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "529:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "revert", + "nodeType": "YulIdentifier", + "src": "519:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "519:12:2" + }, + "nodeType": "YulExpressionStatement", + "src": "519:12:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "483:5:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "508:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "490:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "490:24:2" + } + ], + "functionName": { + "name": "eq", + "nodeType": "YulIdentifier", + "src": "480:2:2" + }, + "nodeType": "YulFunctionCall", + "src": "480:35:2" + } + ], + "functionName": { + "name": "iszero", + "nodeType": "YulIdentifier", + "src": "473:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "473:43:2" + }, + "nodeType": "YulIf", + "src": "470:63:2" + } + ] + }, + "name": "validator_revert_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "453:5:2", + "type": "" + } + ], + "src": "417:122:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "608:80:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "618:22:2", + "value": { + "arguments": [ + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "633:6:2" + } + ], + "functionName": { + "name": "mload", + "nodeType": "YulIdentifier", + "src": "627:5:2" + }, + "nodeType": "YulFunctionCall", + "src": "627:13:2" + }, + "variableNames": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "618:5:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "676:5:2" + } + ], + "functionName": { + "name": "validator_revert_t_uint256", + "nodeType": "YulIdentifier", + "src": "649:26:2" + }, + "nodeType": "YulFunctionCall", + "src": "649:33:2" + }, + "nodeType": "YulExpressionStatement", + "src": "649:33:2" + } + ] + }, + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "586:6:2", + "type": "" + }, + { + "name": "end", + "nodeType": "YulTypedName", + "src": "594:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "602:5:2", + "type": "" + } + ], + "src": "545:143:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "771:274:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "817:83:2", + "statements": [ + { + "expression": { + "arguments": [], + "functionName": { + "name": "revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b", + "nodeType": "YulIdentifier", + "src": "819:77:2" + }, + "nodeType": "YulFunctionCall", + "src": "819:79:2" + }, + "nodeType": "YulExpressionStatement", + "src": "819:79:2" + } + ] + }, + "condition": { + "arguments": [ + { + "arguments": [ + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "792:7:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "801:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "788:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "788:23:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "813:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "slt", + "nodeType": "YulIdentifier", + "src": "784:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "784:32:2" + }, + "nodeType": "YulIf", + "src": "781:119:2" + }, + { + "nodeType": "YulBlock", + "src": "910:128:2", + "statements": [ + { + "nodeType": "YulVariableDeclaration", + "src": "925:15:2", + "value": { + "kind": "number", + "nodeType": "YulLiteral", + "src": "939:1:2", + "type": "", + "value": "0" + }, + "variables": [ + { + "name": "offset", + "nodeType": "YulTypedName", + "src": "929:6:2", + "type": "" + } + ] + }, + { + "nodeType": "YulAssignment", + "src": "954:74:2", + "value": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1000:9:2" + }, + { + "name": "offset", + "nodeType": "YulIdentifier", + "src": "1011:6:2" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "996:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "996:22:2" + }, + { + "name": "dataEnd", + "nodeType": "YulIdentifier", + "src": "1020:7:2" + } + ], + "functionName": { + "name": "abi_decode_t_uint256_fromMemory", + "nodeType": "YulIdentifier", + "src": "964:31:2" + }, + "nodeType": "YulFunctionCall", + "src": "964:64:2" + }, + "variableNames": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "954:6:2" + } + ] + } + ] + } + ] + }, + "name": "abi_decode_tuple_t_uint256_fromMemory", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "741:9:2", + "type": "" + }, + { + "name": "dataEnd", + "nodeType": "YulTypedName", + "src": "752:7:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "764:6:2", + "type": "" + } + ], + "src": "694:351:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1147:73:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1164:3:2" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1169:6:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1157:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1157:19:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1157:19:2" + }, + { + "nodeType": "YulAssignment", + "src": "1185:29:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1204:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1209:4:2", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1200:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1200:14:2" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1185:11:2" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1119:3:2", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1124:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1135:11:2", + "type": "" + } + ], + "src": "1051:169:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1332:116:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1354:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1362:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1350:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1350:14:2" + }, + { + "hexValue": "556e6c6f636b2074696d652073686f756c6420626520696e2074686520667574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1366:34:2", + "type": "", + "value": "Unlock time should be in the fut" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1343:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1343:58:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1343:58:2" + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1422:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1430:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1418:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1418:15:2" + }, + { + "hexValue": "757265", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1435:5:2", + "type": "", + "value": "ure" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1411:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1411:30:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1411:30:2" + } + ] + }, + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1324:6:2", + "type": "" + } + ], + "src": "1226:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1600:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1610:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1676:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1681:2:2", + "type": "", + "value": "35" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1617:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "1617:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1610:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1782:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413", + "nodeType": "YulIdentifier", + "src": "1693:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "1693:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1693:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "1795:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1806:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1811:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1802:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1802:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1795:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1588:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1596:3:2", + "type": "" + } + ], + "src": "1454:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1997:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2007:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2019:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2030:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2015:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2015:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2007:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2054:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2065:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2050:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2050:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2073:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2079:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2069:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2069:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2043:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2043:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2043:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "2099:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2233:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2107:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "2107:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2099:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1977:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1992:4:2", + "type": "" + } + ], + "src": "1826:419:2" + } + ] + }, + "contents": "{\n\n function allocate_unbounded() -> memPtr {\n memPtr := mload(64)\n }\n\n function revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() {\n revert(0, 0)\n }\n\n function revert_error_c1322bf8034eace5e0b5c7295db60986aa89aae5e0ea0873e4689e076861a5db() {\n revert(0, 0)\n }\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function validator_revert_t_uint256(value) {\n if iszero(eq(value, cleanup_t_uint256(value))) { revert(0, 0) }\n }\n\n function abi_decode_t_uint256_fromMemory(offset, end) -> value {\n value := mload(offset)\n validator_revert_t_uint256(value)\n }\n\n function abi_decode_tuple_t_uint256_fromMemory(headStart, dataEnd) -> value0 {\n if slt(sub(dataEnd, headStart), 32) { revert_error_dbdddcbe895c83990c08b3492a0e83918d802a52331272ac6fdb6a7c4aea3b1b() }\n\n {\n\n let offset := 0\n\n value0 := abi_decode_t_uint256_fromMemory(add(headStart, offset), dataEnd)\n }\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(memPtr) {\n\n mstore(add(memPtr, 0), \"Unlock time should be in the fut\")\n\n mstore(add(memPtr, 32), \"ure\")\n\n }\n\n function abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 35)\n store_literal_in_memory_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413(pos)\n end := add(pos, 64)\n }\n\n function abi_encode_tuple_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_f6fa9918d4578fba07be58c41841a4c6937c19725f7f4601884cd186799a8413_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "linkReferences": {}, + "object": "60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x40 MLOAD PUSH2 0x5D8 CODESIZE SUB DUP1 PUSH2 0x5D8 DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE DUP2 ADD SWAP1 PUSH2 0x25 SWAP2 SWAP1 PUSH2 0xF0 JUMP JUMPDEST DUP1 TIMESTAMP LT PUSH2 0x67 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x5E SWAP1 PUSH2 0x1A0 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP1 PUSH1 0x0 DUP2 SWAP1 SSTORE POP CALLER PUSH1 0x1 PUSH1 0x0 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP POP PUSH2 0x1C0 JUMP JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0xCD DUP2 PUSH2 0xBA JUMP JUMPDEST DUP2 EQ PUSH2 0xD8 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x0 DUP2 MLOAD SWAP1 POP PUSH2 0xEA DUP2 PUSH2 0xC4 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x106 JUMPI PUSH2 0x105 PUSH2 0xB5 JUMP JUMPDEST JUMPDEST PUSH1 0x0 PUSH2 0x114 DUP5 DUP3 DUP6 ADD PUSH2 0xDB JUMP JUMPDEST SWAP2 POP POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x556E6C6F636B2074696D652073686F756C6420626520696E2074686520667574 PUSH1 0x0 DUP3 ADD MSTORE PUSH32 0x7572650000000000000000000000000000000000000000000000000000000000 PUSH1 0x20 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x18A PUSH1 0x23 DUP4 PUSH2 0x11D JUMP JUMPDEST SWAP2 POP PUSH2 0x195 DUP3 PUSH2 0x12E JUMP JUMPDEST PUSH1 0x40 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x1B9 DUP2 PUSH2 0x17D JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x409 DUP1 PUSH2 0x1CF PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:1:-:0;;;262:208;;;;;;;;;;;;;;;;;;;;;:::i;:::-;339:11;321:15;:29;306:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;421:11;408:10;:24;;;;454:10;438:5;;:27;;;;;;;;;;;;;;;;;;262:208;140:800;;88:117:2;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:143::-;602:5;633:6;627:13;618:22;;649:33;676:5;649:33;:::i;:::-;545:143;;;;:::o;694:351::-;764:6;813:2;801:9;792:7;788:23;784:32;781:119;;;819:79;;:::i;:::-;781:119;939:1;964:64;1020:7;1011:6;1000:9;996:22;964:64;:::i;:::-;954:74;;910:128;694:351;;;;:::o;1051:169::-;1135:11;1169:6;1164:3;1157:19;1209:4;1204:3;1200:14;1185:29;;1051:169;;;;:::o;1226:222::-;1366:34;1362:1;1354:6;1350:14;1343:58;1435:5;1430:2;1422:6;1418:15;1411:30;1226:222;:::o;1454:366::-;1596:3;1617:67;1681:2;1676:3;1617:67;:::i;:::-;1610:74;;1693:93;1782:3;1693:93;:::i;:::-;1811:2;1806:3;1802:12;1795:19;;1454:366;;;:::o;1826:419::-;1992:4;2030:2;2019:9;2015:18;2007:26;;2079:9;2073:4;2069:20;2065:1;2054:9;2050:17;2043:47;2107:131;2233:4;2107:131;:::i;:::-;2099:139;;1826:419;;;:::o;140:800:1:-;;;;;;;" + }, + "deployedBytecode": { + "functionDebugData": { + "@owner_22": { + "entryPoint": 523, + "id": 22, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@unlockTime_20": { + "entryPoint": 140, + "id": 20, + "parameterSlots": 0, + "returnSlots": 0 + }, + "@withdraw_94": { + "entryPoint": 146, + "id": 94, + "parameterSlots": 0, + "returnSlots": 0 + }, + "abi_encode_t_address_payable_to_t_address_payable_fromStack": { + "entryPoint": 663, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack": { + "entryPoint": 763, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack": { + "entryPoint": 871, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_t_uint256_to_t_uint256_fromStack": { + "entryPoint": 571, + "id": null, + "parameterSlots": 2, + "returnSlots": 0 + }, + "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed": { + "entryPoint": 678, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 798, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed": { + "entryPoint": 906, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed": { + "entryPoint": 586, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed": { + "entryPoint": 938, + "id": null, + "parameterSlots": 3, + "returnSlots": 1 + }, + "array_storeLengthForEncoding_t_string_memory_ptr_fromStack": { + "entryPoint": 705, + "id": null, + "parameterSlots": 2, + "returnSlots": 1 + }, + "cleanup_t_address_payable": { + "entryPoint": 645, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint160": { + "entryPoint": 613, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "cleanup_t_uint256": { + "entryPoint": 561, + "id": null, + "parameterSlots": 1, + "returnSlots": 1 + }, + "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8": { + "entryPoint": 722, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + }, + "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a": { + "entryPoint": 830, + "id": null, + "parameterSlots": 1, + "returnSlots": 0 + } + }, + "generatedSources": [ + { + "ast": { + "nodeType": "YulBlock", + "src": "0:3550:2", + "statements": [ + { + "body": { + "nodeType": "YulBlock", + "src": "52:32:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "62:16:2", + "value": { + "name": "value", + "nodeType": "YulIdentifier", + "src": "73:5:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "62:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint256", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "34:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "44:7:2", + "type": "" + } + ], + "src": "7:77:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "155:53:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "172:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "195:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint256", + "nodeType": "YulIdentifier", + "src": "177:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "177:24:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "165:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "165:37:2" + }, + "nodeType": "YulExpressionStatement", + "src": "165:37:2" + } + ] + }, + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "143:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "150:3:2", + "type": "" + } + ], + "src": "90:118:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "312:124:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "322:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "334:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "345:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "330:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "330:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "322:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "402:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "415:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "426:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "411:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "411:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "358:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "358:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "358:71:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "284:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "296:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "307:4:2", + "type": "" + } + ], + "src": "214:222:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "487:81:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "497:65:2", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "512:5:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "519:42:2", + "type": "", + "value": "0xffffffffffffffffffffffffffffffffffffffff" + } + ], + "functionName": { + "name": "and", + "nodeType": "YulIdentifier", + "src": "508:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "508:54:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "497:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_uint160", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "469:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "479:7:2", + "type": "" + } + ], + "src": "442:126:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "627:51:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "637:35:2", + "value": { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "666:5:2" + } + ], + "functionName": { + "name": "cleanup_t_uint160", + "nodeType": "YulIdentifier", + "src": "648:17:2" + }, + "nodeType": "YulFunctionCall", + "src": "648:24:2" + }, + "variableNames": [ + { + "name": "cleaned", + "nodeType": "YulIdentifier", + "src": "637:7:2" + } + ] + } + ] + }, + "name": "cleanup_t_address_payable", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "609:5:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "cleaned", + "nodeType": "YulTypedName", + "src": "619:7:2", + "type": "" + } + ], + "src": "574:104:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "765:61:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "782:3:2" + }, + { + "arguments": [ + { + "name": "value", + "nodeType": "YulIdentifier", + "src": "813:5:2" + } + ], + "functionName": { + "name": "cleanup_t_address_payable", + "nodeType": "YulIdentifier", + "src": "787:25:2" + }, + "nodeType": "YulFunctionCall", + "src": "787:32:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "775:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "775:45:2" + }, + "nodeType": "YulExpressionStatement", + "src": "775:45:2" + } + ] + }, + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "value", + "nodeType": "YulTypedName", + "src": "753:5:2", + "type": "" + }, + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "760:3:2", + "type": "" + } + ], + "src": "684:142:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "946:140:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "956:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "968:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "979:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "964:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "964:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "956:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "1052:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "1065:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1076:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1061:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1061:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_address_payable_to_t_address_payable_fromStack", + "nodeType": "YulIdentifier", + "src": "992:59:2" + }, + "nodeType": "YulFunctionCall", + "src": "992:87:2" + }, + "nodeType": "YulExpressionStatement", + "src": "992:87:2" + } + ] + }, + "name": "abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "918:9:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "930:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "941:4:2", + "type": "" + } + ], + "src": "832:254:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1188:73:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1205:3:2" + }, + { + "name": "length", + "nodeType": "YulIdentifier", + "src": "1210:6:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1198:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1198:19:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1198:19:2" + }, + { + "nodeType": "YulAssignment", + "src": "1226:29:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1245:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1250:4:2", + "type": "", + "value": "0x20" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1241:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1241:14:2" + }, + "variableNames": [ + { + "name": "updated_pos", + "nodeType": "YulIdentifier", + "src": "1226:11:2" + } + ] + } + ] + }, + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1160:3:2", + "type": "" + }, + { + "name": "length", + "nodeType": "YulTypedName", + "src": "1165:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "updated_pos", + "nodeType": "YulTypedName", + "src": "1176:11:2", + "type": "" + } + ], + "src": "1092:169:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1373:66:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "1395:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1403:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1391:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1391:14:2" + }, + { + "hexValue": "596f752063616e277420776974686472617720796574", + "kind": "string", + "nodeType": "YulLiteral", + "src": "1407:24:2", + "type": "", + "value": "You can't withdraw yet" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "1384:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "1384:48:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1384:48:2" + } + ] + }, + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "1365:6:2", + "type": "" + } + ], + "src": "1267:172:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1591:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1601:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1667:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1672:2:2", + "type": "", + "value": "22" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "1608:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "1608:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1601:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1773:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8", + "nodeType": "YulIdentifier", + "src": "1684:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "1684:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "1684:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "1786:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "1797:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "1802:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "1793:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "1793:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "1786:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "1579:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "1587:3:2", + "type": "" + } + ], + "src": "1445:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "1988:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "1998:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2010:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2021:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2006:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2006:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "1998:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2045:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2056:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2041:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2041:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2064:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2070:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "2060:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2060:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2034:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2034:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2034:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "2090:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2224:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2098:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "2098:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2090:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "1968:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "1983:4:2", + "type": "" + } + ], + "src": "1817:419:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2348:64:2", + "statements": [ + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "memPtr", + "nodeType": "YulIdentifier", + "src": "2370:6:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2378:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2366:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2366:14:2" + }, + { + "hexValue": "596f75206172656e277420746865206f776e6572", + "kind": "string", + "nodeType": "YulLiteral", + "src": "2382:22:2", + "type": "", + "value": "You aren't the owner" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "2359:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "2359:46:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2359:46:2" + } + ] + }, + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "memPtr", + "nodeType": "YulTypedName", + "src": "2340:6:2", + "type": "" + } + ], + "src": "2242:170:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2564:220:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2574:74:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2640:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2645:2:2", + "type": "", + "value": "20" + } + ], + "functionName": { + "name": "array_storeLengthForEncoding_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "2581:58:2" + }, + "nodeType": "YulFunctionCall", + "src": "2581:67:2" + }, + "variableNames": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2574:3:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2746:3:2" + } + ], + "functionName": { + "name": "store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a", + "nodeType": "YulIdentifier", + "src": "2657:88:2" + }, + "nodeType": "YulFunctionCall", + "src": "2657:93:2" + }, + "nodeType": "YulExpressionStatement", + "src": "2657:93:2" + }, + { + "nodeType": "YulAssignment", + "src": "2759:19:2", + "value": { + "arguments": [ + { + "name": "pos", + "nodeType": "YulIdentifier", + "src": "2770:3:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2775:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2766:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2766:12:2" + }, + "variableNames": [ + { + "name": "end", + "nodeType": "YulIdentifier", + "src": "2759:3:2" + } + ] + } + ] + }, + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "pos", + "nodeType": "YulTypedName", + "src": "2552:3:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "end", + "nodeType": "YulTypedName", + "src": "2560:3:2", + "type": "" + } + ], + "src": "2418:366:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "2961:248:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "2971:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "2983:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "2994:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "2979:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "2979:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "2971:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3018:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3029:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3014:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3014:17:2" + }, + { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3037:4:2" + }, + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3043:9:2" + } + ], + "functionName": { + "name": "sub", + "nodeType": "YulIdentifier", + "src": "3033:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3033:20:2" + } + ], + "functionName": { + "name": "mstore", + "nodeType": "YulIdentifier", + "src": "3007:6:2" + }, + "nodeType": "YulFunctionCall", + "src": "3007:47:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3007:47:2" + }, + { + "nodeType": "YulAssignment", + "src": "3063:139:2", + "value": { + "arguments": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3197:4:2" + } + ], + "functionName": { + "name": "abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack", + "nodeType": "YulIdentifier", + "src": "3071:124:2" + }, + "nodeType": "YulFunctionCall", + "src": "3071:131:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3063:4:2" + } + ] + } + ] + }, + "name": "abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "2941:9:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "2956:4:2", + "type": "" + } + ], + "src": "2790:419:2" + }, + { + "body": { + "nodeType": "YulBlock", + "src": "3341:206:2", + "statements": [ + { + "nodeType": "YulAssignment", + "src": "3351:26:2", + "value": { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3363:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3374:2:2", + "type": "", + "value": "64" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3359:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3359:18:2" + }, + "variableNames": [ + { + "name": "tail", + "nodeType": "YulIdentifier", + "src": "3351:4:2" + } + ] + }, + { + "expression": { + "arguments": [ + { + "name": "value0", + "nodeType": "YulIdentifier", + "src": "3431:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3444:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3455:1:2", + "type": "", + "value": "0" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3440:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3440:17:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3387:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "3387:71:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3387:71:2" + }, + { + "expression": { + "arguments": [ + { + "name": "value1", + "nodeType": "YulIdentifier", + "src": "3512:6:2" + }, + { + "arguments": [ + { + "name": "headStart", + "nodeType": "YulIdentifier", + "src": "3525:9:2" + }, + { + "kind": "number", + "nodeType": "YulLiteral", + "src": "3536:2:2", + "type": "", + "value": "32" + } + ], + "functionName": { + "name": "add", + "nodeType": "YulIdentifier", + "src": "3521:3:2" + }, + "nodeType": "YulFunctionCall", + "src": "3521:18:2" + } + ], + "functionName": { + "name": "abi_encode_t_uint256_to_t_uint256_fromStack", + "nodeType": "YulIdentifier", + "src": "3468:43:2" + }, + "nodeType": "YulFunctionCall", + "src": "3468:72:2" + }, + "nodeType": "YulExpressionStatement", + "src": "3468:72:2" + } + ] + }, + "name": "abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed", + "nodeType": "YulFunctionDefinition", + "parameters": [ + { + "name": "headStart", + "nodeType": "YulTypedName", + "src": "3305:9:2", + "type": "" + }, + { + "name": "value1", + "nodeType": "YulTypedName", + "src": "3317:6:2", + "type": "" + }, + { + "name": "value0", + "nodeType": "YulTypedName", + "src": "3325:6:2", + "type": "" + } + ], + "returnVariables": [ + { + "name": "tail", + "nodeType": "YulTypedName", + "src": "3336:4:2", + "type": "" + } + ], + "src": "3215:332:2" + } + ] + }, + "contents": "{\n\n function cleanup_t_uint256(value) -> cleaned {\n cleaned := value\n }\n\n function abi_encode_t_uint256_to_t_uint256_fromStack(value, pos) {\n mstore(pos, cleanup_t_uint256(value))\n }\n\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n }\n\n function cleanup_t_uint160(value) -> cleaned {\n cleaned := and(value, 0xffffffffffffffffffffffffffffffffffffffff)\n }\n\n function cleanup_t_address_payable(value) -> cleaned {\n cleaned := cleanup_t_uint160(value)\n }\n\n function abi_encode_t_address_payable_to_t_address_payable_fromStack(value, pos) {\n mstore(pos, cleanup_t_address_payable(value))\n }\n\n function abi_encode_tuple_t_address_payable__to_t_address_payable__fromStack_reversed(headStart , value0) -> tail {\n tail := add(headStart, 32)\n\n abi_encode_t_address_payable_to_t_address_payable_fromStack(value0, add(headStart, 0))\n\n }\n\n function array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, length) -> updated_pos {\n mstore(pos, length)\n updated_pos := add(pos, 0x20)\n }\n\n function store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(memPtr) {\n\n mstore(add(memPtr, 0), \"You can't withdraw yet\")\n\n }\n\n function abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 22)\n store_literal_in_memory_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_09be2a1d7c98765b8c1bd9ab3700b54ab19d501eebe572af39b71382f17d12e8_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(memPtr) {\n\n mstore(add(memPtr, 0), \"You aren't the owner\")\n\n }\n\n function abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack(pos) -> end {\n pos := array_storeLengthForEncoding_t_string_memory_ptr_fromStack(pos, 20)\n store_literal_in_memory_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a(pos)\n end := add(pos, 32)\n }\n\n function abi_encode_tuple_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a__to_t_string_memory_ptr__fromStack_reversed(headStart ) -> tail {\n tail := add(headStart, 32)\n\n mstore(add(headStart, 0), sub(tail, headStart))\n tail := abi_encode_t_stringliteral_345d93c1110e55177ee5f687f392a2e775da2aa3d491c8308e925f0505e3530a_to_t_string_memory_ptr_fromStack( tail)\n\n }\n\n function abi_encode_tuple_t_uint256_t_uint256__to_t_uint256_t_uint256__fromStack_reversed(headStart , value1, value0) -> tail {\n tail := add(headStart, 64)\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value0, add(headStart, 0))\n\n abi_encode_t_uint256_to_t_uint256_fromStack(value1, add(headStart, 32))\n\n }\n\n}\n", + "id": 2, + "language": "Yul", + "name": "#utility.yul" + } + ], + "immutableReferences": {}, + "linkReferences": {}, + "object": "608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c63430008130033", + "opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x41 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x251C1AA3 EQ PUSH2 0x46 JUMPI DUP1 PUSH4 0x3CCFD60B EQ PUSH2 0x64 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x6E JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x4E PUSH2 0x8C JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x5B SWAP2 SWAP1 PUSH2 0x24A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x6C PUSH2 0x92 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x76 PUSH2 0x20B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x83 SWAP2 SWAP1 PUSH2 0x2A6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH1 0x0 SLOAD DUP2 JUMP JUMPDEST PUSH1 0x0 SLOAD TIMESTAMP LT ISZERO PUSH2 0xD7 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0xCE SWAP1 PUSH2 0x31E JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND CALLER PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ PUSH2 0x167 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x15E SWAP1 PUSH2 0x38A JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0xBF2ED60BD5B5965D685680C01195C9514E4382E28E3A5A2D2D5244BF59411B93 SELFBALANCE TIMESTAMP PUSH1 0x40 MLOAD PUSH2 0x198 SWAP3 SWAP2 SWAP1 PUSH2 0x3AA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH2 0x8FC SELFBALANCE SWAP1 DUP2 ISZERO MUL SWAP1 PUSH1 0x40 MLOAD PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 DUP6 DUP9 DUP9 CALL SWAP4 POP POP POP POP ISZERO DUP1 ISZERO PUSH2 0x208 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x0 SWAP1 SLOAD SWAP1 PUSH2 0x100 EXP SWAP1 DIV PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 JUMP JUMPDEST PUSH1 0x0 DUP2 SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x244 DUP2 PUSH2 0x231 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x25F PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF DUP3 AND SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x290 DUP3 PUSH2 0x265 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x2A0 DUP2 PUSH2 0x285 JUMP JUMPDEST DUP3 MSTORE POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP PUSH2 0x2BB PUSH1 0x0 DUP4 ADD DUP5 PUSH2 0x297 JUMP JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 MSTORE PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH32 0x596F752063616E27742077697468647261772079657400000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x308 PUSH1 0x16 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x313 DUP3 PUSH2 0x2D2 JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x337 DUP2 PUSH2 0x2FB JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH32 0x596F75206172656E277420746865206F776E6572000000000000000000000000 PUSH1 0x0 DUP3 ADD MSTORE POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x374 PUSH1 0x14 DUP4 PUSH2 0x2C1 JUMP JUMPDEST SWAP2 POP PUSH2 0x37F DUP3 PUSH2 0x33E JUMP JUMPDEST PUSH1 0x20 DUP3 ADD SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 ADD SWAP1 POP DUP2 DUP2 SUB PUSH1 0x0 DUP4 ADD MSTORE PUSH2 0x3A3 DUP2 PUSH2 0x367 JUMP JUMPDEST SWAP1 POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x40 DUP3 ADD SWAP1 POP PUSH2 0x3BF PUSH1 0x0 DUP4 ADD DUP6 PUSH2 0x23B JUMP JUMPDEST PUSH2 0x3CC PUSH1 0x20 DUP4 ADD DUP5 PUSH2 0x23B JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xF9 0x2F PUSH20 0xD2A3284A3C1CCA55A0FE6EC1A91B13BEC884AECD 0xBC 0xF6 PREVRANDAO 0xCE 0xBF 0x27 PUSH21 0xF32F64736F6C634300081300330000000000000000 ", + "sourceMap": "140:800:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;474:464;;;:::i;:::-;;184:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;158:22;;;;:::o;474:464::-;732:10;;713:15;:29;;705:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;797:5;;;;;;;;;;;783:19;;:10;:19;;;775:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;839:50;850:21;873:15;839:50;;;;;;;:::i;:::-;;;;;;;;896:5;;;;;;;;;;;:14;;:37;911:21;896:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;474:464::o;184:28::-;;;;;;;;;;;;;:::o;7:77:2:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:126::-;479:7;519:42;512:5;508:54;497:65;;442:126;;;:::o;574:104::-;619:7;648:24;666:5;648:24;:::i;:::-;637:35;;574:104;;;:::o;684:142::-;787:32;813:5;787:32;:::i;:::-;782:3;775:45;684:142;;:::o;832:254::-;941:4;979:2;968:9;964:18;956:26;;992:87;1076:1;1065:9;1061:17;1052:6;992:87;:::i;:::-;832:254;;;;:::o;1092:169::-;1176:11;1210:6;1205:3;1198:19;1250:4;1245:3;1241:14;1226:29;;1092:169;;;;:::o;1267:172::-;1407:24;1403:1;1395:6;1391:14;1384:48;1267:172;:::o;1445:366::-;1587:3;1608:67;1672:2;1667:3;1608:67;:::i;:::-;1601:74;;1684:93;1773:3;1684:93;:::i;:::-;1802:2;1797:3;1793:12;1786:19;;1445:366;;;:::o;1817:419::-;1983:4;2021:2;2010:9;2006:18;1998:26;;2070:9;2064:4;2060:20;2056:1;2045:9;2041:17;2034:47;2098:131;2224:4;2098:131;:::i;:::-;2090:139;;1817:419;;;:::o;2242:170::-;2382:22;2378:1;2370:6;2366:14;2359:46;2242:170;:::o;2418:366::-;2560:3;2581:67;2645:2;2640:3;2581:67;:::i;:::-;2574:74;;2657:93;2746:3;2657:93;:::i;:::-;2775:2;2770:3;2766:12;2759:19;;2418:366;;;:::o;2790:419::-;2956:4;2994:2;2983:9;2979:18;2971:26;;3043:9;3037:4;3033:20;3029:1;3018:9;3014:17;3007:47;3071:131;3197:4;3071:131;:::i;:::-;3063:139;;2790:419;;;:::o;3215:332::-;3336:4;3374:2;3363:9;3359:18;3351:26;;3387:71;3455:1;3444:9;3440:17;3431:6;3387:71;:::i;:::-;3468:72;3536:2;3525:9;3521:18;3512:6;3468:72;:::i;:::-;3215:332;;;;;:::o" + }, + "methodIdentifiers": { + "owner()": "8da5cb5b", + "unlockTime()": "251c1aa3", + "withdraw()": "3ccfd60b" + } + }, + "metadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_unlockTime\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"when\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unlockTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Lock.sol\":\"Lock\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/Lock.sol\":{\"keccak256\":\"0x290d672235b22ec4740c076ad0108b37f5d3073810f5c7d502d90c72591ee9dc\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://3d74a8be6305243875a1e4bb2c8fcbd29672aa20a3781595cfbee6b743358b6b\",\"dweb:/ipfs/QmVWAacJB7wL7fBhAyvyqJLWDCEL9vMfwEeR3ydxtsprLf\"]}},\"version\":1}" + } + } + } + } +} \ No newline at end of file diff --git a/packages/core/test/mocks/status/external-artifact/deployed_addresses.json b/packages/core/test/mocks/status/external-artifact/deployed_addresses.json new file mode 100644 index 0000000000..1b41343554 --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/deployed_addresses.json @@ -0,0 +1,5 @@ +{ + "LockModule#Basic": "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + "LockModule#Basic2": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "LockModule#Lock": "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9" +} diff --git a/packages/core/test/mocks/status/external-artifact/journal.jsonl b/packages/core/test/mocks/status/external-artifact/journal.jsonl new file mode 100644 index 0000000000..9ee433b858 --- /dev/null +++ b/packages/core/test/mocks/status/external-artifact/journal.jsonl @@ -0,0 +1,13 @@ + +{"chainId":31337,"type":"DEPLOYMENT_INITIALIZE"} +{"artifactId":"LockModule#Basic","constructorArgs":[],"contractName":"Basic","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Basic","futureType":"CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"0"}} +{"futureId":"LockModule#Basic","networkInteraction":{"data":"0x608060405234801561001057600080fd5b506101b4806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063771602f714610030575b600080fd5b61004a600480360381019061004591906100b1565b610060565b6040516100579190610100565b60405180910390f35b6000818361006e919061014a565b905092915050565b600080fd5b6000819050919050565b61008e8161007b565b811461009957600080fd5b50565b6000813590506100ab81610085565b92915050565b600080604083850312156100c8576100c7610076565b5b60006100d68582860161009c565b92505060206100e78582860161009c565b9150509250929050565b6100fa8161007b565b82525050565b600060208201905061011560008301846100f1565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006101558261007b565b91506101608361007b565b92508282019050808211156101785761017761011b565b5b9291505056fea264697066735822122061797cf7339a6a42ce6913940bce208aae1733bae5a180fcb71614142acd90d064736f6c63430008130033","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"0"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Basic","networkInteractionId":1,"nonce":2,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2533392716"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x89e0a88c7c22630daf55e06fcdac74f74364710b7324b3b9bed0b1478027cc7e"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Basic","hash":"0x89e0a88c7c22630daf55e06fcdac74f74364710b7324b3b9bed0b1478027cc7e","networkInteractionId":1,"receipt":{"blockHash":"0xa93d1b7c28ae878f758ec66abbf2d252b8f56a307c85029602280588e2199705","blockNumber":3,"contractAddress":"0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Basic","result":{"address":"0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} +{"artifactId":"LockModule#Basic2","contractAddress":"0x5FbDB2315678afecb367f032d93F642f64180aa3","contractName":"Basic2","dependencies":[],"futureId":"LockModule#Basic2","futureType":"CONTRACT_AT","strategy":"basic","strategyConfig":{},"type":"CONTRACT_AT_EXECUTION_STATE_INITIALIZE"} +{"artifactId":"LockModule#Lock","constructorArgs":[1987909200],"contractName":"Lock","dependencies":[],"from":"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266","futureId":"LockModule#Lock","futureType":"NAMED_ARTIFACT_CONTRACT_DEPLOYMENT","libraries":{},"strategy":"basic","strategyConfig":{},"type":"DEPLOYMENT_EXECUTION_STATE_INITIALIZE","value":{"_kind":"bigint","value":"1000000000"}} +{"futureId":"LockModule#Lock","networkInteraction":{"data":"0x60806040526040516105d83803806105d8833981810160405281019061002591906100f0565b804210610067576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161005e906101a0565b60405180910390fd5b8060008190555033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506101c0565b600080fd5b6000819050919050565b6100cd816100ba565b81146100d857600080fd5b50565b6000815190506100ea816100c4565b92915050565b600060208284031215610106576101056100b5565b5b6000610114848285016100db565b91505092915050565b600082825260208201905092915050565b7f556e6c6f636b2074696d652073686f756c6420626520696e207468652066757460008201527f7572650000000000000000000000000000000000000000000000000000000000602082015250565b600061018a60238361011d565b91506101958261012e565b604082019050919050565b600060208201905081810360008301526101b98161017d565b9050919050565b610409806101cf6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063251c1aa3146100465780633ccfd60b146100645780638da5cb5b1461006e575b600080fd5b61004e61008c565b60405161005b919061024a565b60405180910390f35b61006c610092565b005b61007661020b565b60405161008391906102a6565b60405180910390f35b60005481565b6000544210156100d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100ce9061031e565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161015e9061038a565b60405180910390fd5b7fbf2ed60bd5b5965d685680c01195c9514e4382e28e3a5a2d2d5244bf59411b9347426040516101989291906103aa565b60405180910390a1600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610208573d6000803e3d6000fd5b50565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000819050919050565b61024481610231565b82525050565b600060208201905061025f600083018461023b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061029082610265565b9050919050565b6102a081610285565b82525050565b60006020820190506102bb6000830184610297565b92915050565b600082825260208201905092915050565b7f596f752063616e27742077697468647261772079657400000000000000000000600082015250565b60006103086016836102c1565b9150610313826102d2565b602082019050919050565b60006020820190508181036000830152610337816102fb565b9050919050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006103746014836102c1565b915061037f8261033e565b602082019050919050565b600060208201905081810360008301526103a381610367565b9050919050565b60006040820190506103bf600083018561023b565b6103cc602083018461023b565b939250505056fea2646970667358221220f92f73d2a3284a3c1cca55a0fe6ec1a91b13bec884aecdbcf644cebf2774f32f64736f6c6343000813003300000000000000000000000000000000000000000000000000000000767d1650","id":1,"type":"ONCHAIN_INTERACTION","value":{"_kind":"bigint","value":"1000000000"}},"type":"NETWORK_INTERACTION_REQUEST"} +{"futureId":"LockModule#Lock","networkInteractionId":1,"nonce":3,"transaction":{"fees":{"maxFeePerGas":{"_kind":"bigint","value":"2345885776"},"maxPriorityFeePerGas":{"_kind":"bigint","value":"1000000000"}},"hash":"0x69078d0bcbb25e38654cd5948fd28b9e87a7ad40ba36963c634e833a4390648f"},"type":"TRANSACTION_SEND"} +{"futureId":"LockModule#Lock","hash":"0x69078d0bcbb25e38654cd5948fd28b9e87a7ad40ba36963c634e833a4390648f","networkInteractionId":1,"receipt":{"blockHash":"0x012000c35e3c31a950a51262c63afa0ae81dbf934f0182ea9302322951fc69e3","blockNumber":4,"contractAddress":"0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9","logs":[],"status":"SUCCESS"},"type":"TRANSACTION_CONFIRM"} +{"futureId":"LockModule#Lock","result":{"address":"0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9","type":"SUCCESS"},"type":"DEPLOYMENT_EXECUTION_STATE_COMPLETE"} \ No newline at end of file diff --git a/packages/core/test/status.ts b/packages/core/test/status.ts index 0f98303f9b..0fbc5a2752 100644 --- a/packages/core/test/status.ts +++ b/packages/core/test/status.ts @@ -42,6 +42,61 @@ describe("status", () => { assert.deepEqual(result, expectedResult); }); + it("should return a status result for a successful deployment with external artifacts", async () => { + const expectedResult = { + started: [], + successful: ["LockModule#Basic", "LockModule#Basic2", "LockModule#Lock"], + held: [], + timedOut: [], + failed: [], + chainId: 31337, + contracts: { + "LockModule#Basic": { + id: "LockModule#Basic", + contractName: "Basic", + address: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", + sourceName: "", + abi: [], + }, + "LockModule#Basic2": { + id: "LockModule#Basic2", + contractName: "Basic2", + address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", + sourceName: "", + abi: [], + }, + "LockModule#Lock": { + id: "LockModule#Lock", + contractName: "ArtifactLock", + address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", + sourceName: "contracts/ArtifactLock.sol", + abi: ["test"], + }, + }, + }; + + const fakeArtifact: Artifact = { + abi: ["test"], + contractName: "ArtifactLock", + sourceName: "contracts/ArtifactLock.sol", + bytecode: "", + linkReferences: {}, + }; + + const deploymentDir = path.join( + __dirname, + "mocks", + "status", + "external-artifact" + ); + + const artifactResolver = setupMockArtifactResolver({ Lock: fakeArtifact }); + + const result = await status(deploymentDir, artifactResolver); + + assert.deepEqual(result, expectedResult); + }); + it("should throw an error if the deployment is not initialized", async () => { const artifactResolver = setupMockArtifactResolver(); From b3cb45d44780371ef066b76338d46025eac8d05b Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 15 Dec 2024 05:26:24 -0500 Subject: [PATCH 1291/1302] use deploymentLoader exclusively and deprecate artifactLoader for status --- packages/core/src/status.ts | 21 +--- packages/core/test/status.ts | 232 +++++++++++++++++++++++++++++------ 2 files changed, 197 insertions(+), 56 deletions(-) diff --git a/packages/core/src/status.ts b/packages/core/src/status.ts index a4c18b0cd4..7576dc661f 100644 --- a/packages/core/src/status.ts +++ b/packages/core/src/status.ts @@ -4,21 +4,20 @@ import { ERRORS } from "./internal/errors-list"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; import { findDeployedContracts } from "./internal/views/find-deployed-contracts"; import { findStatus } from "./internal/views/find-status"; -import { Abi, Artifact, ArtifactResolver } from "./types/artifact"; +import { ArtifactResolver } from "./types/artifact"; import { StatusResult } from "./types/status"; /** * Show the status of a deployment. * * @param deploymentDir - the directory of the deployment to get the status of - * @param artifactResolver - the artifact resolver to use when loading artifacts - * for a future + * @param _artifactResolver - DEPRECATED: this parameter is not used and will be removed in the future * * @beta */ export async function status( deploymentDir: string, - artifactResolver: Omit + _artifactResolver?: Omit ): Promise { const deploymentLoader = new FileDeploymentLoader(deploymentDir); @@ -38,19 +37,7 @@ export async function status( for (const [futureId, deployedContract] of Object.entries( deployedContracts )) { - let artifact: Artifact; - - try { - artifact = await artifactResolver.loadArtifact( - deployedContract.contractName - ); - } catch (e) { - if (e instanceof Error && /HH700/g.test(e.message)) { - artifact = await deploymentLoader.loadArtifact(deployedContract.id); - } else { - throw e; - } - } + const artifact = await deploymentLoader.loadArtifact(deployedContract.id); contracts[futureId] = { ...deployedContract, diff --git a/packages/core/test/status.ts b/packages/core/test/status.ts index 0fbc5a2752..1ec15e6144 100644 --- a/packages/core/test/status.ts +++ b/packages/core/test/status.ts @@ -1,9 +1,7 @@ import { assert } from "chai"; import path from "path"; -import { Artifact, status } from "../src"; - -import { setupMockArtifactResolver } from "./helpers"; +import { status } from "../src"; describe("status", () => { it("should return a status result for a successful deployment", async () => { @@ -17,27 +15,81 @@ describe("status", () => { contracts: { "LockModule#Lock": { id: "LockModule#Lock", - contractName: "ArtifactLock", + contractName: "Lock", address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - sourceName: "contracts/ArtifactLock.sol", - abi: ["test"], + sourceName: "contracts/Lock.sol", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_unlockTime", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "when", + type: "uint256", + }, + ], + name: "Withdrawal", + type: "event", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unlockTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], }, }, }; - const fakeArtifact: Artifact = { - abi: ["test"], - contractName: "ArtifactLock", - sourceName: "contracts/ArtifactLock.sol", - bytecode: "", - linkReferences: {}, - }; - const deploymentDir = path.join(__dirname, "mocks", "status", "success"); - const artifactResolver = setupMockArtifactResolver({ Lock: fakeArtifact }); - - const result = await status(deploymentDir, artifactResolver); + const result = await status(deploymentDir); assert.deepEqual(result, expectedResult); }); @@ -55,34 +107,140 @@ describe("status", () => { id: "LockModule#Basic", contractName: "Basic", address: "0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0", - sourceName: "", - abi: [], + sourceName: "contracts/Basic.sol", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "a", + type: "uint256", + }, + { + internalType: "uint256", + name: "b", + type: "uint256", + }, + ], + name: "add", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + ], }, "LockModule#Basic2": { id: "LockModule#Basic2", - contractName: "Basic2", + contractName: "Basic", address: "0x5FbDB2315678afecb367f032d93F642f64180aa3", - sourceName: "", - abi: [], + sourceName: "contracts/Basic.sol", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "a", + type: "uint256", + }, + { + internalType: "uint256", + name: "b", + type: "uint256", + }, + ], + name: "add", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "pure", + type: "function", + }, + ], }, "LockModule#Lock": { id: "LockModule#Lock", - contractName: "ArtifactLock", + contractName: "Lock", address: "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9", - sourceName: "contracts/ArtifactLock.sol", - abi: ["test"], + sourceName: "contracts/Lock.sol", + abi: [ + { + inputs: [ + { + internalType: "uint256", + name: "_unlockTime", + type: "uint256", + }, + ], + stateMutability: "payable", + type: "constructor", + }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "uint256", + name: "amount", + type: "uint256", + }, + { + indexed: false, + internalType: "uint256", + name: "when", + type: "uint256", + }, + ], + name: "Withdrawal", + type: "event", + }, + { + inputs: [], + name: "owner", + outputs: [ + { + internalType: "address payable", + name: "", + type: "address", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "unlockTime", + outputs: [ + { + internalType: "uint256", + name: "", + type: "uint256", + }, + ], + stateMutability: "view", + type: "function", + }, + { + inputs: [], + name: "withdraw", + outputs: [], + stateMutability: "nonpayable", + type: "function", + }, + ], }, }, }; - const fakeArtifact: Artifact = { - abi: ["test"], - contractName: "ArtifactLock", - sourceName: "contracts/ArtifactLock.sol", - bytecode: "", - linkReferences: {}, - }; - const deploymentDir = path.join( __dirname, "mocks", @@ -90,18 +248,14 @@ describe("status", () => { "external-artifact" ); - const artifactResolver = setupMockArtifactResolver({ Lock: fakeArtifact }); - - const result = await status(deploymentDir, artifactResolver); + const result = await status(deploymentDir); assert.deepEqual(result, expectedResult); }); it("should throw an error if the deployment is not initialized", async () => { - const artifactResolver = setupMockArtifactResolver(); - await assert.isRejected( - status("fake", artifactResolver), + status("fake"), /IGN800: Cannot get status for nonexistant deployment at fake/ ); }); From c9a7850636fd3aefee0460d60a851d5502f3a3fa Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 27 Nov 2024 03:03:54 -0500 Subject: [PATCH 1292/1302] enable ignition UI for deployments via hardhat scripts --- packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts | 4 ++++ packages/hardhat-plugin-viem/src/viem-ignition-helper.ts | 4 ++++ packages/hardhat-plugin/src/helpers.ts | 1 + 3 files changed, 9 insertions(+) diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index 944ee05be0..d3ed5d4f1b 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -1,5 +1,6 @@ import { HardhatArtifactResolver, + PrettyEventHandler, errorDeploymentResultToExceptionMessage, resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; @@ -134,10 +135,13 @@ export class EthersIgnitionHelper { deploymentId ); + const executionEventListener = new PrettyEventHandler(); + const result = await deploy({ config: resolvedConfig, provider: this._provider, deploymentDir, + executionEventListener, artifactResolver, ignitionModule, deploymentParameters: parameters, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 52c492aa14..89950f97f6 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -2,6 +2,7 @@ import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types" import { HardhatArtifactResolver, + PrettyEventHandler, errorDeploymentResultToExceptionMessage, resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; @@ -124,10 +125,13 @@ export class ViemIgnitionHelper { deploymentId ); + const executionEventListener = new PrettyEventHandler(); + const result = await deploy({ config: resolvedConfig, provider: this._provider, deploymentDir, + executionEventListener, artifactResolver, ignitionModule, deploymentParameters: parameters, diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts index 459acc79e5..019c0e688a 100644 --- a/packages/hardhat-plugin/src/helpers.ts +++ b/packages/hardhat-plugin/src/helpers.ts @@ -1,3 +1,4 @@ export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; export { resolveDeploymentId } from "./utils/resolve-deployment-id"; +export { PrettyEventHandler } from "./ui/pretty-event-handler"; From fd6e60dc0bcac208b61605fcd56972d85cdfc807 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 15 Dec 2024 05:57:11 -0500 Subject: [PATCH 1293/1302] add flag to toggle UI on for scripts --- .../hardhat-plugin-ethers/src/ethers-ignition-helper.ts | 7 ++++++- packages/hardhat-plugin-viem/src/viem-ignition-helper.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index d3ed5d4f1b..fef38dfc29 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -79,6 +79,7 @@ export class EthersIgnitionHelper { strategy, strategyConfig, deploymentId: givenDeploymentId = undefined, + displayUi = false, }: { parameters?: DeploymentParameters; config?: Partial; @@ -86,6 +87,7 @@ export class EthersIgnitionHelper { strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; deploymentId?: string; + displayUi?: boolean; } = { parameters: {}, config: {}, @@ -93,6 +95,7 @@ export class EthersIgnitionHelper { strategy: undefined, strategyConfig: undefined, deploymentId: undefined, + displayUi: undefined, } ): Promise< IgnitionModuleResultsTToEthersContracts< @@ -135,7 +138,9 @@ export class EthersIgnitionHelper { deploymentId ); - const executionEventListener = new PrettyEventHandler(); + const executionEventListener = displayUi + ? new PrettyEventHandler() + : undefined; const result = await deploy({ config: resolvedConfig, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 89950f97f6..2392433811 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -72,6 +72,7 @@ export class ViemIgnitionHelper { strategy, strategyConfig, deploymentId: givenDeploymentId = undefined, + displayUi = false, }: { parameters?: DeploymentParameters; config?: Partial; @@ -79,6 +80,7 @@ export class ViemIgnitionHelper { strategy?: StrategyT; strategyConfig?: StrategyConfig[StrategyT]; deploymentId?: string; + displayUi?: boolean; } = { parameters: {}, config: {}, @@ -86,6 +88,7 @@ export class ViemIgnitionHelper { strategy: undefined, strategyConfig: undefined, deploymentId: undefined, + displayUi: undefined, } ): Promise< IgnitionModuleResultsToViemContracts @@ -125,7 +128,9 @@ export class ViemIgnitionHelper { deploymentId ); - const executionEventListener = new PrettyEventHandler(); + const executionEventListener = displayUi + ? new PrettyEventHandler() + : undefined; const result = await deploy({ config: resolvedConfig, From 19b4da1014426d42b8f2dddccd0023d129bc27d1 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Sun, 15 Dec 2024 07:04:59 -0500 Subject: [PATCH 1294/1302] add link to transactions list output --- packages/core/src/list-transactions.ts | 8 +++++++ packages/core/src/types/list-transactions.ts | 1 + packages/core/test/list-transactions.ts | 6 ++++++ packages/hardhat-plugin/src/index.ts | 7 ++++++- .../hardhat-plugin/src/type-extensions.ts | 4 ++++ .../calculate-list-transactions-display.ts | 21 +++++++++++++++++-- 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/packages/core/src/list-transactions.ts b/packages/core/src/list-transactions.ts index 74b39154b5..1e763868e6 100644 --- a/packages/core/src/list-transactions.ts +++ b/packages/core/src/list-transactions.ts @@ -3,6 +3,7 @@ import type { ArtifactResolver } from "./types/artifact"; import findLastIndex from "lodash/findLastIndex"; import { IgnitionError } from "./errors"; +import { builtinChains } from "./internal/chain-config"; import { FileDeploymentLoader } from "./internal/deployment-loader/file-deployment-loader"; import { ERRORS } from "./internal/errors-list"; import { loadDeploymentState } from "./internal/execution/deployment-state-helpers"; @@ -50,6 +51,10 @@ export async function listTransactions( const transactions: ListTransactionsResult = []; + const browserUrl = builtinChains.find( + ({ chainId }) => chainId === deploymentState.chainId + ); + for await (const message of deploymentLoader.readFromJournal()) { if (message.type !== JournalMessageType.TRANSACTION_SEND) { continue; @@ -97,6 +102,7 @@ export async function listTransactions( : undefined, params: exState.constructorArgs, value: networkInteraction.value, + browserUrl: browserUrl?.urls.browserURL, }); break; @@ -118,6 +124,7 @@ export async function listTransactions( to: networkInteraction.to, params: exState.args, value: networkInteraction.value, + browserUrl: browserUrl?.urls.browserURL, }); break; @@ -133,6 +140,7 @@ export async function listTransactions( ), to: networkInteraction.to, value: networkInteraction.value, + browserUrl: browserUrl?.urls.browserURL, }); break; diff --git a/packages/core/src/types/list-transactions.ts b/packages/core/src/types/list-transactions.ts index 81aafa37af..d84ad5fbb6 100644 --- a/packages/core/src/types/list-transactions.ts +++ b/packages/core/src/types/list-transactions.ts @@ -27,6 +27,7 @@ export interface TransactionInfo { address?: string; params?: SolidityParameterType[]; value?: bigint; + browserUrl?: string; } /** diff --git a/packages/core/test/list-transactions.ts b/packages/core/test/list-transactions.ts index 796cf06111..4b10f74644 100644 --- a/packages/core/test/list-transactions.ts +++ b/packages/core/test/list-transactions.ts @@ -22,6 +22,7 @@ describe("listTransactions", () => { address: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: ["0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266"], value: 0n, + browserUrl: undefined, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -33,6 +34,7 @@ describe("listTransactions", () => { address: "0x1c947344BA932fC7f3D622600dA0199520A67EFd", params: [], value: 0n, + browserUrl: undefined, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -44,6 +46,7 @@ describe("listTransactions", () => { address: "0xBdAce15b3211019E272418B8014971c1cefbC8f0", params: [], value: 0n, + browserUrl: undefined, }, { type: "CALL_EXECUTION_STATE", @@ -55,6 +58,7 @@ describe("listTransactions", () => { to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", params: [40], value: 0n, + browserUrl: undefined, }, { type: "DEPLOYMENT_EXECUTION_STATE", @@ -66,6 +70,7 @@ describe("listTransactions", () => { address: "0xD369D9aB22D85C2A12bEabc0B581a419789E3755", params: [], value: 0n, + browserUrl: undefined, }, { type: "SEND_DATA_EXECUTION_STATE", @@ -75,6 +80,7 @@ describe("listTransactions", () => { status: TransactionStatus.SUCCESS, to: "0x74e720c9B362ae3A65fF356ad62866511486BBBc", value: 123n, + browserUrl: undefined, }, ]; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index 133df4e0ea..e64ef4cc60 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -58,6 +58,7 @@ extendConfig((config, userConfig) => { maxPriorityFeePerGas: userNetworkConfig.ignition?.maxPriorityFeePerGas, gasPrice: userNetworkConfig.ignition?.gasPrice, disableFeeBumping: userNetworkConfig.ignition?.disableFeeBumping, + explorerUrl: userNetworkConfig.ignition?.explorerUrl, }; }); @@ -717,7 +718,11 @@ ignitionScope } console.log( - calculateListTransactionsDisplay(deploymentId, listTransactionsResult) + calculateListTransactionsDisplay( + deploymentId, + listTransactionsResult, + hre.config.networks[hre.network.name]?.ignition?.explorerUrl + ) ); }); diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-plugin/src/type-extensions.ts index e793532601..3a0c6cda8e 100644 --- a/packages/hardhat-plugin/src/type-extensions.ts +++ b/packages/hardhat-plugin/src/type-extensions.ts @@ -19,6 +19,7 @@ declare module "hardhat/types/config" { maxPriorityFeePerGas?: bigint; gasPrice?: bigint; disableFeeBumping?: boolean; + explorerUrl?: string; }; } @@ -28,6 +29,7 @@ declare module "hardhat/types/config" { maxPriorityFeePerGas?: bigint; gasPrice?: bigint; disableFeeBumping?: boolean; + explorerUrl?: string; }; } @@ -37,6 +39,7 @@ declare module "hardhat/types/config" { maxPriorityFeePerGas?: bigint; gasPrice?: bigint; disableFeeBumping?: boolean; + explorerUrl?: string; }; } @@ -46,6 +49,7 @@ declare module "hardhat/types/config" { maxPriorityFeePerGas?: bigint; gasPrice?: bigint; disableFeeBumping?: boolean; + explorerUrl?: string; }; } diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts index 78b6bb717f..4bb9c839d2 100644 --- a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts +++ b/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts @@ -4,12 +4,18 @@ import { stringify } from "json5"; export function calculateListTransactionsDisplay( deploymentId: string, - listTransactionsResult: ListTransactionsResult + listTransactionsResult: ListTransactionsResult, + configUrl?: string ): string { let text = `Logging transactions for deployment ${deploymentId}\n\n`; for (const [index, transaction] of listTransactionsResult.entries()) { - text += `Transaction ${index + 1}:\n`; + const txLink = getTransactionLink( + transaction.txHash, + configUrl ?? transaction.browserUrl + ); + + text += `Transaction ${index + 1}${txLink === undefined ? "" : txLink}:\n`; text += ` - Type: ${transactionTypeToDisplayType(transaction.type)}\n`; text += ` - Status: ${transaction.status}\n`; text += ` - TxHash: ${transaction.txHash}\n`; @@ -70,3 +76,14 @@ export function transactionDisplaySerializeReplacer( return value; } + +function getTransactionLink( + txHash: string, + browserURL?: string +): string | undefined { + if (browserURL === undefined) { + return undefined; + } + + return `\x1b]8;;${browserURL}/tx/${txHash}\x1b\\ (🔗 view on block explorer)\x1b]8;;\x1b\\`; +} From a87c4e7241aa702a4ed3533976dedb210d8585dd Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Mon, 16 Dec 2024 22:56:11 -0500 Subject: [PATCH 1295/1302] allow importing module parameters with filepath in scripts --- .../src/ethers-ignition-helper.ts | 13 ++++++- .../src/viem-ignition-helper.ts | 13 ++++++- packages/hardhat-plugin/src/helpers.ts | 1 + packages/hardhat-plugin/src/index.ts | 38 ++----------------- .../src/utils/read-deployment-parameters.ts | 30 +++++++++++++++ 5 files changed, 57 insertions(+), 38 deletions(-) create mode 100644 packages/hardhat-plugin/src/utils/read-deployment-parameters.ts diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts index fef38dfc29..20a2894866 100644 --- a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts +++ b/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts @@ -2,6 +2,7 @@ import { HardhatArtifactResolver, PrettyEventHandler, errorDeploymentResultToExceptionMessage, + readDeploymentParameters, resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; import { @@ -81,7 +82,7 @@ export class EthersIgnitionHelper { deploymentId: givenDeploymentId = undefined, displayUi = false, }: { - parameters?: DeploymentParameters; + parameters?: DeploymentParameters | string; config?: Partial; defaultSender?: string; strategy?: StrategyT; @@ -142,6 +143,14 @@ export class EthersIgnitionHelper { ? new PrettyEventHandler() : undefined; + let deploymentParameters: DeploymentParameters; + + if (typeof parameters === "string") { + deploymentParameters = await readDeploymentParameters(parameters); + } else { + deploymentParameters = parameters; + } + const result = await deploy({ config: resolvedConfig, provider: this._provider, @@ -149,7 +158,7 @@ export class EthersIgnitionHelper { executionEventListener, artifactResolver, ignitionModule, - deploymentParameters: parameters, + deploymentParameters, accounts, defaultSender, strategy, diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts index 2392433811..8de14c443b 100644 --- a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts +++ b/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts @@ -4,6 +4,7 @@ import { HardhatArtifactResolver, PrettyEventHandler, errorDeploymentResultToExceptionMessage, + readDeploymentParameters, resolveDeploymentId, } from "@nomicfoundation/hardhat-ignition/helpers"; import { @@ -74,7 +75,7 @@ export class ViemIgnitionHelper { deploymentId: givenDeploymentId = undefined, displayUi = false, }: { - parameters?: DeploymentParameters; + parameters?: DeploymentParameters | string; config?: Partial; defaultSender?: string; strategy?: StrategyT; @@ -132,6 +133,14 @@ export class ViemIgnitionHelper { ? new PrettyEventHandler() : undefined; + let deploymentParameters: DeploymentParameters; + + if (typeof parameters === "string") { + deploymentParameters = await readDeploymentParameters(parameters); + } else { + deploymentParameters = parameters; + } + const result = await deploy({ config: resolvedConfig, provider: this._provider, @@ -139,7 +148,7 @@ export class ViemIgnitionHelper { executionEventListener, artifactResolver, ignitionModule, - deploymentParameters: parameters, + deploymentParameters, accounts, defaultSender, strategy, diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-plugin/src/helpers.ts index 019c0e688a..aa85a0adc8 100644 --- a/packages/hardhat-plugin/src/helpers.ts +++ b/packages/hardhat-plugin/src/helpers.ts @@ -2,3 +2,4 @@ export { HardhatArtifactResolver } from "./hardhat-artifact-resolver"; export { errorDeploymentResultToExceptionMessage } from "./utils/error-deployment-result-to-exception-message"; export { resolveDeploymentId } from "./utils/resolve-deployment-id"; export { PrettyEventHandler } from "./ui/pretty-event-handler"; +export { readDeploymentParameters } from "./utils/read-deployment-parameters"; diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-plugin/src/index.ts index e64ef4cc60..b5fe778a75 100644 --- a/packages/hardhat-plugin/src/index.ts +++ b/packages/hardhat-plugin/src/index.ts @@ -7,14 +7,7 @@ import { StatusResult, } from "@nomicfoundation/ignition-core"; import debug from "debug"; -import { - ensureDir, - pathExists, - readFile, - readdirSync, - rm, - writeJSON, -} from "fs-extra"; +import { ensureDir, pathExists, readdirSync, rm, writeJSON } from "fs-extra"; import { extendConfig, extendEnvironment, scope } from "hardhat/config"; import { NomicLabsHardhatPluginError } from "hardhat/plugins"; import { parse as json5Parse } from "json5"; @@ -24,6 +17,7 @@ import "./type-extensions"; import { calculateDeploymentStatusDisplay } from "./ui/helpers/calculate-deployment-status-display"; import { bigintReviver } from "./utils/bigintReviver"; import { getApiKeyAndUrls } from "./utils/getApiKeyAndUrls"; +import { readDeploymentParameters } from "./utils/read-deployment-parameters"; import { resolveDeploymentId } from "./utils/resolve-deployment-id"; import { shouldBeHardhatPluginError } from "./utils/shouldBeHardhatPluginError"; import { verifyEtherscanContract } from "./utils/verifyEtherscanContract"; @@ -734,7 +728,7 @@ async function resolveParametersFromModuleName( const configFilename = `${moduleName}.config.json`; return files.includes(configFilename) - ? resolveConfigPath(path.resolve(ignitionPath, configFilename)) + ? readDeploymentParameters(path.resolve(ignitionPath, configFilename)) : undefined; } @@ -743,31 +737,7 @@ async function resolveParametersFromFileName( ): Promise { const filepath = path.resolve(process.cwd(), fileName); - return resolveConfigPath(filepath); -} - -async function resolveConfigPath( - filepath: string -): Promise { - try { - const rawFile = await readFile(filepath); - - return await json5Parse(rawFile.toString(), bigintReviver); - } catch (e) { - if (e instanceof NomicLabsHardhatPluginError) { - throw e; - } - - if (e instanceof Error) { - throw new NomicLabsHardhatPluginError( - "@nomicfoundation/hardhat-ignition", - `Could not parse parameters from ${filepath}`, - e - ); - } - - throw e; - } + return readDeploymentParameters(filepath); } function resolveParametersString(paramString: string): DeploymentParameters { diff --git a/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts b/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts new file mode 100644 index 0000000000..fb6bee8cd6 --- /dev/null +++ b/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts @@ -0,0 +1,30 @@ +import { DeploymentParameters } from "@nomicfoundation/ignition-core"; +import { readFile } from "fs-extra"; +import { NomicLabsHardhatPluginError } from "hardhat/plugins"; +import { parse as json5Parse } from "json5"; + +import { bigintReviver } from "./bigintReviver"; + +export async function readDeploymentParameters( + filepath: string +): Promise { + try { + const rawFile = await readFile(filepath); + + return await json5Parse(rawFile.toString(), bigintReviver); + } catch (e) { + if (e instanceof NomicLabsHardhatPluginError) { + throw e; + } + + if (e instanceof Error) { + throw new NomicLabsHardhatPluginError( + "@nomicfoundation/hardhat-ignition", + `Could not parse parameters from ${filepath}`, + e + ); + } + + throw e; + } +} From c041b33f1ecf84fbde8f59d1821ebb7f46565a97 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 18 Dec 2024 05:47:58 -0500 Subject: [PATCH 1296/1302] chore: bump version to v0.15.9 Update the packages versions and changelogs for the `0.15.9 - 2024-12-18` release. --- packages/core/CHANGELOG.md | 14 ++++++++++++++ packages/core/package.json | 2 +- packages/hardhat-plugin-ethers/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin-ethers/package.json | 2 +- packages/hardhat-plugin-viem/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin-viem/package.json | 2 +- packages/hardhat-plugin/CHANGELOG.md | 14 ++++++++++++++ packages/hardhat-plugin/package.json | 2 +- packages/ui/CHANGELOG.md | 14 ++++++++++++++ packages/ui/package.json | 2 +- 10 files changed, 75 insertions(+), 5 deletions(-) diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 8538d1f3e9..b3a9c9f206 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + ## 0.15.8 - 2024-11-22 ### Fixed diff --git a/packages/core/package.json b/packages/core/package.json index 84f89d174c..ad3129354f 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-core", - "version": "0.15.8", + "version": "0.15.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-plugin-ethers/CHANGELOG.md index f52c0beb89..dd4c2551f5 100644 --- a/packages/hardhat-plugin-ethers/CHANGELOG.md +++ b/packages/hardhat-plugin-ethers/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + ## 0.15.8 - 2024-11-22 ### Fixed diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-plugin-ethers/package.json index 3f6aa0980b..d594a7baa3 100644 --- a/packages/hardhat-plugin-ethers/package.json +++ b/packages/hardhat-plugin-ethers/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-ethers", - "version": "0.15.8", + "version": "0.15.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-plugin-viem/CHANGELOG.md index 877d637f33..43e98e0b4e 100644 --- a/packages/hardhat-plugin-viem/CHANGELOG.md +++ b/packages/hardhat-plugin-viem/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + ## 0.15.8 - 2024-11-22 ### Fixed diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-plugin-viem/package.json index ac13da444d..2ff43ad32e 100644 --- a/packages/hardhat-plugin-viem/package.json +++ b/packages/hardhat-plugin-viem/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition-viem", - "version": "0.15.8", + "version": "0.15.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-plugin/CHANGELOG.md index 8ef9618be4..2158b9f8ec 100644 --- a/packages/hardhat-plugin/CHANGELOG.md +++ b/packages/hardhat-plugin/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + ## 0.15.8 - 2024-11-22 ### Fixed diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-plugin/package.json index 3456085101..e9cc0760fd 100644 --- a/packages/hardhat-plugin/package.json +++ b/packages/hardhat-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/hardhat-ignition", - "version": "0.15.8", + "version": "0.15.9", "license": "MIT", "author": "Nomic Foundation", "homepage": "https://hardhat.org", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 2a270bec08..dae700c1c9 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 0.15.9 - 2024-12-18 + +### Added + +- Standard Ignition UI can now be enabled when deploying via Hardhat scripts by setting `displayUi: true` in the `deploy` function options, @zoeyTM ([#843](https://github.com/NomicFoundation/hardhat-ignition/pull/843)) +- Ignition modules can now be set as a dependency in the `after` option of futures, @zoeyTM ([#828](https://github.com/NomicFoundation/hardhat-ignition/pull/828)) +- The `ignition transactions` command output will now include a link to view each transaction on the configured block explorer, @zoeyTM ([#849](https://github.com/NomicFoundation/hardhat-ignition/pull/849)) +- Module parameters can now be directly imported from a JSON file when deploying via Hardhat scripts by passing an absolute path to the file to the `parameters` option, @zoeyTM ([#850](https://github.com/NomicFoundation/hardhat-ignition/pull/850)) + +### Fixed + +- Properly handle errors when verifying deployments that use external artifacts, @zoeyTM ([#848](https://github.com/NomicFoundation/hardhat-ignition/pull/848)) +- Fix issue with `ignition status` command not working with deployments that use external artifacts, @zoeyTM ([#846](https://github.com/NomicFoundation/hardhat-ignition/pull/846)) + ## 0.15.8 - 2024-11-22 ### Fixed diff --git a/packages/ui/package.json b/packages/ui/package.json index 0f335ae3d3..0677f0515a 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@nomicfoundation/ignition-ui", - "version": "0.15.8", + "version": "0.15.9", "type": "module", "scripts": { "predev": "pnpm regenerate-deployment-example", From 08191d3d99972cb93c2f75ff05449b53bd5b57cf Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 19 Dec 2024 06:23:06 -0500 Subject: [PATCH 1297/1302] migrated ignition repo --- .../.devcontainer}/devcontainer.json | 0 .../hardhat-ignition/.editorconfig | 0 .../hardhat-ignition/.gitattributes | 0 .../.github}/ISSUE_TEMPLATE/bug-report.yml | 0 .../.github}/ISSUE_TEMPLATE/config.yml | 0 .../.github}/ISSUE_TEMPLATE/feature-request.yml | 0 .../.github}/ISSUE_TEMPLATE/other-issue.md | 0 .../hardhat-ignition/.github}/workflows/ci.yml | 0 .../review-requested-slack-notification.yml | 0 .../review-submitted-slack-notification.yml | 0 .gitignore => packages/hardhat-ignition/.gitignore | 0 .../hardhat-ignition/.prettierrc | 0 .../hardhat-ignition/.vscode}/launch.json | 0 .../hardhat-ignition/.vscode}/tasks.json | 0 .../hardhat-ignition/CONTRIBUTING.md | 0 LICENSE => packages/hardhat-ignition/LICENSE | 0 README.md => packages/hardhat-ignition/README.md | 0 .../hardhat-ignition/config}/eslint/eslintrc.js | 0 .../config}/typescript/tsconfig.json | 0 .../hardhat-ignition/examples}/.gitignore | 0 .../examples}/complete/.eslintrc.js | 0 .../hardhat-ignition/examples}/complete/.gitignore | 0 .../examples}/complete/.prettierignore | 0 .../hardhat-ignition/examples}/complete/README.md | 0 .../examples}/complete/contracts/BasicContract.sol | 0 .../examples}/complete/contracts/BasicLibrary.sol | 0 .../complete/contracts/ContractWithLibrary.sol | 0 .../examples}/complete/hardhat.config.js | 0 .../complete/ignition/modules/CompleteModule.js | 0 .../complete/libArtifacts/BasicLibrary.json | 0 .../complete/libArtifacts/ContractWithLibrary.json | 0 .../examples}/complete/package.json | 0 .../examples}/complete/test/Complete.js | 0 .../hardhat-ignition/examples}/ens/.eslintrc.js | 0 .../hardhat-ignition/examples}/ens/.gitignore | 0 .../hardhat-ignition/examples}/ens/.prettierignore | 0 .../hardhat-ignition/examples}/ens/README.md | 0 .../examples}/ens/contracts/ENS.sol | 0 .../examples}/ens/contracts/ReverseRegistrar.sol | 0 .../examples}/ens/hardhat.config.js | 0 .../examples}/ens/ignition/modules/ENS.js | 0 .../ens/ignition/modules/test-registrar.js | 0 .../hardhat-ignition/examples}/ens/package.json | 0 .../examples}/ens/scripts/deploy-ens.js | 0 .../examples}/ens/test/sample-test.js | 0 .../examples}/fee-tester/.eslintrc.js | 0 .../examples}/fee-tester/.gitignore | 0 .../examples}/fee-tester/.prettierignore | 0 .../hardhat-ignition/examples}/fee-tester/README.md | 0 .../examples}/fee-tester/contracts/FeeTester.sol | 0 .../examples}/fee-tester/hardhat.config.js | 0 .../fee-tester/ignition/modules/FeeTesterModule.js | 0 .../examples}/fee-tester/package.json | 0 .../hardhat-ignition/examples}/sample/.eslintrc.js | 0 .../hardhat-ignition/examples}/sample/.gitignore | 0 .../examples}/sample/.prettierignore | 0 .../hardhat-ignition/examples}/sample/README.md | 0 .../examples}/sample/contracts/Lock.sol | 0 .../examples}/sample/hardhat.config.js | 0 .../examples}/sample/ignition/modules/LockModule.js | 0 .../hardhat-ignition/examples}/sample/package.json | 0 .../examples}/sample/scripts/bump.js | 0 .../hardhat-ignition/examples}/sample/test/Lock.js | 0 .../examples}/ts-sample/.eslintrc.js | 0 .../hardhat-ignition/examples}/ts-sample/.gitignore | 0 .../examples}/ts-sample/.prettierignore | 0 .../hardhat-ignition/examples}/ts-sample/README.md | 0 .../examples}/ts-sample/contracts/Lock.sol | 0 .../examples}/ts-sample/hardhat.config.ts | 0 .../ts-sample/ignition/modules/LockModule.ts | 0 .../examples}/ts-sample/package.json | 0 .../examples}/ts-sample/test/Lock.ts | 0 .../examples}/ts-sample/tsconfig.json | 0 .../examples}/upgradeable/.eslintrc.js | 0 .../examples}/upgradeable/.gitignore | 0 .../examples}/upgradeable/.prettierignore | 0 .../examples}/upgradeable/README.md | 0 .../examples}/upgradeable/contracts/Demo.sol | 0 .../examples}/upgradeable/contracts/DemoV2.sol | 0 .../examples}/upgradeable/contracts/Proxies.sol | 0 .../examples}/upgradeable/hardhat.config.js | 0 .../upgradeable/ignition/modules/ProxyModule.js | 0 .../upgradeable/ignition/modules/UpgradeModule.js | 0 .../examples}/upgradeable/package.json | 0 .../examples}/upgradeable/test/ProxyDemo.js | 0 .../examples}/viem-sample/.eslintrc.js | 0 .../examples}/viem-sample/.gitignore | 0 .../examples}/viem-sample/.prettierignore | 0 .../examples}/viem-sample/README.md | 0 .../examples}/viem-sample/contracts/Lock.sol | 0 .../examples}/viem-sample/hardhat.config.ts | 0 .../viem-sample/ignition/modules/LockModule.ts | 0 .../examples}/viem-sample/package.json | 0 .../examples}/viem-sample/test/Lock.ts | 0 .../examples}/viem-sample/tsconfig.json | 0 .../hardhat-ignition/package.json | 0 .../packages}/core/.eslintrc.js | 0 .../{ => hardhat-ignition/packages}/core/.gitignore | 0 .../packages}/core/.mocharc.json | 0 .../{ => hardhat-ignition/packages}/core/.npmignore | 0 .../{ => hardhat-ignition/packages}/core/.nycrc | 0 .../packages}/core/.prettierignore | 0 .../packages}/core/.prettierrc | 0 .../packages}/core/CHANGELOG.md | 0 .../{ => hardhat-ignition/packages}/core/README.md | 0 .../packages}/core/api-extractor.json | 0 .../packages}/core/package.json | 0 .../packages}/core/src/batches.ts | 0 .../packages}/core/src/build-module.ts | 0 .../packages}/core/src/deploy.ts | 0 .../packages}/core/src/errors.ts | 0 .../core/src/ignition-module-serializer.ts | 0 .../packages}/core/src/index.ts | 0 .../packages}/core/src/internal/batcher.ts | 0 .../packages}/core/src/internal/chain-config.ts | 0 .../packages}/core/src/internal/defaultConfig.ts | 0 .../packages}/core/src/internal/deployer.ts | 0 .../ephemeral-deployment-loader.ts | 0 .../deployment-loader/file-deployment-loader.ts | 0 .../core/src/internal/deployment-loader/types.ts | 0 .../packages}/core/src/internal/errors-list.ts | 0 .../packages}/core/src/internal/execution/abi.ts | 0 .../internal/execution/deployment-state-helpers.ts | 0 .../core/src/internal/execution/execution-engine.ts | 0 .../execution/execution-strategy-helpers.ts | 0 .../execution/future-processor/future-processor.ts | 0 .../handlers/monitor-onchain-interaction.ts | 0 .../future-processor/handlers/query-static-call.ts | 0 .../future-processor/handlers/run-strategy.ts | 0 .../future-processor/handlers/send-transaction.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/decode-simulation-result.ts | 0 .../future-processor/helpers/future-resolvers.ts | 0 .../future-processor/helpers/messages-helpers.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../helpers/next-action-for-execution-state.ts | 0 .../future-processor/helpers/replay-strategy.ts | 0 .../helpers/save-artifacts-for-future.ts | 0 .../core/src/internal/execution/jsonrpc-client.ts | 0 .../core/src/internal/execution/libraries.ts | 0 .../get-max-nonce-used-by-sender.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../nonce-management/json-rpc-nonce-manager.ts | 0 .../execution/reducers/deployment-state-reducer.ts | 0 .../execution/reducers/execution-state-reducer.ts | 0 .../reducers/helpers/complete-execution-state.ts | 0 .../reducers/helpers/deployment-state-helpers.ts | 0 .../execution/reducers/helpers/initializers.ts | 0 .../reducers/helpers/network-interaction-helpers.ts | 0 .../internal/execution/strategy/createx-artifact.ts | 0 .../execution/transaction-tracking-timer.ts | 0 .../core/src/internal/execution/type-helpers.ts | 0 .../internal/execution/types/deployment-state.ts | 0 .../src/internal/execution/types/evm-execution.ts | 0 .../internal/execution/types/execution-result.ts | 0 .../src/internal/execution/types/execution-state.ts | 0 .../internal/execution/types/execution-strategy.ts | 0 .../core/src/internal/execution/types/jsonrpc.ts | 0 .../core/src/internal/execution/types/messages.ts | 0 .../internal/execution/types/network-interaction.ts | 0 .../core/src/internal/execution/utils/address.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../internal/execution/utils/get-default-sender.ts | 0 .../packages}/core/src/internal/formatters.ts | 0 .../core/src/internal/journal/file-journal.ts | 0 .../core/src/internal/journal/memory-journal.ts | 0 .../core/src/internal/journal/types/index.ts | 0 .../internal/journal/utils/deserialize-replacer.ts | 0 .../internal/journal/utils/emitExecutionEvent.ts | 0 .../failedEvmExecutionResultToErrorDescription.ts | 0 .../core/src/internal/journal/utils/log.ts | 0 .../internal/journal/utils/serialize-replacer.ts | 0 .../packages}/core/src/internal/module-builder.ts | 0 .../packages}/core/src/internal/module.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../src/internal/reconciliation/helpers/compare.ts | 0 .../reconciliation/helpers/reconcile-address.ts | 0 .../reconciliation/helpers/reconcile-arguments.ts | 0 .../reconciliation/helpers/reconcile-artifacts.ts | 0 .../helpers/reconcile-contract-name.ts | 0 .../reconciliation/helpers/reconcile-contract.ts | 0 .../reconciliation/helpers/reconcile-data.ts | 0 .../reconciliation/helpers/reconcile-from.ts | 0 .../helpers/reconcile-function-name.ts | 0 .../reconciliation/helpers/reconcile-libraries.ts | 0 .../reconciliation/helpers/reconcile-strategy.ts | 0 .../reconciliation/helpers/reconcile-value.ts | 0 .../reconcile-current-and-previous-type-match.ts | 0 .../reconciliation/reconcile-dependency-rules.ts | 0 .../reconcile-future-specific-reconciliations.ts | 0 .../core/src/internal/reconciliation/reconciler.ts | 0 .../core/src/internal/reconciliation/types.ts | 0 .../core/src/internal/reconciliation/utils.ts | 0 .../core/src/internal/topological-order.ts | 0 .../packages}/core/src/internal/utils.ts | 0 .../src/internal/utils/adjacency-list-converter.ts | 0 .../core/src/internal/utils/adjacency-list.ts | 0 .../packages}/core/src/internal/utils/assertions.ts | 0 .../src/internal/utils/check-automined-network.ts | 0 .../core/src/internal/utils/future-id-builders.ts | 0 .../src/internal/utils/get-futures-from-module.ts | 0 .../src/internal/utils/identifier-validators.ts | 0 .../core/src/internal/utils/replace-within-arg.ts | 0 .../src/internal/utils/resolve-module-parameter.ts | 0 .../futures/validateArtifactContractAt.ts | 0 .../futures/validateArtifactContractDeployment.ts | 0 .../futures/validateArtifactLibraryDeployment.ts | 0 .../validation/futures/validateNamedContractAt.ts | 0 .../validation/futures/validateNamedContractCall.ts | 0 .../futures/validateNamedContractDeployment.ts | 0 .../futures/validateNamedEncodeFunctionCall.ts | 0 .../futures/validateNamedLibraryDeployment.ts | 0 .../validation/futures/validateNamedStaticCall.ts | 0 .../validation/futures/validateReadEventArgument.ts | 0 .../internal/validation/futures/validateSendData.ts | 0 .../packages}/core/src/internal/validation/utils.ts | 0 .../core/src/internal/validation/validate.ts | 0 .../execution-state/find-onchain-interaction-by.ts | 0 .../views/execution-state/find-static-call-by.ts | 0 .../views/execution-state/find-transaction-by.ts | 0 .../execution-state/get-pending-nonce-and-sender.ts | 0 .../get-pending-onchain-interaction.ts | 0 .../views/find-address-for-contract-future-by-id.ts | 0 .../find-confirmed-transaction-by-future-id.ts | 0 .../src/internal/views/find-deployed-contracts.ts | 0 .../internal/views/find-execution-state-by-id.ts | 0 .../internal/views/find-execution-states-by-type.ts | 0 .../internal/views/find-result-for-future-by-id.ts | 0 .../core/src/internal/views/find-status.ts | 0 .../src/internal/views/has-execution-succeeded.ts | 0 .../core/src/internal/views/is-batch-finished.ts | 0 .../internal/views/is-execution-state-complete.ts | 0 .../packages}/core/src/internal/wiper.ts | 0 .../packages}/core/src/list-deployments.ts | 0 .../packages}/core/src/list-transactions.ts | 0 .../packages}/core/src/status.ts | 0 .../packages}/core/src/strategies/basic-strategy.ts | 0 .../core/src/strategies/create2-strategy.ts | 0 .../core/src/strategies/resolve-strategy.ts | 0 .../packages}/core/src/type-guards.ts | 0 .../packages}/core/src/types/artifact.ts | 0 .../packages}/core/src/types/deploy.ts | 0 .../packages}/core/src/types/errors.ts | 0 .../packages}/core/src/types/execution-events.ts | 0 .../packages}/core/src/types/list-transactions.ts | 0 .../packages}/core/src/types/module-builder.ts | 0 .../packages}/core/src/types/module.ts | 0 .../packages}/core/src/types/provider.ts | 0 .../packages}/core/src/types/serialization.ts | 0 .../packages}/core/src/types/status.ts | 0 .../packages}/core/src/types/verify.ts | 0 .../packages}/core/src/ui-helpers.ts | 0 .../packages}/core/src/verify.ts | 0 .../packages}/core/src/wipe.ts | 0 .../packages}/core/test-integrations/.eslintrc.js | 0 .../test-integrations/fixture-projects/.gitignore | 0 .../fixture-projects/ci-success/contracts/Lock.sol | 0 .../fixture-projects/ci-success/hardhat.config.js | 0 .../ci-success/ignition/modules/LockModule.js | 0 .../default-with-new-chain-id/contracts/Lock.sol | 0 .../default-with-new-chain-id/hardhat.config.js | 0 .../deployments/chain-1337/deployed_addresses.json | 0 .../ignition/deployments/chain-1337/journal.jsonl | 0 .../ignition/modules/LockModule.js | 0 .../fixture-projects/default/contracts/C.sol | 0 .../fixture-projects/default/contracts/Libs.sol | 0 .../fixture-projects/default/hardhat.config.js | 0 .../dont-throw-on-reverts/hardhat.config.js | 0 .../test-integrations/helpers/hardhat-projects.ts | 0 .../test-integrations/new-api/ci/basic-success.ts | 0 .../internal/new-execution/jsonrpc-client.ts | 0 .../new-api/internal/reconciliation/chainId.ts | 0 .../test-execution-result-fixtures.ts | 0 .../packages}/core/test/.eslintrc.js | 0 .../packages}/core/test/batcher.ts | 0 .../packages}/core/test/build-module.ts | 0 .../packages}/core/test/call.ts | 0 .../packages}/core/test/contract.ts | 0 .../packages}/core/test/contractAt.ts | 0 .../packages}/core/test/contractAtFromArtifact.ts | 0 .../packages}/core/test/contractFromArtifact.ts | 0 .../packages}/core/test/encodeFunctionCall.ts | 0 .../packages}/core/test/execution/abi.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../future-processor/named-contract-at-deploy.ts | 0 .../future-processor/named-contract-deploy.ts | 0 .../core/test/execution/future-processor/utils.ts | 0 .../packages}/core/test/execution/libraries.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../core/test/execution/reducers/running-a-call.ts | 0 .../reducers/running-a-named-contract-deploy.ts | 0 .../reducers/running-a-named-library-deploy.ts | 0 .../execution/reducers/running-a-read-event-arg.ts | 0 .../execution/reducers/running-a-static-call.ts | 0 .../test/execution/reducers/running-contract-at.ts | 0 .../test/execution/reducers/running-send-data.ts | 0 .../core/test/execution/reducers/start-a-new-run.ts | 0 .../packages}/core/test/execution/reducers/utils.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../execution/views/find-result-for-future-by-id.ts | 0 .../packages}/core/test/getAccount.ts | 0 .../packages}/core/test/getParameter.ts | 0 .../packages}/core/test/helpers.ts | 0 .../packages}/core/test/helpers/exact-interface.ts | 0 .../core/test/helpers/execution-result-fixtures.ts | 0 .../core/test/ignition-module-serializer.ts | 0 .../packages}/core/test/library.ts | 0 .../packages}/core/test/libraryFromArtifact.ts | 0 .../packages}/core/test/list-transactions.ts | 0 .../packages}/core/test/listDeployments.ts | 0 .../listDeployments/has-deployments/chain-1/blank | 0 .../listDeployments/has-deployments/chain-2/blank | 0 .../artifacts/CompleteModule#BasicContract.dbg.json | 0 .../artifacts/CompleteModule#BasicContract.json | 0 .../CompleteModule#BasicContract2.dbg.json | 0 .../artifacts/CompleteModule#BasicContract2.json | 0 .../artifacts/CompleteModule#BasicLibrary.dbg.json | 0 .../artifacts/CompleteModule#BasicLibrary.json | 0 .../artifacts/CompleteModule#BasicLibrary2.json | 0 .../CompleteModule#ContractWithLibrary.json | 0 .../CompleteModule#ContractWithLibrary2.json | 0 .../0957b2d8bc1fe22551b79ef37cafc10a.json | 0 .../0fce7e4e9544f4b99b971b3b98da92d2.json | 0 .../success/deployed_addresses.json | 0 .../mocks/listTransactions/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifact/deployed_addresses.json | 0 .../mocks/status/external-artifact/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../status/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/status/success/deployed_addresses.json | 0 .../core/test/mocks/status/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifacts/deployed_addresses.json | 0 .../mocks/verify/external-artifacts/journal.jsonl | 0 .../libraries/artifacts/LockModule#UUUUU.dbg.json | 0 .../libraries/artifacts/LockModule#UUUUU.json | 0 .../libraries/artifacts/LockModule#WAAIT.dbg.json | 0 .../libraries/artifacts/LockModule#WAAIT.json | 0 .../254cc89254e61cb6a9bf2c74f13055f1.json | 0 .../mocks/verify/libraries/deployed_addresses.json | 0 .../core/test/mocks/verify/libraries/journal.jsonl | 0 .../min-input/artifacts/LockModule#TestA.dbg.json | 0 .../min-input/artifacts/LockModule#TestA.json | 0 .../min-input/artifacts/LockModule#TestB.dbg.json | 0 .../min-input/artifacts/LockModule#TestB.json | 0 .../min-input/artifacts/LockModule#TestC.dbg.json | 0 .../min-input/artifacts/LockModule#TestC.json | 0 .../min-input/artifacts/LockModule#TestD.dbg.json | 0 .../min-input/artifacts/LockModule#TestD.json | 0 .../5a5467b3a2cddf6ce0f79584095e02d2.json | 0 .../mocks/verify/min-input/deployed_addresses.json | 0 .../core/test/mocks/verify/min-input/journal.jsonl | 0 .../test/mocks/verify/no-contracts/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../verify/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/verify/success/deployed_addresses.json | 0 .../core/test/mocks/verify/success/journal.jsonl | 0 .../unsupported-chain/deployed_addresses.json | 0 .../mocks/verify/unsupported-chain/journal.jsonl | 0 .../packages}/core/test/readEventArgument.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../packages}/core/test/reconciliation/helpers.ts | 0 .../core/test/reconciliation/reconciler.ts | 0 .../packages}/core/test/send.ts | 0 .../packages}/core/test/setup.ts | 0 .../packages}/core/test/staticCall.ts | 0 .../packages}/core/test/status.ts | 0 .../packages}/core/test/types/deployment-loader.ts | 0 .../packages}/core/test/types/module.ts | 0 .../packages}/core/test/useModule.ts | 0 .../packages}/core/test/utils/adjacency-list.ts | 0 .../core/test/utils/check-automined-network.ts | 0 .../packages}/core/test/utils/future-id-builders.ts | 0 .../packages}/core/test/utils/replace-within-arg.ts | 0 .../packages}/core/test/validations/id-rules.ts | 0 .../core/test/validations/identifier-validators.ts | 0 .../packages}/core/test/verify.ts | 0 .../packages}/core/test/wipe.ts | 0 .../packages}/core/tsconfig.json | 0 .../packages}/hardhat-plugin-ethers/.eslintrc.js | 0 .../packages}/hardhat-plugin-ethers/.gitignore | 0 .../packages}/hardhat-plugin-ethers/.mocharc.json | 0 .../packages}/hardhat-plugin-ethers/.npmignore | 0 .../packages}/hardhat-plugin-ethers/.nycrc | 0 .../packages}/hardhat-plugin-ethers/.prettierignore | 0 .../packages}/hardhat-plugin-ethers/CHANGELOG.md | 0 .../packages}/hardhat-plugin-ethers/README.md | 0 .../packages}/hardhat-plugin-ethers/package.json | 0 .../src/ethers-ignition-helper.ts | 0 .../packages}/hardhat-plugin-ethers/src/index.ts | 0 .../hardhat-plugin-ethers/src/type-extensions.ts | 0 .../hardhat-plugin-ethers/test/.eslintrc.js | 0 .../hardhat-plugin-ethers/test/default-sender.ts | 0 .../test/deploy-with-ethers-result.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Foo.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/FooModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../packages}/hardhat-plugin-ethers/test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../packages}/hardhat-plugin-ethers/tsconfig.json | 0 .../packages}/hardhat-plugin-viem/.eslintrc.js | 0 .../packages}/hardhat-plugin-viem/.gitignore | 0 .../packages}/hardhat-plugin-viem/.mocharc.json | 0 .../packages}/hardhat-plugin-viem/.npmignore | 0 .../packages}/hardhat-plugin-viem/.nycrc | 0 .../packages}/hardhat-plugin-viem/.prettierignore | 0 .../packages}/hardhat-plugin-viem/CHANGELOG.md | 0 .../packages}/hardhat-plugin-viem/README.md | 0 .../packages}/hardhat-plugin-viem/package.json | 0 .../scripts/compile-test-fixture-project.ts | 0 .../ignition-module-results-to-viem-contracts.ts | 0 .../packages}/hardhat-plugin-viem/src/index.ts | 0 .../hardhat-plugin-viem/src/type-extensions.ts | 0 .../hardhat-plugin-viem/src/viem-ignition-helper.ts | 0 .../packages}/hardhat-plugin-viem/test/.eslintrc.js | 0 .../hardhat-plugin-viem/test/default-sender.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Baz.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/BazModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../packages}/hardhat-plugin-viem/test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../hardhat-plugin-viem/test/use-module.ts | 0 .../test/viem-instances/artifact-contract-at.ts | 0 .../viem-instances/artifact-deployment-contract.ts | 0 .../test/viem-instances/named-contract-at.ts | 0 .../viem-instances/named-deployment-contract.ts | 0 .../hardhat-plugin-viem/test/viem-results.ts | 0 .../packages}/hardhat-plugin-viem/tsconfig.json | 0 .../packages}/hardhat-plugin/.eslintrc.js | 0 .../packages}/hardhat-plugin/.gitignore | 0 .../packages}/hardhat-plugin/.mocharc.json | 0 .../packages}/hardhat-plugin/.npmignore | 0 .../packages}/hardhat-plugin/.nycrc | 0 .../packages}/hardhat-plugin/.prettierignore | 0 .../packages}/hardhat-plugin/CHANGELOG.md | 0 .../packages}/hardhat-plugin/README.md | 0 .../packages}/hardhat-plugin/package.json | 0 .../hardhat-plugin/src/hardhat-artifact-resolver.ts | 0 .../packages}/hardhat-plugin/src/helpers.ts | 0 .../packages}/hardhat-plugin/src/index.ts | 0 .../packages}/hardhat-plugin/src/modules.ts | 0 .../packages}/hardhat-plugin/src/type-extensions.ts | 0 .../src/ui/helpers/calculate-batch-display.ts | 0 .../ui/helpers/calculate-deploying-module-panel.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../src/ui/helpers/calculate-starting-message.ts | 0 .../src/ui/helpers/cwd-relative-path.ts | 0 .../src/ui/helpers/was-anything-executed.ts | 0 .../hardhat-plugin/src/ui/pretty-event-handler.ts | 0 .../packages}/hardhat-plugin/src/ui/types.ts | 0 .../hardhat-plugin/src/ui/verbose-event-handler.ts | 0 .../hardhat-plugin/src/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../hardhat-plugin/src/utils/getApiKeyAndUrls.ts | 0 .../hardhat-plugin/src/utils/load-module.ts | 0 .../packages}/hardhat-plugin/src/utils/open.ts | 0 .../src/utils/read-deployment-parameters.ts | 0 .../src/utils/resolve-deployment-id.ts | 0 .../src/utils/shouldBeHardhatPluginError.ts | 0 .../src/utils/verifyEtherscanContract.ts | 0 .../src/visualization/write-visualization.ts | 0 .../packages}/hardhat-plugin/test/.eslintrc.js | 0 .../packages}/hardhat-plugin/test/config.ts | 0 .../hardhat-plugin/test/deploy/default-sender.ts | 0 .../hardhat-plugin/test/deploy/gas-estimation.ts | 0 .../test/deploy/multiple-batch-contract-deploy.ts | 0 .../error-on-pending-user-transactions.ts | 0 ...-rerun-with-replaced-pending-user-transaction.ts | 0 .../nonce-checks/error-on-transaction-dropped.ts | 0 .../nonce-checks/error-on-user-transaction-sent.ts | 0 .../rerun-with-dropped-ignition-transaction.ts | 0 ...rerun-with-now-complete-ignition-transactions.ts | 0 .../rerun-with-pending-ignition-transactions.ts | 0 ...erun-with-replaced-confirmed-user-transaction.ts | 0 .../revert-nonce-on-simulation-error.ts | 0 .../deploy/rerun/rerun-a-deploy-that-timed-out.ts | 0 .../test/deploy/rerun/rerun-after-kill.ts | 0 .../deploy/rerun/rerun-with-new-contract-deploy.ts | 0 .../packages}/hardhat-plugin/test/deploy/reset.ts | 0 .../test/deploy/timeouts/deploy-run-times-out.ts | 0 .../hardhat-plugin/test/deploy/writeLocalhost.ts | 0 .../hardhat-plugin/test/fixture-projects/.gitignore | 0 .../create2-bad-config/contracts/Foo.sol | 0 .../create2-bad-config/hardhat.config.js | 0 .../create2-bad-config/ignition/modules/MyModule.js | 0 .../create2-exists-chain/contracts/Foo.sol | 0 .../create2-exists-chain/contracts/Unpayable.sol | 0 .../create2-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../create2-not-exists-chain/contracts/Foo.sol | 0 .../create2-not-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../test/fixture-projects/lock/contracts/Lock.sol | 0 .../test/fixture-projects/lock/hardhat.config.js | 0 .../fixture-projects/lock/ignition/modules/Lock.ts | 0 .../modules/parameters-bigints-as-strings.json | 0 .../lock/ignition/modules/parameters-json5.json5 | 0 .../lock/ignition/modules/parameters-too-large.json | 0 .../lock/ignition/modules/parameters.json | 0 .../test/fixture-projects/minimal/contracts/Bar.sol | 0 .../minimal/contracts/CaptureArraysContract.sol | 0 .../contracts/CaptureComplexObjectContract.sol | 0 .../minimal/contracts/EventArgValue.sol | 0 .../fixture-projects/minimal/contracts/Factory.sol | 0 .../fixture-projects/minimal/contracts/Fails.sol | 0 .../minimal/contracts/FailureCalls.sol | 0 .../test/fixture-projects/minimal/contracts/Foo.sol | 0 .../fixture-projects/minimal/contracts/Greeter.sol | 0 .../fixture-projects/minimal/contracts/Ownable.sol | 0 .../fixture-projects/minimal/contracts/Owner.sol | 0 .../minimal/contracts/SendDataEmitter.sol | 0 .../minimal/contracts/StaticCallValue.sol | 0 .../fixture-projects/minimal/contracts/Trace.sol | 0 .../minimal/contracts/TupleEmitter.sol | 0 .../minimal/contracts/TupleReturn.sol | 0 .../minimal/contracts/UsesContract.sol | 0 .../minimal/contracts/WithLibrary.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../minimal/ignition/modules/OwnModule.js | 0 .../contracts/Rocket1.sol | 0 .../contracts/Rocket2.sol | 0 .../hardhat.config.js | 0 .../reset-flag/contracts/Contracts.sol | 0 .../fixture-projects/reset-flag/hardhat.config.js | 0 .../reset-flag/ignition/modules/FirstPass.js | 0 .../reset-flag/ignition/modules/SecondPass.js | 0 .../test/fixture-projects/reset-flag/journal.jsonl | 0 .../user-modules/contracts/Contracts.sol | 0 .../user-modules/contracts/WithLibrary.sol | 0 .../fixture-projects/user-modules/hardhat.config.js | 0 .../user-modules/ignition/.testignore | 0 .../user-modules/ignition/modules/TestModule.js | 0 .../verify-no-api-key/hardhat.config.js | 0 .../with-config/contracts/Contracts.sol | 0 .../with-config/contracts/Trace.sol | 0 .../with-config/contracts/WithLibrary.sol | 0 .../fixture-projects/with-config/hardhat.config.js | 0 .../with-config/ignition/modules/MyModule.js | 0 .../with-invalid-config/contracts/Contracts.sol | 0 .../with-invalid-config/contracts/Trace.sol | 0 .../with-invalid-config/contracts/WithLibrary.sol | 0 .../with-invalid-config/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../hardhat-plugin/test/ignition-helper-guard.ts | 0 .../hardhat-plugin/test/module-api/calls.ts | 0 .../hardhat-plugin/test/module-api/contracts.ts | 0 .../hardhat-plugin/test/module-api/events.ts | 0 .../test/module-api/existing-contract.ts | 0 .../test/module-api/fully-qualified-names.ts | 0 .../hardhat-plugin/test/module-api/libraries.ts | 0 .../hardhat-plugin/test/module-api/params.ts | 0 .../hardhat-plugin/test/module-api/static-calls.ts | 0 .../hardhat-plugin/test/module-api/use-module.ts | 0 .../hardhat-plugin/test/module-parameters.ts | 0 .../packages}/hardhat-plugin/test/plan/index.ts | 0 .../packages}/hardhat-plugin/test/setup.ts | 0 .../hardhat-plugin/test/strategies/create2.ts | 0 .../test/strategies/generic-strategy-constraints.ts | 0 .../test/strategies/only-built-in-strategies.ts | 0 .../clear-pending-transactions-from-memory-pool.ts | 0 .../hardhat-plugin/test/test-helpers/createX-tx.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/get-balance-for.ts | 0 .../hardhat-plugin/test/test-helpers/mine-block.ts | 0 .../hardhat-plugin/test/test-helpers/sleep.ts | 0 .../test/test-helpers/test-ignition-helper.ts | 0 .../hardhat-plugin/test/test-helpers/type-helper.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../test/test-helpers/wait-for-pending-txs.ts | 0 .../test/ui/helpers/calculate-batch-display.ts | 0 .../calculate-deploying-module-panel-display.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../test/ui/helpers/calculate-starting-message.ts | 0 .../hardhat-plugin/test/ui/helpers/test-format.ts | 0 .../hardhat-plugin/test/ui/pretty-event-handler.ts | 0 .../hardhat-plugin/test/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../hardhat-plugin/test/utils/load-module.ts | 0 .../test/utils/resolve-deployment-id.ts | 0 .../hardhat-plugin/test/verify/getApiKeyAndUrls.ts | 0 .../packages}/hardhat-plugin/test/verify/index.ts | 0 .../test/verify/verifyEtherscanContract.ts | 0 .../packages}/hardhat-plugin/tsconfig.json | 0 .../packages}/ui/.eslintrc.cjs | 0 .../{ => hardhat-ignition/packages}/ui/.gitignore | 0 .../packages}/ui/.mocharc.json | 0 .../{ => hardhat-ignition/packages}/ui/.npmignore | 0 packages/{ => hardhat-ignition/packages}/ui/.nycrc | 0 .../{ => hardhat-ignition/packages}/ui/CHANGELOG.md | 0 .../{ => hardhat-ignition/packages}/ui/README.md | 0 .../packages}/ui/examples/ComplexModule.js | 0 .../{ => hardhat-ignition/packages}/ui/index.html | 0 .../{ => hardhat-ignition/packages}/ui/package.json | 0 .../packages}/ui/public/.gitkeep | 0 .../ui/scripts/generate-example-deployment-json.js | 0 .../packages}/ui/src/assets/ExternalLinkIcon.tsx | 0 .../packages}/ui/src/assets/TooltipIcon.tsx | 0 .../packages}/ui/src/assets/purple-rocket.png | Bin .../packages}/ui/src/components/mermaid.tsx | 0 .../packages}/ui/src/components/socials/dc-logo.tsx | 0 .../packages}/ui/src/components/socials/gh-logo.tsx | 0 .../packages}/ui/src/components/socials/index.tsx | 0 .../packages}/ui/src/components/socials/tw-logo.tsx | 0 .../{ => hardhat-ignition/packages}/ui/src/main.css | 0 .../{ => hardhat-ignition/packages}/ui/src/main.tsx | 0 .../components/deployment-flow.tsx | 0 .../components/execution-batches.tsx | 0 .../components/future-batch.tsx | 0 .../components/future-header.tsx | 0 .../visualization-overview/components/summary.tsx | 0 .../visualization-overview.tsx | 0 .../packages}/ui/src/queries/futures.ts | 0 .../packages}/ui/src/utils/argumentTypeToString.tsx | 0 .../packages}/ui/src/utils/to-escaped-id.ts | 0 .../packages}/ui/src/utils/to-mermaid.ts | 0 .../packages}/ui/src/vite-env.d.ts | 0 .../packages}/ui/test/to-mermaid.ts | 0 .../packages}/ui/tsconfig.json | 0 .../packages}/ui/tsconfig.node.json | 0 .../packages}/ui/vite.config.ts | 0 .../hardhat-ignition/pnpm-lock.yaml | 0 .../hardhat-ignition/pnpm-workspace.yaml | 0 677 files changed, 0 insertions(+), 0 deletions(-) rename {.devcontainer => packages/hardhat-ignition/.devcontainer}/devcontainer.json (100%) rename .editorconfig => packages/hardhat-ignition/.editorconfig (100%) rename .gitattributes => packages/hardhat-ignition/.gitattributes (100%) rename {.github => packages/hardhat-ignition/.github}/ISSUE_TEMPLATE/bug-report.yml (100%) rename {.github => packages/hardhat-ignition/.github}/ISSUE_TEMPLATE/config.yml (100%) rename {.github => packages/hardhat-ignition/.github}/ISSUE_TEMPLATE/feature-request.yml (100%) rename {.github => packages/hardhat-ignition/.github}/ISSUE_TEMPLATE/other-issue.md (100%) rename {.github => packages/hardhat-ignition/.github}/workflows/ci.yml (100%) rename {.github => packages/hardhat-ignition/.github}/workflows/review-requested-slack-notification.yml (100%) rename {.github => packages/hardhat-ignition/.github}/workflows/review-submitted-slack-notification.yml (100%) rename .gitignore => packages/hardhat-ignition/.gitignore (100%) rename .prettierrc => packages/hardhat-ignition/.prettierrc (100%) rename {.vscode => packages/hardhat-ignition/.vscode}/launch.json (100%) rename {.vscode => packages/hardhat-ignition/.vscode}/tasks.json (100%) rename CONTRIBUTING.md => packages/hardhat-ignition/CONTRIBUTING.md (100%) rename LICENSE => packages/hardhat-ignition/LICENSE (100%) rename README.md => packages/hardhat-ignition/README.md (100%) rename {config => packages/hardhat-ignition/config}/eslint/eslintrc.js (100%) rename {config => packages/hardhat-ignition/config}/typescript/tsconfig.json (100%) rename {examples => packages/hardhat-ignition/examples}/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/complete/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/complete/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/complete/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/complete/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/complete/contracts/BasicContract.sol (100%) rename {examples => packages/hardhat-ignition/examples}/complete/contracts/BasicLibrary.sol (100%) rename {examples => packages/hardhat-ignition/examples}/complete/contracts/ContractWithLibrary.sol (100%) rename {examples => packages/hardhat-ignition/examples}/complete/hardhat.config.js (100%) rename {examples => packages/hardhat-ignition/examples}/complete/ignition/modules/CompleteModule.js (100%) rename {examples => packages/hardhat-ignition/examples}/complete/libArtifacts/BasicLibrary.json (100%) rename {examples => packages/hardhat-ignition/examples}/complete/libArtifacts/ContractWithLibrary.json (100%) rename {examples => packages/hardhat-ignition/examples}/complete/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/complete/test/Complete.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/ens/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/ens/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/ens/contracts/ENS.sol (100%) rename {examples => packages/hardhat-ignition/examples}/ens/contracts/ReverseRegistrar.sol (100%) rename {examples => packages/hardhat-ignition/examples}/ens/hardhat.config.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/ignition/modules/ENS.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/ignition/modules/test-registrar.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/ens/scripts/deploy-ens.js (100%) rename {examples => packages/hardhat-ignition/examples}/ens/test/sample-test.js (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/contracts/FeeTester.sol (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/hardhat.config.js (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/ignition/modules/FeeTesterModule.js (100%) rename {examples => packages/hardhat-ignition/examples}/fee-tester/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/sample/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/sample/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/sample/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/sample/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/sample/contracts/Lock.sol (100%) rename {examples => packages/hardhat-ignition/examples}/sample/hardhat.config.js (100%) rename {examples => packages/hardhat-ignition/examples}/sample/ignition/modules/LockModule.js (100%) rename {examples => packages/hardhat-ignition/examples}/sample/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/sample/scripts/bump.js (100%) rename {examples => packages/hardhat-ignition/examples}/sample/test/Lock.js (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/contracts/Lock.sol (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/hardhat.config.ts (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/ignition/modules/LockModule.ts (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/test/Lock.ts (100%) rename {examples => packages/hardhat-ignition/examples}/ts-sample/tsconfig.json (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/contracts/Demo.sol (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/contracts/DemoV2.sol (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/contracts/Proxies.sol (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/hardhat.config.js (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/ignition/modules/ProxyModule.js (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/ignition/modules/UpgradeModule.js (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/upgradeable/test/ProxyDemo.js (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/.eslintrc.js (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/.gitignore (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/.prettierignore (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/README.md (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/contracts/Lock.sol (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/hardhat.config.ts (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/ignition/modules/LockModule.ts (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/package.json (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/test/Lock.ts (100%) rename {examples => packages/hardhat-ignition/examples}/viem-sample/tsconfig.json (100%) rename package.json => packages/hardhat-ignition/package.json (100%) rename packages/{ => hardhat-ignition/packages}/core/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/core/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/core/.mocharc.json (100%) rename packages/{ => hardhat-ignition/packages}/core/.npmignore (100%) rename packages/{ => hardhat-ignition/packages}/core/.nycrc (100%) rename packages/{ => hardhat-ignition/packages}/core/.prettierignore (100%) rename packages/{ => hardhat-ignition/packages}/core/.prettierrc (100%) rename packages/{ => hardhat-ignition/packages}/core/CHANGELOG.md (100%) rename packages/{ => hardhat-ignition/packages}/core/README.md (100%) rename packages/{ => hardhat-ignition/packages}/core/api-extractor.json (100%) rename packages/{ => hardhat-ignition/packages}/core/package.json (100%) rename packages/{ => hardhat-ignition/packages}/core/src/batches.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/build-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/errors.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/ignition-module-serializer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/batcher.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/chain-config.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/defaultConfig.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/deployer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/deployment-loader/file-deployment-loader.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/deployment-loader/types.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/errors-list.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/abi.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/deployment-state-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/execution-engine.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/execution-strategy-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/future-processor.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/handlers/query-static-call.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/handlers/run-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/handlers/send-transaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/future-resolvers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/messages-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/replay-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/jsonrpc-client.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/libraries.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/deployment-state-reducer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/execution-state-reducer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/helpers/complete-execution-state.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/helpers/initializers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/strategy/createx-artifact.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/transaction-tracking-timer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/type-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/deployment-state.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/evm-execution.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/execution-result.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/execution-state.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/execution-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/jsonrpc.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/messages.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/types/network-interaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/utils/address.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/execution/utils/get-default-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/formatters.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/file-journal.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/memory-journal.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/types/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/utils/deserialize-replacer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/utils/emitExecutionEvent.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/utils/log.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/journal/utils/serialize-replacer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/module-builder.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/compare.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-address.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-arguments.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-data.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-from.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-function-name.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-libraries.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/helpers/reconcile-value.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/reconcile-dependency-rules.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/reconciler.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/types.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/reconciliation/utils.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/topological-order.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/adjacency-list-converter.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/adjacency-list.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/assertions.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/check-automined-network.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/future-id-builders.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/get-futures-from-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/identifier-validators.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/replace-within-arg.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/utils/resolve-module-parameter.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateArtifactContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateArtifactContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedContractCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateNamedStaticCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateReadEventArgument.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/futures/validateSendData.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/utils.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/validation/validate.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/execution-state/find-onchain-interaction-by.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/execution-state/find-static-call-by.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/execution-state/find-transaction-by.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-address-for-contract-future-by-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-confirmed-transaction-by-future-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-deployed-contracts.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-execution-state-by-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-execution-states-by-type.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-result-for-future-by-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/find-status.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/has-execution-succeeded.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/is-batch-finished.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/views/is-execution-state-complete.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/internal/wiper.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/list-deployments.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/list-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/status.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/strategies/basic-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/strategies/create2-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/strategies/resolve-strategy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/type-guards.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/artifact.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/errors.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/execution-events.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/list-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/module-builder.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/provider.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/serialization.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/status.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/types/verify.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/ui-helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/verify.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/src/wipe.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/ci-success/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default/contracts/C.sol (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default/contracts/Libs.sol (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/default/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/helpers/hardhat-projects.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/new-api/ci/basic-success.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/new-api/internal/reconciliation/chainId.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test-integrations/test-execution-result-fixtures.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/core/test/batcher.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/build-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/call.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/contractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/contractAtFromArtifact.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/contractFromArtifact.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/encodeFunctionCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/abi.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/future-processor/named-contract-at-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/future-processor/named-contract-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/future-processor/utils.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/libraries.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-a-call.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-a-named-contract-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-a-named-library-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-a-read-event-arg.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-a-static-call.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-contract-at.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/running-send-data.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/start-a-new-run.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/reducers/utils.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/execution/views/find-result-for-future-by-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/getAccount.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/getParameter.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/helpers/exact-interface.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/helpers/execution-result-fixtures.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/ignition-module-serializer.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/library.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/libraryFromArtifact.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/list-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/listDeployments.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listDeployments/has-deployments/chain-1/blank (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listDeployments/has-deployments/chain-2/blank (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/listTransactions/success/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/external-artifact/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/success/artifacts/LockModule#Lock.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/success/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/status/success/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/external-artifacts/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/libraries/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/min-input/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/no-contracts/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/success/artifacts/LockModule#Lock.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/success/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/success/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/unsupported-chain/deployed_addresses.json (100%) rename packages/{ => hardhat-ignition/packages}/core/test/mocks/verify/unsupported-chain/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/core/test/readEventArgument.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/reconciliation/reconciler.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/send.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/setup.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/staticCall.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/status.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/types/deployment-loader.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/types/module.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/useModule.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/utils/adjacency-list.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/utils/check-automined-network.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/utils/future-id-builders.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/utils/replace-within-arg.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/validations/id-rules.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/validations/identifier-validators.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/verify.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/test/wipe.ts (100%) rename packages/{ => hardhat-ignition/packages}/core/tsconfig.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.mocharc.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.npmignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.nycrc (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/.prettierignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/CHANGELOG.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/README.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/package.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/src/ethers-ignition-helper.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/src/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/src/type-extensions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/default-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/setup.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/strategies/helper-invocation.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-ethers/tsconfig.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.mocharc.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.npmignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.nycrc (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/.prettierignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/CHANGELOG.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/README.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/package.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/src/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/src/type-extensions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/src/viem-ignition-helper.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/default-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/setup.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/strategies/helper-invocation.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/use-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/test/viem-results.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin-viem/tsconfig.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.mocharc.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.npmignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.nycrc (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/.prettierignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/CHANGELOG.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/README.md (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/package.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/hardhat-artifact-resolver.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/helpers.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/modules.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/type-extensions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/helpers/was-anything-executed.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/pretty-event-handler.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/types.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/ui/verbose-event-handler.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/bigintReviver.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/getApiKeyAndUrls.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/load-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/open.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/read-deployment-parameters.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/resolve-deployment-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/utils/verifyEtherscanContract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/src/visualization/write-visualization.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/.eslintrc.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/config.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/default-sender.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/gas-estimation.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/reset.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/deploy/writeLocalhost.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ignition-helper-guard.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/calls.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/contracts.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/events.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/existing-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/fully-qualified-names.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/libraries.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/params.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/static-calls.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-api/use-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/module-parameters.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/plan/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/setup.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/strategies/create2.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/strategies/generic-strategy-constraints.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/strategies/only-built-in-strategies.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/createX-tx.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/get-balance-for.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/mine-block.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/sleep.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/test-ignition-helper.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/type-helper.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/use-ignition-project.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/helpers/test-format.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/ui/pretty-event-handler.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/utils/bigintReviver.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/utils/load-module.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/utils/resolve-deployment-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/verify/getApiKeyAndUrls.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/verify/index.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/test/verify/verifyEtherscanContract.ts (100%) rename packages/{ => hardhat-ignition/packages}/hardhat-plugin/tsconfig.json (100%) rename packages/{ => hardhat-ignition/packages}/ui/.eslintrc.cjs (100%) rename packages/{ => hardhat-ignition/packages}/ui/.gitignore (100%) rename packages/{ => hardhat-ignition/packages}/ui/.mocharc.json (100%) rename packages/{ => hardhat-ignition/packages}/ui/.npmignore (100%) rename packages/{ => hardhat-ignition/packages}/ui/.nycrc (100%) rename packages/{ => hardhat-ignition/packages}/ui/CHANGELOG.md (100%) rename packages/{ => hardhat-ignition/packages}/ui/README.md (100%) rename packages/{ => hardhat-ignition/packages}/ui/examples/ComplexModule.js (100%) rename packages/{ => hardhat-ignition/packages}/ui/index.html (100%) rename packages/{ => hardhat-ignition/packages}/ui/package.json (100%) rename packages/{ => hardhat-ignition/packages}/ui/public/.gitkeep (100%) rename packages/{ => hardhat-ignition/packages}/ui/scripts/generate-example-deployment-json.js (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/assets/ExternalLinkIcon.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/assets/TooltipIcon.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/assets/purple-rocket.png (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/components/mermaid.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/components/socials/dc-logo.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/components/socials/gh-logo.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/components/socials/index.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/components/socials/tw-logo.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/main.css (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/main.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/components/deployment-flow.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/components/execution-batches.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/components/future-batch.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/components/future-header.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/components/summary.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/pages/visualization-overview/visualization-overview.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/queries/futures.ts (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/utils/argumentTypeToString.tsx (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/utils/to-escaped-id.ts (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/utils/to-mermaid.ts (100%) rename packages/{ => hardhat-ignition/packages}/ui/src/vite-env.d.ts (100%) rename packages/{ => hardhat-ignition/packages}/ui/test/to-mermaid.ts (100%) rename packages/{ => hardhat-ignition/packages}/ui/tsconfig.json (100%) rename packages/{ => hardhat-ignition/packages}/ui/tsconfig.node.json (100%) rename packages/{ => hardhat-ignition/packages}/ui/vite.config.ts (100%) rename pnpm-lock.yaml => packages/hardhat-ignition/pnpm-lock.yaml (100%) rename pnpm-workspace.yaml => packages/hardhat-ignition/pnpm-workspace.yaml (100%) diff --git a/.devcontainer/devcontainer.json b/packages/hardhat-ignition/.devcontainer/devcontainer.json similarity index 100% rename from .devcontainer/devcontainer.json rename to packages/hardhat-ignition/.devcontainer/devcontainer.json diff --git a/.editorconfig b/packages/hardhat-ignition/.editorconfig similarity index 100% rename from .editorconfig rename to packages/hardhat-ignition/.editorconfig diff --git a/.gitattributes b/packages/hardhat-ignition/.gitattributes similarity index 100% rename from .gitattributes rename to packages/hardhat-ignition/.gitattributes diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/bug-report.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/bug-report.yml rename to packages/hardhat-ignition/.github/ISSUE_TEMPLATE/bug-report.yml diff --git a/.github/ISSUE_TEMPLATE/config.yml b/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/config.yml rename to packages/hardhat-ignition/.github/ISSUE_TEMPLATE/config.yml diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/feature-request.yml similarity index 100% rename from .github/ISSUE_TEMPLATE/feature-request.yml rename to packages/hardhat-ignition/.github/ISSUE_TEMPLATE/feature-request.yml diff --git a/.github/ISSUE_TEMPLATE/other-issue.md b/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/other-issue.md similarity index 100% rename from .github/ISSUE_TEMPLATE/other-issue.md rename to packages/hardhat-ignition/.github/ISSUE_TEMPLATE/other-issue.md diff --git a/.github/workflows/ci.yml b/packages/hardhat-ignition/.github/workflows/ci.yml similarity index 100% rename from .github/workflows/ci.yml rename to packages/hardhat-ignition/.github/workflows/ci.yml diff --git a/.github/workflows/review-requested-slack-notification.yml b/packages/hardhat-ignition/.github/workflows/review-requested-slack-notification.yml similarity index 100% rename from .github/workflows/review-requested-slack-notification.yml rename to packages/hardhat-ignition/.github/workflows/review-requested-slack-notification.yml diff --git a/.github/workflows/review-submitted-slack-notification.yml b/packages/hardhat-ignition/.github/workflows/review-submitted-slack-notification.yml similarity index 100% rename from .github/workflows/review-submitted-slack-notification.yml rename to packages/hardhat-ignition/.github/workflows/review-submitted-slack-notification.yml diff --git a/.gitignore b/packages/hardhat-ignition/.gitignore similarity index 100% rename from .gitignore rename to packages/hardhat-ignition/.gitignore diff --git a/.prettierrc b/packages/hardhat-ignition/.prettierrc similarity index 100% rename from .prettierrc rename to packages/hardhat-ignition/.prettierrc diff --git a/.vscode/launch.json b/packages/hardhat-ignition/.vscode/launch.json similarity index 100% rename from .vscode/launch.json rename to packages/hardhat-ignition/.vscode/launch.json diff --git a/.vscode/tasks.json b/packages/hardhat-ignition/.vscode/tasks.json similarity index 100% rename from .vscode/tasks.json rename to packages/hardhat-ignition/.vscode/tasks.json diff --git a/CONTRIBUTING.md b/packages/hardhat-ignition/CONTRIBUTING.md similarity index 100% rename from CONTRIBUTING.md rename to packages/hardhat-ignition/CONTRIBUTING.md diff --git a/LICENSE b/packages/hardhat-ignition/LICENSE similarity index 100% rename from LICENSE rename to packages/hardhat-ignition/LICENSE diff --git a/README.md b/packages/hardhat-ignition/README.md similarity index 100% rename from README.md rename to packages/hardhat-ignition/README.md diff --git a/config/eslint/eslintrc.js b/packages/hardhat-ignition/config/eslint/eslintrc.js similarity index 100% rename from config/eslint/eslintrc.js rename to packages/hardhat-ignition/config/eslint/eslintrc.js diff --git a/config/typescript/tsconfig.json b/packages/hardhat-ignition/config/typescript/tsconfig.json similarity index 100% rename from config/typescript/tsconfig.json rename to packages/hardhat-ignition/config/typescript/tsconfig.json diff --git a/examples/.gitignore b/packages/hardhat-ignition/examples/.gitignore similarity index 100% rename from examples/.gitignore rename to packages/hardhat-ignition/examples/.gitignore diff --git a/examples/complete/.eslintrc.js b/packages/hardhat-ignition/examples/complete/.eslintrc.js similarity index 100% rename from examples/complete/.eslintrc.js rename to packages/hardhat-ignition/examples/complete/.eslintrc.js diff --git a/examples/complete/.gitignore b/packages/hardhat-ignition/examples/complete/.gitignore similarity index 100% rename from examples/complete/.gitignore rename to packages/hardhat-ignition/examples/complete/.gitignore diff --git a/examples/complete/.prettierignore b/packages/hardhat-ignition/examples/complete/.prettierignore similarity index 100% rename from examples/complete/.prettierignore rename to packages/hardhat-ignition/examples/complete/.prettierignore diff --git a/examples/complete/README.md b/packages/hardhat-ignition/examples/complete/README.md similarity index 100% rename from examples/complete/README.md rename to packages/hardhat-ignition/examples/complete/README.md diff --git a/examples/complete/contracts/BasicContract.sol b/packages/hardhat-ignition/examples/complete/contracts/BasicContract.sol similarity index 100% rename from examples/complete/contracts/BasicContract.sol rename to packages/hardhat-ignition/examples/complete/contracts/BasicContract.sol diff --git a/examples/complete/contracts/BasicLibrary.sol b/packages/hardhat-ignition/examples/complete/contracts/BasicLibrary.sol similarity index 100% rename from examples/complete/contracts/BasicLibrary.sol rename to packages/hardhat-ignition/examples/complete/contracts/BasicLibrary.sol diff --git a/examples/complete/contracts/ContractWithLibrary.sol b/packages/hardhat-ignition/examples/complete/contracts/ContractWithLibrary.sol similarity index 100% rename from examples/complete/contracts/ContractWithLibrary.sol rename to packages/hardhat-ignition/examples/complete/contracts/ContractWithLibrary.sol diff --git a/examples/complete/hardhat.config.js b/packages/hardhat-ignition/examples/complete/hardhat.config.js similarity index 100% rename from examples/complete/hardhat.config.js rename to packages/hardhat-ignition/examples/complete/hardhat.config.js diff --git a/examples/complete/ignition/modules/CompleteModule.js b/packages/hardhat-ignition/examples/complete/ignition/modules/CompleteModule.js similarity index 100% rename from examples/complete/ignition/modules/CompleteModule.js rename to packages/hardhat-ignition/examples/complete/ignition/modules/CompleteModule.js diff --git a/examples/complete/libArtifacts/BasicLibrary.json b/packages/hardhat-ignition/examples/complete/libArtifacts/BasicLibrary.json similarity index 100% rename from examples/complete/libArtifacts/BasicLibrary.json rename to packages/hardhat-ignition/examples/complete/libArtifacts/BasicLibrary.json diff --git a/examples/complete/libArtifacts/ContractWithLibrary.json b/packages/hardhat-ignition/examples/complete/libArtifacts/ContractWithLibrary.json similarity index 100% rename from examples/complete/libArtifacts/ContractWithLibrary.json rename to packages/hardhat-ignition/examples/complete/libArtifacts/ContractWithLibrary.json diff --git a/examples/complete/package.json b/packages/hardhat-ignition/examples/complete/package.json similarity index 100% rename from examples/complete/package.json rename to packages/hardhat-ignition/examples/complete/package.json diff --git a/examples/complete/test/Complete.js b/packages/hardhat-ignition/examples/complete/test/Complete.js similarity index 100% rename from examples/complete/test/Complete.js rename to packages/hardhat-ignition/examples/complete/test/Complete.js diff --git a/examples/ens/.eslintrc.js b/packages/hardhat-ignition/examples/ens/.eslintrc.js similarity index 100% rename from examples/ens/.eslintrc.js rename to packages/hardhat-ignition/examples/ens/.eslintrc.js diff --git a/examples/ens/.gitignore b/packages/hardhat-ignition/examples/ens/.gitignore similarity index 100% rename from examples/ens/.gitignore rename to packages/hardhat-ignition/examples/ens/.gitignore diff --git a/examples/ens/.prettierignore b/packages/hardhat-ignition/examples/ens/.prettierignore similarity index 100% rename from examples/ens/.prettierignore rename to packages/hardhat-ignition/examples/ens/.prettierignore diff --git a/examples/ens/README.md b/packages/hardhat-ignition/examples/ens/README.md similarity index 100% rename from examples/ens/README.md rename to packages/hardhat-ignition/examples/ens/README.md diff --git a/examples/ens/contracts/ENS.sol b/packages/hardhat-ignition/examples/ens/contracts/ENS.sol similarity index 100% rename from examples/ens/contracts/ENS.sol rename to packages/hardhat-ignition/examples/ens/contracts/ENS.sol diff --git a/examples/ens/contracts/ReverseRegistrar.sol b/packages/hardhat-ignition/examples/ens/contracts/ReverseRegistrar.sol similarity index 100% rename from examples/ens/contracts/ReverseRegistrar.sol rename to packages/hardhat-ignition/examples/ens/contracts/ReverseRegistrar.sol diff --git a/examples/ens/hardhat.config.js b/packages/hardhat-ignition/examples/ens/hardhat.config.js similarity index 100% rename from examples/ens/hardhat.config.js rename to packages/hardhat-ignition/examples/ens/hardhat.config.js diff --git a/examples/ens/ignition/modules/ENS.js b/packages/hardhat-ignition/examples/ens/ignition/modules/ENS.js similarity index 100% rename from examples/ens/ignition/modules/ENS.js rename to packages/hardhat-ignition/examples/ens/ignition/modules/ENS.js diff --git a/examples/ens/ignition/modules/test-registrar.js b/packages/hardhat-ignition/examples/ens/ignition/modules/test-registrar.js similarity index 100% rename from examples/ens/ignition/modules/test-registrar.js rename to packages/hardhat-ignition/examples/ens/ignition/modules/test-registrar.js diff --git a/examples/ens/package.json b/packages/hardhat-ignition/examples/ens/package.json similarity index 100% rename from examples/ens/package.json rename to packages/hardhat-ignition/examples/ens/package.json diff --git a/examples/ens/scripts/deploy-ens.js b/packages/hardhat-ignition/examples/ens/scripts/deploy-ens.js similarity index 100% rename from examples/ens/scripts/deploy-ens.js rename to packages/hardhat-ignition/examples/ens/scripts/deploy-ens.js diff --git a/examples/ens/test/sample-test.js b/packages/hardhat-ignition/examples/ens/test/sample-test.js similarity index 100% rename from examples/ens/test/sample-test.js rename to packages/hardhat-ignition/examples/ens/test/sample-test.js diff --git a/examples/fee-tester/.eslintrc.js b/packages/hardhat-ignition/examples/fee-tester/.eslintrc.js similarity index 100% rename from examples/fee-tester/.eslintrc.js rename to packages/hardhat-ignition/examples/fee-tester/.eslintrc.js diff --git a/examples/fee-tester/.gitignore b/packages/hardhat-ignition/examples/fee-tester/.gitignore similarity index 100% rename from examples/fee-tester/.gitignore rename to packages/hardhat-ignition/examples/fee-tester/.gitignore diff --git a/examples/fee-tester/.prettierignore b/packages/hardhat-ignition/examples/fee-tester/.prettierignore similarity index 100% rename from examples/fee-tester/.prettierignore rename to packages/hardhat-ignition/examples/fee-tester/.prettierignore diff --git a/examples/fee-tester/README.md b/packages/hardhat-ignition/examples/fee-tester/README.md similarity index 100% rename from examples/fee-tester/README.md rename to packages/hardhat-ignition/examples/fee-tester/README.md diff --git a/examples/fee-tester/contracts/FeeTester.sol b/packages/hardhat-ignition/examples/fee-tester/contracts/FeeTester.sol similarity index 100% rename from examples/fee-tester/contracts/FeeTester.sol rename to packages/hardhat-ignition/examples/fee-tester/contracts/FeeTester.sol diff --git a/examples/fee-tester/hardhat.config.js b/packages/hardhat-ignition/examples/fee-tester/hardhat.config.js similarity index 100% rename from examples/fee-tester/hardhat.config.js rename to packages/hardhat-ignition/examples/fee-tester/hardhat.config.js diff --git a/examples/fee-tester/ignition/modules/FeeTesterModule.js b/packages/hardhat-ignition/examples/fee-tester/ignition/modules/FeeTesterModule.js similarity index 100% rename from examples/fee-tester/ignition/modules/FeeTesterModule.js rename to packages/hardhat-ignition/examples/fee-tester/ignition/modules/FeeTesterModule.js diff --git a/examples/fee-tester/package.json b/packages/hardhat-ignition/examples/fee-tester/package.json similarity index 100% rename from examples/fee-tester/package.json rename to packages/hardhat-ignition/examples/fee-tester/package.json diff --git a/examples/sample/.eslintrc.js b/packages/hardhat-ignition/examples/sample/.eslintrc.js similarity index 100% rename from examples/sample/.eslintrc.js rename to packages/hardhat-ignition/examples/sample/.eslintrc.js diff --git a/examples/sample/.gitignore b/packages/hardhat-ignition/examples/sample/.gitignore similarity index 100% rename from examples/sample/.gitignore rename to packages/hardhat-ignition/examples/sample/.gitignore diff --git a/examples/sample/.prettierignore b/packages/hardhat-ignition/examples/sample/.prettierignore similarity index 100% rename from examples/sample/.prettierignore rename to packages/hardhat-ignition/examples/sample/.prettierignore diff --git a/examples/sample/README.md b/packages/hardhat-ignition/examples/sample/README.md similarity index 100% rename from examples/sample/README.md rename to packages/hardhat-ignition/examples/sample/README.md diff --git a/examples/sample/contracts/Lock.sol b/packages/hardhat-ignition/examples/sample/contracts/Lock.sol similarity index 100% rename from examples/sample/contracts/Lock.sol rename to packages/hardhat-ignition/examples/sample/contracts/Lock.sol diff --git a/examples/sample/hardhat.config.js b/packages/hardhat-ignition/examples/sample/hardhat.config.js similarity index 100% rename from examples/sample/hardhat.config.js rename to packages/hardhat-ignition/examples/sample/hardhat.config.js diff --git a/examples/sample/ignition/modules/LockModule.js b/packages/hardhat-ignition/examples/sample/ignition/modules/LockModule.js similarity index 100% rename from examples/sample/ignition/modules/LockModule.js rename to packages/hardhat-ignition/examples/sample/ignition/modules/LockModule.js diff --git a/examples/sample/package.json b/packages/hardhat-ignition/examples/sample/package.json similarity index 100% rename from examples/sample/package.json rename to packages/hardhat-ignition/examples/sample/package.json diff --git a/examples/sample/scripts/bump.js b/packages/hardhat-ignition/examples/sample/scripts/bump.js similarity index 100% rename from examples/sample/scripts/bump.js rename to packages/hardhat-ignition/examples/sample/scripts/bump.js diff --git a/examples/sample/test/Lock.js b/packages/hardhat-ignition/examples/sample/test/Lock.js similarity index 100% rename from examples/sample/test/Lock.js rename to packages/hardhat-ignition/examples/sample/test/Lock.js diff --git a/examples/ts-sample/.eslintrc.js b/packages/hardhat-ignition/examples/ts-sample/.eslintrc.js similarity index 100% rename from examples/ts-sample/.eslintrc.js rename to packages/hardhat-ignition/examples/ts-sample/.eslintrc.js diff --git a/examples/ts-sample/.gitignore b/packages/hardhat-ignition/examples/ts-sample/.gitignore similarity index 100% rename from examples/ts-sample/.gitignore rename to packages/hardhat-ignition/examples/ts-sample/.gitignore diff --git a/examples/ts-sample/.prettierignore b/packages/hardhat-ignition/examples/ts-sample/.prettierignore similarity index 100% rename from examples/ts-sample/.prettierignore rename to packages/hardhat-ignition/examples/ts-sample/.prettierignore diff --git a/examples/ts-sample/README.md b/packages/hardhat-ignition/examples/ts-sample/README.md similarity index 100% rename from examples/ts-sample/README.md rename to packages/hardhat-ignition/examples/ts-sample/README.md diff --git a/examples/ts-sample/contracts/Lock.sol b/packages/hardhat-ignition/examples/ts-sample/contracts/Lock.sol similarity index 100% rename from examples/ts-sample/contracts/Lock.sol rename to packages/hardhat-ignition/examples/ts-sample/contracts/Lock.sol diff --git a/examples/ts-sample/hardhat.config.ts b/packages/hardhat-ignition/examples/ts-sample/hardhat.config.ts similarity index 100% rename from examples/ts-sample/hardhat.config.ts rename to packages/hardhat-ignition/examples/ts-sample/hardhat.config.ts diff --git a/examples/ts-sample/ignition/modules/LockModule.ts b/packages/hardhat-ignition/examples/ts-sample/ignition/modules/LockModule.ts similarity index 100% rename from examples/ts-sample/ignition/modules/LockModule.ts rename to packages/hardhat-ignition/examples/ts-sample/ignition/modules/LockModule.ts diff --git a/examples/ts-sample/package.json b/packages/hardhat-ignition/examples/ts-sample/package.json similarity index 100% rename from examples/ts-sample/package.json rename to packages/hardhat-ignition/examples/ts-sample/package.json diff --git a/examples/ts-sample/test/Lock.ts b/packages/hardhat-ignition/examples/ts-sample/test/Lock.ts similarity index 100% rename from examples/ts-sample/test/Lock.ts rename to packages/hardhat-ignition/examples/ts-sample/test/Lock.ts diff --git a/examples/ts-sample/tsconfig.json b/packages/hardhat-ignition/examples/ts-sample/tsconfig.json similarity index 100% rename from examples/ts-sample/tsconfig.json rename to packages/hardhat-ignition/examples/ts-sample/tsconfig.json diff --git a/examples/upgradeable/.eslintrc.js b/packages/hardhat-ignition/examples/upgradeable/.eslintrc.js similarity index 100% rename from examples/upgradeable/.eslintrc.js rename to packages/hardhat-ignition/examples/upgradeable/.eslintrc.js diff --git a/examples/upgradeable/.gitignore b/packages/hardhat-ignition/examples/upgradeable/.gitignore similarity index 100% rename from examples/upgradeable/.gitignore rename to packages/hardhat-ignition/examples/upgradeable/.gitignore diff --git a/examples/upgradeable/.prettierignore b/packages/hardhat-ignition/examples/upgradeable/.prettierignore similarity index 100% rename from examples/upgradeable/.prettierignore rename to packages/hardhat-ignition/examples/upgradeable/.prettierignore diff --git a/examples/upgradeable/README.md b/packages/hardhat-ignition/examples/upgradeable/README.md similarity index 100% rename from examples/upgradeable/README.md rename to packages/hardhat-ignition/examples/upgradeable/README.md diff --git a/examples/upgradeable/contracts/Demo.sol b/packages/hardhat-ignition/examples/upgradeable/contracts/Demo.sol similarity index 100% rename from examples/upgradeable/contracts/Demo.sol rename to packages/hardhat-ignition/examples/upgradeable/contracts/Demo.sol diff --git a/examples/upgradeable/contracts/DemoV2.sol b/packages/hardhat-ignition/examples/upgradeable/contracts/DemoV2.sol similarity index 100% rename from examples/upgradeable/contracts/DemoV2.sol rename to packages/hardhat-ignition/examples/upgradeable/contracts/DemoV2.sol diff --git a/examples/upgradeable/contracts/Proxies.sol b/packages/hardhat-ignition/examples/upgradeable/contracts/Proxies.sol similarity index 100% rename from examples/upgradeable/contracts/Proxies.sol rename to packages/hardhat-ignition/examples/upgradeable/contracts/Proxies.sol diff --git a/examples/upgradeable/hardhat.config.js b/packages/hardhat-ignition/examples/upgradeable/hardhat.config.js similarity index 100% rename from examples/upgradeable/hardhat.config.js rename to packages/hardhat-ignition/examples/upgradeable/hardhat.config.js diff --git a/examples/upgradeable/ignition/modules/ProxyModule.js b/packages/hardhat-ignition/examples/upgradeable/ignition/modules/ProxyModule.js similarity index 100% rename from examples/upgradeable/ignition/modules/ProxyModule.js rename to packages/hardhat-ignition/examples/upgradeable/ignition/modules/ProxyModule.js diff --git a/examples/upgradeable/ignition/modules/UpgradeModule.js b/packages/hardhat-ignition/examples/upgradeable/ignition/modules/UpgradeModule.js similarity index 100% rename from examples/upgradeable/ignition/modules/UpgradeModule.js rename to packages/hardhat-ignition/examples/upgradeable/ignition/modules/UpgradeModule.js diff --git a/examples/upgradeable/package.json b/packages/hardhat-ignition/examples/upgradeable/package.json similarity index 100% rename from examples/upgradeable/package.json rename to packages/hardhat-ignition/examples/upgradeable/package.json diff --git a/examples/upgradeable/test/ProxyDemo.js b/packages/hardhat-ignition/examples/upgradeable/test/ProxyDemo.js similarity index 100% rename from examples/upgradeable/test/ProxyDemo.js rename to packages/hardhat-ignition/examples/upgradeable/test/ProxyDemo.js diff --git a/examples/viem-sample/.eslintrc.js b/packages/hardhat-ignition/examples/viem-sample/.eslintrc.js similarity index 100% rename from examples/viem-sample/.eslintrc.js rename to packages/hardhat-ignition/examples/viem-sample/.eslintrc.js diff --git a/examples/viem-sample/.gitignore b/packages/hardhat-ignition/examples/viem-sample/.gitignore similarity index 100% rename from examples/viem-sample/.gitignore rename to packages/hardhat-ignition/examples/viem-sample/.gitignore diff --git a/examples/viem-sample/.prettierignore b/packages/hardhat-ignition/examples/viem-sample/.prettierignore similarity index 100% rename from examples/viem-sample/.prettierignore rename to packages/hardhat-ignition/examples/viem-sample/.prettierignore diff --git a/examples/viem-sample/README.md b/packages/hardhat-ignition/examples/viem-sample/README.md similarity index 100% rename from examples/viem-sample/README.md rename to packages/hardhat-ignition/examples/viem-sample/README.md diff --git a/examples/viem-sample/contracts/Lock.sol b/packages/hardhat-ignition/examples/viem-sample/contracts/Lock.sol similarity index 100% rename from examples/viem-sample/contracts/Lock.sol rename to packages/hardhat-ignition/examples/viem-sample/contracts/Lock.sol diff --git a/examples/viem-sample/hardhat.config.ts b/packages/hardhat-ignition/examples/viem-sample/hardhat.config.ts similarity index 100% rename from examples/viem-sample/hardhat.config.ts rename to packages/hardhat-ignition/examples/viem-sample/hardhat.config.ts diff --git a/examples/viem-sample/ignition/modules/LockModule.ts b/packages/hardhat-ignition/examples/viem-sample/ignition/modules/LockModule.ts similarity index 100% rename from examples/viem-sample/ignition/modules/LockModule.ts rename to packages/hardhat-ignition/examples/viem-sample/ignition/modules/LockModule.ts diff --git a/examples/viem-sample/package.json b/packages/hardhat-ignition/examples/viem-sample/package.json similarity index 100% rename from examples/viem-sample/package.json rename to packages/hardhat-ignition/examples/viem-sample/package.json diff --git a/examples/viem-sample/test/Lock.ts b/packages/hardhat-ignition/examples/viem-sample/test/Lock.ts similarity index 100% rename from examples/viem-sample/test/Lock.ts rename to packages/hardhat-ignition/examples/viem-sample/test/Lock.ts diff --git a/examples/viem-sample/tsconfig.json b/packages/hardhat-ignition/examples/viem-sample/tsconfig.json similarity index 100% rename from examples/viem-sample/tsconfig.json rename to packages/hardhat-ignition/examples/viem-sample/tsconfig.json diff --git a/package.json b/packages/hardhat-ignition/package.json similarity index 100% rename from package.json rename to packages/hardhat-ignition/package.json diff --git a/packages/core/.eslintrc.js b/packages/hardhat-ignition/packages/core/.eslintrc.js similarity index 100% rename from packages/core/.eslintrc.js rename to packages/hardhat-ignition/packages/core/.eslintrc.js diff --git a/packages/core/.gitignore b/packages/hardhat-ignition/packages/core/.gitignore similarity index 100% rename from packages/core/.gitignore rename to packages/hardhat-ignition/packages/core/.gitignore diff --git a/packages/core/.mocharc.json b/packages/hardhat-ignition/packages/core/.mocharc.json similarity index 100% rename from packages/core/.mocharc.json rename to packages/hardhat-ignition/packages/core/.mocharc.json diff --git a/packages/core/.npmignore b/packages/hardhat-ignition/packages/core/.npmignore similarity index 100% rename from packages/core/.npmignore rename to packages/hardhat-ignition/packages/core/.npmignore diff --git a/packages/core/.nycrc b/packages/hardhat-ignition/packages/core/.nycrc similarity index 100% rename from packages/core/.nycrc rename to packages/hardhat-ignition/packages/core/.nycrc diff --git a/packages/core/.prettierignore b/packages/hardhat-ignition/packages/core/.prettierignore similarity index 100% rename from packages/core/.prettierignore rename to packages/hardhat-ignition/packages/core/.prettierignore diff --git a/packages/core/.prettierrc b/packages/hardhat-ignition/packages/core/.prettierrc similarity index 100% rename from packages/core/.prettierrc rename to packages/hardhat-ignition/packages/core/.prettierrc diff --git a/packages/core/CHANGELOG.md b/packages/hardhat-ignition/packages/core/CHANGELOG.md similarity index 100% rename from packages/core/CHANGELOG.md rename to packages/hardhat-ignition/packages/core/CHANGELOG.md diff --git a/packages/core/README.md b/packages/hardhat-ignition/packages/core/README.md similarity index 100% rename from packages/core/README.md rename to packages/hardhat-ignition/packages/core/README.md diff --git a/packages/core/api-extractor.json b/packages/hardhat-ignition/packages/core/api-extractor.json similarity index 100% rename from packages/core/api-extractor.json rename to packages/hardhat-ignition/packages/core/api-extractor.json diff --git a/packages/core/package.json b/packages/hardhat-ignition/packages/core/package.json similarity index 100% rename from packages/core/package.json rename to packages/hardhat-ignition/packages/core/package.json diff --git a/packages/core/src/batches.ts b/packages/hardhat-ignition/packages/core/src/batches.ts similarity index 100% rename from packages/core/src/batches.ts rename to packages/hardhat-ignition/packages/core/src/batches.ts diff --git a/packages/core/src/build-module.ts b/packages/hardhat-ignition/packages/core/src/build-module.ts similarity index 100% rename from packages/core/src/build-module.ts rename to packages/hardhat-ignition/packages/core/src/build-module.ts diff --git a/packages/core/src/deploy.ts b/packages/hardhat-ignition/packages/core/src/deploy.ts similarity index 100% rename from packages/core/src/deploy.ts rename to packages/hardhat-ignition/packages/core/src/deploy.ts diff --git a/packages/core/src/errors.ts b/packages/hardhat-ignition/packages/core/src/errors.ts similarity index 100% rename from packages/core/src/errors.ts rename to packages/hardhat-ignition/packages/core/src/errors.ts diff --git a/packages/core/src/ignition-module-serializer.ts b/packages/hardhat-ignition/packages/core/src/ignition-module-serializer.ts similarity index 100% rename from packages/core/src/ignition-module-serializer.ts rename to packages/hardhat-ignition/packages/core/src/ignition-module-serializer.ts diff --git a/packages/core/src/index.ts b/packages/hardhat-ignition/packages/core/src/index.ts similarity index 100% rename from packages/core/src/index.ts rename to packages/hardhat-ignition/packages/core/src/index.ts diff --git a/packages/core/src/internal/batcher.ts b/packages/hardhat-ignition/packages/core/src/internal/batcher.ts similarity index 100% rename from packages/core/src/internal/batcher.ts rename to packages/hardhat-ignition/packages/core/src/internal/batcher.ts diff --git a/packages/core/src/internal/chain-config.ts b/packages/hardhat-ignition/packages/core/src/internal/chain-config.ts similarity index 100% rename from packages/core/src/internal/chain-config.ts rename to packages/hardhat-ignition/packages/core/src/internal/chain-config.ts diff --git a/packages/core/src/internal/defaultConfig.ts b/packages/hardhat-ignition/packages/core/src/internal/defaultConfig.ts similarity index 100% rename from packages/core/src/internal/defaultConfig.ts rename to packages/hardhat-ignition/packages/core/src/internal/defaultConfig.ts diff --git a/packages/core/src/internal/deployer.ts b/packages/hardhat-ignition/packages/core/src/internal/deployer.ts similarity index 100% rename from packages/core/src/internal/deployer.ts rename to packages/hardhat-ignition/packages/core/src/internal/deployer.ts diff --git a/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts similarity index 100% rename from packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts rename to packages/hardhat-ignition/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts diff --git a/packages/core/src/internal/deployment-loader/file-deployment-loader.ts b/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/file-deployment-loader.ts similarity index 100% rename from packages/core/src/internal/deployment-loader/file-deployment-loader.ts rename to packages/hardhat-ignition/packages/core/src/internal/deployment-loader/file-deployment-loader.ts diff --git a/packages/core/src/internal/deployment-loader/types.ts b/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/types.ts similarity index 100% rename from packages/core/src/internal/deployment-loader/types.ts rename to packages/hardhat-ignition/packages/core/src/internal/deployment-loader/types.ts diff --git a/packages/core/src/internal/errors-list.ts b/packages/hardhat-ignition/packages/core/src/internal/errors-list.ts similarity index 100% rename from packages/core/src/internal/errors-list.ts rename to packages/hardhat-ignition/packages/core/src/internal/errors-list.ts diff --git a/packages/core/src/internal/execution/abi.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/abi.ts similarity index 100% rename from packages/core/src/internal/execution/abi.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/abi.ts diff --git a/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/deployment-state-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/deployment-state-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/deployment-state-helpers.ts diff --git a/packages/core/src/internal/execution/execution-engine.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/execution-engine.ts similarity index 100% rename from packages/core/src/internal/execution/execution-engine.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/execution-engine.ts diff --git a/packages/core/src/internal/execution/execution-strategy-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/execution-strategy-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/execution-strategy-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/execution-strategy-helpers.ts diff --git a/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/future-processor.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/future-processor.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/future-processor.ts diff --git a/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts diff --git a/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts diff --git a/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts diff --git a/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts diff --git a/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts similarity index 100% rename from packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts diff --git a/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/jsonrpc-client.ts similarity index 100% rename from packages/core/src/internal/execution/jsonrpc-client.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/jsonrpc-client.ts diff --git a/packages/core/src/internal/execution/libraries.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/libraries.ts similarity index 100% rename from packages/core/src/internal/execution/libraries.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/libraries.ts diff --git a/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts similarity index 100% rename from packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts diff --git a/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts similarity index 100% rename from packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts diff --git a/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/deployment-state-reducer.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts diff --git a/packages/core/src/internal/execution/reducers/execution-state-reducer.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/execution-state-reducer.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/execution-state-reducer.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/execution-state-reducer.ts diff --git a/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts diff --git a/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts diff --git a/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/initializers.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/helpers/initializers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/initializers.ts diff --git a/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts diff --git a/packages/core/src/internal/execution/strategy/createx-artifact.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/strategy/createx-artifact.ts similarity index 100% rename from packages/core/src/internal/execution/strategy/createx-artifact.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/strategy/createx-artifact.ts diff --git a/packages/core/src/internal/execution/transaction-tracking-timer.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/transaction-tracking-timer.ts similarity index 100% rename from packages/core/src/internal/execution/transaction-tracking-timer.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/transaction-tracking-timer.ts diff --git a/packages/core/src/internal/execution/type-helpers.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/type-helpers.ts similarity index 100% rename from packages/core/src/internal/execution/type-helpers.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/type-helpers.ts diff --git a/packages/core/src/internal/execution/types/deployment-state.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/deployment-state.ts similarity index 100% rename from packages/core/src/internal/execution/types/deployment-state.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/deployment-state.ts diff --git a/packages/core/src/internal/execution/types/evm-execution.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/evm-execution.ts similarity index 100% rename from packages/core/src/internal/execution/types/evm-execution.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/evm-execution.ts diff --git a/packages/core/src/internal/execution/types/execution-result.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-result.ts similarity index 100% rename from packages/core/src/internal/execution/types/execution-result.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-result.ts diff --git a/packages/core/src/internal/execution/types/execution-state.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-state.ts similarity index 100% rename from packages/core/src/internal/execution/types/execution-state.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-state.ts diff --git a/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-strategy.ts similarity index 100% rename from packages/core/src/internal/execution/types/execution-strategy.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-strategy.ts diff --git a/packages/core/src/internal/execution/types/jsonrpc.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/jsonrpc.ts similarity index 100% rename from packages/core/src/internal/execution/types/jsonrpc.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/jsonrpc.ts diff --git a/packages/core/src/internal/execution/types/messages.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/messages.ts similarity index 100% rename from packages/core/src/internal/execution/types/messages.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/messages.ts diff --git a/packages/core/src/internal/execution/types/network-interaction.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/types/network-interaction.ts similarity index 100% rename from packages/core/src/internal/execution/types/network-interaction.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/types/network-interaction.ts diff --git a/packages/core/src/internal/execution/utils/address.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/utils/address.ts similarity index 100% rename from packages/core/src/internal/execution/utils/address.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/utils/address.ts diff --git a/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/core/src/internal/execution/utils/get-default-sender.ts b/packages/hardhat-ignition/packages/core/src/internal/execution/utils/get-default-sender.ts similarity index 100% rename from packages/core/src/internal/execution/utils/get-default-sender.ts rename to packages/hardhat-ignition/packages/core/src/internal/execution/utils/get-default-sender.ts diff --git a/packages/core/src/internal/formatters.ts b/packages/hardhat-ignition/packages/core/src/internal/formatters.ts similarity index 100% rename from packages/core/src/internal/formatters.ts rename to packages/hardhat-ignition/packages/core/src/internal/formatters.ts diff --git a/packages/core/src/internal/journal/file-journal.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/file-journal.ts similarity index 100% rename from packages/core/src/internal/journal/file-journal.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/file-journal.ts diff --git a/packages/core/src/internal/journal/memory-journal.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/memory-journal.ts similarity index 100% rename from packages/core/src/internal/journal/memory-journal.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/memory-journal.ts diff --git a/packages/core/src/internal/journal/types/index.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/types/index.ts similarity index 100% rename from packages/core/src/internal/journal/types/index.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/types/index.ts diff --git a/packages/core/src/internal/journal/utils/deserialize-replacer.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/utils/deserialize-replacer.ts similarity index 100% rename from packages/core/src/internal/journal/utils/deserialize-replacer.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/utils/deserialize-replacer.ts diff --git a/packages/core/src/internal/journal/utils/emitExecutionEvent.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/utils/emitExecutionEvent.ts similarity index 100% rename from packages/core/src/internal/journal/utils/emitExecutionEvent.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/utils/emitExecutionEvent.ts diff --git a/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts similarity index 100% rename from packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts diff --git a/packages/core/src/internal/journal/utils/log.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/utils/log.ts similarity index 100% rename from packages/core/src/internal/journal/utils/log.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/utils/log.ts diff --git a/packages/core/src/internal/journal/utils/serialize-replacer.ts b/packages/hardhat-ignition/packages/core/src/internal/journal/utils/serialize-replacer.ts similarity index 100% rename from packages/core/src/internal/journal/utils/serialize-replacer.ts rename to packages/hardhat-ignition/packages/core/src/internal/journal/utils/serialize-replacer.ts diff --git a/packages/core/src/internal/module-builder.ts b/packages/hardhat-ignition/packages/core/src/internal/module-builder.ts similarity index 100% rename from packages/core/src/internal/module-builder.ts rename to packages/hardhat-ignition/packages/core/src/internal/module-builder.ts diff --git a/packages/core/src/internal/module.ts b/packages/hardhat-ignition/packages/core/src/internal/module.ts similarity index 100% rename from packages/core/src/internal/module.ts rename to packages/hardhat-ignition/packages/core/src/internal/module.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/core/src/internal/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts diff --git a/packages/core/src/internal/reconciliation/helpers/compare.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/compare.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/compare.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/compare.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-address.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-data.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-from.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts diff --git a/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts similarity index 100% rename from packages/core/src/internal/reconciliation/helpers/reconcile-value.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts diff --git a/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts similarity index 100% rename from packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts diff --git a/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts similarity index 100% rename from packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts diff --git a/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts similarity index 100% rename from packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts diff --git a/packages/core/src/internal/reconciliation/reconciler.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconciler.ts similarity index 100% rename from packages/core/src/internal/reconciliation/reconciler.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconciler.ts diff --git a/packages/core/src/internal/reconciliation/types.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/types.ts similarity index 100% rename from packages/core/src/internal/reconciliation/types.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/types.ts diff --git a/packages/core/src/internal/reconciliation/utils.ts b/packages/hardhat-ignition/packages/core/src/internal/reconciliation/utils.ts similarity index 100% rename from packages/core/src/internal/reconciliation/utils.ts rename to packages/hardhat-ignition/packages/core/src/internal/reconciliation/utils.ts diff --git a/packages/core/src/internal/topological-order.ts b/packages/hardhat-ignition/packages/core/src/internal/topological-order.ts similarity index 100% rename from packages/core/src/internal/topological-order.ts rename to packages/hardhat-ignition/packages/core/src/internal/topological-order.ts diff --git a/packages/core/src/internal/utils.ts b/packages/hardhat-ignition/packages/core/src/internal/utils.ts similarity index 100% rename from packages/core/src/internal/utils.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils.ts diff --git a/packages/core/src/internal/utils/adjacency-list-converter.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list-converter.ts similarity index 100% rename from packages/core/src/internal/utils/adjacency-list-converter.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list-converter.ts diff --git a/packages/core/src/internal/utils/adjacency-list.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list.ts similarity index 100% rename from packages/core/src/internal/utils/adjacency-list.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list.ts diff --git a/packages/core/src/internal/utils/assertions.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/assertions.ts similarity index 100% rename from packages/core/src/internal/utils/assertions.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/assertions.ts diff --git a/packages/core/src/internal/utils/check-automined-network.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/check-automined-network.ts similarity index 100% rename from packages/core/src/internal/utils/check-automined-network.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/check-automined-network.ts diff --git a/packages/core/src/internal/utils/future-id-builders.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/future-id-builders.ts similarity index 100% rename from packages/core/src/internal/utils/future-id-builders.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/future-id-builders.ts diff --git a/packages/core/src/internal/utils/get-futures-from-module.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/get-futures-from-module.ts similarity index 100% rename from packages/core/src/internal/utils/get-futures-from-module.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/get-futures-from-module.ts diff --git a/packages/core/src/internal/utils/identifier-validators.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/identifier-validators.ts similarity index 100% rename from packages/core/src/internal/utils/identifier-validators.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/identifier-validators.ts diff --git a/packages/core/src/internal/utils/replace-within-arg.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/replace-within-arg.ts similarity index 100% rename from packages/core/src/internal/utils/replace-within-arg.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/replace-within-arg.ts diff --git a/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/hardhat-ignition/packages/core/src/internal/utils/resolve-module-parameter.ts similarity index 100% rename from packages/core/src/internal/utils/resolve-module-parameter.ts rename to packages/hardhat-ignition/packages/core/src/internal/utils/resolve-module-parameter.ts diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateArtifactContractAt.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts diff --git a/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts diff --git a/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractAt.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedContractAt.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractAt.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractCall.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedContractCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractCall.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts diff --git a/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateNamedStaticCall.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts diff --git a/packages/core/src/internal/validation/futures/validateReadEventArgument.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateReadEventArgument.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateReadEventArgument.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateReadEventArgument.ts diff --git a/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateSendData.ts similarity index 100% rename from packages/core/src/internal/validation/futures/validateSendData.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateSendData.ts diff --git a/packages/core/src/internal/validation/utils.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/utils.ts similarity index 100% rename from packages/core/src/internal/validation/utils.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/utils.ts diff --git a/packages/core/src/internal/validation/validate.ts b/packages/hardhat-ignition/packages/core/src/internal/validation/validate.ts similarity index 100% rename from packages/core/src/internal/validation/validate.ts rename to packages/hardhat-ignition/packages/core/src/internal/validation/validate.ts diff --git a/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts b/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts similarity index 100% rename from packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts diff --git a/packages/core/src/internal/views/execution-state/find-static-call-by.ts b/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-static-call-by.ts similarity index 100% rename from packages/core/src/internal/views/execution-state/find-static-call-by.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-static-call-by.ts diff --git a/packages/core/src/internal/views/execution-state/find-transaction-by.ts b/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-transaction-by.ts similarity index 100% rename from packages/core/src/internal/views/execution-state/find-transaction-by.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-transaction-by.ts diff --git a/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts b/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts similarity index 100% rename from packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts diff --git a/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts b/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts similarity index 100% rename from packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts diff --git a/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts similarity index 100% rename from packages/core/src/internal/views/find-address-for-contract-future-by-id.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts diff --git a/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts similarity index 100% rename from packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts diff --git a/packages/core/src/internal/views/find-deployed-contracts.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-deployed-contracts.ts similarity index 100% rename from packages/core/src/internal/views/find-deployed-contracts.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-deployed-contracts.ts diff --git a/packages/core/src/internal/views/find-execution-state-by-id.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-execution-state-by-id.ts similarity index 100% rename from packages/core/src/internal/views/find-execution-state-by-id.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-execution-state-by-id.ts diff --git a/packages/core/src/internal/views/find-execution-states-by-type.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-execution-states-by-type.ts similarity index 100% rename from packages/core/src/internal/views/find-execution-states-by-type.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-execution-states-by-type.ts diff --git a/packages/core/src/internal/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/core/src/internal/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-result-for-future-by-id.ts diff --git a/packages/core/src/internal/views/find-status.ts b/packages/hardhat-ignition/packages/core/src/internal/views/find-status.ts similarity index 100% rename from packages/core/src/internal/views/find-status.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/find-status.ts diff --git a/packages/core/src/internal/views/has-execution-succeeded.ts b/packages/hardhat-ignition/packages/core/src/internal/views/has-execution-succeeded.ts similarity index 100% rename from packages/core/src/internal/views/has-execution-succeeded.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/has-execution-succeeded.ts diff --git a/packages/core/src/internal/views/is-batch-finished.ts b/packages/hardhat-ignition/packages/core/src/internal/views/is-batch-finished.ts similarity index 100% rename from packages/core/src/internal/views/is-batch-finished.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/is-batch-finished.ts diff --git a/packages/core/src/internal/views/is-execution-state-complete.ts b/packages/hardhat-ignition/packages/core/src/internal/views/is-execution-state-complete.ts similarity index 100% rename from packages/core/src/internal/views/is-execution-state-complete.ts rename to packages/hardhat-ignition/packages/core/src/internal/views/is-execution-state-complete.ts diff --git a/packages/core/src/internal/wiper.ts b/packages/hardhat-ignition/packages/core/src/internal/wiper.ts similarity index 100% rename from packages/core/src/internal/wiper.ts rename to packages/hardhat-ignition/packages/core/src/internal/wiper.ts diff --git a/packages/core/src/list-deployments.ts b/packages/hardhat-ignition/packages/core/src/list-deployments.ts similarity index 100% rename from packages/core/src/list-deployments.ts rename to packages/hardhat-ignition/packages/core/src/list-deployments.ts diff --git a/packages/core/src/list-transactions.ts b/packages/hardhat-ignition/packages/core/src/list-transactions.ts similarity index 100% rename from packages/core/src/list-transactions.ts rename to packages/hardhat-ignition/packages/core/src/list-transactions.ts diff --git a/packages/core/src/status.ts b/packages/hardhat-ignition/packages/core/src/status.ts similarity index 100% rename from packages/core/src/status.ts rename to packages/hardhat-ignition/packages/core/src/status.ts diff --git a/packages/core/src/strategies/basic-strategy.ts b/packages/hardhat-ignition/packages/core/src/strategies/basic-strategy.ts similarity index 100% rename from packages/core/src/strategies/basic-strategy.ts rename to packages/hardhat-ignition/packages/core/src/strategies/basic-strategy.ts diff --git a/packages/core/src/strategies/create2-strategy.ts b/packages/hardhat-ignition/packages/core/src/strategies/create2-strategy.ts similarity index 100% rename from packages/core/src/strategies/create2-strategy.ts rename to packages/hardhat-ignition/packages/core/src/strategies/create2-strategy.ts diff --git a/packages/core/src/strategies/resolve-strategy.ts b/packages/hardhat-ignition/packages/core/src/strategies/resolve-strategy.ts similarity index 100% rename from packages/core/src/strategies/resolve-strategy.ts rename to packages/hardhat-ignition/packages/core/src/strategies/resolve-strategy.ts diff --git a/packages/core/src/type-guards.ts b/packages/hardhat-ignition/packages/core/src/type-guards.ts similarity index 100% rename from packages/core/src/type-guards.ts rename to packages/hardhat-ignition/packages/core/src/type-guards.ts diff --git a/packages/core/src/types/artifact.ts b/packages/hardhat-ignition/packages/core/src/types/artifact.ts similarity index 100% rename from packages/core/src/types/artifact.ts rename to packages/hardhat-ignition/packages/core/src/types/artifact.ts diff --git a/packages/core/src/types/deploy.ts b/packages/hardhat-ignition/packages/core/src/types/deploy.ts similarity index 100% rename from packages/core/src/types/deploy.ts rename to packages/hardhat-ignition/packages/core/src/types/deploy.ts diff --git a/packages/core/src/types/errors.ts b/packages/hardhat-ignition/packages/core/src/types/errors.ts similarity index 100% rename from packages/core/src/types/errors.ts rename to packages/hardhat-ignition/packages/core/src/types/errors.ts diff --git a/packages/core/src/types/execution-events.ts b/packages/hardhat-ignition/packages/core/src/types/execution-events.ts similarity index 100% rename from packages/core/src/types/execution-events.ts rename to packages/hardhat-ignition/packages/core/src/types/execution-events.ts diff --git a/packages/core/src/types/list-transactions.ts b/packages/hardhat-ignition/packages/core/src/types/list-transactions.ts similarity index 100% rename from packages/core/src/types/list-transactions.ts rename to packages/hardhat-ignition/packages/core/src/types/list-transactions.ts diff --git a/packages/core/src/types/module-builder.ts b/packages/hardhat-ignition/packages/core/src/types/module-builder.ts similarity index 100% rename from packages/core/src/types/module-builder.ts rename to packages/hardhat-ignition/packages/core/src/types/module-builder.ts diff --git a/packages/core/src/types/module.ts b/packages/hardhat-ignition/packages/core/src/types/module.ts similarity index 100% rename from packages/core/src/types/module.ts rename to packages/hardhat-ignition/packages/core/src/types/module.ts diff --git a/packages/core/src/types/provider.ts b/packages/hardhat-ignition/packages/core/src/types/provider.ts similarity index 100% rename from packages/core/src/types/provider.ts rename to packages/hardhat-ignition/packages/core/src/types/provider.ts diff --git a/packages/core/src/types/serialization.ts b/packages/hardhat-ignition/packages/core/src/types/serialization.ts similarity index 100% rename from packages/core/src/types/serialization.ts rename to packages/hardhat-ignition/packages/core/src/types/serialization.ts diff --git a/packages/core/src/types/status.ts b/packages/hardhat-ignition/packages/core/src/types/status.ts similarity index 100% rename from packages/core/src/types/status.ts rename to packages/hardhat-ignition/packages/core/src/types/status.ts diff --git a/packages/core/src/types/verify.ts b/packages/hardhat-ignition/packages/core/src/types/verify.ts similarity index 100% rename from packages/core/src/types/verify.ts rename to packages/hardhat-ignition/packages/core/src/types/verify.ts diff --git a/packages/core/src/ui-helpers.ts b/packages/hardhat-ignition/packages/core/src/ui-helpers.ts similarity index 100% rename from packages/core/src/ui-helpers.ts rename to packages/hardhat-ignition/packages/core/src/ui-helpers.ts diff --git a/packages/core/src/verify.ts b/packages/hardhat-ignition/packages/core/src/verify.ts similarity index 100% rename from packages/core/src/verify.ts rename to packages/hardhat-ignition/packages/core/src/verify.ts diff --git a/packages/core/src/wipe.ts b/packages/hardhat-ignition/packages/core/src/wipe.ts similarity index 100% rename from packages/core/src/wipe.ts rename to packages/hardhat-ignition/packages/core/src/wipe.ts diff --git a/packages/core/test-integrations/.eslintrc.js b/packages/hardhat-ignition/packages/core/test-integrations/.eslintrc.js similarity index 100% rename from packages/core/test-integrations/.eslintrc.js rename to packages/hardhat-ignition/packages/core/test-integrations/.eslintrc.js diff --git a/packages/core/test-integrations/fixture-projects/.gitignore b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/.gitignore similarity index 100% rename from packages/core/test-integrations/fixture-projects/.gitignore rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/.gitignore diff --git a/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol similarity index 100% rename from packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol diff --git a/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js diff --git a/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl diff --git a/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js diff --git a/packages/core/test-integrations/fixture-projects/default/contracts/C.sol b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/C.sol similarity index 100% rename from packages/core/test-integrations/fixture-projects/default/contracts/C.sol rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/C.sol diff --git a/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol similarity index 100% rename from packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol diff --git a/packages/core/test-integrations/fixture-projects/default/hardhat.config.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/hardhat.config.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/default/hardhat.config.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/hardhat.config.js diff --git a/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js b/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js similarity index 100% rename from packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js rename to packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js diff --git a/packages/core/test-integrations/helpers/hardhat-projects.ts b/packages/hardhat-ignition/packages/core/test-integrations/helpers/hardhat-projects.ts similarity index 100% rename from packages/core/test-integrations/helpers/hardhat-projects.ts rename to packages/hardhat-ignition/packages/core/test-integrations/helpers/hardhat-projects.ts diff --git a/packages/core/test-integrations/new-api/ci/basic-success.ts b/packages/hardhat-ignition/packages/core/test-integrations/new-api/ci/basic-success.ts similarity index 100% rename from packages/core/test-integrations/new-api/ci/basic-success.ts rename to packages/hardhat-ignition/packages/core/test-integrations/new-api/ci/basic-success.ts diff --git a/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts similarity index 100% rename from packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts rename to packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts diff --git a/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts similarity index 100% rename from packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts rename to packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts diff --git a/packages/core/test-integrations/test-execution-result-fixtures.ts b/packages/hardhat-ignition/packages/core/test-integrations/test-execution-result-fixtures.ts similarity index 100% rename from packages/core/test-integrations/test-execution-result-fixtures.ts rename to packages/hardhat-ignition/packages/core/test-integrations/test-execution-result-fixtures.ts diff --git a/packages/core/test/.eslintrc.js b/packages/hardhat-ignition/packages/core/test/.eslintrc.js similarity index 100% rename from packages/core/test/.eslintrc.js rename to packages/hardhat-ignition/packages/core/test/.eslintrc.js diff --git a/packages/core/test/batcher.ts b/packages/hardhat-ignition/packages/core/test/batcher.ts similarity index 100% rename from packages/core/test/batcher.ts rename to packages/hardhat-ignition/packages/core/test/batcher.ts diff --git a/packages/core/test/build-module.ts b/packages/hardhat-ignition/packages/core/test/build-module.ts similarity index 100% rename from packages/core/test/build-module.ts rename to packages/hardhat-ignition/packages/core/test/build-module.ts diff --git a/packages/core/test/call.ts b/packages/hardhat-ignition/packages/core/test/call.ts similarity index 100% rename from packages/core/test/call.ts rename to packages/hardhat-ignition/packages/core/test/call.ts diff --git a/packages/core/test/contract.ts b/packages/hardhat-ignition/packages/core/test/contract.ts similarity index 100% rename from packages/core/test/contract.ts rename to packages/hardhat-ignition/packages/core/test/contract.ts diff --git a/packages/core/test/contractAt.ts b/packages/hardhat-ignition/packages/core/test/contractAt.ts similarity index 100% rename from packages/core/test/contractAt.ts rename to packages/hardhat-ignition/packages/core/test/contractAt.ts diff --git a/packages/core/test/contractAtFromArtifact.ts b/packages/hardhat-ignition/packages/core/test/contractAtFromArtifact.ts similarity index 100% rename from packages/core/test/contractAtFromArtifact.ts rename to packages/hardhat-ignition/packages/core/test/contractAtFromArtifact.ts diff --git a/packages/core/test/contractFromArtifact.ts b/packages/hardhat-ignition/packages/core/test/contractFromArtifact.ts similarity index 100% rename from packages/core/test/contractFromArtifact.ts rename to packages/hardhat-ignition/packages/core/test/contractFromArtifact.ts diff --git a/packages/core/test/encodeFunctionCall.ts b/packages/hardhat-ignition/packages/core/test/encodeFunctionCall.ts similarity index 100% rename from packages/core/test/encodeFunctionCall.ts rename to packages/hardhat-ignition/packages/core/test/encodeFunctionCall.ts diff --git a/packages/core/test/execution/abi.ts b/packages/hardhat-ignition/packages/core/test/execution/abi.ts similarity index 100% rename from packages/core/test/execution/abi.ts rename to packages/hardhat-ignition/packages/core/test/execution/abi.ts diff --git a/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/core/test/execution/future-processor/named-contract-at-deploy.ts b/packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-at-deploy.ts similarity index 100% rename from packages/core/test/execution/future-processor/named-contract-at-deploy.ts rename to packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-at-deploy.ts diff --git a/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-deploy.ts similarity index 100% rename from packages/core/test/execution/future-processor/named-contract-deploy.ts rename to packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-deploy.ts diff --git a/packages/core/test/execution/future-processor/utils.ts b/packages/hardhat-ignition/packages/core/test/execution/future-processor/utils.ts similarity index 100% rename from packages/core/test/execution/future-processor/utils.ts rename to packages/hardhat-ignition/packages/core/test/execution/future-processor/utils.ts diff --git a/packages/core/test/execution/libraries.ts b/packages/hardhat-ignition/packages/core/test/execution/libraries.ts similarity index 100% rename from packages/core/test/execution/libraries.ts rename to packages/hardhat-ignition/packages/core/test/execution/libraries.ts diff --git a/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/core/test/execution/reducers/running-a-call.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-call.ts similarity index 100% rename from packages/core/test/execution/reducers/running-a-call.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-call.ts diff --git a/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts similarity index 100% rename from packages/core/test/execution/reducers/running-a-named-contract-deploy.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts diff --git a/packages/core/test/execution/reducers/running-a-named-library-deploy.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-library-deploy.ts similarity index 100% rename from packages/core/test/execution/reducers/running-a-named-library-deploy.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-library-deploy.ts diff --git a/packages/core/test/execution/reducers/running-a-read-event-arg.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-read-event-arg.ts similarity index 100% rename from packages/core/test/execution/reducers/running-a-read-event-arg.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-read-event-arg.ts diff --git a/packages/core/test/execution/reducers/running-a-static-call.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-static-call.ts similarity index 100% rename from packages/core/test/execution/reducers/running-a-static-call.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-static-call.ts diff --git a/packages/core/test/execution/reducers/running-contract-at.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-contract-at.ts similarity index 100% rename from packages/core/test/execution/reducers/running-contract-at.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-contract-at.ts diff --git a/packages/core/test/execution/reducers/running-send-data.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/running-send-data.ts similarity index 100% rename from packages/core/test/execution/reducers/running-send-data.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/running-send-data.ts diff --git a/packages/core/test/execution/reducers/start-a-new-run.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/start-a-new-run.ts similarity index 100% rename from packages/core/test/execution/reducers/start-a-new-run.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/start-a-new-run.ts diff --git a/packages/core/test/execution/reducers/utils.ts b/packages/hardhat-ignition/packages/core/test/execution/reducers/utils.ts similarity index 100% rename from packages/core/test/execution/reducers/utils.ts rename to packages/hardhat-ignition/packages/core/test/execution/reducers/utils.ts diff --git a/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/core/test/execution/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition/packages/core/test/execution/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/core/test/execution/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition/packages/core/test/execution/views/find-result-for-future-by-id.ts diff --git a/packages/core/test/getAccount.ts b/packages/hardhat-ignition/packages/core/test/getAccount.ts similarity index 100% rename from packages/core/test/getAccount.ts rename to packages/hardhat-ignition/packages/core/test/getAccount.ts diff --git a/packages/core/test/getParameter.ts b/packages/hardhat-ignition/packages/core/test/getParameter.ts similarity index 100% rename from packages/core/test/getParameter.ts rename to packages/hardhat-ignition/packages/core/test/getParameter.ts diff --git a/packages/core/test/helpers.ts b/packages/hardhat-ignition/packages/core/test/helpers.ts similarity index 100% rename from packages/core/test/helpers.ts rename to packages/hardhat-ignition/packages/core/test/helpers.ts diff --git a/packages/core/test/helpers/exact-interface.ts b/packages/hardhat-ignition/packages/core/test/helpers/exact-interface.ts similarity index 100% rename from packages/core/test/helpers/exact-interface.ts rename to packages/hardhat-ignition/packages/core/test/helpers/exact-interface.ts diff --git a/packages/core/test/helpers/execution-result-fixtures.ts b/packages/hardhat-ignition/packages/core/test/helpers/execution-result-fixtures.ts similarity index 100% rename from packages/core/test/helpers/execution-result-fixtures.ts rename to packages/hardhat-ignition/packages/core/test/helpers/execution-result-fixtures.ts diff --git a/packages/core/test/ignition-module-serializer.ts b/packages/hardhat-ignition/packages/core/test/ignition-module-serializer.ts similarity index 100% rename from packages/core/test/ignition-module-serializer.ts rename to packages/hardhat-ignition/packages/core/test/ignition-module-serializer.ts diff --git a/packages/core/test/library.ts b/packages/hardhat-ignition/packages/core/test/library.ts similarity index 100% rename from packages/core/test/library.ts rename to packages/hardhat-ignition/packages/core/test/library.ts diff --git a/packages/core/test/libraryFromArtifact.ts b/packages/hardhat-ignition/packages/core/test/libraryFromArtifact.ts similarity index 100% rename from packages/core/test/libraryFromArtifact.ts rename to packages/hardhat-ignition/packages/core/test/libraryFromArtifact.ts diff --git a/packages/core/test/list-transactions.ts b/packages/hardhat-ignition/packages/core/test/list-transactions.ts similarity index 100% rename from packages/core/test/list-transactions.ts rename to packages/hardhat-ignition/packages/core/test/list-transactions.ts diff --git a/packages/core/test/listDeployments.ts b/packages/hardhat-ignition/packages/core/test/listDeployments.ts similarity index 100% rename from packages/core/test/listDeployments.ts rename to packages/hardhat-ignition/packages/core/test/listDeployments.ts diff --git a/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank b/packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank similarity index 100% rename from packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank rename to packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank diff --git a/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank b/packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank similarity index 100% rename from packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank rename to packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json diff --git a/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json diff --git a/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json diff --git a/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json diff --git a/packages/core/test/mocks/listTransactions/success/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/listTransactions/success/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/deployed_addresses.json diff --git a/packages/core/test/mocks/listTransactions/success/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/journal.jsonl similarity index 100% rename from packages/core/test/mocks/listTransactions/success/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/journal.jsonl diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json diff --git a/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json diff --git a/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/core/test/mocks/status/external-artifact/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/status/external-artifact/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/deployed_addresses.json diff --git a/packages/core/test/mocks/status/external-artifact/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/journal.jsonl similarity index 100% rename from packages/core/test/mocks/status/external-artifact/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/journal.jsonl diff --git a/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json diff --git a/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/core/test/mocks/status/success/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/status/success/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/status/success/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/status/success/deployed_addresses.json diff --git a/packages/core/test/mocks/status/success/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/status/success/journal.jsonl similarity index 100% rename from packages/core/test/mocks/status/success/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/status/success/journal.jsonl diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json diff --git a/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json diff --git a/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json diff --git a/packages/core/test/mocks/verify/external-artifacts/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/external-artifacts/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/journal.jsonl diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json diff --git a/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json diff --git a/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json diff --git a/packages/core/test/mocks/verify/libraries/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/verify/libraries/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/deployed_addresses.json diff --git a/packages/core/test/mocks/verify/libraries/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/libraries/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/journal.jsonl diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json diff --git a/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json diff --git a/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json diff --git a/packages/core/test/mocks/verify/min-input/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/verify/min-input/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/deployed_addresses.json diff --git a/packages/core/test/mocks/verify/min-input/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/min-input/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/journal.jsonl diff --git a/packages/core/test/mocks/verify/no-contracts/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/no-contracts/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/no-contracts/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/no-contracts/journal.jsonl diff --git a/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json diff --git a/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/core/test/mocks/verify/success/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/success/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/verify/success/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/success/deployed_addresses.json diff --git a/packages/core/test/mocks/verify/success/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/success/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/success/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/success/journal.jsonl diff --git a/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json b/packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json similarity index 100% rename from packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json rename to packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json diff --git a/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl b/packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl similarity index 100% rename from packages/core/test/mocks/verify/unsupported-chain/journal.jsonl rename to packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl diff --git a/packages/core/test/readEventArgument.ts b/packages/hardhat-ignition/packages/core/test/readEventArgument.ts similarity index 100% rename from packages/core/test/readEventArgument.ts rename to packages/hardhat-ignition/packages/core/test/readEventArgument.ts diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/core/test/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileSendData.ts diff --git a/packages/core/test/reconciliation/helpers.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/helpers.ts similarity index 100% rename from packages/core/test/reconciliation/helpers.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/helpers.ts diff --git a/packages/core/test/reconciliation/reconciler.ts b/packages/hardhat-ignition/packages/core/test/reconciliation/reconciler.ts similarity index 100% rename from packages/core/test/reconciliation/reconciler.ts rename to packages/hardhat-ignition/packages/core/test/reconciliation/reconciler.ts diff --git a/packages/core/test/send.ts b/packages/hardhat-ignition/packages/core/test/send.ts similarity index 100% rename from packages/core/test/send.ts rename to packages/hardhat-ignition/packages/core/test/send.ts diff --git a/packages/core/test/setup.ts b/packages/hardhat-ignition/packages/core/test/setup.ts similarity index 100% rename from packages/core/test/setup.ts rename to packages/hardhat-ignition/packages/core/test/setup.ts diff --git a/packages/core/test/staticCall.ts b/packages/hardhat-ignition/packages/core/test/staticCall.ts similarity index 100% rename from packages/core/test/staticCall.ts rename to packages/hardhat-ignition/packages/core/test/staticCall.ts diff --git a/packages/core/test/status.ts b/packages/hardhat-ignition/packages/core/test/status.ts similarity index 100% rename from packages/core/test/status.ts rename to packages/hardhat-ignition/packages/core/test/status.ts diff --git a/packages/core/test/types/deployment-loader.ts b/packages/hardhat-ignition/packages/core/test/types/deployment-loader.ts similarity index 100% rename from packages/core/test/types/deployment-loader.ts rename to packages/hardhat-ignition/packages/core/test/types/deployment-loader.ts diff --git a/packages/core/test/types/module.ts b/packages/hardhat-ignition/packages/core/test/types/module.ts similarity index 100% rename from packages/core/test/types/module.ts rename to packages/hardhat-ignition/packages/core/test/types/module.ts diff --git a/packages/core/test/useModule.ts b/packages/hardhat-ignition/packages/core/test/useModule.ts similarity index 100% rename from packages/core/test/useModule.ts rename to packages/hardhat-ignition/packages/core/test/useModule.ts diff --git a/packages/core/test/utils/adjacency-list.ts b/packages/hardhat-ignition/packages/core/test/utils/adjacency-list.ts similarity index 100% rename from packages/core/test/utils/adjacency-list.ts rename to packages/hardhat-ignition/packages/core/test/utils/adjacency-list.ts diff --git a/packages/core/test/utils/check-automined-network.ts b/packages/hardhat-ignition/packages/core/test/utils/check-automined-network.ts similarity index 100% rename from packages/core/test/utils/check-automined-network.ts rename to packages/hardhat-ignition/packages/core/test/utils/check-automined-network.ts diff --git a/packages/core/test/utils/future-id-builders.ts b/packages/hardhat-ignition/packages/core/test/utils/future-id-builders.ts similarity index 100% rename from packages/core/test/utils/future-id-builders.ts rename to packages/hardhat-ignition/packages/core/test/utils/future-id-builders.ts diff --git a/packages/core/test/utils/replace-within-arg.ts b/packages/hardhat-ignition/packages/core/test/utils/replace-within-arg.ts similarity index 100% rename from packages/core/test/utils/replace-within-arg.ts rename to packages/hardhat-ignition/packages/core/test/utils/replace-within-arg.ts diff --git a/packages/core/test/validations/id-rules.ts b/packages/hardhat-ignition/packages/core/test/validations/id-rules.ts similarity index 100% rename from packages/core/test/validations/id-rules.ts rename to packages/hardhat-ignition/packages/core/test/validations/id-rules.ts diff --git a/packages/core/test/validations/identifier-validators.ts b/packages/hardhat-ignition/packages/core/test/validations/identifier-validators.ts similarity index 100% rename from packages/core/test/validations/identifier-validators.ts rename to packages/hardhat-ignition/packages/core/test/validations/identifier-validators.ts diff --git a/packages/core/test/verify.ts b/packages/hardhat-ignition/packages/core/test/verify.ts similarity index 100% rename from packages/core/test/verify.ts rename to packages/hardhat-ignition/packages/core/test/verify.ts diff --git a/packages/core/test/wipe.ts b/packages/hardhat-ignition/packages/core/test/wipe.ts similarity index 100% rename from packages/core/test/wipe.ts rename to packages/hardhat-ignition/packages/core/test/wipe.ts diff --git a/packages/core/tsconfig.json b/packages/hardhat-ignition/packages/core/tsconfig.json similarity index 100% rename from packages/core/tsconfig.json rename to packages/hardhat-ignition/packages/core/tsconfig.json diff --git a/packages/hardhat-plugin-ethers/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin-ethers/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.eslintrc.js diff --git a/packages/hardhat-plugin-ethers/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.gitignore similarity index 100% rename from packages/hardhat-plugin-ethers/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.gitignore diff --git a/packages/hardhat-plugin-ethers/.mocharc.json b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.mocharc.json similarity index 100% rename from packages/hardhat-plugin-ethers/.mocharc.json rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.mocharc.json diff --git a/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.npmignore similarity index 100% rename from packages/hardhat-plugin-ethers/.npmignore rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.npmignore diff --git a/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.nycrc similarity index 100% rename from packages/hardhat-plugin-ethers/.nycrc rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.nycrc diff --git a/packages/hardhat-plugin-ethers/.prettierignore b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.prettierignore similarity index 100% rename from packages/hardhat-plugin-ethers/.prettierignore rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/.prettierignore diff --git a/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/CHANGELOG.md similarity index 100% rename from packages/hardhat-plugin-ethers/CHANGELOG.md rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/CHANGELOG.md diff --git a/packages/hardhat-plugin-ethers/README.md b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/README.md similarity index 100% rename from packages/hardhat-plugin-ethers/README.md rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/README.md diff --git a/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/package.json similarity index 100% rename from packages/hardhat-plugin-ethers/package.json rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/package.json diff --git a/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts similarity index 100% rename from packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts diff --git a/packages/hardhat-plugin-ethers/src/index.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/index.ts similarity index 100% rename from packages/hardhat-plugin-ethers/src/index.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/index.ts diff --git a/packages/hardhat-plugin-ethers/src/type-extensions.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/type-extensions.ts similarity index 100% rename from packages/hardhat-plugin-ethers/src/type-extensions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/type-extensions.ts diff --git a/packages/hardhat-plugin-ethers/test/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/.eslintrc.js diff --git a/packages/hardhat-plugin-ethers/test/default-sender.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/default-sender.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/default-sender.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/default-sender.ts diff --git a/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-plugin-ethers/test/setup.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/setup.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/setup.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/setup.ts diff --git a/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-plugin-ethers/tsconfig.json b/packages/hardhat-ignition/packages/hardhat-plugin-ethers/tsconfig.json similarity index 100% rename from packages/hardhat-plugin-ethers/tsconfig.json rename to packages/hardhat-ignition/packages/hardhat-plugin-ethers/tsconfig.json diff --git a/packages/hardhat-plugin-viem/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin-viem/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.eslintrc.js diff --git a/packages/hardhat-plugin-viem/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.gitignore similarity index 100% rename from packages/hardhat-plugin-viem/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.gitignore diff --git a/packages/hardhat-plugin-viem/.mocharc.json b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.mocharc.json similarity index 100% rename from packages/hardhat-plugin-viem/.mocharc.json rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.mocharc.json diff --git a/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.npmignore similarity index 100% rename from packages/hardhat-plugin-viem/.npmignore rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.npmignore diff --git a/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.nycrc similarity index 100% rename from packages/hardhat-plugin-viem/.nycrc rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.nycrc diff --git a/packages/hardhat-plugin-viem/.prettierignore b/packages/hardhat-ignition/packages/hardhat-plugin-viem/.prettierignore similarity index 100% rename from packages/hardhat-plugin-viem/.prettierignore rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/.prettierignore diff --git a/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-ignition/packages/hardhat-plugin-viem/CHANGELOG.md similarity index 100% rename from packages/hardhat-plugin-viem/CHANGELOG.md rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/CHANGELOG.md diff --git a/packages/hardhat-plugin-viem/README.md b/packages/hardhat-ignition/packages/hardhat-plugin-viem/README.md similarity index 100% rename from packages/hardhat-plugin-viem/README.md rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/README.md diff --git a/packages/hardhat-plugin-viem/package.json b/packages/hardhat-ignition/packages/hardhat-plugin-viem/package.json similarity index 100% rename from packages/hardhat-plugin-viem/package.json rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/package.json diff --git a/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts similarity index 100% rename from packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts diff --git a/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts similarity index 100% rename from packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts diff --git a/packages/hardhat-plugin-viem/src/index.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/index.ts similarity index 100% rename from packages/hardhat-plugin-viem/src/index.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/src/index.ts diff --git a/packages/hardhat-plugin-viem/src/type-extensions.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/type-extensions.ts similarity index 100% rename from packages/hardhat-plugin-viem/src/type-extensions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/src/type-extensions.ts diff --git a/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts similarity index 100% rename from packages/hardhat-plugin-viem/src/viem-ignition-helper.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts diff --git a/packages/hardhat-plugin-viem/test/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin-viem/test/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/.eslintrc.js diff --git a/packages/hardhat-plugin-viem/test/default-sender.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/default-sender.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/default-sender.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/default-sender.ts diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-plugin-viem/test/setup.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/setup.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/setup.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/setup.ts diff --git a/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-plugin-viem/test/use-module.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/use-module.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/use-module.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/use-module.ts diff --git a/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts diff --git a/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts diff --git a/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts diff --git a/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts diff --git a/packages/hardhat-plugin-viem/test/viem-results.ts b/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-results.ts similarity index 100% rename from packages/hardhat-plugin-viem/test/viem-results.ts rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-results.ts diff --git a/packages/hardhat-plugin-viem/tsconfig.json b/packages/hardhat-ignition/packages/hardhat-plugin-viem/tsconfig.json similarity index 100% rename from packages/hardhat-plugin-viem/tsconfig.json rename to packages/hardhat-ignition/packages/hardhat-plugin-viem/tsconfig.json diff --git a/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin/.eslintrc.js diff --git a/packages/hardhat-plugin/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin/.gitignore similarity index 100% rename from packages/hardhat-plugin/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin/.gitignore diff --git a/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-ignition/packages/hardhat-plugin/.mocharc.json similarity index 100% rename from packages/hardhat-plugin/.mocharc.json rename to packages/hardhat-ignition/packages/hardhat-plugin/.mocharc.json diff --git a/packages/hardhat-plugin/.npmignore b/packages/hardhat-ignition/packages/hardhat-plugin/.npmignore similarity index 100% rename from packages/hardhat-plugin/.npmignore rename to packages/hardhat-ignition/packages/hardhat-plugin/.npmignore diff --git a/packages/hardhat-plugin/.nycrc b/packages/hardhat-ignition/packages/hardhat-plugin/.nycrc similarity index 100% rename from packages/hardhat-plugin/.nycrc rename to packages/hardhat-ignition/packages/hardhat-plugin/.nycrc diff --git a/packages/hardhat-plugin/.prettierignore b/packages/hardhat-ignition/packages/hardhat-plugin/.prettierignore similarity index 100% rename from packages/hardhat-plugin/.prettierignore rename to packages/hardhat-ignition/packages/hardhat-plugin/.prettierignore diff --git a/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-ignition/packages/hardhat-plugin/CHANGELOG.md similarity index 100% rename from packages/hardhat-plugin/CHANGELOG.md rename to packages/hardhat-ignition/packages/hardhat-plugin/CHANGELOG.md diff --git a/packages/hardhat-plugin/README.md b/packages/hardhat-ignition/packages/hardhat-plugin/README.md similarity index 100% rename from packages/hardhat-plugin/README.md rename to packages/hardhat-ignition/packages/hardhat-plugin/README.md diff --git a/packages/hardhat-plugin/package.json b/packages/hardhat-ignition/packages/hardhat-plugin/package.json similarity index 100% rename from packages/hardhat-plugin/package.json rename to packages/hardhat-ignition/packages/hardhat-plugin/package.json diff --git a/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts similarity index 100% rename from packages/hardhat-plugin/src/hardhat-artifact-resolver.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts diff --git a/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/helpers.ts similarity index 100% rename from packages/hardhat-plugin/src/helpers.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/helpers.ts diff --git a/packages/hardhat-plugin/src/index.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/index.ts similarity index 100% rename from packages/hardhat-plugin/src/index.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/index.ts diff --git a/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/modules.ts similarity index 100% rename from packages/hardhat-plugin/src/modules.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/modules.ts diff --git a/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/type-extensions.ts similarity index 100% rename from packages/hardhat-plugin/src/type-extensions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/type-extensions.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts diff --git a/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts diff --git a/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/pretty-event-handler.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/pretty-event-handler.ts diff --git a/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/types.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/types.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/types.ts diff --git a/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/verbose-event-handler.ts similarity index 100% rename from packages/hardhat-plugin/src/ui/verbose-event-handler.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/ui/verbose-event-handler.ts diff --git a/packages/hardhat-plugin/src/utils/bigintReviver.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/bigintReviver.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/bigintReviver.ts diff --git a/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts diff --git a/packages/hardhat-plugin/src/utils/load-module.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/load-module.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/load-module.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/load-module.ts diff --git a/packages/hardhat-plugin/src/utils/open.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/open.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/open.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/open.ts diff --git a/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/read-deployment-parameters.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts diff --git a/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts diff --git a/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts diff --git a/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-ignition/packages/hardhat-plugin/src/visualization/write-visualization.ts similarity index 100% rename from packages/hardhat-plugin/src/visualization/write-visualization.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/src/visualization/write-visualization.ts diff --git a/packages/hardhat-plugin/test/.eslintrc.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/.eslintrc.js similarity index 100% rename from packages/hardhat-plugin/test/.eslintrc.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/.eslintrc.js diff --git a/packages/hardhat-plugin/test/config.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/config.ts similarity index 100% rename from packages/hardhat-plugin/test/config.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/config.ts diff --git a/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/default-sender.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/default-sender.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/default-sender.ts diff --git a/packages/hardhat-plugin/test/deploy/gas-estimation.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/gas-estimation.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/gas-estimation.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/gas-estimation.ts diff --git a/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts diff --git a/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts diff --git a/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts diff --git a/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts diff --git a/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts diff --git a/packages/hardhat-plugin/test/deploy/reset.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/reset.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/reset.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/reset.ts diff --git a/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts diff --git a/packages/hardhat-plugin/test/deploy/writeLocalhost.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/writeLocalhost.ts similarity index 100% rename from packages/hardhat-plugin/test/deploy/writeLocalhost.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/writeLocalhost.ts diff --git a/packages/hardhat-plugin/test/fixture-projects/.gitignore b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/.gitignore rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/.gitignore diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json diff --git a/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js diff --git a/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore diff --git a/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js diff --git a/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-plugin/test/ignition-helper-guard.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ignition-helper-guard.ts similarity index 100% rename from packages/hardhat-plugin/test/ignition-helper-guard.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ignition-helper-guard.ts diff --git a/packages/hardhat-plugin/test/module-api/calls.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/calls.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/calls.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/calls.ts diff --git a/packages/hardhat-plugin/test/module-api/contracts.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/contracts.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/contracts.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/contracts.ts diff --git a/packages/hardhat-plugin/test/module-api/events.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/events.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/events.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/events.ts diff --git a/packages/hardhat-plugin/test/module-api/existing-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/existing-contract.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/existing-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/existing-contract.ts diff --git a/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/fully-qualified-names.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts diff --git a/packages/hardhat-plugin/test/module-api/libraries.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/libraries.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/libraries.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/libraries.ts diff --git a/packages/hardhat-plugin/test/module-api/params.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/params.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/params.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/params.ts diff --git a/packages/hardhat-plugin/test/module-api/static-calls.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/static-calls.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/static-calls.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/static-calls.ts diff --git a/packages/hardhat-plugin/test/module-api/use-module.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/use-module.ts similarity index 100% rename from packages/hardhat-plugin/test/module-api/use-module.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/use-module.ts diff --git a/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/module-parameters.ts similarity index 100% rename from packages/hardhat-plugin/test/module-parameters.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/module-parameters.ts diff --git a/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/plan/index.ts similarity index 100% rename from packages/hardhat-plugin/test/plan/index.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/plan/index.ts diff --git a/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/setup.ts similarity index 100% rename from packages/hardhat-plugin/test/setup.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/setup.ts diff --git a/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/create2.ts similarity index 100% rename from packages/hardhat-plugin/test/strategies/create2.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/create2.ts diff --git a/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts similarity index 100% rename from packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts diff --git a/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts similarity index 100% rename from packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts diff --git a/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts diff --git a/packages/hardhat-plugin/test/test-helpers/createX-tx.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/createX-tx.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/createX-tx.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/createX-tx.ts diff --git a/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/get-balance-for.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts diff --git a/packages/hardhat-plugin/test/test-helpers/mine-block.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/mine-block.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/mine-block.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/mine-block.ts diff --git a/packages/hardhat-plugin/test/test-helpers/sleep.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/sleep.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/sleep.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/sleep.ts diff --git a/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts diff --git a/packages/hardhat-plugin/test/test-helpers/type-helper.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/type-helper.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/type-helper.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/type-helper.ts diff --git a/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts similarity index 100% rename from packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-plugin/test/ui/helpers/test-format.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/test-format.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/helpers/test-format.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/test-format.ts diff --git a/packages/hardhat-plugin/test/ui/pretty-event-handler.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-plugin/test/ui/pretty-event-handler.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/ui/pretty-event-handler.ts diff --git a/packages/hardhat-plugin/test/utils/bigintReviver.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-plugin/test/utils/bigintReviver.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/utils/bigintReviver.ts diff --git a/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-plugin/test/utils/load-module.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/load-module.ts similarity index 100% rename from packages/hardhat-plugin/test/utils/load-module.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/utils/load-module.ts diff --git a/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-plugin/test/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts diff --git a/packages/hardhat-plugin/test/verify/index.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/index.ts similarity index 100% rename from packages/hardhat-plugin/test/verify/index.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/verify/index.ts diff --git a/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts b/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts rename to packages/hardhat-ignition/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts diff --git a/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-ignition/packages/hardhat-plugin/tsconfig.json similarity index 100% rename from packages/hardhat-plugin/tsconfig.json rename to packages/hardhat-ignition/packages/hardhat-plugin/tsconfig.json diff --git a/packages/ui/.eslintrc.cjs b/packages/hardhat-ignition/packages/ui/.eslintrc.cjs similarity index 100% rename from packages/ui/.eslintrc.cjs rename to packages/hardhat-ignition/packages/ui/.eslintrc.cjs diff --git a/packages/ui/.gitignore b/packages/hardhat-ignition/packages/ui/.gitignore similarity index 100% rename from packages/ui/.gitignore rename to packages/hardhat-ignition/packages/ui/.gitignore diff --git a/packages/ui/.mocharc.json b/packages/hardhat-ignition/packages/ui/.mocharc.json similarity index 100% rename from packages/ui/.mocharc.json rename to packages/hardhat-ignition/packages/ui/.mocharc.json diff --git a/packages/ui/.npmignore b/packages/hardhat-ignition/packages/ui/.npmignore similarity index 100% rename from packages/ui/.npmignore rename to packages/hardhat-ignition/packages/ui/.npmignore diff --git a/packages/ui/.nycrc b/packages/hardhat-ignition/packages/ui/.nycrc similarity index 100% rename from packages/ui/.nycrc rename to packages/hardhat-ignition/packages/ui/.nycrc diff --git a/packages/ui/CHANGELOG.md b/packages/hardhat-ignition/packages/ui/CHANGELOG.md similarity index 100% rename from packages/ui/CHANGELOG.md rename to packages/hardhat-ignition/packages/ui/CHANGELOG.md diff --git a/packages/ui/README.md b/packages/hardhat-ignition/packages/ui/README.md similarity index 100% rename from packages/ui/README.md rename to packages/hardhat-ignition/packages/ui/README.md diff --git a/packages/ui/examples/ComplexModule.js b/packages/hardhat-ignition/packages/ui/examples/ComplexModule.js similarity index 100% rename from packages/ui/examples/ComplexModule.js rename to packages/hardhat-ignition/packages/ui/examples/ComplexModule.js diff --git a/packages/ui/index.html b/packages/hardhat-ignition/packages/ui/index.html similarity index 100% rename from packages/ui/index.html rename to packages/hardhat-ignition/packages/ui/index.html diff --git a/packages/ui/package.json b/packages/hardhat-ignition/packages/ui/package.json similarity index 100% rename from packages/ui/package.json rename to packages/hardhat-ignition/packages/ui/package.json diff --git a/packages/ui/public/.gitkeep b/packages/hardhat-ignition/packages/ui/public/.gitkeep similarity index 100% rename from packages/ui/public/.gitkeep rename to packages/hardhat-ignition/packages/ui/public/.gitkeep diff --git a/packages/ui/scripts/generate-example-deployment-json.js b/packages/hardhat-ignition/packages/ui/scripts/generate-example-deployment-json.js similarity index 100% rename from packages/ui/scripts/generate-example-deployment-json.js rename to packages/hardhat-ignition/packages/ui/scripts/generate-example-deployment-json.js diff --git a/packages/ui/src/assets/ExternalLinkIcon.tsx b/packages/hardhat-ignition/packages/ui/src/assets/ExternalLinkIcon.tsx similarity index 100% rename from packages/ui/src/assets/ExternalLinkIcon.tsx rename to packages/hardhat-ignition/packages/ui/src/assets/ExternalLinkIcon.tsx diff --git a/packages/ui/src/assets/TooltipIcon.tsx b/packages/hardhat-ignition/packages/ui/src/assets/TooltipIcon.tsx similarity index 100% rename from packages/ui/src/assets/TooltipIcon.tsx rename to packages/hardhat-ignition/packages/ui/src/assets/TooltipIcon.tsx diff --git a/packages/ui/src/assets/purple-rocket.png b/packages/hardhat-ignition/packages/ui/src/assets/purple-rocket.png similarity index 100% rename from packages/ui/src/assets/purple-rocket.png rename to packages/hardhat-ignition/packages/ui/src/assets/purple-rocket.png diff --git a/packages/ui/src/components/mermaid.tsx b/packages/hardhat-ignition/packages/ui/src/components/mermaid.tsx similarity index 100% rename from packages/ui/src/components/mermaid.tsx rename to packages/hardhat-ignition/packages/ui/src/components/mermaid.tsx diff --git a/packages/ui/src/components/socials/dc-logo.tsx b/packages/hardhat-ignition/packages/ui/src/components/socials/dc-logo.tsx similarity index 100% rename from packages/ui/src/components/socials/dc-logo.tsx rename to packages/hardhat-ignition/packages/ui/src/components/socials/dc-logo.tsx diff --git a/packages/ui/src/components/socials/gh-logo.tsx b/packages/hardhat-ignition/packages/ui/src/components/socials/gh-logo.tsx similarity index 100% rename from packages/ui/src/components/socials/gh-logo.tsx rename to packages/hardhat-ignition/packages/ui/src/components/socials/gh-logo.tsx diff --git a/packages/ui/src/components/socials/index.tsx b/packages/hardhat-ignition/packages/ui/src/components/socials/index.tsx similarity index 100% rename from packages/ui/src/components/socials/index.tsx rename to packages/hardhat-ignition/packages/ui/src/components/socials/index.tsx diff --git a/packages/ui/src/components/socials/tw-logo.tsx b/packages/hardhat-ignition/packages/ui/src/components/socials/tw-logo.tsx similarity index 100% rename from packages/ui/src/components/socials/tw-logo.tsx rename to packages/hardhat-ignition/packages/ui/src/components/socials/tw-logo.tsx diff --git a/packages/ui/src/main.css b/packages/hardhat-ignition/packages/ui/src/main.css similarity index 100% rename from packages/ui/src/main.css rename to packages/hardhat-ignition/packages/ui/src/main.css diff --git a/packages/ui/src/main.tsx b/packages/hardhat-ignition/packages/ui/src/main.tsx similarity index 100% rename from packages/ui/src/main.tsx rename to packages/hardhat-ignition/packages/ui/src/main.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/components/execution-batches.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-batch.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/components/future-batch.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-batch.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-header.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/components/future-header.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-header.tsx diff --git a/packages/ui/src/pages/visualization-overview/components/summary.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/summary.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/components/summary.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/summary.tsx diff --git a/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/visualization-overview.tsx similarity index 100% rename from packages/ui/src/pages/visualization-overview/visualization-overview.tsx rename to packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/visualization-overview.tsx diff --git a/packages/ui/src/queries/futures.ts b/packages/hardhat-ignition/packages/ui/src/queries/futures.ts similarity index 100% rename from packages/ui/src/queries/futures.ts rename to packages/hardhat-ignition/packages/ui/src/queries/futures.ts diff --git a/packages/ui/src/utils/argumentTypeToString.tsx b/packages/hardhat-ignition/packages/ui/src/utils/argumentTypeToString.tsx similarity index 100% rename from packages/ui/src/utils/argumentTypeToString.tsx rename to packages/hardhat-ignition/packages/ui/src/utils/argumentTypeToString.tsx diff --git a/packages/ui/src/utils/to-escaped-id.ts b/packages/hardhat-ignition/packages/ui/src/utils/to-escaped-id.ts similarity index 100% rename from packages/ui/src/utils/to-escaped-id.ts rename to packages/hardhat-ignition/packages/ui/src/utils/to-escaped-id.ts diff --git a/packages/ui/src/utils/to-mermaid.ts b/packages/hardhat-ignition/packages/ui/src/utils/to-mermaid.ts similarity index 100% rename from packages/ui/src/utils/to-mermaid.ts rename to packages/hardhat-ignition/packages/ui/src/utils/to-mermaid.ts diff --git a/packages/ui/src/vite-env.d.ts b/packages/hardhat-ignition/packages/ui/src/vite-env.d.ts similarity index 100% rename from packages/ui/src/vite-env.d.ts rename to packages/hardhat-ignition/packages/ui/src/vite-env.d.ts diff --git a/packages/ui/test/to-mermaid.ts b/packages/hardhat-ignition/packages/ui/test/to-mermaid.ts similarity index 100% rename from packages/ui/test/to-mermaid.ts rename to packages/hardhat-ignition/packages/ui/test/to-mermaid.ts diff --git a/packages/ui/tsconfig.json b/packages/hardhat-ignition/packages/ui/tsconfig.json similarity index 100% rename from packages/ui/tsconfig.json rename to packages/hardhat-ignition/packages/ui/tsconfig.json diff --git a/packages/ui/tsconfig.node.json b/packages/hardhat-ignition/packages/ui/tsconfig.node.json similarity index 100% rename from packages/ui/tsconfig.node.json rename to packages/hardhat-ignition/packages/ui/tsconfig.node.json diff --git a/packages/ui/vite.config.ts b/packages/hardhat-ignition/packages/ui/vite.config.ts similarity index 100% rename from packages/ui/vite.config.ts rename to packages/hardhat-ignition/packages/ui/vite.config.ts diff --git a/pnpm-lock.yaml b/packages/hardhat-ignition/pnpm-lock.yaml similarity index 100% rename from pnpm-lock.yaml rename to packages/hardhat-ignition/pnpm-lock.yaml diff --git a/pnpm-workspace.yaml b/packages/hardhat-ignition/pnpm-workspace.yaml similarity index 100% rename from pnpm-workspace.yaml rename to packages/hardhat-ignition/pnpm-workspace.yaml From 514ac3b79bc68b10e6cffd5e2239e171a91ffde0 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 15 Jan 2025 17:14:00 -0500 Subject: [PATCH 1298/1302] rename hardhat-ignition dir containing migrated repo to hardhat-ignition-legacy --- .../.devcontainer/devcontainer.json | 0 .../.editorconfig | 0 .../.gitattributes | 0 .../.github/ISSUE_TEMPLATE/bug-report.yml | 0 .../.github/ISSUE_TEMPLATE/config.yml | 0 .../.github/ISSUE_TEMPLATE/feature-request.yml | 0 .../.github/ISSUE_TEMPLATE/other-issue.md | 0 .../.github/workflows/ci.yml | 0 .../review-requested-slack-notification.yml | 0 .../review-submitted-slack-notification.yml | 0 .../.gitignore | 0 .../.prettierrc | 0 .../.vscode/launch.json | 0 .../.vscode/tasks.json | 0 .../CONTRIBUTING.md | 0 .../LICENSE | 0 .../README.md | 0 .../config/eslint/eslintrc.js | 0 .../config/typescript/tsconfig.json | 0 .../examples/.gitignore | 0 .../examples/complete/.eslintrc.js | 0 .../examples/complete/.gitignore | 0 .../examples/complete/.prettierignore | 0 .../examples/complete/README.md | 0 .../examples/complete/contracts/BasicContract.sol | 0 .../examples/complete/contracts/BasicLibrary.sol | 0 .../complete/contracts/ContractWithLibrary.sol | 0 .../examples/complete/hardhat.config.js | 0 .../complete/ignition/modules/CompleteModule.js | 0 .../complete/libArtifacts/BasicLibrary.json | 0 .../complete/libArtifacts/ContractWithLibrary.json | 0 .../examples/complete/package.json | 0 .../examples/complete/test/Complete.js | 0 .../examples/ens/.eslintrc.js | 0 .../examples/ens/.gitignore | 0 .../examples/ens/.prettierignore | 0 .../examples/ens/README.md | 0 .../examples/ens/contracts/ENS.sol | 0 .../examples/ens/contracts/ReverseRegistrar.sol | 0 .../examples/ens/hardhat.config.js | 0 .../examples/ens/ignition/modules/ENS.js | 0 .../examples/ens/ignition/modules/test-registrar.js | 0 .../examples/ens/package.json | 0 .../examples/ens/scripts/deploy-ens.js | 0 .../examples/ens/test/sample-test.js | 0 .../examples/fee-tester/.eslintrc.js | 0 .../examples/fee-tester/.gitignore | 0 .../examples/fee-tester/.prettierignore | 0 .../examples/fee-tester/README.md | 0 .../examples/fee-tester/contracts/FeeTester.sol | 0 .../examples/fee-tester/hardhat.config.js | 0 .../fee-tester/ignition/modules/FeeTesterModule.js | 0 .../examples/fee-tester/package.json | 0 .../examples/sample/.eslintrc.js | 0 .../examples/sample/.gitignore | 0 .../examples/sample/.prettierignore | 0 .../examples/sample/README.md | 0 .../examples/sample/contracts/Lock.sol | 0 .../examples/sample/hardhat.config.js | 0 .../examples/sample/ignition/modules/LockModule.js | 0 .../examples/sample/package.json | 0 .../examples/sample/scripts/bump.js | 0 .../examples/sample/test/Lock.js | 0 .../examples/ts-sample/.eslintrc.js | 0 .../examples/ts-sample/.gitignore | 0 .../examples/ts-sample/.prettierignore | 0 .../examples/ts-sample/README.md | 0 .../examples/ts-sample/contracts/Lock.sol | 0 .../examples/ts-sample/hardhat.config.ts | 0 .../ts-sample/ignition/modules/LockModule.ts | 0 .../examples/ts-sample/package.json | 0 .../examples/ts-sample/test/Lock.ts | 0 .../examples/ts-sample/tsconfig.json | 0 .../examples/upgradeable/.eslintrc.js | 0 .../examples/upgradeable/.gitignore | 0 .../examples/upgradeable/.prettierignore | 0 .../examples/upgradeable/README.md | 0 .../examples/upgradeable/contracts/Demo.sol | 0 .../examples/upgradeable/contracts/DemoV2.sol | 0 .../examples/upgradeable/contracts/Proxies.sol | 0 .../examples/upgradeable/hardhat.config.js | 0 .../upgradeable/ignition/modules/ProxyModule.js | 0 .../upgradeable/ignition/modules/UpgradeModule.js | 0 .../examples/upgradeable/package.json | 0 .../examples/upgradeable/test/ProxyDemo.js | 0 .../examples/viem-sample/.eslintrc.js | 0 .../examples/viem-sample/.gitignore | 0 .../examples/viem-sample/.prettierignore | 0 .../examples/viem-sample/README.md | 0 .../examples/viem-sample/contracts/Lock.sol | 0 .../examples/viem-sample/hardhat.config.ts | 0 .../viem-sample/ignition/modules/LockModule.ts | 0 .../examples/viem-sample/package.json | 0 .../examples/viem-sample/test/Lock.ts | 0 .../examples/viem-sample/tsconfig.json | 0 .../package.json | 0 .../packages/core/.eslintrc.js | 0 .../packages/core/.gitignore | 0 .../packages/core/.mocharc.json | 0 .../packages/core/.npmignore | 0 .../packages/core/.nycrc | 0 .../packages/core/.prettierignore | 0 .../packages/core/.prettierrc | 0 .../packages/core/CHANGELOG.md | 0 .../packages/core/README.md | 0 .../packages/core/api-extractor.json | 0 .../packages/core/package.json | 0 .../packages/core/src/batches.ts | 0 .../packages/core/src/build-module.ts | 0 .../packages/core/src/deploy.ts | 0 .../packages/core/src/errors.ts | 0 .../packages/core/src/ignition-module-serializer.ts | 0 .../packages/core/src/index.ts | 0 .../packages/core/src/internal/batcher.ts | 0 .../packages/core/src/internal/chain-config.ts | 0 .../packages/core/src/internal/defaultConfig.ts | 0 .../packages/core/src/internal/deployer.ts | 0 .../ephemeral-deployment-loader.ts | 0 .../deployment-loader/file-deployment-loader.ts | 0 .../core/src/internal/deployment-loader/types.ts | 0 .../packages/core/src/internal/errors-list.ts | 0 .../packages/core/src/internal/execution/abi.ts | 0 .../internal/execution/deployment-state-helpers.ts | 0 .../core/src/internal/execution/execution-engine.ts | 0 .../execution/execution-strategy-helpers.ts | 0 .../execution/future-processor/future-processor.ts | 0 .../handlers/monitor-onchain-interaction.ts | 0 .../future-processor/handlers/query-static-call.ts | 0 .../future-processor/handlers/run-strategy.ts | 0 .../future-processor/handlers/send-transaction.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/decode-simulation-result.ts | 0 .../future-processor/helpers/future-resolvers.ts | 0 .../future-processor/helpers/messages-helpers.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../helpers/next-action-for-execution-state.ts | 0 .../future-processor/helpers/replay-strategy.ts | 0 .../helpers/save-artifacts-for-future.ts | 0 .../core/src/internal/execution/jsonrpc-client.ts | 0 .../core/src/internal/execution/libraries.ts | 0 .../get-max-nonce-used-by-sender.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../nonce-management/json-rpc-nonce-manager.ts | 0 .../execution/reducers/deployment-state-reducer.ts | 0 .../execution/reducers/execution-state-reducer.ts | 0 .../reducers/helpers/complete-execution-state.ts | 0 .../reducers/helpers/deployment-state-helpers.ts | 0 .../execution/reducers/helpers/initializers.ts | 0 .../reducers/helpers/network-interaction-helpers.ts | 0 .../internal/execution/strategy/createx-artifact.ts | 0 .../execution/transaction-tracking-timer.ts | 0 .../core/src/internal/execution/type-helpers.ts | 0 .../internal/execution/types/deployment-state.ts | 0 .../src/internal/execution/types/evm-execution.ts | 0 .../internal/execution/types/execution-result.ts | 0 .../src/internal/execution/types/execution-state.ts | 0 .../internal/execution/types/execution-strategy.ts | 0 .../core/src/internal/execution/types/jsonrpc.ts | 0 .../core/src/internal/execution/types/messages.ts | 0 .../internal/execution/types/network-interaction.ts | 0 .../core/src/internal/execution/utils/address.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../internal/execution/utils/get-default-sender.ts | 0 .../packages/core/src/internal/formatters.ts | 0 .../core/src/internal/journal/file-journal.ts | 0 .../core/src/internal/journal/memory-journal.ts | 0 .../core/src/internal/journal/types/index.ts | 0 .../internal/journal/utils/deserialize-replacer.ts | 0 .../internal/journal/utils/emitExecutionEvent.ts | 0 .../failedEvmExecutionResultToErrorDescription.ts | 0 .../packages/core/src/internal/journal/utils/log.ts | 0 .../internal/journal/utils/serialize-replacer.ts | 0 .../packages/core/src/internal/module-builder.ts | 0 .../packages/core/src/internal/module.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../src/internal/reconciliation/helpers/compare.ts | 0 .../reconciliation/helpers/reconcile-address.ts | 0 .../reconciliation/helpers/reconcile-arguments.ts | 0 .../reconciliation/helpers/reconcile-artifacts.ts | 0 .../helpers/reconcile-contract-name.ts | 0 .../reconciliation/helpers/reconcile-contract.ts | 0 .../reconciliation/helpers/reconcile-data.ts | 0 .../reconciliation/helpers/reconcile-from.ts | 0 .../helpers/reconcile-function-name.ts | 0 .../reconciliation/helpers/reconcile-libraries.ts | 0 .../reconciliation/helpers/reconcile-strategy.ts | 0 .../reconciliation/helpers/reconcile-value.ts | 0 .../reconcile-current-and-previous-type-match.ts | 0 .../reconciliation/reconcile-dependency-rules.ts | 0 .../reconcile-future-specific-reconciliations.ts | 0 .../core/src/internal/reconciliation/reconciler.ts | 0 .../core/src/internal/reconciliation/types.ts | 0 .../core/src/internal/reconciliation/utils.ts | 0 .../packages/core/src/internal/topological-order.ts | 0 .../packages/core/src/internal/utils.ts | 0 .../src/internal/utils/adjacency-list-converter.ts | 0 .../core/src/internal/utils/adjacency-list.ts | 0 .../packages/core/src/internal/utils/assertions.ts | 0 .../src/internal/utils/check-automined-network.ts | 0 .../core/src/internal/utils/future-id-builders.ts | 0 .../src/internal/utils/get-futures-from-module.ts | 0 .../src/internal/utils/identifier-validators.ts | 0 .../core/src/internal/utils/replace-within-arg.ts | 0 .../src/internal/utils/resolve-module-parameter.ts | 0 .../futures/validateArtifactContractAt.ts | 0 .../futures/validateArtifactContractDeployment.ts | 0 .../futures/validateArtifactLibraryDeployment.ts | 0 .../validation/futures/validateNamedContractAt.ts | 0 .../validation/futures/validateNamedContractCall.ts | 0 .../futures/validateNamedContractDeployment.ts | 0 .../futures/validateNamedEncodeFunctionCall.ts | 0 .../futures/validateNamedLibraryDeployment.ts | 0 .../validation/futures/validateNamedStaticCall.ts | 0 .../validation/futures/validateReadEventArgument.ts | 0 .../internal/validation/futures/validateSendData.ts | 0 .../packages/core/src/internal/validation/utils.ts | 0 .../core/src/internal/validation/validate.ts | 0 .../execution-state/find-onchain-interaction-by.ts | 0 .../views/execution-state/find-static-call-by.ts | 0 .../views/execution-state/find-transaction-by.ts | 0 .../execution-state/get-pending-nonce-and-sender.ts | 0 .../get-pending-onchain-interaction.ts | 0 .../views/find-address-for-contract-future-by-id.ts | 0 .../find-confirmed-transaction-by-future-id.ts | 0 .../src/internal/views/find-deployed-contracts.ts | 0 .../internal/views/find-execution-state-by-id.ts | 0 .../internal/views/find-execution-states-by-type.ts | 0 .../internal/views/find-result-for-future-by-id.ts | 0 .../packages/core/src/internal/views/find-status.ts | 0 .../src/internal/views/has-execution-succeeded.ts | 0 .../core/src/internal/views/is-batch-finished.ts | 0 .../internal/views/is-execution-state-complete.ts | 0 .../packages/core/src/internal/wiper.ts | 0 .../packages/core/src/list-deployments.ts | 0 .../packages/core/src/list-transactions.ts | 0 .../packages/core/src/status.ts | 0 .../packages/core/src/strategies/basic-strategy.ts | 0 .../core/src/strategies/create2-strategy.ts | 0 .../core/src/strategies/resolve-strategy.ts | 0 .../packages/core/src/type-guards.ts | 0 .../packages/core/src/types/artifact.ts | 0 .../packages/core/src/types/deploy.ts | 0 .../packages/core/src/types/errors.ts | 0 .../packages/core/src/types/execution-events.ts | 0 .../packages/core/src/types/list-transactions.ts | 0 .../packages/core/src/types/module-builder.ts | 0 .../packages/core/src/types/module.ts | 0 .../packages/core/src/types/provider.ts | 0 .../packages/core/src/types/serialization.ts | 0 .../packages/core/src/types/status.ts | 0 .../packages/core/src/types/verify.ts | 0 .../packages/core/src/ui-helpers.ts | 0 .../packages/core/src/verify.ts | 0 .../packages/core/src/wipe.ts | 0 .../packages/core/test-integrations/.eslintrc.js | 0 .../test-integrations/fixture-projects/.gitignore | 0 .../fixture-projects/ci-success/contracts/Lock.sol | 0 .../fixture-projects/ci-success/hardhat.config.js | 0 .../ci-success/ignition/modules/LockModule.js | 0 .../default-with-new-chain-id/contracts/Lock.sol | 0 .../default-with-new-chain-id/hardhat.config.js | 0 .../deployments/chain-1337/deployed_addresses.json | 0 .../ignition/deployments/chain-1337/journal.jsonl | 0 .../ignition/modules/LockModule.js | 0 .../fixture-projects/default/contracts/C.sol | 0 .../fixture-projects/default/contracts/Libs.sol | 0 .../fixture-projects/default/hardhat.config.js | 0 .../dont-throw-on-reverts/hardhat.config.js | 0 .../test-integrations/helpers/hardhat-projects.ts | 0 .../test-integrations/new-api/ci/basic-success.ts | 0 .../internal/new-execution/jsonrpc-client.ts | 0 .../new-api/internal/reconciliation/chainId.ts | 0 .../test-execution-result-fixtures.ts | 0 .../packages/core/test/.eslintrc.js | 0 .../packages/core/test/batcher.ts | 0 .../packages/core/test/build-module.ts | 0 .../packages/core/test/call.ts | 0 .../packages/core/test/contract.ts | 0 .../packages/core/test/contractAt.ts | 0 .../packages/core/test/contractAtFromArtifact.ts | 0 .../packages/core/test/contractFromArtifact.ts | 0 .../packages/core/test/encodeFunctionCall.ts | 0 .../packages/core/test/execution/abi.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../future-processor/named-contract-at-deploy.ts | 0 .../future-processor/named-contract-deploy.ts | 0 .../core/test/execution/future-processor/utils.ts | 0 .../packages/core/test/execution/libraries.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../core/test/execution/reducers/running-a-call.ts | 0 .../reducers/running-a-named-contract-deploy.ts | 0 .../reducers/running-a-named-library-deploy.ts | 0 .../execution/reducers/running-a-read-event-arg.ts | 0 .../execution/reducers/running-a-static-call.ts | 0 .../test/execution/reducers/running-contract-at.ts | 0 .../test/execution/reducers/running-send-data.ts | 0 .../core/test/execution/reducers/start-a-new-run.ts | 0 .../packages/core/test/execution/reducers/utils.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../execution/views/find-result-for-future-by-id.ts | 0 .../packages/core/test/getAccount.ts | 0 .../packages/core/test/getParameter.ts | 0 .../packages/core/test/helpers.ts | 0 .../packages/core/test/helpers/exact-interface.ts | 0 .../core/test/helpers/execution-result-fixtures.ts | 0 .../core/test/ignition-module-serializer.ts | 0 .../packages/core/test/library.ts | 0 .../packages/core/test/libraryFromArtifact.ts | 0 .../packages/core/test/list-transactions.ts | 0 .../packages/core/test/listDeployments.ts | 0 .../listDeployments/has-deployments/chain-1/blank | 0 .../listDeployments/has-deployments/chain-2/blank | 0 .../artifacts/CompleteModule#BasicContract.dbg.json | 0 .../artifacts/CompleteModule#BasicContract.json | 0 .../CompleteModule#BasicContract2.dbg.json | 0 .../artifacts/CompleteModule#BasicContract2.json | 0 .../artifacts/CompleteModule#BasicLibrary.dbg.json | 0 .../artifacts/CompleteModule#BasicLibrary.json | 0 .../artifacts/CompleteModule#BasicLibrary2.json | 0 .../CompleteModule#ContractWithLibrary.json | 0 .../CompleteModule#ContractWithLibrary2.json | 0 .../0957b2d8bc1fe22551b79ef37cafc10a.json | 0 .../0fce7e4e9544f4b99b971b3b98da92d2.json | 0 .../success/deployed_addresses.json | 0 .../mocks/listTransactions/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifact/deployed_addresses.json | 0 .../mocks/status/external-artifact/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../status/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/status/success/deployed_addresses.json | 0 .../core/test/mocks/status/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifacts/deployed_addresses.json | 0 .../mocks/verify/external-artifacts/journal.jsonl | 0 .../libraries/artifacts/LockModule#UUUUU.dbg.json | 0 .../libraries/artifacts/LockModule#UUUUU.json | 0 .../libraries/artifacts/LockModule#WAAIT.dbg.json | 0 .../libraries/artifacts/LockModule#WAAIT.json | 0 .../254cc89254e61cb6a9bf2c74f13055f1.json | 0 .../mocks/verify/libraries/deployed_addresses.json | 0 .../core/test/mocks/verify/libraries/journal.jsonl | 0 .../min-input/artifacts/LockModule#TestA.dbg.json | 0 .../min-input/artifacts/LockModule#TestA.json | 0 .../min-input/artifacts/LockModule#TestB.dbg.json | 0 .../min-input/artifacts/LockModule#TestB.json | 0 .../min-input/artifacts/LockModule#TestC.dbg.json | 0 .../min-input/artifacts/LockModule#TestC.json | 0 .../min-input/artifacts/LockModule#TestD.dbg.json | 0 .../min-input/artifacts/LockModule#TestD.json | 0 .../5a5467b3a2cddf6ce0f79584095e02d2.json | 0 .../mocks/verify/min-input/deployed_addresses.json | 0 .../core/test/mocks/verify/min-input/journal.jsonl | 0 .../test/mocks/verify/no-contracts/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../verify/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/verify/success/deployed_addresses.json | 0 .../core/test/mocks/verify/success/journal.jsonl | 0 .../unsupported-chain/deployed_addresses.json | 0 .../mocks/verify/unsupported-chain/journal.jsonl | 0 .../packages/core/test/readEventArgument.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../packages/core/test/reconciliation/helpers.ts | 0 .../packages/core/test/reconciliation/reconciler.ts | 0 .../packages/core/test/send.ts | 0 .../packages/core/test/setup.ts | 0 .../packages/core/test/staticCall.ts | 0 .../packages/core/test/status.ts | 0 .../packages/core/test/types/deployment-loader.ts | 0 .../packages/core/test/types/module.ts | 0 .../packages/core/test/useModule.ts | 0 .../packages/core/test/utils/adjacency-list.ts | 0 .../core/test/utils/check-automined-network.ts | 0 .../packages/core/test/utils/future-id-builders.ts | 0 .../packages/core/test/utils/replace-within-arg.ts | 0 .../packages/core/test/validations/id-rules.ts | 0 .../core/test/validations/identifier-validators.ts | 0 .../packages/core/test/verify.ts | 0 .../packages/core/test/wipe.ts | 0 .../packages/core/tsconfig.json | 0 .../packages/hardhat-plugin-ethers/.eslintrc.js | 0 .../packages/hardhat-plugin-ethers/.gitignore | 0 .../packages/hardhat-plugin-ethers/.mocharc.json | 0 .../packages/hardhat-plugin-ethers/.npmignore | 0 .../packages/hardhat-plugin-ethers/.nycrc | 0 .../packages/hardhat-plugin-ethers/.prettierignore | 0 .../packages/hardhat-plugin-ethers/CHANGELOG.md | 0 .../packages/hardhat-plugin-ethers/README.md | 0 .../packages/hardhat-plugin-ethers/package.json | 0 .../src/ethers-ignition-helper.ts | 0 .../packages/hardhat-plugin-ethers/src/index.ts | 0 .../hardhat-plugin-ethers/src/type-extensions.ts | 0 .../hardhat-plugin-ethers/test/.eslintrc.js | 0 .../hardhat-plugin-ethers/test/default-sender.ts | 0 .../test/deploy-with-ethers-result.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Foo.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/FooModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../packages/hardhat-plugin-ethers/test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../packages/hardhat-plugin-ethers/tsconfig.json | 0 .../packages/hardhat-plugin-viem/.eslintrc.js | 0 .../packages/hardhat-plugin-viem/.gitignore | 0 .../packages/hardhat-plugin-viem/.mocharc.json | 0 .../packages/hardhat-plugin-viem/.npmignore | 0 .../packages/hardhat-plugin-viem/.nycrc | 0 .../packages/hardhat-plugin-viem/.prettierignore | 0 .../packages/hardhat-plugin-viem/CHANGELOG.md | 0 .../packages/hardhat-plugin-viem/README.md | 0 .../packages/hardhat-plugin-viem/package.json | 0 .../scripts/compile-test-fixture-project.ts | 0 .../ignition-module-results-to-viem-contracts.ts | 0 .../packages/hardhat-plugin-viem/src/index.ts | 0 .../hardhat-plugin-viem/src/type-extensions.ts | 0 .../hardhat-plugin-viem/src/viem-ignition-helper.ts | 0 .../packages/hardhat-plugin-viem/test/.eslintrc.js | 0 .../hardhat-plugin-viem/test/default-sender.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Baz.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/BazModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../packages/hardhat-plugin-viem/test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../packages/hardhat-plugin-viem/test/use-module.ts | 0 .../test/viem-instances/artifact-contract-at.ts | 0 .../viem-instances/artifact-deployment-contract.ts | 0 .../test/viem-instances/named-contract-at.ts | 0 .../viem-instances/named-deployment-contract.ts | 0 .../hardhat-plugin-viem/test/viem-results.ts | 0 .../packages/hardhat-plugin-viem/tsconfig.json | 0 .../packages/hardhat-plugin/.eslintrc.js | 0 .../packages/hardhat-plugin/.gitignore | 0 .../packages/hardhat-plugin/.mocharc.json | 0 .../packages/hardhat-plugin/.npmignore | 0 .../packages/hardhat-plugin/.nycrc | 0 .../packages/hardhat-plugin/.prettierignore | 0 .../packages/hardhat-plugin/CHANGELOG.md | 0 .../packages/hardhat-plugin/README.md | 0 .../packages/hardhat-plugin/package.json | 0 .../hardhat-plugin/src/hardhat-artifact-resolver.ts | 0 .../packages/hardhat-plugin/src/helpers.ts | 0 .../packages/hardhat-plugin/src/index.ts | 0 .../packages/hardhat-plugin/src/modules.ts | 0 .../packages/hardhat-plugin/src/type-extensions.ts | 0 .../src/ui/helpers/calculate-batch-display.ts | 0 .../ui/helpers/calculate-deploying-module-panel.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../src/ui/helpers/calculate-starting-message.ts | 0 .../src/ui/helpers/cwd-relative-path.ts | 0 .../src/ui/helpers/was-anything-executed.ts | 0 .../hardhat-plugin/src/ui/pretty-event-handler.ts | 0 .../packages/hardhat-plugin/src/ui/types.ts | 0 .../hardhat-plugin/src/ui/verbose-event-handler.ts | 0 .../hardhat-plugin/src/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../hardhat-plugin/src/utils/getApiKeyAndUrls.ts | 0 .../hardhat-plugin/src/utils/load-module.ts | 0 .../packages/hardhat-plugin/src/utils/open.ts | 0 .../src/utils/read-deployment-parameters.ts | 0 .../src/utils/resolve-deployment-id.ts | 0 .../src/utils/shouldBeHardhatPluginError.ts | 0 .../src/utils/verifyEtherscanContract.ts | 0 .../src/visualization/write-visualization.ts | 0 .../packages/hardhat-plugin/test/.eslintrc.js | 0 .../packages/hardhat-plugin/test/config.ts | 0 .../hardhat-plugin/test/deploy/default-sender.ts | 0 .../hardhat-plugin/test/deploy/gas-estimation.ts | 0 .../test/deploy/multiple-batch-contract-deploy.ts | 0 .../error-on-pending-user-transactions.ts | 0 ...-rerun-with-replaced-pending-user-transaction.ts | 0 .../nonce-checks/error-on-transaction-dropped.ts | 0 .../nonce-checks/error-on-user-transaction-sent.ts | 0 .../rerun-with-dropped-ignition-transaction.ts | 0 ...rerun-with-now-complete-ignition-transactions.ts | 0 .../rerun-with-pending-ignition-transactions.ts | 0 ...erun-with-replaced-confirmed-user-transaction.ts | 0 .../revert-nonce-on-simulation-error.ts | 0 .../deploy/rerun/rerun-a-deploy-that-timed-out.ts | 0 .../test/deploy/rerun/rerun-after-kill.ts | 0 .../deploy/rerun/rerun-with-new-contract-deploy.ts | 0 .../packages/hardhat-plugin/test/deploy/reset.ts | 0 .../test/deploy/timeouts/deploy-run-times-out.ts | 0 .../hardhat-plugin/test/deploy/writeLocalhost.ts | 0 .../hardhat-plugin/test/fixture-projects/.gitignore | 0 .../create2-bad-config/contracts/Foo.sol | 0 .../create2-bad-config/hardhat.config.js | 0 .../create2-bad-config/ignition/modules/MyModule.js | 0 .../create2-exists-chain/contracts/Foo.sol | 0 .../create2-exists-chain/contracts/Unpayable.sol | 0 .../create2-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../create2-not-exists-chain/contracts/Foo.sol | 0 .../create2-not-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../test/fixture-projects/lock/contracts/Lock.sol | 0 .../test/fixture-projects/lock/hardhat.config.js | 0 .../fixture-projects/lock/ignition/modules/Lock.ts | 0 .../modules/parameters-bigints-as-strings.json | 0 .../lock/ignition/modules/parameters-json5.json5 | 0 .../lock/ignition/modules/parameters-too-large.json | 0 .../lock/ignition/modules/parameters.json | 0 .../test/fixture-projects/minimal/contracts/Bar.sol | 0 .../minimal/contracts/CaptureArraysContract.sol | 0 .../contracts/CaptureComplexObjectContract.sol | 0 .../minimal/contracts/EventArgValue.sol | 0 .../fixture-projects/minimal/contracts/Factory.sol | 0 .../fixture-projects/minimal/contracts/Fails.sol | 0 .../minimal/contracts/FailureCalls.sol | 0 .../test/fixture-projects/minimal/contracts/Foo.sol | 0 .../fixture-projects/minimal/contracts/Greeter.sol | 0 .../fixture-projects/minimal/contracts/Ownable.sol | 0 .../fixture-projects/minimal/contracts/Owner.sol | 0 .../minimal/contracts/SendDataEmitter.sol | 0 .../minimal/contracts/StaticCallValue.sol | 0 .../fixture-projects/minimal/contracts/Trace.sol | 0 .../minimal/contracts/TupleEmitter.sol | 0 .../minimal/contracts/TupleReturn.sol | 0 .../minimal/contracts/UsesContract.sol | 0 .../minimal/contracts/WithLibrary.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../minimal/ignition/modules/OwnModule.js | 0 .../contracts/Rocket1.sol | 0 .../contracts/Rocket2.sol | 0 .../hardhat.config.js | 0 .../reset-flag/contracts/Contracts.sol | 0 .../fixture-projects/reset-flag/hardhat.config.js | 0 .../reset-flag/ignition/modules/FirstPass.js | 0 .../reset-flag/ignition/modules/SecondPass.js | 0 .../test/fixture-projects/reset-flag/journal.jsonl | 0 .../user-modules/contracts/Contracts.sol | 0 .../user-modules/contracts/WithLibrary.sol | 0 .../fixture-projects/user-modules/hardhat.config.js | 0 .../user-modules/ignition/.testignore | 0 .../user-modules/ignition/modules/TestModule.js | 0 .../verify-no-api-key/hardhat.config.js | 0 .../with-config/contracts/Contracts.sol | 0 .../with-config/contracts/Trace.sol | 0 .../with-config/contracts/WithLibrary.sol | 0 .../fixture-projects/with-config/hardhat.config.js | 0 .../with-config/ignition/modules/MyModule.js | 0 .../with-invalid-config/contracts/Contracts.sol | 0 .../with-invalid-config/contracts/Trace.sol | 0 .../with-invalid-config/contracts/WithLibrary.sol | 0 .../with-invalid-config/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../hardhat-plugin/test/ignition-helper-guard.ts | 0 .../hardhat-plugin/test/module-api/calls.ts | 0 .../hardhat-plugin/test/module-api/contracts.ts | 0 .../hardhat-plugin/test/module-api/events.ts | 0 .../test/module-api/existing-contract.ts | 0 .../test/module-api/fully-qualified-names.ts | 0 .../hardhat-plugin/test/module-api/libraries.ts | 0 .../hardhat-plugin/test/module-api/params.ts | 0 .../hardhat-plugin/test/module-api/static-calls.ts | 0 .../hardhat-plugin/test/module-api/use-module.ts | 0 .../hardhat-plugin/test/module-parameters.ts | 0 .../packages/hardhat-plugin/test/plan/index.ts | 0 .../packages/hardhat-plugin/test/setup.ts | 0 .../hardhat-plugin/test/strategies/create2.ts | 0 .../test/strategies/generic-strategy-constraints.ts | 0 .../test/strategies/only-built-in-strategies.ts | 0 .../clear-pending-transactions-from-memory-pool.ts | 0 .../hardhat-plugin/test/test-helpers/createX-tx.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/get-balance-for.ts | 0 .../hardhat-plugin/test/test-helpers/mine-block.ts | 0 .../hardhat-plugin/test/test-helpers/sleep.ts | 0 .../test/test-helpers/test-ignition-helper.ts | 0 .../hardhat-plugin/test/test-helpers/type-helper.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../test/test-helpers/wait-for-pending-txs.ts | 0 .../test/ui/helpers/calculate-batch-display.ts | 0 .../calculate-deploying-module-panel-display.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../test/ui/helpers/calculate-starting-message.ts | 0 .../hardhat-plugin/test/ui/helpers/test-format.ts | 0 .../hardhat-plugin/test/ui/pretty-event-handler.ts | 0 .../hardhat-plugin/test/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../hardhat-plugin/test/utils/load-module.ts | 0 .../test/utils/resolve-deployment-id.ts | 0 .../hardhat-plugin/test/verify/getApiKeyAndUrls.ts | 0 .../packages/hardhat-plugin/test/verify/index.ts | 0 .../test/verify/verifyEtherscanContract.ts | 0 .../packages/hardhat-plugin/tsconfig.json | 0 .../packages/ui/.eslintrc.cjs | 0 .../packages/ui/.gitignore | 0 .../packages/ui/.mocharc.json | 0 .../packages/ui/.npmignore | 0 .../packages/ui/.nycrc | 0 .../packages/ui/CHANGELOG.md | 0 .../packages/ui/README.md | 0 .../packages/ui/examples/ComplexModule.js | 0 .../packages/ui/index.html | 0 .../packages/ui/package.json | 0 .../packages/ui/public/.gitkeep | 0 .../ui/scripts/generate-example-deployment-json.js | 0 .../packages/ui/src/assets/ExternalLinkIcon.tsx | 0 .../packages/ui/src/assets/TooltipIcon.tsx | 0 .../packages/ui/src/assets/purple-rocket.png | Bin .../packages/ui/src/components/mermaid.tsx | 0 .../packages/ui/src/components/socials/dc-logo.tsx | 0 .../packages/ui/src/components/socials/gh-logo.tsx | 0 .../packages/ui/src/components/socials/index.tsx | 0 .../packages/ui/src/components/socials/tw-logo.tsx | 0 .../packages/ui/src/main.css | 0 .../packages/ui/src/main.tsx | 0 .../components/deployment-flow.tsx | 0 .../components/execution-batches.tsx | 0 .../components/future-batch.tsx | 0 .../components/future-header.tsx | 0 .../visualization-overview/components/summary.tsx | 0 .../visualization-overview.tsx | 0 .../packages/ui/src/queries/futures.ts | 0 .../packages/ui/src/utils/argumentTypeToString.tsx | 0 .../packages/ui/src/utils/to-escaped-id.ts | 0 .../packages/ui/src/utils/to-mermaid.ts | 0 .../packages/ui/src/vite-env.d.ts | 0 .../packages/ui/test/to-mermaid.ts | 0 .../packages/ui/tsconfig.json | 0 .../packages/ui/tsconfig.node.json | 0 .../packages/ui/vite.config.ts | 0 .../pnpm-lock.yaml | 0 .../pnpm-workspace.yaml | 0 677 files changed, 0 insertions(+), 0 deletions(-) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.devcontainer/devcontainer.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.editorconfig (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.gitattributes (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/ISSUE_TEMPLATE/bug-report.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/ISSUE_TEMPLATE/config.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/ISSUE_TEMPLATE/feature-request.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/ISSUE_TEMPLATE/other-issue.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/workflows/ci.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/workflows/review-requested-slack-notification.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.github/workflows/review-submitted-slack-notification.yml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.prettierrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.vscode/launch.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/.vscode/tasks.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/CONTRIBUTING.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/LICENSE (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/config/eslint/eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/config/typescript/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/contracts/BasicContract.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/contracts/BasicLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/contracts/ContractWithLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/ignition/modules/CompleteModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/libArtifacts/BasicLibrary.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/libArtifacts/ContractWithLibrary.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/complete/test/Complete.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/contracts/ENS.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/contracts/ReverseRegistrar.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/ignition/modules/ENS.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/ignition/modules/test-registrar.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/scripts/deploy-ens.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ens/test/sample-test.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/contracts/FeeTester.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/ignition/modules/FeeTesterModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/fee-tester/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/ignition/modules/LockModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/scripts/bump.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/sample/test/Lock.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/hardhat.config.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/ignition/modules/LockModule.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/test/Lock.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/ts-sample/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/contracts/Demo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/contracts/DemoV2.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/contracts/Proxies.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/ignition/modules/ProxyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/ignition/modules/UpgradeModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/upgradeable/test/ProxyDemo.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/hardhat.config.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/ignition/modules/LockModule.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/test/Lock.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/examples/viem-sample/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.mocharc.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.npmignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.nycrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/.prettierrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/CHANGELOG.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/api-extractor.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/batches.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/build-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/errors.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/ignition-module-serializer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/batcher.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/chain-config.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/defaultConfig.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/deployer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/deployment-loader/file-deployment-loader.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/deployment-loader/types.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/errors-list.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/abi.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/deployment-state-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/execution-engine.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/execution-strategy-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/future-processor.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/jsonrpc-client.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/libraries.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/execution-state-reducer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/helpers/initializers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/strategy/createx-artifact.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/transaction-tracking-timer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/type-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/deployment-state.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/evm-execution.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/execution-result.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/execution-state.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/execution-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/jsonrpc.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/messages.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/types/network-interaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/utils/address.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/execution/utils/get-default-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/formatters.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/file-journal.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/memory-journal.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/types/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/utils/deserialize-replacer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/utils/emitExecutionEvent.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/utils/log.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/journal/utils/serialize-replacer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/module-builder.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/compare.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/reconciler.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/types.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/reconciliation/utils.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/topological-order.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/adjacency-list-converter.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/adjacency-list.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/assertions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/check-automined-network.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/future-id-builders.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/get-futures-from-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/identifier-validators.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/replace-within-arg.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/utils/resolve-module-parameter.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedContractCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateReadEventArgument.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/futures/validateSendData.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/utils.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/validation/validate.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/execution-state/find-static-call-by.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/execution-state/find-transaction-by.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-deployed-contracts.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-execution-state-by-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-execution-states-by-type.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-result-for-future-by-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/find-status.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/has-execution-succeeded.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/is-batch-finished.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/views/is-execution-state-complete.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/internal/wiper.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/list-deployments.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/list-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/status.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/strategies/basic-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/strategies/create2-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/strategies/resolve-strategy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/type-guards.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/artifact.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/errors.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/execution-events.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/list-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/module-builder.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/provider.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/serialization.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/status.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/types/verify.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/ui-helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/verify.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/src/wipe.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default/contracts/C.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/default/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/helpers/hardhat-projects.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/new-api/ci/basic-success.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test-integrations/test-execution-result-fixtures.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/batcher.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/build-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/call.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/contractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/contractAtFromArtifact.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/contractFromArtifact.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/encodeFunctionCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/abi.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/future-processor/named-contract-at-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/future-processor/named-contract-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/future-processor/utils.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/libraries.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-a-call.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-a-named-library-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-a-read-event-arg.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-a-static-call.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-contract-at.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/running-send-data.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/start-a-new-run.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/reducers/utils.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/execution/views/find-result-for-future-by-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/getAccount.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/getParameter.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/helpers/exact-interface.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/helpers/execution-result-fixtures.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/ignition-module-serializer.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/library.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/libraryFromArtifact.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/list-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/listDeployments.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/listTransactions/success/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/external-artifact/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/status/success/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/external-artifacts/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/libraries/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/min-input/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/no-contracts/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/success/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/readEventArgument.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/reconciliation/reconciler.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/send.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/setup.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/staticCall.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/status.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/types/deployment-loader.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/types/module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/useModule.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/utils/adjacency-list.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/utils/check-automined-network.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/utils/future-id-builders.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/utils/replace-within-arg.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/validations/id-rules.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/validations/identifier-validators.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/verify.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/test/wipe.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/core/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.mocharc.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.npmignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.nycrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/CHANGELOG.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/src/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/src/type-extensions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/default-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/setup.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-ethers/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.mocharc.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.npmignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.nycrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/CHANGELOG.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/src/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/src/type-extensions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/default-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/setup.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/use-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/test/viem-results.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin-viem/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.mocharc.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.npmignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.nycrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/.prettierignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/CHANGELOG.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/helpers.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/modules.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/type-extensions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/pretty-event-handler.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/types.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/ui/verbose-event-handler.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/bigintReviver.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/load-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/open.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/src/visualization/write-visualization.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/.eslintrc.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/config.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/default-sender.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/gas-estimation.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/reset.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/deploy/writeLocalhost.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ignition-helper-guard.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/calls.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/contracts.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/events.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/existing-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/libraries.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/params.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/static-calls.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-api/use-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/module-parameters.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/plan/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/setup.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/strategies/create2.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/createX-tx.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/mine-block.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/sleep.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/type-helper.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/helpers/test-format.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/ui/pretty-event-handler.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/utils/bigintReviver.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/utils/load-module.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/verify/index.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/hardhat-plugin/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/.eslintrc.cjs (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/.gitignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/.mocharc.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/.npmignore (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/.nycrc (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/CHANGELOG.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/README.md (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/examples/ComplexModule.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/index.html (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/package.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/public/.gitkeep (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/scripts/generate-example-deployment-json.js (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/assets/ExternalLinkIcon.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/assets/TooltipIcon.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/assets/purple-rocket.png (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/components/mermaid.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/components/socials/dc-logo.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/components/socials/gh-logo.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/components/socials/index.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/components/socials/tw-logo.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/main.css (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/main.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/components/future-batch.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/components/future-header.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/components/summary.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/pages/visualization-overview/visualization-overview.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/queries/futures.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/utils/argumentTypeToString.tsx (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/utils/to-escaped-id.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/utils/to-mermaid.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/src/vite-env.d.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/test/to-mermaid.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/tsconfig.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/tsconfig.node.json (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/packages/ui/vite.config.ts (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/pnpm-lock.yaml (100%) rename packages/{hardhat-ignition => hardhat-ignition-legacy}/pnpm-workspace.yaml (100%) diff --git a/packages/hardhat-ignition/.devcontainer/devcontainer.json b/packages/hardhat-ignition-legacy/.devcontainer/devcontainer.json similarity index 100% rename from packages/hardhat-ignition/.devcontainer/devcontainer.json rename to packages/hardhat-ignition-legacy/.devcontainer/devcontainer.json diff --git a/packages/hardhat-ignition/.editorconfig b/packages/hardhat-ignition-legacy/.editorconfig similarity index 100% rename from packages/hardhat-ignition/.editorconfig rename to packages/hardhat-ignition-legacy/.editorconfig diff --git a/packages/hardhat-ignition/.gitattributes b/packages/hardhat-ignition-legacy/.gitattributes similarity index 100% rename from packages/hardhat-ignition/.gitattributes rename to packages/hardhat-ignition-legacy/.gitattributes diff --git a/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/bug-report.yml b/packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/bug-report.yml similarity index 100% rename from packages/hardhat-ignition/.github/ISSUE_TEMPLATE/bug-report.yml rename to packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/bug-report.yml diff --git a/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/config.yml b/packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/config.yml similarity index 100% rename from packages/hardhat-ignition/.github/ISSUE_TEMPLATE/config.yml rename to packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/config.yml diff --git a/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/feature-request.yml b/packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/feature-request.yml similarity index 100% rename from packages/hardhat-ignition/.github/ISSUE_TEMPLATE/feature-request.yml rename to packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/feature-request.yml diff --git a/packages/hardhat-ignition/.github/ISSUE_TEMPLATE/other-issue.md b/packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/other-issue.md similarity index 100% rename from packages/hardhat-ignition/.github/ISSUE_TEMPLATE/other-issue.md rename to packages/hardhat-ignition-legacy/.github/ISSUE_TEMPLATE/other-issue.md diff --git a/packages/hardhat-ignition/.github/workflows/ci.yml b/packages/hardhat-ignition-legacy/.github/workflows/ci.yml similarity index 100% rename from packages/hardhat-ignition/.github/workflows/ci.yml rename to packages/hardhat-ignition-legacy/.github/workflows/ci.yml diff --git a/packages/hardhat-ignition/.github/workflows/review-requested-slack-notification.yml b/packages/hardhat-ignition-legacy/.github/workflows/review-requested-slack-notification.yml similarity index 100% rename from packages/hardhat-ignition/.github/workflows/review-requested-slack-notification.yml rename to packages/hardhat-ignition-legacy/.github/workflows/review-requested-slack-notification.yml diff --git a/packages/hardhat-ignition/.github/workflows/review-submitted-slack-notification.yml b/packages/hardhat-ignition-legacy/.github/workflows/review-submitted-slack-notification.yml similarity index 100% rename from packages/hardhat-ignition/.github/workflows/review-submitted-slack-notification.yml rename to packages/hardhat-ignition-legacy/.github/workflows/review-submitted-slack-notification.yml diff --git a/packages/hardhat-ignition/.gitignore b/packages/hardhat-ignition-legacy/.gitignore similarity index 100% rename from packages/hardhat-ignition/.gitignore rename to packages/hardhat-ignition-legacy/.gitignore diff --git a/packages/hardhat-ignition/.prettierrc b/packages/hardhat-ignition-legacy/.prettierrc similarity index 100% rename from packages/hardhat-ignition/.prettierrc rename to packages/hardhat-ignition-legacy/.prettierrc diff --git a/packages/hardhat-ignition/.vscode/launch.json b/packages/hardhat-ignition-legacy/.vscode/launch.json similarity index 100% rename from packages/hardhat-ignition/.vscode/launch.json rename to packages/hardhat-ignition-legacy/.vscode/launch.json diff --git a/packages/hardhat-ignition/.vscode/tasks.json b/packages/hardhat-ignition-legacy/.vscode/tasks.json similarity index 100% rename from packages/hardhat-ignition/.vscode/tasks.json rename to packages/hardhat-ignition-legacy/.vscode/tasks.json diff --git a/packages/hardhat-ignition/CONTRIBUTING.md b/packages/hardhat-ignition-legacy/CONTRIBUTING.md similarity index 100% rename from packages/hardhat-ignition/CONTRIBUTING.md rename to packages/hardhat-ignition-legacy/CONTRIBUTING.md diff --git a/packages/hardhat-ignition/LICENSE b/packages/hardhat-ignition-legacy/LICENSE similarity index 100% rename from packages/hardhat-ignition/LICENSE rename to packages/hardhat-ignition-legacy/LICENSE diff --git a/packages/hardhat-ignition/README.md b/packages/hardhat-ignition-legacy/README.md similarity index 100% rename from packages/hardhat-ignition/README.md rename to packages/hardhat-ignition-legacy/README.md diff --git a/packages/hardhat-ignition/config/eslint/eslintrc.js b/packages/hardhat-ignition-legacy/config/eslint/eslintrc.js similarity index 100% rename from packages/hardhat-ignition/config/eslint/eslintrc.js rename to packages/hardhat-ignition-legacy/config/eslint/eslintrc.js diff --git a/packages/hardhat-ignition/config/typescript/tsconfig.json b/packages/hardhat-ignition-legacy/config/typescript/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/config/typescript/tsconfig.json rename to packages/hardhat-ignition-legacy/config/typescript/tsconfig.json diff --git a/packages/hardhat-ignition/examples/.gitignore b/packages/hardhat-ignition-legacy/examples/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/.gitignore rename to packages/hardhat-ignition-legacy/examples/.gitignore diff --git a/packages/hardhat-ignition/examples/complete/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/complete/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/complete/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/complete/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/complete/.gitignore b/packages/hardhat-ignition-legacy/examples/complete/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/complete/.gitignore rename to packages/hardhat-ignition-legacy/examples/complete/.gitignore diff --git a/packages/hardhat-ignition/examples/complete/.prettierignore b/packages/hardhat-ignition-legacy/examples/complete/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/complete/.prettierignore rename to packages/hardhat-ignition-legacy/examples/complete/.prettierignore diff --git a/packages/hardhat-ignition/examples/complete/README.md b/packages/hardhat-ignition-legacy/examples/complete/README.md similarity index 100% rename from packages/hardhat-ignition/examples/complete/README.md rename to packages/hardhat-ignition-legacy/examples/complete/README.md diff --git a/packages/hardhat-ignition/examples/complete/contracts/BasicContract.sol b/packages/hardhat-ignition-legacy/examples/complete/contracts/BasicContract.sol similarity index 100% rename from packages/hardhat-ignition/examples/complete/contracts/BasicContract.sol rename to packages/hardhat-ignition-legacy/examples/complete/contracts/BasicContract.sol diff --git a/packages/hardhat-ignition/examples/complete/contracts/BasicLibrary.sol b/packages/hardhat-ignition-legacy/examples/complete/contracts/BasicLibrary.sol similarity index 100% rename from packages/hardhat-ignition/examples/complete/contracts/BasicLibrary.sol rename to packages/hardhat-ignition-legacy/examples/complete/contracts/BasicLibrary.sol diff --git a/packages/hardhat-ignition/examples/complete/contracts/ContractWithLibrary.sol b/packages/hardhat-ignition-legacy/examples/complete/contracts/ContractWithLibrary.sol similarity index 100% rename from packages/hardhat-ignition/examples/complete/contracts/ContractWithLibrary.sol rename to packages/hardhat-ignition-legacy/examples/complete/contracts/ContractWithLibrary.sol diff --git a/packages/hardhat-ignition/examples/complete/hardhat.config.js b/packages/hardhat-ignition-legacy/examples/complete/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/examples/complete/hardhat.config.js rename to packages/hardhat-ignition-legacy/examples/complete/hardhat.config.js diff --git a/packages/hardhat-ignition/examples/complete/ignition/modules/CompleteModule.js b/packages/hardhat-ignition-legacy/examples/complete/ignition/modules/CompleteModule.js similarity index 100% rename from packages/hardhat-ignition/examples/complete/ignition/modules/CompleteModule.js rename to packages/hardhat-ignition-legacy/examples/complete/ignition/modules/CompleteModule.js diff --git a/packages/hardhat-ignition/examples/complete/libArtifacts/BasicLibrary.json b/packages/hardhat-ignition-legacy/examples/complete/libArtifacts/BasicLibrary.json similarity index 100% rename from packages/hardhat-ignition/examples/complete/libArtifacts/BasicLibrary.json rename to packages/hardhat-ignition-legacy/examples/complete/libArtifacts/BasicLibrary.json diff --git a/packages/hardhat-ignition/examples/complete/libArtifacts/ContractWithLibrary.json b/packages/hardhat-ignition-legacy/examples/complete/libArtifacts/ContractWithLibrary.json similarity index 100% rename from packages/hardhat-ignition/examples/complete/libArtifacts/ContractWithLibrary.json rename to packages/hardhat-ignition-legacy/examples/complete/libArtifacts/ContractWithLibrary.json diff --git a/packages/hardhat-ignition/examples/complete/package.json b/packages/hardhat-ignition-legacy/examples/complete/package.json similarity index 100% rename from packages/hardhat-ignition/examples/complete/package.json rename to packages/hardhat-ignition-legacy/examples/complete/package.json diff --git a/packages/hardhat-ignition/examples/complete/test/Complete.js b/packages/hardhat-ignition-legacy/examples/complete/test/Complete.js similarity index 100% rename from packages/hardhat-ignition/examples/complete/test/Complete.js rename to packages/hardhat-ignition-legacy/examples/complete/test/Complete.js diff --git a/packages/hardhat-ignition/examples/ens/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/ens/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/ens/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/ens/.gitignore b/packages/hardhat-ignition-legacy/examples/ens/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/ens/.gitignore rename to packages/hardhat-ignition-legacy/examples/ens/.gitignore diff --git a/packages/hardhat-ignition/examples/ens/.prettierignore b/packages/hardhat-ignition-legacy/examples/ens/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/ens/.prettierignore rename to packages/hardhat-ignition-legacy/examples/ens/.prettierignore diff --git a/packages/hardhat-ignition/examples/ens/README.md b/packages/hardhat-ignition-legacy/examples/ens/README.md similarity index 100% rename from packages/hardhat-ignition/examples/ens/README.md rename to packages/hardhat-ignition-legacy/examples/ens/README.md diff --git a/packages/hardhat-ignition/examples/ens/contracts/ENS.sol b/packages/hardhat-ignition-legacy/examples/ens/contracts/ENS.sol similarity index 100% rename from packages/hardhat-ignition/examples/ens/contracts/ENS.sol rename to packages/hardhat-ignition-legacy/examples/ens/contracts/ENS.sol diff --git a/packages/hardhat-ignition/examples/ens/contracts/ReverseRegistrar.sol b/packages/hardhat-ignition-legacy/examples/ens/contracts/ReverseRegistrar.sol similarity index 100% rename from packages/hardhat-ignition/examples/ens/contracts/ReverseRegistrar.sol rename to packages/hardhat-ignition-legacy/examples/ens/contracts/ReverseRegistrar.sol diff --git a/packages/hardhat-ignition/examples/ens/hardhat.config.js b/packages/hardhat-ignition-legacy/examples/ens/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/hardhat.config.js rename to packages/hardhat-ignition-legacy/examples/ens/hardhat.config.js diff --git a/packages/hardhat-ignition/examples/ens/ignition/modules/ENS.js b/packages/hardhat-ignition-legacy/examples/ens/ignition/modules/ENS.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/ignition/modules/ENS.js rename to packages/hardhat-ignition-legacy/examples/ens/ignition/modules/ENS.js diff --git a/packages/hardhat-ignition/examples/ens/ignition/modules/test-registrar.js b/packages/hardhat-ignition-legacy/examples/ens/ignition/modules/test-registrar.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/ignition/modules/test-registrar.js rename to packages/hardhat-ignition-legacy/examples/ens/ignition/modules/test-registrar.js diff --git a/packages/hardhat-ignition/examples/ens/package.json b/packages/hardhat-ignition-legacy/examples/ens/package.json similarity index 100% rename from packages/hardhat-ignition/examples/ens/package.json rename to packages/hardhat-ignition-legacy/examples/ens/package.json diff --git a/packages/hardhat-ignition/examples/ens/scripts/deploy-ens.js b/packages/hardhat-ignition-legacy/examples/ens/scripts/deploy-ens.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/scripts/deploy-ens.js rename to packages/hardhat-ignition-legacy/examples/ens/scripts/deploy-ens.js diff --git a/packages/hardhat-ignition/examples/ens/test/sample-test.js b/packages/hardhat-ignition-legacy/examples/ens/test/sample-test.js similarity index 100% rename from packages/hardhat-ignition/examples/ens/test/sample-test.js rename to packages/hardhat-ignition-legacy/examples/ens/test/sample-test.js diff --git a/packages/hardhat-ignition/examples/fee-tester/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/fee-tester/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/fee-tester/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/fee-tester/.gitignore b/packages/hardhat-ignition-legacy/examples/fee-tester/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/.gitignore rename to packages/hardhat-ignition-legacy/examples/fee-tester/.gitignore diff --git a/packages/hardhat-ignition/examples/fee-tester/.prettierignore b/packages/hardhat-ignition-legacy/examples/fee-tester/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/.prettierignore rename to packages/hardhat-ignition-legacy/examples/fee-tester/.prettierignore diff --git a/packages/hardhat-ignition/examples/fee-tester/README.md b/packages/hardhat-ignition-legacy/examples/fee-tester/README.md similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/README.md rename to packages/hardhat-ignition-legacy/examples/fee-tester/README.md diff --git a/packages/hardhat-ignition/examples/fee-tester/contracts/FeeTester.sol b/packages/hardhat-ignition-legacy/examples/fee-tester/contracts/FeeTester.sol similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/contracts/FeeTester.sol rename to packages/hardhat-ignition-legacy/examples/fee-tester/contracts/FeeTester.sol diff --git a/packages/hardhat-ignition/examples/fee-tester/hardhat.config.js b/packages/hardhat-ignition-legacy/examples/fee-tester/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/hardhat.config.js rename to packages/hardhat-ignition-legacy/examples/fee-tester/hardhat.config.js diff --git a/packages/hardhat-ignition/examples/fee-tester/ignition/modules/FeeTesterModule.js b/packages/hardhat-ignition-legacy/examples/fee-tester/ignition/modules/FeeTesterModule.js similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/ignition/modules/FeeTesterModule.js rename to packages/hardhat-ignition-legacy/examples/fee-tester/ignition/modules/FeeTesterModule.js diff --git a/packages/hardhat-ignition/examples/fee-tester/package.json b/packages/hardhat-ignition-legacy/examples/fee-tester/package.json similarity index 100% rename from packages/hardhat-ignition/examples/fee-tester/package.json rename to packages/hardhat-ignition-legacy/examples/fee-tester/package.json diff --git a/packages/hardhat-ignition/examples/sample/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/sample/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/sample/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/sample/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/sample/.gitignore b/packages/hardhat-ignition-legacy/examples/sample/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/sample/.gitignore rename to packages/hardhat-ignition-legacy/examples/sample/.gitignore diff --git a/packages/hardhat-ignition/examples/sample/.prettierignore b/packages/hardhat-ignition-legacy/examples/sample/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/sample/.prettierignore rename to packages/hardhat-ignition-legacy/examples/sample/.prettierignore diff --git a/packages/hardhat-ignition/examples/sample/README.md b/packages/hardhat-ignition-legacy/examples/sample/README.md similarity index 100% rename from packages/hardhat-ignition/examples/sample/README.md rename to packages/hardhat-ignition-legacy/examples/sample/README.md diff --git a/packages/hardhat-ignition/examples/sample/contracts/Lock.sol b/packages/hardhat-ignition-legacy/examples/sample/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/examples/sample/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/examples/sample/contracts/Lock.sol diff --git a/packages/hardhat-ignition/examples/sample/hardhat.config.js b/packages/hardhat-ignition-legacy/examples/sample/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/examples/sample/hardhat.config.js rename to packages/hardhat-ignition-legacy/examples/sample/hardhat.config.js diff --git a/packages/hardhat-ignition/examples/sample/ignition/modules/LockModule.js b/packages/hardhat-ignition-legacy/examples/sample/ignition/modules/LockModule.js similarity index 100% rename from packages/hardhat-ignition/examples/sample/ignition/modules/LockModule.js rename to packages/hardhat-ignition-legacy/examples/sample/ignition/modules/LockModule.js diff --git a/packages/hardhat-ignition/examples/sample/package.json b/packages/hardhat-ignition-legacy/examples/sample/package.json similarity index 100% rename from packages/hardhat-ignition/examples/sample/package.json rename to packages/hardhat-ignition-legacy/examples/sample/package.json diff --git a/packages/hardhat-ignition/examples/sample/scripts/bump.js b/packages/hardhat-ignition-legacy/examples/sample/scripts/bump.js similarity index 100% rename from packages/hardhat-ignition/examples/sample/scripts/bump.js rename to packages/hardhat-ignition-legacy/examples/sample/scripts/bump.js diff --git a/packages/hardhat-ignition/examples/sample/test/Lock.js b/packages/hardhat-ignition-legacy/examples/sample/test/Lock.js similarity index 100% rename from packages/hardhat-ignition/examples/sample/test/Lock.js rename to packages/hardhat-ignition-legacy/examples/sample/test/Lock.js diff --git a/packages/hardhat-ignition/examples/ts-sample/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/ts-sample/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/ts-sample/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/ts-sample/.gitignore b/packages/hardhat-ignition-legacy/examples/ts-sample/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/.gitignore rename to packages/hardhat-ignition-legacy/examples/ts-sample/.gitignore diff --git a/packages/hardhat-ignition/examples/ts-sample/.prettierignore b/packages/hardhat-ignition-legacy/examples/ts-sample/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/.prettierignore rename to packages/hardhat-ignition-legacy/examples/ts-sample/.prettierignore diff --git a/packages/hardhat-ignition/examples/ts-sample/README.md b/packages/hardhat-ignition-legacy/examples/ts-sample/README.md similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/README.md rename to packages/hardhat-ignition-legacy/examples/ts-sample/README.md diff --git a/packages/hardhat-ignition/examples/ts-sample/contracts/Lock.sol b/packages/hardhat-ignition-legacy/examples/ts-sample/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/examples/ts-sample/contracts/Lock.sol diff --git a/packages/hardhat-ignition/examples/ts-sample/hardhat.config.ts b/packages/hardhat-ignition-legacy/examples/ts-sample/hardhat.config.ts similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/hardhat.config.ts rename to packages/hardhat-ignition-legacy/examples/ts-sample/hardhat.config.ts diff --git a/packages/hardhat-ignition/examples/ts-sample/ignition/modules/LockModule.ts b/packages/hardhat-ignition-legacy/examples/ts-sample/ignition/modules/LockModule.ts similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/ignition/modules/LockModule.ts rename to packages/hardhat-ignition-legacy/examples/ts-sample/ignition/modules/LockModule.ts diff --git a/packages/hardhat-ignition/examples/ts-sample/package.json b/packages/hardhat-ignition-legacy/examples/ts-sample/package.json similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/package.json rename to packages/hardhat-ignition-legacy/examples/ts-sample/package.json diff --git a/packages/hardhat-ignition/examples/ts-sample/test/Lock.ts b/packages/hardhat-ignition-legacy/examples/ts-sample/test/Lock.ts similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/test/Lock.ts rename to packages/hardhat-ignition-legacy/examples/ts-sample/test/Lock.ts diff --git a/packages/hardhat-ignition/examples/ts-sample/tsconfig.json b/packages/hardhat-ignition-legacy/examples/ts-sample/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/examples/ts-sample/tsconfig.json rename to packages/hardhat-ignition-legacy/examples/ts-sample/tsconfig.json diff --git a/packages/hardhat-ignition/examples/upgradeable/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/upgradeable/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/upgradeable/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/upgradeable/.gitignore b/packages/hardhat-ignition-legacy/examples/upgradeable/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/.gitignore rename to packages/hardhat-ignition-legacy/examples/upgradeable/.gitignore diff --git a/packages/hardhat-ignition/examples/upgradeable/.prettierignore b/packages/hardhat-ignition-legacy/examples/upgradeable/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/.prettierignore rename to packages/hardhat-ignition-legacy/examples/upgradeable/.prettierignore diff --git a/packages/hardhat-ignition/examples/upgradeable/README.md b/packages/hardhat-ignition-legacy/examples/upgradeable/README.md similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/README.md rename to packages/hardhat-ignition-legacy/examples/upgradeable/README.md diff --git a/packages/hardhat-ignition/examples/upgradeable/contracts/Demo.sol b/packages/hardhat-ignition-legacy/examples/upgradeable/contracts/Demo.sol similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/contracts/Demo.sol rename to packages/hardhat-ignition-legacy/examples/upgradeable/contracts/Demo.sol diff --git a/packages/hardhat-ignition/examples/upgradeable/contracts/DemoV2.sol b/packages/hardhat-ignition-legacy/examples/upgradeable/contracts/DemoV2.sol similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/contracts/DemoV2.sol rename to packages/hardhat-ignition-legacy/examples/upgradeable/contracts/DemoV2.sol diff --git a/packages/hardhat-ignition/examples/upgradeable/contracts/Proxies.sol b/packages/hardhat-ignition-legacy/examples/upgradeable/contracts/Proxies.sol similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/contracts/Proxies.sol rename to packages/hardhat-ignition-legacy/examples/upgradeable/contracts/Proxies.sol diff --git a/packages/hardhat-ignition/examples/upgradeable/hardhat.config.js b/packages/hardhat-ignition-legacy/examples/upgradeable/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/hardhat.config.js rename to packages/hardhat-ignition-legacy/examples/upgradeable/hardhat.config.js diff --git a/packages/hardhat-ignition/examples/upgradeable/ignition/modules/ProxyModule.js b/packages/hardhat-ignition-legacy/examples/upgradeable/ignition/modules/ProxyModule.js similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/ignition/modules/ProxyModule.js rename to packages/hardhat-ignition-legacy/examples/upgradeable/ignition/modules/ProxyModule.js diff --git a/packages/hardhat-ignition/examples/upgradeable/ignition/modules/UpgradeModule.js b/packages/hardhat-ignition-legacy/examples/upgradeable/ignition/modules/UpgradeModule.js similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/ignition/modules/UpgradeModule.js rename to packages/hardhat-ignition-legacy/examples/upgradeable/ignition/modules/UpgradeModule.js diff --git a/packages/hardhat-ignition/examples/upgradeable/package.json b/packages/hardhat-ignition-legacy/examples/upgradeable/package.json similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/package.json rename to packages/hardhat-ignition-legacy/examples/upgradeable/package.json diff --git a/packages/hardhat-ignition/examples/upgradeable/test/ProxyDemo.js b/packages/hardhat-ignition-legacy/examples/upgradeable/test/ProxyDemo.js similarity index 100% rename from packages/hardhat-ignition/examples/upgradeable/test/ProxyDemo.js rename to packages/hardhat-ignition-legacy/examples/upgradeable/test/ProxyDemo.js diff --git a/packages/hardhat-ignition/examples/viem-sample/.eslintrc.js b/packages/hardhat-ignition-legacy/examples/viem-sample/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/.eslintrc.js rename to packages/hardhat-ignition-legacy/examples/viem-sample/.eslintrc.js diff --git a/packages/hardhat-ignition/examples/viem-sample/.gitignore b/packages/hardhat-ignition-legacy/examples/viem-sample/.gitignore similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/.gitignore rename to packages/hardhat-ignition-legacy/examples/viem-sample/.gitignore diff --git a/packages/hardhat-ignition/examples/viem-sample/.prettierignore b/packages/hardhat-ignition-legacy/examples/viem-sample/.prettierignore similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/.prettierignore rename to packages/hardhat-ignition-legacy/examples/viem-sample/.prettierignore diff --git a/packages/hardhat-ignition/examples/viem-sample/README.md b/packages/hardhat-ignition-legacy/examples/viem-sample/README.md similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/README.md rename to packages/hardhat-ignition-legacy/examples/viem-sample/README.md diff --git a/packages/hardhat-ignition/examples/viem-sample/contracts/Lock.sol b/packages/hardhat-ignition-legacy/examples/viem-sample/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/examples/viem-sample/contracts/Lock.sol diff --git a/packages/hardhat-ignition/examples/viem-sample/hardhat.config.ts b/packages/hardhat-ignition-legacy/examples/viem-sample/hardhat.config.ts similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/hardhat.config.ts rename to packages/hardhat-ignition-legacy/examples/viem-sample/hardhat.config.ts diff --git a/packages/hardhat-ignition/examples/viem-sample/ignition/modules/LockModule.ts b/packages/hardhat-ignition-legacy/examples/viem-sample/ignition/modules/LockModule.ts similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/ignition/modules/LockModule.ts rename to packages/hardhat-ignition-legacy/examples/viem-sample/ignition/modules/LockModule.ts diff --git a/packages/hardhat-ignition/examples/viem-sample/package.json b/packages/hardhat-ignition-legacy/examples/viem-sample/package.json similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/package.json rename to packages/hardhat-ignition-legacy/examples/viem-sample/package.json diff --git a/packages/hardhat-ignition/examples/viem-sample/test/Lock.ts b/packages/hardhat-ignition-legacy/examples/viem-sample/test/Lock.ts similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/test/Lock.ts rename to packages/hardhat-ignition-legacy/examples/viem-sample/test/Lock.ts diff --git a/packages/hardhat-ignition/examples/viem-sample/tsconfig.json b/packages/hardhat-ignition-legacy/examples/viem-sample/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/examples/viem-sample/tsconfig.json rename to packages/hardhat-ignition-legacy/examples/viem-sample/tsconfig.json diff --git a/packages/hardhat-ignition/package.json b/packages/hardhat-ignition-legacy/package.json similarity index 100% rename from packages/hardhat-ignition/package.json rename to packages/hardhat-ignition-legacy/package.json diff --git a/packages/hardhat-ignition/packages/core/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/core/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/core/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/core/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/core/.gitignore b/packages/hardhat-ignition-legacy/packages/core/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/core/.gitignore rename to packages/hardhat-ignition-legacy/packages/core/.gitignore diff --git a/packages/hardhat-ignition/packages/core/.mocharc.json b/packages/hardhat-ignition-legacy/packages/core/.mocharc.json similarity index 100% rename from packages/hardhat-ignition/packages/core/.mocharc.json rename to packages/hardhat-ignition-legacy/packages/core/.mocharc.json diff --git a/packages/hardhat-ignition/packages/core/.npmignore b/packages/hardhat-ignition-legacy/packages/core/.npmignore similarity index 100% rename from packages/hardhat-ignition/packages/core/.npmignore rename to packages/hardhat-ignition-legacy/packages/core/.npmignore diff --git a/packages/hardhat-ignition/packages/core/.nycrc b/packages/hardhat-ignition-legacy/packages/core/.nycrc similarity index 100% rename from packages/hardhat-ignition/packages/core/.nycrc rename to packages/hardhat-ignition-legacy/packages/core/.nycrc diff --git a/packages/hardhat-ignition/packages/core/.prettierignore b/packages/hardhat-ignition-legacy/packages/core/.prettierignore similarity index 100% rename from packages/hardhat-ignition/packages/core/.prettierignore rename to packages/hardhat-ignition-legacy/packages/core/.prettierignore diff --git a/packages/hardhat-ignition/packages/core/.prettierrc b/packages/hardhat-ignition-legacy/packages/core/.prettierrc similarity index 100% rename from packages/hardhat-ignition/packages/core/.prettierrc rename to packages/hardhat-ignition-legacy/packages/core/.prettierrc diff --git a/packages/hardhat-ignition/packages/core/CHANGELOG.md b/packages/hardhat-ignition-legacy/packages/core/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition/packages/core/CHANGELOG.md rename to packages/hardhat-ignition-legacy/packages/core/CHANGELOG.md diff --git a/packages/hardhat-ignition/packages/core/README.md b/packages/hardhat-ignition-legacy/packages/core/README.md similarity index 100% rename from packages/hardhat-ignition/packages/core/README.md rename to packages/hardhat-ignition-legacy/packages/core/README.md diff --git a/packages/hardhat-ignition/packages/core/api-extractor.json b/packages/hardhat-ignition-legacy/packages/core/api-extractor.json similarity index 100% rename from packages/hardhat-ignition/packages/core/api-extractor.json rename to packages/hardhat-ignition-legacy/packages/core/api-extractor.json diff --git a/packages/hardhat-ignition/packages/core/package.json b/packages/hardhat-ignition-legacy/packages/core/package.json similarity index 100% rename from packages/hardhat-ignition/packages/core/package.json rename to packages/hardhat-ignition-legacy/packages/core/package.json diff --git a/packages/hardhat-ignition/packages/core/src/batches.ts b/packages/hardhat-ignition-legacy/packages/core/src/batches.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/batches.ts rename to packages/hardhat-ignition-legacy/packages/core/src/batches.ts diff --git a/packages/hardhat-ignition/packages/core/src/build-module.ts b/packages/hardhat-ignition-legacy/packages/core/src/build-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/build-module.ts rename to packages/hardhat-ignition-legacy/packages/core/src/build-module.ts diff --git a/packages/hardhat-ignition/packages/core/src/deploy.ts b/packages/hardhat-ignition-legacy/packages/core/src/deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/deploy.ts diff --git a/packages/hardhat-ignition/packages/core/src/errors.ts b/packages/hardhat-ignition-legacy/packages/core/src/errors.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/errors.ts rename to packages/hardhat-ignition-legacy/packages/core/src/errors.ts diff --git a/packages/hardhat-ignition/packages/core/src/ignition-module-serializer.ts b/packages/hardhat-ignition-legacy/packages/core/src/ignition-module-serializer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/ignition-module-serializer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/ignition-module-serializer.ts diff --git a/packages/hardhat-ignition/packages/core/src/index.ts b/packages/hardhat-ignition-legacy/packages/core/src/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/index.ts rename to packages/hardhat-ignition-legacy/packages/core/src/index.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/batcher.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/batcher.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/batcher.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/batcher.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/chain-config.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/chain-config.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/chain-config.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/chain-config.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/defaultConfig.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/defaultConfig.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/defaultConfig.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/defaultConfig.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/deployer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/deployer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/deployer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/deployer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/file-deployment-loader.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/file-deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/deployment-loader/file-deployment-loader.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/file-deployment-loader.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/deployment-loader/types.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/types.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/deployment-loader/types.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/types.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/errors-list.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/errors-list.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/errors-list.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/errors-list.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/abi.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/abi.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/abi.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/abi.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/deployment-state-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/deployment-state-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/deployment-state-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/execution-engine.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-engine.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/execution-engine.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-engine.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/execution-strategy-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-strategy-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/execution-strategy-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-strategy-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/future-processor.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/future-processor.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/future-processor.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/jsonrpc-client.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/jsonrpc-client.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/jsonrpc-client.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/libraries.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/libraries.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/libraries.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/libraries.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/execution-state-reducer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/execution-state-reducer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/execution-state-reducer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/execution-state-reducer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/initializers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/initializers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/initializers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/strategy/createx-artifact.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/strategy/createx-artifact.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/strategy/createx-artifact.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/strategy/createx-artifact.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/transaction-tracking-timer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/transaction-tracking-timer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/transaction-tracking-timer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/transaction-tracking-timer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/type-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/type-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/type-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/type-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/deployment-state.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/deployment-state.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/deployment-state.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/deployment-state.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/evm-execution.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/evm-execution.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/evm-execution.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/evm-execution.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-result.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-result.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-result.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-result.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-state.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-state.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-state.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-state.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/execution-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/jsonrpc.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/jsonrpc.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/jsonrpc.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/jsonrpc.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/messages.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/messages.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/messages.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/messages.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/types/network-interaction.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/network-interaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/types/network-interaction.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/network-interaction.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/utils/address.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/address.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/utils/address.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/address.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/execution/utils/get-default-sender.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/get-default-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/execution/utils/get-default-sender.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/get-default-sender.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/formatters.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/formatters.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/formatters.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/formatters.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/file-journal.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/file-journal.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/file-journal.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/file-journal.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/memory-journal.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/memory-journal.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/memory-journal.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/memory-journal.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/types/index.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/types/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/types/index.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/types/index.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/utils/deserialize-replacer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/deserialize-replacer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/utils/deserialize-replacer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/deserialize-replacer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/utils/emitExecutionEvent.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/emitExecutionEvent.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/utils/emitExecutionEvent.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/emitExecutionEvent.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/utils/log.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/log.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/utils/log.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/log.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/journal/utils/serialize-replacer.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/serialize-replacer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/journal/utils/serialize-replacer.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/serialize-replacer.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/module-builder.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/module-builder.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/module-builder.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/module-builder.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/module.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/module.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/module.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/compare.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/compare.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/compare.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/compare.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconciler.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconciler.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/reconciler.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconciler.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/types.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/types.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/types.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/types.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/reconciliation/utils.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/utils.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/reconciliation/utils.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/utils.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/topological-order.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/topological-order.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/topological-order.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/topological-order.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list-converter.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list-converter.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list-converter.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list-converter.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/adjacency-list.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/assertions.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/assertions.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/assertions.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/assertions.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/check-automined-network.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/check-automined-network.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/check-automined-network.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/check-automined-network.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/future-id-builders.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/future-id-builders.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/future-id-builders.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/future-id-builders.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/get-futures-from-module.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/get-futures-from-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/get-futures-from-module.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/get-futures-from-module.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/identifier-validators.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/identifier-validators.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/identifier-validators.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/identifier-validators.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/replace-within-arg.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/replace-within-arg.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/replace-within-arg.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/replace-within-arg.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/resolve-module-parameter.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/utils/resolve-module-parameter.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/utils/resolve-module-parameter.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateReadEventArgument.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateReadEventArgument.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateReadEventArgument.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateSendData.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/futures/validateSendData.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateSendData.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/utils.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/utils.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/utils.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/utils.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/validation/validate.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/validate.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/validation/validate.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/validation/validate.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-static-call-by.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-static-call-by.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-static-call-by.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-static-call-by.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-transaction-by.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-transaction-by.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/execution-state/find-transaction-by.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-transaction-by.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-deployed-contracts.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-deployed-contracts.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-deployed-contracts.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-deployed-contracts.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-execution-state-by-id.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-state-by-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-execution-state-by-id.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-state-by-id.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-execution-states-by-type.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-states-by-type.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-execution-states-by-type.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-states-by-type.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-result-for-future-by-id.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/find-status.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-status.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/find-status.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-status.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/has-execution-succeeded.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/has-execution-succeeded.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/has-execution-succeeded.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/has-execution-succeeded.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/is-batch-finished.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-batch-finished.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/is-batch-finished.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-batch-finished.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/views/is-execution-state-complete.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-execution-state-complete.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/views/is-execution-state-complete.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-execution-state-complete.ts diff --git a/packages/hardhat-ignition/packages/core/src/internal/wiper.ts b/packages/hardhat-ignition-legacy/packages/core/src/internal/wiper.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/internal/wiper.ts rename to packages/hardhat-ignition-legacy/packages/core/src/internal/wiper.ts diff --git a/packages/hardhat-ignition/packages/core/src/list-deployments.ts b/packages/hardhat-ignition-legacy/packages/core/src/list-deployments.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/list-deployments.ts rename to packages/hardhat-ignition-legacy/packages/core/src/list-deployments.ts diff --git a/packages/hardhat-ignition/packages/core/src/list-transactions.ts b/packages/hardhat-ignition-legacy/packages/core/src/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/list-transactions.ts rename to packages/hardhat-ignition-legacy/packages/core/src/list-transactions.ts diff --git a/packages/hardhat-ignition/packages/core/src/status.ts b/packages/hardhat-ignition-legacy/packages/core/src/status.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/status.ts rename to packages/hardhat-ignition-legacy/packages/core/src/status.ts diff --git a/packages/hardhat-ignition/packages/core/src/strategies/basic-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/strategies/basic-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/strategies/basic-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/strategies/basic-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/strategies/create2-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/strategies/create2-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/strategies/create2-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/strategies/create2-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/strategies/resolve-strategy.ts b/packages/hardhat-ignition-legacy/packages/core/src/strategies/resolve-strategy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/strategies/resolve-strategy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/strategies/resolve-strategy.ts diff --git a/packages/hardhat-ignition/packages/core/src/type-guards.ts b/packages/hardhat-ignition-legacy/packages/core/src/type-guards.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/type-guards.ts rename to packages/hardhat-ignition-legacy/packages/core/src/type-guards.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/artifact.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/artifact.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/artifact.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/artifact.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/deploy.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/deploy.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/errors.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/errors.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/errors.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/errors.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/execution-events.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/execution-events.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/execution-events.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/execution-events.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/list-transactions.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/list-transactions.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/list-transactions.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/module-builder.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/module-builder.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/module-builder.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/module-builder.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/module.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/module.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/module.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/provider.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/provider.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/provider.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/provider.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/serialization.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/serialization.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/serialization.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/serialization.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/status.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/status.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/status.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/status.ts diff --git a/packages/hardhat-ignition/packages/core/src/types/verify.ts b/packages/hardhat-ignition-legacy/packages/core/src/types/verify.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/types/verify.ts rename to packages/hardhat-ignition-legacy/packages/core/src/types/verify.ts diff --git a/packages/hardhat-ignition/packages/core/src/ui-helpers.ts b/packages/hardhat-ignition-legacy/packages/core/src/ui-helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/ui-helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/src/ui-helpers.ts diff --git a/packages/hardhat-ignition/packages/core/src/verify.ts b/packages/hardhat-ignition-legacy/packages/core/src/verify.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/verify.ts rename to packages/hardhat-ignition-legacy/packages/core/src/verify.ts diff --git a/packages/hardhat-ignition/packages/core/src/wipe.ts b/packages/hardhat-ignition-legacy/packages/core/src/wipe.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/src/wipe.ts rename to packages/hardhat-ignition-legacy/packages/core/src/wipe.ts diff --git a/packages/hardhat-ignition/packages/core/test-integrations/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/.gitignore b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/.gitignore rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/C.sol b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/C.sol similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/C.sol rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/C.sol diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/default/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/core/test-integrations/helpers/hardhat-projects.ts b/packages/hardhat-ignition-legacy/packages/core/test-integrations/helpers/hardhat-projects.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/helpers/hardhat-projects.ts rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/helpers/hardhat-projects.ts diff --git a/packages/hardhat-ignition/packages/core/test-integrations/new-api/ci/basic-success.ts b/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/ci/basic-success.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/new-api/ci/basic-success.ts rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/ci/basic-success.ts diff --git a/packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts diff --git a/packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts diff --git a/packages/hardhat-ignition/packages/core/test-integrations/test-execution-result-fixtures.ts b/packages/hardhat-ignition-legacy/packages/core/test-integrations/test-execution-result-fixtures.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test-integrations/test-execution-result-fixtures.ts rename to packages/hardhat-ignition-legacy/packages/core/test-integrations/test-execution-result-fixtures.ts diff --git a/packages/hardhat-ignition/packages/core/test/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/core/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/core/test/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/core/test/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/core/test/batcher.ts b/packages/hardhat-ignition-legacy/packages/core/test/batcher.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/batcher.ts rename to packages/hardhat-ignition-legacy/packages/core/test/batcher.ts diff --git a/packages/hardhat-ignition/packages/core/test/build-module.ts b/packages/hardhat-ignition-legacy/packages/core/test/build-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/build-module.ts rename to packages/hardhat-ignition-legacy/packages/core/test/build-module.ts diff --git a/packages/hardhat-ignition/packages/core/test/call.ts b/packages/hardhat-ignition-legacy/packages/core/test/call.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/call.ts rename to packages/hardhat-ignition-legacy/packages/core/test/call.ts diff --git a/packages/hardhat-ignition/packages/core/test/contract.ts b/packages/hardhat-ignition-legacy/packages/core/test/contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/contract.ts rename to packages/hardhat-ignition-legacy/packages/core/test/contract.ts diff --git a/packages/hardhat-ignition/packages/core/test/contractAt.ts b/packages/hardhat-ignition-legacy/packages/core/test/contractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/contractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/test/contractAt.ts diff --git a/packages/hardhat-ignition/packages/core/test/contractAtFromArtifact.ts b/packages/hardhat-ignition-legacy/packages/core/test/contractAtFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/contractAtFromArtifact.ts rename to packages/hardhat-ignition-legacy/packages/core/test/contractAtFromArtifact.ts diff --git a/packages/hardhat-ignition/packages/core/test/contractFromArtifact.ts b/packages/hardhat-ignition-legacy/packages/core/test/contractFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/contractFromArtifact.ts rename to packages/hardhat-ignition-legacy/packages/core/test/contractFromArtifact.ts diff --git a/packages/hardhat-ignition/packages/core/test/encodeFunctionCall.ts b/packages/hardhat-ignition-legacy/packages/core/test/encodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/encodeFunctionCall.ts rename to packages/hardhat-ignition-legacy/packages/core/test/encodeFunctionCall.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/abi.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/abi.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/abi.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/abi.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-at-deploy.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-at-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-at-deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-at-deploy.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/future-processor/named-contract-deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-deploy.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/future-processor/utils.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/utils.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/future-processor/utils.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/utils.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/libraries.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/libraries.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/libraries.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/libraries.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-call.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-call.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-call.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-call.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-library-deploy.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-library-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-named-library-deploy.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-library-deploy.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-read-event-arg.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-read-event-arg.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-read-event-arg.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-read-event-arg.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-static-call.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-static-call.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-a-static-call.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-static-call.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-contract-at.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-contract-at.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-contract-at.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-contract-at.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/running-send-data.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-send-data.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/running-send-data.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-send-data.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/start-a-new-run.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/start-a-new-run.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/start-a-new-run.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/start-a-new-run.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/reducers/utils.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/utils.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/reducers/utils.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/utils.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/hardhat-ignition/packages/core/test/execution/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition-legacy/packages/core/test/execution/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/execution/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition-legacy/packages/core/test/execution/views/find-result-for-future-by-id.ts diff --git a/packages/hardhat-ignition/packages/core/test/getAccount.ts b/packages/hardhat-ignition-legacy/packages/core/test/getAccount.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/getAccount.ts rename to packages/hardhat-ignition-legacy/packages/core/test/getAccount.ts diff --git a/packages/hardhat-ignition/packages/core/test/getParameter.ts b/packages/hardhat-ignition-legacy/packages/core/test/getParameter.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/getParameter.ts rename to packages/hardhat-ignition-legacy/packages/core/test/getParameter.ts diff --git a/packages/hardhat-ignition/packages/core/test/helpers.ts b/packages/hardhat-ignition-legacy/packages/core/test/helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/test/helpers.ts diff --git a/packages/hardhat-ignition/packages/core/test/helpers/exact-interface.ts b/packages/hardhat-ignition-legacy/packages/core/test/helpers/exact-interface.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/helpers/exact-interface.ts rename to packages/hardhat-ignition-legacy/packages/core/test/helpers/exact-interface.ts diff --git a/packages/hardhat-ignition/packages/core/test/helpers/execution-result-fixtures.ts b/packages/hardhat-ignition-legacy/packages/core/test/helpers/execution-result-fixtures.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/helpers/execution-result-fixtures.ts rename to packages/hardhat-ignition-legacy/packages/core/test/helpers/execution-result-fixtures.ts diff --git a/packages/hardhat-ignition/packages/core/test/ignition-module-serializer.ts b/packages/hardhat-ignition-legacy/packages/core/test/ignition-module-serializer.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/ignition-module-serializer.ts rename to packages/hardhat-ignition-legacy/packages/core/test/ignition-module-serializer.ts diff --git a/packages/hardhat-ignition/packages/core/test/library.ts b/packages/hardhat-ignition-legacy/packages/core/test/library.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/library.ts rename to packages/hardhat-ignition-legacy/packages/core/test/library.ts diff --git a/packages/hardhat-ignition/packages/core/test/libraryFromArtifact.ts b/packages/hardhat-ignition-legacy/packages/core/test/libraryFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/libraryFromArtifact.ts rename to packages/hardhat-ignition-legacy/packages/core/test/libraryFromArtifact.ts diff --git a/packages/hardhat-ignition/packages/core/test/list-transactions.ts b/packages/hardhat-ignition-legacy/packages/core/test/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/list-transactions.ts rename to packages/hardhat-ignition-legacy/packages/core/test/list-transactions.ts diff --git a/packages/hardhat-ignition/packages/core/test/listDeployments.ts b/packages/hardhat-ignition-legacy/packages/core/test/listDeployments.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/listDeployments.ts rename to packages/hardhat-ignition-legacy/packages/core/test/listDeployments.ts diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/listTransactions/success/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/external-artifact/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/success/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/success/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/status/success/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/status/success/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/external-artifacts/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/libraries/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/min-input/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/no-contracts/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/no-contracts/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/no-contracts/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/no-contracts/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/success/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/success/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/success/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/success/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json diff --git a/packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl b/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl diff --git a/packages/hardhat-ignition/packages/core/test/readEventArgument.ts b/packages/hardhat-ignition-legacy/packages/core/test/readEventArgument.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/readEventArgument.ts rename to packages/hardhat-ignition-legacy/packages/core/test/readEventArgument.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileSendData.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/helpers.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/helpers.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/helpers.ts diff --git a/packages/hardhat-ignition/packages/core/test/reconciliation/reconciler.ts b/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/reconciler.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/reconciliation/reconciler.ts rename to packages/hardhat-ignition-legacy/packages/core/test/reconciliation/reconciler.ts diff --git a/packages/hardhat-ignition/packages/core/test/send.ts b/packages/hardhat-ignition-legacy/packages/core/test/send.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/send.ts rename to packages/hardhat-ignition-legacy/packages/core/test/send.ts diff --git a/packages/hardhat-ignition/packages/core/test/setup.ts b/packages/hardhat-ignition-legacy/packages/core/test/setup.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/setup.ts rename to packages/hardhat-ignition-legacy/packages/core/test/setup.ts diff --git a/packages/hardhat-ignition/packages/core/test/staticCall.ts b/packages/hardhat-ignition-legacy/packages/core/test/staticCall.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/staticCall.ts rename to packages/hardhat-ignition-legacy/packages/core/test/staticCall.ts diff --git a/packages/hardhat-ignition/packages/core/test/status.ts b/packages/hardhat-ignition-legacy/packages/core/test/status.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/status.ts rename to packages/hardhat-ignition-legacy/packages/core/test/status.ts diff --git a/packages/hardhat-ignition/packages/core/test/types/deployment-loader.ts b/packages/hardhat-ignition-legacy/packages/core/test/types/deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/types/deployment-loader.ts rename to packages/hardhat-ignition-legacy/packages/core/test/types/deployment-loader.ts diff --git a/packages/hardhat-ignition/packages/core/test/types/module.ts b/packages/hardhat-ignition-legacy/packages/core/test/types/module.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/types/module.ts rename to packages/hardhat-ignition-legacy/packages/core/test/types/module.ts diff --git a/packages/hardhat-ignition/packages/core/test/useModule.ts b/packages/hardhat-ignition-legacy/packages/core/test/useModule.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/useModule.ts rename to packages/hardhat-ignition-legacy/packages/core/test/useModule.ts diff --git a/packages/hardhat-ignition/packages/core/test/utils/adjacency-list.ts b/packages/hardhat-ignition-legacy/packages/core/test/utils/adjacency-list.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/utils/adjacency-list.ts rename to packages/hardhat-ignition-legacy/packages/core/test/utils/adjacency-list.ts diff --git a/packages/hardhat-ignition/packages/core/test/utils/check-automined-network.ts b/packages/hardhat-ignition-legacy/packages/core/test/utils/check-automined-network.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/utils/check-automined-network.ts rename to packages/hardhat-ignition-legacy/packages/core/test/utils/check-automined-network.ts diff --git a/packages/hardhat-ignition/packages/core/test/utils/future-id-builders.ts b/packages/hardhat-ignition-legacy/packages/core/test/utils/future-id-builders.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/utils/future-id-builders.ts rename to packages/hardhat-ignition-legacy/packages/core/test/utils/future-id-builders.ts diff --git a/packages/hardhat-ignition/packages/core/test/utils/replace-within-arg.ts b/packages/hardhat-ignition-legacy/packages/core/test/utils/replace-within-arg.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/utils/replace-within-arg.ts rename to packages/hardhat-ignition-legacy/packages/core/test/utils/replace-within-arg.ts diff --git a/packages/hardhat-ignition/packages/core/test/validations/id-rules.ts b/packages/hardhat-ignition-legacy/packages/core/test/validations/id-rules.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/validations/id-rules.ts rename to packages/hardhat-ignition-legacy/packages/core/test/validations/id-rules.ts diff --git a/packages/hardhat-ignition/packages/core/test/validations/identifier-validators.ts b/packages/hardhat-ignition-legacy/packages/core/test/validations/identifier-validators.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/validations/identifier-validators.ts rename to packages/hardhat-ignition-legacy/packages/core/test/validations/identifier-validators.ts diff --git a/packages/hardhat-ignition/packages/core/test/verify.ts b/packages/hardhat-ignition-legacy/packages/core/test/verify.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/verify.ts rename to packages/hardhat-ignition-legacy/packages/core/test/verify.ts diff --git a/packages/hardhat-ignition/packages/core/test/wipe.ts b/packages/hardhat-ignition-legacy/packages/core/test/wipe.ts similarity index 100% rename from packages/hardhat-ignition/packages/core/test/wipe.ts rename to packages/hardhat-ignition-legacy/packages/core/test/wipe.ts diff --git a/packages/hardhat-ignition/packages/core/tsconfig.json b/packages/hardhat-ignition-legacy/packages/core/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/packages/core/tsconfig.json rename to packages/hardhat-ignition-legacy/packages/core/tsconfig.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.mocharc.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.mocharc.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.mocharc.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.mocharc.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.npmignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.npmignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.npmignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.nycrc similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.nycrc rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.nycrc diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/.prettierignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.prettierignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/.prettierignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.prettierignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/CHANGELOG.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/CHANGELOG.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/README.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/README.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/README.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/README.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/package.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/package.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/package.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/index.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/index.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/index.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/type-extensions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/src/type-extensions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/type-extensions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/default-sender.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/default-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/default-sender.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/default-sender.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/setup.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/setup.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/setup.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/setup.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-ethers/tsconfig.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-ethers/tsconfig.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/tsconfig.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.mocharc.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.mocharc.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.mocharc.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.mocharc.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.npmignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.npmignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.npmignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.nycrc similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.nycrc rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.nycrc diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/.prettierignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.prettierignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/.prettierignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.prettierignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/CHANGELOG.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/CHANGELOG.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/README.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/README.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/README.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/README.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/package.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/package.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/package.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/package.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/index.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/src/index.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/index.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/type-extensions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/src/type-extensions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/type-extensions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/default-sender.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/default-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/default-sender.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/default-sender.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/setup.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/setup.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/setup.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/setup.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/use-module.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/use-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/use-module.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/use-module.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-results.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-results.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/test/viem-results.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-results.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin-viem/tsconfig.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin-viem/tsconfig.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/tsconfig.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.mocharc.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.mocharc.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.mocharc.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.npmignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.npmignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.npmignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.npmignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.nycrc b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.nycrc similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.nycrc rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.nycrc diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/.prettierignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.prettierignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/.prettierignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/.prettierignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/CHANGELOG.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/CHANGELOG.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/README.md b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/README.md similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/README.md rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/README.md diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/package.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/package.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/package.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/package.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/helpers.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/helpers.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/helpers.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/index.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/index.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/index.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/modules.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/modules.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/modules.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/type-extensions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/type-extensions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/pretty-event-handler.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/pretty-event-handler.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/types.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/types.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/types.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/verbose-event-handler.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/ui/verbose-event-handler.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/verbose-event-handler.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/bigintReviver.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/bigintReviver.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/bigintReviver.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/load-module.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/load-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/load-module.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/load-module.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/open.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/open.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/open.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/open.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/visualization/write-visualization.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/src/visualization/write-visualization.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/visualization/write-visualization.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/.eslintrc.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/.eslintrc.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/.eslintrc.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/config.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/config.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/config.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/config.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/default-sender.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/default-sender.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/default-sender.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/gas-estimation.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/gas-estimation.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/gas-estimation.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/gas-estimation.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/reset.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/reset.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/reset.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/reset.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/writeLocalhost.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/writeLocalhost.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/deploy/writeLocalhost.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/writeLocalhost.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/.gitignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/.gitignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ignition-helper-guard.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ignition-helper-guard.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ignition-helper-guard.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ignition-helper-guard.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/calls.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/calls.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/calls.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/calls.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/contracts.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/contracts.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/contracts.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/contracts.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/events.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/events.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/events.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/events.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/existing-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/existing-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/existing-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/existing-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/libraries.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/libraries.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/libraries.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/libraries.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/params.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/params.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/params.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/params.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/static-calls.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/static-calls.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/static-calls.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/static-calls.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/use-module.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/use-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-api/use-module.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/use-module.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-parameters.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/module-parameters.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-parameters.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/plan/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/plan/index.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/plan/index.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/setup.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/setup.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/setup.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/create2.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/create2.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/create2.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/createX-tx.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/createX-tx.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/createX-tx.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/createX-tx.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/mine-block.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/mine-block.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/mine-block.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/mine-block.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/sleep.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/sleep.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/sleep.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/sleep.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/type-helper.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/type-helper.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/type-helper.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/type-helper.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/test-format.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/test-format.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/helpers/test-format.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/test-format.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/ui/pretty-event-handler.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/ui/pretty-event-handler.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/pretty-event-handler.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/bigintReviver.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/utils/bigintReviver.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/bigintReviver.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/load-module.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/load-module.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/utils/load-module.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/load-module.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/index.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/index.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/verify/index.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/index.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts diff --git a/packages/hardhat-ignition/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-ignition-legacy/packages/hardhat-plugin/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/packages/hardhat-plugin/tsconfig.json rename to packages/hardhat-ignition-legacy/packages/hardhat-plugin/tsconfig.json diff --git a/packages/hardhat-ignition/packages/ui/.eslintrc.cjs b/packages/hardhat-ignition-legacy/packages/ui/.eslintrc.cjs similarity index 100% rename from packages/hardhat-ignition/packages/ui/.eslintrc.cjs rename to packages/hardhat-ignition-legacy/packages/ui/.eslintrc.cjs diff --git a/packages/hardhat-ignition/packages/ui/.gitignore b/packages/hardhat-ignition-legacy/packages/ui/.gitignore similarity index 100% rename from packages/hardhat-ignition/packages/ui/.gitignore rename to packages/hardhat-ignition-legacy/packages/ui/.gitignore diff --git a/packages/hardhat-ignition/packages/ui/.mocharc.json b/packages/hardhat-ignition-legacy/packages/ui/.mocharc.json similarity index 100% rename from packages/hardhat-ignition/packages/ui/.mocharc.json rename to packages/hardhat-ignition-legacy/packages/ui/.mocharc.json diff --git a/packages/hardhat-ignition/packages/ui/.npmignore b/packages/hardhat-ignition-legacy/packages/ui/.npmignore similarity index 100% rename from packages/hardhat-ignition/packages/ui/.npmignore rename to packages/hardhat-ignition-legacy/packages/ui/.npmignore diff --git a/packages/hardhat-ignition/packages/ui/.nycrc b/packages/hardhat-ignition-legacy/packages/ui/.nycrc similarity index 100% rename from packages/hardhat-ignition/packages/ui/.nycrc rename to packages/hardhat-ignition-legacy/packages/ui/.nycrc diff --git a/packages/hardhat-ignition/packages/ui/CHANGELOG.md b/packages/hardhat-ignition-legacy/packages/ui/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition/packages/ui/CHANGELOG.md rename to packages/hardhat-ignition-legacy/packages/ui/CHANGELOG.md diff --git a/packages/hardhat-ignition/packages/ui/README.md b/packages/hardhat-ignition-legacy/packages/ui/README.md similarity index 100% rename from packages/hardhat-ignition/packages/ui/README.md rename to packages/hardhat-ignition-legacy/packages/ui/README.md diff --git a/packages/hardhat-ignition/packages/ui/examples/ComplexModule.js b/packages/hardhat-ignition-legacy/packages/ui/examples/ComplexModule.js similarity index 100% rename from packages/hardhat-ignition/packages/ui/examples/ComplexModule.js rename to packages/hardhat-ignition-legacy/packages/ui/examples/ComplexModule.js diff --git a/packages/hardhat-ignition/packages/ui/index.html b/packages/hardhat-ignition-legacy/packages/ui/index.html similarity index 100% rename from packages/hardhat-ignition/packages/ui/index.html rename to packages/hardhat-ignition-legacy/packages/ui/index.html diff --git a/packages/hardhat-ignition/packages/ui/package.json b/packages/hardhat-ignition-legacy/packages/ui/package.json similarity index 100% rename from packages/hardhat-ignition/packages/ui/package.json rename to packages/hardhat-ignition-legacy/packages/ui/package.json diff --git a/packages/hardhat-ignition/packages/ui/public/.gitkeep b/packages/hardhat-ignition-legacy/packages/ui/public/.gitkeep similarity index 100% rename from packages/hardhat-ignition/packages/ui/public/.gitkeep rename to packages/hardhat-ignition-legacy/packages/ui/public/.gitkeep diff --git a/packages/hardhat-ignition/packages/ui/scripts/generate-example-deployment-json.js b/packages/hardhat-ignition-legacy/packages/ui/scripts/generate-example-deployment-json.js similarity index 100% rename from packages/hardhat-ignition/packages/ui/scripts/generate-example-deployment-json.js rename to packages/hardhat-ignition-legacy/packages/ui/scripts/generate-example-deployment-json.js diff --git a/packages/hardhat-ignition/packages/ui/src/assets/ExternalLinkIcon.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/assets/ExternalLinkIcon.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/assets/ExternalLinkIcon.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/assets/ExternalLinkIcon.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/assets/TooltipIcon.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/assets/TooltipIcon.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/assets/TooltipIcon.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/assets/TooltipIcon.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/assets/purple-rocket.png b/packages/hardhat-ignition-legacy/packages/ui/src/assets/purple-rocket.png similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/assets/purple-rocket.png rename to packages/hardhat-ignition-legacy/packages/ui/src/assets/purple-rocket.png diff --git a/packages/hardhat-ignition/packages/ui/src/components/mermaid.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/components/mermaid.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/components/mermaid.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/components/mermaid.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/components/socials/dc-logo.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/dc-logo.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/components/socials/dc-logo.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/components/socials/dc-logo.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/components/socials/gh-logo.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/gh-logo.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/components/socials/gh-logo.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/components/socials/gh-logo.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/components/socials/index.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/index.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/components/socials/index.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/components/socials/index.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/components/socials/tw-logo.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/tw-logo.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/components/socials/tw-logo.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/components/socials/tw-logo.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/main.css b/packages/hardhat-ignition-legacy/packages/ui/src/main.css similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/main.css rename to packages/hardhat-ignition-legacy/packages/ui/src/main.css diff --git a/packages/hardhat-ignition/packages/ui/src/main.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/main.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/main.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/main.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-batch.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-batch.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-batch.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-header.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/future-header.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-header.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/summary.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/summary.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/components/summary.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/summary.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/visualization-overview.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/pages/visualization-overview/visualization-overview.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/visualization-overview.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/queries/futures.ts b/packages/hardhat-ignition-legacy/packages/ui/src/queries/futures.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/queries/futures.ts rename to packages/hardhat-ignition-legacy/packages/ui/src/queries/futures.ts diff --git a/packages/hardhat-ignition/packages/ui/src/utils/argumentTypeToString.tsx b/packages/hardhat-ignition-legacy/packages/ui/src/utils/argumentTypeToString.tsx similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/utils/argumentTypeToString.tsx rename to packages/hardhat-ignition-legacy/packages/ui/src/utils/argumentTypeToString.tsx diff --git a/packages/hardhat-ignition/packages/ui/src/utils/to-escaped-id.ts b/packages/hardhat-ignition-legacy/packages/ui/src/utils/to-escaped-id.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/utils/to-escaped-id.ts rename to packages/hardhat-ignition-legacy/packages/ui/src/utils/to-escaped-id.ts diff --git a/packages/hardhat-ignition/packages/ui/src/utils/to-mermaid.ts b/packages/hardhat-ignition-legacy/packages/ui/src/utils/to-mermaid.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/utils/to-mermaid.ts rename to packages/hardhat-ignition-legacy/packages/ui/src/utils/to-mermaid.ts diff --git a/packages/hardhat-ignition/packages/ui/src/vite-env.d.ts b/packages/hardhat-ignition-legacy/packages/ui/src/vite-env.d.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/src/vite-env.d.ts rename to packages/hardhat-ignition-legacy/packages/ui/src/vite-env.d.ts diff --git a/packages/hardhat-ignition/packages/ui/test/to-mermaid.ts b/packages/hardhat-ignition-legacy/packages/ui/test/to-mermaid.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/test/to-mermaid.ts rename to packages/hardhat-ignition-legacy/packages/ui/test/to-mermaid.ts diff --git a/packages/hardhat-ignition/packages/ui/tsconfig.json b/packages/hardhat-ignition-legacy/packages/ui/tsconfig.json similarity index 100% rename from packages/hardhat-ignition/packages/ui/tsconfig.json rename to packages/hardhat-ignition-legacy/packages/ui/tsconfig.json diff --git a/packages/hardhat-ignition/packages/ui/tsconfig.node.json b/packages/hardhat-ignition-legacy/packages/ui/tsconfig.node.json similarity index 100% rename from packages/hardhat-ignition/packages/ui/tsconfig.node.json rename to packages/hardhat-ignition-legacy/packages/ui/tsconfig.node.json diff --git a/packages/hardhat-ignition/packages/ui/vite.config.ts b/packages/hardhat-ignition-legacy/packages/ui/vite.config.ts similarity index 100% rename from packages/hardhat-ignition/packages/ui/vite.config.ts rename to packages/hardhat-ignition-legacy/packages/ui/vite.config.ts diff --git a/packages/hardhat-ignition/pnpm-lock.yaml b/packages/hardhat-ignition-legacy/pnpm-lock.yaml similarity index 100% rename from packages/hardhat-ignition/pnpm-lock.yaml rename to packages/hardhat-ignition-legacy/pnpm-lock.yaml diff --git a/packages/hardhat-ignition/pnpm-workspace.yaml b/packages/hardhat-ignition-legacy/pnpm-workspace.yaml similarity index 100% rename from packages/hardhat-ignition/pnpm-workspace.yaml rename to packages/hardhat-ignition-legacy/pnpm-workspace.yaml From 7d8b313039d168a7be6865da0e7441755e893f05 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 15 Jan 2025 21:18:52 -0500 Subject: [PATCH 1299/1302] move ignition packages into top level workspace dir --- .../core => hardhat-ignition-core}/.eslintrc.js | 0 .../core => hardhat-ignition-core}/.gitignore | 0 .../core => hardhat-ignition-core}/.mocharc.json | 0 .../core => hardhat-ignition-core}/.npmignore | 0 .../packages/core => hardhat-ignition-core}/.nycrc | 0 .../core => hardhat-ignition-core}/.prettierignore | 0 .../core => hardhat-ignition-core}/.prettierrc | 0 .../core => hardhat-ignition-core}/CHANGELOG.md | 0 .../core => hardhat-ignition-core}/README.md | 0 .../api-extractor.json | 0 .../core => hardhat-ignition-core}/package.json | 0 .../core => hardhat-ignition-core}/src/batches.ts | 0 .../src/build-module.ts | 0 .../core => hardhat-ignition-core}/src/deploy.ts | 0 .../core => hardhat-ignition-core}/src/errors.ts | 0 .../src/ignition-module-serializer.ts | 0 .../core => hardhat-ignition-core}/src/index.ts | 0 .../src/internal/batcher.ts | 0 .../src/internal/chain-config.ts | 0 .../src/internal/defaultConfig.ts | 0 .../src/internal/deployer.ts | 0 .../ephemeral-deployment-loader.ts | 0 .../deployment-loader/file-deployment-loader.ts | 0 .../src/internal/deployment-loader/types.ts | 0 .../src/internal/errors-list.ts | 0 .../src/internal/execution/abi.ts | 0 .../internal/execution/deployment-state-helpers.ts | 0 .../src/internal/execution/execution-engine.ts | 0 .../execution/execution-strategy-helpers.ts | 0 .../execution/future-processor/future-processor.ts | 0 .../handlers/monitor-onchain-interaction.ts | 0 .../future-processor/handlers/query-static-call.ts | 0 .../future-processor/handlers/run-strategy.ts | 0 .../future-processor/handlers/send-transaction.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/decode-simulation-result.ts | 0 .../future-processor/helpers/future-resolvers.ts | 0 .../future-processor/helpers/messages-helpers.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../helpers/next-action-for-execution-state.ts | 0 .../future-processor/helpers/replay-strategy.ts | 0 .../helpers/save-artifacts-for-future.ts | 0 .../src/internal/execution/jsonrpc-client.ts | 0 .../src/internal/execution/libraries.ts | 0 .../get-max-nonce-used-by-sender.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../nonce-management/json-rpc-nonce-manager.ts | 0 .../execution/reducers/deployment-state-reducer.ts | 0 .../execution/reducers/execution-state-reducer.ts | 0 .../reducers/helpers/complete-execution-state.ts | 0 .../reducers/helpers/deployment-state-helpers.ts | 0 .../execution/reducers/helpers/initializers.ts | 0 .../reducers/helpers/network-interaction-helpers.ts | 0 .../internal/execution/strategy/createx-artifact.ts | 0 .../execution/transaction-tracking-timer.ts | 0 .../src/internal/execution/type-helpers.ts | 0 .../internal/execution/types/deployment-state.ts | 0 .../src/internal/execution/types/evm-execution.ts | 0 .../internal/execution/types/execution-result.ts | 0 .../src/internal/execution/types/execution-state.ts | 0 .../internal/execution/types/execution-strategy.ts | 0 .../src/internal/execution/types/jsonrpc.ts | 0 .../src/internal/execution/types/messages.ts | 0 .../internal/execution/types/network-interaction.ts | 0 .../src/internal/execution/utils/address.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../internal/execution/utils/get-default-sender.ts | 0 .../src/internal/formatters.ts | 0 .../src/internal/journal/file-journal.ts | 0 .../src/internal/journal/memory-journal.ts | 0 .../src/internal/journal/types/index.ts | 0 .../internal/journal/utils/deserialize-replacer.ts | 0 .../internal/journal/utils/emitExecutionEvent.ts | 0 .../failedEvmExecutionResultToErrorDescription.ts | 0 .../src/internal/journal/utils/log.ts | 0 .../internal/journal/utils/serialize-replacer.ts | 0 .../src/internal/module-builder.ts | 0 .../src/internal/module.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../src/internal/reconciliation/helpers/compare.ts | 0 .../reconciliation/helpers/reconcile-address.ts | 0 .../reconciliation/helpers/reconcile-arguments.ts | 0 .../reconciliation/helpers/reconcile-artifacts.ts | 0 .../helpers/reconcile-contract-name.ts | 0 .../reconciliation/helpers/reconcile-contract.ts | 0 .../reconciliation/helpers/reconcile-data.ts | 0 .../reconciliation/helpers/reconcile-from.ts | 0 .../helpers/reconcile-function-name.ts | 0 .../reconciliation/helpers/reconcile-libraries.ts | 0 .../reconciliation/helpers/reconcile-strategy.ts | 0 .../reconciliation/helpers/reconcile-value.ts | 0 .../reconcile-current-and-previous-type-match.ts | 0 .../reconciliation/reconcile-dependency-rules.ts | 0 .../reconcile-future-specific-reconciliations.ts | 0 .../src/internal/reconciliation/reconciler.ts | 0 .../src/internal/reconciliation/types.ts | 0 .../src/internal/reconciliation/utils.ts | 0 .../src/internal/topological-order.ts | 0 .../src/internal/utils.ts | 0 .../src/internal/utils/adjacency-list-converter.ts | 0 .../src/internal/utils/adjacency-list.ts | 0 .../src/internal/utils/assertions.ts | 0 .../src/internal/utils/check-automined-network.ts | 0 .../src/internal/utils/future-id-builders.ts | 0 .../src/internal/utils/get-futures-from-module.ts | 0 .../src/internal/utils/identifier-validators.ts | 0 .../src/internal/utils/replace-within-arg.ts | 0 .../src/internal/utils/resolve-module-parameter.ts | 0 .../futures/validateArtifactContractAt.ts | 0 .../futures/validateArtifactContractDeployment.ts | 0 .../futures/validateArtifactLibraryDeployment.ts | 0 .../validation/futures/validateNamedContractAt.ts | 0 .../validation/futures/validateNamedContractCall.ts | 0 .../futures/validateNamedContractDeployment.ts | 0 .../futures/validateNamedEncodeFunctionCall.ts | 0 .../futures/validateNamedLibraryDeployment.ts | 0 .../validation/futures/validateNamedStaticCall.ts | 0 .../validation/futures/validateReadEventArgument.ts | 0 .../internal/validation/futures/validateSendData.ts | 0 .../src/internal/validation/utils.ts | 0 .../src/internal/validation/validate.ts | 0 .../execution-state/find-onchain-interaction-by.ts | 0 .../views/execution-state/find-static-call-by.ts | 0 .../views/execution-state/find-transaction-by.ts | 0 .../execution-state/get-pending-nonce-and-sender.ts | 0 .../get-pending-onchain-interaction.ts | 0 .../views/find-address-for-contract-future-by-id.ts | 0 .../find-confirmed-transaction-by-future-id.ts | 0 .../src/internal/views/find-deployed-contracts.ts | 0 .../internal/views/find-execution-state-by-id.ts | 0 .../internal/views/find-execution-states-by-type.ts | 0 .../internal/views/find-result-for-future-by-id.ts | 0 .../src/internal/views/find-status.ts | 0 .../src/internal/views/has-execution-succeeded.ts | 0 .../src/internal/views/is-batch-finished.ts | 0 .../internal/views/is-execution-state-complete.ts | 0 .../src/internal/wiper.ts | 0 .../src/list-deployments.ts | 0 .../src/list-transactions.ts | 0 .../core => hardhat-ignition-core}/src/status.ts | 0 .../src/strategies/basic-strategy.ts | 0 .../src/strategies/create2-strategy.ts | 0 .../src/strategies/resolve-strategy.ts | 0 .../src/type-guards.ts | 0 .../src/types/artifact.ts | 0 .../src/types/deploy.ts | 0 .../src/types/errors.ts | 0 .../src/types/execution-events.ts | 0 .../src/types/list-transactions.ts | 0 .../src/types/module-builder.ts | 0 .../src/types/module.ts | 0 .../src/types/provider.ts | 0 .../src/types/serialization.ts | 0 .../src/types/status.ts | 0 .../src/types/verify.ts | 0 .../src/ui-helpers.ts | 0 .../core => hardhat-ignition-core}/src/verify.ts | 0 .../core => hardhat-ignition-core}/src/wipe.ts | 0 .../test-integrations/.eslintrc.js | 0 .../test-integrations/fixture-projects/.gitignore | 0 .../fixture-projects/ci-success/contracts/Lock.sol | 0 .../fixture-projects/ci-success/hardhat.config.js | 0 .../ci-success/ignition/modules/LockModule.js | 0 .../default-with-new-chain-id/contracts/Lock.sol | 0 .../default-with-new-chain-id/hardhat.config.js | 0 .../deployments/chain-1337/deployed_addresses.json | 0 .../ignition/deployments/chain-1337/journal.jsonl | 0 .../ignition/modules/LockModule.js | 0 .../fixture-projects/default/contracts/C.sol | 0 .../fixture-projects/default/contracts/Libs.sol | 0 .../fixture-projects/default/hardhat.config.js | 0 .../dont-throw-on-reverts/hardhat.config.js | 0 .../test-integrations/helpers/hardhat-projects.ts | 0 .../test-integrations/new-api/ci/basic-success.ts | 0 .../internal/new-execution/jsonrpc-client.ts | 0 .../new-api/internal/reconciliation/chainId.ts | 0 .../test-execution-result-fixtures.ts | 0 .../test/.eslintrc.js | 0 .../core => hardhat-ignition-core}/test/batcher.ts | 0 .../test/build-module.ts | 0 .../core => hardhat-ignition-core}/test/call.ts | 0 .../core => hardhat-ignition-core}/test/contract.ts | 0 .../test/contractAt.ts | 0 .../test/contractAtFromArtifact.ts | 0 .../test/contractFromArtifact.ts | 0 .../test/encodeFunctionCall.ts | 0 .../test/execution/abi.ts | 0 .../helpers/build-initialize-message-for.ts | 0 .../helpers/network-interaction-execution.ts | 0 .../future-processor/named-contract-at-deploy.ts | 0 .../future-processor/named-contract-deploy.ts | 0 .../test/execution/future-processor/utils.ts | 0 .../test/execution/libraries.ts | 0 .../nonce-management/get-nonce-sync-messages.ts | 0 .../test/execution/reducers/running-a-call.ts | 0 .../reducers/running-a-named-contract-deploy.ts | 0 .../reducers/running-a-named-library-deploy.ts | 0 .../execution/reducers/running-a-read-event-arg.ts | 0 .../execution/reducers/running-a-static-call.ts | 0 .../test/execution/reducers/running-contract-at.ts | 0 .../test/execution/reducers/running-send-data.ts | 0 .../test/execution/reducers/start-a-new-run.ts | 0 .../test/execution/reducers/utils.ts | 0 .../utils/convert-evm-tuple-to-solidity-param.ts | 0 .../execution/views/find-result-for-future-by-id.ts | 0 .../test/getAccount.ts | 0 .../test/getParameter.ts | 0 .../core => hardhat-ignition-core}/test/helpers.ts | 0 .../test/helpers/exact-interface.ts | 0 .../test/helpers/execution-result-fixtures.ts | 0 .../test/ignition-module-serializer.ts | 0 .../core => hardhat-ignition-core}/test/library.ts | 0 .../test/libraryFromArtifact.ts | 0 .../test/list-transactions.ts | 0 .../test/listDeployments.ts | 0 .../listDeployments/has-deployments/chain-1/blank | 0 .../listDeployments/has-deployments/chain-2/blank | 0 .../artifacts/CompleteModule#BasicContract.dbg.json | 0 .../artifacts/CompleteModule#BasicContract.json | 0 .../CompleteModule#BasicContract2.dbg.json | 0 .../artifacts/CompleteModule#BasicContract2.json | 0 .../artifacts/CompleteModule#BasicLibrary.dbg.json | 0 .../artifacts/CompleteModule#BasicLibrary.json | 0 .../artifacts/CompleteModule#BasicLibrary2.json | 0 .../CompleteModule#ContractWithLibrary.json | 0 .../CompleteModule#ContractWithLibrary2.json | 0 .../0957b2d8bc1fe22551b79ef37cafc10a.json | 0 .../0fce7e4e9544f4b99b971b3b98da92d2.json | 0 .../success/deployed_addresses.json | 0 .../mocks/listTransactions/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifact/deployed_addresses.json | 0 .../mocks/status/external-artifact/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../status/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/status/success/deployed_addresses.json | 0 .../test/mocks/status/success/journal.jsonl | 0 .../artifacts/LockModule#Basic.json | 0 .../artifacts/LockModule#Basic2.json | 0 .../artifacts/LockModule#Lock.dbg.json | 0 .../artifacts/LockModule#Lock.json | 0 .../647c95b5130e7afe0806dc404d889d09.json | 0 .../external-artifacts/deployed_addresses.json | 0 .../mocks/verify/external-artifacts/journal.jsonl | 0 .../libraries/artifacts/LockModule#UUUUU.dbg.json | 0 .../libraries/artifacts/LockModule#UUUUU.json | 0 .../libraries/artifacts/LockModule#WAAIT.dbg.json | 0 .../libraries/artifacts/LockModule#WAAIT.json | 0 .../254cc89254e61cb6a9bf2c74f13055f1.json | 0 .../mocks/verify/libraries/deployed_addresses.json | 0 .../test/mocks/verify/libraries/journal.jsonl | 0 .../min-input/artifacts/LockModule#TestA.dbg.json | 0 .../min-input/artifacts/LockModule#TestA.json | 0 .../min-input/artifacts/LockModule#TestB.dbg.json | 0 .../min-input/artifacts/LockModule#TestB.json | 0 .../min-input/artifacts/LockModule#TestC.dbg.json | 0 .../min-input/artifacts/LockModule#TestC.json | 0 .../min-input/artifacts/LockModule#TestD.dbg.json | 0 .../min-input/artifacts/LockModule#TestD.json | 0 .../5a5467b3a2cddf6ce0f79584095e02d2.json | 0 .../mocks/verify/min-input/deployed_addresses.json | 0 .../test/mocks/verify/min-input/journal.jsonl | 0 .../test/mocks/verify/no-contracts/journal.jsonl | 0 .../success/artifacts/LockModule#Lock.dbg.json | 0 .../verify/success/artifacts/LockModule#Lock.json | 0 .../a119b7bb4b3dd21e4ae94d5054092087.json | 0 .../mocks/verify/success/deployed_addresses.json | 0 .../test/mocks/verify/success/journal.jsonl | 0 .../unsupported-chain/deployed_addresses.json | 0 .../mocks/verify/unsupported-chain/journal.jsonl | 0 .../test/readEventArgument.ts | 0 .../futures/reconcileArtifactContractAt.ts | 0 .../futures/reconcileArtifactContractDeployment.ts | 0 .../futures/reconcileArtifactLibraryDeployment.ts | 0 .../futures/reconcileNamedContractAt.ts | 0 .../futures/reconcileNamedContractCall.ts | 0 .../futures/reconcileNamedContractDeployment.ts | 0 .../futures/reconcileNamedEncodeFunctionCall.ts | 0 .../futures/reconcileNamedLibraryDeployment.ts | 0 .../futures/reconcileNamedStaticCall.ts | 0 .../futures/reconcileReadEventArgument.ts | 0 .../reconciliation/futures/reconcileSendData.ts | 0 .../test/reconciliation/helpers.ts | 0 .../test/reconciliation/reconciler.ts | 0 .../core => hardhat-ignition-core}/test/send.ts | 0 .../core => hardhat-ignition-core}/test/setup.ts | 0 .../test/staticCall.ts | 0 .../core => hardhat-ignition-core}/test/status.ts | 0 .../test/types/deployment-loader.ts | 0 .../test/types/module.ts | 0 .../test/useModule.ts | 0 .../test/utils/adjacency-list.ts | 0 .../test/utils/check-automined-network.ts | 0 .../test/utils/future-id-builders.ts | 0 .../test/utils/replace-within-arg.ts | 0 .../test/validations/id-rules.ts | 0 .../test/validations/identifier-validators.ts | 0 .../core => hardhat-ignition-core}/test/verify.ts | 0 .../core => hardhat-ignition-core}/test/wipe.ts | 0 .../core => hardhat-ignition-core}/tsconfig.json | 0 .../.eslintrc.js | 0 .../.gitignore | 0 .../.mocharc.json | 0 .../.npmignore | 0 .../.nycrc | 0 .../.prettierignore | 0 .../CHANGELOG.md | 0 .../README.md | 0 .../package.json | 0 .../src/ethers-ignition-helper.ts | 0 .../src/index.ts | 0 .../src/type-extensions.ts | 0 .../test/.eslintrc.js | 0 .../test/default-sender.ts | 0 .../test/deploy-with-ethers-result.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Foo.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/FooModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../tsconfig.json | 0 .../ui => hardhat-ignition-ui}/.eslintrc.cjs | 0 .../packages/ui => hardhat-ignition-ui}/.gitignore | 0 .../ui => hardhat-ignition-ui}/.mocharc.json | 0 .../packages/ui => hardhat-ignition-ui}/.npmignore | 0 .../packages/ui => hardhat-ignition-ui}/.nycrc | 0 .../ui => hardhat-ignition-ui}/CHANGELOG.md | 0 .../packages/ui => hardhat-ignition-ui}/README.md | 0 .../examples/ComplexModule.js | 0 .../packages/ui => hardhat-ignition-ui}/index.html | 0 .../ui => hardhat-ignition-ui}/package.json | 0 .../ui => hardhat-ignition-ui}/public/.gitkeep | 0 .../scripts/generate-example-deployment-json.js | 0 .../src/assets/ExternalLinkIcon.tsx | 0 .../src/assets/TooltipIcon.tsx | 0 .../src/assets/purple-rocket.png | Bin .../src/components/mermaid.tsx | 0 .../src/components/socials/dc-logo.tsx | 0 .../src/components/socials/gh-logo.tsx | 0 .../src/components/socials/index.tsx | 0 .../src/components/socials/tw-logo.tsx | 0 .../ui => hardhat-ignition-ui}/src/main.css | 0 .../ui => hardhat-ignition-ui}/src/main.tsx | 0 .../components/deployment-flow.tsx | 0 .../components/execution-batches.tsx | 0 .../components/future-batch.tsx | 0 .../components/future-header.tsx | 0 .../visualization-overview/components/summary.tsx | 0 .../visualization-overview.tsx | 0 .../src/queries/futures.ts | 0 .../src/utils/argumentTypeToString.tsx | 0 .../src/utils/to-escaped-id.ts | 0 .../src/utils/to-mermaid.ts | 0 .../ui => hardhat-ignition-ui}/src/vite-env.d.ts | 0 .../ui => hardhat-ignition-ui}/test/to-mermaid.ts | 0 .../ui => hardhat-ignition-ui}/tsconfig.json | 0 .../ui => hardhat-ignition-ui}/tsconfig.node.json | 0 .../ui => hardhat-ignition-ui}/vite.config.ts | 0 .../.eslintrc.js | 0 .../.gitignore | 0 .../.mocharc.json | 0 .../.npmignore | 0 .../.nycrc | 0 .../.prettierignore | 0 .../CHANGELOG.md | 0 .../README.md | 0 .../package.json | 0 .../scripts/compile-test-fixture-project.ts | 0 .../ignition-module-results-to-viem-contracts.ts | 0 .../src/index.ts | 0 .../src/type-extensions.ts | 0 .../src/viem-ignition-helper.ts | 0 .../test/.eslintrc.js | 0 .../test/default-sender.ts | 0 .../test/fixture-projects/.gitignore | 0 .../test/fixture-projects/create2/contracts/Baz.sol | 0 .../test/fixture-projects/create2/hardhat.config.js | 0 .../fixture-projects/create2/modules/BazModule.js | 0 .../minimal/contracts/Contracts.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../with-fake-helper/hardhat.config.js | 0 .../test/fixture-projects/with-fake-helper/index.js | 0 .../test/ignition-helper-exclusivity.ts | 0 .../test/setup.ts | 0 .../test/strategies/helper-invocation.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../test/use-module.ts | 0 .../test/viem-instances/artifact-contract-at.ts | 0 .../viem-instances/artifact-deployment-contract.ts | 0 .../test/viem-instances/named-contract-at.ts | 0 .../viem-instances/named-deployment-contract.ts | 0 .../test/viem-results.ts | 0 .../tsconfig.json | 0 .../.eslintrc.js | 0 .../hardhat-plugin => hardhat-ignition}/.gitignore | 0 .../.mocharc.json | 0 .../hardhat-plugin => hardhat-ignition}/.npmignore | 0 .../hardhat-plugin => hardhat-ignition}/.nycrc | 0 .../.prettierignore | 0 .../CHANGELOG.md | 0 .../hardhat-plugin => hardhat-ignition}/README.md | 0 .../package.json | 0 .../src/hardhat-artifact-resolver.ts | 0 .../src/helpers.ts | 0 .../src/index.ts | 0 .../src/modules.ts | 0 .../src/type-extensions.ts | 0 .../src/ui/helpers/calculate-batch-display.ts | 0 .../ui/helpers/calculate-deploying-module-panel.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../src/ui/helpers/calculate-starting-message.ts | 0 .../src/ui/helpers/cwd-relative-path.ts | 0 .../src/ui/helpers/was-anything-executed.ts | 0 .../src/ui/pretty-event-handler.ts | 0 .../src/ui/types.ts | 0 .../src/ui/verbose-event-handler.ts | 0 .../src/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../src/utils/getApiKeyAndUrls.ts | 0 .../src/utils/load-module.ts | 0 .../src/utils/open.ts | 0 .../src/utils/read-deployment-parameters.ts | 0 .../src/utils/resolve-deployment-id.ts | 0 .../src/utils/shouldBeHardhatPluginError.ts | 0 .../src/utils/verifyEtherscanContract.ts | 0 .../src/visualization/write-visualization.ts | 0 .../test/.eslintrc.js | 0 .../test/config.ts | 0 .../test/deploy/default-sender.ts | 0 .../test/deploy/gas-estimation.ts | 0 .../test/deploy/multiple-batch-contract-deploy.ts | 0 .../error-on-pending-user-transactions.ts | 0 ...-rerun-with-replaced-pending-user-transaction.ts | 0 .../nonce-checks/error-on-transaction-dropped.ts | 0 .../nonce-checks/error-on-user-transaction-sent.ts | 0 .../rerun-with-dropped-ignition-transaction.ts | 0 ...rerun-with-now-complete-ignition-transactions.ts | 0 .../rerun-with-pending-ignition-transactions.ts | 0 ...erun-with-replaced-confirmed-user-transaction.ts | 0 .../revert-nonce-on-simulation-error.ts | 0 .../deploy/rerun/rerun-a-deploy-that-timed-out.ts | 0 .../test/deploy/rerun/rerun-after-kill.ts | 0 .../deploy/rerun/rerun-with-new-contract-deploy.ts | 0 .../test/deploy/reset.ts | 0 .../test/deploy/timeouts/deploy-run-times-out.ts | 0 .../test/deploy/writeLocalhost.ts | 0 .../test/fixture-projects/.gitignore | 0 .../create2-bad-config/contracts/Foo.sol | 0 .../create2-bad-config/hardhat.config.js | 0 .../create2-bad-config/ignition/modules/MyModule.js | 0 .../create2-exists-chain/contracts/Foo.sol | 0 .../create2-exists-chain/contracts/Unpayable.sol | 0 .../create2-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../create2-not-exists-chain/contracts/Foo.sol | 0 .../create2-not-exists-chain/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../test/fixture-projects/lock/contracts/Lock.sol | 0 .../test/fixture-projects/lock/hardhat.config.js | 0 .../fixture-projects/lock/ignition/modules/Lock.ts | 0 .../modules/parameters-bigints-as-strings.json | 0 .../lock/ignition/modules/parameters-json5.json5 | 0 .../lock/ignition/modules/parameters-too-large.json | 0 .../lock/ignition/modules/parameters.json | 0 .../test/fixture-projects/minimal/contracts/Bar.sol | 0 .../minimal/contracts/CaptureArraysContract.sol | 0 .../contracts/CaptureComplexObjectContract.sol | 0 .../minimal/contracts/EventArgValue.sol | 0 .../fixture-projects/minimal/contracts/Factory.sol | 0 .../fixture-projects/minimal/contracts/Fails.sol | 0 .../minimal/contracts/FailureCalls.sol | 0 .../test/fixture-projects/minimal/contracts/Foo.sol | 0 .../fixture-projects/minimal/contracts/Greeter.sol | 0 .../fixture-projects/minimal/contracts/Ownable.sol | 0 .../fixture-projects/minimal/contracts/Owner.sol | 0 .../minimal/contracts/SendDataEmitter.sol | 0 .../minimal/contracts/StaticCallValue.sol | 0 .../fixture-projects/minimal/contracts/Trace.sol | 0 .../minimal/contracts/TupleEmitter.sol | 0 .../minimal/contracts/TupleReturn.sol | 0 .../minimal/contracts/UsesContract.sol | 0 .../minimal/contracts/WithLibrary.sol | 0 .../test/fixture-projects/minimal/hardhat.config.js | 0 .../minimal/ignition/modules/MyModule.js | 0 .../minimal/ignition/modules/OwnModule.js | 0 .../contracts/Rocket1.sol | 0 .../contracts/Rocket2.sol | 0 .../hardhat.config.js | 0 .../reset-flag/contracts/Contracts.sol | 0 .../fixture-projects/reset-flag/hardhat.config.js | 0 .../reset-flag/ignition/modules/FirstPass.js | 0 .../reset-flag/ignition/modules/SecondPass.js | 0 .../test/fixture-projects/reset-flag/journal.jsonl | 0 .../user-modules/contracts/Contracts.sol | 0 .../user-modules/contracts/WithLibrary.sol | 0 .../fixture-projects/user-modules/hardhat.config.js | 0 .../user-modules/ignition/.testignore | 0 .../user-modules/ignition/modules/TestModule.js | 0 .../verify-no-api-key/hardhat.config.js | 0 .../with-config/contracts/Contracts.sol | 0 .../with-config/contracts/Trace.sol | 0 .../with-config/contracts/WithLibrary.sol | 0 .../fixture-projects/with-config/hardhat.config.js | 0 .../with-config/ignition/modules/MyModule.js | 0 .../with-invalid-config/contracts/Contracts.sol | 0 .../with-invalid-config/contracts/Trace.sol | 0 .../with-invalid-config/contracts/WithLibrary.sol | 0 .../with-invalid-config/hardhat.config.js | 0 .../ignition/modules/MyModule.js | 0 .../test/ignition-helper-guard.ts | 0 .../test/module-api/calls.ts | 0 .../test/module-api/contracts.ts | 0 .../test/module-api/events.ts | 0 .../test/module-api/existing-contract.ts | 0 .../test/module-api/fully-qualified-names.ts | 0 .../test/module-api/libraries.ts | 0 .../test/module-api/params.ts | 0 .../test/module-api/static-calls.ts | 0 .../test/module-api/use-module.ts | 0 .../test/module-parameters.ts | 0 .../test/plan/index.ts | 0 .../test/setup.ts | 0 .../test/strategies/create2.ts | 0 .../test/strategies/generic-strategy-constraints.ts | 0 .../test/strategies/only-built-in-strategies.ts | 0 .../clear-pending-transactions-from-memory-pool.ts | 0 .../test/test-helpers/createX-tx.ts | 0 .../test/test-helpers/externally-loaded-contract.ts | 0 .../test/test-helpers/get-balance-for.ts | 0 .../test/test-helpers/mine-block.ts | 0 .../test/test-helpers/sleep.ts | 0 .../test/test-helpers/test-ignition-helper.ts | 0 .../test/test-helpers/type-helper.ts | 0 .../test/test-helpers/use-ignition-project.ts | 0 .../test/test-helpers/wait-for-pending-txs.ts | 0 .../test/ui/helpers/calculate-batch-display.ts | 0 .../calculate-deploying-module-panel-display.ts | 0 .../calculate-deployment-complete-display.ts | 0 .../helpers/calculate-deployment-status-display.ts | 0 .../helpers/calculate-list-transactions-display.ts | 0 .../test/ui/helpers/calculate-starting-message.ts | 0 .../test/ui/helpers/test-format.ts | 0 .../test/ui/pretty-event-handler.ts | 0 .../test/utils/bigintReviver.ts | 0 .../error-deployment-result-to-exception-message.ts | 0 .../test/utils/load-module.ts | 0 .../test/utils/resolve-deployment-id.ts | 0 .../test/verify/getApiKeyAndUrls.ts | 0 .../test/verify/index.ts | 0 .../test/verify/verifyEtherscanContract.ts | 0 .../tsconfig.json | 0 579 files changed, 0 insertions(+), 0 deletions(-) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.mocharc.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.npmignore (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.nycrc (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.prettierignore (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/.prettierrc (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/CHANGELOG.md (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/README.md (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/api-extractor.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/package.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/batches.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/build-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/errors.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/ignition-module-serializer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/batcher.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/chain-config.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/defaultConfig.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/deployer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/deployment-loader/ephemeral-deployment-loader.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/deployment-loader/file-deployment-loader.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/deployment-loader/types.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/errors-list.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/abi.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/deployment-state-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/execution-engine.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/execution-strategy-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/future-processor.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/handlers/query-static-call.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/handlers/run-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/handlers/send-transaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/decode-simulation-result.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/future-resolvers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/messages-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/replay-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/jsonrpc-client.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/libraries.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/deployment-state-reducer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/execution-state-reducer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/helpers/complete-execution-state.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/helpers/deployment-state-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/helpers/initializers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/reducers/helpers/network-interaction-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/strategy/createx-artifact.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/transaction-tracking-timer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/type-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/deployment-state.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/evm-execution.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/execution-result.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/execution-state.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/execution-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/jsonrpc.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/messages.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/types/network-interaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/utils/address.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/execution/utils/get-default-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/formatters.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/file-journal.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/memory-journal.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/types/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/utils/deserialize-replacer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/utils/emitExecutionEvent.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/utils/log.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/journal/utils/serialize-replacer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/module-builder.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/compare.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-address.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-arguments.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-artifacts.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-contract-name.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-data.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-from.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-function-name.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-libraries.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/helpers/reconcile-value.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/reconcile-dependency-rules.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/reconciler.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/types.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/reconciliation/utils.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/topological-order.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/adjacency-list-converter.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/adjacency-list.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/assertions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/check-automined-network.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/future-id-builders.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/get-futures-from-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/identifier-validators.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/replace-within-arg.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/utils/resolve-module-parameter.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateArtifactContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedContractCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateNamedStaticCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateReadEventArgument.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/futures/validateSendData.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/utils.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/validation/validate.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/execution-state/find-onchain-interaction-by.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/execution-state/find-static-call-by.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/execution-state/find-transaction-by.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/execution-state/get-pending-nonce-and-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/execution-state/get-pending-onchain-interaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-address-for-contract-future-by-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-confirmed-transaction-by-future-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-deployed-contracts.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-execution-state-by-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-execution-states-by-type.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-result-for-future-by-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/find-status.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/has-execution-succeeded.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/is-batch-finished.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/views/is-execution-state-complete.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/internal/wiper.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/list-deployments.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/list-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/status.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/strategies/basic-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/strategies/create2-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/strategies/resolve-strategy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/type-guards.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/artifact.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/errors.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/execution-events.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/list-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/module-builder.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/provider.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/serialization.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/status.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/types/verify.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/ui-helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/verify.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/src/wipe.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/ci-success/contracts/Lock.sol (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/ci-success/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default/contracts/C.sol (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default/contracts/Libs.sol (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/default/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/helpers/hardhat-projects.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/new-api/ci/basic-success.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/new-api/internal/reconciliation/chainId.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test-integrations/test-execution-result-fixtures.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/batcher.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/build-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/call.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/contractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/contractAtFromArtifact.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/contractFromArtifact.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/encodeFunctionCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/abi.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/future-processor/helpers/build-initialize-message-for.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/future-processor/helpers/network-interaction-execution.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/future-processor/named-contract-at-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/future-processor/named-contract-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/future-processor/utils.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/libraries.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/nonce-management/get-nonce-sync-messages.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-a-call.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-a-named-contract-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-a-named-library-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-a-read-event-arg.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-a-static-call.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-contract-at.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/running-send-data.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/start-a-new-run.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/reducers/utils.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/utils/convert-evm-tuple-to-solidity-param.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/execution/views/find-result-for-future-by-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/getAccount.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/getParameter.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/helpers/exact-interface.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/helpers/execution-result-fixtures.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/ignition-module-serializer.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/library.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/libraryFromArtifact.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/list-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/listDeployments.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listDeployments/has-deployments/chain-1/blank (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listDeployments/has-deployments/chain-2/blank (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/listTransactions/success/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/external-artifact/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/success/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/status/success/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/external-artifacts/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/libraries/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestA.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestB.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestC.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/artifacts/LockModule#TestD.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/min-input/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/no-contracts/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/success/artifacts/LockModule#Lock.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/success/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/success/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/unsupported-chain/deployed_addresses.json (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/mocks/verify/unsupported-chain/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/readEventArgument.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileArtifactContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileArtifactContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedContractAt.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedContractCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedContractDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileNamedStaticCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileReadEventArgument.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/futures/reconcileSendData.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/reconciliation/reconciler.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/send.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/setup.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/staticCall.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/status.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/types/deployment-loader.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/types/module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/useModule.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/utils/adjacency-list.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/utils/check-automined-network.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/utils/future-id-builders.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/utils/replace-within-arg.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/validations/id-rules.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/validations/identifier-validators.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/verify.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/test/wipe.ts (100%) rename packages/{hardhat-ignition-legacy/packages/core => hardhat-ignition-core}/tsconfig.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.mocharc.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.npmignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.nycrc (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/.prettierignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/CHANGELOG.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/README.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/package.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/src/ethers-ignition-helper.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/src/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/src/type-extensions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/default-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/deploy-with-ethers-result.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/create2/contracts/Foo.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/create2/modules/FooModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/ignition-helper-exclusivity.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/setup.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/strategies/helper-invocation.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-ethers => hardhat-ignition-ethers}/tsconfig.json (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/.eslintrc.cjs (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/.mocharc.json (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/.npmignore (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/.nycrc (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/CHANGELOG.md (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/README.md (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/examples/ComplexModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/index.html (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/package.json (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/public/.gitkeep (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/scripts/generate-example-deployment-json.js (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/assets/ExternalLinkIcon.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/assets/TooltipIcon.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/assets/purple-rocket.png (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/components/mermaid.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/components/socials/dc-logo.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/components/socials/gh-logo.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/components/socials/index.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/components/socials/tw-logo.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/main.css (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/main.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/components/deployment-flow.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/components/execution-batches.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/components/future-batch.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/components/future-header.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/components/summary.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/pages/visualization-overview/visualization-overview.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/queries/futures.ts (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/utils/argumentTypeToString.tsx (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/utils/to-escaped-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/utils/to-mermaid.ts (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/src/vite-env.d.ts (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/test/to-mermaid.ts (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/tsconfig.json (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/tsconfig.node.json (100%) rename packages/{hardhat-ignition-legacy/packages/ui => hardhat-ignition-ui}/vite.config.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.mocharc.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.npmignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.nycrc (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/.prettierignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/CHANGELOG.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/README.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/package.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/scripts/compile-test-fixture-project.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/src/ignition-module-results-to-viem-contracts.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/src/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/src/type-extensions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/src/viem-ignition-helper.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/default-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/create2/contracts/Baz.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/create2/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/create2/modules/BazModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/minimal/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/with-fake-helper/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/fixture-projects/with-fake-helper/index.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/ignition-helper-exclusivity.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/setup.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/strategies/helper-invocation.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/use-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/viem-instances/artifact-contract-at.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/viem-instances/artifact-deployment-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/viem-instances/named-contract-at.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/viem-instances/named-deployment-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/test/viem-results.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin-viem => hardhat-ignition-viem}/tsconfig.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.mocharc.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.npmignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.nycrc (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/.prettierignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/CHANGELOG.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/README.md (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/package.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/hardhat-artifact-resolver.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/helpers.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/modules.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/type-extensions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-batch-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-deploying-module-panel.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/calculate-starting-message.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/cwd-relative-path.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/helpers/was-anything-executed.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/pretty-event-handler.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/types.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/ui/verbose-event-handler.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/bigintReviver.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/getApiKeyAndUrls.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/load-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/open.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/read-deployment-parameters.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/resolve-deployment-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/shouldBeHardhatPluginError.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/utils/verifyEtherscanContract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/src/visualization/write-visualization.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/.eslintrc.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/config.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/default-sender.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/gas-estimation.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/multiple-batch-contract-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/error-on-pending-user-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/error-on-transaction-dropped.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/error-on-user-transaction-sent.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/rerun/rerun-after-kill.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/rerun/rerun-with-new-contract-deploy.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/reset.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/timeouts/deploy-run-times-out.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/deploy/writeLocalhost.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/.gitignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-bad-config/contracts/Foo.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-bad-config/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-exists-chain/contracts/Foo.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-exists-chain/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-not-exists-chain/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/contracts/Lock.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/ignition/modules/Lock.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/ignition/modules/parameters-too-large.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/lock/ignition/modules/parameters.json (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Bar.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/EventArgValue.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Factory.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Fails.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/FailureCalls.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Foo.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Greeter.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Ownable.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Owner.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/SendDataEmitter.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/StaticCallValue.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/Trace.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/TupleEmitter.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/TupleReturn.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/UsesContract.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/minimal/ignition/modules/OwnModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/reset-flag/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/reset-flag/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/reset-flag/journal.jsonl (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/user-modules/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/user-modules/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/user-modules/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/user-modules/ignition/.testignore (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/user-modules/ignition/modules/TestModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/verify-no-api-key/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-config/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-config/contracts/Trace.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-config/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-config/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-invalid-config/contracts/Contracts.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-invalid-config/contracts/Trace.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-invalid-config/hardhat.config.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ignition-helper-guard.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/calls.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/contracts.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/events.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/existing-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/fully-qualified-names.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/libraries.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/params.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/static-calls.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-api/use-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/module-parameters.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/plan/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/setup.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/strategies/create2.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/strategies/generic-strategy-constraints.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/strategies/only-built-in-strategies.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/clear-pending-transactions-from-memory-pool.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/createX-tx.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/externally-loaded-contract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/get-balance-for.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/mine-block.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/sleep.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/test-ignition-helper.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/type-helper.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/use-ignition-project.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/test-helpers/wait-for-pending-txs.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-batch-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-deploying-module-panel-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-deployment-complete-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-deployment-status-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-list-transactions-display.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/calculate-starting-message.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/helpers/test-format.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/ui/pretty-event-handler.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/utils/bigintReviver.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/utils/error-deployment-result-to-exception-message.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/utils/load-module.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/utils/resolve-deployment-id.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/verify/getApiKeyAndUrls.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/verify/index.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/test/verify/verifyEtherscanContract.ts (100%) rename packages/{hardhat-ignition-legacy/packages/hardhat-plugin => hardhat-ignition}/tsconfig.json (100%) diff --git a/packages/hardhat-ignition-legacy/packages/core/.eslintrc.js b/packages/hardhat-ignition-core/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.eslintrc.js rename to packages/hardhat-ignition-core/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/core/.gitignore b/packages/hardhat-ignition-core/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.gitignore rename to packages/hardhat-ignition-core/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/core/.mocharc.json b/packages/hardhat-ignition-core/.mocharc.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.mocharc.json rename to packages/hardhat-ignition-core/.mocharc.json diff --git a/packages/hardhat-ignition-legacy/packages/core/.npmignore b/packages/hardhat-ignition-core/.npmignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.npmignore rename to packages/hardhat-ignition-core/.npmignore diff --git a/packages/hardhat-ignition-legacy/packages/core/.nycrc b/packages/hardhat-ignition-core/.nycrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.nycrc rename to packages/hardhat-ignition-core/.nycrc diff --git a/packages/hardhat-ignition-legacy/packages/core/.prettierignore b/packages/hardhat-ignition-core/.prettierignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.prettierignore rename to packages/hardhat-ignition-core/.prettierignore diff --git a/packages/hardhat-ignition-legacy/packages/core/.prettierrc b/packages/hardhat-ignition-core/.prettierrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/.prettierrc rename to packages/hardhat-ignition-core/.prettierrc diff --git a/packages/hardhat-ignition-legacy/packages/core/CHANGELOG.md b/packages/hardhat-ignition-core/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/CHANGELOG.md rename to packages/hardhat-ignition-core/CHANGELOG.md diff --git a/packages/hardhat-ignition-legacy/packages/core/README.md b/packages/hardhat-ignition-core/README.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/README.md rename to packages/hardhat-ignition-core/README.md diff --git a/packages/hardhat-ignition-legacy/packages/core/api-extractor.json b/packages/hardhat-ignition-core/api-extractor.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/api-extractor.json rename to packages/hardhat-ignition-core/api-extractor.json diff --git a/packages/hardhat-ignition-legacy/packages/core/package.json b/packages/hardhat-ignition-core/package.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/package.json rename to packages/hardhat-ignition-core/package.json diff --git a/packages/hardhat-ignition-legacy/packages/core/src/batches.ts b/packages/hardhat-ignition-core/src/batches.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/batches.ts rename to packages/hardhat-ignition-core/src/batches.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/build-module.ts b/packages/hardhat-ignition-core/src/build-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/build-module.ts rename to packages/hardhat-ignition-core/src/build-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/deploy.ts b/packages/hardhat-ignition-core/src/deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/deploy.ts rename to packages/hardhat-ignition-core/src/deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/errors.ts b/packages/hardhat-ignition-core/src/errors.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/errors.ts rename to packages/hardhat-ignition-core/src/errors.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/ignition-module-serializer.ts b/packages/hardhat-ignition-core/src/ignition-module-serializer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/ignition-module-serializer.ts rename to packages/hardhat-ignition-core/src/ignition-module-serializer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/index.ts b/packages/hardhat-ignition-core/src/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/index.ts rename to packages/hardhat-ignition-core/src/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/batcher.ts b/packages/hardhat-ignition-core/src/internal/batcher.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/batcher.ts rename to packages/hardhat-ignition-core/src/internal/batcher.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/chain-config.ts b/packages/hardhat-ignition-core/src/internal/chain-config.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/chain-config.ts rename to packages/hardhat-ignition-core/src/internal/chain-config.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/defaultConfig.ts b/packages/hardhat-ignition-core/src/internal/defaultConfig.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/defaultConfig.ts rename to packages/hardhat-ignition-core/src/internal/defaultConfig.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/deployer.ts b/packages/hardhat-ignition-core/src/internal/deployer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/deployer.ts rename to packages/hardhat-ignition-core/src/internal/deployer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts b/packages/hardhat-ignition-core/src/internal/deployment-loader/ephemeral-deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/ephemeral-deployment-loader.ts rename to packages/hardhat-ignition-core/src/internal/deployment-loader/ephemeral-deployment-loader.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/file-deployment-loader.ts b/packages/hardhat-ignition-core/src/internal/deployment-loader/file-deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/file-deployment-loader.ts rename to packages/hardhat-ignition-core/src/internal/deployment-loader/file-deployment-loader.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/types.ts b/packages/hardhat-ignition-core/src/internal/deployment-loader/types.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/deployment-loader/types.ts rename to packages/hardhat-ignition-core/src/internal/deployment-loader/types.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/errors-list.ts b/packages/hardhat-ignition-core/src/internal/errors-list.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/errors-list.ts rename to packages/hardhat-ignition-core/src/internal/errors-list.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/abi.ts b/packages/hardhat-ignition-core/src/internal/execution/abi.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/abi.ts rename to packages/hardhat-ignition-core/src/internal/execution/abi.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/deployment-state-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/deployment-state-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/deployment-state-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/deployment-state-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-engine.ts b/packages/hardhat-ignition-core/src/internal/execution/execution-engine.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-engine.ts rename to packages/hardhat-ignition-core/src/internal/execution/execution-engine.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-strategy-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/execution-strategy-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/execution-strategy-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/execution-strategy-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/future-processor.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/future-processor.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/future-processor.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/future-processor.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/monitor-onchain-interaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/query-static-call.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/query-static-call.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/query-static-call.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/run-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/run-strategy.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/run-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/send-transaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/handlers/send-transaction.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/handlers/send-transaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/decode-simulation-result.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/future-resolvers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/future-resolvers.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/future-resolvers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/messages-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/messages-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/messages-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/next-action-for-execution-state.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/replay-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/replay-strategy.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/replay-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts b/packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts rename to packages/hardhat-ignition-core/src/internal/execution/future-processor/helpers/save-artifacts-for-future.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/jsonrpc-client.ts b/packages/hardhat-ignition-core/src/internal/execution/jsonrpc-client.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/jsonrpc-client.ts rename to packages/hardhat-ignition-core/src/internal/execution/jsonrpc-client.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/libraries.ts b/packages/hardhat-ignition-core/src/internal/execution/libraries.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/libraries.ts rename to packages/hardhat-ignition-core/src/internal/execution/libraries.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts b/packages/hardhat-ignition-core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts rename to packages/hardhat-ignition-core/src/internal/execution/nonce-management/get-max-nonce-used-by-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition-core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition-core/src/internal/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts b/packages/hardhat-ignition-core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts rename to packages/hardhat-ignition-core/src/internal/execution/nonce-management/json-rpc-nonce-manager.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/deployment-state-reducer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/deployment-state-reducer.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/deployment-state-reducer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/execution-state-reducer.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/execution-state-reducer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/execution-state-reducer.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/execution-state-reducer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/complete-execution-state.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/complete-execution-state.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/complete-execution-state.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/deployment-state-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/initializers.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/initializers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/initializers.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/initializers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/reducers/helpers/network-interaction-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/strategy/createx-artifact.ts b/packages/hardhat-ignition-core/src/internal/execution/strategy/createx-artifact.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/strategy/createx-artifact.ts rename to packages/hardhat-ignition-core/src/internal/execution/strategy/createx-artifact.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/transaction-tracking-timer.ts b/packages/hardhat-ignition-core/src/internal/execution/transaction-tracking-timer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/transaction-tracking-timer.ts rename to packages/hardhat-ignition-core/src/internal/execution/transaction-tracking-timer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/type-helpers.ts b/packages/hardhat-ignition-core/src/internal/execution/type-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/type-helpers.ts rename to packages/hardhat-ignition-core/src/internal/execution/type-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/deployment-state.ts b/packages/hardhat-ignition-core/src/internal/execution/types/deployment-state.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/deployment-state.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/deployment-state.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/evm-execution.ts b/packages/hardhat-ignition-core/src/internal/execution/types/evm-execution.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/evm-execution.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/evm-execution.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-result.ts b/packages/hardhat-ignition-core/src/internal/execution/types/execution-result.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-result.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/execution-result.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-state.ts b/packages/hardhat-ignition-core/src/internal/execution/types/execution-state.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-state.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/execution-state.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-strategy.ts b/packages/hardhat-ignition-core/src/internal/execution/types/execution-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/execution-strategy.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/execution-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/jsonrpc.ts b/packages/hardhat-ignition-core/src/internal/execution/types/jsonrpc.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/jsonrpc.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/jsonrpc.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/messages.ts b/packages/hardhat-ignition-core/src/internal/execution/types/messages.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/messages.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/messages.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/network-interaction.ts b/packages/hardhat-ignition-core/src/internal/execution/types/network-interaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/types/network-interaction.ts rename to packages/hardhat-ignition-core/src/internal/execution/types/network-interaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/address.ts b/packages/hardhat-ignition-core/src/internal/execution/utils/address.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/address.ts rename to packages/hardhat-ignition-core/src/internal/execution/utils/address.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition-core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition-core/src/internal/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/get-default-sender.ts b/packages/hardhat-ignition-core/src/internal/execution/utils/get-default-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/execution/utils/get-default-sender.ts rename to packages/hardhat-ignition-core/src/internal/execution/utils/get-default-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/formatters.ts b/packages/hardhat-ignition-core/src/internal/formatters.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/formatters.ts rename to packages/hardhat-ignition-core/src/internal/formatters.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/file-journal.ts b/packages/hardhat-ignition-core/src/internal/journal/file-journal.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/file-journal.ts rename to packages/hardhat-ignition-core/src/internal/journal/file-journal.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/memory-journal.ts b/packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/memory-journal.ts rename to packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/types/index.ts b/packages/hardhat-ignition-core/src/internal/journal/types/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/types/index.ts rename to packages/hardhat-ignition-core/src/internal/journal/types/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/deserialize-replacer.ts b/packages/hardhat-ignition-core/src/internal/journal/utils/deserialize-replacer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/deserialize-replacer.ts rename to packages/hardhat-ignition-core/src/internal/journal/utils/deserialize-replacer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/emitExecutionEvent.ts b/packages/hardhat-ignition-core/src/internal/journal/utils/emitExecutionEvent.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/emitExecutionEvent.ts rename to packages/hardhat-ignition-core/src/internal/journal/utils/emitExecutionEvent.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts b/packages/hardhat-ignition-core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts rename to packages/hardhat-ignition-core/src/internal/journal/utils/failedEvmExecutionResultToErrorDescription.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/log.ts b/packages/hardhat-ignition-core/src/internal/journal/utils/log.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/log.ts rename to packages/hardhat-ignition-core/src/internal/journal/utils/log.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/serialize-replacer.ts b/packages/hardhat-ignition-core/src/internal/journal/utils/serialize-replacer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/journal/utils/serialize-replacer.ts rename to packages/hardhat-ignition-core/src/internal/journal/utils/serialize-replacer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/module-builder.ts b/packages/hardhat-ignition-core/src/internal/module-builder.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/module-builder.ts rename to packages/hardhat-ignition-core/src/internal/module-builder.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/module.ts b/packages/hardhat-ignition-core/src/internal/module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/module.ts rename to packages/hardhat-ignition-core/src/internal/module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/futures/reconcileSendData.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/compare.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/compare.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/compare.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/compare.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-address.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-address.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-address.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-arguments.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-arguments.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-arguments.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-artifacts.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-artifacts.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-artifacts.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-contract-name.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract-name.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-contract-name.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-contract.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-data.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-data.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-data.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-from.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-from.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-from.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-function-name.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-function-name.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-function-name.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-libraries.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-libraries.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-libraries.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-strategy.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-value.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/helpers/reconcile-value.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/helpers/reconcile-value.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-current-and-previous-type-match.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-dependency-rules.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-dependency-rules.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-dependency-rules.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/reconcile-future-specific-reconciliations.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconciler.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/reconciler.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/reconciler.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/reconciler.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/types.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/types.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/types.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/types.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/utils.ts b/packages/hardhat-ignition-core/src/internal/reconciliation/utils.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/reconciliation/utils.ts rename to packages/hardhat-ignition-core/src/internal/reconciliation/utils.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/topological-order.ts b/packages/hardhat-ignition-core/src/internal/topological-order.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/topological-order.ts rename to packages/hardhat-ignition-core/src/internal/topological-order.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils.ts b/packages/hardhat-ignition-core/src/internal/utils.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils.ts rename to packages/hardhat-ignition-core/src/internal/utils.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list-converter.ts b/packages/hardhat-ignition-core/src/internal/utils/adjacency-list-converter.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list-converter.ts rename to packages/hardhat-ignition-core/src/internal/utils/adjacency-list-converter.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list.ts b/packages/hardhat-ignition-core/src/internal/utils/adjacency-list.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/adjacency-list.ts rename to packages/hardhat-ignition-core/src/internal/utils/adjacency-list.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/assertions.ts b/packages/hardhat-ignition-core/src/internal/utils/assertions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/assertions.ts rename to packages/hardhat-ignition-core/src/internal/utils/assertions.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/check-automined-network.ts b/packages/hardhat-ignition-core/src/internal/utils/check-automined-network.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/check-automined-network.ts rename to packages/hardhat-ignition-core/src/internal/utils/check-automined-network.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/future-id-builders.ts b/packages/hardhat-ignition-core/src/internal/utils/future-id-builders.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/future-id-builders.ts rename to packages/hardhat-ignition-core/src/internal/utils/future-id-builders.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/get-futures-from-module.ts b/packages/hardhat-ignition-core/src/internal/utils/get-futures-from-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/get-futures-from-module.ts rename to packages/hardhat-ignition-core/src/internal/utils/get-futures-from-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/identifier-validators.ts b/packages/hardhat-ignition-core/src/internal/utils/identifier-validators.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/identifier-validators.ts rename to packages/hardhat-ignition-core/src/internal/utils/identifier-validators.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/replace-within-arg.ts b/packages/hardhat-ignition-core/src/internal/utils/replace-within-arg.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/replace-within-arg.ts rename to packages/hardhat-ignition-core/src/internal/utils/replace-within-arg.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/utils/resolve-module-parameter.ts b/packages/hardhat-ignition-core/src/internal/utils/resolve-module-parameter.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/utils/resolve-module-parameter.ts rename to packages/hardhat-ignition-core/src/internal/utils/resolve-module-parameter.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractAt.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactContractDeployment.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractAt.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractAt.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractCall.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractCall.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedContractDeployment.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedLibraryDeployment.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateNamedStaticCall.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateNamedStaticCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateReadEventArgument.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateReadEventArgument.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateReadEventArgument.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateSendData.ts b/packages/hardhat-ignition-core/src/internal/validation/futures/validateSendData.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/futures/validateSendData.ts rename to packages/hardhat-ignition-core/src/internal/validation/futures/validateSendData.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/utils.ts b/packages/hardhat-ignition-core/src/internal/validation/utils.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/utils.ts rename to packages/hardhat-ignition-core/src/internal/validation/utils.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/validation/validate.ts b/packages/hardhat-ignition-core/src/internal/validation/validate.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/validation/validate.ts rename to packages/hardhat-ignition-core/src/internal/validation/validate.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts b/packages/hardhat-ignition-core/src/internal/views/execution-state/find-onchain-interaction-by.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-onchain-interaction-by.ts rename to packages/hardhat-ignition-core/src/internal/views/execution-state/find-onchain-interaction-by.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-static-call-by.ts b/packages/hardhat-ignition-core/src/internal/views/execution-state/find-static-call-by.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-static-call-by.ts rename to packages/hardhat-ignition-core/src/internal/views/execution-state/find-static-call-by.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-transaction-by.ts b/packages/hardhat-ignition-core/src/internal/views/execution-state/find-transaction-by.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/find-transaction-by.ts rename to packages/hardhat-ignition-core/src/internal/views/execution-state/find-transaction-by.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts b/packages/hardhat-ignition-core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts rename to packages/hardhat-ignition-core/src/internal/views/execution-state/get-pending-nonce-and-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts b/packages/hardhat-ignition-core/src/internal/views/execution-state/get-pending-onchain-interaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/execution-state/get-pending-onchain-interaction.ts rename to packages/hardhat-ignition-core/src/internal/views/execution-state/get-pending-onchain-interaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts b/packages/hardhat-ignition-core/src/internal/views/find-address-for-contract-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-address-for-contract-future-by-id.ts rename to packages/hardhat-ignition-core/src/internal/views/find-address-for-contract-future-by-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts b/packages/hardhat-ignition-core/src/internal/views/find-confirmed-transaction-by-future-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-confirmed-transaction-by-future-id.ts rename to packages/hardhat-ignition-core/src/internal/views/find-confirmed-transaction-by-future-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-deployed-contracts.ts b/packages/hardhat-ignition-core/src/internal/views/find-deployed-contracts.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-deployed-contracts.ts rename to packages/hardhat-ignition-core/src/internal/views/find-deployed-contracts.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-state-by-id.ts b/packages/hardhat-ignition-core/src/internal/views/find-execution-state-by-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-state-by-id.ts rename to packages/hardhat-ignition-core/src/internal/views/find-execution-state-by-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-states-by-type.ts b/packages/hardhat-ignition-core/src/internal/views/find-execution-states-by-type.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-execution-states-by-type.ts rename to packages/hardhat-ignition-core/src/internal/views/find-execution-states-by-type.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition-core/src/internal/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition-core/src/internal/views/find-result-for-future-by-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-status.ts b/packages/hardhat-ignition-core/src/internal/views/find-status.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/find-status.ts rename to packages/hardhat-ignition-core/src/internal/views/find-status.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/has-execution-succeeded.ts b/packages/hardhat-ignition-core/src/internal/views/has-execution-succeeded.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/has-execution-succeeded.ts rename to packages/hardhat-ignition-core/src/internal/views/has-execution-succeeded.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-batch-finished.ts b/packages/hardhat-ignition-core/src/internal/views/is-batch-finished.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-batch-finished.ts rename to packages/hardhat-ignition-core/src/internal/views/is-batch-finished.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-execution-state-complete.ts b/packages/hardhat-ignition-core/src/internal/views/is-execution-state-complete.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/views/is-execution-state-complete.ts rename to packages/hardhat-ignition-core/src/internal/views/is-execution-state-complete.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/internal/wiper.ts b/packages/hardhat-ignition-core/src/internal/wiper.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/internal/wiper.ts rename to packages/hardhat-ignition-core/src/internal/wiper.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/list-deployments.ts b/packages/hardhat-ignition-core/src/list-deployments.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/list-deployments.ts rename to packages/hardhat-ignition-core/src/list-deployments.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/list-transactions.ts b/packages/hardhat-ignition-core/src/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/list-transactions.ts rename to packages/hardhat-ignition-core/src/list-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/status.ts b/packages/hardhat-ignition-core/src/status.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/status.ts rename to packages/hardhat-ignition-core/src/status.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/strategies/basic-strategy.ts b/packages/hardhat-ignition-core/src/strategies/basic-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/strategies/basic-strategy.ts rename to packages/hardhat-ignition-core/src/strategies/basic-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/strategies/create2-strategy.ts b/packages/hardhat-ignition-core/src/strategies/create2-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/strategies/create2-strategy.ts rename to packages/hardhat-ignition-core/src/strategies/create2-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/strategies/resolve-strategy.ts b/packages/hardhat-ignition-core/src/strategies/resolve-strategy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/strategies/resolve-strategy.ts rename to packages/hardhat-ignition-core/src/strategies/resolve-strategy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/type-guards.ts b/packages/hardhat-ignition-core/src/type-guards.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/type-guards.ts rename to packages/hardhat-ignition-core/src/type-guards.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/artifact.ts b/packages/hardhat-ignition-core/src/types/artifact.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/artifact.ts rename to packages/hardhat-ignition-core/src/types/artifact.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/deploy.ts b/packages/hardhat-ignition-core/src/types/deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/deploy.ts rename to packages/hardhat-ignition-core/src/types/deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/errors.ts b/packages/hardhat-ignition-core/src/types/errors.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/errors.ts rename to packages/hardhat-ignition-core/src/types/errors.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/execution-events.ts b/packages/hardhat-ignition-core/src/types/execution-events.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/execution-events.ts rename to packages/hardhat-ignition-core/src/types/execution-events.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/list-transactions.ts b/packages/hardhat-ignition-core/src/types/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/list-transactions.ts rename to packages/hardhat-ignition-core/src/types/list-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/module-builder.ts b/packages/hardhat-ignition-core/src/types/module-builder.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/module-builder.ts rename to packages/hardhat-ignition-core/src/types/module-builder.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/module.ts b/packages/hardhat-ignition-core/src/types/module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/module.ts rename to packages/hardhat-ignition-core/src/types/module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/provider.ts b/packages/hardhat-ignition-core/src/types/provider.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/provider.ts rename to packages/hardhat-ignition-core/src/types/provider.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/serialization.ts b/packages/hardhat-ignition-core/src/types/serialization.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/serialization.ts rename to packages/hardhat-ignition-core/src/types/serialization.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/status.ts b/packages/hardhat-ignition-core/src/types/status.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/status.ts rename to packages/hardhat-ignition-core/src/types/status.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/types/verify.ts b/packages/hardhat-ignition-core/src/types/verify.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/types/verify.ts rename to packages/hardhat-ignition-core/src/types/verify.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/ui-helpers.ts b/packages/hardhat-ignition-core/src/ui-helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/ui-helpers.ts rename to packages/hardhat-ignition-core/src/ui-helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/verify.ts b/packages/hardhat-ignition-core/src/verify.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/verify.ts rename to packages/hardhat-ignition-core/src/verify.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/src/wipe.ts b/packages/hardhat-ignition-core/src/wipe.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/src/wipe.ts rename to packages/hardhat-ignition-core/src/wipe.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/.eslintrc.js b/packages/hardhat-ignition-core/test-integrations/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/.eslintrc.js rename to packages/hardhat-ignition-core/test-integrations/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/.gitignore b/packages/hardhat-ignition-core/test-integrations/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/.gitignore rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol b/packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/contracts/Lock.sol diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/hardhat.config.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/ci-success/ignition/modules/LockModule.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/contracts/Lock.sol diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/deployments/chain-1337/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default-with-new-chain-id/ignition/modules/LockModule.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/C.sol b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default/contracts/C.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/C.sol rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default/contracts/C.sol diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default/contracts/Libs.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/contracts/Libs.sol rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default/contracts/Libs.sol diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/hardhat.config.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/default/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/default/hardhat.config.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/default/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js b/packages/hardhat-ignition-core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js rename to packages/hardhat-ignition-core/test-integrations/fixture-projects/dont-throw-on-reverts/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/helpers/hardhat-projects.ts b/packages/hardhat-ignition-core/test-integrations/helpers/hardhat-projects.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/helpers/hardhat-projects.ts rename to packages/hardhat-ignition-core/test-integrations/helpers/hardhat-projects.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/ci/basic-success.ts b/packages/hardhat-ignition-core/test-integrations/new-api/ci/basic-success.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/ci/basic-success.ts rename to packages/hardhat-ignition-core/test-integrations/new-api/ci/basic-success.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts rename to packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts b/packages/hardhat-ignition-core/test-integrations/new-api/internal/reconciliation/chainId.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/new-api/internal/reconciliation/chainId.ts rename to packages/hardhat-ignition-core/test-integrations/new-api/internal/reconciliation/chainId.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test-integrations/test-execution-result-fixtures.ts b/packages/hardhat-ignition-core/test-integrations/test-execution-result-fixtures.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test-integrations/test-execution-result-fixtures.ts rename to packages/hardhat-ignition-core/test-integrations/test-execution-result-fixtures.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/.eslintrc.js b/packages/hardhat-ignition-core/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/.eslintrc.js rename to packages/hardhat-ignition-core/test/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/core/test/batcher.ts b/packages/hardhat-ignition-core/test/batcher.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/batcher.ts rename to packages/hardhat-ignition-core/test/batcher.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/build-module.ts b/packages/hardhat-ignition-core/test/build-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/build-module.ts rename to packages/hardhat-ignition-core/test/build-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/call.ts b/packages/hardhat-ignition-core/test/call.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/call.ts rename to packages/hardhat-ignition-core/test/call.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/contract.ts b/packages/hardhat-ignition-core/test/contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/contract.ts rename to packages/hardhat-ignition-core/test/contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/contractAt.ts b/packages/hardhat-ignition-core/test/contractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/contractAt.ts rename to packages/hardhat-ignition-core/test/contractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/contractAtFromArtifact.ts b/packages/hardhat-ignition-core/test/contractAtFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/contractAtFromArtifact.ts rename to packages/hardhat-ignition-core/test/contractAtFromArtifact.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/contractFromArtifact.ts b/packages/hardhat-ignition-core/test/contractFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/contractFromArtifact.ts rename to packages/hardhat-ignition-core/test/contractFromArtifact.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/encodeFunctionCall.ts b/packages/hardhat-ignition-core/test/encodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/encodeFunctionCall.ts rename to packages/hardhat-ignition-core/test/encodeFunctionCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/abi.ts b/packages/hardhat-ignition-core/test/execution/abi.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/abi.ts rename to packages/hardhat-ignition-core/test/execution/abi.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts b/packages/hardhat-ignition-core/test/execution/future-processor/helpers/build-initialize-message-for.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/build-initialize-message-for.ts rename to packages/hardhat-ignition-core/test/execution/future-processor/helpers/build-initialize-message-for.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts b/packages/hardhat-ignition-core/test/execution/future-processor/helpers/network-interaction-execution.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/helpers/network-interaction-execution.ts rename to packages/hardhat-ignition-core/test/execution/future-processor/helpers/network-interaction-execution.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-at-deploy.ts b/packages/hardhat-ignition-core/test/execution/future-processor/named-contract-at-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-at-deploy.ts rename to packages/hardhat-ignition-core/test/execution/future-processor/named-contract-at-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-deploy.ts b/packages/hardhat-ignition-core/test/execution/future-processor/named-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/named-contract-deploy.ts rename to packages/hardhat-ignition-core/test/execution/future-processor/named-contract-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/utils.ts b/packages/hardhat-ignition-core/test/execution/future-processor/utils.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/future-processor/utils.ts rename to packages/hardhat-ignition-core/test/execution/future-processor/utils.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/libraries.ts b/packages/hardhat-ignition-core/test/execution/libraries.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/libraries.ts rename to packages/hardhat-ignition-core/test/execution/libraries.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts b/packages/hardhat-ignition-core/test/execution/nonce-management/get-nonce-sync-messages.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/nonce-management/get-nonce-sync-messages.ts rename to packages/hardhat-ignition-core/test/execution/nonce-management/get-nonce-sync-messages.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-call.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-a-call.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-call.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-a-call.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-a-named-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-contract-deploy.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-a-named-contract-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-library-deploy.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-a-named-library-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-named-library-deploy.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-a-named-library-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-read-event-arg.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-a-read-event-arg.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-read-event-arg.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-a-read-event-arg.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-static-call.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-a-static-call.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-a-static-call.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-a-static-call.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-contract-at.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-contract-at.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-contract-at.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-contract-at.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-send-data.ts b/packages/hardhat-ignition-core/test/execution/reducers/running-send-data.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/running-send-data.ts rename to packages/hardhat-ignition-core/test/execution/reducers/running-send-data.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/start-a-new-run.ts b/packages/hardhat-ignition-core/test/execution/reducers/start-a-new-run.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/start-a-new-run.ts rename to packages/hardhat-ignition-core/test/execution/reducers/start-a-new-run.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/utils.ts b/packages/hardhat-ignition-core/test/execution/reducers/utils.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/reducers/utils.ts rename to packages/hardhat-ignition-core/test/execution/reducers/utils.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts b/packages/hardhat-ignition-core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts rename to packages/hardhat-ignition-core/test/execution/utils/convert-evm-tuple-to-solidity-param.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/execution/views/find-result-for-future-by-id.ts b/packages/hardhat-ignition-core/test/execution/views/find-result-for-future-by-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/execution/views/find-result-for-future-by-id.ts rename to packages/hardhat-ignition-core/test/execution/views/find-result-for-future-by-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/getAccount.ts b/packages/hardhat-ignition-core/test/getAccount.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/getAccount.ts rename to packages/hardhat-ignition-core/test/getAccount.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/getParameter.ts b/packages/hardhat-ignition-core/test/getParameter.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/getParameter.ts rename to packages/hardhat-ignition-core/test/getParameter.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/helpers.ts b/packages/hardhat-ignition-core/test/helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/helpers.ts rename to packages/hardhat-ignition-core/test/helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/helpers/exact-interface.ts b/packages/hardhat-ignition-core/test/helpers/exact-interface.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/helpers/exact-interface.ts rename to packages/hardhat-ignition-core/test/helpers/exact-interface.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/helpers/execution-result-fixtures.ts b/packages/hardhat-ignition-core/test/helpers/execution-result-fixtures.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/helpers/execution-result-fixtures.ts rename to packages/hardhat-ignition-core/test/helpers/execution-result-fixtures.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/ignition-module-serializer.ts b/packages/hardhat-ignition-core/test/ignition-module-serializer.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/ignition-module-serializer.ts rename to packages/hardhat-ignition-core/test/ignition-module-serializer.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/library.ts b/packages/hardhat-ignition-core/test/library.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/library.ts rename to packages/hardhat-ignition-core/test/library.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/libraryFromArtifact.ts b/packages/hardhat-ignition-core/test/libraryFromArtifact.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/libraryFromArtifact.ts rename to packages/hardhat-ignition-core/test/libraryFromArtifact.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/list-transactions.ts b/packages/hardhat-ignition-core/test/list-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/list-transactions.ts rename to packages/hardhat-ignition-core/test/list-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/listDeployments.ts b/packages/hardhat-ignition-core/test/listDeployments.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/listDeployments.ts rename to packages/hardhat-ignition-core/test/listDeployments.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank b/packages/hardhat-ignition-core/test/mocks/listDeployments/has-deployments/chain-1/blank similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-1/blank rename to packages/hardhat-ignition-core/test/mocks/listDeployments/has-deployments/chain-1/blank diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank b/packages/hardhat-ignition-core/test/mocks/listDeployments/has-deployments/chain-2/blank similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listDeployments/has-deployments/chain-2/blank rename to packages/hardhat-ignition-core/test/mocks/listDeployments/has-deployments/chain-2/blank diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicContract2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#BasicLibrary2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/artifacts/CompleteModule#ContractWithLibrary2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/build-info/0957b2d8bc1fe22551b79ef37cafc10a.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/build-info/0fce7e4e9544f4b99b971b3b98da92d2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/listTransactions/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/listTransactions/success/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/listTransactions/success/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Basic.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Basic2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/status/external-artifact/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/external-artifact/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/status/external-artifact/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-core/test/mocks/status/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-core/test/mocks/status/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-core/test/mocks/status/success/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition-core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition-core/test/mocks/status/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/status/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/status/success/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/status/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/status/success/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/status/success/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Basic2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/build-info/647c95b5130e7afe0806dc404d889d09.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/external-artifacts/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/external-artifacts/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#UUUUU.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/artifacts/LockModule#WAAIT.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/build-info/254cc89254e61cb6a9bf2c74f13055f1.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/verify/libraries/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/libraries/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/libraries/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/libraries/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestA.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestA.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestB.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestB.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestC.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestC.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestD.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/artifacts/LockModule#TestD.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/build-info/5a5467b3a2cddf6ce0f79584095e02d2.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/verify/min-input/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/min-input/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/min-input/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/min-input/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/no-contracts/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/no-contracts/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/no-contracts/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/no-contracts/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json b/packages/hardhat-ignition-core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json rename to packages/hardhat-ignition-core/test/mocks/verify/success/artifacts/LockModule#Lock.dbg.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json b/packages/hardhat-ignition-core/test/mocks/verify/success/artifacts/LockModule#Lock.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/artifacts/LockModule#Lock.json rename to packages/hardhat-ignition-core/test/mocks/verify/success/artifacts/LockModule#Lock.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json b/packages/hardhat-ignition-core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json rename to packages/hardhat-ignition-core/test/mocks/verify/success/build-info/a119b7bb4b3dd21e4ae94d5054092087.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/verify/success/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/verify/success/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/success/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/success/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/success/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json b/packages/hardhat-ignition-core/test/mocks/verify/unsupported-chain/deployed_addresses.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/deployed_addresses.json rename to packages/hardhat-ignition-core/test/mocks/verify/unsupported-chain/deployed_addresses.json diff --git a/packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl b/packages/hardhat-ignition-core/test/mocks/verify/unsupported-chain/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/mocks/verify/unsupported-chain/journal.jsonl rename to packages/hardhat-ignition-core/test/mocks/verify/unsupported-chain/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/core/test/readEventArgument.ts b/packages/hardhat-ignition-core/test/readEventArgument.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/readEventArgument.ts rename to packages/hardhat-ignition-core/test/readEventArgument.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractAt.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileArtifactLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractAt.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractAt.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractAt.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractCall.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedContractDeployment.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedContractDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedEncodeFunctionCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedLibraryDeployment.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedStaticCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileNamedStaticCall.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileNamedStaticCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileReadEventArgument.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileReadEventArgument.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileReadEventArgument.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileSendData.ts b/packages/hardhat-ignition-core/test/reconciliation/futures/reconcileSendData.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/futures/reconcileSendData.ts rename to packages/hardhat-ignition-core/test/reconciliation/futures/reconcileSendData.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/helpers.ts b/packages/hardhat-ignition-core/test/reconciliation/helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/helpers.ts rename to packages/hardhat-ignition-core/test/reconciliation/helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/reconciliation/reconciler.ts b/packages/hardhat-ignition-core/test/reconciliation/reconciler.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/reconciliation/reconciler.ts rename to packages/hardhat-ignition-core/test/reconciliation/reconciler.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/send.ts b/packages/hardhat-ignition-core/test/send.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/send.ts rename to packages/hardhat-ignition-core/test/send.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/setup.ts b/packages/hardhat-ignition-core/test/setup.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/setup.ts rename to packages/hardhat-ignition-core/test/setup.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/staticCall.ts b/packages/hardhat-ignition-core/test/staticCall.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/staticCall.ts rename to packages/hardhat-ignition-core/test/staticCall.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/status.ts b/packages/hardhat-ignition-core/test/status.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/status.ts rename to packages/hardhat-ignition-core/test/status.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/types/deployment-loader.ts b/packages/hardhat-ignition-core/test/types/deployment-loader.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/types/deployment-loader.ts rename to packages/hardhat-ignition-core/test/types/deployment-loader.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/types/module.ts b/packages/hardhat-ignition-core/test/types/module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/types/module.ts rename to packages/hardhat-ignition-core/test/types/module.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/useModule.ts b/packages/hardhat-ignition-core/test/useModule.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/useModule.ts rename to packages/hardhat-ignition-core/test/useModule.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/utils/adjacency-list.ts b/packages/hardhat-ignition-core/test/utils/adjacency-list.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/utils/adjacency-list.ts rename to packages/hardhat-ignition-core/test/utils/adjacency-list.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/utils/check-automined-network.ts b/packages/hardhat-ignition-core/test/utils/check-automined-network.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/utils/check-automined-network.ts rename to packages/hardhat-ignition-core/test/utils/check-automined-network.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/utils/future-id-builders.ts b/packages/hardhat-ignition-core/test/utils/future-id-builders.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/utils/future-id-builders.ts rename to packages/hardhat-ignition-core/test/utils/future-id-builders.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/utils/replace-within-arg.ts b/packages/hardhat-ignition-core/test/utils/replace-within-arg.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/utils/replace-within-arg.ts rename to packages/hardhat-ignition-core/test/utils/replace-within-arg.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/validations/id-rules.ts b/packages/hardhat-ignition-core/test/validations/id-rules.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/validations/id-rules.ts rename to packages/hardhat-ignition-core/test/validations/id-rules.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/validations/identifier-validators.ts b/packages/hardhat-ignition-core/test/validations/identifier-validators.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/validations/identifier-validators.ts rename to packages/hardhat-ignition-core/test/validations/identifier-validators.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/verify.ts b/packages/hardhat-ignition-core/test/verify.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/verify.ts rename to packages/hardhat-ignition-core/test/verify.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/test/wipe.ts b/packages/hardhat-ignition-core/test/wipe.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/test/wipe.ts rename to packages/hardhat-ignition-core/test/wipe.ts diff --git a/packages/hardhat-ignition-legacy/packages/core/tsconfig.json b/packages/hardhat-ignition-core/tsconfig.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/core/tsconfig.json rename to packages/hardhat-ignition-core/tsconfig.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.eslintrc.js b/packages/hardhat-ignition-ethers/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.eslintrc.js rename to packages/hardhat-ignition-ethers/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.gitignore b/packages/hardhat-ignition-ethers/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.gitignore rename to packages/hardhat-ignition-ethers/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.mocharc.json b/packages/hardhat-ignition-ethers/.mocharc.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.mocharc.json rename to packages/hardhat-ignition-ethers/.mocharc.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.npmignore b/packages/hardhat-ignition-ethers/.npmignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.npmignore rename to packages/hardhat-ignition-ethers/.npmignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.nycrc b/packages/hardhat-ignition-ethers/.nycrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.nycrc rename to packages/hardhat-ignition-ethers/.nycrc diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.prettierignore b/packages/hardhat-ignition-ethers/.prettierignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/.prettierignore rename to packages/hardhat-ignition-ethers/.prettierignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/CHANGELOG.md b/packages/hardhat-ignition-ethers/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/CHANGELOG.md rename to packages/hardhat-ignition-ethers/CHANGELOG.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/README.md b/packages/hardhat-ignition-ethers/README.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/README.md rename to packages/hardhat-ignition-ethers/README.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/package.json b/packages/hardhat-ignition-ethers/package.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/package.json rename to packages/hardhat-ignition-ethers/package.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts b/packages/hardhat-ignition-ethers/src/ethers-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/ethers-ignition-helper.ts rename to packages/hardhat-ignition-ethers/src/ethers-ignition-helper.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/index.ts b/packages/hardhat-ignition-ethers/src/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/index.ts rename to packages/hardhat-ignition-ethers/src/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/type-extensions.ts b/packages/hardhat-ignition-ethers/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/src/type-extensions.ts rename to packages/hardhat-ignition-ethers/src/type-extensions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/.eslintrc.js b/packages/hardhat-ignition-ethers/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/.eslintrc.js rename to packages/hardhat-ignition-ethers/test/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/default-sender.ts b/packages/hardhat-ignition-ethers/test/default-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/default-sender.ts rename to packages/hardhat-ignition-ethers/test/default-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts b/packages/hardhat-ignition-ethers/test/deploy-with-ethers-result.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/deploy-with-ethers-result.ts rename to packages/hardhat-ignition-ethers/test/deploy-with-ethers-result.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore b/packages/hardhat-ignition-ethers/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/.gitignore rename to packages/hardhat-ignition-ethers/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol b/packages/hardhat-ignition-ethers/test/fixture-projects/create2/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/contracts/Foo.sol rename to packages/hardhat-ignition-ethers/test/fixture-projects/create2/contracts/Foo.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition-ethers/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js b/packages/hardhat-ignition-ethers/test/fixture-projects/create2/modules/FooModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/create2/modules/FooModule.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/create2/modules/FooModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition-ethers/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition-ethers/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-ethers/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition-ethers/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition-ethers/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition-ethers/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition-ethers/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/setup.ts b/packages/hardhat-ignition-ethers/test/setup.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/setup.ts rename to packages/hardhat-ignition-ethers/test/setup.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts b/packages/hardhat-ignition-ethers/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition-ethers/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-ethers/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition-ethers/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-ethers/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition-ethers/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/tsconfig.json b/packages/hardhat-ignition-ethers/tsconfig.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-ethers/tsconfig.json rename to packages/hardhat-ignition-ethers/tsconfig.json diff --git a/packages/hardhat-ignition-legacy/packages/ui/.eslintrc.cjs b/packages/hardhat-ignition-ui/.eslintrc.cjs similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/.eslintrc.cjs rename to packages/hardhat-ignition-ui/.eslintrc.cjs diff --git a/packages/hardhat-ignition-legacy/packages/ui/.gitignore b/packages/hardhat-ignition-ui/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/.gitignore rename to packages/hardhat-ignition-ui/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/ui/.mocharc.json b/packages/hardhat-ignition-ui/.mocharc.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/.mocharc.json rename to packages/hardhat-ignition-ui/.mocharc.json diff --git a/packages/hardhat-ignition-legacy/packages/ui/.npmignore b/packages/hardhat-ignition-ui/.npmignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/.npmignore rename to packages/hardhat-ignition-ui/.npmignore diff --git a/packages/hardhat-ignition-legacy/packages/ui/.nycrc b/packages/hardhat-ignition-ui/.nycrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/.nycrc rename to packages/hardhat-ignition-ui/.nycrc diff --git a/packages/hardhat-ignition-legacy/packages/ui/CHANGELOG.md b/packages/hardhat-ignition-ui/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/CHANGELOG.md rename to packages/hardhat-ignition-ui/CHANGELOG.md diff --git a/packages/hardhat-ignition-legacy/packages/ui/README.md b/packages/hardhat-ignition-ui/README.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/README.md rename to packages/hardhat-ignition-ui/README.md diff --git a/packages/hardhat-ignition-legacy/packages/ui/examples/ComplexModule.js b/packages/hardhat-ignition-ui/examples/ComplexModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/examples/ComplexModule.js rename to packages/hardhat-ignition-ui/examples/ComplexModule.js diff --git a/packages/hardhat-ignition-legacy/packages/ui/index.html b/packages/hardhat-ignition-ui/index.html similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/index.html rename to packages/hardhat-ignition-ui/index.html diff --git a/packages/hardhat-ignition-legacy/packages/ui/package.json b/packages/hardhat-ignition-ui/package.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/package.json rename to packages/hardhat-ignition-ui/package.json diff --git a/packages/hardhat-ignition-legacy/packages/ui/public/.gitkeep b/packages/hardhat-ignition-ui/public/.gitkeep similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/public/.gitkeep rename to packages/hardhat-ignition-ui/public/.gitkeep diff --git a/packages/hardhat-ignition-legacy/packages/ui/scripts/generate-example-deployment-json.js b/packages/hardhat-ignition-ui/scripts/generate-example-deployment-json.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/scripts/generate-example-deployment-json.js rename to packages/hardhat-ignition-ui/scripts/generate-example-deployment-json.js diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/assets/ExternalLinkIcon.tsx b/packages/hardhat-ignition-ui/src/assets/ExternalLinkIcon.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/assets/ExternalLinkIcon.tsx rename to packages/hardhat-ignition-ui/src/assets/ExternalLinkIcon.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/assets/TooltipIcon.tsx b/packages/hardhat-ignition-ui/src/assets/TooltipIcon.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/assets/TooltipIcon.tsx rename to packages/hardhat-ignition-ui/src/assets/TooltipIcon.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/assets/purple-rocket.png b/packages/hardhat-ignition-ui/src/assets/purple-rocket.png similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/assets/purple-rocket.png rename to packages/hardhat-ignition-ui/src/assets/purple-rocket.png diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/components/mermaid.tsx b/packages/hardhat-ignition-ui/src/components/mermaid.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/components/mermaid.tsx rename to packages/hardhat-ignition-ui/src/components/mermaid.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/dc-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/dc-logo.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/components/socials/dc-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/dc-logo.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/gh-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/gh-logo.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/components/socials/gh-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/gh-logo.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/index.tsx b/packages/hardhat-ignition-ui/src/components/socials/index.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/components/socials/index.tsx rename to packages/hardhat-ignition-ui/src/components/socials/index.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/components/socials/tw-logo.tsx b/packages/hardhat-ignition-ui/src/components/socials/tw-logo.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/components/socials/tw-logo.tsx rename to packages/hardhat-ignition-ui/src/components/socials/tw-logo.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/main.css b/packages/hardhat-ignition-ui/src/main.css similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/main.css rename to packages/hardhat-ignition-ui/src/main.css diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/main.tsx b/packages/hardhat-ignition-ui/src/main.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/main.tsx rename to packages/hardhat-ignition-ui/src/main.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/deployment-flow.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/deployment-flow.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/components/deployment-flow.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/execution-batches.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/execution-batches.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/components/execution-batches.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-batch.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-batch.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-batch.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-batch.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-header.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-header.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/future-header.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/components/future-header.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/summary.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/components/summary.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/components/summary.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/components/summary.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/visualization-overview.tsx b/packages/hardhat-ignition-ui/src/pages/visualization-overview/visualization-overview.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/pages/visualization-overview/visualization-overview.tsx rename to packages/hardhat-ignition-ui/src/pages/visualization-overview/visualization-overview.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/queries/futures.ts b/packages/hardhat-ignition-ui/src/queries/futures.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/queries/futures.ts rename to packages/hardhat-ignition-ui/src/queries/futures.ts diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/utils/argumentTypeToString.tsx b/packages/hardhat-ignition-ui/src/utils/argumentTypeToString.tsx similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/utils/argumentTypeToString.tsx rename to packages/hardhat-ignition-ui/src/utils/argumentTypeToString.tsx diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/utils/to-escaped-id.ts b/packages/hardhat-ignition-ui/src/utils/to-escaped-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/utils/to-escaped-id.ts rename to packages/hardhat-ignition-ui/src/utils/to-escaped-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/utils/to-mermaid.ts b/packages/hardhat-ignition-ui/src/utils/to-mermaid.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/utils/to-mermaid.ts rename to packages/hardhat-ignition-ui/src/utils/to-mermaid.ts diff --git a/packages/hardhat-ignition-legacy/packages/ui/src/vite-env.d.ts b/packages/hardhat-ignition-ui/src/vite-env.d.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/src/vite-env.d.ts rename to packages/hardhat-ignition-ui/src/vite-env.d.ts diff --git a/packages/hardhat-ignition-legacy/packages/ui/test/to-mermaid.ts b/packages/hardhat-ignition-ui/test/to-mermaid.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/test/to-mermaid.ts rename to packages/hardhat-ignition-ui/test/to-mermaid.ts diff --git a/packages/hardhat-ignition-legacy/packages/ui/tsconfig.json b/packages/hardhat-ignition-ui/tsconfig.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/tsconfig.json rename to packages/hardhat-ignition-ui/tsconfig.json diff --git a/packages/hardhat-ignition-legacy/packages/ui/tsconfig.node.json b/packages/hardhat-ignition-ui/tsconfig.node.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/tsconfig.node.json rename to packages/hardhat-ignition-ui/tsconfig.node.json diff --git a/packages/hardhat-ignition-legacy/packages/ui/vite.config.ts b/packages/hardhat-ignition-ui/vite.config.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/ui/vite.config.ts rename to packages/hardhat-ignition-ui/vite.config.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.eslintrc.js b/packages/hardhat-ignition-viem/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.eslintrc.js rename to packages/hardhat-ignition-viem/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.gitignore b/packages/hardhat-ignition-viem/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.gitignore rename to packages/hardhat-ignition-viem/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.mocharc.json b/packages/hardhat-ignition-viem/.mocharc.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.mocharc.json rename to packages/hardhat-ignition-viem/.mocharc.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.npmignore b/packages/hardhat-ignition-viem/.npmignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.npmignore rename to packages/hardhat-ignition-viem/.npmignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.nycrc b/packages/hardhat-ignition-viem/.nycrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.nycrc rename to packages/hardhat-ignition-viem/.nycrc diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.prettierignore b/packages/hardhat-ignition-viem/.prettierignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/.prettierignore rename to packages/hardhat-ignition-viem/.prettierignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/CHANGELOG.md b/packages/hardhat-ignition-viem/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/CHANGELOG.md rename to packages/hardhat-ignition-viem/CHANGELOG.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/README.md b/packages/hardhat-ignition-viem/README.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/README.md rename to packages/hardhat-ignition-viem/README.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/package.json b/packages/hardhat-ignition-viem/package.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/package.json rename to packages/hardhat-ignition-viem/package.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts b/packages/hardhat-ignition-viem/scripts/compile-test-fixture-project.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/scripts/compile-test-fixture-project.ts rename to packages/hardhat-ignition-viem/scripts/compile-test-fixture-project.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts b/packages/hardhat-ignition-viem/src/ignition-module-results-to-viem-contracts.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/ignition-module-results-to-viem-contracts.ts rename to packages/hardhat-ignition-viem/src/ignition-module-results-to-viem-contracts.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/index.ts b/packages/hardhat-ignition-viem/src/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/index.ts rename to packages/hardhat-ignition-viem/src/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/type-extensions.ts b/packages/hardhat-ignition-viem/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/type-extensions.ts rename to packages/hardhat-ignition-viem/src/type-extensions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts b/packages/hardhat-ignition-viem/src/viem-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/src/viem-ignition-helper.ts rename to packages/hardhat-ignition-viem/src/viem-ignition-helper.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/.eslintrc.js b/packages/hardhat-ignition-viem/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/.eslintrc.js rename to packages/hardhat-ignition-viem/test/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/default-sender.ts b/packages/hardhat-ignition-viem/test/default-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/default-sender.ts rename to packages/hardhat-ignition-viem/test/default-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore b/packages/hardhat-ignition-viem/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/.gitignore rename to packages/hardhat-ignition-viem/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol b/packages/hardhat-ignition-viem/test/fixture-projects/create2/contracts/Baz.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/contracts/Baz.sol rename to packages/hardhat-ignition-viem/test/fixture-projects/create2/contracts/Baz.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/create2/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/hardhat.config.js rename to packages/hardhat-ignition-viem/test/fixture-projects/create2/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js b/packages/hardhat-ignition-viem/test/fixture-projects/create2/modules/BazModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/create2/modules/BazModule.js rename to packages/hardhat-ignition-viem/test/fixture-projects/create2/modules/BazModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/contracts/Contracts.sol rename to packages/hardhat-ignition-viem/test/fixture-projects/minimal/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition-viem/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition-viem/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/hardhat.config.js rename to packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js b/packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/index.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/fixture-projects/with-fake-helper/index.js rename to packages/hardhat-ignition-viem/test/fixture-projects/with-fake-helper/index.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts b/packages/hardhat-ignition-viem/test/ignition-helper-exclusivity.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/ignition-helper-exclusivity.ts rename to packages/hardhat-ignition-viem/test/ignition-helper-exclusivity.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/setup.ts b/packages/hardhat-ignition-viem/test/setup.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/setup.ts rename to packages/hardhat-ignition-viem/test/setup.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts b/packages/hardhat-ignition-viem/test/strategies/helper-invocation.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/strategies/helper-invocation.ts rename to packages/hardhat-ignition-viem/test/strategies/helper-invocation.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition-viem/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition-viem/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition-viem/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition-viem/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/use-module.ts b/packages/hardhat-ignition-viem/test/use-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/use-module.ts rename to packages/hardhat-ignition-viem/test/use-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts b/packages/hardhat-ignition-viem/test/viem-instances/artifact-contract-at.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-contract-at.ts rename to packages/hardhat-ignition-viem/test/viem-instances/artifact-contract-at.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts b/packages/hardhat-ignition-viem/test/viem-instances/artifact-deployment-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/artifact-deployment-contract.ts rename to packages/hardhat-ignition-viem/test/viem-instances/artifact-deployment-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts b/packages/hardhat-ignition-viem/test/viem-instances/named-contract-at.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-contract-at.ts rename to packages/hardhat-ignition-viem/test/viem-instances/named-contract-at.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts b/packages/hardhat-ignition-viem/test/viem-instances/named-deployment-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-instances/named-deployment-contract.ts rename to packages/hardhat-ignition-viem/test/viem-instances/named-deployment-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-results.ts b/packages/hardhat-ignition-viem/test/viem-results.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/test/viem-results.ts rename to packages/hardhat-ignition-viem/test/viem-results.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/tsconfig.json b/packages/hardhat-ignition-viem/tsconfig.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin-viem/tsconfig.json rename to packages/hardhat-ignition-viem/tsconfig.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.eslintrc.js b/packages/hardhat-ignition/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.eslintrc.js rename to packages/hardhat-ignition/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.gitignore b/packages/hardhat-ignition/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.gitignore rename to packages/hardhat-ignition/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.mocharc.json b/packages/hardhat-ignition/.mocharc.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.mocharc.json rename to packages/hardhat-ignition/.mocharc.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.npmignore b/packages/hardhat-ignition/.npmignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.npmignore rename to packages/hardhat-ignition/.npmignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.nycrc b/packages/hardhat-ignition/.nycrc similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.nycrc rename to packages/hardhat-ignition/.nycrc diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/.prettierignore b/packages/hardhat-ignition/.prettierignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/.prettierignore rename to packages/hardhat-ignition/.prettierignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/CHANGELOG.md b/packages/hardhat-ignition/CHANGELOG.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/CHANGELOG.md rename to packages/hardhat-ignition/CHANGELOG.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/README.md b/packages/hardhat-ignition/README.md similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/README.md rename to packages/hardhat-ignition/README.md diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/package.json b/packages/hardhat-ignition/package.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/package.json rename to packages/hardhat-ignition/package.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts b/packages/hardhat-ignition/src/hardhat-artifact-resolver.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/hardhat-artifact-resolver.ts rename to packages/hardhat-ignition/src/hardhat-artifact-resolver.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/helpers.ts b/packages/hardhat-ignition/src/helpers.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/helpers.ts rename to packages/hardhat-ignition/src/helpers.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/index.ts b/packages/hardhat-ignition/src/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/index.ts rename to packages/hardhat-ignition/src/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/modules.ts b/packages/hardhat-ignition/src/modules.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/modules.ts rename to packages/hardhat-ignition/src/modules.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/type-extensions.ts b/packages/hardhat-ignition/src/type-extensions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/type-extensions.ts rename to packages/hardhat-ignition/src/type-extensions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deploying-module-panel.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deploying-module-panel.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-deploying-module-panel.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/src/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition/src/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts b/packages/hardhat-ignition/src/ui/helpers/cwd-relative-path.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/cwd-relative-path.ts rename to packages/hardhat-ignition/src/ui/helpers/cwd-relative-path.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts b/packages/hardhat-ignition/src/ui/helpers/was-anything-executed.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/helpers/was-anything-executed.ts rename to packages/hardhat-ignition/src/ui/helpers/was-anything-executed.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/pretty-event-handler.ts b/packages/hardhat-ignition/src/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/pretty-event-handler.ts rename to packages/hardhat-ignition/src/ui/pretty-event-handler.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/types.ts b/packages/hardhat-ignition/src/ui/types.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/types.ts rename to packages/hardhat-ignition/src/ui/types.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/verbose-event-handler.ts b/packages/hardhat-ignition/src/ui/verbose-event-handler.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/ui/verbose-event-handler.ts rename to packages/hardhat-ignition/src/ui/verbose-event-handler.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/bigintReviver.ts b/packages/hardhat-ignition/src/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/bigintReviver.ts rename to packages/hardhat-ignition/src/utils/bigintReviver.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/src/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition/src/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts b/packages/hardhat-ignition/src/utils/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/getApiKeyAndUrls.ts rename to packages/hardhat-ignition/src/utils/getApiKeyAndUrls.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/load-module.ts b/packages/hardhat-ignition/src/utils/load-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/load-module.ts rename to packages/hardhat-ignition/src/utils/load-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/open.ts b/packages/hardhat-ignition/src/utils/open.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/open.ts rename to packages/hardhat-ignition/src/utils/open.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts b/packages/hardhat-ignition/src/utils/read-deployment-parameters.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/read-deployment-parameters.ts rename to packages/hardhat-ignition/src/utils/read-deployment-parameters.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/src/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition/src/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts b/packages/hardhat-ignition/src/utils/shouldBeHardhatPluginError.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/shouldBeHardhatPluginError.ts rename to packages/hardhat-ignition/src/utils/shouldBeHardhatPluginError.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts b/packages/hardhat-ignition/src/utils/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/utils/verifyEtherscanContract.ts rename to packages/hardhat-ignition/src/utils/verifyEtherscanContract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/visualization/write-visualization.ts b/packages/hardhat-ignition/src/visualization/write-visualization.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/src/visualization/write-visualization.ts rename to packages/hardhat-ignition/src/visualization/write-visualization.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/.eslintrc.js b/packages/hardhat-ignition/test/.eslintrc.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/.eslintrc.js rename to packages/hardhat-ignition/test/.eslintrc.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/config.ts b/packages/hardhat-ignition/test/config.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/config.ts rename to packages/hardhat-ignition/test/config.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/default-sender.ts b/packages/hardhat-ignition/test/deploy/default-sender.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/default-sender.ts rename to packages/hardhat-ignition/test/deploy/default-sender.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/gas-estimation.ts b/packages/hardhat-ignition/test/deploy/gas-estimation.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/gas-estimation.ts rename to packages/hardhat-ignition/test/deploy/gas-estimation.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts b/packages/hardhat-ignition/test/deploy/multiple-batch-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/multiple-batch-contract-deploy.ts rename to packages/hardhat-ignition/test/deploy/multiple-batch-contract-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-pending-user-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-pending-user-transactions.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/error-on-pending-user-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/error-on-rerun-with-replaced-pending-user-transaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-transaction-dropped.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-transaction-dropped.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/error-on-transaction-dropped.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/error-on-user-transaction-sent.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/error-on-user-transaction-sent.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/error-on-user-transaction-sent.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-dropped-ignition-transaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-now-complete-ignition-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-pending-ignition-transactions.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/rerun-with-replaced-confirmed-user-transaction.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts b/packages/hardhat-ignition/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts rename to packages/hardhat-ignition/test/deploy/nonce-checks/revert-nonce-on-simulation-error.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts rename to packages/hardhat-ignition/test/deploy/rerun/rerun-a-deploy-that-timed-out.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-after-kill.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-after-kill.ts rename to packages/hardhat-ignition/test/deploy/rerun/rerun-after-kill.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts b/packages/hardhat-ignition/test/deploy/rerun/rerun-with-new-contract-deploy.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/rerun/rerun-with-new-contract-deploy.ts rename to packages/hardhat-ignition/test/deploy/rerun/rerun-with-new-contract-deploy.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/reset.ts b/packages/hardhat-ignition/test/deploy/reset.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/reset.ts rename to packages/hardhat-ignition/test/deploy/reset.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts b/packages/hardhat-ignition/test/deploy/timeouts/deploy-run-times-out.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/timeouts/deploy-run-times-out.ts rename to packages/hardhat-ignition/test/deploy/timeouts/deploy-run-times-out.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/writeLocalhost.ts b/packages/hardhat-ignition/test/deploy/writeLocalhost.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/deploy/writeLocalhost.ts rename to packages/hardhat-ignition/test/deploy/writeLocalhost.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/.gitignore b/packages/hardhat-ignition/test/fixture-projects/.gitignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/.gitignore rename to packages/hardhat-ignition/test/fixture-projects/.gitignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/contracts/Foo.sol rename to packages/hardhat-ignition/test/fixture-projects/create2-bad-config/contracts/Foo.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/create2-bad-config/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/create2-bad-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol rename to packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/contracts/Unpayable.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/create2-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol rename to packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/contracts/Foo.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/create2-not-exists-chain/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol b/packages/hardhat-ignition/test/fixture-projects/lock/contracts/Lock.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/contracts/Lock.sol rename to packages/hardhat-ignition/test/fixture-projects/lock/contracts/Lock.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/lock/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/lock/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/Lock.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/Lock.ts rename to packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/Lock.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json rename to packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-bigints-as-strings.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 rename to packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-json5.json5 diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-too-large.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters-too-large.json rename to packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters-too-large.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json b/packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/lock/ignition/modules/parameters.json rename to packages/hardhat-ignition/test/fixture-projects/lock/ignition/modules/parameters.json diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Bar.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Bar.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Bar.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureArraysContract.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/CaptureComplexObjectContract.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/EventArgValue.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/EventArgValue.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/EventArgValue.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Factory.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Factory.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Factory.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Fails.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Fails.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Fails.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/FailureCalls.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/FailureCalls.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/FailureCalls.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Foo.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Foo.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Foo.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Greeter.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Greeter.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Greeter.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Ownable.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Ownable.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Ownable.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Owner.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Owner.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Owner.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/SendDataEmitter.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/SendDataEmitter.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/SendDataEmitter.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/StaticCallValue.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/StaticCallValue.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/StaticCallValue.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/Trace.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/Trace.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleEmitter.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleEmitter.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleEmitter.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleReturn.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/TupleReturn.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/TupleReturn.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/UsesContract.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/UsesContract.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/UsesContract.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/minimal/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/contracts/WithLibrary.sol rename to packages/hardhat-ignition/test/fixture-projects/minimal/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/minimal/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/minimal/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js b/packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/OwnModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/minimal/ignition/modules/OwnModule.js rename to packages/hardhat-ignition/test/fixture-projects/minimal/ignition/modules/OwnModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol rename to packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket1.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol rename to packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/contracts/Rocket2.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/multiple-contracts-with-same-name/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/reset-flag/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/contracts/Contracts.sol rename to packages/hardhat-ignition/test/fixture-projects/reset-flag/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/reset-flag/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js rename to packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/FirstPass.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js b/packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js rename to packages/hardhat-ignition/test/fixture-projects/reset-flag/ignition/modules/SecondPass.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl b/packages/hardhat-ignition/test/fixture-projects/reset-flag/journal.jsonl similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/reset-flag/journal.jsonl rename to packages/hardhat-ignition/test/fixture-projects/reset-flag/journal.jsonl diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/Contracts.sol rename to packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/contracts/WithLibrary.sol rename to packages/hardhat-ignition/test/fixture-projects/user-modules/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/user-modules/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/user-modules/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore b/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/.testignore similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/.testignore rename to packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/.testignore diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js b/packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/modules/TestModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/user-modules/ignition/modules/TestModule.js rename to packages/hardhat-ignition/test/fixture-projects/user-modules/ignition/modules/TestModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/verify-no-api-key/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/verify-no-api-key/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/verify-no-api-key/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Contracts.sol rename to packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/Trace.sol rename to packages/hardhat-ignition/test/fixture-projects/with-config/contracts/Trace.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/with-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition/test/fixture-projects/with-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/with-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/with-config/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/with-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/with-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Contracts.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Contracts.sol rename to packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Contracts.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Trace.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/Trace.sol rename to packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/Trace.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol rename to packages/hardhat-ignition/test/fixture-projects/with-invalid-config/contracts/WithLibrary.sol diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/hardhat.config.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/hardhat.config.js rename to packages/hardhat-ignition/test/fixture-projects/with-invalid-config/hardhat.config.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js b/packages/hardhat-ignition/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js rename to packages/hardhat-ignition/test/fixture-projects/with-invalid-config/ignition/modules/MyModule.js diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ignition-helper-guard.ts b/packages/hardhat-ignition/test/ignition-helper-guard.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ignition-helper-guard.ts rename to packages/hardhat-ignition/test/ignition-helper-guard.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/calls.ts b/packages/hardhat-ignition/test/module-api/calls.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/calls.ts rename to packages/hardhat-ignition/test/module-api/calls.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/contracts.ts b/packages/hardhat-ignition/test/module-api/contracts.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/contracts.ts rename to packages/hardhat-ignition/test/module-api/contracts.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/events.ts b/packages/hardhat-ignition/test/module-api/events.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/events.ts rename to packages/hardhat-ignition/test/module-api/events.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/existing-contract.ts b/packages/hardhat-ignition/test/module-api/existing-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/existing-contract.ts rename to packages/hardhat-ignition/test/module-api/existing-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts b/packages/hardhat-ignition/test/module-api/fully-qualified-names.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/fully-qualified-names.ts rename to packages/hardhat-ignition/test/module-api/fully-qualified-names.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/libraries.ts b/packages/hardhat-ignition/test/module-api/libraries.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/libraries.ts rename to packages/hardhat-ignition/test/module-api/libraries.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/params.ts b/packages/hardhat-ignition/test/module-api/params.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/params.ts rename to packages/hardhat-ignition/test/module-api/params.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/static-calls.ts b/packages/hardhat-ignition/test/module-api/static-calls.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/static-calls.ts rename to packages/hardhat-ignition/test/module-api/static-calls.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/use-module.ts b/packages/hardhat-ignition/test/module-api/use-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-api/use-module.ts rename to packages/hardhat-ignition/test/module-api/use-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-parameters.ts b/packages/hardhat-ignition/test/module-parameters.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/module-parameters.ts rename to packages/hardhat-ignition/test/module-parameters.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/plan/index.ts b/packages/hardhat-ignition/test/plan/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/plan/index.ts rename to packages/hardhat-ignition/test/plan/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/setup.ts b/packages/hardhat-ignition/test/setup.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/setup.ts rename to packages/hardhat-ignition/test/setup.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/create2.ts b/packages/hardhat-ignition/test/strategies/create2.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/create2.ts rename to packages/hardhat-ignition/test/strategies/create2.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts b/packages/hardhat-ignition/test/strategies/generic-strategy-constraints.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/generic-strategy-constraints.ts rename to packages/hardhat-ignition/test/strategies/generic-strategy-constraints.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts b/packages/hardhat-ignition/test/strategies/only-built-in-strategies.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/strategies/only-built-in-strategies.ts rename to packages/hardhat-ignition/test/strategies/only-built-in-strategies.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts b/packages/hardhat-ignition/test/test-helpers/clear-pending-transactions-from-memory-pool.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/clear-pending-transactions-from-memory-pool.ts rename to packages/hardhat-ignition/test/test-helpers/clear-pending-transactions-from-memory-pool.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/createX-tx.ts b/packages/hardhat-ignition/test/test-helpers/createX-tx.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/createX-tx.ts rename to packages/hardhat-ignition/test/test-helpers/createX-tx.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts b/packages/hardhat-ignition/test/test-helpers/externally-loaded-contract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/externally-loaded-contract.ts rename to packages/hardhat-ignition/test/test-helpers/externally-loaded-contract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts b/packages/hardhat-ignition/test/test-helpers/get-balance-for.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/get-balance-for.ts rename to packages/hardhat-ignition/test/test-helpers/get-balance-for.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/mine-block.ts b/packages/hardhat-ignition/test/test-helpers/mine-block.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/mine-block.ts rename to packages/hardhat-ignition/test/test-helpers/mine-block.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/sleep.ts b/packages/hardhat-ignition/test/test-helpers/sleep.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/sleep.ts rename to packages/hardhat-ignition/test/test-helpers/sleep.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts b/packages/hardhat-ignition/test/test-helpers/test-ignition-helper.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/test-ignition-helper.ts rename to packages/hardhat-ignition/test/test-helpers/test-ignition-helper.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/type-helper.ts b/packages/hardhat-ignition/test/test-helpers/type-helper.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/type-helper.ts rename to packages/hardhat-ignition/test/test-helpers/type-helper.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts b/packages/hardhat-ignition/test/test-helpers/use-ignition-project.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/use-ignition-project.ts rename to packages/hardhat-ignition/test/test-helpers/use-ignition-project.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts b/packages/hardhat-ignition/test/test-helpers/wait-for-pending-txs.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/test-helpers/wait-for-pending-txs.ts rename to packages/hardhat-ignition/test/test-helpers/wait-for-pending-txs.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-batch-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-batch-display.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-batch-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deploying-module-panel-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deploying-module-panel-display.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-deploying-module-panel-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-complete-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-complete-display.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-deployment-complete-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-deployment-status-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-deployment-status-display.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-deployment-status-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-list-transactions-display.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-list-transactions-display.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-list-transactions-display.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts b/packages/hardhat-ignition/test/ui/helpers/calculate-starting-message.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/calculate-starting-message.ts rename to packages/hardhat-ignition/test/ui/helpers/calculate-starting-message.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/test-format.ts b/packages/hardhat-ignition/test/ui/helpers/test-format.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/helpers/test-format.ts rename to packages/hardhat-ignition/test/ui/helpers/test-format.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/pretty-event-handler.ts b/packages/hardhat-ignition/test/ui/pretty-event-handler.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/ui/pretty-event-handler.ts rename to packages/hardhat-ignition/test/ui/pretty-event-handler.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/bigintReviver.ts b/packages/hardhat-ignition/test/utils/bigintReviver.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/bigintReviver.ts rename to packages/hardhat-ignition/test/utils/bigintReviver.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts b/packages/hardhat-ignition/test/utils/error-deployment-result-to-exception-message.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/error-deployment-result-to-exception-message.ts rename to packages/hardhat-ignition/test/utils/error-deployment-result-to-exception-message.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/load-module.ts b/packages/hardhat-ignition/test/utils/load-module.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/load-module.ts rename to packages/hardhat-ignition/test/utils/load-module.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts b/packages/hardhat-ignition/test/utils/resolve-deployment-id.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/utils/resolve-deployment-id.ts rename to packages/hardhat-ignition/test/utils/resolve-deployment-id.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts b/packages/hardhat-ignition/test/verify/getApiKeyAndUrls.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/getApiKeyAndUrls.ts rename to packages/hardhat-ignition/test/verify/getApiKeyAndUrls.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/index.ts b/packages/hardhat-ignition/test/verify/index.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/index.ts rename to packages/hardhat-ignition/test/verify/index.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts b/packages/hardhat-ignition/test/verify/verifyEtherscanContract.ts similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/test/verify/verifyEtherscanContract.ts rename to packages/hardhat-ignition/test/verify/verifyEtherscanContract.ts diff --git a/packages/hardhat-ignition-legacy/packages/hardhat-plugin/tsconfig.json b/packages/hardhat-ignition/tsconfig.json similarity index 100% rename from packages/hardhat-ignition-legacy/packages/hardhat-plugin/tsconfig.json rename to packages/hardhat-ignition/tsconfig.json From d8fa572c18924ae63f286457fb6dcefaf0244d18 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Wed, 15 Jan 2025 21:20:28 -0500 Subject: [PATCH 1300/1302] update ignition packages with dependencies previously saved at the workspace level --- package.json | 4 +- packages/hardhat-ignition-core/.gitignore | 149 +- packages/hardhat-ignition-core/package.json | 29 +- packages/hardhat-ignition-ethers/.gitignore | 145 +- packages/hardhat-ignition-ethers/package.json | 31 +- packages/hardhat-ignition-legacy/package.json | 37 - packages/hardhat-ignition-ui/package.json | 8 + packages/hardhat-ignition-viem/.gitignore | 145 +- packages/hardhat-ignition-viem/package.json | 31 +- packages/hardhat-ignition/.gitignore | 145 +- packages/hardhat-ignition/package.json | 34 +- pnpm-lock.yaml | 3087 ++++++++++++++++- pnpm-workspace.yaml | 1 + 13 files changed, 3721 insertions(+), 125 deletions(-) diff --git a/package.json b/package.json index ba750b37d2..f9eeff51fc 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ }, "scripts": { "postbuild": "cp packages/hardhat-core/src/internal/solidity/compiler/solcjs-runner.js packages/hardhat-core/internal/solidity/compiler/solcjs-runner.js", - "build": "tsc --build packages/hardhat-core packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem", - "watch": "tsc --build --watch packages/hardhat-core/src packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem", + "build": "tsc --build packages/hardhat-core packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem packages/hardhat-ignition-core packages/hardhat-ignition packages/hardhat-ignition-ethers packages/hardhat-ignition-viem packages/hardhat-ignition-ui", + "watch": "tsc --build --watch packages/hardhat-core/src packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem packages/hardhat-ignition-core packages/hardhat-ignition packages/hardhat-ignition-ethers packages/hardhat-ignition-viem packages/hardhat-ignition-ui", "clean": "pnpm run --recursive clean", "test": "node scripts/run-tests.js", "lint": "pnpm run --recursive lint && pnpm prettier --check", diff --git a/packages/hardhat-ignition-core/.gitignore b/packages/hardhat-ignition-core/.gitignore index fa13833bf3..74f2b4e0ba 100644 --- a/packages/hardhat-ignition-core/.gitignore +++ b/packages/hardhat-ignition-core/.gitignore @@ -1,3 +1,146 @@ -dist/ -etc/ -temp/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.ndjson + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist +etc +temp + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc + +# Mac OSX garbage +.DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json + +# Webstorm files +.idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/hardhat-ignition-core/package.json b/packages/hardhat-ignition-core/package.json index ad3129354f..6b2f1cefa0 100644 --- a/packages/hardhat-ignition-core/package.json +++ b/packages/hardhat-ignition-core/package.json @@ -46,9 +46,36 @@ "prepack": "pnpm build" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@microsoft/api-extractor": "7.40.1", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", - "hardhat": "^2.18.0" + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", + "@types/ndjson": "2.0.1", + "@types/lodash": "^4.14.123", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "ts-node": "10.9.1", + "typescript": "^5.0.2" }, "dependencies": { "@ethersproject/address": "5.6.1", diff --git a/packages/hardhat-ignition-ethers/.gitignore b/packages/hardhat-ignition-ethers/.gitignore index 849ddff3b7..c1c475b6a3 100644 --- a/packages/hardhat-ignition-ethers/.gitignore +++ b/packages/hardhat-ignition-ethers/.gitignore @@ -1 +1,144 @@ -dist/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.ndjson + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc + +# Mac OSX garbage +.DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json + +# Webstorm files +.idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/hardhat-ignition-ethers/package.json b/packages/hardhat-ignition-ethers/package.json index d594a7baa3..66e1f35814 100644 --- a/packages/hardhat-ignition-ethers/package.json +++ b/packages/hardhat-ignition-ethers/package.json @@ -33,17 +33,40 @@ "prepack": "pnpm build" }, "devDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/hardhat-ethers": "workspace:^", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0" + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^5.0.2" }, "peerDependencies": { - "@nomicfoundation/hardhat-ethers": "^3.0.4", + "@nomicfoundation/hardhat-ethers": "workspace:^", "@nomicfoundation/hardhat-ignition": "workspace:^", "@nomicfoundation/ignition-core": "workspace:^", "ethers": "^6.7.0", - "hardhat": "^2.18.0" + "hardhat": "workspace:^" } } diff --git a/packages/hardhat-ignition-legacy/package.json b/packages/hardhat-ignition-legacy/package.json index 43c49aed5f..03f59747f5 100644 --- a/packages/hardhat-ignition-legacy/package.json +++ b/packages/hardhat-ignition-legacy/package.json @@ -15,42 +15,5 @@ "watch": "tsc --build --watch packages/core packages/hardhat-plugin", "fullcheck": "pnpm build && pnpm lint && pnpm test && pnpm test:examples", "clean": "pnpm --recursive clean" - }, - "devDependencies": { - "@istanbuljs/nyc-config-typescript": "1.0.2", - "@nomiclabs/eslint-plugin-hardhat-internal-rules": "^1.0.2", - "@microsoft/api-extractor": "7.40.1", - "@types/chai": "^4.2.22", - "@types/chai-as-promised": "^7.1.5", - "@types/debug": "^4.1.7", - "@types/fs-extra": "^9.0.13", - "@types/lodash": "4.14.189", - "@types/lodash.flattendeep": "^4.4.7", - "@types/mocha": "9.1.1", - "@types/ndjson": "2.0.1", - "@types/node": "^18.0.0", - "@types/prompts": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^5.57.1", - "@typescript-eslint/experimental-utils": "^5.62.0", - "@typescript-eslint/parser": "^5.57.1", - "chai": "^4.3.4", - "chai-as-promised": "7.1.1", - "esbuild": "^0.15.9", - "eslint": "^8.38.0", - "eslint-config-prettier": "8.3.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-import": "2.29.0", - "eslint-plugin-mocha": "^9.0.0", - "eslint-plugin-no-only-tests": "3.1.0", - "eslint-plugin-prettier": "4.0.0", - "hardhat": "^2.18.0", - "mocha": "^9.1.3", - "nyc": "15.1.0", - "open-cli": "7.2.0", - "prettier": "2.8.8", - "rimraf": "3.0.2", - "sinon": "^14.0.0", - "ts-node": "10.9.1", - "typescript": "^5.0.2" } } diff --git a/packages/hardhat-ignition-ui/package.json b/packages/hardhat-ignition-ui/package.json index 0677f0515a..e98b12d7c1 100644 --- a/packages/hardhat-ignition-ui/package.json +++ b/packages/hardhat-ignition-ui/package.json @@ -19,19 +19,27 @@ "@nomicfoundation/ignition-core": "workspace:^", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.5", + "@types/mocha": "9.1.1", "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/styled-components": "5.1.26", + "@typescript-eslint/parser": "^5.57.1", "@vitejs/plugin-react": "^4.0.0", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "mermaid": "10.8.0", + "mocha": "^9.1.3", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "6.11.0", "react-tooltip": "^5.21.4", "styled-components": "5.3.10", "svg-pan-zoom": "^3.6.1", + "ts-node": "10.9.1", + "typescript": "^5.0.2", "vite": "^5.0.0", "vite-plugin-singlefile": "^2.0.1" } diff --git a/packages/hardhat-ignition-viem/.gitignore b/packages/hardhat-ignition-viem/.gitignore index 849ddff3b7..c1c475b6a3 100644 --- a/packages/hardhat-ignition-viem/.gitignore +++ b/packages/hardhat-ignition-viem/.gitignore @@ -1 +1,144 @@ -dist/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.ndjson + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc + +# Mac OSX garbage +.DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json + +# Webstorm files +.idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/hardhat-ignition-viem/package.json b/packages/hardhat-ignition-viem/package.json index 2ff43ad32e..8917606f51 100644 --- a/packages/hardhat-ignition-viem/package.json +++ b/packages/hardhat-ignition-viem/package.json @@ -34,17 +34,40 @@ "prepack": "pnpm build" }, "devDependencies": { - "@nomicfoundation/hardhat-viem": "^2.0.0", + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/hardhat-viem": "workspace:^", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", "@types/sinon": "^10.0.13", - "hardhat": "^2.18.0" + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^5.0.2" }, "peerDependencies": { "@nomicfoundation/hardhat-ignition": "workspace:^", - "@nomicfoundation/hardhat-viem": "^2.0.0", + "@nomicfoundation/hardhat-viem": "workspace:^", "@nomicfoundation/ignition-core": "workspace:^", - "hardhat": "^2.18.0", + "hardhat": "workspace:^", "viem": "^2.7.6" } } diff --git a/packages/hardhat-ignition/.gitignore b/packages/hardhat-ignition/.gitignore index 849ddff3b7..c1c475b6a3 100644 --- a/packages/hardhat-ignition/.gitignore +++ b/packages/hardhat-ignition/.gitignore @@ -1 +1,144 @@ -dist/ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +*.ndjson + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.npmrc + +# Mac OSX garbage +.DS_Store + +# Custom workspace settings for VSCode +.vscode/settings.json + +# Webstorm files +.idea/ + +# npm lockfile since we use pnpm now +package-lock.json diff --git a/packages/hardhat-ignition/package.json b/packages/hardhat-ignition/package.json index e9cc0760fd..133ee0534b 100644 --- a/packages/hardhat-ignition/package.json +++ b/packages/hardhat-ignition/package.json @@ -47,16 +47,42 @@ "prepack": "pnpm build" }, "devDependencies": { + "@istanbuljs/nyc-config-typescript": "1.0.2", + "@nomicfoundation/eslint-plugin-hardhat-internal-rules": "workspace:^", + "@nomicfoundation/hardhat-network-helpers": "workspace:^", "@types/chai": "^4.2.22", "@types/chai-as-promised": "^7.1.4", + "@types/debug": "^4.1.7", + "@types/fs-extra": "^9.0.13", + "@types/mocha": "9.1.1", + "@types/node": "^18.0.0", + "@types/prompts": "^2.4.2", "@types/sinon": "^10.0.13", - "@nomicfoundation/hardhat-network-helpers": "1.0.9", - "hardhat": "^2.18.0", + "@typescript-eslint/eslint-plugin": "^5.57.1", + "@typescript-eslint/experimental-utils": "^5.62.0", + "@typescript-eslint/parser": "^5.57.1", + "chai": "^4.3.4", + "chai-as-promised": "7.1.1", + "eslint": "^8.38.0", + "eslint-config-prettier": "8.3.0", + "eslint-import-resolver-typescript": "^3.5.5", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-mocha": "^9.0.0", + "eslint-plugin-no-only-tests": "3.1.0", + "eslint-plugin-prettier": "4.0.0", + "hardhat": "workspace:^", + "mocha": "^9.1.3", + "nyc": "15.1.0", + "prettier": "2.8.8", + "rimraf": "3.0.2", + "sinon": "^14.0.0", + "ts-node": "10.9.1", + "typescript": "^5.0.2", "viem": "^2.7.6" }, "peerDependencies": { - "@nomicfoundation/hardhat-verify": "^2.0.1", - "hardhat": "^2.18.0" + "@nomicfoundation/hardhat-verify": "workspace:^", + "hardhat": "workspace:^" }, "dependencies": { "@nomicfoundation/ignition-core": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f590795e46..a784b989eb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,7 +43,7 @@ importers: dependencies: '@typescript-eslint/utils': specifier: ^5.61.0 - version: 5.62.0(eslint@8.57.1)(typescript@5.0.4) + version: 5.62.0(eslint@8.57.1)(typescript@5.3.3) requireindex: specifier: ^1.2.0 version: 1.2.0 @@ -56,7 +56,7 @@ importers: version: 8.3.0(eslint@8.57.1) eslint-doc-generator: specifier: ^1.0.0 - version: 1.7.1(eslint@8.57.1)(typescript@5.0.4) + version: 1.7.1(eslint@8.57.1)(typescript@5.3.3) eslint-plugin-eslint-plugin: specifier: ^5.0.0 version: 5.5.1(eslint@8.57.1) @@ -74,7 +74,7 @@ importers: dependencies: eslint-module-utils: specifier: ^2.8.0 - version: 2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) + version: 2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) requireindex: specifier: ^1.2.0 version: 1.2.0 @@ -87,7 +87,7 @@ importers: version: 8.3.0(eslint@8.57.1) eslint-doc-generator: specifier: ^1.0.0 - version: 1.7.1(eslint@8.57.1)(typescript@5.0.4) + version: 1.7.1(eslint@8.57.1)(typescript@5.3.3) eslint-plugin-eslint-plugin: specifier: ^5.0.0 version: 5.5.1(eslint@8.57.1) @@ -244,7 +244,7 @@ importers: version: 2.0.0 debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) enquirer: specifier: ^2.3.0 version: 2.4.1 @@ -443,7 +443,7 @@ importers: dependencies: debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) lodash.isequal: specifier: ^4.5.0 version: 4.5.0 @@ -594,6 +594,529 @@ importers: specifier: ~5.0.0 version: 5.0.4 + packages/hardhat-ignition: + dependencies: + '@nomicfoundation/hardhat-verify': + specifier: workspace:^ + version: link:../hardhat-verify + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../hardhat-ignition-core + '@nomicfoundation/ignition-ui': + specifier: workspace:^ + version: link:../hardhat-ignition-ui + chalk: + specifier: ^4.0.0 + version: 4.1.2 + debug: + specifier: ^4.3.2 + version: 4.3.7(supports-color@5.5.0) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + json5: + specifier: ^2.2.3 + version: 2.2.3 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: 1.0.2 + version: 1.0.2(nyc@15.1.0) + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/hardhat-network-helpers': + specifier: workspace:^ + version: link:../hardhat-network-helpers + '@types/chai': + specifier: ^4.2.22 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/debug': + specifier: ^4.1.7 + version: 4.1.12 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/node': + specifier: ^18.0.0 + version: 18.19.59 + '@types/prompts': + specifier: ^2.4.2 + version: 2.4.9 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/experimental-utils': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.61.0(eslint@8.57.1)(typescript@5.0.4) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.5.0) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.1) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1) + eslint-plugin-import: + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-mocha: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.1) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + eslint-plugin-prettier: + specifier: 4.0.0 + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + hardhat: + specifier: workspace:^ + version: link:../hardhat-core + mocha: + specifier: ^9.1.3 + version: 9.2.2 + nyc: + specifier: 15.1.0 + version: 15.1.0 + prettier: + specifier: 2.8.8 + version: 2.8.8 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + sinon: + specifier: ^14.0.0 + version: 14.0.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.19.59)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + viem: + specifier: ^2.7.6 + version: 2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8) + + packages/hardhat-ignition-core: + dependencies: + '@ethersproject/address': + specifier: 5.6.1 + version: 5.6.1 + '@nomicfoundation/solidity-analyzer': + specifier: ^0.1.1 + version: 0.1.2 + cbor: + specifier: ^9.0.0 + version: 9.0.2 + debug: + specifier: ^4.3.2 + version: 4.3.7(supports-color@5.5.0) + ethers: + specifier: ^6.7.0 + version: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + fs-extra: + specifier: ^10.0.0 + version: 10.1.0 + immer: + specifier: 10.0.2 + version: 10.0.2 + lodash: + specifier: 4.17.21 + version: 4.17.21 + ndjson: + specifier: 2.0.0 + version: 2.0.0 + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: 1.0.2 + version: 1.0.2(nyc@15.1.0) + '@microsoft/api-extractor': + specifier: 7.40.1 + version: 7.40.1(@types/node@18.19.59) + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@types/chai': + specifier: ^4.2.22 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.5 + version: 7.1.8 + '@types/debug': + specifier: ^4.1.7 + version: 4.1.12 + '@types/fs-extra': + specifier: ^9.0.13 + version: 9.0.13 + '@types/lodash': + specifier: ^4.14.123 + version: 4.17.12 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/ndjson': + specifier: 2.0.1 + version: 2.0.1 + '@types/node': + specifier: ^18.0.0 + version: 18.19.59 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/experimental-utils': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.61.0(eslint@8.57.1)(typescript@5.0.4) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.5.0) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.1) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1) + eslint-plugin-import: + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-mocha: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.1) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + eslint-plugin-prettier: + specifier: 4.0.0 + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + hardhat: + specifier: workspace:^ + version: link:../hardhat-core + mocha: + specifier: ^9.1.3 + version: 9.2.2 + nyc: + specifier: 15.1.0 + version: 15.1.0 + prettier: + specifier: 2.8.8 + version: 2.8.8 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.19.59)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + + packages/hardhat-ignition-ethers: + dependencies: + '@nomicfoundation/hardhat-ignition': + specifier: workspace:^ + version: link:../hardhat-ignition + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../hardhat-ignition-core + ethers: + specifier: ^6.7.0 + version: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: 1.0.2 + version: 1.0.2(nyc@15.1.0) + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/hardhat-ethers': + specifier: workspace:^ + version: link:../hardhat-ethers + '@types/chai': + specifier: ^4.2.22 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/node': + specifier: ^18.0.0 + version: 18.19.59 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/experimental-utils': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.61.0(eslint@8.57.1)(typescript@5.0.4) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.5.0) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.1) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1) + eslint-plugin-import: + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-mocha: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.1) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + eslint-plugin-prettier: + specifier: 4.0.0 + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + hardhat: + specifier: workspace:^ + version: link:../hardhat-core + mocha: + specifier: ^9.1.3 + version: 9.2.2 + nyc: + specifier: 15.1.0 + version: 15.1.0 + prettier: + specifier: 2.8.8 + version: 2.8.8 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + sinon: + specifier: ^14.0.0 + version: 14.0.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.19.59)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + + packages/hardhat-ignition-ui: + devDependencies: + '@fontsource/roboto': + specifier: ^5.0.8 + version: 5.1.1 + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../hardhat-ignition-core + '@types/chai': + specifier: ^4.2.22 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.5 + version: 7.1.8 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/react': + specifier: ^18.0.28 + version: 18.3.18 + '@types/react-dom': + specifier: ^18.0.11 + version: 18.3.5(@types/react@18.3.18) + '@types/styled-components': + specifier: 5.1.26 + version: 5.1.26 + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.61.0(eslint@8.57.1)(typescript@5.0.4) + '@vitejs/plugin-react': + specifier: ^4.0.0 + version: 4.3.4(vite@5.4.11(@types/node@22.7.5)) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.5.0) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-plugin-react-hooks: + specifier: ^4.6.0 + version: 4.6.2(eslint@8.57.1) + eslint-plugin-react-refresh: + specifier: ^0.3.4 + version: 0.3.5(eslint@8.57.1) + mermaid: + specifier: 10.8.0 + version: 10.8.0 + mocha: + specifier: ^9.1.3 + version: 9.2.2 + react: + specifier: ^18.2.0 + version: 18.3.1 + react-dom: + specifier: ^18.2.0 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: 6.11.0 + version: 6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-tooltip: + specifier: ^5.21.4 + version: 5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + styled-components: + specifier: 5.3.10 + version: 5.3.10(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + svg-pan-zoom: + specifier: ^3.6.1 + version: 3.6.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@22.7.5)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + vite: + specifier: ^5.0.0 + version: 5.4.11(@types/node@22.7.5) + vite-plugin-singlefile: + specifier: ^2.0.1 + version: 2.1.0(rollup@4.30.1)(vite@5.4.11(@types/node@22.7.5)) + + packages/hardhat-ignition-viem: + dependencies: + '@nomicfoundation/hardhat-ignition': + specifier: workspace:^ + version: link:../hardhat-ignition + '@nomicfoundation/ignition-core': + specifier: workspace:^ + version: link:../hardhat-ignition-core + viem: + specifier: ^2.7.6 + version: 2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8) + devDependencies: + '@istanbuljs/nyc-config-typescript': + specifier: 1.0.2 + version: 1.0.2(nyc@15.1.0) + '@nomicfoundation/eslint-plugin-hardhat-internal-rules': + specifier: workspace:^ + version: link:../eslint-plugin-hardhat-internal-rules + '@nomicfoundation/hardhat-viem': + specifier: workspace:^ + version: link:../hardhat-viem + '@types/chai': + specifier: ^4.2.22 + version: 4.3.20 + '@types/chai-as-promised': + specifier: ^7.1.4 + version: 7.1.8 + '@types/mocha': + specifier: 9.1.1 + version: 9.1.1 + '@types/node': + specifier: ^18.0.0 + version: 18.19.59 + '@types/sinon': + specifier: ^10.0.13 + version: 10.0.20 + '@typescript-eslint/eslint-plugin': + specifier: ^5.57.1 + version: 5.61.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/experimental-utils': + specifier: ^5.62.0 + version: 5.62.0(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/parser': + specifier: ^5.57.1 + version: 5.61.0(eslint@8.57.1)(typescript@5.0.4) + chai: + specifier: ^4.3.4 + version: 4.5.0 + chai-as-promised: + specifier: 7.1.1 + version: 7.1.1(chai@4.5.0) + eslint: + specifier: ^8.38.0 + version: 8.57.1 + eslint-config-prettier: + specifier: 8.3.0 + version: 8.3.0(eslint@8.57.1) + eslint-import-resolver-typescript: + specifier: ^3.5.5 + version: 3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1) + eslint-plugin-import: + specifier: 2.29.0 + version: 2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-mocha: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.57.1) + eslint-plugin-no-only-tests: + specifier: 3.1.0 + version: 3.1.0 + eslint-plugin-prettier: + specifier: 4.0.0 + version: 4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + hardhat: + specifier: workspace:^ + version: link:../hardhat-core + mocha: + specifier: ^9.1.3 + version: 9.2.2 + nyc: + specifier: 15.1.0 + version: 15.1.0 + prettier: + specifier: 2.8.8 + version: 2.8.8 + rimraf: + specifier: 3.0.2 + version: 3.0.2 + sinon: + specifier: ^14.0.0 + version: 14.0.2 + ts-node: + specifier: 10.9.1 + version: 10.9.1(@types/node@18.19.59)(typescript@5.0.4) + typescript: + specifier: ^5.0.2 + version: 5.0.4 + packages/hardhat-ledger: dependencies: '@ledgerhq/errors': @@ -616,7 +1139,7 @@ importers: version: 2.4.2 debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) env-paths: specifier: ^2.2.0 version: 2.2.1 @@ -783,7 +1306,7 @@ importers: version: 0.0.3 debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) semver: specifier: ^6.3.0 version: 6.3.1 @@ -1017,7 +1540,7 @@ importers: version: link:../hardhat-ethers '@nomicfoundation/hardhat-ignition-ethers': specifier: ^0.15.0 - version: 0.15.7(@nomicfoundation/hardhat-ethers@packages+hardhat-ethers)(@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core) + version: 0.15.7(@nomicfoundation/hardhat-ethers@packages+hardhat-ethers)(@nomicfoundation/hardhat-ignition@0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core) '@nomicfoundation/hardhat-network-helpers': specifier: workspace:^1.0.0 version: link:../hardhat-network-helpers @@ -1108,7 +1631,7 @@ importers: version: link:../eslint-plugin-slow-imports '@nomicfoundation/hardhat-ignition-viem': specifier: ^0.15.0 - version: 0.15.7(@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8)) + version: 0.15.7(@nomicfoundation/hardhat-ignition@0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8)) '@nomicfoundation/hardhat-network-helpers': specifier: workspace:^1.0.0 version: link:../hardhat-network-helpers @@ -1365,7 +1888,7 @@ importers: version: 8.1.0 debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) lodash.clonedeep: specifier: ^4.5.0 version: 4.5.0 @@ -1574,7 +2097,7 @@ importers: dependencies: debug: specifier: ^4.1.1 - version: 4.3.7(supports-color@8.1.1) + version: 4.3.7(supports-color@5.5.0) fs-extra: specifier: ^7.0.1 version: 7.0.1 @@ -1878,6 +2401,10 @@ packages: resolution: {integrity: sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==} engines: {node: '>=6.9.0'} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + '@babel/compat-data@7.25.9': resolution: {integrity: sha512-yD+hEuJ/+wAJ4Ox2/rpNv5HIuPG82x3ZlQvYVn8iYCprdxzE7P1udpGF1jyjQVBU4dgznN+k2h103vxZ7NdPyw==} engines: {node: '>=6.9.0'} @@ -1886,10 +2413,22 @@ packages: resolution: {integrity: sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + '@babel/generator@7.25.9': resolution: {integrity: sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.25.9': + resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} + engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.25.9': resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} engines: {node: '>=6.9.0'} @@ -1904,6 +2443,16 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.25.9': resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} engines: {node: '>=6.9.0'} @@ -1924,6 +2473,10 @@ packages: resolution: {integrity: sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.25.9': resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} @@ -1933,6 +2486,29 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.25.9': + resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.25.9': + resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.25.9': resolution: {integrity: sha512-4zpTHZ9Cm6L9L+uIqghQX8ZXg8HKFcjYO3qHoO8zTmRm6HQUJ8SSJ+KRvbMBZn0EGVlT4DRYeQ/6hjlyXBh+Kg==} engines: {node: '>=6.9.0'} @@ -1949,6 +2525,13 @@ packages: resolution: {integrity: sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + + '@braintree/sanitize-url@6.0.4': + resolution: {integrity: sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A==} + '@changesets/apply-release-plan@7.0.5': resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} @@ -2008,6 +2591,18 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@emotion/is-prop-valid@1.3.1': + resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/stylis@0.8.5': + resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} + + '@emotion/unitless@0.7.5': + resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + '@ensdomains/address-encoder@0.1.9': resolution: {integrity: sha512-E2d2gP4uxJQnDu2Kfg1tHNspefzbLT8Tyjrm5sEuim32UkU2sm5xL4VXtgc2X33fmPEw9+jUMpGs4veMbf+PYg==} @@ -2022,6 +2617,144 @@ packages: resolution: {integrity: sha512-bvaTH34PMCbv6anRa9I/0zjLJgY4EuznbEMgbV77JBCQ9KNC46rzi0avuxpOfu+xDjPEtSFGqVEOr5GlUSGudA==} deprecated: Please use @ensdomains/ens-contracts + '@esbuild/aix-ppc64@0.21.5': + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.21.5': + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.21.5': + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.21.5': + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.21.5': + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.21.5': + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.21.5': + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.21.5': + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.21.5': + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.21.5': + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.21.5': + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.21.5': + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.21.5': + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.21.5': + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.21.5': + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.21.5': + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.21.5': + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.21.5': + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.21.5': + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.21.5': + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.21.5': + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.21.5': + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.21.5': + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2163,6 +2896,18 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@floating-ui/core@1.6.9': + resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + + '@floating-ui/dom@1.6.13': + resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} + + '@floating-ui/utils@0.2.9': + resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + + '@fontsource/roboto@5.1.1': + resolution: {integrity: sha512-XwVVXtERDQIM7HPUIbyDe0FP4SRovpjF7zMI8M7pbqFp3ahLJsJTd18h+E6pkar6UbV3btbwkKjYARr5M+SQow==} + '@fvictorio/tabtab@0.0.3': resolution: {integrity: sha512-bT/BSy8MJThrTebqTCjXRnGSgZWthHLigZ4k2AvfNtC79vPyBS1myaxw8gRU6RxIcdDD3HBtm7pOsOoyC086Zg==} engines: {node: '>=10'} @@ -2184,6 +2929,12 @@ packages: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} + '@istanbuljs/nyc-config-typescript@1.0.2': + resolution: {integrity: sha512-iKGIyMoyJuFnJRSVTZ78POIRvNnwZaWIf8vG4ZS3rQq58MMDrqEX2nnzx0R28V2X8JvmKYiqY9FP2hlJsm8A0w==} + engines: {node: '>=8'} + peerDependencies: + nyc: '>=15' + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -2280,6 +3031,19 @@ packages: resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==} engines: {node: '>=12.0.0'} + '@microsoft/api-extractor-model@7.28.9': + resolution: {integrity: sha512-lM77dV+VO46MGp5lu4stUBnO3jyr+CrDzU+DtapcOQEZUqJxPYUoK5zjeD+gRZ9ckgGMZC94ch6FBkpmsjwQgw==} + + '@microsoft/api-extractor@7.40.1': + resolution: {integrity: sha512-xHn2Zkh6s5JIjP94SG6VtIlIeRJcASgfZpDKV+bgoddMt1X4ujSZFOz7uEGNYNO7mEtdVOvpNKBpC4CDytD8KQ==} + hasBin: true + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + '@noble/curves@1.2.0': resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==} @@ -2320,6 +3084,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + '@nomicfoundation/edr-darwin-arm64@0.6.5': resolution: {integrity: sha512-A9zCCbbNxBpLgjS1kEJSpqxIvGGAX4cYbpDYCU2f3jVqOwaZ/NU761y1SvuCRVpOwhoCXqByN9b7HPpHi0L4hw==} engines: {node: '>= 18'} @@ -2404,17 +3172,17 @@ packages: hardhat: ^2.18.0 viem: ^2.7.6 - '@nomicfoundation/hardhat-ignition@0.15.7': - resolution: {integrity: sha512-RFhGazR0/JqHxuuIxjjMmM+nWFqEvA7wcVqcX7vUqqmAIGuok4HhnWQH8aOvBaVguiXvvlFDJL0PIlxmkFgIUg==} + '@nomicfoundation/hardhat-ignition@0.15.9': + resolution: {integrity: sha512-lSWqhaDOBt6gsqMadkRLvH6HdoFV1v8/bx7z+12cghaOloVwwn48CPoTH2iXXnkqilPGw8rdH5eVTE6UM+2v6Q==} peerDependencies: '@nomicfoundation/hardhat-verify': ^2.0.1 hardhat: ^2.18.0 - '@nomicfoundation/ignition-core@0.15.7': - resolution: {integrity: sha512-C4/0V/q2gNxKDt88cMr+Oxlf4NINQ7QgmJyciQ1/6UdCRUg+/Pgdgpd3vgGXQVTotq50Q/BU4ofNUAD/8HRqtg==} + '@nomicfoundation/ignition-core@0.15.9': + resolution: {integrity: sha512-X8W+7UP/UQPorpHUnGvA1OdsEr/edGi8tDpNwEqzaLm83FMZVbRWdOsr3vNICHN2XMzNY/xIm18Cx7xGKL2PQw==} - '@nomicfoundation/ignition-ui@0.15.7': - resolution: {integrity: sha512-pj2LmXylgbHOTNrkFqFrre/FAOjcwYl4VKIKVH/QMMBH/DatbiT8aC5n9o2fbLD8uwlPEesD+uXZuKCE71KFBg==} + '@nomicfoundation/ignition-ui@0.15.9': + resolution: {integrity: sha512-8lzbT7gpJ5PoowPQDQilkwdyqBviUKDMoHp/5rhgnwG1bDslnCS+Lxuo6s9R2akWu9LtEL14dNyqQb6WsURTag==} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': resolution: {integrity: sha512-JaqcWPDZENCvm++lFFGjrDd8mxtf+CtLd2MiXvMNTBD33dContTZ9TWETwNFwg7JTJT5Q9HEecH7FA+HTSsIUw==} @@ -2479,6 +3247,119 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} + '@remix-run/router@1.6.0': + resolution: {integrity: sha512-N13NRw3T2+6Xi9J//3CGLsK2OqC8NMme3d/YX+nh05K9YHWGcv8DycHJrqGScSP4T75o8IN6nqIMhVFU8ohg8w==} + engines: {node: '>=14'} + + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + cpu: [x64] + os: [win32] + + '@rushstack/node-core-library@3.66.0': + resolution: {integrity: sha512-nXyddNe3T9Ph14TrIfjtLZ+GDzC7HL/wF+ZKC18qmRVtz2xXLd1ZzreVgiAgGDwn8ZUWZ/7q//gQJk96iWjSrg==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + + '@rushstack/rig-package@0.5.1': + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} + + '@rushstack/ts-command-line@4.17.1': + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + '@scure/base@1.1.9': resolution: {integrity: sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==} @@ -2542,12 +3423,27 @@ packages: '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + '@sinonjs/commons@2.0.0': + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@11.3.1': + resolution: {integrity: sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==} + '@sinonjs/fake-timers@6.0.1': resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} + '@sinonjs/fake-timers@9.1.2': + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + '@sinonjs/samsam@5.3.1': resolution: {integrity: sha512-1Hc0b1TtyfBu8ixF/tpfSHTVWKwCBLY4QJbkgnE7HcwyvT2xArDxb4K7dMgqRm3szI+LJbzmW/s4xxEhv6hwDg==} + '@sinonjs/samsam@7.0.1': + resolution: {integrity: sha512-zsAk2Jkiq89mhZovB2LLOdTCxJF4hqqTToGP0ASWlhp4I1hqOjcfmZGafXntCN7MDC6yySH0mFHrYtHceOeLmw==} + '@sinonjs/text-encoding@0.7.3': resolution: {integrity: sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==} @@ -2639,9 +3535,24 @@ packages: hardhat: ^2.9.9 typechain: ^8.3.2 + '@types/argparse@1.0.38': + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + '@types/async-eventemitter@0.2.4': resolution: {integrity: sha512-2Bq61VD01kgLf1XkK2xPtoBcu7fgn/km5JyEX9v0BlG5VQBzA+BlF9umFk+8gR8S4+eK7MgDY2oyVZCu6ar3Jw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/bn.js@4.11.6': resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==} @@ -2663,9 +3574,21 @@ packages: '@types/concat-stream@1.6.1': resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==} + '@types/d3-scale-chromatic@3.1.0': + resolution: {integrity: sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==} + + '@types/d3-scale@4.0.8': + resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} + + '@types/d3-time@3.0.4': + resolution: {integrity: sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==} + '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/events@3.0.3': resolution: {integrity: sha512-trOc4AAUThEz9hapPtSd7wf5tiQKvTtu5b371UxXdTuqzIh0ArcRspRP0i0Viu+LXstIQ1z96t1nsPxT9ol01g==} @@ -2675,9 +3598,15 @@ packages: '@types/fs-extra@5.1.0': resolution: {integrity: sha512-AInn5+UBFIK9FK5xc9yP5e3TQSPNNgjHByqYcj9g5elVBnDQcQL7PlO1CIRy2gWlbwK7UPYqi7vRvFA44dCmYQ==} + '@types/fs-extra@9.0.13': + resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} + '@types/glob@7.2.0': resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + '@types/hoist-non-react-statics@3.3.6': + resolution: {integrity: sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==} + '@types/http-cache-semantics@4.0.4': resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} @@ -2708,15 +3637,24 @@ packages: '@types/lru-cache@5.1.1': resolution: {integrity: sha512-ssE3Vlrys7sdIzs5LOxCzTVMsU7i9oa/IaW92wF32JFb3CVczqOkru2xspuKczHEbG3nvmPY7IFqVmGGHdNbYw==} + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} '@types/mocha@10.0.9': resolution: {integrity: sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==} + '@types/mocha@9.1.1': + resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + '@types/ndjson@2.0.1': + resolution: {integrity: sha512-xSRLa/CtPjEo0plSQj+nMKjVBkYh5MeMwOXa1y//jFELdmy9AmVQgWKWQgZ+/XrNlAYxXtmKR8OHaizPgEpUEw==} + '@types/node@10.17.60': resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==} @@ -2738,9 +3676,23 @@ packages: '@types/prettier@2.7.3': resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + '@types/prompts@2.4.9': + resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + + '@types/prop-types@15.7.14': + resolution: {integrity: sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==} + '@types/qs@6.9.16': resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==} + '@types/react-dom@18.3.5': + resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} + peerDependencies: + '@types/react': ^18.0.0 + + '@types/react@18.3.18': + resolution: {integrity: sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==} + '@types/readable-stream@2.3.15': resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==} @@ -2762,12 +3714,27 @@ packages: '@types/sinon-chai@3.2.12': resolution: {integrity: sha512-9y0Gflk3b0+NhQZ/oxGtaAJDvRywCa5sIyaVnounqLvmf93yBF4EgIRspePtkMs3Tr844nCclYMlcCNmLCvjuQ==} + '@types/sinon@10.0.20': + resolution: {integrity: sha512-2APKKruFNCAZgx3daAyACGzWuJ028VVCUDk6o2rw/Z4PXT0ogwdV4KUegW0MwVs0Zu59auPXbbuBJHF12Sx1Eg==} + '@types/sinon@9.0.11': resolution: {integrity: sha512-PwP4UY33SeeVKodNE37ZlOsR9cReypbMJOhZ7BVE0lB+Hix3efCOxiJWiE5Ia+yL9Cn2Ch72EjFTRze8RZsNtg==} '@types/sinonjs__fake-timers@8.1.5': resolution: {integrity: sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==} + '@types/styled-components@5.1.26': + resolution: {integrity: sha512-KuKJ9Z6xb93uJiIyxo/+ksS7yLjS1KzG6iv5i78dhVg/X3u5t1H7juRWqVmodIdz6wGVaIApo1u01kmFRdJHVw==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/unist@2.0.11': + resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -2791,6 +3758,12 @@ packages: typescript: optional: true + '@typescript-eslint/experimental-utils@5.62.0': + resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser@5.61.0': resolution: {integrity: sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2865,9 +3838,18 @@ packages: resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@ungap/promise-all-settled@1.1.2': + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + '@vitejs/plugin-react@4.3.4': + resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 || ^6.0.0 + abbrev@1.0.9: resolution: {integrity: sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==} @@ -2961,6 +3943,10 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -3057,6 +4043,10 @@ packages: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + array.prototype.flat@1.3.2: resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} engines: {node: '>= 0.4'} @@ -3118,6 +4108,11 @@ packages: axios@1.7.7: resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + babel-plugin-styled-components@2.1.4: + resolution: {integrity: sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==} + peerDependencies: + styled-components: '>= 2' + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3308,6 +4303,9 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} + camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + caniuse-lite@1.0.30001669: resolution: {integrity: sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==} @@ -3326,6 +4324,11 @@ packages: resolution: {integrity: sha512-JPypkxsB10s9QOWwa6zwPzqE1Md3vqpPc+cai4sAecuCsRyAtAl/pMyhPlMbT/xtPnm2dznJZYRLui57qiRhaQ==} engines: {node: '>=16'} + chai-as-promised@7.1.1: + resolution: {integrity: sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==} + peerDependencies: + chai: '>= 2.1.2 < 5' + chai-as-promised@7.1.2: resolution: {integrity: sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==} peerDependencies: @@ -3350,6 +4353,9 @@ packages: change-case@3.0.2: resolution: {integrity: sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==} + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} @@ -3366,6 +4372,10 @@ packages: resolution: {integrity: sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww==} engines: {node: '>=18.17'} + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -3395,6 +4405,9 @@ packages: class-is@1.1.0: resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==} + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -3452,6 +4465,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + colors@1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -3482,10 +4499,18 @@ packages: resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} engines: {node: '>= 6'} + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + commander@8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -3543,6 +4568,9 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cose-base@1.0.3: + resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} + cosmiconfig@8.3.6: resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} @@ -3591,17 +4619,178 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + css-select@5.1.0: resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + cytoscape-cose-bilkent@4.1.0: + resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} + peerDependencies: + cytoscape: ^3.2.0 + + cytoscape@3.31.0: + resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} + engines: {node: '>=0.10'} + + d3-array@2.12.1: + resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} + + d3-array@3.2.4: + resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} + engines: {node: '>=12'} + + d3-axis@3.0.0: + resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} + engines: {node: '>=12'} + + d3-brush@3.0.0: + resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} + engines: {node: '>=12'} + + d3-chord@3.0.1: + resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} + engines: {node: '>=12'} + + d3-color@3.1.0: + resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} + engines: {node: '>=12'} + + d3-contour@4.0.2: + resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} + engines: {node: '>=12'} + + d3-delaunay@6.0.4: + resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} + engines: {node: '>=12'} + + d3-dispatch@3.0.1: + resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} + engines: {node: '>=12'} + + d3-drag@3.0.0: + resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} + engines: {node: '>=12'} + + d3-dsv@3.0.1: + resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} + engines: {node: '>=12'} + hasBin: true + + d3-ease@3.0.1: + resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} + engines: {node: '>=12'} + + d3-fetch@3.0.1: + resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} + engines: {node: '>=12'} + + d3-force@3.0.0: + resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} + engines: {node: '>=12'} + + d3-format@3.1.0: + resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} + engines: {node: '>=12'} + + d3-geo@3.1.1: + resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} + engines: {node: '>=12'} + + d3-hierarchy@3.1.2: + resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} + engines: {node: '>=12'} + + d3-interpolate@3.0.1: + resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} + engines: {node: '>=12'} + + d3-path@1.0.9: + resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} + + d3-path@3.1.0: + resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} + engines: {node: '>=12'} + + d3-polygon@3.0.1: + resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} + engines: {node: '>=12'} + + d3-quadtree@3.0.1: + resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} + engines: {node: '>=12'} + + d3-random@3.0.1: + resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} + engines: {node: '>=12'} + + d3-sankey@0.12.3: + resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} + + d3-scale-chromatic@3.1.0: + resolution: {integrity: sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==} + engines: {node: '>=12'} + + d3-scale@4.0.2: + resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} + engines: {node: '>=12'} + + d3-selection@3.0.0: + resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} + engines: {node: '>=12'} + + d3-shape@1.3.7: + resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} + + d3-shape@3.2.0: + resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} + engines: {node: '>=12'} + + d3-time-format@4.1.0: + resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} + engines: {node: '>=12'} + + d3-time@3.1.0: + resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} + engines: {node: '>=12'} + + d3-timer@3.0.1: + resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} + engines: {node: '>=12'} + + d3-transition@3.0.1: + resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} + engines: {node: '>=12'} + peerDependencies: + d3-selection: 2 - 3 + + d3-zoom@3.0.0: + resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} + engines: {node: '>=12'} + + d3@7.9.0: + resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} + engines: {node: '>=12'} + d@1.0.2: resolution: {integrity: sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==} engines: {node: '>=0.12'} + dagre-d3-es@7.0.10: + resolution: {integrity: sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==} + dashdash@1.14.1: resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} engines: {node: '>=0.10'} @@ -3622,6 +4811,9 @@ packages: resolution: {integrity: sha512-p4psdkgdNA6x0600SKbfWiOomNb33ADBMRHf49GMhYVgJsPefZlMSLXXVWWUpbqSxB3DL5/cxKa6a8i3XPK5Xg==} engines: {node: '>=0.10.0'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + death@1.1.0: resolution: {integrity: sha512-vsV6S4KVHvTGxbEcij7hkWRv0It+sGGWVOM67dQde/o5Xjnr+KmLjxWJii2uEObIrt1CcM9w0Yaovx+iOlIL+w==} @@ -3641,6 +4833,15 @@ packages: supports-color: optional: true + debug@4.3.3: + resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -3661,6 +4862,9 @@ packages: decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -3707,6 +4911,9 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + delaunator@5.0.1: + resolution: {integrity: sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -3715,6 +4922,10 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3747,6 +4958,10 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -3779,6 +4994,9 @@ packages: resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} engines: {node: '>= 4'} + dompurify@3.2.3: + resolution: {integrity: sha512-U1U5Hzc2MO0oW3DF+G9qYN0aT7atAou4AgI0XjWz061nyBPbdxkfdhfy5uMgGn6+oLFCfn44ZGbdDqCzVmlOWA==} + domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} @@ -3801,6 +5019,9 @@ packages: electron-to-chromium@1.5.45: resolution: {integrity: sha512-vOzZS6uZwhhbkZbcRyiy99Wg+pYFV5hk+5YaECvx0+Z31NR3Tt5zS6dze2OepT6PCTzVzT0dIJItti+uAW5zmw==} + elkjs@0.9.3: + resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==} + elliptic@6.5.4: resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==} @@ -3824,6 +5045,10 @@ packages: end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} + engines: {node: '>=10.13.0'} + enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} @@ -3883,6 +5108,11 @@ packages: resolution: {integrity: sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg==} engines: {node: '>=0.12'} + esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -3925,6 +5155,19 @@ packages: eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + eslint-import-resolver-typescript@3.7.0: + resolution: {integrity: sha512-Vrwyi8HHxY97K5ebydMtffsWAn1SCR9eol49eCd5fJS4O1WV7PaAjbcjmbfJJSMz/t4Mal212Uz/fQZrOB8mow==} + 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.12.0: resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} @@ -3968,18 +5211,38 @@ packages: '@typescript-eslint/parser': optional: true + eslint-plugin-import@2.29.0: + resolution: {integrity: sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-plugin-mocha@10.4.1: resolution: {integrity: sha512-G85ALUgKaLzuEuHhoW3HVRgPTmia6njQC3qCG6CEvA8/Ja9PDZnRZOuzekMki+HaViEQXINuYsmhp5WR5/4MfA==} engines: {node: '>=14.0.0'} peerDependencies: eslint: '>=7.0.0' + eslint-plugin-mocha@9.0.0: + resolution: {integrity: sha512-d7knAcQj1jPCzZf3caeBIn3BnW6ikcvfz0kSqQpwPYcVGLoJV5sz0l0OJB2LR8I7dvTDbqq1oV6ylhSgzA10zg==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.0.0' + eslint-plugin-n@16.6.2: resolution: {integrity: sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==} engines: {node: '>=16.0.0'} peerDependencies: eslint: '>=7.0.0' + eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + eslint-plugin-prettier@3.4.0: resolution: {integrity: sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==} engines: {node: '>=6.0.0'} @@ -3991,6 +5254,28 @@ packages: eslint-config-prettier: optional: true + eslint-plugin-prettier@4.0.0: + resolution: {integrity: sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react-refresh@0.3.5: + resolution: {integrity: sha512-61qNIsc7fo9Pp/mju0J83kzvLm0Bsayu7OQSLEoJxLDCBjIIyb87bkzufoOvdDxLkSlMfkF7UxomC4+eztUBSA==} + peerDependencies: + eslint: '>=7' + eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -4099,6 +5384,7 @@ packages: ethereumjs-abi@0.6.8: resolution: {integrity: sha512-Tx0r/iXI6r+lRsdvkFDlut0N08jWMnKRZ6Gkq+Nmw75lZe4e6o3EkSnkaBP5NF6+m5PTGAr9JP43N3LyeoglsA==} + deprecated: This library has been deprecated and usage is discouraged. ethereumjs-util@6.2.1: resolution: {integrity: sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw==} @@ -4501,6 +5787,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -4595,6 +5885,9 @@ packages: hmac-drbg@1.0.1: resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -4669,6 +5962,10 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -4691,6 +5988,13 @@ packages: resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} engines: {node: '>= 0.4'} + internmap@1.0.1: + resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} + + internmap@2.0.3: + resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} + engines: {node: '>=12'} + interpret@1.4.0: resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} engines: {node: '>= 0.10'} @@ -4735,6 +6039,9 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} + is-bun-module@1.3.0: + resolution: {integrity: sha512-DgXeu5UWI0IsMQundYb5UAOzm6G2eVnarJ0byP6Tm55iZNKceD59LNPA2L4VvsScTtHcw0yEkVwSf7PC+QoLSA==} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -4924,6 +6231,9 @@ packages: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + js-sha3@0.5.5: resolution: {integrity: sha512-yLLwn44IVeunwjpDVTDZmQeVbB0h+dZpY2eO68B/Zik8hu6dH+rKeLxwua79GGIvW6xr8NBAcrtiUbYrTjEFTA==} @@ -5008,6 +6318,9 @@ packages: just-extend@4.2.1: resolution: {integrity: sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==} + just-extend@6.2.0: + resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} + keccak@3.0.4: resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} engines: {node: '>=10.0.0'} @@ -5015,6 +6328,9 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + khroma@2.1.0: + resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} + kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -5026,10 +6342,17 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} + layout-base@1.0.2: + resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} + lcid@1.0.0: resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} engines: {node: '>=0.10.0'} @@ -5057,6 +6380,9 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + lodash.assign@4.2.0: resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} @@ -5136,6 +6462,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} @@ -5159,6 +6489,12 @@ packages: md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + media-typer@0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -5174,6 +6510,9 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + mermaid@10.8.0: + resolution: {integrity: sha512-9CzfSreRjdDJxX796+jW4zjEq0DVw5xVF0nWsqff8OTbrt+ml0TZ5PyYUjjUZJa2NYxYJZZXewEquxGiM8qZEA==} + methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -5181,6 +6520,69 @@ packages: micro-ftch@0.3.1: resolution: {integrity: sha512-/0LLxhzP0tfiR5hcQebtudP56gUurs2CLkGarnCiB/OqEyUFQ6U3paQi/tgLv0hBJYt2rnr9MNpxz4fiiugstg==} + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -5226,6 +6628,10 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} + minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} @@ -5269,6 +6675,11 @@ packages: engines: {node: '>= 14.0.0'} hasBin: true + mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true + mock-fs@4.14.0: resolution: {integrity: sha512-qYvlv/exQ4+svI3UOvPUpLDF0OMX5euvUH0Ny4N5QyRyhNdgAgUrVH3iUINSzEPLvx0kbo/Bp28GJKIqvE7URw==} @@ -5279,6 +6690,9 @@ packages: ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5310,6 +6724,16 @@ packages: nano-json-stream-parser@0.1.2: resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==} + nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} @@ -5337,6 +6761,9 @@ packages: nise@4.1.0: resolution: {integrity: sha512-eQMEmGN/8arp0xsvGoQ+B1qvSkR73B1nWSCh7nOt5neMCtwcQVYQGdzQMhcNscktTsWB54xnlSQFzOAPJD8nXA==} + nise@5.1.9: + resolution: {integrity: sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==} + no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} @@ -5395,6 +6822,9 @@ packages: resolution: {integrity: sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==} engines: {node: '>=12.19'} + non-layered-tidy-tree-layout@2.0.2: + resolution: {integrity: sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==} + nopt@3.0.6: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true @@ -5449,6 +6879,14 @@ packages: resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} engines: {node: '>= 0.4'} + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + object.values@1.2.0: resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} engines: {node: '>= 0.4'} @@ -5623,6 +7061,9 @@ packages: path-to-regexp@1.9.0: resolution: {integrity: sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@1.1.0: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} engines: {node: '>=0.10.0'} @@ -5683,6 +7124,13 @@ packages: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} engines: {node: '>= 0.4'} + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -5789,6 +7237,9 @@ packages: rambda@7.5.0: resolution: {integrity: sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==} + ramda@0.27.2: + resolution: {integrity: sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==} + randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} @@ -5809,9 +7260,35 @@ packages: peerDependencies: react: ^18.3.1 + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.11.0: + resolution: {integrity: sha512-Q3mK1c/CYoF++J6ZINz7EZzwlgSOZK/kc7lxIA7PhtWhKju4KfF1WHqlx0kVCIFJAWztuYVpXZeljEbds8z4Og==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.11.0: + resolution: {integrity: sha512-hTm6KKNpj9SDG4syIWRjCU219O0RZY8RUPobCFt9p+PlF7nnkRgMoh2DieTKvw3F3Mw6zg565HGnSv8BuoY5oQ==} + engines: {node: '>=14'} + peerDependencies: + react: '>=16.8' + + react-tooltip@5.28.0: + resolution: {integrity: sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==} + peerDependencies: + react: '>=16.14.0' + react-dom: '>=16.14.0' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -5933,6 +7410,9 @@ packages: resolve@1.17.0: resolution: {integrity: sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==} + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -5973,12 +7453,27 @@ packages: resolution: {integrity: sha512-d5gdPmgQ0Z+AklL2NVXr/IoSjNZFfTVvQWzL/AM2AOcSzYP2xjlb0AC8YyCLc41MSNf6P6QVtjgPdmVtzb+4lQ==} hasBin: true + robust-predicates@3.0.2: + resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} + + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rw@1.3.3: + resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + safe-array-concat@1.1.2: resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} engines: {node: '>=0.4'} @@ -6021,6 +7516,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -6033,6 +7533,9 @@ packages: sentence-case@2.1.1: resolution: {integrity: sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==} + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -6074,6 +7577,9 @@ packages: sha3@2.1.4: resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==} + shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -6117,6 +7623,10 @@ packages: chai: ^4.0.0 sinon: '>=4.0.0' + sinon@14.0.2: + resolution: {integrity: sha512-PDpV0ZI3ZCS3pEqx0vpNp6kzPhHrLx72wA0G+ZLaaJjLIYeE0n8INlgaohKuGy7hP0as5tbUd23QWu5U233t+w==} + deprecated: 16.1.1 + sinon@9.2.4: resolution: {integrity: sha512-zljcULZQsJxVra28qIAL6ow1Z9tpattkCTEJR4RBP3TGc00FcttsP5pK284Nas5WjMZU5Yzy3kAIp3B3KRf5Yg==} deprecated: 16.1.1 @@ -6159,6 +7669,10 @@ packages: engines: {node: '>=8.15.1'} hasBin: true + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -6200,6 +7714,9 @@ packages: engines: {node: '>=0.10.0'} hasBin: true + stable-hash@0.0.4: + resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} + stacktrace-parser@0.1.10: resolution: {integrity: sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==} engines: {node: '>=6'} @@ -6212,6 +7729,10 @@ packages: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} engines: {node: '>=0.10.0'} + string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + string-format@2.0.0: resolution: {integrity: sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==} @@ -6289,6 +7810,17 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + styled-components@5.3.10: + resolution: {integrity: sha512-3kSzSBN0TiCnGJM04UwO1HklIQQSXW7rCARUk+VyMR7clz8XVlA3jijtf5ypqoDIdNMKx3la4VvaPFR855SFcg==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + react-is: '>= 16.8.0' + + stylis@4.3.5: + resolution: {integrity: sha512-K7npNOKGRYuhAFFzkzMGfxFDpN6gDwf8hcMiE+uveTVbBgm93HrNP3ZDUpKqzZ4pG7TP6fmb+EMAQPjq9FqqvA==} + supports-color@3.2.3: resolution: {integrity: sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==} engines: {node: '>=0.8.0'} @@ -6309,6 +7841,9 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + svg-pan-zoom@3.6.2: + resolution: {integrity: sha512-JwnvRWfVKw/Xzfe6jriFyfey/lWJLq4bUh2jwoR5ChWQuQoOH8FEh1l/bEp46iHHKHEJWIyFJETbazraxNWECg==} + swap-case@1.1.2: resolution: {integrity: sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==} @@ -6330,6 +7865,10 @@ packages: resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} engines: {node: '>=10.0.0'} + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} @@ -6424,11 +7963,29 @@ packages: resolution: {integrity: sha512-H69ZwTw3rFHb5WYpQya40YAX2/w7Ut75uUECbgBIsLmM+BNuYnxsltfyyLMxy6sEeKxgijLTnQtLd0nKd6+IYw==} hasBin: true + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + ts-essentials@7.0.3: resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} peerDependencies: typescript: '>=3.7.0' + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -6556,6 +8113,11 @@ packages: engines: {node: '>=12.20'} hasBin: true + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + typical@4.0.0: resolution: {integrity: sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==} engines: {node: '>=8'} @@ -6592,6 +8154,9 @@ packages: resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} engines: {node: '>=18.17'} + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -6667,12 +8232,21 @@ packages: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validator@13.12.0: + resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + engines: {node: '>= 0.10'} + varint@5.0.2: resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} @@ -6692,9 +8266,50 @@ packages: typescript: optional: true + vite-plugin-singlefile@2.1.0: + resolution: {integrity: sha512-7tJo+UgZABlKpY/nubth/wxJ4+pUGREPnEwNOknxwl2MM0zTvF14KTU4Ln1lc140gjLLV5mjDrvuoquU7OZqCg==} + engines: {node: '>18.0.0'} + peerDependencies: + rollup: ^4.28.1 + vite: ^5.4.11 || ^6.0.0 + + vite@5.4.11: + resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + web-worker@1.3.0: + resolution: {integrity: sha512-BSR9wyRsy/KOValMgd5kMyr3JzpdeoR9KVId8u5GVlTTAtNChlsE4yTxeY7zMdNSyOmoKBv8NH2qeRY9Tg+IaA==} + web3-bzz@1.10.0: resolution: {integrity: sha512-o9IR59io3pDUsXTsps5pO5hW1D5zBmg46iNc2t4j2DkaYHNdDLwk2IP9ukoM2wg47QILfPEJYzhTfkS/CcX0KA==} engines: {node: '>=8.0.0'} @@ -7011,6 +8626,9 @@ packages: resolution: {integrity: sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==} engines: {node: '>=8.0.0'} + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + workerpool@6.5.1: resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} @@ -7135,6 +8753,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} @@ -7142,6 +8763,10 @@ packages: yargs-parser@2.4.1: resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} @@ -7169,6 +8794,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + zod@3.23.8: resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} @@ -7188,6 +8818,12 @@ snapshots: '@babel/highlight': 7.25.9 picocolors: 1.1.1 + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + '@babel/compat-data@7.25.9': {} '@babel/core@7.25.9': @@ -7200,10 +8836,30 @@ snapshots: '@babel/helpers': 7.25.9 '@babel/parser': 7.25.9 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) '@babel/types': 7.25.9 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/types': 7.26.5 + convert-source-map: 2.0.0 + debug: 4.3.7(supports-color@5.5.0) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7217,6 +8873,18 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-annotate-as-pure@7.25.9': + dependencies: + '@babel/types': 7.25.9 + '@babel/helper-compilation-targets@7.25.9': dependencies: '@babel/compat-data': 7.25.9 @@ -7225,9 +8893,9 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-module-imports@7.25.9': + '@babel/helper-module-imports@7.25.9(supports-color@5.5.0)': dependencies: - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) '@babel/types': 7.25.9 transitivePeerDependencies: - supports-color @@ -7235,16 +8903,27 @@ snapshots: '@babel/helper-module-transforms@7.25.9(@babel/core@7.25.9)': dependencies: '@babel/core': 7.25.9 - '@babel/helper-module-imports': 7.25.9 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) '@babel/helper-simple-access': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) transitivePeerDependencies: - supports-color + '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-simple-access@7.25.9': dependencies: - '@babel/traverse': 7.25.9 + '@babel/traverse': 7.25.9(supports-color@5.5.0) '@babel/types': 7.25.9 transitivePeerDependencies: - supports-color @@ -7260,6 +8939,11 @@ snapshots: '@babel/template': 7.25.9 '@babel/types': 7.25.9 + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + '@babel/highlight@7.25.9': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -7271,6 +8955,25 @@ snapshots: dependencies: '@babel/types': 7.25.9 + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/runtime@7.25.9': dependencies: regenerator-runtime: 0.14.1 @@ -7281,14 +8984,14 @@ snapshots: '@babel/parser': 7.25.9 '@babel/types': 7.25.9 - '@babel/traverse@7.25.9': + '@babel/traverse@7.25.9(supports-color@5.5.0)': dependencies: '@babel/code-frame': 7.25.9 '@babel/generator': 7.25.9 '@babel/parser': 7.25.9 '@babel/template': 7.25.9 '@babel/types': 7.25.9 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7298,6 +9001,13 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@babel/types@7.26.5': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@braintree/sanitize-url@6.0.4': {} + '@changesets/apply-release-plan@7.0.5': dependencies: '@changesets/config': 3.0.3 @@ -7444,6 +9154,16 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@emotion/is-prop-valid@1.3.1': + dependencies: + '@emotion/memoize': 0.9.0 + + '@emotion/memoize@0.9.0': {} + + '@emotion/stylis@0.8.5': {} + + '@emotion/unitless@0.7.5': {} + '@ensdomains/address-encoder@0.1.9': dependencies: bech32: 1.1.4 @@ -7478,6 +9198,75 @@ snapshots: '@ensdomains/resolver@0.2.4': {} + '@esbuild/aix-ppc64@0.21.5': + optional: true + + '@esbuild/android-arm64@0.21.5': + optional: true + + '@esbuild/android-arm@0.21.5': + optional: true + + '@esbuild/android-x64@0.21.5': + optional: true + + '@esbuild/darwin-arm64@0.21.5': + optional: true + + '@esbuild/darwin-x64@0.21.5': + optional: true + + '@esbuild/freebsd-arm64@0.21.5': + optional: true + + '@esbuild/freebsd-x64@0.21.5': + optional: true + + '@esbuild/linux-arm64@0.21.5': + optional: true + + '@esbuild/linux-arm@0.21.5': + optional: true + + '@esbuild/linux-ia32@0.21.5': + optional: true + + '@esbuild/linux-loong64@0.21.5': + optional: true + + '@esbuild/linux-mips64el@0.21.5': + optional: true + + '@esbuild/linux-ppc64@0.21.5': + optional: true + + '@esbuild/linux-riscv64@0.21.5': + optional: true + + '@esbuild/linux-s390x@0.21.5': + optional: true + + '@esbuild/linux-x64@0.21.5': + optional: true + + '@esbuild/netbsd-x64@0.21.5': + optional: true + + '@esbuild/openbsd-x64@0.21.5': + optional: true + + '@esbuild/sunos-x64@0.21.5': + optional: true + + '@esbuild/win32-arm64@0.21.5': + optional: true + + '@esbuild/win32-ia32@0.21.5': + optional: true + + '@esbuild/win32-x64@0.21.5': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -7488,7 +9277,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -7796,9 +9585,22 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@floating-ui/core@1.6.9': + dependencies: + '@floating-ui/utils': 0.2.9 + + '@floating-ui/dom@1.6.13': + dependencies: + '@floating-ui/core': 1.6.9 + '@floating-ui/utils': 0.2.9 + + '@floating-ui/utils@0.2.9': {} + + '@fontsource/roboto@5.1.1': {} + '@fvictorio/tabtab@0.0.3': dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) enquirer: 2.4.1 minimist: 1.2.8 mkdirp: 1.0.4 @@ -7809,7 +9611,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -7826,6 +9628,11 @@ snapshots: js-yaml: 3.14.1 resolve-from: 5.0.0 + '@istanbuljs/nyc-config-typescript@1.0.2(nyc@15.1.0)': + dependencies: + '@istanbuljs/schema': 0.1.3 + nyc: 15.1.0 + '@istanbuljs/schema@0.1.3': {} '@jest/schemas@29.6.3': @@ -7997,6 +9804,40 @@ snapshots: tweetnacl: 1.0.3 tweetnacl-util: 0.15.1 + '@microsoft/api-extractor-model@7.28.9(@types/node@18.19.59)': + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.59) + transitivePeerDependencies: + - '@types/node' + + '@microsoft/api-extractor@7.40.1(@types/node@18.19.59)': + dependencies: + '@microsoft/api-extractor-model': 7.28.9(@types/node@18.19.59) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.66.0(@types/node@18.19.59) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.8 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.3.3 + transitivePeerDependencies: + - '@types/node' + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + '@noble/curves@1.2.0': dependencies: '@noble/hashes': 1.3.2 @@ -8031,6 +9872,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@nolyfill/is-core-module@1.0.39': {} + '@nomicfoundation/edr-darwin-arm64@0.6.5': {} '@nomicfoundation/edr-darwin-x64@0.6.5': {} @@ -8097,29 +9940,29 @@ snapshots: '@nomicfoundation/ethereumjs-rlp': 5.0.4 ethereum-cryptography: 0.1.3 - '@nomicfoundation/hardhat-ignition-ethers@0.15.7(@nomicfoundation/hardhat-ethers@packages+hardhat-ethers)(@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)': + '@nomicfoundation/hardhat-ignition-ethers@0.15.7(@nomicfoundation/hardhat-ethers@packages+hardhat-ethers)(@nomicfoundation/hardhat-ignition@0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/ignition-core@0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10))(ethers@6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)': dependencies: '@nomicfoundation/hardhat-ethers': link:packages/hardhat-ethers - '@nomicfoundation/hardhat-ignition': 0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-core': 0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition': 0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: link:packages/hardhat-core - '@nomicfoundation/hardhat-ignition-viem@0.15.7(@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8))': + '@nomicfoundation/hardhat-ignition-viem@0.15.7(@nomicfoundation/hardhat-ignition@0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10))(@nomicfoundation/hardhat-viem@packages+hardhat-viem)(@nomicfoundation/ignition-core@0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10))(hardhat@packages+hardhat-core)(viem@2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8))': dependencies: - '@nomicfoundation/hardhat-ignition': 0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10) + '@nomicfoundation/hardhat-ignition': 0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10) '@nomicfoundation/hardhat-viem': link:packages/hardhat-viem - '@nomicfoundation/ignition-core': 0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-core': 0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) hardhat: link:packages/hardhat-core viem: 2.21.34(bufferutil@4.0.8)(typescript@5.0.4)(utf-8-validate@5.0.10)(zod@3.23.8) - '@nomicfoundation/hardhat-ignition@0.15.7(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10)': + '@nomicfoundation/hardhat-ignition@0.15.9(@nomicfoundation/hardhat-verify@packages+hardhat-verify)(bufferutil@4.0.8)(hardhat@packages+hardhat-core)(utf-8-validate@5.0.10)': dependencies: '@nomicfoundation/hardhat-verify': link:packages/hardhat-verify - '@nomicfoundation/ignition-core': 0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@nomicfoundation/ignition-ui': 0.15.7 + '@nomicfoundation/ignition-core': 0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@nomicfoundation/ignition-ui': 0.15.9 chalk: 4.1.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 10.1.0 hardhat: link:packages/hardhat-core json5: 2.2.3 @@ -8129,12 +9972,12 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/ignition-core@0.15.7(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@nomicfoundation/ignition-core@0.15.9(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@ethersproject/address': 5.6.1 '@nomicfoundation/solidity-analyzer': 0.1.2 cbor: 9.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) ethers: 6.13.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) fs-extra: 10.1.0 immer: 10.0.2 @@ -8145,7 +9988,7 @@ snapshots: - supports-color - utf-8-validate - '@nomicfoundation/ignition-ui@0.15.7': {} + '@nomicfoundation/ignition-ui@0.15.9': {} '@nomicfoundation/solidity-analyzer-darwin-arm64@0.1.2': optional: true @@ -8240,6 +10083,89 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 + '@remix-run/router@1.6.0': {} + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true + + '@rollup/rollup-android-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-arm64@4.30.1': + optional: true + + '@rollup/rollup-darwin-x64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-arm64@4.30.1': + optional: true + + '@rollup/rollup-freebsd-x64@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.30.1': + optional: true + + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.30.1': + optional: true + + '@rollup/rollup-linux-x64-musl@4.30.1': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.30.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.30.1': + optional: true + + '@rushstack/node-core-library@3.66.0(@types/node@18.19.59)': + dependencies: + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + z-schema: 5.0.5 + optionalDependencies: + '@types/node': 18.19.59 + + '@rushstack/rig-package@0.5.1': + dependencies: + resolve: 1.22.8 + strip-json-comments: 3.1.1 + + '@rushstack/ts-command-line@4.17.1': + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + '@scure/base@1.1.9': {} '@scure/bip32@1.1.5': @@ -8334,16 +10260,38 @@ snapshots: dependencies: type-detect: 4.0.8 + '@sinonjs/commons@2.0.0': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@11.3.1': + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers@6.0.1': dependencies: '@sinonjs/commons': 1.8.6 + '@sinonjs/fake-timers@9.1.2': + dependencies: + '@sinonjs/commons': 1.8.6 + '@sinonjs/samsam@5.3.1': dependencies: '@sinonjs/commons': 1.8.6 lodash.get: 4.4.2 type-detect: 4.1.0 + '@sinonjs/samsam@7.0.1': + dependencies: + '@sinonjs/commons': 2.0.0 + lodash.get: 4.4.2 + type-detect: 4.1.0 + '@sinonjs/text-encoding@0.7.3': {} '@solidity-parser/parser@0.14.5': @@ -8375,7 +10323,7 @@ snapshots: big.js: 6.2.2 bn.js: 5.2.1 cbor: 5.2.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) lodash: 4.17.21 semver: 7.6.3 utf8: 3.0.0 @@ -8391,7 +10339,7 @@ snapshots: '@truffle/contract-schema@3.4.16': dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8401,7 +10349,7 @@ snapshots: '@trufflesuite/chromafi': 3.0.0 bn.js: 5.2.1 chalk: 2.4.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) highlightjs-solidity: 2.0.6 transitivePeerDependencies: - supports-color @@ -8456,10 +10404,33 @@ snapshots: hardhat: link:packages/hardhat-core typechain: 8.3.2(typescript@5.0.4) + '@types/argparse@1.0.38': {} + '@types/async-eventemitter@0.2.4': dependencies: '@types/events': 3.0.3 + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.25.9 + '@babel/types': 7.25.9 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.25.9 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.25.9 + '@babel/types': 7.25.9 + + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.25.9 + '@types/bn.js@4.11.6': dependencies: '@types/node': 18.19.59 @@ -8487,10 +10458,20 @@ snapshots: dependencies: '@types/node': 18.19.59 + '@types/d3-scale-chromatic@3.1.0': {} + + '@types/d3-scale@4.0.8': + dependencies: + '@types/d3-time': 3.0.4 + + '@types/d3-time@3.0.4': {} + '@types/debug@4.1.12': dependencies: '@types/ms': 0.7.34 + '@types/estree@1.0.6': {} + '@types/events@3.0.3': {} '@types/form-data@0.0.33': @@ -8501,11 +10482,20 @@ snapshots: dependencies: '@types/node': 18.19.59 + '@types/fs-extra@9.0.13': + dependencies: + '@types/node': 18.19.59 + '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 '@types/node': 18.19.59 + '@types/hoist-non-react-statics@3.3.6': + dependencies: + '@types/react': 18.3.18 + hoist-non-react-statics: 3.3.2 + '@types/http-cache-semantics@4.0.4': {} '@types/json-schema@7.0.15': {} @@ -8536,12 +10526,23 @@ snapshots: '@types/lru-cache@5.1.1': {} + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.11 + '@types/minimatch@5.1.2': {} '@types/mocha@10.0.9': {} + '@types/mocha@9.1.1': {} + '@types/ms@0.7.34': {} + '@types/ndjson@2.0.1': + dependencies: + '@types/node': 18.19.59 + '@types/through': 0.0.33 + '@types/node@10.17.60': {} '@types/node@12.20.55': {} @@ -8562,8 +10563,24 @@ snapshots: '@types/prettier@2.7.3': {} + '@types/prompts@2.4.9': + dependencies: + '@types/node': 18.19.59 + kleur: 3.0.3 + + '@types/prop-types@15.7.14': {} + '@types/qs@6.9.16': {} + '@types/react-dom@18.3.5(@types/react@18.3.18)': + dependencies: + '@types/react': 18.3.18 + + '@types/react@18.3.18': + dependencies: + '@types/prop-types': 15.7.14 + csstype: 3.1.3 + '@types/readable-stream@2.3.15': dependencies: '@types/node': 18.19.59 @@ -8588,12 +10605,31 @@ snapshots: '@types/chai': 4.3.20 '@types/sinon': 9.0.11 + '@types/sinon@10.0.20': + dependencies: + '@types/sinonjs__fake-timers': 8.1.5 + '@types/sinon@9.0.11': dependencies: '@types/sinonjs__fake-timers': 8.1.5 '@types/sinonjs__fake-timers@8.1.5': {} + '@types/styled-components@5.1.26': + dependencies: + '@types/hoist-non-react-statics': 3.3.6 + '@types/react': 18.3.18 + csstype: 3.1.3 + + '@types/through@0.0.33': + dependencies: + '@types/node': 18.19.59 + + '@types/trusted-types@2.0.7': + optional: true + + '@types/unist@2.0.11': {} + '@types/uuid@8.3.4': {} '@types/w3c-web-usb@1.0.10': {} @@ -8613,7 +10649,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.61.0 '@typescript-eslint/type-utils': 5.61.0(eslint@8.57.1)(typescript@5.0.4) '@typescript-eslint/utils': 5.61.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -8625,12 +10661,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/experimental-utils@5.62.0(eslint@8.57.1)(typescript@5.0.4)': + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4)': dependencies: '@typescript-eslint/scope-manager': 5.61.0 '@typescript-eslint/types': 5.61.0 '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) eslint: 8.57.1 optionalDependencies: typescript: 5.0.4 @@ -8651,7 +10695,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 5.61.0(typescript@5.0.4) '@typescript-eslint/utils': 5.61.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.0.4) optionalDependencies: @@ -8667,7 +10711,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.61.0 '@typescript-eslint/visitor-keys': 5.61.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -8681,7 +10725,7 @@ snapshots: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -8691,6 +10735,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.7(supports-color@5.5.0) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + tsutils: 3.21.0(typescript@5.3.3) + optionalDependencies: + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@5.61.0(eslint@8.57.1)(typescript@5.0.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -8721,6 +10779,21 @@ snapshots: - supports-color - typescript + '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@5.3.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + eslint: 8.57.1 + eslint-scope: 5.1.1 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + '@typescript-eslint/visitor-keys@5.61.0': dependencies: '@typescript-eslint/types': 5.61.0 @@ -8731,8 +10804,21 @@ snapshots: '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 + '@ungap/promise-all-settled@1.1.2': {} + '@ungap/structured-clone@1.2.0': {} + '@vitejs/plugin-react@4.3.4(vite@5.4.11(@types/node@22.7.5))': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.4.11(@types/node@22.7.5) + transitivePeerDependencies: + - supports-color + abbrev@1.0.9: {} abitype@0.7.1(typescript@5.0.4)(zod@3.23.8): @@ -8778,7 +10864,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -8815,6 +10901,8 @@ snapshots: dependencies: string-width: 4.2.3 + ansi-colors@4.1.1: {} + ansi-colors@4.1.3: {} ansi-escapes@4.3.2: @@ -8890,6 +10978,15 @@ snapshots: array-uniq@1.0.3: {} + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + array.prototype.flat@1.3.2: dependencies: call-bind: 1.0.7 @@ -8959,6 +11056,18 @@ snapshots: transitivePeerDependencies: - debug + babel-plugin-styled-components@2.1.4(@babel/core@7.26.0)(styled-components@5.3.10(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0): + dependencies: + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + lodash: 4.17.21 + picomatch: 2.3.1 + styled-components: 5.3.10(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + balanced-match@1.0.2: {} base-x@3.0.10: @@ -9173,6 +11282,8 @@ snapshots: camelcase@6.3.0: {} + camelize@1.0.1: {} + caniuse-lite@1.0.30001669: {} caseless@0.12.0: {} @@ -9190,6 +11301,11 @@ snapshots: dependencies: nofilter: 3.1.0 + chai-as-promised@7.1.1(chai@4.5.0): + dependencies: + chai: 4.5.0 + check-error: 1.0.3 + chai-as-promised@7.1.2(chai@4.5.0): dependencies: chai: 4.5.0 @@ -9243,6 +11359,8 @@ snapshots: upper-case: 1.1.3 upper-case-first: 1.1.2 + character-entities@2.0.2: {} + chardet@0.7.0: {} charenc@0.0.2: {} @@ -9274,6 +11392,18 @@ snapshots: undici: 6.20.1 whatwg-mimetype: 4.0.0 + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -9311,6 +11441,8 @@ snapshots: class-is@1.1.0: {} + classnames@2.5.1: {} + clean-stack@2.2.0: {} cli-boxes@2.2.1: {} @@ -9368,6 +11500,8 @@ snapshots: color-name@1.1.4: {} + colors@1.2.5: {} + colors@1.4.0: {} combined-stream@1.0.8: @@ -9396,8 +11530,13 @@ snapshots: commander@6.2.1: {} + commander@7.2.0: {} + commander@8.3.0: {} + commander@9.5.0: + optional: true + commondir@1.0.1: {} concat-map@0.0.1: {} @@ -9452,6 +11591,10 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cose-base@1.0.3: + dependencies: + layout-base: 1.0.2 + cosmiconfig@8.3.6(typescript@5.0.4): dependencies: import-fresh: 3.3.0 @@ -9461,6 +11604,15 @@ snapshots: optionalDependencies: typescript: 5.0.4 + cosmiconfig@8.3.6(typescript@5.3.3): + dependencies: + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + path-type: 4.0.0 + optionalDependencies: + typescript: 5.3.3 + crc-32@1.2.2: {} create-hash@1.2.0: @@ -9522,6 +11674,8 @@ snapshots: crypto-js@4.2.0: {} + css-color-keywords@1.0.0: {} + css-select@5.1.0: dependencies: boolbase: 1.0.0 @@ -9530,13 +11684,200 @@ snapshots: domutils: 3.1.0 nth-check: 2.1.1 + css-to-react-native@3.2.0: + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + css-what@6.1.0: {} + csstype@3.1.3: {} + + cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): + dependencies: + cose-base: 1.0.3 + cytoscape: 3.31.0 + + cytoscape@3.31.0: {} + + d3-array@2.12.1: + dependencies: + internmap: 1.0.1 + + d3-array@3.2.4: + dependencies: + internmap: 2.0.3 + + d3-axis@3.0.0: {} + + d3-brush@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3-chord@3.0.1: + dependencies: + d3-path: 3.1.0 + + d3-color@3.1.0: {} + + d3-contour@4.0.2: + dependencies: + d3-array: 3.2.4 + + d3-delaunay@6.0.4: + dependencies: + delaunator: 5.0.1 + + d3-dispatch@3.0.1: {} + + d3-drag@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-selection: 3.0.0 + + d3-dsv@3.0.1: + dependencies: + commander: 7.2.0 + iconv-lite: 0.6.3 + rw: 1.3.3 + + d3-ease@3.0.1: {} + + d3-fetch@3.0.1: + dependencies: + d3-dsv: 3.0.1 + + d3-force@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-quadtree: 3.0.1 + d3-timer: 3.0.1 + + d3-format@3.1.0: {} + + d3-geo@3.1.1: + dependencies: + d3-array: 3.2.4 + + d3-hierarchy@3.1.2: {} + + d3-interpolate@3.0.1: + dependencies: + d3-color: 3.1.0 + + d3-path@1.0.9: {} + + d3-path@3.1.0: {} + + d3-polygon@3.0.1: {} + + d3-quadtree@3.0.1: {} + + d3-random@3.0.1: {} + + d3-sankey@0.12.3: + dependencies: + d3-array: 2.12.1 + d3-shape: 1.3.7 + + d3-scale-chromatic@3.1.0: + dependencies: + d3-color: 3.1.0 + d3-interpolate: 3.0.1 + + d3-scale@4.0.2: + dependencies: + d3-array: 3.2.4 + d3-format: 3.1.0 + d3-interpolate: 3.0.1 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + + d3-selection@3.0.0: {} + + d3-shape@1.3.7: + dependencies: + d3-path: 1.0.9 + + d3-shape@3.2.0: + dependencies: + d3-path: 3.1.0 + + d3-time-format@4.1.0: + dependencies: + d3-time: 3.1.0 + + d3-time@3.1.0: + dependencies: + d3-array: 3.2.4 + + d3-timer@3.0.1: {} + + d3-transition@3.0.1(d3-selection@3.0.0): + dependencies: + d3-color: 3.1.0 + d3-dispatch: 3.0.1 + d3-ease: 3.0.1 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-timer: 3.0.1 + + d3-zoom@3.0.0: + dependencies: + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-transition: 3.0.1(d3-selection@3.0.0) + + d3@7.9.0: + dependencies: + d3-array: 3.2.4 + d3-axis: 3.0.0 + d3-brush: 3.0.0 + d3-chord: 3.0.1 + d3-color: 3.1.0 + d3-contour: 4.0.2 + d3-delaunay: 6.0.4 + d3-dispatch: 3.0.1 + d3-drag: 3.0.0 + d3-dsv: 3.0.1 + d3-ease: 3.0.1 + d3-fetch: 3.0.1 + d3-force: 3.0.0 + d3-format: 3.1.0 + d3-geo: 3.1.1 + d3-hierarchy: 3.1.2 + d3-interpolate: 3.0.1 + d3-path: 3.1.0 + d3-polygon: 3.0.1 + d3-quadtree: 3.0.1 + d3-random: 3.0.1 + d3-scale: 4.0.2 + d3-scale-chromatic: 3.1.0 + d3-selection: 3.0.0 + d3-shape: 3.2.0 + d3-time: 3.1.0 + d3-time-format: 4.1.0 + d3-timer: 3.0.1 + d3-transition: 3.0.1(d3-selection@3.0.0) + d3-zoom: 3.0.0 + d@1.0.2: dependencies: es5-ext: 0.10.64 type: 2.7.3 + dagre-d3-es@7.0.10: + dependencies: + d3: 7.9.0 + lodash-es: 4.17.21 + dashdash@1.14.1: dependencies: assert-plus: 1.0.0 @@ -9561,6 +11902,8 @@ snapshots: date-time@0.1.1: {} + dayjs@1.11.13: {} + death@1.1.0: {} debug@2.6.9: @@ -9571,6 +11914,18 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.3.3(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.7(supports-color@5.5.0): + dependencies: + ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 + debug@4.3.7(supports-color@8.1.1): dependencies: ms: 2.1.3 @@ -9583,6 +11938,10 @@ snapshots: decimal.js-light@2.5.1: {} + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + decode-uri-component@0.2.2: {} decompress-response@3.3.0: @@ -9625,10 +11984,16 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + delaunator@5.0.1: + dependencies: + robust-predicates: 3.0.2 + delayed-stream@1.0.0: {} depd@2.0.0: {} + dequal@2.0.3: {} + destroy@1.2.0: {} detect-indent@5.0.0: {} @@ -9642,7 +12007,7 @@ snapshots: detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -9650,6 +12015,8 @@ snapshots: diff@4.0.2: {} + diff@5.0.0: {} + diff@5.2.0: {} difflib@0.2.4: @@ -9682,6 +12049,10 @@ snapshots: dependencies: domelementtype: 2.3.0 + dompurify@3.2.3: + optionalDependencies: + '@types/trusted-types': 2.0.7 + domutils@3.1.0: dependencies: dom-serializer: 2.0.0 @@ -9709,6 +12080,8 @@ snapshots: electron-to-chromium@1.5.45: {} + elkjs@0.9.3: {} + elliptic@6.5.4: dependencies: bn.js: 4.12.0 @@ -9744,6 +12117,11 @@ snapshots: dependencies: once: 1.4.0 + enhanced-resolve@5.18.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 @@ -9854,6 +12232,32 @@ snapshots: d: 1.0.2 ext: 1.7.0 + esbuild@0.21.5: + 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 + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -9880,13 +12284,13 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-doc-generator@1.7.1(eslint@8.57.1)(typescript@5.0.4): + eslint-doc-generator@1.7.1(eslint@8.57.1)(typescript@5.3.3): dependencies: - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.3.3) ajv: 8.17.1 boolean: 3.2.0 commander: 10.0.1 - cosmiconfig: 8.3.6(typescript@5.0.4) + cosmiconfig: 8.3.6(typescript@5.3.3) deepmerge: 4.3.1 dot-prop: 7.2.0 eslint: 8.57.1 @@ -9907,13 +12311,30 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@5.5.0) + enhanced-resolve: 5.18.0 + eslint: 8.57.1 + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.3.0 + is-glob: 4.0.3 + stable-hash: 0.0.4 + optionalDependencies: + eslint-plugin-import: 2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.0.4) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.29.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -9930,22 +12351,49 @@ snapshots: eslint-utils: 3.0.0(eslint@8.57.1) estraverse: 5.3.0 - eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1): + eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint@8.57.1): + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + has: 1.0.4 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.2.0 + resolve: 1.22.8 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 5.61.0(eslint@8.57.1)(typescript@5.0.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - has: 1.0.4 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.61.0(eslint@8.57.1)(typescript@5.0.4))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 object.values: 1.2.0 - resolve: 1.22.8 semver: 6.3.1 tsconfig-paths: 3.15.0 optionalDependencies: @@ -9962,6 +12410,12 @@ snapshots: globals: 13.24.0 rambda: 7.5.0 + eslint-plugin-mocha@9.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-utils: 3.0.0(eslint@8.57.1) + ramda: 0.27.2 + eslint-plugin-n@16.6.2(eslint@8.57.1): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) @@ -9977,6 +12431,8 @@ snapshots: resolve: 1.22.8 semver: 7.6.3 + eslint-plugin-no-only-tests@3.1.0: {} + eslint-plugin-prettier@3.4.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.4.1): dependencies: eslint: 8.57.1 @@ -9993,6 +12449,22 @@ snapshots: optionalDependencies: eslint-config-prettier: 8.3.0(eslint@8.57.1) + eslint-plugin-prettier@4.0.0(eslint-config-prettier@8.3.0(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8): + dependencies: + eslint: 8.57.1 + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.3.0(eslint@8.57.1) + + eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react-refresh@0.3.5(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 @@ -10025,7 +12497,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -10447,7 +12919,7 @@ snapshots: follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) for-each@0.3.3: dependencies: @@ -10747,6 +13219,8 @@ snapshots: graphemer@1.4.0: {} + growl@1.10.5: {} + handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -10843,6 +13317,10 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + hosted-git-info@2.8.9: {} html-escaper@2.0.2: {} @@ -10896,7 +13374,7 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -10927,6 +13405,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@4.0.0: {} + imurmurhash@0.1.4: {} indent-string@4.0.0: {} @@ -10946,6 +13426,10 @@ snapshots: hasown: 2.0.2 side-channel: 1.0.6 + internmap@1.0.1: {} + + internmap@2.0.3: {} + interpret@1.4.0: {} invariant@2.2.4: @@ -10989,6 +13473,10 @@ snapshots: dependencies: builtin-modules: 3.3.0 + is-bun-module@1.3.0: + dependencies: + semver: 7.6.3 + is-callable@1.2.7: {} is-core-module@2.15.1: @@ -11145,7 +13633,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -11165,6 +13653,8 @@ snapshots: jest-get-type@29.6.3: {} + jju@1.4.0: {} + js-sha3@0.5.5: {} js-sha3@0.5.7: {} @@ -11235,6 +13725,8 @@ snapshots: just-extend@4.2.1: {} + just-extend@6.2.0: {} + keccak@3.0.4: dependencies: node-addon-api: 2.0.2 @@ -11245,6 +13737,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + khroma@2.1.0: {} + kind-of@6.0.3: {} klaw@1.3.1: @@ -11253,10 +13747,14 @@ snapshots: kleur@3.0.3: {} + kleur@4.1.5: {} + latest-version@7.0.0: dependencies: package-json: 8.1.1 + layout-base@1.0.2: {} + lcid@1.0.0: dependencies: invert-kv: 1.0.0 @@ -11289,6 +13787,8 @@ snapshots: dependencies: p-locate: 5.0.0 + lodash-es@4.17.21: {} + lodash.assign@4.2.0: {} lodash.camelcase@4.3.0: {} @@ -11355,6 +13855,10 @@ snapshots: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru_map@0.3.3: {} make-dir@3.1.0: @@ -11377,6 +13881,27 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.11 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + media-typer@0.3.0: {} memorystream@0.3.1: {} @@ -11385,10 +13910,167 @@ snapshots: merge2@1.4.1: {} + mermaid@10.8.0: + dependencies: + '@braintree/sanitize-url': 6.0.4 + '@types/d3-scale': 4.0.8 + '@types/d3-scale-chromatic': 3.1.0 + cytoscape: 3.31.0 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.0) + d3: 7.9.0 + d3-sankey: 0.12.3 + dagre-d3-es: 7.0.10 + dayjs: 1.11.13 + dompurify: 3.2.3 + elkjs: 0.9.3 + khroma: 2.1.0 + lodash-es: 4.17.21 + mdast-util-from-markdown: 1.3.1 + non-layered-tidy-tree-layout: 2.0.2 + stylis: 4.3.5 + ts-dedent: 2.2.0 + uuid: 9.0.1 + web-worker: 1.3.0 + transitivePeerDependencies: + - supports-color + methods@1.1.2: {} micro-ftch@0.3.1: {} + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-symbol@1.1.0: {} + + micromark-util-types@1.1.0: {} + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.7(supports-color@5.5.0) + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -11422,6 +14104,10 @@ snapshots: dependencies: brace-expansion: 1.1.11 + minimatch@4.2.1: + dependencies: + brace-expansion: 1.1.11 + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 @@ -11478,12 +14164,41 @@ snapshots: yargs-parser: 20.2.9 yargs-unparser: 2.0.0 + mocha@9.2.2: + dependencies: + '@ungap/promise-all-settled': 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.3(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 4.2.1 + ms: 2.1.3 + nanoid: 3.3.1 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + workerpool: 6.2.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + mock-fs@4.14.0: {} mri@1.2.0: {} ms@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} multibase@0.6.1: @@ -11521,6 +14236,10 @@ snapshots: nano-json-stream-parser@0.1.2: {} + nanoid@3.3.1: {} + + nanoid@3.3.8: {} + napi-build-utils@1.0.2: {} natural-compare-lite@1.4.0: {} @@ -11549,6 +14268,14 @@ snapshots: just-extend: 4.2.1 path-to-regexp: 1.9.0 + nise@5.1.9: + dependencies: + '@sinonjs/commons': 3.0.1 + '@sinonjs/fake-timers': 11.3.1 + '@sinonjs/text-encoding': 0.7.3 + just-extend: 6.2.0 + path-to-regexp: 6.3.0 + no-case@2.3.2: dependencies: lower-case: 1.1.4 @@ -11596,6 +14323,8 @@ snapshots: nofilter@3.1.0: {} + non-layered-tidy-tree-layout@2.0.2: {} + nopt@3.0.6: dependencies: abbrev: 1.0.9 @@ -11671,6 +14400,19 @@ snapshots: has-symbols: 1.0.3 object-keys: 1.1.1 + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + object.values@1.2.0: dependencies: call-bind: 1.0.7 @@ -11856,6 +14598,8 @@ snapshots: dependencies: isarray: 0.0.1 + path-to-regexp@6.3.0: {} + path-type@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -11902,6 +14646,14 @@ snapshots: possible-typed-array-names@1.0.0: {} + postcss-value-parser@4.2.0: {} + + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prebuild-install@7.1.2: dependencies: detect-libc: 2.0.3 @@ -11998,6 +14750,8 @@ snapshots: rambda@7.5.0: {} + ramda@0.27.2: {} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 @@ -12024,8 +14778,31 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 + react-is@16.13.1: {} + react-is@18.3.1: {} + react-refresh@0.14.2: {} + + react-router-dom@6.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.6.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.11.0(react@18.3.1) + + react-router@6.11.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.6.0 + react: 18.3.1 + + react-tooltip@5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@floating-ui/dom': 1.6.13 + classnames: 2.5.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -12160,6 +14937,11 @@ snapshots: dependencies: path-parse: 1.0.7 + resolve@1.19.0: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -12200,14 +14982,47 @@ snapshots: dependencies: bn.js: 5.2.1 + robust-predicates@3.0.2: {} + + rollup@4.30.1: + dependencies: + '@types/estree': 1.0.6 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 + fsevents: 2.3.3 + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 + rw@1.3.3: {} + rxjs@7.8.1: dependencies: tslib: 2.8.0 + sade@1.8.1: + dependencies: + mri: 1.2.0 + safe-array-concat@1.1.2: dependencies: call-bind: 1.0.7 @@ -12262,6 +15077,10 @@ snapshots: semver@6.3.1: {} + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + semver@7.6.3: {} send@0.19.0: @@ -12287,6 +15106,10 @@ snapshots: no-case: 2.3.2 upper-case-first: 1.1.2 + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -12348,6 +15171,8 @@ snapshots: dependencies: buffer: 6.0.3 + shallowequal@1.1.0: {} + shebang-command@1.2.0: dependencies: shebang-regex: 1.0.0 @@ -12394,6 +15219,15 @@ snapshots: chai: 4.5.0 sinon: 9.2.4 + sinon@14.0.2: + dependencies: + '@sinonjs/commons': 2.0.0 + '@sinonjs/fake-timers': 9.1.2 + '@sinonjs/samsam': 7.0.1 + diff: 5.2.0 + nise: 5.1.9 + supports-color: 7.2.0 + sinon@9.2.4: dependencies: '@sinonjs/commons': 1.8.6 @@ -12499,6 +15333,8 @@ snapshots: transitivePeerDependencies: - debug + source-map-js@1.2.1: {} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -12557,6 +15393,8 @@ snapshots: safer-buffer: 2.1.2 tweetnacl: 0.14.5 + stable-hash@0.0.4: {} + stacktrace-parser@0.1.10: dependencies: type-fest: 0.7.1 @@ -12565,6 +15403,8 @@ snapshots: strict-uri-encode@1.1.0: {} + string-argv@0.3.2: {} + string-format@2.0.0: {} string-width@1.0.2: @@ -12643,6 +15483,26 @@ snapshots: strip-json-comments@3.1.1: {} + styled-components@5.3.10(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1): + dependencies: + '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@emotion/is-prop-valid': 1.3.1 + '@emotion/stylis': 0.8.5 + '@emotion/unitless': 0.7.5 + babel-plugin-styled-components: 2.1.4(@babel/core@7.26.0)(styled-components@5.3.10(@babel/core@7.26.0)(react-dom@18.3.1(react@18.3.1))(react-is@18.3.1)(react@18.3.1))(supports-color@5.5.0) + css-to-react-native: 3.2.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 18.3.1 + shallowequal: 1.1.0 + supports-color: 5.5.0 + transitivePeerDependencies: + - '@babel/core' + + stylis@4.3.5: {} + supports-color@3.2.3: dependencies: has-flag: 1.0.0 @@ -12661,6 +15521,8 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + svg-pan-zoom@3.6.2: {} + swap-case@1.1.2: dependencies: lower-case: 1.1.4 @@ -12709,6 +15571,8 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tapable@2.2.1: {} + tar-fs@2.1.1: dependencies: chownr: 1.1.4 @@ -12837,10 +15701,48 @@ snapshots: command-line-usage: 6.1.3 string-format: 2.0.0 + ts-dedent@2.2.0: {} + ts-essentials@7.0.3(typescript@5.0.4): dependencies: typescript: 5.0.4 + ts-node@10.9.1(@types/node@18.19.59)(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.59 + acorn: 8.13.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + + ts-node@10.9.1(@types/node@22.7.5)(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': 22.7.5 + acorn: 8.13.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.0.4 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + ts-node@10.9.2(@types/node@18.19.59)(typescript@5.0.4): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -12879,6 +15781,11 @@ snapshots: tslib: 1.14.1 typescript: 5.0.4 + tsutils@3.21.0(typescript@5.3.3): + dependencies: + tslib: 1.14.1 + typescript: 5.3.3 + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -12923,13 +15830,13 @@ snapshots: typechain@8.3.2(typescript@5.0.4): dependencies: '@types/prettier': 2.7.3 - debug: 4.3.7(supports-color@8.1.1) + debug: 4.3.7(supports-color@5.5.0) fs-extra: 7.0.1 glob: 7.1.7 js-sha3: 0.8.0 lodash: 4.17.21 mkdirp: 1.0.4 - prettier: 2.4.1 + prettier: 2.8.8 ts-command-line-args: 2.5.1 ts-essentials: 7.0.3(typescript@5.0.4) typescript: 5.0.4 @@ -12976,6 +15883,8 @@ snapshots: typescript@5.0.4: {} + typescript@5.3.3: {} + typical@4.0.0: {} typical@5.2.0: {} @@ -13004,6 +15913,10 @@ snapshots: undici@6.20.1: {} + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.11 + universalify@0.1.2: {} universalify@2.0.1: {} @@ -13064,6 +15977,13 @@ snapshots: uuid@9.0.1: {} + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + v8-compile-cache-lib@3.0.1: {} validate-npm-package-license@3.0.4: @@ -13071,6 +15991,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + validator@13.12.0: {} + varint@5.0.2: {} vary@1.1.2: {} @@ -13099,10 +16021,27 @@ snapshots: - utf-8-validate - zod + vite-plugin-singlefile@2.1.0(rollup@4.30.1)(vite@5.4.11(@types/node@22.7.5)): + dependencies: + micromatch: 4.0.8 + rollup: 4.30.1 + vite: 5.4.11(@types/node@22.7.5) + + vite@5.4.11(@types/node@22.7.5): + dependencies: + esbuild: 0.21.5 + postcss: 8.5.1 + rollup: 4.30.1 + optionalDependencies: + '@types/node': 22.7.5 + fsevents: 2.3.3 + wcwidth@1.0.1: dependencies: defaults: 1.0.4 + web-worker@1.3.0: {} + web3-bzz@1.10.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/node': 12.20.55 @@ -13831,6 +16770,8 @@ snapshots: reduce-flatten: 2.0.0 typical: 5.2.0 + workerpool@6.2.0: {} + workerpool@6.5.1: {} wrap-ansi@2.1.0: @@ -13931,6 +16872,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yargs-parser@18.1.3: dependencies: camelcase: 5.3.1 @@ -13941,6 +16884,8 @@ snapshots: camelcase: 3.0.0 lodash.assign: 4.2.0 + yargs-parser@20.2.4: {} + yargs-parser@20.2.9: {} yargs-unparser@2.0.0: @@ -13995,4 +16940,12 @@ snapshots: yocto-queue@0.1.0: {} + z-schema@5.0.5: + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.12.0 + optionalDependencies: + commander: 9.5.0 + zod@3.23.8: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index dee51e928d..36e92abbb4 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,2 +1,3 @@ packages: - "packages/*" + - "!packages/hardhat-ignition-legacy" \ No newline at end of file From 5dafa9d516d000acf1976a286c8db14ec6a976b9 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 16 Jan 2025 03:19:58 -0500 Subject: [PATCH 1301/1302] build successful for all ignition packages --- package.json | 4 ++-- packages/hardhat-ignition-core/src/types/verify.ts | 4 +++- packages/hardhat-ignition-core/tsconfig.json | 1 + packages/hardhat-ignition-ethers/tsconfig.json | 5 ++++- packages/hardhat-ignition-viem/tsconfig.json | 5 ++++- packages/hardhat-ignition/tsconfig.json | 2 +- 6 files changed, 15 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f9eeff51fc..14811ab83e 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ }, "scripts": { "postbuild": "cp packages/hardhat-core/src/internal/solidity/compiler/solcjs-runner.js packages/hardhat-core/internal/solidity/compiler/solcjs-runner.js", - "build": "tsc --build packages/hardhat-core packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem packages/hardhat-ignition-core packages/hardhat-ignition packages/hardhat-ignition-ethers packages/hardhat-ignition-viem packages/hardhat-ignition-ui", - "watch": "tsc --build --watch packages/hardhat-core/src packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem packages/hardhat-ignition-core packages/hardhat-ignition packages/hardhat-ignition-ethers packages/hardhat-ignition-viem packages/hardhat-ignition-ui", + "build": "tsc --build packages/hardhat-core packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem && pnpm run --filter \"./packages/hardhat-ignition*\" build", + "watch": "tsc --build --watch packages/hardhat-core/src packages/hardhat-ethers packages/hardhat-verify packages/hardhat-solhint packages/hardhat-solpp packages/hardhat-truffle4 packages/hardhat-truffle5 packages/hardhat-vyper packages/hardhat-web3 packages/hardhat-web3-v4 packages/hardhat-web3-legacy packages/hardhat-chai-matchers packages/hardhat-network-helpers packages/hardhat-toolbox packages/hardhat-foundry packages/hardhat-ledger packages/hardhat-viem packages/hardhat-toolbox-viem", "clean": "pnpm run --recursive clean", "test": "node scripts/run-tests.js", "lint": "pnpm run --recursive lint && pnpm prettier --check", diff --git a/packages/hardhat-ignition-core/src/types/verify.ts b/packages/hardhat-ignition-core/src/types/verify.ts index c3d1caa51b..eaa1ed7598 100644 --- a/packages/hardhat-ignition-core/src/types/verify.ts +++ b/packages/hardhat-ignition-core/src/types/verify.ts @@ -45,4 +45,6 @@ export interface VerifyInfo { * * @beta */ -export type VerifyResult = [ChainConfig, VerifyInfo] | [null, name: string]; +export type VerifyResult = + | [ChainConfig, VerifyInfo] + | [_null: null, name: string]; diff --git a/packages/hardhat-ignition-core/tsconfig.json b/packages/hardhat-ignition-core/tsconfig.json index 1002920a8c..4f8372790c 100644 --- a/packages/hardhat-ignition-core/tsconfig.json +++ b/packages/hardhat-ignition-core/tsconfig.json @@ -1,6 +1,7 @@ { "extends": "../../config/typescript/tsconfig.json", "compilerOptions": { + "target": "ES2022", "outDir": "dist", "composite": true, "incremental": true diff --git a/packages/hardhat-ignition-ethers/tsconfig.json b/packages/hardhat-ignition-ethers/tsconfig.json index 3952ad5604..353034f192 100644 --- a/packages/hardhat-ignition-ethers/tsconfig.json +++ b/packages/hardhat-ignition-ethers/tsconfig.json @@ -5,5 +5,8 @@ "composite": true, "jsx": "react-jsx" }, - "references": [{ "path": "../core" }, { "path": "../hardhat-plugin" }] + "references": [ + { "path": "../hardhat-ignition-core" }, + { "path": "../hardhat-ignition" } + ] } diff --git a/packages/hardhat-ignition-viem/tsconfig.json b/packages/hardhat-ignition-viem/tsconfig.json index 3952ad5604..353034f192 100644 --- a/packages/hardhat-ignition-viem/tsconfig.json +++ b/packages/hardhat-ignition-viem/tsconfig.json @@ -5,5 +5,8 @@ "composite": true, "jsx": "react-jsx" }, - "references": [{ "path": "../core" }, { "path": "../hardhat-plugin" }] + "references": [ + { "path": "../hardhat-ignition-core" }, + { "path": "../hardhat-ignition" } + ] } diff --git a/packages/hardhat-ignition/tsconfig.json b/packages/hardhat-ignition/tsconfig.json index f3632c8b51..3db810bf12 100644 --- a/packages/hardhat-ignition/tsconfig.json +++ b/packages/hardhat-ignition/tsconfig.json @@ -5,5 +5,5 @@ "composite": true, "jsx": "react-jsx" }, - "references": [{ "path": "../core" }] + "references": [{ "path": "../hardhat-ignition-core" }] } From a37b2512ab0f8ca0479b20e69fba2bcead6f3d44 Mon Sep 17 00:00:00 2001 From: zoeyTM Date: Thu, 16 Jan 2025 03:29:20 -0500 Subject: [PATCH 1302/1302] all ignition packages linting successfully --- .../src/internal/journal/memory-journal.ts | 6 +++--- .../new-api/internal/new-execution/jsonrpc-client.ts | 6 +++--- packages/hardhat-ignition-core/test/execution/abi.ts | 4 ++-- packages/hardhat-ignition-ethers/README.md | 3 +-- packages/hardhat-ignition-viem/README.md | 3 +-- packages/hardhat-ignition/README.md | 3 +-- 6 files changed, 11 insertions(+), 14 deletions(-) diff --git a/packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts b/packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts index 56a2cc83bb..773e9dbfdd 100644 --- a/packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts +++ b/packages/hardhat-ignition-core/src/internal/journal/memory-journal.ts @@ -10,18 +10,18 @@ import { emitExecutionEvent } from "./utils/emitExecutionEvent"; * @beta */ export class MemoryJournal implements Journal { - private messages: JournalMessage[] = []; + private _messages: JournalMessage[] = []; constructor(private _executionEventListener?: ExecutionEventListener) {} public record(message: JournalMessage): void { this._log(message); - this.messages.push(message); + this._messages.push(message); } public async *read(): AsyncGenerator { - for (const message of this.messages) { + for (const message of this._messages) { yield message; } } diff --git a/packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts b/packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts index ce35d7fbe6..6d4a176922 100644 --- a/packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts +++ b/packages/hardhat-ignition-core/test-integrations/new-api/internal/new-execution/jsonrpc-client.ts @@ -53,7 +53,7 @@ describe("JSON-RPC client", function () { return { artifact, address: receipt!.contractAddress! }; } - describe("getChainId", async function () { + describe("getChainId", function () { it("Should return the chainId as number", async function () { const chainId = await client.getChainId(); @@ -61,7 +61,7 @@ describe("JSON-RPC client", function () { }); }); - describe("getLatestBlock", async function () { + describe("getLatestBlock", function () { it("Should return the first block in the correct format", async function () { const block = await client.getLatestBlock(); @@ -80,7 +80,7 @@ describe("JSON-RPC client", function () { }); }); - describe("getNetworkFees", async function () { + describe("getNetworkFees", function () { describe("With an EIP-1559 network (i.e. Hardhat Network)", function () { it("Should return information about EIP-1559 fees", async function () { const fees = await client.getNetworkFees(); diff --git a/packages/hardhat-ignition-core/test/execution/abi.ts b/packages/hardhat-ignition-core/test/execution/abi.ts index 7d0697a780..a90d6ca3c4 100644 --- a/packages/hardhat-ignition-core/test/execution/abi.ts +++ b/packages/hardhat-ignition-core/test/execution/abi.ts @@ -507,7 +507,7 @@ describe("abi", () => { }); }); - describe("When the function returns something and there's no clash", async () => { + describe("When the function returns something and there's no clash", () => { it("should return RevertWithoutReason", async () => { const { decoded } = decode("C", "revertWithoutReasonWithoutClash"); assert.deepEqual(decoded, { @@ -631,7 +631,7 @@ describe("abi", () => { }); }); - describe("When the function returns something and there's no clash", async () => { + describe("When the function returns something and there's no clash", () => { it("should return RevertWithoutReason", async () => { const { decoded } = decode("C", "invalidOpcode"); assert.deepEqual(decoded, { diff --git a/packages/hardhat-ignition-ethers/README.md b/packages/hardhat-ignition-ethers/README.md index 5d0862da2d..b6e1fa32e4 100644 --- a/packages/hardhat-ignition-ethers/README.md +++ b/packages/hardhat-ignition-ethers/README.md @@ -1,5 +1,4 @@ -![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) -[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) --- diff --git a/packages/hardhat-ignition-viem/README.md b/packages/hardhat-ignition-viem/README.md index 071aab7b97..a171504942 100644 --- a/packages/hardhat-ignition-viem/README.md +++ b/packages/hardhat-ignition-viem/README.md @@ -1,5 +1,4 @@ -![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) -[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition-viem.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) --- diff --git a/packages/hardhat-ignition/README.md b/packages/hardhat-ignition/README.md index 8c405ab605..7acbb2377a 100644 --- a/packages/hardhat-ignition/README.md +++ b/packages/hardhat-ignition/README.md @@ -1,5 +1,4 @@ -![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) -[![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/NomicFoundation/hardhat-ignition.git) +![hardhat_Ignition_banner](https://github.com/NomicFoundation/hardhat-ignition/assets/24030/cc73227b-8791-4bb3-bc9a-a39be69d215f) [![npm](https://img.shields.io/npm/v/@nomicfoundation/hardhat-ignition.svg)](https://www.npmjs.com/package/@nomicfoundation/hardhat-ignition) [![hardhat](https://hardhat.org/buidler-plugin-badge.svg?1)](https://hardhat.org) [![Open in Dev Containers](https://img.shields.io/static/v1?label=Dev%20Containers&message=Open&color=blue&logo=visualstudiocode)](https://vscode.dev/redirect?url=vscode://ms-vscode-remote.remote-containers/cloneInVolume?url=https://github.com/NomicFoundation/hardhat-ignition.git) ---